[emos] 01/02: emoslib-000392+dfsg.1
Alastair McKinstry
mckinstry at moszumanska.debian.org
Mon Jun 15 08:56:19 UTC 2015
This is an automated email from the git hooks/post-receive script.
mckinstry pushed a commit to tag debian__000392+dfsg.1-3
in repository emos.
commit f5cdf1cd135bc9df1f3df06cd9a41cf42ab15322
Author: Alastair McKinstry <mckinstry at debian.org>
Date: Thu May 7 11:24:36 2015 +0100
emoslib-000392+dfsg.1
---
AUTHORS | 6 +
LICENSE | 201 +
Makefile | 21 +
Makefile.in | 21 +
NOTICE | 38 +
README | 313 +
bufrdc/Makefile | 29 +
bufrdc/Makefile.in | 35 +
bufrdc/Makefile.shared | 30 +
bufrdc/README | 156 +
bufrdc/bbuprs0.F | 83 +
bufrdc/bbuprs1.F | 180 +
bufrdc/bbuprs2.F | 253 +
bufrdc/bbuprs3.F | 115 +
bufrdc/bbuprt.F | 420 ++
bufrdc/bbuprtbox.F | 141 +
bufrdc/bcmatb.F | 20 +
bufrdc/bcmatbc.F | 17 +
bufrdc/bcmbef.F | 19 +
bufrdc/bcmct.F | 23 +
bufrdc/bcmctc.F | 17 +
bufrdc/bcmdefc.F | 15 +
bufrdc/bcmel.F | 19 +
bufrdc/bcmoff.F | 13 +
bufrdc/bcmroot.F | 16 +
bufrdc/bcmrq.F | 19 +
bufrdc/bcmtab.F | 25 +
bufrdc/bcmtabc.F | 17 +
bufrdc/bcmtabload.F | 30 +
bufrdc/bcmtabloadc.F | 18 +
bufrdc/bcmwork.F | 29 +
bufrdc/bcmwt.F | 36 +
bufrdc/bcmwtc.F | 17 +
bufrdc/bcomatb.F | 21 +
bufrdc/bcomatbc.F | 16 +
bufrdc/bcombef.F | 19 +
bufrdc/bcomcom.F | 13 +
bufrdc/bcomct.F | 23 +
bufrdc/bcomctc.F | 17 +
bufrdc/bcomdefc.F | 17 +
bufrdc/bcomel.F | 18 +
bufrdc/bcomoff.F | 14 +
bufrdc/bcomp.F | 20 +
bufrdc/bcomreq.F | 34 +
bufrdc/bcomroot.F | 17 +
bufrdc/bcomrq.F | 19 +
bufrdc/bcomtab.F | 26 +
bufrdc/bcomtabc.F | 17 +
bufrdc/bcomtabload.F | 37 +
bufrdc/bcomtabloadc.F | 19 +
bufrdc/bcomunit.F | 11 +
bufrdc/bcomwork.F | 29 +
bufrdc/bcomwt.F | 37 +
bufrdc/bcomwtc.F | 17 +
bufrdc/bcprq.F | 14 +
bufrdc/big_endian.F | 35 +
bufrdc/btable.F | 222 +
bufrdc/btable1.F | 221 +
bufrdc/bu_check_s4s.F | 155 +
bufrdc/buaug.F | 225 +
bufrdc/bubox.F | 533 ++
bufrdc/bucrekey.F | 220 +
bufrdc/bucrkey.F | 279 +
bufrdc/buedd.F | 362 ++
bufrdc/buens0.F | 144 +
bufrdc/buens1.F | 424 ++
bufrdc/buens2.F | 202 +
bufrdc/buens3.F | 199 +
bufrdc/buens4.F | 1014 ++++
bufrdc/buens5.F | 207 +
bufrdc/buepmrk.F | 661 +++
bufrdc/buepmrkc.F | 664 +++
bufrdc/buepwt.F | 294 +
bufrdc/buepwtc.F | 291 +
bufrdc/buerr.F | 132 +
bufrdc/buetab.F | 291 +
bufrdc/buetd.F | 342 ++
bufrdc/buetdr.F | 157 +
bufrdc/buevar.F | 237 +
bufrdc/buexs0.F | 184 +
bufrdc/buexs1.F | 593 ++
bufrdc/buexs2.F | 257 +
bufrdc/buexs3.F | 516 ++
bufrdc/buexs33.F | 135 +
bufrdc/buexs3p.F | 165 +
bufrdc/buexs4.F | 869 +++
bufrdc/buexs5.F | 108 +
bufrdc/bufren.F | 314 +
bufrdc/bufrex.F | 347 ++
bufrdc/bugbts.F | 299 +
bufrdc/bugbytesR4.F | 63 +
bufrdc/bugbytesR8.F | 63 +
bufrdc/buget_opera_image.F | 314 +
bufrdc/bugetbm.F | 217 +
bufrdc/bugtll.F | 267 +
bufrdc/buivar.F | 209 +
bufrdc/bunexs.F | 83 +
bufrdc/bunpck.F | 101 +
bufrdc/bunpks.F | 104 +
bufrdc/buoctn.F | 133 +
bufrdc/buoper.F | 854 +++
bufrdc/buoperc.F | 852 +++
bufrdc/bupck.F | 127 +
bufrdc/bupkey.F | 437 ++
bufrdc/bupks.F | 107 +
bufrdc/bupmrk.F | 738 +++
bufrdc/buprco.F | 861 +++
bufrdc/buprq.F | 89 +
bufrdc/buprs0.F | 83 +
bufrdc/buprs1.F | 182 +
bufrdc/buprs2.F | 256 +
bufrdc/buprs3.F | 114 +
bufrdc/buprt.F | 375 ++
bufrdc/buprtbox.F | 146 +
bufrdc/burep.F | 323 ++
bufrdc/burepc.F | 312 +
bufrdc/burqc.F | 1106 ++++
bufrdc/burquc.F | 1234 ++++
bufrdc/bus012.F | 205 +
bufrdc/bus0123.F | 212 +
bufrdc/busbytesR4.F | 63 +
bufrdc/busbytesR8.F | 63 +
bufrdc/busel.F | 96 +
bufrdc/busel2.F | 115 +
bufrdc/buset.F | 93 +
bufrdc/busrp.F | 465 ++
bufrdc/busrq.F | 115 +
bufrdc/bustdr.F | 158 +
bufrdc/bustop.F | 79 +
bufrdc/buuatb.F | 394 ++
bufrdc/buukey.F | 395 ++
bufrdc/buunp.F | 89 +
bufrdc/buunps.F | 90 +
bufrdc/buupwt.F | 341 ++
bufrdc/buxdes.F | 171 +
bufrdc/ctable.F | 261 +
bufrdc/ctable1.F | 216 +
bufrdc/dtable.F | 213 +
bufrdc/dtable1.F | 212 +
bufrdc/fmmh.F | 259 +
bufrdc/get_free_unit.F | 67 +
bufrdc/get_name_unit.F | 122 +
bufrdc/get_tables.F | 105 +
bufrdc/get_tables1.F | 107 +
bufrdc/getcode.F | 116 +
bufrdc/getflag.F | 135 +
bufrdc/mbufr_mars_filter.F | 246 +
bufrdc/parameter.F | 18 +
bufrdc/setlalo.F | 254 +
bufrdc/sources | 106 +
bufrdc/swap_bytes4.F | 36 +
bufrdc/swap_bytes8.F | 42 +
bufrtables/B0000000000098000000.TXT | 458 ++
bufrtables/B0000000000098002001.TXT | 649 +++
bufrtables/B0000000000098006000.TXT | 1283 +++++
bufrtables/B0000000000098006001.TXT | 985 ++++
bufrtables/B0000000000098013001.TXT | 1589 +++++
bufrtables/B0000000000098014001.TXT | 1616 ++++++
bufrtables/B0000000000254011001.TXT | 1349 +++++
bufrtables/C0000000000000014000.TXT | 6040 +++++++++++++++++++
bufrtables/C0000000000098000000.TXT | 6065 ++++++++++++++++++++
bufrtables/C0000000000098002001.TXT | 6065 ++++++++++++++++++++
bufrtables/C0000000000098006000.TXT | 6065 ++++++++++++++++++++
bufrtables/C0000000000098006001.TXT | 6020 +++++++++++++++++++
bufrtables/C0000000000098013001.TXT | 6062 +++++++++++++++++++
bufrtables/C0000000000098014001.TXT | 6040 +++++++++++++++++++
bufrtables/D0000000000000014000.TXT | 4859 ++++++++++++++++
bufrtables/D0000000000098000000.TXT | 787 +++
bufrtables/D0000000000098002001.TXT | 914 +++
bufrtables/D0000000000098006000.TXT | 2077 +++++++
bufrtables/D0000000000098006001.TXT | 2102 +++++++
bufrtables/D0000000000098013001.TXT | 4820 ++++++++++++++++
bufrtables/D0000000000098014001.TXT | 5115 +++++++++++++++++
bufrtables/Makefile | 76 +
bufrtables/Makefile.in | 81 +
bufrtables/bufr2txt_tables.f | 592 ++
bufrtables/bufr_split_tables.f | 147 +
bufrtables/links.sh | 77 +
bufrtables/txt2bufr_tables.f | 1205 ++++
build_library | 266 +
config/config.CRAY | 18 +
config/config.FUJITSU | 25 +
config/config.FUJITSU.in | 25 +
config/config.FUJITSUR64 | 24 +
config/config.FUJITSUR64.in | 24 +
config/config.VPP5000 | 24 +
config/config.VPP5000R64 | 24 +
config/config.darwin | 26 +
config/config.darwin.in | 26 +
config/config.darwinA64 | 26 +
config/config.darwinA64.in | 26 +
config/config.darwinR64 | 26 +
config/config.darwinR64.in | 26 +
config/config.darwinR64A64 | 26 +
config/config.darwinR64A64.in | 26 +
config/config.darwin_g95A64.in | 25 +
config/config.darwin_g95R64A64.in | 25 +
config/config.darwin_g95R64_i486.in | 25 +
config/config.darwin_g95_i486.in | 25 +
config/config.darwin_gfortranR64_i486.in | 27 +
config/config.darwin_gfortran_i486.in | 28 +
config/config.decalpha | 14 +
config/config.decalpha.in | 14 +
config/config.decalphaR64 | 14 +
config/config.decalphaR64.in | 14 +
config/config.decmips | 13 +
config/config.hp | 16 +
config/config.hpia64 | 24 +
config/config.hpia64.in | 24 +
config/config.hpia64R64 | 22 +
config/config.hpia64R64.in | 22 +
config/config.hppa | 28 +
config/config.hppa.in | 28 +
config/config.hppaR64 | 25 +
config/config.hppaR64.in | 25 +
config/config.i686R64 | 21 +
config/config.i86pc | 16 +
config/config.i86pc.in | 16 +
config/config.i86pcR64 | 16 +
config/config.i86pcR64.in | 16 +
config/config.ibm_power4 | 25 +
config/config.ibm_power4.in | 24 +
config/config.ibm_power4R64 | 24 +
config/config.ibm_power4R64.in | 23 +
config/config.ibm_power6 | 25 +
config/config.ibm_power6.in | 24 +
config/config.ibm_power6R64 | 27 +
config/config.ibm_power6R64.in | 24 +
config/config.ibm_power7 | 25 +
config/config.ibm_power7.in | 24 +
config/config.ibm_power7R64 | 27 +
config/config.ibm_power7R64.in | 24 +
config/config.itanium | 22 +
config/config.itanium.in | 21 +
config/config.itaniumR64 | 24 +
config/config.itaniumR64.in | 23 +
config/config.linux | 22 +
config/config.linux.in | 24 +
config/config.linuxA64 | 21 +
config/config.linuxA64.in | 24 +
config/config.linuxR64 | 21 +
config/config.linuxR64.in | 23 +
config/config.linuxR64A64 | 21 +
config/config.linuxR64A64.in | 24 +
config/config.linuxR64_shared | 28 +
config/config.linux_amd | 28 +
config/config.linux_amd.in | 24 +
config/config.linux_amdA64 | 25 +
config/config.linux_amdA64.in | 24 +
config/config.linux_amdR64 | 31 +
config/config.linux_amdR64.in | 23 +
config/config.linux_amdR64A64 | 28 +
config/config.linux_amdR64A64.in | 24 +
config/config.linux_core2 | 28 +
config/config.linux_core2.in | 24 +
config/config.linux_core2A64 | 25 +
config/config.linux_core2A64.in | 24 +
config/config.linux_core2R64 | 31 +
config/config.linux_core2R64.in | 23 +
config/config.linux_core2R64A64 | 28 +
config/config.linux_core2R64A64.in | 24 +
config/config.linux_g95.in | 23 +
config/config.linux_g95A64.in | 24 +
config/config.linux_g95R64.in | 24 +
config/config.linux_g95R64A64.in | 24 +
config/config.linux_gfortran | 28 +
config/config.linux_gfortran.in | 27 +
config/config.linux_gfortranA64 | 27 +
config/config.linux_gfortranA64.in | 27 +
config/config.linux_gfortranR64 | 27 +
config/config.linux_gfortranR64.in | 26 +
config/config.linux_gfortranR64A64 | 30 +
config/config.linux_gfortranR64A64.in | 27 +
config/config.linux_gnu | 24 +
config/config.linux_gnu.in | 23 +
config/config.linux_gnuA64 | 24 +
config/config.linux_gnuA64.in | 24 +
config/config.linux_gnuR64 | 24 +
config/config.linux_gnuR64.in | 24 +
config/config.linux_gnuR64A64 | 24 +
config/config.linux_gnuR64A64.in | 24 +
config/config.linux_intel | 22 +
config/config.linux_intel.in | 22 +
config/config.linux_intelA64.in | 22 +
config/config.linux_intelR64 | 24 +
config/config.linux_intelR64.in | 23 +
config/config.linux_intelR64A64.in | 23 +
config/config.linux_pgf90 | 28 +
config/config.linux_pgf90R64 | 34 +
config/config.linux_x86_64 | 28 +
config/config.linux_x86_64.in | 25 +
config/config.linux_x86_64A64 | 28 +
config/config.linux_x86_64A64.in | 25 +
config/config.linux_x86_64R64 | 31 +
config/config.linux_x86_64R64.in | 25 +
config/config.linux_x86_64R64A64 | 31 +
config/config.linux_x86_64R64A64.in | 25 +
config/config.mac_intel | 23 +
config/config.mac_intel.in | 23 +
config/config.mac_intelR64 | 23 +
config/config.mac_intelR64.in | 23 +
config/config.ppc | 28 +
config/config.ppc.in | 28 +
config/config.ppcR64 | 27 +
config/config.ppcR64.in | 27 +
config/config.ppcR64_G5 | 26 +
config/config.ppcR64_G5.in | 26 +
config/config.ppc_G5 | 26 +
config/config.ppc_G5.in | 26 +
config/config.ppc_g95.in | 25 +
config/config.ppc_g95R64.in | 25 +
config/config.ppc_g95R64_G5.in | 25 +
config/config.ppc_g95_G5.in | 25 +
config/config.ppc_gfortran.in | 28 +
config/config.ppc_gfortranR64.in | 27 +
config/config.ppc_gfortranR64_G5.in | 26 +
config/config.ppc_gfortran_G5.in | 26 +
config/config.rs6000 | 24 +
config/config.rs6000.in | 22 +
config/config.rs6000A64 | 27 +
config/config.rs6000A64.in | 24 +
config/config.rs6000R64 | 25 +
config/config.rs6000R64.in | 20 +
config/config.rs6000R64A64 | 28 +
config/config.rs6000R64A64.in | 24 +
config/config.sgimips | 28 +
config/config.sgimips.in | 28 +
config/config.sgimipsR64 | 29 +
config/config.sgimipsR64.in | 29 +
config/config.sun4 | 16 +
config/config.sun4.in | 16 +
config/config.sun4R64 | 16 +
config/config.sun4R64.in | 16 +
config/config.sun4_gnu | 24 +
config/config.sun4_gnu.in | 23 +
config/config.sun4_gnuR64 | 24 +
config/config.sun4_gnuR64.in | 24 +
config/config.super-uxR64.in | 23 +
config/fortran2c | 7 +
config/fortran2c_g95 | 3 +
config/fortran2c_gfortran | 3 +
config/fortran2c_gnu | 3 +
config/fortran_underscore | 2 +
config/fortran_underscorewith | 2 +
crexdc/Makefile | 30 +
crexdc/Makefile.in | 35 +
crexdc/Makefile.shared | 30 +
crexdc/crex_get_name_unit.F | 103 +
crexdc/crexdes.F | 265 +
crexdc/crexedd.F | 309 +
crexdc/crexen.F | 521 ++
crexdc/crexepwt.F | 294 +
crexdc/crexerr.F | 115 +
crexdc/crexetab.F | 515 ++
crexdc/crexetd.F | 305 +
crexdc/crexetdr.F | 195 +
crexdc/crexex.F | 261 +
crexdc/crexinit.F | 200 +
crexdc/crexivar.F | 117 +
crexdc/crexoper.F | 222 +
crexdc/crexprco.F | 219 +
crexdc/crexprs0.F | 77 +
crexdc/crexprs1.F | 195 +
crexdc/crexprt.F | 422 ++
crexdc/crexrep.F | 339 ++
crexdc/crexs0.F | 145 +
crexdc/crexs1.F | 445 ++
crexdc/crexs2.F | 324 ++
crexdc/crexs2data.F | 442 ++
crexdc/crexs5.F | 65 +
crexdc/crexsel.F | 108 +
crexdc/crexsel2.F | 124 +
crexdc/crexsrp.F | 381 ++
crexdc/crexstdr.F | 179 +
crexdc/crextables.F | 243 +
crexdc/crextb.F | 525 ++
crexdc/crexupwt.F | 323 ++
crexdc/dec2octal.F | 77 +
crexdc/extgrp.F | 114 +
crexdc/extgrpc.F | 80 +
crexdc/get_units.F | 89 +
crexdc/nextgrp.F | 105 +
crexdc/nextprt.F | 101 +
crexdc/nextsec.F | 84 +
crexdc/nextsep.F | 103 +
crexdc/nextsubset.F | 90 +
crexdc/octal2dec.F | 75 +
crexdc/sources | 45 +
crextables/B000101 | 1197 ++++
crextables/B000103 | 1197 ++++
crextables/B000203 | 1197 ++++
crextables/B000207 | 1210 ++++
crextables/D000101 | 2128 +++++++
crextables/D000103 | 2128 +++++++
crextables/D000203 | 2128 +++++++
crextables/D000207 | 2326 ++++++++
crextables/units.config.dat | 59 +
data/850ght.grib | Bin 0 -> 12480 bytes
data/ISMD01_OKPR.bufr | Bin 0 -> 2956 bytes
data/ISMD01_OKPR.crex | 296 +
data/IUSD40_OKLI.bufr | Bin 0 -> 6398 bytes
data/IUSD40_OKLI.crex | 303 +
data/acar.crex | 8 +
data/airep.bufr | Bin 0 -> 229118 bytes
data/amdar.crex | 5 +
data/buoy.crex | 6 +
data/gaussian.grib | Bin 0 -> 2040 bytes
data/latlon.grib | Bin 0 -> 960 bytes
data/reduced_gg.grib | Bin 0 -> 1688760 bytes
data/satob.crex | 15 +
data/spectral.grib | Bin 0 -> 9240 bytes
data/synop.crex | 7 +
data/synop_ship.crex | 6 +
data/temp.crex | 41 +
data/tigge.grib2 | Bin 0 -> 428963 bytes
data/wmo_aws.bufr | Bin 0 -> 296 bytes
data/wmo_aws_3.bufr | Bin 0 -> 321 bytes
data/wmo_buoy.bufr | Bin 0 -> 419 bytes
data/wmo_climat_synop.bufr | Bin 0 -> 524 bytes
data/wmo_climat_synop_2.bufr | Bin 0 -> 524 bytes
data/wmo_sarep.bufr | Bin 0 -> 146 bytes
data/wmo_synop.bufr | Bin 0 -> 332 bytes
data/wmo_synop_1.bufr | Bin 0 -> 250 bytes
data/wmo_temp.bufr | Bin 0 -> 1522 bytes
data/wmo_temp_2.bufr | Bin 0 -> 1822 bytes
examples/bufr/Makefile | 46 +
examples/bufr/Makefile.in | 50 +
examples/bufr/README | 74 +
examples/bufr/bufr2crex.F | 605 ++
examples/bufr/bufr_decode.c | 182 +
examples/bufr/create_bufr.F | 417 ++
examples/bufr/crex2bufr.F | 499 ++
examples/bufr/decode_bufr.F | 623 ++
examples/bufr/decode_bufr_image.F | 262 +
examples/bufr/tdexp.F | 187 +
examples/bufr/test.sh | 12 +
examples/crex/Makefile | 40 +
examples/crex/Makefile.in | 46 +
examples/crex/bufr2crex.F | 605 ++
examples/crex/create_crex.F | 296 +
examples/crex/crex2bufr.F | 499 ++
examples/crex/crextdexp.F | 167 +
examples/crex/decode_crex.F | 280 +
examples/crex/test.sh | 12 +
examples/fft/Makefile | 26 +
examples/fft/Makefile.in | 29 +
examples/fft/fft.f | 30 +
examples/gribex/Makefile | 26 +
examples/gribex/Makefile.in | 30 +
examples/gribex/README | 36 +
examples/gribex/agrdemo.F | 265 +
examples/gribex/find_t.F | 101 +
examples/gribex/test.sh | 14 +
examples/interpolation/Makefile | 24 +
examples/interpolation/Makefile.in | 28 +
examples/interpolation/interpolation_example.F | 142 +
examples/interpolation/test.sh | 18 +
examples/interpolation_grib_api/Makefile | 27 +
examples/interpolation_grib_api/Makefile.in | 34 +
.../interpolation_grib_api/interpolation_example.F | 151 +
examples/interpolation_grib_api/test.sh | 18 +
fft/Makefile | 30 +
fft/Makefile.in | 34 +
fft/Makefile.shared | 30 +
fft/fax.f | 78 +
fft/fft99.f | 218 +
fft/fft991.f | 218 +
fft/fftrig.f | 57 +
fft/gpfa.f | 98 +
fft/gpfa2.F | 834 +++
fft/gpfa2.f | 835 +++
fft/gpfa3.F | 375 ++
fft/gpfa3.f | 376 ++
fft/gpfa5.F | 719 +++
fft/gpfa5.f | 708 +++
fft/qpassf.f | 920 +++
fft/qpassm.f | 779 +++
fft/rpassf.f | 910 +++
fft/rpassm.f | 790 +++
fft/set99.f | 65 +
fft/setgpfa.f | 72 +
fft/sources | 20 +
fft/syminv.f | 111 +
grib_api_merging/Makefile | 32 +
grib_api_merging/Makefile.in | 40 +
grib_api_merging/copy_spec_from_ksec.c | 249 +
grib_api_merging/describe_input_field.c | 726 +++
grib_api_merging/emos.c | 139 +
grib_api_merging/emos.h | 21 +
grib_api_merging/example.c | 184 +
grib_api_merging/fortint.h | 30 +
grib_api_merging/intf2.c | 301 +
grib_api_merging/intuvp2.c | 435 ++
grib_api_merging/intuvs2.c | 489 ++
grib_api_merging/intvect2.c | 415 ++
grib_api_merging/sources | 12 +
gribex/0-INDEX-0 | 265 +
gribex/ECMWFdefinitions.c | 3721 ++++++++++++
gribex/ECMWFdefinitions.h | 353 ++
gribex/Makefile | 31 +
gribex/Makefile.in | 37 +
gribex/Makefile.shared | 32 +
gribex/README | 5 +
gribex/abortx.F | 153 +
gribex/analsw.F | 397 ++
gribex/blckcr.F | 165 +
gribex/bt_cray.F | 1153 ++++
gribex/bt_cyber.F | 837 +++
gribex/bt_ibm.F | 602 ++
gribex/bt_ibm_bal.bal | 279 +
gribex/bt_sun.F | 602 ++
gribex/bt_sun_c.c | 119 +
gribex/bt_vax.F | 992 ++++
gribex/bt_vax_mar.mar | 29 +
gribex/btcray.special | 1141 ++++
gribex/btcyber.special | 825 +++
gribex/btibm.special | 869 +++
gribex/btsun.special | 698 +++
gribex/btvax.special | 1009 ++++
gribex/bufrin.F | 40 +
gribex/c2bitw.F | 126 +
gribex/c2cwid.F | 629 ++
gribex/c2dosd.F | 666 +++
gribex/c2gene.F | 931 +++
gribex/c2ordr.F | 1527 +++++
gribex/c2pack.F | 761 +++
gribex/c2pkvw.F | 613 ++
gribex/c2rnge.F | 161 +
gribex/c2rows.F | 464 ++
gribex/calcop.F | 292 +
gribex/ccf1cr.F | 537 ++
gribex/cgsloop.c | 124 +
gribex/cheknum.F | 65 +
gribex/chktab2.F | 257 +
gribex/cmpck.F | 140 +
gribex/cnbits.F | 127 +
gribex/codegb.F | 1430 +++++
gribex/codegc.F | 1446 +++++
gribex/codegr.F | 1240 ++++
gribex/codeps.F | 848 +++
gribex/comars.h | 165 +
gribex/comcomm.h | 86 +
gribex/comgrb.h | 13 +
gribex/confp.F | 96 +
gribex/confp2.F | 186 +
gribex/confp3.F | 308 +
gribex/confpa.F | 91 +
gribex/csect4.F | 533 ++
gribex/csgnbt.F | 63 +
gribex/csgnbt.c | 40 +
gribex/d2ordr.F | 1760 ++++++
gribex/d2rosd.F | 330 ++
gribex/decext.F | 464 ++
gribex/decfp.F | 59 +
gribex/decfp2.F | 177 +
gribex/decogb.F | 390 ++
gribex/decogc.F | 912 +++
gribex/decogd.F | 971 ++++
gribex/decogr.F | 720 +++
gribex/decops.F | 897 +++
gribex/decops2.F | 891 +++
gribex/delsp.F | 306 +
gribex/dggsec2.F | 272 +
gribex/dlasec2.F | 284 +
gribex/dllsec2.F | 275 +
gribex/dmesec2.F | 311 +
gribex/docsec2.F | 157 +
gribex/dpssec2.F | 261 +
gribex/dsect4.F | 394 ++
gribex/dsect4a.F | 533 ++
gribex/dsgnbt.F | 65 +
gribex/dsgnbt.c | 41 +
gribex/dshsec2.F | 154 +
gribex/dsvsec2.F | 263 +
gribex/dswmrs.F | 246 +
gribex/ecdef1.F | 246 +
gribex/ecdef1.h | 102 +
gribex/ecdef10.F | 307 +
gribex/ecdef10.h | 102 +
gribex/ecdef11.F | 250 +
gribex/ecdef11.h | 63 +
gribex/ecdef12.F | 297 +
gribex/ecdef12.h | 123 +
gribex/ecdef13.F | 344 ++
gribex/ecdef13.h | 88 +
gribex/ecdef14.F | 277 +
gribex/ecdef14.h | 63 +
gribex/ecdef15.F | 207 +
gribex/ecdef15.h | 70 +
gribex/ecdef16.F | 225 +
gribex/ecdef16.h | 66 +
gribex/ecdef17.F | 288 +
gribex/ecdef17.h | 86 +
gribex/ecdef18.F | 255 +
gribex/ecdef18.h | 69 +
gribex/ecdef19.F | 264 +
gribex/ecdef19.h | 57 +
gribex/ecdef2.F | 299 +
gribex/ecdef2.h | 53 +
gribex/ecdef21.h | 114 +
gribex/ecdef3.F | 195 +
gribex/ecdef3.h | 32 +
gribex/ecdef4.F | 492 ++
gribex/ecdef4.h | 271 +
gribex/ecdef5.F | 320 ++
gribex/ecdef5.h | 41 +
gribex/ecdef50.F | 230 +
gribex/ecdef50.h | 76 +
gribex/ecdef6.F | 263 +
gribex/ecdef6.h | 83 +
gribex/ecdef7.F | 238 +
gribex/ecdef7.h | 55 +
gribex/ecdef8.F | 178 +
gribex/ecdef8.h | 32 +
gribex/ecdef9.F | 345 ++
gribex/ecdef9.h | 80 +
gribex/ecdf190.h | 65 +
gribex/ecdf191.F | 362 ++
gribex/ecdf191.h | 65 +
gribex/ecloc1.F | 224 +
gribex/eggsec2.F | 254 +
gribex/elasec2.F | 264 +
gribex/ellsec2.F | 271 +
gribex/emesec2.F | 314 +
gribex/emoscyc.F | 154 +
gribex/emoslibVersion.c | 15 +
gribex/eocsec2.F | 176 +
gribex/eocsec2.h | 42 +
gribex/epssec2.F | 246 +
gribex/eshsec2.F | 164 +
gribex/esvsec2.F | 251 +
gribex/exscal.F | 140 +
gribex/extmap.F | 464 ++
gribex/findLocalDefinitionFile.c | 111 +
gribex/fortint.h | 35 +
gribex/fortranInterface.c | 524 ++
gribex/fortvalues.h | 21 +
gribex/ftn1cr.F | 192 +
gribex/gbitmap.F | 258 +
gribex/gbyte.F | 67 +
gribex/gbytes.F | 76 +
gribex/gdecode.c | 1512 +++++
gribex/gdecode.h | 424 ++
gribex/gdecode1.c | 36 +
gribex/gdecode1.h | 31 +
gribex/gdecode2.c | 197 +
gribex/gdecode2.h | 93 +
gribex/gdecodeStruct.h | 366 ++
gribex/genbin.F | 63 +
gribex/gendir.F | 215 +
gribex/gengrib.F | 246 +
gribex/getValues.c | 391 ++
gribex/getValues.h | 184 +
gribex/getchd.F | 202 +
gribex/getfb2.F | 203 +
gribex/getfpd.F | 205 +
gribex/getib1.F | 194 +
gribex/getib2.F | 197 +
gribex/getib3.F | 199 +
gribex/getind.F | 201 +
gribex/getlgd.F | 205 +
gribex/getsetValues.c | 449 ++
gribex/getsetValues.h | 389 ++
gribex/getsys.F | 170 +
gribex/getusr.F | 170 +
gribex/grbcom.h | 38 +
gribex/grchk1.F | 950 +++
gribex/grchk2.F | 658 +++
gribex/grchk3.F | 201 +
gribex/grchk4.F | 246 +
gribex/grib_int_t.h | 27 +
gribex/gribex.F | 5086 ++++++++++++++++
gribex/gribex.h | 1527 +++++
gribex/gribin.F | 49 +
gribex/gribnum.F | 124 +
gribex/groutpt.F | 112 +
gribex/grpr190.c | 76 +
gribex/grprs.h | 16 +
gribex/grprs0.F | 114 +
gribex/grprs1.F | 1466 +++++
gribex/grprs1b.F | 1268 ++++
gribex/grprs2.F | 546 ++
gribex/grprs3.F | 130 +
gribex/grprs4.F | 247 +
gribex/grprs4w.F | 121 +
gribex/grsdbg.F | 132 +
gribex/grsdef.F | 309 +
gribex/grsmax.F | 140 +
gribex/grsmkp.F | 138 +
gribex/grsmok.F | 136 +
gribex/grsn2o.F | 135 +
gribex/grsref.F | 144 +
gribex/grsrnd.F | 143 +
gribex/grsubc.F | 133 +
gribex/grsvck.F | 142 +
gribex/grsx2o.F | 136 +
gribex/gsbite.F | 292 +
gribex/gscale.F | 255 +
gribex/handleLocalDefinitions.c | 1601 ++++++
gribex/handleLocalDefinitions.h | 103 +
gribex/inscal.F | 153 +
gribex/insmp1.F | 406 ++
gribex/insmp2.F | 311 +
gribex/inxbit.F | 241 +
gribex/inxmap.F | 460 ++
gribex/jabort.c | 21 +
gribex/jfree.c | 22 +
gribex/jmalloc.c | 84 +
gribex/kwchk1.F | 192 +
gribex/kwloc1.F | 271 +
gribex/kwprs1.F | 375 ++
gribex/l2u1cr.F | 141 +
gribex/ldc1cr.F | 755 +++
gribex/lnbfcr.F | 220 +
gribex/lngbcr.F | 309 +
gribex/local2.F | 236 +
gribex/local2c.c | 131 +
gribex/local2k.F | 105 +
gribex/make.dep | 36 +
gribex/maxmin.F | 139 +
gribex/maxmn2.F | 156 +
gribex/maxmni.F | 110 +
gribex/modval.F | 54 +
gribex/mxmncr.F | 91 +
gribex/offset.F | 109 +
gribex/offset2.F | 119 +
gribex/orefdat.c | 74 +
gribex/packcf.F | 276 +
gribex/parval.F | 331 ++
gribex/prtbin.F | 196 +
gribex/prtbk1.F | 86 +
gribex/prtbk2.F | 121 +
gribex/prtbl1.F | 72 +
gribex/prtbl2.F | 97 +
gribex/ptquasi.F | 167 +
gribex/qu2reg.F | 331 ++
gribex/qu2reg2.F | 305 +
gribex/qu2reg3.F | 321 ++
gribex/reclen.F | 205 +
gribex/ref2grb.F | 175 +
gribex/remsp.F | 46 +
gribex/repchr.F | 162 +
gribex/revero.F | 263 +
gribex/rorint.F | 139 +
gribex/rowina.F | 142 +
gribex/rowina2.F | 228 +
gribex/rowina3.F | 318 +
gribex/rtb.F | 59 +
gribex/sbyte.F | 77 +
gribex/sbytes.F | 63 +
gribex/scm0.F | 61 +
gribex/search.F | 208 +
gribex/sencode.c | 2586 +++++++++
gribex/sencode.h | 63 +
gribex/sencode1.c | 45 +
gribex/sencode1.h | 31 +
gribex/sencode2.c | 223 +
gribex/sencode2.h | 94 +
gribex/setpar.F | 118 +
gribex/sfbits.h | 52 +
gribex/sort.F | 141 +
gribex/sortf.F | 218 +
gribex/sources.CRAY | 239 +
gribex/sources.FUJITSU | 233 +
gribex/sources.VPP5000 | 233 +
gribex/sources.decalpha | 229 +
gribex/sources.decmips | 228 +
gribex/sources.hpia64 | 218 +
gribex/sources.hppa | 218 +
gribex/sources.ibm_power4 | 229 +
gribex/sources.ibm_power6 | 229 +
gribex/sources.ibm_power7 | 229 +
gribex/sources.itanium | 222 +
gribex/sources.linux | 222 +
gribex/sources.linux_g77 | 222 +
gribex/sources.rs6000 | 229 +
gribex/sources.sgimips | 228 +
gribex/sources.sun4 | 228 +
gribex/swap4.c | 36 +
gribex/tab2fil.F | 166 +
gribex/u2l1cr.F | 141 +
gribex/unbkin.F | 627 ++
gribex/unbkout.F | 521 ++
gribex/unblock.F | 110 +
gribex/uncmpck.F | 141 +
gribex/unpkcf.F | 268 +
gribex/valpina.c | 243 +
gribex/vod2uv.F | 129 +
gribex/xgrdemo.F | 209 +
gribex/yyyy2cy.F | 93 +
gribtables/cen074/local_table_2_version_174 | 180 +
gribtables/cen074/local_table_2_version_175 | 180 +
gribtables/cen080/local_table_2_version_201 | 796 +++
gribtables/cen085/local_table_2_version_001 | 225 +
gribtables/cen085/local_table_2_version_002 | 225 +
gribtables/cen085/local_table_2_version_003 | 225 +
gribtables/cen085/local_table_2_version_128 | 225 +
gribtables/cen085/local_table_2_version_128.ecmwf | 225 +
gribtables/cen085/local_table_2_version_128.mf | 225 +
gribtables/local_table_2_version_128 | 1266 ++++
gribtables/local_table_2_version_129 | 1164 ++++
gribtables/local_table_2_version_130 | 162 +
gribtables/local_table_2_version_131 | 384 ++
gribtables/local_table_2_version_132 | 60 +
gribtables/local_table_2_version_133 | 558 ++
gribtables/local_table_2_version_140 | 246 +
gribtables/local_table_2_version_150 | 198 +
gribtables/local_table_2_version_151 | 480 ++
gribtables/local_table_2_version_160 | 654 +++
gribtables/local_table_2_version_162 | 468 ++
gribtables/local_table_2_version_170 | 108 +
gribtables/local_table_2_version_171 | 1110 ++++
gribtables/local_table_2_version_172 | 222 +
gribtables/local_table_2_version_173 | 222 +
gribtables/local_table_2_version_174 | 222 +
gribtables/local_table_2_version_175 | 186 +
gribtables/local_table_2_version_180 | 198 +
gribtables/local_table_2_version_190 | 198 +
gribtables/local_table_2_version_200 | 1164 ++++
gribtables/local_table_2_version_201 | 468 ++
gribtables/local_table_2_version_210 | 672 +++
gribtables/local_table_2_version_211 | 90 +
gribtables/local_table_2_version_220 | 12 +
gribtables/local_table_2_version_228 | 84 +
gribtables/local_table_2_version_230 | 192 +
gribtables/local_table_2_version_234 | 30 +
gribtables/mars2netcdf.cfg | 1906 ++++++
gribtables/wmostd/table_2_version_001 | 771 +++
gribtables/wmostd/table_2_version_002 | 771 +++
gribtables/wmostd/table_2_version_003 | 771 +++
gribtables/wmostd/table_2_version_003.ecmwf | 771 +++
gribtables/wmostd/table_2_version_003.mf | 771 +++
gribtemplates/localDefinitionTemplate_001_098_001 | 1 +
gribtemplates/localDefinitionTemplate_007_000_001 | 42 +
gribtemplates/localDefinitionTemplate_007_002_000 | 42 +
gribtemplates/localDefinitionTemplate_007_002_001 | 42 +
gribtemplates/localDefinitionTemplate_007_098_001 | 1 +
gribtemplates/localDefinitionTemplate_007_098_011 | 1 +
gribtemplates/localDefinitionTemplate_007_098_018 | 1 +
gribtemplates/localDefinitionTemplate_0255_098_001 | 1 +
gribtemplates/localDefinitionTemplate_0255_098_018 | 1 +
gribtemplates/localDefinitionTemplate_034_098_001 | 1 +
gribtemplates/localDefinitionTemplate_054_098_001 | 1 +
gribtemplates/localDefinitionTemplate_058_098_001 | 1 +
gribtemplates/localDefinitionTemplate_058_098_011 | 1 +
gribtemplates/localDefinitionTemplate_074_098_001 | 1 +
gribtemplates/localDefinitionTemplate_074_098_004 | 1 +
gribtemplates/localDefinitionTemplate_074_098_011 | 1 +
gribtemplates/localDefinitionTemplate_074_098_015 | 1 +
gribtemplates/localDefinitionTemplate_074_098_016 | 1 +
gribtemplates/localDefinitionTemplate_074_098_018 | 1 +
gribtemplates/localDefinitionTemplate_074_098_021 | 1 +
gribtemplates/localDefinitionTemplate_078_098_001 | 1 +
gribtemplates/localDefinitionTemplate_078_098_018 | 1 +
gribtemplates/localDefinitionTemplate_078_098_191 | 1 +
gribtemplates/localDefinitionTemplate_080_098_028 | 1 +
gribtemplates/localDefinitionTemplate_080_098_029 | 1 +
gribtemplates/localDefinitionTemplate_080_098_191 | 1 +
gribtemplates/localDefinitionTemplate_084_098_001 | 1 +
gribtemplates/localDefinitionTemplate_085_098_001 | 1 +
gribtemplates/localDefinitionTemplate_085_098_004 | 1 +
gribtemplates/localDefinitionTemplate_085_098_015 | 1 +
gribtemplates/localDefinitionTemplate_085_098_016 | 1 +
gribtemplates/localDefinitionTemplate_085_098_018 | 1 +
gribtemplates/localDefinitionTemplate_085_098_021 | 1 +
gribtemplates/localDefinitionTemplate_098_000_001 | 15 +
gribtemplates/localDefinitionTemplate_098_000_002 | 27 +
gribtemplates/localDefinitionTemplate_098_000_003 | 15 +
gribtemplates/localDefinitionTemplate_098_000_004 | 89 +
gribtemplates/localDefinitionTemplate_098_000_005 | 19 +
gribtemplates/localDefinitionTemplate_098_000_006 | 20 +
gribtemplates/localDefinitionTemplate_098_000_007 | 17 +
gribtemplates/localDefinitionTemplate_098_000_008 | 14 +
gribtemplates/localDefinitionTemplate_098_000_009 | 40 +
gribtemplates/localDefinitionTemplate_098_000_010 | 31 +
gribtemplates/localDefinitionTemplate_098_000_011 | 25 +
gribtemplates/localDefinitionTemplate_098_000_013 | 64 +
.../localDefinitionTemplate_098_000_013.old | 50 +
gribtemplates/localDefinitionTemplate_098_000_014 | 20 +
gribtemplates/localDefinitionTemplate_098_000_015 | 17 +
gribtemplates/localDefinitionTemplate_098_000_016 | 20 +
gribtemplates/localDefinitionTemplate_098_000_017 | 22 +
gribtemplates/localDefinitionTemplate_098_000_018 | 22 +
gribtemplates/localDefinitionTemplate_098_000_019 | 23 +
gribtemplates/localDefinitionTemplate_098_000_020 | 15 +
gribtemplates/localDefinitionTemplate_098_000_021 | 34 +
gribtemplates/localDefinitionTemplate_098_000_023 | 27 +
.../localDefinitionTemplate_098_000_023.old | 27 +
gribtemplates/localDefinitionTemplate_098_000_024 | 16 +
gribtemplates/localDefinitionTemplate_098_000_025 | 15 +
gribtemplates/localDefinitionTemplate_098_000_026 | 17 +
.../localDefinitionTemplate_098_000_026.old | 15 +
gribtemplates/localDefinitionTemplate_098_000_027 | 27 +
.../localDefinitionTemplate_098_000_027.old | 26 +
gribtemplates/localDefinitionTemplate_098_000_028 | 24 +
gribtemplates/localDefinitionTemplate_098_000_029 | 52 +
.../localDefinitionTemplate_098_000_029.old | 27 +
gribtemplates/localDefinitionTemplate_098_000_030 | 27 +
gribtemplates/localDefinitionTemplate_098_000_031 | 23 +
gribtemplates/localDefinitionTemplate_098_000_032 | 30 +
gribtemplates/localDefinitionTemplate_098_000_035 | 31 +
gribtemplates/localDefinitionTemplate_098_000_050 | 25 +
gribtemplates/localDefinitionTemplate_098_000_190 | 19 +
gribtemplates/localDefinitionTemplate_098_000_191 | 20 +
gribtemplates/localDefinitionTemplate_098_000_192 | 18 +
gribtemplates/localDefinitionTemplate_098_231_001 | 1 +
gribtemplates/localDefinitionTemplate_098_231_004 | 1 +
gribtemplates/localDefinitionTemplate_098_231_015 | 1 +
gribtemplates/localDefinitionTemplate_098_231_016 | 1 +
gribtemplates/localDefinitionTemplate_098_232_001 | 1 +
gribtemplates/localDefinitionTemplate_098_232_004 | 1 +
gribtemplates/localDefinitionTemplate_098_232_015 | 1 +
gribtemplates/localDefinitionTemplate_098_232_016 | 1 +
gribtemplates/localDefinitionTemplate_098_233_001 | 1 +
gribtemplates/localDefinitionTemplate_098_233_004 | 1 +
gribtemplates/localDefinitionTemplate_098_233_015 | 1 +
gribtemplates/localDefinitionTemplate_098_233_016 | 1 +
gribtemplates/localDefinitionTemplate_098_234_004 | 1 +
gribtemplates/localDefinitionTemplate_098_234_015 | 1 +
gribtemplates/localDefinitionTemplate_098_234_016 | 1 +
gribtemplates/localDefinitionTemplate_098_235_004 | 1 +
gribtemplates/localDefinitionTemplate_098_235_015 | 1 +
gribtemplates/localDefinitionTemplate_098_235_016 | 1 +
gribtemplates/localDefinitionTemplate_098_240_001 | 1 +
gribtemplates/localDefinitionTemplate_098_241_001 | 1 +
gribtemplates/localDefinitionTemplate_098_242_001 | 1 +
gribtemplates/localDefinitionTemplate_098_243_001 | 1 +
gribtemplates/localDefinitionTemplate_200_098_191 | 1 +
gribtemplates/localDefinitionTemplate_214_098_244 | 142 +
gribtemplates/localDefinitionTemplate_214_098_245 | 28 +
gribtemplates/localDefinitionTemplate_244_098_001 | 1 +
install | 61 +
interpolation/0-INDEX-0 | 275 +
interpolation/Imakefile | 17 +
interpolation/Makefile | 241 +
interpolation/Makefile.in | 46 +
interpolation/Makefile.shared | 40 +
interpolation/areachk.F | 466 ++
interpolation/auresol.F | 167 +
interpolation/bitmap.h | 39 +
interpolation/chequal.F | 86 +
interpolation/chkout.F | 35 +
interpolation/chkprec.F | 102 +
interpolation/clear_c.F | 187 +
interpolation/consint.F90 | 424 ++
interpolation/createSharedMemoryCoefficients.c | 195 +
interpolation/csum.F | 84 +
interpolation/current.h | 55 +
interpolation/ddstyle.F | 185 +
interpolation/debug.h | 97 +
interpolation/defaults_for_table_001 | 11 +
interpolation/defaults_for_table_128 | 14 +
interpolation/dssarea.F | 509 ++
interpolation/dummy.F | 18 +
interpolation/dummy2.F | 18 +
interpolation/emosPrecision.c | 24 +
interpolation/estima.F | 150 +
interpolation/eulavgg.F | 145 +
interpolation/fft99.F | 330 ++
interpolation/fftchk.c | 63 +
interpolation/fixarea.F | 513 ++
interpolation/fortdefs.h | 22 +
interpolation/fortint.h | 22 +
interpolation/freecf.F | 102 +
interpolation/funcs.F | 145 +
interpolation/gasetup.F | 617 ++
interpolation/gb2gb.F | 367 ++
interpolation/getconf.F | 166 +
interpolation/gettru.F | 30 +
interpolation/ggintrp.F | 305 +
interpolation/ggrotat.F | 235 +
interpolation/ggvalue.F | 153 +
interpolation/global.F | 34 +
interpolation/gmapbit.c | 43 +
interpolation/grdynam.h | 169 +
interpolation/grfixed.h | 77 +
interpolation/grprs.h | 16 +
interpolation/grspace.h | 20 +
interpolation/hgengg.F | 294 +
interpolation/hgengrd.F | 255 +
interpolation/hgengrw.F | 257 +
interpolation/hgenll.F | 254 +
interpolation/hgenllw.F | 257 +
interpolation/hgetlsm.F | 216 +
interpolation/hirlam.F | 653 +++
interpolation/hirlamw.F | 631 ++
interpolation/hirlsm.F | 982 ++++
interpolation/hll2ll.F | 460 ++
interpolation/hll2llw.F | 492 ++
interpolation/hll2xyz.F | 84 +
interpolation/hnei12.F | 462 ++
interpolation/hneill.F | 395 ++
interpolation/hntfap.F | 133 +
interpolation/hntfaph.F | 578 ++
interpolation/hntfaps.F | 463 ++
interpolation/hntfau.F | 137 +
interpolation/hntfauh.F | 530 ++
interpolation/hntfaus.F | 449 ++
interpolation/hntfbu.F | 432 ++
interpolation/hpshgpw.F | 225 +
interpolation/hrg2gg.F | 557 ++
interpolation/hrg2ggw.F | 588 ++
interpolation/hrg2ll.F | 443 ++
interpolation/hrg2llw.F | 520 ++
interpolation/hsp2gg.F | 181 +
interpolation/hsp2gg2.F | 224 +
interpolation/hsp2gg3.F | 191 +
interpolation/hwts12.F | 290 +
interpolation/hwtsll.F | 290 +
interpolation/hwtslsm.F | 487 ++
interpolation/iafree.F | 267 +
interpolation/iagcntl.F | 717 +++
interpolation/iaidef.F | 553 ++
interpolation/iainit.F | 211 +
interpolation/iaintgg.F | 552 ++
interpolation/iaintll.F | 577 ++
interpolation/iaogdef.F | 421 ++
interpolation/iaoldef.F | 471 ++
interpolation/iarcntl.F | 691 +++
interpolation/iareset.F | 307 +
interpolation/iarmem.F | 237 +
interpolation/ibasini.F | 206 +
interpolation/igalloc.F | 346 ++
interpolation/igbess.F | 179 +
interpolation/igdins.F | 309 +
interpolation/igdiwe.F | 384 ++
interpolation/igglat.F | 282 +
interpolation/iggmem.F | 331 ++
interpolation/iggrid.F | 271 +
interpolation/igint.F | 217 +
interpolation/igintr.F | 199 +
interpolation/iglgrid.F | 258 +
interpolation/iglrev.F | 242 +
interpolation/iglsize.F | 410 ++
interpolation/iglsm01.F | 280 +
interpolation/iglsmb.F | 471 ++
interpolation/iglsmd.F | 491 ++
interpolation/iglsmr.F | 232 +
interpolation/iglsmst.F | 336 ++
interpolation/ignorm.F | 207 +
interpolation/igplsm.F | 181 +
interpolation/igpoleg.F | 189 +
interpolation/igpolew.F | 220 +
interpolation/igprec.F | 292 +
interpolation/igscan.F | 359 ++
interpolation/igsetup.F | 630 ++
interpolation/igsize.F | 408 ++
interpolation/igtog.F | 276 +
interpolation/igtogr.F | 258 +
interpolation/igtran.F | 345 ++
interpolation/init_cm.F | 309 +
interpolation/insane.F | 550 ++
interpolation/intf.F | 467 ++
interpolation/intf.h | 30 +
interpolation/intfa.F | 182 +
interpolation/intfap.F | 519 ++
interpolation/intfau.F | 326 ++
interpolation/intfb.F | 1241 ++++
interpolation/intfbp.F | 467 ++
interpolation/intfbu.F | 478 ++
interpolation/intfc.F | 125 +
interpolation/intin.F | 861 +++
interpolation/intisl.F | 329 ++
interpolation/intisl.h | 28 +
interpolation/intlog.F | 163 +
interpolation/intlog.h | 14 +
interpolation/intlogd.F | 90 +
interpolation/intlogr.F | 160 +
interpolation/intlogs.c | 107 +
interpolation/intocn.F | 1070 ++++
interpolation/intocnu.F | 1088 ++++
interpolation/intout.F | 904 +++
interpolation/intpnum.F | 124 +
interpolation/intuvdh.F | 195 +
interpolation/intuvf.F | 321 ++
interpolation/intuvgh.F | 419 ++
interpolation/intuvp.F | 747 +++
interpolation/intuvph.F | 547 ++
interpolation/intuvs.F | 142 +
interpolation/intuvu.F | 861 +++
interpolation/intuvxh.F | 418 ++
interpolation/intuvy.F | 137 +
interpolation/intvect.F | 511 ++
interpolation/intvecy.F | 518 ++
interpolation/intwave.F | 542 ++
interpolation/intwave2.F | 567 ++
interpolation/intwavu.F | 365 ++
interpolation/irdiwe.F | 297 +
interpolation/irgmem.F | 326 ++
interpolation/irgrid.F | 232 +
interpolation/irgtog.F | 275 +
interpolation/irint.F | 212 +
interpolation/irintr.F | 211 +
interpolation/irlrev.F | 244 +
interpolation/irlsmb.F | 481 ++
interpolation/irprec.F | 301 +
interpolation/irscan.F | 306 +
interpolation/irsize.F | 396 ++
interpolation/iscrsz.F | 200 +
interpolation/islproc.F | 290 +
interpolation/issame.F | 261 +
interpolation/itimer.c | 123 +
interpolation/ixtract.c | 112 +
interpolation/jacobi.F | 768 +++
interpolation/jacobif.F | 836 +++
interpolation/jagggp.F | 580 ++
interpolation/jallgp.F | 542 ++
interpolation/jallwn.F | 148 +
interpolation/jchmod.c | 65 +
interpolation/jdebug.F | 147 +
interpolation/jfindfn.F | 121 +
interpolation/jfindfn3.F | 121 +
interpolation/jfindir.F | 101 +
interpolation/jgetgg.F | 402 ++
interpolation/jgglat.F | 401 ++
interpolation/jindex.c | 42 +
interpolation/jintend.F | 129 +
interpolation/jintgg.F | 417 ++
interpolation/jintll.F | 366 ++
interpolation/jjset99.F | 213 +
interpolation/jmakgg.F | 189 +
interpolation/jmakgg3.F | 189 +
interpolation/jmakll.F | 235 +
interpolation/jmakll3.F | 234 +
interpolation/jmemhan.F | 482 ++
interpolation/jmemhan2.F | 491 ++
interpolation/jmkofgg.F | 162 +
interpolation/jmovgg.F | 255 +
interpolation/jmovll.F | 255 +
interpolation/jmvugg.F | 317 +
interpolation/jmvull.F | 261 +
interpolation/jnorsgg.F | 179 +
interpolation/jnumgg.F | 134 +
interpolation/jnumggq.F | 119 +
interpolation/jopngg.F | 322 ++
interpolation/jopnggf.F | 392 ++
interpolation/jopnggsm.c | 460 ++
interpolation/jopnll.F | 328 ++
interpolation/jopnllf.F | 410 ++
interpolation/jopnllsm.c | 541 ++
interpolation/jparam2.h | 17 +
interpolation/jparams.h | 44 +
interpolation/jreadgg.F | 175 +
interpolation/jreadll.F | 179 +
interpolation/jsgggp.F | 426 ++
interpolation/jsh2sh.F | 201 +
interpolation/jsllgp.F | 310 +
interpolation/jspleg1.F | 232 +
interpolation/jsppole.F | 182 +
interpolation/jstrll.F | 317 +
interpolation/jstrwll.F | 364 ++
interpolation/jsymgg.F | 348 ++
interpolation/jsymll.F | 372 ++
interpolation/jtimer.c | 62 +
interpolation/juvpole.F | 219 +
interpolation/jvod2uv.F | 200 +
interpolation/jwindll.F | 459 ++
interpolation/jwscal.F | 154 +
interpolation/kintrg.F | 270 +
interpolation/knfrom4.F | 176 +
interpolation/krg2rg.F | 267 +
interpolation/krg2rgd.F | 314 +
interpolation/krg2rgu.F | 191 +
interpolation/krg2rgy.F | 253 +
interpolation/krg2rgz.F | 235 +
interpolation/lgrpr4.F | 225 +
interpolation/ll2xyz.F | 98 +
interpolation/lrekam.F | 208 +
interpolation/lsm_red.F | 317 +
interpolation/lsmfld.F | 125 +
interpolation/make.dep | 212 +
interpolation/makemap.c | 313 +
interpolation/makerl.F | 209 +
interpolation/memreq.h | 79 +
interpolation/mkbitmp.F | 177 +
interpolation/mkframe.F | 115 +
interpolation/my_ialloc.c | 41 +
interpolation/newisl.F | 304 +
interpolation/ngintrp.F | 295 +
interpolation/ngrotat.F | 242 +
interpolation/ngvalue.F | 157 +
interpolation/nifld.common | 256 +
interpolation/nmakgg.F | 143 +
interpolation/nmakll.F | 154 +
interpolation/nofld.common | 158 +
interpolation/nptwe32.F | 128 +
interpolation/numptns.F | 106 +
interpolation/numptwe.F | 127 +
interpolation/oceanp.F | 529 ++
interpolation/oceanu.F | 455 ++
interpolation/ouspace.h | 84 +
interpolation/outrep.F | 35 +
interpolation/parameter_processing_defaults | 27 +
interpolation/parim.h | 619 ++
interpolation/pddefs.F | 409 ++
interpolation/ppallow.F | 227 +
interpolation/precip.F | 164 +
interpolation/qpassm.F | 759 +++
interpolation/rddefs.c | 481 ++
interpolation/rename_unlink.c | 79 +
interpolation/request_defaults | 11 +
interpolation/reset_c.F | 640 +++
interpolation/rgauss_032.h | 14 +
interpolation/rgauss_048.h | 23 +
interpolation/rgauss_064.h | 27 +
interpolation/rgauss_080.h | 31 +
interpolation/rgauss_080_19940113.h | 31 +
interpolation/rgauss_080_19980130.h | 31 +
interpolation/rgauss_1024.h | 216 +
interpolation/rgauss_128.h | 43 +
interpolation/rgauss_160.h | 51 +
interpolation/rgauss_160_19931222.h | 51 +
interpolation/rgauss_200.h | 61 +
interpolation/rgauss_2000.h | 211 +
interpolation/rgauss_256.h | 75 +
interpolation/rgauss_320.h | 75 +
interpolation/rgauss_400.h | 91 +
interpolation/rgauss_512.h | 107 +
interpolation/rgauss_640.h | 139 +
interpolation/rpassm.F | 749 +++
interpolation/rphi.F | 136 +
interpolation/set99.F | 69 +
interpolation/setrep.F | 71 +
interpolation/sharedMemoryCharacteristics.c | 175 +
interpolation/sharedgg.c | 119 +
interpolation/sharedlib.c | 368 ++
interpolation/sharedlib.h | 23 +
interpolation/sharedll.c | 121 +
interpolation/sharedmemory.h | 42 +
interpolation/showmap.c | 53 +
interpolation/smread.c | 225 +
interpolation/soffset.c | 202 +
interpolation/sources.CRAY | 276 +
interpolation/sources.FUJITSU | 283 +
interpolation/sources.VPP5000 | 283 +
interpolation/sources.decalpha | 280 +
interpolation/sources.decmips | 281 +
interpolation/sources.hp | 281 +
interpolation/sources.hpia64 | 284 +
interpolation/sources.hppa | 281 +
interpolation/sources.ibm_power4 | 287 +
interpolation/sources.ibm_power6 | 288 +
interpolation/sources.ibm_power7 | 288 +
interpolation/sources.itanium | 280 +
interpolation/sources.linux | 283 +
interpolation/sources.rs6000 | 288 +
interpolation/sources.sgimips | 280 +
interpolation/sources.sun4 | 281 +
interpolation/sprotat.F | 250 +
interpolation/sscal.F | 79 +
interpolation/strlat.F | 175 +
interpolation/tatorgg.F | 225 +
interpolation/valpina.c | 243 +
interpolation/w251idx.F | 356 ++
interpolation/waveidx.F | 369 ++
interpolation/wavexx1.F | 663 +++
interpolation/wavexx2.F | 502 ++
interpolation/wavexxx.F | 645 +++
interpolation/wv2di32.F | 342 ++
interpolation/wv2didx.F | 388 ++
interpolation/wv2dint.F | 301 +
interpolation/wv2dppp.F | 156 +
interpolation/wv2dx32.F | 484 ++
interpolation/wv2dxx2.F | 352 ++
interpolation/wv2dxxx.F | 496 ++
interpolation/wvqlidx.F | 371 ++
interpolation/wvqlin2.F | 484 ++
interpolation/wvqlint.F | 447 ++
interpolation/xrotate.F | 84 +
interpolation/xyz2ll.F | 97 +
interpolation/yrotate.F | 84 +
interpolation/zprec.F | 189 +
land_sea_mask/0-INDEX-0 | 30 +
land_sea_mask/LSM_GG_0048 | Bin 0 -> 106240 bytes
land_sea_mask/LSM_GG_0080 | Bin 0 -> 285744 bytes
land_sea_mask/LSM_GG_0128 | Bin 0 -> 710704 bytes
land_sea_mask/LSM_GG_0160 | Bin 0 -> 1106768 bytes
land_sea_mask/LSM_GG_0200 | Bin 0 -> 1711904 bytes
land_sea_mask/LSM_GG_0256 | Bin 0 -> 2788224 bytes
land_sea_mask/LSM_GG_0400 | Bin 0 -> 6747920 bytes
land_sea_mask/LSM_GG_0640 | Bin 0 -> 17125616 bytes
land_sea_mask/defaults_for_table_001 | 11 +
land_sea_mask/defaults_for_table_128 | 14 +
land_sea_mask/defaults_for_table_129 | 14 +
land_sea_mask/ksm_xx_lsm0p5deg | Bin 0 -> 32490 bytes
land_sea_mask/lsm_xx_lsm0p25deg | Bin 0 -> 129780 bytes
land_sea_mask/lsm_xx_lsm0p5deg | Bin 0 -> 32568 bytes
land_sea_mask/lsm_xx_lsm10m01 | Bin 0 -> 293760 bytes
land_sea_mask/lsm_xx_lsmn080 | Bin 0 -> 6440 bytes
land_sea_mask/lsm_xx_lsmr160 | Bin 0 -> 17296 bytes
land_sea_mask/parameter_processing_defaults | 27 +
land_sea_mask/r160_xx_19790930 | Bin 0 -> 16836 bytes
land_sea_mask/r160_xx_19910917 | Bin 0 -> 16836 bytes
land_sea_mask/r160_xx_19930804 | Bin 0 -> 16836 bytes
land_sea_mask/r160_xx_19940302 | Bin 0 -> 16836 bytes
land_sea_mask/r160_xx_19940823 | Bin 0 -> 16836 bytes
land_sea_mask/r160_xx_19950404 | Bin 0 -> 17296 bytes
options/options_CRAY | 5 +
options/options_FUJITSU | 12 +
options/options_VPP5000 | 12 +
options/options_decalpha | 7 +
options/options_decmips | 7 +
options/options_hpia64 | 15 +
options/options_hppa | 15 +
options/options_i686 | 12 +
options/options_i86pc | 7 +
options/options_ibm_power4 | 9 +
options/options_ibm_power6 | 9 +
options/options_ibm_power7 | 9 +
options/options_itanium | 7 +
options/options_linux | 10 +
options/options_linux_g77 | 7 +
options/options_rs6000 | 11 +
options/options_sgimips | 9 +
options/options_sun4 | 9 +
pbio/0-INDEX-0 | 40 +
pbio/Makefile | 35 +
pbio/Makefile.in | 41 +
pbio/Makefile.shared | 36 +
pbio/PBGroutines.c | 2565 +++++++++
pbio/PBGroutines.h | 192 +
pbio/README | 657 +++
pbio/blokex.F | 1951 +++++++
pbio/bufrgrib.h | 33 +
pbio/crexrd.c | 121 +
pbio/emosnum.F | 101 +
pbio/extras.c | 66 +
pbio/fileRead.h | 90 +
pbio/fort2c.c | 48 +
pbio/fort2c.h | 108 +
pbio/fort2c_hppa.c | 51 +
pbio/fortint.h | 24 +
pbio/gbyte.c | 287 +
pbio/gbyte_alpha.c | 215 +
pbio/gbyte_le.c | 369 ++
pbio/grprs.h | 16 +
pbio/lwsize.c | 69 +
pbio/make.dep | 17 +
pbio/mvchars.c | 55 +
pbio/newpbio.c | 592 ++
pbio/pbbufr.F | 125 +
pbio/pbcrex.F | 134 +
pbio/pbfp.c | 23 +
pbio/pbgrib.F | 123 +
pbio/pbio.c | 1559 +++++
pbio/pbio_alpha.c | 754 +++
pbio/pbionum.F | 124 +
pbio/pbpseu.F | 123 +
pbio/pbsize.c | 88 +
pbio/readany.c | 65 +
pbio/readbufr.c | 61 +
pbio/readcrex.c | 60 +
pbio/readgrib.c | 63 +
pbio/readnext.c | 73 +
pbio/readprod.c | 891 +++
pbio/readprod_alpha.c | 524 ++
pbio/recheckLength.c | 150 +
pbio/setpar.c | 38 +
pbio/sizeRoutines.h | 28 +
pbio/sources.CRAY | 34 +
pbio/sources.FUJITSU | 36 +
pbio/sources.VPP5000 | 36 +
pbio/sources.decalpha | 36 +
pbio/sources.decmips | 35 +
pbio/sources.hpia64 | 36 +
pbio/sources.hppa | 38 +
pbio/sources.i86pc | 36 +
pbio/sources.ibm_power4 | 35 +
pbio/sources.ibm_power6 | 35 +
pbio/sources.ibm_power7 | 35 +
pbio/sources.itanium | 36 +
pbio/sources.linux | 36 +
pbio/sources.linux_g77 | 36 +
pbio/sources.rs6000 | 35 +
pbio/sources.sgimips | 36 +
pbio/sources.sun4 | 36 +
1376 files changed, 371603 insertions(+)
diff --git a/AUTHORS b/AUTHORS
new file mode 100755
index 0000000..a8db325
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,6 @@
+John Hennessy
+John Chambers
+Sinisa Curic
+Milan Dragosavac
+Keith Fielding
+Jean Clochard
diff --git a/LICENSE b/LICENSE
new file mode 100755
index 0000000..db2bda5
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 1981-2012 European Centre for Medium-Range Weather Forecasts (ECMWF
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/Makefile b/Makefile
new file mode 100755
index 0000000..290bc20
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,21 @@
+# Makefile for libemos
+#
+TARGETS = all clean
+LIBRARY = libemos$(R64).a
+GRIB_API_MERGING=
+SHELL=/bin/sh
+SUBDIRS = gribex interpolation bufrdc crexdc pbio fft bufrtables $(GRIB_API_MERGING)
+
+
+all :
+ @for name in $(SUBDIRS); do\
+ ( echo "*************************"; \
+ echo "*** Make in $$name "; \
+ echo "*************************"; \
+ cd $$name ; make LIB=emos; ) done
+
+clean :
+ @for name in $(SUBDIRS); do\
+ ( echo "*** Clean in $$name ***" ;cd $$name ; make clean ); \
+ done
+ rm -f $(LIBRARY)
diff --git a/Makefile.in b/Makefile.in
new file mode 100755
index 0000000..b2efe81
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,21 @@
+# Makefile for libemos
+#
+GRIB_API_MERGING=glue
+R64 = reals
+TARGETS = all clean
+LIBRARY = libemos$(R64).a
+SHELL=/bin/sh
+SUBDIRS = gribex interpolation bufrdc crexdc pbio fft bufrtables $(GRIB_API_MERGING)
+
+all :
+ @for name in $(SUBDIRS); do\
+ ( echo "*************************"; \
+ echo "*** Make in $$name "; \
+ echo "*************************"; \
+ cd $$name ; make ; ) done
+
+clean :
+ @for name in $(SUBDIRS); do\
+ ( echo "*** Clean in $$name ***" ;cd $$name ; make clean ); \
+ done
+ rm -f $(LIBRARY)
diff --git a/NOTICE b/NOTICE
new file mode 100755
index 0000000..abf0b32
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,38 @@
+Emoslib
+=======
+
+Copyright 1981-2013 ECMWF
+
+This product mainly includes software developed by the
+
+ Data and Services Section
+
+ and
+
+ Meteorological Visualisation Section
+
+at the
+
+ "European Centre for Medium-Range Weather Forecasts"
+ (ECMWF - http://www.ecmwf.int ).
+
+
+We would like to acknoledge the following contributions to Emoslib:
+
+- Files written by NCAR, the National Center for Atmospheric Research.
+ bt_ibm_bal.bal
+ btibm.special
+
+- File kwprs1.F makes use of the
+ WMO Manual on Codes re GRIB Code.
+ http://www.nco.ncep.noaa.gov/pmb/docs/on388/appendixc.html.
+
+- File c2gene.F
+ Algorithm used to determine groups is derived from Harry R. Glahn
+ (U.S. Met Service), from a working paper submitted to WMO SGDRC
+ in 1995.
+
+- File calcop.F
+ Located in the materials contains the following citation:
+ Seber, G.A.F. (1979). Linear Regression Analyses.
+ John Wiley and Sons
diff --git a/README b/README
new file mode 100755
index 0000000..69211d9
--- /dev/null
+++ b/README
@@ -0,0 +1,313 @@
+
+ Emos library
+ --------------
+
+ Any comments on the document or the software would be appreciated.
+ Please address comments to:
+
+Software Services
+ECMWF
+Shinfield Park
+Reading
+Berkshire RG2 9AX
+U.K.
+
+Fax: +44 1734 869450
+
+e-mail: software.services at ecmwf.int
+
+The software is provided as a tar gzip file. This should be expanded using
+
+tar -xfz emos_version.tar.gz
+
+Content:
+Makefile Makefile for 'everything'
+build_library Script bilding library
+install Install script
+gribex Subdirectory containing GRIB encoding/decoding software
+gribtables Subdirectory containing GRIB tables
+gribtemplates Subdirectory containing Gribex templates
+bufrdc Subdirectory containing BUFR encoding/decoding software
+bufrtables Subdirectory containing BUFR tables
+crexdc Subdirectory containing CREX encoding/decoding software
+crextables Subdirectory containing CREX tables
+land_sea_mask Subdirectory containing land-sea mask
+pbio Subdirectory containing binary read/write routines
+fft Subdirectory containing Multiple FFT routines
+examples Subdirectory containing example programs
+config Subdirectory containing configuration files for make
+options Subdirectory containing options files for make
+
+**************************************************************
+
+This is instruction how to build library and install:
+
+Run the script bilding library and answer on a few questions:
+
+ ./build_library
+
+ After library is built, tables, land-sea mask and library should be
+installed at appropriate place.
+
+ It is recomended to do it by install script.
+
+ ./install
+
+ If you want to put library in /usr/local/lib directory,
+you should run install script with root permission.
+
+**************************************************************
+
+It is strongly suggested to build the library using
+shell script ./build_library and install using ./install !!!
+
+**************************************************************
+
+
+Compilation options
+-------------------
+
+ Files are given for a variety of platforms defining the compilation options:
+makefile configuration, compiler options and source file lists.
+
+ Using SGI as an example, these files are:
+
+1) In the working directory
+
+ config.sgimips
+ config.sgimipsR64
+ options_sgimips
+
+2) In subdirectories gribex and pbio
+
+ sources.sgimips
+
+
+Compiling the library
+---------------------
+
+ The correct configuration, options and source files can be selected using for
+make variables: ARCH, CNAME, A64 and R64.
+
+ ARCH indicates the machine architecture on which the Emos library will be
+installed. It may not necessarily have a pre-defined value. A list of possible
+values could include: linux, windows, CRAY, FUJITSU, VPP5000, decalpha, hppa,
+i686, ibm_power4, rs6000, sgimips and sun4.
+ CNAME is used to name the compilers; it may or may not be pre-defined, depending
+on the operational system you use. If you want to choose your own compilers, you
+can define them in the appropriate 'config' file. For Linux CNAME=_gfortran can
+be specified in order to compile with Gnu compilers gcc and gfortran.
+
+decalpha - Compaq Fortran 90 compiler
+ - the C++ compiler
+hppa - HP Fortran compiler
+ - C compiler
+linux - The Portland Group Compiler Technology Fortran 90 compiler,
+ pgf90 and pgcc
+ - GNU project C, C++ Compiler, F77 compiler
+rs6000 - XL Fortran for AIX
+ - C for AIX Compiler, Version 5
+sgimips - MIPSpro F77 compiler
+ - MIPS C compiler
+sun4 - Forte[tm] Developer 7 Fortran 95 compiler
+ - SunOS/BSD Compatibility Package C compiler
+
+ A64 determines 32 or 64 bits machine.
+ R64 determines the number of bits in the representation of real numbers.
+The default is 32-bit. You can choose 64-bit setting R64=R64 in order to get
+64-bit real numbers.
+
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+If you decide to build the library using directly make, please NOTE that
+you have to specify path for gribtables, bufrtables, crextables,
+land_sea_mask, gribtemplates in appropriate
+
+config/config.$ARCH$CNAME$R64
+
+You should add -DTABLE_PATH=\'/your path\'/
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+
+
+There are two ways of carrying out the compilation:
+----------------------------------------------------
+
+1) Compile setting the ARCH variable just for the command:
+
+ make ARCH=sgimips
+
+ In this case R64 is pre-defined.
+
+2) Compile setting the ARCH variable and choosing 64-bit reals;
+
+ make ARCH=sgimips R64=R64
+
+3) On Linux compile setting CNAME=_gfortran to force the use of the Gnu
+ compilers gfortran and gcc.
+
+ make ARCH=linux CNAME=_gfortran
+
+4) Same as 3) and added A64 if machine is 64 bits Linux
+
+ make ARCH=linux CNAME=_gfortran A64=A64
+
+ The library will be created in a working directory and be named libemos(R64).a.
+
+ It is recommended that users should not change any routines in the source
+sub-directories because any changes would not be present in future ECMWF
+releases of this software.
+
+ You can use other options for compilation. For example: selecting the working
+directory; modifying the configuration files; changing the level of
+optimisation; etc. The 'make' utility can be used repeatedly. It will only
+cause the re-compilation of routines which have been modified since the
+previous 'make'.
+
+
+Environment variables
+---------------------
+
+IF YOU USE ./build_library SCRIPT YOU DON'T NEED TO SET ENVIRONMENTAL
+VARIABLES BELOW.
+
+ The location of tables and land-sea mask could be specified by the environment
+variables. Put the specification of them in your startup files (.profile, ...)
+to ensure you have access to the tables and land-sea
+on future logins.
+
+Bourne or Korn shell:
+
+ ECMWF_LOCAL_TABLE_PATH="choosen directory"/gribtables/
+ export ECMWF_LOCAL_TABLE_PATH
+
+ LOCAL_DEFINITION_TEMPLATES="choosen directory"/gribtemplates/
+ export LOCAL_DEFINITION_TEMPLATES
+
+ BUFR_TABLES="choosen directory"/bufrtables/
+ export BUFR_TABLES
+
+ CREX_TABLES="choosen directory"/crextables/
+ export CREX_TABLES
+
+ MARS_LSM_PATH="choosen directory"/land_sea_mask/
+ export MARS_LSM_PATH
+
+ HIRLAM_LSM_PATH="choosen directory"/land_sea_mask/
+ export HIRLAM_LSM_PATH
+
+
+C-shell:
+
+ setenv ECMWF_LOCAL_TABLE_PATH "choosen directory"/gribtables/
+ setenv LOCAL_DEFINITION_TEMPLATES "choosen directory"/gribtemplates/
+ setenv BUFR_TABLES "choosen directory"/bufrtables/
+ setenv CREX_TABLES "choosen directory"/crextables/
+ setenv MARS_LSM_PATH "choosen directory"/land_sea_mask/
+ setenv HIRLAM_LSM_PATH "choosen directory"/land_sea_mask/
+
+ The environment variable GRIBEX_DEBUG can be set to ON or OFF
+to switch on or off the debug output from GRIBEX.
+
+ The environment variable GRIBEX_CHECK can be set to ON or OFF
+to switch on or off the checking of headers in GRIBEX.
+
+ The environment variable JDCNDBG can be set to 1 in order to get
+comperhensive output from INTERPOLATION routines
+
+ The following variable can be set to "true" in order to create CREX massege
+with check digit.
+
+ USE_E=TRUE
+
+ HIRLAM_LSM_PATH is place for LSM_GG_xxxx, reduced gaussian land-sea mask files,
+which is used just for rotation of surface fields. LSM_GG_xxxx files supplied
+with package are just for LITTLE ENDIAN machines.
+ When compiling a program, you need to specify where to find libemos.a by
+putting its full pathname in the makefile. The initial location of the library
+is "working directory". An alternative is to put libemos.a in /usr/local/lib
+(this may need system priviliges) which is conventionally used on UNIX-type
+systems for holding libraries and should be defined in your environment PATH
+variable.
+
+ The library name follows the normal UNIX convention (it starts with lib and ends
+in .a), so the library can be specified in the compile/link command using the
+standard ld convention, for example:
+
+ cc -o program program.c -lemos
+ You can see an examples of decoding a GRIB, BUFR, CREX product and interpolation
+in examples/ directory.
+
+cd examples
+
+than choose bufr, crex, gribex, interpolation, fft directory.
+
+ Invoke 'make' and start an executable version of program e.g. agrdemo.F through:
+
+ ./test.sh
+
+ In case of gribex example that will temporary set env variables
+ ECMWF_LOCAL_TABLE_PATH and LOCAL_DEFINITION_TEMPLATES
+ and run
+
+ ./agrdemo -i ../../data/latlon.grib
+
+ for testing purpose before installation
+
+ where latlon.grib is a file containing GRIB fields on latitude/longitude
+grids.
+
+ It can be re-run for gaussian grids and spherical harmonic fields.
+
+Terminology
+-----------
+
+ >From here on, any reference to SOFTWARE in file names should be interpreted
+as the software you have received, i.e. GRIB, PBIO etc.
+
+ The use of the word PLATFORM refers to the make of the computer for which the
+software is intended and substitutes for CRAY, sun etc.
+
+ SUBPACKAGE could be any of pbio, gribex etc. and refers to a part of the
+whole SOFTWARE set.
+
+
+Provided for UNIX systems named above.
+--------------------------------------
+
+ This README file.
+ The tar file emos_000version.tar (version is a 3-digit number).
+
+
+Other UNIX systems.
+-------------------
+
+ If you use a UNIX system other than those for which the software was prepared,
+you should experiment with the configurations provided to see if any are
+suitable for your system.
+
+ If any problems are encountered, the following points are worth considering:
+
+Is your cc compiler ANSI?
+The C code in this software is ANSI conformant.
+
+Does your FORTRAN compiler need other switches?
+Look at other programs compiled on your system.
+
+Does your system need a ranlib command performed on the libraries?
+Do "man ar" or "man ranlib".
+
+How many bytes are there in a computer word. Is the platform big-endian or
+little-endian? Some of routines are dependent on the word size and on which bit
+in a computer word is the most significant. These dependencies may be resolved
+by choosing one or other of the files gbyte.c or gbyte_alpha.c(for a
+little-endian system).
+
+
+License
+--------
+
+This software is licensed under the Apache License.
+
diff --git a/bufrdc/Makefile b/bufrdc/Makefile
new file mode 100755
index 0000000..9b440dd
--- /dev/null
+++ b/bufrdc/Makefile
@@ -0,0 +1,29 @@
+#
+# Makefile for bufrdc
+#
+LIBRARY = ../lib$(LIB)$(R64).a
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+TARGETS = all clean
+#
+include sources
+#
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.f = $(SOURCES.f:.f=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.F) $(OBJECTS.f) $(OBJECTS.c)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+$(LIBRARY): $(OBJECTS)
+ $(AR) $(ARFLAGS) $@ $?
+ $(RANLIB) $@
+
+clean:
+ \rm -f $(OBJECTS)
diff --git a/bufrdc/Makefile.in b/bufrdc/Makefile.in
new file mode 100755
index 0000000..04b1fdc
--- /dev/null
+++ b/bufrdc/Makefile.in
@@ -0,0 +1,35 @@
+#
+# Makefile for bufrdc
+#
+A64 = plat
+R64 = reals
+ARCH = arch
+CNAME = comp
+LIB = depl
+#
+LIBRARY = ../lib$(LIB)$(R64).a
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+TARGETS = all clean
+#
+include sources
+#
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.f = $(SOURCES.f:.f=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.F) $(OBJECTS.f) $(OBJECTS.c)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+$(LIBRARY): $(OBJECTS)
+ $(AR) $(ARFLAGS) $@ $?
+ $(RANLIB) $@
+
+clean:
+ \rm -f $(OBJECTS)
diff --git a/bufrdc/Makefile.shared b/bufrdc/Makefile.shared
new file mode 100755
index 0000000..b6fd49f
--- /dev/null
+++ b/bufrdc/Makefile.shared
@@ -0,0 +1,30 @@
+#
+# Makefile for bufrdc
+#
+LIBRARY = ../lib$(LIB)$(R64).so
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+PROFILE=$(SHLIB)
+#
+TARGETS = all clean
+#
+include sources
+#
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.f = $(SOURCES.f:.f=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.F) $(OBJECTS.f) $(OBJECTS.c)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+$(LIBRARY): $(OBJECTS) $(EXTRAOBJ)
+ $(LD) $(DYNLINKFLAGS) $? -o $@
+
+clean:
+ \rm -f $(OBJECTS)
diff --git a/bufrdc/README b/bufrdc/README
new file mode 100755
index 0000000..58341bc
--- /dev/null
+++ b/bufrdc/README
@@ -0,0 +1,156 @@
+This directory contains software from the BUFR decoding and encoding update
+library.
+
+bbuprs0.F Print BUFR section 0 (?)
+bbuprs1.F Print BUFR section 1 (?)
+bbuprs2.F Print BUFR section 2 (?)
+bbuprs3.F Print BUFR section 3 (?)
+bbuprt.F Print BUFR (?)
+bbuprtbox.F Print BUFR box (?)
+
+buaug.F Update augmented Bufr table B.
+bubox.F ??
+bucomp.F Pack number of subsets in a compressed form.
+bucrkey.F Extract elements needed for RDB key definition(update).
+bucrekey.F Extract elements needed for RDB key definition.
+buedd.F Expand section 3 of Bufr message
+buens0.F Pack section 0 of Bufrsage.
+buens1.F Pack section 1 of Bufr message.
+buens2.F Pack section 2 of Bufr message.
+buens3.F Pack section 3 of Bufr message.
+buens4.F Pack preliminary items/data of sect.4 of Bufr message.
+buens5.F Pack sect.5 of Bufr message.
+buepmrk.F Process marker operator, replace with table B descriptor
+buepmrkc.F Process marker operator, replace with table B descriptor
+buepwt.F Updates working tables (name,unit,scale,ref,data width)
+buepwtc.F Updates working tables (name,unit,scale,ref,data width)
+buerr.F Print error code.
+buetab.F Load Bufr table B, D and C according to Bufr code.
+buetd.F Expand sect.3 of Bufr message.
+buetdr.F Solve Bufr table D reference.
+buevar.F Initialize constants and variables.
+buexs0.F Expands sect.0 of Bufr message.
+buexs1.F Expands sect.1 of Bufr message.
+buexs2.F Expands sect.2 of Bufr message.
+buexs3.F Expand sect.3 of Bufr message.
+buexs3p.F Expand sect.3 of Bufr message. (preliminary items)
+buexs4.F Expand sect.4 of Bufr message.
+buexs5.F Expands sect.5 of Bufr message.
+bufren.F Encode Bufr message.
+bufrex.F Decode Bufr message into fully expanded form
+bugbts.F Load Bufr table B, D and C according to Bufr code.
+bugetbm.F Create bit map to resolve marker operators.
+buivar.F Initialize constants and variables.
+bunexs.F Sets word/bit pointers at the start of next Bufr sect.
+bunpck.F Unpack bit string
+bunpks.F Unpack bit string of KSIZE bits.
+buoctn.F Calculate number of octets from bit position.
+buoper.F Process Bufr operator.
+buoperc.F Process Bufr operator.
+bupck.F Pack value *KS* in *KSI* bits
+bupkey.F Pack local ECMWF information (rdb key)
+bupks.F Pack bit string of KSIZE bits
+bupmrk.F Process marker operator, relace with table B descriptor.
+buprco.F Process Bufr operator.
+buprq.F Sets variable KPMISS,KPRUS into common block.
+buprs0.F Print sect.0 of Bufr message.
+buprs1.F Print sect.1 of bufr message.
+buprs2.F Print sect.2 of bufr message (expanded RDB key).
+buprs3.F Print sect.3 of Bufr message.
+buprt.F Print expanded Bufr message.
+buprtbox.F Print boxed expanded bufr message.
+burep.F Resolve data descriptor replication problem.
+burepc.F Resolve data descriptor replication problem.
+burqc.F Create parameters needed for partial expansion of Bufr
+burquc.F Create parameters needed for partial expansion of Bufr
+bus012.F Expands sect.0,1 AND 2 of Bufr message.
+busel.F Returns Data Descriptors as in Section 3 of Bufr
+buset.F Set flags in common block (?)
+busrp.F Resolve data descriptor replication problem.
+busrq.F Set Bufr table B references for partial expansion.
+bustdr.F Solve Bufr table D reference.
+buuatb.F Update augmented Bufr table B.
+buukey.F Expands local ECMWF information from sect.2.
+buunp.F Unpack bit string of KSIZE bits
+buunps.F Unpack bit string of KSIZE bits
+buupwt.F Updates working tables (name,unit,scale,ref,data width)
+buxdes.F Expand data descriptors to show user's template
+fmmh.F Find max/min latitude/longitude.
+mbbuprs0.F Mars version of routine (without leading m)
+mbbuprs1.F Mars version of routine (without leading m)
+mbbuprs2.F Mars version of routine (without leading m)
+mbbuprs3.F Mars version of routine (without leading m)
+mbbuprt.F Mars version of routine (without leading m)
+mbbuprtbox.F Mars version of routine (without leading m)
+mbuaug.F Mars version of routine (without leading m)
+mbubox.F Mars version of routine (without leading m)
+mbucomp.F Mars version of routine (without leading m)
+mbucrekey.F Mars version of routine (without leading m)
+mbucrkey.F Mars version of routine (without leading m)
+mbuedd.F Mars version of routine (without leading m)
+mbuens0.F Mars version of routine (without leading m)
+mbuens1.F Mars version of routine (without leading m)
+mbuens2.F Mars version of routine (without leading m)
+mbuens3.F Mars version of routine (without leading m)
+mbuens4.F Mars version of routine (without leading m)
+mbuens5.F Mars version of routine (without leading m)
+mbuepmrk.F Mars version of routine (without leading m)
+mbuepmrkc.F Mars version of routine (without leading m)
+mbuepwt.F Mars version of routine (without leading m)
+mbuepwtc.F Mars version of routine (without leading m)
+mbuerr.F Mars version of routine (without leading m)
+mbuetab.F Mars version of routine (without leading m)
+mbuetd.F Mars version of routine (without leading m)
+mbuetdr.F Mars version of routine (without leading m)
+mbuevar.F Mars version of routine (without leading m)
+mbuexs0.F Mars version of routine (without leading m)
+mbuexs1.F Mars version of routine (without leading m)
+mbuexs2.F Mars version of routine (without leading m)
+mbuexs3.F Mars version of routine (without leading m)
+mbuexs3p.F Mars version of routine (without leading m)
+mbuexs4.F Mars version of routine (without leading m)
+mbuexs5.F Mars version of routine (without leading m)
+mbufr_mars_filter.F Mars version of routine (without leading m)
+mbufren.F Mars version of routine (without leading m)
+mbufrex.F Mars version of routine (without leading m)
+mbugbts.F Mars version of routine (without leading m)
+mbugetbm.F Mars version of routine (without leading m)
+mbuivar.F Mars version of routine (without leading m)
+mbunexs.F Mars version of routine (without leading m)
+mbunpck.F Mars version of routine (without leading m)
+mbunpks.F Mars version of routine (without leading m)
+mbuoctn.F Mars version of routine (without leading m)
+mbuoper.F Mars version of routine (without leading m)
+mbuoperc.F Mars version of routine (without leading m)
+mbupck.F Mars version of routine (without leading m)
+mbupkey.F Mars version of routine (without leading m)
+mbupks.F Mars version of routine (without leading m)
+mbupmrk.F Mars version of routine (without leading m)
+mbuprco.F Mars version of routine (without leading m)
+mbuprq.F Mars version of routine (without leading m)
+mbuprs0.F Mars version of routine (without leading m)
+mbuprs1.F Mars version of routine (without leading m)
+mbuprs2.F Mars version of routine (without leading m)
+mbuprs3.F Mars version of routine (without leading m)
+mbuprt.F Mars version of routine (without leading m)
+mbuprtbox.F Mars version of routine (without leading m)
+mburep.F Mars version of routine (without leading m)
+mburepc.F Mars version of routine (without leading m)
+mburqc.F Mars version of routine (without leading m)
+mburquc.F Mars version of routine (without leading m)
+mbus012.F Mars version of routine (without leading m)
+mbusel.F Mars version of routine (without leading m)
+mbuset.F Mars version of routine (without leading m)
+mbusrp.F Mars version of routine (without leading m)
+mbusrq.F Mars version of routine (without leading m)
+mbustdr.F Mars version of routine (without leading m)
+mbuuatb.F Mars version of routine (without leading m)
+mbuukey.F Mars version of routine (without leading m)
+mbuunp.F Mars version of routine (without leading m)
+mbuunps.F Mars version of routine (without leading m)
+mbuupwt.F Mars version of routine (without leading m)
+mbuxdes.F Mars version of routine (without leading m)
+mfmmh.F Mars version of routine (without leading m)
+msetlalo.F Mars version of routine (without leading m)
+setlalo.F Return indices for latitude and longitude.
+sources Sources
diff --git a/bufrdc/bbuprs0.F b/bufrdc/bbuprs0.F
new file mode 100755
index 0000000..dec97f8
--- /dev/null
+++ b/bufrdc/bbuprs0.F
@@ -0,0 +1,83 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BBUPRS0(KNT,KSEC0)
+C
+C**** *BUPRS0*
+C
+C
+C PURPOSE.
+C --------
+C PRINT SECTION 0 OF BUFR MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUPRS0(KNT,KSEC0)*
+C
+C INPUT :
+C *KNT* - UNIT NUMBER FOR IO
+C *KSEC0* - ARRAY CONTAINING SECTION 0 INFORMATION
+C KSEC0( 1)-- LENGTH OF SECTION 0 (BYTES)
+C KSEC0( 2)-- TOTAL LENGTH OF BUFR MESSAGE (BYTES)
+C KSEC0( 3)-- BUFR EDITION NUMBER
+C
+C METHOD.
+C -------
+C
+C NONE
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 04/02/91.
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+
+C
+# include "parameter.F"
+C
+ DIMENSION KSEC0(JSEC0)
+C
+C ------------------------------------------------------------------
+C
+C* 1. PRINT SECTION 0.
+C ----------------
+ 100 CONTINUE
+C
+ WRITE(KNT,'(1H1)')
+C
+ WRITE(KNT,'(1H ,A)') ' BUFR SECTION 0 '
+ WRITE(KNT,'(1H )')
+ WRITE(KNT,'(1H ,A,I5)') 'LENGTH OF SECTION 0 (BYTES) ',
+ 1 KSEC0(1)
+ WRITE(KNT,'(1H ,A,I5)') 'TOTAL LENGTH OF BUFR MESSAGE (BYTES)',
+ 1 KSEC0(2)
+ WRITE(KNT,'(1H ,A,I5)') 'BUFR EDITION NUMBER ',
+ 1 KSEC0(3)
+C
+ RETURN
+ END
diff --git a/bufrdc/bbuprs1.F b/bufrdc/bbuprs1.F
new file mode 100755
index 0000000..e6f8956
--- /dev/null
+++ b/bufrdc/bbuprs1.F
@@ -0,0 +1,180 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BBUPRS1(KNT,KSEC1)
+C
+C**** *BUPRS1*
+C
+C
+C PURPOSE.
+C --------
+C PRINT SECTION 1 OF BUFR MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUPRS1(KNT,KSEC1)*
+C
+C INPUT :
+C *KNT* - UNIT NUMBER FOR IO
+C *KSEC1* - ARRAY CONTAINING SECTION 1 INFORMATION
+C KSEC1( 1)-- LENGTH OF SECTION 1 (BYTES)
+C KSEC1( 2)-- BUFR EDITION NUMBER
+C KSEC1( 3)-- ORIGINATING CENTRE
+C KSEC1( 4)-- UPDATE SEQUENCE NUMBER
+C KSEC1( 5)-- FLAG (PRESENCE OF SECTION 2)
+C KSEC1( 6)-- BUFR MESSAGE TYPE
+C KSEC1( 7)-- BUFR MESSAGE SUBTYPE
+C KSEC1( 8)-- VERSION NUMBER OF LOCAL TABLE USED
+C KSEC1( 9)-- YEAR
+C KSEC1(10)-- MONTH
+C KSEC1(11)-- DAY
+C KSEC1(12)-- HOUR
+C KSEC1(13)-- MINUTE
+C KSEC1(14)-- BUFR MASTER TABLE
+C KSEC1(15)-- VERSION NUMBER OF MASTER TABLE USED
+C KSEC1(16) - KSEC1(JSEC1) -- LOCAL ADP CENTRE
+C INFORMATION(BYTE BY BYTE)
+C
+C FOR BUFR EDITION >= 3
+C
+C KSEC1(16) - ORIGINATING SUB-CENTRE
+C KSEC1(18) - KSEC1(JSEC1) -- LOCAL ADP CENTRE
+C INFORMATION(BYTE BY BYTE)
+C
+C FOR BUFR EDITION 4 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- INTERNATIONAL SUB-CATEGORY (SEE COMMON TABLE C-13
+C KSEC1(18)-- SECOND
+C KSEC1(19)-- YEAR
+C KSEC1(20)-- MONTH
+C KSEC1(21)-- DAY
+C KSEC1(22)-- HOUR
+C KSEC1(23)-- MINUTE
+C KSEC1(24)-- SECOND
+C KSEC1(25)-- YEAR
+C KSEC1(26)-- MONTH
+C KSEC1(27)-- DAY
+C KSEC1(28)-- HOUR
+C KSEC1(29)-- MINUTE
+C KSEC1(30)-- SECOND
+C KSEC1(31)-- MOST SOUTHERN LATITUDE (-90 to 90)
+C KSEC1(32)-- MOST WESTERN LONGITUDE ( 0-360)
+C KSEC1(33)-- MOST NORTHEN LATITUDE (-90 to 90)
+C KSEC1(34)-- MOST EASTERN LONGITUDE ( 0-360)
+C KSEC1(35) TO KSEC1(JSEC1) - LOCAL ADP CENTRE INFORMATION(PACKED FORM)
+C
+C
+C METHOD.
+C -------
+C
+C NONE
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 04/02/91.
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+C
+ DIMENSION KSEC1(JSEC1)
+C
+C ------------------------------------------------------------------
+C
+C* 1. PRINT SECTION 1.
+C ----------------
+ 100 CONTINUE
+C
+ WRITE(KNT,'(1H1)')
+C
+ IF(KSEC1( 2).LE.3) THEN
+ WRITE(KNT,'(1H ,A)') ' BUFR SECTION 1 '
+ WRITE(KNT,'(1H )')
+ WRITE(KNT,'(1H ,A,I5)')'LENGTH OF SECTION 1 (BYTES) ',KSEC1( 1)
+ WRITE(KNT,'(1H ,A,I5)')'BUFR EDITION NUMBER ',KSEC1( 2)
+ IF(KSEC1(2).GE.3) THEN
+ WRITE(KNT,'(1H ,A,I5)')'ORIGINATING SUB-CENTRE ',KSEC1(16)
+ END IF
+ WRITE(KNT,'(1H ,A,I5)')'ORIGINATING CENTRE ',KSEC1( 3)
+ WRITE(KNT,'(1H ,A,I5)')'UPDATE SEQUENCE NUMBER ',KSEC1( 4)
+ WRITE(KNT,'(1H ,A,I5)')'FLAG (PRESENCE OF SECTION 2) ',KSEC1( 5)
+ WRITE(KNT,'(1H ,A,I5)')'BUFR MESSAGE TYPE ',KSEC1( 6)
+ WRITE(KNT,'(1H ,A,I5)')'BUFR MESSAGE SUBTYPE ',KSEC1( 7)
+ WRITE(KNT,'(1H ,A,I5)')'VERSION NUMBER OF LOCAL TABLE ',KSEC1( 8)
+ WRITE(KNT,'(1H ,A,I5)')'YEAR ',KSEC1( 9)
+ WRITE(KNT,'(1H ,A,I5)')'MONTH ',KSEC1(10)
+ WRITE(KNT,'(1H ,A,I5)')'DAY ',KSEC1(11)
+ WRITE(KNT,'(1H ,A,I5)')'HOUR ',KSEC1(12)
+ WRITE(KNT,'(1H ,A,I5)')'MINUTE ',KSEC1(13)
+ WRITE(KNT,'(1H ,A,I5)')'VERSION NUMBER OF MASTER TABLE',KSEC1(15)
+ WRITE(KNT,'(1H ,A,I5)')'BUFR MASTER TABLE ',KSEC1(14)
+
+ ELSEIF(KSEC1( 2).EQ.4) THEN
+
+ WRITE(KNT,'(1H ,A)') ' BUFR SECTION 1 '
+ WRITE(KNT,'(1H )')
+ WRITE(KNT,'(1H ,A,I9)')'LENGTH OF SECTION 1 (BYTES) ',KSEC1( 1)
+ WRITE(KNT,'(1H ,A,I9)')'BUFR MASTER TABLE ',KSEC1(14)
+ WRITE(KNT,'(1H ,A,I9)')'ORIGINATING CENTRE ',KSEC1( 3)
+ WRITE(KNT,'(1H ,A,I9)')'ORIGINATING SUB-CENTRE ',KSEC1(16)
+ WRITE(KNT,'(1H ,A,I9)')'UPDATE SEQUENCE NUMBER ',KSEC1( 4)
+ WRITE(KNT,'(1H ,A,I9)')'FLAG (PRESENCE OF SECTION 2) ',KSEC1( 5)
+ WRITE(KNT,'(1H ,A,I9)')'DATA CATEGORY ',KSEC1( 6)
+ WRITE(KNT,'(1H ,A,I9)')'DATA SUB-CATEGORY ',KSEC1(17)
+ WRITE(KNT,'(1H ,A,I9)')'LOCAL DATA SUB-CATEGORU ',KSEC1( 7)
+ WRITE(KNT,'(1H ,A,I9)')'VERSION NUMBER OF MASTER TABLE',KSEC1(15)
+ WRITE(KNT,'(1H ,A,I9)')'VERSION NUMBER OF LOCAL TABLE ',KSEC1( 8)
+ WRITE(KNT,'(1H ,A,I9)')'YEAR ',KSEC1( 9)
+ WRITE(KNT,'(1H ,A,I9)')'MONTH ',KSEC1(10)
+ WRITE(KNT,'(1H ,A,I9)')'DAY ',KSEC1(11)
+ WRITE(KNT,'(1H ,A,I9)')'HOUR ',KSEC1(12)
+ WRITE(KNT,'(1H ,A,I9)')'MINUTE ',KSEC1(13)
+ WRITE(KNT,'(1H ,A,I9)')'SECOND ',KSEC1(18)
+c WRITE(KNT,'(1H ,A,I9)')'YEAR (EARLIEST TIME) ',KSEC1(19)
+c WRITE(KNT,'(1H ,A,I9)')'MONTH (EARLIEST TIME) ',KSEC1(20)
+c WRITE(KNT,'(1H ,A,I9)')'DAY (EARLIEST TIME) ',KSEC1(21)
+c WRITE(KNT,'(1H ,A,I9)')'HOUR (EARLIEST TIME) ',KSEC1(22)
+c WRITE(KNT,'(1H ,A,I9)')'MINUTE (EARLIEST TIME) ',KSEC1(23)
+c WRITE(KNT,'(1H ,A,I9)')'SECOND (EARLIEST TIME) ',KSEC1(28)
+c WRITE(KNT,'(1H ,A,I9)')'YEAR (LATEST TIME) ',KSEC1(25)
+c WRITE(KNT,'(1H ,A,I9)')'MONTH (LATEST TIME) ',KSEC1(26)
+c WRITE(KNT,'(1H ,A,I9)')'DAY (LATEST TIME) ',KSEC1(27)
+c WRITE(KNT,'(1H ,A,I9)')'HOUR (LATEST TIME) ',KSEC1(28)
+c WRITE(KNT,'(1H ,A,I9)')'MINUTE (LATEST TIME) ',KSEC1(29)
+c WRITE(KNT,'(1H ,A,I9)')'SECOND (LATEST TIME) ',KSEC1(30)
+c WRITE(KNT,'(1H ,A,I9)')'MOST SOUTHERN LATITUDE ',KSEC1(31)
+c WRITE(KNT,'(1H ,A,I9)')'MOST WESTERN LONGITUDE ',KSEC1(32)
+c WRITE(KNT,'(1H ,A,I9)')'MOST NORTHERN LATITUDE ',KSEC1(33)
+c WRITE(KNT,'(1H ,A,I9)')'MOST EASTERN LONGITUDE ',KSEC1(34)
+C
+ END IF
+C
+ RETURN
+ END
diff --git a/bufrdc/bbuprs2.F b/bufrdc/bbuprs2.F
new file mode 100755
index 0000000..c8288b4
--- /dev/null
+++ b/bufrdc/bbuprs2.F
@@ -0,0 +1,253 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BBUPRS2(KNT,KSUP,KEY)
+C
+C**** *BUPRS2*
+C
+C
+C PURPOSE.
+C --------
+C PRINT SECTION 2 OF BUFR MESSAGE (EXPANDED RDB KEY).
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUPRS2(KNT,KSUP,KEY)*
+C
+C INPUT :
+C *KNT* - UNIT NUMBER FOR IO
+C *KSUP* - ARRAY CONTAINING SUPLEMENTARY INFORMATION
+C - KSUP( 1) -- IDIM1, DIMENSION OF KSEC1
+C - KSUP( 2) -- IDIM2, DIMENSION OF KSEC2
+C - KSUP( 3) -- IDIM3, DIMENSION OF KSEC3
+C - KSUP( 4) -- IDIM4, DIMENSION OF KSEC4
+C - KSUP( 5) -- M (NUMBER OF ELEMENTS IN VALUES ARRAY,
+C FIRST INDEX)
+C - KSUP( 6) -- N (NUMBER OF SUBSETS,SECOND INDEX OF
+C VALUES ARRAY)
+C - KSUP( 7) -- JVC (NUMBER OF ELEMENTS IN CVAL ARRAY)
+C - KSUP( 8) -- TOTAL BUFR MESSAGE LENGTH IN BYTES
+C - KSUP( 9) -- IDIM0, DIMENSION OF KSEC0
+C *KEY* - ARRAY CONTAINING SECTION 2 INFORMATION
+C KEY( 1)-- LENGTH OF SECTION 2 (BYTES)
+C KEY( 2)-- RDB TYPE
+C KEY( 3)-- RDB SUBTYPE
+C KEY( 4)-- YEAR
+C KEY( 5)-- MONTH
+C KEY( 6)-- DAY
+C KEY( 7)-- HOUR
+C KEY( 8)-- MINUTE
+C KEY( 9)-- SECOND
+C KEY(10)-- LONGITUDE1
+C KEY(11)-- LATITUDE1
+C KEY(12)-- LONGITUDE2
+C KEY(13)-- LATITUDE2
+C KEY(14)-- NUMBER OF SUBSETS
+C KEY(15)-- IDENT (NUMERIC)
+C KEY(16)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(17)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(18)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(19)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(20)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(21)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(22)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(23)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(24)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(25)-- TOTAL BUFR MESSAGE LENGTH
+C KEY(26)-- DAY (RDB INSERTION)
+C KEY(27)-- HOUR (RDB INSERTION)
+C KEY(28)-- MINUTE (RDB INSERTION)
+C KEY(29)-- SECOND (RDB INSERTION)
+C KEY(30)-- DAY (MDB INSERTION)
+C KEY(31)-- HOUR (MDB INSERTION)
+C KEY(32)-- MINUTE (MDB INSERTION)
+C KEY(33)-- SECOND (MDB INSERTION)
+C KEY(34)-- CORRECTION NUMBER
+C KEY(35)-- PART
+C KEY(36)-- 0
+C KEY(37)-- CORRECTION NUMBER
+C KEY(38)-- PART
+C KEY(39)-- 0
+C KEY(40)-- CORRECTION NUMBER
+C KEY(41)-- PART
+C KEY(42)-- 0
+C KEY(43)-- CORRECTION NUMBER
+C KEY(44)-- PART
+C KEY(45)-- 0
+C KEY(46)-- THE LOWEST Q/C % CONFIDENCE
+C
+C
+C
+C
+C METHOD.
+C -------
+C
+C NONE
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 04/02/91.
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+C
+ DIMENSION KSUP(JSUP),KEY(JKEY)
+C
+#ifndef R_4
+ REAL*8 RLAT1
+ REAL*8 RLON1
+ REAL*8 RLAT2
+ REAL*8 RLON2
+#else
+ REAL RLAT1
+ REAL RLON1
+ REAL RLAT2
+ REAL RLON2
+#endif
+C
+ CHARACTER*9 CIDENT
+ CHARACTER*13 YFM
+C
+C ------------------------------------------------------------------
+C
+C* 1. PRINT SECTION 2.
+C ----------------
+ 100 CONTINUE
+C
+ YFM='(1H ,A,TR0,A)'
+C
+ IF(KSUP(2).LE.1) THEN
+ WRITE(KNT) 'PRTKEY : RDB KEY NOT DEFINED IN SECTION 2.'
+ RETURN
+ END IF
+C
+ WRITE(KNT,'(1H1)')
+C
+ WRITE(KNT,'(1H ,A)') ' BUFR SECTION 2 '
+ WRITE(KNT,'(1H )')
+ WRITE(KNT,'(1H ,A,I9)') 'LENGTH OF SECTION 2 ', KEY(1)
+ WRITE(KNT,'(1H )')
+ WRITE(KNT,'(1H ,A)') ' REPORT DATA BASE KEY '
+ WRITE(KNT,'(1H )')
+C
+ IKTYPE=0
+ IF(KEY(2).EQ.2) IKTYPE=2
+ IF(KEY(2).EQ.3) IKTYPE=2
+ IF(KEY(2).EQ.12)IKTYPE=2
+ IF(KEY(2).EQ.08)IKTYPE=2
+ IF(IKTYPE.EQ.0.AND.KSUP(6).GT.1) IKTYPE=2
+C
+ IF(IKTYPE.EQ.2) THEN
+C IF(KEY(2).EQ.2.OR.KEY(2).EQ.3.OR.KEY(2).EQ.12) THEN
+C
+ WRITE(KNT,'(1H ,A,I9)') 'RDB DATA TYPE ', KEY(2)
+ WRITE(KNT,'(1H ,A,I9)') 'RDB DATA SUBTYPE ', KEY(3)
+ WRITE(KNT,'(1H ,A,I9)') 'YEAR ', KEY(4)
+ WRITE(KNT,'(1H ,A,I9)') 'MONTH ', KEY(5)
+ WRITE(KNT,'(1H ,A,I9)') 'DAY ', KEY(6)
+ WRITE(KNT,'(1H ,A,I9)') 'HOUR ', KEY(7)
+ WRITE(KNT,'(1H ,A,I9)') 'MINUTE ', KEY(8)
+ WRITE(KNT,'(1H ,A,I9)') 'SECOND ', KEY(9)
+ RLAT1=(KEY(11)-9000000)/100000.
+ RLON1=(KEY(10)-18000000)/100000.
+ WRITE(KNT,'(1H ,A,F9.2)')'LATITUDE 1 ', RLAT1
+ WRITE(KNT,'(1H ,A,F9.2)')'LONGITUDE 1 ', RLON1
+ RLAT2=(KEY(13)-9000000)/100000.
+ RLON2=(KEY(12)-18000000)/100000.
+ WRITE(KNT,'(1H ,A,F9.2)')'LATITUDE 2 ', RLAT2
+ WRITE(KNT,'(1H ,A,F9.2)')'LONGITUDE 2 ', RLON2
+ WRITE(KNT,'(1H ,A,I9)') 'NUMBER OF OBSERVATIONS ', KEY(14)
+ WRITE(KNT,'(1H ,A,I9)') 'IDENTIFIER ', KEY(15)
+ WRITE(KNT,'(1H ,A,I9)') 'TOTAL BUFR MESSAGE LENGTH ', KEY(25)
+ WRITE(KNT,'(1H ,A,I9)') 'DAY (RDB INSERTION) ', KEY(26)
+ WRITE(KNT,'(1H ,A,I9)') 'HOUR (RDB INSERTION) ', KEY(27)
+ WRITE(KNT,'(1H ,A,I9)') 'MINUTE( (RDB INSERTION) ', KEY(28)
+ WRITE(KNT,'(1H ,A,I9)') 'SECOND (RDB INSERTION) ', KEY(29)
+ WRITE(KNT,'(1H ,A,I9)') 'DAY (MDB ARRIVAL) ', KEY(30)
+ WRITE(KNT,'(1H ,A,I9)') 'HOUR (MDB ARRIVAL) ', KEY(31)
+ WRITE(KNT,'(1H ,A,I9)') 'MINUTE (MDB ARRIVAL) ', KEY(32)
+ WRITE(KNT,'(1H ,A,I9)') 'SECOND (MDB ARRIVAL ', KEY(33)
+ WRITE(KNT,'(1H ,A,I9)') 'CORRECTION NUMBER ', KEY(34)
+ WRITE(KNT,'(1H ,A,I9)') 'PART OF MESSAGE ', KEY(35)
+ WRITE(KNT,'(1H ,A,I9)') 'CORRECTION NUMBER ', KEY(37)
+ WRITE(KNT,'(1H ,A,I9)') 'PART OF MESSAGE ', KEY(38)
+ WRITE(KNT,'(1H ,A,I9)') 'CORRECTION NUMBER ', KEY(40)
+ WRITE(KNT,'(1H ,A,I9)') 'PART OF MESSAGE ', KEY(41)
+ WRITE(KNT,'(1H ,A,I9)') 'CORRECTION NUMBER ', KEY(43)
+ WRITE(KNT,'(1H ,A,I9)') 'PART OF MESSAGE ', KEY(44)
+ WRITE(KNT,'(1H ,A,I9)') 'QUALITY CONTROL % CONF ', KEY(46)
+ ELSE
+ WRITE(KNT,'(1H ,A,I9)') 'RDB DATA TYPE ', KEY(2)
+ WRITE(KNT,'(1H ,A,I9)') 'RDB DATA SUBTYPE ', KEY(3)
+ WRITE(KNT,'(1H ,A,I9)') 'YEAR ', KEY(4)
+ WRITE(KNT,'(1H ,A,I9)') 'MONTH ', KEY(5)
+ WRITE(KNT,'(1H ,A,I9)') 'DAY ', KEY(6)
+ WRITE(KNT,'(1H ,A,I9)') 'HOUR ', KEY(7)
+ WRITE(KNT,'(1H ,A,I9)') 'MINUTE ', KEY(8)
+ WRITE(KNT,'(1H ,A,I9)') 'SECOND ', KEY(9)
+ RLAT1=(KEY(11)-9000000)/100000.
+ RLON1=(KEY(10)-18000000)/100000.
+ WRITE(KNT,'(1H ,A,F9.2)')'LATITUDE 1 ', RLAT1
+ WRITE(KNT,'(1H ,A,F9.2)')'LONGITUDE 1 ', RLON1
+ IDD=0
+ CIDENT=' '
+ DO 201 ID=16,24
+ IDD=IDD+1
+ CIDENT(IDD:IDD)=CHAR(KEY(ID))
+ 201 CONTINUE
+ IDD=INDEX(CIDENT,' ')
+ IF(IDD.EQ.0) IDD=10
+ IDD=10-IDD
+ WRITE(YFM(10:10),'(I1)',ERR=202) IDD
+ GO TO 203
+ 202 YFM(10:10)='9'
+ 203 WRITE(KNT,FMT=YFM) 'IDENTIFER ', CIDENT
+ WRITE(KNT,'(1H ,A,I9)') 'TOTAL BUFR MESSAGE LENGTH ', KEY(25)
+ WRITE(KNT,'(1H ,A,I9)') 'DAY (RDB INSERTION) ', KEY(26)
+ WRITE(KNT,'(1H ,A,I9)') 'HOUR (RDB INSERTION) ', KEY(27)
+ WRITE(KNT,'(1H ,A,I9)') 'MINUTE (RDB INSERTION) ', KEY(28)
+ WRITE(KNT,'(1H ,A,I9)') 'SECOND (RDB INSERTION) ', KEY(29)
+ WRITE(KNT,'(1H ,A,I9)') 'DAY (MDB ARRIVAL) ', KEY(30)
+ WRITE(KNT,'(1H ,A,I9)') 'HOUR (MDB ARRIVAL) ', KEY(31)
+ WRITE(KNT,'(1H ,A,I9)') 'MINUTE (MDB ARRIVAL) ', KEY(32)
+ WRITE(KNT,'(1H ,A,I9)') 'SECOND (MDB ARRIVAL ', KEY(33)
+ WRITE(KNT,'(1H ,A,I9)') 'CORRECTION NUMBER ', KEY(34)
+ WRITE(KNT,'(1H ,A,I9)') 'PART OF MESSAGE ', KEY(35)
+ WRITE(KNT,'(1H ,A,I9)') 'CORRECTION NUMBER ', KEY(37)
+ WRITE(KNT,'(1H ,A,I9)') 'PART OF MESSAGE ', KEY(38)
+ WRITE(KNT,'(1H ,A,I9)') 'CORRECTION NUMBER ', KEY(40)
+ WRITE(KNT,'(1H ,A,I9)') 'PART OF MESSAGE ', KEY(41)
+ WRITE(KNT,'(1H ,A,I9)') 'CORRECTION NUMBER ', KEY(43)
+ WRITE(KNT,'(1H ,A,I9)') 'PART OF MESSAGE ', KEY(44)
+ WRITE(KNT,'(1H ,A,I9)') 'QUALITY CONTROL % CONF ', KEY(46)
+ END IF
+C
+ RETURN
+ END
diff --git a/bufrdc/bbuprs3.F b/bufrdc/bbuprs3.F
new file mode 100755
index 0000000..de88c14
--- /dev/null
+++ b/bufrdc/bbuprs3.F
@@ -0,0 +1,115 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BBUPRS3(KNT,KSEC3,KTDLEN,KTDLST,KTDEXL,
+ 1 KTDEXP,KELEM,CNAMES)
+C
+C**** *BUPRS3*
+C
+C
+C PURPOSE.
+C --------
+C PRINT SECTION 3 OF BUFR MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUPRS3(KNT,KSEC3,KTDLEN,KTDLST,KTDEXL,KTDEXP,
+C KELEM,CNAMES)*
+C
+C INPUT :
+C *KNT* - UNIT NUMBER IO
+C *KSEC3* - ARRAY CONTAINING SECTION 3 INFORMATION
+C KSEC3( 1)-- LENGTH OF SECTION 3 (BYTES)
+C KSEC3( 2)-- RESERVED
+C KSEC3( 3)-- NUMBER OF SUBSETS
+C KSEC3( 4)-- FLAG (DATA TYPE,DATA COMPRESSION)
+C *KTDLEN* - NUMBER OF DATA DESCRIPTORS IN SECTION 3
+C *KTDLST* - ARRAY CONTAINING DATA DESCRIPTORS IN SECTION 3
+C *KTDEXL* - NUMBER OF ENTRIES IN LIST OF EXPANDED DATA
+C DESCRIPTORS
+C *KTDEXP* - ARRAY CONTAINIG EXPANDED DATA DESCRIPTORS
+C *KELEM* - DIMENSION OF CNAMES, CUNITS ARRAY
+C *CNAMES* - CHARACTER ARRAY CONTAINING ELEMENT NAMES
+C
+C
+C METHOD.
+C -------
+C
+C NONE
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 04/02/91.
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+C
+ DIMENSION KSEC3(JSEC3)
+ DIMENSION KTDLST(KTDLEN)
+ DIMENSION KTDEXP(KTDEXL)
+C
+ CHARACTER*64 CNAMES(KELEM)
+C
+C ------------------------------------------------------------------
+C
+C* 1. PRINT SECTION 3.
+C ----------------
+ 100 CONTINUE
+C
+ WRITE(KNT,'(1H1)')
+C
+ WRITE(KNT,'(1H ,A)') ' BUFR SECTION 3 '
+ WRITE(KNT,'(1H )')
+ WRITE(KNT,'(1H ,A,I5)') 'LENGTH OF SECTION 3 (BYTES) ',
+ 1 KSEC3(1)
+ WRITE(KNT,'(1H ,A,I5)') 'RESERVED ',
+ 1 KSEC3(2)
+ WRITE(KNT,'(1H ,A,I5)') 'NUMBER OF DATA SUBSETS ',
+ 1 KSEC3(3)
+ WRITE(KNT,'(1H ,A,I5)') 'FLAG (DATA TYPE/DATA COMPRESSION) ',
+ 1 KSEC3(4)
+C
+ WRITE(KNT,'(1H ,//)')
+ WRITE(KNT,'(1H ,A)') ' DATA DESCRIPTORS (UNEXPANDED)'
+C
+ WRITE(KNT,'(1H )')
+ DO 110 I=1,KTDLEN
+ WRITE(KNT,'(1H ,I4,2X,I6.6)') I,KTDLST(I)
+ 110 CONTINUE
+C
+ WRITE(KNT,'(1H ,/)')
+ WRITE(KNT,'(1H ,A)') ' DATA DESCRIPTORS (EXPANDED)'
+ WRITE(KNT,'(1H )')
+ DO 120 I=1,KTDEXL
+ WRITE(KNT,'(1H ,I5,2X,I6.6,2X,A)') I,KTDEXP(I),CNAMES(I)
+ 120 CONTINUE
+
+ RETURN
+ END
diff --git a/bufrdc/bbuprt.F b/bufrdc/bbuprt.F
new file mode 100755
index 0000000..efd0766
--- /dev/null
+++ b/bufrdc/bbuprt.F
@@ -0,0 +1,420 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BBUPRT(KNT,K,KSUB1,KSUB2,KELEM,CNAMES,CUNITS,
+ 1 CVALS,KVALS,VALUES,KSUP,KSEC1,KERR)
+C
+C**** *BUPRT*
+C
+C
+C PURPOSE.
+C --------
+C PRINT EXPANDED BUFR MESSAG.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUPRT(KNT,K,KSUB1,KSUB2,KELEM,CNAMES,CUNITS,
+C CVALS,KVALS,VALUES,KSUP,KSEC1,KERR)*
+C
+C INPUT :
+C *KNT* - UNIT NUMBER FOR IO
+C *K* - SWITCH TO PRINT WITH/WITOUT CONTENT OF CODE TABLES
+C 0 - NO CODE TABLE CONTENT
+C 1 - YES CODE TABLE CONTENT
+C *KSUB1* - STARTING SUBSET
+C *KSUB2* - ENDING SUBSET
+C *KELEM* - DIMENSION OF CNAMES, CUNITS ARRAY
+C *CNAMES* - CHARACTER ARRAY CONTAINING ELEMENT NAMES
+C *CUNITS* - CHARACTER ARRAY CONTAINIG UNITS
+C *CVALS* - CHARACTER ARRAY CONTAINING BUFR CODE TABLE
+C ENTRIES
+C *KVALS* - DIMENSION OF VALUES ARRAY
+C *VALUES* - REAL ARRAY (EXPANDED DATA VALUES)
+C *KSUP* - ARRAY CONTAINING SUPLEMENTARY INFORMATION
+C - KSUP( 1) -- IDIM1, DIMENSION OF KSEC1
+C - KSUP( 2) -- IDIM2, DIMENSION OF KSEC2
+C - KSUP( 3) -- IDIM3, DIMENSION OF KSEC3
+C - KSUP( 4) -- IDIM4, DIMENSION OF KSEC4
+C - KSUP( 5) -- M (NUMBER OF ELEMENTS IN VALUES ARRAY,
+C FIRST INDEX)
+C - KSUP( 6) -- N (NUMBER OF SUBSETS,SECOND INDEX OF
+C VALUES ARRAY)
+C - KSUP( 7) -- JVC (NUMBER OF ELEMENTS IN CVAL ARRAY)
+C - KSUP( 8) -- TOTAL BUFR MESSAGE LENGTH IN BYTES
+C - KSUP( 9) -- IDIM0, DIMENSION OF KSEC0
+C *KSEC1* - ARRAY CONTAINING SECTION 1 INFORMATION
+C KSEC1( 1)-- LENGTH OF SECTION 1 (BYTES)
+C KSEC1( 2)-- BUFR EDITION NUMBER
+C KSEC1( 3)-- ORIGINATING CENTRE
+C KSEC1( 4)-- UPDATE SEQUENCE NUMBER
+C KSEC1( 5)-- FLAG (PRESENCE OF SECTION 2)
+C KSEC1( 6)-- BUFR MESSAGE TYPE
+C KSEC1( 7)-- BUFR MESSAGE SUBTYPE
+C KSEC1( 8)-- VERSION NUMBER OF LOCAL TABLE USED
+C KSEC1( 9)-- YEAR
+C KSEC1(10)-- MONTH
+C KSEC1(11)-- DAY
+C KSEC1(12)-- HOUR
+C KSEC1(13)-- MINUTE
+C KSEC1(14)-- BUFR MASTER TABLE
+C KSEC1(15)-- VERSION NUMBER OF MASTER TABLE USED
+C KSEC1(16) - KSEC1(JSEC1) -- LOCAL ADP CENTRE
+C INFORMATION(BYTE BY BYTE)
+C
+C FOR BUFR EDITION 3 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- NOT USED
+C KSEC1(18) TO KSEC1(JSEC1) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 4 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- INTERNATIONAL SUB-CATEGORY (SEE COMMON TABLE C-13
+C KSEC1(18)-- SECOND
+C KSEC1(19)-- YEAR
+C KSEC1(20)-- MONTH
+C KSEC1(21)-- DAY
+C KSEC1(22)-- HOUR
+C KSEC1(23)-- MINUTE
+C KSEC1(24)-- SECOND
+C KSEC1(25)-- YEAR
+C KSEC1(26)-- MONTH
+C KSEC1(27)-- DAY
+C KSEC1(28)-- HOUR
+C KSEC1(29)-- MINUTE
+C KSEC1(30)-- SECOND
+C KSEC1(31)-- MOST SOUTHERN LATITUDE (-90 to 90)
+C KSEC1(32)-- MOST WESTERN LONGITUDE ( 0-360)
+C KSEC1(33)-- MOST NORTHEN LATITUDE (-90 to 90)
+C KSEC1(34)-- MOST EASTERN LONGITUDE ( 0-360)
+C KSEC1(35) TO KSEC1(JSEC1) - LOCAL ADP CENTRE INFORMATION(PACKED FORM)
+C
+C OUTPUT:
+C *KERR* - RETURNED ERROR CODE
+C
+C
+C
+C
+C METHOD.
+C -------
+C
+C NONE
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 04/02/91.
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+C
+# include "bcomwork.F"
+C
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+ CHARACTER*80 CVALS(KVALS)
+ CHARACTER YCHAR*30,YLONG*320
+C
+ DIMENSION KSUP(JSUP),KSEC1(JSEC1)
+#ifndef R_4
+ REAL*8 VALUES(KVALS)
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL VALUES(KVALS)
+ REAL RVIND
+ REAL EPS
+#endif
+C
+C
+C ------------------------------------------------------------------
+C
+C* 1. PRINT BUFR MESSAGE.
+C -------------------
+ 100 CONTINUE
+C
+ KERR=0
+C
+ ISUB1=KSUB1
+ ISUB2=KSUB2
+ IF(ISUB1.LE.0.OR.ISUB2.LE.0) THEN
+ WRITE(KNT,'(A)') ' WARNING - NEGATIVE KSUB1 OR KSUB2.'
+ WRITE(KNT,'(A,I5)') ' WARNING - NUMBER OF SUBSETS IS ',KSUP(6)
+ RETURN
+ END IF
+ IF(ISUB1.GT.KSUP(6)) THEN
+ WRITE(KNT,'(A,I5)') ' WARNING - NUMBER OF SUBSETS IS ',KSUP(6)
+ RETURN
+ END IF
+ IF(ISUB2.GT.KSUP(6)) THEN
+ ISUB2=KSUP(6)
+ WRITE(KNT,'(A,I5)') ' WARNING - KSUB2 REPLACED BY ',KSUP(6)
+ END IF
+C
+ JQCP1= 0
+C
+ IF(K.EQ.0) THEN
+ JQPR=0
+ JQUA=0
+ JQC=0
+C DO 171 J171=1,KSUP(5)
+C IF(CNAMES(J171)(1:8).EQ.'DATA PRE') THEN
+C JQPR=J171
+C GO TO 172
+C END IF
+C 171 CONTINUE
+C 172 DO 173 J173=1,KSUP(5)
+C IF(CNAMES(J173)(1:9).EQ.'QUALITY I') JQUA=J173
+C 173 CONTINUE
+C DO 174 J174=1,KSUP(5)
+C IF(CNAMES(J174)(1:3).EQ.'% C') THEN
+C JQC =J174
+C GO TO 175
+C END IF
+C 174 CONTINUE
+C
+C 175 CONTINUE
+C
+C WRITE(KNT,'(1H1)')
+C
+C WRITE(KNT,'(1H ,A)') 'EXPANDED BUFR MESSAGE '
+C WRITE(KNT,'(1H ,//)')
+C WRITE(KNT,'(1H ,A,I6)') 'BUFR MESSAGE DATA TYPE ',KSEC1(6)
+C WRITE(KNT,'(1H ,A,I6)') 'RDB DATA SUBTYPE ',KSEC1(7)
+C WRITE(KNT,'(1H ,A,I6)') 'TOTAL BUFR LENGTH (BYTES) ',KSUP(8)
+C
+ NTYPE=KSEC1(7)
+ IF(JQUA.EQ.0) THEN !IF(JQUA.NE.0) THEN
+ JQUA=KSUP(5)
+C
+ DO 103 JB=ISUB1,ISUB2
+C
+ ILN=0
+ WRITE(KNT,'(1H )')
+C
+ DO 104 JA=1,JQUA
+C
+ ILN=ILN+1
+ JAJB=JA+(JB-1)*KELEM
+C
+ IF(ABS(VALUES(JAJB)-RVIND)/RVIND.LT.EPS) THEN
+ WRITE(KNT,9918) ILN,CNAMES(JA),CUNITS(JA)
+ ELSE
+ IF(CUNITS(JA)(1:4).EQ.'CCIT') THEN
+ I=NINT(VALUES(JAJB)/1000)
+ NCHAR=VALUES(JAJB)-I*1000
+ NW=NCHAR/80
+ NWOFF=NCHAR-NW*80
+ IF(NWOFF.NE.0) NW=NW+1
+C
+ YLONG=' '
+ YLONG(1:80)=CVALS(I)
+C
+ II=I
+ DO 125 JC=1,NW-1
+ II=II+1
+ KF=JC*80+1
+ KL=(JC+1)*80
+ YLONG(KF:KL)=CVALS(II)
+ 125 CONTINUE
+C
+ NLINE=NCHAR/30
+ IDIF =NCHAR-NLINE*30
+ IF(IDIF.NE.0) NLINE=NLINE+1
+ YCHAR=' '
+ YCHAR=YLONG(1:30)
+C
+ WRITE(KNT,9919)ILN,CNAMES(JA),VALUES(JAJB),
+ 1 CUNITS(JA),YCHAR
+C
+ IF(NLINE.GT.1) THEN
+ DO 130 JJ=1,NLINE-1
+C
+ K2=JJ*30+1
+ K1=(JJ+1)*30
+ YCHAR=' '
+ YCHAR=YLONG(K2:K1)
+C
+ WRITE(KNT,9920) YCHAR
+ 130 CONTINUE
+C
+ END IF
+ ELSE
+ WRITE(KNT,9917) ILN,CNAMES(JA),VALUES(JAJB),
+ 1 CUNITS(JA)
+ END IF
+ END IF
+C
+ 104 CONTINUE
+ 103 CONTINUE
+C
+ ELSE
+ JQPRM1=JQPR-1
+ JQC=JQC-1
+C
+ DO 101 JB=ISUB1,ISUB2
+C
+ ILN=0
+ JQCP1=0
+C
+ WRITE(KNT,'(1H )')
+C
+ DO 102 JA=1,JQUA-1
+C
+ ILN=ILN+1
+ JAJB=JA+(JB-1)*KELEM
+ JQPJB=JQPRM1+JA+(JB-1)*KELEM
+C
+ IF(VALUES(JQPJB).EQ.0.0) THEN
+ JQCP1=JQCP1+1
+ JQCPP1=JQC+JQCP1+(JB-1)*KELEM
+ IF(ABS(VALUES(JAJB)-RVIND)/RVIND.LT.EPS) THEN
+ WRITE(KNT,9918) ILN,CNAMES(JA),CUNITS(JA)
+ ELSE
+ WRITE(KNT,9916) ILN,CNAMES(JA),VALUES(JAJB),
+ 1 CUNITS(JA),
+ 1 CNAMES(JQC+JQCP1),VALUES(JQCPP1),
+ 1 CUNITS(JQC+JQCP1)
+ END IF
+ ELSE
+ IF(ABS(VALUES(JAJB)-RVIND)/RVIND.LT.EPS) THEN
+ WRITE(KNT,9918) ILN,CNAMES(JA),CUNITS(JA)
+ IF(NTYPE.EQ.5.OR.NTYPE.EQ.3) JQCP1=JQCP1+1
+ ELSE
+ WRITE(KNT,9917) ILN,CNAMES(JA),VALUES(JAJB),
+ 1 CUNITS(JA)
+ IF(NTYPE.EQ.5.OR.NTYPE.EQ.3) JQCP1=JQCP1+1
+ END IF
+ END IF
+C
+C
+ 102 CONTINUE
+ 101 CONTINUE
+C
+ END IF
+ END IF
+C
+ IF(K.EQ.1) THEN
+C
+C---------------------------------------------------------------------
+ WRITE(KNT,'(1H1)')
+C
+ WRITE(KNT,'(1H ,A)') 'WARNING : PRINTING CONTENT OF CODE'//
+ 1 ' TABLES NOT YET IMPLEMENTED.'
+ RETURN
+C---------------------------------------------------------------------
+C
+C WRITE(KNT,'(1H ,A)') 'EXPANDED BUFR MESSAGE '
+C WRITE(KNT,'(1H ,//)')
+C WRITE(KNT,'(1H ,A,I6)') 'RDB DATA TYPE ',KSEC1(6)
+C WRITE(KNT,'(1H ,A,I6)') 'RDB DATA SUBTYPE ',KSEC1(7)
+C WRITE(KNT,'(1H ,A,I6)') 'TOTAL BUFR LENGTH (BYTES) ',KSUP(8)
+C
+C DO 150 JB=1,KSUP(6)
+C
+C WRITE(KNT,'(1H )')
+C
+C DO 160 JA=1,KSUP(5)
+C
+C JAJB=JA+(JB-1)*KELEM
+C
+C IF(ABS(VALUES(JAJB)-RVIND)/RVIND.LT.EPS) THEN
+C WRITE(KNT,9903) CNAMES(JA)(1:32),CUNITS(JA)
+C WRITE(KNT,9903) CNAMES(JA)(33:64)
+C ELSE
+C IF(CUNITS(JA)(1:10).EQ.'CODE TABLE'.OR.
+C 1 CUNITS(JA)(1:9) .EQ.'CCITTIA5' ) THEN
+C I=NINT(VALUES(JAJB)/1000)
+C NCHAR=VALUES(JAJB)-I*1000
+C NW=NCHAR/80
+C NWOFF=NCHAR-NW*80
+C IF(NWOFF.NE.0) NW=NW+1
+CC
+C YLONG(1:80)=CVALS(I)
+C
+C II=I
+C DO 165 JC=1,NW-1
+C II=II+1
+C KF=JC*80+1
+C KL=(JC+1)*80
+C YLONG(KF:KL)=CVALS(II)
+C 165 CONTINUE
+C
+C NLINE=NCHAR/30
+C IDIF =NCHAR-NLINE*30
+C IF(IDIF.NE.0) NLINE=NLINE+1
+C YCHAR=YLONG(1:30)
+C
+C WRITE(KNT,9904)CNAMES(JA)(1:32),VALUES(JAJB),
+C 1 CUNITS(JA),YCHAR
+C WRITE(KNT,9904)CNAMES(JA)(33:64)
+C
+C IF(NLINE.GT.1) THEN
+C DO 170 JJ=1,NLINE-1
+C
+C K2=JJ*30+1
+C K1=(JJ+1)*30
+C YCHAR=YLONG(K2:K1)
+C
+C WRITE(KNT,9905) YCHAR
+C 170 CONTINUE
+C
+C END IF
+C ELSE
+C WRITE(KNT,9906) CNAMES(JA)(1:32),VALUES(JAJB),
+C 1 CUNITS(JA)
+C WRITE(KNT,9906) CNAMES(JA)(33:64)
+C END IF
+C END IF
+C
+C 160 CONTINUE
+C 150 CONTINUE
+C
+ END IF
+C
+C
+C RETURN
+C
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C ------------------------------------------------------------------
+ 9903 FORMAT(1H ,A,' MISSING',2X,A)
+ 9904 FORMAT(1H ,A,E20.10,2X,A,2X,A)
+ 9905 FORMAT(1H ,100X,A)
+ 9906 FORMAT(1H ,I5,1X,A,E14.10,2X,A)
+ 9916 FORMAT(1H ,I5,1X,A15,1X,E20.10,1X,A20,1X,A15,1X,F3.0,1X,A15)
+ 9917 FORMAT(1H ,I5,1X,A15,1X,E20.10,1X,A24)
+ 9918 FORMAT(1H ,I5,1X,A15,1X,' MISSING',1X,A24)
+ 9919 FORMAT(1H ,I5,1X,A15,1X,E20.10,1X,A24,1X,A)
+ 9920 FORMAT(1H ,62X,A)
+ END
diff --git a/bufrdc/bbuprtbox.F b/bufrdc/bbuprtbox.F
new file mode 100755
index 0000000..719ef58
--- /dev/null
+++ b/bufrdc/bbuprtbox.F
@@ -0,0 +1,141 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BBUPRTBOX(KNT,KBOX,KAPP,KLEN,KBOXR,VALS,CBOXN,CBOXU)
+C
+C**** *BUPRTBOX*
+C
+C
+C PURPOSE.
+C --------
+C
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUPRTBOX(KNT,KBOX,KAPP,KLEN,KBOXR,VALS,CBOXN,CBOXU)*
+C
+C INPUT :
+C *KNT* - UNIT NUMBER FOR IO
+C *KBOX* - NUMBER OF ROWS
+C *KAPP* - NUMBER OF COLUMNS
+C *KLEN* - OFFSET FOR START OF NEXT COLUMN
+C *KBOXR* - ARRAY CONTAINING BUFR TABLE B REFERENCE NUMBERS
+C *VALS* - ARRAY CONTAINING UNPACKED VALUES
+C *CBOXN* - ARRAY CONTAINING ELEMENT NAMES
+C *CBOXU* - ARRAY CONTAINING ELEMENT UNITS
+C
+C METHOD.
+C -------
+C
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/94.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H,Y)
+C
+ PARAMETER(JELEM=160000)
+ DIMENSION IOPER(100)
+ DIMENSION KBOXR(360000),IBVAL(JELEM),IBPRINT(60)
+#ifndef R_4
+ REAL*8 RPRINT(60)
+ REAL*8 VALS(360000)
+#else
+ REAL RPRINT(60)
+ REAL VALS(360000)
+#endif
+ CHARACTER*64 CBOXN(40000)
+ CHARACTER*24 CBOXU(40000)
+C
+C
+C ------------------------------------------------------------------
+C* 1. PRINT BOXED EXPANDED BUFR MESSAGE
+C ---------------------------------
+ 100 CONTINUE
+C
+ IF(KBOX.LE.6) THEN
+ WRITE(KNT,'(A)') 'THERE IS NO USEFULL DATA TO BE PRINTED.'
+ KBOX=0
+ RETURN
+ END IF
+C
+ IF(KAPP.GT.60) THEN
+ WRITE(KNT,'(A)') 'THERE IS MORE THAN 60 APPLICATIONS IN ',
+ 1 'THE DATA'
+ WRITE(KNT,'(A)') 'ONLY FIRST 60 WILL BE PROCESSED'
+ KAPP=60
+ END IF
+C
+ IF(KAPP.GT.1) THEN
+ IREP=(KAPP-1)/10
+ IOFF=(KAPP-1)-IREP*10
+ IF(IOFF.NE.0) IREP=IREP+1
+ ELSE
+ IREP=1
+ IOFF=0
+ END IF
+C
+ IST=2
+ IEND=11
+C IF(IREP.EQ.1.AND.KAPP.EQ.1) IEND=IOFF+1
+ IF(IREP.EQ.1 .AND. IOFF .EQ.0) IEND=11
+C
+ DO 2005 J=1,IREP
+C
+ WRITE(KNT,'(A)')' '
+ DO 2002 I=1,KBOX
+ IIII=1
+ RPRINT(IIII)=VALS(I)
+C
+ DO 2003 II=IST,IEND
+ IIII=IIII+1
+ III=I+(II-1)*KLEN
+ RPRINT(IIII)=VALS(III)
+ IBPRINT(IIII)=KBOXR(III)
+ 2003 CONTINUE
+C WRITE(KNT,'(1H ,I4,1X,A32,1X,15(1X,I6,1X,F8.1))')
+C 1 I,CBOXN(I),(IBPRINT(NN),RPRINT(NN),NN=1,KAPP)
+ WRITE(KNT,'(1H ,I4,1X,A32,1X,F14.1,30(1X,F8.1))')
+ 1 I,CBOXN(I),(RPRINT(NN),NN=1,IIII)
+ 2002 CONTINUE
+C
+ IF(IOFF.NE.0.AND.J.EQ.(IREP-1)) THEN
+ IST=IEND+1
+ IEND=IEND+IOFF
+ ELSE
+ IST=IEND+1
+ IEND=IEND+10
+ END IF
+C
+ 2005 CONTINUE
+C
+C
+ RETURN
+ END
diff --git a/bufrdc/bcmatb.F b/bufrdc/bcmatb.F
new file mode 100755
index 0000000..0687390
--- /dev/null
+++ b/bufrdc/bcmatb.F
@@ -0,0 +1,20 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCMATB/ NJA,NATBTR(JTAB),NATBS (JTAB),
+ 1 NATBRV(JTAB),NATBDW(JTAB)
+C
+C
+C NATBTR - AUGMENTED TABLE B TABLE REFERENCE
+C NATBS - AUGMENTED TABLE B SCALE
+C NATBRV - AUGMENTED TABLE B REFERENCE VALUE
+C NATBDW - AUGMENTED TABLE B DATA WIDTH
+C
diff --git a/bufrdc/bcmatbc.F b/bufrdc/bcmatbc.F
new file mode 100755
index 0000000..2c7be61
--- /dev/null
+++ b/bufrdc/bcmatbc.F
@@ -0,0 +1,17 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCMATBC/ CATBEN(JTAB),CATBU (JTAB)
+C
+C CATBEN - AUGMENTED TABLE B ELEMENT NAME
+C CATBU - AUGMENTED TABLE B UNITS
+C
+
diff --git a/bufrdc/bcmbef.F b/bufrdc/bcmbef.F
new file mode 100755
index 0000000..92e0b87
--- /dev/null
+++ b/bufrdc/bcmbef.F
@@ -0,0 +1,19 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCMBEF / M,MM,N,JCV
+C
+C M - NUMBER OF ELEMENTS
+C MM - NUMBER OF ELEMENTS
+C N - NUMBER OF DATA SUB_SETS
+C JCV - NUMBER OF CHARACTER VALUES
+C
+
diff --git a/bufrdc/bcmct.F b/bufrdc/bcmct.F
new file mode 100755
index 0000000..18a6c01
--- /dev/null
+++ b/bufrdc/bcmct.F
@@ -0,0 +1,23 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCMCT/ NREF(JCTAB) ,NSTART(JCTAB) ,NLEN(JCTAB),
+ 1 NCODNUM(JCTST),NSTARTC(JCTST),
+ 2 NLENC(JCTST)
+C
+C NREF - TABLE C REFERENCE
+C NSTART - STARTING POINTERS TO ARRAY NCODNUM
+C NLEN - LENGTHS
+C NCODNUM - CODE/FLAG TABLE NUMBER
+C NSTARTC - STARTING POINTERS TO ARRAY CTEXT
+C NLENC - LENGTHS
+C
+
diff --git a/bufrdc/bcmctc.F b/bufrdc/bcmctc.F
new file mode 100755
index 0000000..8f61404
--- /dev/null
+++ b/bufrdc/bcmctc.F
@@ -0,0 +1,17 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+C
+ COMMON /BCMCTC/ CTEXT(JCTEXT)
+C
+C CTEXT - TEXT IN CODE/FLAG TABLES
+C
+
diff --git a/bufrdc/bcmdefc.F b/bufrdc/bcmdefc.F
new file mode 100755
index 0000000..0db7eed
--- /dev/null
+++ b/bufrdc/bcmdefc.F
@@ -0,0 +1,15 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCMDEFC/ CECMWF,CUSER
+C
+C CECMWF - CHARACTER STRING TO CONTROL DEFAULT SET UP
+C CUSER
diff --git a/bufrdc/bcmel.F b/bufrdc/bcmel.F
new file mode 100755
index 0000000..bf6d3db
--- /dev/null
+++ b/bufrdc/bcmel.F
@@ -0,0 +1,19 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCMEL/ NTDLEN,NTDLST(JELEM),NTDEXL,NTDEXP(JELEM)
+C
+C NTDLEN - NUMBER OF DATA DESCRIPTORS IN SECTION 3
+C NTDLST - LIST OF DATA DESCRIPTORS
+C NTDEXL - NUMBER OF EXPANDED DATA DESCRIPTORS
+C NTDEXP - LIST OF EXPANDED DATA DESCRIPTORS
+C
+
diff --git a/bufrdc/bcmoff.F b/bufrdc/bcmoff.F
new file mode 100755
index 0000000..89bcbc1
--- /dev/null
+++ b/bufrdc/bcmoff.F
@@ -0,0 +1,13 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCMOFF/ NWP,NBP,NSUBSET,OMULTI
+
diff --git a/bufrdc/bcmroot.F b/bufrdc/bcmroot.F
new file mode 100755
index 0000000..0fd096d
--- /dev/null
+++ b/bufrdc/bcmroot.F
@@ -0,0 +1,16 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ COMMON /BCMROOT/ CROOT,OPRINT
+C
+C CROOT - PATH FOR BUFR TABLES
+C OPRINT - LOGICAL SWITCH TO PRINT TABLE NAMES
+C
+
diff --git a/bufrdc/bcmrq.F b/bufrdc/bcmrq.F
new file mode 100755
index 0000000..48f1c14
--- /dev/null
+++ b/bufrdc/bcmrq.F
@@ -0,0 +1,19 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCMRQ/ NWORDP(JWORK),NBITP(JWORK)
+C
+C NWORDP - ARRAY CONTAINING WORD POINTERS TO
+C REQUESTED ELEMENTS
+C NBITP - ARRAY CONTAINING BIT POINTERS TO
+C REQUESTED ELEMENTS
+C
+
diff --git a/bufrdc/bcmtab.F b/bufrdc/bcmtab.F
new file mode 100755
index 0000000..702fe82
--- /dev/null
+++ b/bufrdc/bcmtab.F
@@ -0,0 +1,25 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCMTAB/ NTABBTR(JTAB),NTABBS (JTAB),NTABBRV(JTAB),
+ 1 NTABBDW(JTAB),NTABDTR(JTAB),NTABDST(JTAB),
+ 2 NTABDL (JTAB),NTABDSQ(JTAB*20),NTABP(64,256)
+C
+C NTABBTR - TABLE B, TABLE REFERENCE ARRAY
+C NTABBS - TABLE B, SCALE ARRAY
+C NTABBRF - TABLE B, REFERENCE VALUE ARRAY
+C NTABBDW - TABLE B, DATA WIDTH ARRAY
+C NTABDTR - TABLE D, TABLE REFERENCE ARRAY
+C NTABDST - TABLE D, STARTING POINTERS ARRAY
+C NTABDL - TABLE D, LENGTHS ARRAY
+C NTABDSQ - TABLE D, LIST OF SEQUENCE DESCRIPTORS ARRAY
+C
+
diff --git a/bufrdc/bcmtabc.F b/bufrdc/bcmtabc.F
new file mode 100755
index 0000000..13c7cfc
--- /dev/null
+++ b/bufrdc/bcmtabc.F
@@ -0,0 +1,17 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCMTABC / CTABBEN(JTAB),CTABBU (JTAB)
+C
+C CTABBEN - TABLE B, ELEMENT NAME ARRAY
+C CTABBU - TABLE B, UNIT ARRAY
+C
+
diff --git a/bufrdc/bcmtabload.F b/bufrdc/bcmtabload.F
new file mode 100755
index 0000000..f037075
--- /dev/null
+++ b/bufrdc/bcmtabload.F
@@ -0,0 +1,30 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C
+ COMMON /BCMTABLOAD/ MTABBTR(JTAB,JTMAX),MTABBS (JTAB,JTMAX),
+ 1 MTABBRV(JTAB,JTMAX),
+ 1 MTABBDW(JTAB,JTMAX),MTABDTR(JTAB,JTMAX),
+ 2 MTABDST(JTAB,JTMAX),
+ 2 MTABDL (JTAB,JTMAX),MTABDSQ(JTAB*20,JTMAX),
+ 2 MTABP(JTCLAS,JTEL,JTMAX), NTC,NTT
+C
+C MTABBTR - TABLE B, TABLE REFERENCE ARRAY
+C MTABBS - TABLE B, SCALE ARRAY
+C MTABBRF - TABLE B, REFERENCE VALUE ARRAY
+C MTABBDW - TABLE B, DATA WIDTH ARRAY
+C MTABDTR - TABLE D, TABLE REFERENCE ARRAY
+C MTABDST - TABLE D, STARTING POINTERS ARRAY
+C MTABDL - TABLE D, LENGTHS ARRAY
+C MTABDSQ - TABLE D, LIST OF SEQUENCE DESCRIPTORS ARRAY
+C NTT - NUMBER OF TABLES
+C NTC - CURRENT TABLE
+C
+C
+
diff --git a/bufrdc/bcmtabloadc.F b/bufrdc/bcmtabloadc.F
new file mode 100755
index 0000000..e01316f
--- /dev/null
+++ b/bufrdc/bcmtabloadc.F
@@ -0,0 +1,18 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C
+ COMMON /BCMTABLOADC / CCTABBEN(JTAB,JTMAX),CCTABBU (JTAB,JTMAX),
+ 1 CTABLE_LIST(JTMAX)
+C
+C CTABBEN - TABLE B, ELEMENT NAME ARRAY
+C CTABBU - TABLE B, UNIT ARRAY
+C CTABLE_LIST - LIST OF TABLES ARRAY
+C
+
diff --git a/bufrdc/bcmwork.F b/bufrdc/bcmwork.F
new file mode 100755
index 0000000..6f61f8d
--- /dev/null
+++ b/bufrdc/bcmwork.F
@@ -0,0 +1,29 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ COMMON /BCMWORK/ RVIND,EPS,NBPW,NWPT,NBPT,NWPTB,NBPTB,NMASK(JBPW)
+ 1, NVIND,NBENP,NLTVNP,NWWP,NXXP,NYYP
+ 2, NZZP,NSSP,NEDN
+C
+C NBPW - NUMBER OF BITS PER COMPUTER WORD
+C NWPT - WORD POINTER
+C NBPT - BIT POINTER
+C NWPTB - POINTER TO WORD AT THE BEGINING OF NEXT SECTION
+C NBPTB - POINTER TO BIT AT THE BEGINING OF NEXT SECTION
+C NMASK - BIT MASK ARRAY
+C NVIND - MISSING VALUE INDICATOR (INTEGER)
+C RVIND - MISSING VALUE INDICATOR (REAL)
+C NBENP - PREVIOUS BUFR EDITION NUMBER
+C NLTVNP - PREVIOUS LOCAL TABLE VERSION NUMBER
+C NXXP - BUFR MASTER TABLE USED
+C NYYP - VERSION NUMBER OF MASTER TABLE USED
+C NZZP - VERSION NUMBER OF LOCAL TABLE USED
+C NEDN - BUFR EDITION
+
diff --git a/bufrdc/bcmwt.F b/bufrdc/bcmwt.F
new file mode 100755
index 0000000..5307541
--- /dev/null
+++ b/bufrdc/bcmwt.F
@@ -0,0 +1,36 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCMWT/ NDWINC,NSCAM,NAFDW,NWT ,ODREPF,N40,N07,N08,
+ 1 NDWINC07,NSCAM07,NAFDWA(100),NFD,NREP,OREP,
+ 1 N221,MREL,NFCM,NFUCM,MBMP,OMARKER,
+ 2 MBMPL,NSTACK(JELEM),NWTEN(JELEM),
+ 3 NWTR (JELEM),NWTS (JELEM),NWTRV (JELEM),
+ 4 NWTDW(JELEM),NWTIW(JELEM),NWTIWS(JELEM)
+C
+C NDWINC - DATA WIDTH INCREMENT
+C NSCAM - SCALE MULTIPLIER
+C NAFDW - AUGMENTED FIELD DATA WIDTH
+C NWT - POINTER TO WORKING TABLE
+C NSTACK - LIST OF DATA DESCRIPTORS
+C ODREPF - REPLICATION (LOGICAL)
+C N221 - DATA NOT PRESENT FOR N221 ELEMENTS
+C MREL - POINTER TO THE LAST DATA ELEMENT
+C NFCM - FIRST COMPRESSED MESSAGE
+C MBMP - POINTER TO THE BEGINING OF BIT MAP
+C NWTR - WORKING TABLE REFERENCE
+C NWTS - WORKING SCALE
+C NWTRV - WORKING REFERENCE VALUE
+C NWTDW - WORKING DATA WIDTH
+C NWTIW - WORKING DATA WIDTH OF INCREMENTS
+C NWTIWS - WORKING TOTAL DATA WIDTH OF ELEMENT SET
+C
+
diff --git a/bufrdc/bcmwtc.F b/bufrdc/bcmwtc.F
new file mode 100755
index 0000000..48ee66e
--- /dev/null
+++ b/bufrdc/bcmwtc.F
@@ -0,0 +1,17 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCMWTC/ CWTEN(JELEM),CWTU (JELEM)
+C
+C CWTEN - WORKING TABLE ELEMENT NAAME
+C CWTU - WORKING TABLE UNITS
+C
+
diff --git a/bufrdc/bcomatb.F b/bufrdc/bcomatb.F
new file mode 100755
index 0000000..99d9c59
--- /dev/null
+++ b/bufrdc/bcomatb.F
@@ -0,0 +1,21 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCOMATB/ NJA,NATBTR(JTAB),NATBS (JTAB),
+ 1 NATBRV(JTAB),NATBDW(JTAB)
+C
+C
+C NATBTR - AUGMENTED TABLE B TABLE REFERENCE
+C NATBS - AUGMENTED TABLE B SCALE
+C NATBRV - AUGMENTED TABLE B REFERENCE VALUE
+C NATBDW - AUGMENTED TABLE B DATA WIDTH
+C
+
diff --git a/bufrdc/bcomatbc.F b/bufrdc/bcomatbc.F
new file mode 100755
index 0000000..4ad3861
--- /dev/null
+++ b/bufrdc/bcomatbc.F
@@ -0,0 +1,16 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCOMATBC/ CATBEN(JTAB),CATBU (JTAB)
+C
+C CATBEN - AUGMENTED TABLE B ELEMENT NAME
+C CATBU - AUGMENTED TABLE B UNITS
+
diff --git a/bufrdc/bcombef.F b/bufrdc/bcombef.F
new file mode 100755
index 0000000..a217805
--- /dev/null
+++ b/bufrdc/bcombef.F
@@ -0,0 +1,19 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCOMBEF / M,MM,N,JCV
+C
+C M - NUMBER OF ELEMENTS
+C MM - NUMBER OF ELEMENTS
+C N - NUMBER OF DATA SUB_SETS
+C JCV - NUMBER OF CHARACTER VALUES
+C
+
diff --git a/bufrdc/bcomcom.F b/bufrdc/bcomcom.F
new file mode 100755
index 0000000..464010c
--- /dev/null
+++ b/bufrdc/bcomcom.F
@@ -0,0 +1,13 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCOMCOM/ ICOMP
+
diff --git a/bufrdc/bcomct.F b/bufrdc/bcomct.F
new file mode 100755
index 0000000..8337492
--- /dev/null
+++ b/bufrdc/bcomct.F
@@ -0,0 +1,23 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCOMCT/ NREF(JCTAB) ,NSTART(JCTAB) ,NLEN(JCTAB),
+ 1 NCODNUM(JCTST),NSTARTC(JCTST),
+ 2 NLENC(JCTST)
+C
+C NREF - TABLE C REFERENCE
+C NSTART - STARTING POINTERS TO ARRAY NCODNUM
+C NLEN - LENGTHS
+C NCODNUM - CODE/FLAG TABLE NUMBER
+C NSTARTC - STARTING POINTERS TO ARRAY CTEXT
+C NLENC - LENGTHS
+C
+
diff --git a/bufrdc/bcomctc.F b/bufrdc/bcomctc.F
new file mode 100755
index 0000000..c3c5046
--- /dev/null
+++ b/bufrdc/bcomctc.F
@@ -0,0 +1,17 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+C
+ COMMON /BCOMCTC/ CTEXT(JCTEXT)
+C
+C CTEXT - TEXT IN CODE/FLAG TABLES
+C
+
diff --git a/bufrdc/bcomdefc.F b/bufrdc/bcomdefc.F
new file mode 100755
index 0000000..607969b
--- /dev/null
+++ b/bufrdc/bcomdefc.F
@@ -0,0 +1,17 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCOMDEFC/ CECMWF,CUSER
+C
+C CECMWF - CHARACTER STRING TO CONTROL DEFAULT SET UP
+C CUSER - CHARACTER STRING TO CONTROL USER SET UP
+C
+
diff --git a/bufrdc/bcomel.F b/bufrdc/bcomel.F
new file mode 100755
index 0000000..e10197a
--- /dev/null
+++ b/bufrdc/bcomel.F
@@ -0,0 +1,18 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCOMEL/ NTDLEN,NTDLST(JELEM),NTDEXL,NTDEXP(JELEM)
+C
+C NTDLEN - NUMBER OF DATA DESCRIPTORS IN SECTION 3
+C NTDLST - LIST OF DATA DESCRIPTORS
+C NTDEXL - NUMBER OF EXPANDED DATA DESCRIPTORS
+C NTDEXP - LIST OF EXPANDED DATA DESCRIPTORS
+
diff --git a/bufrdc/bcomoff.F b/bufrdc/bcomoff.F
new file mode 100755
index 0000000..dbbdf99
--- /dev/null
+++ b/bufrdc/bcomoff.F
@@ -0,0 +1,14 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCOMOFF/ NSIZEG(JELEM),NSIZE(JELEM),NWTRG(JWORK),
+ 1 NWTDWG(JWORK),NWP,NBP,NSUBSET,OMULTI,OS4
+
diff --git a/bufrdc/bcomp.F b/bufrdc/bcomp.F
new file mode 100755
index 0000000..62d2fef
--- /dev/null
+++ b/bufrdc/bcomp.F
@@ -0,0 +1,20 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCOMP/ INWTEN(JELEM),INWTR (JELEM),INWTS (JELEM),
+ 1 INWTRV (JELEM),INWTDW(JELEM),
+ 2 INWORDP(JWORK),INBITP(JWORK)
+C INWTEN - WOKING TABLE
+C INWTR - WORKING TABLE REFERENCE
+C INWTS - WORKING SCALE
+C INWTRV - WORKING REFERENCE VALUE
+C INWTDW - WORKING DATA WIDTH
+
diff --git a/bufrdc/bcomreq.F b/bufrdc/bcomreq.F
new file mode 100755
index 0000000..e6577b8
--- /dev/null
+++ b/bufrdc/bcomreq.F
@@ -0,0 +1,34 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCOMREQ/ RQVAL(JELEM),NREQ(2),NRQ(JELEM),NRQL
+C
+C *NREQ* - FLAG
+C BIT NUMBER MEANING
+C
+C 1 - 0 NO BIT MAP DELIVERED TO USER
+C 1 BIT MAP DELIVERED TO USER
+C 2 - 0 NO PARTIAL EXPANSION
+C 1 PARTIAL EXPANSION
+C 3 - 0 NO Q/C REQUIRED
+C - 1 Q/C REQUIRED
+C 4 - 0 NO STATISTICS REQUIRED
+C - 1 STATISTICS
+C 5 - 0 NO DIFFRENCE STATISTICS
+C - 1 DIFFERENCE STATISTICS
+C 6 - 0 NO SUBSTITUTED VALUES
+C - 1 SUBSTITUTED VALUES
+C *NRQL* - NUMBER OF REQUESTED ELEMENTS
+C *NRQ* - LIST OF REQUESTED TABLE B REFERENCE
+C *RQVAL* - LIST OF VALUES SIGNIFYING REQUESTED ELEMENT
+C (SAY PRESSURE AT 50000 PA)
+C
+
diff --git a/bufrdc/bcomroot.F b/bufrdc/bcomroot.F
new file mode 100755
index 0000000..de1c6ba
--- /dev/null
+++ b/bufrdc/bcomroot.F
@@ -0,0 +1,17 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCOMROOT/ CROOT,OPRINT,OCTABLE
+C
+C CROOT - PATH FOR BUFR TABLES
+C OPRINT - LOGICAL SWITCH TO PRINT TABLE NAMES
+C OCTABLE - LOGICAL SWITCH TO USE CODE/FLAG TABLES
+C
diff --git a/bufrdc/bcomrq.F b/bufrdc/bcomrq.F
new file mode 100755
index 0000000..4d33300
--- /dev/null
+++ b/bufrdc/bcomrq.F
@@ -0,0 +1,19 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCOMRQ/ NWORDP(JWORK),NBITP(JWORK)
+C
+C NWORDP - ARRAY CONTAINING WORD POINTERS TO
+C REQUESTED ELEMENTS
+C NBITP - ARRAY CONTAINING BIT POINTERS TO
+C REQUESTED ELEMENTS
+C
+
diff --git a/bufrdc/bcomtab.F b/bufrdc/bcomtab.F
new file mode 100755
index 0000000..5851449
--- /dev/null
+++ b/bufrdc/bcomtab.F
@@ -0,0 +1,26 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCOMTAB/ NTABBTR(JTAB),NTABBS (JTAB),NTABBRV(JTAB),
+ 1 NTABBDW(JTAB),NTABDTR(JTAB),NTABDST(JTAB),
+ 2 NTABDL (JTAB),NTABDSQ(JTAB*20),NTABP(64,256)
+C
+C NTABBTR - TABLE B, TABLE REFERENCE ARRAY
+C NTABBS - TABLE B, SCALE ARRAY
+C NTABBRF - TABLE B, REFERENCE VALUE ARRAY
+C NTABBDW - TABLE B, DATA WIDTH ARRAY
+C NTABDTR - TABLE D, TABLE REFERENCE ARRAY
+C NTABDST - TABLE D, STARTING POINTERS ARRAY
+C NTABDL - TABLE D, LENGTHS ARRAY
+C NTABDSQ - TABLE D, LIST OF SEQUENCE DESCRIPTORS ARRAY
+C
+C
+
diff --git a/bufrdc/bcomtabc.F b/bufrdc/bcomtabc.F
new file mode 100755
index 0000000..13edb1a
--- /dev/null
+++ b/bufrdc/bcomtabc.F
@@ -0,0 +1,17 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCOMTABC / CTABBEN(JTAB),CTABBU (JTAB)
+C
+C CTABBEN - TABLE B, ELEMENT NAME ARRAY
+C CTABBU - TABLE B, UNIT ARRAY
+C
+
diff --git a/bufrdc/bcomtabload.F b/bufrdc/bcomtabload.F
new file mode 100755
index 0000000..fcdb816
--- /dev/null
+++ b/bufrdc/bcomtabload.F
@@ -0,0 +1,37 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C
+ COMMON /BCOMTABLOAD/ MTABBTR(JTAB,JTMAX),MTABBS (JTAB,JTMAX),
+ 1 MTABBRV(JTAB,JTMAX),
+ 1 MTABBDW(JTAB,JTMAX),MTABDTR(JTAB,JTMAX),
+ 2 MTABDST(JTAB,JTMAX),
+ 2 MTABDL (JTAB,JTMAX),MTABDSQ(JTAB*20,JTMAX),
+ 2 MTABP(JTCLAS,JTEL,JTMAX), NTC,NTT,
+ 3 MNREF(JCTAB,JTMAX),MNSTART(JCTAB,JTMAX),
+ 3 MNLEN(JCTAB,JTMAX),MNCODNUM(JCTST,JTMAX),
+ 3 MNSTARTC(JCTST,JTMAX),MNLENC(JCTST,JTMAX)
+C
+C MTABBTR - TABLE B, TABLE REFERENCE ARRAY
+C MTABBS - TABLE B, SCALE ARRAY
+C MTABBRF - TABLE B, REFERENCE VALUE ARRAY
+C MTABBDW - TABLE B, DATA WIDTH ARRAY
+C MTABDTR - TABLE D, TABLE REFERENCE ARRAY
+C MTABDST - TABLE D, STARTING POINTERS ARRAY
+C MTABDL - TABLE D, LENGTHS ARRAY
+C MTABDSQ - TABLE D, LIST OF SEQUENCE DESCRIPTORS ARRAY
+C NTT - NUMBER OF TABLES
+C NTC - CURRENT TABLE
+C MNREF - TABLE C REFERENCE NUMBER ARRAY
+C MNSTART - START OF CODES ARRAY
+C MNLEN - NUMBER OF CODES ARRAY
+C MNSTARTC - START OF TEXT ARRAY
+C MNLENC - NUMBER OF CODE STRINGS ARRAY
+C
+C
diff --git a/bufrdc/bcomtabloadc.F b/bufrdc/bcomtabloadc.F
new file mode 100755
index 0000000..c3f94cd
--- /dev/null
+++ b/bufrdc/bcomtabloadc.F
@@ -0,0 +1,19 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C
+C
+ COMMON /BCOMTABLOADC / CCTABBEN(JTAB,JTMAX),CCTABBU (JTAB,JTMAX),
+ 1 CTABLE_LIST(JTMAX),CCTEXT(JCTEXT,JTMAX)
+C
+C CTABBEN - TABLE B, ELEMENT NAME ARRAY
+C CTABBU - TABLE B, UNIT ARRAY
+C CTABLE_LIST - LIST OF TABLES ARRAY
+C CCTEXT - CODE/FLAG TABLES TEXT ARRAY
+C
diff --git a/bufrdc/bcomunit.F b/bufrdc/bcomunit.F
new file mode 100755
index 0000000..de1e81d
--- /dev/null
+++ b/bufrdc/bcomunit.F
@@ -0,0 +1,11 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ COMMON /BCOMUNIT/ KNTN
diff --git a/bufrdc/bcomwork.F b/bufrdc/bcomwork.F
new file mode 100755
index 0000000..5a02e51
--- /dev/null
+++ b/bufrdc/bcomwork.F
@@ -0,0 +1,29 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ COMMON /BCOMWORK/ RVIND,EPS,NBPW,NWPT,NBPT,NWPTB,NBPTB,NMASK(JBPW)
+ 1, NVIND,NBENP,NLTVNP,NWWP,NXXP,NYYP
+ 2, NZZP,NSSP
+C
+C NBPW - NUMBER OF BITS PER COMPUTER WORD
+C NWPT - WORD POINTER
+C NBPT - BIT POINTER
+C NWPTB - POINTER TO WORD AT THE BEGINING OF NEXT SECTION
+C NBPTB - POINTER TO BIT AT THE BEGINING OF NEXT SECTION
+C NMASK - BIT MASK ARRAY
+C NVIND - MISSING VALUE INDICATOR (INTEGER)
+C RVIND - MISSING VALUE INDICATOR (REAL)
+C NBENP - PREVIOUS BUFR EDITION NUMBER
+C NLTVNP - PREVIOUS LOCAL TABLE VERSION NUMBER
+C NXXP - BUFR MASTER TABLE USED
+C NYYP - VERSION NUMBER OF MASTER TABLE USED
+C NZZP - VERSION NUMBER OF LOCAL TABLE USED
+C
+C
diff --git a/bufrdc/bcomwt.F b/bufrdc/bcomwt.F
new file mode 100755
index 0000000..d8f1b7a
--- /dev/null
+++ b/bufrdc/bcomwt.F
@@ -0,0 +1,37 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCOMWT/ NDWINC,NSCAM,NAFDW,NWT ,ODREPF,N40,N07,N08,
+ 1 NDWINC07,NSCAM07,NAFDWA(100),NFD,NREP,OREP,
+ 1 N221,MREL,NFCM,NFUCM,MBMP,OMARKER,M0,NSTOP,
+ 2 MBMPL,NSTACK(JELEM),NWTEN(JELEM),
+ 3 NWTR (JELEM),NWTS (JELEM),NWTRV (JELEM),
+ 4 NWTDW(JELEM),NWTIW(JELEM),NWTIWS(JELEM)
+C
+C NDWINC - DATA WIDTH INCREMENT
+C NSCAM - SCALE MULTIPLIER
+C NAFDW - AUGMENTED FIELD DATA WIDTH
+C NWT - POINTER TO WORKING TABLE
+C NSTACK - LIST OF DATA DESCRIPTORS
+C ODREPF - REPLICATION (LOGICAL)
+C N221 - DATA NOT PRESENT FOR N221 ELEMENTS
+C MREL - POINTER TO THE LAST DATA ELEMENT
+C NFCM - FIRST COMPRESSED MESSAGE
+C MBMP - POINTER TO THE BEGINING OF BIT MAP
+C NWTR - WORKING TABLE REFERENCE
+C NWTS - WORKING SCALE
+C NWTRV - WORKING REFERENCE VALUE
+C NWTDW - WORKING DATA WIDTH
+C NWTIW - WORKING DATA WIDTH OF INCREMENTS
+C NWTIWS - WORKING TOTAL DATA WIDTH OF ELEMENT SET
+C NSTOP - STOP EXPANSION AFTER NSTOP ELEMENTS
+C
+
diff --git a/bufrdc/bcomwtc.F b/bufrdc/bcomwtc.F
new file mode 100755
index 0000000..02940a2
--- /dev/null
+++ b/bufrdc/bcomwtc.F
@@ -0,0 +1,17 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCOMWTC/ CWTEN(JELEM),CWTU (JELEM)
+C
+C CWTEN - WORKING TABLE ELEMENT NAAME
+C CWTU - WORKING TABLE UNITS
+C
+
diff --git a/bufrdc/bcprq.F b/bufrdc/bcprq.F
new file mode 100755
index 0000000..0fc10ad
--- /dev/null
+++ b/bufrdc/bcprq.F
@@ -0,0 +1,14 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C
+ COMMON /BCPRQ/ NPMISS,NPRUS,NOKEY,NOFL
+C
+
diff --git a/bufrdc/big_endian.F b/bufrdc/big_endian.F
new file mode 100755
index 0000000..03f88df
--- /dev/null
+++ b/bufrdc/big_endian.F
@@ -0,0 +1,35 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ logical function big_endian()
+
+ implicit none
+
+ integer*4 icharacter
+ character*4 testcharacter
+ integer*4 newint
+
+
+ testcharacter="ABCD"
+
+ newint=0
+ read(testcharacter,'(a4)') icharacter
+c icharacter=transfer(testcharacter,0)
+
+ call mvbits(icharacter, 0, 8, newint, 0)
+
+ if(char(newint) .eq. 'A') then
+c little endian
+ big_endian=.false.
+ else
+c big endian
+ big_endian=.true.
+ end if
+ end
diff --git a/bufrdc/btable.F b/bufrdc/btable.F
new file mode 100755
index 0000000..eb2e588
--- /dev/null
+++ b/bufrdc/btable.F
@@ -0,0 +1,222 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BTABLE(YNAME,YTABB,KERR)
+C
+C**** *BTABLE*
+C
+C
+C PURPOSE.
+C --------
+C CREATE BUFR TABLE B IN BINARY FORM.
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C BINARY UNIVERSAL FORM FOR DATA REPRESENTATION, FM 94 BUFR.
+C
+C J.K.GIBSON AND M.DRAGOSAVAC,1987: DECODING DATA
+C REPRESENTATION FM 94 BUFR,TECHNICAL MEMORANDUM NO.
+C
+C J.K.GIBSON,1986:EMOS 2 - STANDARDS FOR SOFTWARE DEVELOPMENT
+C AND MAINTANANCE ,TECHICAL MEMORANDUM NO. ECMWF.
+C
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JANUARY 1991.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+# include "parameter.F"
+# include "bcomwork.F"
+# include "bcomtab.F"
+# include "bcomtabc.F"
+# include "bcomct.F"
+# include "bcomctc.F"
+# include "bcomroot.F"
+# include "bcomtabload.F"
+# include "bcomtabloadc.F"
+
+C
+ CHARACTER*64 CTABBEN,CCTABBEN
+ CHARACTER*24 CTABBU,CCTABBU,CTABLE_LIST,YTABB
+ CHARACTER*120 YENTRY
+ CHARACTER*(*) YNAME
+ CHARACTER*256 YFNAME
+ REAL*8 RVIND,EPS
+C
+C DATA CTABBEN/JTAB*' '/,CTABBU/JTAB*' '/
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+ J=0
+ ICLASS0=0
+ IVIND=2147483647
+ YFNAME=' '
+C
+ DO 101 I=1,64
+ do 101 ii=1,255
+ NTABP(I,ii)=0
+ 101 CONTINUE
+C
+ DO 102 i=1,JTAB
+ NTABBTR(I)=IVIND
+ NTABBS (I)=IVIND
+ NTABBRV(I)=IVIND
+ NTABBDW(I)=IVIND
+ CTABBEN(I)=' '
+ CTABBU (I)=' '
+ 102 CONTINUE
+C
+ II=INDEX(YNAME,' ')
+ II=II-1
+ YFNAME=YNAME(1:II)
+ II=INDEX(YFNAME,' ')
+ II=II-1
+ CALL GET_FREE_UNIT(IUNIT)
+ OPEN(UNIT=IUNIT,FILE=YFNAME(1:II),
+ 2 IOSTAT=IOS,
+ 1 STATUS='OLD')
+ IF(IOS.NE.0) THEN
+ print*,'open error on ',YFNAME(1:II)
+ kerr=61
+ return
+ END IF
+C ------------------------------------------------------------------
+C* 2. READ IN TABLE B ELEMENT.
+C ------------------------
+C
+ 200 CONTINUE
+C
+ YENTRY=' '
+ READ(IUNIT,'(A)',ERR=402,END=300) YENTRY
+C
+ J=J+1
+ IF(J.GT.JTAB) THEN
+ PRINT*,' DIMENSION TOO SMALL J=',J
+ kerr=6
+ return
+ END IF
+C
+C ------------------------------------------------------------------
+C* 2.1 SET ARRAYS FOR TABLE REFERENCE, ELEMENT NAME, UNITS,
+C* REFERENCE VALUE AND DATA WIDTH.
+C
+ 210 CONTINUE
+C
+C
+ READ(YENTRY,'(1X,I6,1x,64x,1x,24x,1x,I3,1x,I12,1x,I3)')
+ 1 NTABBTR(J),NTABBS (J),
+ 1 NTABBRV(J),NTABBDW(J)
+C
+ CTABBEN(J)=YENTRY( 9:72)
+ CTABBU (J)=YENTRY(74:97)
+C
+ ICLASS=NTABBTR(J)/1000
+ IYYY =NTABBTR(J)-ICLASS*1000+1
+C
+ ICLASS=ICLASS+1
+ NTABP(ICLASS,IYYY)=J
+C
+c WRITE(*,1000) NTABBTR(J),CTABBEN(J),CTABBU(J),NTABBS(J),
+c 1 NTABBRV(J),NTABBDW(J)
+c 1000 FORMAT(1H ,1X,I6,1x,64x,1x,24x,1x,,I3,1x,I12,1x,I3)
+C
+ GO TO 200
+C
+C ------------------------------------------------------------------
+ 300 CONTINUE
+C
+ NTT=NTT+1
+ IF(NTT.GT.JTMAX) THEN
+ NTT=NTT-1
+ NTC=NTC+1
+ IF(NTC.GT.10) NTC=1
+ DO J=1,JTAB
+ MTABBTR(J,NTC)=NTABBTR(J)
+ MTABBS (J,NTC)=NTABBS (J)
+ MTABBRV(J,NTC)=NTABBRV(J)
+ MTABBDW(J,NTC)=NTABBDW(J)
+ CCTABBEN(J,NTC)=CTABBEN(J)
+ CCTABBU (J,NTC)=CTABBU (J)
+ END DO
+ DO I=1,64
+ DO K=1,255
+ MTABP(I,K,NTC)=NTABP(I,K)
+ END DO
+ END DO
+ CTABLE_LIST(NTC)=YTABB
+ ELSE
+ DO J=1,JTAB
+ MTABBTR(J,NTT)=NTABBTR(J)
+ MTABBS (J,NTT)=NTABBS (J)
+ MTABBRV(J,NTT)=NTABBRV(J)
+ MTABBDW(J,NTT)=NTABBDW(J)
+ CCTABBEN(J,NTT)=CTABBEN(J)
+ CCTABBU (J,NTT)=CTABBU (J)
+ END DO
+ DO I=1,64
+ DO K=1,255
+ MTABP(I,K,NTT)=NTABP(I,K)
+ END DO
+ END DO
+ CTABLE_LIST(NTT)=YTABB
+ END IF
+C
+ CLOSE(IUNIT)
+C
+C WRITE(*,'(1h )')
+C WRITE(*,'(1h ,a,i4)') 'Total number of entries in Table B is ',j
+C
+ RETURN
+C
+402 CONTINUE
+ KERR=6
+ WRITE(*,4402) IOS,YFNAME
+ 4402 FORMAT(1H ,'Read error',i4,' on ',a)
+ RETURN
+C
+ 401 CONTINUE
+C
+ KERR=61
+ WRITE(*,4401) IOS,YFNAME
+ 4401 FORMAT(1H ,'Open error',i4,' on ',a)
+C
+ RETURN
+ END
diff --git a/bufrdc/btable1.F b/bufrdc/btable1.F
new file mode 100755
index 0000000..438edf3
--- /dev/null
+++ b/bufrdc/btable1.F
@@ -0,0 +1,221 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BTABLE1(YNAME,YTABB,KERR)
+C
+C**** *BTABLE1*
+C
+C
+C PURPOSE.
+C --------
+C CREATE BUFR TABLE B IN BINARY FORM.
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C BINARY UNIVERSAL FORM FOR DATA REPRESENTATION, FM 94 BUFR.
+C
+C J.K.GIBSON AND M.DRAGOSAVAC,1987: DECODING DATA
+C REPRESENTATION FM 94 BUFR,TECHNICAL MEMORANDUM NO.
+C
+C J.K.GIBSON,1986:EMOS 2 - STANDARDS FOR SOFTWARE DEVELOPMENT
+C AND MAINTANANCE ,TECHICAL MEMORANDUM NO. ECMWF.
+C
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JANUARY 1991.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+# include "parameter.F"
+# include "bcmwork.F"
+# include "bcmtab.F"
+# include "bcmtabc.F"
+# include "bcmct.F"
+# include "bcmctc.F"
+# include "bcmroot.F"
+# include "bcmtabload.F"
+# include "bcmtabloadc.F"
+
+C
+ CHARACTER*64 CTABBEN,CCTABBEN
+ CHARACTER*24 CTABBU,CCTABBU,CTABLE_LIST,YTABB
+ CHARACTER*120 YENTRY
+ CHARACTER*(*) YNAME
+ CHARACTER*256 YFNAME
+ REAL*8 RVIND,EPS
+C
+C DATA CTABBEN/JTAB*' '/,CTABBU/JTAB*' '/
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+ J=0
+ ICLASS0=0
+ IVIND=2147483647
+ YFNAME=' '
+C
+ DO 101 I=1,64
+ do 101 ii=1,255
+ NTABP(I,ii)=0
+ 101 CONTINUE
+C
+ DO 102 i=1,JTAB
+ NTABBTR(I)=IVIND
+ NTABBS (I)=IVIND
+ NTABBRV(I)=IVIND
+ NTABBDW(I)=IVIND
+ CTABBEN(I)=' '
+ CTABBU (I)=' '
+ 102 CONTINUE
+C
+ II=INDEX(YNAME,' ')
+ II=II-1
+ YFNAME=YNAME(1:II)
+ II=INDEX(YFNAME,' ')
+ II=II-1
+ CALL GET_FREE_UNIT(IUNIT)
+ OPEN(UNIT=IUNIT,FILE=YFNAME(1:II),
+ 2 IOSTAT=IOS,
+ 1 STATUS='OLD')
+ IF(IOS.NE.0) THEn
+ print*,'open error on ',YFNAME(1:II)
+ kerr=61
+ return
+ END IF
+C ------------------------------------------------------------------
+C* 2. READ IN TABLE B ELEMENT.
+C ------------------------
+C
+ 200 CONTINUE
+C
+ YENTRY=' '
+ READ(IUNIT,'(A)',ERR=402,END=300) YENTRY
+C
+ J=J+1
+ IF(J.GT.JTAB) THEN
+ PRINT*,' DIMENSION TOO SMALL J=',J
+ kerr=65
+ return
+ END IF
+C
+C ------------------------------------------------------------------
+C* 2.1 SET ARRAYS FOR TABLE REFERENCE, ELEMENT NAME, UNITS,
+C* REFERENCE VALUE AND DATA WIDTH.
+C
+ 210 CONTINUE
+C
+C
+ READ(YENTRY,'(1X,I6,1x,64x,1x,24x,1x,I3,1x,I12,1x,I3)')
+ 1 NTABBTR(J),NTABBS (J),
+ 1 NTABBRV(J),NTABBDW(J)
+C
+ CTABBEN(J)=YENTRY( 9:72)
+ CTABBU (J)=YENTRY(74:97)
+C
+ ICLASS=NTABBTR(J)/1000
+ IYYY =NTABBTR(J)-ICLASS*1000+1
+C
+ ICLASS=ICLASS+1
+ NTABP(ICLASS,IYYY)=J
+C
+c WRITE(*,1000) NTABBTR(J),CTABBEN(J),CTABBU(J),NTABBS(J),
+c 1 NTABBRV(J),NTABBDW(J)
+c 1000 FORMAT(1H ,1X,I6,1x,64x,1x,24x,1x,,I3,1x,I12,1x,I3)
+C
+ GO TO 200
+C
+C ------------------------------------------------------------------
+ 300 CONTINUE
+C
+ NTT=NTT+1
+ IF(NTT.GT.JTMAX) THEN
+ NTT=NTT-1
+ NTC=NTC+1
+ IF(NTC.GT.10) NTC=1
+ DO J=1,JTAB
+ MTABBTR(J,NTC)=NTABBTR(J)
+ MTABBS (J,NTC)=NTABBS (J)
+ MTABBRV(J,NTC)=NTABBRV(J)
+ MTABBDW(J,NTC)=NTABBDW(J)
+ CCTABBEN(J,NTC)=CTABBEN(J)
+ CCTABBU (J,NTC)=CTABBU (J)
+ END DO
+ DO I=1,64
+ DO K=1,255
+ MTABP(I,K,NTC)=NTABP(I,K)
+ END DO
+ END DO
+ CTABLE_LIST(NTC)=YTABB
+ ELSE
+ DO J=1,JTAB
+ MTABBTR(J,NTT)=NTABBTR(J)
+ MTABBS (J,NTT)=NTABBS (J)
+ MTABBRV(J,NTT)=NTABBRV(J)
+ MTABBDW(J,NTT)=NTABBDW(J)
+ CCTABBEN(J,NTT)=CTABBEN(J)
+ CCTABBU (J,NTT)=CTABBU (J)
+ END DO
+ DO I=1,64
+ DO K=1,255
+ MTABP(I,K,NTT)=NTABP(I,K)
+ END DO
+ END DO
+ CTABLE_LIST(NTT)=YTABB
+ END IF
+
+ CLOSE(IUNIT)
+c WRITE(*,'(1h )')
+c WRITE(*,'(1h ,a,i4)') 'Total number of entries in Table B is',j
+C
+ RETURN
+C
+402 CONTINUE
+ KERR=1
+ WRITE(*,4402) IOS,YFNAME
+ 4402 FORMAT(1H ,'Read error',i4,' on ',a)
+ RETURN
+C
+ 401 CONTINUE
+C
+ KERR=1
+ WRITE(*,4401) IOS,YFNAME
+ 4401 FORMAT(1H ,'Open error',i4,' on ',a)
+C
+ RETURN
+ END
diff --git a/bufrdc/bu_check_s4s.F b/bufrdc/bu_check_s4s.F
new file mode 100755
index 0000000..0b57441
--- /dev/null
+++ b/bufrdc/bu_check_s4s.F
@@ -0,0 +1,155 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ SUBROUTINE CHECK_S4S(KELEM,KSEC3,KSEC4,KERR)
+C
+C**** *CHECK_S4S*
+C
+C
+C PURPOSE.
+C --------
+C CHECK SECTION 4 SIZE
+C
+C
+C** INTERFACE.
+C ----------
+C
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JUNE 2009
+C
+C
+C MODIFICATIONS.
+C --------------
+
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+
+# include "parameter.F"
+# include "bcomoff.F"
+# include "bcomwt.F"
+
+ DIMENSION KSEC3(*),KSEC4(*)
+ DIMENSION IMASK(8)
+
+
+ DATA IMASK/1,2,4,8,16,32,64,128/
+
+c Check if data are compressed
+ IB=0
+ IF(IAND(KSEC3(4),IMASK(7)).NE.0) IB=1
+ IF(IB.EQ.0) THEN
+C Uncompressed
+ IF(OMULTI) then
+ isum=0
+ IF(NSUBSET.EQ.KSEC3(3)) THEN
+ DO J=1,KSEC3(3)
+ DO I=1,NSIZEG(J)
+ IJ=I+(J-1)*KELEM
+ isum=isum+NWTDWG(IJ)
+ END DO
+ END DO
+ ibytes=isum/8
+ ibit=isum-ibytes*8
+ if(ibit.ne.0) then
+C padding to byte
+ ibytes=ibytes+1
+ if(mod(ibytes,2).ne.0) then
+ ibytes=ibytes+1
+ end if
+ ibytes=ibytes+4
+ else
+ if(mod(ibytes,2).ne.0) then
+ ibytes=ibytes+1
+ end if
+ ibytes=ibytes+4
+ end if
+ if((ksec4(1)-ibytes).gt.1) then
+ print*,'Error in section 4 size'
+ print*,'ksec4(1)=',ksec4(1)
+ print*,'Actual size=',ibytes
+ KERR=56
+ return
+ end if
+ END IF
+ ELSE
+ isum=0
+ do I=1,NSIZE(1)
+ isum=isum+NWTDW(I)
+ END DO
+ isum=isum*ksec3(3)
+ ibytes=isum/8
+ ibit=isum-ibytes*8
+ if(ibit.ne.0) then
+C padding to byte
+ ibytes=ibytes+1
+ if(mod(ibytes,2).ne.0) then
+ ibytes=ibytes+1
+ end if
+ ibytes=ibytes+4
+ else
+ if(mod(ibytes,2).ne.0) then
+ ibytes=ibytes+1
+ end if
+ ibytes=ibytes+4
+ end if
+ if((ksec4(1)-ibytes).gt.1) then
+ KERR=56
+ WRITE(KNTN,*) 'ERROR IN BU_CHECK_S4S: '
+ CALL BUERR(KERR)
+ WRITE(KNTN,*) 'KSEC4(1)=',ksec4(1),' ACTUAL SIZE=',ibytes
+ return
+ end if
+ END IF
+ ELSE
+C Compressed
+ isum=0
+ do I=1,NSIZE(1)
+ isum=isum+NWTIWS(I)
+ END DO
+ ibytes=isum/8
+ ibit=isum-ibytes*8
+ if(ibit.ne.0) then
+C padding to byte
+ ibytes=ibytes+1
+ if(mod(ibytes,2).ne.0) then
+ ibytes=ibytes+1
+ end if
+ ibytes=ibytes+4
+ else
+ if(mod(ibytes,2).ne.0) then
+ ibytes=ibytes+1
+ end if
+ ibytes=ibytes+4
+ end if
+ if((ksec4(1)-ibytes).gt.1) then
+ KERR=56
+ WRITE(KNTN,*) 'ERROR IN BU_CHECK_S4S: '
+ CALL BUERR(KERR)
+ WRITE(KNTN,*) 'KSEC4(1)=',KSEC4(1),' ACTUAL SIZE=',ibytes
+ return
+ end if
+ END IF
+ END
diff --git a/bufrdc/buaug.F b/bufrdc/buaug.F
new file mode 100755
index 0000000..049160a
--- /dev/null
+++ b/bufrdc/buaug.F
@@ -0,0 +1,225 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUAUG(KPT,KDLEN,KDATA,KJ,KY,KSTACK,KERR)
+C
+C**** *BUAUG*
+C
+C
+C PURPOSE.
+C --------
+C UPDATE AUGMENTED BUFR TABLE B.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUAUG(KPT,KDLEN,KDATA,KJ,KY,KSTACK,KER)
+C
+C INPUT :
+C *KPT* - POINTER TOO KDATA ARRAY
+C *KDLEN* - DIMENSION OF KDATA ARRAY
+C *KDATA* - ARRAY CONTAINING DATA NEEDED FOR DATA DESCRIPTOR
+C EXPANSION
+C *KJ* - POINTER TO KSTACK ARRAY
+C *KY* - OPERAND OF THE DATA DESCRIPTOR OPERATOR
+C
+C OUTPUT:
+C *KSTACK* - LIST OF ELEMENTS
+C *KERR* - RETURN ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C GBYTE - PACK BIT PATHERN
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 04/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+# include "bcmatb.F"
+# include "bcmatbc.F"
+# include "bcmtab.F"
+# include "bcmtabc.F"
+# include "bcmwt.F"
+# include "bcmwtc.F"
+# include "bcmbef.F"
+C
+ CHARACTER CATBEN*64,CWTEN*64,CTABBEN*64
+ CHARACTER CATBU*24,CWTU*24,CTABBU*24
+C
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+ DIMENSION KSTACK(*)
+ DIMENSION KDATA(KDLEN)
+C ------------------------------------------------------------------
+C
+C* 1. UPDATE AUGMENTED TABLE B .
+C --------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+C
+C* 1.1 Y = 0 ?
+C -------
+ 110 CONTINUE
+C
+ IF( KY.EQ.0) THEN
+C
+C* 1.1.1 CLEAR AUGMENTED TABLE B.
+C ------------------------
+ NJA= 0
+C
+ DO 111 J=1,JTAB
+C
+ NATBTR(J)= 0
+ NATBS (J)= 0
+ NATBRV(J)= 0
+ NATBDW(J)= 0
+ CATBEN(J)=' '
+ CATBU (J)=' '
+C
+ 111 CONTINUE
+C
+ GO TO 300
+ END IF
+C
+C* 1.2 GET NEXT DESCRIPTOR FROM STACK.
+C -------------------------------
+ 120 CONTINUE
+C
+ KJ=KJ + 1
+ KDD = KSTACK(KJ)
+C
+C* 1.3 ELEMENT DESCRIPTOR ?
+C ---------------------
+ 130 CONTINUE
+C
+ IF = KDD /100000
+ IDIF= KDD -IF*100000
+ IX = IDIF/1000
+ IY = IDIF-IX*1000
+C
+ IF(IF.EQ.0) THEN
+C
+C* 1.3.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ M = M + 1
+ NWTEN(NWT)=836970
+ CWTEN(NWT)='REFERENCE VALUE'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= KY
+ NWTS (NWT)=0
+ NWTRV(NWT)=0
+ NWTR (NWT)=0
+C
+C* 1.3.2 ADD ENTRY TO AUGMENTED TABLE B .
+C --------------------------------
+ DO 131 J=1,JTAB
+C
+ IF(NTABBTR(J).EQ.KDD) THEN
+ I=J
+ GO TO 133
+ END IF
+C
+ 131 CONTINUE
+C
+ KERR= 23
+ WRITE(KNTN,*) ' BUAUG :'
+ CALL BUERR(KERR)
+ GO TO 300
+C
+ 133 CONTINUE
+C
+ NJA=NJA + 1
+C
+ NATBTR(NJA)=NTABBTR(I)
+ NATBS (NJA)=NTABBS (I)
+ NATBRV(NJA)=NTABBRV(I)
+ NATBDW(NJA)=NTABBDW(I)
+ CATBEN(NJA)=CTABBEN(I)
+ CATBU (NJA)=CTABBU (I)
+C
+C* 1.3.3 COMPLITE ENTRY WITH NEW REFERENCE VALUE
+C ----------------------------------------
+C FROM DATA SECTION.
+C ------------------
+C
+ KPT=KPT+1
+ NATBRV(NJA)=KDATA(KPT)
+C
+C 1.3.4 UPDATE WORKING TABLES
+C ---------------------
+ 135 CONTINUE
+C
+C CALL BUEPWT(KDD,KERR)
+C IF(KERR.GT.0) RETURN
+C
+ GO TO 120
+C
+ END IF
+C
+C ------------------------------------------------------------------
+C
+C* 1.4 CHANGE REFERENCE VALUE ?
+C ------------------------
+ 140 CONTINUE
+C
+ IF( IF.EQ.2.AND.IX.EQ.3) THEN
+ IF(IY.EQ.255) GO TO 300
+ KY=IY
+ GO TO 120
+ END IF
+C ------------------------------------------------------------------
+ 200 CONTINUE
+C
+ KERR=23
+ WRITE(KNTN,*) ' BUAUG :'
+ CALL BUERR(KERR)
+C
+C ------------------------------------------------------------------
+ 300 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/bufrdc/bubox.F b/bufrdc/bubox.F
new file mode 100755
index 0000000..f64dfb8
--- /dev/null
+++ b/bufrdc/bubox.F
@@ -0,0 +1,533 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUBOX(KSUB,KSUP,KELEM,KWTR,CNAMES,CUNITS,KVALS,VALUES,
+ 1 KBOX,KAPP,KLEN,KBOXR,VALS,CBOXN,CBOXU,KERR)
+C
+C**** *BUBOX*
+C
+C
+C PURPOSE.
+C --------
+C
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL BUBOX(KSUB,KSUP,KELEM,KWTR,CNAMES,CUNITS,KVALS,VALUES,
+C KBOX,KAPP,KLEN,KBOXR,VALS,CBOXN,CBOXU,KERR)*
+C
+C INPUT :
+C *KSUB* - SUBSET NUMBER
+C *KSUP* - ARRAY CONTAINING SUPLEMENTARY INFORMATION
+C - KSUP( 1) -- IDIM1, DIMENSION OF KSEC1
+C - KSUP( 2) -- IDIM2, DIMENSION OF KSEC2
+C - KSUP( 3) -- IDIM3, DIMENSION OF KSEC3
+C - KSUP( 4) -- IDIM4, DIMENSION OF KSEC4
+C - KSUP( 5) -- M (NUMBER OF ELEMENTS IN VALUES ARRAY,
+C FIRST INDEX)
+C - KSUP( 6) -- N (NUMBER OF SUBSETS,SECOND INDEX OF
+C VALUES ARRAY)
+C - KSUP( 7) -- JVC (NUMBER OF ELEMENTS IN CVAL ARRAY)
+C - KSUP( 8) -- TOTAL BUFR MESSAGE LENGTH IN BYTES
+C - KSUP( 9) -- IDIM0, DIMENSION OF KSEC0
+C *KELEM* - EXPECTED NUMBER OF EXPANDED TABLE B ELEMENTS
+C *KWTR* - ARRAY CONTAINING BUFR TABLE B REFERENCE NUMBERS
+C *CNAMES* - ARRAY CONTAINING ELEMENT NAMES
+C *CUNITS* - ARRAY CONTAINING ELEMENT UNITS
+C *KVALS* - DIMENSION OF VALUES ARRAY
+C *VALUES* - ARRAY CONTAINING UNPACKED VALUES
+C
+C OUTPUT :
+C
+C *KBOX* - NUMBER OF ROWS
+C *KAPP* - NUMBER OF COLUMNS
+C *KLEN* - OFFSET FOR START OF NEXT COLUMN
+C *KBOXR* - ARRAY CONTAINING BUFR TABLE B REFERENCE NUMBERS
+C *VALS* - ARRAY CONTAINING UNPACKED VALUES
+C *CBOXN* - ARRAY CONTAINING ELEMENT NAMES
+C *CBOXU* - ARRAY CONTAINING ELEMENT UNITS
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/94.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+C
+# include "bcomunit.F"
+C
+ CHARACTER*64 CNAMES(*)
+ CHARACTER*24 CUNITS(*)
+C
+C
+ DIMENSION KSUP(9),KWTR(*)
+C
+ DIMENSION IOPER(100),RPRINT(60)
+C
+ DIMENSION KBOXR(JWORK)
+ DIMENSION IBVAL(JELEM),IBPRINT(60)
+ CHARACTER*64 CBOXN(JELEM)
+ CHARACTER*24 CBOXU(JELEM)
+C
+#ifndef R_4
+ REAL*8 VALUES(*)
+ REAL*8 VALS(JWORK)
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL VALUES(*)
+ REAL VALS(JWORK)
+ REAL RVIND
+ REAL EPS
+#endif
+C ------------------------------------------------------------------
+C
+C* 1. GET ALL ELEMENTS UNTIL FIRST OPERATOR APPEAR.
+C ---------------------------------------------
+ 100 CONTINUE
+C
+
+ IF(KERR.GT.0) RETURN
+C
+ RVIND=1.7D38
+ EPS=10.D-7
+ NVIND=2147483647
+C
+ IF(KELEM.GT.JELEM) THEN
+ KERR=47
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+
+C
+C JUST TO KEEP PROGRAM FOR FUTURE MULTY SUBSET BOXING
+C
+ KSUB1=KSUB
+ KSUB2=KSUB
+C
+ IF(KSUB1.LT.1.OR.KSUB1.GT.KSUP(6)) THEN
+ KERR=44
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ IF(KSUB1.NE.KSUB2) THEN
+ WRITE(KNTN,*) 'ONLY ONE SUBSET AT A TIME',
+ 1' WILL BE BOXED.'
+ KSUB2=KSUB1
+ END IF
+C
+ KBOXR(1)=2147483647
+ CBOXN(1)='OPERATOR'
+ CBOXU(1)=' '
+ KBOXR(2)=2147483647
+ CBOXN(2)='GENERATING CENTRE( CODE TABLE 001031)'
+ CBOXU(2)='CODE TABLE'
+ KBOXR(3)=2147483647
+ CBOXN(3)='GENERATING APPLICATION (CODE TABLE 001032)'
+ CBOXU(3)='CODE TABLE'
+ KBOXR(4)=2147483647
+ CBOXN(4)='STATISTICS (008024/008023) '
+ CBOXU(4)='CODE TABLE'
+ KBOXR(5)=2147483647
+ CBOXN(5)='INCREMENTAL UPDATE NUMBER'
+ CBOXU(5)='NUMERIC'
+ KBOXR(6)=2147483647
+ CBOXN(6)='MINIMISATION SIMULATION NUMBER'
+ CBOXU(6)='NUMERIC'
+C
+ MREL=0
+ J=0
+ DO 103 I=1,KSUP(5)
+ IF(KWTR(I).EQ.222000.OR.
+ 1 KWTR(I).EQ.223000.OR.
+ 1 KWTR(I).EQ.224000.OR.
+ 1 KWTR(I).EQ.225000.OR.
+ 1 KWTR(I).EQ.235000.OR.
+ 1 KWTR(I).EQ.237255.OR.
+ 1 KWTR(I).EQ.232000) THEN
+ J=J+1
+ IOPER(J)=I
+ END IF
+ 103 CONTINUE
+C
+ NOPER=J
+C
+ IOPER(J+1)=KSUP(5)
+C
+ NOPP1=NOPER+1
+ INI=IOPER(1)*8+20
+ IF(INI*NOPP1.GT.JWORK) THEN
+ KERR=47
+ WRITE(KNTN,*) 'TOO MANY DATA FOR BOXING.'
+ RETURN
+ END IF
+C
+ DO 105 I=1,INI*NOPP1
+ VALS(I)=RVIND
+ KBOXR(I)=NVIND
+ 105 CONTINUE
+C
+ IF(NOPER.EQ.0) THEN
+ KAPP =1 ! NUMBER OF APPLICATIONS
+ KAPPL=1
+ KLEN=KELEM
+ J=6
+ DO 101 I=1,KSUP(5)
+ J=J+1
+ KBOXR(J)=KWTR(I)
+ CBOXN(J)=CNAMES(I)
+ CBOXU(J)=CUNITS(I)
+ DO 191 KK=KSUB1,KSUB2
+ JJ=I+(KK-1)*KELEM ! POINTER TO VALUES ARRAY
+ IP=J !+(KAPP-1)*KLEN ! +(KK-1)*KAPPL*KLEN ! POINTER TO VALS ARRAY
+ VALS (IP)=VALUES(JJ)
+ 191 CONTINUE
+ 101 CONTINUE
+C
+ KBOX=J ! TOTAL NUMBER OF ELEMENTS
+ MREL=J
+ GO TO 2000
+ END IF
+C
+ O236=.FALSE.
+C
+ LFIRST=1
+ J=6
+C
+C
+ LAST=IOPER(1)-1
+ IF(MREL.EQ.0) MREL=LAST+6
+ KLEN=LAST*8+20
+C
+ 102 CONTINUE
+C
+C* 1.1 MOVE ELEMENTS FROM LFIRST TO LAST INTO BOX.
+C -------------------------------------------
+ 110 CONTINUE
+C
+ KAPP =1 ! NUMBER OF APPLICATIONS
+ KAPPL=60
+ DO 111 I=LFIRST,LAST
+ J=J+1
+ KBOXR(J)=KWTR(I)
+ CBOXN(J)=CNAMES(I)
+ CBOXU(J)=CUNITS(I)
+ DO 192 KK=KSUB1,KSUB2
+ JJ=I+(KK-1)*KELEM
+ IP=J ! +(KAPP-1)*KLEN ! +(KK-1)*KAPPL*KLEN
+ VALS (IP)=VALUES(JJ)
+ 192 CONTINUE
+ 111 CONTINUE
+C
+ KBOX=J ! TOTAL NUMBER OF ELEMENTS
+C
+ DO 1000 LL=1,NOPER
+C
+ K=IOPER(LL)
+C
+ IF(KWTR(K).EQ.235000) THEN
+ MREL=0
+ K=K+1
+C
+ KL=IOPER(LL+1)-1
+ DO 112 I=K,KL
+ J=J+1
+ KBOXR(J)=KWTR(I)
+ CBOXN(J)=CNAMES(I)
+ CBOXU(J)=CUNITS(I)
+ DO 190 KK=KSUB1,KSUB2
+ JJ=I+(KK-1)*KELEM
+ IP=J !+(KAPP-1)*KLEN ! +(KK-1)*KAPPL*KLEN
+ VALS (IP)=VALUES(JJ)
+ 190 CONTINUE
+ 112 CONTINUE
+ GO TO 1000
+ END IF
+ IF(KWTR(K).EQ.222000) THEN
+ K=K+1
+ IMARK=222000
+ IF(MREL.EQ.0) MREL=J
+ GO TO 119
+ END IF
+ IF(KWTR(K).EQ.223000) THEN
+ K=K+1
+ IMARK=223000
+ IF(MREL.EQ.0) MREL=J
+ GO TO 119
+ END IF
+ IF(KWTR(K).EQ.224000) THEN
+ K=K+1
+ IMARK=224000
+ IF(MREL.EQ.0) MREL=J
+ GO TO 119
+ END IF
+ IF(KWTR(K).EQ.225000) THEN
+ K=K+1
+ IMARK=225000
+ IF(MREL.EQ.0) MREL=J
+ GO TO 119
+ END IF
+ IF(KWTR(K).EQ.232000) THEN
+ K=K+1
+ IMARK=232000
+ IF(MREL.EQ.0) MREL=J
+ END IF
+C
+ 119 CONTINUE
+C
+C CHECK IF NEXT ELEMENT IS OPERATOR
+C
+ IF(KWTR(K).EQ.236000) THEN
+ O236=.TRUE.
+ K=K+1
+ END IF
+C
+ IF(KWTR(K).EQ.237000) THEN
+ K=K+1
+ GO TO 120
+ END IF
+C
+ IF(KWTR(K).EQ.237255) THEN
+ O236=.FALSE.
+ K=K+1
+ GO TO 1000
+ END IF
+C
+C SKIP IF DELAYED REPLICATION FACTOR FOLLOW
+C
+ IF(KWTR(K).EQ.31002.OR.KWTR(K).EQ.31001.OR.
+ 1 KWTR(K).EQ.31000) K=K+1
+C
+C NEXT ELEMENT MUST BE DATA PRESENT INDICATOR
+C
+ IF(KWTR(K).NE.31031.AND.KWTR(K).NE.31192) THEN
+ KERR=42
+ CALL BUERR(KERR)
+ WRITE(KNTN,*) 'ELEMENT ',K,' MUST BE',
+ 1' DATA PRESENT INDICATOR.'
+ RETURN
+ END IF
+C
+C COUNT NUMBER OF DATA PRESENT INDICATORS
+C
+C IBITS - POINTER TO THE FIRST DATA PRESENT INDICATOR
+C IDPI - NUMBER OF DATA PRESENT INDICATORS
+C
+ IBITS=K
+ IDPI=0
+ DO 113 I=K,IOPER(LL+1)
+ IF(KWTR(I).EQ.31031) THEN
+ IDPI=IDPI+1
+ ELSE
+ GO TO 114
+ END IF
+ 113 CONTINUE
+C
+ KERR=43
+ CALL BUERR(KERR)
+ RETURN
+C
+ 114 CONTINUE
+C
+C RESET CURRENT POINTER
+C
+ K=I
+C
+C GET BIT MAP FROM VALUES
+C
+ IBP=IBITS-1
+ DO 115 I=1,IDPI
+ IBP=IBP+1
+ IF(ABS(VALUES(IBP)-RVIND)/RVIND.LT.EPS) THEN
+ IBVAL(I)=NVIND
+ ELSE
+ IBVAL(I)=VALUES(IBP)
+ END IF
+ 115 CONTINUE
+C
+C
+ 120 CONTINUE
+C
+C NEXT 3 ELEMENTS MUST BE GENERATING CENTRE AND APPLICATION
+C AND CLASS 8 ELEMENT.
+C
+ KAPP=KAPP+1
+ IF(KAPP.GT.60) THEN
+ WRITE(KNTN,*) 'THERE IS MORE THAN 60 APPLICATIONS',
+ 1' IN THE DATA.'
+ RETURN
+ END IF
+ IF(KWTR(K).EQ.1031.OR.KWTR(K).EQ.1033) THEN
+ KP=(KAPP-1)*KLEN
+ KP1=KP+1
+ KBOXR(KP1)=IMARK
+C CBOXN(KP1)=' '
+C CBOXU(KP1)=' '
+ DO 194 KK=KSUB1,KSUB2
+ IP=1+(KAPP-1)*KLEN ! +(KK-1)*KAPPL*KLEN
+ VALS(IP)=IMARK
+ 194 CONTINUE
+ KP2=KP+2
+ KBOXR(KP2)=KWTR(K)
+C CBOXN(KP2)=CNAMES(K)
+C CBOXU(KP2)=CUNITS(K)
+ DO 195 KK=KSUB1,KSUB2
+ JJ=K+(KK-1)*KELEM
+ IP=2+(KAPP-1)*KLEN ! +(KK-1)*KAPPL*KLEN
+ VALS(IP)=VALUES(JJ)
+ 195 CONTINUE
+ K=K+1
+ END IF
+ IF(KWTR(K).EQ.1032.OR.KWTR(K).EQ.1201.OR.KWTR(K).EQ.63191) THEN
+ KP=(KAPP-1)*KLEN
+ KP3=KP+3
+ KBOXR(KP3)=KWTR(K)
+C CBOXN(KP3)=CNAMES(K)
+C CBOXU(KP3)=CUNITS(K)
+ DO 196 KK=KSUB1,KSUB2
+ JJ=K+(KK-1)*KELEM
+ IP=3+(KAPP-1)*KLEN ! +(KK-1)*KAPPL*KLEN
+ VALS(IP)=VALUES(JJ)
+ 196 CONTINUE
+ K=K+1
+ END IF
+ IF(KWTR(K)/1000.EQ.8) THEN
+ KP=(KAPP-1)*KLEN
+ KP4=KP+4
+ KBOXR(KP4)=KWTR(K)
+C CBOXN(KP4)=CNAMES(K)
+C CBOXU(KP4)=CUNITS(K)
+ DO 197 KK=KSUB1,KSUB2
+ JJ=K+(KK-1)*KELEM
+ IP=4+(KAPP-1)*KLEN ! +(KK-1)*KAPPL*KLEN
+ VALS(IP)=VALUES(JJ)
+ 197 CONTINUE
+ K=K+1
+ END IF
+ IF(KWTR(K).EQ.33210) THEN
+ KP=(KAPP-1)*KLEN
+ KP5=KP+5
+ KBOXR(KP5)=KWTR(K)
+C CBOXN(KP5)=CNAMES(K)
+C CBOXU(KP5)=CUNITS(K)
+ DO 201 KK=KSUB1,KSUB2
+ JJ=K+(KK-1)*KELEM
+ IP=5+(KAPP-1)*KLEN ! +(KK-1)*KAPPL*KLEN
+ VALS(IP)=VALUES(JJ)
+ 201 CONTINUE
+ K=K+1
+ END IF
+ IF(KWTR(K).EQ.33211) THEN
+ KP=(KAPP-1)*KLEN
+ KP6=KP+6
+ KBOXR(KP6)=KWTR(K)
+C CBOXN(KP6)=CNAMES(K)
+C CBOXU(KP6)=CUNITS(K)
+ DO 202 KK=KSUB1,KSUB2
+ JJ=K+(KK-1)*KELEM
+ IP=6+(KAPP-1)*KLEN ! +(KK-1)*KAPPL*KLEN
+ VALS(IP)=VALUES(JJ)
+ 202 CONTINUE
+ K=K+1
+ END IF
+C
+C NEXT ELEMENT CAN BE DELAYED/EXTENDED DELAYED REPLICATION
+C SKIP IT
+C
+ IF(KWTR(K).EQ.31002.OR.KWTR(K).EQ.31001.OR.
+ 1 KWTR(K).EQ.31000) K=K+1
+C
+C
+C MOVE CORESPONDING QUALITY CONTROL INTO BOX
+C
+ KQ=MREL-IDPI+1
+ KAPPK=(KAPP-1)*KLEN
+ DO 121 I=1,IDPI
+ IF(IBVAL(I).NE.0) THEN
+ KKQ=KQ+KAPPK
+ VALS(KKQ)=RVIND
+ KQ=KQ+1
+ ELSE
+ KKQ=KQ+KAPPK
+ KBOXR(KKQ)=KWTR(K)
+C CBOXN(KKQ)=CNAMES(K)
+C CBOXU(KKQ)=CUNITS(K)
+ DO 198 KK=KSUB1,KSUB2
+ JJ=K+(KK-1)*KELEM ! +(KK-1)*KAPPL*KLEN
+ VALS(KKQ)=VALUES(JJ)
+ 198 CONTINUE
+ K=K+1
+ KQ=KQ+1
+ END IF
+ 121 CONTINUE
+C
+C CHECK IF SOME NEW DATA FOLLOW.
+C
+ IF(K.LT.IOPER(LL+1)-1) THEN
+C
+C MOVE THESE ELEMENTS INTO BOX
+C
+ IF(KWTR(IOPER(LL+1)).GT.200000.AND.
+ 1 KWTR(IOPER(LL+1)).NE.999999) THEN
+ ILL=IOPER(LL+1)-1
+ ELSE
+ ILL=IOPER(LL+1)
+ END IF
+ DO 122 I=K,ILL
+ J=J+1
+ KBOXR(J)=KWTR(I)
+ CBOXN(J)=CNAMES(I)
+ CBOXU(J)=CUNITS(I)
+ DO 199 KK=KSUB1,KSUB2
+ JJ=I+(KK-1)*KELEM
+ IP=J !+(KAPP-1)*KLEN ! +(KK-1)*KAPPL*KLEN
+ VALS(IP)=VALUES(JJ)
+ 199 CONTINUE
+ 122 CONTINUE
+ KBOX=J
+ END IF
+C
+ 1000 CONTINUE
+C
+ 2000 CONTINUE
+C
+ KBOX=J
+ IF(KBOX.LE.6) KBOX=0
+C
+ RETURN
+ END
diff --git a/bufrdc/bucrekey.F b/bufrdc/bucrekey.F
new file mode 100755
index 0000000..6e8492b
--- /dev/null
+++ b/bufrdc/bucrekey.F
@@ -0,0 +1,220 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUCREKEY(KTDEXP,KSUP,KSEC1,KEY,VALUES,CVALS,KERR)
+C**** *BUCREKEY*
+C
+C
+C PURPOSE.
+C --------
+C
+C EXTRACT ELEMENTS NEEDED FOR RDB KEY DEFINITION
+C FROM VALUES AND CVALS ARRAYS.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C NONE.
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C
+C M. DRAGOSAVAC *ECMWF* 06/02/95.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H,Y)
+C
+C -------------------------------------------------------------
+ DIMENSION KEY(*),KSUP(*),KSEC1(*),KTDEXP(*)
+#ifndef R_4
+ REAL*8 VALUES(*)
+#else
+ REAL VALUES(*)
+#endif
+ CHARACTER*(*)CVALS(*)
+ CHARACTER*5 CBLOCK
+C
+ 100 CONTINUE
+C
+C IPAID - AIRCRAFT FLIGHT NUMBER INDEX
+C IPSID - SATELLITE IDENTIFIER INDEX
+C IPBUOY - BUOY/PLATFORM IDENTIFIER INDEX
+C IPARN - AIRCRAFT REGISTRATION NUMBER INDEX
+C IPMET - METAR ICAO ID
+C IPSHIP - SHIPS' CALL SIGN INDEX
+C IPBLOK - WMO BLOCK NUMBER INDEX
+C IPSTAT - WMO STATION NUMBER INDEX
+C IPYEAR - YEAR INDEX
+C IPMONTH - MONTH INDEX
+C IPDAY - DAY INDEX
+C IPHOUR - HOUR INDEX
+C IPMINUTE - MINUTE INDEX
+C IPSECOND - SECOND INDEX
+C IPLAT - LATITUDE INDEX
+C IPLON - LONGITUDE INDEX
+C IPLAT - LATITUDE INDEX
+C IPLON - LONGITUDE INDEX
+C
+ KERR=0
+C
+ IPAID=0
+ IPSID=0
+ IPBUOY=0
+ IPARN=0
+ IPMET=0
+ IPSHIP=0
+ IPBLOK=0
+ IPSTAT=0
+ IPYEAR=0
+ IPMONTH=0
+ IPDAY=0
+ IPHOUR=0
+ IPMINUTE=0
+ IPSECOND=0
+ IPLAT=0
+ IPLON=0
+ DO 107 I=16,24
+ KEY(I)=32
+ 107 CONTINUE
+C
+ IEND = 26
+ IF( KSEC1(7).EQ.57 ) IEND = 36
+ DO 101 I=1,IEND
+ IF(KTDEXP(I).EQ.001006) IPAID=I
+ IF(KTDEXP(I).EQ.001007) IPSID=I
+ IF(KTDEXP(I).EQ.001005) IPBUOY=I
+C IF(KTDEXP(I).EQ.001008) IPARN=I
+ IF(KTDEXP(I).EQ.001063) IPMET=I
+ IF(KTDEXP(I).EQ.001011) IPSHIP=I
+ IF(KTDEXP(I).EQ.001001) IPBLOK=I
+ IF(KTDEXP(I).EQ.001002) IPSTAT=I
+ IF(KTDEXP(I).EQ.004001) IPYEAR=I
+ IF(KTDEXP(I).EQ.004002) IPMONTH=I
+ IF(KTDEXP(I).EQ.004003) IPDAY=I
+ IF(KTDEXP(I).EQ.004004) IPHOUR=I
+ IF(KTDEXP(I).EQ.004005) IPMINUTE=I
+ IF(KTDEXP(I).EQ.004006) IPSECOND=I
+ IF(KTDEXP(I).EQ.005001) IPLAT=I
+ IF(KTDEXP(I).EQ.006001) IPLON=I
+ IF(KTDEXP(I).EQ.005002) IPLAT=I
+ IF(KTDEXP(I).EQ.006002) IPLON=I
+ 101 CONTINUE
+C
+ KEY(4)=VALUES(IPYEAR)
+ KEY(5)=VALUES(IPMONTH)
+ KEY(6)=VALUES(IPDAY)
+ KEY(7)=VALUES(IPHOUR)
+ KEY(8)=VALUES(IPMINUTE)
+ IF(IPSECOND.NE.0) KEY(9)=VALUES(IPSECOND)
+C
+ KEY(10)=NINT(VALUES(IPLON)*100000.+18000000)
+ KEY(11)=NINT(VALUES(IPLAT)*100000.+9000000)
+ KEY(12)=NINT(VALUES(IPLON)*100000.+18000000)
+ KEY(13)=NINT(VALUES(IPLAT)*100000.+9000000)
+ KEY(14)=1
+C
+C SATELITTE ID
+C
+ IF(IPSID.NE.0) THEN
+ KEY(15)=VALUES(IPSID)
+ END IF
+C
+C WMO BLOCK AND STATION NUMBER
+C
+ IF(IPBLOK.NE.0) THEN
+ KEY(16)=NINT(VALUES(IPBLOK))*1000+NINT(VALUES(IPSTAT))
+ WRITE(CBLOCK,'(I5.5)') KEY(16)
+ J=15
+ DO 105 I=1,5
+ KEY(J+I)=ICHAR(CBLOCK(I:I))
+ 105 CONTINUE
+ END IF
+C
+C BUOY/PALTFORM ID
+C
+ IF(IPBUOY.NE.0) THEN
+ KEY(16)=NINT(VALUES(IPBUOY))
+ WRITE(CBLOCK,'(I5.5)') KEY(16)
+ J=15
+ DO 106 I=1,5
+ KEY(J+I)=ICHAR(CBLOCK(I:I))
+ 106 CONTINUE
+ END IF
+C
+C AIRCRAFT IDENTIFIER
+C
+ IF(IPAID.NE.0) THEN
+ IP=(VALUES(IPAID)/1000)
+ INCH=NINT(VALUES(IPAID)-IP*1000)
+ J=15
+ DO 102 I=1,INCH
+ KEY(J+I)=ICHAR(CVALS(IP)(I:I))
+ 102 CONTINUE
+ END IF
+C
+C AIRCRAFT REGISTRATION NUMBER
+C
+ IF(IPARN.NE.0) THEN
+ IP=(VALUES(IPARN)/1000)
+ INCH=NINT(VALUES(IPARN)-IP*1000)
+ J=15
+ DO 103 I=1,INCH
+ KEY(J+I)=ICHAR(CVALS(IP)(I:I))
+ 103 CONTINUE
+ END IF
+C
+C SHIP'S CALL SIGN
+C
+ IF(IPSHIP.NE.0) THEN
+ IP=(VALUES(IPSHIP)/1000)
+ INCH=NINT(VALUES(IPSHIP)-IP*1000)
+ J=15
+ DO 104 I=1,INCH
+ KEY(J+I)=ICHAR(CVALS(IP)(I:I))
+ 104 CONTINUE
+ END IF
+C
+C METAR ID
+C
+ IF(IPMET.NE.0) THEN
+ IP=(VALUES(IPMET)/1000)
+ INCH=NINT(VALUES(IPMET)-IP*1000)
+ J=15
+ DO 194 I=1,INCH
+ KEY(J+I)=ICHAR(CVALS(IP)(I:I))
+ 194 CONTINUE
+ END IF
+
+ RETURN
+ END
diff --git a/bufrdc/bucrkey.F b/bufrdc/bucrkey.F
new file mode 100755
index 0000000..2680785
--- /dev/null
+++ b/bufrdc/bucrkey.F
@@ -0,0 +1,279 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUCRKEY(KELEM,KTDEXP,KSUP,KSEC1,KSEC3,KEY,
+ 1 VALUES,CVALS,KERR)
+C**** *BUCRKEY*
+C
+C
+C PURPOSE.
+C --------
+C
+C EXTRACT ELEMENTS NEEDED FOR RDB KEY DEFINITION
+C FROM VALUES AND CVALS ARRAYS.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C NONE.
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C
+C M. DRAGOSAVAC *ECMWF* 06/06/99.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H,Y)
+C
+C -------------------------------------------------------------
+ DIMENSION KEY(*),KSUP(*),KSEC1(*),KTDEXP(*)
+#ifndef R_4
+ REAL*8 EPS, RVIND
+ REAL*8 VALUES(*)
+ REAL*8 RMINLAT, RMINLON, RMAXLAT, RMAXLON
+#else
+ REAL EPS, RVIND
+ REAL VALUES(*)
+ REAL RMINLAT, RMINLON, RMAXLAT, RMAXLON
+#endif
+ DIMENSION KSEC3(*)
+ CHARACTER*(*)CVALS(*)
+ CHARACTER*5 CBLOCK
+C
+ 100 CONTINUE
+C
+C IPAID - AIRCRAFT FLIGHT NUMBER INDEX
+C IPSID - SATELLITE IDENTIFIER INDEX
+C IPBUOY - BUOY/PLATFORM IDENTIFIER INDEX
+C IPARN - AIRCRAFT REGISTRATION NUMBER INDEX
+C IPMET - METAR ICAO ID
+C IPSHIP - SHIPS' CALL SIGN INDEX
+C IPBLOK - WMO BLOCK NUMBER INDEX
+C IPSTAT - WMO STATION NUMBER INDEX
+C IPYEAR - YEAR INDEX
+C IPMONTH - MONTH INDEX
+C IPDAY - DAY INDEX
+C IPHOUR - HOUR INDEX
+C IPMINUTE - MINUTE INDEX
+C IPSECOND - SECOND INDEX
+C IPLAT - LATITUDE INDEX
+C IPLON - LONGITUDE INDEX
+C IPLAT - LATITUDE INDEX
+C IPLON - LONGITUDE INDEX
+C
+ KERR=0
+ EPS=10.D-7
+ RVIND=1.7D38
+ IPAID=0
+ IPSID=0
+ IPBUOY=0
+ IPARN=0
+ IPMET=0
+ IPSHIP=0
+ IPBLOK=0
+ IPSTAT=0
+ IPYEAR=0
+ IPMONTH=0
+ IPDAY=0
+ IPHOUR=0
+ IPMINUTE=0
+ IPSECOND=0
+ IPLAT=0
+ IPLON=0
+ DO 107 I=16,24
+ KEY(I)=32
+ 107 CONTINUE
+C
+ IEND = 26
+ IF( KSEC1(7).EQ.57 ) IEND = 36
+ DO 101 I=1,IEND
+ IF(KTDEXP(I).EQ.001006) IPAID=I
+ IF(KTDEXP(I).EQ.001007) IPSID=I
+ IF(KTDEXP(I).EQ.001005) IPBUOY=I
+C IF(KTDEXP(I).EQ.001008) IPARN=I
+ IF(KTDEXP(I).EQ.001194) IPAID=I
+ IF(KTDEXP(I).EQ.001063) IPMET=I
+ IF(KTDEXP(I).EQ.001011) IPSHIP=I
+ IF(KTDEXP(I).EQ.001001) IPBLOK=I
+ IF(KTDEXP(I).EQ.001002) IPSTAT=I
+ IF(KTDEXP(I).EQ.004001) IPYEAR=I
+ IF(KTDEXP(I).EQ.004002) IPMONTH=I
+ IF(KTDEXP(I).EQ.004003) IPDAY=I
+ IF(KTDEXP(I).EQ.004004) IPHOUR=I
+ IF(KTDEXP(I).EQ.004005) IPMINUTE=I
+ IF(KTDEXP(I).EQ.004006) IPSECOND=I
+ IF(KTDEXP(I).EQ.005001) IPLAT=I
+ IF(KTDEXP(I).EQ.006001) IPLON=I
+ IF(KTDEXP(I).EQ.005002) IPLAT=I
+ IF(KTDEXP(I).EQ.006002) IPLON=I
+ 101 CONTINUE
+C
+ KEY(4)=VALUES(IPYEAR)
+ KEY(5)=VALUES(IPMONTH)
+ KEY(6)=VALUES(IPDAY)
+ KEY(7)=VALUES(IPHOUR)
+ KEY(8)=VALUES(IPMINUTE)
+ IF(IPSECOND.NE.0) KEY(9)=VALUES(IPSECOND)
+C
+ IF((ABS(VALUES(IPLON)-RVIND))/RVIND.LT.EPS.OR.
+ 1 (ABS(VALUES(IPLAT)-RVIND))/RVIND.LT.EPS) THEN
+ KERR=1
+ PRINT*,'FOUND VALUES(IPLON)=',VALUES(IPLON)
+ PRINT*,'FOUND VALUES(IPLAT)=',VALUES(IPLAT)
+ RETURN
+ ELSE
+ CALL FMMH( IPLAT,IPLON,KELEM,VALUES,KSEC3,RMINLAT,RMINLON,
+ 1 RMAXLAT,RMAXLON)
+
+ KEY(10)=NINT(RMINLON*100000.+18000000)
+ KEY(11)=NINT(RMINLAT*100000.+9000000)
+ KEY(12)=NINT(RMAXLON*100000.+18000000)
+ KEY(13)=NINT(RMAXLAT*100000.+9000000)
+ END IF
+C
+ KEY(14)=KSEC3(3)
+C
+C SATELITTE ID
+C
+ KEY(15)=0
+ DO IS=16,24
+ KEY(IS)=32
+ END DO
+ IF(IPSID.NE.0) THEN
+ KEY(15)=VALUES(IPSID)
+ END IF
+C
+C WMO BLOCK AND STATION NUMBER
+C
+ IF(IPBLOK.NE.0) THEN
+ IF(ABS(VALUES(IPBLOK)-RVIND)/RVIND.LT.EPS) THEN
+ KERR=1
+ PRINT*,'FOUND VALUES(IPBLOK)=',VALUES(IPBLOK)
+ RETURN
+ END IF
+ IF(ABS(VALUES(IPSTAT)-RVIND)/RVIND.LT.EPS) THEN
+ KERR=1
+ PRINT*,'FOUND VALUES(IPSTAT)=',VALUES(IPSTAT)
+ RETURN
+ END IF
+ KEY(16)=NINT(VALUES(IPBLOK))*1000+NINT(VALUES(IPSTAT))
+ WRITE(CBLOCK,'(I5.5)') KEY(16)
+ J=15
+ DO 105 I=1,5
+ KEY(J+I)=ICHAR(CBLOCK(I:I))
+ 105 CONTINUE
+ END IF
+C
+C BUOY/PALTFORM ID
+C
+ IF(IPBUOY.NE.0) THEN
+ IF(ABS(VALUES(IPBUOY)-RVIND)/RVIND.LT.EPS) THEN
+ KERR=1
+ PRINT*,'FOUND VALUES(IPBUOY)=',VALUES(IPBUOY)
+ RETURN
+ END IF
+ KEY(16)=NINT(VALUES(IPBUOY))
+ WRITE(CBLOCK,'(I5.5)') KEY(16)
+ J=15
+ DO 106 I=1,5
+ KEY(J+I)=ICHAR(CBLOCK(I:I))
+ 106 CONTINUE
+ END IF
+C
+C AIRCRAFT IDENTIFIER
+C
+ IF(IPAID.NE.0) THEN
+ IF(ABS(VALUES(IPAID)-RVIND)/RVIND.LT.EPS) THEN
+ KERR=1
+ PRINT*,'FOUND VALUES(IPAID)=',VALUES(IPAID)
+ RETURN
+ END IF
+ IP=(VALUES(IPAID)/1000)
+ INCH=NINT(VALUES(IPAID)-IP*1000)
+ J=15
+ DO 102 I=1,INCH
+ KEY(J+I)=ICHAR(CVALS(IP)(I:I))
+ 102 CONTINUE
+ END IF
+C
+C AIRCRAFT REGISTRATION NUMBER
+C
+ IF(IPARN.NE.0) THEN
+ IF(ABS(VALUES(IPARN)-RVIND)/RVIND.LT.EPS) THEN
+ KERR=1
+ PRINT*,'FOUND VALUES(IPARN)=',VALUES(IPARN)
+ RETURN
+ END IF
+ IP=(VALUES(IPARN)/1000)
+ INCH=NINT(VALUES(IPARN)-IP*1000)
+ J=15
+ DO 103 I=1,INCH
+ KEY(J+I)=ICHAR(CVALS(IP)(I:I))
+ 103 CONTINUE
+ END IF
+C
+C SHIP'S CALL SIGN
+C
+ IF(IPSHIP.NE.0) THEN
+ IF(ABS(VALUES(IPSHIP)-RVIND)/RVIND.LT.EPS) THEN
+ KERR=1
+ PRINT*,'FOUND VALUES(IPSHIP)=',VALUES(IPSHIP)
+ RETURN
+ END IF
+ IP=(VALUES(IPSHIP)/1000)
+ INCH=NINT(VALUES(IPSHIP)-IP*1000)
+ J=15
+ DO 104 I=1,INCH
+ KEY(J+I)=ICHAR(CVALS(IP)(I:I))
+ 104 CONTINUE
+ END IF
+C
+C METAR ID
+C
+ IF(IPMET.NE.0) THEN
+ IF(ABS(VALUES(IPMET)-RVIND)/RVIND.LT.EPS) THEN
+ KERR=1
+ PRINT*,'FOUND VALUES(IPMET)=',VALUES(IPMET)
+ RETURN
+ END IF
+ IP=(VALUES(IPMET)/1000)
+ INCH=NINT(VALUES(IPMET)-IP*1000)
+ J=15
+ DO 194 I=1,INCH
+ KEY(J+I)=ICHAR(CVALS(IP)(I:I))
+ 194 CONTINUE
+ END IF
+C
+ RETURN
+ END
diff --git a/bufrdc/buedd.F b/bufrdc/buedd.F
new file mode 100755
index 0000000..7bf7ed2
--- /dev/null
+++ b/bufrdc/buedd.F
@@ -0,0 +1,362 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUEDD(KPT,KTDLEN,KTDLST,KDLEN,KDATA,KSEC3,
+ 1 KVALS,VALUES,KELEM,CNAMES,CUNITS,KERR)
+C
+C**** *BUEDD*
+C
+C
+C PURPOSE.
+C --------
+C
+C EXPAND SECTION 3 OF BUFR MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUEDD(KPT,KTDLEN,KTDLST,KDLEN,KDATA,KSEC3,
+C KVALS,VALUES,KELEM,CNAMES,CUNITS,KERR)
+C
+C INPUT :
+C *KPT* - POINTER TO KDATA ARRAY
+C *KTDLEN* - NUMBER OF DATA DESCRIPTORS IN SECTION 3
+C *KTDLST* - ARRAY CONTAINING DATA DESCRIPTORS IN SECTION 3
+C *KDLEN* - DIMENSION OF KDATA ARRAY
+C *KDATA* - ARRAY CONTAINING DATA NEEDED FOR DATA DESCRIPTOR
+C EXPANSION
+C *KSEC3* - ARRAY CONTAINING SECTION 3 INFORMATION
+C KSEC3( 1)-- LENGTH OF SECTION 3 (BYTES)
+C KSEC3( 2)-- RESERVED
+C KSEC3( 3)-- NUMBER OF SUBSETS
+C KSEC3( 4)-- FLAG (DATA TYPE,DATA COMPRESSION)
+C OUTPUT :
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C DATA DESCRIPTOR TAKEN FROM KTDLST ARRAY ARE FULLY
+C EXPANDED USING DATA FROM KDATA ARRAY IF NEEDED.
+C ( DELAYED REPLICATION FACTORS ETC.)
+C
+C
+C EXTERNALS.
+C ----------
+C
+C BUNEXS - SET WORD AND BIT POINTERS AT THE BEGINING OF
+C NEXT SECTION
+C BUNPCK - UNPACKS BIT PATHERN
+C BUREP - SOLVES REPLICATION PROBLEM
+C BUETDR - SOLVES TABLE D REFERENCE
+C BUOPER - PROCESS OPERATOR
+C BUEPWT - UPDATES WORKING TABLE
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+# include "bcmbef.F"
+# include "bcmwt.F"
+# include "bcmwtc.F"
+# include "bcmel.F"
+C
+ CHARACTER CWTEN*64,CWTU*24
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+C
+#ifndef R_4
+ REAL*8 VALUES(KVALS)
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL VALUES(KVALS)
+ REAL RVIND
+ REAL EPS
+#endif
+C
+ DIMENSION ISTACK(JELEM),IISTACK(JELEM)
+ DIMENSION IMASK(8)
+C
+ DIMENSION KSEC3(JSEC3)
+ DIMENSION KDATA(KDLEN),KTDLST(KTDLEN)
+C
+ DATA IMASK/1,2,4,8,16,32,64,128/
+C ------------------------------------------------------------------
+C
+C* 1.
+C --------------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ N = KSEC3(3)
+C
+C
+C* 2. EXPAND DATA DESCRIPTORS.
+C ------------------------
+ 200 CONTINUE
+C
+C
+C* 2.1 SET EXPECTED NUMBER OF DATA DESCRIPTORS.
+C ----------------------------------------
+C AND INITIALIZE NUMBER OF DATA VALUES PER SUB-SET.
+C -------------------------------------------------
+ 210 CONTINUE
+C
+ J = 0
+ KPT = 0
+ NWT = 0
+ JMAX = KTDLEN
+ JMAXNEW=JMAX
+C
+ IF(KTDLEN.GT.JELEM) THEN
+ WRITE(KNTN,*) ' BUETD :'
+ KERR=29
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+C* 2.2 PUT DATA DESCRIPTORS IN STACK.
+C ------------------------------
+ 220 CONTINUE
+C
+ DO 221 JJ=1,JMAX
+C
+ ISTACK(JJ)=KTDLST(JJ)
+ IISTACK(JJ)=ISTACK(JJ)
+C
+ 221 CONTINUE
+C
+C* 2.2.1 CHECK IF IT IS SAME DATA DESCRIPTOR DESCRIOPTION.
+C -------------------------------------------------
+C TO MAKE MORE EFFICIENT DATA DESCRIPTOR DESCRIPTION
+C EXPANSION, IN CASE THAT DELAYED REPLICATION FACTOR
+C IS NOT PRESENT AND DATA DESCRIPTORS ARE THE SAME,
+C PREVIOUS WORKING TABLE SHOULD BE USED. IT IS POSIBLE
+C AT THIS PLACE IN THE FUTURE TO MAKE MORE SOPHISTICATED
+C CONTROL.
+C
+C
+ DO 222 JC=1,JMAX
+C
+ IF(ISTACK(JC).NE.NSTACK(JC)) THEN
+C
+C
+ ODREPF=.FALSE.
+C
+C SWAP CONTENT OF THE STACKS.
+C
+ DO 223 JJC=1,JMAX
+ NSTACK(JJC)=ISTACK(JJC)
+ 223 CONTINUE
+C
+ NTDLEN = JMAX
+ M=0
+ NOLD=N
+ NFCM=0
+ MREL=0
+ OMARKER=.FALSE.
+ MBMP=0
+ MBMPL=0
+C
+ GO TO 230
+C
+ END IF
+C
+ 222 CONTINUE
+C
+C
+C* IF MARKER OPERATOR PRESENT EXPAND DESCRIPTORS AGAIN
+C
+ IF(OMARKER) THEN
+ M=0
+ NOLD=N
+ NFCM=0
+ MREL=0
+ OMARKER=.FALSE.
+ NTDLEN=JMAX
+ MBMP=0
+ MBMPL=0
+ GO TO 230
+ END IF
+C
+C* RETURN IF DELAYED REPLICATION FACTOR IS NOT PRESENT.
+C
+ IF(JMAX.NE.NTDLEN) THEN
+ M=0
+ NOLD=N
+ NFCM=0
+ MREL=0
+ OMARKER=.FALSE.
+ NTDLEN=JMAX
+ MBMP=0
+ MBMPL=0
+ GO TO 230
+ END IF
+C
+ OB=.FALSE.
+ IF(IAND(KSEC3(4),IMASK(7)).NE.0) OB=.TRUE.
+C
+ IF(ODREPF) GO TO 229
+C
+ IF(.NOT.ODREPF) THEN
+ IF(N.GT.NOLD) NOLD=N
+ IF(OB.AND.NFCM.EQ.1) GO TO 300
+ IF(.NOT.OB.AND.NFCM.EQ.0) GO TO 300
+ END IF
+C
+ 229 CONTINUE
+C
+ M=0
+ NOLD=N
+ NFCM=0
+ MREL=0
+ OMARKER=.FALSE.
+ NTDLEN=JMAX
+ MBMP=0
+ MBMPL=0
+C
+C ------------------------------------------------------------------
+C* 2.3 GET NEXT DESCRIPTOR FROM THE STACK.
+C -----------------------------------
+ 230 CONTINUE
+C
+ J = J + 1
+ IF(J.GT.JMAX) GO TO 270
+C
+ IDD = ISTACK(J)
+ IF(IDD.EQ.0) GO TO 230
+C
+ IF = IDD/100000
+C
+C ------------------------------------------------------------------
+C* 2.4 CHECK IF IT IS REPLICATION DESCRIPTOR.
+C --------------------------------------
+ 240 CONTINUE
+C
+ IF(IF.EQ.0) THEN
+C
+C* 2.6 ELEMENT DESCRIPTOR, SO UPDATE WORKING TABLE.
+C --------------------------------------------
+ 260 CONTINUE
+C
+c IF(IDD.EQ.31031.OR.IDD.EQ.31192) THEN
+c NWT=NWT+1
+c NWTR(NWT)=IDD
+c NWTS(NWT)=0
+c NWTRV(NWT)=0
+c NWTDW(NWT)=1
+c NWTEN(NWT)=0
+c CWTEN(NWT)='DATA PRESENT INDICATOR'
+c CWTU (NWT)='FLAG TABLE 031031'
+c M=M+1
+c ELSEIF(IDD.EQ.33007.OR.IDD.EQ.63192) THEN
+c NWT=NWT+1
+c NWTR(NWT)=IDD
+c NWTS(NWT)=0
+c NWTRV(NWT)=0
+c NWTDW(NWT)=7
+c NWTEN(NWT)=0
+c CWTEN(NWT)='% CONFIDENCE'
+c CWTU (NWT)='%'
+c M=M+1
+c ELSE
+ CALL BUEPWTC(IDD,KERR)
+ IF(KERR.GT.0) RETURN
+c END IF
+ ELSEIF(IF.EQ.1) THEN
+C
+C* 2.4.1 SOLVE REPLICATION PROBLEM.
+C --------------------------
+C
+ CALL BUREPC(KPT,KDLEN,KDATA,J,JMAX,IDD,ISTACK,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ ELSEIF(IF.EQ.2) THEN
+C
+C
+C* 2.5.3 PROCESS OPERATOR.
+C -----------------
+ CALL BUOPERC(KPT,KDLEN,KDATA,J,IDD,ISTACK,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ ELSEIF(IF.EQ.3) THEN
+C
+C
+C* 2.5.2 REPLACE BY LIST OF DESCRIPTORS FROM TABLE *D.
+C ---------------------------------------------
+ CALL BUETDR(J,JMAX,IDD,ISTACK,KERR)
+ IF(KERR.GT.0) THEN
+ DO 252 IQ=1,JELEM
+ NSTACK(IQ)=0.
+ 252 CONTINUE
+ RETURN
+ END IF
+ ELSE
+ KERR=37
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ GO TO 230
+C
+C ------------------------------------------------------------------
+C* 2.7 RESOLVE MARKER OPERATOR.
+C ------------------------
+ 270 CONTINUE
+C
+C IF(OMARKER) THEN
+C CALL BUEPMRKC(KSEC3,KVALS,VALUES,KELEM,CNAMES,CUNITS,KERR)
+C IF(KERR.GT.0) RETURN
+C END IF
+C
+C ------------------------------------------------------------------
+C
+C* 3. COLLECT SUPPLEMENTARY ITEMS.
+C -----------------------------
+ 300 CONTINUE
+C
+ NTDEXL =M
+ DO 301 I=1,NTDEXL
+ NTDEXP(I)=NWTR(I)
+ 301 CONTINUE
+C
+ NTDLEN=JMAXNEW
+ DO 302 I=1,NTDLEN
+ NTDLST(I)=IISTACK(I)
+ 302 CONTINUE
+C
+ DO 303 I=1,M
+ CNAMES(I)=CWTEN(I)
+ CUNITS(I)=CWTU (I)
+ 303 CONTINUE
+C
+ RETURN
+ END
diff --git a/bufrdc/buens0.F b/bufrdc/buens0.F
new file mode 100755
index 0000000..b0209d7
--- /dev/null
+++ b/bufrdc/buens0.F
@@ -0,0 +1,144 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUENS0( KSEC0,KBUFL,KBUFF,KERR)
+C
+C**** *BUENS0*
+C
+C
+C PURPOSE.
+C --------
+C PACK SECTION 0 OF BUFR MESSAGE.
+C PACKING BUFR EDITION 2.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUENS0( KSEC0,KBUFL,KBUFF,KERR)*
+C
+C
+C INPUT:
+C *KSEC0* - ARRAY CONTAINING SECTION 0 INFORMATION
+C KSEC0( 1)-- LENGTH OF SECTION 0 (BYTES)
+C KSEC0( 2)-- TOTAL LENGTH OF BUFR MESSAGE (BYTES)
+C KSEC0( 3)-- BUFR EDITION NUMBER
+C OUTPUT:
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C --------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C BUPKS - PACK BIT PATHERN IN REPEATED WAY
+C BUPCK - PACK BIT PATHERN
+C BUOCTN - SET LENGTH OF SECTION
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/09/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+C
+ DIMENSION KBUFF(KBUFL)
+ DIMENSION KSEC0(JSEC0)
+ DIMENSION IBUFR(4)
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+C
+ DATA IBUFR/66,85,70,82/
+C
+C B IS CCITT.5 DECIMAL 66
+C U IS CCITT.5 DECIMAL 85
+C F IS CCITT.5 DECIMAL 70
+C R IS CCITT.5 DECIMAL 82
+C
+C
+C ------------------------------------------------------------------
+C* 1. PACK SECTION 0.
+C ---------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+C
+C* 1.1 INITIALIZE WORKING POINTERS NWPT AND NBPT.
+C ------------------------------------------
+ NWPT = 1
+ NBPT = 0
+C
+C* 1.2 PACK FIRST FOUR OCTETS CONTAINING *BUFR*.
+C -------------------------------------------
+C
+ CALL BUPKS(NBPW,KBUFF(NWPT),IBUFR,NWPT,NBPT,8,0,4,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'ERROR PACKING FIRST FOUR OCTETS',
+ 1' OF BUFR MESSAGE.'
+ RETURN
+ END IF
+C
+ IF(KSEC0(3).LE.1) GO TO 200
+C
+C* 1.2 PACK TOTAL LENGTH OF BUFR MESSAGE.
+C ------------------------------------
+ 120 CONTINUE
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),0,NWPT,NBPT,24,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING TOTAL LENGTH OF BUFR MESSAGE'
+ WRITE(KNTN,*) 'IN SECTION 0.'
+ RETURN
+ END IF
+C
+C* 1.3 PACK BUFR EDITION NUMBER (IT IS 8TH BYTE ).
+C ---------------------------------------------
+ 130 CONTINUE
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC0(3),NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING BUFR EDITION NUMBER IN SECTION 0.'
+ RETURN
+ END IF
+C
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ RETURN
+ END
diff --git a/bufrdc/buens1.F b/bufrdc/buens1.F
new file mode 100755
index 0000000..c5adf24
--- /dev/null
+++ b/bufrdc/buens1.F
@@ -0,0 +1,424 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUENS1( KSEC0,KSEC1,KBUFL,KBUFF,KERR)
+C
+C**** *BUENS1*
+C
+C
+C PURPOSE.
+C --------
+C PACK SECTION 1 OF BUFR MESSAGE.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUENS1( KSEC0,KSEC1,KBUFL,KBUFF,KERR)*
+C
+C
+C INPUT :
+C *KSEC0* - ARRAY CONTAINING SECTION 0 INFORMATION
+C KSEC0( 1)-- LENGTH OF SECTION 0 (BYTES)
+C KSEC0( 2)-- TOTAL LENGTH OF BUFR MESSAGE (BYTES)
+C KSEC0( 3)-- BUFR EDITION NUMBER
+C *KSEC1* - ARRAY CONTAINING SECTION 1 INFORMATION
+C KSEC1( 1)-- LENGTH OF SECTION 1 (BYTES)
+C KSEC1( 2)-- BUFR EDITION NUMBER
+C KSEC1( 3)-- ORIGINATING CENTRE
+C KSEC1( 4)-- UPDATE SEQUENCE NUMBER
+C KSEC1( 5)-- FLAG (PRESENCE OF SECTION 2)
+C KSEC1( 6)-- BUFR MESSAGE TYPE
+C KSEC1( 7)-- BUFR MESSAGE SUBTYPE
+C KSEC1( 8)-- VERSION NUMBER OF LOCAL TABLE USED
+C KSEC1( 9)-- YEAR
+C KSEC1(10)-- MONTH
+C KSEC1(11)-- DAY
+C KSEC1(12)-- HOUR
+C KSEC1(13)-- MINUTE
+C KSEC1(14)-- BUFR MASTER TABLE
+C KSEC1(15)-- VERSION NUMBER OF MASTER TABLE USED
+C KSEC1(16) TO KSEC1(JSEC1) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 3 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- NOT USED
+C KSEC1(18) TO KSEC1(JSEC1) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 4 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- INTERNATIONAL SUB-CATEGORY (SEE COMMON TABLE C-13
+C KSEC1(18)-- SECOND
+C KSEC1(19)-- YEAR
+C KSEC1(20)-- MONTH
+C KSEC1(21)-- DAY
+C KSEC1(22)-- HOUR
+C KSEC1(23)-- MINUTE
+C KSEC1(24)-- SECOND
+C KSEC1(25)-- YEAR
+C KSEC1(26)-- MONTH
+C KSEC1(27)-- DAY
+C KSEC1(28)-- HOUR
+C KSEC1(29)-- MINUTE
+C KSEC1(30)-- SECOND
+C KSEC1(31)-- MOST SOUTHERN LATITUDE (-90 to 90)
+C KSEC1(32)-- MOST WESTERN LONGITUDE ( 0-360)
+C KSEC1(33)-- MOST NORTHEN LATITUDE (-90 to 90)
+C KSEC1(34)-- MOST EASTERN LONGITUDE ( 0-360)
+C KSEC1(35) TO KSEC1(JSEC1) - LOCAL ADP CENTRE INFORMATION(PACKED FORM)
+C
+C OUTPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C *KERR* - RETURNED ERROR CODE
+C
+C* METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C BUPCK - PACK BIT PATHERN
+C BUOCTN - SET LENGTH OF SECTION
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 16/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+C
+ DIMENSION KBUFF(KBUFL),KSEC0(JSEC0),KSEC1(JSEC1)
+ DIMENSION ISEC1(JSEC1)
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+C
+C ------------------------------------------------------------------
+C* 1. PACK SECTION 1.
+C ---------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ DO 101 I=1,JSEC1
+ ISEC1(I)=0
+ 101 CONTINUE
+C
+C* 1.1 KEEP POINTERS TO THE BEGINING OF THE SECTION.
+C ---------------------------------------------
+ 110 CONTINUE
+C
+ IWPTB = NWPT
+ IBPTB = NBPT
+C
+C
+C* 1.2 PACK LENGTH OF SECTION 1.
+C -------------------------
+ 120 CONTINUE
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),0,NWPT,NBPT,24,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING LENGTH OF SECTION 1.'
+ RETURN
+ END IF
+C
+C
+C* 1.3 PACK BUFR EDITION NUMBER/MASTER TABLE USED.
+C -------------------------------------------
+ 130 CONTINUE
+C
+ IF(KSEC0(3).LE.1) THEN
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(2),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING BUFR EDITION NUMBER'
+ WRITE(KNTN,*) 'IN SECTION 1.'
+ RETURN
+ END IF
+ ELSE
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(14),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING BUFR MASTER TABLE NUMBER'
+ WRITE(KNTN,*) 'IN SECTION 1.'
+ RETURN
+ END IF
+ END IF
+C
+C* 1.4 PACK ORIGINATING CENTRE.
+C ------------------------
+ 140 CONTINUE
+C
+ IF(KSEC0(3).LT.3) THEN
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(3),NWPT,NBPT,16,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING ORIGINATING CENTRE IN SECTION 1.'
+ RETURN
+ END IF
+ ELSEIF(KSEC0(3).EQ.3) THEN
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(16),NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING ORIGINATING ',
+ 1 'SUB-CENTRE IN SECTION 1.'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(3),NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING ORIGINATING CENTRE IN SECTION 1.'
+ RETURN
+ END IF
+ ELSEIF(KSEC0(3).EQ.4) THEN
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(3),NWPT,NBPT,16,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING ORIGINATING CENTRE IN SECTION 1.'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(16),NWPT,NBPT,16,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING ORIGINATING ',
+ 1 'SUB-CENTRE IN SECTION 1.'
+ RETURN
+ END IF
+ END IF
+C
+C* 1.5 PACK UPDATE SEQUENCE NUMBER.
+C ----------------------------
+ 150 CONTINUE
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(4),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING UPDATE SEQUENCE NUMBER ',
+ 1 'IN SECTION 1.'
+ RETURN
+ END IF
+C
+C* 1.6 PACK INTEGER VALUE OF THE OCTET CONTAINING
+C ------------------------------------------
+C FLAG BITS(ZERO IF SECTION TWO IS NOT PRESENT).
+C ----------------------------------------------
+ 160 CONTINUE
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(5),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING FLAG IN SECTION 1.'
+ RETURN
+ END IF
+C
+C* 1.7 PACK *BUFR* MESSAGE TYPE.
+C -------------------------
+ 170 CONTINUE
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(6),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING BUFR MESSAGE TYPE IN SECTION 1.'
+ RETURN
+ END IF
+C
+C 1.7.1 PACK BUFR INTERNATIONAL SUB-CATEGORY
+C -------------------------------------
+ IF(KSEC0(3).EQ.4) THEN
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(17),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KSEC1(17) IN SECTION 1.'
+ RETURN
+ END IF
+ END IF
+C
+C* 1.8 PACK *BUFR* MESSAGE SUB-TYPE.
+C -----------------------------
+ 180 CONTINUE
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(7),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING BUFR MESSAGE SUBTYPE.'
+ RETURN
+ END IF
+C
+C* 1.9 PACK LOCAL TABLE VERSION NUMBER OR
+C ----------------------------------
+C VERSION NUMBER OF MASTER TABLE USED.
+C ------------------------------------
+ 190 CONTINUE
+C
+ IF(KSEC0(3).LE.1) THEN
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(8),NWPT,NBPT,16,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING VERSION NUMBER OF ',
+ 1 'LOCAL TABLE USED.'
+ RETURN
+ END IF
+ ELSE
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(15),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING VERSION NUMBER OF ',
+ 1 'MASTER TABLE USED.'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1( 8),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING VERSION NUMBER OF ',
+ 1 'LOCAL TABLE USED.'
+ RETURN
+ END IF
+ END IF
+C
+C* 2.0 PACK YEAR.
+C ----------
+ 200 CONTINUE
+C
+ IF(KSEC0(3).LE.3) THEN
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(9),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KSEC1(9) IN SECTION 1.'
+ RETURN
+ END IF
+ ELSE
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(9),NWPT,NBPT,16,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KSEC1(9) IN SECTION 1.'
+ RETURN
+ END IF
+ END IF
+C
+C* 2.1 PACK MONTH.
+C -----------
+ 210 CONTINUE
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(10),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KSEC1(10) IN SECTION 1.'
+ RETURN
+ END IF
+C
+C* 2.2 PACK DAY.
+C -----------
+ 220 CONTINUE
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(11),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KSEC1(11) IN SECTION 1.'
+ RETURN
+ END IF
+C
+C* 2.3 PACK HOUR.
+C ------------
+ 230 CONTINUE
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(12),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KSEC1(12) IN SECTION 1.'
+ RETURN
+ END IF
+C
+C* 2.4 PACK MINUTE.
+C --------------
+ 240 CONTINUE
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(13),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KSEC1(13) IN SECTION 1.'
+ RETURN
+ END IF
+C
+C 2.4.1 PACK SECOND
+C -----------
+ IF(KSEC0(3).EQ.4) THEN
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC1(18),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KSEC1(18) IN SECTION 1.'
+ RETURN
+ END IF
+ END IF
+
+C
+C 2.5 PACK LOCAL ADP CENTRE INFORMATION.
+C ----------------------------------
+ 250 CONTINUE
+C
+ IF(KSEC0(3).LT.3) THEN
+ IOFF=KSEC1(1)-17
+ IW=16
+ IB=0
+ ELSEIF(KSEC0(3).EQ.3) THEN
+ IOFF=KSEC1(1)-17
+ IF(IOFF.LT.1) THEN
+ WRITE(KNTN,*) 'ERROR IN KSEC1(1)'
+ WRITE(KNTN,*) 'THE SIZE SHALL BE AT LEAST 18 BYTES'
+ KERR=55
+ RETURN
+ END IF
+ IW=18
+ IB=0
+ ELSEIF(KSEC0(3).EQ.4) THEN
+C IOFF=KSEC1(1)-52
+ IOFF=KSEC1(1)-22
+ IF(IOFF.LT.0) THEN
+ WRITE(KNTN,*) 'ERROR IN KSEC1(1)'
+ WRITE(KNTN,*) 'THE SIZE SHALL BE AT LEAST 22 BYTES'
+ KERR=55
+ RETURN
+ END IF
+C IW=35 ! index for local info
+ IW=19 ! index for local info
+ IB=0
+ END IF
+ IF(IOFF.GT.0) THEN
+ CALL BUNPKS(NBPW,KSEC1,ISEC1,IW,IB,8,0,IOFF,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING LOCAL ADP CENTRE INFORMATION'
+ WRITE(KNTN,*) 'IN SECTION 1.'
+ RETURN
+ END IF
+C
+ CALL BUPKS(NBPW,KBUFF(NWPT),ISEC1,NWPT,NBPT,8,0,IOFF,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING LOCAL ADP CENTRE INFORMATION'
+ WRITE(KNTN,*) 'IN SECTION 1.'
+ RETURN
+ END IF
+ END IF
+C ------------------------------------------------------------------
+C* 2.6 SET UP LENGTH OF THE SECTION 1.
+C --------------------------------
+ 260 CONTINUE
+C
+ CALL BUOCTN(IWPTB,IBPTB,KBUFL,KBUFF,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C
+ RETURN
+ END
diff --git a/bufrdc/buens2.F b/bufrdc/buens2.F
new file mode 100755
index 0000000..b0c98fd
--- /dev/null
+++ b/bufrdc/buens2.F
@@ -0,0 +1,202 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUENS2( KSEC1,KSEC2,KBUFL,KBUFF,KERR )
+C
+C**** *BUENS2*
+C
+C
+C PURPOSE.
+C --------
+C PACK SECTION 2 OF BUFR MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUENS2(KSEC1,KSEC2,KBUFL,KBUFF,KERR)*
+C
+C
+C INPUT :
+C *KSEC1* - ARRAY CONTAINING SECTION 1 INFORMATION
+C KSEC1( 1)-- LENGTH OF SECTION 1 (BYTES)
+C KSEC1( 2)-- BUFR EDITION NUMBER
+C KSEC1( 3)-- ORIGINATING CENTRE
+C KSEC1( 4)-- UPDATE SEQUENCE NUMBER
+C KSEC1( 5)-- FLAG (PRESENCE OF SECTION 2)
+C KSEC1( 6)-- BUFR MESSAGE TYPE
+C KSEC1( 7)-- BUFR MESSAGE SUBTYPE
+C KSEC1( 8)-- VERSION NUMBER OF LOCAL TABLE USED
+C KSEC1( 9)-- YEAR
+C KSEC1(10)-- MONTH
+C KSEC1(11)-- DAY
+C KSEC1(12)-- HOUR
+C KSEC1(13)-- MINUTE
+C KSEC1(14)-- BUFR MASTER TABLE
+C KSEC1(15)-- VERSION NUMBER OF MASTER TABLE USED
+C KSEC1(16) TO KSEC1(JSEC1) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 3 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- NOT USED
+C KSEC1(18) TO KSEC1(JSEC1) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 4 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- INTERNATIONAL SUB-CATEGORY (SEE COMMON TABLE C-13
+C KSEC1(18)-- SECOND
+C KSEC1(19)-- YEAR
+C KSEC1(20)-- MONTH
+C KSEC1(21)-- DAY
+C KSEC1(22)-- HOUR
+C KSEC1(23)-- MINUTE
+C KSEC1(24)-- SECOND
+C KSEC1(25)-- YEAR
+C KSEC1(26)-- MONTH
+C KSEC1(27)-- DAY
+C KSEC1(28)-- HOUR
+C KSEC1(29)-- MINUTE
+C KSEC1(30)-- SECOND
+C KSEC1(31)-- MOST SOUTHERN LATITUDE (-90 to 90)
+C KSEC1(32)-- MOST WESTERN LONGITUDE ( 0-360)
+C KSEC1(33)-- MOST NORTHEN LATITUDE (-90 to 90)
+C KSEC1(34)-- MOST EASTERN LONGITUDE ( 0-360)
+C KSEC1(35) TO KSEC1(JSEC1) - LOCAL ADP CENTRE INFORMATION(PACKED FORM)
+C
+C *KSEC2* - ARRAY CONTAINING SECTION 2 INFORMATION
+C KSEC2( 1)-- LENGTH OF SECTION 2 (BYTES)
+C KSEC2( 2) TO KSEC2(JSEC2) LOCAL ADP CENTRE
+C INFORMATION (PACKED FORM)
+C OUTPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C
+C
+C
+C EXTERNALS.
+C ----------
+C
+C BUPCK - PACK BIT PATHERN
+C BUOCTN - SET LENGTH OF SECTION
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 17/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+C
+ DIMENSION KBUFF(KBUFL)
+ DIMENSION KSEC1(JSEC1),KSEC2(JSEC2)
+ DIMENSION IDUM(8), ISEC2(JSEC2)
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+C
+ DATA IDUM/8*0/
+C
+C ------------------------------------------------------------------
+C* 1. EXPAND SECTION 2.
+C -----------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ DO 101 I=1,JSEC2
+ ISEC2(I)=0
+ 101 CONTINUE
+C
+ IF(KSEC1(5) .NE. 0 .AND. KSEC1(5) .NE.128) THEN
+ KERR=50
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ IF( KSEC1(5).EQ.0) RETURN
+C
+C* 1.1 KEEP POINTERS TO THE BEGINING OF THE SECTION.
+C ---------------------------------------------
+ 110 CONTINUE
+C
+ IWPTB = NWPT
+ IBPTB = NBPT
+C
+C* 1.2 PACK LENGTH OF SECTION 2.
+C -------------------------
+ CALL BUPCK(NBPW,KBUFF(NWPT),0,NWPT,NBPT,24,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING LENGTH OF SECTION 2.'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KBUFF(NWPT),0,NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C
+C* 1.3 LOCAL ADP CENTRE INFORMATION.
+C -----------------------------
+C
+ IOFF=KSEC2(1)-4
+ IF(IOFF.GT.0) THEN
+ IW=2
+ IB=0
+ CALL BUNPKS(NBPW,KSEC2,ISEC2,IW,IB,8,0,IOFF,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING LOCAL ADP CENTRE INFORMATION'
+ WRITE(KNTN,*) 'IN SECTION 2.'
+ RETURN
+ END IF
+C
+ CALL BUPKS(NBPW,KBUFF(NWPT),ISEC2,NWPT,NBPT,8,0,IOFF,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING LOCAL ADP CENTRE INFORMATION'
+ WRITE(KNTN,*) 'IN SECTION 2.'
+ RETURN
+ END IF
+ END IF
+C
+C
+C* 1.5 SET UP LENGTH OF THE SECTION 2.
+C --------------------------------
+ 150 CONTINUE
+C
+ CALL BUOCTN(IWPTB,IBPTB,KBUFL,KBUFF,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ RETURN
+ END
diff --git a/bufrdc/buens3.F b/bufrdc/buens3.F
new file mode 100755
index 0000000..8a175ed
--- /dev/null
+++ b/bufrdc/buens3.F
@@ -0,0 +1,199 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUENS3(KSEC3,KTDLEN,KTDLST,KBUFL,KBUFF,KERR)
+C
+C**** *BUENS3*
+C
+C
+C PURPOSE.
+C --------
+C
+C PACK SECTION 3 OF BUFR MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUENS3( KSEC3,KTDLEN,KTDLST,KBUFL,KBUFF,KERR)*
+C
+C INPUT :
+C *KSEC3* - ARRAY CONTAINING SECTION 3 INFORMATION
+C KSEC3( 1)-- LENGTH OF SECTION 3 (BYTES)
+C KSEC3( 2)-- RESERVED
+C KSEC3( 3)-- NUMBER OF SUBSETS
+C KSEC3( 4)-- FLAG (DATA TYPE,DATA COMPRESSION)
+C *KTDLEN* - NUMBER OF DATA DESCRIPTORS IN SECTION 3
+C *KTDLST* - ARRAY CONTAINING DATA DESCRIPTORS IN SECTION 3
+C
+C OUTPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C
+C
+C
+C
+C EXTERNALS.
+C ----------
+C
+C BUPCK - PACKS BIT PATHERN
+C BUOCTN - SET LENGTH OF SECTION
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+C
+ DIMENSION KBUFF(KBUFL)
+ DIMENSION KTDLST(KTDLEN)
+C
+ DIMENSION KSEC3(JSEC3)
+C
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+C ------------------------------------------------------------------
+C* 1. PACK PRELIMINARY ITEMS OF SECTION 3.
+C --------------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+C* 1.1 KEEP POINTERS TO THE BEGINING OF THE SECTION.
+C ---------------------------------------------
+ 110 CONTINUE
+C
+ IWPTB = NWPT
+ IBPTB = NBPT
+C
+C
+C* 1.2 PACK LENGTH OF SECTION 3.
+C -------------------------
+ 120 CONTINUE
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),0,NWPT,NBPT,24,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING LENGTH OF SECTION 3.'
+ RETURN
+ END IF
+C
+C
+C* 1.3 PACK ZERO BYTE AND PUT IT IN KSEC3(2).
+C --------------------------------------
+ 130 CONTINUE
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),0,NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING RESERVED BYTE IN SECTION 3.'
+ RETURN
+ END IF
+C
+C* 1.4 PACK NUMBER OF DATA SUB-SETS.
+C -----------------------------
+ 140 CONTINUE
+C
+ IF(KSEC3(3).GT.65535) THEN
+ KERR=27
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC3(3),NWPT,NBPT,16,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KSEC3(3) IN SECTION 3.'
+ RETURN
+ END IF
+C
+C
+C* 1.5 PACK INTEGER VALUE OF THE OCTET
+C ---------------------------------
+C CONTAINIG FLAG BITS.
+C --------------------
+ 150 CONTINUE
+C
+ IF(KSEC3(3).LE.1) THEN
+ KSEC3(4)=IBCLR(KSEC3(4),6)
+ END IF
+ CALL BUPCK(NBPW,KBUFF(NWPT),KSEC3(4),NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KSEC3(4) IN SECTION 3.'
+ RETURN
+ END IF
+C
+C -----------------------------------------------------------------
+C* 1.6 PACK DATA DESCRIPTORS.
+C ----------------------
+ 160 CONTINUE
+C
+C
+ DO 161 I=1,KTDLEN
+ IFIXIY=KTDLST(I)
+C
+ II=IFIXIY/1000
+ IY=IFIXIY-II*1000
+ IF=II/100
+ IX=II-IF*100
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),IF,NWPT,NBPT,2,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING ',I,' DESCRIPTOR IN SECTION 3.'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KBUFF(NWPT),IX,NWPT,NBPT,6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING ',I,' DESCRIPTOR IN SECTION 3.'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KBUFF(NWPT),IY,NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING ',I,' DESCRIPTOR IN SECTION 3.'
+ RETURN
+ END IF
+C
+C
+ 161 CONTINUE
+C
+C* 1.7 SET UP LENGTH OF THE SECTION 1.
+C --------------------------------
+ 170 CONTINUE
+C
+ CALL BUOCTN(IWPTB,IBPTB,KBUFL,KBUFF,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C
+ RETURN
+ END
diff --git a/bufrdc/buens4.F b/bufrdc/buens4.F
new file mode 100755
index 0000000..b50acdb
--- /dev/null
+++ b/bufrdc/buens4.F
@@ -0,0 +1,1014 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUENS4(KSEC3,KSEC4,KELEM,KVALS,VALUES,CVALS,
+ 1 KBUFL,KBUFF,KERR)
+C
+C**** *BUENS4*
+C
+C
+C PURPOSE.
+C --------
+C PACK PRELIMINARY ITEMS AND DATA OF SECTION 4 OF BUFR MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUENS4(KSEC3,KSEC4,KELEM,KVALS,VALUES,CVALS,
+C KBUFL,KBUFF,KERR)*
+C
+C INPUT :
+C *KSEC3* - ARRAY CONTAINING SECTION 3 INFORMATION
+C KSEC3( 1)-- LENGTH OF SECTION 3 (BYTES)
+C KSEC3( 2)-- RESERVED
+C KSEC3( 3)-- NUMBER OF SUBSETS
+C KSEC3( 4)-- FLAG (DATA TYPE,DATA COMPRESSION)
+C *KSEC4* - ARRAY CONTAINING SECTION 4 INFORMATION
+C KSEC4( 1)-- LENGTH OF SECTION 4 (BYTES)
+C KSEC4( 2)-- RESERVED
+C *KELEM* - NUMBER OF ELEMENTS IN BUFR TEMPLATE
+C *KVALS* - DIMENSION OF VALUES ARRAY
+C *VALUES* - REAL ARRAY (EXPANDED DATA VALUES)
+C
+C OUTPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C BUPCK - PACK BIT PATHERN
+C BUPKS - PACK BIT PATHERN IN REPEATED WAY,
+C POINTER ADJUSTMENT
+C BUOCTN - SET LENGTH OF SECTION
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 17/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+# include "bcmwt.F"
+# include "bcmwtc.F"
+# include "bcmbef.F"
+# include "bcprq.F"
+# include "bcmoff.F"
+C
+ CHARACTER*64 CWTEN
+ CHARACTER*24 CWTU
+C
+ DIMENSION KBUFF(KBUFL)
+C
+ DIMENSION KSEC3(JSEC3),KSEC4(JSEC4)
+#ifndef R_4
+ REAL*8 VALUES(KVALS)
+ REAL*8 RVIND
+ REAL*8 EPS
+ REAL*8 VAL,VAL8S
+ REAL*8 VCHECK
+ REAL*8 RVALS(JWORK)
+#else
+ REAL VALUES(KVALS)
+ REAL RVIND
+ REAL EPS
+ REAL VAL
+ REAL VCHECK
+ REAL RVALS(JWORK)
+#endif
+C
+ REAL*4 RVALS4(JWORK)
+ REAL*4 VAL4,VAL4S
+ INTEGER*4 I4
+ REAL*8 R8
+ REAL*4 R4
+ LOGICAL OBIG, OEQUAL
+ LOGICAL BIG_ENDIAN
+C
+ DIMENSION IVALS(JWORK),INC(JELEM),ILOCVAL(JELEM)
+ DIMENSION IIVALS(JELEM)
+C
+ CHARACTER*80 CVALS(KVALS)
+ CHARACTER*80 YVAL
+C
+ DIMENSION IMASK(8),IMAXV(32)
+ DATA IMASK/1,2,4,8,16,32,64,128/
+C DATA ILOCVAL/JELEM*0/
+C
+ DATA IMAXV/1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,
+ 1 16383,32767,65535,131071,262143,524287,1048575,2097151,
+ 2 4194305,8388607,16777215,33554431,671108863,134217727,
+ 3 268435455,536870911,1073741823,2147483647,2147483647/
+C
+ SAVE IWPTB,IBPTB
+C ------------------------------------------------------------------
+C* 1. PACK PRELIMINARY ITEMS OF SECTION 4.
+C ------------------------------------
+ 100 CONTINUE
+C
+ IF(KERR.GT.0) RETURN
+C
+ R4=3.4028235e+38
+ R8=1.7976931348623157D+308
+C
+C* 1.1 KEEP POINTERS TO THE BEGINING OF THE SECTION.
+C ---------------------------------------------
+ 110 CONTINUE
+C
+ IF(OMULTI) THEN
+ IF(NSUBSET.EQ.1) THEN
+ IWPTB = NWPT
+ IBPTB = NBPT
+ END IF
+ ELSE
+ IWPTB = NWPT
+ IBPTB = NBPT
+ END IF
+
+c IF(OMULTI.AND.NSUBSET.EQ.1) THEN
+ IF(NSUBSET.EQ.1) THEN
+C
+C* 1.2 PACK LENGTH OF SECTION 4.
+C -------------------------
+ 120 CONTINUE
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),0,NWPT,NBPT,24,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING LENGTH OF SECTION 4.'
+ RETURN
+ END IF
+C
+C* 1.4 PACK RESERVED BYTE.
+C -------------------
+ 140 CONTINUE
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),0,NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'ERROR PACKING RESERVED BYTE IN SECTION 4.'
+ RETURN
+ END IF
+C
+ END IF
+C -----------------------------------------------------------------
+C* 2. PACK DATA.
+C ----------
+ 200 CONTINUE
+C
+C IKK=KELEM*KSEC3(3)
+C IF(IKK.GT.JWORK) THEN
+C KERR=17
+C CALL BUERR(KERR)
+C WRITE(KNTN,*)'CHECK VALUES OF KELEM AND NUMBER OF SUBSETS KSEC3(3).'
+C RETURN
+C END IF
+C IF(IKK.GT.KVALS) THEN
+C KERR=14
+C CALL BUERR(KERR)
+C WRITE(KNTN,*)'KVALS MUST BE GREATER THAN KELEM*KSEC3(3).'
+C RETURN
+C END IF
+C
+C* 2.1 CHECK IF DATA HAS TO BE COMRESSED.
+C ----------------------------------
+ 210 CONTINUE
+C
+ IB=0
+ IF(IAND(KSEC3(4),IMASK(7)).NE.0) IB=1
+C
+C
+C ------------------------------------------------------------------
+C
+C* 3. UNCOMPRESSED DATA.
+C ------------------
+ 300 CONTINUE
+C
+ IF(IB.EQ.0) THEN
+C
+ N=KSEC3(3)
+ IF(OMULTI) N=1
+
+ DO 301 I=1,N
+C
+ IF(OMULTI) THEN
+ IM1K=(NSUBSET-1)*KELEM
+ ELSE
+ IM1K=(I-1)*KELEM
+ END IF
+C
+ DO 302 J=1,M
+C
+
+C IF(NWTR(J).EQ.31011.OR.NWTR(J).EQ.31012) THEN
+C IRP=VALUES(J+IM1K)
+C DO III=J+2,J+IRP
+C NWTDW(iii)=0
+C END DO
+C END IF
+C
+ IF(NWTDW(J).EQ.0) GO TO 302
+C
+
+ IREF =NWTRV(J)
+ ISCALE=NWTS (J)
+ IBDW =NWTDW(J)
+C
+ JI=J+IM1K
+C
+ VAL=VALUES(JI)
+ IF(NWTEN(J).EQ.-999) THEN
+ IBYTES=NWTDW(J)/8
+ IF(ABS(VAL-RVIND)/RVIND.LE.EPS) THEN
+ IF(IBYTES.EQ.4) VAL=R4
+ IF(IBYTES.EQ.8) VAL=R8
+ END IF
+ IF(IBYTES.EQ.4) THEN
+ VAL4=VAL
+ OBIG=BIG_ENDIAN()
+ IF(.NOT.OBIG) THEN
+ CALL SWAP_BYTES4(VAL4,VAL4S)
+ VAL4=VAL4S
+ END IF
+ CALL BUGBYTESR4(VAL4,ILOCVAL,0,8,0,IBYTES)
+ ELSE
+ OBIG=BIG_ENDIAN()
+ IF(.NOT.OBIG) THEN
+ CALL SWAP_BYTES8(VAL,VAL8S)
+ VAL=VAL8S
+ END IF
+ CALL BUGBYTESR8(VAL,ILOCVAL,0,8,0,IBYTES)
+ END IF
+ ISKIP=0
+ CALL BUPKS(NBPW,KBUFF(NWPT),ILOCVAL,NWPT,NBPT,8,
+ 1 ISKIP,IBYTES,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ WRITE(KNTN,*)'ERROR PACKING REAL IEEE'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 302
+ END IF
+C
+ IF(NWTEN(J).EQ.836970) THEN
+ IF(VAL.LT.0) THEN
+ IPACK=ABS(NINT(VAL))
+ IBDW1=1
+ CALL BUPCK(NBPW,KBUFF(NWPT),1,NWPT,NBPT,IBDW1,KERR)
+ IBDWM1=IBDW-1
+ CALL BUPCK(NBPW,KBUFF(NWPT),IPACK,NWPT,NBPT,IBDWM1,KERR)
+ ELSE
+ IPACK=NINT(VAL)
+ CALL BUPCK(NBPW,KBUFF(NWPT),IPACK,NWPT,NBPT,IBDW,KERR)
+ END IF
+ GO TO 302
+ END IF
+C
+ IF(NWTEN(J).EQ.658367) THEN
+ IF(ABS(VAL-RVIND)/RVIND.LE.EPS) THEN
+ YVAL=' '
+ NCHAR=NWTDW(J)
+ DO 3031 II=1,NCHAR/8
+C IPACK=ICHAR(YVAL(II:II))
+ IPACK=255
+ IF(IPACK.GT.IMAXV(8)) IPACK=IMAXV(8)
+ CALL BUPCK(NBPW,KBUFF(NWPT),IPACK,NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'ERROR PACKING ',JI,' VALUE FOR ',J,
+ 1 ' ELEMENT.'
+ RETURN
+ END IF
+ 3031 CONTINUE
+ GO TO 302
+
+ ELSE
+ IST=NINT(VAL)/1000
+ YVAL=CVALS(IST)
+ NCHAR=NWTDW(J)/8
+ DO 303 II=1,NCHAR
+ IPACK=ICHAR(YVAL(II:II))
+ IF(IPACK.GT.IMAXV(8)) IPACK=IMAXV(8)
+ CALL BUPCK(NBPW,KBUFF(NWPT),IPACK,NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'ERROR PACKING ',JI,' VALUE FOR ',J,
+ 1 ' ELEMENT.'
+ RETURN
+ END IF
+ 303 CONTINUE
+ GO TO 302
+ END IF
+ END IF
+C
+ IF(ABS(VAL-RVIND)/RVIND.LE.EPS) THEN
+ CALL BUPCK(NBPW,KBUFF(NWPT),NMASK(IBDW),NWPT,NBPT,IBDW,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'ERROR PACKING ',JI,' VALUE FOR ',J,
+ 1 ' ELEMENT.'
+ RETURN
+ END IF
+ ELSE
+C
+C CHECK VAL VALUE FOR POSSIBLE OVERFLOW
+C
+
+ IF(NOFL.EQ.1) THEN
+ IF(ABS(VAL).LT.EPS) VAL = 0.0
+ IF(VAL.GE.0) THEN
+ ICHECK=IMAXV(IBDW)
+ ICHECK=ICHECK+IREF
+ VCHECK=ICHECK*10.**(-ISCALE)
+C
+ IF(VAL .GT. VCHECK) THEN
+ WRITE(KNTN,*) 'VALUE=',VAL,'TOO BIG FOR ',
+ 1 J,' ELEMENT ',I,' SUBSET.'
+ VAL=VCHECK+1.
+ END IF
+ ELSE
+ VCHECK=IREF/10.**ISCALE
+ IF(VAL.LT.VCHECK) THEN
+ WRITE(KNTN,*)'VALUE=',VAL,'TOO BIG NEGATIVE FOR ',
+ 1 J,' ELEMENT ',I,' SUBSET.'
+ VAL=IREF/10.**ISCALE-1.
+ END IF
+ END IF
+ END IF
+
+ IF(ISCALE.LT.0) THEN
+ ISCALE=IABS(ISCALE)
+ IPACK=NINT(VAL/10.**ISCALE) - IREF
+ ELSE
+ IPACK=NINT(VAL*10.**ISCALE) - IREF
+ END IF
+C
+C CHECK IF VALUE TO BE PACKED NEGATIVE
+C
+ IF(IPACK.LT.0) THEN
+ KERR=-33
+ WRITE(KNTN,*)'BUENS4:'
+ WRITE(KNTN,*)'VALUE ',IPACK,' IS NEGATIVE'
+ WRITE(KNTN,*)'PROBABLY REFERENCE VALUE TOO BIG.'
+ WRITE(KNTN,*)J,' ELEMENT = ',NWTR(J),
+ 1 ' REFERENCE VALUE = ',IREF
+ IPACK=0
+ WRITE(KNTN,*)'ELEMENT VALUE PACKED AS',IREF
+ END IF
+C
+C* CHECK IF VALUE TO BE PACKED TOO BIG.
+C
+ IF(IPACK.GT.IMAXV(IBDW)) THEN
+C
+ IF(NPMISS.EQ.0) THEN
+ KERR=-28
+ WRITE(KNTN,*)'VALUE ',IPACK,' TOO BIG.'
+ WRITE(KNTN,*)'VALUE FOR ',J,' ELEMENT AND ',I,
+ 1 ' SUBSET'
+ WRITE(KNTN,*)'PACKED AS MISSING VALUE FOR',
+ 1 ' DATA WIDTH -1.'
+ IPACK=IMAXV(IBDW)-1
+ ELSE
+C
+C ALL ELEMENTS IN CLASS 1 TO 9 MUST BE CORRECT
+C
+ IF(NWTR(J).GE.31000.AND.NWTR(J).LE.31012) THEN
+ WRITE(KNTN,*)'VALUE ',IPACK,' TOO BIG.'
+ WRITE(KNTN,*)'VALUE FOR ',J,' ELEMENT AND ',I,
+ 1 ' SUBSET'
+ KERR=28
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ KERR=-28
+ WRITE(KNTN,*)'VALUE ',IPACK,' TOO BIG.'
+ WRITE(KNTN,*)'VALUE FOR ',J,' ELEMENT AND ',I,
+ 1 ' SUBSET'
+ WRITE(KNTN,*)'PACKED AS MISSING VALUE FOR',
+ 1 ' DATA WIDTH.'
+ IPACK=IMAXV(IBDW)
+ END IF
+ END IF
+ CALL BUPCK(NBPW,KBUFF(NWPT),IPACK,NWPT,NBPT,IBDW,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'ERROR PACKING ',JI,' VALUE FOR ',J,
+ 1 ' ELEMENT.'
+ WRITE(KNTN,*)'VALUE ',IPACK,' DATA WIDTH ',IBDW,
+ 1 ' BITS'
+ RETURN
+ END IF
+ END IF
+C
+ 302 CONTINUE
+ 301 CONTINUE
+C
+ NWP=NWPT
+ NBP=NBPT
+ END IF
+C
+C* 4. COMPRESS DATA.
+C --------------
+ 400 CONTINUE
+C
+ IF(IB.EQ.1) THEN
+ DO 402 J=1,M
+C
+ IF(NWTDW(J).EQ.0) GO TO 402
+C
+ IREF =NWTRV(J)
+ ISCALE=NWTS (J)
+ IBDW =NWTDW(J)
+C
+ DO 401 I=1,KSEC3(3)
+C
+ JI=J+(I-1)*KELEM
+C
+ IF(NWTEN(J).EQ.658367) THEN
+ IVALS(JI)=VALUES(JI)
+ GO TO 401
+ END IF
+C
+ IF(NWTEN(J).EQ.-999) THEN
+ IF(NWTDW(J).EQ.32) THEN
+ IF(ABS(VALUES(JI)-RVIND)/RVIND.LT.EPS) THEN
+ RVALS4(JI)=R4
+ ELSE
+ RVALS4(JI)=VALUES(JI)
+ END IF
+ ELSE
+ IF(ABS(VALUES(JI)-RVIND)/RVIND.LT.EPS) THEN
+ RVALS(JI)=R8
+ ELSE
+ RVALS(JI)=VALUES(JI)
+ END IF
+ END IF
+ GO TO 401
+ END IF
+C
+ IF(NWTEN(J).EQ.836970) THEN
+ ISG_REF=0
+ IF(VALUES(JI).LT.0) ISG_REF=1
+ IVALS(JI)=IABS(NINT(VALUES(JI)))
+ GO TO 401
+ END IF
+C
+ IF(ABS(VALUES(JI)-RVIND)/RVIND.LE.EPS) THEN
+ IVALS(JI)=NMASK(IBDW)
+ ELSE
+ IF(NOFL.EQ.1) THEN
+ IF(VALUES(JI).GE.0) THEN
+ ICHECK=IMAXV(IBDW)
+ ICHECK=ICHECK+IREF
+ VCHECK=ICHECK*10.**(-ISCALE)
+C
+ IF(VALUES(JI) .GT. VCHECK) THEN
+ WRITE(KNTN,*) 'VALUE=',VALUES(JI),'TOO BIG FOR ',
+ 1 J,' ELEMENT AND ',I,' SUBSET.'
+ VALUES(JI)=VCHECK+1.
+ END IF
+ ELSE
+ VCHECK=IREF/10.**ISCALE
+ IF(VALUES(JI).LT.VCHECK) THEN
+ WRITE(KNTN,*) 'VALUE=',VALUES(JI),
+ 1 'TOO BIG NEGATIVE FOR ',
+ 1 J,' ELEMENT AND ',I,' SUBSET.'
+ VALUES(JI)=IREF/10.**ISCALE-1.
+ END IF
+ END IF
+ END IF
+C
+ IF(ISCALE.LT.0) THEN
+ ISCAL=IABS(ISCALE)
+ IPACK=NINT(VALUES(JI)/10.**ISCAL ) - IREF
+ ELSE
+ IPACK=NINT(VALUES(JI)*10.**ISCALE) - IREF
+ END IF
+C
+ IF(IPACK.LT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ KERR=-33
+ WRITE(KNTN,*)'VALUE ',IPACK,' IS NEGATIVE'
+ WRITE(KNTN,*)'PROBABLY REFERENCE VALUE TOO BIG.'
+ WRITE(KNTN,*)J,'ELEMENT = ',NWTR(J),
+ 1 ' REFERENCE VALUE = ',IREF
+ IPACK=0
+ WRITE(KNTN,*)'ELEMENT PACKED AS',IREF
+ END IF
+C
+C REPLACE IPACK VALUE WITH MISSING VALUE FOR IBDW -1
+C IF GREATER THEN MAXIMUM ALLOWED.
+C
+ IF(IPACK.GT.IMAXV(IBDW)) THEN
+C
+ IF(NPMISS.EQ.0) THEN
+ KERR=-28
+ WRITE(KNTN,*)'VALUE ',IPACK,' TOO BIG.'
+ WRITE(KNTN,*)'VALUE FOR ',J,' ELEMENT AND ',I,
+ 1 ' SUBSET'
+ WRITE(KNTN,*)'PACKED AS MISSING VALUE FOR DATA ',
+ 1 'WIDTH -1.'
+ IPACK=IMAXV(IBDW)-1
+ ELSE
+C
+C ALL ELEMENTS IN CLASS 1 TO 9 MUST BE CORRECT
+C
+ IF(NWTR(J).GE.31000.AND.NWTR(J).LE.31012) THEN
+ KERR=28
+ CALL BUERR(KERR)
+ WRITE(KNTN,*)'VALUE ',IPACK,' TOO BIG.'
+ WRITE(KNTN,*)'VALUE FOR ',J,' ELEMENT AND ',I,
+ 1 ' SUBSET'
+ RETURN
+ END IF
+C
+ KERR=-28
+ WRITE(KNTN,*)'VALUE ',IPACK,' TOO BIG.'
+ WRITE(KNTN,*)'VALUE FOR ',J,' ELEMENT AND ',I,
+ 1 ' SUBSET'
+ WRITE(KNTN,*)'PACKED AS MISSING VALUE.'
+ IPACK=IMAXV(IBDW)
+ END IF
+ END IF
+ IVALS(JI)=IPACK
+C
+ END IF
+C
+ 401 CONTINUE
+ 402 CONTINUE
+C
+C* 4.1 CHECK IF ALL VALUES ARE MISSING.
+C
+ 410 CONTINUE
+C
+ DO 411 I=1,M
+C
+ IF(NWTDW(I).EQ.0) GO TO 411
+ IBDW =NWTDW(I)
+C
+ OMIS=.TRUE.
+ IF(NWTEN(I).EQ.658367) THEN
+ OMIS=.FALSE.
+ ELSEIF(NWTEN(I).EQ.-999) THEN
+ OMIS=.FALSE.
+ ELSE
+ DO 412 J=1,KSEC3(3)
+ IJ=I+(J-1)*KELEM
+ IF(IVALS(IJ).NE.NMASK(IBDW)) THEN
+ OMIS=.FALSE.
+ END IF
+ 412 CONTINUE
+ END IF
+C
+ IF(.NOT.OMIS) THEN
+C
+ IF(NWTEN(I).NE.658367.AND.NWTEN(I).NE.-999) THEN
+C
+C FIND MINIMUM VALUE FOR ELEMENT
+C
+ MIN=IVALS(I)
+ DO 413 J=1,KSEC3(3)
+ IJ=I+(J-1)*KELEM
+ IF(IVALS(IJ).LT.MIN) MIN=IVALS(IJ)
+ 413 CONTINUE
+C
+C FIND INCREMENTS
+C
+ DO 414 J=1,KSEC3(3)
+ IJ=I+(J-1)*KELEM
+ INC(J)=IVALS(IJ)-MIN
+ IF(IVALS(IJ).EQ.NMASK(IBDW)) INC(J)=NVIND
+ 414 CONTINUE
+C
+C FIND NUMBER OF BITS NEEDED FOR MAX VALUE OF INCREMENT
+C
+ MAX=0
+ DO 415 J=1,KSEC3(3)
+ IF(INC(J).NE.NVIND.AND.INC(J).GT.MAX) MAX=INC(J)
+ 415 CONTINUE
+C
+C CHECK IF ALL INCREMENTS ARE ZERO
+C
+ INC0=0
+ DO 419 J=1,KSEC3(3)
+ IF(INC(J).NE.0) INC0=1
+ 419 CONTINUE
+C
+C FIND NUMBER OF BITS NEEDED
+C
+ IF(INC0.NE.0) THEN
+ MAX=MAX+1
+ DO 416 J=1,32
+ IR=MAX/2
+ IF(IR.EQ.0) GO TO 417
+ MAX=IR
+ 416 CONTINUE
+C
+ END IF
+C
+ 417 CONTINUE
+C
+ INCBIT=0
+ IF(INC0.NE.0) INCBIT=J
+C
+C REPLACE MISSING VALUES FOR INCREMENT BY ALL BITS SET TO 1.
+C
+ DO 418 J=1,KSEC3(3)
+ IF(INC(J).EQ.NVIND) INC(J)=NMASK(INCBIT)
+ 418 CONTINUE
+ END IF
+ END IF
+C
+C* 4.2 PACK DATA IN COMPRESSED FORM.
+C -----------------------------
+ 420 CONTINUE
+C
+ IF(NWTEN(I).EQ.658367) THEN
+C
+ OSTRING=.TRUE.
+ JI1=I
+ IST1=IVALS(JI1)/1000
+ ICS=NWTDW(I)/8
+C ICS=NINT(VALUES(JI1))-IST1*1000
+ NCSMAX=ICS
+ DO IX=ICS,1,-1
+ IF(CVALS(IST1)(IX:IX).NE.' ') THEN
+ NCS=IX
+ GO TO 522
+ END IF
+ END DO
+
+ 522 NCSMAX=NCS
+ DO J=2,KSEC3(3)
+ JI=I+(J-1)*KELEM
+ IST=VALUES(JI)/1000
+ IF(CVALS(IST1).NE.CVALS(IST)) OSTRING=.FALSE.
+C FIND MAX SIZE OF STRINGS
+ ICS=NWTDW(I)/8
+C ICS=NINT(VALUES(JI))-IST*1000
+ DO IX=ICS,1,-1
+ IF(CVALS(IST)(IX:IX).NE.' ') THEN
+ NCS=IX
+ GO TO 521
+ END IF
+ END DO
+ 521 CONTINUE
+ IF(NCS.GT.NCSMAX) NCSMAX=NCS
+ END DO
+
+C
+ IF(OSTRING) THEN
+C
+ INCHAR=NWTDW(I)/8
+ ISKIP=0
+ DO II=1,INCHAR
+ IPACK=ICHAR(CVALS(IST1)(II:II))
+ CALL BUPCK(NBPW,KBUFF(NWPT),IPACK,NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END DO
+ IPACK=0
+ CALL BUPCK(NBPW,KBUFF(NWPT),IPACK,NWPT,NBPT,6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ ELSE
+C
+C PACK LOCAL REFERENCE VALUE FOR ELEMENT
+C
+ INCHAR=NWTDW(I)/8
+ ISKIP=0
+ CALL BUPKS(NBPW,KBUFF(NWPT),ILOCVAL,NWPT,NBPT,8,
+ 1 ISKIP,INCHAR,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ WRITE(KNTN,*)'ERROR PACKING LOCAL REFERENCE VALUE'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+C PACK NUMBER OF BITS FOR INCREMENTS/NUMBER OF CHARACTERS
+C
+C CALL BUPCK(NBPW,KBUFF(NWPT),INCHAR,NWPT,NBPT,6,KERR)
+ CALL BUPCK(NBPW,KBUFF(NWPT),NCSMAX,NWPT,NBPT,6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ WRITE(KNTN,*)'ERROR PACKING NUMBER OF BITS FOR INCREMENTS'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+C PACK INCREMENTS
+C
+ DO 421 J=1,KSEC3(3)
+C
+ JI=I+(J-1)*KELEM
+C
+ IST=IVALS(JI)/1000
+ YVAL=CVALS(IST)
+C
+ DO 423 II=1,NCSMAX
+ IPACK=ICHAR(YVAL(II:II))
+ CALL BUPCK(NBPW,KBUFF(NWPT),IPACK,NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ 423 CONTINUE
+C
+ 421 CONTINUE
+C
+ END IF
+ ELSEIF(NWTEN(I).EQ.-999) THEN
+C
+ OEQUAL=.TRUE.
+ DO J=1,KSEC3(3)-1
+ JI=I+(J-1)*KELEM
+ JII=I+J*KELEM
+ IF(NWTDW(I).EQ.32) THEN
+ IF(ABS(RVALS4(JI)-RVALS4(JII))/RVALS4(JII).GT.EPS) THEN
+ OEQUAL=.FALSE.
+ GO TO 4444
+ END IF
+
+ ELSE
+ IF(ABS(RVALS(JI)-RVALS(JII))/RVALS(JII).GT.EPS) THEN
+ OEQUAL=.FALSE.
+ GO TO 4444
+ END IF
+ END IF
+ END DO
+C
+C PACK LOCAL REFERENCE VALUE FOR ELEMENT
+C
+4444 INCHAR=NWTDW(I)/8
+ ISKIP=0
+
+ IF(.NOT.OEQUAL) THEN
+C
+ CALL BUPKS(NBPW,KBUFF(NWPT),ILOCVAL,NWPT,NBPT,8,
+ 1 ISKIP,INCHAR,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ WRITE(KNTN,*)'ERROR PACKING LOCAL REFERENCE VALUE'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+C PACK NUMBER OF BITS FOR INCREMENTS/NUMBER OF CHARACTERS
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),INCHAR,NWPT,NBPT,6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ WRITE(KNTN,*)'ERROR PACKING NUMBER OF BITS
+ 1 FOR INCREMENTS'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+C PACK INCREMENTS
+C
+ DO J=1,KSEC3(3)
+C
+ JI=I+(J-1)*KELEM
+C
+ IF(NWTDW(I).EQ.32) THEN
+ VAL4=RVALS4(JI)
+ CALL BUGBYTESR4(VAL4,IIVALS,0,8,0,INCHAR)
+ ELSE
+ VAL=RVALS(JI)
+ CALL BUGBYTESR8(VAL,IIVALS,0,8,0,INCHAR)
+ END IF
+C
+ DO IZ=1,INCHAR
+ IPACK=IIVALS(IZ)
+ CALL BUPCK(NBPW,KBUFF(NWPT),IPACK,NWPT,NBPT,8,KERR)
+ END DO
+C
+ END DO
+
+ ELSE
+
+ IBYTES=NWTDW(I)/8
+ IF(IBYTES.EQ.4) THEN
+ VAL4=RVALS4(I)
+ OBIG=BIG_ENDIAN()
+ IF(.NOT.OBIG) THEN
+ CALL SWAP_BYTES4(VAL4,VAL4S)
+ VAL4=VAL4S
+ END IF
+ CALL BUGBYTESR4(VAL4,ILOCVAL,0,8,0,IBYTES)
+ ELSE
+ VAL=RVALS(I)
+ OBIG=BIG_ENDIAN()
+ IF(.NOT.OBIG) THEN
+ CALL SWAP_BYTES8(VAL,VAL8S)
+ VAL=VAL8S
+ END IF
+ CALL BUGBYTESR8(VAL,ILOCVAL,0,8,0,IBYTES)
+ END IF
+ ISKIP=0
+ CALL BUPKS(NBPW,KBUFF(NWPT),ILOCVAL,NWPT,NBPT,8,
+ 1 ISKIP,IBYTES,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ WRITE(KNTN,*)'ERROR PACKING REAL IEEE'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),0,NWPT,NBPT,6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ WRITE(KNTN,*)'ERROR PACKING NUMBER OF BITS FOR'
+ WRITE(KNTN,*)'INCREMENTS FOR ',I,' ELEMENT.'
+ RETURN
+ END IF
+
+ END IF
+C
+ 4211 CONTINUE
+C
+ ELSE
+ IF(OMIS) THEN
+C
+C PACK LOCAL REFERENCE VALUE FOR ELEMENT SET TO MISSING VALUE.
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),NMASK(IBDW),NWPT,NBPT,
+ 1 IBDW,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ WRITE(KNTN,*)'ERROR PACKING LOCAL REFERENCE VALUE '
+ WRITE(KNTN,*)I,' ELEMENT.'
+ RETURN
+ END IF
+C
+C PACK NUMBER OF BITS FOR INCREMENTS (SET TO ZERO)
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),0,NWPT,NBPT,6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ WRITE(KNTN,*)'ERROR PACKING NUMBER OF BITS FOR'
+ WRITE(KNTN,*)'INCREMENTS FOR ',I,' ELEMENT.'
+ RETURN
+ END IF
+C
+ ELSE
+C
+ IF(INCBIT.EQ.0) THEN
+C
+C
+C PACK LOCAL REFERENCE VALUE FOR ELEMENT
+C
+ IF(NWTEN(I).EQ.836970) THEN
+ IF(ISG_REF.EQ.1) THEN
+ CALL BUPCK(NBPW,KBUFF(NWPT),1,NWPT,NBPT,1,KERR)
+ CALL BUPCK(NBPW,KBUFF(NWPT),MIN,NWPT,NBPT,IBDW-1,
+ 1 KERR)
+ ELSE
+ CALL BUPCK(NBPW,KBUFF(NWPT),MIN,NWPT,NBPT,IBDW,
+ 1 KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ WRITE(KNTN,*)'ERROR PACKING LOCAL REFERENCE VALUE'
+ WRITE(KNTN,*)'FOR ',I,' ELEMENT IN ',IBDW,' BITS.'
+ RETURN
+ END IF
+ END IF
+ ELSE
+ CALL BUPCK(NBPW,KBUFF(NWPT),MIN,NWPT,NBPT,IBDW,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ WRITE(KNTN,*)'ERROR PACKING LOCAL REFERENCE VALUE'
+ WRITE(KNTN,*)'FOR ',I,' ELEMENT IN ',IBDW,' BITS.'
+ RETURN
+ END IF
+ ENDIF
+C
+C PACK NUMBER OF BITS FOR INCREMENTS
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),INCBIT,NWPT,NBPT,6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ WRITE(KNTN,*)'ERROR PACKING NUMBER OF BITS FOR'
+ WRITE(KNTN,*)'INCREMENTS FOR ',I,' ELEMENT.'
+ RETURN
+ END IF
+C
+ ELSE
+C
+C PACK LOCAL REFERENCE VALUE FOR ELEMENT
+C
+ IF(NWTEN(I).EQ.836970) THEN
+ IF(ISG_REF.EQ.1) THEN
+ CALL BUPCK(NBPW,KBUFF(NWPT),1,NWPT,NBPT,1,KERR)
+ CALL BUPCK(NBPW,KBUFF(NWPT),MIN,NWPT,NBPT,
+ 1 IBDW-1,KERR)
+ ELSE
+ CALL BUPCK(NBPW,KBUFF(NWPT),MIN,NWPT,NBPT,IBDW,
+ 1 KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ WRITE(KNTN,*)'ERROR PACKING LOCAL REFERENCE VALUE'
+ WRITE(KNTN,*)'FOR ',I,' ELEMENT IN ',IBDW,' BITS.'
+ RETURN
+ END IF
+ END IF
+ ELSE
+ CALL BUPCK(NBPW,KBUFF(NWPT),MIN,NWPT,NBPT,IBDW,
+ 1 KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ WRITE(KNTN,*)'ERROR PACKING LOCAL REFERENCE VALUE'
+ WRITE(KNTN,*)'FOR ',I,' ELEMENT IN ',IBDW,' BITS.'
+ RETURN
+ END IF
+ ENDIF
+
+C
+C PACK NUMBER OF BITS FOR INCREMENTS
+C
+ CALL BUPCK(NBPW,KBUFF(NWPT),INCBIT,NWPT,NBPT,6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*)'BUENS4 :'
+ WRITE(KNTN,*)'ERROR PACKING NUMBER OF BITS FOR'
+ WRITE(KNTN,*) 'INCREMENTS FOR ',I,' ELEMENT.'
+ RETURN
+ END IF
+C
+C PACK INCREMENTS
+C
+ CALL BUPKS(NBPW,KBUFF(NWPT),INC,NWPT,NBPT,
+ 1 INCBIT,0,KSEC3(3),KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'BUENS4 :'
+ WRITE(KNTN,*) 'ERROR PACKING INCREMENTS FOR',I,
+ 1 ' ELEMENT'
+ RETURN
+ END IF
+C
+ END IF
+ END IF
+ END IF
+C
+ 411 CONTINUE
+C
+ END IF
+C
+C* 5. SET UP LENGTH OF THE SECTION 4.
+C --------------------------------
+ 500 CONTINUE
+C
+ IF(OMULTI) THEN
+ IF(NSUBSET.EQ.KSEC3(3)) THEN
+ CALL BUOCTN(IWPTB,IBPTB,KBUFL,KBUFF,KERR)
+ IF(KERR.GT.0) THEN
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+ ELSE
+ CALL BUOCTN(IWPTB,IBPTB,KBUFL,KBUFF,KERR)
+ IF(KERR.GT.0) THEN
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+C
+C ------------------------------------------------------------------
+ RETURN
+ END
diff --git a/bufrdc/buens5.F b/bufrdc/buens5.F
new file mode 100755
index 0000000..c33ba52
--- /dev/null
+++ b/bufrdc/buens5.F
@@ -0,0 +1,207 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUENS5( KSEC0,KSEC1,KBUFL,KBUFF,KERR)
+C
+C
+C
+C
+C PURPOSE.
+C --------
+C PACK SECTION 5 OF BUFR MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUENS5( KSEC0,KSEC1,KBUFL,KBUFF,KERR)*
+C
+C INPUT :
+C *KSEC0* - ARRAY CONTAINING SECTION 0 INFORMATION
+C KSEC0( 1)-- LENGTH OF SECTION 0 (BYTES)
+C KSEC0( 2)-- TOTAL LENGTH OF BUFR MESSAGE (BYTES)
+C KSEC0( 3)-- BUFR EDITION NUMBER
+C *KSEC1* - INTEGER ARRAY OF AT LEAST 40 WORDS
+C CONTAINING BUFR SECTION 1 INFORMATION
+C KSEC1( 1)-- LENGTH OF SECTION 1 (BYTES)
+C KSEC1( 2)-- BUFR EDITION NUMBER
+C KSEC1( 3)-- ORIGINATING CENTRE
+C KSEC1( 4)-- UPDATE SEQUENCE NUMBER
+C KSEC1( 5)-- FLAG (PRESENCE OF SECTION 2)
+C KSEC1( 6)-- BUFR MESSAGE TYPE
+C KSEC1( 7)-- BUFR MESSAGE SUBTYPE
+C KSEC1( 8)-- VERSION NUMBER OF LOCAL TABLE USED
+C KSEC1( 9)-- YEAR
+C KSEC1(10)-- MONTH
+C KSEC1(11)-- DAY
+C KSEC1(12)-- HOUR
+C KSEC1(13)-- MINUTE
+C KSEC1(14)-- BUFR MASTER TABLE
+C KSEC1(15)-- VERSION NUMBER OF MASTER TABLE USED
+C KSEC1(16) - KSEC1(40) -- LOCAL ADP CENTRE
+C INFORMATION(BYTE BY BYTE)
+C
+C FOR BUFR EDITION 3 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- NOT USED
+C KSEC1(18) TO KSEC1(JSEC1) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 4 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- INTERNATIONAL SUB-CATEGORY (SEE COMMON TABLE C-13
+C KSEC1(18)-- SECOND
+C KSEC1(19)-- YEAR
+C KSEC1(20)-- MONTH
+C KSEC1(21)-- DAY
+C KSEC1(22)-- HOUR
+C KSEC1(23)-- MINUTE
+C KSEC1(24)-- SECOND
+C KSEC1(25)-- YEAR
+C KSEC1(26)-- MONTH
+C KSEC1(27)-- DAY
+C KSEC1(28)-- HOUR
+C KSEC1(29)-- MINUTE
+C KSEC1(30)-- SECOND
+C KSEC1(31)-- MOST SOUTHERN LATITUDE (-90 to 90)
+C KSEC1(32)-- MOST WESTERN LONGITUDE ( 0-360)
+C KSEC1(33)-- MOST NORTHEN LATITUDE (-90 to 90)
+C KSEC1(34)-- MOST EASTERN LONGITUDE ( 0-360)
+C KSEC1(35) TO KSEC1(JSEC1) - LOCAL ADP CENTRE INFORMATION(PACKED FORM)
+C
+C
+C OUTPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C --------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C BUPKS - PACK BIT PATHERN IN REPEATED WAY
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/09/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+# include "bcprq.F"
+C
+ DIMENSION KBUFF(KBUFL)
+ DIMENSION IBUFR(4)
+ DIMENSION KSEC0(JSEC0),KSEC1(JSEC1)
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+C
+ DATA IBUFR/55,55,55,55/
+C
+C ------------------------------------------------------------------
+C* 1. EXPAND SECTION 5.
+C -----------------
+ 100 CONTINUE
+C
+ IF( KERR.GT.0 ) RETURN
+C
+C* 1.2 PACK LAST FOUR OCTETS CONTAINING '7777'.
+C ----------------------------------------
+C
+ CALL BUPKS(NBPW,KBUFF(NWPT),IBUFR,NWPT,NBPT,8,0,4,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C* 1.3 SET TOTAL LENGTH OF BUFR MESSAGE.
+C ---------------------------------
+ 130 CONTINUE
+C
+ IBYTES=(NWPT-1)*NBPW/8+NBPT/8
+ IWORDS=IBYTES*8/NBPW
+ IF(IWORDS*NBPW.LT.IBYTES*8) IWORDS=IWORDS+1
+ KBUFL =IWORDS
+C
+C* 1.4 SET TOTAL LENGTH OF BUFR MESSAGE IN SECTION 0.
+C ----------------------------------------------
+ 140 CONTINUE
+C
+ KSEC0(2)=IBYTES
+C
+ IF(KSEC0(3).GT.1) THEN
+C
+C FOR BUFR EDITION 2 LENGTH OF MESSAGE STARTS AT 5 TH BYTE.
+C
+ IWPT= 32/NBPW + 1
+ IBPT= 32 - (IWPT-1)* NBPW
+C
+ CALL BUPCK(NBPW,KBUFF(IWPT),IBYTES,IWPT,IBPT,24,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING TOTAL LENGTH OF BUFR MESSAGE
+ 1 IN SECTION 0.'
+ END IF
+ END IF
+C
+C* 1.5 SET TOTAL BUFR LENGTH IN SECTION 2
+C
+ 150 CONTINUE
+C
+C RDB KEY PACKED ONLY FOR ECMWF DATA AND SECTION 2 PRESENT.
+C
+ IF(NOKEY.EQ.0.AND.KSEC1(5).NE.0) THEN
+ IBTS=4
+ IF(KSEC0(3).GT.1) IBTS=8
+C
+C SIZE OF SECTION 0 AND 1 PLUS 36 BYTES FROM BEGINING
+C OF SECTION 2.
+C
+ IBTS=IBTS+KSEC1(1)+36
+ IBIT=IBTS*8
+C
+ IWPT= IBIT/NBPW + 1
+ IBPT= IBIT - (IWPT-1)* NBPW
+C
+ IF(IBYTES .GT. 65535 ) IBYTES=65535
+C
+ CALL BUPCK(NBPW,KBUFF(IWPT),IBYTES,IWPT,IBPT,16,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING TOTAL LENGTH OF BUFR MESSAGE
+ 1 IN SECTION 2.'
+ END IF
+ END IF
+C
+ RETURN
+ END
diff --git a/bufrdc/buepmrk.F b/bufrdc/buepmrk.F
new file mode 100755
index 0000000..11ab730
--- /dev/null
+++ b/bufrdc/buepmrk.F
@@ -0,0 +1,661 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUEPMRK(KSEC3,KVALS,VALUES,KELEM,KERR)
+C
+C**** *BUEPMRK*
+C
+C
+C PURPOSE.
+C --------
+C
+C PROCESS MARKER OPERATOR, RELACING IT WITH CORRESPONDING
+C TABLE B ELEMENT DESCRIPTOR.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUEPMRK(KSEC3,KVALS,VALUES,KELEM,KERR)*
+C
+C INPUT :
+C *KSEC3* - ARRAY CONTAINING SECTION 3 INFORMATION
+C KSEC3( 1)-- LENGTH OF SECTION 3 (BYTES)
+C KSEC3( 2)-- RESERVED
+C KSEC3( 3)-- NUMBER OF SUBSETS
+C KSEC3( 4)-- FLAG (DATA TYPE,DATA
+C COMPRESSION)
+C *KVALS* - DIMENSION OF VALUES ARRAY
+C *VALUES* - ARAY CONTAINING DATA
+C *KELEM* - DIMENSION OF CNAMES, CUNITS ARRAY
+C OUTPUT:
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C BUNPCK - UNPACKS BIT PATTERN
+C BUNPKS - UNPACKS BIT PATTERN IN REPEATED WAY
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C M. DRAGOSAVAC 1/10/92 :
+C
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+# include "bcmbef.F"
+# include "bcmwt.F"
+# include "bcmwtc.F"
+# include "bcmrq.F"
+C
+ CHARACTER CWTEN*64,CWTU*24
+ DIMENSION KSEC3(JSEC3)
+#ifndef R_4
+ REAL*8 VALUES(KVALS)
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL VALUES(KVALS)
+ REAL RVIND
+ REAL EPS
+#endif
+C
+ DIMENSION IMASK(8)
+ DATA IMASK/1,2,4,8,16,32,64,128/
+C
+C ------------------------------------------------------------------
+C* 1. FINED OPERATOR 223000 TO 237255.
+C --------------------------------
+ 100 CONTINUE
+C
+ IF(KERR.GT.0) RETURN
+C
+C
+C 1.1 CHECK IF DATA ARE COMRESSED.
+C ----------------------------
+ 110 CONTINUE
+C
+ IB=0
+ IF(IAND(KSEC3(4),IMASK(7)).NE.0) IB=1
+C
+C* 1.2 FIND POSITION OF OPREATORS.
+C ---------------------------
+ 120 CONTINUE
+C
+ DO 121 J=1,M
+C
+ NR223=0
+ NR224=0
+ NR225=0
+ NR232=0
+C
+C
+ IF(NWTR(J).EQ.222000) THEN
+C
+C SET POINTER TO THE LAST DATA ELEMENT
+C
+ IF(MREL.EQ.0) MREL=J-1
+C
+C
+C CHECK IF BACKWARD REFERENCE BIT MAP DEFINED
+C
+ IF(NWTR(J+1).EQ.236000) THEN
+ NP236000=J+1
+ OBF=.TRUE.
+ J2=J+2
+C
+C DELAYED REPLICATION FACTOR CAN FOLLOW 236000
+C
+ IF(NWTR(J2).EQ.031001.OR.NWTR(J2).EQ.031000.OR.
+ 1 NWTR(J2).EQ.031002) J2=J+3
+C
+ DO 122 I=J2,M
+ IF(NWTR(I).EQ.031031) THEN
+C
+C FIND FIRST POINTER TO DATA PRESENT INDICATOR
+C
+ IF(OBF) MBMP=I
+ OBF=.FALSE.
+ ELSE
+C
+C LAST POINTER TO DATA PRESENT INDICATOR
+C
+ MBMPL=I-1
+ GO TO 121
+ END IF
+ 122 CONTINUE
+ END IF
+ END IF
+ IF(NWTR(J).EQ.223000) THEN
+C
+C SET POINTER TO THE LAST DATA ELEMENT
+C
+ IF(MREL.EQ.0) MREL=J-1
+C
+ NP223000=J
+C
+C CHECK IF BACKWARD REFERENCE BIT MAP DEFINED
+C
+ IF(NWTR(J+1).EQ.236000) THEN
+ NP236000=J+1
+ OBF=.TRUE.
+ J2=J+2
+C
+C DELAYED REPLICATION FACTOR CAN FOLLOW 236000
+C
+ IF(NWTR(J2).EQ.031001.OR.NWTR(J2).EQ.031000.OR.
+ 1 NWTR(J2).EQ.031002) J2=J+3
+C
+ DO 123 I=J2,M
+ IF(NWTR(I).EQ.031031) THEN
+C
+C FIND FIRST POINTER TO DATA PRESENT INDICATOR
+C
+ IF(OBF) MBMP=I
+ OBF=.FALSE.
+ ELSE
+C
+C LAST POINTER TO DATA PRESENT INDICATOR
+C
+ MBMPL=I-1
+ GO TO 200
+ END IF
+ 123 CONTINUE
+ END IF
+ GO TO 200
+ END IF
+ IF(NWTR(J).EQ.224000) THEN
+C
+C SET POINTER TO THE LAST DATA ELEMENT
+C
+ IF(MREL.EQ.0) MREL=J-1
+C
+ NP224000=J
+C
+C CHECK IF BACKWARD REFERENCE BIT MAP DEFINED
+C
+ IF(NWTR(J+1).EQ.236000) THEN
+ NP236000=J+1
+ OBF=.TRUE.
+ J2=J+2
+C
+C DELAYED REPLICATION FACTOR CAN FOLLOW 236000
+C
+ IF(NWTR(J2).EQ.031001.OR.NWTR(J2).EQ.031000.OR.
+ 1 NWTR(J2).EQ.031002) J2=J+3
+C
+ DO 124 I=J2,M
+ IF(NWTR(I).EQ.031031) THEN
+C
+C FIND FIRST POINTER TO DATA PRESENT INDICATOR
+C
+ IF(OBF) MBMP=I
+ OBF=.FALSE.
+ ELSE
+C
+C LAST POINTER TO DATA PRESENT INDICATOR
+C
+ MBMPL=I-1
+ GO TO 300
+ END IF
+ 124 CONTINUE
+ END IF
+ GO TO 300
+ END IF
+ IF(NWTR(J).EQ.225000) THEN
+C
+C SET POINTER TO THE LAST DATA ELEMENT
+C
+ IF(MREL.EQ.0) MREL=J-1
+C
+ NP225000=J
+C
+C CHECK IF BACKWARD REFERENCE BIT MAP DEFINED
+C
+ IF(NWTR(J+1).EQ.236000) THEN
+ NP236000=J+1
+ OBF=.TRUE.
+ J2=J+2
+C
+C DELAYED REPLICATION FACTOR CAN FOLLOW 236000
+C
+ IF(NWTR(J2).EQ.031001.OR.NWTR(J2).EQ.031000.OR.
+ 1 NWTR(J2).EQ.031002) J2=J+3
+C
+ DO 125 I=J2,M
+ IF(NWTR(I).EQ.031031) THEN
+C
+C FIND FIRST POINTER TO DATA PRESENT INDICATOR
+C
+ IF(OBF) MBMP=I
+ OBF=.FALSE.
+ ELSE
+C
+C LAST POINTER TO DATA PRESENT INDICATOR
+C
+ MBMPL=I-1
+ GO TO 400
+ END IF
+ 125 CONTINUE
+ END IF
+ GO TO 400
+ END IF
+ IF(NWTR(J).EQ.232000) THEN
+C
+C SET POINTER TO THE LAST DATA ELEMENT
+C
+ IF(MREL.EQ.0) MREL=J-1
+C
+ NP232000=J
+C
+C CHECK IF BACKWARD REFERENCE BIT MAP DEFINED
+C
+ IF(NWTR(J+1).EQ.236000) THEN
+ NP236000=J+1
+ OBF=.TRUE.
+ J2=J+2
+C
+C DELAYED REPLICATION FACTOR CAN FOLLOW 236000
+C
+ IF(NWTR(J2).EQ.031001.OR.NWTR(J2).EQ.031000.OR.
+ 1 NWTR(J2).EQ.031002) J2=J+3
+C
+ DO 126 I=J2,M
+ IF(NWTR(I).EQ.031031) THEN
+C
+C FIND FIRST POINTER TO DATA PRESENT INDICATOR
+C
+ IF(OBF) MBMP=I
+ OBF=.FALSE.
+ ELSE
+C
+C LAST POINTER TO DATA PRESENT INDICATOR
+C
+ MBMPL=I-1
+ GO TO 500
+ END IF
+ 126 CONTINUE
+ END IF
+ GO TO 500
+ END IF
+C
+ IF(NWTR(J).EQ.235000) THEN
+C
+C RESET POINTER POINTER TO THE LAST DATA ELEMENT
+C
+ MREL=0
+ MBMP=0
+ MBMPL=0
+ END IF
+C
+ IF(NWTR(J).EQ.237255) THEN
+C
+C RESET POINTERS TO THE BIT MAP
+C
+ MBMP=0
+ MBMPL=0
+ END IF
+C
+ GO TO 121
+C
+C -----------------------------------------------------------------
+C* 2. PROCESS SUBSTITUTED VALUES OPERATOR.
+C ------------------------------------
+C
+ 200 CONTINUE
+C
+C* 2.1 FIND FIRST ACCURANCE OD 223255.
+C -------------------------------
+ 210 CONTINUE
+C
+ NP223255=0
+ DO 211 I=NP223000,M
+ IF(NWTR(I).EQ.223255) THEN
+ NP223255=I
+ GO TO 220
+ END IF
+ 211 CONTINUE
+C
+ GO TO 121
+C
+C* 2.2 COUNT NUMBER OF DATA PRESENT INDICATORS.
+C ----------------------------------------
+ 220 CONTINUE
+C
+ IF(MBMP.EQ.0) THEN
+ I223=0
+ OF223=.TRUE.
+ DO 221 I=NP223000,NP223255
+ IF(NWTR(I).EQ.031031) THEN
+ IF(OF223) THEN
+ I223=I
+ OF223=.FALSE.
+ END IF
+ NR223=NR223+1
+ END IF
+ 221 CONTINUE
+ ELSE
+ I223=MBMP
+ NR223=MBMPL-MBMP+1
+ END IF
+C
+C
+C* 2.5 DEFINE POINTER REFERING BACK TO DATA.
+C -------------------------------------
+ 250 CONTINUE
+C
+ ISUBST=MREL-NR223+1
+C
+C* 2.6 REPLACE MARKERS WITH CORRESPONDING DATA WIDTHS.
+C -----------------------------------------------
+C
+ 260 CONTINUE
+C
+ DO 261 I=I223,NR223+I223
+ IF(VALUES(I).EQ.0) THEN
+C
+ 262 CONTINUE
+C
+ IF(NWTR(NP223255).EQ.223255) THEN
+ NWTDW (NP223255)=NWTDW(ISUBST)
+ NWTR (NP223255)=NWTR (ISUBST)
+ NWTRV (NP223255)=NWTRV(ISUBST)
+ NWTS (NP223255)=NWTS (ISUBST)
+ CWTEN (NP223255)=CWTEN(ISUBST)
+ CWTU (NP223255)=CWTU (ISUBST)
+ NWTEN (NP223255)=NWTEN(ISUBST)
+ ISUBST=ISUBST+1
+ NP223255=NP223255+1
+ ELSE
+ NP223255=NP223255+1
+ GO TO 262
+ END IF
+ ELSE
+ ISUBST=ISUBST+1
+ END IF
+ 261 CONTINUE
+C
+ GO TO 121
+C
+C -----------------------------------------------------------------
+C* 3. PROCESS FIRST ORDER STATISTICS OPERATOR.
+C ----------------------------------------
+ 300 CONTINUE
+C
+C* 3.1 FIND FIRST ACCURANCE OD 224255.
+C -------------------------------
+ 310 CONTINUE
+C
+ NP224255=0
+ DO 311 I=NP224000,M
+ IF(NWTR(I).EQ.224255) THEN
+ NP224255=I
+ GO TO 320
+ END IF
+ 311 CONTINUE
+C
+ GO TO 121
+C
+C* 3.2 COUNT NUMBER OF DATA PRESENT INDICATORS.
+C ----------------------------------------
+ 320 CONTINUE
+C
+ IF(MBMP.EQ.0) THEN
+ I224=0
+ OF224=.TRUE.
+ DO 321 I=NP224000,NP224255
+ IF(NWTR(I).EQ.031031) THEN
+ IF(OF224) THEN
+ I224=I
+ OF224=.FALSE.
+ END IF
+ NR224=NR224+1
+ END IF
+ 321 CONTINUE
+ ELSE
+ I224=MBMP
+ NR224=MBMPL-MBMP+1
+ END IF
+C
+C
+C* 3.5 DEFINE POINTER REFERING BACK TO DATA.
+C -------------------------------------
+ 350 CONTINUE
+C
+ ISUBST=MREL-NR224+1
+C
+C* 3.6 REPLACE MARKERS WITH CORRESPONDING DATA WIDTHS.
+C -----------------------------------------------
+C
+ 360 CONTINUE
+C
+ DO 361 I=I224,NR224+I224
+ IF(VALUES(I).EQ.0) THEN
+C
+ 362 CONTINUE
+C
+ IF(NWTR(NP224255).EQ.224255) THEN
+ NWTDW (NP224255)=NWTDW(ISUBST)
+ NWTR (NP224255)=NWTR (ISUBST)
+ NWTRV (NP224255)=NWTRV(ISUBST)
+ NWTS (NP224255)=NWTS (ISUBST)
+ CWTEN (NP224255)=CWTEN(ISUBST)
+ CWTU (NP224255)=CWTU (ISUBST)
+ NWTEN (NP224255)=NWTEN(ISUBST)
+ ISUBST=ISUBST+1
+ NP224255=NP224255+1
+ ELSE
+ NP224255=NP224255+1
+ GO TO 362
+ END IF
+ ELSE
+ ISUBST=ISUBST+1
+ END IF
+ 361 CONTINUE
+C
+ GO TO 121
+C
+C
+C -----------------------------------------------------------------
+C* 4. PROCESS DIFFERENCE STATISTICS OPERATOR.
+C ---------------------------------------
+ 400 CONTINUE
+C
+C
+C* 4.1 FIND FIRST ACCURANCE OD 225255.
+C -------------------------------
+ 410 CONTINUE
+C
+ NP225255=0
+ DO 411 I=NP225000,M
+ IF(NWTR(I).EQ.225255) THEN
+ NP225255=I
+ GO TO 420
+ END IF
+ 411 CONTINUE
+C
+ GO TO 121
+C
+C* 4.2 COUNT NUMBER OF DATA PRESENT INDICATORS.
+C ----------------------------------------
+ 420 CONTINUE
+C
+ IF(MBMP.EQ.0) THEN
+ I225=0
+ OF225=.TRUE.
+ DO 421 I=NP225000,NP225255
+ IF(NWTR(I).EQ.031031) THEN
+ IF(OF225) THEN
+ I225=I
+ OF225=.FALSE.
+ END IF
+ NR225=NR225+1
+ END IF
+ 421 CONTINUE
+ ELSE
+ I225=MBMP
+ NR225=MBMPL-MBMP+1
+ END IF
+C
+C
+C* 4.5 DEFINE POINTER REFERING BACK TO DATA.
+C -------------------------------------
+ 450 CONTINUE
+C
+ ISUBST=MREL-NR225+1
+C
+C* 4.6 REPLACE MARKERS WITH CORRESPONDING DATA WIDTHS.
+C -----------------------------------------------
+C
+ 460 CONTINUE
+C
+ DO 461 I=I225,NR225+I225
+ IF(VALUES(I).EQ.0) THEN
+C
+ 462 CONTINUE
+C
+ IF(NWTR(NP225255).EQ.225255) THEN
+ NWTR (NP225255)=NWTR (ISUBST)
+C
+C CHANGE REFERENCE VALUE TO BE CENTRED AROUND ZERO
+C AND INCREASE DATA WIDTH BY 1
+C
+ IF(NWTEN(ISUBST).NE.-999) THEN
+ NWTRV (NP225255)=-2**NWTDW(ISUBST)
+ NWTDW (NP225255)=NWTDW(ISUBST)+1
+ ELSE
+ NWTRV (NP225255)=NWTDW(ISUBST)
+ NWTDW (NP225255)=NWTDW(ISUBST)
+ NWTEN (NP225255)=NWTEN(ISUBST)
+ END IF
+C
+ NWTS (NP225255)=NWTS (ISUBST)
+ CWTEN (NP225255)=CWTEN(ISUBST)
+ CWTU (NP225255)=CWTU (ISUBST)
+ NWTEN(NP225255)=NWTEN(ISUBST)
+ ISUBST=ISUBST+1
+ NP225255=NP225255+1
+ ELSE
+ NP225255=NP225255+1
+ GO TO 462
+ END IF
+ ELSE
+ ISUBST=ISUBST+1
+ END IF
+ 461 CONTINUE
+C
+ GO TO 121
+C
+C -----------------------------------------------------------------
+C* 5. PROCESS REPLACE/RETAINED OPERATOR.
+C ----------------------------------
+ 500 CONTINUE
+C
+C
+C* 5.1 FIND FIRST ACCURANCE OF 232255.
+C -------------------------------
+ 510 CONTINUE
+C
+ NP232255=0
+ DO 511 I=NP232000,M
+ IF(NWTR(I).EQ.232255) THEN
+ NP232255=I
+ GO TO 520
+ END IF
+ 511 CONTINUE
+C
+ GO TO 121
+C
+C* 5.2 COUNT NUMBER OF DATA PRESENT INDICATORS.
+C ----------------------------------------
+ 520 CONTINUE
+C
+ IF(MBMP.EQ.0) THEN
+ I232=0
+ OF232=.TRUE.
+ DO 521 I=NP232000,NP232255
+ IF(NWTR(I).EQ.031031) THEN
+ IF(OF232) THEN
+ I232=I
+ OF232=.FALSE.
+ END IF
+ NR232=NR232+1
+ END IF
+ 521 CONTINUE
+ ELSE
+ I232=MBMP
+ NR232=MBMPL-MBMP+1
+ END IF
+C
+C
+C* 5.5 DEFINE POINTER REFERING BACK TO DATA.
+C -------------------------------------
+ 550 CONTINUE
+C
+ ISUBST=MREL-NR232+1
+C
+C* 5.6 REPLACE MARKERS WITH CORRESPONDING DATA WIDTHS.
+C -----------------------------------------------
+C
+ 560 CONTINUE
+C
+ DO 561 I=I232,NR232+I232
+ IF(VALUES(I).EQ.0) THEN
+C
+ 562 CONTINUE
+C
+ IF(NWTR(NP232255).EQ.232255) THEN
+ NWTDW (NP232255)=NWTDW(ISUBST)
+ NWTR (NP232255)=NWTR (ISUBST)
+ NWTRV (NP232255)=NWTRV(ISUBST)
+ NWTS (NP232255)=NWTS (ISUBST)
+ CWTEN (NP232255)=CWTEN(ISUBST)
+ CWTU (NP232255)=CWTU (ISUBST)
+ NWTEN(NP232255)=NWTEN(ISUBST)
+ ISUBST=ISUBST+1
+ NP232255=NP232255+1
+ ELSE
+ NP232255=NP232255+1
+ GO TO 562
+ END IF
+ ELSE
+ ISUBST=ISUBST+1
+ END IF
+ 561 CONTINUE
+C
+C -----------------------------------------------------------------
+ 121 CONTINUE
+C
+ RETURN
+C
+C
+ END
diff --git a/bufrdc/buepmrkc.F b/bufrdc/buepmrkc.F
new file mode 100755
index 0000000..81dd470
--- /dev/null
+++ b/bufrdc/buepmrkc.F
@@ -0,0 +1,664 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUEPMRKC(KSEC3,KVALS,VALUES,KELEM,CNAMES,CUNITS,KERR)
+C
+C**** *BUEPMRKC*
+C
+C
+C PURPOSE.
+C --------
+C
+C PROCESS MARKER OPERATOR, RELACING IT WITH CORRESPONDING
+C TABLE B ELEMENT DESCRIPTOR.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUEPMRKC(KSEC3,KVALS,VALUES,KELEM,CNAMES,
+C CUNITS,KERR)*
+C
+C INPUT :
+C *KSEC3* - ARRAY CONTAINING SECTION 3 INFORMATION
+C KSEC3( 1)-- LENGTH OF SECTION 3 (BYTES)
+C KSEC3( 2)-- RESERVED
+C KSEC3( 3)-- NUMBER OF SUBSETS
+C KSEC3( 4)-- FLAG (DATA TYPE,DATA
+C COMPRESSION)
+C *KVALS* - DIMENSION OF VALUES ARRAY
+C *VALUES* - ARAY CONTAINING DATA
+C *KELEM* - DIMENSION OF CNAMES, CUNITS ARRAY
+C *CNAMES* - CHARACTER ARRAY CONTAINING ELEMENT NAMES
+C *CUNITS* - CHARACTER ARRAY CONTAINIG UNITS
+C OUTPUT:
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C BUNPCK - UNPACKS BIT PATTERN
+C BUNPKS - UNPACKS BIT PATTERN IN REPEATED WAY
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C M. DRAGOSAVAC 1/10/92 :
+C
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+# include "bcmbef.F"
+# include "bcmwt.F"
+# include "bcmwtc.F"
+# include "bcmrq.F"
+C
+ CHARACTER*64 CWTEN
+ CHARACTER*24 CWTU
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+ DIMENSION KSEC3(JSEC3)
+#ifndef R_4
+ REAL*8 VALUES(KVALS)
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL VALUES(KVALS)
+ REAL RVIND
+ REAL EPS
+#endif
+C
+ DIMENSION IMASK(8)
+ DATA IMASK/1,2,4,8,16,32,64,128/
+C
+C ------------------------------------------------------------------
+C* 1. FINED OPERATOR 223000 TO 237255.
+C --------------------------------
+ 100 CONTINUE
+C
+ IF(KERR.GT.0) RETURN
+C
+C
+C 1.1 CHECK IF DATA ARE COMRESSED.
+C ----------------------------
+ 110 CONTINUE
+C
+ IB=0
+ IF(IAND(KSEC3(4),IMASK(7)).NE.0) IB=1
+C
+C* 1.2 FIND POSITION OF OPREATORS.
+C ---------------------------
+ 120 CONTINUE
+C
+ DO 121 J=1,M
+C
+ NR223=0
+ NR224=0
+ NR225=0
+ NR232=0
+C
+C
+ IF(NWTR(J).EQ.222000) THEN
+C
+C SET POINTER TO THE LAST DATA ELEMENT
+C
+ IF(MREL.EQ.0) MREL=J-1
+C
+C CHECK IF BACKWARD REFERENCE BIT MAP DEFINED
+C
+ IF(NWTR(J+1).EQ.236000) THEN
+ NP236000=J+1
+ OBF=.TRUE.
+ J2=J+2
+C
+C DELAYED REPLICATION FACTOR CAN FOLLOW 236000
+C
+ IF(NWTR(J2).EQ.031001.OR.NWTR(J2).EQ.031000.OR.
+ 1 NWTR(J2).EQ.031002) J2=J+3
+C
+ DO 122 I=J2,M
+ IF(NWTR(I).EQ.031031) THEN
+C
+C FIND FIRST POINTER TO DATA PRESENT INDICATOR
+C
+ IF(OBF) MBMP=I
+ OBF=.FALSE.
+ ELSE
+C
+C LAST POINTER TO DATA PRESENT INDICATOR
+C
+ MBMPL=I-1
+ GO TO 121
+ END IF
+ 122 CONTINUE
+ END IF
+ END IF
+ IF(NWTR(J).EQ.223000) THEN
+C
+C SET POINTER TO THE LAST DATA ELEMENT
+C
+ IF(MREL.EQ.0) MREL=J-1
+C
+ NP223000=J
+C
+C CHECK IF BACKWARD REFERENCE BIT MAP DEFINED
+C
+ IF(NWTR(J+1).EQ.236000) THEN
+ NP236000=J+1
+ OBF=.TRUE.
+ J2=J+2
+C
+C DELAYED REPLICATION FACTOR CAN FOLLOW 236000
+C
+ IF(NWTR(J2).EQ.031001.OR.NWTR(J2).EQ.031000.OR.
+ 1 NWTR(J2).EQ.031002) J2=J+3
+C
+ DO 123 I=J2,M
+ IF(NWTR(I).EQ.031031) THEN
+C
+C FIND FIRST POINTER TO DATA PRESENT INDICATOR
+C
+ IF(OBF) MBMP=I
+ OBF=.FALSE.
+ ELSE
+C
+C LAST POINTER TO DATA PRESENT INDICATOR
+C
+ MBMPL=I-1
+ GO TO 200
+ END IF
+ 123 CONTINUE
+ END IF
+ GO TO 200
+ END IF
+ IF(NWTR(J).EQ.224000) THEN
+C
+C SET POINTER TO THE LAST DATA ELEMENT
+C
+ IF(MREL.EQ.0) MREL=J-1
+C
+ NP224000=J
+C
+C CHECK IF BACKWARD REFERENCE BIT MAP DEFINED
+C
+ IF(NWTR(J+1).EQ.236000) THEN
+ NP236000=J+1
+ OBF=.TRUE.
+ J2=J+2
+C
+C DELAYED REPLICATION FACTOR CAN FOLLOW 236000
+C
+ IF(NWTR(J2).EQ.031001.OR.NWTR(J2).EQ.031000.OR.
+ 1 NWTR(J2).EQ.031002) J2=J+3
+C
+ DO 124 I=J2,M
+ IF(NWTR(I).EQ.031031) THEN
+C
+C FIND FIRST POINTER TO DATA PRESENT INDICATOR
+C
+ IF(OBF) MBMP=I
+ OBF=.FALSE.
+ ELSE
+C
+C LAST POINTER TO DATA PRESENT INDICATOR
+C
+ MBMPL=I-1
+ GO TO 300
+ END IF
+ 124 CONTINUE
+ END IF
+ GO TO 300
+ END IF
+ IF(NWTR(J).EQ.225000) THEN
+C
+C SET POINTER TO THE LAST DATA ELEMENT
+C
+ IF(MREL.EQ.0) MREL=J-1
+C
+ NP225000=J
+C
+C CHECK IF BACKWARD REFERENCE BIT MAP DEFINED
+C
+ IF(NWTR(J+1).EQ.236000) THEN
+ NP236000=J+1
+ OBF=.TRUE.
+ J2=J+2
+C
+C DELAYED REPLICATION FACTOR CAN FOLLOW 236000
+C
+ IF(NWTR(J2).EQ.031001.OR.NWTR(J2).EQ.031000.OR.
+ 1 NWTR(J2).EQ.031002) J2=J+3
+C
+ DO 125 I=J2,M
+ IF(NWTR(I).EQ.031031) THEN
+C
+C FIND FIRST POINTER TO DATA PRESENT INDICATOR
+C
+ IF(OBF) MBMP=I
+ OBF=.FALSE.
+ ELSE
+C
+C LAST POINTER TO DATA PRESENT INDICATOR
+C
+ MBMPL=I-1
+ GO TO 400
+ END IF
+ 125 CONTINUE
+ END IF
+ GO TO 400
+ END IF
+ IF(NWTR(J).EQ.232000) THEN
+C
+C SET POINTER TO THE LAST DATA ELEMENT
+C
+ IF(MREL.EQ.0) MREL=J-1
+C
+ NP232000=J
+C
+C CHECK IF BACKWARD REFERENCE BIT MAP DEFINED
+C
+ IF(NWTR(J+1).EQ.236000) THEN
+ NP236000=J+1
+ OBF=.TRUE.
+ J2=J+2
+C
+C DELAYED REPLICATION FACTOR CAN FOLLOW 236000
+C
+ IF(NWTR(J2).EQ.031001.OR.NWTR(J2).EQ.031000.OR.
+ 1 NWTR(J2).EQ.031002) J2=J+3
+C
+ DO 126 I=J2,M
+ IF(NWTR(I).EQ.031031) THEN
+C
+C FIND FIRST POINTER TO DATA PRESENT INDICATOR
+C
+ IF(OBF) MBMP=I
+ OBF=.FALSE.
+ ELSE
+C
+C LAST POINTER TO DATA PRESENT INDICATOR
+C
+ MBMPL=I-1
+ GO TO 500
+ END IF
+ 126 CONTINUE
+ END IF
+ GO TO 500
+ END IF
+C
+ IF(NWTR(J).EQ.235000) THEN
+C
+C RESET POINTER POINTER TO THE LAST DATA ELEMENT
+C
+ MREL=0
+ MBMP=0
+ MBMPL=0
+ END IF
+C
+ IF(NWTR(J).EQ.237255) THEN
+C
+C RESET POINTERS TO THE BIT MAP
+C
+ MBMP=0
+ MBMPL=0
+ END IF
+C
+ GO TO 121
+C
+C -----------------------------------------------------------------
+C* 2. PROCESS SUBSTITUTED VALUES OPERATOR.
+C ------------------------------------
+C
+ 200 CONTINUE
+C
+C* 2.1 FIND FIRST ACCURANCE OD 223255.
+C -------------------------------
+ 210 CONTINUE
+C
+ NP223255=0
+ DO 211 I=NP223000,M
+ IF(NWTR(I).EQ.223255) THEN
+ NP223255=I
+ GO TO 220
+ END IF
+ 211 CONTINUE
+C
+ GO TO 121
+C
+C* 2.2 COUNT NUMBER OF DATA PRESENT INDICATORS.
+C ----------------------------------------
+ 220 CONTINUE
+C
+ IF(MBMP.EQ.0) THEN
+ I223=0
+ OF223=.TRUE.
+ DO 221 I=NP223000,NP223255
+ IF(NWTR(I).EQ.031031) THEN
+ IF(OF223) THEN
+ I223=I
+ OF223=.FALSE.
+ END IF
+ NR223=NR223+1
+ END IF
+ 221 CONTINUE
+ ELSE
+ I223=MBMP
+ NR223=MBMPL-MBMP+1
+ END IF
+C
+C
+C* 2.5 DEFINE POINTER REFERING BACK TO DATA.
+C -------------------------------------
+ 250 CONTINUE
+C
+ ISUBST=MREL-NR223+1
+C
+C* 2.6 REPLACE MARKERS WITH CORRESPONDING DATA WIDTHS.
+C -----------------------------------------------
+C
+ 260 CONTINUE
+C
+ DO 261 I=I223,NR223+I223
+ IF(VALUES(I).EQ.0) THEN
+C
+ 262 CONTINUE
+C
+ IF(NWTR(NP223255).EQ.223255) THEN
+ NWTDW (NP223255)=NWTDW(ISUBST)
+ NWTR (NP223255)=NWTR (ISUBST)
+ NWTRV (NP223255)=NWTRV(ISUBST)
+ NWTS (NP223255)=NWTS (ISUBST)
+ CWTEN (NP223255)=CWTEN(ISUBST)
+ CWTU (NP223255)=CWTU (ISUBST)
+ NWTEN (NP223255)=NWTEN(ISUBST)
+ ISUBST=ISUBST+1
+ NP223255=NP223255+1
+ ELSE
+ NP223255=NP223255+1
+ GO TO 262
+ END IF
+ ELSE
+ ISUBST=ISUBST+1
+ END IF
+ 261 CONTINUE
+C
+ GO TO 121
+C
+C -----------------------------------------------------------------
+C* 3. PROCESS FIRST ORDER STATISTICS OPERATOR.
+C ----------------------------------------
+ 300 CONTINUE
+C
+C* 3.1 FIND FIRST ACCURANCE OD 224255.
+C -------------------------------
+ 310 CONTINUE
+C
+ NP224255=0
+ DO 311 I=NP224000,M
+ IF(NWTR(I).EQ.224255) THEN
+ NP224255=I
+ GO TO 320
+ END IF
+ 311 CONTINUE
+C
+ GO TO 121
+C
+C* 3.2 COUNT NUMBER OF DATA PRESENT INDICATORS.
+C ----------------------------------------
+ 320 CONTINUE
+C
+ IF(MBMP.EQ.0) THEN
+ I224=0
+ OF224=.TRUE.
+ DO 321 I=NP224000,NP224255
+ IF(NWTR(I).EQ.031031) THEN
+ IF(OF224) THEN
+ I224=I
+ OF224=.FALSE.
+ END IF
+ NR224=NR224+1
+ END IF
+ 321 CONTINUE
+ ELSE
+ I224=MBMP
+ NR224=MBMPL-MBMP+1
+ END IF
+C
+C
+C* 3.5 DEFINE POINTER REFERING BACK TO DATA.
+C -------------------------------------
+ 350 CONTINUE
+C
+ ISUBST=MREL-NR224+1
+C
+C* 3.6 REPLACE MARKERS WITH CORRESPONDING DATA WIDTHS.
+C -----------------------------------------------
+C
+ 360 CONTINUE
+C
+ DO 361 I=I224,NR224+I224
+ IF(VALUES(I).EQ.0) THEN
+C
+ 362 CONTINUE
+C
+ IF(NWTR(NP224255).EQ.224255) THEN
+ NWTDW (NP224255)=NWTDW(ISUBST)
+ NWTR (NP224255)=NWTR (ISUBST)
+ NWTRV (NP224255)=NWTRV(ISUBST)
+ NWTS (NP224255)=NWTS (ISUBST)
+ CWTEN (NP224255)=CWTEN(ISUBST)
+ CWTU (NP224255)=CWTU (ISUBST)
+ NWTEN (NP224255)=NWTEN(ISUBST)
+ ISUBST=ISUBST+1
+ NP224255=NP224255+1
+ ELSE
+ NP224255=NP224255+1
+ GO TO 362
+ END IF
+ ELSE
+ ISUBST=ISUBST+1
+ END IF
+ 361 CONTINUE
+C
+ GO TO 121
+C
+C
+C -----------------------------------------------------------------
+C* 4. PROCESS DIFFERENCE STATISTICS OPERATOR.
+C ---------------------------------------
+ 400 CONTINUE
+C
+C
+C* 4.1 FIND FIRST ACCURANCE OD 225255.
+C -------------------------------
+ 410 CONTINUE
+C
+ NP225255=0
+ DO 411 I=NP225000,M
+ IF(NWTR(I).EQ.225255) THEN
+ NP225255=I
+ GO TO 420
+ END IF
+ 411 CONTINUE
+C
+ GO TO 121
+C
+C* 4.2 COUNT NUMBER OF DATA PRESENT INDICATORS.
+C ----------------------------------------
+ 420 CONTINUE
+C
+ IF(MBMP.EQ.0) THEN
+ I225=0
+ OF225=.TRUE.
+ DO 421 I=NP225000,NP225255
+ IF(NWTR(I).EQ.031031) THEN
+ IF(OF225) THEN
+ I225=I
+ OF225=.FALSE.
+ END IF
+ NR225=NR225+1
+ END IF
+ 421 CONTINUE
+ ELSE
+ I225=MBMP
+ NR225=MBMPL-MBMP+1
+ END IF
+C
+C
+C* 4.5 DEFINE POINTER REFERING BACK TO DATA.
+C -------------------------------------
+ 450 CONTINUE
+C
+ ISUBST=MREL-NR225+1
+C
+C* 4.6 REPLACE MARKERS WITH CORRESPONDING DATA WIDTHS.
+C -----------------------------------------------
+C
+ 460 CONTINUE
+C
+ DO 461 I=I225,NR225+I225
+ IF(VALUES(I).EQ.0) THEN
+C
+ 462 CONTINUE
+C
+ IF(NWTR(NP225255).EQ.225255) THEN
+ NWTR (NP225255)=NWTR (ISUBST)
+C
+C CHANGE REFERENCE VALUE TO BE CENTRED AROUND ZERO
+C AND INCREASE DATA WIDTH BY 1
+C
+ IF(NWTEN(ISUBST).NE.-999) THEN
+ NWTRV (NP225255)=-2**NWTDW(ISUBST)
+ NWTDW (NP225255)=NWTDW(ISUBST)+1
+ ELSE
+ NWTRV (NP225255)=NWTDW(ISUBST)
+ NWTDW (NP225255)=NWTDW(ISUBST)
+ NWTEN (NP225255)=NWTEN(ISUBST)
+ END IF
+C
+ NWTS (NP225255)=NWTS (ISUBST)
+ CWTEN (NP225255)=CWTEN(ISUBST)
+ CWTU (NP225255)=CWTU (ISUBST)
+ ISUBST=ISUBST+1
+ NP225255=NP225255+1
+ ELSE
+ NP225255=NP225255+1
+ GO TO 462
+ END IF
+ ELSE
+ ISUBST=ISUBST+1
+ END IF
+ 461 CONTINUE
+C
+ GO TO 121
+C
+C -----------------------------------------------------------------
+C* 5. PROCESS REPLACE/RETAINED OPERATOR.
+C ----------------------------------
+ 500 CONTINUE
+C
+C
+C* 5.1 FIND FIRST ACCURANCE OF 232255.
+C -------------------------------
+ 510 CONTINUE
+C
+ NP232255=0
+ DO 511 I=NP232000,M
+ IF(NWTR(I).EQ.232255) THEN
+ NP232255=I
+ GO TO 520
+ END IF
+ 511 CONTINUE
+C
+ GO TO 121
+C
+C* 5.2 COUNT NUMBER OF DATA PRESENT INDICATORS.
+C ----------------------------------------
+ 520 CONTINUE
+C
+ IF(MBMP.EQ.0) THEN
+ I232=0
+ OF232=.TRUE.
+ DO 521 I=NP232000,NP232255
+ IF(NWTR(I).EQ.031031) THEN
+ IF(OF232) THEN
+ I232=I
+ OF232=.FALSE.
+ END IF
+ NR232=NR232+1
+ END IF
+ 521 CONTINUE
+ ELSE
+ I232=MBMP
+ NR232=MBMPL-MBMP+1
+ END IF
+C
+C
+C* 5.5 DEFINE POINTER REFERING BACK TO DATA.
+C -------------------------------------
+ 550 CONTINUE
+C
+ ISUBST=MREL-NR232+1
+C
+C* 5.6 REPLACE MARKERS WITH CORRESPONDING DATA WIDTHS.
+C -----------------------------------------------
+C
+ 560 CONTINUE
+C
+ DO 561 I=I232,NR232+I232
+ IF(VALUES(I).EQ.0) THEN
+C
+ 562 CONTINUE
+C
+ IF(NWTR(NP232255).EQ.232255) THEN
+ NWTDW (NP232255)=NWTDW(ISUBST)
+ NWTR (NP232255)=NWTR (ISUBST)
+ NWTRV (NP232255)=NWTRV(ISUBST)
+ NWTS (NP232255)=NWTS (ISUBST)
+ CWTEN (NP232255)=CWTEN(ISUBST)
+ CWTU (NP232255)=CWTU (ISUBST)
+ ISUBST=ISUBST+1
+ NP232255=NP232255+1
+ ELSE
+ NP232255=NP232255+1
+ GO TO 562
+ END IF
+ ELSE
+ ISUBST=ISUBST+1
+ END IF
+ 561 CONTINUE
+C
+C -----------------------------------------------------------------
+ 121 CONTINUE
+C
+ RETURN
+C
+C
+ END
diff --git a/bufrdc/buepwt.F b/bufrdc/buepwt.F
new file mode 100755
index 0000000..501e13e
--- /dev/null
+++ b/bufrdc/buepwt.F
@@ -0,0 +1,294 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUEPWT(KDD,KERR)
+C
+C**** *BUEPWT*
+C
+C
+C PURPOSE.
+C --------
+C UPDATES WORKING TABLES SETTING ELEMENT NAME,UNIT,SCALE,
+C REFERENCE VALUE AND DATA WIDTH.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUEPWT(KDD,KERR)*
+C
+C INPUT :
+C *KDD* - DATA DESCRIPTOR
+C OUTPUT:
+C *KERR* - RETURN ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwt.F"
+# include "bcmwtc.F"
+# include "bcmtab.F"
+# include "bcmtabc.F"
+# include "bcmatb.F"
+# include "bcmatbc.F"
+# include "bcmbef.F"
+C
+ CHARACTER*64 CATBEN,CWTEN,CTABBEN,YWTEN
+ CHARACTER*24 CATBU,CWTU,CTABBU,YWTU
+C
+C ------------------------------------------------------------------
+C* 1. UPDATE WORKING TABLE.
+C ---------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ ICLASS=KDD/1000
+ IYYY =KDD-ICLASS*1000+1
+ ICLASS=ICLASS+1
+C
+C* 1.1 ASSOCIATED FIELD ?
+C ------------------
+ 110 CONTINUE
+C
+ IF(NFD.EQ.0) GO TO 140
+C
+C* 1.2 UNITS ELEMENT DESCRIPTOR ?
+C --------------------------
+ 120 CONTINUE
+C
+ I=NTABP(ICLASS,IYYY)
+ IF(I.EQ.0) THEN
+ KERR=23
+ WRITE(KNTN,*) 'BUEPWT : ',KDD
+ CALL BUERR(KERR)
+ DO 1 IQ=1,JELEM
+ NSTACK(IQ)=0.
+ 1 CONTINUE
+ RETURN
+ END IF
+C
+ IF(NTABBTR(I)/1000.EQ.31) GO TO 140
+c IF(CTABBU(I)(1:4).EQ.'CODE') GO TO 140
+c IF(CTABBU(I)(1:4).EQ.'FLAG') GO TO 140
+c IF(CTABBU(I)(1:3).EQ.'NUM' ) GO TO 140
+C
+C* 1.3 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ 130 CONTINUE
+C
+ IF(N40.NE.0) THEN
+ NWT=NWT+1
+ CWTEN(NWT)='ASSOCIATED FIELD'
+ CWTU (NWT)=' '
+ NWTDW(NWT)=N40
+ NWTR (NWT)= 999999
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ NWTRV(NWT)= 0
+ ELSE
+ DO I=1,NFD
+ NWT=NWT+1
+ CWTEN(NWT)='ASSOCIATED FIELD'
+ CWTU (NWT)=' '
+ NWTDW(NWT)=NAFDWA(I)
+ NWTR (NWT)= 999999
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ NWTRV(NWT)= 0
+ END DO
+ END IF
+C
+ M=NWT
+C
+C ------------------------------------------------------------------
+C* 1.4 SEARCH AUGMENTED TABLE *B ENTRIES .
+C -----------------------------------
+ 140 CONTINUE
+C
+ DO 141 J=1,NJA
+C
+ IF(NATBTR(J).EQ.KDD) THEN
+ II=J
+C
+C* MODIFY ENTRY FOR OPERATOR IN FORCE.
+C -----------------------------------
+C
+C* ADD ENTRY TO WORKING TABLE.
+C ---------------------------
+C
+ IX=KDD/1000
+ IF(N40.NE.0.AND.IX.NE.31) THEN
+ NWT=NWT+1
+ NWTR (NWT) = KDD
+ NWTS (NWT) = 0
+ NWTRV(NWT) = 0
+ NWTDW(NWT) = N40
+ ELSE
+ NWT=NWT+1
+ NWTR (NWT) = KDD
+ NWTS (NWT) = NATBS (II) + NSCAM + NSCAM07
+ NWTRV(NWT) = nint(NATBRV(II)*10.**N07)
+ NWTDW(NWT) = NATBDW(II) + NDWINC + NDWINC07
+
+ END IF
+C
+C CHECK IF DATA ARE PRESENT IN DATA SECTION.
+C
+ IF(N221.NE.0) THEN
+ IX=KDD/1000
+ IF(IX.GT.9.AND.IX.NE.31) NWTDW(NWT)=0
+ N221=N221-1
+ END IF
+C
+c IF(NWTR(NWT).EQ.31011.OR.NWTR(NWT).EQ.31012) THEN
+c IF(NWTR(NWT-1).EQ.31011.OR.NWTR(NWT-1).EQ.31012) THEN
+c NWTDW(NWT)=0
+c END IF
+c END IF
+C
+C* UPDATE M, CNAMES, CUNITS.
+C -------------------------
+C
+ CWTEN(NWT) = CATBEN(II)
+ CWTU (NWT) = CATBU (II)
+ NWTEN(NWT) = 0
+ IF(CATBU(II)(1:3).EQ.'CCI') THEN
+ NWTEN(NWT)=658367
+ ELSEIF(N40.NE.0.AND.IX.NE.31.AND.
+ 1 CATBU(II)(1:3).NE.'COD'.AND.
+ 2 CATBU(II)(1:3).NE.'FLA') THEN
+ NWTEN(NWT) = -999
+ END IF
+C
+ M = NWT
+ RETURN
+ END IF
+C
+ 141 CONTINUE
+C
+C
+C* 1.5 GET TABLE *B ENTRY .
+C ---------------------
+ 150 CONTINUE
+C
+ I=NTABP(ICLASS,IYYY)
+ IF(I.EQ.0) THEN
+ KERR=23
+ WRITE(KNTN,*) 'BUEPWT : ',KDD
+ CALL BUERR(KERR)
+ DO 2 IQ=1,JELEM
+ NSTACK(IQ)=0.
+ 2 CONTINUE
+ RETURN
+ END IF
+C
+ 155 CONTINUE
+C
+C -----------------------------------------------------------------
+C* 1.6 MODIFY ENTRY FOR OPERATOR IN FORCE.
+C -----------------------------------
+ 160 CONTINUE
+C
+C* ADD ENTRY TO WORKING TABLE.
+C ---------------------------
+ IX=KDD/1000
+ IF(CTABBU(I)(1:4).EQ.'CODE'.OR.
+ 1 CTABBU(I)(1:4).EQ.'FLAG') THEN
+ NWT=NWT+1
+ NWTR (NWT) = KDD
+ NWTS (NWT) = NTABBS (I)
+ NWTRV(NWT) = NTABBRV(I)
+ NWTDW(NWT) = NTABBDW(I)
+ ELSEIF(N40.NE.0.AND.IX.NE.31) THEN
+ NWT=NWT+1
+ NWTR (NWT) = KDD
+ NWTS (NWT) = 0
+ NWTRV(NWT) = 0
+ NWTDW(NWT) = N40
+ ELSE
+ NWT=NWT+1
+ NWTR (NWT) = KDD
+ NWTS (NWT) = NTABBS (I) + NSCAM + NSCAM07
+ NWTRV(NWT) = nint(NTABBRV(I)*10.**N07)
+ NWTDW(NWT) = NTABBDW(I) + NDWINC + NDWINC07
+
+ END IF
+C
+C CHECK IF DATA ARE PRESENT IN DATA SECTION.
+C
+ IF(N221.NE.0) THEN
+ IX=KDD/1000
+ IF(IX.GT.9.AND.IX.NE.31) NWTDW(NWT)=0
+ N221=N221-1
+ END IF
+C
+C IF(NWTR(NWT).EQ.31011.OR.NWTR(NWT).EQ.31012) THEN
+C IF(NWTR(NWT-1).EQ.31011.OR.NWTR(NWT-1).EQ.31012) THEN
+C NWTDW(NWT)=0
+C END IF
+C END IF
+C
+ 175 CONTINUE
+C
+C* 1.8 UPDATE M.
+C ---------
+ 180 CONTINUE
+C
+ CWTEN(NWT)= CTABBEN(I)
+ CWTU (NWT)= CTABBU(I)
+ NWTEN(NWT)= 0
+ IF(CTABBU(I)(1:3).EQ.'CCI') THEN
+ NWTEN(NWT)=658367
+ IF(N08.NE.0) THEN
+ NWTDW(NWT)=N08*8
+ END IF
+ ELSE
+ IF(N40.NE.0.AND.IX.NE.31) NWTEN(NWT) = -999
+ END IF
+C
+ M=NWT
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/bufrdc/buepwtc.F b/bufrdc/buepwtc.F
new file mode 100755
index 0000000..7c6cdf0
--- /dev/null
+++ b/bufrdc/buepwtc.F
@@ -0,0 +1,291 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUEPWTC(KDD,KERR)
+C
+C**** *BUEPWTC*
+C
+C
+C PURPOSE.
+C --------
+C UPDATES WORKING TABLES SETTING ELEMENT NAME,UNIT,SCALE,
+C REFERENCE VALUE AND DATA WIDTH.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUEPWTC(KDD,KERR)*
+C
+C INPUT :
+C *KDD* - DATA DESCRIPTOR
+C OUTPUT:
+C *KERR* - RETURN ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwt.F"
+# include "bcmwtc.F"
+# include "bcmtab.F"
+# include "bcmtabc.F"
+# include "bcmatb.F"
+# include "bcmatbc.F"
+# include "bcmbef.F"
+C
+ CHARACTER*64 CATBEN,CWTEN,CTABBEN,YWTEN
+ CHARACTER*24 CATBU,CWTU,CTABBU,YWTU
+C
+C ------------------------------------------------------------------
+C* 1. UPDATE WORKING TABLE.
+C ---------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ ICLASS=KDD/1000
+ IYYY =KDD-ICLASS*1000+1
+ ICLASS=ICLASS+1
+C
+C* 1.1 ASSOCIATED FIELD ?
+C ------------------
+ 110 CONTINUE
+C
+ IF(NFD.EQ.0) GO TO 140
+C
+C* 1.2 UNITS ELEMENT DESCRIPTOR ?
+C --------------------------
+ 120 CONTINUE
+C
+ I=NTABP(ICLASS,IYYY)
+ IF(I.EQ.0) THEN
+ KERR=23
+ WRITE(KNTN,*) 'BUEPWT : ',KDD
+ CALL BUERR(KERR)
+ DO 1 IQ=1,JELEM
+ NSTACK(IQ)=0.
+ 1 CONTINUE
+ RETURN
+ END IF
+C
+ IF(NTABBTR(I)/1000.EQ.31) GO TO 140
+c IF(CTABBU(I)(1:4).EQ.'CODE') GO TO 140
+c IF(CTABBU(I)(1:4).EQ.'FLAG') GO TO 140
+c IF(CTABBU(I)(1:3).EQ.'NUM' ) GO TO 140
+C
+C* 1.3 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ 130 CONTINUE
+C
+ IF(N40.NE.0) THEN
+ NWT=NWT+1
+ CWTEN(NWT)='ASSOCIATED FIELD'
+ CWTU (NWT)=' '
+ NWTDW(NWT)=N40
+ NWTR (NWT)= 999999
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ NWTRV(NWT)= 0
+ ELSE
+ DO I=1,NFD
+ NWT=NWT+1
+ CWTEN(NWT)='ASSOCIATED FIELD'
+ CWTU (NWT)=' '
+ NWTDW(NWT)=NAFDWA(I)
+ NWTR (NWT)= 999999
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ NWTRV(NWT)= 0
+ END DO
+ END IF
+C
+ M=NWT
+C
+C ------------------------------------------------------------------
+C* 1.4 SEARCH AUGMENTED TABLE *B ENTRIES .
+C -----------------------------------
+ 140 CONTINUE
+C
+ DO 141 J=1,NJA
+C
+ IF(NATBTR(J).EQ.KDD) THEN
+ II=J
+C
+C* MODIFY ENTRY FOR OPERATOR IN FORCE.
+C -----------------------------------
+C
+C* ADD ENTRY TO WORKING TABLE.
+C ---------------------------
+C
+ IX=KDD/1000
+ IF(N40.NE.0.AND.IX.NE.31) THEN
+ NWT=NWT+1
+ NWTR (NWT) = KDD
+ NWTS (NWT) = 0
+ NWTRV(NWT) = 0
+ NWTDW(NWT) = N40
+ ELSE
+ NWT=NWT+1
+ NWTR (NWT) = KDD
+ NWTS (NWT) = NATBS (II) + NSCAM + NSCAM07
+ NWTRV(NWT) = NINT(NATBRV(II)*10.**N07)
+ NWTDW(NWT) = NATBDW(II) + NDWINC + NDWINC07
+
+
+ END IF
+C
+C CHECK IF DATA ARE PRESENT IN DATA SECTION.
+C
+ IF(N221.NE.0) THEN
+ IX=KDD/1000
+ IF(IX.GT.9.AND.IX.NE.31) NWTDW(NWT)=0
+ N221=N221-1
+ END IF
+C
+c IF(NWTR(NWT).EQ.31011.OR.NWTR(NWT).EQ.31012) THEN
+c IF(NWTR(NWT-1).EQ.31011.OR.NWTR(NWT-1).EQ.31012) THEN
+c NWTDW(NWT)=0
+c END IF
+c END IF
+C
+C* UPDATE M, CNAMES, CUNITS.
+C -------------------------
+C
+ CWTEN(NWT) = CATBEN(II)
+ CWTU (NWT) = CATBU (II)
+ NWTEN(NWT) = 0
+ IF(CATBU(II)(1:3).EQ.'CCI') THEN
+ NWTEN(NWT)=658367
+ ELSEIF(N40.NE.0.AND.IX.NE.31.AND.
+ 1 CATBU(II)(1:3).NE.'COD'.AND.
+ 2 CATBU(II)(1:3).NE.'FLA') THEN
+ NWTEN(NWT) = -999
+ END IF
+C
+ M = NWT
+ RETURN
+ END IF
+C
+ 141 CONTINUE
+C
+C
+C* 1.5 GET TABLE *B ENTRY .
+C ---------------------
+ 150 CONTINUE
+C
+ I=NTABP(ICLASS,IYYY)
+ IF(I.EQ.0) THEN
+ KERR=23
+ WRITE(KNTN,*) 'BUEPWT : ',KDD
+ CALL BUERR(KERR)
+ DO 2 IQ=1,JELEM
+ NSTACK(IQ)=0.
+ 2 CONTINUE
+ RETURN
+ END IF
+C
+ 155 CONTINUE
+C
+C -----------------------------------------------------------------
+C* 1.6 MODIFY ENTRY FOR OPERATOR IN FORCE.
+C -----------------------------------
+ 160 CONTINUE
+C
+C* ADD ENTRY TO WORKING TABLE.
+C ---------------------------
+ IX=KDD/1000
+ IF(CTABBU(I)(1:4).EQ.'CODE'.OR.
+ 1 CTABBU(I)(1:4).EQ.'FLAG') THEN
+ NWT=NWT+1
+ NWTR (NWT) = KDD
+ NWTS (NWT) = NTABBS (I)
+ NWTRV(NWT) = NTABBRV(I)
+ NWTDW(NWT) = NTABBDW(I)
+ ELSEIF(N40.NE.0.AND.IX.NE.31) THEN
+ NWT=NWT+1
+ NWTR (NWT) = KDD
+ NWTS (NWT) = 0
+ NWTRV(NWT) = 0
+ NWTDW(NWT) = N40
+ ELSE
+ NWT=NWT+1
+ NWTR (NWT) = KDD
+ NWTS (NWT) = NTABBS (I) + NSCAM + NSCAM07
+ NWTRV(NWT) = nint(NTABBRV(I)*10.**N07)
+ NWTDW(NWT) = NTABBDW(I) + NDWINC + NDWINC07
+ END IF
+C
+C CHECK IF DATA ARE PRESENT IN DATA SECTION.
+C
+ IF(N221.NE.0) THEN
+ IX=KDD/1000
+ IF(IX.GT.9.AND.IX.NE.31) NWTDW(NWT)=0
+ N221=N221-1
+ END IF
+C
+c IF(NWTR(NWT).EQ.31011.OR.NWTR(NWT).EQ.31012) THEN
+c IF(NWTR(NWT-1).EQ.31011.OR.NWTR(NWT-1).EQ.31012) THEN
+c NWTDW(NWT)=0
+c END IF
+c END IF
+C
+ 175 CONTINUE
+C
+C* 1.8 UPDATE M.
+C ---------
+ 180 CONTINUE
+C
+ CWTEN(NWT)= CTABBEN(I)
+ CWTU (NWT)= CTABBU(I)
+ NWTEN(NWT)= 0
+ IF(CTABBU(I)(1:3).EQ.'CCI') THEN
+ NWTEN(NWT)=658367
+ ELSE
+ IF(N40.NE.0.AND.IX.NE.31) NWTEN(NWT) = -999
+ END IF
+C
+ M=NWT
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/bufrdc/buerr.F b/bufrdc/buerr.F
new file mode 100755
index 0000000..c53ce98
--- /dev/null
+++ b/bufrdc/buerr.F
@@ -0,0 +1,132 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUERR(KERR)
+C**** *BUERR*
+C
+C
+C PURPOSE.
+C --------
+C PRINT ERROR CODE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUERR(KERR)*
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/02/92.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+# include "bcomunit.F"
+C
+ CHARACTER*80 CERROR(100)
+C
+ DATA CERROR/100*' '/
+C
+C ------------------------------------------------------------------
+C
+C* 1. INITIALIZE MESSAGES.
+C --------------------
+ 100 CONTINUE
+C
+ CERROR( 1)=' START OF BUFR MESSAGE NOT FOUND.'
+ CERROR( 2)=' END OF BUFR MESSAGE NOT FOUND.'
+ CERROR( 3)=' ARRAY TO RECEIVE BUFR MESSAGE TOO SMALL.'
+ CERROR( 4)=' JSEC1 PARAMETER TOO SMAL. LOCAL ADP CENTER'//
+ 1 ' INFORMATION SKIPPED.'
+ CERROR( 5)=' JSEC2 PARAMETER TOO SMALL. LOCAL ADP CENTRE'//
+ 2 ' INFORMATION SKIPPED.'
+ CERROR( 6)=' ERROR DURING READ BUFR TABLE B.'
+ CERROR( 7)=' ERROR DURING READ BUFR TABLE C.'
+ CERROR( 8)=' ERROR DURING READ BUFR TABLE D.'
+ CERROR( 9)=' OPEN ERROR.'
+ CERROR(10)=' ERROR DURING CLOSE BUFR TABLE B.'
+ CERROR(11)=' ERROR DURING CLOSE BUFR TABLE C.'
+ CERROR(12)=' ERROR DURING CLOSE BUFR TABLE D.'
+ CERROR(13)=' NUMBER OF BITS TO BE EXTRACTED GREATER THAN'//
+ 1 ' NUMBER OF BITS PER COMPUTER WORD.'
+ CERROR(14)=' ARGUMENT KVALS TOO SMALL.'
+ CERROR(15)=' INCREMENT VALUE FOR COMPRESSED DATA TOO BIG.'
+ CERROR(16)=' JSUBS PARAMETER TOO SMALL.'
+ CERROR(17)=' JWORK PARAMETER TOO SMALL.'
+ CERROR(18)=' REPLICATION FACTOR EQUAL TO ZERO.'
+ CERROR(19)=' DELAYED REPLICATION FACTOR TOO BIG.'
+ CERROR(20)=' TABLE D REFERENCE NOT FOUND.'
+ CERROR(21)=' DATA DESCRIPTOR OPERATOR NOT FOUND.'
+ CERROR(22)=' BUFR OPEARTOR NAME NOT FOUND.'
+ CERROR(23)=' TABLE B REFERENCE NOT FOUND.'
+ CERROR(24)=' AUGMENTED TABLE B REFERENCE NOT FOUND.'
+ CERROR(25)=' KELEM ARGUMENT TOO SMALL.'
+ CERROR(26)=' WORD POINTER OUT OF RANGE.'
+ CERROR(27)=' TOO MANY SUBSETS TO BE PACKED.'
+ CERROR(28)=' NUMBER TO BE PACKED TOO BIG.'
+ CERROR(29)=' NUMBER OF DESCRIPTORS KTDLEN TOO BIG.'
+ CERROR(30)=' NUMBER OF ELEMENTS GREATER THAN JELEM.'
+ CERROR(31)=' TOO FEW ELEMENTS IN KDATA ARRAY.'
+ CERROR(32)=' NUMBER OF SUBSETS EQUAL TO ZERO.'
+ CERROR(33)=' NEGATIVE VALUE TO BE PACKED.'
+ CERROR(34)=' NUMBER OF BITS TO BE PACKED GREATER THAN'//
+ 1 ' NUMBER OF BITS PER COMPUTER WORD.'
+ CERROR(35)=' '
+ CERROR(36)=' BAD ORDER OF DATA DESCRIPTORS.'
+ CERROR(37)=' WRONG DATA DESCRIPTOR.'
+ CERROR(38)=' PARTIAL EXPANSION ON TOTAL MESSAGE NOT SUPPORTED.'
+ CERROR(39)=' CAN NOT RECOGNIZE FEEDBACK DATA IN THIS MESSAGE.'
+ CERROR(40)=' REQUEST FLAG ILLEGAL.'
+ CERROR(41)=' BIT MAP NOT SET.'
+ CERROR(42)=' THIS ELEMENT MUST BE DATA PRESENT INDICATOR.'
+ CERROR(43)=' TABLE B ELEMENT MUST FOLLOW BIT MAP.'
+ CERROR(44)=' REQUESTED SUBSET DOES NOT EXIST.'
+ CERROR(45)=' THERE IS NO ONE REQUESTED ELEMENT IN THE DATA.'
+ CERROR(46)=' INPUT ARRAY IS TOO SMALL TO RECEIVE INFORMATION.'
+ CERROR(47)=' KELEM ARGUMENT IS TOO BIG. MAXIMUM ALLOWED IS 160000'
+ CERROR(48)=' '
+ CERROR(49)=' TOO MANY DATA FOR BOXING '
+ CERROR(50)=' ERROR IN KSEC1(5) FLAG. '//
+ 1 ' ALLOWED VALUES: ZERO OR 128'
+ CERROR(51)=' WRONG USAGE OF 204Y OPERATOR'
+ CERROR(56)=' WRONG SECTION 4 SIZE'
+C
+ IF(KERR.GE.0.AND.KERR.LE.100) THEN
+ WRITE(KNTN,'(1H ,A)') CERROR(KERR)
+ ELSE
+ WRITE(KNTN,'(1H ,A)') ' ERROR NUMBER OUT OF RANGE !'
+ END IF
+C
+ RETURN
+ END
diff --git a/bufrdc/buetab.F b/bufrdc/buetab.F
new file mode 100755
index 0000000..000f964
--- /dev/null
+++ b/bufrdc/buetab.F
@@ -0,0 +1,291 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUETAB( KSEC1,KERR )
+C
+C**** *BUETAB*
+C
+C
+C PURPOSE.
+C --------
+C LOAD BUFR TABLE B, D AND C ACCORDING TO EDITION AND VERSION
+C OF BUFR CODE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUETAB(KSEC1,KERR)*
+C
+C OUTPUT:
+C *KSEC1* - ARRAY CONTAINING SECTION 1 INFORMATION
+C KSEC1( 1)-- LENGTH OF SECTION 1 (BYTES)
+C KSEC1( 2)-- BUFR EDITION NUMBER
+C KSEC1( 3)-- ORIGINATING CENTRE
+C KSEC1( 4)-- UPDATE SEQUENCE NUMBER
+C KSEC1( 5)-- FLAG (PRESENCE OF SECTION 2)
+C KSEC1( 6)-- BUFR MESSAGE TYPE
+C KSEC1( 7)-- BUFR MESSAGE SUBTYPE
+C KSEC1( 8)-- VERSION NUMBER OF LOCAL TABLE USED
+C KSEC1( 9)-- YEAR
+C KSEC1(10)-- MONTH
+C KSEC1(11)-- DAY
+C KSEC1(12)-- HOUR
+C KSEC1(13)-- MINUTE
+C KSEC1(14)-- BUFR MASTER TABLE
+C KSEC1(15)-- VERSION NUMBER OF MASTER TABLE USED
+C KSEC1(16) - KSEC1(JSEC1) -- LOCAL ADP CENTRE
+C INFORMATION(BYTE BY BYTE)
+C
+C FOR BUFR EDITION 3 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- NOT USED
+C KSEC1(18) TO KSEC1(JSEC1) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 4 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- INTERNATIONAL SUB-CATEGORY (SEE COMMON TABLE C-13
+C KSEC1(18)-- SECOND
+C KSEC1(19)-- YEAR
+C KSEC1(20)-- MONTH
+C KSEC1(21)-- DAY
+C KSEC1(22)-- HOUR
+C KSEC1(23)-- MINUTE
+C KSEC1(24)-- SECOND
+C KSEC1(25)-- YEAR
+C KSEC1(26)-- MONTH
+C KSEC1(27)-- DAY
+C KSEC1(28)-- HOUR
+C KSEC1(29)-- MINUTE
+C KSEC1(30)-- SECOND
+C KSEC1(31)-- MOST SOUTHERN LATITUDE (-90 to 90)
+C KSEC1(32)-- MOST WESTERN LONGITUDE ( 0-360)
+C KSEC1(33)-- MOST NORTHEN LATITUDE (-90 to 90)
+C KSEC1(34)-- MOST EASTERN LONGITUDE ( 0-360)
+C KSEC1(35) TO KSEC1(JSEC1) - LOCAL ADP CENTRE INFORMATION(PACKED FORM)
+C
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 17/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+# include "bcmtab.F"
+# include "bcmtabc.F"
+# include "bcmct.F"
+# include "bcmctc.F"
+# include "bcmroot.F"
+# include "bcmtabload.F"
+# include "bcmtabloadc.F"
+C
+ CHARACTER*256 YTAB ,YTAC ,YTAD
+ CHARACTER*24 YTABB,YTABC,YTABD,CTABLE_LIST
+ CHARACTER*64 CTABBEN,CTEXT
+ CHARACTER*64 CCTABBEN
+ CHARACTER*24 CTABBU , CCTABBU
+ CHARACTER*256 CROOT
+C
+ LOGICAL*4 OPN
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+C
+ DIMENSION KSEC1(JSEC1)
+C
+ SAVE OFIRST
+C
+C ------------------------------------------------------------------
+C
+C* 1. GET BUFR TABLES/LOCAL BUFR TABLES.
+C ----------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0) RETURN
+C
+C* 2. SET UP BUFR TABLE FILE NAME.
+C ----------------------------
+ 200 CONTINUE
+C
+C
+C BUFR EDITION 2 NAMING CONVENTION
+C
+C BXXXXXYYZZ , CXXXXXYYZZ , DXXXXXYYZZ
+C
+C B - BUFR TABLE 'B'
+C C - BUFR TABLE 'C'
+C D - BUFR TABLE 'D'
+C XXXXX - ORIGINATING CENTRE
+C YY - VERSION NUMBER OF MASTER TABLE
+C USED( CURRENTLY 2 )
+C ZZ - VERSION NUMBER OF LOCAL TABLE USED
+C
+C BUFR EDITION 3 NAMING CONVENTION
+C
+C BWWWXXXYYZZ , CWWWXXXYYZZ , DWWWXXXYYZZ
+C
+C B - BUFR TABLE 'B'
+C C - BUFR TABLE 'C'
+C D - BUFR TABLE 'D'
+C WWW - ORIGINATING SUB-CENTRE
+C XXX - ORIGINATING CENTRE
+C YY - VERSION NUMBER OF MASTER TABLE
+C USED( CURRENTLY 2 )
+C ZZ - VERSION NUMBER OF LOCAL TABLE USED
+C
+C
+C BUFR EDITION 4 NAMING CONVENTION
+C
+C BSSSWWWWWXXXXXYYYZZZ , CSSSWWWWWXXXXXYYYZZZ , DSSSWWWWWXXXXXYYYZZZ
+C
+C B - BUFR TABLE 'B'
+C C - BUFR TABLE 'C'
+C D - BUFR TABLE 'D'
+C SSS - MASTER TABLE NUMBER ( zero for WMO tables)
+C WWWWWW - ORIGINATING SUB-CENTRE
+C XXXXXX - ORIGINATING CENTRE
+C YYY - VERSION NUMBER OF MASTER
+C TABLE USED( CURRENTLY 12 )
+C ZZZ - VERSION NUMBER OF LOCAL TABLE USED
+C
+ IXX=KSEC1(3)
+ IYY=KSEC1(15)
+ IZZ=KSEC1(08)
+C
+ IF(KSEC1(2).EQ.3) THEN
+ IWW=KSEC1(16)
+ ISS=KSEC1(14)
+ ELSEIF(KSEC1(2).EQ.4) THEN
+ IWW=KSEC1(16)
+ ISS=KSEC1(14)
+ ELSE
+ IWW=0
+ ISS=0
+ END IF
+C
+C IF STANDARD TABLES USED, USE WMO ORIGINATING CENTRE ID
+C
+ IF(KSEC1(8).EQ.0.OR.KSEC1(8).EQ.255) THEN
+ IXX=0
+ IWW=0
+ IZZ=0
+ ENDIF
+C
+ IF(OFIRST) THEN
+ IF(IWW.EQ.NWWP.AND.IXX.EQ.NXXP.AND.IYY.EQ.NYYP.AND.
+ 1 IZZ.EQ.NZZP.AND.ISS.EQ.NSSP) RETURN
+ END IF
+C
+ OFIRST=.TRUE.
+C
+ NSSP=ISS
+ NXXP=IXX
+ NYYP=IYY
+ NZZP=IZZ
+ NWWP=IWW
+C
+ WRITE(YTABB,'(A1,I3.3,2(I5.5),2(I3.3),A4)')
+ 1 'B',ISS,IWW,IXX,IYY,IZZ,'.TXT'
+c WRITE(YTABC,'(A1,I3.3,2(I5.5),2(I3.3),A4)')
+c 1 'C',ISS,IWW,IXX,IYY,IZZ,'.TXT'
+ WRITE(YTABD,'(A1,I3.3,2(I5.5),2(I3.3),A4)')
+ 1 'D',ISS,IWW,IXX,IYY,IZZ,'.TXT'
+C
+C Find if table is already used
+C
+ DO I=1,JTMAX
+ IF(CTABLE_LIST(I).EQ.YTABB) THEN
+ CALL GET_TABLES1(I)
+ RETURN
+ END IF
+ END DO
+ IF(OPRINT) THEN
+ WRITE(KNTN,'(A,1X,A,A,A,A))') 'BUFR TABLES TO BE LOADED ',
+ 1 YTABB,',',YTABD
+ END IF
+c WRITE(KNTN,'(A,1X,A,A,A,A))') 'BUFR TABLES TO BE LOADED ',
+c 1 YTABB,',',YTABC,',',YTABD
+
+C ----------------------------------------------------------------
+C* 3. OPEN AND READ FILES CONTAINING BUFR TABLES.
+C -------------------------------------------
+ 300 CONTINUE
+C
+ I=INDEX(CROOT,' ')
+ IF(I.NE.0) I=I-1
+C
+C* 3.1 READ BUFR TABLE B.
+C ------------------
+ 310 CONTINUE
+C
+ YTAB=CROOT(1:I)//YTABB
+C
+ CALL BTABLE1(YTAB,YTABB,KERR)
+ IF(KERR.NE.0) RETURN
+C
+C
+C* 3.2 READ BUFR TABLE C.
+C ------------------
+ 320 CONTINUE
+C
+c YTAC=CROOT(1:I)//YTABC
+C
+c CALL CTABLE1(YTAC,KERR)
+c IF(KERR.NE.0) RETURN
+C
+C
+C* 3.3 READ BUFR TABLE D.
+C ------------------
+ 330 CONTINUE
+C
+ YTAD=CROOT(1:I)//YTABD
+C
+ CALL DTABLE1(YTAD,KERR)
+ IF(KERR.NE.0) RETURN
+C
+ RETURN
+C
+ END
diff --git a/bufrdc/buetd.F b/bufrdc/buetd.F
new file mode 100755
index 0000000..8eba9f1
--- /dev/null
+++ b/bufrdc/buetd.F
@@ -0,0 +1,342 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUETD(KPT,KTDLEN,KTDLST,KDLEN,KDATA,KSEC3,
+ 1 KVALS,VALUES,KELEM,KERR)
+C
+C**** *BUETD*
+C
+C
+C PURPOSE.
+C --------
+C
+C EXPAND SECTION 3 OF BUFR MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUETD(KPT,KTDLEN,KTDLST,KDLEN,KDATA,KSEC3,
+C KVALS,VALUES,KELEM,KERR)
+C
+C INPUT :
+C *KPT* - POINTER TO KDATA ARRAY
+C *KTDLEN* - NUMBER OF DATA DESCRIPTORS IN SECTION 3
+C *KTDLST* - ARRAY CONTAINING DATA DESCRIPTORS IN SECTION 3
+C *KDLEN* - DIMENSION OF KDATA ARRAY
+C *KDATA* - ARRAY CONTAINING DATA NEEDED FOR DATA DESCRIPTOR
+C EXPANSION
+C *KSEC3* - ARRAY CONTAINING SECTION 3 INFORMATION
+C KSEC3( 1)-- LENGTH OF SECTION 3 (BYTES)
+C KSEC3( 2)-- RESERVED
+C KSEC3( 3)-- NUMBER OF SUBSETS
+C KSEC3( 4)-- FLAG (DATA TYPE,DATA COMPRESSION)
+C OUTPUT :
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C DATA DESCRIPTOR TAKEN FROM KTDLST ARRAY ARE FULLY
+C EXPANDED USING DATA FROM KDATA ARRAY IF NEEDED.
+C ( DELAYED REPLICATION FACTORS ETC.)
+C
+C
+C EXTERNALS.
+C ----------
+C
+C BUNEXS - SET WORD AND BIT POINTERS AT THE BEGINING OF
+C NEXT SECTION
+C BUNPCK - UNPACKS BIT PATHERN
+C BUREP - SOLVES REPLICATION PROBLEM
+C BUETDR - SOLVES TABLE D REFERENCE
+C BUOPER - PROCESS OPERATOR
+C BUEPWT - UPDATES WORKING TABLE
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+# include "bcmbef.F"
+# include "bcmwt.F"
+# include "bcmwtc.F"
+# include "bcmel.F"
+# include "bcmoff.F"
+C
+ CHARACTER CWTEN*64,CWTU*24
+C
+#ifndef R_4
+ REAL*8 VALUES(KVALS)
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL VALUES(KVALS)
+ REAL RVIND
+ REAL EPS
+#endif
+C
+ DIMENSION ISTACK(JELEM),IISTACK(JELEM)
+ DIMENSION IMASK(8)
+C
+ DIMENSION KSEC3(JSEC3)
+ DIMENSION KDATA(KDLEN),KTDLST(KTDLEN)
+C
+ DATA IMASK/1,2,4,8,16,32,64,128/
+C ------------------------------------------------------------------
+C
+C* 1.
+C --------------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ N = KSEC3(3)
+C
+C
+C* 2. EXPAND DATA DESCRIPTORS.
+C ------------------------
+ 200 CONTINUE
+C
+C
+C* 2.1 SET EXPECTED NUMBER OF DATA DESCRIPTORS.
+C ----------------------------------------
+C AND INITIALIZE NUMBER OF DATA VALUES PER SUB-SET.
+C -------------------------------------------------
+ 210 CONTINUE
+C
+ J = 0
+ IF(OMULTI) THEN
+ IF(NSUBSET.EQ.1) KPT = 0
+ ELSE
+ KPT = 0
+ END IF
+ NWT = 0
+ JMAX = KTDLEN
+ JMAXNEW=JMAX
+C
+ IF(KTDLEN.GT.JELEM) THEN
+ WRITE(KNTN,*) ' BUETD :'
+ KERR=29
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+C* 2.2 PUT DATA DESCRIPTORS IN STACK.
+C ------------------------------
+ 220 CONTINUE
+C
+ DO 221 JJ=1,JMAX
+C
+ ISTACK(JJ)=KTDLST(JJ)
+ IISTACK(JJ)=ISTACK(JJ)
+C
+ 221 CONTINUE
+C
+C* 2.2.1 CHECK IF IT IS SAME DATA DESCRIPTOR DESCRIOPTION.
+C -------------------------------------------------
+C TO MAKE MORE EFFICIENT DATA DESCRIPTOR DESCRIPTION
+C EXPANSION, IN CASE THAT DELAYED REPLICATION FACTOR
+C IS NOT PRESENT AND DATA DESCRIPTORS ARE THE SAME,
+C PREVIOUS WORKING TABLE SHOULD BE USED. IT IS POSIBLE
+C AT THIS PLACE IN THE FUTURE TO MAKE MORE SOPHISTICATED
+C CONTROL.
+C
+C
+ DO 222 JC=1,JMAX
+C
+ IF(ISTACK(JC).NE.NSTACK(JC)) THEN
+C
+C
+ ODREPF=.FALSE.
+C
+C SWAP CONTENT OF THE STACKS.
+C
+ DO 223 JJC=1,JMAX
+ NSTACK(JJC)=ISTACK(JJC)
+ 223 CONTINUE
+C
+ NTDLEN = JMAX
+ M=0
+ NOLD=N
+ NFCM=0
+ MREL=0
+ OMARKER=.FALSE.
+ MBMP=0
+ MBMPL=0
+C
+ GO TO 230
+C
+ END IF
+C
+ 222 CONTINUE
+C
+C
+C* IF MARKER OPERATOR PRESENT EXPAND DESCRIPTORS AGAIN
+C
+ IF(OMARKER) THEN
+ NTDLEN = JMAX
+ M=0
+ NOLD=N
+ NFCM=0
+ MREL=0
+ OMARKER=.FALSE.
+ MBMP=0
+ MBMPL=0
+ GO TO 230
+ END IF
+C
+C* RETURN IF DELAYED REPLICATION FACTOR IS NOT PRESENT.
+C
+ IF(JMAX.NE.NTDLEN) THEN
+ M=0
+ NOLD=N
+ NFCM=0
+ MREL=0
+ OMARKER=.FALSE.
+ NTDLEN=JMAX
+ MBMP=0
+ MBMPL=0
+ GO TO 230
+ END IF
+C
+ OB=.FALSE.
+ IF(IAND(KSEC3(4),IMASK(7)).NE.0) OB=.TRUE.
+ IF(.NOT.ODREPF) THEN
+ IF(N.GT.NOLD) NOLD=N
+ IF(OB.AND.NFCM.EQ.1) GO TO 300
+ IF(.NOT.OB.AND.NFCM.EQ.0) GO TO 300
+ END IF
+C
+ M=0
+ NOLD=N
+ NFCM=0
+ MREL=0
+ OMARKER=.FALSE.
+ NTDLEN=JMAX
+ MBMP=0
+ MBMPL=0
+C
+C ------------------------------------------------------------------
+C* 2.3 GET NEXT DESCRIPTOR FROM THE STACK.
+C -----------------------------------
+ 230 CONTINUE
+C
+ J = J + 1
+ IF(J.GT.JMAX) GO TO 270
+C
+ IDD = ISTACK(J)
+ IF(IDD.EQ.0) GO TO 230
+C
+ IF = IDD/100000
+C
+C ------------------------------------------------------------------
+C* 2.4 CHECK IF IT IS REPLICATION DESCRIPTOR.
+C --------------------------------------
+ 240 CONTINUE
+C
+ IF(IF.EQ.0) THEN
+C
+C* 2.6 ELEMENT DESCRIPTOR, SO UPDATE WORKING TABLE.
+C --------------------------------------------
+ 260 CONTINUE
+C
+ CALL BUEPWT(IDD,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ ELSEIF(IF.EQ.1) THEN
+C
+C* 2.4.1 SOLVE REPLICATION PROBLEM.
+C --------------------------
+C
+ CALL BUREP(KPT,KDLEN,KDATA,J,JMAX,IDD,ISTACK,KERR)
+ IF(KERR.GT.0) RETURN
+ GO TO 230
+C
+ ELSEIF(IF.EQ.2) THEN
+C
+C
+C* 2.5.3 PROCESS OPERATOR.
+C -----------------
+ CALL BUOPER(KPT,KDLEN,KDATA,J,IDD,ISTACK,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ ELSEIF(IF.EQ.3) THEN
+C
+C
+C* 2.5.2 REPLACE BY LIST OF DESCRIPTORS FROM TABLE *D.
+C ---------------------------------------------
+ CALL BUETDR(J,JMAX,IDD,ISTACK,KERR)
+ IF(KERR.GT.0) THEN
+ DO 252 IQ=1,JELEM
+ NSTACK(IQ)=0.
+ 252 CONTINUE
+ RETURN
+ END IF
+ ELSE
+ KERR=37
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ GO TO 230
+C
+C ------------------------------------------------------------------
+C* 2.7 RESOLVE MARKER OPERATOR.
+C ------------------------
+ 270 CONTINUE
+C
+ IF(OMARKER) THEN
+ CALL BUEPMRK(KSEC3,KVALS,VALUES,KELEM,KERR)
+ IF(KERR.GT.0) RETURN
+ END IF
+C
+C ------------------------------------------------------------------
+C
+C* 3. COLLECT SUPPLEMENTARY ITEMS.
+C -----------------------------
+ 300 CONTINUE
+C
+ N08=0
+ N07=0
+ N40=0
+ NDWINC=0
+ NSCAM=0
+ NSCAM07=0
+ NDWINC07=0
+ NFD=0
+
+ DO I=1,100
+ NAFDWA(I)=0
+ END DO
+
+C
+ NFCM=0
+ IF(OB) NFCM=1
+C
+ RETURN
+ END
diff --git a/bufrdc/buetdr.F b/bufrdc/buetdr.F
new file mode 100755
index 0000000..28719d7
--- /dev/null
+++ b/bufrdc/buetdr.F
@@ -0,0 +1,157 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUETDR(KJ,KJ1,KDD,KSTACK,KERR)
+C
+C**** *BUETDR*
+C
+C
+C PURPOSE.
+C --------
+C SOLVE BUFR TABLE D REFERENCE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUETDR(KJ,KJ1,KDD,KSTACK,KERR)*
+C
+C INPUT :
+C *KDD* - DATA DESCRIPTOR
+C OUTPUT:
+C *KJ* - POINTER TO KSTACK ARRAY
+C *KJ1* - POINTER TO LAST ELEMENT IN KSTACK
+C *KSTACK* - LIST OF DATA DESCRIPTORS
+C *KERR* - RETURN ERROR CODE
+C
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwt.F"
+# include "bcmwtc.F"
+# include "bcmtab.F"
+# include "bcmtabc.F"
+C
+ CHARACTER CTABBEN*64,CTABBU*24
+C
+ DIMENSION ILIST(JELEM),KSTACK(*)
+C
+C ------------------------------------------------------------------
+C
+C* 1. OBTAIN LIST OF DESCRIPTORS FROM BUFR TABLE D.
+C ---------------------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ DO 110 J=1,JTAB
+C
+ IF(KDD.EQ.NTABDTR(J)) THEN
+ I=J
+ GO TO 120
+ END IF
+C
+ 110 CONTINUE
+C
+ KERR=20
+ CALL BUERR(KERR)
+ WRITE(KNTN,*) 'REFERENCE INVOLVED ',KDD
+ RETURN
+C
+ 120 CONTINUE
+C
+ J1=NTABDST(I)
+ J2=NTABDL (I)
+ J3=0
+C
+ DO 121 J=J1,J1+J2-1
+C
+ J3 = J3 +1
+ ILIST(J3) = NTABDSQ(J)
+C
+ 121 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 2. PUSH DOWN DATA DESCRIPTION DESCRIPTORS
+C --------------------------------------
+C TO MAKE ROOM FOR LIST.
+C ----------------------
+ 200 CONTINUE
+C
+ J2M1=J2-1
+C
+ DO 210 J=KJ1,KJ+1,-1
+C
+ KSTACK(J+J2M1) = KSTACK(J)
+C
+ 210 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 3. INSERT LIST IN PLACE OF SEQUENCE DESCRIPTORS.
+C ---------------------------------------------
+ 300 CONTINUE
+C
+ KJM1=KJ-1
+C
+ DO 310 J=1,J3
+C
+ KSTACK(KJM1+J)= ILIST(J)
+C
+ 310 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 4. ADJUST DESCRIPTOR COUNT FOR LIST LENGTH.
+C ----------------------------------------
+ 400 CONTINUE
+C
+ KJ = KJ - 1
+ KJ1 = KJ1 +J3 -1
+C ------------------------------------------------------------------
+C* 4.1 ADJUST NUMBER OF DATA DESCRIPTORS NOT PRESENT.
+C ----------------------------------------------
+ 610 CONTINUE
+C
+ IF(N221.NE.0) N221= KJ1 - KJ + 1
+C -----------------------------------------------------------------
+ 500 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/bufrdc/buevar.F b/bufrdc/buevar.F
new file mode 100755
index 0000000..0b93186
--- /dev/null
+++ b/bufrdc/buevar.F
@@ -0,0 +1,237 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUEVAR(KERR)
+C
+C**** *BUEVAR*
+C
+C
+C PURPOSE.
+C --------
+C INITIALIZE CONSTANTS AND VARIABLES.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUEVAR(KERR)*
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C GETENV - GETS VALUE OF AN ENVIRONMENT VARIABLE.
+C EMOSNUM - GIVES CURRENT EMOSLIB VERSION NUMBER.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/03/92.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomatb.F"
+# include "bcombef.F"
+# include "bcomwork.F"
+# include "bcomwt.F"
+# include "bcomroot.F"
+# include "bcprq.F"
+# include "bcomtabload.F"
+# include "bcomtabloadc.F"
+# include "bcomoff.F"
+
+C
+ CHARACTER*256 CROOT, HDEFAULT,CPRINT
+ CHARACTER*9 STD_OUT,YKNTN, CTU
+ CHARACTER*24 CTABLE_LIST,CCTABBU
+ CHARACTER*64 CCTABBEN
+ LOGICAL OPRINT,OS4
+C
+ INTEGER IEMOSNM
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+C
+C EXTERNAL FUNCTIONS
+C
+ INTEGER EMOSNUM
+ EXTERNAL EMOSNUM
+
+#ifdef TABLE_PATH
+ DATA HDEFAULT / TABLE_PATH /
+#else
+ DATA HDEFAULT / '' /
+#endif
+
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE VARIABLES AND CONSTANTS.
+C -----------------------------------
+ 100 CONTINUE
+C
+ IF(KERR.GT.0) RETURN
+C
+ NJA= 0
+ M =0
+ MM =0
+ N =0
+ JCV=0
+ NBPW=JBPW
+ NWPT=0
+ NBPT=0
+ NWPTB=0
+ NBPTB=0
+ NSTOP=2147483647
+ NVIND=2147483647
+ RVIND=1.7D38
+ EPS=10.D-7
+ NBENP=0
+ NLTVNP=0
+ NWWP=0
+ NXXP=0
+ NYYP=0
+ NZZP=0
+ NTC=0
+ NTT=0
+ NDWINC=0
+ NSCAM=0
+ NSCAM07=0
+ NDWINC07=0
+ N07=0
+ NAFDW=0
+ NFD=0
+ NWT=0
+ ODREPF=.FALSE.
+ OS4=.FALSE.
+ N221=0
+ N40=0
+ MREL=0
+ NFCM=0
+ MBMP=0
+ MBMPL=0
+ OMARKER=.FALSE.
+ CROOT=' '
+ NREP=0
+ OREP=.false.
+ N08=0
+ NSSP=0
+C
+C STANDARD OUTPUT UNIT NUMBER
+C
+ STD_OUT=' '
+ YKNTN=' '
+ CALL GETENV('STD_OUT',YKNTN)
+ INKNTN=INDEX(YKNTN,' ')
+ IF(INKNTN.EQ.1) THEN
+ KNTN=6
+ ELSE
+ READ(YKNTN,'(I3.3)') KNTN
+ END IF
+C
+C CHECK SECTION 4 SIZE
+ CS4=' '
+ CALL GETENV('CHECK_S4',CS4)
+ ILNG=INDEX(CS4,' ')
+ IF(ILNG.LE.1) THEN
+ OS4=.false.
+ ELSEIF(CS4(1:4).EQ.'TRUE'.or.CS4(1:4).EQ.'true') then
+ OS4=.true.
+ END IF
+C
+ CALL GETENV('USE_TABLE_C',CTU)
+ ILNG=INDEX(CTU,' ')
+ IF(ILNG.LE.1) THEN
+ OCTABLE=.false.
+ ELSEIF(CTU(1:4).eq.'true'.or.CTU.eq.'TRUE') then
+ OCTABLE=.true.
+ END IF
+ CALL GETENV('BUFR_TABLES',CROOT)
+ ILNG=INDEX(CROOT,' ')
+ IF(ILNG.LE.1) THEN
+ ILNG=INDEX(HDEFAULT,' ') - 1
+ IF(ILNG.GT.0) THEN
+ CROOT = HDEFAULT(1:ILNG)//'/bufrtables/'
+ ELSE
+ CROOT='/home/ma/emos/tables/bufr/text/'
+C
+C SGI/HP/SUN BUFR TABLES PATH
+C
+C
+C ADD VERSION NUMBER
+C
+ ILNG=INDEX(CROOT,' ')
+ IEMOSNM = EMOSNUM(1)
+ WRITE(CROOT(ILNG:ILNG+5),'(I6.6)') IEMOSNM
+ CROOT(ILNG+6:) = '/'
+ ENDIF
+ ENDIF
+C
+ CPRINT=' '
+ OPRINT=.TRUE.
+ CALL GETENV('PRINT_TABLE_NAMES',CPRINT)
+ ILN=INDEX(CPRINT,' ')
+ IF(ILN.LE.1) THEN
+ OPRINT=.TRUE.
+ ELSE
+ IF(CPRINT(1:ILN-1).EQ.'FALSE'.OR.
+ 1 CPRINT(1:ILN-1).EQ.'false') OPRINT=.FALSE.
+ END IF
+
+ IF(OPRINT) THEN
+C
+ WRITE(KNTN,'(1H ,A)') ' ECMWF '
+ WRITE(KNTN,'(1H )')
+ WRITE(KNTN,'(1H ,A,A)') ' BUFR DECODING SOFTWARE',
+ 1' VERSION - 7.2 '
+ WRITE(KNTN,'(1H ,A)') ' 1 APRIL 2007. '
+ WRITE(KNTN,'(1H )')
+ WRITE(KNTN,'(1H )')
+ WRITE(KNTN,'(1H )')
+ WRITE(KNTN,'(1H ,A)') 'Your path for bufr tables is :'
+ WRITE(KNTN,'(1H ,A)') CROOT(1:ILNG+6)
+ END IF
+C
+ DO 101 I=1,JBPW-2
+ NMASK(I)=2**I-1
+ 101 CONTINUE
+ IF(JBPW.EQ.32) THEN
+ NMASK(31)=2147483647
+ END IF
+C
+ IF(NPMISS.LT.0.OR.NPMISS.GT.1) NPMISS=0
+ IF(NPRUS.LT.0.OR.NPRUS.GT.1) NPRUS=0
+ IF(NOKEY.LT.0.OR.NOKEY.GT.1) NOKEY=0
+ IF(NOFL.LT.0.OR.NOFL.GT.1) NOFL=0
+C
+ RETURN
+ END
diff --git a/bufrdc/buexs0.F b/bufrdc/buexs0.F
new file mode 100755
index 0000000..c9e6aa8
--- /dev/null
+++ b/bufrdc/buexs0.F
@@ -0,0 +1,184 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUEXS0( KBUFL,KBUFF,KSUP,KSEC0,KERR)
+C
+C**** *BUEXS0*
+C
+C
+C PURPOSE.
+C --------
+C EXPANDS SECTION 0 OF BUFR MESSAGE. SAVES BUFR EDITION NUMBER
+C AND TOTAL LENGTH OF BUFR MESSAGE (BYTES).
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUEXS0( KBUFL,KBUFF,KSUP,KSEC0,KERR)*
+C
+C INPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C OUTPUT:
+C *KSUP* - ARRAY CONTAINING SUPLEMENTARY INFORMATION
+C - KSUP( 1) -- IDIM1, DIMENSION OF KSEC1
+C - KSUP( 2) -- IDIM2, DIMENSION OF KSEC2
+C - KSUP( 3) -- IDIM3, DIMENSION OF KSEC3
+C - KSUP( 4) -- IDIM4, DIMENSION OF KSEC4
+C - KSUP( 5) -- M (NUMBER OF ELEMENTS IN VALUES ARRAY,
+C FIRST INDEX)
+C - KSUP( 6) -- N (NUMBER OF SUBSETS,SECOND INDEX OF
+C VALUES ARRAY)
+C - KSUP( 7) -- JVC (NUMBER OF ELEMENTS IN CVAL ARRAY)
+C - KSUP( 8) -- TOTAL BUFR MESSAGE LENGTH IN BYTES
+C - KSUP( 9) -- IDIM0, DIMENSION OF KSEC0
+C *KSEC0* - ARRAY CONTAINING SECTION 0 INFORMATION
+C KSEC0( 1)-- LENGTH OF SECTION 0 (BYTES)
+C KSEC0( 2)-- TOTAL LENGTH OF BUFR MESSAGE (BYTES)
+C KSEC0( 3)-- BUFR EDITION NUMBER
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C --------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C BUNPKS - UNPACK BIT PATTERN IN REPEATED WAY
+C BUNPCK - UNPACK BIT PATTERN
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/09/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+C
+ DIMENSION KBUFF(KBUFL),KSUP(*),KSEC0(*)
+ DIMENSION IBUFR(4)
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+C
+ CHARACTER*4 YBUFR
+C
+C ------------------------------------------------------------------
+C* 1. EXPAND SECTION 0.
+C -----------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+C
+C* 1.1 INITIALIZE WORKING POINTERS NWPT AND NBPT.
+C ------------------------------------------
+ IWPT = 0
+ IBPT = 0
+ NWPT = 1
+ NBPT = 0
+C
+C* 1.2 UNPACK FIRST FOUR OCTETS CONTAINING *BUFR*.
+C -------------------------------------------
+C
+ CALL BUNPKS(NBPW,KBUFF,IBUFR,NWPT,NBPT,8,0,4,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING FIRST FOUR OCTETS OF BUFR
+ 1 MESSAGE.'
+ RETURN
+ END IF
+C
+C* 1.3 CHECK IF FIRST FOUR OCTETS ARE 'BUFR'.
+C --------------------------------------
+ YBUFR=CHAR(IBUFR(1))//CHAR(IBUFR(2))//
+ 1 CHAR(IBUFR(3))//CHAR(IBUFR(4))
+ IF(YBUFR.NE.'BUFR') THEN
+ KERR = 1
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+C* 1.4 UNPACK BUFR EDITION NUMBER (IT IS 8TH BYTE ).
+C ---------------------------------------------
+ 140 CONTINUE
+C
+ IWPT=56/NBPW+1
+ IBPT=56-(IWPT-1)*NBPW
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC0(3),IWPT,IBPT,8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC0(3).'
+ RETURN
+ END IF
+C
+ IF(KSEC0(3).LE.1) GO TO 170
+C
+C* 1.5 UNPACK TOTAL LENGTH OF BUFR MESSAGE.
+C ------------------------------------
+ 150 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC0(2),NWPT,NBPT,24,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC0(2).'
+ RETURN
+ END IF
+C
+C* 1.6 UNPACK BUFR EDITION NUMBER.
+C ---------------------------
+ 160 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC0(3),NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC0(3).'
+ RETURN
+ END IF
+C
+C
+C* 1.7 SET LENGTH OF SECTION 0.
+C ------------------------
+ 170 CONTINUE
+C
+ KSEC0(1)= 4
+ IF(KSEC0(3).GT.1) KSEC0(1)= 8
+C
+C* 1.8 SET SUPPLEMENTARY INFORMATION.
+C ------------------------------
+ 180 CONTINUE
+C
+ KSUP (9)= 3
+C
+ RETURN
+C -----------------------------------------------------------------
+C
+ END
diff --git a/bufrdc/buexs1.F b/bufrdc/buexs1.F
new file mode 100755
index 0000000..20c9bf2
--- /dev/null
+++ b/bufrdc/buexs1.F
@@ -0,0 +1,593 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUEXS1( KBUFL,KBUFF,KSUP,KSEC0,KSEC1,KERR)
+C
+C**** *BUEXS1*
+C
+C
+C PURPOSE.
+C --------
+C EXPANDS SECTION 1 OF BUFR MESSAGE. SAVES EXPANDED INFORMATION
+C IN THE ARRAY KSEC1.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUEXS1( KBUFL,KBUFF,KSUP,KSEC0,KSEC1,KERR)*
+C
+C INPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C OUTPUT:
+C *KSUP* - ARRAY CONTAINING SUPLEMENTARY INFORMATION
+C - KSUP( 1) -- IDIM1, DIMENSION OF KSEC1
+C - KSUP( 2) -- IDIM2, DIMENSION OF KSEC2
+C - KSUP( 3) -- IDIM3, DIMENSION OF KSEC3
+C - KSUP( 4) -- IDIM4, DIMENSION OF KSEC4
+C - KSUP( 5) -- M (NUMBER OF ELEMENTS IN VALUES ARRAY,
+C FIRST INDEX)
+C - KSUP( 6) -- N (NUMBER OF SUBSETS,SECOND INDEX OF
+C VALUES ARRAY)
+C - KSUP( 7) -- JVC (NUMBER OF ELEMENTS IN CVAL ARRAY)
+C - KSUP( 8) -- TOTAL BUFR MESSAGE LENGTH IN BYTES
+C - KSUP( 9) -- IDIM0, DIMENSION OF KSEC0
+C *KSEC0* - ARRAY CONTAINING SECTION 0 INFORMATION
+C KSEC0( 1)-- LENGTH OF SECTION 0 (BYTES)
+C KSEC0( 2)-- TOTAL LENGTH OF BUFR MESSAGE (BYTES)
+C KSEC0( 3)-- BUFR EDITION NUMBER
+C *KSEC1* - ARRAY CONTAINING SECTION 1 INFORMATION
+C KSEC1( 1)-- LENGTH OF SECTION 1 (BYTES)
+C KSEC1( 2)-- BUFR EDITION NUMBER
+C KSEC1( 3)-- ORIGINATING CENTRE
+C KSEC1( 4)-- UPDATE SEQUENCE NUMBER
+C KSEC1( 5)-- FLAG (PRESENCE OF SECTION 2)
+C KSEC1( 6)-- BUFR MESSAGE TYPE
+C KSEC1( 7)-- BUFR MESSAGE SUBTYPE
+C KSEC1( 8)-- VERSION NUMBER OF LOCAL TABLE USED
+C KSEC1( 9)-- YEAR
+C KSEC1(10)-- MONTH
+C KSEC1(11)-- DAY
+C KSEC1(12)-- HOUR
+C KSEC1(13)-- MINUTE
+C KSEC1(14)-- BUFR MASTER TABLE
+C KSEC1(15)-- VERSION NUMBER OF MASTER TABLE USED
+C KSEC1(16) - KSEC1(JSEC1) -- LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 3 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- NOT USED
+C KSEC1(18) TO KSEC1(JSEC1) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 4 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- INTERNATIONAL SUB-CATEGORY (SEE COMMON TABLE C-13
+C KSEC1(18)-- SECOND
+C KSEC1(19)-- YEAR
+C KSEC1(20)-- MONTH
+C KSEC1(21)-- DAY
+C KSEC1(22)-- HOUR
+C KSEC1(23)-- MINUTE
+C KSEC1(24)-- SECOND
+C KSEC1(25)-- YEAR
+C KSEC1(26)-- MONTH
+C KSEC1(27)-- DAY
+C KSEC1(28)-- HOUR
+C KSEC1(29)-- MINUTE
+C KSEC1(30)-- SECOND
+C KSEC1(31)-- MOST SOUTHERN LATITUDE (-90 to 90)
+C KSEC1(32)-- MOST WESTERN LONGITUDE ( 0-360)
+C KSEC1(33)-- MOST NORTHEN LATITUDE (-90 to 90)
+C KSEC1(34)-- MOST EASTERN LONGITUDE ( 0-360)
+C KSEC1(35) TO KSEC1(JSEC1) - LOCAL ADP CENTRE INFORMATION(PACKED FORM)
+C
+C
+C *METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C BUNPCK - UNPACK BIT PATTERN
+C BUNEXS - SET WORD AND BIT POINTERS AT THE BEGINING OF
+C NEXT SECTION
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 16/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+C
+ DIMENSION KBUFF(KBUFL),KSUP(JSUP),KSEC0(JSEC0),KSEC1(JSEC1)
+ DIMENSION ISEC1(JSEC1)
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+C
+C
+C ------------------------------------------------------------------
+C* 1. EXPAND SECTION 1.
+C ------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+C SAVE WORD AND BIT POINTERS OF THR BRGINING OF SECTION 1.
+C
+ IWPTB=NWPT
+ IBPTB=NBPT
+C
+C* 1.1 UNPACK LENGTH OF SECTION 1.
+C ----------------------------
+ 110 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(1),NWPT,NBPT,24,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(1).'
+ RETURN
+ END IF
+C IF(KSEC1(1).GT.18) THEN
+C WRITE(KNTN,*) 'LOCAL ADP CENTRE INFORMATION PRESENT
+C 1 IN THE SECTION 1.'
+C END IF
+C
+C* 1.1.1 SET THE POINTERS NWPTB AND NBPTB.
+C ---------------------------------
+C TO BEGINING OF THE NEXT SECTION.
+C --------------------------------
+ 1110 CONTINUE
+C
+ CALL BUNEXS(KSEC1(1))
+C
+C
+C* 1.2 UNPACK BUFR EDITION NUMBER/MASTER TABLE USED.
+C ---------------------------------------------
+ 120 CONTINUE
+C
+ IF(KSEC0(3).LE.1) THEN
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(2),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(2).'
+ RETURN
+ END IF
+ ELSE
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(14),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(14).'
+ RETURN
+ END IF
+C
+ KSEC1(2)=KSEC0(3)
+ END IF
+C
+C* 1.3 UNPACK ORIGINATING CENTRE.
+C --------------------------
+ 130 CONTINUE
+C
+ IF(KSEC0(3).LT.3) THEN
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(3),NWPT,NBPT,16,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(3).'
+ RETURN
+ END IF
+ ELSEIF(KSEC0(3).EQ.3) THEN
+C BUFR Edition 3
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(16),NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(3).'
+ RETURN
+ END IF
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(3),NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(3).'
+ RETURN
+ END IF
+ ELSEIF(KSEC0(3).EQ.4) THEN
+C BUFR Edition 4
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(3),NWPT,NBPT,16,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(3).'
+ RETURN
+ END IF
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(16),NWPT,NBPT,16,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(16).'
+ RETURN
+ END IF
+ END IF
+
+C
+C* 1.4 UNPACK UPDATE SEQUENCE NUMBER.
+C ------------------------------
+ 140 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(4),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(4).'
+ RETURN
+ END IF
+C
+C* 1.5 UNPACK INTEGER VALUE OF THE OCTET CONTAINING
+C --------------------------------------------
+C FLAG BITS(ZERO IF SECTION TWO IS NOT PRESENT).
+C ----------------------------------------------
+ 150 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(5),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(5).'
+ RETURN
+ END IF
+C
+C* 1.6 UNPACK *BUFR* MESSAGE TYPE.
+C ---------------------------
+ 160 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(6),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(6).'
+ RETURN
+ END IF
+C
+C* 1.7 UNPACK *BUFR* MESSAGE SUB-TYPE.
+C -------------------------------
+ 170 CONTINUE
+C
+ IF(KSEC0(3).EQ.4) THEN
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(17),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(17).'
+ RETURN
+ END IF
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(7),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(7).'
+ RETURN
+ END IF
+ ELSE
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(7),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(7).'
+ RETURN
+ END IF
+ END IF
+C
+C* 1.8 UNPACK LOCAL TABLE VERSION NUMBER OR
+C ------------------------------------
+C VERSION NUMBER OF MASTER TABLE USED.
+C -----------------------------------
+ 180 CONTINUE
+C
+ IF(KSEC0(3).LE.1) THEN
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(8),NWPT,NBPT,16,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(8).'
+ RETURN
+ END IF
+ ELSE
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(15),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(15).'
+ RETURN
+ END IF
+ CALL BUNPCK(NBPW,KBUFF,KSEC1( 8),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(8).'
+ RETURN
+ END IF
+ END IF
+C
+C* 1.9 UNPACK YEAR.
+C ------------
+ 190 CONTINUE
+C
+ IF(KSEC0(3).EQ.4) THEN
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(9),NWPT,NBPT,16,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(9).'
+ RETURN
+ END IF
+ ELSE
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(9),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(9).'
+ RETURN
+ END IF
+ END IF
+C
+C* 2. UNPACK MONTH.
+C -------------
+ 200 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(10),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(10).'
+ RETURN
+ END IF
+C
+C* 2.1 UNPACK DAY.
+C -----------
+ 210 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(11),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(11).'
+ RETURN
+ END IF
+C
+C* 2.2 UNPACK HOUR.
+C ------------
+ 220 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(12),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(12).'
+ RETURN
+ END IF
+C
+C* 2.3 UNPACK MINUTE.
+C --------------
+ 230 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(13),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(13).'
+ RETURN
+ END IF
+C
+C 2.3.1 UNPACK SECOND
+C -------------
+ IF(KSEC0(3).EQ.4) THEN
+ CALL BUNPCK(NBPW,KBUFF,KSEC1(18),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(13).'
+ RETURN
+ END IF
+C
+C METADATA
+C
+C YEAR
+C
+c CALL BUNPCK(NBPW,KBUFF,KSEC1(19),NWPT,NBPT,16,KERR)
+c IF(KERR.GT.0) THEN
+c WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(19).'
+c RETURN
+c END IF
+C
+C* UNPACK MONTH.
+C -------------
+C
+c CALL BUNPCK(NBPW,KBUFF,KSEC1(20),NWPT,NBPT, 8,KERR)
+c IF(KERR.GT.0) THEN
+c WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(20).'
+c RETURN
+c END IF
+C
+C* UNPACK DAY.
+C -----------
+C
+c CALL BUNPCK(NBPW,KBUFF,KSEC1(21),NWPT,NBPT, 8,KERR)
+c IF(KERR.GT.0) THEN
+c WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(21).'
+c RETURN
+c END IF
+C
+C* UNPACK HOUR.
+C ------------
+C
+c CALL BUNPCK(NBPW,KBUFF,KSEC1(22),NWPT,NBPT, 8,KERR)
+c IF(KERR.GT.0) THEN
+c WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(22).'
+c RETURN
+c END IF
+C
+C* UNPACK MINUTE.
+C --------------
+C
+c CALL BUNPCK(NBPW,KBUFF,KSEC1(23),NWPT,NBPT, 8,KERR)
+c IF(KERR.GT.0) THEN
+c WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(23).'
+c RETURN
+c END IF
+C
+C UNPACK SECOND
+C -------------
+c CALL BUNPCK(NBPW,KBUFF,KSEC1(24),NWPT,NBPT, 8,KERR)
+c IF(KERR.GT.0) THEN
+c WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(24).'
+c RETURN
+c END IF
+C
+C YEAR
+C
+c CALL BUNPCK(NBPW,KBUFF,KSEC1(25),NWPT,NBPT,16,KERR)
+c IF(KERR.GT.0) THEN
+c WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(25).'
+c RETURN
+c END IF
+C
+C* UNPACK MONTH.
+C -------------
+C
+c CALL BUNPCK(NBPW,KBUFF,KSEC1(26),NWPT,NBPT, 8,KERR)
+c IF(KERR.GT.0) THEN
+c WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(26).'
+c RETURN
+c END IF
+C
+C* UNPACK DAY.
+C -----------
+C
+c CALL BUNPCK(NBPW,KBUFF,KSEC1(27),NWPT,NBPT, 8,KERR)
+c IF(KERR.GT.0) THEN
+c WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(27).'
+c RETURN
+c END IF
+C
+C* UNPACK HOUR.
+C ------------
+C
+c CALL BUNPCK(NBPW,KBUFF,KSEC1(28),NWPT,NBPT, 8,KERR)
+c IF(KERR.GT.0) THEN
+c WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(28).'
+c RETURN
+c END IF
+C
+C* UNPACK MINUTE.
+C --------------
+C
+c CALL BUNPCK(NBPW,KBUFF,KSEC1(29),NWPT,NBPT, 8,KERR)
+c IF(KERR.GT.0) THEN
+c WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(29).'
+c RETURN
+c END IF
+C
+C UNPACK SECOND
+C -------------
+c CALL BUNPCK(NBPW,KBUFF,KSEC1(30),NWPT,NBPT, 8,KERR)
+c IF(KERR.GT.0) THEN
+c WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(30).'
+c RETURN
+c END IF
+C
+C
+C UNPACK MOST SOUTHERN LATITUDE
+C ------------------------------
+C CALL BUNPCK(NBPW,KBUFF,ISG,NWPT,NBPT,1,KERR)
+C IF(KERR.GT.0) THEN
+C WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(31).'
+C RETURN
+C END IF
+C
+c CALL BUNPCK(NBPW,KBUFF,KSEC1(31),NWPT,NBPT,32,KERR)
+c IF(KERR.GT.0) THEN
+c WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(31).'
+c RETURN
+c END IF
+
+C IF(ISG.EQ.1) KSEC1(31)=-KSEC1(31)
+C
+C UNPACK MOST WESTERN LONGITUDE
+C ------------------------------
+c CALL BUNPCK(NBPW,KBUFF,KSEC1(32),NWPT,NBPT,32,KERR)
+c IF(KERR.GT.0) THEN
+c WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(32).'
+c RETURN
+c END IF
+C
+C UNPACK MOST NORTHERN LATITUDE
+C ------------------------------
+C CALL BUNPCK(NBPW,KBUFF,ISG,NWPT,NBPT,1,KERR)
+C IF(KERR.GT.0) THEN
+C WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(33).'
+C RETURN
+C END IF
+
+c CALL BUNPCK(NBPW,KBUFF,KSEC1(33),NWPT,NBPT,32,KERR)
+c IF(KERR.GT.0) THEN
+c WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(33).'
+c RETURN
+c END IF
+
+C IF(ISG.EQ.1) KSEC1(33)=-KSEC1(33)
+C
+C UNPACK MOST EASTERN LONGITUDE
+C ------------------------------
+c CALL BUNPCK(NBPW,KBUFF,KSEC1(34),NWPT,NBPT,32,KERR)
+c IF(KERR.GT.0) THEN
+c WRITE(KNTN,*) 'ERROR UNPACKING KSEC1(34).'
+c RETURN
+c END IF
+C
+ END IF
+C
+C* 2.4 UNPACK LOCAL ADP CENTRE INFORMATION IF ANY.
+C -------------------------------------------
+ 240 CONTINUE
+C
+ IF(KSEC0(3).LT.3) THEN
+ IOFF=KSEC1(1)-17
+ IW=16
+ IBT=0
+ ELSEIF(KSEC0(3).EQ.3) THEN
+ IOFF=KSEC1(1)-17
+ IW=18
+ IBT=0
+ ELSEIF(KSEC0(3).EQ.4) THEN
+C IOFF=KSEC1(1)-52
+ IOFF=KSEC1(1)-22
+c IW=35 ! index for local info
+ IW=19 ! index for local info
+ IBT=0
+ END IF
+ IF(IOFF.LE.JSEC1) THEN
+ CALL BUNPKS(NBPW,KBUFF,ISEC1(1),NWPT,NBPT,
+ 1 8,0,IOFF,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING LOCAL ADP CENTRE INFORMATION'
+ WRITE(KNTN,*) 'IN SECTION 1.'
+ RETURN
+ END IF
+C
+C PACK LOCAL ADP CENTRE INFORMATION INTO KSE1(16) ONWARD.
+C
+ CALL BUPKS(NBPW,KSEC1(IW),ISEC1,IW,IBT,8,0,IOFF,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING LOCAL ADP CENTRE INFORMATION'
+ RETURN
+ END IF
+ ELSE
+ IOFF=0
+ KERR=4
+ CALL BUERR(KERR)
+ GO TO 300
+ END IF
+C
+C
+C* 3. SET SUPPLEMENTARY INFORMATION.
+C ------------------------------
+ 300 CONTINUE
+C
+ KSUP(1)=15+IOFF/4+1
+C
+C ------------------------------------------------------------------
+C
+ RETURN
+ END
diff --git a/bufrdc/buexs2.F b/bufrdc/buexs2.F
new file mode 100755
index 0000000..c9b6c51
--- /dev/null
+++ b/bufrdc/buexs2.F
@@ -0,0 +1,257 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUEXS2( KBUFL,KBUFF,KSUP,KSEC1,KSEC2,KERR )
+C
+C**** *BUEXS2*
+C
+C
+C PURPOSE.
+C --------
+C EXPANDS SECTION 2 OF BUFR MESSAGE. EXPANDED DATA ARE
+C STORED IN THE ARRAY KSEC2.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUEXS2(KBUFL,KBUFF,KSUP,KSEC1,KSEC2,KERR)*
+C
+C INPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C OUTPUT:
+C *KSUP* - ARRAY CONTAINING SUPLEMENTARY INFORMATION
+C - KSUP( 1) -- IDIM1, DIMENSION OF KSEC1
+C - KSUP( 2) -- IDIM2, DIMENSION OF KSEC2
+C - KSUP( 3) -- IDIM3, DIMENSION OF KSEC3
+C - KSUP( 4) -- IDIM4, DIMENSION OF KSEC4
+C - KSUP( 5) -- M (NUMBER OF ELEMENTS IN VALUES ARRAY,
+C FIRST INDEX)
+C - KSUP( 6) -- N (NUMBER OF SUBSETS,SECOND INDEX OF
+C VALUES ARRAY)
+C - KSUP( 7) -- JVC (NUMBER OF ELEMENTS IN CVAL ARRAY)
+C - KSUP( 8) -- TOTAL BUFR MESSAGE LENGTH IN BYTES
+C - KSUP( 9) -- IDIM0, DIMENSION OF KSEC0
+C *KSEC1* - ARRAY CONTAINING SECTION 1 INFORMATION
+C KSEC1( 1)-- LENGTH OF SECTION 1 (BYTES)
+C KSEC1( 2)-- BUFR EDITION NUMBER
+C KSEC1( 3)-- ORIGINATING CENTRE
+C KSEC1( 4)-- UPDATE SEQUENCE NUMBER
+C KSEC1( 5)-- FLAG (PRESENCE OF SECTION 2)
+C KSEC1( 6)-- BUFR MESSAGE TYPE
+C KSEC1( 7)-- BUFR MESSAGE SUBTYPE
+C KSEC1( 8)-- VERSION NUMBER OF LOCAL TABLE USED
+C KSEC1( 9)-- YEAR
+C KSEC1(10)-- MONTH
+C KSEC1(11)-- DAY
+C KSEC1(12)-- HOUR
+C KSEC1(13)-- MINUTE
+C KSEC1(14)-- BUFR MASTER TABLE
+C KSEC1(15)-- VERSION NUMBER OF MASTER TABLE USED
+C KSEC1(16) - KSEC1(JSEC1) -- LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 3 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- NOT USED
+C KSEC1(18) TO KSEC1(JSEC1) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 4 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- INTERNATIONAL SUB-CATEGORY (SEE COMMON TABLE C-13
+C KSEC1(18)-- SECOND
+C KSEC1(19)-- YEAR
+C KSEC1(20)-- MONTH
+C KSEC1(21)-- DAY
+C KSEC1(22)-- HOUR
+C KSEC1(23)-- MINUTE
+C KSEC1(24)-- SECOND
+C KSEC1(25)-- YEAR
+C KSEC1(26)-- MONTH
+C KSEC1(27)-- DAY
+C KSEC1(28)-- HOUR
+C KSEC1(29)-- MINUTE
+C KSEC1(30)-- SECOND
+C KSEC1(31)-- MOST SOUTHERN LATITUDE (-90 to 90)
+C KSEC1(32)-- MOST WESTERN LONGITUDE ( 0-360)
+C KSEC1(33)-- MOST NORTHEN LATITUDE (-90 to 90)
+C KSEC1(34)-- MOST EASTERN LONGITUDE ( 0-360)
+C KSEC1(35) TO KSEC1(JSEC1) - LOCAL ADP CENTRE INFORMATION(PACKED FORM)
+C
+C *KSEC2* - ARRAY CONTAINING SECTION 2 INFORMATION
+C KSEC2( 1)-- LENGTH OF SECTION 2 (BYTES)
+C KSEC2( 2) TO KSEC2(JSEC2) LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C
+C THE LENGTH OF SECTION 2 AND POINTERS TO THE BEGINING
+C OF SECTION 3 ARE SET. RDB KEY IS THEN UNPACKED AND ALL INFORMATION
+C STORED INTO ARRAY KSEC2.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C BUNPCK - UNPACK BIT PATTERN
+C BUNEXS - SET WORD AND BIT POINTERS AT THE BEGINING
+C OF NEXT BUFR SECTION.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 17/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+# include "bcprq.F"
+C
+ DIMENSION KBUFF(KBUFL)
+ DIMENSION KSUP(JSUP),KSEC1(JSEC1),KSEC2(JSEC2)
+ DIMENSION ISEC2(JSEC2),IISEC2(JSEC2)
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+C
+C ------------------------------------------------------------------
+C* 1. EXPAND SECTION 2.
+C -----------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ DO 101 I=1,JSEC2
+ KSEC2(I)=0
+ 101 CONTINUE
+C
+ IF( KSEC1(5) .NE. 0 .AND. KSEC1(5) .NE. 128) THEN
+ KERR=50
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ IF( KSEC1(5).EQ.0) THEN
+ KSUP(2) = 1
+ KSEC2(1)= 0
+ RETURN
+ END IF
+C
+C* 1.1 SET THE POINTERS NWPT AND NBPT AT THE BEGINING OF SECTION.
+C -----------------------------------------------------------
+ 110 CONTINUE
+C
+ NWPT = NWPTB
+ NBPT = NBPTB
+C
+C* 1.2 UNPACK LENGTH OF SECTION 2.
+C ---------------------------
+ CALL BUNPCK(NBPW,KBUFF,KSEC2(1),NWPT,NBPT,24,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC2(1).'
+ RETURN
+ END IF
+C
+C* 1.2.1 SET POINTERS NWPTB AND NBPTB TO THE
+C -----------------------------------
+C BEGINING OF THE NEXT SECTION.
+C -----------------------------
+ CALL BUNEXS(KSEC2(1))
+C
+ CALL BUNPCK(NBPW,KBUFF,IDUMMY,NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING DUMMY OCTET IN SECTION 2.'
+ RETURN
+ END IF
+C
+C* 1.3 UNPACK LOCAL ADP CENTRE INFORMATION.
+C ------------------------------------
+C
+ IOFF=KSEC2(1)-4
+C
+ IF(IOFF.GT.JSEC2) THEN
+ KERR=5
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ CALL BUNPKS(NBPW,KBUFF,ISEC2(1),NWPT,NBPT,
+ 1 8,0,IOFF,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING LOCAL ADP CENTRE INFORMATION'
+ WRITE(KNTN,*) 'IN SECTION2.'
+ RETURN
+ END IF
+C
+ IF(KSEC1(3).EQ.98) THEN
+ IF(NOKEY.EQ.0) THEN
+ IF(ISEC2(2).NE.KSEC1(7)) THEN
+C
+C BYTES IN THE KEY IN REVERSED ORDER.
+C
+ J=0
+ DO 131 I=1,JSEC2,4
+ IISEC2(I)=ISEC2(I+3)
+ IISEC2(I+1)=ISEC2(I+2)
+ IISEC2(I+2)=ISEC2(I+1)
+ IISEC2(I+3)=ISEC2(I)
+ 131 CONTINUE
+ DO 132 I=1,JSEC2
+ ISEC2(I)=IISEC2(I)
+ 132 CONTINUE
+ END IF
+ END IF
+ END IF
+C
+C PACK LOCAL ADP CENTRE INFORMATION INTO KSE2(2) ONWARD.
+C
+ IW=2
+ IBT=0
+ CALL BUPKS(NBPW,KSEC2(IW),ISEC2,IW,IBT,8,0,IOFF,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING LOCAL ADP CENTRE',
+ 1 ' INFORMATION INTO'
+ WRITE(KNTN,*) 'KSEC2(2) ONWARD.'
+ RETURN
+ END IF
+C
+C SET LENGHT OF KSEC2
+C
+ KSUP(2)=IW
+C ------------------------------------------------------------------
+ 200 CONTINUE
+C
+ RETURN
+ END
diff --git a/bufrdc/buexs3.F b/bufrdc/buexs3.F
new file mode 100755
index 0000000..ffa95f7
--- /dev/null
+++ b/bufrdc/buexs3.F
@@ -0,0 +1,516 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUEXS3(KBUFL,KBUFF,KSUP,KSEC3,KELEM,CNAMES,CUNITS,KERR)
+C
+C**** *BUEXS3*
+C
+C
+C PURPOSE.
+C --------
+C
+C EXPAND SECTION 3 OF BUFR MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUEXS3( KBUFL,KBUFF,KSUP,KSEC3,KELEM,CNAMES,CUNITS,KERR)*
+C
+C INPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C *KELEM* - DIMENSION OF CNAMES, CUNITS ARRAY
+C OUTPUT:
+C *KSUP* - ARRAY CONTAINING SUPLEMENTARY INFORMATION
+C - KSUP( 1) -- IDIM1, DIMENSION OF KSEC1
+C - KSUP( 2) -- IDIM2, DIMENSION OF KSEC2
+C - KSUP( 3) -- IDIM3, DIMENSION OF KSEC3
+C - KSUP( 4) -- IDIM4, DIMENSION OF KSEC4
+C - KSUP( 5) -- M (NUMBER OF ELEMENTS IN VALUES ARRAY,
+C FIRST INDEX)
+C - KSUP( 6) -- N (NUMBER OF SUBSETS,SECOND INDEX OF
+C VALUES ARRAY)
+C - KSUP( 7) -- JVC (NUMBER OF ELEMENTS IN CVAL ARRAY)
+C - KSUP( 8) -- TOTAL BUFR MESSAGE LENGTH IN BYTES
+C - KSUP( 9) -- IDIM0, DIMENSION OF KSEC0
+C *KSEC3* - ARRAY CONTAINING SECTION 3 INFORMATION
+C KSEC3( 1)-- LENGTH OF SECTION 3 (BYTES)
+C KSEC3( 2)-- RESERVED
+C KSEC3( 3)-- NUMBER OF SUBSETS
+C KSEC3( 4)-- FLAG (DATA TYPE,DATA COMPRESSION)
+C *CNAMES* - CHARACTER ARRAY CONTAINING ELEMENT NAMES
+C *CUNITS* - CHARACTER ARRAY CONTAINIG UNITS
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C
+C EXPANDS LIST OF DATA DESCRIPTORS PACKED IN SECTION 3
+C OF BUFR MESSAGE. WORKING TABLES FOR FURTHER DATA DECODING ARE SET,
+C LIST OF PACKED BUFR DATA DESCRIPTORS AND LIST OF BUFR DATA DESCRIPTORS
+C EXPANDED ACCORDING TO TABLE D REFERENCE ARE RETURNED RESPECTIVELY.
+C
+C
+C
+C EXTERNALS.
+C ----------
+C
+C BUNEXS - SET WORD AND BIT POINTERS AT THE BEGINING OF
+C NEXT SECTION
+C BUNPCK - UNPACKS BIT PATTERN
+C BUSRP - SOLVES REPLICATION PROBLEM
+C BUSTDR - SOLVES TABLE D REFERENCE
+C BUPRCO - PROCESS OPERATOR
+C BUUPWT - UPDATES WORKING TABLE
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+# include "bcombef.F"
+# include "bcomwt.F"
+# include "bcomp.F"
+# include "bcomwtc.F"
+# include "bcomrq.F"
+# include "bcomreq.F"
+# include "bcomel.F"
+# include "bcprq.F"
+# include "bcomoff.F"
+# include "bcomcom.F"
+C
+ CHARACTER*64 CWTEN
+ CHARACTER*24 CWTU
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+C
+ DIMENSION ISTACK(JELEM),IISTACK(JELEM)
+ DIMENSION KBUFF(KBUFL)
+ DIMENSION IMASK(8)
+C
+#ifndef R_4
+ REAL*8 RQVAL
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RQVAL
+ REAL RVIND
+ REAL EPS
+#endif
+C
+ DIMENSION KSUP(JSUP),KSEC3(JSEC3)
+C
+ DATA IMASK/1,2,4,8,16,32,64,128/
+C
+ SAVE NOLD,KELEMOLD
+C ------------------------------------------------------------------
+C
+C* 1. EXPAND PRELIMINARY ITEMS OF SECTION 3.
+C --------------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+C
+C* 1.1 SET THE POINTERS NWPT AND NBPT TO THE
+C -------------------------------------
+C BEGINING OF THE SECTION 3.
+C --------------------------
+ 110 CONTINUE
+C
+ NWPT = NWPTB
+ NBPT = NBPTB
+C
+C* 1.2 UNPACK LENGTH OF SECTION 3.
+C ---------------------------
+ 120 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC3(1),NWPT,NBPT,24,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC3(1).'
+ RETURN
+ END IF
+C
+C* 1.2.1 SET THE POINTERS NWPTB AND NBPTB TO
+C -----------------------------------
+C THE BEGINNING OF THE NEXT SECTION.
+C ----------------------------------
+ CALL BUNEXS(KSEC3(1))
+C
+C* 1.3 UNPACK ZERO BYTE AND PUT IT IN KSEC3(2).
+C ----------------------------------------
+ 130 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC3(2),NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC3(2).'
+ RETURN
+ END IF
+C
+C* 1.4 UNPACK NUMBER OF DATA SUB-SETS.
+C -------------------------------
+ 140 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC3(3),NWPT,NBPT,16,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC3(3).'
+ RETURN
+ END IF
+ IF(KSEC3(3).LE.0) THEN
+ KERR=32
+ WRITE(KNTN,*) ' BUEXS3 :'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ N = KSEC3(3)
+C
+C
+C* 1.5 UNPACK INTEGER VALUE OF THE OCTET
+C ---------------------------------
+C CONTAINING FLAG BITS.
+C --------------------
+ 150 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC3(4),NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC3(4).'
+ RETURN
+ END IF
+C
+ ICOMP=KSEC3(4)
+C -----------------------------------------------------------------
+C
+C* 2. EXPAND DATA DESCRIPTORS.
+C ------------------------
+ 200 CONTINUE
+C
+C
+C* 2.1 CALCULATE EXPECTED NUMBER OF DATA DESCRIPTORS.
+C ----------------------------------------------
+C AND INITIALIZE NUMBER OF DATA VALUES PER SUB-SET.
+C -------------------------------------------------
+ 210 CONTINUE
+C
+ J = 0
+ NWT = 0
+ JMAX = ( KSEC3(1) - 7)/2
+ JMAXNEW=JMAX
+C
+ IF(JMAX.GT.JELEM) THEN
+ WRITE(KNTN,*) 'NUMBER OF ELEMENTS IN SECTION3 TOO BIG.'
+ WRITE(KNTN,*) 'PROGRAM CAN NOT HANDLE',JMAX
+ WRITE(KNTN,*) 'DATA DESCRIPTORS IN SECTION3.'
+ WRITE(KNTN,*) 'MAXIMUM NUMBER OF ELEMENTS IS ',JELEM
+ KERR=200
+ RETURN
+ END IF
+C
+C* 2.2 UNPACK AND PUT DATA DESCRIPTORS IN STACK.
+C -----------------------------------------
+ 220 CONTINUE
+C
+ DO 221 JJ=1,JMAX
+C
+ CALL BUNPCK(NBPW,KBUFF,IF,NWPT,NBPT,2,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING F PART OF DESCRIPTOR.'
+ RETURN
+ END IF
+ CALL BUNPCK(NBPW,KBUFF,IX,NWPT,NBPT,6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING X PART OF DESCRIPTOR.'
+ RETURN
+ END IF
+ CALL BUNPCK(NBPW,KBUFF,IY,NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING Y PART OF DESCRIPTOR.'
+ RETURN
+ END IF
+C
+ ISTACK(JJ)=IF*100000+IX*1000+IY
+ IISTACK(JJ)=ISTACK(JJ)
+C
+ 221 CONTINUE
+C
+C* 2.2.1 CHECK IF IT IS SAME DATA DESCRIPTOR DESCRIPTION.
+C ------------------------------------------------
+C TO MAKE MORE EFFICIENT DATA DESCRIPTOR DESCRIPTION
+C EXPANSION, IN CASE THAT DELAYED REPLICATION FACTOR
+C IS NOT PRESENT AND DATA DESCRIPTORS ARE THE SAME,
+C PREVIOUS WORKING TABLE SHOULD BE USED. IT IS POSIBLE
+C AT THIS PLACE IN THE FUTURE TO MAKE MORE SOPHISTICATED
+C CONTROL.
+C
+C
+ DO 222 JC=1,JMAX
+C
+ IF(ISTACK(JC).NE.NSTACK(JC)) THEN
+C
+ ODREPF=.FALSE.
+C
+C SWAP CONTENT OF THE STACKS.
+C
+ DO 223 JJC=1,JMAX
+ NSTACK(JJC)=ISTACK(JJC)
+ 223 CONTINUE
+C
+ NTDLEN = JMAX
+ M=0
+ M0=1
+ NOLD=N
+ KELEMOLD=KELEM
+ NFCM=0
+ NFUCM=0
+ MREL=0
+ OMARKER=.FALSE.
+ MBMP=0
+ MBMPL=0
+C
+ GO TO 230
+C
+ END IF
+C
+ 222 CONTINUE
+C
+C* IF MARKER OPERATOR PRESENT EXPAND DESCRIPTORS AGAIN
+C
+ IF(OMARKER) THEN
+ M=0
+ M0=1
+ NOLD=N
+ KELEMOLD=KELEM
+ NFCM=0
+ NFUCM=0
+ MREL=0
+ OMARKER=.FALSE.
+ NTDLEN=JMAX
+ MBMP=0
+ MBMPL=0
+ GO TO 230
+ END IF
+C
+C* CHECK IF THE SAME NUMBER OF DESCRIPTORS
+C AS IN A PREVIOUS MESSAGE
+C
+ IF(JMAX.NE.NTDLEN) THEN
+ M=0
+ M0=1
+ NOLD=N
+ KELEMOLD=KELEM
+ NFCM=0
+ NFUCM=0
+ MREL=0
+ OMARKER=.FALSE.
+ NTDLEN=JMAX
+ MBMP=0
+ MBMPL=0
+ GO TO 230
+ END IF
+C
+C* RETURN IF DELAYED REPLICATION FACTOR IS NOT PRESENT.
+C
+ IF(NPRUS.EQ.1) GO TO 229
+C
+ OB=.FALSE.
+ IF(IAND(KSEC3(4),IMASK(7)).NE.0) OB=.TRUE.
+C
+C CHECK FOR DELAYED REPLICATION FACTOR
+C
+ IF(ODREPF) GO TO 229
+C
+C CHECK FOR COMPRESSION
+C
+ IF(OB) THEN
+C
+C DATA COMPRESSED =/ PREVIOUS --> RECALCULATE POINTERS
+C
+ GO TO 229
+ END IF
+C
+ 229 CONTINUE
+C
+ M=0
+ M0=1
+ NOLD=N
+ KELEMOLD=KELEM
+ NFCM=0
+ NFUCM=0
+ MREL=0
+ OMARKER=.FALSE.
+ NTDLEN=JMAX
+ MBMP=0
+ MBMPL=0
+C
+C ------------------------------------------------------------------
+C* 2.3 GET NEXT DESCRIPTOR FROM THE STACK.
+C -----------------------------------
+ 230 CONTINUE
+C
+ J = J + 1
+ IF(J.GT.JMAX) GO TO 270
+C
+ IDD = ISTACK(J)
+ IF(IDD.EQ.0) GO TO 230
+C
+ IF = IDD/100000
+C
+ IF(NWT.GT.NSTOP) GO TO 270
+C ------------------------------------------------------------------
+C* 2.4 CHECK IF IT IS REPLICATION DESCRIPTOR.
+C --------------------------------------
+ 240 CONTINUE
+C
+ IF( IF.EQ.0) THEN
+C
+C* 2.6 ELEMENT DESCRIPTOR, SO UPDATE WORKING TABLE.
+C --------------------------------------------
+ 260 CONTINUE
+C
+ CALL BUUPWT(IDD,KELEM,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ ELSEIF( IF.EQ.1) THEN
+C
+C* 2.4.1 SOLVE REPLICATION PROBLEM.
+C --------------------------
+C
+C
+ CALL BUSRP(KBUFL,KBUFF,KSEC3,J,JMAX,IDD,ISTACK,KELEM,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ ELSEIF( IF.EQ.2) THEN
+C
+C* 2.5.3 PROCESS OPERATOR.
+C -----------------
+ CALL BUPRCO(KBUFL,KBUFF,J,IDD,ISTACK,KELEM,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ ELSEIF( IF.EQ.3) THEN
+C
+C* 2.5.2 REPLACE BY LIST OF DESCRIPTORS FROM TABLE *D.
+C ---------------------------------------------
+ CALL BUSTDR(J,JMAX,IDD,ISTACK,KERR)
+ IF(KERR.GT.0) THEN
+ DO 252 IQ=1,JELEM
+ NSTACK(IQ)=0.
+ 252 CONTINUE
+ RETURN
+ END IF
+ ELSE
+ KERR=37
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ GO TO 230
+C
+C ------------------------------------------------------------------
+C* 2.7 RESOLVE MARKER OPERATOR.
+C ------------------------
+ 270 CONTINUE
+C
+ IF(OMARKER) THEN
+ CALL BUPMRK(KBUFL,KBUFF,KSEC3,KELEM,KERR)
+ IF(KERR.GT.0) RETURN
+ END IF
+C
+C* 2.8 CHECK IF IT IS CORRESPONDING DATA.
+C ----------------------------------
+ 280 CONTINUE
+C
+C CHECK FOR WORKING SPACE.
+C
+ IF(JWORK/N.LT.KELEM) THEN
+ KERR=17
+ WRITE(KNTN,*) 'BUEXS3:'
+ CALL BUERR(KERR)
+ MN=KELEM*N
+ WRITE(KNTN,*) ' SUGGESTED VALUE FOR JWORK ',MN
+ WRITE(KNTN,*) ' CHECK IF TOO BIG KELEM USED.'
+ RETURN
+ END IF
+C
+ IF(IAND(KSEC3(4),IMASK(7)).NE.0) THEN
+C
+C COMPRESSED DATA
+C
+ CALL BURQC(KBUFL,KBUFF,KELEM,CNAMES,CUNITS,KSUP ,KSEC3,KERR)
+ IF(KERR.GT.0) RETURN
+ ELSE
+C
+C UNCOMPRESSED DATA
+C
+ CALL BURQUC(KBUFL,KBUFF,KELEM,CNAMES,CUNITS,KSUP ,KSEC3,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ END IF
+C
+C ------------------------------------------------------------------
+C
+C* 3. COLLECT SUPPLEMENTARY ITEMS.
+C -----------------------------
+ 300 CONTINUE
+C
+ NTDEXL =M
+ DO 301 I=1,NTDEXL
+ NTDEXP(I)=INWTR(I)
+ 301 CONTINUE
+C
+ NTDLEN=JMAXNEW
+ DO 302 I=1,NTDLEN
+ NTDLST (I)=IISTACK(I)
+ 302 CONTINUE
+C
+ DO 303 I=1,NTDEXL
+ IJ=I+(NSUBSET-1)*KELEM
+ NWTRG(IJ)=INWTR(I)
+ NWTDWG(IJ)=INWTDW(I)
+ 303 CONTINUE
+C
+ NSIZE(NSUBSET) =M
+C
+ KSUP(3)= 4
+ KSUP(5)= NSIZE(1)
+ KSUP(6)= KSEC3(3)
+C
+ N07=0
+ N08=0
+ N40=0
+ NDWINC=0
+ NSCAM=0
+ NSCAM07=0
+ NDWINC07=0
+ NFD=0
+
+ do i=1,100
+ NAFDWA(i)=0
+ end do
+ RETURN
+ END
diff --git a/bufrdc/buexs33.F b/bufrdc/buexs33.F
new file mode 100755
index 0000000..915791a
--- /dev/null
+++ b/bufrdc/buexs33.F
@@ -0,0 +1,135 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUEXS33(KBUFL,KBUFF,KSEC3,KERR)
+C
+C**** *BUEXS33*
+C
+C
+C PURPOSE.
+C --------
+C
+C EXPAND SECTION 3 OF BUFR MESSAGE.
+C (PRELIMINARY ITEMS)
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUEXS33( KBUFL,KBUFF,KSEC3,KERR)*
+C
+C INPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C OUTPUT:
+C *KSEC3*
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C BUNEXS - SET WORD AND BIT POINTERS AT THE BEGINING OF
+C NEXT SECTION
+C BUNPCK - UNPACKS BIT PATTERN
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+C
+ DIMENSION KBUFF(KBUFL)
+ DIMENSION KSEC3(*)
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+C
+C ------------------------------------------------------------------
+C
+C* 1. EXPAND PRELIMINARY ITEMS OF SECTION 3.
+C --------------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+C* 1.1 SET THE POINTERS NWPT AND NBPT TO THE
+C -------------------------------------
+C BEGINING OF THE SECTION 3.
+C --------------------------
+ 110 CONTINUE
+C
+ NWPT = NWPTB
+ NBPT = NBPTB
+C
+C* 1.2 UNPACK LENGTH OF SECTION 3.
+C ---------------------------
+ 120 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC3(1),NWPT,NBPT,24,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C
+C* 1.3 UNPACK ZERO BYTE AND PUT IT IN KSEC3(2).
+C ----------------------------------------
+ 130 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC3(2),NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C* 1.4 UNPACK NUMBER OF DATA SUB-SETS.
+C -------------------------------
+ 140 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC3(3),NWPT,NBPT,16,KERR)
+ IF(KERR.GT.0) RETURN
+ IF(KSEC3(3).LE.0) THEN
+ KERR=32
+ WRITE(KNTN,*) ' BUEXS3 :'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC3(4),NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) RETURN
+C -----------------------------------------------------------------
+C
+ NWPT = NWPTB
+ NBPT = NBPTB
+C
+ RETURN
+ END
diff --git a/bufrdc/buexs3p.F b/bufrdc/buexs3p.F
new file mode 100755
index 0000000..1f95a91
--- /dev/null
+++ b/bufrdc/buexs3p.F
@@ -0,0 +1,165 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUEXS3P(KBUFL,KBUFF,KSUP,KSEC3,KERR)
+C
+C**** *BUEXS3P*
+C
+C
+C PURPOSE.
+C --------
+C
+C EXPAND SECTION 3 OF BUFR MESSAGE.
+C (PRELIMINARY ITEMS)
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUEXS3P( KBUFL,KBUFF,KSUP,KSEC3,KERR)*
+C
+C INPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C OUTPUT:
+C *KSUP* - ARRAY CONTAINING SUPLEMENTARY INFORMATION
+C - KSUP( 1) -- IDIM1, DIMENSION OF KSEC1
+C - KSUP( 2) -- IDIM2, DIMENSION OF KSEC2
+C - KSUP( 3) -- IDIM3, DIMENSION OF KSEC3
+C - KSUP( 4) -- IDIM4, DIMENSION OF KSEC4
+C - KSUP( 5) -- M (NUMBER OF ELEMENTS IN VALUES ARRAY,
+C FIRST INDEX)
+C - KSUP( 6) -- N (NUMBER OF SUBSETS,SECOND INDEX OF
+C VALUES ARRAY)
+C - KSUP( 7) -- JVC (NUMBER OF ELEMENTS IN CVAL ARRAY)
+C - KSUP( 8) -- TOTAL BUFR MESSAGE LENGTH IN BYTES
+C - KSUP( 9) -- IDIM0, DIMENSION OF KSEC0
+C *KSEC3* - ARRAY KSEC3
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C BUNEXS - SET WORD AND BIT POINTERS AT THE BEGINING OF
+C NEXT SECTION
+C BUNPCK - UNPACKS BIT PATTERN
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+C
+ DIMENSION KBUFF(KBUFL),KSEC3(JSEC3)
+ DIMENSION KSUP(JSUP)
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+C
+C ------------------------------------------------------------------
+C
+C* 1. EXPAND PRELIMINARY ITEMS OF SECTION 3.
+C --------------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+C* 1.1 SET THE POINTERS NWPT AND NBPT TO THE
+C -------------------------------------
+C BEGINING OF THE SECTION 3.
+C --------------------------
+ 110 CONTINUE
+C
+ NWPT = NWPTB
+ NBPT = NBPTB
+C
+C* 1.2 UNPACK LENGTH OF SECTION 3.
+C ---------------------------
+ 120 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC3(1),NWPT,NBPT,24,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C* 1.2.1 SET THE POINTERS NWPTB AND NBPTB TO
+C -----------------------------------
+C THE BEGINNING OF THE NEXT SECTION.
+C ----------------------------------
+ CALL BUNEXS(KSEC3(1))
+C
+C* 1.3 UNPACK ZERO BYTE AND PUT IT IN KSEC3(2).
+C ----------------------------------------
+ 130 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC3(2),NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C* 1.4 UNPACK NUMBER OF DATA SUB-SETS.
+C -------------------------------
+ 140 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC3(3),NWPT,NBPT,16,KERR)
+ IF(KERR.GT.0) RETURN
+ IF(KSEC3(3).LE.0) THEN
+ KERR=32
+ WRITE(KNTN,*) ' BUEXS3 :'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+C
+C* 1.5 UNPACK INTEGER VALUE OF THE OCTET
+C ---------------------------------
+C CONTAINING FLAG BITS.
+C --------------------
+ 150 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC3(4),NWPT,NBPT,8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC3(4).'
+ RETURN
+ END IF
+
+C
+C -----------------------------------------------------------------
+C
+ KSUP(3)= 4
+ KSUP(5)= 0
+ KSUP(6)= KSEC3(3)
+C
+ RETURN
+ END
diff --git a/bufrdc/buexs4.F b/bufrdc/buexs4.F
new file mode 100755
index 0000000..f42feb6
--- /dev/null
+++ b/bufrdc/buexs4.F
@@ -0,0 +1,869 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUEXS4(KBUFL,KBUFF,KSUP,KSEC3,KSEC4,KELEM,CNAMES,
+ 1 CUNITS,KVALS,VALUES,CVALS,KERR)
+C
+C**** *BUEXS4*
+C
+C
+C PURPOSE.
+C --------
+C EXPAND PRELIMINARY ITEMS AND DATA OF SECTION 4 OF BUFR MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUEXS4(KBUFL,KBUFF,KSUP,KSEC3,KSEC4,KELEM,CNAMES,
+C CUNITS,KVALS,VALUES,CVALS,KERR)*
+C
+C INPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C *KELEM* - DIMENSION OF CNAMES, CUNITS ARRAY
+C *KVALS* - DIMENSION OF VALUES ARRAY
+C OUTPUT:
+C *KSUP* - ARRAY CONTAINING SUPLEMENTARY INFORMATION
+C - KSUP( 1) -- IDIM1, DIMENSION OF KSEC1
+C - KSUP( 2) -- IDIM2, DIMENSION OF KSEC2
+C - KSUP( 3) -- IDIM3, DIMENSION OF KSEC3
+C - KSUP( 4) -- IDIM4, DIMENSION OF KSEC4
+C - KSUP( 5) -- M (NUMBER OF ELEMENTS IN VALUES ARRAY,
+C FIRST INDEX)
+C - KSUP( 6) -- N (NUMBER OF SUBSETS,SECOND INDEX OF
+C VALUES ARRAY)
+C - KSUP( 7) -- JVC (NUMBER OF ELEMENTS IN CVAL ARRAY)
+C - KSUP( 8) -- TOTAL BUFR MESSAGE LENGTH IN BYTES
+C - KSUP( 9) -- IDIM0, DIMENSION OF KSEC0
+C *KSEC3* - ARRAY CONTAINING SECTION 3 INFORMATION
+C KSEC3( 1)-- LENGTH OF SECTION 3 (BYTES)
+C KSEC3( 2)-- RESERVED
+C KSEC3( 3)-- NUMBER OF SUBSETS
+C KSEC3( 4)-- FLAG (DATA TYPE,DATA COMPRESSION)
+C *KSEC4* - ARRAY CONTAINING SECTION 4 INFORMATION
+C KSEC4( 1)-- LENGTH OF SECTION 4 (BYTES)
+C KSEC4( 2)-- RESERVED
+C *CNAMES* - CHARACTER ARRAY CONTAINING ELEMENT NAMES
+C *CUNITS* - CHARACTER ARRAY CONTAINIG UNITS
+C *VALUES* - REAL ARRAY (EXPANDED DATA VALUES)
+C *CVALS* - CHARACTER ARRAY CONTAINING TEXT
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C BUNPCK - UNPACK BIT PATTERN
+C BUNPKS - UNPACK BIT PATTERN IN REPEATED WAY,
+C POINTER ADJUSTMENT
+C BUUNPS - UNPACK BIT PATTERN IN REPEATED WAY,
+C NO POINTER ADJUSTMENT
+C BUUNP - UNPACK BIT PATTERN, NO POINTER ADJUSTMENT
+C BUNEXS - SET WORD AND BIT POINTERS AT THE BEGINING OF
+C NEXT SECTION
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 17/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomreq.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+# include "bcomwt.F"
+# include "bcomp.F"
+# include "bcombef.F"
+# include "bcomrq.F"
+# include "bcomoff.F"
+C
+ CHARACTER CTEXT*64
+ CHARACTER CNAMR*64,CUNIR*24
+C
+ DIMENSION KBUFF(KBUFL)
+ DIMENSION ICH(255),ILIST(JWORK),IVALUES(JWORK)
+ DIMENSION IILIST(8),IR0LIST(8)
+C
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+ CHARACTER*80 CVALS(KVALS)
+ REAL*4 VVV4,VVV4S
+ REAL*8 VVV8S,VVV8,VAL8S
+ REAL*4 R4, RHUGE4
+ REAL*8 R8, RHUGE8
+ LOGICAL OBIG, BIG_ENDIAN
+C
+#ifndef R_4
+ REAL*8 VALUES(KVALS),RQVAL
+ REAL*8 RVIND
+ REAL*8 EPS
+ REAL*8 VVV
+#else
+ REAL VALUES(KVALS),RQVAL
+ REAL RVIND
+ REAL EPS
+ REAL VVV
+#endif
+ LOGICAL CHECK_S4,OS4
+ DIMENSION KSUP(JSUP),KSEC3(JSEC3),KSEC4(JSEC4)
+ DIMENSION IMASK(8),IRO(80)
+ DATA IMASK/1,2,4,8,16,32,64,128/
+
+C
+C ------------------------------------------------------------------
+C* 1. EXPAND PRELIMINARY ITEMS FROM SECTION4.
+C ---------------------------------------
+ 100 CONTINUE
+C
+C JCV - POINTER TO CVALS ARRAY
+C JWT - POINTER TO WORKING TABLE ARRAY
+C JNS - POINTER TO VALUES ARRAY FOR SUB-SETS.
+C
+ IF(KERR.GT.0) RETURN
+C
+ R4=3.4028235e+38
+ R8=1.7976931348623157D+308
+C
+ IF(OMULTI) THEN
+ IF(NSUBSET.EQ.1) JCV = 0
+ ELSE
+ JCV = 0
+ END IF
+ OREPF =.FALSE.
+C
+ IF(KELEM*N.GT.KVALS) THEN
+ KERR=14
+ CALL BUERR(KERR)
+ WRITE(KNTN,*) ' BUEXS4: NUMBER OF ELEMENTS ',M
+ WRITE(KNTN,*) ' BUEXS4: NUMBER OF SUBSETS ',N
+ MN=M*N
+ WRITE(KNTN,*) ' BUEXS4: SUGGESTED VALUE FOR KVALS ',MN
+ WRITE(KNTN,*) ' BUEXS4: SUGGESTED VALUE FOR KELEM ',M
+ RETURN
+ END IF
+C
+C* 1.1 SET THE POINTERS NWPT AND NBPT
+C ------------------------------
+C TO THE BEGINING OF THE SECTION.
+C -------------------------------
+ 110 CONTINUE
+C
+ NWPT = NWPTB
+ NBPT = NBPTB
+ NWPTB4 = NWPTB
+ NBPTB4 = NBPTB
+C
+C* 1.2 UNPACK LENGTH OF SECTION 4.
+C ---------------------------
+ 120 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC4(1),NWPT,NBPT,24,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC4(1).'
+ RETURN
+ END IF
+C
+ IF(OS4.AND.NREQ(1).EQ.0) THEN
+ CALL CHECK_S4S(KELEM,KSEC3,KSEC4,KERR)
+ IF(KERR.NE.0) THEN
+ return
+ END IF
+ END IF
+C
+C
+C* 1.3 SET THE POINTERS NWPTB AND NBPTB.
+C ---------------------------------
+C TO BEGINING OF THE NEXT SECTION.
+C --------------------------------
+ 130 CONTINUE
+C
+ CALL BUNEXS(KSEC4(1))
+C
+C
+C* 1.4 EXPAND RESERVED BYTE.
+C ---------------------
+ 140 CONTINUE
+C
+ CALL BUNPCK(NBPW,KBUFF,KSEC4(2),NWPT,NBPT, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING KSEC4(2).'
+ RETURN
+ END IF
+C
+C -----------------------------------------------------------------
+C* 2. EXPAND DATA.
+C ------------
+ 200 CONTINUE
+C
+C
+C* 2.1 CHECK IF DATA ARE COMRESSED.
+C ----------------------------
+ 210 CONTINUE
+C
+ IB=0
+ IF(IAND(KSEC3(4),IMASK(7)).NE.0) IB=1
+C
+ IF(IB.EQ.0) THEN
+C
+C ------------------------------------------------------------------
+C
+C* 3. UNCOMPRESSED DATA.
+C ------------------
+ 300 CONTINUE
+C
+ IF(OMULTI) N=1
+C
+ DO 301 JNS=1,N
+C
+ ITEMPREP=0
+
+ IF(OMULTI) THEN
+ JNSK=(NSUBSET-1)*KELEM
+ JNSK1=(JNS-1)*KELEM
+ ELSE
+ JNSK=(JNS-1)*KELEM
+ END IF
+C
+ DO 302 JWT=1,M
+C
+ IF(OMULTI) THEN
+ JWTJNS1=JWT+JNSK1
+ JWTJNS=JWT+JNSK
+ ELSE
+ JWTJNS=JWT+JNSK
+ END IF
+C
+c IF(ITEMPREP.GT.0) THEN
+c IF(NWTR(JWT-1).NE.031011.AND.NWTR(JWT-1)
+c 1 .NE.031012) THEN
+c VALUES(JWTJNS)=VALUES(JWTJNS-1)
+c ITEMPREP=ITEMPREP-1
+c GO TO 302
+c ELSE
+c ITEMPREP=ITEMPREP-1
+c END IF
+c END IF
+
+ IF(INWTDW(JWT).EQ.0) THEN
+ VALUES(JWTJNS)=0.0
+ GO TO 302
+ END IF
+C
+ IF(OMULTI) THEN
+ NWPT=INWORDP(JWTJNS1)
+ NBPT=INBITP (JWTJNS1)
+ ELSE
+ NWPT=INWORDP(JWTJNS)
+ NBPT=INBITP (JWTJNS)
+ END IF
+C
+c IF(INWTR(JWT).EQ.31011.OR.INWTR(JWT).EQ.31012) OREPF=.TRUE.
+C
+C
+C ------------------------------------------------------------------
+C* 3.1 CHARACTER DATA / IEEE ?
+C -----------------------
+ 310 CONTINUE
+C
+ IF(INWTEN(JWT).EQ.-999) THEN
+ IBYTES=INWTDW(JWT)/8
+ CALL BUNPKS(NBPW,KBUFF,ILIST,NWPT,NBPT,
+ 1 8,0,IBYTES,KERR)
+ IF(IBYTES.EQ.4) THEN
+ OBIG=BIG_ENDIAN()
+ CALL BUSBYTESR4(VVV4,ILIST,0,8,0,IBYTES)
+ IF(.NOT.OBIG) THEN
+ CALL SWAP_BYTES4(VVV4,VVV4S)
+ VVV4=VVV4S
+ END IF
+ IF(ABS(VVV4-R4)/R4.LT.EPS) THEN
+ VALUES(JWTJNS)=RVIND
+ ELSE
+ VALUES(JWTJNS)=VVV4
+ END IF
+ ELSE
+ OBIG=BIG_ENDIAN()
+ CALL BUSBYTESR8(VVV8,ILIST,0,8,0,IBYTES)
+ IF(.NOT.OBIG) THEN
+ CALL SWAP_BYTES8(VVV8,VVV8S)
+ VVV8=VVV8S
+ END IF
+ IF(ABS(VVV8-R8)/R8.LT.EPS) THEN
+ VALUES(JWTJNS)=RVIND
+ ELSE
+ VALUES(JWTJNS)=VVV8
+ END IF
+ END IF
+ GO TO 302
+ END IF
+C
+ IF(INWTEN(JWT).EQ.658367) THEN
+C
+C* 3.2 OBTAIN CHARACTER DATA FROM DATA SECTION.
+C ----------------------------------------
+ 320 CONTINUE
+C
+ IY=INWTDW(JWT)/8
+C
+ CALL BUUNPS(NBPW,KBUFF,ICH,NWPT,NBPT,8,0,IY,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING CHARACTER DATA.'
+ RETURN
+ END IF
+C
+C* 3.3 MOVE CHARACTER DATA TO "CVALS".
+C -------------------------------
+ 330 CONTINUE
+C
+ IYLINE=IY/80
+ IYOFF =IY-IYLINE*80
+ JCVINC=IYLINE
+C
+ JCV = JCV + 1
+ JCVW= JCV
+C
+ IF(IYLINE.EQ.0) THEN
+ CVALS(JCVW)=' '
+ DO 331 J=1,IY
+ CVALS(JCVW)(J:J)=CHAR(ICH(J))
+ 331 CONTINUE
+ ELSE
+ CVALS(JCVW)=' '
+ DO 332 J=1,IYLINE
+ DO 333 JJ=1,80
+ CVALS(JCVW)(JJ:JJ)= CHAR(ICH(JJ))
+ 333 CONTINUE
+C
+ JCVW=JCVW+1
+C
+ 332 CONTINUE
+C
+ CVALS(JCVW)=' '
+ DO 334 J=1,IYOFF
+ CVALS(JCVW)(J:J)= CHAR(ICH(J))
+ 334 CONTINUE
+C
+ END IF
+C
+C* 3.4 COMPUTE POINTER VALUES TO BE STORED IN "VALUES".
+C ------------------------------------------------
+ 340 CONTINUE
+C
+ VALUES(JWTJNS) = JCV*1000 + IY
+ JCV = JCV + JCVINC
+C
+ GO TO 302
+C
+ END IF
+C
+C* 3.5 OBTAIN VALUE FROM DATA SECTION.
+C -------------------------------
+ 350 CONTINUE
+C
+ IF(NWTEN(JWT).EQ.836970) THEN
+ ISGN=0
+ IWPT=NWPT
+ IBPT=NBPT
+C
+ CALL GBYTE(KBUFF(IWPT),ISGN,IBPT,1)
+C
+ IBPT=IBPT+1
+ IWORD= IBPT/NBPW
+ IBPT= IBPT - IWORD*NBPW
+ IWPT= IWPT + IWORD
+C
+ CALL GBYTE(KBUFF(IWPT),IVAL,IBPT,INWTDW(JWT)-1)
+ VALUES(JWTJNS)= DFLOAT(IVAL)
+ IF(ISGN.EQ.1) VALUES(JWTJNS)=-VALUES(JWTJNS)
+ GO TO 302
+ ELSE
+ CALL GBYTE(KBUFF(NWPT),IVAL,NBPT,INWTDW(JWT))
+ END IF
+C
+C
+C -----------------------------------------------------------------
+C* 3.6 UPDATE THE ARRAY "VALUES".
+C --------------------------
+ 360 CONTINUE
+C
+C
+C CHECK IF DATA IS MISSING
+C
+ IF(IVAL.EQ.NMASK(INWTDW(JWT))) THEN
+ IF(INWTDW(JWT).NE.1) THEN
+ IF(INWTR(JWT).NE.999999.AND.
+ 1 INWTR(JWT).NE.030001.AND.INWTR(JWT).NE.030002.AND.
+ 2 INWTR(JWT).NE.030004) THEN
+ VALUES(JWTJNS)=RVIND
+ ELSE
+ VALUES(JWTJNS)=ival
+ END IF
+ ELSE
+ VALUES(JWTJNS)=1.0
+ END IF
+ ELSE
+ IVAL=IVAL+INWTRV(JWT)
+ IF(INWTS(JWT).GT.0) THEN
+ VALUES(JWTJNS)= DFLOAT(IVAL)/10.**INWTS(JWT)
+ ELSE
+ IIWTS=IABS(INWTS(JWT))
+ VALUES(JWTJNS)= DFLOAT(IVAL)*10.**IIWTS
+ END IF
+ END IF
+C
+c IF(INWTR(JWT).EQ.31011.OR.INWTR(JWT).EQ.31012) THEN
+c ITEMPREP=VALUES(JWTJNS)
+c END IF
+
+ 302 CONTINUE
+C
+ KSUP(7)=JCV
+C
+ 301 CONTINUE
+C
+ IF(OMULTI) THEN
+ IBIT=NBITP(NSIZEG(NSUBSET)) + NWTDW(NSIZEG(NSUBSET))
+ IWORD=IBIT/NBPW
+ NBP=IBIT-IWORD*NBPW
+ NWP=NWORDP(NSIZEG(NSUBSET))+IWORD
+ END IF
+ ELSE
+C ------------------------------------------------------------------
+C
+C* 4. COMPRESSED DATA.
+C ----------------
+ 400 CONTINUE
+C
+C* 4.1 OBTAIN N VALUES BY EXPANSION.
+C -----------------------------
+ 410 CONTINUE
+C
+ DO 411 JWT=1,M
+C
+ NWPT=INWORDP(JWT)
+ NBPT=INBITP (JWT)
+C
+ IF(INWTDW(JWT).EQ.0) THEN
+ DO 412 J=1,N
+ JWTJ=JWT+(J-1)*KELEM
+ VALUES(JWTJ)=0.0
+ 412 CONTINUE
+C
+ GO TO 411
+ END IF
+C
+C CHECK IF CHARACTER DATA
+C
+ IF(INWTEN(JWT).EQ.658367) THEN
+ IICH=INWTDW(JWT)/8
+ CALL BUNPKS(NBPW,KBUFF,IRO,NWPT,NBPT,8,0,IICH,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING REFERENCE VALUES FOR'
+ WRITE(KNTN,*) JWT,' ELEMENT, OF ',J,' SUBSET.'
+ RETURN
+ END IF
+ CALL BUNPCK(NBPW,KBUFF,IDWINC,NWPT,NBPT,6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING NUMBER OF BITS FOR ',
+ 1 'INCREMENTS'
+ WRITE(KNTN,*) 'FOR ',JWT,' ELEMENT, OF ',J,' SUBSET'
+ RETURN
+ END IF
+C
+ ITOTAL=IDWINC*KSEC3(3)
+ IF(ITOTAL.GT.JWORK) THEN
+ KERR=17
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ DO 413 J=1,ITOTAL
+ ILIST(J)=0
+ 413 CONTINUE
+C
+ CALL BUNPKS(NBPW,KBUFF,ILIST,NWPT,NBPT,
+ 1 8,0,ITOTAL,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C MOVE CHARACTER DATA TO "CVALS" ARRAY.
+C
+ IY=IDWINC
+ IF(IY.EQ.0) THEN
+ IY=IICH
+ IZ=0
+ IF(IICH*KSEC3(3).GT.JWORK) THEN
+ KERR=17
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ DO IXX=1,KSEC3(3)
+ DO IZZ=1,IICH
+ IZ=IZ+1
+ ILIST(IZ)=IRO(IZZ)
+ END DO
+ END DO
+ END IF
+C
+ IYLINE=IY/80
+ IYOFF=IY-IYLINE*80
+C
+ JCVINC=IYLINE
+ JJC=0
+C
+ DO 414 I=1,KSEC3(3)
+C
+ JCV=JCV+1
+ JCVW=JCV
+C
+ IF(IYLINE.EQ.0) THEN
+ CVALS(JCVW)=' '
+ DO 415 J=1,IY
+ JJC=JJC+1
+ CVALS(JCVW)(J:J)=CHAR(ILIST(JJC))
+ 415 CONTINUE
+C
+ ELSE
+C
+ CVALS(JCVW)=' '
+ DO 416 J=1,IYLINE
+ DO 417 JJJ=1,80
+ JJC=JJC+1
+ CVALS(JCVW)(JJJ:JJJ)=CHAR(ILIST(JJC))
+ 417 CONTINUE
+C
+ JCVW=JCVW+1
+ 416 CONTINUE
+C
+ CVALS(JCVW)=' '
+ DO 418 J=1,IYOFF
+ JJC=JJC+1
+ CVALS(JCVW)(J:J)=CHAR(ILIST(JJC))
+ 418 CONTINUE
+C
+ END IF
+C
+C COMPUTE POINTERS TO VALUES ARRAY
+C
+ JWTI=JWT+(I-1)*KELEM
+C VALUES(JWTI)=JCV*1000+IY
+ VALUES(JWTI)=JCV*1000+INWTDW(JWT)/8
+ JCV =JCV+JCVINC
+C
+ 414 CONTINUE
+C
+ GO TO 411
+C
+ ELSEIF(INWTEN(JWT).EQ.-999) THEN
+ IICH=INWTDW(JWT)/8
+ CALL BUNPKS(NBPW,KBUFF,IR0LIST,NWPT,NBPT,8,0,IICH,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING REFERENCE VALUES FOR',
+ 1 JWT,' ELEMENT, OF ',J,' SUBSET.'
+ RETURN
+ END IF
+ CALL BUNPCK(NBPW,KBUFF,IDWINC,NWPT,NBPT,6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING NUMBER OF BITS FOR ',
+ 1 'INCREMENTS'
+ WRITE(KNTN,*) 'FOR ',JWT,' ELEMENT, OF ',J,' SUBSET'
+ RETURN
+ END IF
+C
+ IF(IDWINC.NE.0) THEN
+ ITOTAL=IDWINC*KSEC3(3)
+ DO J=1,ITOTAL
+ ILIST(J)=0
+ END DO
+C
+ CALL BUNPKS(NBPW,KBUFF,ILIST,NWPT,NBPT,
+ 1 8,0,ITOTAL,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C
+C COMPUTE POINTERS TO VALUES ARRAY
+C
+ JJC=0
+ DO I=1,KSEC3(3)
+ JWTI=JWT+(I-1)*KELEM
+C
+ DO J=1,IICH
+ JJC=JJC+1
+ IILIST(J)=ILIST(JJC)
+ END DO
+
+ IF(IICH.EQ.4) THEN
+ CALL BUSBYTESR4(RHUGE4,IILIST,0,8,0,IICH)
+ OBIG=BIG_ENDIAN()
+ IF(.NOT.OBIG) THEN
+ CALL SWAP_BYTES4(RHUGE4,VAL4S)
+ RHUGE4=VAL4S
+ END IF
+ VALUES(JWTI)=RHUGE4
+ IF(ABS(VALUES(JWTI)-R4)/R4.LT.EPS) THEN
+ VALUES(JWTI)=RVIND
+ END IF
+ ELSE
+ CALL BUSBYTESR8(RHUGE8,IILIST,0,8,0,IICH)
+ OBIG=BIG_ENDIAN()
+ IF(.NOT.OBIG) THEN
+ CALL SWAP_BYTES8(RHUGE8,VAL8S)
+ RHUGE8=VAL8S
+ END IF
+ VALUES(JWTI)=RHUGE8
+ IF(ABS(VALUES(JWTI)-R8)/R8.LT.EPS) THEN
+ VALUES(JWTI)=RVIND
+ END IF
+ END IF
+C
+ END DO
+ ELSE
+ IF(IICH.EQ.4) THEN
+ CALL BUSBYTESR4(RHUGE4,IR0LIST,0,8,0,IICH)
+ OBIG=BIG_ENDIAN()
+ IF(.NOT.OBIG) THEN
+ CALL SWAP_BYTES4(RHUGE4,VAL4S)
+ RHUGE4=VAL4S
+ END IF
+ DO I=1,KSEC3(3)
+ JWTI=JWT+(I-1)*KELEM
+ IF(ABS(RHUGE4-R4)/R4.LT.EPS) THEN
+ VALUES(JWTI)=RVIND
+ ELSE
+ VALUES(JWTI)=RHUGE4
+ END IF
+ END DO
+ ELSE
+ CALL BUSBYTESR8(RHUGE8,IR0LIST,0,8,0,IICH)
+ OBIG=BIG_ENDIAN()
+ IF(.NOT.OBIG) THEN
+ CALL SWAP_BYTES8(RHUGE8,VAL8S)
+ RHUGE8=VAL8S
+ END IF
+ DO I=1,KSEC3(3)
+ JWTI=JWT+(I-1)*KELEM
+ IF(ABS(RHUGE8-R8)/R8.LT.EPS) THEN
+ VALUES(JWTI)=RVIND
+ ELSE
+ VALUES(JWTI)=RHUGE8
+ END IF
+ END DO
+ END IF
+ END IF
+C
+ GO TO 411
+ ELSE
+ IF(INWTEN(JWT).EQ.836970) THEN
+ CALL BUNPCK(NBPW,KBUFF,ISG_REF,NWPT,NBPT,1,KERR)
+ CALL BUNPCK(NBPW,KBUFF,IR0,NWPT,NBPT,INWTDW(JWT)-1,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING REFERENCE VALUES FOR'
+ WRITE(KNTN,*) JWT,' ELEMENT.'
+ RETURN
+ END IF
+ ELSE
+ CALL BUNPCK(NBPW,KBUFF,IR0,NWPT,NBPT,INWTDW(JWT),KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING REFERENCE VALUES FOR'
+ WRITE(KNTN,*) JWT,' ELEMENT.'
+ RETURN
+ END IF
+ END IF
+ CALL BUNPCK(NBPW,KBUFF,IDWINC,NWPT,NBPT,6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING NUMBER OF BITS FOR'
+ WRITE(KNTN,*) 'INCREMENTS, FOR ',JWT,' ELEMENT.'
+ RETURN
+ END IF
+ IF(IDWINC.GT.JBPW) THEN
+ KERR=15
+ WRITE(KNTN,*) ' BUEXS4 :'
+ CALL BUERR(KERR)
+ PRINT*,'JWT=',JWT,'REF=',INWTR(JWT)
+ RETURN
+ END IF
+ END IF
+C
+ DO 423 J=1,N
+ ILIST(J)=0
+ 423 CONTINUE
+C
+ IF(IDWINC.NE.0) THEN
+ CALL BUNPKS(NBPW,KBUFF,ILIST,NWPT,NBPT,
+ 1 IDWINC,0,N,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR UNPACKING INCREMENTS ',
+ 1 'FOR ',JWT,' ELEMENT.'
+ RETURN
+ END IF
+ END IF
+C
+ IF(INWTEN(JWT).NE.658367) THEN
+ IF(IR0.EQ.NMASK(INWTDW(JWT))) THEN
+ DO 425 J=1,N
+ IVALUES(J)=NMASK(INWTDW(JWT))
+ 425 CONTINUE
+ ELSE
+ IWTPR0=INWTRV(JWT)+IR0
+C
+ IF(IDWINC.EQ.0) THEN
+ DO 426 J=1,N
+ IVALUES(J)=IWTPR0
+ 426 CONTINUE
+C
+ ELSE
+ DO 424 J=1,N
+ IF(ILIST(J).EQ.NMASK(IDWINC)) THEN
+ IVALUES(J)=NMASK(INWTDW(JWT))
+ ELSE
+ IVALUES(J)= IWTPR0 + ILIST(J)
+ END IF
+ 424 CONTINUE
+C
+ END IF
+ END IF
+ END IF
+C
+ DO 427 J=1,N
+C
+ JWTJ=JWT+(J-1)*KELEM
+C
+ IF(INWTDW(JWT).NE.1) THEN
+ VALUES(JWTJ)=RVIND
+ ELSE
+ VALUES(JWTJ)=1.0
+ END IF
+
+ IF(IVALUES(J).NE.NMASK(INWTDW(JWT))) THEN
+ IF(INWTS(JWT).GT.0) THEN
+ VALUES(JWTJ)= DFLOAT(IVALUES(J))/10.**INWTS(JWT)
+ ELSE
+ IIWTS=IABS(INWTS(JWT))
+ VALUES(JWTJ)= DFLOAT(IVALUES(J))*10.**IIWTS
+ END IF
+ END IF
+C
+ IF(INWTEN(JWT).EQ.836970.AND.ISG_REF.EQ.1) THEN
+ VALUES(JWTJ)= - VALUES(JWTJ)
+ END IF
+ 427 CONTINUE
+C
+ 411 CONTINUE
+C
+ KSUP(7)=JCV
+C
+ END IF
+C
+C ------------------------------------------------------------------
+C* 5. REPEAT ENTRIES IN CNAMES,CUNITS AND VALUES IF NEEDED.
+C -----------------------------------------------------
+ 500 CONTINUE
+C
+ IF(.NOT.OREPF) GO TO 600
+ IST=1
+C
+C* 5.1 SEARCH CNAMES FOR DELAYED REPETITION FACTOR.
+C --------------------------------------------
+ 510 CONTINUE
+C
+C DO 511 J=IST,M
+C IF(INWTR(J).EQ.31001.OR.INWTR(J).EQ.31002
+C 1 .OR.INWTR(J).EQ.31000) GO TO 520
+C 511 CONTINUE
+C
+C GO TO 600
+C
+C* 5.2 GET REPETITION FACTOR FROM ARRAY "VALUES".
+C -------------------------------------------
+ 520 CONTINUE
+C
+C IREPF=VALUES(J)
+C CNAMR=CNAMES(J+1)
+C CUNIR=CUNITS(J+1)
+C VALUR=VALUES(J+1)
+C
+C* 5.3 PUSH DOWN ENTRIES IN CNAMES,CUNITS,VALUES.
+C ------------------------------------------
+ 530 CONTINUE
+C
+C IREPM2=IREPF-2
+C
+C DO 531 JA=M,J+2,-1
+C
+C CNAMES(JA+IREPM2)=CNAMES(JA)
+C CUNITS(JA+IREPM2)=CUNITS(JA)
+C
+C DO 932 JB=1,N
+C
+C JAJB=JA+(JB-1)*KELEM
+C
+C VALUES(JAJB+IREPM2)=VALUES(JAJB)
+C 932 CONTINUE
+C
+C 531 CONTINUE
+C
+C* 5.4 REPETITION.
+C -----------
+ 540 CONTINUE
+C
+C DO 541 JA=1,IREPF
+C CNAMES(J+JA)=CNAMR
+C CUNITS(J+JA)=CUNIR
+C
+C DO 542 JB=1,N
+C
+C JAJB=JA+(JB-1)*KELEM
+C
+C VALUES(J+JAJB)=VALUR
+C 542 CONTINUE
+C
+C 541 CONTINUE
+C
+C* 5.5 UPDATE M AND POINTER TO CONTINUE SEARCH.
+C ----------------------------------------
+C 550 CONTINUE
+C
+C M=M+IREPF-2
+C IST=J+IREPF
+C
+C GO TO 510
+C
+C -----------------------------------------------------------------
+C* 6. SET SUPPLEMENTARY INFORMATION.
+C ------------------------------
+C
+ 600 CONTINUE
+C
+ KSUP(4)= 2
+C
+C ------------------------------------------------------------------
+ RETURN
+ END
diff --git a/bufrdc/buexs5.F b/bufrdc/buexs5.F
new file mode 100755
index 0000000..d55d486
--- /dev/null
+++ b/bufrdc/buexs5.F
@@ -0,0 +1,108 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUEXS5( KBUFL,KBUFF,KERR)
+C
+C**** *BUEXS5*
+C
+C
+C PURPOSE.
+C --------
+C EXPANDS SECTION 5 OF BUFR MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUEXS5( KBUFL,KBUFF,KERR)*
+C
+C INPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C OUTPUT:
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C --------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C BUNPKS - UNPACK BIT PATTERN IN REPEATED WAY
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/09/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+C
+ DIMENSION KBUFF(KBUFL)
+ DIMENSION IBUFR(4)
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+C
+ CHARACTER*4 YBUFR
+C
+C ------------------------------------------------------------------
+C* 1. EXPAND SECTION 5.
+C -----------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ NWPT = NWPTB
+ NBPT = NBPTB
+C
+C
+C* 1.2 UNPACK LAST FOUR OCTETS CONTAINING '7777'.
+C ------------------------------------------
+C
+ CALL BUNPKS(NBPW,KBUFF,IBUFR,NWPT,NBPT,8,0,4,KERR)
+C
+C* 1.3 CHECK IF THE LAST FOUR OCTETS ARE '7777'.
+C --------------------------------------
+ YBUFR=CHAR(IBUFR(1))//CHAR(IBUFR(2))//
+ 1 CHAR(IBUFR(3))//CHAR(IBUFR(4))
+ IF(YBUFR.NE.'7777') THEN
+ KERR = 2
+ WRITE(KNTN,'(1H ,A)') 'BUEXS5 :'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+C -----------------------------------------------------------------
+ RETURN
+ END
diff --git a/bufrdc/bufren.F b/bufrdc/bufren.F
new file mode 100755
index 0000000..b54e4d2
--- /dev/null
+++ b/bufrdc/bufren.F
@@ -0,0 +1,314 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUFREN(KSEC0,KSEC1,KSEC2,KSEC3,KSEC4,
+ 1 KTDLEN,KTDLST,KDLEN,KDATA,KELEM,KVALS,
+ 2 VALUES,CVALS,KBUFL,KBUFF,KERR)
+C
+C**** *BUFREN*
+C
+C
+C PURPOSE.
+C --------
+C ENCODE BUFR MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL BUFREN(KSEC0,KSEC1,KSEC2,KSEC3,KSEC4,
+C KTDLEN,KTDLST,KDLEN,KDATA,KELEM,KVALS,
+C VALUES,CVALS,KBUFL,KBUFF,KERR)
+C
+C INPUT :
+C *KSEC0* - INTEGER ARRAY OF 3 WORDS CONTAINING
+C BUFR SECTION 0 INFORMATION
+C KSEC0( 1)-- LENGTH OF SECTION 0 (BYTES)
+C KSEC0( 2)-- TOTAL LENGTH OF BUFR MESSAGE (BYTES)
+C KSEC0( 3)-- BUFR EDITION NUMBER
+C
+C *KSEC1* - INTEGER ARRAY OF AT LEAST 40 WORDS
+C CONTAINING BUFR SECTION 1 INFORMATION
+C KSEC1( 1)-- LENGTH OF SECTION 1 (BYTES)
+C KSEC1( 2)-- BUFR EDITION NUMBER
+C KSEC1( 3)-- ORIGINATING CENTRE
+C KSEC1( 4)-- UPDATE SEQUENCE NUMBER
+C KSEC1( 5)-- FLAG (PRESENCE OF SECTION 2)
+C KSEC1( 6)-- BUFR MESSAGE TYPE
+C KSEC1( 7)-- BUFR MESSAGE SUBTYPE
+C KSEC1( 8)-- VERSION NUMBER OF LOCAL TABLE USED
+C KSEC1( 9)-- YEAR
+C KSEC1(10)-- MONTH
+C KSEC1(11)-- DAY
+C KSEC1(12)-- HOUR
+C KSEC1(13)-- MINUTE
+C KSEC1(14)-- BUFR MASTER TABLE
+C KSEC1(15)-- VERSION NUMBER OF MASTER TABLE USED
+C KSEC1(16) TO KSEC1(40) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C
+C FOR BUFR EDITION 3 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- NOT USED
+C KSEC1(18) TO KSEC1(JSEC1) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 4 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- INTERNATIONAL SUB-CATEGORY (SEE COMMON TABLE C-13
+C KSEC1(18)-- SECOND
+C KSEC1(19)-- YEAR
+C KSEC1(20)-- MONTH
+C KSEC1(21)-- DAY
+C KSEC1(22)-- HOUR
+C KSEC1(23)-- MINUTE
+C KSEC1(24)-- SECOND
+C KSEC1(25)-- YEAR
+C KSEC1(26)-- MONTH
+C KSEC1(27)-- DAY
+C KSEC1(28)-- HOUR
+C KSEC1(29)-- MINUTE
+C KSEC1(30)-- SECOND
+C KSEC1(31)-- MOST SOUTHERN LATITUDE (-90 to 90)
+C KSEC1(32)-- MOST WESTERN LONGITUDE ( 0-360)
+C KSEC1(33)-- MOST NORTHEN LATITUDE (-90 to 90)
+C KSEC1(34)-- MOST EASTERN LONGITUDE ( 0-360)
+C KSEC1(35) TO KSEC1(JSEC1) - LOCAL ADP CENTRE INFORMATION(PACKED FORM)
+C
+C *KSEC2* - INTEGER ARRAY OF AT LEAST 64 WORDS
+C CONTAINING BUFR SECTION 2 INFORMATION
+C KSEC2( 1)-- LENGTH OF SECTION 2 (BYTES)
+C KSEC2( 2) TO KSEC2(64) LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C *KSEC3* - INTEGER ARRAY OF 4 WORDS CONTAINING
+C BUFR SECTION 3 INFORMATION
+C KSEC3( 1)-- LENGTH OF SECTION 3 (BYTES)
+C KSEC3( 2)-- RESERVED
+C KSEC3( 3)-- NUMBER OF SUBSETS
+C KSEC3( 4)-- FLAG (DATA TYPE,DATA COMPRESSION)
+C
+C *KSEC4* - INTEGER ARRAY OF 2 WORDS CONTAINING
+C BUFR SECTION 4 INFORMATION
+C KSEC4( 1)-- LENGTH OF SECTION 4 (BYTES)
+C KSEC4( 2)-- RESERVED
+C
+C *KTDLEN* - INTEGER NUMBER OF DATA DESCRIPTORS IN SECTION 3
+C *KTDLST* - INTEGER ARRAY OF AT LEAST KTDLEN WORDS
+C CONTAINING DATA DESCRIPTORS FOR BUFR SECTION 3
+C *KDLEN* - INTEGER (DIMENSION OF KDATA ARRAY)
+C *KDATA* - INTEGER ARRAY CONTAINING DATA NEEDED FOR DATA
+C DESCRIPTOR EXPANSION (DELAYED REPLICATION FACTORS)
+C WHICH APPEAR IN THE VALUES ARRAY
+C
+C *KELEM* - INTEGER NUMBER OF ELEMENTS IN BUFR TEMPLATE.
+C *KVALS* - INTEGER (DIMENSION OF VALUES ARRAY)
+C *VALUES* - REAL ARRAY OF KVALS WORDS (EXPANDED DATA )
+C *CVALS* - CHARACTER*80 ARRAY OF KVALS
+C
+C OUTPUT:
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - INTEGER ARRAY CONTAINING BUFR MESSAGE
+C *KERR* - RETURN ERROR CODE
+C
+C
+C METHOD.
+C -------
+C
+C BUFR MESSAGE SECTIONS CONTENET, AND DATA ARE PASSED FOR
+C FOR PACKING INTO FM-94 BUFR DATA.DURING UNPACKING A BIT PATHERN
+C GBYTE AND GBYTES ROUTINES (VMS VERSION) ARE USED.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C BUENS0 - PACK SECTION 0 OF BUFR MESSAGE
+C BUENS1 - PACK SECTION 1 OF BUFR MESSAGE
+C BUENS2 - PACK SECTION 2 OF BUFR MESSAGE
+C BUENS3 - PACK SECTION 3 OF BUFR MESSAGE
+C BUETAB - LOAD REQUIRED BUFR TABLES
+C BUENS4 - PACK SECTION 4 OF BUFR MESSAGE
+C BUENS5 - PACK SECTION 5 OF BUFR MESSAGE
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+# include "bcmdefc.F"
+# include "bcmoff.F"
+C
+ DIMENSION KBUFF(KBUFL)
+ DIMENSION KSEC0(JSEC0),KSEC1(JSEC1),KSEC2(JSEC2)
+ 1, KSEC3(JSEC3),KSEC4(JSEC4)
+C
+#ifndef R_4
+ REAL*8 VALUES(KVALS)
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL VALUES(KVALS)
+ REAL RVIND
+ REAL EPS
+#endif
+ DIMENSION KTDLST(KTDLEN)
+ DIMENSION KDATA(KDLEN)
+C
+ CHARACTER*4 CECMWF,CUSER
+ CHARACTER*80 CVALS(KVALS)
+C
+ SAVE NWPTB1,NBPTB1
+C
+C ------------------------------------------------------------------
+C
+C* 1. SET CONSTANTS.
+C --------------
+ 100 CONTINUE
+C
+ KERR=0
+ IF(CECMWF.NE.'ECMF') THEN
+ CALL BUIVAR(KERR)
+ KPT = 0
+ CECMWF='ECMF'
+ END IF
+C
+ NEDN=KSEC0(3)
+C
+C -----------------------------------------------------------------
+C* 2. PACK SECTION 0.
+C ---------------
+ 200 CONTINUE
+C
+ CALL BUENS0( KSEC0,KBUFL,KBUFF,KERR )
+ IF(KERR.GT.0) RETURN
+C
+C ------------------------------------------------------------------
+C
+C* 3. PACK SECTION 1.
+C ---------------
+ 300 CONTINUE
+C
+ CALL BUENS1( KSEC0,KSEC1,KBUFL,KBUFF,KERR )
+ IF(KERR.GT.0) RETURN
+C
+C ------------------------------------------------------------------
+C
+C* 4. PACK SECTION 2.
+C ---------------
+ 400 CONTINUE
+C
+ CALL BUENS2( KSEC1,KSEC2,KBUFL,KBUFF,KERR )
+ IF(KERR.GT.0) RETURN
+C
+C ------------------------------------------------------------------
+C
+C* 5. LOAD BUFR TABLES.
+C -----------------
+ 500 CONTINUE
+C
+ CALL BUETAB(KSEC1,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C ------------------------------------------------------------------
+C 6. PACK SECTION 3.
+C ---------------
+ 600 CONTINUE
+C
+ CALL BUENS3( KSEC3,KTDLEN,KTDLST,KBUFL,KBUFF,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C -----------------------------------------------------------------
+C
+ OMULTI=.FALSE.
+ NSUBSET=1
+ IF(IAND(KSEC3(4),64).EQ.0.AND.KSEC3(3).GT.1) THEN
+C
+C Multi-subset uncompressed data
+C
+ NSUBSET=0
+ OMULTI=.TRUE.
+ DO I=1,KSEC3(3)
+ NWT=0
+ M=0
+ NSUBSET=I
+ KERR=0
+ CALL BUETD(KPT,KTDLEN,KTDLST,KDLEN,KDATA,KSEC3,
+ 1 KVALS,VALUES,KELEM,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ CALL BUENS4(KSEC3,KSEC4,KELEM,KVALS,VALUES,CVALS,
+ 1 KBUFL,KBUFF,KERR)
+ IF(KERR.GT.0) RETURN
+ END DO
+
+ GO TO 800
+ END IF
+C ------------------------------------------------------------------
+C 6.1 EXPAND DATA DESCRIPTORS.
+C ------------------------
+ 610 CONTINUE
+ CALL BUETD(KPT,KTDLEN,KTDLST,KDLEN,KDATA,KSEC3,
+ 1 KVALS,VALUES,KELEM,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C
+C ------------------------------------------------------------------
+C
+C* 7. PACK SECTION 4.
+C ---------------
+ 700 CONTINUE
+C
+ CALL BUENS4(KSEC3,KSEC4,KELEM,KVALS,VALUES,CVALS,
+ 1 KBUFL,KBUFF,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C
+C ------------------------------------------------------------------
+C
+C* 8. PACK SECTION 5.
+C ---------------
+ 800 CONTINUE
+C
+ CALL BUENS5(KSEC0,KSEC1,KBUFL,KBUFF,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C -----------------------------------------------------------------
+C
+C* 9. SET TOTAL BUFR MESSAGE LENGTH.
+C ------------------------------
+ 900 CONTINUE
+C
+C
+C -----------------------------------------------------------------
+ RETURN
+C
+ END
diff --git a/bufrdc/bufrex.F b/bufrdc/bufrex.F
new file mode 100755
index 0000000..fee2532
--- /dev/null
+++ b/bufrdc/bufrex.F
@@ -0,0 +1,347 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUFREX(KBUFL,KBUFF,KSUP,KSEC0,KSEC1,KSEC2,KSEC3,KSEC4,
+ 2 KELEM,CNAMES,CUNITS,KVALS,VALUES,CVALS,KERR)
+C
+C**** *BUFREX*
+C
+C
+C PURPOSE.
+C --------
+C DECODE BUFR MESSAGE INTO FULLY EXPANDED FORM; RETURNING
+C INFORMATION RELEVANT FOR ALL BUFR SECTIONS, EXPANDED VALUES,
+C THEIR NAMES AND UNITS.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUFREX(KBUFL,KBUFF,KSUP,KSEC0,KSEC1,KSEC2,KSEC3,KSEC4,
+C 1 KELEM,CNAMES,CUNITS,KVALS,VALUES,CVALS,KERR)*
+C
+C INPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - INTEGER ARRAY CONTAINING BUFR MESSAGE
+C *KELEM* - INTEGER (EXPECTED NUMBER OF EXPANDED ELEMENTS)
+C *KVALS* - INTEGER (EXPECTED NUMBER OF DATA VALUES)
+C OUTPUT:
+C *KSUP* - INTEGER ARRAY OF 9 WORDS CONTAINING
+C SUPLEMENTARY INFORMATION
+C - KSUP( 1) -- IDIM1, DIMENSION OF KSEC1
+C - KSUP( 2) -- IDIM2, DIMENSION OF KSEC2
+C - KSUP( 3) -- IDIM3, DIMENSION OF KSEC3
+C - KSUP( 4) -- IDIM4, DIMENSION OF KSEC4
+C - KSUP( 5) -- M (NUMBER OF ELEMENTS IN VALUES
+C ARRAY, FIRST INDEX)
+C - KSUP( 6) -- N (NUMBER OF SUBSETS,SECOND INDEX
+C OF VALUES ARRAY)
+C - KSUP( 7) -- JVC (NUMBER OF ELEMENTS IN CVAL ARRAY)
+C - KSUP( 8) -- TOTAL BUFR MESSAGE LENGTH IN BYTES
+C - KSUP( 9) -- IDIM0, DIMENSION OF KSEC0
+C
+C *KSEC0* - INTEGER ARRAY OF 3 WORDS CONTAINING
+C BUFR SECTION 0 INFORMATION
+C KSEC0( 1)-- LENGTH OF SECTION 0 (BYTES)
+C KSEC0( 2)-- TOTAL LENGTH OF BUFR MESSAGE (BYTES)
+C KSEC0( 3)-- BUFR EDITION NUMBER
+C
+C *KSEC1* - INTEGER ARRAY OF AT LEAST 40 WORDS
+C CONTAINING BUFR SECTION 1 INFORMATION
+C KSEC1( 1)-- LENGTH OF SECTION 1 (BYTES)
+C KSEC1( 2)-- BUFR EDITION NUMBER
+C KSEC1( 3)-- ORIGINATING CENTRE
+C KSEC1( 4)-- UPDATE SEQUENCE NUMBER
+C KSEC1( 5)-- FLAG (PRESENCE OF SECTION 2)
+C KSEC1( 6)-- BUFR MESSAGE TYPE
+C KSEC1( 7)-- BUFR MESSAGE SUBTYPE
+C KSEC1( 8)-- VERSION NUMBER OF LOCAL TABLE USED
+C KSEC1( 9)-- YEAR
+C KSEC1(10)-- MONTH
+C KSEC1(11)-- DAY
+C KSEC1(12)-- HOUR
+C KSEC1(13)-- MINUTE
+C KSEC1(14)-- BUFR MASTER TABLE
+C KSEC1(15)-- VERSION NUMBER OF MASTER TABLE USED
+C KSEC1(16) - KSEC1(40) -- LOCAL ADP CENTRE
+C INFORMATION(BYTE BY BYTE)
+C
+C
+C FOR BUFR EDITION 3 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- NOT USED
+C KSEC1(18) TO KSEC1(JSEC1) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 4 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- INTERNATIONAL SUB-CATEGORY (SEE COMMON TABLE C-13
+C KSEC1(18)-- SECOND
+C KSEC1(19)-- YEAR
+C KSEC1(20)-- MONTH
+C KSEC1(21)-- DAY
+C KSEC1(22)-- HOUR
+C KSEC1(23)-- MINUTE
+C KSEC1(24)-- SECOND
+C KSEC1(25)-- YEAR
+C KSEC1(26)-- MONTH
+C KSEC1(27)-- DAY
+C KSEC1(28)-- HOUR
+C KSEC1(29)-- MINUTE
+C KSEC1(30)-- SECOND
+C KSEC1(31)-- MOST SOUTHERN LATITUDE (-90 to 90)
+C KSEC1(32)-- MOST WESTERN LONGITUDE ( 0-360)
+C KSEC1(33)-- MOST NORTHEN LATITUDE (-90 to 90)
+C KSEC1(34)-- MOST EASTERN LONGITUDE ( 0-360)
+C KSEC1(35) TO KSEC1(JSEC1) - LOCAL ADP CENTRE INFORMATION(PACKED FORM)
+C
+C *KSEC2* - INTEGER ARRAY OF AT LEAST 64 WORDS
+C CONTAINING BUFR SECTION 2 INFORMATION
+C KSEC2( 1)-- LENGTH OF SECTION 2 (BYTES)
+C KSEC2( 2) TO KSEC2(47) RDB KEY
+C
+C *KSEC3* - INTEGER ARRAY OF 4 WORDS CONTAINING
+C BUFR SECTION 3 INFORMATION
+C KSEC3( 1)-- LENGTH OF SECTION 3 (BYTES)
+C KSEC3( 2)-- RESERVED
+C KSEC3( 3)-- NUMBER OF SUBSETS
+C KSEC3( 4)-- FLAG (DATA TYPE,DATA COMPRESSION)
+C
+C *KSEC4* - INTEGER ARRAY OF 2 WORDS CONTAINING
+C BUFR SECTION 4 INFORMATION
+C KSEC4( 1)-- LENGTH OF SECTION 4 (BYTES)
+C KSEC4( 2)-- RESERVED
+C
+C *CNAMES* - CHARACTER*64 ARRAY OF KELEM CONTAINING
+C BUFR TABLE B ELEMENT NAMES
+C *CUNITS* - CHARACTER*24 ARRAY OF KELEM CONTAINIG
+C BUFR TABLE B UNITS
+C *VALUES* - REAL ARRAY OF KVALS CONTAINING EXPANDED
+C DATA VALUES
+C *CVALS* - CHARACTER*80 ARRAY OF KVALS CONTAINING
+C BUFR CODE TABLE OR CCITTIA5 BUFR ELEMENTS
+C ENTRIES
+C *KERR* - RETURNED ERROR CODE
+C
+C
+C METHOD.
+C -------
+C
+C BUFR MESSAGE PASSED AS ARGUMENT TO THIS ROUTINE IS DECODED
+C SECTION BY SECTION. SUPLEMENTARY INFORMATION AND EXPANDED DATA
+C ARE RETURNED AS WELL AS ERROR CODE. DURING BIT PATTERN UNPACKING
+C GBYTE AND GBYTES ROUTINES (VMS VERSION) ARE USED.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C BUEXS0 - EXPANDS SECTION 0 OF BUFR MESSAGE
+C BUEXS1 - EXPANDS SECTION 1 OF BUFR MESSAGE
+C BUEXS2 - EXPANDS SECTION 2 OF BUFR MESSAGE
+C BUEXS3 - EXPANDS SECTION 3 OF BUFR MESSAGE
+C BUGBTS - LOAD REQUIRED BUFR TABLES
+C BUEXS4 - EXPANDS SECTION 4 OF BUFR MESSAGE
+C BUEXS5 - EXPANDS SECTION 5 OF BUFR MESSAGE
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+# include "bcomwt.F"
+# include "bcomdefc.F"
+# include "bcomreq.F"
+# include "bcomoff.F"
+C
+ DIMENSION KBUFF(KBUFL)
+ DIMENSION KSUP(JSUP),KSEC0(JSEC0),KSEC1(JSEC1)
+ DIMENSION KSEC2(JSEC2),KSEC3(JSEC3),KSEC4(JSEC4)
+C
+#ifndef R_4
+ REAL*8 VALUES(KVALS)
+ REAL*8 RVIND
+ REAL*8 EPS
+ REAL*8 RQVAL
+ REAL*8 VAL
+#else
+ REAL VALUES(KVALS)
+ REAL RVIND
+ REAL EPS
+ REAL RQVAL
+ REAL VAL
+#endif
+C
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+ CHARACTER*80 CVALS(KVALS)
+ CHARACTER*4 CECMWF,CUSER
+C
+ SAVE NWPTB1,NBPTB1
+C ------------------------------------------------------------------
+C
+C* 1. SET CONSTANTS.
+C --------------
+ 100 CONTINUE
+C
+ KERR=0
+C
+ M0=1
+C
+ DO 101 I=1,JSEC0
+ KSEC0(I)=0
+ 101 CONTINUE
+C
+ DO 102 I=1,JSEC1
+ KSEC1(I)=0
+ 102 CONTINUE
+C
+ DO 103 I=1,JSEC3
+ KSEC3(I)=0
+ 103 CONTINUE
+C
+ DO 104 I=1,JSUP
+ KSUP(I)=0
+ 104 CONTINUE
+C
+ DO 105 I=1,JSEC4
+ KSEC4(I)=0
+ 105 CONTINUE
+C
+ DO 106 I=1,JSEC2
+ KSEC2(I)=0
+ 106 CONTINUE
+C
+ IF(CECMWF.NE.'ECMF') THEN
+ CALL BUEVAR(KERR)
+ CECMWF='ECMF'
+ END IF
+C
+ IF(CUSER.NE.'USER') THEN
+ NREQ(1)=0
+ NREQ(2)=0
+ NRQL=0
+ END IF
+C -----------------------------------------------------------------
+C* 2. EXPAND SECTION 0.
+C -----------------
+ 200 CONTINUE
+C
+ CALL BUEXS0( KBUFL,KBUFF,KSUP,KSEC0,KERR )
+ IF(KERR.GT.0) RETURN
+C
+C ------------------------------------------------------------------
+C* 3. EXPAND SECTION 1.
+C ------------------
+ 300 CONTINUE
+C
+ CALL BUEXS1( KBUFL,KBUFF,KSUP,KSEC0,KSEC1,KERR )
+ IF(KERR.GT.0) RETURN
+C
+C ------------------------------------------------------------------
+C* 4. EXPAND SECTION 2.
+C -----------------
+ 400 CONTINUE
+C
+ CALL BUEXS2( KBUFL,KBUFF,KSUP,KSEC1,KSEC2,KERR )
+ IF(KERR.GT.0) RETURN
+C
+ CALL BUEXS33(KBUFL,KBUFF,KSEC3,KERR)
+ IF(KERR.GT.0) RETURN
+
+ NWPTB1=NWPTB
+ NBPTB1=NBPTB
+C ------------------------------------------------------------------
+C* 5. LOAD BUFR TABLES.
+C -----------------
+ 500 CONTINUE
+C
+ CALL BUGBTS(KSEC1,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ OMULTI=.FALSE.
+ NSUBSET=1
+ IF(IAND(KSEC3(4),64).EQ.0.AND.KSEC3(3).GT.1) THEN
+C
+ OMULTI=.TRUE.
+ DO I=1,KSEC3(3)
+ NWT=0
+ M=0
+ NWPTB=NWPTB1
+ NBPTB=NBPTB1
+ NSUBSET=I
+ CALL BUEXS3(KBUFL,KBUFF,KSUP,KSEC3,KELEM,CNAMES,CUNITS,
+ 1 KERR)
+ IF(KERR.GT.0) RETURN
+C
+ CALL BUEXS4(KBUFL ,KBUFF ,KSUP ,KSEC3,KSEC4,
+ 1 KELEM ,CNAMES,CUNITS,KVALS,VALUES,CVALS,KERR)
+ IF(KERR.GT.0) RETURN
+ END DO
+
+ GO TO 800
+ END IF
+
+C ------------------------------------------------------------------
+C* 6. EXPAND SECTION 3.
+C -----------------
+ 600 CONTINUE
+C
+ CALL BUEXS3(KBUFL,KBUFF,KSUP,KSEC3,KELEM,CNAMES,CUNITS,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C ------------------------------------------------------------------
+C* 7. EXPAND SECTION 4.
+C -----------------
+ 700 CONTINUE
+C
+ CALL BUEXS4(KBUFL ,KBUFF ,KSUP ,KSEC3,KSEC4,
+ 1 KELEM ,CNAMES,CUNITS,KVALS,VALUES,CVALS,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C ------------------------------------------------------------------
+C* 8. EXPAND SECTION 5.
+C -----------------
+ 800 CONTINUE
+C
+ CALL BUEXS5(KBUFL,KBUFF,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C -----------------------------------------------------------------
+C* 9. SET TOTAL BUFR MESSAGE LENGTH.
+C ------------------------------
+ 900 CONTINUE
+C
+ KSUP(8)=KSEC0(1)+KSEC1(1)+KSEC2(1)+KSEC3(1)+KSEC4(1)+4
+C
+C -----------------------------------------------------------------
+ RETURN
+C
+ END
diff --git a/bufrdc/bugbts.F b/bufrdc/bugbts.F
new file mode 100755
index 0000000..39ea299
--- /dev/null
+++ b/bufrdc/bugbts.F
@@ -0,0 +1,299 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUGBTS( KSEC1,KERR )
+C
+C**** *BUGBTS*
+C
+C
+C PURPOSE.
+C --------
+C LOAD BUFR TABLE B, D AND C ACCORDING TO EDITION AND VERSION
+C OF BUFR CODE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUGBTS(KSEC1,KERR)*
+C
+C OUTPUT:
+C *KSEC1* - ARRAY CONTAINING SECTION 1 INFORMATION
+C KSEC1( 1)-- LENGTH OF SECTION 1 (BYTES)
+C KSEC1( 2)-- BUFR EDITION NUMBER
+C KSEC1( 3)-- ORIGINATING CENTRE
+C KSEC1( 4)-- UPDATE SEQUENCE NUMBER
+C KSEC1( 5)-- FLAG (PRESENCE OF SECTION 2)
+C KSEC1( 6)-- BUFR MESSAGE TYPE
+C KSEC1( 7)-- BUFR MESSAGE SUBTYPE
+C KSEC1( 8)-- VERSION NUMBER OF LOCAL TABLE USED
+C KSEC1( 9)-- YEAR
+C KSEC1(10)-- MONTH
+C KSEC1(11)-- DAY
+C KSEC1(12)-- HOUR
+C KSEC1(13)-- MINUTE
+C KSEC1(14)-- BUFR MASTER TABLE
+C KSEC1(15)-- VERSION NUMBER OF MASTER TABLE USED
+C KSEC1(16) - KSEC1(JSEC1) -- LOCAL ADP CENTRE
+C INFORMATION(BYTE BY BYTE)
+C
+C FOR BUFR EDITION 3 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- NOT USED
+C KSEC1(18) TO KSEC1(JSEC1) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 4 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- INTERNATIONAL SUB-CATEGORY (SEE COMMON TABLE C-13
+C KSEC1(18)-- SECOND
+C KSEC1(19)-- YEAR
+C KSEC1(20)-- MONTH
+C KSEC1(21)-- DAY
+C KSEC1(22)-- HOUR
+C KSEC1(23)-- MINUTE
+C KSEC1(24)-- SECOND
+C KSEC1(25)-- YEAR
+C KSEC1(26)-- MONTH
+C KSEC1(27)-- DAY
+C KSEC1(28)-- HOUR
+C KSEC1(29)-- MINUTE
+C KSEC1(30)-- SECOND
+C KSEC1(31)-- MOST SOUTHERN LATITUDE (-90 to 90)
+C KSEC1(32)-- MOST WESTERN LONGITUDE ( 0-360)
+C KSEC1(33)-- MOST NORTHEN LATITUDE (-90 to 90)
+C KSEC1(34)-- MOST EASTERN LONGITUDE ( 0-360)
+C KSEC1(35) TO KSEC1(JSEC1) - LOCAL ADP CENTRE INFORMATION(PACKED FORM)
+C
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 17/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+# include "bcomtab.F"
+# include "bcomtabc.F"
+# include "bcomct.F"
+# include "bcomctc.F"
+# include "bcomroot.F"
+# include "bcomtabload.F"
+# include "bcomtabloadc.F"
+C
+ CHARACTER*256 YTAB ,YTAC ,YTAD
+ CHARACTER*24 YTABB,YTABC,YTABD, CTABLE_LIST
+ CHARACTER*64 CTABBEN
+ CHARACTER*24 CTABBU
+ CHARACTER*64 CCTABBEN
+ CHARACTER*24 CCTABBU
+ CHARACTER*256 CROOT
+ CHARACTER*64 CTEXT
+C
+ LOGICAL*4 OPN
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+C
+ DIMENSION KSEC1(JSEC1)
+C
+ SAVE OFIRST
+C
+C ------------------------------------------------------------------
+C
+C* 1. GET BUFR TABLES/LOCAL BUFR TABLES.
+C ----------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0) RETURN
+C
+C* 2. SET UP BUFR TABLE FILE NAME.
+C ----------------------------
+ 200 CONTINUE
+C
+C
+C BUFR EDITION 2 NAMING CONVENTION
+C
+C BXXXXXYYZZ , CXXXXXYYZZ , DXXXXXYYZZ
+C
+C B - BUFR TABLE 'B'
+C C - BUFR TABLE 'C'
+C D - BUFR TABLE 'D'
+C XXXXX - ORIGINATING CENTRE
+C YY - VERSION NUMBER OF MASTER TABLE
+C USED( CURRENTLY 2 )
+C ZZ - VERSION NUMBER OF LOCAL TABLE USED
+C
+C BUFR EDITION 3 NAMING CONVENTION
+C
+C BWWWXXXYYZZ , CWWWXXXYYZZ , DWWWXXXYYZZ
+C
+C B - BUFR TABLE 'B'
+C C - BUFR TABLE 'C'
+C D - BUFR TABLE 'D'
+C WWW - ORIGINATING SUB-CENTRE
+C XXX - ORIGINATING CENTRE
+C YY - VERSION NUMBER OF MASTER TABLE
+C USED( CURRENTLY 2 )
+C ZZ - VERSION NUMBER OF LOCAL TABLE USED
+C
+C
+C BUFR EDITION 4 NAMING CONVENTION
+C
+C BSSSWWWWWXXXXXYYYZZZ , CSSSWWWWWXXXXXYYYZZZ , DSSSWWWWWXXXXXYYYZZZ
+C
+C B - BUFR TABLE 'B'
+C C - BUFR TABLE 'C'
+C D - BUFR TABLE 'D'
+C SSS - MASTER TABLE NUMBER ( zero for WMO tables)
+C WWWWWW - ORIGINATING SUB-CENTRE
+C XXXXXX - ORIGINATING CENTRE
+C YYY - VERSION NUMBER OF MASTER
+C TABLE USED( CURRENTLY 12 )
+C ZZZ - VERSION NUMBER OF LOCAL TABLE USED
+C
+ IXX=KSEC1(3)
+ IYY=KSEC1(15)
+ IZZ=KSEC1(08)
+C
+ IF(KSEC1(2).EQ.3) THEN
+ IWW=KSEC1(16)
+ ISS=KSEC1(14)
+ ELSEIF(KSEC1(2).EQ.4) THEN
+ IWW=KSEC1(16)
+ ISS=KSEC1(14)
+ ELSE
+ IWW=0
+ ISS=0
+ END IF
+C
+C IF STANDARD TABLES USED, USE WMO ORIGINATING CENTRE ID
+C
+ IF(KSEC1(8).EQ.0.OR.KSEC1(8).EQ.255) THEN
+ IXX=0
+ IWW=0
+ IZZ=0
+ ENDIF
+C
+ IF(OFIRST) THEN
+ IF(IWW.EQ.NWWP.AND.IXX.EQ.NXXP.AND.IYY.EQ.NYYP.AND.
+ 1 IZZ.EQ.NZZP.AND.ISS.EQ.NSSP) RETURN
+ END IF
+C
+ OFIRST=.TRUE.
+C
+ NSSP=ISS
+ NXXP=IXX
+ NYYP=IYY
+ NZZP=IZZ
+ NWWP=IWW
+C
+ WRITE(YTABB,'(A1,I3.3,2(I5.5),2(I3.3),A4)')
+ 1 'B',ISS,IWW,IXX,IYY,IZZ,'.TXT'
+ WRITE(YTABC,'(A1,I3.3,2(I5.5),2(I3.3),A4)')
+ 1 'C',ISS,IWW,IXX,IYY,IZZ,'.TXT'
+ WRITE(YTABD,'(A1,I3.3,2(I5.5),2(I3.3),A4)')
+ 1 'D',ISS,IWW,IXX,IYY,IZZ,'.TXT'
+C
+C
+C Find if table is already used
+C
+ DO I=1,JTMAX
+ IF(CTABLE_LIST(I).EQ.YTABB) THEN
+ CALL GET_TABLES(I)
+ RETURN
+ END IF
+ END DO
+ IF(OPRINT) THEN
+ IF(OCTABLE) THEN
+ WRITE(KNTN,'(A,1X,A,A,A,A))') 'BUFR TABLES TO BE LOADED ',
+ 1 YTABB,',',YTABC,',',YTABD
+ ELSE
+ WRITE(KNTN,'(A,1X,A,A,A))') 'BUFR TABLES TO BE LOADED ',
+ 1 YTABB,',',YTABD
+ END IF
+
+ END IF
+C ----------------------------------------------------------------
+C* 3. OPEN AND READ FILES CONTAINING BUFR TABLES.
+C -------------------------------------------
+ 300 CONTINUE
+C
+ I=INDEX(CROOT,' ')
+ IF(I.NE.0) I=I-1
+C
+C* 3.1 READ BUFR TABLE B.
+C ------------------
+ 310 CONTINUE
+C
+ YTAB=CROOT(1:I)//YTABB
+C
+ CALL BTABLE(YTAB,YTABB,KERR)
+ IF(KERR.NE.0) RETURN
+C
+C
+C* 3.2 READ BUFR TABLE C.
+C ------------------
+ 320 CONTINUE
+C
+ IF(OCTABLE) THEN
+ YTAC=CROOT(1:I)//YTABC
+C
+ CALL CTABLE(YTAC,KERR)
+ IF(KERR.NE.0) RETURN
+ END IF
+C
+C
+C* 3.3 READ BUFR TABLE D.
+C ------------------
+ 330 CONTINUE
+C
+ YTAD=CROOT(1:I)//YTABD
+C
+ CALL DTABLE(YTAD,KERR)
+ IF(KERR.NE.0) RETURN
+C
+ RETURN
+C
+ END
diff --git a/bufrdc/bugbytesR4.F b/bufrdc/bugbytesR4.F
new file mode 100755
index 0000000..4eb6031
--- /dev/null
+++ b/bufrdc/bugbytesR4.F
@@ -0,0 +1,63 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUGBYTESR4(KSOURCE,DESTINATION,KSKIP,KWIDTH,
+ 1 KSKIPBETWEEN,KNUMBER)
+C
+C**** *BUGBYTESR4*
+C
+C
+C PURPOSE.
+C --------
+C
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JULY 2008
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+
+ REAL*4 DESTINATION
+
+ CALL GBYTES(KSOURCE,DESTINATION,KSKIP,KWIDTH,KSKIPBETWEEN,KNUMBER)
+ RETURN
+ END
diff --git a/bufrdc/bugbytesR8.F b/bufrdc/bugbytesR8.F
new file mode 100755
index 0000000..c3a534c
--- /dev/null
+++ b/bufrdc/bugbytesR8.F
@@ -0,0 +1,63 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUGBYTESR8(KSOURCE,DESTINATION,KSKIP,KWIDTH,
+ 1 KSKIPBETWEEN,KNUMBER)
+C
+C**** *BUGBYTESR8*
+C
+C
+C PURPOSE.
+C --------
+C
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JULY 2008
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+
+ REAL*8 DESTINATION
+
+ CALL GBYTES(KSOURCE,DESTINATION,KSKIP,KWIDTH,KSKIPBETWEEN,KNUMBER)
+ RETURN
+ END
diff --git a/bufrdc/buget_opera_image.F b/bufrdc/buget_opera_image.F
new file mode 100755
index 0000000..70bda0a
--- /dev/null
+++ b/bufrdc/buget_opera_image.F
@@ -0,0 +1,314 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUGET_OPERA_IMAGE(KSEC1,KTDEXL,KTDEXP,
+ 1 CNAMES,CUNITS, KELEM,KVALS,VALUES,CVALS,KTDEXL_IMG,
+ 2 KTDEXP_IMG,CNAMES_IMG,CUNITS_IMG,KVALS_IMG,VALUES_IMG,
+ 3 CVALS_IMG,KSIZE_IMG_BYTES,IMAGE,KPIXEL_SIZE,KERR)
+C
+C**** *BUGET_OPERA_IMAGE*
+C
+C
+C PURPOSE.
+C --------
+C APPLY DELAYED REPETITIONS TO GET FULL IMAGE
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUGET_OPERA_IMAGE(KSEC1,KTDEXL,KTDEXP,CNAMES,CUNITS,
+C KELEM,,KVALS,VALUES,CVALS,
+C KTDEXL_IMG,KTDEXP_IMG,CNAMES_IMG,CUNITS_IMG,
+C KVALS_IMG,VALUES_IMG,CVALS_IMG,IMAGE,KPIXEL_SIZE,KERR)
+C
+C INPUT :
+C *KSEC1* - An integer array of at least 40 words containing Bufr Section 1
+C *KTDEXL* - An integer variable containing number of expanded data descriptors
+C *KTDEXP* - An integer array containing the list of KTDEXL data descriptors
+C *CNAMES* - A CHARACTER*64 array of kelem containing element names
+C *CUNITS* - A CHARACTER*24 array of kelem containig bufr table B units
+C *KELEM* - An integer containing expected number of expanded elements
+C *KVALS* - An integer containing expected number of data elelemnts
+C *VALUES* - A REAL*8 array containing expanded values
+C *CVALS* - A CHARACTER*80 array containing character values
+C OUTPUT:
+C *KTDEXL_IMG* - An integer variable containing number of expanded data descriptors
+C *KTDEXP_IMG* - An integer array containing the list of KTDEXL_IMG data descriptors
+C *CNAMES_IMG* - A CHARACTER*64 array of kelem containing element names
+C *CUNITS_IMG* - A CHARACTER*24 array of kelem containig bufr table B units
+C *KVALS_IMG* - An integer containing number pixels in IMAGE
+C *VALUES_IMG* - A REAL*8 array containing expanded values
+C *CVALS_IMG* - A CHARACTER*80 array containing character values
+C *IMAGE* - Integer array containing image ( pixel values)
+C *KPIXEL_SIZE*- Integer containing pixel size in bytes
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 02/04/2008
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+C
+ PARAMETER (JPIXEL=10000000)
+C
+ DIMENSION KSEC1(JSEC1)
+ INTEGER*4 IMAGE(*)
+ INTEGER*4 IPIXELS(JPIXEL)
+C
+ DIMENSION KTDEXP(*)
+ DIMENSION KTDEXP_IMG(*)
+ REAL*8 VALUES_IMG(*)
+C
+ CHARACTER*64 CNAMES(*),CNAMES_IMG(*)
+ CHARACTER*24 CUNITS(*),CUNITS_IMG(*)
+ CHARACTER*80 CVALS(*) ,CVALS_IMG(*)
+C
+ CHARACTER*256 COUT1,COUT2,COUT3
+C
+#ifndef R_4
+ REAL*8 VALUES(KVALS)
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL VALUES(KVALS)
+ REAL RVIND
+ REAL EPS
+#endif
+C
+C ------------------------------------------------------------------
+C
+ RVIND=1.7D38
+ EPS=10.D-8
+C Create image
+c
+ IROW=0
+ DO I=1,KTDEXL
+ IF(KTDEXP(i).eq.005031) THEN
+ IROW=IROW+1
+ END IF
+ END DO
+
+C
+ I_N_BYTE=0
+ DO I=1,KTDEXL
+ IF(KTDEXP(i).eq.030001) THEN
+ I_N_BYTE=1
+ ELSEIF(KTDEXP(i).eq.030002) THEN
+ I_N_BYTE=1
+ ELSEIF(KTDEXP(i).eq.030004) THEN
+ I_N_BYTE=2
+ END IF
+ END DO
+
+
+C print*,'Size of pixel in bytes=',I_N_BYTE
+C print*,'total number of rows=',irow
+
+ DO I=1,KTDEXL
+ IF(KTDEXP(I).EQ.005031.AND.KTDEXP(i-1).EQ.031002) THEN
+ IMAGE_START=I-1
+ GO TO 100
+ END IF
+ END DO
+c
+ 100 CONTINUE
+c
+ DO I=1,IMAGE_START-1
+ KTDEXP_IMG(I)=KTDEXP(I)
+ END DO
+
+ KTDEXL_IMG=IMAGE_START-1
+c
+C print*,'KTDEXL_IMG=',KTDEXL_IMG
+C print*,'image_start=',image_start
+C
+ DO I=1,IMAGE_START-1
+ VALUES_IMG(I)=VALUES(I)
+ CNAMES_IMG(I)=CNAMES(I)
+ CUNITS_IMG(I)=CUNITS(I)
+ END DO
+C
+C DO I=1,IMAGE_START-1
+C WRITE(IUNIT2,'(I6,1X,A64,E23.14E3,1x,a24)') I,CNAMES(I),
+C c VALUES(I),CUNITS(I)
+C END DO
+C
+ NBPW=JBPW
+ NWPT=1
+ NBPT=0
+ IMX=0
+ MAX=0
+ i0=0
+ DO I=IMAGE_START,KTDEXL
+ IF(KTDEXP(I).EQ.005031) THEN
+ END IF
+ IF(KTDEXP(I).EQ.030001.AND.KTDEXP(I-1).EQ.031012) THEN
+ I_REPEAT=NINT(VALUES(I-1))
+ DO J=1,I_REPEAT
+ IMX=IMX+1
+ if(abs(VALUES(I)-rvind)/rvind.lt.eps) then
+ ipixels(IMX)=255
+ else
+ IF(NINT(VALUES(I)).GT.MAX) MAX=NINT(VALUES(I))
+ IVAL=NINT(VALUES(I))
+ ipixels(IMX)=ival
+ end if
+ END DO
+ ELSEIF(KTDEXP(I).EQ.030002.AND.KTDEXP(I-1).EQ.031012) THEN
+ I_REPEAT=NINT(VALUES(I-1))
+ DO J=1,I_REPEAT
+ IMX=IMX+1
+ if(abs(VALUES(I)-rvind)/rvind.lt.eps) then
+ ipixels(IMX)=255
+ CALL BUPCK(NBPW,IMAGE(NWPT),255,NWPT,NBPT,8,IERR)
+ else
+ IF(NINT(VALUES(I)).GT.MAX) MAX=NINT(VALUES(I))
+ IVAL=NINT(VALUES(I))
+ ipixels(IMX)=ival
+ end if
+ END DO
+ ELSEIF(KTDEXP(i).EQ.030004.AND.KTDEXP(I-1).EQ.031012) THEN
+ I_REPEAT=NINT(VALUES(I-1))
+ DO J=1,I_REPEAT
+ IMX=IMX+1
+ if(abs(VALUES(I)-rvind)/rvind.lt.eps) then
+ ipixels(IMX)=65535
+ else
+ IF(NINT(VALUES(I)).GT.MAX) MAX=NINT(VALUES(I))
+ IVAL=NINT(VALUES(I))
+ ipixels(IMX)=ival
+ end if
+ END DO
+ ELSEIF(KTDEXP(I).EQ.030001.AND.KTDEXP(I-1).EQ.031011) THEN
+ I_REPEAT=NINT(VALUES(I-1))
+ DO J=1,I_REPEAT
+ IMX=IMX+1
+ if(abs(VALUES(I)-rvind)/rvind.lt.eps) then
+ ipixels(IMX)=255
+ else
+ IF(NINT(VALUES(I)).GT.MAX) MAX=NINT(VALUES(I))
+ IVAL=NINT(VALUES(I))
+ ipixels(IMX)=ival
+ end if
+ END DO
+ ELSEIF(KTDEXP(I).EQ.030002.AND.KTDEXP(I-1).EQ.031011) THEN
+ I_REPEAT=NINT(VALUES(I-1))
+ DO J=1,I_REPEAT
+ IMX=IMX+1
+ if(abs(VALUES(I)-rvind)/rvind.lt.eps) then
+ ipixels(IMX)=255
+ else
+ IF(NINT(VALUES(I)).GT.MAX) MAX=NINT(VALUES(I))
+ IVAL=NINT(VALUES(I))
+ ipixels(IMX)=ival
+ end if
+ END DO
+ ELSEIF(KTDEXP(I).EQ.030004.and.KTDEXP(I-1).EQ.031011) THEN
+ I_REPEAT=NINT(VALUES(I-1))
+ DO J=1,I_REPEAT
+ IMX=IMX+1
+ if(abs(VALUES(I)-rvind)/rvind.lt.eps) then
+ ipixels(IMX)=65535
+ else
+ IF(NINT(VALUES(I)).GT.MAX) MAX=NINT(VALUES(I))
+ IVAL=NINT(VALUES(I))
+ ipixels(IMX)=ival
+ end if
+ END DO
+ ELSEIF(KTDEXP(I).EQ.030001) THEN
+ IMX=IMX+1
+ if(abs(VALUES(I)-rvind)/rvind.lt.eps) then
+ ipixels(IMX)=255
+ else
+ IF(NINT(VALUES(I)).GT.MAX) MAX=NINT(VALUES(I))
+ IVAL=NINT(VALUES(I))
+ ipixels(IMX)=ival
+ end if
+ ELSEIF(KTDEXP(I).EQ.030002) THEN
+ IMX=IMX+1
+ if(abs(VALUES(I)-rvind)/rvind.lt.eps) then
+ ipixels(IMX)=255
+ else
+ IF(NINT(VALUES(I)).GT.MAX) MAX=NINT(VALUES(I))
+ IVAL=NINT(VALUES(I))
+ ipixels(IMX)=ival
+ end if
+ ELSEIF(KTDEXP(I).EQ.030004) THEN
+ IMX=IMX+1
+ if(abs(VALUES(I)-rvind)/rvind.lt.eps) then
+ ipixels(IMX)=65355
+ else
+ IF(NINT(VALUES(I)).GT.MAX) MAX=NINT(VALUES(I))
+ IVAL=NINT(VALUES(I))
+ ipixels(IMX)=ival
+ end if
+ END IF
+ END DO
+C
+ KSIZE_IMG_BYTES=IMX*I_N_BYTE
+ KPIXEL_SIZE=I_N_BYTE
+ KVALS_IMG=IMX
+C
+ CALL SBYTES(IMAGE,IPIXELS,0,8,0,IMX)
+
+C print*,'max pixel value=',max
+C print*,'number of pixels=',KVALS_IMG
+C print*,'image size bytes=',KSIZE_IMG_BYTES
+C
+ GO TO 900
+C -----------------------------------------------------------------
+C
+ 810 CONTINUE
+C
+ WRITE(*,'(1H ,A)') 'OPEN ERROR ON INPUT FILE'
+ GO TO 900
+C
+ 800 CONTINUE
+C
+ IF(IRET.EQ.-1) THEN
+ PRINT*,'NUMBER OF RECORDS PROCESSED ',N
+ PRINT*,'NUMBER OF OBSERVATIONS ',IOBS
+ ELSE
+ PRINT*,' BUFR : ERROR= ',IERR
+ END IF
+C
+ 900 CONTINUE
+C
+C
+C ------------------------------------------------------------------
+ RETURN
+ END
diff --git a/bufrdc/bugetbm.F b/bufrdc/bugetbm.F
new file mode 100755
index 0000000..04dfd91
--- /dev/null
+++ b/bufrdc/bugetbm.F
@@ -0,0 +1,217 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUGETBM(KBUFL,KBUFF,KSEC3,KBMP,KBMPL,KBV,KERR)
+C
+C**** *BUGETBM*
+C
+C
+C PURPOSE.
+C --------
+C
+C CREATE BIT MAP TO RESOLVE MARKER OPERATORS.
+C
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUGETBM(KBUFL,KBUFF,KSEC3,KBMP,KBMPL,KBV,KERR)*
+C
+C INPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C *KSEC3* - ARRAY CONTAINING SECTION 3 INFORMATION
+C KSEC3( 1)-- LENGTH OF SECTION 3 (BYTES)
+C KSEC3( 2)-- RESERVED
+C KSEC3( 3)-- NUMBER OF SUBSETS
+C KSEC3( 4)-- FLAG (DATA TYPE,DATA COMPRESSION)
+C *KBMP - BIT MAP POINTER TO THE FIRST DATA PRESENT
+C INDICATOR
+C *KBMPL - NUMBER OF DATA PRESENT INDICATORS
+C
+C OUTPUT:
+C *KBV* - BIT MAP ARRAY
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C BUNPCK - UNPACKS BIT PATTERN
+C BUNPKS - UNPACKS BIT PATTERN IN REPEATED WAY
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+# include "bcombef.F"
+# include "bcomwt.F"
+# include "bcomwtc.F"
+# include "bcomrq.F"
+C
+ CHARACTER CWTEN*64,CWTU*24
+ DIMENSION KBUFF(KBUFL),KBV(*)
+ DIMENSION KSEC3(JSEC3)
+C
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+ DIMENSION IMASK(8),ILIST(JELEM)
+C
+ DATA IMASK /1,2,4,8,16,32,64,128/
+C
+C
+C ------------------------------------------------------------------
+C* 1. CALCULATE WORD AND BIT POINTER TO FIRST
+C ---------------------------------------
+C DATA PRESENT INDICATOR.
+C -----------------------
+ 100 CONTINUE
+C
+C
+ IF(KERR.GT.0) RETURN
+C
+ IB=0
+ IF(IAND(KSEC3(4),IMASK(7)).NE.0) IB=1
+C
+ IF(IB.EQ.0) THEN
+C
+C FOR UNCOMPRESSED DATA
+C
+ IBIT=NWPTB*NBPW+32+NBPTB
+ DO 101 I=1,KBMP-1
+ IBIT=IBIT+NWTDW(I)
+ 101 CONTINUE
+C
+ IWPT=IBIT/NBPW
+ IBPT=IBIT-IWPT*NBPW
+ ELSE
+C
+C FOR COMPRESSED DATA
+C
+ IBIT=32+NBPTB
+ IWORD=IBIT/NBPW
+C
+ NWORDP(1)=NWPTB+IWORD
+ NBITP (1)=IBIT-IWORD*NBPW
+C
+ DO 102 I=2,KBMP
+C
+ IF(NWTDW(I-1).EQ.0) THEN
+ NBITP(I)=NBITP(I-1)
+ NWORDP(I)=NWORDP(I-1)
+ GO TO 102
+ END IF
+C
+ IWRD=NWORDP(I-1)
+ IBTP=NBITP (I-1)
+C
+ IBTP=IBTP+NWTDW(I-1)
+ IF(IBTP.GE.NBPW) THEN
+ IW=IBTP/NBPW
+ IBTP=IBTP-IW*NBPW
+ IWRD=IWRD+IW
+ END IF
+ CALL BUNPCK(NBPW,KBUFF,IDWINC,IWRD,IBTP,6,KERR)
+ IF(KERR.GT.0) RETURN
+ IF(IDWINC.GT.JBPW) THEN
+ KERR=15
+ WRITE(KNTN,*) 'BUPMRK :'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ IF(CWTU(I-1).EQ.'CCITTIA5') THEN
+ NWTIWS(I-1)=NWTDW(I-1)+6+N*IDWINC*8
+ ELSEIF(NWTEN(I-1).EQ.-999) THEN
+ NWTIWS(I-1)=NWTDW(I-1)+6+N*IDWINC*8
+ ELSE
+ NWTIWS(I-1)=NWTDW(I-1)+6+N*IDWINC
+ END IF
+C
+ IBIT = NBITP(I-1) + NWTIWS(I-1)
+ IWORD= IBIT/NBPW
+C
+ NBITP (I)= IBIT - IWORD*NBPW
+ NWORDP(I)= NWORDP(I-1) + IWORD
+ 102 CONTINUE
+C
+ IBPT=NBITP (KBMP)
+ IWPT=NWORDP(KBMP)
+ END IF
+C
+C* 2. GET BIT MAP FROM DATA SECTION.
+C ------------------------------
+ 200 CONTINUE
+C
+ IF(IB.EQ.0) THEN
+ CALL GBYTES(KBUFF(IWPT),KBV,IBPT,1,0,KBMPL)
+ ELSE
+ DO 201 I=1,KBMPL
+ CALL BUNPCK(NBPW,KBUFF,IR0,IWPT,IBPT,1,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KBUFF,IDWINC,IWPT,IBPT,6,KERR)
+ IF(KERR.GT.0) RETURN
+ IF(IDWINC.GT.JBPW) THEN
+ KERR=15
+ WRITE(KNTN,*) 'BUPMRK:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ DO 202 K=1,KSEC3(3)
+ ILIST(K)=0
+ 202 CONTINUE
+C
+ IF(IDWINC.NE.0) THEN
+C
+C UNPACK INCREMENTS
+C
+ CALL BUNPKS(NBPW,KBUFF,ILIST,IWPT,IBPT,
+ 1 IDWINC,0,KSEC3(3),KERR)
+ IF(KERR.GT.0) RETURN
+ END IF
+C
+ KBV(I)=IR0
+ IF(IDWINC.NE.0) KBV(I)=IR0+ILIST(1)
+ 201 CONTINUE
+C
+ END IF
+C
+ RETURN
+ END
diff --git a/bufrdc/bugtll.F b/bufrdc/bugtll.F
new file mode 100755
index 0000000..aa50ec6
--- /dev/null
+++ b/bufrdc/bugtll.F
@@ -0,0 +1,267 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUGTLL(KELEM,KTDEXL,KTDEXP,KSEC1,KSEC3 ,
+ 1 KVALS, VALUES, KERR)
+C
+C**** *BUGTLL*
+C
+C
+C PURPOSE.
+C --------
+C Set section 1 info for Bufr Edition 4
+C
+C
+C** INTERFACE.
+C ----------
+C
+C NONE.
+C
+C METHOD.
+C -------
+C
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 06/11/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H,Y)
+C
+C
+ DIMENSION KSEC1(*),KSEC3(*)
+ DIMENSION KTDEXP(*)
+#ifndef R_4
+ REAL*8 VALUES(*)
+ REAL*8 RYEAR(10000)
+ REAL*8 RMONTH(10000)
+ REAL*8 RDAY(10000)
+ REAL*8 RHOUR(10000)
+ REAL*8 RMINUTE(10000)
+ REAL*8 RSECOND(10000)
+ REAL*8 RMINLAT, RMINLON, RMAXLAT, RMAXLON
+#else
+ REAL VALUES(*)
+ REAL RYEAR(10000)
+ REAL RMONTH(10000)
+ REAL RDAY(10000)
+ REAL RHOUR(10000)
+ REAL RMINUTE(10000)
+ REAL RSECOND(10000)
+ REAL RMINLAT, RMINLON, RMAXLAT, RMAXLON
+#endif
+ DIMENSION IDATE(10000)
+ DIMENSION ITIME(10000)
+C
+C -----------------------------------------------------------------
+C
+C 1. FIND TIME,LAT,LONG
+C
+ IPYEAR=0
+ IPMONTH=0
+ IPDAY=0
+ IPHOUR=0
+ IPMINUTE=0
+ IPSECOND=0
+ IPLAT=0
+ IPLON=0
+C
+ DO I=1,KTDEXL
+ IF(KTDEXP(I).EQ.004001) THEN
+ IF(IPYEAR.EQ.0) IPYEAR=I
+ END IF
+ IF(KTDEXP(I).EQ.004002) THEN
+ IF(IPMONTH.EQ.0) IPMONTH=I
+ END IF
+ IF(KTDEXP(I).EQ.004003) THEN
+ IF(IPDAY.EQ.0) IPDAY=I
+ END IF
+ IF(KTDEXP(I).EQ.004004) THEN
+ IF(IPHOUR.EQ.0) IPHOUR=I
+ END IF
+ IF(KTDEXP(I).EQ.004005) THEN
+ IF(IPMINUTE.EQ.0) IPMINUTE=I
+ END IF
+ IF(KTDEXP(I).EQ.004006) THEN
+ IF(IPSECOND.EQ.0) IPSECOND=I
+ END IF
+ IF(KTDEXP(I).EQ.005001) THEN
+ IF(IPLAT.EQ.0) IPLAT=I
+ END IF
+ IF(KTDEXP(I).EQ.006001) THEN
+ IF(IPLON.EQ.0) IPLON=I
+ END IF
+ IF(KTDEXP(I).EQ.005002) THEN
+ IF(IPLAT.EQ.0) IPLAT=I
+ END IF
+ IF(KTDEXP(I).EQ.006002) THEN
+ IF(IPLON.EQ.0) IPLON=I
+ END IF
+ END DO
+C
+ CALL FMMH(IPLAT,IPLON,KELEM,VALUES,KSEC3,RMINLAT,RMINLON,
+ 1 RMAXLAT,RMAXLON)
+C
+C IF(RMINLON.LT.0) RMINLON=360.0-ABS(RMINLON)
+C IF(RMAXLON.lt.0) RMAXLON=360.0-ABS(RMAXLON)
+C
+ KSEC1(31)=NINT(RMINLAT*100000)
+ KSEC1(32)=NINT(RMINLON*100000)
+ KSEC1(33)=NINT(RMAXLAT*100000)
+ KSEC1(34)=NINT(RMAXLON*100000)
+C
+ J=0
+ IF(IPYEAR.NE.0) THEN
+ DO I=1,KSEC3(3)
+ IYE=IPYEAR+(I-1)*KELEM
+ J=J+1
+ RYEAR(J)=VALUES(IYE)
+ END DO
+ ELSE
+ DO I=1,KSEC3(3)
+ RYEAR(I)=0.
+ END DO
+ END IF
+ J=0
+ IF(IPMONTH.NE.0) THEN
+ DO I=1,KSEC3(3)
+ IMO=IPMONTH+(I-1)*KELEM
+ J=J+1
+ RMONTH(J)=VALUES(IMO)
+ END DO
+ ELSE
+ DO I=1,KSEC3(3)
+ RMONTH(I)=0.
+ END DO
+ END IF
+ J=0
+ IF(IPDAY.NE.0) THEN
+ DO I=1,KSEC3(3)
+ IDA=IPDAY+(I-1)*KELEM
+ J=J+1
+ RDAY(J)=VALUES(IDA)
+ END DO
+ ELSE
+ DO I=1,KSEC3(3)
+ RDAY(I)=0.
+ END DO
+ END IF
+ J=0
+ IF(IPHOUR.NE.0) THEN
+ DO I=1,KSEC3(3)
+ IHO=IPHOUR+(I-1)*KELEM
+ J=J+1
+ RHOUR(J)=VALUES(IHO)
+ END DO
+ ELSE
+ DO I=1,KSEC3(3)
+ RHOUR(I)=0.
+ END DO
+ END IF
+ J=0
+ IF(IPMINUTE.NE.0) THEN
+ DO I=1,KSEC3(3)
+ IMI=IPMINUTE+(I-1)*KELEM
+ J=J+1
+ RMINUTE(J)=VALUES(IMI)
+ END DO
+ ELSE
+ DO I=1,KSEC3(3)
+ RMINUTE(I)=0.
+ END DO
+ END IF
+ J=0
+ IF(IPSECOND.NE.0) THEN
+ DO I=1,KSEC3(3)
+ ISE=IPSECOND+(I-1)*KELEM
+ J=J+1
+ RSECOND(J)=VALUES(ISE)
+ END DO
+ ELSE
+ DO I=1,KSEC3(3)
+ RSECOND(I)=0.
+ END DO
+ END IF
+C
+
+ DO I=1,KSEC3(3)
+ IDATE(I)=NINT(RYEAR(I))*10000+NINT(RMONTH(I))*100+NINT(RDAY(I))
+ ITIME(I)=NINT(RDAY(I))*1000000+NINT(RHOUR(I))*10000
+ 1 +NINT(RMINUTE(I))*100 +NINT(RSECOND(I))
+ END DO
+C
+ IDMAX=IDATE(1)
+ ITMAX=ITIME(1)
+ IDMIN=IDATE(1)
+ ITMIN=ITIME(1)
+ IMAX=1
+ IMIN=1
+C
+ DO I=1,KSEC3(3)
+ IF(IDATE(I).GT.IDMAX) THEN
+ IDMAX=IDATE(I)
+ ITMAX=ITIME(I)
+ IMAX=I
+ ELSEIF(IDATE(I).EQ.IDMAX) THEN
+ IF(ITIME(I).GT.ITMAX) THEN
+ ITMAX=ITIME(I)
+ IMAX=I
+ END IF
+ END IF
+ END DO
+C
+ DO I=1,KSEC3(3)
+ IF(IDATE(I).LT.IDMIN) THEN
+ IDMIN=IDATE(I)
+ ITMIN=ITIME(I)
+ IMIN=I
+ ELSEIF(IDATE(I).EQ.IDMIN) THEN
+ IF(ITIME(I).LT.ITMIN) THEN
+ ITMIN=ITIME(I)
+ IMIN=I
+ END IF
+ END IF
+ END DO
+C
+ KSEC1(19)=NINT(RYEAR(IMIN))
+ KSEC1(20)=NINT(RMONTH(IMIN))
+ KSEC1(21)=NINT(RDAY(IMIN))
+ KSEC1(22)=NINT(RHOUR(IMIN))
+ KSEC1(23)=NINT(RMINUTE(IMIN))
+ KSEC1(24)=NINT(RSECOND(IMIN))
+C
+ KSEC1(25)=NINT(RYEAR(IMAX))
+ KSEC1(26)=NINT(RMONTH(IMAX))
+ KSEC1(27)=NINT(RDAY(IMAX))
+ KSEC1(28)=NINT(RHOUR(IMAX))
+ KSEC1(29)=NINT(RMINUTE(IMAX))
+ KSEC1(30)=NINT(RSECOND(IMAX))
+C
+
+ RETURN
+ END
diff --git a/bufrdc/buivar.F b/bufrdc/buivar.F
new file mode 100755
index 0000000..3446635
--- /dev/null
+++ b/bufrdc/buivar.F
@@ -0,0 +1,209 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUIVAR(KERR)
+C
+C**** *BUIVAR*
+C
+C
+C PURPOSE.
+C --------
+C INITIALIZE CONSTANTS AND VARIABLES.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUIVAR(KERR)*
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C GETENV - GETS VALUE OF AN ENVIRONMENT VARIABLE.
+C EMOSNUM - GIVES CURRENT EMOSLIB VERSION NUMBER.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/03/92.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmatb.F"
+# include "bcmbef.F"
+# include "bcmwork.F"
+# include "bcmwt.F"
+# include "bcmroot.F"
+# include "bcmtabload.F"
+# include "bcmtabloadc.F"
+C
+ CHARACTER*256 CROOT, HDEFAULT,CPRINT
+ CHARACTER*9 STD_OUT,YKNTN
+ CHARACTER*24 CTABLE_LIST,CCTABBU
+ CHARACTER*64 CCTABBEN
+ LOGICAL OPRINT
+C
+C
+ INTEGER IEMOSNM
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+
+#ifdef TABLE_PATH
+ DATA HDEFAULT / TABLE_PATH /
+#else
+ DATA HDEFAULT / '' /
+#endif
+
+C
+C EXTERNAL FUNCTIONS
+C
+ INTEGER EMOSNUM
+ EXTERNAL EMOSNUM
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE VARIABLES AND CONSTANTS.
+C -----------------------------------
+ 100 CONTINUE
+C
+ IF(KERR.GT.0) RETURN
+C
+ NJA= 0
+ M =0
+ MM =0
+ N =0
+ JCV=0
+ NBPW=JBPW
+ NWPT=0
+ NBPT=0
+ NWPTB=0
+ NBPTB=0
+ NVIND=2147483647
+ RVIND=1.7D38
+ EPS=10.D-7
+ NBENP=0
+ NLTVNP=0
+ NWWP=0
+ NXXP=0
+ NYYP=0
+ NZZP=0
+ NTC=0
+ NTT=0
+ NDWINC=0
+ NSCAM=0
+ NSCAM07=0
+ NDWINC07=0
+ N07=0
+ NAFDW=0
+ NFD=0
+ NWT=0
+ ODREPF=.FALSE.
+ N221=0
+ N40=0
+ MREL=0
+ NFCM=0
+ MBMP=0
+ MBMPL=0
+ OMARKER=.FALSE.
+ CROOT=' '
+ NREP=0
+ OREP=.false.
+ N08=0
+ NSSP=0
+C
+C STANDARD OUTPUT UNIT NUMBER
+C
+ STD_OUT=' '
+ YKNTN=' '
+ CALL GETENV('STD_OUT',YKNTN)
+ INKNTN=INDEX(YKNTN,' ')
+ IF(INKNTN.EQ.1) THEN
+ KNTN=6
+ ELSE
+ READ(YKNTN,'(I3.3)') KNTN
+ END IF
+C
+ CROOT=' '
+ CALL GETENV('BUFR_TABLES',CROOT)
+ ILNG=INDEX(CROOT,' ')
+ IF(ILNG.LE.1) THEN
+ ILNG=INDEX(HDEFAULT,' ') - 1
+ IF(ILNG.GT.0) THEN
+ CROOT = HDEFAULT(1:ILNG)//'/bufrtables/'
+ ELSE
+ CROOT='/home/ma/emos/tables/bufr/text/'
+C
+C ADD VERSION NUMBER
+C
+ ILNG=INDEX(CROOT,' ')
+ IEMOSNM = EMOSNUM(1)
+ WRITE(CROOT(ILNG:ILNG+5),'(I6.6)') IEMOSNM
+ CROOT(ILNG+6:) = '/'
+ ENDIF
+ ENDIF
+C
+ CPRINT=' '
+ OPRINT=.TRUE.
+ CALL GETENV('PRINT_TABLE_NAMES',CPRINT)
+ ILN=INDEX(CPRINT,' ')
+ IF(ILN.LE.1) THEN
+ OPRINT=.TRUE.
+ ELSE
+ IF(CPRINT(1:ILN-1).EQ.'FALSE'.OR.
+ 1 CPRINT(1:ILN-1).EQ.'false') OPRINT=.FALSE.
+ END IF
+
+ IF(OPRINT) THEN
+C
+ WRITE(KNTN,'(1H ,A)') ' ECMWF '
+ WRITE(KNTN,'(1H )')
+ WRITE(KNTN,'(1H ,A,A)') ' BUFR ENCODING SOFTWARE',
+ 1' VERSION - 7.2 '
+ WRITE(KNTN,'(1H ,A)') ' 1 April 2007. '
+ WRITE(KNTN,'(1H )')
+ WRITE(KNTN,'(1H )')
+ WRITE(KNTN,'(1H )')
+ WRITE(KNTN,'(1H ,A)') 'Your path for bufr tables is :'
+ WRITE(KNTN,'(1H ,A)') CROOT(1:ILNG+6)
+ END IF
+C
+ DO 101 I=1,JBPW-2
+ NMASK(I)=2**I-1
+ 101 CONTINUE
+ IF(JBPW.EQ.32) THEN
+ NMASK(31)=2147483647
+ END IF
+C
+ RETURN
+ END
diff --git a/bufrdc/bunexs.F b/bufrdc/bunexs.F
new file mode 100755
index 0000000..c0fd3ae
--- /dev/null
+++ b/bufrdc/bunexs.F
@@ -0,0 +1,83 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUNEXS( KLEN)
+C
+C**** *BUNEXS*
+C
+C
+C PURPOSE.
+C --------
+C SETS WORD (NWPT) AND BIT(NBPT) POINTERS AT THE BEGINING
+C OF NEXT SECTION OF BUFR MESSAGE.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUNEXS( KLEN)*
+C
+C INPUT :
+C *KLEN* - LENGTH OF SECTION IN BYTES
+C
+C METHOD.
+C -------
+C
+C LENGTH OF EACH SECTION IS ADDED UP. WORD AND BIT POINTERS
+C POINTING TO THE BEGINING OF NEXT SECTION ARE CALCULATED.
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 16/01/91.
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+C
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+C
+C ------------------------------------------------------------------
+C
+C* 1. SET UP POINTERS AT THE BEGINING OF THE NEXT SECTION.
+C -----------------------------------------------------
+ 100 CONTINUE
+C
+ IBIT = (NWPT - 1)*NBPW +NBPT +KLEN * 8 - 24
+C
+ NWPTB = IBIT/NBPW + 1
+ NBPTB = IBIT - (NWPTB - 1)*NBPW
+C
+ RETURN
+ END
diff --git a/bufrdc/bunpck.F b/bufrdc/bunpck.F
new file mode 100755
index 0000000..f10b436
--- /dev/null
+++ b/bufrdc/bunpck.F
@@ -0,0 +1,101 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUNPCK(KBPW,KSOURC,KDEST,KWPT,KBPT,KSIZE,KERR)
+C
+C**** *BUNPCK*
+C
+C
+C PURPOSE.
+C --------
+C PURPOSE OF THIS ROUTINE IS TO UNPACK BIT STRING OF
+C KSIZE BITS, STARTED AT WORD KWPT OF ARRAY KSOURC AFTER
+C SKIPPING KBPT BITS. RESULT IS PUT INTO KDEST. AT THE END
+C POINTERS KWPT AND KBPT ARE ADJUSTED.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUNPCK(KBPW,KSOURC,KDEST,KWPT,KBPT,KSIZE,KERR)*
+C
+C INPUT :
+C *KBPW* - NUMBER OF BITS IN COMPUTER WORD
+C *KSOURC* - SOURCE (CONTINUOUS BIT STRING OF
+C ARBITRARY LENGTH)
+C *KWPT* - WORD POINTER
+C *KBPT* - BIT POINTER
+C *KSIZE* - NUMBER OF BITS TO BE EXTRACTED
+C OUTPUT:
+C *KDEST* - DESTINATION
+C *KERR* - RETURN ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C GBYTE - UNPACK BIT PATTERN
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ DIMENSION KSOURC(*)
+C
+C ------------------------------------------------------------------
+C* 1. EXTRACT BIT PATTERN.
+C --------------------
+ 100 CONTINUE
+C
+ IF(KERR.NE.0) RETURN
+C
+ IF(KSIZE.GT.KBPW) THEN
+ KERR=13
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ CALL GBYTE(KSOURC(KWPT),KDEST,KBPT,KSIZE)
+C
+C ------------------------------------------------------------------
+C* 1.1 UPDATE WORD AND BIT POINTERS.
+C -----------------------------
+ 110 CONTINUE
+C
+ KBPT = KBPT + KSIZE
+C
+ IF(KBPT.GE.KBPW) THEN
+ KBPT= KBPT - KBPW
+ KWPT= KWPT +1
+ END IF
+C
+ RETURN
+ END
diff --git a/bufrdc/bunpks.F b/bufrdc/bunpks.F
new file mode 100755
index 0000000..1279373
--- /dev/null
+++ b/bufrdc/bunpks.F
@@ -0,0 +1,104 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUNPKS(KBPW,KSOURC,KDEST,KWPT,KBPT,KSIZE,KSKIPB,K,KERR)
+C
+C**** *BUNPKS*
+C
+C
+C PURPOSE.
+C --------
+C PURPOSE OF THIS ROUTINE IS TO UNPACK BIT STRING OF
+C KSIZE BITS, STARTED AT WORD KWPT OF ARRAY KSOURC AFTER
+C SKIPPING KBPT BITS. RESULT IS PUT INTO KDEST. AT THE END
+C POINTERS KWPT AND KBPT ARE ADJUSTED.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUNPKS(KBPW,KSOURC,KDEST,KWPT,KBPT,KSIZE,KSKIPB,K,KERR)*
+C
+C INPUT :
+C *KBPW* - NUMBER OF BITS PER COMPUTER WORD
+C *KSOURC* - SOURCE (CONTINUOUS BIT STRING OF
+C ARBITRARY LENGTH)
+C *KWPT* - WORD POINTER
+C *KBPT* - BIT POINTER
+C *KSIZE* - NUMBER OF BITS TO BE EXTRACTED
+C *KSKIPB* - NUMBER OF BITS TO SKIP BETWEEN ELEMENTS
+C *K* - ITERATION
+C OUTPUT:
+C *KDEST* - DESTINATION
+C *KERR* - RETURN ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C GBYTES - UNPACK BIT PATTERN
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ DIMENSION KSOURC(*),KDEST(*)
+C
+C ------------------------------------------------------------------
+C* 1. EXTRACT BIT PATTERN.
+C --------------------
+ 100 CONTINUE
+C
+ IF(KERR.NE.0) RETURN
+C
+ IF(KSIZE.GT.KBPW) THEN
+ KERR=13
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ CALL GBYTES(KSOURC(KWPT),KDEST,KBPT,KSIZE,KSKIPB,K)
+C
+C ------------------------------------------------------------------
+C* 1.1 UPDATE WORD AND BIT POINTERS.
+C -----------------------------
+ 110 CONTINUE
+C
+ KBPT = KBPT + K*(KSIZE+KSKIPB)
+C
+ IF(KBPT.GE.KBPW) THEN
+ IW = KBPT/ KBPW
+ KBPT= KBPT - IW * KBPW
+ KWPT= KWPT +IW
+ END IF
+C
+ RETURN
+ END
diff --git a/bufrdc/buoctn.F b/bufrdc/buoctn.F
new file mode 100755
index 0000000..950ed46
--- /dev/null
+++ b/bufrdc/buoctn.F
@@ -0,0 +1,133 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUOCTN(KWPTB,KBPTB,KBUFL,KBUFF,KERR)
+C
+C**** *BUOCTN*
+C
+C
+C PURPOSE.
+C --------
+C CALCULATE NUMBER OF OCTETS FROM BIT POSITION DEFINED BY
+C KWPT,KBPT AND KWPTB,KBPTB; NUMBER OF OCTETS MUST BE EVEN. IF IT IS
+C NEEDED PADING WITH 0 BIT PERFORMS. NUMBER OF OCTETS IS WRITTEN AT
+C BEGINIG OF THE SECTION.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUOCTN(KWPTB,KBPTB,KBUFL,KBUFF,KERR)*
+C
+C INPUT :
+C *KWPTB* - WORD POINTER TO THE BEGINING OF SECTION
+C *KBPTB* - BIT POINTER TO THE BEGINING OF SECTION
+C OUTPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C *KERR* - RETURNED ERROR CODE
+C
+C
+C *METHOD.
+C -------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C BUPCK - PACK BIT PATHERN AND RESETS POINTERS
+C SBYTE - PACK BIT PATHERN
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 07/10/87.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+C
+ DIMENSION KBUFF(KBUFL)
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+C
+C ------------------------------------------------------------------
+C* 1. CALCULATE NUMBER OF OCTETS.
+C ---------------------------
+ 100 CONTINUE
+C
+ IF(KERR.GT.0) RETURN
+C
+ IB =(NWPT-1) * NBPW + NBPT
+ IBB =(KWPTB-1)* NBPW + KBPTB
+C
+ IDIFB= IB - IBB
+C
+ NOCT = IDIFB/8
+ IBDW = IDIFB - NOCT*8
+C
+ IF(IBDW .NE.0)THEN
+ NOCT=NOCT+1
+ IBDW=8-IBDW
+ CALL BUPCK(NBPW,KBUFF(NWPT),0,NWPT,NBPT,IBDW,KERR)
+ IF(KERR.GT.0) THEN
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+C
+C ------------------------------------------------------------------
+C* 2. CHECK IF THERE ARE EVEN NUMBER OF OCTETS IN BLOCK.
+C --------------------------------------------------
+ 200 CONTINUE
+C
+ IF(NEDN.LE.3) THEN
+ IF(MOD(NOCT,2).NE.0) THEN
+ IBDW = 8
+ CALL BUPCK(NBPW,KBUFF(NWPT),0,NWPT,NBPT,IBDW,KERR)
+ IF(KERR.GT.0) THEN
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ NOCT = NOCT+1
+ END IF
+ END IF
+C ------------------------------------------------------------------
+C* 3. WRITE NUMBER OF OCTETS AT BEGINING OF BLOCK.
+C --------------------------------------------
+ 300 CONTINUE
+C
+ IBDW = 24
+ CALL SBYTE(KBUFF(KWPTB),NOCT,KBPTB,IBDW)
+C
+ RETURN
+ END
diff --git a/bufrdc/buoper.F b/bufrdc/buoper.F
new file mode 100755
index 0000000..fb07c33
--- /dev/null
+++ b/bufrdc/buoper.F
@@ -0,0 +1,854 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUOPER(KPT,KDLEN,KDATA,KJ,KDD,KSTACK,KERR)
+C
+C
+C**** *BUOPER*
+C
+C
+C PURPOSE.
+C --------
+C
+C PROCESS BUFR OPERATOR.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUOPER(KPT,KDLEN,KDATA,KJ,KDD,KSTACK,KERR)*
+C
+C INPUT :
+C *KPT* - POINTER TO KDATA ARRAY
+C *KDLEN* - DIMENSION OF KDATA ARRAY
+C *KDATA* - ARRAY CONTAINING DATA NEEDED FOR DESCRIPTOR
+C EXPANSION
+C *KJ* - POINTER T ARRAY KSTACK
+C *KDD* - DATA DESCRIPTOR
+C OUTPUT:
+C *KSTACK* - LIST OF DESCRIPTORS
+C *KERR* - RETURN ERROR CODE
+C
+C *METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C BUUATB - UPDATE AUGMENTED TABLE B
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+# include "bcmwt.F"
+# include "bcmwtc.F"
+# include "bcmbef.F"
+C
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+ CHARACTER CWTEN*64,CWTU*24
+C
+ DIMENSION KSTACK(*)
+ DIMENSION KDATA(KDLEN)
+C
+C ------------------------------------------------------------------
+C
+C* 1. DETERMINE *F *X AND *Y.
+C -----------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ IF = KDD / 100000
+ IDIF= KDD - IF * 100000
+ IX = IDIF / 1000
+ IY = IDIF - IX * 1000
+C
+ IF( IF.NE.2 ) THEN
+ KERR=21
+ CALL BUERR(KERR)
+ WRITE(KNTN,*) KDD,' IS TO BE OPEATOR'
+ GO TO 400
+ END IF
+C
+C* 1.1 CHANGE DATA WIDTH ?
+C -------------------
+ 110 CONTINUE
+C
+ IF(IX.EQ.1) THEN
+ NDWINC= NDWINC + (IY-128)
+ IF(IY.EQ.0) NDWINC=0
+ GO TO 400
+ END IF
+C
+C* 1.2 CHANGE SCALE ?
+C --------------
+ 120 CONTINUE
+C
+ IF(IX.EQ.2) THEN
+C
+C* 1.2.1 UPDATE SCALE MULTIPLIER.
+C ------------------------
+C
+ NSCAM=NSCAM + (IY-128)
+ IF(IY.EQ.0) NSCAM=0
+ GO TO 400
+ END IF
+C
+C* 1.3 CHANGE REFERENCE VALUE ?
+C ------------------------
+ 130 CONTINUE
+C
+ IF(IX.EQ.3) THEN
+C
+C* 1.3.1 UPDATE AUGMENTED TABLE B.
+C -------------------------
+ CALL BUAUG(KPT,KDLEN,KDATA,KJ,IY,KSTACK,KERR)
+ GO TO 400
+ END IF
+C
+C* 1.4 ADD ASSOCIATED FIELD ?
+C ----------------------
+ 140 CONTINUE
+C
+ IF(IX.EQ.4) THEN
+C
+C* 1.4.1 UPDATE ASSOCIATED FIELD WIDTH.
+C ------------------------------
+ IF(IY.EQ.0) THEN
+ NFD=NFD-1
+ IF(NFD.LT.0) THEN
+ KERR=51
+ CALL BUERR(KERR)
+ RETURN
+ ELSEIF(NFD.EQ.0) THEN
+ NAFDW=0
+ END IF
+ ELSE
+ NFD=NFD+1
+ NAFDWA(NFD)=IY
+ END IF
+ GO TO 400
+ END IF
+C
+C* 1.5 SIGNIFY CHARACTER ?
+C -------------------
+ 150 CONTINUE
+C
+ IF(IX.EQ.5) THEN
+C
+C* 1.5.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+C CWTEN(NWT)='CHARACTERS'
+C CWTU (NWT)=' '
+ NWTR (NWT)= 0
+ NWTDW(NWT)= IY * 8
+ NWTEN(NWT)=658367
+ M=M+1
+ GO TO 400
+ END IF
+C
+C* 1.5.2 SIGNIFY DATA WIDTH FOR IMMEDISTELY
+C FOLLOWED LOCAL DESCRIPTOR
+C
+ 152 CONTINUE
+C
+ IF(IX.EQ.6) THEN
+ NWT = NWT + 1
+ KJ=KJ+1
+C CWTEN(NWT)='UNKNOWN'
+C CWTU (NWT)='UNKNOWN'
+ NWTR (NWT)= KSTACK(KJ)
+ NWTDW(NWT)= IY
+ NWTS (NWT)= 0
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= NVIND
+ M=NWT
+C
+C CHECK IF LOCAL TABLE ENTRY KNOWN
+C --------------------------------
+C
+C DO 153 I=1,JTAB
+C IF(NWTR(NWT).EQ.NTABBTR(I)) THEN
+C CWTEN(NWT)=CTABBEN(I)
+C CWTU (NWT)=CTABBU (I)
+C IF(CWTU(NWT)(1:3).EQ.'CCI') NWTEN(NWT)=65367
+C NWTS (NWT)=NTABBS (I)
+C NWTRV(NWT)=NTABBRV(I)
+C NWTDW(NWT)=NTABBDW(I)
+C NWTEN(NWT)=NTABBTR(I)
+C GO TO 400
+C END IF
+C 153 CONTINUE
+C
+ GO TO 400
+ END IF
+C
+ IF(IX.EQ.7) THEN
+C
+C* 1.5.4 UPDATE SCALE MULTIPLIER.
+C ------------------------
+C
+ IF(IY.EQ.0) THEN
+ N07 =0
+ NSCAM07 =0
+ NDWINC07=0
+ ELSE
+ N07=IY
+ NSCAM07 =IY
+ NDWINC07=((10*IY)+2)/3
+ END IF
+ GO TO 400
+ END IF
+
+
+ IF(IX.EQ.8) THEN
+C
+C* 1.5.5 UPDATE DATA WIDTH FOR CCITTIA5
+C ------------------------------
+C
+ IF(IY.EQ.0) THEN
+ N08 =0
+ ELSE
+ N08=IY
+ END IF
+ GO TO 400
+ END IF
+
+C
+C* 1.6 QUALITY INFORMATION FOLLOWS.
+C ----------------------------
+ 160 CONTINUE
+C
+ IF(IX.EQ.62) THEN
+C
+ IF(IY.EQ.0) GO TO 400
+C
+C* 1.7.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+C CWTEN(NWT)='QUALITY INFORMATION FOLLOW'
+C CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+C
+C
+C* 2. PROCESSING NEW OPERATORS.
+C -------------------------
+ 200 CONTINUE
+C
+C
+C* 2.1 DATA NOT PRESENT.
+C -----------------
+ 210 CONTINUE
+C
+ IF(IX.EQ.21) THEN
+ N221=IY
+ GO TO 400
+ END IF
+C
+C
+C* 2.2 QUALITY INFORMATION FOLLOWS.
+C ----------------------------
+ 220 CONTINUE
+C
+ IF(IX.EQ.22) THEN
+C
+C* 1.7.2 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+C CWTEN(NWT)='QUALITY INFORMATION FOLLOW'
+C CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 222000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+C
+C
+C* 2.3 SUBSTITUTED VALUES FOLLOWS.
+C ---------------------------
+ 230 CONTINUE
+C
+ IF(IX.EQ.23) THEN
+ IF(IY.EQ.0) THEN
+ NWT=NWT+1
+C CWTEN(NWT)='SUBSTITUTED VALUES FOLLOW'
+C CWTU (NWT)=' '
+ NWTDW(NWT)=0
+ NWTR (NWT)=223000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+ IF(NFD.NE.0) THEN
+ DO I=1,NFD
+ NWT=NWT+1
+C CWTEN(NWT)='ASSOCIATED FIELD'
+C CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 0
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ END DO
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+ OMARKER=.TRUE.
+ NWT=NWT+1
+C CWTEN(NWT)='SUBSTITUTED VALUE MARKER'
+C CWTU (NWT)=' '
+C NWTDW(NWT)= 0
+ NWTR (NWT)=KDD
+C NWTRV(NWT)= 0
+C NWTEN(NWT)= 0
+C NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+C
+C* 2.4 FIRST ORDER STATISTICS FOLLOWS.
+C -------------------------------
+ 240 CONTINUE
+C
+ IF(IX.EQ.24) THEN
+ IF(IY.EQ.0) THEN
+ NWT=NWT+1
+C CWTEN(NWT)='FIRST ORDER STATISTICS FOLLOW'
+C CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)=224000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+ IF(NFD.NE.0) THEN
+ DO I=1,NFD
+ NWT=NWT+1
+C CWTEN(NWT)='ASSOCIATED FIELD'
+C CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 0
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ END DO
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+ OMARKER=.TRUE.
+ NWT=NWT+1
+C CWTEN(NWT)='FIRST ORDER STATISTICS VALUE MARKER'
+C CWTU (NWT)=' '
+C NWTDW(NWT)= 0
+ NWTR (NWT)=KDD
+C NWTRV(NWT)= 0
+C NWTEN(NWT)= 0
+C NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+C* 2.5 DIFFERENCE STATISTICAL VALUES FOLLOW.
+C -------------------------------------
+ 250 CONTINUE
+C
+ IF(IX.EQ.25) THEN
+ IF(IY.EQ.0) THEN
+ NWT=NWT+1
+C CWTEN(NWT)='DIFFERENCE STATISTICAL VALUES FOLLOW'
+C CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)=225000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+ IF(NFD.NE.0) THEN
+ DO I=1,NFD
+ NWT=NWT+1
+C CWTEN(NWT)='ASSOCIATED FIELD'
+C CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 0
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ END DO
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+ OMARKER=.TRUE.
+ NWT=NWT+1
+C CWTEN(NWT)='DIFFERENCE STATISTICS VALUE MARKER'
+C CWTU (NWT)=' '
+C NWTDW(NWT)= 0
+ NWTR (NWT)=KDD
+C NWTRV(NWT)= 0
+C NWTEN(NWT)= 0
+C NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+C
+C* 2.6 REPLACED/RETAINED VALUES FOLLOWS.
+C ---------------------------------
+ 260 CONTINUE
+C
+ IF(IX.EQ.32) THEN
+ IF(IY.EQ.0) THEN
+ NWT=NWT+1
+C CWTEN(NWT)='REPLACE/RETAINED VALUES FOLLOW'
+C CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)=232000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+ IF(NFD.NE.0) THEN
+ DO I=1,NFD
+ NWT=NWT+1
+C CWTEN(NWT)='ASSOCIATED FIELD'
+C CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 0
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ END DO
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+ OMARKER=.TRUE.
+ NWT=NWT+1
+C CWTEN(NWT)='REPLACE/RETAINED VALUE MARKER'
+C CWTU (NWT)=' '
+C NWTDW(NWT)= 0
+ NWTR (NWT)=KDD
+C NWTRV(NWT)= 0
+C NWTEN(NWT)= 0
+C NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+C* 2.7 CANCEL BACKWARD DATA REFERENCE.
+C -------------------------------
+ 270 CONTINUE
+C
+ IF(IX.EQ.35) THEN
+C
+C* 2.7.2 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+C CWTEN(NWT)='CANCEL BACKWARD DATA REFERENCE'
+C CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 235000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+C
+C* 2.8 DEFINE BACKWARD REFERENCE BIT MAP.
+C ----------------------------------
+ 280 CONTINUE
+C
+ IF(IX.EQ.36) THEN
+C
+C* 2.8.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+C CWTEN(NWT)='BACKWARD REFERENCE BIT MAP'
+C CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 236000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+C
+C* 2.9 DEFINE BACKWARD REFERENCE BIT MAP.
+C ----------------------------------
+ 290 CONTINUE
+C
+ IF(IX.EQ.37) THEN
+ IF(IY.EQ.0) THEN
+C
+C* 2.8.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+C CWTEN(NWT)='USE PREVIOUSLY DEFINED BIT MAP'
+C CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 237000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+C
+C* 2.8.2 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+C CWTEN(NWT)='CANCEL PREDEFINED BIT MAP'
+C CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+
+ END IF
+ END IF
+C
+ IF(IX.EQ.9) THEN
+ IF(IY.EQ.0) THEN
+ N40=0
+ ELSE
+ N40=IY
+ END IF
+C
+ GO TO 400
+ END IF
+C
+C
+C* 5. DEFINE EVENT
+C ------------
+ 500 CONTINUE
+C
+ IF(IX.EQ.41) THEN
+ IF(IY.EQ.0) THEN
+C
+C 5.1.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='DEFINE EVENT'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 241000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+C
+C* 5.1.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='CANCEL DEFINE EVENT'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+C* 5.1 DEFINE CONDITIONING EVENT
+C -------------------------
+ 510 CONTINUE
+C
+ IF(IX.EQ.42) THEN
+ IF(IY.EQ.0) THEN
+C
+C 5.1.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='DEFINE CONDITIONING EVENT'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 242000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+C
+C* 5.1.2 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='CANCEL DEFINE CONDITIONING EVENT'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+C* 5.2 DEFINE CONDITIONING EVENT
+C -------------------------
+ 520 CONTINUE
+C
+ IF(IX.EQ.43) THEN
+ IF(IY.EQ.0) THEN
+C
+C 5.2.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='CATEGORICAL FORECAST VALUES FOLLOW'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 243000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+C
+C* 5.2.2 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='CANCEL CATEGORICAL FORECAST VALUES FOLLOW'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ KERR=22
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+C
+C ------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ RETURN
+ END
diff --git a/bufrdc/buoperc.F b/bufrdc/buoperc.F
new file mode 100755
index 0000000..d7ceed8
--- /dev/null
+++ b/bufrdc/buoperc.F
@@ -0,0 +1,852 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUOPERC(KPT,KDLEN,KDATA,KJ,KDD,KSTACK,KERR)
+C
+C
+C**** *BUOPERC*
+C
+C
+C PURPOSE.
+C --------
+C
+C PROCESS BUFR OPERATOR.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUOPERC(KPT,KDLEN,KDATA,KJ,KDD,KSTACK,KERR)*
+C
+C INPUT :
+C *KPT* - POINTER TO KDATA ARRAY
+C *KDLEN* - DIMENSION OF KDATA ARRAY
+C *KDATA* - ARRAY CONTAINING DATA NEEDED FOR DESCRIPTOR
+C EXPANSION
+C *KJ* - POINTER T ARRAY KSTACK
+C *KDD* - DATA DESCRIPTOR
+C OUTPUT:
+C *KSTACK* - LIST OF DESCRIPTORS
+C *KERR* - RETURN ERROR CODE
+C
+C *METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C BUUATB - UPDATE AUGMENTED TABLE B
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+# include "bcmwt.F"
+# include "bcmwtc.F"
+# include "bcmbef.F"
+C
+ CHARACTER CWTEN*64,CWTU*24
+C
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+ DIMENSION KSTACK(*)
+ DIMENSION KDATA(KDLEN)
+C
+C ------------------------------------------------------------------
+C
+C* 1. DETERMINE *F *X AND *Y.
+C -----------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ IF = KDD / 100000
+ IDIF= KDD - IF * 100000
+ IX = IDIF / 1000
+ IY = IDIF - IX * 1000
+C
+ IF( IF.NE.2 ) THEN
+ KERR=21
+ CALL BUERR(KERR)
+ WRITE(KNTN,*) KDD,' IS TO BE OPEATOR'
+ GO TO 400
+ END IF
+C
+C* 1.1 CHANGE DATA WIDTH ?
+C -------------------
+ 110 CONTINUE
+C
+ IF(IX.EQ.1) THEN
+ NDWINC= NDWINC + (IY-128)
+ IF(IY.EQ.0) NDWINC=0
+ GO TO 400
+ END IF
+C
+C* 1.2 CHANGE SCALE ?
+C --------------
+ 120 CONTINUE
+C
+ IF(IX.EQ.2) THEN
+C
+C* 1.2.1 UPDATE SCALE MULTIPLIER.
+C ------------------------
+C
+ NSCAM=NSCAM + (IY-128)
+ IF(IY.EQ.0) NSCAM=0
+ GO TO 400
+ END IF
+C
+C* 1.3 CHANGE REFERENCE VALUE ?
+C ------------------------
+ 130 CONTINUE
+C
+ IF(IX.EQ.3) THEN
+C
+C* 1.3.1 UPDATE AUGMENTED TABLE B.
+C -------------------------
+ CALL BUAUG(KPT,KDLEN,KDATA,KJ,IY,KSTACK,KERR)
+ GO TO 400
+ END IF
+C
+C* 1.4 ADD ASSOCIATED FIELD ?
+C ----------------------
+ 140 CONTINUE
+C
+ IF(IX.EQ.4) THEN
+C
+C* 1.4.1 UPDATE ASSOCIATED FIELD WIDTH.
+C ------------------------------
+ IF(IY.EQ.0) THEN
+ NFD=NFD-1
+ IF(NFD.LT.0) THEN
+ KERR=51
+ CALL BUERR(KERR)
+ RETURN
+ ELSEIF(NFD.EQ.0) THEN
+ NAFDW=0
+ END IF
+ ELSE
+ NFD=NFD+1
+ NAFDWA(NFD)=IY
+ END IF
+ GO TO 400
+ END IF
+
+C
+C* 1.5 SIGNIFY CHARACTER ?
+C -------------------
+ 150 CONTINUE
+C
+ IF(IX.EQ.5) THEN
+C
+C* 1.5.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='CHARACTERS'
+ CWTU (NWT)=' '
+ NWTR (NWT)= 0
+ NWTDW(NWT)= IY * 8
+ NWTEN(NWT)=658367
+ M=M+1
+ GO TO 400
+ END IF
+C
+C* 1.5.2 SIGNIFY DATA WIDTH FOR IMMEDISTELY
+C FOLLOWED LOCAL DESCRIPTOR
+C
+ 152 CONTINUE
+C
+ IF(IX.EQ.6) THEN
+ NWT = NWT + 1
+ KJ=KJ+1
+ CWTEN(NWT)='UNKNOWN'
+ CWTU (NWT)='UNKNOWN'
+ NWTR (NWT)= KSTACK(KJ)
+ NWTDW(NWT)= IY
+ NWTS (NWT)= 0
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= NVIND
+ M=NWT
+C
+C CHECK IF LOCAL TABLE ENTRY KNOWN
+C --------------------------------
+C
+C DO 153 I=1,JTAB
+C IF(NWTR(NWT).EQ.NTABBTR(I)) THEN
+C CWTEN(NWT)=CTABBEN(I)
+C CWTU (NWT)=CTABBU (I)
+C IF(CWTU(NWT)(1:3).EQ.'CCI') NWTEN(NWT)=65367
+C NWTS (NWT)=NTABBS (I)
+C NWTRV(NWT)=NTABBRV(I)
+C NWTDW(NWT)=NTABBDW(I)
+C NWTEN(NWT)=NTABBTR(I)
+C GO TO 400
+C END IF
+C 153 CONTINUE
+C
+ GO TO 400
+ END IF
+C
+ IF(IX.EQ.7) THEN
+C
+C* 1.5.4 UPDATE SCALE MULTIPLIER.
+C ------------------------
+C
+ IF(IY.EQ.0) THEN
+ N07 =0
+ NSCAM07 =0
+ NDWINC07=0
+ ELSE
+ N07=IY
+ NSCAM07 =IY
+ NDWINC07=((10*IY)+2)/3
+ END IF
+ GO TO 400
+ END IF
+
+ IF(IX.EQ.8) THEN
+C
+C* 1.5.5 UPDATE DATA WIDTH FOR CCITTIA5
+C ------------------------------
+C
+ IF(IY.EQ.0) THEN
+ N08 =0
+ ELSE
+ N07=IY
+ END IF
+ GO TO 400
+ END IF
+
+C
+C* 1.6 QUALITY INFORMATION FOLLOWS.
+C ----------------------------
+ 160 CONTINUE
+C
+ IF(IX.EQ.62) THEN
+C
+ IF(IY.EQ.0) GO TO 400
+C
+C* 1.7.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='QUALITY INFORMATION FOLLOW'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+C
+C
+C* 2. PROCESSING NEW OPERATORS.
+C -------------------------
+ 200 CONTINUE
+C
+C
+C* 2.1 DATA NOT PRESENT.
+C -----------------
+ 210 CONTINUE
+C
+ IF(IX.EQ.21) THEN
+ N221=IY
+ GO TO 400
+ END IF
+C
+C
+C* 2.2 QUALITY INFORMATION FOLLOWS.
+C ----------------------------
+ 220 CONTINUE
+C
+ IF(IX.EQ.22) THEN
+C
+C* 1.7.2 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='QUALITY INFORMATION FOLLOW'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 222000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+C
+C
+C* 2.3 SUBSTITUTED VALUES FOLLOWS.
+C ---------------------------
+ 230 CONTINUE
+C
+ IF(IX.EQ.23) THEN
+ IF(IY.EQ.0) THEN
+ NWT=NWT+1
+ CWTEN(NWT)='SUBSTITUTED VALUES FOLLOW'
+ CWTU (NWT)=' '
+ NWTDW(NWT)=0
+ NWTR (NWT)=223000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+ IF(NFD.NE.0) THEN
+ DO I=1,NFD
+ NWT=NWT+1
+ CWTEN(NWT)='ASSOCIATED FIELD'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 0
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ END DO
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+ OMARKER=.TRUE.
+ NWT=NWT+1
+ CWTEN(NWT)='SUBSTITUTED VALUE MARKER'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)=KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+C
+C* 2.4 FIRST ORDER STATISTICS FOLLOWS.
+C -------------------------------
+ 240 CONTINUE
+C
+ IF(IX.EQ.24) THEN
+ IF(IY.EQ.0) THEN
+ NWT=NWT+1
+ CWTEN(NWT)='FIRST ORDER STATISTICS FOLLOW'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)=224000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+ IF(NFD.NE.0) THEN
+ DO I=1,NFD
+ NWT=NWT+1
+ CWTEN(NWT)='ASSOCIATED FIELD'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 0
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ END DO
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+ OMARKER=.TRUE.
+ NWT=NWT+1
+ CWTEN(NWT)='FIRST ORDER STATISTICS VALUE MARKER'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)=KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+C* 2.5 DIFFERENCE STATISTICAL VALUES FOLLOW.
+C -------------------------------------
+ 250 CONTINUE
+C
+ IF(IX.EQ.25) THEN
+ IF(IY.EQ.0) THEN
+ NWT=NWT+1
+ CWTEN(NWT)='DIFFERENCE STATISTICAL VALUES FOLLOW'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)=225000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+ IF(NFD.NE.0) THEN
+ DO I=1,NFD
+ NWT=NWT+1
+ CWTEN(NWT)='ASSOCIATED FIELD'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 0
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ END DO
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+ OMARKER=.TRUE.
+ NWT=NWT+1
+ CWTEN(NWT)='DIFFERENCE STATISTICS VALUE MARKER'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)=KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+C
+C* 2.6 REPLACED/RETAINED VALUES FOLLOWS.
+C ---------------------------------
+ 260 CONTINUE
+C
+ IF(IX.EQ.32) THEN
+ IF(IY.EQ.0) THEN
+ NWT=NWT+1
+ CWTEN(NWT)='REPLACE/RETAINED VALUES FOLLOW'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)=232000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+ IF(NFD.NE.0) THEN
+ DO I=1,NFD
+ NWT=NWT+1
+ CWTEN(NWT)='ASSOCIATED FIELD'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 0
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ END DO
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+ OMARKER=.TRUE.
+ NWT=NWT+1
+ CWTEN(NWT)='REPLACE/RETAINED VALUE MARKER'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)=KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+C* 2.7 CANCEL BACKWARD DATA REFERENCE.
+C -------------------------------
+ 270 CONTINUE
+C
+ IF(IX.EQ.35) THEN
+C
+C* 2.7.2 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='CANCEL BACKWARD DATA REFERENCE'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 235000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+C
+C* 2.8 DEFINE BACKWARD REFERENCE BIT MAP.
+C ----------------------------------
+ 280 CONTINUE
+C
+ IF(IX.EQ.36) THEN
+C
+C* 2.8.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='BACKWARD REFERENCE BIT MAP'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 236000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+C
+C* 2.9 DEFINE BACKWARD REFERENCE BIT MAP.
+C ----------------------------------
+ 290 CONTINUE
+C
+ IF(IX.EQ.37) THEN
+ IF(IY.EQ.0) THEN
+C
+C* 2.8.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='USE PREVIOUSLY DEFINED BIT MAP'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 237000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+C
+C* 2.8.2 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='CANCEL PREDEFINED BIT MAP'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+
+ END IF
+ END IF
+C
+ IF(IX.EQ.9) THEN
+ IF(IY.EQ.0) THEN
+ N40=0
+ ELSE
+ N40=IY
+ END IF
+C
+ GO TO 400
+ END IF
+C
+C
+C* 5. DEFINE EVENT
+C ------------
+ 500 CONTINUE
+C
+ IF(IX.EQ.41) THEN
+ IF(IY.EQ.0) THEN
+C
+C 5.1.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='DEFINE EVENT'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 241000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+C
+C* 5.1.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='CANCEL DEFINE EVENT'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+C* 5.1 DEFINE CONDITIONING EVENT
+C -------------------------
+ 510 CONTINUE
+C
+ IF(IX.EQ.42) THEN
+ IF(IY.EQ.0) THEN
+C
+C 5.1.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='DEFINE CONDITIONING EVENT'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 242000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+C
+C* 5.1.2 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='CANCEL DEFINE CONDITIONING EVENT'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C* 5.2 DEFINE CONDITIONING EVENT
+C -------------------------
+ 520 CONTINUE
+C
+ IF(IX.EQ.43) THEN
+ IF(IY.EQ.0) THEN
+C
+C 5.2.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='CATEGORICAL FORECAST VALUES FOLLOW'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 243000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+C
+C* 5.2.2 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='CANCEL CATEGORICAL FORECAST VALUES FOLLOW'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ KERR=22
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+C
+C ------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ RETURN
+ END
diff --git a/bufrdc/bupck.F b/bufrdc/bupck.F
new file mode 100755
index 0000000..e0fd633
--- /dev/null
+++ b/bufrdc/bupck.F
@@ -0,0 +1,127 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUPCK(KBPW,KD,KS,KWPT,KBPT,KSI,KERR)
+C
+C**** *BUPCK*
+C
+C
+C PURPOSE.
+C --------
+C PURPOSE OF THIS ROUTINE IS TO PACK VALUE *KS* IN
+C *KSI* BITS, STARTED AT WORD KWPT OF ARRAY *KD* AFTER
+C SKIPPING NBPT BITS. AT THE END
+C POINTERS *KWPT* AND *KBPT* ARE ADJUSTED.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUPCK(KBPW,KD,KS,KWPT,KBPT,KSI,KERR)*
+C
+C INPUT :
+C *KS* - SOURCE
+C *KWPT* - WORD POINTER
+C *KWPT* - BIT POINTER
+C *KSI* - NUMBER OF BITS ACCUPIED BY KS.
+C
+C OUTPUT :
+C *KD* - DESTINATION ARRAY.
+C *KERR* - RETURN ERROR CODE
+C
+C *METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C *CALL SBYTE(KD,KS,KBPT,KSI)*
+C
+C *KD* - DESTINATION ARRAY.
+C *KS* - SOURCE
+C *KBPT* - POINTER TO BIT IN THE KD(KWPT)
+C *KSI* - NUMBER OF BITS ACCUPIED BY KS.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 09/06/86.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+C
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+ DIMENSION KD(*)
+ DIMENSION IMAXV(32)
+C
+ DATA IMAXV/1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,
+ 1 16383,32767,65535,131071,262143,524287,1048575,2097151,
+ 2 4194305,8388607,16777215,33554431,671108863,134217727,
+ 3 268435455,536870911,1073741823,2147483647,2147483647/
+C
+C ------------------------------------------------------------------
+C* 1. SET UP BIT PATTERN.
+C -------------------
+C
+ 100 CONTINUE
+C
+ IF(KERR.GT.0) RETURN
+C
+ IF(KS.EQ.NVIND) KS=IMAXV(KSI)
+C
+ IF(KS.GT.IMAXV(KSI)) THEN
+ KERR=28
+ RETURN
+ END IF
+C
+ CALL SBYTE(KD,KS,KBPT,KSI)
+C
+C ------------------------------------------------------------------
+C* 1.1 UPDATE WORD AND BIT POINTERS.
+C -----------------------------
+ 110 CONTINUE
+C
+ KBPT = KBPT + KSI
+C
+ IF(KBPT.GE.KBPW) THEN
+ KBPT= KBPT - KBPW
+ KWPT= KWPT + 1
+ END IF
+C
+ RETURN
+ END
diff --git a/bufrdc/bupkey.F b/bufrdc/bupkey.F
new file mode 100755
index 0000000..da99312
--- /dev/null
+++ b/bufrdc/bupkey.F
@@ -0,0 +1,437 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUPKEY( KEY,KSEC1,KSEC2,KERR )
+C
+C**** *BUPKEY*
+C
+C
+C PURPOSE.
+C --------
+C PACK LOCAL ECMWF INFORMATION (RDB KEY) INTO KSEC2 ARRAY.
+C
+C
+C** INTERFACE.
+C ----------
+C *CALL* *BUPKEY(KEY,KSEC1,KSEC2,KERR)*
+C
+C INPUT :
+C *KEY* - ARRAY CONTAINING RDB INFORMATION
+C KEY( 1)-- LENGTH OF SECTION 2 (BYTES)
+C KEY( 2)-- RDB TYPE
+C KEY( 3)-- RDB SUBTYPE
+C KEY( 4)-- YEAR
+C KEY( 5)-- MONTH
+C KEY( 6)-- DAY
+C KEY( 7)-- HOUR
+C KEY( 8)-- MINUTE
+C KEY( 9)-- SECOND
+C KEY(10)-- LONGITUDE1
+C KEY(11)-- LATITUDE1
+C KEY(12)-- LONGITUDE2
+C KEY(13)-- LATITUDE2
+C KEY(14)-- NUMBER OF SUBSETS
+C KEY(15)-- IDENT (NUMERIC)
+C KEY(16)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(17)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(18)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(19)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(20)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(21)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(22)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(23)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(24)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(25)-- TOTAL BUFR MESSAGE LENGTH
+C KEY(26)-- DAY (RDB INSERTION)
+C KEY(27)-- HOUR (RDB INSERTION)
+C KEY(28)-- MINUTE (RDB INSERTION)
+C KEY(29)-- SECOND (RDB INSERTION)
+C KEY(30)-- DAY (MDB INSERTION)
+C KEY(31)-- HOUR (MDB INSERTION)
+C KEY(32)-- MINUTE (MDB INSERTION)
+C KEY(33)-- SECOND (MDB INSERTION)
+C KEY(34)-- CORRECTION NUMBER
+C KEY(35)-- PART
+C KEY(36)-- 0
+C KEY(37)-- CORRECTION NUMBER
+C KEY(38)-- PART
+C KEY(39)-- 0
+C KEY(40)-- CORRECTION NUMBER
+C KEY(41)-- PART
+C KEY(42)-- 0
+C KEY(43)-- CORRECTION NUMBER
+C KEY(44)-- PART
+C KEY(45)-- 0
+C KEY(46)-- THE LOWEST Q/C % CONFIDENCE
+C *KSEC1* - ARRAY CONTAINING SECTION 1 INFORMATION
+C KSEC1( 1)-- LENGTH OF SECTION 1 (BYTES)
+C KSEC1( 2)-- BUFR EDITION NUMBER
+C KSEC1( 3)-- ORIGINATING CENTRE
+C KSEC1( 4)-- UPDATE SEQUENCE NUMBER
+C KSEC1( 5)-- FLAG (PRESENCE OF SECTION 2)
+C KSEC1( 6)-- BUFR MESSAGE TYPE
+C KSEC1( 7)-- BUFR MESSAGE SUBTYPE
+C KSEC1( 8)-- VERSION NUMBER OF LOCAL TABLE USED
+C KSEC1( 9)-- YEAR
+C KSEC1(10)-- MONTH
+C KSEC1(11)-- DAY
+C KSEC1(12)-- HOUR
+C KSEC1(13)-- MINUTE
+C KSEC1(14)-- BUFR MASTER TABLE
+C KSEC1(15)-- VERSION NUMBER OF MASTER TABLE USED
+C KSEC1(16) TO KSEC1(JSEC1) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 3 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- NOT USED
+C KSEC1(18) TO KSEC1(JSEC1) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 4 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- INTERNATIONAL SUB-CATEGORY (SEE COMMON TABLE C-13
+C KSEC1(18)-- SECOND
+C KSEC1(19)-- YEAR
+C KSEC1(20)-- MONTH
+C KSEC1(21)-- DAY
+C KSEC1(22)-- HOUR
+C KSEC1(23)-- MINUTE
+C KSEC1(24)-- SECOND
+C KSEC1(25)-- YEAR
+C KSEC1(26)-- MONTH
+C KSEC1(27)-- DAY
+C KSEC1(28)-- HOUR
+C KSEC1(29)-- MINUTE
+C KSEC1(30)-- SECOND
+C KSEC1(31)-- MOST SOUTHERN LATITUDE (-90 to 90)
+C KSEC1(32)-- MOST WESTERN LONGITUDE ( 0-360)
+C KSEC1(33)-- MOST NORTHEN LATITUDE (-90 to 90)
+C KSEC1(34)-- MOST EASTERN LONGITUDE ( 0-360)
+C KSEC1(35) TO KSEC1(JSEC1) - LOCAL ADP CENTRE INFORMATION(PACKED FORM)
+C
+C OUTPUT:
+C *KSEC2* - ARRAY CONTAINING SECTION 2 INFORMATION
+C KSEC2( 1)-- LENGTH OF SECTION 2 (BYTES)
+C KSEC2( 2) TO KSEC2(JSEC2) LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 17/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+# include "bcmdefc.F"
+C
+ CHARACTER*4 CECMWF,CUSER
+C
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+ DIMENSION KSEC1(JSEC1),KSEC2(JSEC2),KEY(JKEY)
+ DIMENSION IDUM(8),KSEC3(JSEC3)
+C
+ DATA IDUM/8*0/
+
+C
+C* 1. PACK LOCAL ADP CENTRE INFORMATION INTO KSEC2 ARRAY.
+C --------------------------------------------------
+C
+ KERR=0
+C
+ IF(CECMWF.NE.'ECMF') THEN
+ CALL BUIVAR(KERR)
+ CECMWF='ECMF'
+ END IF
+
+C
+C IF(KSEC1(3).EQ.98) THEN
+ IW=2
+ IB=0
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(2) ,IW,IB, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(2).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(3) ,IW,IB, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(3).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(4) ,IW,IB,12,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(4).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(5) ,IW,IB, 4,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(5).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(6) ,IW,IB, 6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(6).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(7) ,IW,IB, 5,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(7).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(8) ,IW,IB, 6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(8).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(9) ,IW,IB, 6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(9).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),0 ,IW,IB, 1,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(10) ,IW,IB,26,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(10).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),0 ,IW,IB, 6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(11) ,IW,IB,25,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(11).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),0 ,IW,IB, 7,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ IF(KEY(14).GT.1.OR.KEY(2).EQ.2.OR.KEY(2).EQ.3.OR.
+ 1 KEY(2).EQ.12.OR.KEY(2).EQ.8) THEN
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(12) ,IW,IB,26,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(12).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),0 ,IW,IB, 6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(13) ,IW,IB,25,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(13).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),0 ,IW,IB, 7,KERR)
+ IF(KERR.GT.0) RETURN
+ IF(KEY(14).GT.255.OR.KEY(3).GE.121.AND.
+ 1 KEY(3).LE.130.OR.KEY(3).EQ.31) THEN
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(14),IW,IB,16,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(14).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(15),IW,IB,16,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(15).'
+ RETURN
+ END IF
+ CALL BUPKS(NBPW,KSEC2(IW),IDUM ,IW,IB,8,0,4,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUPCK(NBPW,KSEC2(IW),0 ,IW,IB, 8,KERR)
+ IF(KERR.GT.0) RETURN
+ ELSE
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(14),IW,IB, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(14).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(15),IW,IB,16,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(15).'
+ RETURN
+ END IF
+ CALL BUPKS(NBPW,KSEC2(IW),IDUM ,IW,IB,8,0,4,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUPCK(NBPW,KSEC2(IW),0 ,IW,IB,16,KERR)
+ IF(KERR.GT.0) RETURN
+ END IF
+ GO TO 140
+ ELSE
+ CALL BUPKS(NBPW,KSEC2(IW),KEY(16),IW,IB,8,0,9,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(16).'
+ RETURN
+ END IF
+ CALL BUPKS(NBPW,KSEC2(IW),IDUM(1),IW,IB,8,0,8,KERR)
+ IF(KERR.GT.0) RETURN
+ END IF
+C
+C
+C* 1.4 SUB KEY INFORMATION.
+C --------------------
+ 140 CONTINUE
+C
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(25),IW,IB,16,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(25).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(26),IW,IB, 6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(26).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(27),IW,IB, 5,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(27).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(28),IW,IB, 6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(28).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(29),IW,IB, 6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(29).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),0 ,IW,IB, 1,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(30),IW,IB, 6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(30).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(31),IW,IB, 5,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(31).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(32),IW,IB, 6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(32).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(33),IW,IB, 6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(33).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),0 ,IW,IB, 1,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(34),IW,IB, 6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(34).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(35),IW,IB, 1,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(35).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(36),IW,IB, 1,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(36).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(37),IW,IB, 6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(37).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(38),IW,IB, 1,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(38).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(39),IW,IB, 1,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(39).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(40),IW,IB, 6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(40).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(41),IW,IB, 1,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(41).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(42),IW,IB, 1,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(42).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(43),IW,IB, 6,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(43).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(44),IW,IB, 1,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(44).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(45),IW,IB, 1,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(45).'
+ RETURN
+ END IF
+ CALL BUPCK(NBPW,KSEC2(IW),KEY(46),IW,IB, 8,KERR)
+ IF(KERR.GT.0) THEN
+ WRITE(KNTN,*) 'ERROR PACKING KEY(46).'
+ RETURN
+ END IF
+C
+C ELSE
+C WRITE(KNTN,'(1H )')
+C WRITE(KNTN,'(1H ,A)') 'BUPKEY : KEY DEFINITION NOT PACKED.'
+C WRITE(KNTN,'(1H )')
+C END IF
+C
+ RETURN
+ END
diff --git a/bufrdc/bupks.F b/bufrdc/bupks.F
new file mode 100755
index 0000000..f9afdf4
--- /dev/null
+++ b/bufrdc/bupks.F
@@ -0,0 +1,107 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUPKS(KBPW,KDEST,KSOURC,KWPT,KBPT,KSIZE,KSKIPB,K,KERR)
+C
+C**** *BUPKS*
+C
+C
+C PURPOSE.
+C --------
+C PURPOSE OF THIS ROUTINE IS TO PACK BIT STRING OF
+C KSIZE BITS, STARTED AT WORD KWPT OF ARRAY KSOURC AFTER
+C SKIPPINH KBPT BITS. RESULT IS PUT INTO KDEST. AT THE END
+C POINTERS KWPT AND KBPT ARE ADJUSTED.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUPKS(KBPW,KDEST,KSOURC,KWPT,KBPT,KSIZE,KSKIPB,K,KERR)*
+C
+C
+C INPUT :
+C KBPW - NUMBER OF BITS PER COMPUTER WORD
+C KSOURC - SOURCE (CONTINUOUS BIT STRING OF
+C ARBITRARY LENGTH)
+C KWPT - WORD POINTER
+C KBPT - BIT POINTER
+C KSIZE - NUMBER OF BITS USED FOR PACKING
+C KSKIPB - NUMBER OF BITS TO SKIP BETWEEN ELEMENTS
+C K - ITERATION
+C
+C OUTPUT :
+C KDEST - DESTINATION
+C KERR - RETURN ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C SBYTES - PACK BIT PATHERN
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ DIMENSION KDEST(*),KSOURC(*)
+C
+C ------------------------------------------------------------------
+C* 1. EXTRACT BIT PATTERN.
+C --------------------
+ 100 CONTINUE
+C
+ IF(KERR.GT.0) RETURN
+C
+ IF(KSIZE.GT.KBPW) THEN
+ KERR= 34
+ WRITE(KNTN,*) 'BUPKS :'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ CALL SBYTES(KDEST,KSOURC,KBPT,KSIZE,KSKIPB,K)
+C
+C ------------------------------------------------------------------
+C* 1.1 UPDATE WORD AND BIT POINTERS.
+C -----------------------------
+ 110 CONTINUE
+C
+ KBPT = KBPT + K*(KSIZE+KSKIPB)
+C
+ IF(KBPT.GE.KBPW) THEN
+ IW = KBPT/ KBPW
+ KBPT= KBPT - IW * KBPW
+ KWPT= KWPT +IW
+ END IF
+C
+ RETURN
+ END
diff --git a/bufrdc/bupmrk.F b/bufrdc/bupmrk.F
new file mode 100755
index 0000000..f60aff8
--- /dev/null
+++ b/bufrdc/bupmrk.F
@@ -0,0 +1,738 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUPMRK(KBUFL,KBUFF,KSEC3,KELEM,KERR)
+C
+C**** *BUPMRK*
+C
+C
+C PURPOSE.
+C --------
+C
+C PROCESS MARKER OPERATOR, RELACING IT WITH CORRESPONDING
+C TABLE B ELEMENT DESCRIPTOR.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUPMRK(KBUFL,KBUFF,KSEC3,KELEM,KERR)*
+C
+C INPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C *KSEC3* - ARRAY CONTAINING SECTION 3 INFORMATION
+C KSEC3( 1)-- LENGTH OF SECTION 3 (BYTES)
+C KSEC3( 2)-- RESERVED
+C KSEC3( 3)-- NUMBER OF SUBSETS
+C KSEC3( 4)-- FLAG (DATA TYPE,DATA COMPRESSION)
+C *KELEM* - DIMENSION OF CNAMES, CUNITS ARRAY
+C OUTPUT:
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C BUNPCK - UNPACKS BIT PATTERN
+C BUNPKS - UNPACKS BIT PATTERN IN REPEATED WAY
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+# include "bcombef.F"
+# include "bcomwt.F"
+# include "bcomwtc.F"
+# include "bcomrq.F"
+C
+ CHARACTER CWTEN*64,CWTU*24
+C
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+ DIMENSION KSEC3(JSEC3)
+ DIMENSION KBUFF(KBUFL),IBV(JELEM),ILIST(JELEM)
+ DIMENSION IMASK(8)
+ DATA IMASK/1,2,4,8,16,32,64,128/
+C
+ SAVE IBV
+C
+C ------------------------------------------------------------------
+C* 1. FINED OPERATOR 223000 TO 237255.
+C --------------------------------
+ 100 CONTINUE
+C
+ IF(KERR.GT.0) RETURN
+C
+C 1.1 CHECK IF DATA ARE COMRESSED.
+C ----------------------------
+ 110 CONTINUE
+C
+ IB=0
+ IF(IAND(KSEC3(4),IMASK(7)).NE.0) IB=1
+C
+C* 1.2 FIND POSITION OF OPREATORS.
+C ---------------------------
+ 120 CONTINUE
+C
+ M0OLD=M0
+ DO 121 J=M0OLD,M
+C
+ NR223=0
+ NR224=0
+ NR225=0
+ NR232=0
+C
+ IF(NWTR(J).EQ.222000) THEN
+C
+C SET POINTER TO THE LAST DATA ELEMENT
+C
+ IF(MREL.EQ.0) MREL=J-1
+C
+ M0=J
+C
+C CHECK IF BACKWARD REFERENCE BIT MAP DEFINED
+C
+ IF(NWTR(J+1).EQ.236000) THEN
+ NP236000=J+1
+ OBF=.TRUE.
+ J2=J+2
+C
+C DELAYED REPLICATION FACTOR CAN FOLLOW 236000
+C
+ IF(NWTR(J2).EQ.031001.OR.NWTR(J2).EQ.031000.OR.
+ 1 NWTR(J2).EQ.031002) J2=J+3
+C
+ DO 122 I=J2,M
+ IF(NWTR(I).EQ.031031) THEN
+C
+C FIND FIRST POINTER TO DATA PRESENT INDICATOR
+C
+ IF(OBF) MBMP=I
+ OBF=.FALSE.
+ ELSE
+C
+C LAST POINTER TO DATA PRESENT INDICATOR
+C
+ MBMPL=I-1
+ I222=MBMP
+ NR222=MBMPL-MBMP+1
+C
+ CALL BUGETBM(KBUFL,KBUFF,KSEC3,I222,NR222,IBV,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ GO TO 121
+ END IF
+ 122 CONTINUE
+ END IF
+ GO TO 121
+ END IF
+C
+ IF(NWTR(J).EQ.223000) THEN
+C
+C SET POINTER TO THE LAST DATA ELEMENT
+C
+ IF(MREL.EQ.0) MREL=J-1
+C
+ M0=J
+ NP223000=J
+C
+C CHECK IF BACKWARD REFERENCE BIT MAP DEFINED
+C
+ IF(NWTR(J+1).EQ.236000) THEN
+ NP236000=J+1
+ OBF=.TRUE.
+ J2=J+2
+C
+C DELAYED REPLICATION FACTOR CAN FOLLOW 236000
+C
+ IF(NWTR(J2).EQ.031001.OR.NWTR(J2).EQ.031000.OR.
+ 1 NWTR(J2).EQ.031002) J2=J+3
+C
+ DO 123 I=J2,M
+ IF(NWTR(I).EQ.031031) THEN
+C
+C FIND FIRST POINTER TO DATA PRESENT INDICATOR
+C
+ IF(OBF) MBMP=I
+ OBF=.FALSE.
+ ELSE
+C
+C LAST POINTER TO DATA PRESENT INDICATOR
+C
+ MBMPL=I-1
+C
+ I223=MBMP
+ NR223=MBMPL-MBMP+1
+C
+ CALL BUGETBM(KBUFL,KBUFF,KSEC3,I223,NR223,IBV,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ GO TO 200
+ END IF
+ 123 CONTINUE
+ END IF
+ GO TO 200
+ END IF
+ IF(NWTR(J).EQ.224000) THEN
+C
+C SET POINTER TO THE LAST DATA ELEMENT
+C
+ IF(MREL.EQ.0) MREL=J-1
+C
+ M0=J
+ NP224000=J
+C
+C CHECK IF BACKWARD REFERENCE BIT MAP DEFINED
+C
+ IF(NWTR(J+1).EQ.236000) THEN
+ NP236000=J+1
+ OBF=.TRUE.
+ J2=J+2
+C
+C DELAYED REPLICATION FACTOR CAN FOLLOW 236000
+C
+ IF(NWTR(J2).EQ.031001.OR.NWTR(J2).EQ.031000.OR.
+ 1 NWTR(J2).EQ.031002) J2=J+3
+C
+ DO 124 I=J2,M
+ IF(NWTR(I).EQ.031031) THEN
+C
+C FIND FIRST POINTER TO DATA PRESENT INDICATOR
+C
+ IF(OBF) MBMP=I
+ OBF=.FALSE.
+ ELSE
+C
+C LAST POINTER TO DATA PRESENT INDICATOR
+C
+ MBMPL=I-1
+C
+ I224=MBMP
+ NR224=MBMPL-MBMP+1
+C
+ CALL BUGETBM(KBUFL,KBUFF,KSEC3,I224,NR224,IBV,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ GO TO 300
+ END IF
+ 124 CONTINUE
+ END IF
+ GO TO 300
+ END IF
+ IF(NWTR(J).EQ.225000) THEN
+C
+C
+C SET POINTER TO THE LAST DATA ELEMENT
+C
+ IF(MREL.EQ.0) MREL=J-1
+C
+ M0=J
+ NP225000=J
+C
+C CHECK IF BACKWARD REFERENCE BIT MAP DEFINED
+C
+ IF(NWTR(J+1).EQ.236000) THEN
+ NP236000=J+1
+ OBF=.TRUE.
+ J2=J+2
+C
+C DELAYED REPLICATION FACTOR CAN FOLLOW 236000
+C
+ IF(NWTR(J2).EQ.031001.OR.NWTR(J2).EQ.031000.OR.
+ 1 NWTR(J2).EQ.031002) J2=J+3
+C
+ DO 125 I=J2,M
+ IF(NWTR(I).EQ.031031) THEN
+C
+C FIND FIRST POINTER TO DATA PRESENT INDICATOR
+C
+ IF(OBF) MBMP=I
+ OBF=.FALSE.
+ ELSE
+C
+C LAST POINTER TO DATA PRESENT INDICATOR
+C
+ MBMPL=I-1
+C
+ I225=MBMP
+ NR225=MBMPL-MBMP+1
+C
+ CALL BUGETBM(KBUFL,KBUFF,KSEC3,I225,NR225,IBV,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ GO TO 400
+ END IF
+ 125 CONTINUE
+ END IF
+ GO TO 400
+ END IF
+C
+ IF(NWTR(J).EQ.232000) THEN
+C
+C SET POINTER TO THE LAST DATA ELEMENT
+C
+ IF(MREL.EQ.0) MREL=J-1
+C
+ M0=J
+ NP232000=J
+C
+C CHECK IF BACKWARD REFERENCE BIT MAP DEFINED
+C
+ IF(NWTR(J+1).EQ.236000) THEN
+ NP236000=J+1
+ OBF=.TRUE.
+ J2=J+2
+C
+C DELAYED REPLICATION FACTOR CAN FOLLOW 236000
+C
+ IF(NWTR(J2).EQ.031001.OR.NWTR(J2).EQ.031000.OR.
+ 1 NWTR(J2).EQ.031002) J2=J+3
+C
+ DO 126 I=J2,M
+ IF(NWTR(I).EQ.031031) THEN
+C
+C FIND FIRST POINTER TO DATA PRESENT INDICATOR
+C
+ IF(OBF) MBMP=I
+ OBF=.FALSE.
+ ELSE
+C
+C LAST POINTER TO DATA PRESENT INDICATOR
+C
+ MBMPL=I-1
+C
+ I232=MBMP
+ NR232=MBMPL-MBMP+1
+C
+ CALL BUGETBM(KBUFL,KBUFF,KSEC3,I232,NR232,IBV,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ GO TO 500
+ END IF
+ 126 CONTINUE
+ END IF
+ GO TO 500
+ END IF
+C
+C
+ IF(NWTR(J).EQ.235000) THEN
+C
+C SET POINTER TO THE LAST DATA ELEMENT
+C
+ MREL=0
+ MBMP=0
+ MBMPL=0
+ M0=J
+C
+ END IF
+C
+ IF(NWTR(J).EQ.237255) THEN
+C
+C CANCEL BACKWARD BIT MAP REFERENCE.
+C
+ MBMP=0
+ MBMPL=0
+C
+ END IF
+
+ GO TO 121
+C
+C -----------------------------------------------------------------
+C* 2. PROCESS SUBSTITUTED VALUES OPERATOR.
+C ------------------------------------
+C
+ 200 CONTINUE
+C
+C* 2.1 FIND FIRST ACCURANCE OF 223255.
+C -------------------------------
+ 210 CONTINUE
+C
+ NP223255=0
+ DO 211 I=NP223000,M
+ IF(NWTR(I).EQ.223255) THEN
+ NP223255=I
+ GO TO 220
+ END IF
+ 211 CONTINUE
+C
+ GO TO 121
+C
+C* 2.2 COUNT NUMBER OF DATA PRESENT INDICATORS.
+C ----------------------------------------
+ 220 CONTINUE
+C
+ IF(MBMP.EQ.0) THEN
+ I223=0
+ OF223=.TRUE.
+ DO 221 I=NP223000,NP223255
+ IF(NWTR(I).EQ.031031) THEN
+ IF(OF223) THEN
+ I223=I
+ OF223=.FALSE.
+ END IF
+ NR223=NR223+1
+ END IF
+ 221 CONTINUE
+ ELSE
+ I223=MBMP
+ NR223=MBMPL-MBMP+1
+ GO TO 250
+ END IF
+C
+C* 2.3 CALCULATE WORD AND BIT POINTER TO FIRST
+C ---------------------------------------
+C DATA PRESENT INDICATOR.
+C -----------------------
+ 230 CONTINUE
+C
+ CALL BUGETBM(KBUFL,KBUFF,KSEC3,I223,NR223,IBV,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C* 2.5 DEFINE POINTER REFERING BACK TO DATA.
+C -------------------------------------
+ 250 CONTINUE
+C
+ ISUBST=MREL-NR223+1
+C
+C* 2.6 REPLACE MARKERS WITH CORRESPONDING DATA WIDTHS.
+C -----------------------------------------------
+C
+ 260 CONTINUE
+C
+ DO 261 I=1,NR223
+ IF(IBV(I).EQ.0) THEN
+C
+ 262 CONTINUE
+C
+ IF(NWTR(NP223255).EQ.223255) THEN
+ NWTDW (NP223255)=NWTDW(ISUBST)
+ NWTR (NP223255)=NWTR (ISUBST)
+ NWTRV (NP223255)=NWTRV(ISUBST)
+ NWTS (NP223255)=NWTS (ISUBST)
+ CWTEN (NP223255)=CWTEN(ISUBST)
+ CWTU (NP223255)=CWTU (ISUBST)
+ NWTEN (NP223255)=NWTEN(ISUBST)
+ ISUBST=ISUBST+1
+ NP223255=NP223255+1
+ ELSE
+ NP223255=NP223255+1
+ GO TO 262
+ END IF
+ ELSE
+ ISUBST=ISUBST+1
+ END IF
+ 261 CONTINUE
+C
+ GO TO 121
+C
+C -----------------------------------------------------------------
+C* 3. PROCESS FIRST ORDER STATISTICS OPERATOR.
+C ----------------------------------------
+ 300 CONTINUE
+C
+C* 3.1 FIND FIRST ACCURANCE OD 224255.
+C -------------------------------
+ 310 CONTINUE
+C
+ NP224255=0
+ DO 311 I=NP224000,M
+ IF(NWTR(I).EQ.224255) THEN
+ NP224255=I
+ GO TO 320
+ END IF
+ 311 CONTINUE
+C
+ GO TO 121
+C
+C* 3.2 COUNT NUMBER OF DATA PRESENT INDICATORS.
+C ----------------------------------------
+ 320 CONTINUE
+C
+ IF(MBMP.EQ.0) THEN
+ I224=0
+ OF224=.TRUE.
+ DO 321 I=NP224000,NP224255
+ IF(NWTR(I).EQ.031031) THEN
+ IF(OF224) THEN
+ I224=I
+ OF224=.FALSE.
+ END IF
+ NR224=NR224+1
+ END IF
+ 321 CONTINUE
+ ELSE
+ I224=MBMP
+ NR224=MBMPL-MBMP+1
+ GO TO 350
+ END IF
+C
+C* 3.3 CALCULATE WORD AND BIT POINTER TO FIRST
+C ---------------------------------------
+C DATA PRESENT INDICATOR.
+C -----------------------
+ 330 CONTINUE
+C
+ CALL BUGETBM(KBUFL,KBUFF,KSEC3,I224,NR224,IBV,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C* 3.5 DEFINE POINTER REFERING BACK TO DATA.
+C -------------------------------------
+ 350 CONTINUE
+C
+ ISUBST=MREL-NR224+1
+C
+C* 3.6 REPLACE MARKERS WITH CORRESPONDING DATA WIDTHS.
+C -----------------------------------------------
+C
+ 360 CONTINUE
+C
+ DO 361 I=1,NR224
+ IF(IBV(I).EQ.0) THEN
+C
+ 362 CONTINUE
+C
+ IF(NWTR(NP224255).EQ.224255) THEN
+ NWTDW (NP224255)=NWTDW(ISUBST)
+ NWTR (NP224255)=NWTR (ISUBST)
+ NWTRV (NP224255)=NWTRV(ISUBST)
+ NWTS (NP224255)=NWTS (ISUBST)
+ CWTEN (NP224255)=CWTEN(ISUBST)
+ CWTU (NP224255)=CWTU (ISUBST)
+ NWTEN (NP224255)=NWTEN(ISUBST)
+ ISUBST=ISUBST+1
+ NP224255=NP224255+1
+ ELSE
+ NP224255=NP224255+1
+ GO TO 362
+ END IF
+ ELSE
+ ISUBST=ISUBST+1
+ END IF
+ 361 CONTINUE
+C
+ GO TO 121
+C
+C
+C -----------------------------------------------------------------
+C* 4. PROCESS DIFFERENCE STATISTICS OPERATOR.
+C ---------------------------------------
+ 400 CONTINUE
+C
+C
+C* 4.1 FIND FIRST ACCURANCE OD 223255.
+C -------------------------------
+ 410 CONTINUE
+C
+ NP225255=0
+ DO 411 I=NP225000,M
+ IF(NWTR(I).EQ.225255) THEN
+ NP225255=I
+ GO TO 420
+ END IF
+ 411 CONTINUE
+C
+ GO TO 121
+C
+C* 4.2 COUNT NUMBER OF DATA PRESENT INDICATORS.
+C ----------------------------------------
+ 420 CONTINUE
+C
+ IF(MBMP.EQ.0) THEN
+ I225=0
+ OF225=.TRUE.
+ DO 421 I=NP225000,NP225255
+ IF(NWTR(I).EQ.031031) THEN
+ IF(OF225) THEN
+ I225=I
+ OF225=.FALSE.
+ END IF
+ NR225=NR225+1
+ END IF
+ 421 CONTINUE
+ ELSE
+ I225=MBMP
+ NR225=MBMPL-MBMP+1
+ GO TO 450
+ END IF
+C
+C* 4.3 CALCULATE WORD AND BIT POINTER TO FIRST
+C ---------------------------------------
+C DATA PRESENT INDICATOR.
+C -----------------------
+ 430 CONTINUE
+C
+ CALL BUGETBM(KBUFL,KBUFF,KSEC3,I225,NR225,IBV,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C* 4.5 DEFINE POINTER REFERING BACK TO DATA.
+C -------------------------------------
+ 450 CONTINUE
+C
+ ISUBST=MREL-NR225+1
+C
+C* 4.6 REPLACE MARKERS WITH CORRESPONDING DATA WIDTHS.
+C -----------------------------------------------
+C
+ 460 CONTINUE
+C
+ DO 461 I=1,NR225
+ IF(IBV(I).EQ.0) THEN
+C
+ 462 CONTINUE
+C
+ IF(NWTR(NP225255).EQ.225255) THEN
+ NWTR (NP225255)=NWTR (ISUBST)
+C
+C CHANGE REFERENCE VALUE TO BE CENTRED AROUND ZERO
+C AND INCREASE DATA WIDTH BY 1
+C
+ IF(NWTEN(ISUBST).NE.-999) THEN
+ NWTRV (NP225255)=-2**NWTDW(ISUBST)
+ NWTDW (NP225255)=NWTDW(ISUBST)+1
+ ELSE
+ NWTRV (NP225255)=NWTDW(ISUBST)
+ NWTDW (NP225255)=NWTDW(ISUBST)
+ NWTEN (NP225255)=NWTEN(ISUBST)
+ END IF
+C
+ NWTS (NP225255)=NWTS (ISUBST)
+ CWTEN (NP225255)=CWTEN(ISUBST)
+ CWTU (NP225255)=CWTU (ISUBST)
+ ISUBST=ISUBST+1
+ NP225255=NP225255+1
+ ELSE
+ NP225255=NP225255+1
+ GO TO 462
+ END IF
+ ELSE
+ ISUBST=ISUBST+1
+ END IF
+ 461 CONTINUE
+C
+ GO TO 121
+C
+C -----------------------------------------------------------------
+C* 5. PROCESS REPLACE/RETAINED OPERATOR.
+C ----------------------------------
+ 500 CONTINUE
+C
+C
+C* 5.1 FIND FIRST ACCURANCE OD 232255.
+C -------------------------------
+ 510 CONTINUE
+C
+ NP232255=0
+ DO 511 I=NP232000,M
+ IF(NWTR(I).EQ.232255) THEN
+ NP232255=I
+ GO TO 520
+ END IF
+ 511 CONTINUE
+C
+ GO TO 121
+C
+C* 5.2 COUNT NUMBER OF DATA PRESENT INDICATORS.
+C ----------------------------------------
+ 520 CONTINUE
+C
+ IF(MBMP.EQ.0) THEN
+ I232=0
+ OF232=.TRUE.
+ DO 521 I=NP232000,NP232255
+ IF(NWTR(I).EQ.031031) THEN
+ IF(OF232) THEN
+ I232=I
+ OF232=.FALSE.
+ END IF
+ NR232=NR232+1
+ END IF
+ 521 CONTINUE
+ ELSE
+ I232=MBMP
+ NR232=MBMPL-MBMP+1
+ GO TO 550
+ END IF
+C
+C* 5.3 CALCULATE WORD AND BIT POINTER TO FIRST
+C ---------------------------------------
+C DATA PRESENT INDICATOR.
+C -----------------------
+ 530 CONTINUE
+C
+ CALL BUGETBM(KBUFL,KBUFF,KSEC3,I232,NR232,IBV,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C* 5.5 DEFINE POINTER REFERING BACK TO DATA.
+C -------------------------------------
+ 550 CONTINUE
+C
+ ISUBST=MREL-NR232+1
+C
+C* 5.6 REPLACE MARKERS WITH CORRESPONDING DATA WIDTHS.
+C -----------------------------------------------
+C
+ 560 CONTINUE
+C
+ DO 561 I=1,NR232
+ IF(IBV(I).EQ.0) THEN
+C
+ 562 CONTINUE
+C
+ IF(NWTR(NP232255).EQ.232255) THEN
+ NWTDW (NP232255)=NWTDW(ISUBST)
+ NWTR (NP232255)=NWTR (ISUBST)
+ NWTRV (NP232255)=NWTRV(ISUBST)
+ NWTS (NP232255)=NWTS (ISUBST)
+ CWTEN (NP232255)=CWTEN(ISUBST)
+ CWTU (NP232255)=CWTU (ISUBST)
+ ISUBST=ISUBST+1
+ NP232255=NP232255+1
+ ELSE
+ NP232255=NP232255+1
+ GO TO 562
+ END IF
+ ELSE
+ ISUBST=ISUBST+1
+ END IF
+ 561 CONTINUE
+C
+C -----------------------------------------------------------------
+ 121 CONTINUE
+C
+ RETURN
+ END
diff --git a/bufrdc/buprco.F b/bufrdc/buprco.F
new file mode 100755
index 0000000..b972af5
--- /dev/null
+++ b/bufrdc/buprco.F
@@ -0,0 +1,861 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUPRCO(KBUFL,KBUFF,KJ,KDD,KSTACK,KELEM,KERR)
+C
+C**** *BUPRCO*
+C
+C
+C PURPOSE.
+C --------
+C
+C PROCESS BUFR OPERATOR.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUPRCO(KBUFL,KBUFF,KJ,KDD,KSTACK,KELEM,KERR)*
+C
+C INPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C *KJ* - POINTER TO ARRAY KSTACK
+C *KDD* - DATA DESCRIPTOR
+C *KELEM* - DIMENSION OF CNAMES, CUNITS ARRAY
+C OUTPUT:
+C *KSTACK* - LIST OF DESCRIPTORS
+C *KERR* - RETURN ERROR CODE
+C
+C *METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C BUUATB - UPDATE AUGMENTED TABLE B
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+# include "bcomwt.F"
+# include "bcomwtc.F"
+# include "bcombef.F"
+C
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+ CHARACTER CWTEN*64,CWTU*24
+ DIMENSION KBUFF(KBUFL)
+ DIMENSION KSTACK(*)
+C
+C ------------------------------------------------------------------
+C
+C* 1. DETERMINE *F *X AND *Y.
+C -----------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ IF = KDD / 100000
+ IDIF= KDD - IF * 100000
+ IX = IDIF / 1000
+ IY = IDIF - IX * 1000
+C
+ IF( IF.NE.2 ) THEN
+ KERR=21
+ CALL BUERR(KERR)
+ WRITE(KNTN,*) KDD,' IS TO BE OPERATOR'
+ GO TO 400
+ END IF
+C
+C* 1.1 CHANGE DATA WIDTH ?
+C -------------------
+ 110 CONTINUE
+C
+ IF(IX.EQ.1) THEN
+ IF(IY.EQ.0) THEN
+ NDWINC=0
+ ELSE
+ NDWINC= NDWINC + (IY-128)
+ END IF
+ GO TO 400
+ END IF
+C
+C* 1.2 CHANGE SCALE ?
+C --------------
+ 120 CONTINUE
+C
+ IF(IX.EQ.2) THEN
+C
+C* 1.2.1 UPDATE SCALE MULTIPLIER.
+C ------------------------
+C
+ IF(IY.EQ.0) THEN
+ NSCAM=0
+ ELSE
+ NSCAM=NSCAM + (IY-128)
+ END IF
+ GO TO 400
+ END IF
+C
+C* 1.3 CHANGE REFERENCE VALUE ?
+C ------------------------
+ 130 CONTINUE
+C
+ IF(IX.EQ.3) THEN
+C
+C* 1.3.1 UPDATE AUGMENTED TABLE B.
+C -------------------------
+ CALL BUUATB(KBUFL,KBUFF,KJ,IY,KSTACK,KELEM,KERR)
+ GO TO 400
+ END IF
+C
+C* 1.4 ADD ASSOCIATED FIELD ?
+C ----------------------
+ 140 CONTINUE
+C
+ IF(IX.EQ.4) THEN
+C
+C* 1.4.1 UPDATE ASSOCIATED FIELD WIDTH.
+C ------------------------------
+ IF(IY.EQ.0) THEN
+ NFD=NFD-1
+ IF(NFD.LT.0) THEN
+ KERR=51
+ CALL BUERR(KERR)
+ RETURN
+ ELSEIF(NFD.EQ.0) THEN
+ NAFDW=0
+ END IF
+ ELSE
+ NFD=NFD+1
+ NAFDWA(NFD)=IY
+ END IF
+ GO TO 400
+ END IF
+
+C
+C* 1.5 SIGNIFY CHARACTER ?
+C -------------------
+ 150 CONTINUE
+C
+ IF(IX.EQ.5) THEN
+C
+C* 1.5.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='CHARACTERS'
+ CWTU (NWT)=' '
+ NWTR (NWT)= KDD ! 0
+ NWTDW(NWT)= IY * 8
+ NWTEN(NWT)=658367
+ NWTS (NWT)=0
+ NWTRV(NWT)=0
+ M=M+1
+ GO TO 400
+ END IF
+C
+C* 1.5.2 SIGNIFY DATA WIDTH FOR IMMEDISTELY
+C FOLLOWED LOCAL DESCRIPTOR
+C
+ 152 CONTINUE
+C
+ IF(IX.EQ.6) THEN
+ NWT = NWT + 1
+ KJ=KJ+1
+ CWTEN(NWT)='UNKNOWN'
+ CWTU (NWT)='UNKNOWN'
+ NWTR (NWT)= KSTACK(KJ)
+ NWTDW(NWT)= IY
+ NWTS (NWT)= 0
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= NVIND
+ M=NWT
+C
+C CHECK IF LOCAL TABLE ENTRY KNOWN
+C --------------------------------
+C
+C DO 153 I=1,JTAB
+C IF(NWTR(NWT).EQ.NTABBTR(I)) THEN
+C CWTEN(NWT)=CTABBEN(I)
+C CWTU (NWT)=CTABBU (I)
+C IF(CWTU(NWT)(1:3).EQ.'CCI') NWTEN(NWT)=65367
+C NWTS (NWT)=NTABBS (I)
+C NWTRV(NWT)=NTABBRV(I)
+C NWTDW(NWT)=NTABBDW(I)
+C NWTEN(NWT)=NTABBTR(I)
+C GO TO 400
+C END IF
+C 153 CONTINUE
+C
+ GO TO 400
+ END IF
+C
+ IF(IX.EQ.7) THEN
+C
+C* 1.5.4 UPDATE SCALE MULTIPLIER.
+C ------------------------
+C
+ IF(IY.EQ.0) THEN
+ N07 =0
+ NSCAM07 =0
+ NDWINC07=0
+ ELSE
+ N07 =IY ! exponent
+ NSCAM07 =IY
+ NDWINC07=((10*IY)+2)/3 ! data width
+
+ END IF
+ GO TO 400
+ END IF
+
+ IF(IX.EQ.8) THEN
+C
+C* 1.5.5 SET DATA WIDTH FOR CCITTIA5
+C ---------------------------
+C
+ IF(IY.EQ.0) THEN
+ N08=0
+ ELSE
+ N08=IY ! number of chatacters
+ END IF
+ GO TO 400
+ END IF
+C
+C
+C* 1.6 QUALITY INFORMATION FOLLOWS.
+C ----------------------------
+ 160 CONTINUE
+C
+ IF(IX.EQ.62) THEN
+C
+ IF(IY.EQ.0) GO TO 400
+C
+C* 1.7.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='QUALITY INFORMATION FOLLOW'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 222000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ WRITE(KNTN,*) 'BUPRCO:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+C
+C
+C* 2. PROCESSING NEW OPERATORS.
+C -------------------------
+ 200 CONTINUE
+C
+C
+C* 2.1 DATA NOT PRESENT.
+C -----------------
+ 210 CONTINUE
+C
+ IF(IX.EQ.21) THEN
+ N221=IY
+ GO TO 400
+ END IF
+C
+C
+C* 2.2 QUALITY INFORMATION FOLLOWS.
+C ----------------------------
+ 220 CONTINUE
+C
+ IF(IX.EQ.22) THEN
+C
+C* 1.7.2 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='QUALITY INFORMATION FOLLOW'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 222000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ WRITE(KNTN,*) 'BUPRCO:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+C
+C
+C* 2.3 SUBSTITUTED VALUES FOLLOWS.
+C ---------------------------
+ 230 CONTINUE
+C
+ IF(IX.EQ.23) THEN
+ IF(IY.EQ.0) THEN
+ NWT=NWT+1
+ CWTEN(NWT)='SUBSTITUTED VALUES FOLLOW'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)=223000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ WRITE(KNTN,*) 'BUPRCO:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+ IF(NFD.NE.0) THEN
+ DO I=1,NFD
+ NWT=NWT+1
+ CWTEN(NWT)='ASSOCIATED FIELD'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 0
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ END DO
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ WRITE(KNTN,*) 'BUPRCO:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+ OMARKER=.TRUE.
+ NWT=NWT+1
+ CWTEN(NWT)='SUBSTITUTED VALUE MARKER'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)=KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ WRITE(KNTN,*) 'BUPRCO:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+C
+C* 2.4 FIRST ORDER STATISTICS FOLLOWS.
+C -------------------------------
+ 240 CONTINUE
+C
+ IF(IX.EQ.24) THEN
+ IF(IY.EQ.0) THEN
+ NWT=NWT+1
+ CWTEN(NWT)='FIRST ORDER STATISTICS FOLLOW'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)=224000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ WRITE(KNTN,*) 'BUPRCO:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+ IF(NFD.NE.0) THEN
+ DO I=1,NFD
+ NWT=NWT+1
+ CWTEN(NWT)='ASSOCIATED FIELD'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 0
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ END DO
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ WRITE(KNTN,*) 'BUPRCO:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+ OMARKER=.TRUE.
+ NWT=NWT+1
+ CWTEN(NWT)='FIRST ORDER STATISTICS VALUE MARKER'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)=KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ WRITE(KNTN,*) 'BUPRCO:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+C* 2.5 DIFFERENCE STATISTICAL VALUES FOLLOW.
+C -------------------------------------
+ 250 CONTINUE
+C
+ IF(IX.EQ.25) THEN
+ IF(IY.EQ.0) THEN
+ NWT=NWT+1
+ CWTEN(NWT)='DIFFERENCE STATISTICAL VALUES FOLLOW'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)=225000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ WRITE(KNTN,*) 'BUPRCO:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+ IF(NFD.NE.0) THEN
+ DO I=1,NFD
+ NWT=NWT+1
+ CWTEN(NWT)='ASSOCIATED FIELD'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 0
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ END DO
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ WRITE(KNTN,*) 'BUPRCO:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+ OMARKER=.TRUE.
+ NWT=NWT+1
+ CWTEN(NWT)='DIFFERENCE STATISTICS VALUE MARKER'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)=KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ WRITE(KNTN,*) 'BUPRCO:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+C
+C* 2.6 REPLACED/RETAINED VALUES FOLLOWS.
+C ---------------------------------
+ 260 CONTINUE
+C
+ IF(IX.EQ.32) THEN
+ IF(IY.EQ.0) THEN
+ NWT=NWT+1
+ CWTEN(NWT)='REPLACE/RETAINED VALUES FOLLOW'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)=232000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ WRITE(KNTN,*) 'BUPRCO:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+ IF(NFD.NE.0) THEN
+ DO I=1,NFD
+ NWT=NWT+1
+ CWTEN(NWT)='ASSOCIATED FIELD'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 0
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ END DO
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ WRITE(KNTN,*) 'BUPRCO:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+ OMARKER=.TRUE.
+ NWT=NWT+1
+ CWTEN(NWT)='REPLACE/RETAINED VALUE MARKER'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)=KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ M=M+1
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ WRITE(KNTN,*) 'BUPRCO:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+C* 2.7 CANCEL BACKWARD REFERENCE.
+C --------------------------
+ 270 CONTINUE
+C
+ IF(IX.EQ.35) THEN
+C
+C* 1.7.2 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='CANCEL BACKWARD DATA REFERENCE'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 235000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+C MREL=0
+ M=M+1
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ WRITE(KNTN,*) 'BUPRCO:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+C
+C* 2.8 DEFINE BACKWARD REFERENCE BIT MAP.
+C ----------------------------------
+ 280 CONTINUE
+C
+ IF(IX.EQ.36) THEN
+C
+C* 2.8.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='BACKWARD REFERENCE BIT MAP'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 236000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+C
+C* 2.9 DEFINE BACKWARD REFERENCE BIT MAP.
+C ----------------------------------
+ 290 CONTINUE
+C
+ IF(IX.EQ.37) THEN
+ IF(IY.EQ.0) THEN
+C
+C* 2.9.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='USE PREVIOUSLY DEFINED BIT MAP'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 237000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+C
+C* 2.9.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='CANCEL REFERENCE TO PREDEFINED BIT MAP'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+ IF(IX.EQ.9) THEN
+ IF(IY.EQ.0) THEN
+ N40=0
+ ELSE
+ N40=IY
+ END IF
+C
+ GO TO 400
+ END IF
+C
+
+C
+C* 5. DEFINE EVENT
+C ------------
+ 500 CONTINUE
+C
+ IF(IX.EQ.41) THEN
+ IF(IY.EQ.0) THEN
+C
+C 5.1.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='DEFINE EVENT'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 241000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+C
+C* 5.1.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='CANCEL DEFINE EVENT'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+C* 5.1 DEFINE CONDITIONING EVENT
+C -------------------------
+ 510 CONTINUE
+C
+ IF(IX.EQ.42) THEN
+ IF(IY.EQ.0) THEN
+C
+C 5.1.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='DEFINE CONDITIONING EVENT'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 242000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+C
+C* 5.1.2 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='CANCEL DEFINE CONDITIONING EVENT'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+C* 5.2 DEFINE CONDITIONING EVENT
+C -------------------------
+ 520 CONTINUE
+C
+ IF(IX.EQ.43) THEN
+ IF(IY.EQ.0) THEN
+C
+C 5.2.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='CATEGORICAL FORECAST VALUES FOLLOW'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= 243000
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ ELSE
+C
+C* 5.2.2 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ CWTEN(NWT)='CANCEL CATEGORICAL FORECAST VALUES FOLLOW'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= 0
+ NWTR (NWT)= KDD
+ NWTRV(NWT)= 0
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+C
+ M=M+1
+ IF(M.GT.JELEM) THEN
+ KERR=30
+ WRITE(KNTN,*) 'BUOPER:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 400
+ END IF
+ END IF
+C
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ KERR=22
+ WRITE(KNTN,*) 'BUPRCO:'
+ CALL BUERR(KERR)
+C
+C ------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ RETURN
+ END
diff --git a/bufrdc/buprq.F b/bufrdc/buprq.F
new file mode 100755
index 0000000..632f89d
--- /dev/null
+++ b/bufrdc/buprq.F
@@ -0,0 +1,89 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUPRQ(KPMISS,KPRUS,KOKEY)
+C
+C**** *BUPRQ*
+C
+C
+C PURPOSE.
+C --------
+C SETS VARIABLE KPMISS,KPRUS INTO COMMON BLOCK.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUPRQ(KPMISS,KPRUS,KOKEY)*
+C
+C INPUT :
+C *KPMISS* - INTEGER VARIABLE
+C 0 - DEFAULT, PAKS MAX VALUE FOR DATA WIDTH -1 BITS.
+C
+C 1 - PAKS VALUE AS MISSING VALUE
+C *KPRUS* - AN INTEGER
+C 0 - IF DATA DESCRIPTORS THE SAME REUSE POINTERS
+C 1 - ALWAYS RECALCULATE POINTERS
+C *KOKEY* - 0 - DEFAULT, PACKS ECMWF RDB KEY
+C 1 - PACKS SECTION 2 IF NEEDED BUT NOT LENGTH
+C OF BUFR MESSAGE IN KEY
+C
+C
+C METHOD.
+C -------
+C
+C DURING PACKING THE VALUE TO BE PACKED CAN HAPPEN TO BE TOO BIG
+C TO FIT INTO CORRESPONDING DATA WIDTH. THIS SUBROUTINE ALLOWS USER
+C TO CHOSE BETWEEN:
+C
+C 1) PACK BIG VALUE AS MAX VALUE REPRESENTED WITH DATA WIDTH -1
+C BITS (DEFAULT)
+C 2) PACK BIG VALUE AS MISSING VALUE
+C
+C EXTERNALS.
+C ----------
+C
+C NONE
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/01/95.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+# include "bcprq.F"
+C
+C ------------------------------------------------------------------
+C
+C* 1. SET CONSTANTS.
+C --------------
+ 100 CONTINUE
+C
+ IF(KPMISS.LT.0.OR.KPMISS.GT.1) KPMISS=0
+ IF(KPRUS .LT.0.OR.KPRUS.GT.1 ) KPRUS=0
+ IF(KOKEY .LT.0.OR.KOKEY.GT.1 ) NOKEY=0
+ NPMISS=KPMISS
+ NPRUS=KPRUS
+ NOKEY=KOKEY
+C
+ RETURN
+ END
diff --git a/bufrdc/buprs0.F b/bufrdc/buprs0.F
new file mode 100755
index 0000000..3981a80
--- /dev/null
+++ b/bufrdc/buprs0.F
@@ -0,0 +1,83 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUPRS0(KSEC0)
+C
+C**** *BUPRS0*
+C
+C
+C PURPOSE.
+C --------
+C PRINT SECTION 0 OF BUFR MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUPRS0(KSEC0)*
+C
+C INPUT :
+C *KSEC0* - ARRAY CONTAINING SECTION 0 INFORMATION
+C KSEC0( 1)-- LENGTH OF SECTION 0 (BYTES)
+C KSEC0( 2)-- TOTAL LENGTH OF BUFR MESSAGE (BYTES)
+C KSEC0( 3)-- BUFR EDITION NUMBER
+C
+C METHOD.
+C -------
+C
+C NONE
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 04/02/91.
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+C
+ DIMENSION KSEC0(JSEC0)
+C
+C ------------------------------------------------------------------
+C
+C* 1. PRINT SECTION 0.
+C ----------------
+ 100 CONTINUE
+C
+ WRITE(KNTN,'(1H1)')
+C
+ WRITE(KNTN,'(1H ,A)') ' BUFR SECTION 0 '
+ WRITE(KNTN,'(1H )')
+ WRITE(KNTN,'(1H ,A,I10)') 'LENGTH OF SECTION 0 (BYTES) ',
+ 1 KSEC0(1)
+ WRITE(KNTN,'(1H ,A,I10)') 'TOTAL LENGTH OF BUFR MESSAGE (BYTES)',
+ 1 KSEC0(2)
+ WRITE(KNTN,'(1H ,A,I10)') 'BUFR EDITION NUMBER ',
+ 1 KSEC0(3)
+C
+ RETURN
+ END
diff --git a/bufrdc/buprs1.F b/bufrdc/buprs1.F
new file mode 100755
index 0000000..ba79455
--- /dev/null
+++ b/bufrdc/buprs1.F
@@ -0,0 +1,182 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUPRS1(KSEC1)
+C
+C**** *BUPRS1*
+C
+C
+C PURPOSE.
+C --------
+C PRINT SECTION 1 OF BUFR MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUPRS1(KSEC1)*
+C
+C INPUT :
+C *KSEC1* - ARRAY CONTAINING SECTION 1 INFORMATION
+C KSEC1( 1)-- LENGTH OF SECTION 1 (BYTES)
+C KSEC1( 2)-- BUFR EDITION NUMBER
+C KSEC1( 3)-- ORIGINATING CENTRE
+C KSEC1( 4)-- UPDATE SEQUENCE NUMBER
+C KSEC1( 5)-- FLAG (PRESENCE OF SECTION 2)
+C KSEC1( 6)-- BUFR MESSAGE TYPE
+C KSEC1( 7)-- BUFR MESSAGE SUBTYPE
+C KSEC1( 8)-- VERSION NUMBER OF LOCAL TABLE USED
+C KSEC1( 9)-- YEAR
+C KSEC1(10)-- MONTH
+C KSEC1(11)-- DAY
+C KSEC1(12)-- HOUR
+C KSEC1(13)-- MINUTE
+C KSEC1(14)-- BUFR MASTER TABLE
+C KSEC1(15)-- VERSION NUMBER OF MASTER TABLE USED
+C KSEC1(16) - KSEC1(JSEC1) -- LOCAL ADP CENTRE
+C INFORMATION(BYTE BY BYTE)
+C
+C FOR BUFR EDITION >= 3
+C
+C KSEC1(16) - ORIGINATING SUB-CENTRE
+C KSEC1(18) - KSEC1(JSEC1) -- LOCAL ADP CENTRE
+C INFORMATION(BYTE BY BYTE)
+C
+C
+C FOR BUFR EDITION 4 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- INTERNATIONAL SUB-CATEGORY (SEE COMMON TABLE C-13
+C KSEC1(18)-- SECOND
+C KSEC1(19)-- YEAR
+C KSEC1(20)-- MONTH
+C KSEC1(21)-- DAY
+C KSEC1(22)-- HOUR
+C KSEC1(23)-- MINUTE
+C KSEC1(24)-- SECOND
+C KSEC1(25)-- YEAR
+C KSEC1(26)-- MONTH
+C KSEC1(27)-- DAY
+C KSEC1(28)-- HOUR
+C KSEC1(29)-- MINUTE
+C KSEC1(30)-- SECOND
+C KSEC1(31)-- MOST SOUTHERN LATITUDE (-90 to 90)
+C KSEC1(32)-- MOST WESTERN LONGITUDE ( 0-360)
+C KSEC1(33)-- MOST NORTHEN LATITUDE (-90 to 90)
+C KSEC1(34)-- MOST EASTERN LONGITUDE ( 0-360)
+C KSEC1(35) TO KSEC1(JSEC1) - LOCAL ADP CENTRE INFORMATION(PACKED FORM)
+
+C
+C METHOD.
+C -------
+C
+C NONE
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 04/02/91.
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+C
+ DIMENSION KSEC1(JSEC1)
+C
+C ------------------------------------------------------------------
+C
+C* 1. PRINT SECTION 1.
+C ----------------
+ 100 CONTINUE
+C
+ WRITE(KNTN,'(1H1)')
+C
+ IF(KSEC1( 2).LE.3) THEN
+ WRITE(KNTN,'(1H ,A)') ' BUFR SECTION 1 '
+ WRITE(KNTN,'(1H )')
+ WRITE(KNTN,'(1H ,A,I5)')'LENGTH OF SECTION 1 (BYTES) ',KSEC1( 1)
+ WRITE(KNTN,'(1H ,A,I5)')'BUFR EDITION NUMBER ',KSEC1( 2)
+ IF(KSEC1(2).GE.3) THEN
+ WRITE(KNTN,'(1H ,A,I5)')'ORIGINATING SUB-CENTRE ',KSEC1(16)
+ END IF
+ WRITE(KNTN,'(1H ,A,I5)')'ORIGINATING CENTRE ',KSEC1( 3)
+ WRITE(KNTN,'(1H ,A,I5)')'UPDATE SEQUENCE NUMBER ',KSEC1( 4)
+ WRITE(KNTN,'(1H ,A,I5)')'FLAG (PRESENCE OF SECTION 2) ',KSEC1( 5)
+ WRITE(KNTN,'(1H ,A,I5)')'BUFR MESSAGE TYPE ',KSEC1( 6)
+ WRITE(KNTN,'(1H ,A,I5)')'BUFR MESSAGE SUBTYPE ',KSEC1( 7)
+ WRITE(KNTN,'(1H ,A,I5)')'VERSION NUMBER OF LOCAL TABLE ',KSEC1( 8)
+ WRITE(KNTN,'(1H ,A,I5)')'YEAR ',KSEC1( 9)
+ WRITE(KNTN,'(1H ,A,I5)')'MONTH ',KSEC1(10)
+ WRITE(KNTN,'(1H ,A,I5)')'DAY ',KSEC1(11)
+ WRITE(KNTN,'(1H ,A,I5)')'HOUR ',KSEC1(12)
+ WRITE(KNTN,'(1H ,A,I5)')'MINUTE ',KSEC1(13)
+ WRITE(KNTN,'(1H ,A,I5)')'VERSION NUMBER OF MASTER TABLE',KSEC1(15)
+ WRITE(KNTN,'(1H ,A,I5)')'BUFR MASTER TABLE ',KSEC1(14)
+
+ ELSEIF(KSEC1( 2).EQ.4) THEN
+
+ WRITE(KNTN,'(1H ,A)') ' BUFR SECTION 1 '
+ WRITE(KNTN,'(1H )')
+ WRITE(KNTN,'(1H ,A,I9)')'LENGTH OF SECTION 1 (BYTES) ',KSEC1( 1)
+ WRITE(KNTN,'(1H ,A,I9)')'BUFR MASTER TABLE ',KSEC1(14)
+ WRITE(KNTN,'(1H ,A,I9)')'ORIGINATING CENTRE ',KSEC1( 3)
+ WRITE(KNTN,'(1H ,A,I9)')'ORIGINATING SUB-CENTRE ',KSEC1(16)
+ WRITE(KNTN,'(1H ,A,I9)')'UPDATE SEQUENCE NUMBER ',KSEC1( 4)
+ WRITE(KNTN,'(1H ,A,I9)')'FLAG (PRESENCE OF SECTION 2) ',KSEC1( 5)
+ WRITE(KNTN,'(1H ,A,I9)')'DATA CATEGORY ',KSEC1( 6)
+ WRITE(KNTN,'(1H ,A,I9)')'DATA SUB-CATEGORY ',KSEC1(17)
+ WRITE(KNTN,'(1H ,A,I9)')'LOCAL DATA SUB-CATEGORY ',KSEC1( 7)
+ WRITE(KNTN,'(1H ,A,I9)')'VERSION NUMBER OF MASTER TABLE',KSEC1(15)
+ WRITE(KNTN,'(1H ,A,I9)')'VERSION NUMBER OF LOCAL TABLE ',KSEC1( 8)
+ WRITE(KNTN,'(1H ,A,I9)')'YEAR ',KSEC1( 9)
+ WRITE(KNTN,'(1H ,A,I9)')'MONTH ',KSEC1(10)
+ WRITE(KNTN,'(1H ,A,I9)')'DAY ',KSEC1(11)
+ WRITE(KNTN,'(1H ,A,I9)')'HOUR ',KSEC1(12)
+ WRITE(KNTN,'(1H ,A,I9)')'MINUTE ',KSEC1(13)
+ WRITE(KNTN,'(1H ,A,I9)')'SECOND ',KSEC1(18)
+c WRITE(KNTN,'(1H ,A,I9)')'YEAR (EARLIEST TIME) ',KSEC1(19)
+c WRITE(KNTN,'(1H ,A,I9)')'MONTH (EARLIEST TIME) ',KSEC1(20)
+c WRITE(KNTN,'(1H ,A,I9)')'DAY (EARLIEST TIME) ',KSEC1(21)
+c WRITE(KNTN,'(1H ,A,I9)')'HOUR (EARLIEST TIME) ',KSEC1(22)
+c WRITE(KNTN,'(1H ,A,I9)')'MINUTE (EARLIEST TIME) ',KSEC1(23)
+c WRITE(KNTN,'(1H ,A,I9)')'SECOND (EARLIEST TIME) ',KSEC1(28)
+c WRITE(KNTN,'(1H ,A,I9)')'YEAR (LATEST TIME) ',KSEC1(25)
+c WRITE(KNTN,'(1H ,A,I9)')'MONTH (LATEST TIME) ',KSEC1(26)
+c WRITE(KNTN,'(1H ,A,I9)')'DAY (LATEST TIME) ',KSEC1(27)
+c WRITE(KNTN,'(1H ,A,I9)')'HOUR (LATEST TIME) ',KSEC1(28)
+c WRITE(KNTN,'(1H ,A,I9)')'MINUTE (LATEST TIME) ',KSEC1(29)
+c WRITE(KNTN,'(1H ,A,I9)')'SECOND (LATEST TIME) ',KSEC1(30)
+c WRITE(KNTN,'(1H ,A,I9)')'MOST SOUTHERN LATITUDE ',KSEC1(31)
+c WRITE(KNTN,'(1H ,A,I9)')'MOST WESTERN LONGITUDE ',KSEC1(32)
+c WRITE(KNTN,'(1H ,A,I9)')'MOST NORTHERN LATITUDE ',KSEC1(33)
+c WRITE(KNTN,'(1H ,A,I9)')'MOST EASTERN LONGITUDE ',KSEC1(34)
+
+ END IF
+
+C
+ RETURN
+ END
diff --git a/bufrdc/buprs2.F b/bufrdc/buprs2.F
new file mode 100755
index 0000000..2f13b8c
--- /dev/null
+++ b/bufrdc/buprs2.F
@@ -0,0 +1,256 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUPRS2(KSUP,KEY)
+C
+C**** *BUPRS2*
+C
+C
+C PURPOSE.
+C --------
+C PRINT SECTION 2 OF BUFR MESSAGE (EXPANDED RDB KEY).
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUPRS2(KSUP,KEY)*
+C
+C INPUT :
+C *KSUP* - ARRAY CONTAINING SUPLEMENTARY INFORMATION
+C - KSUP( 1) -- IDIM1, DIMENSION OF KSEC1
+C - KSUP( 2) -- IDIM2, DIMENSION OF KSEC2
+C - KSUP( 3) -- IDIM3, DIMENSION OF KSEC3
+C - KSUP( 4) -- IDIM4, DIMENSION OF KSEC4
+C - KSUP( 5) -- M (NUMBER OF ELEMENTS IN VALUES ARRAY,
+C FIRST INDEX)
+C - KSUP( 6) -- N (NUMBER OF SUBSETS,SECOND INDEX OF
+C VALUES ARRAY)
+C - KSUP( 7) -- JVC (NUMBER OF ELEMENTS IN CVAL ARRAY)
+C - KSUP( 8) -- TOTAL BUFR MESSAGE LENGTH IN BYTES
+C - KSUP( 9) -- IDIM0, DIMENSION OF KSEC0
+C *KEY* - ARRAY CONTAINING SECTION 2 INFORMATION
+C KEY( 1)-- LENGTH OF SECTION 2 (BYTES)
+C KEY( 2)-- RDB TYPE
+C KEY( 3)-- RDB SUBTYPE
+C KEY( 4)-- YEAR
+C KEY( 5)-- MONTH
+C KEY( 6)-- DAY
+C KEY( 7)-- HOUR
+C KEY( 8)-- MINUTE
+C KEY( 9)-- SECOND
+C KEY(10)-- LONGITUDE1
+C KEY(11)-- LATITUDE1
+C KEY(12)-- LONGITUDE2
+C KEY(13)-- LATITUDE2
+C KEY(14)-- NUMBER OF SUBSETS
+C KEY(15)-- IDENT (NUMERIC)
+C KEY(16)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(17)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(18)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(19)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(20)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(21)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(22)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(23)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(24)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(25)-- TOTAL BUFR MESSAGE LENGTH
+C KEY(26)-- DAY (RDB INSERTION)
+C KEY(27)-- HOUR (RDB INSERTION)
+C KEY(28)-- MINUTE (RDB INSERTION)
+C KEY(29)-- SECOND (RDB INSERTION)
+C KEY(30)-- DAY (MDB INSERTION)
+C KEY(31)-- HOUR (MDB INSERTION)
+C KEY(32)-- MINUTE (MDB INSERTION)
+C KEY(33)-- SECOND (MDB INSERTION)
+C KEY(34)-- CORRECTION NUMBER
+C KEY(35)-- PART
+C KEY(36)-- 0
+C KEY(37)-- CORRECTION NUMBER
+C KEY(38)-- PART
+C KEY(39)-- 0
+C KEY(40)-- CORRECTION NUMBER
+C KEY(41)-- PART
+C KEY(42)-- 0
+C KEY(43)-- CORRECTION NUMBER
+C KEY(44)-- PART
+C KEY(45)-- 0
+C KEY(46)-- THE LOWEST Q/C % CONFIDENCE
+C
+C
+C
+C
+C METHOD.
+C -------
+C
+C NONE
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 04/02/91.
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+C
+ DIMENSION KSUP(JSUP),KEY(JKEY)
+C
+#ifndef R_4
+ REAL*8 RLAT1
+ REAL*8 RLON1
+ REAL*8 RLAT2
+ REAL*8 RLON2
+#else
+ REAL RLAT1
+ REAL RLON1
+ REAL RLAT2
+ REAL RLON2
+#endif
+C
+ CHARACTER*9 CIDENT
+ CHARACTER*13 YFM
+C
+C ------------------------------------------------------------------
+C
+C* 1. PRINT SECTION 2.
+C ----------------
+ 100 CONTINUE
+C
+ YFM='(1H ,A,TR0,A)'
+C
+ IF(KSUP(2).LE.1) THEN
+ WRITE(KNTN,*) 'PRTKEY : RDB KEY NOT DEFINED IN SECTION 2.'
+ RETURN
+ END IF
+C
+ WRITE(KNTN,'(1H1)')
+C
+ WRITE(KNTN,'(1H ,A)') ' BUFR SECTION 2 '
+ WRITE(KNTN,'(1H )')
+ WRITE(KNTN,'(1H ,A,I9)') 'LENGTH OF SECTION 2 ', KEY(1)
+ WRITE(KNTN,'(1H )')
+ WRITE(KNTN,'(1H ,A)') ' REPORT DATA BASE KEY '
+ WRITE(KNTN,'(1H )')
+C
+ IKTYPE=0
+ IF(KEY(2).EQ.2) IKTYPE=2
+ IF(KEY(2).EQ.3) IKTYPE=2
+ IF(KEY(2).EQ.12)IKTYPE=2
+ IF(KEY(2).EQ.08)IKTYPE=2
+ IF(IKTYPE.EQ.0.AND.KSUP(6).GT.1) IKTYPE=2
+C
+ IF(IKTYPE.EQ.2) THEN
+C IF(KEY(2).EQ.2.OR.KEY(2).EQ.3.OR.KEY(2).EQ.12) THEN
+C
+ WRITE(KNTN,'(1H ,A,I9)') 'RDB DATA TYPE ', KEY(2)
+ WRITE(KNTN,'(1H ,A,I9)') 'RDB DATA SUBTYPE ', KEY(3)
+ WRITE(KNTN,'(1H ,A,I9)') 'YEAR ', KEY(4)
+ WRITE(KNTN,'(1H ,A,I9)') 'MONTH ', KEY(5)
+ WRITE(KNTN,'(1H ,A,I9)') 'DAY ', KEY(6)
+ WRITE(KNTN,'(1H ,A,I9)') 'HOUR ', KEY(7)
+ WRITE(KNTN,'(1H ,A,I9)') 'MINUTE ', KEY(8)
+ WRITE(KNTN,'(1H ,A,I9)') 'SECOND ', KEY(9)
+ RLAT1=(KEY(11)-9000000)/100000.
+ RLON1=(KEY(10)-18000000)/100000.
+ WRITE(KNTN,'(1H ,A,F9.2)')'LATITUDE 1 ', RLAT1
+ WRITE(KNTN,'(1H ,A,F9.2)')'LONGITUDE 1 ', RLON1
+ RLAT2=(KEY(13)-9000000)/100000.
+ RLON2=(KEY(12)-18000000)/100000.
+ WRITE(KNTN,'(1H ,A,F9.2)')'LATITUDE 2 ', RLAT2
+ WRITE(KNTN,'(1H ,A,F9.2)')'LONGITUDE 2 ', RLON2
+ WRITE(KNTN,'(1H ,A,I9)') 'NUMBER OF OBSERVATIONS ', KEY(14)
+ WRITE(KNTN,'(1H ,A,I9)') 'IDENTIFIER ', KEY(15)
+ WRITE(KNTN,'(1H ,A,I9)') 'TOTAL BUFR MESSAGE LENGTH ', KEY(25)
+ WRITE(KNTN,'(1H ,A,I9)') 'DAY (RDB INSERTION) ', KEY(26)
+ WRITE(KNTN,'(1H ,A,I9)') 'HOUR (RDB INSERTION) ', KEY(27)
+ WRITE(KNTN,'(1H ,A,I9)') 'MINUTE( (RDB INSERTION) ', KEY(28)
+ WRITE(KNTN,'(1H ,A,I9)') 'SECOND (RDB INSERTION) ', KEY(29)
+ WRITE(KNTN,'(1H ,A,I9)') 'DAY (MDB ARRIVAL) ', KEY(30)
+ WRITE(KNTN,'(1H ,A,I9)') 'HOUR (MDB ARRIVAL) ', KEY(31)
+ WRITE(KNTN,'(1H ,A,I9)') 'MINUTE (MDB ARRIVAL) ', KEY(32)
+ WRITE(KNTN,'(1H ,A,I9)') 'SECOND (MDB ARRIVAL ', KEY(33)
+ WRITE(KNTN,'(1H ,A,I9)') 'CORRECTION NUMBER ', KEY(34)
+ WRITE(KNTN,'(1H ,A,I9)') 'PART OF MESSAGE ', KEY(35)
+ WRITE(KNTN,'(1H ,A,I9)') 'CORRECTION NUMBER ', KEY(37)
+ WRITE(KNTN,'(1H ,A,I9)') 'PART OF MESSAGE ', KEY(38)
+ WRITE(KNTN,'(1H ,A,I9)') 'CORRECTION NUMBER ', KEY(40)
+ WRITE(KNTN,'(1H ,A,I9)') 'PART OF MESSAGE ', KEY(41)
+ WRITE(KNTN,'(1H ,A,I9)') 'CORRECTION NUMBER ', KEY(43)
+ WRITE(KNTN,'(1H ,A,I9)') 'PART OF MESSAGE ', KEY(44)
+ WRITE(KNTN,'(1H ,A,I9)') 'QUALITY CONTROL % CONF ', KEY(46)
+ ELSE
+ WRITE(KNTN,'(1H ,A,I9)') 'RDB DATA TYPE ', KEY(2)
+ WRITE(KNTN,'(1H ,A,I9)') 'RDB DATA SUBTYPE ', KEY(3)
+ WRITE(KNTN,'(1H ,A,I9)') 'YEAR ', KEY(4)
+ WRITE(KNTN,'(1H ,A,I9)') 'MONTH ', KEY(5)
+ WRITE(KNTN,'(1H ,A,I9)') 'DAY ', KEY(6)
+ WRITE(KNTN,'(1H ,A,I9)') 'HOUR ', KEY(7)
+ WRITE(KNTN,'(1H ,A,I9)') 'MINUTE ', KEY(8)
+ WRITE(KNTN,'(1H ,A,I9)') 'SECOND ', KEY(9)
+ RLAT1=(KEY(11)-9000000)/100000.
+ RLON1=(KEY(10)-18000000)/100000.
+ WRITE(KNTN,'(1H ,A,F9.2)')'LATITUDE 1 ', RLAT1
+ WRITE(KNTN,'(1H ,A,F9.2)')'LONGITUDE 1 ', RLON1
+ IDD=0
+ CIDENT=' '
+ DO 201 ID=16,24
+ IDD=IDD+1
+ CIDENT(IDD:IDD)=CHAR(KEY(ID))
+ 201 CONTINUE
+ IDD=INDEX(CIDENT,' ')
+ IF(IDD.EQ.0) THEN
+ YFM='(1H ,A,TR1,A)'
+ GO TO 203
+ END IF
+ IDD=10-IDD
+ WRITE(YFM(10:10),'(I1)',ERR=202) IDD
+ GO TO 203
+ 202 YFM(10:10)='9'
+ 203 WRITE(KNTN,FMT=YFM) 'IDENTIFER ', CIDENT
+ WRITE(KNTN,'(1H ,A,I9)') 'TOTAL BUFR MESSAGE LENGTH ', KEY(25)
+ WRITE(KNTN,'(1H ,A,I9)') 'DAY (RDB INSERTION) ', KEY(26)
+ WRITE(KNTN,'(1H ,A,I9)') 'HOUR (RDB INSERTION) ', KEY(27)
+ WRITE(KNTN,'(1H ,A,I9)') 'MINUTE (RDB INSERTION) ', KEY(28)
+ WRITE(KNTN,'(1H ,A,I9)') 'SECOND (RDB INSERTION) ', KEY(29)
+ WRITE(KNTN,'(1H ,A,I9)') 'DAY (MDB ARRIVAL) ', KEY(30)
+ WRITE(KNTN,'(1H ,A,I9)') 'HOUR (MDB ARRIVAL) ', KEY(31)
+ WRITE(KNTN,'(1H ,A,I9)') 'MINUTE (MDB ARRIVAL) ', KEY(32)
+ WRITE(KNTN,'(1H ,A,I9)') 'SECOND (MDB ARRIVAL ', KEY(33)
+ WRITE(KNTN,'(1H ,A,I9)') 'CORRECTION NUMBER ', KEY(34)
+ WRITE(KNTN,'(1H ,A,I9)') 'PART OF MESSAGE ', KEY(35)
+ WRITE(KNTN,'(1H ,A,I9)') 'CORRECTION NUMBER ', KEY(37)
+ WRITE(KNTN,'(1H ,A,I9)') 'PART OF MESSAGE ', KEY(38)
+ WRITE(KNTN,'(1H ,A,I9)') 'CORRECTION NUMBER ', KEY(40)
+ WRITE(KNTN,'(1H ,A,I9)') 'PART OF MESSAGE ', KEY(41)
+ WRITE(KNTN,'(1H ,A,I9)') 'CORRECTION NUMBER ', KEY(43)
+ WRITE(KNTN,'(1H ,A,I9)') 'PART OF MESSAGE ', KEY(44)
+ WRITE(KNTN,'(1H ,A,I9)') 'QUALITY CONTROL % CONF ', KEY(46)
+ END IF
+C
+ RETURN
+ END
diff --git a/bufrdc/buprs3.F b/bufrdc/buprs3.F
new file mode 100755
index 0000000..86a5bcb
--- /dev/null
+++ b/bufrdc/buprs3.F
@@ -0,0 +1,114 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUPRS3(KSEC3,KTDLEN,KTDLST,KTDEXL,KTDEXP,KELEM,CNAMES)
+C
+C**** *BUPRS3*
+C
+C
+C PURPOSE.
+C --------
+C PRINT SECTION 3 OF BUFR MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUPRS3(KSEC3,KTDLEN,KTDLST,KTDEXL,KTDEXP,
+C KELEM,CNAMES)*
+C
+C INPUT :
+C *KSEC3* - ARRAY CONTAINING SECTION 3 INFORMATION
+C KSEC3( 1)-- LENGTH OF SECTION 3 (BYTES)
+C KSEC3( 2)-- RESERVED
+C KSEC3( 3)-- NUMBER OF SUBSETS
+C KSEC3( 4)-- FLAG (DATA TYPE,DATA COMPRESSION)
+C *KTDLEN* - NUMBER OF DATA DESCRIPTORS IN SECTION 3
+C *KTDLST* - ARRAY CONTAINING DATA DESCRIPTORS IN SECTION 3
+C *KTDEXL* - NUMBER OF ENTRIES IN LIST OF EXPANDED DATA
+C DESCRIPTORS
+C *KTDEXP* - ARRAY CONTAINIG EXPANDED DATA DESCRIPTORS
+C *KELEM* - DIMENSION OF CNAMES, CUNITS ARRAY
+C *CNAMES* - CHARACTER ARRAY CONTAINING ELEMENT NAMES
+C
+C
+C METHOD.
+C -------
+C
+C NONE
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 04/02/91.
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+C
+C
+ DIMENSION KSEC3(JSEC3)
+ DIMENSION KTDLST(KTDLEN),KTDEXP(KTDEXL)
+C
+ CHARACTER*64 CNAMES(KELEM)
+C
+C ------------------------------------------------------------------
+C
+C* 1. PRINT SECTION 3.
+C ----------------
+ 100 CONTINUE
+C
+ WRITE(KNTN,'(1H1)')
+C
+ WRITE(KNTN,'(1H ,A)') ' BUFR SECTION 3 '
+ WRITE(KNTN,'(1H )')
+ WRITE(KNTN,'(1H ,A,I5)') 'LENGTH OF SECTION 3 (BYTES) ',
+ 1 KSEC3(1)
+ WRITE(KNTN,'(1H ,A,I5)') 'RESERVED ',
+ 1 KSEC3(2)
+ WRITE(KNTN,'(1H ,A,I5)') 'NUMBER OF DATA SUBSETS ',
+ 1 KSEC3(3)
+ WRITE(KNTN,'(1H ,A,I5)') 'FLAG (DATA TYPE/DATA COMPRESSION) ',
+ 1 KSEC3(4)
+C
+ WRITE(KNTN,'(1H ,//)')
+ WRITE(KNTN,'(1H ,A)') ' DATA DESCRIPTORS (UNEXPANDED)'
+C
+ WRITE(KNTN,'(1H )')
+ DO 110 I=1,KTDLEN
+ WRITE(KNTN,'(1H ,I4,2X,I6.6)') I,KTDLST(I)
+ 110 CONTINUE
+C
+ WRITE(KNTN,'(1H ,/)')
+ WRITE(KNTN,'(1H ,A)') ' DATA DESCRIPTORS (EXPANDED)'
+ WRITE(KNTN,'(1H )')
+ DO 120 I=1,KTDEXL
+ WRITE(KNTN,'(1H ,I5,2X,I6.6,2X,A)') I,KTDEXP(I),CNAMES(I)
+ 120 CONTINUE
+
+ RETURN
+ END
diff --git a/bufrdc/buprt.F b/bufrdc/buprt.F
new file mode 100755
index 0000000..8e48d15
--- /dev/null
+++ b/bufrdc/buprt.F
@@ -0,0 +1,375 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUPRT(K,KSUB1,KSUB2,KELEM,CNAMES,CUNITS,
+ 1 CVALS,KVALS,VALUES,KSUP,KSEC1,KERR)
+C
+C**** *BUPRT*
+C
+C
+C PURPOSE.
+C --------
+C PRINT EXPANDED BUFR MESSAG.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUPRT(K,KSUB1,KSUB2,KELEM,CNAMES,CUNITS,
+C CVALS,KVALS,VALUES,KSUP,KSEC1,KERR)*
+C
+C INPUT :
+C *K* - SWITCH TO PRINT WITH/WITOUT CONTENT OF CODE TABLES
+C 0 - NO CODE TABLE CONTENT
+C 1 - YES CODE TABLE CONTENT
+C *KSUB1* - STARTING SUBSET
+C *KSUB2* - ENDING SUBSET
+C *KELEM* - DIMENSION OF CNAMES, CUNITS ARRAY
+C *CNAMES* - CHARACTER ARRAY CONTAINING ELEMENT NAMES
+C *CUNITS* - CHARACTER ARRAY CONTAINIG UNITS
+C *CVALS* - CHARACTER ARRAY CONTAINING BUFR CODE TABLE
+C ENTRIES
+C *KVALS* - DIMENSION OF VALUES ARRAY
+C *VALUES* - REAL ARRAY (EXPANDED DATA VALUES)
+C *KSUP* - ARRAY CONTAINING SUPLEMENTARY INFORMATION
+C - KSUP( 1) -- IDIM1, DIMENSION OF KSEC1
+C - KSUP( 2) -- IDIM2, DIMENSION OF KSEC2
+C - KSUP( 3) -- IDIM3, DIMENSION OF KSEC3
+C - KSUP( 4) -- IDIM4, DIMENSION OF KSEC4
+C - KSUP( 5) -- M (NUMBER OF ELEMENTS IN VALUES ARRAY,
+C FIRST INDEX)
+C - KSUP( 6) -- N (NUMBER OF SUBSETS,SECOND INDEX OF
+C VALUES ARRAY)
+C - KSUP( 7) -- JVC (NUMBER OF ELEMENTS IN CVAL ARRAY)
+C - KSUP( 8) -- TOTAL BUFR MESSAGE LENGTH IN BYTES
+C - KSUP( 9) -- IDIM0, DIMENSION OF KSEC0
+C *KSEC1* - ARRAY CONTAINING SECTION 1 INFORMATION
+C KSEC1( 1)-- LENGTH OF SECTION 1 (BYTES)
+C KSEC1( 2)-- BUFR EDITION NUMBER
+C KSEC1( 3)-- ORIGINATING CENTRE
+C KSEC1( 4)-- UPDATE SEQUENCE NUMBER
+C KSEC1( 5)-- FLAG (PRESENCE OF SECTION 2)
+C KSEC1( 6)-- BUFR MESSAGE TYPE
+C KSEC1( 7)-- BUFR MESSAGE SUBTYPE
+C KSEC1( 8)-- VERSION NUMBER OF LOCAL TABLE USED
+C KSEC1( 9)-- YEAR
+C KSEC1(10)-- MONTH
+C KSEC1(11)-- DAY
+C KSEC1(12)-- HOUR
+C KSEC1(13)-- MINUTE
+C KSEC1(14)-- BUFR MASTER TABLE
+C KSEC1(15)-- VERSION NUMBER OF MASTER TABLE USED
+C KSEC1(16) - KSEC1(JSEC1) -- LOCAL ADP CENTRE
+C INFORMATION(BYTE BY BYTE)
+C
+C FOR BUFR EDITION 3 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- NOT USED
+C KSEC1(18) TO KSEC1(JSEC1) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 4 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- INTERNATIONAL SUB-CATEGORY (SEE COMMON TABLE C-13
+C KSEC1(18)-- SECOND
+C KSEC1(19)-- YEAR
+C KSEC1(20)-- MONTH
+C KSEC1(21)-- DAY
+C KSEC1(22)-- HOUR
+C KSEC1(23)-- MINUTE
+C KSEC1(24)-- SECOND
+C KSEC1(25)-- YEAR
+C KSEC1(26)-- MONTH
+C KSEC1(27)-- DAY
+C KSEC1(28)-- HOUR
+C KSEC1(29)-- MINUTE
+C KSEC1(30)-- SECOND
+C KSEC1(31)-- MOST SOUTHERN LATITUDE (-90 to 90)
+C KSEC1(32)-- MOST WESTERN LONGITUDE ( 0-360)
+C KSEC1(33)-- MOST NORTHEN LATITUDE (-90 to 90)
+C KSEC1(34)-- MOST EASTERN LONGITUDE ( 0-360)
+C KSEC1(35) TO KSEC1(JSEC1) - LOCAL ADP CENTRE INFORMATION(PACKED FORM)
+C
+C OUTPUT:
+C *KERR* - RETURNED ERROR CODE
+C
+C
+C
+C
+C METHOD.
+C -------
+C
+C NONE
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 04/02/91.
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+# include "bcomroot.F"
+C
+ DIMENSION KTDLST(JELEM)
+ DIMENSION KTDEXP(JELEM)
+C
+ CHARACTER*256 YCODE
+ CHARACTER*64 YFLAG(32)
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+ CHARACTER*80 CVALS(KVALS)
+ CHARACTER YCHAR*30,YLONG*320
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+ REAL*8 VALUES(KVALS)
+#else
+ REAL RVIND
+ REAL EPS
+ REAL VALUES(KVALS)
+#endif
+C
+ DIMENSION KSUP(JSUP),KSEC1(JSEC1)
+C
+C
+C ------------------------------------------------------------------
+C
+C* 1. PRINT BUFR MESSAGE.
+C -------------------
+ 100 CONTINUE
+C
+ KERR=0
+ YCODE=' '
+C
+ ISUB1=KSUB1
+ ISUB2=KSUB2
+ IF(ISUB1.LE.0.OR.ISUB2.LE.0) THEN
+ WRITE(KNTN,'(A)') ' WARNING - NEGATIVE KSUB1 OR KSUB2.'
+ WRITE(KNTN,'(A,I5)') ' WARNING - NUMBER OF SUBSETS IS ',KSUP(6)
+ RETURN
+ END IF
+ IF(ISUB1.GT.KSUP(6)) THEN
+ WRITE(KNTN,'(A,I5)') ' WARNING - NUMBER OF SUBSETS IS ',KSUP(6)
+ RETURN
+ END IF
+ IF(ISUB2.GT.KSUP(6)) THEN
+ ISUB2=KSUP(6)
+ WRITE(KNTN,'(A,I5)') ' WARNING - KSUB2 REPLACED BY ',KSUP(6)
+ END IF
+C
+ IF(.NOT. OCTABLE) K=0
+C
+ IF(K.EQ.0) THEN
+C
+ DO 103 JB=ISUB1,ISUB2
+ CALL BUSEL2(JB,KELEM,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+ 1 CUNITS,KERR)
+C
+ ILN=0
+ WRITE(KNTN,'(1H )')
+C
+ DO 104 JA=1,KTDEXL
+C
+ ILN=ILN+1
+ JAJB=JA+(JB-1)*KELEM
+C
+ IF(ABS(VALUES(JAJB)-RVIND)/RVIND.LT.EPS) THEN
+ WRITE(KNTN,9918) ILN,CNAMES(JA),CUNITS(JA)
+ ELSE
+ IF(CUNITS(JA)(1:4).EQ.'CCIT') THEN
+ I=NINT(VALUES(JAJB)/1000)
+ NCHAR=VALUES(JAJB)-I*1000
+ NW=NCHAR/80
+ NWOFF=NCHAR-NW*80
+ IF(NWOFF.NE.0) NW=NW+1
+C
+ YLONG=' '
+ YLONG(1:80)=CVALS(I)
+C
+ II=I
+ DO 125 JC=1,NW-1
+ II=II+1
+ KF=JC*80+1
+ KL=(JC+1)*80
+ YLONG(KF:KL)=CVALS(II)
+ 125 CONTINUE
+C
+ NLINE=NCHAR/30
+ IDIF =NCHAR-NLINE*30
+ IF(IDIF.NE.0) NLINE=NLINE+1
+ YCHAR=' '
+ YCHAR=YLONG(1:30)
+C
+ WRITE(KNTN,9919)ILN,CNAMES(JA),VALUES(JAJB),
+ 1 CUNITS(JA),YCHAR
+C
+ IF(NLINE.GT.1) THEN
+ DO 130 JJ=1,NLINE-1
+C
+ K2=JJ*30+1
+ K1=(JJ+1)*30
+ YCHAR=' '
+ YCHAR=YLONG(K2:K1)
+C
+ WRITE(KNTN,9920) YCHAR
+ 130 CONTINUE
+C
+ END IF
+ ELSE
+ WRITE(KNTN,9917) ILN,CNAMES(JA),VALUES(JAJB),
+ 1 CUNITS(JA)
+ END IF
+ END IF
+C
+ 104 CONTINUE
+ 103 CONTINUE
+C
+ END IF
+C
+ IF(K.EQ.1) THEN
+C
+C---------------------------------------------------------------------
+ WRITE(KNTN,'(1H1)')
+C
+C---------------------------------------------------------------------
+C
+ DO 150 JB=ISUB1,ISUB2
+ CALL BUSEL2(JB,KELEM,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+ 1 CUNITS,KERR)
+C
+ ILN=0
+ WRITE(KNTN,'(1H )')
+
+C
+ DO 160 JA=1,KTDEXL
+C
+ ILN=ILN+1
+C
+ JAJB=JA+(JB-1)*KELEM
+C
+ IF(ABS(VALUES(JAJB)-RVIND)/RVIND.LT.EPS) THEN
+ WRITE(KNTN,9918) ILN,CNAMES(JA),CUNITS(JA)
+ ELSE
+ IF(CUNITS(JA)(1:4).EQ.'CCIT') THEN
+ I=NINT(VALUES(JAJB)/1000)
+ NCHAR=VALUES(JAJB)-I*1000
+ NW=NCHAR/80
+ NWOFF=NCHAR-NW*80
+ IF(NWOFF.NE.0) NW=NW+1
+C
+ YLONG=' '
+ YLONG(1:80)=CVALS(I)
+C
+ II=I
+ DO 1125 JC=1,NW-1
+ II=II+1
+ KF=JC*80+1
+ KL=(JC+1)*80
+ YLONG(KF:KL)=CVALS(II)
+1125 CONTINUE
+C
+ NLINE=NCHAR/30
+ IDIF =NCHAR-NLINE*30
+ IF(IDIF.NE.0) NLINE=NLINE+1
+ YCHAR=' '
+ YCHAR=YLONG(1:30)
+C
+ WRITE(KNTN,9919)ILN,CNAMES(JA),VALUES(JAJB),
+ 1 CUNITS(JA),YCHAR
+C
+ IF(NLINE.GT.1) THEN
+ DO 1130 JJ=1,NLINE-1
+C
+ K2=JJ*30+1
+ K1=(JJ+1)*30
+ YCHAR=' '
+ YCHAR=YLONG(K2:K1)
+C
+ WRITE(KNTN,9920) YCHAR
+1130 CONTINUE
+C
+ END IF
+
+ ELSEIF(CUNITS(JA)(1:4).EQ.'CODE') THEN
+ KCODE=NINT(VALUES(JAJB))
+ CALL GETCODE(KTDEXP(JA),KCODE,YCODE,IERR)
+ DO IZ=256,1,-1
+ IF(YCODE(IZ:IZ).NE.' ') THEN
+ IZZ=IZ
+ GO TO 161
+ END IF
+ END DO
+ 161 CONTINUE
+ IKK=IZZ/64+1
+ WRITE(KNTN,9919) ILN,CNAMES(JA),VALUES(JAJB),
+ 1 CUNITS(JA), YCODE(1:64)
+
+ IF(IKK.GT.1) THEN
+ IIII=65
+ DO IK=2,IKK
+ WRITE(KNTN,9920) YCODE(iiii:iiii+64-1)
+ IIII=IIII+64
+ END DO
+ END IF
+ ELSEIF(CUNITS(JA)(1:4).EQ.'FLAG') THEN
+ KCODE=NINT(VALUES(JAJB))
+ CALL GETFLAG(KTDEXP(JA),KCODE,KFLAG,YFLAG,IERR)
+ WRITE(KNTN,9919) ILN,CNAMES(JA),VALUES(JAJB),
+ 1 CUNITS(JA), YFLAG(1)
+ IF(KFLAG.GT.1) THEN
+ DO IZ=2,KFLAG
+ WRITE(KNTN,9920) YFLAG(IZ)
+ END DO
+ END IF
+ ELSE
+ WRITE(KNTN,9917) ILN,CNAMES(JA),VALUES(JAJB),
+ 1 CUNITS(JA)
+ END IF
+ END IF
+
+ 160 CONTINUE
+ 150 CONTINUE
+C
+ END IF
+C
+C
+C RETURN
+C
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C ------------------------------------------------------------------
+ 9917 FORMAT(1H ,I6,1X,A32,1X,E23.14E3,1X,A24)
+ 9918 FORMAT(1H ,I6,1X,A32,1X,' MISSING',1X,A24)
+ 9919 FORMAT(1H ,I6,1X,A32,1X,E23.14E3,1X,A24,1X,A)
+ 9920 FORMAT(1H ,89X,A)
+ END
diff --git a/bufrdc/buprtbox.F b/bufrdc/buprtbox.F
new file mode 100755
index 0000000..dfd539c
--- /dev/null
+++ b/bufrdc/buprtbox.F
@@ -0,0 +1,146 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUPRTBOX(KBOX,KAPP,KLEN,KBOXR,VALS,CBOXN,CBOXU)
+C
+C**** *BUPRTBOX*
+C
+C
+C PURPOSE.
+C --------
+C
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUPRTBOX(KBOX,KAPP,KLEN,KBOXR,VALS,CBOXN,CBOXU)*
+C
+C INPUT :
+C *KBOX* - NUMBER OF ROWS
+C *KAPP* - NUMBER OF COLUMNS
+C *KLEN* - OFFSET FOR START OF NEXT COLUMN
+C *KBOXR* - ARRAY CONTAINING BUFR TABLE B REFERENCE NUMBERS
+C *VALS* - ARRAY CONTAINING UNPACKED VALUES
+C *CBOXN* - ARRAY CONTAINING ELEMENT NAMES
+C *CBOXU* - ARRAY CONTAINING ELEMENT UNITS
+C
+C METHOD.
+C -------
+C
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/94.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H,Y)
+C
+# include "parameter.F"
+# include "bcomunit.F"
+C
+ DIMENSION IOPER(100)
+#ifndef R_4
+ REAL*8 RPRINT(60)
+ REAL*8 VALS(JWORK)
+#else
+ REAL RPRINT(60)
+ REAL VALS(JWORK)
+#endif
+ DIMENSION KBOXR(JWORK),IBVAL(JELEM),IBPRINT(60)
+ CHARACTER*64 CBOXN(JELEM)
+ CHARACTER*24 CBOXU(JELEM)
+C
+C
+C ------------------------------------------------------------------
+C* 1. PRINT BOXED EXPANDED BUFR MESSAGE
+C ---------------------------------
+ 100 CONTINUE
+C
+ IF(KBOX.LE.6) THEN
+ WRITE(KNTN,*) 'THERE IS NO USEFULL DATA TO BE PRINTED.'
+ KBOX=0
+ RETURN
+ END IF
+C
+ IF(KAPP.GT.60) THEN
+ WRITE(KNTN,*) 'THERE IS MORE THAN 60 APPLICATIONS IN THE DATA'
+ WRITE(KNTN,*) 'ONLY FIRST 60 WILL BE PROCESSED'
+ KAPP=60
+ END IF
+C
+ IF(KAPP.GT.1) THEN
+ IREP=(KAPP-1)/10
+ IOFF=(KAPP-1)-IREP*10
+ IF(IOFF.NE.0) IREP=IREP+1
+ ELSE
+ IREP=1
+ IOFF=0
+ END IF
+C
+ IST=2
+ IEND=11
+C IF(IREP.EQ.1.AND.KAPP.EQ.1) IEND=IOFF+1
+C IF(IREP.EQ.1) IEND=IOFF+1
+ IF(IREP.EQ.1 .AND. IOFF .EQ.0) THEN
+ IEND=1
+ ELSEIF(IREP.EQ.1) THEN
+ IEND=IOFF+1
+ END IF
+C
+ DO 2005 J=1,IREP
+C
+ WRITE(KNTN,*) ' '
+ DO 2002 I=1,KBOX
+ IIII=1
+ RPRINT(IIII)=VALS(I)
+C
+ DO 2003 II=IST,IEND
+ IIII=IIII+1
+ III=I+(II-1)*KLEN
+ RPRINT(IIII)=VALS(III)
+ IBPRINT(IIII)=KBOXR(III)
+ 2003 CONTINUE
+C WRITE(KNTN,'(1H ,I4,1X,A32,1X,15(1X,I6,1X,F8.1))')
+C 1 I,CBOXN(I),(IBPRINT(NN),RPRINT(NN),NN=1,KAPP)
+ WRITE(KNTN,'(1H ,I4,1X,A32,1X,F14.1,30(1X,F8.1))')
+ 1 I,CBOXN(I),(RPRINT(NN),NN=1,IIII)
+ 2002 CONTINUE
+C
+ IF(IOFF.NE.0.AND.J.EQ.(IREP-1)) THEN
+ IST=IEND+1
+ IEND=IEND+IOFF
+ ELSE
+ IST=IEND+1
+ IEND=IEND+10
+ END IF
+C
+ 2005 CONTINUE
+C
+C
+ RETURN
+ END
diff --git a/bufrdc/burep.F b/bufrdc/burep.F
new file mode 100755
index 0000000..1df0a6e
--- /dev/null
+++ b/bufrdc/burep.F
@@ -0,0 +1,323 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUREP(KPT,KDLEN,KDATA,KJ,KJ1,KDD,KSTACK,KERR)
+C
+C**** *BUREP*
+C
+C
+C PURPOSE.
+C --------
+C RESOLVE DATA DESCRIPTOR REPLICATION PROBLEM.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUREP(KPT,KDLEN,KDATA,KJ,KJ1,KDD,KSTACK,KERR)*
+C
+C INPUT :
+C *KPT* - POINTER TOO KDATA ARRAY
+C *KDLEN* - DIMENSION OF KDATA ARRAY
+C *KDATA* - ARRAY CONTAINING DATA NEEDED FOR DATA DESCRIPTOR
+C EXPANSION
+C *KDD* - DATA DESCRIPTOR
+C OUTPUT:
+C *KJ* - POINTER TO KSTACK ARRAY
+C *KJ1* - POINTER TO LAST ELEMENT IN KSTACK
+C *KSTACK* - LIST OF DATA DESCRIPTORS
+C *KERR* - RETURN CODE
+C
+C METHOD.
+C -------
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C BUETDR - RESOLVE TABLE D REFERENCE
+C BUEPWT - UPDATE WORKING TABLES
+C GBYTE - UNPACK BIT PATHERN
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+# include "bcmwt.F"
+# include "bcmwtc.F"
+# include "bcmbef.F"
+# include "bcmoff.F"
+C
+ CHARACTER CWTEN*64,CWTU*24
+ DIMENSION ILIST(JELEM)
+ DIMENSION KSTACK(*)
+ DIMENSION KDATA(KDLEN)
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+C
+C ------------------------------------------------------------------
+C
+C* 1. STORE K, NUMBER OF DESCRIPTORS TO BE REPLICATED.
+C ------------------------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ IF = KDD / 100000
+ IDIF= KDD - IF * 100000
+ IX = IDIF / 1000
+ IY = IDIF - IX * 1000
+ K = IX
+ IF(IY.EQ.0) ODREPF=.TRUE.
+C
+C* 1.1 DELAYED REPLICATION ?
+C ---------------------
+ 110 CONTINUE
+C
+ IF( IY .NE. 0 ) THEN
+C
+C* 1.2 STORE NUMBER OF DESCRIPTORS, K, AND REPLICATION
+C -----------------------------------------------
+C FACTOR JR.
+C ----------
+ 120 CONTINUE
+C
+ JR = IY
+ GO TO 500
+ END IF
+C
+C ------------------------------------------------------------------
+C
+C* 2. GET NEXT DESCRIPTOR.
+C --------------------
+ 200 CONTINUE
+C
+ KJ =KJ + 1
+ KDD= KSTACK(KJ)
+C
+C ------------------------------------------------------------------
+C
+C* 2.1 REPLICATION FACTOR ?
+C --------------------
+ 210 CONTINUE
+C
+ IF(KDD.NE.31001.AND.KDD.NE.31002.AND.
+ 1 KDD.NE.31000.AND.
+ 1 KDD.NE.31011.AND.KDD.NE.31012 )THEN
+C
+C* 2.1.1 SEQUENCE DESCRIPTOR ?
+C ---------------------
+C
+ IF=KDD/100000
+C
+ IF( IF.EQ.3) THEN
+C
+C* 2.1.1.1 SOLVE TABLE D REFERENCE.
+C ------------------------
+ CALL BUETDR(KJ,KJ1,KDD,KSTACK,KERR)
+ IF(KERR.GT.0) THEN
+ DO 252 IQ=1,JELEM
+ NSTACK(IQ)=0.
+ 252 CONTINUE
+ RETURN
+ END IF
+ GO TO 200
+ END IF
+C
+ IF( IF.EQ.2) THEN
+ CALL BUOPER(KPT,KDLEN,KDATA,KJ,KDD,KSTACK,KERR)
+ IF(KERR.GT.0) THEN
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 200
+ END IF
+C
+ KERR=36
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+C ------------------------------------------------------------------
+C
+C* 3. UPDATE WORKING TABLE.
+C ---------------------
+ 300 CONTINUE
+C
+ IF(KDD.EQ.31031.OR.KDD.EQ.31192) THEN
+ NWT=NWT+1
+ NWTR(NWT)=KDD
+ NWTS(NWT)=0
+ NWTRV(NWT)=0
+ NWTDW(NWT)=1
+ M=M+1
+ ELSEIF(KDD.EQ.33007.OR.KDD.EQ.63192) THEN
+ NWT=NWT+1
+ NWTR(NWT)=KDD
+ NWTS(NWT)=0
+ NWTRV(NWT)=0
+ NWTDW(NWT)=7
+ M=M+1
+ ELSE
+ CALL BUEPWT (KDD,KERR)
+ IF(KERR.GT.0) RETURN
+ IF(KDD.EQ.031011.or.KDD.EQ.031012) RETURN
+ END IF
+C
+C ------------------------------------------------------------------
+C
+C* 4. STORE JR, THE REPLICATION FACTOR FROM DATA.
+C ------------------------------------------------------
+ 400 CONTINUE
+C
+ KPT=KPT+1
+ IF(KPT.GT.KDLEN) THEN
+ KERR=31
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ JR=KDATA(KPT)
+C
+ IF(JR.EQ.0) THEN
+ IIIF=KSTACK(KJ+1)/100000
+ IIII=KSTACK(KJ+1)-IIIF*100000
+ IIIX=IIII/1000
+ IIIY=IIII-IIIX*1000
+C
+ IF(IIIF.EQ.2.AND.IIIY.EQ.0) THEN
+ KJ=KJ+1
+ CALL BUOPER(KPT,KDLEN,KDATA,KJ,KSTACK(KJ),KSTACK,KERR)
+ IF(KERR.GT.0) THEN
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+
+ KJ=KJ+K
+ GO TO 640
+ END IF
+
+ JRTK=JR*K+KJ1-K
+ IF(JRTK.GT.JELEM) THEN
+ KERR=30
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+C CHECK IF NEXT DESCRIPTOR CANCEL OPERATOR FOR DELAYED
+C REPLICATION
+C
+ IIIF=KSTACK(KJ+1)/100000
+ IIII=KSTACK(KJ+1)-IIIF*100000
+ IIIX=IIII/1000
+ IIIY=IIII-IIIX*1000
+C
+ IF(IIIF.EQ.2.AND.IIIY.EQ.0) THEN
+ KJ=KJ+1
+ CALL BUOPER(KPT,KDLEN,KDATA,KJ,KSTACK(KJ),KSTACK,KERR)
+ IF(KERR.GT.0) THEN
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+C ------------------------------------------------------------------
+C* 5. GET NEXT K DESCRIPTORS.
+C -----------------------
+ 500 CONTINUE
+C
+ DO 501 J=1,K
+C
+ ILIST(J)=KSTACK(KJ+J)
+C
+ 501 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 6. ADD JR TIMES K DESCRIPTORS IN PLACE OF K
+C ----------------------------------------
+C DESCRIPTORS OBTAINED.
+C ---------------------
+ 600 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 6.1 PUSH DOWN DESCRIPTORS IN KSTACK FOR (JR-1)*K PLACES
+C ---------------------------------------------------
+C STARTING AT KJ1 AND ENDING AT KJ+K.
+C -----------------------------------
+ 610 CONTINUE
+C
+ JRKM1=(JR-1)*K
+C
+ DO 611 J=KJ1,KJ+K,-1
+C
+ KSTACK(J+JRKM1)=KSTACK(J)
+C
+ 611 CONTINUE
+C
+C* 6.2 INSERT LIST IN THE STACK.
+C -------------------------
+ 620 CONTINUE
+C
+ DO 622 J=1,JR
+C
+ KJJM1K=KJ+(J-1)*K
+C
+ DO 623 J1=1,K
+C
+ KSTACK(KJJM1K+J1)=ILIST(J1)
+C
+ 623 CONTINUE
+ 622 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 6.3 ADJUST DESCRIPTOR COUNT FOR LIST LENGTH.
+C ----------------------------------------
+ 630 CONTINUE
+C
+ KJ1 = KJ1 + (JR-1)*K
+C
+C ------------------------------------------------------------------
+C* 6.4 ADJUST NUMBER OF DATA DESCRIPTORS NOT PRESENT.
+C ----------------------------------------------
+ 640 CONTINUE
+C
+ IF(N221.NE.0) N221= KJ1 - KJ + 1
+C
+C ------------------------------------------------------------------
+ 700 CONTINUE
+C
+ RETURN
+ END
diff --git a/bufrdc/burepc.F b/bufrdc/burepc.F
new file mode 100755
index 0000000..3f08d30
--- /dev/null
+++ b/bufrdc/burepc.F
@@ -0,0 +1,312 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUREPC(KPT,KDLEN,KDATA,KJ,KJ1,KDD,KSTACK,KERR)
+C
+C**** *BUREPC*
+C
+C
+C PURPOSE.
+C --------
+C RESOLVE DATA DESCRIPTOR REPLICATION PROBLEM.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUREPC(KPT,KDLEN,KDATA,KJ,KJ1,KDD,KSTACK,KERR)*
+C
+C INPUT :
+C *KPT* - POINTER TOO KDATA ARRAY
+C *KDLEN* - DIMENSION OF KDATA ARRAY
+C *KDATA* - ARRAY CONTAINING DATA NEEDED FOR DATA DESCRIPTOR
+C EXPANSION
+C *KDD* - DATA DESCRIPTOR
+C OUTPUT:
+C *KJ* - POINTER TO KSTACK ARRAY
+C *KJ1* - POINTER TO LAST ELEMENT IN KSTACK
+C *KSTACK* - LIST OF DATA DESCRIPTORS
+C *KERR* - RETURN CODE
+C
+C METHOD.
+C -------
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C BUETDR - RESOLVE TABLE D REFERENCE
+C BUEPWT - UPDATE WORKING TABLES
+C GBYTE - UNPACK BIT PATHERN
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+# include "bcmwt.F"
+# include "bcmwtc.F"
+# include "bcmbef.F"
+C
+ CHARACTER CWTEN*64,CWTU*24
+ DIMENSION ILIST(JELEM)
+ DIMENSION KSTACK(*)
+ DIMENSION KDATA(KDLEN)
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+C
+C ------------------------------------------------------------------
+C
+C* 1. STORE K, NUMBER OF DESCRIPTORS TO BE REPLICATED.
+C ------------------------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ IF = KDD / 100000
+ IDIF= KDD - IF * 100000
+ IX = IDIF / 1000
+ IY = IDIF - IX * 1000
+ K = IX
+ IF(IY.EQ.0) ODREPF=.TRUE.
+C
+C* 1.1 DELAYED REPLICATION ?
+C ---------------------
+ 110 CONTINUE
+C
+ IF( IY .NE. 0 ) THEN
+C
+C* 1.2 STORE NUMBER OF DESCRIPTORS, K, AND REPLICATION
+C -----------------------------------------------
+C FACTOR JR.
+C ----------
+ 120 CONTINUE
+C
+ JR = IY
+ GO TO 500
+ END IF
+C
+C ------------------------------------------------------------------
+C
+C* 2. GET NEXT DESCRIPTOR.
+C --------------------
+ 200 CONTINUE
+C
+ KJ =KJ + 1
+ KDD= KSTACK(KJ)
+C
+C ------------------------------------------------------------------
+C
+C* 2.1 REPLICATION FACTOR ?
+C --------------------
+ 210 CONTINUE
+C
+ IF(KDD.NE.31001.AND.KDD.NE.31002.AND.
+ 1 KDD.NE.31000.AND.
+ 1 KDD.NE.31011.AND.KDD.NE.31012 )THEN
+C
+C* 2.1.1 SEQUENCE DESCRIPTOR ?
+C ---------------------
+C
+ IF=KDD/100000
+C
+ IF( IF.EQ.3) THEN
+C
+C* 2.1.1.1 SOLVE TABLE D REFERENCE.
+C ------------------------
+ CALL BUETDR(KJ,KJ1,KDD,KSTACK,KERR)
+ IF(KERR.GT.0) THEN
+ DO 252 IQ=1,JELEM
+ NSTACK(IQ)=0.
+ 252 CONTINUE
+ RETURN
+ END IF
+ GO TO 200
+ END IF
+C
+ IF( IF.EQ.2) THEN
+ CALL BUOPERC(KPT,KDLEN,KDATA,KJ,KDD,KSTACK,KERR)
+ IF(KERR.GT.0) THEN
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 200
+ END IF
+C
+ KERR=36
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+C ------------------------------------------------------------------
+C
+C* 3. UPDATE WORKING TABLE.
+C ---------------------
+ 300 CONTINUE
+C
+ IF(KDD.EQ.31031.OR.KDD.EQ.31192) THEN
+ NWT=NWT+1
+ NWTR(NWT)=KDD
+ NWTS(NWT)=0
+ NWTRV(NWT)=0
+ NWTDW(NWT)=1
+ M=M+1
+ ELSEIF(KDD.EQ.33007.OR.KDD.EQ.63192) THEN
+ NWT=NWT+1
+ NWTR(NWT)=KDD
+ NWTS(NWT)=0
+ NWTRV(NWT)=0
+ NWTDW(NWT)=7
+ M=M+1
+ ELSE
+ CALL BUEPWTC (KDD,KERR)
+ IF(KERR.GT.0) RETURN
+ IF(KDD.EQ.031011.OR.KDD.EQ.031012) RETURN
+ END IF
+C
+C ------------------------------------------------------------------
+C
+C* 4. STORE JR, THE REPLICATION FACTOR FROM DATA.
+C ------------------------------------------------------
+ 400 CONTINUE
+C
+ KPT=KPT+1
+ IF(KPT.GT.KDLEN) THEN
+ KERR=31
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ JR=KDATA(KPT)
+C IF(JR.EQ.0) THEN
+C KERR=18
+C CALL BUERR(KERR)
+C RETURN
+C END IF
+C
+ IF(JR.EQ.0) THEN
+ KJ=KJ+K
+ GO TO 640
+ END IF
+C
+ JRTK=JR*K+KJ1-K
+ IF(JRTK.GT.JELEM) THEN
+ KERR=30
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+C CHECK IF NEXT DESCRIPTOR CANCEL OPERATOR FOR DELAYED
+C REPLICATION
+C
+ IIIF=KSTACK(KJ+1)/100000
+ IIII=KSTACK(KJ+1)-IIIF*100000
+ IIIX=IIII/1000
+ IIIY=IIII-IIIX*1000
+C
+ IF(IIIF.EQ.2.AND.IIIY.EQ.0) THEN
+ KJ=KJ+1
+ CALL BUOPERC(KPT,KDLEN,KDATA,KJ,KSTACK(KJ),KSTACK,KERR)
+ IF(KERR.GT.0) THEN
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+C ------------------------------------------------------------------
+C* 5. GET NEXT K DESCRIPTORS.
+C -----------------------
+ 500 CONTINUE
+C
+ DO 501 J=1,K
+C
+ ILIST(J)=KSTACK(KJ+J)
+C
+ 501 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 6. ADD JR TIMES K DESCRIPTORS IN PLACE OF K
+C ----------------------------------------
+C DESCRIPTORS OBTAINED.
+C ---------------------
+ 600 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 6.1 PUSH DOWN DESCRIPTORS IN KSTACK FOR (JR-1)*K PLACES
+C ---------------------------------------------------
+C STARTING AT KJ1 AND ENDING AT KJ+K.
+C -----------------------------------
+ 610 CONTINUE
+C
+ JRKM1=(JR-1)*K
+C
+ DO 611 J=KJ1,KJ+K,-1
+C
+ KSTACK(J+JRKM1)=KSTACK(J)
+C
+ 611 CONTINUE
+C
+C* 6.2 INSERT LIST IN THE STACK.
+C -------------------------
+ 620 CONTINUE
+C
+ DO 622 J=1,JR
+C
+ KJJM1K=KJ+(J-1)*K
+C
+ DO 623 J1=1,K
+C
+ KSTACK(KJJM1K+J1)=ILIST(J1)
+C
+ 623 CONTINUE
+ 622 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 6.3 ADJUST DESCRIPTOR COUNT FOR LIST LENGTH.
+C ----------------------------------------
+ 630 CONTINUE
+C
+ KJ1 = KJ1 + (JR-1)*K
+C
+C ------------------------------------------------------------------
+C* 6.4 ADJUST NUMBER OF DATA DESCRIPTORS NOT PRESENT.
+C ----------------------------------------------
+ 640 CONTINUE
+C
+ IF(N221.NE.0) N221= KJ1 - KJ + 1
+C
+C ------------------------------------------------------------------
+ 700 CONTINUE
+C
+ RETURN
+ END
diff --git a/bufrdc/burqc.F b/bufrdc/burqc.F
new file mode 100755
index 0000000..867426c
--- /dev/null
+++ b/bufrdc/burqc.F
@@ -0,0 +1,1106 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BURQC(KBUFL,KBUFF,KELEM,CNAMES,CUNITS,KSUP,KSEC3,KERR)
+C
+C**** *BURQC*
+C
+C
+C PURPOSE.
+C --------
+C
+C CREATE PARAMETERS NEEDED FOR PARTIAL EXPANSION OF
+C BUFR MESSAGE WITH COMPRESSED DATA ACCORDING TO REQUESTED
+C INPUT LISTS.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BURQC(KBUFL,KBUFF,KELEM,CNAMES,CUNITS,KSUP,KSEC3,KERR)*
+C
+C INPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C *KELEM* - DIMENSION OF CNAMES, CUNITS ARRAY
+C *CNAMES* - CHARACTER ARRAY CONTAINING ELEMENT NAMES
+C *CUNITS* - CHARACTER ARRAY CONTAINIG UNITS
+C *KSUP* - ARRAY CONTAINING SUPLEMENTARY INFORMATION
+C - KSUP( 1) -- IDIM1, DIMENSION OF KSEC1
+C - KSUP( 2) -- IDIM2, DIMENSION OF KSEC2
+C - KSUP( 3) -- IDIM3, DIMENSION OF KSEC3
+C - KSUP( 4) -- IDIM4, DIMENSION OF KSEC4
+C - KSUP( 5) -- M (NUMBER OF ELEMENTS IN VALUES ARRAY,
+C FIRST INDEX)
+C - KSUP( 6) -- N (NUMBER OF SUBSETS,SECOND INDEX OF
+C VALUES ARRAY)
+C - KSUP( 7) -- JVC (NUMBER OF ELEMENTS IN CVAL ARRAY)
+C - KSUP( 8) -- TOTAL BUFR MESSAGE LENGTH IN BYTES
+C - KSUP( 9) -- IDIM0, DIMENSION OF KSEC0
+C *KSEC3* - ARRAY CONTAINING SECTION 3 INFORMATION
+C KSEC3( 1)-- LENGTH OF SECTION 3 (BYTES)
+C KSEC3( 2)-- RESERVED
+C KSEC3( 3)-- NUMBER OF SUBSETS
+C KSEC3( 4)-- FLAG (DATA TYPE,DATA COMPRESSION)
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C
+C WORD AND BIT POINTERS ARE CALCULATED FOR EVERY ELEMENT
+C IN THE EXPANDED LIST OF ELEMENTS. IF PARTIAL EXPANSION REQUESTED,
+C INDECES TO REQUIRED ELEMENTS ARE DETERMINED, AS WELL AS CORRESPONDING
+C QUALITY CONTROL, STATISTICS ETC. INFORMATION.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C BUNPCK - UNPACKS BIT PATTERN
+C BUNPKS - UNPACKS BIT PATTERN IN REPEATED WAY
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+# include "bcombef.F"
+# include "bcomwt.F"
+# include "bcomp.F"
+# include "bcomwtc.F"
+# include "bcomrq.F"
+# include "bcomreq.F"
+C
+ CHARACTER*64 CWTEN
+ CHARACTER*24 CWTU
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+C
+ DIMENSION KSUP(JSUP),KSEC3(JSEC3)
+ DIMENSION KBUFF(KBUFL)
+C
+ DIMENSION IRQEI(JELEM),IQCI(JELEM),IQCDPI(JELEM)
+ DIMENSION IBVAL(JELEM),IBV(JELEM)
+ DIMENSION IC7(JELEM),IC8(JELEM),IC7R(JELEM),IC8R(JELEM)
+ DIMENSION NQP(JELEM),ITYPE(100)
+C
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+ REAL*8 RQVAL
+ REAL*8 VAL
+#else
+ REAL RVIND
+ REAL EPS
+ REAL RQVAL
+ REAL VAL
+#endif
+ DIMENSION IMASK(8)
+C
+ SAVE IBV,IBVAL
+C
+ DATA IMASK /1,2,4,8,16,32,64,128/
+C
+C
+C ------------------------------------------------------------------
+C
+C* 1. DEFINE WORD/BIT POINTERS TO EVERY ELEMENT.
+C ------------------------------------------
+ 100 CONTINUE
+C
+ IF(KERR.GT.0) RETURN
+C
+ NFCM=1
+ NFUCM=0
+C
+C CHECK REQUEST VALIDITY
+C
+ IF(NREQ(1).EQ.0.AND.NREQ(2).NE.0) THEN
+ KERR=38
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ MREL=0
+C
+ IBP32= 32 + NBPTB
+C
+ IB1=0
+ IF(IAND(NREQ(2),IMASK(1)).NE.0) IB1=1
+ IB2=0
+ IF(IAND(NREQ(2),IMASK(2)).NE.0) IB2=1
+ IB3=0
+ IF(IAND(NREQ(2),IMASK(3)).NE.0) IB3=1
+ IB4=0
+ IF(IAND(NREQ(2),IMASK(4)).NE.0) IB4=1
+ IB5=0
+ IF(IAND(NREQ(2),IMASK(5)).NE.0) IB5=1
+ IB6=0
+ IF(IAND(NREQ(2),IMASK(6)).NE.0) IB6=1
+C
+C* 1.1 COMPRESSED DATA.
+C ----------------
+ 110 CONTINUE
+C
+ IBIT=IBP32
+ IWORD=IBIT/NBPW
+C
+ NWORDP(1)=NWPTB+IWORD
+ NBITP (1)=IBIT-IWORD*NBPW
+C
+ DO 111 I=2,M+1
+ IWRD=NWORDP(I-1)
+ IBTP=NBITP (I-1)
+C
+ IF(NWTDW(I-1).EQ.0) THEN
+ NBITP(I) =NBITP(I-1)
+ NWORDP(I)=NWORDP(I-1)
+ GO TO 111
+ END IF
+C
+ IBTP=IBTP+NWTDW(I-1)
+ IF(IBTP.GE.NBPW) THEN
+ IW=IBTP/NBPW
+ IBTP=IBTP-IW*NBPW
+ IWRD=IWRD+IW
+ END IF
+C
+ CALL BUNPCK(NBPW,KBUFF,IDWINC,IWRD,IBTP,6,KERR)
+ IF(KERR.GT.0) RETURN
+ IF(IDWINC.GT.JBPW) THEN
+ KERR=15
+ WRITE(KNTN,*) 'BURQC :'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ IF(IWRD.GT.KBUFL) THEN
+ KERR=26
+ WRITE(KNTN,*) 'BURQC :'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ IF(CWTU(I-1).EQ.'CCITTIA5') THEN
+ NWTIWS(I-1)=NWTDW(I-1)+6+N*IDWINC*8
+ ELSEIF(NWTEN(I-1).EQ.-999) THEN
+ NWTIWS(I-1)=NWTDW(I-1)+6+N*IDWINC*8
+ ELSE
+ NWTIWS(I-1)=NWTDW(I-1)+6+N*IDWINC
+ END IF
+C
+ IBIT = NBITP(I-1) + NWTIWS(I-1)
+ IWORD= IBIT/NBPW
+C
+ NBITP (I)= IBIT - IWORD*NBPW
+ NWORDP(I)= NWORDP(I-1) + IWORD
+C
+ IF(NWORDP(I).GT.KBUFL) THEN
+ KERR=26
+ WRITE(KNTN,*) 'BURQC :'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ 111 CONTINUE
+C
+C -----------------------------------------------------------------
+C* 2. CREATE POINTERS FOR REQUESTED ELEMENTS.
+C ---------------------------------------
+ 200 CONTINUE
+C
+C
+C* 2.1 CHECK IF SUBSET OF ELEMENTS REQUESTED.
+C
+ 210 CONTINUE
+C
+ IF(NREQ(1).EQ.0) THEN
+ DO 212 I=1,M
+ INWTEN(I)=NWTEN(I)
+ INWTR (I)=NWTR (I)
+ INWTS (I)=NWTS (I)
+ INWTDW(I)=NWTDW(I)
+ INWTRV(I)=NWTRV(I)
+ CNAMES(I)=CWTEN(I)
+ CUNITS(I)=CWTU(I)
+ INWORDP(I)=NWORDP(I)
+ INBITP(I)=NBITP(I)
+ 212 CONTINUE
+ RETURN
+ END IF
+C
+ IF(NREQ(1).EQ.1) THEN
+ DO 213 I=1,M
+ IF(NWTR(I).GT.200000.AND.
+ 1 NWTR(I).NE.999999) THEN
+ MREL=I-1
+ GO TO 2133
+ END IF
+ 213 CONTINUE
+ MREL=M
+C
+ 2133 CONTINUE
+ J=0
+ IF(NRQL.EQ.0) THEN
+ DO 2131 I=1,MREL
+ J=J+1
+ INBITP(J)=NBITP(I)
+ INWORDP(J)=NWORDP(I)
+ INWTEN(J)=NWTEN(I)
+ INWTR(J) =NWTR(I)
+ INWTS(J) =NWTS(I)
+ INWTDW(J)=NWTDW(I)
+ INWTRV(J)=NWTRV(I)
+ CNAMES(J)=CWTEN(I)
+ CUNITS(J)=CWTU(I)
+ 2131 CONTINUE
+C
+ M=J
+ RETURN
+ ELSE
+ M=MREL
+ GO TO 220
+ END IF
+ END IF
+C
+ IF(NREQ(1).EQ.2) THEN
+ DO 214 I=1,M
+ IF(NWTR(I).EQ.235000) THEN
+ M=I-1
+ GO TO 2141
+ END IF
+ 214 CONTINUE
+C
+ 2141 CONTINUE
+C
+ J=0
+ IF(NREQ(2).EQ.0) THEN
+ DO 2142 I=1,M
+ J=J+1
+ INBITP(J)=NBITP(I)
+ INWORDP(J)=NWORDP(I)
+ INWTEN(J)=NWTEN(I)
+ INWTR(J)=NWTR(I)
+ INWTS(J)=NWTS(I)
+ INWTDW(J)=NWTDW(I)
+ INWTRV(J)=NWTRV(I)
+ CNAMES(J)=CWTEN(I)
+ CUNITS(J)=CWTU(I)
+ 2142 CONTINUE
+ RETURN
+ ELSE
+ GO TO 220
+ END IF
+ END IF
+C
+ IF(NREQ(1).EQ.3) THEN
+ DO 215 I=1,M
+ IF(NWTR(I).EQ.235000) THEN
+C
+C COPY CLASS 1 - 8 ELEMENTS
+C
+ DO 2151 III=1,M
+ IF(NWTR(III).GT.8000) THEN
+ J=0
+ IF(NREQ(2).EQ.0) THEN
+ DO 2161 II=1,III-1
+ J=J+1
+ INBITP(J)=NBITP(II)
+ INWORDP(J)=NWORDP(II)
+ INWTR(J)=NWTR(II)
+ INWTS(J)=NWTS(II)
+ INWTRV(J)=NWTRV(II)
+ INWTDW(J)=NWTDW(II)
+ INWTEN(J)=NWTEN(II)
+ CNAMES(J)=CWTEN(II)
+ CUNITS(J)=CWTU(II)
+ 2161 CONTINUE
+ GO TO 2160
+ ELSE
+ DO 21611 II=1,III-1
+ J=J+1
+ NBITP(J)=NBITP(II)
+ NWORDP(J)=NWORDP(II)
+ NWTR(J)=NWTR(II)
+ NWTS(J)=NWTS(II)
+ NWTRV(J)=NWTRV(II)
+ NWTDW(J)=NWTDW(II)
+ NWTEN(J)=NWTEN(II)
+ CWTEN(J)=CWTEN(II)
+ CWTU(J)=CWTU(II)
+21611 CONTINUE
+ GO TO 2160
+
+ END IF
+ END IF
+ 2151 CONTINUE
+C
+ 2160 CONTINUE
+C
+ IF(NREQ(2).EQ.0) THEN
+ DO 216 II=I+1,M
+ J=J+1
+ INBITP(J)=NBITP(II)
+ INWORDP(J)=NWORDP(II)
+ INWTR(J)=NWTR(II)
+ INWTS(J)=NWTS(II)
+ INWTRV(J)=NWTRV(II)
+ INWTDW(J)=NWTDW(II)
+ INWTEN(J)=NWTEN(II)
+ CNAMES(J)=CWTEN(II)
+ CUNITS(J)=CWTU(II)
+ 216 CONTINUE
+ M=J
+ RETURN
+ ELSE
+ DO 2169 II=I+1,M
+ J=J+1
+ NBITP(J)=NBITP(II)
+ NWORDP(J)=NWORDP(II)
+ NWTR(J)=NWTR(II)
+ NWTS(J)=NWTS(II)
+ NWTRV(J)=NWTRV(II)
+ NWTDW(J)=NWTDW(II)
+ NWTEN(J)=NWTEN(II)
+ CWTEN(J)=CWTEN(II)
+ CWTU(J)=CWTU(II)
+ 2169 CONTINUE
+ M=J
+ GO TO 220
+ END IF
+ END IF
+C
+ 215 CONTINUE
+C
+ KERR=39
+ CALL BUERR(KERR)
+ RETURN
+ ELSE
+ KERR=40
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+C
+C* 2.2 CREATE INDECES TO CLASS 7/8
+C ---------------------------
+ 220 CONTINUE
+C
+ DO 225 I=1,M
+ IF(NWTR(I).GT.200000.AND.
+ 1 NWTR(I).NE.999999) THEN
+ MREL=I-1
+ GO TO 226
+ END IF
+ 225 CONTINUE
+C
+ MREL=M
+C
+ 226 CONTINUE
+C
+ J=0
+ JJ=0
+ DO 221 I=1,MREL
+ ICLASS=NWTR(I)/1000
+ IF(ICLASS.EQ.7) THEN
+ J=J+1
+ IC7(J)=I
+ END IF
+C
+ IF(ICLASS.EQ.8) THEN
+ JJ=JJ+1
+ IC8(JJ)=I
+ END IF
+ 221 CONTINUE
+C
+ IC7L=J
+ IC8L=JJ
+ J=0
+ JJ=0
+ DO 223 I=1,NRQL
+ ICLASS=NRQ(I)/1000
+ IF(ICLASS.EQ.7.AND.(ABS(RQVAL(I)-RVIND)/RVIND.GT.EPS)) THEN
+ J=J+1
+ IC7R(J)=I
+ END IF
+C
+ IF(ICLASS.EQ.8.AND.(ABS(RQVAL(I)-RVIND)/RVIND.GT.EPS)) THEN
+ JJ=JJ+1
+ IC8R(JJ)=I
+ END IF
+ 223 CONTINUE
+C
+ IC7RL=J
+ IC8RL=JJ
+C
+C* 2.3 CREATE INDECES TO THE REQUESTED ELEMENTS.
+C -----------------------------------------
+ 230 CONTINUE
+C
+ IF(IC7RL.EQ.0.AND.IC8RL.EQ.0) THEN
+ IL=MREL
+ IRL=NRQL
+ END IF
+ IF(IC7RL.NE.0.AND.IC8RL.EQ.0) THEN
+ IL=IC7(1)
+ IRL=IC7R(1)-1
+ END IF
+ IF(IC8RL.NE.0.AND.IC7RL.EQ.0) THEN
+ IL=IC8(1)
+ IRL=IC8R(1)-1
+ END IF
+ IF(IC7RL.NE.0.AND.IC8RL.NE.0) THEN
+ IL=IC7(1)
+ IF(IC7(1).GT.IC8(1)) IL=IC8(1)
+ IRL=IC7R(1)
+ IF(IC7R(1).GT.IC8R(1)) IRL=IC8R(1)
+ IRL=IRL-1
+ END IF
+C
+ DO 299 I=1,MREL
+ IRQEI(I)=0
+ 299 CONTINUE
+C
+ ORQEI=.FALSE.
+ DO 231 I=1,IL
+ IF(IB2.EQ.0.OR.NRQL.EQ.0) THEN
+ ORQEI=.TRUE.
+ IRQEI(I)=I
+ ELSE
+ DO 232 K=1,IRL
+ IF(NWTR(I).EQ.NRQ(K)) THEN
+ ORQEI=.TRUE.
+ IRQEI(I)=I
+ END IF
+ 232 CONTINUE
+ END IF
+ 231 CONTINUE
+C
+ IF(IC7RL.NE.0) THEN
+C
+C CLASS 7 SIGNIFYING
+C
+ IST=1
+ DO 233 IJ=1,IC7RL
+ III=IC7R(IJ)
+ DO 234 I=IST,IC7L
+ II=IC7(I)
+ IBITP=NBITP(II)
+ IWORD=NWORDP(II)
+
+ CALL BUNPCK(NBPW,KBUFF,IVAL,IWORD,IBITP,NWTDW(II),KERR)
+ IF(KERR.NE.0) THEN
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ CALL BUNPCK(NBPW,KBUFF,IDWINC,IWORD,IBITP,6,KERR)
+ IF(KERR.NE.0) THEN
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ CALL BUNPCK(NBPW,KBUFF,INC,IWORD,IBITP,IDWINC,KERR)
+ IF(INC.EQ.NMASK(IDWINC)) IVAL=NMASK(NWTDW(II))
+C
+ IF(IVAL.NE.NMASK(NWTDW(II))) THEN
+ ISCALE=NWTS(II)
+ IREF =NWTRV(II)
+ IVAL =IVAL+IREF+INC
+ VAL =RVIND
+ IF(IVAL.NE.NMASK(NWTDW(II))) THEN
+ IF(ISCALE.GT.0) THEN
+ VAL=IVAL/10.**ISCALE
+ ELSE
+ IISCALE=IABS(ISCALE)
+ VAL=IVAL*10.**IISCALE
+ END IF
+ END IF
+ ELSE
+ VAL=RVIND
+ END IF
+C
+ INEXT=IC7(I+1)-1
+ IF(IC7(I+1).LE.0) INEXT=MREL
+ IF(ABS(RQVAL(III)-VAL).LT.EPS.OR.
+ 1 ABS(RQVAL(III)-RVIND)/RVIND.LT.EPS) THEN
+ DO 236 KI=II,INEXT
+ IF(IB2.EQ.0) THEN
+ ORQEI=.TRUE.
+ IRQEI(KI)=KI
+ ELSE
+ IE=IC7R(IJ+1)-1
+ IF(IJ.EQ.IC7RL) IE=NRQL
+ IF(IC8RL.NE.0) THEN
+ DO 238 JA=1,IC8RL
+ IF(IC8R(JA).GT.III.AND.IC8R(JA).LT.IE) THEN
+ IE=IC8R(JA)-2
+ GO TO 298
+ END IF
+ 238 CONTINUE
+ END IF
+ 298 CONTINUE
+ DO 237 IK=III,IE
+ IF(NWTR(KI).EQ.NRQ(IK)) THEN
+ ORQEI=.TRUE.
+ IRQEI(KI)=KI
+ END IF
+ 237 CONTINUE
+ END IF
+ 236 CONTINUE
+C
+ GO TO 233
+ END IF
+ 234 CONTINUE
+ 233 CONTINUE
+C
+ END IF
+C
+ IF(IC8RL.NE.0) THEN
+C
+C CLASS 8 SIGNIFYING
+C
+ IST=1
+ DO 241 IJ=1,IC8RL
+ III=IC8R(IJ)
+ DO 242 I=IST,IC8L
+ II=IC8(I)
+ IBITP=NBITP(II)
+ IWORD=NWORDP(II)
+ CALL GBYTE(KBUFF(IWORD),IVAL,IBITP,NWTDW(II))
+ ISCALE=NWTS(II)
+ IREF =NWTRV(II)
+ IVAL =IVAL+IREF
+ VAL =RVIND
+ IF(IVAL.NE.NMASK(NWTDW(II))) THEN
+ IF(ISCALE.GT.0) THEN
+ VAL=IVAL/10.**ISCALE
+ ELSE
+ IISCALE=IABS(ISCALE)
+ VAL=IVAL*10.**IISCALE
+ END IF
+ END IF
+C
+ INEXT=IC8(I+1)-2
+ IF(IC8(I+1).EQ.0) INEXT=MREL
+C
+ OT=.FALSE.
+ IF(ABS(VAL-RVIND)/RVIND.LT.EPS) THEN
+ IVAL=NINT(VAL)
+ IRQV=NINT(RQVAL(III))
+C
+ IF(NWTR(II).EQ.008001) THEN
+ OT=.TRUE.
+ IF(IAND(IVAL,IRQV).NE.IRQV) OT=.FALSE.
+ ELSE
+ OT=.TRUE.
+ IF(ABS(VAL-RQVAL(III)).GT.EPS) OT=.FALSE.
+ END IF
+ END IF
+C
+ IF(OT) THEN
+ ICL=NWTR(II-1)/1000
+ IF(ICL.EQ.7) IRQEI(II-1)=II-1
+ DO 244 KI=II,INEXT
+ IF(IB2.EQ.0) THEN
+ ORQEI=.TRUE.
+ IRQEI(KI)=KI
+ ELSE
+ IE=IC8R(IJ+1)-1
+ IF(IJ.EQ.IC8RL) IE=NRQL
+ IF(IC7RL.NE.0) THEN
+ DO 248 JA=1,IC7RL
+ IF(IC7R(JA).GT.III.AND.IC7R(JA).LT.IE) THEN
+ IE=IC7R(JA)-1
+ GO TO 297
+ END IF
+ 248 CONTINUE
+ END IF
+ 297 CONTINUE
+ DO 245 IK=III,IE
+ IF(NWTR(KI).EQ.NRQ(IK)) THEN
+ ORQEI=.TRUE.
+ IRQEI(KI)=KI
+ END IF
+ 245 CONTINUE
+ END IF
+ 244 CONTINUE
+C
+ END IF
+ 242 CONTINUE
+ 241 CONTINUE
+C
+ END IF
+C
+ IF(.NOT.ORQEI) THEN
+ KERR=45
+ CALL BUERR(KERR)
+ M=0
+ RETURN
+ END IF
+C
+C
+C
+C* 3. FIND POINTERS TO QUALITY CONTROL,START OF DATA
+C ----------------------------------------------
+C PRESENT INDICATORS AND %CONFIDENCE.
+C -----------------------------------
+C
+ 300 CONTINUE
+C
+ I=0
+ IF(IB3.NE.0) THEN
+ I=I+1
+ ITYPE(I)=222000
+ END IF
+C
+ IF(IB4.NE.0) THEN
+ I=I+1
+ ITYPE(I)=224000
+ END IF
+C
+ IF(IB5.NE.0) THEN
+ I=I+1
+ ITYPE(I)=225000
+ END IF
+C
+ IF(IB6.NE.0) THEN
+ I=I+1
+ ITYPE(I)=223000
+ END IF
+C
+ KEND=I
+ IF(KEND.EQ.0) THEN
+ J=0
+ DO 4011 I=1,MREL
+ IF(IRQEI(I).NE.0) THEN
+ II=IRQEI(I)
+ J=J+1
+ INWORDP(J)=NWORDP(II)
+ INBITP(J)=NBITP(II)
+ INWTR(J)=NWTR(II)
+ INWTS(J)=NWTS(II)
+ INWTRV(J)=NWTRV(II)
+ INWTDW(J)=NWTDW(II)
+ INWTEN(J)=NWTEN(II)
+ CNAMES(J)=CWTEN(II)
+ CUNITS(J)=CWTU(II)
+ END IF
+ 4011 CONTINUE
+ GO TO 900
+ END IF
+C
+ OLIST=.FALSE.
+ O236=.FALSE.
+ O237=.FALSE.
+C
+ DO 500 KT=1,KEND
+ JQPR=0
+ JQUA=0
+ JQCA=0
+ JQC =0
+ JQCC=0
+ JQCS=0
+ KM=MREL
+C
+C
+C FIND POINTERS TO OPERATORS
+C
+ KZ=0
+ DO 3031 I=KM,M
+ IF(NWTR(I).EQ.ITYPE(KT)) THEN
+ KZ=KZ+1
+ NQP(KZ)=I
+ END IF
+ 3031 CONTINUE
+C
+ IF(KZ.EQ.0) THEN
+ WRITE(KNTN,*) ITYPE(KT),' NOT PRESENT IN THIS MESSAGE.'
+ GO TO 500
+ ELSE
+ KZ=KZ+1
+ NQP(KZ)=M
+ END IF
+C
+ DO 3033 KQ=1,KZ-1
+C
+ JQUA=NQP(KQ)
+C
+ IF(NWTR(JQUA+1).EQ.236000) THEN
+ JQ236=JQUA+1
+ O236=.TRUE.
+ END IF
+C
+ IF(NWTR(JQUA+1).EQ.237000) THEN
+ JQ237=JQUA+1
+ O237=.TRUE.
+ ELSE
+ O237=.FALSE.
+ END IF
+C
+C
+C DATA PRESENT INDICATOR
+C
+ IF(.NOT.O236.AND.O237) THEN
+C
+C FIND LAST DEFINED BIT MAP
+C
+ DO 420 I=JQUA,MREL,-1
+ IF(NWTR(I).EQ.236000) GO TO 421
+ 420 CONTINUE
+C
+ KERR=41
+ CALL BUERR(KERR)
+ RETURN
+C
+ 421 CONTINUE
+C
+ O236=.TRUE.
+ O237=.FALSE.
+ JQ236=I
+ JQ237=0
+ IK=I
+ IDPRF=0
+ DO 3015 I=IK,M
+ IF(NWTR(I).EQ.31031.OR.NWTR(I).EQ.31192) THEN
+ IDPRF=IDPRF+1
+ IF(IDPRF.EQ.1) JQPR=I
+ ELSE
+ IF(IDPRF.NE.0) GO TO 30111
+ END IF
+ 3015 CONTINUE
+C
+ 3016 CONTINUE
+ END IF
+C
+C DATA PRESENT INDICATOR
+C
+ IF(.NOT.O237) THEN
+ IDPRF=0
+ DO 301 I=JQUA,NQP(KQ+1)
+ IF(NWTR(I).EQ.31031.OR.NWTR(I).EQ.31192) THEN
+ IDPRF=IDPRF+1
+ IF(IDPRF.EQ.1) JQPR=I
+ ELSE
+ IF(IDPRF.NE.0) GO TO 30111
+ END IF
+ 301 CONTINUE
+ END IF
+C
+30111 CONTINUE
+C
+C GENERATING CENTRE
+C
+ DO 309 I=JQUA,NQP(KQ+1)
+ IF(NWTR(I).EQ.1031) THEN
+ JQCC=I
+ GO TO 302
+ END IF
+ 309 CONTINUE
+C
+ 302 CONTINUE
+C
+C GENERATING APPLICATION
+C
+ DO 307 I=JQUA,NQP(KQ+1)
+ IF(NWTR(I).EQ.1032.OR.NWTR(I).EQ.1201.OR.
+ 1 NWTR(I).EQ.63191) THEN
+ JQCA=I
+ GO TO 3071
+ END IF
+ 307 CONTINUE
+C
+ 3071 CONTINUE
+C
+C PERCENTAGE CONFIDENCE
+C
+ IF(ITYPE(KT).EQ.222000) THEN
+ DO 305 I=JQUA,NQP(KQ+1)
+ IF(NWTR(I)/1000.EQ.33.OR.NWTR(I).EQ.63192) THEN
+ JQC=I
+ GO TO 306
+ END IF
+ 305 CONTINUE
+ ELSE
+C SIGNIFICANCE
+C
+ DO 308 I=JQUA,NQP(KQ+1)
+ IF(NWTR(I)/1000.EQ.8) THEN
+ JQCS=I
+ GO TO 3088
+ END IF
+ 308 CONTINUE
+C
+ 3088 CONTINUE
+C
+ DO 3051 I=JQUA,NQP(KQ+1)
+ IF(NWTR(I).EQ.223255.OR.NWTR(I).EQ.224255.OR.
+ 1 NWTR(I).EQ.225255) THEN
+ JQC=I
+ GO TO 306
+ END IF
+ 3051 CONTINUE
+ END IF
+C
+C
+ 306 CONTINUE
+C
+C* 3.1 SET INDICES TO GET Q/C.
+C GET BIT MAP FROM DATA SECTION.
+C
+ 310 CONTINUE
+C
+ IF(JQUA.EQ.0) THEN
+ WRITE(KNTN,'(1H )')
+ WRITE(KNTN,'(1H ,A)') 'Q/C NOT PRESENT IN THIS BUFR MESSAGE.'
+ WRITE(KNTN,'(1H )')
+ ELSE
+C
+ IF(.NOT.O237) THEN
+C
+ KAK=0
+ IQPR=JQPR-1
+ DO 311 K=1,IDPRF
+ IQPR=IQPR+1
+ KAK=KAK+1
+ IWPT=NWORDP(IQPR)
+ IBPT=NBITP (IQPR)
+ CALL GBYTE(KBUFF(IWPT),IBVAL(KAK),IBPT,1)
+ 311 CONTINUE
+ END IF
+C
+ IDIF=MREL-IDPRF
+C
+ JS=0
+ IF(IDIF.NE.0) THEN
+ DO 313 I=1,IDIF
+ JS=JS+1
+ IQCDPI(JS)=0
+ 313 CONTINUE
+ END IF
+C
+ JQPRM1=JQPR-1
+ DO 314 I=1,IDPRF
+ JS=JS+1
+ IQCDPI(JS)=I+JQPRM1
+ 314 CONTINUE
+C
+ JS=0
+ IF(IDIF.NE.0) THEN
+ DO 315 I=1,IDIF
+ JS=JS+1
+ IQCI(JS)=0
+ 315 CONTINUE
+ END IF
+C
+ K=JQC-1
+ DO 317 I=1,IDPRF
+ OK=.TRUE.
+ JS=JS+1
+ IQCI(JS)=0
+ IF(IBVAL(I).EQ.0) THEN
+ IF(OK) K=K+1
+ IQCI(JS)=K
+ OK=.FALSE.
+ END IF
+ 317 CONTINUE
+C
+ END IF
+C
+C
+C* 4. CREATE REQUESTED ELEMENT LIST.
+C ------------------------------
+ 400 CONTINUE
+C
+ IF(.NOT.OLIST) THEN
+ IF(NREQ(2).EQ.0) NRQL=0
+ J=0
+ DO 401 I=1,MREL
+ IF(IRQEI(I).NE.0) THEN
+ II=IRQEI(I)
+ J=J+1
+ INBITP(J)=NBITP(II)
+ INWORDP(J)=NWORDP(II)
+ INWTR(J) =NWTR(II)
+ INWTS(J) =NWTS(II)
+ INWTRV(J) =NWTRV(II)
+ INWTDW(J) =NWTDW(II)
+ INWTEN(J) =NWTEN(II)
+ CNAMES(J)=CWTEN(II)
+ CUNITS(J)=CWTU(II)
+ OLIST=.TRUE.
+ END IF
+ 401 CONTINUE
+ END IF
+C
+ IF(JQUA.NE.0) THEN
+C
+C* 4.1 ADD DATA PRESENT INDICATOR AND Q/C.
+C -----------------------------------
+ 410 CONTINUE
+C
+C ADD OPERATOR 222000
+ J=J+1
+ INWORDP(J)=NWORDP(JQUA)
+ INBITP (J)=NBITP (JQUA)
+ INWTR(J) =NWTR(JQUA)
+ INWTS(J) =NWTS(JQUA)
+ INWTRV(J) =NWTRV(JQUA)
+ INWTDW(J) =NWTDW(JQUA)
+ INWTEN(J) =NWTEN(JQUA)
+ CNAMES(J)=CWTEN(JQUA)
+ CUNITS(J)=CWTU(JQUA)
+C
+ IF(O236.AND..NOT.O237) THEN
+ J=J+1
+ INWORDP(J)=NWORDP(JQ236)
+ INBITP (J)=NBITP (JQ236)
+ INWTR(J) =NWTR(JQ236)
+ INWTS(J) =NWTS(JQ236)
+ INWTRV(J) =NWTRV(JQ236)
+ INWTDW(J) =NWTDW(JQ236)
+ INWTEN(J) =NWTEN(JQ236)
+ CNAMES(J)=CWTEN(JQ236)
+ END IF
+C
+ IF(O237) THEN
+ J=J+1
+ INWORDP(J)=NWORDP(JQ237)
+ INBITP (J)=NBITP (JQ237)
+ INWTR (J) =NWTR (JQ237)
+ INWTS (J) =NWTS (JQ237)
+ INWTRV(J) =NWTRV(JQ237)
+ INWTDW(J) =NWTDW(JQ237)
+ INWTEN(J) =NWTEN(JQ237)
+ CNAMES(J)=CWTEN(JQ237)
+ CUNITS(J)=CWTU (JQ237)
+ END IF
+C
+ IF(.NOT.O237) THEN
+ DO 412 I=1,MREL
+ IF(IRQEI(I).NE.0) THEN
+ IF(IQCDPI(I).NE.0) THEN
+ J=J+1
+ INWORDP(J)=NWORDP(IQCDPI(I))
+ INBITP (J)=NBITP (IQCDPI(I))
+ INWTR(J) =NWTR(IQCDPI(I))
+ INWTS(J) =NWTS(IQCDPI(I))
+ INWTRV(J) =NWTRV(IQCDPI(I))
+ INWTDW(J) =NWTDW(IQCDPI(I))
+ INWTEN(J) =NWTEN(IQCDPI(I))
+ CNAMES(J)=CWTEN(IQCDPI(I))
+ CUNITS(J)=CWTU(IQCDPI(I))
+ END IF
+ END IF
+ 412 CONTINUE
+ END IF
+C
+C
+C GENERATING CENTRE
+C
+ IF(JQCC.NE.0) THEN
+ J=J+1
+ INWORDP(J)=NWORDP(JQCC)
+ INBITP (J)=NBITP (JQCC)
+ INWTR(J) =NWTR(JQCC)
+ INWTS(J) =NWTS(JQCC)
+ INWTRV(J) =NWTRV(JQCC)
+ INWTDW(J) =NWTDW(JQCC)
+ INWTEN(J) =NWTEN(JQCC)
+ CNAMES(J)=CWTEN(JQCC)
+ CUNITS(J)=CWTU(JQCC)
+ END IF
+C
+C Q/C APPLICATION
+C
+ IF(JQCA.NE.0) THEN
+ J=J+1
+ INWORDP(J)=NWORDP(JQCA)
+ INBITP (J)=NBITP (JQCA)
+ INWTR(J) =NWTR(JQCA)
+ INWTS(J) =NWTS(JQCA)
+ INWTRV(J) =NWTRV(JQCA)
+ INWTDW(J) =NWTDW(JQCA)
+ INWTEN(J) =NWTEN(JQCA)
+ CNAMES(J)=CWTEN(JQCA)
+ CUNITS(J)=CWTU(JQCA)
+ END IF
+C
+C SIGNIFICANCE
+C
+ IF(JQCS.NE.0) THEN
+ J=J+1
+ INWORDP(J)=NWORDP(JQCS)
+ INBITP (J)=NBITP (JQCS)
+ INWTR(J) =NWTR(JQCS)
+ INWTS(J) =NWTS(JQCS)
+ INWTRV(J) =NWTRV(JQCS)
+ INWTDW(J) =NWTDW(JQCS)
+ INWTEN(J) =NWTEN(JQCS)
+ CNAMES(J)=CWTEN(JQCS)
+ CUNITS(J)=CWTU(JQCS)
+ END IF
+C
+C
+C CLASS 33 ELEMENTS
+C
+ DO 415 I=1,MREL
+ IF(IRQEI(I).NE.0) THEN
+ OK=.TRUE.
+ IF(IQCI(I).NE.0) THEN
+ IF(OK) J=J+1
+ OK=.FALSE.
+ INWORDP(J)=NWORDP(IQCI(I))
+ INBITP (J)=NBITP (IQCI(I))
+ INWTR(J) =NWTR (IQCI(I))
+ INWTS(J) =NWTS (IQCI(I))
+ INWTRV(J) =NWTRV (IQCI(I))
+ INWTDW(J) =NWTDW (IQCI(I))
+ INWTEN(J) =NWTEN (IQCI(I))
+ CNAMES(J)=CWTEN (IQCI(I))
+ CUNITS(J)=CWTU (IQCI(I))
+ END IF
+ END IF
+ 415 CONTINUE
+ END IF
+ 3033 CONTINUE
+C
+C
+C* 5. MAKE ONE TO ONE CORRESPONDENCE BETWEEN ELEMENTS AND
+C Q/C,STATISTICS,DIFFERENCE STATISTICS OR SUBSTITUTED VALUES
+C LEAVING BEHIND DATA PRESENT INDICATORS.
+ 500 CONTINUE
+C
+C
+C* 9. UPDATE TOTAL NUMBER OF ELEMENTS.
+C --------------------------------
+ 900 CONTINUE
+C
+ M=J
+ NFCM=1
+ NFUCM=0
+C
+ RETURN
+C
+ END
diff --git a/bufrdc/burquc.F b/bufrdc/burquc.F
new file mode 100755
index 0000000..42838d6
--- /dev/null
+++ b/bufrdc/burquc.F
@@ -0,0 +1,1234 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BURQUC(KBUFL,KBUFF,KELEM,CNAMES,CUNITS,KSUP,KSEC3,KERR)
+C
+C**** *BURQUC*
+C
+C
+C PURPOSE.
+C --------
+C
+C CREATE PARAMETERS NEEDED FOR PARTIAL EXPANSION OF
+C BUFR MESSAGE ACCORDING TO REQUESTED INPUT LISTS.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BURQUC(KBUFL,KBUFF,KELEM,CNAMES,CUNITS,KSUP,KSEC3,KERR)*
+C
+C INPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C *KELEM* - DIMENSION OF CNAMES, CUNITS ARRAY
+C *CNAMES* - CHARACTER ARRAY CONTAINING ELEMENT NAMES
+C *CUNITS* - CHARACTER ARRAY CONTAINIG UNITS
+C *KSUP* - ARRAY CONTAINING SUPLEMENTARY INFORMATION
+C - KSUP( 1) -- IDIM1, DIMENSION OF KSEC1
+C - KSUP( 2) -- IDIM2, DIMENSION OF KSEC2
+C - KSUP( 3) -- IDIM3, DIMENSION OF KSEC3
+C - KSUP( 4) -- IDIM4, DIMENSION OF KSEC4
+C - KSUP( 5) -- M (NUMBER OF ELEMENTS IN VALUES ARRAY,
+C FIRST INDEX)
+C - KSUP( 6) -- N (NUMBER OF SUBSETS,SECOND INDEX OF
+C VALUES ARRAY)
+C - KSUP( 7) -- JVC (NUMBER OF ELEMENTS IN CVAL ARRAY)
+C - KSUP( 8) -- TOTAL BUFR MESSAGE LENGTH IN BYTES
+C - KSUP( 9) -- IDIM0, DIMENSION OF KSEC0
+C *KSEC3* - ARRAY CONTAINING SECTION 3 INFORMATION
+C KSEC3( 1)-- LENGTH OF SECTION 3 (BYTES)
+C KSEC3( 2)-- RESERVED
+C KSEC3( 3)-- NUMBER OF SUBSETS
+C KSEC3( 4)-- FLAG (DATA TYPE,DATA COMPRESSION)
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C WORD AND BIT POINTERS ARE CALCULATED FOR EVERY ELEMENT
+C IN THE EXPANDED LIST OF ELEMENTS. IF PARTIAL EXPANSION REQUESTED,
+C INDECES TO REQUIRED ELEMENTS ARE DETERMINED, AS WELL AS CORRESPONDING
+C QUALITY CONTROL, STATISTICS ETC. INFORMATION.
+C
+C
+C
+C EXTERNALS.
+C ----------
+C
+C BUNPCK - UNPACKS BIT PATTERN
+C BUNPKS - UNPACKS BIT PATTERN IN REPEATED WAY
+C BUPMRK - PROCES MARKER OPERATOR
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+# include "bcombef.F"
+# include "bcomwt.F"
+# include "bcomp.F"
+# include "bcomwtc.F"
+# include "bcomrq.F"
+# include "bcomreq.F"
+# include "bcomoff.F"
+C
+ CHARACTER CWTEN*64,CWTU*24
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+C
+ DIMENSION KBUFF(KBUFL)
+ DIMENSION KSUP(JSUP),KSEC3(JSEC3)
+C
+ DIMENSION IRQEI(JELEM),IQCI(JELEM),IQCDPI(JELEM)
+ DIMENSION IBVAL(JELEM),IBV(JELEM)
+ DIMENSION IC7(JELEM),IC8(JELEM),IC7R(JELEM),IC8R(JELEM)
+ DIMENSION NQP(JELEM),ITYPE(100)
+C
+ DIMENSION IMASK(8)
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+ REAL*8 RQVAL
+ REAL*8 VAL
+#else
+ REAL RVIND
+ REAL EPS
+ REAL RQVAL
+ REAL VAL
+#endif
+C
+ SAVE IBV,IBVAL
+C
+ DATA IMASK /1,2,4,8,16,32,64,128/
+C
+C
+C ------------------------------------------------------------------
+C
+C* 1. DEFINE WORD/BIT POINTERS TO EVERY ELEMENT.
+C ------------------------------------------
+ 100 CONTINUE
+C
+ NFUCM=1
+ NFCM=0
+C
+ IF(KERR.GT.0) RETURN
+C
+C CHECK REQUEST VALIDITY
+C
+ IF(NREQ(1).EQ.0.AND.NREQ(2).NE.0) THEN
+ KERR=38
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ MREL=0
+C
+ IBP32= 32 + NBPTB
+C
+ IB1=0
+ IF(IAND(NREQ(2),IMASK(1)).NE.0) IB1=1
+ IB2=0
+ IF(IAND(NREQ(2),IMASK(2)).NE.0) IB2=1
+ IB3=0
+ IF(IAND(NREQ(2),IMASK(3)).NE.0) IB3=1
+ IB4=0
+ IF(IAND(NREQ(2),IMASK(4)).NE.0) IB4=1
+ IB5=0
+ IF(IAND(NREQ(2),IMASK(5)).NE.0) IB5=1
+ IB6=0
+ IF(IAND(NREQ(2),IMASK(6)).NE.0) IB6=1
+C
+C
+C* 1.2 NON-COMPRESSED DATA.
+C --------------------
+ 120 CONTINUE
+C
+ IF(OMULTI) THEN
+C
+ N=1
+ DO 1221 I=1,N
+ IBIT=0
+ IF(NSUBSET.EQ.1) THEN
+ IBIT = IBIT + IBP32 ! beginning of first element
+ IWORD= IBIT/NBPW
+ ELSE
+ IBIT=NBP
+ END IF
+C
+ I1MK=(I-1)*KELEM
+ I1= 1+I1MK
+C
+ IF(NSUBSET.EQ.1) THEN
+ NBITP (I1)= IBIT - IWORD*NBPW
+ NWORDP(I1)= NWPTB + IWORD
+ ELSE
+ NWORDP(I1)= NWP
+ NBITP (I1)= NBP
+ IBIT= IBIT + NWP*NBPW
+ END IF
+C
+ DO 1231 J=2,M
+ IBIT = IBIT + NWTDW(J-1)
+ IWORD= IBIT/NBPW
+C
+ JI= J+I1MK
+C
+ NBITP (JI)= IBIT - IWORD*NBPW
+ IF(NSUBSET.EQ.1) THEN
+ NWORDP(JI)= NWPTB + IWORD
+ ELSE
+ NWORDP(JI)=IWORD
+ END IF
+ 1231 CONTINUE
+ 1221 CONTINUE
+
+ NSIZEG(NSUBSET)=M
+ ELSE
+ IBIT0= 0
+C
+ IF(N.GT.1) THEN
+ DO 121 J=1,M
+ IBIT0 = IBIT0 + NWTDW(J)
+ 121 CONTINUE
+ END IF
+C
+ DO 122 I=1,N
+ IBIT=0
+ IBIT=IBIT0*(I-1)
+ IBIT = IBIT + IBP32
+ IWORD= IBIT/NBPW
+C
+ I1MK=(I-1)*KELEM
+ I1= 1+I1MK
+C
+ NBITP (I1)= IBIT - IWORD*NBPW
+ NWORDP(I1)= NWPTB + IWORD
+C
+ DO 123 J=2,M
+ IBIT = IBIT + NWTDW(J-1)
+ IWORD= IBIT/NBPW
+C
+ JI= J+I1MK
+C
+ NBITP (JI)= IBIT - IWORD*NBPW
+ NWORDP(JI)= NWPTB + IWORD
+ 123 CONTINUE
+ 122 CONTINUE
+C
+ END IF
+C -----------------------------------------------------------------
+C* 2. CREATE POINTERS FOR REQUESTED ELEMENTS.
+C ---------------------------------------
+ 200 CONTINUE
+C
+C
+C* 2.1 CHECK IF SUBSET OF ELEMENTS REQUESTED.
+C
+ 210 CONTINUE
+C
+ IF(NREQ(1).EQ.0) THEN
+ DO 212 I=1,M
+ INWTEN(I)=NWTEN(I)
+ INWTR (I)=NWTR (I)
+ INWTS (I)=NWTS (I)
+ INWTDW(I)=NWTDW(I)
+ INWTRV(I)=NWTRV(I)
+ CNAMES(I)=CWTEN(I)
+ CUNITS(I)=CWTU(I)
+ DO 2128 J=1,N
+ JM1K=(J-1)*KELEM
+ JI=I+JM1K
+ INWORDP(JI)=NWORDP(JI)
+ INBITP(JI)=NBITP(JI)
+ 2128 CONTINUE
+ 212 CONTINUE
+ RETURN
+ END IF
+C
+ IF(NREQ(1).EQ.1) THEN
+ DO 213 I=1,M
+ IF(NWTR(I).GT.200000.AND.
+ 1 NWTR(I).NE.999999) THEN
+ MREL=I-1
+ GO TO 2133
+ END IF
+ 213 CONTINUE
+ MREL=M
+C
+ 2133 CONTINUE
+ J=0
+ IF(NREQ(2).EQ.0) THEN
+ DO 2131 I=1,MREL
+ J=J+1
+ DO 2132 K=1,N
+C
+ K1K=(K-1)*KELEM
+ JK=J+K1K
+ IK=I+K1K
+C
+ INBITP(JK)=NBITP(IK)
+ INWORDP(JK)=NWORDP(IK)
+ 2132 CONTINUE
+ INWTEN(J)=NWTEN(I)
+ INWTR(J)=NWTR(I)
+ INWTS(J)=NWTS(I)
+ INWTDW(J)=NWTDW(I)
+ INWTRV(J)=NWTRV(I)
+ CNAMES(J)=CWTEN(I)
+ CUNITS(J)=CWTU(I)
+ 2131 CONTINUE
+ M=J
+ RETURN
+ ELSE
+ M=MREL
+ GO TO 220
+ END IF
+C
+ END IF
+C
+ IF(NREQ(1).EQ.2) THEN
+ DO 214 I=1,M
+ IF(NWTR(I).EQ.235000) THEN
+ M=I-1
+ GO TO 2141
+ END IF
+ 214 CONTINUE
+C
+ 2141 CONTINUE
+C
+ J=0
+ IF(NREQ(2).EQ.0) THEN
+ DO 2142 I=1,M
+ J=J+1
+ DO 2143 K=1,N
+C
+ K1K=(K-1)*KELEM
+ JK=J+K1K
+ IK=I+K1K
+C
+ INBITP(JK)=NBITP(IK)
+ INWORDP(JK)=NWORDP(IK)
+ 2143 CONTINUE
+ INWTEN(J)=NWTEN(I)
+ INWTR(J)=NWTR(I)
+ INWTS(J)=NWTS(I)
+ INWTDW(J)=NWTDW(I)
+ INWTRV(J)=NWTRV(I)
+ CNAMES(J)=CWTEN(I)
+ CUNITS(J)=CWTU(I)
+ 2142 CONTINUE
+C
+ RETURN
+ ELSE
+ GO TO 220
+ END IF
+ END IF
+C
+ IF(NREQ(1).EQ.3) THEN
+ DO 215 I=1,M
+ IF(NWTR(I).EQ.235000) THEN
+C
+C COPY CLASS 1 - 8
+C
+ DO 2151 III=1,M
+ IF(NWTR(III).GT.8000) THEN
+ J=0
+ IF(NREQ(2).EQ.0) THEN
+ DO 2161 II=1,III-1
+ J=J+1
+ DO 2171 K=1,N
+ K1K=(K-1)*KELEM
+ JK=J+K1K
+ IIK=II+K1K
+ INBITP(JK)=NBITP(IIK)
+ INWORDP(JK)=NWORDP(IIK)
+ 2171 CONTINUE
+ INWTR(J) =NWTR(II)
+ INWTS(J) =NWTS(II)
+ INWTRV(J) =NWTRV(II)
+ INWTDW(J) =NWTDW(II)
+ INWTEN(J) =NWTEN(II)
+ CNAMES(J)=CWTEN(II)
+ CUNITS(J)=CWTU(II)
+ 2161 CONTINUE
+ GO TO 2160
+ ELSE
+ DO 21611 II=1,III-1
+ J=J+1
+ DO 21711 K=1,N
+ K1K=(K-1)*KELEM
+ JK=J+K1K
+ IIK=II+K1K
+ NBITP(JK)=NBITP(IIK)
+ NWORDP(JK)=NWORDP(IIK)
+21711 CONTINUE
+ NWTR(J) =NWTR(II)
+ NWTS(J) =NWTS(II)
+ NWTRV(J) =NWTRV(II)
+ NWTDW(J) =NWTDW(II)
+ NWTEN(J) =NWTEN(II)
+ CWTEN(J)=CWTEN(II)
+ CWTU(J)=CWTU(II)
+21611 CONTINUE
+ GO TO 2160
+ END IF
+ END IF
+ 2151 CONTINUE
+C----------------------------------------------------------------------
+ 2160 CONTINUE
+ IF(NREQ(2).EQ.0) THEN
+ DO 216 II=I+1,M
+ J=J+1
+ DO 217 K=1,N
+ K1K=(K-1)*KELEM
+ JK=J+K1K
+ IIK=II+K1K
+ INBITP(JK)=NBITP(IIK)
+ INWORDP(JK)=NWORDP(IIK)
+ 217 CONTINUE
+ INWTR(J) =NWTR(II)
+ INWTS(J) =NWTS(II)
+ INWTRV(J) =NWTRV(II)
+ INWTDW(J) =NWTDW(II)
+ INWTEN(J) =NWTEN(II)
+ CNAMES(J)=CWTEN(II)
+ CUNITS(J)=CWTU(II)
+ 216 CONTINUE
+ M=J
+ RETURN
+ ELSE
+ DO 2169 II=I+1,M
+ J=J+1
+ DO 2179 K=1,N
+ K1K=(K-1)*KELEM
+ JK=J+K1K
+ IIK=II+K1K
+ NBITP(JK)=NBITP(IIK)
+ NWORDP(JK)=NWORDP(IIK)
+ 2179 CONTINUE
+ NWTR(J) =NWTR(II)
+ NWTS(J) =NWTS(II)
+ NWTRV(J) =NWTRV(II)
+ NWTDW(J) =NWTDW(II)
+ NWTEN(J) =NWTEN(II)
+ CWTEN(J)=CWTEN(II)
+ CWTU(J)=CWTU(II)
+ 2169 CONTINUE
+ M=J
+ GO TO 220
+ END IF
+ END IF
+ 215 CONTINUE
+ KERR=39
+ CALL BUERR(KERR)
+ M=0
+ RETURN
+ ELSE
+ KERR=40
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+C
+C* 2.2 CREATE INDICES TO CLASS 7/8
+C ---------------------------
+ 220 CONTINUE
+C
+ DO 225 I=1,M
+ IF(NWTR(I).GT.200000.AND.
+ 1 NWTR(I).NE.999999) THEN
+ MREL=I-1
+ GO TO 226
+ END IF
+ 225 CONTINUE
+C
+ MREL=M
+C
+ 226 CONTINUE
+C
+ J=0
+ JJ=0
+ DO 221 I=1,MREL
+ ICLASS=NWTR(I)/1000
+ IF(ICLASS.EQ.7) THEN
+ J=J+1
+ IC7(J)=I
+ END IF
+C
+ IF(ICLASS.EQ.8) THEN
+ JJ=JJ+1
+ IC8(JJ)=I
+ END IF
+ 221 CONTINUE
+C
+ IC7L=J
+ IC8L=JJ
+ J=0
+ JJ=0
+ DO 223 I=1,NRQL
+ ICLASS=NRQ(I)/1000
+ IF(ICLASS.EQ.7.AND.(ABS(RQVAL(I)-RVIND)/RVIND.GT.EPS)) THEN
+ J=J+1
+ IC7R(J)=I
+ END IF
+C
+ IF(ICLASS.EQ.8.AND.(ABS(RQVAL(I)-RVIND)/RVIND.GT.EPS)) THEN
+ JJ=JJ+1
+ IC8R(JJ)=I
+ END IF
+ 223 CONTINUE
+C
+ IC7RL=J
+ IC8RL=JJ
+C
+C* 2.3 CREATE INDECES TO THE REQUESTED ELEMENTS.
+C -----------------------------------------
+ 230 CONTINUE
+C
+ IF(IC7RL.EQ.0.AND.IC8RL.EQ.0) THEN
+ IL=MREL
+ IRL=NRQL
+ END IF
+ IF(IC7RL.NE.0.AND.IC8RL.EQ.0) THEN
+ IL=IC7(1)
+ IRL=IC7R(1)-1
+ END IF
+ IF(IC8RL.NE.0.AND.IC7RL.EQ.0) THEN
+ IL=IC8(1)
+ IRL=IC8R(1)-1
+ END IF
+ IF(IC7RL.NE.0.AND.IC8RL.NE.0) THEN
+ IL=IC7(1)
+ IF(IC7(1).GT.IC8(1)) IL=IC8(1)
+ IRL=IC7R(1)
+ IF(IC7R(1).GT.IC8R(1)) IRL=IC8R(1)
+ IRL=IRL-1
+ END IF
+C
+ DO 299 I=1,MREL
+ IRQEI(I)=0
+ 299 CONTINUE
+C
+ ORQEI=.FALSE.
+ DO 231 I=1,IL
+ IF(IB2.EQ.0.OR.NRQL.EQ.0) THEN
+ ORQEI=.TRUE.
+ IRQEI(I)=I
+ ELSE
+ DO 232 K=1,IRL
+ IF(NWTR(I).EQ.NRQ(K)) THEN
+ ORQEI=.TRUE.
+ IRQEI(I)=I
+ END IF
+ 232 CONTINUE
+ END IF
+ 231 CONTINUE
+C
+C
+ IF(IC7RL.NE.0) THEN
+C
+C CLASS 7 SIGNIFYING
+C
+ IST=1
+ DO 233 IJ=1,IC7RL
+ III=IC7R(IJ)
+ DO 234 I=IST,IC7L
+ II=IC7(I)
+ IF(IC7R(IJ).EQ.IC7R(IJ+1)) THEN
+ IF(NWTR(II).NE.NWTR(II+1)) GO TO 234
+ END IF
+ IBITP=NBITP(II)
+ IWORD=NWORDP(II)
+ CALL GBYTE(KBUFF(IWORD),IVAL,IBITP,NWTDW(II))
+ ISCALE=NWTS(II)
+ IREF =NWTRV(II)
+ IVAL =IVAL+IREF
+ VAL =RVIND
+ IF(IVAL.NE.NMASK(NWTDW(II))) THEN
+ IF(ISCALE.GT.0) THEN
+ VAL=IVAL/10.**ISCALE
+ ELSE
+ IISCALE=IABS(ISCALE)
+ VAL=IVAL*10.**IISCALE
+ END IF
+ END IF
+C
+ INEXT=IC7(I+1)-1
+ IF(I.EQ.IC7L) INEXT=MREL
+C IF(IC7(I+1).EQ.0) INEXT=MREL
+ IF(ABS(RQVAL(III)-VAL).LT.EPS.OR.
+ 1 ABS(RQVAL(III)-RVIND)/RVIND.LT.EPS) THEN
+ DO 236 KI=II,INEXT
+ IF(IB2.EQ.0) THEN
+ ORQEI=.TRUE.
+ IRQEI(KI)=KI
+ ELSE
+ IE=IC7R(IJ+1)-1
+ IF(IJ.EQ.IC7RL) IE=NRQL
+ IF(IC8RL.NE.0) THEN
+ DO 238 JA=1,IC8RL
+ IF(IC8R(JA).GT.III.AND.IC8R(JA).LT.IE) THEN
+ IE=IC8R(JA)-2
+ GO TO 298
+ END IF
+ 238 CONTINUE
+ END IF
+ 298 CONTINUE
+ DO 237 IK=III,IE
+ IF(NWTR(KI).EQ.NRQ(IK)) THEN
+ ORQEI=.TRUE.
+ IRQEI(KI)=KI
+ END IF
+ 237 CONTINUE
+ END IF
+ 236 CONTINUE
+C
+ GO TO 233
+ END IF
+ 234 CONTINUE
+ 233 CONTINUE
+C
+ END IF
+C
+ IF(IC8RL.NE.0) THEN
+C
+C CLASS 8 SIGNIFYING
+C
+ IST=1
+ DO 241 IJ=1,IC8RL
+ III=IC8R(IJ)
+ DO 242 I=IST,IC8L
+ II=IC8(I)
+ IBITP=NBITP(II)
+ IWORD=NWORDP(II)
+ CALL GBYTE(KBUFF(IWORD),IVAL,IBITP,NWTDW(II))
+ ISCALE=NWTS(II)
+ IREF =NWTRV(II)
+ IVAL =IVAL+IREF
+ VAL =RVIND
+ IF(IVAL.NE.NMASK(NWTDW(II))) THEN
+ IF(ISCALE.GT.0) THEN
+ VAL=IVAL/10.**ISCALE
+ ELSE
+ IISCALE=IABS(ISCALE)
+ VAL=IVAL*10.**IISCALE
+ END IF
+ END IF
+C
+ INEXT=IC8(I+1)-2
+ IF(IC8(I+1).EQ.0) INEXT=MREL
+C
+ OT=.FALSE.
+ IF(ABS(VAL-RVIND)/RVIND.LT.EPS) THEN
+ IVAL=NINT(VAL)
+ IRQV=NINT(RQVAL(III))
+C
+ IF(NWTR(II).EQ.008001) THEN
+ OT=.TRUE.
+ IF(IAND(IVAL,IRQV).NE.IRQV) OT=.FALSE.
+ ELSE
+ OT=.TRUE.
+ IF(ABS(VAL-RQVAL(III)).GT.EPS) OT=.FALSE.
+ END IF
+ END IF
+C
+ IF(OT) THEN
+ ICL=NWTR(II-1)/1000
+ IF(ICL.EQ.7) IRQEI(II-1)=II-1
+ DO 244 KI=II,INEXT
+ IF(IB2.EQ.0) THEN
+ ORQEI=.TRUE.
+ IRQEI(KI)=KI
+ ELSE
+ IE=IC8R(IJ+1)-1
+ IF(IJ.EQ.IC8RL) IE=NRQL
+ IF(IC7RL.NE.0) THEN
+ DO 248 JA=1,IC7RL
+ IF(IC7R(JA).GT.III.AND.IC7R(JA).LT.IE) THEN
+ IE=IC7R(JA)-1
+ GO TO 297
+ END IF
+ 248 CONTINUE
+ END IF
+ 297 CONTINUE
+ DO 245 IK=III,IE
+ IF(NWTR(KI).EQ.NRQ(IK)) THEN
+ ORQEI=.TRUE.
+ IRQEI(KI)=KI
+ END IF
+ 245 CONTINUE
+ END IF
+ 244 CONTINUE
+C
+ END IF
+ 242 CONTINUE
+ 241 CONTINUE
+C
+ END IF
+C
+ IF(.NOT.ORQEI) THEN
+ KERR=45
+ CALL BUERR(KERR)
+ M=0
+ RETURN
+ END IF
+
+C
+C
+C* 3. FIND POINTERS TO QUALITY CONTROL,START OF DATA
+C ----------------------------------------------
+C PRESENT INDICATORS AND %CONFIDENCE.
+C -----------------------------------
+C
+ 300 CONTINUE
+C
+ I=0
+ IF(IB3.NE.0) THEN
+ I=I+1
+ ITYPE(I)=222000
+ END IF
+C
+ IF(IB4.NE.0) THEN
+ I=I+1
+ ITYPE(I)=224000
+ END IF
+C
+ IF(IB5.NE.0) THEN
+ I=I+1
+ ITYPE(I)=225000
+ END IF
+C
+ IF(IB6.NE.0) THEN
+ I=I+1
+ ITYPE(I)=223000
+ END IF
+C
+ KEND=I
+ IF(KEND.EQ.0) THEN
+ J=0
+ DO 4011 I=1,MREL
+ IF(IRQEI(I).NE.0) THEN
+ II=IRQEI(I)
+ J=J+1
+ DO 4021 K=1,N
+ K1K=(K-1)*KELEM
+ JK=J+K1K
+ IIK=II+K1K
+ INWORDP(JK)=NWORDP(IIK)
+ INBITP (JK)=NBITP (IIK)
+ 4021 CONTINUE
+ INWTR(J) =NWTR(II)
+ INWTS(J) =NWTS(II)
+ INWTRV(J) =NWTRV(II)
+ INWTDW(J) =NWTDW(II)
+ INWTEN(J) =NWTEN(II)
+ CNAMES(J)=CWTEN(II)
+ CUNITS(J)=CWTU(II)
+ END IF
+4011 CONTINUE
+ GO TO 900
+ END IF
+C
+ OLIST=.FALSE.
+ O236=.FALSE.
+ O237=.FALSE.
+C
+ DO 500 KT=1,KEND
+C
+ JQPR=0
+ JQUA=0
+ JQCA=0
+ JQC =0
+ JQCC=0
+ JQCS=0
+ KM=MREL
+C
+C FIND POINTERS TO OPERATORS
+C
+ KZ=0
+ DO 3031 I=KM,M
+ IF(NWTR(I).EQ.ITYPE(KT)) THEN
+ KZ=KZ+1
+ NQP(KZ)=I
+ END IF
+ 3031 CONTINUE
+C
+ IF(KZ.EQ.0) THEN
+ WRITE(KNTN,*) ITYPE(KT),' NOT PRESENT IN THIS MESSAGE.'
+ GO TO 500
+ ELSE
+ KZ=KZ+1
+ NQP(KZ)=M
+ END IF
+C
+ DO 3033 KQ=1,KZ-1
+C
+ JQUA=NQP(KQ)
+C
+ IF(NWTR(JQUA+1).EQ.236000) THEN
+ JQ236=JQUA+1
+ O236=.TRUE.
+ END IF
+C
+ IF(NWTR(JQUA+1).EQ.237000) THEN
+ JQ237=JQUA+1
+ O237=.TRUE.
+ ELSE
+ O237=.FALSE.
+ END IF
+C
+C
+C DATA PRESENT INDICATOR
+C
+ IF(.NOT.O236.AND.O237) THEN
+C
+C FIND LAST DEFINED BIT MAP
+C
+ DO 420 I=JQUA,MREL,-1
+ IF(NWTR(I).EQ.236000) GO TO 421
+ 420 CONTINUE
+C
+ KERR=41
+ CALL BUERR(KERR)
+ RETURN
+C
+ 421 CONTINUE
+C
+ O236=.TRUE.
+ O237=.FALSE.
+ JQ236=I
+ JQ237=0
+ IK=I
+ IDPRF=0
+ DO 3015 I=IK,M
+ IF(NWTR(I).EQ.31031.OR.NWTR(I).EQ.31192) THEN
+ IDPRF=IDPRF+1
+ IF(IDPRF.EQ.1) JQPR=I
+ ELSE
+ IF(IDPRF.NE.0) GO TO 30111
+ END IF
+ 3015 CONTINUE
+C
+ 3016 CONTINUE
+ END IF
+C
+C DATA PRESENT INDICATOR
+C
+ IF(.NOT.O237) THEN
+ IDPRF=0
+ DO 301 I=JQUA,NQP(KQ+1)
+ IF(NWTR(I).EQ.31031.OR.NWTR(I).EQ.31192) THEN
+ IDPRF=IDPRF+1
+ IF(IDPRF.EQ.1) JQPR=I
+ ELSE
+ IF(IDPRF.NE.0) GO TO 30111
+ END IF
+ 301 CONTINUE
+ END IF
+C
+30111 CONTINUE
+C
+C GENERATING CENTRE
+C
+ DO 309 I=JQUA,NQP(KQ+1)
+ IF(NWTR(I).EQ.1031) THEN
+ JQCC=I
+ GO TO 302
+ END IF
+ 309 CONTINUE
+C
+ 302 CONTINUE
+C
+C GENERATING APPLICATION
+C
+ DO 307 I=JQUA,NQP(KQ+1)
+ IF(NWTR(I).EQ.1032.OR.NWTR(I).EQ.1201.OR.
+ 1 NWTR(I).EQ.63191) THEN
+ JQCA=I
+ GO TO 3071
+ END IF
+ 307 CONTINUE
+C
+ 3071 CONTINUE
+C
+C PERCENTAGE CONFIDENCE
+C
+ IF(ITYPE(KT).EQ.222000) THEN
+ DO 305 I=JQUA,NQP(KQ+1)
+ IF(NWTR(I)/1000.EQ.33.OR.NWTR(I).EQ.63192) THEN
+ JQC=I
+ GO TO 306
+ END IF
+ 305 CONTINUE
+ ELSE
+C SIGNIFICANCE
+C
+ DO 308 I=JQUA,NQP(KQ+1)
+ IF(NWTR(I)/1000.EQ.8) THEN
+ JQCS=I
+ GO TO 3088
+ END IF
+ 308 CONTINUE
+C
+ 3088 CONTINUE
+
+ DO 3051 I=JQUA,NQP(KQ+1)
+ IF(NWTR(I).EQ.223255.OR.NWTR(I).EQ.224255.OR.
+ 1 NWTR(I).EQ.225255) THEN
+ JQC=I
+ GO TO 306
+ END IF
+ 3051 CONTINUE
+ END IF
+C
+C
+ 306 CONTINUE
+C
+C
+C* 3.1 SET INDICES TO GET Q/C.
+C GET BIT MAP FROM DATA SECTION.
+C
+ 310 CONTINUE
+C
+ IF(JQUA.EQ.0) THEN
+ WRITE(KNTN,'(1H )')
+ WRITE(KNTN,'(1H ,A)') 'Q/C NOT PRESENT IN THIS BUFR MESSAGE.'
+ WRITE(KNTN,'(1H )')
+ ELSE
+C
+ IF(.NOT.O237) THEN
+ DO 311 K=1,N
+C
+ K1K=(K-1)*KELEM
+ JQPRK=JQPR+K1K
+C
+ IWPT=NWORDP(JQPRK)
+ IBPT=NBITP (JQPRK)
+ CALL GBYTES(KBUFF(IWPT),IBV,IBPT,1,0,IDPRF)
+ DO 312 KA=1,IDPRF
+ KAK=KA+K1K
+ IBVAL(KAK)=IBV(KA)
+ 312 CONTINUE
+ 311 CONTINUE
+ END IF
+C
+ IDIF=MREL-IDPRF
+C
+ JS=0
+ IF(IDIF.NE.0) THEN
+ DO 313 I=1,IDIF
+ JS=JS+1
+ IQCDPI(JS)=0
+ 313 CONTINUE
+ END IF
+C
+ JQPRM1=JQPR-1
+ DO 314 I=1,IDPRF
+ JS=JS+1
+ IQCDPI(JS)=I+JQPRM1
+ 314 CONTINUE
+C
+ JS=0
+ IF(IDIF.NE.0) THEN
+ DO 315 I=1,IDIF
+ JS=JS+1
+ DO 316 JJ=1,N
+ JJJ=JS+(JJ-1)*KELEM
+ IQCI(JJJ)=0
+ 316 CONTINUE
+ 315 CONTINUE
+ END IF
+C
+ K=JQC-1
+ DO 317 I=1,IDPRF
+ OK=.TRUE.
+ JS=JS+1
+ DO 318 JJ=1,N
+ JJ1K=(JJ-1)*KELEM
+ JJJ=JS+JJ1K
+ IJJ=I+JJ1K
+ IQCI(JJJ)=0
+ IF(IBVAL(IJJ).EQ.0) THEN
+ IF(OK) K=K+1
+ IQCI(JJJ)=K
+ OK=.FALSE.
+ END IF
+ 318 CONTINUE
+ 317 CONTINUE
+C
+ END IF
+C
+C
+C 4. CREATE REQUESTED ELEMENT LIST
+C -----------------------------
+ 400 CONTINUE
+C
+ IF(.NOT.OLIST) THEN
+ IF(NREQ(2).EQ.0) NRQL=0
+ J=0
+ DO 401 I=1,MREL
+ IF(IRQEI(I).NE.0) THEN
+ II=IRQEI(I)
+ J=J+1
+ DO 402 K=1,N
+ K1K=(K-1)*KELEM
+ JK=J+K1K
+ IIK=II+K1K
+ INWORDP(JK)=NWORDP(IIK)
+ INBITP (JK)=NBITP (IIK)
+ 402 CONTINUE
+ INWTR(J) =NWTR(II)
+ INWTS(J) =NWTS(II)
+ INWTRV(J) =NWTRV(II)
+ INWTDW(J) =NWTDW(II)
+ INWTEN(J) =NWTEN(II)
+ CNAMES(J)=CWTEN(II)
+ CUNITS(J)=CWTU(II)
+ OLIST=.TRUE.
+ END IF
+ 401 CONTINUE
+ END IF
+C
+ IF(JQUA.NE.0) THEN
+C
+C* 4.1 ADD DATA PRESENT INDICATOR AND Q/C.
+C -----------------------------------
+ 410 CONTINUE
+C
+C ADD OPERATOR 222000
+C
+ J=J+1
+ DO 411 K=1,N
+C
+ K1K=(K-1)*KELEM
+ JK=J+K1K
+ JQUAK=JQUA+K1K
+C
+ INWORDP(JK)=NWORDP(JQUAK)
+ INBITP (JK)=NBITP (JQUAK)
+ 411 CONTINUE
+ INWTR(J) =NWTR(JQUA)
+ INWTS(J) =NWTS(JQUA)
+ INWTRV(J) =NWTRV(JQUA)
+ INWTDW(J) =NWTDW(JQUA)
+ INWTEN(J) =NWTEN(JQUA)
+ CNAMES(J)=CWTEN(JQUA)
+ CUNITS(J)=CWTU(JQUA)
+C
+ IF(O236.AND..NOT.O237) THEN
+ J=J+1
+ DO 4111 K=1,N
+ K1K=(K-1)*KELEM
+ JK=J+K1K
+ JQUAK=JQ236+K1K
+C
+ INWORDP(JK)=NWORDP(JQUAK)
+ INBITP (JK)=NBITP (JQUAK)
+ 4111 CONTINUE
+ INWTR(J) =NWTR(JQ236)
+ INWTS(J) =NWTS(JQ236)
+ INWTRV(J) =NWTRV(JQ236)
+ INWTDW(J) =NWTDW(JQ236)
+ INWTEN(J) =NWTEN(JQ236)
+ CNAMES(J)=CWTEN(JQ236)
+ CUNITS(J)=CWTU (JQ236)
+ END IF
+C
+ IF(O237) THEN
+ J=J+1
+ DO 4112 K=1,N
+ K1K=(K-1)*KELEM
+ JK=J+K1K
+ JQUAK=JQ237+K1K
+C
+ INWORDP(JK)=NWORDP(JQUAK)
+ INBITP (JK)=NBITP (JQUAK)
+ 4112 CONTINUE
+ INWTR (J) =NWTR (JQ237)
+ INWTS (J) =NWTS (JQ237)
+ INWTRV(J) =NWTRV(JQ237)
+ INWTDW(J) =NWTDW(JQ237)
+ INWTEN(J) =NWTEN(JQ237)
+ CNAMES(J)=CWTEN(JQ237)
+ CUNITS(J)=CWTU (JQ237)
+ END IF
+C
+ IF(.NOT.O237) THEN
+ DO 412 I=1,MREL
+ IF(IRQEI(I).NE.0) THEN
+ IF(IQCDPI(I).NE.0) THEN
+ J=J+1
+ DO 413 K=1,N
+C
+ K1K=(K-1)*KELEM
+ JK=J+K1K
+ IQCDK=IQCDPI(I)+K1K
+C
+ INWORDP(JK)=NWORDP(IQCDK)
+ INBITP (JK)=NBITP (IQCDK)
+ 413 CONTINUE
+ INWTR(J) =NWTR(IQCDPI(I))
+ INWTS(J) =NWTS(IQCDPI(I))
+ INWTRV(J) =NWTRV(IQCDPI(I))
+ INWTDW(J) =NWTDW(IQCDPI(I))
+ INWTEN(J) =NWTEN(IQCDPI(I))
+ CNAMES(J)=CWTEN(IQCDPI(I))
+ CUNITS(J)=CWTU(IQCDPI(I))
+ END IF
+ END IF
+ 412 CONTINUE
+ END IF
+C
+C GENERATING CENTRE
+C
+ IF(JQCC.NE.0) THEN
+ J=J+1
+ DO 417 K=1,N
+
+ K1K=(K-1)*KELEM
+ JK=J+K1K
+ JQCCK=JQCC+K1K
+C
+ INWORDP(JK)=NWORDP(JQCCK)
+ INBITP (JK)=NBITP (JQCCK)
+ 417 CONTINUE
+ INWTR(J) =NWTR(JQCC)
+ INWTS(J) =NWTS(JQCC)
+ INWTRV(J) =NWTRV(JQCC)
+ INWTDW(J) =NWTDW(JQCC)
+ INWTEN(J) =NWTEN(JQCC)
+ CNAMES(J)=CWTEN(JQCC)
+ CUNITS(J)=CWTU(JQCC)
+ END IF
+C
+C GENERATING APPLICATION
+C
+ IF(JQCA.NE.0) THEN
+ J=J+1
+ DO 414 K=1,N
+
+ K1K=(K-1)*KELEM
+ JK=J+K1K
+ JQCAK=JQCA+K1K
+C
+ INWORDP(JK)=NWORDP(JQCAK)
+ INBITP (JK)=NBITP (JQCAK)
+ 414 CONTINUE
+ INWTR(J) =NWTR(JQCA)
+ INWTS(J) =NWTS(JQCA)
+ INWTRV(J) =NWTRV(JQCA)
+ INWTDW(J) =NWTDW(JQCA)
+ INWTEN(J) =NWTEN(JQCA)
+ CNAMES(J)=CWTEN(JQCA)
+ CUNITS(J)=CWTU(JQCA)
+ END IF
+C
+C SIGNIFICANCE
+C
+ IF(JQCS.NE.0) THEN
+ J=J+1
+ DO 4147 K=1,N
+
+ K1K=(K-1)*KELEM
+ JK=J+K1K
+ JQCAK=JQCS+K1K
+C
+ INWORDP(JK)=NWORDP(JQCAK)
+ INBITP (JK)=NBITP (JQCAK)
+ 4147 CONTINUE
+ INWTR(J) =NWTR(JQCS)
+ INWTS(J) =NWTS(JQCS)
+ INWTRV(J) =NWTRV(JQCS)
+ INWTDW(J) =NWTDW(JQCS)
+ INWTEN(J) =NWTEN(JQCS)
+ CNAMES(J)=CWTEN(JQCS)
+ CUNITS(J)=CWTU(JQCS)
+ END IF
+C
+C CALSS 33 ELEMENTS
+C
+ DO 415 I=1,MREL
+ IF(IRQEI(I).NE.0) THEN
+ OK=.TRUE.
+ DO 416 JJ=1,N
+ JJ1K=(JJ-1)*KELEM
+ IJJ=I+JJ1K
+ IF(IQCI(IJJ).NE.0) THEN
+ IF(OK) J=J+1
+ OK=.FALSE.
+ INWTR(J) =NWTR (IQCI(IJJ))
+ INWTS(J) =NWTS (IQCI(IJJ))
+ INWTRV(J) =NWTRV (IQCI(IJJ))
+ INWTDW(J) =NWTDW (IQCI(IJJ))
+ INWTEN(J) =NWTEN (IQCI(IJJ))
+ CNAMES(J)=CWTEN (IQCI(IJJ))
+ CUNITS(J)=CWTU (IQCI(IJJ))
+C
+ JJJ=J+JJ1K
+ JQCIJJ=IQCI(IJJ)+JJ1K
+C
+ INWORDP(JJJ)=NWORDP(JQCIJJ)
+ INBITP (JJJ)=NBITP (JQCIJJ)
+ END IF
+ 416 CONTINUE
+C
+ END IF
+ 415 CONTINUE
+ END IF
+C
+ 3033 CONTINUE
+C
+ 500 CONTINUE
+C
+C* 5. MAKE ONE TO ONE CORRESPONDENCE BETWEEN ELEMENTS AND
+C Q/C,STATISTICS,DIFFERENCE STATISTICS OR SUBSTITUTED VALUES
+C LEAVING BEHIND DATA PRESENT INDICATORS.
+C
+ IF(IB3.NE.0) THEN
+ END IF
+C
+ IF(IB4.NE.0) THEN
+ END IF
+C
+ IF(IB5.NE.0) THEN
+ END IF
+C
+ IF(IB6.NE.0) THEN
+ END IF
+C
+C* 9. UPDATE TOTAL NUMBER OF ELEMENTS.
+C --------------------------------
+ 900 CONTINUE
+C
+ M=J
+ NFCM=0
+ NFUCM=1
+C
+ RETURN
+C
+ END
diff --git a/bufrdc/bus012.F b/bufrdc/bus012.F
new file mode 100755
index 0000000..f22da88
--- /dev/null
+++ b/bufrdc/bus012.F
@@ -0,0 +1,205 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUS012( KBUFL,KBUFF,KSUP,KSEC0,KSEC1,KSEC2,KERR)
+C
+C**** *BUS012*
+C
+C
+C PURPOSE.
+C --------
+C EXPANDS SECTION 0,1 AND 2 OF BUFR MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUS012( KBUFL,KBUFF,KSUP,KSEC0,KSEC1,KSEC2,KERR)*
+C
+C INPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C OUTPUT:
+C *KSUP* - ARRAY CONTAINING SUPLEMENTARY INFORMATION
+C - KSUP( 1) -- IDIM1, DIMENSION OF KSEC1
+C - KSUP( 2) -- IDIM2, DIMENSION OF KSEC2
+C - KSUP( 3) -- IDIM3, DIMENSION OF KSEC3
+C - KSUP( 4) -- IDIM4, DIMENSION OF KSEC4
+C - KSUP( 5) -- M (NUMBER OF ELEMENTS IN VALUES ARRAY,
+C FIRST INDEX)
+C - KSUP( 6) -- N (NUMBER OF SUBSETS,SECOND INDEX OF
+C VALUES ARRAY)
+C - KSUP( 7) -- JVC (NUMBER OF ELEMENTS IN CVAL ARRAY)
+C - KSUP( 8) -- TOTAL BUFR MESSAGE LENGTH IN BYTES
+C - KSUP( 9) -- IDIM0, DIMENSION OF KSEC0
+C *KSEC0* - ARRAY CONTAINING SECTION 0 INFORMATION
+C KSEC0( 1)-- LENGTH OF SECTION 0 (BYTES)
+C KSEC0( 2)-- TOTAL LENGTH OF BUFR MESSAGE (BYTES)
+C KSEC0( 3)-- BUFR EDITION NUMBER
+C *KSEC1* - ARRAY CONTAINING SECTION 1 INFORMATION
+C KSEC1( 1)-- LENGTH OF SECTION 1 (BYTES)
+C KSEC1( 2)-- BUFR EDITION NUMBER
+C KSEC1( 3)-- ORIGINATING CENTRE
+C KSEC1( 4)-- UPDATE SEQUENCE NUMBER
+C KSEC1( 5)-- FLAG (PRESENCE OF SECTION 2)
+C KSEC1( 6)-- BUFR MESSAGE TYPE
+C KSEC1( 7)-- BUFR MESSAGE SUBTYPE
+C KSEC1( 8)-- VERSION NUMBER OF LOCAL TABLE USED
+C KSEC1( 9)-- YEAR
+C KSEC1(10)-- MONTH
+C KSEC1(11)-- DAY
+C KSEC1(12)-- HOUR
+C KSEC1(13)-- MINUTE
+C KSEC1(14)-- BUFR MASTER TABLE
+C KSEC1(15)-- VERSION NUMBER OF MASTER TABLE USED
+C
+C FOR BUFR EDITION 3 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- NOT USED
+C KSEC1(18) TO KSEC1(JSEC1) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 4 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- INTERNATIONAL SUB-CATEGORY (SEE COMMON TABLE C-13
+C KSEC1(18)-- SECOND
+C KSEC1(19)-- YEAR
+C KSEC1(20)-- MONTH
+C KSEC1(21)-- DAY
+C KSEC1(22)-- HOUR
+C KSEC1(23)-- MINUTE
+C KSEC1(24)-- SECOND
+C KSEC1(25)-- YEAR
+C KSEC1(26)-- MONTH
+C KSEC1(27)-- DAY
+C KSEC1(28)-- HOUR
+C KSEC1(29)-- MINUTE
+C KSEC1(30)-- SECOND
+C KSEC1(31)-- MOST SOUTHERN LATITUDE (-90 to 90)
+C KSEC1(32)-- MOST WESTERN LONGITUDE ( 0-360)
+C KSEC1(33)-- MOST NORTHEN LATITUDE (-90 to 90)
+C KSEC1(34)-- MOST EASTERN LONGITUDE ( 0-360)
+C KSEC1(35) TO KSEC1(JSEC1) - LOCAL ADP CENTRE INFORMATION(PACKED FORM)
+C
+C *KSEC2* - ARRAY CONTAINING SECTION 2 INFORMATION
+C KSEC2( 1)-- LENGTH OF SECTION 2 (BYTES)
+C KSEC2( 2) TO KSEC2(47) RDB KEY
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C --------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C BUEXS0 - UNPACK SECTION 0
+C BUEXS1 - UNPACK SECTION 1
+C BUEXS2 - UNPACK SECTION 2
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/07/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+# include "bcomwt.F"
+# include "bcomdefc.F"
+# include "bcomreq.F"
+C
+ DIMENSION KBUFF(KBUFL)
+ DIMENSION KSUP(*),KSEC0(*),KSEC1(*)
+ DIMENSION KSEC2(*)
+ DIMENSION KSEC3(JSEC3)
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+ REAL*8 RQVAL
+#else
+ REAL RVIND
+ REAL EPS
+ REAL RQVAL
+#endif
+C
+ CHARACTER*4 CECMWF,CUSER
+C
+C ------------------------------------------------------------------
+C* 1. SET CONSTANTS.
+C --------------
+ 100 CONTINUE
+C
+ KERR=0
+C
+ IF(CECMWF.NE.'ECMF') THEN
+ CALL BUEVAR(KERR)
+ CECMWF='ECMF'
+ END IF
+C
+ IF(CUSER.NE.'USER') THEN
+ NREQ(1)=0
+ NREQ(2)=0
+ NRQL=0
+ END IF
+C -----------------------------------------------------------------
+C
+C* 2. EXPAND SECTION 0.
+C -----------------
+ 200 CONTINUE
+C
+ CALL BUEXS0( KBUFL,KBUFF,KSUP,KSEC0,KERR )
+ IF(KERR.GT.0) RETURN
+C
+C ------------------------------------------------------------------
+C
+C* 3. EXPAND SECTION 1.
+C ------------------
+ 300 CONTINUE
+C
+ CALL BUEXS1( KBUFL,KBUFF,KSUP,KSEC0,KSEC1,KERR )
+ IF(KERR.GT.0) RETURN
+C
+C ------------------------------------------------------------------
+C
+C* 4. EXPAND SECTION 2.
+C -----------------
+ 400 CONTINUE
+C
+ CALL BUEXS2( KBUFL,KBUFF,KSUP,KSEC1,KSEC2,KERR )
+ IF(KERR.GT.0) RETURN
+C
+C* 5. EXPAND SECTION 3 (PRELIMINARY ITEMS).
+C -------------------------------------
+ 500 CONTINUE
+C
+ CALL BUEXS3P(KBUFL,KBUFF,KSUP,KSEC3,KERR)
+C
+ RETURN
+ END
diff --git a/bufrdc/bus0123.F b/bufrdc/bus0123.F
new file mode 100755
index 0000000..fe82ff9
--- /dev/null
+++ b/bufrdc/bus0123.F
@@ -0,0 +1,212 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUS0123( KBUFL,KBUFF,KSUP,KSEC0,KSEC1,KSEC2,
+ 1 KSEC3,KERR)
+C
+C**** *BUS0123*
+C
+C
+C PURPOSE.
+C --------
+C EXPANDS SECTION 0,1,2 AND 3 OF BUFR MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUS0123( KBUFL,KBUFF,KSUP,KSEC0,KSEC1,KSEC2,KSEC3,KERR)*
+C
+C INPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C OUTPUT:
+C *KSUP* - ARRAY CONTAINING SUPLEMENTARY INFORMATION
+C - KSUP( 1) -- IDIM1, DIMENSION OF KSEC1
+C - KSUP( 2) -- IDIM2, DIMENSION OF KSEC2
+C - KSUP( 3) -- IDIM3, DIMENSION OF KSEC3
+C - KSUP( 4) -- IDIM4, DIMENSION OF KSEC4
+C - KSUP( 5) -- M (NUMBER OF ELEMENTS IN VALUES ARRAY,
+C FIRST INDEX)
+C - KSUP( 6) -- N (NUMBER OF SUBSETS,SECOND INDEX OF
+C VALUES ARRAY)
+C - KSUP( 7) -- JVC (NUMBER OF ELEMENTS IN CVAL ARRAY)
+C - KSUP( 8) -- TOTAL BUFR MESSAGE LENGTH IN BYTES
+C - KSUP( 9) -- IDIM0, DIMENSION OF KSEC0
+C *KSEC0* - ARRAY CONTAINING SECTION 0 INFORMATION
+C KSEC0( 1)-- LENGTH OF SECTION 0 (BYTES)
+C KSEC0( 2)-- TOTAL LENGTH OF BUFR MESSAGE (BYTES)
+C KSEC0( 3)-- BUFR EDITION NUMBER
+C *KSEC1* - ARRAY CONTAINING SECTION 1 INFORMATION
+C KSEC1( 1)-- LENGTH OF SECTION 1 (BYTES)
+C KSEC1( 2)-- BUFR EDITION NUMBER
+C KSEC1( 3)-- ORIGINATING CENTRE
+C KSEC1( 4)-- UPDATE SEQUENCE NUMBER
+C KSEC1( 5)-- FLAG (PRESENCE OF SECTION 2)
+C KSEC1( 6)-- BUFR MESSAGE TYPE
+C KSEC1( 7)-- BUFR MESSAGE SUBTYPE
+C KSEC1( 8)-- VERSION NUMBER OF LOCAL TABLE USED
+C KSEC1( 9)-- YEAR
+C KSEC1(10)-- MONTH
+C KSEC1(11)-- DAY
+C KSEC1(12)-- HOUR
+C KSEC1(13)-- MINUTE
+C KSEC1(14)-- BUFR MASTER TABLE
+C KSEC1(15)-- VERSION NUMBER OF MASTER TABLE USED
+C
+C FOR BUFR EDITION 3 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- NOT USED
+C KSEC1(18) TO KSEC1(JSEC1) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 4 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- INTERNATIONAL SUB-CATEGORY (SEE COMMON TABLE C-13
+C KSEC1(18)-- SECOND
+C KSEC1(19)-- YEAR
+C KSEC1(20)-- MONTH
+C KSEC1(21)-- DAY
+C KSEC1(22)-- HOUR
+C KSEC1(23)-- MINUTE
+C KSEC1(24)-- SECOND
+C KSEC1(25)-- YEAR
+C KSEC1(26)-- MONTH
+C KSEC1(27)-- DAY
+C KSEC1(28)-- HOUR
+C KSEC1(29)-- MINUTE
+C KSEC1(30)-- SECOND
+C KSEC1(31)-- MOST SOUTHERN LATITUDE (-90 to 90)
+C KSEC1(32)-- MOST WESTERN LONGITUDE ( 0-360)
+C KSEC1(33)-- MOST NORTHEN LATITUDE (-90 to 90)
+C KSEC1(34)-- MOST EASTERN LONGITUDE ( 0-360)
+C KSEC1(35) TO KSEC1(JSEC1) - LOCAL ADP CENTRE INFORMATION(PACKED FORM)
+C
+C *KSEC2* - ARRAY CONTAINING SECTION 2 INFORMATION
+C KSEC2( 1)-- LENGTH OF SECTION 2 (BYTES)
+C KSEC2( 2) TO KSEC2(47) RDB KEY
+C *KSEC3* - ARRAY CONTAINING SECTION 3 INFORMATION
+C KSEC3( 1)--
+C KSEC3( 2)--
+C KSEC3( 3)--
+C KSEC3( 4)--
+C
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C --------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C BUEXS0 - UNPACK SECTION 0
+C BUEXS1 - UNPACK SECTION 1
+C BUEXS2 - UNPACK SECTION 2
+C BUEXS3 - UNPACK SECTION 3
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/07/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+# include "bcomwt.F"
+# include "bcomdefc.F"
+# include "bcomreq.F"
+C
+ DIMENSION KBUFF(KBUFL)
+ DIMENSION KSUP(*),KSEC0(*),KSEC1(*)
+ DIMENSION KSEC2(*),KSEC3(*)
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+ REAL*8 RQVAL
+#else
+ REAL RVIND
+ REAL EPS
+ REAL RQVAL
+#endif
+C
+ CHARACTER*4 CECMWF,CUSER
+C
+C ------------------------------------------------------------------
+C* 1. SET CONSTANTS.
+C --------------
+ 100 CONTINUE
+C
+ KERR=0
+C
+ IF(CECMWF.NE.'ECMF') THEN
+ CALL BUEVAR(KERR)
+ CECMWF='ECMF'
+ END IF
+C
+ IF(CUSER.NE.'USER') THEN
+ NREQ(1)=0
+ NREQ(2)=0
+ NRQL=0
+ END IF
+C -----------------------------------------------------------------
+C
+C* 2. EXPAND SECTION 0.
+C -----------------
+ 200 CONTINUE
+C
+ CALL BUEXS0( KBUFL,KBUFF,KSUP,KSEC0,KERR )
+ IF(KERR.GT.0) RETURN
+C
+C ------------------------------------------------------------------
+C
+C* 3. EXPAND SECTION 1.
+C ------------------
+ 300 CONTINUE
+C
+ CALL BUEXS1( KBUFL,KBUFF,KSUP,KSEC0,KSEC1,KERR )
+ IF(KERR.GT.0) RETURN
+C
+C ------------------------------------------------------------------
+C
+C* 4. EXPAND SECTION 2.
+C -----------------
+ 400 CONTINUE
+C
+ CALL BUEXS2( KBUFL,KBUFF,KSUP,KSEC1,KSEC2,KERR )
+ IF(KERR.GT.0) RETURN
+C
+C* 5. EXPAND SECTION 3 (PRELIMINARY ITEMS).
+C -------------------------------------
+ 500 CONTINUE
+C
+ CALL BUEXS3P(KBUFL,KBUFF,KSUP,KSEC3,KERR)
+C
+ RETURN
+ END
diff --git a/bufrdc/busbytesR4.F b/bufrdc/busbytesR4.F
new file mode 100755
index 0000000..6afe03d
--- /dev/null
+++ b/bufrdc/busbytesR4.F
@@ -0,0 +1,63 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUSBYTESR4(DESTINATION,KSOURCE,KSKIP,KWIDTH,
+ 1 KSKIPBETWEEN,KNUMBER)
+C
+C**** *BUSBYTESR4*
+C
+C
+C PURPOSE.
+C --------
+C
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JULY 2008
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+
+ REAL*4 DESTINATION
+
+ CALL SBYTES(DESTINATION,KSOURCE,KSKIP,KWIDTH,KSKIPBETWEEN,KNUMBER)
+ RETURN
+ END
diff --git a/bufrdc/busbytesR8.F b/bufrdc/busbytesR8.F
new file mode 100755
index 0000000..e8734ae
--- /dev/null
+++ b/bufrdc/busbytesR8.F
@@ -0,0 +1,63 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUSBYTESR8(DESTINATION,KSOURCE,KSKIP,KWIDTH,
+ 1 KSKIPBETWEEN,KNUMBER)
+C
+C**** *BUSBYTESR8*
+C
+C
+C PURPOSE.
+C --------
+C
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JULY 2008
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+
+ REAL*8 DESTINATION
+
+ CALL SBYTES(DESTINATION,KSOURCE,KSKIP,KWIDTH,KSKIPBETWEEN,KNUMBER)
+ RETURN
+ END
diff --git a/bufrdc/busel.F b/bufrdc/busel.F
new file mode 100755
index 0000000..a0737c2
--- /dev/null
+++ b/bufrdc/busel.F
@@ -0,0 +1,96 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUSEL(KTDLEN,KTDLST,KTDEXL,KTDEXP,KERR)
+C
+C**** *BUSEL*
+C
+C
+C PURPOSE.
+C --------
+C RETURNS LIST OF DATA DESCRIPTORS AS IN SECTION 3 OF BUFR
+C MESSAGE AND TOTAL/REQUESTED LIST OF ELEMENTS.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUSEL(KTDLEN,KTDLST,KTDEXL,KTDEXP,KERR)*
+C
+C
+C OUTPUT:
+C *KTDLEN* - NUMBER OF DATA DESCRIPTORS IN SECTION 3
+C *KTDLST* - ARRAY CONTAINING DATA DESCRIPTORS IN SECTION 3
+C *KTDEXL* - NUMBER OF ENTRIES IN LIST OF EXPANDED DATA
+C DESCRIPTORS
+C *KTDEXP* - ARRAY CONTAINIG EXPANDED DATA DESCRIPTORS
+C *KERR* - RETURNED ERROR CODE
+C
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomel.F"
+C
+ DIMENSION KTDLST(*),KTDEXP(*)
+C
+C
+C -----------------------------------------------------------------
+
+C* 1. PUT LIST OF ELEMENTS FROM COMMON BLOCK
+C --------------------------------------
+C TO REQUESTED ARRAYS.
+C --------------------
+ 100 CONTINUE
+C
+ KERR=0
+C
+ KTDLEN=NTDLEN
+ KTDEXL=NTDEXL
+C
+ DO 101 I=1,NTDLEN
+ KTDLST(I)=NTDLST(I)
+ 101 CONTINUE
+C
+ DO 102 I=1,NTDEXL
+ KTDEXP(I)=NTDEXP(I)
+ 102 CONTINUE
+C
+ RETURN
+ END
diff --git a/bufrdc/busel2.F b/bufrdc/busel2.F
new file mode 100755
index 0000000..862cf16
--- /dev/null
+++ b/bufrdc/busel2.F
@@ -0,0 +1,115 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUSEL2(KSUBSET,KELEM,KTDLEN,KTDLST,KTDEXL,KTDEXP,
+ 1 CNAMES,CUNITS,KERR)
+C
+C**** *BUSEL2*
+C
+C
+C PURPOSE.
+C --------
+C RETURNS LIST OF DATA DESCRIPTORS AS IN SECTION 3 OF BUFR
+C MESSAGE AND TOTAL/REQUESTED LIST OF ELEMENTS, NAMES, UNITS.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUSEL2(KSUBSET,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+C CUNITS,CVALS,KERR)*
+C
+C
+C OUTPUT:
+C *KTDLEN* - NUMBER OF DATA DESCRIPTORS IN SECTION 3
+C *KTDLST* - ARRAY CONTAINING DATA DESCRIPTORS IN SECTION 3
+C *KTDEXL* - NUMBER OF ENTRIES IN LIST OF EXPANDED DATA
+C DESCRIPTORS
+C *KTDEXP* - ARRAY CONTAINIG EXPANDED DATA DESCRIPTORS
+C *CNAMES* - ARRAY CONTAINING ELEMENT NAMES
+C *CUNITS* - ARRAY CONTAINING ELEMENT UNITS
+C *KERR* - RETURNED ERROR CODE
+C
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/01/2006.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomel.F"
+# include "bcomoff.F"
+C
+ DIMENSION KTDLST(*),KTDEXP(*)
+C
+ CHARACTER*64 CNAMES(*)
+ CHARACTER*24 CUNITS(*)
+C
+C -----------------------------------------------------------------
+
+C* 1. PUT LIST OF ELEMENTS FROM COMMON BLOCK
+C --------------------------------------
+C TO REQUESTED ARRAYS.
+C --------------------
+ 100 CONTINUE
+C
+ KERR=0
+C
+ KTDLEN=NTDLEN
+C
+ DO 101 I=1,NTDLEN
+ KTDLST(I)=NTDLST(I)
+ 101 CONTINUE
+C
+ IF(OMULTI) THEN
+ NTDEXL=NSIZE(KSUBSET)
+ KTDEXL=NTDEXL
+ IJ=(KSUBSET-1)*KELEM
+ ELSE
+ NTDEXL=NSIZE(1)
+ KTDEXL=NTDEXL
+ IJ=0
+ END IF
+
+C
+ DO 102 I=1,NTDEXL
+ IIJ=I+IJ
+ KTDEXP(I)=NWTRG(IIJ)
+ CALL GET_NAME_UNIT(KTDEXP(I),CNAMES(I),CUNITS(I))
+ 102 CONTINUE
+C
+ RETURN
+ END
diff --git a/bufrdc/buset.F b/bufrdc/buset.F
new file mode 100755
index 0000000..fac6b62
--- /dev/null
+++ b/bufrdc/buset.F
@@ -0,0 +1,93 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUSET(KPMISS,KPRUS,KOKEY,KOFL,K1,K2,K3,K4)
+C
+C**** *BUSET*
+C
+C
+C PURPOSE.
+C --------
+C SETS VARIABLE KPMISS,KPRUS,KOKEY,KOFL INTO COMMON BLOCK.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUSET(KPMISS,KPRUS,KOKEY,KOFL,K1,K2,K3,K4)*
+C
+C INPUT :
+C *KPMISS* - INTEGER VARIABLE
+C 0 - DEFAULT, PAKS MAX VALUE FOR DATA WIDTH -1 BITS.
+C
+C 1 - PAKS VALUE AS MISSING VALUE
+C *KPRUS* - AN INTEGER
+C 1 - ALWAYS RECALCULATE POINTERS
+C *KOKEY* - 0 - DEFAULT, PACKS ECMWF RDB KEY
+C 1 - PACKS SECTION 2 IF NEEDED BUT NOT LENGTH
+C OF BUFR MESSAGE IN KEY
+C *KOFL* - 0 - NO CHECK ON VALUES
+C 1 - CHECK ON VALUES
+C
+C
+C METHOD.
+C -------
+C
+C DURING PACKING THE VALUE TO BE PACKED CAN HAPPEN TO BE TOO BIG
+C TO FIT INTO CORRESPONDING DATA WIDTH. THIS SUBROUTINE ALLOWS USER
+C TO CHOSE BETWEEN:
+C
+C 1) PACK BIG VALUE AS MAX VALUE REPRESENTED WITH DATA WIDTH -1
+C BITS (DEFAULT)
+C 2) PACK BIG VALUE AS MISSING VALUE
+C
+C EXTERNALS.
+C ----------
+C
+C NONE
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/01/95.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+# include "bcprq.F"
+C
+C ------------------------------------------------------------------
+C
+C* 1. SET CONSTANTS.
+C --------------
+ 100 CONTINUE
+C
+ IF(KPMISS.LT.0.AND.KPMISS.GT.1) KPMISS=0
+ IF(KPRUS.LT.0.AND.KPRUS.GT.1) KPRUS=0
+ IF(KOKEY.LT.0.AND.KOKEY.GT.1) NOKEY=0
+ IF(KOFL.LT.0.AND.KOFL.GT.1) NOFL=0
+ NPMISS=KPMISS
+ NPRUS=KPRUS
+ NOKEY=KOKEY
+ NOFL=KOFL
+C
+ RETURN
+ END
diff --git a/bufrdc/busrp.F b/bufrdc/busrp.F
new file mode 100755
index 0000000..bd915ac
--- /dev/null
+++ b/bufrdc/busrp.F
@@ -0,0 +1,465 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUSRP(KBUFL,KBUFF,KSEC3,KJ,KJ1,KDD,KSTACK,KELEM,KERR)
+C
+C**** *BUSRP*
+C
+C
+C PURPOSE.
+C --------
+C RESOLVE DATA DESCRIPTOR REPLICATION PROBLEM.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUSRP(KBUFL,KBUFF,KSEC3,KJ,KJ1,KDD,KSTACK,KELEM,KERR)*
+C
+C INPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C *KSEC3* - ARRAY CONTAINIG SECTION 3 INFORMATION
+C *KELEM* - DIMENSION OF CNAMES, CUNITS ARRAY
+C *KDD* - DATA DESCRIPTOR
+C OUTPUT:
+C *KJ* - POINTER TO KSTACK ARRAY
+C *KJ1* - POINTER TO LAST ELEMENT IN KSTACK
+C *KSTACK* - LIST OF DATA DESCRIPTORS
+C *KERR* - RETURN CODE
+C
+C METHOD.
+C -------
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C BUSTDR - RESOLVE TABLE D REFERENCE
+C BUUPWT - UPDATE WORKING TABLES
+C GBYTE - UNPACK BIT PATTERN
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ CHARACTER CWTEN*64,CWTU*24
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+# include "bcomwt.F"
+# include "bcomwtc.F"
+# include "bcombef.F"
+# include "bcomoff.F"
+C
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+ DIMENSION KBUFF(KBUFL),ILIST(JELEM)
+ DIMENSION KSTACK(*),KSEC3(JSEC3),IMASK(8)
+C
+ DATA IMASK/1,2,4,8,16,32,64,128/
+C
+C ------------------------------------------------------------------
+C
+C* 1. STORE K, NUMBER OF DESCRIPTORS TO BE REPLICATED.
+C ------------------------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ IF = KDD / 100000
+ IDIF= KDD - IF * 100000
+ IX = IDIF / 1000
+ IY = IDIF - IX * 1000
+ K = IX
+C
+ IF(IY.EQ.0) ODREPF=.TRUE.
+C
+C* 1.1 DELAYED REPLICATION ?
+C ---------------------
+ 110 CONTINUE
+C
+ IF( IY .NE. 0 ) THEN
+C
+C* 1.2 STORE NUMBER OF DESCRIPTORS, K, AND REPLICATION
+C -----------------------------------------------
+C FACTOR JR.
+C ----------
+ 120 CONTINUE
+C
+C K = IX
+ JR = IY
+ GO TO 500
+ END IF
+C
+C ------------------------------------------------------------------
+C
+C* 2. GET NEXT DESCRIPTOR.
+C --------------------
+ 200 CONTINUE
+C
+ KJ =KJ + 1
+ KDD= KSTACK(KJ)
+C
+C ------------------------------------------------------------------
+C
+C* 2.1 REPLICATION FACTOR ?
+C --------------------
+ 210 CONTINUE
+C
+ IF(KDD.NE.31001.AND.KDD.NE.31002.AND.
+ 1 KDD.NE.31000.AND.
+ 1 KDD.NE.31011.AND.KDD.NE.31012 )THEN
+
+C
+C* 2.1.1 SEQUENCE DESCRIPTOR ?
+C ---------------------
+C
+ IF=KDD/100000
+C
+ IF( IF.EQ.3) THEN
+C
+C* 2.1.1.1 SOLVE TABLE D REFERENCE.
+C ------------------------
+ CALL BUSTDR(KJ,KJ1,KDD,KSTACK,KERR)
+ IF(KERR.GT.0) THEN
+ DO 252 IQ=1,JELEM
+ NSTACK(IQ)=0.
+ 252 CONTINUE
+ RETURN
+ END IF
+ GO TO 200
+ END IF
+C
+ IF( IF.EQ.2) THEN
+ CALL BUPRCO(KBUFL,KBUFF,KJ,KDD,KSTACK,KELEM,KERR)
+ IF(KERR.GT.0) THEN
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ GO TO 200
+ END IF
+C
+ KERR=36
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+C ------------------------------------------------------------------
+C
+C* 3. UPDATE WORKING TABLE.
+C ---------------------
+ 300 CONTINUE
+C
+c IF(KDD.EQ.31031.OR.KDD.EQ.31192) THEN
+c NWT=NWT+1
+c NWTR(NWT)=KDD
+c NWTS(NWT)=0
+c NWTRV(NWT)=0
+c NWTDW(NWT)=1
+c CWTEN(NWT)='DATA PRESENT INDICATOR'
+c CWTU (NWT)='NUMERIC'
+c M=M+1
+c ELSEIF(KDD.EQ.33007.OR.KDD.EQ.63192) THEN
+c NWT=NWT+1
+c NWTR(NWT)=KDD
+c NWTS(NWT)=0
+c NWTRV(NWT)=0
+c NWTDW(NWT)=7
+c CWTEN(NWT)='% CONFIDENCE'
+c CWTU (NWT)='NUMERIC'
+c M=M+1
+c ELSE
+ CALL BUUPWT(KDD,KELEM,KERR)
+ IF(KERR.GT.0) RETURN
+ IF(KDD.EQ.031011.or.kdd.eq.031012) return
+c END IF
+C
+C CHECK IF NEXT DESCRIPTOR CANCEL OPERATOR FOR DELAYED
+C REPLICATION
+C
+ IIIF=KSTACK(KJ+1)/100000
+ IIII=KSTACK(KJ+1)-IIIF*100000
+ IIIX=IIII/1000
+ IIIY=IIII-IIIX*1000
+C
+ IF(IIIF.EQ.2.AND.IIIY.EQ.0) THEN
+ KJ=KJ+1
+ KDD=KSTACK(KJ)
+ CALL BUPRCO(KBUFL,KBUFF,KJ,KDD,KSTACK,KELEM,KERR)
+ IF(KERR.GT.0) THEN
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ END IF
+C
+C ------------------------------------------------------------------
+C
+C* 4. LOCATE AND STORE JR, THE REPLICATION FACTOR FROM DATA.
+C ------------------------------------------------------
+ 400 CONTINUE
+C
+ IB=0
+ IF(IAND(KSEC3(4),IMASK(7)).NE.0) IB=1
+C
+C RESOLVE MARKERS
+C
+ IF(OMARKER) THEN
+ CALL BUPMRK(KBUFL,KBUFF,KSEC3,KELEM,KERR)
+ IF(KERR.GT.0) RETURN
+ END IF
+C
+ IF(IB.EQ.0) THEN
+C
+C UNCOMPRESSED DATA
+C
+ IBIT=0
+C
+ DO 401 J=1,NWT-1
+C
+ IBIT=IBIT+NWTDW(J)
+C
+ 401 CONTINUE
+C
+ IF(NSUBSET.EQ.1) THEN
+ IBIT = IBIT + 32 + NBPTB
+ ELSE
+ IBIT=IBIT+NBP
+ END IF
+C
+ IWORD= IBIT/NBPW
+ ISKIP= IBIT - IWORD*NBPW
+ IF(NSUBSET.EQ.1) THEN
+ IWORD= IWORD + NWPTB
+ ELSE
+ IWORD= IWORD + NWP
+ END IF
+C
+ CALL GBYTE(KBUFF(IWORD),JR,ISKIP,NWTDW(NWT))
+
+ IF(JR.EQ.0) THEN
+ KJ=KJ+K
+ GO TO 640
+ END IF
+
+c IF(NWTR(NWT).eq.31011.or.NWTR(NWT).eq.31012) then
+c NREP=JR
+c END IF
+ ELSE
+C
+C COMPRESSED DATA
+C
+ IBIT=32+NBPTB
+ IWORD=IBIT/NBPW
+C
+ IWORDP=NWPTB+IWORD
+ IBITP =IBIT-IWORD*NBPW
+C
+ DO 402 I=2,NWT
+ IWRD=IWORDP
+ IBTP=IBITP
+C
+ IF(NWTDW(I-1).EQ.0) THEN
+ IBITP =IBITP
+ IWORDP=IWORDP
+ GO TO 402
+ END IF
+C
+ IBTP=IBTP+NWTDW(I-1)
+ IF(IBTP.GE.NBPW) THEN
+ IW=IBTP/NBPW
+ IBTP=IBTP-IW*NBPW
+ IWRD=IWRD+IW
+ END IF
+C
+ CALL BUNPCK(NBPW,KBUFF,IDWINC,IWRD,IBTP,6,KERR)
+ IF(KERR.GT.0) RETURN
+ IF(IDWINC.GT.JBPW) THEN
+ KERR=15
+ WRITE(KNTN,*) 'BUSRP:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ IF(IWRD.GT.KBUFL) THEN
+ KERR=26
+ WRITE(KNTN,*) 'BUSRP:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ IF(CWTU(I-1)(1:3).EQ.'CCI') THEN
+ IWTIWS=NWTDW(I-1)+6+N*IDWINC*8
+ ELSE
+ IWTIWS=NWTDW(I-1)+6+N*IDWINC
+ END IF
+C
+ IBIT = IBITP + IWTIWS
+ IWORD= IBIT/NBPW
+C
+ IBITP = IBIT - IWORD*NBPW
+ IWORDP= IWORDP + IWORD
+C
+ IF(IWORDP.GT.KBUFL) THEN
+ KERR=26
+ WRITE(KNTN,*) 'BUSRP :'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ 402 CONTINUE
+C
+C UNPACK JR DELAYED REPLICATION FACTOR
+C
+ IW=IWORDP
+ IBT=IBITP
+ CALL BUNPCK(NBPW,KBUFF,IR0,IW,IBT,NWTDW(NWT),KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KBUFF,IDWINC,IW,IBT,6,KERR)
+ IF(KERR.GT.0) RETURN
+ IF(IDWINC.GT.JBPW) THEN
+ KERR=15
+ WRITE(KNTN,*) ' BUSRP :'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ IF(IDWINC.NE.0) THEN
+ CALL BUNPCK(NBPW,KBUFF,INCR,IW,IBT,IDWINC,KERR)
+ IF(KERR.GT.0) RETURN
+ END IF
+C
+ IF(IR0.EQ.NMASK(NWTDW(NWT))) THEN
+ JR=NMASK(NWTDW(NWT))
+ KERR=19
+ WRITE(KNTN,*) 'BUSRP :'
+ CALL BUERR(KERR)
+ RETURN
+ ELSE
+ IWTPR0=NWTRV(NWT)+IR0
+C
+ IF(IDWINC.EQ.0) THEN
+ JR=IWTPR0
+ ELSE
+ IF(INCR.EQ.NMASK(IDWINC)) THEN
+ JR=NMASK(NWTDW(NWT))
+ KERR=19
+ WRITE(KNTN,*) 'BUSRP :'
+ CALL BUERR(KERR)
+ RETURN
+ ELSE
+ JR= IWTPR0 + INCR
+ END IF
+ END IF
+ END IF
+ END IF
+C
+ IF(JR.EQ.0) THEN
+ KJ=KJ+K
+ GO TO 640
+ END IF
+C
+ JRTK=JR*K+KJ1-K
+ IF(JRTK.GT.JELEM) THEN
+ KERR=19
+ WRITE(KNTN,*) 'BUSRP :'
+ CALL BUERR(KERR)
+ WRITE(KNTN,*)'REPLICATION FACTOR =',JR
+ RETURN
+ END IF
+C
+C ------------------------------------------------------------------
+C* 5. GET NEXT K DESCRIPTORS.
+C -----------------------
+ 500 CONTINUE
+C
+ DO 501 J=1,K
+C
+ ILIST(J)=KSTACK(KJ+J)
+C
+ 501 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 6. ADD JR TIMES K DESCRIPTORS IN PLACE OF K
+C ----------------------------------------
+C DESCRIPTORS OBTAINED.
+C ---------------------
+ 600 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 6.1 PUSH DOWN DESCRIPTORS IN KSTACK FOR (JR-1)*K PLACES
+C ---------------------------------------------------
+C STARTING AT KJ1 AND ENDING AT KJ+K.
+C -----------------------------------
+ 610 CONTINUE
+C
+ JRKM1=(JR-1)*K
+C
+ DO 611 J=KJ1,KJ+K,-1
+C
+ KSTACK(J+JRKM1)=KSTACK(J)
+C
+ 611 CONTINUE
+C
+C* 6.2 INSERT LIST IN THE STACK.
+C -------------------------
+ 620 CONTINUE
+C
+ DO 622 J=1,JR
+C
+ KJJM1K=KJ+(J-1)*K
+C
+ DO 623 J1=1,K
+C
+ KSTACK(KJJM1K+J1)=ILIST(J1)
+C
+ 623 CONTINUE
+ 622 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 6.3 ADJUST DESCRIPTOR COUNT FOR LIST LENGTH.
+C ----------------------------------------
+ 630 CONTINUE
+C
+ KJ1 = KJ1 + (JR-1)*K
+C
+C ------------------------------------------------------------------
+C* 6.4 ADJUST NUMBER OF DATA DESCRIPTORS NOT PRESENT.
+C ----------------------------------------------
+ 640 CONTINUE
+C
+ IF(N221.NE.0) N221= KJ1 - KJ + 1
+C
+C ------------------------------------------------------------------
+ 700 CONTINUE
+C
+ RETURN
+ END
diff --git a/bufrdc/busrq.F b/bufrdc/busrq.F
new file mode 100755
index 0000000..b3e4e51
--- /dev/null
+++ b/bufrdc/busrq.F
@@ -0,0 +1,115 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUSRQ(KREQ,KRQL,KRQ,RQV,KERR)
+C
+C**** *BUSRQ*
+C
+C
+C PURPOSE.
+C --------
+C SET LIST OF BUFR TABLE B ELEMENT REFERENCES
+C FOR PARTIAL EXPANSION.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUSRQ(KREQ,KRQL,KRQ,RQV,KERR)*
+C
+C INPUT :
+C *KREQ* - FLAG
+C BIT NUMBER MEANING
+C 1 - 0 NO BIT MAP DELIVERED TO USER
+C 1 BIT MAP DELIVERED TO USER
+C 2 - 0 NO PARTIAL EXPANSION
+C 1 PARTIAL EXPANSION
+C 3 - 0 NO Q/C REQUIRED
+C - 1 Q/C REQUIRED
+C 4 - 0 NO STATISTICS REQUIRED
+C - 1 STATISTICS
+C 5 - 0 NO DIFFRENCE STATISTICS
+C - 1 DIFFERENCE STATISTICS
+C 6 - 0 NO SUBSTITUTED VALUES
+C - 1 SUBSTITUTED VALUES
+C *KRQL* - NUMBER OF REQUESTED ELEMENTS
+C *KRQ* - LIST OF REQUESTED TABLE B REFERENCE
+C *RQV* - LIST OF VALUES SIGNIFYING REQUESTED ELEMENT
+C (SAY PRESSURE AT 50000 PA)
+C OUTPUT:
+C *KERR* - RETURNED ERROR CODE
+C
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomreq.F"
+# include "bcomdefc.F"
+C
+ CHARACTER*4 CUSER,CECMWF
+ DIMENSION KRQ(*),KREQ(*)
+#ifndef R_4
+ REAL*8 RQV(*)
+ REAL*8 RQVAL
+#else
+ REAL RQV(*)
+ REAL RQVAL
+#endif
+C
+C ------------------------------------------------------------------
+C* 1. MOVE REQUESTED ELEMENTS INTO COMMON BLOCK /COMREQ/.
+C ---------------------------------------------------
+ 100 CONTINUE
+C
+ IF(KERR.GT.0) RETURN
+C
+ CUSER='USER'
+C
+ NRQL=KRQL
+ NREQ(1)=KREQ(1)
+ NREQ(2)=KREQ(2)
+C
+ DO 101 I=1,KRQL
+ NRQ(I)=KRQ(I)
+ RQVAL(I)=RQV(I)
+ 101 CONTINUE
+C
+ RETURN
+ END
diff --git a/bufrdc/bustdr.F b/bufrdc/bustdr.F
new file mode 100755
index 0000000..f0f9cc9
--- /dev/null
+++ b/bufrdc/bustdr.F
@@ -0,0 +1,158 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUSTDR(KJ,KJ1,KDD,KSTACK,KERR)
+C
+C**** *BUSTDR*
+C
+C
+C PURPOSE.
+C --------
+C SOLVE BUFR TABLE D REFERENCE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUSTDR(KJ,KJ1,KDD,KSTACK,KERR)*
+C
+C INPUT :
+C *KDD* - DATA DESCRIPTOR
+C OUTPUT:
+C *KJ* - POINTER TO KSTACK ARRAY
+C *KJ1* - POINTER TO LAST ELEMENT IN KSTACK
+C *KSTACK* - LIST OF DATA DESCRIPTORS
+C *KERR* - RETURN ERROR CODE
+C
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwt.F"
+# include "bcomtab.F"
+# include "bcomtabc.F"
+C
+ CHARACTER CTABBEN*64,CTABBU*24
+C
+ DIMENSION ILIST(JELEM),KSTACK(*)
+C
+C ------------------------------------------------------------------
+C
+C* 1. OBTAIN LIST OF DESCRIPTORS FROM BUFR TABLE D.
+C ---------------------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ DO 110 J=1,JTAB
+C
+ IF(KDD.EQ.NTABDTR(J)) THEN
+ I=J
+ GO TO 120
+ END IF
+C
+ 110 CONTINUE
+C
+ KERR=20
+ WRITE(KNTN,*)' BUSTDR :',KDD
+ CALL BUERR(KERR)
+ RETURN
+C
+ 120 CONTINUE
+C
+ J1=NTABDST(I)
+ J2=NTABDL (I)
+ J3=0
+C
+ DO 121 J=J1,J1+J2-1
+C
+ J3 = J3 +1
+ ILIST(J3) = NTABDSQ(J)
+C
+ 121 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 2. PUSH DOWN DATA DESCRIPTION DESCRIPTORS
+C --------------------------------------
+C TO MAKE ROOM FOR LIST.
+C ----------------------
+ 200 CONTINUE
+C
+ J2M1=J2-1
+C
+ DO 210 J=KJ1,KJ+1,-1
+C
+ KSTACK(J+J2M1) = KSTACK(J)
+C
+ 210 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 3. INSERT LIST IN PLACE OF SEQUENCE DESCRIPTORS.
+C ---------------------------------------------
+ 300 CONTINUE
+C
+ KJM1=KJ-1
+C
+ DO 310 J=1,J3
+C
+ KSTACK(KJM1+J)= ILIST(J)
+C
+ 310 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 4. ADJUST DESCRIPTOR COUNT FOR LIST LENGTH.
+C ----------------------------------------
+ 400 CONTINUE
+C
+ KJ = KJ - 1
+ KJ1 = KJ1 +J3 -1
+C ------------------------------------------------------------------
+C* 4.1 ADJUST NUMBER OF DATA DESCRIPTORS NOT PRESENT.
+C ----------------------------------------------
+ 610 CONTINUE
+C
+ IF(N221.NE.0) N221= KJ1 - KJ + 1
+C -----------------------------------------------------------------
+ 500 CONTINUE
+C
+ RETURN
+C
+ 9901 FORMAT(1H ,' BUSTDR : TABLE D REFERENCE NOT FOUND, ERROR=',I2)
+C
+ END
diff --git a/bufrdc/bustop.F b/bufrdc/bustop.F
new file mode 100755
index 0000000..03b70a9
--- /dev/null
+++ b/bufrdc/bustop.F
@@ -0,0 +1,79 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUSTOP(KSTOP)
+C
+C**** *BUSTOP*
+C
+C
+C PURPOSE.
+C --------
+C SETS VARIABLE KPMISS,KPRUS,KOKEY,KOFL INTO COMMON BLOCK.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUSTOP(KSTOP)*
+C
+C INPUT :
+C *KSTOP* - INTEGER CONSTANT
+C
+C
+C METHOD.
+C -------
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/09/2007
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+# include "parameter.F"
+# include "bcomwt.F"
+# include "bcomdefc.F"
+C
+ CHARACTER*4 CECMWF
+C
+C ------------------------------------------------------------------
+C
+C* 1. SET CONSTANTS.
+C --------------
+ 100 CONTINUE
+C
+ IF(CECMWF.NE.'ECMF') THEN
+ IERR=0
+ CALL BUEVAR(IERR)
+ CECMWF='ECMF'
+ END IF
+C
+ NSTOP=KSTOP
+C
+ RETURN
+ END
diff --git a/bufrdc/buuatb.F b/bufrdc/buuatb.F
new file mode 100755
index 0000000..2d09745
--- /dev/null
+++ b/bufrdc/buuatb.F
@@ -0,0 +1,394 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUUATB(KBUFL,KBUFF,KJ,KY,KSTACK,KELEM,KERR)
+C
+C**** *BUUATB*
+C
+C
+C PURPOSE.
+C --------
+C UPDATE AUGMENTED BUFR TABLE B.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUUATB(KBUFL,KBUFF,KJ,KY,KSTACK,KELEM,KERR)*
+C
+C INPUT :
+C *KBUFL* - LENGTH OF BUFR MESSAGE (WORDS)
+C *KBUFF* - ARRAY CONTAINING BUFR MESSAGE
+C *KJ* - POINTER TO KSTACK ARRAY
+C *KY* - OPERAND OF THE DATA DESCRIPTOR OPERATOR
+C *KELEM* -
+C OUTPUT:
+C *KSTACK* - LIST OF ELEMENTS
+C *KERR* - RETURN ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C GBYTE - PACK BIT PATTERN
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 04/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+# include "bcomatb.F"
+# include "bcomatbc.F"
+# include "bcomtab.F"
+# include "bcomtabc.F"
+# include "bcomwt.F"
+# include "bcomwtc.F"
+# include "bcombef.F"
+# include "bcomcom.F"
+# include "bcomoff.F"
+C
+ CHARACTER CATBEN*64,CWTEN*64,CTABBEN*64
+ CHARACTER CATBU*24,CWTU*24,CTABBU*24
+C
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+ DIMENSION KBUFF(KBUFL)
+ DIMENSION KSTACK(*)
+ DIMENSION IMASK(8)
+ DATA IMASK/1,2,4,8,16,32,64,128/
+C ------------------------------------------------------------------
+C
+C* 1. UPDATE AUGMENTED TABLE B .
+C --------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+C* 1.1 Y = 0 ?
+C -------
+ 110 CONTINUE
+C
+ IF( KY.EQ.0) THEN
+C
+C* 1.1.1 CLEAR AUGMENTED TABLE B.
+C ------------------------
+ NJA= 0
+C
+ DO 111 J=1,JTAB
+C
+ NATBTR(J)= 0
+ NATBS (J)= 0
+ NATBRV(J)= 0
+ NATBDW(J)= 0
+ CATBEN(J)=' '
+ CATBU (J)=' '
+C
+ 111 CONTINUE
+C
+ GO TO 300
+ END IF
+C
+C* 1.2 GET NEXT DESCRIPTOR FROM STACK.
+C -------------------------------
+ 120 CONTINUE
+C
+ KJ=KJ + 1
+ KDD = KSTACK(KJ)
+C
+C* 1.3 ELEMENT DESCRIPTOR ?
+C ---------------------
+ 130 CONTINUE
+C
+ IF = KDD /100000
+ IDIF= KDD -IF*100000
+ IX = IDIF/1000
+ IY = IDIF-IX*1000
+C
+ IF(IF.EQ.0) THEN
+C
+C* 1.3.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NWT = NWT + 1
+ NWTEN(NWT)=836970
+ CWTEN(NWT)='REFERENCE VALUE'
+ CWTU (NWT)=' '
+ NWTDW(NWT)= KY
+ NWTS (NWT)=0
+ NWTRV(NWT)=0
+ M=M+1
+C
+C* 1.3.2 ADD ENTRY TO AUGMENTED TABLE B .
+C --------------------------------
+ DO 131 J=1,JTAB
+C
+ IF(NTABBTR(J).EQ.KDD) THEN
+ I=J
+ GO TO 133
+ END IF
+C
+ 131 CONTINUE
+C
+ KERR=23
+ WRITE(KNTN,*)'BUUATB :'
+ CALL BUERR(KERR)
+C
+ GO TO 300
+C
+ 133 CONTINUE
+C
+ NJA=NJA + 1
+C
+ NATBTR(NJA)=NTABBTR(I)
+ NATBS (NJA)=NTABBS (I)
+ NATBRV(NJA)=NTABBRV(I)
+ NATBDW(NJA)=NTABBDW(I)
+ CATBEN(NJA)=CTABBEN(I)
+ CATBU (NJA)=CTABBU (I)
+C
+C* 1.3.3 COMPLITE ENTRY WITH NEW REFERENCE VALUE
+C ----------------------------------------
+C FROM DATA SECTION.
+C ------------------
+C
+ IB=0
+ IF(IAND(ICOMP,IMASK(7)).NE.0) IB=1
+
+ IF(IB.EQ.0) THEN
+C
+ IBIT=0
+C
+ DO 134 J=1,NWT-1
+C
+ IBIT =IBIT + NWTDW(J)
+C
+ 134 CONTINUE
+C
+ IF(NSUBSET.EQ.1) THEN
+ IBIT = IBIT +32 + NBPTB
+ ELSE
+ IBIT = IBIT + NBP
+ END IF
+ IWORD= IBIT/NBPW
+ ISKIP= IBIT - IWORD*NBPW
+ IF(NSUBSET.EQ.1) THEN
+ IWORD= IWORD + NWPTB
+ ELSE
+ IWORD= IWORD + NWP
+ END IF
+C
+C
+C 1.3.4 CHECK IF REFERENCE VALUE NEGATIVE
+C
+ CALL GBYTE(KBUFF(IWORD),ISGN,ISKIP,1)
+ IF(ISGN.EQ.1) THEN
+ IBIT=IBIT+1
+ IWORD= IBIT/NBPW
+ ISKIP= IBIT - IWORD*NBPW
+ IWORD= IWORD + NWPTB
+C
+ CALL GBYTE(KBUFF(IWORD),NATBRV(NJA),ISKIP,KY-1)
+ NATBRV(NJA)=-NATBRV(NJA)
+ ELSE
+ CALL GBYTE(KBUFF(IWORD),NATBRV(NJA),ISKIP,KY)
+ END IF
+C
+ ELSE
+C COMPRESSED DATA
+C
+ IBIT=32+NBPTB
+ IWORD=IBIT/NBPW
+C
+ IWORDP=NWPTB+IWORD
+ IBITP =IBIT-IWORD*NBPW
+C
+ DO 402 I=2,NWT
+ IWRD=IWORDP
+ IBTP=IBITP
+C
+ IF(NWTDW(I-1).EQ.0) THEN
+ IBITP =IBITP
+ IWORDP=IWORDP
+ GO TO 402
+ END IF
+C
+ IBTP=IBTP+NWTDW(I-1)
+ IF(IBTP.GE.NBPW) THEN
+ IW=IBTP/NBPW
+ IBTP=IBTP-IW*NBPW
+ IWRD=IWRD+IW
+ END IF
+C
+ CALL BUNPCK(NBPW,KBUFF,IDWINC,IWRD,IBTP,6,KERR)
+ IF(KERR.GT.0) RETURN
+ IF(IDWINC.GT.JBPW) THEN
+ KERR=15
+ WRITE(KNTN,*) 'BUUATB:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ IF(IWRD.GT.KBUFL) THEN
+ KERR=26
+ WRITE(KNTN,*) 'BUUATB:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ IF(CWTU(I-1)(1:3).EQ.'CCI') THEN
+ IWTIWS=NWTDW(I-1)+6+N*IDWINC*8
+ ELSE
+ IWTIWS=NWTDW(I-1)+6+N*IDWINC
+ END IF
+C
+ IBIT = IBITP + IWTIWS
+ IWORD= IBIT/NBPW
+C
+ IBITP = IBIT - IWORD*NBPW
+ IWORDP= IWORDP + IWORD
+C
+ IF(IWORDP.GT.KBUFL) THEN
+ KERR=26
+ WRITE(KNTN,*) 'BUUATB :'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+ 402 CONTINUE
+C
+C
+ IW=IWORDP
+ IBT=IBITP
+ CALL BUNPCK(NBPW,KBUFF,ISG_REF,IW,IBT,1,KERR)
+ CALL BUNPCK(NBPW,KBUFF,IR0,IW,IBT,NWTDW(NWT)-1,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KBUFF,IDWINC,IW,IBT,6,KERR)
+ IF(KERR.GT.0) RETURN
+ IF(IDWINC.GT.JBPW) THEN
+ KERR=15
+ WRITE(KNTN,*) ' BUUATB :'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ IF(IDWINC.NE.0) THEN
+ CALL BUNPCK(NBPW,KBUFF,INCR,IW,IBT,IDWINC,KERR)
+ IF(KERR.GT.0) RETURN
+ END IF
+C
+ IF(IR0.EQ.NMASK(NWTDW(NWT))) THEN
+ JR=NMASK(NWTDW(NWT))
+ KERR=19
+ WRITE(KNTN,*) 'BUUATB :'
+ CALL BUERR(KERR)
+ RETURN
+ ELSE
+ IWTPR0=NWTRV(NWT)+IR0
+C
+ IF(IDWINC.EQ.0) THEN
+ JREF=IWTPR0
+ ELSE
+ IF(INCR.EQ.NMASK(IDWINC)) THEN
+ JREF=NMASK(NWTDW(NWT))
+ KERR=19
+ WRITE(KNTN,*) 'BUUATB :'
+ CALL BUERR(KERR)
+ RETURN
+ ELSE
+ JREF= IWTPR0 + INCR
+ END IF
+ END IF
+ END IF
+C
+ NATBRV(NJA)=JREF
+ IF(ISG_REF.EQ.1) NATBRV(NJA)=- NATBRV(NJA)
+ END IF
+C
+C 1.3.5 UPDATA WORKING TABLE ENTRIES.
+C -----------------------------
+ 135 CONTINUE
+C
+c IF(KDD.EQ.31031.OR.KDD.EQ.31192) THEN
+c NWT=NWT+1
+c NWTR(NWT)=KDD
+c NWTS(NWT)=0
+c NWTRV(NWT)=0
+c NWTDW(NWT)=1
+c CWTEN(NWT)='DATA PRESENT INDICATOR'
+c CWTU (NWT)='NUMERIC'
+c M=M+1
+c ELSEIF(KDD.EQ.33007.OR.KDD.EQ.63192) THEN
+c NWT=NWT+1
+c NWTR(NWT)=KDD
+c NWTS(NWT)=0
+c NWTRV(NWT)=0
+c NWTDW(NWT)=7
+c CWTEN(NWT)='% CONFIDENCE'
+c CWTU (NWT)='NUMERIC'
+c M=M+1
+c ELSE
+c CALL BUUPWT(KDD,KELEM,KERR)
+c IF(KERR.GT.0) RETURN
+c END IF
+C
+ GO TO 120
+C
+ END IF
+C
+C ------------------------------------------------------------------
+C
+C* 1.4 CHANGE REFERENCE VALUE ?
+C ------------------------
+ 140 CONTINUE
+C
+ IF( IF.EQ.2.AND.IX.EQ.3) THEN
+ IF(IY.EQ.255) GO TO 300
+ KY=IY
+ GO TO 120
+ END IF
+C ------------------------------------------------------------------
+ 200 CONTINUE
+C
+ KERR=23
+ WRITE(KNTN,*)'BUUATB :'
+ CALL BUERR(KERR)
+C
+C ------------------------------------------------------------------
+ 300 CONTINUE
+C
+ RETURN
+ END
diff --git a/bufrdc/buukey.F b/bufrdc/buukey.F
new file mode 100755
index 0000000..56d6229
--- /dev/null
+++ b/bufrdc/buukey.F
@@ -0,0 +1,395 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUUKEY( KSEC1,KSEC2,KEY,KSUP,KERR )
+C
+C**** *BUUKEY*
+C
+C
+C PURPOSE.
+C --------
+C EXPANDS LOCAL ECMWF INFORMATION FROM SECTION 2.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUUKEY(KSEC1,KSEC2,KEY,KSUP,KERR)*
+C
+C INPUT :
+C *KSEC1* - ARRAY CONTAINING SECTION 1 INFORMATION
+C KSEC1( 1)-- LENGTH OF SECTION 1 (BYTES)
+C KSEC1( 2)-- BUFR EDITION NUMBER
+C KSEC1( 3)-- ORIGINATING CENTRE
+C KSEC1( 4)-- UPDATE SEQUENCE NUMBER
+C KSEC1( 5)-- FLAG (PRESENCE OF SECTION 2)
+C KSEC1( 6)-- BUFR MESSAGE TYPE
+C KSEC1( 7)-- BUFR MESSAGE SUBTYPE
+C KSEC1( 8)-- VERSION NUMBER OF LOCAL TABLE USED
+C KSEC1( 9)-- YEAR
+C KSEC1(10)-- MONTH
+C KSEC1(11)-- DAY
+C KSEC1(12)-- HOUR
+C KSEC1(13)-- MINUTE
+C KSEC1(14)-- BUFR MASTER TABLE
+C KSEC1(15)-- VERSION NUMBER OF MASTER TABLE USED
+C KSEC1(16) - KSEC1(JSEC1) -- LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 3 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- NOT USED
+C KSEC1(18) TO KSEC1(JSEC1) - LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C
+C FOR BUFR EDITION 4 ONWARD
+C
+C KSEC1(16)-- ORIGINATING SUB-CENTRE
+C KSEC1(17)-- INTERNATIONAL SUB-CATEGORY (SEE COMMON TABLE C-13
+C KSEC1(18)-- SECOND
+C KSEC1(19)-- YEAR
+C KSEC1(20)-- MONTH
+C KSEC1(21)-- DAY
+C KSEC1(22)-- HOUR
+C KSEC1(23)-- MINUTE
+C KSEC1(24)-- SECOND
+C KSEC1(25)-- YEAR
+C KSEC1(26)-- MONTH
+C KSEC1(27)-- DAY
+C KSEC1(28)-- HOUR
+C KSEC1(29)-- MINUTE
+C KSEC1(30)-- SECOND
+C KSEC1(31)-- MOST SOUTHERN LATITUDE (-90 to 90)
+C KSEC1(32)-- MOST WESTERN LONGITUDE ( 0-360)
+C KSEC1(33)-- MOST NORTHEN LATITUDE (-90 to 90)
+C KSEC1(34)-- MOST EASTERN LONGITUDE ( 0-360)
+C KSEC1(35) TO KSEC1(JSEC1) - LOCAL ADP CENTRE INFORMATION(PACKED FORM)
+C
+C *KSEC2* - ARRAY CONTAINING SECTION 2 INFORMATION
+C KSEC2( 1)-- LENGTH OF SECTION 2 (BYTES)
+C KSEC2( 2) TO KSEC2(JSEC2) LOCAL ADP CENTRE
+C INFORMATION(PACKED FORM)
+C OUTPUT:
+C *KEY* - ARRAY CONTAINING RDB INFORMATION
+C KEY( 1)-- LENGTH OF SECTION 2 (BYTES)
+C KEY( 2)-- RDB TYPE
+C KEY( 3)-- RDB SUBTYPE
+C KEY( 4)-- YEAR
+C KEY( 5)-- MONTH
+C KEY( 6)-- DAY
+C KEY( 7)-- HOUR
+C KEY( 8)-- MINUTE
+C KEY( 9)-- SECOND
+C KEY(10)-- LONGITUDE1
+C KEY(11)-- LATITUDE1
+C KEY(12)-- LONGITUDE2
+C KEY(13)-- LATITUDE2
+C KEY(14)-- NUMBER OF SUBSETS
+C KEY(15)-- IDENT (NUMERIC)
+C KEY(16)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(17)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(18)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(19)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(20)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(21)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(22)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(23)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(24)-- IDENT ( CCITTIA5) ONE CHARACTER
+C KEY(25)-- TOTAL BUFR MESSAGE LENGTH
+C KEY(26)-- DAY (RDB INSERTION)
+C KEY(27)-- HOUR (RDB INSERTION)
+C KEY(28)-- MINUTE (RDB INSERTION)
+C KEY(29)-- SECOND (RDB INSERTION)
+C KEY(30)-- DAY (MDB INSERTION)
+C KEY(31)-- HOUR (MDB INSERTION)
+C KEY(32)-- MINUTE (MDB INSERTION)
+C KEY(33)-- SECOND (MDB INSERTION)
+C KEY(34)-- CORRECTION NUMBER
+C KEY(35)-- PART
+C KEY(36)-- 0
+C KEY(37)-- CORRECTION NUMBER
+C KEY(38)-- PART
+C KEY(39)-- 0
+C KEY(40)-- CORRECTION NUMBER
+C KEY(41)-- PART
+C KEY(42)-- 0
+C KEY(43)-- CORRECTION NUMBER
+C KEY(44)-- PART
+C KEY(45)-- 0
+C KEY(46)-- THE LOWEST Q/C % CONFIDENCE
+C *KSUP* - ARRAY CONTAINING SUPLEMENTARY INFORMATION
+C - KSUP( 1) -- IDIM1, DIMENSION OF KSEC1
+C - KSUP( 2) -- IDIM2, DIMENSION OF KSEC2
+C - KSUP( 3) -- IDIM3, DIMENSION OF KSEC3
+C - KSUP( 4) -- IDIM4, DIMENSION OF KSEC4
+C - KSUP( 5) -- M (NUMBER OF ELEMENTS IN VALUES ARRAY,
+C FIRST INDEX)
+C - KSUP( 6) -- N (NUMBER OF SUBSETS,SECOND INDEX OF
+C VALUES ARRAY)
+C - KSUP( 7) -- JVC (NUMBER OF ELEMENTS IN CVAL ARRAY)
+C - KSUP( 8) -- TOTAL BUFR MESSAGE LENGTH IN BYTES
+C - KSUP( 9) -- IDIM0, DIMENSION OF KSEC0
+C *KERR* - RETURNED ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C BUNPCK - UNPACK BIT PATTERN
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 17/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwork.F"
+# include "bcomdefc.F"
+C
+ CHARACTER*4 CECMWF,CUSER
+C
+#ifndef R_4
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL RVIND
+ REAL EPS
+#endif
+ DIMENSION KSEC1(JSEC1),KSEC2(JSEC2),KEY(JKEY)
+ DIMENSION IDUM(8) ,KSUP (JSUP ),KSEC3(JSEC3)
+C
+C
+C* 1. UNPACK LOCAL ADP CENTRE INFORMATION.
+C ------------------------------------
+ 100 CONTINUE
+C
+ KERR=0
+C
+ IF(CECMWF.NE.'ECMF') THEN
+ CALL BUEVAR(KERR)
+ CECMWF='ECMF'
+ END IF
+C
+ DO 101 I=1,JKEY
+ KEY(I)=0
+ 101 CONTINUE
+C
+ KEY(1)=KSEC2(1)
+ IW=2
+ IB=0
+ IF(KSEC2(1).EQ.52) THEN
+ CALL BUNPCK(NBPW,KSEC2,KEY(2),IW,IB, 8,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(3),IW,IB, 8,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(4),IW,IB,12,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(5),IW,IB, 4,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(6),IW,IB, 6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(7),IW,IB, 5,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(8),IW,IB, 6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(9),IW,IB, 6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,IDUMMY ,IW,IB, 1,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(10),IW,IB,26,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,IDUMMY ,IW,IB, 6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(11),IW,IB,25,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,IDUMMY ,IW,IB, 7,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ IF(KSUP(6).GT.1.OR.KEY(2).EQ.2.OR.KEY(2).EQ.3.OR.
+ 1 KEY(2).EQ.12.OR.KEY(2).EQ.8) THEN
+C
+ CALL BUNPCK(NBPW,KSEC2,KEY(12),IW,IB,26,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,IDUMMY ,IW,IB, 6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(13),IW,IB,25,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,IDUMMY ,IW,IB, 7,KERR)
+ IF(KERR.GT.0) RETURN
+ IF(KSUP(6).GT.255.OR.KEY(3).GE.121.AND.
+ 1 KEY(3).LE.130.OR.KEY(3).EQ.31) THEN
+ CALL BUNPCK(NBPW,KSEC2,KEY(14),IW,IB,16,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(15),IW,IB,16,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPKS(NBPW,KSEC2,IDUM(1),IW,IB,8,0,4,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,IDUMMY ,IW,IB, 8,KERR)
+ IF(KERR.GT.0) RETURN
+ ELSE
+ CALL BUNPCK(NBPW,KSEC2,KEY(14),IW,IB, 8,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(15),IW,IB,16,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPKS(NBPW,KSEC2,IDUM(1),IW,IB,8,0,4,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,IDUMMY ,IW,IB,16,KERR)
+ IF(KERR.GT.0) RETURN
+ END IF
+ GO TO 140
+ ELSE
+ CALL BUNPKS(NBPW,KSEC2,KEY(16),IW,IB,8,0,9,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPKS(NBPW,KSEC2,IDUM(1) ,IW,IB,8,0,8,KERR)
+ IF(KERR.GT.0) RETURN
+ END IF
+C
+C
+C* 1.4 SUB KEY INFORMATION.
+C --------------------
+ 140 CONTINUE
+C
+ CALL BUNPCK(NBPW,KSEC2,KEY(25),IW,IB,16,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(26),IW,IB, 6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(27),IW,IB, 5,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(28),IW,IB, 6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(29),IW,IB, 6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,IDUMMY ,IW,IB, 1,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ CALL BUNPCK(NBPW,KSEC2,KEY(30),IW,IB, 6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(31),IW,IB, 5,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(32),IW,IB, 6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(33),IW,IB, 6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,IDUMMY ,IW,IB, 1,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ CALL BUNPCK(NBPW,KSEC2,KEY(34),IW,IB,6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(35),IW,IB,1,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(36),IW,IB,1,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(37),IW,IB,6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(38),IW,IB,1,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(39),IW,IB,1,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(40),IW,IB,6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(41),IW,IB,1,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(42),IW,IB,1,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(43),IW,IB,6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(44),IW,IB,1,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(45),IW,IB,1,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(46),IW,IB,8,KERR)
+ IF(KERR.GT.0) RETURN
+ KSUP( 2)=46
+ ELSE
+ IF(KSEC2(1).EQ.28) THEN
+ CALL BUNPCK(NBPW,KSEC2,KEY(2),IW,IB, 8,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(3),IW,IB, 8,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(4),IW,IB,12,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(5),IW,IB, 4,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(6),IW,IB, 6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(7),IW,IB, 5,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(8),IW,IB, 6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(9),IW,IB, 6,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,IDUMMY ,IW,IB, 1,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(10),IW,IB,26,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(11),IW,IB,25,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,IDUMMY ,IW,IB, 5,KERR)
+ IF(KERR.GT.0) RETURN
+ IF(KSUP(6).GT.1.OR.KEY(2).EQ.2.OR.KEY(2).EQ.3) THEN
+ CALL BUNPCK(NBPW,KSEC2(IW),KEY(12),IW,IB,26,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(13),IW,IB,25,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,IDUMMY ,IW,IB, 5,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(14),IW,IB, 8,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPCK(NBPW,KSEC2,KEY(15),IW,IB,16,KERR)
+ IF(KERR.GT.0) RETURN
+ ELSE
+ CALL BUNPKS(NBPW,KSEC2,KEY(16),IW,IB,8,0,9,KERR)
+ IF(KERR.GT.0) RETURN
+ CALL BUNPKS(NBPW,KSEC2,IDUM(1) ,IW,IB,8,0,8,KERR)
+ IF(KERR.GT.0) RETURN
+ END IF
+ ELSE
+ WRITE(KNTN,'(1H )')
+ WRITE(KNTN,'(1H ,A)') 'BUUKEY : KEY DEFINITION NOT KNOWN'
+ WRITE(KNTN,'(1H )')
+ END IF
+ END IF
+C
+C CHECK IF IDENT IS RIGHT JUSTIFIED.
+C
+ IF(KEY(16).EQ.32) THEN
+ J=15
+ DO 102 I=16,24
+ IF(KEY(I).EQ.32) GO TO 102
+ J=J+1
+ KEY(J)=KEY(I)
+ KEY(I)=32
+ 102 CONTINUE
+ END IF
+C
+ RETURN
+ END
diff --git a/bufrdc/buunp.F b/bufrdc/buunp.F
new file mode 100755
index 0000000..fe980e1
--- /dev/null
+++ b/bufrdc/buunp.F
@@ -0,0 +1,89 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUUNP(KBPW,KSOURC,KDEST,KWPT,KBPT,KSIZE,KERR)
+C
+C**** *BUUNP*
+C
+C
+C PURPOSE.
+C --------
+C PURPOSE OF THIS ROUTINE IS TO UNPACK BIT STRING OF
+C KSIZE BITS, STARTED AT WORD KWPT OF ARRAY KSOURC AFTER
+C SKIPPING KBPT BITS. RESULT IS PUT INTO KDEST.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUUNP(KBPW,KSOURC,KDEST,KWPT,KBPT,KSIZE,KERR)*
+C
+C INPUT :
+C *KBPW* - NUMBER OF BITS IN COMPUTER WORD
+C *KSOURC* - SOURCE (CONTINUOUS BIT STRING OF
+C ARBITRARY LENGTH)
+C *KWPT* - WORD POINTER
+C *KBPT* - BIT POINTER
+C *KSIZE* - NUMBER OF BITS TO BE EXTRACTED
+C OUTPUT:
+C *KDEST* - DESTINATION
+C *KERR* - RETURN ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C GBYTE - UNPACK BIT PATTERN
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ DIMENSION KSOURC(*)
+C
+C ------------------------------------------------------------------
+C* 1. EXTRACT BIT PATTERN.
+C --------------------
+ 100 CONTINUE
+C
+ IF(KERR.GT.0) RETURN
+C
+ IF(KSIZE.GT.KBPW) THEN
+ KERR=13
+ WRITE(KNTN,*)' BUUNP :'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ CALL GBYTE(KSOURC(KWPT),KDEST,KBPT,KSIZE)
+C
+ RETURN
+ END
diff --git a/bufrdc/buunps.F b/bufrdc/buunps.F
new file mode 100755
index 0000000..3f2c859
--- /dev/null
+++ b/bufrdc/buunps.F
@@ -0,0 +1,90 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUUNPS(KBPW,KSOURC,KDEST,KWPT,KBPT,KSIZE,KSKIPB,K,KERR)
+C
+C**** *BUUNPS*
+C
+C
+C PURPOSE.
+C --------
+C PURPOSE OF THIS ROUTINE IS TO UNPACK BIT STRING OF
+C KSIZE BITS, STARTED AT WORD KWPT OF ARRAY KSOURC AFTER
+C SKIPPING KBPT BITS. RESULT IS PUT INTO KDEST.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUUNPS(KBPW,KSOURC,KDEST,KWPT,KBPT,KSIZE,KSKIPB,K,KERR)*
+C
+C INPUT :
+C *KBPW* - NUMBER OF BITS PER COMPUTER WORD
+C *KSOURC* - SOURCE (CONTINUOUS BIT STRING OF
+C ARBITRARY LENGTH)
+C *KWPT* - WORD POINTER
+C *KBPT* - BIT POINTER
+C *KSIZE* - NUMBER OF BITS TO BE EXTRACTED
+C *KSKIPB* - NUMBER OF BITS TO SKIP BETWEEN ELEMENTS
+C *K* - ITERATION
+C OUTPUT:
+C *KDEST* - DESTINATION
+C *KERR* - RETURN ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C GBYTES - UNPACK BIT PATTERN
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/01/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ DIMENSION KSOURC(*),KDEST(*)
+C
+C ------------------------------------------------------------------
+C* 1. EXTRACT BIT PATTERN.
+C --------------------
+ 100 CONTINUE
+C
+ IF(KERR.GT.0) RETURN
+C
+ IF(KSIZE.GT.KBPW) THEN
+ KERR=13
+ WRITE(KNTN,*)' BUUNPS :'
+ CALL BUERR(KERR)
+ END IF
+C
+ CALL GBYTES(KSOURC(KWPT),KDEST,KBPT,KSIZE,KSKIPB,K)
+C
+ RETURN
+ END
diff --git a/bufrdc/buupwt.F b/bufrdc/buupwt.F
new file mode 100755
index 0000000..0428be6
--- /dev/null
+++ b/bufrdc/buupwt.F
@@ -0,0 +1,341 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUUPWT(KDD,KELEM,KERR)
+C
+C**** *BUUPWT*
+C
+C
+C PURPOSE.
+C --------
+C UPDATES WORKING TABLES SETTING ELEMENT NAME,UNIT,SCALE,
+C REFERENCE VALUE AND DATA WIDTH.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUUPWT(KDD,KELEM,KERR)*
+C
+C INPUT :
+C *KDD* - DATA DESCRIPTOR
+C *KELEM* - DIMENSION OF CNAMES, CUNITS ARRAY
+C OUTPUT:
+C *KERR* - RETURN ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcomwt.F"
+# include "bcomwtc.F"
+# include "bcomtab.F"
+# include "bcomtabc.F"
+# include "bcomatb.F"
+# include "bcomatbc.F"
+# include "bcombef.F"
+C
+ CHARACTER CATBEN*64,CWTEN*64,CTABBEN*64
+ CHARACTER CATBU*24,CWTU*24,CTABBU*24
+ CHARACTER YCH6*6
+C
+C
+C ------------------------------------------------------------------
+C* 1. UPDATE WORKING TABLE.
+C ---------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ ICLASS=KDD/1000
+ IYYY =KDD-ICLASS*1000+1
+ ICLASS=ICLASS+1
+C
+C* 1.1 ASSOCIATED FIELD ?
+C ------------------
+ 110 CONTINUE
+C
+ IF(NFD.EQ.0) GO TO 140
+C
+C* 1.2 UNITS ELEMENT DESCRIPTOR ?
+C --------------------------
+ 120 CONTINUE
+C
+ I=NTABP(ICLASS,IYYY)
+ IF(I.EQ.0) THEN
+ KERR=23
+ WRITE(KNTN,*)'BUUPWT : ',KDD
+ CALL BUERR(KERR)
+ DO 1 IQ=1,JELEM
+ NSTACK(IQ)=0.
+ 1 CONTINUE
+ RETURN
+ END IF
+C
+ IF(NTABBTR(I)/1000.EQ.31) GO TO 140
+c IF(CTABBU(I)(1:4).EQ.'CODE') GO TO 140
+c IF(CTABBU(I)(1:4).EQ.'FLAG') GO TO 140
+c IF(CTABBU(I)(1:3).EQ.'NUM' ) GO TO 140
+C
+C* 1.3 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ 130 CONTINUE
+C
+ IF(N40.NE.0) THEN
+ NWT=NWT+1
+ CWTEN(NWT)='ASSOCIATED FIELD'
+ CWTU (NWT)=' '
+ NWTDW(NWT)=N40
+ NWTR (NWT)= 999999
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ NWTRV(NWT)= 0
+ ELSE
+ DO I=1,NFD
+ NWT=NWT+1
+ CWTEN(NWT)='ASSOCIATED FIELD'
+ CWTU (NWT)=' '
+ NWTDW(NWT)=NAFDWA(I)
+ NWTR (NWT)= 999999
+ NWTEN(NWT)= 0
+ NWTS (NWT)= 0
+ NWTRV(NWT)= 0
+ END DO
+ END IF
+C
+C* UPDATE CNAMES AND CUNITS
+C
+ M=M+1
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ WRITE(KNTN,*)'BUUPWT:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+C ------------------------------------------------------------------
+C* 1.4 SEARCH AUGMENTED TABLE *B ENTRIES .
+C -----------------------------------
+ 140 CONTINUE
+C
+ DO 141 J=1,NJA
+C
+ IF(NATBTR(J).EQ.KDD) THEN
+ II=J
+C
+C* MODIFY ENTRY FOR OPERATOR IN FORCE.
+C -----------------------------------
+C
+C* ADD ENTRY TO WORKING TABLE.
+C ---------------------------
+C
+ IX=KDD/1000
+ IF(N40.NE.0.AND.IX.NE.31) THEN
+ NWT=NWT+1
+ NWTR (NWT) = KDD
+ NWTS (NWT) = 0
+ NWTRV(NWT) = 0
+ NWTDW(NWT) = N40
+ ELSE
+ NWT=NWT+1
+ NWTR (NWT) = KDD
+ NWTS (NWT) = NATBS (II) + NSCAM + NSCAM07
+ NWTRV(NWT) = NINT(NATBRV(II)*10.**N07)
+ NWTDW(NWT) = NATBDW(II) + NDWINC + NDWINC07
+ NWTEN(NWT) = 0
+
+ END IF
+C
+C CHECK IF DATA ARE PRESENT IN DATA SECTION.
+C
+ IF(N221.NE.0) THEN
+ IX=KDD/1000
+ IF(IX.GT.9.AND.IX.NE.31) NWTDW(NWT)=0
+ N221=N221-1
+ END IF
+C
+c IF(NWTR(NWT).EQ.31011.OR.NWTR(NWT).EQ.31012) THEN
+c OREP=.true.
+c END IF
+c if(OREP) then
+c if(NREP.GT.1.and.NWTR(NWT-1).ne.31011.and.
+c 1 NWTR(NWT-1).ne.31012) then
+c NWTDW(NWT)=0
+c NREP=NREP-1
+c IF(NREP.le.1) then
+c NREP=0
+c OREP=.false.
+c END IF
+c END IF
+c END IF
+
+C
+C* UPDATE M, CNAMES, CUNITS.
+C -------------------------
+C
+ CWTEN(NWT) = CATBEN(II)
+ CWTU (NWT) = CATBU (II)
+ NWTEN(NWT) = 0
+ IF(CATBU(II)(1:3).EQ.'CCI') THEN
+ NWTEN(NWT)=658367
+ ELSEIF(N40.NE.0.AND.IX.NE.31.AND.
+ 1 CATBU(II)(1:3).NE.'COD'.AND.
+ 2 CATBU(II)(1:3).NE.'FLA') THEN
+ NWTEN(NWT) = -999
+ ENDIF
+C
+ M = M + 1
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ WRITE(KNTN,*)'BUUPWT:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+ RETURN
+ END IF
+C
+ 141 CONTINUE
+C
+C* 1.5 GET TABLE *B ENTRY .
+C ---------------------
+ 150 CONTINUE
+C
+ I=NTABP(ICLASS,IYYY)
+ IF(I.EQ.0) THEN
+ KERR=23
+ WRITE(KNTN,*)'BUUPWT : ',KDD
+ CALL BUERR(KERR)
+ DO 2 IQ=1,JELEM
+ NSTACK(IQ)=0.
+ 2 CONTINUE
+ RETURN
+ END IF
+C
+ 155 CONTINUE
+C
+C -----------------------------------------------------------------
+C* 1.6 MODIFY ENTRY FOR OPERATOR IN FORCE.
+C -----------------------------------
+ 160 CONTINUE
+C
+C* ADD ENTRY TO WORKING TABLE.
+C ---------------------------
+C
+ IF(CTABBU(I)(1:4).EQ.'CODE'.OR.
+ 1 CTABBU(I)(1:4).EQ.'FLAG') THEN
+ NWT=NWT+1
+ NWTR (NWT) = KDD
+ NWTS (NWT) = NTABBS (I)
+ NWTRV(NWT) = NTABBRV(I)
+ NWTDW(NWT) = NTABBDW(I)
+ ELSEIF(N40.NE.0.AND.IX.NE.31) THEN
+ NWT=NWT+1
+ NWTR (NWT) = KDD
+ NWTS (NWT) = 0
+ NWTRV(NWT) = 0
+ NWTDW(NWT) = N40
+ ELSE
+ NWT=NWT+1
+ NWTR (NWT) = KDD
+ NWTS (NWT) = NTABBS (I) + NSCAM + NSCAM07
+ NWTRV(NWT) = NINT(NTABBRV(I)*10.**N07)
+ NWTDW(NWT) = NTABBDW(I) + NDWINC + NDWINC07
+
+ END IF
+C
+C CHECK IF DATA ARE PRESENT IN DATA SECTION.
+C
+ IF(N221.NE.0) THEN
+ IX=KDD/1000
+ IF(IX.GT.9.AND.IX.NE.31) NWTDW(NWT)=0
+ N221=N221-1
+ END IF
+C
+c IF(NWTR(NWT).EQ.31011.OR.NWTR(NWT).EQ.31012) THEN
+c OREP=.true.
+c END IF
+c IF(OREP) THEN
+c if(NREP.GT.1.and.NWTR(NWT-1).ne.31011.and.
+c 1 NWTR(NWT-1).ne.31012) THEN
+c NWTDW(NWT)=0
+c NREP=NREP-1
+c IF(NREP.le.1) THEN
+c NREP=0
+c OREP=.false.
+c END IF
+c END IF
+c END IF
+
+C
+ 175 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 1.8 UPDATE M, CNAMES, CUNITS.
+C -------------------------
+ 180 CONTINUE
+C
+ CWTEN(NWT) = CTABBEN(I)
+ CWTU (NWT) = CTABBU(I)
+ NWTEN(NWT) = 0
+ IF(CTABBU(I)(1:3).EQ.'CCI') THEN
+ NWTEN(NWT)=658367
+ IF(N08.NE.0) THEN
+ NWTDW(NWT) = N08*8
+ END IF
+ ELSEIF(N40.NE.0.AND.IX.NE.31.AND.
+ 1 CTABBU(I)(1:3).NE.'COD'.AND.
+ 2 CTABBU(I)(1:3).NE.'FLA') THEN
+ NWTEN(NWT) = -999
+ ENDIF
+C
+ M = M + 1
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ WRITE(KNTN,*) 'BUUPWT:'
+ CALL BUERR(KERR)
+ RETURN
+ END IF
+C
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ RETURN
+ END
diff --git a/bufrdc/buxdes.F b/bufrdc/buxdes.F
new file mode 100755
index 0000000..17fe0ff
--- /dev/null
+++ b/bufrdc/buxdes.F
@@ -0,0 +1,171 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE BUXDES(K,KSEC1,KTDLEN,KTDLST,KDLEN,KDATA,KELEM,
+ 2 KTDEXL,KTDEXP,CNAMES,CUNITS,KERR)
+C
+C**** *BUXDES*
+C
+C
+C PURPOSE.
+C --------
+C EXPAND DATA DESCRIPTORS TO SHOW USER TEMPLATE HE
+C DESCRIBED BY ARAY KTDLST AND KDATA.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL BUXDES(K,KSEC1,KTDLEN,KTDLST,KDLEN,KDATA,KELEM,
+C KTDEXL,KTDEXP,CNAMES,CUNITS,KERR)
+C
+C INPUT :
+C
+C *K* - AN INTEGER, PRINTING SWITCH 0 - NO PRINT
+C 1 - PRINT
+C *KSEC1* - INTEGER ARRAY OF AT LEAST 40 WORDS CONTAINING
+C SECTION 1 INFORMATION
+C *KTDLEN* - INTEGER NUMBER OF DATA DESCRIPTORS IN SECTION 3
+C *KTDLST* - INTEGER ARRAY OF AT LEAST KTDLEN WORDS
+C CONTAINING DATA DESCRIPTORS FOR BUFR SECTION 3
+C *KDLEN* - INTEGER (DIMENSION OF KDATA ARRAY)
+C *KDATA* - INTEGER ARRAY CONTAINING DATA NEEDED FOR DATA
+C DESCRIPTOR EXPANSION (DELAYED REPLICATION FACTORS)
+C WHICH APPEAR IN THE VALUES ARRAY
+C
+C *KELEM* - INTEGER NUMBER OF ELEMENTS IN BUFR TEMPLATE.
+C
+C OUTPUT:
+C *KTDEXL* - AN INTEGER CONTAINING NUMBER OF EXPANDED ELEMENTS
+C *KTDEXP* - AN INTEGER ARRAY CONTAINING EXPANDED LIST OF DESCRIPTORS
+C *CNAMES* - CHARACTER*64 ARRAY OF KELEM CONTAINING ELEMENT NAMES
+C *CUNITS* - CHARACTER*24 ARRAY OF KELEM CONTAINING ELEMENT UNITS
+C *KERR* - RETURN ERROR CODE
+C
+C
+C METHOD.
+C -------
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/06/93.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+# include "parameter.F"
+# include "bcomunit.F"
+# include "bcmwork.F"
+# include "bcmdefc.F"
+# include "bcmbef.F"
+# include "bcmwt.F"
+C
+ DIMENSION KSEC1(JSEC1),KSEC3(JSEC3)
+#ifndef R_4
+ REAL*8 VALUES(JCVAL)
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL VALUES(JCVAL)
+ REAL RVIND
+ REAL EPS
+#endif
+ DIMENSION KTDLST(KTDLEN)
+ DIMENSION KDATA(KDLEN)
+ DIMENSION KTDEXP(KELEM)
+C
+ CHARACTER*4 CECMWF,CUSER
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+
+C
+C ------------------------------------------------------------------
+C
+C* 1. SET CONSTANTS.
+C --------------
+ 100 CONTINUE
+C
+ KERR=0
+ IF(CECMWF.NE.'ECMF') THEN
+ CALL BUIVAR(KERR)
+ KPT = 0
+ CECMWF='ECMF'
+ END IF
+C
+C -----------------------------------------------------------------
+C* 2. LOAD BUFR TABLES.
+C -----------------
+ 200 CONTINUE
+C
+ CALL BUETAB(KSEC1,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C ------------------------------------------------------------------
+C 6. EXPAND DATA DESCRIPTORS.
+C ------------------------
+ 600 CONTINUE
+C
+
+ CALL BUEDD(KPT,KTDLEN,KTDLST,KDLEN,KDATA,KSEC3,
+ 1 KVALS,VALUES,KELEM,CNAMES,CUNITS,KERR)
+C
+ IF(KERR.GT.0) RETURN
+C
+ KTDEXL =M
+ DO 301 I=1,KTDEXL
+ KTDEXP(I)=NWTR(I)
+ 301 CONTINUE
+C
+ IF(K.EQ.1) THEN
+C
+ WRITE(KNTN,'(1H ,//)')
+ WRITE(KNTN,'(1H ,A)') ' DATA DESCRIPTORS (UNEXPANDED)'
+C
+ WRITE(KNTN,'(1H )')
+ DO 110 I=1,KTDLEN
+ WRITE(KNTN,'(1H ,I4,2X,I6.6)') I,KTDLST(I)
+ 110 CONTINUE
+C
+ WRITE(KNTN,'(1H ,/)')
+ WRITE(KNTN,'(1H ,A)') ' DATA DESCRIPTORS (EXPANDED)'
+ WRITE(KNTN,'(1H )')
+ WRITE(KNTN,'(1H ,A,A)')' ELEMENT NAME',
+ 1 ' UNIT'
+ WRITE(KNTN,'(1H )')
+C
+ DO 120 I=1,KTDEXL
+ WRITE(KNTN,'(1H ,I5,2X,I6.6,2X,A,2X,A)') I,KTDEXP(I),
+ 1 CNAMES(I)(1:64),CUNITS(I)(1:24)
+ 120 CONTINUE
+ END IF
+C
+C
+C -----------------------------------------------------------------
+ RETURN
+C
+ END
diff --git a/bufrdc/ctable.F b/bufrdc/ctable.F
new file mode 100755
index 0000000..821658a
--- /dev/null
+++ b/bufrdc/ctable.F
@@ -0,0 +1,261 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CTABLE(YNAME,KERR)
+C
+C**** *CTABLE*
+C
+C
+C PURPOSE.
+C --------
+C THE MAIN PURPOSE OF THIS PROGRAMME IS TO CREATE WORKING
+C CODE TABLES FOR *BUFR* DECODING.
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C BINARY UNIVERSAL FORM FOR DATA REPRESENTATION, *FM 94 BUFR*.
+C
+C J.K.GIBSON AND *M.DRAGOSAVAC,1987:* DECODING *DATA *REPRESENTATION
+C *FM 94 BUFR*,*TECHNICAL *MEMORANDUM *NO. 134
+C
+C J.K.GIBSON,1986:*EMOS 2 - *STANDARDS FOR SOFTWARE DEVELOPMENT
+C AND MAINTANANCE *,*TECHICAL MEMORANDUM *NO.
+C *ECMWF*.
+C
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JANUARY 1991.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+# include "parameter.F"
+# include "bcomwork.F"
+# include "bcomtab.F"
+# include "bcomtabc.F"
+# include "bcomct.F"
+# include "bcomctc.F"
+# include "bcomroot.F"
+# include "bcomtabload.F"
+# include "bcomtabloadc.F"
+
+
+C
+ CHARACTER*64 CTEXT
+ CHARACTER*64 CTABBEN
+ CHARACTER*24 CTABBU
+ CHARACTER*256 YFNAME
+ CHARACTER*(*) YNAME
+ CHARACTER*120 YENTRY
+C
+ REAL*8 RVIND,EPS
+C
+C ------------------------------------------------------------------
+C* 1. SET INITIAL CONSTANTS AND POINTERS
+C ----------------------------------
+ 100 CONTINUE
+C
+ J=0
+ YFNAME=' '
+C
+ DO 101 I=1,JCTEXT
+ CTEXT(I)=' '
+ 101 CONTINUE
+C
+ DO 102 I=1,JCTAB
+ NREF(I)=0
+ NSTART(I)=0
+ NLEN(I)=0
+ 102 CONTINUE
+C
+ DO 103 I=1,JCTST
+ NCODNUM(I)=0
+ NSTARTC(I)=0
+ NLENC (I)=0
+ 103 CONTINUE
+C
+ II=INDEX(YNAME,' ')
+ II=II-1
+ YFNAME=YNAME(1:II)
+ II=INDEX(YFNAME,' ')
+ II=II-1
+ CALL GET_FREE_UNIT(IUNIT)
+ OPEN(UNIT=IUNIT,FILE=YFNAME(1:II),ERR=401,STATUS='OLD')
+C
+C ------------------------------------------------------------------
+C* 2. READ IN CODE TABLE ENTRY
+C ------------------------
+ 200 CONTINUE
+C
+C
+ READ(IUNIT,'(A)',ERR=402,END=300) YENTRY
+C
+ J = J+1
+C
+ IF(J.GT.JCTAB) THEN
+ PRINT*,' DIMENSION TOO SMALL J=',J
+ kerr=66
+ return
+ END IF
+C
+C ------------------------------------------------------------------
+C* 2.1 SET ARRAYS FOR CODE TABLE TABLE REFERENCE, STARTING POINTERS
+C FOR LIST OF CODE NUMBERS, LENGTH , LIST OF CODE NUMBERS,
+C STARTING POINTERS AND LENGTH OF TEXT INFORMATION.
+ 210 CONTINUE
+C
+ READ(YENTRY,'(I6,1X,I4,1X,I4,1X,I2)',IOSTAT=ios) NREF(J),NLEN(J),
+ 1 NCODE,NLINE
+ if(ios.ne.0) then
+ print*,YENTRY
+ print*,'Internal read error 1'
+ return
+ end if
+
+C
+ IF(J.EQ.1) THEN
+ NSTART (J) = 1
+ NSTARTC(J) = 1
+ IPT = 1
+ IIPT= 1
+ ELSE
+ NSTART(J) = NSTART(J-1) + NLEN(J-1)
+ IPT = NSTART(J)
+ IIPT = IIPT + 1
+ NSTARTC(IPT)= IIPT
+ END IF
+C
+C
+ NCODNUM(IPT)=NCODE
+ NLENC ( IPT)=NLINE
+C
+ CTEXT (IIPT)=YENTRY(21:80)
+C -------------------------------------------------------------------
+ IF(NLENC(IPT).GT.1) THEN
+ DO 220 JA=1,NLENC(IPT)-1
+ READ(IUNIT,'(A)',END=300) YENTRY
+ IIPT=IIPT+1
+ CTEXT(IIPT)=YENTRY(21:80)
+ 220 CONTINUE
+ END IF
+C
+ IF(NLEN(J).GT.1) THEN
+ DO 230 JA=1,NLEN(J)-1
+ READ(IUNIT,'(A)',END=300) YENTRY
+ READ(YENTRY,'(12X,I4,1X,I2)',IOSTAT=IOS) NCODE,NLINE
+ if(IOS.ne.0) then
+ print*,YENTRY
+ print*,'Internal read error 2'
+ return
+ end if
+ IPT = IPT + 1
+ IIPT =IIPT + 1
+ NCODNUM(IPT)= NCODE
+ NSTARTC(IPT)= IIPT
+ NLENC (IPT)=NLINE
+ CTEXT(IIPT) = YENTRY(21:80)
+ IF(NLENC(IPT).GT.1) THEN
+ DO 240 JB=1,NLENC(IPT)-1
+ READ(IUNIT,'(A)',END=300) YENTRY
+ IIPT=IIPT+1
+ CTEXT(IIPT)=YENTRY(21:80)
+ 240 CONTINUE
+ END IF
+ 230 CONTINUE
+ END IF
+C
+ GO TO 200
+C
+C ------------------------------------------------------------------
+ 300 CONTINUE
+C
+ IF(NTT.EQ.JTMAX.AND.NTC.NE.0) THEN
+ DO J=1,JCTAB
+ MNREF(J,NTC)=NREF(J)
+ MNSTART(J,NTC)=NSTART(J)
+ MNLEN(J,NTC)=NLEN(J)
+ END DO
+ DO J=1,JCTST
+ MNCODNUM(J,NTC)=NCODNUM(J)
+ MNSTARTC(J,NTC)=NSTARTC(J)
+ MNLENC(J,NTC)=NLENC(J)
+ END DO
+ DO J=1,JCTEXT
+ CCTEXT(J,NTC)=CTEXT(J)
+ END DO
+ ELSE
+ DO J=1,JCTAB
+ MNREF(J,NTT)=NREF(J)
+ MNSTART(J,NTT)=NSTART(J)
+ MNLEN(J,NTT)=NLEN(J)
+ END DO
+ DO J=1,JCTST
+ MNCODNUM(J,NTT)=NCODNUM(J)
+ MNSTARTC(J,NTT)=NSTARTC(J)
+ MNLENC(J,NTT)=NLENC(J)
+ END DO
+ DO J=1,JCTEXT
+ CCTEXT(J,NTT)=CTEXT(J)
+ END DO
+
+ END IF
+
+ CLOSE(IUNIT)
+C
+C write(*,'(1h )')
+C write(*,'(1H ,a,i4)') 'Total number of entries in Table C is ',j
+C
+ RETURN
+C -----------------------------------------------------------------
+ 400 CONTINUE
+C
+ 401 CONTINUE
+C
+ KERR=62
+ WRITE(*,4401) IOS,YFNAME
+ 4401 FORMAT(1H ,'Open error ',i4,' on ',a)
+ RETURN
+C
+ 402 CONTINUE
+ KERR=7
+ WRITE(*,4402) IOS,YFNAME
+ 4402 FORMAT(1H ,'Read error ',i4,' on ',a)
+ RETURN
+C
+ END
diff --git a/bufrdc/ctable1.F b/bufrdc/ctable1.F
new file mode 100755
index 0000000..4719f89
--- /dev/null
+++ b/bufrdc/ctable1.F
@@ -0,0 +1,216 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CTABLE1(YNAME,KERR)
+C
+C**** *CTABLE1*
+C
+C
+C PURPOSE.
+C --------
+C THE MAIN PURPOSE OF THIS PROGRAMME IS TO CREATE WORKING
+C CODE TABLES FOR *BUFR* DECODING.
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C BINARY UNIVERSAL FORM FOR DATA REPRESENTATION, *FM 94 BUFR*.
+C
+C J.K.GIBSON AND *M.DRAGOSAVAC,1987:* DECODING *DATA *REPRESENTATION
+C *FM 94 BUFR*,*TECHNICAL *MEMORANDUM *NO. 134
+C
+C J.K.GIBSON,1986:*EMOS 2 - *STANDARDS FOR SOFTWARE DEVELOPMENT
+C AND MAINTANANCE *,*TECHICAL MEMORANDUM *NO.
+C *ECMWF*.
+C
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JANUARY 1991.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+# include "parameter.F"
+# include "bcmwork.F"
+# include "bcmtab.F"
+# include "bcmtabc.F"
+# include "bcmct.F"
+# include "bcmctc.F"
+# include "bcmroot.F"
+
+C
+ CHARACTER*64 CTEXT
+ CHARACTER*64 CTABBEN
+ CHARACTER*24 CTABBU
+ CHARACTER*256 YFNAME
+ CHARACTER*(*) YNAME
+ CHARACTER*120 YENTRY
+C
+ REAL*8 RVIND,EPS
+C
+C ------------------------------------------------------------------
+C* 1. SET INITIAL CONSTANTS AND POINTERS
+C ----------------------------------
+ 100 CONTINUE
+C
+ J=0
+ YFNAME=' '
+C
+ DO 101 I=1,JCTEXT
+ CTEXT(I)=' '
+ 101 CONTINUE
+C
+ DO 102 I=1,JCTAB
+ NREF(I)=0
+ NSTART(I)=0
+ NLEN(I)=0
+ 102 CONTINUE
+C
+ DO 103 I=1,JCTST
+ NCODNUM(I)=0
+ NSTARTC(I)=0
+ NLENC (I)=0
+ 103 CONTINUE
+C
+ II=INDEX(YNAME,' ')
+ II=II-1
+ YFNAME=YNAME(1:II)
+ II=INDEX(YFNAME,' ')
+ II=II-1
+ CALL GET_FREE_UNIT(IUNIT)
+ OPEN(UNIT=IUNIT,FILE=YFNAME(1:II),ERR=401,STATUS='OLD')
+C
+C ------------------------------------------------------------------
+C* 2. READ IN CODE TABLE ENTRY
+C ------------------------
+ 200 CONTINUE
+C
+C
+ READ(IUNIT,'(A)',ERR=402,END=300) YENTRY
+C
+ J = J+1
+C
+ IF(J.GT.JCTAB) THEN
+ PRINT*,' DIMENSION TOO SMALL J=',J
+ kerr=66
+ return
+ END IF
+C
+C ------------------------------------------------------------------
+C* 2.1 SET ARRAYS FOR CODE TABLE TABLE REFERENCE, STARTING POINTERS
+C FOR LIST OF CODE NUMBERS, LENGTH , LIST OF CODE NUMBERS,
+C STARTING POINTERS AND LENGTH OF TEXT INFORMATION.
+ 210 CONTINUE
+C
+ READ(YENTRY,'(I6,1X,I4,1X,I4,1X,I2)') NREF(J),NLEN(J),NCODE,NLINE
+
+C
+ IF(J.EQ.1) THEN
+ NSTART (J) = 1
+ NSTARTC(J) = 1
+ IPT = 1
+ IIPT= 1
+ ELSE
+ NSTART(J) = NSTART(J-1) + NLEN(J-1)
+ IPT = NSTART(J)
+ IIPT = IIPT + 1
+ NSTARTC(IPT)= IIPT
+ END IF
+C
+C
+ NCODNUM(IPT)=NCODE
+ NLENC ( IPT)=NLINE
+C
+ CTEXT (IIPT)=YENTRY(21:80)
+C -------------------------------------------------------------------
+ IF(NLENC(IPT).GT.1) THEN
+ DO 220 JA=1,NLENC(IPT)-1
+ READ(IUNIT,'(A)',END=300) YENTRY
+ IIPT=IIPT+1
+ CTEXT(IIPT)=YENTRY(21:80)
+ 220 CONTINUE
+ END IF
+C
+ IF(NLEN(J).GT.1) THEN
+ DO 230 JA=1,NLEN(J)-1
+ READ(IUNIT,'(A)',END=300) YENTRY
+ READ(YENTRY,'(12X,I4,1X,I2)') NCODE,NLINE
+ IPT = IPT + 1
+ IIPT =IIPT + 1
+ NCODNUM(IPT)= NCODE
+ NSTARTC(IPT)= IIPT
+ NLENC (IPT)=NLINE
+ CTEXT(IIPT) = YENTRY(21:80)
+ IF(NLENC(IPT).GT.1) THEN
+ DO 240 JB=1,NLENC(IPT)-1
+ READ(IUNIT,'(A)',END=300) YENTRY
+ IIPT=IIPT+1
+ CTEXT(IIPT)=YENTRY(21:80)
+ 240 CONTINUE
+ END IF
+ 230 CONTINUE
+ END IF
+C
+ GO TO 200
+C
+C ------------------------------------------------------------------
+ 300 CONTINUE
+C
+ CLOSE(IUNIT)
+C
+C write(*,'(1h )')
+C write(*,'(1H ,a,i4)') 'Total number of entries in Table C is ',j
+C
+ RETURN
+C -----------------------------------------------------------------
+ 400 CONTINUE
+C
+ 401 CONTINUE
+C
+ KERR=62
+ WRITE(*,4401) IOS,YFNAME
+ 4401 FORMAT(1H ,'Open error ',i4,' on ',a)
+ RETURN
+C
+ 402 CONTINUE
+ KERR=7
+ WRITE(*,4402) IOS,YFNAME
+ 4402 FORMAT(1H ,'Read error ',i4,' on ',a)
+ RETURN
+C
+ END
diff --git a/bufrdc/dtable.F b/bufrdc/dtable.F
new file mode 100755
index 0000000..3d17105
--- /dev/null
+++ b/bufrdc/dtable.F
@@ -0,0 +1,213 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE DTABLE(YNAME,KERR)
+C
+C**** *DTABLE*
+C
+C
+C PURPOSE.
+C --------
+C THE MAIN PURPOSE OF THIS PROGRAMME IS TO CREATE WORKING
+C TABLE OF SEQUENCE DESCRIPTORS FOR *BUFR* DECODING.
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C BINARY UNIVERSAL FORM FOR DATA REPRESENTATION, *FM 94 BUFR*.
+C
+C J.K.GIBSON AND *M.DRAGOSAVAC,1987:* DECODING *DATA *REPRESENTATION
+C *FM 94 BUFR*,*TECHNICAL *MEMORANDUM *NO.
+C
+C J.K.GIBSON,1986:*EMOS 2 - *STANDARDS FOR SOFTWARE DEVELOPMENT
+C AND MAINTANANCE *,*TECHICAL MEMORANDUM *NO.
+C *ECMWF*.
+C
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JANUARY 1991.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+# include "parameter.F"
+# include "bcomwork.F"
+# include "bcomtab.F"
+# include "bcomtabc.F"
+# include "bcomct.F"
+# include "bcomctc.F"
+# include "bcomroot.F"
+# include "bcomtabload.F"
+# include "bcomtabloadc.F"
+
+C
+ CHARACTER*64 CTABBEN,CCTABBEN
+ CHARACTER*24 CTABBU,CCTABBU,CTABLE_LIST
+ CHARACTER*120 YENTRY
+ CHARACTER*256 YFNAME
+ CHARACTER*(*) YNAME
+ REAL*8 RVIND,EPS
+C
+C ------------------------------------------------------------------
+C* 1. SET INITIAL CONSTANTS.
+C ----------------------
+ 100 CONTINUE
+C
+ KERR=0
+ J =0
+ IST=1
+ YFNAME=' '
+C
+ DO 101 I=1,JTAB
+ NTABDTR(I)=999999
+ NTABDL (I)=0
+ NTABDST(I)=0
+ 101 CONTINUE
+C
+ DO 102 I=1,JTAB*20
+ NTABDSQ(I)=0
+ 102 CONTINUE
+C
+ II=INDEX(YNAME,' ')
+ II=II-1
+ YFNAME=YNAME(1:II)
+ II=INDEX(YFNAME,' ')
+ II=II-1
+ CALL GET_FREE_UNIT(IUNIT)
+ OPEN(UNIT=IUNIT,iostat=ios,FILE=YFNAME(1:II),STATUS='OLD')
+ IF(IOS.NE.0) THEN
+ print*,'Open error on ',YFNAME(1:II)
+ kerr=63
+ return
+ END IF
+C
+C ------------------------------------------------------------------
+C* 2. READ IN TABLE D
+C ---------------
+C
+ 200 CONTINUE
+C
+ READ(IUNIT,'(A)',IOSTAT=IOS,END=300) YENTRY
+ IF(IOS.NE.0) THEN
+ print*,'Read error ',ios
+ kerr=8
+ return
+ END IF
+C
+ J=J+1
+C
+ IF(J.GT.JTAB) THEN
+ PRINT*,' DIMENSION TOO SMALL J=',J
+ KERR=64
+ RETURN
+ END IF
+C
+C ------------------------------------------------------------------
+C* 2.1 SET ARRAYS FOR TABLE REFERENCE, DATA LENGTH,
+C* STARTING POINTER AND SEQUENCE DESCRIPTORS.
+C
+ 210 CONTINUE
+C
+C
+ READ(YENTRY,'(1X,I6,I3)') NTABDTR(J),NTABDL (J)
+C
+ IF(J.EQ.1) THEN
+ IST=1
+ NTABDST(J)=IST
+ ELSE
+ IST=IST + NTABDL(J-1)
+ NTABDST(J)=IST
+ END IF
+C
+ IF(NTABDL(J).GT.1) THEN
+ READ(YENTRY,'(11X,I6)') NTABDSQ(IST)
+ IIST=IST
+C
+ DO 220 JA=1,NTABDL(J)-1
+ IIST=IIST+1
+ READ(IUNIT,'(A)',END=300) YENTRY
+ READ(YENTRY,'(11X,I6)') NTABDSQ(IIST)
+ 220 CONTINUE
+C
+ ELSE
+ READ(YENTRY,'(11X,I6)') NTABDSQ(IST)
+ END IF
+C
+C
+C WRITE(*,1000) NTABDTR(J),NTABDL(J),NTABDST(J),
+C 1 (NTABDSQ(I),I=NTABDST(J),NTABDL(J)+NTABDST(J)-1)
+C
+C1000 FORMAT(1H ,I6,I3,1X,I6,1X,I6/ (18X,I6))
+C
+ GO TO 200
+C
+C ------------------------------------------------------------------
+ 300 CONTINUE
+C
+ IF(NTT.EQ.JTMAX.AND.NTC.NE.0) THEN
+ DO J=1,JTAB
+ MTABDTR(J,NTC)=NTABDTR(J)
+ MTABDL (J,NTC)=NTABDL(J)
+ MTABDST(J,NTC)=NTABDST(J)
+ END DO
+ DO J=1,JTAB*20
+ MTABDSQ(J,NTC)=NTABDSQ(J)
+ END DO
+ ELSE
+ DO J=1,JTAB
+ MTABDTR(J,NTT)=NTABDTR(J)
+ MTABDL (J,NTT)=NTABDL(J)
+ MTABDST(J,NTT)=NTABDST(J)
+ END DO
+ DO J=1,JTAB*20
+ MTABDSQ(J,NTT)=NTABDSQ(J)
+ END DO
+ END IF
+C
+ CLOSE(IUNIT)
+C
+c WRITE(*,'(1h )')
+c WRITE(*,'(1h ,a,i4)')'Total number of entries in Table D is ',j
+C
+ RETURN
+C -----------------------------------------------------------------
+ 400 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/bufrdc/dtable1.F b/bufrdc/dtable1.F
new file mode 100755
index 0000000..ff7375f
--- /dev/null
+++ b/bufrdc/dtable1.F
@@ -0,0 +1,212 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE DTABLE1(YNAME,KERR)
+C
+C**** *DTABLE1*
+C
+C
+C PURPOSE.
+C --------
+C THE MAIN PURPOSE OF THIS PROGRAMME IS TO CREATE WORKING
+C TABLE OF SEQUENCE DESCRIPTORS FOR *BUFR* DECODING.
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C BINARY UNIVERSAL FORM FOR DATA REPRESENTATION, *FM 94 BUFR*.
+C
+C J.K.GIBSON AND *M.DRAGOSAVAC,1987:* DECODING *DATA *REPRESENTATION
+C *FM 94 BUFR*,*TECHNICAL *MEMORANDUM *NO.
+C
+C J.K.GIBSON,1986:*EMOS 2 - *STANDARDS FOR SOFTWARE DEVELOPMENT
+C AND MAINTANANCE *,*TECHICAL MEMORANDUM *NO.
+C *ECMWF*.
+C
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JANUARY 1991.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+# include "parameter.F"
+# include "bcmwork.F"
+# include "bcmtab.F"
+# include "bcmtabc.F"
+# include "bcmct.F"
+# include "bcmctc.F"
+# include "bcmroot.F"
+# include "bcmtabload.F"
+# include "bcmtabloadc.F"
+
+C
+ CHARACTER*64 CTABBEN,CCTABBEN
+ CHARACTER*24 CTABBU,CCTABBU,CTABLE_LIST
+ CHARACTER*120 YENTRY
+ CHARACTER*256 YFNAME
+ CHARACTER*(*) YNAME
+ REAL*8 RVIND,EPS
+C
+C ------------------------------------------------------------------
+C* 1. SET INITIAL CONSTANTS.
+C ----------------------
+ 100 CONTINUE
+C
+ KERR=0
+ J =0
+ IST=1
+ YFNAME=' '
+C
+ DO 101 I=1,JTAB
+ NTABDTR(I)=999999
+ NTABDL (I)=0
+ NTABDST(I)=0
+ 101 CONTINUE
+C
+ DO 102 I=1,JTAB*20
+ NTABDSQ(I)=0
+ 102 CONTINUE
+C
+ II=INDEX(YNAME,' ')
+ II=II-1
+ YFNAME=YNAME(1:II)
+ II=INDEX(YFNAME,' ')
+ II=II-1
+ CALL GET_FREE_UNIT(IUNIT)
+ OPEN(UNIT=IUNIT,iostat=ios,FILE=YFNAME(1:II),STATUS='OLD')
+ IF(IOS.NE.0) THEN
+ print*,'Open error on ',YFNAME(1:II)
+ kerr=63
+ return
+ END IF
+C
+C ------------------------------------------------------------------
+C* 2. READ IN TABLE D
+C ---------------
+C
+ 200 CONTINUE
+C
+ READ(IUNIT,'(A)',IOSTAT=IOS,END=300) YENTRY
+ IF(IOS.NE.0) THEN
+ print*,'Read error ',ios
+ kerr=8
+ return
+ END IF
+C
+ J=J+1
+C
+ IF(J.GT.JTAB) THEN
+ PRINT*,' DIMENSION TOO SMALL J=',J
+ KERR=64
+ RETURN
+ END IF
+C
+C ------------------------------------------------------------------
+C* 2.1 SET ARRAYS FOR TABLE REFERENCE, DATA LENGTH,
+C* STARTING POINTER AND SEQUENCE DESCRIPTORS.
+C
+ 210 CONTINUE
+C
+C
+ READ(YENTRY,'(1X,I6,I3)') NTABDTR(J),NTABDL (J)
+C
+ IF(J.EQ.1) THEN
+ IST=1
+ NTABDST(J)=IST
+ ELSE
+ IST=IST + NTABDL(J-1)
+ NTABDST(J)=IST
+ END IF
+C
+ IF(NTABDL(J).GT.1) THEN
+ READ(YENTRY,'(11X,I6)') NTABDSQ(IST)
+ IIST=IST
+C
+ DO 220 JA=1,NTABDL(J)-1
+ IIST=IIST+1
+ READ(IUNIT,'(A)',END=300) YENTRY
+ READ(YENTRY,'(11X,I6)') NTABDSQ(IIST)
+ 220 CONTINUE
+C
+ ELSE
+ READ(YENTRY,'(11X,I6)') NTABDSQ(IST)
+ END IF
+C
+C
+c WRITE(*,1000) NTABDTR(J),NTABDL(J),NTABDST(J),
+c 1 (NTABDSQ(I),I=NTABDST(J),NTABDL(J)+NTABDST(J)-1)
+C
+c1000 FORMAT(1H ,I6,I3,1X,I6,1X,I6/ (18X,I6))
+C
+ GO TO 200
+C
+C ------------------------------------------------------------------
+ 300 CONTINUE
+C
+ IF(NTT.EQ.JTMAX.AND.NTC.NE.0) THEN
+ DO J=1,JTAB
+ MTABDTR(J,NTC)=NTABDTR(J)
+ MTABDL (J,NTC)=NTABDL(J)
+ MTABDST(J,NTC)=NTABDST(J)
+ END DO
+ DO J=1,JTAB*20
+ MTABDSQ(J,NTC)=NTABDSQ(J)
+ END DO
+ ELSE
+ DO J=1,JTAB
+ MTABDTR(J,NTT)=NTABDTR(J)
+ MTABDL (J,NTT)=NTABDL(J)
+ MTABDST(J,NTT)=NTABDST(J)
+ END DO
+ DO J=1,JTAB*20
+ MTABDSQ(J,NTT)=NTABDSQ(J)
+ END DO
+ END IF
+
+ CLOSE(IUNIT)
+C WRITE(*,'(1h )')
+C WRITE(*,'(1h ,a,i4)') 'Total number of entries in Table D is ',j
+C
+ RETURN
+C -----------------------------------------------------------------
+ 400 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/bufrdc/fmmh.F b/bufrdc/fmmh.F
new file mode 100755
index 0000000..28e7cd7
--- /dev/null
+++ b/bufrdc/fmmh.F
@@ -0,0 +1,259 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE FMMH(KLA,KLO,KELEM,VALUES,KSEC3,RMINLAT,RMINLON,
+ 1 RMAXLAT,RMAXLON)
+C
+C**** *FMM*
+C
+C
+C PURPOSE.
+C --------
+C FIND MINIMUM AND MAXIMUM LATITUDE AND LOGITUDE.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *FMMH(KLA,KLO,VALUES,KSEC3,RMINLAT,RMINLON,
+C RMAXLAT,RMAXLON)*
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/04/1991.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H,Y)
+C
+C
+C
+ DIMENSION KSEC3(*)
+#ifndef R_4
+ REAL*8 VALUES(*)
+ REAL*8 RNLON
+ REAL*8 RNLAT
+ REAL*8 RMINLAT
+ REAL*8 RMINLON
+ REAL*8 RMAXLAT
+ REAL*8 RMAXLON
+ REAL*8 RVIND
+ REAL*8 EPS
+#else
+ REAL VALUES(*)
+ REAL RNLON
+ REAL RNLAT
+ REAL RMINLAT
+ REAL RMINLON
+ REAL RMAXLAT
+ REAL RMAXLON
+ REAL RVIND
+ REAL EPS
+
+#endif
+C -----------------------------------------------------------------
+C* 1. FIND MIN/MAX LATITUDES/LONGITUDES.
+C ----------------------------------
+ 100 CONTINUE
+C
+ RVIND=1.7D38
+ EPS=10.D-7
+C
+ ISUB=KSEC3(3)
+C
+C
+ DO 101 I=1,ISUB
+ KLAI=KELEM*(I-1)+KLA
+ IF(ABS(VALUES( KLAI)-RVIND)/RVIND.GT.EPS)
+ 1 THEN
+ RMINLAT=VALUES( KLAI)
+ GO TO 105
+ END IF
+ 101 CONTINUE
+C
+ 105 CONTINUE
+C
+ DO 110 I=1,ISUB
+C
+ KLAI=KELEM*(I-1)+KLA
+ IF(ABS(VALUES( KLAI)-RVIND)/RVIND.LT.EPS) GO TO 110
+ RNLAT=VALUES( KLAI)
+ IF(RNLAT.LT.RMINLAT) RMINLAT=RNLAT
+C
+ 110 CONTINUE
+C
+ DO 111 I=1,ISUB
+ KLOI=KELEM*(I-1)+KLO
+ IF(ABS(VALUES( KLOI)-RVIND)/RVIND.GT.EPS) THEN
+ RMINLON=VALUES( KLOI)+180.
+ GO TO 115
+ END IF
+ 111 CONTINUE
+C
+ 115 CONTINUE
+C
+ DO 120 I=1,ISUB
+C
+ KLOI=KELEM*(I-1)+KLO
+ IF(ABS(VALUES( KLOI)-RVIND)/RVIND.LT.EPS) GO TO 120
+ RNLON=VALUES( KLOI)+180.
+ IF(RNLON.LT.RMINLON) RMINLON=RNLON
+C
+ 120 CONTINUE
+C
+ DO 121 I=1,ISUB
+ KLAI=KELEM*(I-1)+KLA
+ IF(ABS(VALUES(KLAI)-RVIND)/RVIND.GT.EPS) THEN
+ RMAXLAT=VALUES( KLAI)
+ GO TO 125
+ END IF
+ 121 CONTINUE
+C
+ 125 CONTINUE
+C
+ DO 130 I=1,ISUB
+C
+ KLAI=KELEM*(I-1)+KLA
+ IF(ABS(VALUES( KLAI)-RVIND)/RVIND.LT.EPS) GO TO 130
+ RNLAT=VALUES( KLAI)
+ IF(RNLAT.GT.RMAXLAT) RMAXLAT=RNLAT
+C
+ 130 CONTINUE
+C
+C
+ DO 131 I=1,ISUB
+ KLOI=KELEM*(I-1)+KLO
+ IF(ABS(VALUES( KLOI)-RVIND)/RVIND.GT.EPS) THEN
+ RMAXLON=VALUES( KLOI)+180.
+ GO TO 135
+ END IF
+ 131 CONTINUE
+C
+ 135 CONTINUE
+C
+ DO 140 I=1,ISUB
+C
+ KLOI=KELEM*(I-1)+KLO
+ IF(ABS(VALUES( KLOI)-RVIND)/RVIND.LT.EPS) GO TO 140
+ RNLON=VALUES( KLOI)+180.
+ IF(RNLON.GT.RMAXLON) RMAXLON=RNLON
+C
+ 140 CONTINUE
+C
+ RMINLON=RMINLON-180.
+
+ RMAXLON=RMAXLON-180.
+C
+C
+C* 2. CHECK IF ALL OBSERVATION FITS IN THE BOX.
+C -----------------------------------------
+ 200 CONTINUE
+C
+ DO 201 I=1,ISUB
+C
+ KLAI=KELEM*(I-1)+KLA
+ KLOI=KELEM*(I-1)+KLO
+ IF((VALUES( KLAI).LT.RMINLAT.AND.VALUES( KLAI).GT.RMAXLAT).OR.
+ 1 (VALUES( KLOI).LT.RMINLON.AND.VALUES( KLOI).GT.RMAXLON) )
+ 2 GO TO 210
+ 201 CONTINUE
+C
+C ALL DATA IN THE BOX
+C
+ RETURN
+C
+C* 2.1 FIND MAX NEGATIVE LONGITUDE AND MIN POSITIVE LONGITUDE.
+C -------------------------------------------------------
+ 210 CONTINUE
+C
+ DO 211 I=1,ISUB
+ KLOI=KELEM*(I-1)+KLO
+ IF(ABS(VALUES( KLOI)-RVIND)/RVIND.GT.EPS) THEN
+ IF(VALUES( KLOI).LT.0) THEN
+ RMAXLON=VALUES( KLOI)
+ GO TO 215
+ END IF
+ END IF
+ 211 CONTINUE
+C
+C NEGATIVE LONGITUDES NOT FOUND
+C
+ PRINT*,'FMM:NEGATIVE LONGITUDES NOT FOUND'
+ RETURN
+C
+ 215 CONTINUE
+C
+ DO 220 I=1,ISUB
+C
+ KLOI=KELEM*(I-1)+KLO
+ IF(ABS(VALUES( KLOI)-RVIND)/RVIND.LT.EPS) GO TO 220
+ IF(VALUES( KLOI).LT.0) THEN
+ RNLON=VALUES( KLOI)
+
+ IF(RNLON.GT.RMAXLON) RMAXLON=RNLON
+ END IF
+C
+ 220 CONTINUE
+C
+C* 2.3 FIND MIN POSITIVE LONGITUDE.
+C
+ 230 CONTINUE
+ DO 231 I=1,ISUB
+ KLOI=KELEM*(I-1)+KLO
+ IF(ABS(VALUES( KLOI)-RVIND)/RVIND.GT.EPS) THEN
+ IF(VALUES( KLOI).GE.0) THEN
+ RMINLON=VALUES( KLOI)
+ GO TO 235
+ END IF
+ END IF
+ 231 CONTINUE
+C
+C POSITIVE LONGITUDES NOT FOUND
+C
+ PRINT*,'FMM:POSITIVE LONGITUDES NOT FOUND'
+ RETURN
+C
+ 235 CONTINUE
+C
+ DO 232 I=1,ISUB
+C
+ KLOI=KELEM*(I-1)+KLO
+ IF(ABS(VALUES( KLOI)-RVIND)/RVIND.LT.EPS) GO TO 232
+ IF(VALUES( KLOI).GE.0) THEN
+ RNLON=VALUES( KLOI)
+ IF(RNLON.LT.RMINLON) RMINLON=RNLON
+ END IF
+C
+ 232 CONTINUE
+
+ RETURN
+ END
diff --git a/bufrdc/get_free_unit.F b/bufrdc/get_free_unit.F
new file mode 100755
index 0000000..572dfe8
--- /dev/null
+++ b/bufrdc/get_free_unit.F
@@ -0,0 +1,67 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GET_FREE_UNIT(KUNIT)
+C
+C**** *CTABLE*
+C
+C
+C PURPOSE.
+C --------
+C Get free unit number
+C
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C
+C AUTHOR.
+
+C M. DRAGOSAVAC *ECMWF* JANUARY 2008.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+
+C
+ DO I=10,300
+ INQUIRE(UNIT=i,IOSTAT=IOS,OPENED=OPENED)
+ IF(.NOT.OPENED) THEN
+ KUNIT=I
+ GO TO 100
+ END IF
+ END DO
+100 CONTINUE
+ END
diff --git a/bufrdc/get_name_unit.F b/bufrdc/get_name_unit.F
new file mode 100755
index 0000000..179e23b
--- /dev/null
+++ b/bufrdc/get_name_unit.F
@@ -0,0 +1,122 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GET_NAME_UNIT(KREFERENCE,YNAME,YUNIT)
+C
+C**** *GET_NAME_UNIT*
+C
+C
+C PURPOSE.
+C --------
+C FIND NAME AND THE UNIT FOR THE PARTICULAR REFERENCE NUMBER.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *GET_NAME_UNIT(KREFERENCE,YNAME,YUNIT)*
+C
+C
+C INPUT : *KREFERENCE* - TABLE B REFERENCE NUMBER
+C OUTPUT:
+C *CNAMES* - ARRAY CONTAINING ELEMENT NAMES
+C *CUNITS* - ARRAY CONTAINING ELEMENT UNITS
+C *KERR* - RETURN CODE
+C
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/01/2006.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+
+C
+# include "parameter.F"
+
+ CHARACTER*64 YNAME
+ CHARACTER*24 YUNIT
+C
+# include "bcomtab.F"
+# include "bcomtabc.F"
+C
+ CHARACTER*64 CTABBEN
+ CHARACTER*24 CTABBU
+ DIMENSION KREF(11)
+ CHARACTER*64 CN(11)
+
+C
+ DATA KREF/222000,235000,236000,237000,224000,225000,223000,
+ 1 232000,235000,999999,0/
+ DATA CN/'QUALITY INFORMATION FOLLOW',
+ 1 'CANCEL BACKWARD DATA REFERENCE',
+ 2 'BACKWARD REFERENCE BIT MAP',
+ 3 'USE PREVIOUSLY DEFINED BIT MAP',
+ 4 'FIRST ORDER STATISTICS FOLLOW',
+ 5 'DIFFERENCE STATISTICAL VALUES FOLLOW',
+ 6 'SUBSTITUTED VALUES FOLLOW',
+ 7 'REPLACE/RETAINED VALUES FOLLOW',
+ 8 'CANCEL BACKWARD DATA REFERENCE',
+ 9 'ASSOCIATED FIELD',
+ 1 'REFERENCE VALUE'/
+C
+ KERR=0
+ DO I=1,11
+ IF(KREFERENCE.EQ.KREF(I)) THEN
+ YNAME=CN(I)
+ YUNIT=' '
+ RETURN
+ END IF
+ END DO
+ IF(KREFERENCE/1000.EQ.205) THEN
+ YNAME='CHARACTERS'
+ YUNIT='CCITT IA5 '
+ RETURN
+ END IF
+C
+ ICLASS=KREFERENCE/1000
+ IYYY =KREFERENCE-ICLASS*1000+1
+ ICLASS=ICLASS+1
+C
+ if(ICLASS.GT.64.or.IYYY.gt.256) then
+ print*,'KREFERENCE=',KREFERENCE
+ print*,'ICLASS=',ICLASS
+ print*,'IYYY=',IYYY
+ KERR=57
+ RETURN
+ end if
+ I=NTABP(ICLASS,IYYY)
+ YNAME=CTABBEN(I)
+ YUNIT=CTABBU(I)
+C
+ RETURN
+ END
diff --git a/bufrdc/get_tables.F b/bufrdc/get_tables.F
new file mode 100755
index 0000000..d90963f
--- /dev/null
+++ b/bufrdc/get_tables.F
@@ -0,0 +1,105 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GET_TABLES(K)
+C
+C**** *GET_TABLES*
+C
+C
+C PURPOSE.
+C --------
+C GET TABLES FROM THE ARRAY OF TABLES
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C BINARY UNIVERSAL FORM FOR DATA REPRESENTATION, FM 94 BUFR.
+C
+C J.K.GIBSON AND M.DRAGOSAVAC,1987: DECODING DATA
+C REPRESENTATION FM 94 BUFR,TECHNICAL MEMORANDUM NO.
+C
+C J.K.GIBSON,1986:EMOS 2 - STANDARDS FOR SOFTWARE DEVELOPMENT
+C AND MAINTANANCE ,TECHICAL MEMORANDUM NO. ECMWF.
+C
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JANUARY 2007
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+# include "parameter.F"
+# include "bcomtab.F"
+# include "bcomtabc.F"
+# include "bcomtabload.F"
+# include "bcomtabloadc.F"
+
+C
+ CHARACTER*64 CTABBEN,CCTABBEN
+ CHARACTER*24 CTABBU,CCTABBU,CTABLE_LIST
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+C
+ IF(K.LT.1.OR.K.GT.JTMAX) THEN
+ print*,'Table number > JTMAX'
+ call exit(2)
+ END IF
+ DO 101 I=1,64
+ DO 101 ii=1,255
+ NTABP(I,II)=MTABP(I,II,K)
+ 101 CONTINUE
+C
+ DO 102 I=1,JTAB
+ NTABBTR(I)=MTABBTR(I,K)
+ NTABBS (I)=MTABBS (I,K)
+ NTABBRV(I)=MTABBRV(I,K)
+ NTABBDW(I)=MTABBDW(I,K)
+ CTABBEN(I)=CCTABBEN(I,K)
+ CTABBU (I)=CCTABBU(I,K)
+ NTABDTR(I)=MTABDTR(I,K)
+ NTABDL (I)=MTABDL(I,K)
+ NTABDST(I)=MTABDST(I,K)
+ 102 CONTINUE
+ DO I=1,JTAB*20
+ NTABDSQ(I)=MTABDSQ(I,K)
+ END DO
+C
+C ------------------------------------------------------------------
+ RETURN
+ END
diff --git a/bufrdc/get_tables1.F b/bufrdc/get_tables1.F
new file mode 100755
index 0000000..e088916
--- /dev/null
+++ b/bufrdc/get_tables1.F
@@ -0,0 +1,107 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GET_TABLES1(K)
+C
+C**** *GET_TABLES1*
+C
+C
+C PURPOSE.
+C --------
+C GET TABLES FROM THE ARRAY OF TABLES FOR
+C ENCODING
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C BINARY UNIVERSAL FORM FOR DATA REPRESENTATION, FM 94 BUFR.
+C
+C J.K.GIBSON AND M.DRAGOSAVAC,1987: DECODING DATA
+C REPRESENTATION FM 94 BUFR,TECHNICAL MEMORANDUM NO.
+C
+C J.K.GIBSON,1986:EMOS 2 - STANDARDS FOR SOFTWARE DEVELOPMENT
+C AND MAINTANANCE ,TECHICAL MEMORANDUM NO. ECMWF.
+C
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JANUARY 2007
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+# include "parameter.F"
+# include "bcmtab.F"
+# include "bcmtabc.F"
+# include "bcmtabload.F"
+# include "bcmtabloadc.F"
+
+C
+ CHARACTER*64 CTABBEN,CCTABBEN
+ CHARACTER*24 CTABBU,CCTABBU,CTABLE_LIST
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+C
+ IF(K.LT.1.OR.K.GT.JTMAX) THEN
+ print*,'Table number > JTMAX'
+ call exit(2)
+ END IF
+ DO 101 I=1,64
+ DO 101 ii=1,255
+ NTABP(I,II)=MTABP(I,II,K)
+ 101 CONTINUE
+C
+ DO 102 I=1,JTAB
+ NTABBTR(I)=MTABBTR(I,K)
+ NTABBS (I)=MTABBS (I,K)
+ NTABBRV(I)=MTABBRV(I,K)
+ NTABBDW(I)=MTABBDW(I,K)
+ CTABBEN(I)=CCTABBEN(I,K)
+ CTABBU (I)=CCTABBU(I,K)
+ NTABDTR(I)=MTABDTR(I,K)
+ NTABDL (I)=MTABDL(I,K)
+ NTABDST(I)=MTABDST(I,K)
+ 102 CONTINUE
+
+ DO I=1,JTAB*20
+ NTABDSQ(I)=MTABDSQ(I,K)
+ END DO
+C
+C ------------------------------------------------------------------
+ RETURN
+ END
diff --git a/bufrdc/getcode.F b/bufrdc/getcode.F
new file mode 100755
index 0000000..bbe1bcf
--- /dev/null
+++ b/bufrdc/getcode.F
@@ -0,0 +1,116 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GETCODE(KREF,KCODE,YCODE,KERR)
+C
+C**** *GETCODE*
+C
+C
+C PURPOSE.
+C --------
+C
+C The main purpose of the subroutine is to get text
+C associated with code number
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JANUARY 2008.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+# include "parameter.F"
+# include "bcomwork.F"
+# include "bcomtab.F"
+# include "bcomtabc.F"
+# include "bcomct.F"
+# include "bcomctc.F"
+# include "bcomroot.F"
+C# include "bcomtabload.F"
+C# include "bcomtabloadc.F"
+
+
+C
+ CHARACTER*64 CTEXT
+ CHARACTER*64 CTABBEN
+ CHARACTER*24 CTABBU
+ CHARACTER*256 YCODE
+C
+C
+C ------------------------------------------------------------------
+C* 1. SET INITIAL CONSTANTS AND POINTERS
+C ----------------------------------
+ 100 CONTINUE
+C
+ kerr=0
+C
+ ycode=' '
+ do i=1,JCTAB
+ if(nref(i).eq.kref) go to 200
+ end do
+ ycode(1:)='CODE ENTRY NOT KNOWN'
+ return
+c
+ 200 continue
+ ipt=nstart(i)
+ do i=ipt,ipt+nlen(i)-1
+ if(ncodnum(i).eq.KCODE) then
+ iptc=nstartc(i)
+ ii=1
+ iptc1=nlenc(i)+iptc-1
+ do j=iptc,iptc1
+ do k=64,1,-1
+ if(ctext(j)(k:k).ne.' ') then
+ iz=k
+ go to 201
+ end if
+ end do
+ 201 ycode(ii:ii+iz-1)=ctext(j)(1:iz)
+ ii=ii+iz
+ end do
+ go to 300
+ end if
+ end do
+ ycode(1:)='CODE ENTRY NOT KNOWN'
+C
+ 300 continue
+ return
+ END
diff --git a/bufrdc/getflag.F b/bufrdc/getflag.F
new file mode 100755
index 0000000..67f2dff
--- /dev/null
+++ b/bufrdc/getflag.F
@@ -0,0 +1,135 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GETFLAG(KREF,KCODE,KFLAG,YFLAG,KERR)
+C
+C**** *GETFLAG*
+C
+C
+C PURPOSE.
+C --------
+C
+C The main purpose of the subroutine is to get text
+C associated with code number
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JANUARY 2008.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+# include "parameter.F"
+# include "bcomwork.F"
+# include "bcomtab.F"
+# include "bcomtabc.F"
+# include "bcomct.F"
+# include "bcomctc.F"
+# include "bcomroot.F"
+C# include "bcomtabload.F"
+C# include "bcomtabloadc.F"
+
+
+C
+ CHARACTER*64 CTEXT
+ CHARACTER*64 CTABBEN
+ CHARACTER*24 CTABBU
+ CHARACTER*64 YFLAG(32)
+C
+C
+C ------------------------------------------------------------------
+C* 1. SET INITIAL CONSTANTS AND POINTERS
+C ----------------------------------
+ 100 CONTINUE
+C
+ J=0
+ do i=1,32
+ YFLAG(i)=' '
+ end do
+C
+ do i=1,JCTAB
+ if(nref(i).eq.kref) go to 200
+ end do
+ print*,'Could not find ',kref
+ ierr=2
+ return
+c
+ 200 continue
+C
+ ictab=i
+C
+C Find data width for kref
+C
+ do i=1,JTAB
+ if(NTABBTR(I).eq.kref) go to 201
+ end do
+
+ print*,'Could not find ',kref
+ ierr=2
+ return
+ 201 continue
+c
+ ibtab=i
+c
+ iwidth=NTABBDW(ibtab)
+c
+ if(KCODE.eq.NMASK(iwidth)) then
+ KFLAG=1
+ YFLAG(1)='MISSING VALUE'
+ return
+ else
+ ipt=nstart(ictab)
+ iptc=nstartc(ipt)
+ KFLAG=0
+ do i=ipt,ipt+nlen(ictab)-1
+ ibitnumber=ncodnum(i)
+c test bit
+ ipos=iwidth-ibitnumber
+ if(btest(KCODE,ipos)) then
+ ic=iptc+ibitnumber-1
+ KFLAG=KFLAG+1
+ YFLAG(KFLAG)=ctext(ic)
+ end if
+ end do
+ end if
+
+ return
+ END
diff --git a/bufrdc/mbufr_mars_filter.F b/bufrdc/mbufr_mars_filter.F
new file mode 100755
index 0000000..1b4c195
--- /dev/null
+++ b/bufrdc/mbufr_mars_filter.F
@@ -0,0 +1,246 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE MBUFR_MARS_FILTER(KSIZE,KREQUEST,KBUFL,
+ 1 KBUFF,FOUND,KERR)
+C
+C**** *MBUFR_MARS_FILTER*
+C
+C
+C PURPOSE.
+C --------
+C FILTER BUFR MESSAGES FROM kbuff array
+C ACCORDING TO REQUEST and returning requested bufr message
+C in kbuff array if repacking is not needed or kbufr otherwise.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C NONE.
+C
+C METHOD.
+C -------
+C
+C
+C EXTERNALS.
+C ----------
+C
+C CALL MBUSEL
+C CALL MBUFREX
+C CALL MBUFREN
+C CALL MBUPRS0
+C CALL MBUPRS1
+C CALL MBUPRS2
+C CALL MBUPRS3
+C CALL MBUPRT
+C CALL MBUUKEY
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 12/09/2002
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H,Y)
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2=4096,JSEC3= 4,
+ 1 JSEC4=2,JELEM=160000,JSUBS=400,JCVAL=150 ,JBUFL=512000,
+#ifdef JBPW_64
+ 2 JBPW = 64,JTAB =3000,JCTAB=3000,JCTST=3000,JCTEXT=6000,
+#else
+ 2 JBPW = 32,JTAB =3000,JCTAB=3000,JCTST=3000,JCTEXT=6000,
+#endif
+ 3 JWORK=4096000,JKEY=46, JTMAX=10,JTCLAS=64,JTEL=255)
+C
+ PARAMETER (KELEM=200)
+ PARAMETER (KVALS=200000)
+C
+ DIMENSION KBUFF(JBUFL)
+ DIMENSION KSUP(JSUP) ,KSEC0(JSEC0),KSEC1(JSEC1)
+ DIMENSION KSEC2(JSEC2),KSEC3(JSEC3),KSEC4(JSEC4)
+ DIMENSION KEY(JKEY),KEY1(JKEY),KEY2(JKEY)
+ REAL*8 VALUES(KVALS)
+ REAL*8 RQV(KELEM)
+ REAL*8 RVIND
+ REAL*8 EPS
+ DIMENSION KTDLST(KELEM),KTDEXP(KELEM)
+ DIMENSION KDATA(200)
+ DIMENSION KREQ(2),KRQ(KELEM)
+C
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+ CHARACTER*80 CVALS(KVALS)
+ CHARACTER*9 CIDENTS
+ LOGICAL FOUND
+ DIMENSION KREQUEST(KSIZE)
+C
+C
+C ------------------------------------------------------------------
+C* 1. GET FILE NAMES.
+C ---------------
+ 100 CONTINUE
+C
+ RVIND=1.7D38
+ NBYTES=JBPW/8
+ EPS=10.D-7
+C
+
+ KBUFL1=KBUFL/NBYTES+1
+C
+C
+C -----------------------------------------------------------------
+C* 2.1 EXPAND BUFR MESSAGE SECTION 0,1,2
+C ---------------------------------
+ 210 CONTINUE
+C
+ IERR=0
+ CALL BUS0123( KBUFL,KBUFF,KSUP,KSEC0,KSEC1,KSEC2,KSEC3,IERR)
+ IF(KERR.NE.0) RETURN
+C
+ IF(KSEC3(3).EQ.1.OR.KSEC3(3).GT.1.AND.
+ 1 KSEC3(4).EQ.192.OR.KSEC3(4).EQ.64) THEN
+C Expand first 9 elements
+ CALL BUSTOP(9)
+ END IF
+
+C 2.1.1 UNPACK KEY
+C
+C CALL BUUKEY(KSEC1,KSEC2,KEY,KSUP,KERR)
+C
+C PRINT KEY
+C
+C CALL BUPRS2(KSUP ,KEY)
+C
+C----------------------------------------------------------------
+C
+C 2.3 MULTI-SUBSET MESSAGE
+C
+ 230 CONTINUE
+C
+ IF(KSUP(6).GT.1) THEN
+ KEL=KVALS/KSUP(6)
+ IF(KEL.GT.KELEM) KEL=KELEM
+ ELSE
+ KEL=KELEM
+ END IF
+C
+ KREQ(1)=1
+ KREQ(2)=2
+ KRQ (1)=002048
+ KRQ (2)=002019
+ RQV (1)=RVIND
+ RQV (2)=RVIND
+ KRQL=2
+
+ KERR=0
+ CALL BUSRQ(KREQ,KRQL,KRQ,RQV,KERR)
+ IF(KERR.NE.0) RETURN
+C
+ CALL BUFREX(KBUFL1,KBUFF,KSUP,KSEC0 ,KSEC1,KSEC2 ,KSEC3 ,KSEC4,
+ 1 KEL,CNAMES,CUNITS,KVALS,VALUES,CVALS,KERR)
+C
+ IF(KERR.NE.0) RETURN
+C
+C* 2.4 PRINT EXPANDED BUFR MESSAGE.
+C ----------------------------
+ 240 CONTINUE
+C
+C CALL BUPRS0(KSEC0)
+C CALL BUPRS1(KSEC1)
+C CALL BUUKEY(KSEC1,KSEC2,KEY,KSUP,KERR)
+C CALL BUPRS2(KSUP ,KEY)
+C
+ CALL BUSEL(KTDLEN,KTDLST,KTDEXL,KTDEXP,KERR)
+ IF(KERR.NE.0) RETURN
+C
+C CALL BUPRS3(KSEC3,KTDLEN,KTDLST,KTDEXL,KTDEXP,KEL,CNAMES)
+C IST=1
+C IEND=KSUP(6)
+C CALL BUPRT(ICODE,IST,IEND,KEL,CNAMES,CUNITS,CVALS,
+C 1 KVALS,VALUES,KSUP,KSEC1,IERR)
+C
+C
+C
+ i_002048=0
+ i_002019=0
+ DO I=1,KTDEXL
+ IF(KTDEXP(i).EQ.002048) i_002048=i
+ IF(KTDEXP(i).EQ.002019) i_002019=i
+ END DO
+C
+ if(i_002048.ne.0) then
+ do i=1,ksize
+ if(krequest(i).eq.605) then
+ krequest(i)=0
+ elseif(krequest(i).eq.623) then
+ krequest(i)=1
+ elseif(krequest(i).eq.627) then
+ krequest(i)=2
+ elseif(krequest(i).eq.570) then
+ krequest(i)=3
+ elseif(krequest(i).eq.574) then
+ krequest(i)=4
+ elseif(krequest(i).eq.590) then
+ krequest(i)=5
+ elseif(krequest(i).eq.905) then
+ krequest(i)=6
+ elseif(krequest(i).eq.312) then
+ krequest(i)=7
+ elseif(krequest(i).eq.313) then
+ krequest(i)=8
+ elseif(krequest(i).eq.203) then
+ krequest(i)=11
+ end if
+ end do
+ end if
+C
+ FOUND=.FALSE.
+C
+ if(i_002048.ne.0) then
+ do i=1,ksize
+ do j=1,ksec3(3)
+ ij=i_002048+(j-1)*kel
+ if(abs(values(ij)-rvind)/rvind.gt.eps) then
+ if(nint(values(ij)).eq.krequest(i)) FOUND =.TRUE.
+ end if
+ end do
+ end do
+ elseif(i_002019.ne.0) then
+ do i=1,ksize
+ do j=1,ksec3(3)
+ ij=i_002019+(j-1)*kel
+ if(abs(values(ij)-rvind)/rvind.gt.eps) then
+ if(nint(values(ij)).eq.krequest(i)) FOUND =.TRUE.
+ end if
+ end do
+ end do
+ else
+ FOUND =.FALSE.
+ end if
+
+C -----------------------------------------------------------------
+ KERR=0
+C
+ RETURN
+C
+C
+ END
diff --git a/bufrdc/parameter.F b/bufrdc/parameter.F
new file mode 100755
index 0000000..baff418
--- /dev/null
+++ b/bufrdc/parameter.F
@@ -0,0 +1,18 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2=4096,JSEC3= 4,
+ 1 JSEC4=2,JELEM=320000,JSUBS=400,JCVAL=150 ,JBUFL=512000,
+#ifdef JBPW_64
+ 2 JBPW = 64,JTAB =3000,JCTAB=3000,JCTST=9000,JCTEXT=9000,
+#else
+ 2 JBPW = 32,JTAB =3000,JCTAB=3000,JCTST=9000,JCTEXT=9000,
+#endif
+ 3 JWORK=4096000,JKEY=46, JTMAX=10,JTCLAS=64,JTEL=255)
diff --git a/bufrdc/setlalo.F b/bufrdc/setlalo.F
new file mode 100755
index 0000000..0d24dc5
--- /dev/null
+++ b/bufrdc/setlalo.F
@@ -0,0 +1,254 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE SETLALO(K,KLA,KLO,KERR)
+C
+C RETURN INDICES FOR LATITUDE AND LONGITUDE
+C
+ KERR=0
+C
+ IF(K.EQ.1) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.2) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.3) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.4) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.7) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.9) THEN
+ KLA=10
+ KLO=11
+ RETURN
+ ELSEIF(K.EQ.11) THEN
+ KLA=10
+ KLO=11
+ RETURN
+ ELSEIF(K.EQ.13) THEN
+ KLA=10
+ KLO=11
+ RETURN
+ ELSEIF(K.EQ.19) THEN
+ KLA=10
+ KLO=11
+ RETURN
+ ELSEIF(K.EQ.21) THEN
+ KLA=10
+ KLO=11
+ RETURN
+ ELSEIF(K.EQ.22) THEN
+ KLA=10
+ KLO=11
+ RETURN
+ ELSEIF(K.EQ.23) THEN
+ KLA=10
+ KLO=11
+ RETURN
+ ELSEIF(K.EQ.51) THEN
+ KLA=8
+ KLO=9
+ RETURN
+ ELSEIF(K.EQ.53) THEN
+ KLA=8
+ KLO=9
+ RETURN
+ ELSEIF(K.EQ.54) THEN
+ KLA=22
+ KLO=23
+ RETURN
+ ELSEIF(K.EQ.55) THEN
+ KLA=22
+ KLO=23
+ RETURN
+ ELSEIF(K.EQ.61) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.62) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.63) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.71) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.72) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.73) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.82) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.83) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.84) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.85) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.86) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.87) THEN
+ KLA=12
+ KLO=13
+ RETURN
+ ELSEIF(K.EQ.88) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.89) THEN
+ KLA=12
+ KLO=13
+ RETURN
+ ELSEIF(K.EQ.91) THEN
+ KLA=10
+ KLO=11
+ RETURN
+ ELSEIF(K.EQ.92) THEN
+ KLA=10
+ KLO=11
+ RETURN
+ ELSEIF(K.EQ.95) THEN
+ KLA=3
+ KLO=4
+ RETURN
+ ELSEIF(K.EQ.96) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.97) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.101) THEN
+ KLA=10
+ KLO=11
+ RETURN
+ ELSEIF(K.EQ.102) THEN
+ KLA=11
+ KLO=12
+ RETURN
+ ELSEIF(K.EQ.103) THEN
+ KLA=11
+ KLO=12
+ RETURN
+ ELSEIF(K.EQ.104) THEN
+ KLA=15
+ KLO=16
+ RETURN
+ ELSEIF(K.EQ.106) THEN
+ KLA=11
+ KLO=12
+ RETURN
+ ELSEIF(K.EQ.121) THEN
+ KLA=10
+ KLO=11
+ RETURN
+ ELSEIF(K.EQ.122) THEN
+ KLA=10
+ KLO=11
+ RETURN
+ ELSEIF(K.EQ.123) THEN
+ KLA=10
+ KLO=11
+ RETURN
+ ELSEIF(K.EQ.126) THEN
+ KLA=9
+ KLO=10
+ RETURN
+ ELSEIF(K.EQ.127) THEN
+ KLA=11
+ KLO=12
+ RETURN
+ ELSEIF(K.EQ.129) THEN
+ KLA=11
+ KLO=12
+ RETURN
+ ELSEIF(K.EQ.130) THEN
+ KLA=11
+ KLO=12
+ RETURN
+ ELSEIF(K.EQ.131) THEN
+ KLA=10
+ KLO=11
+ RETURN
+ ELSEIF(K.EQ.132) THEN
+ KLA=7
+ KLO=8
+ RETURN
+ ELSEIF(K.EQ.133) THEN
+ KLA=7
+ KLO=8
+ RETURN
+ ELSEIF(K.EQ.136) THEN
+ KLA=14
+ KLO=15
+ RETURN
+ ELSEIF(K.EQ.137) THEN
+ KLA=16
+ KLO=17
+ RETURN
+ ELSEIF(K.EQ.142) THEN
+ KLA=8
+ KLO=9
+ RETURN
+ ELSEIF(K.EQ.144) THEN
+ KLA=8
+ KLO=9
+ RETURN
+ ELSEIF(K.EQ.145) THEN
+ KLA=15
+ KLO=16
+ RETURN
+ ELSEIF(K.EQ.164) THEN
+ KLA=6
+ KLO=7
+ RETURN
+ ELSEIF(K.EQ.255) THEN
+ KLA=8
+ KLO=9
+ RETURN
+ ELSE
+ PRINT*,'POINTERS FOR ',K,' SYBTYPE NOT DEFINED.'
+ KERR=1
+ KLA=0
+ KLO=0
+ RETURN
+ END IF
+C
+ RETURN
+ END
diff --git a/bufrdc/sources b/bufrdc/sources
new file mode 100755
index 0000000..0622f5c
--- /dev/null
+++ b/bufrdc/sources
@@ -0,0 +1,106 @@
+#
+# Sources for bufrdc
+#
+
+SOURCES.F = \
+ bbuprs0.F \
+ bbuprs1.F \
+ bbuprs2.F \
+ bbuprs3.F \
+ bbuprt.F \
+ bbuprtbox.F \
+ buaug.F \
+ bubox.F \
+ bucrkey.F \
+ bucrekey.F \
+ buedd.F \
+ buens0.F \
+ buens1.F \
+ buens2.F \
+ buens3.F \
+ buens4.F \
+ buens5.F \
+ buepmrk.F \
+ buepmrkc.F \
+ buepwt.F \
+ buepwtc.F \
+ buerr.F \
+ buetab.F \
+ buetd.F \
+ buetdr.F \
+ buevar.F \
+ buexs0.F \
+ buexs1.F \
+ buexs2.F \
+ buexs3.F \
+ buexs3p.F \
+ buexs4.F \
+ buexs5.F \
+ bufren.F \
+ bufrex.F \
+ bugbts.F \
+ bugetbm.F \
+ buivar.F \
+ bunexs.F \
+ bunpck.F \
+ bunpks.F \
+ buoctn.F \
+ buoper.F \
+ buoperc.F \
+ bupck.F \
+ bupkey.F \
+ bupks.F \
+ bupmrk.F \
+ buprco.F \
+ buprq.F \
+ buprs0.F \
+ buprs1.F \
+ buprs2.F \
+ buprs3.F \
+ buprt.F \
+ buprtbox.F \
+ burep.F \
+ burepc.F \
+ burqc.F \
+ burquc.F \
+ bustop.F \
+ bus012.F \
+ busel.F \
+ buset.F \
+ busrp.F \
+ busrq.F \
+ bustdr.F \
+ buuatb.F \
+ buukey.F \
+ buunp.F \
+ buunps.F \
+ buupwt.F \
+ buxdes.F \
+ bugtll.F \
+ buexs33.F \
+ busel2.F \
+ bus0123.F \
+ get_name_unit.F \
+ mbufr_mars_filter.F \
+ fmmh.F \
+ btable.F \
+ ctable.F \
+ dtable.F \
+ btable1.F \
+ ctable1.F \
+ dtable1.F \
+ big_endian.F \
+ swap_bytes4.F \
+ swap_bytes8.F \
+ get_tables.F \
+ get_tables1.F \
+ get_free_unit.F \
+ busbytesR8.F \
+ busbytesR4.F \
+ bugbytesR8.F \
+ bugbytesR4.F \
+ buget_opera_image.F \
+ getcode.F \
+ getflag.F \
+ bu_check_s4s.F \
+ setlalo.F
diff --git a/bufrdc/swap_bytes4.F b/bufrdc/swap_bytes4.F
new file mode 100755
index 0000000..a6d74b5
--- /dev/null
+++ b/bufrdc/swap_bytes4.F
@@ -0,0 +1,36 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ subroutine swap_bytes4(r1,r2)
+c ---------------------------------
+ implicit none
+
+ real*4 r1, r2
+ real*4 r14
+ real*4 r24
+ integer*4 kint14,kint24
+
+ equivalence(r14,kint14)
+ equivalence(r24,kint24)
+
+
+
+c Reverse order of bytes
+
+ r14=r1
+
+ call mvbits(kint14, 24, 8, kint24, 0)
+ call mvbits(kint14, 16, 8, kint24, 8)
+ call mvbits(kint14, 8, 8, kint24,16)
+ call mvbits(kint14, 0, 8, kint24,24)
+ r2=r24
+
+ return
+ end
diff --git a/bufrdc/swap_bytes8.F b/bufrdc/swap_bytes8.F
new file mode 100755
index 0000000..0ec9034
--- /dev/null
+++ b/bufrdc/swap_bytes8.F
@@ -0,0 +1,42 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ subroutine swap_bytes8(r1,r2)
+c ---------------------------------
+ implicit none
+
+ real*8 r1, r2
+ real*8 r18
+ real*8 r28
+ integer*8 kint18,kint28
+
+ equivalence(r18,kint18)
+ equivalence(r28,kint28)
+
+
+
+c Reverse order of bytes
+
+ r18=r1
+
+ call mvbits(kint18, 56, 8, kint28, 0)
+ call mvbits(kint18, 48, 8, kint28, 8)
+ call mvbits(kint18, 40, 8, kint28,16)
+ call mvbits(kint18, 32, 8, kint28,24)
+ call mvbits(kint18, 24, 8, kint28,32)
+ call mvbits(kint18, 16, 8, kint28,40)
+ call mvbits(kint18, 8, 8, kint28,48)
+ call mvbits(kint18, 0, 8, kint28,56)
+
+
+ r2=r28
+
+ return
+ end
diff --git a/bufrtables/B0000000000098000000.TXT b/bufrtables/B0000000000098000000.TXT
new file mode 100755
index 0000000..e00fb7f
--- /dev/null
+++ b/bufrtables/B0000000000098000000.TXT
@@ -0,0 +1,458 @@
+ 000001 TABLE A: ENTRY CCITTIA5 0 0 24
+ 000002 TABLE A: DATA CATEGORY DESCRIPTION, LINE 1 CCITTIA5 0 0 256
+ 000003 TABLE A: DATA CATEGORY DESCRIPTION, LINE 2 CCITTIA5 0 0 256
+ 000005 BUFR EDITION NUMBER CCITTIA5 0 0 24
+ 000010 F DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 8
+ 000011 X DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 16
+ 000012 Y DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 24
+ 000013 ELEMENT NAME, LINE 1 CCITTIA5 0 0 256
+ 000014 ELEMENT NAME, LINE 2 CCITTIA5 0 0 256
+ 000015 UNITS NAME CCITTIA5 0 0 192
+ 000016 UNITS SCALE SIGN CCITTIA5 0 0 8
+ 000017 UNITS SCALE CCITTIA5 0 0 24
+ 000018 UNITS REFERENCE SIGN CCITTIA5 0 0 8
+ 000019 UNITS REFERENCE VALUE CCITTIA5 0 0 80
+ 000020 ELEMENT DATA WIDTH CCITTIA5 0 0 24
+ 000030 DESCRIPTOR DEFINING SEQUENCE CCITTIA5 0 0 40
+ 001001 WMO BLOCK NUMBER NUMERIC 0 0 7
+ 001002 WMO STATION NUMBER NUMERIC 0 0 10
+ 001003 WMO REGION NUMBER NUMERIC 0 0 3
+ 001004 WMO REGION SUB-AREA NUMERIC 0 0 3
+ 001005 BUOY/PLATFORM IDENTIFIER NUMERIC 0 0 17
+ 001006 AIRCRAFT IDENTIFIER CCITTIA5 0 0 64
+ 001007 SATELLITE IDENTIFIER CODE TABLE 001007 0 0 10
+ 001008 AIRCRAFT REGISTRATION NUMBER CCITTIA5 0 0 64
+ 001011 SHIP'S CALL SIGN CCITTIA5 0 0 72
+ 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM DEGREE TRUE 0 0 9
+ 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM M/S 0 0 10
+ 001014 PLATFORM DRIFT SPEED(HIGH PRECISION M/S 2 0 10
+ 001021 SYNOPTIC FEATURE IDENTIFIER NUMERIC 0 0 14
+ 001031 GENERATING CENTRE CODE TABLE 001031 0 0 16
+ 001032 GENERATING APPLICATION CODE TABLE 001032 0 0 8
+ 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64
+ 001192 MODEL VERSION NUMBER CODE TABLE 001192 0 0 8
+ 001193 SIGMA_0 SIMULATION METHOD CODE TABLE 001193 0 0 4
+ 001194 CARRIER BALLOON/AIRCRAFT IDENTIFIER CCITTIA5 0 0 72
+ 001195 MOBIL LAND STATION IDENTIFIER CCITTIA5 0 0 72
+ 001201 GENERATING APPLICATION CODE TABLE 001201 0 0 8
+ 001208 VELOCITY OF PLATFORM, X M/S 5 -1073741824 31
+ 001209 VELOCITY OF PLATFORM, Y M/S 5 -1073741824 31
+ 001210 VELOCITY OF PLATFORM, Z M/S 5 -1073741824 31
+ 002001 TYPE OF STATION CODE TABLE 002001 0 0 2
+ 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 002002 0 0 4
+ 002003 TYPE OF MEASURING EQUIPMENT USED CODE TABLE 002003 0 0 4
+ 002004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUEMENT OR TYPE OF CR CODE TABLE 002004 0 0 4
+ 002005 PRECISION OF TEMTERATURE OBS. K 2 0 7
+ 002011 RADIOSONDE TYPE CODE TABLE 002011 0 0 8
+ 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 002012 0 0 4
+ 002013 SOLAR AND INFRARED RADIATION CORRECTION CODE TABLE 002013 0 0 4
+ 002014 TRACKING TECHNIQUE/STATUS OF SYSTEM CODE TABLE 002014 0 0 7
+ 002015 RADIOSONDE COMPLETNESS CODE TABLE 002015 0 0 4
+ 002021 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 002021 0 0 9
+ 002022 SATELLITE DATA PROCESSING TECHNIQUE USED FLAG TABLE 002022 0 0 8
+ 002023 CLOUD MOTION COMPUTATIONAL METHOD CODE TABLE 002023 0 0 4
+ 002024 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 002024 0 0 4
+ 002025 SATELLITE CHANNEL FLAG TABLE 002025 0 0 25
+ 002026 CROSS TRACK RESOLUTION M 2 0 12
+ 002027 ALONG TRACK RESOLUTION M 2 0 12
+ 002031 METHOD OF CURRENT MEASUREMENT CODE TABLE 002031 0 0 5
+ 002032 INDICATOR FOR DIGITIZATION CODE TABLE 002032 0 0 2
+ 002033 METHOD OF SALINITY/DEPTH MEASUREMENT CODE TABLE 002033 0 0 3
+ 002034 DROGUE TYPE CODE TABLE 002034 0 0 5
+ 002035 CABLE LENGTH M 0 0 9
+ 002036 BUOY TYPE CODE TABLE 002036 0 0 2
+ 002041 METHOD FOR ESTIMATING REPORTS RELATED TO SYNOPTIC FEATURES CODE TABLE 002041 0 0 6
+ 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 002061 0 0 3
+ 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 002062 0 0 4
+ 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16
+ 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 002070 0 0 4
+ 002101 TYPE OF ANTENNA CODE TABLE 002101 0 0 4
+ 002102 ANTENNA HEIGHT ABOVE TOWER BASE M 0 0 8
+ 002103 RADOME FLAG TABLE 002103 0 0 2
+ 002104 ANTENNA POLARISATION CODE TABLE 002104 0 0 4
+ 002105 MAXIMUM ANTENNA GAIN dB 0 0 6
+ 002106 3-dB BEAMWIDTH DEGREE 1 0 6
+ 002107 SIDELOBE SUPPRESION dB 0 0 6
+ 002108 CROSSPOL DISCRIMINATION(ON AXIS) dB 0 0 6
+ 002109 ANTENNA SPEED(AZIMUTH) DEGREE/S 2 0 12
+ 002110 ANTENNA SPEED(ELEVATION) DEGREE/S 2 0 12
+ 002111 RADAR INCIDENCE ANGLE DEGREE 1 0 10
+ 002112 RADAR TARGET AZIMUTH ANGLE DEGREE 1 0 12
+ 002113 NO. OF AZIMUTH LOOKS NUMERIC 0 0 4
+ 002114 ANTENNA EFFECTIVE SRFACE AREA M**2 0 0 15
+ 002121 MEAN FREQUENCY Hz -8 0 7
+ 002122 FREQUENCY AGILITY RANGE Hz -6 -128 8
+ 002123 PEAK POWER W -4 0 7
+ 002124 AVERAGE POWER W -1 0 7
+ 002125 PULSE REPETITION FREQUENCY Hz -1 0 8
+ 002126 PULSE WIDTH S 7 0 6
+ 002127 RECEIVER INTERMEDIATEFREQUENCY (IF) Hz -6 0 7
+ 002128 INTERMEDIATE FREQUENCY BANDWIDTH Hz -5 0 6
+ 002129 MINIMUM DETECTABLE SIGNAL(MDS) dB 0 -150 5
+ 002130 DYNAMIC RANGE dB 0 0 7
+ 002131 SENSITIVITY TIME CONTROL(STC) FLAG TABLE 002131 0 0 2
+ 002132 AZIMUTH POINTING ACCURACY DEGREE 2 0 6
+ 002133 ELEVATION POINTING ACCURACY DEGREE 2 0 6
+ 002134 ANTENNA BEAM AZIMUTH DEGREE 2 0 16
+ 002135 ANTENNA ELEVATION DEGREE 2 -9000 15
+ 002192 SAR AZIMUTH ANGLE DEGREE 0 0 9
+ 004001 YEAR YEAR 0 0 12
+ 004002 MONTH MONTH 0 0 4
+ 004003 DAY DAY 0 0 6
+ 004004 HOUR HOUR 0 0 5
+ 004005 MINUTE MINUTE 0 0 6
+ 004006 SECOND SECOND 0 0 6
+ 004011 TIME INCREMENT YEARS 0 -1024 11
+ 004012 TIME INCREMENT MONTHS 0 -1024 11
+ 004013 TIME INCREMENT DAYS 0 -1024 11
+ 004014 TIME INCREMENT HOURS 0 -1024 11
+ 004015 TIME INCREMENT MINUTES 0 -2048 12
+ 004016 TIME INCREMENT SECONDS 0 -4096 13
+ 004021 TIME PERIOD OR DISPLACEMENT YEARS 0 -1024 11
+ 004022 TIME PERIOD OR DISPLACEMENT MONTHS 0 -1024 11
+ 004023 TIME PERIOD OR DISPLACEMENT DAYS 0 -1024 11
+ 004024 TIME PERIOD OR DISPLACEMENT HOURS 0 -1024 11
+ 004025 TIME PERIOD OR DISPLACEMENT MINUTES 0 -2048 12
+ 004026 TIME PERIOD OR DISPLACEMENT SECONDS 0 -4096 13
+ 004043 DAY OF THE YEAR DAY 0 0 9
+ 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25
+ 005002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15
+ 005011 LATITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -9000000 25
+ 005012 LATITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -9000 15
+ 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16
+ 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16
+ 005031 ROW NUMBER NUMERIC 0 0 12
+ 005033 PIXEL SIZE ON HORIZONTAL-1 M -1 0 16
+ 005040 ORBIT NUMBER NUMERIC 0 0 24
+ 005041 SCAN LINE NUMBER NUMERIC 0 0 8
+ 005042 CHANNEL NUMBER NUMERIC 0 0 6
+ 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8
+ 005052 CHANNEL NUMBER INCREMENT NUMERIC 0 0 5
+ 005217 LOCATION OF PLATFORM, X M 2 -1073741824 31
+ 005053 FIELD OF VIEW NUMBER INCREMENT NUMERIC 0 0 5
+ 005232 DIRECTION (SPECTRAL) DEGREE 0 0 12
+ 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26
+ 006002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16
+ 006011 LONGITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -18000000 26
+ 006012 LONGITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -18000 16
+ 006021 DISTANCE M -1 0 13
+ 006031 COLUMN NUMBER NUMERIC 0 0 12
+ 006033 PIXEL SIZE ON HORIZONTAL-2 M -1 0 16
+ 006217 LOCATION OF PLATFORM, Y M 2 -1073741824 31
+ 006232 WAVENUMBER (SPECTRAL) RADS/M 5 0 13
+ 007001 HEIGHT OF STATION M 0 -400 15
+ 007002 HEIGHT OR ALTITUDE M -1 -40 16
+ 007003 GEOPOTENTIAL M**2/S**2 -1 -400 17
+ 007004 PRESSURE PA -1 0 14
+ 007005 HEIGHT INCREMENT M 0 -400 12
+ 007006 HEIGHT ABOVE STATION M 0 0 15
+ 007021 ELEVATION DEGREE 2 -9000 15
+ 007022 SOLAR ELEVATION DEGREE 2 -9000 15
+ 007061 DEPTH BELOW LAND SURFACE M 2 0 14
+ 007062 DEPTH BELOW SEA SURFACE M 1 0 17
+ 007217 LOCATION OF PLATFORM, Z M 2 -1073741824 31
+ 008001 VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 008001 0 0 7
+ 008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS) CODE TABLE 008002 0 0 6
+ 008003 VERTICAL SIGNIFICANCE (SATELLITE OBSERVATIONS) CODE TABLE 008003 0 0 6
+ 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 008004 0 0 3
+ 008011 HORIZONTAL SIGNIFICANCE CODE TABLE 008011 0 0 6
+ 008012 LAND/SEA QUALIFIER CODE TABLE 008012 0 0 2
+ 008021 TIME SIGNIFICANCE CODE TABLE 008021 0 0 5
+ 008022 TOTAL NUMBER(WITH RESPECT TO ACCUMULATION OR AVERAGE) NUMERIC 0 0 16
+ 008023 FIRST ORDER STATISTICS CODE TABLE 008023 0 0 6
+ 008024 DIFFERENCE STATISTICS CODE TABLE 008024 0 0 6
+ 008200 NUMBER OF OBSERVATIONS NUMERIC 0 0 8
+ 008222 GENERATOR SIGNIFICANCE CODE TABLE 008222 0 0 4
+ 010001 HEIGHT OF LAND SURFACE M 0 -400 15
+ 010002 HEIGHT M -1 -40 16
+ 010003 GEOPOTENTIAL M**2/S**2 -1 -400 17
+ 010004 PRESSURE PA -1 0 14
+ 010050 STD.DEV. ALTITUDE M 2 0 16
+ 010051 PRESSURE REDUCED TO MSL PA -1 0 14
+ 010052 ALTIMETER SETTING (QNH) PA -1 0 14
+ 010060 PRESSURE CHANGE PA -1 -1024 11
+ 010061 3 HOUR PRESSURE CHANGE PA -1 -500 10
+ 010062 24 HOUR PRESSURE CHANGE PA -1 -500 10
+ 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 010063 0 0 4
+ 010195 HEIGHT(HIGH ACCURACY) M 1 -4096 20
+ 011001 WIND DIRECTION DEGREE TRUE 0 0 9
+ 011002 WIND SPEED M/S 1 0 12
+ 011003 U-COMPONENT M/S 1 -4096 13
+ 011004 V-COMPONENT M/S 1 -4096 13
+ 011005 W-COMPONENT PA/S 1 -512 10
+ 011006 W-COMPONENT M/S 2 -4096 13
+ 011011 WIND DIRECTION AT 10 M DEGREE TRUE 0 0 9
+ 011012 WIND SPEED AT 10 M M/S 1 0 12
+ 011013 WIND DIRECTION AT 5 M DEGREE TRUE 0 0 9
+ 011014 WIND SPEED AT 5 M M/S 1 0 12
+ 011021 RELATIVE VORTICITY 1/S 9 -65536 17
+ 011022 DIVERGENCE 1/S 9 -65536 17
+ 011023 VELOCITY POTENTIAL M**2/S -2 -65536 17
+ 011031 DEGREE OF TURBULENCE CODE TABLE 011031 0 0 4
+ 011032 HEIGHT OF BASE OF TURBULENCE M -1 -40 16
+ 011033 HEIGHT OF TOP OF TURBULENCE M -1 -40 16
+ 011034 VERTICAL GUST VELOCITY M/S 1 -1024 11
+ 011035 VERTICAL GUST ACCELERATION M/S 2 -8192 14
+ 011036 MAXIMUM DERIVED EQUIVALENT VERTICAL GUST M/S 1 0 10
+ 011041 MAXIMUM WIND SPEED (GUSTS) M/S 1 0 12
+ 011042 MAXIMUM WIND SPEED (10 MIN MEAN WIND) M/S 1 0 12
+ 011050 STD.DEV. WIND SPEED M/S 1 0 12
+ 011061 ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW M/S 1 0 12
+ 011062 ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE M/S 1 0 12
+ 011192 U - COMPONENT AT 10 M M/S 1 -4096 13
+ 011193 V - COMPONENT AT 10 M M/S 1 -4096 13
+ 011194 W - COMPONENT AT 10 M M/S 1 -4096 13
+ 012001 TEMPERATURE/DRY BULB TEMPERATURE K 1 0 12
+ 012002 WET BULB TEMPERATURE K 1 0 12
+ 012003 DEW POINT TEMPERATURE K 1 0 12
+ 012004 DRY BULB TEMPERATURE AT 2M K 1 0 12
+ 012005 WET BULB TEMPERATURE AT 2M K 1 0 12
+ 012006 DEW POINT TEMPERATURE AT 2M K 1 0 12
+ 012007 VIRTUAL TEMPERATURE K 1 0 12
+ 012011 MAXIMUM TEMPERATURE,AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12
+ 012012 MINIMUM TEMPERATURE,AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12
+ 012013 GROUND MINIMUM TEMPERATURE PAST 12 HOURS K 1 0 12
+ 012014 MAXIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 1 0 12
+ 012015 MINIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 1 0 12
+ 012016 MAXIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 1 0 12
+ 012017 MINIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 1 0 12
+ 012030 SOIL TEMPERATURE K 1 0 12
+ 012061 SKIN TEMPERATURE K 1 0 12
+ 012062 EQUIVALENT BLACK BODY TEMPERATURE K 1 0 12
+ 012063 BRIGHTNESS TEMPERATURE K 1 0 12
+ 013001 SPECIFIC HUMIDITY G/G 5 0 14
+ 013002 MIXING RATIO G/G 5 0 14
+ 013003 RELATIVE HUMIDITY % 0 0 7
+ 013004 VAPOUR PRESSURE PA -1 0 10
+ 013005 VAPOUR DENSITY G/M**3 0 0 7
+ 013006 MIXING HEIGHT M -1 -40 16
+ 013011 TOTAL PRECIPITATION/TOTAL WATER EQUIVALENT M 4 -1 14
+ 013012 DEPTH OF FRESH SNOW M 2 0 12
+ 013013 TOTAL SNOW DEPTH M 2 0 16
+ 013014 RAINFALL/WATER EQUIVALENT OF SNOW (AVERAGE RATE) M/S 7 0 12
+ 013015 SNOWFALL (AVERAGE RATE) M/S 1 0 10
+ 013016 PRECIPITABLE WATER M 3 0 7
+ 013019 TOTAL PRECIPITATION PAST 1 HOUR M 4 -1 14
+ 013020 TOTAL PRECIPITATION PAST 3 HOURS M 4 -1 14
+ 013021 TOTAL PRECIPITATION PAST 6 HOURS M 4 -1 14
+ 013022 TOTAL PRECIPITATION PAST 12 HOURS M 4 -1 14
+ 013023 TOTAL PRECIPITATION PAST 24 HOURS M 4 -1 14
+ 013031 EVAPOTRANSPIRATION M 3 0 7
+ 013032 EVAPORATION/EVAPOTRANSPIRATION M 4 0 8
+ 013041 PASQUILL-GILLFORD STABILITY CATEGORY CODE TABLE 013041 0 0 4
+ 013192 RELATIVE HUMUDITY AT 2 M % 0 0 8
+ 013193 RELATIVE HUMIDITY % 0 0 8
+ 014001 LONG WAVE RADIATION,INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12
+ 014002 LONG WAVE RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12
+ 014003 SHORT WAVE RADIATION,INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12
+ 014004 SHORT WAVE RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12
+ 014011 NET LONG WAVE RADIATION,INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12
+ 014012 NET LONG WAVE RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12
+ 014013 NET SHORT WAVE RADIATION,INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12
+ 014014 NET SHORT WAVE RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12
+ 014015 NET RADIATION INTEGRATED OVER 24HOURS J/M**2 -4 -16384 15
+ 014016 NET RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 -16384 15
+ 014017 INSTANTANEOUS LONG-WAVE RADIATION J/M**2 -3 -2048 12
+ 014018 INSTANTANEOUS SHORT-WAVE RADIATION J/M**2 -3 -2048 12
+ 014020 GLOBAL SOLAR RADIATION INTEGRATED OVER 24 HOURS J/M**2 -4 0 15
+ 014021 GLOBAL RADIATION INTEGRATED OVERPERIOD SPECIFIED J/M**2 -4 0 15
+ 014022 DIFFUSE SOLAR RADIATION INTEGRATED OVER 24 HOURS J/M**2 -4 0 15
+ 014023 DIFFUSE SOLAR RADIATION INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15
+ 014024 DIRECT SOLAR RADIATION INTEGRATED OVER 24 HOURS J/M**2 -4 0 15
+ 014025 DIRECT SOLAR RADIATION INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15
+ 014031 TOTAL SUNSHINE MINUTES 0 0 6
+ 014032 TOTAL SUNSHINE HOURS 0 0 10
+ 015001 OZON DOBSON 0 0 10
+ 015202 INTEGRATED ELECTRON DENSITY LOG/M**2 3 13000 12
+ 019001 TYPE OF SYNOPTIC FEATURE CODE TABLE 019001 0 0 6
+ 019002 EFFECTIVE RADIUS OF FEATURE M -2 0 12
+ 019003 WIND SPEED THRESHOLD M/S 0 0 8
+ 019004 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD M -2 0 12
+ 020001 HORIZONTAL VISIBILITY M -1 0 13
+ 020002 VERTICAL VISIBILITY M -1 0 7
+ 020003 PRESENT WEATHER CODE TABLE 020003 0 0 8
+ 020004 PAST WEATHER (1) CODE TABLE 020004 0 0 4
+ 020005 PAST WEATHER (2) CODE TABLE 020005 0 0 4
+ 020010 CLOUD COVER (TOTAL) % 0 0 7
+ 020011 CLOUD AMOUNT CODE TABLE 020011 0 0 4
+ 020012 CLOUD TYPE CODE TABLE 020012 0 0 6
+ 020013 HEIGHT OF BASE OF CLOUD M -1 -40 11
+ 020014 HEIGHT OF TOP OF CLOUD M -1 -40 11
+ 020215 PRESSURE AT THE BASE OF CLOUD PA -1 0 14
+ 020016 PRESSURE AT THE TOP OF CLOUD PA -1 0 14
+ 020017 CLOUD TOP DESCRIPTION CODE TABLE 020017 0 0 4
+ 020031 ICE DEPOSIT (THICKNESS) M 2 0 7
+ 020032 RATE OF ICE ACCRETION CODE TABLE 020032 0 0 3
+ 020033 CAUSE OF ICE ACCRETION FLAG TABLE 020033 0 0 4
+ 020034 SEA ICE CONCETRATION CODE TABLE 020034 0 0 5
+ 020035 AMOUNT AND TYPE OF ICE CODE TABLE 020035 0 0 4
+ 020036 ICE SITUATION CODE TABLE 020036 0 0 5
+ 020037 ICE DEVELOPMENT CODE TABLE 020037 0 0 5
+ 020038 BEARING OF THE ICE EDGE DEGREE TRUE 1 0 12
+ 020039 ICE DISTANCE M -1 0 13
+ 020041 AIRFRAME ICING CODE TABLE 020041 0 0 4
+ 020051 AMOUNT OF LOW CLOUDS % 0 0 7
+ 020052 AMOUNT OF MIDDLE CLOUDS % 0 0 7
+ 020053 AMOUNT OF HIGH CLOUDS % 0 0 7
+ 020061 RUNWAY VISUAL RANGE (RVR) M 0 0 12
+ 020062 STATE OF GROUND (WITH OR WITHOUT SNOW) CODE TABLE 020062 0 0 5
+ 020063 SPECIAL PHENOMENA CODE TABLE 020063 0 0 10
+ 020192 SPECIAL PHENOMENA CODE TABLE 020192 0 0 14
+ 021001 HORIZONTAL REFLECTIVITY(ZH) dB 0 -64 7
+ 021002 VERTICAL REFLECTIVITY(ZV) dB 0 -64 7
+ 021003 DIFFERENTIAL REFLECTIVITY(ZDR) dB 1 -5 7
+ 021005 LINEAR DEPOLARISATION RATIO(LDR) dB 0 -65 6
+ 021006 CIRCULAR DEPOLARIZATION RATIO(CDR) dB 0 -65 6
+ 021011 DOPPLER MEAN VELOCITY IN X-DIRECTION(VX) M/S 0 -128 8
+ 021012 DOPPLER MEAN VELOCITY IN Y-DIRECTION(VY) M/S 0 -128 8
+ 021013 DOPPLER MEAN VELOCITY IN Z-DIRECTION(VZ) M/S 0 -128 8
+ 021014 DOPPLER MEAN VELOCITY RADIAL M/S 1 -4096 13
+ 021017 DOPPLER VELOCITY SPECTRAL WIDTH M/S 1 -4096 8
+ 021021 ECHO TOPS M -3 0 4
+ 021031 VERTICALLY INTEGRATED LIQUID-WATER CONTENT(VIL) KG/M**2 0 0 7
+ 021036 RADAR RAINFALL INTENSITY M/S 7 0 12
+ 021041 BRIGHT-BAND HEIGHT M -2 0 8
+ 021051 SIGNAL POWER ABOVE ONE MW dB 0 -256 8
+ 021192 RADAR BACK SCATTER dB 2 -5000 13
+ 021193 NOISE FIGURE % 0 0 7
+ 021194 BACKGROUND NOISE LEVEL NUMERIC 0 0 8
+ 021195 MISSING PACKET COUNTER NUMERIC 0 -127 8
+ 021196 UWA PRODUCT CONFIDENCE FLAG TABLE 021196 0 0 12
+ 021197 UWI PRODUCT CONFIDENCE FLAG TABLE 021197 0 0 12
+ 021198 URA PRODUCT CONFIDENCE FLAG TABLE 021198 0 0 8
+ 021199 UAT PRODUCT CONFIDENCE FLAG TABLE 021199 0 0 7
+ 021200 MWI PRODUCT CONFIDENCE FLAG TABLE 021200 0 0 15
+ 021201 PEAKINESS NUMERIC 0 0 16
+ 021202 ALTIMETER CALIBRATION STATUS FLAG TABLE 021202 0 0 4
+ 021203 ALTIMETER INSTRUMENT MODE FLAG TABLE 021203 0 0 9
+ 021204 MULTI/SINGLE VIEW DIFFERENCE K 2 -512 10
+ 021205 SPECTRAL INTENSITY NUMERIC 0 0 8
+ 021206 REPRESENTATION OF INTENSITY CODE TABLE 021206 0 0 3
+ 021207 ALTITUDE CORRECTION (IONOSPHERE) M 3 0 14
+ 021208 ALTITUDE CORRECTION (DRY TROPOSPHERE) M 3 0 9
+ 021209 LTITUDE CORRECTION (WET TROPOSPHERE) M 3 2000 10
+ 021210 ALTITUDE CORRECTION (CALIBRATION CONSTANT) M 3 0 11
+ 021211 OPEN LOOP CORRECTION (HTL) M 3 0 10
+ 021212 OPEN LOOP CORRECTION (AGC) dB 3 -3000 14
+ 021213 AMBIGUITY REMOVAL CONFIDENCE % 0 0 7
+ 021214 UAT QUALITY SUMMARY CODE TABLE 021214 0 0 3
+ 021215 UAT ACROSS-TRACK BAND NO. NUMERIC 0 0 4
+ 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9
+ 022002 DIRECTION OF WIND WAVES DEGREE TRUE 0 0 9
+ 022003 DIRECTION OF SWELL WAVES DEGREE TRUE 0 0 9
+ 022004 DIRECTION OF CURRENT DEGREE TRUE 0 0 12
+ 022011 PERIOD OF WAVES S 0 0 6
+ 022012 PERIOD OF WIND WAVES S 0 0 6
+ 022013 PERIOD OF SWELL WAVES S 0 0 6
+ 022021 HEIGHT OF WAVES M 1 0 10
+ 022022 HEIGHT OF WIND WAVES M 1 0 10
+ 022023 HEIGHT OF SWELL WAVES M 1 0 10
+ 022031 SPEED OF CURRENT M/S 2 0 13
+ 022042 SEA TEMPERATURE K 1 0 12
+ 022043 SEA TEMPERATURE K 2 0 15
+ 022044 SOUND VELOCITY M/S 1 0 14
+ 022050 STANDARD DEVIATION SEA SURFACE TEMPERATURE K 2 0 8
+ 022061 STATE OF SEA CODE TABLE 022061 0 0 4
+ 022062 SALINITY %. 3 0 14
+ 022063 TOTAL WATER DEPTH M 0 0 14
+ 022243 STANDARD DEVIATION SIGNIFICANT WAVE HEIGHT M 2 0 10
+ 023001 ACCIDENT EARLEY NOTIFICATION-ARTICLE APPLICABLE CODE TABLE 023001 0 0 3
+ 023002 ACTIVITY OR FACILITY INVOLVED ININCIDENT CODE TABLE 023002 0 0 5
+ 023003 TYPE OF RELEASE CODE TABLE 023003 0 0 3
+ 023004 COUNTERMEASURES TAKEN NEAR BORDER CODE TABLE 023004 0 0 3
+ 023005 COUSE OF INCIDENT CODE TABLE 023005 0 0 2
+ 023006 INCIDENT SITUATION CODE TABLE 023006 0 0 3
+ 023007 CHARACTERISTIC OF RELEASE CODE TABLE 023007 0 0 3
+ 023008 STATE OF CURRENT RELEASE CODE TABLE 023008 0 0 2
+ 023009 STATE OF EXPECTED RELEASE CODE TABLE 023009 0 0 2
+ 023016 POSSIBILITY OF SIGNIFICANT CHEMICAL TOXIC HEATH EFFECT CODE TABLE 023016 0 0 2
+ 023017 FLOW DISCHARGE OF MAJOR RECEPIENT M**3/S 6 0 20
+ 023018 RELEASE BEHAVIOUR OVER TIME CODE TABLE 023018 0 0 3
+ 023019 ACTUAL RELEASE HEIGHT M 0 -15000 17
+ 023021 EFFECTIVE RELEASE HEIGHT M 0 -15000 17
+ 023022 DISTANCE OF RELEASE POINT OR SITE OF INCIDENT M 0 0 24
+ 023023 MAIN TRANSPORT SPEED IN THE ATMOSPHERE M/S 1 0 12
+ 023024 MAIN TRANSPORT SPEED WATER M/S 2 0 13
+ 023025 MAIN TRANSPORT SPEED IN GROUND WATER M/S 2 0 13
+ 023027 MAIN TRANSPORT DIRECTION IN THE ATMOSPHERE DEGREE TRUE 0 0 9
+ 023028 MAIN TRANSPORT DIRECTION IN WATER DEGREE TRUE 0 0 9
+ 023029 MAIN TRANSPORT DIRECTION IN GROUND WATER DEGREE TRUE 0 0 9
+ 023031 POSSIBILITY THAT PLUME WILL ENCOUNTER PRECIPITATION IN STATE IN CODE TABLE 023031 0 0 2
+ 023032 PLUME WILL ENCOUNTER CHANGE IN WIND DIRECTION AND/OR SPEED FLAG CODE TABLE 023032 0 0 2
+ 024001 ESTIMATE OF AMOUNT OF RADIOACTIVITY RELEASED UP TO SPECIFIED TIM Bq -11 0 28
+ 024002 ESTIMATED MAXIMUM POTENTIAL RELEASE Bq -11 0 28
+ 024003 COMPOSITION OF RELEASE CODE TABLE 024003 0 0 5
+ 024004 ELEMENT NAME CCITTIA5 0 0 16
+ 024005 ISOTOPE MASS NUMERIC 0 0 9
+ 024011 DOSE mSv 2 0 32
+ 024012 TRAJECTORY DOSE IN AIR ALONG THEMAIN TRANSPORT PATH(DEFINED LOCA mSv 2 0 32
+ 024013 GAMMA DOSE IN AIR ALONG THE MAINTRANSPORT PATH(DEFINED LOCATION mSv 2 0 32
+ 024021 AIR CONCENTRATION(OF NAMED ISOTOP TYPE INCLUDING GROSS BETA Bq/M**3 2 0 32
+ 024022 CONCENTRATION IN PRECIPITATION ( OF NAMED ISOTOP TYPE) Bq/L 2 0 32
+ 025001 RANGE-GATE LENGTH M -1 0 6
+ 025002 NUMBER OF GATES AVERAGED NUMERIC 0 0 4
+ 025003 NUMBER OF INTEGRATED PULSES NUMERIC 0 0 8
+ 025004 ECHO PROCESSING CODE TABLE 025004 0 1 2
+ 025005 ECHO INTEGRATION CODE TABLE 025005 0 0 2
+ 025006 Z TO R CONVERSION CODE TABLE 025006 0 0 3
+ 025007 Z TO R CONVERSION FACTOR NUMERIC 0 0 12
+ 025008 Z TO R CONVERSION EXPONENT NUMERIC 2 0 9
+ 025009 CALIBRATION METHOD FLAG TABLE 025009 0 0 4
+ 025010 CLUTTER TREATMENT CODE TABLE 025010 0 0 4
+ 025011 GROUND ACCULTATION CORRECTION(SCREENING) CODE TABLE 025011 0 0 2
+ 025012 RANGE ATTENUATION CORRECTION CODE TABLE 025012 0 0 2
+ 025013 BRIGHT-BAND CORRECTION FLAG TABLE 025013 0 0 2
+ 025014 AZIMUTH CLUTTER CUT-OFF NUMERIC 025014 0 0 12
+ 025015 RADOM ATTENUATION CORRECTION FLAG TABLE 025015 0 0 2
+ 025016 CLEAR-AIR ATTENUATION CORRECTION dB/M 5 0 6
+ 025017 PRECIPITATION ATTENUATION CORRECTION FLAG TABLE 025017 0 0 2
+ 025018 A TO Z LAW FOR ATTENUATION FACTOR NUMERIC 7 0 6
+ 025019 A TO Z LAW FOR ATTENUATION EXPONENT NUMERIC 2 0 7
+ 025020 MEAN SPEED ESTIMATION CODE TABLE 025020 0 0 2
+ 025021 WIND COMPUTATION EHANCEMENT FLAG TABLE 025021 0 0 8
+ 025030 SIGNAL TO NOISE RATIO dB 0 -32 8
+ 027001 LATITUDE(HIGH ACCURACY) DEGREE 5 -9000000 25
+ 027002 LATITUDE(COARSE ACCURACY) DEGREE 2 -9000 15
+ 027003 ALTERNATE LATITUDE DEGREE 2 -9000 15
+ 027020 SATELLITE LOCATION COUNTER NUMERIC 0 0 16
+ 028001 LONGITUDE(HIGH ACCURACY) DEGREE 5 -18000000 26
+ 028002 LONGITUDE(COARSE ACCURACY) DEGREE 2 -18000 16
+ 028003 ALTERNATE LONGITUDE DEGREE 2 -18000 16
+ 029001 PROJECTION TYPE CODE TABLE 029001 0 0 3
+ 029002 COORDINATE GRID TYPE CODE TABLE 029002 0 0 3
+ 030001 PIXEL VALUE(4 BITS) NUMERIC 0 0 4
+ 030021 NUMBER OF PIXELS PER ROW NUMERIC 0 0 12
+ 030022 NUMBER OF PIXELS PER COLUMN NUMERIC 0 0 12
+ 030031 PICTURE TYPE CODE TABLE 030031 0 0 4
+ 030032 COMBINATION WITH OTHER DATA FLAG TABLE 030032 0 0 16
+ 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8
+ 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16
+ 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8
+ 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16
+ 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 031021 0 0 6
+ 031031 DATA PRESENT INDICATOR FLAG TABLE 031031 0 0 1
+ 031192 DATA PRESENT INDICATOR NUMERIC 0 0 1
+ 033001 QUALITY INFORMATION AS A 1 BIT FLAG FLAG TABLE 033001 0 0 1
+ 033002 QUALITY INFORMATION AS A 2 BIT F FLAG TABLE 033002 0 0 2
+ 033003 QUALITY INFORMATION AS A 3 BIT F FLAG TABLE 033003 0 0 3
+ 033004 QUALITY INFORMATION AS A 4 BIT F FLAG TABLE 033004 0 0 4
+ 033007 % CONFIDENCE % 0 0 7
+ 033191 ECMWF WAM QC INDICATOR CODE TABLE 033191 0 0 2
+ 033193 DATA QUALITY 3 BIT CODE CODE TABLE 033193 0 0 3
+ 033194 DATA QUALITY 2 BIT CODE CODE TABLE 033194 0 0 2
+ 033200 ANALYSIS REPORT EVENTS FLAG TABLE 033200 0 0 31
+ 033201 ANALYSIS REPORT STATUS FLAGS FLAG TABLE 033201 0 0 13
+ 033202 ANALYSIS DATUM EVENT FLAGS (1) FLAG TABLE 033202 0 0 31
+ 033203 ANALYSIS DATUM EVENT FLAGS (2) FLAG TABLE 033203 0 0 11
+ 033204 ANALYSIS DATUM STATUS FLAGS FLAG TABLE 033204 0 0 21
+ 033210 INCREMENTAL VARIATIONAL ANALYSISUPDATE NUMBER NUMERIC 0 0 7
+ 033211 MINIMISATION SIMULATION NUMBER NUMERIC 0 0 10
+ 033212 1D VAR ITERRATION NUMBER NUMERIC 0 0 10
+ 033213 1D VAR RADIANCE COST NUMERIC 1 -1000 11
+ 033214 1D VAR ERROR(S) FLAG TABLE 033214 0 0 11
+ 033231 PRESAT SUMMARY FLAGS FLAG TABLE 033231 0 0 6
+ 062190 STATISTICS APPLICATION CODE TABLE 062190 0 0 8
+ 062191 TYPE OF STATISTICS CODE TABLE 062191 0 0 8
+ 063190 APPLICATION DERIVING SUBSTITUTE OR ALTERNATIVE VALUE CODE TABLE 063190 0 0 8
+ 063191 Q/C APPLICATION CODE TABLE 063191 0 0 8
+ 063192 % CONFIDENCE % 0 0 7
diff --git a/bufrtables/B0000000000098002001.TXT b/bufrtables/B0000000000098002001.TXT
new file mode 100755
index 0000000..7e74823
--- /dev/null
+++ b/bufrtables/B0000000000098002001.TXT
@@ -0,0 +1,649 @@
+ 000001 TABLE A: ENTRY CCITTIA5 0 0 24
+ 000002 TABLE A: DATA CATEGORY DESCRIPTION, LINE 1 CCITTIA5 0 0 256
+ 000003 TABLE A: DATA CATEGORY DESCRIPTION, LINE 2 CCITTIA5 0 0 256
+ 000005 BUFR EDITION NUMBER CCITTIA5 0 0 24
+ 000010 F DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 8
+ 000011 X DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 16
+ 000012 Y DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 24
+ 000013 ELEMENT NAME, LINE 1 CCITTIA5 0 0 256
+ 000014 ELEMENT NAME, LINE 2 CCITTIA5 0 0 256
+ 000015 UNITS NAME CCITTIA5 0 0 192
+ 000016 UNITS SCALE SIGN CCITTIA5 0 0 8
+ 000017 UNITS SCALE CCITTIA5 0 0 24
+ 000018 UNITS REFERENCE SIGN CCITTIA5 0 0 8
+ 000019 UNITS REFERENCE VALUE CCITTIA5 0 0 80
+ 000020 ELEMENT DATA WIDTH CCITTIA5 0 0 24
+ 000030 DESCRIPTOR DEFINING SEQUENCE CCITTIA5 0 0 48
+ 001001 WMO BLOCK NUMBER NUMERIC 0 0 7
+ 001002 WMO STATION NUMBER NUMERIC 0 0 10
+ 001003 WMO REGION NUMBER/GEOGRAPHICAL AREA NUMERIC 0 0 3
+ 001004 WMO REGION SUB-AREA NUMERIC 0 0 3
+ 001005 BUOY/PLATFORM IDENTIFIER NUMERIC 0 0 17
+ 001006 AIRCRAFT IDENTIFIER CCITTIA5 0 0 64
+ 001007 SATELLITE IDENTIFIER CODE TABLE 1007 0 0 10
+ 001008 AIRCRAFT REGISTRATION NUMBER CCITTIA5 0 0 64
+ 001011 SHIP'S CALL SIGN CCITTIA5 0 0 72
+ 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM DEGREE TRUE 0 0 9
+ 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM M/S 0 0 10
+ 001014 PLATFORM DRIFT SPEED(HIGH PRECISION M/S 2 0 10
+ 001021 SYNOPTIC FEATURE IDENTIFIER NUMERIC 0 0 14
+ 001022 VULCANO NAME CCITTIA5 0 0 160
+ 001025 STORM IDENTIFIER CCITTIA5 0 0 24
+ 001026 WMO STORM NAME CCITTIA5 0 0 64
+ 001031 GENERATING CENTRE CODE TABLE 1031 0 0 16
+ 001032 GENERATING APPLICATION CODE TABLE 1032 0 0 8
+ 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64
+ 001192 MODEL VERSION NUMBER CODE TABLE 1192 0 0 8
+ 001193 SIGMA_0 SIMULATION METHOD CODE TABLE 1193 0 0 4
+ 001194 CARRIER BALLOON/AIRCRAFT IDENTIFIER CCITTIA5 0 0 72
+ 001195 MOBIL LAND STATION IDENTIFIER CCITTIA5 0 0 72
+ 001196 CONSTANT LEVEL BALLOON IDENTIFIER CCITTIA5 0 0 72
+ 001197 RTP - PLATFORM TYPE CODE TABLE 1197 0 0 10
+ 001198 ITP - DECK ID CODE TABLE 1198 0 0 10
+ 001199 DUP - DUPLICATE STATUS CODE TABLE 1199 0 0 4
+ 001201 GENERATING APPLICATION CODE TABLE 1201 0 0 8
+ 001205 SATELLITE IDENTIFIER CODE TABLE 1205 0 0 10
+ 001208 VELOCITY OF PLATFORM, X M/S 5 -1073741824 31
+ 001209 VELOCITY OF PLATFORM, Y M/S 5 -1073741824 31
+ 001210 VELOCITY OF PLATFORM, Z M/S 5 -1073741824 31
+ 002001 TYPE OF STATION CODE TABLE 2001 0 0 2
+ 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 2002 0 0 4
+ 002003 TYPE OF MEASURING EQUIPMENT USED CODE TABLE 2003 0 0 4
+ 002004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUEMENT OR TYPE OF CR CODE TABLE 2004 0 0 4
+ 002005 PRECISION OF TEMPERATURE OBSERVATION K 2 0 7
+ 002011 RADIOSONDE TYPE CODE TABLE 2011 0 0 8
+ 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 2012 0 0 4
+ 002013 SOLAR AND INFRARED RADIATION CORRECTION CODE TABLE 2013 0 0 4
+ 002014 TRACKING TECHNIQUE/STATUS OF SYSTEM CODE TABLE 2014 0 0 7
+ 002015 RADIOSONDE COMPLETNESS CODE TABLE 2015 0 0 4
+ 002021 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 2021 0 0 9
+ 002022 SATELLITE DATA PROCESSING TECHNIQUE USED FLAG TABLE 2022 0 0 8
+ 002023 CLOUD MOTION COMPUTATIONAL METHOD CODE TABLE 2023 0 0 4
+ 002024 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2024 0 0 4
+ 002025 SATELLITE CHANNEL(S) USED IN COMPUTATION FLAG TABLE 2025 0 0 25
+ 002026 CROSS TRACK RESOLUTION M 2 0 12
+ 002027 ALONG TRACK RESOLUTION M 2 0 12
+ 002030 METHOD OF CURRENT MEASUREMENT CODE TABLE 2030 0 0 3
+ 002031 DURATION AND TIME OF CURRENT MEASUREMENT CODE TABLE 2031 0 0 5
+ 002032 INDICATOR FOR DIGITIZATION CODE TABLE 2032 0 0 2
+ 002033 METHOD OF SALINITY/DEPTH MEASUREMENT CODE TABLE 2033 0 0 3
+ 002034 DROGUE TYPE CODE TABLE 2034 0 0 5
+ 002035 CABLE LENGTH M 0 0 9
+ 002036 BUOY TYPE CODE TABLE 2036 0 0 2
+ 002041 METHOD FOR ESTIMATING REPORTS RELATED TO SYNOPTIC FEATURES CODE TABLE 2041 0 0 6
+ 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 2061 0 0 3
+ 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 2062 0 0 4
+ 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16
+ 002064 AIRCRAFT ROLL ANGLE QUALITY CODE TABLE 002064 0 0 2
+ 002065 ACARS GROUND RECEIVING STATION CCITTIA5 0 0 40
+ 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 2070 0 0 4
+ 002101 TYPE OF ANTENNA CODE TABLE 2101 0 0 4
+ 002102 ANTENNA HEIGHT ABOVE TOWER BASE M 0 0 8
+ 002103 RADOME FLAG TABLE 2103 0 0 2
+ 002104 ANTENNA POLARISATION CODE TABLE 2104 0 0 4
+ 002105 MAXIMUM ANTENNA GAIN dB 0 0 6
+ 002106 3-dB BEAMWIDTH DEGREE 1 0 6
+ 002107 SIDELOBE SUPPRESION dB 0 0 6
+ 002108 CROSSPOL DISCRIMINATION(ON AXIS) dB 0 0 6
+ 002109 ANTENNA SPEED(AZIMUTH) DEGREE/S 2 0 12
+ 002110 ANTENNA SPEED(ELEVATION) DEGREE/S 2 0 12
+ 002111 RADAR INCIDENCE ANGLE DEGREE 1 0 10
+ 002112 RADAR LOOK ANGLE DEGREE 1 0 12
+ 002113 NUMBER OF AZIMUTH LOOKS NUMERIC 0 0 4
+ 002114 ANTENNA EFFECTIVE SRFACE AREA M**2 0 0 15
+ 002121 MEAN FREQUENCY Hz -8 0 7
+ 002122 FREQUENCY AGILITY RANGE Hz -6 -128 8
+ 002123 PEAK POWER W -4 0 7
+ 002124 AVERAGE POWER W -1 0 7
+ 002125 PULSE REPETITION FREQUENCY Hz -1 0 8
+ 002126 PULSE WIDTH S 7 0 6
+ 002127 RECEIVER INTERMEDIATE FREQUENCY Hz -6 0 7
+ 002128 INTERMEDIATE FREQUENCY BANDWIDTH Hz -5 0 6
+ 002129 MINIMUM DETECTABLE SIGNAL dB 0 -150 5
+ 002130 DYNAMIC RANGE dB 0 0 7
+ 002131 SENSITIVITY TIME CONTROL FLAG TABLE 2131 0 0 2
+ 002132 AZIMUTH POINTING ACCURACY DEGREE 2 0 6
+ 002133 ELEVATION POINTING ACCURACY DEGREE 2 0 6
+ 002134 ANTENNA BEAM AZIMUTH DEGREE 2 0 16
+ 002135 ANTENNA ELEVATION DEGREE 2 -9000 15
+ 002192 SAR AZIMUTH ANGLE DEGREE 0 0 9
+ 002193 1D VAR SATELLITE CHANNEL(S) USED FLAG TABLE 2193 0 0 28
+ 002194 CONSTANT LEVEL BALLOON TYPE CODE TABLE 2194 0 0 4
+ 002195 TYPE OF SATELLITE INSTRUMENTATION CODE TABLE 2195 0 0 4
+ 002196 SATELLITE CLASSIFICATION CODE TABLE 2196 0 0 9
+ 002197 SATELLITE CHANNEL CENTRE FREQUENCY Hz -8 0 26
+ 002198 SATELLITE CHANNEL BAND WIDTH Hz -8 0 26
+ 002199 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2199 0 0 4
+ 002201 SIMULATED SATELLITE INSTRUMENT FLAG TABLE 2201 0 0 4
+ 002202 SIMULATED DATA PROCESSING TECHNIQUE USED FLAG TABLE 2202 0 0 4
+ 002220 DATA PRODUCER CODE TABLE 2220 0 0 9
+ 002221 SEGMENT SIZE AT NADIR IN X DIRECTION M 0 0 18
+ 002222 SEGMENT SIZE AT NADIR IN Y DIRECTION M 0 0 18
+ 002223 TOVS/ATOVS/AVHRR CHANNEL NUMBER CODE TABLE 2223 0 0 6
+ 002231 HEIGHT ASSIGNMENT METHOD CODE TABLE 2231 0 0 4
+ 002232 TRACER CORRELATION METHOD CODE TABLE 2232 0 0 3
+ 002251 RADIANCE COMPUTATIONAL METHOD CODE TABLE 2251 0 0 4
+ 002252 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 2252 0 0 31
+ 002253 HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2253 0 0 8
+ 002254 RADIANCE TYPE CODE TABLE 2254 0 0 4
+ 004001 YEAR YEAR 0 0 12
+ 004002 MONTH MONTH 0 0 4
+ 004003 DAY DAY 0 0 6
+ 004004 HOUR HOUR 0 0 5
+ 004005 MINUTE MINUTE 0 0 6
+ 004006 SECOND SECOND 0 0 6
+ 004011 TIME INCREMENT YEAR 0 -1024 11
+ 004012 TIME INCREMENT MONTH 0 -1024 11
+ 004013 TIME INCREMENT DAY 0 -1024 11
+ 004014 TIME INCREMENT HOUR 0 -1024 11
+ 004015 TIME INCREMENT MINUTE 0 -2048 12
+ 004016 TIME INCREMENT SECOND 0 -4096 13
+ 004021 TIME PERIOD OR DISPLACEMENT YEAR 0 -1024 11
+ 004022 TIME PERIOD OR DISPLACEMENT MONTH 0 -1024 11
+ 004023 TIME PERIOD OR DISPLACEMENT DAY 0 -1024 11
+ 004024 TIME PERIOD OR DISPLACEMENT HOUR 0 -1024 11
+ 004025 TIME PERIOD OR DISPLACEMENT MINUTE 0 -2048 12
+ 004026 TIME PERIOD OR DISPLACEMENT SECOND 0 -4096 13
+ 004043 DAY OF THE YEAR DAY 0 0 9
+ 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25
+ 005002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15
+ 005011 LATITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -9000000 25
+ 005012 LATITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -9000 15
+ 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16
+ 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16
+ 005031 ROW NUMBER NUMERIC 0 0 12
+ 005033 PIXEL SIZE ON HORIZONTAL-1 M -1 0 16
+ 005040 ORBIT NUMBER NUMERIC 0 0 24
+ 005041 SCAN LINE NUMBER NUMERIC 0 0 8
+ 005042 CHANNEL NUMBER NUMERIC 0 0 6
+ 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8
+ 005052 CHANNEL NUMBER INCREMENT NUMERIC 0 0 5
+ 005053 FIELD OF VIEW NUMBER INCREMENT NUMERIC 0 0 5
+ 005193 ALONG TRACK ROW NUMBER AT 50 KM NUMERIC 0 0 10
+ 005194 ALONG TRACK ROW NUMBER AT 25 KM NUMERIC 0 0 11
+ 005195 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 7
+ 005217 LOCATION OF PLATFORM, X M 2 -1073741824 31
+ 005232 DIRECTION (SPECTRAL) DEGREE 2 0 16
+ 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26
+ 006002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16
+ 006011 LONGITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -18000000 26
+ 006012 LONGITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -18000 16
+ 006021 DISTANCE M -1 0 13
+ 006031 COLUMN NUMBER NUMERIC 0 0 12
+ 006033 PIXEL SIZE ON HORIZONTAL-2 M -1 0 16
+ 006193 CROSS TRACK CELL NUMBER AT 50 KM NUMERIC 0 0 6
+ 006194 CROSS TRACK CELL NUMBER AT 25 KM NUMERIC 0 0 7
+ 006217 LOCATION OF PLATFORM, Y M 2 -1073741824 31
+ 006232 WAVENUMBER (SPECTRAL) RADS/M 5 0 13
+ 007001 HEIGHT OF STATION M 0 -400 15
+ 007002 HEIGHT OR ALTITUDE M -1 -40 16
+ 007003 GEOPOTENTIAL M**2/S**2 -1 -400 17
+ 007004 PRESSURE PA -1 0 14
+ 007005 HEIGHT INCREMENT M 0 -400 12
+ 007006 HEIGHT ABOVE STATION M 0 0 15
+ 007010 FLIGHT LEVEL M 0 -1024 16
+ 007021 ELEVATION DEGREE 2 -9000 15
+ 007022 SOLAR ELEVATION DEGREE 2 -9000 15
+ 007061 DEPTH BELOW LAND SURFACE M 2 0 14
+ 007062 DEPTH BELOW SEA SURFACE M 1 0 17
+ 007190 HEIGHT INCREMENT M 1 -1024 12
+ 007217 LOCATION OF PLATFORM, Z M 2 -1073741824 31
+ 008001 VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8001 0 0 7
+ 008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS) CODE TABLE 8002 0 0 6
+ 008003 VERTICAL SIGNIFICANCE (SATELLITE OBSERVATIONS) CODE TABLE 8003 0 0 6
+ 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 8004 0 0 3
+ 008005 SURFACE SYNOPTIC FEATURE SIGNIFICANCE CODE TABLE 8005 0 0 4
+ 008007 DIMENSIONAL SIGNIFICANCE CODE TABLE 8007 0 0 4
+ 008011 HORIZONTAL SIGNIFICANCE CODE TABLE 8011 0 0 6
+ 008012 LAND/SEA QUALIFIER CODE TABLE 8012 0 0 2
+ 008021 TIME SIGNIFICANCE CODE TABLE 8021 0 0 5
+ 008022 TOTAL NUMBER(WITH RESPECT TO ACCUMULATION OR AVERAGE) NUMERIC 0 0 16
+ 008023 FIRST ORDER STATISTICS CODE TABLE 8023 0 0 6
+ 008024 DIFFERENCE STATISTICS CODE TABLE 8024 0 0 6
+ 008193 TIME QUALIFIER CODE TABLE 8193 0 0 0
+ 008194 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8070 0 0 4
+ 008195 DATA TYPE CODE TABLE 8195 0 0 7
+ 008200 NUMBER OF OBSERVATIONS NUMERIC 0 0 8
+ 008222 GENERATOR SIGNIFICANCE CODE TABLE 8222 0 0 4
+ 008223 LAND/ICE SURFACE FLAG FLAG TABLE 8223 0 0 7
+ 010001 HEIGHT OF LAND SURFACE M 0 -400 15
+ 010002 HEIGHT M -1 -40 16
+ 010003 GEOPOTENTIAL M**2/S**2 -1 -400 17
+ 010004 PRESSURE PA -1 0 14
+ 010050 STANDARD DEVIATION ALTITUDE M 2 0 16
+ 010051 PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14
+ 010052 ALTIMETER SETTING (QNH) PA -1 0 14
+ 010060 PRESSURE CHANGE PA -1 -1024 11
+ 010061 3 HOUR PRESSURE CHANGE PA -1 -500 10
+ 010062 24 HOUR PRESSURE CHANGE PA -1 -1000 11
+ 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 10063 0 0 4
+ 010195 HEIGHT(HIGH ACCURACY) M 1 -4096 20
+ 010196 SOLAR ZENITH ANGLE DEGREE 2 -9000 15
+ 011001 WIND DIRECTION DEGREE TRUE 0 0 9
+ 011002 WIND SPEED M/S 1 0 12
+ 011003 U-COMPONENT M/S 1 -4096 13
+ 011004 V-COMPONENT M/S 1 -4096 13
+ 011005 W-COMPONENT PA/S 1 -512 10
+ 011006 W-COMPONENT M/S 2 -4096 13
+ 011011 WIND DIRECTION AT 10 M DEGREE TRUE 0 0 9
+ 011012 WIND SPEED AT 10 M M/S 1 0 12
+ 011013 WIND DIRECTION AT 5 M DEGREE TRUE 0 0 9
+ 011014 WIND SPEED AT 5 M M/S 1 0 12
+ 011021 RELATIVE VORTICITY 1/S 9 -65536 17
+ 011022 DIVERGENCE 1/S 9 -65536 17
+ 011023 VELOCITY POTENTIAL M**2/S -2 -65536 17
+ 011031 DEGREE OF TURBULENCE CODE TABLE 11031 0 0 4
+ 011032 HEIGHT OF BASE OF TURBULENCE M -1 -40 16
+ 011033 HEIGHT OF TOP OF TURBULENCE M -1 -40 16
+ 011034 VERTICAL GUST VELOCITY M/S 1 -1024 11
+ 011035 VERTICAL GUST ACCELERATION M/S 2 -8192 14
+ 011036 MAXIMUM DERIVED EQUIVALENT VERTICAL GUST M/S 1 0 10
+ 011037 TURBULENT INDEX CODE TABLE 011037 0 0 6
+ 011038 TIME OF OCCURANCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 011038 0 0 5
+ 011039 EXTENDED TIME OF OCCURENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 011039 0 0 6
+ 011040 MAXIMUM WIND SPEED (MEAN WIND) M/S 1 0 12
+ 011041 MAXIMUM WIND SPEED (GUSTS) M/S 1 0 12
+ 011042 MAXIMUM WIND SPEED (10 MIN MEAN WIND) M/S 1 0 12
+ 011049 STANDARD DEVIATION WIND DIRECTION DEGREE TRUE 0 0 9
+ 011050 STANDARD DEVIATION WIND SPEED M/S 1 0 12
+ 011051 STANDARD DEVIATION W COMPONENT M/S 1 0 8
+ 011061 ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW M/S 1 0 12
+ 011062 ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE M/S 1 0 12
+ 011192 U - COMPONENT AT 10 M M/S 1 -4096 13
+ 011193 V - COMPONENT AT 10 M M/S 1 -4096 13
+ 011194 W - COMPONENT AT 10 M M/S 1 -4096 13
+ 011201 HORIZONTAL LINE OF SIGHT COMPONENT M/S 1 -4096 13
+ 011210 1D VAR WIND SPEED RETREIVED ERRO(S) M/S 2 0 12
+ 011211 WIND SPEED INDEPENDENT ESTIMATE OF ERROR(S) M/S 2 0 12
+ 011220 FORMAL UNCERTAINTY IN WIND SPEED M/S 2 0 12
+ 011221 FORMAL UNCERTAINTY IN WIND DIRECTION DEGREE TRUE 2 0 15
+ 012001 TEMPERATURE/DRY BULB TEMPERATURE K 1 0 12
+ 012002 WET BULB TEMPERATURE K 1 0 12
+ 012003 DEW POINT TEMPERATURE K 1 0 12
+ 012004 DRY BULB TEMPERATURE AT 2M K 1 0 12
+ 012005 WET BULB TEMPERATURE AT 2M K 1 0 12
+ 012006 DEW POINT TEMPERATURE AT 2M K 1 0 12
+ 012007 VIRTUAL TEMPERATURE K 1 0 12
+ 012011 MAXIMUM TEMPERATURE,AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12
+ 012012 MINIMUM TEMPERATURE,AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12
+ 012013 GROUND MINIMUM TEMPERATURE PAST 12 HOURS K 1 0 12
+ 012014 MAXIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 1 0 12
+ 012015 MINIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 1 0 12
+ 012016 MAXIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 1 0 12
+ 012017 MINIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 1 0 12
+ 012030 SOIL TEMPERATURE K 1 0 12
+ 012061 SKIN TEMPERATURE K 1 0 12
+ 012062 EQUIVALENT BLACK BODY TEMPERATURE K 1 0 12
+ 012063 BRIGHTNESS TEMPERATURE K 1 0 12
+ 012193 COLDEST CLUSTER TEMPERATURE K 1 0 12
+ 012194 RADIANCE W/M**2*STER*M**(-1) 6 0 31
+ 013001 SPECIFIC HUMIDITY KG/KG 5 0 14
+ 013002 MIXING RATIO KG/KG 5 0 14
+ 013003 RELATIVE HUMIDITY % 0 0 7
+ 013004 VAPOUR PRESSURE PA -1 0 10
+ 013005 VAPOUR DENSITY KG/M**3 3 0 7
+ 013006 MIXING HEIGHT M -1 -40 16
+ 013009 RELATIVE HUMIDITY % 1 -1000 12
+ 013011 TOTAL PRECIPITATION/TOTAL WATER EQUIVALENT KG/M**2 1 -1 14
+ 013012 DEPTH OF FRESH SNOW M 2 -2 12
+ 013013 TOTAL SNOW DEPTH M 2 -2 16
+ 013014 RAINFALL/WATER EQUIVALENT OF SNOW (AVERAGE RATE) KG/(M**2)S 4 0 12
+ 013015 SNOWFALL (AVERAGE RATE) M/S 7 0 12
+ 013016 PRECIPITABLE WATER KG/M**2 0 0 7
+ 013019 TOTAL PRECIPITATION PAST 1 HOUR KG/M**2 1 -1 14
+ 013020 TOTAL PRECIPITATION PAST 3 HOURS KG/M**2 1 -1 14
+ 013021 TOTAL PRECIPITATION PAST 6 HOURS KG/M**2 1 -1 14
+ 013022 TOTAL PRECIPITATION PAST 12 HOURS KG/M**2 1 -1 14
+ 013023 TOTAL PRECIPITATION PAST 24 HOURS KG/M**2 1 -1 14
+ 013031 EVAPOTRANSPIRATION KG/M**2 0 0 7
+ 013032 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 8
+ 013041 PASQUILL-GILLFORD STABILITY CATEGORY CODE TABLE 13041 0 0 4
+ 013192 RELATIVE HUMIDITY AT 2 M % 0 0 8
+ 013193 RELATIVE HUMIDITY % 0 0 8
+ 013194 TOTAL COLUMN WATER KG/M**2 2 0 11
+ 013195 RAIN RATE KG/M**2HOUR 0 0 5
+ 013196 ANTECEDENT PRECIPITATION INDEX KG/M**2 0 0 7
+ 013197 TOTAL COLUMN WATER VAPOUR KG/M**2 1 0 10
+ 013198 RAIN FLAG CODE TABLE 13198 0 0 3
+ 013199 SPECIFIC HUMIDITY AT 2 M KG/KG 5 0 14
+ 013201 CLOUD LIQUID WATER KG/KG 7 0 14
+ 013202 TYPE OF SURFACE CODE TABLE 13202 0 0 8
+ 013203 1D VAR ESTIMATE OF RAIN RATE KG/M**2*HOUR 2 0 12
+ 013204 SSMI INDEPENDENT ESTIMATE OF RAIN RATE KG/M**2*HOUR 2 0 12
+ 013205 CLOUD LIQUID WATER PATH KG/M**2 4 0 14
+ 013210 1D VAR CLOUD LIQUID WATER PATH RETRIEVED ERROR(S) KG/M**2 4 0 14
+ 013211 TOTAL PRECIPITABLE WATER INDIPENDENT ESTIMATE OF ERROR(S) KG/M**2 2 0 11
+ 013212 CLOUD LIQUID WATER PATH INDIPENDENT ESTIMATE OF ERROR(S) KG/M**2 4 0 14
+ 014001 LONG-WAVE RADIATION,INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12
+ 014002 LONG-WAVE RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12
+ 014003 SHORT-WAVE RADIATION,INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12
+ 014004 SHORT-WAVE RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12
+ 014011 NET LONG-WAVE RADIATION,INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12
+ 014012 NET LONG-WAVE RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12
+ 014013 NET SHORT-WAVE RADIATION,INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12
+ 014014 NET SHORT-WAVE RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12
+ 014015 NET RADIATION INTEGRATED OVER 24HOURS J/M**2 -4 -16384 15
+ 014016 NET RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 -16384 15
+ 014017 INSTANTANEOUS LONG-WAVE RADIATION J/M**2 -3 -2048 12
+ 014018 INSTANTANEOUS SHORT-WAVE RADIATION J/M**2 -3 -2048 12
+ 014020 GLOBAL SOLAR RADIATION INTEGRATED OVER 24 HOURS J/M**2 -4 0 15
+ 014021 GLOBAL RADIATION INTEGRATED OVERPERIOD SPECIFIED J/M**2 -4 0 15
+ 014022 DIFFUSE SOLAR RADIATION INTEGRATED OVER 24 HOURS J/M**2 -4 0 15
+ 014023 DIFFUSE SOLAR RADIATION INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15
+ 014024 DIRECT SOLAR RADIATION INTEGRATED OVER 24 HOURS J/M**2 -4 0 15
+ 014025 DIRECT SOLAR RADIATION INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15
+ 014031 TOTAL SUNSHINE MINUTE 0 0 11
+ 014032 TOTAL SUNSHINE HOUR 0 0 10
+ 015001 OZON DOBSON 0 0 10
+ 015202 INTEGRATED ELECTRON DENSITY 1/M**2 3 13000 12
+ 019001 TYPE OF SYNOPTIC FEATURE CODE TABLE 19001 0 0 6
+ 019002 EFFECTIVE RADIUS OF FEATURE M -2 0 12
+ 019003 WIND SPEED THRESHOLD M/S 0 0 8
+ 019004 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD M -2 0 12
+ 019005 DIRECTION OF MOTION OF FEATURE DEGREE TRUE 0 0 9
+ 019006 SPEED OF MOTION OF FEATURE M/S 2 0 14
+ 019007 EFFECTIVE RADIUS OF FEATURE M -3 0 12
+ 019008 VERTICAL EXTENT OF CIRCULATION CODE TABLE 19008 0 0 3
+ 019009 EFFECTIVE RADIUS WITH RESPECT TOWIND SPEEDS ABOVE TRESHOLD M -3 0 12
+ 020001 HORIZONTAL VISIBILITY M -1 0 13
+ 020002 VERTICAL VISIBILITY M -1 0 7
+ 020003 PRESENT WEATHER CODE TABLE 20003 0 0 9
+ 020004 PAST WEATHER (1) CODE TABLE 20004 0 0 5
+ 020005 PAST WEATHER (2) CODE TABLE 20005 0 0 5
+ 020010 CLOUD COVER (TOTAL) % 0 0 7
+ 020011 CLOUD AMOUNT CODE TABLE 20011 0 0 4
+ 020012 CLOUD TYPE CODE TABLE 20012 0 0 6
+ 020013 HEIGHT OF BASE OF CLOUD M -1 -40 11
+ 020014 HEIGHT OF TOP OF CLOUD M -1 -40 11
+ 020016 PRESSURE AT THE TOP OF CLOUD PA -1 0 14
+ 020017 CLOUD TOP DESCRIPTION CODE TABLE 20017 0 0 4
+ 020031 ICE DEPOSIT (THICKNESS) M 2 0 7
+ 020032 RATE OF ICE ACCRETION CODE TABLE 20032 0 0 3
+ 020033 CAUSE OF ICE ACCRETION FLAG TABLE 20033 0 0 4
+ 020034 SEA ICE CONCETRATION CODE TABLE 20034 0 0 5
+ 020035 AMOUNT AND TYPE OF ICE CODE TABLE 20035 0 0 4
+ 020036 ICE SITUATION CODE TABLE 20036 0 0 5
+ 020037 ICE DEVELOPMENT CODE TABLE 20037 0 0 5
+ 020038 BEARING OF THE ICE EDGE DEGREE TRUE 0 0 12
+ 020039 ICE DISTANCE M -1 0 13
+ 020041 AIRFRAME ICING CODE TABLE 20041 0 0 4
+ 020051 AMOUNT OF LOW CLOUDS % 0 0 7
+ 020052 AMOUNT OF MIDDLE CLOUDS % 0 0 7
+ 020053 AMOUNT OF HIGH CLOUDS % 0 0 7
+ 020061 RUNWAY VISUAL RANGE (RVR) M 0 0 12
+ 020062 STATE OF GROUND (WITH OR WITHOUT SNOW) CODE TABLE 20062 0 0 5
+ 020063 SPECIAL PHENOMENA CODE TABLE 20063 0 0 10
+ 020192 SPECIAL PHENOMENA CODE TABLE 20192 0 0 14
+ 020193 CLOUD AMOUNT IN SEGMENT % 0 0 7
+ 020194 AMOUNT OF SEGMENT CLOUD FREE % 0 0 7
+ 020215 PRESSURE AT THE BASE OF CLOUD PA -1 0 14
+ 020250 CALCULATED SURFACE TYPE CODE TABLE 20250 0 0 5
+ 020251 ICE AGE CODE TABLE 20251 0 0 3
+ 020252 ICE EDGE CODE TABLE 20252 0 0 3
+ 020253 SURFACE TYPE CODE TABLE 20253 0 0 3
+ 020254 ICE CONCENTRATION % 0 0 7
+ 021001 HORIZONTAL REFLECTIVITY dB 0 -64 7
+ 021002 VERTICAL REFLECTIVITY dB 0 -64 7
+ 021003 DIFFERENTIAL REFLECTIVITY dB 1 -5 7
+ 021005 LINEAR DEPOLARISATION RATIO dB 0 -65 6
+ 021006 CIRCULAR DEPOLARIZATION RATIO dB 0 -65 6
+ 021011 DOPPLER MEAN VELOCITY IN X-DIRECTION M/S 0 -128 8
+ 021012 DOPPLER MEAN VELOCITY IN Y-DIRECTION M/S 0 -128 8
+ 021013 DOPPLER MEAN VELOCITY IN Z-DIRECTION(VZ) M/S 0 -128 8
+ 021014 DOPPLER MEAN VELOCITY RADIAL M/S 1 -4096 13
+ 021017 DOPPLER VELOCITY SPECTRAL WIDTH M/S 1 -4096 8
+ 021021 ECHO TOPS M -3 0 4
+ 021031 VERTICALLY INTEGRATED LIQUID-WATER CONTENT KG/M**2 0 0 7
+ 021036 RADAR RAINFALL INTENSITY M/S 7 0 12
+ 021041 BRIGHT-BAND HEIGHT M -2 0 8
+ 021051 SIGNAL POWER ABOVE 1 mW dB 0 -256 8
+ 021192 RADAR BACK SCATTER dB 2 -5000 13
+ 021193 NOISE FIGURE % 0 0 7
+ 021194 BACKGROUND NOISE LEVEL NUMERIC 0 0 8
+ 021195 MISSING PACKET COUNTER NUMERIC 0 -127 8
+ 021196 UWA PRODUCT CONFIDENCE FLAG TABLE 21196 0 0 12
+ 021197 UWI PRODUCT CONFIDENCE FLAG TABLE 21197 0 0 12
+ 021198 URA PRODUCT CONFIDENCE FLAG TABLE 21198 0 0 8
+ 021199 UAT PRODUCT CONFIDENCE FLAG TABLE 21199 0 0 7
+ 021200 MWI PRODUCT CONFIDENCE FLAG TABLE 21200 0 0 15
+ 021201 PEAKINESS NUMERIC 0 0 16
+ 021202 ALTIMETER CALIBRATION STATUS FLAG TABLE 21202 0 0 4
+ 021203 ALTIMETER INSTRUMENT MODE FLAG TABLE 21203 0 0 9
+ 021204 MULTI/SINGLE VIEW DIFFERENCE K 2 -512 10
+ 021205 SPECTRAL INTENSITY NUMERIC 0 0 8
+ 021206 REPRESENTATION OF INTENSITY CODE TABLE 21206 0 0 3
+ 021207 ALTITUDE CORRECTION (IONOSPHERE) M 3 0 14
+ 021208 ALTITUDE CORRECTION (DRY TROPOSPHERE) M 3 0 9
+ 021209 LTITUDE CORRECTION (WET TROPOSPHERE) M 3 2000 10
+ 021210 ALTITUDE CORRECTION (CALIBRATION CONSTANT) M 3 0 11
+ 021211 OPEN LOOP CORRECTION (HTL) M 3 0 10
+ 021212 OPEN LOOP CORRECTION (AGC) dB 3 -3000 14
+ 021213 AMBIGUITY REMOVAL CONFIDENCE % 0 0 7
+ 021214 UAT QUALITY SUMMARY CODE TABLE 21214 0 0 3
+ 021215 UAT ACROSS-TRACK BAND NO. NUMERIC 0 0 4
+ 021222 DOPPLER SPECTRUM 0 TH MOMENT (AMPLITUDE) dB 0 0 7
+ 021225 PRESCAT PRODUCT CONFIDENCE FLAG TABLE 21225 0 0 6
+ 021226 BACKSCATER DISTANCE NUMERIC 1 -4096 13
+ 021230 NUMBER OF VECTOR AMBIGUITIES NUMERIC 0 0 3
+ 021231 INDEX OF SELECTED WIND VECTOR NUMERIC 0 0 3
+ 021232 TOTAL NMBER OF SIGMA-0 MEASUREMENTS NUMERIC 0 0 5
+ 021233 NUMBER OF SIGMA-0 USABLE FOR WIND NUMERIC 0 0 5
+ 021234 LIKELIHOOD COMPUTED FOR SOLUTION NUMERIC 1 -10000 14
+ 021235 WIND VECTOR CELL QUALITY FLAG FLAG TABLE 21235 0 0 3
+ 021236 NUMBER OF FORE-BEAM SIGMA-0 NUMERIC 1 0 6
+ 021237 NUMBER OF MID-BEAM V-POL SIGMA-0 NUMERIC 1 0 6
+ 021238 NUMBER OF MID-BEAM H-POL SIGMA-0 NUMERIC 1 0 6
+ 021239 NUMBER OF AFT-BEAM SIGMA-0 NUMERIC 1 0 6
+ 021240 NORMALIZED RADAR CROSS SECTION NUMERIC 2 -10000 14
+ 021241 Kp VARIANCE COEFFICIENT (ALPHA) NUMERIC 5 0 14
+ 021242 Kp VARIANCE COEFFICIENT (BETHA) NUMERIC 6 0 16
+ 021243 Kp VARIANCE COEFFICIENT (GAMMA) NUMERIC 6 0 16
+ 021244 SIGMA-0 QUALITY FLAG FLAG TABLE 21244 0 0 15
+ 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9
+ 022002 DIRECTION OF WIND WAVES DEGREE TRUE 0 0 9
+ 022003 DIRECTION OF SWELL WAVES DEGREE TRUE 0 0 9
+ 022004 DIRECTION OF CURRENT DEGREE TRUE 0 0 12
+ 022011 PERIOD OF WAVES S 0 0 6
+ 022012 PERIOD OF WIND WAVES S 0 0 6
+ 022013 PERIOD OF SWELL WAVES S 0 0 6
+ 022021 HEIGHT OF WAVES M 1 0 10
+ 022022 HEIGHT OF WIND WAVES M 1 0 10
+ 022023 HEIGHT OF SWELL WAVES M 1 0 10
+ 022025 STANDARD DEVIATION WAVE HEIGHT M 2 0 10
+ 022031 SPEED OF CURRENT M/S 2 0 13
+ 022042 SEA TEMPERATURE K 1 0 12
+ 022043 SEA TEMPERATURE K 2 0 15
+ 022044 SOUND VELOCITY M/S 1 0 14
+ 022050 STANDARD DEVIATION SEA SURFACE TEMPERATURE K 2 0 8
+ 022061 STATE OF SEA CODE TABLE 22061 0 0 4
+ 022062 SALINITY %. 3 0 14
+ 022063 TOTAL WATER DEPTH M 0 0 14
+ 022192 SPECTRAL PERIOD S 2 0 13
+ 022193 MEAN WAVENUMBER 1/M 5 0 15
+ 022194 PEAK WAVENUMBER 1/M 5 0 15
+ 022195 MEAN WAVE PROPAGATION DIRECTION DEGREE 1 0 13
+ 022196 PEAK WAVE PROPAGATION DIRECTION DEGREE 1 0 13
+ 022197 DIRECTION SPREAD DEGREE 1 0 13
+ 022198 VARIANCE SPECTRAL DENSITY M**2*S/RAD 4 0 18
+ 022199 CORRELATION COEFF OF SIMULATED FG AND OBSERVED SAR SPECTRUM NUMERIC 4 -10000 15
+ 022200 CORRELATION COEFF OF SIMULATED BF AND OBSERVED SAR SPECTRUM NUMERIC 4 -10000 15
+ 022201 CORRELATION COEFF OF OCEAN WAVE FG AND EXTRACTED WAVE SPECTRUM NUMERIC 4 -10000 15
+ 022202 ERROR BETWEEN FIRST GUESS AND OBSERVED SAR NUMERIC 5 0 21
+ 022203 ERROR BETWEEN SIMULATED AND OBSERVED SAR NUMERIC 5 0 21
+ 022204 MEAN PERIOD OF WAVES SECOND 2 0 13
+ 022205 SPECTRAL DENSITY M**2*S/RAD 4 0 25
+ 022206 PEAK PERIOD OF WAVES SECOND 2 0 13
+ 022207 MEAN WAVE PERIOD S 1 0 10
+ 022208 PEAK PERIOD OF 1D SPECTRA S 1 0 10
+ 022209 COEFICIENT OF DRAG WITH WAVES NUMERIC 6 0 13
+ 022210 MEAN SQUARE SLOPE OF WAVES NUMERIC 4 -10000 14
+ 022243 STANDARD DEVIATION SIGNIFICANT WAVE HEIGHT M 2 0 10
+ 023001 ACCIDENT EARLY NOTIFICATION-ARTICLE APPLICABLE CODE TABLE 23001 0 0 3
+ 023002 ACTIVITY OR FACILITY INVOLVED ININCIDENT CODE TABLE 23002 0 0 5
+ 023003 TYPE OF RELEASE CODE TABLE 23003 0 0 3
+ 023004 COUNTERMEASURES TAKEN NEAR BORDER CODE TABLE 23004 0 0 3
+ 023005 COUSE OF INCIDENT CODE TABLE 23005 0 0 2
+ 023006 INCIDENT SITUATION CODE TABLE 23006 0 0 3
+ 023007 CHARACTERISTICS OF RELEASE CODE TABLE 23007 0 0 3
+ 023008 STATE OF CURRENT RELEASE CODE TABLE 23008 0 0 2
+ 023009 STATE OF EXPECTED RELEASE CODE TABLE 23009 0 0 2
+ 023016 POSSIBILITY OF SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT CODE TABLE 23016 0 0 2
+ 023017 FLOW DISCHARGE OF MAJOR RECEPIENT M**3/S 6 0 20
+ 023018 RELEASE BEHAVIOUR OVER TIME CODE TABLE 23018 0 0 3
+ 023019 ACTUAL RELEASE HEIGHT M 0 -15000 17
+ 023021 EFFECTIVE RELEASE HEIGHT M 0 -15000 17
+ 023022 DISTANCE OF RELEASE POINT OR SITE OF INCIDENT M 0 0 24
+ 023023 MAIN TRANSPORT SPEED IN THE ATMOSPHERE M/S 1 0 12
+ 023024 MAIN TRANSPORT SPEED WATER M/S 2 0 13
+ 023025 MAIN TRANSPORT SPEED IN GROUND WATER M/S 2 0 13
+ 023027 MAIN TRANSPORT DIRECTION IN THE ATMOSPHERE DEGREE TRUE 0 0 9
+ 023028 MAIN TRANSPORT DIRECTION IN WATER DEGREE TRUE 0 0 9
+ 023029 MAIN TRANSPORT DIRECTION IN GROUND WATER DEGREE TRUE 0 0 9
+ 023031 POSSIBILITY THAT PLUME WILL ENCOUNTER PRECIPITATION IN STATE IN CODE TABLE 23031 0 0 2
+ 023032 PLUME WILL ENCOUNTER CHANGE IN WIND DIRECTION AND/OR SPEED FLAG CODE TABLE 23032 0 0 2
+ 024001 ESTIMATE OF AMOUNT OF RADIOACTIVITY RELEASED UP TO SPECIFIED TIM Bq -11 0 28
+ 024002 ESTIMATED MAXIMUM POTENTIAL RELEASE Bq -11 0 28
+ 024003 COMPOSITION OF RELEASE CODE TABLE 24003 0 0 5
+ 024004 ELEMENT NAME CCITTIA5 0 0 16
+ 024005 ISOTOPE MASS NUMERIC 0 0 9
+ 024011 DOSE mSv 2 0 32
+ 024012 TRAJECTORY DOSE (DEFINED LOCATION AND EXPECTED TIME) mSv 2 0 32
+ 024013 GAMMA DOSE IN AIR ALONG THE MAINTRANSPORT PATH(DEFINED LOCATION mSv 2 0 32
+ 024021 AIR CONCENTRATION(OF NAMED ISOTOPE TYPE INCLUDING GROSS BETA Bq/M**3 2 0 32
+ 024022 CONCENTRATION IN PRECIPITATION ( OF NAMED ISOTOPE TYPE) Bq/L 2 0 32
+ 025001 RANGE-GATE LENGTH M -1 0 6
+ 025002 NUMBER OF GATES AVERAGED NUMERIC 0 0 4
+ 025003 NUMBER OF INTEGRATED PULSES NUMERIC 0 0 8
+ 025004 ECHO PROCESSING CODE TABLE 25004 0 0 2
+ 025005 ECHO INTEGRATION CODE TABLE 25005 0 0 2
+ 025006 Z TO R CONVERSION CODE TABLE 25006 0 0 3
+ 025007 Z TO R CONVERSION FACTOR NUMERIC 0 0 12
+ 025008 Z TO R CONVERSION EXPONENT NUMERIC 2 0 9
+ 025009 CALIBRATION METHOD FLAG TABLE 25009 0 0 4
+ 025010 CLUTTER TREATMENT CODE TABLE 25010 0 0 4
+ 025011 GROUND ACCULTATION CORRECTION(SCREENING) CODE TABLE 25011 0 0 2
+ 025012 RANGE ATTENUATION CORRECTION CODE TABLE 25012 0 0 2
+ 025013 BRIGHT-BAND CORRECTION FLAG TABLE 25013 0 0 2
+ 025014 AZIMUTH CLUTTER CUT-OFF NUMERIC 0 0 12
+ 025015 RADOM ATTENUATION CORRECTION FLAG TABLE 25015 0 0 2
+ 025016 CLEAR-AIR ATTENUATION CORRECTION dB/M 5 0 6
+ 025017 PRECIPITATION ATTENUATION CORRECTION FLAG TABLE 25017 0 0 2
+ 025018 A TO Z LAW FOR ATTENUATION FACTOR NUMERIC 7 0 6
+ 025019 A TO Z LAW FOR ATTENUATION EXPONENT NUMERIC 2 0 7
+ 025020 MEAN SPEED ESTIMATION CODE TABLE 25020 0 0 2
+ 025021 WIND COMPUTATION EHANCEMENT FLAG TABLE 25021 0 0 8
+ 025030 SIGNAL TO NOISE RATIO dB 0 -32 8
+ 025032 WIND PROFILER MODE INFORMATION CODE TABLE 25032 0 0 2
+ 025033 NOAA WIND PROFILER SUBMODE INFORMATION CODE TABLE 25033 0 0 2
+ 025034 NOAA WIND PROFILER QUALITY CONTROL TEST RESULTS FLAG TABLE 25034 0 0 4
+ 025193 ATTENUATION CORRECTION ON SIGMA0 dB 3 0 14
+ 025194 MAJOR FRAME COUNT NUMERIC 0 0 4
+ 025197 ANTENNA CORRECTIONS VERSION NUMBER NUMERIC 0 0 5
+ 025198 LOG (TEMP-RAD CENTRAL WAVE NUMBER) 1/M 8 0 30
+ 025199 BANDWIDTH CORRECTION COEFFICIENT 1 NUMERIC 4 -10000 15
+ 025200 BANDWIDTH CORRECTION COEFFICIENT 2 NUMERIC 5 0 17
+ 025201 ALBEDO-RAD SOLAR FILTERED IRRADIANCE NUMERIC 4 0 24
+ 025202 ALBEDO-RAD EQUIVALENT FILTER WIDTH NUMERIC 10 0 14
+ 025203 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 25081 0 0 31
+ 025204 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 25082 0 0 31
+ 025205 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 25083 0 0 31
+ 025206 FOV QUALITY FLAGS FOR ATOVS FLAG TABLE 25084 0 0 31
+ 026193 YEAR YEAR 0 0 12
+ 026194 MONTH MONTH 0 0 4
+ 026195 DAY DAY 0 0 6
+ 026196 HOUR HOUR 0 0 5
+ 026197 MINUTE MINUTE 0 0 6
+ 026198 SECOND SECOND 0 0 6
+ 026200 LOCATION WITHIN ASSIMILATION WINDOW IN TIME NUMERIC 6 0 20
+ 027001 LATITUDE(HIGH ACCURACY) DEGREE 5 -9000000 25
+ 027002 LATITUDE(COARSE ACCURACY) DEGREE 2 -9000 15
+ 027003 ALTERNATE LATITUDE DEGREE 2 -9000 15
+ 027020 SATELLITE LOCATION COUNTER NUMERIC 0 0 16
+ 027193 SOLAR AZIMUTH DEGREE TRUE 2 0 16
+ 028001 LONGITUDE(HIGH ACCURACY) DEGREE 5 -18000000 26
+ 028002 LONGITUDE(COARSE ACCURACY) DEGREE 2 -18000 16
+ 028003 ALTERNATE LONGITUDE DEGREE 2 -18000 16
+ 029001 PROJECTION TYPE CODE TABLE 29001 0 0 3
+ 029002 CO-ORDINATE GRID TYPE CODE TABLE 29002 0 0 2
+ 030001 PIXEL VALUE(4 BITS) NUMERIC 0 0 4
+ 030021 NUMBER OF PIXELS PER ROW NUMERIC 0 0 12
+ 030022 NUMBER OF PIXELS PER COLUMN NUMERIC 0 0 12
+ 030031 PICTURE TYPE CODE TABLE 30031 0 0 4
+ 030032 COMBINATION WITH OTHER DATA FLAG TABLE 30032 0 0 16
+ 030193 POSITION NUMBER ALONG SCAN NUMERIC 0 0 8
+ 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8
+ 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16
+ 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8
+ 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16
+ 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 31021 0 0 6
+ 031031 DATA PRESENT INDICATOR FLAG TABLE 31031 0 0 1
+ 031192 DATA PRESENT INDICATOR NUMERIC 0 0 1
+ 033002 QUALITY INFORMATION TABLE CODE TABLE 33002 0 0 2
+ 033003 QUALITY INFORMATION TABLE CODE TABLE 33003 0 0 3
+ 033007 % CONFIDENCE % 0 0 7
+ 033191 ECMWF WAM QC INDICATOR CODE TABLE 033191 0 0 2
+ 033193 DATA QUALITY 3 BIT CODE CODE TABLE 33193 0 0 3
+ 033194 DATA QUALITY 2 BIT CODE CODE TABLE 33194 0 0 2
+ 033195 ECMWF SAR QC INDICATOR CODE TABLE 33195 0 0 5
+ 033196 ECMWF WAM QC INDICATOR CODE TABLE 33196 0 0 2
+ 033197 ECMWF SAR INVERSION QC INDICATOR CODE TABLE 33197 0 0 3
+ 033198 MINIMUM COST NUMERIC 4 0 14
+ 033199 1D VAR TOTAL PRECIPITABLE WATER RETRIEVED ERROR(S) KG/M**2 2 0 11
+ 033200 ANALYSIS REPORT EVENTS FLAG TABLE 33200 0 0 31
+ 033201 ANALYSIS REPORT STATUS EVENT FLAG TABLE 33201 0 0 13
+ 033202 ANALYSIS DATUM EVENT FLAGS (1) FLAG TABLE 33202 0 0 31
+ 033203 ANALYSIS DATUM EVENT FLAGS (2) FLAG TABLE 33203 0 0 11
+ 033204 ANALYSIS DATUM STATUS FLAGS FLAG TABLE 33204 0 0 21
+ 033205 VARIATIONAL ANALYSIS BLACK LIST FLAG CODE TABLE 33205 0 0 4
+ 033206 VARIATIONAL ANALYSIS QUALITY CONTROL FLAG CODE TABLE 33206 0 0 4
+ 033207 VARIATIONAL ANALYSIS DEPARTURE FLAG CODE TABLE 33207 0 0 4
+ 033208 VARIATIONAL ANALYSIS FIRST QUESSCHECK FLAG CODE TABLE 33208 0 0 4
+ 033209 VARIATIONAL ANALYSIS FINAL FLAG CODE TABLE 33209 0 0 4
+ 033210 INCREMENTAL VARIATIONAL ANALYSISUPDATE NUMBER NUMERIC 0 0 7
+ 033211 MINIMISATION SIMULATION NUMBER NUMERIC 0 0 10
+ 033212 1D VAR ITERRATION NUMBER NUMERIC 0 0 10
+ 033213 1D VAR RADIANCE COST NUMERIC 1 -1000 11
+ 033214 1D VAR ERROR(S) FLAG TABLE 33214 0 0 11
+ 033215 DIRECTIONAL SKILL NUMERIC 1 -4096 13
+ 033216 1D VAR SURFACE TYPE QUALITY CONTROL CODE TABLE 33216 0 0 3
+ 033217 1D VAR FAILURE INDICATOR CODE TABLE 33217 0 0 2
+ 033218 1D VAR ESTIMATE OF SCATTERING NUMERIC 2 0 12
+ 033219 SSMI INDIPENDENT SCATTERING INDEX NUMERIC 2 -50000 16
+ 033220 VARIATIONAL ANALYSIS REPORT EVENTS (1) FLAG TABLE 33220 0 0 31
+ 033221 VARIATIONAL ANALYSIS SYNOP EVENTS (2) FLAG TABLE 33221 0 0 31
+ 033222 VARIATIONAL ANALYSIS AIREP EVENTS (2) FLAG TABLE 33222 0 0 31
+ 033223 VARIATIONAL ANALYSIS SATOB EVENTS (2) FLAG TABLE 33223 0 0 31
+ 033224 VARIATIONAL ANALYSIS DRIBU EVENTS (2) FLAG TABLE 33224 0 0 31
+ 033225 VARIATIONAL ANALYSIS TEMP EVENTS (2) FLAG TABLE 33225 0 0 31
+ 033226 VARIATIONAL ANALYSIS PILOT EVENTS (2) FLAG TABLE 33226 0 0 31
+ 033227 VARIATIONAL ANALYSIS SATEM/TOVS EVENTS (2) FLAG TABLE 33227 0 0 31
+ 033228 VARIATIONAL ANALYSIS PAOB EVENTS (2) FLAG TABLE 33228 0 0 31
+ 033229 VARIATIONAL ANALYSIS SCATTEROMETER EVENTS (2) FLAG TABLE 33229 0 0 31
+ 033230 VARIATIONAL ANALYSIS RAW RADIANCES EVENTS (2) FLAG TABLE 33230 0 0 31
+ 033231 PRESAT SUMMARY FLAGS FLAG TABLE 33231 0 0 6
+ 033232 REPORT BLACK LIST EVENTS FLAG TABLE 33232 0 0 31
+ 033233 VARIATIONAL ANALYSIS REPORT STATUS FLAG TABLE 33233 0 0 31
+ 033234 VARIATIONAL ANALYSIS DATUM STATUS FLAG TABLE 33234 0 0 31
+ 033236 VARIATIONAL ANALYSIS DATUM EVENTS (1) FLAG TABLE 33236 0 0 31
+ 033237 VARIATIONAL ANALYSIS SYNOP DATUMEVENTS (2) FLAG TABLE 33237 0 0 31
+ 033238 VARIATIONAL ANALYSIS AIREP DATUMEVENTS (2) FLAG TABLE 33238 0 0 31
+ 033239 VARIATIONAL ANALYSIS SATOB DATUMEVENTS (2) FLAG TABLE 33239 0 0 31
+ 033240 VARIATIONAL ANALYSIS DRIBU DATUMEVENTS (2) FLAG TABLE 33240 0 0 31
+ 033241 GROSS ERROR PROBABILITY NUMERIC 3 0 10
+ 033242 GROSS ERROR INDICATOR CODE TABLE 33242 0 0 2
+ 033243 VARIATIONAL ANALYSIS TEMP DATUM EVENTS (2) FLAG TABLE 33243 0 0 31
+ 033244 VARIATIONAL ANALYSIS PILOT DATUMEVENTS (2) FLAG TABLE 33244 0 0 31
+ 033245 VARIATIONAL ANALYSIS SATEM/TOVS DATUM EVENTS (2) FLAG TABLE 33245 0 0 31
+ 033246 VARIATIONAL ANALYSIS PAOB DATUM EVENTS (2) FLAG TABLE 33246 0 0 31
+ 033247 VARIATIONAL ANALYSIS SCATTEROMETER DATUM EVENTS (2) FLAG TABLE 33247 0 0 31
+ 033248 VARIATIONAL ANALYSIS RAW RADIANCES DATUM EVENTS (2) FLAG TABLE 33248 0 0 31
+ 033249 DATUM BLACK LIST EVENTS FLAG TABLE 33249 0 0 31
+ 033250 PROBABILITY OF GROSS ERROR NUMERIC 6 0 20
+ 033251 RANGE OF POSSIBLE VALUES NUMERIC 2 0 14
+ 033252 MANUAL-AUTOMATIC QUALITY CONTROL CODE TABLE 33252 0 0 4
+ 033253 NOMINAL CONFIDENCE THRESHOLD % 0 0 7
+ 033254 WIND CORRELATION METHOD FLAG TABLE 33254 0 0 20
+ 055003 DATA EXTRACTION INDICATOR FLAG TABLE 55003 0 0 8
+ 062190 STATISTICS APPLICATION CODE TABLE 62190 0 0 8
+ 062191 TYPE OF STATISTICS CODE TABLE 62191 0 0 8
+ 063190 APPLICATION DERIVING SUBSTITUTE OR ALTERNATIVE VALUE CODE TABLE 63190 0 0 8
diff --git a/bufrtables/B0000000000098006000.TXT b/bufrtables/B0000000000098006000.TXT
new file mode 100755
index 0000000..5d91e3d
--- /dev/null
+++ b/bufrtables/B0000000000098006000.TXT
@@ -0,0 +1,1283 @@
+ 000001 TABLE A: ENTRY CCITTIA5 0 0 24
+ 000002 TABLE A: DATA CATEGORY DESCRIPTION, LINE 1 CCITTIA5 0 0 256
+ 000003 TABLE A: DATA CATEGORY DESCRIPTION, LINE 2 CCITTIA5 0 0 256
+ 000005 BUFR EDITION NUMBER CCITTIA5 0 0 24
+ 000010 F DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 8
+ 000011 X DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 16
+ 000012 Y DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 24
+ 000013 ELEMENT NAME, LINE 1 CCITTIA5 0 0 256
+ 000014 ELEMENT NAME, LINE 2 CCITTIA5 0 0 256
+ 000015 UNITS NAME CCITTIA5 0 0 192
+ 000016 UNITS SCALE SIGN CCITTIA5 0 0 8
+ 000017 UNITS SCALE CCITTIA5 0 0 24
+ 000018 UNITS REFERENCE SIGN CCITTIA5 0 0 8
+ 000019 UNITS REFERENCE VALUE CCITTIA5 0 0 80
+ 000020 ELEMENT DATA WIDTH CCITTIA5 0 0 24
+ 000030 DESCRIPTOR DEFINING SEQUENCE CCITTIA5 0 0 48
+ 001001 WMO BLOCK NUMBER NUMERIC 0 0 7
+ 001002 WMO STATION NUMBER NUMERIC 0 0 10
+ 001003 WMO REGION NUMBER/GEOGRAPHICAL AREA CODE TABLE 001003 0 0 3
+ 001004 WMO REGION SUB-AREA NUMERIC 0 0 3
+ 001005 BUOY/PLATFORM IDENTIFIER NUMERIC 0 0 17
+ 001006 AIRCRAFT FLIGHT NUMBER CCITTIA5 0 0 64
+ 001007 SATELLITE IDENTIFIER CODE TABLE 001007 0 0 10
+ 001008 AIRCRAFT REGISTRATION NUMBER CCITTIA5 0 0 64
+ 001009 TYPE OF COMMERCIAL AIRCRAFT CCITTIA5 0 0 64
+ 001010 STATIONARY BUOY PLATFORM IDENTIFIER(C-MAN BUOYS) CCITTIA5 0 0 64
+ 001011 SHIP OR MOBILE LAND STATION IDENTIFIER CCITTIA5 0 0 72
+ 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM DEGREE TRUE 0 0 9
+ 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM M/S 0 0 10
+ 001014 PLATFORM DRIFT SPEED (HIGH PRECISION) M/S 2 0 10
+ 001015 STATION OR SITE NAME CCITTIA5 0 0 160
+ 001018 SHORT STATION OR SITE NAME CCITTIA5 0 0 40
+ 001019 LONG STATION OR SITE NAME CCITTIA5 0 0 256
+ 001020 WMO REGION SUB-AREA NUMERIC 0 0 4
+ 001021 SYNOPTIC FEATURE IDENTIFIER NUMERIC 0 0 14
+ 001022 NAME OF FEATURE CCITTIA5 0 0 224
+ 001023 OBSERVATION SEQUENCE NUMBER NUMERIC 0 0 9
+ 001025 STORM IDENTIFIER CCITTIA5 0 0 24
+ 001026 WMO STORM NAME CCITTIA5 0 0 64
+ 001027 WMO LONG STORM NAME CCITTIA5 0 0 80
+ 001031 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE CODE TABLE 001031 0 0 16
+ 001032 GENERATING APPLICATION CODE TABLE 001032 0 0 8
+ 001033 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE CODE TABLE 001033 0 0 8
+ 001034 IDENTIFICATION OF ORIGINATING/GENERATING SUB-CENTRE CODE TABLE 001034 0 0 8
+ 001035 ORIGINATING CENTRE CODE TABLE 001035 0 0 16
+ 001036 AGENCY IN CHARGE OF OPERATING THE OBSERVING PLATFORM CODE TABLE 001036 0 0 20
+ 001037 SIGMET SEQUENCE NUMBER CCITTIA5 0 0 24
+ 001041 ABSOLUTE PLATFORM VELOCITY - FIRST COMPONENT M/S 5 -1073741824 31
+ 001042 ABSOLUTE PLATFORM VELOCITY - SECOND COMPONENT M/S 5 -1073741824 31
+ 001043 ABSOLUTE PLATFORM VELOCITY - THIRD COMPONENT M/S 5 -1073741824 31
+ 001050 PLATFORM TRANSMITTER ID NUMBER NUMERIC 0 0 17
+ 001051 PLATFORM TRANSMITTER ID NUMBER CCITTIA5 0 0 96
+ 001060 AIRCRAFT REPORTING POINT(BEACON IDENTIFIER) CCITTIA5 0 0 64
+ 001062 SHORT ICAO LOCATION INDICATOR CCITTIA5 0 0 32
+ 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64
+ 001064 RUNWAY DESIGNATOR CCITTIA5 0 0 32
+ 001065 ICAO REGION IDENTIFIER CCITTIA5 0 0 256
+ 001075 TIDE STATION IDENTIFICATION CCITTIA5 0 0 40
+ 001080 SHIP LINE NUMBER ACCORDING TO SOOP CCITTIA5 0 0 32
+ 001085 OBSERVING PLATFORM MANUFACTURER'S MODEL CCITTIA5 0 0 160
+ 001086 OBSERVING PLATFORM MANUFACTURER'S SERIAL NUMBER CCITTIA5 0 0 256
+ 001090 TECHNIQUE FOR MAKING UP INITIAL PERTURBATIONS CODE TABLE 001090 0 0 8
+ 001091 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 10
+ 001092 TYPE OF ENSEMBLE FORECAST CODE TABLE 001092 0 0 8
+ 001095 SOFTWARE IDENTIFICATION AND VERSION NUMBER CCITTIA5 0 0 112
+ 001096 ACQUISITION STATION IDENTIFIER CCITTIA5 0 0 160
+ 001192 MODEL VERSION NUMBER CODE TABLE 1192 0 0 8
+ 001193 SIGMA_0 SIMULATION METHOD CODE TABLE 1193 0 0 4
+ 001194 CARRIER BALLOON/AIRCRAFT IDENTIFIER CCITTIA5 0 0 72
+ 001195 MOBIL LAND STATION IDENTIFIER CCITTIA5 0 0 72
+ 001196 CONSTANT LEVEL BALLOON IDENTIFIER CCITTIA5 0 0 72
+ 001197 RTP - PLATFORM TYPE CODE TABLE 1197 0 0 10
+ 001198 ITP - DECK ID CODE TABLE 1198 0 0 10
+ 001199 DUP - DUPLICATE STATUS CODE TABLE 1199 0 0 4
+ 001201 GENERATING APPLICATION CODE TABLE 1201 0 0 8
+ 001205 SATELLITE IDENTIFIER CODE TABLE 1205 0 0 10
+ 001208 VELOCITY OF PLATFORM, X M/S 5 -1073741824 31
+ 001209 VELOCITY OF PLATFORM, Y M/S 5 -1073741824 31
+ 001210 VELOCITY OF PLATFORM, Z M/S 5 -1073741824 31
+ 002001 TYPE OF STATION CODE TABLE 002001 0 0 2
+ 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 002002 0 0 4
+ 002003 TYPE OF MEASURING EQUIPMENT USED CODE TABLE 002003 0 0 4
+ 002004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUREMENT CODE TABLE 002004 0 0 4
+ 002005 PRECISION OF TEMPERATURE OBSERVATION K 2 0 7
+ 002011 RADIOSONDE TYPE CODE TABLE 002011 0 0 8
+ 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 002012 0 0 4
+ 002013 SOLAR AND INFRARED RADIATION CORRECTION CODE TABLE 002013 0 0 4
+ 002014 TRACKING TECHNIQUE/STATUS OF SYSTEM USED CODE TABLE 002014 0 0 7
+ 002015 RADIOSONDE COMPLETENESS CODE TABLE 002015 0 0 4
+ 002019 SATELLITE INSTRUMENTS CODE TABLE 002019 0 0 11
+ 002020 SATELLITE CLASSIFICATION CODE TABLE 002020 0 0 9
+ 002021 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 002021 0 0 9
+ 002022 SATELLITE DATA PROCESSING TECHNIQUE USED FLAG TABLE 002022 0 0 8
+ 002023 SATELLITE DERIVED WIND COMPUTATION METHOD CODE TABLE 002023 0 0 4
+ 002024 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 002024 0 0 4
+ 002025 SATELLITE CHANNEL(S) USED IN COMPUTATION FLAG TABLE 002025 0 0 25
+ 002026 CROSS TRACK RESOLUTION M 2 0 12
+ 002027 ALONG TRACK RESOLUTION M 2 0 12
+ 002028 SEGMENT SIZE AT NADIR IN X DIRECTION M 0 0 18
+ 002029 SEGMENT SIZE AT NADIR IN Y DIRECTION M 0 0 18
+ 002030 METHOD OF CURRENT MEASUREMENT CODE TABLE 002030 0 0 3
+ 002031 DURATION AND TIME OF CURRENT MEASUREMENT CODE TABLE 002031 0 0 5
+ 002032 INDICATOR FOR DIGITIZATION CODE TABLE 002032 0 0 2
+ 002033 METHOD OF SALINITY/DEPTH MEASUREMENT CODE TABLE 002033 0 0 3
+ 002034 DROGUE TYPE CODE TABLE 002034 0 0 5
+ 002035 CABLE LENGTH M 0 0 9
+ 002036 BUOY TYPE CODE TABLE 002036 0 0 2
+ 002037 METHOD OF TIDAL OBSERVATION CODE TABLE 002037 0 0 3
+ 002038 METHOD OF SEA-SURFACE TEMPERATURE MEASUREMENT CODE TABLE 002038 0 0 4
+ 002039 METHOD OF WET-BULB TEMPERATURE MEASUREMENT CODE TABLE 002039 0 0 3
+ 002040 METHOD OF REMOVING VELOCITY AND MOTION OF PLATFORM FROM CURRENT CODE TABLE 002040 0 0 4
+ 002041 METHOD FOR ESTIMATING REPORTS RELATED TO SYNOPTIC FEATURES CODE TABLE 002041 0 0 6
+ 002044 INDICATOR FOR METHOD OF CALCULATING SPECTRAL WAVE DATA CODE TABLE 002044 0 0 4
+ 002045 INDICATOR FOR TYPE OF PLATFORM CODE TABLE 002045 0 0 4
+ 002046 WAVE MEASUREMENT INSTRUMENTATION CODE TABLE 002046 0 0 4
+ 002048 SATELLITE SENSOR INDICATOR CODE TABLE 002048 0 0 4
+ 002049 GEOSTATIONARY SATELLITE DATA-PROCESSING TECHNIQUE USED FLAG TABLE 002049 0 0 8
+ 002050 GEOSTATIONARY SOUNDER SATELLITE CHANNELS USED FLAG TABLE 002050 0 0 20
+ 002051 INDICATOR TO SPECIFY OBSERVING METHOD FOR EXTREME TEMPERATURES CODE TABLE 002051 0 0 4
+ 002052 GEOSTATIONARY IMAGER SATELLITE CHANNELS USED FLAG TABLE 002052 0 0 6
+ 002053 GOES-I/M BRIGHTNESS TEMPERATURE CHARACTERISTICS CODE TABLE 002053 0 0 4
+ 002054 GOES-I/M SOUNDINGS PARAMETER CHARACTERISTICS CODE TABLE 002054 0 0 4
+ 002055 GEOSTATIONARY SOUNDINGS STATISTICAL PARAMETERS CODE TABLE 002055 0 0 4
+ 002056 GEOSTATIONARY SOUNDINGS ACCURACY STATISTICS CODE TABLE 002056 0 0 4
+ 002057 ORIGIN OF FIRST GUESS INFORMATION CODE TABLE 002057 0 0 4
+ 002058 VALID TIMES OF FIRST GUESS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 002058 0 0 4
+ 002059 ORIGIN OF ANALYSIS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 002059 0 0 4
+ 002060 ORIGIN OF SURFACE INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 002060 0 0 4
+ 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 002061 0 0 3
+ 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 002062 0 0 4
+ 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16
+ 002064 AIRCRAFT ROLL ANGLE QUALITY CODE TABLE 002064 0 0 2
+ 002065 ACARS GROUND RECEIVING STATION CCITTIA5 0 0 40
+ 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 002070 0 0 4
+ 002091 ENTRY SENSOR 4/20 mA A 0 4 10
+ 002100 RADAR CONSTANT dB 1 0 12
+ 002101 TYPE OF ANTENNA CODE TABLE 002101 0 0 4
+ 002102 ANTENNA HEIGHT ABOVE TOWER BASE M 0 0 8
+ 002103 RADOME FLAG TABLE 002103 0 0 2
+ 002104 ANTENNA POLARISATION CODE TABLE 002104 0 0 4
+ 002105 MAXIMUM ANTENNA GAIN dB 0 0 6
+ 002106 3-dB BEAMWIDTH DEGREE 1 0 6
+ 002107 SIDELOBE SUPPRESSION dB 0 0 6
+ 002108 CROSSPOL DISCRIMINATION(ON AXIS) dB 0 0 6
+ 002109 ANTENNA SPEED (AZIMUTH) DEGREE/S 2 0 12
+ 002110 ANTENNA SPEED (ELEVATION) DEGREE/S 2 0 12
+ 002111 RADAR INCIDENCE ANGLE DEGREE 1 0 10
+ 002112 RADAR LOOK ANGLE DEGREE 1 0 12
+ 002113 NUMBER OF AZIMUTH LOOKS NUMERIC 0 0 4
+ 002114 ANTENNA EFFECTIVE SURFACE AREA M**2 0 0 15
+ 002116 PERCENTAGE OF 320 MHZ BAND PROCESSED % 0 0 7
+ 002117 PERCENTAGE OF 80 MHZ BAND PROCESSED % 0 0 7
+ 002118 PERCENTAGE OF 20 MHZ BAND PROCESSED % 0 0 7
+ 002119 RA-2 INSTRUMENT OPERATIONS CODE TABLE 002119 0 0 3
+ 002121 MEAN FREQUENCY Hz -8 0 7
+ 002122 FREQUENCY AGILITY RANGE Hz -6 -128 8
+ 002123 PEAK POWER W -4 0 7
+ 002124 AVERAGE POWER W -1 0 7
+ 002125 PULSE REPETITION FREQUENCY Hz -1 0 8
+ 002126 PULSE WIDTH S 7 0 6
+ 002127 RECEIVER INTERMEDIATE FREQUENCY Hz -6 0 7
+ 002128 INTERMEDIATE FREQUENCY BANDWIDTH Hz -5 0 6
+ 002129 MINIMUM DETECTABLE SIGNAL dB 0 -150 5
+ 002130 DYNAMIC RANGE dB 0 0 7
+ 002131 SENSITIVITY TIME CONTROL FLAG TABLE 002131 0 0 2
+ 002132 AZIMUTH POINTING ACCURACY DEGREE 2 0 6
+ 002133 ELEVATION POINTING ACCURACY DEGREE 2 0 6
+ 002134 ANTENNA BEAM AZIMUTH DEGREE 2 0 16
+ 002135 ANTENNA ELEVATION DEGREE 2 -9000 15
+ 002136 RANGE PROCESSED BY RANGE ATTENUATION CORRECTION M -3 0 16
+ 002140 SATELLITE RADAR BEAM AZIMUTH ANGLE DEGREE 0 0 9
+ 002141 MEASUREMENT TYPE CCITTIA5 0 0 24
+ 002142 OZONE INSTRUMENT SERIAL NUMBER/IDENTIFICATION CCITTIA5 0 0 32
+ 002143 OZONE INSTRUMENT TYPE CODE TABLE 002143 0 0 7
+ 002144 LIGHT SOURCE TYPE FOR BREWER SPECTROPHOTOMETER CODE TABLE 002144 0 0 4
+ 002145 WAVE LENGTH SETTING FOR DOBSON INSTRUMENTS CODE TABLE 002145 0 0 4
+ 002146 SOURCE CONDITIONS FOR DOBSON INSTRUMENTS CODE TABLE 002146 0 0 4
+ 002148 DATA COLLECTION AND/OR LOCATION SYSTEM CODE TABLE 002148 0 0 5
+ 002149 TYPE OF DATA BUOY CODE TABLE 002149 0 0 6
+ 002150 TOVS/ATOVS/AVHRR INSTRUMENTATION CHANNEL NUMBER CODE TABLE 002150 0 0 6
+ 002151 RADIOMETER IDENTIFIER CODE TABLE 002151 0 0 11
+ 002152 SATELLITE INSTRUMENT USED IN DATA PROCESSING FLAG TABLE 002152 0 0 31
+ 002153 SATELLITE CHANNEL CENTRE FREQUENCY Hz -8 0 26
+ 002154 SATELLITE CHANNEL BAND WIDTH Hz -8 0 26
+ 002156 PERCENTAGE OF VALID KU OCEAN RETRACKER MEASUREMENTS % 0 0 7
+ 002157 PERCENTAGE OF VALID S OCEAN RETRACKER MEASUREMENTS % 0 0 7
+ 002158 RA-2 INSTRUMENT FLAG TABLE 002158 0 0 9
+ 002159 MWR INSTRUMENT FLAG TABLE 002159 0 0 8
+ 002160 ASCENDING/DESCENDING ORBIT DESIGNATOR CODE TABLE 002160 0 0 2
+ 002163 HEIGHT ASSIGNMENT METHOD CODE TABLE 002163 0 0 4
+ 002164 TRACER CORRELATION METHOD CODE TABLE 002164 0 0 3
+ 002166 RADIANCE TYPE CODE TABLE 002166 0 0 4
+ 002167 RADIANCE COMPUTATIONAL METHOD CODE TABLE 002167 0 0 4
+ 002168 HYDROSTATIC PRESSURE OF LOWER END OF CABLE (THERMISTOR STRING) PA -3 0 16
+ 002169 ANEMOMETER TYPE CODE TABLE 002169 0 0 4
+ 002172 PRODUCT TYPE FOR RETRIEVED ATMOSPHERIC GASES CODE TABLE 002172 0 0 8
+ 002173 SQUARE OF THE OFF NADIR ANGLE DEGREE**2 4 0 10
+ 002174 MEAN ACROSS TRACK PIXEL NUMBER NUMERIC 0 0 9
+ 002175 METHOD OF PRECIPITATION MEASUREMENT CODE TABLE 002175 0 0 4
+ 002176 METHOD OF STATE OF GROUND MEASUREMENT CODE TABLE 002176 0 0 4
+ 002177 METHOD OF SNOW DEPTH MEASUREMENT CODE TABLE 002177 0 0 4
+ 002178 METHOD OF LIQUID CONTENT MEASUREMENT OF PRECIPITATION CODE TABLE 002178 0 0 4
+ 002179 TYPE OF SKY CONDITION ALGORITHM CODE TABLE 002179 0 0 4
+ 002180 MAIN PRESENT WEATHER DETECTING SYSTEM CODE TABLE 002180 0 0 4
+ 002181 SUPPLEMENTARY PRESENT WEATHER SENSOR FLAG TABLE 002181 0 0 21
+ 002182 VISIBILITY MEASUREMENT SYSTEM CODE TABLE 002182 0 0 4
+ 002183 CLOUD DETECTION SYSTEM CODE TABLE 002183 0 0 4
+ 002184 TYPE OF LIGHTNING DETECTION SENSOR CODE TABLE 002184 0 0 4
+ 002185 METHOD OF EVAPORATION MEASUREMENT CODE TABLE 002185 0 0 4
+ 002186 CAPABILITY TO DETECT PRECIPITATION PHENOMENA FLAG TABLE 002186 0 0 30
+ 002187 CAPABILITY TO DETECT OTHER WEATHER PHENOMENA FLAG TABLE 002187 0 0 18
+ 002188 CAPABILITY TO DETECT OBSCURATION FLAG TABLE 002188 0 0 21
+ 002189 CAPABILITY TO DISCRIMINATE LIGHTNING STRIKES FLAG TABLE 002189 0 0 12
+ 002190 LAGRANGIAN DRIFTER SUBMERGENCE (% TIME SUBMERGED) % 0 0 7
+ 002192 SAR AZIMUTH ANGLE DEGREE 0 0 9
+ 002193 1D VAR SATELLITE CHANNEL(S) USED FLAG TABLE 2193 0 0 28
+ 002194 CONSTANT LEVEL BALLOON TYPE CODE TABLE 2194 0 0 4
+ 002195 TYPE OF SATELLITE INSTRUMENTATION CODE TABLE 2195 0 0 4
+ 002196 SATELLITE CLASSIFICATION CODE TABLE 2196 0 0 9
+ 002197 SATELLITE CHANNEL CENTRE FREQUENCY Hz -8 0 26
+ 002198 SATELLITE CHANNEL BAND WIDTH Hz -8 0 26
+ 002199 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2199 0 0 4
+ 002201 SIMULATED SATELLITE INSTRUMENT FLAG TABLE 2201 0 0 4
+ 002202 SIMULATED DATA PROCESSING TECHNIQUE USED FLAG TABLE 2202 0 0 4
+ 002220 DATA PRODUCER CODE TABLE 2220 0 0 9
+ 002221 SEGMENT SIZE AT NADIR IN X DIRECTION M 0 0 18
+ 002222 SEGMENT SIZE AT NADIR IN Y DIRECTION M 0 0 18
+ 002223 TOVS/ATOVS/AVHRR CHANNEL NUMBER CODE TABLE 2223 0 0 6
+ 002231 HEIGHT ASSIGNMENT METHOD CODE TABLE 2231 0 0 4
+ 002232 TRACER CORRELATION METHOD CODE TABLE 2232 0 0 3
+ 002240 TYPE OF TERMODYNAMIC SENSING CODE TABLE 2240 0 0 8
+ 002241 TYPE OF ROCKET MOTOR CODE TABLE 2241 0 0 3
+ 002242 TYPE OF WIND SENSING EQUIPMENT CODE TABLE 2242 0 0 8
+ 002243 TERMODYNAMIC CORRECTION TECHNIQUE CODE TABLE 2243 0 0 3
+ 002244 WIND CORRECTION TECHNIQUE CODE TABLE 2244 0 0 3
+ 002245 METHOD OF REDUCING OF DATA CODE TABLE 2245 0 0 4
+ 002251 RADIANCE COMPUTATIONAL METHOD CODE TABLE 2251 0 0 4
+ 002252 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 2252 0 0 31
+ 002253 HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2253 0 0 8
+ 002254 RADIANCE TYPE CODE TABLE 2254 0 0 4
+ 004001 YEAR YEAR 0 0 12
+ 004002 MONTH MONTH 0 0 4
+ 004003 DAY DAY 0 0 6
+ 004004 HOUR HOUR 0 0 5
+ 004005 MINUTE MINUTE 0 0 6
+ 004006 SECOND SECOND 0 0 6
+ 004007 SECOND WITHIN MINUTE SECOND 6 0 26
+ 004011 TIME INCREMENT YEAR 0 -1024 11
+ 004012 TIME INCREMENT MONTH 0 -1024 11
+ 004013 TIME INCREMENT DAY 0 -1024 11
+ 004014 TIME INCREMENT HOUR 0 -1024 11
+ 004015 TIME INCREMENT MINUTE 0 -2048 12
+ 004016 TIME INCREMENT SECOND 0 -4096 13
+ 004017 REFERENCE TIME PERIOD FOR ACCUMULATED OR EXTREME DATA MINUTE 0 -1440 12
+ 004021 TIME PERIOD OR DISPLACEMENT YEAR 0 -1024 11
+ 004022 TIME PERIOD OR DISPLACEMENT MONTH 0 -1024 11
+ 004023 TIME PERIOD OR DISPLACEMENT DAY 0 -1024 11
+ 004024 TIME PERIOD OR DISPLACEMENT HOUR 0 -2048 12
+ 004025 TIME PERIOD OR DISPLACEMENT MINUTE 0 -2048 12
+ 004026 TIME PERIOD OR DISPLACEMENT SECOND 0 -4096 13
+ 004031 DURATION OF TIME RELATING TO FOLLOWING VALUE HOUR 0 0 8
+ 004032 DURATION OF TIME RELATING TO FOLLOWING VALUE MINUTE 0 0 6
+ 004041 TIME DIFFERENCE, UTC-LMT MINUTE 0 -1440 12
+ 004043 DAY OF THE YEAR DAY 0 0 9
+ 004051 PRINCIPAL TIME OF DAILY READING OF MAXIMUM TEMPERATURE HOUR 0 0 5
+ 004052 PRINCIPAL TIME OF DAILY READING OF MINIMUM TEMPERATURE HOUR 0 0 5
+ 004053 NUMBER OF DAYS WITH PRECIPITATION EQUAL TO OR MORE THAN 1 MM NUMERIC 0 0 6
+ 004065 SHORT TIME INCREMENT MINUTE 0 -128 8
+ 004073 SHORT TIME PERIOD OR DISPLACEMENT DAY 0 -128 8
+ 004074 SHORT TIME PERIOD OR DISPLACEMENT HOUR 0 -128 8
+ 004075 SHORT TIME PERIOD OR DISPLACEMENT MINUTE 0 -128 8
+ 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25
+ 005002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15
+ 005011 LATITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -9000000 25
+ 005012 LATITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -9000 15
+ 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16
+ 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16
+ 005030 DIRECTION (SPECTRAL) DEGREE 0 0 12
+ 005031 ROW NUMBER NUMERIC 0 0 12
+ 005033 PIXEL SIZE ON HORIZONTAL-1 M -1 0 16
+ 005034 ALONG TRACK ROW NUMBER NUMERIC 0 0 11
+ 005036 SHIP TRANSECT NUMBER ACCORDING TO SOOP NUMERIC 0 0 7
+ 005040 ORBIT NUMBER NUMERIC 0 0 24
+ 005041 SCAN LINE NUMBER NUMERIC 0 0 8
+ 005042 CHANNEL NUMBER NUMERIC 0 0 6
+ 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8
+ 005052 CHANNEL NUMBER INCREMENT NUMERIC 0 0 5
+ 005053 FIELD OF VIEW NUMBER INCREMENT NUMERIC 0 0 5
+ 005193 ALONG TRACK ROW NUMBER AT 50 KM NUMERIC 0 0 10
+ 005194 ALONG TRACK ROW NUMBER AT 25 KM NUMERIC 0 0 11
+ 005195 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 7
+ 005217 LOCATION OF PLATFORM, X M 2 -1073741824 31
+ 005232 DIRECTION (SPECTRAL) DEGREE 2 0 16
+ 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26
+ 006002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16
+ 006011 LONGITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -18000000 26
+ 006012 LONGITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -18000 16
+ 006021 DISTANCE M -1 0 13
+ 006030 WAVE NUMBER (SPECTRAL) RAD/M 5 0 13
+ 006031 COLUMN NUMBER NUMERIC 0 0 12
+ 006033 PIXEL SIZE ON HORIZONTAL-2 M -1 0 16
+ 006034 CROSS TRACK CELL NUMBER NUMERIC 0 0 7
+ 006040 RADIUS OF CONFIDENCE M 0 0 13
+ 006193 CROSS TRACK CELL NUMBER AT 50 KM NUMERIC 0 0 6
+ 006194 CROSS TRACK CELL NUMBER AT 25 KM NUMERIC 0 0 7
+ 006217 LOCATION OF PLATFORM, Y M 2 -1073741824 31
+ 006232 WAVENUMBER (SPECTRAL) RADS/M 5 0 13
+ 007001 HEIGHT OF STATION M 0 -400 15
+ 007002 HEIGHT OR ALTITUDE M -1 -40 16
+ 007003 GEOPOTENTIAL M**2/S**2 -1 -400 17
+ 007004 PRESSURE PA -1 0 14
+ 007005 HEIGHT INCREMENT M 0 -400 12
+ 007006 HEIGHT ABOVE STATION M 0 0 15
+ 007007 HEIGHT M 0 -1000 17
+ 007008 GEOPOTENTIAL M**2/S**2 0 -10000 20
+ 007009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17
+ 007010 FLIGHT LEVEL M 0 -1024 16
+ 007021 ELEVATION DEGREE 2 -9000 15
+ 007022 SOLAR ELEVATION DEGREE 2 -9000 15
+ 007024 SATELLITE ZENITH ANGLE DEGREE 2 -9000 15
+ 007025 SOLAR ZENITH ANGLE DEGREE 2 -9000 15
+ 007030 HEIGHT OF STATION GROUND ABOVE MEAN SEA LEVEL M 1 -4000 17
+ 007031 HEIGHT OF BAROMETER ABOVE MEAN SEA LEVEL M 1 -4000 17
+ 007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND ( OR DECK OF MARINE PLATFORM M 2 0 16
+ 007033 HEIGHT OF SENSOR ABOVE WATER SURFACE M 1 0 12
+ 007061 DEPTH BELOW LAND SURFACE M 2 0 14
+ 007062 DEPTH BELOW SEA/WATER SURFACE M 1 0 17
+ 007064 HEIGHT ABOVE STATION (SENSOR HEIGHT ARTIFICIALLY CORRECTED) (SEE M 0 0 4
+ 007070 DROGUE DEPTH M 0 0 10
+ 007190 HEIGHT INCREMENT M 1 -1024 12
+ 007217 LOCATION OF PLATFORM, Z M 2 -1073741824 31
+ 008001 VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 008001 0 0 7
+ 008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS) CODE TABLE 008002 0 0 6
+ 008003 VERTICAL SIGNIFICANCE (SATELLITE OBSERVATIONS) CODE TABLE 008003 0 0 6
+ 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 008004 0 0 3
+ 008005 METEOROLOGICAL ATTRIBUTE SIGNIFICANCE CODE TABLE 008005 0 0 4
+ 008006 OZONE VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 008006 0 0 9
+ 008007 DIMENSIONAL SIGNIFICANCE CODE TABLE 008007 0 0 4
+ 008008 RADIATION VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 008008 0 0 9
+ 008009 DETAILED PHASE OF FLIGHT CODE TABLE 008009 0 0 4
+ 008010 SURFACE QUALIFIER (TEMPERATURE DATA) CODE TABLE 008010 0 0 5
+ 008011 METEOROLOGICAL FEATURE CODE TABLE 008011 0 0 6
+ 008012 LAND/SEA QUALIFIER CODE TABLE 008012 0 0 2
+ 008013 DAY/NIGHT QUALIFIER CODE TABLE 008013 0 0 2
+ 008014 QUALIFIER FOR RUNWAY VISUAL RANGE CODE TABLE 008014 0 0 4
+ 008016 CHANGE QUALIFIER OF A TREND-TYPE FORECAST OR AN AERODROME FORECA CODE TABLE 008016 0 0 3
+ 008017 QUALIFIER OF THE TIME WHEN THE FORECAST CHANGE IS EXPECTED CODE TABLE 008017 0 0 2
+ 008018 SEAWINDS LAND/ICE SURFACE TYPE FLAG TABLE 008018 0 0 17
+ 008019 QUALIFIER FOR FOLLOWING CENTRE IDENTIFIER CODE TABLE 008019 0 0 4
+ 008020 TOTAL NUMBER OF MISSING ENTITIES (WITH RESPECT TO ACCUMULATION O NUMERIC 0 0 16
+ 008021 TIME SIGNIFICANCE CODE TABLE 008021 0 0 5
+ 008022 TOTAL NUMBER(WITH RESPECT TO ACCUMULATION OR AVERAGE) NUMERIC 0 0 16
+ 008023 FIRST ORDER STATISTICS CODE TABLE 008023 0 0 6
+ 008024 DIFFERENCE STATISTICS CODE TABLE 008024 0 0 6
+ 008025 TIME DIFFERENCE QUALIFIER CODE TABLE 008025 0 0 4
+ 008029 REMOTELY SENSED SURFACE TYPE CODE TABLE 008029 0 0 8
+ 008030 MANUAL ON CODES (VOLUME I.1 SECTION C CODE TABLE FROM WHICH DATA NUMERIC 0 0 13
+ 008031 DATA CATEGORY CREX TABLE A NUMERIC 0 0 8
+ 008033 METHOD OF DERIVATION OF PERCENTAGE CONFIDENCE CODE TABLE 008033 0 0 7
+ 008035 TYPE OF MONITORING EXERCISE CODE TABLE 008035 0 0 3
+ 008036 TYPE OF CENTRE OR STATION PERFORMING MONITORING CODE TABLE 008036 0 0 3
+ 008050 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 008050 0 0 4
+ 008051 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 008051 0 0 3
+ 008052 CONDITION FOR WHICH NUMBER OF DAYS OF OCCURRENCE FOLLOWS CODE TABLE 008052 0 0 5
+ 008053 DAY OF OCCURRENCE QUALIFIER CODE TABLE 008053 0 0 2
+ 008059 TIMES OF OBSERVATION USED TO COMPUTE THE REPORTED MEAN VALUES FLAG TABLE 008059 0 0 6
+ 008060 SAMPLE SCANNING MODE SIGNIFICANCE CODE TABLE 008060 0 0 4
+ 008070 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 008070 0 0 4
+ 008072 PIXEL(S) TYPE CODE TABLE 008072 0 0 3
+ 008074 ALTIMETER ECHO TYPE CODE TABLE 008074 0 0 2
+ 008075 ASCENDING/DESCENDING ORBIT QUALIFIER CODE TABLE 008075 0 0 2
+ 008076 TYPE OF BAND CODE TABLE 008076 0 0 6
+ 008080 QUALIFIER FOR GTSSPP QUALITY FLAG CODE TABLE 008080 0 0 6
+ 008081 TYPE OF EQUIPMENT CODE TABLE 8081 0 0 6
+ 008082 ARTIFICIAL CORRECTION OF SENSOR HEIGHT TO ANOTHER VALUE CODE TABLE 8082 0 0 3
+ 008193 TIME QUALIFIER CODE TABLE 8193 0 0 6
+ 008194 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8194 0 0 4
+ 008195 DATA TYPE CODE TABLE 8195 0 0 7
+ 008200 NUMBER OF OBSERVATIONS NUMERIC 0 0 8
+ 008222 GENERATOR SIGNIFICANCE CODE TABLE 8222 0 0 4
+ 008223 LAND/ICE SURFACE FLAG FLAG TABLE 8223 0 0 7
+ 008224 LAND/SEA FRACTION NUMERIC 3 0 10
+ 010001 HEIGHT OF LAND SURFACE M 0 -400 15
+ 010002 HEIGHT M -1 -40 16
+ 010003 GEOPOTENTIAL M**2/S**2 -1 -400 17
+ 010004 PRESSURE PA -1 0 14
+ 010007 HEIGHT M 0 -1000 17
+ 010008 GEOPOTENTIAL M**2/S**2 0 -10000 20
+ 010009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17
+ 010010 MINIMUM PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14
+ 010011 MAXIMUM PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14
+ 010031 IN DIRECTION OF THE NORTH POLE, DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31
+ 010032 SATELLITE DISTANCE TO EARTH CENTRE M 1 0 27
+ 010033 ALTITUDE (PLATFORM TO ELLIPSOID) M 1 0 27
+ 010034 EARTH RADIUS M 1 0 27
+ 010040 NUMBER OF RETRIEVED LAYERS NUMERIC 0 0 10
+ 010050 STANDARD DEVIATION ALTITUDE M 2 0 16
+ 010051 PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14
+ 010052 ALTIMETER SETTING (QNH) PA -1 0 14
+ 010060 PRESSURE CHANGE PA -1 -1024 11
+ 010061 3 HOUR PRESSURE CHANGE PA -1 -500 10
+ 010062 24 HOUR PRESSURE CHANGE PA -1 -1000 11
+ 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 010063 0 0 4
+ 010064 SIGMET CRUISING LEVEL CODE TABLE 010064 0 0 3
+ 010070 INDICATED AIRCRAFT ALTITUDE M 0 -400 16
+ 010080 VIEWING ZENITH ANGLE DEGREE 2 -9000 15
+ 010081 ALTITUDE OF COG ABOVE REFERENCE ELLIPSOID M 3 0 31
+ 010082 INSTANTANEOUS ALTITUDE RATE M/S 3 -65536 17
+ 010083 SQUARED OFF NADIR ANGLE OF THE SATELLITE FROM PLATFORM DATA DEGREE**2 2 0 16
+ 010084 SQUARED OFF NADIR ANGLE OF THE SATELLITE FROM WAVEFORM DATA DEGREE**2 2 0 16
+ 010085 MEAN SEA SURFACE HEIGHT M 3 -131072 18
+ 010086 GEOID HEIGHT M 3 -131072 18
+ 010087 OCEAN DEPTH/LAND ELEVATION M 1 -131072 18
+ 010088 TOTAL GEOCENTRIC OCEAN TIDE HEIGHT SOLUTION 1 M 3 -32768 16
+ 010089 TOTAL GEOCENTRIC OCEAN TIDE HEIGHT SOLUTION 2 M 3 -32768 16
+ 010090 LONG PERIOD TIDE HEIGHT M 3 -32768 16
+ 010091 TIDAL LOADING HEIGHT M 3 -32768 16
+ 010092 SOLID EARTH TIDE HEIGHT M 3 -32768 16
+ 010093 GEOCENTRIC POLE TIDE HEIGHT M 3 -32768 16
+ 010195 HEIGHT(HIGH ACCURACY) M 1 -4096 20
+ 010196 SOLAR ZENITH ANGLE DEGREE 2 -9000 15
+ 010197 ANEMOMETER HEIGHT M 0 0 9
+ 011001 WIND DIRECTION DEGREE TRUE 0 0 9
+ 011002 WIND SPEED M/S 1 0 12
+ 011003 U-COMPONENT M/S 1 -4096 13
+ 011004 V-COMPONENT M/S 1 -4096 13
+ 011005 W-COMPONENT PA/S 1 -512 10
+ 011006 W-COMPONENT M/S 2 -4096 13
+ 011010 WIND DIRECTION ASSOCIATED WITH WIND SPEED WHICH FOLLOWS DEGREE TRUE 0 0 9
+ 011011 WIND DIRECTION AT 10 M DEGREE TRUE 0 0 9
+ 011012 WIND SPEED AT 10 M M/S 1 0 12
+ 011013 WIND DIRECTION AT 5 M DEGREE TRUE 0 0 9
+ 011014 WIND SPEED AT 5 M M/S 1 0 12
+ 011016 EXTREME COUNTERCLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9
+ 011017 EXTREME CLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9
+ 011019 STEADINESS OF WIND % 0 0 7
+ 011021 RELATIVE VORTICITY 1/S 9 -65536 17
+ 011022 DIVERGENCE 1/S 9 -65536 17
+ 011023 VELOCITY POTENTIAL M**2/S -2 -65536 17
+ 011031 DEGREE OF TURBULENCE CODE TABLE 011031 0 0 4
+ 011032 HEIGHT OF BASE OF TURBULENCE M -1 -40 16
+ 011033 HEIGHT OF TOP OF TURBULENCE M -1 -40 16
+ 011034 VERTICAL GUST VELOCITY M/S 1 -1024 11
+ 011035 VERTICAL GUST ACCELERATION M/S**2 2 -8192 14
+ 011036 MAXIMUM DERIVED EQUIVALENT VERTICAL GUST SPEED M/S 1 0 10
+ 011037 TURBULENT INDEX CODE TABLE 011037 0 0 6
+ 011038 TIME OF OCCURANCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 011038 0 0 5
+ 011039 EXTENDED TIME OF OCCURENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 011039 0 0 6
+ 011040 MAXIMUM WIND SPEED (MEAN WIND) M/S 1 0 12
+ 011041 MAXIMUM WIND SPEED (GUSTS) M/S 1 0 12
+ 011042 MAXIMUM WIND SPEED (10 MIN MEAN WIND) M/S 1 0 12
+ 011043 MAXIMUM WIND GUST DIRECTION DEGREE TRUE 0 0 9
+ 011044 MEAN WIND DIRECTION FOR SURFACE - 1500 M (5000 FEET) DEGREE TRUE 0 0 9
+ 011045 MEAN WIND SPEED FOR SURFACE - 1500 M (5000 FEET) M/S 1 0 12
+ 011046 MAXIMUM INSTANTANEOUS WIND SPEED M/S 1 0 12
+ 011047 MAXIMUM INSTANTANEOUS WIND SPEED OVER 10 MINUTES M/S 1 0 12
+ 011049 STANDARD DEVIATION OF WIND DIRECTION DEGREE TRUE 0 0 9
+ 011050 STANDARD DEVIATION OF HORIZONTAL WIND SPEED M/S 1 0 12
+ 011051 STANDARD DEVIATION OF VERTICAL WIND SPEED M/S 1 0 8
+ 011052 FORMAL UNCERTAINTY IN WIND SPEED M/S 2 0 13
+ 011053 FORMAL UNCERTAINTY IN WIND DIRECTION DEGREE TRUE 2 0 15
+ 011061 ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW M/S 1 0 12
+ 011062 ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE M/S 1 0 12
+ 011070 DESIGNATOR OF THE RUNWAY AFFECTED BY WIND SHEAR (INCLUDING ALL) CCITTIA5 0 0 32
+ 011071 TURBULENT VERTICAL MOMENTUM FLUX M**2/S**2 3 -128 14
+ 011072 TURBULENT VERTICAL BUOYANCY FLUX KM/S 3 -128 11
+ 011073 TURBULENT KINETIC ENERGY M**2/S**2 2 -1024 13
+ 011074 DISSIPATION ENERGY M**2/S**2 2 -1024 10
+ 011075 MEAN TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8
+ 011076 PEAK TURBULENCE INTENSITY (EDDY DISSIPATION RATE) m**(2/3)/S 2 0 8
+ 011077 REPORTING INTERVAL OR AVERAGING TIME FOR EDDY DISSIPATION RATE SECOND 0 0 12
+ 011081 MODEL WIND DIRECTION AT 10M DEGREE TRUE 2 0 16
+ 011082 MODEL WIND SPEED AT 10M M/S 2 0 14
+ 011095 U COMPONENT OF THE MODEL WIND VECTOR M/S 1 -4096 13
+ 011096 V COMPONENT OF THE MODEL WIND VECTOR M/S 1 -4096 13
+ 011192 U - COMPONENT AT 10 M M/S 1 -4096 13
+ 011193 V - COMPONENT AT 10 M M/S 1 -4096 13
+ 011194 W - COMPONENT AT 10 M M/S 1 -4096 13
+ 011195 STEADINESS OF WIND % 0 0 7
+ 011196 FRICTION VELOCITY M/S 5 0 19
+ 011201 HORIZONTAL LINE OF SIGHT COMPONENT M/S 1 -4096 13
+ 011210 1D VAR WIND SPEED RETREIVED ERRO(S) M/S 2 0 12
+ 011211 WIND SPEED INDEPENDENT ESTIMATE OF ERROR(S) M/S 2 0 12
+ 011220 FORMAL UNCERTAINTY IN WIND SPEED M/S 2 0 12
+ 011221 FORMAL UNCERTAINTY IN WIND DIRECTION DEGREE TRUE 2 0 15
+ 011230 MAXIMUM MEAN WIND SPEED M/S 1 -4096 13
+ 011231 MEAN WIND SPEED M/S 1 -4096 13
+ 011232 MINIMUM MEAN WIND SPEED M/S 1 -4096 13
+ 011233 HIGHEST GUST DURING THE 10 MINUTE PERIOD PRECEDING OBSERVATION M/S 1 -4096 13
+ 012001 TEMPERATURE/DRY BULB TEMPERATURE K 1 0 12
+ 012002 WET BULB TEMPERATURE K 1 0 12
+ 012003 DEW POINT TEMPERATURE K 1 0 12
+ 012004 DRY BULB TEMPERATURE AT 2M K 1 0 12
+ 012005 WET BULB TEMPERATURE AT 2M K 1 0 12
+ 012006 DEW POINT TEMPERATURE AT 2M K 1 0 12
+ 012007 VIRTUAL TEMPERATURE K 1 0 12
+ 012011 MAXIMUM TEMPERATURE,AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12
+ 012012 MINIMUM TEMPERATURE,AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12
+ 012013 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS K 1 0 12
+ 012014 MAXIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 1 0 12
+ 012015 MINIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 1 0 12
+ 012016 MAXIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 1 0 12
+ 012017 MINIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 1 0 12
+ 012021 MAXIMUM TEMPERATURE AT 2M K 2 0 16
+ 012022 MINIMUM TEMPERATURE AT 2M K 2 0 16
+ 012030 SOIL TEMPERATURE K 1 0 12
+ 012051 STANDARD DEVIATION TEMPERATURE K 1 0 10
+ 012052 HIGHEST DAILY MEAN TEMPERATURE K 1 0 12
+ 012053 LOWEST DAILY MEAN TEMPERATURE K 1 0 12
+ 012061 SKIN TEMPERATURE K 1 0 12
+ 012062 EQUIVALENT BLACK BODY TEMPERATURE K 1 0 12
+ 012063 BRIGHTNESS TEMPERATURE K 1 0 12
+ 012064 INSTRUMENT TEMPERATURE K 1 0 12
+ 012065 STANDARD DEVIATION BRIGHTNESS TEMPERATURE K 1 0 12
+ 012070 WARM LOAD TEMPERATURE K 2 0 16
+ 012071 COLDEST CLUSTER TEMPERATURE K 1 0 12
+ 012072 RADIANCE WM**(-2)SR**(-1) 6 0 31
+ 012073 TEMPERATURE K 2 0 16
+ 012075 SPECTRAL RADIANCE WM**(-3)SR**(-1) -3 0 16
+ 012076 RADIANCE WM**(-2)SR**(-1) 3 0 16
+ 012101 TEMPERATURE/DRY BULB TEMPERATURE K 2 0 16
+ 012102 WET BULB TEMPERATURE K 2 0 16
+ 012103 DEW POINT TEMPERATURE K 2 0 16
+ 012104 DRY BULB TEMPERATURE AT 2M K 2 0 16
+ 012105 WET BULB TEMPERATURE AT 2M K 2 0 16
+ 012106 DEW POINT TEMPERATURE AT 2M K 2 0 16
+ 012107 VIRTUAL TEMPERATURE K 2 0 16
+ 012111 MAXIMUM TEMPERATURE,AT HEIGHT AND OVER PERIOD SPECIFIED K 2 0 16
+ 012112 MINIMUM TEMPERATURE,AT HEIGHT AND OVER PERIOD SPECIFIED K 2 0 16
+ 012113 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS K 2 0 16
+ 012114 MAXIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 2 0 16
+ 012115 MINIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 2 0 16
+ 012116 MAXIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 2 0 16
+ 012117 MINIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 2 0 16
+ 012118 MAXIMUM TEMPERATURE AT HEIGHT SPECIFIED PAST 24 HOURS K 2 0 16
+ 012119 MINIMUM TEMPERATURE AT HEIGHT SPECIFIED PAST 24 HOURS K 2 0 16
+ 012130 SOIL TEMPERATURE K 2 0 16
+ 012151 STANDARD DEVIATION OF DAILY MEAN TEMPERATURE K 2 0 12
+ 012152 HIGHEST DAILY MEAN TEMPERATURE K 2 0 16
+ 012153 LOWEST DAILY MEAN TEMPERATURE K 2 0 16
+ 012161 SKIN TEMPERATURE K 2 0 16
+ 012162 EQUIVALENT BLACK BODY TEMPERATURE K 2 0 16
+ 012163 BRIGHTNESS TEMPERATURE K 2 0 16
+ 012164 INSTRUMENT TEMPERATURE K 2 0 16
+ 012171 COLDEST CLUSTER TEMPERATURE K 2 0 16
+ 012180 AVERAGED 12 MICRON BT for ALL CLEAR PIXELS AT NADIR K 2 0 16
+ 012181 AVERAGED 11 MICRON BT for ALL CLEAR PIXELS AT NADIR K 2 0 16
+ 012182 AVERAGED 3.7 MICRON BT for ALL CLEAR PIXELS AT NADIR K 2 0 16
+ 012183 AVERAGED 12 MICRON BT for ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16
+ 012184 AVERAGED 11 MICRON BT for ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16
+ 012185 AVERAGED 3.7 MICRON BT for ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16
+ 012186 MEAN NADIR SEA SURFACE TEMPERATURE K 2 0 16
+ 012187 MEAN DUAL VIEW SEA SURFACE TEMPERATURE K 2 0 16
+ 012188 INTERPOLATED 23.8 GHZ BRIGHTNESS T FROM MWR K 2 0 16
+ 012189 INTERPOLATED 36.5 GHZ BRIGHTNESS T FROM MWR K 2 0 16
+ 012193 COLDEST CLUSTER TEMPERATURE K 1 0 12
+ 012194 RADIANCE W/M**2*STER*M**(-1) 6 0 31
+ 012195 SPECTRAL RADIANCE W/M**2*STER*M**(-1) 10 0 31
+ 012196 RADIANCE W/M**2*STER 3 0 16
+ 012197 MAXIMUM TEMPERATURE AT 2M, PAST 3 HOURS K 1 0 12
+ 012198 MINIMUM TEMPERATURE AT 2M, PAST 3 HOURS K 1 0 12
+ 012199 MAXIMUM TEMPERATURE AT 2M, PAST 6 HOURS K 1 0 12
+ 012200 MINIMUM TEMPERATURE AT 2M, PAST 6 HOURS K 1 0 12
+ 013001 SPECIFIC HUMIDITY KG/KG 5 0 14
+ 013002 MIXING RATIO KG/KG 5 0 14
+ 013003 RELATIVE HUMIDITY % 0 0 7
+ 013004 VAPOUR PRESSURE PA -1 0 10
+ 013005 VAPOUR DENSITY KG/M**3 3 0 7
+ 013006 MIXING HEIGHT M -1 -40 16
+ 013007 MINIMUM RELATIVE HUMIDITY % 0 0 7
+ 013008 MAXIMUM RELATIVE HUMIDITY % 0 0 7
+ 013011 TOTAL PRECIPITATION/TOTAL WATER EQUIVALENT KG/M**2 1 -1 14
+ 013012 DEPTH OF FRESH SNOW M 2 -2 12
+ 013013 TOTAL SNOW DEPTH M 2 -2 16
+ 013014 RAINFALL/WATER EQUIVALENT OF SNOW (AVERAGE RATE) KG/(M**2)S 4 0 12
+ 013015 SNOWFALL (AVERAGE RATE) M/S 7 0 12
+ 013016 PRECIPITABLE WATER KG/M**2 0 0 7
+ 013019 TOTAL PRECIPITATION PAST 1 HOUR KG/M**2 1 -1 14
+ 013020 TOTAL PRECIPITATION PAST 3 HOURS KG/M**2 1 -1 14
+ 013021 TOTAL PRECIPITATION PAST 6 HOURS KG/M**2 1 -1 14
+ 013022 TOTAL PRECIPITATION PAST 12 HOURS KG/M**2 1 -1 14
+ 013023 TOTAL PRECIPITATION PAST 24 HOURS KG/M**2 1 -1 14
+ 013031 EVAPOTRANSPIRATION KG/M**2 0 0 7
+ 013032 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 8
+ 013033 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 10
+ 013038 SUPERADIABATIC INDICATOR CODE TABLE 013038 0 0 2
+ 013039 TERRAIN TYPE (ICE/SNOW) CODE TABLE 013039 0 0 3
+ 013040 SURFACE FLAG CODE TABLE 013040 0 0 4
+ 013041 PASQUILL-GIFFORD STABILITY CATEGORY CODE TABLE 013041 0 0 4
+ 013042 PARCEL LIFTED INDEX (TO 500 hPa) K 0 -20 6
+ 013043 BEST LIFTED INDEX (TO 500 hPa) K 0 -20 6
+ 013051 FREQUENCY GROUP, PRECIPITATION CODE TABLE 013051 0 0 4
+ 013052 HIGHEST DAILY AMOUNT OF PRECIPITATION KG/M**2 1 -1 14
+ 013055 INTENSITY OF PRECIPITATION KG/(M**2)S 4 0 8
+ 013058 SIZE OF PRECIPITATING ELEMENT M 4 0 7
+ 013059 NUMBER OF FLASHES (THUNDERSTORM) NUMERIC 0 0 7
+ 013060 TOTAL ACCUMULATED PRECIPITATION KG/M**2 1 -10 17
+ 013071 UPSTREAM WATER LEVEL M 2 0 14
+ 013072 DOWNSTREAM WATER LEVEL M 2 0 14
+ 013073 MAXIMUM WATER LEVEL M 2 0 14
+ 013080 WATER PH pH 1 0 10
+ 013081 WATER CONDUCTIVITY SIEMENS/M 3 0 14
+ 013082 WATER TEMPERATURE K 1 0 12
+ 013083 DISSOLVED OXYGEN KG/M**3 6 0 15
+ 013084 TURBIDITY LUMEN 0 0 14
+ 013085 OXYDATION REDUCTION POTENTIAL (ORP) V 3 0 14
+ 013090 RADIOMETER WATER VAPOUR CONTENT KG/M**2 1 0 10
+ 013091 RADIOMETER LIQUID CONTENT KG/M**2 2 0 8
+ 013093 CLOUD OPTICAL THICKNESS NUMERIC 0 0 8
+ 013095 TOTAL COLUMN WATER VAPOUR KG/M**2 4 0 19
+ 013096 MWR WATER VAPOUR CONTENT KG/M**2 2 0 14
+ 013097 MWR LIQUID WATER CONTENT KG/M**2 2 0 14
+ 013098 INTEGRATED WATER VAPOUR DENSITY KG/M**2 8 0 30
+ 013192 RELATIVE HUMIDITY AT 2 M % 0 0 8
+ 013193 RELATIVE HUMIDITY % 0 0 8
+ 013194 TOTAL COLUMN WATER KG/M**2 2 0 11
+ 013195 RAIN RATE KG/M**2HOUR 0 0 5
+ 013196 ANTECEDENT PRECIPITATION INDEX KG/M**2 0 0 7
+ 013197 TOTAL COLUMN WATER VAPOUR KG/M**2 1 0 10
+ 013198 RAIN FLAG CODE TABLE 13198 0 0 3
+ 013199 SPECIFIC HUMIDITY AT 2 M KG/KG 5 0 14
+ 013201 CLOUD LIQUID WATER KG/KG 7 0 14
+ 013202 TYPE OF SURFACE CODE TABLE 13202 0 0 8
+ 013203 1D VAR ESTIMATE OF RAIN RATE KG/M**2*HOUR 2 0 12
+ 013204 SSMI INDEPENDENT ESTIMATE OF RAIN RATE KG/M**2*HOUR 2 0 12
+ 013205 CLOUD LIQUID WATER PATH KG/M**2 4 0 14
+ 013206 TOTAL PRECIPITATION ICE CONTENT KG/M**2 6 0 14
+ 013207 TOTAL CLOUD LIQUID WATER KG/M**2 6 0 14
+ 013208 SURFACE RAIN RATE ( INSTANTANEOUS ) KG/M**2*S 5 0 17
+ 013209 RAIN POSSIBILITY NUMERIC 0 -256 9
+ 013210 1D VAR CLOUD LIQUID WATER PATH RETRIEVED ERROR(S) KG/M**2 4 0 14
+ 013211 TOTAL PRECIPITABLE WATER INDIPENDENT ESTIMATE OF ERROR(S) KG/M**2 2 0 11
+ 013212 CLOUD LIQUID WATER PATH INDIPENDENT ESTIMATE OF ERROR(S) KG/M**2 4 0 14
+ 013230 CONVECTIVE PRECIPITATION KG/M**2 1 -1 14
+ 013231 LARGE SCALE PRECIPITATION KG/M**2 1 -1 14
+ 013233 FRACTION OF TOTAL PRECIPITATION IN SOLID FORM (SNOW) M 4 0 18
+ 013240 AIR DENSITY KG/M**3 3 0 10
+ 014001 LONG-WAVE RADIATION,INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12
+ 014002 LONG-WAVE RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12
+ 014003 SHORT-WAVE RADIATION,INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12
+ 014004 SHORT-WAVE RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12
+ 014011 NET LONG-WAVE RADIATION,INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12
+ 014012 NET LONG-WAVE RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12
+ 014013 NET SHORT-WAVE RADIATION,INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12
+ 014014 NET SHORT-WAVE RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12
+ 014015 NET RADIATION INTEGRATED OVER 24HOURS J/M**2 -4 -16384 15
+ 014016 NET RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 -16384 15
+ 014017 INSTANTANEOUS LONG-WAVE RADIATION J/M**2 -3 -2048 12
+ 014018 INSTANTANEOUS SHORT-WAVE RADIATION J/M**2 -3 -2048 12
+ 014019 SURFACE ALBEDO % 0 0 7
+ 014020 GLOBAL SOLAR RADIATION INTEGRATED OVER 24 HOURS J/M**2 -4 0 15
+ 014021 GLOBAL RADIATION INTEGRATED OVERPERIOD SPECIFIED J/M**2 -4 0 15
+ 014022 DIFFUSE SOLAR RADIATION INTEGRATED OVER 24 HOURS J/M**2 -4 0 15
+ 014023 DIFFUSE SOLAR RADIATION INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15
+ 014024 DIRECT SOLAR RADIATION INTEGRATED OVER 24 HOURS J/M**2 -4 0 15
+ 014025 DIRECT SOLAR RADIATION INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15
+ 014026 ALBEDO AT THE TOP OF CLOUD % 0 0 7
+ 014027 ALBEDO % 0 0 7
+ 014028 GLOBAL SOLAR RADIATION INTEGRATED OVERPERIOD SPECIFIED J/M**2 -2 0 16
+ 014029 DIFFUSE SOLAR RADIATION INTEGRATED OVERPERIOD SPECIFIED J/M**2 -2 0 16
+ 014030 DIRECT SOLAR RADIATION INTEGRATED OVERPERIOD SPECIFIED J/M**2 -2 0 16
+ 014031 TOTAL SUNSHINE MINUTE 0 0 11
+ 014032 TOTAL SUNSHINE HOUR 0 0 10
+ 014033 TOTAL SUNSHINE % 0 0 9
+ 014034 SUNSHINE OVER PERIOD SPECIFIED MINUTE 0 0 11
+ 014042 BIDIRECTIONAL REFLECTANCE % 0 0 7
+ 014045 CHANNEL RADIANCE (W/M**2)*(1/SR)*CM 0 0 11
+ 014050 EMISSIVITY % 1 0 10
+ 014051 DIRECT SOLAR RADIATION INTEGRATED OVER LAST HOUR J/M**2 -3 0 14
+ 014055 SOLAR ACTIVITY INDEX NUMERIC 0 -32768 16
+ 015001 OZONE DOBSON 0 0 10
+ 015002 AIR MASS (SLANT PATH AT 22 KM) NUMERIC 2 0 10
+ 015003 MEASURED OZONE PARTIAL PRESSURE (SOUNDING) PA 4 0 9
+ 015004 OZONE SOUNDING CORRECTION FACTOR NUMERIC 3 0 11
+ 015005 OZONE P DU 0 0 10
+ 015011 LOG 10 OF INTEGRATED ELECTRON DENSITY LOG(1/M**2) 3 14000 13
+ 015015 MAXIMUM IMAGE SPECTRAL COMPONENT BEFORE NORMALIZATION NUMERIC 0 0 31
+ 015020 INTEGRATED OZONE DENSITY KG/M**2 8 0 21
+ 015031 ATMOSPHERIC PATH DELAY IN SATELLITE SIGNAL M 4 10000 15
+ 015032 ESTIMATED ERROR IN ATMOSPHERIC PATH DELAY M 4 0 10
+ 015033 DIFFERENCE IN PATH DELAYS FOR LIMB VIEWS AT EXTREME OF SCAN M 5 -10000 15
+ 015034 ESTIMATED ERROR IN PATH DELAY DIFFERENCE M 5 0 14
+ 015035 COMPONENT OF ZENITH PATH DELAY DUE TO WATER VAPOUR M 4 0 14
+ 015202 INTEGRATED ELECTRON DENSITY 1/M**2 3 13000 12
+ 019001 TYPE OF SYNOPTIC FEATURE CODE TABLE 019001 0 0 6
+ 019002 EFFECTIVE RADIUS OF FEATURE M -2 0 12
+ 019003 WIND SPEED THRESHOLD M/S 0 0 8
+ 019004 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD M -2 0 12
+ 019005 DIRECTION OF MOTION OF FEATURE DEGREE TRUE 0 0 9
+ 019006 SPEED OF MOTION OF FEATURE M/S 2 0 14
+ 019007 EFFECTIVE RADIUS OF FEATURE M -3 0 12
+ 019008 VERTICAL EXTENT OF CIRCULATION CODE TABLE 019008 0 0 3
+ 019009 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD M -3 0 12
+ 019010 METHOD FOR TRACKING THE CENTRE OF SYNOPTIC FEATURE CODE TABLE 019010 0 0 4
+ 020001 HORIZONTAL VISIBILITY M -1 0 13
+ 020002 VERTICAL VISIBILITY M -1 0 7
+ 020003 PRESENT WEATHER CODE TABLE 020003 0 0 9
+ 020004 PAST WEATHER (1) CODE TABLE 020004 0 0 5
+ 020005 PAST WEATHER (2) CODE TABLE 020005 0 0 5
+ 020008 CLOUD DISTRIBUTION FOR AVIATION CODE TABLE 020008 0 0 5
+ 020009 GENERAL WEATHER INDICATOR (TAF/METAR) CODE TABLE 020009 0 0 4
+ 020010 CLOUD COVER (TOTAL) % 0 0 7
+ 020011 CLOUD AMOUNT CODE TABLE 020011 0 0 4
+ 020012 CLOUD TYPE CODE TABLE 020012 0 0 6
+ 020013 HEIGHT OF BASE OF CLOUD M -1 -40 11
+ 020014 HEIGHT OF TOP OF CLOUD M -1 -40 11
+ 020015 PRESSURE AT BASE OF CLOUD PA -1 0 14
+ 020016 PRESSURE AT TOP OF CLOUD PA -1 0 14
+ 020017 CLOUD TOP DESCRIPTION CODE TABLE 020017 0 0 4
+ 020018 TENDENCY OF RUNWAY VISUAL RANGE CODE TABLE 020018 0 0 2
+ 020019 SIGNIFICANT PRESENT OR FORECAST WEATHER CCITTIA5 0 0 72
+ 020020 SIGNIFICANT RECENT WEATHER PHENOMENA CCITTIA5 0 0 32
+ 020021 TYPE OF PRECIPITATION FLAG TABLE 020021 0 0 30
+ 020022 CHARACTER OF PRECIPITATION CODE TABLE 020022 0 0 4
+ 020023 OTHER WEATHER PHENOMENA FLAG TABLE 020023 0 0 18
+ 020024 INTENSITY OF PHENOMENA CODE TABLE 020024 0 0 3
+ 020025 OBSCURATION FLAG TABLE 020025 0 0 21
+ 020026 CHARACTER OF OBSCURATION CODE TABLE 020026 0 0 4
+ 020027 PHENOMENA OCCURRENCE FLAG TABLE 020027 0 0 9
+ 020028 EXPECTED CHANGE IN INTENSITY CODE TABLE 020028 0 0 3
+ 020029 RAIN FLAG CODE TABLE 020029 0 0 2
+ 020031 ICE DEPOSIT (THICKNESS) M 2 0 7
+ 020032 RATE OF ICE ACCRETION CODE TABLE 020032 0 0 3
+ 020033 CAUSE OF ICE ACCRETION FLAG TABLE 020033 0 0 4
+ 020034 SEA ICE CONCENTRATION CODE TABLE 020034 0 0 5
+ 020035 AMOUNT AND TYPE OF ICE CODE TABLE 020035 0 0 4
+ 020036 ICE SITUATION CODE TABLE 020036 0 0 5
+ 020037 ICE DEVELOPMENT CODE TABLE 020037 0 0 5
+ 020038 BEARING OF ICE EDGE DEGREE TRUE 0 0 12
+ 020039 ICE DISTANCE M -1 0 13
+ 020041 AIRFRAME ICING CODE TABLE 020041 0 0 4
+ 020042 AIRFRAME ICING PRESENT CODE TABLE 020042 0 0 2
+ 020043 PEAK LIQUID WATER CONTENT KG/M**3 4 0 7
+ 020044 AVERAGE LIQUID WATER CONTENT KG/M**3 4 0 7
+ 020045 SUPERCOOLED LARGE DROPLET (SDL) CONDITIONS CODE TABLE 020045 0 0 2
+ 020051 AMOUNT OF LOW CLOUDS % 0 0 7
+ 020052 AMOUNT OF MIDDLE CLOUDS % 0 0 7
+ 020053 AMOUNT OF HIGH CLOUDS % 0 0 7
+ 020061 RUNWAY VISUAL RANGE (RVR) M 0 0 12
+ 020062 STATE OF THE GROUND (WITH OR WITHOUT SNOW) CODE TABLE 020062 0 0 5
+ 020063 SPECIAL PHENOMENA CODE TABLE 020063 0 0 10
+ 020065 SNOW COVER % 0 0 7
+ 020070 MINIMUM NUMBER OF ATMOSPHERICS NUMERIC 0 0 7
+ 020071 ACCURACY OF FIX AND RATE OF ATMOSPHERICS CODE TABLE 020071 0 0 4
+ 020081 CLOUD AMOUNT IN SEGMENT % 0 0 7
+ 020082 AMOUNT SEGMENT CLOUD FREE % 0 0 7
+ 020090 SPECIAL CLOUDS CODE TABLE 020090 0 0 4
+ 020192 SPECIAL PHENOMENA CODE TABLE 20192 0 0 14
+ 020193 CLOUD AMOUNT IN SEGMENT % 0 0 7
+ 020194 AMOUNT OF SEGMENT CLOUD FREE % 0 0 7
+ 020215 PRESSURE AT THE BASE OF CLOUD PA -1 0 14
+ 020250 CALCULATED SURFACE TYPE CODE TABLE 20250 0 0 5
+ 020251 ICE AGE CODE TABLE 20251 0 0 3
+ 020252 ICE EDGE CODE TABLE 20252 0 0 3
+ 020253 SURFACE TYPE CODE TABLE 20253 0 0 3
+ 020254 ICE CONCENTRATION % 0 0 7
+ 021001 HORIZONTAL REFLECTIVITY dB 0 -64 7
+ 021002 VERTICAL REFLECTIVITY dB 0 -64 7
+ 021003 DIFFERENTIAL REFLECTIVITY dB 1 -5 7
+ 021005 LINEAR DEPOLARISATION RATIO dB 0 -65 6
+ 021006 CIRCULAR DEPOLARISATION RATIO dB 0 -65 6
+ 021011 DOPPLER MEAN VELOCITY IN X-DIRECTION M/S 0 -128 8
+ 021012 DOPPLER MEAN VELOCITY IN Y-DIRECTION M/S 0 -128 8
+ 021013 DOPPLER MEAN VELOCITY IN Z-DIRECTION(VZ) M/S 0 -128 8
+ 021014 DOPPLER MEAN VELOCITY RADIAL M/S 1 -4096 13
+ 021017 DOPPLER VELOCITY SPECTRAL WIDTH M/S 1 0 8
+ 021021 ECHO TOPS M -3 0 4
+ 021030 SIGNAL TO NOISE RATIO dB 0 -32 8
+ 021031 VERTICALLY INTEGRATED LIQUID-WATER CONTENT KG/M**2 0 0 7
+ 021036 RADAR RAINFALL INTENSITY M/S 7 0 12
+ 021041 BRIGHT-BAND HEIGHT M -2 0 8
+ 021051 SIGNAL POWER ABOVE 1 mW dB 0 -256 8
+ 021062 BACKSCATTER dB 2 -5000 13
+ 021063 RADIOMETRIC RESOLUTION (NOISE VALUE) % 1 0 10
+ 021064 CLUTTER NOISE ESTIMATE NUMERIC 0 0 8
+ 021065 MISSING PACKET COUNTER NUMERIC 0 -127 8
+ 021066 WAVE SCATTEROMETER PRODUCT CONFIDENCE FLAG TABLE 021066 0 0 12
+ 021067 WIND PRODUCT CONFIDENCE DATA FLAG TABLE 021067 0 0 13
+ 021068 RADAR ALTIMETER PRODUCT CONFIDENCE DATA FLAG TABLE 021068 0 0 8
+ 021069 SST PRODUCT CONFIDENCE DATA FLAG TABLE 021069 0 0 10
+ 021070 SST PRODUCT CONFIDENCE DATA (SADIST 2) FLAG TABLE 021070 0 0 23
+ 021071 PEAKINESS NUMERIC 0 0 16
+ 021072 SATELLITE ALTIMETER CALIBRATION STATUS FLAG TABLE 021072 0 0 4
+ 021073 SATELLITE ALTIMETER INSTRUMENT MODE FLAG TABLE 021073 0 0 9
+ 021075 IMAGE SPECTRUM INTENSITY NUMERIC 0 0 8
+ 021076 REPRESENTATION OF INTENSITIES CODE TABLE 021076 0 0 3
+ 021077 ALTITUDE CORRECTION (IONOSPHERE) M 3 0 14
+ 021078 ALTITUDE CORRECTION (DRY TROPOSPHERE) M 3 0 9
+ 021079 ALTITUDE CORRECTION (WET TROPOSPHERE) M 3 2000 10
+ 021080 ALTITUDE CORRECTION (CALIBRATION CONSTANT) M 3 0 11
+ 021081 OPEN LOOP CORRECTION (HEIGHT-TIME LOOP) M 3 0 10
+ 021082 OPEN LOOP CORRECTION (AUTO GAIN CONTROL) dB 3 -3000 14
+ 021083 WARM TARGET CALIBRATION NUMERIC 0 0 16
+ 021084 COLD TARGET CALIBRATION NUMERIC 0 0 16
+ 021085 ATSR SEA SURFACE TEMPERATURE ACROSS-TRACK BAND NUMBER NUMERIC 0 0 4
+ 021086 NUMBER OF PIXELS IN NADIR ONLY, AVERAGE NUMERIC 0 0 9
+ 021087 NUMBER OF PIXELS IN DUAL VIEW, AVERAGE NUMERIC 0 0 9
+ 021091 RADAR SIGNAL DOPPLER SPECTRUM 0th MOMENT dB 0 -100 8
+ 021092 RASS SIGNAL DOPPLER SPECTRUM 0th MOMENT dB 0 -100 8
+ 021101 NUMBER OF VECTOR AMBIGUITIES NUMERIC 0 0 3
+ 021102 INDEX OF SELECTED WIND VECTOR NUMERIC 0 0 3
+ 021103 TOTAL NUMBER OF SIGMA-0 MEASUREMENTS NUMERIC 0 0 5
+ 021104 LIKELIHOOD COMPUTED FOR SOLUTION NUMERIC 3 -30000 15
+ 021105 NORMALIZED RADAR CROSS-SECTION dB 2 -10000 14
+ 021106 KP VARIANCE COEFFICIENT (ALPHA) NUMERIC 3 0 14
+ 021107 KP VARIANCE COEFFICIENT (BETA) NUMERIC 8 0 16
+ 021109 SEAWINDS WIND VECTOR CELL QUALITY FLAG TABLE 021109 0 0 17
+ 021110 NUMBER OF INNER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6
+ 021111 NUMBER OF OUTER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6
+ 021112 NUMBER OF INNER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6
+ 021113 NUMBER OF OUTER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6
+ 021114 KP VARIANCE COEFFICENT (GAMMA) dB 3 -140000 18
+ 021115 SEAWINDS SIGMA-0 QUALITY FLAG TABLE 021115 0 0 17
+ 021116 SEAWINDS SIGMA-0 MODE FLAG TABLE 021116 0 0 17
+ 021117 SIGMA-0 VARIANCE QUALITY CONTROL NUMERIC 2 0 16
+ 021118 ATTENUATION CORRECTION ON SIGMA-0 dB 2 -10000 14
+ 021119 WIND SCATTEROMETER GEOPHYSICAL MODEL FUNCTION CODE TABLE 021119 0 0 6
+ 021120 PROBABILITY OF RAIN NUMERIC 3 0 10
+ 021121 SEAWIND NOF RAIN INDEX NUMERIC 0 0 8
+ 021122 ATTENUATION CORRECTION ON SIGMA-0 (FROM tB) dB 2 -10000 14
+ 021123 SEAWINDS NORMALIZED RADAR CROSS SECTION dB 2 -30000 15
+ 021128 NUMBER OF VALID POINTS PER SECOND USED TO DERIVE PREVIOUS PARAME NUMERIC 0 0 8
+ 021130 SPECTRUM TOTAL ENERGY NUMERIC 6 0 28
+ 021131 SPECTRUM MAX ENERGY NUMERIC 6 0 28
+ 021132 DIRECTION OF SPECTRUM MAX ON HIGHER RESOLUTION GRID DEGREES 3 0 19
+ 021133 WAVELENGHT OF SPECTRUM MAX ON HIGHER RESOLUTION GRID M 3 0 29
+ 021134 RANGE RESOLUTION OF CROSS COVARIANCE SPECTRUM RAD/M 3 0 19
+ 021135 REAL PART OF CROSS SPECTRA POLAR GRID NUMBER OF BINS NUMERIC 3 -524288 20
+ 021136 IMAGINARY PART OF CROSS SPECTRA POLAR GRID NUMBER OF BINS NUMERIC 3 -524288 20
+ 021137 KU BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT DB 2 -32768 16
+ 021138 STD KU BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT DB 2 -32768 16
+ 021139 KU BAND NET INSTRUMENTAL CORRECTION FOR ACG DB 2 -2048 12
+ 021140 S BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT DB 2 -32768 16
+ 021141 STD S BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT DB 2 -32768 16
+ 021142 S BAND NET INSTRUMENTAL CORRECTION FOR ACG DB 2 -1024 11
+ 021143 KU BAND RAIN ATTENUATION DB 2 -1073741824 31
+ 021144 ALTIMETER RAIN FLAG FLAG TABLE 021144 0 0 2
+ 021192 RADAR BACK SCATTER dB 2 -5000 13
+ 021193 NOISE FIGURE % 0 0 7
+ 021194 BACKGROUND NOISE LEVEL NUMERIC 0 0 8
+ 021195 MISSING PACKET COUNTER NUMERIC 0 -127 8
+ 021196 UWA PRODUCT CONFIDENCE FLAG TABLE 21196 0 0 12
+ 021197 UWI PRODUCT CONFIDENCE FLAG TABLE 21197 0 0 12
+ 021198 URA PRODUCT CONFIDENCE FLAG TABLE 21198 0 0 8
+ 021199 UAT PRODUCT CONFIDENCE FLAG TABLE 21199 0 0 7
+ 021200 MWI PRODUCT CONFIDENCE FLAG TABLE 21200 0 0 15
+ 021201 PEAKINESS NUMERIC 0 0 16
+ 021202 ALTIMETER CALIBRATION STATUS FLAG TABLE 21202 0 0 4
+ 021203 ALTIMETER INSTRUMENT MODE FLAG TABLE 21203 0 0 9
+ 021204 MULTI/SINGLE VIEW DIFFERENCE K 2 -512 10
+ 021205 SPECTRAL INTENSITY NUMERIC 0 0 8
+ 021206 REPRESENTATION OF INTENSITY CODE TABLE 21206 0 0 3
+ 021207 ALTITUDE CORRECTION (IONOSPHERE) M 3 0 14
+ 021208 ALTITUDE CORRECTION (DRY TROPOSPHERE) M 3 0 9
+ 021209 LTITUDE CORRECTION (WET TROPOSPHERE) M 3 2000 10
+ 021210 ALTITUDE CORRECTION (CALIBRATION CONSTANT) M 3 0 11
+ 021211 OPEN LOOP CORRECTION (HTL) M 3 0 10
+ 021212 OPEN LOOP CORRECTION (AGC) dB 3 -3000 14
+ 021213 AMBIGUITY REMOVAL CONFIDENCE % 0 0 7
+ 021214 UAT QUALITY SUMMARY CODE TABLE 21214 0 0 3
+ 021215 UAT ACROSS-TRACK BAND NO. NUMERIC 0 0 4
+ 021222 DOPPLER SPECTRUM 0 TH MOMENT (AMPLITUDE) dB 0 0 7
+ 021225 PRESCAT PRODUCT CONFIDENCE FLAG TABLE 21225 0 0 6
+ 021226 BACKSCATER DISTANCE NUMERIC 1 -4096 13
+ 021230 NUMBER OF VECTOR AMBIGUITIES NUMERIC 0 0 3
+ 021231 INDEX OF SELECTED WIND VECTOR NUMERIC 0 0 3
+ 021232 TOTAL NMBER OF SIGMA-0 MEASUREMENTS NUMERIC 0 0 5
+ 021233 NUMBER OF SIGMA-0 USABLE FOR WIND NUMERIC 0 0 5
+ 021234 LIKELIHOOD COMPUTED FOR SOLUTION NUMERIC 1 -10000 14
+ 021235 WIND VECTOR CELL QUALITY FLAG FLAG TABLE 21235 0 0 3
+ 021236 NUMBER OF FORE-BEAM SIGMA-0 NUMERIC 1 0 6
+ 021237 NUMBER OF MID-BEAM V-POL SIGMA-0 NUMERIC 1 0 6
+ 021238 NUMBER OF MID-BEAM H-POL SIGMA-0 NUMERIC 1 0 6
+ 021239 NUMBER OF AFT-BEAM SIGMA-0 NUMERIC 1 0 6
+ 021240 NORMALIZED RADAR CROSS SECTION NUMERIC 2 -10000 14
+ 021241 Kp VARIANCE COEFFICIENT (ALPHA) NUMERIC 5 0 14
+ 021242 Kp VARIANCE COEFFICIENT (BETHA) NUMERIC 6 0 16
+ 021243 Kp VARIANCE COEFFICIENT (GAMMA) NUMERIC 6 0 16
+ 021244 SIGMA-0 QUALITY FLAG FLAG TABLE 21244 0 0 15
+ 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9
+ 022002 DIRECTION OF WIND WAVES DEGREE TRUE 0 0 9
+ 022003 DIRECTION OF SWELL WAVES DEGREE TRUE 0 0 9
+ 022004 DIRECTION OF CURRENT DEGREE TRUE 0 0 9
+ 022011 PERIOD OF WAVES S 0 0 6
+ 022012 PERIOD OF WIND WAVES S 0 0 6
+ 022013 PERIOD OF SWELL WAVES S 0 0 6
+ 022021 HEIGHT OF WAVES M 1 0 10
+ 022022 HEIGHT OF WIND WAVES M 1 0 10
+ 022023 HEIGHT OF SWELL WAVES M 1 0 10
+ 022025 STANDARD DEVIATION WAVE HEIGHT M 2 0 10
+ 022026 STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT M 2 0 10
+ 022031 SPEED OF CURRENT M/S 2 0 13
+ 022035 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 2 0 14
+ 022036 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 2 0 14
+ 022037 TIDAL ELEVATION WITH RESPECT TO NATIONAL LAND DATUM M 3 -10000 15
+ 022038 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 3 -10000 15
+ 022039 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 3 -5000 12
+ 022040 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 3 -5000 14
+ 022041 SEA-SURFACE TEMPERATURE(15-DAY RUNNING MEAN) K 1 0 12
+ 022042 SEA/WATER TEMPERATURE K 1 0 12
+ 022043 SEA/WATER TEMPERATURE K 2 0 15
+ 022044 SOUND VELOCITY M/S 1 0 14
+ 022045 SEA/WATER TEMPERATURE K 3 0 19
+ 022050 STANDARD DEVIATION SEA SURFACE TEMPERATURE K 2 0 8
+ 022055 FLOAT CYCLE NUMBER NUMERIC 0 0 10
+ 022056 DIRECTION OF PROFILE CODE TABLE 022056 0 0 2
+ 022060 LAGRANGIAN DRIFTER DROGUE STATUS CODE TABLE 022060 0 0 3
+ 022061 STATE OF THE SEA CODE TABLE 022061 0 0 4
+ 022062 SALINITY PART PER THOUSAND 2 0 14
+ 022063 TOTAL WATER DEPTH M 0 0 14
+ 022064 SALINITY PART PER THOUSAND 3 0 17
+ 022065 WATER PRESSURE PA -3 0 17
+ 022066 WATER CONDUCTIVITY S M-1 6 0 26
+ 022067 INSTRUMENT TYPE FOR WATER TEMPERATURE PROFILE MEASUREMENT CODE TABLE 022067 0 0 10
+ 022068 WATER TEMPERATURE PROFILE RECORDER TYPES CODE TABLE 022068 0 0 7
+ 022070 SIGNIFICANT WAVE HEIGHT M 2 0 13
+ 022071 SPECTRAL PEAK WAVE PERIOD S 1 0 9
+ 022072 SPECTRAL PEAK WAVE LENGTH M 0 0 13
+ 022073 MAXIMUM WAVE HEIGHT M 2 0 13
+ 022074 AVERAGE WAVE PERIOD S 1 0 9
+ 022075 AVERAGE WAVE LENGTH M 0 0 13
+ 022076 DIRECTION FROM WHICH DOMINANT WAVES ARE COMING DEGREE TRUE 0 0 9
+ 022077 DIRECTIONAL SPREAD OF DOMINANT WAVE DEGREE 0 0 9
+ 022078 DURATION OF WAVE RECORD S 0 0 12
+ 022079 LENGTH OF WAVE RECORD M 0 0 16
+ 022080 WAVEBAND CENTRAL FREQUENCY Hz 3 0 10
+ 022081 WAVEBAND CENTRAL WAVE NUMBER 1/M 5 0 13
+ 022082 MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE DENSITY M**2S 2 0 20
+ 022083 MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE NUMBER M**3 2 0 20
+ 022084 BAND CONTAINING MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE DENSITY NUMERIC 0 0 7
+ 022085 SPECTRAL WAVE DENSITY RATIO NUMERIC 0 0 7
+ 022086 MEAN DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9
+ 022087 PRINCIPAL DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9
+ 022088 FIRST NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7
+ 022089 SECOND NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7
+ 022090 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S 2 0 20
+ 022091 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**3 2 0 20
+ 022092 DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S/RAD 2 0 20
+ 022093 DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**4 2 0 20
+ 022094 TOTAL NUMBER OF WAVE BANDS NUMERIC 0 0 7
+ 022095 DIRECTIONAL SPREAD OF INDIVIDUAL WAVES DEGREE 0 0 8
+ 022096 SPECTRAL BAND WIDTH 1/S 3 0 4
+ 022097 MEAN WAVELENGTH > 731 M OF IMAGE SPECTRUM AT LOW WAVE NUMBERS M 0 0 14
+ 022098 WAVELENGTH SPREAD (WAVELENGTH > 731 M) AT LOW WAVE NUMBERS M 0 0 14
+ 022099 MEAN DIRECTION AT LOW WAVE NUMBERS (WAVELENGTH > 731 M) DEGREE TRUE 0 0 9
+ 022100 DIRECTION SPREAD AT LOW WAVE NUMBERS (WAVELENGTH > 731 M) DEGREE 0 0 9
+ 022101 TOTAL ENERGY (WAVELENGTH > 731 M) AT LOW WAVE NUMBERS NUMERIC 0 0 31
+ 022120 TIDE STATION AUTOMATED WATER LEVEL CHECK CODE TABLE 022120 0 0 5
+ 022121 TIDE STATION MANUAL WATER LEVEL CHECK CODE TABLE 022121 0 0 5
+ 022122 TIDE STATION AUTOMATED METEOROLOGICAL DATA CHECK CODE TABLE 022122 0 0 5
+ 022123 TIDE STATION MANUAL METEOROLOGICAL DATA CHECK CODE TABLE 022123 0 0 5
+ 022141 SEA SURFACE TEMPERATURE (15 DAY RUNNING MEAN) K 2 0 15
+ 022150 NUMBER OF 18 HZ VALID POINTS FOR KU BAND NUMERIC 0 0 10
+ 022151 KU BAND OCEAN RANGE M 3 0 31
+ 022152 STD OF 18 HZ KU BAND OCEAN RANGE M 3 0 16
+ 022153 NUMBER OF 18 HZ VALID POINTS FOR S BAND NUMERIC 0 0 10
+ 022154 S BAND OCEAN RANGE M 3 0 31
+ 022155 STD OF 18 HZ S BAND OCEAN RANGE M 3 0 16
+ 022156 KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16
+ 022157 STD 18 HZ KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16
+ 022158 S BAND SIGNIFICANT WAVE HEIGHT M 3 0 16
+ 022159 STD 18 HZ S BAND SIGNIFICANT WAVE HEIGHT M 3 0 16
+ 022160 NORMALIZED INVERSE WAVE AGE NUMERIC 6 0 21
+ 022161 WAVE SPECTRA M**4 4 0 27
+ 022192 SPECTRAL PERIOD S 2 0 13
+ 022193 MEAN WAVENUMBER 1/M 5 0 15
+ 022194 PEAK WAVENUMBER 1/M 5 0 15
+ 022195 MEAN WAVE PROPAGATION DIRECTION DEGREE 1 0 13
+ 022196 PEAK WAVE PROPAGATION DIRECTION DEGREE 1 0 13
+ 022197 DIRECTION SPREAD DEGREE 1 0 13
+ 022198 VARIANCE SPECTRAL DENSITY M**2*S/RAD 4 0 18
+ 022199 CORRELATION COEFF OF SIMULATED FG AND OBSERVED SAR SPECTRUM NUMERIC 4 -10000 15
+ 022200 CORRELATION COEFF OF SIMULATED BF AND OBSERVED SAR SPECTRUM NUMERIC 4 -10000 15
+ 022201 CORRELATION COEFF OF OCEAN WAVE FG AND EXTRACTED WAVE SPECTRUM NUMERIC 4 -10000 15
+ 022202 ERROR BETWEEN FIRST GUESS AND OBSERVED SAR NUMERIC 5 0 21
+ 022203 ERROR BETWEEN SIMULATED AND OBSERVED SAR NUMERIC 5 0 21
+ 022204 MEAN PERIOD OF WAVES SECOND 2 0 13
+ 022205 SPECTRAL DENSITY M**2*S/RAD 4 0 25
+ 022206 PEAK PERIOD OF WAVES SECOND 2 0 13
+ 022207 MEAN WAVE PERIOD S 1 0 10
+ 022208 PEAK PERIOD OF 1D SPECTRA S 1 0 10
+ 022209 COEFICIENT OF DRAG WITH WAVES NUMERIC 6 0 13
+ 022210 MEAN SQUARE SLOPE OF WAVES NUMERIC 4 -10000 14
+ 022211 COEFICIENT OF DRAG WITH WAVES NUMERIC 6 0 17
+ 022243 STANDARD DEVIATION SIGNIFICANT WAVE HEIGHT M 2 0 10
+ 023001 ACCIDENT EARLY NOTIFICATION-ARTICLE APPLICABLE CODE TABLE 023001 0 0 3
+ 023002 ACTIVITY OR FACILITY INVOLVED INCIDENT CODE TABLE 023002 0 0 5
+ 023003 TYPE OF RELEASE CODE TABLE 023003 0 0 3
+ 023004 COUNTERMEASURES TAKEN NEAR BORDER CODE TABLE 023004 0 0 3
+ 023005 CAUSE OF INCIDENT CODE TABLE 023005 0 0 2
+ 023006 INCIDENT SITUATION CODE TABLE 023006 0 0 3
+ 023007 CHARACTERISTICS OF RELEASE CODE TABLE 023007 0 0 3
+ 023008 STATE OF CURRENT RELEASE CODE TABLE 023008 0 0 2
+ 023009 STATE OF EXPECTED RELEASE CODE TABLE 023009 0 0 2
+ 023016 POSSIBILITY OF SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT CODE TABLE 023016 0 0 2
+ 023017 FLOW DISCHARGE OF MAJOR RECIPIENT M**3/S 6 0 20
+ 023018 RELEASE BEHAVIOUR OVER TIME CODE TABLE 023018 0 0 3
+ 023019 ACTUAL RELEASE HEIGHT M 0 -15000 17
+ 023021 EFFECTIVE RELEASE HEIGHT M 0 -15000 17
+ 023022 DISTANCE OF RELEASE POINT OR SITE OF INCIDENT M 0 0 24
+ 023023 MAIN TRANSPORT SPEED IN THE ATMOSPHERE M/S 1 0 12
+ 023024 MAIN TRANSPORT SPEED WATER M/S 2 0 13
+ 023025 MAIN TRANSPORT SPEED IN GROUND WATER M/S 2 0 13
+ 023027 MAIN TRANSPORT DIRECTION IN THE ATMOSPHERE DEGREE TRUE 0 0 9
+ 023028 MAIN TRANSPORT DIRECTION IN WATER DEGREE TRUE 0 0 9
+ 023029 MAIN TRANSPORT DIRECTION IN GROUND WATER DEGREE TRUE 0 0 9
+ 023031 POSSIBILITY THAT PLUME WILL ENCOUNTER PRECIPITATION IN STATE IN CODE TABLE 023031 0 0 2
+ 023032 PLUME WILL ENCOUNTER CHANGE IN WIND DIRECTION AND/OR SPEED FLAG CODE TABLE 023032 0 0 2
+ 024001 ESTIMATE OF AMOUNT OF RADIOACTIVITY RELEASED UP TO SPECIFIED TIM Bq -11 0 28
+ 024002 ESTIMATED MAXIMUM POTENTIAL RELEASE Bq -11 0 28
+ 024003 COMPOSITION OF RELEASE CODE TABLE 024003 0 0 5
+ 024004 ELEMENT NAME CCITTIA5 0 0 16
+ 024005 ISOTOPE MASS NUMERIC 0 0 9
+ 024011 DOSE mSv 2 0 32
+ 024012 TRAJECTORY DOSE (DEFINED LOCATION AND EXPECTED TIME OF ARRIVAL) mSv 2 0 32
+ 024013 GAMMA DOSE IN AIR ALONG THE MAIN TRANSPORT PATH(DEFINED LOCATION mSv 2 0 32
+ 024021 AIR CONCENTRATION(OF NAMED ISOTOPE TYPE INCLUDING GROSS BETA Bq/M**3 2 0 32
+ 024022 CONCENTRATION IN PRECIPITATION ( OF NAMED ISOTOPE TYPE) Bq/L 2 0 32
+ 024023 PULSE RATE OF BETA RADIATION 1/S 1 0 14
+ 024024 PULSE RATE OF GAMMA RADIATION 1/S 1 0 14
+ 025001 RANGE-GATE LENGTH M -1 0 6
+ 025002 NUMBER OF GATES AVERAGED NUMERIC 0 0 4
+ 025003 NUMBER OF INTEGRATED PULSES NUMERIC 0 0 8
+ 025004 ECHO PROCESSING CODE TABLE 025004 0 0 2
+ 025005 ECHO INTEGRATION CODE TABLE 025005 0 0 2
+ 025006 Z TO R CONVERSION CODE TABLE 025006 0 0 3
+ 025007 Z TO R CONVERSION FACTOR NUMERIC 0 0 12
+ 025008 Z TO R CONVERSION EXPONENT NUMERIC 2 0 9
+ 025009 CALIBRATION METHOD FLAG TABLE 025009 0 0 4
+ 025010 CLUTTER TREATMENT CODE TABLE 025010 0 0 4
+ 025011 GROUND OCCULTATION CORRECTION (SCREENING) CODE TABLE 025011 0 0 2
+ 025012 RANGE ATTENUATION CORRECTION CODE TABLE 025012 0 0 2
+ 025013 BRIGHT-BAND CORRECTION FLAG TABLE 025013 0 0 2
+ 025014 AZIMUTH CLUTTER CUT-OFF NUMERIC 0 0 12
+ 025015 RADOME ATTENUATION CORRECTION FLAG TABLE 025015 0 0 2
+ 025016 CLEAR-AIR ATTENUATION CORRECTION dB/M 5 0 6
+ 025017 PRECIPITATION ATTENUATION CORRECTION FLAG TABLE 025017 0 0 2
+ 025018 A TO Z LAW FOR ATTENUATION FACTOR NUMERIC 7 0 6
+ 025019 A TO Z LAW FOR ATTENUATION EXPONENT NUMERIC 2 0 7
+ 025020 MEAN SPEED ESTIMATION CODE TABLE 025020 0 0 2
+ 025021 WIND COMPUTATION ENHANCEMENT FLAG TABLE 025021 0 0 8
+ 025025 BATTERY VOLTAGE V 1 0 9
+ 025026 BATTERY VOLTAGE (LARGE RANGE) V 1 0 12
+ 025028 OPERATOR OR MANUFACTURER DEFINED PARAMETER NUMERIC 1 -16384 15
+ 025030 RUNNING MEAN SEA-SURFACE TEMPERATURE USAGE CODE TABLE 025030 0 0 2
+ 025032 WIND PROFILER MODE INFORMATION CODE TABLE 025032 0 0 2
+ 025033 WIND PROFILER SUBMODE INFORMATION CODE TABLE 025033 0 0 2
+ 025034 WIND PROFILER QUALITY CONTROL TEST RESULTS FLAG TABLE 025034 0 0 4
+ 025036 ATMOSPHERICS LOCATION METHOD CODE TABLE 025036 0 0 4
+ 025040 CO2 WIND PRODUCT DERIVATION CODE TABLE 025040 0 0 4
+ 025041 MOVING PLATFORM DIRECTION REPORTING METHOD CODE TABLE 025041 0 0 2
+ 025042 MOVING PLATFORM SPEED REPORTING METHOD CODE TABLE 025042 0 0 2
+ 025043 WAVE SAMPLING INTERVAL (TIME) S 4 0 15
+ 025044 WAVE SAMPLING INTERVAL (SPACE) M 2 0 14
+ 025045 HIRS CHANNEL COMBINATION FLAG TABLE 025045 0 0 21
+ 025046 MSU CHANNEL COMBINATION FLAG TABLE 025046 0 0 5
+ 025047 SSU CHANNEL COMBINATION FLAG TABLE 025047 0 0 4
+ 025048 AMSU-A CHANNEL COMBINATION FLAG TABLE 025048 0 0 16
+ 025049 AMSU-B CHANNEL COMBINATION FLAG TABLE 025049 0 0 6
+ 025051 AVHRR CHANNEL COMBINATION FLAG TABLE 025051 0 0 7
+ 025053 OBSERVATION QUALITY FLAG TABLE 025053 0 0 12
+ 025050 PRINCIPAL COMPONENT SCORE NUMERIC 4 -131072 18
+ 025054 SSMIS SUBFRAME ID NUMBER NUMERIC 0 0 5
+ 025055 MULTIPLEX HOUSEKEEPING K 2 0 16
+ 025060 SOFTWARE IDENTIFICATION NUMERIC 0 0 14
+ 025061 SOFTWARE IDENTIFICATION CCITTIA5 0 0 96
+ 025070 MAJOR FRAME COUNT NUMERIC 0 0 4
+ 025071 FRAME COUNT NUMERIC 0 0 5
+ 025075 SATELLITE ANTENNA CORRECTIONS VERSION NUMBER NUMERIC 0 0 5
+ 025076 LOG_10 OF (TEMPERATURE-RADIANCE CENTRAL WAVENUMBER) FOR ATOVS LOG (1/M) 8 0 30
+ 025077 BANDWIDTH CORRECTION COEFFICIENT 1 for ATOVS NUMERIC 5 -100000 18
+ 025078 BANDWIDTH CORRECTION COEFFICIENT 2 FOR ATOVS NUMERIC 5 0 17
+ 025079 ALBEDO-RADIANCE SOLAR FILTERED IRRADIANCE FOR ATOVS W/M**2 4 0 24
+ 025080 ALBEDO-RADIANCE EQUIVALENT FILTER WIDTH FOR ATOVS M 10 0 14
+ 025085 FRACTION OF CLEAR PIXELS IN HIRS FOV NUMERIC 0 0 7
+ 025086 DEPTH CORRECTION INDICATOR CODE TABLE 025086 0 0 2
+ 025091 STRUCTURE CONSTANT OF THE REFRACTION INDEX (Cn2) dB 3 -18192 13
+ 025092 ACOUSTIC PROPAGATION VELOCITY M/S 2 28000 14
+ 025093 RASS COMPUTATIONAL CORRECTION FLAG TABLE 025093 0 0 8
+ 025095 ALTIMETER STATE FLAG FLAG TABLE 025095 0 0 2
+ 025096 RADIOMETER STATE FLAG FLAG TABLE 025096 0 0 5
+ 025097 THREE DIMENSIONAL ERROR ESTIMATE OF THE NAVIGATOR ORBIT CODE TABLE 025097 0 0 4
+ 025100 XBT/XCTD FALL RATE EQUATION COEFFICIENT A NUMERIC 5 0 20
+ 025101 XBT/XCTD FALL RATE EQUATION COEFFICIENT B NUMERIC 5 -500000 21
+ 025102 NUMBER OF MISSING LINES EXCLUDING DATA GAPS NUMERIC 0 0 8
+ 025103 NUMBER OF DIRECTIONAL BINS NUMERIC 0 0 8
+ 025104 NUMBER OF WAVELENGHT BINS NUMERIC 0 0 8
+ 025105 FIRST DIRECTIONAL BIN DEGREES 3 0 19
+ 025106 DIRECTIONAL BIN STEP DEGREES 3 0 19
+ 025107 FIRST WAVELENGHT BIN M 3 0 29
+ 025108 LAST WAVELENGHT BIN M 3 0 29
+ 025110 IMAGE PROCESSING SUMMARY FLAG TABLE 025110 0 0 10
+ 025111 NUMBER OF INPUT DATA GAPS NUMERIC 0 0 8
+ 025120 RA2_L2_PROCESSING FLAG CODE TABLE 025120 0 0 2
+ 025121 RA2_L2_PROCESSING QUALITY % 0 0 7
+ 025122 HARDWARE CONFIGURATION FOR RF CODE TABLE 025122 0 0 2
+ 025123 HARDWARE CONFIGURATION FOR HPA CODE TABLE 025123 0 0 2
+ 025124 MWR L2 PROCESSING FLAG CODE TABLE 025124 0 0 2
+ 025125 MWR L2 PROCESSING QUALITY % 0 0 7
+ 025126 MODEL DRY TROPOSPHERIC CORRECTION M 3 -32768 16
+ 025127 SEA SURFACE HEIGHT CORRECTION DUE TO PRESSURE LOADING M 3 -32768 16
+ 025128 MODEL WET TROPOSPHERIC CORRECTION M 3 -32768 16
+ 025129 MWR DERIVED WET TROPOSPHERIC CORRECTION M 3 -32768 16
+ 025130 RA2 IONOSPHERIC CORRECTION ON KU BAND M 3 -32768 16
+ 025131 IONOSPHERIC CORRECTION FROM DORIS ON KU BAND M 3 -32768 16
+ 025132 IONOSPHERIC CORRECTION FROM MODEL ON KU BAND M 3 -32768 16
+ 025133 SEA STATE BIAS CORRECTION ON KU BAND M 3 -32768 16
+ 025134 RA2 IONOSPHERIC CORRECTION ON S BAND M 3 -32768 16
+ 025135 IONOSPHERIC CORRECTION FROM DORIS ON S BAND M 3 -32768 16
+ 025136 IONOSPHERIC CORRECTION FROM MODEL ON S BAND M 3 -32768 16
+ 025137 SEA STATE BIAS CORRECTION ON S BAND M 3 -32768 16
+ 025138 AVERAGE SIGNAL TO NOISE RATIO NUMERIC 0 -2048 12
+ 025193 ATTENUATION CORRECTION ON SIGMA0 dB 3 0 14
+ 025194 MAJOR FRAME COUNT NUMERIC 0 0 4
+ 025197 ANTENNA CORRECTIONS VERSION NUMBER NUMERIC 0 0 5
+ 025198 LOG (TEMP-RAD CENTRAL WAVE NUMBER) 1/M 8 0 30
+ 025199 BANDWIDTH CORRECTION COEFFICIENT 1 NUMERIC 4 -10000 15
+ 025200 BANDWIDTH CORRECTION COEFFICIENT 2 NUMERIC 5 0 17
+ 025201 ALBEDO-RAD SOLAR FILTERED IRRADIANCE NUMERIC 4 0 24
+ 025202 ALBEDO-RAD EQUIVALENT FILTER WIDTH NUMERIC 10 0 14
+ 025203 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 25081 0 0 31
+ 025204 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 25082 0 0 31
+ 025205 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 25083 0 0 31
+ 025206 FOV QUALITY FLAGS FOR ATOVS FLAG TABLE 25084 0 0 31
+ 026001 PRINCIPAL TIME OF DAILY READING IN UTC OF MAXIMUM TEMPERATURE HOUR 1 0 12
+ 026002 PRINCIPAL TIME OF DAILY READING IN UTC OF MINIMUM TEMPERATURE HOUR 1 0 12
+ 026003 TIME DIFFERENCE MINUTE 0 -1440 12
+ 026010 HOURS INCLUDED FLAG TABLE 026010 0 0 26
+ 026020 DURATION OF PRECIPITATION MINUTE 0 0 11
+ 026193 YEAR YEAR 0 0 12
+ 026194 MONTH MONTH 0 0 4
+ 026195 DAY DAY 0 0 6
+ 026196 HOUR HOUR 0 0 5
+ 026197 MINUTE MINUTE 0 0 6
+ 026198 SECOND SECOND 0 0 6
+ 026200 LOCATION WITHIN ASSIMILATION WINDOW IN TIME NUMERIC 6 0 20
+ 026201 HOURS INCLUDED FLAG TABLE 26201 0 0 26
+ 027001 LATITUDE(HIGH ACCURACY) DEGREE 5 -9000000 25
+ 027002 LATITUDE(COARSE ACCURACY) DEGREE 2 -9000 15
+ 027003 ALTERNATE LATITUDE DEGREE 2 -9000 15
+ 027004 ALTERNATE LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25
+ 027020 SATELLITE LOCATION COUNTER NUMERIC 0 0 16
+ 027021 SATELLITE SUBLOCATION DIMENSION NUMERIC 0 0 16
+ 027031 IN DIRECTION OF 0 DEGREES LONGITUDE, DISTANCE FROM THE EARTH'S C M 2 -1073741824 31
+ 027035 LENGTH OF PHENOMENON M -3 0 13
+ 027080 VIEWING AZIMUTH ANGLE DEGREE TRUE 2 0 16
+ 027193 SOLAR AZIMUTH DEGREE TRUE 2 0 16
+ 028001 LONGITUDE(HIGH ACCURACY) DEGREE 5 -18000000 26
+ 028002 LONGITUDE(COARSE ACCURACY) DEGREE 2 -18000 16
+ 028003 ALTERNATE LONGITUDE DEGREE 2 -18000 16
+ 028004 ALTERNATE LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26
+ 028031 IN DIRECTION 90 DEGREES EAST,DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31
+ 028035 WIDTH OF PHENOMENON M -3 0 13
+ 029001 PROJECTION TYPE CODE TABLE 029001 0 0 3
+ 029002 COORDINATE GRID TYPE CODE TABLE 029002 0 0 3
+ 030001 PIXEL VALUE(4 BITS) NUMERIC 0 0 4
+ 030002 PIXEL VALUE(8 BITS) NUMERIC 0 0 8
+ 030004 PIXEL VALUE(16 BITS) NUMERIC 0 0 16
+ 030021 NUMBER OF PIXELS PER ROW NUMERIC 0 0 12
+ 030022 NUMBER OF PIXELS PER COLUMN NUMERIC 0 0 12
+ 030031 PICTURE TYPE CODE TABLE 030031 0 0 4
+ 030032 COMBINATION WITH OTHER DATA FLAG TABLE 030032 0 0 16
+ 030193 POSITION NUMBER ALONG SCAN NUMERIC 0 0 8
+ 031000 SHORT DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 1
+ 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8
+ 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16
+ 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8
+ 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16
+ 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 031021 0 0 6
+ 031031 DATA PRESENT INDICATOR FLAG TABLE 031031 0 0 1
+ 031192 DATA PRESENT INDICATOR NUMERIC 0 0 1
+ 033002 QUALITY INFORMATION CODE TABLE 033002 0 0 2
+ 033003 QUALITY INFORMATION CODE TABLE 033003 0 0 3
+ 033005 QUALITY INFORMATION (AWS DATA) FLAG TABLE 033005 0 0 30
+ 033006 INTERNAL MEASUREMENT STATUS INFORMATION (AWS) CODE TABLE 033006 0 0 3
+ 033007 % CONFIDENCE % 0 0 7
+ 033020 QUALITY CONTROL INDICATION OF FOLLOWING VALUE CODE TABLE 033020 0 0 3
+ 033021 QUALITY OF FOLLOWING VALUE CODE TABLE 033021 0 0 2
+ 033022 QUALITY OF BUOY SATELLITE TRANSMISSION CODE TABLE 033022 0 0 2
+ 033023 QUALITY OF BUOY LOCATION CODE TABLE 033023 0 0 2
+ 033024 STATION ELEVATION QUALITY MARK (FOR MOBILE STATION) CODE TABLE 033024 0 0 4
+ 033025 ACARS INTERPOLATED VALUES CODE TABLE 033025 0 0 3
+ 033026 MIXING RATIO QUALITY CODE TABLE 033026 0 0 6
+ 033027 LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66% CONFIDENCE) CODE TABLE 033027 0 0 3
+ 033030 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 033030 0 0 24
+ 033031 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 033031 0 0 24
+ 033032 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 033032 0 0 24
+ 033033 FIELD OF VIEW QUALITY FLAGS FOR ATOVS FLAG TABLE 033033 0 0 24
+ 033035 MANUAL/AUTOMATIC QUALITY CONTROL CODE TABLE 033035 0 0 4
+ 033036 NOMINAL CONFIDENCE THRESHOLD % 0 0 7
+ 033037 WIND CORRELATION ERROR FLAG TABLE 033037 0 0 20
+ 033038 QUALITY FLAG FOR GROUND BASED GNSS DATA FLAG TABLE 033038 0 0 10
+ 033040 CONFIDENCE INTERVAL % 0 0 7
+ 033041 ATTRIBUTE OF FOLLOWING VALUE CODE TABLE 033041 0 0 2
+ 033043 AST CONFIDENCE FLAG TABLE 033043 0 0 8
+ 033044 ASAR QUALITY INFORMATION FLAG TABLE 033044 0 0 15
+ 033047 MEASUREMENT CONFIDENCE DATA FLAG TABLE 033047 0 0 31
+ 033048 CONFIDENCE MEASURE OF SAR INVERSION CODE TABLE 033048 0 0 2
+ 033049 CONFIDENCE MEASURE OF WIND RETIEVAL CODE TABLE 033049 0 0 2
+ 033050 GLOBAL GTSPP QUALITY FLAG CODE TABLE 033050 0 0 4
+ 033051 ASAR QUALITY INFORMATION FLAG TABLE 033051 0 0 15
+ 033052 S BAND OCEAN RETRACKING QUALITY FLAG TABLE 033052 0 0 21
+ 033053 KU BAND OCEAN RETRACKING QUALITY FLAG TABLE 033053 0 0 21
+ 033054 DATA EXTRACTION INDICATOR FLAG TABLE 033054 0 0 8
+ 033192 TEM1 CONFIDENCE % 0 0 7
+ 033193 DATA QUALITY 3 BIT CODE CODE TABLE 33193 0 0 3
+ 033194 DATA QUALITY 2 BIT CODE CODE TABLE 33194 0 0 2
+ 033195 ECMWF SAR QC INDICATOR CODE TABLE 33195 0 0 5
+ 033196 ECMWF WAM QC INDICATOR CODE TABLE 33196 0 0 2
+ 033197 ECMWF SAR INVERSION QC INDICATOR CODE TABLE 33197 0 0 3
+ 033198 MINIMUM COST NUMERIC 4 0 14
+ 033199 1D VAR TOTAL PRECIPITABLE WATER RETRIEVED ERROR(S) KG/M**2 2 0 11
+ 033200 ANALYSIS REPORT EVENTS FLAG TABLE 33200 0 0 31
+ 033201 ANALYSIS REPORT STATUS EVENT FLAG TABLE 33201 0 0 13
+ 033202 ANALYSIS DATUM EVENT FLAGS (1) FLAG TABLE 33202 0 0 31
+ 033203 ANALYSIS DATUM EVENT FLAGS (2) FLAG TABLE 33203 0 0 11
+ 033204 ANALYSIS DATUM STATUS FLAGS FLAG TABLE 33204 0 0 21
+ 033205 VARIATIONAL ANALYSIS BLACK LIST FLAG CODE TABLE 33205 0 0 4
+ 033206 VARIATIONAL ANALYSIS QUALITY CONTROL FLAG CODE TABLE 33206 0 0 4
+ 033207 VARIATIONAL ANALYSIS DEPARTURE FLAG CODE TABLE 33207 0 0 4
+ 033208 VARIATIONAL ANALYSIS FIRST QUESS CHECK FLAG CODE TABLE 033208 0 0 4
+ 033209 VARIATIONAL ANALYSIS FINAL FLAG CODE TABLE 33209 0 0 4
+ 033210 INCREMENTAL VARIATIONAL ANALYSIS UPDATE NUMBER NUMERIC 0 0 7
+ 033211 MINIMISATION SIMULATION NUMBER NUMERIC 0 0 10
+ 033212 1D VAR ITERATION NUMBER NUMERIC 0 0 10
+ 033213 1D VAR RADIANCE COST NUMERIC 1 -1000 11
+ 033214 1D VAR ERROR(S) FLAG TABLE 33214 0 0 11
+ 033215 DIRECTIONAL SKILL NUMERIC 1 -4096 13
+ 033216 1D VAR SURFACE TYPE QUALITY CONTROL CODE TABLE 33216 0 0 3
+ 033217 1D VAR FAILURE INDICATOR CODE TABLE 33217 0 0 2
+ 033218 1D VAR ESTIMATE OF SCATTERING NUMERIC 2 0 12
+ 033219 SSMI INDIPENDENT SCATTERING INDEX NUMERIC 2 -50000 16
+ 033220 VARIATIONAL ANALYSIS REPORT EVENTS (1) FLAG TABLE 33220 0 0 31
+ 033221 VARIATIONAL ANALYSIS SYNOP EVENTS (2) FLAG TABLE 33221 0 0 31
+ 033222 VARIATIONAL ANALYSIS AIREP EVENTS (2) FLAG TABLE 33222 0 0 31
+ 033223 VARIATIONAL ANALYSIS SATOB EVENTS (2) FLAG TABLE 33223 0 0 31
+ 033224 VARIATIONAL ANALYSIS DRIBU EVENTS (2) FLAG TABLE 33224 0 0 31
+ 033225 VARIATIONAL ANALYSIS TEMP EVENTS (2) FLAG TABLE 33225 0 0 31
+ 033226 VARIATIONAL ANALYSIS PILOT EVENTS (2) FLAG TABLE 33226 0 0 31
+ 033227 VARIATIONAL ANALYSIS SATEM/TOVS EVENTS (2) FLAG TABLE 33227 0 0 31
+ 033228 VARIATIONAL ANALYSIS PAOB EVENTS (2) FLAG TABLE 33228 0 0 31
+ 033229 VARIATIONAL ANALYSIS SCATTEROMETER EVENTS (2) FLAG TABLE 33229 0 0 31
+ 033230 VARIATIONAL ANALYSIS RAW RADIANCES EVENTS (2) FLAG TABLE 33230 0 0 31
+ 033231 PRESAT SUMMARY FLAGS FLAG TABLE 33231 0 0 6
+ 033232 REPORT BLACK LIST EVENTS FLAG TABLE 33232 0 0 31
+ 033233 VARIATIONAL ANALYSIS REPORT STATUS FLAG TABLE 33233 0 0 31
+ 033234 VARIATIONAL ANALYSIS DATUM STATUS FLAG TABLE 33234 0 0 31
+ 033236 VARIATIONAL ANALYSIS DATUM EVENTS (1) FLAG TABLE 33236 0 0 31
+ 033237 VARIATIONAL ANALYSIS SYNOP DATUM EVENTS (2) FLAG TABLE 033237 0 0 31
+ 033238 VARIATIONAL ANALYSIS AIREP DATUM EVENTS (2) FLAG TABLE 033238 0 0 31
+ 033239 VARIATIONAL ANALYSIS SATOB DATUM EVENTS (2) FLAG TABLE 033239 0 0 31
+ 033240 VARIATIONAL ANALYSIS DRIBU DATUM EVENTS (2) FLAG TABLE 033240 0 0 31
+ 033241 GROSS ERROR PROBABILITY NUMERIC 3 0 10
+ 033242 GROSS ERROR INDICATOR CODE TABLE 33242 0 0 2
+ 033243 VARIATIONAL ANALYSIS TEMP DATUM EVENTS (2) FLAG TABLE 33243 0 0 31
+ 033244 VARIATIONAL ANALYSIS PILOT DATUM EVENTS (2) FLAG TABLE 033244 0 0 31
+ 033245 VARIATIONAL ANALYSIS SATEM/TOVS DATUM EVENTS (2) FLAG TABLE 33245 0 0 31
+ 033246 VARIATIONAL ANALYSIS PAOB DATUM EVENTS (2) FLAG TABLE 33246 0 0 31
+ 033247 VARIATIONAL ANALYSIS SCATTEROMETER DATUM EVENTS (2) FLAG TABLE 33247 0 0 31
+ 033248 VARIATIONAL ANALYSIS RAW RADIANCES DATUM EVENTS (2) FLAG TABLE 33248 0 0 31
+ 033249 DATUM BLACK LIST EVENTS FLAG TABLE 33249 0 0 31
+ 033250 PROBABILITY OF GROSS ERROR NUMERIC 6 0 20
+ 033251 RANGE OF POSSIBLE VALUES NUMERIC 2 0 14
+ 033252 MANUAL-AUTOMATIC QUALITY CONTROL CODE TABLE 33252 0 0 4
+ 033253 NOMINAL CONFIDENCE THRESHOLD % 0 0 7
+ 033254 WIND CORRELATION METHOD FLAG TABLE 33254 0 0 20
+ 035000 FM AND REGIONAL CODE NUMBER CODE TABLE 035000 0 0 10
+ 035001 TIME-FRAME FOR MONITORING CODE TABLE 035001 0 0 3
+ 035011 NUMBER OF REPORTS ACTUALLY RECEIVED NUMERIC 0 0 14
+ 035021 BULLETIN BEING MONITORED (TTAAII) CCITTIA5 0 0 48
+ 035022 BULLETIN BEING MONITORED (YYGGGG) CCITTIA5 0 0 48
+ 035023 BULLETIN BEING MONITORED (CCCC) CCITTIA5 0 0 32
+ 035024 BULLETIN BEING MONITORED (BBB) CCITTIA5 0 0 24
+ 035030 DISCREPANCIES IN THE AVAILABILITY OF EXPECTED DATA CODE TABLE 035030 0 0 4
+ 035031 QUALIFIER ON MONITORING RESULTS CODE TABLE 035031 0 0 7
+ 035032 CAUSE OF MISSING DATA CODE TABLE 035032 0 0 4
+ 035033 OBSERVATION AND COLLECTION DEFICIENCIES CODE TABLE 035033 0 0 7
+ 035034 STATISTICAL TRENDS FOR AVAILABILITY OF DATA (DURING THE SURVEY P CODE TABLE 035034 0 0 3
+ 049193 SAR INVERSION QC FLAGS FLAG TABLE 49193 0 0 15
+ 049194 ALTIMETER WAVE HEIGHT QC FLAFS FLAG TABLE 49194 0 0 15
+ 062190 STATISTICS APPLICATION CODE TABLE 62190 0 0 8
+ 062191 TYPE OF STATISTICS CODE TABLE 62191 0 0 8
+ 063190 APPLICATION DERIVING SUBSTITUTE OR ALTERNATIVE VALUE CODE TABLE 63190 0 0 8
diff --git a/bufrtables/B0000000000098006001.TXT b/bufrtables/B0000000000098006001.TXT
new file mode 100755
index 0000000..9a6566e
--- /dev/null
+++ b/bufrtables/B0000000000098006001.TXT
@@ -0,0 +1,985 @@
+ 000001 TABLE A: ENTRY CCITTIA5 0 0 24
+ 000002 TABLE A: DATA CATEGORY DESCRIPTION, LINE 1 CCITTIA5 0 0 256
+ 000003 TABLE A: DATA CATEGORY DESCRIPTION, LINE 2 CCITTIA5 0 0 256
+ 000005 BUFR EDITION NUMBER CCITTIA5 0 0 24
+ 000010 F DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 8
+ 000011 X DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 16
+ 000012 Y DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 24
+ 000013 ELEMENT NAME, LINE 1 CCITTIA5 0 0 256
+ 000014 ELEMENT NAME, LINE 2 CCITTIA5 0 0 256
+ 000015 UNITS NAME CCITTIA5 0 0 192
+ 000016 UNITS SCALE SIGN CCITTIA5 0 0 8
+ 000017 UNITS SCALE CCITTIA5 0 0 24
+ 000018 UNITS REFERENCE SIGN CCITTIA5 0 0 8
+ 000019 UNITS REFERENCE VALUE CCITTIA5 0 0 80
+ 000020 ELEMENT DATA WIDTH CCITTIA5 0 0 24
+ 000030 DESCRIPTOR DEFINING SEQUENCE CCITTIA5 0 0 48
+ 001001 WMO BLOCK NUMBER NUMERIC 0 0 7
+ 001002 WMO STATION NUMBER NUMERIC 0 0 10
+ 001003 WMO REGION NUMBER/GEOGRAPHICAL AREA CODE TABLE 1003 0 0 3
+ 001004 WMO REGION SUB-AREA NUMERIC 0 0 3
+ 001005 BUOY/PLATFORM IDENTIFIER NUMERIC 0 0 17
+ 001006 AIRCRAFT FLIGHT NUMBER CCITTIA5 0 0 64
+ 001007 SATELLITE IDENTIFIER CODE TABLE 1007 0 0 10
+ 001008 AIRCRAFT REGISTRATION NUMBER CCITTIA5 0 0 64
+ 001009 TYPE OF COMMERCIAL AIRCRAFT CCITTIA5 0 0 64
+ 001010 STATIONARY BUOY PLATFORM IDENTIFIER(C-MAN BUOYS) CCITTIA5 0 0 64
+ 001011 SHIP OR MOBILE LAND STATION IDENTIFIER CCITTIA5 0 0 72
+ 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM DEGREE TRUE 0 0 9
+ 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM M/S 0 0 10
+ 001014 PLATFORM DRIFT SPEED(HIGH PRECISION M/S 2 0 10
+ 001015 STATION OR SITE NAME CCITTIA5 0 0 160
+ 001018 SHORT STATION OR SITE NAME CCITTIA5 0 0 40
+ 001020 WMO REGION SUB-AREA NUMERIC 0 0 4
+ 001021 SYNOPTIC FEATURE IDENTIFIER NUMERIC 0 0 14
+ 001022 NAME OF FEATURE CCITTIA5 0 0 224
+ 001025 STORM IDENTIFIER CCITTIA5 0 0 24
+ 001026 WMO STORM NAME CCITTIA5 0 0 64
+ 001027 WMO LONG STORM NAME CCITTIA5 0 0 80
+ 001031 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE CODE TABLE 1031 0 0 16
+ 001032 GENERATING APPLICATION CODE TABLE 1032 0 0 8
+ 001033 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE CODE TABLE 1033 0 0 8
+ 001034 IDENTIFICATION OF ORIGINATING/GENERATING SUB-CENTRE CODE TABLE 1034 0 0 8
+ 001041 ABSOLUTE PLATFORM VELOCITY - FIRST COMPONENT M/S 5 -1073741824 31
+ 001042 ABSOLUTE PLATFORM VELOCITY - SECOND COMPONENT M/S 5 -1073741824 31
+ 001043 ABSOLUTE PLATFORM VELOCITY - THIRD COMPONENT M/S 5 -1073741824 31
+ 001060 AIRCRAFT REPORTING POINT(BEACON IDENTIFIER) CCITTIA5 0 0 64
+ 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64
+ 001064 RUNWAY DESIGNATOR CCITTIA5 0 0 32
+ 001075 TIDE STATION IDENTIFIER CCITTIA5 0 0 40
+ 001192 MODEL VERSION NUMBER CODE TABLE 1192 0 0 8
+ 001193 SIGMA_0 SIMULATION METHOD CODE TABLE 1193 0 0 4
+ 001194 CARRIER BALLOON/AIRCRAFT IDENTIFIER CCITTIA5 0 0 72
+ 001195 MOBIL LAND STATION IDENTIFIER CCITTIA5 0 0 72
+ 001196 CONSTANT LEVEL BALLOON IDENTIFIER CCITTIA5 0 0 72
+ 001197 RTP - PLATFORM TYPE CODE TABLE 1197 0 0 10
+ 001198 ITP - DECK ID CODE TABLE 1198 0 0 10
+ 001199 DUP - DUPLICATE STATUS CODE TABLE 1199 0 0 4
+ 001201 GENERATING APPLICATION CODE TABLE 1201 0 0 8
+ 001205 SATELLITE IDENTIFIER CODE TABLE 1205 0 0 10
+ 001208 VELOCITY OF PLATFORM, X M/S 5 -1073741824 31
+ 001209 VELOCITY OF PLATFORM, Y M/S 5 -1073741824 31
+ 001210 VELOCITY OF PLATFORM, Z M/S 5 -1073741824 31
+ 002001 TYPE OF STATION CODE TABLE 2001 0 0 2
+ 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 2002 0 0 4
+ 002003 TYPE OF MEASURING EQUIPMENT USED CODE TABLE 2003 0 0 4
+ 002004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUEMENT CODE TABLE 2004 0 0 4
+ 002005 PRECISION OF TEMPERATURE OBSERVATION K 2 0 7
+ 002011 RADIOSONDE TYPE CODE TABLE 2011 0 0 8
+ 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 2012 0 0 4
+ 002013 SOLAR AND INFRARED RADIATION CORRECTION CODE TABLE 2013 0 0 4
+ 002014 TRACKING TECHNIQUE/STATUS OF SYSTEM USED CODE TABLE 2014 0 0 7
+ 002015 RADIOSONDE COMPLETENESS CODE TABLE 2015 0 0 4
+ 002019 SATELLITE INSTRUMENTS CODE TABLE 2019 0 0 11
+ 002020 SATELLITE CLASSIFICATION CODE TABLE 2020 0 0 9
+ 002021 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 2021 0 0 9
+ 002022 SATELLITE DATA PROCESSING TECHNIQUE USED FLAG TABLE 2022 0 0 8
+ 002023 SATELLITE DERIVED WIND COMPUTATION METHOD CODE TABLE 2023 0 0 4
+ 002024 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2024 0 0 4
+ 002025 SATELLITE CHANNEL(S) USED IN COMPUTATION FLAG TABLE 2025 0 0 25
+ 002026 CROSS TRACK RESOLUTION M 2 0 12
+ 002027 ALONG TRACK RESOLUTION M 2 0 12
+ 002028 RADIOMETER IDENTIFIER CODE TABLE 2028 0 0 11
+ 002030 METHOD OF CURRENT MEASUREMENT CODE TABLE 2030 0 0 3
+ 002031 DURATION AND TIME OF CURRENT MEASUREMENT CODE TABLE 2031 0 0 5
+ 002032 INDICATOR FOR DIGITIZATION CODE TABLE 2032 0 0 2
+ 002033 METHOD OF SALINITY/DEPTH MEASUREMENT CODE TABLE 2033 0 0 3
+ 002034 DROGUE TYPE CODE TABLE 2034 0 0 5
+ 002035 CABLE LENGTH M 0 0 9
+ 002036 BUOY TYPE CODE TABLE 2036 0 0 2
+ 002037 METHOD OF TIDAL OBSERVATION CODE TABLE 2037 0 0 3
+ 002038 METHOD OF SEA-SURFACE TEMPERATURE MEASUREMENT CODE TABLE 2038 0 0 4
+ 002039 METHOD OF WET-BULB TEMPERATURE MEASUREMENT CODE TABLE 2039 0 0 3
+ 002040 METHOD OF REMOVING VELOCITY AND MOTION OF PLATFORM FROM CURRENT CODE TABLE 2040 0 0 4
+ 002041 METHOD FOR ESTIMATING REPORTS RELATED TO SYNOPTIC FEATURES CODE TABLE 2041 0 0 6
+ 002044 INDICATOR FOR METHOD OF CALCULATING SPECTRAL WAVE METHOD CODE TABLE 2044 0 0 4
+ 002045 INDICATOR FOR TYPE OF PLATFORM CODE TABLE 2045 0 0 4
+ 002046 WAVE MEASUREMENT INSTRUMENTATION CODE TABLE 2046 0 0 4
+ 002048 SATELLITE SENSOR INDICATOR CODE TABLE 2048 0 0 4
+ 002049 GEOSTATIONARY SATELLITE DATA-PROCESSING TECHNIQUE USED FLAG TABLE 2049 0 0 8
+ 002050 GEOSTATIONARY SOUNDER SATELLITE CHANNELS USED FLAG TABLE 2050 0 0 20
+ 002051 INDICATOR TO SPECIFY OBSERVING METHOD FOR EXTREME TEMPERATURES CODE TABLE 2051 0 0 4
+ 002052 GEOSTATIONARY IMAGER SATELLITE CHANNELS USED FLAG TABLE 2052 0 0 6
+ 002053 GOES-I/M BRIGHTNESS TEMPERATURE CHARACTERISTICS CODE TABLE 2053 0 0 4
+ 002054 GOES-I/M SOUNDINGS PARAMETER CHARACTERISTICS CODE TABLE 2054 0 0 4
+ 002055 GEOSTATIONARY SOUNDINGS STATISTICAL PARAMETERS CODE TABLE 2055 0 0 4
+ 002056 GEOSTATIONARY SOUNDINGS ACCURACYSTATISTICS CODE TABLE 2056 0 0 4
+ 002057 ORIGIN OF FIRST GUESS INFORMATION CODE TABLE 2057 0 0 4
+ 002058 VALID TIMES OF FIRST GUESS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2058 0 0 4
+ 002059 ORIGIN OF ANALYSIS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2059 0 0 4
+ 002060 ORIGIN OF SURFACE INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2060 0 0 4
+ 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 2061 0 0 3
+ 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 2062 0 0 4
+ 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16
+ 002064 AIRCRAFT ROLL ANGLE QUALITY CODE TABLE 2064 0 0 2
+ 002065 ACARS GROUND RECEIVING STATION CCITTIA5 0 0 40
+ 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 2070 0 0 4
+ 002100 RADAR CONSTANT dB 1 0 12
+ 002101 TYPE OF ANTENNA CODE TABLE 2101 0 0 4
+ 002102 ANTENNA HEIGHT ABOVE TOWER BASE M 0 0 8
+ 002103 RADOME FLAG TABLE 2103 0 0 2
+ 002104 ANTENNA POLARISATION CODE TABLE 2104 0 0 4
+ 002105 MAXIMUM ANTENNA GAIN dB 0 0 6
+ 002106 3-dB BEAMWIDTH DEGREE 1 0 6
+ 002107 SIDELOBE SUPPRESSION dB 0 0 6
+ 002108 CROSSPOL DISCRIMINATION(ON AXIS) dB 0 0 6
+ 002109 ANTENNA SPEED(AZIMUTH) DEGREE/S 2 0 12
+ 002110 ANTENNA SPEED(ELEVATION) DEGREE/S 2 0 12
+ 002111 RADAR INCIDENCE ANGLE DEGREE 1 0 10
+ 002112 RADAR LOOK ANGLE DEGREE 1 0 12
+ 002113 NUMBER OF AZIMUTH LOOKS NUMERIC 0 0 4
+ 002114 ANTENNA EFFECTIVE SURFACE AREA M**2 0 0 15
+ 002121 MEAN FREQUENCY Hz -8 0 7
+ 002122 FREQUENCY AGILITY RANGE Hz -6 -128 8
+ 002123 PEAK POWER W -4 0 7
+ 002124 AVERAGE POWER W -1 0 7
+ 002125 PULSE REPETITION FREQUENCY Hz -1 0 8
+ 002126 PULSE WIDTH S 7 0 6
+ 002127 RECEIVER INTERMEDIATE FREQUENCY Hz -6 0 7
+ 002128 INTERMEDIATE FREQUENCY BANDWIDTH Hz -5 0 6
+ 002129 MINIMUM DETECTABLE SIGNAL dB 0 -150 5
+ 002130 DYNAMIC RANGE dB 0 0 7
+ 002131 SENSITIVITY TIME CONTROL FLAG TABLE 2131 0 0 2
+ 002132 AZIMUTH POINTING ACCURACY DEGREE 2 0 6
+ 002133 ELEVATION POINTING ACCURACY DEGREE 2 0 6
+ 002134 ANTENNA BEAM AZIMUTH DEGREE 2 0 16
+ 002135 ANTENNA ELEVATION DEGREE 2 -9000 15
+ 002136 RANGE PROCESSED BY RANGE ATTENUATION CORRECTION M -3 0 16
+ 002140 SATELLITE RADAR BEAM AZIMUTH ANGLE DEGREE 0 0 9
+ 002141 MEASUREMENT TYPE CCITTIA5 0 0 24
+ 002142 OZONE INSTRUMENT SERIAL NUMBER/IDENTIFICATION CCITTIA5 0 0 32
+ 002143 OZON INSTRUMENT TYPE CODE TABLE 2143 0 0 7
+ 002144 LIGHT SOURCE TYPE FOR BREWER SPECTROPHOTOMETER CODE TABLE 2144 0 0 4
+ 002145 WAVE LENGTH SETTING FOR DOBSON INSTRUMENTS CODE TABLE 2145 0 0 4
+ 002146 SOURCE CONDITIONS FOR DOBSON INSTRUMENTS CODE TABLE 2146 0 0 4
+ 002150 TOVS/ATOVS/AVHRR INSTRUMENTATION CODE TABLE 2150 0 0 6
+ 002151 RADIOMETER IDENTIFIER CODE TABLE 2151 0 0 11
+ 002152 SATELLITE INSTRUMENT USED IN DATA PROCESSING FLAG TABLE 2152 0 0 31
+ 002153 SATELLITE CHANNEL CENTRE FREQUENCY Hz -8 0 26
+ 002154 SATELLITE CHANNEL BAND WIDTH Hz -8 0 26
+ 002156 PERCENTAGE OF VALID KU OCEAN RETRACKER MEASUREMENTS % 0 0 7
+ 002157 PERCENTAGE OF VALID S OCEAN RETRACKER MEASUREMENTS % 0 0 7
+ 002158 RA-2 INSTRUMENT FLAG TABLE 002158 0 0 9
+ 002159 MWR INSTRUMENT FLAG TABLE 002159 0 0 8
+ 002160 ASCENDING/DESCENDING ORBIT DESIGNATOR CODE TABLE 002160 0 0 2
+ 002163 HEIGHT ASSIGNMENT METHOD CODE TABLE 002163 0 0 4
+ 002164 TRACER CORRELATION METHOD CODE TABLE 002164 0 0 3
+ 002166 RADIANCE TYPE CODE TABLE 002166 0 0 4
+ 002167 RADIANCE COMPUTATIONAL METHOD CODE TABLE 002167 0 0 4
+ 002168 HYDROSTATIC PRESSURE OF LOWER END OF CABLE (THERMISTOR STRING) PA -3 0 16
+ 002169 ANEMOMETER TYPE CODE TABLE 002169 0 0 4
+ 002172 PRODUCT TYPE FOR RETRIEVED ATMOSPHERIC GASES CODE TABLE 2172 0 0 8
+ 002192 SAR AZIMUTH ANGLE DEGREE 0 0 9
+ 002193 1D VAR SATELLITE CHANNEL(S) USED FLAG TABLE 2193 0 0 28
+ 002194 CONSTANT LEVEL BALLOON TYPE CODE TABLE 2194 0 0 4
+ 002195 TYPE OF SATELLITE INSTRUMENTATION CODE TABLE 2195 0 0 4
+ 002196 SATELLITE CLASSIFICATION CODE TABLE 2196 0 0 9
+ 002197 SATELLITE CHANNEL CENTRE FREQUENCY Hz -8 0 26
+ 002198 SATELLITE CHANNEL BAND WIDTH Hz -8 0 26
+ 002199 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2199 0 0 4
+ 002201 SIMULATED SATELLITE INSTRUMENT FLAG TABLE 2201 0 0 4
+ 002202 SIMULATED DATA PROCESSING TECHNIQUE USED FLAG TABLE 2202 0 0 4
+ 002220 DATA PRODUCER CODE TABLE 2220 0 0 9
+ 002221 SEGMENT SIZE AT NADIR IN X DIRECTION M 0 0 18
+ 002222 SEGMENT SIZE AT NADIR IN Y DIRECTION M 0 0 18
+ 002223 TOVS/ATOVS/AVHRR CHANNEL NUMBER CODE TABLE 2223 0 0 6
+ 002231 HEIGHT ASSIGNMENT METHOD CODE TABLE 2231 0 0 4
+ 002232 TRACER CORRELATION METHOD CODE TABLE 2232 0 0 3
+ 002240 TYPE OF TERMODYNAMIC SENSING CODE TABLE 2240 0 0 8
+ 002241 TYPE OF ROCKET MOTOR CODE TABLE 2241 0 0 3
+ 002242 TYPE OF WIND SENSING EQUIPMENT CODE TABLE 2242 0 0 8
+ 002243 TERMODYNAMIC CORRECTION TECHNIQUE CODE TABLE 2243 0 0 3
+ 002244 WIND CORRECTION TECHNIQUE CODE TABLE 2244 0 0 3
+ 002245 METHOD OF REDUCING OF DATA CODE TABLE 2245 0 0 4
+ 002251 RADIANCE COMPUTATIONAL METHOD CODE TABLE 2251 0 0 4
+ 002252 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 2252 0 0 31
+ 002253 HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2253 0 0 8
+ 002254 RADIANCE TYPE CODE TABLE 2254 0 0 4
+ 004001 YEAR YEAR 0 0 12
+ 004002 MONTH MONTH 0 0 4
+ 004003 DAY DAY 0 0 6
+ 004004 HOUR HOUR 0 0 5
+ 004005 MINUTE MINUTE 0 0 6
+ 004006 SECOND SECOND 0 0 6
+ 004011 TIME INCREMENT YEAR 0 -1024 11
+ 004012 TIME INCREMENT MONTH 0 -1024 11
+ 004013 TIME INCREMENT DAY 0 -1024 11
+ 004014 TIME INCREMENT HOUR 0 -1024 11
+ 004015 TIME INCREMENT MINUTE 0 -2048 12
+ 004016 TIME INCREMENT SECOND 0 -4096 13
+ 004021 TIME PERIOD OR DISPLACEMENT YEAR 0 -1024 11
+ 004022 TIME PERIOD OR DISPLACEMENT MONTH 0 -1024 11
+ 004023 TIME PERIOD OR DISPLACEMENT DAY 0 -1024 11
+ 004024 TIME PERIOD OR DISPLACEMENT HOUR 0 -2048 12
+ 004025 TIME PERIOD OR DISPLACEMENT MINUTE 0 -2048 12
+ 004026 TIME PERIOD OR DISPLACEMENT SECOND 0 -4096 13
+ 004031 DURATION OF TIME RELATING TO FOLLOWING VALUE HOUR 0 0 8
+ 004032 DURATION OF TIME RELATING TO FOLLOWING VALUE MINUTE 0 0 6
+ 004041 TIME DIFFERENCE, UTC-LMT MINUTE 0 -1440 12
+ 004043 DAY OF THE YEAR DAY 0 0 9
+ 004053 NUMBER OF DAYS WITH PRECIPITATION EQUAL TO OR MORE THAN 1 MM NUMERIC 0 0 6
+ 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25
+ 005002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15
+ 005011 LATITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -9000000 25
+ 005012 LATITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -9000 15
+ 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16
+ 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16
+ 005030 DIRECTION (SPECTRAL) DEGREE 0 0 12
+ 005031 ROW NUMBER NUMERIC 0 0 12
+ 005033 PIXEL SIZE ON HORIZONTAL-1 M -1 0 16
+ 005034 ALONG TRACK ROW NUMBER NUMERIC 0 0 11
+ 005040 ORBIT NUMBER NUMERIC 0 0 24
+ 005041 SCAN LINE NUMBER NUMERIC 0 0 8
+ 005042 CHANNEL NUMBER NUMERIC 0 0 6
+ 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8
+ 005052 CHANNEL NUMBER INCREMENT NUMERIC 0 0 5
+ 005053 FIELD OF VIEW NUMBER INCREMENT NUMERIC 0 0 5
+ 005193 ALONG TRACK ROW NUMBER AT 50 KM NUMERIC 0 0 10
+ 005194 ALONG TRACK ROW NUMBER AT 25 KM NUMERIC 0 0 11
+ 005195 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 7
+ 005217 LOCATION OF PLATFORM, X M 2 -1073741824 31
+ 005232 DIRECTION (SPECTRAL) DEGREE 2 0 16
+ 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26
+ 006002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16
+ 006011 LONGITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -18000000 26
+ 006012 LONGITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -18000 16
+ 006021 DISTANCE M -1 0 13
+ 006030 WAVENUMBER (SPECTRAL) RAD/M 5 0 13
+ 006031 COLUMN NUMBER NUMERIC 0 0 12
+ 006033 PIXEL SIZE ON HORIZONTAL-2 M -1 0 16
+ 006034 CROSS TRACK CELL NUMBER NUMERIC 0 0 7
+ 006193 CROSS TRACK CELL NUMBER AT 50 KM NUMERIC 0 0 6
+ 006194 CROSS TRACK CELL NUMBER AT 25 KM NUMERIC 0 0 7
+ 006217 LOCATION OF PLATFORM, Y M 2 -1073741824 31
+ 006232 WAVENUMBER (SPECTRAL) RADS/M 5 0 13
+ 007001 HEIGHT OF STATION M 0 -400 15
+ 007002 HEIGHT OR ALTITUDE M -1 -40 16
+ 007003 GEOPOTENTIAL M**2/S**2 -1 -400 17
+ 007004 PRESSURE PA -1 0 14
+ 007005 HEIGHT INCREMENT M 0 -400 12
+ 007006 HEIGHT ABOVE STATION M 0 0 15
+ 007007 HEIGHT M 0 -1000 17
+ 007008 GEOPOTENTIAL M**2/S**2 0 -10000 20
+ 007021 ELEVATION DEGREE 2 -9000 15
+ 007022 SOLAR ELEVATION DEGREE 2 -9000 15
+ 007024 SATELLITE ZENITH ANGLE DEGREE 2 -9000 15
+ 007025 SOLAR ZENITH ANGLE DEGREE 2 -9000 15
+ 007061 DEPTH BELOW LAND SURFACE M 2 0 14
+ 007062 DEPTH BELOW SEA/WATER SURFACE M 1 0 17
+ 007190 HEIGHT INCREMENT M 1 -1024 12
+ 007217 LOCATION OF PLATFORM, Z M 2 -1073741824 31
+ 008001 VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8001 0 0 7
+ 008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS) CODE TABLE 8002 0 0 6
+ 008003 VERTICAL SIGNIFICANCE (SATELLITE OBSERVATIONS) CODE TABLE 8003 0 0 6
+ 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 8004 0 0 3
+ 008005 METEOROLOGICAL ATTRIBUTE SIGNIFICANCE CODE TABLE 8005 0 0 4
+ 008006 OZONE VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8006 0 0 10
+ 008007 DIMENSIONAL SIGNIFICANCE CODE TABLE 8007 0 0 4
+ 008011 METEOROLOGICAL FEATURE CODE TABLE 8011 0 0 6
+ 008012 LAND/SEA QUALIFIER CODE TABLE 8012 0 0 2
+ 008013 DAY/NIGHT QUALIFIER CODE TABLE 8013 0 0 2
+ 008014 QUALIFIER FOR RUNWAY VISUAL RANGE CODE TABLE 8014 0 0 4
+ 008016 CHANGE INDICATOR OF A TREND-TYPEFORECAST OR AN AERODROME FORECAS CODE TABLE 8016 0 0 3
+ 008017 QUALIFIER OF THE TIME WHEN THE FORECAST CHANGE IS EXPECTED CODE TABLE 8017 0 0 2
+ 008018 SEAWINDS LAND/ICE SURFACE FLAG FLAG TABLE 8018 0 0 17
+ 008020 TOTAL NUMBER OF MISSING ENTITIES(WITH RESPECT TO ACCUMULATION) NUMERIC 0 0 16
+ 008021 TIME SIGNIFICANCE CODE TABLE 8021 0 0 5
+ 008022 TOTAL NUMBER(WITH RESPECT TO ACCUMULATION OR AVERAGE) NUMERIC 0 0 16
+ 008023 FIRST ORDER STATISTICS CODE TABLE 8023 0 0 6
+ 008024 DIFFERENCE STATISTICS CODE TABLE 8024 0 0 6
+ 008025 TIME DIFFERENCE QUALIFIER CODE TABLE 8025 0 0 4
+ 008030 MANUAL ON CODES (VOL i.1 sECTION C CODE TABLE FROM WHICH DATA AR NUMERIC 0 0 13
+ 008033 METHOD OF DERIVATION OF PERCENTAGE CONFIDENCE CODE TABLE 008033 0 0 7
+ 008051 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 8051 0 0 3
+ 008052 CONDITION FOR WHICH NUMBER OF DAYS OF OCCURRENCE FOLLOWS CODE TABLE 8052 0 0 5
+ 008053 DAY OF OCCURRENCE QUALIFIER CODE TABLE 8053 0 0 2
+ 008060 SAMPLE SCANNING MODE SIGNIFICANCE CODE TABLE 8060 0 0 4
+ 008065 TYPE OF PRECIPITATION FLAG TABLE 8065 0 0 12
+ 008066 PRECIPITATION OCCURRENCE CODE TABLE 8066 0 0 3
+ 008070 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8070 0 0 4
+ 008072 PIXEL(S) TYPE CODE TABLE 8072 0 0 3
+ 008193 TIME QUALIFIER CODE TABLE 8193 0 0 6
+ 008194 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8194 0 0 4
+ 008195 DATA TYPE CODE TABLE 8195 0 0 7
+ 008200 NUMBER OF OBSERVATIONS NUMERIC 0 0 8
+ 008222 GENERATOR SIGNIFICANCE CODE TABLE 8222 0 0 4
+ 008223 LAND/ICE SURFACE FLAG FLAG TABLE 8223 0 0 7
+ 008224 LAND/SEA FRACTION NUMERIC 3 0 10
+ 010001 HEIGHT OF LAND SURFACE M 0 -400 15
+ 010002 HEIGHT M -1 -40 16
+ 010003 GEOPOTENTIAL M**2/S**2 -1 -400 17
+ 010004 PRESSURE PA -1 0 14
+ 010007 HEIGHT M 0 -1000 17
+ 010008 GEOPOTENTIAL M**2/S**2 0 -10000 20
+ 010031 IN DIRECTION OF THE NORTH POLE , DISTANCE FROM THE EARTH CENTRE m 2 -1073741824 31
+ 010040 NUMBER OF RETRIEVED LAYERS NUMERIC 0 0 10
+ 010050 STANDARD DEVIATION ALTITUDE M 2 0 16
+ 010051 PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14
+ 010052 ALTIMETER SETTING (QNH) PA -1 0 14
+ 010060 PRESSURE CHANGE PA -1 -1024 11
+ 010061 3 HOUR PRESSURE CHANGE PA -1 -500 10
+ 010062 24 HOUR PRESSURE CHANGE PA -1 -1000 11
+ 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 10063 0 0 4
+ 010070 INDICATED AIRCRAFT ALTITUDE M 0 -400 16
+ 010195 HEIGHT(HIGH ACCURACY) M 1 -4096 20
+ 010196 SOLAR ZENITH ANGLE DEGREE 2 -9000 15
+ 010197 ANEMOMETER HEIGHT M 0 0 9
+ 010200 SURFACE PRESSURE ( SP GRIB ) PA -1 0 14
+ 011001 WIND DIRECTION DEGREE TRUE 0 0 9
+ 011002 WIND SPEED M/S 1 0 12
+ 011003 U-COMPONENT M/S 1 -4096 13
+ 011004 V-COMPONENT M/S 1 -4096 13
+ 011005 W-COMPONENT PA/S 1 -512 10
+ 011006 W-COMPONENT M/S 2 -4096 13
+ 011011 WIND DIRECTION AT 10 M DEGREE TRUE 0 0 9
+ 011012 WIND SPEED AT 10 M M/S 1 0 12
+ 011013 WIND DIRECTION AT 5 M DEGREE TRUE 0 0 9
+ 011014 WIND SPEED AT 5 M M/S 1 0 12
+ 011016 EXTREME COUNTERCLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9
+ 011017 EXTREME CLOCKWISE WIND DIRECTIONOF A VARIABLE WIND DEGREE TRUE 0 0 9
+ 011021 RELATIVE VORTICITY 1/S 9 -65536 17
+ 011022 DIVERGENCE 1/S 9 -65536 17
+ 011023 VELOCITY POTENTIAL M**2/S -2 -65536 17
+ 011031 DEGREE OF TURBULENCE CODE TABLE 11031 0 0 4
+ 011032 HEIGHT OF BASE OF TURBULENCE M -1 -40 16
+ 011033 HEIGHT OF TOP OF TURBULENCE M -1 -40 16
+ 011034 VERTICAL GUST VELOCITY M/S 1 -1024 11
+ 011035 VERTICAL GUST ACCELERATION M/S**2 2 -8192 14
+ 011036 MAXIMUM DERIVED EQUIVALENT VERTICAL GUST SPEED M/S 1 0 10
+ 011041 MAXIMUM WIND SPEED (GUSTS) M/S 1 0 12
+ 011042 MAXIMUM WIND SPEED (10 MIN MEAN WIND) M/S 1 0 12
+ 011043 MAKSIMUM WIND GUST DIRECTION DEGREE TRUE 0 0 9
+ 011044 MEAN WIND DIRECTION FOR SURFACE - 1500 M (5000 FEET) DEGREE TRUE 0 0 9
+ 011045 MEAN WIND SPEED FOR SURFACE - 1500 M (5000 FEET) M/S 1 0 12
+ 011049 STANDARD DEVIATION OF WIND DIRECTION DEGREE TRUE 0 0 9
+ 011050 STANDARD DEVIATION OF HORIZONTALWIND SPEED M/S 1 0 12
+ 011051 STANDARD DEVIATION OF VERTICAL WIND SPEED M/S 1 0 8
+ 011052 FORMAL UNCERTAINTY IN WIND SPEED M/S 2 0 13
+ 011053 FORMAL UNCERTAINTY IN WIND DIRECTION DEGREE TRUE 2 0 15
+ 011061 ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW M/S 1 0 12
+ 011062 ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE M/S 1 0 12
+ 011070 RUNWAY DESIGNATOR OF THE RUNWAY AFFECTED BY WIND SHEAR(INCLUING CCITTIA5 0 0 32
+ 011071 TURBULENT VERTICAL MOMENTUM FLUX M**2/S**2 3 -128 14
+ 011072 TURBULENT VERTICAL BUOYANCY FLUX KM/S 3 -128 11
+ 011073 TURBULENT KENETIC ENERGY M**2/S**2 2 -1024 13
+ 011074 DISSIPATION ENERGY M**2/S**2 2 -1024 10
+ 011075 MEAN TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8
+ 011076 PEAK TURBULENCE INTENSITY (EDDY DISSIPATION RATE) m**(2/3)/S 2 0 8
+ 011081 MODEL WIND DIRECTION AT 10 M DEGREE TRUE 2 0 16
+ 011082 MODEL WIND SPEED AT 10 M M/S 2 0 14
+ 011192 U - COMPONENT AT 10 M M/S 1 -4096 13
+ 011193 V - COMPONENT AT 10 M M/S 1 -4096 13
+ 011194 W - COMPONENT AT 10 M M/S 1 -4096 13
+ 011195 STEADINESS OF WIND % 0 0 7
+ 011196 FRICTION VELOCITY M/S 5 0 19
+ 011201 HORIZONTAL LINE OF SIGHT COMPONENT M/S 1 -4096 13
+ 011210 1D VAR WIND SPEED RETREIVED ERRO(S) M/S 2 0 12
+ 011211 WIND SPEED INDEPENDENT ESTIMATE OF ERROR(S) M/S 2 0 12
+ 011220 FORMAL UNCERTAINTY IN WIND SPEED M/S 2 0 12
+ 011221 FORMAL UNCERTAINTY IN WIND DIRECTION DEGREE TRUE 2 0 15
+ 011230 MAXIMUM MEAN WIND SPEED M/S 1 -4096 13
+ 011231 MEAN WIND SPEED M/S 1 -4096 13
+ 011232 MINIMUM MEAN WIND SPEED M/S 1 -4096 13
+ 011233 HIGHEST GUST DURING THE 10 MINUTE PERIOD PRECEDING OBSERVATION M/S 1 -4096 13
+ 012001 TEMPERATURE/DRY BULB TEMPERATURE K 1 0 12
+ 012002 WET BULB TEMPERATURE K 1 0 12
+ 012003 DEW POINT TEMPERATURE K 1 0 12
+ 012004 DRY BULB TEMPERATURE AT 2M K 1 0 12
+ 012005 WET BULB TEMPERATURE AT 2M K 1 0 12
+ 012006 DEW POINT TEMPERATURE AT 2M K 1 0 12
+ 012007 VIRTUAL TEMPERATURE K 1 0 12
+ 012011 MAXIMUM TEMPERATURE,AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12
+ 012012 MINIMUM TEMPERATURE,AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12
+ 012013 GROUND MINIMUM TEMPERATURE PAST 12 HOURS K 1 0 12
+ 012014 MAXIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 1 0 12
+ 012015 MINIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 1 0 12
+ 012016 MAXIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 1 0 12
+ 012017 MINIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 1 0 12
+ 012030 SOIL TEMPERATURE K 1 0 12
+ 012051 STANDARD DEVIATION TEMPERATURE K 1 0 10
+ 012052 HIGHEST DAILY MEAN TEMPERATURE K 1 0 12
+ 012053 LOWEST DAILY MEAN TEMPERATURE K 1 0 12
+ 012061 SKIN TEMPERATURE K 1 0 12
+ 012062 EQUIVALENT BLACK BODY TEMPERATURE K 1 0 12
+ 012063 BRIGHTNESS TEMPERATURE K 1 0 12
+ 012064 INSTRUMENT TEMPERATURE K 1 0 12
+ 012065 STANDARD DEVIATION BRIGHTNESS TEMPERATURE K 1 0 12
+ 012071 COLDEST CLUSTER TEMPERATURE K 1 0 12
+ 012073 TEMPERATURE K 1 0 12
+ 012075 SPECTRAL RADIANCE WM**(-3)SR**(-1) -3 0 16
+ 012076 RADIANCE WM**(-2)SR**(-1) 3 0 16
+ 012130 SOIL TEMPERATURE K 2 0 16
+ 012163 BRIGHTNESS TEMPERATURE K 2 0 16
+ 012164 INSTRUMENT TEMPERATURE K 2 0 16
+ 012171 COLDEST CLUSTER TEMPERATURE K 2 0 16
+ 012193 COLDEST CLUSTER TEMPERATURE K 1 0 12
+ 012194 RADIANCE W/M**2*STER*M**(-1) 6 0 31
+ 012195 SPECTRAL RADIANCE W/M**2*STER*M**(-1) 10 0 31
+ 012196 RADIANCE W/M**2*STER 3 0 16
+ 012197 MAXIMUM TEMPERATURE AT 2M, PAST 3 HOURS K 1 0 12
+ 012198 MINIMUM TEMPERATURE AT 2M, PAST 3 HOURS K 1 0 12
+ 012199 MAXIMUM TEMPERATURE AT 2M, PAST 6 HOURS K 1 0 12
+ 012200 MINIMUM TEMPERATURE AT 2M, PAST 6 HOURS K 1 0 12
+ 012211 SOIL TEMPERATURE LEVEL 1 ( STL1 GRIB) K 2 0 16
+ 012212 SOIL TEMPERATURE LEVEL 2 ( STL2 GRIB) K 2 0 16
+ 012213 SOIL TEMPERATURE LEVEL 3 ( STL3 GRIB) K 2 0 16
+ 012214 SOIL TEMPERATURE LEVEL 4 ( STL4 GRIB) K 2 0 16
+ 013001 SPECIFIC HUMIDITY KG/KG 5 0 14
+ 013002 MIXING RATIO KG/KG 5 0 14
+ 013003 RELATIVE HUMIDITY % 0 0 7
+ 013004 VAPOUR PRESSURE PA -1 0 10
+ 013005 VAPOUR DENSITY KG/M**3 3 0 7
+ 013006 MIXING HEIGHT M -1 -40 16
+ 013011 TOTAL PRECIPITATION/TOTAL WATER EQUIVALENT KG/M**2 1 -1 14
+ 013012 DEPTH OF FRESH SNOW M 2 -2 12
+ 013013 TOTAL SNOW DEPTH M 2 -2 16
+ 013014 RAINFALL/WATER EQUIVALENT OF SNOW (AVERAGE RATE) KG/(M**2)S 4 0 12
+ 013015 SNOWFALL (AVERAGE RATE) M/S 7 0 12
+ 013016 PRECIPITABLE WATER KG/M**2 0 0 7
+ 013019 TOTAL PRECIPITATION PAST 1 HOUR KG/M**2 1 -1 14
+ 013020 TOTAL PRECIPITATION PAST 3 HOURS KG/M**2 1 -1 14
+ 013021 TOTAL PRECIPITATION PAST 6 HOURS KG/M**2 1 -1 14
+ 013022 TOTAL PRECIPITATION PAST 12 HOURS KG/M**2 1 -1 14
+ 013023 TOTAL PRECIPITATION PAST 24 HOURS KG/M**2 1 -1 14
+ 013031 EVAPOTRANSPIRATION KG/M**2 0 0 7
+ 013032 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 8
+ 013033 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 10
+ 013038 SUPERADIABATIC INDICATOR CODE TABLE 13038 0 0 2
+ 013039 TERRAIN TYPE (ICE/SNOW) CODE TABLE 13039 0 0 3
+ 013041 PASQUILL-GILLFORD STABILITY CATEGORY CODE TABLE 13041 0 0 4
+ 013042 PARCEL LIFTED INDEX (TO 500 hPa) K 0 -20 6
+ 013043 BEST LIFTED INDEX (TO 500 hPa) K 0 -20 6
+ 013051 FREQUENCY GROUP, PRECIPITATION CODE TABLE 13051 0 0 4
+ 013052 HIGHEST DAILY AMOUNT OF PRECIPITATION KG/M**2 1 -1 14
+ 013055 INTENSITY OF PRECIPITATION KG/M**2S 4 0 8
+ 013058 SIZE OF PRECIPITATING ELEMENT M 4 0 7
+ 013059 NUMBER OF FLASHES NUMERIC 0 0 7
+ 013192 RELATIVE HUMIDITY AT 2 M % 0 0 8
+ 013193 RELATIVE HUMIDITY % 0 0 8
+ 013194 TOTAL COLUMN WATER KG/M**2 2 0 11
+ 013195 RAIN RATE KG/M**2HOUR 0 0 5
+ 013196 ANTECEDENT PRECIPITATION INDEX KG/M**2 0 0 7
+ 013197 TOTAL COLUMN WATER VAPOUR KG/M**2 1 0 10
+ 013198 RAIN FLAG CODE TABLE 13198 0 0 3
+ 013199 SPECIFIC HUMIDITY AT 2 M KG/KG 5 0 14
+ 013201 CLOUD LIQUID WATER KG/KG 7 0 14
+ 013202 TYPE OF SURFACE CODE TABLE 13202 0 0 8
+ 013203 1D VAR ESTIMATE OF RAIN RATE KG/M**2*HOUR 2 0 12
+ 013204 SSMI INDEPENDENT ESTIMATE OF RAIN RATE KG/M**2*HOUR 2 0 12
+ 013205 CLOUD LIQUID WATER PATH KG/M**2 4 0 14
+ 013206 TOTAL PRECIPITATION ICE CONTENT KG/M**2 6 0 14
+ 013207 TOTAL CLOUD LIQUID WATER KG/M**2 6 0 14
+ 013208 SURFACE RAIN RATE ( INSTANTANEOUS ) KG/M**2*S 5 0 17
+ 013209 RAIN POSSIBILITY NUMERIC 0 -256 9
+ 013210 1D VAR CLOUD LIQUID WATER PATH RETRIEVED ERROR(S) KG/M**2 4 0 14
+ 013211 TOTAL PRECIPITABLE WATER INDIPENDENT ESTIMATE OF ERROR(S) KG/M**2 2 0 11
+ 013212 CLOUD LIQUID WATER PATH INDIPENDENT ESTIMATE OF ERROR(S) KG/M**2 4 0 14
+ 013221 VOLUMETRIC SOIL WATER LAYER 1 ( SWVL1 GRIB) M**3/M**3 5 0 17
+ 013222 VOLUMETRIC SOIL WATER LAYER 2 ( SWVL2 GRIB) M**3/M**3 5 0 17
+ 013223 VOLUMETRIC SOIL WATER LAYER 3 ( SWVL3 GRIB) M**3/M**3 5 0 17
+ 013224 VOLUMETRIC SOIL WATER LAYER 4 ( SWVL4 GRIB) M**3/M**3 5 0 17
+ 013230 CONVECTIVE PRECIPITATION KG/M**2 1 -1 14
+ 013231 LARGE SCALE PRECIPITATION KG/M**2 1 -1 14
+ 013233 FRACTION OF TOTAL PRECIPITATION IN SOLID FORM (SNOW) M 4 0 18
+ 013234 SNOW DEPTH (WATER EQUIVALENT SD GRIB) M 4 0 14
+ 013240 AIR DENSITY KG/M**3 3 0 10
+ 013241 CONVECTIVE AVAILABLE POTENTIAL ENERGY J/KG 1 0 17
+ 014001 LONG-WAVE RADIATION,INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12
+ 014002 LONG-WAVE RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12
+ 014003 SHORT-WAVE RADIATION,INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12
+ 014004 SHORT-WAVE RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12
+ 014011 NET LONG-WAVE RADIATION,INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12
+ 014012 NET LONG-WAVE RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12
+ 014013 NET SHORT-WAVE RADIATION,INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12
+ 014014 NET SHORT-WAVE RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12
+ 014015 NET RADIATION INTEGRATED OVER 24HOURS J/M**2 -4 -16384 15
+ 014016 NET RADIATION,INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 -16384 15
+ 014017 INSTANTANEOUS LONG-WAVE RADIATION J/M**2 -3 -2048 12
+ 014018 INSTANTANEOUS SHORT-WAVE RADIATION J/M**2 -3 -2048 12
+ 014019 SURFACE ALBEDO % 0 0 7
+ 014020 GLOBAL SOLAR RADIATION INTEGRATED OVER 24 HOURS J/M**2 -4 0 15
+ 014021 GLOBAL RADIATION INTEGRATED OVERPERIOD SPECIFIED J/M**2 -4 0 15
+ 014022 DIFFUSE SOLAR RADIATION INTEGRATED OVER 24 HOURS J/M**2 -4 0 15
+ 014023 DIFFUSE SOLAR RADIATION INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15
+ 014024 DIRECT SOLAR RADIATION INTEGRATED OVER 24 HOURS J/M**2 -4 0 15
+ 014025 DIRECT SOLAR RADIATION INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15
+ 014026 ALBEDO AT THE TOP OF CLOUD % 0 0 7
+ 014027 ALBEDO % 0 0 7
+ 014031 TOTAL SUNSHINE MINUTE 0 0 11
+ 014032 TOTAL SUNSHINE HOUR 0 0 10
+ 014033 TOTAL SUNSHINE % 0 0 9
+ 014034 SUNSHINE OVER PERIOD SPECIFIED MINUTE 0 0 11
+ 014042 BIDIRECTIONAL REFLECTANCE % 0 0 7
+ 014045 CHANNEL RADIANCE (W/m**2)*(1/sr)*cm 0 0 11
+ 014200 SURFACE SOLAR RADIATION DOWNWARDS (SSRD GRIB) W/(M**2 )*S -2 0 24
+ 015001 OZONE DOBSON 0 0 10
+ 015002 AIR MASS (SLANT PATH AT 22 KM) NUMERIC 2 0 10
+ 015003 MEASURED OZONE PARTIAL PRESSURE (SOUNDING) PA 5 0 12
+ 015004 OZONE SOUNDING CORRECTION FACTOR (CF) NUMERIC 3 0 14
+ 015005 OZONE p DOBSON 0 0 10
+ 015011 LOG 10 OF INTEGRATED ELECTRON DENSITY LOG(1/M**2) 3 14000 13
+ 015015 MAXIMUM IMAGE SPECTRAL COMPONENT BEFORE NORMALIZATION NUMERIC 0 0 31
+ 015020 INTEGRATED OZONE DENSITY KG/M**2 8 0 21
+ 015202 INTEGRATED ELECTRON DENSITY 1/M**2 3 13000 12
+ 015231 ATMOSPHERIC PATH DELAY IN SATELLITE SIGNAL M 4 0 15
+ 019001 TYPE OF SYNOPTIC FEATURE CODE TABLE 19001 0 0 6
+ 019002 EFFECTIVE RADIUS OF FEATURE M -2 0 12
+ 019003 WIND SPEED THRESHOLD M/S 0 0 8
+ 019004 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD M -2 0 12
+ 019005 DIRECTION OF MOTION OF FEATURE DEGREE TRUE 0 0 9
+ 019006 SPEED OF MOTION OF FEATURE M/S 2 0 14
+ 019007 EFFECTIVE RADIUS OF FEATURE M -3 0 12
+ 019008 VERTICAL EXTENT OF CIRCULATION CODE TABLE 19008 0 0 3
+ 019009 EFFECTIVE RADIUS WITH RESPECT TOWIND SPEEDS ABOVE TRESHOLD M -3 0 12
+ 020001 HORIZONTAL VISIBILITY M -1 0 13
+ 020002 VERTICAL VISIBILITY M -1 0 7
+ 020003 PRESENT WEATHER CODE TABLE 20003 0 0 9
+ 020004 PAST WEATHER (1) CODE TABLE 20004 0 0 5
+ 020005 PAST WEATHER (2) CODE TABLE 20005 0 0 5
+ 020009 GENERAL WEATHER INDICATOR CODE TABLE 20009 0 0 4
+ 020010 CLOUD COVER (TOTAL) % 0 0 7
+ 020011 CLOUD AMOUNT CODE TABLE 20011 0 0 4
+ 020012 CLOUD TYPE CODE TABLE 20012 0 0 6
+ 020013 HEIGHT OF BASE OF CLOUD M -1 -40 11
+ 020014 HEIGHT OF TOP OF CLOUD M -1 -40 11
+ 020015 PRESSURE AT BASE OF CLOUD PA -1 0 14
+ 020016 PRESSURE AT TOP OF CLOUD PA -1 0 14
+ 020017 CLOUD TOP DESCRIPTION CODE TABLE 20017 0 0 4
+ 020018 TENDENCY OF RUNWAY VISUAL RANGE CODE TABLE 20018 0 0 2
+ 020019 SIGNIFICANT PRESENT OF FORECAST WEATHER CCITTIA5 0 0 72
+ 020020 SIGNIFICANT RECENT WEATHER PHENOMENA CCITTIA5 0 0 32
+ 020031 ICE DEPOSIT (THICKNESS) M 2 0 7
+ 020032 RATE OF ICE ACCRETION CODE TABLE 20032 0 0 3
+ 020033 CAUSE OF ICE ACCRETION FLAG TABLE 20033 0 0 4
+ 020034 SEA ICE CONCETRATION CODE TABLE 20034 0 0 5
+ 020035 AMOUNT AND TYPE OF ICE CODE TABLE 20035 0 0 4
+ 020036 ICE SITUATION CODE TABLE 20036 0 0 5
+ 020037 ICE DEVELOPMENT CODE TABLE 20037 0 0 5
+ 020038 BEARING OF ICE EDGE DEGREE TRUE 0 0 12
+ 020039 ICE DISTANCE M -1 0 13
+ 020041 AIRFRAME ICING CODE TABLE 20041 0 0 4
+ 020051 AMOUNT OF LOW CLOUDS % 0 0 7
+ 020052 AMOUNT OF MIDDLE CLOUDS % 0 0 7
+ 020053 AMOUNT OF HIGH CLOUDS % 0 0 7
+ 020061 RUNWAY VISUAL RANGE (RVR) M 0 0 12
+ 020062 STATE OF GROUND (WITH OR WITHOUTSNOW CODE TABLE 20062 0 0 5
+ 020063 SPECIAL PHENOMENA CODE TABLE 20063 0 0 10
+ 020081 CLOUD AMOUNT IN SEGMENT % 0 0 7
+ 020082 AMOUNT SEGMENT CLOUD FREE % 0 0 7
+ 020090 SPECIAL CLOUDS CODE TABLE 20090 0 0 4
+ 020192 SPECIAL PHENOMENA CODE TABLE 20192 0 0 14
+ 020193 CLOUD AMOUNT IN SEGMENT % 0 0 7
+ 020194 AMOUNT OF SEGMENT CLOUD FREE % 0 0 7
+ 020215 PRESSURE AT THE BASE OF CLOUD PA -1 0 14
+ 020250 CALCULATED SURFACE TYPE CODE TABLE 20250 0 0 5
+ 020251 ICE AGE CODE TABLE 20251 0 0 3
+ 020252 ICE EDGE CODE TABLE 20252 0 0 3
+ 020253 SURFACE TYPE CODE TABLE 20253 0 0 3
+ 020254 ICE CONCENTRATION % 0 0 7
+ 021001 HORIZONTAL REFLECTIVITY dB 0 -64 7
+ 021002 VERTICAL REFLECTIVITY dB 0 -64 7
+ 021003 DIFFERENTIAL REFLECTIVITY dB 1 -5 7
+ 021005 LINEAR DEPOLARISATION RATIO dB 0 -65 6
+ 021006 CIRCULAR DEPOLARIZATION RATIO dB 0 -65 6
+ 021011 DOPPLER MEAN VELOCITY IN X-DIRECTION M/S 0 -128 8
+ 021012 DOPPLER MEAN VELOCITY IN Y-DIRECTION M/S 0 -128 8
+ 021013 DOPPLER MEAN VELOCITY IN Z-DIRECTION(VZ) M/S 0 -128 8
+ 021014 DOPPLER MEAN VELOCITY RADIAL M/S 1 -4096 13
+ 021017 DOPPLER VELOCITY SPECTRAL WIDTH M/S 1 0 8
+ 021021 ECHO TOPS M -3 0 4
+ 021030 SIGNAL TO NOISE RATIO dB 0 -32 8
+ 021031 VERTICALLY INTEGRATED LIQUID-WATER CONTENT KG/M**2 0 0 7
+ 021036 RADAR RAINFALL INTENSITY M/S 7 0 12
+ 021041 BRIGHT-BAND HEIGHT M -2 0 8
+ 021051 SIGNAL POWER ABOVE 1 mW dB 0 -256 8
+ 021062 BACKSCATTER dB 2 -5000 13
+ 021063 RADIOMETRIC RESOLUTION (NOISE VALUE) % 1 0 10
+ 021064 CLUTTER NOISE ESTIMATE NUMERIC 0 0 8
+ 021065 MISSING PACKET COUNTER NUMERIC 0 -127 8
+ 021066 WAVE SCATTEROMETER PRODUCT CONFIDENCE FLAG TABLE 21066 0 0 12
+ 021067 WIND PRODUCT CONFIDENCE DATA FLAG TABLE 21067 0 0 13
+ 021068 RADAR ALTIMETER PRODUCT CONFIDENCE DATA FLAG TABLE 21068 0 0 8
+ 021069 SST PRODUCT CONFIDENCE DATA FLAG TABLE 21069 0 0 10
+ 021070 SST PRODUCT CONFIDENCE DATA (SADIST-2) FLAG TABLE 21070 0 0 23
+ 021071 PEAKINESS NUMERIC 0 0 16
+ 021072 SATELLITE ALTIMETER CALIBRATION STATUS FLAG TABLE 21072 0 0 4
+ 021073 SATELLITE ALTIMETER INSTRUMENT MODE FLAG TABLE 21073 0 0 9
+ 021075 SPECTRAL INTENSITY NUMERIC 0 0 8
+ 021076 REPRESENTATION OF INTENSITIES CODE TABLE 21076 0 0 3
+ 021077 ALTITUDE CORRECTION (IONOSPHERE) M 3 0 14
+ 021078 ALTITUDE CORRECTION (DRY TROPOSPHERE) M 3 0 9
+ 021079 ALTITUDE CORRECTION (WET TROPOSPHERE) M 3 2000 10
+ 021080 ALTITUDE CORRECTION (CALIBRATIONCONSTANT) M 3 0 11
+ 021081 OPEN LOOP CORRECTION (HEIGHT-TIME LOOP) M 3 0 10
+ 021082 OPEN LOOP CORRECTION (AUTO GAIN CONTROL) dB 3 -3000 14
+ 021085 ATSR SEA SURFACE TEMPERATURE ACROSS-TRACK BAND NUMBER NUMERIC 0 0 4
+ 021091 RADAR SIGNAL DOPPLER SPECTRUM 0TH MOMENT dB 0 -100 8
+ 021092 RASS SIGNAL DOPPLER SPECTRUM 0TH MOMENT, REFERRING TO RASS SIGNA dB 0 -100 8
+ 021101 NUMBER OF VECTOR AMBIGUITIES NUMERIC 0 0 3
+ 021102 INDEX OF SELECTED WIND VECTOR NUMERIC 0 0 3
+ 021103 TOTAL NUMBER OF SIGMA-0 MEASUREMENTS NUMERIC 0 0 5
+ 021104 LIKELIHOOD COMPUTED FOR WIND SOLUTION NUMERIC 3 -30000 15
+ 021105 NORMALIZED RADAR CROSS SECTION dB 2 -10000 14
+ 021106 Kp VARIANCE COEFFICIENT (ALPHA) NUMERIC 3 0 14
+ 021107 Kp VARIANCE COEFFICIENT (BETA) NUMERIC 8 0 16
+ 021109 SEAWINDS WIND VECTOR CELL QUALITY FLAG FLAG TABLE 21109 0 0 17
+ 021110 NUMBER OF INNER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6
+ 021111 NUMBER OF OUTER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6
+ 021112 NUMBER OF INNER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6
+ 021113 NUMBER OF OUTER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6
+ 021114 Kp VARIANCE COEFFICIENT (GAMMA) dB 3 -140000 18
+ 021115 SEAWINDS SIGMA-0 QUALITY FLAG FLAG TABLE 21115 0 0 17
+ 021116 SEAWINDS SIGMA-0 MODE FLAG FLAG TABLE 21116 0 0 17
+ 021117 SIGMA-0 VARIANCE QUALITY CONTROL NUMERIC 2 0 16
+ 021118 ATTENUATION CORRECTION ON SIGMA-0 dB 2 -10000 14
+ 021119 WIND SCATTEROMETER GEOPHYSICAL MODEL FUNCTION CODE TABLE 21119 0 0 6
+ 021120 SEAWINDS PROBABILITY OF RAIN NUMERIC 3 0 10
+ 021121 SEAWINDS NOF RAIN INDEX NUMERIC 0 0 8
+ 021122 ATTENUATION CORRECTION ON SIGMA-0 (FROM Tb) dB 2 -10000 14
+ 021123 SEAWINDS NORMALIZED RADAR CROSS SECTION dB 2 -30000 15
+ 021192 RADAR BACK SCATTER dB 2 -5000 13
+ 021193 NOISE FIGURE % 0 0 7
+ 021194 BACKGROUND NOISE LEVEL NUMERIC 0 0 8
+ 021195 MISSING PACKET COUNTER NUMERIC 0 -127 8
+ 021196 UWA PRODUCT CONFIDENCE FLAG TABLE 21196 0 0 12
+ 021197 UWI PRODUCT CONFIDENCE FLAG TABLE 21197 0 0 12
+ 021198 URA PRODUCT CONFIDENCE FLAG TABLE 21198 0 0 8
+ 021199 UAT PRODUCT CONFIDENCE FLAG TABLE 21199 0 0 7
+ 021200 MWI PRODUCT CONFIDENCE FLAG TABLE 21200 0 0 15
+ 021201 PEAKINESS NUMERIC 0 0 16
+ 021202 ALTIMETER CALIBRATION STATUS FLAG TABLE 21202 0 0 4
+ 021203 ALTIMETER INSTRUMENT MODE FLAG TABLE 21203 0 0 9
+ 021204 MULTI/SINGLE VIEW DIFFERENCE K 2 -512 10
+ 021205 SPECTRAL INTENSITY NUMERIC 0 0 8
+ 021206 REPRESENTATION OF INTENSITY CODE TABLE 21206 0 0 3
+ 021207 ALTITUDE CORRECTION (IONOSPHERE) M 3 0 14
+ 021208 ALTITUDE CORRECTION (DRY TROPOSPHERE) M 3 0 9
+ 021209 LTITUDE CORRECTION (WET TROPOSPHERE) M 3 2000 10
+ 021210 ALTITUDE CORRECTION (CALIBRATION CONSTANT) M 3 0 11
+ 021211 OPEN LOOP CORRECTION (HTL) M 3 0 10
+ 021212 OPEN LOOP CORRECTION (AGC) dB 3 -3000 14
+ 021213 AMBIGUITY REMOVAL CONFIDENCE % 0 0 7
+ 021214 UAT QUALITY SUMMARY CODE TABLE 21214 0 0 3
+ 021215 UAT ACROSS-TRACK BAND NO. NUMERIC 0 0 4
+ 021222 DOPPLER SPECTRUM 0 TH MOMENT (AMPLITUDE) dB 0 0 7
+ 021225 PRESCAT PRODUCT CONFIDENCE FLAG TABLE 21225 0 0 6
+ 021226 BACKSCATER DISTANCE NUMERIC 1 -4096 13
+ 021230 NUMBER OF VECTOR AMBIGUITIES NUMERIC 0 0 3
+ 021231 INDEX OF SELECTED WIND VECTOR NUMERIC 0 0 3
+ 021232 TOTAL NMBER OF SIGMA-0 MEASUREMENTS NUMERIC 0 0 5
+ 021233 NUMBER OF SIGMA-0 USABLE FOR WIND NUMERIC 0 0 5
+ 021234 LIKELIHOOD COMPUTED FOR SOLUTION NUMERIC 1 -10000 14
+ 021235 WIND VECTOR CELL QUALITY FLAG FLAG TABLE 21235 0 0 3
+ 021236 NUMBER OF FORE-BEAM SIGMA-0 NUMERIC 1 0 6
+ 021237 NUMBER OF MID-BEAM V-POL SIGMA-0 NUMERIC 1 0 6
+ 021238 NUMBER OF MID-BEAM H-POL SIGMA-0 NUMERIC 1 0 6
+ 021239 NUMBER OF AFT-BEAM SIGMA-0 NUMERIC 1 0 6
+ 021240 NORMALIZED RADAR CROSS SECTION NUMERIC 2 -10000 14
+ 021241 Kp VARIANCE COEFFICIENT (ALPHA) NUMERIC 5 0 14
+ 021242 Kp VARIANCE COEFFICIENT (BETHA) NUMERIC 6 0 16
+ 021243 Kp VARIANCE COEFFICIENT (GAMMA) NUMERIC 6 0 16
+ 021244 SIGMA-0 QUALITY FLAG FLAG TABLE 21244 0 0 15
+ 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9
+ 022002 DIRECTION OF WIND WAVES DEGREE TRUE 0 0 9
+ 022003 DIRECTION OF SWELL WAVES DEGREE TRUE 0 0 9
+ 022004 DIRECTION OF CURRENT DEGREE TRUE 0 0 9
+ 022011 PERIOD OF WAVES S 0 0 6
+ 022012 PERIOD OF WIND WAVES S 0 0 6
+ 022013 PERIOD OF SWELL WAVES S 0 0 6
+ 022021 HEIGHT OF WAVES M 1 0 10
+ 022022 HEIGHT OF WIND WAVES M 1 0 10
+ 022023 HEIGHT OF SWELL WAVES M 1 0 10
+ 022025 STANDARD DEVIATION WAVE HEIGHT M 2 0 10
+ 022026 STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT M 2 0 10
+ 022031 SPEED OF CURRENT M/S 2 0 13
+ 022037 TIDAL ELEVATION WITH RESPECT TO NATIONAL LAND DATUM M 3 -10000 15
+ 022038 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 3 -10000 15
+ 022039 METEOROLOGICAL RESIDUAL TIDAL ELEVATION(SURGE OF OFFSET) M 3 -5000 12
+ 022040 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OF OFFSET) M 3 -5000 14
+ 022041 SEA-SURFACE TEMPERATURE(15-DAY RUNNING MEAN) K 1 0 12
+ 022042 SEA/WATER TEMPERATURE K 1 0 12
+ 022043 SEA/WATER TEMPERATURE K 2 0 15
+ 022044 SOUND VELOCITY M/S 1 0 14
+ 022050 STANDARD DEVIATION SEA SURFACE TEMPERATURE K 2 0 8
+ 022061 STATE OF THE SEA CODE TABLE 22061 0 0 4
+ 022062 SALINITY %. 2 0 14
+ 022063 TOTAL WATER DEPTH M 0 0 14
+ 022067 INSTRUMENT TYPE FOR WATER TEMPERATURE PROFILE MEASUREMENT CODE TABLE 22067 0 0 10
+ 022068 WATER TEMPERATURE PROFILE RECORDER TYPES CODE TABLE 22068 0 0 7
+ 022070 SIGNIFICANT WAVE HEIGHT M 2 0 13
+ 022071 SPECTRAL PEAK WAVE PERIOD S 1 0 9
+ 022072 SPECTRAL PEAK WAVE LENGTH M 0 0 13
+ 022073 MAXIMUM WAVE LENGTH M 2 0 13
+ 022074 AVERAGE WAVE PERIOD S 1 0 9
+ 022075 AVERAGE WAVE LENGTH M 0 0 13
+ 022076 DIRECTION FROM WHICH DOMINANT WAVES ARE COMING DEGREE TRUE 0 0 9
+ 022077 DIRECTIONAL SPREAD OF DOMINANT WAVE DEGREE 0 0 9
+ 022078 DURATION OF WAVE RECORD S 0 0 12
+ 022079 LENGTH OF WAVE RECORD M 0 0 16
+ 022080 WAVEBAND CENTRAL FREQUENCY Hz 3 0 10
+ 022081 WAVEBAND CENTRAL WAVE NUMBER 1/M 5 0 13
+ 022082 MAXIMUM NON-DIRECTIONAL SPECTRALWAVE DENSITY M**2S 2 0 20
+ 022083 MAXIMUM NON-DIRECTIONAL SPECTRALWAVE NUMBER M**3 2 0 20
+ 022084 BAND CONTAINING MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE DENSITY NUMERIC 0 0 7
+ 022085 SPECTRAL WAVE DENSITY RATIO NUMERIC 0 0 7
+ 022086 MEAN DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9
+ 022087 PRINCIPAL DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9
+ 022088 FIRST NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7
+ 022089 SECOND NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7
+ 022090 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S 2 0 20
+ 022091 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**3 2 0 20
+ 022092 DIRECTIONAL SPECTRAL ESTIMATE BYWAVE FREQUENCY M**2S/RAD 2 0 20
+ 022093 DIRECTIONAL SPECTRAL ESTIMATE BYWAVE NUMBER M**4 2 0 20
+ 022094 TOTAL NUMBER OF WAVE BANDS NUMERIC 0 0 7
+ 022095 DIRECTIONAL SPREAD OF INDIVIDUALWAVES DEGREE 0 0 8
+ 022096 SPECTRAL BAND WIDTH 1/S 3 0 4
+ 022097 MEAN WAVELENGTH > 731 M OF IMAGE SPECTRUM AT LOW WAVE NUMBERS M 0 0 14
+ 022098 WAVELENGTH SPREAD (WAVELENGTH > 731 M) AT LOW WAVE NUMBERS M 0 0 14
+ 022099 MEAN DIRECTION AT LOW WAVE NUMBERS (WAVELENGTH > 731 M) DEGREE TRUE 0 0 9
+ 022100 DIRECTION SPREAD AT LOW WAVE NUMBERS (WAVELENGTH > 731 M) DEGREE 0 0 9
+ 022101 TOTAL ENERGY (WAVELENGTH > 731 M) AT LOW WAVE NUMBERS NUMERIC 0 0 31
+ 022120 TIDE STATION AUTOMATED WATER LEVEL CHECK CODE TABLE 22120 0 0 5
+ 022121 TIDE STATION MANUAL WATER LEVEL CHECK CODE TABLE 22121 0 0 5
+ 022122 TIDE STATION AUTOMATED METEOROLOGICAL DATA CHECK CODE TABLE 22122 0 0 5
+ 022123 TIDE STATION MANUAL METEOROLOGICAL DATA CHECK CODE TABLE 22123 0 0 5
+ 022191 SPECTRAL DENSITY M**2*S/RAD 2 0 20
+ 022192 SPECTRAL PERIOD S 2 0 13
+ 022193 MEAN WAVENUMBER 1/M 5 0 15
+ 022194 PEAK WAVENUMBER 1/M 5 0 15
+ 022195 MEAN WAVE PROPAGATION DIRECTION DEGREE 1 0 13
+ 022196 PEAK WAVE PROPAGATION DIRECTION DEGREE 1 0 13
+ 022197 DIRECTION SPREAD DEGREE 1 0 13
+ 022198 VARIANCE SPECTRAL DENSITY M**2*S/RAD 4 0 18
+ 022199 CORRELATION COEFF OF SIMULATED FG AND OBSERVED SAR SPECTRUM NUMERIC 4 -10000 15
+ 022200 CORRELATION COEFF OF SIMULATED BF AND OBSERVED SAR SPECTRUM NUMERIC 4 -10000 15
+ 022201 CORRELATION COEFF OF OCEAN WAVE FG AND EXTRACTED WAVE SPECTRUM NUMERIC 4 -10000 15
+ 022202 ERROR BETWEEN FIRST GUESS AND OBSERVED SAR NUMERIC 5 0 21
+ 022203 ERROR BETWEEN SIMULATED AND OBSERVED SAR NUMERIC 5 0 21
+ 022204 MEAN PERIOD OF WAVES SECOND 2 0 13
+ 022205 SPECTRAL DENSITY M**2*S/RAD 4 0 25
+ 022206 PEAK PERIOD OF WAVES SECOND 2 0 13
+ 022207 MEAN WAVE PERIOD S 1 0 10
+ 022208 PEAK PERIOD OF 1D SPECTRA S 1 0 10
+ 022209 COEFICIENT OF DRAG WITH WAVES NUMERIC 6 0 13
+ 022210 MEAN SQUARE SLOPE OF WAVES NUMERIC 4 -10000 14
+ 022211 COEFICIENT OF DRAG WITH WAVES NUMERIC 6 0 17
+ 022243 STANDARD DEVIATION SIGNIFICANT WAVE HEIGHT M 2 0 10
+ 023001 ACCIDENT EARLY NOTIFICATION-ARTICLE APPLICABLE CODE TABLE 23001 0 0 3
+ 023002 ACTIVITY OR FACILITY INVOLVED ININCIDENT CODE TABLE 23002 0 0 5
+ 023003 TYPE OF RELEASE CODE TABLE 23003 0 0 3
+ 023004 COUNTERMEASURES TAKEN NEAR BORDER CODE TABLE 23004 0 0 3
+ 023005 COUSE OF INCIDENT CODE TABLE 23005 0 0 2
+ 023006 INCIDENT SITUATION CODE TABLE 23006 0 0 3
+ 023007 CHARACTERISTICS OF RELEASE CODE TABLE 23007 0 0 3
+ 023008 STATE OF CURRENT RELEASE CODE TABLE 23008 0 0 2
+ 023009 STATE OF EXPECTED RELEASE CODE TABLE 23009 0 0 2
+ 023016 POSSIBILITY OF SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT CODE TABLE 23016 0 0 2
+ 023017 FLOW DISCHARGE OF MAJOR RECEPIENT M**3/S 6 0 20
+ 023018 RELEASE BEHAVIOUR OVER TIME CODE TABLE 23018 0 0 3
+ 023019 ACTUAL RELEASE HEIGHT M 0 -15000 17
+ 023021 EFFECTIVE RELEASE HEIGHT M 0 -15000 17
+ 023022 DISTANCE OF RELEASE POINT OR SITE OF INCIDENT M 0 0 24
+ 023023 MAIN TRANSPORT SPEED IN THE ATMOSPHERE M/S 1 0 12
+ 023024 MAIN TRANSPORT SPEED WATER M/S 2 0 13
+ 023025 MAIN TRANSPORT SPEED IN GROUND WATER M/S 2 0 13
+ 023027 MAIN TRANSPORT DIRECTION IN THE ATMOSPHERE DEGREE TRUE 0 0 9
+ 023028 MAIN TRANSPORT DIRECTION IN WATER DEGREE TRUE 0 0 9
+ 023029 MAIN TRANSPORT DIRECTION IN GROUND WATER DEGREE TRUE 0 0 9
+ 023031 POSSIBILITY THAT PLUME WILL ENCOUNTER PRECIPITATION IN STATE IN CODE TABLE 23031 0 0 2
+ 023032 PLUME WILL ENCOUNTER CHANGE IN WIND DIRECTION AND/OR SPEED FLAG CODE TABLE 23032 0 0 2
+ 024001 ESTIMATE OF AMOUNT OF RADIOACTIVITY RELEASED UP TO SPECIFIED TIM Bq -11 0 28
+ 024002 ESTIMATED MAXIMUM POTENTIAL RELEASE Bq -11 0 28
+ 024003 COMPOSITION OF RELEASE CODE TABLE 24003 0 0 5
+ 024004 ELEMENT NAME CCITTIA5 0 0 16
+ 024005 ISOTOPE MASS NUMERIC 0 0 9
+ 024011 DOSE mSv 2 0 32
+ 024012 TRAJECTORY DOSE (DEFINED LOCATION AND EXPECTED TIME) mSv 2 0 32
+ 024013 GAMMA DOSE IN AIR ALONG THE MAINTRANSPORT PATH(DEFINED LOCATION mSv 2 0 32
+ 024021 AIR CONCENTRATION(OF NAMED ISOTOPE TYPE INCLUDING GROSS BETA Bq/M**3 2 0 32
+ 024022 CONCENTRATION IN PRECIPITATION ( OF NAMED ISOTOPE TYPE) Bq/L 2 0 32
+ 025001 RANGE-GATE LENGTH M -1 0 6
+ 025002 NUMBER OF GATES AVERAGED NUMERIC 0 0 4
+ 025003 NUMBER OF INTEGRATED PULSES NUMERIC 0 0 8
+ 025004 ECHO PROCESSING CODE TABLE 25004 0 0 2
+ 025005 ECHO INTEGRATION CODE TABLE 25005 0 0 2
+ 025006 Z TO R CONVERSION CODE TABLE 25006 0 0 3
+ 025007 Z TO R CONVERSION FACTOR NUMERIC 0 0 12
+ 025008 Z TO R CONVERSION EXPONENT NUMERIC 2 0 9
+ 025009 CALIBRATION METHOD FLAG TABLE 25009 0 0 4
+ 025010 CLUTTER TREATMENT CODE TABLE 25010 0 0 4
+ 025011 GROUND ACCULTATION CORRECTION(SCREENING) CODE TABLE 25011 0 0 2
+ 025012 RANGE ATTENUATION CORRECTION CODE TABLE 25012 0 0 2
+ 025013 BRIGHT-BAND CORRECTION FLAG TABLE 25013 0 0 2
+ 025014 AZIMUTH CLUTTER CUT-OFF NUMERIC 0 0 12
+ 025015 RADOM ATTENUATION CORRECTION FLAG TABLE 25015 0 0 2
+ 025016 CLEAR-AIR ATTENUATION CORRECTION dB/M 5 0 6
+ 025017 PRECIPITATION ATTENUATION CORRECTION FLAG TABLE 25017 0 0 2
+ 025018 A TO Z LAW FOR ATTENUATION FACTOR NUMERIC 7 0 6
+ 025019 A TO Z LAW FOR ATTENUATION EXPONENT NUMERIC 2 0 7
+ 025020 MEAN SPEED ESTIMATION CODE TABLE 25020 0 0 2
+ 025021 WIND COMPUTATION EHANCEMENT FLAG TABLE 25021 0 0 8
+ 025030 RUNNING MEAN SEA-SURFACE TEMPERATURE USAGE CODE TABLE 25030 0 0 2
+ 025032 WIND PROFILER MODE INFORMATION CODE TABLE 25032 0 0 2
+ 025033 WIND PROFILER SUBMODE INFORMATION CODE TABLE 25033 0 0 2
+ 025034 WIND PROFILER QUALITY CONTROL TEST RESULTS FLAG TABLE 25034 0 0 4
+ 025040 CO2 WIND PRODUCT DERIVATION CODE TABLE 25040 0 0 4
+ 025041 MOVING PLATFORM DIRECTION REPORTING METHOD CODE TABLE 25041 0 0 2
+ 025042 MOVING PLATFORM SPEED REPORTING CODE TABLE 25042 0 0 2
+ 025043 WAVE SAMPLING INTERVAL (TIME) S 4 0 15
+ 025044 WAVE SAMPLING INTERVAL (SPACE) M 2 0 14
+ 025045 HIRS CHANNEL COMBINATION FLAG TABLE 25045 0 0 21
+ 025046 MSU CHANNEL COMBINATION FLAG TABLE 25046 0 0 5
+ 025047 SSU CHANNEL COMBINATION FLAG TABLE 25047 0 0 4
+ 025048 AMSU-A CHANNEL COMBINATION FLAG TABLE 25048 0 0 16
+ 025049 AMSU-B CHANNEL COMBINATION FLAG TABLE 25049 0 0 6
+ 025050 PRINCIPAL COMPONENT SCORE NUMERIC 4 -131072 18
+ 025051 AVHRR CHANNEL COMBINATION FLAG TABLE 25051 0 0 7
+ 025053 OBSERVATION QUALITY FLAG TABLE 25053 0 0 12
+ 025060 SOFTWARE INDENTIFICATION NUMERIC 0 0 14
+ 025070 MAJOR FRAME COUNT NUMERIC 0 0 4
+ 025071 FRAME COUNT NUMERIC 0 0 5
+ 025075 SATELLITE ANTENNA CORRECTIONS VERSION NUMBER NUMERIC 0 0 5
+ 025076 LOG_10 OF (TEMPERATURE-RADIANCE CENTRAL WAVENUMBER) FOR ATOVS LOG (1/M) 8 0 30
+ 025077 BANDWIDTH CORRECTION COEFFICIENT 1 for ATOVS NUMERIC 5 -100000 18
+ 025078 BANDWIDTH CORRECTION COEFFICIENT 2 FOR ATOVS NUMERIC 5 0 17
+ 025079 ALBEDO-RADIANCE SOLAR FILTERED IRRADIANCE FOR ATOVS W/M**2 4 0 24
+ 025080 ALBEDO-RADIANCE EQUIVALENT FILTER WIDTH FOR ATOVS M 10 0 14
+ 025085 FRACTION OF CLEAR PIXELS IN HIRS FOV NUMERIC 0 0 7
+ 025091 STRUCTURE CONSTANT OF THE REFRACTION INDEX (CN2) dB 3 -18192 13
+ 025092 ACOUSTIC PROPAGATION VELOCITY M/S 2 28000 14
+ 025193 ATTENUATION CORRECTION ON SIGMA0 dB 3 0 14
+ 025194 MAJOR FRAME COUNT NUMERIC 0 0 4
+ 025197 ANTENNA CORRECTIONS VERSION NUMBER NUMERIC 0 0 5
+ 025198 LOG (TEMP-RAD CENTRAL WAVE NUMBER) 1/M 8 0 30
+ 025199 BANDWIDTH CORRECTION COEFFICIENT 1 NUMERIC 4 -10000 15
+ 025200 BANDWIDTH CORRECTION COEFFICIENT 2 NUMERIC 5 0 17
+ 025201 ALBEDO-RAD SOLAR FILTERED IRRADIANCE NUMERIC 4 0 24
+ 025202 ALBEDO-RAD EQUIVALENT FILTER WIDTH NUMERIC 10 0 14
+ 025203 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 25081 0 0 31
+ 025204 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 25082 0 0 31
+ 025205 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 25083 0 0 31
+ 025206 FOV QUALITY FLAGS FOR ATOVS FLAG TABLE 25084 0 0 31
+ 026001 PRINCIPAL TIME OF DAILY READING IN UTC OF MAXIMUM TEMPERATURE HOUR 1 0 12
+ 026002 PRINCIPAL TIME OF DAILY READING IN UTC OF MINIMUM TEMPERATURE HOUR 1 0 12
+ 026003 TIME DIFFERENCE MINUTE 0 -1440 12
+ 026193 YEAR YEAR 0 0 12
+ 026194 MONTH MONTH 0 0 4
+ 026195 DAY DAY 0 0 6
+ 026196 HOUR HOUR 0 0 5
+ 026197 MINUTE MINUTE 0 0 6
+ 026198 SECOND SECOND 0 0 6
+ 026200 LOCATION WITHIN ASSIMILATION WINDOW IN TIME NUMERIC 6 0 20
+ 026201 HOURS INCLUDED FLAG TABLE 26201 0 0 26
+ 027001 LATITUDE(HIGH ACCURACY) DEGREE 5 -9000000 25
+ 027002 LATITUDE(COARSE ACCURACY) DEGREE 2 -9000 15
+ 027003 ALTERNATE LATITUDE DEGREE 2 -9000 15
+ 027020 SATELLITE LOCATION COUNTER NUMERIC 0 0 16
+ 027021 SATELLITE SUBLOCATION DIMENSION NUMERIC 0 0 16
+ 027031 IN DIRECTION OF 0 DEGREES LONGITUDE, DISTANCE FROM THE EARTH'S C M 2 -1073741824 31
+ 027193 SOLAR AZIMUTH DEGREE TRUE 2 0 16
+ 028001 LONGITUDE(HIGH ACCURACY) DEGREE 5 -18000000 26
+ 028002 LONGITUDE(COARSE ACCURACY) DEGREE 2 -18000 16
+ 028003 ALTERNATE LONGITUDE DEGREE 2 -18000 16
+ 028031 IN DIRECTION OF 90 DEGREES EAST,DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31
+ 029001 PROJECTION TYPE CODE TABLE 29001 0 0 3
+ 029002 CO-ORDINATE GRID TYPE CODE TABLE 29002 0 0 3
+ 030001 PIXEL VALUE(4 BITS) NUMERIC 0 0 4
+ 030002 PIXEL VALUE(8 BITS) NUMERIC 0 0 8
+ 030004 PIXEL VALUE(16 BITS) NUMERIC 0 0 16
+ 030021 NUMBER OF PIXELS PER ROW NUMERIC 0 0 12
+ 030022 NUMBER OF PIXELS PER COLUMN NUMERIC 0 0 12
+ 030031 PICTURE TYPE CODE TABLE 30031 0 0 4
+ 030032 COMBINATION WITH OTHER DATA FLAG TABLE 30032 0 0 16
+ 030193 POSITION NUMBER ALONG SCAN NUMERIC 0 0 8
+ 031000 SHORT DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 1
+ 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8
+ 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16
+ 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8
+ 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16
+ 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 31021 0 0 6
+ 031031 DATA PRESENT INDICATOR FLAG TABLE 31031 0 0 1
+ 031192 DATA PRESENT INDICATOR NUMERIC 0 0 1
+ 033002 QUALITY INFORMATION TABLE CODE TABLE 33002 0 0 2
+ 033003 QUALITY INFORMATION TABLE CODE TABLE 33003 0 0 3
+ 033007 % CONFIDENCE % 0 0 7
+ 033020 QUALITY CONTROL INDICATION OF FOLLOWING VALUE CODE TABLE 33020 0 0 3
+ 033021 QUALITY OF FOLLOWING VALUE CODE TABLE 33021 0 0 2
+ 033022 QUALITY OF BUOY SATELLITE TRANSMISSION CODE TABLE 33022 0 0 2
+ 033023 QUALITY OF BUOY LOCATION CODE TABLE 33023 0 0 2
+ 033024 STATION ELEVATION QUALITY MARK (FOR MOBILE STATION) CODE TABLE 33024 0 0 2
+ 033025 ACARS INTERPOLATED VALUES CODE TABLE 33025 0 0 3
+ 033026 MIXING RATIO QUALITY CODE TABLE 33026 0 0 6
+ 033027 LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66% CONFIDENCE CODE TABLE 33027 0 0 3
+ 033030 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 33030 0 0 24
+ 033031 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 33031 0 0 24
+ 033032 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 33032 0 0 24
+ 033033 FIELD OF VIEW QUALITY FLAGS FOR ATOVS FLAG TABLE 33033 0 0 24
+ 033191 ECMWF WAM QC INDICATOR CODE TABLE 033191 0 0 2
+ 033192 TEM1 CONFIDENCE % 0 0 7
+ 033193 DATA QUALITY 3 BIT CODE CODE TABLE 33193 0 0 3
+ 033194 DATA QUALITY 2 BIT CODE CODE TABLE 33194 0 0 2
+ 033195 ECMWF SAR QC INDICATOR CODE TABLE 33195 0 0 5
+ 033196 ECMWF WAM QC INDICATOR CODE TABLE 33196 0 0 2
+ 033197 ECMWF SAR INVERSION QC INDICATOR CODE TABLE 33197 0 0 3
+ 033198 MINIMUM COST NUMERIC 4 0 14
+ 033199 1D VAR TOTAL PRECIPITABLE WATER RETRIEVED ERROR(S) KG/M**2 2 0 11
+ 033200 ANALYSIS REPORT EVENTS FLAG TABLE 33200 0 0 31
+ 033201 ANALYSIS REPORT STATUS EVENT FLAG TABLE 33201 0 0 13
+ 033202 ANALYSIS DATUM EVENT FLAGS (1) FLAG TABLE 33202 0 0 31
+ 033203 ANALYSIS DATUM EVENT FLAGS (2) FLAG TABLE 33203 0 0 11
+ 033204 ANALYSIS DATUM STATUS FLAGS FLAG TABLE 33204 0 0 21
+ 033205 VARIATIONAL ANALYSIS BLACK LIST FLAG CODE TABLE 33205 0 0 4
+ 033206 VARIATIONAL ANALYSIS QUALITY CONTROL FLAG CODE TABLE 33206 0 0 4
+ 033207 VARIATIONAL ANALYSIS DEPARTURE FLAG CODE TABLE 33207 0 0 4
+ 033208 VARIATIONAL ANALYSIS FIRST QUESSCHECK FLAG CODE TABLE 33208 0 0 4
+ 033209 VARIATIONAL ANALYSIS FINAL FLAG CODE TABLE 33209 0 0 4
+ 033210 INCREMENTAL VARIATIONAL ANALYSISUPDATE NUMBER NUMERIC 0 0 7
+ 033211 MINIMISATION SIMULATION NUMBER NUMERIC 0 0 10
+ 033212 1D VAR ITERRATION NUMBER NUMERIC 0 0 10
+ 033213 1D VAR RADIANCE COST NUMERIC 1 -1000 11
+ 033214 1D VAR ERROR(S) FLAG TABLE 33214 0 0 11
+ 033215 DIRECTIONAL SKILL NUMERIC 1 -4096 13
+ 033216 1D VAR SURFACE TYPE QUALITY CONTROL CODE TABLE 33216 0 0 3
+ 033217 1D VAR FAILURE INDICATOR CODE TABLE 33217 0 0 2
+ 033218 1D VAR ESTIMATE OF SCATTERING NUMERIC 2 0 12
+ 033219 SSMI INDIPENDENT SCATTERING INDEX NUMERIC 2 -50000 16
+ 033220 VARIATIONAL ANALYSIS REPORT EVENTS (1) FLAG TABLE 33220 0 0 31
+ 033221 VARIATIONAL ANALYSIS SYNOP EVENTS (2) FLAG TABLE 33221 0 0 31
+ 033222 VARIATIONAL ANALYSIS AIREP EVENTS (2) FLAG TABLE 33222 0 0 31
+ 033223 VARIATIONAL ANALYSIS SATOB EVENTS (2) FLAG TABLE 33223 0 0 31
+ 033224 VARIATIONAL ANALYSIS DRIBU EVENTS (2) FLAG TABLE 33224 0 0 31
+ 033225 VARIATIONAL ANALYSIS TEMP EVENTS (2) FLAG TABLE 33225 0 0 31
+ 033226 VARIATIONAL ANALYSIS PILOT EVENTS (2) FLAG TABLE 33226 0 0 31
+ 033227 VARIATIONAL ANALYSIS SATEM/TOVS EVENTS (2) FLAG TABLE 33227 0 0 31
+ 033228 VARIATIONAL ANALYSIS PAOB EVENTS (2) FLAG TABLE 33228 0 0 31
+ 033229 VARIATIONAL ANALYSIS SCATTEROMETER EVENTS (2) FLAG TABLE 33229 0 0 31
+ 033230 VARIATIONAL ANALYSIS RAW RADIANCES EVENTS (2) FLAG TABLE 33230 0 0 31
+ 033231 PRESAT SUMMARY FLAGS FLAG TABLE 33231 0 0 6
+ 033232 REPORT BLACK LIST EVENTS FLAG TABLE 33232 0 0 31
+ 033233 VARIATIONAL ANALYSIS REPORT STATUS FLAG TABLE 33233 0 0 31
+ 033234 VARIATIONAL ANALYSIS DATUM STATUS FLAG TABLE 33234 0 0 31
+ 033236 VARIATIONAL ANALYSIS DATUM EVENTS (1) FLAG TABLE 33236 0 0 31
+ 033237 VARIATIONAL ANALYSIS SYNOP DATUMEVENTS (2) FLAG TABLE 33237 0 0 31
+ 033238 VARIATIONAL ANALYSIS AIREP DATUMEVENTS (2) FLAG TABLE 33238 0 0 31
+ 033239 VARIATIONAL ANALYSIS SATOB DATUMEVENTS (2) FLAG TABLE 33239 0 0 31
+ 033240 VARIATIONAL ANALYSIS DRIBU DATUMEVENTS (2) FLAG TABLE 33240 0 0 31
+ 033241 GROSS ERROR PROBABILITY NUMERIC 3 0 10
+ 033242 GROSS ERROR INDICATOR CODE TABLE 33242 0 0 2
+ 033243 VARIATIONAL ANALYSIS TEMP DATUM EVENTS (2) FLAG TABLE 33243 0 0 31
+ 033244 VARIATIONAL ANALYSIS PILOT DATUMEVENTS (2) FLAG TABLE 33244 0 0 31
+ 033245 VARIATIONAL ANALYSIS SATEM/TOVS DATUM EVENTS (2) FLAG TABLE 33245 0 0 31
+ 033246 VARIATIONAL ANALYSIS PAOB DATUM EVENTS (2) FLAG TABLE 33246 0 0 31
+ 033247 VARIATIONAL ANALYSIS SCATTEROMETER DATUM EVENTS (2) FLAG TABLE 33247 0 0 31
+ 033248 VARIATIONAL ANALYSIS RAW RADIANCES DATUM EVENTS (2) FLAG TABLE 33248 0 0 31
+ 033249 DATUM BLACK LIST EVENTS FLAG TABLE 33249 0 0 31
+ 033250 PROBABILITY OF GROSS ERROR NUMERIC 6 0 20
+ 033251 RANGE OF POSSIBLE VALUES NUMERIC 2 0 14
+ 033252 MANUAL-AUTOMATIC QUALITY CONTROL CODE TABLE 33252 0 0 4
+ 033253 NOMINAL CONFIDENCE THRESHOLD % 0 0 7
+ 033254 WIND CORRELATION METHOD FLAG TABLE 33254 0 0 20
+ 049193 SAR INVERSION QC FLAGS FLAG TABLE 49193 0 0 15
+ 049194 ALTIMETER WAVE HEIGHT QC FLAFS FLAG TABLE 49194 0 0 15
+ 055003 DATA EXTRACTION INDICATOR FLAG TABLE 55003 0 0 8
+ 062190 STATISTICS APPLICATION CODE TABLE 62190 0 0 8
+ 062191 TYPE OF STATISTICS CODE TABLE 62191 0 0 8
+ 063190 APPLICATION DERIVING SUBSTITUTE OR ALTERNATIVE VALUE CODE TABLE 63190 0 0 8
diff --git a/bufrtables/B0000000000098013001.TXT b/bufrtables/B0000000000098013001.TXT
new file mode 100755
index 0000000..fe50545
--- /dev/null
+++ b/bufrtables/B0000000000098013001.TXT
@@ -0,0 +1,1589 @@
+ 000001 TABLE A: ENTRY CCITTIA5 0 0 24 CHARACTER 0 3
+ 000002 TABLE A: DATA CATEGORY DESCRIPTION, LINE 1 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000003 TABLE A: DATA CATEGORY DESCRIPTION, LINE 2 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000004 BUFR/CREX MASTER TABLE CCITTIA5 0 0 16 CHARACTER 0 2
+ 000005 BUFR/CREX EDITION NUMBER CCITTIA5 0 0 24 CHARACTER 0 3
+ 000006 BUFR MASTER TABLE VERSION NUMBER CCITTIA5 0 0 16 CHARACTER 0 2
+ 000007 CREX MASTER TABLE VERSION NUMBER CCITTIA5 0 0 16 CHARACTER 0 2
+ 000008 BUFR LOCAL TABLE VERSION NUMBER CCITTIA5 0 0 16 CHARACTER 0 2
+ 000010 F DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 8 CHARACTER 0 1
+ 000011 X DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 16 CHARACTER 0 2
+ 000012 Y DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 24 CHARACTER 0 3
+ 000013 ELEMENT NAME, LINE 1 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000014 ELEMENT NAME, LINE 2 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000015 UNITS NAME CCITTIA5 0 0 192 CHARACTER 0 24
+ 000016 UNITS SCALE SIGN CCITTIA5 0 0 8 CHARACTER 0 1
+ 000017 UNITS SCALE CCITTIA5 0 0 24 CHARACTER 0 3
+ 000018 UNITS REFERENCE SIGN CCITTIA5 0 0 8 CHARACTER 0 1
+ 000019 UNITS REFERENCE VALUE CCITTIA5 0 0 80 CHARACTER 0 10
+ 000020 ELEMENT DATA WIDTH CCITTIA5 0 0 24 CHARACTER 0 3
+ 000030 DESCRIPTOR DEFINING SEQUENCE CCITTIA5 0 0 48 CHARACTER 0 6
+ 001001 WMO BLOCK NUMBER NUMERIC 0 0 7 NUMERIC 0 2
+ 001002 WMO STATION NUMBER NUMERIC 0 0 10 NUMERIC 0 3
+ 001003 WMO REGION NUMBER/GEOGRAPHICAL AREA CODE TABLE 1003 0 0 3 CODE TABLE 1003 0 1
+ 001004 WMO REGION SUB-AREA (SEE NOTE 9) NUMERIC 0 0 3 NUMERIC 0 1
+ 001005 BUOY/PLATFORM IDENTIFIER NUMERIC 0 0 17 NUMERIC 0 5
+ 001006 AIRCRAFT FLIGHT NUMBER CCITTIA5 0 0 64 CHARACTER 0 8
+ 001007 SATELLITE IDENTIFIER CODE TABLE 1007 0 0 10 CODE TABLE 1007 0 4
+ 001008 AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION CCITTIA5 0 0 64 CHARACTER 0 8
+ 001009 TYPE OF COMMERCIAL AIRCRAFT CCITTIA5 0 0 64 CHARACTER 0 8
+ 001010 STATIONARY BUOY PLATFORM IDENTIFIER; E.G. C-MAN BUOYS CCITTIA5 0 0 64 CHARACTER 0 8
+ 001011 SHIP OR MOBILE LAND STATION IDENTIFIER CCITTIA5 0 0 72 CHARACTER 0 9
+ 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM* M/S 0 0 10 M/S 0 3
+ 001014 PLATFORM DRIFT SPEED (HIGH PRECISION) M/S 2 0 10 M/S 2 4
+ 001015 STATION OR SITE NAME CCITTIA5 0 0 160 CHARACTER 0 20
+ 001018 SHORT STATION OR SITE NAME CCITTIA5 0 0 40 CHARACTER 0 5
+ 001019 LONG STATION OR SITE NAME CCITTIA5 0 0 256 CHARACTER 0 32
+ 001020 WMO REGION SUB-AREA NUMERIC 0 0 4 NUMERIC 0 2
+ 001021 SYNOPTIC FEATURE IDENTIFIER NUMERIC 0 0 14 NUMERIC 0 4
+ 001022 NAME OF FEATURE (SEE NOTE 11) CCITTIA5 0 0 224 CHARACTER 0 28
+ 001023 OBSERVATION SEQUENCE NUMBER NUMERIC 0 0 9 NUMERIC 0 3
+ 001025 STORM IDENTIFIER CCITTIA5 0 0 24 CHARACTER 0 3
+ 001026 WMO STORM NAME CCITTIA5 0 0 64 CHARACTER 0 8
+ 001027 WMO LONG STORM NAME CCITTIA5 0 0 80 CHARACTER 0 10
+ 001030 NUMERICAL MODEL IDENTIFIER CCITTIA5 0 0 128 CHARACTER 0 16
+ 001031 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE (SEE NOTE 10) CODE TABLE 1031 0 0 16 CODE TABLE 1031 0 5
+ 001032 GENERATING APPLICATION CODE TABLE 1032 0 0 8 CODE TABLE 1032 0 3
+ 001033 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE CODE TABLE 1033 0 0 8 CODE TABLE 1033 0 3
+ 001034 IDENTIFICATION OF ORIGINATING/GENERATING SUB-CENTRE CODE TABLE 1034 0 0 8 CODE TABLE 1034 0 3
+ 001035 ORIGINATING CENTRE COMMON CODE TABLE C-11 0 0 16 COMMON CODE TABLE C-11 0 5
+ 001036 AGENCY IN CHARGE OF OPERATING THE OBSERVING PLATFORM CODE TABLE 1036 0 0 20 CODE TABLE 1036 0 7
+ 001037 SIGMET SEQUENCE IDENTIFIER CCITTIA5 0 0 24 CHARACTER 0 3
+ 001041 ABSOLUTE PLATFORM VELOCITY - FIRST COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001042 ABSOLUTE PLATFORM VELOCITY - SECOND COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001043 ABSOLUTE PLATFORM VELOCITY - THIRD COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001050 PLATFORM TRANSMITTER ID NUMBER NUMERIC 0 0 17 NUMERIC 0 6
+ 001051 PLATFORM TRANSMITTER ID NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 001060 AIRCRAFT REPORTING POINT (BEACON IDENTIFIER) CCITTIA5 0 0 64 CHARACTER 0 8
+ 001062 SHORT ICAO LOCATION INDICATOR CCITTIA5 0 0 32 CHARACTER 0 4
+ 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64 CHARACTER 0 8
+ 001064 RUNWAY DESIGNATOR CCITTIA5 0 0 32 CHARACTER 0 4
+ 001065 ICAO REGION IDENTIFIER CCITTIA5 0 0 256 CHARACTER 0 32
+ 001075 TIDE STATION IDENTIFICATION CCITTIA5 0 0 40 CHARACTER 0 5
+ 001080 SHIP LINE NUMBER ACCORDING TO SOOP CCITTIA5 0 0 32 CHARACTER 0 4
+ 001081 RADIOSONDE SERIAL NUMBER CCITTIA5 0 0 160 CHARACTER 0 20
+ 001082 RADIOSONDE ASCENSION NUMBER (SEE NOTE 12) NUMERIC 0 0 14 NUMERIC 0 4
+ 001083 RADIOSONDE RELEASE NUMBER (SEE NOTE 12) NUMERIC 0 0 3 NUMERIC 0 1
+ 001085 OBSERVING PLATFORM MANUFACTURER'S MODEL CCITTIA5 0 0 160 CHARACTER 0 20
+ 001086 OBSERVING PLATFORM MANUFACTURER'S SERIAL NUMBER CCITTIA5 0 0 256 CHARACTER 0 32
+ 001087 WMO MARINE OBSERVING PLATFORM EXTENDED IDENTIFIER NUMERIC 0 0 23 NUMERIC 0 7
+ 001090 TECHNIQUE FOR MAKING UP INITIAL PERTURBATIONS CODE TABLE 1090 0 0 8 CODE TABLE 1090 0 3
+ 001091 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 10 NUMERIC 0 4
+ 001092 TYPE OF ENSEMBLE FORECAST CODE TABLE 1092 0 0 8 CODE TABLE 1092 0 3
+ 001093 BALLOON LOT NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 001094 WBAN NUMBER NUMERIC 0 0 17 NUMERIC 0 5
+ 001095 OBSERVER IDENTIFICATION CCITTIA5 0 0 32 CHARACTER 0 4
+ 001096 STATION ACQUISITION CCITTIA5 0 0 160 CHARACTER 0 20
+ 001101 STATE IDENTIFIER CODE TABLE 1101 0 0 10 CODE TABLE 1101 0 3
+ 001102 NATIONAL STATION IDENTIFIER NUMERIC 0 0 30 NUMERIC 0 9
+ 001124 GRID POINT IDENTIFIER NUMERIC 0 0 24 NUMERIC 0 8
+ 001144 SNAPSHOT IDENTIFIER NUMERIC 0 0 31 NUMERIC 0 10
+ 001192 MODEL VERSION NUMBER CODE TABLE 001192 0 0 8
+ 001193 SIGMA_0 SIMULATION METHOD CODE TABLE 1193 0 0 4
+ 001194 CARRIER BALLOON/AIRCRAFT IDENTIFIER CCITTIA5 0 0 72
+ 001195 MOBIL LAND STATION IDENTIFIER CCITTIA5 0 0 72
+ 001196 CONSTANT LEVEL BALLOON IDENTIFIER CCITTIA5 0 0 72
+ 001197 RTP - PLATFORM TYPE CODE TABLE 1197 0 0 10
+ 001198 ITP - DECK ID CODE TABLE 1198 0 0 10
+ 001199 DUP - DUPLICATE STATUS CODE TABLE 1199 0 0 4
+ 001201 GENERATING APPLICATION CODE TABLE 1201 0 0 8
+ 001205 SATELLITE IDENTIFIER CODE TABLE 1205 0 0 10
+ 001208 VELOCITY OF PLATFORM, X M/S 5 -1073741824 31
+ 001209 VELOCITY OF PLATFORM, Y M/S 5 -1073741824 31
+ 001210 VELOCITY OF PLATFORM, Z M/S 5 -1073741824 31
+ 001211 ORIGIN OF SEA SURFACE ANALYSIS CCITTIA5 0 0 160 CHARACTER 0 20
+ 001220 RADAR COMPOSITE NAME CCITTIA5 0 0 160 CHARACTER 0 20
+ 002001 TYPE OF STATION CODE TABLE 2001 0 0 2 CODE TABLE 2001 0 1
+ 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 2002 0 0 4 FLAG TABLE 2002 0 2
+ 002003 TYPE OF MEASURING EQUIPMENT USED CODE TABLE 2003 0 0 4 CODE TABLE 2003 0 2
+ 002004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUREMENT OR TYPE OF C CODE TABLE 2004 0 0 4 CODE TABLE 2004 0 2
+ 002005 PRECISION OF TEMPERATURE OBSERVATION K 2 0 7 K 2 3
+ 002011 RADIOSONDE TYPE CODE TABLE 2011 0 0 8 CODE TABLE 2011 0 3
+ 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 2012 0 0 4 CODE TABLE 2012 0 2
+ 002013 SOLAR AND INFRARED RADIATION CORRECTION CODE TABLE 2013 0 0 4 CODE TABLE 2013 0 2
+ 002014 TRACKING TECHNIQUE/STATUS OF SYSTEM USED CODE TABLE 2014 0 0 7 CODE TABLE 2014 0 3
+ 002015 RADIOSONDE COMPLETENESS CODE TABLE 2015 0 0 4 CODE TABLE 2015 0 2
+ 002016 RADIOSONDE CONFIGURATION FLAG TABLE 2016 0 0 5 FLAG TABLE 2016 0 2
+ 002019 SATELLITE INSTRUMENTS CODE TABLE 2019 0 0 11 CODE TABLE 2019 0 4
+ 002020 SATELLITE CLASSIFICATION CODE TABLE 2020 0 0 9 CODE TABLE 2020 0 3
+ 002021 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 2021 0 0 9 FLAG TABLE 2021 0 3
+ 002022 SATELLITE DATA-PROCESSING TECHNIQUE USED FLAG TABLE 2022 0 0 8 FLAG TABLE 2022 0 3
+ 002023 SATELLITE DERIVED WIND COMPUTATION METHOD CODE TABLE 2023 0 0 4 CODE TABLE 2023 0 2
+ 002024 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2024 0 0 4 CODE TABLE 2024 0 2
+ 002025 SATELLITE CHANNEL(S) USED IN COMPUTATION FLAG TABLE 2025 0 0 25 FLAG TABLE 2025 0 9
+ 002026 CROSS TRACK RESOLUTION M 2 0 12 M 2 4
+ 002027 ALONG TRACK RESOLUTION M 2 0 12 M 2 4
+ 002028 SEGMENT SIZE AT NADIR IN X DIRECTION M 0 0 18 M 0 6
+ 002029 SEGMENT SIZE AT NADIR IN Y DIRECTION M 0 0 18 M 0 6
+ 002030 METHOD OF CURRENT MEASUREMENT CODE TABLE 2030 0 0 3 CODE TABLE 2030 0 1
+ 002031 DURATION AND TIME OF CURRENT MEASUREMENT CODE TABLE 2031 0 0 5 CODE TABLE 2031 0 2
+ 002032 INDICATOR FOR DIGITIZATION CODE TABLE 2032 0 0 2 CODE TABLE 2032 0 1
+ 002033 METHOD OF SALINITY/DEPTH MEASUREMENT CODE TABLE 2033 0 0 3 CODE TABLE 2033 0 1
+ 002034 DROGUE TYPE CODE TABLE 2034 0 0 5 CODE TABLE 2034 0 2
+ 002035 CABLE LENGTH M 0 0 9 M 0 3
+ 002036 BUOY TYPE CODE TABLE 2036 0 0 2 CODE TABLE 2036 0 1
+ 002037 METHOD OF TIDAL OBSERVATION CODE TABLE 2037 0 0 3 CODE TABLE 2037 0 1
+ 002038 METHOD OF WATER TEMPERATURE AND/OR SALINITY MEASUREMENT CODE TABLE 2038 0 0 4 CODE TABLE 2038 0 2
+ 002039 METHOD OF WET-BULB TEMPERATURE MEASUREMENT CODE TABLE 2039 0 0 3 CODE TABLE 2039 0 1
+ 002040 METHOD OF REMOVING VELOCITY AND MOTION OF PLATFORM FROM CURRENT CODE TABLE 2040 0 0 4 CODE TABLE 2040 0 2
+ 002041 METHOD FOR ESTIMATING REPORTS RELATED TO SYNOPTIC FEATURES CODE TABLE 2041 0 0 6 CODE TABLE 2041 0 2
+ 002042 INDICATOR FOR SEA SURFACE CURRENT SPEED CODE TABLE 2042 0 0 2 CODE TABLE 2042 0 1
+ 002044 INDICATOR FOR METHOD OF CALCULATING SPECTRAL WAVE DATA CODE TABLE 2044 0 0 4 CODE TABLE 2044 0 2
+ 002045 INDICATOR FOR TYPE OF PLATFORM CODE TABLE 2045 0 0 4 CODE TABLE 2045 0 2
+ 002046 WAVE MEASUREMENT INSTRUMENTATION CODE TABLE 2046 0 0 4 CODE TABLE 2046 0 2
+ 002048 SATELLITE SENSOR INDICATOR CODE TABLE 2048 0 0 4 CODE TABLE 2048 0 2
+ 002049 GEOSTATIONARY SATELLITE DATA-PROCESSING TECHNIQUE USED FLAG TABLE 2049 0 0 8 FLAG TABLE 2049 0 3
+ 002050 GEOSTATIONARY SOUNDER SATELLITE CHANNELS USED FLAG TABLE 2050 0 0 20 FLAG TABLE 2050 0 7
+ 002051 INDICATOR TO SPECIFY OBSERVING METHOD FOR EXTREME TEMPERATURES CODE TABLE 2051 0 0 4 CODE TABLE 2051 0 2
+ 002052 GEOSTATIONARY IMAGER SATELLITE CHANNELS USED FLAG TABLE 2052 0 0 6 FLAG TABLE 2052 0 2
+ 002053 GOES-I/M BRIGHTNESS TEMPERATURE CHARACTERISTICS CODE TABLE 2053 0 0 4 CODE TABLE 2053 0 2
+ 002054 GOES-I/M SOUNDINGS PARAMETER CHARACTERISTICS CODE TABLE 2054 0 0 4 CODE TABLE 2054 0 2
+ 002055 GEOSTATIONARY SOUNDINGS STATISTICAL PARAMETERS CODE TABLE 2055 0 0 4 CODE TABLE 2055 0 2
+ 002056 GEOSTATIONARY SOUNDINGS ACCURACY STATISTICS CODE TABLE 2056 0 0 4 CODE TABLE 2056 0 2
+ 002057 ORIGIN OF FIRST GUESS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2057 0 0 4 CODE TABLE 2057 0 2
+ 002058 VALID TIMES OF FIRST GUESS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2058 0 0 4 CODE TABLE 2058 0 2
+ 002059 ORIGIN OF ANALYSIS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2059 0 0 4 CODE TABLE 2059 0 2
+ 002060 ORIGIN OF SURFACE INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2060 0 0 4 CODE TABLE 2060 0 2
+ 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 2061 0 0 3 CODE TABLE 2061 0 1
+ 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 2062 0 0 4 CODE TABLE 2062 0 2
+ 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16 DEGREE 2 5
+ 002064 AIRCRAFT ROLL ANGLE QUALITY CODE TABLE 2064 0 0 2 CODE TABLE 2064 0 1
+ 002065 ACARS GROUND RECEIVING STATION CCITTIA5 0 0 40 CHARACTER 0 5
+ 002066 RADIOSONDE GROUND RECEIVING SYSTEM CODE TABLE 2066 0 0 6 CODE TABLE 2066 0 2
+ 002067 RADIOSONDE OPERATING FREQUENCY Hz -5 0 15 Hz -5 5
+ 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 2070 0 0 4 CODE TABLE 2070 0 2
+ 002071 SPECTROGRAPHIC WAVELENGTH M 13 0 30 M 13 10
+ 002080 BALLOON MANUFACTURER CODE TABLE 2080 0 0 6 CODE TABLE 2080 0 2
+ 002081 TYPE OF BALLOON CODE TABLE 2081 0 0 5 CODE TABLE 2081 0 2
+ 002082 WEIGHT OF BALLOON KG 3 0 12 KG 3 4
+ 002083 TYPE OF BALLOON SHELTER CODE TABLE 2083 0 0 4 CODE TABLE 2083 0 2
+ 002084 TYPE OF GAS USED IN BALLOON CODE TABLE 2084 0 0 4 CODE TABLE 2084 0 2
+ 002085 AMOUNT OF GAS USED IN BALLOON KG 3 0 13 KG 3 4
+ 002086 BALLOON FLIGHT TRAIN LENGTH M 1 0 10 M 1 4
+ 002091 ENTRY SENSOR 4/20 MA A 4 0 10 A 4 3
+ 002095 TYPE OF PRESSURE SENSOR CODE TABLE 2095 0 0 5 CODE TABLE 2095 0 2
+ 002096 TYPE OF TEMPERATURE SENSOR CODE TABLE 2096 0 0 5 CODE TABLE 2096 0 2
+ 002097 TYPE OF HUMIDITY SENSOR CODE TABLE 2097 0 0 5 CODE TABLE 2097 0 2
+ 002098 TYPE OF WAVE SENSOR CODE TABLE 2098 0 0 4 CODE TABLE 2098 0 2
+ 002099 POLARISATION CODE TABLE 2099 0 0 3 CODE TABLE 2099 0 1
+ 002100 RADAR CONSTANT dB 1 0 12 dB 1 4
+ 002101 TYPE OF ANTENNA CODE TABLE 2101 0 0 4 CODE TABLE 2101 0 2
+ 002102 ANTENNA HEIGHT ABOVE TOWER BASE M 0 0 8 M 0 3
+ 002103 RADOME FLAG TABLE 2103 0 0 2 FLAG TABLE 2103 0 1
+ 002104 ANTENNA POLARISATION CODE TABLE 2104 0 0 4 CODE TABLE 2104 0 2
+ 002105 MAXIMUM ANTENNA GAIN dB 0 0 6 dB 0 2
+ 002106 3-DB BEAMWIDTH DEGREE 1 0 6 DEGREE 1 2
+ 002107 SIDELOBE SUPPRESSION dB 0 0 6 dB 0 2
+ 002108 CROSSPOL DISCRIMINATION (ON AXIS) dB 0 0 6 dB 0 2
+ 002109 ANTENNA SPEED (AZIMUTH) DEGREE/S 2 0 12 DEGREE/S 2 4
+ 002110 ANTENNA SPEED (ELEVATION) DEGREE/S 2 0 12 DEGREE/S 2 4
+ 002111 RADAR INCIDENCE ANGLE DEGREE 1 0 10 DEGREE 1 4
+ 002112 RADAR LOOK ANGLE DEGREE 1 0 12 DEGREE 1 4
+ 002113 NUMBER OF AZIMUTH LOOKS NUMERIC 0 0 4 NUMERIC 0 2
+ 002114 ANTENNA EFFECTIVE SURFACE AREA M**2 0 0 15 M**2 0 5
+ 002115 TYPE OF SURFACE OBSERVING EQUIPMENT CODE TABLE 2115 0 0 5 CODE TABLE 2115 0 2
+ 002116 PERCENTAGE OF 320 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002117 PERCENTAGE OF 80 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002118 PERCENTAGE OF 20 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002119 RA-2 INSTRUMENT OPERATIONS CODE TABLE 2119 0 0 3 CODE TABLE 2119 0 1
+ 002120 OCEAN WAVE FREQUENCY Hz 3 0 10 Hz 3 4
+ 002121 MEAN FREQUENCY Hz -8 0 7 Hz -8 3
+ 002122 FREQUENCY AGILITY RANGE Hz -6 -128 8 Hz -6 3
+ 002123 PEAK POWER W -4 0 7 W -4 3
+ 002124 AVERAGE POWER W -1 0 7 W -1 3
+ 002125 PULSE REPETITION FREQUENCY Hz -1 0 8 Hz -1 3
+ 002126 PULSE WIDTH S 7 0 6 S 7 2
+ 002127 RECEIVER INTERMEDIATE FREQUENCY Hz -6 0 7 Hz -6 3
+ 002128 INTERMEDIATE FREQUENCY BANDWIDTH Hz -5 0 6 Hz -5 2
+ 002129 MINIMUM DETECTABLE SIGNAL dB 0 -150 5 dB 0 3
+ 002130 DYNAMIC RANGE dB 0 0 7 dB 0 3
+ 002131 SENSITIVITY TIME CONTROL (STC) FLAG TABLE 2131 0 0 2 FLAG TABLE 2131 0 1
+ 002132 AZIMUTH POINTING ACCURACY DEGREE 2 0 6 DEGREE 2 2
+ 002133 ELEVATION POINTING ACCURACY DEGREE 2 0 6 DEGREE 2 2
+ 002134 ANTENNA BEAM AZIMUTH DEGREE 2 0 16 DEGREE 2 5
+ 002135 ANTENNA ELEVATION DEGREE 2 -9000 15 DEGREE 2 5
+ 002136 RANGE PROCESSED BY RANGE ATTENUATION CORRECTION M -3 0 16 M -3 5
+ 002140 SATELLITE RADAR BEAM AZIMUTH ANGLE DEGREE 0 0 9 DEGREE 0 3
+ 002141 MEASUREMENT TYPE CCITTIA5 0 0 24 CHARACTER 0 3
+ 002142 OZONE INSTRUMENT SERIAL NUMBER/ IDENTIFICATION CCITTIA5 0 0 32 CHARACTER 0 4
+ 002143 OZONE INSTRUMENT TYPE CODE TABLE 2143 0 0 7 CODE TABLE 2143 0 3
+ 002144 LIGHT SOURCE TYPE FOR BREWER SPECTRO PHOTOMETER CODE TABLE 2144 0 0 4 CODE TABLE 2144 0 2
+ 002145 WAVE LENGTH SETTING FOR DOBSON INSTRUMENTS CODE TABLE 2145 0 0 4 CODE TABLE 2145 0 2
+ 002146 SOURCE CONDITIONS FOR DOBSON INSTRUMENTS CODE TABLE 2146 0 0 4 CODE TABLE 2146 0 2
+ 002148 DATA COLLECTION AND/OR LOCATION SYSTEM CODE TABLE 2148 0 0 5 CODE TABLE 2148 0 2
+ 002149 TYPE OF DATA BUOY CODE TABLE 2149 0 0 6 CODE TABLE 2149 0 2
+ 002150 TOVS/ATOVS/AVHRR INSTRUMENTATION CHANNEL NUMBER CODE TABLE 2150 0 0 6 CODE TABLE 2150 0 2
+ 002151 RADIOMETER IDENTIFIER CODE TABLE 2151 0 0 11 CODE TABLE 2151 0 4
+ 002152 SATELLITE INSTRUMENT USED IN DATA PROCESSING(6) FLAG TABLE 2152 0 0 31 FLAG TABLE 2152 0 10
+ 002153 SATELLITE CHANNEL CENTRE FREQUENCY Hz -8 0 26 Hz -8 8
+ 002154 SATELLITE CHANNEL BAND WIDTH Hz -8 0 26 Hz -8 8
+ 002156 PERCENTAGE OF VALID KU OCEAN RETRACKER MEASUREMENTS % 0 0 7 % 0 3
+ 002157 PERCENTAGE OF VALID S OCEAN RETRACKER MEASUREMENTS % 0 0 7 % 0 3
+ 002158 RA-2 INSTRUMENT FLAG TABLE 2158 0 0 9 FLAG TABLE 2158 0 3
+ 002159 MWR INSTRUMENT FLAG TABLE 2159 0 0 8 FLAG TABLE 2159 0 3
+ 002160 WAVE LENGTH OF THE RADAR CODE TABLE 2160 0 0 4 CODE TABLE 2160 0 2
+ 002163 HEIGHT ASSIGNMENT METHOD CODE TABLE 2163 0 0 4 CODE TABLE 2163 0 2
+ 002164 TRACER CORRELATION METHOD CODE TABLE 2164 0 0 3 CODE TABLE 2164 0 1
+ 002166 RADIANCE TYPE CODE TABLE 2166 0 0 4 CODE TABLE 2166 0 2
+ 002167 RADIANCE COMPUTATIONAL METHOD CODE TABLE 2167 0 0 4 CODE TABLE 2167 0 2
+ 002168 HYDROSTATIC PRESSURE OF LOWER END OF CABLE (THERMISTOR STRING) PA -3 0 16 KPA 0 5
+ 002169 ANEMOMETER TYPE CODE TABLE 2169 0 0 4 CODE TABLE 2169 0 2
+ 002172 PRODUCT TYPE FOR RETRIEVED ATMOSPHERIC GASES CODE TABLE 2172 0 0 8 CODE TABLE 2172 0 3
+ 002173 SQUARE OF THE OFF NADIR ANGLE (7) DEGREE2 4 0 10 DEGREE2 4 4
+ 002174 MEAN ACROSS TRACK PIXEL NUMBER NUMERIC 0 0 9 NUMERIC 0 3
+ 002175 METHOD OF PRECIPITATION MEASUREMENT CODE TABLE 2175 0 0 4 CODE TABLE 2175 0 2
+ 002176 METHOD OF STATE OF GROUND MEASUREMENT CODE TABLE 2176 0 0 4 CODE TABLE 2176 0 2
+ 002177 METHOD OF SNOW DEPTH MEASUREMENT CODE TABLE 2177 0 0 4 CODE TABLE 2177 0 2
+ 002178 METHOD OF LIQUID CONTENT MEASUREMENT OF PRECIPITATION CODE TABLE 2178 0 0 4 CODE TABLE 2178 0 2
+ 002179 TYPE OF SKY CONDITION ALGORITHM CODE TABLE 2179 0 0 4 CODE TABLE 2179 0 2
+ 002180 MAIN PRESENT WEATHER DETECTING SYSTEM CODE TABLE 2180 0 0 4 CODE TABLE 2180 0 2
+ 002181 SUPPLEMENTARY PRESENT WEATHER SENSOR FLAG TABLE 2181 0 0 21 FLAG TABLE 2181 0 7
+ 002182 VISIBILITY MEASUREMENT SYSTEM CODE TABLE 2182 0 0 4 CODE TABLE 2182 0 2
+ 002183 CLOUD DETECTION SYSTEM CODE TABLE 2183 0 0 4 CODE TABLE 2183 0 2
+ 002184 TYPE OF LIGHTNING DETECTION SENSOR CODE TABLE 2184 0 0 4 CODE TABLE 2184 0 2
+ 002185 METHOD OF EVAPORATION MEASUREMENT CODE TABLE 2185 0 0 4 CODE TABLE 2185 0 2
+ 002186 CAPABILITY TO DETECT PRECIPITATION PHENOMENA FLAG TABLE 2186 0 0 30 FLAG TABLE 2186 0 10
+ 002187 CAPABILITY TO DETECT OTHER WEATHER PHENOMENA FLAG TABLE 2187 0 0 18 FLAG TABLE 2187 0 6
+ 002188 CAPABILITY TO DETECT OBSCURATION FLAG TABLE 2188 0 0 21 FLAG TABLE 2188 0 7
+ 002189 CAPABILITY TO DISCRIMINATE LIGHTNING STRIKES FLAG TABLE 2189 0 0 12 FLAG TABLE 2189 0 4
+ 002190 LAGRANGIAN DRIFTER SUBMERGENCE (% TIME SUBMERGED) % 0 0 7 % 0 3
+ 002192 SAR AZIMUTH ANGLE DEGREE 0 0 9
+ 002193 1D VAR SATELLITE CHANNEL(S) USED FLAG TABLE 2193 0 0 28
+ 002194 CONSTANT LEVEL BALLOON TYPE CODE TABLE 2194 0 0 4
+ 002195 TYPE OF SATELLITE INSTRUMENTATION CODE TABLE 2195 0 0 4
+ 002196 SATELLITE CLASSIFICATION CODE TABLE 2196 0 0 9
+ 002197 SATELLITE CHANNEL CENTRE FREQUENCY Hz -8 0 26
+ 002198 SATELLITE CHANNEL BAND WIDTH Hz -8 0 26
+ 002199 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2199 0 0 4
+ 002200 LATITUDINAL RESOLUTION DEGREE 5 0 25
+ 002201 LONGITUDINAL RESOLUTION DEGREE 5 0 25
+ 002202 SIMULATED DATA PROCESSING TECHNIQUE USED FLAG TABLE 2202 0 0 4
+ 002205 LATITUDINAL RESOLUTION DEGREE 3 0 9
+ 002206 LONGITUDINAL RESOLUTION DEGREE 3 0 9
+ 002207 TYPE OF SCAN CODE TABLE 2207 0 0 3
+ 002220 DATA PRODUCER CODE TABLE 2220 0 0 9
+ 002221 SEGMENT SIZE AT NADIR IN X DIRECTION M 0 0 18
+ 002222 SEGMENT SIZE AT NADIR IN Y DIRECTION M 0 0 18
+ 002223 TOVS/ATOVS/AVHRR CHANNEL NUMBER CODE TABLE 2223 0 0 6
+ 002231 HEIGHT ASSIGNMENT METHOD CODE TABLE 2231 0 0 4
+ 002232 TRACER CORRELATION METHOD CODE TABLE 2232 0 0 3
+ 002240 TYPE OF TERMODYNAMIC SENSING CODE TABLE 2240 0 0 8
+ 002241 TYPE OF ROCKET MOTOR CODE TABLE 2241 0 0 3
+ 002242 TYPE OF WIND SENSING EQUIPMENT CODE TABLE 2242 0 0 8
+ 002243 TERMODYNAMIC CORRECTION TECHNIQUE CODE TABLE 2243 0 0 3
+ 002244 WIND CORRECTION TECHNIQUE CODE TABLE 2244 0 0 3
+ 002245 METHOD OF REDUCING OF DATA CODE TABLE 2245 0 0 4
+ 002251 RADIANCE COMPUTATIONAL METHOD CODE TABLE 2251 0 0 4
+ 002252 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 2252 0 0 31
+ 002253 HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2253 0 0 8
+ 002254 RADIANCE TYPE CODE TABLE 2254 0 0 4
+ 004001 YEAR YEAR 0 0 12 YEAR 0 4
+ 004002 MONTH MONTH 0 0 4 MONTH 0 2
+ 004003 DAY DAY 0 0 6 DAY 0 2
+ 004004 HOUR HOUR 0 0 5 HOUR 0 2
+ 004005 MINUTE MINUTE 0 0 6 MINUTE 0 2
+ 004006 SECOND SECOND 0 0 6 SECOND 0 2
+ 004007 SECONDS WITHIN A MINUTE (MICROSECOND ACCURACY) SECOND 6 0 26 S 6 8
+ 004011 TIME INCREMENT YEAR 0 -1024 11 YEAR 0 4
+ 004012 TIME INCREMENT MONTH 0 -1024 11 MONTH 0 4
+ 004013 TIME INCREMENT DAY 0 -1024 11 DAY 0 4
+ 004014 TIME INCREMENT HOUR 0 -1024 11 HOUR 0 4
+ 004015 TIME INCREMENT MINUTE 0 -2048 12 MINUTE 0 4
+ 004016 TIME INCREMENT SECOND 0 -4096 13 SECOND 0 4
+ 004017 REFERENCE TIME PERIOD FOR ACCUMULATED OR EXTREME DATA MINUTE 0 -1440 12 MINUTE 0 4
+ 004021 TIME PERIOD OR DISPLACEMENT YEAR 0 -1024 11 YEAR 0 4
+ 004022 TIME PERIOD OR DISPLACEMENT MONTH 0 -1024 11 MONTH 0 4
+ 004023 TIME PERIOD OR DISPLACEMENT DAY 0 -1024 11 DAY 0 4
+ 004024 TIME PERIOD OR DISPLACEMENT HOUR 0 -2048 12 HOUR 0 4
+ 004025 TIME PERIOD OR DISPLACEMENT MINUTE 0 -2048 12 MINUTE 0 4
+ 004026 TIME PERIOD OR DISPLACEMENT SECOND 0 -4096 13 SECOND 0 4
+ 004031 DURATION OF TIME RELATING TO FOLLOWING VALUE HOUR 0 0 8 HOUR 0 3
+ 004032 DURATION OF TIME RELATING TO FOLLOWING VALUE MINUTE 0 0 6 MINUTE 0 2
+ 004041 TIME DIFFERENCE, UTC -LMT (SEE NOTE 6) MINUTE 0 -1440 12 MINUTE 0 4
+ 004043 DAY OF THE YEAR DAY 0 0 9 DAY 0 3
+ 004051 PRINCIPAL TIME OF DAILY READING OF MAXIMUM TEMPERATURE HOUR 0 0 5 HOUR 0 2
+ 004052 PRINCIPAL TIME OF DAILY READING OF MINIMUM TEMPERATURE HOUR 0 0 5 HOUR 0 2
+ 004053 NUMBER OF DAYS WITH PRECIPITATION EQUAL TO OR MORE THAN 1 MM NUMERIC 0 0 6 NUMERIC 0 2
+ 004059 TIMES OF OBSERVATION USED TO COMPUTE THE REPORTED MEAN VALUES FLAG TABLE 4059 0 0 6 FLAG TABLE 4059 0 2
+ 004065 SHORT TIME INCREMENT MINUTE 0 -128 8 MINUTE 0 2
+ 004073 SHORT TIME PERIOD OR DISPLACEMENT DAY 0 -128 8 DAY 0 2
+ 004074 SHORT TIME PERIOD OR DISPLACEMENT HOUR 0 -128 8 HOUR 0 2
+ 004075 SHORT TIME PERIOD OR DISPLACEMENT MINUTE 0 -128 8 MINUTE 0 2
+ 004080 AVERAGING PERIOD FOR FOLLOWING VALUE CODE TABLE 4080 0 0 4 CODE TABLE 4080 0 2
+ 004086 LONG TIME PERIOD OR DISPLACEMENT SECOND 0 -8192 15 SECOND 0 5
+ 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005011 LATITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005012 LATITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005015 LATITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005016 LATITUDE DISPLACEMENT (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 005023 SUN TO SATELLITE AZIMUTH DIFFERENCE DEGREE 1 -1800 12 DEGREE 1 4
+ 005030 DIRECTION (SPECTRAL) DEGREE 0 0 12 DEGREE 0 4
+ 005031 ROW NUMBER NUMERIC 0 0 12 NUMERIC 0 4
+ 005033 PIXEL SIZE ON HORIZONTAL - 1 M -1 0 16 M -1 5
+ 005034 ALONG TRACK ROW NUMBER NUMERIC 0 0 11 NUMERIC 0 4
+ 005036 SHIP TRANSECT NUMBER ACCORDING TO SOOP NUMERIC 0 0 7 NUMERIC 0 2
+ 005040 ORBIT NUMBER NUMERIC 0 0 24 NUMERIC 0 8
+ 005041 SCAN LINE NUMBER NUMERIC 0 0 8 NUMERIC 0 3
+ 005042 CHANNEL NUMBER NUMERIC 0 0 6 NUMERIC 0 2^M
+ 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8 NUMERIC 0 3
+ 005044 SATELLITE CYCLE NUMBER NUMERIC 0 0 11 NUMERIC 0 4
+ 005052 CHANNEL NUMBER INCREMENT NUMERIC 0 0 5 NUMERIC 0 2
+ 005053 FIELD OF VIEW NUMBER INCREMENT NUMERIC 0 0 5 NUMERIC 0 2
+ 005060 Y ANGULAR POSITION FROM CENTRE OF GRAVITY DEGREE 6 -8000000 24 DEGREE 6 8
+ 005061 Z ANGULAR POSITION FROM CENTRE OF GRAVITY DEGREE 6 -8000000 24 DEGREE 6 8
+ 005193 ALONG TRACK ROW NUMBER AT 50 KM NUMERIC 0 0 10 NUMERIC 0 4
+ 005194 ALONG TRACK ROW NUMBER AT 25 KM NUMERIC 0 0 11 NUMERIC 0 4
+ 005195 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 7 NUMERIC 0 3
+ 005196 SCAN ANGLE DEGREE 1 -1800 12 DEGREE 1 4
+ 005217 LOCATION OF PLATFORM, X M 2 -1073741824 31 M 2 10
+ 005232 DIRECTION (SPECTRAL) DEGREE 2 0 16 DEGREE 2 5
+ 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006011 LONGITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006012 LONGITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006015 LONGITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006016 LONGITUDE DISPLACEMENT (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006021 DISTANCE M -1 0 13 M -1 4
+ 006030 WAVE NUMBER (SPECTRAL) RAD/M 5 0 13 RAD/M 5 4
+ 006031 COLUMN NUMBER NUMERIC 0 0 12 NUMERIC 0 4
+ 006033 PIXEL SIZE ON HORIZONTAL - 2 M -1 0 16 M -1 5
+ 006034 CROSS-TRACK CELL NUMBER NUMERIC 0 0 7 NUMERIC 0 3
+ 006040 RADIUS OF CONFIDENCE M 0 0 13 M 0 4
+ 006193 CROSS TRACK CELL NUMBER AT 50 KM NUMERIC 0 0 6 NUMERIC 0 2
+ 006194 CROSS TRACK CELL NUMBER AT 25 KM NUMERIC 0 0 7 NUMERIC 0 3
+ 006217 LOCATION OF PLATFORM, Y M 2 -1073741824 31 M 2 10
+ 006232 WAVENUMBER (SPECTRAL) RADS/M 5 0 13 ADS/M 5 4
+ 007001 HEIGHT OF STATION (SEE NOTE 1) M 0 -400 15 M 0 5
+ 007002 HEIGHT OR ALTITUDE M -1 -40 16 M -1 5
+ 007003 GEOPOTENTIAL M**2/S**2 -1 -400 17 M**2/S**2 -1 6
+ 007004 PRESSURE PA -1 0 14 PA -1 5
+ 007005 HEIGHT INCREMENT M 0 -400 12 M 0 4
+ 007006 HEIGHT ABOVE STATION M 0 0 15 M 0 5
+ 007007 HEIGHT M 0 -1000 17 M 0 6
+ 007008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7
+ 007009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17 GPM 0 5
+ 007010 FLIGHT LEVEL M 0 -1024 16 FT -1 5
+ 007012 GRID POINT ALTITUDE M 2 -50000 20 M 2 7
+ 007021 ELEVATION (SEE NOTE 2) DEGREE 2 -9000 15 DEGREE 2 5
+ 007022 SOLAR ELEVATION DEGREE 2 -9000 15 DEGREE 2 5
+ 007024 SATELLITE ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 007025 SOLAR ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 007026 SATELLITE ZENITH ANGLE DEGREE 4 -900000 21 DEGREE 4 7
+ 007030 HEIGHT OF STATION GROUND ABOVE MEAN SEA LEVEL (SEE NOTE 3) M 1 -4000 17 M 1 5
+ 007031 HEIGHT OF BAROMETER ABOVE MEAN SEA LEVEL (SEE NOTE 4) M 1 -4000 17 M 1 5
+ 007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM) M 2 0 16 M 2 5
+ 007033 HEIGHT OF SENSOR ABOVE WATER SURFACE (SEE NOTE 6) M 1 0 12 M 1 4
+ 007040 IMPACT PARAMETER (SEE NOTE 8) M 1 62000000 22 M 1 8
+ 007061 DEPTH BELOW LAND SURFACE M 2 0 14 M 2 5
+ 007062 DEPTH BELOW SEA/WATER SURFACE M 1 0 17 M 1 6
+ 007063 DEPTH BELOW SEA/WATER SURFACE M 2 0 20 M 2 7
+ 007064 REPRESENTATIVE HEIGHT OF SENSOR ABOVE STATION (SEE NOTE 7) M 0 0 4 M 0 2
+ 007065 WATER PRESSURE PA -3 0 17 PA 0 6
+ 007070 DROGUE DEPTH M 0 0 10 M 0 4
+ 007217 LOCATION OF PLATFORM, Z M 2 -1073741824 31 M 2 10
+ 008001 VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8001 0 0 7 FLAG TABLE 8001 0 3
+ 008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS) CODE TABLE 8002 0 0 6 CODE TABLE 8002 0 2
+ 008003 VERTICAL SIGNIFICANCE (SATELLITE OBSERVATIONS) CODE TABLE 8003 0 0 6 CODE TABLE 8003 0 2
+ 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 8004 0 0 3 CODE TABLE 8004 0 1
+ 008005 METEOROLOGICAL ATTRIBUTE SIGNIFICANCE CODE TABLE 8005 0 0 4 CODE TABLE 8005 0 2
+ 008006 OZONE VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8006 0 0 9 FLAG TABLE 8006 0 3
+ 008007 DIMENSIONAL SIGNIFICANCE CODE TABLE 8007 0 0 4 CODE TABLE 8007 0 2
+ 008008 RADIATION VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8008 0 0 9 FLAG TABLE 8008 0 3
+ 008009 DETAILED PHASE OF FLIGHT CODE TABLE 8009 0 0 4 CODE TABLE 8009 0 2
+ 008010 SURFACE QUALIFIER (TEMPERATURE DATA) CODE TABLE 8010 0 0 5 CODE TABLE 8010 0 2
+ 008011 METEOROLOGICAL FEATURE CODE TABLE 8011 0 0 6 CODE TABLE 8011 0 2
+ 008012 LAND/SEA QUALIFIER CODE TABLE 8012 0 0 2 CODE TABLE 8012 0 1
+ 008013 DAY/NIGHT QUALIFIER CODE TABLE 8013 0 0 2 CODE TABLE 8013 0 1
+ 008014 QUALIFIER FOR RUNWAY VISUAL RANGE CODE TABLE 8014 0 0 4 CODE TABLE 8014 0 2
+ 008016 CHANGE QUALIFIER OF A TREND-TYPE FORECAST OR AN AERODROME FORECA CODE TABLE 8016 0 0 3 CODE TABLE 8016 0 1
+ 008017 QUALIFIER OF THE TIME WHEN THE FORECAST CHANGE IS EXPECTED CODE TABLE 8017 0 0 2 CODE TABLE 8017 0 1
+ 008018 SEAWINDS LAND/ICE SURFACE TYPE FLAG TABLE 8018 0 0 17 FLAG TABLE 8018 0 6
+ 008019 QUALIFIER FOR FOLLOWING CENTRE IDENTIFIER CODE TABLE 8019 0 0 4 CODE TABLE 8019 0 2
+ 008020 TOTAL NUMBER OF MISSING ENTITIES (WITH RESPECT TO ACCUMULATION O NUMERIC 0 0 16 NUMERIC 0 5
+ 008021 TIME SIGNIFICANCE CODE TABLE 8021 0 0 5 CODE TABLE 8021 0 2
+ 008022 TOTAL NUMBER (WITH RESPECT TO ACCUMULATION OR AVERAGE) NUMERIC 0 0 16 NUMERIC 0 5
+ 008023 FIRST ORDER STATISTICS CODE TABLE 8023 0 0 6 CODE TABLE 8023 0 2
+ 008024 DIFFERENCE STATISTICS CODE TABLE 8024 0 0 6 CODE TABLE 8024 0 2
+ 008025 TIME DIFFERENCE QUALIFIER CODE TABLE 8025 0 0 4 CODE TABLE 8025 0 2
+ 008026 MATRIX SIGNIFICANCE CODE TABLE 8026 0 0 6 CODE TABLE 8026 0 2
+ 008029 REMOTLY SENSED SURFACE TYPE CODE TABLE 8029 0 0 8 CODE TABLE 8029 0 3
+ 008030 MANUAL ON CODES (VOLUME I.1, SECTION C) CODE TABLE FROM WHICH DA NUMERIC 0 0 13 NUMERIC 0 4
+ 008031 DATA CATEGORY CREX TABLE A NUMERIC 0 0 8 NUMERIC 0 3
+ 008033 METHOD OF DERIVATION OF PERCENTAGE CONFIDENCE CODE TABLE 8033 0 0 7 CODE TABLE 8033 0 3
+ 008035 TYPE OF MONITORING EXERCISE CODE TABLE 8035 0 0 3 CODE TABLE 8035 0 1
+ 008036 TYPE OF CENTRE OR STATION PERFORMING MONITORING CODE TABLE 8036 0 0 3 CODE TABLE 8036 0 1
+ 008039 TIME SIGNIFICANCE ( AVIATION FORECAST) CODE TABLE 8039 0 0 6 CODE TABLE 8039 0 2
+ 008040 FLIGHT LEVEL SIGNIFICANCE CODE TABLE 8040 0 0 6 CODE TABLE 8040 0 2
+ 008041 DATA SIGNIFICANCE CODE TABLE 8041 0 0 5 CODE TABLE 8041 0 2
+ 008042 EXTENDED VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8042 0 0 18 FLAG TABLE 8042 0 6
+ 008043 ATMOSPHERIC CHEMICAL OR PHISICAL CONSTITUENT TYPE CODE TABLE 8043 0 0 8 CODE TABLE 8043 0 3
+ 008044 CAS REGISTRY NUMBER CCITTIA5 0 0 88 CHARACTERS 0 11
+ 008045 PARTICULATE MATTER CHARACTERIZATION CODE TABLE 8045 0 0 8 CODE TABLE 8045 0 3
+ 008049 NUMBER OF OBSERVATIONS NUMERIC 0 0 8 NUMERIC 0 3
+ 008050 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 8050 0 0 4 CODE TABLE 8050 0 2
+ 008051 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 8051 0 0 3 CODE TABLE 8051 0 1
+ 008052 CONDITION FOR WHICH NUMBER OF DAYS OF OCCURRENCE FOLLOWS CODE TABLE 8052 0 0 5 CODE TABLE 8052 0 2
+ 008053 DAY OF OCCURRENCE QUALIFIER CODE TABLE 8053 0 0 2 CODE TABLE 8053 0 1
+ 008054 QUALIFIER FOR WIND SPEED OR WIND GUST CODE TABLE 8054 0 0 3 CODE TABLE 8054 0 1
+ 008060 SAMPLE SCANNING MODE SIGNIFICANCE CODE TABLE 8060 0 0 4 CODE TABLE 8060 0 2
+ 008065 SUN-GLINT INDICATOR CODE TABLE 8065 0 0 2 CODE TABLE 8065 0 1
+ 008066 SEMI-TRANSPARENCY INDICATOR CODE TABLE 8066 0 0 2 CODE TABLE 8066 0 1
+ 008070 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8070 0 0 4 CODE TABLE 8070 0 2
+ 008072 PIXEL(S) TYPE CODE TABLE 8072 0 0 3 CODE TABLE 8072 0 1
+ 008074 ALTIMETER ECHO TYPE CODE TABLE 8074 0 0 2 CODE TABLE 8074 0 1
+ 008075 ASCENDING/DESCENDING ORBIT QUALIFIER CODE TABLE 8075 0 0 2 CODE TABLE 8075 0 1
+ 008076 TYPE OF BAND CODE TABLE 8076 0 0 6 CODE TABLE 8076 0 2
+ 008077 RADIOMETER SENSED SURFACE TYPE CODE TABLE 8077 0 0 7 CODE TABLE 8077 0 3
+ 008079 PRODUCT STATUS CODE TABLE 8079 0 0 4 CODE TABLE 8079 0 2
+ 008080 QUALIFIER FOR GTSPP QUALITY FLAG CODE TABLE 8080 0 0 6 CODE TABLE 8080 0 2
+ 008081 TYPE OF EQUIPMENT CODE TABLE 8081 0 0 6 CODE TABLE 8081 0 2
+ 008082 (CBS) ARTIFICIAL CORRECTION OF SENSOR HEIGHT TO ANOTHER VALUE CODE TABLE 8082 0 0 3 CODE TABLE 8082 0 1
+ 008083 NOMINAL VALUE INDICATOR FLAG TABLE 8083 0 0 15 FLAG TABLE 8083 0 5
+ 008085 BEAM IDENTIFIER CODE TABLE 8085 0 0 3 CODE TABLE 8085 0 1
+ 008090 DECIMAL SCALE NUMERIC 0 -127 8 NUMERIC 0 3
+ 008193 TIME QUALIFIER CODE TABLE 8193 0 0 6 CODE TABLE 8193 0 2
+ 008194 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8194 0 0 4 CODE TABLE 8194 0 2
+ 008195 DATA TYPE CODE TABLE 8195 0 0 7 CODE TABLE 8195 0 3
+ 008200 NUMBER OF OBSERVATIONS NUMERIC 0 0 8 NUMERIC 0 3
+ 008222 GENERATOR SIGNIFICANCE CODE TABLE 8222 0 0 4 CODE TABLE 8222 0 2
+ 008223 LAND/ICE SURFACE FLAG FLAG TABLE 8223 0 0 7 FLAG TABLE 8223 0 3
+ 008224 LAND/SEA FRACTION NUMERIC 3 0 10 NUMERIC 3 4
+ 008225 GHRSST SURFACE TYPE FLAG TABLE 8225 0 0 5 FLAG TABLE 8225 0 2
+ 010001 HEIGHT OF LAND SURFACE M 0 -400 15 M 0 5
+ 010002 HEIGHT M -1 -40 16 M -1 5
+ 010003 GEOPOTENTIAL M**2/S**2 -1 -400 17 M**2/S**2 -1 6
+ 010004 PRESSURE PA -1 0 14 PA -1 5
+ 010007 HEIGHT M 0 -1000 17 M 0 6
+ 010008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7
+ 010009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17 GPM 0 5
+ 010010 MINIMUM PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010011 MAXIMUM PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010031 IN DIRECTION OF THE NORTH POLE, DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31 M 2 10
+ 010032 SATELLITE DISTANCE TO EARTH'S CENTRE M 1 0 27 M 2 9
+ 010033 ALTITUDE (PLATFORM TO ELLIPSOID) M 1 0 27 M 2 9
+ 010034 EARTH RADIUS M 1 0 27 M 2 9
+ 010035 EARTH'S LOCAL RADIUS OF CURVATURE M 1 62000000 22 M 1 8
+ 010036 GEOID UNDULATION (SEE NOTE 4) M 2 -15000 15 M 2 6
+ 010040 NUMBER OF RETRIEVED LAYERS NUMERIC 0 0 10 NUMERIC 0 4
+ 010050 STANDARD DEVIATION ALTITUDE M 2 0 16 M 2 5
+ 010051 PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010052 ALTIMETER SETTING (QNH) PA -1 0 14 PA -1 5
+ 010060 PRESSURE CHANGE PA -1 -1024 11 PA -1 4
+ 010061 3-HOUR PRESSURE CHANGE PA -1 -500 10 PA -1 4
+ 010062 24-HOUR PRESSURE CHANGE PA -1 -1000 11 PA -1 4
+ 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 10063 0 0 4 CODE TABLE 10063 0 2
+ 010064 SIGMET CRUISING LEVEL CODE TABLE 10064 0 0 3 CODE TABLE 10064 0 1
+ 010070 INDICATED AIRCRAFT ALTITUDE M 0 -400 16 M 0 5
+ 010080 VIEWING ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 010081 ALTITUDE OF COG ABOVE REFERENCE ELLIPSOID M 3 0 31 M 3 10
+ 010082 INSTANTANEOUS ALTITUDE RATE MS-1 3 -65536 17 MS-1 3 6
+ 010083 SQUARED OFF NADIR ANGLE OF THE SATELLITE FROM PLATFORM DATA DEGREE**2 2 0 16 DEGREE**2 2 5
+ 010084 SQUARED OFF NADIR ANGLE OF THE SATELLITE FROM WAVEFORM DATA DEGREE**2 2 0 16 DEGREE**2 2 5
+ 010085 MEAN SEA SURFACE HEIGHT M 3 -131072 18 M 3 6
+ 010086 GEOID'S HEIGHT M 3 -131072 18 M 3 6
+ 010087 OCEAN DEPTH/LAND ELEVATION M 1 -131072 18 M 3 6
+ 010088 TOTAL GEOCENTRIC OCEAN TIDE HEIGHT SOLUTION 1 M 3 -32768 16 M 3 5
+ 010089 TOTAL GEOCENTRIC OCEAN TIDE HEIGHT SOLUTION 2 M 3 -32768 16 M 3 5
+ 010090 LONG PERIOD TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010091 TIDAL LOADING HEIGHT M 3 -32768 16 M 3 5
+ 010092 SOLID EARTH TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010093 GEOCENTRIC POLE TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010095 HEIGHT OF ATMOSPHERE USED M 0 0 16 M 0 5
+ 010096 MEAN DYNAMIC TOPOGRAPHY M 3 -131072 18
+ 010097 MEAN SEA SURFACE HEIGHT FROM ALTIMETER ONLY M 3 -131072 18
+ 010098 LOADING TIDE HEIGHT GEOCENTRIC OCEAN TIDE SOLUTION 1 M 4 -2000 12
+ 010099 LOADING TIDE HEIGHT GEOCENTRIC OCEAN TIDE SOLUTION 2 M 4 -2000 12
+ 010100 NON-EQUILIBRIUM LONG PERIOD TIDE HEIGHT M 4 -2000 12
+ 010101 SQUARED OFF NADIR ANGLE OF THE SATELLITE FROM WAVEFORM DATA DEGREE**2 2 -32768 16 DEGREE**2 2 5
+ 010195 HEIGHT(HIGH ACCURACY) M 1 -4096 20
+ 010196 SOLAR ZENITH ANGLE DEGREE 2 -9000 15
+ 010197 ANEMOMETER HEIGHT M 0 0 9
+ 011001 WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011002 WIND SPEED M/S 1 0 12 M/S 1 4
+ 011003 U-COMPONENT M/S 1 -4096 13 M/S 1 4
+ 011004 V-COMPONENT M/S 1 -4096 13 M/S 1 4
+ 011005 W-COMPONENT PA/S 1 -512 10 PA/S 1 4
+ 011006 W-COMPONENT M/S 2 -4096 13 M/S 2 4
+ 011010 WIND DIRECTION ASSOCIATED WITH WIND SPEED WHICH FOLLOWS DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011011 WIND DIRECTION AT 10 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011012 WIND SPEED AT 10 M M/S 1 0 12 M/S 1 4
+ 011013 WIND DIRECTION AT 5 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011014 WIND SPEED AT 5 M M/S 1 0 12 M/S 1 4
+ 011016 EXTREME COUNTERCLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011017 EXTREME CLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011019 STEADINESS OF WIND (6) % 0 0 7 % 0 3
+ 011021 RELATIVE VORTICITY 1/S 9 -65536 17 1/S 9 6
+ 011022 DIVERGENCE 1/S 9 -65536 17 1/S 9 6
+ 011023 VELOCITY POTENTIAL M**2/S -2 -65536 17 M**2/S -2 6
+ 011030 EXTENDED DEGREE OF TURBULENCE CODE TABLE 11030 0 0 6 CODE TABLE 0 2
+ 011031 DEGREE OF TURBULENCE CODE TABLE 11031 0 0 4 CODE TABLE 11031 0 2
+ 011032 HEIGHT OF BASE OF TURBULENCE M -1 -40 16 M -1 5
+ 011033 HEIGHT OF TOP OF TURBULENCE M -1 -40 16 M -1 5
+ 011034 VERTICAL GUST VELOCITY M/S 1 -1024 11 M/S 1 4
+ 011035 VERTICAL GUST ACCELERATION M/S**2 2 -8192 14 M/S**2 2 5
+ 011036 MAXIMUM DERIVED EQUIVALENT VERTICAL GUST SPEED M/S 1 0 10 M/S 1 4
+ 011037 TURBULENCE INDEX CODE TABLE 11037 0 0 6 CODE TABLE 11037 0 2
+ 011038 TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11038 0 0 5 CODE TABLE 11038 0 2
+ 011039 EXTENDED TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11039 0 0 6 CODE TABLE 11039 0 2
+ 011040 MAXIMUM WIND SPEED (MEAN WIND) M/S 1 0 12 M/S 1 4
+ 011041 MAXIMUM WIND GUST SPEED M/S 1 0 12 M/S 1 4
+ 011042 MAXIMUM WIND SPEED (10-MIN MEAN WIND) M/S 1 0 12 M/S 1 4
+ 011043 MAXIMUM WIND GUST DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011044 MEAN WIND DIRECTION FOR SURFACE - 1500 M (5000 FEET) DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011045 MEAN WIND SPEED FOR SURFACE - 1500 M (5000 FEET) M/S 1 0 12 M/S 1 4
+ 011046 MAXIMUM INSTANTANEOUS WIND SPEED M/S 1 0 12 M/S 1 4
+ 011047 MAXIMUM INSTANTANEOUS WIND SPEED OVER 10 MINUTES M/S 1 0 12 M/S 1 4
+ 011049 STANDARD DEVIATION OF WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011050 STANDARD DEVIATION OF HORIZONTAL WIND SPEED M/S 1 0 12 M/S 1 4
+ 011051 STANDARD DEVIATION OF VERTICAL WIND SPEED M/S 1 0 8 M/S 1 3
+ 011052 FORMAL UNCERTAINTY IN WIND SPEED M/S 2 0 13 M/S 2 5
+ 011053 FORMAL UNCERTAINTY IN WIND DIRECTION DEGREE TRUE 2 0 15 DEGREE TRUE 2 5
+ 011054 MEAN WIND DIRECTION FOR 1500 M - 3000 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011055 MEAN WIND SPEED FOR 1500 M - 3000 M M/S 1 0 12 M/S 1 4
+ 011061 ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW M/S 1 0 12 M/S 1 4
+ 011062 ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE M/S 1 0 12 M/S 1 4
+ 011070 DESIGNATOR OF THE RUNWAY AFFECTED BY WIND SHEAR (INCLUDING ALL) CCITTIA5 0 0 32 CHARACTER 0 4
+ 011071 TURBULENT VERTICAL MOMENTUM FLUX M**2/S**2 3 -128 14 M**2/S**2 3 5
+ 011072 TURBULENT VERTICAL BUOYANCY FLUX KM/S 3 -128 11 KM/S 3 4
+ 011073 TURBULENT KINETIC ENERGY M**2/S**2 2 -1024 13 M**2/S**2 2 4
+ 011074 DISSIPATION ENERGY M**2/S**2 2 -1024 10 M**2/S**2 2 4
+ 011075 MEAN TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3
+ 011076 PEAK TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3
+ 011077 REPORTING INTERVAL OR AVERAGING TIME FOR EDDY DISSIPATION RATE S 0 0 12 S 0 4
+ 011081 MODEL WIND DIRECTION AT 10M DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 011082 MODEL WIND SPEED AT 10M M/S 2 0 14 M/S 2 4
+ 011083 WIND SPEED KM/HOUR 0 0 9 KM/HOUR 0 3
+ 011084 WIND SPEED KNOT 0 0 8 KNOT 0 3
+ 011085 MAXIMUM WIND GUST SPEED KM/HOUR 0 0 9 KM/HOUR 0 3
+ 011086 MAXIMUM WIND GUST SPEED KNOT 0 0 8 KNOT 0 3
+ 011095 U COMPONENT OF THE MODEL WIND VECTOR M/S 1 -4096 13 M/S 1 4
+ 011096 V COMPONENT OF THE MODEL WIND VECTOR M/S 1 -4096 13 M/S 1 4
+ 011097 WIND SPEED FROM ALTIMETER M/S 2 0 12
+ 011098 WIND SPEED FROM RADIOMETER M/S 2 0 12
+ 011192 U - COMPONENT AT 10 M M/S 1 -4096 13 M/S 1 4^M
+ 011193 V - COMPONENT AT 10 M M/S 1 -4096 13 M/S 1 4^M
+ 011194 W - COMPONENT AT 10 M M/S 1 -4096 13 M/S 1 4^M
+ 011195 STEADINESS OF WIND % 0 0 7 % 0 3
+ 011196 FRICTION VELOCITY M/S 5 0 19
+ 011201 HORIZONTAL LINE OF SIGHT COMPONENT M/S 1 -4096 13
+ 011210 1D VAR WIND SPEED RETREIVED ERRO(S) M/S 2 0 12
+ 011211 WIND SPEED INDEPENDENT ESTIMATE OF ERROR(S) M/S 2 0 12
+ 011220 FORMAL UNCERTAINTY IN WIND SPEED M/S 2 0 12
+ 011221 FORMAL UNCERTAINTY IN WIND DIRECTION DEGREE TRUE 2 0 15
+ 011230 MAXIMUM MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4^M
+ 011231 MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4^M
+ 011232 MINIMUM MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4^M
+ 011233 HIGHEST GUST DURING THE 10 MINUTE PERIOD PRECEDING OBSERVATION M/S 1 -4096 13 M/S 1 4^M
+ 012001 TEMPERATURE/DRY-BULB TEMPERATURE K 1 0 12 C 1 3
+ 012002 WET-BULB TEMPERATURE K 1 0 12 C 1 3
+ 012003 DEW-POINT TEMPERATURE K 1 0 12 C 1 3
+ 012004 DRY-BULB TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012005 WET-BULB TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012006 DEW-POINT TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012007 VIRTUAL TEMPERATURE K 1 0 12 C 1 3
+ 012011 MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12 C 1 3
+ 012012 MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12 C 1 3
+ 012013 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS K 1 0 12 C 1 3
+ 012014 MAXIMUM TEMPERATURE AT 2 M, PAST 12 HOURS K 1 0 12 C 1 3
+ 012015 MINIMUM TEMPERATURE AT 2 M, PAST 12 HOURS K 1 0 12 C 1 3
+ 012016 MAXIMUM TEMPERATURE AT 2 M, PAST 24 HOURS K 1 0 12 C 1 3
+ 012017 MINIMUM TEMPERATURE AT 2 M, PAST 24 HOURS K 1 0 12 C 1 3
+ 012021 MAXIMUM TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012022 MINIMUM TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012023 TEMPERATURE C 0 -99 8 C 0 2
+ 012024 DEW POINT TEMPERATURE C 0 -99 8 C 0 2
+ 012030 SOIL TEMPERATURE K 1 0 12 C 1 3
+ 012049 TEMPERATURE CHANGE OVER SPECIFIED PERIOD K 0 -30 6 C 0 2
+ 012051 STANDARD DEVIATION TEMPERATURE K 1 0 10 C 1 3
+ 012052 HIGHEST DAILY MEAN TEMPERATURE K 1 0 12 C 1 3
+ 012053 LOWEST DAILY MEAN TEMPERATURE K 1 0 12 C 1 3
+ 012061 SKIN TEMPERATURE K 1 0 12 C 1 3
+ 012062 EQUIVALENT BLACK BODY TEMPERATURE K 1 0 12 C 1 3
+ 012063 BRIGHTNESS TEMPERATURE K 1 0 12 C 1 3
+ 012064 INSTRUMENT TEMPERATURE K 1 0 12 K 1 4
+ 012065 STANDARD DEVIATION BRIGHTNESS TEMPERATURE K 1 0 12 K 1 4
+ 012070 WARM LOAD TEMPERATURE K 2 0 16 K 2 5
+ 012071 COLDEST CLUSTER TEMPERATURE K 1 0 12 K 1 4
+ 012072 RADIANCE WM**(-2)SR**(-1) 6 0 31 WM**(-2)SR**(-1) 6 9
+ 012073 TEMPERATURE K 2 0 16 K 1 4
+ 012075 SPECTRAL RADIANCE WM**(-3)SR**(-1) -3 0 16 WM**(-3)SR**(-1) -3 5
+ 012076 RADIANCE WM**(-2)SR**(-1) 3 0 16 WM**(-2)SR**(-1) 3 5
+ 012080 BRIGHTNESS TEMPERATURE REAL PART K 2 -10000 16 K 2 5
+ 012081 BRIGHTNESS TEMPERATURE IMAGINARY PART K 2 -10000 16 K 2 5
+ 012082 PIXEL RADIOMETRIC ACCURACY K 2 0 12 K 2 4
+ 012101 TEMPERATURE/DRY-BULB TEMPERATURE K 2 0 16 C 2 4
+ 012102 WET-BULB TEMPERATURE K 2 0 16 C 2 4
+ 012103 DEW-POINT TEMPERATURE K 2 0 16 C 2 4
+ 012104 DRY-BULB TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012105 WEB-BULB TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012106 DEW-POINT TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012107 VIRTUAL TEMPERATURE K 2 0 16 C 2 4
+ 012111 MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 2 0 16 C 2 4
+ 012112 MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 2 0 16 C 2 4
+ 012113 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS K 2 0 16 C 2 4
+ 012114 MAXIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 2 0 16 C 2 4
+ 012115 MINIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 2 0 16 C 2 4
+ 012116 MAXIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 2 0 16 C 2 4
+ 012117 MINIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 2 0 16 C 2 4
+ 012118 MAXIMUM TEMPERATURE AT HEIGHT SPECIFIED, PAST 24 HOURS K 2 0 16 C 2 4
+ 012119 MINIMUM TEMPERATURE AT HEIGHT SPECIFIED, PAST 24 HOURS K 2 0 16 C 2 4
+ 012121 GROUND MINIMUM TEMPERATURE K 2 0 16 C 2 4
+ 012122 GROUND MINIMUM TEMPERATURE OF THE PRECEDING NIGHT K 2 0 16 C 2 4
+ 012130 SOIL TEMPERATURE K 2 0 16 C 2 4
+ 012151 STANDARD DEVIATION OF DAILY MEAN TEMPERATURE K 2 0 12 C 2 4
+ 012152 HIGHEST DAILY MEAN TEMPERATURE K 2 0 16 C 2 4
+ 012153 LOWEST DAILY MEAN TEMPERATURE K 2 0 16 C 2 4
+ 012161 SKIN TEMPERATURE K 2 0 16 C 2 4
+ 012162 EQUIVALENT BLACK BODY TEMPERATURE K 2 0 16 C 2 4
+ 012163 BRIGHTNESS TEMPERATURE K 2 0 16 C 2 4
+ 012164 INSTRUMENT TEMPERATURE K 2 0 16 K 2 5
+ 012165 DIRECT SUN BRIGHTNESS TEMPERATURE K 0 0 23 K 0 7
+ 012166 SNAPSHOT ACCURACY K 1 -4000 13 K 1 4
+ 012167 RADIOMETRIC ACCURACY (PURE POLARISATION) K 1 0 9 K 1 3
+ 012168 RADIOMETRIC ACCURACY ( CRESS POLARISATION ) K 1 0 9 K 1 3
+ 012171 COLDEST CLUSTER TEMPERATURE K 2 0 16 K 2 5
+ 012180 AVERAGED 12 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012181 AVERAGED 11 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012182 AVERAGED 3.7 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012183 AVERAGED 12 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012184 AVERAGED 11 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012185 AVERAGED 3.7 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012186 MEAN NADIR SEA SURFACE TEMPERATURE K 2 0 16 K 2 5
+ 012187 MEAN DUAL VIEW SEA SURFACE TEMPERATURE K 2 0 16 K 2 5
+ 012188 INTERPOLATED 23.8 GHZ BRIGHTNESS T FROM MWR K 2 0 16 K 2 5
+ 012189 INTERPOLATED 36.5 GHZ BRIGHTNESS T FROM MWR K 2 0 16 K 2 5
+ 012193 COLDEST CLUSTER TEMPERATURE K 1 0 12
+ 012194 RADIANCE W/M**2*STER*M**(-1) 6 0 31
+ 012195 SPECTRAL RADIANCE W/M**2*STER*M**(-1) 10 0 31
+ 012196 RADIANCE W/M**2*STER 3 0 16
+ 012197 MAXIMUM TEMPERATURE AT 2M, PAST 3 HOURS K 1 0 12
+ 012198 MINIMUM TEMPERATURE AT 2M, PAST 3 HOURS K 1 0 12
+ 012199 MAXIMUM TEMPERATURE AT 2M, PAST 6 HOURS K 1 0 12
+ 012200 MINIMUM TEMPERATURE AT 2M, PAST 6 HOURS K 1 0 12
+ 012201 BRIGHTNES TEMPERATURE OR STOKES PARAMETER K 3 -271300 20
+ 013001 SPECIFIC HUMIDITY KG/KG 5 0 14 KG/KG 5 5
+ 013002 MIXING RATIO KG/KG 5 0 14 KG/KG 5 5
+ 013003 RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013004 VAPOUR PRESSURE PA -1 0 10 PA -1 4
+ 013005 VAPOUR DENSITY KG/M**3 3 0 7 KG/M**3 3 3
+ 013006 MIXING HEIGHTS M -1 -40 16 M -1 5
+ 013007 MINIMUM RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013008 MAXIMUM RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013009 RELATIVE HUMIDITY % 1 -1000 12 % 1 4
+ 013011 TOTAL PRECIPITATION/TOTAL WATER EQUIVALENT KG/M**2 1 -1 14 KG/M**2 1 5
+ 013012 DEPTH OF FRESH SNOW M 2 -2 12 M 2 4
+ 013013 TOTAL SNOW DEPTH M 2 -2 16 M 2 5
+ 013014 RAINFALL/WATER EQUIVALENT OF SNOW (AVERAGED RATE) KG/(M**2)S 4 0 12 KG/(M**2)S 4 4
+ 013015 SNOWFALL (AVERAGED RATE) M/S 7 0 12 M/S 7 4
+ 013016 PRECIPITABLE WATER KG/M**2 0 0 7 KG/M**2 0 3
+ 013019 TOTAL PRECIPITATION PAST 1 HOUR KG/M**2 1 -1 14 KG/M**2 1 4
+ 013020 TOTAL PRECIPITATION PAST 3 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013021 TOTAL PRECIPITATION PAST 6 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013022 TOTAL PRECIPITATION PAST 12 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013023 TOTAL PRECIPITATION PAST 24 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013031 EVAPOTRANSPIRATION KG/M**2 0 0 7 KG/M**2 0 3
+ 013032 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 8 KG/M**2 1 3
+ 013033 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 10 KG/M**2 1 4
+ 013038 SUPERADIABATIC INDICATOR CODE TABLE 13038 0 0 2 CODE TABLE 13038 0 1
+ 013039 TERRAIN TYPE (ICE/SNOW) CODE TABLE 13039 0 0 3 CODE TABLE 13039 0 1
+ 013040 SURFACE FLAG CODE TABLE 13040 0 0 4 CODE TABLE 13040 0 2
+ 013041 PASQUILL-GIFFORD STABILITY CATEGORY CODE TABLE 13041 0 0 4 CODE TABLE 13041 0 2
+ 013042 PARCEL LIFTED INDEX (TO 500 HPA) K 0 -20 6 K 0 2
+ 013043 BEST LIFTED INDEX (TO 500 HPA) K 0 -20 6 K 0 2
+ 013044 K INDEX K 0 -30 8 K 0 3
+ 013045 KO INDEX K 0 -30 8 K 0 3
+ 013046 MAXIMUM BUOYANCY K 0 -30 8 K 0 3
+ 013047 MODIFIED SHOWALTER STABILITY INDEX K 0 -60 6 C 0 2
+ 013048 WATER FRACTION % 1 0 10 % 1 4
+ 013051 FREQUENCY GROUP, PRECIPITATION CODE TABLE 13051 0 0 4 CODE TABLE 13051 0 2
+ 013052 HIGHEST DAILY AMOUNT OF PRECIPITATION KG/M**2 1 -1 14 KG/M**2 1 5
+ 013055 INTENSITY OF PRECIPITATION KG/(M**2)S 4 0 8 MM H-1 1 3
+ 013056 CHARACTER AND INTENSITY OF PRECIPITATION CODE TABLE 13056 0 0 4 CODE TABLE 13056 0 2
+ 013057 TIME OF BEGINNING OR END OF PRECIPITATION CODE TABLE 13057 0 0 4 CODE TABLE 13057 0 2
+ 013058 SIZE OF PRECIPITATING ELEMENT M 4 0 7 MM 1 3
+ 013059 NUMBER OF FLASHES (THUNDERSTORM) NUMERIC 0 0 7 NUMERIC 0 3
+ 013060 TOTAL ACCUMULATED PRECIPITATION KG/M**2 1 -1 17 KG/M**2 1 5
+ 013071 UPSTREAM WATER LEVEL M 2 0 14 M 2 5
+ 013072 DOWNSTREAM WATER LEVEL M 2 0 14 M 2 4
+ 013073 MAXIMUM WATER LEVEL M 2 0 14 M 2 4
+ 013080 WATER PH pH 1 0 10 pH 1 3
+ 013081 WATER CONDUCTIVITY S M-1 3 0 14 S M-1 3 4
+ 013082 WATER TEMPERATURE K 1 0 12 K 1 4
+ 013083 DISSOLVED OXYGEN KG/M**3 6 0 15 KG/M**3 6 5
+ 013084 TURBIDITY LUMEN 0 0 14 LUMEN 0 4
+ 013085 OXYDATION REDUCTION POTENTIAL (ORP) V 3 0 14 V 3 4
+ 013090 RADIOMETER WATER VAPOUR CONTENT KG/M**2 1 0 10 KG/M**2 1 4
+ 013091 RADIOMETER LIQUID CONTENT KG/M**2 2 0 8 KG/M**2 2 3
+ 013093 CLOUD OPTICAL THICKNESS NUMERIC 0 0 8 NUMERIC 0 3
+ 013095 TOTAL COLUMN WATER VAPOUR KG/M**2 4 0 19 KG/M**2 4 6
+ 013096 MWR WATER VAPOUR CONTENT KG/M**2 2 0 14 KG/M**2 2 4
+ 013097 MWR LIQUID WATER CONTENT KG/M**2 2 0 14 KG/M**2 2 4
+ 013098 INTEGRATED WATER VAPOUR DENSITY KG/M**2 8 0 30 KG/M**2 8 10
+ 013192 RELATIVE HUMIDITY AT 2 M % 0 0 8
+ 013193 RELATIVE HUMIDITY % 0 0 8
+ 013194 TOTAL COLUMN WATER KG/M**2 2 0 11
+ 013195 RAIN RATE KG/M**2HOUR 0 0 5
+ 013196 ANTECEDENT PRECIPITATION INDEX KG/M**2 0 0 7
+ 013197 TOTAL COLUMN WATER VAPOUR KG/M**2 1 0 10
+ 013198 RAIN FLAG CODE TABLE 13198 0 0 3
+ 013199 SPECIFIC HUMIDITY AT 2 M KG/KG 5 0 14
+ 013201 CLOUD LIQUID WATER KG/KG 7 0 14
+ 013202 TYPE OF SURFACE CODE TABLE 13202 0 0 8
+ 013203 1D VAR ESTIMATE OF RAIN RATE KG/M**2*HOUR 2 0 12
+ 013204 SSMI INDEPENDENT ESTIMATE OF RAIN RATE KG/M**2*HOUR 2 0 12
+ 013205 CLOUD LIQUID WATER PATH KG/M**2 4 0 14
+ 013206 TOTAL PRECIPITATION ICE CONTENT KG/M**2 6 0 14
+ 013207 TOTAL CLOUD LIQUID WATER KG/M**2 6 0 14
+ 013208 SURFACE RAIN RATE ( INSTANTANEOUS ) KG/M**2*S 5 0 17
+ 013209 RAIN POSSIBILITY NUMERIC 0 -256 9
+ 013210 1D VAR CLOUD LIQUID WATER PATH RETRIEVED ERROR(S) KG/M**2 4 0 14
+ 013211 TOTAL PRECIPITABLE WATER INDIPENDENT ESTIMATE OF ERROR(S) KG/M**2 2 0 11
+ 013212 CLOUD LIQUID WATER PATH INDIPENDENT ESTIMATE OF ERROR(S) KG/M**2 4 0 14
+ 013230 CONVECTIVE PRECIPITATION KG/M**2 1 -1 14
+ 013231 LARGE SCALE PRECIPITATION KG/M**2 1 -1 14
+ 013240 AIR DENSITY KG/M**3 3 0 10
+ 013241 CONVECTIVE AVAILABLE POTENTIAL ENERGY J/KG 1 0 17
+ 014001 LONG-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014002 LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014003 SHORT-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014004 SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014011 NET LONG-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014012 NET LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014013 NET SHORT-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014014 NET SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014015 NET RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 -16384 15 J/M**2 -4 5
+ 014016 NET RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 -16384 15 J/M**2 -4 5
+ 014017 INSTANTANEOUS LONG-WAVE RADIATION (SEE NOTE 6) W/M**2 -3 -2048 12 W/M**2 -3 4
+ 014018 INSTANTANEOUS SHORT-WAVE RADIATION (SEE NOTE 6) W/M**2 -3 -2048 12 W/M**2 -3 4
+ 014019 SURFACE ALBEDO % 0 0 7 % 0 3
+ 014020 GLOBAL SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014021 GLOBAL SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014022 DIFFUSE SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014023 DIFFUSE SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014024 DIRECT SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014025 DIRECT SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014026 ALBEDO AT THE TOP OF CLOUDS % 0 0 7 % 0 3
+ 014027 ALBEDO % 0 0 7 % 0 3
+ 014028 GLOBAL SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S J/M**2 -2 0 16 J/M**2 -2 5
+ 014029 DIFFUSE SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD J/M**2 -2 0 16 J/M**2 -2 5
+ 014030 DIRECT SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S J/M**2 -2 0 16 J/M**2 -2 5
+ 014031 TOTAL SUNSHINE MINUTE 0 0 11 MINUTE 0 4
+ 014032 TOTAL SUNSHINE HOUR 0 0 10 HOUR 0 4
+ 014033 TOTAL SUNSHINE % 0 0 9 % 0 3
+ 014034 SUNSHINE OVER PERIOD SPECIFIED MINUTE 0 0 11 MINUTE 0 4
+ 014042 BI-DIRECTIONAL REFLECTANCE % 0 0 7 % 0 3
+ 014045 CHANNEL RADIANCE (W/M**2)*(1/SR)*(1/CM) 0 0 11 WM-2SR-1CM-1 0 4
+ 014046 SCALED IASI RADIANCE (W/M**2)*(1/SR)*(1/M) 0 -5000 16 (W/M**2)*(1/SR)*(1/M) 0 5
+ 014047 SCALED MEAN AVHRR RADIANCE (W/M**2)*(1/SR)*(1/M) 0 0 31 (W/M**2)*(1/SR)*(1/M) 0 10
+ 014048 SCALED STANDARD DEVIATION RADIANCE (W/M**2)*(1/SR)*(1/M) 0 0 31 (W/M**2)*(1/SR)*(1/M) 0 10
+ 014050 EMISSIVITY (SEE NOTE 5) % 1 0 10 % 1 4
+ 014051 DIRECT SOLAR RADIATION INTEGRATED OVER LAST HOUR J/M**2 -3 0 14 JM-2 -3 4
+ 014055 SOLAR ACTIVITY INDEX NUMERIC 0 -32768 16 NUMERIC 0 5
+ 014061 (VAL) INSTANTANEOUS LONG-WAVE RADIATION W/M**2 0 -512 10 W/M**2 0 4
+ 014062 (VAL) INSTANTANEOUS SHORT-WAVE RADIATION W/M**2 0 -2048 12 W/M**2 0 4
+ 015001 TOTAL OZONE DU 0 0 10 DU 0 4
+ 015002 AIR MASS (SLANT PATH AT 22 KM) NUMERIC 2 0 10 NUMERIC 2 3
+ 015003 MEASURED OZONE PARTIAL PRESSURE (SOUNDING) PA 4 0 9 NBAR 0 3
+ 015004 OZONE SOUNDING CORRECTION FACTOR NUMERIC 3 0 11 NUMERIC 3 4
+ 015005 OZONE P DU 0 0 10 DU 0 3
+ 015008 SCALED MIXING RATIO NUMERIC 0 0 10 NUMERIC 0 4
+ 015011 LOG 10 OF INTEGRATED ELECTRON DENSITY LOG (1/M2) 3 14000 13 LOG (M-2) 3 4
+ 015012 TOTAL ELECTRON COUNT PER SQUARE METER 1/M**2 -16 0 6 1/M**2 -16 2
+ 015015 MAXIMUM IMAGE SPECTRAL COMPONENT BEFORE NORMALIZATION NUMERIC 0 0 31 NUMERIC 0 10
+ 015020 INTEGRATED 03 DENSITY KG/M**2 8 0 21 KG/M**2 8 7
+ 015021 INTEGRATED MASS DENSITY KG/M**2 11 0 31 KG/M**2 11 10
+ 015024 OPTICAL DEPTH NUMERIC 4 0 24 NUMERIC 4 8
+ 015025 TYPE OF POLLUTANT CODE TABLE 15025 0 0 4 CODE TABLE 15025 0 2
+ 015026 CONCENTRATION OF POLLUTANT MOLMOL-1 9 0 9 MOLMOL-1 9 3
+ 015027 CONCENTRATION OF POLLUTANT KG/M3 9 0 10 KG/M3 9 4
+ 015030 AEROSOL CONTAMINATION INDEX NUMERIC 2 -1000 12 NUMERIC 2 4
+ 015031 ATMOSPHERIC PATH DELAY IN SATELLITE SIGNAL M 4 10000 15 M 4 5
+ 015032 ESTIMATED ERROR IN ATMOSPHERIC PATH DELAY M 4 0 10 M 4 4
+ 015033 DIFFERENCE IN PATH DELAYS FOR LIMB VIEWS AT EXTREMES OF SCAN M 5 -10000 15 M 5 5
+ 015034 ESTIMATED ERROR IN PATH DELAY DIFFERENCE M 5 0 14 M 5 5
+ 015035 COMPONENT OF ZENITH PATH DELAY DUE TO WATER VAPOUR M 4 0 14 M 4 5
+ 015036 ATMOSPHERIC REFRACTIVITY (SEE NOTE 5) N-UNITS 3 0 19 N-UNITS 3 6
+ 015037 BENDING ANGLE RADIANS 8 -100000 23 RADIANS 8 7
+ 015202 INTEGRATED ELECTRON DENSITY 1/M**2 3 13000 12
+ 015231 ATMOSPHERIC PATH DELAY IN SATELLITE SIGNAL M 4 0 15
+ 019001 TYPE OF SYNOPTIC FEATURE CODE TABLE 19001 0 0 6 CODE TABLE 19001 0 2
+ 019002 EFFECTIVE RADIUS OF FEATURE M -2 0 12 M -2 4
+ 019003 WIND SPEED THRESHOLD M/S 0 0 8 M/S 0 3
+ 019004 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD M -2 0 12 M -2 4
+ 019005 DIRECTION OF MOTION OF FEATURE DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 019006 SPEED OF MOTION OF FEATURE M/S 2 0 14 M/S 2 5
+ 019007 EFFECTIVE RADIUS OF FEATURE M -3 0 12 M -3 4
+ 019008 VERTICAL EXTENT OF CIRCULATION CODE TABLE 19008 0 0 3 CODE TABLE 19008 0 1
+ 019009 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD (LA M -3 0 12 M -3 4
+ 019010 METHOD FOR TRACKING THE CENTRE OF SYNOPTIC FEATURE CODE TABLE 19010 0 0 4 CODE TABLE 19010 0 2
+ 019100 TIME INTERVAL TO CALCULATE THE MOVEMENT OF THE TROPICAL CYCLONE CODE TABLE 19100 0 0 4 CODE TABLE 19100 0 2
+ 019101 ACCURACY OF THE POSITION OF THE CENTRE OF THE TROPICAL CYCLONE CODE TABLE 19101 0 0 4 CODE TABLE 19101 0 2
+ 019102 SHAPE AND DEFINITION OF THE EYE OF THE TROPICAL CYCLONE CODE TABLE 19102 0 0 3 CODE TABLE 19102 0 1
+ 019103 DIAMETER OF MAJOR AXIS OF THE EYE OF THE TROPICAL CYCLONE CODE TABLE 19103 0 0 4 CODE TABLE 19103 0 2
+ 019104 CHANGE IN CHARACTER OF THE EYE DURING THE 30 MINUTES CODE TABLE 19104 0 0 4 CODE TABLE 19104 0 2
+ 019105 DISTANCE BETWEEN THE END OF SPIRAL BAND AND THE CENTRE CODE TABLE 19105 0 0 4 CODE TABLE 19105 0 2
+ 019106 IDENTIFICATION NUMBER OF TROPICAL CYCLONE NUMERIC 0 0 7 NUMERIC 0 3
+ 019107 TIME INTERVAL OF THE TROPICAL CYCLONE ANALYSIS CODE TABLE 19107 0 0 4 CODE TABLE 19107 0 2
+ 019108 ACCURACY OF GEOGRAPHICAL POSITION OF THE TROPICAL CYCLONE CODE TABLE 19108 0 0 3 CODE TABLE 19108 0 1
+ 019109 MEAN DIAMETER OF THE OVERCAST CLOUD OF THE TROPICAL CYCLONE CODE TABLE 19109 0 0 4 CODE TABLE 19109 0 2
+ 019110 APPARENT 24-HOUR CHANGE IN INTENSITY OF TROPICAL CYCLONE CODE TABLE 19110 0 0 4 CODE TABLE 19110 0 2
+ 019111 CURRENT INTENSITY (CI) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019112 DATA TROPICAL (DT) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019113 CLOUD PATTERN TYPE OF THE DT- NUMBER CODE TABLE 19113 0 0 4 CODE TABLE 19113 0 2
+ 019114 MODEL EXPECTED TROPICAL (MET) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019115 TREND OF PAST 24-HOUR CHANGE (+: DEVELOPED, -: WEAKENED) NUMERIC 1 -30 6 NUMERIC 1 2
+ 019116 PATTERN TROPICAL (PT) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019117 CLOUD PICTURE TYPE OF THE PT- NUMBER CODE TABLE 19117 0 0 3 CODE TABLE 19117 0 1
+ 019118 FINAL TROPICAL (T) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019119 TYPE OF THE FINAL T-NUMBER CODE TABLE 19119 0 0 3 CODE TABLE 19119 0 1
+ 019150 TYPHOON INTERNATIONAL COMMON NUMBER (TYPHOON COMMITTEE) CCITTIA5 0 0 32 CHARACTER 0 4
+ 020001 HORIZONTAL VISIBILITY M -1 0 13 M -1 4
+ 020002 VERTICAL VISIBILITY M -1 0 7 M -1 3
+ 020003 PRESENT WEATHER (SEE NOTE 1) CODE TABLE 20003 0 0 9 CODE TABLE 20003 0 3
+ 020004 PAST WEATHER (1) (SEE NOTE 2) CODE TABLE 20004 0 0 5 CODE TABLE 20004 0 2
+ 020005 PAST WEATHER (2) (SEE NOTE 2) CODE TABLE 20005 0 0 5 CODE TABLE 20005 0 2
+ 020008 CLOUD DISTRIBUTION FOR AVIATION CODE TABLE 20008 0 0 5 CODE TABLE 20008 0 2
+ 020009 GENERAL WEATHER INDICATOR (TAF/METAR) CODE TABLE 20009 0 0 4 CODE TABLE 20009 0 2
+ 020010 CLOUD COVER (TOTAL) % 0 0 7 % 0 3
+ 020011 CLOUD AMOUNT CODE TABLE 20011 0 0 4 CODE TABLE 20011 0 2
+ 020012 CLOUD TYPE CODE TABLE 20012 0 0 6 CODE TABLE 20012 0 2
+ 020013 HEIGHT OF BASE OF CLOUD M -1 -40 11 M -1 4
+ 020014 HEIGHT OF TOP OF CLOUD M -1 -40 11 M -1 4
+ 020015 PRESSURE AT BASE OF CLOUD PA -1 0 14 PA -1 5
+ 020016 PRESSURE AT TOP OF CLOUD PA -1 0 14 PA -1 5
+ 020017 CLOUD TOP DESCRIPTION CODE TABLE 20017 0 0 4 CODE TABLE 20017 0 2
+ 020018 TENDENCY OF RUNWAY VISUAL RANGE CODE TABLE 20018 0 0 2 CODE TABLE 20018 0 1
+ 020019 SIGNIFICANT PRESENT OR FORECAST WEATHER CCITTIA5 0 0 72 CHARACTER 0 9
+ 020020 SIGNIFICANT RECENT WEATHER PHENOMENA CCITTIA5 0 0 32 CHARACTER 0 4
+ 020021 TYPE OF PRECIPITATION FLAG TABLE 20021 0 0 30 FLAG TABLE 20021 0 10
+ 020022 CHARACTER OF PRECIPITATION CODE TABLE 20022 0 0 4 CODE TABLE 20022 0 2
+ 020023 OTHER WEATHER PHENOMENA FLAG TABLE 20023 0 0 18 FLAG TABLE 20023 0 6
+ 020024 INTENSITY OF PHENOMENA CODE TABLE 20024 0 0 3 CODE TABLE 20024 0 1
+ 020025 OBSCURATION FLAG TABLE 20025 0 0 21 FLAG TABLE 20025 0 7
+ 020026 CHARACTER OF OBSCURATION CODE TABLE 20026 0 0 4 CODE TABLE 20026 0 2
+ 020027 PHENOMENA OCCURRENCE FLAG TABLE 20027 0 0 9 FLAG TABLE 20027 0 3
+ 020028 EXPECTED CHANGE IN INTENSITY CODE TABLE 20028 0 0 3 CODE TABLE 20028 0 1
+ 020029 RAIN FLAG CODE TABLE 20029 0 0 2 CODE TABLE 20029 0 1
+ 020031 ICE DEPOSIT (THICKNESS) M 2 0 7 M 2 3
+ 020032 RATE OF ICE ACCRETION CODE TABLE 20032 0 0 3 CODE TABLE 20032 0 1
+ 020033 CAUSE OF ICE ACCRETION FLAG TABLE 20033 0 0 4 FLAG TABLE 20033 0 2
+ 020034 SEA ICE CONCENTRATION CODE TABLE 20034 0 0 5 CODE TABLE 20034 0 2
+ 020035 AMOUNT AND TYPE OF ICE CODE TABLE 20035 0 0 4 CODE TABLE 20035 0 2
+ 020036 ICE SITUATION CODE TABLE 20036 0 0 5 CODE TABLE 20036 0 2
+ 020037 ICE DEVELOPMENT CODE TABLE 20037 0 0 5 CODE TABLE 20037 0 2
+ 020038 BEARING OF ICE EDGE (SEE NOTE 3) DEGREE TRUE 0 0 12 DEGREE TRUE 0 3
+ 020039 ICE DISTANCE M -1 0 13 M -1 4
+ 020040 EVOLUTION OF DRIFT OF SNOW CODE TABLE 20040 0 0 4 CODE TABLE 20040 0 2
+ 020041 AIRFRAME ICING CODE TABLE 20041 0 0 4 CODE TABLE 20041 0 2
+ 020042 AIRFRAME ICING PRESENT CODE TABLE 20042 0 0 2 CODE TABLE 20042 0 1
+ 020043 PEAK LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2
+ 020044 AVERAGE LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2
+ 020045 SUPERCOOLED LARGE DROPLET (SLD) CONDITIONS CODE TABLE 20045 0 0 2 CODE TABLE 20045 0 2
+ 020048 EVOLUTION OF FEATURE CODE TABLE 20048 0 0 4 CODE TABLE 20048 2 2
+ 020050 CLOUD INDEX CODE TABLE 20050 0 0 8 CODE TABLE 20050 0 3
+ 020051 AMOUNT OF LOW CLOUDS % 0 0 7 % 0 3
+ 020052 AMOUNT OF MIDDLE CLOUDS % 0 0 7 % 0 3
+ 020053 AMOUNT OF HIGH CLOUDS % 0 0 7 % 0 3
+ 020054 TRUE DIRECTION FROM WHICH CLOUDS ARE MOVING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 020055 STATE OF SKY IN TROPICS CODE TABLE 20055 0 0 4 CODE TABLE 20055 0 2
+ 020056 CLOUD PHASE CODE TABLE 20056 0 0 3 CODE TABLE 20056 0 1
+ 020059 MINIMUM HORIZONTAL VISIBILITY M -1 0 9 M -1 3
+ 020060 PREVAILING HORIZONTAL VISIBILITY M -1 0 10 M -1 4
+ 020061 RUNWAY VISUAL RANGE (RVR) M 0 0 12 M 0 4
+ 020062 STATE OF THE GROUND (WITH OR WITHOUT SNOW) CODE TABLE 20062 0 0 5 CODE TABLE 20062 0 2
+ 020063 SPECIAL PHENOMENA CODE TABLE 20063 0 0 10 CODE TABLE 20063 0 4
+ 020065 SNOW COVER (SEE NOTE 4) % 0 0 7 % 0 3
+ 020066 MAXIMUM DIAMETER OF HAILSTONES M 3 0 8 M 3 3
+ 020067 DIAMETER OF DEPOSIT M 3 0 9 M 3 3
+ 020070 MINIMUM NUMBER OF ATMOSPHERICS NUMERIC 0 0 7 NUMERIC 0 3
+ 020071 ACCURACY OF FIX AND RATE OF ATMOSPHERICS CODE TABLE 20071 0 0 4 CODE TABLE 20071 0 2
+ 020081 CLOUD AMOUNT IN SEGMENT % 0 0 7 % 0 3
+ 020082 AMOUNT SEGMENT CLOUD FREE % 0 0 7 % 0 3
+ 020083 AMOUNT OF SEGMENT COVERED BY SCENE % 0 0 7 % 0 3
+ 020085 GENERAL CONDITION OF RUNWAY CODE TABLE 20085 0 0 4 CODE TABLE 20085 0 1
+ 020086 RANWAY DEPOSITS CODE TABLE 20086 0 0 4 CODE TABLE 20086 0 1
+ 020087 RUNWAY CONTAMINATION CODE TABLE 20087 0 0 4 CODE TABLE 20087 0 1
+ 020088 DEPTH OF RANWAY DEPOSITS M 3 0 12 M 3 4
+ 020089 RUNWAY FRICTION COEFICIENT CODE TABLE 20089 0 0 7 CODE TABLE 20089 0 2
+ 020090 SPECIAL CLOUDS CODE TABLE 20090 0 0 4 CODE TABLE 20090 0 2
+ 020091 VERTICAL VISIBILITY FEET -2 0 10 FEET -2 3
+ 020092 HEIGHT OF BASE OF CLOUD FEET -2 0 10 FEET -2 3
+ 020095 ICE PROBABILITY NUMERIC 3 0 10 NUMERIC 3 4
+ 020096 ICE AGE ("A" PARAMETER) dB 2 -4096 13 dB 2 4
+ 020101 LOCUST (ACRIDIAN) NAME CODE TABLE 20101 0 0 4 CODE TABLE 20101 0 2
+ 020102 LOCUST (MATURITY) COLOR CODE TABLE 20102 0 0 4 CODE TABLE 20102 0 2
+ 020103 STAGE OF DEVELOPMENT OF LOCUSTS CODE TABLE 20103 0 0 4 CODE TABLE 20103 0 2
+ 020104 ORGANIZATION STATE OF SWARM OR BAND OF LOCUSTS CODE TABLE 20104 0 0 4 CODE TABLE 20104 0 2
+ 020105 SIZE OF SWARM OR BAND OF LOCUSTS AND DURATION OF PASSAGE OF SWARMCODE TABLE 20105 0 0 4 CODE TABLE 20105 0 2
+ 020106 LOCUST POPULATION DENSITY CODE TABLE 20106 0 0 4 CODE TABLE 20106 0 2
+ 020107 DIRECTION OF MOVEMENTS OF LOCUST SWARM CODE TABLE 20107 0 0 4 CODE TABLE 20107 0 2
+ 020108 EXTENT OF VEGETATION CODE TABLE 20108 0 0 4 CODE TABLE 20108 0 2
+ 020192 SPECIAL PHENOMENA CODE TABLE 020192 0 0 14
+ 020193 CLOUD AMOUNT IN SEGMENT % 0 0 7 % 0 3
+ 020194 AMOUNT OF SEGMENT CLOUD FREE % 0 0 7 % 0 3
+ 020215 PRESSURE AT THE BASE OF CLOUD PA -1 0 14 PA -1 5
+ 020249 SEA-ICE FRACTION NUMERIC 2 0 7 NUMERIC 2 3
+ 020250 CALCULATED SURFACE TYPE CODE TABLE 20250 0 0 5
+ 020251 ICE AGE CODE TABLE 20251 0 0 3
+ 020252 ICE EDGE CODE TABLE 20252 0 0 3
+ 020253 SURFACE TYPE CODE TABLE 20253 0 0 3
+ 020254 ICE CONCENTRATION % 0 0 7
+ 021001 HORIZONTAL REFLECTIVITY dB 0 -64 7 dB 0 3
+ 021002 VERTICAL REFLECTIVITY dB 0 -64 7 dB 0 3
+ 021003 DIFFERENTIAL REFLECTIVITY dB 1 -5 7 dB 1 3
+ 021005 LINEAR DEPOLARISATION RATIO dB 0 -65 6 dB 0 2
+ 021006 CIRCULAR DEPOLARISATION RATIO dB 0 -65 6 dB 0 2
+ 021011 DOPPLER MEAN VELOCITY IN X-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021012 DOPPLER MEAN VELOCITY IN Y-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021013 DOPPLER MEAN VELOCITY IN Z-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021014 DOPPLER MEAN VELOCITY (RADIAL) M/S 1 -4096 13 M/S 1 4
+ 021017 DOPPLER VELOCITY SPECTRAL WIDTH M/S 1 0 8 M/S 1 3
+ 021021 ECHO TOPS M -3 0 4 M -3 2
+ 021030 SIGNAL TO NOISE RATIO dB 0 -32 8 dB 0 3
+ 021031 VERTICALLY INTEGRATED LIQUID-WATER CONTENT KG/M**2 0 0 7 KG/M**2 0 3
+ 021036 RADAR RAINFALL INTENSITY M/S 7 0 12 M/S 7 4
+ 021041 BRIGHT-BAND HEIGHT M -2 0 8 M -2 3
+ 021051 SIGNAL POWER ABOVE 1 MW dB 0 -256 8 dB 0 3
+ 021062 BACKSCATTER dB 2 -5000 13 dB 2 4
+ 021063 RADIOMETRIC RESOLUTION (NOISE VALUE) % 1 0 10 % 1 4
+ 021064 CLUTTER NOISE ESTIMATE NUMERIC 0 0 8 NUMERIC 0 3
+ 021065 MISSING PACKET COUNTER NUMERIC 0 -127 8 NUMERIC 0 3
+ 021066 WAVE SCATTEROMETER PRODUCT CONFIDENCE DATA FLAG TABLE 21066 0 0 12 FLAG TABLE 21066 0 4
+ 021067 WIND PRODUCT CONFIDENCE DATA FLAG TABLE 21067 0 0 13 FLAG TABLE 21067 0 5
+ 021068 RADAR ALTIMETER PRODUCT CONFIDENCE DATA FLAG TABLE 21068 0 0 8 FLAG TABLE 21068 0 3
+ 021069 SST PRODUCT CONFIDENCE DATA FLAG TABLE 21069 0 0 10 FLAG TABLE 21069 0 4
+ 021070 SST PRODUCT CONFIDENCE DATA (SADIST-2) FLAG TABLE 21070 0 0 23 FLAG TABLE 21070 0 6
+ 021071 PEAKINESS NUMERIC 0 0 16 NUMERIC 0 5
+ 021072 SATELLITE ALTIMETER CALIBRATION STATUS FLAG TABLE 21072 0 0 4 FLAG TABLE 21072 0 2
+ 021073 SATELLLITE ALTIMETER INSTRUMENT MODE FLAG TABLE 21073 0 0 9 FLAG TABLE 21073 0 3
+ 021075 IMAGE SPECTRUM INTENSITY NUMERIC 0 0 8 NUMERIC 0 3
+ 021076 REPRESENTATION OF INTENSITIES CODE TABLE 21076 0 0 3 CODE TABLE 21076 0 1
+ 021077 ALTITUDE CORRECTION (IONOSPHERE) M 3 0 14 M 3 5
+ 021078 ALTITUDE CORRECTION (DRY TROPOSPHERE) M 3 0 9 M 3 3
+ 021079 ALTITUDE CORRECTION (WET TROPOSPHERE) M 3 2000 10 M 3 4
+ 021080 ALTITUDE CORRECTION (CALIBRATION CONSTANT) M 3 0 11 M 3 4
+ 021081 OPEN LOOP CORRECTION (HEIGHT-TIME LOOP) M 3 0 10 M 3 4
+ 021082 OPEN LOOP CORRECTION (AUTO GAIN CONTROL) dB 3 -3000 14 dB 3 5
+ 021083 WARM TARGET CALIBRATION NUMERIC 0 0 16 NUMERIC 0 5
+ 021084 COLD TARGET CALIBRATION NUMERIC 0 0 16 NUMERIC 0 5
+ 021085 ATSR SEA SURFACE TEMPERATURE ACROSS- TRACK BAND NUMBER NUMERIC 0 0 4 NUMERIC 0 2
+ 021086 NUMBER OF PIXELS IN NADIR ONLY, AVERAGE NUMERIC 0 0 9 NUMERIC 0 3
+ 021087 NUMBER OF PIXELS IN DUAL VIEW, AVERAGE NUMERIC 0 0 9 NUMERIC 0 3
+ 021088 WET BACKSCATTER dB 2 -5000 13 dB 2 4
+ 021091 RADAR SIGNAL DOPPLER SPECTRUM 0TH MOMENT dB 0 -100 8 dB 0 3
+ 021092 RASS SIGNAL DOPPLER SPECTRUM 0TH MOMENT, REFERRING TO RASS SIGNA dB 0 -100 8 dB 0 3
+ 021093 Ku BAND PEAKINESS NUMERIC 3 0 16 NUMERIC 0 5
+ 021094 S BAND PEAKINESS NUMERIC 3 0 16 NUMERIC 0 5
+ 021101 NUMBER OF VECTOR AMBIGUITIES NUMERIC 0 0 3 NUMERIC 0 1
+ 021102 INDEX OF SELECTED WIND VECTOR NUMERIC 0 0 3 NUMERIC 0 1
+ 021103 TOTAL NUMBER OF SIGMA-0 MEASUREMENTS NUMERIC 0 0 5 NUMERIC 0 2
+ 021104 LIKELIHOOD COMPUTED FOR SOLUTION NUMERIC 3 -30000 15 NUMERIC 3 5
+ 021105 NORMALIZED RADAR CROSS-SECTION dB 2 -10000 14 dB 2 5
+ 021106 KP VARIANCE COEFFICIENT (ALPHA) NUMERIC 3 0 14 NUMERIC 3 5
+ 021107 KP VARIANCE COEFFICIENT (BETA) NUMERIC 8 0 16 NUMERIC 8 5
+ 021109 SEAWINDS WIND VECTOR CELL QUALITY FLAG TABLE 21109 0 0 17 FLAG TABLE 21109 0 6
+ 021110 NUMBER OF INNER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021111 NUMBER OF OUTER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021112 NUMBER OF INNER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021113 NUMBER OF OUTER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021114 KP VARIANCE COEFFICENT (GAMMA) dB 3 -140000 18 dB 3 6
+ 021115 SEAWINDS SIGMA-0 QUALITY FLAG TABLE 21115 0 0 17 FLAG TABLE 21115 0 6
+ 021116 SEAWINDS SIGMA-0 MODE FLAG TABLE 21116 0 0 17 FLAG TABLE 21116 0 6
+ 021117 SIGMA-0 VARIANCE QUALITY CONTROL NUMERIC 2 0 16 NUMERIC 2 5
+ 021118 ATTENUATION CORRECTION ON SIGMA-0 dB 2 -10000 14 dB 2 5
+ 021119 WIND SCATTEROMETER GEOPHYSICAL MODEL FUNCTION CODE TABLE 21119 0 0 6 CODE TABLE 21119 0 2
+ 021120 PROBABILITY OF RAIN NUMERIC 3 0 10 NUMERIC 3 4
+ 021121 SEAWINDS NOF* RAIN INDEX NUMERIC 0 0 8 NUMERIC 0 3
+ 021122 ATTENUATION CORRECTION OF SIGMA-0 (FROM TB) dB 2 -10000 14 dB 2 5
+ 021123 SEAWINDS NORMALIZED RADAR CROSS SECTION dB 2 -30000 15 dB 2 5
+ 021128 NUMBER OF VALID POINTS PER SECOND USED TO DERIVE PREVIOUS PARAME NUMERIC 0 0 8 NUMERIC 0 3
+ 021130 SPECTRUM TOTAL ENERGY NUMERIC 6 0 28 NUMERIC 6 9
+ 021131 SPECTRUM MAX ENERGY NUMERIC 6 0 28 NUMERIC 6 9
+ 021132 DIRECTION OF SPECTRUM MAX ON HIGHER RESOLUTION GRID DEGREE 3 0 19 DEGREE 3 6
+ 021133 WAVE-LENGTH OF SPECTRUM MAX ON HIGHER RESOLUTION GRID M 3 0 29 M 3 9
+ 021134 RANGE RESOLUTION OF CRESS COVARIANCE SPECTRUM RAD/M 3 0 19 RAD/M 3 6
+ 021135 REAL PART OF CROSS SPECTRA POLAR GRID NUMBER OF BINS NUMERIC 3 -524288 20 NUMERIC 3 7
+ 021136 IMAGINARY PART OF CROSS SPECTRA POLAR GRID NUMBER OF BINS NUMERIC 3 -524288 20 NUMERIC 3 7
+ 021137 KU BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021138 STD KU BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021139 KU BAND NET INSTRUMENTAL CORRECTION FOR AGC dB 2 -2048 12 dB 2 4
+ 021140 S BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021141 STD S BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021142 S BAND NET INSTRUMENTAL CORRECTION FOR AGC dB 2 -1024 11 dB 2 4
+ 021143 KU BAND RAIN ATTENUATION dB 2 -1073741824 31 dB 2 10
+ 021144 ALTIMETER RAIN FLAG FLAG TABLE 21144 0 0 2 FLAG TABLE 21144 0 1
+ 021145 KU BAND AUTOMATIC GAIN CONTROL dB 2 0 13
+ 021146 RMS KU BAND AUTOMATIC GAIN CONTROL dB 2 0 8
+ 021147 NUMBER OF VALID POINTS FOR KU BAND AUTOMATIC GAIN CONTROL NUMERIC 0 0 5
+ 021150 BEAM COLLOCATION CODE TABLE 21150 0 0 2 CODE TABLE 21150 0 1
+ 021151 ESTIMATED ERROR IN SIGMA0 AT 40DEG INCIDENCE ANGLE dB 2 0 9 dB 2 3
+ 021152 SLOPE AT 40DEG INCIDENCE ANGLE dB/DEG 2 -80 7 dB/DEG 2 3
+ 021153 ESTIMATED ERROR IN SLOPE AT 40DEG INCIDENCE ANGLE dB/DEG 2 -40 6 dB/DEG 2 3
+ 021154 SOIL MOISTURE SENSITIVITY dB 2 0 12 dB 2 4
+ 021155 WIND VECTOR CELL QUALITY FLAG TABLE 21155 0 0 24 FLAG TABLE 21155 0 8
+ 021156 BACKSCATTER DISTANCE NUMERIC 1 -4096 13 NUMERIC 1 4
+ 021157 LOSS PER UNIT LENGTH OF ATMOSPHERE USED dB/M 10 0 22 dB/M 10 7
+ 021158 ASCAT kp ESTIMATE QUALITY CODE TABLE 21158 0 0 2 CODE TABLE 21158 0 1
+ 021159 ASCAT SIGMA-0 USABILITY CODE TABLE 21159 0 0 2 CODE TABLE 21159 0 1
+ 021160 ASCAT USE OF SYNTHETIC DATA NUMERIC 3 0 10 NUMERIC 3 4
+ 021161 ASCAT SYNTHETIC DATA QUALITY NUMERIC 3 0 10 NUMERIC 3 4
+ 021162 ASCAT SATELLITE ORBIT AND ATTITUDE QUALITY NUMERIC 3 0 10 NUMERIC 3 4
+ 021163 ASCAT SOLAR ARRAY REFLECTION CONTAMINATION NUMERIC 3 0 10 NUMERIC 3 4
+ 021164 ASCAT TELEMETRY PRESENCE AND QUALITY NUMERIC 3 0 10 NUMERIC 3 4
+ 021165 ASCAT EXTRAPOLATED REFERENCE FUNCTION PRESENCE NUMERIC 3 0 10 NUMERIC 3 4
+ 021166 ASCAT LAND FRACTION NUMERIC 3 0 10 NUMERIC 3 4
+ 021169 ICE PRESENCE INDICATOR CODE TABLE 0 0 2
+ 021170 C BAND CORRECTED OCEAN BACKSCATTER COEFICIENT dB 2 -32768 16
+ 021171 RMS C BAND CORRECTED OCEAN BACKSCATTER COEFICIENT dB 2 -32768 16
+ 021172 C BAND NET INSTRUMENTAL CORRECTION FOR AGC dB 2 -2048 12
+ 021173 C BAND AUTOMATIC GAIN CONTROL dB 2 0 13
+ 021174 RMS C BAND AUTOMATIC GAIN CONTROL dB 2 0 9
+ 021175 NUMBER OF VALID POINTS FOR C BAND AUTOMATIC GAIN CONTROL NUMERIC 0 0 10
+ 021192 RADAR BACK SCATTER dB 2 -5000 13
+ 021193 NOISE FIGURE % 0 0 7
+ 021194 BACKGROUND NOISE LEVEL NUMERIC 0 0 8
+ 021195 MISSING PACKET COUNTER NUMERIC 0 -127 8
+ 021196 UWA PRODUCT CONFIDENCE FLAG TABLE 21196 0 0 12
+ 021197 UWI PRODUCT CONFIDENCE FLAG TABLE 21197 0 0 12
+ 021198 URA PRODUCT CONFIDENCE FLAG TABLE 21198 0 0 8
+ 021199 UAT PRODUCT CONFIDENCE FLAG TABLE 21199 0 0 7
+ 021200 MWI PRODUCT CONFIDENCE FLAG TABLE 21200 0 0 15
+ 021201 PEAKINESS NUMERIC 0 0 16
+ 021202 ALTIMETER CALIBRATION STATUS FLAG TABLE 21202 0 0 4
+ 021203 ALTIMETER INSTRUMENT MODE FLAG TABLE 21203 0 0 9
+ 021204 MULTI/SINGLE VIEW DIFFERENCE K 2 -512 10
+ 021205 SPECTRAL INTENSITY NUMERIC 0 0 8
+ 021206 REPRESENTATION OF INTENSITY CODE TABLE 21206 0 0 3
+ 021207 ALTITUDE CORRECTION (IONOSPHERE) M 3 0 14
+ 021208 ALTITUDE CORRECTION (DRY TROPOSPHERE) M 3 0 9
+ 021209 LTITUDE CORRECTION (WET TROPOSPHERE) M 3 2000 10
+ 021210 ALTITUDE CORRECTION (CALIBRATION CONSTANT) M 3 0 11
+ 021211 OPEN LOOP CORRECTION (HTL) M 3 0 10
+ 021212 OPEN LOOP CORRECTION (AGC) dB 3 -3000 14
+ 021213 AMBIGUITY REMOVAL CONFIDENCE % 0 0 7
+ 021214 UAT QUALITY SUMMARY CODE TABLE 21214 0 0 3
+ 021215 UAT ACROSS-TRACK BAND NO. NUMERIC 0 0 4
+ 021222 DOPPLER SPECTRUM 0 TH MOMENT (AMPLITUDE) dB 0 0 7
+ 021225 PRESCAT PRODUCT CONFIDENCE FLAG TABLE 21225 0 0 6
+ 021226 BACKSCATER DISTANCE NUMERIC 1 -4096 13
+ 021227 GLARE ANGLE CODE TABLE 21227 0 6 6
+ 021230 NUMBER OF VECTOR AMBIGUITIES NUMERIC 0 0 3
+ 021231 INDEX OF SELECTED WIND VECTOR NUMERIC 0 0 3
+ 021232 TOTAL NMBER OF SIGMA-0 MEASUREMENTS NUMERIC 0 0 5
+ 021233 NUMBER OF SIGMA-0 USABLE FOR WIND NUMERIC 0 0 5
+ 021234 LIKELIHOOD COMPUTED FOR SOLUTION NUMERIC 1 -10000 14
+ 021235 WIND VECTOR CELL QUALITY FLAG FLAG TABLE 21235 0 0 3
+ 021236 NUMBER OF FORE-BEAM SIGMA-0 NUMERIC 1 0 6
+ 021237 NUMBER OF MID-BEAM V-POL SIGMA-0 NUMERIC 1 0 6
+ 021238 NUMBER OF MID-BEAM H-POL SIGMA-0 NUMERIC 1 0 6
+ 021239 NUMBER OF AFT-BEAM SIGMA-0 NUMERIC 1 0 6
+ 021240 NORMALIZED RADAR CROSS SECTION NUMERIC 2 -10000 14
+ 021241 Kp VARIANCE COEFFICIENT (ALPHA) NUMERIC 5 0 14
+ 021242 Kp VARIANCE COEFFICIENT (BETHA) NUMERIC 6 0 16
+ 021243 Kp VARIANCE COEFFICIENT (GAMMA) NUMERIC 6 0 16
+ 021244 SIGMA-0 QUALITY FLAG FLAG TABLE 21244 0 0 15
+ 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022002 DIRECTION OF WIND WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022003 DIRECTION OF SWELL WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022004 DIRECTION OF CURRENT DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022005 DIRECTION OF SEA SURFACE CURRENT DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022011 PERIOD OF WAVES S 0 0 6 S 0 2
+ 022012 PERIOD OF WIND WAVES S 0 0 6 S 0 2
+ 022013 PERIOD OF SWELL WAVES S 0 0 6 S 0 2
+ 022021 HEIGHT OF WAVES M 1 0 10 M 1 4
+ 022022 HEIGHT OF WIND WAVES M 1 0 10 M 1 4
+ 022023 HEIGHT OF SWELL WAVES M 1 0 10 M 1 4
+ 022025 STANDARD DEVIATION WAVE HEIGHT M 2 0 10 M 2 4
+ 022026 STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT M 2 0 10 M 2 4
+ 022031 SPEED OF CURRENT M/S 2 0 13 M/S 2 4
+ 022032 SPEED OF SEA SURFACE CURRENT M/S 2 0 13 M/S 2 4
+ 022035 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 2 0 14 M 2 4
+ 022036 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 2 0 14 M 2 4
+ 022037 TIDAL ELEVATION WITH RESPECT TO NATIONAL LAND DATUM M 3 -10000 15 M 3 5
+ 022038 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 3 -10000 15 M 3 5
+ 022039 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 3 -5000 12 M 3 4
+ 022040 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 3 -5000 14 M 3 5
+ 022041 SEA-SURFACE TEMPERATURE (15-DAY RUNNING MEAN) K 1 0 12 K 1 4
+ 022042 SEA/WATER TEMPERATURE K 1 0 12 K 1 4
+ 022043 SEA/WATER TEMPERATURE K 2 0 15 K 2 5
+ 022044 SOUND VELOCITY M/S 1 0 14 M/S 1 5
+ 022045 SEA/WATER TEMPERATURE K 3 0 19 K 3 6
+ 022049 SEA SURFACE TEMPERATURE K 2 0 15 K 2 5
+ 022050 STANDARD DEVIATION SEA-SURFACE TEMPERATURE K 2 0 8 K 2 3
+ 022055 FLOAT CYCLE NUMBER NUMERIC 0 0 10 NUMERIC 0 3
+ 022056 DIRECTION OF PROFILE CODE TABLE 22056 0 0 2 CODE TABLE 22056 0 1
+ 022059 SEA SURFACE SALINITY PART PER THOUSAND 2 0 14 PART PER THOUSAND 2 5
+ 022060 LAGRANGIAN DRIFTER DROGUE STATUS CODE TABLE 22060 0 0 3 CODE TABLE 22060 0 1
+ 022061 STATE OF THE SEA CODE TABLE 22061 0 0 4 CODE TABLE 22061 0 2
+ 022062 SALINITY PART PER THOUSAND 2 0 14 PART PER THOUSAND 2 5
+ 022063 TOTAL WATER DEPTH M 0 0 14 M 0 5
+ 022064 SALINITY PART PER THOUSAND 3 0 17 PART PER THOUSAND 3 6
+ 022065 WATER PRESSURE PA -3 0 17 PA -3 6
+ 022066 WATER CONDUCTIVITY S M-1 6 0 26 S M-1 6 8
+ 022067 INSTRUMENT TYPE FOR WATER TEMPERATURE PROFILE MEASUREMENT CODE TABLE 22067 0 0 10 CODE TABLE 22067 0 4
+ 022068 WATER TEMPERATURE PROFILE RECORDER TYPES CODE TABLE 22068 0 0 7 CODE TABLE 22068 0 3
+ 022069 SPECTRAL WAVE DENSITY M2HZ-1 3 0 22 M2HZ-1 3 7
+ 022070 SIGNIFICANT WAVE HEIGHT M 2 0 13 M 2 4
+ 022071 SPECTRAL PEAK WAVE PERIOD S 1 0 9 S 1 3
+ 022072 SPECTRAL PEAK WAVE LENGTH M 0 0 13 M 0 4
+ 022073 MAXIMUM WAVE HEIGHT M 2 0 13 M 2 4
+ 022074 AVERAGE WAVE PERIOD S 1 0 9 S 1 3
+ 022075 AVERAGE WAVE LENGTH M 0 0 13 M 0 4
+ 022076 DIRECTION FROM WHICH DOMINANT WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022077 DIRECTIONAL SPREAD OF DOMINANT WAVE DEGREE 0 0 9 DEGREE 0 3
+ 022078 DURATION OF WAVE RECORD S 0 0 12 S 0 4
+ 022079 LENGTH OF WAVE RECORD M 0 0 16 M 0 5
+ 022080 WAVEBAND CENTRAL FREQUENCY Hz 3 0 10 Hz 3 4
+ 022081 WAVEBAND CENTRAL WAVE NUMBER 1/M 5 0 13 1/M 5 4
+ 022082 MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE DENSITY M**2S 2 0 20 M**2S 2 7
+ 022083 MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE NUMBER M**3 2 0 20 M**3 2 7
+ 022084 BAND CONTAINING MAXIMUM NON- DIRECTIONAL SPECTRAL WAVE DENSITY NUMERIC 0 0 7 NUMERIC 0 3
+ 022085 SPECTRAL WAVE DENSITY RATIO NUMERIC 0 0 7 NUMERIC 0 3
+ 022086 MEAN DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022087 PRINCIPAL DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022088 FIRST NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7 NUMERIC 2 3
+ 022089 SECOND NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7 NUMERIC 2 3
+ 022090 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S 2 0 20 M**2S 2 7
+ 022091 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**3 2 0 20 M**3 2 7
+ 022092 DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S/RAD 2 0 20 M**2S/RAD 2 7
+ 022093 DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**4 2 0 20 M**4 2 7
+ 022094 TOTAL NUMBER OF WAVE BANDS NUMERIC 0 0 7 NUMERIC 0 3
+ 022095 DIRECTIONAL SPREAD OF INDIVIDUAL WAVES DEGREE 0 0 8 DEGREE 0 3
+ 022096 SPECTRAL BAND WIDTH 1/S 3 0 4 1/S 3 2
+ 022097 MEAN WAVELENGTH > 731 M OF IMAGE SPECTRUM AT LOW WAVE NUMBERS M 0 0 14 M 0 5
+ 022098 WAVELENGTH SPREAD (WAVELENGTH > 731 M) AT LOW WAVE NUMBERS M 0 0 14 M 0 5
+ 022099 MEAN DIRECTION AT LOW WAVE NUMBERS (WAVELENGTH > 731 M) DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022100 DIRECTION SPREAD AT LOW WAVE NUMBERS(WAVELENGTH > 731 M) DEGREE 0 0 9 DEGREE 0 3
+ 022101 TOTAL ENERGY (WAVELENGTH > 731M) AT LOW WAVE NUMBERS NUMERIC 0 0 31 NUMERIC 0 10
+ 022120 TIDE STATION AUTOMATED WATER LEVEL CHECK CODE TABLE 22120 0 0 5 CODE TABLE 22120 0 2
+ 022121 TIDE STATION MANUAL WATER LEVEL CHECK CODE TABLE 22121 0 0 5 CODE TABLE 22121 0 2
+ 022122 TIDE STATION AUTOMATED METEOROLOGICAL DATA CHECK CODE TABLE 22122 0 0 5 CODE TABLE 22122 0 2
+ 022123 TIDE STATION MANUAL METEOROLOGICAL DATA CHECK CODE TABLE 22123 0 0 5 CODE TABLE 22123 0 2
+ 022141 SEA-SURFACE TEMPERATURE (15-DAY RUNNING MEAN) K 2 0 15 K 2 5
+ 022150 NUMBER OF 18 HZ VALID POINTS FOR KU BAND NUMERIC 0 0 10 NUMERIC 0 4
+ 022151 KU BAND OCEAN RANGE M 3 0 31 M 3 10
+ 022152 STD OF 18 HZ KU BAND OCEAN RANGE M 3 0 16 M 3 5
+ 022153 NUMBER OF 18 HZ VALID POINTS FOR S BAND NUMERIC 0 0 10 NUMERIC 0 4
+ 022154 S BAND OCEAN RANGE M 3 0 31 M 3 10
+ 022155 STD OF 18 HZ S BAND OCEAN RANGE M 3 0 16 M 3 5
+ 022156 KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022157 STD 18HZ KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022158 S BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022159 STD 18HZ S BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022160 NORMALIZED INVERSE WAVE AGE NUMERIC 6 0 21 NUMERIC 6 7
+ 022161 WAVE SPECTRA M**4 4 0 27 M**4 4 9
+ 022162 RMS OF 20Hz KU BAND OCEAN RANGE M 3 0 16
+ 022163 NUMBER OF 20Hz VALID POINTS FOR KU BAND NUMERIC 0 0 10
+ 022164 RMS 20Hz KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16
+ 022165 NUMBER OF 20Hz VALID POINTS FOR KU BAND SIGNIFICANT WAVE HEIGHT NUMERIC 0 0 10
+ 022166 KU BAND NET INSTRUMENTAL CORRECTION FOR SIGNIFICANT WAVE HEIGHT M 3 -1000 11
+ 022167 NUMBER OF VALID POINTS FOR KU BAND BACKSCATTER NUMERIC 0 0 10
+ 022168 C BAND OCEAN RANGE M 3 0 31
+ 022169 RMS OF C BAND OCEAN RANGE M 3 0 16
+ 022170 NUMBER OF 20Hz VALID POINTS FOR C BAND NUMERIC 0 0 10
+ 022171 C BAND SIGNIFICANT WAVE HEIGHT M 3 0 16
+ 022172 RMS 20Hz C BAND SIGNIFICANT WAVE HEIGHT M 3 0 16
+ 022173 NUMBER OF 20Hz VALID POINTS FOR C BAND NUMERIC 0 0 10
+ 022174 C BAND NET INSTRUMENTAL CORRECTION FOR SIGNIFICANT WAVE HEIGHT M 3 -1000 11
+ 022175 NUMBER OF VALID POINTS FOR C BAND BACKSCATTER NUMERIC 0 0 10
+ 022186 DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9
+ 022187 DIRECTIONAL SPREAD OF WAVES DEGREE 0 0 9
+ 022191 SPECTRAL DENSITY M**2*S/RAD 2 0 20
+ 022192 SPECTRAL PERIOD S 2 0 13
+ 022193 MEAN WAVENUMBER 1/M 5 0 15
+ 022194 PEAK WAVENUMBER 1/M 5 0 15
+ 022195 MEAN WAVE PROPAGATION DIRECTION DEGREE 1 0 13
+ 022196 PEAK WAVE PROPAGATION DIRECTION DEGREE 1 0 13
+ 022197 DIRECTION SPREAD DEGREE 1 0 13
+ 022198 VARIANCE SPECTRAL DENSITY M**2*S/RAD 4 0 18
+ 022199 CORRELATION COEFF OF SIMULATED FG AND OBSERVED SAR SPECTRUM NUMERIC 4 -10000 15
+ 022200 CORRELATION COEFF OF SIMULATED BF AND OBSERVED SAR SPECTRUM NUMERIC 4 -10000 15
+ 022201 CORRELATION COEFF OF OCEAN WAVE FG AND EXTRACTED WAVE SPECTRUM NUMERIC 4 -10000 15
+ 022202 ERROR BETWEEN FIRST GUESS AND OBSERVED SAR NUMERIC 5 0 21
+ 022203 ERROR BETWEEN SIMULATED AND OBSERVED SAR NUMERIC 5 0 21
+ 022204 MEAN PERIOD OF WAVES SECOND 2 0 13
+ 022205 SPECTRAL DENSITY M**2*S/RAD 4 0 25
+ 022206 PEAK PERIOD OF WAVES SECOND 2 0 13
+ 022207 MEAN WAVE PERIOD S 1 0 10
+ 022208 PEAK PERIOD OF 1D SPECTRA S 1 0 10
+ 022209 COEFICIENT OF DRAG WITH WAVES NUMERIC 6 0 13
+ 022210 MEAN SQUARE SLOPE OF WAVES NUMERIC 4 -10000 14
+ 022211 COEFICIENT OF DRAG WITH WAVES NUMERIC 6 0 17
+ 022243 STANDARD DEVIATION SIGNIFICANT WAVE HEIGHT M 2 0 10
+ 023001 ACCIDENT EARLY NOTIFICATION ARTICLE APPLICABLE CODE TABLE 23001 0 0 3 CODE TABLE 23001 0 1
+ 023002 ACTIVITY OR FACILITY INVOLVED IN INCIDENT CODE TABLE 23002 0 0 5 CODE TABLE 23002 0 2
+ 023003 TYPE OF RELEASE CODE TABLE 23003 0 0 3 CODE TABLE 23003 0 1
+ 023004 COUNTERMEASURES TAKEN NEAR BORDER CODE TABLE 23004 0 0 3 CODE TABLE 23004 0 1
+ 023005 CAUSE OF INCIDENT CODE TABLE 23005 0 0 2 CODE TABLE 23005 0 1
+ 023006 INCIDENT SITUATION CODE TABLE 23006 0 0 3 CODE TABLE 23006 0 1
+ 023007 CHARACTERISTICS OF RELEASE CODE TABLE 23007 0 0 3 CODE TABLE 23007 0 1
+ 023008 STATE OF CURRENT RELEASE CODE TABLE 23008 0 0 2 CODE TABLE 23008 0 1
+ 023009 STATE OF EXPECTED RELEASE CODE TABLE 23009 0 0 2 CODE TABLE 23009 0 1
+ 023016 POSSIBILITY OF SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT CODE TABLE 23016 0 0 2 CODE TABLE 23016 0 1
+ 023017 FLOW DISCHARGE OF MAJOR RECIPIENT M**3/S 6 0 20 M**3/S 6 7
+ 023018 RELEASE BEHAVIOUR OVER TIME CODE TABLE 23018 0 0 3 CODE TABLE 23018 0 1
+ 023019 ACTUAL RELEASE HEIGHT M 0 -15000 17 M 0 6
+ 023021 EFFECTIVE RELEASE HEIGHT M 0 -15000 17 M 0 6
+ 023022 DISTANCE OF RELEASE POINT OR SITE OF INCIDENT M 0 0 24 M 0 8
+ 023023 MAIN TRANSPORT SPEED IN THE ATMOSPHERE M/S 1 0 12 M/S 1 4
+ 023024 MAIN TRANSPORT SPEED IN WATER M/S 2 0 13 M/S 2 4
+ 023025 MAIN TRANSPORT SPEED IN GROUND WATER M/S 2 0 13 M/S 2 4
+ 023027 MAIN TRANSPORT DIRECTION IN THE ATMOSPHERE DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023028 MAIN TRANSPORT DIRECTION IN WATER DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023029 MAIN TRANSPORT DIRECTION IN GROUND WATER DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023031 POSSIBILITY THAT PLUME WILL ENCOUNTER PRECIPITATION IN STATE IN CODE TABLE 23031 0 0 2 CODE TABLE 23031 0 1
+ 023032 PLUME WILL ENCOUNTER CHANGE IN WIND DIRECTION AND/OR SPEED FLAG CODE TABLE 23032 0 0 2 CODE TABLE 23032 0 1
+ 024001 ESTIMATE OF AMOUNT OF RADIOACTIVITY RELEASED UP TO SPECIFIED TIM Bq -11 0 28 Bq -11 9
+ 024002 ESTIMATED MAXIMUM POTENTIAL RELEASE Bq -11 0 28 Bq -11 9
+ 024003 COMPOSITION OF RELEASE CODE TABLE 24003 0 0 5 CODE TABLE 24003 0 2
+ 024004 ELEMENT NAME CCITTIA5 0 0 16 CHARACTER 0 2
+ 024005 ISOTOPE MASS NUMERIC 0 0 9 NUMERIC 0 3
+ 024011 DOSE mSv 2 0 32 mSv 2 10
+ 024012 TRAJECTORY DOSE (DEFINED LOCATION AND EXPECTED TIME OF ARRIVAL) mSv 2 0 32 mSv 2 10
+ 024013 GAMMA DOSE IN AIR ALONG THE MAIN TRANSPORT PATH (DEFINED LOCATIO mSv 2 0 32 mSv 2 10
+ 024021 AIR CONCENTRATION (OF NAMED ISOTOPE TYPE INCLUDING GROSS BETA) Bq/M**3 2 0 32 Bq/M**3 2 10
+ 024022 CONCENTRATION IN PRECIPITATION (OF NAMES ISOTOPE TYPE) Bq/L 2 0 32 BQ L-1 2 10
+ 024023 PULSE RATE OF BETA RADIATION 1/S 1 0 14 1/S 1 4
+ 024024 PULSE RATE OF GAMMA RADIATION 1/S 1 0 14 1/S 1 4
+ 025001 RANGE-GATE LENGTH M -1 0 6 M -1 2
+ 025002 NUMBER OF GATES AVERAGED NUMERIC 0 0 4 NUMERIC 0 2
+ 025003 NUMBER OF INTEGRATED PULSES NUMERIC 0 0 8 NUMERIC 0 3
+ 025004 ECHO PROCESSING CODE TABLE 25004 0 0 2 CODE TABLE 25004 0 1
+ 025005 ECHO INTEGRATION CODE TABLE 25005 0 0 2 CODE TABLE 25005 0 1
+ 025006 Z TO R CONVERSION CODE TABLE 25006 0 0 3 CODE TABLE 25006 0 1
+ 025007 Z TO R CONVERSION FACTOR NUMERIC 0 0 12 NUMERIC 0 4
+ 025008 Z TO R CONVERSION EXPONENT NUMERIC 2 0 9 NUMERIC 2 3
+ 025009 CALIBRATION METHOD FLAG TABLE 25009 0 0 4 FLAG TABLE 25009 0 2
+ 025010 CLUTTER TREATMENT CODE TABLE 25010 0 0 4 CODE TABLE 25010 0 2
+ 025011 GROUND OCCULTATION CORRECTION (SCREENING) CODE TABLE 25011 0 0 2 CODE TABLE 25011 0 1
+ 025012 RANGE ATTENUATION CORRECTION CODE TABLE 25012 0 0 2 CODE TABLE 25012 0 1
+ 025013 BRIGHT-BAND CORRECTION FLAG TABLE 25013 0 0 2 FLAG TABLE 25013 0 1
+ 025014 AZIMUTH CLUTTER CUT-OFF (SEE NOTE 1) NUMERIC 0 0 12 NUMERIC 0 4
+ 025015 RADOME ATTENUATION CORRECTION FLAG TABLE 25015 0 0 2 FLAG TABLE 25015 0 1
+ 025016 CLEAR-AIR ATTENUATION CORRECTION dB/M 5 0 6 dB/M 5 2
+ 025017 PRECIPITATION ATTENUATION CORRECTION FLAG TABLE 25017 0 0 2 FLAG TABLE 25017 0 1
+ 025018 A TO Z LAW FOR ATTENUATION FACTOR NUMERIC 7 0 6 NUMERIC 7 2
+ 025019 A TO Z LAW FOR ATTENUATION EXPONENT NUMERIC 2 0 7 NUMERIC 2 3
+ 025020 MEAN SPEED ESTIMATION CODE TABLE 25020 0 0 2 CODE TABLE 25020 0 1
+ 025021 WIND COMPUTATION ENHANCEMENT FLAG TABLE 25021 0 0 8 FLAG TABLE 25021 0 3
+ 025025 BATTERY VOLTAGE V 1 0 9 V 1 3
+ 025026 BATTERY VOLTAGE (LARGE RANGE) V 1 0 12 V 1 4
+ 025028 OPERATOR OR MANUFACTURER DEFINED PARAMETER NUMERIC 1 -16384 15 NUMERIC 1 5
+ 025029 CALIBRATION METHOD FLAG TABLE 25029 0 0 6 FLAG TABLE 25029 0 2
+ 025030 RUNNING MEAN SEA-SURFACE TEMPERATURE USAGE CODE TABLE 25030 0 0 2 CODE TABLE 25030 0 1
+ 025032 WIND PROFILER MODE INFORMATION CODE TABLE 25032 0 0 2 CODE TABLE 25032 0 1
+ 025033 WIND PROFILER SUBMODE INFORMATION* CODE TABLE 25033 0 0 2 CODE TABLE 25033 0 1
+ 025034 WIND PROFILER QUALITY CONTROL TEST RESULTS* FLAG TABLE 25034 0 0 4 FLAG TABLE 25034 0 2
+ 025036 ATMOSPHERICS LOCATION METHOD CODE TABLE 25036 0 0 4 CODE TABLE 25036 0 2
+ 025040 CO2 WIND PRODUCT DERIVATION CODE TABLE 25040 0 0 4 CODE TABLE 25040 0 2
+ 025041 MOVING PLATFORM DIRECTION REPORTING METHOD CODE TABLE 25041 0 0 2 CODE TABLE 25041 0 1
+ 025042 MOVING PLATFORM SPEED REPORTING METHOD CODE TABLE 25042 0 0 2 CODE TABLE 25042 0 1
+ 025043 WAVE SAMPLING INTERVAL (TIME) S 4 0 15 S 4 5
+ 025044 WAVE SAMPLING INTERVAL (SPACE) M 2 0 14 M 2 5
+ 025045 HIRS CHANNEL COMBINATION FLAG TABLE 25045 0 0 21 FLAG TABLE 25045 0 7
+ 025046 MSU CHANNEL COMBINATION FLAG TABLE 25046 0 0 5 FLAG TABLE 25046 0 2
+ 025047 SSU CHANNEL COMBINATION FLAG TABLE 25047 0 0 4 FLAG TABLE 25047 0 2
+ 025048 AMSU-A CHANNEL COMBINATION FLAG TABLE 25048 0 0 16 FLAG TABLE 25048 0 6
+ 025049 AMSU-B CHANNEL COMBINATION FLAG TABLE 25049 0 0 6 FLAG TABLE 25049 0 2
+ 025050 PRINCIPAL COMPONENT SCORE NUMERIC 4 -131072 18
+ 025051 AVHRR CHANNEL COMBINATION FLAG TABLE 25051 0 0 7 FLAG TABLE 25051 0 3
+ 025052 LOG-10 OF PRINCIPAL COMPONENTS NORMALIZED FIT TO DATA NUMERIC 4 0 15 NUMERIC 4 5
+ 025053 OBSERVATION QUALITY FLAG TABLE 25053 0 0 12 FLAG TABLE 25053 0 4
+ 025054 SSMIS SUBFRAME ID NEMBER NUMERIC 0 0 5 NUMERIC 0 2
+ 025055 MULTIPLEXER HOUSEKEEPING K 2 0 16 K 2 5
+ 025060 SOFTWARE IDENTIFICATION (SEE NOTE 2) NUMERIC 0 0 14 NUMERIC 0 5
+ 025061 SOFTWARE IDENTIFICATION AND VERSION NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 025062 DATABASE IDENTIFICATION NUMERIC 0 0 14 NUMERIC 0 5
+ 025065 ORIENTATION CORRECTION (AZIMUTH) DEGREE 2 -1000 11 DEGREE 2 4
+ 025066 ORIENTATION CORRECTION (ELEVATION) DEGREE 2 -1000 11 DEGREE 2 4
+ 025067 RADIOSONDE RELEASE POINT PRESSURE CORRECTION PA 0 -8000 14 PA 0 4
+ 025068 NUMBER OF ARCHIVE RECOMPUTES NUMERIC 0 0 7 NUMERIC 0 3
+ 025069 FLIGHT LEVEL PRESSURE CORRECTIONS FLAG TABLE 25069 0 0 8 FLAG TABLE 25069 0 3
+ 025070 MAJOR FRAME COUNT NUMERIC 0 0 4 NUMERIC 0 2
+ 025071 FRAME COUNT NUMERIC 0 0 5 NUMERIC 0 2
+ 025075 SATELLITE ANTENNA CORRECTIONS VERSION NUMBER NUMERIC 0 0 5 NUMERIC 0 2
+ 025076 LOG-10 OF (TEMPERATURE-RADIANCE CENTRAL WAVENUMBER) FOR ATOVS LOG (1/M) 8 0 30 LOG (1/M) 8 10
+ 025077 BANDWIDTH CORRECTION COEFFICIENT 1 FOR ATOVS NUMERIC 5 -100000 18 NUMERIC 5 7
+ 025078 BANDWIDTH CORRECTION COEFFICIENT 2 FOR ATOVS NUMERIC 5 0 17 NUMERIC 5 6
+ 025079 ALBEDO-RADIANCE SOLAR FILTERED IRRADIANCE FOR ATOVS W/M**2 4 0 24 W/M**2 4 8
+ 025080 ALBEDO-RADIANCE EQUIVALENT FILTER WIDTH FOR ATOVS M 10 0 14 M 10 5
+ 025081 INCIDENCE ANGLE DEGREE 3 0 17 DEGREE 3 6
+ 025082 AZIMUTH ANGLE DEGREE 3 0 19 DEGREE 3 6
+ 025083 FARADEY ROTATIONAL ANGLE DEGREE 3 0 19 DEGREE 3 6
+ 025084 GEOMETRIC ROTATIONAL ANGLE DEGREE 5 0 26 DEGREE 5 8
+ 025085 FRACTION OF CLEAR PIXELS IN HIRS FOV NUMERIC 0 0 7 NUMERIC 0 3
+ 025086 DEPTH CORRECTION INDICATOR CODE TABLE 25086 0 0 2 CODE TABLE 25086 0 1
+ 025090 ORBIT STATE FLAG CODE TABLE 25090 0 0 4 CODE TABLE 25090 0 2
+ 025091 STRUCTURE CONSTANT OF THE REFRACTION INDEX (CN2) dB 3 -18192 13 dB 3 5
+ 025092 ACOUSTIC PROPAGATION VELOCITY M/S 2 28000 14 M/S 2 5
+ 025093 RASS COMPUTATION CORRECTION FLAG TABLE 25093 0 0 8 FLAG TABLE 25093 0 3
+ 025095 ALTIMETER STATE FLAG FLAG TABLE 25095 0 0 2 FLAG TABLE 25095 0 1
+ 025096 RADIOMETER STATE FLAG FLAG TABLE 25096 0 0 5 FLAG TABLE 25096 0 2
+ 025097 THREE DIMENSIONAL ERROR ESTIMATE OF THE NAVIGATOR ORBIT CODE TABLE 25097 0 0 4 CODE TABLE 25097 0 2
+ 025098 ALTIMETER DATA QUALITY FLAG FLAG TABLE 25098 0 0 9 FLAG TABLE 25098 0 3
+ 025099 ALTIMETER CORRECTION QUALITY FLAG TABLE 25099 0 0 9 FLAG TABLE 25099 0 3
+ 025100 XBT/XCTD FALL RATE EQUATION COEFFICIENT A NUMERIC 5 0 20 NUMERIC 5 6
+ 025101 XBT/XCTD FALL RATE EQUATION COEFFICIENT B NUMERIC 5 -500000 21 NUMERIC 5 6
+ 025102 NUMBER OF MISSING LINES EXCLUDING DATA GAPS NUMERIC 0 0 8 NUMERIC 0 3
+ 025103 NUMBER OF DIRECTIONAL BINS NUMERIC 0 0 8 NUMERIC 0 3
+ 025104 NUMBER OF WAVE-LENGTH BINS NUMERIC 0 0 8 NUMERIC 0 3
+ 025105 FIRST DIRECTIONAL BIN DEGREES 3 0 19
+ 025106 DIRECTIONAL BIN STEP DEGREES 3 0 19
+ 025107 FIRST WAVE-LENGTH BIN M 3 0 29 M 3 9
+ 025108 LAST WAVE-LENGTH BIN M 3 0 29 M 3 9
+ 025110 IMAGE PROCESSING SUMMARY FLAG TABLE 25110 0 0 10
+ 025111 NUMBER OF INPUT DATA GAPS NUMERIC 0 0 8 NUMERIC 0 3
+ 025120 RA2-L2-PROCESSING FLAG CODE TABLE 25120 0 0 2 CODE TABLE 25120 0 1
+ 025121 RA2-L2-PROCESSING QUALITY % 0 0 7 % 0 3
+ 025122 HARDWARE CONFIGURATION FOR RF CODE TABLE 25122 0 0 2 CODE TABLE 25122 0 1
+ 025123 HARDWARE CONFIGURATION FOR HPA CODE TABLE 25123 0 0 2 CODE TABLE 25123 0 1
+ 025124 MWR L2 PROCESSING FLAG CODE TABLE 25124 0 0 2 CODE TABLE 25124 0 1
+ 025125 MWR L2-PROCESSING QUALITY % 0 0 7 % 0 3
+ 025126 MODEL DRY TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025127 INVERTED BAROMETER CORRECTION M 3 -32768 16 M 3 5
+ 025128 MODEL WET TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025129 MWR DERIVED WET TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025130 RA2 IONOSPHERIC CORRECTION ON KU BAND M 3 -32768 16 M 3 5
+ 025131 IONOSPHERIC CORRECTION FROM DORIS ON KU BAND M 3 -32768 16 M 3 5
+ 025132 IONOSPHERIC CORRECTION FROM MODEL ON KU BAND M 3 -32768 16 M 3 5
+ 025133 SEA STATE BIAS CORRECTION ON KU BAND M 3 -32768 16 M 3 5
+ 025134 RA2 IONOSPHERIC CORRECTION ON S BAND M 3 -32768 16 M 3 5
+ 025135 IONOSPHERIC CORRECTION FROM DORIS ON S BAND M 3 -32768 16 M 3 5
+ 025136 IONOSPHERIC CORRECTION FROM MODEL ON S BAND M 3 -32768 16 M 3 5
+ 025137 SEA STATE BIAS CORRECTION ON S BAND M 3 -32768 16 M 3 5
+ 025138 AVERAGE SIGNAL TO NOISE RATION NUMERIC 0 -2048 12 NUMERIC 0 4
+ 025140 START CHANNEL NUMERIC 0 0 14 NUMERIC 0 5
+ 025141 END CHANNEL NUMERIC 0 0 14 NUMERIC 0 5
+ 025142 CHANNEL SCALE FACTOR NUMERIC 0 0 6 NUMERIC 0 2
+ 025143 LINEAR COEFFICIENT NUMERIC 6 -5000000 24 NUMERIC 6 8
+ 025150 SATELLITE INTENSITY ANALYSIS METHOD OF TROPICAL CYCLONE CODE TABLE 25150 0 0 4 CODE TABLE 25150 2 2
+ 025160 KU BAND INSTRUMENTAL CORRECTION M 4 -120000 18
+ 025161 C BAND INSTRUMENTAL CORRECTION M 4 -120000 18
+ 025162 SEA STATE BIAS CORRECTION ON C BAND M 4 -6000 13
+ 025163 ALTIMETER IONOSPHERIC CORRECTION ON KU BAND M 3 -32768 16
+ 025164 RADIOMETER WET M 4 -5000 13
+ 025174 SMOS INFORMATION FLAG FLAG TABLE 25174 0 0 14 FLAG TABLE 25174 0 5
+ 025193 ATTENUATION CORRECTION ON SIGMA0 dB 3 0 14
+ 025194 MAJOR FRAME COUNT NUMERIC 0 0 4
+ 025197 ANTENNA CORRECTIONS VERSION NUMBER NUMERIC 0 0 5
+ 025198 LOG (TEMP-RAD CENTRAL WAVE NUMBER) 1/M 8 0 30
+ 025199 BANDWIDTH CORRECTION COEFFICIENT 1 NUMERIC 4 -10000 15
+ 025200 BANDWIDTH CORRECTION COEFFICIENT 2 NUMERIC 5 0 17
+ 025201 ALBEDO-RAD SOLAR FILTERED IRRADIANCE NUMERIC 4 0 24
+ 025202 ALBEDO-RAD EQUIVALENT FILTER WIDTH NUMERIC 10 0 14
+ 025203 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 25203 0 0 31
+ 025204 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 25204 0 0 31
+ 025205 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 25205 0 0 31
+ 025206 FOV QUALITY FLAGS FOR ATOVS FLAG TABLE 25206 0 0 31
+ 025207 COMPASS AZIMUTH ANGLE DEGREE 2 0 16
+ 026001 PRINCIPAL TIME OF DAILY READING IN UTC OF MAXIMUM TEMPERATURE HOUR 1 0 12 HOUR 1 3
+ 026002 PRINCIPAL TIME OF DAILY READING IN UTC OF MINIMUM TEMPERATURE HOUR 1 0 12 HOUR 1 3
+ 026003 TIME DIFFERENCE MINUTE 0 -1440 12 MINUTE 0 4
+ 026010 HOURS INCLUDED FLAG TABLE 26010 0 0 26 FLAG TABLE 26010 0 9
+ 026020 DURATION OF PRECIPITATION MINUTE 0 0 11 MINUTE 0 4
+ 026193 YEAR YEAR 0 0 12
+ 026194 MONTH MONTH 0 0 4
+ 026195 DAY DAY 0 0 6
+ 026196 HOUR HOUR 0 0 5
+ 026197 MINUTE MINUTE 0 0 6
+ 026198 SECOND SECOND 0 0 6
+ 026200 LOCATION WITHIN ASSIMILATION WINDOW IN TIME NUMERIC 6 0 20
+ 026201 HOURS INCLUDED FLAG TABLE 26201 0 0 26
+ 027001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 027002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 027003 ALTERNATE LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 027004 ALTERNATE LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 027010 FOOTPRINT AXIS 1 M -1 0 14 M -1 5
+ 027020 SATELLITE LOCATION COUNTER NUMERIC 0 0 16 NUMERIC 0 5
+ 027021 SATELLITE SUBLOCATION DIMENSION NUMERIC 0 0 16 NUMERIC 0 5
+ 027031 IN DIRECTION OF 0 DEGREES LONGITUDE, DISTANCE FROM THE EARTH'S C M 2 -1073741824 31 M 2 10
+ 027080 VIEWING AZIMUTH ANGLE DEGREE TRUE 2 0 16 DEGREE TRUE 0 5
+ 027193 SOLAR AZIMUTH DEGREE TRUE 2 0 16
+ 028001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 028002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 028003 ALTERNATE LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 028004 ALTERNATE LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 028010 FOOTPRINT AXIS 2 M -1 0 14 M -1 5
+ 028031 IN DIRECTION 90 DEGREES EAST, DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31 M 2 10
+ 029001 PROJECTION TYPE CODE TABLE 29001 0 0 3 CODE TABLE 29001 0 1
+ 029002 CO-ORDINATE GRID TYPE CODE TABLE 29002 0 0 3 CODE TABLE 29002 0 1
+ 030001 PIXEL VALUE (4 BITS) NUMERIC 0 0 4 NUMERIC 0 2
+ 030002 PIXEL VALUE (8 BITS) NUMERIC 0 0 8 NUMERIC 0 3
+ 030004 PIXEL VALUE (16 BITS) NUMERIC 0 0 16 NUMERIC 0 5
+ 030010 NUMBER OF GRID POINTS NUMERIC 0 0 13 NUMERIC 0 4
+ 030021 NUMBER OF PIXELS PER ROW NUMERIC 0 0 12 NUMERIC 0 4
+ 030022 NUMBER OF PIXELS PER COLUMN NUMERIC 0 0 12 NUMERIC 0 4
+ 030031 PICTURE TYPE CODE TABLE 30031 0 0 4 CODE TABLE 30031 0 2
+ 030032 COMBINATION WITH OTHER DATA FLAG TABLE 30032 0 0 16 FLAG TABLE 30032 0 6
+ 030193 POSITION NUMBER ALONG SCAN NUMERIC 0 0 8
+ 031000 SHORT DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 1 NUMERIC 0 1
+ 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8 NUMERIC 0 3
+ 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16 NUMERIC 0 5
+ 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8 NUMERIC 0 3
+ 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16 NUMERIC 0 5
+ 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 31021 0 0 6 CODE TABLE 31021 0 2
+ 031031 DATA PRESENT INDICATOR FLAG TABLE 31031 0 0 1 FLAG TABLE 31031 0 1
+ 031192 DATA PRESENT INDICATOR NUMERIC 0 0 1
+ 033002 QUALITY INFORMATION CODE TABLE 33002 0 0 2 CODE TABLE 33002 0 1
+ 033003 QUALITY INFORMATION CODE TABLE 33003 0 0 3 CODE TABLE 33003 0 1
+ 033005 QUALITY INFORMATION (AWS DATA) FLAG TABLE 33005 0 0 30 FLAG TABLE 33005 0 10
+ 033006 INTERNAL MEASUREMENT STATUS INFORMATION (AWS) CODE TABLE 33006 0 0 3 CODE TABLE 33006 0 1
+ 033007 PER CENT CONFIDENCE % 0 0 7 % 0 3
+ 033009 RELATIVE ERROR % 6 0 20 % 0 7
+ 033015 DATA QUALITY CHECK INDICATOR CODE TABLE 33015 0 0 6 CODE TABLE 33015 0 2
+ 033020 QUALITY CONTROL INDICATION OF FOLLOWING VALUE CODE TABLE 33020 0 0 3 CODE TABLE 33020 0 1
+ 033021 QUALITY OF FOLLOWING VALUE CODE TABLE 33021 0 0 2 CODE TABLE 33021 0 1
+ 033022 QUALITY OF BUOY SATELLITE TRANSMISSION CODE TABLE 33022 0 0 2 CODE TABLE 33022 0 1
+ 033023 QUALITY OF BUOY LOCATION CODE TABLE 33023 0 0 2 CODE TABLE 33023 0 1
+ 033024 STATION ELEVATION QUALITY MARK (FOR MOBILE STATIONS) CODE TABLE 33024 0 0 4 CODE TABLE 33024 0 2
+ 033025 ACARS INTERPOLATED VALUES CODE TABLE 33025 0 0 3 CODE TABLE 33025 0 1
+ 033026 MOISTURE QUALITY CODE TABLE 33026 0 0 6 CODE TABLE 33026 0 2
+ 033027 LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66 % CONFIDENCE) CODE TABLE 33027 0 0 3 CODE TABLE 33027 0 1
+ 033028 SNAPSHOT OVERALL QUALITY CODE TABLE 22028 0 0 3 CODE TABLE 22028 0 1
+ 033030 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 33030 0 0 24 FLAG TABLE 33030 0 8
+ 033031 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 33031 0 0 24 FLAG TABLE 33031 0 8
+ 033032 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 33032 0 0 24 FLAG TABLE 33032 0 8
+ 033033 FIELD OF VIEW QUALITY FLAGS FOR ATOVS FLAG TABLE 33033 0 0 24 FLAG TABLE 33033 0 8
+ 033035 MANUAL/AUTOMATIC QUALITY CONTROL CODE TABLE 33035 0 0 4 CODE TABLE 33035 0 2
+ 033036 NOMINAL CONFIDENCE THRESHOLD % 0 0 7 % 0 3
+ 033037 WIND CORRELATION ERROR FLAG TABLE 33037 0 0 20 FLAG TABLE 33037 0 7
+ 033038 QUALITY FLAGS FOR GROUND-BASED GNSS DATA FLAG TABLE 33038 0 0 10 FLAG TABLE 33038 0 4
+ 033039 QUALITY FLAGS FOR RADIO OCCULTATION DATA FLAG TABLE 33039 0 0 16 FLAG TABLE 33039 0 6
+ 033040 CONFIDENCE INTERVAL % 0 0 7 PERCENT 0 3
+ 033041 ATTRIBUTE OF FOLLOWING VALUE CODE TABLE 33041 0 0 2 CODE TABLE 33041 0 1
+ 033042 TYPE OF LIMIT REPRESENTED BY FOLLOWING VALUE CODE TABLE 33042 0 0 3 CODE TABLE 33042 0 1
+ 033043 AST CONFIDENCE FLAG TABLE 33043 0 0 8 FLAG TABLE 33043 0 3
+ 033044 ASAR QUALITY INFORMATION FLAG TABLE 33044 0 0 15 FLAG TABLE 33044 0 5
+ 033045 PROBABILITY OF FOLLOWING EVENT % 0 0 7 % 0 3
+ 033046 CONDITIONAL PROBABILITY OF FOLLOWING EVENT WITH RESPECT TO SPECI % 0 0 7 % 0 3
+ 033047 MEASUREMENT CONFIDENCE DATA FLAG TABLE 33047 0 0 31 FLAG TABLE 33047 0 11
+ 033048 CONFIDENCE MEASURE OF SAR INVERSION CODE TABLE 33048 0 0 2 CODE TABLE 33048 0 1
+ 033049 CONFIDENCE MEASURE OF WIND RETRIEVAL CODE TABLE 33049 0 0 2 CODE TABLE 33049 0 1
+ 033050 GLOBAL GTSPP QUALITY FLAG CODE TABLE 33050 0 0 4 CODE TABLE 33050 0 2
+ 033052 S BAND OCEAN RETRACKING QUALITY FLAG TABLE 33052 0 0 21 FLAG TABLE 33052 0 7
+ 033053 KU BAND OCEAN RETRACKING QUALITY FLAG TABLE 33053 0 0 21 FLAG TABLE 33053 0 7
+ 033060 GQISFLAGQUAL-INDIVIDUAL IASI-SYSTEM QUALITY FLAG CODE TABLE 33060 0 0 2 CODE TABLE 33060 0 1
+ 033061 GQISQUALINDEX - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE % 0 0 7 % 0 3
+ 033062 GQISQUALINDEXLOC - INDICATOR FOR GEOMETRIC QUALITY INDEX % 0 0 7 % 0 3
+ 033063 GQISQUALINDEXRAD - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE % 0 0 7 % 0 3
+ 033064 GQISQUALINDEXSPECT - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE % 0 0 7 % 0 3
+ 033065 GQISSYSTECSONDQUAL - OUTPUT OF SYSTEM TEC QUALITY FUNCTION NUMERIC 0 0 24 NUMERIC 0 24
+ 033066 SBUV TOTAL OZONE QUALITY CODE TABLE 33066 0 0 4 CODE TABLE 33066 0 2
+ 033067 SBUV PROFILE OZONE QUALITY CODE TABLE 33067 0 0 4 CODE TABLE 33067 0 2
+ 033070 TOTAL OZONE QUALITY CODE TABLE 33070 0 0 4 CODE TABLE 33070 0 2
+ 033071 PROFILE OZONE QUALITY CODE TABLE 33071 0 0 4 CODE TABLE 33071 0 2
+ 033191 ECMWF WAM QC INDICATOR CODE TABLE 033191 0 0 2
+ 033192 TEM1 CONFIDENCE % 0 0 7
+ 033193 DATA QUALITY 3 BIT CODE CODE TABLE 33193 0 0 3
+ 033194 DATA QUALITY 2 BIT CODE CODE TABLE 33194 0 0 2
+ 033195 ECMWF SAR QC INDICATOR CODE TABLE 33195 0 0 5
+ 033196 ECMWF WAM QC INDICATOR CODE TABLE 33196 0 0 2
+ 033197 ECMWF SAR INVERSION QC INDICATOR CODE TABLE 33197 0 0 3
+ 033198 MINIMUM COST NUMERIC 4 0 14
+ 033199 1D VAR TOTAL PRECIPITABLE WATER RETRIEVED ERROR(S) KG/M**2 2 0 11
+ 033200 ANALYSIS REPORT EVENTS FLAG TABLE 33200 0 0 31
+ 033201 ANALYSIS REPORT STATUS EVENT FLAG TABLE 33201 0 0 13
+ 033202 ANALYSIS DATUM EVENT FLAGS (1) FLAG TABLE 33202 0 0 31
+ 033203 ANALYSIS DATUM EVENT FLAGS (2) FLAG TABLE 33203 0 0 11
+ 033204 ANALYSIS DATUM STATUS FLAGS FLAG TABLE 33204 0 0 21
+ 033205 VARIATIONAL ANALYSIS BLACK LIST FLAG CODE TABLE 33205 0 0 4
+ 033206 VARIATIONAL ANALYSIS QUALITY CONTROL FLAG CODE TABLE 33206 0 0 4
+ 033207 VARIATIONAL ANALYSIS DEPARTURE FLAG CODE TABLE 33207 0 0 4
+ 033208 VARIATIONAL ANALYSIS FIRST QUESS CHECK FLAG CODE TABLE 33208 0 0 4
+ 033209 VARIATIONAL ANALYSIS FINAL FLAG CODE TABLE 33209 0 0 4
+ 033210 INCREMENTAL VARIATIONAL ANALYSIS UPDATE NUMBER NUMERIC 0 0 7
+ 033211 MINIMISATION SIMULATION NUMBER NUMERIC 0 0 10
+ 033212 1D VAR ITERATION NUMBER NUMERIC 0 0 10
+ 033213 1D VAR RADIANCE COST NUMERIC 1 -1000 11
+ 033214 1D VAR ERROR(S) FLAG TABLE 33214 0 0 11
+ 033215 DIRECTIONAL SKILL NUMERIC 1 -4096 13
+ 033216 1D VAR SURFACE TYPE QUALITY CONTROL CODE TABLE 33216 0 0 3
+ 033217 1D VAR FAILURE INDICATOR CODE TABLE 33217 0 0 2
+ 033218 1D VAR ESTIMATE OF SCATTERING NUMERIC 2 0 12
+ 033219 SSMI INDIPENDENT SCATTERING INDEX NUMERIC 2 -50000 16
+ 033220 VARIATIONAL ANALYSIS REPORT EVENTS (1) FLAG TABLE 33220 0 0 31
+ 033221 VARIATIONAL ANALYSIS SYNOP EVENTS (2) FLAG TABLE 33221 0 0 31
+ 033222 VARIATIONAL ANALYSIS AIREP EVENTS (2) FLAG TABLE 33222 0 0 31
+ 033223 VARIATIONAL ANALYSIS SATOB EVENTS (2) FLAG TABLE 33223 0 0 31
+ 033224 VARIATIONAL ANALYSIS DRIBU EVENTS (2) FLAG TABLE 33224 0 0 31
+ 033225 VARIATIONAL ANALYSIS TEMP EVENTS (2) FLAG TABLE 33225 0 0 31
+ 033226 VARIATIONAL ANALYSIS PILOT EVENTS (2) FLAG TABLE 33226 0 0 31
+ 033227 VARIATIONAL ANALYSIS SATEM/TOVS EVENTS (2) FLAG TABLE 33227 0 0 31
+ 033228 VARIATIONAL ANALYSIS PAOB EVENTS (2) FLAG TABLE 33228 0 0 31
+ 033229 VARIATIONAL ANALYSIS SCATTEROMETER EVENTS (2) FLAG TABLE 33229 0 0 31
+ 033230 VARIATIONAL ANALYSIS RAW RADIANCES EVENTS (2) FLAG TABLE 33230 0 0 31
+ 033231 PRESAT SUMMARY FLAGS FLAG TABLE 33231 0 0 6
+ 033232 REPORT BLACK LIST EVENTS FLAG TABLE 33232 0 0 31
+ 033233 VARIATIONAL ANALYSIS REPORT STATUS FLAG TABLE 33233 0 0 31
+ 033234 VARIATIONAL ANALYSIS DATUM STATUS FLAG TABLE 33234 0 0 31
+ 033236 VARIATIONAL ANALYSIS DATUM EVENTS (1) FLAG TABLE 33236 0 0 31
+ 033237 VARIATIONAL ANALYSIS SYNOP DATUM EVENTS (2) FLAG TABLE 33237 0 0 31
+ 033238 VARIATIONAL ANALYSIS AIREP DATUM EVENTS (2) FLAG TABLE 33238 0 0 31
+ 033239 VARIATIONAL ANALYSIS SATOB DATUM EVENTS (2) FLAG TABLE 33239 0 0 31
+ 033240 VARIATIONAL ANALYSIS DRIBU DATUM EVENTS (2) FLAG TABLE 33240 0 0 31
+ 033241 GROSS ERROR PROBABILITY NUMERIC 3 0 10
+ 033242 GROSS ERROR INDICATOR CODE TABLE 33242 0 0 2
+ 033243 VARIATIONAL ANALYSIS TEMP DATUM EVENTS (2) FLAG TABLE 33243 0 0 31
+ 033244 VARIATIONAL ANALYSIS PILOT DATUM EVENTS (2) FLAG TABLE 33244 0 0 31
+ 033245 VARIATIONAL ANALYSIS SATEM/TOVS DATUM EVENTS (2) FLAG TABLE 33245 0 0 31
+ 033246 VARIATIONAL ANALYSIS PAOB DATUM EVENTS (2) FLAG TABLE 33246 0 0 31
+ 033247 VARIATIONAL ANALYSIS SCATTEROMETER DATUM EVENTS (2) FLAG TABLE 33247 0 0 31
+ 033248 VARIATIONAL ANALYSIS RAW RADIANCES DATUM EVENTS (2) FLAG TABLE 33248 0 0 31
+ 033249 DATUM BLACK LIST EVENTS FLAG TABLE 33249 0 0 31
+ 033250 PROBABILITY OF GROSS ERROR NUMERIC 6 0 20
+ 033251 RANGE OF POSSIBLE VALUES NUMERIC 2 0 14
+ 033252 MANUAL-AUTOMATIC QUALITY CONTROL CODE TABLE 33252 0 0 4
+ 033253 NOMINAL CONFIDENCE THRESHOLD % 0 0 7
+ 033254 WIND CORRELATION METHOD FLAG TABLE 33254 0 0 20
+ 035000 FM AND REGIONAL CODE NUMBER CODE TABLE 35000 0 0 10 CODE TABLE 35000 0 3
+ 035001 TIME-FRAME FOR MONITORING CODE TABLE 35001 0 0 3 CODE TABLE 35001 0 1
+ 035011 NUMBER OF REPORTS ACTUALLY RECEIVED NUMERIC 0 0 14 NUMERIC 0 4
+ 035021 BULLETIN BEING MONITORED (TTAAII) CCITTIA5 0 0 48 CHARACTER 0 6
+ 035022 BULLETIN BEING MONITORED (YYGGGG) CCITTIA5 0 0 48 CHARACTER 0 6
+ 035023 BULLETIN BEING MONITORED (CCCC) CCITTIA5 0 0 32 CHARACTER 0 4
+ 035024 BULLETIN BEING MONITORED (BBB) CCITTIA5 0 0 24 CHARACTER 0 3
+ 035030 DISCREPANCIES IN THE AVAILABILITY OF EXPECTED DATA CODE TABLE 35030 0 0 4 CODE TABLE 35030 0 1
+ 035031 QUALIFIER ON MONITORING RESULTS CODE TABLE 35031 0 0 7 CODE TABLE 35031 0 2
+ 035032 CAUSE OF MISSING DATA CODE TABLE 35032 0 0 4 CODE TABLE 35032 0 1
+ 035033 OBSERVATION AND COLLECTION DEFICIENCIES CODE TABLE 35033 0 0 7 CODE TABLE 35033 0 2
+ 035034 STATISTICAL TRENDS FOR AVAILABILITY OF DATA (DURING THE SURVEY P CODE TABLE 35034 0 0 3 CODE TABLE 35034 0 1
+ 035035 REASON FOR TERMINATION CODE TABLE 35035 0 0 5 CODE TABLE 35035 0 2
+ 040001 SURFACE SOIL MOISTURE (MS) % 1 0 10 % 1 4
+ 040002 ESTIMATED ERROR IN SURFACE SOIL MOISTURE % 1 0 10 % 1 4
+ 040003 MEAN SURFACE SOIL MOISTURE NUMERIC 3 0 10 NUMERIC 3 4
+ 040004 RAIN FALL DETECTION NUMERIC 3 0 10 NUMERIC 3 4
+ 040005 SOIL MOISTURE CORRECTION FLAG FLAG TABLE 40005 0 0 8 FLAG FLAG TABLE 40005 0 3
+ 040006 SOIL MOISTURE PROCESSING FLAG FLAG TABLE 40006 0 0 16 FLAG FLAG TABLE 40006 0 5
+ 040007 SOIL MOISTURE QUALITY % 1 0 10 % 1 4
+ 040008 FROZEN LAND SURFACE FRACTION % 1 0 10 % 1 4
+ 040009 INUNDATION AND WETLAND FRACTION % 1 0 10 % 1 4
+ 040010 TOPOGRAPHIC COMPLEXITY % 1 0 10 % 1 4
+ 040011 INTERPOLATION FLAG FLAG TABLE 40011 0 0 8 FLAG TABLE 40011 0 3
+ 040012 RADIOMETER DATA QUALITY FLAG FLAG TABLE 40012 0 0 8 FLAG TABLE 40012 0 3
+ 040013 RADIOMETER BRIGHTNESS TEMPERATURE INTERPOLATION FLAG CODE TABLE 40013 0 0 3
+ 040014 HIGH FREQUENCY FLUCTUATIONS OF THE SEA SURFACE TOPOGRAPHY CORRECTM 4 -3000 13
+ 040018 GLACAVGLMAGLLS - AVERAGE OF IMAGER MEASUREMENTS W/(M**2 SR M**-1) 6 0 24
+ 040019 GLACVARLMAGLLS - VARIANCE OF IMAGER MEASUREMENTS W/(M**2 SR M**-1) 6 0 24
+ 040020 GQISFLAGQUALDETAILED - QUALITY FLAG FOR THE SYSTEM FLAG TABLE 40020 0 0 17
+ 040021 FRACTION OF WEIGHTED AVHRR PIXEL IN IASI FOV COVERED WITH SNOW/IC% 0 0 7
+ 040022 NUMBER OF MISSING, BAD OR FAILED AVHRR PIXELS NUMERIC 0 0 7
+ 040192 CLOUD FORMATION AND HEIGHT ASSIGNMENT FLAG TABLE 40192 0 0 16
+ 040193 INSTRUMENT DETECTING CLOUDS FLAG TABLE 40193 0 0 16
+ 040194 VALIDATION FLAG FOR IASI LEVEL 1 PRODUCT FLAG TABLE 40194 0 0 16
+ 040195 QUALITY AND COMPLETENESS OF RETRIEVAL CODE TABLE 40195 0 0 4
+ 040196 RETRIEVAL CHOICE INDICATOR FLAG TABLE 40196 0 0 8
+ 040197 SATELLITE MANOEUVRE INDICATOR CODE TABLE 40197 0 0 3
+ 040198 SELECTION OF BACKGROUND STATE CODE TABLE 40198 0 0 3
+ 040199 INTEGRATED N2O DENSITY KG/M**2 6 0 16
+ 040200 INTEGRATED CO DENSITY KG/M**2 7 0 16
+ 040201 INTEGRATED CH4 DENSITY KG/M**2 6 0 16
+ 040202 INTEGRATED CO2 DENSITY KG/M**2 3 0 16
+ 040203 COLD/WARM LOAD FLAG FLAG TABLE 40203 0 0 12
+ 040210 OCEANSAT2 SIGMA_0 FLAG FLAG TABLE 40210 0 0 25
+ 049193 SAR INVERSION QC FLAGS FLAG TABLE 49193 0 0 15
+ 049194 ALTIMETER WAVE HEIGHT QC FLAFS FLAG TABLE 49194 0 0 15
+ 055003 DATA EXTRACTION INDICATOR FLAG TABLE 55003 0 0 8
diff --git a/bufrtables/B0000000000098014001.TXT b/bufrtables/B0000000000098014001.TXT
new file mode 100755
index 0000000..3d90dd0
--- /dev/null
+++ b/bufrtables/B0000000000098014001.TXT
@@ -0,0 +1,1616 @@
+ 000001 TABLE A: ENTRY CCITTIA5 0 0 24 CHARACTER 0 3
+ 000002 TABLE A: DATA CATEGORY DESCRIPTION, LINE 1 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000003 TABLE A: DATA CATEGORY DESCRIPTION, LINE 2 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000004 BUFR/CREX MASTER TABLE CCITTIA5 0 0 16 CHARACTER 0 2
+ 000005 BUFR/CREX EDITION NUMBER CCITTIA5 0 0 24 CHARACTER 0 3
+ 000006 BUFR MASTER TABLE VERSION NUMBER CCITTIA5 0 0 16 CHARACTER 0 2
+ 000007 CREX MASTER TABLE VERSION NUMBER CCITTIA5 0 0 16 CHARACTER 0 2
+ 000008 BUFR LOCAL TABLE VERSION NUMBER CCITTIA5 0 0 16 CHARACTER 0 2
+ 000010 F DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 8 CHARACTER 0 1
+ 000011 X DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 16 CHARACTER 0 2
+ 000012 Y DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 24 CHARACTER 0 3
+ 000013 ELEMENT NAME, LINE 1 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000014 ELEMENT NAME, LINE 2 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000015 UNITS NAME CCITTIA5 0 0 192 CHARACTER 0 24
+ 000016 UNITS SCALE SIGN CCITTIA5 0 0 8 CHARACTER 0 1
+ 000017 UNITS SCALE CCITTIA5 0 0 24 CHARACTER 0 3
+ 000018 UNITS REFERENCE SIGN CCITTIA5 0 0 8 CHARACTER 0 1
+ 000019 UNITS REFERENCE VALUE CCITTIA5 0 0 80 CHARACTER 0 10
+ 000020 ELEMENT DATA WIDTH CCITTIA5 0 0 24 CHARACTER 0 3
+ 000030 DESCRIPTOR DEFINING SEQUENCE CCITTIA5 0 0 48 CHARACTER 0 6
+ 001001 WMO BLOCK NUMBER NUMERIC 0 0 7 NUMERIC 0 2
+ 001002 WMO STATION NUMBER NUMERIC 0 0 10 NUMERIC 0 3
+ 001003 WMO REGION NUMBER/GEOGRAPHICAL AREA CODE TABLE 1003 0 0 3 CODE TABLE 1003 0 1
+ 001004 WMO REGION SUB-AREA (SEE NOTE 9) NUMERIC 0 0 3 NUMERIC 0 1
+ 001005 BUOY/PLATFORM IDENTIFIER NUMERIC 0 0 17 NUMERIC 0 5
+ 001006 AIRCRAFT FLIGHT NUMBER CCITTIA5 0 0 64 CHARACTER 0 8
+ 001007 SATELLITE IDENTIFIER CODE TABLE 1007 0 0 10 CODE TABLE 1007 0 4
+ 001008 AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION CCITTIA5 0 0 64 CHARACTER 0 8
+ 001009 TYPE OF COMMERCIAL AIRCRAFT CCITTIA5 0 0 64 CHARACTER 0 8
+ 001010 STATIONARY BUOY PLATFORM IDENTIFIER; E.G. C-MAN BUOYS CCITTIA5 0 0 64 CHARACTER 0 8
+ 001011 SHIP OR MOBILE LAND STATION IDENTIFIER CCITTIA5 0 0 72 CHARACTER 0 9
+ 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM* M/S 0 0 10 M/S 0 3
+ 001014 PLATFORM DRIFT SPEED (HIGH PRECISION) M/S 2 0 10 M/S 2 4
+ 001015 STATION OR SITE NAME CCITTIA5 0 0 160 CHARACTER 0 20
+ 001018 SHORT STATION OR SITE NAME CCITTIA5 0 0 40 CHARACTER 0 5
+ 001019 LONG STATION OR SITE NAME CCITTIA5 0 0 256 CHARACTER 0 32
+ 001020 WMO REGION SUB-AREA NUMERIC 0 0 4 NUMERIC 0 2
+ 001021 SYNOPTIC FEATURE IDENTIFIER NUMERIC 0 0 14 NUMERIC 0 4
+ 001022 NAME OF FEATURE (SEE NOTE 11) CCITTIA5 0 0 224 CHARACTER 0 28
+ 001023 OBSERVATION SEQUENCE NUMBER NUMERIC 0 0 9 NUMERIC 0 3
+ 001024 WIND SPEED SOURCE CODE TABLE 1024 0 0 5
+ 001025 STORM IDENTIFIER CCITTIA5 0 0 24 CHARACTER 0 3
+ 001026 WMO STORM NAME CCITTIA5 0 0 64 CHARACTER 0 8
+ 001027 WMO LONG STORM NAME CCITTIA5 0 0 80 CHARACTER 0 10
+ 001028 AEROSOL OPTICAL DEPTH (AOD) SOURCE CODE TABLE 1028 0 0 5 CODE TABLE 1028 0 2
+ 001029 SSI SOURCE CODE TABLE 1029 0 0 5 CODE TABLE 1029 0 2
+ 001030 NUMERICAL MODEL IDENTIFIER CCITTIA5 0 0 128 CHARACTER 0 16
+ 001031 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE (SEE NOTE 10) CODE TABLE 1031 0 0 16 CODE TABLE 1031 0 5
+ 001032 GENERATING APPLICATION CODE TABLE 1032 0 0 8 CODE TABLE 1032 0 3
+ 001033 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE CODE TABLE 1033 0 0 8 CODE TABLE 1033 0 3
+ 001034 IDENTIFICATION OF ORIGINATING/GENERATING SUB-CENTRE CODE TABLE 1034 0 0 8 CODE TABLE 1034 0 3
+ 001035 ORIGINATING CENTRE COMMON CODE TABLE C-11 0 0 16 COMMON CODE TABLE C-11 0 5
+ 001036 AGENCY IN CHARGE OF OPERATING THE OBSERVING PLATFORM CODE TABLE 1036 0 0 20 CODE TABLE 1036 0 7
+ 001037 SIGMET SEQUENCE IDENTIFIER CCITTIA5 0 0 24 CHARACTER 0 3
+ 001038 SOURCE OF SEA ICE FRACTION CODE TABLE 1038 0 0 5 CODE TABLE 1035 0 2
+ 001039 GRAPHICAL AREA FORECAST (GFA) SEQUENCE IDENTIFIER CCITTIA5 0 0 40 CHARACTER 0 5
+ 001041 ABSOLUTE PLATFORM VELOCITY - FIRST COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001042 ABSOLUTE PLATFORM VELOCITY - SECOND COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001043 ABSOLUTE PLATFORM VELOCITY - THIRD COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001050 PLATFORM TRANSMITTER ID NUMBER NUMERIC 0 0 17 NUMERIC 0 6
+ 001051 PLATFORM TRANSMITTER ID NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 001060 AIRCRAFT REPORTING POINT (BEACON IDENTIFIER) CCITTIA5 0 0 64 CHARACTER 0 8
+ 001062 SHORT ICAO LOCATION INDICATOR CCITTIA5 0 0 32 CHARACTER 0 4
+ 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64 CHARACTER 0 8
+ 001064 RUNWAY DESIGNATOR CCITTIA5 0 0 32 CHARACTER 0 4
+ 001065 ICAO REGION IDENTIFIER CCITTIA5 0 0 256 CHARACTER 0 32
+ 001075 TIDE STATION IDENTIFICATION CCITTIA5 0 0 40 CHARACTER 0 5
+ 001080 SHIP LINE NUMBER ACCORDING TO SOOP CCITTIA5 0 0 32 CHARACTER 0 4
+ 001081 RADIOSONDE SERIAL NUMBER CCITTIA5 0 0 160 CHARACTER 0 20
+ 001082 RADIOSONDE ASCENSION NUMBER (SEE NOTE 12) NUMERIC 0 0 14 NUMERIC 0 4
+ 001083 RADIOSONDE RELEASE NUMBER (SEE NOTE 12) NUMERIC 0 0 3 NUMERIC 0 1
+ 001085 OBSERVING PLATFORM MANUFACTURER'S MODEL CCITTIA5 0 0 160 CHARACTER 0 20
+ 001086 OBSERVING PLATFORM MANUFACTURER'S SERIAL NUMBER CCITTIA5 0 0 256 CHARACTER 0 32
+ 001087 WMO MARINE OBSERVING PLATFORM EXTENDED IDENTIFIER NUMERIC 0 0 23 NUMERIC 0 7
+ 001090 TECHNIQUE FOR MAKING UP INITIAL PERTURBATIONS CODE TABLE 1090 0 0 8 CODE TABLE 1090 0 3
+ 001091 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 10 NUMERIC 0 4
+ 001092 TYPE OF ENSEMBLE FORECAST CODE TABLE 1092 0 0 8 CODE TABLE 1092 0 3
+ 001093 BALLOON LOT NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 001094 WBAN NUMBER NUMERIC 0 0 17 NUMERIC 0 5
+ 001095 OBSERVER IDENTIFICATION CCITTIA5 0 0 32 CHARACTER 0 4
+ 001096 STATION ACQUISITION CCITTIA5 0 0 160 CHARACTER 0 20
+ 001101 STATE IDENTIFIER CODE TABLE 1101 0 0 10 CODE TABLE 1101 0 3
+ 001102 NATIONAL STATION NUMBER NUMERIC 0 0 30 NUMERIC 0 9
+ 001124 GRID POINT IDENTIFIER NUMERIC 0 0 24 NUMERIC 0 8
+ 001144 SNAPSHOT IDENTIFIER NUMERIC 0 0 31 NUMERIC 0 10
+ 001192 MODEL VERSION NUMBER CODE TABLE 001192 0 0 8
+ 001193 SIGMA_0 SIMULATION METHOD CODE TABLE 1193 0 0 4
+ 001194 CARRIER BALLOON/AIRCRAFT IDENTIFIER CCITTIA5 0 0 72
+ 001195 MOBIL LAND STATION IDENTIFIER CCITTIA5 0 0 72
+ 001196 CONSTANT LEVEL BALLOON IDENTIFIER CCITTIA5 0 0 72
+ 001197 RTP - PLATFORM TYPE CODE TABLE 1197 0 0 10
+ 001198 ITP - DECK ID CODE TABLE 1198 0 0 10
+ 001199 DUP - DUPLICATE STATUS CODE TABLE 1199 0 0 4
+ 001201 GENERATING APPLICATION CODE TABLE 1201 0 0 8
+ 001205 SATELLITE IDENTIFIER CODE TABLE 1205 0 0 10
+ 001208 VELOCITY OF PLATFORM, X M/S 5 -1073741824 31
+ 001209 VELOCITY OF PLATFORM, Y M/S 5 -1073741824 31
+ 001210 VELOCITY OF PLATFORM, Z M/S 5 -1073741824 31
+ 001211 ORIGIN OF SEA SURFACE ANALYSIS CCITTIA5 0 0 160 CHARACTER 0 20
+ 001220 RADAR COMPOSITE NAME CCITTIA5 0 0 160 CHARACTER 0 20
+ 002001 TYPE OF STATION CODE TABLE 2001 0 0 2 CODE TABLE 2001 0 1
+ 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 2002 0 0 4 FLAG TABLE 2002 0 2
+ 002003 TYPE OF MEASURING EQUIPMENT USED CODE TABLE 2003 0 0 4 CODE TABLE 2003 0 2
+ 002004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUREMENT OR TYPE OF C CODE TABLE 2004 0 0 4 CODE TABLE 2004 0 2
+ 002005 PRECISION OF TEMPERATURE OBSERVATION K 2 0 7 K 2 3
+ 002011 RADIOSONDE TYPE CODE TABLE 2011 0 0 8 CODE TABLE 2011 0 3
+ 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 2012 0 0 4 CODE TABLE 2012 0 2
+ 002013 SOLAR AND INFRARED RADIATION CORRECTION CODE TABLE 2013 0 0 4 CODE TABLE 2013 0 2
+ 002014 TRACKING TECHNIQUE/STATUS OF SYSTEM USED CODE TABLE 2014 0 0 7 CODE TABLE 2014 0 3
+ 002015 RADIOSONDE COMPLETENESS CODE TABLE 2015 0 0 4 CODE TABLE 2015 0 2
+ 002016 RADIOSONDE CONFIGURATION FLAG TABLE 2016 0 0 5 FLAG TABLE 2016 0 2
+ 002019 SATELLITE INSTRUMENTS CODE TABLE 2019 0 0 11 CODE TABLE 2019 0 4
+ 002020 SATELLITE CLASSIFICATION CODE TABLE 2020 0 0 9 CODE TABLE 2020 0 3
+ 002021 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 2021 0 0 9 FLAG TABLE 2021 0 3
+ 002022 SATELLITE DATA-PROCESSING TECHNIQUE USED FLAG TABLE 2022 0 0 8 FLAG TABLE 2022 0 3
+ 002023 SATELLITE DERIVED WIND COMPUTATION METHOD CODE TABLE 2023 0 0 4 CODE TABLE 2023 0 2
+ 002024 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2024 0 0 4 CODE TABLE 2024 0 2
+ 002025 SATELLITE CHANNEL(S) USED IN COMPUTATION FLAG TABLE 2025 0 0 25 FLAG TABLE 2025 0 9
+ 002026 CROSS TRACK RESOLUTION M 2 0 12 M 2 4
+ 002027 ALONG TRACK RESOLUTION M 2 0 12 M 2 4
+ 002028 SEGMENT SIZE AT NADIR IN X DIRECTION M 0 0 18 M 0 6
+ 002029 SEGMENT SIZE AT NADIR IN Y DIRECTION M 0 0 18 M 0 6
+ 002030 METHOD OF CURRENT MEASUREMENT CODE TABLE 2030 0 0 3 CODE TABLE 2030 0 1
+ 002031 DURATION AND TIME OF CURRENT MEASUREMENT CODE TABLE 2031 0 0 5 CODE TABLE 2031 0 2
+ 002032 INDICATOR FOR DIGITIZATION CODE TABLE 2032 0 0 2 CODE TABLE 2032 0 1
+ 002033 METHOD OF SALINITY/DEPTH MEASUREMENT CODE TABLE 2033 0 0 3 CODE TABLE 2033 0 1
+ 002034 DROGUE TYPE CODE TABLE 2034 0 0 5 CODE TABLE 2034 0 2
+ 002035 CABLE LENGTH M 0 0 9 M 0 3
+ 002036 BUOY TYPE CODE TABLE 2036 0 0 2 CODE TABLE 2036 0 1
+ 002037 METHOD OF TIDAL OBSERVATION CODE TABLE 2037 0 0 3 CODE TABLE 2037 0 1
+ 002038 METHOD OF WATER TEMPERATURE AND/OR SALINITY MEASUREMENT CODE TABLE 2038 0 0 4 CODE TABLE 2038 0 2
+ 002039 METHOD OF WET-BULB TEMPERATURE MEASUREMENT CODE TABLE 2039 0 0 3 CODE TABLE 2039 0 1
+ 002040 METHOD OF REMOVING VELOCITY AND MOTION OF PLATFORM FROM CURRENT CODE TABLE 2040 0 0 4 CODE TABLE 2040 0 2
+ 002041 METHOD FOR ESTIMATING REPORTS RELATED TO SYNOPTIC FEATURES CODE TABLE 2041 0 0 6 CODE TABLE 2041 0 2
+ 002042 INDICATOR FOR SEA SURFACE CURRENT SPEED CODE TABLE 2042 0 0 2 CODE TABLE 2042 0 1
+ 002044 INDICATOR FOR METHOD OF CALCULATING SPECTRAL WAVE DATA CODE TABLE 2044 0 0 4 CODE TABLE 2044 0 2
+ 002045 INDICATOR FOR TYPE OF PLATFORM CODE TABLE 2045 0 0 4 CODE TABLE 2045 0 2
+ 002046 WAVE MEASUREMENT INSTRUMENTATION CODE TABLE 2046 0 0 4 CODE TABLE 2046 0 2
+ 002048 SATELLITE SENSOR INDICATOR CODE TABLE 2048 0 0 4 CODE TABLE 2048 0 2
+ 002049 GEOSTATIONARY SATELLITE DATA-PROCESSING TECHNIQUE USED FLAG TABLE 2049 0 0 8 FLAG TABLE 2049 0 3
+ 002050 GEOSTATIONARY SOUNDER SATELLITE CHANNELS USED FLAG TABLE 2050 0 0 20 FLAG TABLE 2050 0 7
+ 002051 INDICATOR TO SPECIFY OBSERVING METHOD FOR EXTREME TEMPERATURES CODE TABLE 2051 0 0 4 CODE TABLE 2051 0 2
+ 002052 GEOSTATIONARY IMAGER SATELLITE CHANNELS USED FLAG TABLE 2052 0 0 6 FLAG TABLE 2052 0 2
+ 002053 GOES-I/M BRIGHTNESS TEMPERATURE CHARACTERISTICS CODE TABLE 2053 0 0 4 CODE TABLE 2053 0 2
+ 002054 GOES-I/M SOUNDINGS PARAMETER CHARACTERISTICS CODE TABLE 2054 0 0 4 CODE TABLE 2054 0 2
+ 002055 GEOSTATIONARY SOUNDINGS STATISTICAL PARAMETERS CODE TABLE 2055 0 0 4 CODE TABLE 2055 0 2
+ 002056 GEOSTATIONARY SOUNDINGS ACCURACY STATISTICS CODE TABLE 2056 0 0 4 CODE TABLE 2056 0 2
+ 002057 ORIGIN OF FIRST GUESS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2057 0 0 4 CODE TABLE 2057 0 2
+ 002058 VALID TIMES OF FIRST GUESS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2058 0 0 4 CODE TABLE 2058 0 2
+ 002059 ORIGIN OF ANALYSIS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2059 0 0 4 CODE TABLE 2059 0 2
+ 002060 ORIGIN OF SURFACE INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2060 0 0 4 CODE TABLE 2060 0 2
+ 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 2061 0 0 3 CODE TABLE 2061 0 1
+ 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 2062 0 0 4 CODE TABLE 2062 0 2
+ 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16 DEGREE 2 5
+ 002064 AIRCRAFT ROLL ANGLE QUALITY CODE TABLE 2064 0 0 2 CODE TABLE 2064 0 1
+ 002065 ACARS GROUND RECEIVING STATION CCITTIA5 0 0 40 CHARACTER 0 5
+ 002066 RADIOSONDE GROUND RECEIVING SYSTEM CODE TABLE 2066 0 0 6 CODE TABLE 2066 0 2
+ 002067 RADIOSONDE OPERATING FREQUENCY Hz -5 0 15 Hz -5 5
+ 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 2070 0 0 4 CODE TABLE 2070 0 2
+ 002071 SPECTROGRAPHIC WAVELENGTH M 13 0 30 M 13 10
+ 002080 BALLOON MANUFACTURER CODE TABLE 2080 0 0 6 CODE TABLE 2080 0 2
+ 002081 TYPE OF BALLOON CODE TABLE 2081 0 0 5 CODE TABLE 2081 0 2
+ 002082 WEIGHT OF BALLOON KG 3 0 12 KG 3 4
+ 002083 TYPE OF BALLOON SHELTER CODE TABLE 2083 0 0 4 CODE TABLE 2083 0 2
+ 002084 TYPE OF GAS USED IN BALLOON CODE TABLE 2084 0 0 4 CODE TABLE 2084 0 2
+ 002085 AMOUNT OF GAS USED IN BALLOON KG 3 0 13 KG 3 4
+ 002086 BALLOON FLIGHT TRAIN LENGTH M 1 0 10 M 1 4
+ 002091 ENTRY SENSOR 4/20 MA A 4 0 10 A 4 3
+ 002095 TYPE OF PRESSURE SENSOR CODE TABLE 2095 0 0 5 CODE TABLE 2095 0 2
+ 002096 TYPE OF TEMPERATURE SENSOR CODE TABLE 2096 0 0 5 CODE TABLE 2096 0 2
+ 002097 TYPE OF HUMIDITY SENSOR CODE TABLE 2097 0 0 5 CODE TABLE 2097 0 2
+ 002099 POLARISATION CODE TABLE 2099 0 0 3 CODE TABLE 2099 0 1
+ 002100 RADAR CONSTANT dB 1 0 12 dB 1 4
+ 002101 TYPE OF ANTENNA CODE TABLE 2101 0 0 4 CODE TABLE 2101 0 2
+ 002102 ANTENNA HEIGHT ABOVE TOWER BASE M 0 0 8 M 0 3
+ 002103 RADOME FLAG TABLE 2103 0 0 2 FLAG TABLE 2103 0 1
+ 002104 ANTENNA POLARISATION CODE TABLE 2104 0 0 4 CODE TABLE 2104 0 2
+ 002105 MAXIMUM ANTENNA GAIN dB 0 0 6 dB 0 2
+ 002106 3-DB BEAMWIDTH DEGREE 1 0 6 DEGREE 1 2
+ 002107 SIDELOBE SUPPRESSION dB 0 0 6 dB 0 2
+ 002108 CROSSPOL DISCRIMINATION (ON AXIS) dB 0 0 6 dB 0 2
+ 002109 ANTENNA SPEED (AZIMUTH) DEGREE/S 2 0 12 DEGREE/S 2 4
+ 002110 ANTENNA SPEED (ELEVATION) DEGREE/S 2 0 12 DEGREE/S 2 4
+ 002111 RADAR INCIDENCE ANGLE DEGREE 1 0 10 DEGREE 1 4
+ 002112 RADAR LOOK ANGLE DEGREE 1 0 12 DEGREE 1 4
+ 002113 NUMBER OF AZIMUTH LOOKS NUMERIC 0 0 4 NUMERIC 0 2
+ 002114 ANTENNA EFFECTIVE SURFACE AREA M**2 0 0 15 M**2 0 5
+ 002115 TYPE OF SURFACE OBSERVING EQUIPMENT CODE TABLE 2115 0 0 5 CODE TABLE 2115 0 2
+ 002116 PERCENTAGE OF 320 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002117 PERCENTAGE OF 80 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002118 PERCENTAGE OF 20 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002119 RA-2 INSTRUMENT OPERATIONS CODE TABLE 2119 0 0 3 CODE TABLE 2119 0 1
+ 002120 OCEAN WAVE FREQUENCY Hz 3 0 10 Hz 3 4
+ 002121 MEAN FREQUENCY Hz -8 0 7 Hz -8 3
+ 002122 FREQUENCY AGILITY RANGE Hz -6 -128 8 Hz -6 3
+ 002123 PEAK POWER W -4 0 7 W -4 3
+ 002124 AVERAGE POWER W -1 0 7 W -1 3
+ 002125 PULSE REPETITION FREQUENCY Hz -1 0 8 Hz -1 3
+ 002126 PULSE WIDTH S 7 0 6 S 7 2
+ 002127 RECEIVER INTERMEDIATE FREQUENCY Hz -6 0 7 Hz -6 3
+ 002128 INTERMEDIATE FREQUENCY BANDWIDTH Hz -5 0 6 Hz -5 2
+ 002129 MINIMUM DETECTABLE SIGNAL dB 0 -150 5 dB 0 3
+ 002130 DYNAMIC RANGE dB 0 0 7 dB 0 3
+ 002131 SENSITIVITY TIME CONTROL (STC) FLAG TABLE 2131 0 0 2 FLAG TABLE 2131 0 1
+ 002132 AZIMUTH POINTING ACCURACY DEGREE 2 0 6 DEGREE 2 2
+ 002133 ELEVATION POINTING ACCURACY DEGREE 2 0 6 DEGREE 2 2
+ 002134 ANTENNA BEAM AZIMUTH DEGREE 2 0 16 DEGREE 2 5
+ 002135 ANTENNA ELEVATION DEGREE 2 -9000 15 DEGREE 2 5
+ 002136 RANGE PROCESSED BY RANGE ATTENUATION CORRECTION M -3 0 16 M -3 5
+ 002140 SATELLITE RADAR BEAM AZIMUTH ANGLE DEGREE 0 0 9 DEGREE 0 3
+ 002141 MEASUREMENT TYPE CCITTIA5 0 0 24 CHARACTER 0 3
+ 002142 OZONE INSTRUMENT SERIAL NUMBER/ IDENTIFICATION CCITTIA5 0 0 32 CHARACTER 0 4
+ 002143 OZONE INSTRUMENT TYPE CODE TABLE 2143 0 0 7 CODE TABLE 2143 0 3
+ 002144 LIGHT SOURCE TYPE FOR BREWER SPECTRO PHOTOMETER CODE TABLE 2144 0 0 4 CODE TABLE 2144 0 2
+ 002145 WAVE LENGTH SETTING FOR DOBSON INSTRUMENTS CODE TABLE 2145 0 0 4 CODE TABLE 2145 0 2
+ 002146 SOURCE CONDITIONS FOR DOBSON INSTRUMENTS CODE TABLE 2146 0 0 4 CODE TABLE 2146 0 2
+ 002148 DATA COLLECTION AND/OR LOCATION SYSTEM CODE TABLE 2148 0 0 5 CODE TABLE 2148 0 2
+ 002149 TYPE OF DATA BUOY CODE TABLE 2149 0 0 6 CODE TABLE 2149 0 2
+ 002150 TOVS/ATOVS/AVHRR INSTRUMENTATION CHANNEL NUMBER CODE TABLE 2150 0 0 6 CODE TABLE 2150 0 2
+ 002151 RADIOMETER IDENTIFIER CODE TABLE 2151 0 0 11 CODE TABLE 2151 0 4
+ 002152 SATELLITE INSTRUMENT USED IN DATA PROCESSING(6) FLAG TABLE 2152 0 0 31 FLAG TABLE 2152 0 10
+ 002153 SATELLITE CHANNEL CENTRE FREQUENCY Hz -8 0 26 Hz -8 8
+ 002154 SATELLITE CHANNEL BAND WIDTH Hz -8 0 26 Hz -8 8
+ 002156 PERCENTAGE OF VALID KU OCEAN RETRACKER MEASUREMENTS % 0 0 7 % 0 3
+ 002157 PERCENTAGE OF VALID S OCEAN RETRACKER MEASUREMENTS % 0 0 7 % 0 3
+ 002158 RA-2 INSTRUMENT FLAG TABLE 2158 0 0 9 FLAG TABLE 2158 0 3
+ 002159 MWR INSTRUMENT FLAG TABLE 2159 0 0 8 FLAG TABLE 2159 0 3
+ 002160 WAVE LENGTH OF THE RADAR CODE TABLE 2160 0 0 4 CODE TABLE 2160 0 2
+ 002163 HEIGHT ASSIGNMENT METHOD CODE TABLE 2163 0 0 4 CODE TABLE 2163 0 2
+ 002164 TRACER CORRELATION METHOD CODE TABLE 2164 0 0 3 CODE TABLE 2164 0 1
+ 002165 RADIANCE FLAG FLAG TABLE 2165 0 0 15 FLAG TABLE 2165 0 5
+ 002166 RADIANCE TYPE CODE TABLE 2166 0 0 4 CODE TABLE 2166 0 2
+ 002167 RADIANCE COMPUTATIONAL METHOD CODE TABLE 2167 0 0 4 CODE TABLE 2167 0 2
+ 002168 HYDROSTATIC PRESSURE OF LOWER END OF CABLE (THERMISTOR STRING) PA -3 0 16 KPA 0 5
+ 002169 ANEMOMETER TYPE CODE TABLE 2169 0 0 4 CODE TABLE 2169 0 2
+ 002172 PRODUCT TYPE FOR RETRIEVED ATMOSPHERIC GASES CODE TABLE 2172 0 0 8 CODE TABLE 2172 0 3
+ 002173 SQUARE OF THE OFF NADIR ANGLE (7) DEGREE2 4 0 10 DEGREE2 4 4
+ 002174 MEAN ACROSS TRACK PIXEL NUMBER NUMERIC 0 0 9 NUMERIC 0 3
+ 002175 METHOD OF PRECIPITATION MEASUREMENT CODE TABLE 2175 0 0 4 CODE TABLE 2175 0 2
+ 002176 METHOD OF STATE OF GROUND MEASUREMENT CODE TABLE 2176 0 0 4 CODE TABLE 2176 0 2
+ 002177 METHOD OF SNOW DEPTH MEASUREMENT CODE TABLE 2177 0 0 4 CODE TABLE 2177 0 2
+ 002178 METHOD OF LIQUID CONTENT MEASUREMENT OF PRECIPITATION CODE TABLE 2178 0 0 4 CODE TABLE 2178 0 2
+ 002179 TYPE OF SKY CONDITION ALGORITHM CODE TABLE 2179 0 0 4 CODE TABLE 2179 0 2
+ 002180 MAIN PRESENT WEATHER DETECTING SYSTEM CODE TABLE 2180 0 0 4 CODE TABLE 2180 0 2
+ 002181 SUPPLEMENTARY PRESENT WEATHER SENSOR FLAG TABLE 2181 0 0 21 FLAG TABLE 2181 0 7
+ 002182 VISIBILITY MEASUREMENT SYSTEM CODE TABLE 2182 0 0 4 CODE TABLE 2182 0 2
+ 002183 CLOUD DETECTION SYSTEM CODE TABLE 2183 0 0 4 CODE TABLE 2183 0 2
+ 002184 TYPE OF LIGHTNING DETECTION SENSOR CODE TABLE 2184 0 0 4 CODE TABLE 2184 0 2
+ 002185 METHOD OF EVAPORATION MEASUREMENT CODE TABLE 2185 0 0 4 CODE TABLE 2185 0 2
+ 002186 CAPABILITY TO DETECT PRECIPITATION PHENOMENA FLAG TABLE 2186 0 0 30 FLAG TABLE 2186 0 10
+ 002187 CAPABILITY TO DETECT OTHER WEATHER PHENOMENA FLAG TABLE 2187 0 0 18 FLAG TABLE 2187 0 6
+ 002188 CAPABILITY TO DETECT OBSCURATION FLAG TABLE 2188 0 0 21 FLAG TABLE 2188 0 7
+ 002189 CAPABILITY TO DISCRIMINATE LIGHTNING STRIKES FLAG TABLE 2189 0 0 12 FLAG TABLE 2189 0 4
+ 002190 LAGRANGIAN DRIFTER SUBMERGENCE (% TIME SUBMERGED) % 0 0 7 % 0 3
+ 002192 SAR AZIMUTH ANGLE DEGREE 0 0 9
+ 002193 1D VAR SATELLITE CHANNEL(S) USED FLAG TABLE 2193 0 0 28
+ 002194 CONSTANT LEVEL BALLOON TYPE CODE TABLE 2194 0 0 4
+ 002195 TYPE OF SATELLITE INSTRUMENTATION CODE TABLE 2195 0 0 4
+ 002196 SATELLITE CLASSIFICATION CODE TABLE 2196 0 0 9
+ 002197 SATELLITE CHANNEL CENTRE FREQUENCY Hz -8 0 26
+ 002198 SATELLITE CHANNEL BAND WIDTH Hz -8 0 26
+ 002199 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2199 0 0 4
+ 002200 LATITUDINAL RESOLUTION DEGREE 5 0 25
+ 002201 LONGITUDINAL RESOLUTION DEGREE 5 0 25
+ 002202 SIMULATED DATA PROCESSING TECHNIQUE USED FLAG TABLE 2202 0 0 4
+ 002205 LATITUDINAL RESOLUTION DEGREE 3 0 9
+ 002206 LONGITUDINAL RESOLUTION DEGREE 3 0 9
+ 002207 TYPE OF SCAN CODE TABLE 2207 0 0 3
+ 002220 DATA PRODUCER CODE TABLE 2220 0 0 9
+ 002221 SEGMENT SIZE AT NADIR IN X DIRECTION M 0 0 18
+ 002222 SEGMENT SIZE AT NADIR IN Y DIRECTION M 0 0 18
+ 002223 TOVS/ATOVS/AVHRR CHANNEL NUMBER CODE TABLE 2223 0 0 6
+ 002231 HEIGHT ASSIGNMENT METHOD CODE TABLE 2231 0 0 4
+ 002232 TRACER CORRELATION METHOD CODE TABLE 2232 0 0 3
+ 002240 TYPE OF TERMODYNAMIC SENSING CODE TABLE 2240 0 0 8
+ 002241 TYPE OF ROCKET MOTOR CODE TABLE 2241 0 0 3
+ 002242 TYPE OF WIND SENSING EQUIPMENT CODE TABLE 2242 0 0 8
+ 002243 TERMODYNAMIC CORRECTION TECHNIQUE CODE TABLE 2243 0 0 3
+ 002244 WIND CORRECTION TECHNIQUE CODE TABLE 2244 0 0 3
+ 002245 METHOD OF REDUCING OF DATA CODE TABLE 2245 0 0 4
+ 002251 RADIANCE COMPUTATIONAL METHOD CODE TABLE 2251 0 0 4
+ 002252 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 2252 0 0 31
+ 002253 HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2253 0 0 8
+ 002254 RADIANCE TYPE CODE TABLE 2254 0 0 4
+ 004001 YEAR YEAR 0 0 12 YEAR 0 4
+ 004002 MONTH MONTH 0 0 4 MONTH 0 2
+ 004003 DAY DAY 0 0 6 DAY 0 2
+ 004004 HOUR HOUR 0 0 5 HOUR 0 2
+ 004005 MINUTE MINUTE 0 0 6 MINUTE 0 2
+ 004006 SECOND SECOND 0 0 6 SECOND 0 2
+ 004007 SECONDS WITHIN A MINUTE (MICROSECOND ACCURACY) SECOND 6 0 26 S 6 8
+ 004011 TIME INCREMENT YEAR 0 -1024 11 YEAR 0 4
+ 004012 TIME INCREMENT MONTH 0 -1024 11 MONTH 0 4
+ 004013 TIME INCREMENT DAY 0 -1024 11 DAY 0 4
+ 004014 TIME INCREMENT HOUR 0 -1024 11 HOUR 0 4
+ 004015 TIME INCREMENT MINUTE 0 -2048 12 MINUTE 0 4
+ 004016 TIME INCREMENT SECOND 0 -4096 13 SECOND 0 4
+ 004017 REFERENCE TIME PERIOD FOR ACCUMULATED OR EXTREME DATA MINUTE 0 -1440 12 MINUTE 0 4
+ 004021 TIME PERIOD OR DISPLACEMENT YEAR 0 -1024 11 YEAR 0 4
+ 004022 TIME PERIOD OR DISPLACEMENT MONTH 0 -1024 11 MONTH 0 4
+ 004023 TIME PERIOD OR DISPLACEMENT DAY 0 -1024 11 DAY 0 4
+ 004024 TIME PERIOD OR DISPLACEMENT HOUR 0 -2048 12 HOUR 0 4
+ 004025 TIME PERIOD OR DISPLACEMENT MINUTE 0 -2048 12 MINUTE 0 4
+ 004026 TIME PERIOD OR DISPLACEMENT SECOND 0 -4096 13 SECOND 0 4
+ 004031 DURATION OF TIME RELATING TO FOLLOWING VALUE HOUR 0 0 8 HOUR 0 3
+ 004032 DURATION OF TIME RELATING TO FOLLOWING VALUE MINUTE 0 0 6 MINUTE 0 2
+ 004041 TIME DIFFERENCE, UTC -LMT (SEE NOTE 6) MINUTE 0 -1440 12 MINUTE 0 4
+ 004043 DAY OF THE YEAR DAY 0 0 9 DAY 0 3
+ 004051 PRINCIPAL TIME OF DAILY READING OF MAXIMUM TEMPERATURE HOUR 0 0 5 HOUR 0 2
+ 004052 PRINCIPAL TIME OF DAILY READING OF MINIMUM TEMPERATURE HOUR 0 0 5 HOUR 0 2
+ 004053 NUMBER OF DAYS WITH PRECIPITATION EQUAL TO OR MORE THAN 1 MM NUMERIC 0 0 6 NUMERIC 0 2
+ 004059 TIMES OF OBSERVATION USED TO COMPUTE THE REPORTED MEAN VALUES FLAG TABLE 4059 0 0 6 FLAG TABLE 4059 0 2
+ 004065 SHORT TIME INCREMENT MINUTE 0 -128 8 MINUTE 0 2
+ 004073 SHORT TIME PERIOD OR DISPLACEMENT DAY 0 -128 8 DAY 0 2
+ 004074 SHORT TIME PERIOD OR DISPLACEMENT HOUR 0 -128 8 HOUR 0 2
+ 004075 SHORT TIME PERIOD OR DISPLACEMENT MINUTE 0 -128 8 MINUTE 0 2
+ 004080 AVERAGING PERIOD FOR FOLLOWING VALUE CODE TABLE 4080 0 0 4 CODE TABLE 4080 0 2
+ 004086 LONG TIME PERIOD OR DISPLACEMENT SECOND 0 -8192 15 SECOND 0 5
+ 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005011 LATITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005012 LATITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005015 LATITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005016 LATITUDE DISPLACEMENT (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 005023 SUN TO SATELLITE AZIMUTH DIFFERENCE DEGREE 1 -1800 12 DEGREE 1 4
+ 005030 DIRECTION (SPECTRAL) DEGREE 0 0 12 DEGREE 0 4
+ 005031 ROW NUMBER NUMERIC 0 0 12 NUMERIC 0 4
+ 005033 PIXEL SIZE ON HORIZONTAL - 1 M -1 0 16 M -1 5
+ 005034 ALONG TRACK ROW NUMBER NUMERIC 0 0 11 NUMERIC 0 4
+ 005036 SHIP TRANSECT NUMBER ACCORDING TO SOOP NUMERIC 0 0 7 NUMERIC 0 2
+ 005040 ORBIT NUMBER NUMERIC 0 0 24 NUMERIC 0 8
+ 005041 SCAN LINE NUMBER NUMERIC 0 0 8 NUMERIC 0 3
+ 005042 CHANNEL NUMBER NUMERIC 0 0 6 NUMERIC 0 2^M
+ 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8 NUMERIC 0 3
+ 005044 SATELLITE CYCLE NUMBER NUMERIC 0 0 11 NUMERIC 0 4
+ 005045 FIELD OF REGARD NUMBER NUMERIC 0 0 8 NUMERIC 0 3
+ 005052 CHANNEL NUMBER INCREMENT NUMERIC 0 0 5 NUMERIC 0 2
+ 005053 FIELD OF VIEW NUMBER INCREMENT NUMERIC 0 0 5 NUMERIC 0 2
+ 005060 Y ANGULAR POSITION FROM CENTRE OF GRAVITY DEGREE 6 -8000000 24 DEGREE 6 8
+ 005061 Z ANGULAR POSITION FROM CENTRE OF GRAVITY DEGREE 6 -8000000 24 DEGREE 6 8
+ 005193 ALONG TRACK ROW NUMBER AT 50 KM NUMERIC 0 0 10 NUMERIC 0 4
+ 005194 ALONG TRACK ROW NUMBER AT 25 KM NUMERIC 0 0 11 NUMERIC 0 4
+ 005195 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 7 NUMERIC 0 3
+ 005196 SCAN ANGLE DEGREE 1 -1800 12 DEGREE 1 4
+ 005217 LOCATION OF PLATFORM, X M 2 -1073741824 31 M 2 10
+ 005232 DIRECTION (SPECTRAL) DEGREE 2 0 16 DEGREE 2 5
+ 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006011 LONGITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006012 LONGITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006015 LONGITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006016 LONGITUDE DISPLACEMENT (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006021 DISTANCE M -1 0 13 M -1 4
+ 006029 WAVE NUMBER 1/M 1 0 22 M 1 7
+ 006030 WAVE NUMBER (SPECTRAL) RAD/M 5 0 13 RAD/M 5 4
+ 006031 COLUMN NUMBER NUMERIC 0 0 12 NUMERIC 0 4
+ 006033 PIXEL SIZE ON HORIZONTAL - 2 M -1 0 16 M -1 5
+ 006034 CROSS-TRACK CELL NUMBER NUMERIC 0 0 7 NUMERIC 0 3
+ 006040 RADIUS OF CONFIDENCE M 0 0 13 M 0 4
+ 006193 CROSS TRACK CELL NUMBER AT 50 KM NUMERIC 0 0 6 NUMERIC 0 2
+ 006194 CROSS TRACK CELL NUMBER AT 25 KM NUMERIC 0 0 7 NUMERIC 0 3
+ 006217 LOCATION OF PLATFORM, Y M 2 -1073741824 31 M 2 10
+ 006232 WAVENUMBER (SPECTRAL) RADS/M 5 0 13 ADS/M 5 4
+ 007001 HEIGHT OF STATION (SEE NOTE 1) M 0 -400 15 M 0 5
+ 007002 HEIGHT OR ALTITUDE M -1 -40 16 M -1 5
+ 007003 GEOPOTENTIAL M**2/S**2 -1 -400 17 M**2/S**2 -1 6
+ 007004 PRESSURE PA -1 0 14 PA -1 5
+ 007005 HEIGHT INCREMENT M 0 -400 12 M 0 4
+ 007006 HEIGHT ABOVE STATION M 0 0 15 M 0 5
+ 007007 HEIGHT M 0 -1000 17 M 0 6
+ 007008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7
+ 007009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17 GPM 0 5
+ 007010 FLIGHT LEVEL M 0 -1024 16 FT -1 5
+ 007012 GRID POINT ALTITUDE M 2 -50000 20 M 2 7
+ 007021 ELEVATION (SEE NOTE 2) DEGREE 2 -9000 15 DEGREE 2 5
+ 007022 SOLAR ELEVATION DEGREE 2 -9000 15 DEGREE 2 5
+ 007024 SATELLITE ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 007025 SOLAR ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 007026 SATELLITE ZENITH ANGLE DEGREE 4 -900000 21 DEGREE 4 7
+ 007030 HEIGHT OF STATION GROUND ABOVE MEAN SEA LEVEL (SEE NOTE 3) M 1 -4000 17 M 1 5
+ 007031 HEIGHT OF BAROMETER ABOVE MEAN SEA LEVEL (SEE NOTE 4) M 1 -4000 17 M 1 5
+ 007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM) M 2 0 16 M 2 5
+ 007033 HEIGHT OF SENSOR ABOVE WATER SURFACE (SEE NOTE 6) M 1 0 12 M 1 4
+ 007040 IMPACT PARAMETER (SEE NOTE 8) M 1 62000000 22 M 1 8
+ 007061 DEPTH BELOW LAND SURFACE M 2 0 14 M 2 5
+ 007062 DEPTH BELOW SEA/WATER SURFACE M 1 0 17 M 1 6
+ 007063 DEPTH BELOW SEA/WATER SURFACE M 2 0 20 M 2 7
+ 007064 REPRESENTATIVE HEIGHT OF SENSOR ABOVE STATION (SEE NOTE 7) M 0 0 4 M 0 2
+ 007065 WATER PRESSURE PA -3 0 17 PA 0 6
+ 007070 DROGUE DEPTH M 0 0 10 M 0 4
+ 007217 LOCATION OF PLATFORM, Z M 2 -1073741824 31 M 2 10
+ 008001 VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8001 0 0 7 FLAG TABLE 8001 0 3
+ 008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS) CODE TABLE 8002 0 0 6 CODE TABLE 8002 0 2
+ 008003 VERTICAL SIGNIFICANCE (SATELLITE OBSERVATIONS) CODE TABLE 8003 0 0 6 CODE TABLE 8003 0 2
+ 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 8004 0 0 3 CODE TABLE 8004 0 1
+ 008005 METEOROLOGICAL ATTRIBUTE SIGNIFICANCE CODE TABLE 8005 0 0 4 CODE TABLE 8005 0 2
+ 008006 OZONE VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8006 0 0 9 FLAG TABLE 8006 0 3
+ 008007 DIMENSIONAL SIGNIFICANCE CODE TABLE 8007 0 0 4 CODE TABLE 8007 0 2
+ 008008 RADIATION VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8008 0 0 9 FLAG TABLE 8008 0 3
+ 008009 DETAILED PHASE OF FLIGHT CODE TABLE 8009 0 0 4 CODE TABLE 8009 0 2
+ 008010 SURFACE QUALIFIER (TEMPERATURE DATA) CODE TABLE 8010 0 0 5 CODE TABLE 8010 0 2
+ 008011 METEOROLOGICAL FEATURE CODE TABLE 8011 0 0 6 CODE TABLE 8011 0 2
+ 008012 LAND/SEA QUALIFIER CODE TABLE 8012 0 0 2 CODE TABLE 8012 0 1
+ 008013 DAY/NIGHT QUALIFIER CODE TABLE 8013 0 0 2 CODE TABLE 8013 0 1
+ 008014 QUALIFIER FOR RUNWAY VISUAL RANGE CODE TABLE 8014 0 0 4 CODE TABLE 8014 0 2
+ 008016 CHANGE QUALIFIER OF A TREND-TYPE FORECAST OR AN AERODROME FORECA CODE TABLE 8016 0 0 3 CODE TABLE 8016 0 1
+ 008017 QUALIFIER OF THE TIME WHEN THE FORECAST CHANGE IS EXPECTED CODE TABLE 8017 0 0 2 CODE TABLE 8017 0 1
+ 008018 SEAWINDS LAND/ICE SURFACE TYPE FLAG TABLE 8018 0 0 17 FLAG TABLE 8018 0 6
+ 008019 QUALIFIER FOR FOLLOWING CENTRE IDENTIFIER CODE TABLE 8019 0 0 4 CODE TABLE 8019 0 2
+ 008020 TOTAL NUMBER OF MISSING ENTITIES (WITH RESPECT TO ACCUMULATION O NUMERIC 0 0 16 NUMERIC 0 5
+ 008021 TIME SIGNIFICANCE CODE TABLE 8021 0 0 5 CODE TABLE 8021 0 2
+ 008022 TOTAL NUMBER (WITH RESPECT TO ACCUMULATION OR AVERAGE) NUMERIC 0 0 16 NUMERIC 0 5
+ 008023 FIRST ORDER STATISTICS CODE TABLE 8023 0 0 6 CODE TABLE 8023 0 2
+ 008024 DIFFERENCE STATISTICS CODE TABLE 8024 0 0 6 CODE TABLE 8024 0 2
+ 008025 TIME DIFFERENCE QUALIFIER CODE TABLE 8025 0 0 4 CODE TABLE 8025 0 2
+ 008026 MATRIX SIGNIFICANCE CODE TABLE 8026 0 0 6 CODE TABLE 8026 0 2
+ 008029 REMOTLY SENSED SURFACE TYPE CODE TABLE 8029 0 0 8 CODE TABLE 8029 0 3
+ 008030 MANUAL ON CODES (VOLUME I.1, SECTION C) CODE TABLE FROM WHICH DA NUMERIC 0 0 13 NUMERIC 0 4
+ 008031 DATA CATEGORY CREX TABLE A NUMERIC 0 0 8 NUMERIC 0 3
+ 008033 METHOD OF DERIVATION OF PERCENTAGE CONFIDENCE CODE TABLE 8033 0 0 7 CODE TABLE 8033 0 3
+ 008035 TYPE OF MONITORING EXERCISE CODE TABLE 8035 0 0 3 CODE TABLE 8035 0 1
+ 008036 TYPE OF CENTRE OR STATION PERFORMING MONITORING CODE TABLE 8036 0 0 3 CODE TABLE 8036 0 1
+ 008039 TIME SIGNIFICANCE ( AVIATION FORECAST) CODE TABLE 8039 0 0 6 CODE TABLE 8039 0 2
+ 008040 FLIGHT LEVEL SIGNIFICANCE CODE TABLE 8040 0 0 6 CODE TABLE 8040 0 2
+ 008041 DATA SIGNIFICANCE CODE TABLE 8041 0 0 5 CODE TABLE 8041 0 2
+ 008042 EXTENDED VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8042 0 0 18 FLAG TABLE 8042 0 6
+ 008043 ATMOSPHERIC CHEMICAL OR PHISICAL CONSTITUENT TYPE CODE TABLE 8043 0 0 8 CODE TABLE 8043 0 3
+ 008044 CAS REGISTRY NUMBER CCITTIA5 0 0 88 CHARACTERS 0 11
+ 008045 PARTICULATE MATTER CHARACTERIZATION CODE TABLE 8045 0 0 8 CODE TABLE 8045 0 3
+ 008049 NUMBER OF OBSERVATIONS NUMERIC 0 0 8 NUMERIC 0 3
+ 008050 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 8050 0 0 4 CODE TABLE 8050 0 2
+ 008051 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 8051 0 0 3 CODE TABLE 8051 0 1
+ 008052 CONDITION FOR WHICH NUMBER OF DAYS OF OCCURRENCE FOLLOWS CODE TABLE 8052 0 0 5 CODE TABLE 8052 0 2
+ 008053 DAY OF OCCURRENCE QUALIFIER CODE TABLE 8053 0 0 2 CODE TABLE 8053 0 1
+ 008054 QUALIFIER FOR WIND SPEED OR WIND GUST CODE TABLE 8054 0 0 3 CODE TABLE 8054 0 1
+ 008060 SAMPLE SCANNING MODE SIGNIFICANCE CODE TABLE 8060 0 0 4 CODE TABLE 8060 0 2
+ 008065 SUN-GLINT INDICATOR CODE TABLE 8065 0 0 2 CODE TABLE 8065 0 1
+ 008066 SEMI-TRANSPARENCY INDICATOR CODE TABLE 8066 0 0 2 CODE TABLE 8066 0 1
+ 008070 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8070 0 0 4 CODE TABLE 8070 0 2
+ 008072 PIXEL(S) TYPE CODE TABLE 8072 0 0 3 CODE TABLE 8072 0 1
+ 008074 ALTIMETER ECHO TYPE CODE TABLE 8074 0 0 2 CODE TABLE 8074 0 1
+ 008075 ASCENDING/DESCENDING ORBIT QUALIFIER CODE TABLE 8075 0 0 2 CODE TABLE 8075 0 1
+ 008076 TYPE OF BAND CODE TABLE 8076 0 0 6 CODE TABLE 8076 0 2
+ 008077 RADIOMETER SENSED SURFACE TYPE CODE TABLE 8077 0 0 7 CODE TABLE 8077 0 3
+ 008079 PRODUCT STATUS CODE TABLE 8079 0 0 4 CODE TABLE 8079 0 2
+ 008080 QUALIFIER FOR GTSPP QUALITY FLAG CODE TABLE 8080 0 0 6 CODE TABLE 8080 0 2
+ 008081 TYPE OF EQUIPMENT CODE TABLE 8081 0 0 6 CODE TABLE 8081 0 2
+ 008082 (CBS) ARTIFICIAL CORRECTION OF SENSOR HEIGHT TO ANOTHER VALUE CODE TABLE 8082 0 0 3 CODE TABLE 8082 0 1
+ 008083 NOMINAL VALUE INDICATOR FLAG TABLE 8083 0 0 15 FLAG TABLE 8083 0 5
+ 008085 BEAM IDENTIFIER CODE TABLE 8085 0 0 3 CODE TABLE 8085 0 1
+ 008090 DECIMAL SCALE OF FOLLOWING SIGNIFICANDS NUMERIC 0 -127 8 NUMERIC 0 3
+ 008193 TIME QUALIFIER CODE TABLE 8193 0 0 6 CODE TABLE 8193 0 2
+ 008194 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8194 0 0 4 CODE TABLE 8194 0 2
+ 008195 DATA TYPE CODE TABLE 8195 0 0 7 CODE TABLE 8195 0 3
+ 008200 NUMBER OF OBSERVATIONS NUMERIC 0 0 8 NUMERIC 0 3
+ 008222 GENERATOR SIGNIFICANCE CODE TABLE 8222 0 0 4 CODE TABLE 8222 0 2
+ 008223 LAND/ICE SURFACE FLAG FLAG TABLE 8223 0 0 7 FLAG TABLE 8223 0 3
+ 008224 LAND/SEA FRACTION NUMERIC 3 0 10 NUMERIC 3 4
+ 008225 GHRSST SURFACE TYPE FLAG TABLE 8225 0 0 5 FLAG TABLE 8225 0 2
+ 010001 HEIGHT OF LAND SURFACE M 0 -400 15 M 0 5
+ 010002 HEIGHT M -1 -40 16 M -1 5
+ 010003 GEOPOTENTIAL M**2/S**2 -1 -400 17 M**2/S**2 -1 6
+ 010004 PRESSURE PA -1 0 14 PA -1 5
+ 010007 HEIGHT M 0 -1000 17 M 0 6
+ 010008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7
+ 010009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17 GPM 0 5
+ 010010 MINIMUM PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010011 MAXIMUM PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010031 IN DIRECTION OF THE NORTH POLE, DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31 M 2 10
+ 010032 SATELLITE DISTANCE TO EARTH'S CENTRE M 1 0 27 M 2 9
+ 010033 ALTITUDE (PLATFORM TO ELLIPSOID) M 1 0 27 M 2 9
+ 010034 EARTH RADIUS M 1 0 27 M 2 9
+ 010035 EARTH'S LOCAL RADIUS OF CURVATURE M 1 62000000 22 M 1 8
+ 010036 GEOID UNDULATION (SEE NOTE 4) M 2 -15000 15 M 2 6
+ 010040 NUMBER OF RETRIEVED LAYERS NUMERIC 0 0 10 NUMERIC 0 4
+ 010050 STANDARD DEVIATION ALTITUDE M 2 0 16 M 2 5
+ 010051 PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010052 ALTIMETER SETTING (QNH) PA -1 0 14 PA -1 5
+ 010060 PRESSURE CHANGE PA -1 -1024 11 PA -1 4
+ 010061 3-HOUR PRESSURE CHANGE PA -1 -500 10 PA -1 4
+ 010062 24-HOUR PRESSURE CHANGE PA -1 -1000 11 PA -1 4
+ 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 10063 0 0 4 CODE TABLE 10063 0 2
+ 010064 SIGMET CRUISING LEVEL CODE TABLE 10064 0 0 3 CODE TABLE 10064 0 1
+ 010070 INDICATED AIRCRAFT ALTITUDE M 0 -400 16 M 0 5
+ 010080 VIEWING ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 010081 ALTITUDE OF COG ABOVE REFERENCE ELLIPSOID M 3 0 31 M 3 10
+ 010082 INSTANTANEOUS ALTITUDE RATE MS-1 3 -65536 17 MS-1 3 6
+ 010083 SQUARED OFF NADIR ANGLE OF THE SATELLITE FROM PLATFORM DATA DEGREE**2 2 0 16 DEGREE**2 2 5
+ 010084 SQUARED OFF NADIR ANGLE OF THE SATELLITE FROM WAVEFORM DATA DEGREE**2 2 0 16 DEGREE**2 2 5
+ 010085 MEAN SEA SURFACE HEIGHT M 3 -131072 18 M 3 6
+ 010086 GEOID'S HEIGHT M 3 -131072 18 M 3 6
+ 010087 OCEAN DEPTH/LAND ELEVATION M 1 -131072 18 M 3 6
+ 010088 TOTAL GEOCENTRIC OCEAN TIDE HEIGHT SOLUTION 1 M 3 -32768 16 M 3 5
+ 010089 TOTAL GEOCENTRIC OCEAN TIDE HEIGHT SOLUTION 2 M 3 -32768 16 M 3 5
+ 010090 LONG PERIOD TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010091 TIDAL LOADING HEIGHT M 3 -32768 16 M 3 5
+ 010092 SOLID EARTH TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010093 GEOCENTRIC POLE TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010095 HEIGHT OF ATMOSPHERE USED M 0 0 16 M 0 5
+ 010096 MEAN DYNAMIC TOPOGRAPHY M 3 -131072 18
+ 010097 MEAN SEA SURFACE HEIGHT FROM ALTIMETER ONLY M 3 -131072 18
+ 010098 LOADING TIDE HEIGHT GEOCENTRIC OCEAN TIDE SOLUTION 1 M 4 -2000 12
+ 010099 LOADING TIDE HEIGHT GEOCENTRIC OCEAN TIDE SOLUTION 2 M 4 -2000 12
+ 010100 NON-EQUILIBRIUM LONG PERIOD TIDE HEIGHT M 4 -2000 12
+ 010101 SQUARED OFF NADIR ANGLE OF THE SATELLITE FROM WAVEFORM DATA DEGREE**2 2 -32768 16 DEGREE**2 2 5
+ 010102 SEA SURFACE HEIGHT ANOMALY M 3 -32768 16
+ 010195 HEIGHT(HIGH ACCURACY) M 1 -4096 20
+ 010196 SOLAR ZENITH ANGLE DEGREE 2 -9000 15
+ 010197 ANEMOMETER HEIGHT M 0 0 9
+ 011001 WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011002 WIND SPEED M/S 1 0 12 M/S 1 4
+ 011003 U-COMPONENT M/S 1 -4096 13 M/S 1 4
+ 011004 V-COMPONENT M/S 1 -4096 13 M/S 1 4
+ 011005 W-COMPONENT PA/S 1 -512 10 PA/S 1 4
+ 011006 W-COMPONENT M/S 2 -4096 13 M/S 2 4
+ 011010 WIND DIRECTION ASSOCIATED WITH WIND SPEED WHICH FOLLOWS DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011011 WIND DIRECTION AT 10 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011012 WIND SPEED AT 10 M M/S 1 0 12 M/S 1 4
+ 011013 WIND DIRECTION AT 5 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011014 WIND SPEED AT 5 M M/S 1 0 12 M/S 1 4
+ 011016 EXTREME COUNTERCLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011017 EXTREME CLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011019 STEADINESS OF WIND (6) % 0 0 7 % 0 3
+ 011021 RELATIVE VORTICITY 1/S 9 -65536 17 1/S 9 6
+ 011022 DIVERGENCE 1/S 9 -65536 17 1/S 9 6
+ 011023 VELOCITY POTENTIAL M**2/S -2 -65536 17 M**2/S -2 6
+ 011030 EXTENDED DEGREE OF TURBULENCE CODE TABLE 11030 0 0 6 CODE TABLE 0 2
+ 011031 DEGREE OF TURBULENCE CODE TABLE 11031 0 0 4 CODE TABLE 11031 0 2
+ 011032 HEIGHT OF BASE OF TURBULENCE M -1 -40 16 M -1 5
+ 011033 HEIGHT OF TOP OF TURBULENCE M -1 -40 16 M -1 5
+ 011034 VERTICAL GUST VELOCITY M/S 1 -1024 11 M/S 1 4
+ 011035 VERTICAL GUST ACCELERATION M/S**2 2 -8192 14 M/S**2 2 5
+ 011036 MAXIMUM DERIVED EQUIVALENT VERTICAL GUST SPEED M/S 1 0 10 M/S 1 4
+ 011037 TURBULENCE INDEX CODE TABLE 11037 0 0 6 CODE TABLE 11037 0 2
+ 011038 TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11038 0 0 5 CODE TABLE 11038 0 2
+ 011039 EXTENDED TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11039 0 0 6 CODE TABLE 11039 0 2
+ 011040 MAXIMUM WIND SPEED (MEAN WIND) M/S 1 0 12 M/S 1 4
+ 011041 MAXIMUM WIND GUST SPEED M/S 1 0 12 M/S 1 4
+ 011042 MAXIMUM WIND SPEED (10-MIN MEAN WIND) M/S 1 0 12 M/S 1 4
+ 011043 MAXIMUM WIND GUST DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011044 MEAN WIND DIRECTION FOR SURFACE - 1500 M (5000 FEET) DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011045 MEAN WIND SPEED FOR SURFACE - 1500 M (5000 FEET) M/S 1 0 12 M/S 1 4
+ 011046 MAXIMUM INSTANTANEOUS WIND SPEED M/S 1 0 12 M/S 1 4
+ 011047 MAXIMUM INSTANTANEOUS WIND SPEED OVER 10 MINUTES M/S 1 0 12 M/S 1 4
+ 011049 STANDARD DEVIATION OF WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011050 STANDARD DEVIATION OF HORIZONTAL WIND SPEED M/S 1 0 12 M/S 1 4
+ 011051 STANDARD DEVIATION OF VERTICAL WIND SPEED M/S 1 0 8 M/S 1 3
+ 011052 FORMAL UNCERTAINTY IN WIND SPEED M/S 2 0 13 M/S 2 5
+ 011053 FORMAL UNCERTAINTY IN WIND DIRECTION DEGREE TRUE 2 0 15 DEGREE TRUE 2 5
+ 011054 MEAN WIND DIRECTION FOR 1500 M - 3000 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011055 MEAN WIND SPEED FOR 1500 M - 3000 M M/S 1 0 12 M/S 1 4
+ 011061 ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW M/S 1 0 12 M/S 1 4
+ 011062 ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE M/S 1 0 12 M/S 1 4
+ 011070 DESIGNATOR OF THE RUNWAY AFFECTED BY WIND SHEAR (INCLUDING ALL) CCITTIA5 0 0 32 CHARACTER 0 4
+ 011071 TURBULENT VERTICAL MOMENTUM FLUX M**2/S**2 3 -128 14 M**2/S**2 3 5
+ 011072 TURBULENT VERTICAL BUOYANCY FLUX KM/S 3 -128 11 KM/S 3 4
+ 011073 TURBULENT KINETIC ENERGY M**2/S**2 2 -1024 13 M**2/S**2 2 4
+ 011074 DISSIPATION ENERGY M**2/S**2 2 -1024 10 M**2/S**2 2 4
+ 011075 MEAN TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3
+ 011076 PEAK TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3
+ 011077 REPORTING INTERVAL OR AVERAGING TIME FOR EDDY DISSIPATION RATE S 0 0 12 S 0 4
+ 011081 MODEL WIND DIRECTION AT 10M DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 011082 MODEL WIND SPEED AT 10M M/S 2 0 14 M/S 2 4
+ 011083 WIND SPEED KM/HOUR 0 0 9 KM/HOUR 0 3
+ 011084 WIND SPEED KNOT 0 0 8 KNOT 0 3
+ 011085 MAXIMUM WIND GUST SPEED KM/HOUR 0 0 9 KM/HOUR 0 3
+ 011086 MAXIMUM WIND GUST SPEED KNOT 0 0 8 KNOT 0 3
+ 011095 U COMPONENT OF THE MODEL WIND VECTOR M/S 1 -4096 13 M/S 1 4
+ 011096 V COMPONENT OF THE MODEL WIND VECTOR M/S 1 -4096 13 M/S 1 4
+ 011097 WIND SPEED FROM ALTIMETER M/S 2 0 12
+ 011098 WIND SPEED FROM RADIOMETER M/S 2 0 12
+ 011192 U - COMPONENT AT 10 M M/S 1 -4096 13 M/S 1 4^M
+ 011193 V - COMPONENT AT 10 M M/S 1 -4096 13 M/S 1 4^M
+ 011194 W - COMPONENT AT 10 M M/S 1 -4096 13 M/S 1 4^M
+ 011195 STEADINESS OF WIND % 0 0 7 % 0 3
+ 011196 FRICTION VELOCITY M/S 5 0 19
+ 011201 HORIZONTAL LINE OF SIGHT COMPONENT M/S 1 -4096 13
+ 011210 1D VAR WIND SPEED RETREIVED ERRO(S) M/S 2 0 12
+ 011211 WIND SPEED INDEPENDENT ESTIMATE OF ERROR(S) M/S 2 0 12
+ 011220 FORMAL UNCERTAINTY IN WIND SPEED M/S 2 0 12
+ 011221 FORMAL UNCERTAINTY IN WIND DIRECTION DEGREE TRUE 2 0 15
+ 011230 MAXIMUM MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4^M
+ 011231 MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4^M
+ 011232 MINIMUM MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4^M
+ 011233 HIGHEST GUST DURING THE 10 MINUTE PERIOD PRECEDING OBSERVATION M/S 1 -4096 13 M/S 1 4^M
+ 012001 TEMPERATURE/DRY-BULB TEMPERATURE K 1 0 12 C 1 3
+ 012002 WET-BULB TEMPERATURE K 1 0 12 C 1 3
+ 012003 DEW-POINT TEMPERATURE K 1 0 12 C 1 3
+ 012004 DRY-BULB TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012005 WET-BULB TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012006 DEW-POINT TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012007 VIRTUAL TEMPERATURE K 1 0 12 C 1 3
+ 012011 MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12 C 1 3
+ 012012 MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12 C 1 3
+ 012013 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS K 1 0 12 C 1 3
+ 012014 MAXIMUM TEMPERATURE AT 2 M, PAST 12 HOURS K 1 0 12 C 1 3
+ 012015 MINIMUM TEMPERATURE AT 2 M, PAST 12 HOURS K 1 0 12 C 1 3
+ 012016 MAXIMUM TEMPERATURE AT 2 M, PAST 24 HOURS K 1 0 12 C 1 3
+ 012017 MINIMUM TEMPERATURE AT 2 M, PAST 24 HOURS K 1 0 12 C 1 3
+ 012021 MAXIMUM TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012022 MINIMUM TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012023 TEMPERATURE C 0 -99 8 C 0 2
+ 012024 DEW POINT TEMPERATURE C 0 -99 8 C 0 2
+ 012030 SOIL TEMPERATURE K 1 0 12 C 1 3
+ 012049 TEMPERATURE CHANGE OVER SPECIFIED PERIOD K 0 -30 6 C 0 2
+ 012051 STANDARD DEVIATION TEMPERATURE K 1 0 10 C 1 3
+ 012052 HIGHEST DAILY MEAN TEMPERATURE K 1 0 12 C 1 3
+ 012053 LOWEST DAILY MEAN TEMPERATURE K 1 0 12 C 1 3
+ 012061 SKIN TEMPERATURE K 1 0 12 C 1 3
+ 012062 EQUIVALENT BLACK BODY TEMPERATURE K 1 0 12 C 1 3
+ 012063 BRIGHTNESS TEMPERATURE K 1 0 12 C 1 3
+ 012064 INSTRUMENT TEMPERATURE K 1 0 12 K 1 4
+ 012065 STANDARD DEVIATION BRIGHTNESS TEMPERATURE K 1 0 12 K 1 4
+ 012070 WARM LOAD TEMPERATURE K 2 0 16 K 2 5
+ 012071 COLDEST CLUSTER TEMPERATURE K 1 0 12 K 1 4
+ 012072 RADIANCE WM**(-2)SR**(-1) 6 0 31 WM**(-2)SR**(-1) 6 9
+ 012073 TEMPERATURE K 2 0 16 K 1 4
+ 012075 SPECTRAL RADIANCE WM**(-3)SR**(-1) -3 0 16 WM**(-3)SR**(-1) -3 5
+ 012076 RADIANCE WM**(-2)SR**(-1) 3 0 16 WM**(-2)SR**(-1) 3 5
+ 012080 BRIGHTNESS TEMPERATURE REAL PART K 2 -10000 16 K 2 5
+ 012081 BRIGHTNESS TEMPERATURE IMAGINARY PART K 2 -10000 16 K 2 5
+ 012082 PIXEL RADIOMETRIC ACCURACY K 2 0 12 K 2 4
+ 012101 TEMPERATURE/DRY-BULB TEMPERATURE K 2 0 16 C 2 4
+ 012102 WET-BULB TEMPERATURE K 2 0 16 C 2 4
+ 012103 DEW-POINT TEMPERATURE K 2 0 16 C 2 4
+ 012104 DRY-BULB TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012105 WEB-BULB TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012106 DEW-POINT TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012107 VIRTUAL TEMPERATURE K 2 0 16 C 2 4
+ 012111 MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 2 0 16 C 2 4
+ 012112 MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 2 0 16 C 2 4
+ 012113 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS K 2 0 16 C 2 4
+ 012114 MAXIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 2 0 16 C 2 4
+ 012115 MINIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 2 0 16 C 2 4
+ 012116 MAXIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 2 0 16 C 2 4
+ 012117 MINIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 2 0 16 C 2 4
+ 012118 MAXIMUM TEMPERATURE AT HEIGHT SPECIFIED, PAST 24 HOURS K 2 0 16 C 2 4
+ 012119 MINIMUM TEMPERATURE AT HEIGHT SPECIFIED, PAST 24 HOURS K 2 0 16 C 2 4
+ 012121 GROUND MINIMUM TEMPERATURE K 2 0 16 C 2 4
+ 012122 GROUND MINIMUM TEMPERATURE OF THE PRECEDING NIGHT K 2 0 16 C 2 4
+ 012130 SOIL TEMPERATURE K 2 0 16 C 2 4
+ 012151 STANDARD DEVIATION OF DAILY MEAN TEMPERATURE K 2 0 12 C 2 4
+ 012152 HIGHEST DAILY MEAN TEMPERATURE K 2 0 16 C 2 4
+ 012153 LOWEST DAILY MEAN TEMPERATURE K 2 0 16 C 2 4
+ 012161 SKIN TEMPERATURE K 2 0 16 C 2 4
+ 012162 EQUIVALENT BLACK BODY TEMPERATURE K 2 0 16 C 2 4
+ 012163 BRIGHTNESS TEMPERATURE K 2 0 16 C 2 4
+ 012164 INSTRUMENT TEMPERATURE K 2 0 16 K 2 5
+ 012165 DIRECT SUN BRIGHTNESS TEMPERATURE K 0 0 23 K 0 7
+ 012166 SNAPSHOT ACCURACY K 1 -4000 13 K 1 4
+ 012167 RADIOMETRIC ACCURACY (PURE POLARISATION) K 1 0 9 K 1 3
+ 012168 RADIOMETRIC ACCURACY ( CROSS POLARISATION ) K 1 0 9 K 1 3
+ 012171 COLDEST CLUSTER TEMPERATURE K 2 0 16 K 2 5
+ 012180 AVERAGED 12 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012181 AVERAGED 11 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012182 AVERAGED 3.7 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012183 AVERAGED 12 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012184 AVERAGED 11 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012185 AVERAGED 3.7 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012186 MEAN NADIR SEA SURFACE TEMPERATURE K 2 0 16 K 2 5
+ 012187 MEAN DUAL VIEW SEA SURFACE TEMPERATURE K 2 0 16 K 2 5
+ 012188 INTERPOLATED 23.8 GHZ BRIGHTNESS T FROM MWR K 2 0 16 K 2 5
+ 012189 INTERPOLATED 36.5 GHZ BRIGHTNESS T FROM MWR K 2 0 16 K 2 5
+ 012193 COLDEST CLUSTER TEMPERATURE K 1 0 12
+ 012194 RADIANCE W/M**2*STER*M**(-1) 6 0 31
+ 012195 SPECTRAL RADIANCE W/M**2*STER*M**(-1) 10 0 31
+ 012196 RADIANCE W/M**2*STER 3 0 16
+ 012197 MAXIMUM TEMPERATURE AT 2M, PAST 3 HOURS K 1 0 12
+ 012198 MINIMUM TEMPERATURE AT 2M, PAST 3 HOURS K 1 0 12
+ 012199 MAXIMUM TEMPERATURE AT 2M, PAST 6 HOURS K 1 0 12
+ 012200 MINIMUM TEMPERATURE AT 2M, PAST 6 HOURS K 1 0 12
+ 012201 BRIGHTNES TEMPERATURE OR STOKES PARAMETER K 3 -271300 20
+ 013001 SPECIFIC HUMIDITY KG/KG 5 0 14 KG/KG 5 5
+ 013002 MIXING RATIO KG/KG 5 0 14 KG/KG 5 5
+ 013003 RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013004 VAPOUR PRESSURE PA -1 0 10 PA -1 4
+ 013005 VAPOUR DENSITY KG/M**3 3 0 7 KG/M**3 3 3
+ 013006 MIXING HEIGHTS M -1 -40 16 M -1 5
+ 013007 MINIMUM RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013008 MAXIMUM RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013009 RELATIVE HUMIDITY % 1 -1000 12 % 1 4
+ 013011 TOTAL PRECIPITATION/TOTAL WATER EQUIVALENT KG/M**2 1 -1 14 KG/M**2 1 5
+ 013012 DEPTH OF FRESH SNOW M 2 -2 12 M 2 4
+ 013013 TOTAL SNOW DEPTH M 2 -2 16 M 2 5
+ 013014 RAINFALL/WATER EQUIVALENT OF SNOW (AVERAGED RATE) KG/(M**2)S 4 0 12 KG/(M**2)S 4 4
+ 013015 SNOWFALL (AVERAGED RATE) M/S 7 0 12 M/S 7 4
+ 013016 PRECIPITABLE WATER KG/M**2 0 0 7 KG/M**2 0 3
+ 013019 TOTAL PRECIPITATION PAST 1 HOUR KG/M**2 1 -1 14 KG/M**2 1 4
+ 013020 TOTAL PRECIPITATION PAST 3 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013021 TOTAL PRECIPITATION PAST 6 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013022 TOTAL PRECIPITATION PAST 12 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013023 TOTAL PRECIPITATION PAST 24 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013031 EVAPOTRANSPIRATION KG/M**2 0 0 7 KG/M**2 0 3
+ 013032 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 8 KG/M**2 1 3
+ 013033 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 10 KG/M**2 1 4
+ 013038 SUPERADIABATIC INDICATOR CODE TABLE 13038 0 0 2 CODE TABLE 13038 0 1
+ 013039 TERRAIN TYPE (ICE/SNOW) CODE TABLE 13039 0 0 3 CODE TABLE 13039 0 1
+ 013040 SURFACE FLAG CODE TABLE 13040 0 0 4 CODE TABLE 13040 0 2
+ 013041 PASQUILL-GIFFORD STABILITY CATEGORY CODE TABLE 13041 0 0 4 CODE TABLE 13041 0 2
+ 013042 PARCEL LIFTED INDEX (TO 500 HPA) K 0 -20 6 K 0 2
+ 013043 BEST LIFTED INDEX (TO 500 HPA) K 0 -20 6 K 0 2
+ 013044 K INDEX K 0 -30 8 K 0 3
+ 013045 KO INDEX K 0 -30 8 K 0 3
+ 013046 MAXIMUM BUOYANCY K 0 -30 8 K 0 3
+ 013047 MODIFIED SHOWALTER STABILITY INDEX K 0 -60 6 C 0 2
+ 013048 WATER FRACTION % 1 0 10 % 1 4
+ 013051 FREQUENCY GROUP, PRECIPITATION CODE TABLE 13051 0 0 4 CODE TABLE 13051 0 2
+ 013052 HIGHEST DAILY AMOUNT OF PRECIPITATION KG/M**2 1 -1 14 KG/M**2 1 5
+ 013055 INTENSITY OF PRECIPITATION KG/(M**2)S 4 0 8 MM H-1 1 3
+ 013056 CHARACTER AND INTENSITY OF PRECIPITATION CODE TABLE 13056 0 0 4 CODE TABLE 13056 0 2
+ 013057 TIME OF BEGINNING OR END OF PRECIPITATION CODE TABLE 13057 0 0 4 CODE TABLE 13057 0 2
+ 013058 SIZE OF PRECIPITATING ELEMENT M 4 0 7 MM 1 3
+ 013059 NUMBER OF FLASHES (THUNDERSTORM) NUMERIC 0 0 7 NUMERIC 0 3
+ 013060 TOTAL ACCUMULATED PRECIPITATION KG/M**2 1 -1 17 KG/M**2 1 5
+ 013071 UPSTREAM WATER LEVEL M 2 0 14 M 2 5
+ 013072 DOWNSTREAM WATER LEVEL M 2 0 14 M 2 4
+ 013073 MAXIMUM WATER LEVEL M 2 0 14 M 2 4
+ 013080 WATER PH pH 1 0 10 pH 1 3
+ 013081 WATER CONDUCTIVITY S M-1 3 0 14 S M-1 3 4
+ 013082 WATER TEMPERATURE K 1 0 12 K 1 4
+ 013083 DISSOLVED OXYGEN KG/M**3 6 0 15 KG/M**3 6 5
+ 013084 TURBIDITY LUMEN 0 0 14 LUMEN 0 4
+ 013085 OXYDATION REDUCTION POTENTIAL (ORP) V 3 0 14 V 3 4
+ 013090 RADIOMETER WATER VAPOUR CONTENT KG/M**2 1 0 10 KG/M**2 1 4
+ 013091 RADIOMETER LIQUID CONTENT KG/M**2 2 0 8 KG/M**2 2 3
+ 013093 CLOUD OPTICAL THICKNESS NUMERIC 0 0 8 NUMERIC 0 3
+ 013095 TOTAL COLUMN WATER VAPOUR KG/M**2 4 0 19 KG/M**2 4 6
+ 013096 MWR WATER VAPOUR CONTENT KG/M**2 2 0 14 KG/M**2 2 4
+ 013097 MWR LIQUID WATER CONTENT KG/M**2 2 0 14 KG/M**2 2 4
+ 013098 INTEGRATED WATER VAPOUR DENSITY KG/M**2 8 0 30 KG/M**2 8 10
+ 013155 INTENSITY OF PRECIPITATION (HIGH ACCURACY) KG/M**2S 5 -1 16 MM/HOUR 1 5
+ 013192 RELATIVE HUMIDITY AT 2 M % 0 0 8
+ 013193 RELATIVE HUMIDITY % 0 0 8
+ 013194 TOTAL COLUMN WATER KG/M**2 2 0 11
+ 013195 RAIN RATE KG/M**2HOUR 0 0 5
+ 013196 ANTECEDENT PRECIPITATION INDEX KG/M**2 0 0 7
+ 013197 TOTAL COLUMN WATER VAPOUR KG/M**2 1 0 10
+ 013198 RAIN FLAG CODE TABLE 13198 0 0 3
+ 013199 SPECIFIC HUMIDITY AT 2 M KG/KG 5 0 14
+ 013201 CLOUD LIQUID WATER KG/KG 7 0 14
+ 013202 TYPE OF SURFACE CODE TABLE 13202 0 0 8
+ 013203 1D VAR ESTIMATE OF RAIN RATE KG/M**2*HOUR 2 0 12
+ 013204 SSMI INDEPENDENT ESTIMATE OF RAIN RATE KG/M**2*HOUR 2 0 12
+ 013205 CLOUD LIQUID WATER PATH KG/M**2 4 0 14
+ 013206 TOTAL PRECIPITATION ICE CONTENT KG/M**2 6 0 14
+ 013207 TOTAL CLOUD LIQUID WATER KG/M**2 6 0 14
+ 013208 SURFACE RAIN RATE ( INSTANTANEOUS ) KG/M**2*S 5 0 17
+ 013209 RAIN POSSIBILITY NUMERIC 0 -256 9
+ 013210 1D VAR CLOUD LIQUID WATER PATH RETRIEVED ERROR(S) KG/M**2 4 0 14
+ 013211 TOTAL PRECIPITABLE WATER INDIPENDENT ESTIMATE OF ERROR(S) KG/M**2 2 0 11
+ 013212 CLOUD LIQUID WATER PATH INDIPENDENT ESTIMATE OF ERROR(S) KG/M**2 4 0 14
+ 013230 CONVECTIVE PRECIPITATION KG/M**2 1 -1 14
+ 013231 LARGE SCALE PRECIPITATION KG/M**2 1 -1 14
+ 013240 AIR DENSITY KG/M**3 3 0 10
+ 013241 CONVECTIVE AVAILABLE POTENTIAL ENERGY J/KG 1 0 17
+ 014001 LONG-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -65536 17 J/M**2 -3 5
+ 014002 LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -65536 17 J/M**2 -3 5
+ 014003 SHORT-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -65536 17 J/M**2 -3 5
+ 014004 SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -65536 17 J/M**2 -3 5
+ 014011 NET LONG-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -65536 17 J/M**2 -3 5
+ 014012 NET LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -65536 17 J/M**2 -3 5
+ 014013 NET SHORT-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -65536 17 J/M**2 -3 5
+ 014014 NET SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -65536 17 J/M**2 -3 5
+ 014015 NET RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 -16384 15 J/M**2 -4 5
+ 014016 NET RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 -16384 15 J/M**2 -4 5
+ 014017 INSTANTANEOUS LONG-WAVE RADIATION (SEE NOTE 6) W/M**2 0 -512 10 W/M**2 0 4
+ 014018 INSTANTANEOUS SHORT-WAVE RADIATION (SEE NOTE 6) W/M**2 0 -2048 12 W/M**2 0 4
+ 014019 SURFACE ALBEDO % 0 0 7 % 0 3
+ 014020 GLOBAL SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014021 GLOBAL SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014022 DIFFUSE SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014023 DIFFUSE SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014024 DIRECT SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014025 DIRECT SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014026 ALBEDO AT THE TOP OF CLOUDS % 0 0 7 % 0 3
+ 014027 ALBEDO % 0 0 7 % 0 3
+ 014028 GLOBAL SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S J/M**2 -2 0 20 J/M**2 -2 6
+ 014029 DIFFUSE SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD J/M**2 -2 0 20 J/M**2 -2 6
+ 014030 DIRECT SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S J/M**2 -2 0 20 J/M**2 -2 6
+ 014031 TOTAL SUNSHINE MINUTE 0 0 11 MINUTE 0 4
+ 014032 TOTAL SUNSHINE HOUR 0 0 10 HOUR 0 4
+ 014033 TOTAL SUNSHINE % 0 0 9 % 0 3
+ 014034 SUNSHINE OVER PERIOD SPECIFIED MINUTE 0 0 11 MINUTE 0 4
+ 014035 SOLAR RADIATION FLUX W/M**2 1 0 14 W/M**2 1 5
+ 014042 BI-DIRECTIONAL REFLECTANCE % 0 0 7 % 0 3
+ 014044 CHANNEL RADIANCE (W/M**2)*(1/SR)*CM 7 -100000 22 WM-2SR-1CM 7 7
+ 014045 CHANNEL RADIANCE (W/M**2)*(1/SR)*CM 0 0 11 WM-2SR-1CM 0 4
+ 014046 SCALED IASI RADIANCE (W/M**2)*(1/SR)*M 0 -5000 16 (W/M**2)*(1/SR)*M 0 5
+ 014047 SCALED MEAN AVHRR RADIANCE (W/M**2)*(1/SR)*M 0 0 31 (W/M**2)*(1/SR)*M 0 10
+ 014048 SCALED STANDARD DEVIATION RADIANCE (W/M**2)*(1/SR)*M 0 0 31 (W/M**2)*(1/SR)*M 0 10
+ 014050 EMISSIVITY (SEE NOTE 5) % 1 0 10 % 1 4
+ 014051 DIRECT SOLAR RADIATION INTEGRATED OVER LAST HOUR J/M**2 -3 0 14 JM-2 -3 4
+ 014055 SOLAR ACTIVITY INDEX NUMERIC 0 -32768 16 NUMERIC 0 5
+ 014061 (VAL) INSTANTANEOUS LONG-WAVE RADIATION W/M**2 0 -512 10 W/M**2 0 4
+ 014062 (VAL) INSTANTANEOUS SHORT-WAVE RADIATION W/M**2 0 -2048 12 W/M**2 0 4
+ 015001 TOTAL OZONE DU 0 0 10 DU 0 4
+ 015002 AIR MASS (SLANT PATH AT 22 KM) NUMERIC 2 0 10 NUMERIC 2 3
+ 015003 MEASURED OZONE PARTIAL PRESSURE (SOUNDING) PA 4 0 9 NBAR 0 3
+ 015004 OZONE SOUNDING CORRECTION FACTOR NUMERIC 3 0 11 NUMERIC 3 4
+ 015005 OZONE P DU 0 0 10 DU 0 3
+ 015008 SIGNIFICAND OF VOLUMETRIC MIXING RATIO NUMERIC 0 0 10 NUMERIC 0 4
+ 015011 LOG 10 OF INTEGRATED ELECTRON DENSITY LOG (1/M2) 3 14000 13 LOG (M-2) 3 4
+ 015012 TOTAL ELECTRON COUNT PER SQUARE METER 1/M**2 -16 0 6 1/M**2 -16 2
+ 015015 MAXIMUM IMAGE SPECTRAL COMPONENT BEFORE NORMALIZATION NUMERIC 0 0 31 NUMERIC 0 10
+ 015020 INTEGRATED 03 DENSITY KG/M**2 8 0 21 KG/M**2 8 7
+ 015021 INTEGRATED MASS DENSITY KG/M**2 11 0 31 KG/M**2 11 10
+ 015024 OPTICAL DEPTH NUMERIC 4 0 24 NUMERIC 4 8
+ 015025 TYPE OF POLLUTANT CODE TABLE 15025 0 0 4 CODE TABLE 15025 0 2
+ 015026 CONCENTRATION OF POLLUTANT MOLMOL-1 9 0 9 MOLMOL-1 9 3
+ 015027 CONCENTRATION OF POLLUTANT KG/M3 9 0 10 KG/M3 9 4
+ 015030 AEROSOL CONTAMINATION INDEX NUMERIC 2 -1000 12 NUMERIC 2 4
+ 015031 ATMOSPHERIC PATH DELAY IN SATELLITE SIGNAL M 4 10000 15 M 4 5
+ 015032 ESTIMATED ERROR IN ATMOSPHERIC PATH DELAY M 4 0 10 M 4 4
+ 015033 DIFFERENCE IN PATH DELAYS FOR LIMB VIEWS AT EXTREMES OF SCAN M 5 -10000 15 M 5 5
+ 015034 ESTIMATED ERROR IN PATH DELAY DIFFERENCE M 5 0 14 M 5 5
+ 015035 COMPONENT OF ZENITH PATH DELAY DUE TO WATER VAPOUR M 4 0 14 M 4 5
+ 015036 ATMOSPHERIC REFRACTIVITY (SEE NOTE 5) N-UNITS 3 0 19 N-UNITS 3 6
+ 015037 BENDING ANGLE RADIANS 8 -100000 23 RADIANS 8 7
+ 015202 INTEGRATED ELECTRON DENSITY 1/M**2 3 13000 12
+ 015231 ATMOSPHERIC PATH DELAY IN SATELLITE SIGNAL M 4 0 15
+ 019001 TYPE OF SYNOPTIC FEATURE CODE TABLE 19001 0 0 6 CODE TABLE 19001 0 2
+ 019002 EFFECTIVE RADIUS OF FEATURE M -2 0 12 M -2 4
+ 019003 WIND SPEED THRESHOLD M/S 0 0 8 M/S 0 3
+ 019004 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD M -2 0 12 M -2 4
+ 019005 DIRECTION OF MOTION OF FEATURE DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 019006 SPEED OF MOTION OF FEATURE M/S 2 0 14 M/S 2 5
+ 019007 EFFECTIVE RADIUS OF FEATURE M -3 0 12 M -3 4
+ 019008 VERTICAL EXTENT OF CIRCULATION CODE TABLE 19008 0 0 3 CODE TABLE 19008 0 1
+ 019009 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD (LA M -3 0 12 M -3 4
+ 019010 METHOD FOR TRACKING THE CENTRE OF SYNOPTIC FEATURE CODE TABLE 19010 0 0 4 CODE TABLE 19010 0 2
+ 019100 TIME INTERVAL TO CALCULATE THE MOVEMENT OF THE TROPICAL CYCLONE CODE TABLE 19100 0 0 4 CODE TABLE 19100 0 2
+ 019101 ACCURACY OF THE POSITION OF THE CENTRE OF THE TROPICAL CYCLONE CODE TABLE 19101 0 0 4 CODE TABLE 19101 0 2
+ 019102 SHAPE AND DEFINITION OF THE EYE OF THE TROPICAL CYCLONE CODE TABLE 19102 0 0 3 CODE TABLE 19102 0 1
+ 019103 DIAMETER OF MAJOR AXIS OF THE EYE OF THE TROPICAL CYCLONE CODE TABLE 19103 0 0 4 CODE TABLE 19103 0 2
+ 019104 CHANGE IN CHARACTER OF THE EYE DURING THE 30 MINUTES CODE TABLE 19104 0 0 4 CODE TABLE 19104 0 2
+ 019105 DISTANCE BETWEEN THE END OF SPIRAL BAND AND THE CENTRE CODE TABLE 19105 0 0 4 CODE TABLE 19105 0 2
+ 019106 IDENTIFICATION NUMBER OF TROPICAL CYCLONE NUMERIC 0 0 7 NUMERIC 0 3
+ 019107 TIME INTERVAL OF THE TROPICAL CYCLONE ANALYSIS CODE TABLE 19107 0 0 4 CODE TABLE 19107 0 2
+ 019108 ACCURACY OF GEOGRAPHICAL POSITION OF THE TROPICAL CYCLONE CODE TABLE 19108 0 0 3 CODE TABLE 19108 0 1
+ 019109 MEAN DIAMETER OF THE OVERCAST CLOUD OF THE TROPICAL CYCLONE CODE TABLE 19109 0 0 4 CODE TABLE 19109 0 2
+ 019110 APPARENT 24-HOUR CHANGE IN INTENSITY OF TROPICAL CYCLONE CODE TABLE 19110 0 0 4 CODE TABLE 19110 0 2
+ 019111 CURRENT INTENSITY (CI) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019112 DATA TROPICAL (DT) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019113 CLOUD PATTERN TYPE OF THE DT- NUMBER CODE TABLE 19113 0 0 4 CODE TABLE 19113 0 2
+ 019114 MODEL EXPECTED TROPICAL (MET) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019115 TREND OF PAST 24-HOUR CHANGE (+: DEVELOPED, -: WEAKENED) NUMERIC 1 -30 6 NUMERIC 1 2
+ 019116 PATTERN TROPICAL (PT) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019117 CLOUD PICTURE TYPE OF THE PT- NUMBER CODE TABLE 19117 0 0 3 CODE TABLE 19117 0 1
+ 019118 FINAL TROPICAL (T) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019119 TYPE OF THE FINAL T-NUMBER CODE TABLE 19119 0 0 3 CODE TABLE 19119 0 1
+ 019150 TYPHOON INTERNATIONAL COMMON NUMBER (TYPHOON COMMITTEE) CCITTIA5 0 0 32 CHARACTER 0 4
+ 020001 HORIZONTAL VISIBILITY M -1 0 13 M -1 4
+ 020002 VERTICAL VISIBILITY M -1 0 7 M -1 3
+ 020003 PRESENT WEATHER (SEE NOTE 1) CODE TABLE 20003 0 0 9 CODE TABLE 20003 0 3
+ 020004 PAST WEATHER (1) (SEE NOTE 2) CODE TABLE 20004 0 0 5 CODE TABLE 20004 0 2
+ 020005 PAST WEATHER (2) (SEE NOTE 2) CODE TABLE 20005 0 0 5 CODE TABLE 20005 0 2
+ 020006 FLIGHT RULES CODE TABLE 20006 0 0 3 CODE TABLE 20006 0 1
+ 020008 CLOUD DISTRIBUTION FOR AVIATION CODE TABLE 20008 0 0 5 CODE TABLE 20008 0 2
+ 020009 GENERAL WEATHER INDICATOR (TAF/METAR) CODE TABLE 20009 0 0 4 CODE TABLE 20009 0 2
+ 020010 CLOUD COVER (TOTAL) % 0 0 7 % 0 3
+ 020011 CLOUD AMOUNT CODE TABLE 20011 0 0 4 CODE TABLE 20011 0 2
+ 020012 CLOUD TYPE CODE TABLE 20012 0 0 6 CODE TABLE 20012 0 2
+ 020013 HEIGHT OF BASE OF CLOUD M -1 -40 11 M -1 4
+ 020014 HEIGHT OF TOP OF CLOUD M -1 -40 11 M -1 4
+ 020015 PRESSURE AT BASE OF CLOUD PA -1 0 14 PA -1 5
+ 020016 PRESSURE AT TOP OF CLOUD PA -1 0 14 PA -1 5
+ 020017 CLOUD TOP DESCRIPTION CODE TABLE 20017 0 0 4 CODE TABLE 20017 0 2
+ 020018 TENDENCY OF RUNWAY VISUAL RANGE CODE TABLE 20018 0 0 2 CODE TABLE 20018 0 1
+ 020019 SIGNIFICANT PRESENT OR FORECAST WEATHER CCITTIA5 0 0 72 CHARACTER 0 9
+ 020020 SIGNIFICANT RECENT WEATHER PHENOMENA CCITTIA5 0 0 32 CHARACTER 0 4
+ 020021 TYPE OF PRECIPITATION FLAG TABLE 20021 0 0 30 FLAG TABLE 20021 0 10
+ 020022 CHARACTER OF PRECIPITATION CODE TABLE 20022 0 0 4 CODE TABLE 20022 0 2
+ 020023 OTHER WEATHER PHENOMENA FLAG TABLE 20023 0 0 18 FLAG TABLE 20023 0 6
+ 020024 INTENSITY OF PHENOMENA CODE TABLE 20024 0 0 3 CODE TABLE 20024 0 1
+ 020025 OBSCURATION FLAG TABLE 20025 0 0 21 FLAG TABLE 20025 0 7
+ 020026 CHARACTER OF OBSCURATION CODE TABLE 20026 0 0 4 CODE TABLE 20026 0 2
+ 020027 PHENOMENA OCCURRENCE FLAG TABLE 20027 0 0 9 FLAG TABLE 20027 0 3
+ 020028 EXPECTED CHANGE IN INTENSITY CODE TABLE 20028 0 0 3 CODE TABLE 20028 0 1
+ 020029 RAIN FLAG CODE TABLE 20029 0 0 2 CODE TABLE 20029 0 1
+ 020031 ICE DEPOSIT (THICKNESS) M 2 0 7 M 2 3
+ 020032 RATE OF ICE ACCRETION CODE TABLE 20032 0 0 3 CODE TABLE 20032 0 1
+ 020033 CAUSE OF ICE ACCRETION FLAG TABLE 20033 0 0 4 FLAG TABLE 20033 0 2
+ 020034 SEA ICE CONCENTRATION CODE TABLE 20034 0 0 5 CODE TABLE 20034 0 2
+ 020035 AMOUNT AND TYPE OF ICE CODE TABLE 20035 0 0 4 CODE TABLE 20035 0 2
+ 020036 ICE SITUATION CODE TABLE 20036 0 0 5 CODE TABLE 20036 0 2
+ 020037 ICE DEVELOPMENT CODE TABLE 20037 0 0 5 CODE TABLE 20037 0 2
+ 020038 BEARING OF ICE EDGE (SEE NOTE 3) DEGREE TRUE 0 0 12 DEGREE TRUE 0 3
+ 020039 ICE DISTANCE M -1 0 13 M -1 4
+ 020040 EVOLUTION OF DRIFT OF SNOW CODE TABLE 20040 0 0 4 CODE TABLE 20040 0 2
+ 020041 AIRFRAME ICING CODE TABLE 20041 0 0 4 CODE TABLE 20041 0 2
+ 020042 AIRFRAME ICING PRESENT CODE TABLE 20042 0 0 2 CODE TABLE 20042 0 1
+ 020043 PEAK LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2
+ 020044 AVERAGE LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2
+ 020045 SUPERCOOLED LARGE DROPLET (SLD) CONDITIONS CODE TABLE 20045 0 0 2 CODE TABLE 20045 0 2
+ 020048 EVOLUTION OF FEATURE CODE TABLE 20048 0 0 4 CODE TABLE 20048 2 2
+ 020050 CLOUD INDEX CODE TABLE 20050 0 0 8 CODE TABLE 20050 0 3
+ 020051 AMOUNT OF LOW CLOUDS % 0 0 7 % 0 3
+ 020052 AMOUNT OF MIDDLE CLOUDS % 0 0 7 % 0 3
+ 020053 AMOUNT OF HIGH CLOUDS % 0 0 7 % 0 3
+ 020054 TRUE DIRECTION FROM WHICH CLOUDS ARE MOVING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 020055 STATE OF SKY IN TROPICS CODE TABLE 20055 0 0 4 CODE TABLE 20055 0 2
+ 020056 CLOUD PHASE CODE TABLE 20056 0 0 3 CODE TABLE 20056 0 1
+ 020058 VISIBILITY SEAWARD FROM COASTA STATION M -1 0 13 M -1 4
+ 020059 MINIMUM HORIZONTAL VISIBILITY M -1 0 9 M -1 3
+ 020060 PREVAILING HORIZONTAL VISIBILITY M -1 0 10 M -1 4
+ 020061 RUNWAY VISUAL RANGE (RVR) M 0 0 12 M 0 4
+ 020062 STATE OF THE GROUND (WITH OR WITHOUT SNOW) CODE TABLE 20062 0 0 5 CODE TABLE 20062 0 2
+ 020063 SPECIAL PHENOMENA CODE TABLE 20063 0 0 10 CODE TABLE 20063 0 4
+ 020065 SNOW COVER (SEE NOTE 4) % 0 0 7 % 0 3
+ 020066 MAXIMUM DIAMETER OF HAILSTONES M 3 0 8 M 3 3
+ 020067 DIAMETER OF DEPOSIT M 3 0 9 M 3 3
+ 020070 MINIMUM NUMBER OF ATMOSPHERICS NUMERIC 0 0 7 NUMERIC 0 3
+ 020071 ACCURACY OF FIX AND RATE OF ATMOSPHERICS CODE TABLE 20071 0 0 4 CODE TABLE 20071 0 2
+ 020081 CLOUD AMOUNT IN SEGMENT % 0 0 7 % 0 3
+ 020082 AMOUNT SEGMENT CLOUD FREE % 0 0 7 % 0 3
+ 020083 AMOUNT OF SEGMENT COVERED BY SCENE % 0 0 7 % 0 3
+ 020085 GENERAL CONDITION OF RUNWAY CODE TABLE 20085 0 0 4 CODE TABLE 20085 0 1
+ 020086 RANWAY DEPOSITS CODE TABLE 20086 0 0 4 CODE TABLE 20086 0 1
+ 020087 RUNWAY CONTAMINATION CODE TABLE 20087 0 0 4 CODE TABLE 20087 0 1
+ 020088 DEPTH OF RANWAY DEPOSITS M 3 0 12 M 3 4
+ 020089 RUNWAY FRICTION COEFICIENT CODE TABLE 20089 0 0 7 CODE TABLE 20089 0 2
+ 020090 SPECIAL CLOUDS CODE TABLE 20090 0 0 4 CODE TABLE 20090 0 2
+ 020091 VERTICAL VISIBILITY FOOT -2 0 10 FEET -2 3
+ 020092 HEIGHT OF BASE OF CLOUD FOOT -2 0 10 FEET -2 3
+ 020095 ICE PROBABILITY NUMERIC 3 0 10 NUMERIC 3 4
+ 020096 ICE AGE ("A" PARAMETER) dB 2 -4096 13 dB 2 4
+ 020101 LOCUST (ACRIDIAN) NAME CODE TABLE 20101 0 0 4 CODE TABLE 20101 0 2
+ 020102 LOCUST (MATURITY) COLOR CODE TABLE 20102 0 0 4 CODE TABLE 20102 0 2
+ 020103 STAGE OF DEVELOPMENT OF LOCUSTS CODE TABLE 20103 0 0 4 CODE TABLE 20103 0 2
+ 020104 ORGANIZATION STATE OF SWARM OR BAND OF LOCUSTS CODE TABLE 20104 0 0 4 CODE TABLE 20104 0 2
+ 020105 SIZE OF SWARM OR BAND OF LOCUSTS AND DURATION OF PASSAGE OF SWARMCODE TABLE 20105 0 0 4 CODE TABLE 20105 0 2
+ 020106 LOCUST POPULATION DENSITY CODE TABLE 20106 0 0 4 CODE TABLE 20106 0 2
+ 020107 DIRECTION OF MOVEMENTS OF LOCUST SWARM CODE TABLE 20107 0 0 4 CODE TABLE 20107 0 2
+ 020108 EXTENT OF VEGETATION CODE TABLE 20108 0 0 4 CODE TABLE 20108 0 2
+ 020192 SPECIAL PHENOMENA CODE TABLE 020192 0 0 14
+ 020193 CLOUD AMOUNT IN SEGMENT % 0 0 7 % 0 3
+ 020194 AMOUNT OF SEGMENT CLOUD FREE % 0 0 7 % 0 3
+ 020215 PRESSURE AT THE BASE OF CLOUD PA -1 0 14 PA -1 5
+ 020249 SEA-ICE FRACTION NUMERIC 2 0 7 NUMERIC 2 3
+ 020250 CALCULATED SURFACE TYPE CODE TABLE 20250 0 0 5
+ 020251 ICE AGE CODE TABLE 20251 0 0 3
+ 020252 ICE EDGE CODE TABLE 20252 0 0 3
+ 020253 SURFACE TYPE CODE TABLE 20253 0 0 3
+ 020254 ICE CONCENTRATION % 0 0 7
+ 021001 HORIZONTAL REFLECTIVITY dB 0 -64 7 dB 0 3
+ 021002 VERTICAL REFLECTIVITY dB 0 -64 7 dB 0 3
+ 021003 DIFFERENTIAL REFLECTIVITY dB 1 -5 7 dB 1 3
+ 021005 LINEAR DEPOLARISATION RATIO dB 0 -65 6 dB 0 2
+ 021006 CIRCULAR DEPOLARISATION RATIO dB 0 -65 6 dB 0 2
+ 021011 DOPPLER MEAN VELOCITY IN X-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021012 DOPPLER MEAN VELOCITY IN Y-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021013 DOPPLER MEAN VELOCITY IN Z-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021014 DOPPLER MEAN VELOCITY (RADIAL) M/S 1 -4096 13 M/S 1 4
+ 021017 DOPPLER VELOCITY SPECTRAL WIDTH M/S 1 0 8 M/S 1 3
+ 021021 ECHO TOPS M -3 0 4 M -3 2
+ 021030 SIGNAL TO NOISE RATIO dB 0 -32 8 dB 0 3
+ 021031 VERTICALLY INTEGRATED LIQUID-WATER CONTENT KG/M**2 0 0 7 KG/M**2 0 3
+ 021036 RADAR RAINFALL INTENSITY M/S 7 0 12 M/S 7 4
+ 021041 BRIGHT-BAND HEIGHT M -2 0 8 M -2 3
+ 021051 SIGNAL POWER ABOVE 1 MW dB 0 -256 8 dB 0 3
+ 021062 BACKSCATTER dB 2 -5000 13 dB 2 4
+ 021063 RADIOMETRIC RESOLUTION (NOISE VALUE) % 1 0 10 % 1 4
+ 021064 CLUTTER NOISE ESTIMATE NUMERIC 0 0 8 NUMERIC 0 3
+ 021065 MISSING PACKET COUNTER NUMERIC 0 -127 8 NUMERIC 0 3
+ 021066 WAVE SCATTEROMETER PRODUCT CONFIDENCE DATA FLAG TABLE 21066 0 0 12 FLAG TABLE 21066 0 4
+ 021067 WIND PRODUCT CONFIDENCE DATA FLAG TABLE 21067 0 0 13 FLAG TABLE 21067 0 5
+ 021068 RADAR ALTIMETER PRODUCT CONFIDENCE DATA FLAG TABLE 21068 0 0 8 FLAG TABLE 21068 0 3
+ 021069 SST PRODUCT CONFIDENCE DATA FLAG TABLE 21069 0 0 10 FLAG TABLE 21069 0 4
+ 021070 SST PRODUCT CONFIDENCE DATA (SADIST-2) FLAG TABLE 21070 0 0 23 FLAG TABLE 21070 0 6
+ 021071 PEAKINESS NUMERIC 0 0 16 NUMERIC 0 5
+ 021072 SATELLITE ALTIMETER CALIBRATION STATUS FLAG TABLE 21072 0 0 4 FLAG TABLE 21072 0 2
+ 021073 SATELLLITE ALTIMETER INSTRUMENT MODE FLAG TABLE 21073 0 0 9 FLAG TABLE 21073 0 3
+ 021075 IMAGE SPECTRUM INTENSITY NUMERIC 0 0 8 NUMERIC 0 3
+ 021076 REPRESENTATION OF INTENSITIES CODE TABLE 21076 0 0 3 CODE TABLE 21076 0 1
+ 021077 ALTITUDE CORRECTION (IONOSPHERE) M 3 0 14 M 3 5
+ 021078 ALTITUDE CORRECTION (DRY TROPOSPHERE) M 3 0 9 M 3 3
+ 021079 ALTITUDE CORRECTION (WET TROPOSPHERE) M 3 2000 10 M 3 4
+ 021080 ALTITUDE CORRECTION (CALIBRATION CONSTANT) M 3 0 11 M 3 4
+ 021081 OPEN LOOP CORRECTION (HEIGHT-TIME LOOP) M 3 0 10 M 3 4
+ 021082 OPEN LOOP CORRECTION (AUTO GAIN CONTROL) dB 3 -3000 14 dB 3 5
+ 021083 WARM TARGET CALIBRATION NUMERIC 0 0 16 NUMERIC 0 5
+ 021084 COLD TARGET CALIBRATION NUMERIC 0 0 16 NUMERIC 0 5
+ 021085 ATSR SEA SURFACE TEMPERATURE ACROSS- TRACK BAND NUMBER NUMERIC 0 0 4 NUMERIC 0 2
+ 021086 NUMBER OF PIXELS IN NADIR ONLY, AVERAGE NUMERIC 0 0 9 NUMERIC 0 3
+ 021087 NUMBER OF PIXELS IN DUAL VIEW, AVERAGE NUMERIC 0 0 9 NUMERIC 0 3
+ 021088 WET BACKSCATTER dB 2 -5000 13 dB 2 4
+ 021091 RADAR SIGNAL DOPPLER SPECTRUM 0TH MOMENT dB 0 -100 8 dB 0 3
+ 021092 RASS SIGNAL DOPPLER SPECTRUM 0TH MOMENT, REFERRING TO RASS SIGNA dB 0 -100 8 dB 0 3
+ 021093 Ku BAND PEAKINESS NUMERIC 3 0 16 NUMERIC 0 5
+ 021094 S BAND PEAKINESS NUMERIC 3 0 16 NUMERIC 0 5
+ 021101 NUMBER OF VECTOR AMBIGUITIES NUMERIC 0 0 3 NUMERIC 0 1
+ 021102 INDEX OF SELECTED WIND VECTOR NUMERIC 0 0 3 NUMERIC 0 1
+ 021103 TOTAL NUMBER OF SIGMA-0 MEASUREMENTS NUMERIC 0 0 5 NUMERIC 0 2
+ 021104 LIKELIHOOD COMPUTED FOR SOLUTION NUMERIC 3 -30000 15 NUMERIC 3 5
+ 021105 NORMALIZED RADAR CROSS-SECTION dB 2 -10000 14 dB 2 5
+ 021106 KP VARIANCE COEFFICIENT (ALPHA) NUMERIC 3 0 14 NUMERIC 3 5
+ 021107 KP VARIANCE COEFFICIENT (BETA) NUMERIC 8 0 16 NUMERIC 8 5
+ 021109 SEAWINDS WIND VECTOR CELL QUALITY FLAG TABLE 21109 0 0 17 FLAG TABLE 21109 0 6
+ 021110 NUMBER OF INNER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021111 NUMBER OF OUTER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021112 NUMBER OF INNER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021113 NUMBER OF OUTER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021114 KP VARIANCE COEFFICENT (GAMMA) dB 3 -140000 18 dB 3 6
+ 021115 SEAWINDS SIGMA-0 QUALITY FLAG TABLE 21115 0 0 17 FLAG TABLE 21115 0 6
+ 021116 SEAWINDS SIGMA-0 MODE FLAG TABLE 21116 0 0 17 FLAG TABLE 21116 0 6
+ 021117 SIGMA-0 VARIANCE QUALITY CONTROL NUMERIC 2 0 16 NUMERIC 2 5
+ 021118 ATTENUATION CORRECTION ON SIGMA-0 dB 2 -10000 14 dB 2 5
+ 021119 WIND SCATTEROMETER GEOPHYSICAL MODEL FUNCTION CODE TABLE 21119 0 0 6 CODE TABLE 21119 0 2
+ 021120 PROBABILITY OF RAIN NUMERIC 3 0 10 NUMERIC 3 4
+ 021121 SEAWINDS NOF* RAIN INDEX NUMERIC 0 0 8 NUMERIC 0 3
+ 021122 ATTENUATION CORRECTION OF SIGMA-0 (FROM TB) dB 2 -10000 14 dB 2 5
+ 021123 SEAWINDS NORMALIZED RADAR CROSS SECTION dB 2 -30000 15 dB 2 5
+ 021128 NUMBER OF VALID POINTS PER SECOND USED TO DERIVE PREVIOUS PARAME NUMERIC 0 0 8 NUMERIC 0 3
+ 021130 SPECTRUM TOTAL ENERGY NUMERIC 6 0 28 NUMERIC 6 9
+ 021131 SPECTRUM MAX ENERGY NUMERIC 6 0 28 NUMERIC 6 9
+ 021132 DIRECTION OF SPECTRUM MAX ON HIGHER RESOLUTION GRID DEGREE 3 0 19 DEGREE 3 6
+ 021133 WAVE-LENGTH OF SPECTRUM MAX ON HIGHER RESOLUTION GRID M 3 0 29 M 3 9
+ 021134 RANGE RESOLUTION OF CRESS COVARIANCE SPECTRUM RAD/M 3 0 19 RAD/M 3 6
+ 021135 REAL PART OF CROSS SPECTRA POLAR GRID NUMBER OF BINS NUMERIC 3 -524288 20 NUMERIC 3 7
+ 021136 IMAGINARY PART OF CROSS SPECTRA POLAR GRID NUMBER OF BINS NUMERIC 3 -524288 20 NUMERIC 3 7
+ 021137 KU BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021138 STD KU BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021139 KU BAND NET INSTRUMENTAL CORRECTION FOR AGC dB 2 -2048 12 dB 2 4
+ 021140 S BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021141 STD S BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021142 S BAND NET INSTRUMENTAL CORRECTION FOR AGC dB 2 -1024 11 dB 2 4
+ 021143 KU BAND RAIN ATTENUATION dB 2 -1073741824 31 dB 2 10
+ 021144 ALTIMETER RAIN FLAG FLAG TABLE 21144 0 0 2 FLAG TABLE 21144 0 1
+ 021145 KU BAND AUTOMATIC GAIN CONTROL dB 2 0 13
+ 021146 RMS KU BAND AUTOMATIC GAIN CONTROL dB 2 0 8
+ 021147 NUMBER OF VALID POINTS FOR KU BAND AUTOMATIC GAIN CONTROL NUMERIC 0 0 5
+ 021150 BEAM COLLOCATION CODE TABLE 21150 0 0 2 CODE TABLE 21150 0 1
+ 021151 ESTIMATED ERROR IN SIGMA0 AT 40DEG INCIDENCE ANGLE dB 2 0 9 dB 2 3
+ 021152 SLOPE AT 40DEG INCIDENCE ANGLE dB/DEG 2 -80 7 dB/DEG 2 3
+ 021153 ESTIMATED ERROR IN SLOPE AT 40DEG INCIDENCE ANGLE dB/DEG 2 -40 6 dB/DEG 2 3
+ 021154 SOIL MOISTURE SENSITIVITY dB 2 0 12 dB 2 4
+ 021155 WIND VECTOR CELL QUALITY FLAG TABLE 21155 0 0 24 FLAG TABLE 21155 0 8
+ 021156 BACKSCATTER DISTANCE NUMERIC 1 -4096 13 NUMERIC 1 4
+ 021157 LOSS PER UNIT LENGTH OF ATMOSPHERE USED dB/M 10 0 22 dB/M 10 7
+ 021158 ASCAT kp ESTIMATE QUALITY CODE TABLE 21158 0 0 2 CODE TABLE 21158 0 1
+ 021159 ASCAT SIGMA-0 USABILITY CODE TABLE 21159 0 0 2 CODE TABLE 21159 0 1
+ 021160 ASCAT USE OF SYNTHETIC DATA NUMERIC 3 0 10 NUMERIC 3 4
+ 021161 ASCAT SYNTHETIC DATA QUALITY NUMERIC 3 0 10 NUMERIC 3 4
+ 021162 ASCAT SATELLITE ORBIT AND ATTITUDE QUALITY NUMERIC 3 0 10 NUMERIC 3 4
+ 021163 ASCAT SOLAR ARRAY REFLECTION CONTAMINATION NUMERIC 3 0 10 NUMERIC 3 4
+ 021164 ASCAT TELEMETRY PRESENCE AND QUALITY NUMERIC 3 0 10 NUMERIC 3 4
+ 021165 ASCAT EXTRAPOLATED REFERENCE FUNCTION PRESENCE NUMERIC 3 0 10 NUMERIC 3 4
+ 021166 LAND FRACTION NUMERIC 3 0 10 NUMERIC 3 4
+ 021169 ICE PRESENCE INDICATOR CODE TABLE 0 0 2
+ 021170 C BAND CORRECTED OCEAN BACKSCATTER COEFICIENT dB 2 -32768 16
+ 021171 RMS C BAND CORRECTED OCEAN BACKSCATTER COEFICIENT dB 2 -32768 16
+ 021172 C BAND NET INSTRUMENTAL CORRECTION FOR AGC dB 2 -2048 12
+ 021173 C BAND AUTOMATIC GAIN CONTROL dB 2 0 13
+ 021174 RMS C BAND AUTOMATIC GAIN CONTROL dB 2 0 9
+ 021175 NUMBER OF VALID POINTS FOR C BAND AUTOMATIC GAIN CONTROL NUMERIC 0 0 10
+ 021192 RADAR BACK SCATTER dB 2 -5000 13
+ 021193 NOISE FIGURE % 0 0 7
+ 021194 BACKGROUND NOISE LEVEL NUMERIC 0 0 8
+ 021195 MISSING PACKET COUNTER NUMERIC 0 -127 8
+ 021196 UWA PRODUCT CONFIDENCE FLAG TABLE 21196 0 0 12
+ 021197 UWI PRODUCT CONFIDENCE FLAG TABLE 21197 0 0 12
+ 021198 URA PRODUCT CONFIDENCE FLAG TABLE 21198 0 0 8
+ 021199 UAT PRODUCT CONFIDENCE FLAG TABLE 21199 0 0 7
+ 021200 MWI PRODUCT CONFIDENCE FLAG TABLE 21200 0 0 15
+ 021201 PEAKINESS NUMERIC 0 0 16
+ 021202 ALTIMETER CALIBRATION STATUS FLAG TABLE 21202 0 0 4
+ 021203 ALTIMETER INSTRUMENT MODE FLAG TABLE 21203 0 0 9
+ 021204 MULTI/SINGLE VIEW DIFFERENCE K 2 -512 10
+ 021205 SPECTRAL INTENSITY NUMERIC 0 0 8
+ 021206 REPRESENTATION OF INTENSITY CODE TABLE 21206 0 0 3
+ 021207 ALTITUDE CORRECTION (IONOSPHERE) M 3 0 14
+ 021208 ALTITUDE CORRECTION (DRY TROPOSPHERE) M 3 0 9
+ 021209 LTITUDE CORRECTION (WET TROPOSPHERE) M 3 2000 10
+ 021210 ALTITUDE CORRECTION (CALIBRATION CONSTANT) M 3 0 11
+ 021211 OPEN LOOP CORRECTION (HTL) M 3 0 10
+ 021212 OPEN LOOP CORRECTION (AGC) dB 3 -3000 14
+ 021213 AMBIGUITY REMOVAL CONFIDENCE % 0 0 7
+ 021214 UAT QUALITY SUMMARY CODE TABLE 21214 0 0 3
+ 021215 UAT ACROSS-TRACK BAND NO. NUMERIC 0 0 4
+ 021222 DOPPLER SPECTRUM 0 TH MOMENT (AMPLITUDE) dB 0 0 7
+ 021225 PRESCAT PRODUCT CONFIDENCE FLAG TABLE 21225 0 0 6
+ 021226 BACKSCATER DISTANCE NUMERIC 1 -4096 13
+ 021227 GLARE ANGLE CODE TABLE 21227 0 6 6
+ 021230 NUMBER OF VECTOR AMBIGUITIES NUMERIC 0 0 3
+ 021231 INDEX OF SELECTED WIND VECTOR NUMERIC 0 0 3
+ 021232 TOTAL NMBER OF SIGMA-0 MEASUREMENTS NUMERIC 0 0 5
+ 021233 NUMBER OF SIGMA-0 USABLE FOR WIND NUMERIC 0 0 5
+ 021234 LIKELIHOOD COMPUTED FOR SOLUTION NUMERIC 1 -10000 14
+ 021235 WIND VECTOR CELL QUALITY FLAG FLAG TABLE 21235 0 0 3
+ 021236 NUMBER OF FORE-BEAM SIGMA-0 NUMERIC 1 0 6
+ 021237 NUMBER OF MID-BEAM V-POL SIGMA-0 NUMERIC 1 0 6
+ 021238 NUMBER OF MID-BEAM H-POL SIGMA-0 NUMERIC 1 0 6
+ 021239 NUMBER OF AFT-BEAM SIGMA-0 NUMERIC 1 0 6
+ 021240 NORMALIZED RADAR CROSS SECTION NUMERIC 2 -10000 14
+ 021241 Kp VARIANCE COEFFICIENT (ALPHA) NUMERIC 5 0 14
+ 021242 Kp VARIANCE COEFFICIENT (BETHA) NUMERIC 6 0 16
+ 021243 Kp VARIANCE COEFFICIENT (GAMMA) NUMERIC 6 0 16
+ 021244 SIGMA-0 QUALITY FLAG FLAG TABLE 21244 0 0 15
+ 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022002 DIRECTION OF WIND WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022003 DIRECTION OF SWELL WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022004 DIRECTION OF CURRENT DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022005 DIRECTION OF SEA SURFACE CURRENT DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022011 PERIOD OF WAVES S 0 0 6 S 0 2
+ 022012 PERIOD OF WIND WAVES S 0 0 6 S 0 2
+ 022013 PERIOD OF SWELL WAVES S 0 0 6 S 0 2
+ 022021 HEIGHT OF WAVES M 1 0 10 M 1 4
+ 022022 HEIGHT OF WIND WAVES M 1 0 10 M 1 4
+ 022023 HEIGHT OF SWELL WAVES M 1 0 10 M 1 4
+ 022025 STANDARD DEVIATION WAVE HEIGHT M 2 0 10 M 2 4
+ 022026 STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT M 2 0 10 M 2 4
+ 022031 SPEED OF CURRENT M/S 2 0 13 M/S 2 4
+ 022032 SPEED OF SEA SURFACE CURRENT M/S 2 0 13 M/S 2 4
+ 022035 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 2 0 14 M 2 4
+ 022036 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 2 0 14 M 2 4
+ 022037 TIDAL ELEVATION WITH RESPECT TO NATIONAL LAND DATUM M 3 -10000 15 M 3 5
+ 022038 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 3 -10000 15 M 3 5
+ 022039 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 3 -5000 12 M 3 4
+ 022040 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 3 -5000 14 M 3 5
+ 022041 SEA-SURFACE TEMPERATURE (15-DAY RUNNING MEAN) K 1 0 12 K 1 4
+ 022042 SEA/WATER TEMPERATURE K 1 0 12 K 1 4
+ 022043 SEA/WATER TEMPERATURE K 2 0 15 K 2 5
+ 022044 SOUND VELOCITY M/S 1 0 14 M/S 1 5
+ 022045 SEA/WATER TEMPERATURE K 3 0 19 K 3 6
+ 022046 SEA ICE FRACTION NUMERIC 2 0 7 NUMERIC 2 3
+ 022049 SEA SURFACE TEMPERATURE K 2 0 15 K 2 5
+ 022050 STANDARD DEVIATION SEA-SURFACE TEMPERATURE K 2 0 8 K 2 3
+ 022055 FLOAT CYCLE NUMBER NUMERIC 0 0 10 NUMERIC 0 3
+ 022056 DIRECTION OF PROFILE CODE TABLE 22056 0 0 2 CODE TABLE 22056 0 1
+ 022059 SEA SURFACE SALINITY PART PER THOUSAND 2 0 14 PART PER THOUSAND 2 5
+ 022060 LAGRANGIAN DRIFTER DROGUE STATUS CODE TABLE 22060 0 0 3 CODE TABLE 22060 0 1
+ 022061 STATE OF THE SEA CODE TABLE 22061 0 0 4 CODE TABLE 22061 0 2
+ 022062 SALINITY PART PER THOUSAND 2 0 14 PART PER THOUSAND 2 5
+ 022063 TOTAL WATER DEPTH M 0 0 14 M 0 5
+ 022064 SALINITY PART PER THOUSAND 3 0 17 PART PER THOUSAND 3 6
+ 022065 WATER PRESSURE PA -3 0 17 PA -3 6
+ 022066 WATER CONDUCTIVITY S M-1 6 0 26 S M-1 6 8
+ 022067 INSTRUMENT TYPE FOR WATER TEMPERATURE PROFILE MEASUREMENT CODE TABLE 22067 0 0 10 CODE TABLE 22067 0 4
+ 022068 WATER TEMPERATURE PROFILE RECORDER TYPES CODE TABLE 22068 0 0 7 CODE TABLE 22068 0 3
+ 022069 SPECTRAL WAVE DENSITY M2HZ-1 3 0 22 M2HZ-1 3 7
+ 022070 SIGNIFICANT WAVE HEIGHT M 2 0 13 M 2 4
+ 022071 SPECTRAL PEAK WAVE PERIOD S 1 0 9 S 1 3
+ 022072 SPECTRAL PEAK WAVE LENGTH M 0 0 13 M 0 4
+ 022073 MAXIMUM WAVE HEIGHT M 2 0 13 M 2 4
+ 022074 AVERAGE WAVE PERIOD S 1 0 9 S 1 3
+ 022075 AVERAGE WAVE LENGTH M 0 0 13 M 0 4
+ 022076 DIRECTION FROM WHICH DOMINANT WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022077 DIRECTIONAL SPREAD OF DOMINANT WAVE DEGREE 0 0 9 DEGREE 0 3
+ 022078 DURATION OF WAVE RECORD S 0 0 12 S 0 4
+ 022079 LENGTH OF WAVE RECORD M 0 0 16 M 0 5
+ 022080 WAVEBAND CENTRAL FREQUENCY Hz 3 0 10 Hz 3 4
+ 022081 WAVEBAND CENTRAL WAVE NUMBER 1/M 5 0 13 1/M 5 4
+ 022082 MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE DENSITY M**2S 2 0 20 M**2S 2 7
+ 022083 MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE NUMBER M**3 2 0 20 M**3 2 7
+ 022084 BAND CONTAINING MAXIMUM NON- DIRECTIONAL SPECTRAL WAVE DENSITY NUMERIC 0 0 7 NUMERIC 0 3
+ 022085 SPECTRAL WAVE DENSITY RATIO NUMERIC 0 0 7 NUMERIC 0 3
+ 022086 MEAN DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022087 PRINCIPAL DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022088 FIRST NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7 NUMERIC 2 3
+ 022089 SECOND NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7 NUMERIC 2 3
+ 022090 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S 2 0 20 M**2S 2 7
+ 022091 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**3 2 0 20 M**3 2 7
+ 022092 DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S/RAD 2 0 20 M**2S/RAD 2 7
+ 022093 DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**4 2 0 20 M**4 2 7
+ 022094 TOTAL NUMBER OF WAVE BANDS NUMERIC 0 0 7 NUMERIC 0 3
+ 022095 DIRECTIONAL SPREAD OF INDIVIDUAL WAVES DEGREE 0 0 8 DEGREE 0 3
+ 022096 SPECTRAL BAND WIDTH 1/S 3 0 4 1/S 3 2
+ 022097 MEAN WAVELENGTH > 731 M OF IMAGE SPECTRUM AT LOW WAVE NUMBERS M 0 0 14 M 0 5
+ 022098 WAVELENGTH SPREAD (WAVELENGTH > 731 M) AT LOW WAVE NUMBERS M 0 0 14 M 0 5
+ 022099 MEAN DIRECTION AT LOW WAVE NUMBERS (WAVELENGTH > 731 M) DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022100 DIRECTION SPREAD AT LOW WAVE NUMBERS(WAVELENGTH > 731 M) DEGREE 0 0 9 DEGREE 0 3
+ 022101 TOTAL ENERGY (WAVELENGTH > 731M) AT LOW WAVE NUMBERS NUMERIC 0 0 31 NUMERIC 0 10
+ 022120 TIDE STATION AUTOMATED WATER LEVEL CHECK CODE TABLE 22120 0 0 5 CODE TABLE 22120 0 2
+ 022121 TIDE STATION MANUAL WATER LEVEL CHECK CODE TABLE 22121 0 0 5 CODE TABLE 22121 0 2
+ 022122 TIDE STATION AUTOMATED METEOROLOGICAL DATA CHECK CODE TABLE 22122 0 0 5 CODE TABLE 22122 0 2
+ 022123 TIDE STATION MANUAL METEOROLOGICAL DATA CHECK CODE TABLE 22123 0 0 5 CODE TABLE 22123 0 2
+ 022141 SEA-SURFACE TEMPERATURE (15-DAY RUNNING MEAN) K 2 0 15 K 2 5
+ 022150 NUMBER OF 18 HZ VALID POINTS FOR KU BAND NUMERIC 0 0 10 NUMERIC 0 4
+ 022151 KU BAND OCEAN RANGE M 3 0 31 M 3 10
+ 022152 STD OF 18 HZ KU BAND OCEAN RANGE M 3 0 16 M 3 5
+ 022153 NUMBER OF 18 HZ VALID POINTS FOR S BAND NUMERIC 0 0 10 NUMERIC 0 4
+ 022154 S BAND OCEAN RANGE M 3 0 31 M 3 10
+ 022155 STD OF 18 HZ S BAND OCEAN RANGE M 3 0 16 M 3 5
+ 022156 KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022157 STD 18HZ KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022158 S BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022159 STD 18HZ S BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022160 NORMALIZED INVERSE WAVE AGE NUMERIC 6 0 21 NUMERIC 6 7
+ 022161 WAVE SPECTRA M**4 4 0 27 M**4 4 9
+ 022162 RMS OF 20Hz KU BAND OCEAN RANGE M 3 0 16
+ 022163 NUMBER OF 20Hz VALID POINTS FOR KU BAND NUMERIC 0 0 10
+ 022164 RMS 20Hz KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16
+ 022165 NUMBER OF 20Hz VALID POINTS FOR KU BAND SIGNIFICANT WAVE HEIGHT NUMERIC 0 0 10
+ 022166 KU BAND NET INSTRUMENTAL CORRECTION FOR SIGNIFICANT WAVE HEIGHT M 3 -1000 11
+ 022167 NUMBER OF VALID POINTS FOR KU BAND BACKSCATTER NUMERIC 0 0 10
+ 022168 C BAND OCEAN RANGE M 3 0 31
+ 022169 RMS OF C BAND OCEAN RANGE M 3 0 16
+ 022170 NUMBER OF 20Hz VALID POINTS FOR C BAND NUMERIC 0 0 10
+ 022171 C BAND SIGNIFICANT WAVE HEIGHT M 3 0 16
+ 022172 RMS 20Hz C BAND SIGNIFICANT WAVE HEIGHT M 3 0 16
+ 022173 NUMBER OF 20Hz VALID POINTS FOR C BAND NUMERIC 0 0 10
+ 022174 C BAND NET INSTRUMENTAL CORRECTION FOR SIGNIFICANT WAVE HEIGHT M 3 -1000 11
+ 022175 NUMBER OF VALID POINTS FOR C BAND BACKSCATTER NUMERIC 0 0 10
+ 022191 SPECTRAL DENSITY M**2*S/RAD 2 0 20
+ 022192 SPECTRAL PERIOD S 2 0 13
+ 022193 MEAN WAVENUMBER 1/M 5 0 15
+ 022194 PEAK WAVENUMBER 1/M 5 0 15
+ 022195 MEAN WAVE PROPAGATION DIRECTION DEGREE 1 0 13
+ 022196 PEAK WAVE PROPAGATION DIRECTION DEGREE 1 0 13
+ 022197 DIRECTION SPREAD DEGREE 1 0 13
+ 022198 VARIANCE SPECTRAL DENSITY M**2*S/RAD 4 0 18
+ 022199 CORRELATION COEFF OF SIMULATED FG AND OBSERVED SAR SPECTRUM NUMERIC 4 -10000 15
+ 022200 CORRELATION COEFF OF SIMULATED BF AND OBSERVED SAR SPECTRUM NUMERIC 4 -10000 15
+ 022201 CORRELATION COEFF OF OCEAN WAVE FG AND EXTRACTED WAVE SPECTRUM NUMERIC 4 -10000 15
+ 022202 ERROR BETWEEN FIRST GUESS AND OBSERVED SAR NUMERIC 5 0 21
+ 022203 ERROR BETWEEN SIMULATED AND OBSERVED SAR NUMERIC 5 0 21
+ 022204 MEAN PERIOD OF WAVES SECOND 2 0 13
+ 022205 SPECTRAL DENSITY M**2*S/RAD 4 0 25
+ 022206 PEAK PERIOD OF WAVES SECOND 2 0 13
+ 022207 MEAN WAVE PERIOD S 1 0 10
+ 022208 PEAK PERIOD OF 1D SPECTRA S 1 0 10
+ 022209 COEFICIENT OF DRAG WITH WAVES NUMERIC 6 0 13
+ 022210 MEAN SQUARE SLOPE OF WAVES NUMERIC 4 -10000 14
+ 022211 COEFICIENT OF DRAG WITH WAVES NUMERIC 6 0 17
+ 022243 STANDARD DEVIATION SIGNIFICANT WAVE HEIGHT M 2 0 10
+ 023001 ACCIDENT EARLY NOTIFICATION ARTICLE APPLICABLE CODE TABLE 23001 0 0 3 CODE TABLE 23001 0 1
+ 023002 ACTIVITY OR FACILITY INVOLVED IN INCIDENT CODE TABLE 23002 0 0 5 CODE TABLE 23002 0 2
+ 023003 TYPE OF RELEASE CODE TABLE 23003 0 0 3 CODE TABLE 23003 0 1
+ 023004 COUNTERMEASURES TAKEN NEAR BORDER CODE TABLE 23004 0 0 3 CODE TABLE 23004 0 1
+ 023005 CAUSE OF INCIDENT CODE TABLE 23005 0 0 2 CODE TABLE 23005 0 1
+ 023006 INCIDENT SITUATION CODE TABLE 23006 0 0 3 CODE TABLE 23006 0 1
+ 023007 CHARACTERISTICS OF RELEASE CODE TABLE 23007 0 0 3 CODE TABLE 23007 0 1
+ 023008 STATE OF CURRENT RELEASE CODE TABLE 23008 0 0 2 CODE TABLE 23008 0 1
+ 023009 STATE OF EXPECTED RELEASE CODE TABLE 23009 0 0 2 CODE TABLE 23009 0 1
+ 023016 POSSIBILITY OF SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT CODE TABLE 23016 0 0 2 CODE TABLE 23016 0 1
+ 023017 FLOW DISCHARGE OF MAJOR RECIPIENT M**3/S 6 0 20 M**3/S 6 7
+ 023018 RELEASE BEHAVIOUR OVER TIME CODE TABLE 23018 0 0 3 CODE TABLE 23018 0 1
+ 023019 ACTUAL RELEASE HEIGHT M 0 -15000 17 M 0 6
+ 023021 EFFECTIVE RELEASE HEIGHT M 0 -15000 17 M 0 6
+ 023022 DISTANCE OF RELEASE POINT OR SITE OF INCIDENT M 0 0 24 M 0 8
+ 023023 MAIN TRANSPORT SPEED IN THE ATMOSPHERE M/S 1 0 12 M/S 1 4
+ 023024 MAIN TRANSPORT SPEED IN WATER M/S 2 0 13 M/S 2 4
+ 023025 MAIN TRANSPORT SPEED IN GROUND WATER M/S 2 0 13 M/S 2 4
+ 023027 MAIN TRANSPORT DIRECTION IN THE ATMOSPHERE DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023028 MAIN TRANSPORT DIRECTION IN WATER DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023029 MAIN TRANSPORT DIRECTION IN GROUND WATER DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023031 POSSIBILITY THAT PLUME WILL ENCOUNTER PRECIPITATION IN STATE IN CODE TABLE 23031 0 0 2 CODE TABLE 23031 0 1
+ 023032 PLUME WILL ENCOUNTER CHANGE IN WIND DIRECTION AND/OR SPEED FLAG CODE TABLE 23032 0 0 2 CODE TABLE 23032 0 1
+ 024001 ESTIMATE OF AMOUNT OF RADIOACTIVITY RELEASED UP TO SPECIFIED TIM Bq -11 0 28 Bq -11 9
+ 024002 ESTIMATED MAXIMUM POTENTIAL RELEASE Bq -11 0 28 Bq -11 9
+ 024003 COMPOSITION OF RELEASE CODE TABLE 24003 0 0 5 CODE TABLE 24003 0 2
+ 024004 ELEMENT NAME CCITTIA5 0 0 16 CHARACTER 0 2
+ 024005 ISOTOPE MASS NUMERIC 0 0 9 NUMERIC 0 3
+ 024011 DOSE mSv 2 0 32 mSv 2 10
+ 024012 TRAJECTORY DOSE (DEFINED LOCATION AND EXPECTED TIME OF ARRIVAL) mSv 2 0 32 mSv 2 10
+ 024013 GAMMA DOSE IN AIR ALONG THE MAIN TRANSPORT PATH (DEFINED LOCATIO mSv 2 0 32 mSv 2 10
+ 024021 AIR CONCENTRATION (OF NAMED ISOTOPE TYPE INCLUDING GROSS BETA) Bq/M**3 2 0 32 Bq/M**3 2 10
+ 024022 CONCENTRATION IN PRECIPITATION (OF NAMES ISOTOPE TYPE) Bq/L 2 0 32 BQ L-1 2 10
+ 024023 PULSE RATE OF BETA RADIATION 1/S 1 0 14 1/S 1 4
+ 024024 PULSE RATE OF GAMMA RADIATION 1/S 1 0 14 1/S 1 4
+ 025001 RANGE-GATE LENGTH M -1 0 6 M -1 2
+ 025002 NUMBER OF GATES AVERAGED NUMERIC 0 0 4 NUMERIC 0 2
+ 025003 NUMBER OF INTEGRATED PULSES NUMERIC 0 0 8 NUMERIC 0 3
+ 025004 ECHO PROCESSING CODE TABLE 25004 0 0 2 CODE TABLE 25004 0 1
+ 025005 ECHO INTEGRATION CODE TABLE 25005 0 0 2 CODE TABLE 25005 0 1
+ 025006 Z TO R CONVERSION CODE TABLE 25006 0 0 3 CODE TABLE 25006 0 1
+ 025007 Z TO R CONVERSION FACTOR NUMERIC 0 0 12 NUMERIC 0 4
+ 025008 Z TO R CONVERSION EXPONENT NUMERIC 2 0 9 NUMERIC 2 3
+ 025009 CALIBRATION METHOD FLAG TABLE 25009 0 0 4 FLAG TABLE 25009 0 2
+ 025010 CLUTTER TREATMENT CODE TABLE 25010 0 0 4 CODE TABLE 25010 0 2
+ 025011 GROUND OCCULTATION CORRECTION (SCREENING) CODE TABLE 25011 0 0 2 CODE TABLE 25011 0 1
+ 025012 RANGE ATTENUATION CORRECTION CODE TABLE 25012 0 0 2 CODE TABLE 25012 0 1
+ 025013 BRIGHT-BAND CORRECTION FLAG TABLE 25013 0 0 2 FLAG TABLE 25013 0 1
+ 025014 AZIMUTH CLUTTER CUT-OFF (SEE NOTE 1) NUMERIC 0 0 12 NUMERIC 0 4
+ 025015 RADOME ATTENUATION CORRECTION FLAG TABLE 25015 0 0 2 FLAG TABLE 25015 0 1
+ 025016 CLEAR-AIR ATTENUATION CORRECTION dB/M 5 0 6 dB/M 5 2
+ 025017 PRECIPITATION ATTENUATION CORRECTION FLAG TABLE 25017 0 0 2 FLAG TABLE 25017 0 1
+ 025018 A TO Z LAW FOR ATTENUATION FACTOR NUMERIC 7 0 6 NUMERIC 7 2
+ 025019 A TO Z LAW FOR ATTENUATION EXPONENT NUMERIC 2 0 7 NUMERIC 2 3
+ 025020 MEAN SPEED ESTIMATION CODE TABLE 25020 0 0 2 CODE TABLE 25020 0 1
+ 025021 WIND COMPUTATION ENHANCEMENT FLAG TABLE 25021 0 0 8 FLAG TABLE 25021 0 3
+ 025022 GHRSS REJECTION FLAG FLAG TABLE 25022 0 0 9 FLAG TABLE 25022 0 3
+ 025023 GHRSS CONFIDENCE FLAG FLAG TABLE 25023 0 0 9 FLAG TABLE 25023 0 3
+ 025024 GHRSS DATA QUALITY CODE TABLE 25024 0 0 4 CODE TABLE 25024 0 2
+ 025025 BATTERY VOLTAGE V 1 0 9 V 1 3
+ 025026 BATTERY VOLTAGE (LARGE RANGE) V 1 0 12 V 1 4
+ 025028 OPERATOR OR MANUFACTURER DEFINED PARAMETER NUMERIC 1 -16384 15 NUMERIC 1 5
+ 025029 CALIBRATION METHOD FLAG TABLE 25029 0 0 6 FLAG TABLE 25029 0 2
+ 025030 RUNNING MEAN SEA-SURFACE TEMPERATURE USAGE CODE TABLE 25030 0 0 2 CODE TABLE 25030 0 1
+ 025032 WIND PROFILER MODE INFORMATION CODE TABLE 25032 0 0 2 CODE TABLE 25032 0 1
+ 025033 WIND PROFILER SUBMODE INFORMATION* CODE TABLE 25033 0 0 2 CODE TABLE 25033 0 1
+ 025034 WIND PROFILER QUALITY CONTROL TEST RESULTS* FLAG TABLE 25034 0 0 4 FLAG TABLE 25034 0 2
+ 025036 ATMOSPHERICS LOCATION METHOD CODE TABLE 25036 0 0 4 CODE TABLE 25036 0 2
+ 025037 SST BIAS K 2 -127 8 K 2 3
+ 025038 DIFFERENCE BETWEEN SST AND ANALYSIS K 1 -127 8 K 1 3
+ 025040 CO2 WIND PRODUCT DERIVATION CODE TABLE 25040 0 0 4 CODE TABLE 25040 0 2
+ 025041 MOVING PLATFORM DIRECTION REPORTING METHOD CODE TABLE 25041 0 0 2 CODE TABLE 25041 0 1
+ 025042 MOVING PLATFORM SPEED REPORTING METHOD CODE TABLE 25042 0 0 2 CODE TABLE 25042 0 1
+ 025043 WAVE SAMPLING INTERVAL (TIME) S 4 0 15 S 4 5
+ 025044 WAVE SAMPLING INTERVAL (SPACE) M 2 0 14 M 2 5
+ 025045 HIRS CHANNEL COMBINATION FLAG TABLE 25045 0 0 21 FLAG TABLE 25045 0 7
+ 025046 MSU CHANNEL COMBINATION FLAG TABLE 25046 0 0 5 FLAG TABLE 25046 0 2
+ 025047 SSU CHANNEL COMBINATION FLAG TABLE 25047 0 0 4 FLAG TABLE 25047 0 2
+ 025048 AMSU-A CHANNEL COMBINATION FLAG TABLE 25048 0 0 16 FLAG TABLE 25048 0 6
+ 025049 AMSU-B CHANNEL COMBINATION FLAG TABLE 25049 0 0 6 FLAG TABLE 25049 0 2
+ 025050 PRINCIPAL COMPONENT SCORE NUMERIC 4 -131072 18 NUMERIC 4 6 18 NUMERIC 4 6
+ 025051 AVHRR CHANNEL COMBINATION FLAG TABLE 25051 0 0 7 FLAG TABLE 25051 0 3
+ 025052 LOG-10 OF PRINCIPAL COMPONENTS NORMALIZED FIT TO DATA NUMERIC 4 0 15 NUMERIC 4 5
+ 025053 OBSERVATION QUALITY FLAG TABLE 25053 0 0 12 FLAG TABLE 25053 0 4
+ 025054 SSMIS SUBFRAME ID NEMBER NUMERIC 0 0 5 NUMERIC 0 2
+ 025055 MULTIPLEXER HOUSEKEEPING K 2 0 16 K 2 5
+ 025060 SOFTWARE IDENTIFICATION (SEE NOTE 2) NUMERIC 0 0 14 NUMERIC 0 5
+ 025061 SOFTWARE IDENTIFICATION AND VERSION NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 025062 DATABASE IDENTIFICATION NUMERIC 0 0 14 NUMERIC 0 5
+ 025065 ORIENTATION CORRECTION (AZIMUTH) DEGREE 2 -1000 11 DEGREE 2 4
+ 025066 ORIENTATION CORRECTION (ELEVATION) DEGREE 2 -1000 11 DEGREE 2 4
+ 025067 RADIOSONDE RELEASE POINT PRESSURE CORRECTION PA 0 -8000 14 PA 0 4
+ 025068 NUMBER OF ARCHIVE RECOMPUTES NUMERIC 0 0 7 NUMERIC 0 3
+ 025069 FLIGHT LEVEL PRESSURE CORRECTIONS FLAG TABLE 25069 0 0 8 FLAG TABLE 25069 0 3
+ 025070 MAJOR FRAME COUNT NUMERIC 0 0 4 NUMERIC 0 2
+ 025071 FRAME COUNT NUMERIC 0 0 5 NUMERIC 0 2
+ 025075 SATELLITE ANTENNA CORRECTIONS VERSION NUMBER NUMERIC 0 0 5 NUMERIC 0 2
+ 025076 LOG-10 OF (TEMPERATURE-RADIANCE CENTRAL WAVENUMBER) FOR ATOVS LOG (1/M) 8 0 30 LOG (1/M) 8 10
+ 025077 BANDWIDTH CORRECTION COEFFICIENT 1 FOR ATOVS NUMERIC 5 -100000 18 NUMERIC 5 7
+ 025078 BANDWIDTH CORRECTION COEFFICIENT 2 FOR ATOVS NUMERIC 5 0 17 NUMERIC 5 6
+ 025079 ALBEDO-RADIANCE SOLAR FILTERED IRRADIANCE FOR ATOVS W/M**2 4 0 24 W/M**2 4 8
+ 025080 ALBEDO-RADIANCE EQUIVALENT FILTER WIDTH FOR ATOVS M 10 0 14 M 10 5
+ 025081 INCIDENCE ANGLE DEGREE 3 0 17 DEGREE 3 6
+ 025082 AZIMUTH ANGLE DEGREE 3 0 19 DEGREE 3 6
+ 025083 FARADEY ROTATIONAL ANGLE DEGREE 3 0 19 DEGREE 3 6
+ 025084 GEOMETRIC ROTATIONAL ANGLE DEGREE 5 0 26 DEGREE 5 8
+ 025085 FRACTION OF CLEAR PIXELS IN HIRS FOV NUMERIC 0 0 7 NUMERIC 0 3
+ 025086 DEPTH CORRECTION INDICATOR CODE TABLE 25086 0 0 2 CODE TABLE 25086 0 1
+ 025090 ORBIT STATE FLAG CODE TABLE 25090 0 0 4 CODE TABLE 25090 0 2
+ 025091 STRUCTURE CONSTANT OF THE REFRACTION INDEX (CN2) dB 3 -18192 13 dB 3 5
+ 025092 ACOUSTIC PROPAGATION VELOCITY M/S 2 28000 14 M/S 2 5
+ 025093 RASS COMPUTATION CORRECTION FLAG TABLE 25093 0 0 8 FLAG TABLE 25093 0 3
+ 025095 ALTIMETER STATE FLAG FLAG TABLE 25095 0 0 2 FLAG TABLE 25095 0 1
+ 025096 RADIOMETER STATE FLAG FLAG TABLE 25096 0 0 5 FLAG TABLE 25096 0 2
+ 025097 THREE DIMENSIONAL ERROR ESTIMATE OF THE NAVIGATOR ORBIT CODE TABLE 25097 0 0 4 CODE TABLE 25097 0 2
+ 025098 ALTIMETER DATA QUALITY FLAG FLAG TABLE 25098 0 0 9 FLAG TABLE 25098 0 3
+ 025099 ALTIMETER CORRECTION QUALITY FLAG TABLE 25099 0 0 9 FLAG TABLE 25099 0 3
+ 025100 XBT/XCTD FALL RATE EQUATION COEFFICIENT A NUMERIC 5 0 20 NUMERIC 5 6
+ 025101 XBT/XCTD FALL RATE EQUATION COEFFICIENT B NUMERIC 5 -500000 21 NUMERIC 5 6
+ 025102 NUMBER OF MISSING LINES EXCLUDING DATA GAPS NUMERIC 0 0 8 NUMERIC 0 3
+ 025103 NUMBER OF DIRECTIONAL BINS NUMERIC 0 0 8 NUMERIC 0 3
+ 025104 NUMBER OF WAVE-LENGTH BINS NUMERIC 0 0 8 NUMERIC 0 3
+ 025105 FIRST DIRECTIONAL BIN DEGREES 3 0 19
+ 025106 DIRECTIONAL BIN STEP DEGREES 3 0 19
+ 025107 FIRST WAVE-LENGTH BIN M 3 0 29 M 3 9
+ 025108 LAST WAVE-LENGTH BIN M 3 0 29 M 3 9
+ 025110 IMAGE PROCESSING SUMMARY FLAG TABLE 25110 0 0 10
+ 025111 NUMBER OF INPUT DATA GAPS NUMERIC 0 0 8 NUMERIC 0 3
+ 025120 RA2-L2-PROCESSING FLAG CODE TABLE 25120 0 0 2 CODE TABLE 25120 0 1
+ 025121 RA2-L2-PROCESSING QUALITY % 0 0 7 % 0 3
+ 025122 HARDWARE CONFIGURATION FOR RF CODE TABLE 25122 0 0 2 CODE TABLE 25122 0 1
+ 025123 HARDWARE CONFIGURATION FOR HPA CODE TABLE 25123 0 0 2 CODE TABLE 25123 0 1
+ 025124 MWR L2 PROCESSING FLAG CODE TABLE 25124 0 0 2 CODE TABLE 25124 0 1
+ 025125 MWR L2-PROCESSING QUALITY % 0 0 7 % 0 3
+ 025126 MODEL DRY TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025127 INVERTED BAROMETER CORRECTION M 3 -32768 16 M 3 5
+ 025128 MODEL WET TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025129 MWR DERIVED WET TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025130 RA2 IONOSPHERIC CORRECTION ON KU BAND M 3 -32768 16 M 3 5
+ 025131 IONOSPHERIC CORRECTION FROM DORIS ON KU BAND M 3 -32768 16 M 3 5
+ 025132 IONOSPHERIC CORRECTION FROM MODEL ON KU BAND M 3 -32768 16 M 3 5
+ 025133 SEA STATE BIAS CORRECTION ON KU BAND M 3 -32768 16 M 3 5
+ 025134 RA2 IONOSPHERIC CORRECTION ON S BAND M 3 -32768 16 M 3 5
+ 025135 IONOSPHERIC CORRECTION FROM DORIS ON S BAND M 3 -32768 16 M 3 5
+ 025136 IONOSPHERIC CORRECTION FROM MODEL ON S BAND M 3 -32768 16 M 3 5
+ 025137 SEA STATE BIAS CORRECTION ON S BAND M 3 -32768 16 M 3 5
+ 025138 AVERAGE SIGNAL TO NOISE RATION NUMERIC 0 -2048 12 NUMERIC 0 4
+ 025140 START CHANNEL NUMERIC 0 0 14 NUMERIC 0 5
+ 025141 END CHANNEL NUMERIC 0 0 14 NUMERIC 0 5
+ 025142 CHANNEL SCALE FACTOR NUMERIC 0 0 6 NUMERIC 0 2
+ 025143 LINEAR COEFFICIENT NUMERIC 6 -5000000 24 NUMERIC 6 8
+ 025150 SATELLITE INTENSITY ANALYSIS METHOD OF TROPICAL CYCLONE CODE TABLE 25150 0 0 4 CODE TABLE 25150 2 2
+ 025160 KU BAND INSTRUMENTAL CORRECTION M 4 -120000 18
+ 025161 C BAND INSTRUMENTAL CORRECTION M 4 -120000 18
+ 025162 SEA STATE BIAS CORRECTION ON C BAND M 4 -6000 13
+ 025163 ALTIMETER IONOSPHERIC CORRECTION ON KU BAND M 3 -32768 16
+ 025164 RADIOMETER WET M 4 -5000 13
+ 025174 SMOS INFORMATION FLAG FLAG TABLE 25174 0 0 14 FLAG TABLE 25174 0 5
+ 025193 ATTENUATION CORRECTION ON SIGMA0 dB 3 0 14
+ 025194 MAJOR FRAME COUNT NUMERIC 0 0 4
+ 025197 ANTENNA CORRECTIONS VERSION NUMBER NUMERIC 0 0 5
+ 025198 LOG (TEMP-RAD CENTRAL WAVE NUMBER) 1/M 8 0 30
+ 025199 BANDWIDTH CORRECTION COEFFICIENT 1 NUMERIC 4 -10000 15
+ 025200 BANDWIDTH CORRECTION COEFFICIENT 2 NUMERIC 5 0 17
+ 025201 ALBEDO-RAD SOLAR FILTERED IRRADIANCE NUMERIC 4 0 24
+ 025202 ALBEDO-RAD EQUIVALENT FILTER WIDTH NUMERIC 10 0 14
+ 025203 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 25203 0 0 31
+ 025204 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 25204 0 0 31
+ 025205 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 25205 0 0 31
+ 025206 FOV QUALITY FLAGS FOR ATOVS FLAG TABLE 25206 0 0 31
+ 025207 COMPASS AZIMUTH ANGLE DEGREE 2 0 16
+ 026001 PRINCIPAL TIME OF DAILY READING IN UTC OF MAXIMUM TEMPERATURE HOUR 1 0 12 HOUR 1 3
+ 026002 PRINCIPAL TIME OF DAILY READING IN UTC OF MINIMUM TEMPERATURE HOUR 1 0 12 HOUR 1 3
+ 026003 TIME DIFFERENCE MINUTE 0 -1440 12 MINUTE 0 4
+ 026010 HOURS INCLUDED FLAG TABLE 26010 0 0 26 FLAG TABLE 26010 0 9
+ 026020 DURATION OF PRECIPITATION MINUTE 0 0 11 MINUTE 0 4
+ 026030 MEASUREMENT INTEGRATION TIME SECOND 2 0 8 SECOND 2 3
+ 026193 YEAR YEAR 0 0 12
+ 026194 MONTH MONTH 0 0 4
+ 026195 DAY DAY 0 0 6
+ 026196 HOUR HOUR 0 0 5
+ 026197 MINUTE MINUTE 0 0 6
+ 026198 SECOND SECOND 0 0 6
+ 026200 LOCATION WITHIN ASSIMILATION WINDOW IN TIME NUMERIC 6 0 20
+ 026201 HOURS INCLUDED FLAG TABLE 26201 0 0 26
+ 027001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 027002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 027003 ALTERNATE LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 027004 ALTERNATE LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 027010 FOOTPRINT AXIS 1 M -1 0 14 M -1 5
+ 027020 SATELLITE LOCATION COUNTER NUMERIC 0 0 16 NUMERIC 0 5
+ 027021 SATELLITE SUBLOCATION DIMENSION NUMERIC 0 0 16 NUMERIC 0 5
+ 027031 IN DIRECTION OF 0 DEGREES LONGITUDE, DISTANCE FROM THE EARTH'S C M 2 -1073741824 31 M 2 10
+ 027080 VIEWING AZIMUTH ANGLE DEGREE TRUE 2 0 16 DEGREE TRUE 0 5
+ 027193 SOLAR AZIMUTH DEGREE TRUE 2 0 16
+ 028001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 028002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 028003 ALTERNATE LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 028004 ALTERNATE LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 028010 FOOTPRINT AXIS 2 M -1 0 14 M -1 5
+ 028031 IN DIRECTION 90 DEGREES EAST, DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31 M 2 10
+ 029001 PROJECTION TYPE CODE TABLE 29001 0 0 3 CODE TABLE 29001 0 1
+ 029002 CO-ORDINATE GRID TYPE CODE TABLE 29002 0 0 3 CODE TABLE 29002 0 1
+ 030001 PIXEL VALUE (4 BITS) NUMERIC 0 0 4 NUMERIC 0 2
+ 030002 PIXEL VALUE (8 BITS) NUMERIC 0 0 8 NUMERIC 0 3
+ 030004 PIXEL VALUE (16 BITS) NUMERIC 0 0 16 NUMERIC 0 5
+ 030010 NUMBER OF GRID POINTS NUMERIC 0 0 13 NUMERIC 0 4
+ 030021 NUMBER OF PIXELS PER ROW NUMERIC 0 0 12 NUMERIC 0 4
+ 030022 NUMBER OF PIXELS PER COLUMN NUMERIC 0 0 12 NUMERIC 0 4
+ 030031 PICTURE TYPE CODE TABLE 30031 0 0 4 CODE TABLE 30031 0 2
+ 030032 COMBINATION WITH OTHER DATA FLAG TABLE 30032 0 0 16 FLAG TABLE 30032 0 6
+ 030193 POSITION NUMBER ALONG SCAN NUMERIC 0 0 8
+ 031000 SHORT DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 1 NUMERIC 0 1
+ 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8 NUMERIC 0 3
+ 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16 NUMERIC 0 5
+ 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8 NUMERIC 0 3
+ 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16 NUMERIC 0 5
+ 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 31021 0 0 6 CODE TABLE 31021 0 2
+ 031031 DATA PRESENT INDICATOR FLAG TABLE 31031 0 0 1 FLAG TABLE 31031 0 1
+ 031192 DATA PRESENT INDICATOR NUMERIC 0 0 1
+ 033002 QUALITY INFORMATION CODE TABLE 33002 0 0 2 CODE TABLE 33002 0 1
+ 033003 QUALITY INFORMATION CODE TABLE 33003 0 0 3 CODE TABLE 33003 0 1
+ 033005 QUALITY INFORMATION (AWS DATA) FLAG TABLE 33005 0 0 30 FLAG TABLE 33005 0 10
+ 033006 INTERNAL MEASUREMENT STATUS INFORMATION (AWS) CODE TABLE 33006 0 0 3 CODE TABLE 33006 0 1
+ 033007 PER CENT CONFIDENCE % 0 0 7 % 0 3
+ 033009 RELATIVE ERROR % 6 0 20 % 0 7
+ 033015 DATA QUALITY CHECK INDICATOR CODE TABLE 33015 0 0 6 CODE TABLE 33015 0 2
+ 033020 QUALITY CONTROL INDICATION OF FOLLOWING VALUE CODE TABLE 33020 0 0 3 CODE TABLE 33020 0 1
+ 033021 QUALITY OF FOLLOWING VALUE CODE TABLE 33021 0 0 2 CODE TABLE 33021 0 1
+ 033022 QUALITY OF BUOY SATELLITE TRANSMISSION CODE TABLE 33022 0 0 2 CODE TABLE 33022 0 1
+ 033023 QUALITY OF BUOY LOCATION CODE TABLE 33023 0 0 2 CODE TABLE 33023 0 1
+ 033024 STATION ELEVATION QUALITY MARK (FOR MOBILE STATIONS) CODE TABLE 33024 0 0 4 CODE TABLE 33024 0 2
+ 033025 ACARS INTERPOLATED VALUES CODE TABLE 33025 0 0 3 CODE TABLE 33025 0 1
+ 033026 MOISTURE QUALITY CODE TABLE 33026 0 0 6 CODE TABLE 33026 0 2
+ 033027 LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66 % CONFIDENCE) CODE TABLE 33027 0 0 3 CODE TABLE 33027 0 1
+ 033028 SNAPSHOT OVERALL QUALITY CODE TABLE 22028 0 0 3 CODE TABLE 22028 0 1
+ 033030 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 33030 0 0 24 FLAG TABLE 33030 0 8
+ 033031 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 33031 0 0 24 FLAG TABLE 33031 0 8
+ 033032 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 33032 0 0 24 FLAG TABLE 33032 0 8
+ 033033 FIELD OF VIEW QUALITY FLAGS FOR ATOVS FLAG TABLE 33033 0 0 24 FLAG TABLE 33033 0 8
+ 033035 MANUAL/AUTOMATIC QUALITY CONTROL CODE TABLE 33035 0 0 4 CODE TABLE 33035 0 2
+ 033036 NOMINAL CONFIDENCE THRESHOLD % 0 0 7 % 0 3
+ 033037 WIND CORRELATION ERROR FLAG TABLE 33037 0 0 20 FLAG TABLE 33037 0 7
+ 033038 QUALITY FLAGS FOR GROUND-BASED GNSS DATA FLAG TABLE 33038 0 0 10 FLAG TABLE 33038 0 4
+ 033039 QUALITY FLAGS FOR RADIO OCCULTATION DATA FLAG TABLE 33039 0 0 16 FLAG TABLE 33039 0 6
+ 033040 CONFIDENCE INTERVAL % 0 0 7 PERCENT 0 3
+ 033041 ATTRIBUTE OF FOLLOWING VALUE CODE TABLE 33041 0 0 2 CODE TABLE 33041 0 1
+ 033042 TYPE OF LIMIT REPRESENTED BY FOLLOWING VALUE CODE TABLE 33042 0 0 3 CODE TABLE 33042 0 1
+ 033043 AST CONFIDENCE FLAG TABLE 33043 0 0 8 FLAG TABLE 33043 0 3
+ 033044 ASAR QUALITY INFORMATION FLAG TABLE 33044 0 0 15 FLAG TABLE 33044 0 5
+ 033045 PROBABILITY OF FOLLOWING EVENT % 0 0 7 % 0 3
+ 033046 CONDITIONAL PROBABILITY OF FOLLOWING EVENT WITH RESPECT TO SPECI % 0 0 7 % 0 3
+ 033047 MEASUREMENT CONFIDENCE DATA FLAG TABLE 33047 0 0 31 FLAG TABLE 33047 0 11
+ 033048 CONFIDENCE MEASURE OF SAR INVERSION CODE TABLE 33048 0 0 2 CODE TABLE 33048 0 1
+ 033049 CONFIDENCE MEASURE OF WIND RETRIEVAL CODE TABLE 33049 0 0 2 CODE TABLE 33049 0 1
+ 033050 GLOBAL GTSPP QUALITY FLAG CODE TABLE 33050 0 0 4 CODE TABLE 33050 0 2
+ 033052 S BAND OCEAN RETRACKING QUALITY FLAG TABLE 33052 0 0 21 FLAG TABLE 33052 0 7
+ 033053 KU BAND OCEAN RETRACKING QUALITY FLAG TABLE 33053 0 0 21 FLAG TABLE 33053 0 7
+ 033060 GQISFLAGQUAL-INDIVIDUAL IASI-SYSTEM QUALITY FLAG CODE TABLE 33060 0 0 2 CODE TABLE 33060 0 1
+ 033061 GQISQUALINDEX - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE % 0 0 7 % 0 3
+ 033062 GQISQUALINDEXLOC - INDICATOR FOR GEOMETRIC QUALITY INDEX % 0 0 7 % 0 3
+ 033063 GQISQUALINDEXRAD - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE % 0 0 7 % 0 3
+ 033064 GQISQUALINDEXSPECT - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE % 0 0 7 % 0 3
+ 033065 GQISSYSTECSONDQUAL - OUTPUT OF SYSTEM TEC QUALITY FUNCTION NUMERIC 0 0 24 NUMERIC 0 24
+ 033066 SBUV TOTAL OZONE QUALITY CODE TABLE 33066 0 0 4 CODE TABLE 33066 0 2
+ 033067 SBUV PROFILE OZONE QUALITY CODE TABLE 33067 0 0 4 CODE TABLE 33067 0 2
+ 033070 TOTAL OZONE QUALITY CODE TABLE 33070 0 0 4 CODE TABLE 33070 0 2
+ 033071 PROFILE OZONE QUALITY CODE TABLE 33071 0 0 4 CODE TABLE 33071 0 2
+ 033072 OZONE ERROR CODE TABLE 33072 0 0 5 CODE TABLE 33072 0 2
+ 033075 SCAN LEVEL QUALITY FLAG FLAG TABLE 33075 0 0 13 FLAG TABLE 33075 0 5
+ 033076 CALIBRATION QUALITY FLAG FLAG TABLE 33076 0 0 9 FLAG TABLE 33076 0 3
+ 033077 FIELD OF VIEW QUALITY FLAG FLAG TABLE 33077 0 0 19 FLAG TABLE 33077 0 7
+ 033078 GEOLOCATION QUALITY CODE TABLE 33078 0 0 4 CODE TABLE 33078 0 2
+ 033191 ECMWF WAM QC INDICATOR CODE TABLE 033191 0 0 2
+ 033192 TEM1 CONFIDENCE % 0 0 7
+ 033193 DATA QUALITY 3 BIT CODE CODE TABLE 33193 0 0 3
+ 033194 DATA QUALITY 2 BIT CODE CODE TABLE 33194 0 0 2
+ 033195 ECMWF SAR QC INDICATOR CODE TABLE 33195 0 0 5
+ 033196 ECMWF WAM QC INDICATOR CODE TABLE 33196 0 0 2
+ 033197 ECMWF SAR INVERSION QC INDICATOR CODE TABLE 33197 0 0 3
+ 033198 MINIMUM COST NUMERIC 4 0 14
+ 033199 1D VAR TOTAL PRECIPITABLE WATER RETRIEVED ERROR(S) KG/M**2 2 0 11
+ 033200 ANALYSIS REPORT EVENTS FLAG TABLE 33200 0 0 31
+ 033201 ANALYSIS REPORT STATUS EVENT FLAG TABLE 33201 0 0 13
+ 033202 ANALYSIS DATUM EVENT FLAGS (1) FLAG TABLE 33202 0 0 31
+ 033203 ANALYSIS DATUM EVENT FLAGS (2) FLAG TABLE 33203 0 0 11
+ 033204 ANALYSIS DATUM STATUS FLAGS FLAG TABLE 33204 0 0 21
+ 033205 VARIATIONAL ANALYSIS BLACK LIST FLAG CODE TABLE 33205 0 0 4
+ 033206 VARIATIONAL ANALYSIS QUALITY CONTROL FLAG CODE TABLE 33206 0 0 4
+ 033207 VARIATIONAL ANALYSIS DEPARTURE FLAG CODE TABLE 33207 0 0 4
+ 033208 VARIATIONAL ANALYSIS FIRST QUESS CHECK FLAG CODE TABLE 33208 0 0 4
+ 033209 VARIATIONAL ANALYSIS FINAL FLAG CODE TABLE 33209 0 0 4
+ 033210 INCREMENTAL VARIATIONAL ANALYSIS UPDATE NUMBER NUMERIC 0 0 7
+ 033211 MINIMISATION SIMULATION NUMBER NUMERIC 0 0 10
+ 033212 1D VAR ITERATION NUMBER NUMERIC 0 0 10
+ 033213 1D VAR RADIANCE COST NUMERIC 1 -1000 11
+ 033214 1D VAR ERROR(S) FLAG TABLE 33214 0 0 11
+ 033215 DIRECTIONAL SKILL NUMERIC 1 -4096 13
+ 033216 1D VAR SURFACE TYPE QUALITY CONTROL CODE TABLE 33216 0 0 3
+ 033217 1D VAR FAILURE INDICATOR CODE TABLE 33217 0 0 2
+ 033218 1D VAR ESTIMATE OF SCATTERING NUMERIC 2 0 12
+ 033219 SSMI INDIPENDENT SCATTERING INDEX NUMERIC 2 -50000 16
+ 033220 VARIATIONAL ANALYSIS REPORT EVENTS (1) FLAG TABLE 33220 0 0 31
+ 033221 VARIATIONAL ANALYSIS SYNOP EVENTS (2) FLAG TABLE 33221 0 0 31
+ 033222 VARIATIONAL ANALYSIS AIREP EVENTS (2) FLAG TABLE 33222 0 0 31
+ 033223 VARIATIONAL ANALYSIS SATOB EVENTS (2) FLAG TABLE 33223 0 0 31
+ 033224 VARIATIONAL ANALYSIS DRIBU EVENTS (2) FLAG TABLE 33224 0 0 31
+ 033225 VARIATIONAL ANALYSIS TEMP EVENTS (2) FLAG TABLE 33225 0 0 31
+ 033226 VARIATIONAL ANALYSIS PILOT EVENTS (2) FLAG TABLE 33226 0 0 31
+ 033227 VARIATIONAL ANALYSIS SATEM/TOVS EVENTS (2) FLAG TABLE 33227 0 0 31
+ 033228 VARIATIONAL ANALYSIS PAOB EVENTS (2) FLAG TABLE 33228 0 0 31
+ 033229 VARIATIONAL ANALYSIS SCATTEROMETER EVENTS (2) FLAG TABLE 33229 0 0 31
+ 033230 VARIATIONAL ANALYSIS RAW RADIANCES EVENTS (2) FLAG TABLE 33230 0 0 31
+ 033231 PRESAT SUMMARY FLAGS FLAG TABLE 33231 0 0 6
+ 033232 REPORT BLACK LIST EVENTS FLAG TABLE 33232 0 0 31
+ 033233 VARIATIONAL ANALYSIS REPORT STATUS FLAG TABLE 33233 0 0 31
+ 033234 VARIATIONAL ANALYSIS DATUM STATUS FLAG TABLE 33234 0 0 31
+ 033236 VARIATIONAL ANALYSIS DATUM EVENTS (1) FLAG TABLE 33236 0 0 31
+ 033237 VARIATIONAL ANALYSIS SYNOP DATUM EVENTS (2) FLAG TABLE 33237 0 0 31
+ 033238 VARIATIONAL ANALYSIS AIREP DATUM EVENTS (2) FLAG TABLE 33238 0 0 31
+ 033239 VARIATIONAL ANALYSIS SATOB DATUM EVENTS (2) FLAG TABLE 33239 0 0 31
+ 033240 VARIATIONAL ANALYSIS DRIBU DATUM EVENTS (2) FLAG TABLE 33240 0 0 31
+ 033241 GROSS ERROR PROBABILITY NUMERIC 3 0 10
+ 033242 GROSS ERROR INDICATOR CODE TABLE 33242 0 0 2
+ 033243 VARIATIONAL ANALYSIS TEMP DATUM EVENTS (2) FLAG TABLE 33243 0 0 31
+ 033244 VARIATIONAL ANALYSIS PILOT DATUM EVENTS (2) FLAG TABLE 33244 0 0 31
+ 033245 VARIATIONAL ANALYSIS SATEM/TOVS DATUM EVENTS (2) FLAG TABLE 33245 0 0 31
+ 033246 VARIATIONAL ANALYSIS PAOB DATUM EVENTS (2) FLAG TABLE 33246 0 0 31
+ 033247 VARIATIONAL ANALYSIS SCATTEROMETER DATUM EVENTS (2) FLAG TABLE 33247 0 0 31
+ 033248 VARIATIONAL ANALYSIS RAW RADIANCES DATUM EVENTS (2) FLAG TABLE 33248 0 0 31
+ 033249 DATUM BLACK LIST EVENTS FLAG TABLE 33249 0 0 31
+ 033250 PROBABILITY OF GROSS ERROR NUMERIC 6 0 20
+ 033251 RANGE OF POSSIBLE VALUES NUMERIC 2 0 14
+ 033252 MANUAL-AUTOMATIC QUALITY CONTROL CODE TABLE 33252 0 0 4
+ 033253 NOMINAL CONFIDENCE THRESHOLD % 0 0 7
+ 033254 WIND CORRELATION METHOD FLAG TABLE 33254 0 0 20
+ 035000 FM AND REGIONAL CODE NUMBER CODE TABLE 35000 0 0 10 CODE TABLE 35000 0 3
+ 035001 TIME-FRAME FOR MONITORING CODE TABLE 35001 0 0 3 CODE TABLE 35001 0 1
+ 035011 NUMBER OF REPORTS ACTUALLY RECEIVED NUMERIC 0 0 14 NUMERIC 0 4
+ 035021 BULLETIN BEING MONITORED (TTAAII) CCITTIA5 0 0 48 CHARACTER 0 6
+ 035022 BULLETIN BEING MONITORED (YYGGGG) CCITTIA5 0 0 48 CHARACTER 0 6
+ 035023 BULLETIN BEING MONITORED (CCCC) CCITTIA5 0 0 32 CHARACTER 0 4
+ 035024 BULLETIN BEING MONITORED (BBB) CCITTIA5 0 0 24 CHARACTER 0 3
+ 035030 DISCREPANCIES IN THE AVAILABILITY OF EXPECTED DATA CODE TABLE 35030 0 0 4 CODE TABLE 35030 0 1
+ 035031 QUALIFIER ON MONITORING RESULTS CODE TABLE 35031 0 0 7 CODE TABLE 35031 0 2
+ 035032 CAUSE OF MISSING DATA CODE TABLE 35032 0 0 4 CODE TABLE 35032 0 1
+ 035033 OBSERVATION AND COLLECTION DEFICIENCIES CODE TABLE 35033 0 0 7 CODE TABLE 35033 0 2
+ 035034 STATISTICAL TRENDS FOR AVAILABILITY OF DATA (DURING THE SURVEY P CODE TABLE 35034 0 0 3 CODE TABLE 35034 0 1
+ 035035 REASON FOR TERMINATION CODE TABLE 35035 0 0 5 CODE TABLE 35035 0 2
+ 040001 SURFACE SOIL MOISTURE (MS) % 1 0 10 % 1 4
+ 040002 ESTIMATED ERROR IN SURFACE SOIL MOISTURE % 1 0 10 % 1 4
+ 040003 MEAN SURFACE SOIL MOISTURE NUMERIC 3 0 10 NUMERIC 3 4
+ 040004 RAIN FALL DETECTION NUMERIC 3 0 10 NUMERIC 3 4
+ 040005 SOIL MOISTURE CORRECTION FLAG FLAG TABLE 40005 0 0 8 FLAG FLAG TABLE 40005 0 3
+ 040006 SOIL MOISTURE PROCESSING FLAG FLAG TABLE 40006 0 0 16 FLAG FLAG TABLE 40006 0 5
+ 040007 SOIL MOISTURE QUALITY % 1 0 10 % 1 4
+ 040008 FROZEN LAND SURFACE FRACTION % 1 0 10 % 1 4
+ 040009 INUNDATION AND WETLAND FRACTION % 1 0 10 % 1 4
+ 040010 TOPOGRAPHIC COMPLEXITY % 1 0 10 % 1 4
+ 040011 INTERPOLATION FLAG FLAG TABLE 40011 0 0 8 FLAG TABLE 40011 0 3
+ 040012 RADIOMETER DATA QUALITY FLAG FLAG TABLE 40012 0 0 8 FLAG TABLE 40012 0 3
+ 040013 RADIOMETER BRIGHTNESS TEMPERATURE INTERPOLATION FLAG CODE TABLE 40013 0 0 3
+ 040014 HIGH FREQUENCY FLUCTUATIONS OF THE SEA SURFACE TOPOGRAPHY CORRECTM 4 -3000 13
+ 040015 QUANTIZATION FACTOR NUMERIC 2 0 16
+ 040016 RESIDUAL RMS IN BAND NUMERIC 3 0 14
+ 040017 NON-NORMALISED PRINCIPAL COMPONENT SCORE NUMERIC 0 -1073741824 31
+ 040018 GLACAVGIMAGIIS - AVERAGE OF IMAGER MEASUREMENTS (W/M**2)*(1/SR)*(1/M) 6 0 24
+ 040019 GLACVARIMAGIIS - VARIANCE OF IMAGER MEASUREMENTS (W/M**2)*(1/SR)*(1/M) 6 0 24
+ 040020 GQISFLAGQUALDETAILED - QUALITY FLAG FOR THE SYSTEM FLAG TABLE 40020 0 0 17
+ 040021 FRACTION OF WEIGHTED AVHRR PIXEL IN IASI FOV COVERED WITH ICE % 0 0 7
+ 040022 NUMBER OF MISSING, BAD OR FAILED AVHRR PIXELS NUMERIC 0 0 7
+ 040023 AUXILIARY ALTIMETER STATE FLAG FLAG TABLE 40023 0 0 5
+ 040024 METEOROLOGICAL MAP AVAILABILITY CODE TABLE 40024 0 0 3
+ 040025 INTERPOLATION FLAG FOR MEAN DIURNAL TIDE CODE TABLE 40025 0 0 2
+ 040193 INSTRUMENT DETECTING CLOUDS FLAG TABLE 40193 0 0 16
+ 040194 VALIDATION FLAG FOR IASI LEVEL 1 PRODUCT FLAG TABLE 40194 0 0 16
+ 040195 QUALITY AND COMPLETENESS OF RETRIEVAL CODE TABLE 40195 0 0 4
+ 040196 RETRIEVAL CHOICE INDICATOR FLAG TABLE 40196 0 0 8
+ 040197 SATELLITE MANOEUVRE INDICATOR CODE TABLE 40197 0 0 3
+ 040198 SELECTION OF BACKGROUND STATE CODE TABLE 40198 0 0 3
+ 040199 INTEGRATED N2O DENSITY KG/M**2 6 0 16
+ 040200 INTEGRATED CO DENSITY KG/M**2 7 0 16
+ 040201 INTEGRATED CH4 DENSITY KG/M**2 6 0 16
+ 040202 INTEGRATED CO2 DENSITY KG/M**2 3 0 16
+ 040203 COLD/WARM LOAD FLAG FLAG TABLE 40203 0 0 12
+ 049193 SAR INVERSION QC FLAGS FLAG TABLE 49193 0 0 15
+ 049194 ALTIMETER WAVE HEIGHT QC FLAFS FLAG TABLE 49194 0 0 15
+ 055003 DATA EXTRACTION INDICATOR FLAG TABLE 55003 0 0 8
diff --git a/bufrtables/B0000000000254011001.TXT b/bufrtables/B0000000000254011001.TXT
new file mode 100755
index 0000000..d55b947
--- /dev/null
+++ b/bufrtables/B0000000000254011001.TXT
@@ -0,0 +1,1349 @@
+ 000001 TABLE A: ENTRY CCITTIA5 0 0 24 CHARACTER 0 3
+ 000002 TABLE A: DATA CATEGORY DESCRIPTION, LINE 1 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000003 TABLE A: DATA CATEGORY DESCRIPTION, LINE 2 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000005 BUFR/CREX EDITION NUMBER CCITTIA5 0 0 24 CHARACTER 0 3
+ 000010 F DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 8 CHARACTER 0 1
+ 000011 X DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 16 CHARACTER 0 2
+ 000012 Y DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 24 CHARACTER 0 3
+ 000013 ELEMENT NAME, LINE 1 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000014 ELEMENT NAME, LINE 2 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000015 UNITS NAME CCITTIA5 0 0 192 CHARACTER 0 24
+ 000016 UNITS SCALE SIGN CCITTIA5 0 0 8 CHARACTER 0 1
+ 000017 UNITS SCALE CCITTIA5 0 0 24 CHARACTER 0 3
+ 000018 UNITS REFERENCE SIGN CCITTIA5 0 0 8 CHARACTER 0 1
+ 000019 UNITS REFERENCE VALUE CCITTIA5 0 0 80 CHARACTER 0 10
+ 000020 ELEMENT DATA WIDTH CCITTIA5 0 0 24 CHARACTER 0 3
+ 000030 DESCRIPTOR DEFINING SEQUENCE CCITTIA5 0 0 48 CHARACTER 0 6
+ 001001 WMO BLOCK NUMBER NUMERIC 0 0 7 NUMERIC 0 2
+ 001002 WMO STATION NUMBER NUMERIC 0 0 10 NUMERIC 0 3
+ 001003 WMO REGION NUMBER/GEOGRAPHICAL AREA CODE TABLE 1003 0 0 3 CODE TABLE 1003 0 1
+ 001004 WMO REGION SUB-AREA (SEE NOTE 9) NUMERIC 0 0 3 NUMERIC 0 1
+ 001005 BUOY/PLATFORM IDENTIFIER NUMERIC 0 0 17 NUMERIC 0 5
+ 001006 AIRCRAFT FLIGHT NUMBER CCITTIA5 0 0 64 CHARACTER 0 8
+ 001007 SATELLITE IDENTIFIER CODE TABLE 1007 0 0 10 CODE TABLE 1007 0 4
+ 001008 AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION CCITTIA5 0 0 64 CHARACTER 0 8
+ 001009 TYPE OF COMMERCIAL AIRCRAFT CCITTIA5 0 0 64 CHARACTER 0 8
+ 001010 STATIONARY BUOY PLATFORM IDENTIFIER; E.G. C-MAN BUOYS CCITTIA5 0 0 64 CHARACTER 0 8
+ 001011 SHIP OR MOBILE LAND STATION IDENTIFIER CCITTIA5 0 0 72 CHARACTER 0 9
+ 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM* M/S 0 0 10 M/S 0 3
+ 001014 PLATFORM DRIFT SPEED (HIGH PRECISION) M/S 2 0 10 M/S 2 4
+ 001015 STATION OR SITE NAME CCITTIA5 0 0 160 CHARACTER 0 20
+ 001018 SHORT STATION OR SITE NAME CCITTIA5 0 0 40 CHARACTER 0 5
+ 001019 LONG STATION OR SITE NAME CCITTIA5 0 0 256 CHARACTER 0 32
+ 001020 WMO REGION SUB-AREA NUMERIC 0 0 4 NUMERIC 0 2
+ 001021 SYNOPTIC FEATURE IDENTIFIER NUMERIC 0 0 14 NUMERIC 0 4
+ 001022 NAME OF FEATURE (SEE NOTE 11) CCITTIA5 0 0 224 CHARACTER 0 28
+ 001023 OBSERVATION SEQUENCE NUMBER NUMERIC 0 0 9 NUMERIC 0 3
+ 001025 STORM IDENTIFIER CCITTIA5 0 0 24 CHARACTER 0 3
+ 001026 WMO STORM NAME CCITTIA5 0 0 64 CHARACTER 0 8
+ 001027 WMO LONG STORM NAME CCITTIA5 0 0 80 CHARACTER 0 10
+ 001030 (VAL) NUMERICAL MODEL IDENTIFIER (SEE NOTE 13) CCITTIA5 0 0 128 CHARACTER 0 16
+ 001031 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE (SEE NOTE 10) CODE TABLE 1031 0 0 16 CODE TABLE 1031 0 5
+ 001032 GENERATING APPLICATION CODE TABLE 1032 0 0 8 CODE TABLE 1032 0 3
+ 001033 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE CODE TABLE 1033 0 0 8 CODE TABLE 1033 0 3
+ 001034 IDENTIFICATION OF ORIGINATING/GENERATING SUB-CENTRE CODE TABLE 1034 0 0 8 CODE TABLE 1034 0 3
+ 001035 ORIGINATING CENTRE COMMON CODE TABLE C-11 0 0 16 COMMON CODE TABLE C-11 0 5
+ 001036 AGENCY IN CHARGE OF OPERATING THE OBSERVING PLATFORM CODE TABLE 1036 0 0 20 CODE TABLE 1036 0 7
+ 001037 (VAL) SIGMET SEQUENCE IDENTIFIER CCITTIA5 0 0 24 CHARACTER 0 3
+ 001041 ABSOLUTE PLATFORM VELOCITY - FIRST COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001042 ABSOLUTE PLATFORM VELOCITY - SECOND COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001043 ABSOLUTE PLATFORM VELOCITY - THIRD COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001050 PLATFORM TRANSMITTER ID NUMBER NUMERIC 0 0 17 NUMERIC 0 6
+ 001051 PLATFORM TRANSMITTER ID NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 001060 AIRCRAFT REPORTING POINT (BEACON IDENTIFIER) CCITTIA5 0 0 64 CHARACTER 0 8
+ 001062 SHORT ICAO LOCATION INDICATOR CCITTIA5 0 0 32 CHARACTER 0 4
+ 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64 CHARACTER 0 8
+ 001064 RUNWAY DESIGNATOR CCITTIA5 0 0 32 CHARACTER 0 4
+ 001065 (VAL) ICAO REGION IDENTIFIER CCITTIA5 0 0 256 CHARACTER 0 32
+ 001075 TIDE STATION IDENTIFICATION CCITTIA5 0 0 40 CHARACTER 0 5
+ 001080 SHIP LINE NUMBER ACCORDING TO SOOP CCITTIA5 0 0 32 CHARACTER 0 4
+ 001081 RADIOSONDE SERIAL NUMBER CCITTIA5 0 0 160 CHARACTER 0 20
+ 001082 RADIOSONDE ASCENSION NUMBER (SEE NOTE 12) NUMERIC 0 0 14 NUMERIC 0 4
+ 001083 RADIOSONDE RELEASE NUMBER (SEE NOTE 12) NUMERIC 0 0 3 NUMERIC 0 1
+ 001085 OBSERVING PLATFORM MANUFACTURER'S MODEL CCITTIA5 0 0 160 CHARACTER 0 20
+ 001086 OBSERVING PLATFORM MANUFACTURER'S SERIAL NUMBER CCITTIA5 0 0 256 CHARACTER 0 32
+ 001090 TECHNIQUE FOR MAKING UP INITIAL PERTURBATIONS CODE TABLE 1090 0 0 8 CODE TABLE 1090 0 3
+ 001091 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 10 NUMERIC 0 4
+ 001092 TYPE OF ENSEMBLE FORECAST CODE TABLE 1092 0 0 8 CODE TABLE 1092 0 3
+ 001093 BALLOON LOT NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 001094 WBAN NUMBER NUMERIC 0 0 17 NUMERIC 0 5
+ 001095 OBSERVER IDENTIFICATION CCITTIA5 0 0 32 CHARACTER 0 4
+ 001096 (CBS) STATION ACQUISITION CCITTIA5 0 0 160 CHARACTER 0 20
+ 001192 MODEL VERSION NUMBER CODE TABLE 1192 0 0 8
+ 001193 SIGMA_0 SIMULATION METHOD CODE TABLE 1193 0 0 4
+ 001194 CARRIER BALLOON/AIRCRAFT IDENTIFIER CCITTIA5 0 0 72
+ 001195 MOBIL LAND STATION IDENTIFIER CCITTIA5 0 0 72
+ 001196 CONSTANT LEVEL BALLOON IDENTIFIER CCITTIA5 0 0 72
+ 001197 RTP - PLATFORM TYPE CODE TABLE 1197 0 0 10
+ 001198 ITP - DECK ID CODE TABLE 1198 0 0 10
+ 001199 DUP - DUPLICATE STATUS CODE TABLE 1199 0 0 4
+ 001201 GENERATING APPLICATION CODE TABLE 1201 0 0 8
+ 001205 SATELLITE IDENTIFIER CODE TABLE 1205 0 0 10
+ 001208 VELOCITY OF PLATFORM, X M/S 5 -1073741824 31
+ 001209 VELOCITY OF PLATFORM, Y M/S 5 -1073741824 31
+ 001210 VELOCITY OF PLATFORM, Z M/S 5 -1073741824 31
+ 002001 TYPE OF STATION CODE TABLE 2001 0 0 2 CODE TABLE 2001 0 1
+ 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 2002 0 0 4 FLAG TABLE 2002 0 2
+ 002003 TYPE OF MEASURING EQUIPMENT USED CODE TABLE 2003 0 0 4 CODE TABLE 2003 0 2
+ 002004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUREMENT OR TYPE OF C CODE TABLE 2004 0 0 4 CODE TABLE 2004 0 2
+ 002005 PRECISION OF TEMPERATURE OBSERVATION K 2 0 7 K 2 3
+ 002011 RADIOSONDE TYPE CODE TABLE 2011 0 0 8 CODE TABLE 2011 0 3
+ 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 2012 0 0 4 CODE TABLE 2012 0 2
+ 002013 SOLAR AND INFRARED RADIATION CORRECTION CODE TABLE 2013 0 0 4 CODE TABLE 2013 0 2
+ 002014 TRACKING TECHNIQUE/STATUS OF SYSTEM USED CODE TABLE 2014 0 0 7 CODE TABLE 2014 0 3
+ 002015 RADIOSONDE COMPLETENESS CODE TABLE 2015 0 0 4 CODE TABLE 2015 0 2
+ 002016 RADIOSONDE CONFIGURATION FLAG TABLE 2016 0 0 5 FLAG TABLE 2016 0 2
+ 002019 SATELLITE INSTRUMENTS CODE TABLE 2019 0 0 11 CODE TABLE 2019 0 4
+ 002020 SATELLITE CLASSIFICATION CODE TABLE 2020 0 0 9 CODE TABLE 2020 0 3
+ 002021 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 2021 0 0 9 FLAG TABLE 2021 0 3
+ 002022 SATELLITE DATA-PROCESSING TECHNIQUE USED FLAG TABLE 2022 0 0 8 FLAG TABLE 2022 0 3
+ 002023 SATELLITE DERIVED WIND COMPUTATION METHOD CODE TABLE 2023 0 0 4 CODE TABLE 2023 0 2
+ 002024 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2024 0 0 4 CODE TABLE 2024 0 2
+ 002025 SATELLITE CHANNEL(S) USED IN COMPUTATION FLAG TABLE 2025 0 0 25 FLAG TABLE 2025 0 9
+ 002026 CROSS TRACK RESOLUTION M 2 0 12 M 2 4
+ 002027 ALONG TRACK RESOLUTION M 2 0 12 M 2 4
+ 002028 SEGMENT SIZE AT NADIR IN X DIRECTION M 0 0 18 M 0 6
+ 002029 SEGMENT SIZE AT NADIR IN Y DIRECTION M 0 0 18 M 0 6
+ 002030 METHOD OF CURRENT MEASUREMENT CODE TABLE 2030 0 0 3 CODE TABLE 2030 0 1
+ 002031 DURATION AND TIME OF CURRENT MEASUREMENT CODE TABLE 2031 0 0 5 CODE TABLE 2031 0 2
+ 002032 INDICATOR FOR DIGITIZATION CODE TABLE 2032 0 0 2 CODE TABLE 2032 0 1
+ 002033 METHOD OF SALINITY/DEPTH MEASUREMENT CODE TABLE 2033 0 0 3 CODE TABLE 2033 0 1
+ 002034 DROGUE TYPE CODE TABLE 2034 0 0 5 CODE TABLE 2034 0 2
+ 002035 CABLE LENGTH M 0 0 9 M 0 3
+ 002036 BUOY TYPE CODE TABLE 2036 0 0 2 CODE TABLE 2036 0 1
+ 002037 METHOD OF TIDAL OBSERVATION CODE TABLE 2037 0 0 3 CODE TABLE 2037 0 1
+ 002038 METHOD OF WATER TEMPERATURE AND/OR SALINITY MEASUREMENT CODE TABLE 2038 0 0 4 CODE TABLE 2038 0 2
+ 002039 METHOD OF WET-BULB TEMPERATURE MEASUREMENT CODE TABLE 2039 0 0 3 CODE TABLE 2039 0 1
+ 002040 METHOD OF REMOVING VELOCITY AND MOTION OF PLATFORM FROM CURRENT CODE TABLE 2040 0 0 4 CODE TABLE 2040 0 2
+ 002041 METHOD FOR ESTIMATING REPORTS RELATED TO SYNOPTIC FEATURES CODE TABLE 2041 0 0 6 CODE TABLE 2041 0 2
+ 002044 INDICATOR FOR METHOD OF CALCULATING SPECTRAL WAVE DATA CODE TABLE 2044 0 0 4 CODE TABLE 2044 0 2
+ 002045 INDICATOR FOR TYPE OF PLATFORM CODE TABLE 2045 0 0 4 CODE TABLE 2045 0 2
+ 002046 WAVE MEASUREMENT INSTRUMENTATION CODE TABLE 2046 0 0 4 CODE TABLE 2046 0 2
+ 002048 SATELLITE SENSOR INDICATOR CODE TABLE 2048 0 0 4 CODE TABLE 2048 0 2
+ 002049 GEOSTATIONARY SATELLITE DATA-PROCESSING TECHNIQUE USED FLAG TABLE 2049 0 0 8 FLAG TABLE 2049 0 3
+ 002050 GEOSTATIONARY SOUNDER SATELLITE CHANNELS USED FLAG TABLE 2050 0 0 20 FLAG TABLE 2050 0 7
+ 002051 INDICATOR TO SPECIFY OBSERVING METHOD FOR EXTREME TEMPERATURES CODE TABLE 2051 0 0 4 CODE TABLE 2051 0 2
+ 002052 GEOSTATIONARY IMAGER SATELLITE CHANNELS USED FLAG TABLE 2052 0 0 6 FLAG TABLE 2052 0 2
+ 002053 GOES-I/M BRIGHTNESS TEMPERATURE CHARACTERISTICS CODE TABLE 2053 0 0 4 CODE TABLE 2053 0 2
+ 002054 GOES-I/M SOUNDINGS PARAMETER CHARACTERISTICS CODE TABLE 2054 0 0 4 CODE TABLE 2054 0 2
+ 002055 GEOSTATIONARY SOUNDINGS STATISTICAL PARAMETERS CODE TABLE 2055 0 0 4 CODE TABLE 2055 0 2
+ 002056 GEOSTATIONARY SOUNDINGS ACCURACY STATISTICS CODE TABLE 2056 0 0 4 CODE TABLE 2056 0 2
+ 002057 ORIGIN OF FIRST GUESS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2057 0 0 4 CODE TABLE 2057 0 2
+ 002058 VALID TIMES OF FIRST GUESS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2058 0 0 4 CODE TABLE 2058 0 2
+ 002059 ORIGIN OF ANALYSIS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2059 0 0 4 CODE TABLE 2059 0 2
+ 002060 ORIGIN OF SURFACE INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2060 0 0 4 CODE TABLE 2060 0 2
+ 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 2061 0 0 3 CODE TABLE 2061 0 1
+ 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 2062 0 0 4 CODE TABLE 2062 0 2
+ 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16 DEGREE 2 5
+ 002064 AIRCRAFT ROLL ANGLE QUALITY CODE TABLE 2064 0 0 2 CODE TABLE 2064 0 1
+ 002065 ACARS GROUND RECEIVING STATION CCITTIA5 0 0 40 CHARACTER 0 5
+ 002066 RADIOSONDE GROUND RECEIVING SYSTEM CODE TABLE 2066 0 0 6 CODE TABLE 2066 0 2
+ 002067 RADIOSONDE OPERATING FREQUENCY Hz -5 0 15 Hz -5 5
+ 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 2070 0 0 4 CODE TABLE 2070 0 2
+ 002080 BALLOON MANUFACTURER CODE TABLE 2080 0 0 6 CODE TABLE 2080 0 2
+ 002081 TYPE OF BALLOON CODE TABLE 2081 0 0 5 CODE TABLE 2081 0 2
+ 002082 WEIGHT OF BALLOON KG 3 0 12 KG 3 4
+ 002083 TYPE OF BALLOON SHELTER CODE TABLE 2083 0 0 4 CODE TABLE 2083 0 2
+ 002084 TYPE OF GAS USED IN BALLOON CODE TABLE 2084 0 0 4 CODE TABLE 2084 0 2
+ 002085 AMOUNT OF GAS USED IN BALLOON KG 3 0 13 KG 3 4
+ 002086 BALLOON FLIGHT TRAIN LENGTH M 1 0 10 M 1 4
+ 002091 ENTRY SENSOR 4/20 MA A 4 0 10 A 4 3
+ 002095 TYPE OF PRESSURE SENSOR CODE TABLE 2095 0 0 5 CODE TABLE 2095 0 2
+ 002096 TYPE OF TEMPERATURE SENSOR CODE TABLE 2096 0 0 5 CODE TABLE 2096 0 2
+ 002097 TYPE OF HUMIDITY SENSOR CODE TABLE 2097 0 0 5 CODE TABLE 2097 0 2
+ 002100 RADAR CONSTANT dB 1 0 12 dB 1 4
+ 002101 TYPE OF ANTENNA CODE TABLE 2101 0 0 4 CODE TABLE 2101 0 2
+ 002102 ANTENNA HEIGHT ABOVE TOWER BASE M 0 0 8 M 0 3
+ 002103 RADOME FLAG TABLE 2103 0 0 2 FLAG TABLE 2103 0 1
+ 002104 ANTENNA POLARISATION CODE TABLE 2104 0 0 4 CODE TABLE 2104 0 2
+ 002105 MAXIMUM ANTENNA GAIN dB 0 0 6 dB 0 2
+ 002106 3-DB BEAMWIDTH DEGREE 1 0 6 DEGREE 1 2
+ 002107 SIDELOBE SUPPRESSION dB 0 0 6 dB 0 2
+ 002108 CROSSPOL DISCRIMINATION (ON AXIS) dB 0 0 6 dB 0 2
+ 002109 ANTENNA SPEED (AZIMUTH) DEGREE/S 2 0 12 DEGREE/S 2 4
+ 002110 ANTENNA SPEED (ELEVATION) DEGREE/S 2 0 12 DEGREE/S 2 4
+ 002111 RADAR INCIDENCE ANGLE DEGREE 1 0 10 DEGREE 1 4
+ 002112 RADAR LOOK ANGLE DEGREE 1 0 12 DEGREE 1 4
+ 002113 NUMBER OF AZIMUTH LOOKS NUMERIC 0 0 4 NUMERIC 0 2
+ 002114 ANTENNA EFFECTIVE SURFACE AREA M**2 0 0 15 M**2 0 5
+ 002115 TYPE OF SURFACE OBSERVING EQUIPMENT CODE TABLE 2115 0 0 5 CODE TABLE 2115 0 2
+ 002116 (CBS) PERCENTAGE OF 320 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002117 (CBS) PERCENTAGE OF 80 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002118 (CBS) PERCENTAGE OF 20 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002119 (CBS) RA-2 INSTRUMENT OPERATIONS CODE TABLE 2119 0 0 3 CODE TABLE 2119 0 1
+ 002120 (CBS) OCEAN WAVE FREQUENCY Hz 3 0 10 Hz 3 4
+ 002121 MEAN FREQUENCY Hz -8 0 7 Hz -8 3
+ 002122 FREQUENCY AGILITY RANGE Hz -6 -128 8 Hz -6 3
+ 002123 PEAK POWER W -4 0 7 W -4 3
+ 002124 AVERAGE POWER W -1 0 7 W -1 3
+ 002125 PULSE REPETITION FREQUENCY Hz -1 0 8 Hz -1 3
+ 002126 PULSE WIDTH S 7 0 6 S 7 2
+ 002127 RECEIVER INTERMEDIATE FREQUENCY Hz -6 0 7 Hz -6 3
+ 002128 INTERMEDIATE FREQUENCY BANDWIDTH Hz -5 0 6 Hz -5 2
+ 002129 MINIMUM DETECTABLE SIGNAL dB 0 -150 5 dB 0 3
+ 002130 DYNAMIC RANGE dB 0 0 7 dB 0 3
+ 002131 SENSITIVITY TIME CONTROL (STC) FLAG TABLE 2131 0 0 2 FLAG TABLE 2131 0 1
+ 002132 AZIMUTH POINTING ACCURACY DEGREE 2 0 6 DEGREE 2 2
+ 002133 ELEVATION POINTING ACCURACY DEGREE 2 0 6 DEGREE 2 2
+ 002134 ANTENNA BEAM AZIMUTH DEGREE 2 0 16 DEGREE 2 5
+ 002135 ANTENNA ELEVATION DEGREE 2 -9000 15 DEGREE 2 5
+ 002136 RANGE PROCESSED BY RANGE ATTENUATION CORRECTION M -3 0 16 M -3 5
+ 002140 SATELLITE RADAR BEAM AZIMUTH ANGLE DEGREE 0 0 9 DEGREE 0 3
+ 002141 MEASUREMENT TYPE CCITTIA5 0 0 24 CHARACTER 0 3
+ 002142 OZONE INSTRUMENT SERIAL NUMBER/ IDENTIFICATION CCITTIA5 0 0 32 CHARACTER 0 4
+ 002143 OZONE INSTRUMENT TYPE CODE TABLE 2143 0 0 7 CODE TABLE 2143 0 3
+ 002144 LIGHT SOURCE TYPE FOR BREWER SPECTRO PHOTOMETER CODE TABLE 2144 0 0 4 CODE TABLE 2144 0 2
+ 002145 WAVE LENGTH SETTING FOR DOBSON INSTRUMENTS CODE TABLE 2145 0 0 4 CODE TABLE 2145 0 2
+ 002146 SOURCE CONDITIONS FOR DOBSON INSTRUMENTS CODE TABLE 2146 0 0 4 CODE TABLE 2146 0 2
+ 002148 DATA COLLECTION AND/OR LOCATION SYSTEM CODE TABLE 2148 0 0 5 CODE TABLE 2148 0 2
+ 002149 TYPE OF DATA BUOY CODE TABLE 2149 0 0 6 CODE TABLE 2149 0 2
+ 002150 TOVS/ATOVS/AVHRR INSTRUMENTATION CHANNEL NUMBER CODE TABLE 2150 0 0 6 CODE TABLE 2150 0 2
+ 002151 RADIOMETER IDENTIFIER CODE TABLE 2151 0 0 11 CODE TABLE 2151 0 4
+ 002152 SATELLITE INSTRUMENT USED IN DATA PROCESSING(6) FLAG TABLE 2152 0 0 31 FLAG TABLE 2152 0 10
+ 002153 SATELLITE CHANNEL CENTRE FREQUENCY Hz -8 0 26 Hz -8 8
+ 002154 SATELLITE CHANNEL BAND WIDTH Hz -8 0 26 Hz -8 8
+ 002156 (CBS) PERCENTAGE OF VALID KU OCEAN RETRACKER MEASUREMENTS % 0 0 7 % 0 3
+ 002157 (CBS) PERCENTAGE OF VALID S OCEAN RETRACKER MEASUREMENTS % 0 0 7 % 0 3
+ 002158 (CBS) RA-2 INSTRUMENT FLAG TABLE 2158 0 0 9 FLAG TABLE 2158 0 3
+ 002159 (CBS) MWR INSTRUMENT FLAG TABLE 2159 0 0 8 FLAG TABLE 2159 0 3
+ 002163 HEIGHT ASSIGNMENT METHOD CODE TABLE 2163 0 0 4 CODE TABLE 2163 0 2
+ 002164 TRACER CORRELATION METHOD CODE TABLE 2164 0 0 3 CODE TABLE 2164 0 1
+ 002166 RADIANCE TYPE CODE TABLE 2166 0 0 4 CODE TABLE 2166 0 2
+ 002167 RADIANCE COMPUTATIONAL METHOD CODE TABLE 2167 0 0 4 CODE TABLE 2167 0 2
+ 002168 HYDROSTATIC PRESSURE OF LOWER END OF CABLE (THERMISTOR STRING) PA -3 0 16 KPA 0 5
+ 002169 ANEMOMETER TYPE CODE TABLE 2169 0 0 4 CODE TABLE 2169 0 2
+ 002172 PRODUCT TYPE FOR RETRIEVED ATMOSPHERIC GASES CODE TABLE 2172 0 0 8 CODE TABLE 2172 0 3
+ 002173 SQUARE OF THE OFF NADIR ANGLE (7) DEGREE2 4 0 10 DEGREE2 4 4
+ 002174 (CBS) MEAN ACROSS TRACK PIXEL NUMBER NUMERIC 0 0 9 NUMERIC 0 3
+ 002175 METHOD OF PRECIPITATION MEASUREMENT CODE TABLE 2175 0 0 4 CODE TABLE 2175 0 2
+ 002176 METHOD OF STATE OF GROUND MEASUREMENT CODE TABLE 2176 0 0 4 CODE TABLE 2176 0 2
+ 002177 METHOD OF SNOW DEPTH MEASUREMENT CODE TABLE 2177 0 0 4 CODE TABLE 2177 0 2
+ 002178 METHOD OF LIQUID CONTENT MEASUREMENT OF PRECIPITATION CODE TABLE 2178 0 0 4 CODE TABLE 2178 0 2
+ 002179 TYPE OF SKY CONDITION ALGORITHM CODE TABLE 2179 0 0 4 CODE TABLE 2179 0 2
+ 002180 MAIN PRESENT WEATHER DETECTING SYSTEM CODE TABLE 2180 0 0 4 CODE TABLE 2180 0 2
+ 002181 SUPPLEMENTARY PRESENT WEATHER SENSOR FLAG TABLE 2181 0 0 21 FLAG TABLE 2181 0 7
+ 002182 VISIBILITY MEASUREMENT SYSTEM CODE TABLE 2182 0 0 4 CODE TABLE 2182 0 2
+ 002183 CLOUD DETECTION SYSTEM CODE TABLE 2183 0 0 4 CODE TABLE 2183 0 2
+ 002184 TYPE OF LIGHTNING DETECTION SENSOR CODE TABLE 2184 0 0 4 CODE TABLE 2184 0 2
+ 002185 METHOD OF EVAPORATION MEASUREMENT CODE TABLE 2185 0 0 4 CODE TABLE 2185 0 2
+ 002186 CAPABILITY TO DETECT PRECIPITATION PHENOMENA FLAG TABLE 2186 0 0 30 FLAG TABLE 2186 0 10
+ 002187 CAPABILITY TO DETECT OTHER WEATHER PHENOMENA FLAG TABLE 2187 0 0 18 FLAG TABLE 2187 0 6
+ 002188 CAPABILITY TO DETECT OBSCURATION FLAG TABLE 2188 0 0 21 FLAG TABLE 2188 0 7
+ 002189 CAPABILITY TO DISCRIMINATE LIGHTNING STRIKES FLAG TABLE 2189 0 0 12 FLAG TABLE 2189 0 4
+ 002190 LAGRANGIAN DRIFTER SUBMERGENCE (% TIME SUBMERGED) % 0 0 7
+ 002192 SAR AZIMUTH ANGLE DEGREE 0 0 9
+ 002193 1D VAR SATELLITE CHANNEL(S) USED FLAG TABLE 2193 0 0 28
+ 002194 CONSTANT LEVEL BALLOON TYPE CODE TABLE 2194 0 0 4
+ 002195 TYPE OF SATELLITE INSTRUMENTATION CODE TABLE 2195 0 0 4
+ 002196 SATELLITE CLASSIFICATION CODE TABLE 2196 0 0 9
+ 002197 SATELLITE CHANNEL CENTRE FREQUENCY Hz -8 0 26
+ 002198 SATELLITE CHANNEL BAND WIDTH Hz -8 0 26
+ 002199 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2199 0 0 4
+ 002201 SIMULATED SATELLITE INSTRUMENT FLAG TABLE 2201 0 0 4
+ 002202 SIMULATED DATA PROCESSING TECHNIQUE USED FLAG TABLE 2202 0 0 4
+ 002220 DATA PRODUCER CODE TABLE 2220 0 0 9
+ 002221 SEGMENT SIZE AT NADIR IN X DIRECTION M 0 0 18
+ 002222 SEGMENT SIZE AT NADIR IN Y DIRECTION M 0 0 18
+ 002223 TOVS/ATOVS/AVHRR CHANNEL NUMBER CODE TABLE 2223 0 0 6
+ 002231 HEIGHT ASSIGNMENT METHOD CODE TABLE 2231 0 0 4
+ 002232 TRACER CORRELATION METHOD CODE TABLE 2232 0 0 3
+ 002240 TYPE OF TERMODYNAMIC SENSING CODE TABLE 2240 0 0 8
+ 002241 TYPE OF ROCKET MOTOR CODE TABLE 2241 0 0 3
+ 002242 TYPE OF WIND SENSING EQUIPMENT CODE TABLE 2242 0 0 8
+ 002243 TERMODYNAMIC CORRECTION TECHNIQUE CODE TABLE 2243 0 0 3
+ 002244 WIND CORRECTION TECHNIQUE CODE TABLE 2244 0 0 3
+ 002245 METHOD OF REDUCING OF DATA CODE TABLE 2245 0 0 4
+ 002251 RADIANCE COMPUTATIONAL METHOD CODE TABLE 2251 0 0 4
+ 002252 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 2252 0 0 31
+ 002253 HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2253 0 0 8
+ 002254 RADIANCE TYPE CODE TABLE 2254 0 0 4
+ 004001 YEAR YEAR 0 0 12 YEAR 0 4
+ 004002 MONTH MONTH 0 0 4 MONTH 0 2
+ 004003 DAY DAY 0 0 6 DAY 0 2
+ 004004 HOUR HOUR 0 0 5 HOUR 0 2
+ 004005 MINUTE MINUTE 0 0 6 MINUTE 0 2
+ 004006 SECOND SECOND 0 0 6 SECOND 0 2
+ 004007 SECONDS WITHIN A MINUTE (MICROSECOND ACCURACY) SECOND 6 0 26 S 6 8
+ 004011 TIME INCREMENT YEAR 0 -1024 11 YEAR 0 4
+ 004012 TIME INCREMENT MONTH 0 -1024 11 MONTH 0 4
+ 004013 TIME INCREMENT DAY 0 -1024 11 DAY 0 4
+ 004014 TIME INCREMENT HOUR 0 -1024 11 HOUR 0 4
+ 004015 TIME INCREMENT MINUTE 0 -2048 12 MINUTE 0 4
+ 004016 TIME INCREMENT SECOND 0 -4096 13 SECOND 0 4
+ 004017 REFERENCE TIME PERIOD FOR ACCUMULATED OR EXTREME DATA MINUTE 0 -1440 12 MINUTE 0 4
+ 004021 TIME PERIOD OR DISPLACEMENT YEAR 0 -1024 11 YEAR 0 4
+ 004022 TIME PERIOD OR DISPLACEMENT MONTH 0 -1024 11 MONTH 0 4
+ 004023 TIME PERIOD OR DISPLACEMENT DAY 0 -1024 11 DAY 0 4
+ 004024 TIME PERIOD OR DISPLACEMENT HOUR 0 -2048 12 HOUR 0 4
+ 004025 TIME PERIOD OR DISPLACEMENT MINUTE 0 -2048 12 MINUTE 0 4
+ 004026 TIME PERIOD OR DISPLACEMENT SECOND 0 -4096 13 SECOND 0 4
+ 004031 DURATION OF TIME RELATING TO FOLLOWING VALUE HOUR 0 0 8 HOUR 0 3
+ 004032 DURATION OF TIME RELATING TO FOLLOWING VALUE MINUTE 0 0 6 MINUTE 0 2
+ 004041 TIME DIFFERENCE, UTC -LMT (SEE NOTE 6) MINUTE 0 -1440 12 MINUTE 0 4
+ 004043 DAY OF THE YEAR DAY 0 0 9 DAY 0 3
+ 004051 PRINCIPAL TIME OF DAILY READING OF MAXIMUM TEMPERATURE HOUR 0 0 5 HOUR 0 2
+ 004052 PRINCIPAL TIME OF DAILY READING OF MINIMUM TEMPERATURE HOUR 0 0 5 HOUR 0 2
+ 004053 NUMBER OF DAYS WITH PRECIPITATION EQUAL TO OR MORE THAN 1 MM NUMERIC 0 0 6 NUMERIC 0 2
+ 004059 TIMES OF OBSERVATION USED TO COMPUTE THE REPORTED MEAN VALUES FLAG TABLE 4059 0 0 6 FLAG TABLE 4059 0 2
+ 004065 SHORT TIME INCREMENT MINUTE 0 -128 8 MINUTE 0 2
+ 004073 SHORT TIME PERIOD OR DISPLACEMENT DAY 0 -128 8 DAY 0 2
+ 004074 SHORT TIME PERIOD OR DISPLACEMENT HOUR 0 -128 8 HOUR 0 2
+ 004075 SHORT TIME PERIOD OR DISPLACEMENT MINUTE 0 -128 8 MINUTE 0 2
+ 004086 (CBS) LONG TIME PERIOD OR DISPLACEMENT SECOND 0 -8192 15 SECOND 0 5
+ 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005011 LATITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005012 LATITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005015 (CBS) LATITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005016 (CBS) LATITUDE DISPLACEMENT (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 005023 (CBS) SUN TO SATELLITE AZIMUTH DIFFERENCE DEGREE 1 -1800 12 DEGREE 1 4
+ 005030 DIRECTION (SPECTRAL) DEGREE 0 0 12 DEGREE 0 4
+ 005031 ROW NUMBER NUMERIC 0 0 12 NUMERIC 0 4
+ 005033 PIXEL SIZE ON HORIZONTAL - 1 M -1 0 16 M -1 5
+ 005034 ALONG TRACK ROW NUMBER NUMERIC 0 0 11 NUMERIC 0 4
+ 005036 SHIP TRANSECT NUMBER ACCORDING TO SOOP NUMERIC 0 0 7 NUMERIC 0 2
+ 005040 ORBIT NUMBER NUMERIC 0 0 24 NUMERIC 0 8
+ 005041 SCAN LINE NUMBER NUMERIC 0 0 8 NUMERIC 0 3
+ 005042 CHANNEL NUMBER NUMERIC 0 0 6 NUMERIC 0 2
+ 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8 NUMERIC 0 3
+ 005044 SATELLITE CYCLE NUMBER NUMERIC 0 0 11 NUMERIC 0 4
+ 005052 CHANNEL NUMBER INCREMENT NUMERIC 0 0 5 NUMERIC 0 2
+ 005053 FIELD OF VIEW NUMBER INCREMENT NUMERIC 0 0 5 NUMERIC 0 2
+ 005193 ALONG TRACK ROW NUMBER AT 50 KM NUMERIC 0 0 10
+ 005194 ALONG TRACK ROW NUMBER AT 25 KM NUMERIC 0 0 11
+ 005195 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 7
+ 005217 LOCATION OF PLATFORM, X M 2 -1073741824 31
+ 005232 DIRECTION (SPECTRAL) DEGREE 2 0 16
+ 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006011 LONGITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006012 LONGITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006015 (CBS) LONGITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006016 (CBS) LONGITUDE DISPLACEMENT (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006021 DISTANCE M -1 0 13 M -1 4
+ 006030 WAVE NUMBER (SPECTRAL) RAD/M 5 0 13 RAD/M 5 4
+ 006031 COLUMN NUMBER NUMERIC 0 0 12 NUMERIC 0 4
+ 006033 PIXEL SIZE ON HORIZONTAL - 2 M -1 0 16 M -1 5
+ 006034 CROSS-TRACK CELL NUMBER NUMERIC 0 0 7 NUMERIC 0 3
+ 006040 RADIUS OF CONFIDENCE M 0 0 13 M 0 4
+ 006193 CROSS TRACK CELL NUMBER AT 50 KM NUMERIC 0 0 6
+ 006194 CROSS TRACK CELL NUMBER AT 25 KM NUMERIC 0 0 7
+ 006217 LOCATION OF PLATFORM, Y M 2 -1073741824 31
+ 006232 WAVENUMBER (SPECTRAL) RADS/M 5 0 13
+ 007001 HEIGHT OF STATION (SEE NOTE 1) M 0 -400 15 M 0 5
+ 007002 HEIGHT OR ALTITUDE M -1 -40 16 M -1 5
+ 007003 GEOPOTENTIAL M**2/S**2 -1 -400 17 M**2/S**2 -1 6
+ 007004 PRESSURE PA -1 0 14 PA -1 5
+ 007005 HEIGHT INCREMENT M 0 -400 12 M 0 4
+ 007006 HEIGHT ABOVE STATION M 0 0 15 M 0 5
+ 007007 HEIGHT M 0 -1000 17 M 0 6
+ 007008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7
+ 007009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17 GPM 0 5
+ 007010 FLIGHT LEVEL M 0 -1024 16 FT -1 5
+ 007021 ELEVATION (SEE NOTE 2) DEGREE 2 -9000 15 DEGREE 2 5
+ 007022 SOLAR ELEVATION DEGREE 2 -9000 15 DEGREE 2 5
+ 007024 SATELLITE ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 007025 SOLAR ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 007026 (CBS) SATELLITE ZENITH ANGLE DEGREE 4 -900000 21 DEGREE 4 7
+ 007030 HEIGHT OF STATION GROUND ABOVE MEAN SEA LEVEL (SEE NOTE 3) M 1 - 4000 17 M 1 5
+ 007031 HEIGHT OF BAROMETER ABOVE MEAN SEA LEVEL (SEE NOTE 4) M 1 - 4000 17 M 1 5
+ 007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM) M 2 0 16 M 2 5
+ 007033 HEIGHT OF SENSOR ABOVE WATER SURFACE (SEE NOTE 6) M 1 0 12 M 1 4
+ 007040 (CBS) IMPACT PARAMETER (SEE NOTE 10) M 1 62000000 22 M 1 8
+ 007061 DEPTH BELOW LAND SURFACE M 2 0 14 M 2 5
+ 007062 DEPTH BELOW SEA/WATER SURFACE M 1 0 17 M 1 6
+ 007064 REPRESENTATIVE HEIGHT OF SENSOR ABOVE STATION (SEE NOTE 7) M 0 0 4 M 0 2
+ 007065 (VAL) REPRESENTATIVE HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DEC M 2 0 16 M 2 5
+ 007066 (VAL) REPRESENTATIVE HEIGHT OF SENSOR ABOVE WATER SURFACE (SEE M 1 0 12 M 1 4
+ 007070 DROGUE DEPTH M 0 0 10 M 0 4
+ 007190 HEIGHT INCREMENT M 1 -1024 12
+ 007217 LOCATION OF PLATFORM, Z M 2 -1073741824 31
+ 008001 VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8001 0 0 7 FLAG TABLE 8001 0 3
+ 008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS) CODE TABLE 8002 0 0 6 CODE TABLE 8002 0 2
+ 008003 VERTICAL SIGNIFICANCE (SATELLITE OBSERVATIONS) CODE TABLE 8003 0 0 6 CODE TABLE 8003 0 2
+ 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 8004 0 0 3 CODE TABLE 8004 0 1
+ 008005 METEOROLOGICAL ATTRIBUTE SIGNIFICANCE CODE TABLE 8005 0 0 4 CODE TABLE 8005 0 2
+ 008006 OZONE VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8006 0 0 9 FLAG TABLE 8006 0 3
+ 008007 DIMENSIONAL SIGNIFICANCE CODE TABLE 8007 0 0 4 CODE TABLE 8007 0 2
+ 008008 RADIATION VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8008 0 0 9 FLAG TABLE 8008 0 3
+ 008009 DETAILED PHASE OF FLIGHT CODE TABLE 8009 0 0 4 CODE TABLE 8009 0 2
+ 008010 SURFACE QUALIFIER (TEMPERATURE DATA) CODE TABLE 8010 0 0 5 CODE TABLE 8010 0 2
+ 008011 METEOROLOGICAL FEATURE CODE TABLE 8011 0 0 6 CODE TABLE 8011 0 2
+ 008012 LAND/SEA QUALIFIER CODE TABLE 8012 0 0 2 CODE TABLE 8012 0 1
+ 008013 DAY/NIGHT QUALIFIER CODE TABLE 8013 0 0 2 CODE TABLE 8013 0 1
+ 008014 QUALIFIER FOR RUNWAY VISUAL RANGE CODE TABLE 8014 0 0 4 CODE TABLE 8014 0 2
+ 008016 CHANGE QUALIFIER OF A TREND-TYPE FORECAST OR AN AERODROME FORECA CODE TABLE 8016 0 0 3 CODE TABLE 8016 0 1
+ 008017 QUALIFIER OF THE TIME WHEN THE FORECAST CHANGE IS EXPECTED CODE TABLE 8017 0 0 2 CODE TABLE 8017 0 1
+ 008018 SEAWINDS LAND/ICE SURFACE TYPE FLAG TABLE 8018 0 0 17 FLAG TABLE 8018 0 6
+ 008019 (VAL) QUALIFIER FOR FOLLOWING CENTRE IDENTIFIER CODE TABLE 8019 0 0 4 CODE TABLE 8019 0 2
+ 008020 TOTAL NUMBER OF MISSING ENTITIES (WITH RESPECT TO ACCUMULATION O NUMERIC 0 0 16 NUMERIC 0 5
+ 008021 TIME SIGNIFICANCE CODE TABLE 8021 0 0 5 CODE TABLE 8021 0 2
+ 008022 TOTAL NUMBER (WITH RESPECT TO ACCUMULATION OR AVERAGE) NUMERIC 0 0 16 NUMERIC 0 5
+ 008023 FIRST ORDER STATISTICS CODE TABLE 8023 0 0 6 CODE TABLE 8023 0 2
+ 008024 DIFFERENCE STATISTICS CODE TABLE 8024 0 0 6 CODE TABLE 8024 0 2
+ 008025 TIME DIFFERENCE QUALIFIER CODE TABLE 8025 0 0 4 CODE TABLE 8025 0 2
+ 008030 MANUAL ON CODES (VOLUME I.1, SECTION C) CODE TABLE FROM WHICH DA NUMERIC 0 0 13 NUMERIC 0 4
+ 008031 DATA CATEGORY CREX TABLE A NUMERIC 0 0 8 NUMERIC 0 3
+ 008033 METHOD OF DERIVATION OF PERCENTAGE CONFIDENCE CODE TABLE 8033 0 0 7 CODE TABLE 8033 0 3
+ 008035 TYPE OF MONITORING EXERCISE CODE TABLE 8035 0 0 3 CODE TABLE 8035 0 1
+ 008036 TYPE OF CENTRE OR STATION PERFORMING MONITORING CODE TABLE 8036 0 0 3 CODE TABLE 8036 0 1
+ 008040 FLIGHT LEVEL SIGNIFICANCE CODE TABLE 8040 0 0 6 CODE TABLE 8040 0 2
+ 008041 DATA SIGNIFICANCE CODE TABLE 8041 0 0 5 CODE TABLE 8041 0 2
+ 008042 (CBS) EXTENDED VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8042 0 0 18 FLAG TABLE 8042 0 6
+ 008049 (CBS) NUMBER OF OBSERVATIONS NUMERIC 0 0 8 NUMERIC 0 3
+ 008050 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 8050 0 0 4 CODE TABLE 8050 0 2
+ 008051 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 8051 0 0 3 CODE TABLE 8051 0 1
+ 008052 CONDITION FOR WHICH NUMBER OF DAYS OF OCCURRENCE FOLLOWS CODE TABLE 8052 0 0 5 CODE TABLE 8052 0 2
+ 008053 DAY OF OCCURRENCE QUALIFIER CODE TABLE 8053 0 0 2 CODE TABLE 8053 0 1
+ 008060 SAMPLE SCANNING MODE SIGNIFICANCE CODE TABLE 8060 0 0 4 CODE TABLE 8060 0 2
+ 008065 (CBS) SUN-GLINT INDICATOR CODE TABLE 8065 0 0 2 CODE TABLE 8065 0 1
+ 008066 (CBS) SEMI-TRANSPARENCY INDICATOR CODE TABLE 8066 0 0 2 CODE TABLE 8066 0 1
+ 008070 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8070 0 0 4 CODE TABLE 8070 0 2
+ 008072 PIXEL(S) TYPE CODE TABLE 8072 0 0 3 CODE TABLE 8072 0 1
+ 008074 ALTIMETER ECHO TYPE CODE TABLE 8074 0 0 2 CODE TABLE 8074 0 1
+ 008075 ASCENDING/DESCENDING ORBIT QUALIFIER CODE TABLE 8075 0 0 2 CODE TABLE 8075 0 1
+ 008076 TYPE OF BAND CODE TABLE 8076 0 0 6 CODE TABLE 8076 0 2
+ 008079 (VAL) CHANGE IN STATUS OF FOLLOWING PRODUCT CODE TABLE 8079 0 0 3 CODE TABLE 8079 0 1
+ 008081 (CBS) TYPE OF EQUIPMENT CODE TABLE 8081 0 0 6 CODE TABLE 8081 0 2
+ 008082 (CBS) ARTIFICIAL CORRECTION OF SENSOR HEIGHT TO ANOTHER VALUE CODE TABLE 8082 0 0 3 CODE TABLE 8082 0 1
+ 008083 (VAL) NOMINAL VALUE INDICATOR FLAG TABLE 8083 0 0 15 FLAG TABLE 8083 0 5
+ 008193 TIME QUALIFIER CODE TABLE 8193 0 0 6
+ 008194 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8194 0 0 4
+ 008195 DATA TYPE CODE TABLE 8195 0 0 7
+ 008200 NUMBER OF OBSERVATIONS NUMERIC 0 0 8
+ 008222 GENERATOR SIGNIFICANCE CODE TABLE 8222 0 0 4
+ 008223 LAND/ICE SURFACE FLAG FLAG TABLE 8223 0 0 7
+ 008224 LAND/SEA FRACTION NUMERIC 3 0 10
+ 010001 HEIGHT OF LAND SURFACE M 0 -400 15 M 0 5
+ 010002 HEIGHT M -1 -40 16 M -1 5
+ 010003 GEOPOTENTIAL M**2/S**2 -1 -400 17 M**2/S**2 -1 6
+ 010004 PRESSURE PA -1 0 14 PA -1 5
+ 010007 HEIGHT M 0 -1000 17 M 0 6
+ 010008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7
+ 010009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17 GPM 0 5
+ 010010 MINIMUM PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010011 MAXIMUM PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010031 IN DIRECTION OF THE NORTH POLE, DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31 M 2 10
+ 010032 (CBS) SATELLITE DISTANCE TO EARTH'S CENTRE M 1 0 27 M 2 9
+ 010033 (CBS) ALTITUDE (PLATFORM TO ELLIPSOID) M 1 0 27 M 2 9
+ 010034 (CBS) EARTH RADIUS M 1 0 27 M 2 9
+ 010035 (CBS) EARTH'S LOCAL RADIUS OF CURVATURE M 1 62000000 22 M 1 8
+ 010036 (CBS) GEOID UNDULATION (SEE NOTE 4) M 2 -15000 15 M 2 6
+ 010040 NUMBER OF RETRIEVED LAYERS NUMERIC 0 0 10 NUMERIC 0 4
+ 010050 STANDARD DEVIATION ALTITUDE M 2 0 16 M 2 5
+ 010051 PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010052 ALTIMETER SETTING (QNH) PA -1 0 14 PA -1 5
+ 010060 PRESSURE CHANGE PA -1 -1024 11 PA -1 4
+ 010061 3-HOUR PRESSURE CHANGE PA -1 -500 10 PA -1 4
+ 010062 24-HOUR PRESSURE CHANGE PA -1 -1000 11 PA -1 4
+ 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 10063 0 0 4 CODE TABLE 10063 0 2
+ 010064 (VAL) SIGMET CRUISING LEVEL CODE TABLE 10064 0 0 3 CODE TABLE 10064 0 1
+ 010070 INDICATED AIRCRAFT ALTITUDE M 0 -400 16 M 0 5
+ 010080 (CBS) VIEWING ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 010081 (CBS) ALTITUDE OF COG ABOVE REFERENCE ELLIPSOID M 3 0 31 M 3 10
+ 010082 (CBS) INSTANTANEOUS ALTITUDE RATE MS-1 3 -65536 17 MS-1 3 6
+ 010083 (CBS) OFF NADIR ANGLE OF THE SATELLITE FROM PLATFORM DATA DEGREE 2 -36000 17 DEGREE 2 6
+ 010084 (CBS) OFF NADIR ANGLE OF THE SATELLITE FROM WAVEFORM DATA DEGREE 2 -36000 17 DEGREE 2 6
+ 010085 (CBS) MEAN SEA SURFACE HEIGHT M 3 -131072 18 M 3 6
+ 010086 (CBS) GEOID'S HEIGHT M 3 -131072 18 M 3 6
+ 010087 (CBS) OCEAN DEPTH/LAND ELEVATION M 1 -131072 18 M 3 6
+ 010088 (CBS) TOTAL GEOCENTRIC OCEAN TIDE HEIGHT SOLUTION 1 M 3 -32768 16 M 3 5
+ 010089 (CBS) TOTAL GEOCENTRIC OCEAN TIDE HEIGHT SOLUTION 2 M 3 -32768 16 M 3 5
+ 010090 (CBS) LONG PERIOD TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010091 (CBS) TIDAL LOADING HEIGHT M 3 -32768 16 M 3 5
+ 010092 (CBS) SOLID EARTH TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010093 (CBS) GEOCENTRIC POLE TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010195 HEIGHT(HIGH ACCURACY) M 1 -4096 20
+ 010196 SOLAR ZENITH ANGLE DEGREE 2 -9000 15
+ 010197 ANEMOMETER HEIGHT M 0 0 9
+ 011001 WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011002 WIND SPEED M/S 1 0 12 M/S 1 4
+ 011003 U-COMPONENT M/S 1 -4096 13 M/S 1 4
+ 011004 V-COMPONENT M/S 1 -4096 13 M/S 1 4
+ 011005 W-COMPONENT PA/S 1 -512 10 PA/S 1 4
+ 011006 W-COMPONENT M/S 2 -4096 13 M/S 2 4
+ 011010 WIND DIRECTION ASSOCIATED WITH WIND SPEED WHICH FOLLOWS DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011011 WIND DIRECTION AT 10 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011012 WIND SPEED AT 10 M M/S 1 0 12 M/S 1 4
+ 011013 WIND DIRECTION AT 5 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011014 WIND SPEED AT 5 M M/S 1 0 12 M/S 1 4
+ 011016 EXTREME COUNTERCLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011017 EXTREME CLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011019 STEADINESS OF WIND (6) % 0 0 7 % 0 3
+ 011021 RELATIVE VORTICITY 1/S 9 -65536 17 1/S 9 6
+ 011022 DIVERGENCE 1/S 9 -65536 17 1/S 9 6
+ 011023 VELOCITY POTENTIAL M**2/S -2 -65536 17 M**2/S -2 6
+ 011030 (VAL) EXTENDED DEGREE OF TURBULENCE CODE TABLE 11030 0 0 6 CODE TABLE 11030 0 2
+ 011031 DEGREE OF TURBULENCE CODE TABLE 11031 0 0 4 CODE TABLE 11031 0 2
+ 011032 HEIGHT OF BASE OF TURBULENCE M -1 -40 16 M -1 5
+ 011033 HEIGHT OF TOP OF TURBULENCE M -1 -40 16 M -1 5
+ 011034 VERTICAL GUST VELOCITY M/S 1 -1024 11 M/S 1 4
+ 011035 VERTICAL GUST ACCELERATION M/S**2 2 -8192 14 M/S**2 2 5
+ 011036 MAXIMUM DERIVED EQUIVALENT VERTICAL GUST SPEED M/S 1 0 10 M/S 1 4
+ 011037 TURBULENCE INDEX CODE TABLE 11037 0 0 6 CODE TABLE 11037 0 2
+ 011038 TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11038 0 0 5 CODE TABLE 11038 0 2
+ 011039 EXTENDED TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11039 0 0 6 CODE TABLE 11039 0 2
+ 011040 MAXIMUM WIND SPEED (MEAN WIND) M/S 1 0 12 M/S 1 4
+ 011041 MAXIMUM WIND GUST SPEED M/S 1 0 12 M/S 1 4
+ 011042 MAXIMUM WIND SPEED (10-MIN MEAN WIND) M/S 1 0 12 M/S 1 4
+ 011043 MAXIMUM WIND GUST DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011044 MEAN WIND DIRECTION FOR SURFACE - 1500 M (5000 FEET) DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011045 MEAN WIND SPEED FOR SURFACE - 1500 M (5000 FEET) M/S 1 0 12 M/S 1 4
+ 011046 MAXIMUM INSTANTANEOUS WIND SPEED M/S 1 0 12 M/S 1 4
+ 011047 MAXIMUM INSTANTANEOUS WIND SPEED OVER 10 MINUTES M/S 1 0 12 M/S 1 4
+ 011049 STANDARD DEVIATION OF WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011050 STANDARD DEVIATION OF HORIZONTAL WIND SPEED M/S 1 0 12 M/S 1 4
+ 011051 STANDARD DEVIATION OF VERTICAL WIND SPEED M/S 1 0 8 M/S 1 3
+ 011052 FORMAL UNCERTAINTY IN WIND SPEED M/S 2 0 13 M/S 2 5
+ 011053 FORMAL UNCERTAINTY IN WIND DIRECTION DEGREE TRUE 2 0 15 DEGREE TRUE 2 5
+ 011061 ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW M/S 1 0 12 M/S 1 4
+ 011062 ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE M/S 1 0 12 M/S 1 4
+ 011070 DESIGNATOR OF THE RUNWAY AFFECTED BY WIND SHEAR (INCLUDING ALL) CCITTIA5 0 0 32 CHARACTER 0 4
+ 011071 TURBULENT VERTICAL MOMENTUM FLUX M**2/S**2 3 -128 14 M**2/S**2 3 5
+ 011072 TURBULENT VERTICAL BUOYANCY FLUX KM/S 3 -128 11 KM/S 3 4
+ 011073 TURBULENT KINETIC ENERGY M**2/S**2 2 -1024 13 M**2/S**2 2 4
+ 011074 DISSIPATION ENERGY M**2/S**2 2 -1024 10 M**2/S**2 2 4
+ 011075 MEAN TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3
+ 011076 PEAK TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3
+ 011077 REPORTING INTERVAL OR AVERAGING TIME FOR EDDY DISSIPATION RATE S 0 0 12 S 0 4
+ 011081 MODEL WIND DIRECTION AT 10M DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 011082 MODEL WIND SPEED AT 10M M/S 2 0 14 M/S 2 4
+ 011095 (CBS) U COMPONENT OF THE MODEL WIND VECTOR M/S 1 -4096 13 M/S 1 4
+ 011096 (CBS) V COMPONENT OF THE MODEL WIND VECTOR M/S 1 -4096 13 M/S 1 4
+ 011192 U - COMPONENT AT 10 M M/S 1 -4096 13
+ 011193 V - COMPONENT AT 10 M M/S 1 -4096 13
+ 011194 W - COMPONENT AT 10 M M/S 1 -4096 13
+ 011195 STEADINESS OF WIND % 0 0 7
+ 011196 FRICTION VELOCITY M/S 5 0 19
+ 011201 HORIZONTAL LINE OF SIGHT COMPONENT M/S 1 -4096 13
+ 011210 1D VAR WIND SPEED RETREIVED ERRO(S) M/S 2 0 12
+ 011211 WIND SPEED INDEPENDENT ESTIMATE OF ERROR(S) M/S 2 0 12
+ 011220 FORMAL UNCERTAINTY IN WIND SPEED M/S 2 0 12
+ 011221 FORMAL UNCERTAINTY IN WIND DIRECTION DEGREE TRUE 2 0 15
+ 011230 MAXIMUM MEAN WIND SPEED M/S 1 -4096 13
+ 011231 MEAN WIND SPEED M/S 1 -4096 13
+ 011232 MINIMUM MEAN WIND SPEED M/S 1 -4096 13
+ 011233 HIGHEST GUST DURING THE 10 MINUTE PERIOD PRECEDING OBSERVATION M/S 1 -4096 13
+ 012001 TEMPERATURE/DRY-BULB TEMPERATURE K 1 0 12 C 1 3
+ 012002 WET-BULB TEMPERATURE K 1 0 12 C 1 3
+ 012003 DEW-POINT TEMPERATURE K 1 0 12 C 1 3
+ 012004 DRY-BULB TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012005 WET-BULB TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012006 DEW-POINT TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012007 VIRTUAL TEMPERATURE K 1 0 12 C 1 3
+ 012011 MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12 C 1 3
+ 012012 MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12 C 1 3
+ 012013 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS K 1 0 12 C 1 3
+ 012014 MAXIMUM TEMPERATURE AT 2 M, PAST 12 HOURS K 1 0 12 C 1 3
+ 012015 MINIMUM TEMPERATURE AT 2 M, PAST 12 HOURS K 1 0 12 C 1 3
+ 012016 MAXIMUM TEMPERATURE AT 2 M, PAST 24 HOURS K 1 0 12 C 1 3
+ 012017 MINIMUM TEMPERATURE AT 2 M, PAST 24 HOURS K 1 0 12 C 1 3
+ 012021 MAXIMUM TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012022 MINIMUM TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012030 SOIL TEMPERATURE K 1 0 12 C 1 3
+ 012049 (VAL) TEMPERATURE CHANGE OVER SPECIFIED PERIOD K 0 -30 6 C 0 2
+ 012051 STANDARD DEVIATION TEMPERATURE K 1 0 10 C 1 3
+ 012052 HIGHEST DAILY MEAN TEMPERATURE K 1 0 12 C 1 3
+ 012053 LOWEST DAILY MEAN TEMPERATURE K 1 0 12 C 1 3
+ 012061 SKIN TEMPERATURE K 1 0 12 C 1 3
+ 012062 EQUIVALENT BLACK BODY TEMPERATURE K 1 0 12 C 1 3
+ 012063 BRIGHTNESS TEMPERATURE K 1 0 12 C 1 3
+ 012064 INSTRUMENT TEMPERATURE K 1 0 12 K 1 4
+ 012065 STANDARD DEVIATION BRIGHTNESS TEMPERATURE K 1 0 12 K 1 4
+ 012070 WARM LOAD TEMPERATURE K 2 0 16 K 2 5
+ 012071 COLDEST CLUSTER TEMPERATURE K 1 0 12 K 1 4
+ 012072 RADIANCE WM**(-2)SR**(-1) 6 0 31 WM**(-2)SR**(-1) 6 9
+ 012075 SPECTRAL RADIANCE WM**(-3)SR**(-1) -3 0 16 WM**(-3)SR**(-1) -3 5
+ 012076 RADIANCE WM**(-2)SR**(-1) 3 0 16 WM**(-2)SR**(-1) 3 5
+ 012101 TEMPERATURE/DRY-BULB TEMPERATURE K 2 0 16 C 2 4
+ 012102 WET-BULB TEMPERATURE K 2 0 16 C 2 4
+ 012103 DEW-POINT TEMPERATURE K 2 0 16 C 2 4
+ 012104 DRY-BULB TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012105 WEB-BULB TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012106 DEW-POINT TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012107 VIRTUAL TEMPERATURE K 2 0 16 C 2 4
+ 012111 MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 2 0 16 C 2 4
+ 012112 MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 2 0 16 C 2 4
+ 012113 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS K 2 0 16 C 2 4
+ 012114 MAXIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 2 0 16 C 2 4
+ 012115 MINIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 2 0 16 C 2 4
+ 012116 MAXIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 2 0 16 C 2 4
+ 012117 MINIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 2 0 16 C 2 4
+ 012118 MAXIMUM TEMPERATURE AT HEIGHT SPECIFIED, PAST 24 HOURS K 2 0 16 C 2 4
+ 012119 MINIMUM TEMPERATURE AT HEIGHT SPECIFIED, PAST 24 HOURS K 2 0 16 C 2 4
+ 012130 SOIL TEMPERATURE K 2 0 16 C 2 4
+ 012151 STANDARD DEVIATION OF DAILY MEAN TEMPERATURE K 2 0 12 C 2 4
+ 012152 HIGHEST DAILY MEAN TEMPERATURE K 2 0 16 C 2 4
+ 012153 LOWEST DAILY MEAN TEMPERATURE K 2 0 16 C 2 4
+ 012161 SKIN TEMPERATURE K 2 0 16 C 2 4
+ 012162 EQUIVALENT BLACK BODY TEMPERATURE K 2 0 16 C 2 4
+ 012163 BRIGHTNESS TEMPERATURE K 2 0 16 C 2 4
+ 012164 INSTRUMENT TEMPERATURE K 2 0 16 K 2 5
+ 012171 COLDEST CLUSTER TEMPERATURE K 2 0 16 K 2 5
+ 012180 (CBS) AVERAGED 12 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012181 (CBS) AVERAGED 11 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012182 (CBS) AVERAGED 3.7 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012183 (CBS) AVERAGED 12 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012184 (CBS) AVERAGED 11 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012185 (CBS) AVERAGED 3.7 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012186 (CBS) MEAN NADIR SEA SURFACE TEMPERATURE K 2 0 16 K 2 5
+ 012187 (CBS) MEAN DUAL VIEW SEA SURFACE TEMPERATURE K 2 0 16 K 2 5
+ 012188 (CBS) INTERPOLATED 23.8 GHZ BRIGHTNESS T FROM MWR K 2 0 16 K 2 5
+ 012189 (CBS) INTERPOLATED 36.5 GHZ BRIGHTNESS T FROM MWR K 2 0 16 K 2 5
+ 012193 COLDEST CLUSTER TEMPERATURE K 1 0 12
+ 012194 RADIANCE W/M**2*STER*M**(-1) 6 0 31
+ 012195 SPECTRAL RADIANCE W/M**2*STER*M**(-1) 10 0 31
+ 012196 RADIANCE W/M**2*STER 3 0 16
+ 012197 MAXIMUM TEMPERATURE AT 2M, PAST 3 HOURS K 1 0 12
+ 012198 MINIMUM TEMPERATURE AT 2M, PAST 3 HOURS K 1 0 12
+ 012199 MAXIMUM TEMPERATURE AT 2M, PAST 6 HOURS K 1 0 12
+ 012200 MINIMUM TEMPERATURE AT 2M, PAST 6 HOURS K 1 0 12
+ 013001 SPECIFIC HUMIDITY KG/KG 5 0 14 KG/KG 5 5
+ 013002 MIXING RATIO KG/KG 5 0 14 KG/KG 5 5
+ 013003 RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013004 VAPOUR PRESSURE PA -1 0 10 PA -1 4
+ 013005 VAPOUR DENSITY KG/M**3 3 0 7 KG/M**3 3 3
+ 013006 MIXING HEIGHTS M -1 -40 16 M -1 5
+ 013007 MINIMUM RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013008 MAXIMUM RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013009 RELATIVE HUMIDITY % 1 -1000 12 % 1 4
+ 013011 TOTAL PRECIPITATION/TOTAL WATER EQUIVALENT KG/M**2 1 -1 14 KG/M**2 1 5
+ 013012 DEPTH OF FRESH SNOW M 2 -2 12 M 2 4
+ 013013 TOTAL SNOW DEPTH M 2 -2 16 M 2 5
+ 013014 RAINFALL/WATER EQUIVALENT OF SNOW (AVERAGED RATE) KG/(M**2)S 4 0 12 KG/(M**2)S 4 4
+ 013015 SNOWFALL (AVERAGED RATE) M/S 7 0 12 M/S 7 4
+ 013016 PRECIPITABLE WATER KG/M**2 0 0 7 KG/M**2 0 3
+ 013019 TOTAL PRECIPITATION PAST 1 HOUR KG/M**2 1 -1 14 KG/M**2 1 4
+ 013020 TOTAL PRECIPITATION PAST 3 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013021 TOTAL PRECIPITATION PAST 6 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013022 TOTAL PRECIPITATION PAST 12 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013023 TOTAL PRECIPITATION PAST 24 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013031 EVAPOTRANSPIRATION KG/M**2 0 0 7 KG/M**2 0 3
+ 013032 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 8 KG/M**2 1 3
+ 013033 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 10 KG/M**2 1 4
+ 013038 SUPERADIABATIC INDICATOR CODE TABLE 13038 0 0 2 CODE TABLE 13038 0 1
+ 013039 TERRAIN TYPE (ICE/SNOW) CODE TABLE 13039 0 0 3 CODE TABLE 13039 0 1
+ 013040 SURFACE FLAG CODE TABLE 13040 0 0 4 CODE TABLE 13040 0 2
+ 013041 PASQUILL-GIFFORD STABILITY CATEGORY CODE TABLE 13041 0 0 4 CODE TABLE 13041 0 2
+ 013042 PARCEL LIFTED INDEX (TO 500 HPA) K 0 -20 6 K 0 2
+ 013043 BEST LIFTED INDEX (TO 500 HPA) K 0 -20 6 K 0 2
+ 013044 (CBS) K INDEX K 0 -30 8 K 0 3
+ 013045 (CBS) KO INDEX K 0 -30 8 K 0 3
+ 013046 (CBS) MAXIMUM BUOYANCY K 0 -30 8 K 0 3
+ 013051 FREQUENCY GROUP, PRECIPITATION CODE TABLE 13051 0 0 4 CODE TABLE 13051 0 2
+ 013052 HIGHEST DAILY AMOUNT OF PRECIPITATION KG/M**2 1 -1 14 KG/M**2 1 5
+ 013055 INTENSITY OF PRECIPITATION KG/(M**2)S 4 0 8 MM H-1 1 4
+ 013058 SIZE OF PRECIPITATING ELEMENT M 4 0 7 MM 1 3
+ 013059 NUMBER OF FLASHES (THUNDERSTORM) NUMERIC 0 0 7 NUMERIC 0 3
+ 013060 TOTAL ACCUMULATED PRECIPITATION KG/M**2 1 -1 17 KG/M**2 1 5
+ 013071 UPSTREAM WATER LEVEL M 2 0 14 M 2 4
+ 013072 DOWNSTREAM WATER LEVEL M 2 0 14 M 2 4
+ 013073 MAXIMUM WATER LEVEL M 2 0 14 M 2 4
+ 013080 WATER PH pH 1 0 10 pH 1 3
+ 013081 WATER CONDUCTIVITY SIEMENS/M 3 0 14 SIEMENS/M 3 4
+ 013082 WATER TEMPERATURE K 1 0 12 K 1 4
+ 013083 DISSOLVED OXYGEN KG/M**3 6 0 15 KG/M**3 6 5
+ 013084 TURBIDITY LUMEN 0 0 14 LUMEN 0 4
+ 013085 OXYDATION REDUCTION POTENTIAL (ORP) V 3 0 14 V 3 4
+ 013090 RADIOMETER WATER VAPOUR CONTENT KGM-2 1 0 10 KGM-2 1 4
+ 013091 RADIOMETER LIQUID CONTENT KGM-2 2 0 8 KGM-2 2 3
+ 013093 (CBS) CLOUD OPTICAL THICKNESS NUMERIC 0 0 8 NUMERIC 0 3
+ 013095 (CBS) TOTAL COLUMN WATER VAPOUR KGM-2 4 0 19 KGM-2 4 6
+ 013096 (CBS) MWR WATER VAPOUR CONTENT KGM-2 2 0 14 KGM-2 2 5
+ 013097 (CBS) MWR LIQUID WATER CONTENT KGM-2 2 0 14 KGM-2 2 5
+ 013098 (CBS) INTEGRATED WATER VAPOUR DENSITY KGM-2 8 0 30 KGM-2 8 10
+ 013192 RELATIVE HUMIDITY AT 2 M % 0 0 8
+ 013193 RELATIVE HUMIDITY % 0 0 8
+ 013194 TOTAL COLUMN WATER KG/M**2 2 0 11
+ 013195 RAIN RATE KG/M**2HOUR 0 0 5
+ 013196 ANTECEDENT PRECIPITATION INDEX KG/M**2 0 0 7
+ 013197 TOTAL COLUMN WATER VAPOUR KG/M**2 1 0 10
+ 013198 RAIN FLAG CODE TABLE 13198 0 0 3
+ 013199 SPECIFIC HUMIDITY AT 2 M KG/KG 5 0 14
+ 013201 CLOUD LIQUID WATER KG/KG 7 0 14
+ 013202 TYPE OF SURFACE CODE TABLE 13202 0 0 8
+ 013203 1D VAR ESTIMATE OF RAIN RATE KG/M**2*HOUR 2 0 12
+ 013204 SSMI INDEPENDENT ESTIMATE OF RAIN RATE KG/M**2*HOUR 2 0 12
+ 013205 CLOUD LIQUID WATER PATH KG/M**2 4 0 14
+ 013206 TOTAL PRECIPITATION ICE CONTENT KG/M**2 6 0 14
+ 013207 TOTAL CLOUD LIQUID WATER KG/M**2 6 0 14
+ 013208 SURFACE RAIN RATE ( INSTANTANEOUS ) KG/M**2*S 5 0 17
+ 013209 RAIN POSSIBILITY NUMERIC 0 -256 9
+ 013210 1D VAR CLOUD LIQUID WATER PATH RETRIEVED ERROR(S) KG/M**2 4 0 14
+ 013211 TOTAL PRECIPITABLE WATER INDIPENDENT ESTIMATE OF ERROR(S) KG/M**2 2 0 11
+ 013212 CLOUD LIQUID WATER PATH INDIPENDENT ESTIMATE OF ERROR(S) KG/M**2 4 0 14
+ 013230 CONVECTIVE PRECIPITATION KG/M**2 1 -1 14
+ 013231 LARGE SCALE PRECIPITATION KG/M**2 1 -1 14
+ 013240 AIR DENSITY KG/M**3 3 0 10
+ 014001 LONG-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014002 LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014003 SHORT-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014004 SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014011 NET LONG-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014012 NET LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014013 NET SHORT-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014014 NET SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014015 NET RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 -16384 15 J/M**2 -4 5
+ 014016 NET RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 -16384 15 J/M**2 -4 5
+ 014017 INSTANTANEOUS LONG-WAVE RADIATION (SEE NOTE 6) W/M**2 -3 -2048 12 W/M**2 -3 4
+ 014018 INSTANTANEOUS SHORT-WAVE RADIATION (SEE NOTE 6) W/M**2 -3 -2048 12 W/M**2 -3 4
+ 014019 SURFACE ALBEDO % 0 0 7 % 0 3
+ 014020 GLOBAL SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014021 GLOBAL SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014022 DIFFUSE SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014023 DIFFUSE SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014024 DIRECT SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014025 DIRECT SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014026 ALBEDO AT THE TOP OF CLOUDS % 0 0 7 % 0 3
+ 014027 ALBEDO % 0 0 7 % 0 3
+ 014028 GLOBAL SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S J/M**2 -2 0 16 J/M**2 -2 5
+ 014029 DIFFUSE SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD J/M**2 -2 0 16 J/M**2 -2 5
+ 014030 DIRECT SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S J/M**2 -2 0 16 J/M**2 -2 5
+ 014031 TOTAL SUNSHINE MINUTE 0 0 11 MINUTE 0 4
+ 014032 TOTAL SUNSHINE HOUR 0 0 10 HOUR 0 4
+ 014033 TOTAL SUNSHINE % 0 0 9 % 0 3
+ 014034 SUNSHINE OVER PERIOD SPECIFIED MINUTE 0 0 11 MINUTE 0 4
+ 014042 BI-DIRECTIONAL REFLECTANCE % 0 0 7 % 0 3
+ 014045 CHANNEL RADIANCE (W/M**2)*(1/SR)*CM 0 0 11 WM-2SR-1CM-1 0 4
+ 014050 EMISSIVITY (SEE NOTE 5) % 1 0 10 % 1 4
+ 014051 DIRECT SOLAR RADIATION INTEGRATED OVER LAST HOUR J/M**2 -3 0 14 JM-2 -3 4
+ 014055 (CBS) SOLAR ACTIVITY INDEX NUMERIC 0 -32768 16 NUMERIC 0 5
+ 014061 (VAL) INSTANTANEOUS LONG-WAVE RADIATION W/M**2 0 -512 10 W/M**2 0 3
+ 014062 (VAL) INSTANTANEOUS SHORT-WAVE RADIATION W/M**2 0 -2048 12 W/M**2 0 4
+ 014192 SCALED RADIANCE NUMERIC 0 0 16
+ 014193 SCALED MEAN RADIANCE NUMERIC 0 0 31
+ 014194 SCALED STD DEV RADIANCE NUMERIC 0 0 31
+ 015001 TOTAL OZONE DU 0 0 10 DU 0 4
+ 015002 AIR MASS (SLANT PATH AT 22 KM) NUMERIC 2 0 10 NUMERIC 2 3
+ 015003 MEASURED OZONE PARTIAL PRESSURE (SOUNDING) PA 4 0 9 NBAR 0 3
+ 015004 OZONE SOUNDING CORRECTION FACTOR NUMERIC 3 0 11 NUMERIC 3 4
+ 015005 OZONE P DU 0 0 10 DU 0 3
+ 015011 LOG 10 OF INTEGRATED ELECTRON DENSITY LOG (1/M2) 3 14000 13 LOG (M-2) 3 4
+ 015015 MAXIMUM IMAGE SPECTRAL COMPONENT BEFORE NORMALIZATION NUMERIC 0 0 31 NUMERIC 0 10
+ 015020 INTEGRATED 03 DENSITY KG/M**2 8 0 21 KG/M**2 8 7
+ 015025 (CBS) TYPE OF POLLUTANT CODE TABLE 15025 0 0 4 CODE TABLE 15025 0 2
+ 015026 (CBS) CONCENTRATION OF POLLUTANT MOLMOL-1 9 0 9 MOLMOL-1 9 3
+ 015031 ATMOSPHERIC PATH DELAY IN SATELLITE SIGNAL M 4 10000 15 M 4 5
+ 015032 ESTIMATED ERROR IN ATMOSPHERIC PATH DELAY M 4 0 10 M 4 4
+ 015033 DIFFERENCE IN PATH DELAYS FOR LIMB VIEWS AT EXTREMES OF SCAN M 5 -10000 15 M 5 5
+ 015034 ESTIMATED ERROR IN PATH DELAY DIFFERENCE M 5 0 14 M 5 5
+ 015035 COMPONENT OF ZENITH PATH DELAY DUE TO WATER VAPOUR M 4 0 14 M 4 5
+ 015036 (CBS) ATMOSPHERIC REFRACTIVITY (SEE NOTE 5) N-UNITS 3 0 19 N-UNITS 3 6
+ 015037 (CBS) BENDING ANGLE RADIANS 8 -100000 23 RADIANS 8 7
+ 015202 INTEGRATED ELECTRON DENSITY 1/M**2 3 13000 12
+ 019001 TYPE OF SYNOPTIC FEATURE CODE TABLE 19001 0 0 6 CODE TABLE 19001 0 2
+ 019002 EFFECTIVE RADIUS OF FEATURE M -2 0 12 M -2 4
+ 019003 WIND SPEED THRESHOLD M/S 0 0 8 M/S 0 3
+ 019004 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD M -2 0 12 M -2 4
+ 019005 DIRECTION OF MOTION OF FEATURE DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 019006 SPEED OF MOTION OF FEATURE M/S 2 0 14 M/S 2 5
+ 019007 EFFECTIVE RADIUS OF FEATURE M -3 0 12 M -3 4
+ 019008 VERTICAL EXTENT OF CIRCULATION CODE TABLE 19008 0 0 3 CODE TABLE 19008 0 1
+ 019009 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD (LA M -3 0 12 M -3 4
+ 019010 METHOD FOR TRACKING THE CENTRE OF SYNOPTIC FEATURE CODE TABLE 19010 0 0 4 CODE TABLE 19010 0 2
+ 020001 HORIZONTAL VISIBILITY M -1 0 13 M -1 4
+ 020002 VERTICAL VISIBILITY M -1 0 7 M -1 3
+ 020003 PRESENT WEATHER (SEE NOTE 1) CODE TABLE 20003 0 0 9 CODE TABLE 20003 0 3
+ 020004 PAST WEATHER (1) (SEE NOTE 2) CODE TABLE 20004 0 0 5 CODE TABLE 20004 0 2
+ 020005 PAST WEATHER (2) (SEE NOTE 2) CODE TABLE 20005 0 0 5 CODE TABLE 20005 0 2
+ 020008 CLOUD DISTRIBUTION FOR AVIATION CODE TABLE 20008 0 0 5 CODE TABLE 20008 0 2
+ 020009 GENERAL WEATHER INDICATOR (TAF/METAR) CODE TABLE 20009 0 0 4 CODE TABLE 20009 0 2
+ 020010 CLOUD COVER (TOTAL) % 0 0 7 % 0 3
+ 020011 CLOUD AMOUNT CODE TABLE 20011 0 0 4 CODE TABLE 20011 0 2
+ 020012 CLOUD TYPE CODE TABLE 20012 0 0 6 CODE TABLE 20012 0 2
+ 020013 HEIGHT OF BASE OF CLOUD M -1 -40 11 M -1 4
+ 020014 HEIGHT OF TOP OF CLOUD M -1 -40 11 M -1 4
+ 020015 PRESSURE AT BASE OF CLOUD PA -1 0 14 PA -1 5
+ 020016 PRESSURE AT TOP OF CLOUD PA -1 0 14 PA -1 5
+ 020017 CLOUD TOP DESCRIPTION CODE TABLE 20017 0 0 4 CODE TABLE 20017 0 2
+ 020018 TENDENCY OF RUNWAY VISUAL RANGE CODE TABLE 20018 0 0 2 CODE TABLE 20018 0 1
+ 020019 SIGNIFICANT PRESENT OR FORECAST WEATHER CCITTIA5 0 0 72 CHARACTER 0 9
+ 020020 SIGNIFICANT RECENT WEATHER PHENOMENA CCITTIA5 0 0 32 CHARACTER 0 4
+ 020021 TYPE OF PRECIPITATION FLAG TABLE 20021 0 0 30 FLAG TABLE 20021 0 10
+ 020022 CHARACTER OF PRECIPITATION CODE TABLE 20022 0 0 4 CODE TABLE 20022 0 2
+ 020023 OTHER WEATHER PHENOMENA FLAG TABLE 20023 0 0 18 FLAG TABLE 20023 0 6
+ 020024 INTENSITY OF PHENOMENA CODE TABLE 20024 0 0 3 CODE TABLE 20024 0 1
+ 020025 OBSCURATION FLAG TABLE 20025 0 0 21 FLAG TABLE 20025 0 7
+ 020026 CHARACTER OF OBSCURATION CODE TABLE 20026 0 0 4 CODE TABLE 20026 0 2
+ 020027 PHENOMENA OCCURRENCE FLAG TABLE 20027 0 0 9 FLAG TABLE 20027 0 3
+ 020028 (VAL) EXPECTED CHANGE IN INTENSITY CODE TABLE 20028 0 0 3 CODE TABLE 20028 0 1
+ 020029 RAIN FLAG CODE TABLE 20029 0 0 2 CODE TABLE 20029 0 1
+ 020031 ICE DEPOSIT (THICKNESS) M 2 0 7 M 2 3
+ 020032 RATE OF ICE ACCRETION CODE TABLE 20032 0 0 3 CODE TABLE 20032 0 1
+ 020033 CAUSE OF ICE ACCRETION FLAG TABLE 20033 0 0 4 FLAG TABLE 20033 0 2
+ 020034 SEA ICE CONCENTRATION CODE TABLE 20034 0 0 5 CODE TABLE 20034 0 2
+ 020035 AMOUNT AND TYPE OF ICE CODE TABLE 20035 0 0 4 CODE TABLE 20035 0 2
+ 020036 ICE SITUATION CODE TABLE 20036 0 0 5 CODE TABLE 20036 0 2
+ 020037 ICE DEVELOPMENT CODE TABLE 20037 0 0 5 CODE TABLE 20037 0 2
+ 020038 BEARING OF ICE EDGE (SEE NOTE 3) DEGREE TRUE 0 0 12 DEGREE TRUE 0 3
+ 020039 ICE DISTANCE M -1 0 13 M -1 4
+ 020041 AIRFRAME ICING CODE TABLE 20041 0 0 4 CODE TABLE 20041 0 2
+ 020042 AIRFRAME ICING PRESENT CODE TABLE 20042 0 0 2 CODE TABLE 20042 0 1
+ 020043 PEAK LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2
+ 020044 AVERAGE LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2
+ 020045 SUPERCOOLED LARGE DROPLET (SLD) CONDITIONS CODE TABLE 20045 0 0 2 CODE TABLE 20045 0 2
+ 020050 (CBS) CLOUD INDEX CODE TABLE 20050 0 0 8 CODE TABLE 20050 0 3
+ 020051 AMOUNT OF LOW CLOUDS % 0 0 7 % 0 3
+ 020052 AMOUNT OF MIDDLE CLOUDS % 0 0 7 % 0 3
+ 020053 AMOUNT OF HIGH CLOUDS % 0 0 7 % 0 3
+ 020054 (VAL) TRUE DIRECTION FROM WHICH CLOUDS ARE MOVING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 020056 (CBS) CLOUD PHASE CODE TABLE 20056 0 0 3 CODE TABLE 20056 0 1
+ 020061 RUNWAY VISUAL RANGE (RVR) M 0 0 12 M 0 4
+ 020062 STATE OF THE GROUND (WITH OR WITHOUT SNOW) CODE TABLE 20062 0 0 5 CODE TABLE 20062 0 2
+ 020063 SPECIAL PHENOMENA CODE TABLE 20063 0 0 10 CODE TABLE 20063 0 4
+ 020065 SNOW COVER (SEE NOTE 4) % 0 0 7 % 0 3
+ 020070 MINIMUM NUMBER OF ATMOSPHERICS NUMERIC 0 0 7 NUMERIC 0 3
+ 020071 ACCURACY OF FIX AND RATE OF ATMOSPHERICS CODE TABLE 20071 0 0 4 CODE TABLE 20071 0 2
+ 020081 CLOUD AMOUNT IN SEGMENT % 0 0 7 % 0 3
+ 020082 AMOUNT SEGMENT CLOUD FREE % 0 0 7 % 0 3
+ 020083 (CBS) AMOUNT OF SEGMENT COVERED BY SCENE % 0 0 7 % 0 3
+ 020090 SPECIAL CLOUDS CODE TABLE 20090 0 0 4 CODE TABLE 20090 0 2
+ 020192 SPECIAL PHENOMENA CODE TABLE 20192 0 0 14
+ 020193 CLOUD AMOUNT IN SEGMENT % 0 0 7
+ 020194 AMOUNT OF SEGMENT CLOUD FREE % 0 0 7
+ 020215 PRESSURE AT THE BASE OF CLOUD PA -1 0 14
+ 020250 CALCULATED SURFACE TYPE CODE TABLE 20250 0 0 5
+ 020251 ICE AGE CODE TABLE 20251 0 0 3
+ 020252 ICE EDGE CODE TABLE 20252 0 0 3
+ 020253 SURFACE TYPE CODE TABLE 20253 0 0 3
+ 020254 ICE CONCENTRATION % 0 0 7
+ 021001 HORIZONTAL REFLECTIVITY dB 0 -64 7 dB 0 3
+ 021002 VERTICAL REFLECTIVITY dB 0 -64 7 dB 0 3
+ 021003 DIFFERENTIAL REFLECTIVITY dB 1 -5 7 dB 1 3
+ 021005 LINEAR DEPOLARISATION RATIO dB 0 -65 6 dB 0 2
+ 021006 CIRCULAR DEPOLARISATION RATIO dB 0 -65 6 dB 0 2
+ 021011 DOPPLER MEAN VELOCITY IN X-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021012 DOPPLER MEAN VELOCITY IN Y-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021013 DOPPLER MEAN VELOCITY IN Z-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021014 DOPPLER MEAN VELOCITY (RADIAL) M/S 1 -4096 13 M/S 1 4
+ 021017 DOPPLER VELOCITY SPECTRAL WIDTH M/S 1 0 8 M/S 1 3
+ 021021 ECHO TOPS M -3 0 4 M -3 2
+ 021030 SIGNAL TO NOISE RATIO dB 0 -32 8 dB 0 3
+ 021031 VERTICALLY INTEGRATED LIQUID-WATER CONTENT KG/M**2 0 0 7 KG/M**2 0 3
+ 021036 RADAR RAINFALL INTENSITY M/S 7 0 12 M/S 7 4
+ 021041 BRIGHT-BAND HEIGHT M -2 0 8 M -2 3
+ 021051 SIGNAL POWER ABOVE 1 MW dB 0 -256 8 dB 0 3
+ 021062 BACKSCATTER dB 2 -5000 13 dB 2 4
+ 021063 RADIOMETRIC RESOLUTION (NOISE VALUE) % 1 0 10 % 1 4
+ 021064 CLUTTER NOISE ESTIMATE NUMERIC 0 0 8 NUMERIC 0 3
+ 021065 MISSING PACKET COUNTER NUMERIC 0 -127 8 NUMERIC 0 3
+ 021066 WAVE SCATTEROMETER PRODUCT CONFIDENCE DATA FLAG TABLE 21066 0 0 12 FLAG TABLE 21066 0 4
+ 021067 WIND PRODUCT CONFIDENCE DATA FLAG TABLE 21067 0 0 13 FLAG TABLE 21067 0 5
+ 021068 RADAR ALTIMETER PRODUCT CONFIDENCE DATA FLAG TABLE 21068 0 0 8 FLAG TABLE 21068 0 3
+ 021069 SST PRODUCT CONFIDENCE DATA FLAG TABLE 21069 0 0 10 FLAG TABLE 21069 0 4
+ 021070 SST PRODUCT CONFIDENCE DATA (SADIST-2) FLAG TABLE 21070 0 0 23 FLAG TABLE 21070 0 6
+ 021071 PEAKINESS NUMERIC 0 0 16 NUMERIC 0 5
+ 021072 SATELLITE ALTIMETER CALIBRATION STATUS FLAG TABLE 21072 0 0 4 FLAG TABLE 21072 0 2
+ 021073 SATELLLITE ALTIMETER INSTRUMENT MODE FLAG TABLE 21073 0 0 9 FLAG TABLE 21073 0 3
+ 021075 IMAGE SPECTRUM INTENSITY NUMERIC 0 0 8 NUMERIC 0 3
+ 021076 REPRESENTATION OF INTENSITIES CODE TABLE 21076 0 0 3 CODE TABLE 21076 0 1
+ 021077 ALTITUDE CORRECTION (IONOSPHERE) M 3 0 14 M 3 5
+ 021078 ALTITUDE CORRECTION (DRY TROPOSPHERE) M 3 0 9 M 3 3
+ 021079 ALTITUDE CORRECTION (WET TROPOSPHERE) M 3 2000 10 M 3 4
+ 021080 ALTITUDE CORRECTION (CALIBRATION CONSTANT) M 3 0 11 M 3 4
+ 021081 OPEN LOOP CORRECTION (HEIGHT-TIME LOOP) M 3 0 10 M 3 4
+ 021082 OPEN LOOP CORRECTION (AUTO GAIN CONTROL) dB 3 -3000 14 dB 3 5
+ 021083 WARM TARGET CALIBRATION NUMERIC 0 0 16 NUMERIC 0 5
+ 021084 COLD TARGET CALIBRATION NUMERIC 0 0 16 NUMERIC 0 5
+ 021085 ATSR SEA SURFACE TEMPERATURE ACROSS- TRACK BAND NUMBER NUMERIC 0 0 4 NUMERIC 0 2
+ 021086 (CBS) NUMBER OF PIXELS IN NADIR ONLY, AVERAGE NUMERIC 0 0 9 NUMERIC 0 3
+ 021087 (CBS) NUMBER OF PIXELS IN DUAL VIEW, AVERAGE NUMERIC 0 0 9 NUMERIC 0 3
+ 021091 RADAR SIGNAL DOPPLER SPECTRUM 0TH MOMENT dB 0 -100 8 dB 0 3
+ 021092 RASS SIGNAL DOPPLER SPECTRUM 0TH MOMENT, REFERRING TO RASS SIGNA dB 0 -100 8 dB 0 3
+ 021101 NUMBER OF VECTOR AMBIGUITIES NUMERIC 0 0 3 NUMERIC 0 1
+ 021102 INDEX OF SELECTED WIND VECTOR NUMERIC 0 0 3 NUMERIC 0 1
+ 021103 TOTAL NUMBER OF SIGMA-0 MEASUREMENTS NUMERIC 0 0 5 NUMERIC 0 2
+ 021104 LIKELIHOOD COMPUTED FOR SOLUTION NUMERIC 3 -30000 15 NUMERIC 3 5
+ 021105 NORMALIZED RADAR CROSS-SECTION dB 2 -10000 14 dB 2 5
+ 021106 KP VARIANCE COEFFICIENT (ALPHA) NUMERIC 3 0 14 NUMERIC 3 5
+ 021107 KP VARIANCE COEFFICIENT (BETA) NUMERIC 8 0 16 NUMERIC 8 5
+ 021109 SEAWINDS WIND VECTOR CELL QUALITY FLAG TABLE 21109 0 0 17 FLAG TABLE 21109 0 6
+ 021110 NUMBER OF INNER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021111 NUMBER OF OUTER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021112 NUMBER OF INNER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021113 NUMBER OF OUTER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021114 KP VARIANCE COEFFICENT (GAMMA) dB 3 -140000 18 dB 3 6
+ 021115 SEAWINDS SIGMA-0 QUALITY FLAG TABLE 21115 0 0 17 FLAG TABLE 21115 0 6
+ 021116 SEAWINDS SIGMA-0 MODE FLAG TABLE 21116 0 0 17 FLAG TABLE 21116 0 6
+ 021117 SIGMA-0 VARIANCE QUALITY CONTROL NUMERIC 2 0 16 NUMERIC 2 5
+ 021118 ATTENUATION CORRECTION ON SIGMA-0 dB 2 -10000 14 dB 2 5
+ 021119 WIND SCATTEROMETER GEOPHYSICAL MODEL FUNCTION CODE TABLE 21119 0 0 6 CODE TABLE 21119 0 2
+ 021120 PROBABILITY OF RAIN NUMERIC 3 0 10 NUMERIC 3 4
+ 021121 SEAWINDS NOF* RAIN INDEX NUMERIC 0 0 8 NUMERIC 0 3
+ 021122 ATTENUATION CORRECTION OF SIGMA-0 (FROM TB) dB 2 -10000 14 dB 2 5
+ 021123 SEAWINDS NORMALIZED RADAR CROSS SECTION dB 2 -30000 15 dB 2 5
+ 021128 NUMBER OF VALID POINTS PER SECOND USED TO DERIVE PREVIOUS PARAME NUMERIC 0 0 8 NUMERIC 0 3
+ 021130 (CBS) SPECTRUM TOTAL ENERGY NUMERIC 6 0 28 NUMERIC 6 9
+ 021131 (CBS) SPECTRUM MAX ENERGY NUMERIC 6 0 28 NUMERIC 6 9
+ 021132 (CBS) DIRECTION OF SPECTRUM MAX ON HIGHER RESOLUTION GRID DEGREE 3 0 19 DEGREE 3 6
+ 021133 (CBS) WAVE-LENGTH OF SPECTRUM MAX ON HIGHER RESOLUTION GRID M 3 0 29 M 3 9
+ 021134 (CBS) RANGE RESOLUTION OF CRESS COVARIANCE SPECTRUM RAD/M 3 0 19 RAD/M 3 6
+ 021135 (CBS) REAL PART OF CROSS SPECTRA POLAR GRID NUMBER OF BINS NUMERIC 3 -524288 20 NUMERIC 3 7
+ 021136 (CBS) IMAGINARY PART OF CROSS SPECTRA POLAR GRID NUMBER OF BINS NUMERIC 3 -524288 20 NUMERIC 3 7
+ 021137 (CBS) KU BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021138 (CBS) STD KU BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021139 (CBS) KU BAND NET INSTRUMENTAL CORRECTION FOR ACG dB 2 -2048 12 dB 2 4
+ 021140 (CBS) S BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021141 (CBS) STD S BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021142 (CBS) S BAND NET INSTRUMENTAL CORRECTION FOR ACG dB 2 -1024 11 dB 2 4
+ 021143 (CBS) KU BAND RAIN ATTENUATION dB 2 -1073741824 31 dB 2 10
+ 021144 (CBS) ALTIMETER RAIN FLAG FLAG TABLE 21144 0 0 2 FLAG TABLE 21144 0 1
+ 021192 RADAR BACK SCATTER dB 2 -5000 13
+ 021193 NOISE FIGURE % 0 0 7
+ 021194 BACKGROUND NOISE LEVEL NUMERIC 0 0 8
+ 021195 MISSING PACKET COUNTER NUMERIC 0 -127 8
+ 021196 UWA PRODUCT CONFIDENCE FLAG TABLE 21196 0 0 12
+ 021197 UWI PRODUCT CONFIDENCE FLAG TABLE 21197 0 0 12
+ 021198 URA PRODUCT CONFIDENCE FLAG TABLE 21198 0 0 8
+ 021199 UAT PRODUCT CONFIDENCE FLAG TABLE 21199 0 0 7
+ 021200 MWI PRODUCT CONFIDENCE FLAG TABLE 21200 0 0 15
+ 021201 PEAKINESS NUMERIC 0 0 16
+ 021202 ALTIMETER CALIBRATION STATUS FLAG TABLE 21202 0 0 4
+ 021203 ALTIMETER INSTRUMENT MODE FLAG TABLE 21203 0 0 9
+ 021204 MULTI/SINGLE VIEW DIFFERENCE K 2 -512 10
+ 021205 SPECTRAL INTENSITY NUMERIC 0 0 8
+ 021206 REPRESENTATION OF INTENSITY CODE TABLE 21206 0 0 3
+ 021207 ALTITUDE CORRECTION (IONOSPHERE) M 3 0 14
+ 021208 ALTITUDE CORRECTION (DRY TROPOSPHERE) M 3 0 9
+ 021209 LTITUDE CORRECTION (WET TROPOSPHERE) M 3 2000 10
+ 021210 ALTITUDE CORRECTION (CALIBRATION CONSTANT) M 3 0 11
+ 021211 OPEN LOOP CORRECTION (HTL) M 3 0 10
+ 021212 OPEN LOOP CORRECTION (AGC) dB 3 -3000 14
+ 021213 AMBIGUITY REMOVAL CONFIDENCE % 0 0 7
+ 021214 UAT QUALITY SUMMARY CODE TABLE 21214 0 0 3
+ 021215 UAT ACROSS-TRACK BAND NO. NUMERIC 0 0 4
+ 021222 DOPPLER SPECTRUM 0 TH MOMENT (AMPLITUDE) dB 0 0 7
+ 021225 PRESCAT PRODUCT CONFIDENCE FLAG TABLE 21225 0 0 6
+ 021226 BACKSCATER DISTANCE NUMERIC 1 -4096 13
+ 021230 NUMBER OF VECTOR AMBIGUITIES NUMERIC 0 0 3
+ 021231 INDEX OF SELECTED WIND VECTOR NUMERIC 0 0 3
+ 021232 TOTAL NMBER OF SIGMA-0 MEASUREMENTS NUMERIC 0 0 5
+ 021233 NUMBER OF SIGMA-0 USABLE FOR WIND NUMERIC 0 0 5
+ 021234 LIKELIHOOD COMPUTED FOR SOLUTION NUMERIC 1 -10000 14
+ 021235 WIND VECTOR CELL QUALITY FLAG FLAG TABLE 21235 0 0 3
+ 021236 NUMBER OF FORE-BEAM SIGMA-0 NUMERIC 1 0 6
+ 021237 NUMBER OF MID-BEAM V-POL SIGMA-0 NUMERIC 1 0 6
+ 021238 NUMBER OF MID-BEAM H-POL SIGMA-0 NUMERIC 1 0 6
+ 021239 NUMBER OF AFT-BEAM SIGMA-0 NUMERIC 1 0 6
+ 021240 NORMALIZED RADAR CROSS SECTION NUMERIC 2 -10000 14
+ 021241 Kp VARIANCE COEFFICIENT (ALPHA) NUMERIC 5 0 14
+ 021242 Kp VARIANCE COEFFICIENT (BETHA) NUMERIC 6 0 16
+ 021243 Kp VARIANCE COEFFICIENT (GAMMA) NUMERIC 6 0 16
+ 021244 SIGMA-0 QUALITY FLAG FLAG TABLE 21244 0 0 15
+ 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022002 DIRECTION OF WIND WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022003 DIRECTION OF SWELL WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022004 DIRECTION OF CURRENT DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022011 PERIOD OF WAVES S 0 0 6 S 0 2
+ 022012 PERIOD OF WIND WAVES S 0 0 6 S 0 2
+ 022013 PERIOD OF SWELL WAVES S 0 0 6 S 0 2
+ 022021 HEIGHT OF WAVES M 1 0 10 M 1 4
+ 022022 HEIGHT OF WIND WAVES M 1 0 10 M 1 4
+ 022023 HEIGHT OF SWELL WAVES M 1 0 10 M 1 4
+ 022025 STANDARD DEVIATION WAVE HEIGHT M 2 0 10 M 2 4
+ 022026 STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT M 2 0 10 M 2 4
+ 022031 SPEED OF CURRENT M/S 2 0 13 M/S 2 4
+ 022035 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 2 0 14 M 2 4
+ 022036 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 2 0 14 M 2 4
+ 022037 TIDAL ELEVATION WITH RESPECT TO NATIONAL LAND DATUM M 3 -10000 15 M 3 5
+ 022038 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 3 -10000 15 M 3 5
+ 022039 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 3 -5000 12 M 3 4
+ 022040 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 3 -5000 14 M 3 5
+ 022041 SEA-SURFACE TEMPERATURE (15-DAY RUNNING MEAN) K 1 0 12 K 1 4
+ 022042 SEA/WATER TEMPERATURE K 1 0 12 K 1 4
+ 022043 SEA/WATER TEMPERATURE K 2 0 15 K 2 5
+ 022044 SOUND VELOCITY M/S 1 0 14 M/S 1 5
+ 022045 SEA/WATER TEMPERATURE K 3 0 19 K 3 6
+ 022050 STANDARD DEVIATION SEA-SURFACE TEMPERATURE K 2 0 8 K 2 3
+ 022055 FLOAT CYCLE NUMBER NUMERIC 0 0 10 NUMERIC 0 3
+ 022056 DIRECTION OF PROFILE CODE TABLE 22056 0 0 2 CODE TABLE 22056 0 1
+ 022060 (CBS) LAGRANGIAN DRIFTER DROGUE STATUS CODE TABLE 22060 0 0 3 CODE TABLE 22060 0 1
+ 022061 STATE OF THE SEA CODE TABLE 22061 0 0 4 CODE TABLE 22061 0 2
+ 022062 SALINITY PART PER THOUSAND 2 0 14 PART PER THOUSAND 2 5
+ 022063 TOTAL WATER DEPTH M 0 0 14 M 0 5
+ 022064 SALINITY PART PER THOUSAND 3 0 17 PART PER THOUSAND 3 6
+ 022065 WATER PRESSURE PA -3 0 17 PA -3 6
+ 022066 WATER CONDUCTIVITY S M-1 6 0 26 S M-1 6 8
+ 022067 INSTRUMENT TYPE FOR WATER TEMPERATURE PROFILE MEASUREMENT CODE TABLE 22067 0 0 10 CODE TABLE 22067 0 4
+ 022068 WATER TEMPERATURE PROFILE RECORDER TYPES CODE TABLE 22068 0 0 7 CODE TABLE 22068 0 3
+ 022069 (CBS) SPECTRAL WAVE DENSITY M2HZ-1 3 0 22 M2HZ-1 3 7
+ 022070 SIGNIFICANT WAVE HEIGHT M 2 0 13 M 2 4
+ 022071 SPECTRAL PEAK WAVE PERIOD S 1 0 9 S 1 3
+ 022072 SPECTRAL PEAK WAVE LENGTH M 0 0 13 M 0 4
+ 022073 MAXIMUM WAVE HEIGHT M 2 0 13 M 2 4
+ 022074 AVERAGE WAVE PERIOD S 1 0 9 S 1 3
+ 022075 AVERAGE WAVE LENGTH M 0 0 13 M 0 4
+ 022076 DIRECTION FROM WHICH DOMINANT WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022077 DIRECTIONAL SPREAD OF DOMINANT WAVE DEGREE 0 0 9 DEGREE 0 3
+ 022078 DURATION OF WAVE RECORD S 0 0 12 S 0 4
+ 022079 LENGTH OF WAVE RECORD M 0 0 16 M 0 5
+ 022080 WAVEBAND CENTRAL FREQUENCY Hz 3 0 10 Hz 3 4
+ 022081 WAVEBAND CENTRAL WAVE NUMBER 1/M 5 0 13 1/M 5 4
+ 022082 MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE DENSITY M**2S 2 0 20 M**2S 2 7
+ 022083 MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE NUMBER M**3 2 0 20 M**3 2 7
+ 022084 BAND CONTAINING MAXIMUM NON- DIRECTIONAL SPECTRAL WAVE DENSITY NUMERIC 0 0 7 NUMERIC 0 3
+ 022085 SPECTRAL WAVE DENSITY RATIO NUMERIC 0 0 7 NUMERIC 0 3
+ 022086 MEAN DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022087 PRINCIPAL DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022088 FIRST NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7 NUMERIC 2 3
+ 022089 SECOND NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7 NUMERIC 2 3
+ 022090 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S 2 0 20 M**2S 2 7
+ 022091 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**3 2 0 20 M**3 2 7
+ 022092 DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S/RAD 2 0 20 M**2S/RAD 2 7
+ 022093 DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**4 2 0 20 M**4 2 7
+ 022094 TOTAL NUMBER OF WAVE BANDS NUMERIC 0 0 7 NUMERIC 0 3
+ 022095 DIRECTIONAL SPREAD OF INDIVIDUAL WAVES DEGREE 0 0 8 DEGREE 0 3
+ 022096 SPECTRAL BAND WIDTH 1/S 3 0 4 1/S 3 2
+ 022097 MEAN WAVELENGTH > 731 M OF IMAGE SPECTRUM AT LOW WAVE NUMBERS M 0 0 14 M 0 5
+ 022098 WAVELENGTH SPREAD (WAVELENGTH > 731 M) AT LOW WAVE NUMBERS M 0 0 14 M 0 5
+ 022099 MEAN DIRECTION AT LOW WAVE NUMBERS (WAVELENGTH > 731 M) DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022100 DIRECTION SPREAD AT LOW WAVE NUMBERS(WAVELENGTH > 731 M) DEGREE 0 0 9 DEGREE 0 3
+ 022101 TOTAL ENERGY (WAVELENGTH > 731M) AT LOW WAVE NUMBERS NUMERIC 0 0 31 NUMERIC 0 10
+ 022120 TIDE STATION AUTOMATED WATER LEVEL CHECK CODE TABLE 22120 0 0 5 CODE TABLE 22120 0 2
+ 022121 TIDE STATION MANUAL WATER LEVEL CHECK CODE TABLE 22121 0 0 5 CODE TABLE 22121 0 2
+ 022122 TIDE STATION AUTOMATED METEOROLOGICAL DATA CHECK CODE TABLE 22122 0 0 5 CODE TABLE 22122 0 2
+ 022123 TIDE STATION MANUAL METEOROLOGICAL DATA CHECK CODE TABLE 22123 0 0 5 CODE TABLE 22123 0 2
+ 022141 SEA-SURFACE TEMPERATURE (15-DAY RUNNING MEAN) K 2 0 15 K 2 5
+ 022150 (CBS) NUMBER OF 18 HZ VALID POINTS FOR KU BAND NUMERIC 0 0 10 NUMERIC 0 4
+ 022151 (CBS) KU BAND OCEAN RANGE M 3 0 31 M 3 10
+ 022152 (CBS) STD OF 18 HZ KU BAND OCEAN RANGE M 3 0 16 M 3 5
+ 022153 (CBS) NUMBER OF 18 HZ VALID POINTS FOR S BAND NUMERIC 0 0 10 NUMERIC 0 4
+ 022154 (CBS) S BAND OCEAN RANGE M 3 0 31 M 3 10
+ 022155 (CBS) STD OF 18 HZ S BAND OCEAN RANGE M 3 0 16 M 3 5
+ 022156 (CBS) KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022157 (CBS) STD 18HZ KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022158 (CBS) S BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022159 (CBS) STD 18HZ S BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022160 (CBS) NORMALIZED INVERSE WAVE AGE NUMERIC 6 0 21 NUMERIC 6 7
+ 022161 (CBS) WAVE SPECTRA M**4 4 0 27 M**4 4 9
+ 022192 SPECTRAL PERIOD S 2 0 13
+ 022193 MEAN WAVENUMBER 1/M 5 0 15
+ 022194 PEAK WAVENUMBER 1/M 5 0 15
+ 022195 MEAN WAVE PROPAGATION DIRECTION DEGREE 1 0 13
+ 022196 PEAK WAVE PROPAGATION DIRECTION DEGREE 1 0 13
+ 022197 DIRECTION SPREAD DEGREE 1 0 13
+ 022198 VARIANCE SPECTRAL DENSITY M**2*S/RAD 4 0 18
+ 022199 CORRELATION COEFF OF SIMULATED FG AND OBSERVED SAR SPECTRUM NUMERIC 4 -10000 15
+ 022200 CORRELATION COEFF OF SIMULATED BF AND OBSERVED SAR SPECTRUM NUMERIC 4 -10000 15
+ 022201 CORRELATION COEFF OF OCEAN WAVE FG AND EXTRACTED WAVE SPECTRUM NUMERIC 4 -10000 15
+ 022202 ERROR BETWEEN FIRST GUESS AND OBSERVED SAR NUMERIC 5 0 21
+ 022203 ERROR BETWEEN SIMULATED AND OBSERVED SAR NUMERIC 5 0 21
+ 022204 MEAN PERIOD OF WAVES SECOND 2 0 13
+ 022205 SPECTRAL DENSITY M**2*S/RAD 4 0 25
+ 022206 PEAK PERIOD OF WAVES SECOND 2 0 13
+ 022207 MEAN WAVE PERIOD S 1 0 10
+ 022208 PEAK PERIOD OF 1D SPECTRA S 1 0 10
+ 022209 COEFICIENT OF DRAG WITH WAVES NUMERIC 6 0 13
+ 022210 MEAN SQUARE SLOPE OF WAVES NUMERIC 4 -10000 14
+ 022211 COEFICIENT OF DRAG WITH WAVES NUMERIC 6 0 17
+ 022243 STANDARD DEVIATION SIGNIFICANT WAVE HEIGHT M 2 0 10
+ 023001 ACCIDENT EARLY NOTIFICATION - ARTICLE APPLICABLE CODE TABLE 23001 0 0 3 CODE TABLE 23001 0 1
+ 023002 ACTIVITY OR FACILITY INVOLVED IN INCIDENT CODE TABLE 23002 0 0 5 CODE TABLE 23002 0 2
+ 023003 TYPE OF RELEASE CODE TABLE 23003 0 0 3 CODE TABLE 23003 0 1
+ 023004 COUNTERMEASURES TAKEN NEAR BORDER CODE TABLE 23004 0 0 3 CODE TABLE 23004 0 1
+ 023005 CAUSE OF INCIDENT CODE TABLE 23005 0 0 2 CODE TABLE 23005 0 1
+ 023006 INCIDENT SITUATION CODE TABLE 23006 0 0 3 CODE TABLE 23006 0 1
+ 023007 CHARACTERISTICS OF RELEASE CODE TABLE 23007 0 0 3 CODE TABLE 23007 0 1
+ 023008 STATE OF CURRENT RELEASE CODE TABLE 23008 0 0 2 CODE TABLE 23008 0 1
+ 023009 STATE OF EXPECTED RELEASE CODE TABLE 23009 0 0 2 CODE TABLE 23009 0 1
+ 023016 POSSIBILITY OF SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT CODE TABLE 23016 0 0 2 CODE TABLE 23016 0 1
+ 023017 FLOW DISCHARGE OF MAJOR RECIPIENT M**3/S 6 0 20 M**3/S 6 7
+ 023018 RELEASE BEHAVIOUR OVER TIME CODE TABLE 23018 0 0 3 CODE TABLE 23018 0 1
+ 023019 ACTUAL RELEASE HEIGHT M 0 -15000 17 M 0 6
+ 023021 EFFECTIVE RELEASE HEIGHT M 0 -15000 17 M 0 6
+ 023022 DISTANCE OF RELEASE POINT OR SITE OF INCIDENT M 0 0 24 M 0 8
+ 023023 MAIN TRANSPORT SPEED IN THE ATMOSPHERE M/S 1 0 12 M/S 1 4
+ 023024 MAIN TRANSPORT SPEED IN WATER M/S 2 0 13 M/S 2 4
+ 023025 MAIN TRANSPORT SPEED IN GROUND WATER M/S 2 0 13 M/S 2 4
+ 023027 MAIN TRANSPORT DIRECTION IN THE ATMOSPHERE DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023028 MAIN TRANSPORT DIRECTION IN WATER DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023029 MAIN TRANSPORT DIRECTION IN GROUND WATER DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023031 POSSIBILITY THAT PLUME WILL ENCOUNTER PRECIPITATION IN STATE IN CODE TABLE 23031 0 0 2 CODE TABLE 23031 0 1
+ 023032 PLUME WILL ENCOUNTER CHANGE IN WIND DIRECTION AND/OR SPEED FLAG CODE TABLE 23032 0 0 2 CODE TABLE 23032 0 1
+ 024001 ESTIMATE OF AMOUNT OF RADIOACTIVITY RELEASED UP TO SPECIFIED TIM Bq -11 0 28 Bq -11 9
+ 024002 ESTIMATED MAXIMUM POTENTIAL RELEASE Bq -11 0 28 Bq -11 9
+ 024003 COMPOSITION OF RELEASE CODE TABLE 24003 0 0 5 CODE TABLE 24003 0 2
+ 024004 ELEMENT NAME CCITTIA5 0 0 16 CHARACTER 0 2
+ 024005 ISOTOPE MASS NUMERIC 0 0 9 NUMERIC 0 3
+ 024011 DOSE mSv 2 0 32 mSv 2 10
+ 024012 TRAJECTORY DOSE (DEFINED LOCATION AND EXPECTED TIME OF ARRIVAL) mSv 2 0 32 mSv 2 10
+ 024013 GAMMA DOSE IN AIR ALONG THE MAIN TRANSPORT PATH (DEFINED LOCATIO mSv 2 0 32 mSv 2 10
+ 024021 AIR CONCENTRATION (OF NAMED ISOTOPE TYPE INCLUDING GROSS BETA) Bq/M**3 2 0 32 Bq/M**3 2 10
+ 024022 CONCENTRATION IN PRECIPITATION (OF NAMES ISOTOPE TYPE) Bq/L 2 0 32 BQ L-1 2 10
+ 024023 PULSE RATE OF BETA RADIATION 1/S 1 0 14 1/S 1 4
+ 024024 PULSE RATE OF GAMMA RADIATION 1/S 1 0 14 1/S 1 4
+ 025001 RANGE-GATE LENGTH M -1 0 6 M -1 2
+ 025002 NUMBER OF GATES AVERAGED NUMERIC 0 0 4 NUMERIC 0 2
+ 025003 NUMBER OF INTEGRATED PULSES NUMERIC 0 0 8 NUMERIC 0 3
+ 025004 ECHO PROCESSING CODE TABLE 25004 0 0 2 CODE TABLE 25004 0 1
+ 025005 ECHO INTEGRATION CODE TABLE 25005 0 0 2 CODE TABLE 25005 0 1
+ 025006 Z TO R CONVERSION CODE TABLE 25006 0 0 3 CODE TABLE 25006 0 1
+ 025007 Z TO R CONVERSION FACTOR NUMERIC 0 0 12 NUMERIC 0 4
+ 025008 Z TO R CONVERSION EXPONENT NUMERIC 2 0 9 NUMERIC 2 3
+ 025009 CALIBRATION METHOD FLAG TABLE 25009 0 0 4 FLAG TABLE 25009 0 2
+ 025010 CLUTTER TREATMENT CODE TABLE 25010 0 0 4 CODE TABLE 25010 0 2
+ 025011 GROUND OCCULTATION CORRECTION (SCREENING) CODE TABLE 25011 0 0 2 CODE TABLE 25011 0 1
+ 025012 RANGE ATTENUATION CORRECTION CODE TABLE 25012 0 0 2 CODE TABLE 25012 0 1
+ 025013 BRIGHT-BAND CORRECTION FLAG TABLE 25013 0 0 2 FLAG TABLE 25013 0 1
+ 025014 AZIMUTH CLUTTER CUT-OFF (SEE NOTE 1) NUMERIC 0 0 12 NUMERIC 0 4
+ 025015 RADOME ATTENUATION CORRECTION FLAG TABLE 25015 0 0 2 FLAG TABLE 25015 0 1
+ 025016 CLEAR-AIR ATTENUATION CORRECTION dB/M 5 0 6 dB/M 5 2
+ 025017 PRECIPITATION ATTENUATION CORRECTION FLAG TABLE 25017 0 0 2 FLAG TABLE 25017 0 1
+ 025018 A TO Z LAW FOR ATTENUATION FACTOR NUMERIC 7 0 6 NUMERIC 7 2
+ 025019 A TO Z LAW FOR ATTENUATION EXPONENT NUMERIC 2 0 7 NUMERIC 2 3
+ 025020 MEAN SPEED ESTIMATION CODE TABLE 25020 0 0 2 CODE TABLE 25020 0 1
+ 025021 WIND COMPUTATION ENHANCEMENT FLAG TABLE 25021 0 0 8 FLAG TABLE 25021 0 3
+ 025025 BATTERY VOLTAGE V 1 0 9 V 1 3
+ 025026 (CBS) BATTERY VOLTAGE (LARGE RANGE) V 1 0 12 V 1 4
+ 025028 (CBS) OPERATOR OR MANUFACTURER DEFINED PARAMETER NUMERIC 1 -16384 15 NUMERIC 1 5
+ 025030 RUNNING MEAN SEA-SURFACE TEMPERATURE USAGE CODE TABLE 25030 0 0 2 CODE TABLE 25030 0 1
+ 025032 WIND PROFILER MODE INFORMATION CODE TABLE 25032 0 0 2 CODE TABLE 25032 0 1
+ 025033 WIND PROFILER SUBMODE INFORMATION* CODE TABLE 25033 0 0 2 CODE TABLE 25033 0 1
+ 025034 WIND PROFILER QUALITY CONTROL TEST RESULTS* FLAG TABLE 25034 0 0 4 FLAG TABLE 25034 0 2
+ 025036 ATMOSPHERICS LOCATION METHOD CODE TABLE 25036 0 0 4 CODE TABLE 25036 0 2
+ 025040 CO2 WIND PRODUCT DERIVATION CODE TABLE 25040 0 0 4 CODE TABLE 25040 0 2
+ 025041 MOVING PLATFORM DIRECTION REPORTING METHOD CODE TABLE 25041 0 0 2 CODE TABLE 25041 0 1
+ 025042 MOVING PLATFORM SPEED REPORTING METHOD CODE TABLE 25042 0 0 2 CODE TABLE 25042 0 1
+ 025043 WAVE SAMPLING INTERVAL (TIME) S 4 0 15 S 4 5
+ 025044 WAVE SAMPLING INTERVAL (SPACE) M 2 0 14 M 2 5
+ 025045 HIRS CHANNEL COMBINATION FLAG TABLE 25045 0 0 21 FLAG TABLE 25045 0 7
+ 025046 MSU CHANNEL COMBINATION FLAG TABLE 25046 0 0 5 FLAG TABLE 25046 0 2
+ 025047 SSU CHANNEL COMBINATION FLAG TABLE 25047 0 0 4 FLAG TABLE 25047 0 2
+ 025048 AMSU-A CHANNEL COMBINATION FLAG TABLE 25048 0 0 16 FLAG TABLE 25048 0 6
+ 025049 AMSU-B CHANNEL COMBINATION FLAG TABLE 25049 0 0 6 FLAG TABLE 25049 0 2
+ 025051 AVHRR CHANNEL COMBINATION FLAG TABLE 25051 0 0 7 FLAG TABLE 25051 0 3
+ 025052 (CBS) LOG-10 OF PRINCIPAL COMPONENTS NORMALIZED FIT TO DATA NUMERIC 4 0 15 NUMERIC 4 5
+ 025053 OBSERVATION QUALITY FLAG TABLE 25053 0 0 12 FLAG TABLE 25053 0 4
+ 025054 SSMIS SUBFRAME ID NEMBER NUMERIC 0 0 5 NUMERIC 0 2
+ 025055 MULTIPLEXER HOUSEKEEPING K 2 0 16 K 2 5
+ 025060 SOFTWARE IDENTIFICATION (SEE NOTE 2) NUMERIC 0 0 14 NUMERIC 0 5
+ 025061 SOFTWARE IDENTIFICATION AND VERSION NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 025065 ORIENTATION CORRECTION (AZIMUTH) DEGREE 2 -1000 11 DEGREE 2 4
+ 025066 ORIENTATION CORRECTION (ELEVATION) DEGREE 2 -1000 11 DEGREE 2 4
+ 025067 RADIOSONDE RELEASE POINT PRESSURE CORRECTION PA 0 -8000 14 PA 0 4
+ 025068 NUMBER OF ARCHIVE RECOMPUTES NUMERIC 0 0 7 NUMERIC 0 3
+ 025069 FLIGHT LEVEL PRESSURE CORRECTIONS FLAG TABLE 25069 0 0 8 FLAG TABLE 25069 0 3
+ 025070 MAJOR FRAME COUNT NUMERIC 0 0 4 NUMERIC 0 2
+ 025071 FRAME COUNT NUMERIC 0 0 5 NUMERIC 0 2
+ 025075 SATELLITE ANTENNA CORRECTIONS VERSION NUMBER NUMERIC 0 0 5 NUMERIC 0 2
+ 025076 LOG-10 OF (TEMPERATURE-RADIANCE CENTRAL WAVENUMBER) FOR ATOVS LOG (1/M) 8 0 30 LOG (1/M) 8 10
+ 025077 BANDWIDTH CORRECTION COEFFICIENT 1 FOR ATOVS NUMERIC 5 -100000 18 NUMERIC 5 7
+ 025078 BANDWIDTH CORRECTION COEFFICIENT 2 FOR ATOVS NUMERIC 5 0 17 NUMERIC 5 6
+ 025079 ALBEDO-RADIANCE SOLAR FILTERED IRRADIANCE FOR ATOVS W/M**2 4 0 24 W/M**2 4 8
+ 025080 ALBEDO-RADIANCE EQUIVALENT FILTER WIDTH FOR ATOVS M 10 0 14 M 10 5
+ 025085 FRACTION OF CLEAR PIXELS IN HIRS FOV NUMERIC 0 0 7 NUMERIC 0 3
+ 025086 DEPTH CORRECTION INDICATOR CODE TABLE 25086 0 0 2 CODE TABLE 25086 0 1
+ 025091 STRUCTURE CONSTANT OF THE REFRACTION INDEX (CN2) dB 3 -18192 13 dB 3 5
+ 025092 ACOUSTIC PROPAGATION VELOCITY M/S 2 28000 14 M/S 2 5
+ 025093 RASS COMPUTATION CORRECTION FLAG TABLE 25093 0 0 8 FLAG TABLE 25093 0 3
+ 025095 ALTIMETER STATE FLAG FLAG TABLE 25095 0 0 2 FLAG TABLE 25095 0 1
+ 025096 RADIOMETER STATE FLAG FLAG TABLE 25096 0 0 5 FLAG TABLE 25096 0 2
+ 025097 THREE DIMENSIONAL ERROR ESTIMATE OF THE NAVIGATOR ORBIT CODE TABLE 25097 0 0 4 CODE TABLE 25097 0 2
+ 025100 XBT/XCTD FALL RATE EQUATION COEFFICIENT A NUMERIC 5 0 20 NUMERIC 5 6
+ 025101 XBT/XCTD FALL RATE EQUATION COEFFICIENT B NUMERIC 5 -500000 21 NUMERIC 5 6
+ 025102 (CBS) NUMBER OF MISSING LINES EXCLUDING DATA GAPS NUMERIC 0 0 8 NUMERIC 0 3
+ 025103 (CBS) NUMBER OF DIRECTIONAL BINS NUMERIC 0 0 8 NUMERIC 0 3
+ 025104 (CBS) NUMBER OF WAVE-LENGTH BINS NUMERIC 0 0 8 NUMERIC 0 3
+ 025107 (CBS) FIRST WAVE-LENGTH BIN M 3 0 29 M 3 9
+ 025108 (CBS) LAST WAVE-LENGTH BIN M 3 0 29 M 3 9
+ 025111 (CBS) NUMBER OF INPUT DATA GAPS NUMERIC 0 0 8 NUMERIC 0 3
+ 025120 (CBS) RA2-L2-PROCESSING FLAG CODE TABLE 25120 0 0 2 CODE TABLE 25120 0 1
+ 025121 (CBS) RA2-L2-PROCESSING QUALITY % 0 0 7 % 0 3
+ 025122 (CBS) HARDWARE CONFIGURATION FOR RF CODE TABLE 25122 0 0 2 CODE TABLE 25122 0 1
+ 025123 (CBS) HARDWARE CONFIGURATION FOR HPA CODE TABLE 25123 0 0 2 CODE TABLE 25123 0 1
+ 025124 (CBS) MWR L2 PROCESSING FLAG CODE TABLE 25124 0 0 2 CODE TABLE 25124 0 1
+ 025125 (CBS) MWR L2-PROCESSING QUALITY % 0 0 7 % 0 3
+ 025126 (CBS) MODEL DRY TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025127 (CBS) INVERTED BAROMETER CORRECTION M 3 -32768 16 M 3 5
+ 025128 (CBS) MODEL WET TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025129 (CBS) MWR DERIVED WET TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025130 (CBS) RA2 IONOSPHERIC CORRECTION ON KU BAND M 3 -32768 16 M 3 5
+ 025131 (CBS) IONOSPHERIC CORRECTION FROM DORIS ON KU BAND M 3 -32768 16 M 3 5
+ 025132 (CBS) IONOSPHERIC CORRECTION FROM MODEL ON KU BAND M 3 -32768 16 M 3 5
+ 025133 (CBS) SEA STATE BIAS CORRECTION ON KU BAND M 3 -32768 16 M 3 5
+ 025134 (CBS) RA2 IONOSPHERIC CORRECTION ON S BAND M 3 -32768 16 M 3 5
+ 025135 (CBS) IONOSPHERIC CORRECTION FROM DORIS ON S BAND M 3 -32768 16 M 3 5
+ 025136 (CBS) IONOSPHERIC CORRECTION FROM MODEL ON S BAND M 3 -32768 16 M 3 5
+ 025137 (CBS) SEA STATE BIAS CORRECTION ON S BAND M 3 -32768 16 M 3 5
+ 025138 (CBS) AVERAGE SIGNAL TO NOISE RATION NUMERIC 0 -2048 12 NUMERIC 0 4
+ 025192 START CHANNEL NUMERIC 0 0 14
+ 025193 END CHANNEL NUMERIC 0 0 14
+ 025194 CHANNEL SCALE FACTOR NUMERIC 0 0 6
+ 025197 ANTENNA CORRECTIONS VERSION NUMBER NUMERIC 0 0 5
+ 025198 LOG (TEMP-RAD CENTRAL WAVE NUMBER) 1/M 8 0 30
+ 025199 BANDWIDTH CORRECTION COEFFICIENT 1 NUMERIC 4 -10000 15
+ 025200 BANDWIDTH CORRECTION COEFFICIENT 2 NUMERIC 5 0 17
+ 025201 ALBEDO-RAD SOLAR FILTERED IRRADIANCE NUMERIC 4 0 24
+ 025202 ALBEDO-RAD EQUIVALENT FILTER WIDTH NUMERIC 10 0 14
+ 025203 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 25081 0 0 31
+ 025204 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 25082 0 0 31
+ 025205 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 25083 0 0 31
+ 025206 FOV QUALITY FLAGS FOR ATOVS FLAG TABLE 25084 0 0 31
+ 026001 PRINCIPAL TIME OF DAILY READING IN UTC OF MAXIMUM TEMPERATURE HOUR 1 0 12 HOUR 1 3
+ 026002 PRINCIPAL TIME OF DAILY READING IN UTC OF MINIMUM TEMPERATURE HOUR 1 0 12 HOUR 1 3
+ 026003 TIME DIFFERENCE MINUTE 0 -1440 12 MINUTE 0 4
+ 026010 HOURS INCLUDED FLAG TABLE 26010 0 0 26 FLAG TABLE 26010 0 9
+ 026020 DURATION OF PRECIPITATION MINUTE 0 0 11 MINUTE 0 4
+ 026193 YEAR YEAR 0 0 12
+ 026194 MONTH MONTH 0 0 4
+ 026195 DAY DAY 0 0 6
+ 026196 HOUR HOUR 0 0 5
+ 026197 MINUTE MINUTE 0 0 6
+ 026198 SECOND SECOND 0 0 6
+ 026200 LOCATION WITHIN ASSIMILATION WINDOW IN TIME NUMERIC 6 0 20
+ 026201 HOURS INCLUDED FLAG TABLE 26201 0 0 26
+ 027001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 027002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 027003 ALTERNATE LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 027004 ALTERNATE LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 027020 SATELLITE LOCATION COUNTER NUMERIC 0 0 16 NUMERIC 0 5
+ 027021 SATELLITE SUBLOCATION DIMENSION NUMERIC 0 0 16 NUMERIC 0 5
+ 027031 IN DIRECTION OF 0 DEGREES LONGITUDE, DISTANCE FROM THE EARTH'S C M 2 -1073741824 31 M 2 10
+ 027035 (VAL) LENGTH OF PHENOMENON M -3 0 13 M -3 4
+ 027080 (CBS) VIEWING AZIMUTH ANGLE DEGREE TRUE 2 0 16 DEGREE TRUE 0 5
+ 027193 SOLAR AZIMUTH DEGREE TRUE 2 0 16
+ 028001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 028002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 028003 ALTERNATE LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 028004 ALTERNATE LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 028031 IN DIRECTION 90 DEGREES EAST, DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31 M 2 10
+ 028035 (VAL) WIDTH OF PHENOMENON M -3 0 13 M -3 4
+ 029001 PROJECTION TYPE CODE TABLE 29001 0 0 3 CODE TABLE 29001 0 1
+ 029002 CO-ORDINATE GRID TYPE CODE TABLE 29002 0 0 3 CODE TABLE 29002 0 1
+ 030001 PIXEL VALUE (4 BITS) NUMERIC 0 0 4 NUMERIC 0 2
+ 030002 PIXEL VALUE (8 BITS) NUMERIC 0 0 8 NUMERIC 0 3
+ 030004 PIXEL VALUE (16 BITS) NUMERIC 0 0 16 NUMERIC 0 5
+ 030021 NUMBER OF PIXELS PER ROW NUMERIC 0 0 12 NUMERIC 0 4
+ 030022 NUMBER OF PIXELS PER COLUMN NUMERIC 0 0 12 NUMERIC 0 4
+ 030031 PICTURE TYPE CODE TABLE 30031 0 0 4 CODE TABLE 30031 0 2
+ 030032 COMBINATION WITH OTHER DATA FLAG TABLE 30032 0 0 16 FLAG TABLE 30032 0 6
+ 030193 POSITION NUMBER ALONG SCAN NUMERIC 0 0 8
+ 031000 SHORT DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 1 NUMERIC 0 1
+ 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8 NUMERIC 0 3
+ 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16 NUMERIC 0 5
+ 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8 NUMERIC 0 3
+ 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16 NUMERIC 0 5
+ 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 31021 0 0 6 CODE TABLE 31021 0 2
+ 031031 DATA PRESENT INDICATOR FLAG TABLE 31031 0 0 1 FLAG TABLE 31031 0 1
+ 031192 DATA PRESENT INDICATOR NUMERIC 0 0 1
+ 033001 RESERVED
+ 033002 QUALITY INFORMATION CODE TABLE 33002 0 0 2 CODE TABLE 33002 0 1
+ 033003 QUALITY INFORMATION CODE TABLE 33003 0 0 3 CODE TABLE 33003 0 1
+ 033004 RESERVED
+ 033005 QUALITY INFORMATION (AWS DATA) FLAG TABLE 33005 0 0 30 FLAG TABLE 33005 0 10
+ 033006 INTERNAL MEASUREMENT STATUS INFORMATION (AWS) CODE TABLE 33006 0 0 3 CODE TABLE 33006 0 1
+ 033007 PER CENT CONFIDENCE % 0 0 7 % 0 3
+ 033015 DATA QUALITY CHECK INDICATOR CODE TABLE 33015 0 0 6 CODE TABLE 33015 0 2
+ 033020 QUALITY CONTROL INDICATION OF FOLLOWING VALUE CODE TABLE 33020 0 0 3 CODE TABLE 33020 0 1
+ 033021 QUALITY OF FOLLOWING VALUE CODE TABLE 33021 0 0 2 CODE TABLE 33021 0 1
+ 033022 QUALITY OF BUOY SATELLITE TRANSMISSION CODE TABLE 33022 0 0 2 CODE TABLE 33022 0 1
+ 033023 QUALITY OF BUOY LOCATION CODE TABLE 33023 0 0 2 CODE TABLE 33023 0 1
+ 033024 STATION ELEVATION QUALITY MARK (FOR MOBILE STATIONS) CODE TABLE 33024 0 0 4 CODE TABLE 33024 0 2
+ 033025 ACARS INTERPOLATED VALUES CODE TABLE 33025 0 0 3 CODE TABLE 33025 0 1
+ 033026 MOISTURE QUALITY CODE TABLE 33026 0 0 6 CODE TABLE 33026 0 2
+ 033027 LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66 % CONFIDENCE) CODE TABLE 33027 0 0 3 CODE TABLE 33027 0 1
+ 033030 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 33030 0 0 24 FLAG TABLE 33030 0 8
+ 033031 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 33031 0 0 24 FLAG TABLE 33031 0 8
+ 033032 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 33032 0 0 24 FLAG TABLE 33032 0 8
+ 033033 FIELD OF VIEW QUALITY FLAGS FOR ATOVS FLAG TABLE 33033 0 0 24 FLAG TABLE 33033 0 8
+ 033035 MANUAL/AUTOMATIC QUALITY CONTROL CODE TABLE 33035 0 0 4 CODE TABLE 33035 0 2
+ 033036 NOMINAL CONFIDENCE THRESHOLD % 0 0 7 % 0 3
+ 033037 WIND CORRELATION ERROR FLAG TABLE 33037 0 0 20 FLAG TABLE 33037 0 7
+ 033038 QUALITY FLAGS FOR GROUND-BASED GNSS DATA FLAG TABLE 33038 0 0 10 FLAG TABLE 33038 0 4
+ 033039 (CBS) QUALITY FLAGS FOR RADIO OCCULTATION DATA FLAG TABLE 33039 0 0 16 FLAG TABLE 33039 0 6
+ 033040 CONFIDENCE INTERVAL % 0 0 7 PERCENT 0 3
+ 033041 ATTRIBUTE OF FOLLOWING VALUE CODE TABLE 33041 0 0 2 CODE TABLE 33041 0 1
+ 033042 (CBS) TYPE OF LIMIT REPRESENTED BY FOLLOWING VALUE CODE TABLE 33042 0 0 3 CODE TABLE 33042 0 1
+ 033043 (CBS) AST CONFIDENCE FLAG TABLE 33043 0 0 8 FLAG TABLE 33043 0 3
+ 033044 (CBS) ASAR QUALITY INFORMATION FLAG TABLE 33044 0 0 15 FLAG TABLE 33044 0 5
+ 033045 (CBS) PROBABILITY OF FOLLOWING EVENT % 0 0 7 % 0 3
+ 033046 (CBS) CONDITIONAL PROBABILITY OF FOLLOWING EVENT WITH RESPECT TO % 0 0 7 % 0 3
+ 033047 (CBS) MEASUREMENT CONFIDENCE DATA FLAG TABLE 33047 0 0 31 FLAG TABLE 33047 0 11
+ 033048 (CBS) CONFIDENCE MEASURE OF SAR INVERSION CODE TABLE 33048 0 0 2 CODE TABLE 33048 0 1
+ 033049 (CBS) CONFIDENCE MEASURE OF WIND RETRIEVAL CODE TABLE 33049 0 0 2 CODE TABLE 33049 0 1
+ 033050 GLOBAL GTSPP QUALITY FLAG CODE TABLE 33050 0 0 4 CODE TABLE 33050 0 2
+ 033052 (CBS) S BAND OCEAN RETRACKING QUALITY FLAG TABLE 33052 0 0 21 FLAG TABLE 33052 0 7
+ 033053 (CBS) KU BAND OCEAN RETRACKING QUALITY FLAG TABLE 33053 0 0 21 FLAG TABLE 33053 0 7
+ 033192 GQIS FLAG QUAL CODE TABLE 0 0 2
+ 033193 GQIS QUAL INDEX % 0 0 7
+ 033194 QIS QUAL INDEX LOC % 0 0 7
+ 033195 GQIS QUAL INDEX RAD % 0 0 7
+ 033196 GQIS QUAL INDEX SPECT % 0 0 7
+ 033197 GQIS SYSTEC SOND QUAL CODE TABLE 0 0 24
+ 033198 MINIMUM COST NUMERIC 4 0 14
+ 033199 1D VAR TOTAL PRECIPITABLE WATER RETRIEVED ERROR(S) KG/M**2 2 0 11
+ 033200 ANALYSIS REPORT EVENTS FLAG TABLE 33200 0 0 31
+ 033201 ANALYSIS REPORT STATUS EVENT FLAG TABLE 33201 0 0 13
+ 033202 ANALYSIS DATUM EVENT FLAGS (1) FLAG TABLE 33202 0 0 31
+ 033203 ANALYSIS DATUM EVENT FLAGS (2) FLAG TABLE 33203 0 0 11
+ 033204 ANALYSIS DATUM STATUS FLAGS FLAG TABLE 33204 0 0 21
+ 033205 VARIATIONAL ANALYSIS BLACK LIST FLAG CODE TABLE 33205 0 0 4
+ 033206 VARIATIONAL ANALYSIS QUALITY CONTROL FLAG CODE TABLE 33206 0 0 4
+ 033207 VARIATIONAL ANALYSIS DEPARTURE FLAG CODE TABLE 33207 0 0 4
+ 033208 VARIATIONAL ANALYSIS FIRST QUESS CHECK FLAG CODE TABLE 033208 0 0 4
+ 033209 VARIATIONAL ANALYSIS FINAL FLAG CODE TABLE 33209 0 0 4
+ 033210 INCREMENTAL VARIATIONAL ANALYSIS UPDATE NUMBER NUMERIC 0 0 7
+ 033211 MINIMISATION SIMULATION NUMBER NUMERIC 0 0 10
+ 033212 1D VAR ITERATION NUMBER NUMERIC 0 0 10
+ 033213 1D VAR RADIANCE COST NUMERIC 1 -1000 11
+ 033214 1D VAR ERROR(S) FLAG TABLE 33214 0 0 11
+ 033215 DIRECTIONAL SKILL NUMERIC 1 -4096 13
+ 033216 1D VAR SURFACE TYPE QUALITY CONTROL CODE TABLE 33216 0 0 3
+ 033217 1D VAR FAILURE INDICATOR CODE TABLE 33217 0 0 2
+ 033218 1D VAR ESTIMATE OF SCATTERING NUMERIC 2 0 12
+ 033219 SSMI INDIPENDENT SCATTERING INDEX NUMERIC 2 -50000 16
+ 033220 VARIATIONAL ANALYSIS REPORT EVENTS (1) FLAG TABLE 33220 0 0 31
+ 033221 VARIATIONAL ANALYSIS SYNOP EVENTS (2) FLAG TABLE 33221 0 0 31
+ 033222 VARIATIONAL ANALYSIS AIREP EVENTS (2) FLAG TABLE 33222 0 0 31
+ 033223 VARIATIONAL ANALYSIS SATOB EVENTS (2) FLAG TABLE 33223 0 0 31
+ 033224 VARIATIONAL ANALYSIS DRIBU EVENTS (2) FLAG TABLE 33224 0 0 31
+ 033225 VARIATIONAL ANALYSIS TEMP EVENTS (2) FLAG TABLE 33225 0 0 31
+ 033226 VARIATIONAL ANALYSIS PILOT EVENTS (2) FLAG TABLE 33226 0 0 31
+ 033227 VARIATIONAL ANALYSIS SATEM/TOVS EVENTS (2) FLAG TABLE 33227 0 0 31
+ 033228 VARIATIONAL ANALYSIS PAOB EVENTS (2) FLAG TABLE 33228 0 0 31
+ 033229 VARIATIONAL ANALYSIS SCATTEROMETER EVENTS (2) FLAG TABLE 33229 0 0 31
+ 033230 VARIATIONAL ANALYSIS RAW RADIANCES EVENTS (2) FLAG TABLE 33230 0 0 31
+ 033231 PRESAT SUMMARY FLAGS FLAG TABLE 33231 0 0 6
+ 033232 REPORT BLACK LIST EVENTS FLAG TABLE 33232 0 0 31
+ 033233 VARIATIONAL ANALYSIS REPORT STATUS FLAG TABLE 33233 0 0 31
+ 033234 VARIATIONAL ANALYSIS DATUM STATUS FLAG TABLE 33234 0 0 31
+ 033236 VARIATIONAL ANALYSIS DATUM EVENTS (1) FLAG TABLE 33236 0 0 31
+ 033237 VARIATIONAL ANALYSIS SYNOP DATUM EVENTS (2) FLAG TABLE 033237 0 0 31
+ 033238 VARIATIONAL ANALYSIS AIREP DATUM EVENTS (2) FLAG TABLE 033238 0 0 31
+ 033239 VARIATIONAL ANALYSIS SATOB DATUM EVENTS (2) FLAG TABLE 033239 0 0 31
+ 033240 VARIATIONAL ANALYSIS DRIBU DATUM EVENTS (2) FLAG TABLE 033240 0 0 31
+ 033241 GROSS ERROR PROBABILITY NUMERIC 3 0 10
+ 033242 GROSS ERROR INDICATOR CODE TABLE 33242 0 0 2
+ 033243 VARIATIONAL ANALYSIS TEMP DATUM EVENTS (2) FLAG TABLE 33243 0 0 31
+ 033244 VARIATIONAL ANALYSIS PILOT DATUM EVENTS (2) FLAG TABLE 033244 0 0 31
+ 033245 VARIATIONAL ANALYSIS SATEM/TOVS DATUM EVENTS (2) FLAG TABLE 33245 0 0 31
+ 033246 VARIATIONAL ANALYSIS PAOB DATUM EVENTS (2) FLAG TABLE 33246 0 0 31
+ 033247 VARIATIONAL ANALYSIS SCATTEROMETER DATUM EVENTS (2) FLAG TABLE 33247 0 0 31
+ 033248 VARIATIONAL ANALYSIS RAW RADIANCES DATUM EVENTS (2) FLAG TABLE 33248 0 0 31
+ 033249 DATUM BLACK LIST EVENTS FLAG TABLE 33249 0 0 31
+ 033250 PROBABILITY OF GROSS ERROR NUMERIC 6 0 20
+ 033251 RANGE OF POSSIBLE VALUES NUMERIC 2 0 14
+ 033252 MANUAL-AUTOMATIC QUALITY CONTROL CODE TABLE 33252 0 0 4
+ 033253 NOMINAL CONFIDENCE THRESHOLD % 0 0 7
+ 033254 WIND CORRELATION METHOD FLAG TABLE 33254 0 0 20
+ 035000 FM AND REGIONAL CODE NUMBER CODE TABLE 35000 0 0 10 CODE TABLE 35000 0 3
+ 035001 TIME-FRAME FOR MONITORING CODE TABLE 35001 0 0 3 CODE TABLE 35001 0 1
+ 035011 NUMBER OF REPORTS ACTUALLY RECEIVED NUMERIC 0 0 14 NUMERIC 0 4
+ 035021 BULLETIN BEING MONITORED (TTAAII) CCITTIA5 0 0 48 CHARACTER 0 6
+ 035022 BULLETIN BEING MONITORED (YYGGGG) CCITTIA5 0 0 48 CHARACTER 0 6
+ 035023 BULLETIN BEING MONITORED (CCCC) CCITTIA5 0 0 32 CHARACTER 0 4
+ 035024 BULLETIN BEING MONITORED (BBB) CCITTIA5 0 0 24 CHARACTER 0 3
+ 035030 DISCREPANCIES IN THE AVAILABILITY OF EXPECTED DATA CODE TABLE 35030 0 0 4 CODE TABLE 35030 0 1
+ 035031 QUALIFIER ON MONITORING RESULTS CODE TABLE 35031 0 0 7 CODE TABLE 35031 0 2
+ 035032 CAUSE OF MISSING DATA CODE TABLE 35032 0 0 4 CODE TABLE 35032 0 1
+ 035033 OBSERVATION AND COLLECTION DEFICIENCIES CODE TABLE 35033 0 0 7 CODE TABLE 35033 0 2
+ 035034 STATISTICAL TRENDS FOR AVAILABILITY OF DATA (DURING THE SURVEY P CODE TABLE 35034 0 0 3 CODE TABLE 35034 0 1
+ 035035 REASON FOR TERMINATION CODE TABLE 35035 0 0 5 CODE TABLE 35035 0 2
+ 049193 SAR INVERSION QC FLAGS FLAG TABLE 49193 0 0 15
+ 049194 ALTIMETER WAVE HEIGHT QC FLAFS FLAG TABLE 49194 0 0 15
+ 062190 STATISTICS APPLICATION CODE TABLE 62190 0 0 8
+ 062191 TYPE OF STATISTICS CODE TABLE 62191 0 0 8
+ 063190 APPLICATION DERIVING SUBSTITUTE OR ALTERNATIVE VALUE CODE TABLE 63190 0 0 8
diff --git a/bufrtables/C0000000000000014000.TXT b/bufrtables/C0000000000000014000.TXT
new file mode 100755
index 0000000..4f0f41f
--- /dev/null
+++ b/bufrtables/C0000000000000014000.TXT
@@ -0,0 +1,6040 @@
+001003 0008 0000 01 ANTARCTICA
+ 0001 01 REGION I
+ 0002 01 REGION II
+ 0003 01 REGION III
+ 0004 01 REGION IV
+ 0005 01 REGION V
+ 0006 01 REGION VI
+ 0007 01 MISSING VALUE
+001007 0132 0001 01 ERS 1
+ 0002 01 ERS 2
+ 0003 01 METOP-1
+ 0004 01 METOP-2
+ 0005 01 METOP-3
+ 0020 01 SPOT1
+ 0021 01 SPOT2
+ 0022 01 SPOT3
+ 0023 01 SPOT4
+ 0040 01 OERSTED
+ 0041 01 CHAMP
+ 0042 01 TERRASAR-X
+ 0050 01 METEOSAT 3
+ 0051 01 METEOSAT 4
+ 0052 01 METEOSAT 5
+ 0053 01 METEOSAT 6
+ 0054 01 METEOSAT 7
+ 0055 01 METEOSAT 8
+ 0056 01 METEOSAT 9
+ 0057 01 METEOSAT 10
+ 0058 01 METEOSAT 1
+ 0059 01 METEOSAT 2
+ 0060 01 ENVISAT
+ 0070 01 METEOSAT 11
+ 0120 01 ADEOS
+ 0121 01 ADEOS II
+ 0150 01 GMS 3
+ 0151 01 GMS 4
+ 0152 01 GMS 5
+ 0171 01 MTSAT-1R
+ 0172 01 MTSAT-2
+ 0200 01 NOAA 8
+ 0201 01 NOAA 9
+ 0202 01 NOAA 10
+ 0203 01 NOAA 11
+ 0204 01 NOAA 12
+ 0205 01 NOAA 14
+ 0206 01 NOAA 15
+ 0207 01 NOAA 16
+ 0208 01 NOAA 17
+ 0209 01 NOAA 18
+ 0220 01 LANDSAT 5
+ 0221 01 LANDSAT 4
+ 0222 01 LANDSAT 7
+ 0240 01 DMSP 7
+ 0241 01 DMSP 8
+ 0242 01 DMSP 9
+ 0243 01 DMSP 10
+ 0244 01 DMSP 11
+ 0245 01 DMSP 12
+ 0246 01 DMSP 13
+ 0247 01 DMSP 14
+ 0248 01 DMSP 15
+ 0249 01 DMSP 16
+ 0250 01 GOES 6
+ 0251 01 GOES 7
+ 0252 01 GOES 8
+ 0253 01 GOES 9
+ 0254 01 GOES 10
+ 0255 01 GOES 11
+ 0256 01 GOES 12
+ 0257 01 GOES 13
+ 0258 01 GOES 14
+ 0259 01 GOES 15
+ 0260 01 JASON-1
+ 0261 01 JASON-2
+ 0281 01 QUIKSCAT
+ 0282 01 TRMM
+ 0283 01 CORIOLIS
+ 0285 01 DMSP17
+ 0310 01 GOMS 1
+ 0311 01 GOMS 2
+ 0320 01 METEOR 2-21
+ 0321 01 METEOR 3-5
+ 0322 01 METEOR 3M-1
+ 0323 01 METEOR 3M-2
+ 0341 01 RESURS 01-4
+ 0430 01 INSAT 1B
+ 0431 01 INSAT 1C
+ 0432 01 INSAT 1D
+ 0450 01 INSAT 2A
+ 0451 01 INSAT 2B
+ 0452 01 INSAT 2E
+ 0470 01 INSAT 3A
+ 0471 01 INSAT 3D
+ 0472 01 INSAT 3E
+ 0500 01 FY-1C
+ 0501 01 FY-1D
+ 0510 01 FY-2
+ 0512 01 FY-2B
+ 0513 01 FY-2C
+ 0514 01 FY-2D
+ 0700 01 TIROS M (ITOS 1)
+ 0701 01 NOAA 1
+ 0702 01 NOAA 2
+ 0703 01 NOAA 3
+ 0704 01 NOAA 4
+ 0705 01 NOAA 5
+ 0706 01 NOAA 6
+ 0707 01 NOAA 7
+ 0708 01 TIROS-N
+ 0710 01 GOES (SMS 1)
+ 0711 01 GOES (SMS 2)
+ 0720 01 TOPEX
+ 0721 01 GFO (GEOSAT FOLLOW ON)
+ 0722 01 GRACE A
+ 0723 01 GRACE B
+ 0731 01 GOES 1
+ 0732 01 GOES 2
+ 0733 01 GOES 3
+ 0734 01 GOES 4
+ 0735 01 GOES 5
+ 0740 01 COSMIC-1
+ 0741 01 COSMIC-2
+ 0742 01 COSMIC-3
+ 0743 01 COSMIC-4
+ 0744 01 COSMIC-5
+ 0745 01 COSMIC-6
+ 0763 01 NIMBUS 3
+ 0764 01 NIMBUS 4
+ 0765 01 NIMBUS 5
+ 0766 01 NIMBUS 6
+ 0767 01 NIMBUS 7
+ 0780 01 ERBS
+ 0781 01 UARS
+ 0782 01 EARTH PROBE
+ 0783 01 TERRA
+ 0784 01 AQUA
+ 0785 01 AURA
+ 0800 01 SUNSAT
+ 0820 01 SAC-C
+ 1023 01 MISSIN VALUE
+001031 0218 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+001032 0041 0001 01 PREPROCESSING CONSISTENCY CHECK
+ 0010 01 BIAS CORRECTION
+ 0020 01 BLACK LIST
+ 0030 01 OI MASS AND WIND ANALYSIS, REPORT STATUS
+ 0031 01 OI HUMIDITY ANALYSIS, REPORT STATUS
+ 0032 01 OI ANALYSIS VARIABLES
+ 0033 01 OI ANALYSIS, FIRST GUESS Q/C
+ 0034 01 OI ANALYSIS, FINAL ANALYSIS Q/C
+ 0035 01 OI ANALYSIS, EVENT FLAGS
+ 0040 01 DYNAMIC INITIALISATION SCHEME
+ 0041 01 NORMAL MODE INITIALISATION SCHEME
+ 0050 01 SURFACE ANALYSIS, REPORT STATUS
+ 0051 01 SURFACE ANALYSIS VARIABLES
+ 0052 01 SURFACE ANALYSIS Q/C
+ 0053 01 SURFACE ANALYSIS, EVENT FLAGS
+ 0060 01 3D VAR REPORT STATUS
+ 0061 01 3D VAR ANALYSIS VARIABLES
+ 0062 01 3D VAR Q/C
+ 0063 01 3D VAR EVENT FLAGS
+ 0080 01 PRESAT FIRST GUESS
+ 0081 01 PRESAT ERROR STANDARD DEVIATIONS
+ 0082 01 PRESAT BIAS ESTIMATES
+ 0083 01 PRESAT BRIGHTNESS TEMPERATURE QUALITY FLAGS
+ 0084 01 PRESAT SAMARY FLAGS
+ 0090 01 FIRST GUESS (6 HOUR FORECAST)
+ 0091 01 FIRST GUESS (FGAT INTERPOLATED)
+ 0100 01 PRESCAT AMBIGUITY REMOVAL
+ 0110 01 WAM FIRST GUESS
+ 0111 01 WAM ANALYSIS
+ 0112 01 WAM FORECAST
+ 0113 01 WAM Q/C
+ 0201 01 COLLOCATION WITH SURFACE DATA
+ 0202 01 COLLOCATION WITH TEMP/PILOT DATA
+ 0203 01 COLLOCATION WITH AIREP DATA
+ 0204 01 COLLOCATION WITH SATOB DATA
+ 0205 01 COLLOCATION WITH TOVS DATA
+ 0206 01 COLLOCATION WITH ERS1 SCATTEROMETER DATA
+ 0207 01 COLLOCATION WITH ERS1 ALTIMETER DATA
+ 0220 01 ERS1 SCATTEROMETER COLLOCATION BLACK LIST
+ 0230 01 GAUSS ERROR
+ 0231 01 GROSS ERROR
+001033 0218 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+001035 0219 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+ 0255 01 MISSING VALUE
+001090 0005 0000 01 LAF (LAGGED-AVERAGE FORECASTING)
+ 0001 01 BREEDING
+ 0002 01 SINGULAR VECTOR
+ 0003 01 MULTIPLE ANALYSIS CYCLE
+ 0255 01 MISSING VALUE
+001092 0005 0000 01 UNPERTURBED HIGH-RESOLUTION CONTROL FORECAST
+ 0001 01 UNPERTURBED LOW-RESOLUTION CONTROL FORECAST
+ 0002 01 NEGATIVELY PERTURBED FORECAST
+ 0003 01 POSITIVELY PERTURBED FORECAST
+ 0255 01 MISSING VALUE
+002001 0004 0000 01 AUTOMATIC STATION
+ 0001 01 MANNED STATION
+ 0002 01 HYBRID, BOTH MANNED AND AUTOMATIC
+ 0003 01 MISSING VALUE
+002002 0004 0000 01 MEASURED IN M S-1 UNLESS OTHERWISE INDICATED
+ 0001 01 CERTIFIED INSTRUMENTS
+ 0002 01 ORIGINALY MEASURED IN KNOTS
+ 0003 01 ORIGINALY MEASURED IN KM/H
+002003 0012 0000 01 PRESSURE INSTRUMENT ASSOCIATED WITH WIND-MEASURING EQUIPMENT
+ 0001 01 OPTICAL THEODOLITE
+ 0002 01 RADIO THEODOLITE
+ 0003 01 RADAR
+ 0004 01 VLF-OMEGA
+ 0005 01 LORAN C
+ 0006 01 WIND PROFILER
+ 0007 01 SATELLITE NAVIGATION
+ 0008 01 RADIO-ACOUSTIC SOUNDING SYSTEM (RASS)
+ 0009 01 SODAR
+ 0014 02 PRESSURE INSTRUMENT ASSOCIATED WITH WIND MEASUREMENT EQUIPME
+ NT BUT PRESSURE ELEMENT FAILED DURING ASCENT
+ 0015 01 MISSING VALUE
+002004 0011 0000 01 USA OPEN PAN EVAPORIMETER (WITHOUT COVER)
+ 0001 01 USA OPEN PAN EVAPORIMETER (MESH COVERED)
+ 0002 01 GGI-300 EVAPORIMETER (SUNKEN)
+ 0003 01 20 M**2 TANK
+ 0004 01 OTHERS
+ 0005 01 RICE
+ 0006 01 WHEAT
+ 0007 01 MAIZE
+ 0008 01 SORGHUM
+ 0009 01 OTHER CROPS
+ 0015 01 MISSING VALUE
+002011 0054 0000 01 RESERVED
+ 0001 01 RESERVED
+ 0002 01 NO RADIOSONDE-PASSIVE TARGET(E.G.REFLECTOR)
+ 0003 01 NO RADIOSONDE-ACTIVE TARGET(E.G.TRANSPONDER)
+ 0004 01 NO RADIOSONDE-PASSIVE TEMPERATURE-HUMIDITY PROFILER
+ 0005 01 NO RADIOSONDE-ACTIVE TEMPERATURE-HUMIDITY PROFILER
+ 0006 01 NO RADIOSONDE-RADIO ACOUSTIC SOUNDER
+ 0009 01 NO RADIOSONDE-SYSTEM UNKNOWN OR NOT SPECIFIED
+ 0010 01 RS VIZ TYPE A (USA)
+ 0011 01 RS VIZ TYPE B (USA)
+ 0012 01 RS SDC (SPACE DATA CORPORATION-USA)
+ 0013 01 ASTOR (NO LONGER MADE-AUSTRALIA)
+ 0014 01 VIZ MARK I MICROSONDE(USA)
+ 0015 01 EEC COMPANY TYPE 23 (USA)
+ 0016 01 ELIN (AUSTRIA)
+ 0017 01 GRAW G. (GERMANY)
+ 0019 01 GRAW M60 (GERMANY)
+ 0020 01 INDIAN MET SERVICE MK3 (INDIA)
+ 0021 01 VIZ/JIN YANG MARK I MICROSONDE(SOUTH KOREA)
+ 0022 01 MEISEI RS2-80 (JAPAN)
+ 0023 01 MESURAL FMO 1950A (FRANCE)
+ 0024 01 MESURAL FMO 19455A (FRANCE)
+ 0025 01 MESURAL MH73A (FRANCE)
+ 0026 01 METEOLABOR BASORA (SWITZERLAND)
+ 0027 01 AVK-MRZ (USSR)
+ 0028 01 METEORIT MARZ2-1 (USSR)
+ 0029 01 METEIRIT MARZ2-2 (USSR)
+ 0030 01 OKI RS2-80 (JAPAN)
+ 0031 01 VIZ/VALCOM TYPE A PRESSURE-COMMUTATED(CANADA)
+ 0032 01 SHANGAI RADIO (CHINA)
+ 0033 01 UK MET OFFICE MK3( UK)
+ 0034 01 VINOHRADY(CZECHOSLOVAKIA)
+ 0035 01 VAISALA RS18 (FINLAND)
+ 0036 01 VAISALA RS21 (FINLAND)
+ 0037 01 VAISALA RS80 (FINLAND)
+ 0038 01 VIZ LOCATE (LORAN-C)(USA)
+ 0039 01 SPRENGER E076 (GERMANY)
+ 0040 01 SPRENGER E084 (GERMANY)
+ 0041 01 SPRENGER E085 (GERMANY)
+ 0042 01 SPRENGER E086 (GERMANY)
+ 0043 01 AIR IS -4A-1680 (UK)
+ 0044 01 AIR IS -4A-1680 X (UK)
+ 0045 01 RS MSS(USA)
+ 0046 01 AIR IS -4A-403(USA)
+ 0047 01 MEISLEI RS2-91(JAPAN)
+ 0048 01 VALCOM(CANADA)
+ 0049 01 VIZ MARK II(USA)
+ 0060 01 VAISALA RS80/MICROCORA (FINLAND)
+ 0061 01 VAISALA RS80/DIGCORA OR MARWIN (FINLAND)
+ 0062 01 VAISALA RS80/PCCORA (FINLAND)
+ 0063 01 VAISALA RS80/STAR (FINLAND)
+ 0064 03 ORBITAL,SCIENCE CORPORATION,SPACE DATA DIVISION,TRANSPONDER
+ RADIOSONDE,TYPE 909-11-XX,WHERE XX CORRECPOND TO THE MODEL
+ OF THE INSTRUMENT
+ 0065 01 VIZ TRANSPONDER RADIOSONDE,MODEL NUMBER 1499-520(USA)
+ 0255 01 MISSING VALUE
+002012 0001 0000 01 TO BE DEVELOPED
+002013 0009 0000 01 NO CORRECTION
+ 0001 01 CIMO SOLAR CORRECTED AND CIMO INFRARED CORRECTED
+ 0002 01 CIMO SOLAR CORRECTED AND IFRARED CORRECTED
+ 0003 01 CIMO SOLAR CORRECTED ONLY
+ 0004 02 SOLAR AND INFRARED CORRECTED AUTOMATICALLY BY RADIOSONDE SY
+ STEM
+ 0005 01 SOLAR CORRECTED AUTOMATICALLY BY RADIOSONDE SYSTEM
+ 0006 01 SOLAR AND INFRARED CORRECTED AS SPECIFIED BY COUNTRY
+ 0007 01 SOLAR CORRECTED AS SPECIFIED BY COUNTRY
+ 0015 01 MISSING VALUE
+002014 0050 0000 01 NO WINDFINDING
+ 0001 01 AUTOMATIC WITH AUXILIARY OPTICAL DIRECTION FINDING
+ 0002 01 AUTOMATIC WITH AUXILIARY RADIO DIRECTION FINDING
+ 0003 01 AUTOMATIC WITH AUXILIARY RANGING
+ 0004 01 NOT USED
+ 0005 01 AUTOMATIC WITH MULTIPLE VLF-OMEGA SIGNALS
+ 0006 01 AUTOMATIC CROSS CHAIN LORAN-C
+ 0007 01 AUTOMATIC WITH AUXILIARY WIND PROFILER
+ 0008 01 AUTOMATIC SATELLITE NAVIGATION
+ 0019 01 TRACKING TECHNIQUE NOT SPECIFIED
+ 0020 01 VESSEL STOPPED
+ 0021 01 VESSEL DIVERTED FROM ORIGINAL DESTINATION
+ 0022 01 VESSEL'S ARRIVAL DELAYED
+ 0023 01 CONTAINER DAMAGED
+ 0024 01 POWER FAILURE TO CONTAINER
+ 0029 01 OTHER PROBLEMS
+ 0030 01 MAJOR POWER PROBLEMS
+ 0031 01 UPS INOPERATIVE
+ 0032 01 RECEIVER HARDWARE PROBLEMS
+ 0033 01 RECEIVER SOFTWARE PROBLEMS
+ 0034 01 PROCESSOR HARDWARE PROBLEMS
+ 0035 01 PROCESSOR SOFTWARE PROBLEMS
+ 0036 01 NAVAID SYSTEM DAMAGED
+ 0037 01 SHORTAGE OF LIFTING GAS
+ 0039 01 OTHER PROBLEMS
+ 0040 01 MECHANICAL DEFECT
+ 0041 01 MATERIAL DEFECT (HAND LAUNCHER)
+ 0042 01 POWER FAILURE
+ 0043 01 CONTROL FAILURE
+ 0044 01 PNEUMATIC/HYDRAULIC FAILURE
+ 0045 01 OTHER PROBLEMS
+ 0046 01 COMPRESSOR PROBLEMS
+ 0047 01 BALLOON PROBLEMS
+ 0048 01 BALLOON RELEASE PROBLEMS
+ 0049 01 LAUNCHER DAMAGED
+ 0050 01 R/S RECEIVER ANTENNA DEFECT
+ 0051 01 NAVAID ANTENNA DEFECT
+ 0052 01 R/S RECEIVER CABLING (ANTENNA DEFECT)
+ 0053 01 NAVAID ANTENNA CABLING DEFECT
+ 0059 01 OTHER PROBLEMS
+ 0060 01 ASAP COMMUNICATIONS DEFECT
+ 0061 01 COMMUNICATIONS FACILITY REJECTED DATA
+ 0062 01 NO POWER AT TRANSMITTINGANTENN
+ 0063 01 ANTENNA CABLE BROKEN
+ 0064 01 ANTENNA CABLE DEFECT
+ 0065 01 MESSAGE TRANSMITTED POWER BELOW NORMAL
+ 0069 01 OTHER PROBLEMS
+ 0070 01 ALL SYSTEMS IN NORMAL OPERATION
+ 0099 01 STATUS OF SYSTEM AND ITS COMPONENTS NOT SPECIFIED
+ 0127 01 MISSING VALUE
+002015 0006 0001 01 PRESSURE ONLY RADIOSONDE
+ 0002 01 PRESSURE ONLY RADIOSONDE PLUS TRANSPONDER
+ 0003 01 PRESSURE ONLY RADIOSONDE PLUS RADAR REFLECTOR
+ 0004 01 NO PRESSURE RADIOSONDE PLUS TRANSPONDER
+ 0005 01 NO PRESSURE RADIOSONDE PLUS RADAR REFLECTOR
+ 0015 01 MISSING VALUE
+002016 0004 0001 01 TRAIN REGULATOR
+ 0002 01 LIGHT UNIT
+ 0003 01 PARACHUTE
+ 0004 01 ROOFTOP RELEASE
+002019 0296 0010 02 BNSC RADIOMETER AATSR ADVANCED ALONG TRACK SCANNIN
+ G RADIOMETER
+ 0011 02 BNSC RADIOMETER ATSR ALONG TRACK SCANNING RADIOME
+ TER
+ 0012 02 BNSC RADIOMETER ATSR-2 ALONG TRACK SCANNING RADIOME
+ TER -2
+ 0013 01 BNSC RADIOMETER MWR MICROWAVE RADIOMETER
+ 0030 01 CNES COMMUNICATIONS ARGOS
+ 0040 01 CNES LIDAR LASER REFLECTORS
+ 0041 02 CNES LIDAR DORIS DOPPLER ORBITOGRAPHY AND RADIO-POSIT
+ IONING INTEGRATED BY SATELLITE
+ 0042 02 CNES LIDAR DORIS-NG DOPPLER ORBITOGRAPHY AND RAD
+ IO-POSITIONING INTEGRATED BY SATELLITE-NG
+ 0047 03 CNES RADAR ALTIMETERS POSEIDON-1 (SSALT-1) POSI
+ TIONING OCEAN SOLID EARTH ICE DYNAMICS ORBITING NAVIGATOR (S
+ INGLE FREQUENCY SOLID STATE RADAR ALTIMETER)
+ 0048 03 CNES RADAR ALTIMETERS POSEIDON-2 (SSALT-2) POSI
+ TIONING OCEAN SOLID EARTH ICE DYNAMICS ORBITING NAVIGATOR (D
+ UAL FREQUENCY SOLID STATE RADAR ALTIMETER)
+ 0050 01 CNES IMAGER RADIOMETER ATSR/M ATSR/M
+ 0051 01 CNES HIGH RESOLUTION OPTICAL IMAGERS HRG
+ 0052 01 CNES RADIOMETER HRV HIGH RESOLUTION VISIBLE
+ 0053 02 CNES RADIOMETER HRVIR HIGH RESOLUTION VISIBLE AND
+ INFRA-RED
+ 0054 02 CNES RADIOMETER SCARAB/MV2 SCANNER FOR EARTH'S
+ RADIATION BUDGET
+ 0055 01 CNES RADIOMETER POLDER POLDER
+ 0060 01 CNES SPECTROMETER VEGETATION VEGETATION
+ 0061 01 CNES SPECTROMETER WINDII WINDII
+ 0080 01 CSA COMMUNICATIONS RADARSAT DTT
+ 0081 01 CSA COMMUNICATIONS RADARSAT TTC
+ 0085 02 CSA RADAR SAR (CSA) SYNTHETIC APERTURE RADAR (CS
+ A)
+ 0090 02 CSA RADIOMETER MOPITT MEASUREMENTS OF POLLUTION IN
+ THE TROPOSPHERE
+ 0091 02 CSA CHEMISTRY INSTRUMENTS OSIRIS OPTICAL SPECTROGRAPH
+ AND INFRA-RED IMAGING SYSTEM
+ 0097 01 CSIRO RADIOMETER PANCHROMATIC IMAGER
+ 0098 02 CRCSS ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GPS
+ RECEIVER
+ 0102 02 DLR RADIOMETER CHAMP GPS SOUNDER GPS TURBORO
+ GUE SPACE RECEIVER (TRSR)
+ 0103 01 UNKNOWN
+ 0116 03 DLR MAGNETOMETER IGOR CHAMP GRAVITY PACKAGE (ACCELEROMETE
+ R+GPS) INTEGRATED GPS AND OCCULTATION RECEIVER STAR AC
+ CELEROMETER
+ 0117 03 DLR MAGNETOMETER CHAMP MAGNETOMETRY PACKAGE (1 SCALAR
+ +2 VECTOR MAGNETOMETER) OVERHAUSER MAGNETOMETER (OVM) AN
+ D FLUXGATE MAGNETOMETER (FGM)
+ 0120 02 ESA COMMUNICATIONS ENVISAT COMMS COMMUNICATIONS PACKA
+ GE ON ENVISAT
+ 0121 02 ESA COMMUNICATIONS ERS COMMS COMMUNICATION PACKAG
+ E FOR ERS
+ 0130 01 ESA LIDARS ALADIN ATMOSPHERIC LASER DOPPLER INSTRUMENT
+ 0131 01 ESA LIDARS ATLID ATMOSPHERIC LIDAR
+ 0140 02 ESA RADAR AMI/SAR/IMAGE ACTIVE MICROWAVE INSTRUMENTA
+ TION. IMAGE MODE
+ 0141 02 ESA RADAR AMI/SAR/WAVE ACTIVE MICROWAVE INSTRUMENTA
+ TION. WAVE MODE
+ 0142 02 ESA RADAR AMI/SCATTEROMETER ACTIVE MICROWAVE INS
+ TRUMENTATION. WIND MODE
+ 0143 01 ESA RADAR ASAR ASAR
+ 0144 02 ESA IMAGING MICROWAVE RADARS ASAR ADVANCED SYN
+ TETIC APERTURA RADAR (IMAGE MODE)
+ 0145 02 ESA IMAGING MICROWAVE RADARS ASAR ADVANCED SYN
+ TETIC APERTURA RADAR (WAVE MODE)
+ 0146 01 ESA CLOUD PROFILE AND RAIN RADARS CPR CLOUD RADAR
+ 0147 01 ESA RADAR RA-2/MWR RADAR ALTIMETER - 2
+ 0148 01 ESA RADAR RA/MWR RADAR ALTIMETER
+ 0150 01 ESA SCATTEROMETERS SCATTEROMETER SCATTEROMETER
+ 0161 02 ESA RADIOMETER MIPAS MICHELSON INTERFEROMETRIC PA
+ SSIVE ATMOSPHERE SOUNDER
+ 0162 02 ESA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E MWR-2 MICROWAVE RADIOMETER-2
+ 0163 03 ESA ATMOSPHERIC CHEMISTRY INSTRUMENTS SOPRANO SUB-
+ MILIMETRE OBSERVATION OF PROCESSES IN THE ABSORPTION NOTEWOR
+ THY FOR OZONE
+ 0170 02 ESA ATMOSPHERIC CHEMISTRY INSTRUMENTS GOME I GLOB
+ AL OZONE MONITORING EXPERIMENT
+ 0172 02 ESA SPECTROMETER GOMOS GLOBAL OZONE MONITORING BY O
+ CCULTATION OF STARS
+ 0174 02 ESA SPECTROMETER MERIS MEDIUM RESOLUTION IMAGING SP
+ ECTROMETER
+ 0175 02 ESA SPECTROMETER SCIAMACHY SCANNING IMAGING ABS
+ ORPTION SPECTROMETER FOR ATMOSPHERIC CARTOGRAPHY
+ 0181 02 EUMETSAT COMMUNICATIONS METEOSAT COMMS COMMUNICATIO
+ NS PACKAGE FOR METEOSAT
+ 0182 02 EUMETSAT COMMUNICATIONS MSG COMMS COMMUNICATIO
+ NS PACKAGE FOR MSG
+ 0190 02 ESA/ EUMETSAT SCATTEROMETERS ASCAT ADVANCED SCATTE
+ ROMETER
+ 0200 02 EUMETSAT RADIOMETER GERB GEOSTATIONARY EARTH
+ RADIATION BUDGET
+ 0202 02 ESA/ EUMETSAT RADIOMETER GRAS GNSS RECEIVER F
+ OR ATMOSPHERIC SOUNDING
+ 0203 02 EUMETSAT RADIOMETER MHS MICROWAVE HUMIDITY S
+ OUNDER
+ 0205 02 EUMETSAT RADIOMETER MVIRI METEOSAT VISIBLE AND
+ INFRA-RED IMAGER
+ 0207 02 EUMETSAT RADIOMETER SEVIRI SPINNING ENHANCED VI
+ SIBLE AND INFRARED IMAGER
+ 0208 02 EUMETSAT IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR)
+ VIRI VIRI
+ 0220 02 ESA/ EUMETSAT SPECTROMETER GOME-2 GLOBAL OZONE MO
+ NITORING EXPERIMENT - 2
+ 0221 03 CNES/ EUMETSAT ATMOSPHERIC TEMPERATURE AND HUMIDITY S
+ OUNDERS IASI INFRA-RED ATMOSPHERIC SOUNDING INTERFEROME
+ TER
+ 0240 02 CAST COMMUNICATIONS DCP DATA COLLECTION PLATFORM TRA
+ NSPONDER
+ 0245 01 CAST RADIOMETER CCD HIGH RESOLUTION CCD CAMERA
+ 0246 02 INPE ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS HSB
+ HUMIDITY SOUNDER/BRAZIL
+ 0248 02 INPE IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) OBA
+ OBSERVADOR BRASILEIRO DA AMAZONIA
+ 0250 01 CAST RADIOMETER WFI WIDE FIELD IMAGER
+ 0255 02 CAST SPECTROMETER IRMSS INFRA RED MULTI SPECTRAL SCA
+ NNER
+ 0260 01 ISRO PRECISION ORBIT BSS & FSS TRANSPONDERS
+ 0261 01 ISRO PRECISION ORBIT DRT-S&R
+ 0262 02 ISRO COMMUNICATIONS INSAT COMMS COMMUNICATIONS PACKA
+ GE FOR INSAT
+ 0268 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS HR-PAN HIGH RESOLUT
+ ION PANCHROMATIC CAMERA
+ 0269 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) MSMR MULTIFREQUENCY SCANNING MICROWAVE RADIOMETER
+ 0270 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VHRR
+ VERY HIGH RESOLUTION RADIOMETER
+ 0271 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) WIFS
+ WIDE FIELD SENSOR
+ 0275 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS AWIFS ADVANCED WID
+ E FIELD SENSOR
+ 0276 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-I LINEAR IMAGI
+ NG SELF SCANNER - I
+ 0277 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-II LINEAR IMAGI
+ NG SELF SCANNER - II
+ 0278 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-III LINE
+ AR IMAGING SELF SCANNER - III
+ 0279 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-IV LINEAR IMAGI
+ NG SELF SCANNER - IV
+ 0284 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS PAN PANCHROMATIC
+ SENSOR
+ 0285 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MOS
+ MODULAR OPTO-ELECTRONIC SCANNER
+ 0286 02 ISRO OCEAN COLOUR INSTRUMENTS OCM OCEAN COLOUR
+ MONITOR
+ 0290 02 JMA COMMUNICATIONS MTSAT COMMS COMMUNICATIONS PACKA
+ GE FOR MTSAT
+ 0294 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS IMAGER/MTSAT
+ -1R IMAGER/MTSAT
+ 0295 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS IMAGER/MTSAT
+ IMAGER/MTSAT
+ 0296 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS VISSR (GMS4)
+ VISIBLE AND INFRA-RED SPIN SCAN RADIOMETER (GMS4)
+ 0300 01 NASA LIDARS GLAS GEOSCIENCE LASER ALTIMETER SYSTEM
+ 0301 01 NASA PRECISION ORBIT LRA LASER RETROREFLECTOR ARRAY
+ 0302 01 NASA LIDARS MBLA MULTI BEAM LASER ALTIMETER
+ 0309 02 NASA CLOUD PROFILE AND RAIN RADARS CPR (CLOUDSAT) CLOU
+ D PROFILING RADAR
+ 0312 01 NASA RADAR NSCAT NASA SCATTEROMETER
+ 0313 01 NASA RADAR SEAWINDS ADEOS II - NASA SCATTEROMETER
+ 0330 02 NASA EARTH RADIATION BUDGET RADIOMETER ACRIM ACTI
+ VE CAVITY RADIOMETER IRRADIANCE MONITOR
+ 0334 02 NASA TOTAL AND PROFILE OZONE BUV BACKSCATTER ULTRAVIO
+ LET INSTRUMENT
+ 0336 02 NASA HIGH RESOLUTION OPTICAL IMAGERS ALI ADVANCED LAN
+ D IMAGER
+ 0347 02 NASA HIGH RESOLUTION OPTICAL IMAGERS ASTER ADVANCED SPA
+ CEBORNE THERMAL EMISSION AND REFLECTION RADIOMETER
+ 0348 02 NASA EARTH RADIATION BUDGET RADIOMETER CERES-2 CLOU
+ D AND THE EARTH'S RADIANT ENERGY SYSTEM
+ 0351 02 CONAE ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GPSD
+ R GPS DEMONSTRATION RECEIVER
+ 0353 02 NASA TOTAL AND PROFILE OZONE HIRDLS HIGH RESOLUTION DYNA
+ MICS LIMB SOUNDER
+ 0354 02 NASA TOTAL AND PROFILE OZONE HRDI HIGH RESOLUTION DOPP
+ LER IMAGER
+ 0356 01 NASA RADIOMETER LIS LIGHTNING IMAGING SENSOR
+ 0358 02 NASA MAGNETIC FIELD, AUROAL IMAGERYSCINTILLATION BOUNDARY
+ PEM PARTICLE ENVIRONMENT MONITOR
+ 0359 02 NASA OCEAN COLOUR INSTRUMENTS SEAWIFS SEA-VIEWING
+ WIDE FIELD-OF-VIEW SENSOR
+ 0360 02 NASA EARTH RADIATION BUDGET RADIOMETER SUSIM (UARS)
+ SOLAR ULTRAVIOLET IRRADIANCE MONITOR
+ 0363 02 NASA TOTAL AND PROFILE OZONE SBUV/1 SOLAR BACKSCATTER UL
+ TRAVIOLET 1 INSTRUMENT
+ 0365 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) TMI TRMM MICROWAVE IMAGER
+ 0366 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) JMR JASON-1 MICROWAVE RADIOMETER
+ 0369 02 NASA TOTAL AND PROFILE OZONE LIMS LIMB INFRARED MONITO
+ R OF THE STRATOSPHERE
+ 0370 02 NASA TOTAL AND PROFILE OZONE LRIR LIMB RADIANCE INVERS
+ ION RADIOMETER INSTRUMENT
+ 0371 02 NASA TOTAL AND PROFILE OZONE EPIC EARTH POLYCHROMATIC
+ IMAGING CAMERA
+ 0372 02 NASA EARTH RADIATION BUDGET RADIOMETER NISTAR NIST
+ ADVANCED RADIOMETER
+ 0373 02 NASA MAGNETIC FIELD, AUROAL IMAGERY SCINTILLATION BOUNDAR
+ Y PLASMA-MAG
+ 0374 01 NASA OTHER XPS XUV PHOTOMETER SYSTEM
+ 0375 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIRS
+ VISIBLE INFRA-RED SCANNER
+ 0376 03 CNES MULTIPLE DIRECTION/POLARISATION RADIOMETERS POLD
+ ER II POLARIZATION AND DIRECTIONALITY OF THE EARTH'S R
+ EFLECTANCE - II
+ 0377 02 NASA EARTH RADIATION BUDGET RADIOMETER TIM TOTA
+ L IRRADIANCE MONITOR
+ 0379 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) WFC
+ WIDE FIELD CAMERA
+ 0382 02 NASA SPECTRO-RADIOMETER CLAES CRYOGENIC LIMB ARRAY
+ ETALON SPECTROMETER
+ 0383 02 NASA SPECTRO-RADIOMETER HALOE HALOGEN OCCULTATION
+ EXPERIMENT
+ 0384 02 NASA SPECTRO-RADIOMETER ISAMS IMPROVED STRATOSPHER
+ IC AND MESOSPHERIC SOUNDER
+ 0385 02 NASA SPECTRO-RADIOMETER MISR MULTI-ANGLE IMAGING
+ SPECTRORADIOMETER
+ 0386 01 NASA SPECTRO-RADIOMETER MLS MICROWAVE LIMB SOUNDER
+ 0387 02 NASA SPECTRO-RADIOMETER MLS (EOS-AURA) MICROWAVE LIMB
+ SOUNDER (EOS-AURA)
+ 0389 02 NASA SPECTRO-RADIOMETER MODIS MODERATE-RESOLUTION
+ IMAGING SPECTRORADIOMETER
+ 0393 02 NASA GRAVITY HAIRS HIGH ACCURACY INTER-SATELLITE RANGIN
+ G SYSTEM
+ 0394 02 NASA TOTAL AND PROFILE OZONE OMI OZONE MEASURING INST
+ RUMENT
+ 0395 02 NASA RADIOMETER ATMOSPHERIC CORRECTOR ATMOSPHERIC
+ CORRECTOR
+ 0396 01 NASA RADIOMETER HYPERION HYPERSPECTRAL IMAGER
+ 0399 02 NASA SPECTRO-RADIOMETER SAGE I STRATOSPHERIC AEROSO
+ L AND GAS EXPERIMENT-I
+ 0400 02 NASA SPECTRO-RADIOMETER SAGE II STRATOSPHERIC AEROSO
+ L AND GAS EXPERIMENT-II
+ 0401 02 NASA SPECTRO-RADIOMETER SAGE III STRATOSPHERI
+ C AEROSOL AND GAS EXPERIMENT-III
+ 0402 02 NASA SPECTRO-RADIOMETER SAMS STRATOSPHERIC AND ME
+ SOSPHERIC SOUNDER
+ 0403 02 NASA SPECTRO-RADIOMETER SAM II STRATOSPHERIC AEROSO
+ L MEASUREMENT II
+ 0404 02 NASA SPECTRO-RADIOMETER IRIS INFRARED INTERFEROME
+ TER SPECTROMETER
+ 0405 02 NASA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GIFT
+ S GEOSYNCHRONOUS IMAGING FOURIER TRANSFORM SPECTROMETER
+ 0420 01 NASA SPECTROMETER AIRS ATMOSPHERIC INFRA-RED SOUNDER
+ 0426 02 NASA SPECTROMETER SOLSTICE SOLAR STELLAR IRRADI
+ ANCE COMPARISON EXPERIMENT
+ 0430 02 NASA SPECTROMETER TES TROPOSHPERIC EMISSION SPECTR
+ OMETER
+ 0431 02 NASA SPECTROMETER TOMS TOTAL OZONE MAPPING SPECTROM
+ ETER
+ 0450 02 JAXA COMMUNICATIONS ADEOS COMMS COMMUNICATIONS PACKA
+ GE FOR ADEOS
+ 0451 02 JAXA COMMUNICATIONS DCS (JAXA) DATA COLLECTION SYST
+ EM (JAXA)
+ 0453 02 JAXA COMMUNICATIONS GMS COMMS COMMUNICATIONS PACKA
+ GE ON GMS
+ 0454 02 JAXA COMMUNICATIONS JERS-1 COMMS COMMUNICATIONS PACKA
+ GE FOR JERS-1
+ 0460 01 JAXA LIDAR RIS RETROREFLECTOR IN SPACE
+ 0461 01 JAXA RADAR PR PRECIPITATION RADAR
+ 0462 02 JAXA IMAGING MICROWAVE RADARS SAR SYNTETIC APE
+ RTURE RADAR
+ 0470 02 JAXA IMAGING MICROWAVE RADARS PALSAR PHASED ARRAY
+ TYPE L-BAND SYNTHETIC APERTURE RADAR
+ 0479 02 JAXA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) AMSR-E ADVANCED MICROWAVE SCANNING RADIOMETER-EOS
+ 0480 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS PRISM (ALOS) PANC
+ HROMATIC REMOTE-SENSING INSTRUMENT FOR STEREO MAPPING
+ 0481 02 JAXA RADIOMETER AMSR ADVANCED MICROWAVE SCANNING
+ RADIOMETER
+ 0482 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS AVNIR ADVANCED VIS
+ IBLE AND NEAR INFRARED RADIOMETER
+ 0483 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS AVNIR-2 ADVANCED VIS
+ IBLE AND NEAR INFRA-RED RADIOMETER TYPE 2
+ 0484 01 JAXA IMAGER GLI GLOBAL IMAGER
+ 0485 02 JAXA RADIOMETER MESSR MULTISPECTRAL ELECTRONIC SEL
+ F SCANNING RADIOMETER
+ 0486 01 JAXA RADIOMETER MSR MICROWAVE SCANNING RADIOMETER
+ 0487 02 JAXA RADIOMETER OCTS OCEAN COLOR AND TEMPERATURE S
+ CANNER
+ 0488 01 JAXA RADIOMETER OPS OPTICAL SENSOR
+ 0489 02 JAXA SPECTRO-RADIOMETER VISSR (GMS5) VISIBLE AND
+ INFRA-RED SPIN SCAN RADIOMETER (GMS5)
+ 0490 02 JAXA RADIOMETER VTIR VISIBLE AND THERMAL INFRA-RE
+ D RADIOMETER
+ 0510 02 JAXA SPECTROMETER ILAS-I IMOROVED LIMB ATOMOSPHIRIC S
+ PECTROMETER
+ 0511 02 JAXA SPECTROMETER ILAS-II IMPROVED LIMB ATOMOSPHIRIC S
+ PECTROMETER
+ 0512 02 JAXA SPECTROMETER IMG INFEROMETRIC MONITOR OF GREE
+ NHOUSE GASES
+ 0514 02 JAXA SPACE ENVIRONMENT SEM SPACE ENVIRONMENT MO
+ NITOR (JAXA)
+ 0515 02 JAXA TOTAL AND PROFILE OZONE SOFIS SOLAR OCCULTATION FO
+ URIER TRANSFORM SPECTROMETER FOR INCLINED ORBIT SATELLITE
+ 0540 02 NOAA COMMUNICATIONS DCS (NOAA) DATA COLLECTION SYST
+ EM (NOAA)
+ 0541 02 NOAA COMMUNICATIONS GOES COMMS COMMUNICATIONS PACKA
+ GE ON GOES
+ 0542 02 NOAA COMMUNICATIONS LANDSAT COMMS COMMUNICATIONS PACKA
+ GE FOR LANDSAT
+ 0543 02 NOAA COMMUNICATIONS NOAA COMMS COMMUNICATIONS PACKA
+ GE FOR NOAA
+ 0544 01 NOAA COMMUNICATIONS S&R (GOES) SEARCH AND RESCUE
+ 0545 01 NOAA COMMUNICATIONS S&R (NOAA) SEARCH AND RESCUE
+ 0546 01 NOAA COMMUNICATIONS WEFAX WEATHER FACSIMILE
+ 0547 02 NOAA SPECTROMETER SEM(GOES) SPACE ENVIRONMENT MO
+ NITOR
+ 0550 01 NOAA MAGNETIC FIELD SSM SPECIAL SENSOR MAGNETOMETER
+ 0551 02 NOAA MAGNETIC FIELD SSJ/4 SPECIAL SENSOR PRECIPITATING
+ PLASMA MONITOR
+ 0552 02 NOAA SPACE ENVIRONMENT SSIES-2 SPECIAL SENSOR IONOS
+ PHERIC PLASMA DRIFT/SCINTILLATION METER
+ 0553 02 NOAA SPACE ENVIRONMENT SSB/X-2 SPECIAL SENSOR GAMMA
+ RAY PARTICLE DECTECTOR
+ 0570 02 NOAA RADIOMETER AMSU-A ADVANCED MICROWAVE SOUNDING
+ UNIT-A
+ 0574 02 NOAA RADIOMETER AMSU-B ADVANCED MICROWAVE SOUNDING
+ UNIT-B
+ 0580 02 NOAA RADIOMETER ATOVS (HIRS/3 + AMSU + AVHRR/3) ADVA
+ NCED TIROS OPERATIONAL VERTICAL SOUNDER
+ 0590 02 NOAA RADIOMETER AVHRR/2 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/2
+ 0591 02 NOAA RADIOMETER AVHRR/3 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/3
+ 0592 02 NOAA RADIOMETER AVHRR/4 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/4
+ 0600 02 NOAA RADIOMETER ERBE EARTH'S RADIATION BUDGET EXP
+ ERIMENT
+ 0601 01 NOAA RADIOMETER ETM+ ENHANCED THEMATIC MAPPER
+ 0605 02 NOAA RADIOMETER HIRS/2 HIGH RESOLUTION INFRA-RED SO
+ UNDER/2
+ 0606 02 NOAA RADIOMETER HIRS/3 HIGH RESOLUTION INFRA-RED SO
+ UNDER/3
+ 0607 02 NOAA RADIOMETER HIRS/4 HIGH RESOLUTION INFRA-RED SO
+ UNDER/4
+ 0615 01 NOAA RADIOMETER IMAGER IMAGER
+ 0616 02 NOAA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIIR
+ S VISIBLE/INFRARED IMAGER RADIOMETER SUITE
+ 0620 02 NOAA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS CRIR
+ S/NP CROSS TRACK INFRA-RED SOUNDER/NPOESS
+ 0621 02 NOAA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS ATMS
+ ADVANCED TECHNOLOGY MICROWAVE SOUNDER
+ 0622 01 NOAA RADIOMETER MSS MULTISPECTRAL SCANNING SYSTEM
+ 0623 01 NOAA RADIOMETER MSU MICROWAVE SOUNDING UNIT
+ 0624 02 NOAA RADIOMETER SBUV/2 SOLAR BACKSCATTTER ULTRA-VIO
+ LET INSTRUMENT/2
+ 0625 02 NOAA RADIOMETER SBUV/3 SOLAR BACKSCATTTER ULTRA-VIO
+ LET INSTRUMENT/3
+ 0626 01 NOAA RADIOMETER SOUNDER SOUNDER
+ 0627 01 NOAA RADIOMETER SSU STRATOSPHERIC SOUNDING UNIT
+ 0628 01 NOAA RADIOMETER TM THEMATIC MAPPER
+ 0629 02 NOAA RADIOMETER TOVS (HIRS/2 + MSU + SSU) TIRO
+ S OPERATIONAL VERTICAL SOUNDER
+ 0630 01 NOAA RADIOMETER VAS VISSR ATMOSPHERIC SOUNDER
+ 0631 01 NOAA RADIOMETER SSZ
+ 0645 01 NOAA SPECTROMETER SEM SPACE ENVIRONMENT MONITOR
+ 0650 02 NRSCC RADIOMETER MVIRSR (10 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0651 02 NRSCC RADIOMETER MVIRSR (3 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0652 02 NRSCC RADIOMETER MVIRSR (5 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0670 01 NSAU RADAR RLSBO SIDE LOOKING MICROWAVE RADAR
+ 0680 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS MSU-EU MULTI-SPECTR
+ AL RADIOMETER WITH HIGH RESOLUTION
+ 0681 02 NSAU IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MSU-
+ UM VISIBLE MULTI-SPECTRAL RADIOMETER
+ 0682 01 NSAU RADIOMETER RM-08 IMAGING MICROWAVE RADIOMETER
+ 0683 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS SU-UMS STEREO RADIO
+ METER WITH HIGH RESOLUTION
+ 0684 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS SU-VR VISIBLE RADI
+ OMETER WITH HIGH RESOLUTION
+ 0685 01 NSAU RADIOMETER TRASSER
+ 0700 02 ROSCOSMOS COMMUNICATIONS KONDOR-2 DATA COLLECT
+ ION AND TRANSMISSION SYSTEM
+ 0701 01 ROSCOSMOS COMMUNICATIONS BRK
+ 0710 01 ROSCOSMOS LIDAR ALISSA BACKSCATTER LIDAR
+ 0712 01 ROSCOSMOS LIDAR BALKAN-2 LIDAR
+ 0715 01 ROSCOSMOS LIDAR MK-4
+ 0716 01 ROSCOSMOS LIDAR MK-4M
+ 0730 01 ROSCOSMOS RADAR GREBEN RADAR ALTIMETER
+ 0731 01 ROSCOSMOS RADAR SAR-10 SYNTETIC APERTURE RADAR
+ 0732 01 ROSCOSMOS RADAR SAR-3 SYNTETIC APERTURE RADAR
+ 0733 01 ROSCOSMOS RADAR SAR-70 SYNTETIC APERTURE RADAR
+ 0740 01 ROSCOSMOS RADAR SLR-3 SIDE LOOKING RADAR
+ 0745 01 ROSCOSMOS RADAR TRAVERS SAR
+ 0750 02 ROSCOSMOS RADIOMETER 174-K TEMPERATURE AND HUMI
+ DITY PROFILER
+ 0751 02 ROSCOSMOS RADIOMETER BTVK SCANNING TELEVISION
+ RADIOMETER
+ 0752 02 ROSCOSMOS RADIOMETER CHAIKA SCANNING IR RADIOMET
+ ER
+ 0753 02 ROSCOSMOS RADIOMETER DELTA-2 MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0755 02 ROSCOSMOS RADIOMETER IKAR-D MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0756 02 ROSCOSMOS RADIOMETER IKAR-N MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0757 02 ROSCOSMOS RADIOMETER IKAR-P MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0760 01 ROSCOSMOS RADIOMETER ISP
+ 0761 02 ROSCOSMOS RADIOMETER KFA-1000 PHOTOGRAPHIC
+ CAMERA
+ 0762 01 ROSCOSMOS RADIOMETER KFA-200 PHOTOGRAPHIC CAMERA
+ 0763 02 ROSCOSMOS RADIOMETER KFA-3000 PHOTOGRAPHIC
+ CAMERA
+ 0770 01 ROSCOSMOS RADIOMETER KLIMAT SCANNING IR RADIOMETER
+ 0771 02 ROSCOSMOS RADIOMETER KLIMAT-2 SCANNING IR
+ RADIOMETER
+ 0775 01 ROSCOSMOS RADIOMETER MIRAS
+ 0776 01 ROSCOSMOS RADIOMETER MIVZA
+ 0777 02 ROSCOSMOS RADIOMETER MIVZA-M MICROWAVE SCANNING R
+ ADIOMETER
+ 0780 01 ROSCOSMOS RADIOMETER MR-2000
+ 0781 01 ROSCOSMOS RADIOMETER MR-2000M
+ 0785 02 ROSCOSMOS RADIOMETER MR-900 SCANNING TELEPHOTOME
+ TER
+ 0786 02 ROSCOSMOS RADIOMETER MR-900B SCANNING VISUAL BAND
+ TELEPHOTOMETER
+ 0790 02 ROSCOSMOS RADIOMETER MSU-E MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0791 02 ROSCOSMOS RADIOMETER MSU-E1 MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0792 02 ROSCOSMOS RADIOMETER MSU-E2 MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0793 01 ROSCOSMOS RADIOMETER MSU-M
+ 0794 02 ROSCOSMOS RADIOMETER MSU-S MULTISPECTRAL MEDIUM
+ RESOLUTION SCANNER
+ 0795 02 ROSCOSMOS RADIOMETER MSU-SK MULTISPECTRAL MEDIUM
+ RESOLUTION CONICAL SCANNER
+ 0796 02 ROSCOSMOS RADIOMETER MSU-V MULTISPECTRAL HIGH R
+ ESOLUTION CONICAL SCANNER
+ 0810 02 ROSCOSMOS RADIOMETER MTZA SCANNING MICROWAVE R
+ ADIOMETER
+ 0815 03 ROSCOSMOS IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE
+ MICROWAVE) MZOAS SCANNING MICROWAVE RADIO
+ METER
+ 0820 03 ROSCOSMOS IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE
+ MICROWAVE) R-225 SINGLE CHANNEL MICROWAVE
+ RADIOMETER
+ 0821 01 ROSCOSMOS RADIOMETER R-400
+ 0822 02 ROSCOSMOS RADIOMETER R-600 SINGLE CHANNEL MICRO
+ WAVE RADIOMETER
+ 0830 02 ROSCOSMOS RADIOMETER RMS RADIATION MEASUREMEN
+ T SYSTEM
+ 0835 01 ROSCOSMOS RADIOMETER TV CAMERA
+ 0836 01 ROSCOSMOS RADIOMETER SILVA
+ 0840 02 ROSCOSMOS SPECTRO-RADIOMETER SROSMO SPECTRORADIO
+ METER FOR OCEAN MONITORING
+ 0850 02 ROSCOSMOS SPECTROMETER BUFS-2 BACKSCATTER SPECTROM
+ ETER/2
+ 0851 02 ROSCOSMOS SPECTROMETER BUFS-4 BACKSCATTER SPECTROM
+ ETER/4
+ 0855 02 ROSCOSMOS SPECTROMETER ISTOK-1 INFRA-RED SPECTROMET
+ ER
+ 0856 02 ROSCOSMOS SPECTROMETER SFM-2 SPECTROMETER TO MEAS
+ URE DIRECT SOLAR RADIATION
+ 0857 01 ROSCOSMOS SPECTROMETER DOPI
+ 0858 01 ROSCOSMOS SPECTROMETER KGI-4
+ 0859 01 ROSCOSMOS SPECTROMETER OZON-M
+ 0860 01 ROSCOSMOS SPECTROMETER RMK-2
+ 0900 02 NOAA RADIOMETER MAXIE MAGNETOSPHERIC ATMOSPHERIC X
+ -RAY IMAGING EXPERIMENT
+ 0901 01 NOAA RADIOMETER OLS OPERATIONAL LINESCAN SYSTEM
+ 0905 02 NOAA RADIOMETER SSM/I MISSION SENSOR MICROWAVE IMA
+ GER
+ 0906 02 NOAA RADIOMETER SSM/T-1 MISSION SENSOR MICROWAVE TEM
+ PERATURE SOUNDER
+ 0907 02 NOAA RADIOMETER SSM/T-2 MISSION SENSOR MICROWAVE WAT
+ ER VAPOR SOUNDER
+ 0908 02 NOAA RADIOMETER SSMIS SPECIAL SENSOR MICROWAVE IMA
+ GER SOUNDER
+ 0910 01 NOAA RADIOMETER SXI SOLAR X-RAY IMAGER
+ 0930 02 NOAA SPECTROMETER EHIC ENERGETIC HEAVY ION COMPOSIT
+ ION EXPERIMENT
+ 0931 01 NOAA SPECTROMETER X-RAY ASTRONOMY PAYLOAD
+ 0932 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) IVIS
+ SR (FY-2) IMPROVED MULTISPECTRAL VISIBLE AND INFRA-RED SCA
+ N RADIOMETER (5 CHANNELS)
+ 0933 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS IRAS
+ INFRARED ATMOSPHERIC SOUNDER
+ 0934 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS MWAS
+ MICROWAVE ATMOSPHERIC SOUNDER
+ 0935 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS IMWA
+ S IMPROVED MICROWAVE ATMOSPHERIC SOUNDER
+ 0936 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS MWHS
+ MICROWAVE HUMIDITY SOUNDER
+ 0937 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MVIR
+ S MODERATE RESOLUTION VISIBLE AND INFRARED IMAGING SPECTRO
+ RADIOMETER
+ 0938 02 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) MWRI MICROWAVE RADIATION IMAGER
+ 0940 02 ROSCOSMOS ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDER
+ S MTVZA-OK SCANNING MICROWAVE RADIOMETER
+ 0941 02 CNES ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS SAPH
+ IR
+ 0944 01 NOAA RADAR ALTIMETERS ALT ALTIMETER
+ 0945 02 NOAA EARTH RADIATION BUDGET RADIOMETER TSIS TOTA
+ L SOLAR IRRADIANCE SENSOR
+ 0946 02 NOAA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) CMIS CONICAL-SCANNING MICROWAVE IMAGER/SOUNDER
+ 0947 02 NOAA TOTAL AND PROFILE OZONE OMPS OZONE MAPPING AND PR
+ OFILER SUITE
+ 0948 03 NOAA SPACE ENVIRONMENT ATMOSPHERIC TEMPERATURE AND HUMIDI
+ TY SOUNDERS GPSOS GLOBAL POSITIONING SYSTEM OCCULTATION SE
+ NSOR
+ 0949 02 NOAA MAGNETIC FIELD, AUROAL IMAGERY SCINTILLATION BOUNDAR
+ Y SESS SPACE ENVIRONMENTAL SENSOR SUITE
+ 0950 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIRR
+ MULTISPECTRAL VISIBLE AND INFRA-RED SCAN RADIOMETER (10
+ CHANNELS
+ 0951 01 NRSCC TOTAL AND PROFILE OZONE TOM TOTAL OZONE MAPPER
+ 0952 01 NRSCC TOTAL AND PROFILE OZONE OP OZONE PROFILER
+ 2047 01 MISSING VALUE
+002020 0024 0000 01 NIMBUS
+ 0001 01 VTPR
+ 0002 01 TIROS 1 (TIROS, NOAA-6 TO NOAA-13)
+ 0003 01 TIROS 2 (NOAA-14 ONWARDS)
+ 0010 01 EOS
+ 0031 01 DMSP
+ 0061 01 EUMETSAT POLAR SYSTEM (EPS)
+ 0091 01 ERS
+ 0121 01 ADEOS
+ 0241 01 GOES
+ 0261 01 JASON
+ 0271 01 GMS
+ 0272 01 MTSAT
+ 0301 01 INSAT
+ 0331 01 METEOSAT OPERATIONAL PROGRAMME (MOP)
+ 0332 01 METEOSAT TRANSITIONAL PROGRAMME (MTP)
+ 0333 01 METEOSAT SECOND GENERATION PROGRAMME (MSG)
+ 0351 01 GOMS
+ 0380 01 FY-1
+ 0381 01 FY-2
+ 0401 01 GPS
+ 0402 01 GLONASS
+ 0403 01 GALILEO
+ 0511 01 MISSING VALUE
+002021 0008 0001 01 HIGH RESOLUTION INFRA RED SOUNDER (HIRS)
+ 0002 01 MICROWAVE SOUNDING UNIT (MSU )
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+002022 0005 0001 01 PROCESSING TECHNIQUE NOT DEFINED
+ 0002 01 AUTOMATED STATISTICAL REGRESSION
+ 0003 01 CLEAR PATH
+ 0004 01 PARTLY CLOUDY PATH
+ 0005 01 CLOUDY PATH
+002023 0012 0000 01 RESERVED
+ 0001 02 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE INFRARED
+ CHANNEL
+ 0002 01 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE VISIBLE CHANNEL
+ 0003 01 WIND DERIVED FROM CLOUD MOTION OBSERVED IN WATER VAPOUR CHANNEL
+ 0004 02 WIND DERIVED FROM MOTION OBSERVED IN COMBINATION OF SPECTRAL
+ CHANNELS
+ 0005 02 WIND DERIVED FROM MOTION OBSERVED IN THE WATER VAPOUR CHANNEL
+ IN CLEAR AIR
+ 0006 01 WIND DERIVED FROM MOTION OBSERVED IN THE OZONE CHANNEL
+ 0007 02 WIND DERIVED FROM MOTION OBSERVED IN WATER VAPOUR CHANNEL
+ (CLOUD OR CLEAR AIR NOT SPECIFIED)
+ 0008 01 WIND DERIVED FROM ALTIMETER
+ 0009 01 WIND DERIVED FROM RADIOMETER
+ 0013 01 ROOT MEAN SQUARE
+ 0015 01 MISSING VALUE
+002024 0003 0001 01 TABLE WITH FULL RANGE OF HUMIDITY VARIATION IN LAYER
+ 0002 01 REGRESSION TECHNIQUE ON 2 HUMIDITY VALUES IN LAYER
+ 0015 01 MISSING VALUE
+002025 0016 0001 01 RESERVED
+ 0002 01 HIRS
+ 0003 01 MSU
+ 0006 01 HIRS
+ 0007 01 MSU
+ 0010 01 HIRS(1, 2, 3, 8,9, 16, 17)
+ 0011 01 HIRS(1, 2, 3, 9, 17)
+ 0012 01 MSU
+ 0015 01 HIRS
+ 0016 01 HIRS
+ 0017 01 MSU
+ 0018 01 SKINTK(OCEAN ONLY)
+ 0021 01 HIRS
+ 0022 01 SSU
+ 0023 01 MSU (3 ,4)
+ 0025 01 MISSING
+002030 0007 0001 01 ADCP (ACOUSTIC DOPPLER CURRENT PROFILER)
+ 0002 01 GEK (GEOMAGNETIC ELECTRO KINETOGRAPH)
+ 0003 01 SHIPS'S SET AND DRIFT DETERMINED BY FIXES 3-6 HOURS APART
+ 0004 02 SHIPS'S SET AND DRIFT DETERMINED BY MORE THAN 6 HOURS
+ BUT LESS THAN 12 HOURS APART
+ 0005 01 DRIFT OF BUOY
+ 0006 01 ADCP (ACOUSTIC DOPPLER CURRENT PROFILER)
+ 0007 01 MISSIN VALUE
+002031 0021 0000 01 RESERVED
+ 0001 01 INSTANTANEOUS
+ 0002 01 AVERAGED OVER 3 MINUTES OR LESS
+ 0003 01 AVERAGED OVER MORE THAN 3 MINUTES, BUT 6 AT THE MOST
+ 0004 01 AVERAGED OVER MORE THAN 6 MINUTES, BUT 12 AT THE MOST
+ 0005 01 INSTANTANEOUS
+ 0006 01 AVERAGED OVER 3 MINUTES OR LESS
+ 0007 01 AVERAGED OVER MORE THAN 3 MINUTES, BUT 6 AT THE MOST
+ 0008 01 AVERAGED OVER MORE THAN 6 MINUTES, BUT 12 AT THE MOST
+ 0009 01 VECTOR OR DOPPLER CURRENT PROFILLING METHOD NOT USED
+ 0010 01 RESERVED
+ 0011 01 1 HOUR OR LESS
+ 0012 01 MORE THAN 1 HOUR BUT 2 AT THE MOST
+ 0013 01 MORE THAN 2 HOUR BUT 4 AT THE MOST
+ 0014 01 MORE THAN 4 HOUR BUT 8 AT THE MOST
+ 0015 01 MORE THAN 8 HOUR BUT 12 AT THE MOST
+ 0016 01 MORE THAN 12 HOUR BUT 18 AT THE MOST
+ 0017 01 MORE THAN 18 HOUR BUT 24 AT THE MOST
+ 0018 01 RESERVED
+ 0019 01 DRIFT METHOD NOT USED
+ 0031 01 MISSING
+002032 0004 0000 02 VALUES AT SELECTED DEPTHS (DATA POINTS FIXED BY THE INSTRUME
+ NT OR SELECTED BY ANY OTHER METHOD)
+ 0001 02 VALUES AT SIGNIFICANT DEPTHS (DATA POINTS TAKEN FROM TRACES
+ AT SIGNIFICANT DEPTHS)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002033 0005 0000 01 NO SALINITY MEASURED
+ 0001 01 IN SITU SENSOR, ACCURACY BETTER THAN 0.02 %
+ 0002 01 IN SITU SENSOR, ACCURACY LESS THAN 0.02 %
+ 0003 01 SAMPLE ANALYSIS
+ 0007 01 MISSING VALUE
+002034 0007 0000 01 UNSPECIFIED DROGUE
+ 0001 01 HOLEY SOCK
+ 0002 01 TRISTAR
+ 0003 01 WINDOW SHADE
+ 0004 01 PARACHUTE
+ 0005 01 NON-LAGRANGIAN SEA ANCHOR
+ 0031 01 MISSING VALUE
+002036 0004 0000 01 DRIFTING BUOY
+ 0001 01 FIXED BUOY
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002037 0007 0000 01 REASERVED
+ 0001 01 MANUAL READING FROM VERTICAL TIDE STAFF
+ 0002 01 MANUAL READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ 0003 01 MANUAL READING FROM MULTIPLE AUTOMATIC RECORDERS AT STATION
+ 0004 02 AUTOMATIC READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ WITHOUT LEVEL REFERENCE CHECK
+ 0005 02 AUTOMATIC READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ WITH LEVEL REFERENCE CHECK,OR MULTIPLE AUTOMATIC RECORDERS
+ 0007 01 MISSING
+002038 0012 0000 01 SHIP INTAKE
+ 0001 01 BUCKET
+ 0002 01 HULL CONTACT SENSOR
+ 0003 01 REVERSING TERMOMETER
+ 0004 01 STD/CTD SENSOR
+ 0005 01 MECHANICAL BT
+ 0006 01 EXPANDABLE BT
+ 0007 01 DIGITAL BT
+ 0008 01 THERMISTOR CHAIN
+ 0009 01 INFRARED SCANNER
+ 0010 01 MICROWAVE SCANNER
+ 0015 01 MISSING VALUE
+002039 0005 0000 01 MEASURED WET-BULB TEMPERATURE
+ 0001 01 ICED BULB MEASURED WET-BULB TEMPERATURE
+ 0002 01 COMPUTED WET-BULB TEMPERATURE
+ 0003 01 ICED BULB COMPUTED WET-BULB TEMPERATURE
+ 0007 01 MISSING VALUE
+002040 0008 0000 01 SHIPS MOTION REMOVED BY AVARAGING
+ 0001 01 SHIPS MOTION REMOVED BY MOTION COMPENSATION
+ 0002 01 SHIPS MOTION NOT REMOVED
+ 0003 01 SHIPS MOTION REMOVED BY AVERAGING
+ 0004 01 SHIPS MOTION REMOVED BY MOTION COMPENSATION
+ 0005 01 SHIPS MOTION NOT REMOVED
+ 0006 01 DOPPLER CURRENT PROFILING METHOD NOT USED
+ 0015 01 MISSING VALUE
+002041 0006 0000 01 INFORMATION BASED ON MANUAL ANALYSIS
+ 0001 01 INFORMATION BASED ON COMPUTER ANALYSIS
+ 0002 01 INFORMATION BASED ON DATA ASSIMILATION
+ 0003 02 INFORMATION BASED ON COMPUTER ANALYSIS OR
+ DATA ASSIMILATION MANUALLY MODIFIED
+ 0010 01 INFORMATION BASED ON THE NUMERICAL WEATHER PREDICTION
+ 0063 01 MISSING VALUE
+002044 0006 0000 01 RESERVED
+ 0001 01 LONGUET-HIGGINS (1964)
+ 0002 01 LONGUET-HIGGINS (F3 METHOS)
+ 0003 01 MAXIMUM LIKELIHOOD METHOD
+ 0004 01 MAXIMUM ENTROPY METHOD
+ 0015 01 MISSING VALUE
+002045 0005 0000 01 SEA STATION
+ 0001 01 AUTOMATIC DATA BUOY
+ 0002 01 AIRCRAFT
+ 0003 01 SATELLITE
+ 0015 01 MISSING VALUE
+
+002046 0004 0000 01 RESERVED
+ 0001 01 HEAVE SENSOR
+ 0002 01 SLOPE SENSOR
+ 0015 01 MISSING VALUE
+002048 0012 0000 01 HIRS
+ 0001 01 MSU
+ 0002 01 SSU
+ 0003 01 AMSU-A
+ 0004 01 AMSU-B
+ 0005 01 AVHRR
+ 0006 01 SSMI
+ 0007 01 NSCAT
+ 0008 01 SEA WINDS
+ 0009 01 POSEIDON ALTIMETER
+ 0010 01 JMR (JASON MICROWAVE RADIOMETER)
+ 0015 01 MISSING VALUE
+002049 0004 0001 01 PROCESSING TECHNIQUE NOT DEFINED
+ 0002 01 SIMULTANIOUS PHISICAL RETRIEVAL
+ 0003 01 CLEAR SOUNDING
+ 0004 01 CLOUDY COUNDING
+002050 0019 0001 01 CHANNEL 1 14.71 MICROMETERS
+ 0002 01 CHANNEL 2 14.37 MICROMETERS
+ 0003 01 CHANNEL 3 14.06 MICROMETERS
+ 0004 01 CHANNEL 4 13.64 MICROMETERS
+ 0005 01 CHANNEL 5 13.37 MICROMETERS
+ 0006 01 CHANNEL 6 12.66 MICROMETERS
+ 0007 01 CHANNEL 7 12.02 MICROMETERS
+ 0008 01 CHANNEL 8 11.03 MICROMETERS
+ 0009 01 CHANNEL 9 9.71 MICROMETERS
+ 0010 01 CHANNEL 10 7.43 MICROMETERS
+ 0011 01 CHANNEL 11 7.02 MICROMETERS
+ 0012 01 CHANNEL 12 6.51 MICROMETERS
+ 0013 01 CHANNEL 13 4.57 MICROMETERS
+ 0014 01 CHANNEL 14 4.52 MICROMETERS
+ 0015 01 CHANNEL 15 4.45 MICROMETERS
+ 0016 01 CHANNEL 16 4.13 MICROMETERS
+ 0017 01 CHANNEL 17 3.98 MICROMETERS
+ 0018 01 CHANNEL 18 3.74 MICROMETERS
+ 0019 01 CHANNEL 19 0.969 MICROMETERS
+002051 0004 0001 01 MAXIMUM/MINIMUM THERMOMETERS
+ 0002 01 AUTOMATED INSTRUMENT
+ 0003 01 THERMOGRAPH
+ 0015 01 MISSING VALUE
+002052 0005 0001 01 CHANNEL 1 0.55-.75 MICROMETERS
+ 0002 01 CHANNEL 2 3.9 MICROMETERS
+ 0003 01 CHANNEL 3 6.7 MICROMETERS
+ 0004 01 CHANNEL 4 10.7 MICROMETERS
+ 0005 01 CHANNEL 5 12.0 MICROMETERS
+002053 0005 0000 01 OBSERVED BRIGHTNESS TEMPERATURES
+ 0001 01 BRIGHTNESS TEMPERATURE WITH BIAS CORRECTION APPLIED
+ 0002 01 BRIGHTNESS TEMPERATURE CALCULATED FROM FIRST GUESS
+ 0003 01 BRIGHTNESS TEMPERATURE CALCULATED FROM SOUNDING
+ 0015 01 MISSING VALUE
+002054 0006 0000 01 PARAMETER DERIVED USING OBSERVED SOUNDER BRIGHTNESS TEMPERATURES
+ 0001 01 PARAMETER DERIVED USING OBSERVED IMAGER BRIGHTNESS TEMPERATURES
+ 0002 01 PARAMETER DERIVED USING FIRST GUESS INFORMATION
+ 0003 01 PARAMETER DERIVED USING NMC ANALYSIS INFORMATION
+ 0004 01 PARAMETER DERIVED USING RADIOSONDE INFORMATION
+ 0015 01 MISSING VALUE
+002055 0010 0000 01 STATISTICS GENERATED COMPARING RETRIEVAL VERSUS RADIOSONDE
+ 0001 01 STATISTICS GENERATED COMPARING RETRIEVAL VERSUS FIRST GUESS
+ 0002 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS FIRST GUESS
+ 0003 01 STATISTICS GENERATED COMPARING OBSERVED VERSUS RETRIEVAL
+ 0004 01 STATISTICS GENERATED COMPARING OBSERVED VERSUS FORST GUESS
+ 0005 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS IMAGER
+ 0006 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS SOUNDER
+ 0007 01 STATISTICS GENERATED FOR RADIOSONDE
+ 0008 01 STATISTICS GENERATED FOR FIRST GUESS
+002056 0006 0000 01 SUMS OF DIFFERENCE
+ 0001 01 SUMS OF SQUARED DIFFERENCES
+ 0002 01 SAMPLE SIZE
+ 0003 01 MINIMUM DIFFERENCE
+ 0004 01 MAXIMUM DIFFERENCE
+ 0015 01 MISSING VALUE
+002057 0007 0000 01 NESTED GRID MODEL (NMG)
+ 0001 01 AVIATION MODEL(AVN)
+ 0002 01 MEDIUM RANGE FORECAST (MRF) MODEL
+ 0003 01 GLOBAL DATA ASSIMILATION SYSTEM (GDAS) FORECAST MODEL
+ 0004 01 PRIOR SOUNDINGS (WITHIN 3 HOURS OF CURRENT TIME)
+ 0005 01 CLIMATOLOGY
+002058 0005 0000 01 12 HOUR AND 18 HOUR
+ 0001 01 18 HOUR AND 24 HOUR
+ 0002 01 6 HOUR AND 12 HOUR
+ 0003 01 GREATER THAN 24 HOUR
+ 0015 01 MISSING VALUE
+002059 0005 0000 01 NCEP NESTED GRID MODEL ANALYSIS
+ 0001 01 NCEP AVIATION MODEL ANALYSIS
+ 0002 01 NCEP MEDIUM RANGE FORECAST MODEL ANALYSIS
+ 0003 01 NCEP GLOBAL DATA ASSIMILATION SYSTEM FORECAST MODEL ANALYSIS
+ 0015 01 MISSING VALUE
+002060 0007 0000 01 CURRENT SURFACE HOURLY REPORTS
+ 0001 01 CURRENT SHIP REPORTS
+ 0002 01 CURRENT BUOY REPORTS
+ 0003 01 ONE HOUR OLD SURFACE HOURLY REPORTS
+ 0004 01 ONE HOUR SHIP OLD REPORTS
+ 0005 01 ONE HOUR BUOY OLD REPORTS
+ 0015 01 MISSING VALUE
+002061 0003 0000 01 INERTIAL NAVIGATOR SYSTEM
+ 0001 01 OMEGA
+ 0007 01 MISSING VALUE
+002062 0007 0000 01 ASDAR
+ 0001 01 ASDAR(ACARS ALSO AVAILABLE BUT NOT OPERATIVE)
+ 0002 01 ASDAR(ACARS ALSO AVAILABLE AND OPERATIVE)
+ 0003 01 ACARS
+ 0004 01 ACARS(ASDAR ALSO AVALILABLE BUT NOT OPERATIVE)
+ 0005 01 ACARS(ASDAR ALSO AVAILABLE AND OPERATIVE)
+ 0015 01 MISSING VALUE
+002064 0004 0000 01 GOOD
+ 0001 01 BAD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002066 0004 0000 01 TRS 2000
+ 0001 01 IMS 1500C
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+002070 0013 0000 01 ACTUAL LOCATION IN SECONDS
+ 0001 01 ACTUAL LOCATION IN MINUTES
+ 0002 01 ACTUAL LOCATION IN DEGREES
+ 0003 01 ACTUAL LOCATION IN DECIDEGREES
+ 0004 01 ACTUAL LOCATION OM CENTIDEGREES
+ 0005 01 REFERENCED TO CHECKPOINT IN SECONDS
+ 0006 01 REFERENCED TO CHECKPOINT IN MINUTES
+ 0007 01 REFERENCED TO CHECKPOINT IN DEGREES
+ 0008 01 REFERENCED TO CHECKPOINT IN DECIDEGREES
+ 0009 01 REFERENCED TO CHECKPOINT IN CENTIDEGREES
+ 0010 01 ACTUAL LOCATION IN TENTHS OF A MINUTE
+ 0011 01 REFERENCED TO CHECKPOINT IN TENTHS OF A MINUTE
+ 0015 01 MISSING VALUE
+002080 0005 0000 01 KAYSAM
+ 0001 01 TOTEX
+ 0002 01 KKS
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+002081 0009 0000 01 GP26
+ 0001 01 GP28
+ 0002 01 GP30
+ 0003 01 HM26
+ 0004 01 HM28
+ 0005 01 HM30
+ 0006 01 SV16
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002083 0006 0000 01 HIGH BAY
+ 0001 01 LOW BAY
+ 0002 01 BALLOON INFLATION LAUNCH SYSTEM (BILS)
+ 0003 01 ROOF-TOP BILS
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002084 0005 0000 01 HYDROGEN
+ 0001 01 HELIUM
+ 0002 01 NATURAL GAS
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002095 0005 0000 01 CAPACITANCE ANEROID
+ 0001 01 DERIVED FROM GPS
+ 0002 01 RESISTIVE STRAIN GAUGE
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002096 0005 0000 01 ROD THERMISTOR
+ 0001 01 BEAD THERMISTOR
+ 0002 01 CAPACITANCE BEAD
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002097 0008 0000 01 VIZ MARK II CARBON HYGRISTOR
+ 0001 01 VIZ B2 HYGRISTOR
+ 0002 01 VAISALA A-HUMICAP
+ 0003 01 VAISALA H-HUMICAP
+ 0004 01 CAPACITANCE SENSOR
+ 0005 01 VAISALA RS90
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002098 0005 0000 01 HH POLARISATION
+ 0001 01 VV POLARISATION
+ 0002 01 HV POLARISATION REAL VALUED COMPONENT
+ 0003 01 HV POLARISATION IMAGINARY VALUED COMPONENT
+ 0007 01 MISSING VALUE
+002101 0010 0000 01 CENTRE FRONT-FED PARABOLOID
+ 0001 01 OFFSET FRONT-FED PARABOLOID
+ 0002 01 CENTRE CASSEGRAIN PARABOLOID
+ 0003 01 OFFSET CASSEGRAIN PARABOLOID
+ 0004 01 PLANAR ARRAY
+ 0005 01 COAXIAL-COLLINEAR ARRAY
+ 0006 01 YAGI ELEMENTS ARRAY
+ 0007 01 MICROSTRIP
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002103 0002 0001 01 RADAR ANTENNA IS PROTECTED BY A RADOME
+ 0002 01 MISSING VALUE
+002104 0007 0000 01 HORIZONTAL POLARISATION
+ 0001 01 VERTICAL POLARISATION
+ 0002 01 RIGHT CIRCULAR POLARISATION
+ 0003 01 LEFT CIRCULAR POLARSZATION
+ 0004 01 HORIZONTAL AND VERTICAL POLARISATION
+ 0005 01 RIGHT AND LEFT CIRCULAR POLARISATION
+ 0015 01 MISSING VALUE
+002115 0007 0000 01 PDB
+ 0001 01 RSOIS
+ 0002 01 ASOS
+ 0003 01 PSYCHROMETER
+ 0004 01 F420
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002119 0008 0000 01 INTERMEDIATE FREQUENCY CALIBRATION MODE (IFCAL)
+ 0001 01 BUILT-IN TEST EQUIPMENT DIGITAL (BITE DGT)
+ 0002 01 BUILT-IN TEST EQUIPMENT RADIO FREQUENCY (BITE RF)
+ 0003 01 PRESET TRACKING (PSET TRK)
+ 0004 01 PRESET LOOP OUT
+ 0005 01 ACQUISITION
+ 0006 01 TRACKING
+ 0007 01 MISSING VALUE
+002131 0001 0001 01 STC OPERATIONAL
+002143 0021 0000 01 RESERVED
+ 0001 01 BREWER SPECTROPHOTOMETER
+ 0002 01 CAVER TEICHERT
+ 0003 01 DOBSON
+ 0004 01 DOBSON (JAPAN)
+ 0005 01 EHMET
+ 0006 01 FECKER TELESCOPE
+ 0007 01 HOELPER
+ 0008 01 JODMETER
+ 0009 01 FILTER OZONOMETER M-83
+ 0010 01 MAST
+ 0011 01 OXFORD
+ 0012 01 PAETZOLD
+ 0013 01 REGENER
+ 0014 01 RESERVED FOR FUTURE USE
+ 0015 01 VASSY FILTER OZONOMETER
+ 0016 01 CARBON IODIDE
+ 0017 01 SURFACE OZONE BUBLER
+ 0018 01 FILTER OZONOMETER M-124
+ 0019 01 ECC SONDE
+ 0127 01 MISSING VALUE
+002144 0008 0000 01 DIRECT SUN
+ 0001 01 DIRECT SUN, ATTENUATOR #1
+ 0002 01 DIRECT SUN, ATTENUATOR #2
+ 0003 01 FOCUSSED MOON
+ 0004 01 FOCUSSED SUN
+ 0005 01 FOCUSSED SUN CORRECTED WITH ADJACENT SKY MEASUREMENTS
+ 0006 01 ZENITH SKY
+ 0015 01 MISSING VALUE
+002216 0017 0001 01 CALIBRATION/MEASUREMENT PULSE FLAG (1)
+ 0002 01 CALIBRATION/MEASUREMENT PULSE FLAG (2)
+ 0003 01 OUTER ANTENNA BEAM
+ 0004 01 SIGMA-0 CELL IS AFT OF SPACECRAFT
+ 0005 01 CURRENT MODE (1)
+ 0006 01 CURRENT MODE (2)
+ 0007 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (1)
+ 0008 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (2)
+ 0009 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (3)
+ 0010 01 LOW RESOLUTION MODE - WHOLE PULSE DATA
+ 0011 01 SCATTEROMETER ELECTRONIC SUBSYSTEM B
+ 0012 01 ALTERNATE SPIN RATE - 19.8 RPM
+ 0013 01 RECEIVER PROTECTION ON
+ 0014 01 SLICES PER COMPOSITE FLAG(1)
+ 0015 01 SLICES PER COMPOSITE FLAG(2)
+ 0016 01 SLICES PER COMPOSITE FLAG(3)
+ 0017 01 MISSING VALUE
+002131 0002 0001 01 STC OPERATIONAL
+ 0003 01 MISSING VALUE
+002143 0021 0000 01 RESERVED
+ 0001 01 BREWER SPECTROMETER
+ 0002 01 CAVER TEICHERT
+ 0003 01 DOBSON
+ 0004 01 DOBSON (JAPAN)
+ 0005 01 EHMET
+ 0006 01 FECKER TELESCOPE
+ 0007 01 HOELPER
+ 0008 01 JODMETER
+ 0009 01 FILTER OZONOMETER M-83
+ 0010 01 MAST
+ 0011 01 OXFORD
+ 0012 01 PAETZOLD
+ 0013 01 REGENER
+ 0014 01 RESERVED
+ 0015 01 VASSY FILTER OZONOMETER
+ 0016 01 CARBON IODIDE
+ 0017 01 SURFACE OZONE BUBLLER
+ 0018 01 FILTER OZONOMETER M-124
+ 0019 01 ECC SONDE
+ 0127 01 MISSING VALUE
+002144 0008 0000 01 DIRECT SUN, ATTENUATOR #0
+ 0001 01 DIRECT SUN, ATTENUATOR #1
+ 0002 01 DIRECT SUN, ATTENUATOR #2
+ 0003 01 FOCUSSED MOON
+ 0004 01 FOCUSSED SUN
+ 0005 01 FOCUSSED SUN CORRECTED WITH ADJACENT SKY MEASUREMENTS
+ 0006 01 ZENITH SKY
+ 0015 01 MISSING VALUE
+002145 0009 0000 01 WAVELENGTH AD ORDINARY SETTING
+ 0001 01 WAVELENGTH BD ORDINARY SETTING
+ 0002 01 WAVELENGTH CD ORDINARY SETTING
+ 0003 01 WAVELENGTH CC' ORDINARY SETTING
+ 0004 01 WAVELENGTH AD FOCUSSING IMAGE
+ 0005 01 WAVELENGTH BD FOCUSSING IMAGE
+ 0006 01 WAVELENGTH CD FOCUSSING IMAGE
+ 0007 01 WAVELENGTH CC' FOCUSSING IMAGE
+ 0015 01 MISSING VALUE
+002146 0011 0000 01 ON DIRECT SUN
+ 0001 01 ON DIRECT MOON
+ 0002 01 ON BLUE ZENITH SKY
+ 0003 01 ON ZENITH CLOUD (UNIFORM STRATIFIED LAYER OF SMALL OPACITY)
+ 0004 01 ON ZENITH CLOUD (UNIFORM OR MODERATELY VARIABLE LAYER OF MEDIUM OPACITY)
+ 0005 01 ON ZENITH CLOUD (UNIFORM OR MODERATELY VARIABLE LAYER OF LARGE OPACITY)
+ 0006 01 ON ZENITH CLOUD (HIGHLY VARIABLE OPACITY, WITH OR WITOUT PRECIPITATION)
+ 0007 01 ON ZENITH CLOUD (FOG)
+ 0008 01 ON ZENITH HAZE
+ 0009 01 ON DIRECT SUN THROUGH THIN CLOUD, FOG OR HAZE
+ 0015 01 MISSING VALUE
+002148 0006 0000 01 RESERVED
+ 0001 01 ARGOS
+ 0002 01 GPS
+ 0003 01 GOES DCP
+ 0004 01 METEOSAT DCP
+ 0031 01 MISSING VALUE
+002149 0022 0000 01 UNSPECIFIED DRIFTING BUOY
+ 0001 01 STANDARD LAGRANGIAN DRIFTER (GLOBAL DRIFTER PROGRAMME)
+ 0002 01 STANDARD FGGE TYPE DRIFTING BUOY
+ 0003 01 WIND MEASURING FGGE TYPE DRIFTING BUOY
+ 0004 01 ICE FLOAT
+ 0008 01 UNSPECIFIED SUB-SURFACE FLOAT
+ 0009 01 SOFAR
+ 0010 01 ALACE
+ 0011 01 MARVOR
+ 0012 01 RAFOS
+ 0016 01 UNSPECIFIED MOORED BUOY
+ 0017 01 NOMAD
+ 0018 01 3-METRE DISCUS
+ 0019 01 10-12-METRE DISCUS
+ 0020 01 ODAS 30 SERIES
+ 0021 01 ATLAS (E.G. TAO AREA)
+ 0022 01 TRITON BUOY
+ 0023 01 RESERVED
+ 0024 01 OMNIDIRECTIONAL WAVERIDER
+ 0025 01 DIRECTIONAL WAVERIDER
+ 0026 01 SUB-SURFACE ARGO FLOAT
+ 0063 01 MISSING VALUE
+002150 0055 0000 01 RESERVED
+ 0001 01 HIRS 1
+ 0002 01 HIRS 2
+ 0003 01 HIRS 3
+ 0004 01 HIRS 4
+ 0005 01 HIRS 5
+ 0006 01 HIRS 6
+ 0007 01 HIRS 7
+ 0008 01 HIRS 8
+ 0009 01 HIRS 9
+ 0010 01 HIRS 10
+ 0011 01 HIRS 11
+ 0012 01 HIRS 12
+ 0013 01 HIRS 13
+ 0014 01 HIRS 14
+ 0015 01 HIRS 15
+ 0016 01 HIRS 16
+ 0017 01 HIRS 17
+ 0018 01 HIRS 18
+ 0019 01 HIRS 19
+ 0020 01 HIRS 20
+ 0021 01 MSU 1
+ 0022 01 MSU 2
+ 0023 01 MSU 3
+ 0024 01 MSU 4
+ 0025 01 SSU 1
+ 0026 01 SSU 2
+ 0027 01 SSU 3
+ 0028 01 AMSU-A 1
+ 0029 01 AMSU-A 2
+ 0030 01 AMSU-A 3
+ 0031 01 AMSU-A 4
+ 0032 01 AMSU-A 5
+ 0033 01 AMSU-A 6
+ 0034 01 AMSU-A 7
+ 0035 01 AMSU-A 8
+ 0036 01 AMSU-A 9
+ 0037 01 AMSU-A 10
+ 0038 01 AMSU-A 11
+ 0039 01 AMSU-A 12
+ 0040 01 AMSU-A 13
+ 0041 01 AMSU-A 14
+ 0042 01 AMSU-A 15
+ 0043 01 AMSU-B 1
+ 0044 01 AMSU-B 2
+ 0045 01 AMSU-B 3
+ 0046 01 AMSU-B 4
+ 0047 01 AMSU-B 5
+ 0048 01 AVHRR 1
+ 0049 01 AVHRR 2
+ 0050 01 AVHRR 3A
+ 0051 01 AVHRR 3B
+ 0052 01 AVHRR 4
+ 0053 01 AVHRR 5
+ 0063 01 MISSING VALUE
+002151 0009 0000 01 HIRS
+ 0001 01 MSU
+ 0002 01 SSU
+ 0003 01 AMSU-A1-1
+ 0004 01 AMSU-A1-2
+ 0005 01 AMSU-A2
+ 0006 01 AMSU-B
+ 0007 01 AVHRR
+ 2047 01 MISSING VALUE
+002152 0011 0001 01 HIGH-RESOLUTION INFRARED SOUNDER(HIRS)
+ 0002 01 MICROWAVE SOUNDING UNIT (MSU)
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+ 0009 01 GEOSTATIONARY IMAGER
+ 0010 01 GEOSTATIONARY SOUNDER
+ 0011 01 GEOSTATIONARY EARTH RADIATION (GERB)
+002158 0008 0001 01 MISMATCH IN RED VEC HPA
+ 0002 01 MISMATCH IN RED VEC RFSS
+ 0003 01 PTR CALIBRATION BAND 320 MHZ (KU)
+ 0004 01 PTR CALIBRATION BAND 80 MHZ (KU)
+ 0005 01 PTR CALIBRATION BAND 20 MHZ (KU)
+ 0006 01 PTR CALIBRATION BAND 160 MHZ (S)
+ 0007 01 KU FLIGHT CALIBRATION PARAMETERS AVAILABLE
+ 0008 01 S FLIGHT CALIBRATION PARAMETERS AVAILABLE
+002159 0005 0001 01 TEMPERATURE INCONSISTENCY
+ 0002 01 DATA IS MISSING
+ 0003 01 REDUNDANCY CHANNEL
+ 0004 01 POWER BUS PROTECTION
+ 0005 01 OVERVOLTAGE/OVERLOAD PROTECTION
+002163 0015 0000 01 AUTO EDITOR
+ 0001 01 IRW HEIGHT ASSIGNMENT
+ 0002 01 WV HEIGHT ASSIGNMENT
+ 0003 01 H2O INTERCEPT HEIGHT ASSIGNMENT
+ 0004 01 CO2 SLICING HEIGHT ASSIGNMENT
+ 0005 01 LOW PIXEL MAX GRADIENT
+ 0006 01 HIGHER PIXEL MAX GRADIENT
+ 0007 01 PRIMARY HEIGHT ASSIGNMENT
+ 0008 01 LAYER THICKNESS ASSIGNMENT
+ 0009 01 CUMULATIVE CONTRIBUTION FUNCTION -10 PERCENT HEIGHT
+ 0010 01 CUMULATIVE CONTRIBUTION FUNCTION -50 PERCENT HEIGHT
+ 0011 01 CUMULATIVE CONTRIBUTION FUNCTION -90 PERCENT HEIGHT
+ 0012 02 CUMULATIVE CONTRIBUTION FUNCTION - HEIGHT OF
+ MAXIMUM GRADIENT
+ 0014 01 COMPOSITE HEIGHT ASSIGNMENT
+ 0015 01 MISSING VALUE
+002164 0004 0000 01 LP - NORMS LEAST SQUARE MINIMUM
+ 0001 01 EN - EUCLIDEAN NORM WITH RADIANCE CORRELATION
+ 0002 01 CC - CROSS CORRELATION
+ 0007 01 MISSING VALUE
+002166 0009 0000 01 TYPE NOT DEFINED
+ 0001 01 AUTOMATED STATISTICAL REGRESSION
+ 0002 01 CLEAR PATH
+ 0003 01 PARTLY CLOUDY PATH
+ 0004 01 CLOUDY PATH
+ 0005 01 APODIZED
+ 0006 01 UNAPODIZED
+ 0007 01 RECONSTRUCTED
+ 0008 01 CLOUD CLEARED
+002167 0004 0000 01 METHOD NOT DEFINE
+ 0001 01 1B RAW RADIANCE
+ 0002 01 PROCESSED RADIANCE
+ 0015 01 MISSING VALUE
+002169 0004 0000 01 CUP ROTOR
+ 0001 01 PROPELLER ROTOR
+ 0002 01 WIND OBSERVATION THROUGH AMBIENT NOISE (WOTAN)
+ 0015 01 MISSING VALUE
+002172 0003 0001 01 RETRIEVAL FROM A NADIR SOUNDING
+ 0002 01 RETRIEVAL FROM A LIMB SOUNDING
+ 0255 01 MISSING VALUE
+002175 0009 0000 01 MANUAL MEASUREMENT
+ 0001 01 TIPPING BUCKET METHOD
+ 0002 01 WEIGHING METHOD
+ 0003 01 OPTICAL METHOD
+ 0004 01 PRESSURE METHOD
+ 0005 01 FLOAT METHOD
+ 0006 01 DROP COUNTER METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002176 0006 0000 01 MANUAL OBSERVATION
+ 0001 01 VIDEO CAMERA METHOD
+ 0002 01 INFRA-RED METHOD
+ 0003 01 LASER METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002177 0005 0000 01 MANUAL OBSERVATION
+ 0001 01 ULTRASONIC METHOD
+ 0002 01 VIDEO CAMERA METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002178 0005 0000 01 MANUAL OBSERVATION
+ 0001 01 OPTICAL METHOD
+ 0002 01 CAPACITIVE METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002179 0006 0000 01 MANUAL OBSERVATION
+ 0001 01 VAISALA ALGORITHM
+ 0002 01 ASOS (FAA) ALGORITHM
+ 0003 01 AWOS (CANADA) ALGORITHM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002180 0008 0000 01 MANUAL OBSERVATION
+ 0001 02 OPTICAL SCATTER SYSTEM COMBINED WITH PRECIPITATION
+ OCCURRENCE SENSING SYSTEM
+ 0002 01 FORWARD AND/OR BACK-SCATTER SYSTEM OF VISIBLE LIGHT
+ 0003 01 FORWARD AND/OR BACK-SCATTER SYSTEM OF INFRARED LIGHT
+ 0004 01 INFRARED LIGHT EMITTING DIODE (IRED) SYSTEM
+ 0005 01 DOPPLER RADAR SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002181 0005 0001 01 RAIN DETECTOR
+ 0002 01 FREEZING RAIN SENSOR
+ 0003 01 ICE DETECTION SENSOR
+ 0004 01 HAIL AND ICE PELLET SENSOR
+ 0020 01 OTHER
+002182 0007 0000 01 MANUAL MEASUREMENT
+ 0001 01 TRANSMISSOMETER SYSTEM (BASE > 25)
+ 0002 01 TRANSMISSOMETER SYSTEM (BASE < 25 M)
+ 0003 01 FORWARD SCATTER SYSTEM
+ 0004 01 BACK SCATTER SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002183 0009 0000 01 MANUAL OBSERVATION
+ 0001 01 CEILOMETER SYSTEM
+ 0002 01 INFRARED CAMERA SYSTEM
+ 0003 01 MICROWAVE VISUAL CAMERA SYSTEM
+ 0004 01 SKY IMAGER SYSTEM
+ 0005 01 VIDEO TIME LAPSED CAMERA SYSTEM
+ 0006 01 MICRO PULSE LIDAR (MPL) SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002184 0008 0000 01 MANUAL OBSERVATION
+ 0001 01 LIGHTNING IMAGING SENSOR
+ 0002 01 ELECTRICAL STORM IDENTIFICATION SENSOR
+ 0003 01 MAGNETIC FINDER SENSOR
+ 0004 01 LIGHTNING STRIKE SENSOR
+ 0005 01 FLASH COUNTER
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002185 0007 0000 01 MANUAL MEASUREMENT
+ 0001 01 BALANCED FLOATING METHOD
+ 0002 01 PRESSURE METHOD
+ 0003 01 ULTRASONIC METHOD
+ 0004 01 HYDRAULIC METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002186 0023 0001 01 PRECIPITATION-UNKNOWN TYPE
+ 0002 01 LIQUID PRECIPITATION NOT FREEZING
+ 0003 01 LIQUID FREEZING PRECIPITATION
+ 0004 01 DRIZZLE
+ 0005 01 RAIN
+ 0006 01 SOLID PRECIPITATION
+ 0007 01 SNOW
+ 0008 01 SNOW GRAINS
+ 0009 01 SNOW PELLETS
+ 0010 01 ICE PELLETS
+ 0011 01 ICE CRYSTALS
+ 0012 01 DIAMOND DUST
+ 0013 01 SMALL HAIL
+ 0014 01 HAIL
+ 0015 01 GLAZE
+ 0016 01 RIME
+ 0017 01 SOFT RIME
+ 0018 01 HARD RIME
+ 0019 01 CLEAR ICE
+ 0020 01 WET SNOW
+ 0021 01 HOAR FROST
+ 0022 01 DEW
+ 0023 01 WHITE DEW
+002187 0011 0001 01 DUST/SAND WHIRL
+ 0002 01 SQUALLS
+ 0003 01 SAND STORM
+ 0004 01 DUST STORM
+ 0005 01 LIGHTNING - CLOUD TO SURFACE
+ 0006 01 LIGHTNING - CLOUD TO CLOUD
+ 0007 01 LIGHTNING - DISTANT
+ 0008 01 THUNDERSTORM
+ 0009 01 FUNNEL CLOUD NOT TOUCHING SURFACE
+ 0010 01 FUNNEL CLOUD TOUCHING SURFACE
+ 0011 01 SPRAY
+002188 0010 0001 01 FOG
+ 0002 01 ICE FOG
+ 0003 01 STEAM FOG
+ 0007 01 MIST
+ 0008 01 HAZE
+ 0009 01 SMOKE
+ 0010 01 VOLCANIC ASH
+ 0011 01 DUST
+ 0012 01 SAND
+ 0013 01 SNOW
+002189 0004 0001 01 MANUAL OBSERVATION
+ 0002 01 ALL LIGHTNING STRIKES WITHOUT DISCRIMINATION
+ 0003 01 LIGHTNING STRIKES CLOUD TO GROUND ONLY
+ 0004 02 ALL LIGHTNING STRIKES WITH DISCRIMINATION BETWEEN
+ CLOUD TO GROUND AND CLOUD TO CLOUD
+002194 0002 0000 01 FGGE
+ 0015 01 MISSING VALUE
+002196 0017 0000 01 NIMBUS
+ 0001 01 VTPR
+ 0002 01 TIROS 1 ( TIROS NOAA 6 TO NOAA 13)
+ 0003 01 TIROS 2 ( NOAA-14 ONWARD)
+ 0031 01 DMSP
+ 0061 01 EUMETSAT POLAR SYSTEM (EPS)
+ 0091 01 ERS
+ 0121 01 ADEOS
+ 0241 01 GOES
+ 0271 01 GMS
+ 0301 01 INSAT
+ 0331 01 METEOSAT OPERATIONAL PROGRAMME(MOP)
+ 0332 01 METEOSAT TRANSITIONAL PROGRAMME(MTP)
+ 0333 01 METEOSAT SECOND GENERATION PROGRAMME(MSG)
+ 0351 01 GOMS
+ 0381 01 FY-2
+ 0512 01 MISSING VALUE
+002199 0004 0000 01 RESERVED
+ 0001 01 TABLE WITH FULL RANGE OF HUMMIDITY VALUES IN LAYER
+ 0002 01 REGRESSION TECHNIQUE ON 2 HUMMIDITY VALUES IN LAYER
+ 0015 01 MISSING VALUE
+002207 0003 0000 01 AFR SCAN
+ 0001 01 FORWARD AFT SCAN
+ 0007 01 MISSING VALUE
+002231 0015 0000 01 RESERVED
+ 0001 01 IRW HEIGHT ASSIGNMENT
+ 0002 01 WV HEIGHT ASSIGNMENT
+ 0003 01 H2O INTERCEPT HEIGHT ASSIGNMENT
+ 0004 01 CO2 SLICING HEIGHT ASSIGNMENT
+ 0005 01 LOW PIXEL MAX GRADIENT
+ 0006 01 HIGHER PIXEL MAX GRADIENT
+ 0007 01 PRIMARY HEIGHT ASSIGNMENT
+ 0008 01 LAYER THICKNESS ASSIGNMENT
+ 0009 01 CUMULATIVE CONTRIBUTION FUNCTION -10 PERCENT HEIGHT
+ 0010 01 CUMULATIVE CONTRIBUTION FUNCTION -50 PERCENT HEIGHT
+ 0011 01 CUMULATIVE CONTRIBUTION FUNCTION -90 PERCENT HEIGHT
+ 0012 02 CUMULATIVE CONTRIBUTION FUNCTION - HEIGHT OF
+ MAXIMUM GRADIENT
+ 0014 01 COMPOSITE HEIGHT ASSIGNMENT
+ 0015 01 MISSING VALUE
+002232 0004 0000 01 P - NORMS LEAST SQUARE MINIMUM
+ 0001 01 EN - EUCLIDEAN NORM WITH RADIANCE CORRELATION
+ 0002 01 CC - CROSS CORRELATION
+ 0003 01 MISSING VALUE
+002251 0004 0000 01 METHOD NOT DEFINED
+ 0001 01 1B RAW RADIANCE
+ 0002 01 PROCESSED RADIANCE
+ 0015 01 MISSING VALUE
+002252 0012 0001 01 HIGH-RESOLUTION INFRARED SOUNDER(HIRS)
+ 0002 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+ 0009 01 GEOSTATIONARY IMAGER
+ 0010 01 GEOSTATIONARY SOUNDER
+ 0011 01 GEOSTATIONARY EARTH RADIATION (GERB)
+ 0031 01 ALL BITS SET - MISSING VALUE
+002254 0006 0000 01 TYPE NOT DEFINED
+ 0001 01 AUTOMATED STATISTICAL REGRESSION
+ 0002 01 CLEAR PATH
+ 0003 01 PARTLY CLOUDY PATH
+ 0004 01 CLOUDY PATH
+ 0015 01 MISSING VALUE
+004059 0005 0001 01 00 UTC
+ 0002 01 06 UTC
+ 0003 01 12 UTC
+ 0004 01 18 UTC
+ 0005 01 OTHER HOURS
+008001 0007 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 MAXIMUM WIND LEVEL
+ 0005 01 SIGNIFICANT LEVEL, TEMPERATURE AND/OR RELATIVE HUMIDITY
+ 0006 01 SIGNIFICANT LEVEL, WIND
+ 0007 01 MISSING VALUE
+008002 0013 0000 02 OBSERVING RULES FOR BASE OF LOWEST CLOUD AND CLOUD TYPES OF
+ FM 12-IX EXT. SYNOP AND FM 13-IX EXT. SHIP APPLY
+ 0001 01 FIRST NON - CB SIGNIFICANT LAYER
+ 0002 01 SECOND NON - CB SIGNIFICANT LAYER
+ 0003 01 THIRD NON - CB SIGNIFICANT LAYER
+ 0004 01 CUMULONIMBUS LAYER
+ 0005 01 CEILING
+ 0006 01 CLOUD NOT DETECTED BELOW THE FOLLOWING HEIGHT(S)
+ 0007 01 LOW CLOUD
+ 0008 01 MIDDLE CLOUD
+ 0009 01 HIGH CLOUD
+ 0010 02 CLOUD LAYER WITH BASE BELOW THE STATION LEVEL AND TOP
+ ABOVE THE STATION LEVEL
+ 0011 01 CLOUD LAYER WITH BASE AND TOP BELOW THE STATION LEVEL
+ 0063 01 MISSING VALUE
+008003 0009 0000 01 SURFACE
+ 0001 01 BASE OF SATELLITE SOUNDING
+ 0002 01 CLOUD TOP
+ 0003 01 TROPOPAUSE
+ 0004 01 PRECIPITABLE WATER
+ 0005 01 SOUNDING RADIANCES
+ 0006 01 MEAN TEMPERATURES
+ 0007 01 OZON
+ 0063 01 MISSING VALUE
+008004 0006 0002 01 UNSTEADY (UNS)
+ 0003 01 LEVEL FLIGHT, ROUTINE OBSERVATION (LVR)
+ 0004 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED (LVW)
+ 0005 01 ASCENDING (ASC)
+ 0006 01 DESCENDING(DES)
+ 0007 01 MISSING VALUE
+008005 0005 0000 01 RESERVED
+ 0001 01 STORM CENTRE
+ 0002 01 OUTER LIMIT OR EDGE OF STORM
+ 0003 01 LOCATION OF MAXIMUM WIND
+ 0004 01 LOCATION OF STORM IN THE PERTURBED ANALYSIS
+ 0005 01 LOCATION OF STORM IN THE ANALYSIS
+ 0015 01 MISSING VALUE
+008006 0008 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 PROMINENT MAXIMUM LEVEL
+ 0005 01 PROMINENT MINIMUM LEVEL
+ 0006 01 MINIMUM PRESSURE LEVEL
+ 0007 01 RESERVED
+ 0008 01 LEVEL OF UNDETERMINED SIGNIFICANCE
+008007 0005 0000 01 POINT
+ 0001 01 LINE
+ 0002 01 AREA
+ 0003 01 VOLUME
+ 0015 01 MISSING VALUE
+008008 0008 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 LEVEL OF BETA RADIATION MAXIMUM
+ 0005 01 LEVEL OF GAMMA RADIATION MAXIMUM
+ 0006 01 MINIMUM PRESSURE LEVEL
+ 0007 01 RESERVED
+ 0008 01 LEVEL OF UNDETERMINED SIGNIFICANCE
+008009 0016 0000 01 LEVEL FLIGHT, ROUTINE OBSERVATION, UNSTEADY
+ 0001 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED, UNSTEADY
+ 0002 01 UNSTEADY (UNS)
+ 0003 01 LEVEL FLIGHT, ROUTINE OBSERVATION (LVR)
+ 0004 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED (LVW)
+ 0005 01 ASCENDING (ASC)
+ 0006 01 DESCENDING (DES)
+ 0007 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS
+ 0008 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS, UNSTEADY
+ 0009 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS
+ 0010 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS, UNSTEADY
+ 0011 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS
+ 0012 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS, UNSTEADY
+ 0013 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS
+ 0014 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS, UNSTEADY
+ 0015 01 MISSING VALUE
+008010 0013 0000 01 RESERVED
+ 0001 01 BARE SOIL
+ 0002 01 BARE ROCK
+ 0003 01 LAND GRASS COVER
+ 0004 01 WATER (LAKE, SEA)
+ 0005 01 FLOOD WATER UNDERNEATH
+ 0006 01 SNOW
+ 0007 01 ICE
+ 0008 01 RUNWAY OR ROAD
+ 0009 01 SHIP OR PLATFORM DECK IN STEEL
+ 0010 01 SHIP OR PLATFORM DECK IN WOOD
+ 0011 01 SHIP OR PLATFORM DECK PARTLY COVERED WITH RUBBER MAT
+ 0031 01 MISSING VALUE
+008011 0026 0000 01 QUASI-STATIONARY FRONT AT THE SURFACE
+ 0001 01 QUASI-STATIONARY FRONT ABOVE THE SURFACE
+ 0002 01 WARM FRONT AT THE SURFACE
+ 0003 01 WARM FRONT ABOVE THE SURFACE
+ 0004 01 COLD FRONT AT THE SURFACE
+ 0005 01 COLD FRONT ABOVE THE SURFACE
+ 0006 01 OCCLUSION
+ 0007 01 INSTABILITY LINE
+ 0008 01 INTERTROPICAL FRONT
+ 0009 01 CONVERGENCE LINE
+ 0010 01 JET STREAM
+ 0011 01 CLOUD CLEAR
+ 0012 01 CLOUD
+ 0013 01 TURBULENCE
+ 0014 01 STORM
+ 0015 01 AIRFRAME ICING
+ 0016 01 PHENOMENON
+ 0017 01 VOLCANO
+ 0018 01 ATMOSPHERICS
+ 0020 01 SPECIAL CLOUDS
+ 0021 01 THUNDERSTORM (VAL)
+ 0022 01 TROPICAL CYCLONE (VAL)
+ 0023 01 MOUNTAIN WAVE (VAL)
+ 0024 01 DUSTSTORM (VAL)
+ 0025 01 SANDSTORM (VAL)
+ 0063 01 MISSING VALUE
+008012 0004 0000 01 LAND
+ 0001 01 SEA
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008013 0004 0000 01 NIGHT
+ 0001 01 DAY
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008014 0010 0000 01 10-MINUTE MEAN VALUE - NORMAL VALUE
+ 0001 01 10-MINUTE MEAN VALUE - ABOVE THE UPPER LIMIT FOR ASSESSMENT OF RVR (P)
+ 0002 01 10-MINUTE MEAN VALUE - BELOW LOWER LIMIT FOR ASSESSMENT OF RVR (M)
+ 0003 01 ONE MINUTE MINIMUM VALUE - NORMAL VALUE
+ 0004 01 ONE MINUTE MINIMUM VALUE - ABOVE THE UPPER LIMIT FOR ASSESSMENT OF RVR (P)
+ 0005 01 ONE MINUTE MINIMUM VALUE - BELOW LOWER LIMIT FOR ASSESSMENT OF RVR (M)
+ 0006 01 ONE MINUTE MAXIMUM VALUE - NORMAL VALUE
+ 0007 01 ONE MINUTE MAXIMUM VALUE - ABOVE THE UPPER LIMIT FOR ASSESSMENT OF RVR (P)
+ 0008 01 ONE MINUTE MAXIMUM VALUE - BELOW LOWER LIMIT FOR ASSESSMENT OF RVR (M)
+ 0015 01 MISSING VALUE
+008016 0005 0000 01 NOSIG
+ 0001 01 BECMG
+ 0002 01 TEMPO
+ 0003 01 FM
+ 0007 01 MISSING VALUE
+008017 0004 0000 01 FM
+ 0001 01 TL
+ 0002 01 AT
+ 0003 01 MISSING VALUE
+008018 0005 0001 01 LAND IS PRESENT
+ 0002 01 SURFACE ICE MAP INDICATES ICE IS PRESENT
+ 0011 01 ICE MAP DATA NOT AVAILABLE
+ 0012 01 ATTENUATION MAP DATA NOT AVAILABLE
+ 0017 01 MISSING VALUE
+008021 0028 0000 01 RESERVED
+ 0001 01 TIME SERIES
+ 0002 01 TIME AVERAGED
+ 0003 01 ACCUMULATED
+ 0004 01 FORECAST
+ 0005 01 FORECAST TIME SERIES
+ 0006 01 FORECAST TIME AVERAGED
+ 0007 01 FORECAST ACCUMULATED
+ 0008 01 ENSEMBLE MEAN
+ 0009 01 ENSEMBLE MEAN TIME SERIES
+ 0010 01 ENSEMBLE MEAN TIME AVERAGED
+ 0011 01 ENSEMBLE MEAN ACCUMULATED
+ 0012 01 ENSEMBLE MEAN FORECAST
+ 0013 01 ENSEMBLE MEAN FORECAST TIME SERIES
+ 0014 01 ENSEMBLE MEAN FORECAST AVERAGED
+ 0015 01 ENSEMBLE MEAN FORECAST ACCUMULATED
+ 0016 01 ANALYSIS
+ 0017 01 START OF PHENOMENON
+ 0018 01 RADIOSONDE LAUNCH TIME
+ 0019 01 START OF ORBIT
+ 0020 01 END OF ORBIT
+ 0021 01 TIME OF ASCENDING NODE
+ 0022 01 TIME OF OCCURENCE OF WIND SHIFT
+ 0027 01 FIRST GUESS --NOT WMO ENTRY
+ 0028 01 START OF SCAN --NOT WMO ENTRY
+ 0029 01 END OF SCAN --NOT WMO ENTRY
+ 0031 01 MISSING VALUE
+008023 0017 0002 01 MAXIMUM VALUE
+ 0003 01 MINIMUM VALUE
+ 0004 01 MEAN VALUE
+ 0005 01 MEDIAN VALUE
+ 0006 01 MODAL VALUE
+ 0007 01 MEAN ABSOLUTE ERROR
+ 0009 01 BEST ESTIMATE OF STANDARD DEVIATION (N-1)
+ 0010 01 STANDARD DEVIATION
+ 0011 01 HARMONIC MEAN
+ 0012 01 ROOT MEAN SQUARE VECTOR ERROR
+ 0013 01 ROOT-MEAN-SQUARE
+ 0032 01 VECTOR MEAN
+ 0033 01 PRESCRIBED OBSERVATION ERROR
+ 0034 01 PERSISTENCE OBSERVATION ERROR
+ 0035 01 FINAL OBSERVATION ERROR
+ 0036 01 REPRESENTATIVNESS OBSERVATION ERROR
+ 0063 01 MISSING
+008024 0012 0002 01 OBSERVED MINUS MAXIMUM
+ 0003 01 OBSERVED MINUS MINIMUM
+ 0004 01 OBSERVED MINUS MEAN
+ 0005 01 OBSERVED MINUS MEDIAN
+ 0006 01 OBSERVED MINUS MODE
+ 0011 01 OBSERVED MINUS CLIMATOLOGY (ANOMALY)
+ 0012 01 OBSERVED MINUS ANALYZED VALUE
+ 0013 01 OBSERVED MINUS INITIALISED ANALYZED VALUE
+ 0014 01 OBSERVED MINUS FORECAST VALUE
+ 0021 01 OBSERVED MINUS INTERPOLATED VALUE
+ 0022 01 OBSERVED MINUS HYDROSTATICALLY CALCULATED VALUE
+ 0032 01 OBSERVED MINUS FIRST GUESS
+ 0033 01 OBSERVED MINUS ANALYSIS
+ 0034 01 OBSERVED MINUS INITIALIZED ANALYSIS
+ 0063 01 MISSING
+008025 0005 0000 02 UNIVERSAL TIME COORDINATED (UTC) MINUS
+ LOCAL STANDARD TIME (LST)
+ 0001 01 LOCAL STANDARD TIME
+ 0002 01 UNIVERSAL TIME COORDINATED (UTC) MINUS SATELLITE CLOCK
+ 0005 01 TIME DIFFERENCE FROM EDGE OF PROCESSING SEGMENT
+ 0015 01 MISSING
+008026 0005 0000 01 AVERAGING KERNEL MATRIX
+ 0001 01 CORRELATION MATRIX
+ 0002 01 LOWER TRIANGULAR CORRELATION MATRIX SQUARE ROOT (L FROM C=LLT)
+ 0003 01 INVERSE LOWER TRIANGULAR CORRELATION MATRIX SQUARE ROOT (L**-1)
+ 0063 01 MISSING VALUE
+008027 0007 0000 01 ASSUME NO PARTICULAR MATRIX GEOMETRY
+ 0001 01 DIAGONAL MATRIX
+ 0002 01 TRIDIAGONAL MATRIX
+ 0003 01 MULTI-DIAGONAL MATRIX (GENERAL CASE: DIAGONAL AND ABOVE)
+ 0004 01 LOWER TRIANGULAR MATRIX
+ 0005 01 SYMETRICAL MATRIX
+ 0063 01 MISSING VALUE
+008029 0005 0000 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0001 01 ENCLOSED SEA OR LAKE
+ 0002 01 CONTINENTAL ICE
+ 0003 01 LAND
+ 0255 01 MISSING
+008033 0004 0000 01 RESERVED
+ 0001 01 PERCENTAGE CONFIDENCE CALCULATED USING CLOUD FRACTION
+ 0002 01 PERCENTAGE CONFIDENCE CALCULATED USING STANDARD
+ DEVIATION OF TEMPERATURE
+ 0003 02 PERCENTAGE CONFIDENCE CALCULATED USING PROBABILITY OF
+ THE CLOUD CONTAMINATION
+ 0004 01 PERCENTAGE CONFIDENCE CALCULATED USING NORMALITY OF DISTRIBUTION
+ 0127 01 MISSING
+008035 0008 0000 01 GLOBAL
+ 0001 01 REGIONAL
+ 0002 01 NATIONAL
+ 0003 01 SPECIAL
+ 0004 01 BILATERAL
+ 0005 01 RESERVED
+ 0006 01 RESERVED
+ 0007 01 MISSING
+008036 0008 0000 01 WMO SECRETARIAT
+ 0001 01 WMO
+ 0002 01 RSMC
+ 0003 01 NMC
+ 0004 01 RTH
+ 0005 01 OBSERVING SITE
+ 0006 01 OTHER
+ 0007 01 MISSING
+008039 0008 0000 01 ISSUE TIME OF FORECAST
+ 0001 01 TIME OF COMMNENCEMENT OF PERIOD OF THE FORECAST
+ 0002 01 TIME OF ENDING OF PERIOD OF THE FORECAST
+ 0003 01 FORECSAT TIME OF MAXIMUM TEMPERATURE
+ 0004 01 FORECSAT TIME OF MINIMUM TEMPERATURE
+ 0005 01 TIME OF BEGINNING OF THE FORECAST
+ 0006 01 TIME OF ENDING OF THE FORECAST
+ 0063 01 MISSING VALUE
+008040 0043 0000 01 HIGH RESOLUTION DATA SAMPLE
+ 0001 01 WITHIN 20 HPA OF SURFACE
+ 0002 02 PRESSURE LESS THAN 10 HPA (I.E., 9, 8, 7, ETC.)
+ WHEN NO OTHER REASON APPLIES
+ 0003 01 BASE PRESSURE LEVEL FOR STABILITY INDEX
+ 0004 01 BEGIN DOUBTFUL TEMPERATURE, HEIGHT DATA
+ 0005 01 BEGIN MISSING DATA (ALL ELEMENTS)
+ 0006 01 BEGIN MISSING RH DATA
+ 0007 01 BEGIN MISSING TEMPERATURE DATA
+ 0008 02 HIGHEST LEVEL REACHED BEFORE BALLOON
+ DESCENT BECAUSE OF ICING OR TURBULENCE
+ 0009 01 END DOUBTFUL TEMPERATURE, HEIGHT DATA
+ 0010 01 END MISSING DATA (ALL ELEMENTS)
+ 0011 01 END MISSING RH DATA
+ 0012 01 END MISSING TEMPERATURE DATA
+ 0013 01 ZERO DEGREES C CROSSING(S) FOR RADAT
+ 0014 01 STANDARD PRESSURE LEVEL
+ 0015 01 OPERATOR ADDED LEVEL
+ 0016 01 OPERATOR DELETED LEVEL
+ 0017 01 BALLOON RE-ASCENDED BEYOND PREVIOUS HIGHEST ASCENT LEVEL
+ 0018 01 SIGNIFICANT RH LEVEL
+ 0019 01 RH LEVEL SELECTION TERMINATED
+ 0020 01 SURFACE LEVEL
+ 0021 01 SIGNIFICANT TEMPERATURE LEVEL
+ 0022 01 MANDATORY TEMPERATURE LEVEL
+ 0023 01 FLIGHT TERMINATION LEVEL
+ 0024 01 TROPOPAUSE(S)
+ 0025 01 AIRCRAFT REPORT
+ 0026 01 INTERPOLATED (GENERATED) LEVEL
+ 0027 01 MANDATORY WIND LEVEL
+ 0028 01 SIGNIFICANT WIND LEVEL
+ 0029 01 MAXIMUM WIND LEVEL
+ 0030 01 INCREMENTAL WIND LEVEL (FIXED REGIONAL)
+ 0031 01 INCREMENTAL HEIGHT LEVEL (GENERATED)
+ 0032 01 WIND TERMINATION LEVEL
+ 0033 01 PRESSURE 100 TO 110 HPA, WHEN NO OTHER REASON APPLIES
+ 0040 01 SIGNIFICANT THERMODYNAMIC LEVEL (INVERSION)
+ 0041 01 SIGNIFICANT RH LEVEL ( PER NCDC CRITERIA)
+ 0042 01 SIGNIFICANT TEMPERATURE LEVEL (PER NCDC)
+ 0043 01 BEGIN MISSING WIND DATA
+ 0044 01 END MISSING WIND DATA
+ 0060 01 LEVEL OF 80-KNOT ISOTACH ABOVE JET
+ 0061 01 LEVEL OF 80-KNOT ISOTACH BELOW JET
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+008041 0009 0000 01 PARENT SITE
+ 0001 01 OBSERVATION SITE
+ 0002 01 BALLOON MANUFACTURE DATE
+ 0003 01 BALLOON LAUNCH POINT
+ 0004 01 SURFACE OBSERVATION
+ 0005 01 SURFACE OBSERVATION DISPLACEMENT FROM LAUNCH POINT
+ 0006 01 FLIGHT LEVEL OBSERVATION
+ 0007 01 FLIGHT LEVEL TERMINATION POINT
+ 0031 01 MISSING VALUE
+008042 0014 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 MAXIMUM WIND LEVEL
+ 0005 01 SIGNIFICANT TEMPERATURE LEVEL
+ 0006 01 SIGNIFICANT HUMIDITY LEVEL
+ 0007 01 SIGNIFICANT WIND LEVEL
+ 0008 01 BEGINNING OF MISSING TEMPERATURE DATA
+ 0009 01 END OF MISSING TEMPERATURE DATA
+ 0010 01 BEGINNING OF MISSING HUMIDITY DATA
+ 0011 01 END OF MISSING HUMIDITY DATA
+ 0012 01 BEGINNING OF MISSING WIND DATA
+ 0013 01 END OF MISSING WIND DATA
+ 0018 01 ALL 18 MISSING
+008043 21 0000 01 OZONE, O3,10028-15-6
+ 0001 01 WATER VAPOUR, H2O, 7732-18-5
+ 0002 01 METHANE, CH4, 74-82-8
+ 0003 01 CARBON DIOXIDE, CO2, 37210-16-5
+ 0004 01 CARBON MONOXIDE, CO, 630-08-0
+ 0005 01 NITROGEN DIOXIDE, NO2, 10102-44-0
+ 0006 01 NITROUS OXIDE, N2O, 10024-97-2
+ 0007 01 FORMALDEHYDE, HCHO, 50-00-0
+ 0008 01 SULFUR DIOXIDE, SO2, 7446-09-5
+ 0009 01 BROMINE OXIDE, BRO, 15656-19-6
+ 0010 01 CHLORINE DIOXIDE, OCLO, 10049-04-4
+ 0011 01 NITROGEN MONOXIDE, NO, 10102-43-9
+ 0012 01 AMMONIA, NH3, 7664-41-7
+ 0025 01 PARTICULATE MATTER < 1.0 MICRONS
+ 0026 01 PARTICULATE MATTER < 2.5 MICRONS
+ 0027 01 PARTICULATE MATTER < 10 MICRONS
+ 0028 01 AEROSOLS GENERIC
+ 0029 01 SMOKE GENERIC
+ 0030 01 CRUSTAL MATERIAL (GENERIC DUST)
+ 0031 01 VOLCANIC ASH
+ 0255 01 MISSING
+008050 0011 0000 01 RESERVED
+ 0001 01 PRESSURE
+ 0002 01 TEMPERATURE
+ 0003 01 EXTREME TEMPERATURE
+ 0004 01 VAPOUR PRESSURE
+ 0005 01 PRECIPITATION
+ 0006 01 SUNSHINE DURATION
+ 0007 01 MAXIMUM TEMPERATURE
+ 0008 01 MINIMUM TEMPERATURE
+ 0009 01 WIND
+ 0015 01 MISSING VALUE
+008051 0007 0001 01 PRESSURE
+ 0002 01 TEMPERATURE
+ 0003 01 EXTREME TEMPERATURE
+ 0004 01 VAPOUR PRESSURE
+ 0005 01 PRECIPITATION
+ 0006 01 SUNSHINE DURATION
+ 0007 01 MISSING VALUE
+008052 0026 0000 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 10 M/S
+ 0001 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 20 M/S
+ 0002 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 30 M/S
+ 0003 01 MAXIMUM TEMPERATURE LESS THAN 273.2 K
+ 0004 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 298.2 K
+ 0005 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 303.2 K
+ 0006 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 308.2 K
+ 0007 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 313.2 K
+ 0008 01 MINIMUM TEMPERATURE LESS THAN 273.2 K
+ 0009 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 273.2 K
+ 0010 01 PRECIPITATION EQUAL TO OR MORE THAN 1.0 KG/M**2
+ 0011 01 PRECIPITATION EQUAL TO OR MORE THAN 5.0 KG/M**2
+ 0012 01 PRECIPITATION EQUAL TO OR MORE THAN 10.0 KG/M**2
+ 0013 01 PRECIPITATION EQUAL TO OR MORE THAN 50.0 KG/M**2
+ 0014 01 PRECIPITATION EQUAL TO OR MORE THAN 100.0 KG/M**2
+ 0015 01 PRECIPITATION EQUAL TO OR MORE THAN 150.0 KG/M**2
+ 0016 01 SNOW DEPTH MORE THAN 0.0 M
+ 0017 01 SNOW DEPTH MORE THAN 0.01 M
+ 0018 01 SNOW DEPTH MORE THAN 0.10 M
+ 0019 01 SNOW DEPTH MORE THAN 0.50 M
+ 0020 01 HORIZONTAL VISIBILITY LESS THAN 50 M
+ 0021 01 HORIZONTAL VISIBILITY LESS THAN 100 M
+ 0022 01 HORIZONTAL VISIBILITY LESS THAN 1000 M
+ 0023 01 HAIL
+ 0024 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+008053 0004 0000 01 VALUE OCCURED ON ONLY ONE DAY IN THE MONTH
+ 0001 01 VALUE OCCURED ON MORE THAN ONE DAY IN THE MONTH
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008054 0003 0000 01 WIND SPEED OR GUST IS AS REPORTED
+ 0001 01 WIND SPEED IS GREATER THAN THAT REPRTED (P IN METAR/TAF/SPECI)
+ 0007 01 MISSING VALUE
+008060 0008 0000 01 RESERVED
+ 0001 01 RANGE
+ 0002 01 AZIMUTH
+ 0003 01 HORIZONTAL
+ 0004 01 VERTICAL
+ 0005 01 NORTH/SOUTH
+ 0006 01 EAST/WEST
+ 0015 01 MISSING VALUE
+008065 0004 0000 01 NO SUN-GLINT
+ 0001 01 SUN-GLINT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008066 0004 0000 01 OPAQUE
+ 0001 01 SEMI-TRANSPARENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008070 0006 0000 01 RESERVED
+ 0001 01 RESERVED
+ 0002 02 EARTH LOCATED INSTRUMENT COUNTS,
+ CALIBRATION COEFFICIENTS AND HOUSEKEEPING (LEVEL 1B)
+ 0003 01 EARTH LOCATED CALIBRATED RADIANCES (LEVEL 1C)
+ 0004 02 MAPPED TO A COMMON FOOTPRINT, EARTH LOCATED
+ CALIBRATED RADIANCES (LEVEL 1D)
+ 0015 01 MISSING VALUE
+008072 0004 0000 01 MIXED
+ 0001 01 CLEAR
+ 0002 01 CLOUDY
+ 0007 01 MISSING VALUE
+008074 0004 0000 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0001 01 NON-OCEAN LIKE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008075 0004 0000 01 ASCENDING ORBIT
+ 0001 01 DESCENDING ORBIT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008076 0003 0000 01 KU
+ 0001 01 C
+ 0063 01 MISSING VALUE
+008077 0007 0000 01 LAND
+ 0001 01 SEA
+ 0002 01 COASTAL
+ 0003 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0004 01 ENCLOSED SEA OR LAKE
+ 0005 01 CONTINENTAL ICE
+ 0127 01 MISSING VALUE
+008079 0009 0000 01 NORMAL ISSUE
+ 0001 01 CORRECTION TO A PREVIOUSLY ISSUED PRODUCT (COR)
+ 0002 01 AMANDMENT TO A PREVIOUSLY ISSUED PRODUCT *AMD)
+ 0003 01 CORRECTION TO A PREVIOUSLY ISSUED AMENDED PRODUCT (COR AMD)
+ 0004 01 CANCELLATION OD A PREVIOUSLY ISSUED PRODUCT (CNL)
+ 0005 01 NO PRODUCT AVAILABLE (NIL)
+ 0006 01 SPECIAL REPORT ( SPECI)
+ 0007 01 CORRECTED SPECIAL REPORT (SPECI COR)
+ 0015 01 MISSING VALUE
+008080 0009 0000 01 TOTAL WATER PRESSURE PROFILE
+ 0001 01 TOTAL WATER TEMPERATURE PROFILE
+ 0002 01 TOTAL WATER SALINITY PROFILE
+ 0003 01 TOTAL WATER CONDUCTIVITY PROFILE
+ 0010 01 WATER PRESSURE AT A LEVEL
+ 0011 01 WATER TEMPERATURE AT A LEVEL
+ 0012 01 SALINITY AT A LEVEL
+ 0020 01 POSITION
+ 0063 01 MISSING VALUE
+008081 0005 0000 01 SENSOR
+ 0001 01 TRANSMITTER
+ 0002 01 RECEIVER
+ 0003 01 OBSERVING PLATFORM
+ 0063 01 MISSING VALUE
+008082 0003 0000 01 SENSOR HEIGHT IS NOT MODIFIED
+ 0001 01 SENSOR HEIGHT IS MODIFIED TO STANDARD LEVEL
+ 0007 01 MISSING VALUE
+008083 0009 0001 02 ADJUSTED WITH RESPECT TO REPRESENTATIVE HEIGHT OF SENSOR ABOVE
+ LOCAL GROUND (OR DECK OF MARINE PLATFORM)
+ 0002 02 ADJUSTED WITH RESPECT TO REPRESENTATIVE HEIGHT OF SENSOR ABOVE
+ WATER SURFACE
+ 0003 01 ADJUSTED WITH RESPECT TO STANDARD SURFACE ROUGHNESS
+ 0004 01 ADJUSTED WITH RESPECT TO WIND SPEED
+ 0005 01 ADJUSTED WITH RESPECT TO TEMPERATURE
+ 0006 01 ADJUSTED WITH RESPECT TO PRESSURE
+ 0007 01 ADJUSTED WITH RESPECT TO HUMIDITY
+ 0008 01 ADJUSTED WITH RESPECT TO EVAPORATION
+ 0009 01 ADJUSTED WITH RESPECT TO WETTING LOSSES
+008085 0004 0000 01 FORE BEAM
+ 0001 01 MID BEAM
+ 0002 01 AFT BEAM
+ 0003 01 RESERVED
+ 0004 01 RESERVED
+ 0005 01 RESERVED
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+008193 0007 0000 01 START TIME OF ORBIT
+ 0001 01 END TIME OF ORBIT
+ 0002 01 TIME OF ASCENDING NODE
+ 0003 01 ASSIMILATION TIME
+ 0004 01 START TIME OF ASSIMILATION
+ 0005 01 END TIME OF ASSIMLATION
+ 0063 01 MISSING
+008195 0032 0001 01 FIRST GUESS
+ 0002 01 ANALYSIS
+ 0003 01 INITIALISED ANALYSIS
+ 0004 01 OI ANALYSIS
+ 0005 01 3 D VARIATIONAL ANALYSIS
+ 0006 01 4 D VARIATIONAL ANALYSIS
+ 0007 01 3 D VARIATIONAL GRADIENTS
+ 0008 01 4 D VARIATIONAL GRADIENTS
+ 0009 01 FORECAST
+ 0010 01 CONTROL FORECAST
+ 0011 01 PERTURBED FORECAST
+ 0012 01 ERRORS IN FIRST GUESS
+ 0013 01 ERRORS IN ANALYSIS
+ 0014 01 CLUSTER MEANS
+ 0015 01 CLUSTER STANDARD DEVIATIONS
+ 0016 01 FORECAST PROBABILITIES
+ 0017 01 ENSEMBLE MEANS
+ 0018 01 ENSEMBLE STANDARD DEVIATIONS
+ 0019 01 FORECAST ACCUMULATIONS
+ 0020 01 CLIMATOLOGY
+ 0021 01 CLIMATE SIMULATION
+ 0030 01 OBSERVATIONS
+ 0031 01 QUALITY CONTROL
+ 0032 01 DIFFERENCE STATISTICS
+ 0040 01 IMAGE DATA
+ 0050 01 SENSITIVITY GRADIENTS
+ 0051 01 TRAJECTORY FORECAST
+ 0052 01 SENSITIVITY FORECAST
+ 0060 01 PERTURBED ANALYSIS
+ 0061 01 PERTURBATION
+ 0062 01 SINGULAR VECTOR
+ 0127 01 MISSING VALUE
+010063 0010 0000 02 INCREASING, THEN DECREASING: ATMOSPHERIC PRESURE THE SAME OR
+ HIGHER THAN 3 HOURS AGO (OR 24 HOURS AGO )
+ 0001 01 INCREASING, THEN STEADY; OR INCREASING; THEN MORE SLOWLY
+ 0002 01 INCREASING (STEADILY OR UNSTEADILY )
+ 0003 01 DECREASING OR STEADY, THEN INCREASING; RAPIDLY
+ 0004 02 STEADY; ATMOSPHERIC PRESSURE THE SAME AS 3 HOURS AGO (OR 24
+ HOURS)
+ 0005 02 DECREASING; THEN INCREASING; ATMOSPHERIC PRESSURE THE SAME O
+ R LOWER THAN 3 HOURS AGO
+ 0006 02 DECREASING, THEN STEADY; OR DECREASING, DECREASING MORE SLOW
+ LY
+ 0007 01 DECREASING (STEADILY OR UNSTEADELY )
+ 0008 02 STEADY OR INCREASING, THEN DECREASING; OR DECREASING, THEN
+ DECREASING MORE RAPIDLY
+ 0015 01 MISSING
+010064 0004 0000 01 SUBSONIC
+ 0001 01 TRANSONIC
+ 0002 01 SUPERSONIC
+ 0007 01 MISSING VALUE
+011031 0009 0000 01 NIL IN CLOUD
+ 0001 01 SLIGHT IN CLOUD
+ 0002 01 MODERATE IN CLOUD
+ 0003 01 SEVERE IN CLOUD
+ 0004 01 NIL IN CLEAR AIR
+ 0005 01 SLIGHT IN CLEAR AIR
+ 0006 01 MODERATE IN CLEAR AIR
+ 0007 01 SEVERE IN CLEAR AIR
+ 0015 01 MISSING VALUE
+011037 0030 0000 01 AVE <0.1 PEAK <0.1
+ 0001 01 AVE <0.1 0.1 <= PEAK <0.2
+ 0002 01 0.1 <= AVE <0.2 0.1 <= PEAK <0.2
+ 0003 01 AVE <0.1 0.2 <= PEAK <0.3
+ 0004 01 0.1 <= AVE <0.2 0.2 <= PEAK <0.3
+ 0005 01 0.2 <= AVE <0.3 0.2 <= PEAK <0.3
+ 0006 01 AVE <0.1 0.3 <= PEAK <0.4
+ 0007 01 0.1 <= AVE <0.2 0.3 <= PEAK <0.4
+ 0008 01 0.2 <= AVE <0.3 0.3 <= PEAK <0.4
+ 0009 01 0.3 <= AVE <0.4 0.3 <= PEAK <0.4
+ 0010 01 AVE <0.1 0.4 <= PEAK <0.5
+ 0011 01 0.1 <= AVE <0.2 0.4 <= PEAK <0.5
+ 0012 01 0.2 <= AVE <0.3 0.4 <= PEAK <0.5
+ 0013 01 0.3 <= AVE <0.4 0.4 <= PEAK <0.5
+ 0014 01 0.4 <= AVE <0.5 0.4 <= PEAK <0.5
+ 0015 01 AVE <0.1 0.5 <= PEAK <0.8
+ 0016 01 0.1 <= AVE <0.2 0.5 <= PEAK <0.8
+ 0017 01 0.2 <= AVE <0.3 0.5 <= PEAK <0.8
+ 0018 01 0.3 <= AVE <0.4 0.5 <= PEAK <0.8
+ 0019 01 0.4 <= AVE <0.5 0.5 <= PEAK <0.8
+ 0020 01 0.5 <= AVE <0.8 0.5 <= PEAK <0.8
+ 0021 01 AVE <0.1 0.8 <= PEAK
+ 0022 01 0.1 <= AVE <0.2 0.8 <= PEAK
+ 0023 01 0.2 <= AVE <0.3 0.8 <= PEAK
+ 0024 01 0.3 <= AVE <0.4 0.8 <= PEAK
+ 0025 01 0.4 <= AVE <0.5 0.8 <= PEAK
+ 0026 01 0.5 <= AVE <0.8 0.8 <= PEAK
+ 0027 01 0.8 <= AVE 0.8 <= PEAK
+ 0028 01 NIL NIL
+ 0063 01 MISSING VALUE
+011038 0017 0000 01 MIN < 1
+ 0001 01 1 <= MIN < 2
+ 0002 01 2 <= MIN < 3
+ 0003 01 3 <= MIN < 4
+ 0004 01 4 <= MIN < 5
+ 0005 01 5 <= MIN < 6
+ 0006 01 6 <= MIN < 7
+ 0007 01 7 <= MIN < 8
+ 0008 01 8 <= MIN < 9
+ 0009 01 9 <= MIN < 10
+ 0010 01 10 <= MIN < 11
+ 0011 01 11 <= MIN < 12
+ 0012 01 12 <= MIN < 13
+ 0013 01 13 <= MIN < 14
+ 0014 01 14 <= MIN < 15
+ 0015 01 NO TIMING INFORMATION AVAILABLE
+ 0031 01 MISSING VALUE
+011039 0016 0000 01 1 <= MIN < 2
+ 0001 01 2 <= MIN < 3
+ 0002 01 3 <= MIN < 4
+ 0004 01 4 <= MIN < 5
+ 0005 01 5 <= MIN < 6
+ 0006 01 6 <= MIN < 7
+ 0007 01 7 <= MIN < 8
+ 0008 01 8 <= MIN < 9
+ 0009 01 9 <= MIN < 10
+ 0010 01 10 <= MIN < 11
+ 0011 01 11 <= MIN < 12
+ 0012 01 12 <= MIN < 13
+ 0013 01 13 <= MIN < 14
+ 0014 01 14 <= MIN < 15
+ 0060 01 NO TIMING INFORMATION AVAILABLE
+ 0063 01 MISSING VALUE
+013038 0004 0000 01 NOT SUPERADIABATIC
+ 0001 01 SUPERADIABATIC
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+013039 0003 0000 01 SEA ICE
+ 0001 01 SNOW ON LAND
+ 0007 01 MISSING VALUE
+013040 0009 0000 01 LAND
+ 0001 01 RESERVED
+ 0002 01 NEAR COAST
+ 0003 01 ICE
+ 0004 01 POSSIBLE ICE
+ 0005 01 OCEAN
+ 0006 01 COAST
+ 0007 01 DESERT
+ 0015 01 MISSING VALUE
+013041 0010 0001 01 A
+ 0002 01 A-B
+ 0003 01 B
+ 0004 01 B-C
+ 0005 01 C
+ 0006 01 D
+ 0007 01 E
+ 0008 01 F
+ 0009 01 G
+ 0015 01 MISSING VALUE
+013051 0008 0000 01 SMALLER THAN ANY VALUE IN THE 30 YEARS PERIOD
+ 0001 01 IN THE FIRST QUINTILE
+ 0002 01 IN THE SECOND QUINTILE
+ 0003 01 IN THE THIRD QUINTILE
+ 0004 01 IN THE FOURTH QUINTILE
+ 0005 01 IN THE FIFTH QUINTILE
+ 0006 01 GREATER THAN ANY VALUE IN THE 30 YEAR PERIOD
+ 0015 01 MISSING VALUE
+013056 0010 0000 01 NO PRECIPITATION
+ 0001 01 LIGHT INTERMITTENT
+ 0002 01 MODERATE INTERMITTENT
+ 0003 01 HEAVY INTERMITTENT
+ 0004 01 VERY HEAVY INTERMITTENT
+ 0005 01 LIGHT CONTINUOUS
+ 0006 01 MODERATE CONTINUOUS
+ 0007 01 VERY HEAVY CONTINUOUS
+ 0009 01 VARIABLE-ALTERNATIVELY LIGHT AND HEAVY
+ 0015 01 MISSING VALUE
+013057 0011 0000 01 NO PRECIPITATION
+ 0001 01 WITHIN THE LAST HOUR
+ 0002 01 1 TO 2 HOURS AGO
+ 0003 01 2 TO 3 HOURS AGO
+ 0004 01 3 TO 4 HOURS AGO
+ 0005 01 4 TO 5 HOURS AGO
+ 0006 01 5 TO 6 HOURS AGO
+ 0007 01 6 TO 8 HOURS AGO
+ 0008 01 8 TO 10 HOURS AGO
+ 0009 01 MORE THAN 10 HOURS AHO
+ 0015 01 MISSING VALUE
+013202 0007 0000 01 LAND
+ 0001 01 VEGETATION
+ 0003 01 MULTI-YEAR ICE
+ 0004 01 POSSIBLE ICE OR FIRST YEAR ICE
+ 0005 01 OCEAN
+ 0006 01 COASTLINE
+ 0015 01 MISSING
+015025 0000 0000 01 OZONE
+ 0015 01 MISSING VALUE
+019001 0007 0000 01 DEPRESSION OR LOW (EXTRATROPICAL)
+ 0001 01 TROPICAL DEPRESSION
+ 0002 01 TROPICAL STORM
+ 0003 01 SEVERE TROPICAL STORM
+ 0004 01 TYPHOON
+ 0010 01 DUST/SANDSTORM
+ 0063 01 MISSING VALUE
+019008 0005 0000 01 RESERVED
+ 0001 01 SHALLOW (TOP OF CIRCULATION BELOW 700-HPA LEVEL
+ 0002 01 MEDIUM(TOP BETWEEN 700-HPA AND 400-HPA)
+ 0003 01 DEEP(TOP ABOVE 400-HPA LEVEL
+ 0007 01 MISSING VALUE
+019010 0004 0000 01 RESERVED
+ 0001 01 MINIMUM VALUE OF SEA LEVEL PRESSURE
+ 0002 01 MAXIMUM VALUE OF 850 HPA RELATIVE VORTICITY
+ 0015 01 MISSING VALUE
+020003 0250 0000 01 CLOUD DEVELOPMENT NOT OBSERVED OR NOT OBSERVABLE
+ 0001 01 CLOUDS GENERALLY DISSOLVING OR BECOMING LESS DEVELOPED
+ 0002 01 STATE OF SKY ON THE WHOLE UNCHANGED
+ 0003 01 CLOUDS GENERALLY FORMING OR DEVELOPING
+ 0004 02 VISIBILITY REDUCED BY SMOKE, E.G. VELDT OR FOREST FIRES, IN
+ DUSTRIAL SMOKE OR VOLCANIC ASHES
+ 0005 01 HAZE
+ 0006 02 WIDESPREAD DUST IN SUSPENSION IN THE AIR, NOT RAISED BY WIND
+ AT OR NEAR THE STATION AT THE TIME OF OBSERVATION
+ 0007 04 DUST OR SEND RAISED BY WIND AT OR NEAR THE STATION AT THE TI
+ ME OF OBSERVATION, BUT NO WELL-DEVELOPED DUST WHRIL(S) OR SA
+ ND WHRIL(S), AND NO DUSTSTORM OR SANDSTORM SEEN; OR, IN THE
+ CASE OF SHIPS, BLOWING SPRAY AT THE STATION
+ 0008 03 WELL-DEVELOPED DUST WHRIL(S) OR SAND WHRILS SEEN AT OR NEAR
+ THE STATION DURING THE PRECEDING HOUR OR AT THE SAME TIME OF
+ OBSERVATION, BUT NO DUSTSTORM OR SANDSTORM
+ 0009 02 DUSTSTORM OR SANDSTORM WITHIN SIGHT AT THE TIME OF OBSERVATI
+ ON, OR AT THE STATION DURING THE PRECEDING HOR
+ 0010 01 MIST
+ 0011 02 PACHES SHALLOW FOG OR ICE AT THE STATION, WHETHER ON LAND OR
+ SEA, NOT DEEPER THAN 2 METRES ON LAND OR 10 METRES AT SEA
+ 0012 03 MORE OR LESS CONTINUOUS SHALLOW FOG OR ICE AT THE STATION,
+ WHETHER ON LAND OR SEA, NOT DEEPER THAN 2 METRES ON LAND OR
+ 10 METRES AT SEA
+ 0013 01 LIGHTNING VISIBLE, NO THUNDER HEARD
+ 0014 02 PRECIPITATION WITHIN SIGHT, NOT REACHING THE GROUND OR THE
+ SURFACE OF THE SEA
+ 0015 03 PRECIPITATION WITHIN SIGHT, REACHING THE GROUND OR THE SURFA
+ CE OF THE SEA, BUT DISTANT, I.E. ESTIMATED TO BE MORE THAN
+ 5 KM FROM THE STATION
+ 0016 02 PRECIPITATION WITHIN SIGHT, REACHING THE GROUND OR THE SURFA
+ CE OF THE SEA, NEAR TO, BUT NOT AT THE STATION
+ 0017 02 THUNDERSTORM, BUT NO PRECIPITATION AT THE TIME OF OBSERVATIO
+ N
+ 0018 02 SQUALLS AT OR WITHIN SIGHT OF THE STATION DURING THE PRECEDI
+ NG HOUR OR AT THE TIME OF OBSERVATION
+ 0019 02 FUNNEL CLOUD(S) AT OR WITHIN SIGHT OF THE STATION DURING THE
+ PRECEDING HOUR OR AT THE TIME OF OBSERVATION
+ 0020 03 DRIZZEL (NOT FREEZING) OR SNOW GRAINS NOT FALLING AS SHOWERS
+ ; DURING THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVAT
+ IONS
+ 0021 02 RAIN (NOT FREEZING) NOT FALLING AS SHOWER(S); DURING THE PRE
+ ECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0022 02 SNOW NOT FALLING AS SHOWER(S); DURING THE PRECEDING HOUR BUT
+ NOT AT THE TIME OF OBSERVATION
+ 0023 02 RAIN AND SNOW OR ICE PELLETS NOT FALLING AS SHOWER(S); DURIN
+ G THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0024 02 FREEZING DRIZZEL OR FREEZING RAIN NOT FALLING AS SHOWER(S);
+ DURING THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0025 02 SHOWER(S) OF RAIN; DURING THE PRECEDING HOUR BUT NOT AT THE
+ TIME OF OBSERVATION
+ 0026 02 SHOWER(S) OF SNOW, OR OF RAIN AND SNOW; DURING THE PRECEDING
+ HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0027 02 SHOWER(S) OF HAIL, OR OF RAIN AND HAIL; DURING THE PRECEDING
+ HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0028 02 FOG OR ICE FOG; DURING THE PRECEDING HOUR BUT NOT AT THE TIM
+ E OF OBSERVATION
+ 0029 02 THUNDERSTORM (WITH OR WITHOUT PRECIPITATION); DURING THE PRE
+ CEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0030 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM HAS DECREASED DURI
+ NG THE PRECEDING HOURS
+ 0031 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM NO APPRECIABLE CHA
+ NGE DURING THE PRECEDING HOUR
+ 0032 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM HAS BEGUN OR HAS I
+ NCEASED DURING THE PRECEDING HOUR
+ 0033 02 SEVERE DUSTSTORM OR SANDSTORM HAS DECREASED DURING THE PREC
+ EDING HOURS
+ 0034 02 SEVERE DUSTSTORM OR SANDSTORM NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0035 02 SEVERE DUSTSTORM OR SANDSTORM HAS BEGUN OR HAS INCREASED DUR
+ ING THE PRECEDING HOUR
+ 0036 02 SLIGHT OR MODERATE DRIFTING SNOW GENERALLY LOW (BELOW EYE LE
+ VEL)
+ 0037 01 HEAVY DRIFTING SNOW GENERALY LOW (BELOW EYE LEVEL)
+ 0038 02 SLIGHT OR MODERATE BLOWING SNOW GENERALLY HIGH (ABOVE EYE LE
+ VEL)
+ 0039 01 HEAVY BLOWING SNOW GENERALY HIGH (ABOVE EYE LEVEL)
+ 0040 03 FOG OR ICE FOG AT A DISTANCE AT THE TIME OF OBSERVATION, BUT
+ NOT AT THE STATION DURING THE PRECEDING HOUR, THE FOG OR IC
+ E FOG EXTENDING TO A LEVEL ABOVE THAT OF THE OBSERVER
+ 0041 01 FOG OR ICE FOG IN PATCHES
+ 0042 02 FOG OR ICE FOG, SKY VISIBLE,HAS BECOME THINNER DURING THE PR
+ ECEDING HOUR
+ 0043 02 FOG OR ICE FOG, SKY INVISIBLE,HAS BECOME THINNER DURING THE
+ PRECEDING HOUR
+ 0044 02 FOG OR ICE FOG, SKY VISIBLE,NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0045 02 FOG OR ICE FOG, SKY INVISIBLE,NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0046 02 FOG OR ICE FOG, SKY VISIBLE,HAS BEGUN OR HAS BECOME THICKE
+ R DURING THE PRECEDING HOUR
+ 0047 02 FOG OR ICE FOG, SKY INVISIBLE,HAS BEGUN OR HAS BECOME THICKE
+ R DURING THE PRECEDING HOUR
+ 0048 01 FOG, DEPOSITING RIME, SKY VISIBLE
+ 0049 01 FOG, DEPOSITING RIME, SKY INVISIBLE
+ 0050 02 DRIZZLE, NOT FREEZING, INTERMITTENT;SLIGHT AT TIME OF OBSERV
+ ATION
+ 0051 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;SLIGHT AT TIME OF OBSERV
+ ATION
+ 0052 02 DRIZZLE, NOT FREEZING, INTERMITTENT;MODERATE AT TIME OF OBSE
+ RVATION
+ 0053 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;MODERATE AT TIME OF OBSE
+ RVATION
+ 0054 02 DRIZZLE, NOT FREEZING, INTERMITTENT;HEAVY (DENSE) AT THE TIM
+ E OF OBSERVATION
+ 0055 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;HEAVY (DENSE) AT THE TIM
+ E OF OBSERVATION
+ 0056 01 DRIZZLE, FREEZING, SLIGHT
+ 0057 01 DRIZZLE, FREEZING, MODERATE OR HEAVY (DENSE)
+ 0058 01 DRIZZLE AND RAIN, SLIGHT
+ 0059 01 DRIZZLE AND RAIN, MODERATE OR HEAVY
+ 0060 01 RAIN,NOT FREEZING,INTERMITTENT;SLIGHT AT TIME OF OBSERVATION
+ 0061 01 RAIN,NOT FREEZING,CONTINUOUS ;SLIGHT AT TIME OF OBSERVATION
+ 0062 02 RAIN,NOT FREEZING,INTERMITTENT;MODERATE AT TIME OF OBSERVATI
+ ON
+ 0063 02 RAIN,NOT FREEZING,CONTINUOUS ;MODERATE AT TIME OF OBSERVATI
+ ON
+ 0064 02 RAIN, NOT FREEZING, INTERMITTENT;HEAVY AT TIME OF OBSERVATIO
+ ON
+ 0065 01 RAIN, NOT FREEZING, CONTINUOUS;HEAVY AT TIME OF OBSERVATION
+ 0066 01 RAIN, FREEZING, SLIGHT
+ 0067 01 RAIN, FREEZING, MODERATE OR HEAVY
+ 0068 01 RAIN OR DRIZZLE AND SNOW, LIGHT
+ 0069 01 RAIN OR DRIZZLE AND SNOW, MODERATE OR HEAVY
+ 0070 02 INTERMITTENT FALL OF SNOWFLAKES, SLIGHT AT TIME OF OBSERVATI
+ ON
+ 0071 02 CONTINUOUS FALL OF SNOWFLAKES, SLIGHT AT TIME OF OBSERVATI
+ ON
+ 0072 02 INTERMITTENT FALL OF SNOWFLAKES, MODERATE AT TIME OF OBSERVA
+ TION
+ 0073 02 CONTINUOUS FALL OF SNOWFLAKES, MODERATE AT TIME OF OBSERVA
+ TION
+ 0074 02 INTERMITTENT FALL OF SNOWFLAKES, HEAVY AT TIME OF OBSERVATIO
+ ONS
+ 0075 02 CONTINUOUS FALL OF SNOWFLAKES, HEAVY AT TIME OF OBSERVATIO
+ ONS
+ 0076 01 DIAMOND DUST (WITH OR WITHOUT FOG)
+ 0077 01 SNOW GRAINS (WITH OR WITHOUT FOG)
+ 0078 01 ISOLATED STAR-LIKE SNOW CRYSTALS (WITH OR WITHOUT FOG)
+ 0079 01 ICE PELLETS
+ 0080 01 RAIN SHOWER(S), SLIGHT
+ 0081 01 RAIN SHOWER(S), MODERATE OR HEAVY
+ 0082 01 RAIN SHOWER(S), VIOLENT
+ 0083 01 SHOWER(S) OF RAIN AND SNOW MIXED, SLIGHT
+ 0084 01 SHOWER(S) OF RAIN AND SNOW MIXED, MODERATE OR HEAVY
+ 0085 01 SNOW SHOWER(S), SLIGHT
+ 0086 01 SNOW SHOWER(S), MODERATE OR HEAVY
+ 0087 02 SHOWER(S) OF SNOW PELLETS OR SMALL HAIL, WITH OR WITHOUT RAI
+ N OR RAIN AND SNOW MIXED, SLIGHT
+ 0088 02 SHOWER(S) OF SNOW PELLETS OR SMALL HAIL, WITH OR WITHOUT RAI
+ N OR RAIN AND SNOW MIXED, MODERATE OR HEAVY
+ 0089 02 SHOWER(S) OF HAIL, WITH OR WITHOUT RAIN OR RAIN AND SNOW MIX
+ ED, NOT ASSOCIATED WITH THUNDER, SLIGHT
+ 0090 02 SHOWER(S) OF HAIL, WITH OR WITHOUT RAIN OR RAIN AND SNOW MIX
+ ED, NOT ASSOCIATED WITH THUNDER, MODERATE OR HEAVY
+ 0091 02 SLIGHT RAIN AT TIME OF OBSERVATION, THUNDERSTORM DURING THE
+ PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0092 02 MODERATE OR HEAVY RAIN AT TIME OF OBSERVATION, THUNDERSTORM
+ DURING THE PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0093 03 SLIGHT SNOW, OR RAIN AND SNOW MIXED OR HAIL AT TIME OF OBSER
+ VATION, THUNDERSTORM DURING THE PRECEDING HOUR BUT NOT AT TI
+ ME OF OBSERVATION
+ 0094 03 MODERATE OR HEAVY SNOW, OR RAIN AND SNOW MIXED OR HAIL AT TI
+ ME OF OBSERVATION, THUNDERSTORM DURING PRECEDING HOUR BUT NO
+ T AT TIME OF OBSERVATION
+ 0095 03 THUNDERSTORM, SLIGHT OR MODERATE, WITHOUT HAIL, BUT WITH RAI
+ N AND/OR SNOW AT TIME OF OBSERVATION, THUNDERSTORM DURING TH
+ E PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0096 02 THUNDERSTORM, SLIGHT OR MODERATE,WITH HAIL AT TIME OF OBSERV
+ ATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0097 02 THUNDERSTORM, HEAVY, WITHOUT HAIL BUT WITH RAIN AND/OR SNOW
+ AT TIME OF OBSERVATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0098 02 THUNDERSTORM COMBINED WITH DUSTSTORM OR SANDSTORM AT TIME OF
+ OBSERVATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0099 02 THUNDERSTORM, HEAVY, WITH HAIL AT TIME OF OBSERVATION, THUND
+ ERSTORM AT TIME OF OBSERVATION
+ 0100 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0101 02 CLOUDS GENERALLY DISSOLVING OR BECOMING LESS DEVELOPED DURIN
+ G THE PAST HOUR
+ 0102 01 STATE OF SKY ON THE WHOLE UNCHANGED DURING THE PAST HOUR
+ 0103 01 CLOUDS GENERALLY FORMING OR DEVELOPING DURING THE PAST HOUR
+ 0104 02 HAZE OR SMOKE, OR DUST IN SUSPENSION IN THE AIR, VISIBILITY
+ EQUAL TO, OR GREATER THAN 1KM
+ 0105 02 HAZE OR SMOKE, OR DUST IN SUSPENSION IN THE AIR, VISIBILITY
+ LESS THAN 1KM
+ 0110 01 MIST
+ 0111 01 DIAMOND DUST
+ 0112 01 DISTANT LIGHTING
+ 0118 01 SQUALLS
+ 0120 01 FOG
+ 0121 01 PRECIPITATION
+ 0122 01 DRIZZLE (NOT FREEZING) OR SNOW GRAINS
+ 0123 01 RAIN (NOT FREEZING)
+ 0124 01 SNOW
+ 0125 01 FREEZING DRIZZLE OR FREEZING RAIN
+ 0126 01 THUNDERSTORM (WITH OR WITHOUT PRECIPITATION)
+ 0127 01 BLOWING OR DRIFTING SNOW OR SAND
+ 0128 02 BLOWING OR DRIFTING SNOW OR SAND, VISIBILITY EQUAL TO, OR GR
+ ATER THAN, 1KM
+ 0129 01 BLOWING OR DRIFTING SNOW OR SAND, VISIBILITY LESS THAN 1 KM
+ 0130 01 FOG
+ 0131 01 FOG OR ICE FOG, IN PATCHES
+ 0132 01 FOG OR ICE FOG, HAS BECOME THINNER DURING PAST HOUR
+ 0133 01 FOG OR ICE FOG, NO APPRECIABLE CHANGE DURING PAST HOUR
+ 0134 01 FOG OR ICE FOG, HAS BECUNOR BECOME THICKER DURING PAST HOUR
+ 0135 01 FOG, DEPOSITION RIME
+ 0140 01 PRECIPITATION
+ 0141 01 PRECIPITATION SLIGHT OR MODERATE
+ 0142 01 PRECIPITATION, HEAVY
+ 0143 01 LIQUID PRECIPITATION, SLIGHT OR MODERATE
+ 0144 01 LIQUID PRECIPITATION, HEAVY
+ 0145 01 SOLID PRECIPITATION, SLIGHT OR MODERATE
+ 0146 01 SOLID PRECIPITATION, HEAVY
+ 0147 01 FREEZING PRECIPITATION, SLIGHT OR MODERATE
+ 0148 01 FREEZING PRECIPITATION, HEAVY
+ 0150 01 DRIZZLE
+ 0151 01 DRIZZLE, NOT FREEZING, SLIGHT
+ 0152 01 DRIZZLE, NOT FREEZING, MODERATE
+ 0153 01 DRIZZLE, NOT FREEZING, HEAVY
+ 0154 01 DRIZZLE, FREEZING, SLIGHT
+ 0155 01 DRIZZLE, FREEZING, MODERATE
+ 0156 01 DRIZZLE, FREEZING, HEAVY
+ 0157 01 DRIZZLE AND RAIN, SLIGHT
+ 0158 01 DRIZZLE AND RAIN, MODERATE OR HEAVY
+ 0160 01 RAIN
+ 0161 01 RAIN, NOT FREEZING, SLIGHT
+ 0162 01 RAIN, NOT FREEZING, MODERATE
+ 0163 01 RAIN, NOT FREEZING, HEAVY
+ 0164 01 RAIN, FREEZING, SLIGHT
+ 0165 01 RAIN, FREEZING, MODERATE
+ 0166 01 RAIN, FREEZING, HEAVY
+ 0167 01 RAIN (OR DRIZZLE) AND SNOW, SLIGHT
+ 0168 01 RAIN (OR DRIZZLE) AND SNOW, MODERATE AND HEAVY
+ 0170 01 SNOW
+ 0171 01 SNOW, SLIGHT
+ 0172 01 SNOW, MODERATE
+ 0173 01 SNOW, HEAVY
+ 0174 01 ICE PELLETS, SLIGHT
+ 0175 01 ICE PELLETS, MODERATE
+ 0176 01 ICE PELLETS, HEAVY
+ 0180 01 SHOWER(S) OR INTERMITTENT PRECIPITATION
+ 0181 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, SLIGHT
+ 0182 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, MODERATE
+ 0183 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, HEAVY
+ 0184 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, VIOLENT
+ 0185 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, SLIGHT
+ 0186 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, MODERATE
+ 0187 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, HEAVY
+ 0190 01 THUNDERSTORM
+ 0191 01 THUNDERSTORM, SLIGHT OR MODERATE, WITH NO PRECIPITATION
+ 0192 02 THUNDERSTORM, SLIGHT OR MODERATE, WITH RAIN SHOWERS AND/OR S
+ NOW SHOWERS
+ 0193 01 THUNDERSTORM, SLIGHT OR MODERATE, WITH HAIL
+ 0194 01 THUNDERSTORM, HEAVY, WITH NO PRECIPITATION
+ 0195 01 THUNDERSTORM, HEAVY, WITH RAIN SHOWERS AND/OR SNOW SHOWERS
+ 0196 01 THUNDERSTORM, HEAVY, WITH HAIL
+ 0204 01 VOLCANIC ASH SUSPENDED IN THE AIR ALOFT
+ 0206 01 THICK DUST HAZE, VISIBILITY LESS THAN 1 KM
+ 0207 01 BLOWING SPRAY AT THE STATION
+ 0208 01 DRIFTING DUST (SAND)
+ 0209 01 WALL OF DUST OR SAND IN DISTANCE (LIKE HABOOB)
+ 0210 01 SNOW HAZE
+ 0211 01 WHITEOUT
+ 0213 01 LIGHTING, CLOUD TO SURFACE
+ 0217 01 DRY THUNDERSTORM
+ 0219 02 TORNADO CLOUD (DESTRUCTIVE AT OR WITHIN SIGHT OF THE STATION
+ DURING PRECEDING HOUR OR AT THE TIME OF OBSERVATION
+ 0220 01 DEPOSITION OF VOLCANIC ASH
+ 0221 01 DEPOSITION OF DUST OR SAND
+ 0222 01 DEPOSITION OF DEW
+ 0223 01 DEPOSITION OF WET SNOW
+ 0224 01 DEPOSITION OF SOFT RIME
+ 0225 01 DEPOSITION OF HARD RIME
+ 0226 01 DEPOSITION OF HOAR FROST
+ 0227 01 DEPOSITION OF GLAZE
+ 0228 01 DEPOSITION OF ICE CRUST (ICE SLICK)
+ 0230 01 DUSTSTORM OR SANDSTORM WITH TEMPERATURE BELOW 0 C DEGREES
+ 0239 02 BLOWING SNOW, IMPOSSIBLE TO DETERMINE WHETHER SNOW IS FALLIN
+ G OR NOT
+ 0241 01 FOG ON SEA
+ 0242 01 FOG IN VALLEYS
+ 0243 01 ARCTIC OR ANTARCTIC SEA SMOKE
+ 0244 01 STEAM FOG (SEA,LAKE OR RIVER)
+ 0245 01 STEAM FOG (LAND)
+ 0246 01 FOG OVER ICE OR SNOW COVER
+ 0247 01 DENCE FOG VISIBILITY 60-90 M
+ 0248 01 DENCE FOG VISIBILITY 30-60 M
+ 0249 01 DENCE FOG VISIBILITY LESS THAN 30 M
+ 0250 01 DRIZZLE, RATE OF FALL LESS THAN 0.10 MM/H
+ 0251 01 DRIZZLE, RATE OF FALL 0.10 - .19 MM/H
+ 0252 01 DRIZZLE, RATE OF FALL 0.20 - .39 MM/H
+ 0253 01 DRIZZLE, RATE OF FALL 0.40 - .79 MM/H
+ 0254 01 DRIZZLE, RATE OF FALL 0.80 - 1.59 MM/H
+ 0255 01 DRIZZLE, RATE OF FALL 1.60 - 3.19 MM/H
+ 0256 01 DRIZZLE, RATE OF FALL 3.20 - 6.39 MM/H
+ 0257 01 DRIZZLE, RATE OF FALL 6.40 MM/H OR MORE
+ 0259 01 DRIZZLE AND SNOW
+ 0260 01 RAIN, RATE OF FALL LESS THAN 1.0 MM/H
+ 0261 01 RAIN, RATE OF FALL 1.0 - 1.9 MM/H
+ 0262 01 RAIN, RATE OF FALL 2.0 - 3.9 MM/H
+ 0263 01 RAIN, RATE OF FALL 4.0 - 7.9 MM/H
+ 0264 01 RAIN, RATE OF FALL 8.0 - 15.9 MM/H
+ 0265 01 RAIN, RATE OF FALL 16.0 - 31.9 MM/H
+ 0266 01 RAIN, RATE OF FALL 32.0 - 63.9 MM/H
+ 0267 01 RAIN, RATE OF FALL 64.0 MM/H OR MORE
+ 0270 01 SNOW, RATE OF FALL LESS THAN 1.0 CM/H
+ 0271 01 SNOW, RATE OF FALL 1.0 - 1.9 CM/H
+ 0272 01 SNOW, RATE OF FALL 2.0 - 3.9 CM/H
+ 0273 01 SNOW, RATE OF FALL 4.0 - 7.9 CM/H
+ 0274 01 SNOW, RATE OF FALL 8.0 - 15.9 CM/H
+ 0275 01 SNOW, RATE OF FALL 16.0 - 31.9 CM/H
+ 0276 01 SNOW, RATE OF FALL 32.0 - 63.9 CM/H
+ 0277 01 SNOW, RATE OF FALL 64.0 CM/H OR MORE
+ 0278 01 SNOW OR ICE CRISTAL PRECIPITATION FROM A CLEAR SKY
+ 0279 01 WET SNOW, FREEZING ON CONTACT
+ 0280 01 PRECIPITATION OF RAIN (WW= 87-99)
+ 0281 01 PRECIPITATION OF RAIN,FREEZING (WW= 80-82)
+ 0282 01 PRECIPITATION OF RAIN AND SNOW MIXED
+ 0283 01 PRECIPITATION OF SNOW
+ 0284 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL
+ 0285 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH RAIN
+ 0286 02 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH RAIN AND S
+ NOW MIXED
+ 0287 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH SNOW
+ 0288 01 PRECIPITATION OF HAIL
+ 0289 01 PRECIPITATION OF HAIL, WITH RAIN
+ 0290 01 PRECIPITATION OF HAIL, WITH RAIN AND SNOW MIXED
+ 0291 01 PRECIPITATION OF HAIL, WITH SNOW
+ 0292 01 SHOWER(S) OR THUNDERSTORM OVER SEA
+ 0293 01 SHOWER(S) OR THUNDERSTORM OVER MOUNTAINS
+ 0508 02 NO SIGNIFICANT PHENOMENA TO REPORT, PRESENT AND PAST WEATHER
+ OMITTED
+ 0509 02 NOT OBSERVED, NO DATA AVAILABLE, PRESENT AND PAST WEATHER OM
+ ITTED
+ 0510 01 PRESENT AND PAST WEATHER MISSING, BUT EXPECTED
+ 0511 01 MISSING VALUE
+020004 0021 0000 02 CLOUD COVERING 1/2 OR LESS OF THE SKY THROUGHOUT THE APPROPP
+ RIATE PERIOD
+ 0001 03 CLOUD COVERING MORE THAN 1/2 OF THE SKY DURING PART OF THE A
+ PPROPRIATE PERIOD AND COVERING 1/2 OR LESS DURING PART OF TH
+ E PERIOD
+ 0002 02 CLOUD COVERING MORE THAN 1/2 OF THE SKY THROUGHOUT THE APPRP
+ PRIATE PERIOD
+ 0003 01 SANSTORM, DUSTSTORM OR BLOWING SNOW
+ 0004 01 FOG OR ICE OR THICK HAZE
+ 0005 01 DRIZZLE
+ 0006 01 RAIN
+ 0007 01 SNOW, OR RAIN AND SNOW MIXED
+ 0008 01 SHOWER(S)
+ 0009 01 THUNDERSTORM(S) WITH OR WITHOUT PRECIPITATION
+ 0010 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0011 01 VISIBILITY REDUCED
+ 0012 01 BLOWING PHENOMENA, VISIBILITY REDUCED
+ 0013 01 FOG
+ 0014 01 PRECIPITATION
+ 0015 01 DRIZZLE
+ 0016 01 RAIN
+ 0017 01 SNOW OR ICE PELLETS
+ 0018 01 SHOWERS OR INTERMITTENT PRECIPITATION
+ 0019 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+020005 0021 0000 02 CLOUD COVERING 1/2 OR LESS OF THE SKY THROUGHOUT THE APPROPP
+ RIATE PERIOD
+ 0001 03 CLOUD COVERING MORE THAN 1/2 OF THE SKY DURING PART OF THE A
+ PPROPRIATE PERIOD AND COVERING 1/2 OR LESS DURING PART OF TH
+ E PERIOD
+ 0002 02 CLOUD COVERING MORE THAN 1/2 OF THE SKY THROUGHOUT THE APPRP
+ PRIATE PERIOD
+ 0003 01 SANSTORM, DUSTSTORM OR BLOWING SNOW
+ 0004 01 FOG OR ICE OR THICK HAZE
+ 0005 01 DRIZZLE
+ 0006 01 RAIN
+ 0007 01 SNOW, OR RAIN AND SNOW MIXED
+ 0008 01 SHOWER(S)
+ 0009 01 THUNDERSTORM(S) WITH OR WITHOUT PRECIPITATION
+ 0010 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0011 01 VISIBILITY REDUCED
+ 0012 01 BLOWING PHENOMENA, VISIBILITY REDUCED
+ 0013 01 FOG
+ 0014 01 PRECIPITATION
+ 0015 01 DRIZZLE
+ 0016 01 RAIN
+ 0017 01 SNOW OR ICE PELLETS
+ 0018 01 SHOWERS OR INTERMITTENT PRECIPITATION
+ 0019 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+020008 0019 0000 01 SKY CLEAR
+ 0001 01 FEW
+ 0002 01 SCATTERED
+ 0003 01 BROKEN
+ 0004 01 OVERCAST
+ 0005 01 RESERVED
+ 0006 01 SCATTERED/BROKEN (MANY FORECASTS USE SCATTERED/BROKEN
+ 0007 01 BROKEN/OVERCAST (BROKEN/OVERCAST FOLLOWED BY CLOUD TYPE(S))
+ 0008 01 ISOLATED (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE CB)
+ 0009 01 ISOLATED EMBEDDED (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE CB)
+ 0010 01 OCCASIONAL (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE CB)
+ 0011 01 OCCASIONAL EMBEDDED (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE CB)
+ 0012 01 FREQUENT (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE CB)
+ 0013 02 DENSE (USED ON AVIATION CHARTS TO DESCRIBE CLOUD THAT WOULD CAUSE
+ SUDDEN CHANGES IN VISIBILITY (LESS THAN 1000M))
+ 0014 01 LAYERS
+ 0015 01 OBSCURED (OBSC)
+ 0016 01 EMBEDDED (EMBD)
+ 0017 01 FREQUENT EMBEDDED
+ 0031 01 MISSING VALUE
+020009 0006 0000 01 RESERVED
+ 0001 01 NSC MIL SIGNIFICANT CLOUD
+ 0002 01 CAVOK
+ 0003 01 SKC SKY CLEAR
+ 0004 01 NSW NIL SIGNIFICANT WEATHER
+ 0015 01 MISSING VALUE
+020011 0011 0000 01 0 0
+ 0001 01 1 OKTA OR LESS, BUT NOT ZERO 1/10 OR LESS, BUT NOT ZERO
+ 0002 01 2 OKTAS 2/10 - 3/10
+ 0003 01 3 OKTAS 4/10
+ 0004 01 4 OKTAS 5/10
+ 0005 01 5 OKTAS 6/10
+ 0006 01 6 OKTAS 7/10 - 8/10
+ 0007 01 7 OKTAS OR MORE,BUT NOT 8 OKTAS9/10 OR MORE, BUT NOT 10/10
+ 0008 01 8 OKTAS 10/10
+ 0009 01 SKY OBSCURED BY FOG AND OR OTHER METEOROLOGICAL PHENOMENA
+ 0015 02 CLOUD COVE IS INDISCERNIBLE FOR REASONS OTHER THAN FOG OR OT
+ HER METEOROLOGICAL PHENOMENA, OR OBSERVATION IS NOT MADE
+020012 0045 0000 01 CIRRUS (CI)...............CI
+ 0001 01 CIRROCUMULUS (CC).........CC
+ 0002 01 CIRROSTRATUS (CS).........CS
+ 0003 01 ALTOCUMULUS (AC).........AC
+ 0004 01 ALTOSTRATUS (AS).........AS
+ 0005 01 NIMBOSTRATUS (NS).........NS
+ 0006 01 STRATOCUMULUS(SC).........SC
+ 0007 01 STRATUS (ST).........ST
+ 0008 01 CUMULUS (CU).........CU
+ 0009 01 CUMULONIMBUS (CB).........CB
+ 0010 01 NO CH CLOUDS
+ 0011 02 CIRRUS FIBRATUS, SOMETIMES UNCINUS, NOT PROGRESSIVELY INADIN
+ G THE SKY
+ 0012 04 CIRRUS SPISSATUS, IN PATCHES OR ENTANGLED SHEAVES, WHICH USU
+ ALLY DO NOT INCREASE AND SOMETIMES SEEM TO BE THE REMAINS OF
+ THE UPPER PART OF A CUMULONIMBUS; OR CIRRUS CASTELLANUS OR
+ FLOCCUS
+ 0013 01 CIRRUS SPISSATUS CUMULONIMBOGENITUS
+ 0014 02 CIRRUS UNCINUS OR FIBRATUS,OR BOTH, PROGRESSIVELY INVADING T
+ HE SKY ; THEY GENERALLY THICKEN AS A WHOLE
+ 0015 04 CIRRUS (OFTEN IN BANDS) AND CIRROSTRATUS, OR CIRROSTRATUS AL
+ ONE, PROGRESSIVELY INVADING THE SKY; THEY GENERALLY THICKEN
+ ASA WHOLE, BUT THE CONTINUOUS VEIL DOES NOT REACH 45 DEGREES
+ ABOVE THE HORIZON
+ 0016 05 CIRRUS (OFTEN IN BANDS) AND CIRROSTRATUS, OR CIRROSTRATUS AL
+ ONE, PROGRESSIVELY INVADING THE SKY; THEY GENERALLY THICKEN
+ ASA WHOLE, BUT THE CONTINUOUS VEIL EXTENDS MORE THAN 45 DEGR
+ REES ABOVE THE HORIZON, WITHOUT THE SKY BEING TOTALLY COVERE
+ D
+ 0017 01 CIRROSTRATUS COVERING THE WHOLE SKY
+ 0018 02 CIRROSTRATUS NOT PROGRESSIVELY INVADING THE SKY AND NOT ENTI
+ RELY COVERING IT
+ 0019 02 CIRROCUMULUS ALONE, OR CIRROCUMULUS PREDOMINANT AMONG THE CH
+ CLOUDS
+ 0020 01 NO CM CLOUDS
+ 0021 01 ALTOSTRATUS TRANSLUCIDUS
+ 0022 01 ALTOSTRATUS OPACUS OR NIMBOSTRATUS
+ 0023 01 ALTOCUMULUS TRANSLUCIDUS AT A SINGLE LEVEL
+ 0024 02 PATCHES (OFTEN LENTICULARIS) OF ALTOCUMULUS TRANSLUCIDUS, CO
+ NTINUALLY CHANGING AND OCCURING AT ONE OR MORE LEVELS
+ 0025 04 ALTOCUMULUS TRANSLUCIDUS IN BANDS, OR ONE OR MORE LAYERS OF
+ ALTOCUMULUS TRANSLUCIDUS OR OPACUS, PROGRESSIVELY INVADING T
+ HE SKY; THESE ALTOCUMULUS CLOUDS GENERALLY THICKEN AS A WHOL
+ E
+ 0026 01 ALTOCUMULUS CUMULOGENITUS (OR CUMULONIMBOGENITUS)
+ 0027 04 ALTOCUMULUS TRANSLUCIDUS OR OPACUS IN TWO OR MORE LAYERS, OR
+ ALTOCUMULUS OPACUS IN A SINGLE LAYER, NOT PROGRESSIVELY INV
+ ADING THE SKY, OR ALTOCUMULUS WITH ALTOSTRATUS OR NIMBOSTRAT
+ US
+ 0028 01 ALTOCUMULUS CASTELLANUS OR FLOCUS
+ 0029 01 ALTOCUMULUS OF CHAOTIC SKY, GENERALLY AT SEVERAL LEVELS
+ 0030 01 NO CL CLOUDS
+ 0031 02 CUMULUS HUMILIS OR CUMULUS FRACTUS OTHER THAN OF BAD WEATHER
+ , OR BOTH
+ 0032 03 CUMULUS MEDIOCRIS OR CONGESTUS, WITH OR WITHOUT CUMULUS OF S
+ PECIES FRACTUS OR HUMULIS OR STRATOCUMULUS, ALL HAVING THEIR
+ BASES AT THE SAME LEVEL
+ 0033 02 CUMULONIMBUS CALVUS, WITH OR WITHOUT CUMULUS, STRATOCUMULUS
+ OR STRATUS
+ 0034 01 STRATOCUMULUS CUMULOGENITUS
+ 0035 01 STRATOCUMULUS OTHER THAN STRATOCUMULUS CUMULOGENITUS
+ 0036 02 STRATUS NEBULOSUS OR STRATUS FRACTUS OTHER THAN OF BAD WEATH
+ ER, OR BOTH
+ 0037 02 STRATUS FRACTUS OR CUMULUS FRACTUS OF BAD WEATHER, OR BOTH
+ (PANNUS), USUALLY BELOW ALTOSTRATUS OR NIMBOSTRATUS
+ 0038 02 CUMULUS AND STRATOCUMULUS OTHER THAN STRATOCUMULUS CUMULOGEN
+ ITUS, WITH BASES AT DIFFERENT LEVELS
+ 0039 03 CUMULONIMBUS CAPILLATUS (OFTEN WITH AN ANVIL), WITH OR WITHO
+ UT CUMULONIMBUS CALVUS, CUMULUS, STRATOCUMULUS, STRATUS OR P
+ ANNUS
+ 0059 02 CLOUD NOT VISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDSTO
+ RM, OR OTHER ANALOGOUS PHENOMENA
+ 0060 03 CH CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA, OR BECAUSE OF A CONTINUOUS
+ LAYER OF LOWER CLOUDS
+ 0061 03 CM CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA, OR BECAUSE OF A CONTINUOUS
+ LAYER OF LOWER CLOUDS
+ 0062 02 CL CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA
+ 0063 01 MISSING VALUE
+020017 0011 0000 01 ISOLATED CLOUD OR FRAGMENTS OF CLOUD
+ 0001 01 CONTINUOUS CLOUD
+ 0002 01 BROKEN CLOUD - SMALL BREAKS, FLAT TOPS
+ 0003 01 BROKEN CLOUD - LARGE BREAKS, FLAT TOPS
+ 0004 01 CONTINUOUS CLOUD
+ 0005 01 BROKEN CLOUD - SMALL BREAKS, UNDULATED TOPS
+ 0006 01 BROKEN CLOUD - LARGE BREAKS, UNDULATED TOPS
+ 0007 02 CONTINUOUS OR ALMOST CONTINUOUS WAVES WITH TOWERING CLOUDS A
+ BOVE THE TOP OF THE LAYER
+ 0008 02 GROUPS OF WAVES WITH TOWERING CLOUDS ABOVE THE TOP OF THE LA
+ YER
+ 0009 01 TWO OR MORE LAYERS AT DIFFERENT LEVELS
+ 0015 01 MISSING VALUE
+020018 0004 0000 01 INCREASING (U)
+ 0001 01 DECREASING (D)
+ 0002 01 NO DISTINCT CHANGE (N)
+ 0003 01 MISSING VALUE
+020021 0024 0001 01 PRECIPITATION-UNKNOWN TYPE
+ 0002 01 LIQUID PRECIPITATION NOT FREEZING
+ 0003 01 LIQUID FREEZING PRECIPITATION
+ 0004 01 DRIZZLE
+ 0005 01 RAIN
+ 0006 01 SOLID PRECIPITATION
+ 0007 01 SNOW
+ 0008 01 SNOW GRAINS
+ 0009 01 SNOW PELLETS
+ 0010 01 ICE PELLETS
+ 0011 01 ICE CRYSTALS
+ 0012 01 DIAMOND DUST
+ 0013 01 SMALL HAIL
+ 0014 01 HAIL
+ 0015 01 GLAZE
+ 0016 01 RIME
+ 0017 01 SOFT RIME
+ 0018 01 HARD RIME
+ 0019 01 CLEAR ICE
+ 0020 01 WET SNOW
+ 0021 01 HOAR FROST
+ 0022 01 DEW
+ 0023 01 WHITE DEW
+ 0030 01 ALL 30 MISSING VALUE
+020022 0007 0000 01 NO PRECIPITATION
+ 0001 01 CONTINUOUS
+ 0002 01 INTERMITTENT
+ 0003 01 SHOWER
+ 0004 01 NOT REACHING GROUND
+ 0005 01 DEPOSITION
+ 0015 01 MISSING VALUE
+020023 0012 0001 01 DUST/SAND WHIRL
+ 0002 01 SQUALLS
+ 0003 01 SAND STORM
+ 0004 01 DUST STORM
+ 0005 01 LIGHTNING - CLOUD TO SURFACE
+ 0006 01 LIGHTNING - CLOUD TO CLOUD
+ 0007 01 LIGHTNING - DISTANT
+ 0008 01 THUNDERSTORM
+ 0009 01 FUNNEL CLOUD NOT TOUCHING SURFACE
+ 0010 01 FUNNEL CLOUD TOUCHING SURFACE
+ 0011 01 SPRAY
+ 0012 01 WATER-SPOUT
+020024 0007 0000 01 NO PHENOMENA
+ 0001 01 LIGHT
+ 0002 01 MODERATE
+ 0003 01 HEAVY
+ 0004 01 VIOLENT
+ 0005 01 SEVERE (VAL)
+ 0007 01 MISSING VALUE
+020025 0011 0001 01 FOG
+ 0002 01 ICE FOG
+ 0003 01 STEAM FOG
+ 0007 01 MIST
+ 0008 01 HAZE
+ 0009 01 SMOKE
+ 0010 01 VOLCANIC ASH
+ 0011 01 DUST
+ 0012 01 SAND
+ 0013 01 SNOW
+ 0021 01 ALL 21 MISSING VALUE
+020026 0014 0000 01 NO CHANGE
+ 0001 01 SHALLOW
+ 0002 01 PATCHES
+ 0003 01 PARTIAL
+ 0004 01 FREEZING
+ 0005 01 LOW DRIFTING
+ 0006 01 BLOWING
+ 0007 01 INCREASING
+ 0008 01 DECREASING
+ 0009 01 IN SUSPENSION IN THE AIR
+ 0010 01 WALL
+ 0011 01 DENSE
+ 0012 01 WHITEOUT
+ 0015 01 MISSING VALUE
+020027 0007 0001 01 AT TIME OF OBSERVATION
+ 0002 01 IN PAST HOUR
+ 0003 01 IN TIME PERIOD FOR PAST WEATHER W1W2
+ 0004 01 IN TIME PERIOD SPECIFIED
+ 0006 01 BELOW STATION LEVEL
+ 0007 01 AT THE STATION
+ 0008 01 IN THE VICINITY
+ 0009 01 ALL 9 MISSING VALUE
+020029 0004 0000 01 NO RAIN
+ 0001 01 RAIN
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020032 0006 0000 01 ICE NOT BUILDING UP
+ 0001 01 ICE BUILDING UP SLOWLY
+ 0002 01 ICE BUILDING UP QUICKLY
+ 0003 01 ICE MELTING OR BREAKING UP SLOWLY
+ 0004 01 ICE MELTING OR BREAKING UP RAPIDLY
+ 0007 01 MISSING VALUE
+020033 0004 0001 01 ICING FROM OCEAN SPRAY
+ 0002 01 ICING FROM FOG
+ 0003 01 ICING FROM RAIN
+ 0004 01 MISSING VALUE
+020034 0012 0000 01 NO SEA ICE IN SIGHT
+ 0001 02 SHIP IN OPEN LEAD MORE THAN 1.0 NAUTICAL MILE WIDE, OR SHIP
+ IN FAST ICE WITH BOUNDARY BEYOND LIMIT OF VISIBILITY
+ 0002 04 SEA ICE PRESENT IN CONCETRATION LESS THAN 3/10 (3/8), OPEN W
+ ATER OR VERY OPEN PACK ICE, SEA ICE CONCETRATION IS UNIFORM
+ IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL
+ MILE OF ICE EDGE
+ 0003 03 4/10 TO 6/10 (3/8 TO LESS THAN 6/8) ,OPEN PACK ICE, SEA ICE
+ CONCETRATION IS UNIFORM IN THE OBSERVATION AREA, SHIP IN ICE
+ OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0004 03 7/10 TO 8/10 (6/8 TO LESS THAN 7/8), CLOSE PACK ICE, SEA ICE
+ CONCETRATION IS UNIFORM IN THE OBSERVATION AREA, SHIP IN IC
+ E OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0005 04 9/10 OR MORE, BUT NOT 10/10 (7/8 TO LESS THAN 8/8), VERY CLO
+ SE PACK ICE, SEA ICE CONCETRATION IS UNIFORM IN THE OBSERVAT
+ ION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE EDG
+ E
+ 0006 03 STRIPS AND PATCHES OF PACK ICE WITH OPEN WATER BETWEEN, SEA
+ ICE CONCENTRATION IS NOT UNIFORM IN THE OBSERVATION AREA, SH
+ IP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0007 04 STRIPS AND PATCHES OF CLOSE OR VERY CLOSE PACK ICE WITH AREA
+ S OF LESSER CONCENTRATION BETWEEN, SEA ICE CONCETRATION IS N
+ OT UNIFORM IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.
+ 5 NAUTICAL MILE OF ICE EDGE
+ 0008 04 FAST ICE WITH OPEN WATER,VERY OPEN OR OPEN PACK ICE TO SEAWA
+ RD OF THE ICE BOUNDARY, SEA ICE CONCENTRATION IS NOT UNIFORM
+ IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL
+ MILE OF ICE EDGE
+ 0009 04 FAST ICE CLOSE OR VERY CLOSE PACK ICE TO SEAWARD OF THE ICE
+ BOUNDARY, SEA ICE CONCETRATION IS NOT UNIFORM IN THE OBSERVA
+ TION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE ED
+ GE
+ 0014 03 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY, O
+ R BECAUSE SHIP IS MORE THAN 0.5 NAUTICAL MILE AWAY FROM ICE
+ EDGE
+ 0015 01 MISSING VALUE
+020035 0012 0000 01 NO ICE OF LAND ORIGIN
+ 0001 01 1-5 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0002 01 6-10 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0003 01 11-20 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0004 01 UP TO AND INCLUDING 10 GROWLERS AND BERGY BITS - NO ICEBERGS
+ 0005 01 MORE THAN 10 GROWLERS AND BERGY BITS - NO ICEBERGS
+ 0006 01 1-5 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0007 01 6-10 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0008 01 11-20 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0009 02 MORE THAN 20 ICEBERGS,WITH GROWLERS AND BERGY BITS - A MAJOR
+ HAZARD TO NAVIGATION
+ 0014 02 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY OR
+ BECAUSE ONLY SEA ICE IS VISIBLE
+ 0015 01 MISSING VALUE
+020036 0012 0000 01 SHIP IN OPEN WATER WITH FLOATING ICE IN SIGHT
+ 0001 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS IMPROVING
+ 0002 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS NOT CHANGING
+ 0003 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS WORSENING
+ 0004 01 SHIP IN ICE DIFFICULT TO PENETRATE; CONDITIONS IMPROVING
+ 0005 01 SHIP IN ICE DIFFICULT TO PENETRATE; CONDITIONS NOT CHANGING
+ 0006 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE FORMING AND FLOES FREEZING TOGETHAR
+ 0007 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE UNDER SLIGHT PRESSURE
+ 0008 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE UNDER MODERATE OR SEVERE PRESSURE
+ 0009 01 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING. SHIP BESET.
+ 0030 01 UNABLE TO REPORT, BECAUSE OF DARKNESS OR LACK OF VISIBILITY
+ 0031 01 MISSING VALUE
+020037 0012 0000 01 NEW ICE ONLY (FRAZIL ICE, GREASE ICE, SLUSH, SHUGA)
+ 0001 01 NILAS OR ICE RIND, LESS THAN 10 CM THICK
+ 0002 01 YOUNG ICE(GREY ICE, GREY-WHITE ICE
+ 0003 01 PREDOMINANTLY NEW AND/OR YOUNG ICE WITH SOME FIRST-YEAR ICE
+ 0004 01 PREDOMINANTLY THIN FIRST-YEAR ICE WITH SOME NEW AND/OR YOUNG ICE
+ 0005 01 ALL THIN FIRST-YEAR ICE (30-70 CM THICK)
+ 0006 02 PREDOMINANTLY MEDIUM FIRST-YEAR ICE
+ (70-120 CM THICK) AND THICK FIRST-YEAR ICE (>120 CM
+ 0007 01 ALL MEDIUM AND THICK FIRST-YEAR ICE
+ 0008 02 PREDOMINANTLY MEDIUM AND THICK FIRST-YEAR ICE WITH SOME
+ OLD ICE (USUALLY MORE THAN 2 METRES THICK)
+ 0009 01 PREDOMINANTLY OLD ICE
+ 0030 03 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY OR BECAUSE
+ ONLY ICE OF LAND ORIGIN IS VISIBLE OR BECAUSE SHIP IS MORE THAN 0.5
+ NAUTICAL MILE AWAY FROM ICE EDGE
+ 0031 01 MISSING VALUE
+020040 0009 0000 01 DRIFT SNOW ENDED BEFORE THE HOUR OF OBSERVATION
+ 0001 01 INTENSITY DIMINISHING
+ 0002 01 NO CHANGE
+ 0003 01 INTENSITY INCREASING
+ 0004 01 CONTINUES, APART FROM INTERRUPTION LASTING LESS THAN 30 MINUTES
+ 0005 01 GENERAL DRIFT SNOW HAS BECOME DRIFT SNOW NEAR THE GROUND
+ 0006 01 DRIFT SNOW NEAR THE GROUND HAS BECOME GENERAL DRIFT SNOW
+ 0007 01 DRIFT SNOW HAS STARTED AGAIN AFTER AN INTERRUPTION OF MORE THAN 30 MINUTES
+ 0015 01 MISSING VALUE
+020041 0011 0000 01 NO ICING
+ 0001 01 LIGHT ICING
+ 0002 01 LIGHT ICING IN CLOUD
+ 0003 01 LIGHT ICING IN PRECIPITATION
+ 0004 01 MODERATE ICING
+ 0005 01 MODERATE ICING IN CLOUD
+ 0006 01 MODERATE ICING IN PRECIPITATION
+ 0007 01 SEVERE ICING
+ 0008 01 SEVERE ICING IN CLOUD
+ 0009 01 SEVERE ICING IN PRECIPITATION
+ 0015 01 MISSING VALUE
+020042 0004 0000 01 NO ICING
+ 0001 01 ICING PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020045 0004 0000 01 NO SLD CONDITIONS PRESENT
+ 0001 01 SLD CONDITIONS PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020050 0010 0000 01 RESERVED
+ 0001 01 1ST LOW CLOUD
+ 0002 01 2ND LOW CLOUD
+ 0003 01 3RD LOW CLOUD
+ 0004 01 1ST MEDIUM CLOUD
+ 0005 01 2ND MEDIUM CLOUD
+ 0006 01 3RD MEDIUM CLOUD
+ 0007 01 1ST HIGH CLOUD
+ 0008 01 2ND HIGH CLOUD
+ 0255 01 MISSING VALUE
+020055 0011 0000 01 CUMULUS, IF ANY, ARE QUITE SMALL
+ 0001 01 CUMULUS OF INTERMEDIATE SIZE
+ 0002 01 SWELLING CUMULUS
+ 0003 01 SWELLING CUMULUS WITH TOWERS
+ 0004 01 SWELLING CUMULUS WITH TOWERS HAVING PRONOUNCED TILT
+ 0005 01 TALL CUMULUS CONGESTUS
+ 0006 01 ISOLATED CUMULONIMBUS
+ 0007 01 NUMEROUS CUMULONIMBUS
+ 0008 01 CONTINUOUS DENSE MIDDLE CLOUDS
+ 0009 01 CONTINUOUS SHEETS OF MIDDLE CLOUDS
+ 0015 01 MISSING VALUE
+020056 0005 0000 01 UNKNOWN
+ 0001 01 WATER
+ 0002 01 ICE
+ 0003 01 MIXED
+ 0007 01 MISSING VALUE
+020062 0021 0000 02 SURFACE OF GROUND DRY (WITHOUT CRACKS AND NO APPRECIABLE
+ AMOUNT OF DUST OR LOOSE SAND)
+ 0001 01 SURFACE OF GROUND MOIST
+ 0002 02 SURFACE OF GROUND WET (STANDING WATER IN SMALL
+ OR LARGE POOLS ON SURFACE)
+ 0003 01 FLOODED WITHOUT SNOW
+ 0004 01 SURFACE OF GROUND FROZEN MEASURABLE ICE
+ 0005 01 GLAZE ON GROUND COVER
+ 0006 01 LOOSE DRY DUST OR SAND NOT COVERING GROUND COMPLETELY
+ 0007 01 THIN COVER OF LOOSE DRY DUST OR SAND COVERING GROUND COMPLETELY
+ 0008 02 MODERATE OR THICK COVER OF LOOSE DRY DUST OR SAND COVERING
+ GROUND COMPLETELY
+ 0009 01 EXTREMELY DRY WITH CRACKS
+ 0010 01 GROUND PREDOMINANTLY COVERED BY ICE
+ 0011 02 COMPACT OR WET SNOW (WITH OR WITHOUT ICE) COVERING LESS THAN
+ ONE-HALF OF THE GROUND
+ 0012 02 COMPACT OR WET SNOW (WITH OR WITHOUT ICE) COVERING AT LEAST
+ ONE-HALF OF THE GROUND BUT GROUND NOT COMPLETELY COVERED
+ 0013 01 EVEN LAYER OF COMPACT OR WET SNOW COVERING GROUND COMPLETELY
+ 0014 02 UNEVEN LAYER OF COMPACT OR WET SNOW COVERING GROUND
+ WITH SNOW OR COMPLETELY MEASURABLE ICE
+ 0015 01 LOOSE DRY SNOW COVERING LESS THAN ONE-HALF OF THE GROUND COVER
+ 0016 02 LOOSE DRY SNOW COVERING AT LEAST ONE-HALF OF THE
+ GROUND (BUT NOT COMPLETELY)
+ 0017 01 EVEN LAYER OF LOOSE DRY SNOW COVERING GROUND COMPLETELY
+ 0018 01 UNEVEN LAYER OF LOOSE DRY SNOW COVERING GROUND COMPLETELY
+ 0019 01 SNOW COVERING GROUND COMPLETELY; DEEP DRIFTS
+ 0031 01 MISSING VALUE
+020063 0001 0000 01 TO BE DEVELOPED
+020071 0011 0000 01 NO ASSESSMENT NO ASSESSMENT
+ 0001 01 LESS THAN 50 KM LESS THAN 1 PER SECOND
+ 0002 01 BETWEEN 50 AND 200 KM LESS THAN 1 PER SECOND
+ 0003 01 MORE THAN 200 KM LESS THAN 1 PER SECOND
+ 0004 01 LESS THAN 50 KM 1 OR MORE PER SECOND
+ 0005 01 BETWEEN 50 AND 200 KM 1 OR MORE PER SECOND
+ 0006 01 MORE THAN 200 KM 1 OR MORE PER SECOND
+ 0007 01 LESS THANK 50 KM RATE SO RAPID NUMBER CANNOT BE COUNTED
+ 0008 01 BETWEEN 50 AND 200 KM RATE SO RAPID NUMBER CANNOT BE COUNTED
+ 0009 01 MORE THAN 200 KM RATE SO RAPID NUMBER CANNOT BE COUNTED
+ 0015 01 MISSING VALUE
+020086 0008 0000 01 CLEAR AND DRY
+ 0001 01 DAMP
+ 0005 01 WET SNOW
+ 0006 01 SLUSH
+ 0007 01 ICE
+ 0008 01 COMPACTED OR ROLLED SNOW
+ 0009 01 FROZEN RUTS OR RIDGES
+ 0015 01 MISSING VALUE
+020090 0007 0000 01 RESERVED
+ 0001 01 NACREOUS CLOUDS
+ 0002 01 NOCTILUCENT CLOUDS
+ 0003 01 CLOUDS FROM WATERFALLS
+ 0004 01 CLOUDS FROM FIRES
+ 0005 01 CLOUDS FROM VULCANIC ERUPTIONS
+ 0015 01 MISSING VALUE
+020101 0010 0001 01 SCHISTOCERCA GREGARIA
+ 0002 01 LOCUSTA MIGRATORIA
+ 0003 01 NOMADACRIS SEPTEMFASCIATA
+ 0004 01 OEDALEUS SENAGALENSIS
+ 0005 01 ANRACRIDIUM SPP
+ 0006 01 OTHER LOCUST
+ 0007 01 OTHER GRASSHOPPERS
+ 0008 01 ITHER CRICKETS
+ 0009 01 SPODOPTERA EXEMPTA
+ 0015 01 MISSING VALUE
+020102 0011 0000 01 GREEN
+ 0001 01 GREEN AND BLACK
+ 0002 01 BLACK
+ 0003 01 YELLOW AND BLACK
+ 0004 01 STRAW/GREY
+ 0005 01 PINK
+ 0006 01 DARK RED/BROWN
+ 0007 01 MIXED RED AND YELLOW
+ 0008 01 YELLOW
+ 0009 01 OTHER
+ 0015 01 MISSING VALUE
+020151 0003 0000 01 FIRST YEAR ICE
+ 0001 01 MULTI YEAR ICE
+ 0007 01 MISSING
+020252 0003 0000 01 NO EDGE
+ 0001 01 EDGE PRESENT
+ 0007 01 MISSING
+020253 0007 0000 01 LAND
+ 0001 01 VEGETATION COVERED LAND
+ 0002 01 RESERVED
+ 0003 01 ICE
+ 0004 01 POSSIBLE ICE
+ 0005 01 OCEAN
+ 0006 01 COAST
+ 0007 01 MISSING
+021066 0011 0001 01 PROCESSING EQUIPMENT NOT WORKING
+ 0002 01 EQUIPMENT FAILED
+ 0003 01 PRF CODE CHANGED DURING IMAGE GENERATION
+ 0004 01 SAMPLINH WINDOW CHANGED DURING IMAGE GENERATION
+ 0005 01 GAIN CHANGED DURING IMAGE GENERATION
+ 0006 01 CHIRP REPLICA EXCEEDS SPECIFIC VALUE
+ 0007 02 INPUT DATA MEAN AND STANDARD DEVIATION OF IN-PHASE AND
+ QUADRATURE OUT OF RANGE
+ 0008 01 DOPPLER CENTROID CONFIDENCE > MMCC VALUE
+ 0009 01 DOPPLER CENTROID ABSOLUTE VALUE > PRF/2
+ 0010 01 DOPPLER AMBIGUITY CONFIDENCE < MMCC VALUE
+ 0011 01 OUTPUT DATA MEAN AND STANDARD DEVIATION =< MMCC VALUE
+021067 0012 0001 01 NO FOREBEAM CALCULATION
+ 0002 01 NO MIDBEAM CALCULATION
+ 0003 01 NO AFTBEAM CALCULATION
+ 0004 01 FOREBEAM ARCING DETECTED
+ 0005 01 MID ARCING DETECTED
+ 0006 01 AFTBEAM ARCING DETECTED
+ 0007 01 ANY BEAM NOISE CONTENT ABOVE OR EQUAL TO TRESHOLD
+ 0008 01 LAND (ANY LAND IN CELL FOOTPRINT)
+ 0009 01 AUTONOMOUS AMBIGUITY REMOVAL NOT USED
+ 0010 01 METEOROLOGICAL BACKGROUND NOT USED
+ 0011 01 MINIMUM RESIDUAL EXCEEDED TRESHOLD
+ 0012 01 FRAME CHECKSUM ERROR DETECTED
+021068 0007 0001 01 STANDARD DEVIATION OF WIND SPEED OUTSIDE MMCC LIMIT
+ 0002 01 STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT OUTSIDE MMCC LIMIT
+ 0003 01 STANDARD DEVIATION OF ALTITUDE OUTSIDE MMCC LIMIT
+ 0004 01 MEAN PEAKINESS OUTSIDE MMCC LIMIT
+ 0005 01 FRAME CHECKSUM ERROR DETECTED
+ 0006 01 HEIGHT-TIME LOOP TIME CONSTANT CORRECTION NOT PERFORMED
+ 0007 01 NOT ENOUGH MEASUREMENTS ( N< 10)
+021069 0009 0001 01 12.0 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0002 01 11.0 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0003 01 3.7 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0004 01 1.6 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0005 02 CLOUD IDENTIFICATION USED 1.6 MICROMETERS
+ HISTOGRAM REFLECTANCE CLOUD TEST
+ 0006 02 1.6 MICROMETERS HISTOGRAM REFLECTANCE CLOUD
+ TEST USED DYNAMIC TRESHOLD
+ 0007 01 SUN GLINT DETECTED BY 1.6 MICROMETERS REFLECTANCE CLOUD TEST
+ 0008 01 3.7 MICROMETERS USED IN SEA-SURFACE TEMPERATURE RETRIEVAL
+ 0009 02 SEA-SURFACE TEMPERATURE DERIVATION USED DAYTIME DATA
+ (NIGHT-TIME IF ZERO)
+021070 0024 0001 01 CELL 1:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0002 01 CELL 2:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL CELL NUMBERING
+ 0003 01 CELL 3:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0004 01 CELL 4:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL NW NE
+ 0005 01 CELL 5:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 7 8 9
+ 0006 01 CELL 6:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 4 5 6
+ 0007 01 CELL 7:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 1 2 3
+ 0008 01 CELL 8:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL SW SE
+ 0009 01 CELL 9:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0010 01 CELL 1:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0011 01 CELL 2:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL CELL NUMBERING
+ 0012 01 CELL 3:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0013 01 CELL 4:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL NW NE
+ 0014 01 CELL 5:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 7 8 9
+ 0015 01 CELL 6:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 4 5 6
+ 0016 01 CELL 7:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 1 2 3
+ 0017 01 CELL 8:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL SW SE
+ 0018 01 CELL 9:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0019 01 NADIR VIEW CONTAINS DAY-TIME DATA (NIGHT IF ZERO)
+ 0020 01 FORWARD VIEW CONTAINS DAY-TIME DATA (NIGHT IF ZERO)
+ 0021 02 RECORD CONTAINS CONTRIBUTIONS FROM INSTRUMENT SCANS ACQUIRED WHEN ERS PLATFORM NOT IN
+ YAW-STEERING MODE
+ 0022 02 RECORD CONTAINS CONTRIBUTIONS FROM INSTRUMENT SCANS FOR WHICH PRODUCT CONFIDENCE DATA
+ SHOW QUALITY IS POOR OR UNKNOWN
+ 0023 01 MISSING VALUE
+021072 0003 0001 01 HEIGHT ERROR CORRECTION APPLIED INSTEAD OF OPEN LOOP CALIBRATION
+ 0002 01 MICROWAVE SOUNDER USED FOR TROPOSPHERE CORRECTION
+ 0003 01 AGC OUTPUT CORRECTION APPLIED INSTED OF OPEN LOOP CALIBRATION
+021073 0008 0001 01 BLANK DATA RECORD
+ 0002 01 TEST
+ 0003 01 CALIBRATION (CLOSED LOOP)
+ 0004 01 BITE
+ 0005 01 ACQUISITION ON ICE
+ 0006 01 ACQUISITION ON OCEAN
+ 0007 01 TRACKING ON ICE
+ 0008 01 TRACKING ON OCEAN
+021076 0004 0000 01 LINEAR
+ 0001 01 LOGARITHMIC (BASE E)
+ 0002 01 LOGARITHMIC (BASE 10)
+ 0007 01 MISSING VALUE
+021109 0008 0001 01 NOT ENOUGH GOOD SIGMA-0 AVAILABLE FOR WIND RETRIEVAL
+ 0002 01 POOR AZIMUTH DIVERSITY AMONG SIGMA0- FOR WIND RETRIEVAL
+ 0008 01 SOME PORTION OF WIND VECTOR CELL IS OVER LAND
+ 0009 01 SOME PORTION OF WIND VECTOR CELL IS OVER ICE
+ 0010 01 WIND RETRIEVAL NOT PERFORMED FOR WIND VECTOR CELL
+ 0011 01 REPORTED WIND SPEED IS GREATER THAN 30 M/S
+ 0012 01 REPORTED WIND SPEED IS LESS THAN OR EQUAL TO 3 M/S
+ 0017 01 MISSING VALUE
+021115 0011 0001 01 SIGMA-0 MEASUREMENT IS NOT USABLE
+ 0002 01 SIGNAL TO NOISE RATIO IS LOW
+ 0003 01 SIGMA-0 IS NEGATIVE
+ 0004 01 SIGMA-0 IS OUTSIDE OF ACCEPTABLE RANGE
+ 0005 01 SCATTEROMETER PULSE QUALITY IS NOT ACCEPTABLE
+ 0006 01 SIGMA-0 CELL LOCATION ALGORITHM DOES NOT CONVERGE
+ 0007 01 FREQUENCY SHIFT LIES BEYOND THE RANGE OF THE X FACTOR TABLE
+ 0008 01 SPACECRAFT TEMPERATURE IS BEYOND CALIBRATION COEFFICIENT RANGE
+ 0009 01 NO APPLICABLE ATTITUDE RECORDS WERE FOUND FOR THIS SIGMA-0
+ 0010 01 INTERPOLATED EPHEMERIS DATA ARE NOT ACCEPTABLE FOR THIS SIGMA-0
+ 0017 01 MISSING VALUE
+021116 0016 0001 01 CALIBRATION/MEASUREMENT PULSE FLAG (1)
+ 0002 01 CALIBRATION/MEASUREMENT PULSE FLAG (2)
+ 0003 01 OUTER ANTENNA BEAM
+ 0004 01 SIGMA-0 CELL IS AFT OF SPACECRAFT
+ 0005 01 CURRENT MODE (1)
+ 0006 01 CURRENT MODE (2)
+ 0007 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (1)
+ 0008 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (2)
+ 0009 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (3)
+ 0010 01 LOW RESOLUTION MODE - WHOLE PULSE DATA
+ 0011 01 SCATTEROMETER ELECTRONIC SUBSYSTEM B
+ 0012 01 ALTERNATE SPIN RATE - 19.8 RPM
+ 0013 01 RECEIVER PROTECTION ON
+ 0014 01 SLICES PER COMPOSITE FLAG (1)
+ 0015 01 SLICES PER COMPOSITE FLAG (2)
+ 0016 01 SLICES PER COMPOSITE FLAG (3)
+021119 0014 0000 01 RESERVED
+ 0001 01 SASS
+ 0002 01 SASS2
+ 0003 01 NSCAT0
+ 0004 01 NSCAT1
+ 0005 01 NSCAT2
+ 0006 01 QSCAT0
+ 0007 01 QSCAT1
+ 0031 01 CMOD1
+ 0032 01 CMOD2
+ 0033 01 CMOD3
+ 0034 01 CMOD4
+ 0035 01 CMOD5
+ 0064 01 MISSING VALUE
+021144 0001 0001 01 RAIN
+021150 0004 0000 01 DATA FROM SINGLE GROUND STATION (NO CO-LOCATION)
+ 0001 01 DATA FROM MULTIPLE GROUND STATION (CO-LOCATED DATA)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021155 0016 0001 01 NOT ENOUGH GOOD SIGMA-0 AVAILABLE FOR WIND RETRIEVAL
+ 0002 01 POOR AZIMUTH DIVERSITY AMONG SIGMA-0 FOR WIND RETRIEVAL
+ 0003 01 ANY BEAM NOISE CONTENT ABOVE TRESHOLD
+ 0004 01 PRODUCT MONITORING NOT USED
+ 0005 01 PRODUCT MONITORING FLAG
+ 0006 01 KNMI QUALITY CONTROL FAILS
+ 0007 01 VARIATIONAL QUALITY CONTROL FAILS
+ 0008 01 SOME PORTION OF WIND VECTOR CELL IS OVER LAND
+ 0009 01 SOME PORTION OF WIND VECTOR CELL IS OVER ICE
+ 0010 01 WIND RETRIEVAL NOT PERFORMED FOR WIND VECTOR CELL
+ 0011 01 REPORTED WIND SPEED IS GREATER THAN 30 M/S
+ 0012 01 REPORTED WIND SPEED IS LESS THAN OR EQUAL TO 3 M/S
+ 0013 01 RAIN FLAG FOR THE WIND VECTOR CELL IS NOT USABLE
+ 0014 01 RAIN FLAG ALGORITHM DETECTS RAIN
+ 0015 01 NO METEOROLOGICAL BACKGROUND USED
+ 0016 01 DATA ARE REDUNDANT
+021158 0004 0000 01 ACCEPTABLE
+ 0001 01 NOT ACCEPTABLE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021159 0004 0000 01 GOOD
+ 0001 01 USABLE
+ 0002 01 BAD
+ 0003 01 MISSING VALUE
+021169 0004 0000 01 NO ICE PRESENT
+ 0001 01 ICE PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021196 0012 0001 01 PROCESSING EQUIPMENT NOT WORKING
+ 0002 01 EQUIPMENT FAILED
+ 0003 01 PRF CODE CHANGED DURING IMAGE GENERATION
+ 0004 01 SAMPLING WINDOW CHANGED DURING IMAGE GENERATION
+ 0005 01 GAIN CHANGED DURING IMAGE GENERATION
+ 0006 01 CHIRP REPLICA EXCEEDS SPECIFIED VALUE
+ 0007 01 INPUT DATA MEAN AND STANDARD DEVIATION OF I AND Q OUT OF RANGE
+ 0008 01 DOPPLER CENTROID CONFIDENCE > MMCC VALUE
+ 0009 01 DOPPLER CENTROID ABSOLUTE VCALUE > PRF/2
+ 0010 01 DOPPLER AMBIGUITY CONFIDENCE < MMCC VALUE
+ 0011 01 OUTPUT DATA MEAN AND STANDARD DEVIATION <= MMCC VALUE
+ 0012 01 MISSING VALUE
+021199 0007 0001 01 3.7 MICRO CHANNEL USED IN ASST DERIVATION
+ 0002 01 ASST DERIVATION USED DATTIME DATA
+ 0003 02 COMPARISON OF ASST AGAINST PREVIOUS
+ EQUIVALENT PASS PERFORMED
+ 0004 02 COMPARISON OF ASST AGAINST WEEKLY AVERAGE
+ OF ASST PERFORMED
+ 0005 01
+ 0006 02 COMPARISON OF RATE OF CHANGE OF ASST AGAINST
+ STATIC TRESHOLD PERFORMED
+ 0007 01 MISSING VALUE
+021227 0034 0000 01 RESERVED
+ 0001 01 0-2 DEGREES
+ 0002 01 3-4 DEGREES
+ 0003 01 5-6 DEGREES
+ 0004 01 7-6 DEGREES
+ 0005 01 9-6 DEGREES
+ 0006 01 11-12 DEGREES
+ 0007 01 13-14 DEGREES
+ 0008 01 15-16 DEGREES
+ 0009 01 17-18 DEGREES
+ 0010 01 19-20 DEGREES
+ 0011 01 21-22 DEGREES
+ 0012 01 23-24 DEGREES
+ 0013 01 25-26 DEGREES
+ 0014 01 27-28 DEGREES
+ 0015 01 29-30 DEGREES
+ 0016 01 31-32 DEGREES
+ 0017 01 33-34 DEGREES
+ 0018 01 35-36 DEGREES
+ 0019 01 37-38 DEGREES
+ 0020 01 39-40 DEGREES
+ 0021 01 41-42 DEGREES
+ 0022 01 43-44 DEGREES
+ 0023 01 45-46 DEGREES
+ 0024 01 47-48 DEGREES
+ 0025 01 49-50 DEGREES
+ 0026 01 51-52 DEGREES
+ 0027 01 53-54 DEGREES
+ 0028 01 55-56 DEGREES
+ 0029 01 57-58 DEGREES
+ 0030 01 59-60 DEGREES
+ 0031 01 > 60 DEGREES
+ 0032 01 INVALID
+ 0064 01 MISSING VALUE
+022056 0004 0000 01 UPWARDS PROFILE
+ 0001 01 DOWNWARDS PROFILE
+ 0002 01 HORIZONTAL
+ 0003 01 MISSING VALUE
+022060 0004 0000 01 DROGUE IS DETACHED
+ 0001 01 DROGUE IS ATTACHED
+ 0002 01 DROGUE STATUS UNKNOWN
+ 0007 01 MISSING VALUE
+022061 0011 0000 01 CALM (GLASSY) HEIGHT 0 M
+ 0001 01 CALM (RIPPLED) HEIGHT 0 - 0.1 M
+ 0002 01 SMOOTH (WAVELETS) HEIGHT 0.1 - 0.5 M
+ 0003 01 SLIGHT HEIGHT 0.5 - 1.5 M
+ 0004 01 MODERATE HEIGHT 1.25 - 2.5 M
+ 0005 01 ROUGH HEIGHT 2.5 - 4 M
+ 0006 01 VERY ROUGH HEIGHT 4 - 6 M
+ 0007 01 HIGH HEIGHT 6 - 9 M
+ 0008 01 VERY HIGH HEIGHT 9 -14 M
+ 0009 01 PHENOMANAL HEIGHT OVER 14 M
+ 0015 01 MISSING VALUE
+022067 0001 0000 01 SEE COMMON CODE TABLE C3
+022068 0001 0000 01 SEE COMMON CODE TABLE C4
+022120 0013 0000 01 GOOD DATA
+ 0001 01 MAXIMUM (HIGH) WATER LEVEL LIMIT EXCEEDED
+ 0002 01 MINIMUM (LOW) WATER LEVEL LIMIT EXCEEDED
+ 0003 01 RATE OF CHANGE LIMIT FOR WATER LEVEL EXCEEDED
+ 0004 01 FLAT LIMIT FOR WATER LEVEL EXCEEDED
+ 0005 01 OBSERVED MINUS PREDICTED WATER LEVEL VALUE LIMIT EXCEEDED
+ 0006 02 OBSERVED VALUE FROM PRIMARY WATER LEVEL SENSOR MINUS
+ BACKUP WATER LEVEL SENSOR
+ 0007 01 VALUE EXCEEDED SPECIFIED TOLERANCE FROM EXPECTED VALUE
+ 0008 01 WATER LEVEL QA PARAMETER (SIGMAS AND/OR OUTLIERS) LIMITS EXCEEDED
+ 0009 01 SEA TEMPERATURE OUTSIDE OF EXPECTED RANGE
+ 0010 01 MULTIPLE QC CHECKS (ABOVE) FAILED
+ 0011 01 NO AUTOMATED WATER LEVEL CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022121 0009 0000 01 OPERATIONAL
+ 0001 01 POSSIBLE CLOGGING PROBLEM OR OTHERWISE DEGRADED WATE LEVEL DATA
+ 0002 01 POSSIBLE DATUM SHIFT
+ 0003 01 UNKNOWN STATUS OF WATER LEVEL SENSOR
+ 0004 01 SUSPECTED OR KNOWN SEA TEMPERATURE SENSOR PROBLEM
+ 0005 01 MULTIPLE POSSIBLE PROBLEMS (ABOVE)
+ 0006 01 BAD DATA- DO NOT DISSEMINATE
+ 0007 01 NO MANUAL WATER LEVEL CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022122 0008 0000 01 GOOD DATA FROM ALL SENSORS
+ 0001 01 WIND DIRECTION OUTSIDE OF ALLOWABLE RANGE
+ 0002 01 WIND SPEED OUTSIDE OF EXPECTED RANGE
+ 0003 01 BAROMETRIC PRESSURE OUTSIDE OF EXPECTED RANGE
+ 0004 01 AIR TEMPERATURE OUTSIDE OF EXPECTED RANGE
+ 0005 01 MULTIPLE SENSOR FAILED QC CHECKS
+ 0006 01 NO AUTOMATED METEOROLOGICAL DATA CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022123 0009 0000 01 OPERATIONAL
+ 0001 01 SUSPECTED OR KNOWN PROBLEM WITH WIND SENSOR
+ 0002 01 SUSPECTED OR KNOWN PROBLEM WITH BAROMETRIC PRESSURE SENSOR
+ 0003 01 SUSPECTED OR KNOWN PROBLEM WITH AIR TEMPERATURE SENSOR
+ 0004 01 UNKNOWN STATUS OF ALL SENSORS
+ 0005 01 SUSPECTED OR KNOWN PROBLEMS WITH MULTIPLE SENSORS
+ 0006 01 BAD DATA - DO NOT DISSEMINATE
+ 0007 01 NO MANUAL METEOROLOGICAL DATA CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022252 0006 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND
+ PASSED
+ 0002 02 AUTOMATIC QUALITY CONTROL PASSED AND MAGNOLIA CHECKED AND
+ DELETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND
+ FAILED
+ 0005 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND
+ RE-INSERTED
+023001 0005 0000 01 RESERVED
+ 0001 01 ARTICLES 1 AND 2
+ 0002 01 ARTICLE 3
+ 0003 01 ARTICLE 5.2
+ 0007 01 MISSING VALUE
+023002 0016 0000 01 RESERVED
+ 0001 01 NUCLEAR REACTOR ON GROUND
+ 0002 01 NUCLEAR REACTOR ON SEA
+ 0003 01 NUCLEAR REACTOR IN SPACE
+ 0004 01 NUCLEAR FULE FACILITY
+ 0005 01 RADIOACTIVE WASTE MANAGMENT FACITILY
+ 0006 01 TRANSPORT OF NUCLEAR FUEL OR RADIOACTIVE WASTE
+ 0007 01 STORAGE OF NUCLEAR FUEL OR RADIOACTIVE WASTE
+ 0008 01 MANUFACTURE OF RADIO-ISOTOPES
+ 0009 01 USE OF RADIO-ISOTOPES
+ 0010 01 STORAGE OF RADIO-ISOTOPES
+ 0011 01 DISPOSAL OF RADIO-ISOTOPS
+ 0012 01 TRANSPORT OF RADIO-ISOTOPES
+ 0013 01 USE OF RADIO-ISOTOPES FOR POWER GENERATION
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+023003 0008 0000 01 NO RELEASE
+ 0001 01 RELEASE TO ATMOSPHERE
+ 0002 01 RELEASE TO WATER
+ 0003 01 RELEASE TO BOTH ATMOSPHERE AND WATER
+ 0004 01 EXPECTED RELEASE TO ATMOSPHERE
+ 0005 01 EXPECTED RELEASE TO WATER
+ 0006 01 EXPECTED RELEASE TO BOTH ATMOSPHERE AND WATER
+ 0007 01 MISSING VALUE
+023004 0006 0000 01 NO COUNTERMEASURE
+ 0001 01 EVACUATION
+ 0002 01 SHELTERING
+ 0003 01 PROPHILAXIS
+ 0004 01 WATER
+ 0007 01 MISSING VALUE
+023005 0004 0000 01 INCIDENT STAT DOES NOT UNDERSTAND WHAT HAPPENED
+ 0001 01 INCIDENT STATE KNOWS THE CAUSE OF THE INCIDENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023006 0008 0000 01 NO IMPROVEMENT
+ 0001 01 UNSTABLE
+ 0002 01 NO DETERIORATION
+ 0003 01 IMPROVING
+ 0004 01 STABLE
+ 0005 01 DETERIORATING
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+023007 0005 0000 01 NO RELEASE
+ 0001 01 RELEASE HAS STOPPED
+ 0002 01 RELEASE
+ 0003 01 RELEASE IS CONTINUING
+ 0007 01 MISSING VALUE
+023008 0004 0000 01 GASEUS
+ 0001 01 PARTICULATE
+ 0002 01 MIXTURE OF GASEUS AND PARTICULATE
+ 0003 01 MISSING VALUE
+023009 0004 0000 01 GASEUS
+ 0001 01 PARTICULATE
+ 0002 01 MIXTURE OF GASEUS AND PARTICULATE
+ 0003 01 MISSING VALUE
+023016 0004 0000 01 NO SIGNIFICANT TOXIC HEALTH EFFECT
+ 0001 01 SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT POSSIBLE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023018 0006 0000 01 RELEASE NO LONGER OCCURRING
+ 0001 01 RELEASE STILL OCCURRING
+ 0002 01 RELEASE EXPECTED TO INCREASE IN NEXT SIX HOURS
+ 0003 01 RELEASE EXPECTED TO REMAIN CONSTANT IN NEXT SIX HOURS
+ 0004 01 RELEASE EXPECTED TO DECREASE IN NEXT SIX HOURS
+ 0007 01 MISSING VALUE
+023031 0004 0000 01 PLUME WILL NOT ENCOUNTER RAIN IN INCIDENT STATE
+ 0001 01 PLUME WILL ENCOUNTER RAIN IN INCIDENT STATE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023032 0004 0000 01 NO SIGNIFICANT CHANGE EXPECTED WITHIN NEXT SIX HOURS
+ 0001 01 ANTICIPATED SIGNIFICANT CHANGE EXPECTED WITHIN NEXT SIX HOURS
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+024003 0005 0000 01 NOBLE GASES
+ 0001 01 IODINES
+ 0002 01 CAESIUM
+ 0003 01 TRANSURANICS
+ 0031 01 MISSING VALUE
+025004 0004 0000 01 INCOHERENT
+ 0001 01 COHERENT (DOPPLER)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025005 0004 0000 01 LOGATITHM - 2.5 DB
+ 0001 01 LINEAR
+ 0002 01 SPECIAL
+ 0003 01 MISSING VALUE
+025006 0005 0000 01 ZH TO R CONVERSION
+ 0001 01 (ZH, ZDR) TO (NO.DO) TO R
+ 0002 01 (Z(F1),Z(F2)) TO ATTENUATION TO R
+ 0006 01 OTHER
+ 0007 01 MISSING VALUE
+025009 0004 0001 01 NONE
+ 0002 01 CALIBRATION TARGET OR SIGNAL
+ 0003 01 AGAINST RAINGAGES
+ 0004 01 AGAINST OTHER INSTRUMENTS (DISTROMETER-ATTENUATION)
+025010 0008 0000 01 NONE
+ 0001 01 MAP
+ 0002 01 INSERTION OF HIGHER ELEVATION DATA AND MAP
+ 0003 01 ANALYSIS OF FLUCTUATING LOGARITHM SIGNAL (CLUTTER DETECTION)
+ 0004 01 EXTRACTION OF FLUCTUATING PART OF LINEAR SIGNAL (CLUTTER SUPPRESSION)
+ 0005 01 CLUTTER SUPPRESSION DOPPLER
+ 0006 01 MULTIPARAMETER ANALYSIS
+ 0015 01 MISSING VALUE
+025011 0004 0000 01 NONE
+ 0001 01 MAP OF CORRECTION FACTORS
+ 0002 01 INTERPOLATION (AZIMUTH OR ELEVATION)
+ 0003 01 MISSING VALUE
+025012 0004 0000 01 HARDWARE
+ 0001 01 SOFTWARE
+ 0002 01 HARDWARE AND SOFTWARE
+ 0003 01 MISSING VALUE
+025013 0001 0001 01 BRIGHT BAND CORRECTION
+025015 0001 0001 01 RADOME ATTENUATION CORRECTION
+025017 0001 0001 01 PRECIPITATION ATTENUATION CORRECTION
+025020 0004 0000 01 FTT (FAST FOURIER TRANSFORM
+ 0001 01 PPP (PULSE PAIR PROCESSING
+ 0002 01 VPC (VECTOR-PHASE CHANGE)
+ 0003 01 MISSING VALUE
+025021 0005 0001 01 SIMPLE AVERAGE
+ 0002 01 CONSENSUS AVERAGE
+ 0003 01 MEDIAN CHECK
+ 0004 01 VERTICAL CONSISTENCY CHECK
+ 0005 01 OTHER
+025030 0004 0000 01 RUNNING MEAN SEA-SURFACE TEMPERATURE NOT USED BECAUSE USAGE CRITERIA NOT MET
+ 0001 01 RUNNING MEAN SEA-SURFACE TEMPERATURE NOT USED BECAUSE DATA NOT AVAILABLE
+ 0002 01 RUNNING MEAN SEA-SURFACE TEMPERATURE USED AS PREDICTOR
+ 0003 01 MISSING VALUE
+025032 0004 0000 01 RESERVED
+ 0001 01 DATA FROM LOW MODE
+ 0002 01 DATA FROM HIGH MODE
+ 0003 01 MISSING VALUE
+025033 0004 0000 01 WIND PROFILER OPERATING IN SUBMODE A
+ 0001 01 WIND PROFILER OPERATING IN SUBMODE B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025034 0004 0001 01 TEST A PERFORMED AND FAILED
+ 0002 01 TEST B PERFORMED AND FAILED
+ 0003 01 TEST RESULTS INCONCLUSIVE
+025036 0004 0000 02 NETWORK OF SEVERAL DIRECTION-FINDERS OPERATING ON
+ THE SAME INDIVIDUAL ATMOSPHERICS
+ 0001 02 NETWORK OF SEVERAL ARRIVAL-TIME STATIONS OPERATING ON
+ THE SAME INDIVIDUAL ATMOSPHERICS
+ 0006 01 SINGLE STATION RANGE BEARING TECHNIQUE
+ 0015 01 MISSING VALUE
+025040 0010 0000 01 NON-SPECIFIC MODE
+ 0001 01 FIRST GUESS DATA
+ 0002 01 CLOUD DATA
+ 0003 01 AVERAGE VECTOR DATA
+ 0004 01 PRIMARY DATA
+ 0005 01 GUESS DATA
+ 0006 01 VECTOR DATA
+ 0007 01 TRACER DATA; THE IMAGE
+ 0008 01 TRACER DATA TO NEXT IMAGE
+ 0015 01 MISSING VALUE
+025041 0004 0000 01 DIRECTION ORIGINALLY REPORTED IN TRUE DEGREES
+ 0001 01 DIRECTION ORIGINALLY REPORTED USING CODE TABLE 0700, FM 13
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025042 0004 0000 01 SPEED ORIGINALLY REPORTED IN METERS PER SECOND
+ 0001 01 SPEED ORIGINALLY REPORTED USING CODE TABLE 2251, FM 13
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025045 0020 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+ 0007 01 CHANNEL 7 PRESENT - (SET TO 1 PRESENT)
+ 0008 01 CHANNEL 8 PRESENT - (SET TO 1 PRESENT)
+ 0009 01 CHANNEL 9 PRESENT - (SET TO 1 PRESENT)
+ 0010 01 CHANNEL 10 PRESENT - (SET TO 1 PRESENT)
+ 0011 01 CHANNEL 11 PRESENT - (SET TO 1 PRESENT)
+ 0012 01 CHANNEL 12 PRESENT - (SET TO 1 PRESENT)
+ 0013 01 CHANNEL 13 PRESENT - (SET TO 1 PRESENT)
+ 0014 01 CHANNEL 14 PRESENT - (SET TO 1 PRESENT)
+ 0015 01 CHANNEL 15 PRESENT - (SET TO 1 PRESENT)
+ 0016 01 CHANNEL 16 PRESENT - (SET TO 1 PRESENT)
+ 0017 01 CHANNEL 17 PRESENT - (SET TO 1 PRESENT)
+ 0018 01 CHANNEL 18 PRESENT - (SET TO 1 PRESENT)
+ 0019 01 CHANNEL 19 PRESENT - (SET TO 1 PRESENT)
+ 0020 01 CHANNEL 20 PRESENT - (SET TO 1 PRESENT)
+025046 0004 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+025047 0003 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+025048 0015 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+ 0007 01 CHANNEL 7 PRESENT - (SET TO 1 PRESENT)
+ 0008 01 CHANNEL 8 PRESENT - (SET TO 1 PRESENT)
+ 0009 01 CHANNEL 9 PRESENT - (SET TO 1 PRESENT)
+ 0010 01 CHANNEL 10 PRESENT - (SET TO 1 PRESENT)
+ 0011 01 CHANNEL 11 PRESENT - (SET TO 1 PRESENT)
+ 0012 01 CHANNEL 12 PRESENT - (SET TO 1 PRESENT)
+ 0013 01 CHANNEL 13 PRESENT - (SET TO 1 PRESENT)
+ 0014 01 CHANNEL 14 PRESENT - (SET TO 1 PRESENT)
+ 0015 01 CHANNEL 15 PRESENT - (SET TO 1 PRESENT)
+025049 0005 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+025051 0006 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+025053 0006 0001 01 GOOD
+ 0002 01 REDUNDANT
+ 0003 01 QUESTIONABLE
+ 0004 01 BAD
+ 0005 01 EXPERIMENTAL
+ 0006 01 PRECIPITATING
+025069 0007 0001 01 SMOOTHED
+ 0002 01 BASELINE ADJUSTED
+ 0003 01 NORMALIZED TIME INTERVAL
+ 0004 01 OUTLIER CHECKED
+ 0005 01 PLAUSIBILITY CHECKED
+ 0006 01 CONSISTENCY CHECKED
+ 0007 01 INTERPOLATED
+025086 0004 0000 01 DEPTHS ARE NOT CORRECTED
+ 0001 01 DEPTHS ARE CORRECTED
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025093 0003 0001 01 NO CORRECTION
+ 0002 01 VERTICAL VELOCITY CORRECTION
+ 0007 01 ALL CORRECTIONS
+025095 0001 0001 02 ALTIMETER OPERATING (SET TO 0 IF NOMINAL, SET TO
+ BACKUP)
+025096 0004 0001 01 MODE INDICATOR (0 IF MODE 2, 1 IF MODE 1)
+ 0002 03 MODE 1 CALIBRATION SEQUENCE INDICATOR (0 IF
+ NORMAL DATA TAKING EITHER MODE 1 OR 2, 1 IF MODE 1 CALIBRATION SEQUENCE)
+ BITS 3 AND 4 INDICATE ACTIVE 23.8 GHZ CHANNEL
+ 0003 01 CHANNEL 2 (0 IF ON, 1 IF OFF)
+ 0004 01 CHANNEL 3 (0 IF ON, 1 IF OFF)
+025097 0011 0000 01 RANGES BETWEEN 0 AND 30 CM
+ 0001 01 RANGES BETWEEN 30 AND 60 CM
+ 0002 01 RANGES BETWEEN 60 AND 90 CM
+ 0003 01 RANGES BETWEEN 90 AND 120 CM
+ 0004 01 RANGES BETWEEN 120 AND 150 CM
+ 0005 01 RANGES BETWEEN 150 AND 180 CM
+ 0006 01 RANGES BETWEEN 180 AND 210 CM
+ 0007 01 RANGES BETWEEN 210 AND 240 CM
+ 0008 01 RANGES BETWEEN 240 AND 270 CM
+ 0009 01 RANGES LARGER THAN 270 CM
+ 0015 01 MISSING VALUE
+025098 0008 0001 01 KU BAND RANGE
+ 0002 01 C BAND RANGE
+ 0003 01 KU BAND SWH
+ 0004 01 C BAND SWH
+ 0005 01 KU BAND SCATTEROMETER COEFFICIENT
+ 0006 01 C BAND SCATTEROMETER COEFFICIENT
+ 0007 01 OFF NADIR ANGLE FROM KU BAND WVEFORM PARAMETERS
+ 0008 01 OFF NADIR FROM PLATFORM
+025099 0006 0001 01 KU BAND RANGE INSTRUMENTAL CORRECTION
+ 0002 01 C BAND RANGE INSTRUMENTAL CORRECTION
+ 0003 01 KU BAND SWH INSTRUMENTAL CORRECTION
+ 0004 01 C BAND SWH INSTRUMENTAL CORRECTION
+ 0005 01 KU BAND SCATTEROMETER COEFFICIENT INSTRUMENTAL CORRECTION
+ 0006 01 C BAND SCATTEROMETER COEFFICIENT INSTRUMENTAL CORRECTION
+025110 0006 0001 02 RAW DATA ANALYSIS USED FOR RAW DATA CORRECTION.
+ CORRECTION DONE USING DEFAULT PARAMETERS
+ 0002 01 RAW DATA ANALYSIS USED FOR RAW DATA CORRECTION.
+ CORRECTION DONE USING RAW DATA ANALYSIS RESULTS
+ 0003 01 ANTENNA ELEVATION PATTERN CORRECTION APPLIED
+ 0004 01 NOMINAL CHIRP REPLICA USED
+ 0005 01 RECONSTRUCTED CHIRP USED
+ 0006 01 SLANT RANGE TO GROUND RANGE CONVERSION APPLIED
+025120 0004 0000 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS GREATER THAN THE ACCEPTABLE THRESHOLD
+ 0001 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS LESS THAN THE ACCEPTABLE THRESHOLD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025122 0004 0000 01 HARDWARE CONFIGURATION FOR RF IS A
+ 0001 01 HARDWARE CONFIGURATION FOR RF IS B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025123 0004 0000 01 HARDWARE CONFIGURATION FOR HPA IS A
+ 0001 01 HARDWARE CONFIGURATION FOR HPA IS B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025124 0004 0000 01 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS GREATER THAN THE ACCEPTABLE THRESHOLD
+ 0001 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS LESS THAN THE ACCEPTABLE THRESHOLD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025144 0014 0001 01 PIXEL IS AFFECTED BY RFI EFFECTS
+ 0002 01 PIXEL IS LOCATED IN THE HEXAGONAL ALIAS DIRECTION CENTRED ON SUN ALIAS
+ 0003 01 PIXEL IS CLOSE TO THE BORDER DELIMITING THE EXTENDED ALIAS FREE ZONE
+ 0004 01 PIXEL IS INSIDE THE EXTENDED ALIAS FREE ZONE
+ 0005 01 PIXEL IS INSIDE THE EXCLUSIVE OF ALIAS FREE ZONE
+ 0006 01 PIXEL IS LOCATED IN ZONE WHERE A MOON ALIAS WAS RECONSTRUCTED
+ 0007 01 PIXEL IS LOCATED IN ZONE WHERE SUN REFLECTION HAS BEEN DETECTED
+ 0008 01 PIXEL IS LOCATED IN ZONE WHERE SUN ALIAS WAS RECONSTRUCTED
+ 0009 02 FLAT TARGET TRANSFORMATION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION OF THIS PIXEL
+ 0010 02 SCENE HAS BEEN COMBINED WITH AN ADJUSTMENT SCENE IN OPOSITE POLARISATION
+ DURING IMAGE RECONSTRUCTION TO ACCOUNT FOR CROSS-POLARISATION LEAKAGE
+ 0011 02 DIRECT MOON CORRECTION HAS BENN PERFORMED DURING IMAGE RECONSTRUCTION OF
+ THIS PIXEL
+ 0012 02 REFLECTED SUN CORRECTION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION IF THIS PIXEL
+ 0013 02 DIRECT SUN CORRECTION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION OF THIS IMAGE
+026010 0025 0001 01 0100 INCLUDED
+ 0002 01 0200 INCLUDED
+ 0003 01 0300 INCLUDED
+ 0004 01 0400 INCLUDED
+ 0005 01 0500 INCLUDED
+ 0006 01 0600 INCLUDED
+ 0007 01 0700 INCLUDED
+ 0008 01 0800 INCLUDED
+ 0009 01 0900 INCLUDED
+ 0010 01 1000 INCLUDED
+ 0011 01 1100 INCLUDED
+ 0012 01 1200 INCLUDED
+ 0013 01 1300 INCLUDED
+ 0014 01 1400 INCLUDED
+ 0015 01 1500 INCLUDED
+ 0016 01 1600 INCLUDED
+ 0017 01 1700 INCLUDED
+ 0018 01 1800 INCLUDED
+ 0019 01 1900 INCLUDED
+ 0020 01 2000 INCLUDED
+ 0021 01 2100 INCLUDED
+ 0022 01 2200 INCLUDED
+ 0023 01 2300 INCLUDED
+ 0024 01 2400 INCLUDED
+ 0025 01 UNKNOWN MIXTURE OF HOURS
+029001 0006 0000 01 GNOMONIC PROJECTION
+ 0001 01 POLAR STEREOGRAPHIC PROJECTION
+ 0002 01 LAMBERT'S CONFORMAL CONIC PROJECTION
+ 0003 01 MERCATOR'S PROJECTION
+ 0004 01 SCANNING CONE (RADAR)
+ 0007 01 MISSING VALUE
+029002 0004 0000 01 CARTESIAN
+ 0001 01 POLAR
+ 0002 01 OTHER
+ 0007 01 MISSING VALUE
+030031 0013 0000 01 PPI
+ 0001 01 COMPOSITE
+ 0002 01 CAPPI
+ 0003 01 VERTICAL SECTION
+ 0004 01 ALPHANUMERIC DATA
+ 0005 01 MAP OF SUBJECT CLUTTER
+ 0006 01 MAP
+ 0007 01 TEST PICTURE
+ 0008 01 COMMENTS
+ 0009 01 MAP OF GROUND OCCULTATION
+ 0010 01 MAP OF RADAR BEAM HEIGHT
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+030032 0009 0001 01 MAP
+ 0002 01 SATELLITE IR
+ 0003 01 SATELLITE VIS
+ 0004 01 SATELLITE WV
+ 0005 01 SATELLITE MULTISPECTRAL
+ 0006 01 SYNOPTIC OBSERVATIONS
+ 0007 01 FORECAST PARAMETERS
+ 0008 01 LIGHTNING DATA
+ 0015 01 OTHER DATA
+031021 0004 0001 01 1 BIT INDICATOR OF QUALITY, 0= GOOD; 1=SUSPECT OR BAD
+ 0002 02 2 BIT INDICATOR OF QUALITY, 0= GOOD; 1= SLIGHTLY SUSPECTED;
+ 2= HIGHLY SUSPECTED; 3=BAD
+ 0007 01 PERCENTAGE CONFIDENCE
+ 0063 01 MISSING VALUE
+031031 0001 0001 01 DATA NOT PRESENT
+033002 0004 0000 01 DATA NOT SUSPECT
+ 0001 01 DATA SUSPECT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033003 0005 0000 01 DATA NOT SUSPECT
+ 0001 01 DATA SLIGHTLY SUSPECT
+ 0002 01 DATA HIGHTLY SUSPECT
+ 0003 01 DATA CONSIDERED UNFIT FOR USE
+ 0007 01 MISSING VALUE
+033005 0023 0001 01 NO AUTOMATED METEOROLOGICAL DATA CHECKS PERFORMED
+ 0002 01 PRESSURE DATA SUSPECT
+ 0003 01 WIND DATA SUSPECT
+ 0004 01 DRY-BULB TEMPERATURE DATA SUSPECT
+ 0005 01 WET-BULB TEMPERATURE DATA SUSPECT
+ 0006 01 HUMIDITY DATA SUSPECT
+ 0007 01 GROUND TEMPERATURE DATA SUSPECT
+ 0008 01 SOIL TEMPERATURE (DEPTH 1) DATA SUSPECT
+ 0009 01 SOIL TEMPERATURE (DEPTH 2) DATA SUSPECT
+ 0010 01 SOIL TEMPERATURE (DEPTH 3) DATA SUSPECT
+ 0011 01 SOIL TEMPERATURE (DEPTH 4) DATA SUSPECT
+ 0012 01 SOIL TEMPERATURE (DEPTH 5) DATA SUSPECT
+ 0013 01 CLOUD DATA SUSPECT
+ 0014 01 VISIBILITY DATA SUSPECT
+ 0015 01 PRESENT WEATHER DATA SUSPECT
+ 0016 01 LIGHTNING DATA SUSPECT
+ 0017 01 ICE DEPOSIT DATA SUSPECT
+ 0018 01 PRECIPITATION DATA SUSPECT
+ 0019 01 STATE OF GROUND DATA SUSPECT
+ 0020 01 SNOW DATA SUSPECT
+ 0021 01 WATER CONTENT DATA SUSPECT
+ 0022 01 EVAPORATION/EVAPOTRANSPIRATION DATA SUSPECT
+ 0023 01 SUNSHINE DATA SUSPECT
+033006 0005 0000 01 SELF-CHECK OK
+ 0001 01 AT LEAST ONE WARNING ACTIVE, NO ALARMS
+ 0002 01 AT LEAST ONE ALARM ACTIVE
+ 0003 01 SENSOR FAILURE
+ 0007 01 MISSING VALUE
+033015 0016 0000 01 PASSED ALL CHECKS
+ 0001 01 MISSING-DATA CHECK
+ 0002 01 DESCENDING/REASCENDING BALLOON CHECK
+ 0003 01 DATA PLAUSIBILITY CHECK (ABOVE LIMITS)
+ 0004 01 DATA PLAUSIBILITY CHECK (BELOW LIMITS)
+ 0005 01 SUPERADIABATIC LAPSE RATE CHECK
+ 0006 01 LIMITING ANGLES CHECK
+ 0007 01 ASCENSION RATE CHECK
+ 0008 01 EXCESSIVE CHANGE FROM PREVIOUS FLIGHT
+ 0009 01 BALLOON OVERHEAD CHECK
+ 0010 01 WIND SPEED CHECK
+ 0011 01 WIND DIRECTION CHECK
+ 0012 01 DEPENDENCY CHECK
+ 0013 01 DATA VALID BUT MODIFIED
+ 0014 01 DATA OUTLIER CHECK
+ 0063 01 MISSING DATA
+033020 0008 0000 01 GOOD
+ 0001 01 INCONSISTENT
+ 0002 01 DOUBTFUL
+ 0003 01 WRONG
+ 0004 01 NOT CHECKED
+ 0005 01 HAS BEEN CHECKED
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+033021 0004 0000 01 WITHIN LIMITS
+ 0001 01 OUTSIDE LIMITS
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033022 0004 0000 01 GOOD (SEVERAL IDENTICAL REPORTS HAVE BEEN RECEIVED)
+ 0001 01 DUBIOUS (NO IDENTICAL REPORT HAVE BEEN RECEIVED)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033023 0004 0000 01 RELIABLE (LOCATION WAS MADE OVER TWO SATELLITE PASSES)
+ 0001 01 LATEST KNOWN (NO LOCATION OVER CORRESPONDING PASS)
+ 0002 01 DUBIOUS
+ 0003 01 MISSING VALUE
+033024 0010 0000 01 RESERVED
+ 0001 01 EXELLENT - WITHIN 3 METRES
+ 0002 01 GOOD - WITHIN 10 METRES
+ 0003 01 FAIR - WITHIN 20 METRES
+ 0004 01 POOR - MORE THAN 20 METRES
+ 0005 01 EXELLENT -WITHIN 10 FEET
+ 0006 01 GOOD WITHIN-30 FEET
+ 0007 01 FAIR WITHIN 60 FEET
+ 0008 01 POOR - MORE THAN 60 FEET
+ 0015 01 MISSING VALUE
+033025 0005 0000 01 TIME INTERPOLATED, LATITUDE AND LONGITUDE REPORTED
+ 0001 01 TIME REPORTED, LATITUDE AND LONGITUDE INTERPOLATED
+ 0002 01 TIME, LATITUDE AND LONGITUDE INTERPOLATED
+ 0003 01 TIME, LATITUDE AND LONGITUDE REPORTED
+ 0007 01 MISSING VALUE
+033026 0010 0000 01 NORMAL OPERATIONS - MEASUREMENT MODE
+ 0001 01 NORMAL OPERATIONS - NON-MEASUREMENT MODE
+ 0002 01 SMALL RH
+ 0003 01 HUMIDITY ELEMENT IS WET
+ 0004 01 HUMIDITY ELEMENT IS CONTAMINATED
+ 0005 01 HEATER FAIL
+ 0006 01 HEATER FAIL AND WET/CONTAMINATED HUMIDITY ELEMENT
+ 0007 01 SINGLE VALIDITY BAD
+ 0008 01 NUMERIC ERROR
+ 0063 01 MISSING VALUE
+033027 0005 0000 01 RADIUS >= 1500 M
+ 0001 01 500 M <= RADIUS < 1500 M
+ 0002 01 250 M <= RADIUS < 500 M
+ 0003 01 RADIUS < 250 M
+ 0007 01 MISSING VALUE
+033028 0006 0000 01 RESERVED
+ 0001 01 NOMINAL
+ 0002 01 DEGRADED BY SW ERROR; ANY ERROR REPORTED BY THE ALGORITHMS
+ 0003 01 DEGRADED BY INSTRUMENT ERROR
+ 0004 01 DEGRADED BY CORRUPTED/MISSING ADF
+ 0007 01 MISSING
+033030 0007 0001 01 DO NOT USE SCAN FOR PRODUCT GENERATION
+ 0002 01 TIME SEQUENCE ERROR DETECTED WITH THIS SCAN
+ 0003 01 DATA GAP PRECEDES THIS SCAN
+ 0004 01 NO CALIBRATION
+ 0005 01 NO EARTH LOCATION
+ 0006 01 FIRST GOOD TIME FOLLOWING A CLOCK UPDATE
+ 0007 01 INSTRUMENT STATUS CHANGED WITH THIS SCAN
+033031 0021 0001 01 TIME FIELD IS BAD BUT CAN PROBABLY BE INFERRED FROM THE PREVIOUS GOOD TIME
+ 0002 01 TIME FIELD IS BAD AND CAN�~@~YT BE INFERRED FROM THE PREVIOUS GOOD TIME
+ 0003 04 THIS RECORD STARTS A SEQUENCE THAT IS INCONSISTENT WITH
+ PREVIOUS TIMES (I.E. THERE IS A TIME DISCONTINUITY). THIS MAY OR MAY
+ NOT BE ASSOCIATED WITH A SPACECRAFT CLOCK UPDATE (SEE SCAN LINE
+ STATUS FLAGS FOR ATOVS)
+ 0004 02 START OF A SEQUENCE THAT APPARENTLY REPEATS SCAN
+ TIMES THAT HAVE BEEN PREVIOUSLY ACCEPTED
+ 0005 01 SCAN LINE WAS NOT CALIBRATED BECAUSE OF BAD TIME
+ 0006 03 SCAN LINE WAS CALIBRATED USING FEWER THAN THE PREFERRED
+ NUMBER OF SCAN LINES BECAUSE OF PROXIMATY TO START OR
+ END OF DATA OR TO A DATA GAP
+ 0007 01 SCAN LINE WAS NOT CALIBRATED BECAUSE OF BAD OR INSUFFICIENT PRT DATA
+ 0008 01 SCAN LINE WAS CALIBRATED BUT WITH MARGINAL PRT DATA
+ 0009 01 SOME UNCALIBRATED CHANNELS ON THIS SCAN
+ 0010 01 UNCALIBRATED DUE TO INSTRUMENT MODE
+ 0011 01 QUESTIONABLE CALIBRATION BECAUSE OF ANTENNA POSITION ERROR OF SPACE VIEW
+ 0012 01 QUESTIONABLE CALIBRATION BECAUSE OF ANTENNA POSITION ERROR OF BLACK BODY
+ 0013 01 NOT EARTH LOCATED BECAUSE OF BAD TIME
+ 0014 03 EARTH LOCATION QUESTIONABLE BECAUSE OF
+ QUESTIONABLE TIME CODE (SEE TIME PROBLEM
+ CODE BITS)
+ 0015 02 EARTH LOCATION QUESTIONABLE - ONLY MARGINAL AGREEMENT
+ WITH REASONABLENESS CHECK
+ 0016 01 EARTH LOCATION QUESTIONABLE - FAILS REASONABLENESS CHECK
+ 0017 01 EARTH LOCATION QUESTIONABLE BECAUSE OF ANTENNA POSITION CHECK
+ 0018 01 SCAN LINE CALIBRATION COLD BLACK BODY
+ 0019 01 SCAN LINE CALIBRATION WARM BLACK BODY
+ 0020 01 SCAN LINE CALIBRATION SPACE VIEW
+ 0021 01 EARTH VIEW
+033032 0006 0001 01 NO GOOD BLACKBODY COUNTS FOR SCAN LINE
+ 0002 01 NO GOOD SPACE VIEW COUNTS FOR THIS LINE
+ 0003 01 NO GOOD PRTS FOR THIS LINE
+ 0004 01 SOME BAD BLACKBODY VIEW COUNTS FOR THIS LINE
+ 0005 01 SOME BAD SPACE VIEW COUNTS FOR THIS LINE
+ 0006 01 SOME BAD PRT TEMPS ON THIS LINE
+033033 0023 0001 01 SET IF SECONDARY CALIBRATION USED
+ 0002 02 BRIGHTNESS TEMPERATURE IN CHANNEL 1 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0003 02 BRIGHTNESS TEMPERATURE IN CHANNEL 2 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0004 02 BRIGHTNESS TEMPERATURE IN CHANNEL 3 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0005 02 BRIGHTNESS TEMPERATURE IN CHANNEL 4 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0006 02 BRIGHTNESS TEMPERATURE IN CHANNEL 5 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0007 02 BRIGHTNESS TEMPERATURE IN CHANNEL 6 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0008 02 BRIGHTNESS TEMPERATURE IN CHANNEL 7 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0009 02 BRIGHTNESS TEMPERATURE IN CHANNEL 8 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0010 02 BRIGHTNESS TEMPERATURE IN CHANNEL 9 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0011 02 BRIGHTNESS TEMPERATURE IN CHANNEL 10 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0012 02 BRIGHTNESS TEMPERATURE IN CHANNEL 11 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0013 02 BRIGHTNESS TEMPERATURE IN CHANNEL 12 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0014 02 BRIGHTNESS TEMPERATURE IN CHANNEL 13 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0015 02 BRIGHTNESS TEMPERATURE IN CHANNEL 14 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0016 02 BRIGHTNESS TEMPERATURE IN CHANNEL 15 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0017 02 BRIGHTNESS TEMPERATURE IN CHANNEL 16 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0018 02 BRIGHTNESS TEMPERATURE IN CHANNEL 17 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0019 02 BRIGHTNESS TEMPERATURE IN CHANNEL 18 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0020 02 BRIGHTNESS TEMPERATURE IN CHANNEL 19 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0021 02 BRIGHTNESS TEMPERATURE IN CHANNEL 20 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0022 01 SET IF ALL CHANNELS ARE MISSING
+ 0023 01 SUSPECT
+033035 0010 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 01 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND PASSED
+ 0002 01 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND DELETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND FAILED
+ 0005 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND RE-INSERTED
+ 0006 01 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND NOT MANUALLY CHECCKED
+ 0007 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE
+ AND MANUALLY CHECKED AND FAILED
+ 0008 01 MANUALLY CHECKED AND FAILED
+ 0015 01 MISSING VALUE
+033037 0020 0001 01 U DEPARTURE FROM GUESS
+ 0002 01 V DEPARTURE FROM GUESS
+ 0003 01 U & V DEPARTURE FROM GUESS
+ 0004 01 U ACCELERATION
+ 0005 01 V ACCELERATION
+ 0006 01 U & V ACCELERATION
+ 0007 01 POSSIBLE LAND FEATURE
+ 0008 01 U ACCELERATION AND POSSIBLE LAND FEATURE
+ 0009 01 V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0010 01 U & V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0011 01 BAD WIND GUESS
+ 0012 01 CORRELATION FAILURE
+ 0013 01 SEARCH BOX OFF EDGE OF AREA
+ 0014 01 TARGET BOX OFF EDGE OF AREA
+ 0015 01 PIXEL BRIGHTNESS OUT OF BOUNDS (NOISY LINE)
+ 0016 01 TARGET OUTSIDE OF LAT/LONG BOX
+ 0017 01 TARGET OUTSIDE OF PRESSURE MIN/MAX
+ 0018 01 AUTOEDITOR FLAGGED SLOW VECTOR
+ 0019 01 AUTOEDITOR FLAGGED VECTORS
+033038 0009 0001 01 TOTAL ZENITH DELAY QUALITY IS CONSIDERED POOR
+ 0002 01 GALILEO SATELLITES USED
+ 0003 01 GLONASS SATELLITES USED
+ 0004 01 GPS SATELLITES USED
+ 0005 01 METEOROLOGICAL DATA APPLIED
+ 0006 01 ATMOSPHERIC LOADING CORRECTION APPLIED
+ 0007 01 OCEAN TIDE LOADING APPLIED
+ 0008 01 CLIMATE QUALITY DATA PROCESSING
+ 0009 01 NEAR-REAL TIME DATA PROCESSING
+033039 0009 0001 01 NON-NOMINAL QUALITY
+ 0002 01 OFFLINE PRODUCT
+ 0003 01 ASCENDING OCCULTATION FLAG
+ 0004 01 EXCESS PHASE PROCESSING NON-NOMINAL
+ 0005 01 BENDING ANGLE PROCESSING NON-NOMINAL
+ 0006 01 REFRACTIVITY PROCESSING NON-NOMINAL
+ 0007 01 METEOROLOGICAL PROCESSING NON-NOMINAL
+ 0014 01 BACKGROUND PROFILE NON-NOMINAL
+ 0015 01 BACKGROUND (I.E. NOT RETRIEVED) PROFILE PRESENT
+033041 0004 0000 01 THE FOLLOWING VALUE IS THE TRUE VALUE
+ 0001 02 THE FOLLOWING VALUE IS HIGHER THAN THE TRUE VALUE
+ (THE MEASUREMENT HIT THE LOWER LIMIT OF THE INSTRUMENT)
+ 0002 02 THE FOLLOWING VALUE IS LOWER THAN THE TRUE VALUE
+ (THE MEASUREMENT HIT THE HIGHER LIMIT OF THE INSTRUMENT)
+ 0003 01 MISSING VALUE
+033042 0005 0000 01 EXCLUSIVE LOWER LIMIT (>)
+ 0001 01 INCLUSIVE LOWER LIMIT (>=)
+ 0002 01 EXCLUSIVE UPPER LIMIT (<)
+ 0003 01 INCLUSIVE UPPER LIMIT (=<)
+ 0007 01 MISSING VALUE
+033043 0004 0001 02 SEA MDS. NADIR ONLY SST RETRIEVAL USED 3.7 MICRON
+ CHANNEL. LAND MDS RESERVED
+ 0002 02 SEA MDS. DUAL VIEW SST RETRIEVAL USED 3.7 MICRON
+ CHANNEL. LAND MDS RESERVED.
+ 0003 01 NADIR VIEW CONTAINS DAY TIME DATA
+ 0004 01 FORWARD VIEW CONTAINS DAY TIME DATA
+033044 0014 0001 01 INPUT DATA MEAN OUTSIDE NOMINAL RANGE FLAG
+ 0002 01 INPUT DATA STANDARD DEVIATION OUTSIDE NOMINAL RANGE FLAG
+ 0003 01 NUMBER OF INPUT DATA GAPS > THRESHOLD VALUE
+ 0004 01 PERCENTAGE OF MISSING LINES > THRESHOLD VALUE
+ 0005 01 DOPPLER CENTROID UNCERTAIN. CONFIDENCE MEASURE < SPECIFIC VALUE
+ 0006 01 DOPPLER AMBIGUITY ESTIMATE UNCERTAIN. CONFIDENCE MEASURE < SPECIFIC VALUE
+ 0007 01 OUTPUT DATA MEAN OUTSIDE NOMINAL RANGE FLAG
+ 0008 01 OUTPUT DATA STANDARD DEVIATION OUTSIDE NOMINAL RANGE FLAG
+ 0009 01 CHIRP RECONSTRUCTION FAILED OR IS OF LOW QUALITY FLAG
+ 0010 01 DATA SET MISSING
+ 0011 01 INVALID DOWNLINK PARAMETERS
+ 0012 02 AZIMUTH CUT-OFF ITERATION COUNT. THE AZIMUTH
+ CUT-OFF FIT DID NOT CONVERGE WITHIN A MINIMUM NUMBER OF ITERATIONS
+ 0013 02 AZIMUTH CUT-OFF FIT DID NOT CONVERGE WITHIN A MINIMUM
+ NUMBER OF ITERATIONS
+ 0014 03 PHASE INFORMATION CONFIDENCE MEASURE. THE IMAGINARY SPECTRAL
+ PEAK IS LESS THAN A MINIMUM THRESHOLD, OR THE ZERO LAG SHIFT
+ IS GREATER THAN A MINIMUM THRESHOLD
+033047 0026 0001 01 ERROR DETECTED AND ATTEMPTS TO RECOVER MADE
+ 0002 01 ANOMALY IN ON-BOARD DATA HANDLING (OBDH) VALUE DETECTED
+ 0003 01 ANOMALY IN ULTRA STABLE OSCILLATOR PROCESSING (USOP) VALUE DETECTED
+ 0004 01 ERRORS DETECTED BY ON-BOARD COMPUTER
+ 0005 01 AUTOMATIC GAIN CONTROL (AGC) OUT OF RANGE
+ 0006 01 RX DELAY FAULT. RX DISTANCE OUT OF RANGE
+ 0007 01 WAVE FORM SAMPLES FAULT IDENTIFIER. ERROR
+ 0012 01 BRIGHTNESS TEMPERATURE (CHANNEL 1) OUT OF RANGE
+ 0013 01 BRIGHTNESS TEMPERATURE (CHANNEL 2) OUT OF RANGE
+ 0014 01 RESERVED
+ 0015 01 KU OCEAN RETRACKING ERROR
+ 0016 01 S OCEAN RETRACKING ERROR
+ 0017 01 KU ICE 1 RETRACKING ERROR
+ 0018 01 S ICE 1 RETRACKING ERROR
+ 0019 01 KU ICE 2 RETRACKING ERROR
+ 0020 01 S ICE 2 RETRACKING ERROR
+ 0021 01 KU SEA ICE RETRACKING ERROR
+ 0022 01 ARITHMETIC FAULT ERROR
+ 0023 01 METEO DATA STATE. NO MAP
+ 0024 01 METEO DATA STATE. 1 MAP
+ 0025 01 METEO DATA STATE 2 MAPS DEGRADED
+ 0026 01 METEO DATA STATE 2 MAPS NOMINAL
+ 0027 01 ORBIT PROPAGATOR STATUS FOR PROPAGATION MODE, SEVERAL ERRORS
+ 0028 01 ORBIT PROPAGATOR STATUS FOR PROPAGATION MODE, WARNING DETECTED
+ 0029 01 ORBIT PROPAGATOR STATUS FOR INITIALISATION MODE, SEVERAL ERRORS
+ 0030 01 ORBIT PROPAGATOR STATUS FOR INITIALISATION MODE, WARNING DETECTED
+033048 0004 0000 01 INVERSION SUCCESSFUL
+ 0001 01 INVERSION NOT SUCCESSFUL
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033049 0004 0000 01 EXTERNAL WIND DIRECTION USED DURING INVERSION
+ 0001 01 EXTERNAL WIND DIRECTION NOT USED DURING INVERSION
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033050 0008 0000 01 UNQUALIFIED
+ 0001 01 CORRECT VALUE (ALL CHECKS PASSED)
+ 0002 01 PROBABLY GOOD BUT VALUE INCONSISTENT WITH STATISTICS (DIFFER FROM CLIMATOLOGY)
+ 0003 01 PROBABLY BAD (SPIKE, GRADIENT, �~E IF OTHER TESTS PASSED)
+ 0004 02 BAD VALUE, IMPOSSIBLE VALUE (OUT OF SCALE, VERTICAL
+ INSTABILITY, CONSTANT PROFILE)
+ 0005 01 VALUE MODIFIED DURING QUALITY CONTROL
+ 0008 01 INTERPOLATED VALUE
+ 0015 01 MISSING VALUE
+033052 0020 0001 01 DATA BLOCK 1 INVALID (S BAND)
+ 0002 01 DATA BLOCK 2 INVALID (S BAND)
+ 0003 01 DATA BLOCK 3 INVALID (S BAND)
+ 0004 01 DATA BLOCK 4 INVALID (S BAND)
+ 0005 01 DATA BLOCK 5 INVALID (S BAND)
+ 0006 01 DATA BLOCK 6 INVALID (S BAND)
+ 0007 01 DATA BLOCK 7 INVALID (S BAND)
+ 0008 01 DATA BLOCK 8 INVALID (S BAND)
+ 0009 01 DATA BLOCK 9 INVALID (S BAND)
+ 0010 01 DATA BLOCK 10 INVALID (S BAND)
+ 0011 01 DATA BLOCK 11 INVALID (S BAND)
+ 0012 01 DATA BLOCK 12 INVALID (S BAND)
+ 0013 01 DATA BLOCK 13 INVALID (S BAND)
+ 0014 01 DATA BLOCK 14 INVALID (S BAND)
+ 0015 01 DATA BLOCK 15 INVALID (S BAND)
+ 0016 01 DATA BLOCK 16 INVALID (S BAND)
+ 0017 01 DATA BLOCK 17 INVALID (S BAND)
+ 0018 01 DATA BLOCK 18 INVALID (S BAND)
+ 0019 01 DATA BLOCK 19 INVALID (S BAND)
+ 0020 01 DATA BLOCK 20 INVALID (S BAND)
+033053 0020 0001 01 DATA BLOCK 1 INVALID (KU BAND)
+ 0002 01 DATA BLOCK 2 INVALID (KU BAND)
+ 0003 01 DATA BLOCK 3 INVALID (KU BAND)
+ 0004 01 DATA BLOCK 4 INVALID (KU BAND)
+ 0005 01 DATA BLOCK 5 INVALID (KU BAND)
+ 0006 01 DATA BLOCK 6 INVALID (KU BAND)
+ 0007 01 DATA BLOCK 7 INVALID (KU BAND)
+ 0008 01 DATA BLOCK 8 INVALID (KU BAND)
+ 0009 01 DATA BLOCK 9 INVALID (KU BAND)
+ 0010 01 DATA BLOCK 10 INVALID (KU BAND)
+ 0011 01 DATA BLOCK 11 INVALID (KU BAND)
+ 0012 01 DATA BLOCK 12 INVALID (KU BAND)
+ 0013 01 DATA BLOCK 13 INVALID (KU BAND)
+ 0014 01 DATA BLOCK 14 INVALID (KU BAND)
+ 0015 01 DATA BLOCK 15 INVALID (KU BAND)
+ 0016 01 DATA BLOCK 16 INVALID (KU BAND)
+ 0017 01 DATA BLOCK 17 INVALID (KU BAND)
+ 0018 01 DATA BLOCK 18 INVALID (KU BAND)
+ 0019 01 DATA BLOCK 19 INVALID (KU BAND)
+ 0020 01 DATA BLOCK 20 INVALID (KU BAND)
+033060 0004 0000 01 PARAMETER=GOOD
+ 0001 01 PARAMETER=BAD
+ 0002 01 PARAMETER=RESERVED
+ 0003 01 MISSING
+033075 0005 0001 01 GAP IN RAW DATA RECORD DATA DETECTED
+ 0002 01 RECORDED TIME IS NOT IN SEQUENCE
+ 0003 01 LAMDA MONITORED CALCULATION CANNOT BE CALCULATED
+ 0004 02 THE MEASURED TEMPERATURE OF ANY INSTRUMENT COMPONENT
+ IS OUTSIDE THE ALLOWABLE RANGE
+ 0005 02 AT LEAST ONE OF THE MONITORED INSTRUMENT TEMPERATURES
+ HAS DRIFTED MORE THAN A SPECIFIED TOLERANCE VALUE
+033076 0002 0001 01 LUNAR INTRUSION ON FIRST DEEP SPACE VIEW
+ 0002 01 LUNAR INTRUSION ON SECOND DEEP SPACE VIEW
+033077 0012 0001 01 DEGRADED SDR QUALITY
+ 0002 01 INVALID SDR QUALITY
+ 0003 01 INVALID SDR GEOLOCATION INFORMATION
+ 0004 01 DEGRADED RADIOMETRIC CALIBRATION
+ 0005 01 INVALID RADIOMETRIC CALIBRATION
+ 0006 01 DEGRADED SPECTRAL CALIBRATION
+ 0007 01 INVALID SPECTRAL CALIBRATION
+ 0008 01 FRINGE COUNT ERROR DETECTED AND CORRECTED
+ 0009 01 DAy/NIGHT INDICATOR
+ 0010 01 INVALID RDR DATA
+ 0011 01 SIGNIFICANT FRINGE COUNT ERROR DETECTED
+ 0012 01 BIT TRIM FAILED
+033078 0005 0000 01 NOMINAL- ALTITUDE AND EPHEMERIS DATA AVAILABLE
+ 0001 01 MISSING AT MOST A SMALL GAP OF ALTITUDE AND EPHEMERIS
+ 0002 02 MISSING MORE THAN A SMALL GAP OF ALTITUDE AND EPHEMERIS
+ DATA, BUT NO MORE THAN A GRANULE BOUNDARY
+ 0003 01 MISSING MORE THAN GRANULE BOUNDARY OF ALTITUDE AND EPHEMERIS
+ 0015 01 MISSING VALUE
+033195 0004 0000 01 DEALIASING NOT USED
+ 0001 01 DEALIASING USED
+ 0002 01 RESERVED
+ 0003 01 MISSING
+033205 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033206 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033207 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033208 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033209 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033220 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 REPORT REJECTED THROUGH THE NAMELIST
+ 0017 01 MODEL SUR. TOO FAR FROM STAT. ALT.
+ 0018 01 MISSING STATION ALTITUDE
+ 0019 01 REPORT OVER SEA
+ 0020 01 REPORT OVER LAND
+ 0021 01 REDUNDANT REPORT
+ 0022 01 TIME OUT OF RANGE
+ 0023 01 VERTICAL POSITION OUT OF RANGE
+ 0024 01 HORIZONTAL POSITION OUT OF RANGE
+ 0025 01 ACTIVATED BY WHITELIST
+ 0026 01 ACTIVATED DUE TO RDB FLAG
+ 0027 01 REJECTED DUE TO RDB FLAG
+ 0028 01 BAD REPORTING PRACTICE
+ 0029 01 ALL DATA REJECTED
+ 0030 01 NO DATA IN THE REPORT
+033221 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033222 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033223 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033224 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033225 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033226 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033227 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033228 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033229 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 THINNED REPORT
+033230 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033232 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 BLACKLISTED DUE TO DISTANCE FROM REF. POINT
+ 0015 01 BLACKLISTED DUE TO MODEL OROGRAPHY
+ 0016 01 BLACKLISTED DUE TO LAND/SEA MASK
+ 0017 01 STATION ALTITUDE BLACKLISTED
+ 0018 01 LONGITUDE BLACKLISTED
+ 0019 01 LATITUDE BLACKLISTED
+ 0020 01 TIME BLACKLISTED
+ 0021 01 DATE BLACKLISTED
+ 0022 01 INSTRUMENT TYPE BLACKLISTED
+ 0023 01 CODE TYPE BLACKLISTED
+ 0024 01 STATION ID BLACKLISTED
+ 0025 01 BLACKLISTED DUE TO FIRST GUESS DEPARTURE
+ 0026 01 BLACKLISTED DUE TO OBSERVED VALUE
+ 0027 01 BLACKLISTED DUE TO TYPE OF VERTICAL COORDINATE
+ 0028 01 BLACKLISTED DUE TO PRESSURE CODE
+ 0029 01 VARIABLE NAME BLACKLISTED
+ 0030 01 MONTHLY MONITORING
+033233 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 REPORT BLACK LISTED
+ 0028 01 REPORT REJECTED
+ 0029 01 REPORT PASSIVE
+ 0030 01 REPORT ACTIVE
+033234 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 DATUM BLACK LISTED
+ 0028 01 DATUM REJECTED
+ 0029 01 DATUM PASSIVE
+ 0030 01 DATUM ACTIVE
+033236 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 DATUM REJECTED DUE TO REJECTED REPORT
+ 0006 01 COMBINED FLAGGING
+ 0007 01 DATUM REJECTED DUE TO NAMELIST
+ 0008 01 VERTICAL COORDINATE CHANGE FROM Z TO P
+ 0009 01 VERTICAL CONSISTENCY CHECK
+ 0010 01 LEVEL SELECTION
+ 0011 01 MULTI LEVEL CHECK
+ 0012 01 TOO MANY SURFACE DATA/LEVELS
+ 0013 01 DUPLICATED DATUM/LEVEL
+ 0014 01 NOT AN ANALYSIS VARIABLE
+ 0015 01 REPORT OVER SEA
+ 0016 01 REPORT OVER LAND
+ 0017 01 REDUNDANT LEVEL
+ 0018 01 REDUNDANT DATUM
+ 0019 01 TOO BIG OBSERVATION ERROR
+ 0020 01 TOO BIG DEPARTURE IN ASSIMILATION
+ 0021 01 TOO BIG FIRST GUESS DEPARTURE
+ 0022 01 REFERENCE LEVEL POSITION OUT OF RANGE
+ 0023 01 VERTICAL POSITION OUT OF RANGE
+ 0024 01 BAD REPORTING PRACTICE
+ 0025 01 ACTIVATED BY WHITELIST
+ 0026 01 ACTIVATED DUE TO RDB FLAG
+ 0027 01 REJECTED DUE TO RDB FLAG
+ 0028 01 MISSING FIRST GUESS VALUE
+ 0029 01 MISSING OBSERVED VALUE
+ 0030 01 MISSING VERTICAL COORDINATE
+033237 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033238 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033239 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033240 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033243 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033244 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033245 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 LAYER FORMED BY SUMMING UP
+ 0029 01 LAYER FORMED BY THINNING UP
+ 0030 01 NOT PREDEFINED LAYER
+033246 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033247 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033248 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033249 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 BLACKLISTED DUE TO FIRST GUESS DEPARTURE
+ 0025 01 BLACKLISTED DUE TO OBSERVED VALUE
+ 0026 01 BLACKLISTED DUE TO TYPE OF VERTICAL COORDINATE
+ 0027 01 BLACKLISTED DUE TO DISTANCE FROM REFERENCE POINT
+ 0028 01 BLACKLISTED DUE TO PRESSURE CODE
+ 0029 01 VARIABLE BLACKLISTED
+ 0030 01 PRESSURE BLACKLISTED
+033252 0010 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 01 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND PASSED
+ 0002 01 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND DELETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND FAILED
+ 0005 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND RE-INSERTED
+ 0006 01 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND NOT MANUALLY CHECCKED
+ 0007 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE
+ AND MANUALLY CHECKED AND FAILED
+ 0008 01 MANUALLY CHECKED AND FAILED
+ 0015 01 MISSING VALUE
+
+033254 0019 0001 01 U DEPARTURE FROM GUESS
+ 0002 01 V DEPARTURE FROM GUESS
+ 0003 01 U & V DEPARTURE FROM GUESS
+ 0004 01 U ACCELERATION
+ 0005 01 V ACCELERATION
+ 0006 01 U & V ACCELERATION
+ 0007 01 POSSIBLE LAND FEATURE
+ 0008 01 U ACCELERATION AND POSSIBLE LAND FEATURE
+ 0009 01 V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0010 01 U & V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0011 01 BAD WIND GUESS
+ 0012 01 CORRELATION FAILURE
+ 0013 01 SEARCH BOX OFF EDGE OF AREA
+ 0014 01 TARGET BOX OFF EDGE OF AREA
+ 0015 01 PIXEL BRIGHTNESS OUT OF BOUNDS (NOISY LINE)
+ 0016 01 TARGET OUTSIDE OF LAT/LONG BOX
+ 0017 01 TARGET OUTSIDE OF PRESSURE MIN/MAX
+ 0018 01 AUTOEDITOR FLAGGED SLOW VECTOR
+ 0019 01 AUTOEDITOR FLAGGED VECTORS
+035000 0011 0011 01 000-099 INTERNATIONAL FM CODES
+ 0001 01 100-199 RA I CODES
+ 0002 01 200-299 RA II CODES
+ 0003 01 300-399 RA III CODES
+ 0004 01 400-499 RA IV CODES
+ 0005 01 500-599 RA V CODES
+ 0006 01 600-699 RA VI CODES
+ 0007 01 700-799 ANTARCTIC CODES
+ 0008 01 800-999 RESERVED
+ 0009 01 1000-1022 NOT USED
+ 1023 01 MISSING VALUE
+035001 0004 0000 01 REAL TIME
+ 0001 01 NEAR-REAL TIME
+ 0002 01 NON-REAL TIME
+ 0007 01 MISSING VALUE
+035030 0010 0000 01 NO DISCREPANCIES
+ 0001 02 NON-COMPLIANCE WITH STANDARD AND RECOMMENDED PRACTICES
+ AND PROCEDURES INCLUDINGTHOSE OF MONITORING
+ 0002 01 CATALOGUES OF METEOROLOGICAL BULLETINS NOT UPDATED IN A TIMELY MANNER
+ 0003 01 INCORRECT ROUTEING DIRECTORIES
+ 0004 01 LACK OF FLEXIBILITY IN THE ROUTEING ARRANGEMENTS
+ 0005 01 DEFICIENCIES IN THE OPERATION OF GTS CENTRES AND CIRCUITS
+ 0006 01 LOSS OF DATA OR DELAYS IN RELAYING DATA ON THE GTS
+ 0007 01 ROUTEING OF DATA DIFFERENT FROM THE ROUTEING PROVIDED IN THE PLAN
+ 0008 01 VARIOUS MALPRACTICES
+ 0015 01 MISSING VALUE
+035031 0020 0001 01 SUFFICIENT AND ALL OF ACCEPTABLE QUALITY
+ 0002 01 SUFFICIENT BUT PARTLY OF ACCEPTABLE QUALITY
+ 0003 01 INSUFFICIENT BUT ALL OF ACCEPTABLE QUALITY
+ 0004 01 INSUFFICIENT AND OF UNACCEPTABLE QUALITY
+ 0005 01 SOME MESSAGES NOT COMPLETE
+ 0006 01 SUSPECT OR WRONGLY CODED GROUPS COULD NOT BE INTERPRETED CONFIDENTLY
+ 0007 01 GROSS CODING ERRORS
+ 0008 01 TRANSMISSION SEQUENTIAL ORDER NOT OBSERVED
+ 0009 01 REPORT COMPLETELY GARBLED AND THUS DISCARDED
+ 0010 01 DEFICIENCIES IDENTIFIED AND RECTIFIED
+ 0011 01 DEFICIENCIES IDENTIFIED BUT NOT RECTIFIED
+ 0012 01 DEFICIENCIES NOT IDENTIFIED
+ 0013 01 MEASURING ERRORS
+ 0014 01 MUTUAL INCONSISTENCY
+ 0015 01 TEMPORAL INCONSISTENCY
+ 0016 01 FORECAST ERROR
+ 0017 01 BIAS
+ 0018 01 IMPROVE SYSTEM OF QUALITY CONTROL
+ 0019 01 EXPAND TRAINING PROGRAMMES
+ 0123 01 MISSING VALUE
+035032 0010 0001 01 DATA GROUPS MISSING DUE TO RADIO FADING
+ 0002 01 DATA GROUPS MISSING DUE TO OUTAGE OF CENTRE
+ 0003 01 DATA GROUPS MISSING DUE TO OUTAGE OF CIRCUIT
+ 0004 01 NON-IMPLEMENTATION OR MAINTENANCE OF REQUIRED RBSN DENSITY
+ 0005 01 SHORTAGE OF QUALIFIED STAFF TO MAN STATIONS
+ 0006 01 LACK OF CONSUMABLES
+ 0007 01 INSTRUMENT FAILURE
+ 0008 01 NON-ADHERENCE TO TELECOMMUNICATION PROCEDURES
+ 0009 01 SOME OBSERVING PROGRAMMES CEASED
+ 0015 01 MISSING VALUE
+035033 0012 0001 01 NO DEFICIENCY
+ 0002 01 OBSERVATIONS NOT MADE REGULARLY
+ 0003 01 OBSERVATIONS NOT MADE AT RIGHT TIME
+ 0004 01 OBSERVATIONS MADE BUT NOT DISSEMINATED
+ 0005 01 OBSERVATIONS MADE AND SENT TO INCORRECT USERS
+ 0006 01 COLLECTION NOT RECEIVED
+ 0007 01 COLLECTION TRANSMITTED LATE
+ 0008 01 COLLECTION NOT TRANSMITTED
+ 0009 01 DIFFICULTIES IN HF PROPAGATION AND SELECTION OF SUITABLE FREQUENCY
+ 0010 01 DIFFICULTIES IN MAINTENANCE OF COMMUNICATION EQUIPMENT AT REMOTE STATIONS
+ 0011 01 NO ALTERNATIVE ARRANGEMENT FOR ROUTEING METEOROLOGICAL OBSERVATION
+ 0123 01 MISSING VALUE
+035034 0007 0001 01 SLIGHT IMPROVEMENT
+ 0002 01 SIGNIFICANT IMPROVEMENT
+ 0003 01 MOST SIGNIFICANT IMPROVEMENT
+ 0004 01 STEADY
+ 0005 01 DECREASING
+ 0006 01 EFFORTS REQUIRED TO IMPROVE NIGHT-TIME OBSERVATIONS
+ 0007 01 MISSING VALUE
+035035 0016 0000 01 RESERVED
+ 0001 01 BALLOON BURST
+ 0002 01 BALLOON FORCED DOWN BY ICING
+ 0003 01 LEAKING OR FLOATING BALLOON
+ 0004 01 WEAK OR FADING SIGNAL
+ 0005 01 BATTERY FAILURE
+ 0006 01 GROUND EQUIPMENT FAILURE
+ 0007 01 SIGNAL INTERFERENCE
+ 0008 01 RADIOSONDE FAILURE
+ 0009 01 EXCESSIVE MISSING DATA FRAMES
+ 0010 01 RESERVED
+ 0011 01 EXCESSIVE MISSING TEMPERATURE
+ 0012 01 EXCESSIVE MISSING PRESSURE
+ 0013 01 USER TERMINATED
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+040011 0004 0001 01 MEAN SEA SURFACE (MSS) INTERPOLATION FLAG
+ 0002 01 OCEAN TIDE SOLUTION 1 INTERPOLATION FLAG (0= 4 POINTS OVER OCEAN, 1=LESS THAN 4 POINTS)
+ 0003 01 OCEAN TIDE SOLUTION 2 INTERPOLATION FLAG (0= 4 POINTS OVER OCEAN, 1=LESS THAN 4 POINTS)
+ 0004 01 METEOROLOGICAL DATA INTERPOLATION FLAG (0= 4 POINTS OVER OCEAN, 1=LESS THAN 4 POINTS)
+040012 0003 0001 01 18.7 GHZ BRIGHTNESS TEMPERATURE
+ 0002 01 23.8 GHZ BRIGHTNESS TEMPERATURE
+ 0003 01 34 GHZ BRIGHTNESS TEMPERATURE
+040013 0005 0000 01 INTERPOLATION WITH NO GAP BETWEEN JMR DATA
+ 0001 01 INTERPOLATION WITH GAP BETWEEN JMR DATA
+ 0002 01 EXTRAOLATION OF JMR DATA
+ 0003 01 FAILURE OF EXTRAPOLATION AND INTERPOLATION
+ 0007 01 MISSING VALUE
+040203 0012 0001 01 WARM LOAD IS CHANGING TOO RAPIDLY
+ 0002 01 COLD LOAD MOON CONTAMINATION PRESENT IN SCAN FOR 6.8 GHz CHANNEL
+ 0003 01 COLD LOAD MOON CONTAMINATION PRESENT IN SCAN FOR 10.7 GHz CHANNEL
+ 0004 01 COLD LOAD MOON CONTAMINATION PRESENT IN SCAN FOR 18.7 GHz CHANNEL
+ 0005 01 COLD LOAD MOON CONTAMINATION PRESENT IN SCAN FOR 23.8 GHz CHANNEL
+ 0006 01 COLD LOAD MOON CONTAMINATION PRESENT IN SCAN FOR 37.0 GHz CHANNEL
+ 0007 01 WARM LOAD PRESENCE OF TERMAL GRADIENT IN SCAN FOR 6.8 GHz CHANNEL
+ 0008 01 WARM LOAD PRESENCE OF TERMAL GRADIENT IN SCAN FOR 10.7 GHz CHANNEL
+ 0009 01 WARM LOAD PRESENCE OF TERMAL GRADIENT IN SCAN FOR 18.7 GHz CHANNEL
+ 0010 01 WARM LOAD PRESENCE OF TERMAL GRADIENT IN SCAN FOR 23.8 GHz CHANNEL
+ 0011 01 WARM LOAD PRESENCE OF TERMAL GRADIENT IN SCAN FOR 37.0 GHz CHANNEL
+ 0012 01 ALL MISSING VALUE
+049194 0014 0001 01 PASSED QUALITY CONTROL
+ 0002 01 OUTSIDE TIME WINDOW
+ 0003 01 ABOVE LAND
+ 0004 01 OUTSIDE ENTIRE GRID
+ 0005 01 WAVE HEIGHT OUT OF RANGE
+ 0006 01 TOO HIGH ALONG TRACK JUMP
+ 0007 01 TOO SHORT ALONG TRACK JUMP
+ 0008 01 TOO HIGH ALONG TRACK VARIANCE
+ 0009 01 OUTSIDE CONFIDENCE LIMIT
+ 0010 01 DOUBLE OBSERVATION
+ 0011 01 PEAKINESS ABOVE THRESHOLD
+ 0012 01 RESERVED
+ 0013 01 RESERVED
+ 0014 01 RESERVED
+049193 0014 0001 01 EXELLENT (COST LESS THAN 0.1)
+ 0002 01 GOOD (COST LESS THAN 0.5)
+ 0003 01 QUESTIONABLE (COST LARGER THAN 0.5)
+ 0004 01 RESULTS UNTABLE
+ 0005 01 OBSERVED SAR SPECTRUM REJECTED
+ 0006 01 WAM FIRST GUESS REJECTED
+ 0007 01 SIMULATED SAR REJECTED
+ 0008 01 NO AZIMUTH CUT-OFF ADJUSTMENT
+ 0009 01 RESERVED
+ 0010 01 RESERVED
+ 0011 01 RESERVED
+ 0012 01 RESERVED
+ 0013 01 RESERVED
+ 0014 01 RESERVED
diff --git a/bufrtables/C0000000000098000000.TXT b/bufrtables/C0000000000098000000.TXT
new file mode 100755
index 0000000..d659730
--- /dev/null
+++ b/bufrtables/C0000000000098000000.TXT
@@ -0,0 +1,6065 @@
+001003 0008 0000 01 ATARCTICA
+ 0001 01 REGION I
+ 0002 01 REGION II
+ 0003 01 REGION III
+ 0004 01 REGION IV
+ 0005 01 REGION V
+ 0006 01 REGION VI
+ 0007 01 MISSING VALUE
+001007 0132 0001 01 ERS 1
+ 0002 01 ERS 2
+ 0003 01 METOP-1
+ 0004 01 METOP-2
+ 0005 01 METOP-3
+ 0020 01 SPOT1
+ 0021 01 SPOT2
+ 0022 01 SPOT3
+ 0023 01 SPOT4
+ 0040 01 OERSTED
+ 0041 01 CHAMP
+ 0042 01 TERRASAR-X
+ 0050 01 METEOSAT 3
+ 0051 01 METEOSAT 4
+ 0052 01 METEOSAT 5
+ 0053 01 METEOSAT 6
+ 0054 01 METEOSAT 7
+ 0055 01 METEOSAT 8
+ 0056 01 METEOSAT 9
+ 0057 01 METEOSAT 10
+ 0058 01 METEOSAT 1
+ 0059 01 METEOSAT 2
+ 0060 01 ENVISAT
+ 0070 01 METEOSAT 11
+ 0120 01 ADEOS
+ 0121 01 ADEOS II
+ 0150 01 GMS 3
+ 0151 01 GMS 4
+ 0152 01 GMS 5
+ 0171 01 MTSAT-1R
+ 0172 01 MTSAT-2
+ 0200 01 NOAA 8
+ 0201 01 NOAA 9
+ 0202 01 NOAA 10
+ 0203 01 NOAA 11
+ 0204 01 NOAA 12
+ 0205 01 NOAA 14
+ 0206 01 NOAA 15
+ 0207 01 NOAA 16
+ 0208 01 NOAA 17
+ 0209 01 NOAA 18
+ 0220 01 LANDSAT 5
+ 0221 01 LANDSAT 4
+ 0222 01 LANDSAT 7
+ 0240 01 DMSP 7
+ 0241 01 DMSP 8
+ 0242 01 DMSP 9
+ 0243 01 DMSP 10
+ 0244 01 DMSP 11
+ 0245 01 DMSP 12
+ 0246 01 DMSP 13
+ 0247 01 DMSP 14
+ 0248 01 DMSP 15
+ 0249 01 DMSP 16
+ 0250 01 GOES 6
+ 0251 01 GOES 7
+ 0252 01 GOES 8
+ 0253 01 GOES 9
+ 0254 01 GOES 10
+ 0255 01 GOES 11
+ 0256 01 GOES 12
+ 0257 01 GOES 13
+ 0258 01 GOES 14
+ 0259 01 GOES 15
+ 0260 01 JASON-1
+ 0261 01 JASON-2
+ 0281 01 QUIKSCAT
+ 0282 01 TRMM
+ 0283 01 CORIOLIS
+ 0285 01 DMSP17
+ 0310 01 GOMS 1
+ 0311 01 GOMS 2
+ 0320 01 METEOR 2-21
+ 0321 01 METEOR 3-5
+ 0322 01 METEOR 3M-1
+ 0323 01 METEOR 3M-2
+ 0341 01 RESURS 01-4
+ 0430 01 INSAT 1B
+ 0431 01 INSAT 1C
+ 0432 01 INSAT 1D
+ 0450 01 INSAT 2A
+ 0451 01 INSAT 2B
+ 0452 01 INSAT 2E
+ 0470 01 INSAT 3A
+ 0471 01 INSAT 3D
+ 0472 01 INSAT 3E
+ 0500 01 FY-1C
+ 0501 01 FY-1D
+ 0510 01 FY-2
+ 0512 01 FY-2B
+ 0513 01 FY-2C
+ 0514 01 FY-2D
+ 0700 01 TIROS M (ITOS 1)
+ 0701 01 NOAA 1
+ 0702 01 NOAA 2
+ 0703 01 NOAA 3
+ 0704 01 NOAA 4
+ 0705 01 NOAA 5
+ 0706 01 NOAA 6
+ 0707 01 NOAA 7
+ 0708 01 TIROS-N
+ 0710 01 GOES (SMS 1)
+ 0711 01 GOES (SMS 2)
+ 0720 01 TOPEX
+ 0721 01 GFO (GEOSAT FOLLOW ON)
+ 0722 01 GRACE A
+ 0723 01 GRACE B
+ 0731 01 GOES 1
+ 0732 01 GOES 2
+ 0733 01 GOES 3
+ 0734 01 GOES 4
+ 0735 01 GOES 5
+ 0740 01 COSMIC-1
+ 0741 01 COSMIC-2
+ 0742 01 COSMIC-3
+ 0743 01 COSMIC-4
+ 0744 01 COSMIC-5
+ 0745 01 COSMIC-6
+ 0763 01 NIMBUS 3
+ 0764 01 NIMBUS 4
+ 0765 01 NIMBUS 5
+ 0766 01 NIMBUS 6
+ 0767 01 NIMBUS 7
+ 0780 01 ERBS
+ 0781 01 UARS
+ 0782 01 EARTH PROBE
+ 0783 01 TERRA
+ 0784 01 AQUA
+ 0785 01 AURA
+ 0800 01 SUNSAT
+ 0820 01 SAC-C
+ 1023 01 MISSIN VALUE
+001032 0041 0001 01 PREPROCESSING CONSISTENCY CHECK
+ 0010 01 BIAS CORRECTION
+ 0020 01 BLACK LIST
+ 0030 01 OI MASS AND WIND ANALYSIS, REPORT STATUS
+ 0031 01 OI HUMIDITY ANALYSIS, REPORT STATUS
+ 0032 01 OI ANALYSIS VARIABLES
+ 0033 01 OI ANALYSIS, FIRST GUESS Q/C
+ 0034 01 OI ANALYSIS, FINAL ANALYSIS Q/C
+ 0035 01 OI ANALYSIS, EVENT FLAGS
+ 0040 01 DYNAMIC INITIALISATION SCHEME
+ 0041 01 NORMAL MODE INITIALISATION SCHEME
+ 0050 01 SURFACE ANALYSIS, REPORT STATUS
+ 0051 01 SURFACE ANALYSIS VARIABLES
+ 0052 01 SURFACE ANALYSIS Q/C
+ 0053 01 SURFACE ANALYSIS, EVENT FLAGS
+ 0060 01 3D VAR REPORT STATUS
+ 0061 01 3D VAR ANALYSIS VARIABLES
+ 0062 01 3D VAR Q/C
+ 0063 01 3D VAR EVENT FLAGS
+ 0080 01 PRESAT FIRST GUESS
+ 0081 01 PRESAT ERROR STANDARD DEVIATIONS
+ 0082 01 PRESAT BIAS ESTIMATES
+ 0083 01 PRESAT BRIGHTNESS TEMPERATURE QUALITY FLAGS
+ 0084 01 PRESAT SAMARY FLAGS
+ 0090 01 FIRST GUESS (6 HOUR FORECAST)
+ 0091 01 FIRST GUESS (FGAT INTERPOLATED)
+ 0100 01 PRESCAT AMBIGUITY REMOVAL
+ 0110 01 WAM FIRST GUESS
+ 0111 01 WAM ANALYSIS
+ 0112 01 WAM FORECAST
+ 0113 01 WAM Q/C
+ 0201 01 COLLOCATION WITH SURFACE DATA
+ 0202 01 COLLOCATION WITH TEMP/PILOT DATA
+ 0203 01 COLLOCATION WITH AIREP DATA
+ 0204 01 COLLOCATION WITH SATOB DATA
+ 0205 01 COLLOCATION WITH TOVS DATA
+ 0206 01 COLLOCATION WITH ERS1 SCATTEROMETER DATA
+ 0207 01 COLLOCATION WITH ERS1 ALTIMETER DATA
+ 0220 01 ERS1 SCATTEROMETER COLLOCATION BLACK LIST
+ 0230 01 GAUSS ERROR
+ 0231 01 GROSS ERROR
+001031 0219 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC 50
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC 110
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC 140
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+ 0255 01 MISSING VALUE 219
+001032 0041 0001 01 PREPROCESSING CONSISTENCY CHECK
+ 0010 01 BIAS CORRECTION
+ 0020 01 BLACK LIST
+ 0030 01 OI MASS AND WIND ANALYSIS, REPORT STATUS
+ 0031 01 OI HUMIDITY ANALYSIS, REPORT STATUS
+ 0032 01 OI ANALYSIS VARIABLES
+ 0033 01 OI ANALYSIS, FIRST GUESS Q/C
+ 0034 01 OI ANALYSIS, FINAL ANALYSIS Q/C
+ 0035 01 OI ANALYSIS, EVENT FLAGS
+ 0040 01 DYNAMIC INITIALISATION SCHEME
+ 0041 01 NORMAL MODE INITIALISATION SCHEME
+ 0050 01 SURFACE ANALYSIS, REPORT STATUS
+ 0051 01 SURFACE ANALYSIS VARIABLES
+ 0052 01 SURFACE ANALYSIS Q/C
+ 0053 01 SURFACE ANALYSIS, EVENT FLAGS
+ 0060 01 3D VAR REPORT STATUS
+ 0061 01 3D VAR ANALYSIS VARIABLES
+ 0062 01 3D VAR Q/C
+ 0063 01 3D VAR EVENT FLAGS
+ 0080 01 PRESAT FIRST GUESS
+ 0081 01 PRESAT ERROR STANDARD DEVIATIONS
+ 0082 01 PRESAT BIAS ESTIMATES
+ 0083 01 PRESAT BRIGHTNESS TEMPERATURE QUALITY FLAGS
+ 0084 01 PRESAT SAMARY FLAGS
+ 0090 01 FIRST GUESS (6 HOUR FORECAST)
+ 0091 01 FIRST GUESS (FGAT INTERPOLATED)
+ 0100 01 PRESCAT AMBIGUITY REMOVAL
+ 0110 01 WAM FIRST GUESS
+ 0111 01 WAM ANALYSIS
+ 0112 01 WAM FORECAST
+ 0113 01 WAM Q/C
+ 0201 01 COLLOCATION WITH SURFACE DATA
+ 0202 01 COLLOCATION WITH TEMP/PILOT DATA
+ 0203 01 COLLOCATION WITH AIREP DATA
+ 0204 01 COLLOCATION WITH SATOB DATA
+ 0205 01 COLLOCATION WITH TOVS DATA
+ 0206 01 COLLOCATION WITH ERS1 SCATTEROMETER DATA
+ 0207 01 COLLOCATION WITH ERS1 ALTIMETER DATA
+ 0220 01 ERS1 SCATTEROMETER COLLOCATION BLACK LIST
+ 0230 01 GAUSS ERROR
+ 0231 01 GROSS ERROR
+001033 0219 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC 50
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC 110
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC 140
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA 190
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+ 0255 01 MISSING VALUE
+001035 0219 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC 50
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC 110
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC 140
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA 190
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+ 0255 01 MISSING VALUE 219
+001090 0005 0000 01 LAF (LAGGED-AVERAGE FORECASTING)
+ 0001 01 BREEDING
+ 0002 01 SINGULAR VECTOR
+ 0003 01 MULTIPLE ANALYSIS CYCLE
+ 0255 01 MISSING VALUE
+001092 0005 0000 01 UNPERTURBED HIGH-RESOLUTION CONTROL FORECAST
+ 0001 01 UNPERTURBED LOW-RESOLUTION CONTROL FORECAST
+ 0002 01 NEGATIVELY PERTURBED FORECAST
+ 0003 01 POSITIVELY PERTURBED FORECAST
+ 0255 01 MISSING VALUE
+002001 0004 0000 01 AUTOMATIC STATION
+ 0001 01 MANNED STATION
+ 0002 01 HYBRID, BOTH MANNED AND AUTOMATIC
+ 0003 01 MISSING VALUE
+002002 0004 0000 01 MEASURED IN M S-1 UNLESS OTHERWISE INDICATED
+ 0001 01 CERTIFIED INSTRUMENTS
+ 0002 01 ORIGINALY MEASURED IN KNOTS
+ 0003 01 ORIGINALY MEASURED IN KM/H
+002003 0012 0000 01 PRESSURE INSTRUMENT ASSOCIATED WITH WIND-MEASURING EQUIPMENT
+ 0001 01 OPTICAL THEODOLITE
+ 0002 01 RADIO THEODOLITE
+ 0003 01 RADAR
+ 0004 01 VLF-OMEGA
+ 0005 01 LORAN C
+ 0006 01 WIND PROFILER
+ 0007 01 SATELLITE NAVIGATION
+ 0008 01 RADIO-ACOUSTIC SOUNDING SYSTEM (RASS)
+ 0009 01 SODAR
+ 0014 02 PRESSURE INSTRUMENT ASSOCIATED WITH WIND MEASUREMENT EQUIPME
+ NT BUT PRESSURE ELEMENT FAILED DURING ASCENT
+ 0015 01 MISSING VALUE
+002004 0011 0000 01 USA OPEN PAN EVAPORIMETER (WITHOUT COVER)
+ 0001 01 USA OPEN PAN EVAPORIMETER (MESH COVERED)
+ 0002 01 GGI-300 EVAPORIMETER (SUNKEN)
+ 0003 01 20 M**2 TANK
+ 0004 01 OTHERS
+ 0005 01 RICE
+ 0006 01 WHEAT
+ 0007 01 MAIZE
+ 0008 01 SORGHUM
+ 0009 01 OTHER CROPS
+ 0015 01 MISSING VALUE
+002011 0054 0000 01 RESERVED
+ 0001 01 RESERVED
+ 0002 01 NO RADIOSONDE-PASSIVE TARGET(E.G.REFLECTOR)
+ 0003 01 NO RADIOSONDE-ACTIVE TARGET(E.G.TRANSPONDER)
+ 0004 01 NO RADIOSONDE-PASSIVE TEMPERATURE-HUMIDITY PROFILER
+ 0005 01 NO RADIOSONDE-ACTIVE TEMPERATURE-HUMIDITY PROFILER
+ 0006 01 NO RADIOSONDE-RADIO ACOUSTIC SOUNDER
+ 0009 01 NO RADIOSONDE-SYSTEM UNKNOWN OR NOT SPECIFIED
+ 0010 01 RS VIZ TYPE A (USA)
+ 0011 01 RS VIZ TYPE B (USA)
+ 0012 01 RS SDC (SPACE DATA CORPORATION-USA)
+ 0013 01 ASTOR (NO LONGER MADE-AUSTRALIA)
+ 0014 01 VIZ MARK I MICROSONDE(USA)
+ 0015 01 EEC COMPANY TYPE 23 (USA)
+ 0016 01 ELIN (AUSTRIA)
+ 0017 01 GRAW G. (GERMANY)
+ 0019 01 GRAW M60 (GERMANY)
+ 0020 01 INDIAN MET SERVICE MK3 (INDIA)
+ 0021 01 VIZ/JIN YANG MARK I MICROSONDE(SOUTH KOREA)
+ 0022 01 MEISEI RS2-80 (JAPAN)
+ 0023 01 MESURAL FMO 1950A (FRANCE)
+ 0024 01 MESURAL FMO 19455A (FRANCE)
+ 0025 01 MESURAL MH73A (FRANCE)
+ 0026 01 METEOLABOR BASORA (SWITZERLAND)
+ 0027 01 AVK-MRZ (USSR)
+ 0028 01 METEORIT MARZ2-1 (USSR)
+ 0029 01 METEIRIT MARZ2-2 (USSR)
+ 0030 01 OKI RS2-80 (JAPAN)
+ 0031 01 VIZ/VALCOM TYPE A PRESSURE-COMMUTATED(CANADA)
+ 0032 01 SHANGAI RADIO (CHINA)
+ 0033 01 UK MET OFFICE MK3( UK)
+ 0034 01 VINOHRADY(CZECHOSLOVAKIA)
+ 0035 01 VAISALA RS18 (FINLAND)
+ 0036 01 VAISALA RS21 (FINLAND)
+ 0037 01 VAISALA RS80 (FINLAND)
+ 0038 01 VIZ LOCATE (LORAN-C)(USA)
+ 0039 01 SPRENGER E076 (GERMANY)
+ 0040 01 SPRENGER E084 (GERMANY)
+ 0041 01 SPRENGER E085 (GERMANY)
+ 0042 01 SPRENGER E086 (GERMANY)
+ 0043 01 AIR IS -4A-1680 (UK)
+ 0044 01 AIR IS -4A-1680 X (UK)
+ 0045 01 RS MSS(USA)
+ 0046 01 AIR IS -4A-403(USA)
+ 0047 01 MEISLEI RS2-91(JAPAN)
+ 0048 01 VALCOM(CANADA)
+ 0049 01 VIZ MARK II(USA)
+ 0060 01 VAISALA RS80/MICROCORA (FINLAND)
+ 0061 01 VAISALA RS80/DIGCORA OR MARWIN (FINLAND)
+ 0062 01 VAISALA RS80/PCCORA (FINLAND)
+ 0063 01 VAISALA RS80/STAR (FINLAND)
+ 0064 03 ORBITAL,SCIENCE CORPORATION,SPACE DATA DIVISION,TRANSPONDER
+ RADIOSONDE,TYPE 909-11-XX,WHERE XX CORRECPOND TO THE MODEL
+ OF THE INSTRUMENT
+ 0065 01 VIZ TRANSPONDER RADIOSONDE,MODEL NUMBER 1499-520(USA)
+ 0255 01 MISSING VALUE
+002012 0001 0000 01 TO BE DEVELOPED
+002013 0009 0000 01 NO CORRECTION
+ 0001 01 CIMO SOLAR CORRECTED AND CIMO INFRARED CORRECTED
+ 0002 01 CIMO SOLAR CORRECTED AND IFRARED CORRECTED
+ 0003 01 CIMO SOLAR CORRECTED ONLY
+ 0004 02 SOLAR AND INFRARED CORRECTED AUTOMATICALLY BY RADIOSONDE SY
+ STEM
+ 0005 01 SOLAR CORRECTED AUTOMATICALLY BY RADIOSONDE SYSTEM
+ 0006 01 SOLAR AND INFRARED CORRECTED AS SPECIFIED BY COUNTRY
+ 0007 01 SOLAR CORRECTED AS SPECIFIED BY COUNTRY
+ 0015 01 MISSING VALUE
+002014 0050 0000 01 NO WINDFINDING
+ 0001 01 AUTOMATIC WITH AUXILIARY OPTICAL DIRECTION FINDING
+ 0002 01 AUTOMATIC WITH AUXILIARY RADIO DIRECTION FINDING
+ 0003 01 AUTOMATIC WITH AUXILIARY RANGING
+ 0004 01 NOT USED
+ 0005 01 AUTOMATIC WITH MULTIPLE VLF-OMEGA SIGNALS
+ 0006 01 AUTOMATIC CROSS CHAIN LORAN-C
+ 0007 01 AUTOMATIC WITH AUXILIARY WIND PROFILER
+ 0008 01 AUTOMATIC SATELLITE NAVIGATION
+ 0019 01 TRACKING TECHNIQUE NOT SPECIFIED
+ 0020 01 VESSEL STOPPED
+ 0021 01 VESSEL DIVERTED FROM ORIGINAL DESTINATION
+ 0022 01 VESSEL'S ARRIVAL DELAYED
+ 0023 01 CONTAINER DAMAGED
+ 0024 01 POWER FAILURE TO CONTAINER
+ 0029 01 OTHER PROBLEMS
+ 0030 01 MAJOR POWER PROBLEMS
+ 0031 01 UPS INOPERATIVE
+ 0032 01 RECEIVER HARDWARE PROBLEMS
+ 0033 01 RECEIVER SOFTWARE PROBLEMS
+ 0034 01 PROCESSOR HARDWARE PROBLEMS
+ 0035 01 PROCESSOR SOFTWARE PROBLEMS
+ 0036 01 NAVAID SYSTEM DAMAGED
+ 0037 01 SHORTAGE OF LIFTING GAS
+ 0039 01 OTHER PROBLEMS
+ 0040 01 MECHANICAL DEFECT
+ 0041 01 MATERIAL DEFECT (HAND LAUNCHER)
+ 0042 01 POWER FAILURE
+ 0043 01 CONTROL FAILURE
+ 0044 01 PNEUMATIC/HYDRAULIC FAILURE
+ 0045 01 OTHER PROBLEMS
+ 0046 01 COMPRESSOR PROBLEMS
+ 0047 01 BALLOON PROBLEMS
+ 0048 01 BALLOON RELEASE PROBLEMS
+ 0049 01 LAUNCHER DAMAGED
+ 0050 01 R/S RECEIVER ANTENNA DEFECT
+ 0051 01 NAVAID ANTENNA DEFECT
+ 0052 01 R/S RECEIVER CABLING (ANTENNA DEFECT)
+ 0053 01 NAVAID ANTENNA CABLING DEFECT
+ 0059 01 OTHER PROBLEMS
+ 0060 01 ASAP COMMUNICATIONS DEFECT
+ 0061 01 COMMUNICATIONS FACILITY REJECTED DATA
+ 0062 01 NO POWER AT TRANSMITTINGANTENN
+ 0063 01 ANTENNA CABLE BROKEN
+ 0064 01 ANTENNA CABLE DEFECT
+ 0065 01 MESSAGE TRANSMITTED POWER BELOW NORMAL
+ 0069 01 OTHER PROBLEMS
+ 0070 01 ALL SYSTEMS IN NORMAL OPERATION
+ 0099 01 STATUS OF SYSTEM AND ITS COMPONENTS NOT SPECIFIED
+ 0127 01 MISSING VALUE
+002015 0006 0001 01 PRESSURE ONLY RADIOSONDE
+ 0002 01 PRESSURE ONLY RADIOSONDE PLUS TRANSPONDER
+ 0003 01 PRESSURE ONLY RADIOSONDE PLUS RADAR REFLECTOR
+ 0004 01 NO PRESSURE RADIOSONDE PLUS TRANSPONDER
+ 0005 01 NO PRESSURE RADIOSONDE PLUS RADAR REFLECTOR
+ 0015 01 MISSING VALUE
+002016 0004 0001 01 TRAIN REGULATOR
+ 0002 01 LIGHT UNIT
+ 0003 01 PARACHUTE
+ 0004 01 ROOFTOP RELEASE
+002019 0296 0010 02 BNSC RADIOMETER AATSR ADVANCED ALONG TRACK SCANNIN
+ G RADIOMETER
+ 0011 02 BNSC RADIOMETER ATSR ALONG TRACK SCANNING RADIOME
+ TER
+ 0012 02 BNSC RADIOMETER ATSR-2 ALONG TRACK SCANNING RADIOME
+ TER -2
+ 0013 01 BNSC RADIOMETER MWR MICROWAVE RADIOMETER
+ 0030 01 CNES COMMUNICATIONS ARGOS
+ 0040 01 CNES LIDAR LASER REFLECTORS
+ 0041 02 CNES LIDAR DORIS DOPPLER ORBITOGRAPHY AND RADIO-POSIT
+ IONING INTEGRATED BY SATELLITE
+ 0042 02 CNES LIDAR DORIS-NG DOPPLER ORBITOGRAPHY AND RAD
+ IO-POSITIONING INTEGRATED BY SATELLITE-NG
+ 0047 03 CNES RADAR ALTIMETERS POSEIDON-1 (SSALT-1) POSI
+ TIONING OCEAN SOLID EARTH ICE DYNAMICS ORBITING NAVIGATOR (S
+ INGLE FREQUENCY SOLID STATE RADAR ALTIMETER)
+ 0048 03 CNES RADAR ALTIMETERS POSEIDON-2 (SSALT-2) POSI
+ TIONING OCEAN SOLID EARTH ICE DYNAMICS ORBITING NAVIGATOR (D
+ UAL FREQUENCY SOLID STATE RADAR ALTIMETER)
+ 0050 01 CNES IMAGER RADIOMETER ATSR/M ATSR/M
+ 0051 01 CNES HIGH RESOLUTION OPTICAL IMAGERS HRG
+ 0052 01 CNES RADIOMETER HRV HIGH RESOLUTION VISIBLE
+ 0053 02 CNES RADIOMETER HRVIR HIGH RESOLUTION VISIBLE AND
+ INFRA-RED
+ 0054 02 CNES RADIOMETER SCARAB/MV2 SCANNER FOR EARTH'S
+ RADIATION BUDGET
+ 0055 01 CNES RADIOMETER POLDER POLDER
+ 0060 01 CNES SPECTROMETER VEGETATION VEGETATION
+ 0061 01 CNES SPECTROMETER WINDII WINDII
+ 0080 01 CSA COMMUNICATIONS RADARSAT DTT
+ 0081 01 CSA COMMUNICATIONS RADARSAT TTC
+ 0085 02 CSA RADAR SAR (CSA) SYNTHETIC APERTURE RADAR (CS
+ A)
+ 0090 02 CSA RADIOMETER MOPITT MEASUREMENTS OF POLLUTION IN
+ THE TROPOSPHERE
+ 0091 02 CSA CHEMISTRY INSTRUMENTS OSIRIS OPTICAL SPECTROGRAPH
+ AND INFRA-RED IMAGING SYSTEM
+ 0097 01 CSIRO RADIOMETER PANCHROMATIC IMAGER
+ 0098 02 CRCSS ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GPS
+ RECEIVER
+ 0102 02 DLR RADIOMETER CHAMP GPS SOUNDER GPS TURBORO
+ GUE SPACE RECEIVER (TRSR)
+ 0103 01 UNKNOWN
+ 0116 03 DLR MAGNETOMETER IGOR CHAMP GRAVITY PACKAGE (ACCELEROMETE
+ R+GPS) INTEGRATED GPS AND OCCULTATION RECEIVER STAR AC
+ CELEROMETER
+ 0117 03 DLR MAGNETOMETER CHAMP MAGNETOMETRY PACKAGE (1 SCALAR
+ +2 VECTOR MAGNETOMETER) OVERHAUSER MAGNETOMETER (OVM) AN
+ D FLUXGATE MAGNETOMETER (FGM)
+ 0120 02 ESA COMMUNICATIONS ENVISAT COMMS COMMUNICATIONS PACKA
+ GE ON ENVISAT
+ 0121 02 ESA COMMUNICATIONS ERS COMMS COMMUNICATION PACKAG
+ E FOR ERS
+ 0130 01 ESA LIDARS ALADIN ATMOSPHERIC LASER DOPPLER INSTRUMENT
+ 0131 01 ESA LIDARS ATLID ATMOSPHERIC LIDAR
+ 0140 02 ESA RADAR AMI/SAR/IMAGE ACTIVE MICROWAVE INSTRUMENTA
+ TION. IMAGE MODE
+ 0141 02 ESA RADAR AMI/SAR/WAVE ACTIVE MICROWAVE INSTRUMENTA
+ TION. WAVE MODE
+ 0142 02 ESA RADAR AMI/SCATTEROMETER ACTIVE MICROWAVE INS
+ TRUMENTATION. WIND MODE
+ 0143 01 ESA RADAR ASAR ASAR
+ 0144 02 ESA IMAGING MICROWAVE RADARS ASAR ADVANCED SYN
+ TETIC APERTURA RADAR (IMAGE MODE)
+ 0145 02 ESA IMAGING MICROWAVE RADARS ASAR ADVANCED SYN
+ TETIC APERTURA RADAR (WAVE MODE)
+ 0146 01 ESA CLOUD PROFILE AND RAIN RADARS CPR CLOUD RADAR
+ 0147 01 ESA RADAR RA-2/MWR RADAR ALTIMETER - 2
+ 0148 01 ESA RADAR RA/MWR RADAR ALTIMETER
+ 0150 01 ESA SCATTEROMETERS SCATTEROMETER SCATTEROMETER
+ 0161 02 ESA RADIOMETER MIPAS MICHELSON INTERFEROMETRIC PA
+ SSIVE ATMOSPHERE SOUNDER
+ 0162 02 ESA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E MWR-2 MICROWAVE RADIOMETER-2
+ 0163 03 ESA ATMOSPHERIC CHEMISTRY INSTRUMENTS SOPRANO SUB-
+ MILIMETRE OBSERVATION OF PROCESSES IN THE ABSORPTION NOTEWOR
+ THY FOR OZONE
+ 0170 02 ESA ATMOSPHERIC CHEMISTRY INSTRUMENTS GOME I GLOB
+ AL OZONE MONITORING EXPERIMENT
+ 0172 02 ESA SPECTROMETER GOMOS GLOBAL OZONE MONITORING BY O
+ CCULTATION OF STARS
+ 0174 02 ESA SPECTROMETER MERIS MEDIUM RESOLUTION IMAGING SP
+ ECTROMETER
+ 0175 02 ESA SPECTROMETER SCIAMACHY SCANNING IMAGING ABS
+ ORPTION SPECTROMETER FOR ATMOSPHERIC CARTOGRAPHY
+ 0181 02 EUMETSAT COMMUNICATIONS METEOSAT COMMS COMMUNICATIO
+ NS PACKAGE FOR METEOSAT
+ 0182 02 EUMETSAT COMMUNICATIONS MSG COMMS COMMUNICATIO
+ NS PACKAGE FOR MSG
+ 0190 02 ESA/ EUMETSAT SCATTEROMETERS ASCAT ADVANCED SCATTE
+ ROMETER
+ 0200 02 EUMETSAT RADIOMETER GERB GEOSTATIONARY EARTH
+ RADIATION BUDGET
+ 0202 02 ESA/ EUMETSAT RADIOMETER GRAS GNSS RECEIVER F
+ OR ATMOSPHERIC SOUNDING
+ 0203 02 EUMETSAT RADIOMETER MHS MICROWAVE HUMIDITY S
+ OUNDER
+ 0205 02 EUMETSAT RADIOMETER MVIRI METEOSAT VISIBLE AND
+ INFRA-RED IMAGER
+ 0207 02 EUMETSAT RADIOMETER SEVIRI SPINNING ENHANCED VI
+ SIBLE AND INFRARED IMAGER
+ 0208 02 EUMETSAT IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR)
+ VIRI VIRI
+ 0220 02 ESA/ EUMETSAT SPECTROMETER GOME-2 GLOBAL OZONE MO
+ NITORING EXPERIMENT - 2
+ 0221 03 CNES/ EUMETSAT ATMOSPHERIC TEMPERATURE AND HUMIDITY S
+ OUNDERS IASI INFRA-RED ATMOSPHERIC SOUNDING INTERFEROME
+ TER
+ 0240 02 CAST COMMUNICATIONS DCP DATA COLLECTION PLATFORM TRA
+ NSPONDER
+ 0245 01 CAST RADIOMETER CCD HIGH RESOLUTION CCD CAMERA
+ 0246 02 INPE ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS HSB
+ HUMIDITY SOUNDER/BRAZIL
+ 0248 02 INPE IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) OBA
+ OBSERVADOR BRASILEIRO DA AMAZONIA
+ 0250 01 CAST RADIOMETER WFI WIDE FIELD IMAGER
+ 0255 02 CAST SPECTROMETER IRMSS INFRA RED MULTI SPECTRAL SCA
+ NNER
+ 0260 01 ISRO PRECISION ORBIT BSS & FSS TRANSPONDERS
+ 0261 01 ISRO PRECISION ORBIT DRT-S&R
+ 0262 02 ISRO COMMUNICATIONS INSAT COMMS COMMUNICATIONS PACKA
+ GE FOR INSAT
+ 0268 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS HR-PAN HIGH RESOLUT
+ ION PANCHROMATIC CAMERA
+ 0269 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) MSMR MULTIFREQUENCY SCANNING MICROWAVE RADIOMETER
+ 0270 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VHRR
+ VERY HIGH RESOLUTION RADIOMETER
+ 0271 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) WIFS
+ WIDE FIELD SENSOR
+ 0275 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS AWIFS ADVANCED WID
+ E FIELD SENSOR
+ 0276 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-I LINEAR IMAGI
+ NG SELF SCANNER - I
+ 0277 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-II LINEAR IMAGI
+ NG SELF SCANNER - II
+ 0278 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-III LINE
+ AR IMAGING SELF SCANNER - III
+ 0279 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-IV LINEAR IMAGI
+ NG SELF SCANNER - IV
+ 0284 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS PAN PANCHROMATIC
+ SENSOR
+ 0285 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MOS
+ MODULAR OPTO-ELECTRONIC SCANNER
+ 0286 02 ISRO OCEAN COLOUR INSTRUMENTS OCM OCEAN COLOUR
+ MONITOR
+ 0290 02 JMA COMMUNICATIONS MTSAT COMMS COMMUNICATIONS PACKA
+ GE FOR MTSAT
+ 0294 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS IMAGER/MTSAT
+ -1R IMAGER/MTSAT
+ 0295 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS IMAGER/MTSAT
+ IMAGER/MTSAT
+ 0296 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS VISSR (GMS4)
+ VISIBLE AND INFRA-RED SPIN SCAN RADIOMETER (GMS4)
+ 0300 01 NASA LIDARS GLAS GEOSCIENCE LASER ALTIMETER SYSTEM
+ 0301 01 NASA PRECISION ORBIT LRA LASER RETROREFLECTOR ARRAY
+ 0302 01 NASA LIDARS MBLA MULTI BEAM LASER ALTIMETER
+ 0309 02 NASA CLOUD PROFILE AND RAIN RADARS CPR (CLOUDSAT) CLOU
+ D PROFILING RADAR
+ 0312 01 NASA RADAR NSCAT NASA SCATTEROMETER
+ 0313 01 NASA RADAR SEAWINDS ADEOS II - NASA SCATTEROMETER
+ 0330 02 NASA EARTH RADIATION BUDGET RADIOMETER ACRIM ACTI
+ VE CAVITY RADIOMETER IRRADIANCE MONITOR
+ 0334 02 NASA TOTAL AND PROFILE OZONE BUV BACKSCATTER ULTRAVIO
+ LET INSTRUMENT
+ 0336 02 NASA HIGH RESOLUTION OPTICAL IMAGERS ALI ADVANCED LAN
+ D IMAGER
+ 0347 02 NASA HIGH RESOLUTION OPTICAL IMAGERS ASTER ADVANCED SPA
+ CEBORNE THERMAL EMISSION AND REFLECTION RADIOMETER
+ 0348 02 NASA EARTH RADIATION BUDGET RADIOMETER CERES-2 CLOU
+ D AND THE EARTH'S RADIANT ENERGY SYSTEM
+ 0351 02 CONAE ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GPSD
+ R GPS DEMONSTRATION RECEIVER
+ 0353 02 NASA TOTAL AND PROFILE OZONE HIRDLS HIGH RESOLUTION DYNA
+ MICS LIMB SOUNDER
+ 0354 02 NASA TOTAL AND PROFILE OZONE HRDI HIGH RESOLUTION DOPP
+ LER IMAGER
+ 0356 01 NASA RADIOMETER LIS LIGHTNING IMAGING SENSOR
+ 0358 02 NASA MAGNETIC FIELD, AUROAL IMAGERYSCINTILLATION BOUNDARY
+ PEM PARTICLE ENVIRONMENT MONITOR
+ 0359 02 NASA OCEAN COLOUR INSTRUMENTS SEAWIFS SEA-VIEWING
+ WIDE FIELD-OF-VIEW SENSOR
+ 0360 02 NASA EARTH RADIATION BUDGET RADIOMETER SUSIM (UARS)
+ SOLAR ULTRAVIOLET IRRADIANCE MONITOR
+ 0363 02 NASA TOTAL AND PROFILE OZONE SBUV/1 SOLAR BACKSCATTER UL
+ TRAVIOLET 1 INSTRUMENT
+ 0365 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) TMI TRMM MICROWAVE IMAGER
+ 0366 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) JMR JASON-1 MICROWAVE RADIOMETER
+ 0369 02 NASA TOTAL AND PROFILE OZONE LIMS LIMB INFRARED MONITO
+ R OF THE STRATOSPHERE
+ 0370 02 NASA TOTAL AND PROFILE OZONE LRIR LIMB RADIANCE INVERS
+ ION RADIOMETER INSTRUMENT
+ 0371 02 NASA TOTAL AND PROFILE OZONE EPIC EARTH POLYCHROMATIC
+ IMAGING CAMERA
+ 0372 02 NASA EARTH RADIATION BUDGET RADIOMETER NISTAR NIST
+ ADVANCED RADIOMETER
+ 0373 02 NASA MAGNETIC FIELD, AUROAL IMAGERY SCINTILLATION BOUNDAR
+ Y PLASMA-MAG
+ 0374 01 NASA OTHER XPS XUV PHOTOMETER SYSTEM
+ 0375 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIRS
+ VISIBLE INFRA-RED SCANNER
+ 0376 03 CNES MULTIPLE DIRECTION/POLARISATION RADIOMETERS POLD
+ ER II POLARIZATION AND DIRECTIONALITY OF THE EARTH'S R
+ EFLECTANCE - II
+ 0377 02 NASA EARTH RADIATION BUDGET RADIOMETER TIM TOTA
+ L IRRADIANCE MONITOR
+ 0379 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) WFC
+ WIDE FIELD CAMERA
+ 0382 02 NASA SPECTRO-RADIOMETER CLAES CRYOGENIC LIMB ARRAY
+ ETALON SPECTROMETER
+ 0383 02 NASA SPECTRO-RADIOMETER HALOE HALOGEN OCCULTATION
+ EXPERIMENT
+ 0384 02 NASA SPECTRO-RADIOMETER ISAMS IMPROVED STRATOSPHER
+ IC AND MESOSPHERIC SOUNDER
+ 0385 02 NASA SPECTRO-RADIOMETER MISR MULTI-ANGLE IMAGING
+ SPECTRORADIOMETER
+ 0386 01 NASA SPECTRO-RADIOMETER MLS MICROWAVE LIMB SOUNDER
+ 0387 02 NASA SPECTRO-RADIOMETER MLS (EOS-AURA) MICROWAVE LIMB
+ SOUNDER (EOS-AURA)
+ 0389 02 NASA SPECTRO-RADIOMETER MODIS MODERATE-RESOLUTION
+ IMAGING SPECTRORADIOMETER
+ 0393 02 NASA GRAVITY HAIRS HIGH ACCURACY INTER-SATELLITE RANGIN
+ G SYSTEM
+ 0394 02 NASA TOTAL AND PROFILE OZONE OMI OZONE MEASURING INST
+ RUMENT
+ 0395 02 NASA RADIOMETER ATMOSPHERIC CORRECTOR ATMOSPHERIC
+ CORRECTOR
+ 0396 01 NASA RADIOMETER HYPERION HYPERSPECTRAL IMAGER
+ 0399 02 NASA SPECTRO-RADIOMETER SAGE I STRATOSPHERIC AEROSO
+ L AND GAS EXPERIMENT-I
+ 0400 02 NASA SPECTRO-RADIOMETER SAGE II STRATOSPHERIC AEROSO
+ L AND GAS EXPERIMENT-II
+ 0401 02 NASA SPECTRO-RADIOMETER SAGE III STRATOSPHERI
+ C AEROSOL AND GAS EXPERIMENT-III
+ 0402 02 NASA SPECTRO-RADIOMETER SAMS STRATOSPHERIC AND ME
+ SOSPHERIC SOUNDER
+ 0403 02 NASA SPECTRO-RADIOMETER SAM II STRATOSPHERIC AEROSO
+ L MEASUREMENT II
+ 0404 02 NASA SPECTRO-RADIOMETER IRIS INFRARED INTERFEROME
+ TER SPECTROMETER
+ 0405 02 NASA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GIFT
+ S GEOSYNCHRONOUS IMAGING FOURIER TRANSFORM SPECTROMETER
+ 0420 01 NASA SPECTROMETER AIRS ATMOSPHERIC INFRA-RED SOUNDER
+ 0426 02 NASA SPECTROMETER SOLSTICE SOLAR STELLAR IRRADI
+ ANCE COMPARISON EXPERIMENT
+ 0430 02 NASA SPECTROMETER TES TROPOSHPERIC EMISSION SPECTR
+ OMETER
+ 0431 02 NASA SPECTROMETER TOMS TOTAL OZONE MAPPING SPECTROM
+ ETER
+ 0450 02 JAXA COMMUNICATIONS ADEOS COMMS COMMUNICATIONS PACKA
+ GE FOR ADEOS
+ 0451 02 JAXA COMMUNICATIONS DCS (JAXA) DATA COLLECTION SYST
+ EM (JAXA)
+ 0453 02 JAXA COMMUNICATIONS GMS COMMS COMMUNICATIONS PACKA
+ GE ON GMS
+ 0454 02 JAXA COMMUNICATIONS JERS-1 COMMS COMMUNICATIONS PACKA
+ GE FOR JERS-1
+ 0460 01 JAXA LIDAR RIS RETROREFLECTOR IN SPACE
+ 0461 01 JAXA RADAR PR PRECIPITATION RADAR
+ 0462 02 JAXA IMAGING MICROWAVE RADARS SAR SYNTETIC APE
+ RTURE RADAR
+ 0470 02 JAXA IMAGING MICROWAVE RADARS PALSAR PHASED ARRAY
+ TYPE L-BAND SYNTHETIC APERTURE RADAR
+ 0479 02 JAXA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) AMSR-E ADVANCED MICROWAVE SCANNING RADIOMETER-EOS
+ 0480 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS PRISM (ALOS) PANC
+ HROMATIC REMOTE-SENSING INSTRUMENT FOR STEREO MAPPING
+ 0481 02 JAXA RADIOMETER AMSR ADVANCED MICROWAVE SCANNING
+ RADIOMETER
+ 0482 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS AVNIR ADVANCED VIS
+ IBLE AND NEAR INFRARED RADIOMETER
+ 0483 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS AVNIR-2 ADVANCED VIS
+ IBLE AND NEAR INFRA-RED RADIOMETER TYPE 2
+ 0484 01 JAXA IMAGER GLI GLOBAL IMAGER
+ 0485 02 JAXA RADIOMETER MESSR MULTISPECTRAL ELECTRONIC SEL
+ F SCANNING RADIOMETER
+ 0486 01 JAXA RADIOMETER MSR MICROWAVE SCANNING RADIOMETER
+ 0487 02 JAXA RADIOMETER OCTS OCEAN COLOR AND TEMPERATURE S
+ CANNER
+ 0488 01 JAXA RADIOMETER OPS OPTICAL SENSOR
+ 0489 02 JAXA SPECTRO-RADIOMETER VISSR (GMS5) VISIBLE AND
+ INFRA-RED SPIN SCAN RADIOMETER (GMS5)
+ 0490 02 JAXA RADIOMETER VTIR VISIBLE AND THERMAL INFRA-RE
+ D RADIOMETER
+ 0510 02 JAXA SPECTROMETER ILAS-I IMOROVED LIMB ATOMOSPHIRIC S
+ PECTROMETER
+ 0511 02 JAXA SPECTROMETER ILAS-II IMPROVED LIMB ATOMOSPHIRIC S
+ PECTROMETER
+ 0512 02 JAXA SPECTROMETER IMG INFEROMETRIC MONITOR OF GREE
+ NHOUSE GASES
+ 0514 02 JAXA SPACE ENVIRONMENT SEM SPACE ENVIRONMENT MO
+ NITOR (JAXA)
+ 0515 02 JAXA TOTAL AND PROFILE OZONE SOFIS SOLAR OCCULTATION FO
+ URIER TRANSFORM SPECTROMETER FOR INCLINED ORBIT SATELLITE
+ 0540 02 NOAA COMMUNICATIONS DCS (NOAA) DATA COLLECTION SYST
+ EM (NOAA)
+ 0541 02 NOAA COMMUNICATIONS GOES COMMS COMMUNICATIONS PACKA
+ GE ON GOES
+ 0542 02 NOAA COMMUNICATIONS LANDSAT COMMS COMMUNICATIONS PACKA
+ GE FOR LANDSAT
+ 0543 02 NOAA COMMUNICATIONS NOAA COMMS COMMUNICATIONS PACKA
+ GE FOR NOAA
+ 0544 01 NOAA COMMUNICATIONS S&R (GOES) SEARCH AND RESCUE
+ 0545 01 NOAA COMMUNICATIONS S&R (NOAA) SEARCH AND RESCUE
+ 0546 01 NOAA COMMUNICATIONS WEFAX WEATHER FACSIMILE
+ 0547 02 NOAA SPECTROMETER SEM(GOES) SPACE ENVIRONMENT MO
+ NITOR
+ 0550 01 NOAA MAGNETIC FIELD SSM SPECIAL SENSOR MAGNETOMETER
+ 0551 02 NOAA MAGNETIC FIELD SSJ/4 SPECIAL SENSOR PRECIPITATING
+ PLASMA MONITOR
+ 0552 02 NOAA SPACE ENVIRONMENT SSIES-2 SPECIAL SENSOR IONOS
+ PHERIC PLASMA DRIFT/SCINTILLATION METER
+ 0553 02 NOAA SPACE ENVIRONMENT SSB/X-2 SPECIAL SENSOR GAMMA
+ RAY PARTICLE DECTECTOR
+ 0570 02 NOAA RADIOMETER AMSU-A ADVANCED MICROWAVE SOUNDING
+ UNIT-A
+ 0574 02 NOAA RADIOMETER AMSU-B ADVANCED MICROWAVE SOUNDING
+ UNIT-B
+ 0580 02 NOAA RADIOMETER ATOVS (HIRS/3 + AMSU + AVHRR/3) ADVA
+ NCED TIROS OPERATIONAL VERTICAL SOUNDER
+ 0590 02 NOAA RADIOMETER AVHRR/2 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/2
+ 0591 02 NOAA RADIOMETER AVHRR/3 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/3
+ 0592 02 NOAA RADIOMETER AVHRR/4 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/4
+ 0600 02 NOAA RADIOMETER ERBE EARTH'S RADIATION BUDGET EXP
+ ERIMENT
+ 0601 01 NOAA RADIOMETER ETM+ ENHANCED THEMATIC MAPPER
+ 0605 02 NOAA RADIOMETER HIRS/2 HIGH RESOLUTION INFRA-RED SO
+ UNDER/2
+ 0606 02 NOAA RADIOMETER HIRS/3 HIGH RESOLUTION INFRA-RED SO
+ UNDER/3
+ 0607 02 NOAA RADIOMETER HIRS/4 HIGH RESOLUTION INFRA-RED SO
+ UNDER/4
+ 0615 01 NOAA RADIOMETER IMAGER IMAGER
+ 0616 02 NOAA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIIR
+ S VISIBLE/INFRARED IMAGER RADIOMETER SUITE
+ 0620 02 NOAA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS CRIR
+ S/NP CROSS TRACK INFRA-RED SOUNDER/NPOESS
+ 0621 02 NOAA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS ATMS
+ ADVANCED TECHNOLOGY MICROWAVE SOUNDER
+ 0622 01 NOAA RADIOMETER MSS MULTISPECTRAL SCANNING SYSTEM
+ 0623 01 NOAA RADIOMETER MSU MICROWAVE SOUNDING UNIT
+ 0624 02 NOAA RADIOMETER SBUV/2 SOLAR BACKSCATTTER ULTRA-VIO
+ LET INSTRUMENT/2
+ 0625 02 NOAA RADIOMETER SBUV/3 SOLAR BACKSCATTTER ULTRA-VIO
+ LET INSTRUMENT/3
+ 0626 01 NOAA RADIOMETER SOUNDER SOUNDER
+ 0627 01 NOAA RADIOMETER SSU STRATOSPHERIC SOUNDING UNIT
+ 0628 01 NOAA RADIOMETER TM THEMATIC MAPPER
+ 0629 02 NOAA RADIOMETER TOVS (HIRS/2 + MSU + SSU) TIRO
+ S OPERATIONAL VERTICAL SOUNDER
+ 0630 01 NOAA RADIOMETER VAS VISSR ATMOSPHERIC SOUNDER
+ 0631 01 NOAA RADIOMETER SSZ
+ 0645 01 NOAA SPECTROMETER SEM SPACE ENVIRONMENT MONITOR
+ 0650 02 NRSCC RADIOMETER MVIRSR (10 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0651 02 NRSCC RADIOMETER MVIRSR (3 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0652 02 NRSCC RADIOMETER MVIRSR (5 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0670 01 NSAU RADAR RLSBO SIDE LOOKING MICROWAVE RADAR
+ 0680 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS MSU-EU MULTI-SPECTR
+ AL RADIOMETER WITH HIGH RESOLUTION
+ 0681 02 NSAU IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MSU-
+ UM VISIBLE MULTI-SPECTRAL RADIOMETER
+ 0682 01 NSAU RADIOMETER RM-08 IMAGING MICROWAVE RADIOMETER
+ 0683 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS SU-UMS STEREO RADIO
+ METER WITH HIGH RESOLUTION
+ 0684 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS SU-VR VISIBLE RADI
+ OMETER WITH HIGH RESOLUTION
+ 0685 01 NSAU RADIOMETER TRASSER
+ 0700 02 ROSCOSMOS COMMUNICATIONS KONDOR-2 DATA COLLECT
+ ION AND TRANSMISSION SYSTEM
+ 0701 01 ROSCOSMOS COMMUNICATIONS BRK
+ 0710 01 ROSCOSMOS LIDAR ALISSA BACKSCATTER LIDAR
+ 0712 01 ROSCOSMOS LIDAR BALKAN-2 LIDAR
+ 0715 01 ROSCOSMOS LIDAR MK-4
+ 0716 01 ROSCOSMOS LIDAR MK-4M
+ 0730 01 ROSCOSMOS RADAR GREBEN RADAR ALTIMETER
+ 0731 01 ROSCOSMOS RADAR SAR-10 SYNTETIC APERTURE RADAR
+ 0732 01 ROSCOSMOS RADAR SAR-3 SYNTETIC APERTURE RADAR
+ 0733 01 ROSCOSMOS RADAR SAR-70 SYNTETIC APERTURE RADAR
+ 0740 01 ROSCOSMOS RADAR SLR-3 SIDE LOOKING RADAR
+ 0745 01 ROSCOSMOS RADAR TRAVERS SAR
+ 0750 02 ROSCOSMOS RADIOMETER 174-K TEMPERATURE AND HUMI
+ DITY PROFILER
+ 0751 02 ROSCOSMOS RADIOMETER BTVK SCANNING TELEVISION
+ RADIOMETER
+ 0752 02 ROSCOSMOS RADIOMETER CHAIKA SCANNING IR RADIOMET
+ ER
+ 0753 02 ROSCOSMOS RADIOMETER DELTA-2 MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0755 02 ROSCOSMOS RADIOMETER IKAR-D MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0756 02 ROSCOSMOS RADIOMETER IKAR-N MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0757 02 ROSCOSMOS RADIOMETER IKAR-P MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0760 01 ROSCOSMOS RADIOMETER ISP
+ 0761 02 ROSCOSMOS RADIOMETER KFA-1000 PHOTOGRAPHIC
+ CAMERA
+ 0762 01 ROSCOSMOS RADIOMETER KFA-200 PHOTOGRAPHIC CAMERA
+ 0763 02 ROSCOSMOS RADIOMETER KFA-3000 PHOTOGRAPHIC
+ CAMERA
+ 0770 01 ROSCOSMOS RADIOMETER KLIMAT SCANNING IR RADIOMETER
+ 0771 02 ROSCOSMOS RADIOMETER KLIMAT-2 SCANNING IR
+ RADIOMETER
+ 0775 01 ROSCOSMOS RADIOMETER MIRAS
+ 0776 01 ROSCOSMOS RADIOMETER MIVZA
+ 0777 02 ROSCOSMOS RADIOMETER MIVZA-M MICROWAVE SCANNING R
+ ADIOMETER
+ 0780 01 ROSCOSMOS RADIOMETER MR-2000
+ 0781 01 ROSCOSMOS RADIOMETER MR-2000M
+ 0785 02 ROSCOSMOS RADIOMETER MR-900 SCANNING TELEPHOTOME
+ TER
+ 0786 02 ROSCOSMOS RADIOMETER MR-900B SCANNING VISUAL BAND
+ TELEPHOTOMETER
+ 0790 02 ROSCOSMOS RADIOMETER MSU-E MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0791 02 ROSCOSMOS RADIOMETER MSU-E1 MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0792 02 ROSCOSMOS RADIOMETER MSU-E2 MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0793 01 ROSCOSMOS RADIOMETER MSU-M
+ 0794 02 ROSCOSMOS RADIOMETER MSU-S MULTISPECTRAL MEDIUM
+ RESOLUTION SCANNER
+ 0795 02 ROSCOSMOS RADIOMETER MSU-SK MULTISPECTRAL MEDIUM
+ RESOLUTION CONICAL SCANNER
+ 0796 02 ROSCOSMOS RADIOMETER MSU-V MULTISPECTRAL HIGH R
+ ESOLUTION CONICAL SCANNER
+ 0810 02 ROSCOSMOS RADIOMETER MTZA SCANNING MICROWAVE R
+ ADIOMETER
+ 0815 03 ROSCOSMOS IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE
+ MICROWAVE) MZOAS SCANNING MICROWAVE RADIO
+ METER
+ 0820 03 ROSCOSMOS IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE
+ MICROWAVE) R-225 SINGLE CHANNEL MICROWAVE
+ RADIOMETER
+ 0821 01 ROSCOSMOS RADIOMETER R-400
+ 0822 02 ROSCOSMOS RADIOMETER R-600 SINGLE CHANNEL MICRO
+ WAVE RADIOMETER
+ 0830 02 ROSCOSMOS RADIOMETER RMS RADIATION MEASUREMEN
+ T SYSTEM
+ 0835 01 ROSCOSMOS RADIOMETER TV CAMERA
+ 0836 01 ROSCOSMOS RADIOMETER SILVA
+ 0840 02 ROSCOSMOS SPECTRO-RADIOMETER SROSMO SPECTRORADIO
+ METER FOR OCEAN MONITORING
+ 0850 02 ROSCOSMOS SPECTROMETER BUFS-2 BACKSCATTER SPECTROM
+ ETER/2
+ 0851 02 ROSCOSMOS SPECTROMETER BUFS-4 BACKSCATTER SPECTROM
+ ETER/4
+ 0855 02 ROSCOSMOS SPECTROMETER ISTOK-1 INFRA-RED SPECTROMET
+ ER
+ 0856 02 ROSCOSMOS SPECTROMETER SFM-2 SPECTROMETER TO MEAS
+ URE DIRECT SOLAR RADIATION
+ 0857 01 ROSCOSMOS SPECTROMETER DOPI
+ 0858 01 ROSCOSMOS SPECTROMETER KGI-4
+ 0859 01 ROSCOSMOS SPECTROMETER OZON-M
+ 0860 01 ROSCOSMOS SPECTROMETER RMK-2
+ 0900 02 NOAA RADIOMETER MAXIE MAGNETOSPHERIC ATMOSPHERIC X
+ -RAY IMAGING EXPERIMENT
+ 0901 01 NOAA RADIOMETER OLS OPERATIONAL LINESCAN SYSTEM
+ 0905 02 NOAA RADIOMETER SSM/I MISSION SENSOR MICROWAVE IMA
+ GER
+ 0906 02 NOAA RADIOMETER SSM/T-1 MISSION SENSOR MICROWAVE TEM
+ PERATURE SOUNDER
+ 0907 02 NOAA RADIOMETER SSM/T-2 MISSION SENSOR MICROWAVE WAT
+ ER VAPOR SOUNDER
+ 0908 02 NOAA RADIOMETER SSMIS SPECIAL SENSOR MICROWAVE IMA
+ GER SOUNDER
+ 0910 01 NOAA RADIOMETER SXI SOLAR X-RAY IMAGER
+ 0930 02 NOAA SPECTROMETER EHIC ENERGETIC HEAVY ION COMPOSIT
+ ION EXPERIMENT
+ 0931 01 NOAA SPECTROMETER X-RAY ASTRONOMY PAYLOAD
+ 0932 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) IVIS
+ SR (FY-2) IMPROVED MULTISPECTRAL VISIBLE AND INFRA-RED SCA
+ N RADIOMETER (5 CHANNELS)
+ 0933 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS IRAS
+ INFRARED ATMOSPHERIC SOUNDER
+ 0934 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS MWAS
+ MICROWAVE ATMOSPHERIC SOUNDER
+ 0935 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS IMWA
+ S IMPROVED MICROWAVE ATMOSPHERIC SOUNDER
+ 0936 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS MWHS
+ MICROWAVE HUMIDITY SOUNDER
+ 0937 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MVIR
+ S MODERATE RESOLUTION VISIBLE AND INFRARED IMAGING SPECTRO
+ RADIOMETER
+ 0938 02 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) MWRI MICROWAVE RADIATION IMAGER
+ 0940 02 ROSCOSMOS ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDER
+ S MTVZA-OK SCANNING MICROWAVE RADIOMETER
+ 0941 02 CNES ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS SAPH
+ IR
+ 0944 01 NOAA RADAR ALTIMETERS ALT ALTIMETER
+ 0945 02 NOAA EARTH RADIATION BUDGET RADIOMETER TSIS TOTA
+ L SOLAR IRRADIANCE SENSOR
+ 0946 02 NOAA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) CMIS CONICAL-SCANNING MICROWAVE IMAGER/SOUNDER
+ 0947 02 NOAA TOTAL AND PROFILE OZONE OMPS OZONE MAPPING AND PR
+ OFILER SUITE
+ 0948 03 NOAA SPACE ENVIRONMENT ATMOSPHERIC TEMPERATURE AND HUMIDI
+ TY SOUNDERS GPSOS GLOBAL POSITIONING SYSTEM OCCULTATION SE
+ NSOR
+ 0949 02 NOAA MAGNETIC FIELD, AUROAL IMAGERY SCINTILLATION BOUNDAR
+ Y SESS SPACE ENVIRONMENTAL SENSOR SUITE
+ 0950 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIRR
+ MULTISPECTRAL VISIBLE AND INFRA-RED SCAN RADIOMETER (10
+ CHANNELS
+ 0951 01 NRSCC TOTAL AND PROFILE OZONE TOM TOTAL OZONE MAPPER
+ 0952 01 NRSCC TOTAL AND PROFILE OZONE OP OZONE PROFILER
+ 2047 01 MISSING VALUE
+002020 0024 0000 01 NIMBUS
+ 0001 01 VTPR
+ 0002 01 TIROS 1 (TIROS, NOAA-6 TO NOAA-13)
+ 0003 01 TIROS 2 (NOAA-14 ONWARDS)
+ 0010 01 EOS
+ 0031 01 DMSP
+ 0061 01 EUMETSAT POLAR SYSTEM (EPS)
+ 0091 01 ERS
+ 0121 01 ADEOS
+ 0241 01 GOES
+ 0261 01 JASON
+ 0271 01 GMS
+ 0272 01 MTSAT
+ 0301 01 INSAT
+ 0331 01 METEOSAT OPERATIONAL PROGRAMME (MOP)
+ 0332 01 METEOSAT TRANSITIONAL PROGRAMME (MTP)
+ 0333 01 METEOSAT SECOND GENERATION PROGRAMME (MSG)
+ 0351 01 GOMS
+ 0380 01 FY-1
+ 0381 01 FY-2
+ 0401 01 GPS
+ 0402 01 GLONASS
+ 0403 01 GALILEO
+ 0511 01 MISSING VALUE
+002021 0008 0001 01 HIGH RESOLUTION INFRA RED SOUNDER (HIRS)
+ 0002 01 MICROWAVE SOUNDING UNIT (MSU )
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+002022 0005 0001 01 PROCESSING TECHNIQUE NOT DEFINED
+ 0002 01 AUTOMATED STATISTICAL REGRESSION
+ 0003 01 CLEAR PATH
+ 0004 01 PARTLY CLOUDY PATH
+ 0005 01 CLOUDY PATH
+002023 0012 0000 02 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE WATER VAPOUR
+ CHANNEL
+ 0001 02 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE INFRARED CHAN
+ NEL
+ 0002 02 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE VISIBLE CHANN
+ EL
+ 0003 02 WIND DERIVED FROM CLOUD MOTION OBSERVED IN WATER VAPOUR CHAN
+ NEL (CLOUD OR CLEAR AIR NOT SPECIFIED)
+ 0004 02 WIND DERIVED FROM MOTION OBSERVED IN COMBINATION OF SPECTRA
+ L CHANNELS
+ 0005 02 WIND DERIVED FROM MOTION OBSERVED IN THE WATER VAPOUR CHANN
+ EL IN CLEAR AIR
+ 0006 01 WIND DERIVED FROM MOTION OBSERVED IN THE OZONE CHANNEL
+ 0007 02 WIND DERIVED FROM MOTION OBSERVED IN WATER VAPOUR CHANNEL
+ (CLOUD OR CLEAR AIR NOT SPECIFIED)
+ 0008 01 WIND DERIVED FROM ALTIMETER
+ 0009 01 WIND DERIVED FROM RADIOMETER
+ 0013 01 ROOT MEAN SQUARE
+ 0015 01 MISSING VALUE
+002024 0003 0001 01 TABLE WITH FULL RANGE OF HUMIDITY VARIATION IN LAYER
+ 0002 01 REGRESSION TECHNIQUE ON 2 HUMIDITY VALUES IN LAYER
+ 0015 01 MISSING VALUE
+002025 0016 0001 01 RESERVED
+ 0002 01 HIRS
+ 0003 01 MSU
+ 0006 01 HIRS
+ 0007 01 MSU
+ 0010 01 HIRS(1, 2, 3, 8,9, 16, 17)
+ 0011 01 HIRS(1, 2, 3, 9, 17)
+ 0012 01 MSU
+ 0015 01 HIRS
+ 0016 01 HIRS
+ 0017 01 MSU
+ 0018 01 SKINTK(OCEAN ONLY)
+ 0021 01 HIRS
+ 0022 01 SSU
+ 0023 01 MSU (3 ,4)
+ 0025 01 MISSING
+002030 0007 0001 01 ADCP (ACOUSTIC DOPPLER CURRENT PROFILER)
+ 0002 01 GEK (GEOMAGNETIC ELECTRO KINETOGRAPH)
+ 0003 01 SHIPS'S SET AND DRIFT DETERMINED BY FIXES 3-6 HOURS APART
+ 0004 02 SHIPS'S SET AND DRIFT DETERMINED BY MORE THAN 6 HOURS BUT LE
+ SS THAN 12 HOURS APART
+ 0005 01 DRIFT OF BUOY
+ 0006 01 ADCP (ACOUSTIC DOPPLER CURRENT PROFILER)
+ 0007 01 MISSIN VALUE
+002031 0021 0000 01 RESERVED
+ 0001 01 INSTANTANEOUS
+ 0002 01 AVERAGED OVER 3 MINUTES OR LESS
+ 0003 01 AVERAGED OVER MORE THAN 3 MINUTES, BUT 6 AT THE MOST
+ 0004 01 AVERAGED OVER MORE THAN 6 MINUTES, BUT 12 AT THE MOST
+ 0005 01 INSTANTANEOUS
+ 0006 01 AVERAGED OVER 3 MINUTES OR LESS
+ 0007 01 AVERAGED OVER MORE THAN 3 MINUTES, BUT 6 AT THE MOST
+ 0008 01 AVERAGED OVER MORE THAN 6 MINUTES, BUT 12 AT THE MOST
+ 0009 01 VECTOR OR DOPPLER CURRENT PROFILLING METHOD NOT USED
+ 0010 01 RESERVED
+ 0011 01 1 HOUR OR LESS
+ 0012 01 MORE THAN 1 HOUR BUT 2 AT THE MOST
+ 0013 01 MORE THAN 2 HOUR BUT 4 AT THE MOST
+ 0014 01 MORE THAN 4 HOUR BUT 8 AT THE MOST
+ 0015 01 MORE THAN 8 HOUR BUT 12 AT THE MOST
+ 0016 01 MORE THAN 12 HOUR BUT 18 AT THE MOST
+ 0017 01 MORE THAN 18 HOUR BUT 24 AT THE MOST
+ 0018 01 RESERVED
+ 0019 01 DRIFT METHOD NOT USED
+ 0031 01 MISSING
+002032 0004 0000 02 VALUES AT SELECTED DEPTHS (DATA POINTS FIXED BY THE INSTRUME
+ NT OR SELECTED BY ANY OTHER METHOD)
+ 0001 02 VALUES AT SIGNIFICANT DEPTHS (DATA POINTS TAKEN FROM TRACES
+ AT SIGNIFICANT DEPTHS)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002033 0005 0000 01 NO SALINITY MEASURED
+ 0001 01 IN SITU SENSOR, ACCURACY BETTER THAN 0.02 %
+ 0002 01 IN SITU SENSOR, ACCURACY LESS THAN 0.02 %
+ 0003 01 SAMPLE ANALYSIS
+ 0007 01 MISSING VALUE
+002034 0007 0000 01 UNSPECIFIED DROGUE
+ 0001 01 HOLEY SOCK
+ 0002 01 TRISTAR
+ 0003 01 WINDOW SHADE
+ 0004 01 PARACHUTE
+ 0005 01 NON-LAGRANGIAN SEA ANCHOR
+ 0031 01 MISSING VALUE
+002036 0004 0000 01 DRIFTING BUOY
+ 0001 01 FIXED BUOY
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002037 0007 0000 01 REASERVED
+ 0001 01 MANUAL READING FROM VERTICAL TIDE STAFF
+ 0002 01 MANUAL READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ 0003 01 MANUAL READING FROM MULTIPLE AUTOMATIC RECORDERS AT STATION
+ 0004 02 AUTOMATIC READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ WITHOUT LEVEL REFERENCE CHECK
+ 0005 02 AUTOMATIC READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ WITH LEVEL REFERENCE CHECK,OR MULTIPLE AUTOMATIC RECORDERS
+ 0007 01 MISSING
+002038 0012 0000 01 SHIP INTAKE
+ 0001 01 BUCKET
+ 0002 01 HULL CONTACT SENSOR
+ 0003 01 REVERSING TERMOMETER
+ 0004 01 STD/CTD SENSOR
+ 0005 01 MECHANICAL BT
+ 0006 01 EXPANDABLE BT
+ 0007 01 DIGITAL BT
+ 0008 01 THERMISTOR CHAIN
+ 0009 01 INFRARED SCANNER
+ 0010 01 MICROWAVE SCANNER
+ 0015 01 MISSING VALUE
+002039 0005 0000 01 MEASURED WET-BULB TEMPERATURE
+ 0001 01 ICED BULB MEASURED WET-BULB TEMPERATURE
+ 0002 01 COMPUTED WET-BULB TEMPERATURE
+ 0003 01 ICED BULB COMPUTED WET-BULB TEMPERATURE
+ 0007 01 MISSING VALUE
+002041 0005 0000 01 INFORMATION BASED ON MANUAL ANALYSIS
+ 0001 01 INFORMATION BASED ON COMPUTER ANALYSIS
+ 0002 01 INFORMATION BASED ON DATA ASSIMILATION
+ 0003 02 INFORMATION BASED ON COMPUTER ANALYSIS OR DATA ASSIMSILATIO
+ N MANUALLY MODIFIED
+ 0063 01 MISSING VALUE
+002040 0008 0000 01 SHIPS MOTION REMOVED BY AVARAGING
+ 0001 01 SHIPS MOTION REMOVED BY MOTION COMPENSATION
+ 0002 01 SHIPS MOTION NOT REMOVED
+ 0003 01 SHIPS MOTION REMOVED BY AVERAGING
+ 0004 01 SHIPS MOTION REMOVED BY MOTION COMPENSATION
+ 0005 01 SHIPS MOTION NOT REMOVED
+ 0006 01 DOPPLER CURRENT PROFILING METHOD NOT USED
+ 0015 01 MISSING VALUE
+002041 0006 0000 01 INFORMATION BASED ON MANUAL ANALYSIS
+ 0001 01 INFORMATION BASED ON COMPUTER ANALYSIS
+ 0002 01 INFORMATION BASED ON DATA ASSIMILATION
+ 0003 02 INFORMATION BASED ON COMPUTER ANALYSIS OR
+ DATA ASSIMILATION MANUALLY MODIFIED
+ 0010 01 INFORMATION BASED ON THE NUMERICAL WEATHER PREDICTION
+ 0063 01 MISSING VALUE
+002044 0006 0000 01 RESERVED
+ 0001 01 LONGUET-HIGGINS (1964)
+ 0002 01 LONGUET-HIGGINS (F3 METHOS)
+ 0003 01 MAXIMUM LIKELIHOOD METHOD
+ 0004 01 MAXIMUM ENTROPY METHOD
+ 0015 01 MISSING VALUE
+002045 0005 0000 01 SEA STATION
+ 0001 01 AUTOMATIC DATA BUOY
+ 0002 01 AIRCRAFT
+ 0003 01 SATELLITE
+ 0015 01 MISSING VALUE
+002046 0004 0000 01 RESERVED
+ 0001 01 HEAVE SENSOR
+ 0002 01 SLOPE SENSOR
+ 0015 01 MISSING VALUE
+002048 0012 0000 01 HIRS
+ 0001 01 MSU
+ 0002 01 SSU
+ 0003 01 AMSU-A
+ 0004 01 AMSU-B
+ 0005 01 AVHRR
+ 0006 01 SSMI
+ 0007 01 NSCAT
+ 0008 01 SEA WINDS
+ 0009 01 POSEIDON ALTIMETER
+ 0010 01 JMR (JASON MICROWAVE RADIOMETER)
+ 0015 01 MISSING VALUE
+002049 0004 0001 01 PROCESSING TECHNIQUE NOT DEFINED
+ 0002 01 SIMULTANIOUS PHISICAL RETRIEVAL
+ 0003 01 CLEAR SOUNDING
+ 0004 01 CLOUDY COUNDING
+002050 0019 0001 01 CHANNEL 1 14.71 MICROMETERS
+ 0002 01 CHANNEL 2 14.37 MICROMETERS
+ 0003 01 CHANNEL 3 14.06 MICROMETERS
+ 0004 01 CHANNEL 4 13.64 MICROMETERS
+ 0005 01 CHANNEL 5 13.37 MICROMETERS
+ 0006 01 CHANNEL 6 12.66 MICROMETERS
+ 0007 01 CHANNEL 7 12.02 MICROMETERS
+ 0008 01 CHANNEL 8 11.03 MICROMETERS
+ 0009 01 CHANNEL 9 9.71 MICROMETERS
+ 0010 01 CHANNEL 10 7.43 MICROMETERS
+ 0011 01 CHANNEL 11 7.02 MICROMETERS
+ 0012 01 CHANNEL 12 6.51 MICROMETERS
+ 0013 01 CHANNEL 13 4.57 MICROMETERS
+ 0014 01 CHANNEL 14 4.52 MICROMETERS
+ 0015 01 CHANNEL 15 4.45 MICROMETERS
+ 0016 01 CHANNEL 16 4.13 MICROMETERS
+ 0017 01 CHANNEL 17 3.98 MICROMETERS
+ 0018 01 CHANNEL 18 3.74 MICROMETERS
+ 0019 01 CHANNEL 19 0.969 MICROMETERS
+002051 0004 0001 01 MAXIMUM/MINIMUM THERMOMETERS
+ 0002 01 AUTOMATED INSTRUMENT
+ 0003 01 THERMOGRAPH
+ 0015 01 MISSING VALUE
+002052 0005 0001 01 CHANNEL 1 0.55-.75 MICROMETERS
+ 0002 01 CHANNEL 2 3.9 MICROMETERS
+ 0003 01 CHANNEL 3 6.7 MICROMETERS
+ 0004 01 CHANNEL 4 10.7 MICROMETERS
+ 0005 01 CHANNEL 5 12.0 MICROMETERS
+002053 0005 0000 01 OBSERVED BRIGHTNESS TEMPERATURES
+ 0001 01 BRIGHTNESS TEMPERATURE WITH BIAS CORRECTION APPLIED
+ 0002 01 BRIGHTNESS TEMPERATURE CALCULATED FROM FIRST GUESS
+ 0003 01 BRIGHTNESS TEMPERATURE CALCULATED FROM SOUNDING
+ 0015 01 MISSING VALUE
+002054 0006 0000 02 PARAMETER DERIVED USING OBSERVED SOUNDER BRIGHTNESS TEMPERAT
+ URES
+ 0001 02 PARAMETER DERIVED USING OBSERVED IMAGER BRIGHTNESS TEMPERATU
+ RES
+ 0002 01 PARAMETER DERIVED USING FIRST GUESS INFORMATION
+ 0003 01 PARAMETER DERIVED USING NMC ANALYSIS INFORMATION
+ 0004 01 PARAMETER DERIVED USING RADIOSONDE INFORMATION
+ 0015 01 MISSING VALUE
+002055 0009 0000 01 STATISTICS GENERATED COMPARING RETRIEVAL VERSUS RADIOSONDE
+ 0001 01 STATISTICS GENERATED COMPARING RETRIEVAL VERSUS FIRST GUESS
+ 0002 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS FIRST GUESS
+ 0003 01 STATISTICS GENERATED COMPARING OBSERVED VERSUS RETRIEVAL
+ 0004 01 STATISTICS GENERATED COMPARING OBSERVED VERSUS FORST GUESS
+ 0005 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS IMAGER
+ 0006 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS SOUNDER
+ 0007 01 STATISTICS GENERATED FOR RADIOSONDE
+ 0008 01 STATISTICS GENERATED FOR FIRST GUESS
+002056 0006 0000 01 SUMS OF DIFFERENCE
+ 0001 01 SUMS OF SQUARED DIFFERENCES
+ 0002 01 SAMPLE SIZE
+ 0003 01 MINIMUM DIFFERENCE
+ 0004 01 MAXIMUM DIFFERENCE
+ 0015 01 MISSING VALUE
+002057 0006 0000 01 NESTED GRID MODEL (NMG)
+ 0001 01 AVIATION MODEL(AVN)
+ 0002 01 MEDIUM RANGE FORECAST (MRF) MODEL
+ 0003 01 GLOBAL DATA ASSIMILATION SYSTEM (GDAS) FORECAST MODEL
+ 0004 01 PRIOR SOUNDINGS (WITHIN 3 HOURS OF CURRENT TIME)
+ 0005 01 CLIMATOLOGY
+002058 0005 0000 01 12 HOUR AND 18 HOUR
+ 0001 01 18 HOUR AND 24 HOUR
+ 0002 01 6 HOUR AND 12 HOUR
+ 0003 01 GREATER THAN 24 HOUR
+ 0015 01 MISSING VALUE
+002059 0005 0000 01 NCEP NESTED GRID MODEL ANALYSIS
+ 0001 01 NCEP AVIATION MODEL ANALYSIS
+ 0002 01 NCEP MEDIUM RANGE FORECAST MODEL ANALYSIS
+ 0003 01 NCEP GLOBAL DATA ASSIMILATION SYSTEM FORECAST MODEL ANALYSIS
+ 0015 01 MISSING VALUE
+002060 0007 0000 01 CURRENT SURFACE HOURLY REPORTS
+ 0001 01 CURRENT SHIP REPORTS
+ 0002 01 CURRENT BUOY REPORTS
+ 0003 01 ONE HOUR OLD SURFACE HOURLY REPORTS
+ 0004 01 ONE HOUR SHIP OLD REPORTS
+ 0005 01 ONE HOUR BUOY OLD REPORTS
+ 0015 01 MISSING VALUE
+002061 0003 0000 01 INERTIAL NAVIGATOR SYSTEM
+ 0001 01 OMEGA
+ 0007 01 MISSING VALUE
+002062 0007 0000 01 ASDAR
+ 0001 01 ASDAR(ACARS ALSO AVAILABLE BUT NOT OPERATIVE)
+ 0002 01 ASDAR(ACARS ALSO AVAILABLE AND OPERATIVE)
+ 0003 01 ACARS
+ 0004 01 ACARS(ASDAR ALSO AVALILABLE BUT NOT OPERATIVE)
+ 0005 01 ACARS(ASDAR ALSO AVAILABLE AND OPERATIVE)
+ 0015 01 MISSING VALUE
+002064 0004 0000 01 GOOD
+ 0001 01 BAD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002066 0004 0000 01 TRS 2000
+ 0001 01 IMS 1500C
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+002070 0013 0000 01 ACTUAL LOCATION IN SECONDS
+ 0001 01 ACTUAL LOCATION IN MINUTES
+ 0002 01 ACTUAL LOCATION IN DEGREES
+ 0003 01 ACTUAL LOCATION IN DECIDEGREES
+ 0004 01 ACTUAL LOCATION OM CENTIDEGREES
+ 0005 01 REFERENCED TO CHECKPOINT IN SECONDS
+ 0006 01 REFERENCED TO CHECKPOINT IN MINUTES
+ 0007 01 REFERENCED TO CHECKPOINT IN DEGREES
+ 0008 01 REFERENCED TO CHECKPOINT IN DECIDEGREES
+ 0009 01 REFERENCED TO CHECKPOINT IN CENTIDEGREES
+ 0010 01 ACTUAL LOCATION IN TENTHS OF A MINUTE
+ 0011 01 REFERENCED TO CHECKPOINT IN TENTHS OF A MINUTE
+ 0015 01 MISSING VALUE
+002080 0005 0000 01 KAYSAM
+ 0001 01 TOTEX
+ 0002 01 KKS
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+002081 0009 0000 01 GP26
+ 0001 01 GP28
+ 0002 01 GP30
+ 0003 01 HM26
+ 0004 01 HM28
+ 0005 01 HM30
+ 0006 01 SV16
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002083 0006 0000 01 HIGH BAY
+ 0001 01 LOW BAY
+ 0002 01 BALLOON INFLATION LAUNCH SYSTEM (BILS)
+ 0003 01 ROOF-TOP BILS
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002084 0005 0000 01 HYDROGEN
+ 0001 01 HELIUM
+ 0002 01 NATURAL GAS
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002095 0005 0000 01 CAPACITANCE ANEROID
+ 0001 01 DERIVED FROM GPS
+ 0002 01 RESISTIVE STRAIN GAUGE
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002096 0005 0000 01 ROD THERMISTOR
+ 0001 01 BEAD THERMISTOR
+ 0002 01 CAPACITANCE BEAD
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002097 0008 0000 01 VIZ MARK II CARBON HYGRISTOR
+ 0001 01 VIZ B2 HYGRISTOR
+ 0002 01 VAISALA A-HUMICAP
+ 0003 01 VAISALA H-HUMICAP
+ 0004 01 CAPACITANCE SENSOR
+ 0005 01 VAISALA RS90
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002098 0005 0000 01 HH POLARISATION
+ 0001 01 VV POLARISATION
+ 0002 01 HV POLARISATION REAL VALUED COMPONENT
+ 0003 01 HV POLARISATION IMAGINARY VALUED COMPONENT
+ 0007 01 MISSING VALUE
+002101 0010 0000 01 CENTRE FRONT-FED PARABOLOID
+ 0001 01 OFFSET FRONT-FED PARABOLOID
+ 0002 01 CENTRE CASSEGRAIN PARABOLOID
+ 0003 01 OFFSET CASSEGRAIN PARABOLOID
+ 0004 01 PLANAR ARRAY
+ 0005 01 COAXIAL-COLLINEAR ARRAY
+ 0006 01 YAGI ELEMENTS ARRAY
+ 0007 01 MICROSTRIP
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002103 0002 0001 01 RADAR ANTENNA IS PROTECTED BY A RADOME
+ 0002 01 MISSING VALUE
+002104 0007 0000 01 HORIZONTAL POLARISATION
+ 0001 01 VERTICAL POLARISATION
+ 0002 01 RIGHT CIRCULAR POLARISATION
+ 0003 01 LEFT CIRCULAR POLARSZATION
+ 0004 01 HORIZONTAL AND VERTICAL POLARISATION
+ 0005 01 RIGHT AND LEFT CIRCULAR POLARISATION
+ 0015 01 MISSING VALUE
+002115 0007 0000 01 PDB
+ 0001 01 RSOIS
+ 0002 01 ASOS
+ 0003 01 PSYCHROMETER
+ 0004 01 F420
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002119 0008 0000 01 INTERMEDIATE FREQUENCY CALIBRATION MODE (IFCAL)
+ 0001 01 BUILT-IN TEST EQUIPMENT DIGITAL (BITE DGT)
+ 0002 01 BUILT-IN TEST EQUIPMENT RADIO FREQUENCY (BITE RF)
+ 0003 01 PRESET TRACKING (PSET TRK)
+ 0004 01 PRESET LOOP OUT
+ 0005 01 ACQUISITION
+ 0006 01 TRACKING
+ 0007 01 MISSING VALUE
+002131 0001 0001 01 STC OPERATIONAL
+002143 0021 0000 01 RESERVED
+ 0001 01 BREWER SPECTROPHOTOMETER
+ 0002 01 CAVER TEICHERT
+ 0003 01 DOBSON
+ 0004 01 DOBSON (JAPAN)
+ 0005 01 EHMET
+ 0006 01 FECKER TELESCOPE
+ 0007 01 HOELPER
+ 0008 01 JODMETER
+ 0009 01 FILTER OZONOMETER M-83
+ 0010 01 MAST
+ 0011 01 OXFORD
+ 0012 01 PAETZOLD
+ 0013 01 REGENER
+ 0014 01 RESERVED FOR FUTURE USE
+ 0015 01 VASSY FILTER OZONOMETER
+ 0016 01 CARBON IODIDE
+ 0017 01 SURFACE OZONE BUBLER
+ 0018 01 FILTER OZONOMETER M-124
+ 0019 01 ECC SONDE
+ 0127 01 MISSING VALUE
+002144 0008 0000 01 DIRECT SUN, ATTENUATOR #0
+ 0001 01 DIRECT SUN, ATTENUATOR #1
+ 0002 01 DIRECT SUN, ATTENUATOR #2
+ 0003 01 FOCUSSED MOON
+ 0004 01 FOCUSSED SUN
+ 0005 01 FOCUSSED SUN CORRECTED WITH ADJACENT SKY MEASUREMENTS
+ 0006 01 ZENITH SKY
+ 0015 01 MISSING VALUE
+002145 0009 0000 01 WAVELENGTH AD ORDINARY SETTING
+ 0001 01 WAVELENGTH BD ORDINARY SETTING
+ 0002 01 WAVELENGTH CD ORDINARY SETTING
+ 0003 01 WAVELENGTH CC' ORDINARY SETTING
+ 0004 01 WAVELENGTH AD FOCUSSING IMAGE
+ 0005 01 WAVELENGTH BD FOCUSSING IMAGE
+ 0006 01 WAVELENGTH CD FOCUSSING IMAGE
+ 0007 01 WAVELENGTH CC' FOCUSSING IMAGE
+ 0015 01 MISSING VALUE
+002146 0011 0000 01 ON DIRECT SUN
+ 0001 01 ON DIRECT MOON
+ 0002 01 ON BLUE ZENITH SKY
+ 0003 01 ON ZENITH CLOUD (UNIFORM STRATIFIED LAYER OF SMALL OPACITY)
+ 0004 02 ON ZENITH CLOUD (UNIFORM OR MODERATELY VARIABLE LAYER OF MED
+ IUM OPACITY)
+ 0005 02 ON ZENITH CLOUD (UNIFORM OR MODERATELY VARIABLE LAYER OF LAR
+ GE OPACITY)
+ 0006 02 ON ZENITH CLOUD (HIGHLY VARIABLE OPACITY, WITH OR WITOUT PRE
+ CIPITATION)
+ 0007 01 ON ZENITH CLOUD (FOG)
+ 0008 01 ON ZENITH HAZE
+ 0009 01 ON DIRECT SUN THROUGH THIN CLOUD, FOG OR HAZE
+ 0015 01 MISSING VALUE
+002148 0006 0000 01 RESERVED
+ 0001 01 ARGOS
+ 0002 01 GPS
+ 0003 01 GOES DCP
+ 0004 01 METEOSAT DCP
+ 0031 01 MISSING VALUE
+002149 0022 0000 01 UNSPECIFIED DRIFTING BUOY
+ 0001 01 STANDARD LAGRANGIAN DRIFTER (GLOBAL DRIFTER PROGRAMME)
+ 0002 01 STANDARD FGGE TYPE DRIFTING BUOY
+ 0003 01 WIND MEASURING FGGE TYPE DRIFTING BUOY
+ 0004 01 ICE FLOAT
+ 0008 01 UNSPECIFIED SUB-SURFACE FLOAT
+ 0009 01 SOFAR
+ 0010 01 ALACE
+ 0011 01 MARVOR
+ 0012 01 RAFOS
+ 0016 01 UNSPECIFIED MOORED BUOY
+ 0017 01 NOMAD
+ 0018 01 3-METRE DISCUS
+ 0019 01 10-12-METRE DISCUS
+ 0020 01 ODAS 30 SERIES
+ 0021 01 ATLAS (E.G. TAO AREA)
+ 0022 01 TRITON BUOY
+ 0023 01 RESERVED
+ 0024 01 OMNIDIRECTIONAL WAVERIDER
+ 0025 01 DIRECTIONAL WAVERIDER
+ 0026 01 SUB-SURFACE ARGO FLOAT
+ 0063 01 MISSING VALUE
+002150 0055 0000 01 RESERVED
+ 0001 01 HIRS 1
+ 0002 01 HIRS 2
+ 0003 01 HIRS 3
+ 0004 01 HIRS 4
+ 0005 01 HIRS 5
+ 0006 01 HIRS 6
+ 0007 01 HIRS 7
+ 0008 01 HIRS 8
+ 0009 01 HIRS 9
+ 0010 01 HIRS 10
+ 0011 01 HIRS 11
+ 0012 01 HIRS 12
+ 0013 01 HIRS 13
+ 0014 01 HIRS 14
+ 0015 01 HIRS 15
+ 0016 01 HIRS 16
+ 0017 01 HIRS 17
+ 0018 01 HIRS 18
+ 0019 01 HIRS 19
+ 0020 01 HIRS 20
+ 0021 01 MSU 1
+ 0022 01 MSU 2
+ 0023 01 MSU 3
+ 0024 01 MSU 4
+ 0025 01 SSU 1
+ 0026 01 SSU 2
+ 0027 01 SSU 3
+ 0028 01 AMSU-A 1
+ 0029 01 AMSU-A 2
+ 0030 01 AMSU-A 3
+ 0031 01 AMSU-A 4
+ 0032 01 AMSU-A 5
+ 0033 01 AMSU-A 6
+ 0034 01 AMSU-A 7
+ 0035 01 AMSU-A 8
+ 0036 01 AMSU-A 9
+ 0037 01 AMSU-A 10
+ 0038 01 AMSU-A 11
+ 0039 01 AMSU-A 12
+ 0040 01 AMSU-A 13
+ 0041 01 AMSU-A 14
+ 0042 01 AMSU-A 15
+ 0043 01 AMSU-B 1
+ 0044 01 AMSU-B 2
+ 0045 01 AMSU-B 3
+ 0046 01 AMSU-B 4
+ 0047 01 AMSU-B 5
+ 0048 01 AVHRR 1
+ 0049 01 AVHRR 2
+ 0050 01 AVHRR 3A
+ 0051 01 AVHRR 3B
+ 0052 01 AVHRR 4
+ 0053 01 AVHRR 5
+ 0063 01 MISSING VALUE
+002151 0009 0000 01 HIRS
+ 0001 01 MSU
+ 0002 01 SSU
+ 0003 01 AMSU-A1-1
+ 0004 01 AMSU-A1-2
+ 0005 01 AMSU-A2
+ 0006 01 AMSU-B
+ 0007 01 AVHRR
+ 2047 01 MISSING VALUE
+002152 0011 0001 01 HIGH-RESOLUTION INFRARED SOUNDER(HIRS)
+ 0002 01 MICROWAVE SOUNDING UNIT (MSU)
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+ 0009 01 GEOSTATIONARY IMAGER
+ 0010 01 GEOSTATIONARY SOUNDER
+ 0011 01 GEOSTATIONARY EARTH RADIATION (GERB)
+002158 0008 0001 01 MISMATCH IN RED VEC HPA
+ 0002 01 MISMATCH IN RED VEC RFSS
+ 0003 01 PTR CALIBRATION BAND 320 MHZ (KU)
+ 0004 01 PTR CALIBRATION BAND 80 MHZ (KU)
+ 0005 01 PTR CALIBRATION BAND 20 MHZ (KU)
+ 0006 01 PTR CALIBRATION BAND 160 MHZ (S)
+ 0007 01 KU FLIGHT CALIBRATION PARAMETERS AVAILABLE
+ 0008 01 S FLIGHT CALIBRATION PARAMETERS AVAILABLE
+002159 0005 0001 01 TEMPERATURE INCONSISTENCY
+ 0002 01 DATA IS MISSING
+ 0003 01 REDUNDANCY CHANNEL
+ 0004 01 POWER BUS PROTECTION
+ 0005 01 OVERVOLTAGE/OVERLOAD PROTECTION
+002163 0015 0000 01 AUTO EDITOR
+ 0001 01 IRW HEIGHT ASSIGNMENT
+ 0002 01 WV HEIGHT ASSIGNMENT
+ 0003 01 H2O INTERCEPT HEIGHT ASSIGNMENT
+ 0004 01 CO2 SLICING HEIGHT ASSIGNMENT
+ 0005 01 LOW PIXEL MAX GRADIENT
+ 0006 01 HIGHER PIXEL MAX GRADIENT
+ 0007 01 PRIMARY HEIGHT ASSIGNMENT
+ 0008 01 LAYER THICKNESS ASSIGNMENT
+ 0009 01 CUMULATIVE CONTRIBUTION FUNCTION -10 PERCENT HEIGHT
+ 0010 01 CUMULATIVE CONTRIBUTION FUNCTION -50 PERCENT HEIGHT
+ 0011 01 CUMULATIVE CONTRIBUTION FUNCTION -90 PERCENT HEIGHT
+ 0012 02 CUMULATIVE CONTRIBUTION FUNCTION - HEIGHT OF
+ MAXIMUM GRADIENT
+ 0014 01 COMPOSITE HEIGHT ASSIGNMENT
+ 0015 01 MISSING VALUE
+002164 0004 0000 01 LP - NORMS LEAST SQUARE MINIMUM
+ 0001 01 EN - EUCLIDEAN NORM WITH RADIANCE CORRELATION
+ 0002 01 CC - CROSS CORRELATION
+ 0007 01 MISSING VALUE
+002166 0006 0000 01 TYPE NOT DEFINED
+ 0001 01 AUTOMATED STATISTICAL REGRESSION
+ 0002 01 CLEAR PATH
+ 0003 01 PARTLY CLOUDY PATH
+ 0004 01 CLOUDY PATH
+ 0015 01 MISSING VALUE
+002167 0004 0000 01 METHOD NOT DEFINE
+ 0001 01 1B RAW RADIANCE
+ 0002 01 PROCESSED RADIANCE
+ 0015 01 MISSING VALUE
+002169 0004 0000 01 CUP ROTOR
+ 0001 01 PROPELLER ROTOR
+ 0002 01 WIND OBSERVATION THROUGH AMBIENT NOISE (WOTAN)
+ 0015 01 MISSING VALUE
+002172 0003 0001 01 RETRIEVAL FROM A NADIR SOUNDING
+ 0002 01 RETRIEVAL FROM A LIMB SOUNDING
+ 0255 01 MISSING VALUE
+002175 0009 0000 01 MANUAL MEASUREMENT
+ 0001 01 TIPPING BUCKET METHOD
+ 0002 01 WEIGHING METHOD
+ 0003 01 OPTICAL METHOD
+ 0004 01 PRESSURE METHOD
+ 0005 01 FLOAT METHOD
+ 0006 01 DROP COUNTER METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002176 0006 0000 01 MANUAL OBSERVATION
+ 0001 01 VIDEO CAMERA METHOD
+ 0002 01 INFRA-RED METHOD
+ 0003 01 LASER METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002177 0005 0000 01 MANUAL OBSERVATION
+ 0001 01 ULTRASONIC METHOD
+ 0002 01 VIDEO CAMERA METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002178 0005 0000 01 MANUAL OBSERVATION
+ 0001 01 OPTICAL METHOD
+ 0002 01 CAPACITIVE METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002179 0006 0000 01 MANUAL OBSERVATION
+ 0001 01 VAISALA ALGORITHM
+ 0002 01 ASOS (FAA) ALGORITHM
+ 0003 01 AWOS (CANADA) ALGORITHM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002180 0008 0000 01 MANUAL OBSERVATION
+ 0001 02 OPTICAL SCATTER SYSTEM COMBINED WITH PRECIPITATION
+ OCCURRENCE SENSING SYSTEM
+ 0002 01 FORWARD AND/OR BACK-SCATTER SYSTEM OF VISIBLE LIGHT
+ 0003 01 FORWARD AND/OR BACK-SCATTER SYSTEM OF INFRARED LIGHT
+ 0004 01 INFRARED LIGHT EMITTING DIODE (IRED) SYSTEM
+ 0005 01 DOPPLER RADAR SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002181 0005 0001 01 RAIN DETECTOR
+ 0002 01 FREEZING RAIN SENSOR
+ 0003 01 ICE DETECTION SENSOR
+ 0004 01 HAIL AND ICE PELLET SENSOR
+ 0020 01 OTHER
+002182 0007 0000 01 MANUAL MEASUREMENT
+ 0001 01 TRANSMISSOMETER SYSTEM (BASE > 25)
+ 0002 01 TRANSMISSOMETER SYSTEM (BASE < 25 M)
+ 0003 01 FORWARD SCATTER SYSTEM
+ 0004 01 BACK SCATTER SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002183 0009 0000 01 MANUAL OBSERVATION
+ 0001 01 CEILOMETER SYSTEM
+ 0002 01 INFRARED CAMERA SYSTEM
+ 0003 01 MICROWAVE VISUAL CAMERA SYSTEM
+ 0004 01 SKY IMAGER SYSTEM
+ 0005 01 VIDEO TIME LAPSED CAMERA SYSTEM
+ 0006 01 MICRO PULSE LIDAR (MPL) SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002184 0008 0000 01 MANUAL OBSERVATION
+ 0001 01 LIGHTNING IMAGING SENSOR
+ 0002 01 ELECTRICAL STORM IDENTIFICATION SENSOR
+ 0003 01 MAGNETIC FINDER SENSOR
+ 0004 01 LIGHTNING STRIKE SENSOR
+ 0005 01 FLASH COUNTER
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002185 0007 0000 01 MANUAL MEASUREMENT
+ 0001 01 BALANCED FLOATING METHOD
+ 0002 01 PRESSURE METHOD
+ 0003 01 ULTRASONIC METHOD
+ 0004 01 HYDRAULIC METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002186 0023 0001 01 PRECIPITATION-UNKNOWN TYPE
+ 0002 01 LIQUID PRECIPITATION NOT FREEZING
+ 0003 01 LIQUID FREEZING PRECIPITATION
+ 0004 01 DRIZZLE
+ 0005 01 RAIN
+ 0006 01 SOLID PRECIPITATION
+ 0007 01 SNOW
+ 0008 01 SNOW GRAINS
+ 0009 01 SNOW PELLETS
+ 0010 01 ICE PELLETS
+ 0011 01 ICE CRYSTALS
+ 0012 01 DIAMOND DUST
+ 0013 01 SMALL HAIL
+ 0014 01 HAIL
+ 0015 01 GLAZE
+ 0016 01 RIME
+ 0017 01 SOFT RIME
+ 0018 01 HARD RIME
+ 0019 01 CLEAR ICE
+ 0020 01 WET SNOW
+ 0021 01 HOAR FROST
+ 0022 01 DEW
+ 0023 01 WHITE DEW
+002187 0011 0001 01 DUST/SAND WHIRL
+ 0002 01 SQUALLS
+ 0003 01 SAND STORM
+ 0004 01 DUST STORM
+ 0005 01 LIGHTNING - CLOUD TO SURFACE
+ 0006 01 LIGHTNING - CLOUD TO CLOUD
+ 0007 01 LIGHTNING - DISTANT
+ 0008 01 THUNDERSTORM
+ 0009 01 FUNNEL CLOUD NOT TOUCHING SURFACE
+ 0010 01 FUNNEL CLOUD TOUCHING SURFACE
+ 0011 01 SPRAY
+002188 0010 0001 01 FOG
+ 0002 01 ICE FOG
+ 0003 01 STEAM FOG
+ 0007 01 MIST
+ 0008 01 HAZE
+ 0009 01 SMOKE
+ 0010 01 VOLCANIC ASH
+ 0011 01 DUST
+ 0012 01 SAND
+ 0013 01 SNOW
+002189 0004 0001 01 MANUAL OBSERVATION
+ 0002 01 ALL LIGHTNING STRIKES WITHOUT DISCRIMINATION
+ 0003 01 LIGHTNING STRIKES CLOUD TO GROUND ONLY
+ 0004 02 ALL LIGHTNING STRIKES WITH DISCRIMINATION BETWEEN
+ CLOUD TO GROUND AND CLOUD TO CLOUD
+002194 0002 0000 01 FGGE
+ 0015 01 MISSING VALUE
+002196 0017 0000 01 NIMBUS
+ 0001 01 VTPR
+ 0002 01 TIROS 1 ( TIROS NOAA 6 TO NOAA 13)
+ 0003 01 TIROS 2 ( NOAA-14 ONWARD)
+ 0031 01 DMSP
+ 0061 01 EUMETSAT POLAR SYSTEM (EPS)
+ 0091 01 ERS
+ 0121 01 ADEOS
+ 0241 01 GOES
+ 0271 01 GMS
+ 0301 01 INSAT
+ 0331 01 METEOSAT OPERATIONAL PROGRAMME(MOP)
+ 0332 01 METEOSAT TRANSITIONAL PROGRAMME(MTP)
+ 0333 01 METEOSAT SECOND GENERATION PROGRAMME(MSG)
+ 0351 01 GOMS
+ 0381 01 FY-2
+ 0512 01 MISSING VALUE
+002199 0004 0000 01 RESERVED
+ 0001 01 TABLE WITH FULL RANGE OF HUMMIDITY VALUES IN LAYER
+ 0002 01 REGRESSION TECHNIQUE ON 2 HUMMIDITY VALUES IN LAYER
+ 0015 01 MISSING VALUE
+002216 0017 0001 01 CALIBRATION/MEASUREMENT PULSE FLAG (1)
+ 0002 01 CALIBRATION/MEASUREMENT PULSE FLAG (2)
+ 0003 01 OUTER ANTENNA BEAM
+ 0004 01 SIGMA-0 CELL IS AFT OF SPACECRAFT
+ 0005 01 CURRENT MODE (1)
+ 0006 01 CURRENT MODE (2)
+ 0007 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (1)
+ 0008 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (2)
+ 0009 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (3)
+ 0010 01 LOW RESOLUTION MODE - WHOLE PULSE DATA
+ 0011 01 SCATTEROMETER ELECTRONIC SUBSYSTEM B
+ 0012 01 ALTERNATE SPIN RATE - 19.8 RPM
+ 0013 01 RECEIVER PROTECTION ON
+ 0014 01 SLICES PER COMPOSITE FLAG(1)
+ 0015 01 SLICES PER COMPOSITE FLAG(2)
+ 0016 01 SLICES PER COMPOSITE FLAG(3)
+ 0017 01 MISSING VALUE
+002231 0015 0000 01 RESERVED
+ 0001 01 IRW HEIGHT ASSIGNMENT
+ 0002 01 WV HEIGHT ASSIGNMENT
+ 0003 01 H2O INTERCEPT HEIGHT ASSIGNMENT
+ 0004 01 CO2 SLICING HEIGHT ASSIGNMENT
+ 0005 01 LOW PIXEL MAX GRADIENT
+ 0006 01 HIGHER PIXEL MAX GRADIENT
+ 0007 01 PRIMARY HEIGHT ASSIGNMENT
+ 0008 01 LAYER THICKNESS ASSIGNMENT
+ 0009 01 CUMULATIVE CONTRIBUTION FUNCTION -10 PERCENT HEIGHT
+ 0010 01 CUMULATIVE CONTRIBUTION FUNCTION -50 PERCENT HEIGHT
+ 0011 01 CUMULATIVE CONTRIBUTION FUNCTION -90 PERCENT HEIGHT
+ 0012 02 CUMULATIVE CONTRIBUTION FUNCTION - HEIGHT OF MAXIMU
+ M GRADIENT
+ 0014 01 COMPOSITE HEIGHT ASSIGNMENT
+ 0015 01 MISSING VALUE
+002232 0004 0000 01 P - NORMS LEAST SQUARE MINIMUM
+ 0001 01 EN - EUCLIDEAN NORM WITH RADIANCE CORRELATION
+ 0002 01 CC - CROSS CORRELATION
+ 0003 01 MISSING VALUE
+002251 0004 0000 01 METHOD NOT DEFINED
+ 0001 01 1B RAW RADIANCE
+ 0002 01 PROCESSED RADIANCE
+ 0015 01 MISSING VALUE
+002252 0012 0001 01 HIGH-RESOLUTION INFRARED SOUNDER(HIRS)
+ 0002 01 MICROWAVE SOUNDING UNIT (MSU)
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+ 0009 01 GEOSTATIONARY IMAGER
+ 0010 01 GEOSTATIONARY SOUNDER
+ 0011 01 GEOSTATIONARY EARTH RADIATION (GERB)
+ 0012 01 MULTI-CHANNEL SCANNING RADIOMETER
+002254 0006 0000 01 TYPE NOT DEFINED
+ 0001 01 AUTOMATED STATISTICAL REGRESSION
+ 0002 01 CLEAR PATH
+ 0003 01 PARTLY CLOUDY PATH
+ 0004 01 CLOUDY PATH
+ 0015 01 MISSING VALUE
+004059 0005 0001 01 00 UTC
+ 0002 01 06 UTC
+ 0003 01 12 UTC
+ 0004 01 18 UTC
+ 0005 01 OTHER HOURS
+008001 0007 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 MAXIMUM WIND LEVEL
+ 0005 01 SIGNIFICANT LEVEL, TEMPERATURE AND/OR RELATIVE HUMIDITY
+ 0006 01 SIGNIFICANT LEVEL, WIND
+ 0007 01 MISSING VALUE
+008002 0013 0000 02 OBSERVING RULES FOR BASE OF LOWEST CLOUD AND CLOUD TYPES OF
+ FM 12-IX EXT. SYNOP AND FM 13-IX EXT. SHIP APPLY
+ 0001 01 FIRST NON - CB SIGNIFICANT LAYER
+ 0002 01 SECOND NON - CB SIGNIFICANT LAYER
+ 0003 01 THIRD NON - CB SIGNIFICANT LAYER
+ 0004 01 CUMULONIMBUS LAYER
+ 0005 01 CEILING
+ 0006 01 CLOUD NOT DETECTED BELOW THE FOLLOWING HEIGHT(S)
+ 0007 01 LOW CLOUD
+ 0008 01 MIDDLE CLOUD
+ 0009 01 HIGH CLOUD
+ 0010 02 CLOUD LAYER WITH BASE BELOW THE STATION LEVEL AND TOP
+ ABOVE THE STATION LEVEL
+ 0011 01 CLOUD LAYER WITH BASE AND TOP BELOW THE STATION LEVEL
+ 0063 01 MISSING VALUE
+008003 0009 0000 01 SURFACE
+ 0001 01 BASE OF SATELLITE SOUNDING
+ 0002 01 CLOUD TOP
+ 0003 01 TROPOPAUSE
+ 0004 01 PRECIPITABLE WATER
+ 0005 01 SOUNDING RADIANCES
+ 0006 01 MEAN TEMPERATURES
+ 0007 01 OZON
+ 0063 01 MISSING VALUE
+008004 0006 0002 01 UNSTEADY (UNS)
+ 0003 01 LEVEL FLIGHT, ROUTINE OBSERVATION (LVR)
+ 0004 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED (LVW)
+ 0005 01 ASCENDING (ASC)
+ 0006 01 DESCENDING(DES)
+ 0007 01 MISSING VALUE
+008005 0007 0000 01 RESERVED
+ 0001 01 STORM CENTRE
+ 0002 01 OUTER LIMIT OR EDGE OF STORM
+ 0003 01 LOCATION OF MAXIMUM WIND
+ 0004 01 LOCATION OF STORM IN THE PERTURBED ANALYSIS
+ 0005 01 LOCATION OF STORM IN THE ANALYSIS
+ 0015 01 MISSING VALUE
+008006 0008 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 PROMINENT MAXIMUM LEVEL
+ 0005 01 PROMINENT MINIMUM LEVEL
+ 0006 01 MINIMUM PRESSURE LEVEL
+ 0007 01 RESERVED
+ 0008 01 LEVEL OF UNDETERMINED SIGNIFICANCE
+008007 0005 0000 01 POINT
+ 0001 01 LINE
+ 0002 01 AREA
+ 0003 01 VOLUME
+ 0015 01 MISSING VALUE
+008008 0008 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 LEVEL OF BETA RADIATION MAXIMUM
+ 0005 01 LEVEL OF GAMMA RADIATION MAXIMUM
+ 0006 01 MINIMUM PRESSURE LEVEL
+ 0007 01 RESERVED
+ 0008 01 LEVEL OF UNDETERMINED SIGNIFICANCE
+008009 0016 0000 01 LEVEL FLIGHT, ROUTINE OBSERVATION, UNSTEADY
+ 0001 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED, UNSTEADY
+ 0002 01 UNSTEADY (UNS)
+ 0003 01 LEVEL FLIGHT, ROUTINE OBSERVATION (LVR)
+ 0004 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED (LVW)
+ 0005 01 ASCENDING (ASC)
+ 0006 01 DESCENDING (DES)
+ 0007 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS
+ 0008 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS, UNSTEADY
+ 0009 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS
+ 0010 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS, UNSTEADY
+ 0011 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS
+ 0012 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS, UNSTEADY
+ 0013 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS
+ 0014 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS, UNSTEADY
+ 0015 01 MISSING VALUE
+008010 0013 0000 01 RESERVED
+ 0001 01 BARE SOIL
+ 0002 01 BARE ROCK
+ 0003 01 LAND GRASS COVER
+ 0004 01 WATER (LAKE, SEA)
+ 0005 01 FLOOD WATER UNDERNEATH
+ 0006 01 SNOW
+ 0007 01 ICE
+ 0008 01 RUNWAY OR ROAD
+ 0009 01 SHIP OR PLATFORM DECK IN STEEL
+ 0010 01 SHIP OR PLATFORM DECK IN WOOD
+ 0011 01 SHIP OR PLATFORM DECK PARTLY COVERED WITH RUBBER MAT
+ 0031 01 MISSING VALUE
+008011 0026 0000 01 QUASI-STATIONARY FRONT AT THE SURFACE
+ 0001 01 QUASI-STATIONARY FRONT ABOVE THE SURFACE
+ 0002 01 WARM FRONT AT THE SURFACE
+ 0003 01 WARM FRONT ABOVE THE SURFACE
+ 0004 01 COLD FRONT AT THE SURFACE
+ 0005 01 COLD FRONT ABOVE THE SURFACE
+ 0006 01 OCCLUSION
+ 0007 01 INSTABILITY LINE
+ 0008 01 INTERTROPICAL FRONT
+ 0009 01 CONVERGENCE LINE
+ 0010 01 JET STREAM
+ 0011 01 CLOUD CLEAR
+ 0012 01 CLOUD
+ 0013 01 TURBULENCE
+ 0014 01 STORM
+ 0015 01 AIRFRAME ICING
+ 0016 01 PHENOMENON
+ 0017 01 VOLCANO
+ 0018 01 ATMOSPHERICS
+ 0020 01 SPECIAL CLOUDS
+ 0021 01 THUNDERSTORM (VAL)
+ 0022 01 TROPICAL CYCLONE (VAL)
+ 0023 01 MOUNTAIN WAVE (VAL)
+ 0024 01 DUSTSTORM (VAL)
+ 0025 01 SANDSTORM (VAL)
+ 0063 01 MISSING VALUE
+008012 0004 0000 01 LAND
+ 0001 01 SEA
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008013 0004 0000 01 NIGHT
+ 0001 01 DAY
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008014 0010 0000 01 10-MINUTE MEAN VALUE - NORMAL VALUE
+ 0001 02 10-MINUTE MEAN VALUE - ABOVE THE UPPER LIMIT FOR ASSESSMENT
+ OF RVR (P)
+ 0002 02 10-MINUTE MEAN VALUE - BELOW LOWER LIMIT FOR ASSESSMENT OF R
+ VR (M)
+ 0003 01 ONE MINUTE MINIMUM VALUE - NORMAL VALUE
+ 0004 02 ONE MINUTE MINIMUM VALUE - ABOVE THE UPPER LIMIT FOR ASSESSM
+ ENT OF RVR (P)
+ 0005 02 ONE MINUTE MINIMUM VALUE - BELOW LOWER LIMIT FOR ASSESSMENT
+ OF RVR (M)
+ 0006 01 ONE MINUTE MAXIMUM VALUE - NORMAL VALUE
+ 0007 02 ONE MINUTE MAXIMUM VALUE - ABOVE THE UPPER LIMIT FOR ASSESS
+ MENT OF RVR (P)
+ 0008 02 ONE MINUTE MAXIMUM VALUE - BELOW LOWER LIMIT FOR ASSESSMENT
+ OF RVR (M)
+ 0015 01 MISSING VALUE
+008016 0005 0000 01 NOSIG
+ 0001 01 BECMG
+ 0002 01 TEMPO
+ 0003 01 FM
+ 0007 01 MISSING VALUE
+008017 0004 0000 01 FM
+ 0001 01 TL
+ 0002 01 AT
+ 0003 01 MISSING VALUE
+008018 0005 0001 01 LAND IS PRESENT
+ 0002 01 SURFACE ICE MAP INDICATES ICE IS PRESENT
+ 0011 01 ICE MAP DATA NOT AVAILABLE
+ 0012 01 ATTENUATION MAP DATA NOT AVAILABLE
+ 0017 01 MISSING VALUE
+008021 0032 0000 01 RESERVED
+ 0001 01 TIME SERIES
+ 0002 01 TIME AVERAGED
+ 0003 01 ACCUMULATED
+ 0004 01 FORECAST
+ 0005 01 FORECAST TIME SERIES
+ 0006 01 FORECAST TIME AVERAGED
+ 0007 01 FORECAST ACCUMULATED
+ 0008 01 ENSEMBLE MEAN
+ 0009 01 ENSEMBLE MEAN TIME SERIES
+ 0010 01 ENSEMBLE MEAN TIME AVERAGED
+ 0011 01 ENSEMBLE MEAN ACCUMULATED
+ 0012 01 ENSEMBLE MEAN FORECAST
+ 0013 01 ENSEMBLE MEAN FORECAST TIME SERIES
+ 0014 01 ENSEMBLE MEAN FORECAST AVERAGED
+ 0015 01 ENSEMBLE MEAN FORECAST ACCUMULATED
+ 0016 01 ANALYSIS
+ 0017 01 START OF PHENOMENON
+ 0018 01 RADIOSONDE LAUNCH TIME
+ 0019 01 START OF ORBIT
+ 0020 01 END OF ORBIT
+ 0021 01 TIME OF ASCENDING NODE
+ 0022 01 TIME OF OCCURENCE OF WIND SHIFT
+ 0023 01 MONITORING PERIOD
+ 0024 01 AGREED TIME LIMIT FOR REPORT RECEPTION
+ 0025 01 NOMINAL REPORTING TIME
+ 0026 01 TIME OF LAST KNOWN POSITION
+ 0027 01 FIRST GUESS --NOT WMO ENTRY
+ 0028 01 START OF SCAN --NOT WMO ENTRY
+ 0029 01 END OF SCAN --NOT WMO ENTRY
+ 0030 01 RESERVED
+ 0031 01 MISSING VALUE
+008023 0017 0002 01 MAXIMUM VALUE
+ 0003 01 MINIMUM VALUE
+ 0004 01 MEAN VALUE
+ 0005 01 MEDIAN VALUE
+ 0006 01 MODAL VALUE
+ 0007 01 MEAN ABSOLUTE ERROR
+ 0009 01 BEST ESTIMATE OF STANDARD DEVIATION (N-1)
+ 0010 01 STANDARD DEVIATION
+ 0011 01 HARMONIC MEAN
+ 0012 01 ROOT MEAN SQUARE VECTOR ERROR
+ 0013 01 ROOT-MEAN-SQUARE
+ 0032 01 PROBABILITY OF GROSS ERROR
+ 0033 01 PRESCRIBED OBSERVATION ERROR
+ 0034 01 PERSISTENCE OBSERVATION ERROR
+ 0035 01 FINAL OBSERVATION ERROR
+ 0036 01 REPRESENTATIVNESS OBSERVATION ERROR
+ 0063 01 MISSING
+008024 0015 0002 01 OBSERVED MINUS MAXIMUM
+ 0003 01 OBSERVED MINUS MINIMUM
+ 0004 01 OBSERVED MINUS MEAN
+ 0005 01 OBSERVED MINUS MEDIAN
+ 0006 01 OBSERVED MINUS MODE
+ 0011 01 OBSERVED MINUS CLIMATOLOGY (ANOMALY)
+ 0012 01 OBSERVED MINUS ANALYZED VALUE
+ 0013 01 OBSERVED MINUS INITIALISED ANALYZED VALUE
+ 0014 01 OBSERVED MINUS FORECAST VALUE
+ 0021 01 OBSERVED MINUS INTERPOLATED VALUE
+ 0022 01 OBSERVED MINUS HYDROSTATICALLY CALCULATED VALUE
+ 0032 01 OBSERVED MINUS FIRST GUESS
+ 0033 01 OBSERVED MINUS ANALYSIS
+ 0034 01 OBSERVED MINUS INITIALIZED ANALYSIS
+ 0063 01 MISSING
+008025 0005 0000 02 UNIVERSAL TIME COORDINATED (UTC) MINUS
+ LOCAL STANDARD TIME (LST)
+ 0001 01 LOCAL STANDARD TIME
+ 0002 01 UNIVERSAL TIME COORDINATED (UTC) MINUS SATELLITE CLOCK
+ 0005 01 TIME DIFFERENCE FROM EDGE OF PROCESSING SEGMENT
+ 0015 01 MISSING
+008026 0005 0000 01 AVERAGING KERNEL MATRIX
+ 0001 01 CORRELATION MATRIX
+ 0002 02 LOWER TRIANGULAR CORRELATION MATRIX SQUARE ROOT (L FROM C=LL
+ T)
+ 0003 02 INVERSE LOWER TRIANGULAR CORRELATION MATRIX SQUARE ROOT (L**
+ -1)
+ 0063 01 MISSING VALUE
+008027 0007 0000 01 ASSUME NO PARTICULAR MATRIX GEOMETRY
+ 0001 01 DIAGONAL MATRIX
+ 0002 01 TRIDIAGONAL MATRIX
+ 0003 01 MULTI-DIAGONAL MATRIX (GENERAL CASE: DIAGONAL AND ABOVE)
+ 0004 01 LOWER TRIANGULAR MATRIX
+ 0005 01 SYMETRICAL MATRIX
+ 0063 01 MISSING VALUE
+008029 0005 0000 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0001 01 ENCLOSED SEA OR LAKE
+ 0002 01 CONTINENTAL ICE
+ 0003 01 LAND
+ 0255 01 MISSING
+008033 0006 0000 01 RESERVED
+ 0001 01 PERCENTAGE CONFIDENCE CALCULATED USING CLOUD FRACTION
+ 0002 02 PERCENTAGE CONFIDENCE CALCULATED USING STANDARD
+ DEVIATION OF TEMPERATURE
+ 0003 02 PERCENTAGE CONFIDENCE CALCULATED USING PROBABILITY OF
+ THE CLOUD CONTAMINATION
+ 0004 02 PERCENTAGE CONFIDENCE CALCULATED USING NORMALITY OF DISTRIBU
+ TION
+ 0127 01 MISSING
+008035 0008 0000 01 GLOBAL
+ 0001 01 REGIONAL
+ 0002 01 NATIONAL
+ 0003 01 SPECIAL
+ 0004 01 BILATERAL
+ 0005 01 RESERVED
+ 0006 01 RESERVED
+ 0007 01 MISSING
+008036 0008 0000 01 WMO SECRETARIAT
+ 0001 01 WMO
+ 0002 01 RSMC
+ 0003 01 NMC
+ 0004 01 RTH
+ 0005 01 OBSERVING SITE
+ 0006 01 OTHER
+ 0007 01 MISSING
+008039 0008 0000 01 ISSUE TIME OF FORECAST
+ 0001 01 TIME OF COMMNENCEMENT OF PERIOD OF THE FORECAST
+ 0002 01 TIME OF ENDING OF PERIOD OF THE FORECAST
+ 0003 01 FORECSAT TIME OF MAXIMUM TEMPERATURE
+ 0004 01 FORECSAT TIME OF MINIMUM TEMPERATURE
+ 0005 01 TIME OF BEGINNING OF THE FORECAST
+ 0006 01 TIME OF ENDING OF THE FORECAST
+ 0063 01 MISSING VALUE
+008040 0043 0000 01 HIGH RESOLUTION DATA SAMPLE
+ 0001 01 WITHIN 20 HPA OF SURFACE
+ 0002 02 PRESSURE LESS THAN 10 HPA (I.E., 9, 8, 7, ETC.)
+ WHEN NO OTHER REASON APPLIES
+ 0003 01 BASE PRESSURE LEVEL FOR STABILITY INDEX
+ 0004 01 BEGIN DOUBTFUL TEMPERATURE, HEIGHT DATA
+ 0005 01 BEGIN MISSING DATA (ALL ELEMENTS)
+ 0006 01 BEGIN MISSING RH DATA
+ 0007 01 BEGIN MISSING TEMPERATURE DATA
+ 0008 02 HIGHEST LEVEL REACHED BEFORE BALLOON
+ DESCENT BECAUSE OF ICING OR TURBULENCE
+ 0009 01 END DOUBTFUL TEMPERATURE, HEIGHT DATA
+ 0010 01 END MISSING DATA (ALL ELEMENTS)
+ 0011 01 END MISSING RH DATA
+ 0012 01 END MISSING TEMPERATURE DATA
+ 0013 01 ZERO DEGREES C CROSSING(S) FOR RADAT
+ 0014 01 STANDARD PRESSURE LEVEL
+ 0015 01 OPERATOR ADDED LEVEL
+ 0016 01 OPERATOR DELETED LEVEL
+ 0017 01 BALLOON RE-ASCENDED BEYOND PREVIOUS HIGHEST ASCENT LEVEL
+ 0018 01 SIGNIFICANT RH LEVEL
+ 0019 01 RH LEVEL SELECTION TERMINATED
+ 0020 01 SURFACE LEVEL
+ 0021 01 SIGNIFICANT TEMPERATURE LEVEL
+ 0022 01 MANDATORY TEMPERATURE LEVEL
+ 0023 01 FLIGHT TERMINATION LEVEL
+ 0024 01 TROPOPAUSE(S)
+ 0025 01 AIRCRAFT REPORT
+ 0026 01 INTERPOLATED (GENERATED) LEVEL
+ 0027 01 MANDATORY WIND LEVEL
+ 0028 01 SIGNIFICANT WIND LEVEL
+ 0029 01 MAXIMUM WIND LEVEL
+ 0030 01 INCREMENTAL WIND LEVEL (FIXED REGIONAL)
+ 0031 01 INCREMENTAL HEIGHT LEVEL (GENERATED)
+ 0032 01 WIND TERMINATION LEVEL
+ 0033 01 PRESSURE 100 TO 110 HPA, WHEN NO OTHER REASON APPLIES
+ 0040 01 SIGNIFICANT THERMODYNAMIC LEVEL (INVERSION)
+ 0041 01 SIGNIFICANT RH LEVEL ( PER NCDC CRITERIA)
+ 0042 01 SIGNIFICANT TEMPERATURE LEVEL (PER NCDC)
+ 0043 01 BEGIN MISSING WIND DATA
+ 0044 01 END MISSING WIND DATA
+ 0060 01 LEVEL OF 80-KNOT ISOTACH ABOVE JET
+ 0061 01 LEVEL OF 80-KNOT ISOTACH BELOW JET
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+008041 0009 0000 01 PARENT SITE
+ 0001 01 OBSERVATION SITE
+ 0002 01 BALLOON MANUFACTURE DATE
+ 0003 01 BALLOON LAUNCH POINT
+ 0004 01 SURFACE OBSERVATION
+ 0005 01 SURFACE OBSERVATION DISPLACEMENT FROM LAUNCH POINT
+ 0006 01 FLIGHT LEVEL OBSERVATION
+ 0007 01 FLIGHT LEVEL TERMINATION POINT
+ 0031 01 MISSING VALUE
+008042 0013 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 MAXIMUM WIND LEVEL
+ 0005 01 SIGNIFICANT TEMPERATURE LEVEL
+ 0006 01 SIGNIFICANT HUMIDITY LEVEL
+ 0007 01 SIGNIFICANT WIND LEVEL
+ 0008 01 BEGINNING OF MISSING TEMPERATURE DATA
+ 0009 01 END OF MISSING TEMPERATURE DATA
+ 0010 01 BEGINNING OF MISSING HUMIDITY DATA
+ 0011 01 END OF MISSING HUMIDITY DATA
+ 0012 01 BEGINNING OF MISSING WIND DATA
+ 0013 01 END OF MISSING WIND DATA
+008043 0021 0000 01 OZONE, O3,10028-15-6
+ 0001 01 WATER VAPOUR, H2O, 7732-18-5
+ 0002 01 METHANE, CH4, 74-82-8
+ 0003 01 CARBON DIOXIDE, CO2, 37210-16-5
+ 0004 01 CARBON MONOXIDE, CO, 630-08-0
+ 0005 01 NITROGEN DIOXIDE, NO2, 10102-44-0
+ 0006 01 NITROUS OXIDE, N2O, 10024-97-2
+ 0007 01 FORMALDEHYDE, HCHO, 50-00-0
+ 0008 01 SULFUR DIOXIDE, SO2, 7446-09-5
+ 0009 01 BROMINE OXIDE, BRO, 15656-19-6
+ 0010 01 CHLORINE DIOXIDE, OCLO, 10049-04-4
+ 0011 01 NITROGEN MONOXIDE, NO, 10102-43-9
+ 0012 01 AMMONIA, NH3, 7664-41-7
+ 0025 01 PARTICULATE MATTER < 1.0 MICRONS
+ 0026 01 PARTICULATE MATTER < 2.5 MICRONS
+ 0027 01 PARTICULATE MATTER < 10 MICRONS
+ 0028 01 AEROSOLS GENERIC
+ 0029 01 SMOKE GENERIC
+ 0030 01 CRUSTAL MATERIAL (GENERIC DUST)
+ 0031 01 VOLCANIC ASH
+ 0255 01 MISSING
+008050 0011 0000 01 RESERVED
+ 0001 01 PRESSURE
+ 0002 01 TEMPERATURE
+ 0003 01 EXTREME TEMPERATURE
+ 0004 01 VAPOUR PRESSURE
+ 0005 01 PRECIPITATION
+ 0006 01 SUNSHINE DURATION
+ 0007 01 MAXIMUM TEMPERATURE
+ 0008 01 MINIMUM TEMPERATURE
+ 0009 01 WIND
+ 0015 01 MISSING VALUE
+008051 0007 0001 01 PRESSURE
+ 0002 01 TEMPERATURE
+ 0003 01 EXTREME TEMPERATURE
+ 0004 01 VAPOUR PRESSURE
+ 0005 01 PRECIPITATION
+ 0006 01 SUNSHINE DURATION
+ 0007 01 MISSING VALUE
+008052 0026 0000 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 10 M/S
+ 0001 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 20 M/S
+ 0002 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 30 M/S
+ 0003 01 MAXIMUM TEMPERATURE LESS THAN 273.2 K
+ 0004 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 298.2 K
+ 0005 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 303.2 K
+ 0006 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 308.2 K
+ 0007 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 313.2 K
+ 0008 01 MINIMUM TEMPERATURE LESS THAN 273.2 K
+ 0009 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 273.2 K
+ 0010 01 PRECIPITATION EQUAL TO OR MORE THAN 1.0 KG/M**2
+ 0011 01 PRECIPITATION EQUAL TO OR MORE THAN 5.0 KG/M**2
+ 0012 01 PRECIPITATION EQUAL TO OR MORE THAN 10.0 KG/M**2
+ 0013 01 PRECIPITATION EQUAL TO OR MORE THAN 50.0 KG/M**2
+ 0014 01 PRECIPITATION EQUAL TO OR MORE THAN 100.0 KG/M**2
+ 0015 01 PRECIPITATION EQUAL TO OR MORE THAN 150.0 KG/M**2
+ 0016 01 SNOW DEPTH MORE THAN 0.0 M
+ 0017 01 SNOW DEPTH MORE THAN 0.01 M
+ 0018 01 SNOW DEPTH MORE THAN 0.10 M
+ 0019 01 SNOW DEPTH MORE THAN 0.50 M
+ 0020 01 HORIZONTAL VISIBILITY LESS THAN 50 M
+ 0021 01 HORIZONTAL VISIBILITY LESS THAN 100 M
+ 0022 01 HORIZONTAL VISIBILITY LESS THAN 1000 M
+ 0023 01 HAIL
+ 0024 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+008053 0004 0000 01 VALUE OCCURED ON ONLY ONE DAY IN THE MONTH
+ 0001 01 VALUE OCCURED ON MORE THAN ONE DAY IN THE MONTH
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008054 0003 0000 01 WIND SPEED OR GUST IS AS REPORTED
+ 0001 02 WIND SPEED IS GREATER THAN THAT REPRTED (P IN METAR/TAF/SPEC
+ I)
+ 0007 01 MISSING VALUE
+008060 0008 0000 01 RESERVED
+ 0001 01 RANGE
+ 0002 01 AZIMUTH
+ 0003 01 HORIZONTAL
+ 0004 01 VERTICAL
+ 0005 01 NORTH/SOUTH
+ 0006 01 EAST/WEST
+ 0015 01 MISSING VALUE
+008065 0004 0000 01 NO SUN-GLINT
+ 0001 01 SUN-GLINT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008066 0004 0000 01 OPAQUE
+ 0001 01 SEMI-TRANSPARENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008070 0006 0000 01 RESERVED
+ 0001 01 RESERVED
+ 0002 02 EARTH LOCATED INSTRUMENT COUNTS,
+ CALIBRATION COEFFICIENTS AND HOUSEKEEPING (LEVEL 1B)
+ 0003 01 EARTH LOCATED CALIBRATED RADIANCES (LEVEL 1C)
+ 0004 02 MAPPED TO A COMMON FOOTPRINT, EARTH LOCATED
+ CALIBRATED RADIANCES (LEVEL 1D)
+ 0015 01 MISSING VALUE
+008072 0004 0000 01 MIXED
+ 0001 01 CLEAR
+ 0002 01 CLOUDY
+ 0007 01 MISSING VALUE
+008074 0004 0000 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0001 01 NON-OCEAN LIKE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008075 0004 0000 01 ASCENDING ORBIT
+ 0001 01 DESCENDING ORBIT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008076 0003 0000 01 KU
+ 0001 01 C
+ 0063 01 MISSING VALUE
+008077 0007 0000 01 LAND
+ 0001 01 SEA
+ 0002 01 COASTAL
+ 0003 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0004 01 ENCLOSED SEA OR LAKE
+ 0005 01 CONTINENTAL ICE
+ 0127 01 MISSING VALUE
+008079 0009 0000 01 NORMAL ISSUE
+ 0001 01 CORRECTION TO A PREVIOUSLY ISSUED PRODUCT (COR)
+ 0002 01 AMANDMENT TO A PREVIOUSLY ISSUED PRODUCT *AMD)
+ 0003 01 CORRECTION TO A PREVIOUSLY ISSUED AMENDED PRODUCT (COR AMD)
+ 0004 01 CANCELLATION OD A PREVIOUSLY ISSUED PRODUCT (CNL)
+ 0005 01 NO PRODUCT AVAILABLE (NIL)
+ 0006 01 SPECIAL REPORT ( SPECI)
+ 0007 01 CORRECTED SPECIAL REPORT (SPECI COR)
+ 0015 01 MISSING VALUE
+008080 0009 0000 01 TOTAL WATER PRESSURE PROFILE
+ 0001 01 TOTAL WATER TEMPERATURE PROFILE
+ 0002 01 TOTAL WATER SALINITY PROFILE
+ 0003 01 TOTAL WATER CONDUCTIVITY PROFILE
+ 0010 01 WATER PRESSURE AT A LEVEL
+ 0011 01 WATER TEMPERATURE AT A LEVEL
+ 0012 01 SALINITY AT A LEVEL
+ 0020 01 POSITION
+ 0063 01 MISSING VALUE
+008081 0005 0000 01 SENSOR
+ 0001 01 TRANSMITTER
+ 0002 01 RECEIVER
+ 0003 01 OBSERVING PLATFORM
+ 0063 01 MISSING VALUE
+008082 0003 0000 01 SENSOR HEIGHT IS NOT MODIFIED
+ 0001 01 SENSOR HEIGHT IS MODIFIED TO STANDARD LEVEL
+ 0007 01 MISSING VALUE
+008083 0009 0001 02 ADJUSTED WITH RESPECT TO REPRESENTATIVE HEIGHT OF SENSOR ABO
+ VE LOCAL GROUND (OR DECK OF MARINE PLATFORM)
+ 0002 02 ADJUSTED WITH RESPECT TO REPRESENTATIVE HEIGHT OF SENSOR ABO
+ VE WATER SURFACE
+ 0003 01 ADJUSTED WITH RESPECT TO STANDARD SURFACE ROUGHNESS
+ 0004 01 ADJUSTED WITH RESPECT TO WIND SPEED
+ 0005 01 ADJUSTED WITH RESPECT TO TEMPERATURE
+ 0006 01 ADJUSTED WITH RESPECT TO PRESSURE
+ 0007 01 ADJUSTED WITH RESPECT TO HUMIDITY
+ 0008 01 ADJUSTED WITH RESPECT TO EVAPORATION
+ 0009 01 ADJUSTED WITH RESPECT TO WETTING LOSSES
+008085 0008 0000 01 FORE BEAM
+ 0001 01 MID BEAM
+ 0002 01 AFT BEAM
+ 0003 01 RESERVED
+ 0004 01 RESERVED
+ 0005 01 RESERVED
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+008193 0007 0000 01 START TIME OF ORBIT
+ 0001 01 END TIME OF ORBIT
+ 0002 01 TIME OF ASCENDING NODE
+ 0003 01 ASSIMILATION TIME
+ 0004 01 START TIME OF ASSIMILATION
+ 0005 01 END TIME OF ASSIMLATION
+ 0063 01 MISSING
+008195 0032 0001 01 FIRST GUESS
+ 0002 01 ANALYSIS
+ 0003 01 INITIALISED ANALYSIS
+ 0004 01 OI ANALYSIS
+ 0005 01 3 D VARIATIONAL ANALYSIS
+ 0006 01 4 D VARIATIONAL ANALYSIS
+ 0007 01 3 D VARIATIONAL GRADIENTS
+ 0008 01 4 D VARIATIONAL GRADIENTS
+ 0009 01 FORECAST
+ 0010 01 CONTROL FORECAST
+ 0011 01 PERTURBED FORECAST
+ 0012 01 ERRORS IN FIRST GUESS
+ 0013 01 ERRORS IN ANALYSIS
+ 0014 01 CLUSTER MEANS
+ 0015 01 CLUSTER STANDARD DEVIATIONS
+ 0016 01 FORECAST PROBABILITIES
+ 0017 01 ENSEMBLE MEANS
+ 0018 01 ENSEMBLE STANDARD DEVIATIONS
+ 0019 01 FORECAST ACCUMULATIONS
+ 0020 01 CLIMATOLOGY
+ 0021 01 CLIMATE SIMULATION
+ 0030 01 OBSERVATIONS
+ 0031 01 QUALITY CONTROL
+ 0032 01 DIFFERENCE STATISTICS
+ 0040 01 IMAGE DATA
+ 0050 01 SENSITIVITY GRADIENTS
+ 0051 01 TRAJECTORY FORECAST
+ 0052 01 SENSITIVITY FORECAST
+ 0060 01 PERTURBED ANALYSIS
+ 0061 01 PERTURBATION
+ 0062 01 SINGULAR VECTOR
+ 0127 01 MISSING VALUE
+010063 0010 0000 02 INCREASING, THEN DECREASING: ATMOSPHERIC PRESURE THE SAME OR
+ HIGHER THAN 3 HOURS AGO (OR 24 HOURS AGO )
+ 0001 01 INCREASING, THEN STEADY; OR INCREASING; THEN MORE SLOWLY
+ 0002 01 INCREASING (STEADILY OR UNSTEADILY )
+ 0003 01 DECREASING OR STEADY, THEN INCREASING; RAPIDLY
+ 0004 02 STEADY; ATMOSPHERIC PRESSURE THE SAME AS 3 HOURS AGO (OR 24
+ HOURS)
+ 0005 02 DECREASING; THEN INCREASING; ATMOSPHERIC PRESSURE THE SAME O
+ R LOWER THAN 3 HOURS AGO
+ 0006 02 DECREASING, THEN STEADY; OR DECREASING, DECREASING MORE SLOW
+ LY
+ 0007 01 DECREASING (STEADILY OR UNSTEADELY )
+ 0008 02 STEADY OR INCREASING, THEN DECREASING; OR DECREASING, THEN
+ DECREASING MORE RAPIDLY
+ 0015 01 MISSING
+010064 0004 0000 01 SUBSONIC
+ 0001 01 TRANSONIC
+ 0002 01 SUPERSONIC
+ 0007 01 MISSING VALUE
+011031 0009 0000 01 NIL IN CLOUD
+ 0001 01 SLIGHT IN CLOUD
+ 0002 01 MODERATE IN CLOUD
+ 0003 01 SEVERE IN CLOUD
+ 0004 01 NIL IN CLEAR AIR
+ 0005 01 SLIGHT IN CLEAR AIR
+ 0006 01 MODERATE IN CLEAR AIR
+ 0007 01 SEVERE IN CLEAR AIR
+ 0015 01 MISSING VALUE
+011037 0030 0000 01 AVE <0.1 PEAK <0.1
+ 0001 01 AVE <0.1 0.1 <= PEAK <0.2
+ 0002 01 0.1 <= AVE <0.2 0.1 <= PEAK <0.2
+ 0003 01 AVE <0.1 0.2 <= PEAK <0.3
+ 0004 01 0.1 <= AVE <0.2 0.2 <= PEAK <0.3
+ 0005 01 0.2 <= AVE <0.3 0.2 <= PEAK <0.3
+ 0006 01 AVE <0.1 0.3 <= PEAK <0.4
+ 0007 01 0.1 <= AVE <0.2 0.3 <= PEAK <0.4
+ 0008 01 0.2 <= AVE <0.3 0.3 <= PEAK <0.4
+ 0009 01 0.3 <= AVE <0.4 0.3 <= PEAK <0.4
+ 0010 01 AVE <0.1 0.4 <= PEAK <0.5
+ 0011 01 0.1 <= AVE <0.2 0.4 <= PEAK <0.5
+ 0012 01 0.2 <= AVE <0.3 0.4 <= PEAK <0.5
+ 0013 01 0.3 <= AVE <0.4 0.4 <= PEAK <0.5
+ 0014 01 0.4 <= AVE <0.5 0.4 <= PEAK <0.5
+ 0015 01 AVE <0.1 0.5 <= PEAK <0.8
+ 0016 01 0.1 <= AVE <0.2 0.5 <= PEAK <0.8
+ 0017 01 0.2 <= AVE <0.3 0.5 <= PEAK <0.8
+ 0018 01 0.3 <= AVE <0.4 0.5 <= PEAK <0.8
+ 0019 01 0.4 <= AVE <0.5 0.5 <= PEAK <0.8
+ 0020 01 0.5 <= AVE <0.8 0.5 <= PEAK <0.8
+ 0021 01 AVE <0.1 0.8 <= PEAK
+ 0022 01 0.1 <= AVE <0.2 0.8 <= PEAK
+ 0023 01 0.2 <= AVE <0.3 0.8 <= PEAK
+ 0024 01 0.3 <= AVE <0.4 0.8 <= PEAK
+ 0025 01 0.4 <= AVE <0.5 0.8 <= PEAK
+ 0026 01 0.5 <= AVE <0.8 0.8 <= PEAK
+ 0027 01 0.8 <= AVE 0.8 <= PEAK
+ 0028 01 NIL NIL
+ 0063 01 MISSING VALUE
+011038 0017 0000 01 MIN < 1
+ 0001 01 1 <= MIN < 2
+ 0002 01 2 <= MIN < 3
+ 0003 01 3 <= MIN < 4
+ 0004 01 4 <= MIN < 5
+ 0005 01 5 <= MIN < 6
+ 0006 01 6 <= MIN < 7
+ 0007 01 7 <= MIN < 8
+ 0008 01 8 <= MIN < 9
+ 0009 01 9 <= MIN < 10
+ 0010 01 10 <= MIN < 11
+ 0011 01 11 <= MIN < 12
+ 0012 01 12 <= MIN < 13
+ 0013 01 13 <= MIN < 14
+ 0014 01 14 <= MIN < 15
+ 0015 01 NO TIMING INFORMATION AVAILABLE
+ 0031 01 MISSING VALUE
+011039 0016 0000 01 1 <= MIN < 2
+ 0001 01 2 <= MIN < 3
+ 0002 01 3 <= MIN < 4
+ 0004 01 4 <= MIN < 5
+ 0005 01 5 <= MIN < 6
+ 0006 01 6 <= MIN < 7
+ 0007 01 7 <= MIN < 8
+ 0008 01 8 <= MIN < 9
+ 0009 01 9 <= MIN < 10
+ 0010 01 10 <= MIN < 11
+ 0011 01 11 <= MIN < 12
+ 0012 01 12 <= MIN < 13
+ 0013 01 13 <= MIN < 14
+ 0014 01 14 <= MIN < 15
+ 0060 01 NO TIMING INFORMATION AVAILABLE
+ 0063 01 MISSING VALUE
+013038 0004 0000 01 NOT SUPERADIABATIC
+ 0001 01 SUPERADIABATIC
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+013039 0003 0000 01 SEA ICE
+ 0001 01 SNOW ON LAND
+ 0007 01 MISSING VALUE
+013040 0009 0000 01 LAND
+ 0001 01 RESERVED
+ 0002 01 NEAR COAST
+ 0003 01 ICE
+ 0004 01 POSSIBLE ICE
+ 0005 01 OCEAN
+ 0006 01 COAST
+ 0007 01 DESERT
+ 0015 01 MISSING VALUE
+013041 0010 0001 01 A
+ 0002 01 A-B
+ 0003 01 B
+ 0004 01 B-C
+ 0005 01 C
+ 0006 01 D
+ 0007 01 E
+ 0008 01 F
+ 0009 01 G
+ 0015 01 MISSING VALUE
+013051 0008 0000 01 SMALLER THAN ANY VALUE IN THE 30 YEARS PERIOD
+ 0001 01 IN THE FIRST QUINTILE
+ 0002 01 IN THE SECOND QUINTILE
+ 0003 01 IN THE THIRD QUINTILE
+ 0004 01 IN THE FOURTH QUINTILE
+ 0005 01 IN THE FIFTH QUINTILE
+ 0006 01 GREATER THAN ANY VALUE IN THE 30 YEAR PERIOD
+ 0015 01 MISSING VALUE
+013056 0010 0000 01 NO PRECIPITATION
+ 0001 01 LIGHT INTERMITTENT
+ 0002 01 MODERATE INTERMITTENT
+ 0003 01 HEAVY INTERMITTENT
+ 0004 01 VERY HEAVY INTERMITTENT
+ 0005 01 LIGHT CONTINUOUS
+ 0006 01 MODERATE CONTINUOUS
+ 0007 01 VERY HEAVY CONTINUOUS
+ 0009 01 VARIABLE-ALTERNATIVELY LIGHT AND HEAVY
+ 0015 01 MISSING VALUE
+013057 0011 0000 01 NO PRECIPITATION
+ 0001 01 WITHIN THE LAST HOUR
+ 0002 01 1 TO 2 HOURS AGO
+ 0003 01 2 TO 3 HOURS AGO
+ 0004 01 3 TO 4 HOURS AGO
+ 0005 01 4 TO 5 HOURS AGO
+ 0006 01 5 TO 6 HOURS AGO
+ 0007 01 6 TO 8 HOURS AGO
+ 0008 01 8 TO 10 HOURS AGO
+ 0009 01 MORE THAN 10 HOURS AHO
+ 0015 01 MISSING VALUE
+013202 0007 0000 01 LAND
+ 0001 01 VEGETATION
+ 0003 01 MULTI-YEAR ICE
+ 0004 01 POSSIBLE ICE OR FIRST YEAR ICE
+ 0005 01 OCEAN
+ 0006 01 COASTLINE
+ 0015 01 MISSING
+015025 0002 0000 01 OZONE
+ 0015 01 MISSING VALUE
+019001 0007 0000 01 DEPRESSION OR LOW (EXTRATROPICAL)
+ 0001 01 TROPICAL DEPRESSION
+ 0002 01 TROPICAL STORM
+ 0003 01 SEVERE TROPICAL STORM
+ 0004 01 TYPHOON
+ 0010 01 DUST/SANDSTORM
+ 0063 01 MISSING VALUE
+019008 0005 0000 01 RESERVED
+ 0001 01 SHALLOW (TOP OF CIRCULATION BELOW 700-HPA LEVEL
+ 0002 01 MEDIUM(TOP BETWEEN 700-HPA AND 400-HPA)
+ 0003 01 DEEP(TOP ABOVE 400-HPA LEVEL
+ 0007 01 MISSING VALUE
+019010 0004 0000 01 RESERVED
+ 0001 01 MINIMUM VALUE OF SEA LEVEL PRESSURE
+ 0002 01 MAXIMUM VALUE OF 850 HPA RELATIVE VORTICITY
+ 0015 01 MISSING VALUE
+020003 0250 0000 01 CLOUD DEVELOPMENT NOT OBSERVED OR NOT OBSERVABLE
+ 0001 01 CLOUDS GENERALLY DISSOLVING OR BECOMING LESS DEVELOPED
+ 0002 01 STATE OF SKY ON THE WHOLE UNCHANGED
+ 0003 01 CLOUDS GENERALLY FORMING OR DEVELOPING
+ 0004 02 VISIBILITY REDUCED BY SMOKE, E.G. VELDT OR FOREST FIRES, IN
+ DUSTRIAL SMOKE OR VOLCANIC ASHES
+ 0005 01 HAZE
+ 0006 02 WIDESPREAD DUST IN SUSPENSION IN THE AIR, NOT RAISED BY WIND
+ AT OR NEAR THE STATION AT THE TIME OF OBSERVATION
+ 0007 04 DUST OR SEND RAISED BY WIND AT OR NEAR THE STATION AT THE TI
+ ME OF OBSERVATION, BUT NO WELL-DEVELOPED DUST WHRIL(S) OR SA
+ ND WHRIL(S), AND NO DUSTSTORM OR SANDSTORM SEEN; OR, IN THE
+ CASE OF SHIPS, BLOWING SPRAY AT THE STATION
+ 0008 03 WELL-DEVELOPED DUST WHRIL(S) OR SAND WHRILS SEEN AT OR NEAR
+ THE STATION DURING THE PRECEDING HOUR OR AT THE SAME TIME OF
+ OBSERVATION, BUT NO DUSTSTORM OR SANDSTORM
+ 0009 02 DUSTSTORM OR SANDSTORM WITHIN SIGHT AT THE TIME OF OBSERVATI
+ ON, OR AT THE STATION DURING THE PRECEDING HOR
+ 0010 01 MIST
+ 0011 02 PACHES SHALLOW FOG OR ICE AT THE STATION, WHETHER ON LAND OR
+ SEA, NOT DEEPER THAN 2 METRES ON LAND OR 10 METRES AT SEA
+ 0012 03 MORE OR LESS CONTINUOUS SHALLOW FOG OR ICE AT THE STATION,
+ WHETHER ON LAND OR SEA, NOT DEEPER THAN 2 METRES ON LAND OR
+ 10 METRES AT SEA
+ 0013 01 LIGHTNING VISIBLE, NO THUNDER HEARD
+ 0014 02 PRECIPITATION WITHIN SIGHT, NOT REACHING THE GROUND OR THE
+ SURFACE OF THE SEA
+ 0015 03 PRECIPITATION WITHIN SIGHT, REACHING THE GROUND OR THE SURFA
+ CE OF THE SEA, BUT DISTANT, I.E. ESTIMATED TO BE MORE THAN
+ 5 KM FROM THE STATION
+ 0016 02 PRECIPITATION WITHIN SIGHT, REACHING THE GROUND OR THE SURFA
+ CE OF THE SEA, NEAR TO, BUT NOT AT THE STATION
+ 0017 02 THUNDERSTORM, BUT NO PRECIPITATION AT THE TIME OF OBSERVATIO
+ N
+ 0018 02 SQUALLS AT OR WITHIN SIGHT OF THE STATION DURING THE PRECEDI
+ NG HOUR OR AT THE TIME OF OBSERVATION
+ 0019 02 FUNNEL CLOUD(S) AT OR WITHIN SIGHT OF THE STATION DURING THE
+ PRECEDING HOUR OR AT THE TIME OF OBSERVATION
+ 0020 03 DRIZZEL (NOT FREEZING) OR SNOW GRAINS NOT FALLING AS SHOWERS
+ ; DURING THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVAT
+ IONS
+ 0021 02 RAIN (NOT FREEZING) NOT FALLING AS SHOWER(S); DURING THE PRE
+ ECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0022 02 SNOW NOT FALLING AS SHOWER(S); DURING THE PRECEDING HOUR BUT
+ NOT AT THE TIME OF OBSERVATION
+ 0023 02 RAIN AND SNOW OR ICE PELLETS NOT FALLING AS SHOWER(S); DURIN
+ G THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0024 02 FREEZING DRIZZEL OR FREEZING RAIN NOT FALLING AS SHOWER(S);
+ DURING THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0025 02 SHOWER(S) OF RAIN; DURING THE PRECEDING HOUR BUT NOT AT THE
+ TIME OF OBSERVATION
+ 0026 02 SHOWER(S) OF SNOW, OR OF RAIN AND SNOW; DURING THE PRECEDING
+ HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0027 02 SHOWER(S) OF HAIL, OR OF RAIN AND HAIL; DURING THE PRECEDING
+ HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0028 02 FOG OR ICE FOG; DURING THE PRECEDING HOUR BUT NOT AT THE TIM
+ E OF OBSERVATION
+ 0029 02 THUNDERSTORM (WITH OR WITHOUT PRECIPITATION); DURING THE PRE
+ CEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0030 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM HAS DECREASED DURI
+ NG THE PRECEDING HOURS
+ 0031 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM NO APPRECIABLE CHA
+ NGE DURING THE PRECEDING HOUR
+ 0032 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM HAS BEGUN OR HAS I
+ NCEASED DURING THE PRECEDING HOUR
+ 0033 02 SEVERE DUSTSTORM OR SANDSTORM HAS DECREASED DURING THE PREC
+ EDING HOURS
+ 0034 02 SEVERE DUSTSTORM OR SANDSTORM NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0035 02 SEVERE DUSTSTORM OR SANDSTORM HAS BEGUN OR HAS INCREASED DUR
+ ING THE PRECEDING HOUR
+ 0036 02 SLIGHT OR MODERATE DRIFTING SNOW GENERALLY LOW (BELOW EYE LE
+ VEL)
+ 0037 01 HEAVY DRIFTING SNOW GENERALY LOW (BELOW EYE LEVEL)
+ 0038 02 SLIGHT OR MODERATE BLOWING SNOW GENERALLY HIGH (ABOVE EYE LE
+ VEL)
+ 0039 01 HEAVY BLOWING SNOW GENERALY HIGH (ABOVE EYE LEVEL)
+ 0040 03 FOG OR ICE FOG AT A DISTANCE AT THE TIME OF OBSERVATION, BUT
+ NOT AT THE STATION DURING THE PRECEDING HOUR, THE FOG OR IC
+ E FOG EXTENDING TO A LEVEL ABOVE THAT OF THE OBSERVER
+ 0041 01 FOG OR ICE FOG IN PATCHES
+ 0042 02 FOG OR ICE FOG, SKY VISIBLE,HAS BECOME THINNER DURING THE PR
+ ECEDING HOUR
+ 0043 02 FOG OR ICE FOG, SKY INVISIBLE,HAS BECOME THINNER DURING THE
+ PRECEDING HOUR
+ 0044 02 FOG OR ICE FOG, SKY VISIBLE,NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0045 02 FOG OR ICE FOG, SKY INVISIBLE,NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0046 02 FOG OR ICE FOG, SKY VISIBLE,HAS BEGUN OR HAS BECOME THICKE
+ R DURING THE PRECEDING HOUR
+ 0047 02 FOG OR ICE FOG, SKY INVISIBLE,HAS BEGUN OR HAS BECOME THICKE
+ R DURING THE PRECEDING HOUR
+ 0048 01 FOG, DEPOSITING RIME, SKY VISIBLE
+ 0049 01 FOG, DEPOSITING RIME, SKY INVISIBLE
+ 0050 02 DRIZZLE, NOT FREEZING, INTERMITTENT;SLIGHT AT TIME OF OBSERV
+ ATION
+ 0051 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;SLIGHT AT TIME OF OBSERV
+ ATION
+ 0052 02 DRIZZLE, NOT FREEZING, INTERMITTENT;MODERATE AT TIME OF OBSE
+ RVATION
+ 0053 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;MODERATE AT TIME OF OBSE
+ RVATION
+ 0054 02 DRIZZLE, NOT FREEZING, INTERMITTENT;HEAVY (DENSE) AT THE TIM
+ E OF OBSERVATION
+ 0055 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;HEAVY (DENSE) AT THE TIM
+ E OF OBSERVATION
+ 0056 01 DRIZZLE, FREEZING, SLIGHT
+ 0057 01 DRIZZLE, FREEZING, MODERATE OR HEAVY (DENSE)
+ 0058 01 DRIZZLE AND RAIN, SLIGHT
+ 0059 01 DRIZZLE AND RAIN, MODERATE OR HEAVY
+ 0060 01 RAIN,NOT FREEZING,INTERMITTENT;SLIGHT AT TIME OF OBSERVATION
+ 0061 01 RAIN,NOT FREEZING,CONTINUOUS ;SLIGHT AT TIME OF OBSERVATION
+ 0062 02 RAIN,NOT FREEZING,INTERMITTENT;MODERATE AT TIME OF OBSERVATI
+ ON
+ 0063 02 RAIN,NOT FREEZING,CONTINUOUS ;MODERATE AT TIME OF OBSERVATI
+ ON
+ 0064 02 RAIN, NOT FREEZING, INTERMITTENT;HEAVY AT TIME OF OBSERVATIO
+ ON
+ 0065 01 RAIN, NOT FREEZING, CONTINUOUS;HEAVY AT TIME OF OBSERVATION
+ 0066 01 RAIN, FREEZING, SLIGHT
+ 0067 01 RAIN, FREEZING, MODERATE OR HEAVY
+ 0068 01 RAIN OR DRIZZLE AND SNOW, LIGHT
+ 0069 01 RAIN OR DRIZZLE AND SNOW, MODERATE OR HEAVY
+ 0070 02 INTERMITTENT FALL OF SNOWFLAKES, SLIGHT AT TIME OF OBSERVATI
+ ON
+ 0071 02 CONTINUOUS FALL OF SNOWFLAKES, SLIGHT AT TIME OF OBSERVATI
+ ON
+ 0072 02 INTERMITTENT FALL OF SNOWFLAKES, MODERATE AT TIME OF OBSERVA
+ TION
+ 0073 02 CONTINUOUS FALL OF SNOWFLAKES, MODERATE AT TIME OF OBSERVA
+ TION
+ 0074 02 INTERMITTENT FALL OF SNOWFLAKES, HEAVY AT TIME OF OBSERVATIO
+ ONS
+ 0075 02 CONTINUOUS FALL OF SNOWFLAKES, HEAVY AT TIME OF OBSERVATIO
+ ONS
+ 0076 01 DIAMOND DUST (WITH OR WITHOUT FOG)
+ 0077 01 SNOW GRAINS (WITH OR WITHOUT FOG)
+ 0078 01 ISOLATED STAR-LIKE SNOW CRYSTALS (WITH OR WITHOUT FOG)
+ 0079 01 ICE PELLETS
+ 0080 01 RAIN SHOWER(S), SLIGHT
+ 0081 01 RAIN SHOWER(S), MODERATE OR HEAVY
+ 0082 01 RAIN SHOWER(S), VIOLENT
+ 0083 01 SHOWER(S) OF RAIN AND SNOW MIXED, SLIGHT
+ 0084 01 SHOWER(S) OF RAIN AND SNOW MIXED, MODERATE OR HEAVY
+ 0085 01 SNOW SHOWER(S), SLIGHT
+ 0086 01 SNOW SHOWER(S), MODERATE OR HEAVY
+ 0087 02 SHOWER(S) OF SNOW PELLETS OR SMALL HAIL, WITH OR WITHOUT RAI
+ N OR RAIN AND SNOW MIXED, SLIGHT
+ 0088 02 SHOWER(S) OF SNOW PELLETS OR SMALL HAIL, WITH OR WITHOUT RAI
+ N OR RAIN AND SNOW MIXED, MODERATE OR HEAVY
+ 0089 02 SHOWER(S) OF HAIL, WITH OR WITHOUT RAIN OR RAIN AND SNOW MIX
+ ED, NOT ASSOCIATED WITH THUNDER, SLIGHT
+ 0090 02 SHOWER(S) OF HAIL, WITH OR WITHOUT RAIN OR RAIN AND SNOW MIX
+ ED, NOT ASSOCIATED WITH THUNDER, MODERATE OR HEAVY
+ 0091 02 SLIGHT RAIN AT TIME OF OBSERVATION, THUNDERSTORM DURING THE
+ PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0092 02 MODERATE OR HEAVY RAIN AT TIME OF OBSERVATION, THUNDERSTORM
+ DURING THE PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0093 03 SLIGHT SNOW, OR RAIN AND SNOW MIXED OR HAIL AT TIME OF OBSER
+ VATION, THUNDERSTORM DURING THE PRECEDING HOUR BUT NOT AT TI
+ ME OF OBSERVATION
+ 0094 03 MODERATE OR HEAVY SNOW, OR RAIN AND SNOW MIXED OR HAIL AT TI
+ ME OF OBSERVATION, THUNDERSTORM DURING PRECEDING HOUR BUT NO
+ T AT TIME OF OBSERVATION
+ 0095 03 THUNDERSTORM, SLIGHT OR MODERATE, WITHOUT HAIL, BUT WITH RAI
+ N AND/OR SNOW AT TIME OF OBSERVATION, THUNDERSTORM DURING TH
+ E PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0096 02 THUNDERSTORM, SLIGHT OR MODERATE,WITH HAIL AT TIME OF OBSERV
+ ATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0097 02 THUNDERSTORM, HEAVY, WITHOUT HAIL BUT WITH RAIN AND/OR SNOW
+ AT TIME OF OBSERVATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0098 02 THUNDERSTORM COMBINED WITH DUSTSTORM OR SANDSTORM AT TIME OF
+ OBSERVATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0099 02 THUNDERSTORM, HEAVY, WITH HAIL AT TIME OF OBSERVATION, THUND
+ ERSTORM AT TIME OF OBSERVATION
+ 0100 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0101 02 CLOUDS GENERALLY DISSOLVING OR BECOMING LESS DEVELOPED DURIN
+ G THE PAST HOUR
+ 0102 01 STATE OF SKY ON THE WHOLE UNCHANGED DURING THE PAST HOUR
+ 0103 01 CLOUDS GENERALLY FORMING OR DEVELOPING DURING THE PAST HOUR
+ 0104 02 HAZE OR SMOKE, OR DUST IN SUSPENSION IN THE AIR, VISIBILITY
+ EQUAL TO, OR GREATER THAN 1KM
+ 0105 02 HAZE OR SMOKE, OR DUST IN SUSPENSION IN THE AIR, VISIBILITY
+ LESS THAN 1KM
+ 0110 01 MIST
+ 0111 01 DIAMOND DUST
+ 0112 01 DISTANT LIGHTING
+ 0118 01 SQUALLS
+ 0120 01 FOG
+ 0121 01 PRECIPITATION
+ 0122 01 DRIZZLE (NOT FREEZING) OR SNOW GRAINS
+ 0123 01 RAIN (NOT FREEZING)
+ 0124 01 SNOW
+ 0125 01 FREEZING DRIZZLE OR FREEZING RAIN
+ 0126 01 THUNDERSTORM (WITH OR WITHOUT PRECIPITATION)
+ 0127 01 BLOWING OR DRIFTING SNOW OR SAND
+ 0128 02 BLOWING OR DRIFTING SNOW OR SAND, VISIBILITY EQUAL TO, OR GR
+ ATER THAN, 1KM
+ 0129 01 BLOWING OR DRIFTING SNOW OR SAND, VISIBILITY LESS THAN 1 KM
+ 0130 01 FOG
+ 0131 01 FOG OR ICE FOG, IN PATCHES
+ 0132 01 FOG OR ICE FOG, HAS BECOME THINNER DURING PAST HOUR
+ 0133 01 FOG OR ICE FOG, NO APPRECIABLE CHANGE DURING PAST HOUR
+ 0134 01 FOG OR ICE FOG, HAS BECUNOR BECOME THICKER DURING PAST HOUR
+ 0135 01 FOG, DEPOSITION RIME
+ 0140 01 PRECIPITATION
+ 0141 01 PRECIPITATION SLIGHT OR MODERATE
+ 0142 01 PRECIPITATION, HEAVY
+ 0143 01 LIQUID PRECIPITATION, SLIGHT OR MODERATE
+ 0144 01 LIQUID PRECIPITATION, HEAVY
+ 0145 01 SOLID PRECIPITATION, SLIGHT OR MODERATE
+ 0146 01 SOLID PRECIPITATION, HEAVY
+ 0147 01 FREEZING PRECIPITATION, SLIGHT OR MODERATE
+ 0148 01 FREEZING PRECIPITATION, HEAVY
+ 0150 01 DRIZZLE
+ 0151 01 DRIZZLE, NOT FREEZING, SLIGHT
+ 0152 01 DRIZZLE, NOT FREEZING, MODERATE
+ 0153 01 DRIZZLE, NOT FREEZING, HEAVY
+ 0154 01 DRIZZLE, FREEZING, SLIGHT
+ 0155 01 DRIZZLE, FREEZING, MODERATE
+ 0156 01 DRIZZLE, FREEZING, HEAVY
+ 0157 01 DRIZZLE AND RAIN, SLIGHT
+ 0158 01 DRIZZLE AND RAIN, MODERATE OR HEAVY
+ 0160 01 RAIN
+ 0161 01 RAIN, NOT FREEZING, SLIGHT
+ 0162 01 RAIN, NOT FREEZING, MODERATE
+ 0163 01 RAIN, NOT FREEZING, HEAVY
+ 0164 01 RAIN, FREEZING, SLIGHT
+ 0165 01 RAIN, FREEZING, MODERATE
+ 0166 01 RAIN, FREEZING, HEAVY
+ 0167 01 RAIN (OR DRIZZLE) AND SNOW, SLIGHT
+ 0168 01 RAIN (OR DRIZZLE) AND SNOW, MODERATE AND HEAVY
+ 0170 01 SNOW
+ 0171 01 SNOW, SLIGHT
+ 0172 01 SNOW, MODERATE
+ 0173 01 SNOW, HEAVY
+ 0174 01 ICE PELLETS, SLIGHT
+ 0175 01 ICE PELLETS, MODERATE
+ 0176 01 ICE PELLETS, HEAVY
+ 0180 01 SHOWER(S) OR INTERMITTENT PRECIPITATION
+ 0181 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, SLIGHT
+ 0182 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, MODERATE
+ 0183 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, HEAVY
+ 0184 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, VIOLENT
+ 0185 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, SLIGHT
+ 0186 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, MODERATE
+ 0187 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, HEAVY
+ 0190 01 THUNDERSTORM
+ 0191 01 THUNDERSTORM, SLIGHT OR MODERATE, WITH NO PRECIPITATION
+ 0192 02 THUNDERSTORM, SLIGHT OR MODERATE, WITH RAIN SHOWERS AND/OR S
+ NOW SHOWERS
+ 0193 01 THUNDERSTORM, SLIGHT OR MODERATE, WITH HAIL
+ 0194 01 THUNDERSTORM, HEAVY, WITH NO PRECIPITATION
+ 0195 01 THUNDERSTORM, HEAVY, WITH RAIN SHOWERS AND/OR SNOW SHOWERS
+ 0196 01 THUNDERSTORM, HEAVY, WITH HAIL
+ 0204 01 VOLCANIC ASH SUSPENDED IN THE AIR ALOFT
+ 0206 01 THICK DUST HAZE, VISIBILITY LESS THAN 1 KM
+ 0207 01 BLOWING SPRAY AT THE STATION
+ 0208 01 DRIFTING DUST (SAND)
+ 0209 01 WALL OF DUST OR SAND IN DISTANCE (LIKE HABOOB)
+ 0210 01 SNOW HAZE
+ 0211 01 WHITEOUT
+ 0213 01 LIGHTING, CLOUD TO SURFACE
+ 0217 01 DRY THUNDERSTORM
+ 0219 02 TORNADO CLOUD (DESTRUCTIVE AT OR WITHIN SIGHT OF THE STATION
+ DURING PRECEDING HOUR OR AT THE TIME OF OBSERVATION
+ 0220 01 DEPOSITION OF VOLCANIC ASH
+ 0221 01 DEPOSITION OF DUST OR SAND
+ 0222 01 DEPOSITION OF DEW
+ 0223 01 DEPOSITION OF WET SNOW
+ 0224 01 DEPOSITION OF SOFT RIME
+ 0225 01 DEPOSITION OF HARD RIME
+ 0226 01 DEPOSITION OF HOAR FROST
+ 0227 01 DEPOSITION OF GLAZE
+ 0228 01 DEPOSITION OF ICE CRUST (ICE SLICK)
+ 0230 01 DUSTSTORM OR SANDSTORM WITH TEMPERATURE BELOW 0 C DEGREES
+ 0239 02 BLOWING SNOW, IMPOSSIBLE TO DETERMINE WHETHER SNOW IS FALLIN
+ G OR NOT
+ 0241 01 FOG ON SEA
+ 0242 01 FOG IN VALLEYS
+ 0243 01 ARCTIC OR ANTARCTIC SEA SMOKE
+ 0244 01 STEAM FOG (SEA,LAKE OR RIVER)
+ 0245 01 STEAM FOG (LAND)
+ 0246 01 FOG OVER ICE OR SNOW COVER
+ 0247 01 DENCE FOG VISIBILITY 60-90 M
+ 0248 01 DENCE FOG VISIBILITY 30-60 M
+ 0249 01 DENCE FOG VISIBILITY LESS THAN 30 M
+ 0250 01 DRIZZLE, RATE OF FALL LESS THAN 0.10 MM/H
+ 0251 01 DRIZZLE, RATE OF FALL 0.10 - .19 MM/H
+ 0252 01 DRIZZLE, RATE OF FALL 0.20 - .39 MM/H
+ 0253 01 DRIZZLE, RATE OF FALL 0.40 - .79 MM/H
+ 0254 01 DRIZZLE, RATE OF FALL 0.80 - 1.59 MM/H
+ 0255 01 DRIZZLE, RATE OF FALL 1.60 - 3.19 MM/H
+ 0256 01 DRIZZLE, RATE OF FALL 3.20 - 6.39 MM/H
+ 0257 01 DRIZZLE, RATE OF FALL 6.40 MM/H OR MORE
+ 0259 01 DRIZZLE AND SNOW
+ 0260 01 RAIN, RATE OF FALL LESS THAN 1.0 MM/H
+ 0261 01 RAIN, RATE OF FALL 1.0 - 1.9 MM/H
+ 0262 01 RAIN, RATE OF FALL 2.0 - 3.9 MM/H
+ 0263 01 RAIN, RATE OF FALL 4.0 - 7.9 MM/H
+ 0264 01 RAIN, RATE OF FALL 8.0 - 15.9 MM/H
+ 0265 01 RAIN, RATE OF FALL 16.0 - 31.9 MM/H
+ 0266 01 RAIN, RATE OF FALL 32.0 - 63.9 MM/H
+ 0267 01 RAIN, RATE OF FALL 64.0 MM/H OR MORE
+ 0270 01 SNOW, RATE OF FALL LESS THAN 1.0 CM/H
+ 0271 01 SNOW, RATE OF FALL 1.0 - 1.9 CM/H
+ 0272 01 SNOW, RATE OF FALL 2.0 - 3.9 CM/H
+ 0273 01 SNOW, RATE OF FALL 4.0 - 7.9 CM/H
+ 0274 01 SNOW, RATE OF FALL 8.0 - 15.9 CM/H
+ 0275 01 SNOW, RATE OF FALL 16.0 - 31.9 CM/H
+ 0276 01 SNOW, RATE OF FALL 32.0 - 63.9 CM/H
+ 0277 01 SNOW, RATE OF FALL 64.0 CM/H OR MORE
+ 0278 01 SNOW OR ICE CRISTAL PRECIPITATION FROM A CLEAR SKY
+ 0279 01 WET SNOW, FREEZING ON CONTACT
+ 0280 01 PRECIPITATION OF RAIN (WW= 87-99)
+ 0281 01 PRECIPITATION OF RAIN,FREEZING (WW= 80-82)
+ 0282 01 PRECIPITATION OF RAIN AND SNOW MIXED
+ 0283 01 PRECIPITATION OF SNOW
+ 0284 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL
+ 0285 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH RAIN
+ 0286 02 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH RAIN AND S
+ NOW MIXED
+ 0287 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH SNOW
+ 0288 01 PRECIPITATION OF HAIL
+ 0289 01 PRECIPITATION OF HAIL, WITH RAIN
+ 0290 01 PRECIPITATION OF HAIL, WITH RAIN AND SNOW MIXED
+ 0291 01 PRECIPITATION OF HAIL, WITH SNOW
+ 0292 01 SHOWER(S) OR THUNDERSTORM OVER SEA
+ 0293 01 SHOWER(S) OR THUNDERSTORM OVER MOUNTAINS
+ 0508 02 NO SIGNIFICANT PHENOMENA TO REPORT, PRESENT AND PAST WEATHER
+ OMITTED
+ 0509 02 NOT OBSERVED, NO DATA AVAILABLE, PRESENT AND PAST WEATHER OM
+ ITTED
+ 0510 01 PRESENT AND PAST WEATHER MISSING, BUT EXPECTED
+ 0511 01 MISSING VALUE
+020004 0021 0000 02 CLOUD COVERING 1/2 OR LESS OF THE SKY THROUGHOUT THE APPROPP
+ RIATE PERIOD
+ 0001 03 CLOUD COVERING MORE THAN 1/2 OF THE SKY DURING PART OF THE A
+ PPROPRIATE PERIOD AND COVERING 1/2 OR LESS DURING PART OF TH
+ E PERIOD
+ 0002 02 CLOUD COVERING MORE THAN 1/2 OF THE SKY THROUGHOUT THE APPRP
+ PRIATE PERIOD
+ 0003 01 SANSTORM, DUSTSTORM OR BLOWING SNOW
+ 0004 01 FOG OR ICE OR THICK HAZE
+ 0005 01 DRIZZLE
+ 0006 01 RAIN
+ 0007 01 SNOW, OR RAIN AND SNOW MIXED
+ 0008 01 SHOWER(S)
+ 0009 01 THUNDERSTORM(S) WITH OR WITHOUT PRECIPITATION
+ 0010 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0011 01 VISIBILITY REDUCED
+ 0012 01 BLOWING PHENOMENA, VISIBILITY REDUCED
+ 0013 01 FOG
+ 0014 01 PRECIPITATION
+ 0015 01 DRIZZLE
+ 0016 01 RAIN
+ 0017 01 SNOW OR ICE PELLETS
+ 0018 01 SHOWERS OR INTERMITTENT PRECIPITATION
+ 0019 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+020005 0021 0000 02 CLOUD COVERING 1/2 OR LESS OF THE SKY THROUGHOUT THE APPROPP
+ RIATE PERIOD
+ 0001 03 CLOUD COVERING MORE THAN 1/2 OF THE SKY DURING PART OF THE A
+ PPROPRIATE PERIOD AND COVERING 1/2 OR LESS DURING PART OF TH
+ E PERIOD
+ 0002 02 CLOUD COVERING MORE THAN 1/2 OF THE SKY THROUGHOUT THE APPRP
+ PRIATE PERIOD
+ 0003 01 SANSTORM, DUSTSTORM OR BLOWING SNOW
+ 0004 01 FOG OR ICE OR THICK HAZE
+ 0005 01 DRIZZLE
+ 0006 01 RAIN
+ 0007 01 SNOW, OR RAIN AND SNOW MIXED
+ 0008 01 SHOWER(S)
+ 0009 01 THUNDERSTORM(S) WITH OR WITHOUT PRECIPITATION
+ 0010 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0011 01 VISIBILITY REDUCED
+ 0012 01 BLOWING PHENOMENA, VISIBILITY REDUCED
+ 0013 01 FOG
+ 0014 01 PRECIPITATION
+ 0015 01 DRIZZLE
+ 0016 01 RAIN
+ 0017 01 SNOW OR ICE PELLETS
+ 0018 01 SHOWERS OR INTERMITTENT PRECIPITATION
+ 0019 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+020008 0019 0000 01 SKY CLEAR
+ 0001 01 FEW
+ 0002 01 SCATTERED
+ 0003 01 BROKEN
+ 0004 01 OVERCAST
+ 0005 01 RESERVED
+ 0006 01 SCATTERED/BROKEN (MANY FORECASTS USE SCATTERED/BROKEN
+ 0007 01 BROKEN/OVERCAST (BROKEN/OVERCAST FOLLOWED BY CLOUD TYPE(S))
+ 0008 02 ISOLATED (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE
+ CB)
+ 0009 02 ISOLATED EMBEDDED (USED ON AVIATION CHARTS TO DESCRIBE THE C
+ LOUD TYPE CB)
+ 0010 02 OCCASIONAL (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TY
+ PE CB)
+ 0011 02 OCCASIONAL EMBEDDED (USED ON AVIATION CHARTS TO DESCRIBE THE
+ CLOUD TYPE CB)
+ 0012 02 FREQUENT (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE
+ CB)
+ 0013 02 DENSE (USED ON AVIATION CHARTS TO DESCRIBE CLOUD THAT WOULD
+ CAUSE SUDDEN CHANGES IN VISIBILITY (LESS THAN 1000M)
+ 0014 01 LAYERS
+ 0015 01 OBSCURED (OBSC)
+ 0016 01 EMBEDDED (EMBD)
+ 0017 01 FREQUENT EMBEDDED
+ 0031 01 MISSING VALUE
+020009 0006 0000 01 RESERVED
+ 0001 01 NSC MIL SIGNIFICANT CLOUD
+ 0002 01 CAVOK
+ 0003 01 SKC SKY CLEAR
+ 0004 01 NSW NIL SIGNIFICANT WEATHER
+ 0015 01 MISSING VALUE
+020011 0011 0000 01 0 0
+ 0001 01 1 OKTA OR LESS, BUT NOT ZERO 1/10 OR LESS, BUT NOT ZERO
+ 0002 01 2 OKTAS 2/10 - 3/10
+ 0003 01 3 OKTAS 4/10
+ 0004 01 4 OKTAS 5/10
+ 0005 01 5 OKTAS 6/10
+ 0006 01 6 OKTAS 7/10 - 8/10
+ 0007 01 7 OKTAS OR MORE,BUT NOT 8 OKTAS9/10 OR MORE, BUT NOT 10/10
+ 0008 01 8 OKTAS 10/10
+ 0009 01 SKY OBSCURED BY FOG AND OR OTHER METEOROLOGICAL PHENOMENA
+ 0015 02 CLOUD COVE IS INDISCERNIBLE FOR REASONS OTHER THAN FOG OR OT
+ HER METEOROLOGICAL PHENOMENA, OR OBSERVATION IS NOT MADE
+020012 0045 0000 01 CIRRUS (CI)...............CI
+ 0001 01 CIRROCUMULUS (CC).........CC
+ 0002 01 CIRROSTRATUS (CS).........CS
+ 0003 01 ALTOCUMULUS (AC).........AC
+ 0004 01 ALTOSTRATUS (AS).........AS
+ 0005 01 NIMBOSTRATUS (NS).........NS
+ 0006 01 STRATOCUMULUS(SC).........SC
+ 0007 01 STRATUS (ST).........ST
+ 0008 01 CUMULUS (CU).........CU
+ 0009 01 CUMULONIMBUS (CB).........CB
+ 0010 01 NO CH CLOUDS
+ 0011 02 CIRRUS FIBRATUS, SOMETIMES UNCINUS, NOT PROGRESSIVELY INADIN
+ G THE SKY
+ 0012 04 CIRRUS SPISSATUS, IN PATCHES OR ENTANGLED SHEAVES, WHICH USU
+ ALLY DO NOT INCREASE AND SOMETIMES SEEM TO BE THE REMAINS OF
+ THE UPPER PART OF A CUMULONIMBUS; OR CIRRUS CASTELLANUS OR
+ FLOCCUS
+ 0013 01 CIRRUS SPISSATUS CUMULONIMBOGENITUS
+ 0014 02 CIRRUS UNCINUS OR FIBRATUS,OR BOTH, PROGRESSIVELY INVADING T
+ HE SKY ; THEY GENERALLY THICKEN AS A WHOLE
+ 0015 04 CIRRUS (OFTEN IN BANDS) AND CIRROSTRATUS, OR CIRROSTRATUS AL
+ ONE, PROGRESSIVELY INVADING THE SKY; THEY GENERALLY THICKEN
+ ASA WHOLE, BUT THE CONTINUOUS VEIL DOES NOT REACH 45 DEGREES
+ ABOVE THE HORIZON
+ 0016 05 CIRRUS (OFTEN IN BANDS) AND CIRROSTRATUS, OR CIRROSTRATUS AL
+ ONE, PROGRESSIVELY INVADING THE SKY; THEY GENERALLY THICKEN
+ ASA WHOLE, BUT THE CONTINUOUS VEIL EXTENDS MORE THAN 45 DEGR
+ REES ABOVE THE HORIZON, WITHOUT THE SKY BEING TOTALLY COVERE
+ D
+ 0017 01 CIRROSTRATUS COVERING THE WHOLE SKY
+ 0018 02 CIRROSTRATUS NOT PROGRESSIVELY INVADING THE SKY AND NOT ENTI
+ RELY COVERING IT
+ 0019 02 CIRROCUMULUS ALONE, OR CIRROCUMULUS PREDOMINANT AMONG THE CH
+ CLOUDS
+ 0020 01 NO CM CLOUDS
+ 0021 01 ALTOSTRATUS TRANSLUCIDUS
+ 0022 01 ALTOSTRATUS OPACUS OR NIMBOSTRATUS
+ 0023 01 ALTOCUMULUS TRANSLUCIDUS AT A SINGLE LEVEL
+ 0024 02 PATCHES (OFTEN LENTICULARIS) OF ALTOCUMULUS TRANSLUCIDUS, CO
+ NTINUALLY CHANGING AND OCCURING AT ONE OR MORE LEVELS
+ 0025 04 ALTOCUMULUS TRANSLUCIDUS IN BANDS, OR ONE OR MORE LAYERS OF
+ ALTOCUMULUS TRANSLUCIDUS OR OPACUS, PROGRESSIVELY INVADING T
+ HE SKY; THESE ALTOCUMULUS CLOUDS GENERALLY THICKEN AS A WHOL
+ E
+ 0026 01 ALTOCUMULUS CUMULOGENITUS (OR CUMULONIMBOGENITUS)
+ 0027 04 ALTOCUMULUS TRANSLUCIDUS OR OPACUS IN TWO OR MORE LAYERS, OR
+ ALTOCUMULUS OPACUS IN A SINGLE LAYER, NOT PROGRESSIVELY INV
+ ADING THE SKY, OR ALTOCUMULUS WITH ALTOSTRATUS OR NIMBOSTRAT
+ US
+ 0028 01 ALTOCUMULUS CASTELLANUS OR FLOCUS
+ 0029 01 ALTOCUMULUS OF CHAOTIC SKY, GENERALLY AT SEVERAL LEVELS
+ 0030 01 NO CL CLOUDS
+ 0031 02 CUMULUS HUMILIS OR CUMULUS FRACTUS OTHER THAN OF BAD WEATHER
+ , OR BOTH
+ 0032 03 CUMULUS MEDIOCRIS OR CONGESTUS, WITH OR WITHOUT CUMULUS OF S
+ PECIES FRACTUS OR HUMULIS OR STRATOCUMULUS, ALL HAVING THEIR
+ BASES AT THE SAME LEVEL
+ 0033 02 CUMULONIMBUS CALVUS, WITH OR WITHOUT CUMULUS, STRATOCUMULUS
+ OR STRATUS
+ 0034 01 STRATOCUMULUS CUMULOGENITUS
+ 0035 01 STRATOCUMULUS OTHER THAN STRATOCUMULUS CUMULOGENITUS
+ 0036 02 STRATUS NEBULOSUS OR STRATUS FRACTUS OTHER THAN OF BAD WEATH
+ ER, OR BOTH
+ 0037 02 STRATUS FRACTUS OR CUMULUS FRACTUS OF BAD WEATHER, OR BOTH
+ (PANNUS), USUALLY BELOW ALTOSTRATUS OR NIMBOSTRATUS
+ 0038 02 CUMULUS AND STRATOCUMULUS OTHER THAN STRATOCUMULUS CUMULOGEN
+ ITUS, WITH BASES AT DIFFERENT LEVELS
+ 0039 03 CUMULONIMBUS CAPILLATUS (OFTEN WITH AN ANVIL), WITH OR WITHO
+ UT CUMULONIMBUS CALVUS, CUMULUS, STRATOCUMULUS, STRATUS OR P
+ ANNUS
+ 0059 02 CLOUD NOT VISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDSTO
+ RM, OR OTHER ANALOGOUS PHENOMENA
+ 0060 03 CH CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA, OR BECAUSE OF A CONTINUOUS
+ LAYER OF LOWER CLOUDS
+ 0061 03 CM CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA, OR BECAUSE OF A CONTINUOUS
+ LAYER OF LOWER CLOUDS
+ 0062 02 CL CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA
+ 0063 01 MISSING VALUE
+020017 0011 0000 01 ISOLATED CLOUD OR FRAGMENTS OF CLOUD
+ 0001 01 CONTINUOUS CLOUD
+ 0002 01 BROKEN CLOUD - SMALL BREAKS, FLAT TOPS
+ 0003 01 BROKEN CLOUD - LARGE BREAKS, FLAT TOPS
+ 0004 01 CONTINUOUS CLOUD
+ 0005 01 BROKEN CLOUD - SMALL BREAKS, UNDULATED TOPS
+ 0006 01 BROKEN CLOUD - LARGE BREAKS, UNDULATED TOPS
+ 0007 02 CONTINUOUS OR ALMOST CONTINUOUS WAVES WITH TOWERING CLOUDS A
+ BOVE THE TOP OF THE LAYER
+ 0008 02 GROUPS OF WAVES WITH TOWERING CLOUDS ABOVE THE TOP OF THE LA
+ YER
+ 0009 01 TWO OR MORE LAYERS AT DIFFERENT LEVELS
+ 0015 01 MISSING VALUE
+020018 0004 0000 01 INCREASING (U)
+ 0001 01 DECREASING (D)
+ 0002 01 NO DISTINCT CHANGE (N)
+ 0003 01 MISSING VALUE
+020021 0024 0001 01 PRECIPITATION-UNKNOWN TYPE
+ 0002 01 LIQUID PRECIPITATION NOT FREEZING
+ 0003 01 LIQUID FREEZING PRECIPITATION
+ 0004 01 DRIZZLE
+ 0005 01 RAIN
+ 0006 01 SOLID PRECIPITATION
+ 0007 01 SNOW
+ 0008 01 SNOW GRAINS
+ 0009 01 SNOW PELLETS
+ 0010 01 ICE PELLETS
+ 0011 01 ICE CRYSTALS
+ 0012 01 DIAMOND DUST
+ 0013 01 SMALL HAIL
+ 0014 01 HAIL
+ 0015 01 GLAZE
+ 0016 01 RIME
+ 0017 01 SOFT RIME
+ 0018 01 HARD RIME
+ 0019 01 CLEAR ICE
+ 0020 01 WET SNOW
+ 0021 01 HOAR FROST
+ 0022 01 DEW
+ 0023 01 WHITE DEW
+ 0030 01 ALL 30 MISSING VALUE
+020022 0007 0000 01 NO PRECIPITATION
+ 0001 01 CONTINUOUS
+ 0002 01 INTERMITTENT
+ 0003 01 SHOWER
+ 0004 01 NOT REACHING GROUND
+ 0005 01 DEPOSITION
+ 0015 01 MISSING VALUE
+020023 0012 0001 01 DUST/SAND WHIRL
+ 0002 01 SQUALLS
+ 0003 01 SAND STORM
+ 0004 01 DUST STORM
+ 0005 01 LIGHTNING - CLOUD TO SURFACE
+ 0006 01 LIGHTNING - CLOUD TO CLOUD
+ 0007 01 LIGHTNING - DISTANT
+ 0008 01 THUNDERSTORM
+ 0009 01 FUNNEL CLOUD NOT TOUCHING SURFACE
+ 0010 01 FUNNEL CLOUD TOUCHING SURFACE
+ 0011 01 SPRAY
+ 0012 01 WATER-SPOUT
+020024 0007 0000 01 NO PHENOMENA
+ 0001 01 LIGHT
+ 0002 01 MODERATE
+ 0003 01 HEAVY
+ 0004 01 VIOLENT
+ 0005 01 SEVERE (VAL)
+ 0007 01 MISSING VALUE
+020025 0011 0001 01 FOG
+ 0002 01 ICE FOG
+ 0003 01 STEAM FOG
+ 0007 01 MIST
+ 0008 01 HAZE
+ 0009 01 SMOKE
+ 0010 01 VOLCANIC ASH
+ 0011 01 DUST
+ 0012 01 SAND
+ 0013 01 SNOW
+ 0021 01 ALL 21 MISSING VALUE
+020026 0014 0000 01 NO CHANGE
+ 0001 01 SHALLOW
+ 0002 01 PATCHES
+ 0003 01 PARTIAL
+ 0004 01 FREEZING
+ 0005 01 LOW DRIFTING
+ 0006 01 BLOWING
+ 0007 01 INCREASING
+ 0008 01 DECREASING
+ 0009 01 IN SUSPENSION IN THE AIR
+ 0010 01 WALL
+ 0011 01 DENSE
+ 0012 01 WHITEOUT
+ 0015 01 MISSING VALUE
+020027 0007 0001 01 AT TIME OF OBSERVATION
+ 0002 01 IN PAST HOUR
+ 0003 01 IN TIME PERIOD FOR PAST WEATHER W1W2
+ 0004 01 IN TIME PERIOD SPECIFIED
+ 0006 01 BELOW STATION LEVEL
+ 0007 01 AT THE STATION
+ 0008 01 IN THE VICINITY
+020029 0004 0000 01 NO RAIN
+ 0001 01 RAIN
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020032 0006 0000 01 ICE NOT BUILDING UP
+ 0001 01 ICE BUILDING UP SLOWLY
+ 0002 01 ICE BUILDING UP QUICKLY
+ 0003 01 ICE MELTING OR BREAKING UP SLOWLY
+ 0004 01 ICE MELTING OR BREAKING UP RAPIDLY
+ 0007 01 MISSING VALUE
+020033 0004 0001 01 ICING FROM OCEAN SPRAY
+ 0002 01 ICING FROM FOG
+ 0003 01 ICING FROM RAIN
+ 0004 01 MISSING VALUE
+020034 0012 0000 01 NO SEA ICE IN SIGHT
+ 0001 02 SHIP IN OPEN LEAD MORE THAN 1.0 NAUTICAL MILE WIDE, OR SHIP
+ IN FAST ICE WITH BOUNDARY BEYOND LIMIT OF VISIBILITY
+ 0002 04 SEA ICE PRESENT IN CONCETRATION LESS THAN 3/10 (3/8), OPEN W
+ ATER OR VERY OPEN PACK ICE, SEA ICE CONCETRATION IS UNIFORM
+ IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL
+ MILE OF ICE EDGE
+ 0003 03 4/10 TO 6/10 (3/8 TO LESS THAN 6/8) ,OPEN PACK ICE, SEA ICE
+ CONCETRATION IS UNIFORM IN THE OBSERVATION AREA, SHIP IN ICE
+ OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0004 03 7/10 TO 8/10 (6/8 TO LESS THAN 7/8), CLOSE PACK ICE, SEA ICE
+ CONCETRATION IS UNIFORM IN THE OBSERVATION AREA, SHIP IN IC
+ E OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0005 04 9/10 OR MORE, BUT NOT 10/10 (7/8 TO LESS THAN 8/8), VERY CLO
+ SE PACK ICE, SEA ICE CONCETRATION IS UNIFORM IN THE OBSERVAT
+ ION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE EDG
+ E
+ 0006 03 STRIPS AND PATCHES OF PACK ICE WITH OPEN WATER BETWEEN, SEA
+ ICE CONCENTRATION IS NOT UNIFORM IN THE OBSERVATION AREA, SH
+ IP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0007 04 STRIPS AND PATCHES OF CLOSE OR VERY CLOSE PACK ICE WITH AREA
+ S OF LESSER CONCENTRATION BETWEEN, SEA ICE CONCETRATION IS N
+ OT UNIFORM IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.
+ 5 NAUTICAL MILE OF ICE EDGE
+ 0008 04 FAST ICE WITH OPEN WATER,VERY OPEN OR OPEN PACK ICE TO SEAWA
+ RD OF THE ICE BOUNDARY, SEA ICE CONCENTRATION IS NOT UNIFORM
+ IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL
+ MILE OF ICE EDGE
+ 0009 04 FAST ICE CLOSE OR VERY CLOSE PACK ICE TO SEAWARD OF THE ICE
+ BOUNDARY, SEA ICE CONCETRATION IS NOT UNIFORM IN THE OBSERVA
+ TION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE ED
+ GE
+ 0014 03 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY, O
+ R BECAUSE SHIP IS MORE THAN 0.5 NAUTICAL MILE AWAY FROM ICE
+ EDGE
+ 0015 01 MISSING VALUE
+020035 0012 0000 01 NO ICE OF LAND ORIGIN
+ 0001 01 1-5 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0002 01 6-10 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0003 01 11-20 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0004 01 UP TO AND INCLUDING 10 GROWLERS AND BERGY BITS - NO ICEBERGS
+ 0005 01 MORE THAN 10 GROWLERS AND BERGY BITS - NO ICEBERGS
+ 0006 01 1-5 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0007 01 6-10 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0008 01 11-20 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0009 02 MORE THAN 20 ICEBERGS,WITH GROWLERS AND BERGY BITS - A MAJOR
+ HAZARD TO NAVIGATION
+ 0014 02 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY OR
+ BECAUSE ONLY SEA ICE IS VISIBLE
+ 0015 01 MISSING VALUE
+020036 0012 0000 01 SHIP IN OPEN WATER WITH FLOATING ICE IN SIGHT
+ 0001 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS IMPROVING
+ 0002 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS NOT CHANGING
+ 0003 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS WORSENING
+ 0004 01 SHIP IN ICE DIFFICULT TO PENETRATE; CONDITIONS IMPROVING
+ 0005 01 SHIP IN ICE DIFFICULT TO PENETRATE; CONDITIONS NOT CHANGING
+ 0006 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE FORMING AND FLOES FREEZING TOGETHAR
+ 0007 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE UNDER SLIGHT PRESSURE
+ 0008 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE UNDER MODERATE OR SEVERE PRESSURE
+ 0009 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ SHIP BESET.
+ 0030 01 UNABLE TO REPORT, BECAUSE OF DARKNESS OR LACK OF VISIBILITY
+ 0031 01 MISSING VALUE
+020037 0012 0000 01 NEW ICE ONLY (FRAZIL ICE, GREASE ICE, SLUSH, SHUGA)
+ 0001 01 NILAS OR ICE RIND, LESS THAN 10 CM THICK
+ 0002 01 YOUNG ICE(GREY ICE, GREY-WHITE ICE
+ 0003 01 PREDOMINANTLY NEW AND/OR YOUNG ICE WITH SOME FIRST-YEAR ICE
+ 0004 02 PREDOMINANTLY THIN FIRST-YEAR ICE WITH SOME NEW AND/OR YOUNG
+ ICE
+ 0005 01 ALL THIN FIRST-YEAR ICE (30-70 CM THICK)
+ 0006 02 PREDOMINANTLY MEDIUM FIRST-YEAR ICE
+ (70-120 CM THICK) AND THICK FIRST-YEAR ICE (>120 CM
+ 0007 01 ALL MEDIUM AND THICK FIRST-YEAR ICE
+ 0008 02 PREDOMINANTLY MEDIUM AND THICK FIRST-YEAR ICE WITH SOME
+ OLD ICE (USUALLY MORE THAN 2 METRES THICK)
+ 0009 01 PREDOMINANTLY OLD ICE
+ 0030 03 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY OR
+ BECAUSE ONLY ICE OF LAND ORIGIN IS VISIBLE OR BECAUSE SHIP I
+ S MORE THAN 0.5 NAUTICAL MILE AWAY FROM ICE EDGE
+ 0031 01 MISSING VALUE
+020040 0009 0000 01 DRIFT SNOW ENDED BEFORE THE HOUR OF OBSERVATION
+ 0001 01 INTENSITY DIMINISHING
+ 0002 01 NO CHANGE
+ 0003 01 INTENSITY INCREASING
+ 0004 02 CONTINUES, APART FROM INTERRUPTION LASTING LESS THAN 30 MINU
+ TES
+ 0005 01 GENERAL DRIFT SNOW HAS BECOME DRIFT SNOW NEAR THE GROUND
+ 0006 01 DRIFT SNOW NEAR THE GROUND HAS BECOME GENERAL DRIFT SNOW
+ 0007 02 DRIFT SNOW HAS STARTED AGAIN AFTER AN INTERRUPTION OF MORE T
+ HAN 30 MINUTES
+ 0015 01 MISSING VALUE
+020041 0011 0000 01 NO ICING
+ 0001 01 LIGHT ICING
+ 0002 01 LIGHT ICING IN CLOUD
+ 0003 01 LIGHT ICING IN PRECIPITATION
+ 0004 01 MODERATE ICING
+ 0005 01 MODERATE ICING IN CLOUD
+ 0006 01 MODERATE ICING IN PRECIPITATION
+ 0007 01 SEVERE ICING
+ 0008 01 SEVERE ICING IN CLOUD
+ 0009 01 SEVERE ICING IN PRECIPITATION
+ 0015 01 MISSING VALUE
+020042 0004 0000 01 NO ICING
+ 0001 01 ICING PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020045 0004 0000 01 NO SLD CONDITIONS PRESENT
+ 0001 01 SLD CONDITIONS PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020050 0010 0000 01 RESERVED
+ 0001 01 1ST LOW CLOUD
+ 0002 01 2ND LOW CLOUD
+ 0003 01 3RD LOW CLOUD
+ 0004 01 1ST MEDIUM CLOUD
+ 0005 01 2ND MEDIUM CLOUD
+ 0006 01 3RD MEDIUM CLOUD
+ 0007 01 1ST HIGH CLOUD
+ 0008 01 2ND HIGH CLOUD
+ 0255 01 MISSING VALUE
+020055 0011 0000 01 CUMULUS, IF ANY, ARE QUITE SMALL
+ 0001 01 CUMULUS OF INTERMEDIATE SIZE
+ 0002 01 SWELLING CUMULUS
+ 0003 01 SWELLING CUMULUS WITH TOWERS
+ 0004 01 SWELLING CUMULUS WITH TOWERS HAVING PRONOUNCED TILT
+ 0005 01 TALL CUMULUS CONGESTUS
+ 0006 01 ISOLATED CUMULONIMBUS
+ 0007 01 NUMEROUS CUMULONIMBUS
+ 0008 01 CONTINUOUS DENSE MIDDLE CLOUDS
+ 0009 01 CONTINUOUS SHEETS OF MIDDLE CLOUDS
+ 0015 01 MISSING VALUE
+020056 0005 0000 01 UNKNOWN
+ 0001 01 WATER
+ 0002 01 ICE
+ 0003 01 MIXED
+ 0007 01 MISSING VALUE
+020062 0021 0000 02 SURFACE OF GROUND DRY (WITHOUT CRACKS AND NO APPRECIABLE
+ AMOUNT OF DUST OR LOOSE SAND)
+ 0001 01 SURFACE OF GROUND MOIST
+ 0002 02 SURFACE OF GROUND WET (STANDING WATER IN SMALL
+ OR LARGE POOLS ON SURFACE)
+ 0003 01 FLOODED WITHOUT SNOW
+ 0004 01 SURFACE OF GROUND FROZEN MEASURABLE ICE
+ 0005 01 GLAZE ON GROUND COVER
+ 0006 01 LOOSE DRY DUST OR SAND NOT COVERING GROUND COMPLETELY
+ 0007 02 THIN COVER OF LOOSE DRY DUST OR SAND COVERING GROUND COMPLET
+ ELY
+ 0008 02 MODERATE OR THICK COVER OF LOOSE DRY DUST OR SAND COVERING
+ GROUND COMPLETELY
+ 0009 01 EXTREMELY DRY WITH CRACKS
+ 0010 01 GROUND PREDOMINANTLY COVERED BY ICE
+ 0011 02 COMPACT OR WET SNOW (WITH OR WITHOUT ICE) COVERING LESS THAN
+ ONE-HALF OF THE GROUND
+ 0012 02 COMPACT OR WET SNOW (WITH OR WITHOUT ICE) COVERING AT LEAST
+ ONE-HALF OF THE GROUND BUT GROUND NOT COMPLETELY COVERED
+ 0013 01 EVEN LAYER OF COMPACT OR WET SNOW COVERING GROUND COMPLETELY
+ 0014 02 UNEVEN LAYER OF COMPACT OR WET SNOW COVERING GROUND
+ WITH SNOW OR COMPLETELY MEASURABLE ICE
+ 0015 02 LOOSE DRY SNOW COVERING LESS THAN ONE-HALF OF THE GROUND COV
+ ER
+ 0016 02 LOOSE DRY SNOW COVERING AT LEAST ONE-HALF OF THE
+ GROUND (BUT NOT COMPLETELY)
+ 0017 01 EVEN LAYER OF LOOSE DRY SNOW COVERING GROUND COMPLETELY
+ 0018 01 UNEVEN LAYER OF LOOSE DRY SNOW COVERING GROUND COMPLETELY
+ 0019 01 SNOW COVERING GROUND COMPLETELY; DEEP DRIFTS
+ 0031 01 MISSING VALUE
+020063 0001 0000 01 TO BE DEVELOPED
+020071 0011 0000 01 NO ASSESSMENT NO ASSESSMENT
+ 0001 01 LESS THAN 50 KM LESS THAN 1 PER SECOND
+ 0002 01 BETWEEN 50 AND 200 KM LESS THAN 1 PER SECOND
+ 0003 01 MORE THAN 200 KM LESS THAN 1 PER SECOND
+ 0004 01 LESS THAN 50 KM 1 OR MORE PER SECOND
+ 0005 01 BETWEEN 50 AND 200 KM 1 OR MORE PER SECOND
+ 0006 01 MORE THAN 200 KM 1 OR MORE PER SECOND
+ 0007 02 LESS THANK 50 KM RATE SO RAPID NUMBER CANNOT BE COUN
+ TED
+ 0008 02 BETWEEN 50 AND 200 KM RATE SO RAPID NUMBER CANNOT BE COUN
+ TED
+ 0009 02 MORE THAN 200 KM RATE SO RAPID NUMBER CANNOT BE COUN
+ TED
+ 0015 01 MISSING VALUE
+020086 0008 0000 01 CLEAR AND DRY
+ 0001 01 DAMP
+ 0005 01 WET SNOW
+ 0006 01 SLUSH
+ 0007 01 ICE
+ 0008 01 COMPACTED OR ROLLED SNOW
+ 0009 01 FROZEN RUTS OR RIDGES
+ 0015 01 MISSING VALUE
+020090 0007 0000 01 RESERVED
+ 0001 01 NACREOUS CLOUDS
+ 0002 01 NOCTILUCENT CLOUDS
+ 0003 01 CLOUDS FROM WATERFALLS
+ 0004 01 CLOUDS FROM FIRES
+ 0005 01 CLOUDS FROM VULCANIC ERUPTIONS
+ 0015 01 MISSING VALUE
+020101 0010 0001 01 SCHISTOCERCA GREGARIA
+ 0002 01 LOCUSTA MIGRATORIA
+ 0003 01 NOMADACRIS SEPTEMFASCIATA
+ 0004 01 OEDALEUS SENAGALENSIS
+ 0005 01 ANRACRIDIUM SPP
+ 0006 01 OTHER LOCUST
+ 0007 01 OTHER GRASSHOPPERS
+ 0008 01 ITHER CRICKETS
+ 0009 01 SPODOPTERA EXEMPTA
+ 0015 01 MISSING VALUE
+020102 0011 0000 01 GREEN
+ 0001 01 GREEN AND BLACK
+ 0002 01 BLACK
+ 0003 01 YELLOW AND BLACK
+ 0004 01 STRAW/GREY
+ 0005 01 PINK
+ 0006 01 DARK RED/BROWN
+ 0007 01 MIXED RED AND YELLOW
+ 0008 01 YELLOW
+ 0009 01 OTHER
+ 0015 01 MISSING VALUE
+020151 0003 0000 01 FIRST YEAR ICE
+ 0001 01 MULTI YEAR ICE
+ 0007 01 MISSING
+020252 0003 0000 01 NO EDGE
+ 0001 01 EDGE PRESENT
+ 0007 01 MISSING
+020253 0008 0000 01 LAND
+ 0001 01 VEGETATION COVERED LAND
+ 0002 01 RESERVED
+ 0003 01 ICE
+ 0004 01 POSSIBLE ICE
+ 0005 01 OCEAN
+ 0006 01 COAST
+ 0007 01 MISSING
+021066 0011 0001 01 PROCESSING EQUIPMENT NOT WORKING
+ 0002 01 EQUIPMENT FAILED
+ 0003 01 PRF CODE CHANGED DURING IMAGE GENERATION
+ 0004 01 SAMPLINH WINDOW CHANGED DURING IMAGE GENERATION
+ 0005 01 GAIN CHANGED DURING IMAGE GENERATION
+ 0006 01 CHIRP REPLICA EXCEEDS SPECIFIC VALUE
+ 0007 02 INPUT DATA MEAN AND STANDARD DEVIATION OF IN-PHASE AND
+ QUADRATURE OUT OF RANGE
+ 0008 01 DOPPLER CENTROID CONFIDENCE > MMCC VALUE
+ 0009 01 DOPPLER CENTROID ABSOLUTE VALUE > PRF/2
+ 0010 01 DOPPLER AMBIGUITY CONFIDENCE < MMCC VALUE
+ 0011 01 OUTPUT DATA MEAN AND STANDARD DEVIATION =< MMCC VALUE
+021067 0012 0001 01 NO FOREBEAM CALCULATION
+ 0002 01 NO MIDBEAM CALCULATION
+ 0003 01 NO AFTBEAM CALCULATION
+ 0004 01 FOREBEAM ARCING DETECTED
+ 0005 01 MID ARCING DETECTED
+ 0006 01 AFTBEAM ARCING DETECTED
+ 0007 01 ANY BEAM NOISE CONTENT ABOVE OR EQUAL TO TRESHOLD
+ 0008 01 LAND (ANY LAND IN CELL FOOTPRINT)
+ 0009 01 AUTONOMOUS AMBIGUITY REMOVAL NOT USED
+ 0010 01 METEOROLOGICAL BACKGROUND NOT USED
+ 0011 01 MINIMUM RESIDUAL EXCEEDED TRESHOLD
+ 0012 01 FRAME CHECKSUM ERROR DETECTED
+021068 0007 0001 01 STANDARD DEVIATION OF WIND SPEED OUTSIDE MMCC LIMIT
+ 0002 02 STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT OUTSIDE MMCC L
+ IMIT
+ 0003 01 STANDARD DEVIATION OF ALTITUDE OUTSIDE MMCC LIMIT
+ 0004 01 MEAN PEAKINESS OUTSIDE MMCC LIMIT
+ 0005 01 FRAME CHECKSUM ERROR DETECTED
+ 0006 01 HEIGHT-TIME LOOP TIME CONSTANT CORRECTION NOT PERFORMED
+ 0007 01 NOT ENOUGH MEASUREMENTS ( N< 10)
+021069 0009 0001 01 12.0 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0002 01 11.0 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0003 01 3.7 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0004 01 1.6 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0005 02 CLOUD IDENTIFICATION USED 1.6 MICROMETERS
+ HISTOGRAM REFLECTANCE CLOUD TEST
+ 0006 02 1.6 MICROMETERS HISTOGRAM REFLECTANCE CLOUD
+ TEST USED DYNAMIC TRESHOLD
+ 0007 01 SUN GLINT DETECTED BY 1.6 MICROMETERS REFLECTANCE CLOUD TEST
+ 0008 01 3.7 MICROMETERS USED IN SEA-SURFACE TEMPERATURE RETRIEVAL
+ 0009 02 SEA-SURFACE TEMPERATURE DERIVATION USED DAYTIME DATA
+ (NIGHT-TIME IF ZERO)
+021070 0024 0001 01 CELL 1:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0002 02 CELL 2:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL CELL NUMB
+ ERING
+ 0003 01 CELL 3:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0004 01 CELL 4:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL NW NE
+ 0005 01 CELL 5:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 7 8 9
+ 0006 01 CELL 6:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 4 5 6
+ 0007 01 CELL 7:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 1 2 3
+ 0008 01 CELL 8:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL SW SE
+ 0009 01 CELL 9:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0010 02 -18 DUAL VIEW SST RETRIEVAL USED 3.7 MICRON CHANNEL (ONE BIT
+ PER 10-ARCMIN CELL)
+ 0011 01 CELL 1:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0011 02 CELL 2:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL CELL NUMB
+ ERING
+ 0012 01 CELL 3:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0013 01 CELL 4:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL NW NE
+ 0014 01 CELL 5:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 7 8 9
+ 0015 01 CELL 6:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 4 5 6
+ 0016 01 CELL 7:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 1 2 3
+ 0017 01 CELL 8:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL SW SE
+ 0018 01 CELL 9:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0019 01 NADIR VIEW CONTAINS DAY-TIME DATA (NIGHT IF ZERO)
+ 0020 01 FORWARD VIEW CONTAINS DAY-TIME DATA (NIGHT IF ZERO)
+ 0021 02 RECORD CONTAINS CONTRIBUTIONS FROM INSTRUMENT SCANS ACQUIRED
+ WHEN ERS PLATFORM NOT IN YAW-STEERING MODE
+ 0022 02 RECORD CONTAINS CONTRIBUTIONS FROM INSTRUMENT SCANS FOR WHIC
+ H PRODUCT CONFIDENCE DATA SHOW QUALITY IS POOR OR UNKNOWN
+ 0023 01 MISSING VALUE
+021072 0003 0001 02 HEIGHT ERROR CORRECTION APPLIED INSTEAD OF OPEN LOOP CALIBRA
+ TION
+ 0002 01 MICROWAVE SOUNDER USED FOR TROPOSPHERE CORRECTION
+ 0003 02 AGC OUTPUT CORRECTION APPLIED INSTED OF OPEN LOOP CALIBRATIO
+ N
+021073 0008 0001 01 BLANK DATA RECORD
+ 0002 01 TEST
+ 0003 01 CALIBRATION (CLOSED LOOP)
+ 0004 01 BITE
+ 0005 01 ACQUISITION ON ICE
+ 0006 01 ACQUISITION ON OCEAN
+ 0007 01 TRACKING ON ICE
+ 0008 01 TRACKING ON OCEAN
+021076 0004 0000 01 LINEAR
+ 0001 01 LOGARITHMIC (BASE E)
+ 0002 01 LOGARITHMIC (BASE 10)
+ 0007 01 MISSING VALUE
+021109 0008 0001 01 NOT ENOUGH GOOD SIGMA-0 AVAILABLE FOR WIND RETRIEVAL
+ 0002 01 POOR AZIMUTH DIVERSITY AMONG SIGMA0- FOR WIND RETRIEVAL
+ 0008 01 SOME PORTION OF WIND VECTOR CELL IS OVER LAND
+ 0009 01 SOME PORTION OF WIND VECTOR CELL IS OVER ICE
+ 0010 01 WIND RETRIEVAL NOT PERFORMED FOR WIND VECTOR CELL
+ 0011 01 REPORTED WIND SPEED IS GREATER THAN 30 M/S
+ 0012 01 REPORTED WIND SPEED IS LESS THAN OR EQUAL TO 3 M/S
+ 0017 01 MISSING VALUE
+021115 0011 0001 01 SIGMA-0 MEASUREMENT IS NOT USABLE
+ 0002 01 SIGNAL TO NOISE RATIO IS LOW
+ 0003 01 SIGMA-0 IS NEGATIVE
+ 0004 01 SIGMA-0 IS OUTSIDE OF ACCEPTABLE RANGE
+ 0005 01 SCATTEROMETER PULSE QUALITY IS NOT ACCEPTABLE
+ 0006 01 SIGMA-0 CELL LOCATION ALGORITHM DOES NOT CONVERGE
+ 0007 01 FREQUENCY SHIFT LIES BEYOND THE RANGE OF THE X FACTOR TABLE
+ 0008 02 SPACECRAFT TEMPERATURE IS BEYOND CALIBRATION COEFFICIENT RAN
+ GE
+ 0009 01 NO APPLICABLE ATTITUDE RECORDS WERE FOUND FOR THIS SIGMA-0
+ 0010 02 INTERPOLATED EPHEMERIS DATA ARE NOT ACCEPTABLE FOR THIS SIGM
+ A-0
+ 0017 01 MISSING VALUE
+021116 0016 0001 01 CALIBRATION/MEASUREMENT PULSE FLAG (1)
+ 0002 01 CALIBRATION/MEASUREMENT PULSE FLAG (2)
+ 0003 01 OUTER ANTENNA BEAM
+ 0004 01 SIGMA-0 CELL IS AFT OF SPACECRAFT
+ 0005 01 CURRENT MODE (1)
+ 0006 01 CURRENT MODE (2)
+ 0007 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (1)
+ 0008 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (2)
+ 0009 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (3)
+ 0010 01 LOW RESOLUTION MODE - WHOLE PULSE DATA
+ 0011 01 SCATTEROMETER ELECTRONIC SUBSYSTEM B
+ 0012 01 ALTERNATE SPIN RATE - 19.8 RPM
+ 0013 01 RECEIVER PROTECTION ON
+ 0014 01 SLICES PER COMPOSITE FLAG (1)
+ 0015 01 SLICES PER COMPOSITE FLAG (2)
+ 0016 01 SLICES PER COMPOSITE FLAG (3)
+021119 0014 0000 01 RESERVED
+ 0001 01 SASS
+ 0002 01 SASS2
+ 0003 01 NSCAT0
+ 0004 01 NSCAT1
+ 0005 01 NSCAT2
+ 0006 01 QSCAT0
+ 0007 01 QSCAT1
+ 0031 01 CMOD1
+ 0032 01 CMOD2
+ 0033 01 CMOD3
+ 0034 01 CMOD4
+ 0035 01 CMOD5
+ 0064 01 MISSING VALUE
+021144 0001 0001 01 RAIN
+021150 0004 0000 01 DATA FROM SINGLE GROUND STATION (NO CO-LOCATION)
+ 0001 01 DATA FROM MULTIPLE GROUND STATION (CO-LOCATED DATA)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021155 0016 0001 01 NOT ENOUGH GOOD SIGMA-0 AVAILABLE FOR WIND RETRIEVAL
+ 0002 01 POOR AZIMUTH DIVERSITY AMONG SIGMA-0 FOR WIND RETRIEVAL
+ 0003 01 ANY BEAM NOISE CONTENT ABOVE TRESHOLD
+ 0004 01 PRODUCT MONITORING NOT USED
+ 0005 01 PRODUCT MONITORING FLAG
+ 0006 01 KNMI QUALITY CONTROL FAILS
+ 0007 01 VARIATIONAL QUALITY CONTROL FAILS
+ 0008 01 SOME PORTION OF WIND VECTOR CELL IS OVER LAND
+ 0009 01 SOME PORTION OF WIND VECTOR CELL IS OVER ICE
+ 0010 01 WIND RETRIEVAL NOT PERFORMED FOR WIND VECTOR CELL
+ 0011 01 REPORTED WIND SPEED IS GREATER THAN 30 M/S
+ 0012 01 REPORTED WIND SPEED IS LESS THAN OR EQUAL TO 3 M/S
+ 0013 01 RAIN FLAG FOR THE WIND VECTOR CELL IS NOT USABLE
+ 0014 01 RAIN FLAG ALGORITHM DETECTS RAIN
+ 0015 01 NO METEOROLOGICAL BACKGROUND USED
+ 0016 01 DATA ARE REDUNDANT
+021158 0004 0000 01 ACCEPTABLE
+ 0001 01 NOT ACCEPTABLE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021159 0004 0000 01 GOOD
+ 0001 01 USABLE
+ 0002 01 BAD
+ 0003 01 MISSING VALUE
+021169 0004 0000 01 NO ICE PRESENT
+ 0001 01 ICE PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021196 0012 0001 01 PROCESSING EQUIPMENT NOT WORKING
+ 0002 01 EQUIPMENT FAILED
+ 0003 01 PRF CODE CHANGED DURING IMAGE GENERATION
+ 0004 01 SAMPLING WINDOW CHANGED DURING IMAGE GENERATION
+ 0005 01 GAIN CHANGED DURING IMAGE GENERATION
+ 0006 01 CHIRP REPLICA EXCEEDS SPECIFIED VALUE
+ 0007 02 INPUT DATA MEAN AND STANDARD DEVIATION OF I AND Q OUT OF RAN
+ GE
+ 0008 01 DOPPLER CENTROID CONFIDENCE > MMCC VALUE
+ 0009 01 DOPPLER CENTROID ABSOLUTE VCALUE > PRF/2
+ 0010 01 DOPPLER AMBIGUITY CONFIDENCE < MMCC VALUE
+ 0011 01 OUTPUT DATA MEAN AND STANDARD DEVIATION <= MMCC VALUE
+ 0012 01 MISSING VALUE
+021199 0007 0001 01 3.7 MICRO CHANNEL USED IN ASST DERIVATION
+ 0002 01 ASST DERIVATION USED DATTIME DATA
+ 0003 02 COMPARISON OF ASST AGAINST PREVIOUS
+ EQUIVALENT PASS PERFORMED
+ 0004 02 COMPARISON OF ASST AGAINST WEEKLY AVERAGE
+ OF ASST PERFORMED
+ 0005 01
+ 0006 02 COMPARISON OF RATE OF CHANGE OF ASST AGAINST
+ STATIC TRESHOLD PERFORMED
+ 0007 01 MISSING VALUE
+022056 0004 0000 01 UPWARDS PROFILE
+ 0001 01 DOWNWARDS PROFILE
+ 0002 01 HORIZONTAL
+ 0003 01 MISSING VALUE
+022060 0004 0000 01 DROGUE IS DETACHED
+ 0001 01 DROGUE IS ATTACHED
+ 0002 01 DROGUE STATUS UNKNOWN
+ 0007 01 MISSING VALUE
+022061 0011 0000 01 CALM (GLASSY) HEIGHT 0 M
+ 0001 01 CALM (RIPPLED) HEIGHT 0 - 0.1 M
+ 0002 01 SMOOTH (WAVELETS) HEIGHT 0.1 - 0.5 M
+ 0003 01 SLIGHT HEIGHT 0.5 - 1.5 M
+ 0004 01 MODERATE HEIGHT 1.25 - 2.5 M
+ 0005 01 ROUGH HEIGHT 2.5 - 4 M
+ 0006 01 VERY ROUGH HEIGHT 4 - 6 M
+ 0007 01 HIGH HEIGHT 6 - 9 M
+ 0008 01 VERY HIGH HEIGHT 9 -14 M
+ 0009 01 PHENOMANAL HEIGHT OVER 14 M
+ 0015 01 MISSING VALUE
+022067 0001 0000 01 SEE COMMON CODE TABLE C3
+022068 0001 0000 01 SEE COMMON CODE TABLE C4
+022120 0013 0000 01 GOOD DATA
+ 0001 01 MAXIMUM (HIGH) WATER LEVEL LIMIT EXCEEDED
+ 0002 01 MINIMUM (LOW) WATER LEVEL LIMIT EXCEEDED
+ 0003 01 RATE OF CHANGE LIMIT FOR WATER LEVEL EXCEEDED
+ 0004 01 FLAT LIMIT FOR WATER LEVEL EXCEEDED
+ 0005 01 OBSERVED MINUS PREDICTED WATER LEVEL VALUE LIMIT EXCEEDED
+ 0006 02 OBSERVED VALUE FROM PRIMARY WATER LEVEL SENSOR MINUS
+ BACKUP WATER LEVEL SENSOR
+ 0007 01 VALUE EXCEEDED SPECIFIED TOLERANCE FROM EXPECTED VALUE
+ 0008 02 WATER LEVEL QA PARAMETER (SIGMAS AND/OR OUTLIERS) LIMITS EXC
+ EEDED
+ 0009 01 SEA TEMPERATURE OUTSIDE OF EXPECTED RANGE
+ 0010 01 MULTIPLE QC CHECKS (ABOVE) FAILED
+ 0011 01 NO AUTOMATED WATER LEVEL CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022121 0009 0000 01 OPERATIONAL
+ 0001 02 POSSIBLE CLOGGING PROBLEM OR OTHERWISE DEGRADED WATE LEVEL D
+ ATA
+ 0002 01 POSSIBLE DATUM SHIFT
+ 0003 01 UNKNOWN STATUS OF WATER LEVEL SENSOR
+ 0004 01 SUSPECTED OR KNOWN SEA TEMPERATURE SENSOR PROBLEM
+ 0005 01 MULTIPLE POSSIBLE PROBLEMS (ABOVE)
+ 0006 01 BAD DATA- DO NOT DISSEMINATE
+ 0007 01 NO MANUAL WATER LEVEL CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022122 0008 0000 01 GOOD DATA FROM ALL SENSORS
+ 0001 01 WIND DIRECTION OUTSIDE OF ALLOWABLE RANGE
+ 0002 01 WIND SPEED OUTSIDE OF EXPECTED RANGE
+ 0003 01 BAROMETRIC PRESSURE OUTSIDE OF EXPECTED RANGE
+ 0004 01 AIR TEMPERATURE OUTSIDE OF EXPECTED RANGE
+ 0005 01 MULTIPLE SENSOR FAILED QC CHECKS
+ 0006 01 NO AUTOMATED METEOROLOGICAL DATA CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022123 0009 0000 01 OPERATIONAL
+ 0001 01 SUSPECTED OR KNOWN PROBLEM WITH WIND SENSOR
+ 0002 01 SUSPECTED OR KNOWN PROBLEM WITH BAROMETRIC PRESSURE SENSOR
+ 0003 01 SUSPECTED OR KNOWN PROBLEM WITH AIR TEMPERATURE SENSOR
+ 0004 01 UNKNOWN STATUS OF ALL SENSORS
+ 0005 01 SUSPECTED OR KNOWN PROBLEMS WITH MULTIPLE SENSORS
+ 0006 01 BAD DATA - DO NOT DISSEMINATE
+ 0007 01 NO MANUAL METEOROLOGICAL DATA CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022252 0006 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND
+ PASSED
+ 0002 02 AUTOMATIC QUALITY CONTROL PASSED AND MAGNOLIA CHECKED AND
+ DELETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND
+ FAILED
+ 0005 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND
+ RE-INSERTED
+023001 0005 0000 01 RESERVED
+ 0001 01 ARTICLES 1 AND 2
+ 0002 01 ARTICLE 3
+ 0003 01 ARTICLE 5.2
+ 0007 01 MISSING VALUE
+023002 0016 0000 01 RESERVED
+ 0001 01 NUCLEAR REACTOR ON GROUND
+ 0002 01 NUCLEAR REACTOR ON SEA
+ 0003 01 NUCLEAR REACTOR IN SPACE
+ 0004 01 NUCLEAR FULE FACILITY
+ 0005 01 RADIOACTIVE WASTE MANAGMENT FACITILY
+ 0006 01 TRANSPORT OF NUCLEAR FUEL OR RADIOACTIVE WASTE
+ 0007 01 STORAGE OF NUCLEAR FUEL OR RADIOACTIVE WASTE
+ 0008 01 MANUFACTURE OF RADIO-ISOTOPES
+ 0009 01 USE OF RADIO-ISOTOPES
+ 0010 01 STORAGE OF RADIO-ISOTOPES
+ 0011 01 DISPOSAL OF RADIO-ISOTOPS
+ 0012 01 TRANSPORT OF RADIO-ISOTOPES
+ 0013 01 USE OF RADIO-ISOTOPES FOR POWER GENERATION
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+023003 0008 0000 01 NO RELEASE
+ 0001 01 RELEASE TO ATMOSPHERE
+ 0002 01 RELEASE TO WATER
+ 0003 01 RELEASE TO BOTH ATMOSPHERE AND WATER
+ 0004 01 EXPECTED RELEASE TO ATMOSPHERE
+ 0005 01 EXPECTED RELEASE TO WATER
+ 0006 01 EXPECTED RELEASE TO BOTH ATMOSPHERE AND WATER
+ 0007 01 MISSING VALUE
+023004 0006 0000 01 NO COUNTERMEASURE
+ 0001 01 EVACUATION
+ 0002 01 SHELTERING
+ 0003 01 PROPHILAXIS
+ 0004 01 WATER
+ 0007 01 MISSING VALUE
+023005 0004 0000 01 INCIDENT STAT DOES NOT UNDERSTAND WHAT HAPPENED
+ 0001 01 INCIDENT STATE KNOWS THE CAUSE OF THE INCIDENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023006 0008 0000 01 NO IMPROVEMENT
+ 0001 01 UNSTABLE
+ 0002 01 NO DETERIORATION
+ 0003 01 IMPROVING
+ 0004 01 STABLE
+ 0005 01 DETERIORATING
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+023007 0005 0000 01 NO RELEASE
+ 0001 01 RELEASE HAS STOPPED
+ 0002 01 RELEASE
+ 0003 01 RELEASE IS CONTINUING
+ 0007 01 MISSING VALUE
+023008 0004 0000 01 GASEUS
+ 0001 01 PARTICULATE
+ 0002 01 MIXTURE OF GASEUS AND PARTICULATE
+ 0003 01 MISSING VALUE
+023009 0004 0000 01 GASEUS
+ 0001 01 PARTICULATE
+ 0002 01 MIXTURE OF GASEUS AND PARTICULATE
+ 0003 01 MISSING VALUE
+023016 0004 0000 01 NO SIGNIFICANT TOXIC HEALTH EFFECT
+ 0001 01 SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT POSSIBLE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023018 0006 0000 01 RELEASE NO LONGER OCCURRING
+ 0001 01 RELEASE STILL OCCURRING
+ 0002 01 RELEASE EXPECTED TO INCREASE IN NEXT SIX HOURS
+ 0003 01 RELEASE EXPECTED TO REMAIN CONSTANT IN NEXT SIX HOURS
+ 0004 01 RELEASE EXPECTED TO DECREASE IN NEXT SIX HOURS
+ 0007 01 MISSING VALUE
+023031 0004 0000 01 PLUME WILL NOT ENCOUNTER RAIN IN INCIDENT STATE
+ 0001 01 PLUME WILL ENCOUNTER RAIN IN INCIDENT STATE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023032 0004 0000 01 NO SIGNIFICANT CHANGE EXPECTED WITHIN NEXT SIX HOURS
+ 0001 02 ANTICIPATED SIGNIFICANT CHANGE EXPECTED WITHIN NEXT SIX HOUR
+ S
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+024003 0005 0000 01 NOBLE GASES
+ 0001 01 IODINES
+ 0002 01 CAESIUM
+ 0003 01 TRANSURANICS
+ 0031 01 MISSING VALUE
+025004 0004 0000 01 INCOHERENT
+ 0001 01 COHERENT (DOPPLER)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025005 0004 0000 01 LOGATITHM - 2.5 DB
+ 0001 01 LINEAR
+ 0002 01 SPECIAL
+ 0003 01 MISSING VALUE
+025006 0005 0000 01 ZH TO R CONVERSION
+ 0001 01 (ZH, ZDR) TO (NO.DO) TO R
+ 0002 01 (Z(F1),Z(F2)) TO ATTENUATION TO R
+ 0006 01 OTHER
+ 0007 01 MISSING VALUE
+025009 0004 0001 01 NONE
+ 0002 01 CALIBRATION TARGET OR SIGNAL
+ 0003 01 AGAINST RAINGAGES
+ 0004 01 AGAINST OTHER INSTRUMENTS (DISTROMETER-ATTENUATION)
+025010 0008 0000 01 NONE
+ 0001 01 MAP
+ 0002 01 INSERTION OF HIGHER ELEVATION DATA AND MAP
+ 0003 01 ANALYSIS OF FLUCTUATING LOGARITHM SIGNAL (CLUTTER DETECTION)
+ 0004 02 EXTRACTION OF FLUCTUATING PART OF LINEAR SIGNAL (CLUTTER SUP
+ PRESSION)
+ 0005 01 CLUTTER SUPPRESSION DOPPLER
+ 0006 01 MULTIPARAMETER ANALYSIS
+ 0015 01 MISSING VALUE
+025011 0004 0000 01 NONE
+ 0001 01 MAP OF CORRECTION FACTORS
+ 0002 01 INTERPOLATION (AZIMUTH OR ELEVATION)
+ 0003 01 MISSING VALUE
+025012 0004 0000 01 HARDWARE
+ 0001 01 SOFTWARE
+ 0002 01 HARDWARE AND SOFTWARE
+ 0003 01 MISSING VALUE
+025013 0001 0001 01 BRIGHT BAND CORRECTION
+025015 0001 0001 01 RADOME ATTENUATION CORRECTION
+025017 0001 0001 01 PRECIPITATION ATTENUATION CORRECTION
+025020 0004 0000 01 FTT (FAST FOURIER TRANSFORM
+ 0001 01 PPP (PULSE PAIR PROCESSING
+ 0002 01 VPC (VECTOR-PHASE CHANGE)
+ 0003 01 MISSING VALUE
+025021 0005 0001 01 SIMPLE AVERAGE
+ 0002 01 CONSENSUS AVERAGE
+ 0003 01 MEDIAN CHECK
+ 0004 01 VERTICAL CONSISTENCY CHECK
+ 0005 01 OTHER
+025030 0004 0000 02 RUNNING MEAN SEA-SURFACE TEMPERATURE NOT USED BECAUSE USAGE
+ CRITERIA NOT MET
+ 0001 02 RUNNING MEAN SEA-SURFACE TEMPERATURE NOT USED BECAUSE DATA N
+ OT AVAILABLE
+ 0002 01 RUNNING MEAN SEA-SURFACE TEMPERATURE USED AS PREDICTOR
+ 0003 01 MISSING VALUE
+025032 0004 0000 01 RESERVED
+ 0001 01 DATA FROM LOW MODE
+ 0002 01 DATA FROM HIGH MODE
+ 0003 01 MISSING VALUE
+025033 0004 0000 01 WIND PROFILER OPERATING IN SUBMODE A
+ 0001 01 WIND PROFILER OPERATING IN SUBMODE B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025034 0003 0001 01 TEST A PERFORMED AND FAILED
+ 0002 01 TEST B PERFORMED AND FAILED
+ 0003 01 TEST RESULTS INCONCLUSIVE
+025036 0004 0000 02 NETWORK OF SEVERAL DIRECTION-FINDERS OPERATING ON
+ THE SAME INDIVIDUAL ATMOSPHERICS
+ 0001 02 NETWORK OF SEVERAL ARRIVAL-TIME STATIONS OPERATING ON
+ THE SAME INDIVIDUAL ATMOSPHERICS
+ 0006 01 SINGLE STATION RANGE BEARING TECHNIQUE
+ 0015 01 MISSING VALUE
+025040 0010 0000 01 NON-SPECIFIC MODE
+ 0001 01 FIRST GUESS DATA
+ 0002 01 CLOUD DATA
+ 0003 01 AVERAGE VECTOR DATA
+ 0004 01 PRIMARY DATA
+ 0005 01 GUESS DATA
+ 0006 01 VECTOR DATA
+ 0007 01 TRACER DATA; THE IMAGE
+ 0008 01 TRACER DATA TO NEXT IMAGE
+ 0015 01 MISSING VALUE
+025041 0004 0000 01 DIRECTION ORIGINALLY REPORTED IN TRUE DEGREES
+ 0001 01 DIRECTION ORIGINALLY REPORTED USING CODE TABLE 0700, FM 13
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025042 0004 0000 01 SPEED ORIGINALLY REPORTED IN METERS PER SECOND
+ 0001 01 SPEED ORIGINALLY REPORTED USING CODE TABLE 2251, FM 13
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025045 0020 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+ 0007 01 CHANNEL 7 PRESENT - (SET TO 1 PRESENT)
+ 0008 01 CHANNEL 8 PRESENT - (SET TO 1 PRESENT)
+ 0009 01 CHANNEL 9 PRESENT - (SET TO 1 PRESENT)
+ 0010 01 CHANNEL 10 PRESENT - (SET TO 1 PRESENT)
+ 0011 01 CHANNEL 11 PRESENT - (SET TO 1 PRESENT)
+ 0012 01 CHANNEL 12 PRESENT - (SET TO 1 PRESENT)
+ 0013 01 CHANNEL 13 PRESENT - (SET TO 1 PRESENT)
+ 0014 01 CHANNEL 14 PRESENT - (SET TO 1 PRESENT)
+ 0015 01 CHANNEL 15 PRESENT - (SET TO 1 PRESENT)
+ 0016 01 CHANNEL 16 PRESENT - (SET TO 1 PRESENT)
+ 0017 01 CHANNEL 17 PRESENT - (SET TO 1 PRESENT)
+ 0018 01 CHANNEL 18 PRESENT - (SET TO 1 PRESENT)
+ 0019 01 CHANNEL 19 PRESENT - (SET TO 1 PRESENT)
+ 0020 01 CHANNEL 20 PRESENT - (SET TO 1 PRESENT)
+025046 0004 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+025047 0003 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+025048 0015 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+ 0007 01 CHANNEL 7 PRESENT - (SET TO 1 PRESENT)
+ 0008 01 CHANNEL 8 PRESENT - (SET TO 1 PRESENT)
+ 0009 01 CHANNEL 9 PRESENT - (SET TO 1 PRESENT)
+ 0010 01 CHANNEL 10 PRESENT - (SET TO 1 PRESENT)
+ 0011 01 CHANNEL 11 PRESENT - (SET TO 1 PRESENT)
+ 0012 01 CHANNEL 12 PRESENT - (SET TO 1 PRESENT)
+ 0013 01 CHANNEL 13 PRESENT - (SET TO 1 PRESENT)
+ 0014 01 CHANNEL 14 PRESENT - (SET TO 1 PRESENT)
+ 0015 01 CHANNEL 15 PRESENT - (SET TO 1 PRESENT)
+025049 0005 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+025051 0006 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+025053 0006 0001 01 GOOD
+ 0002 01 REDUNDANT
+ 0003 01 QUESTIONABLE
+ 0004 01 BAD
+ 0005 01 EXPERIMENTAL
+ 0006 01 PRECIPITATING
+025069 0007 0001 01 SMOOTHED
+ 0002 01 BASELINE ADJUSTED
+ 0003 01 NORMALIZED TIME INTERVAL
+ 0004 01 OUTLIER CHECKED
+ 0005 01 PLAUSIBILITY CHECKED
+ 0006 01 CONSISTENCY CHECKED
+ 0007 01 INTERPOLATED
+025086 0004 0000 01 DEPTHS ARE NOT CORRECTED
+ 0001 01 DEPTHS ARE CORRECTED
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025093 0003 0001 01 NO CORRECTION
+ 0002 01 VERTICAL VELOCITY CORRECTION
+ 0007 01 ALL CORRECTIONS
+025095 0001 0001 02 ALTIMETER OPERATING (SET TO 0 IF NOMINAL, SET TO
+ BACKUP)
+025096 0004 0001 01 MODE INDICATOR (0 IF MODE 2, 1 IF MODE 1)
+ 0002 03 MODE 1 CALIBRATION SEQUENCE INDICATOR (0 IF NORMAL DATA TAKI
+ NG EITHER MODE 1 OR 2, 1 IF MODE 1 CALIBRATION SEQUENCE) BIT
+ S 3 AND 4 INDICATE ACTIVE 23.8 GHZ CHANNEL
+ 0003 01 CHANNEL 2 (0 IF ON, 1 IF OFF)
+ 0004 01 CHANNEL 3 (0 IF ON, 1 IF OFF)
+025097 0011 0000 01 RANGES BETWEEN 0 AND 30 CM
+ 0001 01 RANGES BETWEEN 30 AND 60 CM
+ 0002 01 RANGES BETWEEN 60 AND 90 CM
+ 0003 01 RANGES BETWEEN 90 AND 120 CM
+ 0004 01 RANGES BETWEEN 120 AND 150 CM
+ 0005 01 RANGES BETWEEN 150 AND 180 CM
+ 0006 01 RANGES BETWEEN 180 AND 210 CM
+ 0007 01 RANGES BETWEEN 210 AND 240 CM
+ 0008 01 RANGES BETWEEN 240 AND 270 CM
+ 0009 01 RANGES LARGER THAN 270 CM
+ 0015 01 MISSING VALUE
+025098 0008 0001 01 KU BAND RANGE
+ 0002 01 C BAND RANGE
+ 0003 01 KU BAND SWH
+ 0004 01 C BAND SWH
+ 0005 01 KU BAND SCATTEROMETER COEFFICIENT
+ 0006 01 C BAND SCATTEROMETER COEFFICIENT
+ 0007 01 OFF NADIR ANGLE FROM KU BAND WVEFORM PARAMETERS
+ 0008 01 OFF NADIR FROM PLATFORM
+025099 0006 0001 01 KU BAND RANGE INSTRUMENTAL CORRECTION
+ 0002 01 C BAND RANGE INSTRUMENTAL CORRECTION
+ 0003 01 KU BAND SWH INSTRUMENTAL CORRECTION
+ 0004 01 C BAND SWH INSTRUMENTAL CORRECTION
+ 0005 01 KU BAND SCATTEROMETER COEFFICIENT INSTRUMENTAL CORRECTION
+ 0006 01 C BAND SCATTEROMETER COEFFICIENT INSTRUMENTAL CORRECTION
+025110 0006 0001 02 RAW DATA ANALYSIS USED FOR RAW DATA CORRECTION.
+ CORRECTION DONE USING DEFAULT PARAMETERS
+ 0002 02 RAW DATA ANALYSIS USED FOR RAW DATA CORRECTION.
+ CORRECTION DONE USING RAW DATA ANALYSIS RESULTS
+ 0003 01 ANTENNA ELEVATION PATTERN CORRECTION APPLIED
+ 0004 01 NOMINAL CHIRP REPLICA USED
+ 0005 01 RECONSTRUCTED CHIRP USED
+ 0006 01 SLANT RANGE TO GROUND RANGE CONVERSION APPLIED
+025120 0004 0000 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS GREATER THAN THE ACCEPTABLE THRESHOLD
+ 0001 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS LESS THAN THE ACCEPTABLE THRESHOLD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025122 0004 0000 01 HARDWARE CONFIGURATION FOR RF IS A
+ 0001 01 HARDWARE CONFIGURATION FOR RF IS B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025123 0004 0000 01 HARDWARE CONFIGURATION FOR HPA IS A
+ 0001 01 HARDWARE CONFIGURATION FOR HPA IS B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025124 0004 0000 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS GREATER THAN THE ACCEPTABLE THRESHOLD
+ 0001 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS LESS THAN THE ACCEPTABLE THRESHOLD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025144 0013 0001 01 PIXEL IS AFFECTED BY RFI EFFECTS
+ 0002 02 PIXEL IS LOCATED IN THE HEXAGONAL ALIAS DIRECTION CENTRED ON
+ SUN ALIAS
+ 0003 02 PIXEL IS CLOSE TO THE BORDER DELIMITING THE EXTENDED ALIAS F
+ REE ZONE
+ 0004 01 PIXEL IS INSIDE THE EXTENDED ALIAS FREE ZONE
+ 0005 01 PIXEL IS INSIDE THE EXCLUSIVE OF ALIAS FREE ZONE
+ 0006 02 PIXEL IS LOCATED IN ZONE WHERE A MOON ALIAS WAS RECONSTRUCTE
+ D
+ 0007 02 PIXEL IS LOCATED IN ZONE WHERE SUN REFLECTION HAS BEEN DETEC
+ TED
+ 0008 01 PIXEL IS LOCATED IN ZONE WHERE SUN ALIAS WAS RECONSTRUCTED
+ 0009 02 FLAT TARGET TRANSFORMATION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION OF THIS PIXEL
+ 0010 03 SCENE HAS BEEN COMBINED WITH AN ADJUSTMENT SCENE IN OPOSITE
+ POLARISATION DURING IMAGE RECONSTRUCTION TO ACCOUNT FOR CROS
+ S-POLARISATION LEAKAGE
+ 0011 02 DIRECT MOON CORRECTION HAS BENN PERFORMED DURING IMAGE RECON
+ STRUCTION OF THIS PIXEL
+ 0012 02 REFLECTED SUN CORRECTION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION IF THIS PIXEL
+ 0013 02 DIRECT SUN CORRECTION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION OF THIS IMAGE
+026010 0025 0001 01 0100 INCLUDED
+ 0002 01 0200 INCLUDED
+ 0003 01 0300 INCLUDED
+ 0004 01 0400 INCLUDED
+ 0005 01 0500 INCLUDED
+ 0006 01 0600 INCLUDED
+ 0007 01 0700 INCLUDED
+ 0008 01 0800 INCLUDED
+ 0009 01 0900 INCLUDED
+ 0010 01 1000 INCLUDED
+ 0011 01 1100 INCLUDED
+ 0012 01 1200 INCLUDED
+ 0013 01 1300 INCLUDED
+ 0014 01 1400 INCLUDED
+ 0015 01 1500 INCLUDED
+ 0016 01 1600 INCLUDED
+ 0017 01 1700 INCLUDED
+ 0018 01 1800 INCLUDED
+ 0019 01 1900 INCLUDED
+ 0020 01 2000 INCLUDED
+ 0021 01 2100 INCLUDED
+ 0022 01 2200 INCLUDED
+ 0023 01 2300 INCLUDED
+ 0024 01 2400 INCLUDED
+ 0025 01 UNKNOWN MIXTURE OF HOURS
+029001 0006 0000 01 GNOMONIC PROJECTION
+ 0001 01 POLAR STEREOGRAPHIC PROJECTION
+ 0002 01 LAMBERT'S CONFORMAL CONIC PROJECTION
+ 0003 01 MERCATOR'S PROJECTION
+ 0004 01 SCANNING CONE (RADAR)
+ 0007 01 MISSING VALUE
+029002 0004 0000 01 CARTESIAN
+ 0001 01 POLAR
+ 0002 01 OTHER
+ 0007 01 MISSING VALUE
+030031 0013 0000 01 PPI
+ 0001 01 COMPOSITE
+ 0002 01 CAPPI
+ 0003 01 VERTICAL SECTION
+ 0004 01 ALPHANUMERIC DATA
+ 0005 01 MAP OF SUBJECT CLUTTER
+ 0006 01 MAP
+ 0007 01 TEST PICTURE
+ 0008 01 COMMENTS
+ 0009 01 MAP OF GROUND OCCULTATION
+ 0010 01 MAP OF RADAR BEAM HEIGHT
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+030032 0009 0001 01 MAP
+ 0002 01 SATELLITE IR
+ 0003 01 SATELLITE VIS
+ 0004 01 SATELLITE WV
+ 0005 01 SATELLITE MULTISPECTRAL
+ 0006 01 SYNOPTIC OBSERVATIONS
+ 0007 01 FORECAST PARAMETERS
+ 0008 01 LIGHTNING DATA
+ 0015 01 OTHER DATA
+031021 0004 0001 01 1 BIT INDICATOR OF QUALITY, 0= GOOD; 1=SUSPECT OR BAD
+ 0002 02 2 BIT INDICATOR OF QUALITY, 0= GOOD; 1= SLIGHTLY SUSPECTED;
+ 2= HIGHLY SUSPECTED; 3=BAD
+ 0007 01 PERCENTAGE CONFIDENCE
+ 0063 01 MISSING VALUE
+031031 0001 0001 01 DATA NOT PRESENT
+033002 0004 0000 01 DATA NOT SUSPECT
+ 0001 01 DATA SUSPECT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033003 0005 0000 01 DATA NOT SUSPECT
+ 0001 01 DATA SLIGHTLY SUSPECT
+ 0002 01 DATA HIGHTLY SUSPECT
+ 0003 01 DATA CONSIDERED UNFIT FOR USE
+ 0007 01 MISSING VALUE
+033005 0023 0001 01 NO AUTOMATED METEOROLOGICAL DATA CHECKS PERFORMED
+ 0002 01 PRESSURE DATA SUSPECT
+ 0003 01 WIND DATA SUSPECT
+ 0004 01 DRY-BULB TEMPERATURE DATA SUSPECT
+ 0005 01 WET-BULB TEMPERATURE DATA SUSPECT
+ 0006 01 HUMIDITY DATA SUSPECT
+ 0007 01 GROUND TEMPERATURE DATA SUSPECT
+ 0008 01 SOIL TEMPERATURE (DEPTH 1) DATA SUSPECT
+ 0009 01 SOIL TEMPERATURE (DEPTH 2) DATA SUSPECT
+ 0010 01 SOIL TEMPERATURE (DEPTH 3) DATA SUSPECT
+ 0011 01 SOIL TEMPERATURE (DEPTH 4) DATA SUSPECT
+ 0012 01 SOIL TEMPERATURE (DEPTH 5) DATA SUSPECT
+ 0013 01 CLOUD DATA SUSPECT
+ 0014 01 VISIBILITY DATA SUSPECT
+ 0015 01 PRESENT WEATHER DATA SUSPECT
+ 0016 01 LIGHTNING DATA SUSPECT
+ 0017 01 ICE DEPOSIT DATA SUSPECT
+ 0018 01 PRECIPITATION DATA SUSPECT
+ 0019 01 STATE OF GROUND DATA SUSPECT
+ 0020 01 SNOW DATA SUSPECT
+ 0021 01 WATER CONTENT DATA SUSPECT
+ 0022 01 EVAPORATION/EVAPOTRANSPIRATION DATA SUSPECT
+ 0023 01 SUNSHINE DATA SUSPECT
+033006 0005 0000 01 SELF-CHECK OK
+ 0001 01 AT LEAST ONE WARNING ACTIVE, NO ALARMS
+ 0002 01 AT LEAST ONE ALARM ACTIVE
+ 0003 01 SENSOR FAILURE
+ 0007 01 MISSING VALUE
+033015 0016 0000 01 PASSED ALL CHECKS
+ 0001 01 MISSING-DATA CHECK
+ 0002 01 DESCENDING/REASCENDING BALLOON CHECK
+ 0003 01 DATA PLAUSIBILITY CHECK (ABOVE LIMITS)
+ 0004 01 DATA PLAUSIBILITY CHECK (BELOW LIMITS)
+ 0005 01 SUPERADIABATIC LAPSE RATE CHECK
+ 0006 01 LIMITING ANGLES CHECK
+ 0007 01 ASCENSION RATE CHECK
+ 0008 01 EXCESSIVE CHANGE FROM PREVIOUS FLIGHT
+ 0009 01 BALLOON OVERHEAD CHECK
+ 0010 01 WIND SPEED CHECK
+ 0011 01 WIND DIRECTION CHECK
+ 0012 01 DEPENDENCY CHECK
+ 0013 01 DATA VALID BUT MODIFIED
+ 0014 01 DATA OUTLIER CHECK
+ 0063 01 MISSING DATA
+033020 0008 0000 01 GOOD
+ 0001 01 INCONSISTENT
+ 0002 01 DOUBTFUL
+ 0003 01 WRONG
+ 0004 01 NOT CHECKED
+ 0005 01 HAS BEEN CHECKED
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+033021 0004 0000 01 WITHIN LIMITS
+ 0001 01 OUTSIDE LIMITS
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033022 0004 0000 01 GOOD (SEVERAL IDENTICAL REPORTS HAVE BEEN RECEIVED)
+ 0001 01 DUBIOUS (NO IDENTICAL REPORT HAVE BEEN RECEIVED)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033023 0004 0000 01 RELIABLE (LOCATION WAS MADE OVER TWO SATELLITE PASSES)
+ 0001 01 LATEST KNOWN (NO LOCATION OVER CORRESPONDING PASS)
+ 0002 01 DUBIOUS
+ 0003 01 MISSING VALUE
+033024 0010 0000 01 RESERVED
+ 0001 01 EXELLENT - WITHIN 3 METRES
+ 0002 01 GOOD - WITHIN 10 METRES
+ 0003 01 FAIR - WITHIN 20 METRES
+ 0004 01 POOR - MORE THAN 20 METRES
+ 0005 01 EXELLENT -WITHIN 10 FEET
+ 0006 01 GOOD WITHIN-30 FEET
+ 0007 01 FAIR WITHIN 60 FEET
+ 0008 01 POOR - MORE THAN 60 FEET
+ 0015 01 MISSING VALUE
+033025 0005 0000 01 TIME INTERPOLATED, LATITUDE AND LONGITUDE REPORTED
+ 0001 01 TIME REPORTED, LATITUDE AND LONGITUDE INTERPOLATED
+ 0002 01 TIME, LATITUDE AND LONGITUDE INTERPOLATED
+ 0003 01 TIME, LATITUDE AND LONGITUDE REPORTED
+ 0007 01 MISSING VALUE
+033026 0010 0000 01 NORMAL OPERATIONS - MEASUREMENT MODE
+ 0001 01 NORMAL OPERATIONS - NON-MEASUREMENT MODE
+ 0002 01 SMALL RH
+ 0003 01 HUMIDITY ELEMENT IS WET
+ 0004 01 HUMIDITY ELEMENT IS CONTAMINATED
+ 0005 01 HEATER FAIL
+ 0006 01 HEATER FAIL AND WET/CONTAMINATED HUMIDITY ELEMENT
+ 0007 01 SINGLE VALIDITY BAD
+ 0008 01 NUMERIC ERROR
+ 0063 01 MISSING VALUE
+033027 0005 0000 01 RADIUS >= 1500 M
+ 0001 01 500 M <= RADIUS < 1500 M
+ 0002 01 250 M <= RADIUS < 500 M
+ 0003 01 RADIUS < 250 M
+ 0007 01 MISSING VALUE
+033028 0006 0000 01 RESERVED
+ 0001 01 NOMINAL
+ 0002 01 DEGRADED BY SW ERROR; ANY ERROR REPORTED BY THE ALGORITHMS
+ 0003 01 DEGRADED BY INSTRUMENT ERROR
+ 0004 01 DEGRADED BY CORRUPTED/MISSING ADF
+ 0007 01 MISSING
+033030 0007 0001 01 DO NOT USE SCAN FOR PRODUCT GENERATION
+ 0002 01 TIME SEQUENCE ERROR DETECTED WITH THIS SCAN
+ 0003 01 DATA GAP PRECEDES THIS SCAN
+ 0004 01 NO CALIBRATION
+ 0005 01 NO EARTH LOCATION
+ 0006 01 FIRST GOOD TIME FOLLOWING A CLOCK UPDATE
+ 0007 01 INSTRUMENT STATUS CHANGED WITH THIS SCAN
+033031 0021 0001 02 TIME FIELD IS BAD BUT CAN PROBABLY BE INFERRED FROM THE PREV
+ IOUS GOOD TIME
+ 0002 02 TIME FIELD IS BAD AND CAN�~@~YT BE INFERRED FROM THE PREVIOU
+ S GOOD TIME
+ 0003 04 THIS RECORD STARTS A SEQUENCE THAT IS INCONSISTENT WITH PREV
+ IOUS TIMES (I.E. THERE IS A TIME DISCONTINUITY). THIS MAY OR
+ MAY NOT BE ASSOCIATED WITH A SPACECRAFT CLOCK UPDATE (SEE S
+ CAN LINE STATUS FLAGS FOR ATOVS)
+ 0004 02 START OF A SEQUENCE THAT APPARENTLY REPEATS SCAN TIMES THAT
+ HAVE BEEN PREVIOUSLY ACCEPTED
+ 0005 01 SCAN LINE WAS NOT CALIBRATED BECAUSE OF BAD TIME
+ 0006 03 SCAN LINE WAS CALIBRATED USING FEWER THAN THE PREFERRED NUMB
+ ER OF SCAN LINES BECAUSE OF PROXIMATY TO START OR END OF DAT
+ A OR TO A DATA GAP
+ 0007 02 SCAN LINE WAS NOT CALIBRATED BECAUSE OF BAD OR INSUFFICIENT
+ PRT DATA
+ 0008 01 SCAN LINE WAS CALIBRATED BUT WITH MARGINAL PRT DATA
+ 0009 01 SOME UNCALIBRATED CHANNELS ON THIS SCAN
+ 0010 01 UNCALIBRATED DUE TO INSTRUMENT MODE
+ 0011 02 QUESTIONABLE CALIBRATION BECAUSE OF ANTENNA POSITION ERROR O
+ F SPACE VIEW
+ 0012 02 QUESTIONABLE CALIBRATION BECAUSE OF ANTENNA POSITION ERROR O
+ F BLACK BODY
+ 0013 01 NOT EARTH LOCATED BECAUSE OF BAD TIME
+ 0014 03 EARTH LOCATION QUESTIONABLE BECAUSE OF
+ QUESTIONABLE TIME CODE (SEE TIME PROBLEM
+ CODE BITS)
+ 0015 02 EARTH LOCATION QUESTIONABLE - ONLY MARGINAL AGREEMENT
+ WITH REASONABLENESS CHECK
+ 0016 01 EARTH LOCATION QUESTIONABLE - FAILS REASONABLENESS CHECK
+ 0017 02 EARTH LOCATION QUESTIONABLE BECAUSE OF ANTENNA POSITION CHEC
+ K
+ 0018 01 SCAN LINE CALIBRATION COLD BLACK BODY
+ 0019 01 SCAN LINE CALIBRATION WARM BLACK BODY
+ 0020 01 SCAN LINE CALIBRATION SPACE VIEW
+ 0021 01 EARTH VIEW
+033032 0006 0001 01 NO GOOD BLACKBODY COUNTS FOR SCAN LINE
+ 0002 01 NO GOOD SPACE VIEW COUNTS FOR THIS LINE
+ 0003 01 NO GOOD PRTS FOR THIS LINE
+ 0004 01 SOME BAD BLACKBODY VIEW COUNTS FOR THIS LINE
+ 0005 01 SOME BAD SPACE VIEW COUNTS FOR THIS LINE
+ 0006 01 SOME BAD PRT TEMPS ON THIS LINE
+033033 0023 0001 01 SET IF SECONDARY CALIBRATION USED
+ 0002 02 BRIGHTNESS TEMPERATURE IN CHANNEL 1 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0003 02 BRIGHTNESS TEMPERATURE IN CHANNEL 2 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0004 02 BRIGHTNESS TEMPERATURE IN CHANNEL 3 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0005 02 BRIGHTNESS TEMPERATURE IN CHANNEL 4 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0006 02 BRIGHTNESS TEMPERATURE IN CHANNEL 5 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0007 02 BRIGHTNESS TEMPERATURE IN CHANNEL 6 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0008 02 BRIGHTNESS TEMPERATURE IN CHANNEL 7 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0009 02 BRIGHTNESS TEMPERATURE IN CHANNEL 8 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0010 02 BRIGHTNESS TEMPERATURE IN CHANNEL 9 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0011 02 BRIGHTNESS TEMPERATURE IN CHANNEL 10 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0012 02 BRIGHTNESS TEMPERATURE IN CHANNEL 11 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0013 02 BRIGHTNESS TEMPERATURE IN CHANNEL 12 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0014 02 BRIGHTNESS TEMPERATURE IN CHANNEL 13 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0015 02 BRIGHTNESS TEMPERATURE IN CHANNEL 14 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0016 02 BRIGHTNESS TEMPERATURE IN CHANNEL 15 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0017 02 BRIGHTNESS TEMPERATURE IN CHANNEL 16 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0018 02 BRIGHTNESS TEMPERATURE IN CHANNEL 17 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0019 02 BRIGHTNESS TEMPERATURE IN CHANNEL 18 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0020 02 BRIGHTNESS TEMPERATURE IN CHANNEL 19 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0021 02 BRIGHTNESS TEMPERATURE IN CHANNEL 20 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0022 01 SET IF ALL CHANNELS ARE MISSING
+ 0023 01 SUSPECT
+033035 0010 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND PA
+ SSED
+ 0002 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND DE
+ LETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND FA
+ ILED
+ 0005 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND RE
+ -INSERTED
+ 0006 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND N
+ OT MANUALLY CHECCKED
+ 0007 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE
+ AND MANUALLY CHECKED AND FAILED
+ 0008 01 MANUALLY CHECKED AND FAILED
+ 0015 01 MISSING VALUE
+033037 0019 0001 01 U DEPARTURE FROM GUESS
+ 0002 01 V DEPARTURE FROM GUESS
+ 0003 01 U & V DEPARTURE FROM GUESS
+ 0004 01 U ACCELERATION
+ 0005 01 V ACCELERATION
+ 0006 01 U & V ACCELERATION
+ 0007 01 POSSIBLE LAND FEATURE
+ 0008 01 U ACCELERATION AND POSSIBLE LAND FEATURE
+ 0009 01 V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0010 01 U & V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0011 01 BAD WIND GUESS
+ 0012 01 CORRELATION FAILURE
+ 0013 01 SEARCH BOX OFF EDGE OF AREA
+ 0014 01 TARGET BOX OFF EDGE OF AREA
+ 0015 01 PIXEL BRIGHTNESS OUT OF BOUNDS (NOISY LINE)
+ 0016 01 TARGET OUTSIDE OF LAT/LONG BOX
+ 0017 01 TARGET OUTSIDE OF PRESSURE MIN/MAX
+ 0018 01 AUTOEDITOR FLAGGED SLOW VECTOR
+ 0019 01 AUTOEDITOR FLAGGED VECTORS
+033038 0009 0001 01 TOTAL ZENITH DELAY QUALITY IS CONSIDERED POOR
+ 0002 01 GALILEO SATELLITES USED
+ 0003 01 GLONASS SATELLITES USED
+ 0004 01 GPS SATELLITES USED
+ 0005 01 METEOROLOGICAL DATA APPLIED
+ 0006 01 ATMOSPHERIC LOADING CORRECTION APPLIED
+ 0007 01 OCEAN TIDE LOADING APPLIED
+ 0008 01 CLIMATE QUALITY DATA PROCESSING
+ 0009 01 NEAR-REAL TIME DATA PROCESSING
+033039 0009 0001 01 NON-NOMINAL QUALITY
+ 0002 01 OFFLINE PRODUCT
+ 0003 01 ASCENDING OCCULTATION FLAG
+ 0004 01 EXCESS PHASE PROCESSING NON-NOMINAL
+ 0005 01 BENDING ANGLE PROCESSING NON-NOMINAL
+ 0006 01 REFRACTIVITY PROCESSING NON-NOMINAL
+ 0007 01 METEOROLOGICAL PROCESSING NON-NOMINAL
+ 0014 01 BACKGROUND PROFILE NON-NOMINAL
+ 0015 01 BACKGROUND (I.E. NOT RETRIEVED) PROFILE PRESENT
+033041 0004 0000 01 THE FOLLOWING VALUE IS THE TRUE VALUE
+ 0001 02 THE FOLLOWING VALUE IS HIGHER THAN THE TRUE VALUE
+ (THE MEASUREMENT HIT THE LOWER LIMIT OF THE INSTRUMENT)
+ 0002 02 THE FOLLOWING VALUE IS LOWER THAN THE TRUE VALUE
+ (THE MEASUREMENT HIT THE HIGHER LIMIT OF THE INSTRUMENT)
+ 0003 01 MISSING VALUE
+033042 0005 0000 01 EXCLUSIVE LOWER LIMIT (>)
+ 0001 01 INCLUSIVE LOWER LIMIT (>=)
+ 0002 01 EXCLUSIVE UPPER LIMIT (<)
+ 0003 01 INCLUSIVE UPPER LIMIT (=<)
+ 0007 01 MISSING VALUE
+033043 0004 0001 02 SEA MDS. NADIR ONLY SST RETRIEVAL USED 3.7 MICRON
+ CHANNEL. LAND MDS RESERVED
+ 0002 02 SEA MDS. DUAL VIEW SST RETRIEVAL USED 3.7 MICRON
+ CHANNEL. LAND MDS RESERVED.
+ 0003 01 NADIR VIEW CONTAINS DAY TIME DATA
+ 0004 01 FORWARD VIEW CONTAINS DAY TIME DATA
+033044 0014 0001 01 INPUT DATA MEAN OUTSIDE NOMINAL RANGE FLAG
+ 0002 01 INPUT DATA STANDARD DEVIATION OUTSIDE NOMINAL RANGE FLAG
+ 0003 01 NUMBER OF INPUT DATA GAPS > THRESHOLD VALUE
+ 0004 01 PERCENTAGE OF MISSING LINES > THRESHOLD VALUE
+ 0005 02 DOPPLER CENTROID UNCERTAIN. CONFIDENCE MEASURE < SPECIFIC VA
+ LUE
+ 0006 02 DOPPLER AMBIGUITY ESTIMATE UNCERTAIN. CONFIDENCE MEASURE < S
+ PECIFIC VALUE
+ 0007 01 OUTPUT DATA MEAN OUTSIDE NOMINAL RANGE FLAG
+ 0008 01 OUTPUT DATA STANDARD DEVIATION OUTSIDE NOMINAL RANGE FLAG
+ 0009 01 CHIRP RECONSTRUCTION FAILED OR IS OF LOW QUALITY FLAG
+ 0010 01 DATA SET MISSING
+ 0011 01 INVALID DOWNLINK PARAMETERS
+ 0012 02 AZIMUTH CUT-OFF ITERATION COUNT. THE AZIMUTH CUT-OFF FIT DID
+ NOT CONVERGE WITHIN A MINIMUM NUMBER OF ITERATIONS
+ 0013 02 AZIMUTH CUT-OFF FIT DID NOT CONVERGE WITHIN A MINIMUM
+ NUMBER OF ITERATIONS
+ 0014 03 PHASE INFORMATION CONFIDENCE MEASURE. THE IMAGINARY SPECTRAL
+ PEAK IS LESS THAN A MINIMUM THRESHOLD, OR THE ZERO LAG SHIFT
+ IS GREATER THAN A MINIMUM THRESHOLD
+033047 0026 0001 01 ERROR DETECTED AND ATTEMPTS TO RECOVER MADE
+ 0002 01 ANOMALY IN ON-BOARD DATA HANDLING (OBDH) VALUE DETECTED
+ 0003 02 ANOMALY IN ULTRA STABLE OSCILLATOR PROCESSING (USOP) VALUE D
+ ETECTED
+ 0004 01 ERRORS DETECTED BY ON-BOARD COMPUTER
+ 0005 01 AUTOMATIC GAIN CONTROL (AGC) OUT OF RANGE
+ 0006 01 RX DELAY FAULT. RX DISTANCE OUT OF RANGE
+ 0007 01 WAVE FORM SAMPLES FAULT IDENTIFIER. ERROR
+ 0012 01 BRIGHTNESS TEMPERATURE (CHANNEL 1) OUT OF RANGE
+ 0013 01 BRIGHTNESS TEMPERATURE (CHANNEL 2) OUT OF RANGE
+ 0014 01 RESERVED
+ 0015 01 KU OCEAN RETRACKING ERROR
+ 0016 01 S OCEAN RETRACKING ERROR
+ 0017 01 KU ICE 1 RETRACKING ERROR
+ 0018 01 S ICE 1 RETRACKING ERROR
+ 0019 01 KU ICE 2 RETRACKING ERROR
+ 0020 01 S ICE 2 RETRACKING ERROR
+ 0021 01 KU SEA ICE RETRACKING ERROR
+ 0022 01 ARITHMETIC FAULT ERROR
+ 0023 01 METEO DATA STATE. NO MAP
+ 0024 01 METEO DATA STATE. 1 MAP
+ 0025 01 METEO DATA STATE 2 MAPS DEGRADED
+ 0026 01 METEO DATA STATE 2 MAPS NOMINAL
+ 0027 01 ORBIT PROPAGATOR STATUS FOR PROPAGATION MODE, SEVERAL ERRORS
+ 0028 02 ORBIT PROPAGATOR STATUS FOR PROPAGATION MODE, WARNING DETECT
+ ED
+ 0029 02 ORBIT PROPAGATOR STATUS FOR INITIALISATION MODE, SEVERAL ERR
+ ORS
+ 0030 02 ORBIT PROPAGATOR STATUS FOR INITIALISATION MODE, WARNING DET
+ ECTED
+033048 0004 0000 01 INVERSION SUCCESSFUL
+ 0001 01 INVERSION NOT SUCCESSFUL
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033049 0004 0000 01 EXTERNAL WIND DIRECTION USED DURING INVERSION
+ 0001 01 EXTERNAL WIND DIRECTION NOT USED DURING INVERSION
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033050 0008 0000 01 UNQUALIFIED
+ 0001 01 CORRECT VALUE (ALL CHECKS PASSED)
+ 0002 02 PROBABLY GOOD BUT VALUE INCONSISTENT WITH STATISTICS (DIFFER
+ FROM CLIMATOLOGY)
+ 0003 01 PROBABLY BAD (SPIKE, GRADIENT, �~E IF OTHER TESTS PASSED)
+ 0004 02 BAD VALUE, IMPOSSIBLE VALUE (OUT OF SCALE, VERTICAL
+ INSTABILITY, CONSTANT PROFILE)
+ 0005 01 VALUE MODIFIED DURING QUALITY CONTROL
+ 0008 01 INTERPOLATED VALUE
+ 0015 01 MISSING VALUE
+033052 0020 0001 01 DATA BLOCK 1 INVALID (S BAND)
+ 0002 01 DATA BLOCK 2 INVALID (S BAND)
+ 0003 01 DATA BLOCK 3 INVALID (S BAND)
+ 0004 01 DATA BLOCK 4 INVALID (S BAND)
+ 0005 01 DATA BLOCK 5 INVALID (S BAND)
+ 0006 01 DATA BLOCK 6 INVALID (S BAND)
+ 0007 01 DATA BLOCK 7 INVALID (S BAND)
+ 0008 01 DATA BLOCK 8 INVALID (S BAND)
+ 0009 01 DATA BLOCK 9 INVALID (S BAND)
+ 0010 01 DATA BLOCK 10 INVALID (S BAND)
+ 0011 01 DATA BLOCK 11 INVALID (S BAND)
+ 0012 01 DATA BLOCK 12 INVALID (S BAND)
+ 0013 01 DATA BLOCK 13 INVALID (S BAND)
+ 0014 01 DATA BLOCK 14 INVALID (S BAND)
+ 0015 01 DATA BLOCK 15 INVALID (S BAND)
+ 0016 01 DATA BLOCK 16 INVALID (S BAND)
+ 0017 01 DATA BLOCK 17 INVALID (S BAND)
+ 0018 01 DATA BLOCK 18 INVALID (S BAND)
+ 0019 01 DATA BLOCK 19 INVALID (S BAND)
+ 0020 01 DATA BLOCK 20 INVALID (S BAND)
+033053 0020 0001 01 DATA BLOCK 1 INVALID (KU BAND)
+ 0002 01 DATA BLOCK 2 INVALID (KU BAND)
+ 0003 01 DATA BLOCK 3 INVALID (KU BAND)
+ 0004 01 DATA BLOCK 4 INVALID (KU BAND)
+ 0005 01 DATA BLOCK 5 INVALID (KU BAND)
+ 0006 01 DATA BLOCK 6 INVALID (KU BAND)
+ 0007 01 DATA BLOCK 7 INVALID (KU BAND)
+ 0008 01 DATA BLOCK 8 INVALID (KU BAND)
+ 0009 01 DATA BLOCK 9 INVALID (KU BAND)
+ 0010 01 DATA BLOCK 10 INVALID (KU BAND)
+ 0011 01 DATA BLOCK 11 INVALID (KU BAND)
+ 0012 01 DATA BLOCK 12 INVALID (KU BAND)
+ 0013 01 DATA BLOCK 13 INVALID (KU BAND)
+ 0014 01 DATA BLOCK 14 INVALID (KU BAND)
+ 0015 01 DATA BLOCK 15 INVALID (KU BAND)
+ 0016 01 DATA BLOCK 16 INVALID (KU BAND)
+ 0017 01 DATA BLOCK 17 INVALID (KU BAND)
+ 0018 01 DATA BLOCK 18 INVALID (KU BAND)
+ 0019 01 DATA BLOCK 19 INVALID (KU BAND)
+ 0020 01 DATA BLOCK 20 INVALID (KU BAND)
+033060 0004 0000 01 PARAMETER=GOOD
+ 0001 01 PARAMETER=BAD
+ 0002 01 PARAMETER=RESERVED
+ 0003 01 MISSING
+033195 0004 0000 01 DEALIASING NOT USED
+ 0001 01 DEALIASING USED
+ 0002 01 RESERVED
+ 0003 01 MISSING
+033205 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033206 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033207 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033208 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033209 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033220 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 REPORT REJECTED THROUGH THE NAMELIST
+ 0017 01 MODEL SUR. TOO FAR FROM STAT. ALT.
+ 0018 01 MISSING STATION ALTITUDE
+ 0019 01 REPORT OVER SEA
+ 0020 01 REPORT OVER LAND
+ 0021 01 REDUNDANT REPORT
+ 0022 01 TIME OUT OF RANGE
+ 0023 01 VERTICAL POSITION OUT OF RANGE
+ 0024 01 HORIZONTAL POSITION OUT OF RANGE
+ 0025 01 ACTIVATED BY WHITELIST
+ 0026 01 ACTIVATED DUE TO RDB FLAG
+ 0027 01 REJECTED DUE TO RDB FLAG
+ 0028 01 BAD REPORTING PRACTICE
+ 0029 01 ALL DATA REJECTED
+ 0030 01 NO DATA IN THE REPORT
+033221 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033222 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033223 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033224 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033225 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033226 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033227 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033228 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033229 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 THINNED REPORT
+033230 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033232 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 BLACKLISTED DUE TO DISTANCE FROM REF. POINT
+ 0015 01 BLACKLISTED DUE TO MODEL OROGRAPHY
+ 0016 01 BLACKLISTED DUE TO LAND/SEA MASK
+ 0017 01 STATION ALTITUDE BLACKLISTED
+ 0018 01 LONGITUDE BLACKLISTED
+ 0019 01 LATITUDE BLACKLISTED
+ 0020 01 TIME BLACKLISTED
+ 0021 01 DATE BLACKLISTED
+ 0022 01 INSTRUMENT TYPE BLACKLISTED
+ 0023 01 CODE TYPE BLACKLISTED
+ 0024 01 STATION ID BLACKLISTED
+ 0025 01 BLACKLISTED DUE TO FIRST GUESS DEPARTURE
+ 0026 01 BLACKLISTED DUE TO OBSERVED VALUE
+ 0027 01 BLACKLISTED DUE TO TYPE OF VERTICAL COORDINATE
+ 0028 01 BLACKLISTED DUE TO PRESSURE CODE
+ 0029 01 VARIABLE NAME BLACKLISTED
+ 0030 01 MONTHLY MONITORING
+033233 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 REPORT BLACK LISTED
+ 0028 01 REPORT REJECTED
+ 0029 01 REPORT PASSIVE
+ 0030 01 REPORT ACTIVE
+033234 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 DATUM BLACK LISTED
+ 0028 01 DATUM REJECTED
+ 0029 01 DATUM PASSIVE
+ 0030 01 DATUM ACTIVE
+033236 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 DATUM REJECTED DUE TO REJECTED REPORT
+ 0006 01 COMBINED FLAGGING
+ 0007 01 DATUM REJECTED DUE TO NAMELIST
+ 0008 01 VERTICAL COORDINATE CHANGE FROM Z TO P
+ 0009 01 VERTICAL CONSISTENCY CHECK
+ 0010 01 LEVEL SELECTION
+ 0011 01 MULTI LEVEL CHECK
+ 0012 01 TOO MANY SURFACE DATA/LEVELS
+ 0013 01 DUPLICATED DATUM/LEVEL
+ 0014 01 NOT AN ANALYSIS VARIABLE
+ 0015 01 REPORT OVER SEA
+ 0016 01 REPORT OVER LAND
+ 0017 01 REDUNDANT LEVEL
+ 0018 01 REDUNDANT DATUM
+ 0019 01 TOO BIG OBSERVATION ERROR
+ 0020 01 TOO BIG DEPARTURE IN ASSIMILATION
+ 0021 01 TOO BIG FIRST GUESS DEPARTURE
+ 0022 01 REFERENCE LEVEL POSITION OUT OF RANGE
+ 0023 01 VERTICAL POSITION OUT OF RANGE
+ 0024 01 BAD REPORTING PRACTICE
+ 0025 01 ACTIVATED BY WHITELIST
+ 0026 01 ACTIVATED DUE TO RDB FLAG
+ 0027 01 REJECTED DUE TO RDB FLAG
+ 0028 01 MISSING FIRST GUESS VALUE
+ 0029 01 MISSING OBSERVED VALUE
+ 0030 01 MISSING VERTICAL COORDINATE
+033237 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033238 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033239 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033240 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033243 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033244 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033245 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 LAYER FORMED BY SUMMING UP
+ 0029 01 LAYER FORMED BY THINNING UP
+ 0030 01 NOT PREDEFINED LAYER
+033246 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033247 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033248 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033249 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 BLACKLISTED DUE TO FIRST GUESS DEPARTURE
+ 0025 01 BLACKLISTED DUE TO OBSERVED VALUE
+ 0026 01 BLACKLISTED DUE TO TYPE OF VERTICAL COORDINATE
+ 0027 01 BLACKLISTED DUE TO DISTANCE FROM REFERENCE POINT
+ 0028 01 BLACKLISTED DUE TO PRESSURE CODE
+ 0029 01 VARIABLE BLACKLISTED
+ 0030 01 PRESSURE BLACKLISTED
+033252 0010 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND PA
+ SSED
+ 0002 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND DE
+ LETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND FA
+ ILED
+ 0005 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND RE
+ -INSERTED
+ 0006 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND N
+ OT MANUALLY CHECCKED
+ 0007 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND M
+ ANUALLY CHECKED AND FAILED
+ 0008 01 MANUALLY CHECKED AND FAILED
+ 0015 01 MISSING VALUE
+033254 0019 0001 01 U DEPARTURE FROM GUESS
+ 0002 01 V DEPARTURE FROM GUESS
+ 0003 01 U & V DEPARTURE FROM GUESS
+ 0004 01 U ACCELERATION
+ 0005 01 V ACCELERATION
+ 0006 01 U & V ACCELERATION
+ 0007 01 POSSIBLE LAND FEATURE
+ 0008 01 U ACCELERATION AND POSSIBLE LAND FEATURE
+ 0009 01 V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0010 01 U & V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0011 01 BAD WIND GUESS
+ 0012 01 CORRELATION FAILURE
+ 0013 01 SEARCH BOX OFF EDGE OF AREA
+ 0014 01 TARGET BOX OFF EDGE OF AREA
+ 0015 01 PIXEL BRIGHTNESS OUT OF BOUNDS (NOISY LINE)
+ 0016 01 TARGET OUTSIDE OF LAT/LONG BOX
+ 0017 01 TARGET OUTSIDE OF PRESSURE MIN/MAX
+ 0018 01 AUTOEDITOR FLAGGED SLOW VECTOR
+ 0019 01 AUTOEDITOR FLAGGED VECTORS
+035000 0011 0011 01 000-099 INTERNATIONAL FM CODES
+ 0001 01 100-199 RA I CODES
+ 0002 01 200-299 RA II CODES
+ 0003 01 300-399 RA III CODES
+ 0004 01 400-499 RA IV CODES
+ 0005 01 500-599 RA V CODES
+ 0006 01 600-699 RA VI CODES
+ 0007 01 700-799 ANTARCTIC CODES
+ 0008 01 800-999 RESERVED
+ 0009 01 1000-1022 NOT USED
+ 1023 01 MISSING VALUE
+035001 0004 0000 01 REAL TIME
+ 0001 01 NEAR-REAL TIME
+ 0002 01 NON-REAL TIME
+ 0007 01 MISSING VALUE
+035030 0010 0000 01 NO DISCREPANCIES
+ 0001 02 NON-COMPLIANCE WITH STANDARD AND RECOMMENDED PRACTICES
+ AND PROCEDURES INCLUDINGTHOSE OF MONITORING
+ 0002 02 CATALOGUES OF METEOROLOGICAL BULLETINS NOT UPDATED IN A TIME
+ LY MANNER
+ 0003 01 INCORRECT ROUTEING DIRECTORIES
+ 0004 01 LACK OF FLEXIBILITY IN THE ROUTEING ARRANGEMENTS
+ 0005 01 DEFICIENCIES IN THE OPERATION OF GTS CENTRES AND CIRCUITS
+ 0006 01 LOSS OF DATA OR DELAYS IN RELAYING DATA ON THE GTS
+ 0007 02 ROUTEING OF DATA DIFFERENT FROM THE ROUTEING PROVIDED IN THE
+ PLAN
+ 0008 01 VARIOUS MALPRACTICES
+ 0015 01 MISSING VALUE
+035031 0020 0001 01 SUFFICIENT AND ALL OF ACCEPTABLE QUALITY
+ 0002 01 SUFFICIENT BUT PARTLY OF ACCEPTABLE QUALITY
+ 0003 01 INSUFFICIENT BUT ALL OF ACCEPTABLE QUALITY
+ 0004 01 INSUFFICIENT AND OF UNACCEPTABLE QUALITY
+ 0005 01 SOME MESSAGES NOT COMPLETE
+ 0006 02 SUSPECT OR WRONGLY CODED GROUPS COULD NOT BE INTERPRETED CON
+ FIDENTLY
+ 0007 01 GROSS CODING ERRORS
+ 0008 01 TRANSMISSION SEQUENTIAL ORDER NOT OBSERVED
+ 0009 01 REPORT COMPLETELY GARBLED AND THUS DISCARDED
+ 0010 01 DEFICIENCIES IDENTIFIED AND RECTIFIED
+ 0011 01 DEFICIENCIES IDENTIFIED BUT NOT RECTIFIED
+ 0012 01 DEFICIENCIES NOT IDENTIFIED
+ 0013 01 MEASURING ERRORS
+ 0014 01 MUTUAL INCONSISTENCY
+ 0015 01 TEMPORAL INCONSISTENCY
+ 0016 01 FORECAST ERROR
+ 0017 01 BIAS
+ 0018 01 IMPROVE SYSTEM OF QUALITY CONTROL
+ 0019 01 EXPAND TRAINING PROGRAMMES
+ 0123 01 MISSING VALUE
+035032 0010 0001 01 DATA GROUPS MISSING DUE TO RADIO FADING
+ 0002 01 DATA GROUPS MISSING DUE TO OUTAGE OF CENTRE
+ 0003 01 DATA GROUPS MISSING DUE TO OUTAGE OF CIRCUIT
+ 0004 01 NON-IMPLEMENTATION OR MAINTENANCE OF REQUIRED RBSN DENSITY
+ 0005 01 SHORTAGE OF QUALIFIED STAFF TO MAN STATIONS
+ 0006 01 LACK OF CONSUMABLES
+ 0007 01 INSTRUMENT FAILURE
+ 0008 01 NON-ADHERENCE TO TELECOMMUNICATION PROCEDURES
+ 0009 01 SOME OBSERVING PROGRAMMES CEASED
+ 0015 01 MISSING VALUE
+035033 0012 0001 01 NO DEFICIENCY
+ 0002 01 OBSERVATIONS NOT MADE REGULARLY
+ 0003 01 OBSERVATIONS NOT MADE AT RIGHT TIME
+ 0004 01 OBSERVATIONS MADE BUT NOT DISSEMINATED
+ 0005 01 OBSERVATIONS MADE AND SENT TO INCORRECT USERS
+ 0006 01 COLLECTION NOT RECEIVED
+ 0007 01 COLLECTION TRANSMITTED LATE
+ 0008 01 COLLECTION NOT TRANSMITTED
+ 0009 02 DIFFICULTIES IN HF PROPAGATION AND SELECTION OF SUITABLE FRE
+ QUENCY
+ 0010 02 DIFFICULTIES IN MAINTENANCE OF COMMUNICATION EQUIPMENT AT RE
+ MOTE STATIONS
+ 0011 02 NO ALTERNATIVE ARRANGEMENT FOR ROUTEING METEOROLOGICAL OBSER
+ VATION
+ 0123 01 MISSING VALUE
+035034 0007 0001 01 SLIGHT IMPROVEMENT
+ 0002 01 SIGNIFICANT IMPROVEMENT
+ 0003 01 MOST SIGNIFICANT IMPROVEMENT
+ 0004 01 STEADY
+ 0005 01 DECREASING
+ 0006 01 EFFORTS REQUIRED TO IMPROVE NIGHT-TIME OBSERVATIONS
+ 0007 01 MISSING VALUE
+033035 0016 0000 01 RESERVED
+ 0001 01 BALLOON BURST
+ 0002 01 BALLOON FORCED DOWN BY ICING
+ 0003 01 LEAKING OR FLOATING BALLOON
+ 0004 01 WEAK OR FADING SIGNAL
+ 0005 01 BATTERY FAILURE
+ 0006 01 GROUND EQUIPMENT FAILURE
+ 0007 01 SIGNAL INTERFERENCE
+ 0008 01 RADIOSONDE FAILURE
+ 0009 01 EXCESSIVE MISSING DATA FRAMES
+ 0010 01 RESERVED
+ 0011 01 EXCESSIVE MISSING TEMPERATURE
+ 0012 01 EXCESSIVE MISSING PRESSURE
+ 0013 01 USER TERMINATED
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+040011 0004 0001 01 MEAN SEA SURFACE (MSS) INTERPOLATION FLAG
+ 0002 02 OCEAN TIDE SOLUTION 1 INTERPOLATION FLAG (0= 4 POINTS OVER O
+ CEAN, 1=LESS THAN 4 POINTS)
+ 0003 02 OCEAN TIDE SOLUTION 2 INTERPOLATION FLAG (0= 4 POINTS OVER O
+ CEAN, 1=LESS THAN 4 POINTS)
+ 0004 02 METEOROLOGICAL DATA INTERPOLATION FLAG (0= 4 POINTS OVER OCE
+ AN, 1=LESS THAN 4 POINTS)
+040012 0003 0001 01 18.7 GHZ BRIGHTNESS TEMPERATURE
+ 0002 01 23.8 GHZ BRIGHTNESS TEMPERATURE
+ 0003 01 34 GHZ BRIGHTNESS TEMPERATURE
+040013 0005 0000 01 INTERPOLATION WITH NO GAP BETWEEN JMR DATA
+ 0001 01 INTERPOLATION WITH GAP BETWEEN JMR DATA
+ 0002 01 EXTRAOLATION OF JMR DATA
+ 0003 01 FAILURE OF EXTRAPOLATION AND INTERPOLATION
+ 0007 01 MISSING VALUE
+049194 0014 0001 01 PASSED QUALITY CONTROL
+ 0002 01 OUTSIDE TIME WINDOW
+ 0003 01 ABOVE LAND
+ 0004 01 OUTSIDE ENTIRE GRID
+ 0005 01 WAVE HEIGHT OUT OF RANGE
+ 0006 01 TOO HIGH ALONG TRACK JUMP
+ 0007 01 TOO SHORT ALONG TRACK JUMP
+ 0008 01 TOO HIGH ALONG TRACK VARIANCE
+ 0009 01 OUTSIDE CONFIDENCE LIMIT
+ 0010 01 DOUBLE OBSERVATION
+ 0011 01 PEAKINESS ABOVE THRESHOLD
+ 0012 01 RESERVED
+ 0013 01 RESERVED
+ 0014 01 RESERVED
+049193 0014 0001 01 EXELLENT (COST LESS THAN 0.1)
+ 0002 01 GOOD (COST LESS THAN 0.5)
+ 0003 01 QUESTIONABLE (COST LARGER THAN 0.5)
+ 0004 01 RESULTS UNTABLE
+ 0005 01 OBSERVED SAR SPECTRUM REJECTED
+ 0006 01 WAM FIRST GUESS REJECTED
+ 0007 01 SIMULATED SAR REJECTED
+ 0008 01 NO AZIMUTH CUT-OFF ADJUSTMENT
+ 0009 01 RESERVED
+ 0010 01 RESERVED
+ 0011 01 RESERVED
+ 0012 01 RESERVED
+ 0013 01 RESERVED
+ 0014 01 RESERVED
diff --git a/bufrtables/C0000000000098002001.TXT b/bufrtables/C0000000000098002001.TXT
new file mode 100755
index 0000000..d659730
--- /dev/null
+++ b/bufrtables/C0000000000098002001.TXT
@@ -0,0 +1,6065 @@
+001003 0008 0000 01 ATARCTICA
+ 0001 01 REGION I
+ 0002 01 REGION II
+ 0003 01 REGION III
+ 0004 01 REGION IV
+ 0005 01 REGION V
+ 0006 01 REGION VI
+ 0007 01 MISSING VALUE
+001007 0132 0001 01 ERS 1
+ 0002 01 ERS 2
+ 0003 01 METOP-1
+ 0004 01 METOP-2
+ 0005 01 METOP-3
+ 0020 01 SPOT1
+ 0021 01 SPOT2
+ 0022 01 SPOT3
+ 0023 01 SPOT4
+ 0040 01 OERSTED
+ 0041 01 CHAMP
+ 0042 01 TERRASAR-X
+ 0050 01 METEOSAT 3
+ 0051 01 METEOSAT 4
+ 0052 01 METEOSAT 5
+ 0053 01 METEOSAT 6
+ 0054 01 METEOSAT 7
+ 0055 01 METEOSAT 8
+ 0056 01 METEOSAT 9
+ 0057 01 METEOSAT 10
+ 0058 01 METEOSAT 1
+ 0059 01 METEOSAT 2
+ 0060 01 ENVISAT
+ 0070 01 METEOSAT 11
+ 0120 01 ADEOS
+ 0121 01 ADEOS II
+ 0150 01 GMS 3
+ 0151 01 GMS 4
+ 0152 01 GMS 5
+ 0171 01 MTSAT-1R
+ 0172 01 MTSAT-2
+ 0200 01 NOAA 8
+ 0201 01 NOAA 9
+ 0202 01 NOAA 10
+ 0203 01 NOAA 11
+ 0204 01 NOAA 12
+ 0205 01 NOAA 14
+ 0206 01 NOAA 15
+ 0207 01 NOAA 16
+ 0208 01 NOAA 17
+ 0209 01 NOAA 18
+ 0220 01 LANDSAT 5
+ 0221 01 LANDSAT 4
+ 0222 01 LANDSAT 7
+ 0240 01 DMSP 7
+ 0241 01 DMSP 8
+ 0242 01 DMSP 9
+ 0243 01 DMSP 10
+ 0244 01 DMSP 11
+ 0245 01 DMSP 12
+ 0246 01 DMSP 13
+ 0247 01 DMSP 14
+ 0248 01 DMSP 15
+ 0249 01 DMSP 16
+ 0250 01 GOES 6
+ 0251 01 GOES 7
+ 0252 01 GOES 8
+ 0253 01 GOES 9
+ 0254 01 GOES 10
+ 0255 01 GOES 11
+ 0256 01 GOES 12
+ 0257 01 GOES 13
+ 0258 01 GOES 14
+ 0259 01 GOES 15
+ 0260 01 JASON-1
+ 0261 01 JASON-2
+ 0281 01 QUIKSCAT
+ 0282 01 TRMM
+ 0283 01 CORIOLIS
+ 0285 01 DMSP17
+ 0310 01 GOMS 1
+ 0311 01 GOMS 2
+ 0320 01 METEOR 2-21
+ 0321 01 METEOR 3-5
+ 0322 01 METEOR 3M-1
+ 0323 01 METEOR 3M-2
+ 0341 01 RESURS 01-4
+ 0430 01 INSAT 1B
+ 0431 01 INSAT 1C
+ 0432 01 INSAT 1D
+ 0450 01 INSAT 2A
+ 0451 01 INSAT 2B
+ 0452 01 INSAT 2E
+ 0470 01 INSAT 3A
+ 0471 01 INSAT 3D
+ 0472 01 INSAT 3E
+ 0500 01 FY-1C
+ 0501 01 FY-1D
+ 0510 01 FY-2
+ 0512 01 FY-2B
+ 0513 01 FY-2C
+ 0514 01 FY-2D
+ 0700 01 TIROS M (ITOS 1)
+ 0701 01 NOAA 1
+ 0702 01 NOAA 2
+ 0703 01 NOAA 3
+ 0704 01 NOAA 4
+ 0705 01 NOAA 5
+ 0706 01 NOAA 6
+ 0707 01 NOAA 7
+ 0708 01 TIROS-N
+ 0710 01 GOES (SMS 1)
+ 0711 01 GOES (SMS 2)
+ 0720 01 TOPEX
+ 0721 01 GFO (GEOSAT FOLLOW ON)
+ 0722 01 GRACE A
+ 0723 01 GRACE B
+ 0731 01 GOES 1
+ 0732 01 GOES 2
+ 0733 01 GOES 3
+ 0734 01 GOES 4
+ 0735 01 GOES 5
+ 0740 01 COSMIC-1
+ 0741 01 COSMIC-2
+ 0742 01 COSMIC-3
+ 0743 01 COSMIC-4
+ 0744 01 COSMIC-5
+ 0745 01 COSMIC-6
+ 0763 01 NIMBUS 3
+ 0764 01 NIMBUS 4
+ 0765 01 NIMBUS 5
+ 0766 01 NIMBUS 6
+ 0767 01 NIMBUS 7
+ 0780 01 ERBS
+ 0781 01 UARS
+ 0782 01 EARTH PROBE
+ 0783 01 TERRA
+ 0784 01 AQUA
+ 0785 01 AURA
+ 0800 01 SUNSAT
+ 0820 01 SAC-C
+ 1023 01 MISSIN VALUE
+001032 0041 0001 01 PREPROCESSING CONSISTENCY CHECK
+ 0010 01 BIAS CORRECTION
+ 0020 01 BLACK LIST
+ 0030 01 OI MASS AND WIND ANALYSIS, REPORT STATUS
+ 0031 01 OI HUMIDITY ANALYSIS, REPORT STATUS
+ 0032 01 OI ANALYSIS VARIABLES
+ 0033 01 OI ANALYSIS, FIRST GUESS Q/C
+ 0034 01 OI ANALYSIS, FINAL ANALYSIS Q/C
+ 0035 01 OI ANALYSIS, EVENT FLAGS
+ 0040 01 DYNAMIC INITIALISATION SCHEME
+ 0041 01 NORMAL MODE INITIALISATION SCHEME
+ 0050 01 SURFACE ANALYSIS, REPORT STATUS
+ 0051 01 SURFACE ANALYSIS VARIABLES
+ 0052 01 SURFACE ANALYSIS Q/C
+ 0053 01 SURFACE ANALYSIS, EVENT FLAGS
+ 0060 01 3D VAR REPORT STATUS
+ 0061 01 3D VAR ANALYSIS VARIABLES
+ 0062 01 3D VAR Q/C
+ 0063 01 3D VAR EVENT FLAGS
+ 0080 01 PRESAT FIRST GUESS
+ 0081 01 PRESAT ERROR STANDARD DEVIATIONS
+ 0082 01 PRESAT BIAS ESTIMATES
+ 0083 01 PRESAT BRIGHTNESS TEMPERATURE QUALITY FLAGS
+ 0084 01 PRESAT SAMARY FLAGS
+ 0090 01 FIRST GUESS (6 HOUR FORECAST)
+ 0091 01 FIRST GUESS (FGAT INTERPOLATED)
+ 0100 01 PRESCAT AMBIGUITY REMOVAL
+ 0110 01 WAM FIRST GUESS
+ 0111 01 WAM ANALYSIS
+ 0112 01 WAM FORECAST
+ 0113 01 WAM Q/C
+ 0201 01 COLLOCATION WITH SURFACE DATA
+ 0202 01 COLLOCATION WITH TEMP/PILOT DATA
+ 0203 01 COLLOCATION WITH AIREP DATA
+ 0204 01 COLLOCATION WITH SATOB DATA
+ 0205 01 COLLOCATION WITH TOVS DATA
+ 0206 01 COLLOCATION WITH ERS1 SCATTEROMETER DATA
+ 0207 01 COLLOCATION WITH ERS1 ALTIMETER DATA
+ 0220 01 ERS1 SCATTEROMETER COLLOCATION BLACK LIST
+ 0230 01 GAUSS ERROR
+ 0231 01 GROSS ERROR
+001031 0219 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC 50
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC 110
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC 140
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+ 0255 01 MISSING VALUE 219
+001032 0041 0001 01 PREPROCESSING CONSISTENCY CHECK
+ 0010 01 BIAS CORRECTION
+ 0020 01 BLACK LIST
+ 0030 01 OI MASS AND WIND ANALYSIS, REPORT STATUS
+ 0031 01 OI HUMIDITY ANALYSIS, REPORT STATUS
+ 0032 01 OI ANALYSIS VARIABLES
+ 0033 01 OI ANALYSIS, FIRST GUESS Q/C
+ 0034 01 OI ANALYSIS, FINAL ANALYSIS Q/C
+ 0035 01 OI ANALYSIS, EVENT FLAGS
+ 0040 01 DYNAMIC INITIALISATION SCHEME
+ 0041 01 NORMAL MODE INITIALISATION SCHEME
+ 0050 01 SURFACE ANALYSIS, REPORT STATUS
+ 0051 01 SURFACE ANALYSIS VARIABLES
+ 0052 01 SURFACE ANALYSIS Q/C
+ 0053 01 SURFACE ANALYSIS, EVENT FLAGS
+ 0060 01 3D VAR REPORT STATUS
+ 0061 01 3D VAR ANALYSIS VARIABLES
+ 0062 01 3D VAR Q/C
+ 0063 01 3D VAR EVENT FLAGS
+ 0080 01 PRESAT FIRST GUESS
+ 0081 01 PRESAT ERROR STANDARD DEVIATIONS
+ 0082 01 PRESAT BIAS ESTIMATES
+ 0083 01 PRESAT BRIGHTNESS TEMPERATURE QUALITY FLAGS
+ 0084 01 PRESAT SAMARY FLAGS
+ 0090 01 FIRST GUESS (6 HOUR FORECAST)
+ 0091 01 FIRST GUESS (FGAT INTERPOLATED)
+ 0100 01 PRESCAT AMBIGUITY REMOVAL
+ 0110 01 WAM FIRST GUESS
+ 0111 01 WAM ANALYSIS
+ 0112 01 WAM FORECAST
+ 0113 01 WAM Q/C
+ 0201 01 COLLOCATION WITH SURFACE DATA
+ 0202 01 COLLOCATION WITH TEMP/PILOT DATA
+ 0203 01 COLLOCATION WITH AIREP DATA
+ 0204 01 COLLOCATION WITH SATOB DATA
+ 0205 01 COLLOCATION WITH TOVS DATA
+ 0206 01 COLLOCATION WITH ERS1 SCATTEROMETER DATA
+ 0207 01 COLLOCATION WITH ERS1 ALTIMETER DATA
+ 0220 01 ERS1 SCATTEROMETER COLLOCATION BLACK LIST
+ 0230 01 GAUSS ERROR
+ 0231 01 GROSS ERROR
+001033 0219 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC 50
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC 110
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC 140
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA 190
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+ 0255 01 MISSING VALUE
+001035 0219 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC 50
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC 110
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC 140
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA 190
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+ 0255 01 MISSING VALUE 219
+001090 0005 0000 01 LAF (LAGGED-AVERAGE FORECASTING)
+ 0001 01 BREEDING
+ 0002 01 SINGULAR VECTOR
+ 0003 01 MULTIPLE ANALYSIS CYCLE
+ 0255 01 MISSING VALUE
+001092 0005 0000 01 UNPERTURBED HIGH-RESOLUTION CONTROL FORECAST
+ 0001 01 UNPERTURBED LOW-RESOLUTION CONTROL FORECAST
+ 0002 01 NEGATIVELY PERTURBED FORECAST
+ 0003 01 POSITIVELY PERTURBED FORECAST
+ 0255 01 MISSING VALUE
+002001 0004 0000 01 AUTOMATIC STATION
+ 0001 01 MANNED STATION
+ 0002 01 HYBRID, BOTH MANNED AND AUTOMATIC
+ 0003 01 MISSING VALUE
+002002 0004 0000 01 MEASURED IN M S-1 UNLESS OTHERWISE INDICATED
+ 0001 01 CERTIFIED INSTRUMENTS
+ 0002 01 ORIGINALY MEASURED IN KNOTS
+ 0003 01 ORIGINALY MEASURED IN KM/H
+002003 0012 0000 01 PRESSURE INSTRUMENT ASSOCIATED WITH WIND-MEASURING EQUIPMENT
+ 0001 01 OPTICAL THEODOLITE
+ 0002 01 RADIO THEODOLITE
+ 0003 01 RADAR
+ 0004 01 VLF-OMEGA
+ 0005 01 LORAN C
+ 0006 01 WIND PROFILER
+ 0007 01 SATELLITE NAVIGATION
+ 0008 01 RADIO-ACOUSTIC SOUNDING SYSTEM (RASS)
+ 0009 01 SODAR
+ 0014 02 PRESSURE INSTRUMENT ASSOCIATED WITH WIND MEASUREMENT EQUIPME
+ NT BUT PRESSURE ELEMENT FAILED DURING ASCENT
+ 0015 01 MISSING VALUE
+002004 0011 0000 01 USA OPEN PAN EVAPORIMETER (WITHOUT COVER)
+ 0001 01 USA OPEN PAN EVAPORIMETER (MESH COVERED)
+ 0002 01 GGI-300 EVAPORIMETER (SUNKEN)
+ 0003 01 20 M**2 TANK
+ 0004 01 OTHERS
+ 0005 01 RICE
+ 0006 01 WHEAT
+ 0007 01 MAIZE
+ 0008 01 SORGHUM
+ 0009 01 OTHER CROPS
+ 0015 01 MISSING VALUE
+002011 0054 0000 01 RESERVED
+ 0001 01 RESERVED
+ 0002 01 NO RADIOSONDE-PASSIVE TARGET(E.G.REFLECTOR)
+ 0003 01 NO RADIOSONDE-ACTIVE TARGET(E.G.TRANSPONDER)
+ 0004 01 NO RADIOSONDE-PASSIVE TEMPERATURE-HUMIDITY PROFILER
+ 0005 01 NO RADIOSONDE-ACTIVE TEMPERATURE-HUMIDITY PROFILER
+ 0006 01 NO RADIOSONDE-RADIO ACOUSTIC SOUNDER
+ 0009 01 NO RADIOSONDE-SYSTEM UNKNOWN OR NOT SPECIFIED
+ 0010 01 RS VIZ TYPE A (USA)
+ 0011 01 RS VIZ TYPE B (USA)
+ 0012 01 RS SDC (SPACE DATA CORPORATION-USA)
+ 0013 01 ASTOR (NO LONGER MADE-AUSTRALIA)
+ 0014 01 VIZ MARK I MICROSONDE(USA)
+ 0015 01 EEC COMPANY TYPE 23 (USA)
+ 0016 01 ELIN (AUSTRIA)
+ 0017 01 GRAW G. (GERMANY)
+ 0019 01 GRAW M60 (GERMANY)
+ 0020 01 INDIAN MET SERVICE MK3 (INDIA)
+ 0021 01 VIZ/JIN YANG MARK I MICROSONDE(SOUTH KOREA)
+ 0022 01 MEISEI RS2-80 (JAPAN)
+ 0023 01 MESURAL FMO 1950A (FRANCE)
+ 0024 01 MESURAL FMO 19455A (FRANCE)
+ 0025 01 MESURAL MH73A (FRANCE)
+ 0026 01 METEOLABOR BASORA (SWITZERLAND)
+ 0027 01 AVK-MRZ (USSR)
+ 0028 01 METEORIT MARZ2-1 (USSR)
+ 0029 01 METEIRIT MARZ2-2 (USSR)
+ 0030 01 OKI RS2-80 (JAPAN)
+ 0031 01 VIZ/VALCOM TYPE A PRESSURE-COMMUTATED(CANADA)
+ 0032 01 SHANGAI RADIO (CHINA)
+ 0033 01 UK MET OFFICE MK3( UK)
+ 0034 01 VINOHRADY(CZECHOSLOVAKIA)
+ 0035 01 VAISALA RS18 (FINLAND)
+ 0036 01 VAISALA RS21 (FINLAND)
+ 0037 01 VAISALA RS80 (FINLAND)
+ 0038 01 VIZ LOCATE (LORAN-C)(USA)
+ 0039 01 SPRENGER E076 (GERMANY)
+ 0040 01 SPRENGER E084 (GERMANY)
+ 0041 01 SPRENGER E085 (GERMANY)
+ 0042 01 SPRENGER E086 (GERMANY)
+ 0043 01 AIR IS -4A-1680 (UK)
+ 0044 01 AIR IS -4A-1680 X (UK)
+ 0045 01 RS MSS(USA)
+ 0046 01 AIR IS -4A-403(USA)
+ 0047 01 MEISLEI RS2-91(JAPAN)
+ 0048 01 VALCOM(CANADA)
+ 0049 01 VIZ MARK II(USA)
+ 0060 01 VAISALA RS80/MICROCORA (FINLAND)
+ 0061 01 VAISALA RS80/DIGCORA OR MARWIN (FINLAND)
+ 0062 01 VAISALA RS80/PCCORA (FINLAND)
+ 0063 01 VAISALA RS80/STAR (FINLAND)
+ 0064 03 ORBITAL,SCIENCE CORPORATION,SPACE DATA DIVISION,TRANSPONDER
+ RADIOSONDE,TYPE 909-11-XX,WHERE XX CORRECPOND TO THE MODEL
+ OF THE INSTRUMENT
+ 0065 01 VIZ TRANSPONDER RADIOSONDE,MODEL NUMBER 1499-520(USA)
+ 0255 01 MISSING VALUE
+002012 0001 0000 01 TO BE DEVELOPED
+002013 0009 0000 01 NO CORRECTION
+ 0001 01 CIMO SOLAR CORRECTED AND CIMO INFRARED CORRECTED
+ 0002 01 CIMO SOLAR CORRECTED AND IFRARED CORRECTED
+ 0003 01 CIMO SOLAR CORRECTED ONLY
+ 0004 02 SOLAR AND INFRARED CORRECTED AUTOMATICALLY BY RADIOSONDE SY
+ STEM
+ 0005 01 SOLAR CORRECTED AUTOMATICALLY BY RADIOSONDE SYSTEM
+ 0006 01 SOLAR AND INFRARED CORRECTED AS SPECIFIED BY COUNTRY
+ 0007 01 SOLAR CORRECTED AS SPECIFIED BY COUNTRY
+ 0015 01 MISSING VALUE
+002014 0050 0000 01 NO WINDFINDING
+ 0001 01 AUTOMATIC WITH AUXILIARY OPTICAL DIRECTION FINDING
+ 0002 01 AUTOMATIC WITH AUXILIARY RADIO DIRECTION FINDING
+ 0003 01 AUTOMATIC WITH AUXILIARY RANGING
+ 0004 01 NOT USED
+ 0005 01 AUTOMATIC WITH MULTIPLE VLF-OMEGA SIGNALS
+ 0006 01 AUTOMATIC CROSS CHAIN LORAN-C
+ 0007 01 AUTOMATIC WITH AUXILIARY WIND PROFILER
+ 0008 01 AUTOMATIC SATELLITE NAVIGATION
+ 0019 01 TRACKING TECHNIQUE NOT SPECIFIED
+ 0020 01 VESSEL STOPPED
+ 0021 01 VESSEL DIVERTED FROM ORIGINAL DESTINATION
+ 0022 01 VESSEL'S ARRIVAL DELAYED
+ 0023 01 CONTAINER DAMAGED
+ 0024 01 POWER FAILURE TO CONTAINER
+ 0029 01 OTHER PROBLEMS
+ 0030 01 MAJOR POWER PROBLEMS
+ 0031 01 UPS INOPERATIVE
+ 0032 01 RECEIVER HARDWARE PROBLEMS
+ 0033 01 RECEIVER SOFTWARE PROBLEMS
+ 0034 01 PROCESSOR HARDWARE PROBLEMS
+ 0035 01 PROCESSOR SOFTWARE PROBLEMS
+ 0036 01 NAVAID SYSTEM DAMAGED
+ 0037 01 SHORTAGE OF LIFTING GAS
+ 0039 01 OTHER PROBLEMS
+ 0040 01 MECHANICAL DEFECT
+ 0041 01 MATERIAL DEFECT (HAND LAUNCHER)
+ 0042 01 POWER FAILURE
+ 0043 01 CONTROL FAILURE
+ 0044 01 PNEUMATIC/HYDRAULIC FAILURE
+ 0045 01 OTHER PROBLEMS
+ 0046 01 COMPRESSOR PROBLEMS
+ 0047 01 BALLOON PROBLEMS
+ 0048 01 BALLOON RELEASE PROBLEMS
+ 0049 01 LAUNCHER DAMAGED
+ 0050 01 R/S RECEIVER ANTENNA DEFECT
+ 0051 01 NAVAID ANTENNA DEFECT
+ 0052 01 R/S RECEIVER CABLING (ANTENNA DEFECT)
+ 0053 01 NAVAID ANTENNA CABLING DEFECT
+ 0059 01 OTHER PROBLEMS
+ 0060 01 ASAP COMMUNICATIONS DEFECT
+ 0061 01 COMMUNICATIONS FACILITY REJECTED DATA
+ 0062 01 NO POWER AT TRANSMITTINGANTENN
+ 0063 01 ANTENNA CABLE BROKEN
+ 0064 01 ANTENNA CABLE DEFECT
+ 0065 01 MESSAGE TRANSMITTED POWER BELOW NORMAL
+ 0069 01 OTHER PROBLEMS
+ 0070 01 ALL SYSTEMS IN NORMAL OPERATION
+ 0099 01 STATUS OF SYSTEM AND ITS COMPONENTS NOT SPECIFIED
+ 0127 01 MISSING VALUE
+002015 0006 0001 01 PRESSURE ONLY RADIOSONDE
+ 0002 01 PRESSURE ONLY RADIOSONDE PLUS TRANSPONDER
+ 0003 01 PRESSURE ONLY RADIOSONDE PLUS RADAR REFLECTOR
+ 0004 01 NO PRESSURE RADIOSONDE PLUS TRANSPONDER
+ 0005 01 NO PRESSURE RADIOSONDE PLUS RADAR REFLECTOR
+ 0015 01 MISSING VALUE
+002016 0004 0001 01 TRAIN REGULATOR
+ 0002 01 LIGHT UNIT
+ 0003 01 PARACHUTE
+ 0004 01 ROOFTOP RELEASE
+002019 0296 0010 02 BNSC RADIOMETER AATSR ADVANCED ALONG TRACK SCANNIN
+ G RADIOMETER
+ 0011 02 BNSC RADIOMETER ATSR ALONG TRACK SCANNING RADIOME
+ TER
+ 0012 02 BNSC RADIOMETER ATSR-2 ALONG TRACK SCANNING RADIOME
+ TER -2
+ 0013 01 BNSC RADIOMETER MWR MICROWAVE RADIOMETER
+ 0030 01 CNES COMMUNICATIONS ARGOS
+ 0040 01 CNES LIDAR LASER REFLECTORS
+ 0041 02 CNES LIDAR DORIS DOPPLER ORBITOGRAPHY AND RADIO-POSIT
+ IONING INTEGRATED BY SATELLITE
+ 0042 02 CNES LIDAR DORIS-NG DOPPLER ORBITOGRAPHY AND RAD
+ IO-POSITIONING INTEGRATED BY SATELLITE-NG
+ 0047 03 CNES RADAR ALTIMETERS POSEIDON-1 (SSALT-1) POSI
+ TIONING OCEAN SOLID EARTH ICE DYNAMICS ORBITING NAVIGATOR (S
+ INGLE FREQUENCY SOLID STATE RADAR ALTIMETER)
+ 0048 03 CNES RADAR ALTIMETERS POSEIDON-2 (SSALT-2) POSI
+ TIONING OCEAN SOLID EARTH ICE DYNAMICS ORBITING NAVIGATOR (D
+ UAL FREQUENCY SOLID STATE RADAR ALTIMETER)
+ 0050 01 CNES IMAGER RADIOMETER ATSR/M ATSR/M
+ 0051 01 CNES HIGH RESOLUTION OPTICAL IMAGERS HRG
+ 0052 01 CNES RADIOMETER HRV HIGH RESOLUTION VISIBLE
+ 0053 02 CNES RADIOMETER HRVIR HIGH RESOLUTION VISIBLE AND
+ INFRA-RED
+ 0054 02 CNES RADIOMETER SCARAB/MV2 SCANNER FOR EARTH'S
+ RADIATION BUDGET
+ 0055 01 CNES RADIOMETER POLDER POLDER
+ 0060 01 CNES SPECTROMETER VEGETATION VEGETATION
+ 0061 01 CNES SPECTROMETER WINDII WINDII
+ 0080 01 CSA COMMUNICATIONS RADARSAT DTT
+ 0081 01 CSA COMMUNICATIONS RADARSAT TTC
+ 0085 02 CSA RADAR SAR (CSA) SYNTHETIC APERTURE RADAR (CS
+ A)
+ 0090 02 CSA RADIOMETER MOPITT MEASUREMENTS OF POLLUTION IN
+ THE TROPOSPHERE
+ 0091 02 CSA CHEMISTRY INSTRUMENTS OSIRIS OPTICAL SPECTROGRAPH
+ AND INFRA-RED IMAGING SYSTEM
+ 0097 01 CSIRO RADIOMETER PANCHROMATIC IMAGER
+ 0098 02 CRCSS ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GPS
+ RECEIVER
+ 0102 02 DLR RADIOMETER CHAMP GPS SOUNDER GPS TURBORO
+ GUE SPACE RECEIVER (TRSR)
+ 0103 01 UNKNOWN
+ 0116 03 DLR MAGNETOMETER IGOR CHAMP GRAVITY PACKAGE (ACCELEROMETE
+ R+GPS) INTEGRATED GPS AND OCCULTATION RECEIVER STAR AC
+ CELEROMETER
+ 0117 03 DLR MAGNETOMETER CHAMP MAGNETOMETRY PACKAGE (1 SCALAR
+ +2 VECTOR MAGNETOMETER) OVERHAUSER MAGNETOMETER (OVM) AN
+ D FLUXGATE MAGNETOMETER (FGM)
+ 0120 02 ESA COMMUNICATIONS ENVISAT COMMS COMMUNICATIONS PACKA
+ GE ON ENVISAT
+ 0121 02 ESA COMMUNICATIONS ERS COMMS COMMUNICATION PACKAG
+ E FOR ERS
+ 0130 01 ESA LIDARS ALADIN ATMOSPHERIC LASER DOPPLER INSTRUMENT
+ 0131 01 ESA LIDARS ATLID ATMOSPHERIC LIDAR
+ 0140 02 ESA RADAR AMI/SAR/IMAGE ACTIVE MICROWAVE INSTRUMENTA
+ TION. IMAGE MODE
+ 0141 02 ESA RADAR AMI/SAR/WAVE ACTIVE MICROWAVE INSTRUMENTA
+ TION. WAVE MODE
+ 0142 02 ESA RADAR AMI/SCATTEROMETER ACTIVE MICROWAVE INS
+ TRUMENTATION. WIND MODE
+ 0143 01 ESA RADAR ASAR ASAR
+ 0144 02 ESA IMAGING MICROWAVE RADARS ASAR ADVANCED SYN
+ TETIC APERTURA RADAR (IMAGE MODE)
+ 0145 02 ESA IMAGING MICROWAVE RADARS ASAR ADVANCED SYN
+ TETIC APERTURA RADAR (WAVE MODE)
+ 0146 01 ESA CLOUD PROFILE AND RAIN RADARS CPR CLOUD RADAR
+ 0147 01 ESA RADAR RA-2/MWR RADAR ALTIMETER - 2
+ 0148 01 ESA RADAR RA/MWR RADAR ALTIMETER
+ 0150 01 ESA SCATTEROMETERS SCATTEROMETER SCATTEROMETER
+ 0161 02 ESA RADIOMETER MIPAS MICHELSON INTERFEROMETRIC PA
+ SSIVE ATMOSPHERE SOUNDER
+ 0162 02 ESA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E MWR-2 MICROWAVE RADIOMETER-2
+ 0163 03 ESA ATMOSPHERIC CHEMISTRY INSTRUMENTS SOPRANO SUB-
+ MILIMETRE OBSERVATION OF PROCESSES IN THE ABSORPTION NOTEWOR
+ THY FOR OZONE
+ 0170 02 ESA ATMOSPHERIC CHEMISTRY INSTRUMENTS GOME I GLOB
+ AL OZONE MONITORING EXPERIMENT
+ 0172 02 ESA SPECTROMETER GOMOS GLOBAL OZONE MONITORING BY O
+ CCULTATION OF STARS
+ 0174 02 ESA SPECTROMETER MERIS MEDIUM RESOLUTION IMAGING SP
+ ECTROMETER
+ 0175 02 ESA SPECTROMETER SCIAMACHY SCANNING IMAGING ABS
+ ORPTION SPECTROMETER FOR ATMOSPHERIC CARTOGRAPHY
+ 0181 02 EUMETSAT COMMUNICATIONS METEOSAT COMMS COMMUNICATIO
+ NS PACKAGE FOR METEOSAT
+ 0182 02 EUMETSAT COMMUNICATIONS MSG COMMS COMMUNICATIO
+ NS PACKAGE FOR MSG
+ 0190 02 ESA/ EUMETSAT SCATTEROMETERS ASCAT ADVANCED SCATTE
+ ROMETER
+ 0200 02 EUMETSAT RADIOMETER GERB GEOSTATIONARY EARTH
+ RADIATION BUDGET
+ 0202 02 ESA/ EUMETSAT RADIOMETER GRAS GNSS RECEIVER F
+ OR ATMOSPHERIC SOUNDING
+ 0203 02 EUMETSAT RADIOMETER MHS MICROWAVE HUMIDITY S
+ OUNDER
+ 0205 02 EUMETSAT RADIOMETER MVIRI METEOSAT VISIBLE AND
+ INFRA-RED IMAGER
+ 0207 02 EUMETSAT RADIOMETER SEVIRI SPINNING ENHANCED VI
+ SIBLE AND INFRARED IMAGER
+ 0208 02 EUMETSAT IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR)
+ VIRI VIRI
+ 0220 02 ESA/ EUMETSAT SPECTROMETER GOME-2 GLOBAL OZONE MO
+ NITORING EXPERIMENT - 2
+ 0221 03 CNES/ EUMETSAT ATMOSPHERIC TEMPERATURE AND HUMIDITY S
+ OUNDERS IASI INFRA-RED ATMOSPHERIC SOUNDING INTERFEROME
+ TER
+ 0240 02 CAST COMMUNICATIONS DCP DATA COLLECTION PLATFORM TRA
+ NSPONDER
+ 0245 01 CAST RADIOMETER CCD HIGH RESOLUTION CCD CAMERA
+ 0246 02 INPE ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS HSB
+ HUMIDITY SOUNDER/BRAZIL
+ 0248 02 INPE IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) OBA
+ OBSERVADOR BRASILEIRO DA AMAZONIA
+ 0250 01 CAST RADIOMETER WFI WIDE FIELD IMAGER
+ 0255 02 CAST SPECTROMETER IRMSS INFRA RED MULTI SPECTRAL SCA
+ NNER
+ 0260 01 ISRO PRECISION ORBIT BSS & FSS TRANSPONDERS
+ 0261 01 ISRO PRECISION ORBIT DRT-S&R
+ 0262 02 ISRO COMMUNICATIONS INSAT COMMS COMMUNICATIONS PACKA
+ GE FOR INSAT
+ 0268 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS HR-PAN HIGH RESOLUT
+ ION PANCHROMATIC CAMERA
+ 0269 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) MSMR MULTIFREQUENCY SCANNING MICROWAVE RADIOMETER
+ 0270 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VHRR
+ VERY HIGH RESOLUTION RADIOMETER
+ 0271 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) WIFS
+ WIDE FIELD SENSOR
+ 0275 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS AWIFS ADVANCED WID
+ E FIELD SENSOR
+ 0276 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-I LINEAR IMAGI
+ NG SELF SCANNER - I
+ 0277 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-II LINEAR IMAGI
+ NG SELF SCANNER - II
+ 0278 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-III LINE
+ AR IMAGING SELF SCANNER - III
+ 0279 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-IV LINEAR IMAGI
+ NG SELF SCANNER - IV
+ 0284 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS PAN PANCHROMATIC
+ SENSOR
+ 0285 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MOS
+ MODULAR OPTO-ELECTRONIC SCANNER
+ 0286 02 ISRO OCEAN COLOUR INSTRUMENTS OCM OCEAN COLOUR
+ MONITOR
+ 0290 02 JMA COMMUNICATIONS MTSAT COMMS COMMUNICATIONS PACKA
+ GE FOR MTSAT
+ 0294 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS IMAGER/MTSAT
+ -1R IMAGER/MTSAT
+ 0295 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS IMAGER/MTSAT
+ IMAGER/MTSAT
+ 0296 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS VISSR (GMS4)
+ VISIBLE AND INFRA-RED SPIN SCAN RADIOMETER (GMS4)
+ 0300 01 NASA LIDARS GLAS GEOSCIENCE LASER ALTIMETER SYSTEM
+ 0301 01 NASA PRECISION ORBIT LRA LASER RETROREFLECTOR ARRAY
+ 0302 01 NASA LIDARS MBLA MULTI BEAM LASER ALTIMETER
+ 0309 02 NASA CLOUD PROFILE AND RAIN RADARS CPR (CLOUDSAT) CLOU
+ D PROFILING RADAR
+ 0312 01 NASA RADAR NSCAT NASA SCATTEROMETER
+ 0313 01 NASA RADAR SEAWINDS ADEOS II - NASA SCATTEROMETER
+ 0330 02 NASA EARTH RADIATION BUDGET RADIOMETER ACRIM ACTI
+ VE CAVITY RADIOMETER IRRADIANCE MONITOR
+ 0334 02 NASA TOTAL AND PROFILE OZONE BUV BACKSCATTER ULTRAVIO
+ LET INSTRUMENT
+ 0336 02 NASA HIGH RESOLUTION OPTICAL IMAGERS ALI ADVANCED LAN
+ D IMAGER
+ 0347 02 NASA HIGH RESOLUTION OPTICAL IMAGERS ASTER ADVANCED SPA
+ CEBORNE THERMAL EMISSION AND REFLECTION RADIOMETER
+ 0348 02 NASA EARTH RADIATION BUDGET RADIOMETER CERES-2 CLOU
+ D AND THE EARTH'S RADIANT ENERGY SYSTEM
+ 0351 02 CONAE ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GPSD
+ R GPS DEMONSTRATION RECEIVER
+ 0353 02 NASA TOTAL AND PROFILE OZONE HIRDLS HIGH RESOLUTION DYNA
+ MICS LIMB SOUNDER
+ 0354 02 NASA TOTAL AND PROFILE OZONE HRDI HIGH RESOLUTION DOPP
+ LER IMAGER
+ 0356 01 NASA RADIOMETER LIS LIGHTNING IMAGING SENSOR
+ 0358 02 NASA MAGNETIC FIELD, AUROAL IMAGERYSCINTILLATION BOUNDARY
+ PEM PARTICLE ENVIRONMENT MONITOR
+ 0359 02 NASA OCEAN COLOUR INSTRUMENTS SEAWIFS SEA-VIEWING
+ WIDE FIELD-OF-VIEW SENSOR
+ 0360 02 NASA EARTH RADIATION BUDGET RADIOMETER SUSIM (UARS)
+ SOLAR ULTRAVIOLET IRRADIANCE MONITOR
+ 0363 02 NASA TOTAL AND PROFILE OZONE SBUV/1 SOLAR BACKSCATTER UL
+ TRAVIOLET 1 INSTRUMENT
+ 0365 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) TMI TRMM MICROWAVE IMAGER
+ 0366 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) JMR JASON-1 MICROWAVE RADIOMETER
+ 0369 02 NASA TOTAL AND PROFILE OZONE LIMS LIMB INFRARED MONITO
+ R OF THE STRATOSPHERE
+ 0370 02 NASA TOTAL AND PROFILE OZONE LRIR LIMB RADIANCE INVERS
+ ION RADIOMETER INSTRUMENT
+ 0371 02 NASA TOTAL AND PROFILE OZONE EPIC EARTH POLYCHROMATIC
+ IMAGING CAMERA
+ 0372 02 NASA EARTH RADIATION BUDGET RADIOMETER NISTAR NIST
+ ADVANCED RADIOMETER
+ 0373 02 NASA MAGNETIC FIELD, AUROAL IMAGERY SCINTILLATION BOUNDAR
+ Y PLASMA-MAG
+ 0374 01 NASA OTHER XPS XUV PHOTOMETER SYSTEM
+ 0375 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIRS
+ VISIBLE INFRA-RED SCANNER
+ 0376 03 CNES MULTIPLE DIRECTION/POLARISATION RADIOMETERS POLD
+ ER II POLARIZATION AND DIRECTIONALITY OF THE EARTH'S R
+ EFLECTANCE - II
+ 0377 02 NASA EARTH RADIATION BUDGET RADIOMETER TIM TOTA
+ L IRRADIANCE MONITOR
+ 0379 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) WFC
+ WIDE FIELD CAMERA
+ 0382 02 NASA SPECTRO-RADIOMETER CLAES CRYOGENIC LIMB ARRAY
+ ETALON SPECTROMETER
+ 0383 02 NASA SPECTRO-RADIOMETER HALOE HALOGEN OCCULTATION
+ EXPERIMENT
+ 0384 02 NASA SPECTRO-RADIOMETER ISAMS IMPROVED STRATOSPHER
+ IC AND MESOSPHERIC SOUNDER
+ 0385 02 NASA SPECTRO-RADIOMETER MISR MULTI-ANGLE IMAGING
+ SPECTRORADIOMETER
+ 0386 01 NASA SPECTRO-RADIOMETER MLS MICROWAVE LIMB SOUNDER
+ 0387 02 NASA SPECTRO-RADIOMETER MLS (EOS-AURA) MICROWAVE LIMB
+ SOUNDER (EOS-AURA)
+ 0389 02 NASA SPECTRO-RADIOMETER MODIS MODERATE-RESOLUTION
+ IMAGING SPECTRORADIOMETER
+ 0393 02 NASA GRAVITY HAIRS HIGH ACCURACY INTER-SATELLITE RANGIN
+ G SYSTEM
+ 0394 02 NASA TOTAL AND PROFILE OZONE OMI OZONE MEASURING INST
+ RUMENT
+ 0395 02 NASA RADIOMETER ATMOSPHERIC CORRECTOR ATMOSPHERIC
+ CORRECTOR
+ 0396 01 NASA RADIOMETER HYPERION HYPERSPECTRAL IMAGER
+ 0399 02 NASA SPECTRO-RADIOMETER SAGE I STRATOSPHERIC AEROSO
+ L AND GAS EXPERIMENT-I
+ 0400 02 NASA SPECTRO-RADIOMETER SAGE II STRATOSPHERIC AEROSO
+ L AND GAS EXPERIMENT-II
+ 0401 02 NASA SPECTRO-RADIOMETER SAGE III STRATOSPHERI
+ C AEROSOL AND GAS EXPERIMENT-III
+ 0402 02 NASA SPECTRO-RADIOMETER SAMS STRATOSPHERIC AND ME
+ SOSPHERIC SOUNDER
+ 0403 02 NASA SPECTRO-RADIOMETER SAM II STRATOSPHERIC AEROSO
+ L MEASUREMENT II
+ 0404 02 NASA SPECTRO-RADIOMETER IRIS INFRARED INTERFEROME
+ TER SPECTROMETER
+ 0405 02 NASA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GIFT
+ S GEOSYNCHRONOUS IMAGING FOURIER TRANSFORM SPECTROMETER
+ 0420 01 NASA SPECTROMETER AIRS ATMOSPHERIC INFRA-RED SOUNDER
+ 0426 02 NASA SPECTROMETER SOLSTICE SOLAR STELLAR IRRADI
+ ANCE COMPARISON EXPERIMENT
+ 0430 02 NASA SPECTROMETER TES TROPOSHPERIC EMISSION SPECTR
+ OMETER
+ 0431 02 NASA SPECTROMETER TOMS TOTAL OZONE MAPPING SPECTROM
+ ETER
+ 0450 02 JAXA COMMUNICATIONS ADEOS COMMS COMMUNICATIONS PACKA
+ GE FOR ADEOS
+ 0451 02 JAXA COMMUNICATIONS DCS (JAXA) DATA COLLECTION SYST
+ EM (JAXA)
+ 0453 02 JAXA COMMUNICATIONS GMS COMMS COMMUNICATIONS PACKA
+ GE ON GMS
+ 0454 02 JAXA COMMUNICATIONS JERS-1 COMMS COMMUNICATIONS PACKA
+ GE FOR JERS-1
+ 0460 01 JAXA LIDAR RIS RETROREFLECTOR IN SPACE
+ 0461 01 JAXA RADAR PR PRECIPITATION RADAR
+ 0462 02 JAXA IMAGING MICROWAVE RADARS SAR SYNTETIC APE
+ RTURE RADAR
+ 0470 02 JAXA IMAGING MICROWAVE RADARS PALSAR PHASED ARRAY
+ TYPE L-BAND SYNTHETIC APERTURE RADAR
+ 0479 02 JAXA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) AMSR-E ADVANCED MICROWAVE SCANNING RADIOMETER-EOS
+ 0480 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS PRISM (ALOS) PANC
+ HROMATIC REMOTE-SENSING INSTRUMENT FOR STEREO MAPPING
+ 0481 02 JAXA RADIOMETER AMSR ADVANCED MICROWAVE SCANNING
+ RADIOMETER
+ 0482 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS AVNIR ADVANCED VIS
+ IBLE AND NEAR INFRARED RADIOMETER
+ 0483 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS AVNIR-2 ADVANCED VIS
+ IBLE AND NEAR INFRA-RED RADIOMETER TYPE 2
+ 0484 01 JAXA IMAGER GLI GLOBAL IMAGER
+ 0485 02 JAXA RADIOMETER MESSR MULTISPECTRAL ELECTRONIC SEL
+ F SCANNING RADIOMETER
+ 0486 01 JAXA RADIOMETER MSR MICROWAVE SCANNING RADIOMETER
+ 0487 02 JAXA RADIOMETER OCTS OCEAN COLOR AND TEMPERATURE S
+ CANNER
+ 0488 01 JAXA RADIOMETER OPS OPTICAL SENSOR
+ 0489 02 JAXA SPECTRO-RADIOMETER VISSR (GMS5) VISIBLE AND
+ INFRA-RED SPIN SCAN RADIOMETER (GMS5)
+ 0490 02 JAXA RADIOMETER VTIR VISIBLE AND THERMAL INFRA-RE
+ D RADIOMETER
+ 0510 02 JAXA SPECTROMETER ILAS-I IMOROVED LIMB ATOMOSPHIRIC S
+ PECTROMETER
+ 0511 02 JAXA SPECTROMETER ILAS-II IMPROVED LIMB ATOMOSPHIRIC S
+ PECTROMETER
+ 0512 02 JAXA SPECTROMETER IMG INFEROMETRIC MONITOR OF GREE
+ NHOUSE GASES
+ 0514 02 JAXA SPACE ENVIRONMENT SEM SPACE ENVIRONMENT MO
+ NITOR (JAXA)
+ 0515 02 JAXA TOTAL AND PROFILE OZONE SOFIS SOLAR OCCULTATION FO
+ URIER TRANSFORM SPECTROMETER FOR INCLINED ORBIT SATELLITE
+ 0540 02 NOAA COMMUNICATIONS DCS (NOAA) DATA COLLECTION SYST
+ EM (NOAA)
+ 0541 02 NOAA COMMUNICATIONS GOES COMMS COMMUNICATIONS PACKA
+ GE ON GOES
+ 0542 02 NOAA COMMUNICATIONS LANDSAT COMMS COMMUNICATIONS PACKA
+ GE FOR LANDSAT
+ 0543 02 NOAA COMMUNICATIONS NOAA COMMS COMMUNICATIONS PACKA
+ GE FOR NOAA
+ 0544 01 NOAA COMMUNICATIONS S&R (GOES) SEARCH AND RESCUE
+ 0545 01 NOAA COMMUNICATIONS S&R (NOAA) SEARCH AND RESCUE
+ 0546 01 NOAA COMMUNICATIONS WEFAX WEATHER FACSIMILE
+ 0547 02 NOAA SPECTROMETER SEM(GOES) SPACE ENVIRONMENT MO
+ NITOR
+ 0550 01 NOAA MAGNETIC FIELD SSM SPECIAL SENSOR MAGNETOMETER
+ 0551 02 NOAA MAGNETIC FIELD SSJ/4 SPECIAL SENSOR PRECIPITATING
+ PLASMA MONITOR
+ 0552 02 NOAA SPACE ENVIRONMENT SSIES-2 SPECIAL SENSOR IONOS
+ PHERIC PLASMA DRIFT/SCINTILLATION METER
+ 0553 02 NOAA SPACE ENVIRONMENT SSB/X-2 SPECIAL SENSOR GAMMA
+ RAY PARTICLE DECTECTOR
+ 0570 02 NOAA RADIOMETER AMSU-A ADVANCED MICROWAVE SOUNDING
+ UNIT-A
+ 0574 02 NOAA RADIOMETER AMSU-B ADVANCED MICROWAVE SOUNDING
+ UNIT-B
+ 0580 02 NOAA RADIOMETER ATOVS (HIRS/3 + AMSU + AVHRR/3) ADVA
+ NCED TIROS OPERATIONAL VERTICAL SOUNDER
+ 0590 02 NOAA RADIOMETER AVHRR/2 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/2
+ 0591 02 NOAA RADIOMETER AVHRR/3 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/3
+ 0592 02 NOAA RADIOMETER AVHRR/4 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/4
+ 0600 02 NOAA RADIOMETER ERBE EARTH'S RADIATION BUDGET EXP
+ ERIMENT
+ 0601 01 NOAA RADIOMETER ETM+ ENHANCED THEMATIC MAPPER
+ 0605 02 NOAA RADIOMETER HIRS/2 HIGH RESOLUTION INFRA-RED SO
+ UNDER/2
+ 0606 02 NOAA RADIOMETER HIRS/3 HIGH RESOLUTION INFRA-RED SO
+ UNDER/3
+ 0607 02 NOAA RADIOMETER HIRS/4 HIGH RESOLUTION INFRA-RED SO
+ UNDER/4
+ 0615 01 NOAA RADIOMETER IMAGER IMAGER
+ 0616 02 NOAA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIIR
+ S VISIBLE/INFRARED IMAGER RADIOMETER SUITE
+ 0620 02 NOAA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS CRIR
+ S/NP CROSS TRACK INFRA-RED SOUNDER/NPOESS
+ 0621 02 NOAA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS ATMS
+ ADVANCED TECHNOLOGY MICROWAVE SOUNDER
+ 0622 01 NOAA RADIOMETER MSS MULTISPECTRAL SCANNING SYSTEM
+ 0623 01 NOAA RADIOMETER MSU MICROWAVE SOUNDING UNIT
+ 0624 02 NOAA RADIOMETER SBUV/2 SOLAR BACKSCATTTER ULTRA-VIO
+ LET INSTRUMENT/2
+ 0625 02 NOAA RADIOMETER SBUV/3 SOLAR BACKSCATTTER ULTRA-VIO
+ LET INSTRUMENT/3
+ 0626 01 NOAA RADIOMETER SOUNDER SOUNDER
+ 0627 01 NOAA RADIOMETER SSU STRATOSPHERIC SOUNDING UNIT
+ 0628 01 NOAA RADIOMETER TM THEMATIC MAPPER
+ 0629 02 NOAA RADIOMETER TOVS (HIRS/2 + MSU + SSU) TIRO
+ S OPERATIONAL VERTICAL SOUNDER
+ 0630 01 NOAA RADIOMETER VAS VISSR ATMOSPHERIC SOUNDER
+ 0631 01 NOAA RADIOMETER SSZ
+ 0645 01 NOAA SPECTROMETER SEM SPACE ENVIRONMENT MONITOR
+ 0650 02 NRSCC RADIOMETER MVIRSR (10 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0651 02 NRSCC RADIOMETER MVIRSR (3 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0652 02 NRSCC RADIOMETER MVIRSR (5 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0670 01 NSAU RADAR RLSBO SIDE LOOKING MICROWAVE RADAR
+ 0680 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS MSU-EU MULTI-SPECTR
+ AL RADIOMETER WITH HIGH RESOLUTION
+ 0681 02 NSAU IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MSU-
+ UM VISIBLE MULTI-SPECTRAL RADIOMETER
+ 0682 01 NSAU RADIOMETER RM-08 IMAGING MICROWAVE RADIOMETER
+ 0683 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS SU-UMS STEREO RADIO
+ METER WITH HIGH RESOLUTION
+ 0684 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS SU-VR VISIBLE RADI
+ OMETER WITH HIGH RESOLUTION
+ 0685 01 NSAU RADIOMETER TRASSER
+ 0700 02 ROSCOSMOS COMMUNICATIONS KONDOR-2 DATA COLLECT
+ ION AND TRANSMISSION SYSTEM
+ 0701 01 ROSCOSMOS COMMUNICATIONS BRK
+ 0710 01 ROSCOSMOS LIDAR ALISSA BACKSCATTER LIDAR
+ 0712 01 ROSCOSMOS LIDAR BALKAN-2 LIDAR
+ 0715 01 ROSCOSMOS LIDAR MK-4
+ 0716 01 ROSCOSMOS LIDAR MK-4M
+ 0730 01 ROSCOSMOS RADAR GREBEN RADAR ALTIMETER
+ 0731 01 ROSCOSMOS RADAR SAR-10 SYNTETIC APERTURE RADAR
+ 0732 01 ROSCOSMOS RADAR SAR-3 SYNTETIC APERTURE RADAR
+ 0733 01 ROSCOSMOS RADAR SAR-70 SYNTETIC APERTURE RADAR
+ 0740 01 ROSCOSMOS RADAR SLR-3 SIDE LOOKING RADAR
+ 0745 01 ROSCOSMOS RADAR TRAVERS SAR
+ 0750 02 ROSCOSMOS RADIOMETER 174-K TEMPERATURE AND HUMI
+ DITY PROFILER
+ 0751 02 ROSCOSMOS RADIOMETER BTVK SCANNING TELEVISION
+ RADIOMETER
+ 0752 02 ROSCOSMOS RADIOMETER CHAIKA SCANNING IR RADIOMET
+ ER
+ 0753 02 ROSCOSMOS RADIOMETER DELTA-2 MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0755 02 ROSCOSMOS RADIOMETER IKAR-D MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0756 02 ROSCOSMOS RADIOMETER IKAR-N MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0757 02 ROSCOSMOS RADIOMETER IKAR-P MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0760 01 ROSCOSMOS RADIOMETER ISP
+ 0761 02 ROSCOSMOS RADIOMETER KFA-1000 PHOTOGRAPHIC
+ CAMERA
+ 0762 01 ROSCOSMOS RADIOMETER KFA-200 PHOTOGRAPHIC CAMERA
+ 0763 02 ROSCOSMOS RADIOMETER KFA-3000 PHOTOGRAPHIC
+ CAMERA
+ 0770 01 ROSCOSMOS RADIOMETER KLIMAT SCANNING IR RADIOMETER
+ 0771 02 ROSCOSMOS RADIOMETER KLIMAT-2 SCANNING IR
+ RADIOMETER
+ 0775 01 ROSCOSMOS RADIOMETER MIRAS
+ 0776 01 ROSCOSMOS RADIOMETER MIVZA
+ 0777 02 ROSCOSMOS RADIOMETER MIVZA-M MICROWAVE SCANNING R
+ ADIOMETER
+ 0780 01 ROSCOSMOS RADIOMETER MR-2000
+ 0781 01 ROSCOSMOS RADIOMETER MR-2000M
+ 0785 02 ROSCOSMOS RADIOMETER MR-900 SCANNING TELEPHOTOME
+ TER
+ 0786 02 ROSCOSMOS RADIOMETER MR-900B SCANNING VISUAL BAND
+ TELEPHOTOMETER
+ 0790 02 ROSCOSMOS RADIOMETER MSU-E MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0791 02 ROSCOSMOS RADIOMETER MSU-E1 MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0792 02 ROSCOSMOS RADIOMETER MSU-E2 MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0793 01 ROSCOSMOS RADIOMETER MSU-M
+ 0794 02 ROSCOSMOS RADIOMETER MSU-S MULTISPECTRAL MEDIUM
+ RESOLUTION SCANNER
+ 0795 02 ROSCOSMOS RADIOMETER MSU-SK MULTISPECTRAL MEDIUM
+ RESOLUTION CONICAL SCANNER
+ 0796 02 ROSCOSMOS RADIOMETER MSU-V MULTISPECTRAL HIGH R
+ ESOLUTION CONICAL SCANNER
+ 0810 02 ROSCOSMOS RADIOMETER MTZA SCANNING MICROWAVE R
+ ADIOMETER
+ 0815 03 ROSCOSMOS IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE
+ MICROWAVE) MZOAS SCANNING MICROWAVE RADIO
+ METER
+ 0820 03 ROSCOSMOS IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE
+ MICROWAVE) R-225 SINGLE CHANNEL MICROWAVE
+ RADIOMETER
+ 0821 01 ROSCOSMOS RADIOMETER R-400
+ 0822 02 ROSCOSMOS RADIOMETER R-600 SINGLE CHANNEL MICRO
+ WAVE RADIOMETER
+ 0830 02 ROSCOSMOS RADIOMETER RMS RADIATION MEASUREMEN
+ T SYSTEM
+ 0835 01 ROSCOSMOS RADIOMETER TV CAMERA
+ 0836 01 ROSCOSMOS RADIOMETER SILVA
+ 0840 02 ROSCOSMOS SPECTRO-RADIOMETER SROSMO SPECTRORADIO
+ METER FOR OCEAN MONITORING
+ 0850 02 ROSCOSMOS SPECTROMETER BUFS-2 BACKSCATTER SPECTROM
+ ETER/2
+ 0851 02 ROSCOSMOS SPECTROMETER BUFS-4 BACKSCATTER SPECTROM
+ ETER/4
+ 0855 02 ROSCOSMOS SPECTROMETER ISTOK-1 INFRA-RED SPECTROMET
+ ER
+ 0856 02 ROSCOSMOS SPECTROMETER SFM-2 SPECTROMETER TO MEAS
+ URE DIRECT SOLAR RADIATION
+ 0857 01 ROSCOSMOS SPECTROMETER DOPI
+ 0858 01 ROSCOSMOS SPECTROMETER KGI-4
+ 0859 01 ROSCOSMOS SPECTROMETER OZON-M
+ 0860 01 ROSCOSMOS SPECTROMETER RMK-2
+ 0900 02 NOAA RADIOMETER MAXIE MAGNETOSPHERIC ATMOSPHERIC X
+ -RAY IMAGING EXPERIMENT
+ 0901 01 NOAA RADIOMETER OLS OPERATIONAL LINESCAN SYSTEM
+ 0905 02 NOAA RADIOMETER SSM/I MISSION SENSOR MICROWAVE IMA
+ GER
+ 0906 02 NOAA RADIOMETER SSM/T-1 MISSION SENSOR MICROWAVE TEM
+ PERATURE SOUNDER
+ 0907 02 NOAA RADIOMETER SSM/T-2 MISSION SENSOR MICROWAVE WAT
+ ER VAPOR SOUNDER
+ 0908 02 NOAA RADIOMETER SSMIS SPECIAL SENSOR MICROWAVE IMA
+ GER SOUNDER
+ 0910 01 NOAA RADIOMETER SXI SOLAR X-RAY IMAGER
+ 0930 02 NOAA SPECTROMETER EHIC ENERGETIC HEAVY ION COMPOSIT
+ ION EXPERIMENT
+ 0931 01 NOAA SPECTROMETER X-RAY ASTRONOMY PAYLOAD
+ 0932 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) IVIS
+ SR (FY-2) IMPROVED MULTISPECTRAL VISIBLE AND INFRA-RED SCA
+ N RADIOMETER (5 CHANNELS)
+ 0933 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS IRAS
+ INFRARED ATMOSPHERIC SOUNDER
+ 0934 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS MWAS
+ MICROWAVE ATMOSPHERIC SOUNDER
+ 0935 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS IMWA
+ S IMPROVED MICROWAVE ATMOSPHERIC SOUNDER
+ 0936 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS MWHS
+ MICROWAVE HUMIDITY SOUNDER
+ 0937 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MVIR
+ S MODERATE RESOLUTION VISIBLE AND INFRARED IMAGING SPECTRO
+ RADIOMETER
+ 0938 02 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) MWRI MICROWAVE RADIATION IMAGER
+ 0940 02 ROSCOSMOS ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDER
+ S MTVZA-OK SCANNING MICROWAVE RADIOMETER
+ 0941 02 CNES ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS SAPH
+ IR
+ 0944 01 NOAA RADAR ALTIMETERS ALT ALTIMETER
+ 0945 02 NOAA EARTH RADIATION BUDGET RADIOMETER TSIS TOTA
+ L SOLAR IRRADIANCE SENSOR
+ 0946 02 NOAA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) CMIS CONICAL-SCANNING MICROWAVE IMAGER/SOUNDER
+ 0947 02 NOAA TOTAL AND PROFILE OZONE OMPS OZONE MAPPING AND PR
+ OFILER SUITE
+ 0948 03 NOAA SPACE ENVIRONMENT ATMOSPHERIC TEMPERATURE AND HUMIDI
+ TY SOUNDERS GPSOS GLOBAL POSITIONING SYSTEM OCCULTATION SE
+ NSOR
+ 0949 02 NOAA MAGNETIC FIELD, AUROAL IMAGERY SCINTILLATION BOUNDAR
+ Y SESS SPACE ENVIRONMENTAL SENSOR SUITE
+ 0950 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIRR
+ MULTISPECTRAL VISIBLE AND INFRA-RED SCAN RADIOMETER (10
+ CHANNELS
+ 0951 01 NRSCC TOTAL AND PROFILE OZONE TOM TOTAL OZONE MAPPER
+ 0952 01 NRSCC TOTAL AND PROFILE OZONE OP OZONE PROFILER
+ 2047 01 MISSING VALUE
+002020 0024 0000 01 NIMBUS
+ 0001 01 VTPR
+ 0002 01 TIROS 1 (TIROS, NOAA-6 TO NOAA-13)
+ 0003 01 TIROS 2 (NOAA-14 ONWARDS)
+ 0010 01 EOS
+ 0031 01 DMSP
+ 0061 01 EUMETSAT POLAR SYSTEM (EPS)
+ 0091 01 ERS
+ 0121 01 ADEOS
+ 0241 01 GOES
+ 0261 01 JASON
+ 0271 01 GMS
+ 0272 01 MTSAT
+ 0301 01 INSAT
+ 0331 01 METEOSAT OPERATIONAL PROGRAMME (MOP)
+ 0332 01 METEOSAT TRANSITIONAL PROGRAMME (MTP)
+ 0333 01 METEOSAT SECOND GENERATION PROGRAMME (MSG)
+ 0351 01 GOMS
+ 0380 01 FY-1
+ 0381 01 FY-2
+ 0401 01 GPS
+ 0402 01 GLONASS
+ 0403 01 GALILEO
+ 0511 01 MISSING VALUE
+002021 0008 0001 01 HIGH RESOLUTION INFRA RED SOUNDER (HIRS)
+ 0002 01 MICROWAVE SOUNDING UNIT (MSU )
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+002022 0005 0001 01 PROCESSING TECHNIQUE NOT DEFINED
+ 0002 01 AUTOMATED STATISTICAL REGRESSION
+ 0003 01 CLEAR PATH
+ 0004 01 PARTLY CLOUDY PATH
+ 0005 01 CLOUDY PATH
+002023 0012 0000 02 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE WATER VAPOUR
+ CHANNEL
+ 0001 02 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE INFRARED CHAN
+ NEL
+ 0002 02 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE VISIBLE CHANN
+ EL
+ 0003 02 WIND DERIVED FROM CLOUD MOTION OBSERVED IN WATER VAPOUR CHAN
+ NEL (CLOUD OR CLEAR AIR NOT SPECIFIED)
+ 0004 02 WIND DERIVED FROM MOTION OBSERVED IN COMBINATION OF SPECTRA
+ L CHANNELS
+ 0005 02 WIND DERIVED FROM MOTION OBSERVED IN THE WATER VAPOUR CHANN
+ EL IN CLEAR AIR
+ 0006 01 WIND DERIVED FROM MOTION OBSERVED IN THE OZONE CHANNEL
+ 0007 02 WIND DERIVED FROM MOTION OBSERVED IN WATER VAPOUR CHANNEL
+ (CLOUD OR CLEAR AIR NOT SPECIFIED)
+ 0008 01 WIND DERIVED FROM ALTIMETER
+ 0009 01 WIND DERIVED FROM RADIOMETER
+ 0013 01 ROOT MEAN SQUARE
+ 0015 01 MISSING VALUE
+002024 0003 0001 01 TABLE WITH FULL RANGE OF HUMIDITY VARIATION IN LAYER
+ 0002 01 REGRESSION TECHNIQUE ON 2 HUMIDITY VALUES IN LAYER
+ 0015 01 MISSING VALUE
+002025 0016 0001 01 RESERVED
+ 0002 01 HIRS
+ 0003 01 MSU
+ 0006 01 HIRS
+ 0007 01 MSU
+ 0010 01 HIRS(1, 2, 3, 8,9, 16, 17)
+ 0011 01 HIRS(1, 2, 3, 9, 17)
+ 0012 01 MSU
+ 0015 01 HIRS
+ 0016 01 HIRS
+ 0017 01 MSU
+ 0018 01 SKINTK(OCEAN ONLY)
+ 0021 01 HIRS
+ 0022 01 SSU
+ 0023 01 MSU (3 ,4)
+ 0025 01 MISSING
+002030 0007 0001 01 ADCP (ACOUSTIC DOPPLER CURRENT PROFILER)
+ 0002 01 GEK (GEOMAGNETIC ELECTRO KINETOGRAPH)
+ 0003 01 SHIPS'S SET AND DRIFT DETERMINED BY FIXES 3-6 HOURS APART
+ 0004 02 SHIPS'S SET AND DRIFT DETERMINED BY MORE THAN 6 HOURS BUT LE
+ SS THAN 12 HOURS APART
+ 0005 01 DRIFT OF BUOY
+ 0006 01 ADCP (ACOUSTIC DOPPLER CURRENT PROFILER)
+ 0007 01 MISSIN VALUE
+002031 0021 0000 01 RESERVED
+ 0001 01 INSTANTANEOUS
+ 0002 01 AVERAGED OVER 3 MINUTES OR LESS
+ 0003 01 AVERAGED OVER MORE THAN 3 MINUTES, BUT 6 AT THE MOST
+ 0004 01 AVERAGED OVER MORE THAN 6 MINUTES, BUT 12 AT THE MOST
+ 0005 01 INSTANTANEOUS
+ 0006 01 AVERAGED OVER 3 MINUTES OR LESS
+ 0007 01 AVERAGED OVER MORE THAN 3 MINUTES, BUT 6 AT THE MOST
+ 0008 01 AVERAGED OVER MORE THAN 6 MINUTES, BUT 12 AT THE MOST
+ 0009 01 VECTOR OR DOPPLER CURRENT PROFILLING METHOD NOT USED
+ 0010 01 RESERVED
+ 0011 01 1 HOUR OR LESS
+ 0012 01 MORE THAN 1 HOUR BUT 2 AT THE MOST
+ 0013 01 MORE THAN 2 HOUR BUT 4 AT THE MOST
+ 0014 01 MORE THAN 4 HOUR BUT 8 AT THE MOST
+ 0015 01 MORE THAN 8 HOUR BUT 12 AT THE MOST
+ 0016 01 MORE THAN 12 HOUR BUT 18 AT THE MOST
+ 0017 01 MORE THAN 18 HOUR BUT 24 AT THE MOST
+ 0018 01 RESERVED
+ 0019 01 DRIFT METHOD NOT USED
+ 0031 01 MISSING
+002032 0004 0000 02 VALUES AT SELECTED DEPTHS (DATA POINTS FIXED BY THE INSTRUME
+ NT OR SELECTED BY ANY OTHER METHOD)
+ 0001 02 VALUES AT SIGNIFICANT DEPTHS (DATA POINTS TAKEN FROM TRACES
+ AT SIGNIFICANT DEPTHS)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002033 0005 0000 01 NO SALINITY MEASURED
+ 0001 01 IN SITU SENSOR, ACCURACY BETTER THAN 0.02 %
+ 0002 01 IN SITU SENSOR, ACCURACY LESS THAN 0.02 %
+ 0003 01 SAMPLE ANALYSIS
+ 0007 01 MISSING VALUE
+002034 0007 0000 01 UNSPECIFIED DROGUE
+ 0001 01 HOLEY SOCK
+ 0002 01 TRISTAR
+ 0003 01 WINDOW SHADE
+ 0004 01 PARACHUTE
+ 0005 01 NON-LAGRANGIAN SEA ANCHOR
+ 0031 01 MISSING VALUE
+002036 0004 0000 01 DRIFTING BUOY
+ 0001 01 FIXED BUOY
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002037 0007 0000 01 REASERVED
+ 0001 01 MANUAL READING FROM VERTICAL TIDE STAFF
+ 0002 01 MANUAL READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ 0003 01 MANUAL READING FROM MULTIPLE AUTOMATIC RECORDERS AT STATION
+ 0004 02 AUTOMATIC READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ WITHOUT LEVEL REFERENCE CHECK
+ 0005 02 AUTOMATIC READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ WITH LEVEL REFERENCE CHECK,OR MULTIPLE AUTOMATIC RECORDERS
+ 0007 01 MISSING
+002038 0012 0000 01 SHIP INTAKE
+ 0001 01 BUCKET
+ 0002 01 HULL CONTACT SENSOR
+ 0003 01 REVERSING TERMOMETER
+ 0004 01 STD/CTD SENSOR
+ 0005 01 MECHANICAL BT
+ 0006 01 EXPANDABLE BT
+ 0007 01 DIGITAL BT
+ 0008 01 THERMISTOR CHAIN
+ 0009 01 INFRARED SCANNER
+ 0010 01 MICROWAVE SCANNER
+ 0015 01 MISSING VALUE
+002039 0005 0000 01 MEASURED WET-BULB TEMPERATURE
+ 0001 01 ICED BULB MEASURED WET-BULB TEMPERATURE
+ 0002 01 COMPUTED WET-BULB TEMPERATURE
+ 0003 01 ICED BULB COMPUTED WET-BULB TEMPERATURE
+ 0007 01 MISSING VALUE
+002041 0005 0000 01 INFORMATION BASED ON MANUAL ANALYSIS
+ 0001 01 INFORMATION BASED ON COMPUTER ANALYSIS
+ 0002 01 INFORMATION BASED ON DATA ASSIMILATION
+ 0003 02 INFORMATION BASED ON COMPUTER ANALYSIS OR DATA ASSIMSILATIO
+ N MANUALLY MODIFIED
+ 0063 01 MISSING VALUE
+002040 0008 0000 01 SHIPS MOTION REMOVED BY AVARAGING
+ 0001 01 SHIPS MOTION REMOVED BY MOTION COMPENSATION
+ 0002 01 SHIPS MOTION NOT REMOVED
+ 0003 01 SHIPS MOTION REMOVED BY AVERAGING
+ 0004 01 SHIPS MOTION REMOVED BY MOTION COMPENSATION
+ 0005 01 SHIPS MOTION NOT REMOVED
+ 0006 01 DOPPLER CURRENT PROFILING METHOD NOT USED
+ 0015 01 MISSING VALUE
+002041 0006 0000 01 INFORMATION BASED ON MANUAL ANALYSIS
+ 0001 01 INFORMATION BASED ON COMPUTER ANALYSIS
+ 0002 01 INFORMATION BASED ON DATA ASSIMILATION
+ 0003 02 INFORMATION BASED ON COMPUTER ANALYSIS OR
+ DATA ASSIMILATION MANUALLY MODIFIED
+ 0010 01 INFORMATION BASED ON THE NUMERICAL WEATHER PREDICTION
+ 0063 01 MISSING VALUE
+002044 0006 0000 01 RESERVED
+ 0001 01 LONGUET-HIGGINS (1964)
+ 0002 01 LONGUET-HIGGINS (F3 METHOS)
+ 0003 01 MAXIMUM LIKELIHOOD METHOD
+ 0004 01 MAXIMUM ENTROPY METHOD
+ 0015 01 MISSING VALUE
+002045 0005 0000 01 SEA STATION
+ 0001 01 AUTOMATIC DATA BUOY
+ 0002 01 AIRCRAFT
+ 0003 01 SATELLITE
+ 0015 01 MISSING VALUE
+002046 0004 0000 01 RESERVED
+ 0001 01 HEAVE SENSOR
+ 0002 01 SLOPE SENSOR
+ 0015 01 MISSING VALUE
+002048 0012 0000 01 HIRS
+ 0001 01 MSU
+ 0002 01 SSU
+ 0003 01 AMSU-A
+ 0004 01 AMSU-B
+ 0005 01 AVHRR
+ 0006 01 SSMI
+ 0007 01 NSCAT
+ 0008 01 SEA WINDS
+ 0009 01 POSEIDON ALTIMETER
+ 0010 01 JMR (JASON MICROWAVE RADIOMETER)
+ 0015 01 MISSING VALUE
+002049 0004 0001 01 PROCESSING TECHNIQUE NOT DEFINED
+ 0002 01 SIMULTANIOUS PHISICAL RETRIEVAL
+ 0003 01 CLEAR SOUNDING
+ 0004 01 CLOUDY COUNDING
+002050 0019 0001 01 CHANNEL 1 14.71 MICROMETERS
+ 0002 01 CHANNEL 2 14.37 MICROMETERS
+ 0003 01 CHANNEL 3 14.06 MICROMETERS
+ 0004 01 CHANNEL 4 13.64 MICROMETERS
+ 0005 01 CHANNEL 5 13.37 MICROMETERS
+ 0006 01 CHANNEL 6 12.66 MICROMETERS
+ 0007 01 CHANNEL 7 12.02 MICROMETERS
+ 0008 01 CHANNEL 8 11.03 MICROMETERS
+ 0009 01 CHANNEL 9 9.71 MICROMETERS
+ 0010 01 CHANNEL 10 7.43 MICROMETERS
+ 0011 01 CHANNEL 11 7.02 MICROMETERS
+ 0012 01 CHANNEL 12 6.51 MICROMETERS
+ 0013 01 CHANNEL 13 4.57 MICROMETERS
+ 0014 01 CHANNEL 14 4.52 MICROMETERS
+ 0015 01 CHANNEL 15 4.45 MICROMETERS
+ 0016 01 CHANNEL 16 4.13 MICROMETERS
+ 0017 01 CHANNEL 17 3.98 MICROMETERS
+ 0018 01 CHANNEL 18 3.74 MICROMETERS
+ 0019 01 CHANNEL 19 0.969 MICROMETERS
+002051 0004 0001 01 MAXIMUM/MINIMUM THERMOMETERS
+ 0002 01 AUTOMATED INSTRUMENT
+ 0003 01 THERMOGRAPH
+ 0015 01 MISSING VALUE
+002052 0005 0001 01 CHANNEL 1 0.55-.75 MICROMETERS
+ 0002 01 CHANNEL 2 3.9 MICROMETERS
+ 0003 01 CHANNEL 3 6.7 MICROMETERS
+ 0004 01 CHANNEL 4 10.7 MICROMETERS
+ 0005 01 CHANNEL 5 12.0 MICROMETERS
+002053 0005 0000 01 OBSERVED BRIGHTNESS TEMPERATURES
+ 0001 01 BRIGHTNESS TEMPERATURE WITH BIAS CORRECTION APPLIED
+ 0002 01 BRIGHTNESS TEMPERATURE CALCULATED FROM FIRST GUESS
+ 0003 01 BRIGHTNESS TEMPERATURE CALCULATED FROM SOUNDING
+ 0015 01 MISSING VALUE
+002054 0006 0000 02 PARAMETER DERIVED USING OBSERVED SOUNDER BRIGHTNESS TEMPERAT
+ URES
+ 0001 02 PARAMETER DERIVED USING OBSERVED IMAGER BRIGHTNESS TEMPERATU
+ RES
+ 0002 01 PARAMETER DERIVED USING FIRST GUESS INFORMATION
+ 0003 01 PARAMETER DERIVED USING NMC ANALYSIS INFORMATION
+ 0004 01 PARAMETER DERIVED USING RADIOSONDE INFORMATION
+ 0015 01 MISSING VALUE
+002055 0009 0000 01 STATISTICS GENERATED COMPARING RETRIEVAL VERSUS RADIOSONDE
+ 0001 01 STATISTICS GENERATED COMPARING RETRIEVAL VERSUS FIRST GUESS
+ 0002 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS FIRST GUESS
+ 0003 01 STATISTICS GENERATED COMPARING OBSERVED VERSUS RETRIEVAL
+ 0004 01 STATISTICS GENERATED COMPARING OBSERVED VERSUS FORST GUESS
+ 0005 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS IMAGER
+ 0006 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS SOUNDER
+ 0007 01 STATISTICS GENERATED FOR RADIOSONDE
+ 0008 01 STATISTICS GENERATED FOR FIRST GUESS
+002056 0006 0000 01 SUMS OF DIFFERENCE
+ 0001 01 SUMS OF SQUARED DIFFERENCES
+ 0002 01 SAMPLE SIZE
+ 0003 01 MINIMUM DIFFERENCE
+ 0004 01 MAXIMUM DIFFERENCE
+ 0015 01 MISSING VALUE
+002057 0006 0000 01 NESTED GRID MODEL (NMG)
+ 0001 01 AVIATION MODEL(AVN)
+ 0002 01 MEDIUM RANGE FORECAST (MRF) MODEL
+ 0003 01 GLOBAL DATA ASSIMILATION SYSTEM (GDAS) FORECAST MODEL
+ 0004 01 PRIOR SOUNDINGS (WITHIN 3 HOURS OF CURRENT TIME)
+ 0005 01 CLIMATOLOGY
+002058 0005 0000 01 12 HOUR AND 18 HOUR
+ 0001 01 18 HOUR AND 24 HOUR
+ 0002 01 6 HOUR AND 12 HOUR
+ 0003 01 GREATER THAN 24 HOUR
+ 0015 01 MISSING VALUE
+002059 0005 0000 01 NCEP NESTED GRID MODEL ANALYSIS
+ 0001 01 NCEP AVIATION MODEL ANALYSIS
+ 0002 01 NCEP MEDIUM RANGE FORECAST MODEL ANALYSIS
+ 0003 01 NCEP GLOBAL DATA ASSIMILATION SYSTEM FORECAST MODEL ANALYSIS
+ 0015 01 MISSING VALUE
+002060 0007 0000 01 CURRENT SURFACE HOURLY REPORTS
+ 0001 01 CURRENT SHIP REPORTS
+ 0002 01 CURRENT BUOY REPORTS
+ 0003 01 ONE HOUR OLD SURFACE HOURLY REPORTS
+ 0004 01 ONE HOUR SHIP OLD REPORTS
+ 0005 01 ONE HOUR BUOY OLD REPORTS
+ 0015 01 MISSING VALUE
+002061 0003 0000 01 INERTIAL NAVIGATOR SYSTEM
+ 0001 01 OMEGA
+ 0007 01 MISSING VALUE
+002062 0007 0000 01 ASDAR
+ 0001 01 ASDAR(ACARS ALSO AVAILABLE BUT NOT OPERATIVE)
+ 0002 01 ASDAR(ACARS ALSO AVAILABLE AND OPERATIVE)
+ 0003 01 ACARS
+ 0004 01 ACARS(ASDAR ALSO AVALILABLE BUT NOT OPERATIVE)
+ 0005 01 ACARS(ASDAR ALSO AVAILABLE AND OPERATIVE)
+ 0015 01 MISSING VALUE
+002064 0004 0000 01 GOOD
+ 0001 01 BAD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002066 0004 0000 01 TRS 2000
+ 0001 01 IMS 1500C
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+002070 0013 0000 01 ACTUAL LOCATION IN SECONDS
+ 0001 01 ACTUAL LOCATION IN MINUTES
+ 0002 01 ACTUAL LOCATION IN DEGREES
+ 0003 01 ACTUAL LOCATION IN DECIDEGREES
+ 0004 01 ACTUAL LOCATION OM CENTIDEGREES
+ 0005 01 REFERENCED TO CHECKPOINT IN SECONDS
+ 0006 01 REFERENCED TO CHECKPOINT IN MINUTES
+ 0007 01 REFERENCED TO CHECKPOINT IN DEGREES
+ 0008 01 REFERENCED TO CHECKPOINT IN DECIDEGREES
+ 0009 01 REFERENCED TO CHECKPOINT IN CENTIDEGREES
+ 0010 01 ACTUAL LOCATION IN TENTHS OF A MINUTE
+ 0011 01 REFERENCED TO CHECKPOINT IN TENTHS OF A MINUTE
+ 0015 01 MISSING VALUE
+002080 0005 0000 01 KAYSAM
+ 0001 01 TOTEX
+ 0002 01 KKS
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+002081 0009 0000 01 GP26
+ 0001 01 GP28
+ 0002 01 GP30
+ 0003 01 HM26
+ 0004 01 HM28
+ 0005 01 HM30
+ 0006 01 SV16
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002083 0006 0000 01 HIGH BAY
+ 0001 01 LOW BAY
+ 0002 01 BALLOON INFLATION LAUNCH SYSTEM (BILS)
+ 0003 01 ROOF-TOP BILS
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002084 0005 0000 01 HYDROGEN
+ 0001 01 HELIUM
+ 0002 01 NATURAL GAS
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002095 0005 0000 01 CAPACITANCE ANEROID
+ 0001 01 DERIVED FROM GPS
+ 0002 01 RESISTIVE STRAIN GAUGE
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002096 0005 0000 01 ROD THERMISTOR
+ 0001 01 BEAD THERMISTOR
+ 0002 01 CAPACITANCE BEAD
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002097 0008 0000 01 VIZ MARK II CARBON HYGRISTOR
+ 0001 01 VIZ B2 HYGRISTOR
+ 0002 01 VAISALA A-HUMICAP
+ 0003 01 VAISALA H-HUMICAP
+ 0004 01 CAPACITANCE SENSOR
+ 0005 01 VAISALA RS90
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002098 0005 0000 01 HH POLARISATION
+ 0001 01 VV POLARISATION
+ 0002 01 HV POLARISATION REAL VALUED COMPONENT
+ 0003 01 HV POLARISATION IMAGINARY VALUED COMPONENT
+ 0007 01 MISSING VALUE
+002101 0010 0000 01 CENTRE FRONT-FED PARABOLOID
+ 0001 01 OFFSET FRONT-FED PARABOLOID
+ 0002 01 CENTRE CASSEGRAIN PARABOLOID
+ 0003 01 OFFSET CASSEGRAIN PARABOLOID
+ 0004 01 PLANAR ARRAY
+ 0005 01 COAXIAL-COLLINEAR ARRAY
+ 0006 01 YAGI ELEMENTS ARRAY
+ 0007 01 MICROSTRIP
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002103 0002 0001 01 RADAR ANTENNA IS PROTECTED BY A RADOME
+ 0002 01 MISSING VALUE
+002104 0007 0000 01 HORIZONTAL POLARISATION
+ 0001 01 VERTICAL POLARISATION
+ 0002 01 RIGHT CIRCULAR POLARISATION
+ 0003 01 LEFT CIRCULAR POLARSZATION
+ 0004 01 HORIZONTAL AND VERTICAL POLARISATION
+ 0005 01 RIGHT AND LEFT CIRCULAR POLARISATION
+ 0015 01 MISSING VALUE
+002115 0007 0000 01 PDB
+ 0001 01 RSOIS
+ 0002 01 ASOS
+ 0003 01 PSYCHROMETER
+ 0004 01 F420
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002119 0008 0000 01 INTERMEDIATE FREQUENCY CALIBRATION MODE (IFCAL)
+ 0001 01 BUILT-IN TEST EQUIPMENT DIGITAL (BITE DGT)
+ 0002 01 BUILT-IN TEST EQUIPMENT RADIO FREQUENCY (BITE RF)
+ 0003 01 PRESET TRACKING (PSET TRK)
+ 0004 01 PRESET LOOP OUT
+ 0005 01 ACQUISITION
+ 0006 01 TRACKING
+ 0007 01 MISSING VALUE
+002131 0001 0001 01 STC OPERATIONAL
+002143 0021 0000 01 RESERVED
+ 0001 01 BREWER SPECTROPHOTOMETER
+ 0002 01 CAVER TEICHERT
+ 0003 01 DOBSON
+ 0004 01 DOBSON (JAPAN)
+ 0005 01 EHMET
+ 0006 01 FECKER TELESCOPE
+ 0007 01 HOELPER
+ 0008 01 JODMETER
+ 0009 01 FILTER OZONOMETER M-83
+ 0010 01 MAST
+ 0011 01 OXFORD
+ 0012 01 PAETZOLD
+ 0013 01 REGENER
+ 0014 01 RESERVED FOR FUTURE USE
+ 0015 01 VASSY FILTER OZONOMETER
+ 0016 01 CARBON IODIDE
+ 0017 01 SURFACE OZONE BUBLER
+ 0018 01 FILTER OZONOMETER M-124
+ 0019 01 ECC SONDE
+ 0127 01 MISSING VALUE
+002144 0008 0000 01 DIRECT SUN, ATTENUATOR #0
+ 0001 01 DIRECT SUN, ATTENUATOR #1
+ 0002 01 DIRECT SUN, ATTENUATOR #2
+ 0003 01 FOCUSSED MOON
+ 0004 01 FOCUSSED SUN
+ 0005 01 FOCUSSED SUN CORRECTED WITH ADJACENT SKY MEASUREMENTS
+ 0006 01 ZENITH SKY
+ 0015 01 MISSING VALUE
+002145 0009 0000 01 WAVELENGTH AD ORDINARY SETTING
+ 0001 01 WAVELENGTH BD ORDINARY SETTING
+ 0002 01 WAVELENGTH CD ORDINARY SETTING
+ 0003 01 WAVELENGTH CC' ORDINARY SETTING
+ 0004 01 WAVELENGTH AD FOCUSSING IMAGE
+ 0005 01 WAVELENGTH BD FOCUSSING IMAGE
+ 0006 01 WAVELENGTH CD FOCUSSING IMAGE
+ 0007 01 WAVELENGTH CC' FOCUSSING IMAGE
+ 0015 01 MISSING VALUE
+002146 0011 0000 01 ON DIRECT SUN
+ 0001 01 ON DIRECT MOON
+ 0002 01 ON BLUE ZENITH SKY
+ 0003 01 ON ZENITH CLOUD (UNIFORM STRATIFIED LAYER OF SMALL OPACITY)
+ 0004 02 ON ZENITH CLOUD (UNIFORM OR MODERATELY VARIABLE LAYER OF MED
+ IUM OPACITY)
+ 0005 02 ON ZENITH CLOUD (UNIFORM OR MODERATELY VARIABLE LAYER OF LAR
+ GE OPACITY)
+ 0006 02 ON ZENITH CLOUD (HIGHLY VARIABLE OPACITY, WITH OR WITOUT PRE
+ CIPITATION)
+ 0007 01 ON ZENITH CLOUD (FOG)
+ 0008 01 ON ZENITH HAZE
+ 0009 01 ON DIRECT SUN THROUGH THIN CLOUD, FOG OR HAZE
+ 0015 01 MISSING VALUE
+002148 0006 0000 01 RESERVED
+ 0001 01 ARGOS
+ 0002 01 GPS
+ 0003 01 GOES DCP
+ 0004 01 METEOSAT DCP
+ 0031 01 MISSING VALUE
+002149 0022 0000 01 UNSPECIFIED DRIFTING BUOY
+ 0001 01 STANDARD LAGRANGIAN DRIFTER (GLOBAL DRIFTER PROGRAMME)
+ 0002 01 STANDARD FGGE TYPE DRIFTING BUOY
+ 0003 01 WIND MEASURING FGGE TYPE DRIFTING BUOY
+ 0004 01 ICE FLOAT
+ 0008 01 UNSPECIFIED SUB-SURFACE FLOAT
+ 0009 01 SOFAR
+ 0010 01 ALACE
+ 0011 01 MARVOR
+ 0012 01 RAFOS
+ 0016 01 UNSPECIFIED MOORED BUOY
+ 0017 01 NOMAD
+ 0018 01 3-METRE DISCUS
+ 0019 01 10-12-METRE DISCUS
+ 0020 01 ODAS 30 SERIES
+ 0021 01 ATLAS (E.G. TAO AREA)
+ 0022 01 TRITON BUOY
+ 0023 01 RESERVED
+ 0024 01 OMNIDIRECTIONAL WAVERIDER
+ 0025 01 DIRECTIONAL WAVERIDER
+ 0026 01 SUB-SURFACE ARGO FLOAT
+ 0063 01 MISSING VALUE
+002150 0055 0000 01 RESERVED
+ 0001 01 HIRS 1
+ 0002 01 HIRS 2
+ 0003 01 HIRS 3
+ 0004 01 HIRS 4
+ 0005 01 HIRS 5
+ 0006 01 HIRS 6
+ 0007 01 HIRS 7
+ 0008 01 HIRS 8
+ 0009 01 HIRS 9
+ 0010 01 HIRS 10
+ 0011 01 HIRS 11
+ 0012 01 HIRS 12
+ 0013 01 HIRS 13
+ 0014 01 HIRS 14
+ 0015 01 HIRS 15
+ 0016 01 HIRS 16
+ 0017 01 HIRS 17
+ 0018 01 HIRS 18
+ 0019 01 HIRS 19
+ 0020 01 HIRS 20
+ 0021 01 MSU 1
+ 0022 01 MSU 2
+ 0023 01 MSU 3
+ 0024 01 MSU 4
+ 0025 01 SSU 1
+ 0026 01 SSU 2
+ 0027 01 SSU 3
+ 0028 01 AMSU-A 1
+ 0029 01 AMSU-A 2
+ 0030 01 AMSU-A 3
+ 0031 01 AMSU-A 4
+ 0032 01 AMSU-A 5
+ 0033 01 AMSU-A 6
+ 0034 01 AMSU-A 7
+ 0035 01 AMSU-A 8
+ 0036 01 AMSU-A 9
+ 0037 01 AMSU-A 10
+ 0038 01 AMSU-A 11
+ 0039 01 AMSU-A 12
+ 0040 01 AMSU-A 13
+ 0041 01 AMSU-A 14
+ 0042 01 AMSU-A 15
+ 0043 01 AMSU-B 1
+ 0044 01 AMSU-B 2
+ 0045 01 AMSU-B 3
+ 0046 01 AMSU-B 4
+ 0047 01 AMSU-B 5
+ 0048 01 AVHRR 1
+ 0049 01 AVHRR 2
+ 0050 01 AVHRR 3A
+ 0051 01 AVHRR 3B
+ 0052 01 AVHRR 4
+ 0053 01 AVHRR 5
+ 0063 01 MISSING VALUE
+002151 0009 0000 01 HIRS
+ 0001 01 MSU
+ 0002 01 SSU
+ 0003 01 AMSU-A1-1
+ 0004 01 AMSU-A1-2
+ 0005 01 AMSU-A2
+ 0006 01 AMSU-B
+ 0007 01 AVHRR
+ 2047 01 MISSING VALUE
+002152 0011 0001 01 HIGH-RESOLUTION INFRARED SOUNDER(HIRS)
+ 0002 01 MICROWAVE SOUNDING UNIT (MSU)
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+ 0009 01 GEOSTATIONARY IMAGER
+ 0010 01 GEOSTATIONARY SOUNDER
+ 0011 01 GEOSTATIONARY EARTH RADIATION (GERB)
+002158 0008 0001 01 MISMATCH IN RED VEC HPA
+ 0002 01 MISMATCH IN RED VEC RFSS
+ 0003 01 PTR CALIBRATION BAND 320 MHZ (KU)
+ 0004 01 PTR CALIBRATION BAND 80 MHZ (KU)
+ 0005 01 PTR CALIBRATION BAND 20 MHZ (KU)
+ 0006 01 PTR CALIBRATION BAND 160 MHZ (S)
+ 0007 01 KU FLIGHT CALIBRATION PARAMETERS AVAILABLE
+ 0008 01 S FLIGHT CALIBRATION PARAMETERS AVAILABLE
+002159 0005 0001 01 TEMPERATURE INCONSISTENCY
+ 0002 01 DATA IS MISSING
+ 0003 01 REDUNDANCY CHANNEL
+ 0004 01 POWER BUS PROTECTION
+ 0005 01 OVERVOLTAGE/OVERLOAD PROTECTION
+002163 0015 0000 01 AUTO EDITOR
+ 0001 01 IRW HEIGHT ASSIGNMENT
+ 0002 01 WV HEIGHT ASSIGNMENT
+ 0003 01 H2O INTERCEPT HEIGHT ASSIGNMENT
+ 0004 01 CO2 SLICING HEIGHT ASSIGNMENT
+ 0005 01 LOW PIXEL MAX GRADIENT
+ 0006 01 HIGHER PIXEL MAX GRADIENT
+ 0007 01 PRIMARY HEIGHT ASSIGNMENT
+ 0008 01 LAYER THICKNESS ASSIGNMENT
+ 0009 01 CUMULATIVE CONTRIBUTION FUNCTION -10 PERCENT HEIGHT
+ 0010 01 CUMULATIVE CONTRIBUTION FUNCTION -50 PERCENT HEIGHT
+ 0011 01 CUMULATIVE CONTRIBUTION FUNCTION -90 PERCENT HEIGHT
+ 0012 02 CUMULATIVE CONTRIBUTION FUNCTION - HEIGHT OF
+ MAXIMUM GRADIENT
+ 0014 01 COMPOSITE HEIGHT ASSIGNMENT
+ 0015 01 MISSING VALUE
+002164 0004 0000 01 LP - NORMS LEAST SQUARE MINIMUM
+ 0001 01 EN - EUCLIDEAN NORM WITH RADIANCE CORRELATION
+ 0002 01 CC - CROSS CORRELATION
+ 0007 01 MISSING VALUE
+002166 0006 0000 01 TYPE NOT DEFINED
+ 0001 01 AUTOMATED STATISTICAL REGRESSION
+ 0002 01 CLEAR PATH
+ 0003 01 PARTLY CLOUDY PATH
+ 0004 01 CLOUDY PATH
+ 0015 01 MISSING VALUE
+002167 0004 0000 01 METHOD NOT DEFINE
+ 0001 01 1B RAW RADIANCE
+ 0002 01 PROCESSED RADIANCE
+ 0015 01 MISSING VALUE
+002169 0004 0000 01 CUP ROTOR
+ 0001 01 PROPELLER ROTOR
+ 0002 01 WIND OBSERVATION THROUGH AMBIENT NOISE (WOTAN)
+ 0015 01 MISSING VALUE
+002172 0003 0001 01 RETRIEVAL FROM A NADIR SOUNDING
+ 0002 01 RETRIEVAL FROM A LIMB SOUNDING
+ 0255 01 MISSING VALUE
+002175 0009 0000 01 MANUAL MEASUREMENT
+ 0001 01 TIPPING BUCKET METHOD
+ 0002 01 WEIGHING METHOD
+ 0003 01 OPTICAL METHOD
+ 0004 01 PRESSURE METHOD
+ 0005 01 FLOAT METHOD
+ 0006 01 DROP COUNTER METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002176 0006 0000 01 MANUAL OBSERVATION
+ 0001 01 VIDEO CAMERA METHOD
+ 0002 01 INFRA-RED METHOD
+ 0003 01 LASER METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002177 0005 0000 01 MANUAL OBSERVATION
+ 0001 01 ULTRASONIC METHOD
+ 0002 01 VIDEO CAMERA METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002178 0005 0000 01 MANUAL OBSERVATION
+ 0001 01 OPTICAL METHOD
+ 0002 01 CAPACITIVE METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002179 0006 0000 01 MANUAL OBSERVATION
+ 0001 01 VAISALA ALGORITHM
+ 0002 01 ASOS (FAA) ALGORITHM
+ 0003 01 AWOS (CANADA) ALGORITHM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002180 0008 0000 01 MANUAL OBSERVATION
+ 0001 02 OPTICAL SCATTER SYSTEM COMBINED WITH PRECIPITATION
+ OCCURRENCE SENSING SYSTEM
+ 0002 01 FORWARD AND/OR BACK-SCATTER SYSTEM OF VISIBLE LIGHT
+ 0003 01 FORWARD AND/OR BACK-SCATTER SYSTEM OF INFRARED LIGHT
+ 0004 01 INFRARED LIGHT EMITTING DIODE (IRED) SYSTEM
+ 0005 01 DOPPLER RADAR SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002181 0005 0001 01 RAIN DETECTOR
+ 0002 01 FREEZING RAIN SENSOR
+ 0003 01 ICE DETECTION SENSOR
+ 0004 01 HAIL AND ICE PELLET SENSOR
+ 0020 01 OTHER
+002182 0007 0000 01 MANUAL MEASUREMENT
+ 0001 01 TRANSMISSOMETER SYSTEM (BASE > 25)
+ 0002 01 TRANSMISSOMETER SYSTEM (BASE < 25 M)
+ 0003 01 FORWARD SCATTER SYSTEM
+ 0004 01 BACK SCATTER SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002183 0009 0000 01 MANUAL OBSERVATION
+ 0001 01 CEILOMETER SYSTEM
+ 0002 01 INFRARED CAMERA SYSTEM
+ 0003 01 MICROWAVE VISUAL CAMERA SYSTEM
+ 0004 01 SKY IMAGER SYSTEM
+ 0005 01 VIDEO TIME LAPSED CAMERA SYSTEM
+ 0006 01 MICRO PULSE LIDAR (MPL) SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002184 0008 0000 01 MANUAL OBSERVATION
+ 0001 01 LIGHTNING IMAGING SENSOR
+ 0002 01 ELECTRICAL STORM IDENTIFICATION SENSOR
+ 0003 01 MAGNETIC FINDER SENSOR
+ 0004 01 LIGHTNING STRIKE SENSOR
+ 0005 01 FLASH COUNTER
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002185 0007 0000 01 MANUAL MEASUREMENT
+ 0001 01 BALANCED FLOATING METHOD
+ 0002 01 PRESSURE METHOD
+ 0003 01 ULTRASONIC METHOD
+ 0004 01 HYDRAULIC METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002186 0023 0001 01 PRECIPITATION-UNKNOWN TYPE
+ 0002 01 LIQUID PRECIPITATION NOT FREEZING
+ 0003 01 LIQUID FREEZING PRECIPITATION
+ 0004 01 DRIZZLE
+ 0005 01 RAIN
+ 0006 01 SOLID PRECIPITATION
+ 0007 01 SNOW
+ 0008 01 SNOW GRAINS
+ 0009 01 SNOW PELLETS
+ 0010 01 ICE PELLETS
+ 0011 01 ICE CRYSTALS
+ 0012 01 DIAMOND DUST
+ 0013 01 SMALL HAIL
+ 0014 01 HAIL
+ 0015 01 GLAZE
+ 0016 01 RIME
+ 0017 01 SOFT RIME
+ 0018 01 HARD RIME
+ 0019 01 CLEAR ICE
+ 0020 01 WET SNOW
+ 0021 01 HOAR FROST
+ 0022 01 DEW
+ 0023 01 WHITE DEW
+002187 0011 0001 01 DUST/SAND WHIRL
+ 0002 01 SQUALLS
+ 0003 01 SAND STORM
+ 0004 01 DUST STORM
+ 0005 01 LIGHTNING - CLOUD TO SURFACE
+ 0006 01 LIGHTNING - CLOUD TO CLOUD
+ 0007 01 LIGHTNING - DISTANT
+ 0008 01 THUNDERSTORM
+ 0009 01 FUNNEL CLOUD NOT TOUCHING SURFACE
+ 0010 01 FUNNEL CLOUD TOUCHING SURFACE
+ 0011 01 SPRAY
+002188 0010 0001 01 FOG
+ 0002 01 ICE FOG
+ 0003 01 STEAM FOG
+ 0007 01 MIST
+ 0008 01 HAZE
+ 0009 01 SMOKE
+ 0010 01 VOLCANIC ASH
+ 0011 01 DUST
+ 0012 01 SAND
+ 0013 01 SNOW
+002189 0004 0001 01 MANUAL OBSERVATION
+ 0002 01 ALL LIGHTNING STRIKES WITHOUT DISCRIMINATION
+ 0003 01 LIGHTNING STRIKES CLOUD TO GROUND ONLY
+ 0004 02 ALL LIGHTNING STRIKES WITH DISCRIMINATION BETWEEN
+ CLOUD TO GROUND AND CLOUD TO CLOUD
+002194 0002 0000 01 FGGE
+ 0015 01 MISSING VALUE
+002196 0017 0000 01 NIMBUS
+ 0001 01 VTPR
+ 0002 01 TIROS 1 ( TIROS NOAA 6 TO NOAA 13)
+ 0003 01 TIROS 2 ( NOAA-14 ONWARD)
+ 0031 01 DMSP
+ 0061 01 EUMETSAT POLAR SYSTEM (EPS)
+ 0091 01 ERS
+ 0121 01 ADEOS
+ 0241 01 GOES
+ 0271 01 GMS
+ 0301 01 INSAT
+ 0331 01 METEOSAT OPERATIONAL PROGRAMME(MOP)
+ 0332 01 METEOSAT TRANSITIONAL PROGRAMME(MTP)
+ 0333 01 METEOSAT SECOND GENERATION PROGRAMME(MSG)
+ 0351 01 GOMS
+ 0381 01 FY-2
+ 0512 01 MISSING VALUE
+002199 0004 0000 01 RESERVED
+ 0001 01 TABLE WITH FULL RANGE OF HUMMIDITY VALUES IN LAYER
+ 0002 01 REGRESSION TECHNIQUE ON 2 HUMMIDITY VALUES IN LAYER
+ 0015 01 MISSING VALUE
+002216 0017 0001 01 CALIBRATION/MEASUREMENT PULSE FLAG (1)
+ 0002 01 CALIBRATION/MEASUREMENT PULSE FLAG (2)
+ 0003 01 OUTER ANTENNA BEAM
+ 0004 01 SIGMA-0 CELL IS AFT OF SPACECRAFT
+ 0005 01 CURRENT MODE (1)
+ 0006 01 CURRENT MODE (2)
+ 0007 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (1)
+ 0008 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (2)
+ 0009 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (3)
+ 0010 01 LOW RESOLUTION MODE - WHOLE PULSE DATA
+ 0011 01 SCATTEROMETER ELECTRONIC SUBSYSTEM B
+ 0012 01 ALTERNATE SPIN RATE - 19.8 RPM
+ 0013 01 RECEIVER PROTECTION ON
+ 0014 01 SLICES PER COMPOSITE FLAG(1)
+ 0015 01 SLICES PER COMPOSITE FLAG(2)
+ 0016 01 SLICES PER COMPOSITE FLAG(3)
+ 0017 01 MISSING VALUE
+002231 0015 0000 01 RESERVED
+ 0001 01 IRW HEIGHT ASSIGNMENT
+ 0002 01 WV HEIGHT ASSIGNMENT
+ 0003 01 H2O INTERCEPT HEIGHT ASSIGNMENT
+ 0004 01 CO2 SLICING HEIGHT ASSIGNMENT
+ 0005 01 LOW PIXEL MAX GRADIENT
+ 0006 01 HIGHER PIXEL MAX GRADIENT
+ 0007 01 PRIMARY HEIGHT ASSIGNMENT
+ 0008 01 LAYER THICKNESS ASSIGNMENT
+ 0009 01 CUMULATIVE CONTRIBUTION FUNCTION -10 PERCENT HEIGHT
+ 0010 01 CUMULATIVE CONTRIBUTION FUNCTION -50 PERCENT HEIGHT
+ 0011 01 CUMULATIVE CONTRIBUTION FUNCTION -90 PERCENT HEIGHT
+ 0012 02 CUMULATIVE CONTRIBUTION FUNCTION - HEIGHT OF MAXIMU
+ M GRADIENT
+ 0014 01 COMPOSITE HEIGHT ASSIGNMENT
+ 0015 01 MISSING VALUE
+002232 0004 0000 01 P - NORMS LEAST SQUARE MINIMUM
+ 0001 01 EN - EUCLIDEAN NORM WITH RADIANCE CORRELATION
+ 0002 01 CC - CROSS CORRELATION
+ 0003 01 MISSING VALUE
+002251 0004 0000 01 METHOD NOT DEFINED
+ 0001 01 1B RAW RADIANCE
+ 0002 01 PROCESSED RADIANCE
+ 0015 01 MISSING VALUE
+002252 0012 0001 01 HIGH-RESOLUTION INFRARED SOUNDER(HIRS)
+ 0002 01 MICROWAVE SOUNDING UNIT (MSU)
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+ 0009 01 GEOSTATIONARY IMAGER
+ 0010 01 GEOSTATIONARY SOUNDER
+ 0011 01 GEOSTATIONARY EARTH RADIATION (GERB)
+ 0012 01 MULTI-CHANNEL SCANNING RADIOMETER
+002254 0006 0000 01 TYPE NOT DEFINED
+ 0001 01 AUTOMATED STATISTICAL REGRESSION
+ 0002 01 CLEAR PATH
+ 0003 01 PARTLY CLOUDY PATH
+ 0004 01 CLOUDY PATH
+ 0015 01 MISSING VALUE
+004059 0005 0001 01 00 UTC
+ 0002 01 06 UTC
+ 0003 01 12 UTC
+ 0004 01 18 UTC
+ 0005 01 OTHER HOURS
+008001 0007 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 MAXIMUM WIND LEVEL
+ 0005 01 SIGNIFICANT LEVEL, TEMPERATURE AND/OR RELATIVE HUMIDITY
+ 0006 01 SIGNIFICANT LEVEL, WIND
+ 0007 01 MISSING VALUE
+008002 0013 0000 02 OBSERVING RULES FOR BASE OF LOWEST CLOUD AND CLOUD TYPES OF
+ FM 12-IX EXT. SYNOP AND FM 13-IX EXT. SHIP APPLY
+ 0001 01 FIRST NON - CB SIGNIFICANT LAYER
+ 0002 01 SECOND NON - CB SIGNIFICANT LAYER
+ 0003 01 THIRD NON - CB SIGNIFICANT LAYER
+ 0004 01 CUMULONIMBUS LAYER
+ 0005 01 CEILING
+ 0006 01 CLOUD NOT DETECTED BELOW THE FOLLOWING HEIGHT(S)
+ 0007 01 LOW CLOUD
+ 0008 01 MIDDLE CLOUD
+ 0009 01 HIGH CLOUD
+ 0010 02 CLOUD LAYER WITH BASE BELOW THE STATION LEVEL AND TOP
+ ABOVE THE STATION LEVEL
+ 0011 01 CLOUD LAYER WITH BASE AND TOP BELOW THE STATION LEVEL
+ 0063 01 MISSING VALUE
+008003 0009 0000 01 SURFACE
+ 0001 01 BASE OF SATELLITE SOUNDING
+ 0002 01 CLOUD TOP
+ 0003 01 TROPOPAUSE
+ 0004 01 PRECIPITABLE WATER
+ 0005 01 SOUNDING RADIANCES
+ 0006 01 MEAN TEMPERATURES
+ 0007 01 OZON
+ 0063 01 MISSING VALUE
+008004 0006 0002 01 UNSTEADY (UNS)
+ 0003 01 LEVEL FLIGHT, ROUTINE OBSERVATION (LVR)
+ 0004 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED (LVW)
+ 0005 01 ASCENDING (ASC)
+ 0006 01 DESCENDING(DES)
+ 0007 01 MISSING VALUE
+008005 0007 0000 01 RESERVED
+ 0001 01 STORM CENTRE
+ 0002 01 OUTER LIMIT OR EDGE OF STORM
+ 0003 01 LOCATION OF MAXIMUM WIND
+ 0004 01 LOCATION OF STORM IN THE PERTURBED ANALYSIS
+ 0005 01 LOCATION OF STORM IN THE ANALYSIS
+ 0015 01 MISSING VALUE
+008006 0008 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 PROMINENT MAXIMUM LEVEL
+ 0005 01 PROMINENT MINIMUM LEVEL
+ 0006 01 MINIMUM PRESSURE LEVEL
+ 0007 01 RESERVED
+ 0008 01 LEVEL OF UNDETERMINED SIGNIFICANCE
+008007 0005 0000 01 POINT
+ 0001 01 LINE
+ 0002 01 AREA
+ 0003 01 VOLUME
+ 0015 01 MISSING VALUE
+008008 0008 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 LEVEL OF BETA RADIATION MAXIMUM
+ 0005 01 LEVEL OF GAMMA RADIATION MAXIMUM
+ 0006 01 MINIMUM PRESSURE LEVEL
+ 0007 01 RESERVED
+ 0008 01 LEVEL OF UNDETERMINED SIGNIFICANCE
+008009 0016 0000 01 LEVEL FLIGHT, ROUTINE OBSERVATION, UNSTEADY
+ 0001 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED, UNSTEADY
+ 0002 01 UNSTEADY (UNS)
+ 0003 01 LEVEL FLIGHT, ROUTINE OBSERVATION (LVR)
+ 0004 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED (LVW)
+ 0005 01 ASCENDING (ASC)
+ 0006 01 DESCENDING (DES)
+ 0007 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS
+ 0008 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS, UNSTEADY
+ 0009 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS
+ 0010 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS, UNSTEADY
+ 0011 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS
+ 0012 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS, UNSTEADY
+ 0013 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS
+ 0014 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS, UNSTEADY
+ 0015 01 MISSING VALUE
+008010 0013 0000 01 RESERVED
+ 0001 01 BARE SOIL
+ 0002 01 BARE ROCK
+ 0003 01 LAND GRASS COVER
+ 0004 01 WATER (LAKE, SEA)
+ 0005 01 FLOOD WATER UNDERNEATH
+ 0006 01 SNOW
+ 0007 01 ICE
+ 0008 01 RUNWAY OR ROAD
+ 0009 01 SHIP OR PLATFORM DECK IN STEEL
+ 0010 01 SHIP OR PLATFORM DECK IN WOOD
+ 0011 01 SHIP OR PLATFORM DECK PARTLY COVERED WITH RUBBER MAT
+ 0031 01 MISSING VALUE
+008011 0026 0000 01 QUASI-STATIONARY FRONT AT THE SURFACE
+ 0001 01 QUASI-STATIONARY FRONT ABOVE THE SURFACE
+ 0002 01 WARM FRONT AT THE SURFACE
+ 0003 01 WARM FRONT ABOVE THE SURFACE
+ 0004 01 COLD FRONT AT THE SURFACE
+ 0005 01 COLD FRONT ABOVE THE SURFACE
+ 0006 01 OCCLUSION
+ 0007 01 INSTABILITY LINE
+ 0008 01 INTERTROPICAL FRONT
+ 0009 01 CONVERGENCE LINE
+ 0010 01 JET STREAM
+ 0011 01 CLOUD CLEAR
+ 0012 01 CLOUD
+ 0013 01 TURBULENCE
+ 0014 01 STORM
+ 0015 01 AIRFRAME ICING
+ 0016 01 PHENOMENON
+ 0017 01 VOLCANO
+ 0018 01 ATMOSPHERICS
+ 0020 01 SPECIAL CLOUDS
+ 0021 01 THUNDERSTORM (VAL)
+ 0022 01 TROPICAL CYCLONE (VAL)
+ 0023 01 MOUNTAIN WAVE (VAL)
+ 0024 01 DUSTSTORM (VAL)
+ 0025 01 SANDSTORM (VAL)
+ 0063 01 MISSING VALUE
+008012 0004 0000 01 LAND
+ 0001 01 SEA
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008013 0004 0000 01 NIGHT
+ 0001 01 DAY
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008014 0010 0000 01 10-MINUTE MEAN VALUE - NORMAL VALUE
+ 0001 02 10-MINUTE MEAN VALUE - ABOVE THE UPPER LIMIT FOR ASSESSMENT
+ OF RVR (P)
+ 0002 02 10-MINUTE MEAN VALUE - BELOW LOWER LIMIT FOR ASSESSMENT OF R
+ VR (M)
+ 0003 01 ONE MINUTE MINIMUM VALUE - NORMAL VALUE
+ 0004 02 ONE MINUTE MINIMUM VALUE - ABOVE THE UPPER LIMIT FOR ASSESSM
+ ENT OF RVR (P)
+ 0005 02 ONE MINUTE MINIMUM VALUE - BELOW LOWER LIMIT FOR ASSESSMENT
+ OF RVR (M)
+ 0006 01 ONE MINUTE MAXIMUM VALUE - NORMAL VALUE
+ 0007 02 ONE MINUTE MAXIMUM VALUE - ABOVE THE UPPER LIMIT FOR ASSESS
+ MENT OF RVR (P)
+ 0008 02 ONE MINUTE MAXIMUM VALUE - BELOW LOWER LIMIT FOR ASSESSMENT
+ OF RVR (M)
+ 0015 01 MISSING VALUE
+008016 0005 0000 01 NOSIG
+ 0001 01 BECMG
+ 0002 01 TEMPO
+ 0003 01 FM
+ 0007 01 MISSING VALUE
+008017 0004 0000 01 FM
+ 0001 01 TL
+ 0002 01 AT
+ 0003 01 MISSING VALUE
+008018 0005 0001 01 LAND IS PRESENT
+ 0002 01 SURFACE ICE MAP INDICATES ICE IS PRESENT
+ 0011 01 ICE MAP DATA NOT AVAILABLE
+ 0012 01 ATTENUATION MAP DATA NOT AVAILABLE
+ 0017 01 MISSING VALUE
+008021 0032 0000 01 RESERVED
+ 0001 01 TIME SERIES
+ 0002 01 TIME AVERAGED
+ 0003 01 ACCUMULATED
+ 0004 01 FORECAST
+ 0005 01 FORECAST TIME SERIES
+ 0006 01 FORECAST TIME AVERAGED
+ 0007 01 FORECAST ACCUMULATED
+ 0008 01 ENSEMBLE MEAN
+ 0009 01 ENSEMBLE MEAN TIME SERIES
+ 0010 01 ENSEMBLE MEAN TIME AVERAGED
+ 0011 01 ENSEMBLE MEAN ACCUMULATED
+ 0012 01 ENSEMBLE MEAN FORECAST
+ 0013 01 ENSEMBLE MEAN FORECAST TIME SERIES
+ 0014 01 ENSEMBLE MEAN FORECAST AVERAGED
+ 0015 01 ENSEMBLE MEAN FORECAST ACCUMULATED
+ 0016 01 ANALYSIS
+ 0017 01 START OF PHENOMENON
+ 0018 01 RADIOSONDE LAUNCH TIME
+ 0019 01 START OF ORBIT
+ 0020 01 END OF ORBIT
+ 0021 01 TIME OF ASCENDING NODE
+ 0022 01 TIME OF OCCURENCE OF WIND SHIFT
+ 0023 01 MONITORING PERIOD
+ 0024 01 AGREED TIME LIMIT FOR REPORT RECEPTION
+ 0025 01 NOMINAL REPORTING TIME
+ 0026 01 TIME OF LAST KNOWN POSITION
+ 0027 01 FIRST GUESS --NOT WMO ENTRY
+ 0028 01 START OF SCAN --NOT WMO ENTRY
+ 0029 01 END OF SCAN --NOT WMO ENTRY
+ 0030 01 RESERVED
+ 0031 01 MISSING VALUE
+008023 0017 0002 01 MAXIMUM VALUE
+ 0003 01 MINIMUM VALUE
+ 0004 01 MEAN VALUE
+ 0005 01 MEDIAN VALUE
+ 0006 01 MODAL VALUE
+ 0007 01 MEAN ABSOLUTE ERROR
+ 0009 01 BEST ESTIMATE OF STANDARD DEVIATION (N-1)
+ 0010 01 STANDARD DEVIATION
+ 0011 01 HARMONIC MEAN
+ 0012 01 ROOT MEAN SQUARE VECTOR ERROR
+ 0013 01 ROOT-MEAN-SQUARE
+ 0032 01 PROBABILITY OF GROSS ERROR
+ 0033 01 PRESCRIBED OBSERVATION ERROR
+ 0034 01 PERSISTENCE OBSERVATION ERROR
+ 0035 01 FINAL OBSERVATION ERROR
+ 0036 01 REPRESENTATIVNESS OBSERVATION ERROR
+ 0063 01 MISSING
+008024 0015 0002 01 OBSERVED MINUS MAXIMUM
+ 0003 01 OBSERVED MINUS MINIMUM
+ 0004 01 OBSERVED MINUS MEAN
+ 0005 01 OBSERVED MINUS MEDIAN
+ 0006 01 OBSERVED MINUS MODE
+ 0011 01 OBSERVED MINUS CLIMATOLOGY (ANOMALY)
+ 0012 01 OBSERVED MINUS ANALYZED VALUE
+ 0013 01 OBSERVED MINUS INITIALISED ANALYZED VALUE
+ 0014 01 OBSERVED MINUS FORECAST VALUE
+ 0021 01 OBSERVED MINUS INTERPOLATED VALUE
+ 0022 01 OBSERVED MINUS HYDROSTATICALLY CALCULATED VALUE
+ 0032 01 OBSERVED MINUS FIRST GUESS
+ 0033 01 OBSERVED MINUS ANALYSIS
+ 0034 01 OBSERVED MINUS INITIALIZED ANALYSIS
+ 0063 01 MISSING
+008025 0005 0000 02 UNIVERSAL TIME COORDINATED (UTC) MINUS
+ LOCAL STANDARD TIME (LST)
+ 0001 01 LOCAL STANDARD TIME
+ 0002 01 UNIVERSAL TIME COORDINATED (UTC) MINUS SATELLITE CLOCK
+ 0005 01 TIME DIFFERENCE FROM EDGE OF PROCESSING SEGMENT
+ 0015 01 MISSING
+008026 0005 0000 01 AVERAGING KERNEL MATRIX
+ 0001 01 CORRELATION MATRIX
+ 0002 02 LOWER TRIANGULAR CORRELATION MATRIX SQUARE ROOT (L FROM C=LL
+ T)
+ 0003 02 INVERSE LOWER TRIANGULAR CORRELATION MATRIX SQUARE ROOT (L**
+ -1)
+ 0063 01 MISSING VALUE
+008027 0007 0000 01 ASSUME NO PARTICULAR MATRIX GEOMETRY
+ 0001 01 DIAGONAL MATRIX
+ 0002 01 TRIDIAGONAL MATRIX
+ 0003 01 MULTI-DIAGONAL MATRIX (GENERAL CASE: DIAGONAL AND ABOVE)
+ 0004 01 LOWER TRIANGULAR MATRIX
+ 0005 01 SYMETRICAL MATRIX
+ 0063 01 MISSING VALUE
+008029 0005 0000 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0001 01 ENCLOSED SEA OR LAKE
+ 0002 01 CONTINENTAL ICE
+ 0003 01 LAND
+ 0255 01 MISSING
+008033 0006 0000 01 RESERVED
+ 0001 01 PERCENTAGE CONFIDENCE CALCULATED USING CLOUD FRACTION
+ 0002 02 PERCENTAGE CONFIDENCE CALCULATED USING STANDARD
+ DEVIATION OF TEMPERATURE
+ 0003 02 PERCENTAGE CONFIDENCE CALCULATED USING PROBABILITY OF
+ THE CLOUD CONTAMINATION
+ 0004 02 PERCENTAGE CONFIDENCE CALCULATED USING NORMALITY OF DISTRIBU
+ TION
+ 0127 01 MISSING
+008035 0008 0000 01 GLOBAL
+ 0001 01 REGIONAL
+ 0002 01 NATIONAL
+ 0003 01 SPECIAL
+ 0004 01 BILATERAL
+ 0005 01 RESERVED
+ 0006 01 RESERVED
+ 0007 01 MISSING
+008036 0008 0000 01 WMO SECRETARIAT
+ 0001 01 WMO
+ 0002 01 RSMC
+ 0003 01 NMC
+ 0004 01 RTH
+ 0005 01 OBSERVING SITE
+ 0006 01 OTHER
+ 0007 01 MISSING
+008039 0008 0000 01 ISSUE TIME OF FORECAST
+ 0001 01 TIME OF COMMNENCEMENT OF PERIOD OF THE FORECAST
+ 0002 01 TIME OF ENDING OF PERIOD OF THE FORECAST
+ 0003 01 FORECSAT TIME OF MAXIMUM TEMPERATURE
+ 0004 01 FORECSAT TIME OF MINIMUM TEMPERATURE
+ 0005 01 TIME OF BEGINNING OF THE FORECAST
+ 0006 01 TIME OF ENDING OF THE FORECAST
+ 0063 01 MISSING VALUE
+008040 0043 0000 01 HIGH RESOLUTION DATA SAMPLE
+ 0001 01 WITHIN 20 HPA OF SURFACE
+ 0002 02 PRESSURE LESS THAN 10 HPA (I.E., 9, 8, 7, ETC.)
+ WHEN NO OTHER REASON APPLIES
+ 0003 01 BASE PRESSURE LEVEL FOR STABILITY INDEX
+ 0004 01 BEGIN DOUBTFUL TEMPERATURE, HEIGHT DATA
+ 0005 01 BEGIN MISSING DATA (ALL ELEMENTS)
+ 0006 01 BEGIN MISSING RH DATA
+ 0007 01 BEGIN MISSING TEMPERATURE DATA
+ 0008 02 HIGHEST LEVEL REACHED BEFORE BALLOON
+ DESCENT BECAUSE OF ICING OR TURBULENCE
+ 0009 01 END DOUBTFUL TEMPERATURE, HEIGHT DATA
+ 0010 01 END MISSING DATA (ALL ELEMENTS)
+ 0011 01 END MISSING RH DATA
+ 0012 01 END MISSING TEMPERATURE DATA
+ 0013 01 ZERO DEGREES C CROSSING(S) FOR RADAT
+ 0014 01 STANDARD PRESSURE LEVEL
+ 0015 01 OPERATOR ADDED LEVEL
+ 0016 01 OPERATOR DELETED LEVEL
+ 0017 01 BALLOON RE-ASCENDED BEYOND PREVIOUS HIGHEST ASCENT LEVEL
+ 0018 01 SIGNIFICANT RH LEVEL
+ 0019 01 RH LEVEL SELECTION TERMINATED
+ 0020 01 SURFACE LEVEL
+ 0021 01 SIGNIFICANT TEMPERATURE LEVEL
+ 0022 01 MANDATORY TEMPERATURE LEVEL
+ 0023 01 FLIGHT TERMINATION LEVEL
+ 0024 01 TROPOPAUSE(S)
+ 0025 01 AIRCRAFT REPORT
+ 0026 01 INTERPOLATED (GENERATED) LEVEL
+ 0027 01 MANDATORY WIND LEVEL
+ 0028 01 SIGNIFICANT WIND LEVEL
+ 0029 01 MAXIMUM WIND LEVEL
+ 0030 01 INCREMENTAL WIND LEVEL (FIXED REGIONAL)
+ 0031 01 INCREMENTAL HEIGHT LEVEL (GENERATED)
+ 0032 01 WIND TERMINATION LEVEL
+ 0033 01 PRESSURE 100 TO 110 HPA, WHEN NO OTHER REASON APPLIES
+ 0040 01 SIGNIFICANT THERMODYNAMIC LEVEL (INVERSION)
+ 0041 01 SIGNIFICANT RH LEVEL ( PER NCDC CRITERIA)
+ 0042 01 SIGNIFICANT TEMPERATURE LEVEL (PER NCDC)
+ 0043 01 BEGIN MISSING WIND DATA
+ 0044 01 END MISSING WIND DATA
+ 0060 01 LEVEL OF 80-KNOT ISOTACH ABOVE JET
+ 0061 01 LEVEL OF 80-KNOT ISOTACH BELOW JET
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+008041 0009 0000 01 PARENT SITE
+ 0001 01 OBSERVATION SITE
+ 0002 01 BALLOON MANUFACTURE DATE
+ 0003 01 BALLOON LAUNCH POINT
+ 0004 01 SURFACE OBSERVATION
+ 0005 01 SURFACE OBSERVATION DISPLACEMENT FROM LAUNCH POINT
+ 0006 01 FLIGHT LEVEL OBSERVATION
+ 0007 01 FLIGHT LEVEL TERMINATION POINT
+ 0031 01 MISSING VALUE
+008042 0013 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 MAXIMUM WIND LEVEL
+ 0005 01 SIGNIFICANT TEMPERATURE LEVEL
+ 0006 01 SIGNIFICANT HUMIDITY LEVEL
+ 0007 01 SIGNIFICANT WIND LEVEL
+ 0008 01 BEGINNING OF MISSING TEMPERATURE DATA
+ 0009 01 END OF MISSING TEMPERATURE DATA
+ 0010 01 BEGINNING OF MISSING HUMIDITY DATA
+ 0011 01 END OF MISSING HUMIDITY DATA
+ 0012 01 BEGINNING OF MISSING WIND DATA
+ 0013 01 END OF MISSING WIND DATA
+008043 0021 0000 01 OZONE, O3,10028-15-6
+ 0001 01 WATER VAPOUR, H2O, 7732-18-5
+ 0002 01 METHANE, CH4, 74-82-8
+ 0003 01 CARBON DIOXIDE, CO2, 37210-16-5
+ 0004 01 CARBON MONOXIDE, CO, 630-08-0
+ 0005 01 NITROGEN DIOXIDE, NO2, 10102-44-0
+ 0006 01 NITROUS OXIDE, N2O, 10024-97-2
+ 0007 01 FORMALDEHYDE, HCHO, 50-00-0
+ 0008 01 SULFUR DIOXIDE, SO2, 7446-09-5
+ 0009 01 BROMINE OXIDE, BRO, 15656-19-6
+ 0010 01 CHLORINE DIOXIDE, OCLO, 10049-04-4
+ 0011 01 NITROGEN MONOXIDE, NO, 10102-43-9
+ 0012 01 AMMONIA, NH3, 7664-41-7
+ 0025 01 PARTICULATE MATTER < 1.0 MICRONS
+ 0026 01 PARTICULATE MATTER < 2.5 MICRONS
+ 0027 01 PARTICULATE MATTER < 10 MICRONS
+ 0028 01 AEROSOLS GENERIC
+ 0029 01 SMOKE GENERIC
+ 0030 01 CRUSTAL MATERIAL (GENERIC DUST)
+ 0031 01 VOLCANIC ASH
+ 0255 01 MISSING
+008050 0011 0000 01 RESERVED
+ 0001 01 PRESSURE
+ 0002 01 TEMPERATURE
+ 0003 01 EXTREME TEMPERATURE
+ 0004 01 VAPOUR PRESSURE
+ 0005 01 PRECIPITATION
+ 0006 01 SUNSHINE DURATION
+ 0007 01 MAXIMUM TEMPERATURE
+ 0008 01 MINIMUM TEMPERATURE
+ 0009 01 WIND
+ 0015 01 MISSING VALUE
+008051 0007 0001 01 PRESSURE
+ 0002 01 TEMPERATURE
+ 0003 01 EXTREME TEMPERATURE
+ 0004 01 VAPOUR PRESSURE
+ 0005 01 PRECIPITATION
+ 0006 01 SUNSHINE DURATION
+ 0007 01 MISSING VALUE
+008052 0026 0000 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 10 M/S
+ 0001 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 20 M/S
+ 0002 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 30 M/S
+ 0003 01 MAXIMUM TEMPERATURE LESS THAN 273.2 K
+ 0004 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 298.2 K
+ 0005 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 303.2 K
+ 0006 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 308.2 K
+ 0007 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 313.2 K
+ 0008 01 MINIMUM TEMPERATURE LESS THAN 273.2 K
+ 0009 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 273.2 K
+ 0010 01 PRECIPITATION EQUAL TO OR MORE THAN 1.0 KG/M**2
+ 0011 01 PRECIPITATION EQUAL TO OR MORE THAN 5.0 KG/M**2
+ 0012 01 PRECIPITATION EQUAL TO OR MORE THAN 10.0 KG/M**2
+ 0013 01 PRECIPITATION EQUAL TO OR MORE THAN 50.0 KG/M**2
+ 0014 01 PRECIPITATION EQUAL TO OR MORE THAN 100.0 KG/M**2
+ 0015 01 PRECIPITATION EQUAL TO OR MORE THAN 150.0 KG/M**2
+ 0016 01 SNOW DEPTH MORE THAN 0.0 M
+ 0017 01 SNOW DEPTH MORE THAN 0.01 M
+ 0018 01 SNOW DEPTH MORE THAN 0.10 M
+ 0019 01 SNOW DEPTH MORE THAN 0.50 M
+ 0020 01 HORIZONTAL VISIBILITY LESS THAN 50 M
+ 0021 01 HORIZONTAL VISIBILITY LESS THAN 100 M
+ 0022 01 HORIZONTAL VISIBILITY LESS THAN 1000 M
+ 0023 01 HAIL
+ 0024 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+008053 0004 0000 01 VALUE OCCURED ON ONLY ONE DAY IN THE MONTH
+ 0001 01 VALUE OCCURED ON MORE THAN ONE DAY IN THE MONTH
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008054 0003 0000 01 WIND SPEED OR GUST IS AS REPORTED
+ 0001 02 WIND SPEED IS GREATER THAN THAT REPRTED (P IN METAR/TAF/SPEC
+ I)
+ 0007 01 MISSING VALUE
+008060 0008 0000 01 RESERVED
+ 0001 01 RANGE
+ 0002 01 AZIMUTH
+ 0003 01 HORIZONTAL
+ 0004 01 VERTICAL
+ 0005 01 NORTH/SOUTH
+ 0006 01 EAST/WEST
+ 0015 01 MISSING VALUE
+008065 0004 0000 01 NO SUN-GLINT
+ 0001 01 SUN-GLINT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008066 0004 0000 01 OPAQUE
+ 0001 01 SEMI-TRANSPARENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008070 0006 0000 01 RESERVED
+ 0001 01 RESERVED
+ 0002 02 EARTH LOCATED INSTRUMENT COUNTS,
+ CALIBRATION COEFFICIENTS AND HOUSEKEEPING (LEVEL 1B)
+ 0003 01 EARTH LOCATED CALIBRATED RADIANCES (LEVEL 1C)
+ 0004 02 MAPPED TO A COMMON FOOTPRINT, EARTH LOCATED
+ CALIBRATED RADIANCES (LEVEL 1D)
+ 0015 01 MISSING VALUE
+008072 0004 0000 01 MIXED
+ 0001 01 CLEAR
+ 0002 01 CLOUDY
+ 0007 01 MISSING VALUE
+008074 0004 0000 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0001 01 NON-OCEAN LIKE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008075 0004 0000 01 ASCENDING ORBIT
+ 0001 01 DESCENDING ORBIT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008076 0003 0000 01 KU
+ 0001 01 C
+ 0063 01 MISSING VALUE
+008077 0007 0000 01 LAND
+ 0001 01 SEA
+ 0002 01 COASTAL
+ 0003 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0004 01 ENCLOSED SEA OR LAKE
+ 0005 01 CONTINENTAL ICE
+ 0127 01 MISSING VALUE
+008079 0009 0000 01 NORMAL ISSUE
+ 0001 01 CORRECTION TO A PREVIOUSLY ISSUED PRODUCT (COR)
+ 0002 01 AMANDMENT TO A PREVIOUSLY ISSUED PRODUCT *AMD)
+ 0003 01 CORRECTION TO A PREVIOUSLY ISSUED AMENDED PRODUCT (COR AMD)
+ 0004 01 CANCELLATION OD A PREVIOUSLY ISSUED PRODUCT (CNL)
+ 0005 01 NO PRODUCT AVAILABLE (NIL)
+ 0006 01 SPECIAL REPORT ( SPECI)
+ 0007 01 CORRECTED SPECIAL REPORT (SPECI COR)
+ 0015 01 MISSING VALUE
+008080 0009 0000 01 TOTAL WATER PRESSURE PROFILE
+ 0001 01 TOTAL WATER TEMPERATURE PROFILE
+ 0002 01 TOTAL WATER SALINITY PROFILE
+ 0003 01 TOTAL WATER CONDUCTIVITY PROFILE
+ 0010 01 WATER PRESSURE AT A LEVEL
+ 0011 01 WATER TEMPERATURE AT A LEVEL
+ 0012 01 SALINITY AT A LEVEL
+ 0020 01 POSITION
+ 0063 01 MISSING VALUE
+008081 0005 0000 01 SENSOR
+ 0001 01 TRANSMITTER
+ 0002 01 RECEIVER
+ 0003 01 OBSERVING PLATFORM
+ 0063 01 MISSING VALUE
+008082 0003 0000 01 SENSOR HEIGHT IS NOT MODIFIED
+ 0001 01 SENSOR HEIGHT IS MODIFIED TO STANDARD LEVEL
+ 0007 01 MISSING VALUE
+008083 0009 0001 02 ADJUSTED WITH RESPECT TO REPRESENTATIVE HEIGHT OF SENSOR ABO
+ VE LOCAL GROUND (OR DECK OF MARINE PLATFORM)
+ 0002 02 ADJUSTED WITH RESPECT TO REPRESENTATIVE HEIGHT OF SENSOR ABO
+ VE WATER SURFACE
+ 0003 01 ADJUSTED WITH RESPECT TO STANDARD SURFACE ROUGHNESS
+ 0004 01 ADJUSTED WITH RESPECT TO WIND SPEED
+ 0005 01 ADJUSTED WITH RESPECT TO TEMPERATURE
+ 0006 01 ADJUSTED WITH RESPECT TO PRESSURE
+ 0007 01 ADJUSTED WITH RESPECT TO HUMIDITY
+ 0008 01 ADJUSTED WITH RESPECT TO EVAPORATION
+ 0009 01 ADJUSTED WITH RESPECT TO WETTING LOSSES
+008085 0008 0000 01 FORE BEAM
+ 0001 01 MID BEAM
+ 0002 01 AFT BEAM
+ 0003 01 RESERVED
+ 0004 01 RESERVED
+ 0005 01 RESERVED
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+008193 0007 0000 01 START TIME OF ORBIT
+ 0001 01 END TIME OF ORBIT
+ 0002 01 TIME OF ASCENDING NODE
+ 0003 01 ASSIMILATION TIME
+ 0004 01 START TIME OF ASSIMILATION
+ 0005 01 END TIME OF ASSIMLATION
+ 0063 01 MISSING
+008195 0032 0001 01 FIRST GUESS
+ 0002 01 ANALYSIS
+ 0003 01 INITIALISED ANALYSIS
+ 0004 01 OI ANALYSIS
+ 0005 01 3 D VARIATIONAL ANALYSIS
+ 0006 01 4 D VARIATIONAL ANALYSIS
+ 0007 01 3 D VARIATIONAL GRADIENTS
+ 0008 01 4 D VARIATIONAL GRADIENTS
+ 0009 01 FORECAST
+ 0010 01 CONTROL FORECAST
+ 0011 01 PERTURBED FORECAST
+ 0012 01 ERRORS IN FIRST GUESS
+ 0013 01 ERRORS IN ANALYSIS
+ 0014 01 CLUSTER MEANS
+ 0015 01 CLUSTER STANDARD DEVIATIONS
+ 0016 01 FORECAST PROBABILITIES
+ 0017 01 ENSEMBLE MEANS
+ 0018 01 ENSEMBLE STANDARD DEVIATIONS
+ 0019 01 FORECAST ACCUMULATIONS
+ 0020 01 CLIMATOLOGY
+ 0021 01 CLIMATE SIMULATION
+ 0030 01 OBSERVATIONS
+ 0031 01 QUALITY CONTROL
+ 0032 01 DIFFERENCE STATISTICS
+ 0040 01 IMAGE DATA
+ 0050 01 SENSITIVITY GRADIENTS
+ 0051 01 TRAJECTORY FORECAST
+ 0052 01 SENSITIVITY FORECAST
+ 0060 01 PERTURBED ANALYSIS
+ 0061 01 PERTURBATION
+ 0062 01 SINGULAR VECTOR
+ 0127 01 MISSING VALUE
+010063 0010 0000 02 INCREASING, THEN DECREASING: ATMOSPHERIC PRESURE THE SAME OR
+ HIGHER THAN 3 HOURS AGO (OR 24 HOURS AGO )
+ 0001 01 INCREASING, THEN STEADY; OR INCREASING; THEN MORE SLOWLY
+ 0002 01 INCREASING (STEADILY OR UNSTEADILY )
+ 0003 01 DECREASING OR STEADY, THEN INCREASING; RAPIDLY
+ 0004 02 STEADY; ATMOSPHERIC PRESSURE THE SAME AS 3 HOURS AGO (OR 24
+ HOURS)
+ 0005 02 DECREASING; THEN INCREASING; ATMOSPHERIC PRESSURE THE SAME O
+ R LOWER THAN 3 HOURS AGO
+ 0006 02 DECREASING, THEN STEADY; OR DECREASING, DECREASING MORE SLOW
+ LY
+ 0007 01 DECREASING (STEADILY OR UNSTEADELY )
+ 0008 02 STEADY OR INCREASING, THEN DECREASING; OR DECREASING, THEN
+ DECREASING MORE RAPIDLY
+ 0015 01 MISSING
+010064 0004 0000 01 SUBSONIC
+ 0001 01 TRANSONIC
+ 0002 01 SUPERSONIC
+ 0007 01 MISSING VALUE
+011031 0009 0000 01 NIL IN CLOUD
+ 0001 01 SLIGHT IN CLOUD
+ 0002 01 MODERATE IN CLOUD
+ 0003 01 SEVERE IN CLOUD
+ 0004 01 NIL IN CLEAR AIR
+ 0005 01 SLIGHT IN CLEAR AIR
+ 0006 01 MODERATE IN CLEAR AIR
+ 0007 01 SEVERE IN CLEAR AIR
+ 0015 01 MISSING VALUE
+011037 0030 0000 01 AVE <0.1 PEAK <0.1
+ 0001 01 AVE <0.1 0.1 <= PEAK <0.2
+ 0002 01 0.1 <= AVE <0.2 0.1 <= PEAK <0.2
+ 0003 01 AVE <0.1 0.2 <= PEAK <0.3
+ 0004 01 0.1 <= AVE <0.2 0.2 <= PEAK <0.3
+ 0005 01 0.2 <= AVE <0.3 0.2 <= PEAK <0.3
+ 0006 01 AVE <0.1 0.3 <= PEAK <0.4
+ 0007 01 0.1 <= AVE <0.2 0.3 <= PEAK <0.4
+ 0008 01 0.2 <= AVE <0.3 0.3 <= PEAK <0.4
+ 0009 01 0.3 <= AVE <0.4 0.3 <= PEAK <0.4
+ 0010 01 AVE <0.1 0.4 <= PEAK <0.5
+ 0011 01 0.1 <= AVE <0.2 0.4 <= PEAK <0.5
+ 0012 01 0.2 <= AVE <0.3 0.4 <= PEAK <0.5
+ 0013 01 0.3 <= AVE <0.4 0.4 <= PEAK <0.5
+ 0014 01 0.4 <= AVE <0.5 0.4 <= PEAK <0.5
+ 0015 01 AVE <0.1 0.5 <= PEAK <0.8
+ 0016 01 0.1 <= AVE <0.2 0.5 <= PEAK <0.8
+ 0017 01 0.2 <= AVE <0.3 0.5 <= PEAK <0.8
+ 0018 01 0.3 <= AVE <0.4 0.5 <= PEAK <0.8
+ 0019 01 0.4 <= AVE <0.5 0.5 <= PEAK <0.8
+ 0020 01 0.5 <= AVE <0.8 0.5 <= PEAK <0.8
+ 0021 01 AVE <0.1 0.8 <= PEAK
+ 0022 01 0.1 <= AVE <0.2 0.8 <= PEAK
+ 0023 01 0.2 <= AVE <0.3 0.8 <= PEAK
+ 0024 01 0.3 <= AVE <0.4 0.8 <= PEAK
+ 0025 01 0.4 <= AVE <0.5 0.8 <= PEAK
+ 0026 01 0.5 <= AVE <0.8 0.8 <= PEAK
+ 0027 01 0.8 <= AVE 0.8 <= PEAK
+ 0028 01 NIL NIL
+ 0063 01 MISSING VALUE
+011038 0017 0000 01 MIN < 1
+ 0001 01 1 <= MIN < 2
+ 0002 01 2 <= MIN < 3
+ 0003 01 3 <= MIN < 4
+ 0004 01 4 <= MIN < 5
+ 0005 01 5 <= MIN < 6
+ 0006 01 6 <= MIN < 7
+ 0007 01 7 <= MIN < 8
+ 0008 01 8 <= MIN < 9
+ 0009 01 9 <= MIN < 10
+ 0010 01 10 <= MIN < 11
+ 0011 01 11 <= MIN < 12
+ 0012 01 12 <= MIN < 13
+ 0013 01 13 <= MIN < 14
+ 0014 01 14 <= MIN < 15
+ 0015 01 NO TIMING INFORMATION AVAILABLE
+ 0031 01 MISSING VALUE
+011039 0016 0000 01 1 <= MIN < 2
+ 0001 01 2 <= MIN < 3
+ 0002 01 3 <= MIN < 4
+ 0004 01 4 <= MIN < 5
+ 0005 01 5 <= MIN < 6
+ 0006 01 6 <= MIN < 7
+ 0007 01 7 <= MIN < 8
+ 0008 01 8 <= MIN < 9
+ 0009 01 9 <= MIN < 10
+ 0010 01 10 <= MIN < 11
+ 0011 01 11 <= MIN < 12
+ 0012 01 12 <= MIN < 13
+ 0013 01 13 <= MIN < 14
+ 0014 01 14 <= MIN < 15
+ 0060 01 NO TIMING INFORMATION AVAILABLE
+ 0063 01 MISSING VALUE
+013038 0004 0000 01 NOT SUPERADIABATIC
+ 0001 01 SUPERADIABATIC
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+013039 0003 0000 01 SEA ICE
+ 0001 01 SNOW ON LAND
+ 0007 01 MISSING VALUE
+013040 0009 0000 01 LAND
+ 0001 01 RESERVED
+ 0002 01 NEAR COAST
+ 0003 01 ICE
+ 0004 01 POSSIBLE ICE
+ 0005 01 OCEAN
+ 0006 01 COAST
+ 0007 01 DESERT
+ 0015 01 MISSING VALUE
+013041 0010 0001 01 A
+ 0002 01 A-B
+ 0003 01 B
+ 0004 01 B-C
+ 0005 01 C
+ 0006 01 D
+ 0007 01 E
+ 0008 01 F
+ 0009 01 G
+ 0015 01 MISSING VALUE
+013051 0008 0000 01 SMALLER THAN ANY VALUE IN THE 30 YEARS PERIOD
+ 0001 01 IN THE FIRST QUINTILE
+ 0002 01 IN THE SECOND QUINTILE
+ 0003 01 IN THE THIRD QUINTILE
+ 0004 01 IN THE FOURTH QUINTILE
+ 0005 01 IN THE FIFTH QUINTILE
+ 0006 01 GREATER THAN ANY VALUE IN THE 30 YEAR PERIOD
+ 0015 01 MISSING VALUE
+013056 0010 0000 01 NO PRECIPITATION
+ 0001 01 LIGHT INTERMITTENT
+ 0002 01 MODERATE INTERMITTENT
+ 0003 01 HEAVY INTERMITTENT
+ 0004 01 VERY HEAVY INTERMITTENT
+ 0005 01 LIGHT CONTINUOUS
+ 0006 01 MODERATE CONTINUOUS
+ 0007 01 VERY HEAVY CONTINUOUS
+ 0009 01 VARIABLE-ALTERNATIVELY LIGHT AND HEAVY
+ 0015 01 MISSING VALUE
+013057 0011 0000 01 NO PRECIPITATION
+ 0001 01 WITHIN THE LAST HOUR
+ 0002 01 1 TO 2 HOURS AGO
+ 0003 01 2 TO 3 HOURS AGO
+ 0004 01 3 TO 4 HOURS AGO
+ 0005 01 4 TO 5 HOURS AGO
+ 0006 01 5 TO 6 HOURS AGO
+ 0007 01 6 TO 8 HOURS AGO
+ 0008 01 8 TO 10 HOURS AGO
+ 0009 01 MORE THAN 10 HOURS AHO
+ 0015 01 MISSING VALUE
+013202 0007 0000 01 LAND
+ 0001 01 VEGETATION
+ 0003 01 MULTI-YEAR ICE
+ 0004 01 POSSIBLE ICE OR FIRST YEAR ICE
+ 0005 01 OCEAN
+ 0006 01 COASTLINE
+ 0015 01 MISSING
+015025 0002 0000 01 OZONE
+ 0015 01 MISSING VALUE
+019001 0007 0000 01 DEPRESSION OR LOW (EXTRATROPICAL)
+ 0001 01 TROPICAL DEPRESSION
+ 0002 01 TROPICAL STORM
+ 0003 01 SEVERE TROPICAL STORM
+ 0004 01 TYPHOON
+ 0010 01 DUST/SANDSTORM
+ 0063 01 MISSING VALUE
+019008 0005 0000 01 RESERVED
+ 0001 01 SHALLOW (TOP OF CIRCULATION BELOW 700-HPA LEVEL
+ 0002 01 MEDIUM(TOP BETWEEN 700-HPA AND 400-HPA)
+ 0003 01 DEEP(TOP ABOVE 400-HPA LEVEL
+ 0007 01 MISSING VALUE
+019010 0004 0000 01 RESERVED
+ 0001 01 MINIMUM VALUE OF SEA LEVEL PRESSURE
+ 0002 01 MAXIMUM VALUE OF 850 HPA RELATIVE VORTICITY
+ 0015 01 MISSING VALUE
+020003 0250 0000 01 CLOUD DEVELOPMENT NOT OBSERVED OR NOT OBSERVABLE
+ 0001 01 CLOUDS GENERALLY DISSOLVING OR BECOMING LESS DEVELOPED
+ 0002 01 STATE OF SKY ON THE WHOLE UNCHANGED
+ 0003 01 CLOUDS GENERALLY FORMING OR DEVELOPING
+ 0004 02 VISIBILITY REDUCED BY SMOKE, E.G. VELDT OR FOREST FIRES, IN
+ DUSTRIAL SMOKE OR VOLCANIC ASHES
+ 0005 01 HAZE
+ 0006 02 WIDESPREAD DUST IN SUSPENSION IN THE AIR, NOT RAISED BY WIND
+ AT OR NEAR THE STATION AT THE TIME OF OBSERVATION
+ 0007 04 DUST OR SEND RAISED BY WIND AT OR NEAR THE STATION AT THE TI
+ ME OF OBSERVATION, BUT NO WELL-DEVELOPED DUST WHRIL(S) OR SA
+ ND WHRIL(S), AND NO DUSTSTORM OR SANDSTORM SEEN; OR, IN THE
+ CASE OF SHIPS, BLOWING SPRAY AT THE STATION
+ 0008 03 WELL-DEVELOPED DUST WHRIL(S) OR SAND WHRILS SEEN AT OR NEAR
+ THE STATION DURING THE PRECEDING HOUR OR AT THE SAME TIME OF
+ OBSERVATION, BUT NO DUSTSTORM OR SANDSTORM
+ 0009 02 DUSTSTORM OR SANDSTORM WITHIN SIGHT AT THE TIME OF OBSERVATI
+ ON, OR AT THE STATION DURING THE PRECEDING HOR
+ 0010 01 MIST
+ 0011 02 PACHES SHALLOW FOG OR ICE AT THE STATION, WHETHER ON LAND OR
+ SEA, NOT DEEPER THAN 2 METRES ON LAND OR 10 METRES AT SEA
+ 0012 03 MORE OR LESS CONTINUOUS SHALLOW FOG OR ICE AT THE STATION,
+ WHETHER ON LAND OR SEA, NOT DEEPER THAN 2 METRES ON LAND OR
+ 10 METRES AT SEA
+ 0013 01 LIGHTNING VISIBLE, NO THUNDER HEARD
+ 0014 02 PRECIPITATION WITHIN SIGHT, NOT REACHING THE GROUND OR THE
+ SURFACE OF THE SEA
+ 0015 03 PRECIPITATION WITHIN SIGHT, REACHING THE GROUND OR THE SURFA
+ CE OF THE SEA, BUT DISTANT, I.E. ESTIMATED TO BE MORE THAN
+ 5 KM FROM THE STATION
+ 0016 02 PRECIPITATION WITHIN SIGHT, REACHING THE GROUND OR THE SURFA
+ CE OF THE SEA, NEAR TO, BUT NOT AT THE STATION
+ 0017 02 THUNDERSTORM, BUT NO PRECIPITATION AT THE TIME OF OBSERVATIO
+ N
+ 0018 02 SQUALLS AT OR WITHIN SIGHT OF THE STATION DURING THE PRECEDI
+ NG HOUR OR AT THE TIME OF OBSERVATION
+ 0019 02 FUNNEL CLOUD(S) AT OR WITHIN SIGHT OF THE STATION DURING THE
+ PRECEDING HOUR OR AT THE TIME OF OBSERVATION
+ 0020 03 DRIZZEL (NOT FREEZING) OR SNOW GRAINS NOT FALLING AS SHOWERS
+ ; DURING THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVAT
+ IONS
+ 0021 02 RAIN (NOT FREEZING) NOT FALLING AS SHOWER(S); DURING THE PRE
+ ECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0022 02 SNOW NOT FALLING AS SHOWER(S); DURING THE PRECEDING HOUR BUT
+ NOT AT THE TIME OF OBSERVATION
+ 0023 02 RAIN AND SNOW OR ICE PELLETS NOT FALLING AS SHOWER(S); DURIN
+ G THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0024 02 FREEZING DRIZZEL OR FREEZING RAIN NOT FALLING AS SHOWER(S);
+ DURING THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0025 02 SHOWER(S) OF RAIN; DURING THE PRECEDING HOUR BUT NOT AT THE
+ TIME OF OBSERVATION
+ 0026 02 SHOWER(S) OF SNOW, OR OF RAIN AND SNOW; DURING THE PRECEDING
+ HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0027 02 SHOWER(S) OF HAIL, OR OF RAIN AND HAIL; DURING THE PRECEDING
+ HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0028 02 FOG OR ICE FOG; DURING THE PRECEDING HOUR BUT NOT AT THE TIM
+ E OF OBSERVATION
+ 0029 02 THUNDERSTORM (WITH OR WITHOUT PRECIPITATION); DURING THE PRE
+ CEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0030 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM HAS DECREASED DURI
+ NG THE PRECEDING HOURS
+ 0031 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM NO APPRECIABLE CHA
+ NGE DURING THE PRECEDING HOUR
+ 0032 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM HAS BEGUN OR HAS I
+ NCEASED DURING THE PRECEDING HOUR
+ 0033 02 SEVERE DUSTSTORM OR SANDSTORM HAS DECREASED DURING THE PREC
+ EDING HOURS
+ 0034 02 SEVERE DUSTSTORM OR SANDSTORM NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0035 02 SEVERE DUSTSTORM OR SANDSTORM HAS BEGUN OR HAS INCREASED DUR
+ ING THE PRECEDING HOUR
+ 0036 02 SLIGHT OR MODERATE DRIFTING SNOW GENERALLY LOW (BELOW EYE LE
+ VEL)
+ 0037 01 HEAVY DRIFTING SNOW GENERALY LOW (BELOW EYE LEVEL)
+ 0038 02 SLIGHT OR MODERATE BLOWING SNOW GENERALLY HIGH (ABOVE EYE LE
+ VEL)
+ 0039 01 HEAVY BLOWING SNOW GENERALY HIGH (ABOVE EYE LEVEL)
+ 0040 03 FOG OR ICE FOG AT A DISTANCE AT THE TIME OF OBSERVATION, BUT
+ NOT AT THE STATION DURING THE PRECEDING HOUR, THE FOG OR IC
+ E FOG EXTENDING TO A LEVEL ABOVE THAT OF THE OBSERVER
+ 0041 01 FOG OR ICE FOG IN PATCHES
+ 0042 02 FOG OR ICE FOG, SKY VISIBLE,HAS BECOME THINNER DURING THE PR
+ ECEDING HOUR
+ 0043 02 FOG OR ICE FOG, SKY INVISIBLE,HAS BECOME THINNER DURING THE
+ PRECEDING HOUR
+ 0044 02 FOG OR ICE FOG, SKY VISIBLE,NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0045 02 FOG OR ICE FOG, SKY INVISIBLE,NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0046 02 FOG OR ICE FOG, SKY VISIBLE,HAS BEGUN OR HAS BECOME THICKE
+ R DURING THE PRECEDING HOUR
+ 0047 02 FOG OR ICE FOG, SKY INVISIBLE,HAS BEGUN OR HAS BECOME THICKE
+ R DURING THE PRECEDING HOUR
+ 0048 01 FOG, DEPOSITING RIME, SKY VISIBLE
+ 0049 01 FOG, DEPOSITING RIME, SKY INVISIBLE
+ 0050 02 DRIZZLE, NOT FREEZING, INTERMITTENT;SLIGHT AT TIME OF OBSERV
+ ATION
+ 0051 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;SLIGHT AT TIME OF OBSERV
+ ATION
+ 0052 02 DRIZZLE, NOT FREEZING, INTERMITTENT;MODERATE AT TIME OF OBSE
+ RVATION
+ 0053 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;MODERATE AT TIME OF OBSE
+ RVATION
+ 0054 02 DRIZZLE, NOT FREEZING, INTERMITTENT;HEAVY (DENSE) AT THE TIM
+ E OF OBSERVATION
+ 0055 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;HEAVY (DENSE) AT THE TIM
+ E OF OBSERVATION
+ 0056 01 DRIZZLE, FREEZING, SLIGHT
+ 0057 01 DRIZZLE, FREEZING, MODERATE OR HEAVY (DENSE)
+ 0058 01 DRIZZLE AND RAIN, SLIGHT
+ 0059 01 DRIZZLE AND RAIN, MODERATE OR HEAVY
+ 0060 01 RAIN,NOT FREEZING,INTERMITTENT;SLIGHT AT TIME OF OBSERVATION
+ 0061 01 RAIN,NOT FREEZING,CONTINUOUS ;SLIGHT AT TIME OF OBSERVATION
+ 0062 02 RAIN,NOT FREEZING,INTERMITTENT;MODERATE AT TIME OF OBSERVATI
+ ON
+ 0063 02 RAIN,NOT FREEZING,CONTINUOUS ;MODERATE AT TIME OF OBSERVATI
+ ON
+ 0064 02 RAIN, NOT FREEZING, INTERMITTENT;HEAVY AT TIME OF OBSERVATIO
+ ON
+ 0065 01 RAIN, NOT FREEZING, CONTINUOUS;HEAVY AT TIME OF OBSERVATION
+ 0066 01 RAIN, FREEZING, SLIGHT
+ 0067 01 RAIN, FREEZING, MODERATE OR HEAVY
+ 0068 01 RAIN OR DRIZZLE AND SNOW, LIGHT
+ 0069 01 RAIN OR DRIZZLE AND SNOW, MODERATE OR HEAVY
+ 0070 02 INTERMITTENT FALL OF SNOWFLAKES, SLIGHT AT TIME OF OBSERVATI
+ ON
+ 0071 02 CONTINUOUS FALL OF SNOWFLAKES, SLIGHT AT TIME OF OBSERVATI
+ ON
+ 0072 02 INTERMITTENT FALL OF SNOWFLAKES, MODERATE AT TIME OF OBSERVA
+ TION
+ 0073 02 CONTINUOUS FALL OF SNOWFLAKES, MODERATE AT TIME OF OBSERVA
+ TION
+ 0074 02 INTERMITTENT FALL OF SNOWFLAKES, HEAVY AT TIME OF OBSERVATIO
+ ONS
+ 0075 02 CONTINUOUS FALL OF SNOWFLAKES, HEAVY AT TIME OF OBSERVATIO
+ ONS
+ 0076 01 DIAMOND DUST (WITH OR WITHOUT FOG)
+ 0077 01 SNOW GRAINS (WITH OR WITHOUT FOG)
+ 0078 01 ISOLATED STAR-LIKE SNOW CRYSTALS (WITH OR WITHOUT FOG)
+ 0079 01 ICE PELLETS
+ 0080 01 RAIN SHOWER(S), SLIGHT
+ 0081 01 RAIN SHOWER(S), MODERATE OR HEAVY
+ 0082 01 RAIN SHOWER(S), VIOLENT
+ 0083 01 SHOWER(S) OF RAIN AND SNOW MIXED, SLIGHT
+ 0084 01 SHOWER(S) OF RAIN AND SNOW MIXED, MODERATE OR HEAVY
+ 0085 01 SNOW SHOWER(S), SLIGHT
+ 0086 01 SNOW SHOWER(S), MODERATE OR HEAVY
+ 0087 02 SHOWER(S) OF SNOW PELLETS OR SMALL HAIL, WITH OR WITHOUT RAI
+ N OR RAIN AND SNOW MIXED, SLIGHT
+ 0088 02 SHOWER(S) OF SNOW PELLETS OR SMALL HAIL, WITH OR WITHOUT RAI
+ N OR RAIN AND SNOW MIXED, MODERATE OR HEAVY
+ 0089 02 SHOWER(S) OF HAIL, WITH OR WITHOUT RAIN OR RAIN AND SNOW MIX
+ ED, NOT ASSOCIATED WITH THUNDER, SLIGHT
+ 0090 02 SHOWER(S) OF HAIL, WITH OR WITHOUT RAIN OR RAIN AND SNOW MIX
+ ED, NOT ASSOCIATED WITH THUNDER, MODERATE OR HEAVY
+ 0091 02 SLIGHT RAIN AT TIME OF OBSERVATION, THUNDERSTORM DURING THE
+ PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0092 02 MODERATE OR HEAVY RAIN AT TIME OF OBSERVATION, THUNDERSTORM
+ DURING THE PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0093 03 SLIGHT SNOW, OR RAIN AND SNOW MIXED OR HAIL AT TIME OF OBSER
+ VATION, THUNDERSTORM DURING THE PRECEDING HOUR BUT NOT AT TI
+ ME OF OBSERVATION
+ 0094 03 MODERATE OR HEAVY SNOW, OR RAIN AND SNOW MIXED OR HAIL AT TI
+ ME OF OBSERVATION, THUNDERSTORM DURING PRECEDING HOUR BUT NO
+ T AT TIME OF OBSERVATION
+ 0095 03 THUNDERSTORM, SLIGHT OR MODERATE, WITHOUT HAIL, BUT WITH RAI
+ N AND/OR SNOW AT TIME OF OBSERVATION, THUNDERSTORM DURING TH
+ E PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0096 02 THUNDERSTORM, SLIGHT OR MODERATE,WITH HAIL AT TIME OF OBSERV
+ ATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0097 02 THUNDERSTORM, HEAVY, WITHOUT HAIL BUT WITH RAIN AND/OR SNOW
+ AT TIME OF OBSERVATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0098 02 THUNDERSTORM COMBINED WITH DUSTSTORM OR SANDSTORM AT TIME OF
+ OBSERVATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0099 02 THUNDERSTORM, HEAVY, WITH HAIL AT TIME OF OBSERVATION, THUND
+ ERSTORM AT TIME OF OBSERVATION
+ 0100 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0101 02 CLOUDS GENERALLY DISSOLVING OR BECOMING LESS DEVELOPED DURIN
+ G THE PAST HOUR
+ 0102 01 STATE OF SKY ON THE WHOLE UNCHANGED DURING THE PAST HOUR
+ 0103 01 CLOUDS GENERALLY FORMING OR DEVELOPING DURING THE PAST HOUR
+ 0104 02 HAZE OR SMOKE, OR DUST IN SUSPENSION IN THE AIR, VISIBILITY
+ EQUAL TO, OR GREATER THAN 1KM
+ 0105 02 HAZE OR SMOKE, OR DUST IN SUSPENSION IN THE AIR, VISIBILITY
+ LESS THAN 1KM
+ 0110 01 MIST
+ 0111 01 DIAMOND DUST
+ 0112 01 DISTANT LIGHTING
+ 0118 01 SQUALLS
+ 0120 01 FOG
+ 0121 01 PRECIPITATION
+ 0122 01 DRIZZLE (NOT FREEZING) OR SNOW GRAINS
+ 0123 01 RAIN (NOT FREEZING)
+ 0124 01 SNOW
+ 0125 01 FREEZING DRIZZLE OR FREEZING RAIN
+ 0126 01 THUNDERSTORM (WITH OR WITHOUT PRECIPITATION)
+ 0127 01 BLOWING OR DRIFTING SNOW OR SAND
+ 0128 02 BLOWING OR DRIFTING SNOW OR SAND, VISIBILITY EQUAL TO, OR GR
+ ATER THAN, 1KM
+ 0129 01 BLOWING OR DRIFTING SNOW OR SAND, VISIBILITY LESS THAN 1 KM
+ 0130 01 FOG
+ 0131 01 FOG OR ICE FOG, IN PATCHES
+ 0132 01 FOG OR ICE FOG, HAS BECOME THINNER DURING PAST HOUR
+ 0133 01 FOG OR ICE FOG, NO APPRECIABLE CHANGE DURING PAST HOUR
+ 0134 01 FOG OR ICE FOG, HAS BECUNOR BECOME THICKER DURING PAST HOUR
+ 0135 01 FOG, DEPOSITION RIME
+ 0140 01 PRECIPITATION
+ 0141 01 PRECIPITATION SLIGHT OR MODERATE
+ 0142 01 PRECIPITATION, HEAVY
+ 0143 01 LIQUID PRECIPITATION, SLIGHT OR MODERATE
+ 0144 01 LIQUID PRECIPITATION, HEAVY
+ 0145 01 SOLID PRECIPITATION, SLIGHT OR MODERATE
+ 0146 01 SOLID PRECIPITATION, HEAVY
+ 0147 01 FREEZING PRECIPITATION, SLIGHT OR MODERATE
+ 0148 01 FREEZING PRECIPITATION, HEAVY
+ 0150 01 DRIZZLE
+ 0151 01 DRIZZLE, NOT FREEZING, SLIGHT
+ 0152 01 DRIZZLE, NOT FREEZING, MODERATE
+ 0153 01 DRIZZLE, NOT FREEZING, HEAVY
+ 0154 01 DRIZZLE, FREEZING, SLIGHT
+ 0155 01 DRIZZLE, FREEZING, MODERATE
+ 0156 01 DRIZZLE, FREEZING, HEAVY
+ 0157 01 DRIZZLE AND RAIN, SLIGHT
+ 0158 01 DRIZZLE AND RAIN, MODERATE OR HEAVY
+ 0160 01 RAIN
+ 0161 01 RAIN, NOT FREEZING, SLIGHT
+ 0162 01 RAIN, NOT FREEZING, MODERATE
+ 0163 01 RAIN, NOT FREEZING, HEAVY
+ 0164 01 RAIN, FREEZING, SLIGHT
+ 0165 01 RAIN, FREEZING, MODERATE
+ 0166 01 RAIN, FREEZING, HEAVY
+ 0167 01 RAIN (OR DRIZZLE) AND SNOW, SLIGHT
+ 0168 01 RAIN (OR DRIZZLE) AND SNOW, MODERATE AND HEAVY
+ 0170 01 SNOW
+ 0171 01 SNOW, SLIGHT
+ 0172 01 SNOW, MODERATE
+ 0173 01 SNOW, HEAVY
+ 0174 01 ICE PELLETS, SLIGHT
+ 0175 01 ICE PELLETS, MODERATE
+ 0176 01 ICE PELLETS, HEAVY
+ 0180 01 SHOWER(S) OR INTERMITTENT PRECIPITATION
+ 0181 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, SLIGHT
+ 0182 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, MODERATE
+ 0183 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, HEAVY
+ 0184 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, VIOLENT
+ 0185 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, SLIGHT
+ 0186 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, MODERATE
+ 0187 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, HEAVY
+ 0190 01 THUNDERSTORM
+ 0191 01 THUNDERSTORM, SLIGHT OR MODERATE, WITH NO PRECIPITATION
+ 0192 02 THUNDERSTORM, SLIGHT OR MODERATE, WITH RAIN SHOWERS AND/OR S
+ NOW SHOWERS
+ 0193 01 THUNDERSTORM, SLIGHT OR MODERATE, WITH HAIL
+ 0194 01 THUNDERSTORM, HEAVY, WITH NO PRECIPITATION
+ 0195 01 THUNDERSTORM, HEAVY, WITH RAIN SHOWERS AND/OR SNOW SHOWERS
+ 0196 01 THUNDERSTORM, HEAVY, WITH HAIL
+ 0204 01 VOLCANIC ASH SUSPENDED IN THE AIR ALOFT
+ 0206 01 THICK DUST HAZE, VISIBILITY LESS THAN 1 KM
+ 0207 01 BLOWING SPRAY AT THE STATION
+ 0208 01 DRIFTING DUST (SAND)
+ 0209 01 WALL OF DUST OR SAND IN DISTANCE (LIKE HABOOB)
+ 0210 01 SNOW HAZE
+ 0211 01 WHITEOUT
+ 0213 01 LIGHTING, CLOUD TO SURFACE
+ 0217 01 DRY THUNDERSTORM
+ 0219 02 TORNADO CLOUD (DESTRUCTIVE AT OR WITHIN SIGHT OF THE STATION
+ DURING PRECEDING HOUR OR AT THE TIME OF OBSERVATION
+ 0220 01 DEPOSITION OF VOLCANIC ASH
+ 0221 01 DEPOSITION OF DUST OR SAND
+ 0222 01 DEPOSITION OF DEW
+ 0223 01 DEPOSITION OF WET SNOW
+ 0224 01 DEPOSITION OF SOFT RIME
+ 0225 01 DEPOSITION OF HARD RIME
+ 0226 01 DEPOSITION OF HOAR FROST
+ 0227 01 DEPOSITION OF GLAZE
+ 0228 01 DEPOSITION OF ICE CRUST (ICE SLICK)
+ 0230 01 DUSTSTORM OR SANDSTORM WITH TEMPERATURE BELOW 0 C DEGREES
+ 0239 02 BLOWING SNOW, IMPOSSIBLE TO DETERMINE WHETHER SNOW IS FALLIN
+ G OR NOT
+ 0241 01 FOG ON SEA
+ 0242 01 FOG IN VALLEYS
+ 0243 01 ARCTIC OR ANTARCTIC SEA SMOKE
+ 0244 01 STEAM FOG (SEA,LAKE OR RIVER)
+ 0245 01 STEAM FOG (LAND)
+ 0246 01 FOG OVER ICE OR SNOW COVER
+ 0247 01 DENCE FOG VISIBILITY 60-90 M
+ 0248 01 DENCE FOG VISIBILITY 30-60 M
+ 0249 01 DENCE FOG VISIBILITY LESS THAN 30 M
+ 0250 01 DRIZZLE, RATE OF FALL LESS THAN 0.10 MM/H
+ 0251 01 DRIZZLE, RATE OF FALL 0.10 - .19 MM/H
+ 0252 01 DRIZZLE, RATE OF FALL 0.20 - .39 MM/H
+ 0253 01 DRIZZLE, RATE OF FALL 0.40 - .79 MM/H
+ 0254 01 DRIZZLE, RATE OF FALL 0.80 - 1.59 MM/H
+ 0255 01 DRIZZLE, RATE OF FALL 1.60 - 3.19 MM/H
+ 0256 01 DRIZZLE, RATE OF FALL 3.20 - 6.39 MM/H
+ 0257 01 DRIZZLE, RATE OF FALL 6.40 MM/H OR MORE
+ 0259 01 DRIZZLE AND SNOW
+ 0260 01 RAIN, RATE OF FALL LESS THAN 1.0 MM/H
+ 0261 01 RAIN, RATE OF FALL 1.0 - 1.9 MM/H
+ 0262 01 RAIN, RATE OF FALL 2.0 - 3.9 MM/H
+ 0263 01 RAIN, RATE OF FALL 4.0 - 7.9 MM/H
+ 0264 01 RAIN, RATE OF FALL 8.0 - 15.9 MM/H
+ 0265 01 RAIN, RATE OF FALL 16.0 - 31.9 MM/H
+ 0266 01 RAIN, RATE OF FALL 32.0 - 63.9 MM/H
+ 0267 01 RAIN, RATE OF FALL 64.0 MM/H OR MORE
+ 0270 01 SNOW, RATE OF FALL LESS THAN 1.0 CM/H
+ 0271 01 SNOW, RATE OF FALL 1.0 - 1.9 CM/H
+ 0272 01 SNOW, RATE OF FALL 2.0 - 3.9 CM/H
+ 0273 01 SNOW, RATE OF FALL 4.0 - 7.9 CM/H
+ 0274 01 SNOW, RATE OF FALL 8.0 - 15.9 CM/H
+ 0275 01 SNOW, RATE OF FALL 16.0 - 31.9 CM/H
+ 0276 01 SNOW, RATE OF FALL 32.0 - 63.9 CM/H
+ 0277 01 SNOW, RATE OF FALL 64.0 CM/H OR MORE
+ 0278 01 SNOW OR ICE CRISTAL PRECIPITATION FROM A CLEAR SKY
+ 0279 01 WET SNOW, FREEZING ON CONTACT
+ 0280 01 PRECIPITATION OF RAIN (WW= 87-99)
+ 0281 01 PRECIPITATION OF RAIN,FREEZING (WW= 80-82)
+ 0282 01 PRECIPITATION OF RAIN AND SNOW MIXED
+ 0283 01 PRECIPITATION OF SNOW
+ 0284 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL
+ 0285 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH RAIN
+ 0286 02 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH RAIN AND S
+ NOW MIXED
+ 0287 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH SNOW
+ 0288 01 PRECIPITATION OF HAIL
+ 0289 01 PRECIPITATION OF HAIL, WITH RAIN
+ 0290 01 PRECIPITATION OF HAIL, WITH RAIN AND SNOW MIXED
+ 0291 01 PRECIPITATION OF HAIL, WITH SNOW
+ 0292 01 SHOWER(S) OR THUNDERSTORM OVER SEA
+ 0293 01 SHOWER(S) OR THUNDERSTORM OVER MOUNTAINS
+ 0508 02 NO SIGNIFICANT PHENOMENA TO REPORT, PRESENT AND PAST WEATHER
+ OMITTED
+ 0509 02 NOT OBSERVED, NO DATA AVAILABLE, PRESENT AND PAST WEATHER OM
+ ITTED
+ 0510 01 PRESENT AND PAST WEATHER MISSING, BUT EXPECTED
+ 0511 01 MISSING VALUE
+020004 0021 0000 02 CLOUD COVERING 1/2 OR LESS OF THE SKY THROUGHOUT THE APPROPP
+ RIATE PERIOD
+ 0001 03 CLOUD COVERING MORE THAN 1/2 OF THE SKY DURING PART OF THE A
+ PPROPRIATE PERIOD AND COVERING 1/2 OR LESS DURING PART OF TH
+ E PERIOD
+ 0002 02 CLOUD COVERING MORE THAN 1/2 OF THE SKY THROUGHOUT THE APPRP
+ PRIATE PERIOD
+ 0003 01 SANSTORM, DUSTSTORM OR BLOWING SNOW
+ 0004 01 FOG OR ICE OR THICK HAZE
+ 0005 01 DRIZZLE
+ 0006 01 RAIN
+ 0007 01 SNOW, OR RAIN AND SNOW MIXED
+ 0008 01 SHOWER(S)
+ 0009 01 THUNDERSTORM(S) WITH OR WITHOUT PRECIPITATION
+ 0010 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0011 01 VISIBILITY REDUCED
+ 0012 01 BLOWING PHENOMENA, VISIBILITY REDUCED
+ 0013 01 FOG
+ 0014 01 PRECIPITATION
+ 0015 01 DRIZZLE
+ 0016 01 RAIN
+ 0017 01 SNOW OR ICE PELLETS
+ 0018 01 SHOWERS OR INTERMITTENT PRECIPITATION
+ 0019 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+020005 0021 0000 02 CLOUD COVERING 1/2 OR LESS OF THE SKY THROUGHOUT THE APPROPP
+ RIATE PERIOD
+ 0001 03 CLOUD COVERING MORE THAN 1/2 OF THE SKY DURING PART OF THE A
+ PPROPRIATE PERIOD AND COVERING 1/2 OR LESS DURING PART OF TH
+ E PERIOD
+ 0002 02 CLOUD COVERING MORE THAN 1/2 OF THE SKY THROUGHOUT THE APPRP
+ PRIATE PERIOD
+ 0003 01 SANSTORM, DUSTSTORM OR BLOWING SNOW
+ 0004 01 FOG OR ICE OR THICK HAZE
+ 0005 01 DRIZZLE
+ 0006 01 RAIN
+ 0007 01 SNOW, OR RAIN AND SNOW MIXED
+ 0008 01 SHOWER(S)
+ 0009 01 THUNDERSTORM(S) WITH OR WITHOUT PRECIPITATION
+ 0010 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0011 01 VISIBILITY REDUCED
+ 0012 01 BLOWING PHENOMENA, VISIBILITY REDUCED
+ 0013 01 FOG
+ 0014 01 PRECIPITATION
+ 0015 01 DRIZZLE
+ 0016 01 RAIN
+ 0017 01 SNOW OR ICE PELLETS
+ 0018 01 SHOWERS OR INTERMITTENT PRECIPITATION
+ 0019 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+020008 0019 0000 01 SKY CLEAR
+ 0001 01 FEW
+ 0002 01 SCATTERED
+ 0003 01 BROKEN
+ 0004 01 OVERCAST
+ 0005 01 RESERVED
+ 0006 01 SCATTERED/BROKEN (MANY FORECASTS USE SCATTERED/BROKEN
+ 0007 01 BROKEN/OVERCAST (BROKEN/OVERCAST FOLLOWED BY CLOUD TYPE(S))
+ 0008 02 ISOLATED (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE
+ CB)
+ 0009 02 ISOLATED EMBEDDED (USED ON AVIATION CHARTS TO DESCRIBE THE C
+ LOUD TYPE CB)
+ 0010 02 OCCASIONAL (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TY
+ PE CB)
+ 0011 02 OCCASIONAL EMBEDDED (USED ON AVIATION CHARTS TO DESCRIBE THE
+ CLOUD TYPE CB)
+ 0012 02 FREQUENT (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE
+ CB)
+ 0013 02 DENSE (USED ON AVIATION CHARTS TO DESCRIBE CLOUD THAT WOULD
+ CAUSE SUDDEN CHANGES IN VISIBILITY (LESS THAN 1000M)
+ 0014 01 LAYERS
+ 0015 01 OBSCURED (OBSC)
+ 0016 01 EMBEDDED (EMBD)
+ 0017 01 FREQUENT EMBEDDED
+ 0031 01 MISSING VALUE
+020009 0006 0000 01 RESERVED
+ 0001 01 NSC MIL SIGNIFICANT CLOUD
+ 0002 01 CAVOK
+ 0003 01 SKC SKY CLEAR
+ 0004 01 NSW NIL SIGNIFICANT WEATHER
+ 0015 01 MISSING VALUE
+020011 0011 0000 01 0 0
+ 0001 01 1 OKTA OR LESS, BUT NOT ZERO 1/10 OR LESS, BUT NOT ZERO
+ 0002 01 2 OKTAS 2/10 - 3/10
+ 0003 01 3 OKTAS 4/10
+ 0004 01 4 OKTAS 5/10
+ 0005 01 5 OKTAS 6/10
+ 0006 01 6 OKTAS 7/10 - 8/10
+ 0007 01 7 OKTAS OR MORE,BUT NOT 8 OKTAS9/10 OR MORE, BUT NOT 10/10
+ 0008 01 8 OKTAS 10/10
+ 0009 01 SKY OBSCURED BY FOG AND OR OTHER METEOROLOGICAL PHENOMENA
+ 0015 02 CLOUD COVE IS INDISCERNIBLE FOR REASONS OTHER THAN FOG OR OT
+ HER METEOROLOGICAL PHENOMENA, OR OBSERVATION IS NOT MADE
+020012 0045 0000 01 CIRRUS (CI)...............CI
+ 0001 01 CIRROCUMULUS (CC).........CC
+ 0002 01 CIRROSTRATUS (CS).........CS
+ 0003 01 ALTOCUMULUS (AC).........AC
+ 0004 01 ALTOSTRATUS (AS).........AS
+ 0005 01 NIMBOSTRATUS (NS).........NS
+ 0006 01 STRATOCUMULUS(SC).........SC
+ 0007 01 STRATUS (ST).........ST
+ 0008 01 CUMULUS (CU).........CU
+ 0009 01 CUMULONIMBUS (CB).........CB
+ 0010 01 NO CH CLOUDS
+ 0011 02 CIRRUS FIBRATUS, SOMETIMES UNCINUS, NOT PROGRESSIVELY INADIN
+ G THE SKY
+ 0012 04 CIRRUS SPISSATUS, IN PATCHES OR ENTANGLED SHEAVES, WHICH USU
+ ALLY DO NOT INCREASE AND SOMETIMES SEEM TO BE THE REMAINS OF
+ THE UPPER PART OF A CUMULONIMBUS; OR CIRRUS CASTELLANUS OR
+ FLOCCUS
+ 0013 01 CIRRUS SPISSATUS CUMULONIMBOGENITUS
+ 0014 02 CIRRUS UNCINUS OR FIBRATUS,OR BOTH, PROGRESSIVELY INVADING T
+ HE SKY ; THEY GENERALLY THICKEN AS A WHOLE
+ 0015 04 CIRRUS (OFTEN IN BANDS) AND CIRROSTRATUS, OR CIRROSTRATUS AL
+ ONE, PROGRESSIVELY INVADING THE SKY; THEY GENERALLY THICKEN
+ ASA WHOLE, BUT THE CONTINUOUS VEIL DOES NOT REACH 45 DEGREES
+ ABOVE THE HORIZON
+ 0016 05 CIRRUS (OFTEN IN BANDS) AND CIRROSTRATUS, OR CIRROSTRATUS AL
+ ONE, PROGRESSIVELY INVADING THE SKY; THEY GENERALLY THICKEN
+ ASA WHOLE, BUT THE CONTINUOUS VEIL EXTENDS MORE THAN 45 DEGR
+ REES ABOVE THE HORIZON, WITHOUT THE SKY BEING TOTALLY COVERE
+ D
+ 0017 01 CIRROSTRATUS COVERING THE WHOLE SKY
+ 0018 02 CIRROSTRATUS NOT PROGRESSIVELY INVADING THE SKY AND NOT ENTI
+ RELY COVERING IT
+ 0019 02 CIRROCUMULUS ALONE, OR CIRROCUMULUS PREDOMINANT AMONG THE CH
+ CLOUDS
+ 0020 01 NO CM CLOUDS
+ 0021 01 ALTOSTRATUS TRANSLUCIDUS
+ 0022 01 ALTOSTRATUS OPACUS OR NIMBOSTRATUS
+ 0023 01 ALTOCUMULUS TRANSLUCIDUS AT A SINGLE LEVEL
+ 0024 02 PATCHES (OFTEN LENTICULARIS) OF ALTOCUMULUS TRANSLUCIDUS, CO
+ NTINUALLY CHANGING AND OCCURING AT ONE OR MORE LEVELS
+ 0025 04 ALTOCUMULUS TRANSLUCIDUS IN BANDS, OR ONE OR MORE LAYERS OF
+ ALTOCUMULUS TRANSLUCIDUS OR OPACUS, PROGRESSIVELY INVADING T
+ HE SKY; THESE ALTOCUMULUS CLOUDS GENERALLY THICKEN AS A WHOL
+ E
+ 0026 01 ALTOCUMULUS CUMULOGENITUS (OR CUMULONIMBOGENITUS)
+ 0027 04 ALTOCUMULUS TRANSLUCIDUS OR OPACUS IN TWO OR MORE LAYERS, OR
+ ALTOCUMULUS OPACUS IN A SINGLE LAYER, NOT PROGRESSIVELY INV
+ ADING THE SKY, OR ALTOCUMULUS WITH ALTOSTRATUS OR NIMBOSTRAT
+ US
+ 0028 01 ALTOCUMULUS CASTELLANUS OR FLOCUS
+ 0029 01 ALTOCUMULUS OF CHAOTIC SKY, GENERALLY AT SEVERAL LEVELS
+ 0030 01 NO CL CLOUDS
+ 0031 02 CUMULUS HUMILIS OR CUMULUS FRACTUS OTHER THAN OF BAD WEATHER
+ , OR BOTH
+ 0032 03 CUMULUS MEDIOCRIS OR CONGESTUS, WITH OR WITHOUT CUMULUS OF S
+ PECIES FRACTUS OR HUMULIS OR STRATOCUMULUS, ALL HAVING THEIR
+ BASES AT THE SAME LEVEL
+ 0033 02 CUMULONIMBUS CALVUS, WITH OR WITHOUT CUMULUS, STRATOCUMULUS
+ OR STRATUS
+ 0034 01 STRATOCUMULUS CUMULOGENITUS
+ 0035 01 STRATOCUMULUS OTHER THAN STRATOCUMULUS CUMULOGENITUS
+ 0036 02 STRATUS NEBULOSUS OR STRATUS FRACTUS OTHER THAN OF BAD WEATH
+ ER, OR BOTH
+ 0037 02 STRATUS FRACTUS OR CUMULUS FRACTUS OF BAD WEATHER, OR BOTH
+ (PANNUS), USUALLY BELOW ALTOSTRATUS OR NIMBOSTRATUS
+ 0038 02 CUMULUS AND STRATOCUMULUS OTHER THAN STRATOCUMULUS CUMULOGEN
+ ITUS, WITH BASES AT DIFFERENT LEVELS
+ 0039 03 CUMULONIMBUS CAPILLATUS (OFTEN WITH AN ANVIL), WITH OR WITHO
+ UT CUMULONIMBUS CALVUS, CUMULUS, STRATOCUMULUS, STRATUS OR P
+ ANNUS
+ 0059 02 CLOUD NOT VISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDSTO
+ RM, OR OTHER ANALOGOUS PHENOMENA
+ 0060 03 CH CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA, OR BECAUSE OF A CONTINUOUS
+ LAYER OF LOWER CLOUDS
+ 0061 03 CM CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA, OR BECAUSE OF A CONTINUOUS
+ LAYER OF LOWER CLOUDS
+ 0062 02 CL CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA
+ 0063 01 MISSING VALUE
+020017 0011 0000 01 ISOLATED CLOUD OR FRAGMENTS OF CLOUD
+ 0001 01 CONTINUOUS CLOUD
+ 0002 01 BROKEN CLOUD - SMALL BREAKS, FLAT TOPS
+ 0003 01 BROKEN CLOUD - LARGE BREAKS, FLAT TOPS
+ 0004 01 CONTINUOUS CLOUD
+ 0005 01 BROKEN CLOUD - SMALL BREAKS, UNDULATED TOPS
+ 0006 01 BROKEN CLOUD - LARGE BREAKS, UNDULATED TOPS
+ 0007 02 CONTINUOUS OR ALMOST CONTINUOUS WAVES WITH TOWERING CLOUDS A
+ BOVE THE TOP OF THE LAYER
+ 0008 02 GROUPS OF WAVES WITH TOWERING CLOUDS ABOVE THE TOP OF THE LA
+ YER
+ 0009 01 TWO OR MORE LAYERS AT DIFFERENT LEVELS
+ 0015 01 MISSING VALUE
+020018 0004 0000 01 INCREASING (U)
+ 0001 01 DECREASING (D)
+ 0002 01 NO DISTINCT CHANGE (N)
+ 0003 01 MISSING VALUE
+020021 0024 0001 01 PRECIPITATION-UNKNOWN TYPE
+ 0002 01 LIQUID PRECIPITATION NOT FREEZING
+ 0003 01 LIQUID FREEZING PRECIPITATION
+ 0004 01 DRIZZLE
+ 0005 01 RAIN
+ 0006 01 SOLID PRECIPITATION
+ 0007 01 SNOW
+ 0008 01 SNOW GRAINS
+ 0009 01 SNOW PELLETS
+ 0010 01 ICE PELLETS
+ 0011 01 ICE CRYSTALS
+ 0012 01 DIAMOND DUST
+ 0013 01 SMALL HAIL
+ 0014 01 HAIL
+ 0015 01 GLAZE
+ 0016 01 RIME
+ 0017 01 SOFT RIME
+ 0018 01 HARD RIME
+ 0019 01 CLEAR ICE
+ 0020 01 WET SNOW
+ 0021 01 HOAR FROST
+ 0022 01 DEW
+ 0023 01 WHITE DEW
+ 0030 01 ALL 30 MISSING VALUE
+020022 0007 0000 01 NO PRECIPITATION
+ 0001 01 CONTINUOUS
+ 0002 01 INTERMITTENT
+ 0003 01 SHOWER
+ 0004 01 NOT REACHING GROUND
+ 0005 01 DEPOSITION
+ 0015 01 MISSING VALUE
+020023 0012 0001 01 DUST/SAND WHIRL
+ 0002 01 SQUALLS
+ 0003 01 SAND STORM
+ 0004 01 DUST STORM
+ 0005 01 LIGHTNING - CLOUD TO SURFACE
+ 0006 01 LIGHTNING - CLOUD TO CLOUD
+ 0007 01 LIGHTNING - DISTANT
+ 0008 01 THUNDERSTORM
+ 0009 01 FUNNEL CLOUD NOT TOUCHING SURFACE
+ 0010 01 FUNNEL CLOUD TOUCHING SURFACE
+ 0011 01 SPRAY
+ 0012 01 WATER-SPOUT
+020024 0007 0000 01 NO PHENOMENA
+ 0001 01 LIGHT
+ 0002 01 MODERATE
+ 0003 01 HEAVY
+ 0004 01 VIOLENT
+ 0005 01 SEVERE (VAL)
+ 0007 01 MISSING VALUE
+020025 0011 0001 01 FOG
+ 0002 01 ICE FOG
+ 0003 01 STEAM FOG
+ 0007 01 MIST
+ 0008 01 HAZE
+ 0009 01 SMOKE
+ 0010 01 VOLCANIC ASH
+ 0011 01 DUST
+ 0012 01 SAND
+ 0013 01 SNOW
+ 0021 01 ALL 21 MISSING VALUE
+020026 0014 0000 01 NO CHANGE
+ 0001 01 SHALLOW
+ 0002 01 PATCHES
+ 0003 01 PARTIAL
+ 0004 01 FREEZING
+ 0005 01 LOW DRIFTING
+ 0006 01 BLOWING
+ 0007 01 INCREASING
+ 0008 01 DECREASING
+ 0009 01 IN SUSPENSION IN THE AIR
+ 0010 01 WALL
+ 0011 01 DENSE
+ 0012 01 WHITEOUT
+ 0015 01 MISSING VALUE
+020027 0007 0001 01 AT TIME OF OBSERVATION
+ 0002 01 IN PAST HOUR
+ 0003 01 IN TIME PERIOD FOR PAST WEATHER W1W2
+ 0004 01 IN TIME PERIOD SPECIFIED
+ 0006 01 BELOW STATION LEVEL
+ 0007 01 AT THE STATION
+ 0008 01 IN THE VICINITY
+020029 0004 0000 01 NO RAIN
+ 0001 01 RAIN
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020032 0006 0000 01 ICE NOT BUILDING UP
+ 0001 01 ICE BUILDING UP SLOWLY
+ 0002 01 ICE BUILDING UP QUICKLY
+ 0003 01 ICE MELTING OR BREAKING UP SLOWLY
+ 0004 01 ICE MELTING OR BREAKING UP RAPIDLY
+ 0007 01 MISSING VALUE
+020033 0004 0001 01 ICING FROM OCEAN SPRAY
+ 0002 01 ICING FROM FOG
+ 0003 01 ICING FROM RAIN
+ 0004 01 MISSING VALUE
+020034 0012 0000 01 NO SEA ICE IN SIGHT
+ 0001 02 SHIP IN OPEN LEAD MORE THAN 1.0 NAUTICAL MILE WIDE, OR SHIP
+ IN FAST ICE WITH BOUNDARY BEYOND LIMIT OF VISIBILITY
+ 0002 04 SEA ICE PRESENT IN CONCETRATION LESS THAN 3/10 (3/8), OPEN W
+ ATER OR VERY OPEN PACK ICE, SEA ICE CONCETRATION IS UNIFORM
+ IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL
+ MILE OF ICE EDGE
+ 0003 03 4/10 TO 6/10 (3/8 TO LESS THAN 6/8) ,OPEN PACK ICE, SEA ICE
+ CONCETRATION IS UNIFORM IN THE OBSERVATION AREA, SHIP IN ICE
+ OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0004 03 7/10 TO 8/10 (6/8 TO LESS THAN 7/8), CLOSE PACK ICE, SEA ICE
+ CONCETRATION IS UNIFORM IN THE OBSERVATION AREA, SHIP IN IC
+ E OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0005 04 9/10 OR MORE, BUT NOT 10/10 (7/8 TO LESS THAN 8/8), VERY CLO
+ SE PACK ICE, SEA ICE CONCETRATION IS UNIFORM IN THE OBSERVAT
+ ION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE EDG
+ E
+ 0006 03 STRIPS AND PATCHES OF PACK ICE WITH OPEN WATER BETWEEN, SEA
+ ICE CONCENTRATION IS NOT UNIFORM IN THE OBSERVATION AREA, SH
+ IP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0007 04 STRIPS AND PATCHES OF CLOSE OR VERY CLOSE PACK ICE WITH AREA
+ S OF LESSER CONCENTRATION BETWEEN, SEA ICE CONCETRATION IS N
+ OT UNIFORM IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.
+ 5 NAUTICAL MILE OF ICE EDGE
+ 0008 04 FAST ICE WITH OPEN WATER,VERY OPEN OR OPEN PACK ICE TO SEAWA
+ RD OF THE ICE BOUNDARY, SEA ICE CONCENTRATION IS NOT UNIFORM
+ IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL
+ MILE OF ICE EDGE
+ 0009 04 FAST ICE CLOSE OR VERY CLOSE PACK ICE TO SEAWARD OF THE ICE
+ BOUNDARY, SEA ICE CONCETRATION IS NOT UNIFORM IN THE OBSERVA
+ TION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE ED
+ GE
+ 0014 03 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY, O
+ R BECAUSE SHIP IS MORE THAN 0.5 NAUTICAL MILE AWAY FROM ICE
+ EDGE
+ 0015 01 MISSING VALUE
+020035 0012 0000 01 NO ICE OF LAND ORIGIN
+ 0001 01 1-5 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0002 01 6-10 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0003 01 11-20 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0004 01 UP TO AND INCLUDING 10 GROWLERS AND BERGY BITS - NO ICEBERGS
+ 0005 01 MORE THAN 10 GROWLERS AND BERGY BITS - NO ICEBERGS
+ 0006 01 1-5 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0007 01 6-10 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0008 01 11-20 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0009 02 MORE THAN 20 ICEBERGS,WITH GROWLERS AND BERGY BITS - A MAJOR
+ HAZARD TO NAVIGATION
+ 0014 02 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY OR
+ BECAUSE ONLY SEA ICE IS VISIBLE
+ 0015 01 MISSING VALUE
+020036 0012 0000 01 SHIP IN OPEN WATER WITH FLOATING ICE IN SIGHT
+ 0001 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS IMPROVING
+ 0002 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS NOT CHANGING
+ 0003 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS WORSENING
+ 0004 01 SHIP IN ICE DIFFICULT TO PENETRATE; CONDITIONS IMPROVING
+ 0005 01 SHIP IN ICE DIFFICULT TO PENETRATE; CONDITIONS NOT CHANGING
+ 0006 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE FORMING AND FLOES FREEZING TOGETHAR
+ 0007 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE UNDER SLIGHT PRESSURE
+ 0008 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE UNDER MODERATE OR SEVERE PRESSURE
+ 0009 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ SHIP BESET.
+ 0030 01 UNABLE TO REPORT, BECAUSE OF DARKNESS OR LACK OF VISIBILITY
+ 0031 01 MISSING VALUE
+020037 0012 0000 01 NEW ICE ONLY (FRAZIL ICE, GREASE ICE, SLUSH, SHUGA)
+ 0001 01 NILAS OR ICE RIND, LESS THAN 10 CM THICK
+ 0002 01 YOUNG ICE(GREY ICE, GREY-WHITE ICE
+ 0003 01 PREDOMINANTLY NEW AND/OR YOUNG ICE WITH SOME FIRST-YEAR ICE
+ 0004 02 PREDOMINANTLY THIN FIRST-YEAR ICE WITH SOME NEW AND/OR YOUNG
+ ICE
+ 0005 01 ALL THIN FIRST-YEAR ICE (30-70 CM THICK)
+ 0006 02 PREDOMINANTLY MEDIUM FIRST-YEAR ICE
+ (70-120 CM THICK) AND THICK FIRST-YEAR ICE (>120 CM
+ 0007 01 ALL MEDIUM AND THICK FIRST-YEAR ICE
+ 0008 02 PREDOMINANTLY MEDIUM AND THICK FIRST-YEAR ICE WITH SOME
+ OLD ICE (USUALLY MORE THAN 2 METRES THICK)
+ 0009 01 PREDOMINANTLY OLD ICE
+ 0030 03 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY OR
+ BECAUSE ONLY ICE OF LAND ORIGIN IS VISIBLE OR BECAUSE SHIP I
+ S MORE THAN 0.5 NAUTICAL MILE AWAY FROM ICE EDGE
+ 0031 01 MISSING VALUE
+020040 0009 0000 01 DRIFT SNOW ENDED BEFORE THE HOUR OF OBSERVATION
+ 0001 01 INTENSITY DIMINISHING
+ 0002 01 NO CHANGE
+ 0003 01 INTENSITY INCREASING
+ 0004 02 CONTINUES, APART FROM INTERRUPTION LASTING LESS THAN 30 MINU
+ TES
+ 0005 01 GENERAL DRIFT SNOW HAS BECOME DRIFT SNOW NEAR THE GROUND
+ 0006 01 DRIFT SNOW NEAR THE GROUND HAS BECOME GENERAL DRIFT SNOW
+ 0007 02 DRIFT SNOW HAS STARTED AGAIN AFTER AN INTERRUPTION OF MORE T
+ HAN 30 MINUTES
+ 0015 01 MISSING VALUE
+020041 0011 0000 01 NO ICING
+ 0001 01 LIGHT ICING
+ 0002 01 LIGHT ICING IN CLOUD
+ 0003 01 LIGHT ICING IN PRECIPITATION
+ 0004 01 MODERATE ICING
+ 0005 01 MODERATE ICING IN CLOUD
+ 0006 01 MODERATE ICING IN PRECIPITATION
+ 0007 01 SEVERE ICING
+ 0008 01 SEVERE ICING IN CLOUD
+ 0009 01 SEVERE ICING IN PRECIPITATION
+ 0015 01 MISSING VALUE
+020042 0004 0000 01 NO ICING
+ 0001 01 ICING PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020045 0004 0000 01 NO SLD CONDITIONS PRESENT
+ 0001 01 SLD CONDITIONS PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020050 0010 0000 01 RESERVED
+ 0001 01 1ST LOW CLOUD
+ 0002 01 2ND LOW CLOUD
+ 0003 01 3RD LOW CLOUD
+ 0004 01 1ST MEDIUM CLOUD
+ 0005 01 2ND MEDIUM CLOUD
+ 0006 01 3RD MEDIUM CLOUD
+ 0007 01 1ST HIGH CLOUD
+ 0008 01 2ND HIGH CLOUD
+ 0255 01 MISSING VALUE
+020055 0011 0000 01 CUMULUS, IF ANY, ARE QUITE SMALL
+ 0001 01 CUMULUS OF INTERMEDIATE SIZE
+ 0002 01 SWELLING CUMULUS
+ 0003 01 SWELLING CUMULUS WITH TOWERS
+ 0004 01 SWELLING CUMULUS WITH TOWERS HAVING PRONOUNCED TILT
+ 0005 01 TALL CUMULUS CONGESTUS
+ 0006 01 ISOLATED CUMULONIMBUS
+ 0007 01 NUMEROUS CUMULONIMBUS
+ 0008 01 CONTINUOUS DENSE MIDDLE CLOUDS
+ 0009 01 CONTINUOUS SHEETS OF MIDDLE CLOUDS
+ 0015 01 MISSING VALUE
+020056 0005 0000 01 UNKNOWN
+ 0001 01 WATER
+ 0002 01 ICE
+ 0003 01 MIXED
+ 0007 01 MISSING VALUE
+020062 0021 0000 02 SURFACE OF GROUND DRY (WITHOUT CRACKS AND NO APPRECIABLE
+ AMOUNT OF DUST OR LOOSE SAND)
+ 0001 01 SURFACE OF GROUND MOIST
+ 0002 02 SURFACE OF GROUND WET (STANDING WATER IN SMALL
+ OR LARGE POOLS ON SURFACE)
+ 0003 01 FLOODED WITHOUT SNOW
+ 0004 01 SURFACE OF GROUND FROZEN MEASURABLE ICE
+ 0005 01 GLAZE ON GROUND COVER
+ 0006 01 LOOSE DRY DUST OR SAND NOT COVERING GROUND COMPLETELY
+ 0007 02 THIN COVER OF LOOSE DRY DUST OR SAND COVERING GROUND COMPLET
+ ELY
+ 0008 02 MODERATE OR THICK COVER OF LOOSE DRY DUST OR SAND COVERING
+ GROUND COMPLETELY
+ 0009 01 EXTREMELY DRY WITH CRACKS
+ 0010 01 GROUND PREDOMINANTLY COVERED BY ICE
+ 0011 02 COMPACT OR WET SNOW (WITH OR WITHOUT ICE) COVERING LESS THAN
+ ONE-HALF OF THE GROUND
+ 0012 02 COMPACT OR WET SNOW (WITH OR WITHOUT ICE) COVERING AT LEAST
+ ONE-HALF OF THE GROUND BUT GROUND NOT COMPLETELY COVERED
+ 0013 01 EVEN LAYER OF COMPACT OR WET SNOW COVERING GROUND COMPLETELY
+ 0014 02 UNEVEN LAYER OF COMPACT OR WET SNOW COVERING GROUND
+ WITH SNOW OR COMPLETELY MEASURABLE ICE
+ 0015 02 LOOSE DRY SNOW COVERING LESS THAN ONE-HALF OF THE GROUND COV
+ ER
+ 0016 02 LOOSE DRY SNOW COVERING AT LEAST ONE-HALF OF THE
+ GROUND (BUT NOT COMPLETELY)
+ 0017 01 EVEN LAYER OF LOOSE DRY SNOW COVERING GROUND COMPLETELY
+ 0018 01 UNEVEN LAYER OF LOOSE DRY SNOW COVERING GROUND COMPLETELY
+ 0019 01 SNOW COVERING GROUND COMPLETELY; DEEP DRIFTS
+ 0031 01 MISSING VALUE
+020063 0001 0000 01 TO BE DEVELOPED
+020071 0011 0000 01 NO ASSESSMENT NO ASSESSMENT
+ 0001 01 LESS THAN 50 KM LESS THAN 1 PER SECOND
+ 0002 01 BETWEEN 50 AND 200 KM LESS THAN 1 PER SECOND
+ 0003 01 MORE THAN 200 KM LESS THAN 1 PER SECOND
+ 0004 01 LESS THAN 50 KM 1 OR MORE PER SECOND
+ 0005 01 BETWEEN 50 AND 200 KM 1 OR MORE PER SECOND
+ 0006 01 MORE THAN 200 KM 1 OR MORE PER SECOND
+ 0007 02 LESS THANK 50 KM RATE SO RAPID NUMBER CANNOT BE COUN
+ TED
+ 0008 02 BETWEEN 50 AND 200 KM RATE SO RAPID NUMBER CANNOT BE COUN
+ TED
+ 0009 02 MORE THAN 200 KM RATE SO RAPID NUMBER CANNOT BE COUN
+ TED
+ 0015 01 MISSING VALUE
+020086 0008 0000 01 CLEAR AND DRY
+ 0001 01 DAMP
+ 0005 01 WET SNOW
+ 0006 01 SLUSH
+ 0007 01 ICE
+ 0008 01 COMPACTED OR ROLLED SNOW
+ 0009 01 FROZEN RUTS OR RIDGES
+ 0015 01 MISSING VALUE
+020090 0007 0000 01 RESERVED
+ 0001 01 NACREOUS CLOUDS
+ 0002 01 NOCTILUCENT CLOUDS
+ 0003 01 CLOUDS FROM WATERFALLS
+ 0004 01 CLOUDS FROM FIRES
+ 0005 01 CLOUDS FROM VULCANIC ERUPTIONS
+ 0015 01 MISSING VALUE
+020101 0010 0001 01 SCHISTOCERCA GREGARIA
+ 0002 01 LOCUSTA MIGRATORIA
+ 0003 01 NOMADACRIS SEPTEMFASCIATA
+ 0004 01 OEDALEUS SENAGALENSIS
+ 0005 01 ANRACRIDIUM SPP
+ 0006 01 OTHER LOCUST
+ 0007 01 OTHER GRASSHOPPERS
+ 0008 01 ITHER CRICKETS
+ 0009 01 SPODOPTERA EXEMPTA
+ 0015 01 MISSING VALUE
+020102 0011 0000 01 GREEN
+ 0001 01 GREEN AND BLACK
+ 0002 01 BLACK
+ 0003 01 YELLOW AND BLACK
+ 0004 01 STRAW/GREY
+ 0005 01 PINK
+ 0006 01 DARK RED/BROWN
+ 0007 01 MIXED RED AND YELLOW
+ 0008 01 YELLOW
+ 0009 01 OTHER
+ 0015 01 MISSING VALUE
+020151 0003 0000 01 FIRST YEAR ICE
+ 0001 01 MULTI YEAR ICE
+ 0007 01 MISSING
+020252 0003 0000 01 NO EDGE
+ 0001 01 EDGE PRESENT
+ 0007 01 MISSING
+020253 0008 0000 01 LAND
+ 0001 01 VEGETATION COVERED LAND
+ 0002 01 RESERVED
+ 0003 01 ICE
+ 0004 01 POSSIBLE ICE
+ 0005 01 OCEAN
+ 0006 01 COAST
+ 0007 01 MISSING
+021066 0011 0001 01 PROCESSING EQUIPMENT NOT WORKING
+ 0002 01 EQUIPMENT FAILED
+ 0003 01 PRF CODE CHANGED DURING IMAGE GENERATION
+ 0004 01 SAMPLINH WINDOW CHANGED DURING IMAGE GENERATION
+ 0005 01 GAIN CHANGED DURING IMAGE GENERATION
+ 0006 01 CHIRP REPLICA EXCEEDS SPECIFIC VALUE
+ 0007 02 INPUT DATA MEAN AND STANDARD DEVIATION OF IN-PHASE AND
+ QUADRATURE OUT OF RANGE
+ 0008 01 DOPPLER CENTROID CONFIDENCE > MMCC VALUE
+ 0009 01 DOPPLER CENTROID ABSOLUTE VALUE > PRF/2
+ 0010 01 DOPPLER AMBIGUITY CONFIDENCE < MMCC VALUE
+ 0011 01 OUTPUT DATA MEAN AND STANDARD DEVIATION =< MMCC VALUE
+021067 0012 0001 01 NO FOREBEAM CALCULATION
+ 0002 01 NO MIDBEAM CALCULATION
+ 0003 01 NO AFTBEAM CALCULATION
+ 0004 01 FOREBEAM ARCING DETECTED
+ 0005 01 MID ARCING DETECTED
+ 0006 01 AFTBEAM ARCING DETECTED
+ 0007 01 ANY BEAM NOISE CONTENT ABOVE OR EQUAL TO TRESHOLD
+ 0008 01 LAND (ANY LAND IN CELL FOOTPRINT)
+ 0009 01 AUTONOMOUS AMBIGUITY REMOVAL NOT USED
+ 0010 01 METEOROLOGICAL BACKGROUND NOT USED
+ 0011 01 MINIMUM RESIDUAL EXCEEDED TRESHOLD
+ 0012 01 FRAME CHECKSUM ERROR DETECTED
+021068 0007 0001 01 STANDARD DEVIATION OF WIND SPEED OUTSIDE MMCC LIMIT
+ 0002 02 STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT OUTSIDE MMCC L
+ IMIT
+ 0003 01 STANDARD DEVIATION OF ALTITUDE OUTSIDE MMCC LIMIT
+ 0004 01 MEAN PEAKINESS OUTSIDE MMCC LIMIT
+ 0005 01 FRAME CHECKSUM ERROR DETECTED
+ 0006 01 HEIGHT-TIME LOOP TIME CONSTANT CORRECTION NOT PERFORMED
+ 0007 01 NOT ENOUGH MEASUREMENTS ( N< 10)
+021069 0009 0001 01 12.0 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0002 01 11.0 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0003 01 3.7 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0004 01 1.6 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0005 02 CLOUD IDENTIFICATION USED 1.6 MICROMETERS
+ HISTOGRAM REFLECTANCE CLOUD TEST
+ 0006 02 1.6 MICROMETERS HISTOGRAM REFLECTANCE CLOUD
+ TEST USED DYNAMIC TRESHOLD
+ 0007 01 SUN GLINT DETECTED BY 1.6 MICROMETERS REFLECTANCE CLOUD TEST
+ 0008 01 3.7 MICROMETERS USED IN SEA-SURFACE TEMPERATURE RETRIEVAL
+ 0009 02 SEA-SURFACE TEMPERATURE DERIVATION USED DAYTIME DATA
+ (NIGHT-TIME IF ZERO)
+021070 0024 0001 01 CELL 1:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0002 02 CELL 2:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL CELL NUMB
+ ERING
+ 0003 01 CELL 3:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0004 01 CELL 4:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL NW NE
+ 0005 01 CELL 5:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 7 8 9
+ 0006 01 CELL 6:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 4 5 6
+ 0007 01 CELL 7:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 1 2 3
+ 0008 01 CELL 8:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL SW SE
+ 0009 01 CELL 9:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0010 02 -18 DUAL VIEW SST RETRIEVAL USED 3.7 MICRON CHANNEL (ONE BIT
+ PER 10-ARCMIN CELL)
+ 0011 01 CELL 1:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0011 02 CELL 2:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL CELL NUMB
+ ERING
+ 0012 01 CELL 3:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0013 01 CELL 4:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL NW NE
+ 0014 01 CELL 5:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 7 8 9
+ 0015 01 CELL 6:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 4 5 6
+ 0016 01 CELL 7:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 1 2 3
+ 0017 01 CELL 8:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL SW SE
+ 0018 01 CELL 9:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0019 01 NADIR VIEW CONTAINS DAY-TIME DATA (NIGHT IF ZERO)
+ 0020 01 FORWARD VIEW CONTAINS DAY-TIME DATA (NIGHT IF ZERO)
+ 0021 02 RECORD CONTAINS CONTRIBUTIONS FROM INSTRUMENT SCANS ACQUIRED
+ WHEN ERS PLATFORM NOT IN YAW-STEERING MODE
+ 0022 02 RECORD CONTAINS CONTRIBUTIONS FROM INSTRUMENT SCANS FOR WHIC
+ H PRODUCT CONFIDENCE DATA SHOW QUALITY IS POOR OR UNKNOWN
+ 0023 01 MISSING VALUE
+021072 0003 0001 02 HEIGHT ERROR CORRECTION APPLIED INSTEAD OF OPEN LOOP CALIBRA
+ TION
+ 0002 01 MICROWAVE SOUNDER USED FOR TROPOSPHERE CORRECTION
+ 0003 02 AGC OUTPUT CORRECTION APPLIED INSTED OF OPEN LOOP CALIBRATIO
+ N
+021073 0008 0001 01 BLANK DATA RECORD
+ 0002 01 TEST
+ 0003 01 CALIBRATION (CLOSED LOOP)
+ 0004 01 BITE
+ 0005 01 ACQUISITION ON ICE
+ 0006 01 ACQUISITION ON OCEAN
+ 0007 01 TRACKING ON ICE
+ 0008 01 TRACKING ON OCEAN
+021076 0004 0000 01 LINEAR
+ 0001 01 LOGARITHMIC (BASE E)
+ 0002 01 LOGARITHMIC (BASE 10)
+ 0007 01 MISSING VALUE
+021109 0008 0001 01 NOT ENOUGH GOOD SIGMA-0 AVAILABLE FOR WIND RETRIEVAL
+ 0002 01 POOR AZIMUTH DIVERSITY AMONG SIGMA0- FOR WIND RETRIEVAL
+ 0008 01 SOME PORTION OF WIND VECTOR CELL IS OVER LAND
+ 0009 01 SOME PORTION OF WIND VECTOR CELL IS OVER ICE
+ 0010 01 WIND RETRIEVAL NOT PERFORMED FOR WIND VECTOR CELL
+ 0011 01 REPORTED WIND SPEED IS GREATER THAN 30 M/S
+ 0012 01 REPORTED WIND SPEED IS LESS THAN OR EQUAL TO 3 M/S
+ 0017 01 MISSING VALUE
+021115 0011 0001 01 SIGMA-0 MEASUREMENT IS NOT USABLE
+ 0002 01 SIGNAL TO NOISE RATIO IS LOW
+ 0003 01 SIGMA-0 IS NEGATIVE
+ 0004 01 SIGMA-0 IS OUTSIDE OF ACCEPTABLE RANGE
+ 0005 01 SCATTEROMETER PULSE QUALITY IS NOT ACCEPTABLE
+ 0006 01 SIGMA-0 CELL LOCATION ALGORITHM DOES NOT CONVERGE
+ 0007 01 FREQUENCY SHIFT LIES BEYOND THE RANGE OF THE X FACTOR TABLE
+ 0008 02 SPACECRAFT TEMPERATURE IS BEYOND CALIBRATION COEFFICIENT RAN
+ GE
+ 0009 01 NO APPLICABLE ATTITUDE RECORDS WERE FOUND FOR THIS SIGMA-0
+ 0010 02 INTERPOLATED EPHEMERIS DATA ARE NOT ACCEPTABLE FOR THIS SIGM
+ A-0
+ 0017 01 MISSING VALUE
+021116 0016 0001 01 CALIBRATION/MEASUREMENT PULSE FLAG (1)
+ 0002 01 CALIBRATION/MEASUREMENT PULSE FLAG (2)
+ 0003 01 OUTER ANTENNA BEAM
+ 0004 01 SIGMA-0 CELL IS AFT OF SPACECRAFT
+ 0005 01 CURRENT MODE (1)
+ 0006 01 CURRENT MODE (2)
+ 0007 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (1)
+ 0008 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (2)
+ 0009 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (3)
+ 0010 01 LOW RESOLUTION MODE - WHOLE PULSE DATA
+ 0011 01 SCATTEROMETER ELECTRONIC SUBSYSTEM B
+ 0012 01 ALTERNATE SPIN RATE - 19.8 RPM
+ 0013 01 RECEIVER PROTECTION ON
+ 0014 01 SLICES PER COMPOSITE FLAG (1)
+ 0015 01 SLICES PER COMPOSITE FLAG (2)
+ 0016 01 SLICES PER COMPOSITE FLAG (3)
+021119 0014 0000 01 RESERVED
+ 0001 01 SASS
+ 0002 01 SASS2
+ 0003 01 NSCAT0
+ 0004 01 NSCAT1
+ 0005 01 NSCAT2
+ 0006 01 QSCAT0
+ 0007 01 QSCAT1
+ 0031 01 CMOD1
+ 0032 01 CMOD2
+ 0033 01 CMOD3
+ 0034 01 CMOD4
+ 0035 01 CMOD5
+ 0064 01 MISSING VALUE
+021144 0001 0001 01 RAIN
+021150 0004 0000 01 DATA FROM SINGLE GROUND STATION (NO CO-LOCATION)
+ 0001 01 DATA FROM MULTIPLE GROUND STATION (CO-LOCATED DATA)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021155 0016 0001 01 NOT ENOUGH GOOD SIGMA-0 AVAILABLE FOR WIND RETRIEVAL
+ 0002 01 POOR AZIMUTH DIVERSITY AMONG SIGMA-0 FOR WIND RETRIEVAL
+ 0003 01 ANY BEAM NOISE CONTENT ABOVE TRESHOLD
+ 0004 01 PRODUCT MONITORING NOT USED
+ 0005 01 PRODUCT MONITORING FLAG
+ 0006 01 KNMI QUALITY CONTROL FAILS
+ 0007 01 VARIATIONAL QUALITY CONTROL FAILS
+ 0008 01 SOME PORTION OF WIND VECTOR CELL IS OVER LAND
+ 0009 01 SOME PORTION OF WIND VECTOR CELL IS OVER ICE
+ 0010 01 WIND RETRIEVAL NOT PERFORMED FOR WIND VECTOR CELL
+ 0011 01 REPORTED WIND SPEED IS GREATER THAN 30 M/S
+ 0012 01 REPORTED WIND SPEED IS LESS THAN OR EQUAL TO 3 M/S
+ 0013 01 RAIN FLAG FOR THE WIND VECTOR CELL IS NOT USABLE
+ 0014 01 RAIN FLAG ALGORITHM DETECTS RAIN
+ 0015 01 NO METEOROLOGICAL BACKGROUND USED
+ 0016 01 DATA ARE REDUNDANT
+021158 0004 0000 01 ACCEPTABLE
+ 0001 01 NOT ACCEPTABLE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021159 0004 0000 01 GOOD
+ 0001 01 USABLE
+ 0002 01 BAD
+ 0003 01 MISSING VALUE
+021169 0004 0000 01 NO ICE PRESENT
+ 0001 01 ICE PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021196 0012 0001 01 PROCESSING EQUIPMENT NOT WORKING
+ 0002 01 EQUIPMENT FAILED
+ 0003 01 PRF CODE CHANGED DURING IMAGE GENERATION
+ 0004 01 SAMPLING WINDOW CHANGED DURING IMAGE GENERATION
+ 0005 01 GAIN CHANGED DURING IMAGE GENERATION
+ 0006 01 CHIRP REPLICA EXCEEDS SPECIFIED VALUE
+ 0007 02 INPUT DATA MEAN AND STANDARD DEVIATION OF I AND Q OUT OF RAN
+ GE
+ 0008 01 DOPPLER CENTROID CONFIDENCE > MMCC VALUE
+ 0009 01 DOPPLER CENTROID ABSOLUTE VCALUE > PRF/2
+ 0010 01 DOPPLER AMBIGUITY CONFIDENCE < MMCC VALUE
+ 0011 01 OUTPUT DATA MEAN AND STANDARD DEVIATION <= MMCC VALUE
+ 0012 01 MISSING VALUE
+021199 0007 0001 01 3.7 MICRO CHANNEL USED IN ASST DERIVATION
+ 0002 01 ASST DERIVATION USED DATTIME DATA
+ 0003 02 COMPARISON OF ASST AGAINST PREVIOUS
+ EQUIVALENT PASS PERFORMED
+ 0004 02 COMPARISON OF ASST AGAINST WEEKLY AVERAGE
+ OF ASST PERFORMED
+ 0005 01
+ 0006 02 COMPARISON OF RATE OF CHANGE OF ASST AGAINST
+ STATIC TRESHOLD PERFORMED
+ 0007 01 MISSING VALUE
+022056 0004 0000 01 UPWARDS PROFILE
+ 0001 01 DOWNWARDS PROFILE
+ 0002 01 HORIZONTAL
+ 0003 01 MISSING VALUE
+022060 0004 0000 01 DROGUE IS DETACHED
+ 0001 01 DROGUE IS ATTACHED
+ 0002 01 DROGUE STATUS UNKNOWN
+ 0007 01 MISSING VALUE
+022061 0011 0000 01 CALM (GLASSY) HEIGHT 0 M
+ 0001 01 CALM (RIPPLED) HEIGHT 0 - 0.1 M
+ 0002 01 SMOOTH (WAVELETS) HEIGHT 0.1 - 0.5 M
+ 0003 01 SLIGHT HEIGHT 0.5 - 1.5 M
+ 0004 01 MODERATE HEIGHT 1.25 - 2.5 M
+ 0005 01 ROUGH HEIGHT 2.5 - 4 M
+ 0006 01 VERY ROUGH HEIGHT 4 - 6 M
+ 0007 01 HIGH HEIGHT 6 - 9 M
+ 0008 01 VERY HIGH HEIGHT 9 -14 M
+ 0009 01 PHENOMANAL HEIGHT OVER 14 M
+ 0015 01 MISSING VALUE
+022067 0001 0000 01 SEE COMMON CODE TABLE C3
+022068 0001 0000 01 SEE COMMON CODE TABLE C4
+022120 0013 0000 01 GOOD DATA
+ 0001 01 MAXIMUM (HIGH) WATER LEVEL LIMIT EXCEEDED
+ 0002 01 MINIMUM (LOW) WATER LEVEL LIMIT EXCEEDED
+ 0003 01 RATE OF CHANGE LIMIT FOR WATER LEVEL EXCEEDED
+ 0004 01 FLAT LIMIT FOR WATER LEVEL EXCEEDED
+ 0005 01 OBSERVED MINUS PREDICTED WATER LEVEL VALUE LIMIT EXCEEDED
+ 0006 02 OBSERVED VALUE FROM PRIMARY WATER LEVEL SENSOR MINUS
+ BACKUP WATER LEVEL SENSOR
+ 0007 01 VALUE EXCEEDED SPECIFIED TOLERANCE FROM EXPECTED VALUE
+ 0008 02 WATER LEVEL QA PARAMETER (SIGMAS AND/OR OUTLIERS) LIMITS EXC
+ EEDED
+ 0009 01 SEA TEMPERATURE OUTSIDE OF EXPECTED RANGE
+ 0010 01 MULTIPLE QC CHECKS (ABOVE) FAILED
+ 0011 01 NO AUTOMATED WATER LEVEL CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022121 0009 0000 01 OPERATIONAL
+ 0001 02 POSSIBLE CLOGGING PROBLEM OR OTHERWISE DEGRADED WATE LEVEL D
+ ATA
+ 0002 01 POSSIBLE DATUM SHIFT
+ 0003 01 UNKNOWN STATUS OF WATER LEVEL SENSOR
+ 0004 01 SUSPECTED OR KNOWN SEA TEMPERATURE SENSOR PROBLEM
+ 0005 01 MULTIPLE POSSIBLE PROBLEMS (ABOVE)
+ 0006 01 BAD DATA- DO NOT DISSEMINATE
+ 0007 01 NO MANUAL WATER LEVEL CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022122 0008 0000 01 GOOD DATA FROM ALL SENSORS
+ 0001 01 WIND DIRECTION OUTSIDE OF ALLOWABLE RANGE
+ 0002 01 WIND SPEED OUTSIDE OF EXPECTED RANGE
+ 0003 01 BAROMETRIC PRESSURE OUTSIDE OF EXPECTED RANGE
+ 0004 01 AIR TEMPERATURE OUTSIDE OF EXPECTED RANGE
+ 0005 01 MULTIPLE SENSOR FAILED QC CHECKS
+ 0006 01 NO AUTOMATED METEOROLOGICAL DATA CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022123 0009 0000 01 OPERATIONAL
+ 0001 01 SUSPECTED OR KNOWN PROBLEM WITH WIND SENSOR
+ 0002 01 SUSPECTED OR KNOWN PROBLEM WITH BAROMETRIC PRESSURE SENSOR
+ 0003 01 SUSPECTED OR KNOWN PROBLEM WITH AIR TEMPERATURE SENSOR
+ 0004 01 UNKNOWN STATUS OF ALL SENSORS
+ 0005 01 SUSPECTED OR KNOWN PROBLEMS WITH MULTIPLE SENSORS
+ 0006 01 BAD DATA - DO NOT DISSEMINATE
+ 0007 01 NO MANUAL METEOROLOGICAL DATA CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022252 0006 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND
+ PASSED
+ 0002 02 AUTOMATIC QUALITY CONTROL PASSED AND MAGNOLIA CHECKED AND
+ DELETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND
+ FAILED
+ 0005 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND
+ RE-INSERTED
+023001 0005 0000 01 RESERVED
+ 0001 01 ARTICLES 1 AND 2
+ 0002 01 ARTICLE 3
+ 0003 01 ARTICLE 5.2
+ 0007 01 MISSING VALUE
+023002 0016 0000 01 RESERVED
+ 0001 01 NUCLEAR REACTOR ON GROUND
+ 0002 01 NUCLEAR REACTOR ON SEA
+ 0003 01 NUCLEAR REACTOR IN SPACE
+ 0004 01 NUCLEAR FULE FACILITY
+ 0005 01 RADIOACTIVE WASTE MANAGMENT FACITILY
+ 0006 01 TRANSPORT OF NUCLEAR FUEL OR RADIOACTIVE WASTE
+ 0007 01 STORAGE OF NUCLEAR FUEL OR RADIOACTIVE WASTE
+ 0008 01 MANUFACTURE OF RADIO-ISOTOPES
+ 0009 01 USE OF RADIO-ISOTOPES
+ 0010 01 STORAGE OF RADIO-ISOTOPES
+ 0011 01 DISPOSAL OF RADIO-ISOTOPS
+ 0012 01 TRANSPORT OF RADIO-ISOTOPES
+ 0013 01 USE OF RADIO-ISOTOPES FOR POWER GENERATION
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+023003 0008 0000 01 NO RELEASE
+ 0001 01 RELEASE TO ATMOSPHERE
+ 0002 01 RELEASE TO WATER
+ 0003 01 RELEASE TO BOTH ATMOSPHERE AND WATER
+ 0004 01 EXPECTED RELEASE TO ATMOSPHERE
+ 0005 01 EXPECTED RELEASE TO WATER
+ 0006 01 EXPECTED RELEASE TO BOTH ATMOSPHERE AND WATER
+ 0007 01 MISSING VALUE
+023004 0006 0000 01 NO COUNTERMEASURE
+ 0001 01 EVACUATION
+ 0002 01 SHELTERING
+ 0003 01 PROPHILAXIS
+ 0004 01 WATER
+ 0007 01 MISSING VALUE
+023005 0004 0000 01 INCIDENT STAT DOES NOT UNDERSTAND WHAT HAPPENED
+ 0001 01 INCIDENT STATE KNOWS THE CAUSE OF THE INCIDENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023006 0008 0000 01 NO IMPROVEMENT
+ 0001 01 UNSTABLE
+ 0002 01 NO DETERIORATION
+ 0003 01 IMPROVING
+ 0004 01 STABLE
+ 0005 01 DETERIORATING
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+023007 0005 0000 01 NO RELEASE
+ 0001 01 RELEASE HAS STOPPED
+ 0002 01 RELEASE
+ 0003 01 RELEASE IS CONTINUING
+ 0007 01 MISSING VALUE
+023008 0004 0000 01 GASEUS
+ 0001 01 PARTICULATE
+ 0002 01 MIXTURE OF GASEUS AND PARTICULATE
+ 0003 01 MISSING VALUE
+023009 0004 0000 01 GASEUS
+ 0001 01 PARTICULATE
+ 0002 01 MIXTURE OF GASEUS AND PARTICULATE
+ 0003 01 MISSING VALUE
+023016 0004 0000 01 NO SIGNIFICANT TOXIC HEALTH EFFECT
+ 0001 01 SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT POSSIBLE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023018 0006 0000 01 RELEASE NO LONGER OCCURRING
+ 0001 01 RELEASE STILL OCCURRING
+ 0002 01 RELEASE EXPECTED TO INCREASE IN NEXT SIX HOURS
+ 0003 01 RELEASE EXPECTED TO REMAIN CONSTANT IN NEXT SIX HOURS
+ 0004 01 RELEASE EXPECTED TO DECREASE IN NEXT SIX HOURS
+ 0007 01 MISSING VALUE
+023031 0004 0000 01 PLUME WILL NOT ENCOUNTER RAIN IN INCIDENT STATE
+ 0001 01 PLUME WILL ENCOUNTER RAIN IN INCIDENT STATE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023032 0004 0000 01 NO SIGNIFICANT CHANGE EXPECTED WITHIN NEXT SIX HOURS
+ 0001 02 ANTICIPATED SIGNIFICANT CHANGE EXPECTED WITHIN NEXT SIX HOUR
+ S
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+024003 0005 0000 01 NOBLE GASES
+ 0001 01 IODINES
+ 0002 01 CAESIUM
+ 0003 01 TRANSURANICS
+ 0031 01 MISSING VALUE
+025004 0004 0000 01 INCOHERENT
+ 0001 01 COHERENT (DOPPLER)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025005 0004 0000 01 LOGATITHM - 2.5 DB
+ 0001 01 LINEAR
+ 0002 01 SPECIAL
+ 0003 01 MISSING VALUE
+025006 0005 0000 01 ZH TO R CONVERSION
+ 0001 01 (ZH, ZDR) TO (NO.DO) TO R
+ 0002 01 (Z(F1),Z(F2)) TO ATTENUATION TO R
+ 0006 01 OTHER
+ 0007 01 MISSING VALUE
+025009 0004 0001 01 NONE
+ 0002 01 CALIBRATION TARGET OR SIGNAL
+ 0003 01 AGAINST RAINGAGES
+ 0004 01 AGAINST OTHER INSTRUMENTS (DISTROMETER-ATTENUATION)
+025010 0008 0000 01 NONE
+ 0001 01 MAP
+ 0002 01 INSERTION OF HIGHER ELEVATION DATA AND MAP
+ 0003 01 ANALYSIS OF FLUCTUATING LOGARITHM SIGNAL (CLUTTER DETECTION)
+ 0004 02 EXTRACTION OF FLUCTUATING PART OF LINEAR SIGNAL (CLUTTER SUP
+ PRESSION)
+ 0005 01 CLUTTER SUPPRESSION DOPPLER
+ 0006 01 MULTIPARAMETER ANALYSIS
+ 0015 01 MISSING VALUE
+025011 0004 0000 01 NONE
+ 0001 01 MAP OF CORRECTION FACTORS
+ 0002 01 INTERPOLATION (AZIMUTH OR ELEVATION)
+ 0003 01 MISSING VALUE
+025012 0004 0000 01 HARDWARE
+ 0001 01 SOFTWARE
+ 0002 01 HARDWARE AND SOFTWARE
+ 0003 01 MISSING VALUE
+025013 0001 0001 01 BRIGHT BAND CORRECTION
+025015 0001 0001 01 RADOME ATTENUATION CORRECTION
+025017 0001 0001 01 PRECIPITATION ATTENUATION CORRECTION
+025020 0004 0000 01 FTT (FAST FOURIER TRANSFORM
+ 0001 01 PPP (PULSE PAIR PROCESSING
+ 0002 01 VPC (VECTOR-PHASE CHANGE)
+ 0003 01 MISSING VALUE
+025021 0005 0001 01 SIMPLE AVERAGE
+ 0002 01 CONSENSUS AVERAGE
+ 0003 01 MEDIAN CHECK
+ 0004 01 VERTICAL CONSISTENCY CHECK
+ 0005 01 OTHER
+025030 0004 0000 02 RUNNING MEAN SEA-SURFACE TEMPERATURE NOT USED BECAUSE USAGE
+ CRITERIA NOT MET
+ 0001 02 RUNNING MEAN SEA-SURFACE TEMPERATURE NOT USED BECAUSE DATA N
+ OT AVAILABLE
+ 0002 01 RUNNING MEAN SEA-SURFACE TEMPERATURE USED AS PREDICTOR
+ 0003 01 MISSING VALUE
+025032 0004 0000 01 RESERVED
+ 0001 01 DATA FROM LOW MODE
+ 0002 01 DATA FROM HIGH MODE
+ 0003 01 MISSING VALUE
+025033 0004 0000 01 WIND PROFILER OPERATING IN SUBMODE A
+ 0001 01 WIND PROFILER OPERATING IN SUBMODE B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025034 0003 0001 01 TEST A PERFORMED AND FAILED
+ 0002 01 TEST B PERFORMED AND FAILED
+ 0003 01 TEST RESULTS INCONCLUSIVE
+025036 0004 0000 02 NETWORK OF SEVERAL DIRECTION-FINDERS OPERATING ON
+ THE SAME INDIVIDUAL ATMOSPHERICS
+ 0001 02 NETWORK OF SEVERAL ARRIVAL-TIME STATIONS OPERATING ON
+ THE SAME INDIVIDUAL ATMOSPHERICS
+ 0006 01 SINGLE STATION RANGE BEARING TECHNIQUE
+ 0015 01 MISSING VALUE
+025040 0010 0000 01 NON-SPECIFIC MODE
+ 0001 01 FIRST GUESS DATA
+ 0002 01 CLOUD DATA
+ 0003 01 AVERAGE VECTOR DATA
+ 0004 01 PRIMARY DATA
+ 0005 01 GUESS DATA
+ 0006 01 VECTOR DATA
+ 0007 01 TRACER DATA; THE IMAGE
+ 0008 01 TRACER DATA TO NEXT IMAGE
+ 0015 01 MISSING VALUE
+025041 0004 0000 01 DIRECTION ORIGINALLY REPORTED IN TRUE DEGREES
+ 0001 01 DIRECTION ORIGINALLY REPORTED USING CODE TABLE 0700, FM 13
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025042 0004 0000 01 SPEED ORIGINALLY REPORTED IN METERS PER SECOND
+ 0001 01 SPEED ORIGINALLY REPORTED USING CODE TABLE 2251, FM 13
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025045 0020 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+ 0007 01 CHANNEL 7 PRESENT - (SET TO 1 PRESENT)
+ 0008 01 CHANNEL 8 PRESENT - (SET TO 1 PRESENT)
+ 0009 01 CHANNEL 9 PRESENT - (SET TO 1 PRESENT)
+ 0010 01 CHANNEL 10 PRESENT - (SET TO 1 PRESENT)
+ 0011 01 CHANNEL 11 PRESENT - (SET TO 1 PRESENT)
+ 0012 01 CHANNEL 12 PRESENT - (SET TO 1 PRESENT)
+ 0013 01 CHANNEL 13 PRESENT - (SET TO 1 PRESENT)
+ 0014 01 CHANNEL 14 PRESENT - (SET TO 1 PRESENT)
+ 0015 01 CHANNEL 15 PRESENT - (SET TO 1 PRESENT)
+ 0016 01 CHANNEL 16 PRESENT - (SET TO 1 PRESENT)
+ 0017 01 CHANNEL 17 PRESENT - (SET TO 1 PRESENT)
+ 0018 01 CHANNEL 18 PRESENT - (SET TO 1 PRESENT)
+ 0019 01 CHANNEL 19 PRESENT - (SET TO 1 PRESENT)
+ 0020 01 CHANNEL 20 PRESENT - (SET TO 1 PRESENT)
+025046 0004 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+025047 0003 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+025048 0015 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+ 0007 01 CHANNEL 7 PRESENT - (SET TO 1 PRESENT)
+ 0008 01 CHANNEL 8 PRESENT - (SET TO 1 PRESENT)
+ 0009 01 CHANNEL 9 PRESENT - (SET TO 1 PRESENT)
+ 0010 01 CHANNEL 10 PRESENT - (SET TO 1 PRESENT)
+ 0011 01 CHANNEL 11 PRESENT - (SET TO 1 PRESENT)
+ 0012 01 CHANNEL 12 PRESENT - (SET TO 1 PRESENT)
+ 0013 01 CHANNEL 13 PRESENT - (SET TO 1 PRESENT)
+ 0014 01 CHANNEL 14 PRESENT - (SET TO 1 PRESENT)
+ 0015 01 CHANNEL 15 PRESENT - (SET TO 1 PRESENT)
+025049 0005 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+025051 0006 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+025053 0006 0001 01 GOOD
+ 0002 01 REDUNDANT
+ 0003 01 QUESTIONABLE
+ 0004 01 BAD
+ 0005 01 EXPERIMENTAL
+ 0006 01 PRECIPITATING
+025069 0007 0001 01 SMOOTHED
+ 0002 01 BASELINE ADJUSTED
+ 0003 01 NORMALIZED TIME INTERVAL
+ 0004 01 OUTLIER CHECKED
+ 0005 01 PLAUSIBILITY CHECKED
+ 0006 01 CONSISTENCY CHECKED
+ 0007 01 INTERPOLATED
+025086 0004 0000 01 DEPTHS ARE NOT CORRECTED
+ 0001 01 DEPTHS ARE CORRECTED
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025093 0003 0001 01 NO CORRECTION
+ 0002 01 VERTICAL VELOCITY CORRECTION
+ 0007 01 ALL CORRECTIONS
+025095 0001 0001 02 ALTIMETER OPERATING (SET TO 0 IF NOMINAL, SET TO
+ BACKUP)
+025096 0004 0001 01 MODE INDICATOR (0 IF MODE 2, 1 IF MODE 1)
+ 0002 03 MODE 1 CALIBRATION SEQUENCE INDICATOR (0 IF NORMAL DATA TAKI
+ NG EITHER MODE 1 OR 2, 1 IF MODE 1 CALIBRATION SEQUENCE) BIT
+ S 3 AND 4 INDICATE ACTIVE 23.8 GHZ CHANNEL
+ 0003 01 CHANNEL 2 (0 IF ON, 1 IF OFF)
+ 0004 01 CHANNEL 3 (0 IF ON, 1 IF OFF)
+025097 0011 0000 01 RANGES BETWEEN 0 AND 30 CM
+ 0001 01 RANGES BETWEEN 30 AND 60 CM
+ 0002 01 RANGES BETWEEN 60 AND 90 CM
+ 0003 01 RANGES BETWEEN 90 AND 120 CM
+ 0004 01 RANGES BETWEEN 120 AND 150 CM
+ 0005 01 RANGES BETWEEN 150 AND 180 CM
+ 0006 01 RANGES BETWEEN 180 AND 210 CM
+ 0007 01 RANGES BETWEEN 210 AND 240 CM
+ 0008 01 RANGES BETWEEN 240 AND 270 CM
+ 0009 01 RANGES LARGER THAN 270 CM
+ 0015 01 MISSING VALUE
+025098 0008 0001 01 KU BAND RANGE
+ 0002 01 C BAND RANGE
+ 0003 01 KU BAND SWH
+ 0004 01 C BAND SWH
+ 0005 01 KU BAND SCATTEROMETER COEFFICIENT
+ 0006 01 C BAND SCATTEROMETER COEFFICIENT
+ 0007 01 OFF NADIR ANGLE FROM KU BAND WVEFORM PARAMETERS
+ 0008 01 OFF NADIR FROM PLATFORM
+025099 0006 0001 01 KU BAND RANGE INSTRUMENTAL CORRECTION
+ 0002 01 C BAND RANGE INSTRUMENTAL CORRECTION
+ 0003 01 KU BAND SWH INSTRUMENTAL CORRECTION
+ 0004 01 C BAND SWH INSTRUMENTAL CORRECTION
+ 0005 01 KU BAND SCATTEROMETER COEFFICIENT INSTRUMENTAL CORRECTION
+ 0006 01 C BAND SCATTEROMETER COEFFICIENT INSTRUMENTAL CORRECTION
+025110 0006 0001 02 RAW DATA ANALYSIS USED FOR RAW DATA CORRECTION.
+ CORRECTION DONE USING DEFAULT PARAMETERS
+ 0002 02 RAW DATA ANALYSIS USED FOR RAW DATA CORRECTION.
+ CORRECTION DONE USING RAW DATA ANALYSIS RESULTS
+ 0003 01 ANTENNA ELEVATION PATTERN CORRECTION APPLIED
+ 0004 01 NOMINAL CHIRP REPLICA USED
+ 0005 01 RECONSTRUCTED CHIRP USED
+ 0006 01 SLANT RANGE TO GROUND RANGE CONVERSION APPLIED
+025120 0004 0000 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS GREATER THAN THE ACCEPTABLE THRESHOLD
+ 0001 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS LESS THAN THE ACCEPTABLE THRESHOLD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025122 0004 0000 01 HARDWARE CONFIGURATION FOR RF IS A
+ 0001 01 HARDWARE CONFIGURATION FOR RF IS B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025123 0004 0000 01 HARDWARE CONFIGURATION FOR HPA IS A
+ 0001 01 HARDWARE CONFIGURATION FOR HPA IS B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025124 0004 0000 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS GREATER THAN THE ACCEPTABLE THRESHOLD
+ 0001 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS LESS THAN THE ACCEPTABLE THRESHOLD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025144 0013 0001 01 PIXEL IS AFFECTED BY RFI EFFECTS
+ 0002 02 PIXEL IS LOCATED IN THE HEXAGONAL ALIAS DIRECTION CENTRED ON
+ SUN ALIAS
+ 0003 02 PIXEL IS CLOSE TO THE BORDER DELIMITING THE EXTENDED ALIAS F
+ REE ZONE
+ 0004 01 PIXEL IS INSIDE THE EXTENDED ALIAS FREE ZONE
+ 0005 01 PIXEL IS INSIDE THE EXCLUSIVE OF ALIAS FREE ZONE
+ 0006 02 PIXEL IS LOCATED IN ZONE WHERE A MOON ALIAS WAS RECONSTRUCTE
+ D
+ 0007 02 PIXEL IS LOCATED IN ZONE WHERE SUN REFLECTION HAS BEEN DETEC
+ TED
+ 0008 01 PIXEL IS LOCATED IN ZONE WHERE SUN ALIAS WAS RECONSTRUCTED
+ 0009 02 FLAT TARGET TRANSFORMATION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION OF THIS PIXEL
+ 0010 03 SCENE HAS BEEN COMBINED WITH AN ADJUSTMENT SCENE IN OPOSITE
+ POLARISATION DURING IMAGE RECONSTRUCTION TO ACCOUNT FOR CROS
+ S-POLARISATION LEAKAGE
+ 0011 02 DIRECT MOON CORRECTION HAS BENN PERFORMED DURING IMAGE RECON
+ STRUCTION OF THIS PIXEL
+ 0012 02 REFLECTED SUN CORRECTION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION IF THIS PIXEL
+ 0013 02 DIRECT SUN CORRECTION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION OF THIS IMAGE
+026010 0025 0001 01 0100 INCLUDED
+ 0002 01 0200 INCLUDED
+ 0003 01 0300 INCLUDED
+ 0004 01 0400 INCLUDED
+ 0005 01 0500 INCLUDED
+ 0006 01 0600 INCLUDED
+ 0007 01 0700 INCLUDED
+ 0008 01 0800 INCLUDED
+ 0009 01 0900 INCLUDED
+ 0010 01 1000 INCLUDED
+ 0011 01 1100 INCLUDED
+ 0012 01 1200 INCLUDED
+ 0013 01 1300 INCLUDED
+ 0014 01 1400 INCLUDED
+ 0015 01 1500 INCLUDED
+ 0016 01 1600 INCLUDED
+ 0017 01 1700 INCLUDED
+ 0018 01 1800 INCLUDED
+ 0019 01 1900 INCLUDED
+ 0020 01 2000 INCLUDED
+ 0021 01 2100 INCLUDED
+ 0022 01 2200 INCLUDED
+ 0023 01 2300 INCLUDED
+ 0024 01 2400 INCLUDED
+ 0025 01 UNKNOWN MIXTURE OF HOURS
+029001 0006 0000 01 GNOMONIC PROJECTION
+ 0001 01 POLAR STEREOGRAPHIC PROJECTION
+ 0002 01 LAMBERT'S CONFORMAL CONIC PROJECTION
+ 0003 01 MERCATOR'S PROJECTION
+ 0004 01 SCANNING CONE (RADAR)
+ 0007 01 MISSING VALUE
+029002 0004 0000 01 CARTESIAN
+ 0001 01 POLAR
+ 0002 01 OTHER
+ 0007 01 MISSING VALUE
+030031 0013 0000 01 PPI
+ 0001 01 COMPOSITE
+ 0002 01 CAPPI
+ 0003 01 VERTICAL SECTION
+ 0004 01 ALPHANUMERIC DATA
+ 0005 01 MAP OF SUBJECT CLUTTER
+ 0006 01 MAP
+ 0007 01 TEST PICTURE
+ 0008 01 COMMENTS
+ 0009 01 MAP OF GROUND OCCULTATION
+ 0010 01 MAP OF RADAR BEAM HEIGHT
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+030032 0009 0001 01 MAP
+ 0002 01 SATELLITE IR
+ 0003 01 SATELLITE VIS
+ 0004 01 SATELLITE WV
+ 0005 01 SATELLITE MULTISPECTRAL
+ 0006 01 SYNOPTIC OBSERVATIONS
+ 0007 01 FORECAST PARAMETERS
+ 0008 01 LIGHTNING DATA
+ 0015 01 OTHER DATA
+031021 0004 0001 01 1 BIT INDICATOR OF QUALITY, 0= GOOD; 1=SUSPECT OR BAD
+ 0002 02 2 BIT INDICATOR OF QUALITY, 0= GOOD; 1= SLIGHTLY SUSPECTED;
+ 2= HIGHLY SUSPECTED; 3=BAD
+ 0007 01 PERCENTAGE CONFIDENCE
+ 0063 01 MISSING VALUE
+031031 0001 0001 01 DATA NOT PRESENT
+033002 0004 0000 01 DATA NOT SUSPECT
+ 0001 01 DATA SUSPECT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033003 0005 0000 01 DATA NOT SUSPECT
+ 0001 01 DATA SLIGHTLY SUSPECT
+ 0002 01 DATA HIGHTLY SUSPECT
+ 0003 01 DATA CONSIDERED UNFIT FOR USE
+ 0007 01 MISSING VALUE
+033005 0023 0001 01 NO AUTOMATED METEOROLOGICAL DATA CHECKS PERFORMED
+ 0002 01 PRESSURE DATA SUSPECT
+ 0003 01 WIND DATA SUSPECT
+ 0004 01 DRY-BULB TEMPERATURE DATA SUSPECT
+ 0005 01 WET-BULB TEMPERATURE DATA SUSPECT
+ 0006 01 HUMIDITY DATA SUSPECT
+ 0007 01 GROUND TEMPERATURE DATA SUSPECT
+ 0008 01 SOIL TEMPERATURE (DEPTH 1) DATA SUSPECT
+ 0009 01 SOIL TEMPERATURE (DEPTH 2) DATA SUSPECT
+ 0010 01 SOIL TEMPERATURE (DEPTH 3) DATA SUSPECT
+ 0011 01 SOIL TEMPERATURE (DEPTH 4) DATA SUSPECT
+ 0012 01 SOIL TEMPERATURE (DEPTH 5) DATA SUSPECT
+ 0013 01 CLOUD DATA SUSPECT
+ 0014 01 VISIBILITY DATA SUSPECT
+ 0015 01 PRESENT WEATHER DATA SUSPECT
+ 0016 01 LIGHTNING DATA SUSPECT
+ 0017 01 ICE DEPOSIT DATA SUSPECT
+ 0018 01 PRECIPITATION DATA SUSPECT
+ 0019 01 STATE OF GROUND DATA SUSPECT
+ 0020 01 SNOW DATA SUSPECT
+ 0021 01 WATER CONTENT DATA SUSPECT
+ 0022 01 EVAPORATION/EVAPOTRANSPIRATION DATA SUSPECT
+ 0023 01 SUNSHINE DATA SUSPECT
+033006 0005 0000 01 SELF-CHECK OK
+ 0001 01 AT LEAST ONE WARNING ACTIVE, NO ALARMS
+ 0002 01 AT LEAST ONE ALARM ACTIVE
+ 0003 01 SENSOR FAILURE
+ 0007 01 MISSING VALUE
+033015 0016 0000 01 PASSED ALL CHECKS
+ 0001 01 MISSING-DATA CHECK
+ 0002 01 DESCENDING/REASCENDING BALLOON CHECK
+ 0003 01 DATA PLAUSIBILITY CHECK (ABOVE LIMITS)
+ 0004 01 DATA PLAUSIBILITY CHECK (BELOW LIMITS)
+ 0005 01 SUPERADIABATIC LAPSE RATE CHECK
+ 0006 01 LIMITING ANGLES CHECK
+ 0007 01 ASCENSION RATE CHECK
+ 0008 01 EXCESSIVE CHANGE FROM PREVIOUS FLIGHT
+ 0009 01 BALLOON OVERHEAD CHECK
+ 0010 01 WIND SPEED CHECK
+ 0011 01 WIND DIRECTION CHECK
+ 0012 01 DEPENDENCY CHECK
+ 0013 01 DATA VALID BUT MODIFIED
+ 0014 01 DATA OUTLIER CHECK
+ 0063 01 MISSING DATA
+033020 0008 0000 01 GOOD
+ 0001 01 INCONSISTENT
+ 0002 01 DOUBTFUL
+ 0003 01 WRONG
+ 0004 01 NOT CHECKED
+ 0005 01 HAS BEEN CHECKED
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+033021 0004 0000 01 WITHIN LIMITS
+ 0001 01 OUTSIDE LIMITS
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033022 0004 0000 01 GOOD (SEVERAL IDENTICAL REPORTS HAVE BEEN RECEIVED)
+ 0001 01 DUBIOUS (NO IDENTICAL REPORT HAVE BEEN RECEIVED)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033023 0004 0000 01 RELIABLE (LOCATION WAS MADE OVER TWO SATELLITE PASSES)
+ 0001 01 LATEST KNOWN (NO LOCATION OVER CORRESPONDING PASS)
+ 0002 01 DUBIOUS
+ 0003 01 MISSING VALUE
+033024 0010 0000 01 RESERVED
+ 0001 01 EXELLENT - WITHIN 3 METRES
+ 0002 01 GOOD - WITHIN 10 METRES
+ 0003 01 FAIR - WITHIN 20 METRES
+ 0004 01 POOR - MORE THAN 20 METRES
+ 0005 01 EXELLENT -WITHIN 10 FEET
+ 0006 01 GOOD WITHIN-30 FEET
+ 0007 01 FAIR WITHIN 60 FEET
+ 0008 01 POOR - MORE THAN 60 FEET
+ 0015 01 MISSING VALUE
+033025 0005 0000 01 TIME INTERPOLATED, LATITUDE AND LONGITUDE REPORTED
+ 0001 01 TIME REPORTED, LATITUDE AND LONGITUDE INTERPOLATED
+ 0002 01 TIME, LATITUDE AND LONGITUDE INTERPOLATED
+ 0003 01 TIME, LATITUDE AND LONGITUDE REPORTED
+ 0007 01 MISSING VALUE
+033026 0010 0000 01 NORMAL OPERATIONS - MEASUREMENT MODE
+ 0001 01 NORMAL OPERATIONS - NON-MEASUREMENT MODE
+ 0002 01 SMALL RH
+ 0003 01 HUMIDITY ELEMENT IS WET
+ 0004 01 HUMIDITY ELEMENT IS CONTAMINATED
+ 0005 01 HEATER FAIL
+ 0006 01 HEATER FAIL AND WET/CONTAMINATED HUMIDITY ELEMENT
+ 0007 01 SINGLE VALIDITY BAD
+ 0008 01 NUMERIC ERROR
+ 0063 01 MISSING VALUE
+033027 0005 0000 01 RADIUS >= 1500 M
+ 0001 01 500 M <= RADIUS < 1500 M
+ 0002 01 250 M <= RADIUS < 500 M
+ 0003 01 RADIUS < 250 M
+ 0007 01 MISSING VALUE
+033028 0006 0000 01 RESERVED
+ 0001 01 NOMINAL
+ 0002 01 DEGRADED BY SW ERROR; ANY ERROR REPORTED BY THE ALGORITHMS
+ 0003 01 DEGRADED BY INSTRUMENT ERROR
+ 0004 01 DEGRADED BY CORRUPTED/MISSING ADF
+ 0007 01 MISSING
+033030 0007 0001 01 DO NOT USE SCAN FOR PRODUCT GENERATION
+ 0002 01 TIME SEQUENCE ERROR DETECTED WITH THIS SCAN
+ 0003 01 DATA GAP PRECEDES THIS SCAN
+ 0004 01 NO CALIBRATION
+ 0005 01 NO EARTH LOCATION
+ 0006 01 FIRST GOOD TIME FOLLOWING A CLOCK UPDATE
+ 0007 01 INSTRUMENT STATUS CHANGED WITH THIS SCAN
+033031 0021 0001 02 TIME FIELD IS BAD BUT CAN PROBABLY BE INFERRED FROM THE PREV
+ IOUS GOOD TIME
+ 0002 02 TIME FIELD IS BAD AND CAN�~@~YT BE INFERRED FROM THE PREVIOU
+ S GOOD TIME
+ 0003 04 THIS RECORD STARTS A SEQUENCE THAT IS INCONSISTENT WITH PREV
+ IOUS TIMES (I.E. THERE IS A TIME DISCONTINUITY). THIS MAY OR
+ MAY NOT BE ASSOCIATED WITH A SPACECRAFT CLOCK UPDATE (SEE S
+ CAN LINE STATUS FLAGS FOR ATOVS)
+ 0004 02 START OF A SEQUENCE THAT APPARENTLY REPEATS SCAN TIMES THAT
+ HAVE BEEN PREVIOUSLY ACCEPTED
+ 0005 01 SCAN LINE WAS NOT CALIBRATED BECAUSE OF BAD TIME
+ 0006 03 SCAN LINE WAS CALIBRATED USING FEWER THAN THE PREFERRED NUMB
+ ER OF SCAN LINES BECAUSE OF PROXIMATY TO START OR END OF DAT
+ A OR TO A DATA GAP
+ 0007 02 SCAN LINE WAS NOT CALIBRATED BECAUSE OF BAD OR INSUFFICIENT
+ PRT DATA
+ 0008 01 SCAN LINE WAS CALIBRATED BUT WITH MARGINAL PRT DATA
+ 0009 01 SOME UNCALIBRATED CHANNELS ON THIS SCAN
+ 0010 01 UNCALIBRATED DUE TO INSTRUMENT MODE
+ 0011 02 QUESTIONABLE CALIBRATION BECAUSE OF ANTENNA POSITION ERROR O
+ F SPACE VIEW
+ 0012 02 QUESTIONABLE CALIBRATION BECAUSE OF ANTENNA POSITION ERROR O
+ F BLACK BODY
+ 0013 01 NOT EARTH LOCATED BECAUSE OF BAD TIME
+ 0014 03 EARTH LOCATION QUESTIONABLE BECAUSE OF
+ QUESTIONABLE TIME CODE (SEE TIME PROBLEM
+ CODE BITS)
+ 0015 02 EARTH LOCATION QUESTIONABLE - ONLY MARGINAL AGREEMENT
+ WITH REASONABLENESS CHECK
+ 0016 01 EARTH LOCATION QUESTIONABLE - FAILS REASONABLENESS CHECK
+ 0017 02 EARTH LOCATION QUESTIONABLE BECAUSE OF ANTENNA POSITION CHEC
+ K
+ 0018 01 SCAN LINE CALIBRATION COLD BLACK BODY
+ 0019 01 SCAN LINE CALIBRATION WARM BLACK BODY
+ 0020 01 SCAN LINE CALIBRATION SPACE VIEW
+ 0021 01 EARTH VIEW
+033032 0006 0001 01 NO GOOD BLACKBODY COUNTS FOR SCAN LINE
+ 0002 01 NO GOOD SPACE VIEW COUNTS FOR THIS LINE
+ 0003 01 NO GOOD PRTS FOR THIS LINE
+ 0004 01 SOME BAD BLACKBODY VIEW COUNTS FOR THIS LINE
+ 0005 01 SOME BAD SPACE VIEW COUNTS FOR THIS LINE
+ 0006 01 SOME BAD PRT TEMPS ON THIS LINE
+033033 0023 0001 01 SET IF SECONDARY CALIBRATION USED
+ 0002 02 BRIGHTNESS TEMPERATURE IN CHANNEL 1 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0003 02 BRIGHTNESS TEMPERATURE IN CHANNEL 2 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0004 02 BRIGHTNESS TEMPERATURE IN CHANNEL 3 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0005 02 BRIGHTNESS TEMPERATURE IN CHANNEL 4 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0006 02 BRIGHTNESS TEMPERATURE IN CHANNEL 5 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0007 02 BRIGHTNESS TEMPERATURE IN CHANNEL 6 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0008 02 BRIGHTNESS TEMPERATURE IN CHANNEL 7 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0009 02 BRIGHTNESS TEMPERATURE IN CHANNEL 8 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0010 02 BRIGHTNESS TEMPERATURE IN CHANNEL 9 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0011 02 BRIGHTNESS TEMPERATURE IN CHANNEL 10 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0012 02 BRIGHTNESS TEMPERATURE IN CHANNEL 11 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0013 02 BRIGHTNESS TEMPERATURE IN CHANNEL 12 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0014 02 BRIGHTNESS TEMPERATURE IN CHANNEL 13 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0015 02 BRIGHTNESS TEMPERATURE IN CHANNEL 14 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0016 02 BRIGHTNESS TEMPERATURE IN CHANNEL 15 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0017 02 BRIGHTNESS TEMPERATURE IN CHANNEL 16 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0018 02 BRIGHTNESS TEMPERATURE IN CHANNEL 17 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0019 02 BRIGHTNESS TEMPERATURE IN CHANNEL 18 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0020 02 BRIGHTNESS TEMPERATURE IN CHANNEL 19 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0021 02 BRIGHTNESS TEMPERATURE IN CHANNEL 20 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0022 01 SET IF ALL CHANNELS ARE MISSING
+ 0023 01 SUSPECT
+033035 0010 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND PA
+ SSED
+ 0002 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND DE
+ LETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND FA
+ ILED
+ 0005 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND RE
+ -INSERTED
+ 0006 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND N
+ OT MANUALLY CHECCKED
+ 0007 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE
+ AND MANUALLY CHECKED AND FAILED
+ 0008 01 MANUALLY CHECKED AND FAILED
+ 0015 01 MISSING VALUE
+033037 0019 0001 01 U DEPARTURE FROM GUESS
+ 0002 01 V DEPARTURE FROM GUESS
+ 0003 01 U & V DEPARTURE FROM GUESS
+ 0004 01 U ACCELERATION
+ 0005 01 V ACCELERATION
+ 0006 01 U & V ACCELERATION
+ 0007 01 POSSIBLE LAND FEATURE
+ 0008 01 U ACCELERATION AND POSSIBLE LAND FEATURE
+ 0009 01 V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0010 01 U & V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0011 01 BAD WIND GUESS
+ 0012 01 CORRELATION FAILURE
+ 0013 01 SEARCH BOX OFF EDGE OF AREA
+ 0014 01 TARGET BOX OFF EDGE OF AREA
+ 0015 01 PIXEL BRIGHTNESS OUT OF BOUNDS (NOISY LINE)
+ 0016 01 TARGET OUTSIDE OF LAT/LONG BOX
+ 0017 01 TARGET OUTSIDE OF PRESSURE MIN/MAX
+ 0018 01 AUTOEDITOR FLAGGED SLOW VECTOR
+ 0019 01 AUTOEDITOR FLAGGED VECTORS
+033038 0009 0001 01 TOTAL ZENITH DELAY QUALITY IS CONSIDERED POOR
+ 0002 01 GALILEO SATELLITES USED
+ 0003 01 GLONASS SATELLITES USED
+ 0004 01 GPS SATELLITES USED
+ 0005 01 METEOROLOGICAL DATA APPLIED
+ 0006 01 ATMOSPHERIC LOADING CORRECTION APPLIED
+ 0007 01 OCEAN TIDE LOADING APPLIED
+ 0008 01 CLIMATE QUALITY DATA PROCESSING
+ 0009 01 NEAR-REAL TIME DATA PROCESSING
+033039 0009 0001 01 NON-NOMINAL QUALITY
+ 0002 01 OFFLINE PRODUCT
+ 0003 01 ASCENDING OCCULTATION FLAG
+ 0004 01 EXCESS PHASE PROCESSING NON-NOMINAL
+ 0005 01 BENDING ANGLE PROCESSING NON-NOMINAL
+ 0006 01 REFRACTIVITY PROCESSING NON-NOMINAL
+ 0007 01 METEOROLOGICAL PROCESSING NON-NOMINAL
+ 0014 01 BACKGROUND PROFILE NON-NOMINAL
+ 0015 01 BACKGROUND (I.E. NOT RETRIEVED) PROFILE PRESENT
+033041 0004 0000 01 THE FOLLOWING VALUE IS THE TRUE VALUE
+ 0001 02 THE FOLLOWING VALUE IS HIGHER THAN THE TRUE VALUE
+ (THE MEASUREMENT HIT THE LOWER LIMIT OF THE INSTRUMENT)
+ 0002 02 THE FOLLOWING VALUE IS LOWER THAN THE TRUE VALUE
+ (THE MEASUREMENT HIT THE HIGHER LIMIT OF THE INSTRUMENT)
+ 0003 01 MISSING VALUE
+033042 0005 0000 01 EXCLUSIVE LOWER LIMIT (>)
+ 0001 01 INCLUSIVE LOWER LIMIT (>=)
+ 0002 01 EXCLUSIVE UPPER LIMIT (<)
+ 0003 01 INCLUSIVE UPPER LIMIT (=<)
+ 0007 01 MISSING VALUE
+033043 0004 0001 02 SEA MDS. NADIR ONLY SST RETRIEVAL USED 3.7 MICRON
+ CHANNEL. LAND MDS RESERVED
+ 0002 02 SEA MDS. DUAL VIEW SST RETRIEVAL USED 3.7 MICRON
+ CHANNEL. LAND MDS RESERVED.
+ 0003 01 NADIR VIEW CONTAINS DAY TIME DATA
+ 0004 01 FORWARD VIEW CONTAINS DAY TIME DATA
+033044 0014 0001 01 INPUT DATA MEAN OUTSIDE NOMINAL RANGE FLAG
+ 0002 01 INPUT DATA STANDARD DEVIATION OUTSIDE NOMINAL RANGE FLAG
+ 0003 01 NUMBER OF INPUT DATA GAPS > THRESHOLD VALUE
+ 0004 01 PERCENTAGE OF MISSING LINES > THRESHOLD VALUE
+ 0005 02 DOPPLER CENTROID UNCERTAIN. CONFIDENCE MEASURE < SPECIFIC VA
+ LUE
+ 0006 02 DOPPLER AMBIGUITY ESTIMATE UNCERTAIN. CONFIDENCE MEASURE < S
+ PECIFIC VALUE
+ 0007 01 OUTPUT DATA MEAN OUTSIDE NOMINAL RANGE FLAG
+ 0008 01 OUTPUT DATA STANDARD DEVIATION OUTSIDE NOMINAL RANGE FLAG
+ 0009 01 CHIRP RECONSTRUCTION FAILED OR IS OF LOW QUALITY FLAG
+ 0010 01 DATA SET MISSING
+ 0011 01 INVALID DOWNLINK PARAMETERS
+ 0012 02 AZIMUTH CUT-OFF ITERATION COUNT. THE AZIMUTH CUT-OFF FIT DID
+ NOT CONVERGE WITHIN A MINIMUM NUMBER OF ITERATIONS
+ 0013 02 AZIMUTH CUT-OFF FIT DID NOT CONVERGE WITHIN A MINIMUM
+ NUMBER OF ITERATIONS
+ 0014 03 PHASE INFORMATION CONFIDENCE MEASURE. THE IMAGINARY SPECTRAL
+ PEAK IS LESS THAN A MINIMUM THRESHOLD, OR THE ZERO LAG SHIFT
+ IS GREATER THAN A MINIMUM THRESHOLD
+033047 0026 0001 01 ERROR DETECTED AND ATTEMPTS TO RECOVER MADE
+ 0002 01 ANOMALY IN ON-BOARD DATA HANDLING (OBDH) VALUE DETECTED
+ 0003 02 ANOMALY IN ULTRA STABLE OSCILLATOR PROCESSING (USOP) VALUE D
+ ETECTED
+ 0004 01 ERRORS DETECTED BY ON-BOARD COMPUTER
+ 0005 01 AUTOMATIC GAIN CONTROL (AGC) OUT OF RANGE
+ 0006 01 RX DELAY FAULT. RX DISTANCE OUT OF RANGE
+ 0007 01 WAVE FORM SAMPLES FAULT IDENTIFIER. ERROR
+ 0012 01 BRIGHTNESS TEMPERATURE (CHANNEL 1) OUT OF RANGE
+ 0013 01 BRIGHTNESS TEMPERATURE (CHANNEL 2) OUT OF RANGE
+ 0014 01 RESERVED
+ 0015 01 KU OCEAN RETRACKING ERROR
+ 0016 01 S OCEAN RETRACKING ERROR
+ 0017 01 KU ICE 1 RETRACKING ERROR
+ 0018 01 S ICE 1 RETRACKING ERROR
+ 0019 01 KU ICE 2 RETRACKING ERROR
+ 0020 01 S ICE 2 RETRACKING ERROR
+ 0021 01 KU SEA ICE RETRACKING ERROR
+ 0022 01 ARITHMETIC FAULT ERROR
+ 0023 01 METEO DATA STATE. NO MAP
+ 0024 01 METEO DATA STATE. 1 MAP
+ 0025 01 METEO DATA STATE 2 MAPS DEGRADED
+ 0026 01 METEO DATA STATE 2 MAPS NOMINAL
+ 0027 01 ORBIT PROPAGATOR STATUS FOR PROPAGATION MODE, SEVERAL ERRORS
+ 0028 02 ORBIT PROPAGATOR STATUS FOR PROPAGATION MODE, WARNING DETECT
+ ED
+ 0029 02 ORBIT PROPAGATOR STATUS FOR INITIALISATION MODE, SEVERAL ERR
+ ORS
+ 0030 02 ORBIT PROPAGATOR STATUS FOR INITIALISATION MODE, WARNING DET
+ ECTED
+033048 0004 0000 01 INVERSION SUCCESSFUL
+ 0001 01 INVERSION NOT SUCCESSFUL
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033049 0004 0000 01 EXTERNAL WIND DIRECTION USED DURING INVERSION
+ 0001 01 EXTERNAL WIND DIRECTION NOT USED DURING INVERSION
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033050 0008 0000 01 UNQUALIFIED
+ 0001 01 CORRECT VALUE (ALL CHECKS PASSED)
+ 0002 02 PROBABLY GOOD BUT VALUE INCONSISTENT WITH STATISTICS (DIFFER
+ FROM CLIMATOLOGY)
+ 0003 01 PROBABLY BAD (SPIKE, GRADIENT, �~E IF OTHER TESTS PASSED)
+ 0004 02 BAD VALUE, IMPOSSIBLE VALUE (OUT OF SCALE, VERTICAL
+ INSTABILITY, CONSTANT PROFILE)
+ 0005 01 VALUE MODIFIED DURING QUALITY CONTROL
+ 0008 01 INTERPOLATED VALUE
+ 0015 01 MISSING VALUE
+033052 0020 0001 01 DATA BLOCK 1 INVALID (S BAND)
+ 0002 01 DATA BLOCK 2 INVALID (S BAND)
+ 0003 01 DATA BLOCK 3 INVALID (S BAND)
+ 0004 01 DATA BLOCK 4 INVALID (S BAND)
+ 0005 01 DATA BLOCK 5 INVALID (S BAND)
+ 0006 01 DATA BLOCK 6 INVALID (S BAND)
+ 0007 01 DATA BLOCK 7 INVALID (S BAND)
+ 0008 01 DATA BLOCK 8 INVALID (S BAND)
+ 0009 01 DATA BLOCK 9 INVALID (S BAND)
+ 0010 01 DATA BLOCK 10 INVALID (S BAND)
+ 0011 01 DATA BLOCK 11 INVALID (S BAND)
+ 0012 01 DATA BLOCK 12 INVALID (S BAND)
+ 0013 01 DATA BLOCK 13 INVALID (S BAND)
+ 0014 01 DATA BLOCK 14 INVALID (S BAND)
+ 0015 01 DATA BLOCK 15 INVALID (S BAND)
+ 0016 01 DATA BLOCK 16 INVALID (S BAND)
+ 0017 01 DATA BLOCK 17 INVALID (S BAND)
+ 0018 01 DATA BLOCK 18 INVALID (S BAND)
+ 0019 01 DATA BLOCK 19 INVALID (S BAND)
+ 0020 01 DATA BLOCK 20 INVALID (S BAND)
+033053 0020 0001 01 DATA BLOCK 1 INVALID (KU BAND)
+ 0002 01 DATA BLOCK 2 INVALID (KU BAND)
+ 0003 01 DATA BLOCK 3 INVALID (KU BAND)
+ 0004 01 DATA BLOCK 4 INVALID (KU BAND)
+ 0005 01 DATA BLOCK 5 INVALID (KU BAND)
+ 0006 01 DATA BLOCK 6 INVALID (KU BAND)
+ 0007 01 DATA BLOCK 7 INVALID (KU BAND)
+ 0008 01 DATA BLOCK 8 INVALID (KU BAND)
+ 0009 01 DATA BLOCK 9 INVALID (KU BAND)
+ 0010 01 DATA BLOCK 10 INVALID (KU BAND)
+ 0011 01 DATA BLOCK 11 INVALID (KU BAND)
+ 0012 01 DATA BLOCK 12 INVALID (KU BAND)
+ 0013 01 DATA BLOCK 13 INVALID (KU BAND)
+ 0014 01 DATA BLOCK 14 INVALID (KU BAND)
+ 0015 01 DATA BLOCK 15 INVALID (KU BAND)
+ 0016 01 DATA BLOCK 16 INVALID (KU BAND)
+ 0017 01 DATA BLOCK 17 INVALID (KU BAND)
+ 0018 01 DATA BLOCK 18 INVALID (KU BAND)
+ 0019 01 DATA BLOCK 19 INVALID (KU BAND)
+ 0020 01 DATA BLOCK 20 INVALID (KU BAND)
+033060 0004 0000 01 PARAMETER=GOOD
+ 0001 01 PARAMETER=BAD
+ 0002 01 PARAMETER=RESERVED
+ 0003 01 MISSING
+033195 0004 0000 01 DEALIASING NOT USED
+ 0001 01 DEALIASING USED
+ 0002 01 RESERVED
+ 0003 01 MISSING
+033205 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033206 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033207 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033208 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033209 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033220 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 REPORT REJECTED THROUGH THE NAMELIST
+ 0017 01 MODEL SUR. TOO FAR FROM STAT. ALT.
+ 0018 01 MISSING STATION ALTITUDE
+ 0019 01 REPORT OVER SEA
+ 0020 01 REPORT OVER LAND
+ 0021 01 REDUNDANT REPORT
+ 0022 01 TIME OUT OF RANGE
+ 0023 01 VERTICAL POSITION OUT OF RANGE
+ 0024 01 HORIZONTAL POSITION OUT OF RANGE
+ 0025 01 ACTIVATED BY WHITELIST
+ 0026 01 ACTIVATED DUE TO RDB FLAG
+ 0027 01 REJECTED DUE TO RDB FLAG
+ 0028 01 BAD REPORTING PRACTICE
+ 0029 01 ALL DATA REJECTED
+ 0030 01 NO DATA IN THE REPORT
+033221 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033222 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033223 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033224 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033225 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033226 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033227 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033228 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033229 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 THINNED REPORT
+033230 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033232 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 BLACKLISTED DUE TO DISTANCE FROM REF. POINT
+ 0015 01 BLACKLISTED DUE TO MODEL OROGRAPHY
+ 0016 01 BLACKLISTED DUE TO LAND/SEA MASK
+ 0017 01 STATION ALTITUDE BLACKLISTED
+ 0018 01 LONGITUDE BLACKLISTED
+ 0019 01 LATITUDE BLACKLISTED
+ 0020 01 TIME BLACKLISTED
+ 0021 01 DATE BLACKLISTED
+ 0022 01 INSTRUMENT TYPE BLACKLISTED
+ 0023 01 CODE TYPE BLACKLISTED
+ 0024 01 STATION ID BLACKLISTED
+ 0025 01 BLACKLISTED DUE TO FIRST GUESS DEPARTURE
+ 0026 01 BLACKLISTED DUE TO OBSERVED VALUE
+ 0027 01 BLACKLISTED DUE TO TYPE OF VERTICAL COORDINATE
+ 0028 01 BLACKLISTED DUE TO PRESSURE CODE
+ 0029 01 VARIABLE NAME BLACKLISTED
+ 0030 01 MONTHLY MONITORING
+033233 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 REPORT BLACK LISTED
+ 0028 01 REPORT REJECTED
+ 0029 01 REPORT PASSIVE
+ 0030 01 REPORT ACTIVE
+033234 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 DATUM BLACK LISTED
+ 0028 01 DATUM REJECTED
+ 0029 01 DATUM PASSIVE
+ 0030 01 DATUM ACTIVE
+033236 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 DATUM REJECTED DUE TO REJECTED REPORT
+ 0006 01 COMBINED FLAGGING
+ 0007 01 DATUM REJECTED DUE TO NAMELIST
+ 0008 01 VERTICAL COORDINATE CHANGE FROM Z TO P
+ 0009 01 VERTICAL CONSISTENCY CHECK
+ 0010 01 LEVEL SELECTION
+ 0011 01 MULTI LEVEL CHECK
+ 0012 01 TOO MANY SURFACE DATA/LEVELS
+ 0013 01 DUPLICATED DATUM/LEVEL
+ 0014 01 NOT AN ANALYSIS VARIABLE
+ 0015 01 REPORT OVER SEA
+ 0016 01 REPORT OVER LAND
+ 0017 01 REDUNDANT LEVEL
+ 0018 01 REDUNDANT DATUM
+ 0019 01 TOO BIG OBSERVATION ERROR
+ 0020 01 TOO BIG DEPARTURE IN ASSIMILATION
+ 0021 01 TOO BIG FIRST GUESS DEPARTURE
+ 0022 01 REFERENCE LEVEL POSITION OUT OF RANGE
+ 0023 01 VERTICAL POSITION OUT OF RANGE
+ 0024 01 BAD REPORTING PRACTICE
+ 0025 01 ACTIVATED BY WHITELIST
+ 0026 01 ACTIVATED DUE TO RDB FLAG
+ 0027 01 REJECTED DUE TO RDB FLAG
+ 0028 01 MISSING FIRST GUESS VALUE
+ 0029 01 MISSING OBSERVED VALUE
+ 0030 01 MISSING VERTICAL COORDINATE
+033237 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033238 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033239 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033240 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033243 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033244 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033245 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 LAYER FORMED BY SUMMING UP
+ 0029 01 LAYER FORMED BY THINNING UP
+ 0030 01 NOT PREDEFINED LAYER
+033246 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033247 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033248 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033249 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 BLACKLISTED DUE TO FIRST GUESS DEPARTURE
+ 0025 01 BLACKLISTED DUE TO OBSERVED VALUE
+ 0026 01 BLACKLISTED DUE TO TYPE OF VERTICAL COORDINATE
+ 0027 01 BLACKLISTED DUE TO DISTANCE FROM REFERENCE POINT
+ 0028 01 BLACKLISTED DUE TO PRESSURE CODE
+ 0029 01 VARIABLE BLACKLISTED
+ 0030 01 PRESSURE BLACKLISTED
+033252 0010 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND PA
+ SSED
+ 0002 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND DE
+ LETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND FA
+ ILED
+ 0005 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND RE
+ -INSERTED
+ 0006 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND N
+ OT MANUALLY CHECCKED
+ 0007 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND M
+ ANUALLY CHECKED AND FAILED
+ 0008 01 MANUALLY CHECKED AND FAILED
+ 0015 01 MISSING VALUE
+033254 0019 0001 01 U DEPARTURE FROM GUESS
+ 0002 01 V DEPARTURE FROM GUESS
+ 0003 01 U & V DEPARTURE FROM GUESS
+ 0004 01 U ACCELERATION
+ 0005 01 V ACCELERATION
+ 0006 01 U & V ACCELERATION
+ 0007 01 POSSIBLE LAND FEATURE
+ 0008 01 U ACCELERATION AND POSSIBLE LAND FEATURE
+ 0009 01 V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0010 01 U & V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0011 01 BAD WIND GUESS
+ 0012 01 CORRELATION FAILURE
+ 0013 01 SEARCH BOX OFF EDGE OF AREA
+ 0014 01 TARGET BOX OFF EDGE OF AREA
+ 0015 01 PIXEL BRIGHTNESS OUT OF BOUNDS (NOISY LINE)
+ 0016 01 TARGET OUTSIDE OF LAT/LONG BOX
+ 0017 01 TARGET OUTSIDE OF PRESSURE MIN/MAX
+ 0018 01 AUTOEDITOR FLAGGED SLOW VECTOR
+ 0019 01 AUTOEDITOR FLAGGED VECTORS
+035000 0011 0011 01 000-099 INTERNATIONAL FM CODES
+ 0001 01 100-199 RA I CODES
+ 0002 01 200-299 RA II CODES
+ 0003 01 300-399 RA III CODES
+ 0004 01 400-499 RA IV CODES
+ 0005 01 500-599 RA V CODES
+ 0006 01 600-699 RA VI CODES
+ 0007 01 700-799 ANTARCTIC CODES
+ 0008 01 800-999 RESERVED
+ 0009 01 1000-1022 NOT USED
+ 1023 01 MISSING VALUE
+035001 0004 0000 01 REAL TIME
+ 0001 01 NEAR-REAL TIME
+ 0002 01 NON-REAL TIME
+ 0007 01 MISSING VALUE
+035030 0010 0000 01 NO DISCREPANCIES
+ 0001 02 NON-COMPLIANCE WITH STANDARD AND RECOMMENDED PRACTICES
+ AND PROCEDURES INCLUDINGTHOSE OF MONITORING
+ 0002 02 CATALOGUES OF METEOROLOGICAL BULLETINS NOT UPDATED IN A TIME
+ LY MANNER
+ 0003 01 INCORRECT ROUTEING DIRECTORIES
+ 0004 01 LACK OF FLEXIBILITY IN THE ROUTEING ARRANGEMENTS
+ 0005 01 DEFICIENCIES IN THE OPERATION OF GTS CENTRES AND CIRCUITS
+ 0006 01 LOSS OF DATA OR DELAYS IN RELAYING DATA ON THE GTS
+ 0007 02 ROUTEING OF DATA DIFFERENT FROM THE ROUTEING PROVIDED IN THE
+ PLAN
+ 0008 01 VARIOUS MALPRACTICES
+ 0015 01 MISSING VALUE
+035031 0020 0001 01 SUFFICIENT AND ALL OF ACCEPTABLE QUALITY
+ 0002 01 SUFFICIENT BUT PARTLY OF ACCEPTABLE QUALITY
+ 0003 01 INSUFFICIENT BUT ALL OF ACCEPTABLE QUALITY
+ 0004 01 INSUFFICIENT AND OF UNACCEPTABLE QUALITY
+ 0005 01 SOME MESSAGES NOT COMPLETE
+ 0006 02 SUSPECT OR WRONGLY CODED GROUPS COULD NOT BE INTERPRETED CON
+ FIDENTLY
+ 0007 01 GROSS CODING ERRORS
+ 0008 01 TRANSMISSION SEQUENTIAL ORDER NOT OBSERVED
+ 0009 01 REPORT COMPLETELY GARBLED AND THUS DISCARDED
+ 0010 01 DEFICIENCIES IDENTIFIED AND RECTIFIED
+ 0011 01 DEFICIENCIES IDENTIFIED BUT NOT RECTIFIED
+ 0012 01 DEFICIENCIES NOT IDENTIFIED
+ 0013 01 MEASURING ERRORS
+ 0014 01 MUTUAL INCONSISTENCY
+ 0015 01 TEMPORAL INCONSISTENCY
+ 0016 01 FORECAST ERROR
+ 0017 01 BIAS
+ 0018 01 IMPROVE SYSTEM OF QUALITY CONTROL
+ 0019 01 EXPAND TRAINING PROGRAMMES
+ 0123 01 MISSING VALUE
+035032 0010 0001 01 DATA GROUPS MISSING DUE TO RADIO FADING
+ 0002 01 DATA GROUPS MISSING DUE TO OUTAGE OF CENTRE
+ 0003 01 DATA GROUPS MISSING DUE TO OUTAGE OF CIRCUIT
+ 0004 01 NON-IMPLEMENTATION OR MAINTENANCE OF REQUIRED RBSN DENSITY
+ 0005 01 SHORTAGE OF QUALIFIED STAFF TO MAN STATIONS
+ 0006 01 LACK OF CONSUMABLES
+ 0007 01 INSTRUMENT FAILURE
+ 0008 01 NON-ADHERENCE TO TELECOMMUNICATION PROCEDURES
+ 0009 01 SOME OBSERVING PROGRAMMES CEASED
+ 0015 01 MISSING VALUE
+035033 0012 0001 01 NO DEFICIENCY
+ 0002 01 OBSERVATIONS NOT MADE REGULARLY
+ 0003 01 OBSERVATIONS NOT MADE AT RIGHT TIME
+ 0004 01 OBSERVATIONS MADE BUT NOT DISSEMINATED
+ 0005 01 OBSERVATIONS MADE AND SENT TO INCORRECT USERS
+ 0006 01 COLLECTION NOT RECEIVED
+ 0007 01 COLLECTION TRANSMITTED LATE
+ 0008 01 COLLECTION NOT TRANSMITTED
+ 0009 02 DIFFICULTIES IN HF PROPAGATION AND SELECTION OF SUITABLE FRE
+ QUENCY
+ 0010 02 DIFFICULTIES IN MAINTENANCE OF COMMUNICATION EQUIPMENT AT RE
+ MOTE STATIONS
+ 0011 02 NO ALTERNATIVE ARRANGEMENT FOR ROUTEING METEOROLOGICAL OBSER
+ VATION
+ 0123 01 MISSING VALUE
+035034 0007 0001 01 SLIGHT IMPROVEMENT
+ 0002 01 SIGNIFICANT IMPROVEMENT
+ 0003 01 MOST SIGNIFICANT IMPROVEMENT
+ 0004 01 STEADY
+ 0005 01 DECREASING
+ 0006 01 EFFORTS REQUIRED TO IMPROVE NIGHT-TIME OBSERVATIONS
+ 0007 01 MISSING VALUE
+033035 0016 0000 01 RESERVED
+ 0001 01 BALLOON BURST
+ 0002 01 BALLOON FORCED DOWN BY ICING
+ 0003 01 LEAKING OR FLOATING BALLOON
+ 0004 01 WEAK OR FADING SIGNAL
+ 0005 01 BATTERY FAILURE
+ 0006 01 GROUND EQUIPMENT FAILURE
+ 0007 01 SIGNAL INTERFERENCE
+ 0008 01 RADIOSONDE FAILURE
+ 0009 01 EXCESSIVE MISSING DATA FRAMES
+ 0010 01 RESERVED
+ 0011 01 EXCESSIVE MISSING TEMPERATURE
+ 0012 01 EXCESSIVE MISSING PRESSURE
+ 0013 01 USER TERMINATED
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+040011 0004 0001 01 MEAN SEA SURFACE (MSS) INTERPOLATION FLAG
+ 0002 02 OCEAN TIDE SOLUTION 1 INTERPOLATION FLAG (0= 4 POINTS OVER O
+ CEAN, 1=LESS THAN 4 POINTS)
+ 0003 02 OCEAN TIDE SOLUTION 2 INTERPOLATION FLAG (0= 4 POINTS OVER O
+ CEAN, 1=LESS THAN 4 POINTS)
+ 0004 02 METEOROLOGICAL DATA INTERPOLATION FLAG (0= 4 POINTS OVER OCE
+ AN, 1=LESS THAN 4 POINTS)
+040012 0003 0001 01 18.7 GHZ BRIGHTNESS TEMPERATURE
+ 0002 01 23.8 GHZ BRIGHTNESS TEMPERATURE
+ 0003 01 34 GHZ BRIGHTNESS TEMPERATURE
+040013 0005 0000 01 INTERPOLATION WITH NO GAP BETWEEN JMR DATA
+ 0001 01 INTERPOLATION WITH GAP BETWEEN JMR DATA
+ 0002 01 EXTRAOLATION OF JMR DATA
+ 0003 01 FAILURE OF EXTRAPOLATION AND INTERPOLATION
+ 0007 01 MISSING VALUE
+049194 0014 0001 01 PASSED QUALITY CONTROL
+ 0002 01 OUTSIDE TIME WINDOW
+ 0003 01 ABOVE LAND
+ 0004 01 OUTSIDE ENTIRE GRID
+ 0005 01 WAVE HEIGHT OUT OF RANGE
+ 0006 01 TOO HIGH ALONG TRACK JUMP
+ 0007 01 TOO SHORT ALONG TRACK JUMP
+ 0008 01 TOO HIGH ALONG TRACK VARIANCE
+ 0009 01 OUTSIDE CONFIDENCE LIMIT
+ 0010 01 DOUBLE OBSERVATION
+ 0011 01 PEAKINESS ABOVE THRESHOLD
+ 0012 01 RESERVED
+ 0013 01 RESERVED
+ 0014 01 RESERVED
+049193 0014 0001 01 EXELLENT (COST LESS THAN 0.1)
+ 0002 01 GOOD (COST LESS THAN 0.5)
+ 0003 01 QUESTIONABLE (COST LARGER THAN 0.5)
+ 0004 01 RESULTS UNTABLE
+ 0005 01 OBSERVED SAR SPECTRUM REJECTED
+ 0006 01 WAM FIRST GUESS REJECTED
+ 0007 01 SIMULATED SAR REJECTED
+ 0008 01 NO AZIMUTH CUT-OFF ADJUSTMENT
+ 0009 01 RESERVED
+ 0010 01 RESERVED
+ 0011 01 RESERVED
+ 0012 01 RESERVED
+ 0013 01 RESERVED
+ 0014 01 RESERVED
diff --git a/bufrtables/C0000000000098006000.TXT b/bufrtables/C0000000000098006000.TXT
new file mode 100755
index 0000000..d659730
--- /dev/null
+++ b/bufrtables/C0000000000098006000.TXT
@@ -0,0 +1,6065 @@
+001003 0008 0000 01 ATARCTICA
+ 0001 01 REGION I
+ 0002 01 REGION II
+ 0003 01 REGION III
+ 0004 01 REGION IV
+ 0005 01 REGION V
+ 0006 01 REGION VI
+ 0007 01 MISSING VALUE
+001007 0132 0001 01 ERS 1
+ 0002 01 ERS 2
+ 0003 01 METOP-1
+ 0004 01 METOP-2
+ 0005 01 METOP-3
+ 0020 01 SPOT1
+ 0021 01 SPOT2
+ 0022 01 SPOT3
+ 0023 01 SPOT4
+ 0040 01 OERSTED
+ 0041 01 CHAMP
+ 0042 01 TERRASAR-X
+ 0050 01 METEOSAT 3
+ 0051 01 METEOSAT 4
+ 0052 01 METEOSAT 5
+ 0053 01 METEOSAT 6
+ 0054 01 METEOSAT 7
+ 0055 01 METEOSAT 8
+ 0056 01 METEOSAT 9
+ 0057 01 METEOSAT 10
+ 0058 01 METEOSAT 1
+ 0059 01 METEOSAT 2
+ 0060 01 ENVISAT
+ 0070 01 METEOSAT 11
+ 0120 01 ADEOS
+ 0121 01 ADEOS II
+ 0150 01 GMS 3
+ 0151 01 GMS 4
+ 0152 01 GMS 5
+ 0171 01 MTSAT-1R
+ 0172 01 MTSAT-2
+ 0200 01 NOAA 8
+ 0201 01 NOAA 9
+ 0202 01 NOAA 10
+ 0203 01 NOAA 11
+ 0204 01 NOAA 12
+ 0205 01 NOAA 14
+ 0206 01 NOAA 15
+ 0207 01 NOAA 16
+ 0208 01 NOAA 17
+ 0209 01 NOAA 18
+ 0220 01 LANDSAT 5
+ 0221 01 LANDSAT 4
+ 0222 01 LANDSAT 7
+ 0240 01 DMSP 7
+ 0241 01 DMSP 8
+ 0242 01 DMSP 9
+ 0243 01 DMSP 10
+ 0244 01 DMSP 11
+ 0245 01 DMSP 12
+ 0246 01 DMSP 13
+ 0247 01 DMSP 14
+ 0248 01 DMSP 15
+ 0249 01 DMSP 16
+ 0250 01 GOES 6
+ 0251 01 GOES 7
+ 0252 01 GOES 8
+ 0253 01 GOES 9
+ 0254 01 GOES 10
+ 0255 01 GOES 11
+ 0256 01 GOES 12
+ 0257 01 GOES 13
+ 0258 01 GOES 14
+ 0259 01 GOES 15
+ 0260 01 JASON-1
+ 0261 01 JASON-2
+ 0281 01 QUIKSCAT
+ 0282 01 TRMM
+ 0283 01 CORIOLIS
+ 0285 01 DMSP17
+ 0310 01 GOMS 1
+ 0311 01 GOMS 2
+ 0320 01 METEOR 2-21
+ 0321 01 METEOR 3-5
+ 0322 01 METEOR 3M-1
+ 0323 01 METEOR 3M-2
+ 0341 01 RESURS 01-4
+ 0430 01 INSAT 1B
+ 0431 01 INSAT 1C
+ 0432 01 INSAT 1D
+ 0450 01 INSAT 2A
+ 0451 01 INSAT 2B
+ 0452 01 INSAT 2E
+ 0470 01 INSAT 3A
+ 0471 01 INSAT 3D
+ 0472 01 INSAT 3E
+ 0500 01 FY-1C
+ 0501 01 FY-1D
+ 0510 01 FY-2
+ 0512 01 FY-2B
+ 0513 01 FY-2C
+ 0514 01 FY-2D
+ 0700 01 TIROS M (ITOS 1)
+ 0701 01 NOAA 1
+ 0702 01 NOAA 2
+ 0703 01 NOAA 3
+ 0704 01 NOAA 4
+ 0705 01 NOAA 5
+ 0706 01 NOAA 6
+ 0707 01 NOAA 7
+ 0708 01 TIROS-N
+ 0710 01 GOES (SMS 1)
+ 0711 01 GOES (SMS 2)
+ 0720 01 TOPEX
+ 0721 01 GFO (GEOSAT FOLLOW ON)
+ 0722 01 GRACE A
+ 0723 01 GRACE B
+ 0731 01 GOES 1
+ 0732 01 GOES 2
+ 0733 01 GOES 3
+ 0734 01 GOES 4
+ 0735 01 GOES 5
+ 0740 01 COSMIC-1
+ 0741 01 COSMIC-2
+ 0742 01 COSMIC-3
+ 0743 01 COSMIC-4
+ 0744 01 COSMIC-5
+ 0745 01 COSMIC-6
+ 0763 01 NIMBUS 3
+ 0764 01 NIMBUS 4
+ 0765 01 NIMBUS 5
+ 0766 01 NIMBUS 6
+ 0767 01 NIMBUS 7
+ 0780 01 ERBS
+ 0781 01 UARS
+ 0782 01 EARTH PROBE
+ 0783 01 TERRA
+ 0784 01 AQUA
+ 0785 01 AURA
+ 0800 01 SUNSAT
+ 0820 01 SAC-C
+ 1023 01 MISSIN VALUE
+001032 0041 0001 01 PREPROCESSING CONSISTENCY CHECK
+ 0010 01 BIAS CORRECTION
+ 0020 01 BLACK LIST
+ 0030 01 OI MASS AND WIND ANALYSIS, REPORT STATUS
+ 0031 01 OI HUMIDITY ANALYSIS, REPORT STATUS
+ 0032 01 OI ANALYSIS VARIABLES
+ 0033 01 OI ANALYSIS, FIRST GUESS Q/C
+ 0034 01 OI ANALYSIS, FINAL ANALYSIS Q/C
+ 0035 01 OI ANALYSIS, EVENT FLAGS
+ 0040 01 DYNAMIC INITIALISATION SCHEME
+ 0041 01 NORMAL MODE INITIALISATION SCHEME
+ 0050 01 SURFACE ANALYSIS, REPORT STATUS
+ 0051 01 SURFACE ANALYSIS VARIABLES
+ 0052 01 SURFACE ANALYSIS Q/C
+ 0053 01 SURFACE ANALYSIS, EVENT FLAGS
+ 0060 01 3D VAR REPORT STATUS
+ 0061 01 3D VAR ANALYSIS VARIABLES
+ 0062 01 3D VAR Q/C
+ 0063 01 3D VAR EVENT FLAGS
+ 0080 01 PRESAT FIRST GUESS
+ 0081 01 PRESAT ERROR STANDARD DEVIATIONS
+ 0082 01 PRESAT BIAS ESTIMATES
+ 0083 01 PRESAT BRIGHTNESS TEMPERATURE QUALITY FLAGS
+ 0084 01 PRESAT SAMARY FLAGS
+ 0090 01 FIRST GUESS (6 HOUR FORECAST)
+ 0091 01 FIRST GUESS (FGAT INTERPOLATED)
+ 0100 01 PRESCAT AMBIGUITY REMOVAL
+ 0110 01 WAM FIRST GUESS
+ 0111 01 WAM ANALYSIS
+ 0112 01 WAM FORECAST
+ 0113 01 WAM Q/C
+ 0201 01 COLLOCATION WITH SURFACE DATA
+ 0202 01 COLLOCATION WITH TEMP/PILOT DATA
+ 0203 01 COLLOCATION WITH AIREP DATA
+ 0204 01 COLLOCATION WITH SATOB DATA
+ 0205 01 COLLOCATION WITH TOVS DATA
+ 0206 01 COLLOCATION WITH ERS1 SCATTEROMETER DATA
+ 0207 01 COLLOCATION WITH ERS1 ALTIMETER DATA
+ 0220 01 ERS1 SCATTEROMETER COLLOCATION BLACK LIST
+ 0230 01 GAUSS ERROR
+ 0231 01 GROSS ERROR
+001031 0219 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC 50
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC 110
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC 140
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+ 0255 01 MISSING VALUE 219
+001032 0041 0001 01 PREPROCESSING CONSISTENCY CHECK
+ 0010 01 BIAS CORRECTION
+ 0020 01 BLACK LIST
+ 0030 01 OI MASS AND WIND ANALYSIS, REPORT STATUS
+ 0031 01 OI HUMIDITY ANALYSIS, REPORT STATUS
+ 0032 01 OI ANALYSIS VARIABLES
+ 0033 01 OI ANALYSIS, FIRST GUESS Q/C
+ 0034 01 OI ANALYSIS, FINAL ANALYSIS Q/C
+ 0035 01 OI ANALYSIS, EVENT FLAGS
+ 0040 01 DYNAMIC INITIALISATION SCHEME
+ 0041 01 NORMAL MODE INITIALISATION SCHEME
+ 0050 01 SURFACE ANALYSIS, REPORT STATUS
+ 0051 01 SURFACE ANALYSIS VARIABLES
+ 0052 01 SURFACE ANALYSIS Q/C
+ 0053 01 SURFACE ANALYSIS, EVENT FLAGS
+ 0060 01 3D VAR REPORT STATUS
+ 0061 01 3D VAR ANALYSIS VARIABLES
+ 0062 01 3D VAR Q/C
+ 0063 01 3D VAR EVENT FLAGS
+ 0080 01 PRESAT FIRST GUESS
+ 0081 01 PRESAT ERROR STANDARD DEVIATIONS
+ 0082 01 PRESAT BIAS ESTIMATES
+ 0083 01 PRESAT BRIGHTNESS TEMPERATURE QUALITY FLAGS
+ 0084 01 PRESAT SAMARY FLAGS
+ 0090 01 FIRST GUESS (6 HOUR FORECAST)
+ 0091 01 FIRST GUESS (FGAT INTERPOLATED)
+ 0100 01 PRESCAT AMBIGUITY REMOVAL
+ 0110 01 WAM FIRST GUESS
+ 0111 01 WAM ANALYSIS
+ 0112 01 WAM FORECAST
+ 0113 01 WAM Q/C
+ 0201 01 COLLOCATION WITH SURFACE DATA
+ 0202 01 COLLOCATION WITH TEMP/PILOT DATA
+ 0203 01 COLLOCATION WITH AIREP DATA
+ 0204 01 COLLOCATION WITH SATOB DATA
+ 0205 01 COLLOCATION WITH TOVS DATA
+ 0206 01 COLLOCATION WITH ERS1 SCATTEROMETER DATA
+ 0207 01 COLLOCATION WITH ERS1 ALTIMETER DATA
+ 0220 01 ERS1 SCATTEROMETER COLLOCATION BLACK LIST
+ 0230 01 GAUSS ERROR
+ 0231 01 GROSS ERROR
+001033 0219 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC 50
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC 110
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC 140
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA 190
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+ 0255 01 MISSING VALUE
+001035 0219 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC 50
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC 110
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC 140
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA 190
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+ 0255 01 MISSING VALUE 219
+001090 0005 0000 01 LAF (LAGGED-AVERAGE FORECASTING)
+ 0001 01 BREEDING
+ 0002 01 SINGULAR VECTOR
+ 0003 01 MULTIPLE ANALYSIS CYCLE
+ 0255 01 MISSING VALUE
+001092 0005 0000 01 UNPERTURBED HIGH-RESOLUTION CONTROL FORECAST
+ 0001 01 UNPERTURBED LOW-RESOLUTION CONTROL FORECAST
+ 0002 01 NEGATIVELY PERTURBED FORECAST
+ 0003 01 POSITIVELY PERTURBED FORECAST
+ 0255 01 MISSING VALUE
+002001 0004 0000 01 AUTOMATIC STATION
+ 0001 01 MANNED STATION
+ 0002 01 HYBRID, BOTH MANNED AND AUTOMATIC
+ 0003 01 MISSING VALUE
+002002 0004 0000 01 MEASURED IN M S-1 UNLESS OTHERWISE INDICATED
+ 0001 01 CERTIFIED INSTRUMENTS
+ 0002 01 ORIGINALY MEASURED IN KNOTS
+ 0003 01 ORIGINALY MEASURED IN KM/H
+002003 0012 0000 01 PRESSURE INSTRUMENT ASSOCIATED WITH WIND-MEASURING EQUIPMENT
+ 0001 01 OPTICAL THEODOLITE
+ 0002 01 RADIO THEODOLITE
+ 0003 01 RADAR
+ 0004 01 VLF-OMEGA
+ 0005 01 LORAN C
+ 0006 01 WIND PROFILER
+ 0007 01 SATELLITE NAVIGATION
+ 0008 01 RADIO-ACOUSTIC SOUNDING SYSTEM (RASS)
+ 0009 01 SODAR
+ 0014 02 PRESSURE INSTRUMENT ASSOCIATED WITH WIND MEASUREMENT EQUIPME
+ NT BUT PRESSURE ELEMENT FAILED DURING ASCENT
+ 0015 01 MISSING VALUE
+002004 0011 0000 01 USA OPEN PAN EVAPORIMETER (WITHOUT COVER)
+ 0001 01 USA OPEN PAN EVAPORIMETER (MESH COVERED)
+ 0002 01 GGI-300 EVAPORIMETER (SUNKEN)
+ 0003 01 20 M**2 TANK
+ 0004 01 OTHERS
+ 0005 01 RICE
+ 0006 01 WHEAT
+ 0007 01 MAIZE
+ 0008 01 SORGHUM
+ 0009 01 OTHER CROPS
+ 0015 01 MISSING VALUE
+002011 0054 0000 01 RESERVED
+ 0001 01 RESERVED
+ 0002 01 NO RADIOSONDE-PASSIVE TARGET(E.G.REFLECTOR)
+ 0003 01 NO RADIOSONDE-ACTIVE TARGET(E.G.TRANSPONDER)
+ 0004 01 NO RADIOSONDE-PASSIVE TEMPERATURE-HUMIDITY PROFILER
+ 0005 01 NO RADIOSONDE-ACTIVE TEMPERATURE-HUMIDITY PROFILER
+ 0006 01 NO RADIOSONDE-RADIO ACOUSTIC SOUNDER
+ 0009 01 NO RADIOSONDE-SYSTEM UNKNOWN OR NOT SPECIFIED
+ 0010 01 RS VIZ TYPE A (USA)
+ 0011 01 RS VIZ TYPE B (USA)
+ 0012 01 RS SDC (SPACE DATA CORPORATION-USA)
+ 0013 01 ASTOR (NO LONGER MADE-AUSTRALIA)
+ 0014 01 VIZ MARK I MICROSONDE(USA)
+ 0015 01 EEC COMPANY TYPE 23 (USA)
+ 0016 01 ELIN (AUSTRIA)
+ 0017 01 GRAW G. (GERMANY)
+ 0019 01 GRAW M60 (GERMANY)
+ 0020 01 INDIAN MET SERVICE MK3 (INDIA)
+ 0021 01 VIZ/JIN YANG MARK I MICROSONDE(SOUTH KOREA)
+ 0022 01 MEISEI RS2-80 (JAPAN)
+ 0023 01 MESURAL FMO 1950A (FRANCE)
+ 0024 01 MESURAL FMO 19455A (FRANCE)
+ 0025 01 MESURAL MH73A (FRANCE)
+ 0026 01 METEOLABOR BASORA (SWITZERLAND)
+ 0027 01 AVK-MRZ (USSR)
+ 0028 01 METEORIT MARZ2-1 (USSR)
+ 0029 01 METEIRIT MARZ2-2 (USSR)
+ 0030 01 OKI RS2-80 (JAPAN)
+ 0031 01 VIZ/VALCOM TYPE A PRESSURE-COMMUTATED(CANADA)
+ 0032 01 SHANGAI RADIO (CHINA)
+ 0033 01 UK MET OFFICE MK3( UK)
+ 0034 01 VINOHRADY(CZECHOSLOVAKIA)
+ 0035 01 VAISALA RS18 (FINLAND)
+ 0036 01 VAISALA RS21 (FINLAND)
+ 0037 01 VAISALA RS80 (FINLAND)
+ 0038 01 VIZ LOCATE (LORAN-C)(USA)
+ 0039 01 SPRENGER E076 (GERMANY)
+ 0040 01 SPRENGER E084 (GERMANY)
+ 0041 01 SPRENGER E085 (GERMANY)
+ 0042 01 SPRENGER E086 (GERMANY)
+ 0043 01 AIR IS -4A-1680 (UK)
+ 0044 01 AIR IS -4A-1680 X (UK)
+ 0045 01 RS MSS(USA)
+ 0046 01 AIR IS -4A-403(USA)
+ 0047 01 MEISLEI RS2-91(JAPAN)
+ 0048 01 VALCOM(CANADA)
+ 0049 01 VIZ MARK II(USA)
+ 0060 01 VAISALA RS80/MICROCORA (FINLAND)
+ 0061 01 VAISALA RS80/DIGCORA OR MARWIN (FINLAND)
+ 0062 01 VAISALA RS80/PCCORA (FINLAND)
+ 0063 01 VAISALA RS80/STAR (FINLAND)
+ 0064 03 ORBITAL,SCIENCE CORPORATION,SPACE DATA DIVISION,TRANSPONDER
+ RADIOSONDE,TYPE 909-11-XX,WHERE XX CORRECPOND TO THE MODEL
+ OF THE INSTRUMENT
+ 0065 01 VIZ TRANSPONDER RADIOSONDE,MODEL NUMBER 1499-520(USA)
+ 0255 01 MISSING VALUE
+002012 0001 0000 01 TO BE DEVELOPED
+002013 0009 0000 01 NO CORRECTION
+ 0001 01 CIMO SOLAR CORRECTED AND CIMO INFRARED CORRECTED
+ 0002 01 CIMO SOLAR CORRECTED AND IFRARED CORRECTED
+ 0003 01 CIMO SOLAR CORRECTED ONLY
+ 0004 02 SOLAR AND INFRARED CORRECTED AUTOMATICALLY BY RADIOSONDE SY
+ STEM
+ 0005 01 SOLAR CORRECTED AUTOMATICALLY BY RADIOSONDE SYSTEM
+ 0006 01 SOLAR AND INFRARED CORRECTED AS SPECIFIED BY COUNTRY
+ 0007 01 SOLAR CORRECTED AS SPECIFIED BY COUNTRY
+ 0015 01 MISSING VALUE
+002014 0050 0000 01 NO WINDFINDING
+ 0001 01 AUTOMATIC WITH AUXILIARY OPTICAL DIRECTION FINDING
+ 0002 01 AUTOMATIC WITH AUXILIARY RADIO DIRECTION FINDING
+ 0003 01 AUTOMATIC WITH AUXILIARY RANGING
+ 0004 01 NOT USED
+ 0005 01 AUTOMATIC WITH MULTIPLE VLF-OMEGA SIGNALS
+ 0006 01 AUTOMATIC CROSS CHAIN LORAN-C
+ 0007 01 AUTOMATIC WITH AUXILIARY WIND PROFILER
+ 0008 01 AUTOMATIC SATELLITE NAVIGATION
+ 0019 01 TRACKING TECHNIQUE NOT SPECIFIED
+ 0020 01 VESSEL STOPPED
+ 0021 01 VESSEL DIVERTED FROM ORIGINAL DESTINATION
+ 0022 01 VESSEL'S ARRIVAL DELAYED
+ 0023 01 CONTAINER DAMAGED
+ 0024 01 POWER FAILURE TO CONTAINER
+ 0029 01 OTHER PROBLEMS
+ 0030 01 MAJOR POWER PROBLEMS
+ 0031 01 UPS INOPERATIVE
+ 0032 01 RECEIVER HARDWARE PROBLEMS
+ 0033 01 RECEIVER SOFTWARE PROBLEMS
+ 0034 01 PROCESSOR HARDWARE PROBLEMS
+ 0035 01 PROCESSOR SOFTWARE PROBLEMS
+ 0036 01 NAVAID SYSTEM DAMAGED
+ 0037 01 SHORTAGE OF LIFTING GAS
+ 0039 01 OTHER PROBLEMS
+ 0040 01 MECHANICAL DEFECT
+ 0041 01 MATERIAL DEFECT (HAND LAUNCHER)
+ 0042 01 POWER FAILURE
+ 0043 01 CONTROL FAILURE
+ 0044 01 PNEUMATIC/HYDRAULIC FAILURE
+ 0045 01 OTHER PROBLEMS
+ 0046 01 COMPRESSOR PROBLEMS
+ 0047 01 BALLOON PROBLEMS
+ 0048 01 BALLOON RELEASE PROBLEMS
+ 0049 01 LAUNCHER DAMAGED
+ 0050 01 R/S RECEIVER ANTENNA DEFECT
+ 0051 01 NAVAID ANTENNA DEFECT
+ 0052 01 R/S RECEIVER CABLING (ANTENNA DEFECT)
+ 0053 01 NAVAID ANTENNA CABLING DEFECT
+ 0059 01 OTHER PROBLEMS
+ 0060 01 ASAP COMMUNICATIONS DEFECT
+ 0061 01 COMMUNICATIONS FACILITY REJECTED DATA
+ 0062 01 NO POWER AT TRANSMITTINGANTENN
+ 0063 01 ANTENNA CABLE BROKEN
+ 0064 01 ANTENNA CABLE DEFECT
+ 0065 01 MESSAGE TRANSMITTED POWER BELOW NORMAL
+ 0069 01 OTHER PROBLEMS
+ 0070 01 ALL SYSTEMS IN NORMAL OPERATION
+ 0099 01 STATUS OF SYSTEM AND ITS COMPONENTS NOT SPECIFIED
+ 0127 01 MISSING VALUE
+002015 0006 0001 01 PRESSURE ONLY RADIOSONDE
+ 0002 01 PRESSURE ONLY RADIOSONDE PLUS TRANSPONDER
+ 0003 01 PRESSURE ONLY RADIOSONDE PLUS RADAR REFLECTOR
+ 0004 01 NO PRESSURE RADIOSONDE PLUS TRANSPONDER
+ 0005 01 NO PRESSURE RADIOSONDE PLUS RADAR REFLECTOR
+ 0015 01 MISSING VALUE
+002016 0004 0001 01 TRAIN REGULATOR
+ 0002 01 LIGHT UNIT
+ 0003 01 PARACHUTE
+ 0004 01 ROOFTOP RELEASE
+002019 0296 0010 02 BNSC RADIOMETER AATSR ADVANCED ALONG TRACK SCANNIN
+ G RADIOMETER
+ 0011 02 BNSC RADIOMETER ATSR ALONG TRACK SCANNING RADIOME
+ TER
+ 0012 02 BNSC RADIOMETER ATSR-2 ALONG TRACK SCANNING RADIOME
+ TER -2
+ 0013 01 BNSC RADIOMETER MWR MICROWAVE RADIOMETER
+ 0030 01 CNES COMMUNICATIONS ARGOS
+ 0040 01 CNES LIDAR LASER REFLECTORS
+ 0041 02 CNES LIDAR DORIS DOPPLER ORBITOGRAPHY AND RADIO-POSIT
+ IONING INTEGRATED BY SATELLITE
+ 0042 02 CNES LIDAR DORIS-NG DOPPLER ORBITOGRAPHY AND RAD
+ IO-POSITIONING INTEGRATED BY SATELLITE-NG
+ 0047 03 CNES RADAR ALTIMETERS POSEIDON-1 (SSALT-1) POSI
+ TIONING OCEAN SOLID EARTH ICE DYNAMICS ORBITING NAVIGATOR (S
+ INGLE FREQUENCY SOLID STATE RADAR ALTIMETER)
+ 0048 03 CNES RADAR ALTIMETERS POSEIDON-2 (SSALT-2) POSI
+ TIONING OCEAN SOLID EARTH ICE DYNAMICS ORBITING NAVIGATOR (D
+ UAL FREQUENCY SOLID STATE RADAR ALTIMETER)
+ 0050 01 CNES IMAGER RADIOMETER ATSR/M ATSR/M
+ 0051 01 CNES HIGH RESOLUTION OPTICAL IMAGERS HRG
+ 0052 01 CNES RADIOMETER HRV HIGH RESOLUTION VISIBLE
+ 0053 02 CNES RADIOMETER HRVIR HIGH RESOLUTION VISIBLE AND
+ INFRA-RED
+ 0054 02 CNES RADIOMETER SCARAB/MV2 SCANNER FOR EARTH'S
+ RADIATION BUDGET
+ 0055 01 CNES RADIOMETER POLDER POLDER
+ 0060 01 CNES SPECTROMETER VEGETATION VEGETATION
+ 0061 01 CNES SPECTROMETER WINDII WINDII
+ 0080 01 CSA COMMUNICATIONS RADARSAT DTT
+ 0081 01 CSA COMMUNICATIONS RADARSAT TTC
+ 0085 02 CSA RADAR SAR (CSA) SYNTHETIC APERTURE RADAR (CS
+ A)
+ 0090 02 CSA RADIOMETER MOPITT MEASUREMENTS OF POLLUTION IN
+ THE TROPOSPHERE
+ 0091 02 CSA CHEMISTRY INSTRUMENTS OSIRIS OPTICAL SPECTROGRAPH
+ AND INFRA-RED IMAGING SYSTEM
+ 0097 01 CSIRO RADIOMETER PANCHROMATIC IMAGER
+ 0098 02 CRCSS ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GPS
+ RECEIVER
+ 0102 02 DLR RADIOMETER CHAMP GPS SOUNDER GPS TURBORO
+ GUE SPACE RECEIVER (TRSR)
+ 0103 01 UNKNOWN
+ 0116 03 DLR MAGNETOMETER IGOR CHAMP GRAVITY PACKAGE (ACCELEROMETE
+ R+GPS) INTEGRATED GPS AND OCCULTATION RECEIVER STAR AC
+ CELEROMETER
+ 0117 03 DLR MAGNETOMETER CHAMP MAGNETOMETRY PACKAGE (1 SCALAR
+ +2 VECTOR MAGNETOMETER) OVERHAUSER MAGNETOMETER (OVM) AN
+ D FLUXGATE MAGNETOMETER (FGM)
+ 0120 02 ESA COMMUNICATIONS ENVISAT COMMS COMMUNICATIONS PACKA
+ GE ON ENVISAT
+ 0121 02 ESA COMMUNICATIONS ERS COMMS COMMUNICATION PACKAG
+ E FOR ERS
+ 0130 01 ESA LIDARS ALADIN ATMOSPHERIC LASER DOPPLER INSTRUMENT
+ 0131 01 ESA LIDARS ATLID ATMOSPHERIC LIDAR
+ 0140 02 ESA RADAR AMI/SAR/IMAGE ACTIVE MICROWAVE INSTRUMENTA
+ TION. IMAGE MODE
+ 0141 02 ESA RADAR AMI/SAR/WAVE ACTIVE MICROWAVE INSTRUMENTA
+ TION. WAVE MODE
+ 0142 02 ESA RADAR AMI/SCATTEROMETER ACTIVE MICROWAVE INS
+ TRUMENTATION. WIND MODE
+ 0143 01 ESA RADAR ASAR ASAR
+ 0144 02 ESA IMAGING MICROWAVE RADARS ASAR ADVANCED SYN
+ TETIC APERTURA RADAR (IMAGE MODE)
+ 0145 02 ESA IMAGING MICROWAVE RADARS ASAR ADVANCED SYN
+ TETIC APERTURA RADAR (WAVE MODE)
+ 0146 01 ESA CLOUD PROFILE AND RAIN RADARS CPR CLOUD RADAR
+ 0147 01 ESA RADAR RA-2/MWR RADAR ALTIMETER - 2
+ 0148 01 ESA RADAR RA/MWR RADAR ALTIMETER
+ 0150 01 ESA SCATTEROMETERS SCATTEROMETER SCATTEROMETER
+ 0161 02 ESA RADIOMETER MIPAS MICHELSON INTERFEROMETRIC PA
+ SSIVE ATMOSPHERE SOUNDER
+ 0162 02 ESA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E MWR-2 MICROWAVE RADIOMETER-2
+ 0163 03 ESA ATMOSPHERIC CHEMISTRY INSTRUMENTS SOPRANO SUB-
+ MILIMETRE OBSERVATION OF PROCESSES IN THE ABSORPTION NOTEWOR
+ THY FOR OZONE
+ 0170 02 ESA ATMOSPHERIC CHEMISTRY INSTRUMENTS GOME I GLOB
+ AL OZONE MONITORING EXPERIMENT
+ 0172 02 ESA SPECTROMETER GOMOS GLOBAL OZONE MONITORING BY O
+ CCULTATION OF STARS
+ 0174 02 ESA SPECTROMETER MERIS MEDIUM RESOLUTION IMAGING SP
+ ECTROMETER
+ 0175 02 ESA SPECTROMETER SCIAMACHY SCANNING IMAGING ABS
+ ORPTION SPECTROMETER FOR ATMOSPHERIC CARTOGRAPHY
+ 0181 02 EUMETSAT COMMUNICATIONS METEOSAT COMMS COMMUNICATIO
+ NS PACKAGE FOR METEOSAT
+ 0182 02 EUMETSAT COMMUNICATIONS MSG COMMS COMMUNICATIO
+ NS PACKAGE FOR MSG
+ 0190 02 ESA/ EUMETSAT SCATTEROMETERS ASCAT ADVANCED SCATTE
+ ROMETER
+ 0200 02 EUMETSAT RADIOMETER GERB GEOSTATIONARY EARTH
+ RADIATION BUDGET
+ 0202 02 ESA/ EUMETSAT RADIOMETER GRAS GNSS RECEIVER F
+ OR ATMOSPHERIC SOUNDING
+ 0203 02 EUMETSAT RADIOMETER MHS MICROWAVE HUMIDITY S
+ OUNDER
+ 0205 02 EUMETSAT RADIOMETER MVIRI METEOSAT VISIBLE AND
+ INFRA-RED IMAGER
+ 0207 02 EUMETSAT RADIOMETER SEVIRI SPINNING ENHANCED VI
+ SIBLE AND INFRARED IMAGER
+ 0208 02 EUMETSAT IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR)
+ VIRI VIRI
+ 0220 02 ESA/ EUMETSAT SPECTROMETER GOME-2 GLOBAL OZONE MO
+ NITORING EXPERIMENT - 2
+ 0221 03 CNES/ EUMETSAT ATMOSPHERIC TEMPERATURE AND HUMIDITY S
+ OUNDERS IASI INFRA-RED ATMOSPHERIC SOUNDING INTERFEROME
+ TER
+ 0240 02 CAST COMMUNICATIONS DCP DATA COLLECTION PLATFORM TRA
+ NSPONDER
+ 0245 01 CAST RADIOMETER CCD HIGH RESOLUTION CCD CAMERA
+ 0246 02 INPE ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS HSB
+ HUMIDITY SOUNDER/BRAZIL
+ 0248 02 INPE IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) OBA
+ OBSERVADOR BRASILEIRO DA AMAZONIA
+ 0250 01 CAST RADIOMETER WFI WIDE FIELD IMAGER
+ 0255 02 CAST SPECTROMETER IRMSS INFRA RED MULTI SPECTRAL SCA
+ NNER
+ 0260 01 ISRO PRECISION ORBIT BSS & FSS TRANSPONDERS
+ 0261 01 ISRO PRECISION ORBIT DRT-S&R
+ 0262 02 ISRO COMMUNICATIONS INSAT COMMS COMMUNICATIONS PACKA
+ GE FOR INSAT
+ 0268 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS HR-PAN HIGH RESOLUT
+ ION PANCHROMATIC CAMERA
+ 0269 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) MSMR MULTIFREQUENCY SCANNING MICROWAVE RADIOMETER
+ 0270 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VHRR
+ VERY HIGH RESOLUTION RADIOMETER
+ 0271 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) WIFS
+ WIDE FIELD SENSOR
+ 0275 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS AWIFS ADVANCED WID
+ E FIELD SENSOR
+ 0276 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-I LINEAR IMAGI
+ NG SELF SCANNER - I
+ 0277 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-II LINEAR IMAGI
+ NG SELF SCANNER - II
+ 0278 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-III LINE
+ AR IMAGING SELF SCANNER - III
+ 0279 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-IV LINEAR IMAGI
+ NG SELF SCANNER - IV
+ 0284 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS PAN PANCHROMATIC
+ SENSOR
+ 0285 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MOS
+ MODULAR OPTO-ELECTRONIC SCANNER
+ 0286 02 ISRO OCEAN COLOUR INSTRUMENTS OCM OCEAN COLOUR
+ MONITOR
+ 0290 02 JMA COMMUNICATIONS MTSAT COMMS COMMUNICATIONS PACKA
+ GE FOR MTSAT
+ 0294 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS IMAGER/MTSAT
+ -1R IMAGER/MTSAT
+ 0295 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS IMAGER/MTSAT
+ IMAGER/MTSAT
+ 0296 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS VISSR (GMS4)
+ VISIBLE AND INFRA-RED SPIN SCAN RADIOMETER (GMS4)
+ 0300 01 NASA LIDARS GLAS GEOSCIENCE LASER ALTIMETER SYSTEM
+ 0301 01 NASA PRECISION ORBIT LRA LASER RETROREFLECTOR ARRAY
+ 0302 01 NASA LIDARS MBLA MULTI BEAM LASER ALTIMETER
+ 0309 02 NASA CLOUD PROFILE AND RAIN RADARS CPR (CLOUDSAT) CLOU
+ D PROFILING RADAR
+ 0312 01 NASA RADAR NSCAT NASA SCATTEROMETER
+ 0313 01 NASA RADAR SEAWINDS ADEOS II - NASA SCATTEROMETER
+ 0330 02 NASA EARTH RADIATION BUDGET RADIOMETER ACRIM ACTI
+ VE CAVITY RADIOMETER IRRADIANCE MONITOR
+ 0334 02 NASA TOTAL AND PROFILE OZONE BUV BACKSCATTER ULTRAVIO
+ LET INSTRUMENT
+ 0336 02 NASA HIGH RESOLUTION OPTICAL IMAGERS ALI ADVANCED LAN
+ D IMAGER
+ 0347 02 NASA HIGH RESOLUTION OPTICAL IMAGERS ASTER ADVANCED SPA
+ CEBORNE THERMAL EMISSION AND REFLECTION RADIOMETER
+ 0348 02 NASA EARTH RADIATION BUDGET RADIOMETER CERES-2 CLOU
+ D AND THE EARTH'S RADIANT ENERGY SYSTEM
+ 0351 02 CONAE ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GPSD
+ R GPS DEMONSTRATION RECEIVER
+ 0353 02 NASA TOTAL AND PROFILE OZONE HIRDLS HIGH RESOLUTION DYNA
+ MICS LIMB SOUNDER
+ 0354 02 NASA TOTAL AND PROFILE OZONE HRDI HIGH RESOLUTION DOPP
+ LER IMAGER
+ 0356 01 NASA RADIOMETER LIS LIGHTNING IMAGING SENSOR
+ 0358 02 NASA MAGNETIC FIELD, AUROAL IMAGERYSCINTILLATION BOUNDARY
+ PEM PARTICLE ENVIRONMENT MONITOR
+ 0359 02 NASA OCEAN COLOUR INSTRUMENTS SEAWIFS SEA-VIEWING
+ WIDE FIELD-OF-VIEW SENSOR
+ 0360 02 NASA EARTH RADIATION BUDGET RADIOMETER SUSIM (UARS)
+ SOLAR ULTRAVIOLET IRRADIANCE MONITOR
+ 0363 02 NASA TOTAL AND PROFILE OZONE SBUV/1 SOLAR BACKSCATTER UL
+ TRAVIOLET 1 INSTRUMENT
+ 0365 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) TMI TRMM MICROWAVE IMAGER
+ 0366 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) JMR JASON-1 MICROWAVE RADIOMETER
+ 0369 02 NASA TOTAL AND PROFILE OZONE LIMS LIMB INFRARED MONITO
+ R OF THE STRATOSPHERE
+ 0370 02 NASA TOTAL AND PROFILE OZONE LRIR LIMB RADIANCE INVERS
+ ION RADIOMETER INSTRUMENT
+ 0371 02 NASA TOTAL AND PROFILE OZONE EPIC EARTH POLYCHROMATIC
+ IMAGING CAMERA
+ 0372 02 NASA EARTH RADIATION BUDGET RADIOMETER NISTAR NIST
+ ADVANCED RADIOMETER
+ 0373 02 NASA MAGNETIC FIELD, AUROAL IMAGERY SCINTILLATION BOUNDAR
+ Y PLASMA-MAG
+ 0374 01 NASA OTHER XPS XUV PHOTOMETER SYSTEM
+ 0375 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIRS
+ VISIBLE INFRA-RED SCANNER
+ 0376 03 CNES MULTIPLE DIRECTION/POLARISATION RADIOMETERS POLD
+ ER II POLARIZATION AND DIRECTIONALITY OF THE EARTH'S R
+ EFLECTANCE - II
+ 0377 02 NASA EARTH RADIATION BUDGET RADIOMETER TIM TOTA
+ L IRRADIANCE MONITOR
+ 0379 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) WFC
+ WIDE FIELD CAMERA
+ 0382 02 NASA SPECTRO-RADIOMETER CLAES CRYOGENIC LIMB ARRAY
+ ETALON SPECTROMETER
+ 0383 02 NASA SPECTRO-RADIOMETER HALOE HALOGEN OCCULTATION
+ EXPERIMENT
+ 0384 02 NASA SPECTRO-RADIOMETER ISAMS IMPROVED STRATOSPHER
+ IC AND MESOSPHERIC SOUNDER
+ 0385 02 NASA SPECTRO-RADIOMETER MISR MULTI-ANGLE IMAGING
+ SPECTRORADIOMETER
+ 0386 01 NASA SPECTRO-RADIOMETER MLS MICROWAVE LIMB SOUNDER
+ 0387 02 NASA SPECTRO-RADIOMETER MLS (EOS-AURA) MICROWAVE LIMB
+ SOUNDER (EOS-AURA)
+ 0389 02 NASA SPECTRO-RADIOMETER MODIS MODERATE-RESOLUTION
+ IMAGING SPECTRORADIOMETER
+ 0393 02 NASA GRAVITY HAIRS HIGH ACCURACY INTER-SATELLITE RANGIN
+ G SYSTEM
+ 0394 02 NASA TOTAL AND PROFILE OZONE OMI OZONE MEASURING INST
+ RUMENT
+ 0395 02 NASA RADIOMETER ATMOSPHERIC CORRECTOR ATMOSPHERIC
+ CORRECTOR
+ 0396 01 NASA RADIOMETER HYPERION HYPERSPECTRAL IMAGER
+ 0399 02 NASA SPECTRO-RADIOMETER SAGE I STRATOSPHERIC AEROSO
+ L AND GAS EXPERIMENT-I
+ 0400 02 NASA SPECTRO-RADIOMETER SAGE II STRATOSPHERIC AEROSO
+ L AND GAS EXPERIMENT-II
+ 0401 02 NASA SPECTRO-RADIOMETER SAGE III STRATOSPHERI
+ C AEROSOL AND GAS EXPERIMENT-III
+ 0402 02 NASA SPECTRO-RADIOMETER SAMS STRATOSPHERIC AND ME
+ SOSPHERIC SOUNDER
+ 0403 02 NASA SPECTRO-RADIOMETER SAM II STRATOSPHERIC AEROSO
+ L MEASUREMENT II
+ 0404 02 NASA SPECTRO-RADIOMETER IRIS INFRARED INTERFEROME
+ TER SPECTROMETER
+ 0405 02 NASA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GIFT
+ S GEOSYNCHRONOUS IMAGING FOURIER TRANSFORM SPECTROMETER
+ 0420 01 NASA SPECTROMETER AIRS ATMOSPHERIC INFRA-RED SOUNDER
+ 0426 02 NASA SPECTROMETER SOLSTICE SOLAR STELLAR IRRADI
+ ANCE COMPARISON EXPERIMENT
+ 0430 02 NASA SPECTROMETER TES TROPOSHPERIC EMISSION SPECTR
+ OMETER
+ 0431 02 NASA SPECTROMETER TOMS TOTAL OZONE MAPPING SPECTROM
+ ETER
+ 0450 02 JAXA COMMUNICATIONS ADEOS COMMS COMMUNICATIONS PACKA
+ GE FOR ADEOS
+ 0451 02 JAXA COMMUNICATIONS DCS (JAXA) DATA COLLECTION SYST
+ EM (JAXA)
+ 0453 02 JAXA COMMUNICATIONS GMS COMMS COMMUNICATIONS PACKA
+ GE ON GMS
+ 0454 02 JAXA COMMUNICATIONS JERS-1 COMMS COMMUNICATIONS PACKA
+ GE FOR JERS-1
+ 0460 01 JAXA LIDAR RIS RETROREFLECTOR IN SPACE
+ 0461 01 JAXA RADAR PR PRECIPITATION RADAR
+ 0462 02 JAXA IMAGING MICROWAVE RADARS SAR SYNTETIC APE
+ RTURE RADAR
+ 0470 02 JAXA IMAGING MICROWAVE RADARS PALSAR PHASED ARRAY
+ TYPE L-BAND SYNTHETIC APERTURE RADAR
+ 0479 02 JAXA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) AMSR-E ADVANCED MICROWAVE SCANNING RADIOMETER-EOS
+ 0480 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS PRISM (ALOS) PANC
+ HROMATIC REMOTE-SENSING INSTRUMENT FOR STEREO MAPPING
+ 0481 02 JAXA RADIOMETER AMSR ADVANCED MICROWAVE SCANNING
+ RADIOMETER
+ 0482 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS AVNIR ADVANCED VIS
+ IBLE AND NEAR INFRARED RADIOMETER
+ 0483 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS AVNIR-2 ADVANCED VIS
+ IBLE AND NEAR INFRA-RED RADIOMETER TYPE 2
+ 0484 01 JAXA IMAGER GLI GLOBAL IMAGER
+ 0485 02 JAXA RADIOMETER MESSR MULTISPECTRAL ELECTRONIC SEL
+ F SCANNING RADIOMETER
+ 0486 01 JAXA RADIOMETER MSR MICROWAVE SCANNING RADIOMETER
+ 0487 02 JAXA RADIOMETER OCTS OCEAN COLOR AND TEMPERATURE S
+ CANNER
+ 0488 01 JAXA RADIOMETER OPS OPTICAL SENSOR
+ 0489 02 JAXA SPECTRO-RADIOMETER VISSR (GMS5) VISIBLE AND
+ INFRA-RED SPIN SCAN RADIOMETER (GMS5)
+ 0490 02 JAXA RADIOMETER VTIR VISIBLE AND THERMAL INFRA-RE
+ D RADIOMETER
+ 0510 02 JAXA SPECTROMETER ILAS-I IMOROVED LIMB ATOMOSPHIRIC S
+ PECTROMETER
+ 0511 02 JAXA SPECTROMETER ILAS-II IMPROVED LIMB ATOMOSPHIRIC S
+ PECTROMETER
+ 0512 02 JAXA SPECTROMETER IMG INFEROMETRIC MONITOR OF GREE
+ NHOUSE GASES
+ 0514 02 JAXA SPACE ENVIRONMENT SEM SPACE ENVIRONMENT MO
+ NITOR (JAXA)
+ 0515 02 JAXA TOTAL AND PROFILE OZONE SOFIS SOLAR OCCULTATION FO
+ URIER TRANSFORM SPECTROMETER FOR INCLINED ORBIT SATELLITE
+ 0540 02 NOAA COMMUNICATIONS DCS (NOAA) DATA COLLECTION SYST
+ EM (NOAA)
+ 0541 02 NOAA COMMUNICATIONS GOES COMMS COMMUNICATIONS PACKA
+ GE ON GOES
+ 0542 02 NOAA COMMUNICATIONS LANDSAT COMMS COMMUNICATIONS PACKA
+ GE FOR LANDSAT
+ 0543 02 NOAA COMMUNICATIONS NOAA COMMS COMMUNICATIONS PACKA
+ GE FOR NOAA
+ 0544 01 NOAA COMMUNICATIONS S&R (GOES) SEARCH AND RESCUE
+ 0545 01 NOAA COMMUNICATIONS S&R (NOAA) SEARCH AND RESCUE
+ 0546 01 NOAA COMMUNICATIONS WEFAX WEATHER FACSIMILE
+ 0547 02 NOAA SPECTROMETER SEM(GOES) SPACE ENVIRONMENT MO
+ NITOR
+ 0550 01 NOAA MAGNETIC FIELD SSM SPECIAL SENSOR MAGNETOMETER
+ 0551 02 NOAA MAGNETIC FIELD SSJ/4 SPECIAL SENSOR PRECIPITATING
+ PLASMA MONITOR
+ 0552 02 NOAA SPACE ENVIRONMENT SSIES-2 SPECIAL SENSOR IONOS
+ PHERIC PLASMA DRIFT/SCINTILLATION METER
+ 0553 02 NOAA SPACE ENVIRONMENT SSB/X-2 SPECIAL SENSOR GAMMA
+ RAY PARTICLE DECTECTOR
+ 0570 02 NOAA RADIOMETER AMSU-A ADVANCED MICROWAVE SOUNDING
+ UNIT-A
+ 0574 02 NOAA RADIOMETER AMSU-B ADVANCED MICROWAVE SOUNDING
+ UNIT-B
+ 0580 02 NOAA RADIOMETER ATOVS (HIRS/3 + AMSU + AVHRR/3) ADVA
+ NCED TIROS OPERATIONAL VERTICAL SOUNDER
+ 0590 02 NOAA RADIOMETER AVHRR/2 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/2
+ 0591 02 NOAA RADIOMETER AVHRR/3 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/3
+ 0592 02 NOAA RADIOMETER AVHRR/4 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/4
+ 0600 02 NOAA RADIOMETER ERBE EARTH'S RADIATION BUDGET EXP
+ ERIMENT
+ 0601 01 NOAA RADIOMETER ETM+ ENHANCED THEMATIC MAPPER
+ 0605 02 NOAA RADIOMETER HIRS/2 HIGH RESOLUTION INFRA-RED SO
+ UNDER/2
+ 0606 02 NOAA RADIOMETER HIRS/3 HIGH RESOLUTION INFRA-RED SO
+ UNDER/3
+ 0607 02 NOAA RADIOMETER HIRS/4 HIGH RESOLUTION INFRA-RED SO
+ UNDER/4
+ 0615 01 NOAA RADIOMETER IMAGER IMAGER
+ 0616 02 NOAA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIIR
+ S VISIBLE/INFRARED IMAGER RADIOMETER SUITE
+ 0620 02 NOAA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS CRIR
+ S/NP CROSS TRACK INFRA-RED SOUNDER/NPOESS
+ 0621 02 NOAA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS ATMS
+ ADVANCED TECHNOLOGY MICROWAVE SOUNDER
+ 0622 01 NOAA RADIOMETER MSS MULTISPECTRAL SCANNING SYSTEM
+ 0623 01 NOAA RADIOMETER MSU MICROWAVE SOUNDING UNIT
+ 0624 02 NOAA RADIOMETER SBUV/2 SOLAR BACKSCATTTER ULTRA-VIO
+ LET INSTRUMENT/2
+ 0625 02 NOAA RADIOMETER SBUV/3 SOLAR BACKSCATTTER ULTRA-VIO
+ LET INSTRUMENT/3
+ 0626 01 NOAA RADIOMETER SOUNDER SOUNDER
+ 0627 01 NOAA RADIOMETER SSU STRATOSPHERIC SOUNDING UNIT
+ 0628 01 NOAA RADIOMETER TM THEMATIC MAPPER
+ 0629 02 NOAA RADIOMETER TOVS (HIRS/2 + MSU + SSU) TIRO
+ S OPERATIONAL VERTICAL SOUNDER
+ 0630 01 NOAA RADIOMETER VAS VISSR ATMOSPHERIC SOUNDER
+ 0631 01 NOAA RADIOMETER SSZ
+ 0645 01 NOAA SPECTROMETER SEM SPACE ENVIRONMENT MONITOR
+ 0650 02 NRSCC RADIOMETER MVIRSR (10 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0651 02 NRSCC RADIOMETER MVIRSR (3 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0652 02 NRSCC RADIOMETER MVIRSR (5 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0670 01 NSAU RADAR RLSBO SIDE LOOKING MICROWAVE RADAR
+ 0680 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS MSU-EU MULTI-SPECTR
+ AL RADIOMETER WITH HIGH RESOLUTION
+ 0681 02 NSAU IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MSU-
+ UM VISIBLE MULTI-SPECTRAL RADIOMETER
+ 0682 01 NSAU RADIOMETER RM-08 IMAGING MICROWAVE RADIOMETER
+ 0683 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS SU-UMS STEREO RADIO
+ METER WITH HIGH RESOLUTION
+ 0684 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS SU-VR VISIBLE RADI
+ OMETER WITH HIGH RESOLUTION
+ 0685 01 NSAU RADIOMETER TRASSER
+ 0700 02 ROSCOSMOS COMMUNICATIONS KONDOR-2 DATA COLLECT
+ ION AND TRANSMISSION SYSTEM
+ 0701 01 ROSCOSMOS COMMUNICATIONS BRK
+ 0710 01 ROSCOSMOS LIDAR ALISSA BACKSCATTER LIDAR
+ 0712 01 ROSCOSMOS LIDAR BALKAN-2 LIDAR
+ 0715 01 ROSCOSMOS LIDAR MK-4
+ 0716 01 ROSCOSMOS LIDAR MK-4M
+ 0730 01 ROSCOSMOS RADAR GREBEN RADAR ALTIMETER
+ 0731 01 ROSCOSMOS RADAR SAR-10 SYNTETIC APERTURE RADAR
+ 0732 01 ROSCOSMOS RADAR SAR-3 SYNTETIC APERTURE RADAR
+ 0733 01 ROSCOSMOS RADAR SAR-70 SYNTETIC APERTURE RADAR
+ 0740 01 ROSCOSMOS RADAR SLR-3 SIDE LOOKING RADAR
+ 0745 01 ROSCOSMOS RADAR TRAVERS SAR
+ 0750 02 ROSCOSMOS RADIOMETER 174-K TEMPERATURE AND HUMI
+ DITY PROFILER
+ 0751 02 ROSCOSMOS RADIOMETER BTVK SCANNING TELEVISION
+ RADIOMETER
+ 0752 02 ROSCOSMOS RADIOMETER CHAIKA SCANNING IR RADIOMET
+ ER
+ 0753 02 ROSCOSMOS RADIOMETER DELTA-2 MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0755 02 ROSCOSMOS RADIOMETER IKAR-D MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0756 02 ROSCOSMOS RADIOMETER IKAR-N MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0757 02 ROSCOSMOS RADIOMETER IKAR-P MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0760 01 ROSCOSMOS RADIOMETER ISP
+ 0761 02 ROSCOSMOS RADIOMETER KFA-1000 PHOTOGRAPHIC
+ CAMERA
+ 0762 01 ROSCOSMOS RADIOMETER KFA-200 PHOTOGRAPHIC CAMERA
+ 0763 02 ROSCOSMOS RADIOMETER KFA-3000 PHOTOGRAPHIC
+ CAMERA
+ 0770 01 ROSCOSMOS RADIOMETER KLIMAT SCANNING IR RADIOMETER
+ 0771 02 ROSCOSMOS RADIOMETER KLIMAT-2 SCANNING IR
+ RADIOMETER
+ 0775 01 ROSCOSMOS RADIOMETER MIRAS
+ 0776 01 ROSCOSMOS RADIOMETER MIVZA
+ 0777 02 ROSCOSMOS RADIOMETER MIVZA-M MICROWAVE SCANNING R
+ ADIOMETER
+ 0780 01 ROSCOSMOS RADIOMETER MR-2000
+ 0781 01 ROSCOSMOS RADIOMETER MR-2000M
+ 0785 02 ROSCOSMOS RADIOMETER MR-900 SCANNING TELEPHOTOME
+ TER
+ 0786 02 ROSCOSMOS RADIOMETER MR-900B SCANNING VISUAL BAND
+ TELEPHOTOMETER
+ 0790 02 ROSCOSMOS RADIOMETER MSU-E MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0791 02 ROSCOSMOS RADIOMETER MSU-E1 MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0792 02 ROSCOSMOS RADIOMETER MSU-E2 MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0793 01 ROSCOSMOS RADIOMETER MSU-M
+ 0794 02 ROSCOSMOS RADIOMETER MSU-S MULTISPECTRAL MEDIUM
+ RESOLUTION SCANNER
+ 0795 02 ROSCOSMOS RADIOMETER MSU-SK MULTISPECTRAL MEDIUM
+ RESOLUTION CONICAL SCANNER
+ 0796 02 ROSCOSMOS RADIOMETER MSU-V MULTISPECTRAL HIGH R
+ ESOLUTION CONICAL SCANNER
+ 0810 02 ROSCOSMOS RADIOMETER MTZA SCANNING MICROWAVE R
+ ADIOMETER
+ 0815 03 ROSCOSMOS IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE
+ MICROWAVE) MZOAS SCANNING MICROWAVE RADIO
+ METER
+ 0820 03 ROSCOSMOS IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE
+ MICROWAVE) R-225 SINGLE CHANNEL MICROWAVE
+ RADIOMETER
+ 0821 01 ROSCOSMOS RADIOMETER R-400
+ 0822 02 ROSCOSMOS RADIOMETER R-600 SINGLE CHANNEL MICRO
+ WAVE RADIOMETER
+ 0830 02 ROSCOSMOS RADIOMETER RMS RADIATION MEASUREMEN
+ T SYSTEM
+ 0835 01 ROSCOSMOS RADIOMETER TV CAMERA
+ 0836 01 ROSCOSMOS RADIOMETER SILVA
+ 0840 02 ROSCOSMOS SPECTRO-RADIOMETER SROSMO SPECTRORADIO
+ METER FOR OCEAN MONITORING
+ 0850 02 ROSCOSMOS SPECTROMETER BUFS-2 BACKSCATTER SPECTROM
+ ETER/2
+ 0851 02 ROSCOSMOS SPECTROMETER BUFS-4 BACKSCATTER SPECTROM
+ ETER/4
+ 0855 02 ROSCOSMOS SPECTROMETER ISTOK-1 INFRA-RED SPECTROMET
+ ER
+ 0856 02 ROSCOSMOS SPECTROMETER SFM-2 SPECTROMETER TO MEAS
+ URE DIRECT SOLAR RADIATION
+ 0857 01 ROSCOSMOS SPECTROMETER DOPI
+ 0858 01 ROSCOSMOS SPECTROMETER KGI-4
+ 0859 01 ROSCOSMOS SPECTROMETER OZON-M
+ 0860 01 ROSCOSMOS SPECTROMETER RMK-2
+ 0900 02 NOAA RADIOMETER MAXIE MAGNETOSPHERIC ATMOSPHERIC X
+ -RAY IMAGING EXPERIMENT
+ 0901 01 NOAA RADIOMETER OLS OPERATIONAL LINESCAN SYSTEM
+ 0905 02 NOAA RADIOMETER SSM/I MISSION SENSOR MICROWAVE IMA
+ GER
+ 0906 02 NOAA RADIOMETER SSM/T-1 MISSION SENSOR MICROWAVE TEM
+ PERATURE SOUNDER
+ 0907 02 NOAA RADIOMETER SSM/T-2 MISSION SENSOR MICROWAVE WAT
+ ER VAPOR SOUNDER
+ 0908 02 NOAA RADIOMETER SSMIS SPECIAL SENSOR MICROWAVE IMA
+ GER SOUNDER
+ 0910 01 NOAA RADIOMETER SXI SOLAR X-RAY IMAGER
+ 0930 02 NOAA SPECTROMETER EHIC ENERGETIC HEAVY ION COMPOSIT
+ ION EXPERIMENT
+ 0931 01 NOAA SPECTROMETER X-RAY ASTRONOMY PAYLOAD
+ 0932 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) IVIS
+ SR (FY-2) IMPROVED MULTISPECTRAL VISIBLE AND INFRA-RED SCA
+ N RADIOMETER (5 CHANNELS)
+ 0933 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS IRAS
+ INFRARED ATMOSPHERIC SOUNDER
+ 0934 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS MWAS
+ MICROWAVE ATMOSPHERIC SOUNDER
+ 0935 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS IMWA
+ S IMPROVED MICROWAVE ATMOSPHERIC SOUNDER
+ 0936 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS MWHS
+ MICROWAVE HUMIDITY SOUNDER
+ 0937 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MVIR
+ S MODERATE RESOLUTION VISIBLE AND INFRARED IMAGING SPECTRO
+ RADIOMETER
+ 0938 02 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) MWRI MICROWAVE RADIATION IMAGER
+ 0940 02 ROSCOSMOS ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDER
+ S MTVZA-OK SCANNING MICROWAVE RADIOMETER
+ 0941 02 CNES ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS SAPH
+ IR
+ 0944 01 NOAA RADAR ALTIMETERS ALT ALTIMETER
+ 0945 02 NOAA EARTH RADIATION BUDGET RADIOMETER TSIS TOTA
+ L SOLAR IRRADIANCE SENSOR
+ 0946 02 NOAA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) CMIS CONICAL-SCANNING MICROWAVE IMAGER/SOUNDER
+ 0947 02 NOAA TOTAL AND PROFILE OZONE OMPS OZONE MAPPING AND PR
+ OFILER SUITE
+ 0948 03 NOAA SPACE ENVIRONMENT ATMOSPHERIC TEMPERATURE AND HUMIDI
+ TY SOUNDERS GPSOS GLOBAL POSITIONING SYSTEM OCCULTATION SE
+ NSOR
+ 0949 02 NOAA MAGNETIC FIELD, AUROAL IMAGERY SCINTILLATION BOUNDAR
+ Y SESS SPACE ENVIRONMENTAL SENSOR SUITE
+ 0950 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIRR
+ MULTISPECTRAL VISIBLE AND INFRA-RED SCAN RADIOMETER (10
+ CHANNELS
+ 0951 01 NRSCC TOTAL AND PROFILE OZONE TOM TOTAL OZONE MAPPER
+ 0952 01 NRSCC TOTAL AND PROFILE OZONE OP OZONE PROFILER
+ 2047 01 MISSING VALUE
+002020 0024 0000 01 NIMBUS
+ 0001 01 VTPR
+ 0002 01 TIROS 1 (TIROS, NOAA-6 TO NOAA-13)
+ 0003 01 TIROS 2 (NOAA-14 ONWARDS)
+ 0010 01 EOS
+ 0031 01 DMSP
+ 0061 01 EUMETSAT POLAR SYSTEM (EPS)
+ 0091 01 ERS
+ 0121 01 ADEOS
+ 0241 01 GOES
+ 0261 01 JASON
+ 0271 01 GMS
+ 0272 01 MTSAT
+ 0301 01 INSAT
+ 0331 01 METEOSAT OPERATIONAL PROGRAMME (MOP)
+ 0332 01 METEOSAT TRANSITIONAL PROGRAMME (MTP)
+ 0333 01 METEOSAT SECOND GENERATION PROGRAMME (MSG)
+ 0351 01 GOMS
+ 0380 01 FY-1
+ 0381 01 FY-2
+ 0401 01 GPS
+ 0402 01 GLONASS
+ 0403 01 GALILEO
+ 0511 01 MISSING VALUE
+002021 0008 0001 01 HIGH RESOLUTION INFRA RED SOUNDER (HIRS)
+ 0002 01 MICROWAVE SOUNDING UNIT (MSU )
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+002022 0005 0001 01 PROCESSING TECHNIQUE NOT DEFINED
+ 0002 01 AUTOMATED STATISTICAL REGRESSION
+ 0003 01 CLEAR PATH
+ 0004 01 PARTLY CLOUDY PATH
+ 0005 01 CLOUDY PATH
+002023 0012 0000 02 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE WATER VAPOUR
+ CHANNEL
+ 0001 02 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE INFRARED CHAN
+ NEL
+ 0002 02 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE VISIBLE CHANN
+ EL
+ 0003 02 WIND DERIVED FROM CLOUD MOTION OBSERVED IN WATER VAPOUR CHAN
+ NEL (CLOUD OR CLEAR AIR NOT SPECIFIED)
+ 0004 02 WIND DERIVED FROM MOTION OBSERVED IN COMBINATION OF SPECTRA
+ L CHANNELS
+ 0005 02 WIND DERIVED FROM MOTION OBSERVED IN THE WATER VAPOUR CHANN
+ EL IN CLEAR AIR
+ 0006 01 WIND DERIVED FROM MOTION OBSERVED IN THE OZONE CHANNEL
+ 0007 02 WIND DERIVED FROM MOTION OBSERVED IN WATER VAPOUR CHANNEL
+ (CLOUD OR CLEAR AIR NOT SPECIFIED)
+ 0008 01 WIND DERIVED FROM ALTIMETER
+ 0009 01 WIND DERIVED FROM RADIOMETER
+ 0013 01 ROOT MEAN SQUARE
+ 0015 01 MISSING VALUE
+002024 0003 0001 01 TABLE WITH FULL RANGE OF HUMIDITY VARIATION IN LAYER
+ 0002 01 REGRESSION TECHNIQUE ON 2 HUMIDITY VALUES IN LAYER
+ 0015 01 MISSING VALUE
+002025 0016 0001 01 RESERVED
+ 0002 01 HIRS
+ 0003 01 MSU
+ 0006 01 HIRS
+ 0007 01 MSU
+ 0010 01 HIRS(1, 2, 3, 8,9, 16, 17)
+ 0011 01 HIRS(1, 2, 3, 9, 17)
+ 0012 01 MSU
+ 0015 01 HIRS
+ 0016 01 HIRS
+ 0017 01 MSU
+ 0018 01 SKINTK(OCEAN ONLY)
+ 0021 01 HIRS
+ 0022 01 SSU
+ 0023 01 MSU (3 ,4)
+ 0025 01 MISSING
+002030 0007 0001 01 ADCP (ACOUSTIC DOPPLER CURRENT PROFILER)
+ 0002 01 GEK (GEOMAGNETIC ELECTRO KINETOGRAPH)
+ 0003 01 SHIPS'S SET AND DRIFT DETERMINED BY FIXES 3-6 HOURS APART
+ 0004 02 SHIPS'S SET AND DRIFT DETERMINED BY MORE THAN 6 HOURS BUT LE
+ SS THAN 12 HOURS APART
+ 0005 01 DRIFT OF BUOY
+ 0006 01 ADCP (ACOUSTIC DOPPLER CURRENT PROFILER)
+ 0007 01 MISSIN VALUE
+002031 0021 0000 01 RESERVED
+ 0001 01 INSTANTANEOUS
+ 0002 01 AVERAGED OVER 3 MINUTES OR LESS
+ 0003 01 AVERAGED OVER MORE THAN 3 MINUTES, BUT 6 AT THE MOST
+ 0004 01 AVERAGED OVER MORE THAN 6 MINUTES, BUT 12 AT THE MOST
+ 0005 01 INSTANTANEOUS
+ 0006 01 AVERAGED OVER 3 MINUTES OR LESS
+ 0007 01 AVERAGED OVER MORE THAN 3 MINUTES, BUT 6 AT THE MOST
+ 0008 01 AVERAGED OVER MORE THAN 6 MINUTES, BUT 12 AT THE MOST
+ 0009 01 VECTOR OR DOPPLER CURRENT PROFILLING METHOD NOT USED
+ 0010 01 RESERVED
+ 0011 01 1 HOUR OR LESS
+ 0012 01 MORE THAN 1 HOUR BUT 2 AT THE MOST
+ 0013 01 MORE THAN 2 HOUR BUT 4 AT THE MOST
+ 0014 01 MORE THAN 4 HOUR BUT 8 AT THE MOST
+ 0015 01 MORE THAN 8 HOUR BUT 12 AT THE MOST
+ 0016 01 MORE THAN 12 HOUR BUT 18 AT THE MOST
+ 0017 01 MORE THAN 18 HOUR BUT 24 AT THE MOST
+ 0018 01 RESERVED
+ 0019 01 DRIFT METHOD NOT USED
+ 0031 01 MISSING
+002032 0004 0000 02 VALUES AT SELECTED DEPTHS (DATA POINTS FIXED BY THE INSTRUME
+ NT OR SELECTED BY ANY OTHER METHOD)
+ 0001 02 VALUES AT SIGNIFICANT DEPTHS (DATA POINTS TAKEN FROM TRACES
+ AT SIGNIFICANT DEPTHS)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002033 0005 0000 01 NO SALINITY MEASURED
+ 0001 01 IN SITU SENSOR, ACCURACY BETTER THAN 0.02 %
+ 0002 01 IN SITU SENSOR, ACCURACY LESS THAN 0.02 %
+ 0003 01 SAMPLE ANALYSIS
+ 0007 01 MISSING VALUE
+002034 0007 0000 01 UNSPECIFIED DROGUE
+ 0001 01 HOLEY SOCK
+ 0002 01 TRISTAR
+ 0003 01 WINDOW SHADE
+ 0004 01 PARACHUTE
+ 0005 01 NON-LAGRANGIAN SEA ANCHOR
+ 0031 01 MISSING VALUE
+002036 0004 0000 01 DRIFTING BUOY
+ 0001 01 FIXED BUOY
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002037 0007 0000 01 REASERVED
+ 0001 01 MANUAL READING FROM VERTICAL TIDE STAFF
+ 0002 01 MANUAL READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ 0003 01 MANUAL READING FROM MULTIPLE AUTOMATIC RECORDERS AT STATION
+ 0004 02 AUTOMATIC READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ WITHOUT LEVEL REFERENCE CHECK
+ 0005 02 AUTOMATIC READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ WITH LEVEL REFERENCE CHECK,OR MULTIPLE AUTOMATIC RECORDERS
+ 0007 01 MISSING
+002038 0012 0000 01 SHIP INTAKE
+ 0001 01 BUCKET
+ 0002 01 HULL CONTACT SENSOR
+ 0003 01 REVERSING TERMOMETER
+ 0004 01 STD/CTD SENSOR
+ 0005 01 MECHANICAL BT
+ 0006 01 EXPANDABLE BT
+ 0007 01 DIGITAL BT
+ 0008 01 THERMISTOR CHAIN
+ 0009 01 INFRARED SCANNER
+ 0010 01 MICROWAVE SCANNER
+ 0015 01 MISSING VALUE
+002039 0005 0000 01 MEASURED WET-BULB TEMPERATURE
+ 0001 01 ICED BULB MEASURED WET-BULB TEMPERATURE
+ 0002 01 COMPUTED WET-BULB TEMPERATURE
+ 0003 01 ICED BULB COMPUTED WET-BULB TEMPERATURE
+ 0007 01 MISSING VALUE
+002041 0005 0000 01 INFORMATION BASED ON MANUAL ANALYSIS
+ 0001 01 INFORMATION BASED ON COMPUTER ANALYSIS
+ 0002 01 INFORMATION BASED ON DATA ASSIMILATION
+ 0003 02 INFORMATION BASED ON COMPUTER ANALYSIS OR DATA ASSIMSILATIO
+ N MANUALLY MODIFIED
+ 0063 01 MISSING VALUE
+002040 0008 0000 01 SHIPS MOTION REMOVED BY AVARAGING
+ 0001 01 SHIPS MOTION REMOVED BY MOTION COMPENSATION
+ 0002 01 SHIPS MOTION NOT REMOVED
+ 0003 01 SHIPS MOTION REMOVED BY AVERAGING
+ 0004 01 SHIPS MOTION REMOVED BY MOTION COMPENSATION
+ 0005 01 SHIPS MOTION NOT REMOVED
+ 0006 01 DOPPLER CURRENT PROFILING METHOD NOT USED
+ 0015 01 MISSING VALUE
+002041 0006 0000 01 INFORMATION BASED ON MANUAL ANALYSIS
+ 0001 01 INFORMATION BASED ON COMPUTER ANALYSIS
+ 0002 01 INFORMATION BASED ON DATA ASSIMILATION
+ 0003 02 INFORMATION BASED ON COMPUTER ANALYSIS OR
+ DATA ASSIMILATION MANUALLY MODIFIED
+ 0010 01 INFORMATION BASED ON THE NUMERICAL WEATHER PREDICTION
+ 0063 01 MISSING VALUE
+002044 0006 0000 01 RESERVED
+ 0001 01 LONGUET-HIGGINS (1964)
+ 0002 01 LONGUET-HIGGINS (F3 METHOS)
+ 0003 01 MAXIMUM LIKELIHOOD METHOD
+ 0004 01 MAXIMUM ENTROPY METHOD
+ 0015 01 MISSING VALUE
+002045 0005 0000 01 SEA STATION
+ 0001 01 AUTOMATIC DATA BUOY
+ 0002 01 AIRCRAFT
+ 0003 01 SATELLITE
+ 0015 01 MISSING VALUE
+002046 0004 0000 01 RESERVED
+ 0001 01 HEAVE SENSOR
+ 0002 01 SLOPE SENSOR
+ 0015 01 MISSING VALUE
+002048 0012 0000 01 HIRS
+ 0001 01 MSU
+ 0002 01 SSU
+ 0003 01 AMSU-A
+ 0004 01 AMSU-B
+ 0005 01 AVHRR
+ 0006 01 SSMI
+ 0007 01 NSCAT
+ 0008 01 SEA WINDS
+ 0009 01 POSEIDON ALTIMETER
+ 0010 01 JMR (JASON MICROWAVE RADIOMETER)
+ 0015 01 MISSING VALUE
+002049 0004 0001 01 PROCESSING TECHNIQUE NOT DEFINED
+ 0002 01 SIMULTANIOUS PHISICAL RETRIEVAL
+ 0003 01 CLEAR SOUNDING
+ 0004 01 CLOUDY COUNDING
+002050 0019 0001 01 CHANNEL 1 14.71 MICROMETERS
+ 0002 01 CHANNEL 2 14.37 MICROMETERS
+ 0003 01 CHANNEL 3 14.06 MICROMETERS
+ 0004 01 CHANNEL 4 13.64 MICROMETERS
+ 0005 01 CHANNEL 5 13.37 MICROMETERS
+ 0006 01 CHANNEL 6 12.66 MICROMETERS
+ 0007 01 CHANNEL 7 12.02 MICROMETERS
+ 0008 01 CHANNEL 8 11.03 MICROMETERS
+ 0009 01 CHANNEL 9 9.71 MICROMETERS
+ 0010 01 CHANNEL 10 7.43 MICROMETERS
+ 0011 01 CHANNEL 11 7.02 MICROMETERS
+ 0012 01 CHANNEL 12 6.51 MICROMETERS
+ 0013 01 CHANNEL 13 4.57 MICROMETERS
+ 0014 01 CHANNEL 14 4.52 MICROMETERS
+ 0015 01 CHANNEL 15 4.45 MICROMETERS
+ 0016 01 CHANNEL 16 4.13 MICROMETERS
+ 0017 01 CHANNEL 17 3.98 MICROMETERS
+ 0018 01 CHANNEL 18 3.74 MICROMETERS
+ 0019 01 CHANNEL 19 0.969 MICROMETERS
+002051 0004 0001 01 MAXIMUM/MINIMUM THERMOMETERS
+ 0002 01 AUTOMATED INSTRUMENT
+ 0003 01 THERMOGRAPH
+ 0015 01 MISSING VALUE
+002052 0005 0001 01 CHANNEL 1 0.55-.75 MICROMETERS
+ 0002 01 CHANNEL 2 3.9 MICROMETERS
+ 0003 01 CHANNEL 3 6.7 MICROMETERS
+ 0004 01 CHANNEL 4 10.7 MICROMETERS
+ 0005 01 CHANNEL 5 12.0 MICROMETERS
+002053 0005 0000 01 OBSERVED BRIGHTNESS TEMPERATURES
+ 0001 01 BRIGHTNESS TEMPERATURE WITH BIAS CORRECTION APPLIED
+ 0002 01 BRIGHTNESS TEMPERATURE CALCULATED FROM FIRST GUESS
+ 0003 01 BRIGHTNESS TEMPERATURE CALCULATED FROM SOUNDING
+ 0015 01 MISSING VALUE
+002054 0006 0000 02 PARAMETER DERIVED USING OBSERVED SOUNDER BRIGHTNESS TEMPERAT
+ URES
+ 0001 02 PARAMETER DERIVED USING OBSERVED IMAGER BRIGHTNESS TEMPERATU
+ RES
+ 0002 01 PARAMETER DERIVED USING FIRST GUESS INFORMATION
+ 0003 01 PARAMETER DERIVED USING NMC ANALYSIS INFORMATION
+ 0004 01 PARAMETER DERIVED USING RADIOSONDE INFORMATION
+ 0015 01 MISSING VALUE
+002055 0009 0000 01 STATISTICS GENERATED COMPARING RETRIEVAL VERSUS RADIOSONDE
+ 0001 01 STATISTICS GENERATED COMPARING RETRIEVAL VERSUS FIRST GUESS
+ 0002 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS FIRST GUESS
+ 0003 01 STATISTICS GENERATED COMPARING OBSERVED VERSUS RETRIEVAL
+ 0004 01 STATISTICS GENERATED COMPARING OBSERVED VERSUS FORST GUESS
+ 0005 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS IMAGER
+ 0006 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS SOUNDER
+ 0007 01 STATISTICS GENERATED FOR RADIOSONDE
+ 0008 01 STATISTICS GENERATED FOR FIRST GUESS
+002056 0006 0000 01 SUMS OF DIFFERENCE
+ 0001 01 SUMS OF SQUARED DIFFERENCES
+ 0002 01 SAMPLE SIZE
+ 0003 01 MINIMUM DIFFERENCE
+ 0004 01 MAXIMUM DIFFERENCE
+ 0015 01 MISSING VALUE
+002057 0006 0000 01 NESTED GRID MODEL (NMG)
+ 0001 01 AVIATION MODEL(AVN)
+ 0002 01 MEDIUM RANGE FORECAST (MRF) MODEL
+ 0003 01 GLOBAL DATA ASSIMILATION SYSTEM (GDAS) FORECAST MODEL
+ 0004 01 PRIOR SOUNDINGS (WITHIN 3 HOURS OF CURRENT TIME)
+ 0005 01 CLIMATOLOGY
+002058 0005 0000 01 12 HOUR AND 18 HOUR
+ 0001 01 18 HOUR AND 24 HOUR
+ 0002 01 6 HOUR AND 12 HOUR
+ 0003 01 GREATER THAN 24 HOUR
+ 0015 01 MISSING VALUE
+002059 0005 0000 01 NCEP NESTED GRID MODEL ANALYSIS
+ 0001 01 NCEP AVIATION MODEL ANALYSIS
+ 0002 01 NCEP MEDIUM RANGE FORECAST MODEL ANALYSIS
+ 0003 01 NCEP GLOBAL DATA ASSIMILATION SYSTEM FORECAST MODEL ANALYSIS
+ 0015 01 MISSING VALUE
+002060 0007 0000 01 CURRENT SURFACE HOURLY REPORTS
+ 0001 01 CURRENT SHIP REPORTS
+ 0002 01 CURRENT BUOY REPORTS
+ 0003 01 ONE HOUR OLD SURFACE HOURLY REPORTS
+ 0004 01 ONE HOUR SHIP OLD REPORTS
+ 0005 01 ONE HOUR BUOY OLD REPORTS
+ 0015 01 MISSING VALUE
+002061 0003 0000 01 INERTIAL NAVIGATOR SYSTEM
+ 0001 01 OMEGA
+ 0007 01 MISSING VALUE
+002062 0007 0000 01 ASDAR
+ 0001 01 ASDAR(ACARS ALSO AVAILABLE BUT NOT OPERATIVE)
+ 0002 01 ASDAR(ACARS ALSO AVAILABLE AND OPERATIVE)
+ 0003 01 ACARS
+ 0004 01 ACARS(ASDAR ALSO AVALILABLE BUT NOT OPERATIVE)
+ 0005 01 ACARS(ASDAR ALSO AVAILABLE AND OPERATIVE)
+ 0015 01 MISSING VALUE
+002064 0004 0000 01 GOOD
+ 0001 01 BAD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002066 0004 0000 01 TRS 2000
+ 0001 01 IMS 1500C
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+002070 0013 0000 01 ACTUAL LOCATION IN SECONDS
+ 0001 01 ACTUAL LOCATION IN MINUTES
+ 0002 01 ACTUAL LOCATION IN DEGREES
+ 0003 01 ACTUAL LOCATION IN DECIDEGREES
+ 0004 01 ACTUAL LOCATION OM CENTIDEGREES
+ 0005 01 REFERENCED TO CHECKPOINT IN SECONDS
+ 0006 01 REFERENCED TO CHECKPOINT IN MINUTES
+ 0007 01 REFERENCED TO CHECKPOINT IN DEGREES
+ 0008 01 REFERENCED TO CHECKPOINT IN DECIDEGREES
+ 0009 01 REFERENCED TO CHECKPOINT IN CENTIDEGREES
+ 0010 01 ACTUAL LOCATION IN TENTHS OF A MINUTE
+ 0011 01 REFERENCED TO CHECKPOINT IN TENTHS OF A MINUTE
+ 0015 01 MISSING VALUE
+002080 0005 0000 01 KAYSAM
+ 0001 01 TOTEX
+ 0002 01 KKS
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+002081 0009 0000 01 GP26
+ 0001 01 GP28
+ 0002 01 GP30
+ 0003 01 HM26
+ 0004 01 HM28
+ 0005 01 HM30
+ 0006 01 SV16
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002083 0006 0000 01 HIGH BAY
+ 0001 01 LOW BAY
+ 0002 01 BALLOON INFLATION LAUNCH SYSTEM (BILS)
+ 0003 01 ROOF-TOP BILS
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002084 0005 0000 01 HYDROGEN
+ 0001 01 HELIUM
+ 0002 01 NATURAL GAS
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002095 0005 0000 01 CAPACITANCE ANEROID
+ 0001 01 DERIVED FROM GPS
+ 0002 01 RESISTIVE STRAIN GAUGE
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002096 0005 0000 01 ROD THERMISTOR
+ 0001 01 BEAD THERMISTOR
+ 0002 01 CAPACITANCE BEAD
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002097 0008 0000 01 VIZ MARK II CARBON HYGRISTOR
+ 0001 01 VIZ B2 HYGRISTOR
+ 0002 01 VAISALA A-HUMICAP
+ 0003 01 VAISALA H-HUMICAP
+ 0004 01 CAPACITANCE SENSOR
+ 0005 01 VAISALA RS90
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002098 0005 0000 01 HH POLARISATION
+ 0001 01 VV POLARISATION
+ 0002 01 HV POLARISATION REAL VALUED COMPONENT
+ 0003 01 HV POLARISATION IMAGINARY VALUED COMPONENT
+ 0007 01 MISSING VALUE
+002101 0010 0000 01 CENTRE FRONT-FED PARABOLOID
+ 0001 01 OFFSET FRONT-FED PARABOLOID
+ 0002 01 CENTRE CASSEGRAIN PARABOLOID
+ 0003 01 OFFSET CASSEGRAIN PARABOLOID
+ 0004 01 PLANAR ARRAY
+ 0005 01 COAXIAL-COLLINEAR ARRAY
+ 0006 01 YAGI ELEMENTS ARRAY
+ 0007 01 MICROSTRIP
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002103 0002 0001 01 RADAR ANTENNA IS PROTECTED BY A RADOME
+ 0002 01 MISSING VALUE
+002104 0007 0000 01 HORIZONTAL POLARISATION
+ 0001 01 VERTICAL POLARISATION
+ 0002 01 RIGHT CIRCULAR POLARISATION
+ 0003 01 LEFT CIRCULAR POLARSZATION
+ 0004 01 HORIZONTAL AND VERTICAL POLARISATION
+ 0005 01 RIGHT AND LEFT CIRCULAR POLARISATION
+ 0015 01 MISSING VALUE
+002115 0007 0000 01 PDB
+ 0001 01 RSOIS
+ 0002 01 ASOS
+ 0003 01 PSYCHROMETER
+ 0004 01 F420
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002119 0008 0000 01 INTERMEDIATE FREQUENCY CALIBRATION MODE (IFCAL)
+ 0001 01 BUILT-IN TEST EQUIPMENT DIGITAL (BITE DGT)
+ 0002 01 BUILT-IN TEST EQUIPMENT RADIO FREQUENCY (BITE RF)
+ 0003 01 PRESET TRACKING (PSET TRK)
+ 0004 01 PRESET LOOP OUT
+ 0005 01 ACQUISITION
+ 0006 01 TRACKING
+ 0007 01 MISSING VALUE
+002131 0001 0001 01 STC OPERATIONAL
+002143 0021 0000 01 RESERVED
+ 0001 01 BREWER SPECTROPHOTOMETER
+ 0002 01 CAVER TEICHERT
+ 0003 01 DOBSON
+ 0004 01 DOBSON (JAPAN)
+ 0005 01 EHMET
+ 0006 01 FECKER TELESCOPE
+ 0007 01 HOELPER
+ 0008 01 JODMETER
+ 0009 01 FILTER OZONOMETER M-83
+ 0010 01 MAST
+ 0011 01 OXFORD
+ 0012 01 PAETZOLD
+ 0013 01 REGENER
+ 0014 01 RESERVED FOR FUTURE USE
+ 0015 01 VASSY FILTER OZONOMETER
+ 0016 01 CARBON IODIDE
+ 0017 01 SURFACE OZONE BUBLER
+ 0018 01 FILTER OZONOMETER M-124
+ 0019 01 ECC SONDE
+ 0127 01 MISSING VALUE
+002144 0008 0000 01 DIRECT SUN, ATTENUATOR #0
+ 0001 01 DIRECT SUN, ATTENUATOR #1
+ 0002 01 DIRECT SUN, ATTENUATOR #2
+ 0003 01 FOCUSSED MOON
+ 0004 01 FOCUSSED SUN
+ 0005 01 FOCUSSED SUN CORRECTED WITH ADJACENT SKY MEASUREMENTS
+ 0006 01 ZENITH SKY
+ 0015 01 MISSING VALUE
+002145 0009 0000 01 WAVELENGTH AD ORDINARY SETTING
+ 0001 01 WAVELENGTH BD ORDINARY SETTING
+ 0002 01 WAVELENGTH CD ORDINARY SETTING
+ 0003 01 WAVELENGTH CC' ORDINARY SETTING
+ 0004 01 WAVELENGTH AD FOCUSSING IMAGE
+ 0005 01 WAVELENGTH BD FOCUSSING IMAGE
+ 0006 01 WAVELENGTH CD FOCUSSING IMAGE
+ 0007 01 WAVELENGTH CC' FOCUSSING IMAGE
+ 0015 01 MISSING VALUE
+002146 0011 0000 01 ON DIRECT SUN
+ 0001 01 ON DIRECT MOON
+ 0002 01 ON BLUE ZENITH SKY
+ 0003 01 ON ZENITH CLOUD (UNIFORM STRATIFIED LAYER OF SMALL OPACITY)
+ 0004 02 ON ZENITH CLOUD (UNIFORM OR MODERATELY VARIABLE LAYER OF MED
+ IUM OPACITY)
+ 0005 02 ON ZENITH CLOUD (UNIFORM OR MODERATELY VARIABLE LAYER OF LAR
+ GE OPACITY)
+ 0006 02 ON ZENITH CLOUD (HIGHLY VARIABLE OPACITY, WITH OR WITOUT PRE
+ CIPITATION)
+ 0007 01 ON ZENITH CLOUD (FOG)
+ 0008 01 ON ZENITH HAZE
+ 0009 01 ON DIRECT SUN THROUGH THIN CLOUD, FOG OR HAZE
+ 0015 01 MISSING VALUE
+002148 0006 0000 01 RESERVED
+ 0001 01 ARGOS
+ 0002 01 GPS
+ 0003 01 GOES DCP
+ 0004 01 METEOSAT DCP
+ 0031 01 MISSING VALUE
+002149 0022 0000 01 UNSPECIFIED DRIFTING BUOY
+ 0001 01 STANDARD LAGRANGIAN DRIFTER (GLOBAL DRIFTER PROGRAMME)
+ 0002 01 STANDARD FGGE TYPE DRIFTING BUOY
+ 0003 01 WIND MEASURING FGGE TYPE DRIFTING BUOY
+ 0004 01 ICE FLOAT
+ 0008 01 UNSPECIFIED SUB-SURFACE FLOAT
+ 0009 01 SOFAR
+ 0010 01 ALACE
+ 0011 01 MARVOR
+ 0012 01 RAFOS
+ 0016 01 UNSPECIFIED MOORED BUOY
+ 0017 01 NOMAD
+ 0018 01 3-METRE DISCUS
+ 0019 01 10-12-METRE DISCUS
+ 0020 01 ODAS 30 SERIES
+ 0021 01 ATLAS (E.G. TAO AREA)
+ 0022 01 TRITON BUOY
+ 0023 01 RESERVED
+ 0024 01 OMNIDIRECTIONAL WAVERIDER
+ 0025 01 DIRECTIONAL WAVERIDER
+ 0026 01 SUB-SURFACE ARGO FLOAT
+ 0063 01 MISSING VALUE
+002150 0055 0000 01 RESERVED
+ 0001 01 HIRS 1
+ 0002 01 HIRS 2
+ 0003 01 HIRS 3
+ 0004 01 HIRS 4
+ 0005 01 HIRS 5
+ 0006 01 HIRS 6
+ 0007 01 HIRS 7
+ 0008 01 HIRS 8
+ 0009 01 HIRS 9
+ 0010 01 HIRS 10
+ 0011 01 HIRS 11
+ 0012 01 HIRS 12
+ 0013 01 HIRS 13
+ 0014 01 HIRS 14
+ 0015 01 HIRS 15
+ 0016 01 HIRS 16
+ 0017 01 HIRS 17
+ 0018 01 HIRS 18
+ 0019 01 HIRS 19
+ 0020 01 HIRS 20
+ 0021 01 MSU 1
+ 0022 01 MSU 2
+ 0023 01 MSU 3
+ 0024 01 MSU 4
+ 0025 01 SSU 1
+ 0026 01 SSU 2
+ 0027 01 SSU 3
+ 0028 01 AMSU-A 1
+ 0029 01 AMSU-A 2
+ 0030 01 AMSU-A 3
+ 0031 01 AMSU-A 4
+ 0032 01 AMSU-A 5
+ 0033 01 AMSU-A 6
+ 0034 01 AMSU-A 7
+ 0035 01 AMSU-A 8
+ 0036 01 AMSU-A 9
+ 0037 01 AMSU-A 10
+ 0038 01 AMSU-A 11
+ 0039 01 AMSU-A 12
+ 0040 01 AMSU-A 13
+ 0041 01 AMSU-A 14
+ 0042 01 AMSU-A 15
+ 0043 01 AMSU-B 1
+ 0044 01 AMSU-B 2
+ 0045 01 AMSU-B 3
+ 0046 01 AMSU-B 4
+ 0047 01 AMSU-B 5
+ 0048 01 AVHRR 1
+ 0049 01 AVHRR 2
+ 0050 01 AVHRR 3A
+ 0051 01 AVHRR 3B
+ 0052 01 AVHRR 4
+ 0053 01 AVHRR 5
+ 0063 01 MISSING VALUE
+002151 0009 0000 01 HIRS
+ 0001 01 MSU
+ 0002 01 SSU
+ 0003 01 AMSU-A1-1
+ 0004 01 AMSU-A1-2
+ 0005 01 AMSU-A2
+ 0006 01 AMSU-B
+ 0007 01 AVHRR
+ 2047 01 MISSING VALUE
+002152 0011 0001 01 HIGH-RESOLUTION INFRARED SOUNDER(HIRS)
+ 0002 01 MICROWAVE SOUNDING UNIT (MSU)
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+ 0009 01 GEOSTATIONARY IMAGER
+ 0010 01 GEOSTATIONARY SOUNDER
+ 0011 01 GEOSTATIONARY EARTH RADIATION (GERB)
+002158 0008 0001 01 MISMATCH IN RED VEC HPA
+ 0002 01 MISMATCH IN RED VEC RFSS
+ 0003 01 PTR CALIBRATION BAND 320 MHZ (KU)
+ 0004 01 PTR CALIBRATION BAND 80 MHZ (KU)
+ 0005 01 PTR CALIBRATION BAND 20 MHZ (KU)
+ 0006 01 PTR CALIBRATION BAND 160 MHZ (S)
+ 0007 01 KU FLIGHT CALIBRATION PARAMETERS AVAILABLE
+ 0008 01 S FLIGHT CALIBRATION PARAMETERS AVAILABLE
+002159 0005 0001 01 TEMPERATURE INCONSISTENCY
+ 0002 01 DATA IS MISSING
+ 0003 01 REDUNDANCY CHANNEL
+ 0004 01 POWER BUS PROTECTION
+ 0005 01 OVERVOLTAGE/OVERLOAD PROTECTION
+002163 0015 0000 01 AUTO EDITOR
+ 0001 01 IRW HEIGHT ASSIGNMENT
+ 0002 01 WV HEIGHT ASSIGNMENT
+ 0003 01 H2O INTERCEPT HEIGHT ASSIGNMENT
+ 0004 01 CO2 SLICING HEIGHT ASSIGNMENT
+ 0005 01 LOW PIXEL MAX GRADIENT
+ 0006 01 HIGHER PIXEL MAX GRADIENT
+ 0007 01 PRIMARY HEIGHT ASSIGNMENT
+ 0008 01 LAYER THICKNESS ASSIGNMENT
+ 0009 01 CUMULATIVE CONTRIBUTION FUNCTION -10 PERCENT HEIGHT
+ 0010 01 CUMULATIVE CONTRIBUTION FUNCTION -50 PERCENT HEIGHT
+ 0011 01 CUMULATIVE CONTRIBUTION FUNCTION -90 PERCENT HEIGHT
+ 0012 02 CUMULATIVE CONTRIBUTION FUNCTION - HEIGHT OF
+ MAXIMUM GRADIENT
+ 0014 01 COMPOSITE HEIGHT ASSIGNMENT
+ 0015 01 MISSING VALUE
+002164 0004 0000 01 LP - NORMS LEAST SQUARE MINIMUM
+ 0001 01 EN - EUCLIDEAN NORM WITH RADIANCE CORRELATION
+ 0002 01 CC - CROSS CORRELATION
+ 0007 01 MISSING VALUE
+002166 0006 0000 01 TYPE NOT DEFINED
+ 0001 01 AUTOMATED STATISTICAL REGRESSION
+ 0002 01 CLEAR PATH
+ 0003 01 PARTLY CLOUDY PATH
+ 0004 01 CLOUDY PATH
+ 0015 01 MISSING VALUE
+002167 0004 0000 01 METHOD NOT DEFINE
+ 0001 01 1B RAW RADIANCE
+ 0002 01 PROCESSED RADIANCE
+ 0015 01 MISSING VALUE
+002169 0004 0000 01 CUP ROTOR
+ 0001 01 PROPELLER ROTOR
+ 0002 01 WIND OBSERVATION THROUGH AMBIENT NOISE (WOTAN)
+ 0015 01 MISSING VALUE
+002172 0003 0001 01 RETRIEVAL FROM A NADIR SOUNDING
+ 0002 01 RETRIEVAL FROM A LIMB SOUNDING
+ 0255 01 MISSING VALUE
+002175 0009 0000 01 MANUAL MEASUREMENT
+ 0001 01 TIPPING BUCKET METHOD
+ 0002 01 WEIGHING METHOD
+ 0003 01 OPTICAL METHOD
+ 0004 01 PRESSURE METHOD
+ 0005 01 FLOAT METHOD
+ 0006 01 DROP COUNTER METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002176 0006 0000 01 MANUAL OBSERVATION
+ 0001 01 VIDEO CAMERA METHOD
+ 0002 01 INFRA-RED METHOD
+ 0003 01 LASER METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002177 0005 0000 01 MANUAL OBSERVATION
+ 0001 01 ULTRASONIC METHOD
+ 0002 01 VIDEO CAMERA METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002178 0005 0000 01 MANUAL OBSERVATION
+ 0001 01 OPTICAL METHOD
+ 0002 01 CAPACITIVE METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002179 0006 0000 01 MANUAL OBSERVATION
+ 0001 01 VAISALA ALGORITHM
+ 0002 01 ASOS (FAA) ALGORITHM
+ 0003 01 AWOS (CANADA) ALGORITHM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002180 0008 0000 01 MANUAL OBSERVATION
+ 0001 02 OPTICAL SCATTER SYSTEM COMBINED WITH PRECIPITATION
+ OCCURRENCE SENSING SYSTEM
+ 0002 01 FORWARD AND/OR BACK-SCATTER SYSTEM OF VISIBLE LIGHT
+ 0003 01 FORWARD AND/OR BACK-SCATTER SYSTEM OF INFRARED LIGHT
+ 0004 01 INFRARED LIGHT EMITTING DIODE (IRED) SYSTEM
+ 0005 01 DOPPLER RADAR SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002181 0005 0001 01 RAIN DETECTOR
+ 0002 01 FREEZING RAIN SENSOR
+ 0003 01 ICE DETECTION SENSOR
+ 0004 01 HAIL AND ICE PELLET SENSOR
+ 0020 01 OTHER
+002182 0007 0000 01 MANUAL MEASUREMENT
+ 0001 01 TRANSMISSOMETER SYSTEM (BASE > 25)
+ 0002 01 TRANSMISSOMETER SYSTEM (BASE < 25 M)
+ 0003 01 FORWARD SCATTER SYSTEM
+ 0004 01 BACK SCATTER SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002183 0009 0000 01 MANUAL OBSERVATION
+ 0001 01 CEILOMETER SYSTEM
+ 0002 01 INFRARED CAMERA SYSTEM
+ 0003 01 MICROWAVE VISUAL CAMERA SYSTEM
+ 0004 01 SKY IMAGER SYSTEM
+ 0005 01 VIDEO TIME LAPSED CAMERA SYSTEM
+ 0006 01 MICRO PULSE LIDAR (MPL) SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002184 0008 0000 01 MANUAL OBSERVATION
+ 0001 01 LIGHTNING IMAGING SENSOR
+ 0002 01 ELECTRICAL STORM IDENTIFICATION SENSOR
+ 0003 01 MAGNETIC FINDER SENSOR
+ 0004 01 LIGHTNING STRIKE SENSOR
+ 0005 01 FLASH COUNTER
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002185 0007 0000 01 MANUAL MEASUREMENT
+ 0001 01 BALANCED FLOATING METHOD
+ 0002 01 PRESSURE METHOD
+ 0003 01 ULTRASONIC METHOD
+ 0004 01 HYDRAULIC METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002186 0023 0001 01 PRECIPITATION-UNKNOWN TYPE
+ 0002 01 LIQUID PRECIPITATION NOT FREEZING
+ 0003 01 LIQUID FREEZING PRECIPITATION
+ 0004 01 DRIZZLE
+ 0005 01 RAIN
+ 0006 01 SOLID PRECIPITATION
+ 0007 01 SNOW
+ 0008 01 SNOW GRAINS
+ 0009 01 SNOW PELLETS
+ 0010 01 ICE PELLETS
+ 0011 01 ICE CRYSTALS
+ 0012 01 DIAMOND DUST
+ 0013 01 SMALL HAIL
+ 0014 01 HAIL
+ 0015 01 GLAZE
+ 0016 01 RIME
+ 0017 01 SOFT RIME
+ 0018 01 HARD RIME
+ 0019 01 CLEAR ICE
+ 0020 01 WET SNOW
+ 0021 01 HOAR FROST
+ 0022 01 DEW
+ 0023 01 WHITE DEW
+002187 0011 0001 01 DUST/SAND WHIRL
+ 0002 01 SQUALLS
+ 0003 01 SAND STORM
+ 0004 01 DUST STORM
+ 0005 01 LIGHTNING - CLOUD TO SURFACE
+ 0006 01 LIGHTNING - CLOUD TO CLOUD
+ 0007 01 LIGHTNING - DISTANT
+ 0008 01 THUNDERSTORM
+ 0009 01 FUNNEL CLOUD NOT TOUCHING SURFACE
+ 0010 01 FUNNEL CLOUD TOUCHING SURFACE
+ 0011 01 SPRAY
+002188 0010 0001 01 FOG
+ 0002 01 ICE FOG
+ 0003 01 STEAM FOG
+ 0007 01 MIST
+ 0008 01 HAZE
+ 0009 01 SMOKE
+ 0010 01 VOLCANIC ASH
+ 0011 01 DUST
+ 0012 01 SAND
+ 0013 01 SNOW
+002189 0004 0001 01 MANUAL OBSERVATION
+ 0002 01 ALL LIGHTNING STRIKES WITHOUT DISCRIMINATION
+ 0003 01 LIGHTNING STRIKES CLOUD TO GROUND ONLY
+ 0004 02 ALL LIGHTNING STRIKES WITH DISCRIMINATION BETWEEN
+ CLOUD TO GROUND AND CLOUD TO CLOUD
+002194 0002 0000 01 FGGE
+ 0015 01 MISSING VALUE
+002196 0017 0000 01 NIMBUS
+ 0001 01 VTPR
+ 0002 01 TIROS 1 ( TIROS NOAA 6 TO NOAA 13)
+ 0003 01 TIROS 2 ( NOAA-14 ONWARD)
+ 0031 01 DMSP
+ 0061 01 EUMETSAT POLAR SYSTEM (EPS)
+ 0091 01 ERS
+ 0121 01 ADEOS
+ 0241 01 GOES
+ 0271 01 GMS
+ 0301 01 INSAT
+ 0331 01 METEOSAT OPERATIONAL PROGRAMME(MOP)
+ 0332 01 METEOSAT TRANSITIONAL PROGRAMME(MTP)
+ 0333 01 METEOSAT SECOND GENERATION PROGRAMME(MSG)
+ 0351 01 GOMS
+ 0381 01 FY-2
+ 0512 01 MISSING VALUE
+002199 0004 0000 01 RESERVED
+ 0001 01 TABLE WITH FULL RANGE OF HUMMIDITY VALUES IN LAYER
+ 0002 01 REGRESSION TECHNIQUE ON 2 HUMMIDITY VALUES IN LAYER
+ 0015 01 MISSING VALUE
+002216 0017 0001 01 CALIBRATION/MEASUREMENT PULSE FLAG (1)
+ 0002 01 CALIBRATION/MEASUREMENT PULSE FLAG (2)
+ 0003 01 OUTER ANTENNA BEAM
+ 0004 01 SIGMA-0 CELL IS AFT OF SPACECRAFT
+ 0005 01 CURRENT MODE (1)
+ 0006 01 CURRENT MODE (2)
+ 0007 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (1)
+ 0008 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (2)
+ 0009 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (3)
+ 0010 01 LOW RESOLUTION MODE - WHOLE PULSE DATA
+ 0011 01 SCATTEROMETER ELECTRONIC SUBSYSTEM B
+ 0012 01 ALTERNATE SPIN RATE - 19.8 RPM
+ 0013 01 RECEIVER PROTECTION ON
+ 0014 01 SLICES PER COMPOSITE FLAG(1)
+ 0015 01 SLICES PER COMPOSITE FLAG(2)
+ 0016 01 SLICES PER COMPOSITE FLAG(3)
+ 0017 01 MISSING VALUE
+002231 0015 0000 01 RESERVED
+ 0001 01 IRW HEIGHT ASSIGNMENT
+ 0002 01 WV HEIGHT ASSIGNMENT
+ 0003 01 H2O INTERCEPT HEIGHT ASSIGNMENT
+ 0004 01 CO2 SLICING HEIGHT ASSIGNMENT
+ 0005 01 LOW PIXEL MAX GRADIENT
+ 0006 01 HIGHER PIXEL MAX GRADIENT
+ 0007 01 PRIMARY HEIGHT ASSIGNMENT
+ 0008 01 LAYER THICKNESS ASSIGNMENT
+ 0009 01 CUMULATIVE CONTRIBUTION FUNCTION -10 PERCENT HEIGHT
+ 0010 01 CUMULATIVE CONTRIBUTION FUNCTION -50 PERCENT HEIGHT
+ 0011 01 CUMULATIVE CONTRIBUTION FUNCTION -90 PERCENT HEIGHT
+ 0012 02 CUMULATIVE CONTRIBUTION FUNCTION - HEIGHT OF MAXIMU
+ M GRADIENT
+ 0014 01 COMPOSITE HEIGHT ASSIGNMENT
+ 0015 01 MISSING VALUE
+002232 0004 0000 01 P - NORMS LEAST SQUARE MINIMUM
+ 0001 01 EN - EUCLIDEAN NORM WITH RADIANCE CORRELATION
+ 0002 01 CC - CROSS CORRELATION
+ 0003 01 MISSING VALUE
+002251 0004 0000 01 METHOD NOT DEFINED
+ 0001 01 1B RAW RADIANCE
+ 0002 01 PROCESSED RADIANCE
+ 0015 01 MISSING VALUE
+002252 0012 0001 01 HIGH-RESOLUTION INFRARED SOUNDER(HIRS)
+ 0002 01 MICROWAVE SOUNDING UNIT (MSU)
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+ 0009 01 GEOSTATIONARY IMAGER
+ 0010 01 GEOSTATIONARY SOUNDER
+ 0011 01 GEOSTATIONARY EARTH RADIATION (GERB)
+ 0012 01 MULTI-CHANNEL SCANNING RADIOMETER
+002254 0006 0000 01 TYPE NOT DEFINED
+ 0001 01 AUTOMATED STATISTICAL REGRESSION
+ 0002 01 CLEAR PATH
+ 0003 01 PARTLY CLOUDY PATH
+ 0004 01 CLOUDY PATH
+ 0015 01 MISSING VALUE
+004059 0005 0001 01 00 UTC
+ 0002 01 06 UTC
+ 0003 01 12 UTC
+ 0004 01 18 UTC
+ 0005 01 OTHER HOURS
+008001 0007 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 MAXIMUM WIND LEVEL
+ 0005 01 SIGNIFICANT LEVEL, TEMPERATURE AND/OR RELATIVE HUMIDITY
+ 0006 01 SIGNIFICANT LEVEL, WIND
+ 0007 01 MISSING VALUE
+008002 0013 0000 02 OBSERVING RULES FOR BASE OF LOWEST CLOUD AND CLOUD TYPES OF
+ FM 12-IX EXT. SYNOP AND FM 13-IX EXT. SHIP APPLY
+ 0001 01 FIRST NON - CB SIGNIFICANT LAYER
+ 0002 01 SECOND NON - CB SIGNIFICANT LAYER
+ 0003 01 THIRD NON - CB SIGNIFICANT LAYER
+ 0004 01 CUMULONIMBUS LAYER
+ 0005 01 CEILING
+ 0006 01 CLOUD NOT DETECTED BELOW THE FOLLOWING HEIGHT(S)
+ 0007 01 LOW CLOUD
+ 0008 01 MIDDLE CLOUD
+ 0009 01 HIGH CLOUD
+ 0010 02 CLOUD LAYER WITH BASE BELOW THE STATION LEVEL AND TOP
+ ABOVE THE STATION LEVEL
+ 0011 01 CLOUD LAYER WITH BASE AND TOP BELOW THE STATION LEVEL
+ 0063 01 MISSING VALUE
+008003 0009 0000 01 SURFACE
+ 0001 01 BASE OF SATELLITE SOUNDING
+ 0002 01 CLOUD TOP
+ 0003 01 TROPOPAUSE
+ 0004 01 PRECIPITABLE WATER
+ 0005 01 SOUNDING RADIANCES
+ 0006 01 MEAN TEMPERATURES
+ 0007 01 OZON
+ 0063 01 MISSING VALUE
+008004 0006 0002 01 UNSTEADY (UNS)
+ 0003 01 LEVEL FLIGHT, ROUTINE OBSERVATION (LVR)
+ 0004 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED (LVW)
+ 0005 01 ASCENDING (ASC)
+ 0006 01 DESCENDING(DES)
+ 0007 01 MISSING VALUE
+008005 0007 0000 01 RESERVED
+ 0001 01 STORM CENTRE
+ 0002 01 OUTER LIMIT OR EDGE OF STORM
+ 0003 01 LOCATION OF MAXIMUM WIND
+ 0004 01 LOCATION OF STORM IN THE PERTURBED ANALYSIS
+ 0005 01 LOCATION OF STORM IN THE ANALYSIS
+ 0015 01 MISSING VALUE
+008006 0008 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 PROMINENT MAXIMUM LEVEL
+ 0005 01 PROMINENT MINIMUM LEVEL
+ 0006 01 MINIMUM PRESSURE LEVEL
+ 0007 01 RESERVED
+ 0008 01 LEVEL OF UNDETERMINED SIGNIFICANCE
+008007 0005 0000 01 POINT
+ 0001 01 LINE
+ 0002 01 AREA
+ 0003 01 VOLUME
+ 0015 01 MISSING VALUE
+008008 0008 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 LEVEL OF BETA RADIATION MAXIMUM
+ 0005 01 LEVEL OF GAMMA RADIATION MAXIMUM
+ 0006 01 MINIMUM PRESSURE LEVEL
+ 0007 01 RESERVED
+ 0008 01 LEVEL OF UNDETERMINED SIGNIFICANCE
+008009 0016 0000 01 LEVEL FLIGHT, ROUTINE OBSERVATION, UNSTEADY
+ 0001 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED, UNSTEADY
+ 0002 01 UNSTEADY (UNS)
+ 0003 01 LEVEL FLIGHT, ROUTINE OBSERVATION (LVR)
+ 0004 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED (LVW)
+ 0005 01 ASCENDING (ASC)
+ 0006 01 DESCENDING (DES)
+ 0007 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS
+ 0008 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS, UNSTEADY
+ 0009 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS
+ 0010 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS, UNSTEADY
+ 0011 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS
+ 0012 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS, UNSTEADY
+ 0013 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS
+ 0014 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS, UNSTEADY
+ 0015 01 MISSING VALUE
+008010 0013 0000 01 RESERVED
+ 0001 01 BARE SOIL
+ 0002 01 BARE ROCK
+ 0003 01 LAND GRASS COVER
+ 0004 01 WATER (LAKE, SEA)
+ 0005 01 FLOOD WATER UNDERNEATH
+ 0006 01 SNOW
+ 0007 01 ICE
+ 0008 01 RUNWAY OR ROAD
+ 0009 01 SHIP OR PLATFORM DECK IN STEEL
+ 0010 01 SHIP OR PLATFORM DECK IN WOOD
+ 0011 01 SHIP OR PLATFORM DECK PARTLY COVERED WITH RUBBER MAT
+ 0031 01 MISSING VALUE
+008011 0026 0000 01 QUASI-STATIONARY FRONT AT THE SURFACE
+ 0001 01 QUASI-STATIONARY FRONT ABOVE THE SURFACE
+ 0002 01 WARM FRONT AT THE SURFACE
+ 0003 01 WARM FRONT ABOVE THE SURFACE
+ 0004 01 COLD FRONT AT THE SURFACE
+ 0005 01 COLD FRONT ABOVE THE SURFACE
+ 0006 01 OCCLUSION
+ 0007 01 INSTABILITY LINE
+ 0008 01 INTERTROPICAL FRONT
+ 0009 01 CONVERGENCE LINE
+ 0010 01 JET STREAM
+ 0011 01 CLOUD CLEAR
+ 0012 01 CLOUD
+ 0013 01 TURBULENCE
+ 0014 01 STORM
+ 0015 01 AIRFRAME ICING
+ 0016 01 PHENOMENON
+ 0017 01 VOLCANO
+ 0018 01 ATMOSPHERICS
+ 0020 01 SPECIAL CLOUDS
+ 0021 01 THUNDERSTORM (VAL)
+ 0022 01 TROPICAL CYCLONE (VAL)
+ 0023 01 MOUNTAIN WAVE (VAL)
+ 0024 01 DUSTSTORM (VAL)
+ 0025 01 SANDSTORM (VAL)
+ 0063 01 MISSING VALUE
+008012 0004 0000 01 LAND
+ 0001 01 SEA
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008013 0004 0000 01 NIGHT
+ 0001 01 DAY
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008014 0010 0000 01 10-MINUTE MEAN VALUE - NORMAL VALUE
+ 0001 02 10-MINUTE MEAN VALUE - ABOVE THE UPPER LIMIT FOR ASSESSMENT
+ OF RVR (P)
+ 0002 02 10-MINUTE MEAN VALUE - BELOW LOWER LIMIT FOR ASSESSMENT OF R
+ VR (M)
+ 0003 01 ONE MINUTE MINIMUM VALUE - NORMAL VALUE
+ 0004 02 ONE MINUTE MINIMUM VALUE - ABOVE THE UPPER LIMIT FOR ASSESSM
+ ENT OF RVR (P)
+ 0005 02 ONE MINUTE MINIMUM VALUE - BELOW LOWER LIMIT FOR ASSESSMENT
+ OF RVR (M)
+ 0006 01 ONE MINUTE MAXIMUM VALUE - NORMAL VALUE
+ 0007 02 ONE MINUTE MAXIMUM VALUE - ABOVE THE UPPER LIMIT FOR ASSESS
+ MENT OF RVR (P)
+ 0008 02 ONE MINUTE MAXIMUM VALUE - BELOW LOWER LIMIT FOR ASSESSMENT
+ OF RVR (M)
+ 0015 01 MISSING VALUE
+008016 0005 0000 01 NOSIG
+ 0001 01 BECMG
+ 0002 01 TEMPO
+ 0003 01 FM
+ 0007 01 MISSING VALUE
+008017 0004 0000 01 FM
+ 0001 01 TL
+ 0002 01 AT
+ 0003 01 MISSING VALUE
+008018 0005 0001 01 LAND IS PRESENT
+ 0002 01 SURFACE ICE MAP INDICATES ICE IS PRESENT
+ 0011 01 ICE MAP DATA NOT AVAILABLE
+ 0012 01 ATTENUATION MAP DATA NOT AVAILABLE
+ 0017 01 MISSING VALUE
+008021 0032 0000 01 RESERVED
+ 0001 01 TIME SERIES
+ 0002 01 TIME AVERAGED
+ 0003 01 ACCUMULATED
+ 0004 01 FORECAST
+ 0005 01 FORECAST TIME SERIES
+ 0006 01 FORECAST TIME AVERAGED
+ 0007 01 FORECAST ACCUMULATED
+ 0008 01 ENSEMBLE MEAN
+ 0009 01 ENSEMBLE MEAN TIME SERIES
+ 0010 01 ENSEMBLE MEAN TIME AVERAGED
+ 0011 01 ENSEMBLE MEAN ACCUMULATED
+ 0012 01 ENSEMBLE MEAN FORECAST
+ 0013 01 ENSEMBLE MEAN FORECAST TIME SERIES
+ 0014 01 ENSEMBLE MEAN FORECAST AVERAGED
+ 0015 01 ENSEMBLE MEAN FORECAST ACCUMULATED
+ 0016 01 ANALYSIS
+ 0017 01 START OF PHENOMENON
+ 0018 01 RADIOSONDE LAUNCH TIME
+ 0019 01 START OF ORBIT
+ 0020 01 END OF ORBIT
+ 0021 01 TIME OF ASCENDING NODE
+ 0022 01 TIME OF OCCURENCE OF WIND SHIFT
+ 0023 01 MONITORING PERIOD
+ 0024 01 AGREED TIME LIMIT FOR REPORT RECEPTION
+ 0025 01 NOMINAL REPORTING TIME
+ 0026 01 TIME OF LAST KNOWN POSITION
+ 0027 01 FIRST GUESS --NOT WMO ENTRY
+ 0028 01 START OF SCAN --NOT WMO ENTRY
+ 0029 01 END OF SCAN --NOT WMO ENTRY
+ 0030 01 RESERVED
+ 0031 01 MISSING VALUE
+008023 0017 0002 01 MAXIMUM VALUE
+ 0003 01 MINIMUM VALUE
+ 0004 01 MEAN VALUE
+ 0005 01 MEDIAN VALUE
+ 0006 01 MODAL VALUE
+ 0007 01 MEAN ABSOLUTE ERROR
+ 0009 01 BEST ESTIMATE OF STANDARD DEVIATION (N-1)
+ 0010 01 STANDARD DEVIATION
+ 0011 01 HARMONIC MEAN
+ 0012 01 ROOT MEAN SQUARE VECTOR ERROR
+ 0013 01 ROOT-MEAN-SQUARE
+ 0032 01 PROBABILITY OF GROSS ERROR
+ 0033 01 PRESCRIBED OBSERVATION ERROR
+ 0034 01 PERSISTENCE OBSERVATION ERROR
+ 0035 01 FINAL OBSERVATION ERROR
+ 0036 01 REPRESENTATIVNESS OBSERVATION ERROR
+ 0063 01 MISSING
+008024 0015 0002 01 OBSERVED MINUS MAXIMUM
+ 0003 01 OBSERVED MINUS MINIMUM
+ 0004 01 OBSERVED MINUS MEAN
+ 0005 01 OBSERVED MINUS MEDIAN
+ 0006 01 OBSERVED MINUS MODE
+ 0011 01 OBSERVED MINUS CLIMATOLOGY (ANOMALY)
+ 0012 01 OBSERVED MINUS ANALYZED VALUE
+ 0013 01 OBSERVED MINUS INITIALISED ANALYZED VALUE
+ 0014 01 OBSERVED MINUS FORECAST VALUE
+ 0021 01 OBSERVED MINUS INTERPOLATED VALUE
+ 0022 01 OBSERVED MINUS HYDROSTATICALLY CALCULATED VALUE
+ 0032 01 OBSERVED MINUS FIRST GUESS
+ 0033 01 OBSERVED MINUS ANALYSIS
+ 0034 01 OBSERVED MINUS INITIALIZED ANALYSIS
+ 0063 01 MISSING
+008025 0005 0000 02 UNIVERSAL TIME COORDINATED (UTC) MINUS
+ LOCAL STANDARD TIME (LST)
+ 0001 01 LOCAL STANDARD TIME
+ 0002 01 UNIVERSAL TIME COORDINATED (UTC) MINUS SATELLITE CLOCK
+ 0005 01 TIME DIFFERENCE FROM EDGE OF PROCESSING SEGMENT
+ 0015 01 MISSING
+008026 0005 0000 01 AVERAGING KERNEL MATRIX
+ 0001 01 CORRELATION MATRIX
+ 0002 02 LOWER TRIANGULAR CORRELATION MATRIX SQUARE ROOT (L FROM C=LL
+ T)
+ 0003 02 INVERSE LOWER TRIANGULAR CORRELATION MATRIX SQUARE ROOT (L**
+ -1)
+ 0063 01 MISSING VALUE
+008027 0007 0000 01 ASSUME NO PARTICULAR MATRIX GEOMETRY
+ 0001 01 DIAGONAL MATRIX
+ 0002 01 TRIDIAGONAL MATRIX
+ 0003 01 MULTI-DIAGONAL MATRIX (GENERAL CASE: DIAGONAL AND ABOVE)
+ 0004 01 LOWER TRIANGULAR MATRIX
+ 0005 01 SYMETRICAL MATRIX
+ 0063 01 MISSING VALUE
+008029 0005 0000 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0001 01 ENCLOSED SEA OR LAKE
+ 0002 01 CONTINENTAL ICE
+ 0003 01 LAND
+ 0255 01 MISSING
+008033 0006 0000 01 RESERVED
+ 0001 01 PERCENTAGE CONFIDENCE CALCULATED USING CLOUD FRACTION
+ 0002 02 PERCENTAGE CONFIDENCE CALCULATED USING STANDARD
+ DEVIATION OF TEMPERATURE
+ 0003 02 PERCENTAGE CONFIDENCE CALCULATED USING PROBABILITY OF
+ THE CLOUD CONTAMINATION
+ 0004 02 PERCENTAGE CONFIDENCE CALCULATED USING NORMALITY OF DISTRIBU
+ TION
+ 0127 01 MISSING
+008035 0008 0000 01 GLOBAL
+ 0001 01 REGIONAL
+ 0002 01 NATIONAL
+ 0003 01 SPECIAL
+ 0004 01 BILATERAL
+ 0005 01 RESERVED
+ 0006 01 RESERVED
+ 0007 01 MISSING
+008036 0008 0000 01 WMO SECRETARIAT
+ 0001 01 WMO
+ 0002 01 RSMC
+ 0003 01 NMC
+ 0004 01 RTH
+ 0005 01 OBSERVING SITE
+ 0006 01 OTHER
+ 0007 01 MISSING
+008039 0008 0000 01 ISSUE TIME OF FORECAST
+ 0001 01 TIME OF COMMNENCEMENT OF PERIOD OF THE FORECAST
+ 0002 01 TIME OF ENDING OF PERIOD OF THE FORECAST
+ 0003 01 FORECSAT TIME OF MAXIMUM TEMPERATURE
+ 0004 01 FORECSAT TIME OF MINIMUM TEMPERATURE
+ 0005 01 TIME OF BEGINNING OF THE FORECAST
+ 0006 01 TIME OF ENDING OF THE FORECAST
+ 0063 01 MISSING VALUE
+008040 0043 0000 01 HIGH RESOLUTION DATA SAMPLE
+ 0001 01 WITHIN 20 HPA OF SURFACE
+ 0002 02 PRESSURE LESS THAN 10 HPA (I.E., 9, 8, 7, ETC.)
+ WHEN NO OTHER REASON APPLIES
+ 0003 01 BASE PRESSURE LEVEL FOR STABILITY INDEX
+ 0004 01 BEGIN DOUBTFUL TEMPERATURE, HEIGHT DATA
+ 0005 01 BEGIN MISSING DATA (ALL ELEMENTS)
+ 0006 01 BEGIN MISSING RH DATA
+ 0007 01 BEGIN MISSING TEMPERATURE DATA
+ 0008 02 HIGHEST LEVEL REACHED BEFORE BALLOON
+ DESCENT BECAUSE OF ICING OR TURBULENCE
+ 0009 01 END DOUBTFUL TEMPERATURE, HEIGHT DATA
+ 0010 01 END MISSING DATA (ALL ELEMENTS)
+ 0011 01 END MISSING RH DATA
+ 0012 01 END MISSING TEMPERATURE DATA
+ 0013 01 ZERO DEGREES C CROSSING(S) FOR RADAT
+ 0014 01 STANDARD PRESSURE LEVEL
+ 0015 01 OPERATOR ADDED LEVEL
+ 0016 01 OPERATOR DELETED LEVEL
+ 0017 01 BALLOON RE-ASCENDED BEYOND PREVIOUS HIGHEST ASCENT LEVEL
+ 0018 01 SIGNIFICANT RH LEVEL
+ 0019 01 RH LEVEL SELECTION TERMINATED
+ 0020 01 SURFACE LEVEL
+ 0021 01 SIGNIFICANT TEMPERATURE LEVEL
+ 0022 01 MANDATORY TEMPERATURE LEVEL
+ 0023 01 FLIGHT TERMINATION LEVEL
+ 0024 01 TROPOPAUSE(S)
+ 0025 01 AIRCRAFT REPORT
+ 0026 01 INTERPOLATED (GENERATED) LEVEL
+ 0027 01 MANDATORY WIND LEVEL
+ 0028 01 SIGNIFICANT WIND LEVEL
+ 0029 01 MAXIMUM WIND LEVEL
+ 0030 01 INCREMENTAL WIND LEVEL (FIXED REGIONAL)
+ 0031 01 INCREMENTAL HEIGHT LEVEL (GENERATED)
+ 0032 01 WIND TERMINATION LEVEL
+ 0033 01 PRESSURE 100 TO 110 HPA, WHEN NO OTHER REASON APPLIES
+ 0040 01 SIGNIFICANT THERMODYNAMIC LEVEL (INVERSION)
+ 0041 01 SIGNIFICANT RH LEVEL ( PER NCDC CRITERIA)
+ 0042 01 SIGNIFICANT TEMPERATURE LEVEL (PER NCDC)
+ 0043 01 BEGIN MISSING WIND DATA
+ 0044 01 END MISSING WIND DATA
+ 0060 01 LEVEL OF 80-KNOT ISOTACH ABOVE JET
+ 0061 01 LEVEL OF 80-KNOT ISOTACH BELOW JET
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+008041 0009 0000 01 PARENT SITE
+ 0001 01 OBSERVATION SITE
+ 0002 01 BALLOON MANUFACTURE DATE
+ 0003 01 BALLOON LAUNCH POINT
+ 0004 01 SURFACE OBSERVATION
+ 0005 01 SURFACE OBSERVATION DISPLACEMENT FROM LAUNCH POINT
+ 0006 01 FLIGHT LEVEL OBSERVATION
+ 0007 01 FLIGHT LEVEL TERMINATION POINT
+ 0031 01 MISSING VALUE
+008042 0013 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 MAXIMUM WIND LEVEL
+ 0005 01 SIGNIFICANT TEMPERATURE LEVEL
+ 0006 01 SIGNIFICANT HUMIDITY LEVEL
+ 0007 01 SIGNIFICANT WIND LEVEL
+ 0008 01 BEGINNING OF MISSING TEMPERATURE DATA
+ 0009 01 END OF MISSING TEMPERATURE DATA
+ 0010 01 BEGINNING OF MISSING HUMIDITY DATA
+ 0011 01 END OF MISSING HUMIDITY DATA
+ 0012 01 BEGINNING OF MISSING WIND DATA
+ 0013 01 END OF MISSING WIND DATA
+008043 0021 0000 01 OZONE, O3,10028-15-6
+ 0001 01 WATER VAPOUR, H2O, 7732-18-5
+ 0002 01 METHANE, CH4, 74-82-8
+ 0003 01 CARBON DIOXIDE, CO2, 37210-16-5
+ 0004 01 CARBON MONOXIDE, CO, 630-08-0
+ 0005 01 NITROGEN DIOXIDE, NO2, 10102-44-0
+ 0006 01 NITROUS OXIDE, N2O, 10024-97-2
+ 0007 01 FORMALDEHYDE, HCHO, 50-00-0
+ 0008 01 SULFUR DIOXIDE, SO2, 7446-09-5
+ 0009 01 BROMINE OXIDE, BRO, 15656-19-6
+ 0010 01 CHLORINE DIOXIDE, OCLO, 10049-04-4
+ 0011 01 NITROGEN MONOXIDE, NO, 10102-43-9
+ 0012 01 AMMONIA, NH3, 7664-41-7
+ 0025 01 PARTICULATE MATTER < 1.0 MICRONS
+ 0026 01 PARTICULATE MATTER < 2.5 MICRONS
+ 0027 01 PARTICULATE MATTER < 10 MICRONS
+ 0028 01 AEROSOLS GENERIC
+ 0029 01 SMOKE GENERIC
+ 0030 01 CRUSTAL MATERIAL (GENERIC DUST)
+ 0031 01 VOLCANIC ASH
+ 0255 01 MISSING
+008050 0011 0000 01 RESERVED
+ 0001 01 PRESSURE
+ 0002 01 TEMPERATURE
+ 0003 01 EXTREME TEMPERATURE
+ 0004 01 VAPOUR PRESSURE
+ 0005 01 PRECIPITATION
+ 0006 01 SUNSHINE DURATION
+ 0007 01 MAXIMUM TEMPERATURE
+ 0008 01 MINIMUM TEMPERATURE
+ 0009 01 WIND
+ 0015 01 MISSING VALUE
+008051 0007 0001 01 PRESSURE
+ 0002 01 TEMPERATURE
+ 0003 01 EXTREME TEMPERATURE
+ 0004 01 VAPOUR PRESSURE
+ 0005 01 PRECIPITATION
+ 0006 01 SUNSHINE DURATION
+ 0007 01 MISSING VALUE
+008052 0026 0000 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 10 M/S
+ 0001 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 20 M/S
+ 0002 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 30 M/S
+ 0003 01 MAXIMUM TEMPERATURE LESS THAN 273.2 K
+ 0004 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 298.2 K
+ 0005 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 303.2 K
+ 0006 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 308.2 K
+ 0007 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 313.2 K
+ 0008 01 MINIMUM TEMPERATURE LESS THAN 273.2 K
+ 0009 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 273.2 K
+ 0010 01 PRECIPITATION EQUAL TO OR MORE THAN 1.0 KG/M**2
+ 0011 01 PRECIPITATION EQUAL TO OR MORE THAN 5.0 KG/M**2
+ 0012 01 PRECIPITATION EQUAL TO OR MORE THAN 10.0 KG/M**2
+ 0013 01 PRECIPITATION EQUAL TO OR MORE THAN 50.0 KG/M**2
+ 0014 01 PRECIPITATION EQUAL TO OR MORE THAN 100.0 KG/M**2
+ 0015 01 PRECIPITATION EQUAL TO OR MORE THAN 150.0 KG/M**2
+ 0016 01 SNOW DEPTH MORE THAN 0.0 M
+ 0017 01 SNOW DEPTH MORE THAN 0.01 M
+ 0018 01 SNOW DEPTH MORE THAN 0.10 M
+ 0019 01 SNOW DEPTH MORE THAN 0.50 M
+ 0020 01 HORIZONTAL VISIBILITY LESS THAN 50 M
+ 0021 01 HORIZONTAL VISIBILITY LESS THAN 100 M
+ 0022 01 HORIZONTAL VISIBILITY LESS THAN 1000 M
+ 0023 01 HAIL
+ 0024 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+008053 0004 0000 01 VALUE OCCURED ON ONLY ONE DAY IN THE MONTH
+ 0001 01 VALUE OCCURED ON MORE THAN ONE DAY IN THE MONTH
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008054 0003 0000 01 WIND SPEED OR GUST IS AS REPORTED
+ 0001 02 WIND SPEED IS GREATER THAN THAT REPRTED (P IN METAR/TAF/SPEC
+ I)
+ 0007 01 MISSING VALUE
+008060 0008 0000 01 RESERVED
+ 0001 01 RANGE
+ 0002 01 AZIMUTH
+ 0003 01 HORIZONTAL
+ 0004 01 VERTICAL
+ 0005 01 NORTH/SOUTH
+ 0006 01 EAST/WEST
+ 0015 01 MISSING VALUE
+008065 0004 0000 01 NO SUN-GLINT
+ 0001 01 SUN-GLINT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008066 0004 0000 01 OPAQUE
+ 0001 01 SEMI-TRANSPARENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008070 0006 0000 01 RESERVED
+ 0001 01 RESERVED
+ 0002 02 EARTH LOCATED INSTRUMENT COUNTS,
+ CALIBRATION COEFFICIENTS AND HOUSEKEEPING (LEVEL 1B)
+ 0003 01 EARTH LOCATED CALIBRATED RADIANCES (LEVEL 1C)
+ 0004 02 MAPPED TO A COMMON FOOTPRINT, EARTH LOCATED
+ CALIBRATED RADIANCES (LEVEL 1D)
+ 0015 01 MISSING VALUE
+008072 0004 0000 01 MIXED
+ 0001 01 CLEAR
+ 0002 01 CLOUDY
+ 0007 01 MISSING VALUE
+008074 0004 0000 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0001 01 NON-OCEAN LIKE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008075 0004 0000 01 ASCENDING ORBIT
+ 0001 01 DESCENDING ORBIT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008076 0003 0000 01 KU
+ 0001 01 C
+ 0063 01 MISSING VALUE
+008077 0007 0000 01 LAND
+ 0001 01 SEA
+ 0002 01 COASTAL
+ 0003 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0004 01 ENCLOSED SEA OR LAKE
+ 0005 01 CONTINENTAL ICE
+ 0127 01 MISSING VALUE
+008079 0009 0000 01 NORMAL ISSUE
+ 0001 01 CORRECTION TO A PREVIOUSLY ISSUED PRODUCT (COR)
+ 0002 01 AMANDMENT TO A PREVIOUSLY ISSUED PRODUCT *AMD)
+ 0003 01 CORRECTION TO A PREVIOUSLY ISSUED AMENDED PRODUCT (COR AMD)
+ 0004 01 CANCELLATION OD A PREVIOUSLY ISSUED PRODUCT (CNL)
+ 0005 01 NO PRODUCT AVAILABLE (NIL)
+ 0006 01 SPECIAL REPORT ( SPECI)
+ 0007 01 CORRECTED SPECIAL REPORT (SPECI COR)
+ 0015 01 MISSING VALUE
+008080 0009 0000 01 TOTAL WATER PRESSURE PROFILE
+ 0001 01 TOTAL WATER TEMPERATURE PROFILE
+ 0002 01 TOTAL WATER SALINITY PROFILE
+ 0003 01 TOTAL WATER CONDUCTIVITY PROFILE
+ 0010 01 WATER PRESSURE AT A LEVEL
+ 0011 01 WATER TEMPERATURE AT A LEVEL
+ 0012 01 SALINITY AT A LEVEL
+ 0020 01 POSITION
+ 0063 01 MISSING VALUE
+008081 0005 0000 01 SENSOR
+ 0001 01 TRANSMITTER
+ 0002 01 RECEIVER
+ 0003 01 OBSERVING PLATFORM
+ 0063 01 MISSING VALUE
+008082 0003 0000 01 SENSOR HEIGHT IS NOT MODIFIED
+ 0001 01 SENSOR HEIGHT IS MODIFIED TO STANDARD LEVEL
+ 0007 01 MISSING VALUE
+008083 0009 0001 02 ADJUSTED WITH RESPECT TO REPRESENTATIVE HEIGHT OF SENSOR ABO
+ VE LOCAL GROUND (OR DECK OF MARINE PLATFORM)
+ 0002 02 ADJUSTED WITH RESPECT TO REPRESENTATIVE HEIGHT OF SENSOR ABO
+ VE WATER SURFACE
+ 0003 01 ADJUSTED WITH RESPECT TO STANDARD SURFACE ROUGHNESS
+ 0004 01 ADJUSTED WITH RESPECT TO WIND SPEED
+ 0005 01 ADJUSTED WITH RESPECT TO TEMPERATURE
+ 0006 01 ADJUSTED WITH RESPECT TO PRESSURE
+ 0007 01 ADJUSTED WITH RESPECT TO HUMIDITY
+ 0008 01 ADJUSTED WITH RESPECT TO EVAPORATION
+ 0009 01 ADJUSTED WITH RESPECT TO WETTING LOSSES
+008085 0008 0000 01 FORE BEAM
+ 0001 01 MID BEAM
+ 0002 01 AFT BEAM
+ 0003 01 RESERVED
+ 0004 01 RESERVED
+ 0005 01 RESERVED
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+008193 0007 0000 01 START TIME OF ORBIT
+ 0001 01 END TIME OF ORBIT
+ 0002 01 TIME OF ASCENDING NODE
+ 0003 01 ASSIMILATION TIME
+ 0004 01 START TIME OF ASSIMILATION
+ 0005 01 END TIME OF ASSIMLATION
+ 0063 01 MISSING
+008195 0032 0001 01 FIRST GUESS
+ 0002 01 ANALYSIS
+ 0003 01 INITIALISED ANALYSIS
+ 0004 01 OI ANALYSIS
+ 0005 01 3 D VARIATIONAL ANALYSIS
+ 0006 01 4 D VARIATIONAL ANALYSIS
+ 0007 01 3 D VARIATIONAL GRADIENTS
+ 0008 01 4 D VARIATIONAL GRADIENTS
+ 0009 01 FORECAST
+ 0010 01 CONTROL FORECAST
+ 0011 01 PERTURBED FORECAST
+ 0012 01 ERRORS IN FIRST GUESS
+ 0013 01 ERRORS IN ANALYSIS
+ 0014 01 CLUSTER MEANS
+ 0015 01 CLUSTER STANDARD DEVIATIONS
+ 0016 01 FORECAST PROBABILITIES
+ 0017 01 ENSEMBLE MEANS
+ 0018 01 ENSEMBLE STANDARD DEVIATIONS
+ 0019 01 FORECAST ACCUMULATIONS
+ 0020 01 CLIMATOLOGY
+ 0021 01 CLIMATE SIMULATION
+ 0030 01 OBSERVATIONS
+ 0031 01 QUALITY CONTROL
+ 0032 01 DIFFERENCE STATISTICS
+ 0040 01 IMAGE DATA
+ 0050 01 SENSITIVITY GRADIENTS
+ 0051 01 TRAJECTORY FORECAST
+ 0052 01 SENSITIVITY FORECAST
+ 0060 01 PERTURBED ANALYSIS
+ 0061 01 PERTURBATION
+ 0062 01 SINGULAR VECTOR
+ 0127 01 MISSING VALUE
+010063 0010 0000 02 INCREASING, THEN DECREASING: ATMOSPHERIC PRESURE THE SAME OR
+ HIGHER THAN 3 HOURS AGO (OR 24 HOURS AGO )
+ 0001 01 INCREASING, THEN STEADY; OR INCREASING; THEN MORE SLOWLY
+ 0002 01 INCREASING (STEADILY OR UNSTEADILY )
+ 0003 01 DECREASING OR STEADY, THEN INCREASING; RAPIDLY
+ 0004 02 STEADY; ATMOSPHERIC PRESSURE THE SAME AS 3 HOURS AGO (OR 24
+ HOURS)
+ 0005 02 DECREASING; THEN INCREASING; ATMOSPHERIC PRESSURE THE SAME O
+ R LOWER THAN 3 HOURS AGO
+ 0006 02 DECREASING, THEN STEADY; OR DECREASING, DECREASING MORE SLOW
+ LY
+ 0007 01 DECREASING (STEADILY OR UNSTEADELY )
+ 0008 02 STEADY OR INCREASING, THEN DECREASING; OR DECREASING, THEN
+ DECREASING MORE RAPIDLY
+ 0015 01 MISSING
+010064 0004 0000 01 SUBSONIC
+ 0001 01 TRANSONIC
+ 0002 01 SUPERSONIC
+ 0007 01 MISSING VALUE
+011031 0009 0000 01 NIL IN CLOUD
+ 0001 01 SLIGHT IN CLOUD
+ 0002 01 MODERATE IN CLOUD
+ 0003 01 SEVERE IN CLOUD
+ 0004 01 NIL IN CLEAR AIR
+ 0005 01 SLIGHT IN CLEAR AIR
+ 0006 01 MODERATE IN CLEAR AIR
+ 0007 01 SEVERE IN CLEAR AIR
+ 0015 01 MISSING VALUE
+011037 0030 0000 01 AVE <0.1 PEAK <0.1
+ 0001 01 AVE <0.1 0.1 <= PEAK <0.2
+ 0002 01 0.1 <= AVE <0.2 0.1 <= PEAK <0.2
+ 0003 01 AVE <0.1 0.2 <= PEAK <0.3
+ 0004 01 0.1 <= AVE <0.2 0.2 <= PEAK <0.3
+ 0005 01 0.2 <= AVE <0.3 0.2 <= PEAK <0.3
+ 0006 01 AVE <0.1 0.3 <= PEAK <0.4
+ 0007 01 0.1 <= AVE <0.2 0.3 <= PEAK <0.4
+ 0008 01 0.2 <= AVE <0.3 0.3 <= PEAK <0.4
+ 0009 01 0.3 <= AVE <0.4 0.3 <= PEAK <0.4
+ 0010 01 AVE <0.1 0.4 <= PEAK <0.5
+ 0011 01 0.1 <= AVE <0.2 0.4 <= PEAK <0.5
+ 0012 01 0.2 <= AVE <0.3 0.4 <= PEAK <0.5
+ 0013 01 0.3 <= AVE <0.4 0.4 <= PEAK <0.5
+ 0014 01 0.4 <= AVE <0.5 0.4 <= PEAK <0.5
+ 0015 01 AVE <0.1 0.5 <= PEAK <0.8
+ 0016 01 0.1 <= AVE <0.2 0.5 <= PEAK <0.8
+ 0017 01 0.2 <= AVE <0.3 0.5 <= PEAK <0.8
+ 0018 01 0.3 <= AVE <0.4 0.5 <= PEAK <0.8
+ 0019 01 0.4 <= AVE <0.5 0.5 <= PEAK <0.8
+ 0020 01 0.5 <= AVE <0.8 0.5 <= PEAK <0.8
+ 0021 01 AVE <0.1 0.8 <= PEAK
+ 0022 01 0.1 <= AVE <0.2 0.8 <= PEAK
+ 0023 01 0.2 <= AVE <0.3 0.8 <= PEAK
+ 0024 01 0.3 <= AVE <0.4 0.8 <= PEAK
+ 0025 01 0.4 <= AVE <0.5 0.8 <= PEAK
+ 0026 01 0.5 <= AVE <0.8 0.8 <= PEAK
+ 0027 01 0.8 <= AVE 0.8 <= PEAK
+ 0028 01 NIL NIL
+ 0063 01 MISSING VALUE
+011038 0017 0000 01 MIN < 1
+ 0001 01 1 <= MIN < 2
+ 0002 01 2 <= MIN < 3
+ 0003 01 3 <= MIN < 4
+ 0004 01 4 <= MIN < 5
+ 0005 01 5 <= MIN < 6
+ 0006 01 6 <= MIN < 7
+ 0007 01 7 <= MIN < 8
+ 0008 01 8 <= MIN < 9
+ 0009 01 9 <= MIN < 10
+ 0010 01 10 <= MIN < 11
+ 0011 01 11 <= MIN < 12
+ 0012 01 12 <= MIN < 13
+ 0013 01 13 <= MIN < 14
+ 0014 01 14 <= MIN < 15
+ 0015 01 NO TIMING INFORMATION AVAILABLE
+ 0031 01 MISSING VALUE
+011039 0016 0000 01 1 <= MIN < 2
+ 0001 01 2 <= MIN < 3
+ 0002 01 3 <= MIN < 4
+ 0004 01 4 <= MIN < 5
+ 0005 01 5 <= MIN < 6
+ 0006 01 6 <= MIN < 7
+ 0007 01 7 <= MIN < 8
+ 0008 01 8 <= MIN < 9
+ 0009 01 9 <= MIN < 10
+ 0010 01 10 <= MIN < 11
+ 0011 01 11 <= MIN < 12
+ 0012 01 12 <= MIN < 13
+ 0013 01 13 <= MIN < 14
+ 0014 01 14 <= MIN < 15
+ 0060 01 NO TIMING INFORMATION AVAILABLE
+ 0063 01 MISSING VALUE
+013038 0004 0000 01 NOT SUPERADIABATIC
+ 0001 01 SUPERADIABATIC
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+013039 0003 0000 01 SEA ICE
+ 0001 01 SNOW ON LAND
+ 0007 01 MISSING VALUE
+013040 0009 0000 01 LAND
+ 0001 01 RESERVED
+ 0002 01 NEAR COAST
+ 0003 01 ICE
+ 0004 01 POSSIBLE ICE
+ 0005 01 OCEAN
+ 0006 01 COAST
+ 0007 01 DESERT
+ 0015 01 MISSING VALUE
+013041 0010 0001 01 A
+ 0002 01 A-B
+ 0003 01 B
+ 0004 01 B-C
+ 0005 01 C
+ 0006 01 D
+ 0007 01 E
+ 0008 01 F
+ 0009 01 G
+ 0015 01 MISSING VALUE
+013051 0008 0000 01 SMALLER THAN ANY VALUE IN THE 30 YEARS PERIOD
+ 0001 01 IN THE FIRST QUINTILE
+ 0002 01 IN THE SECOND QUINTILE
+ 0003 01 IN THE THIRD QUINTILE
+ 0004 01 IN THE FOURTH QUINTILE
+ 0005 01 IN THE FIFTH QUINTILE
+ 0006 01 GREATER THAN ANY VALUE IN THE 30 YEAR PERIOD
+ 0015 01 MISSING VALUE
+013056 0010 0000 01 NO PRECIPITATION
+ 0001 01 LIGHT INTERMITTENT
+ 0002 01 MODERATE INTERMITTENT
+ 0003 01 HEAVY INTERMITTENT
+ 0004 01 VERY HEAVY INTERMITTENT
+ 0005 01 LIGHT CONTINUOUS
+ 0006 01 MODERATE CONTINUOUS
+ 0007 01 VERY HEAVY CONTINUOUS
+ 0009 01 VARIABLE-ALTERNATIVELY LIGHT AND HEAVY
+ 0015 01 MISSING VALUE
+013057 0011 0000 01 NO PRECIPITATION
+ 0001 01 WITHIN THE LAST HOUR
+ 0002 01 1 TO 2 HOURS AGO
+ 0003 01 2 TO 3 HOURS AGO
+ 0004 01 3 TO 4 HOURS AGO
+ 0005 01 4 TO 5 HOURS AGO
+ 0006 01 5 TO 6 HOURS AGO
+ 0007 01 6 TO 8 HOURS AGO
+ 0008 01 8 TO 10 HOURS AGO
+ 0009 01 MORE THAN 10 HOURS AHO
+ 0015 01 MISSING VALUE
+013202 0007 0000 01 LAND
+ 0001 01 VEGETATION
+ 0003 01 MULTI-YEAR ICE
+ 0004 01 POSSIBLE ICE OR FIRST YEAR ICE
+ 0005 01 OCEAN
+ 0006 01 COASTLINE
+ 0015 01 MISSING
+015025 0002 0000 01 OZONE
+ 0015 01 MISSING VALUE
+019001 0007 0000 01 DEPRESSION OR LOW (EXTRATROPICAL)
+ 0001 01 TROPICAL DEPRESSION
+ 0002 01 TROPICAL STORM
+ 0003 01 SEVERE TROPICAL STORM
+ 0004 01 TYPHOON
+ 0010 01 DUST/SANDSTORM
+ 0063 01 MISSING VALUE
+019008 0005 0000 01 RESERVED
+ 0001 01 SHALLOW (TOP OF CIRCULATION BELOW 700-HPA LEVEL
+ 0002 01 MEDIUM(TOP BETWEEN 700-HPA AND 400-HPA)
+ 0003 01 DEEP(TOP ABOVE 400-HPA LEVEL
+ 0007 01 MISSING VALUE
+019010 0004 0000 01 RESERVED
+ 0001 01 MINIMUM VALUE OF SEA LEVEL PRESSURE
+ 0002 01 MAXIMUM VALUE OF 850 HPA RELATIVE VORTICITY
+ 0015 01 MISSING VALUE
+020003 0250 0000 01 CLOUD DEVELOPMENT NOT OBSERVED OR NOT OBSERVABLE
+ 0001 01 CLOUDS GENERALLY DISSOLVING OR BECOMING LESS DEVELOPED
+ 0002 01 STATE OF SKY ON THE WHOLE UNCHANGED
+ 0003 01 CLOUDS GENERALLY FORMING OR DEVELOPING
+ 0004 02 VISIBILITY REDUCED BY SMOKE, E.G. VELDT OR FOREST FIRES, IN
+ DUSTRIAL SMOKE OR VOLCANIC ASHES
+ 0005 01 HAZE
+ 0006 02 WIDESPREAD DUST IN SUSPENSION IN THE AIR, NOT RAISED BY WIND
+ AT OR NEAR THE STATION AT THE TIME OF OBSERVATION
+ 0007 04 DUST OR SEND RAISED BY WIND AT OR NEAR THE STATION AT THE TI
+ ME OF OBSERVATION, BUT NO WELL-DEVELOPED DUST WHRIL(S) OR SA
+ ND WHRIL(S), AND NO DUSTSTORM OR SANDSTORM SEEN; OR, IN THE
+ CASE OF SHIPS, BLOWING SPRAY AT THE STATION
+ 0008 03 WELL-DEVELOPED DUST WHRIL(S) OR SAND WHRILS SEEN AT OR NEAR
+ THE STATION DURING THE PRECEDING HOUR OR AT THE SAME TIME OF
+ OBSERVATION, BUT NO DUSTSTORM OR SANDSTORM
+ 0009 02 DUSTSTORM OR SANDSTORM WITHIN SIGHT AT THE TIME OF OBSERVATI
+ ON, OR AT THE STATION DURING THE PRECEDING HOR
+ 0010 01 MIST
+ 0011 02 PACHES SHALLOW FOG OR ICE AT THE STATION, WHETHER ON LAND OR
+ SEA, NOT DEEPER THAN 2 METRES ON LAND OR 10 METRES AT SEA
+ 0012 03 MORE OR LESS CONTINUOUS SHALLOW FOG OR ICE AT THE STATION,
+ WHETHER ON LAND OR SEA, NOT DEEPER THAN 2 METRES ON LAND OR
+ 10 METRES AT SEA
+ 0013 01 LIGHTNING VISIBLE, NO THUNDER HEARD
+ 0014 02 PRECIPITATION WITHIN SIGHT, NOT REACHING THE GROUND OR THE
+ SURFACE OF THE SEA
+ 0015 03 PRECIPITATION WITHIN SIGHT, REACHING THE GROUND OR THE SURFA
+ CE OF THE SEA, BUT DISTANT, I.E. ESTIMATED TO BE MORE THAN
+ 5 KM FROM THE STATION
+ 0016 02 PRECIPITATION WITHIN SIGHT, REACHING THE GROUND OR THE SURFA
+ CE OF THE SEA, NEAR TO, BUT NOT AT THE STATION
+ 0017 02 THUNDERSTORM, BUT NO PRECIPITATION AT THE TIME OF OBSERVATIO
+ N
+ 0018 02 SQUALLS AT OR WITHIN SIGHT OF THE STATION DURING THE PRECEDI
+ NG HOUR OR AT THE TIME OF OBSERVATION
+ 0019 02 FUNNEL CLOUD(S) AT OR WITHIN SIGHT OF THE STATION DURING THE
+ PRECEDING HOUR OR AT THE TIME OF OBSERVATION
+ 0020 03 DRIZZEL (NOT FREEZING) OR SNOW GRAINS NOT FALLING AS SHOWERS
+ ; DURING THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVAT
+ IONS
+ 0021 02 RAIN (NOT FREEZING) NOT FALLING AS SHOWER(S); DURING THE PRE
+ ECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0022 02 SNOW NOT FALLING AS SHOWER(S); DURING THE PRECEDING HOUR BUT
+ NOT AT THE TIME OF OBSERVATION
+ 0023 02 RAIN AND SNOW OR ICE PELLETS NOT FALLING AS SHOWER(S); DURIN
+ G THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0024 02 FREEZING DRIZZEL OR FREEZING RAIN NOT FALLING AS SHOWER(S);
+ DURING THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0025 02 SHOWER(S) OF RAIN; DURING THE PRECEDING HOUR BUT NOT AT THE
+ TIME OF OBSERVATION
+ 0026 02 SHOWER(S) OF SNOW, OR OF RAIN AND SNOW; DURING THE PRECEDING
+ HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0027 02 SHOWER(S) OF HAIL, OR OF RAIN AND HAIL; DURING THE PRECEDING
+ HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0028 02 FOG OR ICE FOG; DURING THE PRECEDING HOUR BUT NOT AT THE TIM
+ E OF OBSERVATION
+ 0029 02 THUNDERSTORM (WITH OR WITHOUT PRECIPITATION); DURING THE PRE
+ CEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0030 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM HAS DECREASED DURI
+ NG THE PRECEDING HOURS
+ 0031 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM NO APPRECIABLE CHA
+ NGE DURING THE PRECEDING HOUR
+ 0032 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM HAS BEGUN OR HAS I
+ NCEASED DURING THE PRECEDING HOUR
+ 0033 02 SEVERE DUSTSTORM OR SANDSTORM HAS DECREASED DURING THE PREC
+ EDING HOURS
+ 0034 02 SEVERE DUSTSTORM OR SANDSTORM NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0035 02 SEVERE DUSTSTORM OR SANDSTORM HAS BEGUN OR HAS INCREASED DUR
+ ING THE PRECEDING HOUR
+ 0036 02 SLIGHT OR MODERATE DRIFTING SNOW GENERALLY LOW (BELOW EYE LE
+ VEL)
+ 0037 01 HEAVY DRIFTING SNOW GENERALY LOW (BELOW EYE LEVEL)
+ 0038 02 SLIGHT OR MODERATE BLOWING SNOW GENERALLY HIGH (ABOVE EYE LE
+ VEL)
+ 0039 01 HEAVY BLOWING SNOW GENERALY HIGH (ABOVE EYE LEVEL)
+ 0040 03 FOG OR ICE FOG AT A DISTANCE AT THE TIME OF OBSERVATION, BUT
+ NOT AT THE STATION DURING THE PRECEDING HOUR, THE FOG OR IC
+ E FOG EXTENDING TO A LEVEL ABOVE THAT OF THE OBSERVER
+ 0041 01 FOG OR ICE FOG IN PATCHES
+ 0042 02 FOG OR ICE FOG, SKY VISIBLE,HAS BECOME THINNER DURING THE PR
+ ECEDING HOUR
+ 0043 02 FOG OR ICE FOG, SKY INVISIBLE,HAS BECOME THINNER DURING THE
+ PRECEDING HOUR
+ 0044 02 FOG OR ICE FOG, SKY VISIBLE,NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0045 02 FOG OR ICE FOG, SKY INVISIBLE,NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0046 02 FOG OR ICE FOG, SKY VISIBLE,HAS BEGUN OR HAS BECOME THICKE
+ R DURING THE PRECEDING HOUR
+ 0047 02 FOG OR ICE FOG, SKY INVISIBLE,HAS BEGUN OR HAS BECOME THICKE
+ R DURING THE PRECEDING HOUR
+ 0048 01 FOG, DEPOSITING RIME, SKY VISIBLE
+ 0049 01 FOG, DEPOSITING RIME, SKY INVISIBLE
+ 0050 02 DRIZZLE, NOT FREEZING, INTERMITTENT;SLIGHT AT TIME OF OBSERV
+ ATION
+ 0051 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;SLIGHT AT TIME OF OBSERV
+ ATION
+ 0052 02 DRIZZLE, NOT FREEZING, INTERMITTENT;MODERATE AT TIME OF OBSE
+ RVATION
+ 0053 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;MODERATE AT TIME OF OBSE
+ RVATION
+ 0054 02 DRIZZLE, NOT FREEZING, INTERMITTENT;HEAVY (DENSE) AT THE TIM
+ E OF OBSERVATION
+ 0055 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;HEAVY (DENSE) AT THE TIM
+ E OF OBSERVATION
+ 0056 01 DRIZZLE, FREEZING, SLIGHT
+ 0057 01 DRIZZLE, FREEZING, MODERATE OR HEAVY (DENSE)
+ 0058 01 DRIZZLE AND RAIN, SLIGHT
+ 0059 01 DRIZZLE AND RAIN, MODERATE OR HEAVY
+ 0060 01 RAIN,NOT FREEZING,INTERMITTENT;SLIGHT AT TIME OF OBSERVATION
+ 0061 01 RAIN,NOT FREEZING,CONTINUOUS ;SLIGHT AT TIME OF OBSERVATION
+ 0062 02 RAIN,NOT FREEZING,INTERMITTENT;MODERATE AT TIME OF OBSERVATI
+ ON
+ 0063 02 RAIN,NOT FREEZING,CONTINUOUS ;MODERATE AT TIME OF OBSERVATI
+ ON
+ 0064 02 RAIN, NOT FREEZING, INTERMITTENT;HEAVY AT TIME OF OBSERVATIO
+ ON
+ 0065 01 RAIN, NOT FREEZING, CONTINUOUS;HEAVY AT TIME OF OBSERVATION
+ 0066 01 RAIN, FREEZING, SLIGHT
+ 0067 01 RAIN, FREEZING, MODERATE OR HEAVY
+ 0068 01 RAIN OR DRIZZLE AND SNOW, LIGHT
+ 0069 01 RAIN OR DRIZZLE AND SNOW, MODERATE OR HEAVY
+ 0070 02 INTERMITTENT FALL OF SNOWFLAKES, SLIGHT AT TIME OF OBSERVATI
+ ON
+ 0071 02 CONTINUOUS FALL OF SNOWFLAKES, SLIGHT AT TIME OF OBSERVATI
+ ON
+ 0072 02 INTERMITTENT FALL OF SNOWFLAKES, MODERATE AT TIME OF OBSERVA
+ TION
+ 0073 02 CONTINUOUS FALL OF SNOWFLAKES, MODERATE AT TIME OF OBSERVA
+ TION
+ 0074 02 INTERMITTENT FALL OF SNOWFLAKES, HEAVY AT TIME OF OBSERVATIO
+ ONS
+ 0075 02 CONTINUOUS FALL OF SNOWFLAKES, HEAVY AT TIME OF OBSERVATIO
+ ONS
+ 0076 01 DIAMOND DUST (WITH OR WITHOUT FOG)
+ 0077 01 SNOW GRAINS (WITH OR WITHOUT FOG)
+ 0078 01 ISOLATED STAR-LIKE SNOW CRYSTALS (WITH OR WITHOUT FOG)
+ 0079 01 ICE PELLETS
+ 0080 01 RAIN SHOWER(S), SLIGHT
+ 0081 01 RAIN SHOWER(S), MODERATE OR HEAVY
+ 0082 01 RAIN SHOWER(S), VIOLENT
+ 0083 01 SHOWER(S) OF RAIN AND SNOW MIXED, SLIGHT
+ 0084 01 SHOWER(S) OF RAIN AND SNOW MIXED, MODERATE OR HEAVY
+ 0085 01 SNOW SHOWER(S), SLIGHT
+ 0086 01 SNOW SHOWER(S), MODERATE OR HEAVY
+ 0087 02 SHOWER(S) OF SNOW PELLETS OR SMALL HAIL, WITH OR WITHOUT RAI
+ N OR RAIN AND SNOW MIXED, SLIGHT
+ 0088 02 SHOWER(S) OF SNOW PELLETS OR SMALL HAIL, WITH OR WITHOUT RAI
+ N OR RAIN AND SNOW MIXED, MODERATE OR HEAVY
+ 0089 02 SHOWER(S) OF HAIL, WITH OR WITHOUT RAIN OR RAIN AND SNOW MIX
+ ED, NOT ASSOCIATED WITH THUNDER, SLIGHT
+ 0090 02 SHOWER(S) OF HAIL, WITH OR WITHOUT RAIN OR RAIN AND SNOW MIX
+ ED, NOT ASSOCIATED WITH THUNDER, MODERATE OR HEAVY
+ 0091 02 SLIGHT RAIN AT TIME OF OBSERVATION, THUNDERSTORM DURING THE
+ PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0092 02 MODERATE OR HEAVY RAIN AT TIME OF OBSERVATION, THUNDERSTORM
+ DURING THE PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0093 03 SLIGHT SNOW, OR RAIN AND SNOW MIXED OR HAIL AT TIME OF OBSER
+ VATION, THUNDERSTORM DURING THE PRECEDING HOUR BUT NOT AT TI
+ ME OF OBSERVATION
+ 0094 03 MODERATE OR HEAVY SNOW, OR RAIN AND SNOW MIXED OR HAIL AT TI
+ ME OF OBSERVATION, THUNDERSTORM DURING PRECEDING HOUR BUT NO
+ T AT TIME OF OBSERVATION
+ 0095 03 THUNDERSTORM, SLIGHT OR MODERATE, WITHOUT HAIL, BUT WITH RAI
+ N AND/OR SNOW AT TIME OF OBSERVATION, THUNDERSTORM DURING TH
+ E PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0096 02 THUNDERSTORM, SLIGHT OR MODERATE,WITH HAIL AT TIME OF OBSERV
+ ATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0097 02 THUNDERSTORM, HEAVY, WITHOUT HAIL BUT WITH RAIN AND/OR SNOW
+ AT TIME OF OBSERVATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0098 02 THUNDERSTORM COMBINED WITH DUSTSTORM OR SANDSTORM AT TIME OF
+ OBSERVATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0099 02 THUNDERSTORM, HEAVY, WITH HAIL AT TIME OF OBSERVATION, THUND
+ ERSTORM AT TIME OF OBSERVATION
+ 0100 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0101 02 CLOUDS GENERALLY DISSOLVING OR BECOMING LESS DEVELOPED DURIN
+ G THE PAST HOUR
+ 0102 01 STATE OF SKY ON THE WHOLE UNCHANGED DURING THE PAST HOUR
+ 0103 01 CLOUDS GENERALLY FORMING OR DEVELOPING DURING THE PAST HOUR
+ 0104 02 HAZE OR SMOKE, OR DUST IN SUSPENSION IN THE AIR, VISIBILITY
+ EQUAL TO, OR GREATER THAN 1KM
+ 0105 02 HAZE OR SMOKE, OR DUST IN SUSPENSION IN THE AIR, VISIBILITY
+ LESS THAN 1KM
+ 0110 01 MIST
+ 0111 01 DIAMOND DUST
+ 0112 01 DISTANT LIGHTING
+ 0118 01 SQUALLS
+ 0120 01 FOG
+ 0121 01 PRECIPITATION
+ 0122 01 DRIZZLE (NOT FREEZING) OR SNOW GRAINS
+ 0123 01 RAIN (NOT FREEZING)
+ 0124 01 SNOW
+ 0125 01 FREEZING DRIZZLE OR FREEZING RAIN
+ 0126 01 THUNDERSTORM (WITH OR WITHOUT PRECIPITATION)
+ 0127 01 BLOWING OR DRIFTING SNOW OR SAND
+ 0128 02 BLOWING OR DRIFTING SNOW OR SAND, VISIBILITY EQUAL TO, OR GR
+ ATER THAN, 1KM
+ 0129 01 BLOWING OR DRIFTING SNOW OR SAND, VISIBILITY LESS THAN 1 KM
+ 0130 01 FOG
+ 0131 01 FOG OR ICE FOG, IN PATCHES
+ 0132 01 FOG OR ICE FOG, HAS BECOME THINNER DURING PAST HOUR
+ 0133 01 FOG OR ICE FOG, NO APPRECIABLE CHANGE DURING PAST HOUR
+ 0134 01 FOG OR ICE FOG, HAS BECUNOR BECOME THICKER DURING PAST HOUR
+ 0135 01 FOG, DEPOSITION RIME
+ 0140 01 PRECIPITATION
+ 0141 01 PRECIPITATION SLIGHT OR MODERATE
+ 0142 01 PRECIPITATION, HEAVY
+ 0143 01 LIQUID PRECIPITATION, SLIGHT OR MODERATE
+ 0144 01 LIQUID PRECIPITATION, HEAVY
+ 0145 01 SOLID PRECIPITATION, SLIGHT OR MODERATE
+ 0146 01 SOLID PRECIPITATION, HEAVY
+ 0147 01 FREEZING PRECIPITATION, SLIGHT OR MODERATE
+ 0148 01 FREEZING PRECIPITATION, HEAVY
+ 0150 01 DRIZZLE
+ 0151 01 DRIZZLE, NOT FREEZING, SLIGHT
+ 0152 01 DRIZZLE, NOT FREEZING, MODERATE
+ 0153 01 DRIZZLE, NOT FREEZING, HEAVY
+ 0154 01 DRIZZLE, FREEZING, SLIGHT
+ 0155 01 DRIZZLE, FREEZING, MODERATE
+ 0156 01 DRIZZLE, FREEZING, HEAVY
+ 0157 01 DRIZZLE AND RAIN, SLIGHT
+ 0158 01 DRIZZLE AND RAIN, MODERATE OR HEAVY
+ 0160 01 RAIN
+ 0161 01 RAIN, NOT FREEZING, SLIGHT
+ 0162 01 RAIN, NOT FREEZING, MODERATE
+ 0163 01 RAIN, NOT FREEZING, HEAVY
+ 0164 01 RAIN, FREEZING, SLIGHT
+ 0165 01 RAIN, FREEZING, MODERATE
+ 0166 01 RAIN, FREEZING, HEAVY
+ 0167 01 RAIN (OR DRIZZLE) AND SNOW, SLIGHT
+ 0168 01 RAIN (OR DRIZZLE) AND SNOW, MODERATE AND HEAVY
+ 0170 01 SNOW
+ 0171 01 SNOW, SLIGHT
+ 0172 01 SNOW, MODERATE
+ 0173 01 SNOW, HEAVY
+ 0174 01 ICE PELLETS, SLIGHT
+ 0175 01 ICE PELLETS, MODERATE
+ 0176 01 ICE PELLETS, HEAVY
+ 0180 01 SHOWER(S) OR INTERMITTENT PRECIPITATION
+ 0181 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, SLIGHT
+ 0182 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, MODERATE
+ 0183 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, HEAVY
+ 0184 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, VIOLENT
+ 0185 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, SLIGHT
+ 0186 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, MODERATE
+ 0187 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, HEAVY
+ 0190 01 THUNDERSTORM
+ 0191 01 THUNDERSTORM, SLIGHT OR MODERATE, WITH NO PRECIPITATION
+ 0192 02 THUNDERSTORM, SLIGHT OR MODERATE, WITH RAIN SHOWERS AND/OR S
+ NOW SHOWERS
+ 0193 01 THUNDERSTORM, SLIGHT OR MODERATE, WITH HAIL
+ 0194 01 THUNDERSTORM, HEAVY, WITH NO PRECIPITATION
+ 0195 01 THUNDERSTORM, HEAVY, WITH RAIN SHOWERS AND/OR SNOW SHOWERS
+ 0196 01 THUNDERSTORM, HEAVY, WITH HAIL
+ 0204 01 VOLCANIC ASH SUSPENDED IN THE AIR ALOFT
+ 0206 01 THICK DUST HAZE, VISIBILITY LESS THAN 1 KM
+ 0207 01 BLOWING SPRAY AT THE STATION
+ 0208 01 DRIFTING DUST (SAND)
+ 0209 01 WALL OF DUST OR SAND IN DISTANCE (LIKE HABOOB)
+ 0210 01 SNOW HAZE
+ 0211 01 WHITEOUT
+ 0213 01 LIGHTING, CLOUD TO SURFACE
+ 0217 01 DRY THUNDERSTORM
+ 0219 02 TORNADO CLOUD (DESTRUCTIVE AT OR WITHIN SIGHT OF THE STATION
+ DURING PRECEDING HOUR OR AT THE TIME OF OBSERVATION
+ 0220 01 DEPOSITION OF VOLCANIC ASH
+ 0221 01 DEPOSITION OF DUST OR SAND
+ 0222 01 DEPOSITION OF DEW
+ 0223 01 DEPOSITION OF WET SNOW
+ 0224 01 DEPOSITION OF SOFT RIME
+ 0225 01 DEPOSITION OF HARD RIME
+ 0226 01 DEPOSITION OF HOAR FROST
+ 0227 01 DEPOSITION OF GLAZE
+ 0228 01 DEPOSITION OF ICE CRUST (ICE SLICK)
+ 0230 01 DUSTSTORM OR SANDSTORM WITH TEMPERATURE BELOW 0 C DEGREES
+ 0239 02 BLOWING SNOW, IMPOSSIBLE TO DETERMINE WHETHER SNOW IS FALLIN
+ G OR NOT
+ 0241 01 FOG ON SEA
+ 0242 01 FOG IN VALLEYS
+ 0243 01 ARCTIC OR ANTARCTIC SEA SMOKE
+ 0244 01 STEAM FOG (SEA,LAKE OR RIVER)
+ 0245 01 STEAM FOG (LAND)
+ 0246 01 FOG OVER ICE OR SNOW COVER
+ 0247 01 DENCE FOG VISIBILITY 60-90 M
+ 0248 01 DENCE FOG VISIBILITY 30-60 M
+ 0249 01 DENCE FOG VISIBILITY LESS THAN 30 M
+ 0250 01 DRIZZLE, RATE OF FALL LESS THAN 0.10 MM/H
+ 0251 01 DRIZZLE, RATE OF FALL 0.10 - .19 MM/H
+ 0252 01 DRIZZLE, RATE OF FALL 0.20 - .39 MM/H
+ 0253 01 DRIZZLE, RATE OF FALL 0.40 - .79 MM/H
+ 0254 01 DRIZZLE, RATE OF FALL 0.80 - 1.59 MM/H
+ 0255 01 DRIZZLE, RATE OF FALL 1.60 - 3.19 MM/H
+ 0256 01 DRIZZLE, RATE OF FALL 3.20 - 6.39 MM/H
+ 0257 01 DRIZZLE, RATE OF FALL 6.40 MM/H OR MORE
+ 0259 01 DRIZZLE AND SNOW
+ 0260 01 RAIN, RATE OF FALL LESS THAN 1.0 MM/H
+ 0261 01 RAIN, RATE OF FALL 1.0 - 1.9 MM/H
+ 0262 01 RAIN, RATE OF FALL 2.0 - 3.9 MM/H
+ 0263 01 RAIN, RATE OF FALL 4.0 - 7.9 MM/H
+ 0264 01 RAIN, RATE OF FALL 8.0 - 15.9 MM/H
+ 0265 01 RAIN, RATE OF FALL 16.0 - 31.9 MM/H
+ 0266 01 RAIN, RATE OF FALL 32.0 - 63.9 MM/H
+ 0267 01 RAIN, RATE OF FALL 64.0 MM/H OR MORE
+ 0270 01 SNOW, RATE OF FALL LESS THAN 1.0 CM/H
+ 0271 01 SNOW, RATE OF FALL 1.0 - 1.9 CM/H
+ 0272 01 SNOW, RATE OF FALL 2.0 - 3.9 CM/H
+ 0273 01 SNOW, RATE OF FALL 4.0 - 7.9 CM/H
+ 0274 01 SNOW, RATE OF FALL 8.0 - 15.9 CM/H
+ 0275 01 SNOW, RATE OF FALL 16.0 - 31.9 CM/H
+ 0276 01 SNOW, RATE OF FALL 32.0 - 63.9 CM/H
+ 0277 01 SNOW, RATE OF FALL 64.0 CM/H OR MORE
+ 0278 01 SNOW OR ICE CRISTAL PRECIPITATION FROM A CLEAR SKY
+ 0279 01 WET SNOW, FREEZING ON CONTACT
+ 0280 01 PRECIPITATION OF RAIN (WW= 87-99)
+ 0281 01 PRECIPITATION OF RAIN,FREEZING (WW= 80-82)
+ 0282 01 PRECIPITATION OF RAIN AND SNOW MIXED
+ 0283 01 PRECIPITATION OF SNOW
+ 0284 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL
+ 0285 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH RAIN
+ 0286 02 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH RAIN AND S
+ NOW MIXED
+ 0287 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH SNOW
+ 0288 01 PRECIPITATION OF HAIL
+ 0289 01 PRECIPITATION OF HAIL, WITH RAIN
+ 0290 01 PRECIPITATION OF HAIL, WITH RAIN AND SNOW MIXED
+ 0291 01 PRECIPITATION OF HAIL, WITH SNOW
+ 0292 01 SHOWER(S) OR THUNDERSTORM OVER SEA
+ 0293 01 SHOWER(S) OR THUNDERSTORM OVER MOUNTAINS
+ 0508 02 NO SIGNIFICANT PHENOMENA TO REPORT, PRESENT AND PAST WEATHER
+ OMITTED
+ 0509 02 NOT OBSERVED, NO DATA AVAILABLE, PRESENT AND PAST WEATHER OM
+ ITTED
+ 0510 01 PRESENT AND PAST WEATHER MISSING, BUT EXPECTED
+ 0511 01 MISSING VALUE
+020004 0021 0000 02 CLOUD COVERING 1/2 OR LESS OF THE SKY THROUGHOUT THE APPROPP
+ RIATE PERIOD
+ 0001 03 CLOUD COVERING MORE THAN 1/2 OF THE SKY DURING PART OF THE A
+ PPROPRIATE PERIOD AND COVERING 1/2 OR LESS DURING PART OF TH
+ E PERIOD
+ 0002 02 CLOUD COVERING MORE THAN 1/2 OF THE SKY THROUGHOUT THE APPRP
+ PRIATE PERIOD
+ 0003 01 SANSTORM, DUSTSTORM OR BLOWING SNOW
+ 0004 01 FOG OR ICE OR THICK HAZE
+ 0005 01 DRIZZLE
+ 0006 01 RAIN
+ 0007 01 SNOW, OR RAIN AND SNOW MIXED
+ 0008 01 SHOWER(S)
+ 0009 01 THUNDERSTORM(S) WITH OR WITHOUT PRECIPITATION
+ 0010 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0011 01 VISIBILITY REDUCED
+ 0012 01 BLOWING PHENOMENA, VISIBILITY REDUCED
+ 0013 01 FOG
+ 0014 01 PRECIPITATION
+ 0015 01 DRIZZLE
+ 0016 01 RAIN
+ 0017 01 SNOW OR ICE PELLETS
+ 0018 01 SHOWERS OR INTERMITTENT PRECIPITATION
+ 0019 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+020005 0021 0000 02 CLOUD COVERING 1/2 OR LESS OF THE SKY THROUGHOUT THE APPROPP
+ RIATE PERIOD
+ 0001 03 CLOUD COVERING MORE THAN 1/2 OF THE SKY DURING PART OF THE A
+ PPROPRIATE PERIOD AND COVERING 1/2 OR LESS DURING PART OF TH
+ E PERIOD
+ 0002 02 CLOUD COVERING MORE THAN 1/2 OF THE SKY THROUGHOUT THE APPRP
+ PRIATE PERIOD
+ 0003 01 SANSTORM, DUSTSTORM OR BLOWING SNOW
+ 0004 01 FOG OR ICE OR THICK HAZE
+ 0005 01 DRIZZLE
+ 0006 01 RAIN
+ 0007 01 SNOW, OR RAIN AND SNOW MIXED
+ 0008 01 SHOWER(S)
+ 0009 01 THUNDERSTORM(S) WITH OR WITHOUT PRECIPITATION
+ 0010 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0011 01 VISIBILITY REDUCED
+ 0012 01 BLOWING PHENOMENA, VISIBILITY REDUCED
+ 0013 01 FOG
+ 0014 01 PRECIPITATION
+ 0015 01 DRIZZLE
+ 0016 01 RAIN
+ 0017 01 SNOW OR ICE PELLETS
+ 0018 01 SHOWERS OR INTERMITTENT PRECIPITATION
+ 0019 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+020008 0019 0000 01 SKY CLEAR
+ 0001 01 FEW
+ 0002 01 SCATTERED
+ 0003 01 BROKEN
+ 0004 01 OVERCAST
+ 0005 01 RESERVED
+ 0006 01 SCATTERED/BROKEN (MANY FORECASTS USE SCATTERED/BROKEN
+ 0007 01 BROKEN/OVERCAST (BROKEN/OVERCAST FOLLOWED BY CLOUD TYPE(S))
+ 0008 02 ISOLATED (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE
+ CB)
+ 0009 02 ISOLATED EMBEDDED (USED ON AVIATION CHARTS TO DESCRIBE THE C
+ LOUD TYPE CB)
+ 0010 02 OCCASIONAL (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TY
+ PE CB)
+ 0011 02 OCCASIONAL EMBEDDED (USED ON AVIATION CHARTS TO DESCRIBE THE
+ CLOUD TYPE CB)
+ 0012 02 FREQUENT (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE
+ CB)
+ 0013 02 DENSE (USED ON AVIATION CHARTS TO DESCRIBE CLOUD THAT WOULD
+ CAUSE SUDDEN CHANGES IN VISIBILITY (LESS THAN 1000M)
+ 0014 01 LAYERS
+ 0015 01 OBSCURED (OBSC)
+ 0016 01 EMBEDDED (EMBD)
+ 0017 01 FREQUENT EMBEDDED
+ 0031 01 MISSING VALUE
+020009 0006 0000 01 RESERVED
+ 0001 01 NSC MIL SIGNIFICANT CLOUD
+ 0002 01 CAVOK
+ 0003 01 SKC SKY CLEAR
+ 0004 01 NSW NIL SIGNIFICANT WEATHER
+ 0015 01 MISSING VALUE
+020011 0011 0000 01 0 0
+ 0001 01 1 OKTA OR LESS, BUT NOT ZERO 1/10 OR LESS, BUT NOT ZERO
+ 0002 01 2 OKTAS 2/10 - 3/10
+ 0003 01 3 OKTAS 4/10
+ 0004 01 4 OKTAS 5/10
+ 0005 01 5 OKTAS 6/10
+ 0006 01 6 OKTAS 7/10 - 8/10
+ 0007 01 7 OKTAS OR MORE,BUT NOT 8 OKTAS9/10 OR MORE, BUT NOT 10/10
+ 0008 01 8 OKTAS 10/10
+ 0009 01 SKY OBSCURED BY FOG AND OR OTHER METEOROLOGICAL PHENOMENA
+ 0015 02 CLOUD COVE IS INDISCERNIBLE FOR REASONS OTHER THAN FOG OR OT
+ HER METEOROLOGICAL PHENOMENA, OR OBSERVATION IS NOT MADE
+020012 0045 0000 01 CIRRUS (CI)...............CI
+ 0001 01 CIRROCUMULUS (CC).........CC
+ 0002 01 CIRROSTRATUS (CS).........CS
+ 0003 01 ALTOCUMULUS (AC).........AC
+ 0004 01 ALTOSTRATUS (AS).........AS
+ 0005 01 NIMBOSTRATUS (NS).........NS
+ 0006 01 STRATOCUMULUS(SC).........SC
+ 0007 01 STRATUS (ST).........ST
+ 0008 01 CUMULUS (CU).........CU
+ 0009 01 CUMULONIMBUS (CB).........CB
+ 0010 01 NO CH CLOUDS
+ 0011 02 CIRRUS FIBRATUS, SOMETIMES UNCINUS, NOT PROGRESSIVELY INADIN
+ G THE SKY
+ 0012 04 CIRRUS SPISSATUS, IN PATCHES OR ENTANGLED SHEAVES, WHICH USU
+ ALLY DO NOT INCREASE AND SOMETIMES SEEM TO BE THE REMAINS OF
+ THE UPPER PART OF A CUMULONIMBUS; OR CIRRUS CASTELLANUS OR
+ FLOCCUS
+ 0013 01 CIRRUS SPISSATUS CUMULONIMBOGENITUS
+ 0014 02 CIRRUS UNCINUS OR FIBRATUS,OR BOTH, PROGRESSIVELY INVADING T
+ HE SKY ; THEY GENERALLY THICKEN AS A WHOLE
+ 0015 04 CIRRUS (OFTEN IN BANDS) AND CIRROSTRATUS, OR CIRROSTRATUS AL
+ ONE, PROGRESSIVELY INVADING THE SKY; THEY GENERALLY THICKEN
+ ASA WHOLE, BUT THE CONTINUOUS VEIL DOES NOT REACH 45 DEGREES
+ ABOVE THE HORIZON
+ 0016 05 CIRRUS (OFTEN IN BANDS) AND CIRROSTRATUS, OR CIRROSTRATUS AL
+ ONE, PROGRESSIVELY INVADING THE SKY; THEY GENERALLY THICKEN
+ ASA WHOLE, BUT THE CONTINUOUS VEIL EXTENDS MORE THAN 45 DEGR
+ REES ABOVE THE HORIZON, WITHOUT THE SKY BEING TOTALLY COVERE
+ D
+ 0017 01 CIRROSTRATUS COVERING THE WHOLE SKY
+ 0018 02 CIRROSTRATUS NOT PROGRESSIVELY INVADING THE SKY AND NOT ENTI
+ RELY COVERING IT
+ 0019 02 CIRROCUMULUS ALONE, OR CIRROCUMULUS PREDOMINANT AMONG THE CH
+ CLOUDS
+ 0020 01 NO CM CLOUDS
+ 0021 01 ALTOSTRATUS TRANSLUCIDUS
+ 0022 01 ALTOSTRATUS OPACUS OR NIMBOSTRATUS
+ 0023 01 ALTOCUMULUS TRANSLUCIDUS AT A SINGLE LEVEL
+ 0024 02 PATCHES (OFTEN LENTICULARIS) OF ALTOCUMULUS TRANSLUCIDUS, CO
+ NTINUALLY CHANGING AND OCCURING AT ONE OR MORE LEVELS
+ 0025 04 ALTOCUMULUS TRANSLUCIDUS IN BANDS, OR ONE OR MORE LAYERS OF
+ ALTOCUMULUS TRANSLUCIDUS OR OPACUS, PROGRESSIVELY INVADING T
+ HE SKY; THESE ALTOCUMULUS CLOUDS GENERALLY THICKEN AS A WHOL
+ E
+ 0026 01 ALTOCUMULUS CUMULOGENITUS (OR CUMULONIMBOGENITUS)
+ 0027 04 ALTOCUMULUS TRANSLUCIDUS OR OPACUS IN TWO OR MORE LAYERS, OR
+ ALTOCUMULUS OPACUS IN A SINGLE LAYER, NOT PROGRESSIVELY INV
+ ADING THE SKY, OR ALTOCUMULUS WITH ALTOSTRATUS OR NIMBOSTRAT
+ US
+ 0028 01 ALTOCUMULUS CASTELLANUS OR FLOCUS
+ 0029 01 ALTOCUMULUS OF CHAOTIC SKY, GENERALLY AT SEVERAL LEVELS
+ 0030 01 NO CL CLOUDS
+ 0031 02 CUMULUS HUMILIS OR CUMULUS FRACTUS OTHER THAN OF BAD WEATHER
+ , OR BOTH
+ 0032 03 CUMULUS MEDIOCRIS OR CONGESTUS, WITH OR WITHOUT CUMULUS OF S
+ PECIES FRACTUS OR HUMULIS OR STRATOCUMULUS, ALL HAVING THEIR
+ BASES AT THE SAME LEVEL
+ 0033 02 CUMULONIMBUS CALVUS, WITH OR WITHOUT CUMULUS, STRATOCUMULUS
+ OR STRATUS
+ 0034 01 STRATOCUMULUS CUMULOGENITUS
+ 0035 01 STRATOCUMULUS OTHER THAN STRATOCUMULUS CUMULOGENITUS
+ 0036 02 STRATUS NEBULOSUS OR STRATUS FRACTUS OTHER THAN OF BAD WEATH
+ ER, OR BOTH
+ 0037 02 STRATUS FRACTUS OR CUMULUS FRACTUS OF BAD WEATHER, OR BOTH
+ (PANNUS), USUALLY BELOW ALTOSTRATUS OR NIMBOSTRATUS
+ 0038 02 CUMULUS AND STRATOCUMULUS OTHER THAN STRATOCUMULUS CUMULOGEN
+ ITUS, WITH BASES AT DIFFERENT LEVELS
+ 0039 03 CUMULONIMBUS CAPILLATUS (OFTEN WITH AN ANVIL), WITH OR WITHO
+ UT CUMULONIMBUS CALVUS, CUMULUS, STRATOCUMULUS, STRATUS OR P
+ ANNUS
+ 0059 02 CLOUD NOT VISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDSTO
+ RM, OR OTHER ANALOGOUS PHENOMENA
+ 0060 03 CH CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA, OR BECAUSE OF A CONTINUOUS
+ LAYER OF LOWER CLOUDS
+ 0061 03 CM CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA, OR BECAUSE OF A CONTINUOUS
+ LAYER OF LOWER CLOUDS
+ 0062 02 CL CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA
+ 0063 01 MISSING VALUE
+020017 0011 0000 01 ISOLATED CLOUD OR FRAGMENTS OF CLOUD
+ 0001 01 CONTINUOUS CLOUD
+ 0002 01 BROKEN CLOUD - SMALL BREAKS, FLAT TOPS
+ 0003 01 BROKEN CLOUD - LARGE BREAKS, FLAT TOPS
+ 0004 01 CONTINUOUS CLOUD
+ 0005 01 BROKEN CLOUD - SMALL BREAKS, UNDULATED TOPS
+ 0006 01 BROKEN CLOUD - LARGE BREAKS, UNDULATED TOPS
+ 0007 02 CONTINUOUS OR ALMOST CONTINUOUS WAVES WITH TOWERING CLOUDS A
+ BOVE THE TOP OF THE LAYER
+ 0008 02 GROUPS OF WAVES WITH TOWERING CLOUDS ABOVE THE TOP OF THE LA
+ YER
+ 0009 01 TWO OR MORE LAYERS AT DIFFERENT LEVELS
+ 0015 01 MISSING VALUE
+020018 0004 0000 01 INCREASING (U)
+ 0001 01 DECREASING (D)
+ 0002 01 NO DISTINCT CHANGE (N)
+ 0003 01 MISSING VALUE
+020021 0024 0001 01 PRECIPITATION-UNKNOWN TYPE
+ 0002 01 LIQUID PRECIPITATION NOT FREEZING
+ 0003 01 LIQUID FREEZING PRECIPITATION
+ 0004 01 DRIZZLE
+ 0005 01 RAIN
+ 0006 01 SOLID PRECIPITATION
+ 0007 01 SNOW
+ 0008 01 SNOW GRAINS
+ 0009 01 SNOW PELLETS
+ 0010 01 ICE PELLETS
+ 0011 01 ICE CRYSTALS
+ 0012 01 DIAMOND DUST
+ 0013 01 SMALL HAIL
+ 0014 01 HAIL
+ 0015 01 GLAZE
+ 0016 01 RIME
+ 0017 01 SOFT RIME
+ 0018 01 HARD RIME
+ 0019 01 CLEAR ICE
+ 0020 01 WET SNOW
+ 0021 01 HOAR FROST
+ 0022 01 DEW
+ 0023 01 WHITE DEW
+ 0030 01 ALL 30 MISSING VALUE
+020022 0007 0000 01 NO PRECIPITATION
+ 0001 01 CONTINUOUS
+ 0002 01 INTERMITTENT
+ 0003 01 SHOWER
+ 0004 01 NOT REACHING GROUND
+ 0005 01 DEPOSITION
+ 0015 01 MISSING VALUE
+020023 0012 0001 01 DUST/SAND WHIRL
+ 0002 01 SQUALLS
+ 0003 01 SAND STORM
+ 0004 01 DUST STORM
+ 0005 01 LIGHTNING - CLOUD TO SURFACE
+ 0006 01 LIGHTNING - CLOUD TO CLOUD
+ 0007 01 LIGHTNING - DISTANT
+ 0008 01 THUNDERSTORM
+ 0009 01 FUNNEL CLOUD NOT TOUCHING SURFACE
+ 0010 01 FUNNEL CLOUD TOUCHING SURFACE
+ 0011 01 SPRAY
+ 0012 01 WATER-SPOUT
+020024 0007 0000 01 NO PHENOMENA
+ 0001 01 LIGHT
+ 0002 01 MODERATE
+ 0003 01 HEAVY
+ 0004 01 VIOLENT
+ 0005 01 SEVERE (VAL)
+ 0007 01 MISSING VALUE
+020025 0011 0001 01 FOG
+ 0002 01 ICE FOG
+ 0003 01 STEAM FOG
+ 0007 01 MIST
+ 0008 01 HAZE
+ 0009 01 SMOKE
+ 0010 01 VOLCANIC ASH
+ 0011 01 DUST
+ 0012 01 SAND
+ 0013 01 SNOW
+ 0021 01 ALL 21 MISSING VALUE
+020026 0014 0000 01 NO CHANGE
+ 0001 01 SHALLOW
+ 0002 01 PATCHES
+ 0003 01 PARTIAL
+ 0004 01 FREEZING
+ 0005 01 LOW DRIFTING
+ 0006 01 BLOWING
+ 0007 01 INCREASING
+ 0008 01 DECREASING
+ 0009 01 IN SUSPENSION IN THE AIR
+ 0010 01 WALL
+ 0011 01 DENSE
+ 0012 01 WHITEOUT
+ 0015 01 MISSING VALUE
+020027 0007 0001 01 AT TIME OF OBSERVATION
+ 0002 01 IN PAST HOUR
+ 0003 01 IN TIME PERIOD FOR PAST WEATHER W1W2
+ 0004 01 IN TIME PERIOD SPECIFIED
+ 0006 01 BELOW STATION LEVEL
+ 0007 01 AT THE STATION
+ 0008 01 IN THE VICINITY
+020029 0004 0000 01 NO RAIN
+ 0001 01 RAIN
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020032 0006 0000 01 ICE NOT BUILDING UP
+ 0001 01 ICE BUILDING UP SLOWLY
+ 0002 01 ICE BUILDING UP QUICKLY
+ 0003 01 ICE MELTING OR BREAKING UP SLOWLY
+ 0004 01 ICE MELTING OR BREAKING UP RAPIDLY
+ 0007 01 MISSING VALUE
+020033 0004 0001 01 ICING FROM OCEAN SPRAY
+ 0002 01 ICING FROM FOG
+ 0003 01 ICING FROM RAIN
+ 0004 01 MISSING VALUE
+020034 0012 0000 01 NO SEA ICE IN SIGHT
+ 0001 02 SHIP IN OPEN LEAD MORE THAN 1.0 NAUTICAL MILE WIDE, OR SHIP
+ IN FAST ICE WITH BOUNDARY BEYOND LIMIT OF VISIBILITY
+ 0002 04 SEA ICE PRESENT IN CONCETRATION LESS THAN 3/10 (3/8), OPEN W
+ ATER OR VERY OPEN PACK ICE, SEA ICE CONCETRATION IS UNIFORM
+ IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL
+ MILE OF ICE EDGE
+ 0003 03 4/10 TO 6/10 (3/8 TO LESS THAN 6/8) ,OPEN PACK ICE, SEA ICE
+ CONCETRATION IS UNIFORM IN THE OBSERVATION AREA, SHIP IN ICE
+ OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0004 03 7/10 TO 8/10 (6/8 TO LESS THAN 7/8), CLOSE PACK ICE, SEA ICE
+ CONCETRATION IS UNIFORM IN THE OBSERVATION AREA, SHIP IN IC
+ E OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0005 04 9/10 OR MORE, BUT NOT 10/10 (7/8 TO LESS THAN 8/8), VERY CLO
+ SE PACK ICE, SEA ICE CONCETRATION IS UNIFORM IN THE OBSERVAT
+ ION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE EDG
+ E
+ 0006 03 STRIPS AND PATCHES OF PACK ICE WITH OPEN WATER BETWEEN, SEA
+ ICE CONCENTRATION IS NOT UNIFORM IN THE OBSERVATION AREA, SH
+ IP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0007 04 STRIPS AND PATCHES OF CLOSE OR VERY CLOSE PACK ICE WITH AREA
+ S OF LESSER CONCENTRATION BETWEEN, SEA ICE CONCETRATION IS N
+ OT UNIFORM IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.
+ 5 NAUTICAL MILE OF ICE EDGE
+ 0008 04 FAST ICE WITH OPEN WATER,VERY OPEN OR OPEN PACK ICE TO SEAWA
+ RD OF THE ICE BOUNDARY, SEA ICE CONCENTRATION IS NOT UNIFORM
+ IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL
+ MILE OF ICE EDGE
+ 0009 04 FAST ICE CLOSE OR VERY CLOSE PACK ICE TO SEAWARD OF THE ICE
+ BOUNDARY, SEA ICE CONCETRATION IS NOT UNIFORM IN THE OBSERVA
+ TION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE ED
+ GE
+ 0014 03 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY, O
+ R BECAUSE SHIP IS MORE THAN 0.5 NAUTICAL MILE AWAY FROM ICE
+ EDGE
+ 0015 01 MISSING VALUE
+020035 0012 0000 01 NO ICE OF LAND ORIGIN
+ 0001 01 1-5 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0002 01 6-10 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0003 01 11-20 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0004 01 UP TO AND INCLUDING 10 GROWLERS AND BERGY BITS - NO ICEBERGS
+ 0005 01 MORE THAN 10 GROWLERS AND BERGY BITS - NO ICEBERGS
+ 0006 01 1-5 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0007 01 6-10 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0008 01 11-20 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0009 02 MORE THAN 20 ICEBERGS,WITH GROWLERS AND BERGY BITS - A MAJOR
+ HAZARD TO NAVIGATION
+ 0014 02 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY OR
+ BECAUSE ONLY SEA ICE IS VISIBLE
+ 0015 01 MISSING VALUE
+020036 0012 0000 01 SHIP IN OPEN WATER WITH FLOATING ICE IN SIGHT
+ 0001 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS IMPROVING
+ 0002 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS NOT CHANGING
+ 0003 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS WORSENING
+ 0004 01 SHIP IN ICE DIFFICULT TO PENETRATE; CONDITIONS IMPROVING
+ 0005 01 SHIP IN ICE DIFFICULT TO PENETRATE; CONDITIONS NOT CHANGING
+ 0006 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE FORMING AND FLOES FREEZING TOGETHAR
+ 0007 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE UNDER SLIGHT PRESSURE
+ 0008 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE UNDER MODERATE OR SEVERE PRESSURE
+ 0009 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ SHIP BESET.
+ 0030 01 UNABLE TO REPORT, BECAUSE OF DARKNESS OR LACK OF VISIBILITY
+ 0031 01 MISSING VALUE
+020037 0012 0000 01 NEW ICE ONLY (FRAZIL ICE, GREASE ICE, SLUSH, SHUGA)
+ 0001 01 NILAS OR ICE RIND, LESS THAN 10 CM THICK
+ 0002 01 YOUNG ICE(GREY ICE, GREY-WHITE ICE
+ 0003 01 PREDOMINANTLY NEW AND/OR YOUNG ICE WITH SOME FIRST-YEAR ICE
+ 0004 02 PREDOMINANTLY THIN FIRST-YEAR ICE WITH SOME NEW AND/OR YOUNG
+ ICE
+ 0005 01 ALL THIN FIRST-YEAR ICE (30-70 CM THICK)
+ 0006 02 PREDOMINANTLY MEDIUM FIRST-YEAR ICE
+ (70-120 CM THICK) AND THICK FIRST-YEAR ICE (>120 CM
+ 0007 01 ALL MEDIUM AND THICK FIRST-YEAR ICE
+ 0008 02 PREDOMINANTLY MEDIUM AND THICK FIRST-YEAR ICE WITH SOME
+ OLD ICE (USUALLY MORE THAN 2 METRES THICK)
+ 0009 01 PREDOMINANTLY OLD ICE
+ 0030 03 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY OR
+ BECAUSE ONLY ICE OF LAND ORIGIN IS VISIBLE OR BECAUSE SHIP I
+ S MORE THAN 0.5 NAUTICAL MILE AWAY FROM ICE EDGE
+ 0031 01 MISSING VALUE
+020040 0009 0000 01 DRIFT SNOW ENDED BEFORE THE HOUR OF OBSERVATION
+ 0001 01 INTENSITY DIMINISHING
+ 0002 01 NO CHANGE
+ 0003 01 INTENSITY INCREASING
+ 0004 02 CONTINUES, APART FROM INTERRUPTION LASTING LESS THAN 30 MINU
+ TES
+ 0005 01 GENERAL DRIFT SNOW HAS BECOME DRIFT SNOW NEAR THE GROUND
+ 0006 01 DRIFT SNOW NEAR THE GROUND HAS BECOME GENERAL DRIFT SNOW
+ 0007 02 DRIFT SNOW HAS STARTED AGAIN AFTER AN INTERRUPTION OF MORE T
+ HAN 30 MINUTES
+ 0015 01 MISSING VALUE
+020041 0011 0000 01 NO ICING
+ 0001 01 LIGHT ICING
+ 0002 01 LIGHT ICING IN CLOUD
+ 0003 01 LIGHT ICING IN PRECIPITATION
+ 0004 01 MODERATE ICING
+ 0005 01 MODERATE ICING IN CLOUD
+ 0006 01 MODERATE ICING IN PRECIPITATION
+ 0007 01 SEVERE ICING
+ 0008 01 SEVERE ICING IN CLOUD
+ 0009 01 SEVERE ICING IN PRECIPITATION
+ 0015 01 MISSING VALUE
+020042 0004 0000 01 NO ICING
+ 0001 01 ICING PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020045 0004 0000 01 NO SLD CONDITIONS PRESENT
+ 0001 01 SLD CONDITIONS PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020050 0010 0000 01 RESERVED
+ 0001 01 1ST LOW CLOUD
+ 0002 01 2ND LOW CLOUD
+ 0003 01 3RD LOW CLOUD
+ 0004 01 1ST MEDIUM CLOUD
+ 0005 01 2ND MEDIUM CLOUD
+ 0006 01 3RD MEDIUM CLOUD
+ 0007 01 1ST HIGH CLOUD
+ 0008 01 2ND HIGH CLOUD
+ 0255 01 MISSING VALUE
+020055 0011 0000 01 CUMULUS, IF ANY, ARE QUITE SMALL
+ 0001 01 CUMULUS OF INTERMEDIATE SIZE
+ 0002 01 SWELLING CUMULUS
+ 0003 01 SWELLING CUMULUS WITH TOWERS
+ 0004 01 SWELLING CUMULUS WITH TOWERS HAVING PRONOUNCED TILT
+ 0005 01 TALL CUMULUS CONGESTUS
+ 0006 01 ISOLATED CUMULONIMBUS
+ 0007 01 NUMEROUS CUMULONIMBUS
+ 0008 01 CONTINUOUS DENSE MIDDLE CLOUDS
+ 0009 01 CONTINUOUS SHEETS OF MIDDLE CLOUDS
+ 0015 01 MISSING VALUE
+020056 0005 0000 01 UNKNOWN
+ 0001 01 WATER
+ 0002 01 ICE
+ 0003 01 MIXED
+ 0007 01 MISSING VALUE
+020062 0021 0000 02 SURFACE OF GROUND DRY (WITHOUT CRACKS AND NO APPRECIABLE
+ AMOUNT OF DUST OR LOOSE SAND)
+ 0001 01 SURFACE OF GROUND MOIST
+ 0002 02 SURFACE OF GROUND WET (STANDING WATER IN SMALL
+ OR LARGE POOLS ON SURFACE)
+ 0003 01 FLOODED WITHOUT SNOW
+ 0004 01 SURFACE OF GROUND FROZEN MEASURABLE ICE
+ 0005 01 GLAZE ON GROUND COVER
+ 0006 01 LOOSE DRY DUST OR SAND NOT COVERING GROUND COMPLETELY
+ 0007 02 THIN COVER OF LOOSE DRY DUST OR SAND COVERING GROUND COMPLET
+ ELY
+ 0008 02 MODERATE OR THICK COVER OF LOOSE DRY DUST OR SAND COVERING
+ GROUND COMPLETELY
+ 0009 01 EXTREMELY DRY WITH CRACKS
+ 0010 01 GROUND PREDOMINANTLY COVERED BY ICE
+ 0011 02 COMPACT OR WET SNOW (WITH OR WITHOUT ICE) COVERING LESS THAN
+ ONE-HALF OF THE GROUND
+ 0012 02 COMPACT OR WET SNOW (WITH OR WITHOUT ICE) COVERING AT LEAST
+ ONE-HALF OF THE GROUND BUT GROUND NOT COMPLETELY COVERED
+ 0013 01 EVEN LAYER OF COMPACT OR WET SNOW COVERING GROUND COMPLETELY
+ 0014 02 UNEVEN LAYER OF COMPACT OR WET SNOW COVERING GROUND
+ WITH SNOW OR COMPLETELY MEASURABLE ICE
+ 0015 02 LOOSE DRY SNOW COVERING LESS THAN ONE-HALF OF THE GROUND COV
+ ER
+ 0016 02 LOOSE DRY SNOW COVERING AT LEAST ONE-HALF OF THE
+ GROUND (BUT NOT COMPLETELY)
+ 0017 01 EVEN LAYER OF LOOSE DRY SNOW COVERING GROUND COMPLETELY
+ 0018 01 UNEVEN LAYER OF LOOSE DRY SNOW COVERING GROUND COMPLETELY
+ 0019 01 SNOW COVERING GROUND COMPLETELY; DEEP DRIFTS
+ 0031 01 MISSING VALUE
+020063 0001 0000 01 TO BE DEVELOPED
+020071 0011 0000 01 NO ASSESSMENT NO ASSESSMENT
+ 0001 01 LESS THAN 50 KM LESS THAN 1 PER SECOND
+ 0002 01 BETWEEN 50 AND 200 KM LESS THAN 1 PER SECOND
+ 0003 01 MORE THAN 200 KM LESS THAN 1 PER SECOND
+ 0004 01 LESS THAN 50 KM 1 OR MORE PER SECOND
+ 0005 01 BETWEEN 50 AND 200 KM 1 OR MORE PER SECOND
+ 0006 01 MORE THAN 200 KM 1 OR MORE PER SECOND
+ 0007 02 LESS THANK 50 KM RATE SO RAPID NUMBER CANNOT BE COUN
+ TED
+ 0008 02 BETWEEN 50 AND 200 KM RATE SO RAPID NUMBER CANNOT BE COUN
+ TED
+ 0009 02 MORE THAN 200 KM RATE SO RAPID NUMBER CANNOT BE COUN
+ TED
+ 0015 01 MISSING VALUE
+020086 0008 0000 01 CLEAR AND DRY
+ 0001 01 DAMP
+ 0005 01 WET SNOW
+ 0006 01 SLUSH
+ 0007 01 ICE
+ 0008 01 COMPACTED OR ROLLED SNOW
+ 0009 01 FROZEN RUTS OR RIDGES
+ 0015 01 MISSING VALUE
+020090 0007 0000 01 RESERVED
+ 0001 01 NACREOUS CLOUDS
+ 0002 01 NOCTILUCENT CLOUDS
+ 0003 01 CLOUDS FROM WATERFALLS
+ 0004 01 CLOUDS FROM FIRES
+ 0005 01 CLOUDS FROM VULCANIC ERUPTIONS
+ 0015 01 MISSING VALUE
+020101 0010 0001 01 SCHISTOCERCA GREGARIA
+ 0002 01 LOCUSTA MIGRATORIA
+ 0003 01 NOMADACRIS SEPTEMFASCIATA
+ 0004 01 OEDALEUS SENAGALENSIS
+ 0005 01 ANRACRIDIUM SPP
+ 0006 01 OTHER LOCUST
+ 0007 01 OTHER GRASSHOPPERS
+ 0008 01 ITHER CRICKETS
+ 0009 01 SPODOPTERA EXEMPTA
+ 0015 01 MISSING VALUE
+020102 0011 0000 01 GREEN
+ 0001 01 GREEN AND BLACK
+ 0002 01 BLACK
+ 0003 01 YELLOW AND BLACK
+ 0004 01 STRAW/GREY
+ 0005 01 PINK
+ 0006 01 DARK RED/BROWN
+ 0007 01 MIXED RED AND YELLOW
+ 0008 01 YELLOW
+ 0009 01 OTHER
+ 0015 01 MISSING VALUE
+020151 0003 0000 01 FIRST YEAR ICE
+ 0001 01 MULTI YEAR ICE
+ 0007 01 MISSING
+020252 0003 0000 01 NO EDGE
+ 0001 01 EDGE PRESENT
+ 0007 01 MISSING
+020253 0008 0000 01 LAND
+ 0001 01 VEGETATION COVERED LAND
+ 0002 01 RESERVED
+ 0003 01 ICE
+ 0004 01 POSSIBLE ICE
+ 0005 01 OCEAN
+ 0006 01 COAST
+ 0007 01 MISSING
+021066 0011 0001 01 PROCESSING EQUIPMENT NOT WORKING
+ 0002 01 EQUIPMENT FAILED
+ 0003 01 PRF CODE CHANGED DURING IMAGE GENERATION
+ 0004 01 SAMPLINH WINDOW CHANGED DURING IMAGE GENERATION
+ 0005 01 GAIN CHANGED DURING IMAGE GENERATION
+ 0006 01 CHIRP REPLICA EXCEEDS SPECIFIC VALUE
+ 0007 02 INPUT DATA MEAN AND STANDARD DEVIATION OF IN-PHASE AND
+ QUADRATURE OUT OF RANGE
+ 0008 01 DOPPLER CENTROID CONFIDENCE > MMCC VALUE
+ 0009 01 DOPPLER CENTROID ABSOLUTE VALUE > PRF/2
+ 0010 01 DOPPLER AMBIGUITY CONFIDENCE < MMCC VALUE
+ 0011 01 OUTPUT DATA MEAN AND STANDARD DEVIATION =< MMCC VALUE
+021067 0012 0001 01 NO FOREBEAM CALCULATION
+ 0002 01 NO MIDBEAM CALCULATION
+ 0003 01 NO AFTBEAM CALCULATION
+ 0004 01 FOREBEAM ARCING DETECTED
+ 0005 01 MID ARCING DETECTED
+ 0006 01 AFTBEAM ARCING DETECTED
+ 0007 01 ANY BEAM NOISE CONTENT ABOVE OR EQUAL TO TRESHOLD
+ 0008 01 LAND (ANY LAND IN CELL FOOTPRINT)
+ 0009 01 AUTONOMOUS AMBIGUITY REMOVAL NOT USED
+ 0010 01 METEOROLOGICAL BACKGROUND NOT USED
+ 0011 01 MINIMUM RESIDUAL EXCEEDED TRESHOLD
+ 0012 01 FRAME CHECKSUM ERROR DETECTED
+021068 0007 0001 01 STANDARD DEVIATION OF WIND SPEED OUTSIDE MMCC LIMIT
+ 0002 02 STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT OUTSIDE MMCC L
+ IMIT
+ 0003 01 STANDARD DEVIATION OF ALTITUDE OUTSIDE MMCC LIMIT
+ 0004 01 MEAN PEAKINESS OUTSIDE MMCC LIMIT
+ 0005 01 FRAME CHECKSUM ERROR DETECTED
+ 0006 01 HEIGHT-TIME LOOP TIME CONSTANT CORRECTION NOT PERFORMED
+ 0007 01 NOT ENOUGH MEASUREMENTS ( N< 10)
+021069 0009 0001 01 12.0 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0002 01 11.0 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0003 01 3.7 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0004 01 1.6 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0005 02 CLOUD IDENTIFICATION USED 1.6 MICROMETERS
+ HISTOGRAM REFLECTANCE CLOUD TEST
+ 0006 02 1.6 MICROMETERS HISTOGRAM REFLECTANCE CLOUD
+ TEST USED DYNAMIC TRESHOLD
+ 0007 01 SUN GLINT DETECTED BY 1.6 MICROMETERS REFLECTANCE CLOUD TEST
+ 0008 01 3.7 MICROMETERS USED IN SEA-SURFACE TEMPERATURE RETRIEVAL
+ 0009 02 SEA-SURFACE TEMPERATURE DERIVATION USED DAYTIME DATA
+ (NIGHT-TIME IF ZERO)
+021070 0024 0001 01 CELL 1:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0002 02 CELL 2:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL CELL NUMB
+ ERING
+ 0003 01 CELL 3:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0004 01 CELL 4:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL NW NE
+ 0005 01 CELL 5:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 7 8 9
+ 0006 01 CELL 6:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 4 5 6
+ 0007 01 CELL 7:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 1 2 3
+ 0008 01 CELL 8:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL SW SE
+ 0009 01 CELL 9:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0010 02 -18 DUAL VIEW SST RETRIEVAL USED 3.7 MICRON CHANNEL (ONE BIT
+ PER 10-ARCMIN CELL)
+ 0011 01 CELL 1:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0011 02 CELL 2:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL CELL NUMB
+ ERING
+ 0012 01 CELL 3:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0013 01 CELL 4:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL NW NE
+ 0014 01 CELL 5:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 7 8 9
+ 0015 01 CELL 6:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 4 5 6
+ 0016 01 CELL 7:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 1 2 3
+ 0017 01 CELL 8:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL SW SE
+ 0018 01 CELL 9:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0019 01 NADIR VIEW CONTAINS DAY-TIME DATA (NIGHT IF ZERO)
+ 0020 01 FORWARD VIEW CONTAINS DAY-TIME DATA (NIGHT IF ZERO)
+ 0021 02 RECORD CONTAINS CONTRIBUTIONS FROM INSTRUMENT SCANS ACQUIRED
+ WHEN ERS PLATFORM NOT IN YAW-STEERING MODE
+ 0022 02 RECORD CONTAINS CONTRIBUTIONS FROM INSTRUMENT SCANS FOR WHIC
+ H PRODUCT CONFIDENCE DATA SHOW QUALITY IS POOR OR UNKNOWN
+ 0023 01 MISSING VALUE
+021072 0003 0001 02 HEIGHT ERROR CORRECTION APPLIED INSTEAD OF OPEN LOOP CALIBRA
+ TION
+ 0002 01 MICROWAVE SOUNDER USED FOR TROPOSPHERE CORRECTION
+ 0003 02 AGC OUTPUT CORRECTION APPLIED INSTED OF OPEN LOOP CALIBRATIO
+ N
+021073 0008 0001 01 BLANK DATA RECORD
+ 0002 01 TEST
+ 0003 01 CALIBRATION (CLOSED LOOP)
+ 0004 01 BITE
+ 0005 01 ACQUISITION ON ICE
+ 0006 01 ACQUISITION ON OCEAN
+ 0007 01 TRACKING ON ICE
+ 0008 01 TRACKING ON OCEAN
+021076 0004 0000 01 LINEAR
+ 0001 01 LOGARITHMIC (BASE E)
+ 0002 01 LOGARITHMIC (BASE 10)
+ 0007 01 MISSING VALUE
+021109 0008 0001 01 NOT ENOUGH GOOD SIGMA-0 AVAILABLE FOR WIND RETRIEVAL
+ 0002 01 POOR AZIMUTH DIVERSITY AMONG SIGMA0- FOR WIND RETRIEVAL
+ 0008 01 SOME PORTION OF WIND VECTOR CELL IS OVER LAND
+ 0009 01 SOME PORTION OF WIND VECTOR CELL IS OVER ICE
+ 0010 01 WIND RETRIEVAL NOT PERFORMED FOR WIND VECTOR CELL
+ 0011 01 REPORTED WIND SPEED IS GREATER THAN 30 M/S
+ 0012 01 REPORTED WIND SPEED IS LESS THAN OR EQUAL TO 3 M/S
+ 0017 01 MISSING VALUE
+021115 0011 0001 01 SIGMA-0 MEASUREMENT IS NOT USABLE
+ 0002 01 SIGNAL TO NOISE RATIO IS LOW
+ 0003 01 SIGMA-0 IS NEGATIVE
+ 0004 01 SIGMA-0 IS OUTSIDE OF ACCEPTABLE RANGE
+ 0005 01 SCATTEROMETER PULSE QUALITY IS NOT ACCEPTABLE
+ 0006 01 SIGMA-0 CELL LOCATION ALGORITHM DOES NOT CONVERGE
+ 0007 01 FREQUENCY SHIFT LIES BEYOND THE RANGE OF THE X FACTOR TABLE
+ 0008 02 SPACECRAFT TEMPERATURE IS BEYOND CALIBRATION COEFFICIENT RAN
+ GE
+ 0009 01 NO APPLICABLE ATTITUDE RECORDS WERE FOUND FOR THIS SIGMA-0
+ 0010 02 INTERPOLATED EPHEMERIS DATA ARE NOT ACCEPTABLE FOR THIS SIGM
+ A-0
+ 0017 01 MISSING VALUE
+021116 0016 0001 01 CALIBRATION/MEASUREMENT PULSE FLAG (1)
+ 0002 01 CALIBRATION/MEASUREMENT PULSE FLAG (2)
+ 0003 01 OUTER ANTENNA BEAM
+ 0004 01 SIGMA-0 CELL IS AFT OF SPACECRAFT
+ 0005 01 CURRENT MODE (1)
+ 0006 01 CURRENT MODE (2)
+ 0007 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (1)
+ 0008 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (2)
+ 0009 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (3)
+ 0010 01 LOW RESOLUTION MODE - WHOLE PULSE DATA
+ 0011 01 SCATTEROMETER ELECTRONIC SUBSYSTEM B
+ 0012 01 ALTERNATE SPIN RATE - 19.8 RPM
+ 0013 01 RECEIVER PROTECTION ON
+ 0014 01 SLICES PER COMPOSITE FLAG (1)
+ 0015 01 SLICES PER COMPOSITE FLAG (2)
+ 0016 01 SLICES PER COMPOSITE FLAG (3)
+021119 0014 0000 01 RESERVED
+ 0001 01 SASS
+ 0002 01 SASS2
+ 0003 01 NSCAT0
+ 0004 01 NSCAT1
+ 0005 01 NSCAT2
+ 0006 01 QSCAT0
+ 0007 01 QSCAT1
+ 0031 01 CMOD1
+ 0032 01 CMOD2
+ 0033 01 CMOD3
+ 0034 01 CMOD4
+ 0035 01 CMOD5
+ 0064 01 MISSING VALUE
+021144 0001 0001 01 RAIN
+021150 0004 0000 01 DATA FROM SINGLE GROUND STATION (NO CO-LOCATION)
+ 0001 01 DATA FROM MULTIPLE GROUND STATION (CO-LOCATED DATA)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021155 0016 0001 01 NOT ENOUGH GOOD SIGMA-0 AVAILABLE FOR WIND RETRIEVAL
+ 0002 01 POOR AZIMUTH DIVERSITY AMONG SIGMA-0 FOR WIND RETRIEVAL
+ 0003 01 ANY BEAM NOISE CONTENT ABOVE TRESHOLD
+ 0004 01 PRODUCT MONITORING NOT USED
+ 0005 01 PRODUCT MONITORING FLAG
+ 0006 01 KNMI QUALITY CONTROL FAILS
+ 0007 01 VARIATIONAL QUALITY CONTROL FAILS
+ 0008 01 SOME PORTION OF WIND VECTOR CELL IS OVER LAND
+ 0009 01 SOME PORTION OF WIND VECTOR CELL IS OVER ICE
+ 0010 01 WIND RETRIEVAL NOT PERFORMED FOR WIND VECTOR CELL
+ 0011 01 REPORTED WIND SPEED IS GREATER THAN 30 M/S
+ 0012 01 REPORTED WIND SPEED IS LESS THAN OR EQUAL TO 3 M/S
+ 0013 01 RAIN FLAG FOR THE WIND VECTOR CELL IS NOT USABLE
+ 0014 01 RAIN FLAG ALGORITHM DETECTS RAIN
+ 0015 01 NO METEOROLOGICAL BACKGROUND USED
+ 0016 01 DATA ARE REDUNDANT
+021158 0004 0000 01 ACCEPTABLE
+ 0001 01 NOT ACCEPTABLE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021159 0004 0000 01 GOOD
+ 0001 01 USABLE
+ 0002 01 BAD
+ 0003 01 MISSING VALUE
+021169 0004 0000 01 NO ICE PRESENT
+ 0001 01 ICE PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021196 0012 0001 01 PROCESSING EQUIPMENT NOT WORKING
+ 0002 01 EQUIPMENT FAILED
+ 0003 01 PRF CODE CHANGED DURING IMAGE GENERATION
+ 0004 01 SAMPLING WINDOW CHANGED DURING IMAGE GENERATION
+ 0005 01 GAIN CHANGED DURING IMAGE GENERATION
+ 0006 01 CHIRP REPLICA EXCEEDS SPECIFIED VALUE
+ 0007 02 INPUT DATA MEAN AND STANDARD DEVIATION OF I AND Q OUT OF RAN
+ GE
+ 0008 01 DOPPLER CENTROID CONFIDENCE > MMCC VALUE
+ 0009 01 DOPPLER CENTROID ABSOLUTE VCALUE > PRF/2
+ 0010 01 DOPPLER AMBIGUITY CONFIDENCE < MMCC VALUE
+ 0011 01 OUTPUT DATA MEAN AND STANDARD DEVIATION <= MMCC VALUE
+ 0012 01 MISSING VALUE
+021199 0007 0001 01 3.7 MICRO CHANNEL USED IN ASST DERIVATION
+ 0002 01 ASST DERIVATION USED DATTIME DATA
+ 0003 02 COMPARISON OF ASST AGAINST PREVIOUS
+ EQUIVALENT PASS PERFORMED
+ 0004 02 COMPARISON OF ASST AGAINST WEEKLY AVERAGE
+ OF ASST PERFORMED
+ 0005 01
+ 0006 02 COMPARISON OF RATE OF CHANGE OF ASST AGAINST
+ STATIC TRESHOLD PERFORMED
+ 0007 01 MISSING VALUE
+022056 0004 0000 01 UPWARDS PROFILE
+ 0001 01 DOWNWARDS PROFILE
+ 0002 01 HORIZONTAL
+ 0003 01 MISSING VALUE
+022060 0004 0000 01 DROGUE IS DETACHED
+ 0001 01 DROGUE IS ATTACHED
+ 0002 01 DROGUE STATUS UNKNOWN
+ 0007 01 MISSING VALUE
+022061 0011 0000 01 CALM (GLASSY) HEIGHT 0 M
+ 0001 01 CALM (RIPPLED) HEIGHT 0 - 0.1 M
+ 0002 01 SMOOTH (WAVELETS) HEIGHT 0.1 - 0.5 M
+ 0003 01 SLIGHT HEIGHT 0.5 - 1.5 M
+ 0004 01 MODERATE HEIGHT 1.25 - 2.5 M
+ 0005 01 ROUGH HEIGHT 2.5 - 4 M
+ 0006 01 VERY ROUGH HEIGHT 4 - 6 M
+ 0007 01 HIGH HEIGHT 6 - 9 M
+ 0008 01 VERY HIGH HEIGHT 9 -14 M
+ 0009 01 PHENOMANAL HEIGHT OVER 14 M
+ 0015 01 MISSING VALUE
+022067 0001 0000 01 SEE COMMON CODE TABLE C3
+022068 0001 0000 01 SEE COMMON CODE TABLE C4
+022120 0013 0000 01 GOOD DATA
+ 0001 01 MAXIMUM (HIGH) WATER LEVEL LIMIT EXCEEDED
+ 0002 01 MINIMUM (LOW) WATER LEVEL LIMIT EXCEEDED
+ 0003 01 RATE OF CHANGE LIMIT FOR WATER LEVEL EXCEEDED
+ 0004 01 FLAT LIMIT FOR WATER LEVEL EXCEEDED
+ 0005 01 OBSERVED MINUS PREDICTED WATER LEVEL VALUE LIMIT EXCEEDED
+ 0006 02 OBSERVED VALUE FROM PRIMARY WATER LEVEL SENSOR MINUS
+ BACKUP WATER LEVEL SENSOR
+ 0007 01 VALUE EXCEEDED SPECIFIED TOLERANCE FROM EXPECTED VALUE
+ 0008 02 WATER LEVEL QA PARAMETER (SIGMAS AND/OR OUTLIERS) LIMITS EXC
+ EEDED
+ 0009 01 SEA TEMPERATURE OUTSIDE OF EXPECTED RANGE
+ 0010 01 MULTIPLE QC CHECKS (ABOVE) FAILED
+ 0011 01 NO AUTOMATED WATER LEVEL CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022121 0009 0000 01 OPERATIONAL
+ 0001 02 POSSIBLE CLOGGING PROBLEM OR OTHERWISE DEGRADED WATE LEVEL D
+ ATA
+ 0002 01 POSSIBLE DATUM SHIFT
+ 0003 01 UNKNOWN STATUS OF WATER LEVEL SENSOR
+ 0004 01 SUSPECTED OR KNOWN SEA TEMPERATURE SENSOR PROBLEM
+ 0005 01 MULTIPLE POSSIBLE PROBLEMS (ABOVE)
+ 0006 01 BAD DATA- DO NOT DISSEMINATE
+ 0007 01 NO MANUAL WATER LEVEL CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022122 0008 0000 01 GOOD DATA FROM ALL SENSORS
+ 0001 01 WIND DIRECTION OUTSIDE OF ALLOWABLE RANGE
+ 0002 01 WIND SPEED OUTSIDE OF EXPECTED RANGE
+ 0003 01 BAROMETRIC PRESSURE OUTSIDE OF EXPECTED RANGE
+ 0004 01 AIR TEMPERATURE OUTSIDE OF EXPECTED RANGE
+ 0005 01 MULTIPLE SENSOR FAILED QC CHECKS
+ 0006 01 NO AUTOMATED METEOROLOGICAL DATA CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022123 0009 0000 01 OPERATIONAL
+ 0001 01 SUSPECTED OR KNOWN PROBLEM WITH WIND SENSOR
+ 0002 01 SUSPECTED OR KNOWN PROBLEM WITH BAROMETRIC PRESSURE SENSOR
+ 0003 01 SUSPECTED OR KNOWN PROBLEM WITH AIR TEMPERATURE SENSOR
+ 0004 01 UNKNOWN STATUS OF ALL SENSORS
+ 0005 01 SUSPECTED OR KNOWN PROBLEMS WITH MULTIPLE SENSORS
+ 0006 01 BAD DATA - DO NOT DISSEMINATE
+ 0007 01 NO MANUAL METEOROLOGICAL DATA CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022252 0006 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND
+ PASSED
+ 0002 02 AUTOMATIC QUALITY CONTROL PASSED AND MAGNOLIA CHECKED AND
+ DELETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND
+ FAILED
+ 0005 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND
+ RE-INSERTED
+023001 0005 0000 01 RESERVED
+ 0001 01 ARTICLES 1 AND 2
+ 0002 01 ARTICLE 3
+ 0003 01 ARTICLE 5.2
+ 0007 01 MISSING VALUE
+023002 0016 0000 01 RESERVED
+ 0001 01 NUCLEAR REACTOR ON GROUND
+ 0002 01 NUCLEAR REACTOR ON SEA
+ 0003 01 NUCLEAR REACTOR IN SPACE
+ 0004 01 NUCLEAR FULE FACILITY
+ 0005 01 RADIOACTIVE WASTE MANAGMENT FACITILY
+ 0006 01 TRANSPORT OF NUCLEAR FUEL OR RADIOACTIVE WASTE
+ 0007 01 STORAGE OF NUCLEAR FUEL OR RADIOACTIVE WASTE
+ 0008 01 MANUFACTURE OF RADIO-ISOTOPES
+ 0009 01 USE OF RADIO-ISOTOPES
+ 0010 01 STORAGE OF RADIO-ISOTOPES
+ 0011 01 DISPOSAL OF RADIO-ISOTOPS
+ 0012 01 TRANSPORT OF RADIO-ISOTOPES
+ 0013 01 USE OF RADIO-ISOTOPES FOR POWER GENERATION
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+023003 0008 0000 01 NO RELEASE
+ 0001 01 RELEASE TO ATMOSPHERE
+ 0002 01 RELEASE TO WATER
+ 0003 01 RELEASE TO BOTH ATMOSPHERE AND WATER
+ 0004 01 EXPECTED RELEASE TO ATMOSPHERE
+ 0005 01 EXPECTED RELEASE TO WATER
+ 0006 01 EXPECTED RELEASE TO BOTH ATMOSPHERE AND WATER
+ 0007 01 MISSING VALUE
+023004 0006 0000 01 NO COUNTERMEASURE
+ 0001 01 EVACUATION
+ 0002 01 SHELTERING
+ 0003 01 PROPHILAXIS
+ 0004 01 WATER
+ 0007 01 MISSING VALUE
+023005 0004 0000 01 INCIDENT STAT DOES NOT UNDERSTAND WHAT HAPPENED
+ 0001 01 INCIDENT STATE KNOWS THE CAUSE OF THE INCIDENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023006 0008 0000 01 NO IMPROVEMENT
+ 0001 01 UNSTABLE
+ 0002 01 NO DETERIORATION
+ 0003 01 IMPROVING
+ 0004 01 STABLE
+ 0005 01 DETERIORATING
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+023007 0005 0000 01 NO RELEASE
+ 0001 01 RELEASE HAS STOPPED
+ 0002 01 RELEASE
+ 0003 01 RELEASE IS CONTINUING
+ 0007 01 MISSING VALUE
+023008 0004 0000 01 GASEUS
+ 0001 01 PARTICULATE
+ 0002 01 MIXTURE OF GASEUS AND PARTICULATE
+ 0003 01 MISSING VALUE
+023009 0004 0000 01 GASEUS
+ 0001 01 PARTICULATE
+ 0002 01 MIXTURE OF GASEUS AND PARTICULATE
+ 0003 01 MISSING VALUE
+023016 0004 0000 01 NO SIGNIFICANT TOXIC HEALTH EFFECT
+ 0001 01 SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT POSSIBLE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023018 0006 0000 01 RELEASE NO LONGER OCCURRING
+ 0001 01 RELEASE STILL OCCURRING
+ 0002 01 RELEASE EXPECTED TO INCREASE IN NEXT SIX HOURS
+ 0003 01 RELEASE EXPECTED TO REMAIN CONSTANT IN NEXT SIX HOURS
+ 0004 01 RELEASE EXPECTED TO DECREASE IN NEXT SIX HOURS
+ 0007 01 MISSING VALUE
+023031 0004 0000 01 PLUME WILL NOT ENCOUNTER RAIN IN INCIDENT STATE
+ 0001 01 PLUME WILL ENCOUNTER RAIN IN INCIDENT STATE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023032 0004 0000 01 NO SIGNIFICANT CHANGE EXPECTED WITHIN NEXT SIX HOURS
+ 0001 02 ANTICIPATED SIGNIFICANT CHANGE EXPECTED WITHIN NEXT SIX HOUR
+ S
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+024003 0005 0000 01 NOBLE GASES
+ 0001 01 IODINES
+ 0002 01 CAESIUM
+ 0003 01 TRANSURANICS
+ 0031 01 MISSING VALUE
+025004 0004 0000 01 INCOHERENT
+ 0001 01 COHERENT (DOPPLER)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025005 0004 0000 01 LOGATITHM - 2.5 DB
+ 0001 01 LINEAR
+ 0002 01 SPECIAL
+ 0003 01 MISSING VALUE
+025006 0005 0000 01 ZH TO R CONVERSION
+ 0001 01 (ZH, ZDR) TO (NO.DO) TO R
+ 0002 01 (Z(F1),Z(F2)) TO ATTENUATION TO R
+ 0006 01 OTHER
+ 0007 01 MISSING VALUE
+025009 0004 0001 01 NONE
+ 0002 01 CALIBRATION TARGET OR SIGNAL
+ 0003 01 AGAINST RAINGAGES
+ 0004 01 AGAINST OTHER INSTRUMENTS (DISTROMETER-ATTENUATION)
+025010 0008 0000 01 NONE
+ 0001 01 MAP
+ 0002 01 INSERTION OF HIGHER ELEVATION DATA AND MAP
+ 0003 01 ANALYSIS OF FLUCTUATING LOGARITHM SIGNAL (CLUTTER DETECTION)
+ 0004 02 EXTRACTION OF FLUCTUATING PART OF LINEAR SIGNAL (CLUTTER SUP
+ PRESSION)
+ 0005 01 CLUTTER SUPPRESSION DOPPLER
+ 0006 01 MULTIPARAMETER ANALYSIS
+ 0015 01 MISSING VALUE
+025011 0004 0000 01 NONE
+ 0001 01 MAP OF CORRECTION FACTORS
+ 0002 01 INTERPOLATION (AZIMUTH OR ELEVATION)
+ 0003 01 MISSING VALUE
+025012 0004 0000 01 HARDWARE
+ 0001 01 SOFTWARE
+ 0002 01 HARDWARE AND SOFTWARE
+ 0003 01 MISSING VALUE
+025013 0001 0001 01 BRIGHT BAND CORRECTION
+025015 0001 0001 01 RADOME ATTENUATION CORRECTION
+025017 0001 0001 01 PRECIPITATION ATTENUATION CORRECTION
+025020 0004 0000 01 FTT (FAST FOURIER TRANSFORM
+ 0001 01 PPP (PULSE PAIR PROCESSING
+ 0002 01 VPC (VECTOR-PHASE CHANGE)
+ 0003 01 MISSING VALUE
+025021 0005 0001 01 SIMPLE AVERAGE
+ 0002 01 CONSENSUS AVERAGE
+ 0003 01 MEDIAN CHECK
+ 0004 01 VERTICAL CONSISTENCY CHECK
+ 0005 01 OTHER
+025030 0004 0000 02 RUNNING MEAN SEA-SURFACE TEMPERATURE NOT USED BECAUSE USAGE
+ CRITERIA NOT MET
+ 0001 02 RUNNING MEAN SEA-SURFACE TEMPERATURE NOT USED BECAUSE DATA N
+ OT AVAILABLE
+ 0002 01 RUNNING MEAN SEA-SURFACE TEMPERATURE USED AS PREDICTOR
+ 0003 01 MISSING VALUE
+025032 0004 0000 01 RESERVED
+ 0001 01 DATA FROM LOW MODE
+ 0002 01 DATA FROM HIGH MODE
+ 0003 01 MISSING VALUE
+025033 0004 0000 01 WIND PROFILER OPERATING IN SUBMODE A
+ 0001 01 WIND PROFILER OPERATING IN SUBMODE B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025034 0003 0001 01 TEST A PERFORMED AND FAILED
+ 0002 01 TEST B PERFORMED AND FAILED
+ 0003 01 TEST RESULTS INCONCLUSIVE
+025036 0004 0000 02 NETWORK OF SEVERAL DIRECTION-FINDERS OPERATING ON
+ THE SAME INDIVIDUAL ATMOSPHERICS
+ 0001 02 NETWORK OF SEVERAL ARRIVAL-TIME STATIONS OPERATING ON
+ THE SAME INDIVIDUAL ATMOSPHERICS
+ 0006 01 SINGLE STATION RANGE BEARING TECHNIQUE
+ 0015 01 MISSING VALUE
+025040 0010 0000 01 NON-SPECIFIC MODE
+ 0001 01 FIRST GUESS DATA
+ 0002 01 CLOUD DATA
+ 0003 01 AVERAGE VECTOR DATA
+ 0004 01 PRIMARY DATA
+ 0005 01 GUESS DATA
+ 0006 01 VECTOR DATA
+ 0007 01 TRACER DATA; THE IMAGE
+ 0008 01 TRACER DATA TO NEXT IMAGE
+ 0015 01 MISSING VALUE
+025041 0004 0000 01 DIRECTION ORIGINALLY REPORTED IN TRUE DEGREES
+ 0001 01 DIRECTION ORIGINALLY REPORTED USING CODE TABLE 0700, FM 13
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025042 0004 0000 01 SPEED ORIGINALLY REPORTED IN METERS PER SECOND
+ 0001 01 SPEED ORIGINALLY REPORTED USING CODE TABLE 2251, FM 13
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025045 0020 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+ 0007 01 CHANNEL 7 PRESENT - (SET TO 1 PRESENT)
+ 0008 01 CHANNEL 8 PRESENT - (SET TO 1 PRESENT)
+ 0009 01 CHANNEL 9 PRESENT - (SET TO 1 PRESENT)
+ 0010 01 CHANNEL 10 PRESENT - (SET TO 1 PRESENT)
+ 0011 01 CHANNEL 11 PRESENT - (SET TO 1 PRESENT)
+ 0012 01 CHANNEL 12 PRESENT - (SET TO 1 PRESENT)
+ 0013 01 CHANNEL 13 PRESENT - (SET TO 1 PRESENT)
+ 0014 01 CHANNEL 14 PRESENT - (SET TO 1 PRESENT)
+ 0015 01 CHANNEL 15 PRESENT - (SET TO 1 PRESENT)
+ 0016 01 CHANNEL 16 PRESENT - (SET TO 1 PRESENT)
+ 0017 01 CHANNEL 17 PRESENT - (SET TO 1 PRESENT)
+ 0018 01 CHANNEL 18 PRESENT - (SET TO 1 PRESENT)
+ 0019 01 CHANNEL 19 PRESENT - (SET TO 1 PRESENT)
+ 0020 01 CHANNEL 20 PRESENT - (SET TO 1 PRESENT)
+025046 0004 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+025047 0003 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+025048 0015 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+ 0007 01 CHANNEL 7 PRESENT - (SET TO 1 PRESENT)
+ 0008 01 CHANNEL 8 PRESENT - (SET TO 1 PRESENT)
+ 0009 01 CHANNEL 9 PRESENT - (SET TO 1 PRESENT)
+ 0010 01 CHANNEL 10 PRESENT - (SET TO 1 PRESENT)
+ 0011 01 CHANNEL 11 PRESENT - (SET TO 1 PRESENT)
+ 0012 01 CHANNEL 12 PRESENT - (SET TO 1 PRESENT)
+ 0013 01 CHANNEL 13 PRESENT - (SET TO 1 PRESENT)
+ 0014 01 CHANNEL 14 PRESENT - (SET TO 1 PRESENT)
+ 0015 01 CHANNEL 15 PRESENT - (SET TO 1 PRESENT)
+025049 0005 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+025051 0006 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+025053 0006 0001 01 GOOD
+ 0002 01 REDUNDANT
+ 0003 01 QUESTIONABLE
+ 0004 01 BAD
+ 0005 01 EXPERIMENTAL
+ 0006 01 PRECIPITATING
+025069 0007 0001 01 SMOOTHED
+ 0002 01 BASELINE ADJUSTED
+ 0003 01 NORMALIZED TIME INTERVAL
+ 0004 01 OUTLIER CHECKED
+ 0005 01 PLAUSIBILITY CHECKED
+ 0006 01 CONSISTENCY CHECKED
+ 0007 01 INTERPOLATED
+025086 0004 0000 01 DEPTHS ARE NOT CORRECTED
+ 0001 01 DEPTHS ARE CORRECTED
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025093 0003 0001 01 NO CORRECTION
+ 0002 01 VERTICAL VELOCITY CORRECTION
+ 0007 01 ALL CORRECTIONS
+025095 0001 0001 02 ALTIMETER OPERATING (SET TO 0 IF NOMINAL, SET TO
+ BACKUP)
+025096 0004 0001 01 MODE INDICATOR (0 IF MODE 2, 1 IF MODE 1)
+ 0002 03 MODE 1 CALIBRATION SEQUENCE INDICATOR (0 IF NORMAL DATA TAKI
+ NG EITHER MODE 1 OR 2, 1 IF MODE 1 CALIBRATION SEQUENCE) BIT
+ S 3 AND 4 INDICATE ACTIVE 23.8 GHZ CHANNEL
+ 0003 01 CHANNEL 2 (0 IF ON, 1 IF OFF)
+ 0004 01 CHANNEL 3 (0 IF ON, 1 IF OFF)
+025097 0011 0000 01 RANGES BETWEEN 0 AND 30 CM
+ 0001 01 RANGES BETWEEN 30 AND 60 CM
+ 0002 01 RANGES BETWEEN 60 AND 90 CM
+ 0003 01 RANGES BETWEEN 90 AND 120 CM
+ 0004 01 RANGES BETWEEN 120 AND 150 CM
+ 0005 01 RANGES BETWEEN 150 AND 180 CM
+ 0006 01 RANGES BETWEEN 180 AND 210 CM
+ 0007 01 RANGES BETWEEN 210 AND 240 CM
+ 0008 01 RANGES BETWEEN 240 AND 270 CM
+ 0009 01 RANGES LARGER THAN 270 CM
+ 0015 01 MISSING VALUE
+025098 0008 0001 01 KU BAND RANGE
+ 0002 01 C BAND RANGE
+ 0003 01 KU BAND SWH
+ 0004 01 C BAND SWH
+ 0005 01 KU BAND SCATTEROMETER COEFFICIENT
+ 0006 01 C BAND SCATTEROMETER COEFFICIENT
+ 0007 01 OFF NADIR ANGLE FROM KU BAND WVEFORM PARAMETERS
+ 0008 01 OFF NADIR FROM PLATFORM
+025099 0006 0001 01 KU BAND RANGE INSTRUMENTAL CORRECTION
+ 0002 01 C BAND RANGE INSTRUMENTAL CORRECTION
+ 0003 01 KU BAND SWH INSTRUMENTAL CORRECTION
+ 0004 01 C BAND SWH INSTRUMENTAL CORRECTION
+ 0005 01 KU BAND SCATTEROMETER COEFFICIENT INSTRUMENTAL CORRECTION
+ 0006 01 C BAND SCATTEROMETER COEFFICIENT INSTRUMENTAL CORRECTION
+025110 0006 0001 02 RAW DATA ANALYSIS USED FOR RAW DATA CORRECTION.
+ CORRECTION DONE USING DEFAULT PARAMETERS
+ 0002 02 RAW DATA ANALYSIS USED FOR RAW DATA CORRECTION.
+ CORRECTION DONE USING RAW DATA ANALYSIS RESULTS
+ 0003 01 ANTENNA ELEVATION PATTERN CORRECTION APPLIED
+ 0004 01 NOMINAL CHIRP REPLICA USED
+ 0005 01 RECONSTRUCTED CHIRP USED
+ 0006 01 SLANT RANGE TO GROUND RANGE CONVERSION APPLIED
+025120 0004 0000 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS GREATER THAN THE ACCEPTABLE THRESHOLD
+ 0001 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS LESS THAN THE ACCEPTABLE THRESHOLD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025122 0004 0000 01 HARDWARE CONFIGURATION FOR RF IS A
+ 0001 01 HARDWARE CONFIGURATION FOR RF IS B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025123 0004 0000 01 HARDWARE CONFIGURATION FOR HPA IS A
+ 0001 01 HARDWARE CONFIGURATION FOR HPA IS B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025124 0004 0000 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS GREATER THAN THE ACCEPTABLE THRESHOLD
+ 0001 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS LESS THAN THE ACCEPTABLE THRESHOLD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025144 0013 0001 01 PIXEL IS AFFECTED BY RFI EFFECTS
+ 0002 02 PIXEL IS LOCATED IN THE HEXAGONAL ALIAS DIRECTION CENTRED ON
+ SUN ALIAS
+ 0003 02 PIXEL IS CLOSE TO THE BORDER DELIMITING THE EXTENDED ALIAS F
+ REE ZONE
+ 0004 01 PIXEL IS INSIDE THE EXTENDED ALIAS FREE ZONE
+ 0005 01 PIXEL IS INSIDE THE EXCLUSIVE OF ALIAS FREE ZONE
+ 0006 02 PIXEL IS LOCATED IN ZONE WHERE A MOON ALIAS WAS RECONSTRUCTE
+ D
+ 0007 02 PIXEL IS LOCATED IN ZONE WHERE SUN REFLECTION HAS BEEN DETEC
+ TED
+ 0008 01 PIXEL IS LOCATED IN ZONE WHERE SUN ALIAS WAS RECONSTRUCTED
+ 0009 02 FLAT TARGET TRANSFORMATION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION OF THIS PIXEL
+ 0010 03 SCENE HAS BEEN COMBINED WITH AN ADJUSTMENT SCENE IN OPOSITE
+ POLARISATION DURING IMAGE RECONSTRUCTION TO ACCOUNT FOR CROS
+ S-POLARISATION LEAKAGE
+ 0011 02 DIRECT MOON CORRECTION HAS BENN PERFORMED DURING IMAGE RECON
+ STRUCTION OF THIS PIXEL
+ 0012 02 REFLECTED SUN CORRECTION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION IF THIS PIXEL
+ 0013 02 DIRECT SUN CORRECTION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION OF THIS IMAGE
+026010 0025 0001 01 0100 INCLUDED
+ 0002 01 0200 INCLUDED
+ 0003 01 0300 INCLUDED
+ 0004 01 0400 INCLUDED
+ 0005 01 0500 INCLUDED
+ 0006 01 0600 INCLUDED
+ 0007 01 0700 INCLUDED
+ 0008 01 0800 INCLUDED
+ 0009 01 0900 INCLUDED
+ 0010 01 1000 INCLUDED
+ 0011 01 1100 INCLUDED
+ 0012 01 1200 INCLUDED
+ 0013 01 1300 INCLUDED
+ 0014 01 1400 INCLUDED
+ 0015 01 1500 INCLUDED
+ 0016 01 1600 INCLUDED
+ 0017 01 1700 INCLUDED
+ 0018 01 1800 INCLUDED
+ 0019 01 1900 INCLUDED
+ 0020 01 2000 INCLUDED
+ 0021 01 2100 INCLUDED
+ 0022 01 2200 INCLUDED
+ 0023 01 2300 INCLUDED
+ 0024 01 2400 INCLUDED
+ 0025 01 UNKNOWN MIXTURE OF HOURS
+029001 0006 0000 01 GNOMONIC PROJECTION
+ 0001 01 POLAR STEREOGRAPHIC PROJECTION
+ 0002 01 LAMBERT'S CONFORMAL CONIC PROJECTION
+ 0003 01 MERCATOR'S PROJECTION
+ 0004 01 SCANNING CONE (RADAR)
+ 0007 01 MISSING VALUE
+029002 0004 0000 01 CARTESIAN
+ 0001 01 POLAR
+ 0002 01 OTHER
+ 0007 01 MISSING VALUE
+030031 0013 0000 01 PPI
+ 0001 01 COMPOSITE
+ 0002 01 CAPPI
+ 0003 01 VERTICAL SECTION
+ 0004 01 ALPHANUMERIC DATA
+ 0005 01 MAP OF SUBJECT CLUTTER
+ 0006 01 MAP
+ 0007 01 TEST PICTURE
+ 0008 01 COMMENTS
+ 0009 01 MAP OF GROUND OCCULTATION
+ 0010 01 MAP OF RADAR BEAM HEIGHT
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+030032 0009 0001 01 MAP
+ 0002 01 SATELLITE IR
+ 0003 01 SATELLITE VIS
+ 0004 01 SATELLITE WV
+ 0005 01 SATELLITE MULTISPECTRAL
+ 0006 01 SYNOPTIC OBSERVATIONS
+ 0007 01 FORECAST PARAMETERS
+ 0008 01 LIGHTNING DATA
+ 0015 01 OTHER DATA
+031021 0004 0001 01 1 BIT INDICATOR OF QUALITY, 0= GOOD; 1=SUSPECT OR BAD
+ 0002 02 2 BIT INDICATOR OF QUALITY, 0= GOOD; 1= SLIGHTLY SUSPECTED;
+ 2= HIGHLY SUSPECTED; 3=BAD
+ 0007 01 PERCENTAGE CONFIDENCE
+ 0063 01 MISSING VALUE
+031031 0001 0001 01 DATA NOT PRESENT
+033002 0004 0000 01 DATA NOT SUSPECT
+ 0001 01 DATA SUSPECT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033003 0005 0000 01 DATA NOT SUSPECT
+ 0001 01 DATA SLIGHTLY SUSPECT
+ 0002 01 DATA HIGHTLY SUSPECT
+ 0003 01 DATA CONSIDERED UNFIT FOR USE
+ 0007 01 MISSING VALUE
+033005 0023 0001 01 NO AUTOMATED METEOROLOGICAL DATA CHECKS PERFORMED
+ 0002 01 PRESSURE DATA SUSPECT
+ 0003 01 WIND DATA SUSPECT
+ 0004 01 DRY-BULB TEMPERATURE DATA SUSPECT
+ 0005 01 WET-BULB TEMPERATURE DATA SUSPECT
+ 0006 01 HUMIDITY DATA SUSPECT
+ 0007 01 GROUND TEMPERATURE DATA SUSPECT
+ 0008 01 SOIL TEMPERATURE (DEPTH 1) DATA SUSPECT
+ 0009 01 SOIL TEMPERATURE (DEPTH 2) DATA SUSPECT
+ 0010 01 SOIL TEMPERATURE (DEPTH 3) DATA SUSPECT
+ 0011 01 SOIL TEMPERATURE (DEPTH 4) DATA SUSPECT
+ 0012 01 SOIL TEMPERATURE (DEPTH 5) DATA SUSPECT
+ 0013 01 CLOUD DATA SUSPECT
+ 0014 01 VISIBILITY DATA SUSPECT
+ 0015 01 PRESENT WEATHER DATA SUSPECT
+ 0016 01 LIGHTNING DATA SUSPECT
+ 0017 01 ICE DEPOSIT DATA SUSPECT
+ 0018 01 PRECIPITATION DATA SUSPECT
+ 0019 01 STATE OF GROUND DATA SUSPECT
+ 0020 01 SNOW DATA SUSPECT
+ 0021 01 WATER CONTENT DATA SUSPECT
+ 0022 01 EVAPORATION/EVAPOTRANSPIRATION DATA SUSPECT
+ 0023 01 SUNSHINE DATA SUSPECT
+033006 0005 0000 01 SELF-CHECK OK
+ 0001 01 AT LEAST ONE WARNING ACTIVE, NO ALARMS
+ 0002 01 AT LEAST ONE ALARM ACTIVE
+ 0003 01 SENSOR FAILURE
+ 0007 01 MISSING VALUE
+033015 0016 0000 01 PASSED ALL CHECKS
+ 0001 01 MISSING-DATA CHECK
+ 0002 01 DESCENDING/REASCENDING BALLOON CHECK
+ 0003 01 DATA PLAUSIBILITY CHECK (ABOVE LIMITS)
+ 0004 01 DATA PLAUSIBILITY CHECK (BELOW LIMITS)
+ 0005 01 SUPERADIABATIC LAPSE RATE CHECK
+ 0006 01 LIMITING ANGLES CHECK
+ 0007 01 ASCENSION RATE CHECK
+ 0008 01 EXCESSIVE CHANGE FROM PREVIOUS FLIGHT
+ 0009 01 BALLOON OVERHEAD CHECK
+ 0010 01 WIND SPEED CHECK
+ 0011 01 WIND DIRECTION CHECK
+ 0012 01 DEPENDENCY CHECK
+ 0013 01 DATA VALID BUT MODIFIED
+ 0014 01 DATA OUTLIER CHECK
+ 0063 01 MISSING DATA
+033020 0008 0000 01 GOOD
+ 0001 01 INCONSISTENT
+ 0002 01 DOUBTFUL
+ 0003 01 WRONG
+ 0004 01 NOT CHECKED
+ 0005 01 HAS BEEN CHECKED
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+033021 0004 0000 01 WITHIN LIMITS
+ 0001 01 OUTSIDE LIMITS
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033022 0004 0000 01 GOOD (SEVERAL IDENTICAL REPORTS HAVE BEEN RECEIVED)
+ 0001 01 DUBIOUS (NO IDENTICAL REPORT HAVE BEEN RECEIVED)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033023 0004 0000 01 RELIABLE (LOCATION WAS MADE OVER TWO SATELLITE PASSES)
+ 0001 01 LATEST KNOWN (NO LOCATION OVER CORRESPONDING PASS)
+ 0002 01 DUBIOUS
+ 0003 01 MISSING VALUE
+033024 0010 0000 01 RESERVED
+ 0001 01 EXELLENT - WITHIN 3 METRES
+ 0002 01 GOOD - WITHIN 10 METRES
+ 0003 01 FAIR - WITHIN 20 METRES
+ 0004 01 POOR - MORE THAN 20 METRES
+ 0005 01 EXELLENT -WITHIN 10 FEET
+ 0006 01 GOOD WITHIN-30 FEET
+ 0007 01 FAIR WITHIN 60 FEET
+ 0008 01 POOR - MORE THAN 60 FEET
+ 0015 01 MISSING VALUE
+033025 0005 0000 01 TIME INTERPOLATED, LATITUDE AND LONGITUDE REPORTED
+ 0001 01 TIME REPORTED, LATITUDE AND LONGITUDE INTERPOLATED
+ 0002 01 TIME, LATITUDE AND LONGITUDE INTERPOLATED
+ 0003 01 TIME, LATITUDE AND LONGITUDE REPORTED
+ 0007 01 MISSING VALUE
+033026 0010 0000 01 NORMAL OPERATIONS - MEASUREMENT MODE
+ 0001 01 NORMAL OPERATIONS - NON-MEASUREMENT MODE
+ 0002 01 SMALL RH
+ 0003 01 HUMIDITY ELEMENT IS WET
+ 0004 01 HUMIDITY ELEMENT IS CONTAMINATED
+ 0005 01 HEATER FAIL
+ 0006 01 HEATER FAIL AND WET/CONTAMINATED HUMIDITY ELEMENT
+ 0007 01 SINGLE VALIDITY BAD
+ 0008 01 NUMERIC ERROR
+ 0063 01 MISSING VALUE
+033027 0005 0000 01 RADIUS >= 1500 M
+ 0001 01 500 M <= RADIUS < 1500 M
+ 0002 01 250 M <= RADIUS < 500 M
+ 0003 01 RADIUS < 250 M
+ 0007 01 MISSING VALUE
+033028 0006 0000 01 RESERVED
+ 0001 01 NOMINAL
+ 0002 01 DEGRADED BY SW ERROR; ANY ERROR REPORTED BY THE ALGORITHMS
+ 0003 01 DEGRADED BY INSTRUMENT ERROR
+ 0004 01 DEGRADED BY CORRUPTED/MISSING ADF
+ 0007 01 MISSING
+033030 0007 0001 01 DO NOT USE SCAN FOR PRODUCT GENERATION
+ 0002 01 TIME SEQUENCE ERROR DETECTED WITH THIS SCAN
+ 0003 01 DATA GAP PRECEDES THIS SCAN
+ 0004 01 NO CALIBRATION
+ 0005 01 NO EARTH LOCATION
+ 0006 01 FIRST GOOD TIME FOLLOWING A CLOCK UPDATE
+ 0007 01 INSTRUMENT STATUS CHANGED WITH THIS SCAN
+033031 0021 0001 02 TIME FIELD IS BAD BUT CAN PROBABLY BE INFERRED FROM THE PREV
+ IOUS GOOD TIME
+ 0002 02 TIME FIELD IS BAD AND CAN�~@~YT BE INFERRED FROM THE PREVIOU
+ S GOOD TIME
+ 0003 04 THIS RECORD STARTS A SEQUENCE THAT IS INCONSISTENT WITH PREV
+ IOUS TIMES (I.E. THERE IS A TIME DISCONTINUITY). THIS MAY OR
+ MAY NOT BE ASSOCIATED WITH A SPACECRAFT CLOCK UPDATE (SEE S
+ CAN LINE STATUS FLAGS FOR ATOVS)
+ 0004 02 START OF A SEQUENCE THAT APPARENTLY REPEATS SCAN TIMES THAT
+ HAVE BEEN PREVIOUSLY ACCEPTED
+ 0005 01 SCAN LINE WAS NOT CALIBRATED BECAUSE OF BAD TIME
+ 0006 03 SCAN LINE WAS CALIBRATED USING FEWER THAN THE PREFERRED NUMB
+ ER OF SCAN LINES BECAUSE OF PROXIMATY TO START OR END OF DAT
+ A OR TO A DATA GAP
+ 0007 02 SCAN LINE WAS NOT CALIBRATED BECAUSE OF BAD OR INSUFFICIENT
+ PRT DATA
+ 0008 01 SCAN LINE WAS CALIBRATED BUT WITH MARGINAL PRT DATA
+ 0009 01 SOME UNCALIBRATED CHANNELS ON THIS SCAN
+ 0010 01 UNCALIBRATED DUE TO INSTRUMENT MODE
+ 0011 02 QUESTIONABLE CALIBRATION BECAUSE OF ANTENNA POSITION ERROR O
+ F SPACE VIEW
+ 0012 02 QUESTIONABLE CALIBRATION BECAUSE OF ANTENNA POSITION ERROR O
+ F BLACK BODY
+ 0013 01 NOT EARTH LOCATED BECAUSE OF BAD TIME
+ 0014 03 EARTH LOCATION QUESTIONABLE BECAUSE OF
+ QUESTIONABLE TIME CODE (SEE TIME PROBLEM
+ CODE BITS)
+ 0015 02 EARTH LOCATION QUESTIONABLE - ONLY MARGINAL AGREEMENT
+ WITH REASONABLENESS CHECK
+ 0016 01 EARTH LOCATION QUESTIONABLE - FAILS REASONABLENESS CHECK
+ 0017 02 EARTH LOCATION QUESTIONABLE BECAUSE OF ANTENNA POSITION CHEC
+ K
+ 0018 01 SCAN LINE CALIBRATION COLD BLACK BODY
+ 0019 01 SCAN LINE CALIBRATION WARM BLACK BODY
+ 0020 01 SCAN LINE CALIBRATION SPACE VIEW
+ 0021 01 EARTH VIEW
+033032 0006 0001 01 NO GOOD BLACKBODY COUNTS FOR SCAN LINE
+ 0002 01 NO GOOD SPACE VIEW COUNTS FOR THIS LINE
+ 0003 01 NO GOOD PRTS FOR THIS LINE
+ 0004 01 SOME BAD BLACKBODY VIEW COUNTS FOR THIS LINE
+ 0005 01 SOME BAD SPACE VIEW COUNTS FOR THIS LINE
+ 0006 01 SOME BAD PRT TEMPS ON THIS LINE
+033033 0023 0001 01 SET IF SECONDARY CALIBRATION USED
+ 0002 02 BRIGHTNESS TEMPERATURE IN CHANNEL 1 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0003 02 BRIGHTNESS TEMPERATURE IN CHANNEL 2 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0004 02 BRIGHTNESS TEMPERATURE IN CHANNEL 3 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0005 02 BRIGHTNESS TEMPERATURE IN CHANNEL 4 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0006 02 BRIGHTNESS TEMPERATURE IN CHANNEL 5 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0007 02 BRIGHTNESS TEMPERATURE IN CHANNEL 6 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0008 02 BRIGHTNESS TEMPERATURE IN CHANNEL 7 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0009 02 BRIGHTNESS TEMPERATURE IN CHANNEL 8 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0010 02 BRIGHTNESS TEMPERATURE IN CHANNEL 9 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0011 02 BRIGHTNESS TEMPERATURE IN CHANNEL 10 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0012 02 BRIGHTNESS TEMPERATURE IN CHANNEL 11 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0013 02 BRIGHTNESS TEMPERATURE IN CHANNEL 12 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0014 02 BRIGHTNESS TEMPERATURE IN CHANNEL 13 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0015 02 BRIGHTNESS TEMPERATURE IN CHANNEL 14 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0016 02 BRIGHTNESS TEMPERATURE IN CHANNEL 15 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0017 02 BRIGHTNESS TEMPERATURE IN CHANNEL 16 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0018 02 BRIGHTNESS TEMPERATURE IN CHANNEL 17 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0019 02 BRIGHTNESS TEMPERATURE IN CHANNEL 18 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0020 02 BRIGHTNESS TEMPERATURE IN CHANNEL 19 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0021 02 BRIGHTNESS TEMPERATURE IN CHANNEL 20 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0022 01 SET IF ALL CHANNELS ARE MISSING
+ 0023 01 SUSPECT
+033035 0010 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND PA
+ SSED
+ 0002 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND DE
+ LETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND FA
+ ILED
+ 0005 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND RE
+ -INSERTED
+ 0006 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND N
+ OT MANUALLY CHECCKED
+ 0007 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE
+ AND MANUALLY CHECKED AND FAILED
+ 0008 01 MANUALLY CHECKED AND FAILED
+ 0015 01 MISSING VALUE
+033037 0019 0001 01 U DEPARTURE FROM GUESS
+ 0002 01 V DEPARTURE FROM GUESS
+ 0003 01 U & V DEPARTURE FROM GUESS
+ 0004 01 U ACCELERATION
+ 0005 01 V ACCELERATION
+ 0006 01 U & V ACCELERATION
+ 0007 01 POSSIBLE LAND FEATURE
+ 0008 01 U ACCELERATION AND POSSIBLE LAND FEATURE
+ 0009 01 V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0010 01 U & V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0011 01 BAD WIND GUESS
+ 0012 01 CORRELATION FAILURE
+ 0013 01 SEARCH BOX OFF EDGE OF AREA
+ 0014 01 TARGET BOX OFF EDGE OF AREA
+ 0015 01 PIXEL BRIGHTNESS OUT OF BOUNDS (NOISY LINE)
+ 0016 01 TARGET OUTSIDE OF LAT/LONG BOX
+ 0017 01 TARGET OUTSIDE OF PRESSURE MIN/MAX
+ 0018 01 AUTOEDITOR FLAGGED SLOW VECTOR
+ 0019 01 AUTOEDITOR FLAGGED VECTORS
+033038 0009 0001 01 TOTAL ZENITH DELAY QUALITY IS CONSIDERED POOR
+ 0002 01 GALILEO SATELLITES USED
+ 0003 01 GLONASS SATELLITES USED
+ 0004 01 GPS SATELLITES USED
+ 0005 01 METEOROLOGICAL DATA APPLIED
+ 0006 01 ATMOSPHERIC LOADING CORRECTION APPLIED
+ 0007 01 OCEAN TIDE LOADING APPLIED
+ 0008 01 CLIMATE QUALITY DATA PROCESSING
+ 0009 01 NEAR-REAL TIME DATA PROCESSING
+033039 0009 0001 01 NON-NOMINAL QUALITY
+ 0002 01 OFFLINE PRODUCT
+ 0003 01 ASCENDING OCCULTATION FLAG
+ 0004 01 EXCESS PHASE PROCESSING NON-NOMINAL
+ 0005 01 BENDING ANGLE PROCESSING NON-NOMINAL
+ 0006 01 REFRACTIVITY PROCESSING NON-NOMINAL
+ 0007 01 METEOROLOGICAL PROCESSING NON-NOMINAL
+ 0014 01 BACKGROUND PROFILE NON-NOMINAL
+ 0015 01 BACKGROUND (I.E. NOT RETRIEVED) PROFILE PRESENT
+033041 0004 0000 01 THE FOLLOWING VALUE IS THE TRUE VALUE
+ 0001 02 THE FOLLOWING VALUE IS HIGHER THAN THE TRUE VALUE
+ (THE MEASUREMENT HIT THE LOWER LIMIT OF THE INSTRUMENT)
+ 0002 02 THE FOLLOWING VALUE IS LOWER THAN THE TRUE VALUE
+ (THE MEASUREMENT HIT THE HIGHER LIMIT OF THE INSTRUMENT)
+ 0003 01 MISSING VALUE
+033042 0005 0000 01 EXCLUSIVE LOWER LIMIT (>)
+ 0001 01 INCLUSIVE LOWER LIMIT (>=)
+ 0002 01 EXCLUSIVE UPPER LIMIT (<)
+ 0003 01 INCLUSIVE UPPER LIMIT (=<)
+ 0007 01 MISSING VALUE
+033043 0004 0001 02 SEA MDS. NADIR ONLY SST RETRIEVAL USED 3.7 MICRON
+ CHANNEL. LAND MDS RESERVED
+ 0002 02 SEA MDS. DUAL VIEW SST RETRIEVAL USED 3.7 MICRON
+ CHANNEL. LAND MDS RESERVED.
+ 0003 01 NADIR VIEW CONTAINS DAY TIME DATA
+ 0004 01 FORWARD VIEW CONTAINS DAY TIME DATA
+033044 0014 0001 01 INPUT DATA MEAN OUTSIDE NOMINAL RANGE FLAG
+ 0002 01 INPUT DATA STANDARD DEVIATION OUTSIDE NOMINAL RANGE FLAG
+ 0003 01 NUMBER OF INPUT DATA GAPS > THRESHOLD VALUE
+ 0004 01 PERCENTAGE OF MISSING LINES > THRESHOLD VALUE
+ 0005 02 DOPPLER CENTROID UNCERTAIN. CONFIDENCE MEASURE < SPECIFIC VA
+ LUE
+ 0006 02 DOPPLER AMBIGUITY ESTIMATE UNCERTAIN. CONFIDENCE MEASURE < S
+ PECIFIC VALUE
+ 0007 01 OUTPUT DATA MEAN OUTSIDE NOMINAL RANGE FLAG
+ 0008 01 OUTPUT DATA STANDARD DEVIATION OUTSIDE NOMINAL RANGE FLAG
+ 0009 01 CHIRP RECONSTRUCTION FAILED OR IS OF LOW QUALITY FLAG
+ 0010 01 DATA SET MISSING
+ 0011 01 INVALID DOWNLINK PARAMETERS
+ 0012 02 AZIMUTH CUT-OFF ITERATION COUNT. THE AZIMUTH CUT-OFF FIT DID
+ NOT CONVERGE WITHIN A MINIMUM NUMBER OF ITERATIONS
+ 0013 02 AZIMUTH CUT-OFF FIT DID NOT CONVERGE WITHIN A MINIMUM
+ NUMBER OF ITERATIONS
+ 0014 03 PHASE INFORMATION CONFIDENCE MEASURE. THE IMAGINARY SPECTRAL
+ PEAK IS LESS THAN A MINIMUM THRESHOLD, OR THE ZERO LAG SHIFT
+ IS GREATER THAN A MINIMUM THRESHOLD
+033047 0026 0001 01 ERROR DETECTED AND ATTEMPTS TO RECOVER MADE
+ 0002 01 ANOMALY IN ON-BOARD DATA HANDLING (OBDH) VALUE DETECTED
+ 0003 02 ANOMALY IN ULTRA STABLE OSCILLATOR PROCESSING (USOP) VALUE D
+ ETECTED
+ 0004 01 ERRORS DETECTED BY ON-BOARD COMPUTER
+ 0005 01 AUTOMATIC GAIN CONTROL (AGC) OUT OF RANGE
+ 0006 01 RX DELAY FAULT. RX DISTANCE OUT OF RANGE
+ 0007 01 WAVE FORM SAMPLES FAULT IDENTIFIER. ERROR
+ 0012 01 BRIGHTNESS TEMPERATURE (CHANNEL 1) OUT OF RANGE
+ 0013 01 BRIGHTNESS TEMPERATURE (CHANNEL 2) OUT OF RANGE
+ 0014 01 RESERVED
+ 0015 01 KU OCEAN RETRACKING ERROR
+ 0016 01 S OCEAN RETRACKING ERROR
+ 0017 01 KU ICE 1 RETRACKING ERROR
+ 0018 01 S ICE 1 RETRACKING ERROR
+ 0019 01 KU ICE 2 RETRACKING ERROR
+ 0020 01 S ICE 2 RETRACKING ERROR
+ 0021 01 KU SEA ICE RETRACKING ERROR
+ 0022 01 ARITHMETIC FAULT ERROR
+ 0023 01 METEO DATA STATE. NO MAP
+ 0024 01 METEO DATA STATE. 1 MAP
+ 0025 01 METEO DATA STATE 2 MAPS DEGRADED
+ 0026 01 METEO DATA STATE 2 MAPS NOMINAL
+ 0027 01 ORBIT PROPAGATOR STATUS FOR PROPAGATION MODE, SEVERAL ERRORS
+ 0028 02 ORBIT PROPAGATOR STATUS FOR PROPAGATION MODE, WARNING DETECT
+ ED
+ 0029 02 ORBIT PROPAGATOR STATUS FOR INITIALISATION MODE, SEVERAL ERR
+ ORS
+ 0030 02 ORBIT PROPAGATOR STATUS FOR INITIALISATION MODE, WARNING DET
+ ECTED
+033048 0004 0000 01 INVERSION SUCCESSFUL
+ 0001 01 INVERSION NOT SUCCESSFUL
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033049 0004 0000 01 EXTERNAL WIND DIRECTION USED DURING INVERSION
+ 0001 01 EXTERNAL WIND DIRECTION NOT USED DURING INVERSION
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033050 0008 0000 01 UNQUALIFIED
+ 0001 01 CORRECT VALUE (ALL CHECKS PASSED)
+ 0002 02 PROBABLY GOOD BUT VALUE INCONSISTENT WITH STATISTICS (DIFFER
+ FROM CLIMATOLOGY)
+ 0003 01 PROBABLY BAD (SPIKE, GRADIENT, �~E IF OTHER TESTS PASSED)
+ 0004 02 BAD VALUE, IMPOSSIBLE VALUE (OUT OF SCALE, VERTICAL
+ INSTABILITY, CONSTANT PROFILE)
+ 0005 01 VALUE MODIFIED DURING QUALITY CONTROL
+ 0008 01 INTERPOLATED VALUE
+ 0015 01 MISSING VALUE
+033052 0020 0001 01 DATA BLOCK 1 INVALID (S BAND)
+ 0002 01 DATA BLOCK 2 INVALID (S BAND)
+ 0003 01 DATA BLOCK 3 INVALID (S BAND)
+ 0004 01 DATA BLOCK 4 INVALID (S BAND)
+ 0005 01 DATA BLOCK 5 INVALID (S BAND)
+ 0006 01 DATA BLOCK 6 INVALID (S BAND)
+ 0007 01 DATA BLOCK 7 INVALID (S BAND)
+ 0008 01 DATA BLOCK 8 INVALID (S BAND)
+ 0009 01 DATA BLOCK 9 INVALID (S BAND)
+ 0010 01 DATA BLOCK 10 INVALID (S BAND)
+ 0011 01 DATA BLOCK 11 INVALID (S BAND)
+ 0012 01 DATA BLOCK 12 INVALID (S BAND)
+ 0013 01 DATA BLOCK 13 INVALID (S BAND)
+ 0014 01 DATA BLOCK 14 INVALID (S BAND)
+ 0015 01 DATA BLOCK 15 INVALID (S BAND)
+ 0016 01 DATA BLOCK 16 INVALID (S BAND)
+ 0017 01 DATA BLOCK 17 INVALID (S BAND)
+ 0018 01 DATA BLOCK 18 INVALID (S BAND)
+ 0019 01 DATA BLOCK 19 INVALID (S BAND)
+ 0020 01 DATA BLOCK 20 INVALID (S BAND)
+033053 0020 0001 01 DATA BLOCK 1 INVALID (KU BAND)
+ 0002 01 DATA BLOCK 2 INVALID (KU BAND)
+ 0003 01 DATA BLOCK 3 INVALID (KU BAND)
+ 0004 01 DATA BLOCK 4 INVALID (KU BAND)
+ 0005 01 DATA BLOCK 5 INVALID (KU BAND)
+ 0006 01 DATA BLOCK 6 INVALID (KU BAND)
+ 0007 01 DATA BLOCK 7 INVALID (KU BAND)
+ 0008 01 DATA BLOCK 8 INVALID (KU BAND)
+ 0009 01 DATA BLOCK 9 INVALID (KU BAND)
+ 0010 01 DATA BLOCK 10 INVALID (KU BAND)
+ 0011 01 DATA BLOCK 11 INVALID (KU BAND)
+ 0012 01 DATA BLOCK 12 INVALID (KU BAND)
+ 0013 01 DATA BLOCK 13 INVALID (KU BAND)
+ 0014 01 DATA BLOCK 14 INVALID (KU BAND)
+ 0015 01 DATA BLOCK 15 INVALID (KU BAND)
+ 0016 01 DATA BLOCK 16 INVALID (KU BAND)
+ 0017 01 DATA BLOCK 17 INVALID (KU BAND)
+ 0018 01 DATA BLOCK 18 INVALID (KU BAND)
+ 0019 01 DATA BLOCK 19 INVALID (KU BAND)
+ 0020 01 DATA BLOCK 20 INVALID (KU BAND)
+033060 0004 0000 01 PARAMETER=GOOD
+ 0001 01 PARAMETER=BAD
+ 0002 01 PARAMETER=RESERVED
+ 0003 01 MISSING
+033195 0004 0000 01 DEALIASING NOT USED
+ 0001 01 DEALIASING USED
+ 0002 01 RESERVED
+ 0003 01 MISSING
+033205 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033206 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033207 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033208 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033209 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033220 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 REPORT REJECTED THROUGH THE NAMELIST
+ 0017 01 MODEL SUR. TOO FAR FROM STAT. ALT.
+ 0018 01 MISSING STATION ALTITUDE
+ 0019 01 REPORT OVER SEA
+ 0020 01 REPORT OVER LAND
+ 0021 01 REDUNDANT REPORT
+ 0022 01 TIME OUT OF RANGE
+ 0023 01 VERTICAL POSITION OUT OF RANGE
+ 0024 01 HORIZONTAL POSITION OUT OF RANGE
+ 0025 01 ACTIVATED BY WHITELIST
+ 0026 01 ACTIVATED DUE TO RDB FLAG
+ 0027 01 REJECTED DUE TO RDB FLAG
+ 0028 01 BAD REPORTING PRACTICE
+ 0029 01 ALL DATA REJECTED
+ 0030 01 NO DATA IN THE REPORT
+033221 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033222 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033223 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033224 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033225 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033226 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033227 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033228 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033229 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 THINNED REPORT
+033230 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033232 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 BLACKLISTED DUE TO DISTANCE FROM REF. POINT
+ 0015 01 BLACKLISTED DUE TO MODEL OROGRAPHY
+ 0016 01 BLACKLISTED DUE TO LAND/SEA MASK
+ 0017 01 STATION ALTITUDE BLACKLISTED
+ 0018 01 LONGITUDE BLACKLISTED
+ 0019 01 LATITUDE BLACKLISTED
+ 0020 01 TIME BLACKLISTED
+ 0021 01 DATE BLACKLISTED
+ 0022 01 INSTRUMENT TYPE BLACKLISTED
+ 0023 01 CODE TYPE BLACKLISTED
+ 0024 01 STATION ID BLACKLISTED
+ 0025 01 BLACKLISTED DUE TO FIRST GUESS DEPARTURE
+ 0026 01 BLACKLISTED DUE TO OBSERVED VALUE
+ 0027 01 BLACKLISTED DUE TO TYPE OF VERTICAL COORDINATE
+ 0028 01 BLACKLISTED DUE TO PRESSURE CODE
+ 0029 01 VARIABLE NAME BLACKLISTED
+ 0030 01 MONTHLY MONITORING
+033233 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 REPORT BLACK LISTED
+ 0028 01 REPORT REJECTED
+ 0029 01 REPORT PASSIVE
+ 0030 01 REPORT ACTIVE
+033234 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 DATUM BLACK LISTED
+ 0028 01 DATUM REJECTED
+ 0029 01 DATUM PASSIVE
+ 0030 01 DATUM ACTIVE
+033236 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 DATUM REJECTED DUE TO REJECTED REPORT
+ 0006 01 COMBINED FLAGGING
+ 0007 01 DATUM REJECTED DUE TO NAMELIST
+ 0008 01 VERTICAL COORDINATE CHANGE FROM Z TO P
+ 0009 01 VERTICAL CONSISTENCY CHECK
+ 0010 01 LEVEL SELECTION
+ 0011 01 MULTI LEVEL CHECK
+ 0012 01 TOO MANY SURFACE DATA/LEVELS
+ 0013 01 DUPLICATED DATUM/LEVEL
+ 0014 01 NOT AN ANALYSIS VARIABLE
+ 0015 01 REPORT OVER SEA
+ 0016 01 REPORT OVER LAND
+ 0017 01 REDUNDANT LEVEL
+ 0018 01 REDUNDANT DATUM
+ 0019 01 TOO BIG OBSERVATION ERROR
+ 0020 01 TOO BIG DEPARTURE IN ASSIMILATION
+ 0021 01 TOO BIG FIRST GUESS DEPARTURE
+ 0022 01 REFERENCE LEVEL POSITION OUT OF RANGE
+ 0023 01 VERTICAL POSITION OUT OF RANGE
+ 0024 01 BAD REPORTING PRACTICE
+ 0025 01 ACTIVATED BY WHITELIST
+ 0026 01 ACTIVATED DUE TO RDB FLAG
+ 0027 01 REJECTED DUE TO RDB FLAG
+ 0028 01 MISSING FIRST GUESS VALUE
+ 0029 01 MISSING OBSERVED VALUE
+ 0030 01 MISSING VERTICAL COORDINATE
+033237 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033238 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033239 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033240 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033243 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033244 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033245 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 LAYER FORMED BY SUMMING UP
+ 0029 01 LAYER FORMED BY THINNING UP
+ 0030 01 NOT PREDEFINED LAYER
+033246 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033247 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033248 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033249 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 BLACKLISTED DUE TO FIRST GUESS DEPARTURE
+ 0025 01 BLACKLISTED DUE TO OBSERVED VALUE
+ 0026 01 BLACKLISTED DUE TO TYPE OF VERTICAL COORDINATE
+ 0027 01 BLACKLISTED DUE TO DISTANCE FROM REFERENCE POINT
+ 0028 01 BLACKLISTED DUE TO PRESSURE CODE
+ 0029 01 VARIABLE BLACKLISTED
+ 0030 01 PRESSURE BLACKLISTED
+033252 0010 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND PA
+ SSED
+ 0002 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND DE
+ LETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND FA
+ ILED
+ 0005 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND RE
+ -INSERTED
+ 0006 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND N
+ OT MANUALLY CHECCKED
+ 0007 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND M
+ ANUALLY CHECKED AND FAILED
+ 0008 01 MANUALLY CHECKED AND FAILED
+ 0015 01 MISSING VALUE
+033254 0019 0001 01 U DEPARTURE FROM GUESS
+ 0002 01 V DEPARTURE FROM GUESS
+ 0003 01 U & V DEPARTURE FROM GUESS
+ 0004 01 U ACCELERATION
+ 0005 01 V ACCELERATION
+ 0006 01 U & V ACCELERATION
+ 0007 01 POSSIBLE LAND FEATURE
+ 0008 01 U ACCELERATION AND POSSIBLE LAND FEATURE
+ 0009 01 V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0010 01 U & V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0011 01 BAD WIND GUESS
+ 0012 01 CORRELATION FAILURE
+ 0013 01 SEARCH BOX OFF EDGE OF AREA
+ 0014 01 TARGET BOX OFF EDGE OF AREA
+ 0015 01 PIXEL BRIGHTNESS OUT OF BOUNDS (NOISY LINE)
+ 0016 01 TARGET OUTSIDE OF LAT/LONG BOX
+ 0017 01 TARGET OUTSIDE OF PRESSURE MIN/MAX
+ 0018 01 AUTOEDITOR FLAGGED SLOW VECTOR
+ 0019 01 AUTOEDITOR FLAGGED VECTORS
+035000 0011 0011 01 000-099 INTERNATIONAL FM CODES
+ 0001 01 100-199 RA I CODES
+ 0002 01 200-299 RA II CODES
+ 0003 01 300-399 RA III CODES
+ 0004 01 400-499 RA IV CODES
+ 0005 01 500-599 RA V CODES
+ 0006 01 600-699 RA VI CODES
+ 0007 01 700-799 ANTARCTIC CODES
+ 0008 01 800-999 RESERVED
+ 0009 01 1000-1022 NOT USED
+ 1023 01 MISSING VALUE
+035001 0004 0000 01 REAL TIME
+ 0001 01 NEAR-REAL TIME
+ 0002 01 NON-REAL TIME
+ 0007 01 MISSING VALUE
+035030 0010 0000 01 NO DISCREPANCIES
+ 0001 02 NON-COMPLIANCE WITH STANDARD AND RECOMMENDED PRACTICES
+ AND PROCEDURES INCLUDINGTHOSE OF MONITORING
+ 0002 02 CATALOGUES OF METEOROLOGICAL BULLETINS NOT UPDATED IN A TIME
+ LY MANNER
+ 0003 01 INCORRECT ROUTEING DIRECTORIES
+ 0004 01 LACK OF FLEXIBILITY IN THE ROUTEING ARRANGEMENTS
+ 0005 01 DEFICIENCIES IN THE OPERATION OF GTS CENTRES AND CIRCUITS
+ 0006 01 LOSS OF DATA OR DELAYS IN RELAYING DATA ON THE GTS
+ 0007 02 ROUTEING OF DATA DIFFERENT FROM THE ROUTEING PROVIDED IN THE
+ PLAN
+ 0008 01 VARIOUS MALPRACTICES
+ 0015 01 MISSING VALUE
+035031 0020 0001 01 SUFFICIENT AND ALL OF ACCEPTABLE QUALITY
+ 0002 01 SUFFICIENT BUT PARTLY OF ACCEPTABLE QUALITY
+ 0003 01 INSUFFICIENT BUT ALL OF ACCEPTABLE QUALITY
+ 0004 01 INSUFFICIENT AND OF UNACCEPTABLE QUALITY
+ 0005 01 SOME MESSAGES NOT COMPLETE
+ 0006 02 SUSPECT OR WRONGLY CODED GROUPS COULD NOT BE INTERPRETED CON
+ FIDENTLY
+ 0007 01 GROSS CODING ERRORS
+ 0008 01 TRANSMISSION SEQUENTIAL ORDER NOT OBSERVED
+ 0009 01 REPORT COMPLETELY GARBLED AND THUS DISCARDED
+ 0010 01 DEFICIENCIES IDENTIFIED AND RECTIFIED
+ 0011 01 DEFICIENCIES IDENTIFIED BUT NOT RECTIFIED
+ 0012 01 DEFICIENCIES NOT IDENTIFIED
+ 0013 01 MEASURING ERRORS
+ 0014 01 MUTUAL INCONSISTENCY
+ 0015 01 TEMPORAL INCONSISTENCY
+ 0016 01 FORECAST ERROR
+ 0017 01 BIAS
+ 0018 01 IMPROVE SYSTEM OF QUALITY CONTROL
+ 0019 01 EXPAND TRAINING PROGRAMMES
+ 0123 01 MISSING VALUE
+035032 0010 0001 01 DATA GROUPS MISSING DUE TO RADIO FADING
+ 0002 01 DATA GROUPS MISSING DUE TO OUTAGE OF CENTRE
+ 0003 01 DATA GROUPS MISSING DUE TO OUTAGE OF CIRCUIT
+ 0004 01 NON-IMPLEMENTATION OR MAINTENANCE OF REQUIRED RBSN DENSITY
+ 0005 01 SHORTAGE OF QUALIFIED STAFF TO MAN STATIONS
+ 0006 01 LACK OF CONSUMABLES
+ 0007 01 INSTRUMENT FAILURE
+ 0008 01 NON-ADHERENCE TO TELECOMMUNICATION PROCEDURES
+ 0009 01 SOME OBSERVING PROGRAMMES CEASED
+ 0015 01 MISSING VALUE
+035033 0012 0001 01 NO DEFICIENCY
+ 0002 01 OBSERVATIONS NOT MADE REGULARLY
+ 0003 01 OBSERVATIONS NOT MADE AT RIGHT TIME
+ 0004 01 OBSERVATIONS MADE BUT NOT DISSEMINATED
+ 0005 01 OBSERVATIONS MADE AND SENT TO INCORRECT USERS
+ 0006 01 COLLECTION NOT RECEIVED
+ 0007 01 COLLECTION TRANSMITTED LATE
+ 0008 01 COLLECTION NOT TRANSMITTED
+ 0009 02 DIFFICULTIES IN HF PROPAGATION AND SELECTION OF SUITABLE FRE
+ QUENCY
+ 0010 02 DIFFICULTIES IN MAINTENANCE OF COMMUNICATION EQUIPMENT AT RE
+ MOTE STATIONS
+ 0011 02 NO ALTERNATIVE ARRANGEMENT FOR ROUTEING METEOROLOGICAL OBSER
+ VATION
+ 0123 01 MISSING VALUE
+035034 0007 0001 01 SLIGHT IMPROVEMENT
+ 0002 01 SIGNIFICANT IMPROVEMENT
+ 0003 01 MOST SIGNIFICANT IMPROVEMENT
+ 0004 01 STEADY
+ 0005 01 DECREASING
+ 0006 01 EFFORTS REQUIRED TO IMPROVE NIGHT-TIME OBSERVATIONS
+ 0007 01 MISSING VALUE
+033035 0016 0000 01 RESERVED
+ 0001 01 BALLOON BURST
+ 0002 01 BALLOON FORCED DOWN BY ICING
+ 0003 01 LEAKING OR FLOATING BALLOON
+ 0004 01 WEAK OR FADING SIGNAL
+ 0005 01 BATTERY FAILURE
+ 0006 01 GROUND EQUIPMENT FAILURE
+ 0007 01 SIGNAL INTERFERENCE
+ 0008 01 RADIOSONDE FAILURE
+ 0009 01 EXCESSIVE MISSING DATA FRAMES
+ 0010 01 RESERVED
+ 0011 01 EXCESSIVE MISSING TEMPERATURE
+ 0012 01 EXCESSIVE MISSING PRESSURE
+ 0013 01 USER TERMINATED
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+040011 0004 0001 01 MEAN SEA SURFACE (MSS) INTERPOLATION FLAG
+ 0002 02 OCEAN TIDE SOLUTION 1 INTERPOLATION FLAG (0= 4 POINTS OVER O
+ CEAN, 1=LESS THAN 4 POINTS)
+ 0003 02 OCEAN TIDE SOLUTION 2 INTERPOLATION FLAG (0= 4 POINTS OVER O
+ CEAN, 1=LESS THAN 4 POINTS)
+ 0004 02 METEOROLOGICAL DATA INTERPOLATION FLAG (0= 4 POINTS OVER OCE
+ AN, 1=LESS THAN 4 POINTS)
+040012 0003 0001 01 18.7 GHZ BRIGHTNESS TEMPERATURE
+ 0002 01 23.8 GHZ BRIGHTNESS TEMPERATURE
+ 0003 01 34 GHZ BRIGHTNESS TEMPERATURE
+040013 0005 0000 01 INTERPOLATION WITH NO GAP BETWEEN JMR DATA
+ 0001 01 INTERPOLATION WITH GAP BETWEEN JMR DATA
+ 0002 01 EXTRAOLATION OF JMR DATA
+ 0003 01 FAILURE OF EXTRAPOLATION AND INTERPOLATION
+ 0007 01 MISSING VALUE
+049194 0014 0001 01 PASSED QUALITY CONTROL
+ 0002 01 OUTSIDE TIME WINDOW
+ 0003 01 ABOVE LAND
+ 0004 01 OUTSIDE ENTIRE GRID
+ 0005 01 WAVE HEIGHT OUT OF RANGE
+ 0006 01 TOO HIGH ALONG TRACK JUMP
+ 0007 01 TOO SHORT ALONG TRACK JUMP
+ 0008 01 TOO HIGH ALONG TRACK VARIANCE
+ 0009 01 OUTSIDE CONFIDENCE LIMIT
+ 0010 01 DOUBLE OBSERVATION
+ 0011 01 PEAKINESS ABOVE THRESHOLD
+ 0012 01 RESERVED
+ 0013 01 RESERVED
+ 0014 01 RESERVED
+049193 0014 0001 01 EXELLENT (COST LESS THAN 0.1)
+ 0002 01 GOOD (COST LESS THAN 0.5)
+ 0003 01 QUESTIONABLE (COST LARGER THAN 0.5)
+ 0004 01 RESULTS UNTABLE
+ 0005 01 OBSERVED SAR SPECTRUM REJECTED
+ 0006 01 WAM FIRST GUESS REJECTED
+ 0007 01 SIMULATED SAR REJECTED
+ 0008 01 NO AZIMUTH CUT-OFF ADJUSTMENT
+ 0009 01 RESERVED
+ 0010 01 RESERVED
+ 0011 01 RESERVED
+ 0012 01 RESERVED
+ 0013 01 RESERVED
+ 0014 01 RESERVED
diff --git a/bufrtables/C0000000000098006001.TXT b/bufrtables/C0000000000098006001.TXT
new file mode 100755
index 0000000..41d78de
--- /dev/null
+++ b/bufrtables/C0000000000098006001.TXT
@@ -0,0 +1,6020 @@
+001003 0008 0000 01 ATARCTICA
+ 0001 01 REGION I
+ 0002 01 REGION II
+ 0003 01 REGION III
+ 0004 01 REGION IV
+ 0005 01 REGION V
+ 0006 01 REGION VI
+ 0007 01 MISSING VALUE
+001007 0132 0001 01 ERS 1
+ 0002 01 ERS 2
+ 0003 01 METOP-1
+ 0004 01 METOP-2
+ 0005 01 METOP-3
+ 0020 01 SPOT1
+ 0021 01 SPOT2
+ 0022 01 SPOT3
+ 0023 01 SPOT4
+ 0040 01 OERSTED
+ 0041 01 CHAMP
+ 0042 01 TERRASAR-X
+ 0050 01 METEOSAT 3
+ 0051 01 METEOSAT 4
+ 0052 01 METEOSAT 5
+ 0053 01 METEOSAT 6
+ 0054 01 METEOSAT 7
+ 0055 01 METEOSAT 8
+ 0056 01 METEOSAT 9
+ 0057 01 METEOSAT 10
+ 0058 01 METEOSAT 1
+ 0059 01 METEOSAT 2
+ 0060 01 ENVISAT
+ 0070 01 METEOSAT 11
+ 0120 01 ADEOS
+ 0121 01 ADEOS II
+ 0150 01 GMS 3
+ 0151 01 GMS 4
+ 0152 01 GMS 5
+ 0171 01 MTSAT-1R
+ 0172 01 MTSAT-2
+ 0200 01 NOAA 8
+ 0201 01 NOAA 9
+ 0202 01 NOAA 10
+ 0203 01 NOAA 11
+ 0204 01 NOAA 12
+ 0205 01 NOAA 14
+ 0206 01 NOAA 15
+ 0207 01 NOAA 16
+ 0208 01 NOAA 17
+ 0209 01 NOAA 18
+ 0220 01 LANDSAT 5
+ 0221 01 LANDSAT 4
+ 0222 01 LANDSAT 7
+ 0240 01 DMSP 7
+ 0241 01 DMSP 8
+ 0242 01 DMSP 9
+ 0243 01 DMSP 10
+ 0244 01 DMSP 11
+ 0245 01 DMSP 12
+ 0246 01 DMSP 13
+ 0247 01 DMSP 14
+ 0248 01 DMSP 15
+ 0249 01 DMSP 16
+ 0250 01 GOES 6
+ 0251 01 GOES 7
+ 0252 01 GOES 8
+ 0253 01 GOES 9
+ 0254 01 GOES 10
+ 0255 01 GOES 11
+ 0256 01 GOES 12
+ 0257 01 GOES 13
+ 0258 01 GOES 14
+ 0259 01 GOES 15
+ 0260 01 JASON-1
+ 0261 01 JASON-2
+ 0281 01 QUIKSCAT
+ 0282 01 TRMM
+ 0283 01 CORIOLIS
+ 0285 01 DMSP17
+ 0310 01 GOMS 1
+ 0311 01 GOMS 2
+ 0320 01 METEOR 2-21
+ 0321 01 METEOR 3-5
+ 0322 01 METEOR 3M-1
+ 0323 01 METEOR 3M-2
+ 0341 01 RESURS 01-4
+ 0430 01 INSAT 1B
+ 0431 01 INSAT 1C
+ 0432 01 INSAT 1D
+ 0450 01 INSAT 2A
+ 0451 01 INSAT 2B
+ 0452 01 INSAT 2E
+ 0470 01 INSAT 3A
+ 0471 01 INSAT 3D
+ 0472 01 INSAT 3E
+ 0500 01 FY-1C
+ 0501 01 FY-1D
+ 0510 01 FY-2
+ 0512 01 FY-2B
+ 0513 01 FY-2C
+ 0514 01 FY-2D
+ 0700 01 TIROS M (ITOS 1)
+ 0701 01 NOAA 1
+ 0702 01 NOAA 2
+ 0703 01 NOAA 3
+ 0704 01 NOAA 4
+ 0705 01 NOAA 5
+ 0706 01 NOAA 6
+ 0707 01 NOAA 7
+ 0708 01 TIROS-N
+ 0710 01 GOES (SMS 1)
+ 0711 01 GOES (SMS 2)
+ 0720 01 TOPEX
+ 0721 01 GFO (GEOSAT FOLLOW ON)
+ 0722 01 GRACE A
+ 0723 01 GRACE B
+ 0731 01 GOES 1
+ 0732 01 GOES 2
+ 0733 01 GOES 3
+ 0734 01 GOES 4
+ 0735 01 GOES 5
+ 0740 01 COSMIC-1
+ 0741 01 COSMIC-2
+ 0742 01 COSMIC-3
+ 0743 01 COSMIC-4
+ 0744 01 COSMIC-5
+ 0745 01 COSMIC-6
+ 0763 01 NIMBUS 3
+ 0764 01 NIMBUS 4
+ 0765 01 NIMBUS 5
+ 0766 01 NIMBUS 6
+ 0767 01 NIMBUS 7
+ 0780 01 ERBS
+ 0781 01 UARS
+ 0782 01 EARTH PROBE
+ 0783 01 TERRA
+ 0784 01 AQUA
+ 0785 01 AURA
+ 0800 01 SUNSAT
+ 0820 01 SAC-C
+ 1023 01 MISSIN VALUE
+001032 0041 0001 01 PREPROCESSING CONSISTENCY CHECK
+ 0010 01 BIAS CORRECTION
+ 0020 01 BLACK LIST
+ 0030 01 OI MASS AND WIND ANALYSIS, REPORT STATUS
+ 0031 01 OI HUMIDITY ANALYSIS, REPORT STATUS
+ 0032 01 OI ANALYSIS VARIABLES
+ 0033 01 OI ANALYSIS, FIRST GUESS Q/C
+ 0034 01 OI ANALYSIS, FINAL ANALYSIS Q/C
+ 0035 01 OI ANALYSIS, EVENT FLAGS
+ 0040 01 DYNAMIC INITIALISATION SCHEME
+ 0041 01 NORMAL MODE INITIALISATION SCHEME
+ 0050 01 SURFACE ANALYSIS, REPORT STATUS
+ 0051 01 SURFACE ANALYSIS VARIABLES
+ 0052 01 SURFACE ANALYSIS Q/C
+ 0053 01 SURFACE ANALYSIS, EVENT FLAGS
+ 0060 01 3D VAR REPORT STATUS
+ 0061 01 3D VAR ANALYSIS VARIABLES
+ 0062 01 3D VAR Q/C
+ 0063 01 3D VAR EVENT FLAGS
+ 0080 01 PRESAT FIRST GUESS
+ 0081 01 PRESAT ERROR STANDARD DEVIATIONS
+ 0082 01 PRESAT BIAS ESTIMATES
+ 0083 01 PRESAT BRIGHTNESS TEMPERATURE QUALITY FLAGS
+ 0084 01 PRESAT SAMARY FLAGS
+ 0090 01 FIRST GUESS (6 HOUR FORECAST)
+ 0091 01 FIRST GUESS (FGAT INTERPOLATED)
+ 0100 01 PRESCAT AMBIGUITY REMOVAL
+ 0110 01 WAM FIRST GUESS
+ 0111 01 WAM ANALYSIS
+ 0112 01 WAM FORECAST
+ 0113 01 WAM Q/C
+ 0201 01 COLLOCATION WITH SURFACE DATA
+ 0202 01 COLLOCATION WITH TEMP/PILOT DATA
+ 0203 01 COLLOCATION WITH AIREP DATA
+ 0204 01 COLLOCATION WITH SATOB DATA
+ 0205 01 COLLOCATION WITH TOVS DATA
+ 0206 01 COLLOCATION WITH ERS1 SCATTEROMETER DATA
+ 0207 01 COLLOCATION WITH ERS1 ALTIMETER DATA
+ 0220 01 ERS1 SCATTEROMETER COLLOCATION BLACK LIST
+ 0230 01 GAUSS ERROR
+ 0231 01 GROSS ERROR
+001031 0219 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC 50
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC 110
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC 140
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA 190
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+ 0255 01 MISSING VALUE 219
+001032 0041 0001 01 PREPROCESSING CONSISTENCY CHECK
+ 0010 01 BIAS CORRECTION
+ 0020 01 BLACK LIST
+ 0030 01 OI MASS AND WIND ANALYSIS, REPORT STATUS
+ 0031 01 OI HUMIDITY ANALYSIS, REPORT STATUS
+ 0032 01 OI ANALYSIS VARIABLES
+ 0033 01 OI ANALYSIS, FIRST GUESS Q/C
+ 0034 01 OI ANALYSIS, FINAL ANALYSIS Q/C
+ 0035 01 OI ANALYSIS, EVENT FLAGS
+ 0040 01 DYNAMIC INITIALISATION SCHEME
+ 0041 01 NORMAL MODE INITIALISATION SCHEME
+ 0050 01 SURFACE ANALYSIS, REPORT STATUS
+ 0051 01 SURFACE ANALYSIS VARIABLES
+ 0052 01 SURFACE ANALYSIS Q/C
+ 0053 01 SURFACE ANALYSIS, EVENT FLAGS
+ 0060 01 3D VAR REPORT STATUS
+ 0061 01 3D VAR ANALYSIS VARIABLES
+ 0062 01 3D VAR Q/C
+ 0063 01 3D VAR EVENT FLAGS
+ 0080 01 PRESAT FIRST GUESS
+ 0081 01 PRESAT ERROR STANDARD DEVIATIONS
+ 0082 01 PRESAT BIAS ESTIMATES
+ 0083 01 PRESAT BRIGHTNESS TEMPERATURE QUALITY FLAGS
+ 0084 01 PRESAT SAMARY FLAGS
+ 0090 01 FIRST GUESS (6 HOUR FORECAST)
+ 0091 01 FIRST GUESS (FGAT INTERPOLATED)
+ 0100 01 PRESCAT AMBIGUITY REMOVAL
+ 0110 01 WAM FIRST GUESS
+ 0111 01 WAM ANALYSIS
+ 0112 01 WAM FORECAST
+ 0113 01 WAM Q/C
+ 0201 01 COLLOCATION WITH SURFACE DATA
+ 0202 01 COLLOCATION WITH TEMP/PILOT DATA
+ 0203 01 COLLOCATION WITH AIREP DATA
+ 0204 01 COLLOCATION WITH SATOB DATA
+ 0205 01 COLLOCATION WITH TOVS DATA
+ 0206 01 COLLOCATION WITH ERS1 SCATTEROMETER DATA
+ 0207 01 COLLOCATION WITH ERS1 ALTIMETER DATA
+ 0220 01 ERS1 SCATTEROMETER COLLOCATION BLACK LIST
+ 0230 01 GAUSS ERROR
+ 0231 01 GROSS ERROR
+001033 0219 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC 50
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC 110
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC 140
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA 190
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+ 0255 01 MISSING VALUE
+001035 0219 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC 50
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC 110
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC 140
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA 190
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+ 0255 01 MISSING VALUE 219
+001090 0005 0000 01 LAF (LAGGED-AVERAGE FORECASTING)
+ 0001 01 BREEDING
+ 0002 01 SINGULAR VECTOR
+ 0003 01 MULTIPLE ANALYSIS CYCLE
+ 0255 01 MISSING VALUE
+001092 0005 0000 01 UNPERTURBED HIGH-RESOLUTION CONTROL FORECAST
+ 0001 01 UNPERTURBED LOW-RESOLUTION CONTROL FORECAST
+ 0002 01 NEGATIVELY PERTURBED FORECAST
+ 0003 01 POSITIVELY PERTURBED FORECAST
+ 0255 01 MISSING VALUE
+002001 0004 0000 01 AUTOMATIC STATION
+ 0001 01 MANNED STATION
+ 0002 01 HYBRID, BOTH MANNED AND AUTOMATIC
+ 0003 01 MISSING VALUE
+002002 0004 0000 01 MEASURED IN M S-1 UNLESS OTHERWISE INDICATED
+ 0001 01 CERTIFIED INSTRUMENTS
+ 0002 01 ORIGINALY MEASURED IN KNOTS
+ 0003 01 ORIGINALY MEASURED IN KM/H
+002003 0012 0000 01 PRESSURE INSTRUMENT ASSOCIATED WITH WIND-MEASURING EQUIPMENT
+ 0001 01 OPTICAL THEODOLITE
+ 0002 01 RADIO THEODOLITE
+ 0003 01 RADAR
+ 0004 01 VLF-OMEGA
+ 0005 01 LORAN C
+ 0006 01 WIND PROFILER
+ 0007 01 SATELLITE NAVIGATION
+ 0008 01 RADIO-ACOUSTIC SOUNDING SYSTEM (RASS)
+ 0009 01 SODAR
+ 0014 02 PRESSURE INSTRUMENT ASSOCIATED WITH WIND MEASUREMENT EQUIPME
+ NT BUT PRESSURE ELEMENT FAILED DURING ASCENT
+ 0015 01 MISSING VALUE
+002004 0011 0000 01 USA OPEN PAN EVAPORIMETER (WITHOUT COVER)
+ 0001 01 USA OPEN PAN EVAPORIMETER (MESH COVERED)
+ 0002 01 GGI-300 EVAPORIMETER (SUNKEN)
+ 0003 01 20 M**2 TANK
+ 0004 01 OTHERS
+ 0005 01 RICE
+ 0006 01 WHEAT
+ 0007 01 MAIZE
+ 0008 01 SORGHUM
+ 0009 01 OTHER CROPS
+ 0015 01 MISSING VALUE
+002011 0054 0000 01 RESERVED
+ 0001 01 RESERVED
+ 0002 01 NO RADIOSONDE-PASSIVE TARGET(E.G.REFLECTOR)
+ 0003 01 NO RADIOSONDE-ACTIVE TARGET(E.G.TRANSPONDER)
+ 0004 01 NO RADIOSONDE-PASSIVE TEMPERATURE-HUMIDITY PROFILER
+ 0005 01 NO RADIOSONDE-ACTIVE TEMPERATURE-HUMIDITY PROFILER
+ 0006 01 NO RADIOSONDE-RADIO ACOUSTIC SOUNDER
+ 0009 01 NO RADIOSONDE-SYSTEM UNKNOWN OR NOT SPECIFIED
+ 0010 01 RS VIZ TYPE A (USA)
+ 0011 01 RS VIZ TYPE B (USA)
+ 0012 01 RS SDC (SPACE DATA CORPORATION-USA)
+ 0013 01 ASTOR (NO LONGER MADE-AUSTRALIA)
+ 0014 01 VIZ MARK I MICROSONDE(USA)
+ 0015 01 EEC COMPANY TYPE 23 (USA)
+ 0016 01 ELIN (AUSTRIA)
+ 0017 01 GRAW G. (GERMANY)
+ 0019 01 GRAW M60 (GERMANY)
+ 0020 01 INDIAN MET SERVICE MK3 (INDIA)
+ 0021 01 VIZ/JIN YANG MARK I MICROSONDE(SOUTH KOREA)
+ 0022 01 MEISEI RS2-80 (JAPAN)
+ 0023 01 MESURAL FMO 1950A (FRANCE)
+ 0024 01 MESURAL FMO 19455A (FRANCE)
+ 0025 01 MESURAL MH73A (FRANCE)
+ 0026 01 METEOLABOR BASORA (SWITZERLAND)
+ 0027 01 AVK-MRZ (USSR)
+ 0028 01 METEORIT MARZ2-1 (USSR)
+ 0029 01 METEIRIT MARZ2-2 (USSR)
+ 0030 01 OKI RS2-80 (JAPAN)
+ 0031 01 VIZ/VALCOM TYPE A PRESSURE-COMMUTATED(CANADA)
+ 0032 01 SHANGAI RADIO (CHINA)
+ 0033 01 UK MET OFFICE MK3( UK)
+ 0034 01 VINOHRADY(CZECHOSLOVAKIA)
+ 0035 01 VAISALA RS18 (FINLAND)
+ 0036 01 VAISALA RS21 (FINLAND)
+ 0037 01 VAISALA RS80 (FINLAND)
+ 0038 01 VIZ LOCATE (LORAN-C)(USA)
+ 0039 01 SPRENGER E076 (GERMANY)
+ 0040 01 SPRENGER E084 (GERMANY)
+ 0041 01 SPRENGER E085 (GERMANY)
+ 0042 01 SPRENGER E086 (GERMANY)
+ 0043 01 AIR IS -4A-1680 (UK)
+ 0044 01 AIR IS -4A-1680 X (UK)
+ 0045 01 RS MSS(USA)
+ 0046 01 AIR IS -4A-403(USA)
+ 0047 01 MEISLEI RS2-91(JAPAN)
+ 0048 01 VALCOM(CANADA)
+ 0049 01 VIZ MARK II(USA)
+ 0060 01 VAISALA RS80/MICROCORA (FINLAND)
+ 0061 01 VAISALA RS80/DIGCORA OR MARWIN (FINLAND)
+ 0062 01 VAISALA RS80/PCCORA (FINLAND)
+ 0063 01 VAISALA RS80/STAR (FINLAND)
+ 0064 03 ORBITAL,SCIENCE CORPORATION,SPACE DATA DIVISION,TRANSPONDER
+ RADIOSONDE,TYPE 909-11-XX,WHERE XX CORRECPOND TO THE MODEL
+ OF THE INSTRUMENT
+ 0065 01 VIZ TRANSPONDER RADIOSONDE,MODEL NUMBER 1499-520(USA)
+ 0255 01 MISSING VALUE
+002012 0001 0000 01 TO BE DEVELOPED
+002013 0009 0000 01 NO CORRECTION
+ 0001 01 CIMO SOLAR CORRECTED AND CIMO INFRARED CORRECTED
+ 0002 01 CIMO SOLAR CORRECTED AND IFRARED CORRECTED
+ 0003 01 CIMO SOLAR CORRECTED ONLY
+ 0004 02 SOLAR AND INFRARED CORRECTED AUTOMATICALLY BY RADIOSONDE SY
+ STEM
+ 0005 01 SOLAR CORRECTED AUTOMATICALLY BY RADIOSONDE SYSTEM
+ 0006 01 SOLAR AND INFRARED CORRECTED AS SPECIFIED BY COUNTRY
+ 0007 01 SOLAR CORRECTED AS SPECIFIED BY COUNTRY
+ 0015 01 MISSING VALUE
+002014 0050 0000 01 NO WINDFINDING
+ 0001 01 AUTOMATIC WITH AUXILIARY OPTICAL DIRECTION FINDING
+ 0002 01 AUTOMATIC WITH AUXILIARY RADIO DIRECTION FINDING
+ 0003 01 AUTOMATIC WITH AUXILIARY RANGING
+ 0004 01 NOT USED
+ 0005 01 AUTOMATIC WITH MULTIPLE VLF-OMEGA SIGNALS
+ 0006 01 AUTOMATIC CROSS CHAIN LORAN-C
+ 0007 01 AUTOMATIC WITH AUXILIARY WIND PROFILER
+ 0008 01 AUTOMATIC SATELLITE NAVIGATION
+ 0019 01 TRACKING TECHNIQUE NOT SPECIFIED
+ 0020 01 VESSEL STOPPED
+ 0021 01 VESSEL DIVERTED FROM ORIGINAL DESTINATION
+ 0022 01 VESSEL'S ARRIVAL DELAYED
+ 0023 01 CONTAINER DAMAGED
+ 0024 01 POWER FAILURE TO CONTAINER
+ 0029 01 OTHER PROBLEMS
+ 0030 01 MAJOR POWER PROBLEMS
+ 0031 01 UPS INOPERATIVE
+ 0032 01 RECEIVER HARDWARE PROBLEMS
+ 0033 01 RECEIVER SOFTWARE PROBLEMS
+ 0034 01 PROCESSOR HARDWARE PROBLEMS
+ 0035 01 PROCESSOR SOFTWARE PROBLEMS
+ 0036 01 NAVAID SYSTEM DAMAGED
+ 0037 01 SHORTAGE OF LIFTING GAS
+ 0039 01 OTHER PROBLEMS
+ 0040 01 MECHANICAL DEFECT
+ 0041 01 MATERIAL DEFECT (HAND LAUNCHER)
+ 0042 01 POWER FAILURE
+ 0043 01 CONTROL FAILURE
+ 0044 01 PNEUMATIC/HYDRAULIC FAILURE
+ 0045 01 OTHER PROBLEMS
+ 0046 01 COMPRESSOR PROBLEMS
+ 0047 01 BALLOON PROBLEMS
+ 0048 01 BALLOON RELEASE PROBLEMS
+ 0049 01 LAUNCHER DAMAGED
+ 0050 01 R/S RECEIVER ANTENNA DEFECT
+ 0051 01 NAVAID ANTENNA DEFECT
+ 0052 01 R/S RECEIVER CABLING (ANTENNA DEFECT)
+ 0053 01 NAVAID ANTENNA CABLING DEFECT
+ 0059 01 OTHER PROBLEMS
+ 0060 01 ASAP COMMUNICATIONS DEFECT
+ 0061 01 COMMUNICATIONS FACILITY REJECTED DATA
+ 0062 01 NO POWER AT TRANSMITTINGANTENN
+ 0063 01 ANTENNA CABLE BROKEN
+ 0064 01 ANTENNA CABLE DEFECT
+ 0065 01 MESSAGE TRANSMITTED POWER BELOW NORMAL
+ 0069 01 OTHER PROBLEMS
+ 0070 01 ALL SYSTEMS IN NORMAL OPERATION
+ 0099 01 STATUS OF SYSTEM AND ITS COMPONENTS NOT SPECIFIED
+ 0127 01 MISSING VALUE
+002015 0006 0001 01 PRESSURE ONLY RADIOSONDE
+ 0002 01 PRESSURE ONLY RADIOSONDE PLUS TRANSPONDER
+ 0003 01 PRESSURE ONLY RADIOSONDE PLUS RADAR REFLECTOR
+ 0004 01 NO PRESSURE RADIOSONDE PLUS TRANSPONDER
+ 0005 01 NO PRESSURE RADIOSONDE PLUS RADAR REFLECTOR
+ 0015 01 MISSING VALUE
+002016 0004 0001 01 TRAIN REGULATOR
+ 0002 01 LIGHT UNIT
+ 0003 01 PARACHUTE
+ 0004 01 ROOFTOP RELEASE
+002019 0296 0010 02 BNSC RADIOMETER AATSR ADVANCED ALONG TRACK SCANNIN
+ G RADIOMETER
+ 0011 02 BNSC RADIOMETER ATSR ALONG TRACK SCANNING RADIOME
+ TER
+ 0012 02 BNSC RADIOMETER ATSR-2 ALONG TRACK SCANNING RADIOME
+ TER -2
+ 0013 01 BNSC RADIOMETER MWR MICROWAVE RADIOMETER
+ 0030 01 CNES COMMUNICATIONS ARGOS
+ 0040 01 CNES LIDAR LASER REFLECTORS
+ 0041 02 CNES LIDAR DORIS DOPPLER ORBITOGRAPHY AND RADIO-POSIT
+ IONING INTEGRATED BY SATELLITE
+ 0042 02 CNES LIDAR DORIS-NG DOPPLER ORBITOGRAPHY AND RAD
+ IO-POSITIONING INTEGRATED BY SATELLITE-NG
+ 0047 03 CNES RADAR ALTIMETERS POSEIDON-1 (SSALT-1) POSI
+ TIONING OCEAN SOLID EARTH ICE DYNAMICS ORBITING NAVIGATOR (S
+ INGLE FREQUENCY SOLID STATE RADAR ALTIMETER)
+ 0048 03 CNES RADAR ALTIMETERS POSEIDON-2 (SSALT-2) POSI
+ TIONING OCEAN SOLID EARTH ICE DYNAMICS ORBITING NAVIGATOR (D
+ UAL FREQUENCY SOLID STATE RADAR ALTIMETER)
+ 0050 01 CNES IMAGER RADIOMETER ATSR/M ATSR/M
+ 0051 01 CNES HIGH RESOLUTION OPTICAL IMAGERS HRG
+ 0052 01 CNES RADIOMETER HRV HIGH RESOLUTION VISIBLE
+ 0053 02 CNES RADIOMETER HRVIR HIGH RESOLUTION VISIBLE AND
+ INFRA-RED
+ 0054 02 CNES RADIOMETER SCARAB/MV2 SCANNER FOR EARTH'S
+ RADIATION BUDGET
+ 0055 01 CNES RADIOMETER POLDER POLDER
+ 0060 01 CNES SPECTROMETER VEGETATION VEGETATION
+ 0061 01 CNES SPECTROMETER WINDII WINDII
+ 0080 01 CSA COMMUNICATIONS RADARSAT DTT
+ 0081 01 CSA COMMUNICATIONS RADARSAT TTC
+ 0085 02 CSA RADAR SAR (CSA) SYNTHETIC APERTURE RADAR (CS
+ A)
+ 0090 02 CSA RADIOMETER MOPITT MEASUREMENTS OF POLLUTION IN
+ THE TROPOSPHERE
+ 0091 02 CSA CHEMISTRY INSTRUMENTS OSIRIS OPTICAL SPECTROGRAPH
+ AND INFRA-RED IMAGING SYSTEM
+ 0097 01 CSIRO RADIOMETER PANCHROMATIC IMAGER
+ 0098 02 CRCSS ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GPS
+ RECEIVER
+ 0102 02 DLR RADIOMETER CHAMP GPS SOUNDER GPS TURBORO
+ GUE SPACE RECEIVER (TRSR)
+ 0103 01 UNKNOWN
+ 0116 03 DLR MAGNETOMETER IGOR CHAMP GRAVITY PACKAGE (ACCELEROMETE
+ R+GPS) INTEGRATED GPS AND OCCULTATION RECEIVER STAR AC
+ CELEROMETER
+ 0117 03 DLR MAGNETOMETER CHAMP MAGNETOMETRY PACKAGE (1 SCALAR
+ +2 VECTOR MAGNETOMETER) OVERHAUSER MAGNETOMETER (OVM) AN
+ D FLUXGATE MAGNETOMETER (FGM)
+ 0120 02 ESA COMMUNICATIONS ENVISAT COMMS COMMUNICATIONS PACKA 30
+ GE ON ENVISAT
+ 0121 02 ESA COMMUNICATIONS ERS COMMS COMMUNICATION PACKAG
+ E FOR ERS
+ 0130 01 ESA LIDARS ALADIN ATMOSPHERIC LASER DOPPLER INSTRUMENT
+ 0131 01 ESA LIDARS ATLID ATMOSPHERIC LIDAR
+ 0140 02 ESA RADAR AMI/SAR/IMAGE ACTIVE MICROWAVE INSTRUMENTA
+ TION. IMAGE MODE
+ 0141 02 ESA RADAR AMI/SAR/WAVE ACTIVE MICROWAVE INSTRUMENTA
+ TION. WAVE MODE
+ 0142 02 ESA RADAR AMI/SCATTEROMETER ACTIVE MICROWAVE INS
+ TRUMENTATION. WIND MODE
+ 0143 01 ESA RADAR ASAR ASAR
+ 0144 02 ESA IMAGING MICROWAVE RADARS ASAR ADVANCED SYN
+ TETIC APERTURA RADAR (IMAGE MODE)
+ 0145 02 ESA IMAGING MICROWAVE RADARS ASAR ADVANCED SYN
+ TETIC APERTURA RADAR (WAVE MODE)
+ 0146 01 ESA CLOUD PROFILE AND RAIN RADARS CPR CLOUD RADAR
+ 0147 01 ESA RADAR RA-2/MWR RADAR ALTIMETER - 2
+ 0148 01 ESA RADAR RA/MWR RADAR ALTIMETER
+ 0150 01 ESA SCATTEROMETERS SCATTEROMETER SCATTEROMETER
+ 0161 02 ESA RADIOMETER MIPAS MICHELSON INTERFEROMETRIC PA
+ SSIVE ATMOSPHERE SOUNDER
+ 0162 02 ESA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E MWR-2 MICROWAVE RADIOMETER-2
+ 0163 03 ESA ATMOSPHERIC CHEMISTRY INSTRUMENTS SOPRANO SUB-
+ MILIMETRE OBSERVATION OF PROCESSES IN THE ABSORPTION NOTEWOR
+ THY FOR OZONE
+ 0170 02 ESA ATMOSPHERIC CHEMISTRY INSTRUMENTS GOME I GLOB
+ AL OZONE MONITORING EXPERIMENT
+ 0172 02 ESA SPECTROMETER GOMOS GLOBAL OZONE MONITORING BY O
+ CCULTATION OF STARS
+ 0174 02 ESA SPECTROMETER MERIS MEDIUM RESOLUTION IMAGING SP
+ ECTROMETER
+ 0175 02 ESA SPECTROMETER SCIAMACHY SCANNING IMAGING ABS
+ ORPTION SPECTROMETER FOR ATMOSPHERIC CARTOGRAPHY
+ 0181 02 EUMETSAT COMMUNICATIONS METEOSAT COMMS COMMUNICATIO
+ NS PACKAGE FOR METEOSAT
+ 0182 02 EUMETSAT COMMUNICATIONS MSG COMMS COMMUNICATIO
+ NS PACKAGE FOR MSG
+ 0190 02 ESA/ EUMETSAT SCATTEROMETERS ASCAT ADVANCED SCATTE
+ ROMETER
+ 0200 02 EUMETSAT RADIOMETER GERB GEOSTATIONARY EARTH
+ RADIATION BUDGET
+ 0202 02 ESA/ EUMETSAT RADIOMETER GRAS GNSS RECEIVER F
+ OR ATMOSPHERIC SOUNDING
+ 0203 02 EUMETSAT RADIOMETER MHS MICROWAVE HUMIDITY S
+ OUNDER
+ 0205 02 EUMETSAT RADIOMETER MVIRI METEOSAT VISIBLE AND
+ INFRA-RED IMAGER
+ 0207 02 EUMETSAT RADIOMETER SEVIRI SPINNING ENHANCED VI
+ SIBLE AND INFRARED IMAGER
+ 0208 02 EUMETSAT IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR)
+ VIRI VIRI
+ 0220 02 ESA/ EUMETSAT SPECTROMETER GOME-2 GLOBAL OZONE MO 60
+ NITORING EXPERIMENT - 2
+ 0221 03 CNES/ EUMETSAT ATMOSPHERIC TEMPERATURE AND HUMIDITY S
+ OUNDERS IASI INFRA-RED ATMOSPHERIC SOUNDING INTERFEROME
+ TER
+ 0240 02 CAST COMMUNICATIONS DCP DATA COLLECTION PLATFORM TRA
+ NSPONDER
+ 0245 01 CAST RADIOMETER CCD HIGH RESOLUTION CCD CAMERA
+ 0246 02 INPE ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS HSB
+ HUMIDITY SOUNDER/BRAZIL
+ 0248 02 INPE IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) OBA
+ OBSERVADOR BRASILEIRO DA AMAZONIA
+ 0250 01 CAST RADIOMETER WFI WIDE FIELD IMAGER
+ 0255 02 CAST SPECTROMETER IRMSS INFRA RED MULTI SPECTRAL SCA
+ NNER
+ 0260 01 ISRO PRECISION ORBIT BSS & FSS TRANSPONDERS
+ 0261 01 ISRO PRECISION ORBIT DRT-S&R
+ 0262 02 ISRO COMMUNICATIONS INSAT COMMS COMMUNICATIONS PACKA
+ GE FOR INSAT
+ 0268 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS HR-PAN HIGH RESOLUT
+ ION PANCHROMATIC CAMERA
+ 0269 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) MSMR MULTIFREQUENCY SCANNING MICROWAVE RADIOMETER
+ 0270 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VHRR
+ VERY HIGH RESOLUTION RADIOMETER
+ 0271 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) WIFS
+ WIDE FIELD SENSOR
+ 0275 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS AWIFS ADVANCED WID
+ E FIELD SENSOR
+ 0276 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-I LINEAR IMAGI
+ NG SELF SCANNER - I
+ 0277 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-II LINEAR IMAGI
+ NG SELF SCANNER - II
+ 0278 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-III LINE
+ AR IMAGING SELF SCANNER - III
+ 0279 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-IV LINEAR IMAGI
+ NG SELF SCANNER - IV
+ 0284 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS PAN PANCHROMATIC
+ SENSOR
+ 0285 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MOS
+ MODULAR OPTO-ELECTRONIC SCANNER
+ 0286 02 ISRO OCEAN COLOUR INSTRUMENTS OCM OCEAN COLOUR
+ MONITOR
+ 0290 02 JMA COMMUNICATIONS MTSAT COMMS COMMUNICATIONS PACKA
+ GE FOR MTSAT
+ 0294 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS IMAGER/MTSAT
+ -1R IMAGER/MTSAT
+ 0295 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS IMAGER/MTSAT
+ IMAGER/MTSAT
+ 0296 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS VISSR (GMS4)
+ VISIBLE AND INFRA-RED SPIN SCAN RADIOMETER (GMS4)
+ 0300 01 NASA LIDARS GLAS GEOSCIENCE LASER ALTIMETER SYSTEM
+ 0301 01 NASA PRECISION ORBIT LRA LASER RETROREFLECTOR ARRAY
+ 0302 01 NASA LIDARS MBLA MULTI BEAM LASER ALTIMETER
+ 0309 02 NASA CLOUD PROFILE AND RAIN RADARS CPR (CLOUDSAT) CLOU 90
+ D PROFILING RADAR
+ 0312 01 NASA RADAR NSCAT NASA SCATTEROMETER
+ 0313 01 NASA RADAR SEAWINDS ADEOS II - NASA SCATTEROMETER
+ 0330 02 NASA EARTH RADIATION BUDGET RADIOMETER ACRIM ACTI
+ VE CAVITY RADIOMETER IRRADIANCE MONITOR
+ 0334 02 NASA TOTAL AND PROFILE OZONE BUV BACKSCATTER ULTRAVIO
+ LET INSTRUMENT
+ 0336 02 NASA HIGH RESOLUTION OPTICAL IMAGERS ALI ADVANCED LAN
+ D IMAGER
+ 0347 02 NASA HIGH RESOLUTION OPTICAL IMAGERS ASTER ADVANCED SPA
+ CEBORNE THERMAL EMISSION AND REFLECTION RADIOMETER
+ 0348 02 NASA EARTH RADIATION BUDGET RADIOMETER CERES-2 CLOU
+ D AND THE EARTH'S RADIANT ENERGY SYSTEM
+ 0351 02 CONAE ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GPSD
+ R GPS DEMONSTRATION RECEIVER
+ 0353 02 NASA TOTAL AND PROFILE OZONE HIRDLS HIGH RESOLUTION DYNA
+ MICS LIMB SOUNDER
+ 0354 02 NASA TOTAL AND PROFILE OZONE HRDI HIGH RESOLUTION DOPP
+ LER IMAGER
+ 0356 01 NASA RADIOMETER LIS LIGHTNING IMAGING SENSOR
+ 0358 02 NASA MAGNETIC FIELD, AUROAL IMAGERYSCINTILLATION BOUNDARY
+ PEM PARTICLE ENVIRONMENT MONITOR
+ 0359 02 NASA OCEAN COLOUR INSTRUMENTS SEAWIFS SEA-VIEWING
+ WIDE FIELD-OF-VIEW SENSOR
+ 0360 02 NASA EARTH RADIATION BUDGET RADIOMETER SUSIM (UARS)
+ SOLAR ULTRAVIOLET IRRADIANCE MONITOR
+ 0363 02 NASA TOTAL AND PROFILE OZONE SBUV/1 SOLAR BACKSCATTER UL
+ TRAVIOLET 1 INSTRUMENT
+ 0365 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) TMI TRMM MICROWAVE IMAGER
+ 0366 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) JMR JASON-1 MICROWAVE RADIOMETER
+ 0369 02 NASA TOTAL AND PROFILE OZONE LIMS LIMB INFRARED MONITO
+ R OF THE STRATOSPHERE
+ 0370 02 NASA TOTAL AND PROFILE OZONE LRIR LIMB RADIANCE INVERS
+ ION RADIOMETER INSTRUMENT
+ 0371 02 NASA TOTAL AND PROFILE OZONE EPIC EARTH POLYCHROMATIC
+ IMAGING CAMERA
+ 0372 02 NASA EARTH RADIATION BUDGET RADIOMETER NISTAR NIST
+ ADVANCED RADIOMETER
+ 0373 02 NASA MAGNETIC FIELD, AUROAL IMAGERY SCINTILLATION BOUNDAR
+ Y PLASMA-MAG
+ 0374 01 NASA OTHER XPS XUV PHOTOMETER SYSTEM
+ 0375 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIRS
+ VISIBLE INFRA-RED SCANNER
+ 0376 03 CNES MULTIPLE DIRECTION/POLARISATION RADIOMETERS POLD
+ ER II POLARIZATION AND DIRECTIONALITY OF THE EARTH'S R
+ EFLECTANCE - II
+ 0377 02 NASA EARTH RADIATION BUDGET RADIOMETER TIM TOTA
+ L IRRADIANCE MONITOR
+ 0379 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) WFC
+ WIDE FIELD CAMERA
+ 0382 02 NASA SPECTRO-RADIOMETER CLAES CRYOGENIC LIMB ARRAY
+ ETALON SPECTROMETER
+ 0383 02 NASA SPECTRO-RADIOMETER HALOE HALOGEN OCCULTATION
+ EXPERIMENT
+ 0384 02 NASA SPECTRO-RADIOMETER ISAMS IMPROVED STRATOSPHER 120
+ IC AND MESOSPHERIC SOUNDER
+ 0385 02 NASA SPECTRO-RADIOMETER MISR MULTI-ANGLE IMAGING
+ SPECTRORADIOMETER
+ 0386 01 NASA SPECTRO-RADIOMETER MLS MICROWAVE LIMB SOUNDER
+ 0387 02 NASA SPECTRO-RADIOMETER MLS (EOS-AURA) MICROWAVE LIMB
+ SOUNDER (EOS-AURA)
+ 0389 02 NASA SPECTRO-RADIOMETER MODIS MODERATE-RESOLUTION
+ IMAGING SPECTRORADIOMETER
+ 0393 02 NASA GRAVITY HAIRS HIGH ACCURACY INTER-SATELLITE RANGIN
+ G SYSTEM
+ 0394 02 NASA TOTAL AND PROFILE OZONE OMI OZONE MEASURING INST
+ RUMENT
+ 0395 02 NASA RADIOMETER ATMOSPHERIC CORRECTOR ATMOSPHERIC
+ CORRECTOR
+ 0396 01 NASA RADIOMETER HYPERION HYPERSPECTRAL IMAGER
+ 0399 02 NASA SPECTRO-RADIOMETER SAGE I STRATOSPHERIC AEROSO
+ L AND GAS EXPERIMENT-I
+ 0400 02 NASA SPECTRO-RADIOMETER SAGE II STRATOSPHERIC AEROSO
+ L AND GAS EXPERIMENT-II
+ 0401 02 NASA SPECTRO-RADIOMETER SAGE III STRATOSPHERI
+ C AEROSOL AND GAS EXPERIMENT-III
+ 0402 02 NASA SPECTRO-RADIOMETER SAMS STRATOSPHERIC AND ME
+ SOSPHERIC SOUNDER
+ 0403 02 NASA SPECTRO-RADIOMETER SAM II STRATOSPHERIC AEROSO
+ L MEASUREMENT II
+ 0404 02 NASA SPECTRO-RADIOMETER IRIS INFRARED INTERFEROME
+ TER SPECTROMETER
+ 0405 02 NASA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GIFT
+ S GEOSYNCHRONOUS IMAGING FOURIER TRANSFORM SPECTROMETER
+ 0420 01 NASA SPECTROMETER AIRS ATMOSPHERIC INFRA-RED SOUNDER
+ 0426 02 NASA SPECTROMETER SOLSTICE SOLAR STELLAR IRRADI
+ ANCE COMPARISON EXPERIMENT
+ 0430 02 NASA SPECTROMETER TES TROPOSHPERIC EMISSION SPECTR
+ OMETER
+ 0431 02 NASA SPECTROMETER TOMS TOTAL OZONE MAPPING SPECTROM
+ ETER
+ 0450 02 JAXA COMMUNICATIONS ADEOS COMMS COMMUNICATIONS PACKA
+ GE FOR ADEOS
+ 0451 02 JAXA COMMUNICATIONS DCS (JAXA) DATA COLLECTION SYST
+ EM (JAXA)
+ 0453 02 JAXA COMMUNICATIONS GMS COMMS COMMUNICATIONS PACKA
+ GE ON GMS
+ 0454 02 JAXA COMMUNICATIONS JERS-1 COMMS COMMUNICATIONS PACKA
+ GE FOR JERS-1
+ 0460 01 JAXA LIDAR RIS RETROREFLECTOR IN SPACE
+ 0461 01 JAXA RADAR PR PRECIPITATION RADAR
+ 0462 02 JAXA IMAGING MICROWAVE RADARS SAR SYNTETIC APE
+ RTURE RADAR
+ 0470 02 JAXA IMAGING MICROWAVE RADARS PALSAR PHASED ARRAY
+ TYPE L-BAND SYNTHETIC APERTURE RADAR
+ 0479 02 JAXA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) AMSR-E ADVANCED MICROWAVE SCANNING RADIOMETER-EOS
+ 0480 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS PRISM (ALOS) PANC
+ HROMATIC REMOTE-SENSING INSTRUMENT FOR STEREO MAPPING
+ 0481 02 JAXA RADIOMETER AMSR ADVANCED MICROWAVE SCANNING 150
+ RADIOMETER
+ 0482 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS AVNIR ADVANCED VIS
+ IBLE AND NEAR INFRARED RADIOMETER
+ 0483 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS AVNIR-2 ADVANCED VIS
+ IBLE AND NEAR INFRA-RED RADIOMETER TYPE 2
+ 0484 01 JAXA IMAGER GLI GLOBAL IMAGER
+ 0485 02 JAXA RADIOMETER MESSR MULTISPECTRAL ELECTRONIC SEL
+ F SCANNING RADIOMETER
+ 0486 01 JAXA RADIOMETER MSR MICROWAVE SCANNING RADIOMETER
+ 0487 02 JAXA RADIOMETER OCTS OCEAN COLOR AND TEMPERATURE S
+ CANNER
+ 0488 01 JAXA RADIOMETER OPS OPTICAL SENSOR
+ 0489 02 JAXA SPECTRO-RADIOMETER VISSR (GMS5) VISIBLE AND
+ INFRA-RED SPIN SCAN RADIOMETER (GMS5)
+ 0490 02 JAXA RADIOMETER VTIR VISIBLE AND THERMAL INFRA-RE
+ D RADIOMETER
+ 0510 02 JAXA SPECTROMETER ILAS-I IMOROVED LIMB ATOMOSPHIRIC S
+ PECTROMETER
+ 0511 02 JAXA SPECTROMETER ILAS-II IMPROVED LIMB ATOMOSPHIRIC S
+ PECTROMETER
+ 0512 02 JAXA SPECTROMETER IMG INFEROMETRIC MONITOR OF GREE
+ NHOUSE GASES
+ 0514 02 JAXA SPACE ENVIRONMENT SEM SPACE ENVIRONMENT MO
+ NITOR (JAXA)
+ 0515 02 JAXA TOTAL AND PROFILE OZONE SOFIS SOLAR OCCULTATION FO
+ URIER TRANSFORM SPECTROMETER FOR INCLINED ORBIT SATELLITE
+ 0540 02 NOAA COMMUNICATIONS DCS (NOAA) DATA COLLECTION SYST
+ EM (NOAA)
+ 0541 02 NOAA COMMUNICATIONS GOES COMMS COMMUNICATIONS PACKA
+ GE ON GOES
+ 0542 02 NOAA COMMUNICATIONS LANDSAT COMMS COMMUNICATIONS PACKA
+ GE FOR LANDSAT
+ 0543 02 NOAA COMMUNICATIONS NOAA COMMS COMMUNICATIONS PACKA
+ GE FOR NOAA
+ 0544 01 NOAA COMMUNICATIONS S&R (GOES) SEARCH AND RESCUE
+ 0545 01 NOAA COMMUNICATIONS S&R (NOAA) SEARCH AND RESCUE
+ 0546 01 NOAA COMMUNICATIONS WEFAX WEATHER FACSIMILE
+ 0547 02 NOAA SPECTROMETER SEM(GOES) SPACE ENVIRONMENT MO
+ NITOR
+ 0550 01 NOAA MAGNETIC FIELD SSM SPECIAL SENSOR MAGNETOMETER
+ 0551 02 NOAA MAGNETIC FIELD SSJ/4 SPECIAL SENSOR PRECIPITATING
+ PLASMA MONITOR
+ 0552 02 NOAA SPACE ENVIRONMENT SSIES-2 SPECIAL SENSOR IONOS
+ PHERIC PLASMA DRIFT/SCINTILLATION METER
+ 0553 02 NOAA SPACE ENVIRONMENT SSB/X-2 SPECIAL SENSOR GAMMA
+ RAY PARTICLE DECTECTOR
+ 0570 02 NOAA RADIOMETER AMSU-A ADVANCED MICROWAVE SOUNDING
+ UNIT-A
+ 0574 02 NOAA RADIOMETER AMSU-B ADVANCED MICROWAVE SOUNDING
+ UNIT-B
+ 0580 02 NOAA RADIOMETER ATOVS (HIRS/3 + AMSU + AVHRR/3) ADVA
+ NCED TIROS OPERATIONAL VERTICAL SOUNDER
+ 0590 02 NOAA RADIOMETER AVHRR/2 ADVANCED VERY HIGH RESOLUTIO 180
+ N RADIOMETER/2
+ 0591 02 NOAA RADIOMETER AVHRR/3 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/3
+ 0592 02 NOAA RADIOMETER AVHRR/4 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/4
+ 0600 02 NOAA RADIOMETER ERBE EARTH'S RADIATION BUDGET EXP
+ ERIMENT
+ 0601 01 NOAA RADIOMETER ETM+ ENHANCED THEMATIC MAPPER
+ 0605 02 NOAA RADIOMETER HIRS/2 HIGH RESOLUTION INFRA-RED SO
+ UNDER/2
+ 0606 02 NOAA RADIOMETER HIRS/3 HIGH RESOLUTION INFRA-RED SO
+ UNDER/3
+ 0607 02 NOAA RADIOMETER HIRS/4 HIGH RESOLUTION INFRA-RED SO
+ UNDER/4
+ 0615 01 NOAA RADIOMETER IMAGER IMAGER
+ 0616 02 NOAA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIIR
+ S VISIBLE/INFRARED IMAGER RADIOMETER SUITE
+ 0620 02 NOAA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS CRIR
+ S/NP CROSS TRACK INFRA-RED SOUNDER/NPOESS
+ 0621 02 NOAA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS ATMS
+ ADVANCED TECHNOLOGY MICROWAVE SOUNDER
+ 0622 01 NOAA RADIOMETER MSS MULTISPECTRAL SCANNING SYSTEM
+ 0623 01 NOAA RADIOMETER MSU MICROWAVE SOUNDING UNIT
+ 0624 02 NOAA RADIOMETER SBUV/2 SOLAR BACKSCATTTER ULTRA-VIO
+ LET INSTRUMENT/2
+ 0625 02 NOAA RADIOMETER SBUV/3 SOLAR BACKSCATTTER ULTRA-VIO
+ LET INSTRUMENT/3
+ 0626 01 NOAA RADIOMETER SOUNDER SOUNDER
+ 0627 01 NOAA RADIOMETER SSU STRATOSPHERIC SOUNDING UNIT
+ 0628 01 NOAA RADIOMETER TM THEMATIC MAPPER
+ 0629 02 NOAA RADIOMETER TOVS (HIRS/2 + MSU + SSU) TIRO
+ S OPERATIONAL VERTICAL SOUNDER
+ 0630 01 NOAA RADIOMETER VAS VISSR ATMOSPHERIC SOUNDER
+ 0631 01 NOAA RADIOMETER SSZ
+ 0645 01 NOAA SPECTROMETER SEM SPACE ENVIRONMENT MONITOR
+ 0650 02 NRSCC RADIOMETER MVIRSR (10 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0651 02 NRSCC RADIOMETER MVIRSR (3 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0652 02 NRSCC RADIOMETER MVIRSR (5 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0670 01 NSAU RADAR RLSBO SIDE LOOKING MICROWAVE RADAR
+ 0680 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS MSU-EU MULTI-SPECTR
+ AL RADIOMETER WITH HIGH RESOLUTION
+ 0681 02 NSAU IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MSU-
+ UM VISIBLE MULTI-SPECTRAL RADIOMETER
+ 0682 01 NSAU RADIOMETER RM-08 IMAGING MICROWAVE RADIOMETER
+ 0683 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS SU-UMS STEREO RADIO 210
+ METER WITH HIGH RESOLUTION
+ 0684 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS SU-VR VISIBLE RADI
+ OMETER WITH HIGH RESOLUTION
+ 0685 01 NSAU RADIOMETER TRASSER
+ 0700 02 ROSCOSMOS COMMUNICATIONS KONDOR-2 DATA COLLECT
+ ION AND TRANSMISSION SYSTEM
+ 0701 01 ROSCOSMOS COMMUNICATIONS BRK
+ 0710 01 ROSCOSMOS LIDAR ALISSA BACKSCATTER LIDAR
+ 0712 01 ROSCOSMOS LIDAR BALKAN-2 LIDAR
+ 0715 01 ROSCOSMOS LIDAR MK-4
+ 0716 01 ROSCOSMOS LIDAR MK-4M
+ 0730 01 ROSCOSMOS RADAR GREBEN RADAR ALTIMETER
+ 0731 01 ROSCOSMOS RADAR SAR-10 SYNTETIC APERTURE RADAR
+ 0732 01 ROSCOSMOS RADAR SAR-3 SYNTETIC APERTURE RADAR
+ 0733 01 ROSCOSMOS RADAR SAR-70 SYNTETIC APERTURE RADAR
+ 0740 01 ROSCOSMOS RADAR SLR-3 SIDE LOOKING RADAR
+ 0745 01 ROSCOSMOS RADAR TRAVERS SAR
+ 0750 02 ROSCOSMOS RADIOMETER 174-K TEMPERATURE AND HUMI
+ DITY PROFILER
+ 0751 02 ROSCOSMOS RADIOMETER BTVK SCANNING TELEVISION
+ RADIOMETER
+ 0752 02 ROSCOSMOS RADIOMETER CHAIKA SCANNING IR RADIOMET
+ ER
+ 0753 02 ROSCOSMOS RADIOMETER DELTA-2 MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0755 02 ROSCOSMOS RADIOMETER IKAR-D MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0756 02 ROSCOSMOS RADIOMETER IKAR-N MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0757 02 ROSCOSMOS RADIOMETER IKAR-P MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0760 01 ROSCOSMOS RADIOMETER ISP
+ 0761 02 ROSCOSMOS RADIOMETER KFA-1000 PHOTOGRAPHIC
+ CAMERA
+ 0762 01 ROSCOSMOS RADIOMETER KFA-200 PHOTOGRAPHIC CAMERA
+ 0763 02 ROSCOSMOS RADIOMETER KFA-3000 PHOTOGRAPHIC
+ CAMERA
+ 0770 01 ROSCOSMOS RADIOMETER KLIMAT SCANNING IR RADIOMETER
+ 0771 02 ROSCOSMOS RADIOMETER KLIMAT-2 SCANNING IR
+ RADIOMETER
+ 0775 01 ROSCOSMOS RADIOMETER MIRAS
+ 0776 01 ROSCOSMOS RADIOMETER MIVZA
+ 0777 02 ROSCOSMOS RADIOMETER MIVZA-M MICROWAVE SCANNING R 240
+ ADIOMETER
+ 0780 01 ROSCOSMOS RADIOMETER MR-2000
+ 0781 01 ROSCOSMOS RADIOMETER MR-2000M
+ 0785 02 ROSCOSMOS RADIOMETER MR-900 SCANNING TELEPHOTOME
+ TER
+ 0786 02 ROSCOSMOS RADIOMETER MR-900B SCANNING VISUAL BAND
+ TELEPHOTOMETER
+ 0790 02 ROSCOSMOS RADIOMETER MSU-E MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0791 02 ROSCOSMOS RADIOMETER MSU-E1 MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0792 02 ROSCOSMOS RADIOMETER MSU-E2 MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0793 01 ROSCOSMOS RADIOMETER MSU-M
+ 0794 02 ROSCOSMOS RADIOMETER MSU-S MULTISPECTRAL MEDIUM
+ RESOLUTION SCANNER
+ 0795 02 ROSCOSMOS RADIOMETER MSU-SK MULTISPECTRAL MEDIUM
+ RESOLUTION CONICAL SCANNER
+ 0796 02 ROSCOSMOS RADIOMETER MSU-V MULTISPECTRAL HIGH R
+ ESOLUTION CONICAL SCANNER
+ 0810 02 ROSCOSMOS RADIOMETER MTZA SCANNING MICROWAVE R
+ ADIOMETER
+ 0815 03 ROSCOSMOS IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE
+ MICROWAVE) MZOAS SCANNING MICROWAVE RADIO
+ METER
+ 0820 03 ROSCOSMOS IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE
+ MICROWAVE) R-225 SINGLE CHANNEL MICROWAVE
+ RADIOMETER
+ 0821 01 ROSCOSMOS RADIOMETER R-400
+ 0822 02 ROSCOSMOS RADIOMETER R-600 SINGLE CHANNEL MICRO
+ WAVE RADIOMETER
+ 0830 02 ROSCOSMOS RADIOMETER RMS RADIATION MEASUREMEN
+ T SYSTEM
+ 0835 01 ROSCOSMOS RADIOMETER TV CAMERA
+ 0836 01 ROSCOSMOS RADIOMETER SILVA
+ 0840 02 ROSCOSMOS SPECTRO-RADIOMETER SROSMO SPECTRORADIO
+ METER FOR OCEAN MONITORING
+ 0850 02 ROSCOSMOS SPECTROMETER BUFS-2 BACKSCATTER SPECTROM
+ ETER/2
+ 0851 02 ROSCOSMOS SPECTROMETER BUFS-4 BACKSCATTER SPECTROM
+ ETER/4
+ 0855 02 ROSCOSMOS SPECTROMETER ISTOK-1 INFRA-RED SPECTROMET
+ ER
+ 0856 02 ROSCOSMOS SPECTROMETER SFM-2 SPECTROMETER TO MEAS
+ URE DIRECT SOLAR RADIATION
+ 0857 01 ROSCOSMOS SPECTROMETER DOPI
+ 0858 01 ROSCOSMOS SPECTROMETER KGI-4
+ 0859 01 ROSCOSMOS SPECTROMETER OZON-M
+ 0860 01 ROSCOSMOS SPECTROMETER RMK-2
+ 0900 02 NOAA RADIOMETER MAXIE MAGNETOSPHERIC ATMOSPHERIC X
+ -RAY IMAGING EXPERIMENT
+ 0901 01 NOAA RADIOMETER OLS OPERATIONAL LINESCAN SYSTEM 270
+ 0905 02 NOAA RADIOMETER SSM/I MISSION SENSOR MICROWAVE IMA
+ GER
+ 0906 02 NOAA RADIOMETER SSM/T-1 MISSION SENSOR MICROWAVE TEM
+ PERATURE SOUNDER
+ 0907 02 NOAA RADIOMETER SSM/T-2 MISSION SENSOR MICROWAVE WAT
+ ER VAPOR SOUNDER
+ 0908 02 NOAA RADIOMETER SSMIS SPECIAL SENSOR MICROWAVE IMA
+ GER SOUNDER
+ 0910 01 NOAA RADIOMETER SXI SOLAR X-RAY IMAGER
+ 0930 02 NOAA SPECTROMETER EHIC ENERGETIC HEAVY ION COMPOSIT
+ ION EXPERIMENT
+ 0931 01 NOAA SPECTROMETER X-RAY ASTRONOMY PAYLOAD
+ 0932 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) IVIS
+ SR (FY-2) IMPROVED MULTISPECTRAL VISIBLE AND INFRA-RED SCA
+ N RADIOMETER (5 CHANNELS)
+ 0933 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS IRAS
+ INFRARED ATMOSPHERIC SOUNDER
+ 0934 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS MWAS
+ MICROWAVE ATMOSPHERIC SOUNDER
+ 0935 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS IMWA
+ S IMPROVED MICROWAVE ATMOSPHERIC SOUNDER
+ 0936 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS MWHS
+ MICROWAVE HUMIDITY SOUNDER
+ 0937 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MVIR
+ S MODERATE RESOLUTION VISIBLE AND INFRARED IMAGING SPECTRO
+ RADIOMETER
+ 0938 02 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) MWRI MICROWAVE RADIATION IMAGER
+ 0940 02 ROSCOSMOS ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDER
+ S MTVZA-OK SCANNING MICROWAVE RADIOMETER
+ 0941 02 CNES ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS SAPH
+ IR
+ 0944 01 NOAA RADAR ALTIMETERS ALT ALTIMETER
+ 0945 02 NOAA EARTH RADIATION BUDGET RADIOMETER TSIS TOTA
+ L SOLAR IRRADIANCE SENSOR
+ 0946 02 NOAA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) CMIS CONICAL-SCANNING MICROWAVE IMAGER/SOUNDER
+ 0947 02 NOAA TOTAL AND PROFILE OZONE OMPS OZONE MAPPING AND PR
+ OFILER SUITE
+ 0948 03 NOAA SPACE ENVIRONMENT ATMOSPHERIC TEMPERATURE AND HUMIDI
+ TY SOUNDERS GPSOS GLOBAL POSITIONING SYSTEM OCCULTATION SE
+ NSOR
+ 0949 02 NOAA MAGNETIC FIELD, AUROAL IMAGERY SCINTILLATION BOUNDAR
+ Y SESS SPACE ENVIRONMENTAL SENSOR SUITE
+ 0950 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIRR
+ MULTISPECTRAL VISIBLE AND INFRA-RED SCAN RADIOMETER (10
+ CHANNELS
+ 0951 01 NRSCC TOTAL AND PROFILE OZONE TOM TOTAL OZONE MAPPER
+ 0952 01 NRSCC TOTAL AND PROFILE OZONE OP OZONE PROFILER
+ 2047 01 MISSING VALUE 296
+002020 0024 0000 01 NIMBUS
+ 0001 01 VTPR
+ 0002 01 TIROS 1 (TIROS, NOAA-6 TO NOAA-13)
+ 0003 01 TIROS 2 (NOAA-14 ONWARDS)
+ 0010 01 EOS
+ 0031 01 DMSP
+ 0061 01 EUMETSAT POLAR SYSTEM (EPS)
+ 0091 01 ERS
+ 0121 01 ADEOS
+ 0241 01 GOES
+ 0261 01 JASON
+ 0271 01 GMS
+ 0272 01 MTSAT
+ 0301 01 INSAT
+ 0331 01 METEOSAT OPERATIONAL PROGRAMME (MOP)
+ 0332 01 METEOSAT TRANSITIONAL PROGRAMME (MTP)
+ 0333 01 METEOSAT SECOND GENERATION PROGRAMME (MSG)
+ 0351 01 GOMS
+ 0380 01 FY-1
+ 0381 01 FY-2
+ 0401 01 GPS
+ 0402 01 GLONASS
+ 0403 01 GALILEO
+ 0511 01 MISSING VALUE
+002021 0008 0001 01 HIGH RESOLUTION INFRA RED SOUNDER (HIRS)
+ 0002 01 MICROWAVE SOUNDING UNIT (MSU )
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+002022 0005 0001 01 PROCESSING TECHNIQUE NOT DEFINED
+ 0002 01 AUTOMATED STATISTICAL REGRESSION
+ 0003 01 CLEAR PATH
+ 0004 01 PARTLY CLOUDY PATH
+ 0005 01 CLOUDY PATH
+002023 0008 0000 02 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE WATER VAPOUR
+ CHANNEL
+ 0001 02 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE INFRARED
+ CHANNEL
+ 0002 01 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE VISIBLE CHANNEL
+ 0003 02 WIND DERIVED FROM CLOUD MOTION OBSERVED IN WATER VAPOUR CHANNEL
+ (CLOUD OR CLEAR AIR NOT SPECIFIED)
+ 0004 02 WIND DERIVED FROM MOTION OBSERVED IN COMBINATION OF SPECTRAL
+ CHANNELS
+ 0005 02 WIND DERIVED FROM MOTION OBSERVED IN THE WATER VAPOUR CHANNEL
+ IN CLEAR AIR
+ 0006 01 WIND DERIVED FROM MOTION OBSERVED IN THE OZONE CHANNEL
+ 0007 01 WIND DERIVED FROM MOTION OBSERVED IN WATER VAPOUR CHANNEL
+ (CLOUD OR CLEAR AIR NOT SPECIFIED)
+ 0008 01 WIND DERIVED FROM ALTIMETER
+ 0009 01 WIND DERIVED FROM RADIOMETER
+ 0013 01 ROOT MEAN SQUARE
+ 0015 01 MISSING VALUE
+002024 0003 0001 01 TABLE WITH FULL RANGE OF HUMIDITY VARIATION IN LAYER
+ 0002 01 REGRESSION TECHNIQUE ON 2 HUMIDITY VALUES IN LAYER
+ 0015 01 MISSING VALUE
+002025 0016 0001 01 RESERVED
+ 0002 01 HIRS
+ 0003 01 MSU
+ 0006 01 HIRS
+ 0007 01 MSU
+ 0010 01 HIRS(1, 2, 3, 8,9, 16, 17)
+ 0011 01 HIRS(1, 2, 3, 9, 17)
+ 0012 01 MSU
+ 0015 01 HIRS
+ 0016 01 HIRS
+ 0017 01 MSU
+ 0018 01 SKINTK(OCEAN ONLY)
+ 0021 01 HIRS
+ 0022 01 SSU
+ 0023 01 MSU (3 ,4)
+ 0025 01 MISSING
+002030 0007 0001 01 ADCP (ACOUSTIC DOPPLER CURRENT PROFILER)
+ 0002 01 GEK (GEOMAGNETIC ELECTRO KINETOGRAPH)
+ 0003 01 SHIPS'S SET AND DRIFT DETERMINED BY FIXES 3-6 HOURS APART
+ 0004 02 SHIPS'S SET AND DRIFT DETERMINED BY MORE THAN 6 HOURS
+ BUT LESS THAN 12 HOURS APART
+ 0005 01 DRIFT OF BUOY
+ 0006 01 ADCP (ACOUSTIC DOPPLER CURRENT PROFILER)
+ 0007 01 MISSIN VALUE
+002031 0021 0000 01 RESERVED
+ 0001 01 INSTANTANEOUS
+ 0002 01 AVERAGED OVER 3 MINUTES OR LESS
+ 0003 01 AVERAGED OVER MORE THAN 3 MINUTES, BUT 6 AT THE MOST
+ 0004 01 AVERAGED OVER MORE THAN 6 MINUTES, BUT 12 AT THE MOST
+ 0005 01 INSTANTANEOUS
+ 0006 01 AVERAGED OVER 3 MINUTES OR LESS
+ 0007 01 AVERAGED OVER MORE THAN 3 MINUTES, BUT 6 AT THE MOST
+ 0008 01 AVERAGED OVER MORE THAN 6 MINUTES, BUT 12 AT THE MOST
+ 0009 01 VECTOR OR DOPPLER CURRENT PROFILLING METHOD NOT USED
+ 0010 01 RESERVED
+ 0011 01 1 HOUR OR LESS
+ 0012 01 MORE THAN 1 HOUR BUT 2 AT THE MOST
+ 0013 01 MORE THAN 2 HOUR BUT 4 AT THE MOST
+ 0014 01 MORE THAN 4 HOUR BUT 8 AT THE MOST
+ 0015 01 MORE THAN 8 HOUR BUT 12 AT THE MOST
+ 0016 01 MORE THAN 12 HOUR BUT 18 AT THE MOST
+ 0017 01 MORE THAN 18 HOUR BUT 24 AT THE MOST
+ 0018 01 RESERVED
+ 0019 01 DRIFT METHOD NOT USED
+ 0031 01 MISSING
+002032 0004 0000 02 VALUES AT SELECTED DEPTHS (DATA POINTS FIXED BY THE INSTRUME
+ NT OR SELECTED BY ANY OTHER METHOD)
+ 0001 02 VALUES AT SIGNIFICANT DEPTHS (DATA POINTS TAKEN FROM TRACES
+ AT SIGNIFICANT DEPTHS)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002033 0005 0000 01 NO SALINITY MEASURED
+ 0001 01 IN SITU SENSOR, ACCURACY BETTER THAN 0.02 %
+ 0002 01 IN SITU SENSOR, ACCURACY LESS THAN 0.02 %
+ 0003 01 SAMPLE ANALYSIS
+ 0007 01 MISSING VALUE
+002034 0007 0000 01 UNSPECIFIED DROGUE
+ 0001 01 HOLEY SOCK
+ 0002 01 TRISTAR
+ 0003 01 WINDOW SHADE
+ 0004 01 PARACHUTE
+ 0005 01 NON-LAGRANGIAN SEA ANCHOR
+ 0031 01 MISSING VALUE
+002036 0004 0000 01 DRIFTING BUOY
+ 0001 01 FIXED BUOY
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002037 0007 0000 01 REASERVED
+ 0001 01 MANUAL READING FROM VERTICAL TIDE STAFF
+ 0002 01 MANUAL READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ 0003 01 MANUAL READING FROM MULTIPLE AUTOMATIC RECORDERS AT STATION
+ 0004 02 AUTOMATIC READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ WITHOUT LEVEL REFERENCE CHECK
+ 0005 02 AUTOMATIC READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ WITH LEVEL REFERENCE CHECK,OR MULTIPLE AUTOMATIC RECORDERS
+ 0007 01 MISSING
+002038 0012 0000 01 SHIP INTAKE
+ 0001 01 BUCKET
+ 0002 01 HULL CONTACT SENSOR
+ 0003 01 REVERSING TERMOMETER
+ 0004 01 STD/CTD SENSOR
+ 0005 01 MECHANICAL BT
+ 0006 01 EXPANDABLE BT
+ 0007 01 DIGITAL BT
+ 0008 01 THERMISTOR CHAIN
+ 0009 01 INFRARED SCANNER
+ 0010 01 MICROWAVE SCANNER
+ 0015 01 MISSING VALUE
+002039 0005 0000 01 MEASURED WET-BULB TEMPERATURE
+ 0001 01 ICED BULB MEASURED WET-BULB TEMPERATURE
+ 0002 01 COMPUTED WET-BULB TEMPERATURE
+ 0003 01 ICED BULB COMPUTED WET-BULB TEMPERATURE
+ 0007 01 MISSING VALUE
+002041 0005 0000 01 INFORMATION BASED ON MANUAL ANALYSIS
+ 0001 01 INFORMATION BASED ON COMPUTER ANALYSIS
+ 0002 01 INFORMATION BASED ON DATA ASSIMILATION
+ 0003 02 INFORMATION BASED ON COMPUTER ANALYSIS OR DATA ASSIMSILATIO
+ N MANUALLY MODIFIED
+ 0063 01 MISSING VALUE
+002040 0008 0000 01 SHIPS MOTION REMOVED BY AVARAGING
+ 0001 01 SHIPS MOTION REMOVED BY MOTION COMPENSATION
+ 0002 01 SHIPS MOTION NOT REMOVED
+ 0003 01 SHIPS MOTION REMOVED BY AVERAGING
+ 0004 01 SHIPS MOTION REMOVED BY MOTION COMPENSATION
+ 0005 01 SHIPS MOTION NOT REMOVED
+ 0006 01 DOPPLER CURRENT PROFILING METHOD NOT USED
+ 0015 01 MISSING VALUE
+002041 0006 0000 01 INFORMATION BASED ON MANUAL ANALYSIS
+ 0001 01 INFORMATION BASED ON COMPUTER ANALYSIS
+ 0002 01 INFORMATION BASED ON DATA ASSIMILATION
+ 0003 02 INFORMATION BASED ON COMPUTER ANALYSIS OR
+ DATA ASSIMILATION MANUALLY MODIFIED
+ 0010 01 INFORMATION BASED ON THE NUMERICAL WEATHER PREDICTION
+ 0063 01 MISSING VALUE
+002044 0006 0000 01 RESERVED
+ 0001 01 LONGUET-HIGGINS (1964)
+ 0002 01 LONGUET-HIGGINS (F3 METHOS)
+ 0003 01 MAXIMUM LIKELIHOOD METHOD
+ 0004 01 MAXIMUM ENTROPY METHOD
+ 0015 01 MISSING VALUE
+002045 0005 0000 01 SEA STATION
+ 0001 01 AUTOMATIC DATA BUOY
+ 0002 01 AIRCRAFT
+ 0003 01 SATELLITE
+ 0015 01 MISSING VALUE
+
+002046 0004 0000 01 RESERVED
+ 0001 01 HEAVE SENSOR
+ 0002 01 SLOPE SENSOR
+ 0015 01 MISSING VALUE
+002048 0012 0000 01 HIRS
+ 0001 01 MSU
+ 0002 01 SSU
+ 0003 01 AMSU-A
+ 0004 01 AMSU-B
+ 0005 01 AVHRR
+ 0006 01 SSMI
+ 0007 01 NSCAT
+ 0008 01 SEA WINDS
+ 0009 01 POSEIDON ALTIMETER
+ 0010 01 JMR (JASON MICROWAVE RADIOMETER)
+ 0015 01 MISSING VALUE
+002049 0004 0001 01 PROCESSING TECHNIQUE NOT DEFINED
+ 0002 01 SIMULTANIOUS PHISICAL RETRIEVAL
+ 0003 01 CLEAR SOUNDING
+ 0004 01 CLOUDY COUNDING
+002050 0019 0001 01 CHANNEL 1 14.71 MICROMETERS
+ 0002 01 CHANNEL 2 14.37 MICROMETERS
+ 0003 01 CHANNEL 3 14.06 MICROMETERS
+ 0004 01 CHANNEL 4 13.64 MICROMETERS
+ 0005 01 CHANNEL 5 13.37 MICROMETERS
+ 0006 01 CHANNEL 6 12.66 MICROMETERS
+ 0007 01 CHANNEL 7 12.02 MICROMETERS
+ 0008 01 CHANNEL 8 11.03 MICROMETERS
+ 0009 01 CHANNEL 9 9.71 MICROMETERS
+ 0010 01 CHANNEL 10 7.43 MICROMETERS
+ 0011 01 CHANNEL 11 7.02 MICROMETERS
+ 0012 01 CHANNEL 12 6.51 MICROMETERS
+ 0013 01 CHANNEL 13 4.57 MICROMETERS
+ 0014 01 CHANNEL 14 4.52 MICROMETERS
+ 0015 01 CHANNEL 15 4.45 MICROMETERS
+ 0016 01 CHANNEL 16 4.13 MICROMETERS
+ 0017 01 CHANNEL 17 3.98 MICROMETERS
+ 0018 01 CHANNEL 18 3.74 MICROMETERS
+ 0019 01 CHANNEL 19 0.969 MICROMETERS
+002051 0004 0001 01 MAXIMUM/MINIMUM THERMOMETERS
+ 0002 01 AUTOMATED INSTRUMENT
+ 0003 01 THERMOGRAPH
+ 0015 01 MISSING VALUE
+002052 0005 0001 01 CHANNEL 1 0.55-.75 MICROMETERS
+ 0002 01 CHANNEL 2 3.9 MICROMETERS
+ 0003 01 CHANNEL 3 6.7 MICROMETERS
+ 0004 01 CHANNEL 4 10.7 MICROMETERS
+ 0005 01 CHANNEL 5 12.0 MICROMETERS
+002053 0005 0000 01 OBSERVED BRIGHTNESS TEMPERATURES
+ 0001 01 BRIGHTNESS TEMPERATURE WITH BIAS CORRECTION APPLIED
+ 0002 01 BRIGHTNESS TEMPERATURE CALCULATED FROM FIRST GUESS
+ 0003 01 BRIGHTNESS TEMPERATURE CALCULATED FROM SOUNDING
+ 0015 01 MISSING VALUE
+002054 0006 0000 01 PARAMETER DERIVED USING OBSERVED SOUNDER BRIGHTNESS TEMPERATURES
+ 0001 01 PARAMETER DERIVED USING OBSERVED IMAGER BRIGHTNESS TEMPERATURES
+ 0002 01 PARAMETER DERIVED USING FIRST GUESS INFORMATION
+ 0003 01 PARAMETER DERIVED USING NMC ANALYSIS INFORMATION
+ 0004 01 PARAMETER DERIVED USING RADIOSONDE INFORMATION
+ 0015 01 MISSING VALUE
+002055 0010 0000 01 STATISTICS GENERATED COMPARING RETRIEVAL VERSUS RADIOSONDE
+ 0001 01 STATISTICS GENERATED COMPARING RETRIEVAL VERSUS FIRST GUESS
+ 0002 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS FIRST GUESS
+ 0003 01 STATISTICS GENERATED COMPARING OBSERVED VERSUS RETRIEVAL
+ 0004 01 STATISTICS GENERATED COMPARING OBSERVED VERSUS FORST GUESS
+ 0005 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS IMAGER
+ 0006 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS SOUNDER
+ 0007 01 STATISTICS GENERATED FOR RADIOSONDE
+ 0008 01 STATISTICS GENERATED FOR FIRST GUESS
+002056 0006 0000 01 SUMS OF DIFFERENCE
+ 0001 01 SUMS OF SQUARED DIFFERENCES
+ 0002 01 SAMPLE SIZE
+ 0003 01 MINIMUM DIFFERENCE
+ 0004 01 MAXIMUM DIFFERENCE
+ 0015 01 MISSING VALUE
+002057 0007 0000 01 NESTED GRID MODEL (NMG)
+ 0001 01 AVIATION MODEL(AVN)
+ 0002 01 MEDIUM RANGE FORECAST (MRF) MODEL
+ 0003 01 GLOBAL DATA ASSIMILATION SYSTEM (GDAS) FORECAST MODEL
+ 0004 01 PRIOR SOUNDINGS (WITHIN 3 HOURS OF CURRENT TIME)
+ 0005 01 CLIMATOLOGY
+002058 0005 0000 01 12 HOUR AND 18 HOUR
+ 0001 01 18 HOUR AND 24 HOUR
+ 0002 01 6 HOUR AND 12 HOUR
+ 0003 01 GREATER THAN 24 HOUR
+ 0015 01 MISSING VALUE
+002059 0005 0000 01 NCEP NESTED GRID MODEL ANALYSIS
+ 0001 01 NCEP AVIATION MODEL ANALYSIS
+ 0002 01 NCEP MEDIUM RANGE FORECAST MODEL ANALYSIS
+ 0003 01 NCEP GLOBAL DATA ASSIMILATION SYSTEM FORECAST MODEL ANALYSIS
+ 0015 01 MISSING VALUE
+002060 0007 0000 01 CURRENT SURFACE HOURLY REPORTS
+ 0001 01 CURRENT SHIP REPORTS
+ 0002 01 CURRENT BUOY REPORTS
+ 0003 01 ONE HOUR OLD SURFACE HOURLY REPORTS
+ 0004 01 ONE HOUR SHIP OLD REPORTS
+ 0005 01 ONE HOUR BUOY OLD REPORTS
+ 0015 01 MISSING VALUE
+002061 0003 0000 01 INERTIAL NAVIGATOR SYSTEM
+ 0001 01 OMEGA
+ 0007 01 MISSING VALUE
+002062 0007 0000 01 ASDAR
+ 0001 01 ASDAR(ACARS ALSO AVAILABLE BUT NOT OPERATIVE)
+ 0002 01 ASDAR(ACARS ALSO AVAILABLE AND OPERATIVE)
+ 0003 01 ACARS
+ 0004 01 ACARS(ASDAR ALSO AVALILABLE BUT NOT OPERATIVE)
+ 0005 01 ACARS(ASDAR ALSO AVAILABLE AND OPERATIVE)
+ 0015 01 MISSING VALUE
+002064 0004 0000 01 GOOD
+ 0001 01 BAD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002066 0004 0000 01 TRS 2000
+ 0001 01 IMS 1500C
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+002070 0013 0000 01 ACTUAL LOCATION IN SECONDS
+ 0001 01 ACTUAL LOCATION IN MINUTES
+ 0002 01 ACTUAL LOCATION IN DEGREES
+ 0003 01 ACTUAL LOCATION IN DECIDEGREES
+ 0004 01 ACTUAL LOCATION OM CENTIDEGREES
+ 0005 01 REFERENCED TO CHECKPOINT IN SECONDS
+ 0006 01 REFERENCED TO CHECKPOINT IN MINUTES
+ 0007 01 REFERENCED TO CHECKPOINT IN DEGREES
+ 0008 01 REFERENCED TO CHECKPOINT IN DECIDEGREES
+ 0009 01 REFERENCED TO CHECKPOINT IN CENTIDEGREES
+ 0010 01 ACTUAL LOCATION IN TENTHS OF A MINUTE
+ 0011 01 REFERENCED TO CHECKPOINT IN TENTHS OF A MINUTE
+ 0015 01 MISSING VALUE
+002080 0005 0000 01 KAYSAM
+ 0001 01 TOTEX
+ 0002 01 KKS
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+002081 0009 0000 01 GP26
+ 0001 01 GP28
+ 0002 01 GP30
+ 0003 01 HM26
+ 0004 01 HM28
+ 0005 01 HM30
+ 0006 01 SV16
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002083 0006 0000 01 HIGH BAY
+ 0001 01 LOW BAY
+ 0002 01 BALLOON INFLATION LAUNCH SYSTEM (BILS)
+ 0003 01 ROOF-TOP BILS
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002084 0005 0000 01 HYDROGEN
+ 0001 01 HELIUM
+ 0002 01 NATURAL GAS
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002095 0005 0000 01 CAPACITANCE ANEROID
+ 0001 01 DERIVED FROM GPS
+ 0002 01 RESISTIVE STRAIN GAUGE
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002096 0005 0000 01 ROD THERMISTOR
+ 0001 01 BEAD THERMISTOR
+ 0002 01 CAPACITANCE BEAD
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002097 0008 0000 01 VIZ MARK II CARBON HYGRISTOR
+ 0001 01 VIZ B2 HYGRISTOR
+ 0002 01 VAISALA A-HUMICAP
+ 0003 01 VAISALA H-HUMICAP
+ 0004 01 CAPACITANCE SENSOR
+ 0005 01 VAISALA RS90
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002098 0005 0000 01 HH POLARISATION
+ 0001 01 VV POLARISATION
+ 0002 01 HV POLARISATION REAL VALUED COMPONENT
+ 0003 01 HV POLARISATION IMAGINARY VALUED COMPONENT
+ 0007 01 MISSING VALUE
+002101 0010 0000 01 CENTRE FRONT-FED PARABOLOID
+ 0001 01 OFFSET FRONT-FED PARABOLOID
+ 0002 01 CENTRE CASSEGRAIN PARABOLOID
+ 0003 01 OFFSET CASSEGRAIN PARABOLOID
+ 0004 01 PLANAR ARRAY
+ 0005 01 COAXIAL-COLLINEAR ARRAY
+ 0006 01 YAGI ELEMENTS ARRAY
+ 0007 01 MICROSTRIP
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002103 0002 0001 01 RADAR ANTENNA IS PROTECTED BY A RADOME
+ 0002 01 MISSING VALUE
+002104 0007 0000 01 HORIZONTAL POLARISATION
+ 0001 01 VERTICAL POLARISATION
+ 0002 01 RIGHT CIRCULAR POLARISATION
+ 0003 01 LEFT CIRCULAR POLARSZATION
+ 0004 01 HORIZONTAL AND VERTICAL POLARISATION
+ 0005 01 RIGHT AND LEFT CIRCULAR POLARISATION
+ 0015 01 MISSING VALUE
+002115 0007 0000 01 PDB
+ 0001 01 RSOIS
+ 0002 01 ASOS
+ 0003 01 PSYCHROMETER
+ 0004 01 F420
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002119 0008 0000 01 INTERMEDIATE FREQUENCY CALIBRATION MODE (IFCAL)
+ 0001 01 BUILT-IN TEST EQUIPMENT DIGITAL (BITE DGT)
+ 0002 01 BUILT-IN TEST EQUIPMENT RADIO FREQUENCY (BITE RF)
+ 0003 01 PRESET TRACKING (PSET TRK)
+ 0004 01 PRESET LOOP OUT
+ 0005 01 ACQUISITION
+ 0006 01 TRACKING
+ 0007 01 MISSING VALUE
+002131 0001 0001 01 STC OPERATIONAL
+002143 0021 0000 01 RESERVED
+ 0001 01 BREWER SPECTROPHOTOMETER
+ 0002 01 CAVER TEICHERT
+ 0003 01 DOBSON
+ 0004 01 DOBSON (JAPAN)
+ 0005 01 EHMET
+ 0006 01 FECKER TELESCOPE
+ 0007 01 HOELPER
+ 0008 01 JODMETER
+ 0009 01 FILTER OZONOMETER M-83
+ 0010 01 MAST
+ 0011 01 OXFORD
+ 0012 01 PAETZOLD
+ 0013 01 REGENER
+ 0014 01 RESERVED FOR FUTURE USE
+ 0015 01 VASSY FILTER OZONOMETER
+ 0016 01 CARBON IODIDE
+ 0017 01 SURFACE OZONE BUBLER
+ 0018 01 FILTER OZONOMETER M-124
+ 0019 01 ECC SONDE
+ 0127 01 MISSING VALUE
+002144 0008 0000 01 DIRECT SUN
+ 0001 01 DIRECT SUN, ATTENUATOR #1
+ 0002 01 DIRECT SUN, ATTENUATOR #2
+ 0003 01 FOCUSSED MOON
+ 0004 01 FOCUSSED SUN
+ 0005 01 FOCUSSED SUN CORRECTED WITH ADJACENT SKY MEASUREMENTS
+ 0006 01 ZENITH SKY
+ 0015 01 MISSING VALUE
+002216 0017 0001 01 CALIBRATION/MEASUREMENT PULSE FLAG (1)
+ 0002 01 CALIBRATION/MEASUREMENT PULSE FLAG (2)
+ 0003 01 OUTER ANTENNA BEAM
+ 0004 01 SIGMA-0 CELL IS AFT OF SPACECRAFT
+ 0005 01 CURRENT MODE (1)
+ 0006 01 CURRENT MODE (2)
+ 0007 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (1)
+ 0008 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (2)
+ 0009 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (3)
+ 0010 01 LOW RESOLUTION MODE - WHOLE PULSE DATA
+ 0011 01 SCATTEROMETER ELECTRONIC SUBSYSTEM B
+ 0012 01 ALTERNATE SPIN RATE - 19.8 RPM
+ 0013 01 RECEIVER PROTECTION ON
+ 0014 01 SLICES PER COMPOSITE FLAG(1)
+ 0015 01 SLICES PER COMPOSITE FLAG(2)
+ 0016 01 SLICES PER COMPOSITE FLAG(3)
+ 0017 01 MISSING VALUE
+002131 0002 0001 01 STC OPERATIONAL
+ 0003 01 MISSING VALUE
+002143 0021 0000 01 RESERVED
+ 0001 01 BREWER SPECTROMETER
+ 0002 01 CAVER TEICHERT
+ 0003 01 DOBSON
+ 0004 01 DOBSON (JAPAN)
+ 0005 01 EHMET
+ 0006 01 FECKER TELESCOPE
+ 0007 01 HOELPER
+ 0008 01 JODMETER
+ 0009 01 FILTER OZONOMETER M-83
+ 0010 01 MAST
+ 0011 01 OXFORD
+ 0012 01 PAETZOLD
+ 0013 01 REGENER
+ 0014 01 RESERVED
+ 0015 01 VASSY FILTER OZONOMETER
+ 0016 01 CARBON IODIDE
+ 0017 01 SURFACE OZONE BUBLLER
+ 0018 01 FILTER OZONOMETER M-124
+ 0019 01 ECC SONDE
+ 0127 01 MISSING VALUE
+002144 0008 0000 01 DIRECT SUN, ATTENUATOR #0
+ 0001 01 DIRECT SUN, ATTENUATOR #1
+ 0002 01 DIRECT SUN, ATTENUATOR #2
+ 0003 01 FOCUSSED MOON
+ 0004 01 FOCUSSED SUN
+ 0005 01 FOCUSSED SUN CORRECTED WITH ADJACENT SKY MEASUREMENTS
+ 0006 01 ZENITH SKY
+ 0015 01 MISSING VALUE
+002145 0009 0000 01 WAVELENGTH AD ORDINARY SETTING
+ 0001 01 WAVELENGTH BD ORDINARY SETTING
+ 0002 01 WAVELENGTH CD ORDINARY SETTING
+ 0003 01 WAVELENGTH CC' ORDINARY SETTING
+ 0004 01 WAVELENGTH AD FOCUSSING IMAGE
+ 0005 01 WAVELENGTH BD FOCUSSING IMAGE
+ 0006 01 WAVELENGTH CD FOCUSSING IMAGE
+ 0007 01 WAVELENGTH CC' FOCUSSING IMAGE
+ 0015 01 MISSING VALUE
+002146 0011 0000 01 ON DIRECT SUN
+ 0001 01 ON DIRECT MOON
+ 0002 01 ON BLUE ZENITH SKY
+ 0003 01 ON ZENITH CLOUD (UNIFORM STRATIFIED LAYER OF SMALL OPACITY)
+ 0004 01 ON ZENITH CLOUD (UNIFORM OR MODERATELY VARIABLE LAYER OF MEDIUM OPACITY)
+ 0005 01 ON ZENITH CLOUD (UNIFORM OR MODERATELY VARIABLE LAYER OF LARGE OPACITY)
+ 0006 01 ON ZENITH CLOUD (HIGHLY VARIABLE OPACITY, WITH OR WITOUT PRECIPITATION)
+ 0007 01 ON ZENITH CLOUD (FOG)
+ 0008 01 ON ZENITH HAZE
+ 0009 01 ON DIRECT SUN THROUGH THIN CLOUD, FOG OR HAZE
+ 0015 01 MISSING VALUE
+002148 0006 0000 01 RESERVED
+ 0001 01 ARGOS
+ 0002 01 GPS
+ 0003 01 GOES DCP
+ 0004 01 METEOSAT DCP
+ 0031 01 MISSING VALUE
+002149 0022 0000 01 UNSPECIFIED DRIFTING BUOY
+ 0001 01 STANDARD LAGRANGIAN DRIFTER (GLOBAL DRIFTER PROGRAMME)
+ 0002 01 STANDARD FGGE TYPE DRIFTING BUOY
+ 0003 01 WIND MEASURING FGGE TYPE DRIFTING BUOY
+ 0004 01 ICE FLOAT
+ 0008 01 UNSPECIFIED SUB-SURFACE FLOAT
+ 0009 01 SOFAR
+ 0010 01 ALACE
+ 0011 01 MARVOR
+ 0012 01 RAFOS
+ 0016 01 UNSPECIFIED MOORED BUOY
+ 0017 01 NOMAD
+ 0018 01 3-METRE DISCUS
+ 0019 01 10-12-METRE DISCUS
+ 0020 01 ODAS 30 SERIES
+ 0021 01 ATLAS (E.G. TAO AREA)
+ 0022 01 TRITON BUOY
+ 0023 01 RESERVED
+ 0024 01 OMNIDIRECTIONAL WAVERIDER
+ 0025 01 DIRECTIONAL WAVERIDER
+ 0026 01 SUB-SURFACE ARGO FLOAT
+ 0063 01 MISSING VALUE
+002150 0055 0000 01 RESERVED
+ 0001 01 HIRS 1
+ 0002 01 HIRS 2
+ 0003 01 HIRS 3
+ 0004 01 HIRS 4
+ 0005 01 HIRS 5
+ 0006 01 HIRS 6
+ 0007 01 HIRS 7
+ 0008 01 HIRS 8
+ 0009 01 HIRS 9
+ 0010 01 HIRS 10
+ 0011 01 HIRS 11
+ 0012 01 HIRS 12
+ 0013 01 HIRS 13
+ 0014 01 HIRS 14
+ 0015 01 HIRS 15
+ 0016 01 HIRS 16
+ 0017 01 HIRS 17
+ 0018 01 HIRS 18
+ 0019 01 HIRS 19
+ 0020 01 HIRS 20
+ 0021 01 MSU 1
+ 0022 01 MSU 2
+ 0023 01 MSU 3
+ 0024 01 MSU 4
+ 0025 01 SSU 1
+ 0026 01 SSU 2
+ 0027 01 SSU 3
+ 0028 01 AMSU-A 1
+ 0029 01 AMSU-A 2
+ 0030 01 AMSU-A 3
+ 0031 01 AMSU-A 4
+ 0032 01 AMSU-A 5
+ 0033 01 AMSU-A 6
+ 0034 01 AMSU-A 7
+ 0035 01 AMSU-A 8
+ 0036 01 AMSU-A 9
+ 0037 01 AMSU-A 10
+ 0038 01 AMSU-A 11
+ 0039 01 AMSU-A 12
+ 0040 01 AMSU-A 13
+ 0041 01 AMSU-A 14
+ 0042 01 AMSU-A 15
+ 0043 01 AMSU-B 1
+ 0044 01 AMSU-B 2
+ 0045 01 AMSU-B 3
+ 0046 01 AMSU-B 4
+ 0047 01 AMSU-B 5
+ 0048 01 AVHRR 1
+ 0049 01 AVHRR 2
+ 0050 01 AVHRR 3A
+ 0051 01 AVHRR 3B
+ 0052 01 AVHRR 4
+ 0053 01 AVHRR 5
+ 0063 01 MISSING VALUE
+002151 0009 0000 01 HIRS
+ 0001 01 MSU
+ 0002 01 SSU
+ 0003 01 AMSU-A1-1
+ 0004 01 AMSU-A1-2
+ 0005 01 AMSU-A2
+ 0006 01 AMSU-B
+ 0007 01 AVHRR
+ 2047 01 MISSING VALUE
+002152 0011 0001 01 HIGH-RESOLUTION INFRARED SOUNDER(HIRS)
+ 0002 01 MICROWAVE SOUNDING UNIT (MSU)
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+ 0009 01 GEOSTATIONARY IMAGER
+ 0010 01 GEOSTATIONARY SOUNDER
+ 0011 01 GEOSTATIONARY EARTH RADIATION (GERB)
+002158 0008 0001 01 MISMATCH IN RED VEC HPA
+ 0002 01 MISMATCH IN RED VEC RFSS
+ 0003 01 PTR CALIBRATION BAND 320 MHZ (KU)
+ 0004 01 PTR CALIBRATION BAND 80 MHZ (KU)
+ 0005 01 PTR CALIBRATION BAND 20 MHZ (KU)
+ 0006 01 PTR CALIBRATION BAND 160 MHZ (S)
+ 0007 01 KU FLIGHT CALIBRATION PARAMETERS AVAILABLE
+ 0008 01 S FLIGHT CALIBRATION PARAMETERS AVAILABLE
+002159 0005 0001 01 TEMPERATURE INCONSISTENCY
+ 0002 01 DATA IS MISSING
+ 0003 01 REDUNDANCY CHANNEL
+ 0004 01 POWER BUS PROTECTION
+ 0005 01 OVERVOLTAGE/OVERLOAD PROTECTION
+002163 0015 0000 01 AUTO EDITOR
+ 0001 01 IRW HEIGHT ASSIGNMENT
+ 0002 01 WV HEIGHT ASSIGNMENT
+ 0003 01 H2O INTERCEPT HEIGHT ASSIGNMENT
+ 0004 01 CO2 SLICING HEIGHT ASSIGNMENT
+ 0005 01 LOW PIXEL MAX GRADIENT
+ 0006 01 HIGHER PIXEL MAX GRADIENT
+ 0007 01 PRIMARY HEIGHT ASSIGNMENT
+ 0008 01 LAYER THICKNESS ASSIGNMENT
+ 0009 01 CUMULATIVE CONTRIBUTION FUNCTION -10 PERCENT HEIGHT
+ 0010 01 CUMULATIVE CONTRIBUTION FUNCTION -50 PERCENT HEIGHT
+ 0011 01 CUMULATIVE CONTRIBUTION FUNCTION -90 PERCENT HEIGHT
+ 0012 02 CUMULATIVE CONTRIBUTION FUNCTION - HEIGHT OF
+ MAXIMUM GRADIENT
+ 0014 01 COMPOSITE HEIGHT ASSIGNMENT
+ 0015 01 MISSING VALUE
+002164 0004 0000 01 LP - NORMS LEAST SQUARE MINIMUM
+ 0001 01 EN - EUCLIDEAN NORM WITH RADIANCE CORRELATION
+ 0002 01 CC - CROSS CORRELATION
+ 0007 01 MISSING VALUE
+002166 0006 0000 01 TYPE NOT DEFINED
+ 0001 01 AUTOMATED STATISTICAL REGRESSION
+ 0002 01 CLEAR PATH
+ 0003 01 PARTLY CLOUDY PATH
+ 0004 01 CLOUDY PATH
+ 008035 0000 0000 01 GLOBAL
+ 0001 01 REGIONAL
+ 0002 01 NATIONAL
+ 0003 01 SPECIAL
+ 0004 01 BILATERAL
+ 0005 01 RESERVED
+ 0006 01 RESERVED
+ 0007 01 MISSING0015 01 MISSING VALUE
+002167 0004 0000 01 METHOD NOT DEFINE
+ 0001 01 1B RAW RADIANCE
+ 0002 01 PROCESSED RADIANCE
+ 0015 01 MISSING VALUE
+002169 0004 0000 01 CUP ROTOR
+ 0001 01 PROPELLER ROTOR
+ 0002 01 WIND OBSERVATION THROUGH AMBIENT NOISE (WOTAN)
+ 0015 01 MISSING VALUE
+002172 0003 0001 01 RETRIEVAL FROM A NADIR SOUNDING
+ 0002 01 RETRIEVAL FROM A LIMB SOUNDING
+ 0255 01 MISSING VALUE
+002175 0009 0000 01 MANUAL MEASUREMENT
+ 0001 01 TIPPING BUCKET METHOD
+ 0002 01 WEIGHING METHOD
+ 0003 01 OPTICAL METHOD
+ 0004 01 PRESSURE METHOD
+ 0005 01 FLOAT METHOD
+ 0006 01 DROP COUNTER METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002176 0006 0000 01 MANUAL OBSERVATION
+ 0001 01 VIDEO CAMERA METHOD
+ 0002 01 INFRA-RED METHOD
+ 0003 01 LASER METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002177 0005 0000 01 MANUAL OBSERVATION
+ 0001 01 ULTRASONIC METHOD
+ 0002 01 VIDEO CAMERA METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002178 0005 0000 01 MANUAL OBSERVATION
+ 0001 01 OPTICAL METHOD
+ 0002 01 CAPACITIVE METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002179 0006 0000 01 MANUAL OBSERVATION
+ 0001 01 VAISALA ALGORITHM
+ 0002 01 ASOS (FAA) ALGORITHM
+ 0003 01 AWOS (CANADA) ALGORITHM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002180 0008 0000 01 MANUAL OBSERVATION
+ 0001 02 OPTICAL SCATTER SYSTEM COMBINED WITH PRECIPITATION
+ OCCURRENCE SENSING SYSTEM
+ 0002 01 FORWARD AND/OR BACK-SCATTER SYSTEM OF VISIBLE LIGHT
+ 0003 01 FORWARD AND/OR BACK-SCATTER SYSTEM OF INFRARED LIGHT
+ 0004 01 INFRARED LIGHT EMITTING DIODE (IRED) SYSTEM
+ 0005 01 DOPPLER RADAR SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002181 0005 0001 01 RAIN DETECTOR
+ 0002 01 FREEZING RAIN SENSOR
+ 0003 01 ICE DETECTION SENSOR
+ 0004 01 HAIL AND ICE PELLET SENSOR
+ 0020 01 OTHER
+002182 0007 0000 01 MANUAL MEASUREMENT
+ 0001 01 TRANSMISSOMETER SYSTEM (BASE > 25)
+ 0002 01 TRANSMISSOMETER SYSTEM (BASE < 25 M)
+ 0003 01 FORWARD SCATTER SYSTEM
+ 0004 01 BACK SCATTER SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002183 0009 0000 01 MANUAL OBSERVATION
+ 0001 01 CEILOMETER SYSTEM
+ 0002 01 INFRARED CAMERA SYSTEM
+ 0003 01 MICROWAVE VISUAL CAMERA SYSTEM
+ 0004 01 SKY IMAGER SYSTEM
+ 0005 01 VIDEO TIME LAPSED CAMERA SYSTEM
+ 0006 01 MICRO PULSE LIDAR (MPL) SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002184 0008 0000 01 MANUAL OBSERVATION
+ 0001 01 LIGHTNING IMAGING SENSOR
+ 0002 01 ELECTRICAL STORM IDENTIFICATION SENSOR
+ 0003 01 MAGNETIC FINDER SENSOR
+ 0004 01 LIGHTNING STRIKE SENSOR
+ 0005 01 FLASH COUNTER
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002185 0007 0000 01 MANUAL MEASUREMENT
+ 0001 01 BALANCED FLOATING METHOD
+ 0002 01 PRESSURE METHOD
+ 0003 01 ULTRASONIC METHOD
+ 0004 01 HYDRAULIC METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002186 0023 0001 01 PRECIPITATION-UNKNOWN TYPE
+ 0002 01 LIQUID PRECIPITATION NOT FREEZING
+ 0003 01 LIQUID FREEZING PRECIPITATION
+ 0004 01 DRIZZLE
+ 0005 01 RAIN
+ 0006 01 SOLID PRECIPITATION
+ 0007 01 SNOW
+ 0008 01 SNOW GRAINS
+ 0009 01 SNOW PELLETS
+ 0010 01 ICE PELLETS
+ 0011 01 ICE CRYSTALS
+ 0012 01 DIAMOND DUST
+ 0013 01 SMALL HAIL
+ 0014 01 HAIL
+ 0015 01 GLAZE
+ 0016 01 RIME
+ 0017 01 SOFT RIME
+ 0018 01 HARD RIME
+ 0019 01 CLEAR ICE
+ 0020 01 WET SNOW
+ 0021 01 HOAR FROST
+ 0022 01 DEW
+ 0023 01 WHITE DEW
+002187 0011 0001 01 DUST/SAND WHIRL
+ 0002 01 SQUALLS
+ 0003 01 SAND STORM
+ 0004 01 DUST STORM
+ 0005 01 LIGHTNING - CLOUD TO SURFACE
+ 0006 01 LIGHTNING - CLOUD TO CLOUD
+ 0007 01 LIGHTNING - DISTANT
+ 0008 01 THUNDERSTORM
+ 0009 01 FUNNEL CLOUD NOT TOUCHING SURFACE
+ 0010 01 FUNNEL CLOUD TOUCHING SURFACE
+ 0011 01 SPRAY
+002188 0010 0001 01 FOG
+ 0002 01 ICE FOG
+ 0003 01 STEAM FOG
+ 0007 01 MIST
+ 0008 01 HAZE
+ 0009 01 SMOKE
+ 0010 01 VOLCANIC ASH
+ 0011 01 DUST
+ 0012 01 SAND
+ 0013 01 SNOW
+002189 0004 0001 01 MANUAL OBSERVATION
+ 0002 01 ALL LIGHTNING STRIKES WITHOUT DISCRIMINATION
+ 0003 01 LIGHTNING STRIKES CLOUD TO GROUND ONLY
+ 0004 02 ALL LIGHTNING STRIKES WITH DISCRIMINATION BETWEEN
+ CLOUD TO GROUND AND CLOUD TO CLOUD
+002194 0002 0000 01 FGGE
+ 0015 01 MISSING VALUE
+002196 0017 0000 01 NIMBUS
+ 0001 01 VTPR
+ 0002 01 TIROS 1 ( TIROS NOAA 6 TO NOAA 13)
+ 0003 01 TIROS 2 ( NOAA-14 ONWARD)
+ 0031 01 DMSP
+ 0061 01 EUMETSAT POLAR SYSTEM (EPS)
+ 0091 01 ERS
+ 0121 01 ADEOS
+ 0241 01 GOES
+ 0271 01 GMS
+ 0301 01 INSAT
+ 0331 01 METEOSAT OPERATIONAL PROGRAMME(MOP)
+ 0332 01 METEOSAT TRANSITIONAL PROGRAMME(MTP)
+ 0333 01 METEOSAT SECOND GENERATION PROGRAMME(MSG)
+ 0351 01 GOMS
+ 0381 01 FY-2
+ 0512 01 MISSING VALUE
+002199 0004 0000 01 RESERVED
+ 0001 01 TABLE WITH FULL RANGE OF HUMMIDITY VALUES IN LAYER
+ 0002 01 REGRESSION TECHNIQUE ON 2 HUMMIDITY VALUES IN LAYER
+ 0015 01 MISSING VALUE
+002231 0015 0000 01 RESERVED
+ 0001 01 IRW HEIGHT ASSIGNMENT
+ 0002 01 WV HEIGHT ASSIGNMENT
+ 0003 01 H2O INTERCEPT HEIGHT ASSIGNMENT
+ 0004 01 CO2 SLICING HEIGHT ASSIGNMENT
+ 0005 01 LOW PIXEL MAX GRADIENT
+ 0006 01 HIGHER PIXEL MAX GRADIENT
+ 0007 01 PRIMARY HEIGHT ASSIGNMENT
+ 0008 01 LAYER THICKNESS ASSIGNMENT
+ 0009 01 CUMULATIVE CONTRIBUTION FUNCTION -10 PERCENT HEIGHT
+ 0010 01 CUMULATIVE CONTRIBUTION FUNCTION -50 PERCENT HEIGHT
+ 0011 01 CUMULATIVE CONTRIBUTION FUNCTION -90 PERCENT HEIGHT
+ 0012 02 CUMULATIVE CONTRIBUTION FUNCTION - HEIGHT OF
+ MAXIMUM GRADIENT
+ 0014 01 COMPOSITE HEIGHT ASSIGNMENT
+ 0015 01 MISSING VALUE
+002232 0004 0000 01 P - NORMS LEAST SQUARE MINIMUM
+ 0001 01 EN - EUCLIDEAN NORM WITH RADIANCE CORRELATION
+ 0002 01 CC - CROSS CORRELATION
+ 0003 01 MISSING VALUE
+002251 0004 0000 01 METHOD NOT DEFINED
+ 0001 01 1B RAW RADIANCE
+ 0002 01 PROCESSED RADIANCE
+ 0015 01 MISSING VALUE
+002252 0012 0001 01 HIGH-RESOLUTION INFRARED SOUNDER(HIRS)
+ 0002 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+ 0009 01 GEOSTATIONARY IMAGER
+ 0010 01 GEOSTATIONARY SOUNDER
+ 0011 01 GEOSTATIONARY EARTH RADIATION (GERB)
+ 0031 01 ALL BITS SET - MISSING VALUE
+002254 0006 0000 01 TYPE NOT DEFINED
+ 0001 01 AUTOMATED STATISTICAL REGRESSION
+ 0002 01 CLEAR PATH
+ 0003 01 PARTLY CLOUDY PATH
+ 0004 01 CLOUDY PATH
+ 0015 01 MISSING VALUE
+004059 0005 0001 01 00 UTC
+ 0002 01 06 UTC
+ 0003 01 12 UTC
+ 0004 01 18 UTC
+ 0005 01 OTHER HOURS
+008001 0007 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 MAXIMUM WIND LEVEL
+ 0005 01 SIGNIFICANT LEVEL, TEMPERATURE AND/OR RELATIVE HUMIDITY
+ 0006 01 SIGNIFICANT LEVEL, WIND
+ 0007 01 MISSING VALUE
+008002 0013 0000 02 OBSERVING RULES FOR BASE OF LOWEST CLOUD AND CLOUD TYPES OF
+ FM 12-IX EXT. SYNOP AND FM 13-IX EXT. SHIP APPLY
+ 0001 01 FIRST NON - CB SIGNIFICANT LAYER
+ 0002 01 SECOND NON - CB SIGNIFICANT LAYER
+ 0003 01 THIRD NON - CB SIGNIFICANT LAYER
+ 0004 01 CUMULONIMBUS LAYER
+ 0005 01 CEILING
+ 0006 01 CLOUD NOT DETECTED BELOW THE FOLLOWING HEIGHT(S)
+ 0007 01 LOW CLOUD
+ 0008 01 MIDDLE CLOUD
+ 0009 01 HIGH CLOUD
+ 0010 02 CLOUD LAYER WITH BASE BELOW THE STATION LEVEL AND TOP
+ ABOVE THE STATION LEVEL
+ 0011 01 CLOUD LAYER WITH BASE AND TOP BELOW THE STATION LEVEL
+ 0063 01 MISSING VALUE
+008003 0009 0000 01 SURFACE
+ 0001 01 BASE OF SATELLITE SOUNDING
+ 0002 01 CLOUD TOP
+ 0003 01 TROPOPAUSE
+ 0004 01 PRECIPITABLE WATER
+ 0005 01 SOUNDING RADIANCES
+ 0006 01 MEAN TEMPERATURES
+ 0007 01 OZON
+ 0063 01 MISSING VALUE
+008004 0006 0002 01 UNSTEADY (UNS)
+ 0003 01 LEVEL FLIGHT, ROUTINE OBSERVATION (LVR)
+ 0004 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED (LVW)
+ 0005 01 ASCENDING (ASC)
+ 0006 01 DESCENDING(DES)
+ 0007 01 MISSING VALUE
+008005 0005 0000 01 RESERVED
+ 0001 01 STORM CENTRE
+ 0002 01 OUTER LIMIT OR EDGE OF STORM
+ 0003 01 LOCATION OF MAXIMUM WIND
+ 0004 01 LOCATION OF STORM IN THE PERTURBED ANALYSIS
+ 0005 01 LOCATION OF STORM IN THE ANALYSIS
+ 0015 01 MISSING VALUE
+008006 0008 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 PROMINENT MAXIMUM LEVEL
+ 0005 01 PROMINENT MINIMUM LEVEL
+ 0006 01 MINIMUM PRESSURE LEVEL
+ 0007 01 RESERVED
+ 0008 01 LEVEL OF UNDETERMINED SIGNIFICANCE
+008007 0005 0000 01 POINT
+ 0001 01 LINE
+ 0002 01 AREA
+ 0003 01 VOLUME
+ 0015 01 MISSING VALUE
+008008 0008 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 LEVEL OF BETA RADIATION MAXIMUM
+ 0005 01 LEVEL OF GAMMA RADIATION MAXIMUM
+ 0006 01 MINIMUM PRESSURE LEVEL
+ 0007 01 RESERVED
+ 0008 01 LEVEL OF UNDETERMINED SIGNIFICANCE
+008009 0016 0000 01 LEVEL FLIGHT, ROUTINE OBSERVATION, UNSTEADY
+ 0001 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED, UNSTEADY
+ 0002 01 UNSTEADY (UNS)
+ 0003 01 LEVEL FLIGHT, ROUTINE OBSERVATION (LVR)
+ 0004 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED (LVW)
+ 0005 01 ASCENDING (ASC)
+ 0006 01 DESCENDING (DES)
+ 0007 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS
+ 0008 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS, UNSTEADY
+ 0009 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS
+ 0010 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS, UNSTEADY
+ 0011 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS
+ 0012 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS, UNSTEADY
+ 0013 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS
+ 0014 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS, UNSTEADY
+ 0015 01 MISSING VALUE
+008010 0013 0000 01 RESERVED
+ 0001 01 BARE SOIL
+ 0002 01 BARE ROCK
+ 0003 01 LAND GRASS COVER
+ 0004 01 WATER (LAKE, SEA)
+ 0005 01 FLOOD WATER UNDERNEATH
+ 0006 01 SNOW
+ 0007 01 ICE
+ 0008 01 RUNWAY OR ROAD
+ 0009 01 SHIP OR PLATFORM DECK IN STEEL
+ 0010 01 SHIP OR PLATFORM DECK IN WOOD
+ 0011 01 SHIP OR PLATFORM DECK PARTLY COVERED WITH RUBBER MAT
+ 0031 01 MISSING VALUE
+008011 0026 0000 01 QUASI-STATIONARY FRONT AT THE SURFACE
+ 0001 01 QUASI-STATIONARY FRONT ABOVE THE SURFACE
+ 0002 01 WARM FRONT AT THE SURFACE
+ 0003 01 WARM FRONT ABOVE THE SURFACE
+ 0004 01 COLD FRONT AT THE SURFACE
+ 0005 01 COLD FRONT ABOVE THE SURFACE
+ 0006 01 OCCLUSION
+ 0007 01 INSTABILITY LINE
+ 0008 01 INTERTROPICAL FRONT
+ 0009 01 CONVERGENCE LINE
+ 0010 01 JET STREAM
+ 0011 01 CLOUD CLEAR
+ 0012 01 CLOUD
+ 0013 01 TURBULENCE
+ 0014 01 STORM
+ 0015 01 AIRFRAME ICING
+ 0016 01 PHENOMENON
+ 0017 01 VOLCANO
+ 0018 01 ATMOSPHERICS
+ 0020 01 SPECIAL CLOUDS
+ 0021 01 THUNDERSTORM (VAL)
+ 0022 01 TROPICAL CYCLONE (VAL)
+ 0023 01 MOUNTAIN WAVE (VAL)
+ 0024 01 DUSTSTORM (VAL)
+ 0025 01 SANDSTORM (VAL)
+ 0063 01 MISSING VALUE
+008012 0004 0000 01 LAND
+ 0001 01 SEA
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008013 0004 0000 01 NIGHT
+ 0001 01 DAY
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008014 0010 0000 01 10-MINUTE MEAN VALUE - NORMAL VALUE
+ 0001 01 10-MINUTE MEAN VALUE - ABOVE THE UPPER LIMIT FOR ASSESSMENT OF RVR (P)
+ 0002 01 10-MINUTE MEAN VALUE - BELOW LOWER LIMIT FOR ASSESSMENT OF RVR (M)
+ 0003 01 ONE MINUTE MINIMUM VALUE - NORMAL VALUE
+ 0004 01 ONE MINUTE MINIMUM VALUE - ABOVE THE UPPER LIMIT FOR ASSESSMENT OF RVR (P)
+ 0005 01 ONE MINUTE MINIMUM VALUE - BELOW LOWER LIMIT FOR ASSESSMENT OF RVR (M)
+ 0006 01 ONE MINUTE MAXIMUM VALUE - NORMAL VALUE
+ 0007 01 ONE MINUTE MAXIMUM VALUE - ABOVE THE UPPER LIMIT FOR ASSESSMENT OF RVR (P)
+ 0008 01 ONE MINUTE MAXIMUM VALUE - BELOW LOWER LIMIT FOR ASSESSMENT OF RVR (M)
+ 0015 01 MISSING VALUE
+008016 0005 0000 01 NOSIG
+ 0001 01 BECMG
+ 0002 01 TEMPO
+ 0003 01 FM
+ 0007 01 MISSING VALUE
+008017 0004 0000 01 FM
+ 0001 01 TL
+ 0002 01 AT
+ 0003 01 MISSING VALUE
+008018 0005 0001 01 LAND IS PRESENT
+ 0002 01 SURFACE ICE MAP INDICATES ICE IS PRESENT
+ 0011 01 ICE MAP DATA NOT AVAILABLE
+ 0012 01 ATTENUATION MAP DATA NOT AVAILABLE
+ 0017 01 MISSING VALUE
+008021 0028 0000 01 RESERVED
+ 0001 01 TIME SERIES
+ 0002 01 TIME AVERAGED
+ 0003 01 ACCUMULATED
+ 0004 01 FORECAST
+ 0005 01 FORECAST TIME SERIES
+ 0006 01 FORECAST TIME AVERAGED
+ 0007 01 FORECAST ACCUMULATED
+ 0008 01 ENSEMBLE MEAN
+ 0009 01 ENSEMBLE MEAN TIME SERIES
+ 0010 01 ENSEMBLE MEAN TIME AVERAGED
+ 0011 01 ENSEMBLE MEAN ACCUMULATED
+ 0012 01 ENSEMBLE MEAN FORECAST
+ 0013 01 ENSEMBLE MEAN FORECAST TIME SERIES
+ 0014 01 ENSEMBLE MEAN FORECAST AVERAGED
+ 0015 01 ENSEMBLE MEAN FORECAST ACCUMULATED
+ 0016 01 ANALYSIS
+ 0017 01 START OF PHENOMENON
+ 0018 01 RADIOSONDE LAUNCH TIME
+ 0019 01 START OF ORBIT
+ 0020 01 END OF ORBIT
+ 0021 01 TIME OF ASCENDING NODE
+ 0022 01 TIME OF OCCURENCE OF WIND SHIFT
+ 0027 01 FIRST GUESS --NOT WMO ENTRY
+ 0028 01 START OF SCAN --NOT WMO ENTRY
+ 0029 01 END OF SCAN --NOT WMO ENTRY
+ 0031 01 MISSING VALUE
+008023 0010 0002 01 MAXIMUM VALUE
+ 0003 01 MINIMUM VALUE
+ 0004 01 MEAN VALUE
+ 0005 01 MEDIAN VALUE
+ 0006 01 MODAL VALUE
+ 0007 01 MEAN ABSOLUTE ERROR
+ 0009 01 BEST ESTIMATE OF STANDARD DEVIATION (N-1)
+ 0010 01 STANDARD DEVIATION
+ 0011 01 HARMONIC MEAN
+ 0012 01 ROOT MEAN SQUARE VECTOR ERROR
+ 0013 01 ROOT-MEAN-SQUARE
+ 0032 01 PROBABILITY OF GROSS ERROR
+ 0033 01 PRESCRIBED OBSERVATION ERROR
+ 0034 01 PERSISTENCE OBSERVATION ERROR
+ 0035 01 FINAL OBSERVATION ERROR
+ 0036 01 REPRESENTATIVNESS OBSERVATION ERROR
+ 0063 01 MISSING
+008024 0012 0002 01 OBSERVED MINUS MAXIMUM
+ 0003 01 OBSERVED MINUS MINIMUM
+ 0004 01 OBSERVED MINUS MEAN
+ 0005 01 OBSERVED MINUS MEDIAN
+ 0006 01 OBSERVED MINUS MODE
+ 0011 01 OBSERVED MINUS CLIMATOLOGY (ANOMALY)
+ 0012 01 OBSERVED MINUS ANALYZED VALUE
+ 0013 01 OBSERVED MINUS INITIALISED ANALYZED VALUE
+ 0014 01 OBSERVED MINUS FORECAST VALUE
+ 0021 01 OBSERVED MINUS INTERPOLATED VALUE
+ 0022 01 OBSERVED MINUS HYDROSTATICALLY CALCULATED VALUE
+ 0032 01 OBSERVED MINUS FIRST GUESS
+ 0033 01 OBSERVED MINUS ANALYSIS
+ 0034 01 OBSERVED MINUS INITIALIZED ANALYSIS
+ 0063 01 MISSING
+008025 0005 0000 02 UNIVERSAL TIME COORDINATED (UTC) MINUS
+ LOCAL STANDARD TIME (LST)
+ 0001 01 LOCAL STANDARD TIME
+ 0002 01 UNIVERSAL TIME COORDINATED (UTC) MINUS SATELLITE CLOCK
+ 0005 01 TIME DIFFERENCE FROM EDGE OF PROCESSING SEGMENT
+ 0015 01 MISSING
+008026 0005 0000 01 AVERAGING KERNEL MATRIX
+ 0001 01 CORRELATION MATRIX
+ 0002 01 LOWER TRIANGULAR CORRELATION MATRIX SQUARE ROOT (L FROM C=LLT)
+ 0003 01 INVERSE LOWER TRIANGULAR CORRELATION MATRIX SQUARE ROOT (L**-1)
+ 0063 01 MISSING VALUE
+008027 0007 0000 01 ASSUME NO PARTICULAR MATRIX GEOMETRY
+ 0001 01 DIAGONAL MATRIX
+ 0002 01 TRIDIAGONAL MATRIX
+ 0003 01 MULTI-DIAGONAL MATRIX (GENERAL CASE: DIAGONAL AND ABOVE)
+ 0004 01 LOWER TRIANGULAR MATRIX
+ 0005 01 SYMETRICAL MATRIX
+ 0063 01 MISSING VALUE
+008029 0005 0000 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0001 01 ENCLOSED SEA OR LAKE
+ 0002 01 CONTINENTAL ICE
+ 0003 01 LAND
+ 0255 01 MISSING
+008033 0004 0000 01 RESERVED
+ 0001 01 PERCENTAGE CONFIDENCE CALCULATED USING CLOUD FRACTION
+ 0002 01 PERCENTAGE CONFIDENCE CALCULATED USING STANDARD
+ DEVIATION OF TEMPERATURE
+ 0003 02 PERCENTAGE CONFIDENCE CALCULATED USING PROBABILITY OF
+ THE CLOUD CONTAMINATION
+ 0004 01 PERCENTAGE CONFIDENCE CALCULATED USING NORMALITY OF DISTRIBUTION
+ 0127 01 MISSING
+008035 0008 0000 01 GLOBAL
+ 0001 01 REGIONAL
+ 0002 01 NATIONAL
+ 0003 01 SPECIAL
+ 0004 01 BILATERAL
+ 0005 01 RESERVED
+ 0006 01 RESERVED
+ 0007 01 MISSING
+008036 0008 0000 01 WMO SECRETARIAT
+ 0001 01 WMO
+ 0002 01 RSMC
+ 0003 01 NMC
+ 0004 01 RTH
+ 0005 01 OBSERVING SITE
+ 0006 01 OTHER
+ 0007 01 MISSING
+008039 0008 0000 01 ISSUE TIME OF FORECAST
+ 0001 01 TIME OF COMMNENCEMENT OF PERIOD OF THE FORECAST
+ 0002 01 TIME OF ENDING OF PERIOD OF THE FORECAST
+ 0003 01 FORECSAT TIME OF MAXIMUM TEMPERATURE
+ 0004 01 FORECSAT TIME OF MINIMUM TEMPERATURE
+ 0005 01 TIME OF BEGINNING OF THE FORECAST
+ 0006 01 TIME OF ENDING OF THE FORECAST
+ 0063 01 MISSING VALUE
+008040 0044 0000 01 HIGH RESOLUTION DATA SAMPLE
+ 0001 01 WITHIN 20 HPA OF SURFACE
+ 0002 02 PRESSURE LESS THAN 10 HPA (I.E., 9, 8, 7, ETC.)
+ WHEN NO OTHER REASON APPLIES
+ 0003 01 BASE PRESSURE LEVEL FOR STABILITY INDEX
+ 0004 01 BEGIN DOUBTFUL TEMPERATURE, HEIGHT DATA
+ 0005 01 BEGIN MISSING DATA (ALL ELEMENTS)
+ 0006 01 BEGIN MISSING RH DATA
+ 0007 01 BEGIN MISSING TEMPERATURE DATA
+ 0008 02 HIGHEST LEVEL REACHED BEFORE BALLOON
+ DESCENT BECAUSE OF ICING OR TURBULENCE
+ 0009 01 END DOUBTFUL TEMPERATURE, HEIGHT DATA
+ 0010 01 END MISSING DATA (ALL ELEMENTS)
+ 0011 01 END MISSING RH DATA
+ 0012 01 END MISSING TEMPERATURE DATA
+ 0013 01 ZERO DEGREES C CROSSING(S) FOR RADAT
+ 0014 01 STANDARD PRESSURE LEVEL
+ 0015 01 OPERATOR ADDED LEVEL
+ 0016 01 OPERATOR DELETED LEVEL
+ 0017 01 BALLOON RE-ASCENDED BEYOND PREVIOUS HIGHEST ASCENT LEVEL
+ 0018 01 SIGNIFICANT RH LEVEL
+ 0019 01 RH LEVEL SELECTION TERMINATED
+ 0020 01 SURFACE LEVEL
+ 0021 01 SIGNIFICANT TEMPERATURE LEVEL
+ 0022 01 MANDATORY TEMPERATURE LEVEL
+ 0023 01 FLIGHT TERMINATION LEVEL
+ 0024 01 TROPOPAUSE(S)
+ 0025 01 AIRCRAFT REPORT
+ 0026 01 INTERPOLATED (GENERATED) LEVEL
+ 0027 01 MANDATORY WIND LEVEL
+ 0028 01 SIGNIFICANT WIND LEVEL
+ 0029 01 MAXIMUM WIND LEVEL
+ 0030 01 INCREMENTAL WIND LEVEL (FIXED REGIONAL)
+ 0031 01 INCREMENTAL HEIGHT LEVEL (GENERATED)
+ 0032 01 WIND TERMINATION LEVEL
+ 0033 01 PRESSURE 100 TO 110 HPA, WHEN NO OTHER REASON APPLIES
+ 0040 01 SIGNIFICANT THERMODYNAMIC LEVEL (INVERSION)
+ 0041 01 SIGNIFICANT RH LEVEL ( PER NCDC CRITERIA)
+ 0042 01 SIGNIFICANT TEMPERATURE LEVEL (PER NCDC)
+ 0043 01 BEGIN MISSING WIND DATA
+ 0044 01 END MISSING WIND DATA
+ 0060 01 LEVEL OF 80-KNOT ISOTACH ABOVE JET
+ 0061 01 LEVEL OF 80-KNOT ISOTACH BELOW JET
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+008041 0009 0000 01 PARENT SITE
+ 0001 01 OBSERVATION SITE
+ 0002 01 BALLOON MANUFACTURE DATE
+ 0003 01 BALLOON LAUNCH POINT
+ 0004 01 SURFACE OBSERVATION
+ 0005 01 SURFACE OBSERVATION DISPLACEMENT FROM LAUNCH POINT
+ 0006 01 FLIGHT LEVEL OBSERVATION
+ 0007 01 FLIGHT LEVEL TERMINATION POINT
+ 0031 01 MISSING VALUE
+008042 0014 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 MAXIMUM WIND LEVEL
+ 0005 01 SIGNIFICANT TEMPERATURE LEVEL
+ 0006 01 SIGNIFICANT HUMIDITY LEVEL
+ 0007 01 SIGNIFICANT WIND LEVEL
+ 0008 01 BEGINNING OF MISSING TEMPERATURE DATA
+ 0009 01 END OF MISSING TEMPERATURE DATA
+ 0010 01 BEGINNING OF MISSING HUMIDITY DATA
+ 0011 01 END OF MISSING HUMIDITY DATA
+ 0012 01 BEGINNING OF MISSING WIND DATA
+ 0013 01 END OF MISSING WIND DATA
+ 0018 01 ALL 18 MISSING
+008043 0000 01 OZONE, O3,10028-15-6
+ 0001 01 WATER VAPOUR, H2O, 7732-18-5
+ 0002 01 METHANE, CH4, 74-82-8
+ 0003 01 CARBON DIOXIDE, CO2, 37210-16-5
+ 0004 01 CARBON MONOXIDE, CO, 630-08-0
+ 0005 01 NITROGEN DIOXIDE, NO2, 10102-44-0
+ 0006 01 NITROUS OXIDE, N2O, 10024-97-2
+ 0007 01 FORMALDEHYDE, HCHO, 50-00-0
+ 0008 01 SULFUR DIOXIDE, SO2, 7446-09-5
+ 0009 01 BROMINE OXIDE, BRO, 15656-19-6
+ 0010 01 CHLORINE DIOXIDE, OCLO, 10049-04-4
+ 0011 01 NITROGEN MONOXIDE, NO, 10102-43-9
+ 0012 01 AMMONIA, NH3, 7664-41-7
+ 0025 01 PARTICULATE MATTER < 1.0 MICRONS
+ 0026 01 PARTICULATE MATTER < 2.5 MICRONS
+ 0027 01 PARTICULATE MATTER < 10 MICRONS
+ 0028 01 AEROSOLS GENERIC
+ 0029 01 SMOKE GENERIC
+ 0030 01 CRUSTAL MATERIAL (GENERIC DUST)
+ 0031 01 VOLCANIC ASH
+ 0255 01 MISSING
+008050 0011 0000 01 RESERVED
+ 0001 01 PRESSURE
+ 0002 01 TEMPERATURE
+ 0003 01 EXTREME TEMPERATURE
+ 0004 01 VAPOUR PRESSURE
+ 0005 01 PRECIPITATION
+ 0006 01 SUNSHINE DURATION
+ 0007 01 MAXIMUM TEMPERATURE
+ 0008 01 MINIMUM TEMPERATURE
+ 0009 01 WIND
+ 0015 01 MISSING VALUE
+008051 0007 0001 01 PRESSURE
+ 0002 01 TEMPERATURE
+ 0003 01 EXTREME TEMPERATURE
+ 0004 01 VAPOUR PRESSURE
+ 0005 01 PRECIPITATION
+ 0006 01 SUNSHINE DURATION
+ 0007 01 MISSING VALUE
+008052 0026 0000 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 10 M/S
+ 0001 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 20 M/S
+ 0002 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 30 M/S
+ 0003 01 MAXIMUM TEMPERATURE LESS THAN 273.2 K
+ 0004 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 298.2 K
+ 0005 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 303.2 K
+ 0006 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 308.2 K
+ 0007 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 313.2 K
+ 0008 01 MINIMUM TEMPERATURE LESS THAN 273.2 K
+ 0009 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 273.2 K
+ 0010 01 PRECIPITATION EQUAL TO OR MORE THAN 1.0 KG/M**2
+ 0011 01 PRECIPITATION EQUAL TO OR MORE THAN 5.0 KG/M**2
+ 0012 01 PRECIPITATION EQUAL TO OR MORE THAN 10.0 KG/M**2
+ 0013 01 PRECIPITATION EQUAL TO OR MORE THAN 50.0 KG/M**2
+ 0014 01 PRECIPITATION EQUAL TO OR MORE THAN 100.0 KG/M**2
+ 0015 01 PRECIPITATION EQUAL TO OR MORE THAN 150.0 KG/M**2
+ 0016 01 SNOW DEPTH MORE THAN 0.0 M
+ 0017 01 SNOW DEPTH MORE THAN 0.01 M
+ 0018 01 SNOW DEPTH MORE THAN 0.10 M
+ 0019 01 SNOW DEPTH MORE THAN 0.50 M
+ 0020 01 HORIZONTAL VISIBILITY LESS THAN 50 M
+ 0021 01 HORIZONTAL VISIBILITY LESS THAN 100 M
+ 0022 01 HORIZONTAL VISIBILITY LESS THAN 1000 M
+ 0023 01 HAIL
+ 0024 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+008053 0004 0000 01 VALUE OCCURED ON ONLY ONE DAY IN THE MONTH
+ 0001 01 VALUE OCCURED ON MORE THAN ONE DAY IN THE MONTH
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008054 0003 0000 01 WIND SPEED OR GUST IS AS REPORTED
+ 0001 01 WIND SPEED IS GREATER THAN THAT REPRTED (P IN METAR/TAF/SPECI)
+ 0007 01 MISSING VALUE
+008060 0008 0000 01 RESERVED
+ 0001 01 RANGE
+ 0002 01 AZIMUTH
+ 0003 01 HORIZONTAL
+ 0004 01 VERTICAL
+ 0005 01 NORTH/SOUTH
+ 0006 01 EAST/WEST
+ 0015 01 MISSING VALUE
+008065 0004 0000 01 NO SUN-GLINT
+ 0001 01 SUN-GLINT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008066 0004 0000 01 OPAQUE
+ 0001 01 SEMI-TRANSPARENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008070 0006 0000 01 RESERVED
+ 0001 01 RESERVED
+ 0002 02 EARTH LOCATED INSTRUMENT COUNTS,
+ CALIBRATION COEFFICIENTS AND HOUSEKEEPING (LEVEL 1B)
+ 0003 01 EARTH LOCATED CALIBRATED RADIANCES (LEVEL 1C)
+ 0004 02 MAPPED TO A COMMON FOOTPRINT, EARTH LOCATED
+ CALIBRATED RADIANCES (LEVEL 1D)
+ 0015 01 MISSING VALUE
+008072 0004 0000 01 MIXED
+ 0001 01 CLEAR
+ 0002 01 CLOUDY
+ 0007 01 MISSING VALUE
+008074 0004 0000 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0001 01 NON-OCEAN LIKE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008075 0004 0000 01 ASCENDING ORBIT
+ 0001 01 DESCENDING ORBIT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008076 0003 0000 01 KU
+ 0001 01 C
+ 0063 01 MISSING VALUE
+008077 0007 0000 01 LAND
+ 0001 01 SEA
+ 0002 01 COASTAL
+ 0003 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0004 01 ENCLOSED SEA OR LAKE
+ 0005 01 CONTINENTAL ICE
+ 0127 01 MISSING VALUE
+008079 0009 0000 01 NORMAL ISSUE
+ 0001 01 CORRECTION TO A PREVIOUSLY ISSUED PRODUCT (COR)
+ 0002 01 AMANDMENT TO A PREVIOUSLY ISSUED PRODUCT *AMD)
+ 0003 01 CORRECTION TO A PREVIOUSLY ISSUED AMENDED PRODUCT (COR AMD)
+ 0004 01 CANCELLATION OD A PREVIOUSLY ISSUED PRODUCT (CNL)
+ 0005 01 NO PRODUCT AVAILABLE (NIL)
+ 0006 01 SPECIAL REPORT ( SPECI)
+ 0007 01 CORRECTED SPECIAL REPORT (SPECI COR)
+ 0015 01 MISSING VALUE
+008080 0009 0000 01 TOTAL WATER PRESSURE PROFILE
+ 0001 01 TOTAL WATER TEMPERATURE PROFILE
+ 0002 01 TOTAL WATER SALINITY PROFILE
+ 0003 01 TOTAL WATER CONDUCTIVITY PROFILE
+ 0010 01 WATER PRESSURE AT A LEVEL
+ 0011 01 WATER TEMPERATURE AT A LEVEL
+ 0012 01 SALINITY AT A LEVEL
+ 0020 01 POSITION
+ 0063 01 MISSING VALUE
+008081 0005 0000 01 SENSOR
+ 0001 01 TRANSMITTER
+ 0002 01 RECEIVER
+ 0003 01 OBSERVING PLATFORM
+ 0063 01 MISSING VALUE
+008082 0003 0000 01 SENSOR HEIGHT IS NOT MODIFIED
+ 0001 01 SENSOR HEIGHT IS MODIFIED TO STANDARD LEVEL
+ 0007 01 MISSING VALUE
+008083 0009 0001 02 ADJUSTED WITH RESPECT TO REPRESENTATIVE HEIGHT OF SENSOR ABOVE
+ LOCAL GROUND (OR DECK OF MARINE PLATFORM)
+ 0002 02 ADJUSTED WITH RESPECT TO REPRESENTATIVE HEIGHT OF SENSOR ABOVE
+ WATER SURFACE
+ 0003 01 ADJUSTED WITH RESPECT TO STANDARD SURFACE ROUGHNESS
+ 0004 01 ADJUSTED WITH RESPECT TO WIND SPEED
+ 0005 01 ADJUSTED WITH RESPECT TO TEMPERATURE
+ 0006 01 ADJUSTED WITH RESPECT TO PRESSURE
+ 0007 01 ADJUSTED WITH RESPECT TO HUMIDITY
+ 0008 01 ADJUSTED WITH RESPECT TO EVAPORATION
+ 0009 01 ADJUSTED WITH RESPECT TO WETTING LOSSES
+008085 0004 0000 01 FORE BEAM
+ 0001 01 MID BEAM
+ 0002 01 AFT BEAM
+ 0003 01 RESERVED
+ 0004 01 RESERVED
+ 0005 01 RESERVED
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+008193 0007 0000 01 START TIME OF ORBIT
+ 0001 01 END TIME OF ORBIT
+ 0002 01 TIME OF ASCENDING NODE
+ 0003 01 ASSIMILATION TIME
+ 0004 01 START TIME OF ASSIMILATION
+ 0005 01 END TIME OF ASSIMLATION
+ 0063 01 MISSING
+008195 0032 0001 01 FIRST GUESS
+ 0002 01 ANALYSIS
+ 0003 01 INITIALISED ANALYSIS
+ 0004 01 OI ANALYSIS
+ 0005 01 3 D VARIATIONAL ANALYSIS
+ 0006 01 4 D VARIATIONAL ANALYSIS
+ 0007 01 3 D VARIATIONAL GRADIENTS
+ 0008 01 4 D VARIATIONAL GRADIENTS
+ 0009 01 FORECAST
+ 0010 01 CONTROL FORECAST
+ 0011 01 PERTURBED FORECAST
+ 0012 01 ERRORS IN FIRST GUESS
+ 0013 01 ERRORS IN ANALYSIS
+ 0014 01 CLUSTER MEANS
+ 0015 01 CLUSTER STANDARD DEVIATIONS
+ 0016 01 FORECAST PROBABILITIES
+ 0017 01 ENSEMBLE MEANS
+ 0018 01 ENSEMBLE STANDARD DEVIATIONS
+ 0019 01 FORECAST ACCUMULATIONS
+ 0020 01 CLIMATOLOGY
+ 0021 01 CLIMATE SIMULATION
+ 0030 01 OBSERVATIONS
+ 0031 01 QUALITY CONTROL
+ 0032 01 DIFFERENCE STATISTICS
+ 0040 01 IMAGE DATA
+ 0050 01 SENSITIVITY GRADIENTS
+ 0051 01 TRAJECTORY FORECAST
+ 0052 01 SENSITIVITY FORECAST
+ 0060 01 PERTURBED ANALYSIS
+ 0061 01 PERTURBATION
+ 0062 01 SINGULAR VECTOR
+ 0127 01 MISSING VALUE
+010063 0010 0000 02 INCREASING, THEN DECREASING: ATMOSPHERIC PRESURE THE SAME OR
+ HIGHER THAN 3 HOURS AGO (OR 24 HOURS AGO )
+ 0001 01 INCREASING, THEN STEADY; OR INCREASING; THEN MORE SLOWLY
+ 0002 01 INCREASING (STEADILY OR UNSTEADILY )
+ 0003 01 DECREASING OR STEADY, THEN INCREASING; RAPIDLY
+ 0004 02 STEADY; ATMOSPHERIC PRESSURE THE SAME AS 3 HOURS AGO (OR 24
+ HOURS)
+ 0005 02 DECREASING; THEN INCREASING; ATMOSPHERIC PRESSURE THE SAME O
+ R LOWER THAN 3 HOURS AGO
+ 0006 02 DECREASING, THEN STEADY; OR DECREASING, DECREASING MORE SLOW
+ LY
+ 0007 01 DECREASING (STEADILY OR UNSTEADELY )
+ 0008 02 STEADY OR INCREASING, THEN DECREASING; OR DECREASING, THEN
+ DECREASING MORE RAPIDLY
+ 0015 01 MISSING
+010064 0004 0000 01 SUBSONIC
+ 0001 01 TRANSONIC
+ 0002 01 SUPERSONIC
+ 0007 01 MISSING VALUE
+011031 0009 0000 01 NIL IN CLOUD
+ 0001 01 SLIGHT IN CLOUD
+ 0002 01 MODERATE IN CLOUD
+ 0003 01 SEVERE IN CLOUD
+ 0004 01 NIL IN CLEAR AIR
+ 0005 01 SLIGHT IN CLEAR AIR
+ 0006 01 MODERATE IN CLEAR AIR
+ 0007 01 SEVERE IN CLEAR AIR
+ 0015 01 MISSING VALUE
+011037 0030 0000 01 AVE <0.1 PEAK <0.1
+ 0001 01 AVE <0.1 0.1 <= PEAK <0.2
+ 0002 01 0.1 <= AVE <0.2 0.1 <= PEAK <0.2
+ 0003 01 AVE <0.1 0.2 <= PEAK <0.3
+ 0004 01 0.1 <= AVE <0.2 0.2 <= PEAK <0.3
+ 0005 01 0.2 <= AVE <0.3 0.2 <= PEAK <0.3
+ 0006 01 AVE <0.1 0.3 <= PEAK <0.4
+ 0007 01 0.1 <= AVE <0.2 0.3 <= PEAK <0.4
+ 0008 01 0.2 <= AVE <0.3 0.3 <= PEAK <0.4
+ 0009 01 0.3 <= AVE <0.4 0.3 <= PEAK <0.4
+ 0010 01 AVE <0.1 0.4 <= PEAK <0.5
+ 0011 01 0.1 <= AVE <0.2 0.4 <= PEAK <0.5
+ 0012 01 0.2 <= AVE <0.3 0.4 <= PEAK <0.5
+ 0013 01 0.3 <= AVE <0.4 0.4 <= PEAK <0.5
+ 0014 01 0.4 <= AVE <0.5 0.4 <= PEAK <0.5
+ 0015 01 AVE <0.1 0.5 <= PEAK <0.8
+ 0016 01 0.1 <= AVE <0.2 0.5 <= PEAK <0.8
+ 0017 01 0.2 <= AVE <0.3 0.5 <= PEAK <0.8
+ 0018 01 0.3 <= AVE <0.4 0.5 <= PEAK <0.8
+ 0019 01 0.4 <= AVE <0.5 0.5 <= PEAK <0.8
+ 0020 01 0.5 <= AVE <0.8 0.5 <= PEAK <0.8
+ 0021 01 AVE <0.1 0.8 <= PEAK
+ 0022 01 0.1 <= AVE <0.2 0.8 <= PEAK
+ 0023 01 0.2 <= AVE <0.3 0.8 <= PEAK
+ 0024 01 0.3 <= AVE <0.4 0.8 <= PEAK
+ 0025 01 0.4 <= AVE <0.5 0.8 <= PEAK
+ 0026 01 0.5 <= AVE <0.8 0.8 <= PEAK
+ 0027 01 0.8 <= AVE 0.8 <= PEAK
+ 0028 01 NIL NIL
+ 0063 01 MISSING VALUE
+011038 0017 0000 01 MIN < 1
+ 0001 01 1 <= MIN < 2
+ 0002 01 2 <= MIN < 3
+ 0003 01 3 <= MIN < 4
+ 0004 01 4 <= MIN < 5
+ 0005 01 5 <= MIN < 6
+ 0006 01 6 <= MIN < 7
+ 0007 01 7 <= MIN < 8
+ 0008 01 8 <= MIN < 9
+ 0009 01 9 <= MIN < 10
+ 0010 01 10 <= MIN < 11
+ 0011 01 11 <= MIN < 12
+ 0012 01 12 <= MIN < 13
+ 0013 01 13 <= MIN < 14
+ 0014 01 14 <= MIN < 15
+ 0015 01 NO TIMING INFORMATION AVAILABLE
+ 0031 01 MISSING VALUE
+011039 0016 0000 01 1 <= MIN < 2
+ 0001 01 2 <= MIN < 3
+ 0002 01 3 <= MIN < 4
+ 0004 01 4 <= MIN < 5
+ 0005 01 5 <= MIN < 6
+ 0006 01 6 <= MIN < 7
+ 0007 01 7 <= MIN < 8
+ 0008 01 8 <= MIN < 9
+ 0009 01 9 <= MIN < 10
+ 0010 01 10 <= MIN < 11
+ 0011 01 11 <= MIN < 12
+ 0012 01 12 <= MIN < 13
+ 0013 01 13 <= MIN < 14
+ 0014 01 14 <= MIN < 15
+ 0060 01 NO TIMING INFORMATION AVAILABLE
+ 0063 01 MISSING VALUE
+013038 0004 0000 01 NOT SUPERADIABATIC
+ 0001 01 SUPERADIABATIC
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+013039 0003 0000 01 SEA ICE
+ 0001 01 SNOW ON LAND
+ 0007 01 MISSING VALUE
+013040 0009 0000 01 LAND
+ 0001 01 RESERVED
+ 0002 01 NEAR COAST
+ 0003 01 ICE
+ 0004 01 POSSIBLE ICE
+ 0005 01 OCEAN
+ 0006 01 COAST
+ 0007 01 DESERT
+ 0015 01 MISSING VALUE
+013041 0010 0001 01 A
+ 0002 01 A-B
+ 0003 01 B
+ 0004 01 B-C
+ 0005 01 C
+ 0006 01 D
+ 0007 01 E
+ 0008 01 F
+ 0009 01 G
+ 0015 01 MISSING VALUE
+013051 0008 0000 01 SMALLER THAN ANY VALUE IN THE 30 YEARS PERIOD
+ 0001 01 IN THE FIRST QUINTILE
+ 0002 01 IN THE SECOND QUINTILE
+ 0003 01 IN THE THIRD QUINTILE
+ 0004 01 IN THE FOURTH QUINTILE
+ 0005 01 IN THE FIFTH QUINTILE
+ 0006 01 GREATER THAN ANY VALUE IN THE 30 YEAR PERIOD
+ 0015 01 MISSING VALUE
+013056 0010 0000 01 NO PRECIPITATION
+ 0001 01 LIGHT INTERMITTENT
+ 0002 01 MODERATE INTERMITTENT
+ 0003 01 HEAVY INTERMITTENT
+ 0004 01 VERY HEAVY INTERMITTENT
+ 0005 01 LIGHT CONTINUOUS
+ 0006 01 MODERATE CONTINUOUS
+ 0007 01 VERY HEAVY CONTINUOUS
+ 0009 01 VARIABLE-ALTERNATIVELY LIGHT AND HEAVY
+ 0015 01 MISSING VALUE
+013057 0011 0000 01 NO PRECIPITATION
+ 0001 01 WITHIN THE LAST HOUR
+ 0002 01 1 TO 2 HOURS AGO
+ 0003 01 2 TO 3 HOURS AGO
+ 0004 01 3 TO 4 HOURS AGO
+ 0005 01 4 TO 5 HOURS AGO
+ 0006 01 5 TO 6 HOURS AGO
+ 0007 01 6 TO 8 HOURS AGO
+ 0008 01 8 TO 10 HOURS AGO
+ 0009 01 MORE THAN 10 HOURS AHO
+ 0015 01 MISSING VALUE
+013202 0007 0000 01 LAND
+ 0001 01 VEGETATION
+ 0003 01 MULTI-YEAR ICE
+ 0004 01 POSSIBLE ICE OR FIRST YEAR ICE
+ 0005 01 OCEAN
+ 0006 01 COASTLINE
+ 0015 01 MISSING
+015025 0000 0000 01 OZONE
+ 0015 01 MISSING VALUE
+019001 0007 0000 01 DEPRESSION OR LOW (EXTRATROPICAL)
+ 0001 01 TROPICAL DEPRESSION
+ 0002 01 TROPICAL STORM
+ 0003 01 SEVERE TROPICAL STORM
+ 0004 01 TYPHOON
+ 0010 01 DUST/SANDSTORM
+ 0063 01 MISSING VALUE
+019008 0005 0000 01 RESERVED
+ 0001 01 SHALLOW (TOP OF CIRCULATION BELOW 700-HPA LEVEL
+ 0002 01 MEDIUM(TOP BETWEEN 700-HPA AND 400-HPA)
+ 0003 01 DEEP(TOP ABOVE 400-HPA LEVEL
+ 0007 01 MISSING VALUE
+019010 0004 0000 01 RESERVED
+ 0001 01 MINIMUM VALUE OF SEA LEVEL PRESSURE
+ 0002 01 MAXIMUM VALUE OF 850 HPA RELATIVE VORTICITY
+ 0015 01 MISSING VALUE
+020003 0250 0000 01 CLOUD DEVELOPMENT NOT OBSERVED OR NOT OBSERVABLE
+ 0001 01 CLOUDS GENERALLY DISSOLVING OR BECOMING LESS DEVELOPED
+ 0002 01 STATE OF SKY ON THE WHOLE UNCHANGED
+ 0003 01 CLOUDS GENERALLY FORMING OR DEVELOPING
+ 0004 02 VISIBILITY REDUCED BY SMOKE, E.G. VELDT OR FOREST FIRES, IN
+ DUSTRIAL SMOKE OR VOLCANIC ASHES
+ 0005 01 HAZE
+ 0006 02 WIDESPREAD DUST IN SUSPENSION IN THE AIR, NOT RAISED BY WIND
+ AT OR NEAR THE STATION AT THE TIME OF OBSERVATION
+ 0007 04 DUST OR SEND RAISED BY WIND AT OR NEAR THE STATION AT THE TI
+ ME OF OBSERVATION, BUT NO WELL-DEVELOPED DUST WHRIL(S) OR SA
+ ND WHRIL(S), AND NO DUSTSTORM OR SANDSTORM SEEN; OR, IN THE
+ CASE OF SHIPS, BLOWING SPRAY AT THE STATION
+ 0008 03 WELL-DEVELOPED DUST WHRIL(S) OR SAND WHRILS SEEN AT OR NEAR
+ THE STATION DURING THE PRECEDING HOUR OR AT THE SAME TIME OF
+ OBSERVATION, BUT NO DUSTSTORM OR SANDSTORM
+ 0009 02 DUSTSTORM OR SANDSTORM WITHIN SIGHT AT THE TIME OF OBSERVATI
+ ON, OR AT THE STATION DURING THE PRECEDING HOR
+ 0010 01 MIST
+ 0011 02 PACHES SHALLOW FOG OR ICE AT THE STATION, WHETHER ON LAND OR
+ SEA, NOT DEEPER THAN 2 METRES ON LAND OR 10 METRES AT SEA
+ 0012 03 MORE OR LESS CONTINUOUS SHALLOW FOG OR ICE AT THE STATION,
+ WHETHER ON LAND OR SEA, NOT DEEPER THAN 2 METRES ON LAND OR
+ 10 METRES AT SEA
+ 0013 01 LIGHTNING VISIBLE, NO THUNDER HEARD
+ 0014 02 PRECIPITATION WITHIN SIGHT, NOT REACHING THE GROUND OR THE
+ SURFACE OF THE SEA
+ 0015 03 PRECIPITATION WITHIN SIGHT, REACHING THE GROUND OR THE SURFA
+ CE OF THE SEA, BUT DISTANT, I.E. ESTIMATED TO BE MORE THAN
+ 5 KM FROM THE STATION
+ 0016 02 PRECIPITATION WITHIN SIGHT, REACHING THE GROUND OR THE SURFA
+ CE OF THE SEA, NEAR TO, BUT NOT AT THE STATION
+ 0017 02 THUNDERSTORM, BUT NO PRECIPITATION AT THE TIME OF OBSERVATIO
+ N
+ 0018 02 SQUALLS AT OR WITHIN SIGHT OF THE STATION DURING THE PRECEDI
+ NG HOUR OR AT THE TIME OF OBSERVATION
+ 0019 02 FUNNEL CLOUD(S) AT OR WITHIN SIGHT OF THE STATION DURING THE
+ PRECEDING HOUR OR AT THE TIME OF OBSERVATION
+ 0020 03 DRIZZEL (NOT FREEZING) OR SNOW GRAINS NOT FALLING AS SHOWERS
+ ; DURING THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVAT
+ IONS
+ 0021 02 RAIN (NOT FREEZING) NOT FALLING AS SHOWER(S); DURING THE PRE
+ ECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0022 02 SNOW NOT FALLING AS SHOWER(S); DURING THE PRECEDING HOUR BUT
+ NOT AT THE TIME OF OBSERVATION
+ 0023 02 RAIN AND SNOW OR ICE PELLETS NOT FALLING AS SHOWER(S); DURIN
+ G THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0024 02 FREEZING DRIZZEL OR FREEZING RAIN NOT FALLING AS SHOWER(S);
+ DURING THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0025 02 SHOWER(S) OF RAIN; DURING THE PRECEDING HOUR BUT NOT AT THE
+ TIME OF OBSERVATION
+ 0026 02 SHOWER(S) OF SNOW, OR OF RAIN AND SNOW; DURING THE PRECEDING
+ HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0027 02 SHOWER(S) OF HAIL, OR OF RAIN AND HAIL; DURING THE PRECEDING
+ HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0028 02 FOG OR ICE FOG; DURING THE PRECEDING HOUR BUT NOT AT THE TIM
+ E OF OBSERVATION
+ 0029 02 THUNDERSTORM (WITH OR WITHOUT PRECIPITATION); DURING THE PRE
+ CEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0030 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM HAS DECREASED DURI
+ NG THE PRECEDING HOURS
+ 0031 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM NO APPRECIABLE CHA
+ NGE DURING THE PRECEDING HOUR
+ 0032 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM HAS BEGUN OR HAS I
+ NCEASED DURING THE PRECEDING HOUR
+ 0033 02 SEVERE DUSTSTORM OR SANDSTORM HAS DECREASED DURING THE PREC
+ EDING HOURS
+ 0034 02 SEVERE DUSTSTORM OR SANDSTORM NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0035 02 SEVERE DUSTSTORM OR SANDSTORM HAS BEGUN OR HAS INCREASED DUR
+ ING THE PRECEDING HOUR
+ 0036 02 SLIGHT OR MODERATE DRIFTING SNOW GENERALLY LOW (BELOW EYE LE
+ VEL)
+ 0037 01 HEAVY DRIFTING SNOW GENERALY LOW (BELOW EYE LEVEL)
+ 0038 02 SLIGHT OR MODERATE BLOWING SNOW GENERALLY HIGH (ABOVE EYE LE
+ VEL)
+ 0039 01 HEAVY BLOWING SNOW GENERALY HIGH (ABOVE EYE LEVEL)
+ 0040 03 FOG OR ICE FOG AT A DISTANCE AT THE TIME OF OBSERVATION, BUT
+ NOT AT THE STATION DURING THE PRECEDING HOUR, THE FOG OR IC
+ E FOG EXTENDING TO A LEVEL ABOVE THAT OF THE OBSERVER
+ 0041 01 FOG OR ICE FOG IN PATCHES
+ 0042 02 FOG OR ICE FOG, SKY VISIBLE,HAS BECOME THINNER DURING THE PR
+ ECEDING HOUR
+ 0043 02 FOG OR ICE FOG, SKY INVISIBLE,HAS BECOME THINNER DURING THE
+ PRECEDING HOUR
+ 0044 02 FOG OR ICE FOG, SKY VISIBLE,NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0045 02 FOG OR ICE FOG, SKY INVISIBLE,NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0046 02 FOG OR ICE FOG, SKY VISIBLE,HAS BEGUN OR HAS BECOME THICKE
+ R DURING THE PRECEDING HOUR
+ 0047 02 FOG OR ICE FOG, SKY INVISIBLE,HAS BEGUN OR HAS BECOME THICKE
+ R DURING THE PRECEDING HOUR
+ 0048 01 FOG, DEPOSITING RIME, SKY VISIBLE
+ 0049 01 FOG, DEPOSITING RIME, SKY INVISIBLE
+ 0050 02 DRIZZLE, NOT FREEZING, INTERMITTENT;SLIGHT AT TIME OF OBSERV
+ ATION
+ 0051 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;SLIGHT AT TIME OF OBSERV
+ ATION
+ 0052 02 DRIZZLE, NOT FREEZING, INTERMITTENT;MODERATE AT TIME OF OBSE
+ RVATION
+ 0053 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;MODERATE AT TIME OF OBSE
+ RVATION
+ 0054 02 DRIZZLE, NOT FREEZING, INTERMITTENT;HEAVY (DENSE) AT THE TIM
+ E OF OBSERVATION
+ 0055 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;HEAVY (DENSE) AT THE TIM
+ E OF OBSERVATION
+ 0056 01 DRIZZLE, FREEZING, SLIGHT
+ 0057 01 DRIZZLE, FREEZING, MODERATE OR HEAVY (DENSE)
+ 0058 01 DRIZZLE AND RAIN, SLIGHT
+ 0059 01 DRIZZLE AND RAIN, MODERATE OR HEAVY
+ 0060 01 RAIN,NOT FREEZING,INTERMITTENT;SLIGHT AT TIME OF OBSERVATION
+ 0061 01 RAIN,NOT FREEZING,CONTINUOUS ;SLIGHT AT TIME OF OBSERVATION
+ 0062 02 RAIN,NOT FREEZING,INTERMITTENT;MODERATE AT TIME OF OBSERVATI
+ ON
+ 0063 02 RAIN,NOT FREEZING,CONTINUOUS ;MODERATE AT TIME OF OBSERVATI
+ ON
+ 0064 02 RAIN, NOT FREEZING, INTERMITTENT;HEAVY AT TIME OF OBSERVATIO
+ ON
+ 0065 01 RAIN, NOT FREEZING, CONTINUOUS;HEAVY AT TIME OF OBSERVATION
+ 0066 01 RAIN, FREEZING, SLIGHT
+ 0067 01 RAIN, FREEZING, MODERATE OR HEAVY
+ 0068 01 RAIN OR DRIZZLE AND SNOW, LIGHT
+ 0069 01 RAIN OR DRIZZLE AND SNOW, MODERATE OR HEAVY
+ 0070 02 INTERMITTENT FALL OF SNOWFLAKES, SLIGHT AT TIME OF OBSERVATI
+ ON
+ 0071 02 CONTINUOUS FALL OF SNOWFLAKES, SLIGHT AT TIME OF OBSERVATI
+ ON
+ 0072 02 INTERMITTENT FALL OF SNOWFLAKES, MODERATE AT TIME OF OBSERVA
+ TION
+ 0073 02 CONTINUOUS FALL OF SNOWFLAKES, MODERATE AT TIME OF OBSERVA
+ TION
+ 0074 02 INTERMITTENT FALL OF SNOWFLAKES, HEAVY AT TIME OF OBSERVATIO
+ ONS
+ 0075 02 CONTINUOUS FALL OF SNOWFLAKES, HEAVY AT TIME OF OBSERVATIO
+ ONS
+ 0076 01 DIAMOND DUST (WITH OR WITHOUT FOG)
+ 0077 01 SNOW GRAINS (WITH OR WITHOUT FOG)
+ 0078 01 ISOLATED STAR-LIKE SNOW CRYSTALS (WITH OR WITHOUT FOG)
+ 0079 01 ICE PELLETS
+ 0080 01 RAIN SHOWER(S), SLIGHT
+ 0081 01 RAIN SHOWER(S), MODERATE OR HEAVY
+ 0082 01 RAIN SHOWER(S), VIOLENT
+ 0083 01 SHOWER(S) OF RAIN AND SNOW MIXED, SLIGHT
+ 0084 01 SHOWER(S) OF RAIN AND SNOW MIXED, MODERATE OR HEAVY
+ 0085 01 SNOW SHOWER(S), SLIGHT
+ 0086 01 SNOW SHOWER(S), MODERATE OR HEAVY
+ 0087 02 SHOWER(S) OF SNOW PELLETS OR SMALL HAIL, WITH OR WITHOUT RAI
+ N OR RAIN AND SNOW MIXED, SLIGHT
+ 0088 02 SHOWER(S) OF SNOW PELLETS OR SMALL HAIL, WITH OR WITHOUT RAI
+ N OR RAIN AND SNOW MIXED, MODERATE OR HEAVY
+ 0089 02 SHOWER(S) OF HAIL, WITH OR WITHOUT RAIN OR RAIN AND SNOW MIX
+ ED, NOT ASSOCIATED WITH THUNDER, SLIGHT
+ 0090 02 SHOWER(S) OF HAIL, WITH OR WITHOUT RAIN OR RAIN AND SNOW MIX
+ ED, NOT ASSOCIATED WITH THUNDER, MODERATE OR HEAVY
+ 0091 02 SLIGHT RAIN AT TIME OF OBSERVATION, THUNDERSTORM DURING THE
+ PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0092 02 MODERATE OR HEAVY RAIN AT TIME OF OBSERVATION, THUNDERSTORM
+ DURING THE PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0093 03 SLIGHT SNOW, OR RAIN AND SNOW MIXED OR HAIL AT TIME OF OBSER
+ VATION, THUNDERSTORM DURING THE PRECEDING HOUR BUT NOT AT TI
+ ME OF OBSERVATION
+ 0094 03 MODERATE OR HEAVY SNOW, OR RAIN AND SNOW MIXED OR HAIL AT TI
+ ME OF OBSERVATION, THUNDERSTORM DURING PRECEDING HOUR BUT NO
+ T AT TIME OF OBSERVATION
+ 0095 03 THUNDERSTORM, SLIGHT OR MODERATE, WITHOUT HAIL, BUT WITH RAI
+ N AND/OR SNOW AT TIME OF OBSERVATION, THUNDERSTORM DURING TH
+ E PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0096 02 THUNDERSTORM, SLIGHT OR MODERATE,WITH HAIL AT TIME OF OBSERV
+ ATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0097 02 THUNDERSTORM, HEAVY, WITHOUT HAIL BUT WITH RAIN AND/OR SNOW
+ AT TIME OF OBSERVATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0098 02 THUNDERSTORM COMBINED WITH DUSTSTORM OR SANDSTORM AT TIME OF
+ OBSERVATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0099 02 THUNDERSTORM, HEAVY, WITH HAIL AT TIME OF OBSERVATION, THUND
+ ERSTORM AT TIME OF OBSERVATION
+ 0100 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0101 02 CLOUDS GENERALLY DISSOLVING OR BECOMING LESS DEVELOPED DURIN
+ G THE PAST HOUR
+ 0102 01 STATE OF SKY ON THE WHOLE UNCHANGED DURING THE PAST HOUR
+ 0103 01 CLOUDS GENERALLY FORMING OR DEVELOPING DURING THE PAST HOUR
+ 0104 02 HAZE OR SMOKE, OR DUST IN SUSPENSION IN THE AIR, VISIBILITY
+ EQUAL TO, OR GREATER THAN 1KM
+ 0105 02 HAZE OR SMOKE, OR DUST IN SUSPENSION IN THE AIR, VISIBILITY
+ LESS THAN 1KM
+ 0110 01 MIST
+ 0111 01 DIAMOND DUST
+ 0112 01 DISTANT LIGHTING
+ 0118 01 SQUALLS
+ 0120 01 FOG
+ 0121 01 PRECIPITATION
+ 0122 01 DRIZZLE (NOT FREEZING) OR SNOW GRAINS
+ 0123 01 RAIN (NOT FREEZING)
+ 0124 01 SNOW
+ 0125 01 FREEZING DRIZZLE OR FREEZING RAIN
+ 0126 01 THUNDERSTORM (WITH OR WITHOUT PRECIPITATION)
+ 0127 01 BLOWING OR DRIFTING SNOW OR SAND
+ 0128 02 BLOWING OR DRIFTING SNOW OR SAND, VISIBILITY EQUAL TO, OR GR
+ ATER THAN, 1KM
+ 0129 01 BLOWING OR DRIFTING SNOW OR SAND, VISIBILITY LESS THAN 1 KM
+ 0130 01 FOG
+ 0131 01 FOG OR ICE FOG, IN PATCHES
+ 0132 01 FOG OR ICE FOG, HAS BECOME THINNER DURING PAST HOUR
+ 0133 01 FOG OR ICE FOG, NO APPRECIABLE CHANGE DURING PAST HOUR
+ 0134 01 FOG OR ICE FOG, HAS BECUNOR BECOME THICKER DURING PAST HOUR
+ 0135 01 FOG, DEPOSITION RIME
+ 0140 01 PRECIPITATION
+ 0141 01 PRECIPITATION SLIGHT OR MODERATE
+ 0142 01 PRECIPITATION, HEAVY
+ 0143 01 LIQUID PRECIPITATION, SLIGHT OR MODERATE
+ 0144 01 LIQUID PRECIPITATION, HEAVY
+ 0145 01 SOLID PRECIPITATION, SLIGHT OR MODERATE
+ 0146 01 SOLID PRECIPITATION, HEAVY
+ 0147 01 FREEZING PRECIPITATION, SLIGHT OR MODERATE
+ 0148 01 FREEZING PRECIPITATION, HEAVY
+ 0150 01 DRIZZLE
+ 0151 01 DRIZZLE, NOT FREEZING, SLIGHT
+ 0152 01 DRIZZLE, NOT FREEZING, MODERATE
+ 0153 01 DRIZZLE, NOT FREEZING, HEAVY
+ 0154 01 DRIZZLE, FREEZING, SLIGHT
+ 0155 01 DRIZZLE, FREEZING, MODERATE
+ 0156 01 DRIZZLE, FREEZING, HEAVY
+ 0157 01 DRIZZLE AND RAIN, SLIGHT
+ 0158 01 DRIZZLE AND RAIN, MODERATE OR HEAVY
+ 0160 01 RAIN
+ 0161 01 RAIN, NOT FREEZING, SLIGHT
+ 0162 01 RAIN, NOT FREEZING, MODERATE
+ 0163 01 RAIN, NOT FREEZING, HEAVY
+ 0164 01 RAIN, FREEZING, SLIGHT
+ 0165 01 RAIN, FREEZING, MODERATE
+ 0166 01 RAIN, FREEZING, HEAVY
+ 0167 01 RAIN (OR DRIZZLE) AND SNOW, SLIGHT
+ 0168 01 RAIN (OR DRIZZLE) AND SNOW, MODERATE AND HEAVY
+ 0170 01 SNOW
+ 0171 01 SNOW, SLIGHT
+ 0172 01 SNOW, MODERATE
+ 0173 01 SNOW, HEAVY
+ 0174 01 ICE PELLETS, SLIGHT
+ 0175 01 ICE PELLETS, MODERATE
+ 0176 01 ICE PELLETS, HEAVY
+ 0180 01 SHOWER(S) OR INTERMITTENT PRECIPITATION
+ 0181 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, SLIGHT
+ 0182 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, MODERATE
+ 0183 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, HEAVY
+ 0184 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, VIOLENT
+ 0185 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, SLIGHT
+ 0186 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, MODERATE
+ 0187 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, HEAVY
+ 0190 01 THUNDERSTORM
+ 0191 01 THUNDERSTORM, SLIGHT OR MODERATE, WITH NO PRECIPITATION
+ 0192 02 THUNDERSTORM, SLIGHT OR MODERATE, WITH RAIN SHOWERS AND/OR S
+ NOW SHOWERS
+ 0193 01 THUNDERSTORM, SLIGHT OR MODERATE, WITH HAIL
+ 0194 01 THUNDERSTORM, HEAVY, WITH NO PRECIPITATION
+ 0195 01 THUNDERSTORM, HEAVY, WITH RAIN SHOWERS AND/OR SNOW SHOWERS
+ 0196 01 THUNDERSTORM, HEAVY, WITH HAIL
+ 0204 01 VOLCANIC ASH SUSPENDED IN THE AIR ALOFT
+ 0206 01 THICK DUST HAZE, VISIBILITY LESS THAN 1 KM
+ 0207 01 BLOWING SPRAY AT THE STATION
+ 0208 01 DRIFTING DUST (SAND)
+ 0209 01 WALL OF DUST OR SAND IN DISTANCE (LIKE HABOOB)
+ 0210 01 SNOW HAZE
+ 0211 01 WHITEOUT
+ 0213 01 LIGHTING, CLOUD TO SURFACE
+ 0217 01 DRY THUNDERSTORM
+ 0219 02 TORNADO CLOUD (DESTRUCTIVE AT OR WITHIN SIGHT OF THE STATION
+ DURING PRECEDING HOUR OR AT THE TIME OF OBSERVATION
+ 0220 01 DEPOSITION OF VOLCANIC ASH
+ 0221 01 DEPOSITION OF DUST OR SAND
+ 0222 01 DEPOSITION OF DEW
+ 0223 01 DEPOSITION OF WET SNOW
+ 0224 01 DEPOSITION OF SOFT RIME
+ 0225 01 DEPOSITION OF HARD RIME
+ 0226 01 DEPOSITION OF HOAR FROST
+ 0227 01 DEPOSITION OF GLAZE
+ 0228 01 DEPOSITION OF ICE CRUST (ICE SLICK)
+ 0230 01 DUSTSTORM OR SANDSTORM WITH TEMPERATURE BELOW 0 C DEGREES
+ 0239 02 BLOWING SNOW, IMPOSSIBLE TO DETERMINE WHETHER SNOW IS FALLIN
+ G OR NOT
+ 0241 01 FOG ON SEA
+ 0242 01 FOG IN VALLEYS
+ 0243 01 ARCTIC OR ANTARCTIC SEA SMOKE
+ 0244 01 STEAM FOG (SEA,LAKE OR RIVER)
+ 0245 01 STEAM FOG (LAND)
+ 0246 01 FOG OVER ICE OR SNOW COVER
+ 0247 01 DENCE FOG VISIBILITY 60-90 M
+ 0248 01 DENCE FOG VISIBILITY 30-60 M
+ 0249 01 DENCE FOG VISIBILITY LESS THAN 30 M
+ 0250 01 DRIZZLE, RATE OF FALL LESS THAN 0.10 MM/H
+ 0251 01 DRIZZLE, RATE OF FALL 0.10 - .19 MM/H
+ 0252 01 DRIZZLE, RATE OF FALL 0.20 - .39 MM/H
+ 0253 01 DRIZZLE, RATE OF FALL 0.40 - .79 MM/H
+ 0254 01 DRIZZLE, RATE OF FALL 0.80 - 1.59 MM/H
+ 0255 01 DRIZZLE, RATE OF FALL 1.60 - 3.19 MM/H
+ 0256 01 DRIZZLE, RATE OF FALL 3.20 - 6.39 MM/H
+ 0257 01 DRIZZLE, RATE OF FALL 6.40 MM/H OR MORE
+ 0259 01 DRIZZLE AND SNOW
+ 0260 01 RAIN, RATE OF FALL LESS THAN 1.0 MM/H
+ 0261 01 RAIN, RATE OF FALL 1.0 - 1.9 MM/H
+ 0262 01 RAIN, RATE OF FALL 2.0 - 3.9 MM/H
+ 0263 01 RAIN, RATE OF FALL 4.0 - 7.9 MM/H
+ 0264 01 RAIN, RATE OF FALL 8.0 - 15.9 MM/H
+ 0265 01 RAIN, RATE OF FALL 16.0 - 31.9 MM/H
+ 0266 01 RAIN, RATE OF FALL 32.0 - 63.9 MM/H
+ 0267 01 RAIN, RATE OF FALL 64.0 MM/H OR MORE
+ 0270 01 SNOW, RATE OF FALL LESS THAN 1.0 CM/H
+ 0271 01 SNOW, RATE OF FALL 1.0 - 1.9 CM/H
+ 0272 01 SNOW, RATE OF FALL 2.0 - 3.9 CM/H
+ 0273 01 SNOW, RATE OF FALL 4.0 - 7.9 CM/H
+ 0274 01 SNOW, RATE OF FALL 8.0 - 15.9 CM/H
+ 0275 01 SNOW, RATE OF FALL 16.0 - 31.9 CM/H
+ 0276 01 SNOW, RATE OF FALL 32.0 - 63.9 CM/H
+ 0277 01 SNOW, RATE OF FALL 64.0 CM/H OR MORE
+ 0278 01 SNOW OR ICE CRISTAL PRECIPITATION FROM A CLEAR SKY
+ 0279 01 WET SNOW, FREEZING ON CONTACT
+ 0280 01 PRECIPITATION OF RAIN (WW= 87-99)
+ 0281 01 PRECIPITATION OF RAIN,FREEZING (WW= 80-82)
+ 0282 01 PRECIPITATION OF RAIN AND SNOW MIXED
+ 0283 01 PRECIPITATION OF SNOW
+ 0284 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL
+ 0285 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH RAIN
+ 0286 02 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH RAIN AND S
+ NOW MIXED
+ 0287 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH SNOW
+ 0288 01 PRECIPITATION OF HAIL
+ 0289 01 PRECIPITATION OF HAIL, WITH RAIN
+ 0290 01 PRECIPITATION OF HAIL, WITH RAIN AND SNOW MIXED
+ 0291 01 PRECIPITATION OF HAIL, WITH SNOW
+ 0292 01 SHOWER(S) OR THUNDERSTORM OVER SEA
+ 0293 01 SHOWER(S) OR THUNDERSTORM OVER MOUNTAINS
+ 0508 02 NO SIGNIFICANT PHENOMENA TO REPORT, PRESENT AND PAST WEATHER
+ OMITTED
+ 0509 02 NOT OBSERVED, NO DATA AVAILABLE, PRESENT AND PAST WEATHER OM
+ ITTED
+ 0510 01 PRESENT AND PAST WEATHER MISSING, BUT EXPECTED
+ 0511 01 MISSING VALUE
+020004 0021 0000 02 CLOUD COVERING 1/2 OR LESS OF THE SKY THROUGHOUT THE APPROPP
+ RIATE PERIOD
+ 0001 03 CLOUD COVERING MORE THAN 1/2 OF THE SKY DURING PART OF THE A
+ PPROPRIATE PERIOD AND COVERING 1/2 OR LESS DURING PART OF TH
+ E PERIOD
+ 0002 02 CLOUD COVERING MORE THAN 1/2 OF THE SKY THROUGHOUT THE APPRP
+ PRIATE PERIOD
+ 0003 01 SANSTORM, DUSTSTORM OR BLOWING SNOW
+ 0004 01 FOG OR ICE OR THICK HAZE
+ 0005 01 DRIZZLE
+ 0006 01 RAIN
+ 0007 01 SNOW, OR RAIN AND SNOW MIXED
+ 0008 01 SHOWER(S)
+ 0009 01 THUNDERSTORM(S) WITH OR WITHOUT PRECIPITATION
+ 0010 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0011 01 VISIBILITY REDUCED
+ 0012 01 BLOWING PHENOMENA, VISIBILITY REDUCED
+ 0013 01 FOG
+ 0014 01 PRECIPITATION
+ 0015 01 DRIZZLE
+ 0016 01 RAIN
+ 0017 01 SNOW OR ICE PELLETS
+ 0018 01 SHOWERS OR INTERMITTENT PRECIPITATION
+ 0019 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+020005 0021 0000 02 CLOUD COVERING 1/2 OR LESS OF THE SKY THROUGHOUT THE APPROPP
+ RIATE PERIOD
+ 0001 03 CLOUD COVERING MORE THAN 1/2 OF THE SKY DURING PART OF THE A
+ PPROPRIATE PERIOD AND COVERING 1/2 OR LESS DURING PART OF TH
+ E PERIOD
+ 0002 02 CLOUD COVERING MORE THAN 1/2 OF THE SKY THROUGHOUT THE APPRP
+ PRIATE PERIOD
+ 0003 01 SANSTORM, DUSTSTORM OR BLOWING SNOW
+ 0004 01 FOG OR ICE OR THICK HAZE
+ 0005 01 DRIZZLE
+ 0006 01 RAIN
+ 0007 01 SNOW, OR RAIN AND SNOW MIXED
+ 0008 01 SHOWER(S)
+ 0009 01 THUNDERSTORM(S) WITH OR WITHOUT PRECIPITATION
+ 0010 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0011 01 VISIBILITY REDUCED
+ 0012 01 BLOWING PHENOMENA, VISIBILITY REDUCED
+ 0013 01 FOG
+ 0014 01 PRECIPITATION
+ 0015 01 DRIZZLE
+ 0016 01 RAIN
+ 0017 01 SNOW OR ICE PELLETS
+ 0018 01 SHOWERS OR INTERMITTENT PRECIPITATION
+ 0019 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+020008 0019 0000 01 SKY CLEAR
+ 0001 01 FEW
+ 0002 01 SCATTERED
+ 0003 01 BROKEN
+ 0004 01 OVERCAST
+ 0005 01 RESERVED
+ 0006 01 SCATTERED/BROKEN (MANY FORECASTS USE SCATTERED/BROKEN
+ 0007 01 BROKEN/OVERCAST (BROKEN/OVERCAST FOLLOWED BY CLOUD TYPE(S))
+ 0008 01 ISOLATED (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE CB)
+ 0009 01 ISOLATED EMBEDDED (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE CB)
+ 0010 01 OCCASIONAL (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE CB)
+ 0011 01 OCCASIONAL EMBEDDED (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE CB)
+ 0012 01 FREQUENT (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE CB)
+ 0013 02 DENSE (USED ON AVIATION CHARTS TO DESCRIBE CLOUD THAT WOULD CAUSE
+ SUDDEN CHANGES IN VISIBILITY (LESS THAN 1000M))
+ 0014 01 LAYERS
+ 0015 01 OBSCURED (OBSC)
+ 0016 01 EMBEDDED (EMBD)
+ 0017 01 FREQUENT EMBEDDED
+ 0031 01 MISSING VALUE
+020009 0006 0000 01 RESERVED
+ 0001 01 NSC MIL SIGNIFICANT CLOUD
+ 0002 01 CAVOK
+ 0003 01 SKC SKY CLEAR
+ 0004 01 NSW NIL SIGNIFICANT WEATHER
+ 0015 01 MISSING VALUE
+020011 0011 0000 01 0 0
+ 0001 01 1 OKTA OR LESS, BUT NOT ZERO 1/10 OR LESS, BUT NOT ZERO
+ 0002 01 2 OKTAS 2/10 - 3/10
+ 0003 01 3 OKTAS 4/10
+ 0004 01 4 OKTAS 5/10
+ 0005 01 5 OKTAS 6/10
+ 0006 01 6 OKTAS 7/10 - 8/10
+ 0007 01 7 OKTAS OR MORE,BUT NOT 8 OKTAS9/10 OR MORE, BUT NOT 10/10
+ 0008 01 8 OKTAS 10/10
+ 0009 01 SKY OBSCURED BY FOG AND OR OTHER METEOROLOGICAL PHENOMENA
+ 0015 02 CLOUD COVE IS INDISCERNIBLE FOR REASONS OTHER THAN FOG OR OT
+ HER METEOROLOGICAL PHENOMENA, OR OBSERVATION IS NOT MADE
+020012 0045 0000 01 CIRRUS (CI)...............CI
+ 0001 01 CIRROCUMULUS (CC).........CC
+ 0002 01 CIRROSTRATUS (CS).........CS
+ 0003 01 ALTOCUMULUS (AC).........AC
+ 0004 01 ALTOSTRATUS (AS).........AS
+ 0005 01 NIMBOSTRATUS (NS).........NS
+ 0006 01 STRATOCUMULUS(SC).........SC
+ 0007 01 STRATUS (ST).........ST
+ 0008 01 CUMULUS (CU).........CU
+ 0009 01 CUMULONIMBUS (CB).........CB
+ 0010 01 NO CH CLOUDS
+ 0011 02 CIRRUS FIBRATUS, SOMETIMES UNCINUS, NOT PROGRESSIVELY INADIN
+ G THE SKY
+ 0012 04 CIRRUS SPISSATUS, IN PATCHES OR ENTANGLED SHEAVES, WHICH USU
+ ALLY DO NOT INCREASE AND SOMETIMES SEEM TO BE THE REMAINS OF
+ THE UPPER PART OF A CUMULONIMBUS; OR CIRRUS CASTELLANUS OR
+ FLOCCUS
+ 0013 01 CIRRUS SPISSATUS CUMULONIMBOGENITUS
+ 0014 02 CIRRUS UNCINUS OR FIBRATUS,OR BOTH, PROGRESSIVELY INVADING T
+ HE SKY ; THEY GENERALLY THICKEN AS A WHOLE
+ 0015 04 CIRRUS (OFTEN IN BANDS) AND CIRROSTRATUS, OR CIRROSTRATUS AL
+ ONE, PROGRESSIVELY INVADING THE SKY; THEY GENERALLY THICKEN
+ ASA WHOLE, BUT THE CONTINUOUS VEIL DOES NOT REACH 45 DEGREES
+ ABOVE THE HORIZON
+ 0016 05 CIRRUS (OFTEN IN BANDS) AND CIRROSTRATUS, OR CIRROSTRATUS AL
+ ONE, PROGRESSIVELY INVADING THE SKY; THEY GENERALLY THICKEN
+ ASA WHOLE, BUT THE CONTINUOUS VEIL EXTENDS MORE THAN 45 DEGR
+ REES ABOVE THE HORIZON, WITHOUT THE SKY BEING TOTALLY COVERE
+ D
+ 0017 01 CIRROSTRATUS COVERING THE WHOLE SKY
+ 0018 02 CIRROSTRATUS NOT PROGRESSIVELY INVADING THE SKY AND NOT ENTI
+ RELY COVERING IT
+ 0019 02 CIRROCUMULUS ALONE, OR CIRROCUMULUS PREDOMINANT AMONG THE CH
+ CLOUDS
+ 0020 01 NO CM CLOUDS
+ 0021 01 ALTOSTRATUS TRANSLUCIDUS
+ 0022 01 ALTOSTRATUS OPACUS OR NIMBOSTRATUS
+ 0023 01 ALTOCUMULUS TRANSLUCIDUS AT A SINGLE LEVEL
+ 0024 02 PATCHES (OFTEN LENTICULARIS) OF ALTOCUMULUS TRANSLUCIDUS, CO
+ NTINUALLY CHANGING AND OCCURING AT ONE OR MORE LEVELS
+ 0025 04 ALTOCUMULUS TRANSLUCIDUS IN BANDS, OR ONE OR MORE LAYERS OF
+ ALTOCUMULUS TRANSLUCIDUS OR OPACUS, PROGRESSIVELY INVADING T
+ HE SKY; THESE ALTOCUMULUS CLOUDS GENERALLY THICKEN AS A WHOL
+ E
+ 0026 01 ALTOCUMULUS CUMULOGENITUS (OR CUMULONIMBOGENITUS)
+ 0027 04 ALTOCUMULUS TRANSLUCIDUS OR OPACUS IN TWO OR MORE LAYERS, OR
+ ALTOCUMULUS OPACUS IN A SINGLE LAYER, NOT PROGRESSIVELY INV
+ ADING THE SKY, OR ALTOCUMULUS WITH ALTOSTRATUS OR NIMBOSTRAT
+ US
+ 0028 01 ALTOCUMULUS CASTELLANUS OR FLOCUS
+ 0029 01 ALTOCUMULUS OF CHAOTIC SKY, GENERALLY AT SEVERAL LEVELS
+ 0030 01 NO CL CLOUDS
+ 0031 02 CUMULUS HUMILIS OR CUMULUS FRACTUS OTHER THAN OF BAD WEATHER
+ , OR BOTH
+ 0032 03 CUMULUS MEDIOCRIS OR CONGESTUS, WITH OR WITHOUT CUMULUS OF S
+ PECIES FRACTUS OR HUMULIS OR STRATOCUMULUS, ALL HAVING THEIR
+ BASES AT THE SAME LEVEL
+ 0033 02 CUMULONIMBUS CALVUS, WITH OR WITHOUT CUMULUS, STRATOCUMULUS
+ OR STRATUS
+ 0034 01 STRATOCUMULUS CUMULOGENITUS
+ 0035 01 STRATOCUMULUS OTHER THAN STRATOCUMULUS CUMULOGENITUS
+ 0036 02 STRATUS NEBULOSUS OR STRATUS FRACTUS OTHER THAN OF BAD WEATH
+ ER, OR BOTH
+ 0037 02 STRATUS FRACTUS OR CUMULUS FRACTUS OF BAD WEATHER, OR BOTH
+ (PANNUS), USUALLY BELOW ALTOSTRATUS OR NIMBOSTRATUS
+ 0038 02 CUMULUS AND STRATOCUMULUS OTHER THAN STRATOCUMULUS CUMULOGEN
+ ITUS, WITH BASES AT DIFFERENT LEVELS
+ 0039 03 CUMULONIMBUS CAPILLATUS (OFTEN WITH AN ANVIL), WITH OR WITHO
+ UT CUMULONIMBUS CALVUS, CUMULUS, STRATOCUMULUS, STRATUS OR P
+ ANNUS
+ 0059 02 CLOUD NOT VISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDSTO
+ RM, OR OTHER ANALOGOUS PHENOMENA
+ 0060 03 CH CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA, OR BECAUSE OF A CONTINUOUS
+ LAYER OF LOWER CLOUDS
+ 0061 03 CM CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA, OR BECAUSE OF A CONTINUOUS
+ LAYER OF LOWER CLOUDS
+ 0062 02 CL CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA
+ 0063 01 MISSING VALUE
+020017 0011 0000 01 ISOLATED CLOUD OR FRAGMENTS OF CLOUD
+ 0001 01 CONTINUOUS CLOUD
+ 0002 01 BROKEN CLOUD - SMALL BREAKS, FLAT TOPS
+ 0003 01 BROKEN CLOUD - LARGE BREAKS, FLAT TOPS
+ 0004 01 CONTINUOUS CLOUD
+ 0005 01 BROKEN CLOUD - SMALL BREAKS, UNDULATED TOPS
+ 0006 01 BROKEN CLOUD - LARGE BREAKS, UNDULATED TOPS
+ 0007 02 CONTINUOUS OR ALMOST CONTINUOUS WAVES WITH TOWERING CLOUDS A
+ BOVE THE TOP OF THE LAYER
+ 0008 02 GROUPS OF WAVES WITH TOWERING CLOUDS ABOVE THE TOP OF THE LA
+ YER
+ 0009 01 TWO OR MORE LAYERS AT DIFFERENT LEVELS
+ 0015 01 MISSING VALUE
+020018 0004 0000 01 INCREASING (U)
+ 0001 01 DECREASING (D)
+ 0002 01 NO DISTINCT CHANGE (N)
+ 0003 01 MISSING VALUE
+020021 0024 0001 01 PRECIPITATION-UNKNOWN TYPE
+ 0002 01 LIQUID PRECIPITATION NOT FREEZING
+ 0003 01 LIQUID FREEZING PRECIPITATION
+ 0004 01 DRIZZLE
+ 0005 01 RAIN
+ 0006 01 SOLID PRECIPITATION
+ 0007 01 SNOW
+ 0008 01 SNOW GRAINS
+ 0009 01 SNOW PELLETS
+ 0010 01 ICE PELLETS
+ 0011 01 ICE CRYSTALS
+ 0012 01 DIAMOND DUST
+ 0013 01 SMALL HAIL
+ 0014 01 HAIL
+ 0015 01 GLAZE
+ 0016 01 RIME
+ 0017 01 SOFT RIME
+ 0018 01 HARD RIME
+ 0019 01 CLEAR ICE
+ 0020 01 WET SNOW
+ 0021 01 HOAR FROST
+ 0022 01 DEW
+ 0023 01 WHITE DEW
+ 0030 01 ALL 30 MISSING VALUE
+020022 0007 0000 01 NO PRECIPITATION
+ 0001 01 CONTINUOUS
+ 0002 01 INTERMITTENT
+ 0003 01 SHOWER
+ 0004 01 NOT REACHING GROUND
+ 0005 01 DEPOSITION
+ 0015 01 MISSING VALUE
+020023 0012 0001 01 DUST/SAND WHIRL
+ 0002 01 SQUALLS
+ 0003 01 SAND STORM
+ 0004 01 DUST STORM
+ 0005 01 LIGHTNING - CLOUD TO SURFACE
+ 0006 01 LIGHTNING - CLOUD TO CLOUD
+ 0007 01 LIGHTNING - DISTANT
+ 0008 01 THUNDERSTORM
+ 0009 01 FUNNEL CLOUD NOT TOUCHING SURFACE
+ 0010 01 FUNNEL CLOUD TOUCHING SURFACE
+ 0011 01 SPRAY
+ 0012 01 WATER-SPOUT
+020024 0007 0000 01 NO PHENOMENA
+ 0001 01 LIGHT
+ 0002 01 MODERATE
+ 0003 01 HEAVY
+ 0004 01 VIOLENT
+ 0005 01 SEVERE (VAL)
+ 0007 01 MISSING VALUE
+020025 0011 0001 01 FOG
+ 0002 01 ICE FOG
+ 0003 01 STEAM FOG
+ 0007 01 MIST
+ 0008 01 HAZE
+ 0009 01 SMOKE
+ 0010 01 VOLCANIC ASH
+ 0011 01 DUST
+ 0012 01 SAND
+ 0013 01 SNOW
+ 0021 01 ALL 21 MISSING VALUE
+020026 0014 0000 01 NO CHANGE
+ 0001 01 SHALLOW
+ 0002 01 PATCHES
+ 0003 01 PARTIAL
+ 0004 01 FREEZING
+ 0005 01 LOW DRIFTING
+ 0006 01 BLOWING
+ 0007 01 INCREASING
+ 0008 01 DECREASING
+ 0009 01 IN SUSPENSION IN THE AIR
+ 0010 01 WALL
+ 0011 01 DENSE
+ 0012 01 WHITEOUT
+ 0015 01 MISSING VALUE
+020027 0007 0001 01 AT TIME OF OBSERVATION
+ 0002 01 IN PAST HOUR
+ 0003 01 IN TIME PERIOD FOR PAST WEATHER W1W2
+ 0004 01 IN TIME PERIOD SPECIFIED
+ 0006 01 BELOW STATION LEVEL
+ 0007 01 AT THE STATION
+ 0008 01 IN THE VICINITY
+ 0009 01 ALL 9 MISSING VALUE
+020029 0004 0000 01 NO RAIN
+ 0001 01 RAIN
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020032 0006 0000 01 ICE NOT BUILDING UP
+ 0001 01 ICE BUILDING UP SLOWLY
+ 0002 01 ICE BUILDING UP QUICKLY
+ 0003 01 ICE MELTING OR BREAKING UP SLOWLY
+ 0004 01 ICE MELTING OR BREAKING UP RAPIDLY
+ 0007 01 MISSING VALUE
+020033 0004 0001 01 ICING FROM OCEAN SPRAY
+ 0002 01 ICING FROM FOG
+ 0003 01 ICING FROM RAIN
+ 0004 01 MISSING VALUE
+020034 0012 0000 01 NO SEA ICE IN SIGHT
+ 0001 02 SHIP IN OPEN LEAD MORE THAN 1.0 NAUTICAL MILE WIDE, OR SHIP
+ IN FAST ICE WITH BOUNDARY BEYOND LIMIT OF VISIBILITY
+ 0002 04 SEA ICE PRESENT IN CONCETRATION LESS THAN 3/10 (3/8), OPEN W
+ ATER OR VERY OPEN PACK ICE, SEA ICE CONCETRATION IS UNIFORM
+ IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL
+ MILE OF ICE EDGE
+ 0003 03 4/10 TO 6/10 (3/8 TO LESS THAN 6/8) ,OPEN PACK ICE, SEA ICE
+ CONCETRATION IS UNIFORM IN THE OBSERVATION AREA, SHIP IN ICE
+ OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0004 03 7/10 TO 8/10 (6/8 TO LESS THAN 7/8), CLOSE PACK ICE, SEA ICE
+ CONCETRATION IS UNIFORM IN THE OBSERVATION AREA, SHIP IN IC
+ E OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0005 04 9/10 OR MORE, BUT NOT 10/10 (7/8 TO LESS THAN 8/8), VERY CLO
+ SE PACK ICE, SEA ICE CONCETRATION IS UNIFORM IN THE OBSERVAT
+ ION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE EDG
+ E
+ 0006 03 STRIPS AND PATCHES OF PACK ICE WITH OPEN WATER BETWEEN, SEA
+ ICE CONCENTRATION IS NOT UNIFORM IN THE OBSERVATION AREA, SH
+ IP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0007 04 STRIPS AND PATCHES OF CLOSE OR VERY CLOSE PACK ICE WITH AREA
+ S OF LESSER CONCENTRATION BETWEEN, SEA ICE CONCETRATION IS N
+ OT UNIFORM IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.
+ 5 NAUTICAL MILE OF ICE EDGE
+ 0008 04 FAST ICE WITH OPEN WATER,VERY OPEN OR OPEN PACK ICE TO SEAWA
+ RD OF THE ICE BOUNDARY, SEA ICE CONCENTRATION IS NOT UNIFORM
+ IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL
+ MILE OF ICE EDGE
+ 0009 04 FAST ICE CLOSE OR VERY CLOSE PACK ICE TO SEAWARD OF THE ICE
+ BOUNDARY, SEA ICE CONCETRATION IS NOT UNIFORM IN THE OBSERVA
+ TION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE ED
+ GE
+ 0014 03 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY, O
+ R BECAUSE SHIP IS MORE THAN 0.5 NAUTICAL MILE AWAY FROM ICE
+ EDGE
+ 0015 01 MISSING VALUE
+020035 0012 0000 01 NO ICE OF LAND ORIGIN
+ 0001 01 1-5 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0002 01 6-10 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0003 01 11-20 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0004 01 UP TO AND INCLUDING 10 GROWLERS AND BERGY BITS - NO ICEBERGS
+ 0005 01 MORE THAN 10 GROWLERS AND BERGY BITS - NO ICEBERGS
+ 0006 01 1-5 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0007 01 6-10 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0008 01 11-20 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0009 02 MORE THAN 20 ICEBERGS,WITH GROWLERS AND BERGY BITS - A MAJOR
+ HAZARD TO NAVIGATION
+ 0014 02 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY OR
+ BECAUSE ONLY SEA ICE IS VISIBLE
+ 0015 01 MISSING VALUE
+020036 0012 0000 01 SHIP IN OPEN WATER WITH FLOATING ICE IN SIGHT
+ 0001 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS IMPROVING
+ 0002 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS NOT CHANGING
+ 0003 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS WORSENING
+ 0004 01 SHIP IN ICE DIFFICULT TO PENETRATE; CONDITIONS IMPROVING
+ 0005 01 SHIP IN ICE DIFFICULT TO PENETRATE; CONDITIONS NOT CHANGING
+ 0006 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE FORMING AND FLOES FREEZING TOGETHAR
+ 0007 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE UNDER SLIGHT PRESSURE
+ 0008 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE UNDER MODERATE OR SEVERE PRESSURE
+ 0009 01 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING. SHIP BESET.
+ 0030 01 UNABLE TO REPORT, BECAUSE OF DARKNESS OR LACK OF VISIBILITY
+ 0031 01 MISSING VALUE
+020037 0012 0000 01 NEW ICE ONLY (FRAZIL ICE, GREASE ICE, SLUSH, SHUGA)
+ 0001 01 NILAS OR ICE RIND, LESS THAN 10 CM THICK
+ 0002 01 YOUNG ICE(GREY ICE, GREY-WHITE ICE
+ 0003 01 PREDOMINANTLY NEW AND/OR YOUNG ICE WITH SOME FIRST-YEAR ICE
+ 0004 01 PREDOMINANTLY THIN FIRST-YEAR ICE WITH SOME NEW AND/OR YOUNG ICE
+ 0005 01 ALL THIN FIRST-YEAR ICE (30-70 CM THICK)
+ 0006 02 PREDOMINANTLY MEDIUM FIRST-YEAR ICE
+ (70-120 CM THICK) AND THICK FIRST-YEAR ICE (>120 CM
+ 0007 01 ALL MEDIUM AND THICK FIRST-YEAR ICE
+ 0008 02 PREDOMINANTLY MEDIUM AND THICK FIRST-YEAR ICE WITH SOME
+ OLD ICE (USUALLY MORE THAN 2 METRES THICK)
+ 0009 01 PREDOMINANTLY OLD ICE
+ 0030 03 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY OR BECAUSE
+ ONLY ICE OF LAND ORIGIN IS VISIBLE OR BECAUSE SHIP IS MORE THAN 0.5
+ NAUTICAL MILE AWAY FROM ICE EDGE
+ 0031 01 MISSING VALUE
+020040 0009 0000 01 DRIFT SNOW ENDED BEFORE THE HOUR OF OBSERVATION
+ 0001 01 INTENSITY DIMINISHING
+ 0002 01 NO CHANGE
+ 0003 01 INTENSITY INCREASING
+ 0004 01 CONTINUES, APART FROM INTERRUPTION LASTING LESS THAN 30 MINUTES
+ 0005 01 GENERAL DRIFT SNOW HAS BECOME DRIFT SNOW NEAR THE GROUND
+ 0006 01 DRIFT SNOW NEAR THE GROUND HAS BECOME GENERAL DRIFT SNOW
+ 0007 01 DRIFT SNOW HAS STARTED AGAIN AFTER AN INTERRUPTION OF MORE THAN 30 MINUTES
+ 0015 01 MISSING VALUE
+020041 0011 0000 01 NO ICING
+ 0001 01 LIGHT ICING
+ 0002 01 LIGHT ICING IN CLOUD
+ 0003 01 LIGHT ICING IN PRECIPITATION
+ 0004 01 MODERATE ICING
+ 0005 01 MODERATE ICING IN CLOUD
+ 0006 01 MODERATE ICING IN PRECIPITATION
+ 0007 01 SEVERE ICING
+ 0008 01 SEVERE ICING IN CLOUD
+ 0009 01 SEVERE ICING IN PRECIPITATION
+ 0015 01 MISSING VALUE
+020042 0004 0000 01 NO ICING
+ 0001 01 ICING PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020045 0004 0000 01 NO SLD CONDITIONS PRESENT
+ 0001 01 SLD CONDITIONS PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020050 0010 0000 01 RESERVED
+ 0001 01 1ST LOW CLOUD
+ 0002 01 2ND LOW CLOUD
+ 0003 01 3RD LOW CLOUD
+ 0004 01 1ST MEDIUM CLOUD
+ 0005 01 2ND MEDIUM CLOUD
+ 0006 01 3RD MEDIUM CLOUD
+ 0007 01 1ST HIGH CLOUD
+ 0008 01 2ND HIGH CLOUD
+ 0255 01 MISSING VALUE
+020055 0011 0000 01 CUMULUS, IF ANY, ARE QUITE SMALL
+ 0001 01 CUMULUS OF INTERMEDIATE SIZE
+ 0002 01 SWELLING CUMULUS
+ 0003 01 SWELLING CUMULUS WITH TOWERS
+ 0004 01 SWELLING CUMULUS WITH TOWERS HAVING PRONOUNCED TILT
+ 0005 01 TALL CUMULUS CONGESTUS
+ 0006 01 ISOLATED CUMULONIMBUS
+ 0007 01 NUMEROUS CUMULONIMBUS
+ 0008 01 CONTINUOUS DENSE MIDDLE CLOUDS
+ 0009 01 CONTINUOUS SHEETS OF MIDDLE CLOUDS
+ 0015 01 MISSING VALUE
+020056 0005 0000 01 UNKNOWN
+ 0001 01 WATER
+ 0002 01 ICE
+ 0003 01 MIXED
+ 0007 01 MISSING VALUE
+020062 0021 0000 02 SURFACE OF GROUND DRY (WITHOUT CRACKS AND NO APPRECIABLE
+ AMOUNT OF DUST OR LOOSE SAND)
+ 0001 01 SURFACE OF GROUND MOIST
+ 0002 02 SURFACE OF GROUND WET (STANDING WATER IN SMALL
+ OR LARGE POOLS ON SURFACE)
+ 0003 01 FLOODED WITHOUT SNOW
+ 0004 01 SURFACE OF GROUND FROZEN MEASURABLE ICE
+ 0005 01 GLAZE ON GROUND COVER
+ 0006 01 LOOSE DRY DUST OR SAND NOT COVERING GROUND COMPLETELY
+ 0007 01 THIN COVER OF LOOSE DRY DUST OR SAND COVERING GROUND COMPLETELY
+ 0008 02 MODERATE OR THICK COVER OF LOOSE DRY DUST OR SAND COVERING
+ GROUND COMPLETELY
+ 0009 01 EXTREMELY DRY WITH CRACKS
+ 0010 01 GROUND PREDOMINANTLY COVERED BY ICE
+ 0011 02 COMPACT OR WET SNOW (WITH OR WITHOUT ICE) COVERING LESS THAN
+ ONE-HALF OF THE GROUND
+ 0012 02 COMPACT OR WET SNOW (WITH OR WITHOUT ICE) COVERING AT LEAST
+ ONE-HALF OF THE GROUND BUT GROUND NOT COMPLETELY COVERED
+ 0013 01 EVEN LAYER OF COMPACT OR WET SNOW COVERING GROUND COMPLETELY
+ 0014 02 UNEVEN LAYER OF COMPACT OR WET SNOW COVERING GROUND
+ WITH SNOW OR COMPLETELY MEASURABLE ICE
+ 0015 01 LOOSE DRY SNOW COVERING LESS THAN ONE-HALF OF THE GROUND COVER
+ 0016 02 LOOSE DRY SNOW COVERING AT LEAST ONE-HALF OF THE
+ GROUND (BUT NOT COMPLETELY)
+ 0017 01 EVEN LAYER OF LOOSE DRY SNOW COVERING GROUND COMPLETELY
+ 0018 01 UNEVEN LAYER OF LOOSE DRY SNOW COVERING GROUND COMPLETELY
+ 0019 01 SNOW COVERING GROUND COMPLETELY; DEEP DRIFTS
+ 0031 01 MISSING VALUE
+020063 0001 0000 01 TO BE DEVELOPED
+020071 0011 0000 01 NO ASSESSMENT NO ASSESSMENT
+ 0001 01 LESS THAN 50 KM LESS THAN 1 PER SECOND
+ 0002 01 BETWEEN 50 AND 200 KM LESS THAN 1 PER SECOND
+ 0003 01 MORE THAN 200 KM LESS THAN 1 PER SECOND
+ 0004 01 LESS THAN 50 KM 1 OR MORE PER SECOND
+ 0005 01 BETWEEN 50 AND 200 KM 1 OR MORE PER SECOND
+ 0006 01 MORE THAN 200 KM 1 OR MORE PER SECOND
+ 0007 01 LESS THANK 50 KM RATE SO RAPID NUMBER CANNOT BE COUNTED
+ 0008 01 BETWEEN 50 AND 200 KM RATE SO RAPID NUMBER CANNOT BE COUNTED
+ 0009 01 MORE THAN 200 KM RATE SO RAPID NUMBER CANNOT BE COUNTED
+ 0015 01 MISSING VALUE
+020086 0008 0000 01 CLEAR AND DRY
+ 0001 01 DAMP
+ 0005 01 WET SNOW
+ 0006 01 SLUSH
+ 0007 01 ICE
+ 0008 01 COMPACTED OR ROLLED SNOW
+ 0009 01 FROZEN RUTS OR RIDGES
+ 0015 01 MISSING VALUE
+020090 0007 0000 01 RESERVED
+ 0001 01 NACREOUS CLOUDS
+ 0002 01 NOCTILUCENT CLOUDS
+ 0003 01 CLOUDS FROM WATERFALLS
+ 0004 01 CLOUDS FROM FIRES
+ 0005 01 CLOUDS FROM VULCANIC ERUPTIONS
+ 0015 01 MISSING VALUE
+020101 0010 0001 01 SCHISTOCERCA GREGARIA
+ 0002 01 LOCUSTA MIGRATORIA
+ 0003 01 NOMADACRIS SEPTEMFASCIATA
+ 0004 01 OEDALEUS SENAGALENSIS
+ 0005 01 ANRACRIDIUM SPP
+ 0006 01 OTHER LOCUST
+ 0007 01 OTHER GRASSHOPPERS
+ 0008 01 ITHER CRICKETS
+ 0009 01 SPODOPTERA EXEMPTA
+ 0015 01 MISSING VALUE
+020102 0011 0000 01 GREEN
+ 0001 01 GREEN AND BLACK
+ 0002 01 BLACK
+ 0003 01 YELLOW AND BLACK
+ 0004 01 STRAW/GREY
+ 0005 01 PINK
+ 0006 01 DARK RED/BROWN
+ 0007 01 MIXED RED AND YELLOW
+ 0008 01 YELLOW
+ 0009 01 OTHER
+ 0015 01 MISSING VALUE
+020151 0003 0000 01 FIRST YEAR ICE
+ 0001 01 MULTI YEAR ICE
+ 0007 01 MISSING
+020252 0003 0000 01 NO EDGE
+ 0001 01 EDGE PRESENT
+ 0007 01 MISSING
+020253 0007 0000 01 LAND
+ 0001 01 VEGETATION COVERED LAND
+ 0002 01 RESERVED
+ 0003 01 ICE
+ 0004 01 POSSIBLE ICE
+ 0005 01 OCEAN
+ 0006 01 COAST
+ 0007 01 MISSING
+021066 0011 0001 01 PROCESSING EQUIPMENT NOT WORKING
+ 0002 01 EQUIPMENT FAILED
+ 0003 01 PRF CODE CHANGED DURING IMAGE GENERATION
+ 0004 01 SAMPLINH WINDOW CHANGED DURING IMAGE GENERATION
+ 0005 01 GAIN CHANGED DURING IMAGE GENERATION
+ 0006 01 CHIRP REPLICA EXCEEDS SPECIFIC VALUE
+ 0007 02 INPUT DATA MEAN AND STANDARD DEVIATION OF IN-PHASE AND
+ QUADRATURE OUT OF RANGE
+ 0008 01 DOPPLER CENTROID CONFIDENCE > MMCC VALUE
+ 0009 01 DOPPLER CENTROID ABSOLUTE VALUE > PRF/2
+ 0010 01 DOPPLER AMBIGUITY CONFIDENCE < MMCC VALUE
+ 0011 01 OUTPUT DATA MEAN AND STANDARD DEVIATION =< MMCC VALUE
+021067 0012 0001 01 NO FOREBEAM CALCULATION
+ 0002 01 NO MIDBEAM CALCULATION
+ 0003 01 NO AFTBEAM CALCULATION
+ 0004 01 FOREBEAM ARCING DETECTED
+ 0005 01 MID ARCING DETECTED
+ 0006 01 AFTBEAM ARCING DETECTED
+ 0007 01 ANY BEAM NOISE CONTENT ABOVE OR EQUAL TO TRESHOLD
+ 0008 01 LAND (ANY LAND IN CELL FOOTPRINT)
+ 0009 01 AUTONOMOUS AMBIGUITY REMOVAL NOT USED
+ 0010 01 METEOROLOGICAL BACKGROUND NOT USED
+ 0011 01 MINIMUM RESIDUAL EXCEEDED TRESHOLD
+ 0012 01 FRAME CHECKSUM ERROR DETECTED
+021068 0007 0001 01 STANDARD DEVIATION OF WIND SPEED OUTSIDE MMCC LIMIT
+ 0002 01 STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT OUTSIDE MMCC LIMIT
+ 0003 01 STANDARD DEVIATION OF ALTITUDE OUTSIDE MMCC LIMIT
+ 0004 01 MEAN PEAKINESS OUTSIDE MMCC LIMIT
+ 0005 01 FRAME CHECKSUM ERROR DETECTED
+ 0006 01 HEIGHT-TIME LOOP TIME CONSTANT CORRECTION NOT PERFORMED
+ 0007 01 NOT ENOUGH MEASUREMENTS ( N< 10)
+021069 0009 0001 01 12.0 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0002 01 11.0 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0003 01 3.7 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0004 01 1.6 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0005 02 CLOUD IDENTIFICATION USED 1.6 MICROMETERS
+ HISTOGRAM REFLECTANCE CLOUD TEST
+ 0006 02 1.6 MICROMETERS HISTOGRAM REFLECTANCE CLOUD
+ TEST USED DYNAMIC TRESHOLD
+ 0007 01 SUN GLINT DETECTED BY 1.6 MICROMETERS REFLECTANCE CLOUD TEST
+ 0008 01 3.7 MICROMETERS USED IN SEA-SURFACE TEMPERATURE RETRIEVAL
+ 0009 02 SEA-SURFACE TEMPERATURE DERIVATION USED DAYTIME DATA
+ (NIGHT-TIME IF ZERO)
+021070 0024 0001 01 CELL 1:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0002 01 CELL 2:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL CELL NUMBERING
+ 0003 01 CELL 3:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0004 01 CELL 4:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL NW NE
+ 0005 01 CELL 5:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 7 8 9
+ 0006 01 CELL 6:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 4 5 6
+ 0007 01 CELL 7:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 1 2 3
+ 0008 01 CELL 8:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL SW SE
+ 0009 01 CELL 9:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0010 01 -18 DUAL VIEW SST RETRIEVAL USED 3.7 MICRON CHANNEL (ONE BIT PER 10-ARCMIN CELL)
+ 0011 01 CELL 1:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0011 01 CELL 2:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL CELL NUMBERING
+ 0012 01 CELL 3:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0013 01 CELL 4:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL NW NE
+ 0014 01 CELL 5:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 7 8 9
+ 0015 01 CELL 6:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 4 5 6
+ 0016 01 CELL 7:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 1 2 3
+ 0017 01 CELL 8:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL SW SE
+ 0018 01 CELL 9:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0019 01 NADIR VIEW CONTAINS DAY-TIME DATA (NIGHT IF ZERO)
+ 0020 01 FORWARD VIEW CONTAINS DAY-TIME DATA (NIGHT IF ZERO)
+ 0021 02 RECORD CONTAINS CONTRIBUTIONS FROM INSTRUMENT SCANS ACQUIRED WHEN ERS PLATFORM NOT IN
+ YAW-STEERING MODE
+ 0022 02 RECORD CONTAINS CONTRIBUTIONS FROM INSTRUMENT SCANS FOR WHICH PRODUCT CONFIDENCE DATA
+ SHOW QUALITY IS POOR OR UNKNOWN
+ 0023 01 MISSING VALUE
+021072 0003 0001 01 HEIGHT ERROR CORRECTION APPLIED INSTEAD OF OPEN LOOP CALIBRATION
+ 0002 01 MICROWAVE SOUNDER USED FOR TROPOSPHERE CORRECTION
+ 0003 01 AGC OUTPUT CORRECTION APPLIED INSTED OF OPEN LOOP CALIBRATION
+021073 0008 0001 01 BLANK DATA RECORD
+ 0002 01 TEST
+ 0003 01 CALIBRATION (CLOSED LOOP)
+ 0004 01 BITE
+ 0005 01 ACQUISITION ON ICE
+ 0006 01 ACQUISITION ON OCEAN
+ 0007 01 TRACKING ON ICE
+ 0008 01 TRACKING ON OCEAN
+021076 0004 0000 01 LINEAR
+ 0001 01 LOGARITHMIC (BASE E)
+ 0002 01 LOGARITHMIC (BASE 10)
+ 0007 01 MISSING VALUE
+021109 0008 0001 01 NOT ENOUGH GOOD SIGMA-0 AVAILABLE FOR WIND RETRIEVAL
+ 0002 01 POOR AZIMUTH DIVERSITY AMONG SIGMA0- FOR WIND RETRIEVAL
+ 0008 01 SOME PORTION OF WIND VECTOR CELL IS OVER LAND
+ 0009 01 SOME PORTION OF WIND VECTOR CELL IS OVER ICE
+ 0010 01 WIND RETRIEVAL NOT PERFORMED FOR WIND VECTOR CELL
+ 0011 01 REPORTED WIND SPEED IS GREATER THAN 30 M/S
+ 0012 01 REPORTED WIND SPEED IS LESS THAN OR EQUAL TO 3 M/S
+ 0017 01 MISSING VALUE
+021115 0011 0001 01 SIGMA-0 MEASUREMENT IS NOT USABLE
+ 0002 01 SIGNAL TO NOISE RATIO IS LOW
+ 0003 01 SIGMA-0 IS NEGATIVE
+ 0004 01 SIGMA-0 IS OUTSIDE OF ACCEPTABLE RANGE
+ 0005 01 SCATTEROMETER PULSE QUALITY IS NOT ACCEPTABLE
+ 0006 01 SIGMA-0 CELL LOCATION ALGORITHM DOES NOT CONVERGE
+ 0007 01 FREQUENCY SHIFT LIES BEYOND THE RANGE OF THE X FACTOR TABLE
+ 0008 01 SPACECRAFT TEMPERATURE IS BEYOND CALIBRATION COEFFICIENT RANGE
+ 0009 01 NO APPLICABLE ATTITUDE RECORDS WERE FOUND FOR THIS SIGMA-0
+ 0010 01 INTERPOLATED EPHEMERIS DATA ARE NOT ACCEPTABLE FOR THIS SIGMA-0
+ 0017 01 MISSING VALUE
+021116 0016 0001 01 CALIBRATION/MEASUREMENT PULSE FLAG (1)
+ 0002 01 CALIBRATION/MEASUREMENT PULSE FLAG (2)
+ 0003 01 OUTER ANTENNA BEAM
+ 0004 01 SIGMA-0 CELL IS AFT OF SPACECRAFT
+ 0005 01 CURRENT MODE (1)
+ 0006 01 CURRENT MODE (2)
+ 0007 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (1)
+ 0008 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (2)
+ 0009 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (3)
+ 0010 01 LOW RESOLUTION MODE - WHOLE PULSE DATA
+ 0011 01 SCATTEROMETER ELECTRONIC SUBSYSTEM B
+ 0012 01 ALTERNATE SPIN RATE - 19.8 RPM
+ 0013 01 RECEIVER PROTECTION ON
+ 0014 01 SLICES PER COMPOSITE FLAG (1)
+ 0015 01 SLICES PER COMPOSITE FLAG (2)
+ 0016 01 SLICES PER COMPOSITE FLAG (3)
+021119 0014 0000 01 RESERVED
+ 0001 01 SASS
+ 0002 01 SASS2
+ 0003 01 NSCAT0
+ 0004 01 NSCAT1
+ 0005 01 NSCAT2
+ 0006 01 QSCAT0
+ 0007 01 QSCAT1
+ 0031 01 CMOD1
+ 0032 01 CMOD2
+ 0033 01 CMOD3
+ 0034 01 CMOD4
+ 0035 01 CMOD5
+ 0064 01 MISSING VALUE
+021144 0001 0001 01 RAIN
+021150 0004 0000 01 DATA FROM SINGLE GROUND STATION (NO CO-LOCATION)
+ 0001 01 DATA FROM MULTIPLE GROUND STATION (CO-LOCATED DATA)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021155 0016 0001 01 NOT ENOUGH GOOD SIGMA-0 AVAILABLE FOR WIND RETRIEVAL
+ 0002 01 POOR AZIMUTH DIVERSITY AMONG SIGMA-0 FOR WIND RETRIEVAL
+ 0003 01 ANY BEAM NOISE CONTENT ABOVE TRESHOLD
+ 0004 01 PRODUCT MONITORING NOT USED
+ 0005 01 PRODUCT MONITORING FLAG
+ 0006 01 KNMI QUALITY CONTROL FAILS
+ 0007 01 VARIATIONAL QUALITY CONTROL FAILS
+ 0008 01 SOME PORTION OF WIND VECTOR CELL IS OVER LAND
+ 0009 01 SOME PORTION OF WIND VECTOR CELL IS OVER ICE
+ 0010 01 WIND RETRIEVAL NOT PERFORMED FOR WIND VECTOR CELL
+ 0011 01 REPORTED WIND SPEED IS GREATER THAN 30 M/S
+ 0012 01 REPORTED WIND SPEED IS LESS THAN OR EQUAL TO 3 M/S
+ 0013 01 RAIN FLAG FOR THE WIND VECTOR CELL IS NOT USABLE
+ 0014 01 RAIN FLAG ALGORITHM DETECTS RAIN
+ 0015 01 NO METEOROLOGICAL BACKGROUND USED
+ 0016 01 DATA ARE REDUNDANT
+021158 0004 0000 01 ACCEPTABLE
+ 0001 01 NOT ACCEPTABLE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021159 0004 0000 01 GOOD
+ 0001 01 USABLE
+ 0002 01 BAD
+ 0003 01 MISSING VALUE
+021169 0004 0000 01 NO ICE PRESENT
+ 0001 01 ICE PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021196 0012 0001 01 PROCESSING EQUIPMENT NOT WORKING
+ 0002 01 EQUIPMENT FAILED
+ 0003 01 PRF CODE CHANGED DURING IMAGE GENERATION
+ 0004 01 SAMPLING WINDOW CHANGED DURING IMAGE GENERATION
+ 0005 01 GAIN CHANGED DURING IMAGE GENERATION
+ 0006 01 CHIRP REPLICA EXCEEDS SPECIFIED VALUE
+ 0007 01 INPUT DATA MEAN AND STANDARD DEVIATION OF I AND Q OUT OF RANGE
+ 0008 01 DOPPLER CENTROID CONFIDENCE > MMCC VALUE
+ 0009 01 DOPPLER CENTROID ABSOLUTE VCALUE > PRF/2
+ 0010 01 DOPPLER AMBIGUITY CONFIDENCE < MMCC VALUE
+ 0011 01 OUTPUT DATA MEAN AND STANDARD DEVIATION <= MMCC VALUE
+ 0012 01 MISSING VALUE
+021199 0007 0001 01 3.7 MICRO CHANNEL USED IN ASST DERIVATION
+ 0002 01 ASST DERIVATION USED DATTIME DATA
+ 0003 02 COMPARISON OF ASST AGAINST PREVIOUS
+ EQUIVALENT PASS PERFORMED
+ 0004 02 COMPARISON OF ASST AGAINST WEEKLY AVERAGE
+ OF ASST PERFORMED
+ 0005 01
+ 0006 02 COMPARISON OF RATE OF CHANGE OF ASST AGAINST
+ STATIC TRESHOLD PERFORMED
+ 0007 01 MISSING VALUE
+022056 0004 0000 01 UPWARDS PROFILE
+ 0001 01 DOWNWARDS PROFILE
+ 0002 01 HORIZONTAL
+ 0003 01 MISSING VALUE
+022060 0004 0000 01 DROGUE IS DETACHED
+ 0001 01 DROGUE IS ATTACHED
+ 0002 01 DROGUE STATUS UNKNOWN
+ 0007 01 MISSING VALUE
+022061 0011 0000 01 CALM (GLASSY) HEIGHT 0 M
+ 0001 01 CALM (RIPPLED) HEIGHT 0 - 0.1 M
+ 0002 01 SMOOTH (WAVELETS) HEIGHT 0.1 - 0.5 M
+ 0003 01 SLIGHT HEIGHT 0.5 - 1.5 M
+ 0004 01 MODERATE HEIGHT 1.25 - 2.5 M
+ 0005 01 ROUGH HEIGHT 2.5 - 4 M
+ 0006 01 VERY ROUGH HEIGHT 4 - 6 M
+ 0007 01 HIGH HEIGHT 6 - 9 M
+ 0008 01 VERY HIGH HEIGHT 9 -14 M
+ 0009 01 PHENOMANAL HEIGHT OVER 14 M
+ 0015 01 MISSING VALUE
+022067 0001 0000 01 SEE COMMON CODE TABLE C3
+022068 0001 0000 01 SEE COMMON CODE TABLE C4
+022120 0013 0000 01 GOOD DATA
+ 0001 01 MAXIMUM (HIGH) WATER LEVEL LIMIT EXCEEDED
+ 0002 01 MINIMUM (LOW) WATER LEVEL LIMIT EXCEEDED
+ 0003 01 RATE OF CHANGE LIMIT FOR WATER LEVEL EXCEEDED
+ 0004 01 FLAT LIMIT FOR WATER LEVEL EXCEEDED
+ 0005 01 OBSERVED MINUS PREDICTED WATER LEVEL VALUE LIMIT EXCEEDED
+ 0006 02 OBSERVED VALUE FROM PRIMARY WATER LEVEL SENSOR MINUS
+ BACKUP WATER LEVEL SENSOR
+ 0007 01 VALUE EXCEEDED SPECIFIED TOLERANCE FROM EXPECTED VALUE
+ 0008 01 WATER LEVEL QA PARAMETER (SIGMAS AND/OR OUTLIERS) LIMITS EXCEEDED
+ 0009 01 SEA TEMPERATURE OUTSIDE OF EXPECTED RANGE
+ 0010 01 MULTIPLE QC CHECKS (ABOVE) FAILED
+ 0011 01 NO AUTOMATED WATER LEVEL CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022121 0009 0000 01 OPERATIONAL
+ 0001 01 POSSIBLE CLOGGING PROBLEM OR OTHERWISE DEGRADED WATE LEVEL DATA
+ 0002 01 POSSIBLE DATUM SHIFT
+ 0003 01 UNKNOWN STATUS OF WATER LEVEL SENSOR
+ 0004 01 SUSPECTED OR KNOWN SEA TEMPERATURE SENSOR PROBLEM
+ 0005 01 MULTIPLE POSSIBLE PROBLEMS (ABOVE)
+ 0006 01 BAD DATA- DO NOT DISSEMINATE
+ 0007 01 NO MANUAL WATER LEVEL CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022122 0008 0000 01 GOOD DATA FROM ALL SENSORS
+ 0001 01 WIND DIRECTION OUTSIDE OF ALLOWABLE RANGE
+ 0002 01 WIND SPEED OUTSIDE OF EXPECTED RANGE
+ 0003 01 BAROMETRIC PRESSURE OUTSIDE OF EXPECTED RANGE
+ 0004 01 AIR TEMPERATURE OUTSIDE OF EXPECTED RANGE
+ 0005 01 MULTIPLE SENSOR FAILED QC CHECKS
+ 0006 01 NO AUTOMATED METEOROLOGICAL DATA CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022123 0009 0000 01 OPERATIONAL
+ 0001 01 SUSPECTED OR KNOWN PROBLEM WITH WIND SENSOR
+ 0002 01 SUSPECTED OR KNOWN PROBLEM WITH BAROMETRIC PRESSURE SENSOR
+ 0003 01 SUSPECTED OR KNOWN PROBLEM WITH AIR TEMPERATURE SENSOR
+ 0004 01 UNKNOWN STATUS OF ALL SENSORS
+ 0005 01 SUSPECTED OR KNOWN PROBLEMS WITH MULTIPLE SENSORS
+ 0006 01 BAD DATA - DO NOT DISSEMINATE
+ 0007 01 NO MANUAL METEOROLOGICAL DATA CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022252 0006 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND
+ PASSED
+ 0002 02 AUTOMATIC QUALITY CONTROL PASSED AND MAGNOLIA CHECKED AND
+ DELETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND
+ FAILED
+ 0005 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND
+ RE-INSERTED
+023001 0005 0000 01 RESERVED
+ 0001 01 ARTICLES 1 AND 2
+ 0002 01 ARTICLE 3
+ 0003 01 ARTICLE 5.2
+ 0007 01 MISSING VALUE
+023002 0016 0000 01 RESERVED
+ 0001 01 NUCLEAR REACTOR ON GROUND
+ 0002 01 NUCLEAR REACTOR ON SEA
+ 0003 01 NUCLEAR REACTOR IN SPACE
+ 0004 01 NUCLEAR FULE FACILITY
+ 0005 01 RADIOACTIVE WASTE MANAGMENT FACITILY
+ 0006 01 TRANSPORT OF NUCLEAR FUEL OR RADIOACTIVE WASTE
+ 0007 01 STORAGE OF NUCLEAR FUEL OR RADIOACTIVE WASTE
+ 0008 01 MANUFACTURE OF RADIO-ISOTOPES
+ 0009 01 USE OF RADIO-ISOTOPES
+ 0010 01 STORAGE OF RADIO-ISOTOPES
+ 0011 01 DISPOSAL OF RADIO-ISOTOPS
+ 0012 01 TRANSPORT OF RADIO-ISOTOPES
+ 0013 01 USE OF RADIO-ISOTOPES FOR POWER GENERATION
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+023003 0008 0000 01 NO RELEASE
+ 0001 01 RELEASE TO ATMOSPHERE
+ 0002 01 RELEASE TO WATER
+ 0003 01 RELEASE TO BOTH ATMOSPHERE AND WATER
+ 0004 01 EXPECTED RELEASE TO ATMOSPHERE
+ 0005 01 EXPECTED RELEASE TO WATER
+ 0006 01 EXPECTED RELEASE TO BOTH ATMOSPHERE AND WATER
+ 0007 01 MISSING VALUE
+023004 0006 0000 01 NO COUNTERMEASURE
+ 0001 01 EVACUATION
+ 0002 01 SHELTERING
+ 0003 01 PROPHILAXIS
+ 0004 01 WATER
+ 0007 01 MISSING VALUE
+023005 0004 0000 01 INCIDENT STAT DOES NOT UNDERSTAND WHAT HAPPENED
+ 0001 01 INCIDENT STATE KNOWS THE CAUSE OF THE INCIDENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023006 0008 0000 01 NO IMPROVEMENT
+ 0001 01 UNSTABLE
+ 0002 01 NO DETERIORATION
+ 0003 01 IMPROVING
+ 0004 01 STABLE
+ 0005 01 DETERIORATING
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+023007 0005 0000 01 NO RELEASE
+ 0001 01 RELEASE HAS STOPPED
+ 0002 01 RELEASE
+ 0003 01 RELEASE IS CONTINUING
+ 0007 01 MISSING VALUE
+023008 0004 0000 01 GASEUS
+ 0001 01 PARTICULATE
+ 0002 01 MIXTURE OF GASEUS AND PARTICULATE
+ 0003 01 MISSING VALUE
+023009 0004 0000 01 GASEUS
+ 0001 01 PARTICULATE
+ 0002 01 MIXTURE OF GASEUS AND PARTICULATE
+ 0003 01 MISSING VALUE
+023016 0004 0000 01 NO SIGNIFICANT TOXIC HEALTH EFFECT
+ 0001 01 SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT POSSIBLE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023018 0006 0000 01 RELEASE NO LONGER OCCURRING
+ 0001 01 RELEASE STILL OCCURRING
+ 0002 01 RELEASE EXPECTED TO INCREASE IN NEXT SIX HOURS
+ 0003 01 RELEASE EXPECTED TO REMAIN CONSTANT IN NEXT SIX HOURS
+ 0004 01 RELEASE EXPECTED TO DECREASE IN NEXT SIX HOURS
+ 0007 01 MISSING VALUE
+023031 0004 0000 01 PLUME WILL NOT ENCOUNTER RAIN IN INCIDENT STATE
+ 0001 01 PLUME WILL ENCOUNTER RAIN IN INCIDENT STATE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023032 0004 0000 01 NO SIGNIFICANT CHANGE EXPECTED WITHIN NEXT SIX HOURS
+ 0001 01 ANTICIPATED SIGNIFICANT CHANGE EXPECTED WITHIN NEXT SIX HOURS
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+024003 0005 0000 01 NOBLE GASES
+ 0001 01 IODINES
+ 0002 01 CAESIUM
+ 0003 01 TRANSURANICS
+ 0031 01 MISSING VALUE
+025004 0004 0000 01 INCOHERENT
+ 0001 01 COHERENT (DOPPLER)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025005 0004 0000 01 LOGATITHM - 2.5 DB
+ 0001 01 LINEAR
+ 0002 01 SPECIAL
+ 0003 01 MISSING VALUE
+025006 0005 0000 01 ZH TO R CONVERSION
+ 0001 01 (ZH, ZDR) TO (NO.DO) TO R
+ 0002 01 (Z(F1),Z(F2)) TO ATTENUATION TO R
+ 0006 01 OTHER
+ 0007 01 MISSING VALUE
+025009 0004 0001 01 NONE
+ 0002 01 CALIBRATION TARGET OR SIGNAL
+ 0003 01 AGAINST RAINGAGES
+ 0004 01 AGAINST OTHER INSTRUMENTS (DISTROMETER-ATTENUATION)
+025010 0008 0000 01 NONE
+ 0001 01 MAP
+ 0002 01 INSERTION OF HIGHER ELEVATION DATA AND MAP
+ 0003 01 ANALYSIS OF FLUCTUATING LOGARITHM SIGNAL (CLUTTER DETECTION)
+ 0004 01 EXTRACTION OF FLUCTUATING PART OF LINEAR SIGNAL (CLUTTER SUPPRESSION)
+ 0005 01 CLUTTER SUPPRESSION DOPPLER
+ 0006 01 MULTIPARAMETER ANALYSIS
+ 0015 01 MISSING VALUE
+025011 0004 0000 01 NONE
+ 0001 01 MAP OF CORRECTION FACTORS
+ 0002 01 INTERPOLATION (AZIMUTH OR ELEVATION)
+ 0003 01 MISSING VALUE
+025012 0004 0000 01 HARDWARE
+ 0001 01 SOFTWARE
+ 0002 01 HARDWARE AND SOFTWARE
+ 0003 01 MISSING VALUE
+025013 0001 0001 01 BRIGHT BAND CORRECTION
+025015 0001 0001 01 RADOME ATTENUATION CORRECTION
+025017 0001 0001 01 PRECIPITATION ATTENUATION CORRECTION
+025020 0004 0000 01 FTT (FAST FOURIER TRANSFORM
+ 0001 01 PPP (PULSE PAIR PROCESSING
+ 0002 01 VPC (VECTOR-PHASE CHANGE)
+ 0003 01 MISSING VALUE
+025021 0005 0001 01 SIMPLE AVERAGE
+ 0002 01 CONSENSUS AVERAGE
+ 0003 01 MEDIAN CHECK
+ 0004 01 VERTICAL CONSISTENCY CHECK
+ 0005 01 OTHER
+025030 0004 0000 01 RUNNING MEAN SEA-SURFACE TEMPERATURE NOT USED BECAUSE USAGE CRITERIA NOT MET
+ 0001 01 RUNNING MEAN SEA-SURFACE TEMPERATURE NOT USED BECAUSE DATA NOT AVAILABLE
+ 0002 01 RUNNING MEAN SEA-SURFACE TEMPERATURE USED AS PREDICTOR
+ 0003 01 MISSING VALUE
+025032 0004 0000 01 RESERVED
+ 0001 01 DATA FROM LOW MODE
+ 0002 01 DATA FROM HIGH MODE
+ 0003 01 MISSING VALUE
+025033 0004 0000 01 WIND PROFILER OPERATING IN SUBMODE A
+ 0001 01 WIND PROFILER OPERATING IN SUBMODE B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025034 0004 0001 01 TEST A PERFORMED AND FAILED
+ 0002 01 TEST B PERFORMED AND FAILED
+ 0003 01 TEST RESULTS INCONCLUSIVE
+025036 0004 0000 02 NETWORK OF SEVERAL DIRECTION-FINDERS OPERATING ON
+ THE SAME INDIVIDUAL ATMOSPHERICS
+ 0001 02 NETWORK OF SEVERAL ARRIVAL-TIME STATIONS OPERATING ON
+ THE SAME INDIVIDUAL ATMOSPHERICS
+ 0006 01 SINGLE STATION RANGE BEARING TECHNIQUE
+ 0015 01 MISSING VALUE
+025040 0010 0000 01 NON-SPECIFIC MODE
+ 0001 01 FIRST GUESS DATA
+ 0002 01 CLOUD DATA
+ 0003 01 AVERAGE VECTOR DATA
+ 0004 01 PRIMARY DATA
+ 0005 01 GUESS DATA
+ 0006 01 VECTOR DATA
+ 0007 01 TRACER DATA; THE IMAGE
+ 0008 01 TRACER DATA TO NEXT IMAGE
+ 0015 01 MISSING VALUE
+025041 0004 0000 01 DIRECTION ORIGINALLY REPORTED IN TRUE DEGREES
+ 0001 01 DIRECTION ORIGINALLY REPORTED USING CODE TABLE 0700, FM 13
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025042 0004 0000 01 SPEED ORIGINALLY REPORTED IN METERS PER SECOND
+ 0001 01 SPEED ORIGINALLY REPORTED USING CODE TABLE 2251, FM 13
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025045 0020 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+ 0007 01 CHANNEL 7 PRESENT - (SET TO 1 PRESENT)
+ 0008 01 CHANNEL 8 PRESENT - (SET TO 1 PRESENT)
+ 0009 01 CHANNEL 9 PRESENT - (SET TO 1 PRESENT)
+ 0010 01 CHANNEL 10 PRESENT - (SET TO 1 PRESENT)
+ 0011 01 CHANNEL 11 PRESENT - (SET TO 1 PRESENT)
+ 0012 01 CHANNEL 12 PRESENT - (SET TO 1 PRESENT)
+ 0013 01 CHANNEL 13 PRESENT - (SET TO 1 PRESENT)
+ 0014 01 CHANNEL 14 PRESENT - (SET TO 1 PRESENT)
+ 0015 01 CHANNEL 15 PRESENT - (SET TO 1 PRESENT)
+ 0016 01 CHANNEL 16 PRESENT - (SET TO 1 PRESENT)
+ 0017 01 CHANNEL 17 PRESENT - (SET TO 1 PRESENT)
+ 0018 01 CHANNEL 18 PRESENT - (SET TO 1 PRESENT)
+ 0019 01 CHANNEL 19 PRESENT - (SET TO 1 PRESENT)
+ 0020 01 CHANNEL 20 PRESENT - (SET TO 1 PRESENT)
+025046 0004 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+025047 0003 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+025048 0015 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+ 0007 01 CHANNEL 7 PRESENT - (SET TO 1 PRESENT)
+ 0008 01 CHANNEL 8 PRESENT - (SET TO 1 PRESENT)
+ 0009 01 CHANNEL 9 PRESENT - (SET TO 1 PRESENT)
+ 0010 01 CHANNEL 10 PRESENT - (SET TO 1 PRESENT)
+ 0011 01 CHANNEL 11 PRESENT - (SET TO 1 PRESENT)
+ 0012 01 CHANNEL 12 PRESENT - (SET TO 1 PRESENT)
+ 0013 01 CHANNEL 13 PRESENT - (SET TO 1 PRESENT)
+ 0014 01 CHANNEL 14 PRESENT - (SET TO 1 PRESENT)
+ 0015 01 CHANNEL 15 PRESENT - (SET TO 1 PRESENT)
+025049 0005 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+025051 0006 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+025053 0006 0001 01 GOOD
+ 0002 01 REDUNDANT
+ 0003 01 QUESTIONABLE
+ 0004 01 BAD
+ 0005 01 EXPERIMENTAL
+ 0006 01 PRECIPITATING
+025069 0007 0001 01 SMOOTHED
+ 0002 01 BASELINE ADJUSTED
+ 0003 01 NORMALIZED TIME INTERVAL
+ 0004 01 OUTLIER CHECKED
+ 0005 01 PLAUSIBILITY CHECKED
+ 0006 01 CONSISTENCY CHECKED
+ 0007 01 INTERPOLATED
+025086 0004 0000 01 DEPTHS ARE NOT CORRECTED
+ 0001 01 DEPTHS ARE CORRECTED
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025093 0003 0001 01 NO CORRECTION
+ 0002 01 VERTICAL VELOCITY CORRECTION
+ 0007 01 ALL CORRECTIONS
+025095 0001 0001 02 ALTIMETER OPERATING (SET TO 0 IF NOMINAL, SET TO
+ BACKUP)
+025096 0004 0001 01 MODE INDICATOR (0 IF MODE 2, 1 IF MODE 1)
+ 0002 03 MODE 1 CALIBRATION SEQUENCE INDICATOR (0 IF
+ NORMAL DATA TAKING EITHER MODE 1 OR 2, 1 IF MODE 1 CALIBRATION SEQUENCE)
+ BITS 3 AND 4 INDICATE ACTIVE 23.8 GHZ CHANNEL
+ 0003 01 CHANNEL 2 (0 IF ON, 1 IF OFF)
+ 0004 01 CHANNEL 3 (0 IF ON, 1 IF OFF)
+025097 0011 0000 01 RANGES BETWEEN 0 AND 30 CM
+ 0001 01 RANGES BETWEEN 30 AND 60 CM
+ 0002 01 RANGES BETWEEN 60 AND 90 CM
+ 0003 01 RANGES BETWEEN 90 AND 120 CM
+ 0004 01 RANGES BETWEEN 120 AND 150 CM
+ 0005 01 RANGES BETWEEN 150 AND 180 CM
+ 0006 01 RANGES BETWEEN 180 AND 210 CM
+ 0007 01 RANGES BETWEEN 210 AND 240 CM
+ 0008 01 RANGES BETWEEN 240 AND 270 CM
+ 0009 01 RANGES LARGER THAN 270 CM
+ 0015 01 MISSING VALUE
+025098 0008 0001 01 KU BAND RANGE
+ 0002 01 C BAND RANGE
+ 0003 01 KU BAND SWH
+ 0004 01 C BAND SWH
+ 0005 01 KU BAND SCATTEROMETER COEFFICIENT
+ 0006 01 C BAND SCATTEROMETER COEFFICIENT
+ 0007 01 OFF NADIR ANGLE FROM KU BAND WVEFORM PARAMETERS
+ 0008 01 OFF NADIR FROM PLATFORM
+025099 0006 0001 01 KU BAND RANGE INSTRUMENTAL CORRECTION
+ 0002 01 C BAND RANGE INSTRUMENTAL CORRECTION
+ 0003 01 KU BAND SWH INSTRUMENTAL CORRECTION
+ 0004 01 C BAND SWH INSTRUMENTAL CORRECTION
+ 0005 01 KU BAND SCATTEROMETER COEFFICIENT INSTRUMENTAL CORRECTION
+ 0006 01 C BAND SCATTEROMETER COEFFICIENT INSTRUMENTAL CORRECTION
+025110 0006 0001 02 RAW DATA ANALYSIS USED FOR RAW DATA CORRECTION.
+ CORRECTION DONE USING DEFAULT PARAMETERS
+ 0002 01 RAW DATA ANALYSIS USED FOR RAW DATA CORRECTION.
+ CORRECTION DONE USING RAW DATA ANALYSIS RESULTS
+ 0003 01 ANTENNA ELEVATION PATTERN CORRECTION APPLIED
+ 0004 01 NOMINAL CHIRP REPLICA USED
+ 0005 01 RECONSTRUCTED CHIRP USED
+ 0006 01 SLANT RANGE TO GROUND RANGE CONVERSION APPLIED
+025120 0004 0000 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS GREATER THAN THE ACCEPTABLE THRESHOLD
+ 0001 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS LESS THAN THE ACCEPTABLE THRESHOLD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025122 0004 0000 01 HARDWARE CONFIGURATION FOR RF IS A
+ 0001 01 HARDWARE CONFIGURATION FOR RF IS B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025123 0004 0000 01 HARDWARE CONFIGURATION FOR HPA IS A
+ 0001 01 HARDWARE CONFIGURATION FOR HPA IS B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025124 0004 0000 01 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS GREATER THAN THE ACCEPTABLE THRESHOLD
+ 0001 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS LESS THAN THE ACCEPTABLE THRESHOLD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025144 0014 0001 01 PIXEL IS AFFECTED BY RFI EFFECTS
+ 0002 01 PIXEL IS LOCATED IN THE HEXAGONAL ALIAS DIRECTION CENTRED ON SUN ALIAS
+ 0003 01 PIXEL IS CLOSE TO THE BORDER DELIMITING THE EXTENDED ALIAS FREE ZONE
+ 0004 01 PIXEL IS INSIDE THE EXTENDED ALIAS FREE ZONE
+ 0005 01 PIXEL IS INSIDE THE EXCLUSIVE OF ALIAS FREE ZONE
+ 0006 01 PIXEL IS LOCATED IN ZONE WHERE A MOON ALIAS WAS RECONSTRUCTED
+ 0007 01 PIXEL IS LOCATED IN ZONE WHERE SUN REFLECTION HAS BEEN DETECTED
+ 0008 01 PIXEL IS LOCATED IN ZONE WHERE SUN ALIAS WAS RECONSTRUCTED
+ 0009 02 FLAT TARGET TRANSFORMATION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION OF THIS PIXEL
+ 0010 02 SCENE HAS BEEN COMBINED WITH AN ADJUSTMENT SCENE IN OPOSITE POLARISATION
+ DURING IMAGE RECONSTRUCTION TO ACCOUNT FOR CROSS-POLARISATION LEAKAGE
+ 0011 02 DIRECT MOON CORRECTION HAS BENN PERFORMED DURING IMAGE RECONSTRUCTION OF
+ THIS PIXEL
+ 0012 02 REFLECTED SUN CORRECTION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION IF THIS PIXEL
+ 0013 02 DIRECT SUN CORRECTION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION OF THIS IMAGE
+026010 0025 0001 01 0100 INCLUDED
+ 0002 01 0200 INCLUDED
+ 0003 01 0300 INCLUDED
+ 0004 01 0400 INCLUDED
+ 0005 01 0500 INCLUDED
+ 0006 01 0600 INCLUDED
+ 0007 01 0700 INCLUDED
+ 0008 01 0800 INCLUDED
+ 0009 01 0900 INCLUDED
+ 0010 01 1000 INCLUDED
+ 0011 01 1100 INCLUDED
+ 0012 01 1200 INCLUDED
+ 0013 01 1300 INCLUDED
+ 0014 01 1400 INCLUDED
+ 0015 01 1500 INCLUDED
+ 0016 01 1600 INCLUDED
+ 0017 01 1700 INCLUDED
+ 0018 01 1800 INCLUDED
+ 0019 01 1900 INCLUDED
+ 0020 01 2000 INCLUDED
+ 0021 01 2100 INCLUDED
+ 0022 01 2200 INCLUDED
+ 0023 01 2300 INCLUDED
+ 0024 01 2400 INCLUDED
+ 0025 01 UNKNOWN MIXTURE OF HOURS
+029001 0006 0000 01 GNOMONIC PROJECTION
+ 0001 01 POLAR STEREOGRAPHIC PROJECTION
+ 0002 01 LAMBERT'S CONFORMAL CONIC PROJECTION
+ 0003 01 MERCATOR'S PROJECTION
+ 0004 01 SCANNING CONE (RADAR)
+ 0007 01 MISSING VALUE
+029002 0004 0000 01 CARTESIAN
+ 0001 01 POLAR
+ 0002 01 OTHER
+ 0007 01 MISSING VALUE
+030031 0013 0000 01 PPI
+ 0001 01 COMPOSITE
+ 0002 01 CAPPI
+ 0003 01 VERTICAL SECTION
+ 0004 01 ALPHANUMERIC DATA
+ 0005 01 MAP OF SUBJECT CLUTTER
+ 0006 01 MAP
+ 0007 01 TEST PICTURE
+ 0008 01 COMMENTS
+ 0009 01 MAP OF GROUND OCCULTATION
+ 0010 01 MAP OF RADAR BEAM HEIGHT
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+030032 0009 0001 01 MAP
+ 0002 01 SATELLITE IR
+ 0003 01 SATELLITE VIS
+ 0004 01 SATELLITE WV
+ 0005 01 SATELLITE MULTISPECTRAL
+ 0006 01 SYNOPTIC OBSERVATIONS
+ 0007 01 FORECAST PARAMETERS
+ 0008 01 LIGHTNING DATA
+ 0015 01 OTHER DATA
+031021 0004 0001 01 1 BIT INDICATOR OF QUALITY, 0= GOOD; 1=SUSPECT OR BAD
+ 0002 02 2 BIT INDICATOR OF QUALITY, 0= GOOD; 1= SLIGHTLY SUSPECTED;
+ 2= HIGHLY SUSPECTED; 3=BAD
+ 0007 01 PERCENTAGE CONFIDENCE
+ 0063 01 MISSING VALUE
+031031 0001 0001 01 DATA NOT PRESENT
+033002 0004 0000 01 DATA NOT SUSPECT
+ 0001 01 DATA SUSPECT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033003 0005 0000 01 DATA NOT SUSPECT
+ 0001 01 DATA SLIGHTLY SUSPECT
+ 0002 01 DATA HIGHTLY SUSPECT
+ 0003 01 DATA CONSIDERED UNFIT FOR USE
+ 0007 01 MISSING VALUE
+033005 0023 0001 01 NO AUTOMATED METEOROLOGICAL DATA CHECKS PERFORMED
+ 0002 01 PRESSURE DATA SUSPECT
+ 0003 01 WIND DATA SUSPECT
+ 0004 01 DRY-BULB TEMPERATURE DATA SUSPECT
+ 0005 01 WET-BULB TEMPERATURE DATA SUSPECT
+ 0006 01 HUMIDITY DATA SUSPECT
+ 0007 01 GROUND TEMPERATURE DATA SUSPECT
+ 0008 01 SOIL TEMPERATURE (DEPTH 1) DATA SUSPECT
+ 0009 01 SOIL TEMPERATURE (DEPTH 2) DATA SUSPECT
+ 0010 01 SOIL TEMPERATURE (DEPTH 3) DATA SUSPECT
+ 0011 01 SOIL TEMPERATURE (DEPTH 4) DATA SUSPECT
+ 0012 01 SOIL TEMPERATURE (DEPTH 5) DATA SUSPECT
+ 0013 01 CLOUD DATA SUSPECT
+ 0014 01 VISIBILITY DATA SUSPECT
+ 0015 01 PRESENT WEATHER DATA SUSPECT
+ 0016 01 LIGHTNING DATA SUSPECT
+ 0017 01 ICE DEPOSIT DATA SUSPECT
+ 0018 01 PRECIPITATION DATA SUSPECT
+ 0019 01 STATE OF GROUND DATA SUSPECT
+ 0020 01 SNOW DATA SUSPECT
+ 0021 01 WATER CONTENT DATA SUSPECT
+ 0022 01 EVAPORATION/EVAPOTRANSPIRATION DATA SUSPECT
+ 0023 01 SUNSHINE DATA SUSPECT
+033006 0005 0000 01 SELF-CHECK OK
+ 0001 01 AT LEAST ONE WARNING ACTIVE, NO ALARMS
+ 0002 01 AT LEAST ONE ALARM ACTIVE
+ 0003 01 SENSOR FAILURE
+ 0007 01 MISSING VALUE
+033015 0016 0000 01 PASSED ALL CHECKS
+ 0001 01 MISSING-DATA CHECK
+ 0002 01 DESCENDING/REASCENDING BALLOON CHECK
+ 0003 01 DATA PLAUSIBILITY CHECK (ABOVE LIMITS)
+ 0004 01 DATA PLAUSIBILITY CHECK (BELOW LIMITS)
+ 0005 01 SUPERADIABATIC LAPSE RATE CHECK
+ 0006 01 LIMITING ANGLES CHECK
+ 0007 01 ASCENSION RATE CHECK
+ 0008 01 EXCESSIVE CHANGE FROM PREVIOUS FLIGHT
+ 0009 01 BALLOON OVERHEAD CHECK
+ 0010 01 WIND SPEED CHECK
+ 0011 01 WIND DIRECTION CHECK
+ 0012 01 DEPENDENCY CHECK
+ 0013 01 DATA VALID BUT MODIFIED
+ 0014 01 DATA OUTLIER CHECK
+ 0063 01 MISSING DATA
+033020 0008 0000 01 GOOD
+ 0001 01 INCONSISTENT
+ 0002 01 DOUBTFUL
+ 0003 01 WRONG
+ 0004 01 NOT CHECKED
+ 0005 01 HAS BEEN CHECKED
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+033021 0004 0000 01 WITHIN LIMITS
+ 0001 01 OUTSIDE LIMITS
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033022 0004 0000 01 GOOD (SEVERAL IDENTICAL REPORTS HAVE BEEN RECEIVED)
+ 0001 01 DUBIOUS (NO IDENTICAL REPORT HAVE BEEN RECEIVED)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033023 0004 0000 01 RELIABLE (LOCATION WAS MADE OVER TWO SATELLITE PASSES)
+ 0001 01 LATEST KNOWN (NO LOCATION OVER CORRESPONDING PASS)
+ 0002 01 DUBIOUS
+ 0003 01 MISSING VALUE
+033024 0010 0000 01 RESERVED
+ 0001 01 EXELLENT - WITHIN 3 METRES
+ 0002 01 GOOD - WITHIN 10 METRES
+ 0003 01 FAIR - WITHIN 20 METRES
+ 0004 01 POOR - MORE THAN 20 METRES
+ 0005 01 EXELLENT -WITHIN 10 FEET
+ 0006 01 GOOD WITHIN-30 FEET
+ 0007 01 FAIR WITHIN 60 FEET
+ 0008 01 POOR - MORE THAN 60 FEET
+ 0015 01 MISSING VALUE
+033025 0005 0000 01 TIME INTERPOLATED, LATITUDE AND LONGITUDE REPORTED
+ 0001 01 TIME REPORTED, LATITUDE AND LONGITUDE INTERPOLATED
+ 0002 01 TIME, LATITUDE AND LONGITUDE INTERPOLATED
+ 0003 01 TIME, LATITUDE AND LONGITUDE REPORTED
+ 0007 01 MISSING VALUE
+033026 0010 0000 01 NORMAL OPERATIONS - MEASUREMENT MODE
+ 0001 01 NORMAL OPERATIONS - NON-MEASUREMENT MODE
+ 0002 01 SMALL RH
+ 0003 01 HUMIDITY ELEMENT IS WET
+ 0004 01 HUMIDITY ELEMENT IS CONTAMINATED
+ 0005 01 HEATER FAIL
+ 0006 01 HEATER FAIL AND WET/CONTAMINATED HUMIDITY ELEMENT
+ 0007 01 SINGLE VALIDITY BAD
+ 0008 01 NUMERIC ERROR
+ 0063 01 MISSING VALUE
+033027 0005 0000 01 RADIUS >= 1500 M
+ 0001 01 500 M <= RADIUS < 1500 M
+ 0002 01 250 M <= RADIUS < 500 M
+ 0003 01 RADIUS < 250 M
+ 0007 01 MISSING VALUE
+033028 0006 0000 01 RESERVED
+ 0001 01 NOMINAL
+ 0002 01 DEGRADED BY SW ERROR; ANY ERROR REPORTED BY THE ALGORITHMS
+ 0003 01 DEGRADED BY INSTRUMENT ERROR
+ 0004 01 DEGRADED BY CORRUPTED/MISSING ADF
+ 0007 01 MISSING
+033030 0007 0001 01 DO NOT USE SCAN FOR PRODUCT GENERATION
+ 0002 01 TIME SEQUENCE ERROR DETECTED WITH THIS SCAN
+ 0003 01 DATA GAP PRECEDES THIS SCAN
+ 0004 01 NO CALIBRATION
+ 0005 01 NO EARTH LOCATION
+ 0006 01 FIRST GOOD TIME FOLLOWING A CLOCK UPDATE
+ 0007 01 INSTRUMENT STATUS CHANGED WITH THIS SCAN
+033031 0021 0001 01 TIME FIELD IS BAD BUT CAN PROBABLY BE INFERRED FROM THE PREVIOUS GOOD TIME
+ 0002 01 TIME FIELD IS BAD AND CAN�~@~YT BE INFERRED FROM THE PREVIOUS GOOD TIME
+ 0003 04 THIS RECORD STARTS A SEQUENCE THAT IS INCONSISTENT WITH
+ PREVIOUS TIMES (I.E. THERE IS A TIME DISCONTINUITY). THIS MAY OR MAY
+ NOT BE ASSOCIATED WITH A SPACECRAFT CLOCK UPDATE (SEE SCAN LINE
+ STATUS FLAGS FOR ATOVS)
+ 0004 02 START OF A SEQUENCE THAT APPARENTLY REPEATS SCAN
+ TIMES THAT HAVE BEEN PREVIOUSLY ACCEPTED
+ 0005 01 SCAN LINE WAS NOT CALIBRATED BECAUSE OF BAD TIME
+ 0006 03 SCAN LINE WAS CALIBRATED USING FEWER THAN THE PREFERRED
+ NUMBER OF SCAN LINES BECAUSE OF PROXIMATY TO START OR
+ END OF DATA OR TO A DATA GAP
+ 0007 01 SCAN LINE WAS NOT CALIBRATED BECAUSE OF BAD OR INSUFFICIENT PRT DATA
+ 0008 01 SCAN LINE WAS CALIBRATED BUT WITH MARGINAL PRT DATA
+ 0009 01 SOME UNCALIBRATED CHANNELS ON THIS SCAN
+ 0010 01 UNCALIBRATED DUE TO INSTRUMENT MODE
+ 0011 01 QUESTIONABLE CALIBRATION BECAUSE OF ANTENNA POSITION ERROR OF SPACE VIEW
+ 0012 01 QUESTIONABLE CALIBRATION BECAUSE OF ANTENNA POSITION ERROR OF BLACK BODY
+ 0013 01 NOT EARTH LOCATED BECAUSE OF BAD TIME
+ 0014 03 EARTH LOCATION QUESTIONABLE BECAUSE OF
+ QUESTIONABLE TIME CODE (SEE TIME PROBLEM
+ CODE BITS)
+ 0015 02 EARTH LOCATION QUESTIONABLE - ONLY MARGINAL AGREEMENT
+ WITH REASONABLENESS CHECK
+ 0016 01 EARTH LOCATION QUESTIONABLE - FAILS REASONABLENESS CHECK
+ 0017 01 EARTH LOCATION QUESTIONABLE BECAUSE OF ANTENNA POSITION CHECK
+ 0018 01 SCAN LINE CALIBRATION COLD BLACK BODY
+ 0019 01 SCAN LINE CALIBRATION WARM BLACK BODY
+ 0020 01 SCAN LINE CALIBRATION SPACE VIEW
+ 0021 01 EARTH VIEW
+033032 0006 0001 01 NO GOOD BLACKBODY COUNTS FOR SCAN LINE
+ 0002 01 NO GOOD SPACE VIEW COUNTS FOR THIS LINE
+ 0003 01 NO GOOD PRTS FOR THIS LINE
+ 0004 01 SOME BAD BLACKBODY VIEW COUNTS FOR THIS LINE
+ 0005 01 SOME BAD SPACE VIEW COUNTS FOR THIS LINE
+ 0006 01 SOME BAD PRT TEMPS ON THIS LINE
+033033 0023 0001 01 SET IF SECONDARY CALIBRATION USED
+ 0002 02 BRIGHTNESS TEMPERATURE IN CHANNEL 1 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0003 02 BRIGHTNESS TEMPERATURE IN CHANNEL 2 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0004 02 BRIGHTNESS TEMPERATURE IN CHANNEL 3 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0005 02 BRIGHTNESS TEMPERATURE IN CHANNEL 4 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0006 02 BRIGHTNESS TEMPERATURE IN CHANNEL 5 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0007 02 BRIGHTNESS TEMPERATURE IN CHANNEL 6 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0008 02 BRIGHTNESS TEMPERATURE IN CHANNEL 7 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0009 02 BRIGHTNESS TEMPERATURE IN CHANNEL 8 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0010 02 BRIGHTNESS TEMPERATURE IN CHANNEL 9 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0011 02 BRIGHTNESS TEMPERATURE IN CHANNEL 10 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0012 02 BRIGHTNESS TEMPERATURE IN CHANNEL 11 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0013 02 BRIGHTNESS TEMPERATURE IN CHANNEL 12 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0014 02 BRIGHTNESS TEMPERATURE IN CHANNEL 13 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0015 02 BRIGHTNESS TEMPERATURE IN CHANNEL 14 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0016 02 BRIGHTNESS TEMPERATURE IN CHANNEL 15 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0017 02 BRIGHTNESS TEMPERATURE IN CHANNEL 16 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0018 02 BRIGHTNESS TEMPERATURE IN CHANNEL 17 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0019 02 BRIGHTNESS TEMPERATURE IN CHANNEL 18 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0020 02 BRIGHTNESS TEMPERATURE IN CHANNEL 19 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0021 02 BRIGHTNESS TEMPERATURE IN CHANNEL 20 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0022 01 SET IF ALL CHANNELS ARE MISSING
+ 0023 01 SUSPECT
+033035 0010 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 01 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND PASSED
+ 0002 01 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND DELETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND FAILED
+ 0005 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND RE-INSERTED
+ 0006 01 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND NOT MANUALLY CHECCKED
+ 0007 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE
+ AND MANUALLY CHECKED AND FAILED
+ 0008 01 MANUALLY CHECKED AND FAILED
+ 0015 01 MISSING VALUE
+033037 0020 0001 01 U DEPARTURE FROM GUESS
+ 0002 01 V DEPARTURE FROM GUESS
+ 0003 01 U & V DEPARTURE FROM GUESS
+ 0004 01 U ACCELERATION
+ 0005 01 V ACCELERATION
+ 0006 01 U & V ACCELERATION
+ 0007 01 POSSIBLE LAND FEATURE
+ 0008 01 U ACCELERATION AND POSSIBLE LAND FEATURE
+ 0009 01 V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0010 01 U & V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0011 01 BAD WIND GUESS
+ 0012 01 CORRELATION FAILURE
+ 0013 01 SEARCH BOX OFF EDGE OF AREA
+ 0014 01 TARGET BOX OFF EDGE OF AREA
+ 0015 01 PIXEL BRIGHTNESS OUT OF BOUNDS (NOISY LINE)
+ 0016 01 TARGET OUTSIDE OF LAT/LONG BOX
+ 0017 01 TARGET OUTSIDE OF PRESSURE MIN/MAX
+ 0018 01 AUTOEDITOR FLAGGED SLOW VECTOR
+ 0020 01 AUTOEDITOR FLAGGED VECTORS
+033038 0009 0001 01 TOTAL ZENITH DELAY QUALITY IS CONSIDERED POOR
+ 0002 01 GALILEO SATELLITES USED
+ 0003 01 GLONASS SATELLITES USED
+ 0004 01 GPS SATELLITES USED
+ 0005 01 METEOROLOGICAL DATA APPLIED
+ 0006 01 ATMOSPHERIC LOADING CORRECTION APPLIED
+ 0007 01 OCEAN TIDE LOADING APPLIED
+ 0008 01 CLIMATE QUALITY DATA PROCESSING
+ 0009 01 NEAR-REAL TIME DATA PROCESSING
+033039 0009 0001 01 NON-NOMINAL QUALITY
+ 0002 01 OFFLINE PRODUCT
+ 0003 01 ASCENDING OCCULTATION FLAG
+ 0004 01 EXCESS PHASE PROCESSING NON-NOMINAL
+ 0005 01 BENDING ANGLE PROCESSING NON-NOMINAL
+ 0006 01 REFRACTIVITY PROCESSING NON-NOMINAL
+ 0007 01 METEOROLOGICAL PROCESSING NON-NOMINAL
+ 0014 01 BACKGROUND PROFILE NON-NOMINAL
+ 0015 01 BACKGROUND (I.E. NOT RETRIEVED) PROFILE PRESENT
+033041 0004 0000 01 THE FOLLOWING VALUE IS THE TRUE VALUE
+ 0001 02 THE FOLLOWING VALUE IS HIGHER THAN THE TRUE VALUE
+ (THE MEASUREMENT HIT THE LOWER LIMIT OF THE INSTRUMENT)
+ 0002 02 THE FOLLOWING VALUE IS LOWER THAN THE TRUE VALUE
+ (THE MEASUREMENT HIT THE HIGHER LIMIT OF THE INSTRUMENT)
+ 0003 01 MISSING VALUE
+033042 0005 0000 01 EXCLUSIVE LOWER LIMIT (>)
+ 0001 01 INCLUSIVE LOWER LIMIT (>=)
+ 0002 01 EXCLUSIVE UPPER LIMIT (<)
+ 0003 01 INCLUSIVE UPPER LIMIT (=<)
+ 0007 01 MISSING VALUE
+033043 0004 0001 02 SEA MDS. NADIR ONLY SST RETRIEVAL USED 3.7 MICRON
+ CHANNEL. LAND MDS RESERVED
+ 0002 02 SEA MDS. DUAL VIEW SST RETRIEVAL USED 3.7 MICRON
+ CHANNEL. LAND MDS RESERVED.
+ 0003 01 NADIR VIEW CONTAINS DAY TIME DATA
+ 0004 01 FORWARD VIEW CONTAINS DAY TIME DATA
+033044 0014 0001 01 INPUT DATA MEAN OUTSIDE NOMINAL RANGE FLAG
+ 0002 01 INPUT DATA STANDARD DEVIATION OUTSIDE NOMINAL RANGE FLAG
+ 0003 01 NUMBER OF INPUT DATA GAPS > THRESHOLD VALUE
+ 0004 01 PERCENTAGE OF MISSING LINES > THRESHOLD VALUE
+ 0005 01 DOPPLER CENTROID UNCERTAIN. CONFIDENCE MEASURE < SPECIFIC VALUE
+ 0006 01 DOPPLER AMBIGUITY ESTIMATE UNCERTAIN. CONFIDENCE MEASURE < SPECIFIC VALUE
+ 0007 01 OUTPUT DATA MEAN OUTSIDE NOMINAL RANGE FLAG
+ 0008 01 OUTPUT DATA STANDARD DEVIATION OUTSIDE NOMINAL RANGE FLAG
+ 0009 01 CHIRP RECONSTRUCTION FAILED OR IS OF LOW QUALITY FLAG
+ 0010 01 DATA SET MISSING
+ 0011 01 INVALID DOWNLINK PARAMETERS
+ 0012 02 AZIMUTH CUT-OFF ITERATION COUNT. THE AZIMUTH
+ CUT-OFF FIT DID NOT CONVERGE WITHIN A MINIMUM NUMBER OF ITERATIONS
+ 0013 02 AZIMUTH CUT-OFF FIT DID NOT CONVERGE WITHIN A MINIMUM
+ NUMBER OF ITERATIONS
+ 0014 03 PHASE INFORMATION CONFIDENCE MEASURE. THE IMAGINARY SPECTRAL
+ PEAK IS LESS THAN A MINIMUM THRESHOLD, OR THE ZERO LAG SHIFT
+ IS GREATER THAN A MINIMUM THRESHOLD
+033047 0026 0001 01 ERROR DETECTED AND ATTEMPTS TO RECOVER MADE
+ 0002 01 ANOMALY IN ON-BOARD DATA HANDLING (OBDH) VALUE DETECTED
+ 0003 01 ANOMALY IN ULTRA STABLE OSCILLATOR PROCESSING (USOP) VALUE DETECTED
+ 0004 01 ERRORS DETECTED BY ON-BOARD COMPUTER
+ 0005 01 AUTOMATIC GAIN CONTROL (AGC) OUT OF RANGE
+ 0006 01 RX DELAY FAULT. RX DISTANCE OUT OF RANGE
+ 0007 01 WAVE FORM SAMPLES FAULT IDENTIFIER. ERROR
+ 0012 01 BRIGHTNESS TEMPERATURE (CHANNEL 1) OUT OF RANGE
+ 0013 01 BRIGHTNESS TEMPERATURE (CHANNEL 2) OUT OF RANGE
+ 0014 01 RESERVED
+ 0015 01 KU OCEAN RETRACKING ERROR
+ 0016 01 S OCEAN RETRACKING ERROR
+ 0017 01 KU ICE 1 RETRACKING ERROR
+ 0018 01 S ICE 1 RETRACKING ERROR
+ 0019 01 KU ICE 2 RETRACKING ERROR
+ 0020 01 S ICE 2 RETRACKING ERROR
+ 0021 01 KU SEA ICE RETRACKING ERROR
+ 0022 01 ARITHMETIC FAULT ERROR
+ 0023 01 METEO DATA STATE. NO MAP
+ 0024 01 METEO DATA STATE. 1 MAP
+ 0025 01 METEO DATA STATE 2 MAPS DEGRADED
+ 0026 01 METEO DATA STATE 2 MAPS NOMINAL
+ 0027 01 ORBIT PROPAGATOR STATUS FOR PROPAGATION MODE, SEVERAL ERRORS
+ 0028 01 ORBIT PROPAGATOR STATUS FOR PROPAGATION MODE, WARNING DETECTED
+ 0029 01 ORBIT PROPAGATOR STATUS FOR INITIALISATION MODE, SEVERAL ERRORS
+ 0030 01 ORBIT PROPAGATOR STATUS FOR INITIALISATION MODE, WARNING DETECTED
+033048 0004 0000 01 INVERSION SUCCESSFUL
+ 0001 01 INVERSION NOT SUCCESSFUL
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033049 0004 0000 01 EXTERNAL WIND DIRECTION USED DURING INVERSION
+ 0001 01 EXTERNAL WIND DIRECTION NOT USED DURING INVERSION
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033050 0008 0000 01 UNQUALIFIED
+ 0001 01 CORRECT VALUE (ALL CHECKS PASSED)
+ 0002 01 PROBABLY GOOD BUT VALUE INCONSISTENT WITH STATISTICS (DIFFER FROM CLIMATOLOGY)
+ 0003 01 PROBABLY BAD (SPIKE, GRADIENT, �~E IF OTHER TESTS PASSED)
+ 0004 02 BAD VALUE, IMPOSSIBLE VALUE (OUT OF SCALE, VERTICAL
+ INSTABILITY, CONSTANT PROFILE)
+ 0005 01 VALUE MODIFIED DURING QUALITY CONTROL
+ 0008 01 INTERPOLATED VALUE
+ 0015 01 MISSING VALUE
+033052 0020 0001 01 DATA BLOCK 1 INVALID (S BAND)
+ 0002 01 DATA BLOCK 2 INVALID (S BAND)
+ 0003 01 DATA BLOCK 3 INVALID (S BAND)
+ 0004 01 DATA BLOCK 4 INVALID (S BAND)
+ 0005 01 DATA BLOCK 5 INVALID (S BAND)
+ 0006 01 DATA BLOCK 6 INVALID (S BAND)
+ 0007 01 DATA BLOCK 7 INVALID (S BAND)
+ 0008 01 DATA BLOCK 8 INVALID (S BAND)
+ 0009 01 DATA BLOCK 9 INVALID (S BAND)
+ 0010 01 DATA BLOCK 10 INVALID (S BAND)
+ 0011 01 DATA BLOCK 11 INVALID (S BAND)
+ 0012 01 DATA BLOCK 12 INVALID (S BAND)
+ 0013 01 DATA BLOCK 13 INVALID (S BAND)
+ 0014 01 DATA BLOCK 14 INVALID (S BAND)
+ 0015 01 DATA BLOCK 15 INVALID (S BAND)
+ 0016 01 DATA BLOCK 16 INVALID (S BAND)
+ 0017 01 DATA BLOCK 17 INVALID (S BAND)
+ 0018 01 DATA BLOCK 18 INVALID (S BAND)
+ 0019 01 DATA BLOCK 19 INVALID (S BAND)
+ 0020 01 DATA BLOCK 20 INVALID (S BAND)
+033053 0020 0001 01 DATA BLOCK 1 INVALID (KU BAND)
+ 0002 01 DATA BLOCK 2 INVALID (KU BAND)
+ 0003 01 DATA BLOCK 3 INVALID (KU BAND)
+ 0004 01 DATA BLOCK 4 INVALID (KU BAND)
+ 0005 01 DATA BLOCK 5 INVALID (KU BAND)
+ 0006 01 DATA BLOCK 6 INVALID (KU BAND)
+ 0007 01 DATA BLOCK 7 INVALID (KU BAND)
+ 0008 01 DATA BLOCK 8 INVALID (KU BAND)
+ 0009 01 DATA BLOCK 9 INVALID (KU BAND)
+ 0010 01 DATA BLOCK 10 INVALID (KU BAND)
+ 0011 01 DATA BLOCK 11 INVALID (KU BAND)
+ 0012 01 DATA BLOCK 12 INVALID (KU BAND)
+ 0013 01 DATA BLOCK 13 INVALID (KU BAND)
+ 0014 01 DATA BLOCK 14 INVALID (KU BAND)
+ 0015 01 DATA BLOCK 15 INVALID (KU BAND)
+ 0016 01 DATA BLOCK 16 INVALID (KU BAND)
+ 0017 01 DATA BLOCK 17 INVALID (KU BAND)
+ 0018 01 DATA BLOCK 18 INVALID (KU BAND)
+ 0019 01 DATA BLOCK 19 INVALID (KU BAND)
+ 0020 01 DATA BLOCK 20 INVALID (KU BAND)
+033060 0004 0000 01 PARAMETER=GOOD
+ 0001 01 PARAMETER=BAD
+ 0002 01 PARAMETER=RESERVED
+ 0003 01 MISSING
+033195 0004 0000 01 DEALIASING NOT USED
+ 0001 01 DEALIASING USED
+ 0002 01 RESERVED
+ 0003 01 MISSING
+033205 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033206 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033207 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033208 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033209 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033220 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 REPORT REJECTED THROUGH THE NAMELIST
+ 0017 01 MODEL SUR. TOO FAR FROM STAT. ALT.
+ 0018 01 MISSING STATION ALTITUDE
+ 0019 01 REPORT OVER SEA
+ 0020 01 REPORT OVER LAND
+ 0021 01 REDUNDANT REPORT
+ 0022 01 TIME OUT OF RANGE
+ 0023 01 VERTICAL POSITION OUT OF RANGE
+ 0024 01 HORIZONTAL POSITION OUT OF RANGE
+ 0025 01 ACTIVATED BY WHITELIST
+ 0026 01 ACTIVATED DUE TO RDB FLAG
+ 0027 01 REJECTED DUE TO RDB FLAG
+ 0028 01 BAD REPORTING PRACTICE
+ 0029 01 ALL DATA REJECTED
+ 0030 01 NO DATA IN THE REPORT
+033221 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033222 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033223 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033224 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033225 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033226 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033227 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033228 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033229 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 THINNED REPORT
+033230 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033232 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 BLACKLISTED DUE TO DISTANCE FROM REF. POINT
+ 0015 01 BLACKLISTED DUE TO MODEL OROGRAPHY
+ 0016 01 BLACKLISTED DUE TO LAND/SEA MASK
+ 0017 01 STATION ALTITUDE BLACKLISTED
+ 0018 01 LONGITUDE BLACKLISTED
+ 0019 01 LATITUDE BLACKLISTED
+ 0020 01 TIME BLACKLISTED
+ 0021 01 DATE BLACKLISTED
+ 0022 01 INSTRUMENT TYPE BLACKLISTED
+ 0023 01 CODE TYPE BLACKLISTED
+ 0024 01 STATION ID BLACKLISTED
+ 0025 01 BLACKLISTED DUE TO FIRST GUESS DEPARTURE
+ 0026 01 BLACKLISTED DUE TO OBSERVED VALUE
+ 0027 01 BLACKLISTED DUE TO TYPE OF VERTICAL COORDINATE
+ 0028 01 BLACKLISTED DUE TO PRESSURE CODE
+ 0029 01 VARIABLE NAME BLACKLISTED
+ 0030 01 MONTHLY MONITORING
+033233 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 REPORT BLACK LISTED
+ 0028 01 REPORT REJECTED
+ 0029 01 REPORT PASSIVE
+ 0030 01 REPORT ACTIVE
+033234 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 DATUM BLACK LISTED
+ 0028 01 DATUM REJECTED
+ 0029 01 DATUM PASSIVE
+ 0030 01 DATUM ACTIVE
+033236 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 DATUM REJECTED DUE TO REJECTED REPORT
+ 0006 01 COMBINED FLAGGING
+ 0007 01 DATUM REJECTED DUE TO NAMELIST
+ 0008 01 VERTICAL COORDINATE CHANGE FROM Z TO P
+ 0009 01 VERTICAL CONSISTENCY CHECK
+ 0010 01 LEVEL SELECTION
+ 0011 01 MULTI LEVEL CHECK
+ 0012 01 TOO MANY SURFACE DATA/LEVELS
+ 0013 01 DUPLICATED DATUM/LEVEL
+ 0014 01 NOT AN ANALYSIS VARIABLE
+ 0015 01 REPORT OVER SEA
+ 0016 01 REPORT OVER LAND
+ 0017 01 REDUNDANT LEVEL
+ 0018 01 REDUNDANT DATUM
+ 0019 01 TOO BIG OBSERVATION ERROR
+ 0020 01 TOO BIG DEPARTURE IN ASSIMILATION
+ 0021 01 TOO BIG FIRST GUESS DEPARTURE
+ 0022 01 REFERENCE LEVEL POSITION OUT OF RANGE
+ 0023 01 VERTICAL POSITION OUT OF RANGE
+ 0024 01 BAD REPORTING PRACTICE
+ 0025 01 ACTIVATED BY WHITELIST
+ 0026 01 ACTIVATED DUE TO RDB FLAG
+ 0027 01 REJECTED DUE TO RDB FLAG
+ 0028 01 MISSING FIRST GUESS VALUE
+ 0029 01 MISSING OBSERVED VALUE
+ 0030 01 MISSING VERTICAL COORDINATE
+033237 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033238 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033239 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033240 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033243 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033244 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033245 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 LAYER FORMED BY SUMMING UP
+ 0029 01 LAYER FORMED BY THINNING UP
+ 0030 01 NOT PREDEFINED LAYER
+033246 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033247 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033248 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033249 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 BLACKLISTED DUE TO FIRST GUESS DEPARTURE
+ 0025 01 BLACKLISTED DUE TO OBSERVED VALUE
+ 0026 01 BLACKLISTED DUE TO TYPE OF VERTICAL COORDINATE
+ 0027 01 BLACKLISTED DUE TO DISTANCE FROM REFERENCE POINT
+ 0028 01 BLACKLISTED DUE TO PRESSURE CODE
+ 0029 01 VARIABLE BLACKLISTED
+ 0030 01 PRESSURE BLACKLISTED
+033252 0010 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 01 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND PASSED
+ 0002 01 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND DELETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND FAILED
+ 0005 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND RE-INSERTED
+ 0006 01 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND NOT MANUALLY CHECCKED
+ 0007 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE
+ AND MANUALLY CHECKED AND FAILED
+ 0008 01 MANUALLY CHECKED AND FAILED
+ 0015 01 MISSING VALUE
+
+033254 0019 0001 01 U DEPARTURE FROM GUESS
+ 0002 01 V DEPARTURE FROM GUESS
+ 0003 01 U & V DEPARTURE FROM GUESS
+ 0004 01 U ACCELERATION
+ 0005 01 V ACCELERATION
+ 0006 01 U & V ACCELERATION
+ 0007 01 POSSIBLE LAND FEATURE
+ 0008 01 U ACCELERATION AND POSSIBLE LAND FEATURE
+ 0009 01 V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0010 01 U & V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0011 01 BAD WIND GUESS
+ 0012 01 CORRELATION FAILURE
+ 0013 01 SEARCH BOX OFF EDGE OF AREA
+ 0014 01 TARGET BOX OFF EDGE OF AREA
+ 0015 01 PIXEL BRIGHTNESS OUT OF BOUNDS (NOISY LINE)
+ 0016 01 TARGET OUTSIDE OF LAT/LONG BOX
+ 0017 01 TARGET OUTSIDE OF PRESSURE MIN/MAX
+ 0018 01 AUTOEDITOR FLAGGED SLOW VECTOR
+ 0019 01 AUTOEDITOR FLAGGED VECTORS
+035000 0011 0011 01 000-099 INTERNATIONAL FM CODES
+ 0001 01 100-199 RA I CODES
+ 0002 01 200-299 RA II CODES
+ 0003 01 300-399 RA III CODES
+ 0004 01 400-499 RA IV CODES
+ 0005 01 500-599 RA V CODES
+ 0006 01 600-699 RA VI CODES
+ 0007 01 700-799 ANTARCTIC CODES
+ 0008 01 800-999 RESERVED
+ 0009 01 1000-1022 NOT USED
+ 1023 01 MISSING VALUE
+035001 0004 0000 01 REAL TIME
+ 0001 01 NEAR-REAL TIME
+ 0002 01 NON-REAL TIME
+ 0007 01 MISSING VALUE
+035030 0010 0000 01 NO DISCREPANCIES
+ 0001 02 NON-COMPLIANCE WITH STANDARD AND RECOMMENDED PRACTICES
+ AND PROCEDURES INCLUDINGTHOSE OF MONITORING
+ 0002 01 CATALOGUES OF METEOROLOGICAL BULLETINS NOT UPDATED IN A TIMELY MANNER
+ 0003 01 INCORRECT ROUTEING DIRECTORIES
+ 0004 01 LACK OF FLEXIBILITY IN THE ROUTEING ARRANGEMENTS
+ 0005 01 DEFICIENCIES IN THE OPERATION OF GTS CENTRES AND CIRCUITS
+ 0006 01 LOSS OF DATA OR DELAYS IN RELAYING DATA ON THE GTS
+ 0007 01 ROUTEING OF DATA DIFFERENT FROM THE ROUTEING PROVIDED IN THE PLAN
+ 0008 01 VARIOUS MALPRACTICES
+ 0015 01 MISSING VALUE
+035031 0020 0001 01 SUFFICIENT AND ALL OF ACCEPTABLE QUALITY
+ 0002 01 SUFFICIENT BUT PARTLY OF ACCEPTABLE QUALITY
+ 0003 01 INSUFFICIENT BUT ALL OF ACCEPTABLE QUALITY
+ 0004 01 INSUFFICIENT AND OF UNACCEPTABLE QUALITY
+ 0005 01 SOME MESSAGES NOT COMPLETE
+ 0006 01 SUSPECT OR WRONGLY CODED GROUPS COULD NOT BE INTERPRETED CONFIDENTLY
+ 0007 01 GROSS CODING ERRORS
+ 0008 01 TRANSMISSION SEQUENTIAL ORDER NOT OBSERVED
+ 0009 01 REPORT COMPLETELY GARBLED AND THUS DISCARDED
+ 0010 01 DEFICIENCIES IDENTIFIED AND RECTIFIED
+ 0011 01 DEFICIENCIES IDENTIFIED BUT NOT RECTIFIED
+ 0012 01 DEFICIENCIES NOT IDENTIFIED
+ 0013 01 MEASURING ERRORS
+ 0014 01 MUTUAL INCONSISTENCY
+ 0015 01 TEMPORAL INCONSISTENCY
+ 0016 01 FORECAST ERROR
+ 0017 01 BIAS
+ 0018 01 IMPROVE SYSTEM OF QUALITY CONTROL
+ 0019 01 EXPAND TRAINING PROGRAMMES
+ 0123 01 MISSING VALUE
+035032 0010 0001 01 DATA GROUPS MISSING DUE TO RADIO FADING
+ 0002 01 DATA GROUPS MISSING DUE TO OUTAGE OF CENTRE
+ 0003 01 DATA GROUPS MISSING DUE TO OUTAGE OF CIRCUIT
+ 0004 01 NON-IMPLEMENTATION OR MAINTENANCE OF REQUIRED RBSN DENSITY
+ 0005 01 SHORTAGE OF QUALIFIED STAFF TO MAN STATIONS
+ 0006 01 LACK OF CONSUMABLES
+ 0007 01 INSTRUMENT FAILURE
+ 0008 01 NON-ADHERENCE TO TELECOMMUNICATION PROCEDURES
+ 0009 01 SOME OBSERVING PROGRAMMES CEASED
+ 0015 01 MISSING VALUE
+035033 0012 0001 01 NO DEFICIENCY
+ 0002 01 OBSERVATIONS NOT MADE REGULARLY
+ 0003 01 OBSERVATIONS NOT MADE AT RIGHT TIME
+ 0004 01 OBSERVATIONS MADE BUT NOT DISSEMINATED
+ 0005 01 OBSERVATIONS MADE AND SENT TO INCORRECT USERS
+ 0006 01 COLLECTION NOT RECEIVED
+ 0007 01 COLLECTION TRANSMITTED LATE
+ 0008 01 COLLECTION NOT TRANSMITTED
+ 0009 01 DIFFICULTIES IN HF PROPAGATION AND SELECTION OF SUITABLE FREQUENCY
+ 0010 01 DIFFICULTIES IN MAINTENANCE OF COMMUNICATION EQUIPMENT AT REMOTE STATIONS
+ 0011 01 NO ALTERNATIVE ARRANGEMENT FOR ROUTEING METEOROLOGICAL OBSERVATION
+ 0123 01 MISSING VALUE
+035034 0007 0001 01 SLIGHT IMPROVEMENT
+ 0002 01 SIGNIFICANT IMPROVEMENT
+ 0003 01 MOST SIGNIFICANT IMPROVEMENT
+ 0004 01 STEADY
+ 0005 01 DECREASING
+ 0006 01 EFFORTS REQUIRED TO IMPROVE NIGHT-TIME OBSERVATIONS
+ 0007 01 MISSING VALUE
+033035 0016 0000 01 RESERVED
+ 0001 01 BALLOON BURST
+ 0002 01 BALLOON FORCED DOWN BY ICING
+ 0003 01 LEAKING OR FLOATING BALLOON
+ 0004 01 WEAK OR FADING SIGNAL
+ 0005 01 BATTERY FAILURE
+ 0006 01 GROUND EQUIPMENT FAILURE
+ 0007 01 SIGNAL INTERFERENCE
+ 0008 01 RADIOSONDE FAILURE
+ 0009 01 EXCESSIVE MISSING DATA FRAMES
+ 0010 01 RESERVED
+ 0011 01 EXCESSIVE MISSING TEMPERATURE
+ 0012 01 EXCESSIVE MISSING PRESSURE
+ 0013 01 USER TERMINATED
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+040011 0004 0001 01 MEAN SEA SURFACE (MSS) INTERPOLATION FLAG
+ 0002 01 OCEAN TIDE SOLUTION 1 INTERPOLATION FLAG (0= 4 POINTS OVER OCEAN, 1=LESS THAN 4 POINTS)
+ 0003 01 OCEAN TIDE SOLUTION 2 INTERPOLATION FLAG (0= 4 POINTS OVER OCEAN, 1=LESS THAN 4 POINTS)
+ 0004 01 METEOROLOGICAL DATA INTERPOLATION FLAG (0= 4 POINTS OVER OCEAN, 1=LESS THAN 4 POINTS)
+040012 0003 0001 01 18.7 GHZ BRIGHTNESS TEMPERATURE
+ 0002 01 23.8 GHZ BRIGHTNESS TEMPERATURE
+ 0003 01 34 GHZ BRIGHTNESS TEMPERATURE
+040013 0005 0000 01 INTERPOLATION WITH NO GAP BETWEEN JMR DATA
+ 0001 01 INTERPOLATION WITH GAP BETWEEN JMR DATA
+ 0002 01 EXTRAOLATION OF JMR DATA
+ 0003 01 FAILURE OF EXTRAPOLATION AND INTERPOLATION
+ 0007 01 MISSING VALUE
+049194 0014 0001 01 PASSED QUALITY CONTROL
+ 0002 01 OUTSIDE TIME WINDOW
+ 0003 01 ABOVE LAND
+ 0004 01 OUTSIDE ENTIRE GRID
+ 0005 01 WAVE HEIGHT OUT OF RANGE
+ 0006 01 TOO HIGH ALONG TRACK JUMP
+ 0007 01 TOO SHORT ALONG TRACK JUMP
+ 0008 01 TOO HIGH ALONG TRACK VARIANCE
+ 0009 01 OUTSIDE CONFIDENCE LIMIT
+ 0010 01 DOUBLE OBSERVATION
+ 0011 01 PEAKINESS ABOVE THRESHOLD
+ 0012 01 RESERVED
+ 0013 01 RESERVED
+ 0014 01 RESERVED
+049193 0014 0001 01 EXELLENT (COST LESS THAN 0.1)
+ 0002 01 GOOD (COST LESS THAN 0.5)
+ 0003 01 QUESTIONABLE (COST LARGER THAN 0.5)
+ 0004 01 RESULTS UNTABLE
+ 0005 01 OBSERVED SAR SPECTRUM REJECTED
+ 0006 01 WAM FIRST GUESS REJECTED
+ 0007 01 SIMULATED SAR REJECTED
+ 0008 01 NO AZIMUTH CUT-OFF ADJUSTMENT
+ 0009 01 RESERVED
+ 0010 01 RESERVED
+ 0011 01 RESERVED
+ 0012 01 RESERVED
+ 0013 01 RESERVED
+ 0014 01 RESERVED
diff --git a/bufrtables/C0000000000098013001.TXT b/bufrtables/C0000000000098013001.TXT
new file mode 100755
index 0000000..11cb156
--- /dev/null
+++ b/bufrtables/C0000000000098013001.TXT
@@ -0,0 +1,6062 @@
+001003 0008 0000 01 ATARCTICA
+ 0001 01 REGION I
+ 0002 01 REGION II
+ 0003 01 REGION III
+ 0004 01 REGION IV
+ 0005 01 REGION V
+ 0006 01 REGION VI
+ 0007 01 MISSING VALUE
+001007 0132 0001 01 ERS 1
+ 0002 01 ERS 2
+ 0003 01 METOP-1
+ 0004 01 METOP-2
+ 0005 01 METOP-3
+ 0020 01 SPOT1
+ 0021 01 SPOT2
+ 0022 01 SPOT3
+ 0023 01 SPOT4
+ 0040 01 OERSTED
+ 0041 01 CHAMP
+ 0042 01 TERRASAR-X
+ 0050 01 METEOSAT 3
+ 0051 01 METEOSAT 4
+ 0052 01 METEOSAT 5
+ 0053 01 METEOSAT 6
+ 0054 01 METEOSAT 7
+ 0055 01 METEOSAT 8
+ 0056 01 METEOSAT 9
+ 0057 01 METEOSAT 10
+ 0058 01 METEOSAT 1
+ 0059 01 METEOSAT 2
+ 0060 01 ENVISAT
+ 0070 01 METEOSAT 11
+ 0120 01 ADEOS
+ 0121 01 ADEOS II
+ 0150 01 GMS 3
+ 0151 01 GMS 4
+ 0152 01 GMS 5
+ 0171 01 MTSAT-1R
+ 0172 01 MTSAT-2
+ 0200 01 NOAA 8
+ 0201 01 NOAA 9
+ 0202 01 NOAA 10
+ 0203 01 NOAA 11
+ 0204 01 NOAA 12
+ 0205 01 NOAA 14
+ 0206 01 NOAA 15
+ 0207 01 NOAA 16
+ 0208 01 NOAA 17
+ 0209 01 NOAA 18
+ 0220 01 LANDSAT 5
+ 0221 01 LANDSAT 4
+ 0222 01 LANDSAT 7
+ 0240 01 DMSP 7
+ 0241 01 DMSP 8
+ 0242 01 DMSP 9
+ 0243 01 DMSP 10
+ 0244 01 DMSP 11
+ 0245 01 DMSP 12
+ 0246 01 DMSP 13
+ 0247 01 DMSP 14
+ 0248 01 DMSP 15
+ 0249 01 DMSP 16
+ 0250 01 GOES 6
+ 0251 01 GOES 7
+ 0252 01 GOES 8
+ 0253 01 GOES 9
+ 0254 01 GOES 10
+ 0255 01 GOES 11
+ 0256 01 GOES 12
+ 0257 01 GOES 13
+ 0258 01 GOES 14
+ 0259 01 GOES 15
+ 0260 01 JASON-1
+ 0261 01 JASON-2
+ 0281 01 QUIKSCAT
+ 0282 01 TRMM
+ 0283 01 CORIOLIS
+ 0285 01 DMSP17
+ 0310 01 GOMS 1
+ 0311 01 GOMS 2
+ 0320 01 METEOR 2-21
+ 0321 01 METEOR 3-5
+ 0322 01 METEOR 3M-1
+ 0323 01 METEOR 3M-2
+ 0341 01 RESURS 01-4
+ 0430 01 INSAT 1B
+ 0431 01 INSAT 1C
+ 0432 01 INSAT 1D
+ 0450 01 INSAT 2A
+ 0451 01 INSAT 2B
+ 0452 01 INSAT 2E
+ 0470 01 INSAT 3A
+ 0471 01 INSAT 3D
+ 0472 01 INSAT 3E
+ 0500 01 FY-1C
+ 0501 01 FY-1D
+ 0510 01 FY-2
+ 0512 01 FY-2B
+ 0513 01 FY-2C
+ 0514 01 FY-2D
+ 0700 01 TIROS M (ITOS 1)
+ 0701 01 NOAA 1
+ 0702 01 NOAA 2
+ 0703 01 NOAA 3
+ 0704 01 NOAA 4
+ 0705 01 NOAA 5
+ 0706 01 NOAA 6
+ 0707 01 NOAA 7
+ 0708 01 TIROS-N
+ 0710 01 GOES (SMS 1)
+ 0711 01 GOES (SMS 2)
+ 0720 01 TOPEX
+ 0721 01 GFO (GEOSAT FOLLOW ON)
+ 0722 01 GRACE A
+ 0723 01 GRACE B
+ 0731 01 GOES 1
+ 0732 01 GOES 2
+ 0733 01 GOES 3
+ 0734 01 GOES 4
+ 0735 01 GOES 5
+ 0740 01 COSMIC-1
+ 0741 01 COSMIC-2
+ 0742 01 COSMIC-3
+ 0743 01 COSMIC-4
+ 0744 01 COSMIC-5
+ 0745 01 COSMIC-6
+ 0763 01 NIMBUS 3
+ 0764 01 NIMBUS 4
+ 0765 01 NIMBUS 5
+ 0766 01 NIMBUS 6
+ 0767 01 NIMBUS 7
+ 0780 01 ERBS
+ 0781 01 UARS
+ 0782 01 EARTH PROBE
+ 0783 01 TERRA
+ 0784 01 AQUA
+ 0785 01 AURA
+ 0800 01 SUNSAT
+ 0820 01 SAC-C
+ 1023 01 MISSIN VALUE
+001032 0041 0001 01 PREPROCESSING CONSISTENCY CHECK
+ 0010 01 BIAS CORRECTION
+ 0020 01 BLACK LIST
+ 0030 01 OI MASS AND WIND ANALYSIS, REPORT STATUS
+ 0031 01 OI HUMIDITY ANALYSIS, REPORT STATUS
+ 0032 01 OI ANALYSIS VARIABLES
+ 0033 01 OI ANALYSIS, FIRST GUESS Q/C
+ 0034 01 OI ANALYSIS, FINAL ANALYSIS Q/C
+ 0035 01 OI ANALYSIS, EVENT FLAGS
+ 0040 01 DYNAMIC INITIALISATION SCHEME
+ 0041 01 NORMAL MODE INITIALISATION SCHEME
+ 0050 01 SURFACE ANALYSIS, REPORT STATUS
+ 0051 01 SURFACE ANALYSIS VARIABLES
+ 0052 01 SURFACE ANALYSIS Q/C
+ 0053 01 SURFACE ANALYSIS, EVENT FLAGS
+ 0060 01 3D VAR REPORT STATUS
+ 0061 01 3D VAR ANALYSIS VARIABLES
+ 0062 01 3D VAR Q/C
+ 0063 01 3D VAR EVENT FLAGS
+ 0080 01 PRESAT FIRST GUESS
+ 0081 01 PRESAT ERROR STANDARD DEVIATIONS
+ 0082 01 PRESAT BIAS ESTIMATES
+ 0083 01 PRESAT BRIGHTNESS TEMPERATURE QUALITY FLAGS
+ 0084 01 PRESAT SAMARY FLAGS
+ 0090 01 FIRST GUESS (6 HOUR FORECAST)
+ 0091 01 FIRST GUESS (FGAT INTERPOLATED)
+ 0100 01 PRESCAT AMBIGUITY REMOVAL
+ 0110 01 WAM FIRST GUESS
+ 0111 01 WAM ANALYSIS
+ 0112 01 WAM FORECAST
+ 0113 01 WAM Q/C
+ 0201 01 COLLOCATION WITH SURFACE DATA
+ 0202 01 COLLOCATION WITH TEMP/PILOT DATA
+ 0203 01 COLLOCATION WITH AIREP DATA
+ 0204 01 COLLOCATION WITH SATOB DATA
+ 0205 01 COLLOCATION WITH TOVS DATA
+ 0206 01 COLLOCATION WITH ERS1 SCATTEROMETER DATA
+ 0207 01 COLLOCATION WITH ERS1 ALTIMETER DATA
+ 0220 01 ERS1 SCATTEROMETER COLLOCATION BLACK LIST
+ 0230 01 GAUSS ERROR
+ 0231 01 GROSS ERROR
+001031 0219 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC 50
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC 110
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC 140
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+ 0255 01 MISSING VALUE 219
+001032 0041 0001 01 PREPROCESSING CONSISTENCY CHECK
+ 0010 01 BIAS CORRECTION
+ 0020 01 BLACK LIST
+ 0030 01 OI MASS AND WIND ANALYSIS, REPORT STATUS
+ 0031 01 OI HUMIDITY ANALYSIS, REPORT STATUS
+ 0032 01 OI ANALYSIS VARIABLES
+ 0033 01 OI ANALYSIS, FIRST GUESS Q/C
+ 0034 01 OI ANALYSIS, FINAL ANALYSIS Q/C
+ 0035 01 OI ANALYSIS, EVENT FLAGS
+ 0040 01 DYNAMIC INITIALISATION SCHEME
+ 0041 01 NORMAL MODE INITIALISATION SCHEME
+ 0050 01 SURFACE ANALYSIS, REPORT STATUS
+ 0051 01 SURFACE ANALYSIS VARIABLES
+ 0052 01 SURFACE ANALYSIS Q/C
+ 0053 01 SURFACE ANALYSIS, EVENT FLAGS
+ 0060 01 3D VAR REPORT STATUS
+ 0061 01 3D VAR ANALYSIS VARIABLES
+ 0062 01 3D VAR Q/C
+ 0063 01 3D VAR EVENT FLAGS
+ 0080 01 PRESAT FIRST GUESS
+ 0081 01 PRESAT ERROR STANDARD DEVIATIONS
+ 0082 01 PRESAT BIAS ESTIMATES
+ 0083 01 PRESAT BRIGHTNESS TEMPERATURE QUALITY FLAGS
+ 0084 01 PRESAT SAMARY FLAGS
+ 0090 01 FIRST GUESS (6 HOUR FORECAST)
+ 0091 01 FIRST GUESS (FGAT INTERPOLATED)
+ 0100 01 PRESCAT AMBIGUITY REMOVAL
+ 0110 01 WAM FIRST GUESS
+ 0111 01 WAM ANALYSIS
+ 0112 01 WAM FORECAST
+ 0113 01 WAM Q/C
+ 0201 01 COLLOCATION WITH SURFACE DATA
+ 0202 01 COLLOCATION WITH TEMP/PILOT DATA
+ 0203 01 COLLOCATION WITH AIREP DATA
+ 0204 01 COLLOCATION WITH SATOB DATA
+ 0205 01 COLLOCATION WITH TOVS DATA
+ 0206 01 COLLOCATION WITH ERS1 SCATTEROMETER DATA
+ 0207 01 COLLOCATION WITH ERS1 ALTIMETER DATA
+ 0220 01 ERS1 SCATTEROMETER COLLOCATION BLACK LIST
+ 0230 01 GAUSS ERROR
+ 0231 01 GROSS ERROR
+001033 0219 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC 50
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC 110
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC 140
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA 190
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+ 0255 01 MISSING VALUE
+001035 0219 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC 50
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC 110
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC 140
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA 190
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+ 0255 01 MISSING VALUE 219
+001090 0005 0000 01 LAF (LAGGED-AVERAGE FORECASTING)
+ 0001 01 BREEDING
+ 0002 01 SINGULAR VECTOR
+ 0003 01 MULTIPLE ANALYSIS CYCLE
+ 0255 01 MISSING VALUE
+001092 0005 0000 01 UNPERTURBED HIGH-RESOLUTION CONTROL FORECAST
+ 0001 01 UNPERTURBED LOW-RESOLUTION CONTROL FORECAST
+ 0002 01 NEGATIVELY PERTURBED FORECAST
+ 0003 01 POSITIVELY PERTURBED FORECAST
+ 0255 01 MISSING VALUE
+002001 0004 0000 01 AUTOMATIC STATION
+ 0001 01 MANNED STATION
+ 0002 01 HYBRID, BOTH MANNED AND AUTOMATIC
+ 0003 01 MISSING VALUE
+002002 0004 0000 01 MEASURED IN M S-1 UNLESS OTHERWISE INDICATED
+ 0001 01 CERTIFIED INSTRUMENTS
+ 0002 01 ORIGINALY MEASURED IN KNOTS
+ 0003 01 ORIGINALY MEASURED IN KM/H
+002003 0012 0000 01 PRESSURE INSTRUMENT ASSOCIATED WITH WIND-MEASURING EQUIPMENT
+ 0001 01 OPTICAL THEODOLITE
+ 0002 01 RADIO THEODOLITE
+ 0003 01 RADAR
+ 0004 01 VLF-OMEGA
+ 0005 01 LORAN C
+ 0006 01 WIND PROFILER
+ 0007 01 SATELLITE NAVIGATION
+ 0008 01 RADIO-ACOUSTIC SOUNDING SYSTEM (RASS)
+ 0009 01 SODAR
+ 0014 02 PRESSURE INSTRUMENT ASSOCIATED WITH WIND MEASUREMENT EQUIPME
+ NT BUT PRESSURE ELEMENT FAILED DURING ASCENT
+ 0015 01 MISSING VALUE
+002004 0011 0000 01 USA OPEN PAN EVAPORIMETER (WITHOUT COVER)
+ 0001 01 USA OPEN PAN EVAPORIMETER (MESH COVERED)
+ 0002 01 GGI-300 EVAPORIMETER (SUNKEN)
+ 0003 01 20 M**2 TANK
+ 0004 01 OTHERS
+ 0005 01 RICE
+ 0006 01 WHEAT
+ 0007 01 MAIZE
+ 0008 01 SORGHUM
+ 0009 01 OTHER CROPS
+ 0015 01 MISSING VALUE
+002011 0054 0000 01 RESERVED
+ 0001 01 RESERVED
+ 0002 01 NO RADIOSONDE-PASSIVE TARGET(E.G.REFLECTOR)
+ 0003 01 NO RADIOSONDE-ACTIVE TARGET(E.G.TRANSPONDER)
+ 0004 01 NO RADIOSONDE-PASSIVE TEMPERATURE-HUMIDITY PROFILER
+ 0005 01 NO RADIOSONDE-ACTIVE TEMPERATURE-HUMIDITY PROFILER
+ 0006 01 NO RADIOSONDE-RADIO ACOUSTIC SOUNDER
+ 0009 01 NO RADIOSONDE-SYSTEM UNKNOWN OR NOT SPECIFIED
+ 0010 01 RS VIZ TYPE A (USA)
+ 0011 01 RS VIZ TYPE B (USA)
+ 0012 01 RS SDC (SPACE DATA CORPORATION-USA)
+ 0013 01 ASTOR (NO LONGER MADE-AUSTRALIA)
+ 0014 01 VIZ MARK I MICROSONDE(USA)
+ 0015 01 EEC COMPANY TYPE 23 (USA)
+ 0016 01 ELIN (AUSTRIA)
+ 0017 01 GRAW G. (GERMANY)
+ 0019 01 GRAW M60 (GERMANY)
+ 0020 01 INDIAN MET SERVICE MK3 (INDIA)
+ 0021 01 VIZ/JIN YANG MARK I MICROSONDE(SOUTH KOREA)
+ 0022 01 MEISEI RS2-80 (JAPAN)
+ 0023 01 MESURAL FMO 1950A (FRANCE)
+ 0024 01 MESURAL FMO 19455A (FRANCE)
+ 0025 01 MESURAL MH73A (FRANCE)
+ 0026 01 METEOLABOR BASORA (SWITZERLAND)
+ 0027 01 AVK-MRZ (USSR)
+ 0028 01 METEORIT MARZ2-1 (USSR)
+ 0029 01 METEIRIT MARZ2-2 (USSR)
+ 0030 01 OKI RS2-80 (JAPAN)
+ 0031 01 VIZ/VALCOM TYPE A PRESSURE-COMMUTATED(CANADA)
+ 0032 01 SHANGAI RADIO (CHINA)
+ 0033 01 UK MET OFFICE MK3( UK)
+ 0034 01 VINOHRADY(CZECHOSLOVAKIA)
+ 0035 01 VAISALA RS18 (FINLAND)
+ 0036 01 VAISALA RS21 (FINLAND)
+ 0037 01 VAISALA RS80 (FINLAND)
+ 0038 01 VIZ LOCATE (LORAN-C)(USA)
+ 0039 01 SPRENGER E076 (GERMANY)
+ 0040 01 SPRENGER E084 (GERMANY)
+ 0041 01 SPRENGER E085 (GERMANY)
+ 0042 01 SPRENGER E086 (GERMANY)
+ 0043 01 AIR IS -4A-1680 (UK)
+ 0044 01 AIR IS -4A-1680 X (UK)
+ 0045 01 RS MSS(USA)
+ 0046 01 AIR IS -4A-403(USA)
+ 0047 01 MEISLEI RS2-91(JAPAN)
+ 0048 01 VALCOM(CANADA)
+ 0049 01 VIZ MARK II(USA)
+ 0060 01 VAISALA RS80/MICROCORA (FINLAND)
+ 0061 01 VAISALA RS80/DIGCORA OR MARWIN (FINLAND)
+ 0062 01 VAISALA RS80/PCCORA (FINLAND)
+ 0063 01 VAISALA RS80/STAR (FINLAND)
+ 0064 03 ORBITAL,SCIENCE CORPORATION,SPACE DATA DIVISION,TRANSPONDER
+ RADIOSONDE,TYPE 909-11-XX,WHERE XX CORRECPOND TO THE MODEL
+ OF THE INSTRUMENT
+ 0065 01 VIZ TRANSPONDER RADIOSONDE,MODEL NUMBER 1499-520(USA)
+ 0255 01 MISSING VALUE
+002012 0001 0000 01 TO BE DEVELOPED
+002013 0009 0000 01 NO CORRECTION
+ 0001 01 CIMO SOLAR CORRECTED AND CIMO INFRARED CORRECTED
+ 0002 01 CIMO SOLAR CORRECTED AND IFRARED CORRECTED
+ 0003 01 CIMO SOLAR CORRECTED ONLY
+ 0004 02 SOLAR AND INFRARED CORRECTED AUTOMATICALLY BY RADIOSONDE SY
+ STEM
+ 0005 01 SOLAR CORRECTED AUTOMATICALLY BY RADIOSONDE SYSTEM
+ 0006 01 SOLAR AND INFRARED CORRECTED AS SPECIFIED BY COUNTRY
+ 0007 01 SOLAR CORRECTED AS SPECIFIED BY COUNTRY
+ 0015 01 MISSING VALUE
+002014 0050 0000 01 NO WINDFINDING
+ 0001 01 AUTOMATIC WITH AUXILIARY OPTICAL DIRECTION FINDING
+ 0002 01 AUTOMATIC WITH AUXILIARY RADIO DIRECTION FINDING
+ 0003 01 AUTOMATIC WITH AUXILIARY RANGING
+ 0004 01 NOT USED
+ 0005 01 AUTOMATIC WITH MULTIPLE VLF-OMEGA SIGNALS
+ 0006 01 AUTOMATIC CROSS CHAIN LORAN-C
+ 0007 01 AUTOMATIC WITH AUXILIARY WIND PROFILER
+ 0008 01 AUTOMATIC SATELLITE NAVIGATION
+ 0019 01 TRACKING TECHNIQUE NOT SPECIFIED
+ 0020 01 VESSEL STOPPED
+ 0021 01 VESSEL DIVERTED FROM ORIGINAL DESTINATION
+ 0022 01 VESSEL'S ARRIVAL DELAYED
+ 0023 01 CONTAINER DAMAGED
+ 0024 01 POWER FAILURE TO CONTAINER
+ 0029 01 OTHER PROBLEMS
+ 0030 01 MAJOR POWER PROBLEMS
+ 0031 01 UPS INOPERATIVE
+ 0032 01 RECEIVER HARDWARE PROBLEMS
+ 0033 01 RECEIVER SOFTWARE PROBLEMS
+ 0034 01 PROCESSOR HARDWARE PROBLEMS
+ 0035 01 PROCESSOR SOFTWARE PROBLEMS
+ 0036 01 NAVAID SYSTEM DAMAGED
+ 0037 01 SHORTAGE OF LIFTING GAS
+ 0039 01 OTHER PROBLEMS
+ 0040 01 MECHANICAL DEFECT
+ 0041 01 MATERIAL DEFECT (HAND LAUNCHER)
+ 0042 01 POWER FAILURE
+ 0043 01 CONTROL FAILURE
+ 0044 01 PNEUMATIC/HYDRAULIC FAILURE
+ 0045 01 OTHER PROBLEMS
+ 0046 01 COMPRESSOR PROBLEMS
+ 0047 01 BALLOON PROBLEMS
+ 0048 01 BALLOON RELEASE PROBLEMS
+ 0049 01 LAUNCHER DAMAGED
+ 0050 01 R/S RECEIVER ANTENNA DEFECT
+ 0051 01 NAVAID ANTENNA DEFECT
+ 0052 01 R/S RECEIVER CABLING (ANTENNA DEFECT)
+ 0053 01 NAVAID ANTENNA CABLING DEFECT
+ 0059 01 OTHER PROBLEMS
+ 0060 01 ASAP COMMUNICATIONS DEFECT
+ 0061 01 COMMUNICATIONS FACILITY REJECTED DATA
+ 0062 01 NO POWER AT TRANSMITTINGANTENN
+ 0063 01 ANTENNA CABLE BROKEN
+ 0064 01 ANTENNA CABLE DEFECT
+ 0065 01 MESSAGE TRANSMITTED POWER BELOW NORMAL
+ 0069 01 OTHER PROBLEMS
+ 0070 01 ALL SYSTEMS IN NORMAL OPERATION
+ 0099 01 STATUS OF SYSTEM AND ITS COMPONENTS NOT SPECIFIED
+ 0127 01 MISSING VALUE
+002015 0006 0001 01 PRESSURE ONLY RADIOSONDE
+ 0002 01 PRESSURE ONLY RADIOSONDE PLUS TRANSPONDER
+ 0003 01 PRESSURE ONLY RADIOSONDE PLUS RADAR REFLECTOR
+ 0004 01 NO PRESSURE RADIOSONDE PLUS TRANSPONDER
+ 0005 01 NO PRESSURE RADIOSONDE PLUS RADAR REFLECTOR
+ 0015 01 MISSING VALUE
+002016 0004 0001 01 TRAIN REGULATOR
+ 0002 01 LIGHT UNIT
+ 0003 01 PARACHUTE
+ 0004 01 ROOFTOP RELEASE
+002019 0296 0010 02 BNSC RADIOMETER AATSR ADVANCED ALONG TRACK SCANNIN
+ G RADIOMETER
+ 0011 02 BNSC RADIOMETER ATSR ALONG TRACK SCANNING RADIOME
+ TER
+ 0012 02 BNSC RADIOMETER ATSR-2 ALONG TRACK SCANNING RADIOME
+ TER -2
+ 0013 01 BNSC RADIOMETER MWR MICROWAVE RADIOMETER
+ 0030 01 CNES COMMUNICATIONS ARGOS
+ 0040 01 CNES LIDAR LASER REFLECTORS
+ 0041 02 CNES LIDAR DORIS DOPPLER ORBITOGRAPHY AND RADIO-POSIT
+ IONING INTEGRATED BY SATELLITE
+ 0042 02 CNES LIDAR DORIS-NG DOPPLER ORBITOGRAPHY AND RAD
+ IO-POSITIONING INTEGRATED BY SATELLITE-NG
+ 0047 03 CNES RADAR ALTIMETERS POSEIDON-1 (SSALT-1) POSI
+ TIONING OCEAN SOLID EARTH ICE DYNAMICS ORBITING NAVIGATOR (S
+ INGLE FREQUENCY SOLID STATE RADAR ALTIMETER)
+ 0048 03 CNES RADAR ALTIMETERS POSEIDON-2 (SSALT-2) POSI
+ TIONING OCEAN SOLID EARTH ICE DYNAMICS ORBITING NAVIGATOR (D
+ UAL FREQUENCY SOLID STATE RADAR ALTIMETER)
+ 0050 01 CNES IMAGER RADIOMETER ATSR/M ATSR/M
+ 0051 01 CNES HIGH RESOLUTION OPTICAL IMAGERS HRG
+ 0052 01 CNES RADIOMETER HRV HIGH RESOLUTION VISIBLE
+ 0053 02 CNES RADIOMETER HRVIR HIGH RESOLUTION VISIBLE AND
+ INFRA-RED
+ 0054 02 CNES RADIOMETER SCARAB/MV2 SCANNER FOR EARTH'S
+ RADIATION BUDGET
+ 0055 01 CNES RADIOMETER POLDER POLDER
+ 0060 01 CNES SPECTROMETER VEGETATION VEGETATION
+ 0061 01 CNES SPECTROMETER WINDII WINDII
+ 0080 01 CSA COMMUNICATIONS RADARSAT DTT
+ 0081 01 CSA COMMUNICATIONS RADARSAT TTC
+ 0085 02 CSA RADAR SAR (CSA) SYNTHETIC APERTURE RADAR (CS
+ A)
+ 0090 02 CSA RADIOMETER MOPITT MEASUREMENTS OF POLLUTION IN
+ THE TROPOSPHERE
+ 0091 02 CSA CHEMISTRY INSTRUMENTS OSIRIS OPTICAL SPECTROGRAPH
+ AND INFRA-RED IMAGING SYSTEM
+ 0097 01 CSIRO RADIOMETER PANCHROMATIC IMAGER
+ 0098 02 CRCSS ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GPS
+ RECEIVER
+ 0102 02 DLR RADIOMETER CHAMP GPS SOUNDER GPS TURBORO
+ GUE SPACE RECEIVER (TRSR)
+ 0103 01 UNKNOWN
+ 0116 03 DLR MAGNETOMETER IGOR CHAMP GRAVITY PACKAGE (ACCELEROMETE
+ R+GPS) INTEGRATED GPS AND OCCULTATION RECEIVER STAR AC
+ CELEROMETER
+ 0117 03 DLR MAGNETOMETER CHAMP MAGNETOMETRY PACKAGE (1 SCALAR
+ +2 VECTOR MAGNETOMETER) OVERHAUSER MAGNETOMETER (OVM) AN
+ D FLUXGATE MAGNETOMETER (FGM)
+ 0120 02 ESA COMMUNICATIONS ENVISAT COMMS COMMUNICATIONS PACKA
+ GE ON ENVISAT
+ 0121 02 ESA COMMUNICATIONS ERS COMMS COMMUNICATION PACKAG
+ E FOR ERS
+ 0130 01 ESA LIDARS ALADIN ATMOSPHERIC LASER DOPPLER INSTRUMENT
+ 0131 01 ESA LIDARS ATLID ATMOSPHERIC LIDAR
+ 0140 02 ESA RADAR AMI/SAR/IMAGE ACTIVE MICROWAVE INSTRUMENTA
+ TION. IMAGE MODE
+ 0141 02 ESA RADAR AMI/SAR/WAVE ACTIVE MICROWAVE INSTRUMENTA
+ TION. WAVE MODE
+ 0142 02 ESA RADAR AMI/SCATTEROMETER ACTIVE MICROWAVE INS
+ TRUMENTATION. WIND MODE
+ 0143 01 ESA RADAR ASAR ASAR
+ 0144 02 ESA IMAGING MICROWAVE RADARS ASAR ADVANCED SYN
+ TETIC APERTURA RADAR (IMAGE MODE)
+ 0145 02 ESA IMAGING MICROWAVE RADARS ASAR ADVANCED SYN
+ TETIC APERTURA RADAR (WAVE MODE)
+ 0146 01 ESA CLOUD PROFILE AND RAIN RADARS CPR CLOUD RADAR
+ 0147 01 ESA RADAR RA-2/MWR RADAR ALTIMETER - 2
+ 0148 01 ESA RADAR RA/MWR RADAR ALTIMETER
+ 0150 01 ESA SCATTEROMETERS SCATTEROMETER SCATTEROMETER
+ 0161 02 ESA RADIOMETER MIPAS MICHELSON INTERFEROMETRIC PA
+ SSIVE ATMOSPHERE SOUNDER
+ 0162 02 ESA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E MWR-2 MICROWAVE RADIOMETER-2
+ 0163 03 ESA ATMOSPHERIC CHEMISTRY INSTRUMENTS SOPRANO SUB-
+ MILIMETRE OBSERVATION OF PROCESSES IN THE ABSORPTION NOTEWOR
+ THY FOR OZONE
+ 0170 02 ESA ATMOSPHERIC CHEMISTRY INSTRUMENTS GOME I GLOB
+ AL OZONE MONITORING EXPERIMENT
+ 0172 02 ESA SPECTROMETER GOMOS GLOBAL OZONE MONITORING BY O
+ CCULTATION OF STARS
+ 0174 02 ESA SPECTROMETER MERIS MEDIUM RESOLUTION IMAGING SP
+ ECTROMETER
+ 0175 02 ESA SPECTROMETER SCIAMACHY SCANNING IMAGING ABS
+ ORPTION SPECTROMETER FOR ATMOSPHERIC CARTOGRAPHY
+ 0181 02 EUMETSAT COMMUNICATIONS METEOSAT COMMS COMMUNICATIO
+ NS PACKAGE FOR METEOSAT
+ 0182 02 EUMETSAT COMMUNICATIONS MSG COMMS COMMUNICATIO
+ NS PACKAGE FOR MSG
+ 0190 02 ESA/ EUMETSAT SCATTEROMETERS ASCAT ADVANCED SCATTE
+ ROMETER
+ 0200 02 EUMETSAT RADIOMETER GERB GEOSTATIONARY EARTH
+ RADIATION BUDGET
+ 0202 02 ESA/ EUMETSAT RADIOMETER GRAS GNSS RECEIVER F
+ OR ATMOSPHERIC SOUNDING
+ 0203 02 EUMETSAT RADIOMETER MHS MICROWAVE HUMIDITY S
+ OUNDER
+ 0205 02 EUMETSAT RADIOMETER MVIRI METEOSAT VISIBLE AND
+ INFRA-RED IMAGER
+ 0207 02 EUMETSAT RADIOMETER SEVIRI SPINNING ENHANCED VI
+ SIBLE AND INFRARED IMAGER
+ 0208 02 EUMETSAT IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR)
+ VIRI VIRI
+ 0220 02 ESA/ EUMETSAT SPECTROMETER GOME-2 GLOBAL OZONE MO
+ NITORING EXPERIMENT - 2
+ 0221 03 CNES/ EUMETSAT ATMOSPHERIC TEMPERATURE AND HUMIDITY S
+ OUNDERS IASI INFRA-RED ATMOSPHERIC SOUNDING INTERFEROME
+ TER
+ 0240 02 CAST COMMUNICATIONS DCP DATA COLLECTION PLATFORM TRA
+ NSPONDER
+ 0245 01 CAST RADIOMETER CCD HIGH RESOLUTION CCD CAMERA
+ 0246 02 INPE ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS HSB
+ HUMIDITY SOUNDER/BRAZIL
+ 0248 02 INPE IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) OBA
+ OBSERVADOR BRASILEIRO DA AMAZONIA
+ 0250 01 CAST RADIOMETER WFI WIDE FIELD IMAGER
+ 0255 02 CAST SPECTROMETER IRMSS INFRA RED MULTI SPECTRAL SCA
+ NNER
+ 0260 01 ISRO PRECISION ORBIT BSS & FSS TRANSPONDERS
+ 0261 01 ISRO PRECISION ORBIT DRT-S&R
+ 0262 02 ISRO COMMUNICATIONS INSAT COMMS COMMUNICATIONS PACKA
+ GE FOR INSAT
+ 0268 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS HR-PAN HIGH RESOLUT
+ ION PANCHROMATIC CAMERA
+ 0269 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) MSMR MULTIFREQUENCY SCANNING MICROWAVE RADIOMETER
+ 0270 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VHRR
+ VERY HIGH RESOLUTION RADIOMETER
+ 0271 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) WIFS
+ WIDE FIELD SENSOR
+ 0275 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS AWIFS ADVANCED WID
+ E FIELD SENSOR
+ 0276 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-I LINEAR IMAGI
+ NG SELF SCANNER - I
+ 0277 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-II LINEAR IMAGI
+ NG SELF SCANNER - II
+ 0278 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-III LINE
+ AR IMAGING SELF SCANNER - III
+ 0279 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-IV LINEAR IMAGI
+ NG SELF SCANNER - IV
+ 0284 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS PAN PANCHROMATIC
+ SENSOR
+ 0285 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MOS
+ MODULAR OPTO-ELECTRONIC SCANNER
+ 0286 02 ISRO OCEAN COLOUR INSTRUMENTS OCM OCEAN COLOUR
+ MONITOR
+ 0290 02 JMA COMMUNICATIONS MTSAT COMMS COMMUNICATIONS PACKA
+ GE FOR MTSAT
+ 0294 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS IMAGER/MTSAT
+ -1R IMAGER/MTSAT
+ 0295 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS IMAGER/MTSAT
+ IMAGER/MTSAT
+ 0296 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS VISSR (GMS4)
+ VISIBLE AND INFRA-RED SPIN SCAN RADIOMETER (GMS4)
+ 0300 01 NASA LIDARS GLAS GEOSCIENCE LASER ALTIMETER SYSTEM
+ 0301 01 NASA PRECISION ORBIT LRA LASER RETROREFLECTOR ARRAY
+ 0302 01 NASA LIDARS MBLA MULTI BEAM LASER ALTIMETER
+ 0309 02 NASA CLOUD PROFILE AND RAIN RADARS CPR (CLOUDSAT) CLOU
+ D PROFILING RADAR
+ 0312 01 NASA RADAR NSCAT NASA SCATTEROMETER
+ 0313 01 NASA RADAR SEAWINDS ADEOS II - NASA SCATTEROMETER
+ 0330 02 NASA EARTH RADIATION BUDGET RADIOMETER ACRIM ACTI
+ VE CAVITY RADIOMETER IRRADIANCE MONITOR
+ 0334 02 NASA TOTAL AND PROFILE OZONE BUV BACKSCATTER ULTRAVIO
+ LET INSTRUMENT
+ 0336 02 NASA HIGH RESOLUTION OPTICAL IMAGERS ALI ADVANCED LAN
+ D IMAGER
+ 0347 02 NASA HIGH RESOLUTION OPTICAL IMAGERS ASTER ADVANCED SPA
+ CEBORNE THERMAL EMISSION AND REFLECTION RADIOMETER
+ 0348 02 NASA EARTH RADIATION BUDGET RADIOMETER CERES-2 CLOU
+ D AND THE EARTH'S RADIANT ENERGY SYSTEM
+ 0351 02 CONAE ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GPSD
+ R GPS DEMONSTRATION RECEIVER
+ 0353 02 NASA TOTAL AND PROFILE OZONE HIRDLS HIGH RESOLUTION DYNA
+ MICS LIMB SOUNDER
+ 0354 02 NASA TOTAL AND PROFILE OZONE HRDI HIGH RESOLUTION DOPP
+ LER IMAGER
+ 0356 01 NASA RADIOMETER LIS LIGHTNING IMAGING SENSOR
+ 0358 02 NASA MAGNETIC FIELD, AUROAL IMAGERYSCINTILLATION BOUNDARY
+ PEM PARTICLE ENVIRONMENT MONITOR
+ 0359 02 NASA OCEAN COLOUR INSTRUMENTS SEAWIFS SEA-VIEWING
+ WIDE FIELD-OF-VIEW SENSOR
+ 0360 02 NASA EARTH RADIATION BUDGET RADIOMETER SUSIM (UARS)
+ SOLAR ULTRAVIOLET IRRADIANCE MONITOR
+ 0363 02 NASA TOTAL AND PROFILE OZONE SBUV/1 SOLAR BACKSCATTER UL
+ TRAVIOLET 1 INSTRUMENT
+ 0365 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) TMI TRMM MICROWAVE IMAGER
+ 0366 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) JMR JASON-1 MICROWAVE RADIOMETER
+ 0369 02 NASA TOTAL AND PROFILE OZONE LIMS LIMB INFRARED MONITO
+ R OF THE STRATOSPHERE
+ 0370 02 NASA TOTAL AND PROFILE OZONE LRIR LIMB RADIANCE INVERS
+ ION RADIOMETER INSTRUMENT
+ 0371 02 NASA TOTAL AND PROFILE OZONE EPIC EARTH POLYCHROMATIC
+ IMAGING CAMERA
+ 0372 02 NASA EARTH RADIATION BUDGET RADIOMETER NISTAR NIST
+ ADVANCED RADIOMETER
+ 0373 02 NASA MAGNETIC FIELD, AUROAL IMAGERY SCINTILLATION BOUNDAR
+ Y PLASMA-MAG
+ 0374 01 NASA OTHER XPS XUV PHOTOMETER SYSTEM
+ 0375 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIRS
+ VISIBLE INFRA-RED SCANNER
+ 0376 03 CNES MULTIPLE DIRECTION/POLARISATION RADIOMETERS POLD
+ ER II POLARIZATION AND DIRECTIONALITY OF THE EARTH'S R
+ EFLECTANCE - II
+ 0377 02 NASA EARTH RADIATION BUDGET RADIOMETER TIM TOTA
+ L IRRADIANCE MONITOR
+ 0379 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) WFC
+ WIDE FIELD CAMERA
+ 0382 02 NASA SPECTRO-RADIOMETER CLAES CRYOGENIC LIMB ARRAY
+ ETALON SPECTROMETER
+ 0383 02 NASA SPECTRO-RADIOMETER HALOE HALOGEN OCCULTATION
+ EXPERIMENT
+ 0384 02 NASA SPECTRO-RADIOMETER ISAMS IMPROVED STRATOSPHER
+ IC AND MESOSPHERIC SOUNDER
+ 0385 02 NASA SPECTRO-RADIOMETER MISR MULTI-ANGLE IMAGING
+ SPECTRORADIOMETER
+ 0386 01 NASA SPECTRO-RADIOMETER MLS MICROWAVE LIMB SOUNDER
+ 0387 02 NASA SPECTRO-RADIOMETER MLS (EOS-AURA) MICROWAVE LIMB
+ SOUNDER (EOS-AURA)
+ 0389 02 NASA SPECTRO-RADIOMETER MODIS MODERATE-RESOLUTION
+ IMAGING SPECTRORADIOMETER
+ 0393 02 NASA GRAVITY HAIRS HIGH ACCURACY INTER-SATELLITE RANGIN
+ G SYSTEM
+ 0394 02 NASA TOTAL AND PROFILE OZONE OMI OZONE MEASURING INST
+ RUMENT
+ 0395 02 NASA RADIOMETER ATMOSPHERIC CORRECTOR ATMOSPHERIC
+ CORRECTOR
+ 0396 01 NASA RADIOMETER HYPERION HYPERSPECTRAL IMAGER
+ 0399 02 NASA SPECTRO-RADIOMETER SAGE I STRATOSPHERIC AEROSO
+ L AND GAS EXPERIMENT-I
+ 0400 02 NASA SPECTRO-RADIOMETER SAGE II STRATOSPHERIC AEROSO
+ L AND GAS EXPERIMENT-II
+ 0401 02 NASA SPECTRO-RADIOMETER SAGE III STRATOSPHERI
+ C AEROSOL AND GAS EXPERIMENT-III
+ 0402 02 NASA SPECTRO-RADIOMETER SAMS STRATOSPHERIC AND ME
+ SOSPHERIC SOUNDER
+ 0403 02 NASA SPECTRO-RADIOMETER SAM II STRATOSPHERIC AEROSO
+ L MEASUREMENT II
+ 0404 02 NASA SPECTRO-RADIOMETER IRIS INFRARED INTERFEROME
+ TER SPECTROMETER
+ 0405 02 NASA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GIFT
+ S GEOSYNCHRONOUS IMAGING FOURIER TRANSFORM SPECTROMETER
+ 0420 01 NASA SPECTROMETER AIRS ATMOSPHERIC INFRA-RED SOUNDER
+ 0426 02 NASA SPECTROMETER SOLSTICE SOLAR STELLAR IRRADI
+ ANCE COMPARISON EXPERIMENT
+ 0430 02 NASA SPECTROMETER TES TROPOSHPERIC EMISSION SPECTR
+ OMETER
+ 0431 02 NASA SPECTROMETER TOMS TOTAL OZONE MAPPING SPECTROM
+ ETER
+ 0450 02 JAXA COMMUNICATIONS ADEOS COMMS COMMUNICATIONS PACKA
+ GE FOR ADEOS
+ 0451 02 JAXA COMMUNICATIONS DCS (JAXA) DATA COLLECTION SYST
+ EM (JAXA)
+ 0453 02 JAXA COMMUNICATIONS GMS COMMS COMMUNICATIONS PACKA
+ GE ON GMS
+ 0454 02 JAXA COMMUNICATIONS JERS-1 COMMS COMMUNICATIONS PACKA
+ GE FOR JERS-1
+ 0460 01 JAXA LIDAR RIS RETROREFLECTOR IN SPACE
+ 0461 01 JAXA RADAR PR PRECIPITATION RADAR
+ 0462 02 JAXA IMAGING MICROWAVE RADARS SAR SYNTETIC APE
+ RTURE RADAR
+ 0470 02 JAXA IMAGING MICROWAVE RADARS PALSAR PHASED ARRAY
+ TYPE L-BAND SYNTHETIC APERTURE RADAR
+ 0479 02 JAXA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) AMSR-E ADVANCED MICROWAVE SCANNING RADIOMETER-EOS
+ 0480 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS PRISM (ALOS) PANC
+ HROMATIC REMOTE-SENSING INSTRUMENT FOR STEREO MAPPING
+ 0481 02 JAXA RADIOMETER AMSR ADVANCED MICROWAVE SCANNING
+ RADIOMETER
+ 0482 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS AVNIR ADVANCED VIS
+ IBLE AND NEAR INFRARED RADIOMETER
+ 0483 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS AVNIR-2 ADVANCED VIS
+ IBLE AND NEAR INFRA-RED RADIOMETER TYPE 2
+ 0484 01 JAXA IMAGER GLI GLOBAL IMAGER
+ 0485 02 JAXA RADIOMETER MESSR MULTISPECTRAL ELECTRONIC SEL
+ F SCANNING RADIOMETER
+ 0486 01 JAXA RADIOMETER MSR MICROWAVE SCANNING RADIOMETER
+ 0487 02 JAXA RADIOMETER OCTS OCEAN COLOR AND TEMPERATURE S
+ CANNER
+ 0488 01 JAXA RADIOMETER OPS OPTICAL SENSOR
+ 0489 02 JAXA SPECTRO-RADIOMETER VISSR (GMS5) VISIBLE AND
+ INFRA-RED SPIN SCAN RADIOMETER (GMS5)
+ 0490 02 JAXA RADIOMETER VTIR VISIBLE AND THERMAL INFRA-RE
+ D RADIOMETER
+ 0510 02 JAXA SPECTROMETER ILAS-I IMOROVED LIMB ATOMOSPHIRIC S
+ PECTROMETER
+ 0511 02 JAXA SPECTROMETER ILAS-II IMPROVED LIMB ATOMOSPHIRIC S
+ PECTROMETER
+ 0512 02 JAXA SPECTROMETER IMG INFEROMETRIC MONITOR OF GREE
+ NHOUSE GASES
+ 0514 02 JAXA SPACE ENVIRONMENT SEM SPACE ENVIRONMENT MO
+ NITOR (JAXA)
+ 0515 02 JAXA TOTAL AND PROFILE OZONE SOFIS SOLAR OCCULTATION FO
+ URIER TRANSFORM SPECTROMETER FOR INCLINED ORBIT SATELLITE
+ 0540 02 NOAA COMMUNICATIONS DCS (NOAA) DATA COLLECTION SYST
+ EM (NOAA)
+ 0541 02 NOAA COMMUNICATIONS GOES COMMS COMMUNICATIONS PACKA
+ GE ON GOES
+ 0542 02 NOAA COMMUNICATIONS LANDSAT COMMS COMMUNICATIONS PACKA
+ GE FOR LANDSAT
+ 0543 02 NOAA COMMUNICATIONS NOAA COMMS COMMUNICATIONS PACKA
+ GE FOR NOAA
+ 0544 01 NOAA COMMUNICATIONS S&R (GOES) SEARCH AND RESCUE
+ 0545 01 NOAA COMMUNICATIONS S&R (NOAA) SEARCH AND RESCUE
+ 0546 01 NOAA COMMUNICATIONS WEFAX WEATHER FACSIMILE
+ 0547 02 NOAA SPECTROMETER SEM(GOES) SPACE ENVIRONMENT MO
+ NITOR
+ 0550 01 NOAA MAGNETIC FIELD SSM SPECIAL SENSOR MAGNETOMETER
+ 0551 02 NOAA MAGNETIC FIELD SSJ/4 SPECIAL SENSOR PRECIPITATING
+ PLASMA MONITOR
+ 0552 02 NOAA SPACE ENVIRONMENT SSIES-2 SPECIAL SENSOR IONOS
+ PHERIC PLASMA DRIFT/SCINTILLATION METER
+ 0553 02 NOAA SPACE ENVIRONMENT SSB/X-2 SPECIAL SENSOR GAMMA
+ RAY PARTICLE DECTECTOR
+ 0570 02 NOAA RADIOMETER AMSU-A ADVANCED MICROWAVE SOUNDING
+ UNIT-A
+ 0574 02 NOAA RADIOMETER AMSU-B ADVANCED MICROWAVE SOUNDING
+ UNIT-B
+ 0580 02 NOAA RADIOMETER ATOVS (HIRS/3 + AMSU + AVHRR/3) ADVA
+ NCED TIROS OPERATIONAL VERTICAL SOUNDER
+ 0590 02 NOAA RADIOMETER AVHRR/2 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/2
+ 0591 02 NOAA RADIOMETER AVHRR/3 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/3
+ 0592 02 NOAA RADIOMETER AVHRR/4 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/4
+ 0600 02 NOAA RADIOMETER ERBE EARTH'S RADIATION BUDGET EXP
+ ERIMENT
+ 0601 01 NOAA RADIOMETER ETM+ ENHANCED THEMATIC MAPPER
+ 0605 02 NOAA RADIOMETER HIRS/2 HIGH RESOLUTION INFRA-RED SO
+ UNDER/2
+ 0606 02 NOAA RADIOMETER HIRS/3 HIGH RESOLUTION INFRA-RED SO
+ UNDER/3
+ 0607 02 NOAA RADIOMETER HIRS/4 HIGH RESOLUTION INFRA-RED SO
+ UNDER/4
+ 0615 01 NOAA RADIOMETER IMAGER IMAGER
+ 0616 02 NOAA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIIR
+ S VISIBLE/INFRARED IMAGER RADIOMETER SUITE
+ 0620 02 NOAA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS CRIR
+ S/NP CROSS TRACK INFRA-RED SOUNDER/NPOESS
+ 0621 02 NOAA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS ATMS
+ ADVANCED TECHNOLOGY MICROWAVE SOUNDER
+ 0622 01 NOAA RADIOMETER MSS MULTISPECTRAL SCANNING SYSTEM
+ 0623 01 NOAA RADIOMETER MSU MICROWAVE SOUNDING UNIT
+ 0624 02 NOAA RADIOMETER SBUV/2 SOLAR BACKSCATTTER ULTRA-VIO
+ LET INSTRUMENT/2
+ 0625 02 NOAA RADIOMETER SBUV/3 SOLAR BACKSCATTTER ULTRA-VIO
+ LET INSTRUMENT/3
+ 0626 01 NOAA RADIOMETER SOUNDER SOUNDER
+ 0627 01 NOAA RADIOMETER SSU STRATOSPHERIC SOUNDING UNIT
+ 0628 01 NOAA RADIOMETER TM THEMATIC MAPPER
+ 0629 02 NOAA RADIOMETER TOVS (HIRS/2 + MSU + SSU) TIRO
+ S OPERATIONAL VERTICAL SOUNDER
+ 0630 01 NOAA RADIOMETER VAS VISSR ATMOSPHERIC SOUNDER
+ 0631 01 NOAA RADIOMETER SSZ
+ 0645 01 NOAA SPECTROMETER SEM SPACE ENVIRONMENT MONITOR
+ 0650 02 NRSCC RADIOMETER MVIRSR (10 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0651 02 NRSCC RADIOMETER MVIRSR (3 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0652 02 NRSCC RADIOMETER MVIRSR (5 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0670 01 NSAU RADAR RLSBO SIDE LOOKING MICROWAVE RADAR
+ 0680 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS MSU-EU MULTI-SPECTR
+ AL RADIOMETER WITH HIGH RESOLUTION
+ 0681 02 NSAU IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MSU-
+ UM VISIBLE MULTI-SPECTRAL RADIOMETER
+ 0682 01 NSAU RADIOMETER RM-08 IMAGING MICROWAVE RADIOMETER
+ 0683 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS SU-UMS STEREO RADIO
+ METER WITH HIGH RESOLUTION
+ 0684 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS SU-VR VISIBLE RADI
+ OMETER WITH HIGH RESOLUTION
+ 0685 01 NSAU RADIOMETER TRASSER
+ 0700 02 ROSCOSMOS COMMUNICATIONS KONDOR-2 DATA COLLECT
+ ION AND TRANSMISSION SYSTEM
+ 0701 01 ROSCOSMOS COMMUNICATIONS BRK
+ 0710 01 ROSCOSMOS LIDAR ALISSA BACKSCATTER LIDAR
+ 0712 01 ROSCOSMOS LIDAR BALKAN-2 LIDAR
+ 0715 01 ROSCOSMOS LIDAR MK-4
+ 0716 01 ROSCOSMOS LIDAR MK-4M
+ 0730 01 ROSCOSMOS RADAR GREBEN RADAR ALTIMETER
+ 0731 01 ROSCOSMOS RADAR SAR-10 SYNTETIC APERTURE RADAR
+ 0732 01 ROSCOSMOS RADAR SAR-3 SYNTETIC APERTURE RADAR
+ 0733 01 ROSCOSMOS RADAR SAR-70 SYNTETIC APERTURE RADAR
+ 0740 01 ROSCOSMOS RADAR SLR-3 SIDE LOOKING RADAR
+ 0745 01 ROSCOSMOS RADAR TRAVERS SAR
+ 0750 02 ROSCOSMOS RADIOMETER 174-K TEMPERATURE AND HUMI
+ DITY PROFILER
+ 0751 02 ROSCOSMOS RADIOMETER BTVK SCANNING TELEVISION
+ RADIOMETER
+ 0752 02 ROSCOSMOS RADIOMETER CHAIKA SCANNING IR RADIOMET
+ ER
+ 0753 02 ROSCOSMOS RADIOMETER DELTA-2 MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0755 02 ROSCOSMOS RADIOMETER IKAR-D MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0756 02 ROSCOSMOS RADIOMETER IKAR-N MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0757 02 ROSCOSMOS RADIOMETER IKAR-P MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0760 01 ROSCOSMOS RADIOMETER ISP
+ 0761 02 ROSCOSMOS RADIOMETER KFA-1000 PHOTOGRAPHIC
+ CAMERA
+ 0762 01 ROSCOSMOS RADIOMETER KFA-200 PHOTOGRAPHIC CAMERA
+ 0763 02 ROSCOSMOS RADIOMETER KFA-3000 PHOTOGRAPHIC
+ CAMERA
+ 0770 01 ROSCOSMOS RADIOMETER KLIMAT SCANNING IR RADIOMETER
+ 0771 02 ROSCOSMOS RADIOMETER KLIMAT-2 SCANNING IR
+ RADIOMETER
+ 0775 01 ROSCOSMOS RADIOMETER MIRAS
+ 0776 01 ROSCOSMOS RADIOMETER MIVZA
+ 0777 02 ROSCOSMOS RADIOMETER MIVZA-M MICROWAVE SCANNING R
+ ADIOMETER
+ 0780 01 ROSCOSMOS RADIOMETER MR-2000
+ 0781 01 ROSCOSMOS RADIOMETER MR-2000M
+ 0785 02 ROSCOSMOS RADIOMETER MR-900 SCANNING TELEPHOTOME
+ TER
+ 0786 02 ROSCOSMOS RADIOMETER MR-900B SCANNING VISUAL BAND
+ TELEPHOTOMETER
+ 0790 02 ROSCOSMOS RADIOMETER MSU-E MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0791 02 ROSCOSMOS RADIOMETER MSU-E1 MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0792 02 ROSCOSMOS RADIOMETER MSU-E2 MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0793 01 ROSCOSMOS RADIOMETER MSU-M
+ 0794 02 ROSCOSMOS RADIOMETER MSU-S MULTISPECTRAL MEDIUM
+ RESOLUTION SCANNER
+ 0795 02 ROSCOSMOS RADIOMETER MSU-SK MULTISPECTRAL MEDIUM
+ RESOLUTION CONICAL SCANNER
+ 0796 02 ROSCOSMOS RADIOMETER MSU-V MULTISPECTRAL HIGH R
+ ESOLUTION CONICAL SCANNER
+ 0810 02 ROSCOSMOS RADIOMETER MTZA SCANNING MICROWAVE R
+ ADIOMETER
+ 0815 03 ROSCOSMOS IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE
+ MICROWAVE) MZOAS SCANNING MICROWAVE RADIO
+ METER
+ 0820 03 ROSCOSMOS IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE
+ MICROWAVE) R-225 SINGLE CHANNEL MICROWAVE
+ RADIOMETER
+ 0821 01 ROSCOSMOS RADIOMETER R-400
+ 0822 02 ROSCOSMOS RADIOMETER R-600 SINGLE CHANNEL MICRO
+ WAVE RADIOMETER
+ 0830 02 ROSCOSMOS RADIOMETER RMS RADIATION MEASUREMEN
+ T SYSTEM
+ 0835 01 ROSCOSMOS RADIOMETER TV CAMERA
+ 0836 01 ROSCOSMOS RADIOMETER SILVA
+ 0840 02 ROSCOSMOS SPECTRO-RADIOMETER SROSMO SPECTRORADIO
+ METER FOR OCEAN MONITORING
+ 0850 02 ROSCOSMOS SPECTROMETER BUFS-2 BACKSCATTER SPECTROM
+ ETER/2
+ 0851 02 ROSCOSMOS SPECTROMETER BUFS-4 BACKSCATTER SPECTROM
+ ETER/4
+ 0855 02 ROSCOSMOS SPECTROMETER ISTOK-1 INFRA-RED SPECTROMET
+ ER
+ 0856 02 ROSCOSMOS SPECTROMETER SFM-2 SPECTROMETER TO MEAS
+ URE DIRECT SOLAR RADIATION
+ 0857 01 ROSCOSMOS SPECTROMETER DOPI
+ 0858 01 ROSCOSMOS SPECTROMETER KGI-4
+ 0859 01 ROSCOSMOS SPECTROMETER OZON-M
+ 0860 01 ROSCOSMOS SPECTROMETER RMK-2
+ 0900 02 NOAA RADIOMETER MAXIE MAGNETOSPHERIC ATMOSPHERIC X
+ -RAY IMAGING EXPERIMENT
+ 0901 01 NOAA RADIOMETER OLS OPERATIONAL LINESCAN SYSTEM
+ 0905 02 NOAA RADIOMETER SSM/I MISSION SENSOR MICROWAVE IMA
+ GER
+ 0906 02 NOAA RADIOMETER SSM/T-1 MISSION SENSOR MICROWAVE TEM
+ PERATURE SOUNDER
+ 0907 02 NOAA RADIOMETER SSM/T-2 MISSION SENSOR MICROWAVE WAT
+ ER VAPOR SOUNDER
+ 0908 02 NOAA RADIOMETER SSMIS SPECIAL SENSOR MICROWAVE IMA
+ GER SOUNDER
+ 0910 01 NOAA RADIOMETER SXI SOLAR X-RAY IMAGER
+ 0930 02 NOAA SPECTROMETER EHIC ENERGETIC HEAVY ION COMPOSIT
+ ION EXPERIMENT
+ 0931 01 NOAA SPECTROMETER X-RAY ASTRONOMY PAYLOAD
+ 0932 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) IVIS
+ SR (FY-2) IMPROVED MULTISPECTRAL VISIBLE AND INFRA-RED SCA
+ N RADIOMETER (5 CHANNELS)
+ 0933 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS IRAS
+ INFRARED ATMOSPHERIC SOUNDER
+ 0934 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS MWAS
+ MICROWAVE ATMOSPHERIC SOUNDER
+ 0935 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS IMWA
+ S IMPROVED MICROWAVE ATMOSPHERIC SOUNDER
+ 0936 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS MWHS
+ MICROWAVE HUMIDITY SOUNDER
+ 0937 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MVIR
+ S MODERATE RESOLUTION VISIBLE AND INFRARED IMAGING SPECTRO
+ RADIOMETER
+ 0938 02 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) MWRI MICROWAVE RADIATION IMAGER
+ 0940 02 ROSCOSMOS ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDER
+ S MTVZA-OK SCANNING MICROWAVE RADIOMETER
+ 0941 02 CNES ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS SAPH
+ IR
+ 0944 01 NOAA RADAR ALTIMETERS ALT ALTIMETER
+ 0945 02 NOAA EARTH RADIATION BUDGET RADIOMETER TSIS TOTA
+ L SOLAR IRRADIANCE SENSOR
+ 0946 02 NOAA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) CMIS CONICAL-SCANNING MICROWAVE IMAGER/SOUNDER
+ 0947 02 NOAA TOTAL AND PROFILE OZONE OMPS OZONE MAPPING AND PR
+ OFILER SUITE
+ 0948 03 NOAA SPACE ENVIRONMENT ATMOSPHERIC TEMPERATURE AND HUMIDI
+ TY SOUNDERS GPSOS GLOBAL POSITIONING SYSTEM OCCULTATION SE
+ NSOR
+ 0949 02 NOAA MAGNETIC FIELD, AUROAL IMAGERY SCINTILLATION BOUNDAR
+ Y SESS SPACE ENVIRONMENTAL SENSOR SUITE
+ 0950 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIRR
+ MULTISPECTRAL VISIBLE AND INFRA-RED SCAN RADIOMETER (10
+ CHANNELS
+ 0951 01 NRSCC TOTAL AND PROFILE OZONE TOM TOTAL OZONE MAPPER
+ 0952 01 NRSCC TOTAL AND PROFILE OZONE OP OZONE PROFILER
+ 2047 01 MISSING VALUE
+002020 0024 0000 01 NIMBUS
+ 0001 01 VTPR
+ 0002 01 TIROS 1 (TIROS, NOAA-6 TO NOAA-13)
+ 0003 01 TIROS 2 (NOAA-14 ONWARDS)
+ 0010 01 EOS
+ 0031 01 DMSP
+ 0061 01 EUMETSAT POLAR SYSTEM (EPS)
+ 0091 01 ERS
+ 0121 01 ADEOS
+ 0241 01 GOES
+ 0261 01 JASON
+ 0271 01 GMS
+ 0272 01 MTSAT
+ 0301 01 INSAT
+ 0331 01 METEOSAT OPERATIONAL PROGRAMME (MOP)
+ 0332 01 METEOSAT TRANSITIONAL PROGRAMME (MTP)
+ 0333 01 METEOSAT SECOND GENERATION PROGRAMME (MSG)
+ 0351 01 GOMS
+ 0380 01 FY-1
+ 0381 01 FY-2
+ 0401 01 GPS
+ 0402 01 GLONASS
+ 0403 01 GALILEO
+ 0511 01 MISSING VALUE
+002021 0008 0001 01 HIGH RESOLUTION INFRA RED SOUNDER (HIRS)
+ 0002 01 MICROWAVE SOUNDING UNIT (MSU )
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+002022 0005 0001 01 PROCESSING TECHNIQUE NOT DEFINED
+ 0002 01 AUTOMATED STATISTICAL REGRESSION
+ 0003 01 CLEAR PATH
+ 0004 01 PARTLY CLOUDY PATH
+ 0005 01 CLOUDY PATH
+002023 0012 0000 01 RESERVED
+ 0001 02 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE INFRARED
+ CHANNEL
+ 0002 01 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE VISIBLE CHANNEL
+ 0003 01 WIND DERIVED FROM CLOUD MOTION OBSERVED IN WATER VAPOUR CHANNEL
+ 0004 02 WIND DERIVED FROM MOTION OBSERVED IN COMBINATION OF SPECTRAL
+ CHANNELS
+ 0005 02 WIND DERIVED FROM MOTION OBSERVED IN THE WATER VAPOUR CHANNEL
+ IN CLEAR AIR
+ 0006 01 WIND DERIVED FROM MOTION OBSERVED IN THE OZONE CHANNEL
+ 0007 01 WIND DERIVED FROM MOTION OBSERVED IN WATER VAPOUR CHANNEL
+ (CLOUD OR CLEAR AIR NOT SPECIFIED)
+ 0008 01 WIND DERIVED FROM ALTIMETER
+ 0009 01 WIND DERIVED FROM RADIOMETER
+ 0013 01 ROOT MEAN SQUARE
+ 0015 01 MISSING VALUE
+002024 0003 0001 01 TABLE WITH FULL RANGE OF HUMIDITY VARIATION IN LAYER
+ 0002 01 REGRESSION TECHNIQUE ON 2 HUMIDITY VALUES IN LAYER
+ 0015 01 MISSING VALUE
+002025 0016 0001 01 RESERVED
+ 0002 01 HIRS
+ 0003 01 MSU
+ 0006 01 HIRS
+ 0007 01 MSU
+ 0010 01 HIRS(1, 2, 3, 8,9, 16, 17)
+ 0011 01 HIRS(1, 2, 3, 9, 17)
+ 0012 01 MSU
+ 0015 01 HIRS
+ 0016 01 HIRS
+ 0017 01 MSU
+ 0018 01 SKINTK(OCEAN ONLY)
+ 0021 01 HIRS
+ 0022 01 SSU
+ 0023 01 MSU (3 ,4)
+ 0025 01 MISSING
+002030 0007 0001 01 ADCP (ACOUSTIC DOPPLER CURRENT PROFILER)
+ 0002 01 GEK (GEOMAGNETIC ELECTRO KINETOGRAPH)
+ 0003 01 SHIPS'S SET AND DRIFT DETERMINED BY FIXES 3-6 HOURS APART
+ 0004 02 SHIPS'S SET AND DRIFT DETERMINED BY MORE THAN 6 HOURS BUT LE
+ SS THAN 12 HOURS APART
+ 0005 01 DRIFT OF BUOY
+ 0006 01 ADCP (ACOUSTIC DOPPLER CURRENT PROFILER)
+ 0007 01 MISSIN VALUE
+002031 0021 0000 01 RESERVED
+ 0001 01 INSTANTANEOUS
+ 0002 01 AVERAGED OVER 3 MINUTES OR LESS
+ 0003 01 AVERAGED OVER MORE THAN 3 MINUTES, BUT 6 AT THE MOST
+ 0004 01 AVERAGED OVER MORE THAN 6 MINUTES, BUT 12 AT THE MOST
+ 0005 01 INSTANTANEOUS
+ 0006 01 AVERAGED OVER 3 MINUTES OR LESS
+ 0007 01 AVERAGED OVER MORE THAN 3 MINUTES, BUT 6 AT THE MOST
+ 0008 01 AVERAGED OVER MORE THAN 6 MINUTES, BUT 12 AT THE MOST
+ 0009 01 VECTOR OR DOPPLER CURRENT PROFILLING METHOD NOT USED
+ 0010 01 RESERVED
+ 0011 01 1 HOUR OR LESS
+ 0012 01 MORE THAN 1 HOUR BUT 2 AT THE MOST
+ 0013 01 MORE THAN 2 HOUR BUT 4 AT THE MOST
+ 0014 01 MORE THAN 4 HOUR BUT 8 AT THE MOST
+ 0015 01 MORE THAN 8 HOUR BUT 12 AT THE MOST
+ 0016 01 MORE THAN 12 HOUR BUT 18 AT THE MOST
+ 0017 01 MORE THAN 18 HOUR BUT 24 AT THE MOST
+ 0018 01 RESERVED
+ 0019 01 DRIFT METHOD NOT USED
+ 0031 01 MISSING
+002032 0004 0000 02 VALUES AT SELECTED DEPTHS (DATA POINTS FIXED BY THE INSTRUME
+ NT OR SELECTED BY ANY OTHER METHOD)
+ 0001 02 VALUES AT SIGNIFICANT DEPTHS (DATA POINTS TAKEN FROM TRACES
+ AT SIGNIFICANT DEPTHS)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002033 0005 0000 01 NO SALINITY MEASURED
+ 0001 01 IN SITU SENSOR, ACCURACY BETTER THAN 0.02 %
+ 0002 01 IN SITU SENSOR, ACCURACY LESS THAN 0.02 %
+ 0003 01 SAMPLE ANALYSIS
+ 0007 01 MISSING VALUE
+002034 0007 0000 01 UNSPECIFIED DROGUE
+ 0001 01 HOLEY SOCK
+ 0002 01 TRISTAR
+ 0003 01 WINDOW SHADE
+ 0004 01 PARACHUTE
+ 0005 01 NON-LAGRANGIAN SEA ANCHOR
+ 0031 01 MISSING VALUE
+002036 0004 0000 01 DRIFTING BUOY
+ 0001 01 FIXED BUOY
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002037 0007 0000 01 REASERVED
+ 0001 01 MANUAL READING FROM VERTICAL TIDE STAFF
+ 0002 01 MANUAL READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ 0003 01 MANUAL READING FROM MULTIPLE AUTOMATIC RECORDERS AT STATION
+ 0004 02 AUTOMATIC READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ WITHOUT LEVEL REFERENCE CHECK
+ 0005 02 AUTOMATIC READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ WITH LEVEL REFERENCE CHECK,OR MULTIPLE AUTOMATIC RECORDERS
+ 0007 01 MISSING
+002038 0012 0000 01 SHIP INTAKE
+ 0001 01 BUCKET
+ 0002 01 HULL CONTACT SENSOR
+ 0003 01 REVERSING TERMOMETER
+ 0004 01 STD/CTD SENSOR
+ 0005 01 MECHANICAL BT
+ 0006 01 EXPANDABLE BT
+ 0007 01 DIGITAL BT
+ 0008 01 THERMISTOR CHAIN
+ 0009 01 INFRARED SCANNER
+ 0010 01 MICROWAVE SCANNER
+ 0015 01 MISSING VALUE
+002039 0005 0000 01 MEASURED WET-BULB TEMPERATURE
+ 0001 01 ICED BULB MEASURED WET-BULB TEMPERATURE
+ 0002 01 COMPUTED WET-BULB TEMPERATURE
+ 0003 01 ICED BULB COMPUTED WET-BULB TEMPERATURE
+ 0007 01 MISSING VALUE
+002041 0005 0000 01 INFORMATION BASED ON MANUAL ANALYSIS
+ 0001 01 INFORMATION BASED ON COMPUTER ANALYSIS
+ 0002 01 INFORMATION BASED ON DATA ASSIMILATION
+ 0003 02 INFORMATION BASED ON COMPUTER ANALYSIS OR DATA ASSIMSILATIO
+ N MANUALLY MODIFIED
+ 0063 01 MISSING VALUE
+002040 0008 0000 01 SHIPS MOTION REMOVED BY AVARAGING
+ 0001 01 SHIPS MOTION REMOVED BY MOTION COMPENSATION
+ 0002 01 SHIPS MOTION NOT REMOVED
+ 0003 01 SHIPS MOTION REMOVED BY AVERAGING
+ 0004 01 SHIPS MOTION REMOVED BY MOTION COMPENSATION
+ 0005 01 SHIPS MOTION NOT REMOVED
+ 0006 01 DOPPLER CURRENT PROFILING METHOD NOT USED
+ 0015 01 MISSING VALUE
+002041 0006 0000 01 INFORMATION BASED ON MANUAL ANALYSIS
+ 0001 01 INFORMATION BASED ON COMPUTER ANALYSIS
+ 0002 01 INFORMATION BASED ON DATA ASSIMILATION
+ 0003 02 INFORMATION BASED ON COMPUTER ANALYSIS OR
+ DATA ASSIMILATION MANUALLY MODIFIED
+ 0010 01 INFORMATION BASED ON THE NUMERICAL WEATHER PREDICTION
+ 0063 01 MISSING VALUE
+002044 0006 0000 01 RESERVED
+ 0001 01 LONGUET-HIGGINS (1964)
+ 0002 01 LONGUET-HIGGINS (F3 METHOS)
+ 0003 01 MAXIMUM LIKELIHOOD METHOD
+ 0004 01 MAXIMUM ENTROPY METHOD
+ 0015 01 MISSING VALUE
+002045 0005 0000 01 SEA STATION
+ 0001 01 AUTOMATIC DATA BUOY
+ 0002 01 AIRCRAFT
+ 0003 01 SATELLITE
+ 0015 01 MISSING VALUE
+002046 0004 0000 01 RESERVED
+ 0001 01 HEAVE SENSOR
+ 0002 01 SLOPE SENSOR
+ 0015 01 MISSING VALUE
+002048 0012 0000 01 HIRS
+ 0001 01 MSU
+ 0002 01 SSU
+ 0003 01 AMSU-A
+ 0004 01 AMSU-B
+ 0005 01 AVHRR
+ 0006 01 SSMI
+ 0007 01 NSCAT
+ 0008 01 SEA WINDS
+ 0009 01 POSEIDON ALTIMETER
+ 0010 01 JMR (JASON MICROWAVE RADIOMETER)
+ 0015 01 MISSING VALUE
+002049 0004 0001 01 PROCESSING TECHNIQUE NOT DEFINED
+ 0002 01 SIMULTANIOUS PHISICAL RETRIEVAL
+ 0003 01 CLEAR SOUNDING
+ 0004 01 CLOUDY COUNDING
+002050 0019 0001 01 CHANNEL 1 14.71 MICROMETERS
+ 0002 01 CHANNEL 2 14.37 MICROMETERS
+ 0003 01 CHANNEL 3 14.06 MICROMETERS
+ 0004 01 CHANNEL 4 13.64 MICROMETERS
+ 0005 01 CHANNEL 5 13.37 MICROMETERS
+ 0006 01 CHANNEL 6 12.66 MICROMETERS
+ 0007 01 CHANNEL 7 12.02 MICROMETERS
+ 0008 01 CHANNEL 8 11.03 MICROMETERS
+ 0009 01 CHANNEL 9 9.71 MICROMETERS
+ 0010 01 CHANNEL 10 7.43 MICROMETERS
+ 0011 01 CHANNEL 11 7.02 MICROMETERS
+ 0012 01 CHANNEL 12 6.51 MICROMETERS
+ 0013 01 CHANNEL 13 4.57 MICROMETERS
+ 0014 01 CHANNEL 14 4.52 MICROMETERS
+ 0015 01 CHANNEL 15 4.45 MICROMETERS
+ 0016 01 CHANNEL 16 4.13 MICROMETERS
+ 0017 01 CHANNEL 17 3.98 MICROMETERS
+ 0018 01 CHANNEL 18 3.74 MICROMETERS
+ 0019 01 CHANNEL 19 0.969 MICROMETERS
+002051 0004 0001 01 MAXIMUM/MINIMUM THERMOMETERS
+ 0002 01 AUTOMATED INSTRUMENT
+ 0003 01 THERMOGRAPH
+ 0015 01 MISSING VALUE
+002052 0005 0001 01 CHANNEL 1 0.55-.75 MICROMETERS
+ 0002 01 CHANNEL 2 3.9 MICROMETERS
+ 0003 01 CHANNEL 3 6.7 MICROMETERS
+ 0004 01 CHANNEL 4 10.7 MICROMETERS
+ 0005 01 CHANNEL 5 12.0 MICROMETERS
+002053 0005 0000 01 OBSERVED BRIGHTNESS TEMPERATURES
+ 0001 01 BRIGHTNESS TEMPERATURE WITH BIAS CORRECTION APPLIED
+ 0002 01 BRIGHTNESS TEMPERATURE CALCULATED FROM FIRST GUESS
+ 0003 01 BRIGHTNESS TEMPERATURE CALCULATED FROM SOUNDING
+ 0015 01 MISSING VALUE
+002054 0006 0000 02 PARAMETER DERIVED USING OBSERVED SOUNDER BRIGHTNESS TEMPERAT
+ URES
+ 0001 02 PARAMETER DERIVED USING OBSERVED IMAGER BRIGHTNESS TEMPERATU
+ RES
+ 0002 01 PARAMETER DERIVED USING FIRST GUESS INFORMATION
+ 0003 01 PARAMETER DERIVED USING NMC ANALYSIS INFORMATION
+ 0004 01 PARAMETER DERIVED USING RADIOSONDE INFORMATION
+ 0015 01 MISSING VALUE
+002055 0009 0000 01 STATISTICS GENERATED COMPARING RETRIEVAL VERSUS RADIOSONDE
+ 0001 01 STATISTICS GENERATED COMPARING RETRIEVAL VERSUS FIRST GUESS
+ 0002 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS FIRST GUESS
+ 0003 01 STATISTICS GENERATED COMPARING OBSERVED VERSUS RETRIEVAL
+ 0004 01 STATISTICS GENERATED COMPARING OBSERVED VERSUS FORST GUESS
+ 0005 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS IMAGER
+ 0006 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS SOUNDER
+ 0007 01 STATISTICS GENERATED FOR RADIOSONDE
+ 0008 01 STATISTICS GENERATED FOR FIRST GUESS
+002056 0006 0000 01 SUMS OF DIFFERENCE
+ 0001 01 SUMS OF SQUARED DIFFERENCES
+ 0002 01 SAMPLE SIZE
+ 0003 01 MINIMUM DIFFERENCE
+ 0004 01 MAXIMUM DIFFERENCE
+ 0015 01 MISSING VALUE
+002057 0006 0000 01 NESTED GRID MODEL (NMG)
+ 0001 01 AVIATION MODEL(AVN)
+ 0002 01 MEDIUM RANGE FORECAST (MRF) MODEL
+ 0003 01 GLOBAL DATA ASSIMILATION SYSTEM (GDAS) FORECAST MODEL
+ 0004 01 PRIOR SOUNDINGS (WITHIN 3 HOURS OF CURRENT TIME)
+ 0005 01 CLIMATOLOGY
+002058 0005 0000 01 12 HOUR AND 18 HOUR
+ 0001 01 18 HOUR AND 24 HOUR
+ 0002 01 6 HOUR AND 12 HOUR
+ 0003 01 GREATER THAN 24 HOUR
+ 0015 01 MISSING VALUE
+002059 0005 0000 01 NCEP NESTED GRID MODEL ANALYSIS
+ 0001 01 NCEP AVIATION MODEL ANALYSIS
+ 0002 01 NCEP MEDIUM RANGE FORECAST MODEL ANALYSIS
+ 0003 01 NCEP GLOBAL DATA ASSIMILATION SYSTEM FORECAST MODEL ANALYSIS
+ 0015 01 MISSING VALUE
+002060 0007 0000 01 CURRENT SURFACE HOURLY REPORTS
+ 0001 01 CURRENT SHIP REPORTS
+ 0002 01 CURRENT BUOY REPORTS
+ 0003 01 ONE HOUR OLD SURFACE HOURLY REPORTS
+ 0004 01 ONE HOUR SHIP OLD REPORTS
+ 0005 01 ONE HOUR BUOY OLD REPORTS
+ 0015 01 MISSING VALUE
+002061 0003 0000 01 INERTIAL NAVIGATOR SYSTEM
+ 0001 01 OMEGA
+ 0007 01 MISSING VALUE
+002062 0007 0000 01 ASDAR
+ 0001 01 ASDAR(ACARS ALSO AVAILABLE BUT NOT OPERATIVE)
+ 0002 01 ASDAR(ACARS ALSO AVAILABLE AND OPERATIVE)
+ 0003 01 ACARS
+ 0004 01 ACARS(ASDAR ALSO AVALILABLE BUT NOT OPERATIVE)
+ 0005 01 ACARS(ASDAR ALSO AVAILABLE AND OPERATIVE)
+ 0015 01 MISSING VALUE
+002064 0004 0000 01 GOOD
+ 0001 01 BAD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002066 0004 0000 01 TRS 2000
+ 0001 01 IMS 1500C
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+002070 0013 0000 01 ACTUAL LOCATION IN SECONDS
+ 0001 01 ACTUAL LOCATION IN MINUTES
+ 0002 01 ACTUAL LOCATION IN DEGREES
+ 0003 01 ACTUAL LOCATION IN DECIDEGREES
+ 0004 01 ACTUAL LOCATION OM CENTIDEGREES
+ 0005 01 REFERENCED TO CHECKPOINT IN SECONDS
+ 0006 01 REFERENCED TO CHECKPOINT IN MINUTES
+ 0007 01 REFERENCED TO CHECKPOINT IN DEGREES
+ 0008 01 REFERENCED TO CHECKPOINT IN DECIDEGREES
+ 0009 01 REFERENCED TO CHECKPOINT IN CENTIDEGREES
+ 0010 01 ACTUAL LOCATION IN TENTHS OF A MINUTE
+ 0011 01 REFERENCED TO CHECKPOINT IN TENTHS OF A MINUTE
+ 0015 01 MISSING VALUE
+002080 0005 0000 01 KAYSAM
+ 0001 01 TOTEX
+ 0002 01 KKS
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+002081 0009 0000 01 GP26
+ 0001 01 GP28
+ 0002 01 GP30
+ 0003 01 HM26
+ 0004 01 HM28
+ 0005 01 HM30
+ 0006 01 SV16
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002083 0006 0000 01 HIGH BAY
+ 0001 01 LOW BAY
+ 0002 01 BALLOON INFLATION LAUNCH SYSTEM (BILS)
+ 0003 01 ROOF-TOP BILS
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002084 0005 0000 01 HYDROGEN
+ 0001 01 HELIUM
+ 0002 01 NATURAL GAS
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002095 0005 0000 01 CAPACITANCE ANEROID
+ 0001 01 DERIVED FROM GPS
+ 0002 01 RESISTIVE STRAIN GAUGE
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002096 0005 0000 01 ROD THERMISTOR
+ 0001 01 BEAD THERMISTOR
+ 0002 01 CAPACITANCE BEAD
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002097 0008 0000 01 VIZ MARK II CARBON HYGRISTOR
+ 0001 01 VIZ B2 HYGRISTOR
+ 0002 01 VAISALA A-HUMICAP
+ 0003 01 VAISALA H-HUMICAP
+ 0004 01 CAPACITANCE SENSOR
+ 0005 01 VAISALA RS90
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002098 0005 0000 01 HH POLARISATION
+ 0001 01 VV POLARISATION
+ 0002 01 HV POLARISATION REAL VALUED COMPONENT
+ 0003 01 HV POLARISATION IMAGINARY VALUED COMPONENT
+ 0007 01 MISSING VALUE
+002101 0010 0000 01 CENTRE FRONT-FED PARABOLOID
+ 0001 01 OFFSET FRONT-FED PARABOLOID
+ 0002 01 CENTRE CASSEGRAIN PARABOLOID
+ 0003 01 OFFSET CASSEGRAIN PARABOLOID
+ 0004 01 PLANAR ARRAY
+ 0005 01 COAXIAL-COLLINEAR ARRAY
+ 0006 01 YAGI ELEMENTS ARRAY
+ 0007 01 MICROSTRIP
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002103 0002 0001 01 RADAR ANTENNA IS PROTECTED BY A RADOME
+ 0002 01 MISSING VALUE
+002104 0007 0000 01 HORIZONTAL POLARISATION
+ 0001 01 VERTICAL POLARISATION
+ 0002 01 RIGHT CIRCULAR POLARISATION
+ 0003 01 LEFT CIRCULAR POLARSZATION
+ 0004 01 HORIZONTAL AND VERTICAL POLARISATION
+ 0005 01 RIGHT AND LEFT CIRCULAR POLARISATION
+ 0015 01 MISSING VALUE
+002115 0007 0000 01 PDB
+ 0001 01 RSOIS
+ 0002 01 ASOS
+ 0003 01 PSYCHROMETER
+ 0004 01 F420
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002119 0008 0000 01 INTERMEDIATE FREQUENCY CALIBRATION MODE (IFCAL)
+ 0001 01 BUILT-IN TEST EQUIPMENT DIGITAL (BITE DGT)
+ 0002 01 BUILT-IN TEST EQUIPMENT RADIO FREQUENCY (BITE RF)
+ 0003 01 PRESET TRACKING (PSET TRK)
+ 0004 01 PRESET LOOP OUT
+ 0005 01 ACQUISITION
+ 0006 01 TRACKING
+ 0007 01 MISSING VALUE
+002131 0001 0001 01 STC OPERATIONAL
+002143 0021 0000 01 RESERVED
+ 0001 01 BREWER SPECTROPHOTOMETER
+ 0002 01 CAVER TEICHERT
+ 0003 01 DOBSON
+ 0004 01 DOBSON (JAPAN)
+ 0005 01 EHMET
+ 0006 01 FECKER TELESCOPE
+ 0007 01 HOELPER
+ 0008 01 JODMETER
+ 0009 01 FILTER OZONOMETER M-83
+ 0010 01 MAST
+ 0011 01 OXFORD
+ 0012 01 PAETZOLD
+ 0013 01 REGENER
+ 0014 01 RESERVED FOR FUTURE USE
+ 0015 01 VASSY FILTER OZONOMETER
+ 0016 01 CARBON IODIDE
+ 0017 01 SURFACE OZONE BUBLER
+ 0018 01 FILTER OZONOMETER M-124
+ 0019 01 ECC SONDE
+ 0127 01 MISSING VALUE
+002144 0008 0000 01 DIRECT SUN, ATTENUATOR #0
+ 0001 01 DIRECT SUN, ATTENUATOR #1
+ 0002 01 DIRECT SUN, ATTENUATOR #2
+ 0003 01 FOCUSSED MOON
+ 0004 01 FOCUSSED SUN
+ 0005 01 FOCUSSED SUN CORRECTED WITH ADJACENT SKY MEASUREMENTS
+ 0006 01 ZENITH SKY
+ 0015 01 MISSING VALUE
+002145 0009 0000 01 WAVELENGTH AD ORDINARY SETTING
+ 0001 01 WAVELENGTH BD ORDINARY SETTING
+ 0002 01 WAVELENGTH CD ORDINARY SETTING
+ 0003 01 WAVELENGTH CC' ORDINARY SETTING
+ 0004 01 WAVELENGTH AD FOCUSSING IMAGE
+ 0005 01 WAVELENGTH BD FOCUSSING IMAGE
+ 0006 01 WAVELENGTH CD FOCUSSING IMAGE
+ 0007 01 WAVELENGTH CC' FOCUSSING IMAGE
+ 0015 01 MISSING VALUE
+002146 0011 0000 01 ON DIRECT SUN
+ 0001 01 ON DIRECT MOON
+ 0002 01 ON BLUE ZENITH SKY
+ 0003 01 ON ZENITH CLOUD (UNIFORM STRATIFIED LAYER OF SMALL OPACITY)
+ 0004 02 ON ZENITH CLOUD (UNIFORM OR MODERATELY VARIABLE LAYER OF MED
+ IUM OPACITY)
+ 0005 02 ON ZENITH CLOUD (UNIFORM OR MODERATELY VARIABLE LAYER OF LAR
+ GE OPACITY)
+ 0006 02 ON ZENITH CLOUD (HIGHLY VARIABLE OPACITY, WITH OR WITOUT PRE
+ CIPITATION)
+ 0007 01 ON ZENITH CLOUD (FOG)
+ 0008 01 ON ZENITH HAZE
+ 0009 01 ON DIRECT SUN THROUGH THIN CLOUD, FOG OR HAZE
+ 0015 01 MISSING VALUE
+002148 0006 0000 01 RESERVED
+ 0001 01 ARGOS
+ 0002 01 GPS
+ 0003 01 GOES DCP
+ 0004 01 METEOSAT DCP
+ 0031 01 MISSING VALUE
+002149 0022 0000 01 UNSPECIFIED DRIFTING BUOY
+ 0001 01 STANDARD LAGRANGIAN DRIFTER (GLOBAL DRIFTER PROGRAMME)
+ 0002 01 STANDARD FGGE TYPE DRIFTING BUOY
+ 0003 01 WIND MEASURING FGGE TYPE DRIFTING BUOY
+ 0004 01 ICE FLOAT
+ 0008 01 UNSPECIFIED SUB-SURFACE FLOAT
+ 0009 01 SOFAR
+ 0010 01 ALACE
+ 0011 01 MARVOR
+ 0012 01 RAFOS
+ 0016 01 UNSPECIFIED MOORED BUOY
+ 0017 01 NOMAD
+ 0018 01 3-METRE DISCUS
+ 0019 01 10-12-METRE DISCUS
+ 0020 01 ODAS 30 SERIES
+ 0021 01 ATLAS (E.G. TAO AREA)
+ 0022 01 TRITON BUOY
+ 0023 01 RESERVED
+ 0024 01 OMNIDIRECTIONAL WAVERIDER
+ 0025 01 DIRECTIONAL WAVERIDER
+ 0026 01 SUB-SURFACE ARGO FLOAT
+ 0063 01 MISSING VALUE
+002150 0055 0000 01 RESERVED
+ 0001 01 HIRS 1
+ 0002 01 HIRS 2
+ 0003 01 HIRS 3
+ 0004 01 HIRS 4
+ 0005 01 HIRS 5
+ 0006 01 HIRS 6
+ 0007 01 HIRS 7
+ 0008 01 HIRS 8
+ 0009 01 HIRS 9
+ 0010 01 HIRS 10
+ 0011 01 HIRS 11
+ 0012 01 HIRS 12
+ 0013 01 HIRS 13
+ 0014 01 HIRS 14
+ 0015 01 HIRS 15
+ 0016 01 HIRS 16
+ 0017 01 HIRS 17
+ 0018 01 HIRS 18
+ 0019 01 HIRS 19
+ 0020 01 HIRS 20
+ 0021 01 MSU 1
+ 0022 01 MSU 2
+ 0023 01 MSU 3
+ 0024 01 MSU 4
+ 0025 01 SSU 1
+ 0026 01 SSU 2
+ 0027 01 SSU 3
+ 0028 01 AMSU-A 1
+ 0029 01 AMSU-A 2
+ 0030 01 AMSU-A 3
+ 0031 01 AMSU-A 4
+ 0032 01 AMSU-A 5
+ 0033 01 AMSU-A 6
+ 0034 01 AMSU-A 7
+ 0035 01 AMSU-A 8
+ 0036 01 AMSU-A 9
+ 0037 01 AMSU-A 10
+ 0038 01 AMSU-A 11
+ 0039 01 AMSU-A 12
+ 0040 01 AMSU-A 13
+ 0041 01 AMSU-A 14
+ 0042 01 AMSU-A 15
+ 0043 01 AMSU-B 1
+ 0044 01 AMSU-B 2
+ 0045 01 AMSU-B 3
+ 0046 01 AMSU-B 4
+ 0047 01 AMSU-B 5
+ 0048 01 AVHRR 1
+ 0049 01 AVHRR 2
+ 0050 01 AVHRR 3A
+ 0051 01 AVHRR 3B
+ 0052 01 AVHRR 4
+ 0053 01 AVHRR 5
+ 0063 01 MISSING VALUE
+002151 0009 0000 01 HIRS
+ 0001 01 MSU
+ 0002 01 SSU
+ 0003 01 AMSU-A1-1
+ 0004 01 AMSU-A1-2
+ 0005 01 AMSU-A2
+ 0006 01 AMSU-B
+ 0007 01 AVHRR
+ 2047 01 MISSING VALUE
+002152 0011 0001 01 HIGH-RESOLUTION INFRARED SOUNDER(HIRS)
+ 0002 01 MICROWAVE SOUNDING UNIT (MSU)
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+ 0009 01 GEOSTATIONARY IMAGER
+ 0010 01 GEOSTATIONARY SOUNDER
+ 0011 01 GEOSTATIONARY EARTH RADIATION (GERB)
+002158 0008 0001 01 MISMATCH IN RED VEC HPA
+ 0002 01 MISMATCH IN RED VEC RFSS
+ 0003 01 PTR CALIBRATION BAND 320 MHZ (KU)
+ 0004 01 PTR CALIBRATION BAND 80 MHZ (KU)
+ 0005 01 PTR CALIBRATION BAND 20 MHZ (KU)
+ 0006 01 PTR CALIBRATION BAND 160 MHZ (S)
+ 0007 01 KU FLIGHT CALIBRATION PARAMETERS AVAILABLE
+ 0008 01 S FLIGHT CALIBRATION PARAMETERS AVAILABLE
+002159 0005 0001 01 TEMPERATURE INCONSISTENCY
+ 0002 01 DATA IS MISSING
+ 0003 01 REDUNDANCY CHANNEL
+ 0004 01 POWER BUS PROTECTION
+ 0005 01 OVERVOLTAGE/OVERLOAD PROTECTION
+002163 0015 0000 01 AUTO EDITOR
+ 0001 01 IRW HEIGHT ASSIGNMENT
+ 0002 01 WV HEIGHT ASSIGNMENT
+ 0003 01 H2O INTERCEPT HEIGHT ASSIGNMENT
+ 0004 01 CO2 SLICING HEIGHT ASSIGNMENT
+ 0005 01 LOW PIXEL MAX GRADIENT
+ 0006 01 HIGHER PIXEL MAX GRADIENT
+ 0007 01 PRIMARY HEIGHT ASSIGNMENT
+ 0008 01 LAYER THICKNESS ASSIGNMENT
+ 0009 01 CUMULATIVE CONTRIBUTION FUNCTION -10 PERCENT HEIGHT
+ 0010 01 CUMULATIVE CONTRIBUTION FUNCTION -50 PERCENT HEIGHT
+ 0011 01 CUMULATIVE CONTRIBUTION FUNCTION -90 PERCENT HEIGHT
+ 0012 02 CUMULATIVE CONTRIBUTION FUNCTION - HEIGHT OF
+ MAXIMUM GRADIENT
+ 0014 01 COMPOSITE HEIGHT ASSIGNMENT
+ 0015 01 MISSING VALUE
+002164 0004 0000 01 LP - NORMS LEAST SQUARE MINIMUM
+ 0001 01 EN - EUCLIDEAN NORM WITH RADIANCE CORRELATION
+ 0002 01 CC - CROSS CORRELATION
+ 0007 01 MISSING VALUE
+002166 0006 0000 01 TYPE NOT DEFINED
+ 0001 01 AUTOMATED STATISTICAL REGRESSION
+ 0002 01 CLEAR PATH
+ 0003 01 PARTLY CLOUDY PATH
+ 0004 01 CLOUDY PATH
+ 0015 01 MISSING VALUE
+002167 0004 0000 01 METHOD NOT DEFINE
+ 0001 01 1B RAW RADIANCE
+ 0002 01 PROCESSED RADIANCE
+ 0015 01 MISSING VALUE
+002169 0004 0000 01 CUP ROTOR
+ 0001 01 PROPELLER ROTOR
+ 0002 01 WIND OBSERVATION THROUGH AMBIENT NOISE (WOTAN)
+ 0015 01 MISSING VALUE
+002172 0003 0001 01 RETRIEVAL FROM A NADIR SOUNDING
+ 0002 01 RETRIEVAL FROM A LIMB SOUNDING
+ 0255 01 MISSING VALUE
+002175 0009 0000 01 MANUAL MEASUREMENT
+ 0001 01 TIPPING BUCKET METHOD
+ 0002 01 WEIGHING METHOD
+ 0003 01 OPTICAL METHOD
+ 0004 01 PRESSURE METHOD
+ 0005 01 FLOAT METHOD
+ 0006 01 DROP COUNTER METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002176 0006 0000 01 MANUAL OBSERVATION
+ 0001 01 VIDEO CAMERA METHOD
+ 0002 01 INFRA-RED METHOD
+ 0003 01 LASER METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002177 0005 0000 01 MANUAL OBSERVATION
+ 0001 01 ULTRASONIC METHOD
+ 0002 01 VIDEO CAMERA METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002178 0005 0000 01 MANUAL OBSERVATION
+ 0001 01 OPTICAL METHOD
+ 0002 01 CAPACITIVE METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002179 0006 0000 01 MANUAL OBSERVATION
+ 0001 01 VAISALA ALGORITHM
+ 0002 01 ASOS (FAA) ALGORITHM
+ 0003 01 AWOS (CANADA) ALGORITHM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002180 0008 0000 01 MANUAL OBSERVATION
+ 0001 02 OPTICAL SCATTER SYSTEM COMBINED WITH PRECIPITATION
+ OCCURRENCE SENSING SYSTEM
+ 0002 01 FORWARD AND/OR BACK-SCATTER SYSTEM OF VISIBLE LIGHT
+ 0003 01 FORWARD AND/OR BACK-SCATTER SYSTEM OF INFRARED LIGHT
+ 0004 01 INFRARED LIGHT EMITTING DIODE (IRED) SYSTEM
+ 0005 01 DOPPLER RADAR SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002181 0005 0001 01 RAIN DETECTOR
+ 0002 01 FREEZING RAIN SENSOR
+ 0003 01 ICE DETECTION SENSOR
+ 0004 01 HAIL AND ICE PELLET SENSOR
+ 0020 01 OTHER
+002182 0007 0000 01 MANUAL MEASUREMENT
+ 0001 01 TRANSMISSOMETER SYSTEM (BASE > 25)
+ 0002 01 TRANSMISSOMETER SYSTEM (BASE < 25 M)
+ 0003 01 FORWARD SCATTER SYSTEM
+ 0004 01 BACK SCATTER SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002183 0009 0000 01 MANUAL OBSERVATION
+ 0001 01 CEILOMETER SYSTEM
+ 0002 01 INFRARED CAMERA SYSTEM
+ 0003 01 MICROWAVE VISUAL CAMERA SYSTEM
+ 0004 01 SKY IMAGER SYSTEM
+ 0005 01 VIDEO TIME LAPSED CAMERA SYSTEM
+ 0006 01 MICRO PULSE LIDAR (MPL) SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002184 0008 0000 01 MANUAL OBSERVATION
+ 0001 01 LIGHTNING IMAGING SENSOR
+ 0002 01 ELECTRICAL STORM IDENTIFICATION SENSOR
+ 0003 01 MAGNETIC FINDER SENSOR
+ 0004 01 LIGHTNING STRIKE SENSOR
+ 0005 01 FLASH COUNTER
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002185 0007 0000 01 MANUAL MEASUREMENT
+ 0001 01 BALANCED FLOATING METHOD
+ 0002 01 PRESSURE METHOD
+ 0003 01 ULTRASONIC METHOD
+ 0004 01 HYDRAULIC METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002186 0023 0001 01 PRECIPITATION-UNKNOWN TYPE
+ 0002 01 LIQUID PRECIPITATION NOT FREEZING
+ 0003 01 LIQUID FREEZING PRECIPITATION
+ 0004 01 DRIZZLE
+ 0005 01 RAIN
+ 0006 01 SOLID PRECIPITATION
+ 0007 01 SNOW
+ 0008 01 SNOW GRAINS
+ 0009 01 SNOW PELLETS
+ 0010 01 ICE PELLETS
+ 0011 01 ICE CRYSTALS
+ 0012 01 DIAMOND DUST
+ 0013 01 SMALL HAIL
+ 0014 01 HAIL
+ 0015 01 GLAZE
+ 0016 01 RIME
+ 0017 01 SOFT RIME
+ 0018 01 HARD RIME
+ 0019 01 CLEAR ICE
+ 0020 01 WET SNOW
+ 0021 01 HOAR FROST
+ 0022 01 DEW
+ 0023 01 WHITE DEW
+002187 0011 0001 01 DUST/SAND WHIRL
+ 0002 01 SQUALLS
+ 0003 01 SAND STORM
+ 0004 01 DUST STORM
+ 0005 01 LIGHTNING - CLOUD TO SURFACE
+ 0006 01 LIGHTNING - CLOUD TO CLOUD
+ 0007 01 LIGHTNING - DISTANT
+ 0008 01 THUNDERSTORM
+ 0009 01 FUNNEL CLOUD NOT TOUCHING SURFACE
+ 0010 01 FUNNEL CLOUD TOUCHING SURFACE
+ 0011 01 SPRAY
+002188 0010 0001 01 FOG
+ 0002 01 ICE FOG
+ 0003 01 STEAM FOG
+ 0007 01 MIST
+ 0008 01 HAZE
+ 0009 01 SMOKE
+ 0010 01 VOLCANIC ASH
+ 0011 01 DUST
+ 0012 01 SAND
+ 0013 01 SNOW
+002189 0004 0001 01 MANUAL OBSERVATION
+ 0002 01 ALL LIGHTNING STRIKES WITHOUT DISCRIMINATION
+ 0003 01 LIGHTNING STRIKES CLOUD TO GROUND ONLY
+ 0004 02 ALL LIGHTNING STRIKES WITH DISCRIMINATION BETWEEN
+ CLOUD TO GROUND AND CLOUD TO CLOUD
+002194 0002 0000 01 FGGE
+ 0015 01 MISSING VALUE
+002196 0017 0000 01 NIMBUS
+ 0001 01 VTPR
+ 0002 01 TIROS 1 ( TIROS NOAA 6 TO NOAA 13)
+ 0003 01 TIROS 2 ( NOAA-14 ONWARD)
+ 0031 01 DMSP
+ 0061 01 EUMETSAT POLAR SYSTEM (EPS)
+ 0091 01 ERS
+ 0121 01 ADEOS
+ 0241 01 GOES
+ 0271 01 GMS
+ 0301 01 INSAT
+ 0331 01 METEOSAT OPERATIONAL PROGRAMME(MOP)
+ 0332 01 METEOSAT TRANSITIONAL PROGRAMME(MTP)
+ 0333 01 METEOSAT SECOND GENERATION PROGRAMME(MSG)
+ 0351 01 GOMS
+ 0381 01 FY-2
+ 0512 01 MISSING VALUE
+002199 0004 0000 01 RESERVED
+ 0001 01 TABLE WITH FULL RANGE OF HUMMIDITY VALUES IN LAYER
+ 0002 01 REGRESSION TECHNIQUE ON 2 HUMMIDITY VALUES IN LAYER
+ 0015 01 MISSING VALUE
+002216 0017 0001 01 CALIBRATION/MEASUREMENT PULSE FLAG (1)
+ 0002 01 CALIBRATION/MEASUREMENT PULSE FLAG (2)
+ 0003 01 OUTER ANTENNA BEAM
+ 0004 01 SIGMA-0 CELL IS AFT OF SPACECRAFT
+ 0005 01 CURRENT MODE (1)
+ 0006 01 CURRENT MODE (2)
+ 0007 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (1)
+ 0008 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (2)
+ 0009 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (3)
+ 0010 01 LOW RESOLUTION MODE - WHOLE PULSE DATA
+ 0011 01 SCATTEROMETER ELECTRONIC SUBSYSTEM B
+ 0012 01 ALTERNATE SPIN RATE - 19.8 RPM
+ 0013 01 RECEIVER PROTECTION ON
+ 0014 01 SLICES PER COMPOSITE FLAG(1)
+ 0015 01 SLICES PER COMPOSITE FLAG(2)
+ 0016 01 SLICES PER COMPOSITE FLAG(3)
+ 0017 01 MISSING VALUE
+002231 0015 0000 01 RESERVED
+ 0001 01 IRW HEIGHT ASSIGNMENT
+ 0002 01 WV HEIGHT ASSIGNMENT
+ 0003 01 H2O INTERCEPT HEIGHT ASSIGNMENT
+ 0004 01 CO2 SLICING HEIGHT ASSIGNMENT
+ 0005 01 LOW PIXEL MAX GRADIENT
+ 0006 01 HIGHER PIXEL MAX GRADIENT
+ 0007 01 PRIMARY HEIGHT ASSIGNMENT
+ 0008 01 LAYER THICKNESS ASSIGNMENT
+ 0009 01 CUMULATIVE CONTRIBUTION FUNCTION -10 PERCENT HEIGHT
+ 0010 01 CUMULATIVE CONTRIBUTION FUNCTION -50 PERCENT HEIGHT
+ 0011 01 CUMULATIVE CONTRIBUTION FUNCTION -90 PERCENT HEIGHT
+ 0012 02 CUMULATIVE CONTRIBUTION FUNCTION - HEIGHT OF MAXIMU
+ M GRADIENT
+ 0014 01 COMPOSITE HEIGHT ASSIGNMENT
+ 0015 01 MISSING VALUE
+002232 0004 0000 01 P - NORMS LEAST SQUARE MINIMUM
+ 0001 01 EN - EUCLIDEAN NORM WITH RADIANCE CORRELATION
+ 0002 01 CC - CROSS CORRELATION
+ 0003 01 MISSING VALUE
+002251 0004 0000 01 METHOD NOT DEFINED
+ 0001 01 1B RAW RADIANCE
+ 0002 01 PROCESSED RADIANCE
+ 0015 01 MISSING VALUE
+002252 0012 0001 01 HIGH-RESOLUTION INFRARED SOUNDER(HIRS)
+ 0002 01 MICROWAVE SOUNDING UNIT (MSU)
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+ 0009 01 GEOSTATIONARY IMAGER
+ 0010 01 GEOSTATIONARY SOUNDER
+ 0011 01 GEOSTATIONARY EARTH RADIATION (GERB)
+ 0012 01 MULTI-CHANNEL SCANNING RADIOMETER
+002254 0006 0000 01 TYPE NOT DEFINED
+ 0001 01 AUTOMATED STATISTICAL REGRESSION
+ 0002 01 CLEAR PATH
+ 0003 01 PARTLY CLOUDY PATH
+ 0004 01 CLOUDY PATH
+ 0015 01 MISSING VALUE
+004059 0005 0001 01 00 UTC
+ 0002 01 06 UTC
+ 0003 01 12 UTC
+ 0004 01 18 UTC
+ 0005 01 OTHER HOURS
+008001 0007 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 MAXIMUM WIND LEVEL
+ 0005 01 SIGNIFICANT LEVEL, TEMPERATURE AND/OR RELATIVE HUMIDITY
+ 0006 01 SIGNIFICANT LEVEL, WIND
+ 0007 01 MISSING VALUE
+008002 0013 0000 02 OBSERVING RULES FOR BASE OF LOWEST CLOUD AND CLOUD TYPES OF
+ FM 12-IX EXT. SYNOP AND FM 13-IX EXT. SHIP APPLY
+ 0001 01 FIRST NON - CB SIGNIFICANT LAYER
+ 0002 01 SECOND NON - CB SIGNIFICANT LAYER
+ 0003 01 THIRD NON - CB SIGNIFICANT LAYER
+ 0004 01 CUMULONIMBUS LAYER
+ 0005 01 CEILING
+ 0006 01 CLOUD NOT DETECTED BELOW THE FOLLOWING HEIGHT(S)
+ 0007 01 LOW CLOUD
+ 0008 01 MIDDLE CLOUD
+ 0009 01 HIGH CLOUD
+ 0010 02 CLOUD LAYER WITH BASE BELOW THE STATION LEVEL AND TOP
+ ABOVE THE STATION LEVEL
+ 0011 01 CLOUD LAYER WITH BASE AND TOP BELOW THE STATION LEVEL
+ 0063 01 MISSING VALUE
+008003 0009 0000 01 SURFACE
+ 0001 01 BASE OF SATELLITE SOUNDING
+ 0002 01 CLOUD TOP
+ 0003 01 TROPOPAUSE
+ 0004 01 PRECIPITABLE WATER
+ 0005 01 SOUNDING RADIANCES
+ 0006 01 MEAN TEMPERATURES
+ 0007 01 OZON
+ 0063 01 MISSING VALUE
+008004 0006 0002 01 UNSTEADY (UNS)
+ 0003 01 LEVEL FLIGHT, ROUTINE OBSERVATION (LVR)
+ 0004 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED (LVW)
+ 0005 01 ASCENDING (ASC)
+ 0006 01 DESCENDING(DES)
+ 0007 01 MISSING VALUE
+008005 0007 0000 01 RESERVED
+ 0001 01 STORM CENTRE
+ 0002 01 OUTER LIMIT OR EDGE OF STORM
+ 0003 01 LOCATION OF MAXIMUM WIND
+ 0004 01 LOCATION OF STORM IN THE PERTURBED ANALYSIS
+ 0005 01 LOCATION OF STORM IN THE ANALYSIS
+ 0015 01 MISSING VALUE
+008006 0008 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 PROMINENT MAXIMUM LEVEL
+ 0005 01 PROMINENT MINIMUM LEVEL
+ 0006 01 MINIMUM PRESSURE LEVEL
+ 0007 01 RESERVED
+ 0008 01 LEVEL OF UNDETERMINED SIGNIFICANCE
+008007 0005 0000 01 POINT
+ 0001 01 LINE
+ 0002 01 AREA
+ 0003 01 VOLUME
+ 0015 01 MISSING VALUE
+008008 0008 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 LEVEL OF BETA RADIATION MAXIMUM
+ 0005 01 LEVEL OF GAMMA RADIATION MAXIMUM
+ 0006 01 MINIMUM PRESSURE LEVEL
+ 0007 01 RESERVED
+ 0008 01 LEVEL OF UNDETERMINED SIGNIFICANCE
+008009 0016 0000 01 LEVEL FLIGHT, ROUTINE OBSERVATION, UNSTEADY
+ 0001 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED, UNSTEADY
+ 0002 01 UNSTEADY (UNS)
+ 0003 01 LEVEL FLIGHT, ROUTINE OBSERVATION (LVR)
+ 0004 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED (LVW)
+ 0005 01 ASCENDING (ASC)
+ 0006 01 DESCENDING (DES)
+ 0007 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS
+ 0008 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS, UNSTEADY
+ 0009 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS
+ 0010 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS, UNSTEADY
+ 0011 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS
+ 0012 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS, UNSTEADY
+ 0013 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS
+ 0014 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS, UNSTEADY
+ 0015 01 MISSING VALUE
+008010 0013 0000 01 RESERVED
+ 0001 01 BARE SOIL
+ 0002 01 BARE ROCK
+ 0003 01 LAND GRASS COVER
+ 0004 01 WATER (LAKE, SEA)
+ 0005 01 FLOOD WATER UNDERNEATH
+ 0006 01 SNOW
+ 0007 01 ICE
+ 0008 01 RUNWAY OR ROAD
+ 0009 01 SHIP OR PLATFORM DECK IN STEEL
+ 0010 01 SHIP OR PLATFORM DECK IN WOOD
+ 0011 01 SHIP OR PLATFORM DECK PARTLY COVERED WITH RUBBER MAT
+ 0031 01 MISSING VALUE
+008011 0026 0000 01 QUASI-STATIONARY FRONT AT THE SURFACE
+ 0001 01 QUASI-STATIONARY FRONT ABOVE THE SURFACE
+ 0002 01 WARM FRONT AT THE SURFACE
+ 0003 01 WARM FRONT ABOVE THE SURFACE
+ 0004 01 COLD FRONT AT THE SURFACE
+ 0005 01 COLD FRONT ABOVE THE SURFACE
+ 0006 01 OCCLUSION
+ 0007 01 INSTABILITY LINE
+ 0008 01 INTERTROPICAL FRONT
+ 0009 01 CONVERGENCE LINE
+ 0010 01 JET STREAM
+ 0011 01 CLOUD CLEAR
+ 0012 01 CLOUD
+ 0013 01 TURBULENCE
+ 0014 01 STORM
+ 0015 01 AIRFRAME ICING
+ 0016 01 PHENOMENON
+ 0017 01 VOLCANO
+ 0018 01 ATMOSPHERICS
+ 0020 01 SPECIAL CLOUDS
+ 0021 01 THUNDERSTORM (VAL)
+ 0022 01 TROPICAL CYCLONE (VAL)
+ 0023 01 MOUNTAIN WAVE (VAL)
+ 0024 01 DUSTSTORM (VAL)
+ 0025 01 SANDSTORM (VAL)
+ 0063 01 MISSING VALUE
+008012 0004 0000 01 LAND
+ 0001 01 SEA
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008013 0004 0000 01 NIGHT
+ 0001 01 DAY
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008014 0010 0000 01 10-MINUTE MEAN VALUE - NORMAL VALUE
+ 0001 02 10-MINUTE MEAN VALUE - ABOVE THE UPPER LIMIT FOR ASSESSMENT
+ OF RVR (P)
+ 0002 02 10-MINUTE MEAN VALUE - BELOW LOWER LIMIT FOR ASSESSMENT OF R
+ VR (M)
+ 0003 01 ONE MINUTE MINIMUM VALUE - NORMAL VALUE
+ 0004 02 ONE MINUTE MINIMUM VALUE - ABOVE THE UPPER LIMIT FOR ASSESSM
+ ENT OF RVR (P)
+ 0005 02 ONE MINUTE MINIMUM VALUE - BELOW LOWER LIMIT FOR ASSESSMENT
+ OF RVR (M)
+ 0006 01 ONE MINUTE MAXIMUM VALUE - NORMAL VALUE
+ 0007 02 ONE MINUTE MAXIMUM VALUE - ABOVE THE UPPER LIMIT FOR ASSESS
+ MENT OF RVR (P)
+ 0008 02 ONE MINUTE MAXIMUM VALUE - BELOW LOWER LIMIT FOR ASSESSMENT
+ OF RVR (M)
+ 0015 01 MISSING VALUE
+008016 0005 0000 01 NOSIG
+ 0001 01 BECMG
+ 0002 01 TEMPO
+ 0003 01 FM
+ 0007 01 MISSING VALUE
+008017 0004 0000 01 FM
+ 0001 01 TL
+ 0002 01 AT
+ 0003 01 MISSING VALUE
+008018 0005 0001 01 LAND IS PRESENT
+ 0002 01 SURFACE ICE MAP INDICATES ICE IS PRESENT
+ 0011 01 ICE MAP DATA NOT AVAILABLE
+ 0012 01 ATTENUATION MAP DATA NOT AVAILABLE
+ 0017 01 MISSING VALUE
+008021 0032 0000 01 RESERVED
+ 0001 01 TIME SERIES
+ 0002 01 TIME AVERAGED
+ 0003 01 ACCUMULATED
+ 0004 01 FORECAST
+ 0005 01 FORECAST TIME SERIES
+ 0006 01 FORECAST TIME AVERAGED
+ 0007 01 FORECAST ACCUMULATED
+ 0008 01 ENSEMBLE MEAN
+ 0009 01 ENSEMBLE MEAN TIME SERIES
+ 0010 01 ENSEMBLE MEAN TIME AVERAGED
+ 0011 01 ENSEMBLE MEAN ACCUMULATED
+ 0012 01 ENSEMBLE MEAN FORECAST
+ 0013 01 ENSEMBLE MEAN FORECAST TIME SERIES
+ 0014 01 ENSEMBLE MEAN FORECAST AVERAGED
+ 0015 01 ENSEMBLE MEAN FORECAST ACCUMULATED
+ 0016 01 ANALYSIS
+ 0017 01 START OF PHENOMENON
+ 0018 01 RADIOSONDE LAUNCH TIME
+ 0019 01 START OF ORBIT
+ 0020 01 END OF ORBIT
+ 0021 01 TIME OF ASCENDING NODE
+ 0022 01 TIME OF OCCURENCE OF WIND SHIFT
+ 0023 01 MONITORING PERIOD
+ 0024 01 AGREED TIME LIMIT FOR REPORT RECEPTION
+ 0025 01 NOMINAL REPORTING TIME
+ 0026 01 TIME OF LAST KNOWN POSITION
+ 0027 01 FIRST GUESS --NOT WMO ENTRY
+ 0028 01 START OF SCAN --NOT WMO ENTRY
+ 0029 01 END OF SCAN --NOT WMO ENTRY
+ 0030 01 RESERVED
+ 0031 01 MISSING VALUE
+008023 0017 0002 01 MAXIMUM VALUE
+ 0003 01 MINIMUM VALUE
+ 0004 01 MEAN VALUE
+ 0005 01 MEDIAN VALUE
+ 0006 01 MODAL VALUE
+ 0007 01 MEAN ABSOLUTE ERROR
+ 0009 01 BEST ESTIMATE OF STANDARD DEVIATION (N-1)
+ 0010 01 STANDARD DEVIATION
+ 0011 01 HARMONIC MEAN
+ 0012 01 ROOT MEAN SQUARE VECTOR ERROR
+ 0013 01 ROOT-MEAN-SQUARE
+ 0032 01 PROBABILITY OF GROSS ERROR
+ 0033 01 PRESCRIBED OBSERVATION ERROR
+ 0034 01 PERSISTENCE OBSERVATION ERROR
+ 0035 01 FINAL OBSERVATION ERROR
+ 0036 01 REPRESENTATIVNESS OBSERVATION ERROR
+ 0063 01 MISSING
+008024 0015 0002 01 OBSERVED MINUS MAXIMUM
+ 0003 01 OBSERVED MINUS MINIMUM
+ 0004 01 OBSERVED MINUS MEAN
+ 0005 01 OBSERVED MINUS MEDIAN
+ 0006 01 OBSERVED MINUS MODE
+ 0011 01 OBSERVED MINUS CLIMATOLOGY (ANOMALY)
+ 0012 01 OBSERVED MINUS ANALYZED VALUE
+ 0013 01 OBSERVED MINUS INITIALISED ANALYZED VALUE
+ 0014 01 OBSERVED MINUS FORECAST VALUE
+ 0021 01 OBSERVED MINUS INTERPOLATED VALUE
+ 0022 01 OBSERVED MINUS HYDROSTATICALLY CALCULATED VALUE
+ 0032 01 OBSERVED MINUS FIRST GUESS
+ 0033 01 OBSERVED MINUS ANALYSIS
+ 0034 01 OBSERVED MINUS INITIALIZED ANALYSIS
+ 0063 01 MISSING
+008025 0005 0000 02 UNIVERSAL TIME COORDINATED (UTC) MINUS
+ LOCAL STANDARD TIME (LST)
+ 0001 01 LOCAL STANDARD TIME
+ 0002 01 UNIVERSAL TIME COORDINATED (UTC) MINUS SATELLITE CLOCK
+ 0005 01 TIME DIFFERENCE FROM EDGE OF PROCESSING SEGMENT
+ 0015 01 MISSING
+008026 0005 0000 01 AVERAGING KERNEL MATRIX
+ 0001 01 CORRELATION MATRIX
+ 0002 02 LOWER TRIANGULAR CORRELATION MATRIX SQUARE ROOT (L FROM C=LL
+ T)
+ 0003 02 INVERSE LOWER TRIANGULAR CORRELATION MATRIX SQUARE ROOT (L**
+ -1)
+ 0063 01 MISSING VALUE
+008027 0007 0000 01 ASSUME NO PARTICULAR MATRIX GEOMETRY
+ 0001 01 DIAGONAL MATRIX
+ 0002 01 TRIDIAGONAL MATRIX
+ 0003 01 MULTI-DIAGONAL MATRIX (GENERAL CASE: DIAGONAL AND ABOVE)
+ 0004 01 LOWER TRIANGULAR MATRIX
+ 0005 01 SYMETRICAL MATRIX
+ 0063 01 MISSING VALUE
+008029 0005 0000 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0001 01 ENCLOSED SEA OR LAKE
+ 0002 01 CONTINENTAL ICE
+ 0003 01 LAND
+ 0255 01 MISSING
+008033 0006 0000 01 RESERVED
+ 0001 01 PERCENTAGE CONFIDENCE CALCULATED USING CLOUD FRACTION
+ 0002 02 PERCENTAGE CONFIDENCE CALCULATED USING STANDARD
+ DEVIATION OF TEMPERATURE
+ 0003 02 PERCENTAGE CONFIDENCE CALCULATED USING PROBABILITY OF
+ THE CLOUD CONTAMINATION
+ 0004 02 PERCENTAGE CONFIDENCE CALCULATED USING NORMALITY OF DISTRIBU
+ TION
+ 0127 01 MISSING
+008035 0008 0000 01 GLOBAL
+ 0001 01 REGIONAL
+ 0002 01 NATIONAL
+ 0003 01 SPECIAL
+ 0004 01 BILATERAL
+ 0005 01 RESERVED
+ 0006 01 RESERVED
+ 0007 01 MISSING
+008036 0008 0000 01 WMO SECRETARIAT
+ 0001 01 WMO
+ 0002 01 RSMC
+ 0003 01 NMC
+ 0004 01 RTH
+ 0005 01 OBSERVING SITE
+ 0006 01 OTHER
+ 0007 01 MISSING
+008039 0008 0000 01 ISSUE TIME OF FORECAST
+ 0001 01 TIME OF COMMNENCEMENT OF PERIOD OF THE FORECAST
+ 0002 01 TIME OF ENDING OF PERIOD OF THE FORECAST
+ 0003 01 FORECSAT TIME OF MAXIMUM TEMPERATURE
+ 0004 01 FORECSAT TIME OF MINIMUM TEMPERATURE
+ 0005 01 TIME OF BEGINNING OF THE FORECAST
+ 0006 01 TIME OF ENDING OF THE FORECAST
+ 0063 01 MISSING VALUE
+008040 0043 0000 01 HIGH RESOLUTION DATA SAMPLE
+ 0001 01 WITHIN 20 HPA OF SURFACE
+ 0002 02 PRESSURE LESS THAN 10 HPA (I.E., 9, 8, 7, ETC.)
+ WHEN NO OTHER REASON APPLIES
+ 0003 01 BASE PRESSURE LEVEL FOR STABILITY INDEX
+ 0004 01 BEGIN DOUBTFUL TEMPERATURE, HEIGHT DATA
+ 0005 01 BEGIN MISSING DATA (ALL ELEMENTS)
+ 0006 01 BEGIN MISSING RH DATA
+ 0007 01 BEGIN MISSING TEMPERATURE DATA
+ 0008 02 HIGHEST LEVEL REACHED BEFORE BALLOON
+ DESCENT BECAUSE OF ICING OR TURBULENCE
+ 0009 01 END DOUBTFUL TEMPERATURE, HEIGHT DATA
+ 0010 01 END MISSING DATA (ALL ELEMENTS)
+ 0011 01 END MISSING RH DATA
+ 0012 01 END MISSING TEMPERATURE DATA
+ 0013 01 ZERO DEGREES C CROSSING(S) FOR RADAT
+ 0014 01 STANDARD PRESSURE LEVEL
+ 0015 01 OPERATOR ADDED LEVEL
+ 0016 01 OPERATOR DELETED LEVEL
+ 0017 01 BALLOON RE-ASCENDED BEYOND PREVIOUS HIGHEST ASCENT LEVEL
+ 0018 01 SIGNIFICANT RH LEVEL
+ 0019 01 RH LEVEL SELECTION TERMINATED
+ 0020 01 SURFACE LEVEL
+ 0021 01 SIGNIFICANT TEMPERATURE LEVEL
+ 0022 01 MANDATORY TEMPERATURE LEVEL
+ 0023 01 FLIGHT TERMINATION LEVEL
+ 0024 01 TROPOPAUSE(S)
+ 0025 01 AIRCRAFT REPORT
+ 0026 01 INTERPOLATED (GENERATED) LEVEL
+ 0027 01 MANDATORY WIND LEVEL
+ 0028 01 SIGNIFICANT WIND LEVEL
+ 0029 01 MAXIMUM WIND LEVEL
+ 0030 01 INCREMENTAL WIND LEVEL (FIXED REGIONAL)
+ 0031 01 INCREMENTAL HEIGHT LEVEL (GENERATED)
+ 0032 01 WIND TERMINATION LEVEL
+ 0033 01 PRESSURE 100 TO 110 HPA, WHEN NO OTHER REASON APPLIES
+ 0040 01 SIGNIFICANT THERMODYNAMIC LEVEL (INVERSION)
+ 0041 01 SIGNIFICANT RH LEVEL ( PER NCDC CRITERIA)
+ 0042 01 SIGNIFICANT TEMPERATURE LEVEL (PER NCDC)
+ 0043 01 BEGIN MISSING WIND DATA
+ 0044 01 END MISSING WIND DATA
+ 0060 01 LEVEL OF 80-KNOT ISOTACH ABOVE JET
+ 0061 01 LEVEL OF 80-KNOT ISOTACH BELOW JET
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+008041 0009 0000 01 PARENT SITE
+ 0001 01 OBSERVATION SITE
+ 0002 01 BALLOON MANUFACTURE DATE
+ 0003 01 BALLOON LAUNCH POINT
+ 0004 01 SURFACE OBSERVATION
+ 0005 01 SURFACE OBSERVATION DISPLACEMENT FROM LAUNCH POINT
+ 0006 01 FLIGHT LEVEL OBSERVATION
+ 0007 01 FLIGHT LEVEL TERMINATION POINT
+ 0031 01 MISSING VALUE
+008042 0013 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 MAXIMUM WIND LEVEL
+ 0005 01 SIGNIFICANT TEMPERATURE LEVEL
+ 0006 01 SIGNIFICANT HUMIDITY LEVEL
+ 0007 01 SIGNIFICANT WIND LEVEL
+ 0008 01 BEGINNING OF MISSING TEMPERATURE DATA
+ 0009 01 END OF MISSING TEMPERATURE DATA
+ 0010 01 BEGINNING OF MISSING HUMIDITY DATA
+ 0011 01 END OF MISSING HUMIDITY DATA
+ 0012 01 BEGINNING OF MISSING WIND DATA
+ 0013 01 END OF MISSING WIND DATA
+008043 0021 0000 01 OZONE, O3,10028-15-6
+ 0001 01 WATER VAPOUR, H2O, 7732-18-5
+ 0002 01 METHANE, CH4, 74-82-8
+ 0003 01 CARBON DIOXIDE, CO2, 37210-16-5
+ 0004 01 CARBON MONOXIDE, CO, 630-08-0
+ 0005 01 NITROGEN DIOXIDE, NO2, 10102-44-0
+ 0006 01 NITROUS OXIDE, N2O, 10024-97-2
+ 0007 01 FORMALDEHYDE, HCHO, 50-00-0
+ 0008 01 SULFUR DIOXIDE, SO2, 7446-09-5
+ 0009 01 BROMINE OXIDE, BRO, 15656-19-6
+ 0010 01 CHLORINE DIOXIDE, OCLO, 10049-04-4
+ 0011 01 NITROGEN MONOXIDE, NO, 10102-43-9
+ 0012 01 AMMONIA, NH3, 7664-41-7
+ 0025 01 PARTICULATE MATTER < 1.0 MICRONS
+ 0026 01 PARTICULATE MATTER < 2.5 MICRONS
+ 0027 01 PARTICULATE MATTER < 10 MICRONS
+ 0028 01 AEROSOLS GENERIC
+ 0029 01 SMOKE GENERIC
+ 0030 01 CRUSTAL MATERIAL (GENERIC DUST)
+ 0031 01 VOLCANIC ASH
+ 0255 01 MISSING
+008050 0011 0000 01 RESERVED
+ 0001 01 PRESSURE
+ 0002 01 TEMPERATURE
+ 0003 01 EXTREME TEMPERATURE
+ 0004 01 VAPOUR PRESSURE
+ 0005 01 PRECIPITATION
+ 0006 01 SUNSHINE DURATION
+ 0007 01 MAXIMUM TEMPERATURE
+ 0008 01 MINIMUM TEMPERATURE
+ 0009 01 WIND
+ 0015 01 MISSING VALUE
+008051 0007 0001 01 PRESSURE
+ 0002 01 TEMPERATURE
+ 0003 01 EXTREME TEMPERATURE
+ 0004 01 VAPOUR PRESSURE
+ 0005 01 PRECIPITATION
+ 0006 01 SUNSHINE DURATION
+ 0007 01 MISSING VALUE
+008052 0026 0000 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 10 M/S
+ 0001 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 20 M/S
+ 0002 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 30 M/S
+ 0003 01 MAXIMUM TEMPERATURE LESS THAN 273.2 K
+ 0004 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 298.2 K
+ 0005 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 303.2 K
+ 0006 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 308.2 K
+ 0007 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 313.2 K
+ 0008 01 MINIMUM TEMPERATURE LESS THAN 273.2 K
+ 0009 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 273.2 K
+ 0010 01 PRECIPITATION EQUAL TO OR MORE THAN 1.0 KG/M**2
+ 0011 01 PRECIPITATION EQUAL TO OR MORE THAN 5.0 KG/M**2
+ 0012 01 PRECIPITATION EQUAL TO OR MORE THAN 10.0 KG/M**2
+ 0013 01 PRECIPITATION EQUAL TO OR MORE THAN 50.0 KG/M**2
+ 0014 01 PRECIPITATION EQUAL TO OR MORE THAN 100.0 KG/M**2
+ 0015 01 PRECIPITATION EQUAL TO OR MORE THAN 150.0 KG/M**2
+ 0016 01 SNOW DEPTH MORE THAN 0.0 M
+ 0017 01 SNOW DEPTH MORE THAN 0.01 M
+ 0018 01 SNOW DEPTH MORE THAN 0.10 M
+ 0019 01 SNOW DEPTH MORE THAN 0.50 M
+ 0020 01 HORIZONTAL VISIBILITY LESS THAN 50 M
+ 0021 01 HORIZONTAL VISIBILITY LESS THAN 100 M
+ 0022 01 HORIZONTAL VISIBILITY LESS THAN 1000 M
+ 0023 01 HAIL
+ 0024 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+008053 0004 0000 01 VALUE OCCURED ON ONLY ONE DAY IN THE MONTH
+ 0001 01 VALUE OCCURED ON MORE THAN ONE DAY IN THE MONTH
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008054 0003 0000 01 WIND SPEED OR GUST IS AS REPORTED
+ 0001 02 WIND SPEED IS GREATER THAN THAT REPRTED (P IN METAR/TAF/SPEC
+ I)
+ 0007 01 MISSING VALUE
+008060 0008 0000 01 RESERVED
+ 0001 01 RANGE
+ 0002 01 AZIMUTH
+ 0003 01 HORIZONTAL
+ 0004 01 VERTICAL
+ 0005 01 NORTH/SOUTH
+ 0006 01 EAST/WEST
+ 0015 01 MISSING VALUE
+008065 0004 0000 01 NO SUN-GLINT
+ 0001 01 SUN-GLINT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008066 0004 0000 01 OPAQUE
+ 0001 01 SEMI-TRANSPARENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008070 0006 0000 01 RESERVED
+ 0001 01 RESERVED
+ 0002 02 EARTH LOCATED INSTRUMENT COUNTS,
+ CALIBRATION COEFFICIENTS AND HOUSEKEEPING (LEVEL 1B)
+ 0003 01 EARTH LOCATED CALIBRATED RADIANCES (LEVEL 1C)
+ 0004 02 MAPPED TO A COMMON FOOTPRINT, EARTH LOCATED
+ CALIBRATED RADIANCES (LEVEL 1D)
+ 0015 01 MISSING VALUE
+008072 0004 0000 01 MIXED
+ 0001 01 CLEAR
+ 0002 01 CLOUDY
+ 0007 01 MISSING VALUE
+008074 0004 0000 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0001 01 NON-OCEAN LIKE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008075 0004 0000 01 ASCENDING ORBIT
+ 0001 01 DESCENDING ORBIT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008076 0003 0000 01 KU
+ 0001 01 C
+ 0063 01 MISSING VALUE
+008077 0007 0000 01 LAND
+ 0001 01 SEA
+ 0002 01 COASTAL
+ 0003 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0004 01 ENCLOSED SEA OR LAKE
+ 0005 01 CONTINENTAL ICE
+ 0127 01 MISSING VALUE
+008079 0009 0000 01 NORMAL ISSUE
+ 0001 01 CORRECTION TO A PREVIOUSLY ISSUED PRODUCT (COR)
+ 0002 01 AMANDMENT TO A PREVIOUSLY ISSUED PRODUCT *AMD)
+ 0003 01 CORRECTION TO A PREVIOUSLY ISSUED AMENDED PRODUCT (COR AMD)
+ 0004 01 CANCELLATION OD A PREVIOUSLY ISSUED PRODUCT (CNL)
+ 0005 01 NO PRODUCT AVAILABLE (NIL)
+ 0006 01 SPECIAL REPORT ( SPECI)
+ 0007 01 CORRECTED SPECIAL REPORT (SPECI COR)
+ 0015 01 MISSING VALUE
+008080 0009 0000 01 TOTAL WATER PRESSURE PROFILE
+ 0001 01 TOTAL WATER TEMPERATURE PROFILE
+ 0002 01 TOTAL WATER SALINITY PROFILE
+ 0003 01 TOTAL WATER CONDUCTIVITY PROFILE
+ 0010 01 WATER PRESSURE AT A LEVEL
+ 0011 01 WATER TEMPERATURE AT A LEVEL
+ 0012 01 SALINITY AT A LEVEL
+ 0020 01 POSITION
+ 0063 01 MISSING VALUE
+008081 0005 0000 01 SENSOR
+ 0001 01 TRANSMITTER
+ 0002 01 RECEIVER
+ 0003 01 OBSERVING PLATFORM
+ 0063 01 MISSING VALUE
+008082 0003 0000 01 SENSOR HEIGHT IS NOT MODIFIED
+ 0001 01 SENSOR HEIGHT IS MODIFIED TO STANDARD LEVEL
+ 0007 01 MISSING VALUE
+008083 0009 0001 02 ADJUSTED WITH RESPECT TO REPRESENTATIVE HEIGHT OF SENSOR ABO
+ VE LOCAL GROUND (OR DECK OF MARINE PLATFORM)
+ 0002 02 ADJUSTED WITH RESPECT TO REPRESENTATIVE HEIGHT OF SENSOR ABO
+ VE WATER SURFACE
+ 0003 01 ADJUSTED WITH RESPECT TO STANDARD SURFACE ROUGHNESS
+ 0004 01 ADJUSTED WITH RESPECT TO WIND SPEED
+ 0005 01 ADJUSTED WITH RESPECT TO TEMPERATURE
+ 0006 01 ADJUSTED WITH RESPECT TO PRESSURE
+ 0007 01 ADJUSTED WITH RESPECT TO HUMIDITY
+ 0008 01 ADJUSTED WITH RESPECT TO EVAPORATION
+ 0009 01 ADJUSTED WITH RESPECT TO WETTING LOSSES
+008085 0008 0000 01 FORE BEAM
+ 0001 01 MID BEAM
+ 0002 01 AFT BEAM
+ 0003 01 RESERVED
+ 0004 01 RESERVED
+ 0005 01 RESERVED
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+008193 0007 0000 01 START TIME OF ORBIT
+ 0001 01 END TIME OF ORBIT
+ 0002 01 TIME OF ASCENDING NODE
+ 0003 01 ASSIMILATION TIME
+ 0004 01 START TIME OF ASSIMILATION
+ 0005 01 END TIME OF ASSIMLATION
+ 0063 01 MISSING
+008195 0032 0001 01 FIRST GUESS
+ 0002 01 ANALYSIS
+ 0003 01 INITIALISED ANALYSIS
+ 0004 01 OI ANALYSIS
+ 0005 01 3 D VARIATIONAL ANALYSIS
+ 0006 01 4 D VARIATIONAL ANALYSIS
+ 0007 01 3 D VARIATIONAL GRADIENTS
+ 0008 01 4 D VARIATIONAL GRADIENTS
+ 0009 01 FORECAST
+ 0010 01 CONTROL FORECAST
+ 0011 01 PERTURBED FORECAST
+ 0012 01 ERRORS IN FIRST GUESS
+ 0013 01 ERRORS IN ANALYSIS
+ 0014 01 CLUSTER MEANS
+ 0015 01 CLUSTER STANDARD DEVIATIONS
+ 0016 01 FORECAST PROBABILITIES
+ 0017 01 ENSEMBLE MEANS
+ 0018 01 ENSEMBLE STANDARD DEVIATIONS
+ 0019 01 FORECAST ACCUMULATIONS
+ 0020 01 CLIMATOLOGY
+ 0021 01 CLIMATE SIMULATION
+ 0030 01 OBSERVATIONS
+ 0031 01 QUALITY CONTROL
+ 0032 01 DIFFERENCE STATISTICS
+ 0040 01 IMAGE DATA
+ 0050 01 SENSITIVITY GRADIENTS
+ 0051 01 TRAJECTORY FORECAST
+ 0052 01 SENSITIVITY FORECAST
+ 0060 01 PERTURBED ANALYSIS
+ 0061 01 PERTURBATION
+ 0062 01 SINGULAR VECTOR
+ 0127 01 MISSING VALUE
+010063 0010 0000 02 INCREASING, THEN DECREASING: ATMOSPHERIC PRESURE THE SAME OR
+ HIGHER THAN 3 HOURS AGO (OR 24 HOURS AGO )
+ 0001 01 INCREASING, THEN STEADY; OR INCREASING; THEN MORE SLOWLY
+ 0002 01 INCREASING (STEADILY OR UNSTEADILY )
+ 0003 01 DECREASING OR STEADY, THEN INCREASING; RAPIDLY
+ 0004 02 STEADY; ATMOSPHERIC PRESSURE THE SAME AS 3 HOURS AGO (OR 24
+ HOURS)
+ 0005 02 DECREASING; THEN INCREASING; ATMOSPHERIC PRESSURE THE SAME O
+ R LOWER THAN 3 HOURS AGO
+ 0006 02 DECREASING, THEN STEADY; OR DECREASING, DECREASING MORE SLOW
+ LY
+ 0007 01 DECREASING (STEADILY OR UNSTEADELY )
+ 0008 02 STEADY OR INCREASING, THEN DECREASING; OR DECREASING, THEN
+ DECREASING MORE RAPIDLY
+ 0015 01 MISSING
+010064 0004 0000 01 SUBSONIC
+ 0001 01 TRANSONIC
+ 0002 01 SUPERSONIC
+ 0007 01 MISSING VALUE
+011031 0009 0000 01 NIL IN CLOUD
+ 0001 01 SLIGHT IN CLOUD
+ 0002 01 MODERATE IN CLOUD
+ 0003 01 SEVERE IN CLOUD
+ 0004 01 NIL IN CLEAR AIR
+ 0005 01 SLIGHT IN CLEAR AIR
+ 0006 01 MODERATE IN CLEAR AIR
+ 0007 01 SEVERE IN CLEAR AIR
+ 0015 01 MISSING VALUE
+011037 0030 0000 01 AVE <0.1 PEAK <0.1
+ 0001 01 AVE <0.1 0.1 <= PEAK <0.2
+ 0002 01 0.1 <= AVE <0.2 0.1 <= PEAK <0.2
+ 0003 01 AVE <0.1 0.2 <= PEAK <0.3
+ 0004 01 0.1 <= AVE <0.2 0.2 <= PEAK <0.3
+ 0005 01 0.2 <= AVE <0.3 0.2 <= PEAK <0.3
+ 0006 01 AVE <0.1 0.3 <= PEAK <0.4
+ 0007 01 0.1 <= AVE <0.2 0.3 <= PEAK <0.4
+ 0008 01 0.2 <= AVE <0.3 0.3 <= PEAK <0.4
+ 0009 01 0.3 <= AVE <0.4 0.3 <= PEAK <0.4
+ 0010 01 AVE <0.1 0.4 <= PEAK <0.5
+ 0011 01 0.1 <= AVE <0.2 0.4 <= PEAK <0.5
+ 0012 01 0.2 <= AVE <0.3 0.4 <= PEAK <0.5
+ 0013 01 0.3 <= AVE <0.4 0.4 <= PEAK <0.5
+ 0014 01 0.4 <= AVE <0.5 0.4 <= PEAK <0.5
+ 0015 01 AVE <0.1 0.5 <= PEAK <0.8
+ 0016 01 0.1 <= AVE <0.2 0.5 <= PEAK <0.8
+ 0017 01 0.2 <= AVE <0.3 0.5 <= PEAK <0.8
+ 0018 01 0.3 <= AVE <0.4 0.5 <= PEAK <0.8
+ 0019 01 0.4 <= AVE <0.5 0.5 <= PEAK <0.8
+ 0020 01 0.5 <= AVE <0.8 0.5 <= PEAK <0.8
+ 0021 01 AVE <0.1 0.8 <= PEAK
+ 0022 01 0.1 <= AVE <0.2 0.8 <= PEAK
+ 0023 01 0.2 <= AVE <0.3 0.8 <= PEAK
+ 0024 01 0.3 <= AVE <0.4 0.8 <= PEAK
+ 0025 01 0.4 <= AVE <0.5 0.8 <= PEAK
+ 0026 01 0.5 <= AVE <0.8 0.8 <= PEAK
+ 0027 01 0.8 <= AVE 0.8 <= PEAK
+ 0028 01 NIL NIL
+ 0063 01 MISSING VALUE
+011038 0017 0000 01 MIN < 1
+ 0001 01 1 <= MIN < 2
+ 0002 01 2 <= MIN < 3
+ 0003 01 3 <= MIN < 4
+ 0004 01 4 <= MIN < 5
+ 0005 01 5 <= MIN < 6
+ 0006 01 6 <= MIN < 7
+ 0007 01 7 <= MIN < 8
+ 0008 01 8 <= MIN < 9
+ 0009 01 9 <= MIN < 10
+ 0010 01 10 <= MIN < 11
+ 0011 01 11 <= MIN < 12
+ 0012 01 12 <= MIN < 13
+ 0013 01 13 <= MIN < 14
+ 0014 01 14 <= MIN < 15
+ 0015 01 NO TIMING INFORMATION AVAILABLE
+ 0031 01 MISSING VALUE
+011039 0016 0000 01 1 <= MIN < 2
+ 0001 01 2 <= MIN < 3
+ 0002 01 3 <= MIN < 4
+ 0004 01 4 <= MIN < 5
+ 0005 01 5 <= MIN < 6
+ 0006 01 6 <= MIN < 7
+ 0007 01 7 <= MIN < 8
+ 0008 01 8 <= MIN < 9
+ 0009 01 9 <= MIN < 10
+ 0010 01 10 <= MIN < 11
+ 0011 01 11 <= MIN < 12
+ 0012 01 12 <= MIN < 13
+ 0013 01 13 <= MIN < 14
+ 0014 01 14 <= MIN < 15
+ 0060 01 NO TIMING INFORMATION AVAILABLE
+ 0063 01 MISSING VALUE
+013038 0004 0000 01 NOT SUPERADIABATIC
+ 0001 01 SUPERADIABATIC
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+013039 0003 0000 01 SEA ICE
+ 0001 01 SNOW ON LAND
+ 0007 01 MISSING VALUE
+013040 0009 0000 01 LAND
+ 0001 01 RESERVED
+ 0002 01 NEAR COAST
+ 0003 01 ICE
+ 0004 01 POSSIBLE ICE
+ 0005 01 OCEAN
+ 0006 01 COAST
+ 0007 01 DESERT
+ 0015 01 MISSING VALUE
+013041 0010 0001 01 A
+ 0002 01 A-B
+ 0003 01 B
+ 0004 01 B-C
+ 0005 01 C
+ 0006 01 D
+ 0007 01 E
+ 0008 01 F
+ 0009 01 G
+ 0015 01 MISSING VALUE
+013051 0008 0000 01 SMALLER THAN ANY VALUE IN THE 30 YEARS PERIOD
+ 0001 01 IN THE FIRST QUINTILE
+ 0002 01 IN THE SECOND QUINTILE
+ 0003 01 IN THE THIRD QUINTILE
+ 0004 01 IN THE FOURTH QUINTILE
+ 0005 01 IN THE FIFTH QUINTILE
+ 0006 01 GREATER THAN ANY VALUE IN THE 30 YEAR PERIOD
+ 0015 01 MISSING VALUE
+013056 0010 0000 01 NO PRECIPITATION
+ 0001 01 LIGHT INTERMITTENT
+ 0002 01 MODERATE INTERMITTENT
+ 0003 01 HEAVY INTERMITTENT
+ 0004 01 VERY HEAVY INTERMITTENT
+ 0005 01 LIGHT CONTINUOUS
+ 0006 01 MODERATE CONTINUOUS
+ 0007 01 VERY HEAVY CONTINUOUS
+ 0009 01 VARIABLE-ALTERNATIVELY LIGHT AND HEAVY
+ 0015 01 MISSING VALUE
+013057 0011 0000 01 NO PRECIPITATION
+ 0001 01 WITHIN THE LAST HOUR
+ 0002 01 1 TO 2 HOURS AGO
+ 0003 01 2 TO 3 HOURS AGO
+ 0004 01 3 TO 4 HOURS AGO
+ 0005 01 4 TO 5 HOURS AGO
+ 0006 01 5 TO 6 HOURS AGO
+ 0007 01 6 TO 8 HOURS AGO
+ 0008 01 8 TO 10 HOURS AGO
+ 0009 01 MORE THAN 10 HOURS AHO
+ 0015 01 MISSING VALUE
+013202 0007 0000 01 LAND
+ 0001 01 VEGETATION
+ 0003 01 MULTI-YEAR ICE
+ 0004 01 POSSIBLE ICE OR FIRST YEAR ICE
+ 0005 01 OCEAN
+ 0006 01 COASTLINE
+ 0015 01 MISSING
+015025 0002 0000 01 OZONE
+ 0015 01 MISSING VALUE
+019001 0007 0000 01 DEPRESSION OR LOW (EXTRATROPICAL)
+ 0001 01 TROPICAL DEPRESSION
+ 0002 01 TROPICAL STORM
+ 0003 01 SEVERE TROPICAL STORM
+ 0004 01 TYPHOON
+ 0010 01 DUST/SANDSTORM
+ 0063 01 MISSING VALUE
+019008 0005 0000 01 RESERVED
+ 0001 01 SHALLOW (TOP OF CIRCULATION BELOW 700-HPA LEVEL
+ 0002 01 MEDIUM(TOP BETWEEN 700-HPA AND 400-HPA)
+ 0003 01 DEEP(TOP ABOVE 400-HPA LEVEL
+ 0007 01 MISSING VALUE
+019010 0004 0000 01 RESERVED
+ 0001 01 MINIMUM VALUE OF SEA LEVEL PRESSURE
+ 0002 01 MAXIMUM VALUE OF 850 HPA RELATIVE VORTICITY
+ 0015 01 MISSING VALUE
+020003 0250 0000 01 CLOUD DEVELOPMENT NOT OBSERVED OR NOT OBSERVABLE
+ 0001 01 CLOUDS GENERALLY DISSOLVING OR BECOMING LESS DEVELOPED
+ 0002 01 STATE OF SKY ON THE WHOLE UNCHANGED
+ 0003 01 CLOUDS GENERALLY FORMING OR DEVELOPING
+ 0004 02 VISIBILITY REDUCED BY SMOKE, E.G. VELDT OR FOREST FIRES, IN
+ DUSTRIAL SMOKE OR VOLCANIC ASHES
+ 0005 01 HAZE
+ 0006 02 WIDESPREAD DUST IN SUSPENSION IN THE AIR, NOT RAISED BY WIND
+ AT OR NEAR THE STATION AT THE TIME OF OBSERVATION
+ 0007 04 DUST OR SEND RAISED BY WIND AT OR NEAR THE STATION AT THE TI
+ ME OF OBSERVATION, BUT NO WELL-DEVELOPED DUST WHRIL(S) OR SA
+ ND WHRIL(S), AND NO DUSTSTORM OR SANDSTORM SEEN; OR, IN THE
+ CASE OF SHIPS, BLOWING SPRAY AT THE STATION
+ 0008 03 WELL-DEVELOPED DUST WHRIL(S) OR SAND WHRILS SEEN AT OR NEAR
+ THE STATION DURING THE PRECEDING HOUR OR AT THE SAME TIME OF
+ OBSERVATION, BUT NO DUSTSTORM OR SANDSTORM
+ 0009 02 DUSTSTORM OR SANDSTORM WITHIN SIGHT AT THE TIME OF OBSERVATI
+ ON, OR AT THE STATION DURING THE PRECEDING HOR
+ 0010 01 MIST
+ 0011 02 PACHES SHALLOW FOG OR ICE AT THE STATION, WHETHER ON LAND OR
+ SEA, NOT DEEPER THAN 2 METRES ON LAND OR 10 METRES AT SEA
+ 0012 03 MORE OR LESS CONTINUOUS SHALLOW FOG OR ICE AT THE STATION,
+ WHETHER ON LAND OR SEA, NOT DEEPER THAN 2 METRES ON LAND OR
+ 10 METRES AT SEA
+ 0013 01 LIGHTNING VISIBLE, NO THUNDER HEARD
+ 0014 02 PRECIPITATION WITHIN SIGHT, NOT REACHING THE GROUND OR THE
+ SURFACE OF THE SEA
+ 0015 03 PRECIPITATION WITHIN SIGHT, REACHING THE GROUND OR THE SURFA
+ CE OF THE SEA, BUT DISTANT, I.E. ESTIMATED TO BE MORE THAN
+ 5 KM FROM THE STATION
+ 0016 02 PRECIPITATION WITHIN SIGHT, REACHING THE GROUND OR THE SURFA
+ CE OF THE SEA, NEAR TO, BUT NOT AT THE STATION
+ 0017 02 THUNDERSTORM, BUT NO PRECIPITATION AT THE TIME OF OBSERVATIO
+ N
+ 0018 02 SQUALLS AT OR WITHIN SIGHT OF THE STATION DURING THE PRECEDI
+ NG HOUR OR AT THE TIME OF OBSERVATION
+ 0019 02 FUNNEL CLOUD(S) AT OR WITHIN SIGHT OF THE STATION DURING THE
+ PRECEDING HOUR OR AT THE TIME OF OBSERVATION
+ 0020 03 DRIZZEL (NOT FREEZING) OR SNOW GRAINS NOT FALLING AS SHOWERS
+ ; DURING THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVAT
+ IONS
+ 0021 02 RAIN (NOT FREEZING) NOT FALLING AS SHOWER(S); DURING THE PRE
+ ECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0022 02 SNOW NOT FALLING AS SHOWER(S); DURING THE PRECEDING HOUR BUT
+ NOT AT THE TIME OF OBSERVATION
+ 0023 02 RAIN AND SNOW OR ICE PELLETS NOT FALLING AS SHOWER(S); DURIN
+ G THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0024 02 FREEZING DRIZZEL OR FREEZING RAIN NOT FALLING AS SHOWER(S);
+ DURING THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0025 02 SHOWER(S) OF RAIN; DURING THE PRECEDING HOUR BUT NOT AT THE
+ TIME OF OBSERVATION
+ 0026 02 SHOWER(S) OF SNOW, OR OF RAIN AND SNOW; DURING THE PRECEDING
+ HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0027 02 SHOWER(S) OF HAIL, OR OF RAIN AND HAIL; DURING THE PRECEDING
+ HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0028 02 FOG OR ICE FOG; DURING THE PRECEDING HOUR BUT NOT AT THE TIM
+ E OF OBSERVATION
+ 0029 02 THUNDERSTORM (WITH OR WITHOUT PRECIPITATION); DURING THE PRE
+ CEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0030 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM HAS DECREASED DURI
+ NG THE PRECEDING HOURS
+ 0031 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM NO APPRECIABLE CHA
+ NGE DURING THE PRECEDING HOUR
+ 0032 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM HAS BEGUN OR HAS I
+ NCEASED DURING THE PRECEDING HOUR
+ 0033 02 SEVERE DUSTSTORM OR SANDSTORM HAS DECREASED DURING THE PREC
+ EDING HOURS
+ 0034 02 SEVERE DUSTSTORM OR SANDSTORM NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0035 02 SEVERE DUSTSTORM OR SANDSTORM HAS BEGUN OR HAS INCREASED DUR
+ ING THE PRECEDING HOUR
+ 0036 02 SLIGHT OR MODERATE DRIFTING SNOW GENERALLY LOW (BELOW EYE LE
+ VEL)
+ 0037 01 HEAVY DRIFTING SNOW GENERALY LOW (BELOW EYE LEVEL)
+ 0038 02 SLIGHT OR MODERATE BLOWING SNOW GENERALLY HIGH (ABOVE EYE LE
+ VEL)
+ 0039 01 HEAVY BLOWING SNOW GENERALY HIGH (ABOVE EYE LEVEL)
+ 0040 03 FOG OR ICE FOG AT A DISTANCE AT THE TIME OF OBSERVATION, BUT
+ NOT AT THE STATION DURING THE PRECEDING HOUR, THE FOG OR IC
+ E FOG EXTENDING TO A LEVEL ABOVE THAT OF THE OBSERVER
+ 0041 01 FOG OR ICE FOG IN PATCHES
+ 0042 02 FOG OR ICE FOG, SKY VISIBLE,HAS BECOME THINNER DURING THE PR
+ ECEDING HOUR
+ 0043 02 FOG OR ICE FOG, SKY INVISIBLE,HAS BECOME THINNER DURING THE
+ PRECEDING HOUR
+ 0044 02 FOG OR ICE FOG, SKY VISIBLE,NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0045 02 FOG OR ICE FOG, SKY INVISIBLE,NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0046 02 FOG OR ICE FOG, SKY VISIBLE,HAS BEGUN OR HAS BECOME THICKE
+ R DURING THE PRECEDING HOUR
+ 0047 02 FOG OR ICE FOG, SKY INVISIBLE,HAS BEGUN OR HAS BECOME THICKE
+ R DURING THE PRECEDING HOUR
+ 0048 01 FOG, DEPOSITING RIME, SKY VISIBLE
+ 0049 01 FOG, DEPOSITING RIME, SKY INVISIBLE
+ 0050 02 DRIZZLE, NOT FREEZING, INTERMITTENT;SLIGHT AT TIME OF OBSERV
+ ATION
+ 0051 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;SLIGHT AT TIME OF OBSERV
+ ATION
+ 0052 02 DRIZZLE, NOT FREEZING, INTERMITTENT;MODERATE AT TIME OF OBSE
+ RVATION
+ 0053 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;MODERATE AT TIME OF OBSE
+ RVATION
+ 0054 02 DRIZZLE, NOT FREEZING, INTERMITTENT;HEAVY (DENSE) AT THE TIM
+ E OF OBSERVATION
+ 0055 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;HEAVY (DENSE) AT THE TIM
+ E OF OBSERVATION
+ 0056 01 DRIZZLE, FREEZING, SLIGHT
+ 0057 01 DRIZZLE, FREEZING, MODERATE OR HEAVY (DENSE)
+ 0058 01 DRIZZLE AND RAIN, SLIGHT
+ 0059 01 DRIZZLE AND RAIN, MODERATE OR HEAVY
+ 0060 01 RAIN,NOT FREEZING,INTERMITTENT;SLIGHT AT TIME OF OBSERVATION
+ 0061 01 RAIN,NOT FREEZING,CONTINUOUS ;SLIGHT AT TIME OF OBSERVATION
+ 0062 02 RAIN,NOT FREEZING,INTERMITTENT;MODERATE AT TIME OF OBSERVATI
+ ON
+ 0063 02 RAIN,NOT FREEZING,CONTINUOUS ;MODERATE AT TIME OF OBSERVATI
+ ON
+ 0064 02 RAIN, NOT FREEZING, INTERMITTENT;HEAVY AT TIME OF OBSERVATIO
+ ON
+ 0065 01 RAIN, NOT FREEZING, CONTINUOUS;HEAVY AT TIME OF OBSERVATION
+ 0066 01 RAIN, FREEZING, SLIGHT
+ 0067 01 RAIN, FREEZING, MODERATE OR HEAVY
+ 0068 01 RAIN OR DRIZZLE AND SNOW, LIGHT
+ 0069 01 RAIN OR DRIZZLE AND SNOW, MODERATE OR HEAVY
+ 0070 02 INTERMITTENT FALL OF SNOWFLAKES, SLIGHT AT TIME OF OBSERVATI
+ ON
+ 0071 02 CONTINUOUS FALL OF SNOWFLAKES, SLIGHT AT TIME OF OBSERVATI
+ ON
+ 0072 02 INTERMITTENT FALL OF SNOWFLAKES, MODERATE AT TIME OF OBSERVA
+ TION
+ 0073 02 CONTINUOUS FALL OF SNOWFLAKES, MODERATE AT TIME OF OBSERVA
+ TION
+ 0074 02 INTERMITTENT FALL OF SNOWFLAKES, HEAVY AT TIME OF OBSERVATIO
+ ONS
+ 0075 02 CONTINUOUS FALL OF SNOWFLAKES, HEAVY AT TIME OF OBSERVATIO
+ ONS
+ 0076 01 DIAMOND DUST (WITH OR WITHOUT FOG)
+ 0077 01 SNOW GRAINS (WITH OR WITHOUT FOG)
+ 0078 01 ISOLATED STAR-LIKE SNOW CRYSTALS (WITH OR WITHOUT FOG)
+ 0079 01 ICE PELLETS
+ 0080 01 RAIN SHOWER(S), SLIGHT
+ 0081 01 RAIN SHOWER(S), MODERATE OR HEAVY
+ 0082 01 RAIN SHOWER(S), VIOLENT
+ 0083 01 SHOWER(S) OF RAIN AND SNOW MIXED, SLIGHT
+ 0084 01 SHOWER(S) OF RAIN AND SNOW MIXED, MODERATE OR HEAVY
+ 0085 01 SNOW SHOWER(S), SLIGHT
+ 0086 01 SNOW SHOWER(S), MODERATE OR HEAVY
+ 0087 02 SHOWER(S) OF SNOW PELLETS OR SMALL HAIL, WITH OR WITHOUT RAI
+ N OR RAIN AND SNOW MIXED, SLIGHT
+ 0088 02 SHOWER(S) OF SNOW PELLETS OR SMALL HAIL, WITH OR WITHOUT RAI
+ N OR RAIN AND SNOW MIXED, MODERATE OR HEAVY
+ 0089 02 SHOWER(S) OF HAIL, WITH OR WITHOUT RAIN OR RAIN AND SNOW MIX
+ ED, NOT ASSOCIATED WITH THUNDER, SLIGHT
+ 0090 02 SHOWER(S) OF HAIL, WITH OR WITHOUT RAIN OR RAIN AND SNOW MIX
+ ED, NOT ASSOCIATED WITH THUNDER, MODERATE OR HEAVY
+ 0091 02 SLIGHT RAIN AT TIME OF OBSERVATION, THUNDERSTORM DURING THE
+ PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0092 02 MODERATE OR HEAVY RAIN AT TIME OF OBSERVATION, THUNDERSTORM
+ DURING THE PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0093 03 SLIGHT SNOW, OR RAIN AND SNOW MIXED OR HAIL AT TIME OF OBSER
+ VATION, THUNDERSTORM DURING THE PRECEDING HOUR BUT NOT AT TI
+ ME OF OBSERVATION
+ 0094 03 MODERATE OR HEAVY SNOW, OR RAIN AND SNOW MIXED OR HAIL AT TI
+ ME OF OBSERVATION, THUNDERSTORM DURING PRECEDING HOUR BUT NO
+ T AT TIME OF OBSERVATION
+ 0095 03 THUNDERSTORM, SLIGHT OR MODERATE, WITHOUT HAIL, BUT WITH RAI
+ N AND/OR SNOW AT TIME OF OBSERVATION, THUNDERSTORM DURING TH
+ E PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0096 02 THUNDERSTORM, SLIGHT OR MODERATE,WITH HAIL AT TIME OF OBSERV
+ ATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0097 02 THUNDERSTORM, HEAVY, WITHOUT HAIL BUT WITH RAIN AND/OR SNOW
+ AT TIME OF OBSERVATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0098 02 THUNDERSTORM COMBINED WITH DUSTSTORM OR SANDSTORM AT TIME OF
+ OBSERVATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0099 02 THUNDERSTORM, HEAVY, WITH HAIL AT TIME OF OBSERVATION, THUND
+ ERSTORM AT TIME OF OBSERVATION
+ 0100 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0101 02 CLOUDS GENERALLY DISSOLVING OR BECOMING LESS DEVELOPED DURIN
+ G THE PAST HOUR
+ 0102 01 STATE OF SKY ON THE WHOLE UNCHANGED DURING THE PAST HOUR
+ 0103 01 CLOUDS GENERALLY FORMING OR DEVELOPING DURING THE PAST HOUR
+ 0104 02 HAZE OR SMOKE, OR DUST IN SUSPENSION IN THE AIR, VISIBILITY
+ EQUAL TO, OR GREATER THAN 1KM
+ 0105 02 HAZE OR SMOKE, OR DUST IN SUSPENSION IN THE AIR, VISIBILITY
+ LESS THAN 1KM
+ 0110 01 MIST
+ 0111 01 DIAMOND DUST
+ 0112 01 DISTANT LIGHTING
+ 0118 01 SQUALLS
+ 0120 01 FOG
+ 0121 01 PRECIPITATION
+ 0122 01 DRIZZLE (NOT FREEZING) OR SNOW GRAINS
+ 0123 01 RAIN (NOT FREEZING)
+ 0124 01 SNOW
+ 0125 01 FREEZING DRIZZLE OR FREEZING RAIN
+ 0126 01 THUNDERSTORM (WITH OR WITHOUT PRECIPITATION)
+ 0127 01 BLOWING OR DRIFTING SNOW OR SAND
+ 0128 02 BLOWING OR DRIFTING SNOW OR SAND, VISIBILITY EQUAL TO, OR GR
+ ATER THAN, 1KM
+ 0129 01 BLOWING OR DRIFTING SNOW OR SAND, VISIBILITY LESS THAN 1 KM
+ 0130 01 FOG
+ 0131 01 FOG OR ICE FOG, IN PATCHES
+ 0132 01 FOG OR ICE FOG, HAS BECOME THINNER DURING PAST HOUR
+ 0133 01 FOG OR ICE FOG, NO APPRECIABLE CHANGE DURING PAST HOUR
+ 0134 01 FOG OR ICE FOG, HAS BECUNOR BECOME THICKER DURING PAST HOUR
+ 0135 01 FOG, DEPOSITION RIME
+ 0140 01 PRECIPITATION
+ 0141 01 PRECIPITATION SLIGHT OR MODERATE
+ 0142 01 PRECIPITATION, HEAVY
+ 0143 01 LIQUID PRECIPITATION, SLIGHT OR MODERATE
+ 0144 01 LIQUID PRECIPITATION, HEAVY
+ 0145 01 SOLID PRECIPITATION, SLIGHT OR MODERATE
+ 0146 01 SOLID PRECIPITATION, HEAVY
+ 0147 01 FREEZING PRECIPITATION, SLIGHT OR MODERATE
+ 0148 01 FREEZING PRECIPITATION, HEAVY
+ 0150 01 DRIZZLE
+ 0151 01 DRIZZLE, NOT FREEZING, SLIGHT
+ 0152 01 DRIZZLE, NOT FREEZING, MODERATE
+ 0153 01 DRIZZLE, NOT FREEZING, HEAVY
+ 0154 01 DRIZZLE, FREEZING, SLIGHT
+ 0155 01 DRIZZLE, FREEZING, MODERATE
+ 0156 01 DRIZZLE, FREEZING, HEAVY
+ 0157 01 DRIZZLE AND RAIN, SLIGHT
+ 0158 01 DRIZZLE AND RAIN, MODERATE OR HEAVY
+ 0160 01 RAIN
+ 0161 01 RAIN, NOT FREEZING, SLIGHT
+ 0162 01 RAIN, NOT FREEZING, MODERATE
+ 0163 01 RAIN, NOT FREEZING, HEAVY
+ 0164 01 RAIN, FREEZING, SLIGHT
+ 0165 01 RAIN, FREEZING, MODERATE
+ 0166 01 RAIN, FREEZING, HEAVY
+ 0167 01 RAIN (OR DRIZZLE) AND SNOW, SLIGHT
+ 0168 01 RAIN (OR DRIZZLE) AND SNOW, MODERATE AND HEAVY
+ 0170 01 SNOW
+ 0171 01 SNOW, SLIGHT
+ 0172 01 SNOW, MODERATE
+ 0173 01 SNOW, HEAVY
+ 0174 01 ICE PELLETS, SLIGHT
+ 0175 01 ICE PELLETS, MODERATE
+ 0176 01 ICE PELLETS, HEAVY
+ 0180 01 SHOWER(S) OR INTERMITTENT PRECIPITATION
+ 0181 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, SLIGHT
+ 0182 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, MODERATE
+ 0183 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, HEAVY
+ 0184 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, VIOLENT
+ 0185 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, SLIGHT
+ 0186 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, MODERATE
+ 0187 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, HEAVY
+ 0190 01 THUNDERSTORM
+ 0191 01 THUNDERSTORM, SLIGHT OR MODERATE, WITH NO PRECIPITATION
+ 0192 02 THUNDERSTORM, SLIGHT OR MODERATE, WITH RAIN SHOWERS AND/OR S
+ NOW SHOWERS
+ 0193 01 THUNDERSTORM, SLIGHT OR MODERATE, WITH HAIL
+ 0194 01 THUNDERSTORM, HEAVY, WITH NO PRECIPITATION
+ 0195 01 THUNDERSTORM, HEAVY, WITH RAIN SHOWERS AND/OR SNOW SHOWERS
+ 0196 01 THUNDERSTORM, HEAVY, WITH HAIL
+ 0204 01 VOLCANIC ASH SUSPENDED IN THE AIR ALOFT
+ 0206 01 THICK DUST HAZE, VISIBILITY LESS THAN 1 KM
+ 0207 01 BLOWING SPRAY AT THE STATION
+ 0208 01 DRIFTING DUST (SAND)
+ 0209 01 WALL OF DUST OR SAND IN DISTANCE (LIKE HABOOB)
+ 0210 01 SNOW HAZE
+ 0211 01 WHITEOUT
+ 0213 01 LIGHTING, CLOUD TO SURFACE
+ 0217 01 DRY THUNDERSTORM
+ 0219 02 TORNADO CLOUD (DESTRUCTIVE AT OR WITHIN SIGHT OF THE STATION
+ DURING PRECEDING HOUR OR AT THE TIME OF OBSERVATION
+ 0220 01 DEPOSITION OF VOLCANIC ASH
+ 0221 01 DEPOSITION OF DUST OR SAND
+ 0222 01 DEPOSITION OF DEW
+ 0223 01 DEPOSITION OF WET SNOW
+ 0224 01 DEPOSITION OF SOFT RIME
+ 0225 01 DEPOSITION OF HARD RIME
+ 0226 01 DEPOSITION OF HOAR FROST
+ 0227 01 DEPOSITION OF GLAZE
+ 0228 01 DEPOSITION OF ICE CRUST (ICE SLICK)
+ 0230 01 DUSTSTORM OR SANDSTORM WITH TEMPERATURE BELOW 0 C DEGREES
+ 0239 02 BLOWING SNOW, IMPOSSIBLE TO DETERMINE WHETHER SNOW IS FALLIN
+ G OR NOT
+ 0241 01 FOG ON SEA
+ 0242 01 FOG IN VALLEYS
+ 0243 01 ARCTIC OR ANTARCTIC SEA SMOKE
+ 0244 01 STEAM FOG (SEA,LAKE OR RIVER)
+ 0245 01 STEAM FOG (LAND)
+ 0246 01 FOG OVER ICE OR SNOW COVER
+ 0247 01 DENCE FOG VISIBILITY 60-90 M
+ 0248 01 DENCE FOG VISIBILITY 30-60 M
+ 0249 01 DENCE FOG VISIBILITY LESS THAN 30 M
+ 0250 01 DRIZZLE, RATE OF FALL LESS THAN 0.10 MM/H
+ 0251 01 DRIZZLE, RATE OF FALL 0.10 - .19 MM/H
+ 0252 01 DRIZZLE, RATE OF FALL 0.20 - .39 MM/H
+ 0253 01 DRIZZLE, RATE OF FALL 0.40 - .79 MM/H
+ 0254 01 DRIZZLE, RATE OF FALL 0.80 - 1.59 MM/H
+ 0255 01 DRIZZLE, RATE OF FALL 1.60 - 3.19 MM/H
+ 0256 01 DRIZZLE, RATE OF FALL 3.20 - 6.39 MM/H
+ 0257 01 DRIZZLE, RATE OF FALL 6.40 MM/H OR MORE
+ 0259 01 DRIZZLE AND SNOW
+ 0260 01 RAIN, RATE OF FALL LESS THAN 1.0 MM/H
+ 0261 01 RAIN, RATE OF FALL 1.0 - 1.9 MM/H
+ 0262 01 RAIN, RATE OF FALL 2.0 - 3.9 MM/H
+ 0263 01 RAIN, RATE OF FALL 4.0 - 7.9 MM/H
+ 0264 01 RAIN, RATE OF FALL 8.0 - 15.9 MM/H
+ 0265 01 RAIN, RATE OF FALL 16.0 - 31.9 MM/H
+ 0266 01 RAIN, RATE OF FALL 32.0 - 63.9 MM/H
+ 0267 01 RAIN, RATE OF FALL 64.0 MM/H OR MORE
+ 0270 01 SNOW, RATE OF FALL LESS THAN 1.0 CM/H
+ 0271 01 SNOW, RATE OF FALL 1.0 - 1.9 CM/H
+ 0272 01 SNOW, RATE OF FALL 2.0 - 3.9 CM/H
+ 0273 01 SNOW, RATE OF FALL 4.0 - 7.9 CM/H
+ 0274 01 SNOW, RATE OF FALL 8.0 - 15.9 CM/H
+ 0275 01 SNOW, RATE OF FALL 16.0 - 31.9 CM/H
+ 0276 01 SNOW, RATE OF FALL 32.0 - 63.9 CM/H
+ 0277 01 SNOW, RATE OF FALL 64.0 CM/H OR MORE
+ 0278 01 SNOW OR ICE CRISTAL PRECIPITATION FROM A CLEAR SKY
+ 0279 01 WET SNOW, FREEZING ON CONTACT
+ 0280 01 PRECIPITATION OF RAIN (WW= 87-99)
+ 0281 01 PRECIPITATION OF RAIN,FREEZING (WW= 80-82)
+ 0282 01 PRECIPITATION OF RAIN AND SNOW MIXED
+ 0283 01 PRECIPITATION OF SNOW
+ 0284 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL
+ 0285 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH RAIN
+ 0286 02 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH RAIN AND S
+ NOW MIXED
+ 0287 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH SNOW
+ 0288 01 PRECIPITATION OF HAIL
+ 0289 01 PRECIPITATION OF HAIL, WITH RAIN
+ 0290 01 PRECIPITATION OF HAIL, WITH RAIN AND SNOW MIXED
+ 0291 01 PRECIPITATION OF HAIL, WITH SNOW
+ 0292 01 SHOWER(S) OR THUNDERSTORM OVER SEA
+ 0293 01 SHOWER(S) OR THUNDERSTORM OVER MOUNTAINS
+ 0508 02 NO SIGNIFICANT PHENOMENA TO REPORT, PRESENT AND PAST WEATHER
+ OMITTED
+ 0509 02 NOT OBSERVED, NO DATA AVAILABLE, PRESENT AND PAST WEATHER OM
+ ITTED
+ 0510 01 PRESENT AND PAST WEATHER MISSING, BUT EXPECTED
+ 0511 01 MISSING VALUE
+020004 0021 0000 02 CLOUD COVERING 1/2 OR LESS OF THE SKY THROUGHOUT THE APPROPP
+ RIATE PERIOD
+ 0001 03 CLOUD COVERING MORE THAN 1/2 OF THE SKY DURING PART OF THE A
+ PPROPRIATE PERIOD AND COVERING 1/2 OR LESS DURING PART OF TH
+ E PERIOD
+ 0002 02 CLOUD COVERING MORE THAN 1/2 OF THE SKY THROUGHOUT THE APPRP
+ PRIATE PERIOD
+ 0003 01 SANSTORM, DUSTSTORM OR BLOWING SNOW
+ 0004 01 FOG OR ICE OR THICK HAZE
+ 0005 01 DRIZZLE
+ 0006 01 RAIN
+ 0007 01 SNOW, OR RAIN AND SNOW MIXED
+ 0008 01 SHOWER(S)
+ 0009 01 THUNDERSTORM(S) WITH OR WITHOUT PRECIPITATION
+ 0010 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0011 01 VISIBILITY REDUCED
+ 0012 01 BLOWING PHENOMENA, VISIBILITY REDUCED
+ 0013 01 FOG
+ 0014 01 PRECIPITATION
+ 0015 01 DRIZZLE
+ 0016 01 RAIN
+ 0017 01 SNOW OR ICE PELLETS
+ 0018 01 SHOWERS OR INTERMITTENT PRECIPITATION
+ 0019 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+020005 0021 0000 02 CLOUD COVERING 1/2 OR LESS OF THE SKY THROUGHOUT THE APPROPP
+ RIATE PERIOD
+ 0001 03 CLOUD COVERING MORE THAN 1/2 OF THE SKY DURING PART OF THE A
+ PPROPRIATE PERIOD AND COVERING 1/2 OR LESS DURING PART OF TH
+ E PERIOD
+ 0002 02 CLOUD COVERING MORE THAN 1/2 OF THE SKY THROUGHOUT THE APPRP
+ PRIATE PERIOD
+ 0003 01 SANSTORM, DUSTSTORM OR BLOWING SNOW
+ 0004 01 FOG OR ICE OR THICK HAZE
+ 0005 01 DRIZZLE
+ 0006 01 RAIN
+ 0007 01 SNOW, OR RAIN AND SNOW MIXED
+ 0008 01 SHOWER(S)
+ 0009 01 THUNDERSTORM(S) WITH OR WITHOUT PRECIPITATION
+ 0010 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0011 01 VISIBILITY REDUCED
+ 0012 01 BLOWING PHENOMENA, VISIBILITY REDUCED
+ 0013 01 FOG
+ 0014 01 PRECIPITATION
+ 0015 01 DRIZZLE
+ 0016 01 RAIN
+ 0017 01 SNOW OR ICE PELLETS
+ 0018 01 SHOWERS OR INTERMITTENT PRECIPITATION
+ 0019 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+020008 0019 0000 01 SKY CLEAR
+ 0001 01 FEW
+ 0002 01 SCATTERED
+ 0003 01 BROKEN
+ 0004 01 OVERCAST
+ 0005 01 RESERVED
+ 0006 01 SCATTERED/BROKEN (MANY FORECASTS USE SCATTERED/BROKEN
+ 0007 01 BROKEN/OVERCAST (BROKEN/OVERCAST FOLLOWED BY CLOUD TYPE(S))
+ 0008 02 ISOLATED (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE
+ CB)
+ 0009 02 ISOLATED EMBEDDED (USED ON AVIATION CHARTS TO DESCRIBE THE C
+ LOUD TYPE CB)
+ 0010 02 OCCASIONAL (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TY
+ PE CB)
+ 0011 02 OCCASIONAL EMBEDDED (USED ON AVIATION CHARTS TO DESCRIBE THE
+ CLOUD TYPE CB)
+ 0012 02 FREQUENT (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE
+ CB)
+ 0013 02 DENSE (USED ON AVIATION CHARTS TO DESCRIBE CLOUD THAT WOULD
+ CAUSE SUDDEN CHANGES IN VISIBILITY (LESS THAN 1000M)
+ 0014 01 LAYERS
+ 0015 01 OBSCURED (OBSC)
+ 0016 01 EMBEDDED (EMBD)
+ 0017 01 FREQUENT EMBEDDED
+ 0031 01 MISSING VALUE
+020009 0006 0000 01 RESERVED
+ 0001 01 NSC MIL SIGNIFICANT CLOUD
+ 0002 01 CAVOK
+ 0003 01 SKC SKY CLEAR
+ 0004 01 NSW NIL SIGNIFICANT WEATHER
+ 0015 01 MISSING VALUE
+020011 0011 0000 01 0 0
+ 0001 01 1 OKTA OR LESS, BUT NOT ZERO 1/10 OR LESS, BUT NOT ZERO
+ 0002 01 2 OKTAS 2/10 - 3/10
+ 0003 01 3 OKTAS 4/10
+ 0004 01 4 OKTAS 5/10
+ 0005 01 5 OKTAS 6/10
+ 0006 01 6 OKTAS 7/10 - 8/10
+ 0007 01 7 OKTAS OR MORE,BUT NOT 8 OKTAS9/10 OR MORE, BUT NOT 10/10
+ 0008 01 8 OKTAS 10/10
+ 0009 01 SKY OBSCURED BY FOG AND OR OTHER METEOROLOGICAL PHENOMENA
+ 0015 02 CLOUD COVE IS INDISCERNIBLE FOR REASONS OTHER THAN FOG OR OT
+ HER METEOROLOGICAL PHENOMENA, OR OBSERVATION IS NOT MADE
+020012 0045 0000 01 CIRRUS (CI)...............CI
+ 0001 01 CIRROCUMULUS (CC).........CC
+ 0002 01 CIRROSTRATUS (CS).........CS
+ 0003 01 ALTOCUMULUS (AC).........AC
+ 0004 01 ALTOSTRATUS (AS).........AS
+ 0005 01 NIMBOSTRATUS (NS).........NS
+ 0006 01 STRATOCUMULUS(SC).........SC
+ 0007 01 STRATUS (ST).........ST
+ 0008 01 CUMULUS (CU).........CU
+ 0009 01 CUMULONIMBUS (CB).........CB
+ 0010 01 NO CH CLOUDS
+ 0011 02 CIRRUS FIBRATUS, SOMETIMES UNCINUS, NOT PROGRESSIVELY INADIN
+ G THE SKY
+ 0012 04 CIRRUS SPISSATUS, IN PATCHES OR ENTANGLED SHEAVES, WHICH USU
+ ALLY DO NOT INCREASE AND SOMETIMES SEEM TO BE THE REMAINS OF
+ THE UPPER PART OF A CUMULONIMBUS; OR CIRRUS CASTELLANUS OR
+ FLOCCUS
+ 0013 01 CIRRUS SPISSATUS CUMULONIMBOGENITUS
+ 0014 02 CIRRUS UNCINUS OR FIBRATUS,OR BOTH, PROGRESSIVELY INVADING T
+ HE SKY ; THEY GENERALLY THICKEN AS A WHOLE
+ 0015 04 CIRRUS (OFTEN IN BANDS) AND CIRROSTRATUS, OR CIRROSTRATUS AL
+ ONE, PROGRESSIVELY INVADING THE SKY; THEY GENERALLY THICKEN
+ ASA WHOLE, BUT THE CONTINUOUS VEIL DOES NOT REACH 45 DEGREES
+ ABOVE THE HORIZON
+ 0016 05 CIRRUS (OFTEN IN BANDS) AND CIRROSTRATUS, OR CIRROSTRATUS AL
+ ONE, PROGRESSIVELY INVADING THE SKY; THEY GENERALLY THICKEN
+ ASA WHOLE, BUT THE CONTINUOUS VEIL EXTENDS MORE THAN 45 DEGR
+ REES ABOVE THE HORIZON, WITHOUT THE SKY BEING TOTALLY COVERE
+ D
+ 0017 01 CIRROSTRATUS COVERING THE WHOLE SKY
+ 0018 02 CIRROSTRATUS NOT PROGRESSIVELY INVADING THE SKY AND NOT ENTI
+ RELY COVERING IT
+ 0019 02 CIRROCUMULUS ALONE, OR CIRROCUMULUS PREDOMINANT AMONG THE CH
+ CLOUDS
+ 0020 01 NO CM CLOUDS
+ 0021 01 ALTOSTRATUS TRANSLUCIDUS
+ 0022 01 ALTOSTRATUS OPACUS OR NIMBOSTRATUS
+ 0023 01 ALTOCUMULUS TRANSLUCIDUS AT A SINGLE LEVEL
+ 0024 02 PATCHES (OFTEN LENTICULARIS) OF ALTOCUMULUS TRANSLUCIDUS, CO
+ NTINUALLY CHANGING AND OCCURING AT ONE OR MORE LEVELS
+ 0025 04 ALTOCUMULUS TRANSLUCIDUS IN BANDS, OR ONE OR MORE LAYERS OF
+ ALTOCUMULUS TRANSLUCIDUS OR OPACUS, PROGRESSIVELY INVADING T
+ HE SKY; THESE ALTOCUMULUS CLOUDS GENERALLY THICKEN AS A WHOL
+ E
+ 0026 01 ALTOCUMULUS CUMULOGENITUS (OR CUMULONIMBOGENITUS)
+ 0027 04 ALTOCUMULUS TRANSLUCIDUS OR OPACUS IN TWO OR MORE LAYERS, OR
+ ALTOCUMULUS OPACUS IN A SINGLE LAYER, NOT PROGRESSIVELY INV
+ ADING THE SKY, OR ALTOCUMULUS WITH ALTOSTRATUS OR NIMBOSTRAT
+ US
+ 0028 01 ALTOCUMULUS CASTELLANUS OR FLOCUS
+ 0029 01 ALTOCUMULUS OF CHAOTIC SKY, GENERALLY AT SEVERAL LEVELS
+ 0030 01 NO CL CLOUDS
+ 0031 02 CUMULUS HUMILIS OR CUMULUS FRACTUS OTHER THAN OF BAD WEATHER
+ , OR BOTH
+ 0032 03 CUMULUS MEDIOCRIS OR CONGESTUS, WITH OR WITHOUT CUMULUS OF S
+ PECIES FRACTUS OR HUMULIS OR STRATOCUMULUS, ALL HAVING THEIR
+ BASES AT THE SAME LEVEL
+ 0033 02 CUMULONIMBUS CALVUS, WITH OR WITHOUT CUMULUS, STRATOCUMULUS
+ OR STRATUS
+ 0034 01 STRATOCUMULUS CUMULOGENITUS
+ 0035 01 STRATOCUMULUS OTHER THAN STRATOCUMULUS CUMULOGENITUS
+ 0036 02 STRATUS NEBULOSUS OR STRATUS FRACTUS OTHER THAN OF BAD WEATH
+ ER, OR BOTH
+ 0037 02 STRATUS FRACTUS OR CUMULUS FRACTUS OF BAD WEATHER, OR BOTH
+ (PANNUS), USUALLY BELOW ALTOSTRATUS OR NIMBOSTRATUS
+ 0038 02 CUMULUS AND STRATOCUMULUS OTHER THAN STRATOCUMULUS CUMULOGEN
+ ITUS, WITH BASES AT DIFFERENT LEVELS
+ 0039 03 CUMULONIMBUS CAPILLATUS (OFTEN WITH AN ANVIL), WITH OR WITHO
+ UT CUMULONIMBUS CALVUS, CUMULUS, STRATOCUMULUS, STRATUS OR P
+ ANNUS
+ 0059 02 CLOUD NOT VISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDSTO
+ RM, OR OTHER ANALOGOUS PHENOMENA
+ 0060 03 CH CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA, OR BECAUSE OF A CONTINUOUS
+ LAYER OF LOWER CLOUDS
+ 0061 03 CM CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA, OR BECAUSE OF A CONTINUOUS
+ LAYER OF LOWER CLOUDS
+ 0062 02 CL CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA
+ 0063 01 MISSING VALUE
+020017 0011 0000 01 ISOLATED CLOUD OR FRAGMENTS OF CLOUD
+ 0001 01 CONTINUOUS CLOUD
+ 0002 01 BROKEN CLOUD - SMALL BREAKS, FLAT TOPS
+ 0003 01 BROKEN CLOUD - LARGE BREAKS, FLAT TOPS
+ 0004 01 CONTINUOUS CLOUD
+ 0005 01 BROKEN CLOUD - SMALL BREAKS, UNDULATED TOPS
+ 0006 01 BROKEN CLOUD - LARGE BREAKS, UNDULATED TOPS
+ 0007 02 CONTINUOUS OR ALMOST CONTINUOUS WAVES WITH TOWERING CLOUDS A
+ BOVE THE TOP OF THE LAYER
+ 0008 02 GROUPS OF WAVES WITH TOWERING CLOUDS ABOVE THE TOP OF THE LA
+ YER
+ 0009 01 TWO OR MORE LAYERS AT DIFFERENT LEVELS
+ 0015 01 MISSING VALUE
+020018 0004 0000 01 INCREASING (U)
+ 0001 01 DECREASING (D)
+ 0002 01 NO DISTINCT CHANGE (N)
+ 0003 01 MISSING VALUE
+020021 0024 0001 01 PRECIPITATION-UNKNOWN TYPE
+ 0002 01 LIQUID PRECIPITATION NOT FREEZING
+ 0003 01 LIQUID FREEZING PRECIPITATION
+ 0004 01 DRIZZLE
+ 0005 01 RAIN
+ 0006 01 SOLID PRECIPITATION
+ 0007 01 SNOW
+ 0008 01 SNOW GRAINS
+ 0009 01 SNOW PELLETS
+ 0010 01 ICE PELLETS
+ 0011 01 ICE CRYSTALS
+ 0012 01 DIAMOND DUST
+ 0013 01 SMALL HAIL
+ 0014 01 HAIL
+ 0015 01 GLAZE
+ 0016 01 RIME
+ 0017 01 SOFT RIME
+ 0018 01 HARD RIME
+ 0019 01 CLEAR ICE
+ 0020 01 WET SNOW
+ 0021 01 HOAR FROST
+ 0022 01 DEW
+ 0023 01 WHITE DEW
+ 0030 01 ALL 30 MISSING VALUE
+020022 0007 0000 01 NO PRECIPITATION
+ 0001 01 CONTINUOUS
+ 0002 01 INTERMITTENT
+ 0003 01 SHOWER
+ 0004 01 NOT REACHING GROUND
+ 0005 01 DEPOSITION
+ 0015 01 MISSING VALUE
+020023 0012 0001 01 DUST/SAND WHIRL
+ 0002 01 SQUALLS
+ 0003 01 SAND STORM
+ 0004 01 DUST STORM
+ 0005 01 LIGHTNING - CLOUD TO SURFACE
+ 0006 01 LIGHTNING - CLOUD TO CLOUD
+ 0007 01 LIGHTNING - DISTANT
+ 0008 01 THUNDERSTORM
+ 0009 01 FUNNEL CLOUD NOT TOUCHING SURFACE
+ 0010 01 FUNNEL CLOUD TOUCHING SURFACE
+ 0011 01 SPRAY
+ 0012 01 WATER-SPOUT
+020024 0007 0000 01 NO PHENOMENA
+ 0001 01 LIGHT
+ 0002 01 MODERATE
+ 0003 01 HEAVY
+ 0004 01 VIOLENT
+ 0005 01 SEVERE (VAL)
+ 0007 01 MISSING VALUE
+020025 0011 0001 01 FOG
+ 0002 01 ICE FOG
+ 0003 01 STEAM FOG
+ 0007 01 MIST
+ 0008 01 HAZE
+ 0009 01 SMOKE
+ 0010 01 VOLCANIC ASH
+ 0011 01 DUST
+ 0012 01 SAND
+ 0013 01 SNOW
+ 0021 01 ALL 21 MISSING VALUE
+020026 0014 0000 01 NO CHANGE
+ 0001 01 SHALLOW
+ 0002 01 PATCHES
+ 0003 01 PARTIAL
+ 0004 01 FREEZING
+ 0005 01 LOW DRIFTING
+ 0006 01 BLOWING
+ 0007 01 INCREASING
+ 0008 01 DECREASING
+ 0009 01 IN SUSPENSION IN THE AIR
+ 0010 01 WALL
+ 0011 01 DENSE
+ 0012 01 WHITEOUT
+ 0015 01 MISSING VALUE
+020027 0007 0001 01 AT TIME OF OBSERVATION
+ 0002 01 IN PAST HOUR
+ 0003 01 IN TIME PERIOD FOR PAST WEATHER W1W2
+ 0004 01 IN TIME PERIOD SPECIFIED
+ 0006 01 BELOW STATION LEVEL
+ 0007 01 AT THE STATION
+ 0008 01 IN THE VICINITY
+020029 0004 0000 01 NO RAIN
+ 0001 01 RAIN
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020032 0006 0000 01 ICE NOT BUILDING UP
+ 0001 01 ICE BUILDING UP SLOWLY
+ 0002 01 ICE BUILDING UP QUICKLY
+ 0003 01 ICE MELTING OR BREAKING UP SLOWLY
+ 0004 01 ICE MELTING OR BREAKING UP RAPIDLY
+ 0007 01 MISSING VALUE
+020033 0004 0001 01 ICING FROM OCEAN SPRAY
+ 0002 01 ICING FROM FOG
+ 0003 01 ICING FROM RAIN
+ 0004 01 MISSING VALUE
+020034 0012 0000 01 NO SEA ICE IN SIGHT
+ 0001 02 SHIP IN OPEN LEAD MORE THAN 1.0 NAUTICAL MILE WIDE, OR SHIP
+ IN FAST ICE WITH BOUNDARY BEYOND LIMIT OF VISIBILITY
+ 0002 04 SEA ICE PRESENT IN CONCETRATION LESS THAN 3/10 (3/8), OPEN W
+ ATER OR VERY OPEN PACK ICE, SEA ICE CONCETRATION IS UNIFORM
+ IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL
+ MILE OF ICE EDGE
+ 0003 03 4/10 TO 6/10 (3/8 TO LESS THAN 6/8) ,OPEN PACK ICE, SEA ICE
+ CONCETRATION IS UNIFORM IN THE OBSERVATION AREA, SHIP IN ICE
+ OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0004 03 7/10 TO 8/10 (6/8 TO LESS THAN 7/8), CLOSE PACK ICE, SEA ICE
+ CONCETRATION IS UNIFORM IN THE OBSERVATION AREA, SHIP IN IC
+ E OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0005 04 9/10 OR MORE, BUT NOT 10/10 (7/8 TO LESS THAN 8/8), VERY CLO
+ SE PACK ICE, SEA ICE CONCETRATION IS UNIFORM IN THE OBSERVAT
+ ION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE EDG
+ E
+ 0006 03 STRIPS AND PATCHES OF PACK ICE WITH OPEN WATER BETWEEN, SEA
+ ICE CONCENTRATION IS NOT UNIFORM IN THE OBSERVATION AREA, SH
+ IP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0007 04 STRIPS AND PATCHES OF CLOSE OR VERY CLOSE PACK ICE WITH AREA
+ S OF LESSER CONCENTRATION BETWEEN, SEA ICE CONCETRATION IS N
+ OT UNIFORM IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.
+ 5 NAUTICAL MILE OF ICE EDGE
+ 0008 04 FAST ICE WITH OPEN WATER,VERY OPEN OR OPEN PACK ICE TO SEAWA
+ RD OF THE ICE BOUNDARY, SEA ICE CONCENTRATION IS NOT UNIFORM
+ IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL
+ MILE OF ICE EDGE
+ 0009 04 FAST ICE CLOSE OR VERY CLOSE PACK ICE TO SEAWARD OF THE ICE
+ BOUNDARY, SEA ICE CONCETRATION IS NOT UNIFORM IN THE OBSERVA
+ TION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE ED
+ GE
+ 0014 03 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY, O
+ R BECAUSE SHIP IS MORE THAN 0.5 NAUTICAL MILE AWAY FROM ICE
+ EDGE
+ 0015 01 MISSING VALUE
+020035 0012 0000 01 NO ICE OF LAND ORIGIN
+ 0001 01 1-5 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0002 01 6-10 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0003 01 11-20 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0004 01 UP TO AND INCLUDING 10 GROWLERS AND BERGY BITS - NO ICEBERGS
+ 0005 01 MORE THAN 10 GROWLERS AND BERGY BITS - NO ICEBERGS
+ 0006 01 1-5 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0007 01 6-10 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0008 01 11-20 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0009 02 MORE THAN 20 ICEBERGS,WITH GROWLERS AND BERGY BITS - A MAJOR
+ HAZARD TO NAVIGATION
+ 0014 02 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY OR
+ BECAUSE ONLY SEA ICE IS VISIBLE
+ 0015 01 MISSING VALUE
+020036 0012 0000 01 SHIP IN OPEN WATER WITH FLOATING ICE IN SIGHT
+ 0001 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS IMPROVING
+ 0002 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS NOT CHANGING
+ 0003 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS WORSENING
+ 0004 01 SHIP IN ICE DIFFICULT TO PENETRATE; CONDITIONS IMPROVING
+ 0005 01 SHIP IN ICE DIFFICULT TO PENETRATE; CONDITIONS NOT CHANGING
+ 0006 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE FORMING AND FLOES FREEZING TOGETHAR
+ 0007 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE UNDER SLIGHT PRESSURE
+ 0008 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE UNDER MODERATE OR SEVERE PRESSURE
+ 0009 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ SHIP BESET.
+ 0030 01 UNABLE TO REPORT, BECAUSE OF DARKNESS OR LACK OF VISIBILITY
+ 0031 01 MISSING VALUE
+020037 0012 0000 01 NEW ICE ONLY (FRAZIL ICE, GREASE ICE, SLUSH, SHUGA)
+ 0001 01 NILAS OR ICE RIND, LESS THAN 10 CM THICK
+ 0002 01 YOUNG ICE(GREY ICE, GREY-WHITE ICE
+ 0003 01 PREDOMINANTLY NEW AND/OR YOUNG ICE WITH SOME FIRST-YEAR ICE
+ 0004 02 PREDOMINANTLY THIN FIRST-YEAR ICE WITH SOME NEW AND/OR YOUNG
+ ICE
+ 0005 01 ALL THIN FIRST-YEAR ICE (30-70 CM THICK)
+ 0006 02 PREDOMINANTLY MEDIUM FIRST-YEAR ICE
+ (70-120 CM THICK) AND THICK FIRST-YEAR ICE (>120 CM
+ 0007 01 ALL MEDIUM AND THICK FIRST-YEAR ICE
+ 0008 02 PREDOMINANTLY MEDIUM AND THICK FIRST-YEAR ICE WITH SOME
+ OLD ICE (USUALLY MORE THAN 2 METRES THICK)
+ 0009 01 PREDOMINANTLY OLD ICE
+ 0030 03 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY OR
+ BECAUSE ONLY ICE OF LAND ORIGIN IS VISIBLE OR BECAUSE SHIP I
+ S MORE THAN 0.5 NAUTICAL MILE AWAY FROM ICE EDGE
+ 0031 01 MISSING VALUE
+020040 0009 0000 01 DRIFT SNOW ENDED BEFORE THE HOUR OF OBSERVATION
+ 0001 01 INTENSITY DIMINISHING
+ 0002 01 NO CHANGE
+ 0003 01 INTENSITY INCREASING
+ 0004 02 CONTINUES, APART FROM INTERRUPTION LASTING LESS THAN 30 MINU
+ TES
+ 0005 01 GENERAL DRIFT SNOW HAS BECOME DRIFT SNOW NEAR THE GROUND
+ 0006 01 DRIFT SNOW NEAR THE GROUND HAS BECOME GENERAL DRIFT SNOW
+ 0007 02 DRIFT SNOW HAS STARTED AGAIN AFTER AN INTERRUPTION OF MORE T
+ HAN 30 MINUTES
+ 0015 01 MISSING VALUE
+020041 0011 0000 01 NO ICING
+ 0001 01 LIGHT ICING
+ 0002 01 LIGHT ICING IN CLOUD
+ 0003 01 LIGHT ICING IN PRECIPITATION
+ 0004 01 MODERATE ICING
+ 0005 01 MODERATE ICING IN CLOUD
+ 0006 01 MODERATE ICING IN PRECIPITATION
+ 0007 01 SEVERE ICING
+ 0008 01 SEVERE ICING IN CLOUD
+ 0009 01 SEVERE ICING IN PRECIPITATION
+ 0015 01 MISSING VALUE
+020042 0004 0000 01 NO ICING
+ 0001 01 ICING PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020045 0004 0000 01 NO SLD CONDITIONS PRESENT
+ 0001 01 SLD CONDITIONS PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020050 0010 0000 01 RESERVED
+ 0001 01 1ST LOW CLOUD
+ 0002 01 2ND LOW CLOUD
+ 0003 01 3RD LOW CLOUD
+ 0004 01 1ST MEDIUM CLOUD
+ 0005 01 2ND MEDIUM CLOUD
+ 0006 01 3RD MEDIUM CLOUD
+ 0007 01 1ST HIGH CLOUD
+ 0008 01 2ND HIGH CLOUD
+ 0255 01 MISSING VALUE
+020055 0011 0000 01 CUMULUS, IF ANY, ARE QUITE SMALL
+ 0001 01 CUMULUS OF INTERMEDIATE SIZE
+ 0002 01 SWELLING CUMULUS
+ 0003 01 SWELLING CUMULUS WITH TOWERS
+ 0004 01 SWELLING CUMULUS WITH TOWERS HAVING PRONOUNCED TILT
+ 0005 01 TALL CUMULUS CONGESTUS
+ 0006 01 ISOLATED CUMULONIMBUS
+ 0007 01 NUMEROUS CUMULONIMBUS
+ 0008 01 CONTINUOUS DENSE MIDDLE CLOUDS
+ 0009 01 CONTINUOUS SHEETS OF MIDDLE CLOUDS
+ 0015 01 MISSING VALUE
+020056 0005 0000 01 UNKNOWN
+ 0001 01 WATER
+ 0002 01 ICE
+ 0003 01 MIXED
+ 0007 01 MISSING VALUE
+020062 0021 0000 02 SURFACE OF GROUND DRY (WITHOUT CRACKS AND NO APPRECIABLE
+ AMOUNT OF DUST OR LOOSE SAND)
+ 0001 01 SURFACE OF GROUND MOIST
+ 0002 02 SURFACE OF GROUND WET (STANDING WATER IN SMALL
+ OR LARGE POOLS ON SURFACE)
+ 0003 01 FLOODED WITHOUT SNOW
+ 0004 01 SURFACE OF GROUND FROZEN MEASURABLE ICE
+ 0005 01 GLAZE ON GROUND COVER
+ 0006 01 LOOSE DRY DUST OR SAND NOT COVERING GROUND COMPLETELY
+ 0007 02 THIN COVER OF LOOSE DRY DUST OR SAND COVERING GROUND COMPLET
+ ELY
+ 0008 02 MODERATE OR THICK COVER OF LOOSE DRY DUST OR SAND COVERING
+ GROUND COMPLETELY
+ 0009 01 EXTREMELY DRY WITH CRACKS
+ 0010 01 GROUND PREDOMINANTLY COVERED BY ICE
+ 0011 02 COMPACT OR WET SNOW (WITH OR WITHOUT ICE) COVERING LESS THAN
+ ONE-HALF OF THE GROUND
+ 0012 02 COMPACT OR WET SNOW (WITH OR WITHOUT ICE) COVERING AT LEAST
+ ONE-HALF OF THE GROUND BUT GROUND NOT COMPLETELY COVERED
+ 0013 01 EVEN LAYER OF COMPACT OR WET SNOW COVERING GROUND COMPLETELY
+ 0014 02 UNEVEN LAYER OF COMPACT OR WET SNOW COVERING GROUND
+ WITH SNOW OR COMPLETELY MEASURABLE ICE
+ 0015 02 LOOSE DRY SNOW COVERING LESS THAN ONE-HALF OF THE GROUND COV
+ ER
+ 0016 02 LOOSE DRY SNOW COVERING AT LEAST ONE-HALF OF THE
+ GROUND (BUT NOT COMPLETELY)
+ 0017 01 EVEN LAYER OF LOOSE DRY SNOW COVERING GROUND COMPLETELY
+ 0018 01 UNEVEN LAYER OF LOOSE DRY SNOW COVERING GROUND COMPLETELY
+ 0019 01 SNOW COVERING GROUND COMPLETELY; DEEP DRIFTS
+ 0031 01 MISSING VALUE
+020063 0001 0000 01 TO BE DEVELOPED
+020071 0011 0000 01 NO ASSESSMENT NO ASSESSMENT
+ 0001 01 LESS THAN 50 KM LESS THAN 1 PER SECOND
+ 0002 01 BETWEEN 50 AND 200 KM LESS THAN 1 PER SECOND
+ 0003 01 MORE THAN 200 KM LESS THAN 1 PER SECOND
+ 0004 01 LESS THAN 50 KM 1 OR MORE PER SECOND
+ 0005 01 BETWEEN 50 AND 200 KM 1 OR MORE PER SECOND
+ 0006 01 MORE THAN 200 KM 1 OR MORE PER SECOND
+ 0007 02 LESS THANK 50 KM RATE SO RAPID NUMBER CANNOT BE COUN
+ TED
+ 0008 02 BETWEEN 50 AND 200 KM RATE SO RAPID NUMBER CANNOT BE COUN
+ TED
+ 0009 02 MORE THAN 200 KM RATE SO RAPID NUMBER CANNOT BE COUN
+ TED
+ 0015 01 MISSING VALUE
+020086 0008 0000 01 CLEAR AND DRY
+ 0001 01 DAMP
+ 0005 01 WET SNOW
+ 0006 01 SLUSH
+ 0007 01 ICE
+ 0008 01 COMPACTED OR ROLLED SNOW
+ 0009 01 FROZEN RUTS OR RIDGES
+ 0015 01 MISSING VALUE
+020090 0007 0000 01 RESERVED
+ 0001 01 NACREOUS CLOUDS
+ 0002 01 NOCTILUCENT CLOUDS
+ 0003 01 CLOUDS FROM WATERFALLS
+ 0004 01 CLOUDS FROM FIRES
+ 0005 01 CLOUDS FROM VULCANIC ERUPTIONS
+ 0015 01 MISSING VALUE
+020101 0010 0001 01 SCHISTOCERCA GREGARIA
+ 0002 01 LOCUSTA MIGRATORIA
+ 0003 01 NOMADACRIS SEPTEMFASCIATA
+ 0004 01 OEDALEUS SENAGALENSIS
+ 0005 01 ANRACRIDIUM SPP
+ 0006 01 OTHER LOCUST
+ 0007 01 OTHER GRASSHOPPERS
+ 0008 01 ITHER CRICKETS
+ 0009 01 SPODOPTERA EXEMPTA
+ 0015 01 MISSING VALUE
+020102 0011 0000 01 GREEN
+ 0001 01 GREEN AND BLACK
+ 0002 01 BLACK
+ 0003 01 YELLOW AND BLACK
+ 0004 01 STRAW/GREY
+ 0005 01 PINK
+ 0006 01 DARK RED/BROWN
+ 0007 01 MIXED RED AND YELLOW
+ 0008 01 YELLOW
+ 0009 01 OTHER
+ 0015 01 MISSING VALUE
+020151 0003 0000 01 FIRST YEAR ICE
+ 0001 01 MULTI YEAR ICE
+ 0007 01 MISSING
+020252 0003 0000 01 NO EDGE
+ 0001 01 EDGE PRESENT
+ 0007 01 MISSING
+020253 0008 0000 01 LAND
+ 0001 01 VEGETATION COVERED LAND
+ 0002 01 RESERVED
+ 0003 01 ICE
+ 0004 01 POSSIBLE ICE
+ 0005 01 OCEAN
+ 0006 01 COAST
+ 0007 01 MISSING
+021066 0011 0001 01 PROCESSING EQUIPMENT NOT WORKING
+ 0002 01 EQUIPMENT FAILED
+ 0003 01 PRF CODE CHANGED DURING IMAGE GENERATION
+ 0004 01 SAMPLINH WINDOW CHANGED DURING IMAGE GENERATION
+ 0005 01 GAIN CHANGED DURING IMAGE GENERATION
+ 0006 01 CHIRP REPLICA EXCEEDS SPECIFIC VALUE
+ 0007 02 INPUT DATA MEAN AND STANDARD DEVIATION OF IN-PHASE AND
+ QUADRATURE OUT OF RANGE
+ 0008 01 DOPPLER CENTROID CONFIDENCE > MMCC VALUE
+ 0009 01 DOPPLER CENTROID ABSOLUTE VALUE > PRF/2
+ 0010 01 DOPPLER AMBIGUITY CONFIDENCE < MMCC VALUE
+ 0011 01 OUTPUT DATA MEAN AND STANDARD DEVIATION =< MMCC VALUE
+021067 0012 0001 01 NO FOREBEAM CALCULATION
+ 0002 01 NO MIDBEAM CALCULATION
+ 0003 01 NO AFTBEAM CALCULATION
+ 0004 01 FOREBEAM ARCING DETECTED
+ 0005 01 MID ARCING DETECTED
+ 0006 01 AFTBEAM ARCING DETECTED
+ 0007 01 ANY BEAM NOISE CONTENT ABOVE OR EQUAL TO TRESHOLD
+ 0008 01 LAND (ANY LAND IN CELL FOOTPRINT)
+ 0009 01 AUTONOMOUS AMBIGUITY REMOVAL NOT USED
+ 0010 01 METEOROLOGICAL BACKGROUND NOT USED
+ 0011 01 MINIMUM RESIDUAL EXCEEDED TRESHOLD
+ 0012 01 FRAME CHECKSUM ERROR DETECTED
+021068 0007 0001 01 STANDARD DEVIATION OF WIND SPEED OUTSIDE MMCC LIMIT
+ 0002 02 STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT OUTSIDE MMCC L
+ IMIT
+ 0003 01 STANDARD DEVIATION OF ALTITUDE OUTSIDE MMCC LIMIT
+ 0004 01 MEAN PEAKINESS OUTSIDE MMCC LIMIT
+ 0005 01 FRAME CHECKSUM ERROR DETECTED
+ 0006 01 HEIGHT-TIME LOOP TIME CONSTANT CORRECTION NOT PERFORMED
+ 0007 01 NOT ENOUGH MEASUREMENTS ( N< 10)
+021069 0009 0001 01 12.0 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0002 01 11.0 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0003 01 3.7 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0004 01 1.6 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0005 02 CLOUD IDENTIFICATION USED 1.6 MICROMETERS
+ HISTOGRAM REFLECTANCE CLOUD TEST
+ 0006 02 1.6 MICROMETERS HISTOGRAM REFLECTANCE CLOUD
+ TEST USED DYNAMIC TRESHOLD
+ 0007 01 SUN GLINT DETECTED BY 1.6 MICROMETERS REFLECTANCE CLOUD TEST
+ 0008 01 3.7 MICROMETERS USED IN SEA-SURFACE TEMPERATURE RETRIEVAL
+ 0009 02 SEA-SURFACE TEMPERATURE DERIVATION USED DAYTIME DATA
+ (NIGHT-TIME IF ZERO)
+021070 0024 0001 01 CELL 1:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0002 02 CELL 2:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL CELL NUMB
+ ERING
+ 0003 01 CELL 3:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0004 01 CELL 4:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL NW NE
+ 0005 01 CELL 5:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 7 8 9
+ 0006 01 CELL 6:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 4 5 6
+ 0007 01 CELL 7:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 1 2 3
+ 0008 01 CELL 8:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL SW SE
+ 0009 01 CELL 9:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0010 02 -18 DUAL VIEW SST RETRIEVAL USED 3.7 MICRON CHANNEL (ONE BIT
+ PER 10-ARCMIN CELL)
+ 0011 01 CELL 1:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0011 02 CELL 2:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL CELL NUMB
+ ERING
+ 0012 01 CELL 3:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0013 01 CELL 4:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL NW NE
+ 0014 01 CELL 5:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 7 8 9
+ 0015 01 CELL 6:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 4 5 6
+ 0016 01 CELL 7:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 1 2 3
+ 0017 01 CELL 8:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL SW SE
+ 0018 01 CELL 9:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0019 01 NADIR VIEW CONTAINS DAY-TIME DATA (NIGHT IF ZERO)
+ 0020 01 FORWARD VIEW CONTAINS DAY-TIME DATA (NIGHT IF ZERO)
+ 0021 02 RECORD CONTAINS CONTRIBUTIONS FROM INSTRUMENT SCANS ACQUIRED
+ WHEN ERS PLATFORM NOT IN YAW-STEERING MODE
+ 0022 02 RECORD CONTAINS CONTRIBUTIONS FROM INSTRUMENT SCANS FOR WHIC
+ H PRODUCT CONFIDENCE DATA SHOW QUALITY IS POOR OR UNKNOWN
+ 0023 01 MISSING VALUE
+021072 0003 0001 02 HEIGHT ERROR CORRECTION APPLIED INSTEAD OF OPEN LOOP CALIBRA
+ TION
+ 0002 01 MICROWAVE SOUNDER USED FOR TROPOSPHERE CORRECTION
+ 0003 02 AGC OUTPUT CORRECTION APPLIED INSTED OF OPEN LOOP CALIBRATIO
+ N
+021073 0008 0001 01 BLANK DATA RECORD
+ 0002 01 TEST
+ 0003 01 CALIBRATION (CLOSED LOOP)
+ 0004 01 BITE
+ 0005 01 ACQUISITION ON ICE
+ 0006 01 ACQUISITION ON OCEAN
+ 0007 01 TRACKING ON ICE
+ 0008 01 TRACKING ON OCEAN
+021076 0004 0000 01 LINEAR
+ 0001 01 LOGARITHMIC (BASE E)
+ 0002 01 LOGARITHMIC (BASE 10)
+ 0007 01 MISSING VALUE
+021109 0008 0001 01 NOT ENOUGH GOOD SIGMA-0 AVAILABLE FOR WIND RETRIEVAL
+ 0002 01 POOR AZIMUTH DIVERSITY AMONG SIGMA0- FOR WIND RETRIEVAL
+ 0008 01 SOME PORTION OF WIND VECTOR CELL IS OVER LAND
+ 0009 01 SOME PORTION OF WIND VECTOR CELL IS OVER ICE
+ 0010 01 WIND RETRIEVAL NOT PERFORMED FOR WIND VECTOR CELL
+ 0011 01 REPORTED WIND SPEED IS GREATER THAN 30 M/S
+ 0012 01 REPORTED WIND SPEED IS LESS THAN OR EQUAL TO 3 M/S
+ 0017 01 MISSING VALUE
+021115 0011 0001 01 SIGMA-0 MEASUREMENT IS NOT USABLE
+ 0002 01 SIGNAL TO NOISE RATIO IS LOW
+ 0003 01 SIGMA-0 IS NEGATIVE
+ 0004 01 SIGMA-0 IS OUTSIDE OF ACCEPTABLE RANGE
+ 0005 01 SCATTEROMETER PULSE QUALITY IS NOT ACCEPTABLE
+ 0006 01 SIGMA-0 CELL LOCATION ALGORITHM DOES NOT CONVERGE
+ 0007 01 FREQUENCY SHIFT LIES BEYOND THE RANGE OF THE X FACTOR TABLE
+ 0008 02 SPACECRAFT TEMPERATURE IS BEYOND CALIBRATION COEFFICIENT RAN
+ GE
+ 0009 01 NO APPLICABLE ATTITUDE RECORDS WERE FOUND FOR THIS SIGMA-0
+ 0010 02 INTERPOLATED EPHEMERIS DATA ARE NOT ACCEPTABLE FOR THIS SIGM
+ A-0
+ 0017 01 MISSING VALUE
+021116 0016 0001 01 CALIBRATION/MEASUREMENT PULSE FLAG (1)
+ 0002 01 CALIBRATION/MEASUREMENT PULSE FLAG (2)
+ 0003 01 OUTER ANTENNA BEAM
+ 0004 01 SIGMA-0 CELL IS AFT OF SPACECRAFT
+ 0005 01 CURRENT MODE (1)
+ 0006 01 CURRENT MODE (2)
+ 0007 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (1)
+ 0008 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (2)
+ 0009 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (3)
+ 0010 01 LOW RESOLUTION MODE - WHOLE PULSE DATA
+ 0011 01 SCATTEROMETER ELECTRONIC SUBSYSTEM B
+ 0012 01 ALTERNATE SPIN RATE - 19.8 RPM
+ 0013 01 RECEIVER PROTECTION ON
+ 0014 01 SLICES PER COMPOSITE FLAG (1)
+ 0015 01 SLICES PER COMPOSITE FLAG (2)
+ 0016 01 SLICES PER COMPOSITE FLAG (3)
+021119 0014 0000 01 RESERVED
+ 0001 01 SASS
+ 0002 01 SASS2
+ 0003 01 NSCAT0
+ 0004 01 NSCAT1
+ 0005 01 NSCAT2
+ 0006 01 QSCAT0
+ 0007 01 QSCAT1
+ 0031 01 CMOD1
+ 0032 01 CMOD2
+ 0033 01 CMOD3
+ 0034 01 CMOD4
+ 0035 01 CMOD5
+ 0064 01 MISSING VALUE
+021144 0001 0001 01 RAIN
+021150 0004 0000 01 DATA FROM SINGLE GROUND STATION (NO CO-LOCATION)
+ 0001 01 DATA FROM MULTIPLE GROUND STATION (CO-LOCATED DATA)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021155 0016 0001 01 NOT ENOUGH GOOD SIGMA-0 AVAILABLE FOR WIND RETRIEVAL
+ 0002 01 POOR AZIMUTH DIVERSITY AMONG SIGMA-0 FOR WIND RETRIEVAL
+ 0003 01 ANY BEAM NOISE CONTENT ABOVE TRESHOLD
+ 0004 01 PRODUCT MONITORING NOT USED
+ 0005 01 PRODUCT MONITORING FLAG
+ 0006 01 KNMI QUALITY CONTROL FAILS
+ 0007 01 VARIATIONAL QUALITY CONTROL FAILS
+ 0008 01 SOME PORTION OF WIND VECTOR CELL IS OVER LAND
+ 0009 01 SOME PORTION OF WIND VECTOR CELL IS OVER ICE
+ 0010 01 WIND RETRIEVAL NOT PERFORMED FOR WIND VECTOR CELL
+ 0011 01 REPORTED WIND SPEED IS GREATER THAN 30 M/S
+ 0012 01 REPORTED WIND SPEED IS LESS THAN OR EQUAL TO 3 M/S
+ 0013 01 RAIN FLAG FOR THE WIND VECTOR CELL IS NOT USABLE
+ 0014 01 RAIN FLAG ALGORITHM DETECTS RAIN
+ 0015 01 NO METEOROLOGICAL BACKGROUND USED
+ 0016 01 DATA ARE REDUNDANT
+021158 0004 0000 01 ACCEPTABLE
+ 0001 01 NOT ACCEPTABLE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021159 0004 0000 01 GOOD
+ 0001 01 USABLE
+ 0002 01 BAD
+ 0003 01 MISSING VALUE
+021169 0004 0000 01 NO ICE PRESENT
+ 0001 01 ICE PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021196 0012 0001 01 PROCESSING EQUIPMENT NOT WORKING
+ 0002 01 EQUIPMENT FAILED
+ 0003 01 PRF CODE CHANGED DURING IMAGE GENERATION
+ 0004 01 SAMPLING WINDOW CHANGED DURING IMAGE GENERATION
+ 0005 01 GAIN CHANGED DURING IMAGE GENERATION
+ 0006 01 CHIRP REPLICA EXCEEDS SPECIFIED VALUE
+ 0007 02 INPUT DATA MEAN AND STANDARD DEVIATION OF I AND Q OUT OF RAN
+ GE
+ 0008 01 DOPPLER CENTROID CONFIDENCE > MMCC VALUE
+ 0009 01 DOPPLER CENTROID ABSOLUTE VCALUE > PRF/2
+ 0010 01 DOPPLER AMBIGUITY CONFIDENCE < MMCC VALUE
+ 0011 01 OUTPUT DATA MEAN AND STANDARD DEVIATION <= MMCC VALUE
+ 0012 01 MISSING VALUE
+021199 0007 0001 01 3.7 MICRO CHANNEL USED IN ASST DERIVATION
+ 0002 01 ASST DERIVATION USED DATTIME DATA
+ 0003 02 COMPARISON OF ASST AGAINST PREVIOUS
+ EQUIVALENT PASS PERFORMED
+ 0004 02 COMPARISON OF ASST AGAINST WEEKLY AVERAGE
+ OF ASST PERFORMED
+ 0005 01
+ 0006 02 COMPARISON OF RATE OF CHANGE OF ASST AGAINST
+ STATIC TRESHOLD PERFORMED
+ 0007 01 MISSING VALUE
+022056 0004 0000 01 UPWARDS PROFILE
+ 0001 01 DOWNWARDS PROFILE
+ 0002 01 HORIZONTAL
+ 0003 01 MISSING VALUE
+022060 0004 0000 01 DROGUE IS DETACHED
+ 0001 01 DROGUE IS ATTACHED
+ 0002 01 DROGUE STATUS UNKNOWN
+ 0007 01 MISSING VALUE
+022061 0011 0000 01 CALM (GLASSY) HEIGHT 0 M
+ 0001 01 CALM (RIPPLED) HEIGHT 0 - 0.1 M
+ 0002 01 SMOOTH (WAVELETS) HEIGHT 0.1 - 0.5 M
+ 0003 01 SLIGHT HEIGHT 0.5 - 1.5 M
+ 0004 01 MODERATE HEIGHT 1.25 - 2.5 M
+ 0005 01 ROUGH HEIGHT 2.5 - 4 M
+ 0006 01 VERY ROUGH HEIGHT 4 - 6 M
+ 0007 01 HIGH HEIGHT 6 - 9 M
+ 0008 01 VERY HIGH HEIGHT 9 -14 M
+ 0009 01 PHENOMANAL HEIGHT OVER 14 M
+ 0015 01 MISSING VALUE
+022067 0001 0000 01 SEE COMMON CODE TABLE C3
+022068 0001 0000 01 SEE COMMON CODE TABLE C4
+022120 0013 0000 01 GOOD DATA
+ 0001 01 MAXIMUM (HIGH) WATER LEVEL LIMIT EXCEEDED
+ 0002 01 MINIMUM (LOW) WATER LEVEL LIMIT EXCEEDED
+ 0003 01 RATE OF CHANGE LIMIT FOR WATER LEVEL EXCEEDED
+ 0004 01 FLAT LIMIT FOR WATER LEVEL EXCEEDED
+ 0005 01 OBSERVED MINUS PREDICTED WATER LEVEL VALUE LIMIT EXCEEDED
+ 0006 02 OBSERVED VALUE FROM PRIMARY WATER LEVEL SENSOR MINUS
+ BACKUP WATER LEVEL SENSOR
+ 0007 01 VALUE EXCEEDED SPECIFIED TOLERANCE FROM EXPECTED VALUE
+ 0008 02 WATER LEVEL QA PARAMETER (SIGMAS AND/OR OUTLIERS) LIMITS EXC
+ EEDED
+ 0009 01 SEA TEMPERATURE OUTSIDE OF EXPECTED RANGE
+ 0010 01 MULTIPLE QC CHECKS (ABOVE) FAILED
+ 0011 01 NO AUTOMATED WATER LEVEL CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022121 0009 0000 01 OPERATIONAL
+ 0001 02 POSSIBLE CLOGGING PROBLEM OR OTHERWISE DEGRADED WATE LEVEL D
+ ATA
+ 0002 01 POSSIBLE DATUM SHIFT
+ 0003 01 UNKNOWN STATUS OF WATER LEVEL SENSOR
+ 0004 01 SUSPECTED OR KNOWN SEA TEMPERATURE SENSOR PROBLEM
+ 0005 01 MULTIPLE POSSIBLE PROBLEMS (ABOVE)
+ 0006 01 BAD DATA- DO NOT DISSEMINATE
+ 0007 01 NO MANUAL WATER LEVEL CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022122 0008 0000 01 GOOD DATA FROM ALL SENSORS
+ 0001 01 WIND DIRECTION OUTSIDE OF ALLOWABLE RANGE
+ 0002 01 WIND SPEED OUTSIDE OF EXPECTED RANGE
+ 0003 01 BAROMETRIC PRESSURE OUTSIDE OF EXPECTED RANGE
+ 0004 01 AIR TEMPERATURE OUTSIDE OF EXPECTED RANGE
+ 0005 01 MULTIPLE SENSOR FAILED QC CHECKS
+ 0006 01 NO AUTOMATED METEOROLOGICAL DATA CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022123 0009 0000 01 OPERATIONAL
+ 0001 01 SUSPECTED OR KNOWN PROBLEM WITH WIND SENSOR
+ 0002 01 SUSPECTED OR KNOWN PROBLEM WITH BAROMETRIC PRESSURE SENSOR
+ 0003 01 SUSPECTED OR KNOWN PROBLEM WITH AIR TEMPERATURE SENSOR
+ 0004 01 UNKNOWN STATUS OF ALL SENSORS
+ 0005 01 SUSPECTED OR KNOWN PROBLEMS WITH MULTIPLE SENSORS
+ 0006 01 BAD DATA - DO NOT DISSEMINATE
+ 0007 01 NO MANUAL METEOROLOGICAL DATA CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022252 0006 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND
+ PASSED
+ 0002 02 AUTOMATIC QUALITY CONTROL PASSED AND MAGNOLIA CHECKED AND
+ DELETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND
+ FAILED
+ 0005 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND
+ RE-INSERTED
+023001 0005 0000 01 RESERVED
+ 0001 01 ARTICLES 1 AND 2
+ 0002 01 ARTICLE 3
+ 0003 01 ARTICLE 5.2
+ 0007 01 MISSING VALUE
+023002 0016 0000 01 RESERVED
+ 0001 01 NUCLEAR REACTOR ON GROUND
+ 0002 01 NUCLEAR REACTOR ON SEA
+ 0003 01 NUCLEAR REACTOR IN SPACE
+ 0004 01 NUCLEAR FULE FACILITY
+ 0005 01 RADIOACTIVE WASTE MANAGMENT FACITILY
+ 0006 01 TRANSPORT OF NUCLEAR FUEL OR RADIOACTIVE WASTE
+ 0007 01 STORAGE OF NUCLEAR FUEL OR RADIOACTIVE WASTE
+ 0008 01 MANUFACTURE OF RADIO-ISOTOPES
+ 0009 01 USE OF RADIO-ISOTOPES
+ 0010 01 STORAGE OF RADIO-ISOTOPES
+ 0011 01 DISPOSAL OF RADIO-ISOTOPS
+ 0012 01 TRANSPORT OF RADIO-ISOTOPES
+ 0013 01 USE OF RADIO-ISOTOPES FOR POWER GENERATION
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+023003 0008 0000 01 NO RELEASE
+ 0001 01 RELEASE TO ATMOSPHERE
+ 0002 01 RELEASE TO WATER
+ 0003 01 RELEASE TO BOTH ATMOSPHERE AND WATER
+ 0004 01 EXPECTED RELEASE TO ATMOSPHERE
+ 0005 01 EXPECTED RELEASE TO WATER
+ 0006 01 EXPECTED RELEASE TO BOTH ATMOSPHERE AND WATER
+ 0007 01 MISSING VALUE
+023004 0006 0000 01 NO COUNTERMEASURE
+ 0001 01 EVACUATION
+ 0002 01 SHELTERING
+ 0003 01 PROPHILAXIS
+ 0004 01 WATER
+ 0007 01 MISSING VALUE
+023005 0004 0000 01 INCIDENT STAT DOES NOT UNDERSTAND WHAT HAPPENED
+ 0001 01 INCIDENT STATE KNOWS THE CAUSE OF THE INCIDENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023006 0008 0000 01 NO IMPROVEMENT
+ 0001 01 UNSTABLE
+ 0002 01 NO DETERIORATION
+ 0003 01 IMPROVING
+ 0004 01 STABLE
+ 0005 01 DETERIORATING
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+023007 0005 0000 01 NO RELEASE
+ 0001 01 RELEASE HAS STOPPED
+ 0002 01 RELEASE
+ 0003 01 RELEASE IS CONTINUING
+ 0007 01 MISSING VALUE
+023008 0004 0000 01 GASEUS
+ 0001 01 PARTICULATE
+ 0002 01 MIXTURE OF GASEUS AND PARTICULATE
+ 0003 01 MISSING VALUE
+023009 0004 0000 01 GASEUS
+ 0001 01 PARTICULATE
+ 0002 01 MIXTURE OF GASEUS AND PARTICULATE
+ 0003 01 MISSING VALUE
+023016 0004 0000 01 NO SIGNIFICANT TOXIC HEALTH EFFECT
+ 0001 01 SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT POSSIBLE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023018 0006 0000 01 RELEASE NO LONGER OCCURRING
+ 0001 01 RELEASE STILL OCCURRING
+ 0002 01 RELEASE EXPECTED TO INCREASE IN NEXT SIX HOURS
+ 0003 01 RELEASE EXPECTED TO REMAIN CONSTANT IN NEXT SIX HOURS
+ 0004 01 RELEASE EXPECTED TO DECREASE IN NEXT SIX HOURS
+ 0007 01 MISSING VALUE
+023031 0004 0000 01 PLUME WILL NOT ENCOUNTER RAIN IN INCIDENT STATE
+ 0001 01 PLUME WILL ENCOUNTER RAIN IN INCIDENT STATE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023032 0004 0000 01 NO SIGNIFICANT CHANGE EXPECTED WITHIN NEXT SIX HOURS
+ 0001 02 ANTICIPATED SIGNIFICANT CHANGE EXPECTED WITHIN NEXT SIX HOUR
+ S
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+024003 0005 0000 01 NOBLE GASES
+ 0001 01 IODINES
+ 0002 01 CAESIUM
+ 0003 01 TRANSURANICS
+ 0031 01 MISSING VALUE
+025004 0004 0000 01 INCOHERENT
+ 0001 01 COHERENT (DOPPLER)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025005 0004 0000 01 LOGATITHM - 2.5 DB
+ 0001 01 LINEAR
+ 0002 01 SPECIAL
+ 0003 01 MISSING VALUE
+025006 0005 0000 01 ZH TO R CONVERSION
+ 0001 01 (ZH, ZDR) TO (NO.DO) TO R
+ 0002 01 (Z(F1),Z(F2)) TO ATTENUATION TO R
+ 0006 01 OTHER
+ 0007 01 MISSING VALUE
+025009 0004 0001 01 NONE
+ 0002 01 CALIBRATION TARGET OR SIGNAL
+ 0003 01 AGAINST RAINGAGES
+ 0004 01 AGAINST OTHER INSTRUMENTS (DISTROMETER-ATTENUATION)
+025010 0008 0000 01 NONE
+ 0001 01 MAP
+ 0002 01 INSERTION OF HIGHER ELEVATION DATA AND MAP
+ 0003 01 ANALYSIS OF FLUCTUATING LOGARITHM SIGNAL (CLUTTER DETECTION)
+ 0004 02 EXTRACTION OF FLUCTUATING PART OF LINEAR SIGNAL (CLUTTER SUP
+ PRESSION)
+ 0005 01 CLUTTER SUPPRESSION DOPPLER
+ 0006 01 MULTIPARAMETER ANALYSIS
+ 0015 01 MISSING VALUE
+025011 0004 0000 01 NONE
+ 0001 01 MAP OF CORRECTION FACTORS
+ 0002 01 INTERPOLATION (AZIMUTH OR ELEVATION)
+ 0003 01 MISSING VALUE
+025012 0004 0000 01 HARDWARE
+ 0001 01 SOFTWARE
+ 0002 01 HARDWARE AND SOFTWARE
+ 0003 01 MISSING VALUE
+025013 0001 0001 01 BRIGHT BAND CORRECTION
+025015 0001 0001 01 RADOME ATTENUATION CORRECTION
+025017 0001 0001 01 PRECIPITATION ATTENUATION CORRECTION
+025020 0004 0000 01 FTT (FAST FOURIER TRANSFORM
+ 0001 01 PPP (PULSE PAIR PROCESSING
+ 0002 01 VPC (VECTOR-PHASE CHANGE)
+ 0003 01 MISSING VALUE
+025021 0005 0001 01 SIMPLE AVERAGE
+ 0002 01 CONSENSUS AVERAGE
+ 0003 01 MEDIAN CHECK
+ 0004 01 VERTICAL CONSISTENCY CHECK
+ 0005 01 OTHER
+025030 0004 0000 02 RUNNING MEAN SEA-SURFACE TEMPERATURE NOT USED BECAUSE USAGE
+ CRITERIA NOT MET
+ 0001 02 RUNNING MEAN SEA-SURFACE TEMPERATURE NOT USED BECAUSE DATA N
+ OT AVAILABLE
+ 0002 01 RUNNING MEAN SEA-SURFACE TEMPERATURE USED AS PREDICTOR
+ 0003 01 MISSING VALUE
+025032 0004 0000 01 RESERVED
+ 0001 01 DATA FROM LOW MODE
+ 0002 01 DATA FROM HIGH MODE
+ 0003 01 MISSING VALUE
+025033 0004 0000 01 WIND PROFILER OPERATING IN SUBMODE A
+ 0001 01 WIND PROFILER OPERATING IN SUBMODE B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025034 0003 0001 01 TEST A PERFORMED AND FAILED
+ 0002 01 TEST B PERFORMED AND FAILED
+ 0003 01 TEST RESULTS INCONCLUSIVE
+025036 0004 0000 02 NETWORK OF SEVERAL DIRECTION-FINDERS OPERATING ON
+ THE SAME INDIVIDUAL ATMOSPHERICS
+ 0001 02 NETWORK OF SEVERAL ARRIVAL-TIME STATIONS OPERATING ON
+ THE SAME INDIVIDUAL ATMOSPHERICS
+ 0006 01 SINGLE STATION RANGE BEARING TECHNIQUE
+ 0015 01 MISSING VALUE
+025040 0010 0000 01 NON-SPECIFIC MODE
+ 0001 01 FIRST GUESS DATA
+ 0002 01 CLOUD DATA
+ 0003 01 AVERAGE VECTOR DATA
+ 0004 01 PRIMARY DATA
+ 0005 01 GUESS DATA
+ 0006 01 VECTOR DATA
+ 0007 01 TRACER DATA; THE IMAGE
+ 0008 01 TRACER DATA TO NEXT IMAGE
+ 0015 01 MISSING VALUE
+025041 0004 0000 01 DIRECTION ORIGINALLY REPORTED IN TRUE DEGREES
+ 0001 01 DIRECTION ORIGINALLY REPORTED USING CODE TABLE 0700, FM 13
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025042 0004 0000 01 SPEED ORIGINALLY REPORTED IN METERS PER SECOND
+ 0001 01 SPEED ORIGINALLY REPORTED USING CODE TABLE 2251, FM 13
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025045 0020 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+ 0007 01 CHANNEL 7 PRESENT - (SET TO 1 PRESENT)
+ 0008 01 CHANNEL 8 PRESENT - (SET TO 1 PRESENT)
+ 0009 01 CHANNEL 9 PRESENT - (SET TO 1 PRESENT)
+ 0010 01 CHANNEL 10 PRESENT - (SET TO 1 PRESENT)
+ 0011 01 CHANNEL 11 PRESENT - (SET TO 1 PRESENT)
+ 0012 01 CHANNEL 12 PRESENT - (SET TO 1 PRESENT)
+ 0013 01 CHANNEL 13 PRESENT - (SET TO 1 PRESENT)
+ 0014 01 CHANNEL 14 PRESENT - (SET TO 1 PRESENT)
+ 0015 01 CHANNEL 15 PRESENT - (SET TO 1 PRESENT)
+ 0016 01 CHANNEL 16 PRESENT - (SET TO 1 PRESENT)
+ 0017 01 CHANNEL 17 PRESENT - (SET TO 1 PRESENT)
+ 0018 01 CHANNEL 18 PRESENT - (SET TO 1 PRESENT)
+ 0019 01 CHANNEL 19 PRESENT - (SET TO 1 PRESENT)
+ 0020 01 CHANNEL 20 PRESENT - (SET TO 1 PRESENT)
+025046 0004 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+025047 0003 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+025048 0015 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+ 0007 01 CHANNEL 7 PRESENT - (SET TO 1 PRESENT)
+ 0008 01 CHANNEL 8 PRESENT - (SET TO 1 PRESENT)
+ 0009 01 CHANNEL 9 PRESENT - (SET TO 1 PRESENT)
+ 0010 01 CHANNEL 10 PRESENT - (SET TO 1 PRESENT)
+ 0011 01 CHANNEL 11 PRESENT - (SET TO 1 PRESENT)
+ 0012 01 CHANNEL 12 PRESENT - (SET TO 1 PRESENT)
+ 0013 01 CHANNEL 13 PRESENT - (SET TO 1 PRESENT)
+ 0014 01 CHANNEL 14 PRESENT - (SET TO 1 PRESENT)
+ 0015 01 CHANNEL 15 PRESENT - (SET TO 1 PRESENT)
+025049 0005 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+025051 0006 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+025053 0006 0001 01 GOOD
+ 0002 01 REDUNDANT
+ 0003 01 QUESTIONABLE
+ 0004 01 BAD
+ 0005 01 EXPERIMENTAL
+ 0006 01 PRECIPITATING
+025069 0007 0001 01 SMOOTHED
+ 0002 01 BASELINE ADJUSTED
+ 0003 01 NORMALIZED TIME INTERVAL
+ 0004 01 OUTLIER CHECKED
+ 0005 01 PLAUSIBILITY CHECKED
+ 0006 01 CONSISTENCY CHECKED
+ 0007 01 INTERPOLATED
+025086 0004 0000 01 DEPTHS ARE NOT CORRECTED
+ 0001 01 DEPTHS ARE CORRECTED
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025093 0003 0001 01 NO CORRECTION
+ 0002 01 VERTICAL VELOCITY CORRECTION
+ 0007 01 ALL CORRECTIONS
+025095 0001 0001 02 ALTIMETER OPERATING (SET TO 0 IF NOMINAL, SET TO
+ BACKUP)
+025096 0004 0001 01 MODE INDICATOR (0 IF MODE 2, 1 IF MODE 1)
+ 0002 03 MODE 1 CALIBRATION SEQUENCE INDICATOR (0 IF NORMAL DATA TAKI
+ NG EITHER MODE 1 OR 2, 1 IF MODE 1 CALIBRATION SEQUENCE) BIT
+ S 3 AND 4 INDICATE ACTIVE 23.8 GHZ CHANNEL
+ 0003 01 CHANNEL 2 (0 IF ON, 1 IF OFF)
+ 0004 01 CHANNEL 3 (0 IF ON, 1 IF OFF)
+025097 0011 0000 01 RANGES BETWEEN 0 AND 30 CM
+ 0001 01 RANGES BETWEEN 30 AND 60 CM
+ 0002 01 RANGES BETWEEN 60 AND 90 CM
+ 0003 01 RANGES BETWEEN 90 AND 120 CM
+ 0004 01 RANGES BETWEEN 120 AND 150 CM
+ 0005 01 RANGES BETWEEN 150 AND 180 CM
+ 0006 01 RANGES BETWEEN 180 AND 210 CM
+ 0007 01 RANGES BETWEEN 210 AND 240 CM
+ 0008 01 RANGES BETWEEN 240 AND 270 CM
+ 0009 01 RANGES LARGER THAN 270 CM
+ 0015 01 MISSING VALUE
+025098 0008 0001 01 KU BAND RANGE
+ 0002 01 C BAND RANGE
+ 0003 01 KU BAND SWH
+ 0004 01 C BAND SWH
+ 0005 01 KU BAND SCATTEROMETER COEFFICIENT
+ 0006 01 C BAND SCATTEROMETER COEFFICIENT
+ 0007 01 OFF NADIR ANGLE FROM KU BAND WVEFORM PARAMETERS
+ 0008 01 OFF NADIR FROM PLATFORM
+025099 0006 0001 01 KU BAND RANGE INSTRUMENTAL CORRECTION
+ 0002 01 C BAND RANGE INSTRUMENTAL CORRECTION
+ 0003 01 KU BAND SWH INSTRUMENTAL CORRECTION
+ 0004 01 C BAND SWH INSTRUMENTAL CORRECTION
+ 0005 01 KU BAND SCATTEROMETER COEFFICIENT INSTRUMENTAL CORRECTION
+ 0006 01 C BAND SCATTEROMETER COEFFICIENT INSTRUMENTAL CORRECTION
+025110 0006 0001 02 RAW DATA ANALYSIS USED FOR RAW DATA CORRECTION.
+ CORRECTION DONE USING DEFAULT PARAMETERS
+ 0002 02 RAW DATA ANALYSIS USED FOR RAW DATA CORRECTION.
+ CORRECTION DONE USING RAW DATA ANALYSIS RESULTS
+ 0003 01 ANTENNA ELEVATION PATTERN CORRECTION APPLIED
+ 0004 01 NOMINAL CHIRP REPLICA USED
+ 0005 01 RECONSTRUCTED CHIRP USED
+ 0006 01 SLANT RANGE TO GROUND RANGE CONVERSION APPLIED
+025120 0004 0000 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS GREATER THAN THE ACCEPTABLE THRESHOLD
+ 0001 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS LESS THAN THE ACCEPTABLE THRESHOLD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025122 0004 0000 01 HARDWARE CONFIGURATION FOR RF IS A
+ 0001 01 HARDWARE CONFIGURATION FOR RF IS B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025123 0004 0000 01 HARDWARE CONFIGURATION FOR HPA IS A
+ 0001 01 HARDWARE CONFIGURATION FOR HPA IS B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025124 0004 0000 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS GREATER THAN THE ACCEPTABLE THRESHOLD
+ 0001 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS LESS THAN THE ACCEPTABLE THRESHOLD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025144 0013 0001 01 PIXEL IS AFFECTED BY RFI EFFECTS
+ 0002 02 PIXEL IS LOCATED IN THE HEXAGONAL ALIAS DIRECTION CENTRED ON
+ SUN ALIAS
+ 0003 02 PIXEL IS CLOSE TO THE BORDER DELIMITING THE EXTENDED ALIAS F
+ REE ZONE
+ 0004 01 PIXEL IS INSIDE THE EXTENDED ALIAS FREE ZONE
+ 0005 01 PIXEL IS INSIDE THE EXCLUSIVE OF ALIAS FREE ZONE
+ 0006 02 PIXEL IS LOCATED IN ZONE WHERE A MOON ALIAS WAS RECONSTRUCTE
+ D
+ 0007 02 PIXEL IS LOCATED IN ZONE WHERE SUN REFLECTION HAS BEEN DETEC
+ TED
+ 0008 01 PIXEL IS LOCATED IN ZONE WHERE SUN ALIAS WAS RECONSTRUCTED
+ 0009 02 FLAT TARGET TRANSFORMATION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION OF THIS PIXEL
+ 0010 03 SCENE HAS BEEN COMBINED WITH AN ADJUSTMENT SCENE IN OPOSITE
+ POLARISATION DURING IMAGE RECONSTRUCTION TO ACCOUNT FOR CROS
+ S-POLARISATION LEAKAGE
+ 0011 02 DIRECT MOON CORRECTION HAS BENN PERFORMED DURING IMAGE RECON
+ STRUCTION OF THIS PIXEL
+ 0012 02 REFLECTED SUN CORRECTION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION IF THIS PIXEL
+ 0013 02 DIRECT SUN CORRECTION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION OF THIS IMAGE
+026010 0025 0001 01 0100 INCLUDED
+ 0002 01 0200 INCLUDED
+ 0003 01 0300 INCLUDED
+ 0004 01 0400 INCLUDED
+ 0005 01 0500 INCLUDED
+ 0006 01 0600 INCLUDED
+ 0007 01 0700 INCLUDED
+ 0008 01 0800 INCLUDED
+ 0009 01 0900 INCLUDED
+ 0010 01 1000 INCLUDED
+ 0011 01 1100 INCLUDED
+ 0012 01 1200 INCLUDED
+ 0013 01 1300 INCLUDED
+ 0014 01 1400 INCLUDED
+ 0015 01 1500 INCLUDED
+ 0016 01 1600 INCLUDED
+ 0017 01 1700 INCLUDED
+ 0018 01 1800 INCLUDED
+ 0019 01 1900 INCLUDED
+ 0020 01 2000 INCLUDED
+ 0021 01 2100 INCLUDED
+ 0022 01 2200 INCLUDED
+ 0023 01 2300 INCLUDED
+ 0024 01 2400 INCLUDED
+ 0025 01 UNKNOWN MIXTURE OF HOURS
+029001 0006 0000 01 GNOMONIC PROJECTION
+ 0001 01 POLAR STEREOGRAPHIC PROJECTION
+ 0002 01 LAMBERT'S CONFORMAL CONIC PROJECTION
+ 0003 01 MERCATOR'S PROJECTION
+ 0004 01 SCANNING CONE (RADAR)
+ 0007 01 MISSING VALUE
+029002 0004 0000 01 CARTESIAN
+ 0001 01 POLAR
+ 0002 01 OTHER
+ 0007 01 MISSING VALUE
+030031 0013 0000 01 PPI
+ 0001 01 COMPOSITE
+ 0002 01 CAPPI
+ 0003 01 VERTICAL SECTION
+ 0004 01 ALPHANUMERIC DATA
+ 0005 01 MAP OF SUBJECT CLUTTER
+ 0006 01 MAP
+ 0007 01 TEST PICTURE
+ 0008 01 COMMENTS
+ 0009 01 MAP OF GROUND OCCULTATION
+ 0010 01 MAP OF RADAR BEAM HEIGHT
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+030032 0009 0001 01 MAP
+ 0002 01 SATELLITE IR
+ 0003 01 SATELLITE VIS
+ 0004 01 SATELLITE WV
+ 0005 01 SATELLITE MULTISPECTRAL
+ 0006 01 SYNOPTIC OBSERVATIONS
+ 0007 01 FORECAST PARAMETERS
+ 0008 01 LIGHTNING DATA
+ 0015 01 OTHER DATA
+031021 0004 0001 01 1 BIT INDICATOR OF QUALITY, 0= GOOD; 1=SUSPECT OR BAD
+ 0002 02 2 BIT INDICATOR OF QUALITY, 0= GOOD; 1= SLIGHTLY SUSPECTED;
+ 2= HIGHLY SUSPECTED; 3=BAD
+ 0007 01 PERCENTAGE CONFIDENCE
+ 0063 01 MISSING VALUE
+031031 0001 0001 01 DATA NOT PRESENT
+033002 0004 0000 01 DATA NOT SUSPECT
+ 0001 01 DATA SUSPECT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033003 0005 0000 01 DATA NOT SUSPECT
+ 0001 01 DATA SLIGHTLY SUSPECT
+ 0002 01 DATA HIGHTLY SUSPECT
+ 0003 01 DATA CONSIDERED UNFIT FOR USE
+ 0007 01 MISSING VALUE
+033005 0023 0001 01 NO AUTOMATED METEOROLOGICAL DATA CHECKS PERFORMED
+ 0002 01 PRESSURE DATA SUSPECT
+ 0003 01 WIND DATA SUSPECT
+ 0004 01 DRY-BULB TEMPERATURE DATA SUSPECT
+ 0005 01 WET-BULB TEMPERATURE DATA SUSPECT
+ 0006 01 HUMIDITY DATA SUSPECT
+ 0007 01 GROUND TEMPERATURE DATA SUSPECT
+ 0008 01 SOIL TEMPERATURE (DEPTH 1) DATA SUSPECT
+ 0009 01 SOIL TEMPERATURE (DEPTH 2) DATA SUSPECT
+ 0010 01 SOIL TEMPERATURE (DEPTH 3) DATA SUSPECT
+ 0011 01 SOIL TEMPERATURE (DEPTH 4) DATA SUSPECT
+ 0012 01 SOIL TEMPERATURE (DEPTH 5) DATA SUSPECT
+ 0013 01 CLOUD DATA SUSPECT
+ 0014 01 VISIBILITY DATA SUSPECT
+ 0015 01 PRESENT WEATHER DATA SUSPECT
+ 0016 01 LIGHTNING DATA SUSPECT
+ 0017 01 ICE DEPOSIT DATA SUSPECT
+ 0018 01 PRECIPITATION DATA SUSPECT
+ 0019 01 STATE OF GROUND DATA SUSPECT
+ 0020 01 SNOW DATA SUSPECT
+ 0021 01 WATER CONTENT DATA SUSPECT
+ 0022 01 EVAPORATION/EVAPOTRANSPIRATION DATA SUSPECT
+ 0023 01 SUNSHINE DATA SUSPECT
+033006 0005 0000 01 SELF-CHECK OK
+ 0001 01 AT LEAST ONE WARNING ACTIVE, NO ALARMS
+ 0002 01 AT LEAST ONE ALARM ACTIVE
+ 0003 01 SENSOR FAILURE
+ 0007 01 MISSING VALUE
+033015 0016 0000 01 PASSED ALL CHECKS
+ 0001 01 MISSING-DATA CHECK
+ 0002 01 DESCENDING/REASCENDING BALLOON CHECK
+ 0003 01 DATA PLAUSIBILITY CHECK (ABOVE LIMITS)
+ 0004 01 DATA PLAUSIBILITY CHECK (BELOW LIMITS)
+ 0005 01 SUPERADIABATIC LAPSE RATE CHECK
+ 0006 01 LIMITING ANGLES CHECK
+ 0007 01 ASCENSION RATE CHECK
+ 0008 01 EXCESSIVE CHANGE FROM PREVIOUS FLIGHT
+ 0009 01 BALLOON OVERHEAD CHECK
+ 0010 01 WIND SPEED CHECK
+ 0011 01 WIND DIRECTION CHECK
+ 0012 01 DEPENDENCY CHECK
+ 0013 01 DATA VALID BUT MODIFIED
+ 0014 01 DATA OUTLIER CHECK
+ 0063 01 MISSING DATA
+033020 0008 0000 01 GOOD
+ 0001 01 INCONSISTENT
+ 0002 01 DOUBTFUL
+ 0003 01 WRONG
+ 0004 01 NOT CHECKED
+ 0005 01 HAS BEEN CHECKED
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+033021 0004 0000 01 WITHIN LIMITS
+ 0001 01 OUTSIDE LIMITS
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033022 0004 0000 01 GOOD (SEVERAL IDENTICAL REPORTS HAVE BEEN RECEIVED)
+ 0001 01 DUBIOUS (NO IDENTICAL REPORT HAVE BEEN RECEIVED)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033023 0004 0000 01 RELIABLE (LOCATION WAS MADE OVER TWO SATELLITE PASSES)
+ 0001 01 LATEST KNOWN (NO LOCATION OVER CORRESPONDING PASS)
+ 0002 01 DUBIOUS
+ 0003 01 MISSING VALUE
+033024 0010 0000 01 RESERVED
+ 0001 01 EXELLENT - WITHIN 3 METRES
+ 0002 01 GOOD - WITHIN 10 METRES
+ 0003 01 FAIR - WITHIN 20 METRES
+ 0004 01 POOR - MORE THAN 20 METRES
+ 0005 01 EXELLENT -WITHIN 10 FEET
+ 0006 01 GOOD WITHIN-30 FEET
+ 0007 01 FAIR WITHIN 60 FEET
+ 0008 01 POOR - MORE THAN 60 FEET
+ 0015 01 MISSING VALUE
+033025 0005 0000 01 TIME INTERPOLATED, LATITUDE AND LONGITUDE REPORTED
+ 0001 01 TIME REPORTED, LATITUDE AND LONGITUDE INTERPOLATED
+ 0002 01 TIME, LATITUDE AND LONGITUDE INTERPOLATED
+ 0003 01 TIME, LATITUDE AND LONGITUDE REPORTED
+ 0007 01 MISSING VALUE
+033026 0010 0000 01 NORMAL OPERATIONS - MEASUREMENT MODE
+ 0001 01 NORMAL OPERATIONS - NON-MEASUREMENT MODE
+ 0002 01 SMALL RH
+ 0003 01 HUMIDITY ELEMENT IS WET
+ 0004 01 HUMIDITY ELEMENT IS CONTAMINATED
+ 0005 01 HEATER FAIL
+ 0006 01 HEATER FAIL AND WET/CONTAMINATED HUMIDITY ELEMENT
+ 0007 01 SINGLE VALIDITY BAD
+ 0008 01 NUMERIC ERROR
+ 0063 01 MISSING VALUE
+033027 0005 0000 01 RADIUS >= 1500 M
+ 0001 01 500 M <= RADIUS < 1500 M
+ 0002 01 250 M <= RADIUS < 500 M
+ 0003 01 RADIUS < 250 M
+ 0007 01 MISSING VALUE
+033028 0006 0000 01 RESERVED
+ 0001 01 NOMINAL
+ 0002 01 DEGRADED BY SW ERROR; ANY ERROR REPORTED BY THE ALGORITHMS
+ 0003 01 DEGRADED BY INSTRUMENT ERROR
+ 0004 01 DEGRADED BY CORRUPTED/MISSING ADF
+ 0007 01 MISSING
+033030 0007 0001 01 DO NOT USE SCAN FOR PRODUCT GENERATION
+ 0002 01 TIME SEQUENCE ERROR DETECTED WITH THIS SCAN
+ 0003 01 DATA GAP PRECEDES THIS SCAN
+ 0004 01 NO CALIBRATION
+ 0005 01 NO EARTH LOCATION
+ 0006 01 FIRST GOOD TIME FOLLOWING A CLOCK UPDATE
+ 0007 01 INSTRUMENT STATUS CHANGED WITH THIS SCAN
+033031 0021 0001 02 TIME FIELD IS BAD BUT CAN PROBABLY BE INFERRED FROM THE PREV
+ IOUS GOOD TIME
+ 0002 02 TIME FIELD IS BAD AND CAN�~@~YT BE INFERRED FROM THE PREVIOU
+ S GOOD TIME
+ 0003 04 THIS RECORD STARTS A SEQUENCE THAT IS INCONSISTENT WITH PREV
+ IOUS TIMES (I.E. THERE IS A TIME DISCONTINUITY). THIS MAY OR
+ MAY NOT BE ASSOCIATED WITH A SPACECRAFT CLOCK UPDATE (SEE S
+ CAN LINE STATUS FLAGS FOR ATOVS)
+ 0004 02 START OF A SEQUENCE THAT APPARENTLY REPEATS SCAN TIMES THAT
+ HAVE BEEN PREVIOUSLY ACCEPTED
+ 0005 01 SCAN LINE WAS NOT CALIBRATED BECAUSE OF BAD TIME
+ 0006 03 SCAN LINE WAS CALIBRATED USING FEWER THAN THE PREFERRED NUMB
+ ER OF SCAN LINES BECAUSE OF PROXIMATY TO START OR END OF DAT
+ A OR TO A DATA GAP
+ 0007 02 SCAN LINE WAS NOT CALIBRATED BECAUSE OF BAD OR INSUFFICIENT
+ PRT DATA
+ 0008 01 SCAN LINE WAS CALIBRATED BUT WITH MARGINAL PRT DATA
+ 0009 01 SOME UNCALIBRATED CHANNELS ON THIS SCAN
+ 0010 01 UNCALIBRATED DUE TO INSTRUMENT MODE
+ 0011 02 QUESTIONABLE CALIBRATION BECAUSE OF ANTENNA POSITION ERROR O
+ F SPACE VIEW
+ 0012 02 QUESTIONABLE CALIBRATION BECAUSE OF ANTENNA POSITION ERROR O
+ F BLACK BODY
+ 0013 01 NOT EARTH LOCATED BECAUSE OF BAD TIME
+ 0014 03 EARTH LOCATION QUESTIONABLE BECAUSE OF
+ QUESTIONABLE TIME CODE (SEE TIME PROBLEM
+ CODE BITS)
+ 0015 02 EARTH LOCATION QUESTIONABLE - ONLY MARGINAL AGREEMENT
+ WITH REASONABLENESS CHECK
+ 0016 01 EARTH LOCATION QUESTIONABLE - FAILS REASONABLENESS CHECK
+ 0017 02 EARTH LOCATION QUESTIONABLE BECAUSE OF ANTENNA POSITION CHEC
+ K
+ 0018 01 SCAN LINE CALIBRATION COLD BLACK BODY
+ 0019 01 SCAN LINE CALIBRATION WARM BLACK BODY
+ 0020 01 SCAN LINE CALIBRATION SPACE VIEW
+ 0021 01 EARTH VIEW
+033032 0006 0001 01 NO GOOD BLACKBODY COUNTS FOR SCAN LINE
+ 0002 01 NO GOOD SPACE VIEW COUNTS FOR THIS LINE
+ 0003 01 NO GOOD PRTS FOR THIS LINE
+ 0004 01 SOME BAD BLACKBODY VIEW COUNTS FOR THIS LINE
+ 0005 01 SOME BAD SPACE VIEW COUNTS FOR THIS LINE
+ 0006 01 SOME BAD PRT TEMPS ON THIS LINE
+033033 0023 0001 01 SET IF SECONDARY CALIBRATION USED
+ 0002 02 BRIGHTNESS TEMPERATURE IN CHANNEL 1 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0003 02 BRIGHTNESS TEMPERATURE IN CHANNEL 2 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0004 02 BRIGHTNESS TEMPERATURE IN CHANNEL 3 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0005 02 BRIGHTNESS TEMPERATURE IN CHANNEL 4 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0006 02 BRIGHTNESS TEMPERATURE IN CHANNEL 5 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0007 02 BRIGHTNESS TEMPERATURE IN CHANNEL 6 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0008 02 BRIGHTNESS TEMPERATURE IN CHANNEL 7 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0009 02 BRIGHTNESS TEMPERATURE IN CHANNEL 8 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0010 02 BRIGHTNESS TEMPERATURE IN CHANNEL 9 IS PHYSICALLY UNREASONAB
+ LE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0011 02 BRIGHTNESS TEMPERATURE IN CHANNEL 10 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0012 02 BRIGHTNESS TEMPERATURE IN CHANNEL 11 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0013 02 BRIGHTNESS TEMPERATURE IN CHANNEL 12 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0014 02 BRIGHTNESS TEMPERATURE IN CHANNEL 13 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0015 02 BRIGHTNESS TEMPERATURE IN CHANNEL 14 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0016 02 BRIGHTNESS TEMPERATURE IN CHANNEL 15 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0017 02 BRIGHTNESS TEMPERATURE IN CHANNEL 16 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0018 02 BRIGHTNESS TEMPERATURE IN CHANNEL 17 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0019 02 BRIGHTNESS TEMPERATURE IN CHANNEL 18 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0020 02 BRIGHTNESS TEMPERATURE IN CHANNEL 19 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0021 02 BRIGHTNESS TEMPERATURE IN CHANNEL 20 IS PHYSICALLY UNREASONA
+ BLE OR HAS NOT BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0022 01 SET IF ALL CHANNELS ARE MISSING
+ 0023 01 SUSPECT
+033035 0010 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND PA
+ SSED
+ 0002 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND DE
+ LETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND FA
+ ILED
+ 0005 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND RE
+ -INSERTED
+ 0006 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND N
+ OT MANUALLY CHECCKED
+ 0007 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE
+ AND MANUALLY CHECKED AND FAILED
+ 0008 01 MANUALLY CHECKED AND FAILED
+ 0015 01 MISSING VALUE
+033037 0019 0001 01 U DEPARTURE FROM GUESS
+ 0002 01 V DEPARTURE FROM GUESS
+ 0003 01 U & V DEPARTURE FROM GUESS
+ 0004 01 U ACCELERATION
+ 0005 01 V ACCELERATION
+ 0006 01 U & V ACCELERATION
+ 0007 01 POSSIBLE LAND FEATURE
+ 0008 01 U ACCELERATION AND POSSIBLE LAND FEATURE
+ 0009 01 V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0010 01 U & V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0011 01 BAD WIND GUESS
+ 0012 01 CORRELATION FAILURE
+ 0013 01 SEARCH BOX OFF EDGE OF AREA
+ 0014 01 TARGET BOX OFF EDGE OF AREA
+ 0015 01 PIXEL BRIGHTNESS OUT OF BOUNDS (NOISY LINE)
+ 0016 01 TARGET OUTSIDE OF LAT/LONG BOX
+ 0017 01 TARGET OUTSIDE OF PRESSURE MIN/MAX
+ 0018 01 AUTOEDITOR FLAGGED SLOW VECTOR
+ 0019 01 AUTOEDITOR FLAGGED VECTORS
+033038 0009 0001 01 TOTAL ZENITH DELAY QUALITY IS CONSIDERED POOR
+ 0002 01 GALILEO SATELLITES USED
+ 0003 01 GLONASS SATELLITES USED
+ 0004 01 GPS SATELLITES USED
+ 0005 01 METEOROLOGICAL DATA APPLIED
+ 0006 01 ATMOSPHERIC LOADING CORRECTION APPLIED
+ 0007 01 OCEAN TIDE LOADING APPLIED
+ 0008 01 CLIMATE QUALITY DATA PROCESSING
+ 0009 01 NEAR-REAL TIME DATA PROCESSING
+033039 0009 0001 01 NON-NOMINAL QUALITY
+ 0002 01 OFFLINE PRODUCT
+ 0003 01 ASCENDING OCCULTATION FLAG
+ 0004 01 EXCESS PHASE PROCESSING NON-NOMINAL
+ 0005 01 BENDING ANGLE PROCESSING NON-NOMINAL
+ 0006 01 REFRACTIVITY PROCESSING NON-NOMINAL
+ 0007 01 METEOROLOGICAL PROCESSING NON-NOMINAL
+ 0014 01 BACKGROUND PROFILE NON-NOMINAL
+ 0015 01 BACKGROUND (I.E. NOT RETRIEVED) PROFILE PRESENT
+033041 0004 0000 01 THE FOLLOWING VALUE IS THE TRUE VALUE
+ 0001 02 THE FOLLOWING VALUE IS HIGHER THAN THE TRUE VALUE
+ (THE MEASUREMENT HIT THE LOWER LIMIT OF THE INSTRUMENT)
+ 0002 02 THE FOLLOWING VALUE IS LOWER THAN THE TRUE VALUE
+ (THE MEASUREMENT HIT THE HIGHER LIMIT OF THE INSTRUMENT)
+ 0003 01 MISSING VALUE
+033042 0005 0000 01 EXCLUSIVE LOWER LIMIT (>)
+ 0001 01 INCLUSIVE LOWER LIMIT (>=)
+ 0002 01 EXCLUSIVE UPPER LIMIT (<)
+ 0003 01 INCLUSIVE UPPER LIMIT (=<)
+ 0007 01 MISSING VALUE
+033043 0004 0001 02 SEA MDS. NADIR ONLY SST RETRIEVAL USED 3.7 MICRON
+ CHANNEL. LAND MDS RESERVED
+ 0002 02 SEA MDS. DUAL VIEW SST RETRIEVAL USED 3.7 MICRON
+ CHANNEL. LAND MDS RESERVED.
+ 0003 01 NADIR VIEW CONTAINS DAY TIME DATA
+ 0004 01 FORWARD VIEW CONTAINS DAY TIME DATA
+033044 0014 0001 01 INPUT DATA MEAN OUTSIDE NOMINAL RANGE FLAG
+ 0002 01 INPUT DATA STANDARD DEVIATION OUTSIDE NOMINAL RANGE FLAG
+ 0003 01 NUMBER OF INPUT DATA GAPS > THRESHOLD VALUE
+ 0004 01 PERCENTAGE OF MISSING LINES > THRESHOLD VALUE
+ 0005 02 DOPPLER CENTROID UNCERTAIN. CONFIDENCE MEASURE < SPECIFIC VA
+ LUE
+ 0006 02 DOPPLER AMBIGUITY ESTIMATE UNCERTAIN. CONFIDENCE MEASURE < S
+ PECIFIC VALUE
+ 0007 01 OUTPUT DATA MEAN OUTSIDE NOMINAL RANGE FLAG
+ 0008 01 OUTPUT DATA STANDARD DEVIATION OUTSIDE NOMINAL RANGE FLAG
+ 0009 01 CHIRP RECONSTRUCTION FAILED OR IS OF LOW QUALITY FLAG
+ 0010 01 DATA SET MISSING
+ 0011 01 INVALID DOWNLINK PARAMETERS
+ 0012 02 AZIMUTH CUT-OFF ITERATION COUNT. THE AZIMUTH CUT-OFF FIT DID
+ NOT CONVERGE WITHIN A MINIMUM NUMBER OF ITERATIONS
+ 0013 02 AZIMUTH CUT-OFF FIT DID NOT CONVERGE WITHIN A MINIMUM
+ NUMBER OF ITERATIONS
+ 0014 03 PHASE INFORMATION CONFIDENCE MEASURE. THE IMAGINARY SPECTRAL
+ PEAK IS LESS THAN A MINIMUM THRESHOLD, OR THE ZERO LAG SHIFT
+ IS GREATER THAN A MINIMUM THRESHOLD
+033047 0026 0001 01 ERROR DETECTED AND ATTEMPTS TO RECOVER MADE
+ 0002 01 ANOMALY IN ON-BOARD DATA HANDLING (OBDH) VALUE DETECTED
+ 0003 02 ANOMALY IN ULTRA STABLE OSCILLATOR PROCESSING (USOP) VALUE D
+ ETECTED
+ 0004 01 ERRORS DETECTED BY ON-BOARD COMPUTER
+ 0005 01 AUTOMATIC GAIN CONTROL (AGC) OUT OF RANGE
+ 0006 01 RX DELAY FAULT. RX DISTANCE OUT OF RANGE
+ 0007 01 WAVE FORM SAMPLES FAULT IDENTIFIER. ERROR
+ 0012 01 BRIGHTNESS TEMPERATURE (CHANNEL 1) OUT OF RANGE
+ 0013 01 BRIGHTNESS TEMPERATURE (CHANNEL 2) OUT OF RANGE
+ 0014 01 RESERVED
+ 0015 01 KU OCEAN RETRACKING ERROR
+ 0016 01 S OCEAN RETRACKING ERROR
+ 0017 01 KU ICE 1 RETRACKING ERROR
+ 0018 01 S ICE 1 RETRACKING ERROR
+ 0019 01 KU ICE 2 RETRACKING ERROR
+ 0020 01 S ICE 2 RETRACKING ERROR
+ 0021 01 KU SEA ICE RETRACKING ERROR
+ 0022 01 ARITHMETIC FAULT ERROR
+ 0023 01 METEO DATA STATE. NO MAP
+ 0024 01 METEO DATA STATE. 1 MAP
+ 0025 01 METEO DATA STATE 2 MAPS DEGRADED
+ 0026 01 METEO DATA STATE 2 MAPS NOMINAL
+ 0027 01 ORBIT PROPAGATOR STATUS FOR PROPAGATION MODE, SEVERAL ERRORS
+ 0028 02 ORBIT PROPAGATOR STATUS FOR PROPAGATION MODE, WARNING DETECT
+ ED
+ 0029 02 ORBIT PROPAGATOR STATUS FOR INITIALISATION MODE, SEVERAL ERR
+ ORS
+ 0030 02 ORBIT PROPAGATOR STATUS FOR INITIALISATION MODE, WARNING DET
+ ECTED
+033048 0004 0000 01 INVERSION SUCCESSFUL
+ 0001 01 INVERSION NOT SUCCESSFUL
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033049 0004 0000 01 EXTERNAL WIND DIRECTION USED DURING INVERSION
+ 0001 01 EXTERNAL WIND DIRECTION NOT USED DURING INVERSION
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033050 0008 0000 01 UNQUALIFIED
+ 0001 01 CORRECT VALUE (ALL CHECKS PASSED)
+ 0002 02 PROBABLY GOOD BUT VALUE INCONSISTENT WITH STATISTICS (DIFFER
+ FROM CLIMATOLOGY)
+ 0003 01 PROBABLY BAD (SPIKE, GRADIENT, �~E IF OTHER TESTS PASSED)
+ 0004 02 BAD VALUE, IMPOSSIBLE VALUE (OUT OF SCALE, VERTICAL
+ INSTABILITY, CONSTANT PROFILE)
+ 0005 01 VALUE MODIFIED DURING QUALITY CONTROL
+ 0008 01 INTERPOLATED VALUE
+ 0015 01 MISSING VALUE
+033052 0020 0001 01 DATA BLOCK 1 INVALID (S BAND)
+ 0002 01 DATA BLOCK 2 INVALID (S BAND)
+ 0003 01 DATA BLOCK 3 INVALID (S BAND)
+ 0004 01 DATA BLOCK 4 INVALID (S BAND)
+ 0005 01 DATA BLOCK 5 INVALID (S BAND)
+ 0006 01 DATA BLOCK 6 INVALID (S BAND)
+ 0007 01 DATA BLOCK 7 INVALID (S BAND)
+ 0008 01 DATA BLOCK 8 INVALID (S BAND)
+ 0009 01 DATA BLOCK 9 INVALID (S BAND)
+ 0010 01 DATA BLOCK 10 INVALID (S BAND)
+ 0011 01 DATA BLOCK 11 INVALID (S BAND)
+ 0012 01 DATA BLOCK 12 INVALID (S BAND)
+ 0013 01 DATA BLOCK 13 INVALID (S BAND)
+ 0014 01 DATA BLOCK 14 INVALID (S BAND)
+ 0015 01 DATA BLOCK 15 INVALID (S BAND)
+ 0016 01 DATA BLOCK 16 INVALID (S BAND)
+ 0017 01 DATA BLOCK 17 INVALID (S BAND)
+ 0018 01 DATA BLOCK 18 INVALID (S BAND)
+ 0019 01 DATA BLOCK 19 INVALID (S BAND)
+ 0020 01 DATA BLOCK 20 INVALID (S BAND)
+033053 0020 0001 01 DATA BLOCK 1 INVALID (KU BAND)
+ 0002 01 DATA BLOCK 2 INVALID (KU BAND)
+ 0003 01 DATA BLOCK 3 INVALID (KU BAND)
+ 0004 01 DATA BLOCK 4 INVALID (KU BAND)
+ 0005 01 DATA BLOCK 5 INVALID (KU BAND)
+ 0006 01 DATA BLOCK 6 INVALID (KU BAND)
+ 0007 01 DATA BLOCK 7 INVALID (KU BAND)
+ 0008 01 DATA BLOCK 8 INVALID (KU BAND)
+ 0009 01 DATA BLOCK 9 INVALID (KU BAND)
+ 0010 01 DATA BLOCK 10 INVALID (KU BAND)
+ 0011 01 DATA BLOCK 11 INVALID (KU BAND)
+ 0012 01 DATA BLOCK 12 INVALID (KU BAND)
+ 0013 01 DATA BLOCK 13 INVALID (KU BAND)
+ 0014 01 DATA BLOCK 14 INVALID (KU BAND)
+ 0015 01 DATA BLOCK 15 INVALID (KU BAND)
+ 0016 01 DATA BLOCK 16 INVALID (KU BAND)
+ 0017 01 DATA BLOCK 17 INVALID (KU BAND)
+ 0018 01 DATA BLOCK 18 INVALID (KU BAND)
+ 0019 01 DATA BLOCK 19 INVALID (KU BAND)
+ 0020 01 DATA BLOCK 20 INVALID (KU BAND)
+033060 0004 0000 01 PARAMETER=GOOD
+ 0001 01 PARAMETER=BAD
+ 0002 01 PARAMETER=RESERVED
+ 0003 01 MISSING
+033195 0004 0000 01 DEALIASING NOT USED
+ 0001 01 DEALIASING USED
+ 0002 01 RESERVED
+ 0003 01 MISSING
+033205 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033206 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033207 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033208 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033209 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033220 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 REPORT REJECTED THROUGH THE NAMELIST
+ 0017 01 MODEL SUR. TOO FAR FROM STAT. ALT.
+ 0018 01 MISSING STATION ALTITUDE
+ 0019 01 REPORT OVER SEA
+ 0020 01 REPORT OVER LAND
+ 0021 01 REDUNDANT REPORT
+ 0022 01 TIME OUT OF RANGE
+ 0023 01 VERTICAL POSITION OUT OF RANGE
+ 0024 01 HORIZONTAL POSITION OUT OF RANGE
+ 0025 01 ACTIVATED BY WHITELIST
+ 0026 01 ACTIVATED DUE TO RDB FLAG
+ 0027 01 REJECTED DUE TO RDB FLAG
+ 0028 01 BAD REPORTING PRACTICE
+ 0029 01 ALL DATA REJECTED
+ 0030 01 NO DATA IN THE REPORT
+033221 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033222 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033223 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033224 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033225 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033226 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033227 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033228 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033229 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 THINNED REPORT
+033230 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033232 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 BLACKLISTED DUE TO DISTANCE FROM REF. POINT
+ 0015 01 BLACKLISTED DUE TO MODEL OROGRAPHY
+ 0016 01 BLACKLISTED DUE TO LAND/SEA MASK
+ 0017 01 STATION ALTITUDE BLACKLISTED
+ 0018 01 LONGITUDE BLACKLISTED
+ 0019 01 LATITUDE BLACKLISTED
+ 0020 01 TIME BLACKLISTED
+ 0021 01 DATE BLACKLISTED
+ 0022 01 INSTRUMENT TYPE BLACKLISTED
+ 0023 01 CODE TYPE BLACKLISTED
+ 0024 01 STATION ID BLACKLISTED
+ 0025 01 BLACKLISTED DUE TO FIRST GUESS DEPARTURE
+ 0026 01 BLACKLISTED DUE TO OBSERVED VALUE
+ 0027 01 BLACKLISTED DUE TO TYPE OF VERTICAL COORDINATE
+ 0028 01 BLACKLISTED DUE TO PRESSURE CODE
+ 0029 01 VARIABLE NAME BLACKLISTED
+ 0030 01 MONTHLY MONITORING
+033233 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 REPORT BLACK LISTED
+ 0028 01 REPORT REJECTED
+ 0029 01 REPORT PASSIVE
+ 0030 01 REPORT ACTIVE
+033234 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 DATUM BLACK LISTED
+ 0028 01 DATUM REJECTED
+ 0029 01 DATUM PASSIVE
+ 0030 01 DATUM ACTIVE
+033236 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 DATUM REJECTED DUE TO REJECTED REPORT
+ 0006 01 COMBINED FLAGGING
+ 0007 01 DATUM REJECTED DUE TO NAMELIST
+ 0008 01 VERTICAL COORDINATE CHANGE FROM Z TO P
+ 0009 01 VERTICAL CONSISTENCY CHECK
+ 0010 01 LEVEL SELECTION
+ 0011 01 MULTI LEVEL CHECK
+ 0012 01 TOO MANY SURFACE DATA/LEVELS
+ 0013 01 DUPLICATED DATUM/LEVEL
+ 0014 01 NOT AN ANALYSIS VARIABLE
+ 0015 01 REPORT OVER SEA
+ 0016 01 REPORT OVER LAND
+ 0017 01 REDUNDANT LEVEL
+ 0018 01 REDUNDANT DATUM
+ 0019 01 TOO BIG OBSERVATION ERROR
+ 0020 01 TOO BIG DEPARTURE IN ASSIMILATION
+ 0021 01 TOO BIG FIRST GUESS DEPARTURE
+ 0022 01 REFERENCE LEVEL POSITION OUT OF RANGE
+ 0023 01 VERTICAL POSITION OUT OF RANGE
+ 0024 01 BAD REPORTING PRACTICE
+ 0025 01 ACTIVATED BY WHITELIST
+ 0026 01 ACTIVATED DUE TO RDB FLAG
+ 0027 01 REJECTED DUE TO RDB FLAG
+ 0028 01 MISSING FIRST GUESS VALUE
+ 0029 01 MISSING OBSERVED VALUE
+ 0030 01 MISSING VERTICAL COORDINATE
+033237 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033238 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033239 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033240 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033243 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033244 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033245 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 LAYER FORMED BY SUMMING UP
+ 0029 01 LAYER FORMED BY THINNING UP
+ 0030 01 NOT PREDEFINED LAYER
+033246 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033247 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033248 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033249 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 BLACKLISTED DUE TO FIRST GUESS DEPARTURE
+ 0025 01 BLACKLISTED DUE TO OBSERVED VALUE
+ 0026 01 BLACKLISTED DUE TO TYPE OF VERTICAL COORDINATE
+ 0027 01 BLACKLISTED DUE TO DISTANCE FROM REFERENCE POINT
+ 0028 01 BLACKLISTED DUE TO PRESSURE CODE
+ 0029 01 VARIABLE BLACKLISTED
+ 0030 01 PRESSURE BLACKLISTED
+033252 0010 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND PA
+ SSED
+ 0002 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND DE
+ LETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND FA
+ ILED
+ 0005 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND RE
+ -INSERTED
+ 0006 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND N
+ OT MANUALLY CHECCKED
+ 0007 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND M
+ ANUALLY CHECKED AND FAILED
+ 0008 01 MANUALLY CHECKED AND FAILED
+ 0015 01 MISSING VALUE
+033254 0019 0001 01 U DEPARTURE FROM GUESS
+ 0002 01 V DEPARTURE FROM GUESS
+ 0003 01 U & V DEPARTURE FROM GUESS
+ 0004 01 U ACCELERATION
+ 0005 01 V ACCELERATION
+ 0006 01 U & V ACCELERATION
+ 0007 01 POSSIBLE LAND FEATURE
+ 0008 01 U ACCELERATION AND POSSIBLE LAND FEATURE
+ 0009 01 V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0010 01 U & V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0011 01 BAD WIND GUESS
+ 0012 01 CORRELATION FAILURE
+ 0013 01 SEARCH BOX OFF EDGE OF AREA
+ 0014 01 TARGET BOX OFF EDGE OF AREA
+ 0015 01 PIXEL BRIGHTNESS OUT OF BOUNDS (NOISY LINE)
+ 0016 01 TARGET OUTSIDE OF LAT/LONG BOX
+ 0017 01 TARGET OUTSIDE OF PRESSURE MIN/MAX
+ 0018 01 AUTOEDITOR FLAGGED SLOW VECTOR
+ 0019 01 AUTOEDITOR FLAGGED VECTORS
+035000 0011 0011 01 000-099 INTERNATIONAL FM CODES
+ 0001 01 100-199 RA I CODES
+ 0002 01 200-299 RA II CODES
+ 0003 01 300-399 RA III CODES
+ 0004 01 400-499 RA IV CODES
+ 0005 01 500-599 RA V CODES
+ 0006 01 600-699 RA VI CODES
+ 0007 01 700-799 ANTARCTIC CODES
+ 0008 01 800-999 RESERVED
+ 0009 01 1000-1022 NOT USED
+ 1023 01 MISSING VALUE
+035001 0004 0000 01 REAL TIME
+ 0001 01 NEAR-REAL TIME
+ 0002 01 NON-REAL TIME
+ 0007 01 MISSING VALUE
+035030 0010 0000 01 NO DISCREPANCIES
+ 0001 02 NON-COMPLIANCE WITH STANDARD AND RECOMMENDED PRACTICES
+ AND PROCEDURES INCLUDINGTHOSE OF MONITORING
+ 0002 02 CATALOGUES OF METEOROLOGICAL BULLETINS NOT UPDATED IN A TIME
+ LY MANNER
+ 0003 01 INCORRECT ROUTEING DIRECTORIES
+ 0004 01 LACK OF FLEXIBILITY IN THE ROUTEING ARRANGEMENTS
+ 0005 01 DEFICIENCIES IN THE OPERATION OF GTS CENTRES AND CIRCUITS
+ 0006 01 LOSS OF DATA OR DELAYS IN RELAYING DATA ON THE GTS
+ 0007 02 ROUTEING OF DATA DIFFERENT FROM THE ROUTEING PROVIDED IN THE
+ PLAN
+ 0008 01 VARIOUS MALPRACTICES
+ 0015 01 MISSING VALUE
+035031 0020 0001 01 SUFFICIENT AND ALL OF ACCEPTABLE QUALITY
+ 0002 01 SUFFICIENT BUT PARTLY OF ACCEPTABLE QUALITY
+ 0003 01 INSUFFICIENT BUT ALL OF ACCEPTABLE QUALITY
+ 0004 01 INSUFFICIENT AND OF UNACCEPTABLE QUALITY
+ 0005 01 SOME MESSAGES NOT COMPLETE
+ 0006 02 SUSPECT OR WRONGLY CODED GROUPS COULD NOT BE INTERPRETED CON
+ FIDENTLY
+ 0007 01 GROSS CODING ERRORS
+ 0008 01 TRANSMISSION SEQUENTIAL ORDER NOT OBSERVED
+ 0009 01 REPORT COMPLETELY GARBLED AND THUS DISCARDED
+ 0010 01 DEFICIENCIES IDENTIFIED AND RECTIFIED
+ 0011 01 DEFICIENCIES IDENTIFIED BUT NOT RECTIFIED
+ 0012 01 DEFICIENCIES NOT IDENTIFIED
+ 0013 01 MEASURING ERRORS
+ 0014 01 MUTUAL INCONSISTENCY
+ 0015 01 TEMPORAL INCONSISTENCY
+ 0016 01 FORECAST ERROR
+ 0017 01 BIAS
+ 0018 01 IMPROVE SYSTEM OF QUALITY CONTROL
+ 0019 01 EXPAND TRAINING PROGRAMMES
+ 0123 01 MISSING VALUE
+035032 0010 0001 01 DATA GROUPS MISSING DUE TO RADIO FADING
+ 0002 01 DATA GROUPS MISSING DUE TO OUTAGE OF CENTRE
+ 0003 01 DATA GROUPS MISSING DUE TO OUTAGE OF CIRCUIT
+ 0004 01 NON-IMPLEMENTATION OR MAINTENANCE OF REQUIRED RBSN DENSITY
+ 0005 01 SHORTAGE OF QUALIFIED STAFF TO MAN STATIONS
+ 0006 01 LACK OF CONSUMABLES
+ 0007 01 INSTRUMENT FAILURE
+ 0008 01 NON-ADHERENCE TO TELECOMMUNICATION PROCEDURES
+ 0009 01 SOME OBSERVING PROGRAMMES CEASED
+ 0015 01 MISSING VALUE
+035033 0012 0001 01 NO DEFICIENCY
+ 0002 01 OBSERVATIONS NOT MADE REGULARLY
+ 0003 01 OBSERVATIONS NOT MADE AT RIGHT TIME
+ 0004 01 OBSERVATIONS MADE BUT NOT DISSEMINATED
+ 0005 01 OBSERVATIONS MADE AND SENT TO INCORRECT USERS
+ 0006 01 COLLECTION NOT RECEIVED
+ 0007 01 COLLECTION TRANSMITTED LATE
+ 0008 01 COLLECTION NOT TRANSMITTED
+ 0009 02 DIFFICULTIES IN HF PROPAGATION AND SELECTION OF SUITABLE FRE
+ QUENCY
+ 0010 02 DIFFICULTIES IN MAINTENANCE OF COMMUNICATION EQUIPMENT AT RE
+ MOTE STATIONS
+ 0011 02 NO ALTERNATIVE ARRANGEMENT FOR ROUTEING METEOROLOGICAL OBSER
+ VATION
+ 0123 01 MISSING VALUE
+035034 0007 0001 01 SLIGHT IMPROVEMENT
+ 0002 01 SIGNIFICANT IMPROVEMENT
+ 0003 01 MOST SIGNIFICANT IMPROVEMENT
+ 0004 01 STEADY
+ 0005 01 DECREASING
+ 0006 01 EFFORTS REQUIRED TO IMPROVE NIGHT-TIME OBSERVATIONS
+ 0007 01 MISSING VALUE
+033035 0016 0000 01 RESERVED
+ 0001 01 BALLOON BURST
+ 0002 01 BALLOON FORCED DOWN BY ICING
+ 0003 01 LEAKING OR FLOATING BALLOON
+ 0004 01 WEAK OR FADING SIGNAL
+ 0005 01 BATTERY FAILURE
+ 0006 01 GROUND EQUIPMENT FAILURE
+ 0007 01 SIGNAL INTERFERENCE
+ 0008 01 RADIOSONDE FAILURE
+ 0009 01 EXCESSIVE MISSING DATA FRAMES
+ 0010 01 RESERVED
+ 0011 01 EXCESSIVE MISSING TEMPERATURE
+ 0012 01 EXCESSIVE MISSING PRESSURE
+ 0013 01 USER TERMINATED
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+040011 0004 0001 01 MEAN SEA SURFACE (MSS) INTERPOLATION FLAG
+ 0002 02 OCEAN TIDE SOLUTION 1 INTERPOLATION FLAG (0= 4 POINTS OVER O
+ CEAN, 1=LESS THAN 4 POINTS)
+ 0003 02 OCEAN TIDE SOLUTION 2 INTERPOLATION FLAG (0= 4 POINTS OVER O
+ CEAN, 1=LESS THAN 4 POINTS)
+ 0004 02 METEOROLOGICAL DATA INTERPOLATION FLAG (0= 4 POINTS OVER OCE
+ AN, 1=LESS THAN 4 POINTS)
+040012 0003 0001 01 18.7 GHZ BRIGHTNESS TEMPERATURE
+ 0002 01 23.8 GHZ BRIGHTNESS TEMPERATURE
+ 0003 01 34 GHZ BRIGHTNESS TEMPERATURE
+040013 0005 0000 01 INTERPOLATION WITH NO GAP BETWEEN JMR DATA
+ 0001 01 INTERPOLATION WITH GAP BETWEEN JMR DATA
+ 0002 01 EXTRAOLATION OF JMR DATA
+ 0003 01 FAILURE OF EXTRAPOLATION AND INTERPOLATION
+ 0007 01 MISSING VALUE
+049194 0014 0001 01 PASSED QUALITY CONTROL
+ 0002 01 OUTSIDE TIME WINDOW
+ 0003 01 ABOVE LAND
+ 0004 01 OUTSIDE ENTIRE GRID
+ 0005 01 WAVE HEIGHT OUT OF RANGE
+ 0006 01 TOO HIGH ALONG TRACK JUMP
+ 0007 01 TOO SHORT ALONG TRACK JUMP
+ 0008 01 TOO HIGH ALONG TRACK VARIANCE
+ 0009 01 OUTSIDE CONFIDENCE LIMIT
+ 0010 01 DOUBLE OBSERVATION
+ 0011 01 PEAKINESS ABOVE THRESHOLD
+ 0012 01 RESERVED
+ 0013 01 RESERVED
+ 0014 01 RESERVED
+049193 0014 0001 01 EXELLENT (COST LESS THAN 0.1)
+ 0002 01 GOOD (COST LESS THAN 0.5)
+ 0003 01 QUESTIONABLE (COST LARGER THAN 0.5)
+ 0004 01 RESULTS UNTABLE
+ 0005 01 OBSERVED SAR SPECTRUM REJECTED
+ 0006 01 WAM FIRST GUESS REJECTED
+ 0007 01 SIMULATED SAR REJECTED
+ 0008 01 NO AZIMUTH CUT-OFF ADJUSTMENT
+ 0009 01 RESERVED
+ 0010 01 RESERVED
+ 0011 01 RESERVED
+ 0012 01 RESERVED
+ 0013 01 RESERVED
+ 0014 01 RESERVED
diff --git a/bufrtables/C0000000000098014001.TXT b/bufrtables/C0000000000098014001.TXT
new file mode 100755
index 0000000..4f0f41f
--- /dev/null
+++ b/bufrtables/C0000000000098014001.TXT
@@ -0,0 +1,6040 @@
+001003 0008 0000 01 ANTARCTICA
+ 0001 01 REGION I
+ 0002 01 REGION II
+ 0003 01 REGION III
+ 0004 01 REGION IV
+ 0005 01 REGION V
+ 0006 01 REGION VI
+ 0007 01 MISSING VALUE
+001007 0132 0001 01 ERS 1
+ 0002 01 ERS 2
+ 0003 01 METOP-1
+ 0004 01 METOP-2
+ 0005 01 METOP-3
+ 0020 01 SPOT1
+ 0021 01 SPOT2
+ 0022 01 SPOT3
+ 0023 01 SPOT4
+ 0040 01 OERSTED
+ 0041 01 CHAMP
+ 0042 01 TERRASAR-X
+ 0050 01 METEOSAT 3
+ 0051 01 METEOSAT 4
+ 0052 01 METEOSAT 5
+ 0053 01 METEOSAT 6
+ 0054 01 METEOSAT 7
+ 0055 01 METEOSAT 8
+ 0056 01 METEOSAT 9
+ 0057 01 METEOSAT 10
+ 0058 01 METEOSAT 1
+ 0059 01 METEOSAT 2
+ 0060 01 ENVISAT
+ 0070 01 METEOSAT 11
+ 0120 01 ADEOS
+ 0121 01 ADEOS II
+ 0150 01 GMS 3
+ 0151 01 GMS 4
+ 0152 01 GMS 5
+ 0171 01 MTSAT-1R
+ 0172 01 MTSAT-2
+ 0200 01 NOAA 8
+ 0201 01 NOAA 9
+ 0202 01 NOAA 10
+ 0203 01 NOAA 11
+ 0204 01 NOAA 12
+ 0205 01 NOAA 14
+ 0206 01 NOAA 15
+ 0207 01 NOAA 16
+ 0208 01 NOAA 17
+ 0209 01 NOAA 18
+ 0220 01 LANDSAT 5
+ 0221 01 LANDSAT 4
+ 0222 01 LANDSAT 7
+ 0240 01 DMSP 7
+ 0241 01 DMSP 8
+ 0242 01 DMSP 9
+ 0243 01 DMSP 10
+ 0244 01 DMSP 11
+ 0245 01 DMSP 12
+ 0246 01 DMSP 13
+ 0247 01 DMSP 14
+ 0248 01 DMSP 15
+ 0249 01 DMSP 16
+ 0250 01 GOES 6
+ 0251 01 GOES 7
+ 0252 01 GOES 8
+ 0253 01 GOES 9
+ 0254 01 GOES 10
+ 0255 01 GOES 11
+ 0256 01 GOES 12
+ 0257 01 GOES 13
+ 0258 01 GOES 14
+ 0259 01 GOES 15
+ 0260 01 JASON-1
+ 0261 01 JASON-2
+ 0281 01 QUIKSCAT
+ 0282 01 TRMM
+ 0283 01 CORIOLIS
+ 0285 01 DMSP17
+ 0310 01 GOMS 1
+ 0311 01 GOMS 2
+ 0320 01 METEOR 2-21
+ 0321 01 METEOR 3-5
+ 0322 01 METEOR 3M-1
+ 0323 01 METEOR 3M-2
+ 0341 01 RESURS 01-4
+ 0430 01 INSAT 1B
+ 0431 01 INSAT 1C
+ 0432 01 INSAT 1D
+ 0450 01 INSAT 2A
+ 0451 01 INSAT 2B
+ 0452 01 INSAT 2E
+ 0470 01 INSAT 3A
+ 0471 01 INSAT 3D
+ 0472 01 INSAT 3E
+ 0500 01 FY-1C
+ 0501 01 FY-1D
+ 0510 01 FY-2
+ 0512 01 FY-2B
+ 0513 01 FY-2C
+ 0514 01 FY-2D
+ 0700 01 TIROS M (ITOS 1)
+ 0701 01 NOAA 1
+ 0702 01 NOAA 2
+ 0703 01 NOAA 3
+ 0704 01 NOAA 4
+ 0705 01 NOAA 5
+ 0706 01 NOAA 6
+ 0707 01 NOAA 7
+ 0708 01 TIROS-N
+ 0710 01 GOES (SMS 1)
+ 0711 01 GOES (SMS 2)
+ 0720 01 TOPEX
+ 0721 01 GFO (GEOSAT FOLLOW ON)
+ 0722 01 GRACE A
+ 0723 01 GRACE B
+ 0731 01 GOES 1
+ 0732 01 GOES 2
+ 0733 01 GOES 3
+ 0734 01 GOES 4
+ 0735 01 GOES 5
+ 0740 01 COSMIC-1
+ 0741 01 COSMIC-2
+ 0742 01 COSMIC-3
+ 0743 01 COSMIC-4
+ 0744 01 COSMIC-5
+ 0745 01 COSMIC-6
+ 0763 01 NIMBUS 3
+ 0764 01 NIMBUS 4
+ 0765 01 NIMBUS 5
+ 0766 01 NIMBUS 6
+ 0767 01 NIMBUS 7
+ 0780 01 ERBS
+ 0781 01 UARS
+ 0782 01 EARTH PROBE
+ 0783 01 TERRA
+ 0784 01 AQUA
+ 0785 01 AURA
+ 0800 01 SUNSAT
+ 0820 01 SAC-C
+ 1023 01 MISSIN VALUE
+001031 0218 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+001032 0041 0001 01 PREPROCESSING CONSISTENCY CHECK
+ 0010 01 BIAS CORRECTION
+ 0020 01 BLACK LIST
+ 0030 01 OI MASS AND WIND ANALYSIS, REPORT STATUS
+ 0031 01 OI HUMIDITY ANALYSIS, REPORT STATUS
+ 0032 01 OI ANALYSIS VARIABLES
+ 0033 01 OI ANALYSIS, FIRST GUESS Q/C
+ 0034 01 OI ANALYSIS, FINAL ANALYSIS Q/C
+ 0035 01 OI ANALYSIS, EVENT FLAGS
+ 0040 01 DYNAMIC INITIALISATION SCHEME
+ 0041 01 NORMAL MODE INITIALISATION SCHEME
+ 0050 01 SURFACE ANALYSIS, REPORT STATUS
+ 0051 01 SURFACE ANALYSIS VARIABLES
+ 0052 01 SURFACE ANALYSIS Q/C
+ 0053 01 SURFACE ANALYSIS, EVENT FLAGS
+ 0060 01 3D VAR REPORT STATUS
+ 0061 01 3D VAR ANALYSIS VARIABLES
+ 0062 01 3D VAR Q/C
+ 0063 01 3D VAR EVENT FLAGS
+ 0080 01 PRESAT FIRST GUESS
+ 0081 01 PRESAT ERROR STANDARD DEVIATIONS
+ 0082 01 PRESAT BIAS ESTIMATES
+ 0083 01 PRESAT BRIGHTNESS TEMPERATURE QUALITY FLAGS
+ 0084 01 PRESAT SAMARY FLAGS
+ 0090 01 FIRST GUESS (6 HOUR FORECAST)
+ 0091 01 FIRST GUESS (FGAT INTERPOLATED)
+ 0100 01 PRESCAT AMBIGUITY REMOVAL
+ 0110 01 WAM FIRST GUESS
+ 0111 01 WAM ANALYSIS
+ 0112 01 WAM FORECAST
+ 0113 01 WAM Q/C
+ 0201 01 COLLOCATION WITH SURFACE DATA
+ 0202 01 COLLOCATION WITH TEMP/PILOT DATA
+ 0203 01 COLLOCATION WITH AIREP DATA
+ 0204 01 COLLOCATION WITH SATOB DATA
+ 0205 01 COLLOCATION WITH TOVS DATA
+ 0206 01 COLLOCATION WITH ERS1 SCATTEROMETER DATA
+ 0207 01 COLLOCATION WITH ERS1 ALTIMETER DATA
+ 0220 01 ERS1 SCATTEROMETER COLLOCATION BLACK LIST
+ 0230 01 GAUSS ERROR
+ 0231 01 GROSS ERROR
+001033 0218 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+001035 0219 0000 01 WMO SECRETARIAT
+ 0001 01 MELBOURNE
+ 0002 01 MELBOURNE
+ 0003 01 MELBOURNE
+ 0004 01 MOSCOW
+ 0005 01 MOSCOW
+ 0006 01 MOSCOW
+ 0007 02 US NATIONAL WEATHER SERVICE, NATIONAL CENTRES FOR ENVIRONMEN
+ TAL PREDICTION(NCEP)
+ 0008 02 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONSGATEWAY (NWSTG
+ )
+ 0009 01 US NATIONAL WEATHER SERVICE - OTHER
+ 0010 01 CAIRO (RSMC)
+ 0011 01 CAIRO (RSMC)
+ 0012 01 DAKAR (RSMC)
+ 0013 01 DAKAR (RSMC)
+ 0014 01 NAIROBI (RSMC)
+ 0015 01 NAIROBI (RSMC)
+ 0016 01 CASABLANCA (RSMC)
+ 0017 01 TUNIS (RSMC)
+ 0018 01 TUNIS CASABLANCA (RSMC)
+ 0019 01 TUNIS CASABLANCA (RSMC)
+ 0020 01 LAS PALMAS
+ 0021 01 ALGIERS (RSMC)
+ 0022 01 ACMAD
+ 0023 01 MOZAMBIQUE NMC
+ 0024 01 PRETORIA (RSMC)
+ 0025 01 LA R�UNION (RSMC)
+ 0026 01 KHABAROVSK (RSMC)
+ 0027 01 KHABAROVSK (RSMC)
+ 0028 01 NEW DELHI (RSMC)
+ 0029 01 NEW DELHI (RSMC)
+ 0030 01 NOVOSIBIRSK (RSMC)
+ 0031 01 NOVOSIBIRSK (RSMC)
+ 0032 01 TASHKENT (RSMC)
+ 0033 01 JEDDAH (RSMC)
+ 0034 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0035 01 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+ 0036 01 BANGKOK
+ 0037 01 ULAN BATOR
+ 0038 01 BEIJING (RSMC)
+ 0039 01 BEIJING (RSMC)
+ 0040 01 SEOUL
+ 0041 01 BUENOS AIRES (RSMC)
+ 0042 01 BUENOS AIRES (RSMC)
+ 0043 01 BRASILIA (RSMC)
+ 0044 01 BRASILIA (RSMC)
+ 0045 01 SANTIAGO
+ 0046 01 BRAZILIAN SPACE AGENCY - INPE
+ 0047 01 COLOMBIA NMC
+ 0048 01 ECUADOR NMC
+ 0049 01 PERU NMC
+ 0050 01 VENEZUELA NMC
+ 0051 01 MIAMI (RSMC)
+ 0052 01 MIAMI RSMC, NATIONAL HURRICANE CENTER
+ 0053 01 MONTREAL (RSMC)
+ 0054 01 MONTREAL (RSMC)
+ 0055 01 SAN FRANCISCO
+ 0056 01 ARINC CENTRE
+ 0057 01 U.S. AIR FORCE AIR FORCE GLOBAL WEATHER CENTRAL
+ 0058 02 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTERE
+ Y, CA
+ 0059 01 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, USA
+ 0060 02 UNITED STATES NATIONAL CENTRE FOR ATMOSPHERIC RESEARCH (NCAR
+ )
+ 0061 01 SERVICE ARGOS - LANDOVER
+ 0062 01 U.S. NAVAL OCEANOGRAPHIC OFFICE
+ 0063 02 IRI (INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIET
+ Y)
+ 0064 01 HONOLULU (RSMC)
+ 0065 01 DARWIN (RSMC)
+ 0066 01 DARWIN (RSMC)
+ 0067 01 MELBOURNE (RSMC)
+ 0069 01 WELLINGTON (RSMC)
+ 0070 01 WELLINGTON (RSMC)
+ 0071 01 NADI (RSMC)
+ 0072 01 SINGAPORE
+ 0073 01 MALAYSIA NMC
+ 0074 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0075 01 UK METEOROLOGICAL OFFICE - EXETER (RSMC)
+ 0076 01 MOSCOW (RSMC)
+ 0078 01 OFFENBACH (RSMC)
+ 0079 01 OFFENBACH (RSMC)
+ 0080 01 ROME (RSMC)
+ 0081 01 ROME (RSMC)
+ 0082 01 NORRK�PING
+ 0083 01 NORRK�PING
+ 0084 01 TOULOUSE (RSMC)
+ 0085 01 TOULOUSE (RSMC)
+ 0086 01 HELSINKI
+ 0087 01 BELGRADE
+ 0088 01 OSLO
+ 0089 01 PRAGUE
+ 0090 01 EPISKOPI
+ 0091 01 ANKARA
+ 0092 01 FRANKFURT/MAIN)
+ 0093 01 LONDON (WAFC)
+ 0094 01 COPENHAGEN
+ 0095 01 ROTA
+ 0096 01 ATHENS
+ 0097 01 EUROPEAN SPACE AGENCY (ESA)
+ 0098 01 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECAST (ECMWF)
+ 0099 01 DE BILT
+ 0100 01 BRAZZAVILLE
+ 0101 01 ABIDJAN
+ 0102 01 LIBYAN ARAB JAMAHIRIYA NMC
+ 0103 01 MADAGASCAR NMC
+ 0104 01 MAURITIUS NMC
+ 0105 01 NIGER NMC
+ 0106 01 SEYCHELLES NMC
+ 0107 01 UGANDA NMC
+ 0108 01 TANZANIA NMC
+ 0109 01 ZIMBABWE NMC
+ 0110 01 HONG-KONG, CHINA
+ 0111 01 AFGHANISTAN NMC
+ 0112 01 BAHRAIN NMC
+ 0113 01 BANGLADESH NMC
+ 0114 01 BHUTAN NMC
+ 0115 01 CAMBODIA NMC
+ 0116 01 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA NMC
+ 0117 01 ISLAMIC REPUBLIC OF IRAN NMC
+ 0118 01 IRAQ NMC
+ 0119 01 KAZAKHSTAN NMC
+ 0120 01 KUWAIT NMC
+ 0121 01 KYRGYZ REPUBLIC NMC
+ 0122 01 LAO PEOPLE'S DEMOCRATIC REPUBLIC NMC
+ 0123 01 MACAO, CHINA
+ 0124 01 MALDIVES NMC
+ 0125 01 MYANMAR NMC
+ 0126 01 NEPAL NMC
+ 0127 01 OMAN NMC
+ 0128 01 PAKISTAN NMC
+ 0129 01 QATAR NMC
+ 0130 01 REPUBLIC OF YEMEN NMC
+ 0131 01 SRI LANKA NMC
+ 0132 01 TAJIKISTAN NMC
+ 0133 01 TURKMENISTAN NMC
+ 0134 01 UNITED ARAB EMIRATES NMC
+ 0135 01 UZBEKISTAN NMC
+ 0136 01 SOCIALIST REPUBLIC OF VIET NAM NMC
+ 0140 01 BOLIVIA NMC
+ 0141 01 GUYANA NMC
+ 0142 01 PARAGUAY NMC
+ 0143 01 SURINAME NMC
+ 0144 01 URUGUAY NMC
+ 0145 01 FRENCH GUYANA
+ 0146 01 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+ 0150 01 ANTIGUA AND BARBUDA NMC
+ 0151 01 BAHAMAS NMC
+ 0152 01 BARBADOS NMC
+ 0153 01 BELIZE NMC
+ 0154 01 BRITISH CARIBBEAN TERRITORIES CENTRE
+ 0155 01 SAN JOSE
+ 0156 01 CUBA NMC
+ 0157 01 DOMINICA NMC
+ 0158 01 DOMINICAN REPUBLIC NMC
+ 0159 01 EL SALVADOR NMC
+ 0160 01 US NOAA/NESDIS
+ 0161 01 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+ 0162 01 GUATEMALA NMC
+ 0163 01 HAITI NMC
+ 0164 01 HONDURAS NMC
+ 0165 01 JAMAICA NMC
+ 0166 01 MEXICO
+ 0167 01 NETHERLANDS ANTILLES AND ARUBA NMC
+ 0168 01 NICARAGUA NMC
+ 0169 01 PANAMA NMC
+ 0170 01 SAINT LUCIA NMC
+ 0171 01 TRINIDAD AND TOBAGO NMC
+ 0172 01 FRENCH DEPARTMENTS IN RA IV
+ 0173 01 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+ 0190 01 COOK ISLANDS NMC
+ 0191 01 FRENCH POLYNESIA NMC
+ 0192 01 TONGA NMC
+ 0193 01 VANUATU NMC
+ 0194 01 BRUNEI DARUSSALAM NMC
+ 0195 01 INDONESIA NMC
+ 0196 01 KIRIBATI NMC
+ 0197 01 FEDERATED STATES OF MICRONESIA NMC
+ 0198 01 NEW CALEDONIA NMC
+ 0199 01 NIUE
+ 0200 01 PAPUA NEW GUINEA NMC
+ 0201 01 PHILIPPINES NMC
+ 0202 01 SAMOA NMC
+ 0203 01 SOLOMON ISLANDS NMC
+ 0210 01 FRASCATI (ESA/ESRIN)
+ 0211 01 LANNION
+ 0212 01 LISBOA
+ 0213 01 REYKJAVIK
+ 0214 01 MADRID
+ 0215 01 Z�RICH
+ 0216 01 SERVICE ARGOS TOULOUSE
+ 0217 01 BRATISLAVA
+ 0218 01 BUDAPEST
+ 0219 01 LJUBLJANA
+ 0220 01 WARSAW
+ 0221 01 ZAGREB
+ 0222 01 ALBANIA NMC
+ 0223 01 ARMENIA NMC
+ 0224 01 AUSTRIA NMC
+ 0225 01 AZERBAIJAN NMC
+ 0226 01 BELARUS NMC
+ 0227 01 BELGIUM NMC
+ 0228 01 BOSNIA AND HERZEGOVINA NMC
+ 0229 01 BULGARIA NMC
+ 0230 01 CYPRUS NMC
+ 0231 01 ESTONIA NMC
+ 0232 01 GEORGIA NMC
+ 0233 01 DUBLIN
+ 0234 01 ISRAEL NMC
+ 0235 01 JORDAN NMC
+ 0236 01 LATVIA NMC
+ 0237 01 LEBANON NMC
+ 0238 01 LITHUANIA NMC
+ 0239 01 LUXEMBOURG
+ 0240 01 MALTA NMC
+ 0241 01 MONACO
+ 0242 01 ROMANIA NMC
+ 0243 01 SYRIAN ARAB REPUBLIC NMC
+ 0244 01 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA NMC
+ 0245 01 UKRAINE NMC
+ 0246 01 REPUBLIC OF MOLDOVA NMC
+ 0254 01 EUMETSAT OPERATION CENTRE
+ 0255 01 MISSING VALUE
+001090 0005 0000 01 LAF (LAGGED-AVERAGE FORECASTING)
+ 0001 01 BREEDING
+ 0002 01 SINGULAR VECTOR
+ 0003 01 MULTIPLE ANALYSIS CYCLE
+ 0255 01 MISSING VALUE
+001092 0005 0000 01 UNPERTURBED HIGH-RESOLUTION CONTROL FORECAST
+ 0001 01 UNPERTURBED LOW-RESOLUTION CONTROL FORECAST
+ 0002 01 NEGATIVELY PERTURBED FORECAST
+ 0003 01 POSITIVELY PERTURBED FORECAST
+ 0255 01 MISSING VALUE
+002001 0004 0000 01 AUTOMATIC STATION
+ 0001 01 MANNED STATION
+ 0002 01 HYBRID, BOTH MANNED AND AUTOMATIC
+ 0003 01 MISSING VALUE
+002002 0004 0000 01 MEASURED IN M S-1 UNLESS OTHERWISE INDICATED
+ 0001 01 CERTIFIED INSTRUMENTS
+ 0002 01 ORIGINALY MEASURED IN KNOTS
+ 0003 01 ORIGINALY MEASURED IN KM/H
+002003 0012 0000 01 PRESSURE INSTRUMENT ASSOCIATED WITH WIND-MEASURING EQUIPMENT
+ 0001 01 OPTICAL THEODOLITE
+ 0002 01 RADIO THEODOLITE
+ 0003 01 RADAR
+ 0004 01 VLF-OMEGA
+ 0005 01 LORAN C
+ 0006 01 WIND PROFILER
+ 0007 01 SATELLITE NAVIGATION
+ 0008 01 RADIO-ACOUSTIC SOUNDING SYSTEM (RASS)
+ 0009 01 SODAR
+ 0014 02 PRESSURE INSTRUMENT ASSOCIATED WITH WIND MEASUREMENT EQUIPME
+ NT BUT PRESSURE ELEMENT FAILED DURING ASCENT
+ 0015 01 MISSING VALUE
+002004 0011 0000 01 USA OPEN PAN EVAPORIMETER (WITHOUT COVER)
+ 0001 01 USA OPEN PAN EVAPORIMETER (MESH COVERED)
+ 0002 01 GGI-300 EVAPORIMETER (SUNKEN)
+ 0003 01 20 M**2 TANK
+ 0004 01 OTHERS
+ 0005 01 RICE
+ 0006 01 WHEAT
+ 0007 01 MAIZE
+ 0008 01 SORGHUM
+ 0009 01 OTHER CROPS
+ 0015 01 MISSING VALUE
+002011 0054 0000 01 RESERVED
+ 0001 01 RESERVED
+ 0002 01 NO RADIOSONDE-PASSIVE TARGET(E.G.REFLECTOR)
+ 0003 01 NO RADIOSONDE-ACTIVE TARGET(E.G.TRANSPONDER)
+ 0004 01 NO RADIOSONDE-PASSIVE TEMPERATURE-HUMIDITY PROFILER
+ 0005 01 NO RADIOSONDE-ACTIVE TEMPERATURE-HUMIDITY PROFILER
+ 0006 01 NO RADIOSONDE-RADIO ACOUSTIC SOUNDER
+ 0009 01 NO RADIOSONDE-SYSTEM UNKNOWN OR NOT SPECIFIED
+ 0010 01 RS VIZ TYPE A (USA)
+ 0011 01 RS VIZ TYPE B (USA)
+ 0012 01 RS SDC (SPACE DATA CORPORATION-USA)
+ 0013 01 ASTOR (NO LONGER MADE-AUSTRALIA)
+ 0014 01 VIZ MARK I MICROSONDE(USA)
+ 0015 01 EEC COMPANY TYPE 23 (USA)
+ 0016 01 ELIN (AUSTRIA)
+ 0017 01 GRAW G. (GERMANY)
+ 0019 01 GRAW M60 (GERMANY)
+ 0020 01 INDIAN MET SERVICE MK3 (INDIA)
+ 0021 01 VIZ/JIN YANG MARK I MICROSONDE(SOUTH KOREA)
+ 0022 01 MEISEI RS2-80 (JAPAN)
+ 0023 01 MESURAL FMO 1950A (FRANCE)
+ 0024 01 MESURAL FMO 19455A (FRANCE)
+ 0025 01 MESURAL MH73A (FRANCE)
+ 0026 01 METEOLABOR BASORA (SWITZERLAND)
+ 0027 01 AVK-MRZ (USSR)
+ 0028 01 METEORIT MARZ2-1 (USSR)
+ 0029 01 METEIRIT MARZ2-2 (USSR)
+ 0030 01 OKI RS2-80 (JAPAN)
+ 0031 01 VIZ/VALCOM TYPE A PRESSURE-COMMUTATED(CANADA)
+ 0032 01 SHANGAI RADIO (CHINA)
+ 0033 01 UK MET OFFICE MK3( UK)
+ 0034 01 VINOHRADY(CZECHOSLOVAKIA)
+ 0035 01 VAISALA RS18 (FINLAND)
+ 0036 01 VAISALA RS21 (FINLAND)
+ 0037 01 VAISALA RS80 (FINLAND)
+ 0038 01 VIZ LOCATE (LORAN-C)(USA)
+ 0039 01 SPRENGER E076 (GERMANY)
+ 0040 01 SPRENGER E084 (GERMANY)
+ 0041 01 SPRENGER E085 (GERMANY)
+ 0042 01 SPRENGER E086 (GERMANY)
+ 0043 01 AIR IS -4A-1680 (UK)
+ 0044 01 AIR IS -4A-1680 X (UK)
+ 0045 01 RS MSS(USA)
+ 0046 01 AIR IS -4A-403(USA)
+ 0047 01 MEISLEI RS2-91(JAPAN)
+ 0048 01 VALCOM(CANADA)
+ 0049 01 VIZ MARK II(USA)
+ 0060 01 VAISALA RS80/MICROCORA (FINLAND)
+ 0061 01 VAISALA RS80/DIGCORA OR MARWIN (FINLAND)
+ 0062 01 VAISALA RS80/PCCORA (FINLAND)
+ 0063 01 VAISALA RS80/STAR (FINLAND)
+ 0064 03 ORBITAL,SCIENCE CORPORATION,SPACE DATA DIVISION,TRANSPONDER
+ RADIOSONDE,TYPE 909-11-XX,WHERE XX CORRECPOND TO THE MODEL
+ OF THE INSTRUMENT
+ 0065 01 VIZ TRANSPONDER RADIOSONDE,MODEL NUMBER 1499-520(USA)
+ 0255 01 MISSING VALUE
+002012 0001 0000 01 TO BE DEVELOPED
+002013 0009 0000 01 NO CORRECTION
+ 0001 01 CIMO SOLAR CORRECTED AND CIMO INFRARED CORRECTED
+ 0002 01 CIMO SOLAR CORRECTED AND IFRARED CORRECTED
+ 0003 01 CIMO SOLAR CORRECTED ONLY
+ 0004 02 SOLAR AND INFRARED CORRECTED AUTOMATICALLY BY RADIOSONDE SY
+ STEM
+ 0005 01 SOLAR CORRECTED AUTOMATICALLY BY RADIOSONDE SYSTEM
+ 0006 01 SOLAR AND INFRARED CORRECTED AS SPECIFIED BY COUNTRY
+ 0007 01 SOLAR CORRECTED AS SPECIFIED BY COUNTRY
+ 0015 01 MISSING VALUE
+002014 0050 0000 01 NO WINDFINDING
+ 0001 01 AUTOMATIC WITH AUXILIARY OPTICAL DIRECTION FINDING
+ 0002 01 AUTOMATIC WITH AUXILIARY RADIO DIRECTION FINDING
+ 0003 01 AUTOMATIC WITH AUXILIARY RANGING
+ 0004 01 NOT USED
+ 0005 01 AUTOMATIC WITH MULTIPLE VLF-OMEGA SIGNALS
+ 0006 01 AUTOMATIC CROSS CHAIN LORAN-C
+ 0007 01 AUTOMATIC WITH AUXILIARY WIND PROFILER
+ 0008 01 AUTOMATIC SATELLITE NAVIGATION
+ 0019 01 TRACKING TECHNIQUE NOT SPECIFIED
+ 0020 01 VESSEL STOPPED
+ 0021 01 VESSEL DIVERTED FROM ORIGINAL DESTINATION
+ 0022 01 VESSEL'S ARRIVAL DELAYED
+ 0023 01 CONTAINER DAMAGED
+ 0024 01 POWER FAILURE TO CONTAINER
+ 0029 01 OTHER PROBLEMS
+ 0030 01 MAJOR POWER PROBLEMS
+ 0031 01 UPS INOPERATIVE
+ 0032 01 RECEIVER HARDWARE PROBLEMS
+ 0033 01 RECEIVER SOFTWARE PROBLEMS
+ 0034 01 PROCESSOR HARDWARE PROBLEMS
+ 0035 01 PROCESSOR SOFTWARE PROBLEMS
+ 0036 01 NAVAID SYSTEM DAMAGED
+ 0037 01 SHORTAGE OF LIFTING GAS
+ 0039 01 OTHER PROBLEMS
+ 0040 01 MECHANICAL DEFECT
+ 0041 01 MATERIAL DEFECT (HAND LAUNCHER)
+ 0042 01 POWER FAILURE
+ 0043 01 CONTROL FAILURE
+ 0044 01 PNEUMATIC/HYDRAULIC FAILURE
+ 0045 01 OTHER PROBLEMS
+ 0046 01 COMPRESSOR PROBLEMS
+ 0047 01 BALLOON PROBLEMS
+ 0048 01 BALLOON RELEASE PROBLEMS
+ 0049 01 LAUNCHER DAMAGED
+ 0050 01 R/S RECEIVER ANTENNA DEFECT
+ 0051 01 NAVAID ANTENNA DEFECT
+ 0052 01 R/S RECEIVER CABLING (ANTENNA DEFECT)
+ 0053 01 NAVAID ANTENNA CABLING DEFECT
+ 0059 01 OTHER PROBLEMS
+ 0060 01 ASAP COMMUNICATIONS DEFECT
+ 0061 01 COMMUNICATIONS FACILITY REJECTED DATA
+ 0062 01 NO POWER AT TRANSMITTINGANTENN
+ 0063 01 ANTENNA CABLE BROKEN
+ 0064 01 ANTENNA CABLE DEFECT
+ 0065 01 MESSAGE TRANSMITTED POWER BELOW NORMAL
+ 0069 01 OTHER PROBLEMS
+ 0070 01 ALL SYSTEMS IN NORMAL OPERATION
+ 0099 01 STATUS OF SYSTEM AND ITS COMPONENTS NOT SPECIFIED
+ 0127 01 MISSING VALUE
+002015 0006 0001 01 PRESSURE ONLY RADIOSONDE
+ 0002 01 PRESSURE ONLY RADIOSONDE PLUS TRANSPONDER
+ 0003 01 PRESSURE ONLY RADIOSONDE PLUS RADAR REFLECTOR
+ 0004 01 NO PRESSURE RADIOSONDE PLUS TRANSPONDER
+ 0005 01 NO PRESSURE RADIOSONDE PLUS RADAR REFLECTOR
+ 0015 01 MISSING VALUE
+002016 0004 0001 01 TRAIN REGULATOR
+ 0002 01 LIGHT UNIT
+ 0003 01 PARACHUTE
+ 0004 01 ROOFTOP RELEASE
+002019 0296 0010 02 BNSC RADIOMETER AATSR ADVANCED ALONG TRACK SCANNIN
+ G RADIOMETER
+ 0011 02 BNSC RADIOMETER ATSR ALONG TRACK SCANNING RADIOME
+ TER
+ 0012 02 BNSC RADIOMETER ATSR-2 ALONG TRACK SCANNING RADIOME
+ TER -2
+ 0013 01 BNSC RADIOMETER MWR MICROWAVE RADIOMETER
+ 0030 01 CNES COMMUNICATIONS ARGOS
+ 0040 01 CNES LIDAR LASER REFLECTORS
+ 0041 02 CNES LIDAR DORIS DOPPLER ORBITOGRAPHY AND RADIO-POSIT
+ IONING INTEGRATED BY SATELLITE
+ 0042 02 CNES LIDAR DORIS-NG DOPPLER ORBITOGRAPHY AND RAD
+ IO-POSITIONING INTEGRATED BY SATELLITE-NG
+ 0047 03 CNES RADAR ALTIMETERS POSEIDON-1 (SSALT-1) POSI
+ TIONING OCEAN SOLID EARTH ICE DYNAMICS ORBITING NAVIGATOR (S
+ INGLE FREQUENCY SOLID STATE RADAR ALTIMETER)
+ 0048 03 CNES RADAR ALTIMETERS POSEIDON-2 (SSALT-2) POSI
+ TIONING OCEAN SOLID EARTH ICE DYNAMICS ORBITING NAVIGATOR (D
+ UAL FREQUENCY SOLID STATE RADAR ALTIMETER)
+ 0050 01 CNES IMAGER RADIOMETER ATSR/M ATSR/M
+ 0051 01 CNES HIGH RESOLUTION OPTICAL IMAGERS HRG
+ 0052 01 CNES RADIOMETER HRV HIGH RESOLUTION VISIBLE
+ 0053 02 CNES RADIOMETER HRVIR HIGH RESOLUTION VISIBLE AND
+ INFRA-RED
+ 0054 02 CNES RADIOMETER SCARAB/MV2 SCANNER FOR EARTH'S
+ RADIATION BUDGET
+ 0055 01 CNES RADIOMETER POLDER POLDER
+ 0060 01 CNES SPECTROMETER VEGETATION VEGETATION
+ 0061 01 CNES SPECTROMETER WINDII WINDII
+ 0080 01 CSA COMMUNICATIONS RADARSAT DTT
+ 0081 01 CSA COMMUNICATIONS RADARSAT TTC
+ 0085 02 CSA RADAR SAR (CSA) SYNTHETIC APERTURE RADAR (CS
+ A)
+ 0090 02 CSA RADIOMETER MOPITT MEASUREMENTS OF POLLUTION IN
+ THE TROPOSPHERE
+ 0091 02 CSA CHEMISTRY INSTRUMENTS OSIRIS OPTICAL SPECTROGRAPH
+ AND INFRA-RED IMAGING SYSTEM
+ 0097 01 CSIRO RADIOMETER PANCHROMATIC IMAGER
+ 0098 02 CRCSS ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GPS
+ RECEIVER
+ 0102 02 DLR RADIOMETER CHAMP GPS SOUNDER GPS TURBORO
+ GUE SPACE RECEIVER (TRSR)
+ 0103 01 UNKNOWN
+ 0116 03 DLR MAGNETOMETER IGOR CHAMP GRAVITY PACKAGE (ACCELEROMETE
+ R+GPS) INTEGRATED GPS AND OCCULTATION RECEIVER STAR AC
+ CELEROMETER
+ 0117 03 DLR MAGNETOMETER CHAMP MAGNETOMETRY PACKAGE (1 SCALAR
+ +2 VECTOR MAGNETOMETER) OVERHAUSER MAGNETOMETER (OVM) AN
+ D FLUXGATE MAGNETOMETER (FGM)
+ 0120 02 ESA COMMUNICATIONS ENVISAT COMMS COMMUNICATIONS PACKA
+ GE ON ENVISAT
+ 0121 02 ESA COMMUNICATIONS ERS COMMS COMMUNICATION PACKAG
+ E FOR ERS
+ 0130 01 ESA LIDARS ALADIN ATMOSPHERIC LASER DOPPLER INSTRUMENT
+ 0131 01 ESA LIDARS ATLID ATMOSPHERIC LIDAR
+ 0140 02 ESA RADAR AMI/SAR/IMAGE ACTIVE MICROWAVE INSTRUMENTA
+ TION. IMAGE MODE
+ 0141 02 ESA RADAR AMI/SAR/WAVE ACTIVE MICROWAVE INSTRUMENTA
+ TION. WAVE MODE
+ 0142 02 ESA RADAR AMI/SCATTEROMETER ACTIVE MICROWAVE INS
+ TRUMENTATION. WIND MODE
+ 0143 01 ESA RADAR ASAR ASAR
+ 0144 02 ESA IMAGING MICROWAVE RADARS ASAR ADVANCED SYN
+ TETIC APERTURA RADAR (IMAGE MODE)
+ 0145 02 ESA IMAGING MICROWAVE RADARS ASAR ADVANCED SYN
+ TETIC APERTURA RADAR (WAVE MODE)
+ 0146 01 ESA CLOUD PROFILE AND RAIN RADARS CPR CLOUD RADAR
+ 0147 01 ESA RADAR RA-2/MWR RADAR ALTIMETER - 2
+ 0148 01 ESA RADAR RA/MWR RADAR ALTIMETER
+ 0150 01 ESA SCATTEROMETERS SCATTEROMETER SCATTEROMETER
+ 0161 02 ESA RADIOMETER MIPAS MICHELSON INTERFEROMETRIC PA
+ SSIVE ATMOSPHERE SOUNDER
+ 0162 02 ESA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E MWR-2 MICROWAVE RADIOMETER-2
+ 0163 03 ESA ATMOSPHERIC CHEMISTRY INSTRUMENTS SOPRANO SUB-
+ MILIMETRE OBSERVATION OF PROCESSES IN THE ABSORPTION NOTEWOR
+ THY FOR OZONE
+ 0170 02 ESA ATMOSPHERIC CHEMISTRY INSTRUMENTS GOME I GLOB
+ AL OZONE MONITORING EXPERIMENT
+ 0172 02 ESA SPECTROMETER GOMOS GLOBAL OZONE MONITORING BY O
+ CCULTATION OF STARS
+ 0174 02 ESA SPECTROMETER MERIS MEDIUM RESOLUTION IMAGING SP
+ ECTROMETER
+ 0175 02 ESA SPECTROMETER SCIAMACHY SCANNING IMAGING ABS
+ ORPTION SPECTROMETER FOR ATMOSPHERIC CARTOGRAPHY
+ 0181 02 EUMETSAT COMMUNICATIONS METEOSAT COMMS COMMUNICATIO
+ NS PACKAGE FOR METEOSAT
+ 0182 02 EUMETSAT COMMUNICATIONS MSG COMMS COMMUNICATIO
+ NS PACKAGE FOR MSG
+ 0190 02 ESA/ EUMETSAT SCATTEROMETERS ASCAT ADVANCED SCATTE
+ ROMETER
+ 0200 02 EUMETSAT RADIOMETER GERB GEOSTATIONARY EARTH
+ RADIATION BUDGET
+ 0202 02 ESA/ EUMETSAT RADIOMETER GRAS GNSS RECEIVER F
+ OR ATMOSPHERIC SOUNDING
+ 0203 02 EUMETSAT RADIOMETER MHS MICROWAVE HUMIDITY S
+ OUNDER
+ 0205 02 EUMETSAT RADIOMETER MVIRI METEOSAT VISIBLE AND
+ INFRA-RED IMAGER
+ 0207 02 EUMETSAT RADIOMETER SEVIRI SPINNING ENHANCED VI
+ SIBLE AND INFRARED IMAGER
+ 0208 02 EUMETSAT IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR)
+ VIRI VIRI
+ 0220 02 ESA/ EUMETSAT SPECTROMETER GOME-2 GLOBAL OZONE MO
+ NITORING EXPERIMENT - 2
+ 0221 03 CNES/ EUMETSAT ATMOSPHERIC TEMPERATURE AND HUMIDITY S
+ OUNDERS IASI INFRA-RED ATMOSPHERIC SOUNDING INTERFEROME
+ TER
+ 0240 02 CAST COMMUNICATIONS DCP DATA COLLECTION PLATFORM TRA
+ NSPONDER
+ 0245 01 CAST RADIOMETER CCD HIGH RESOLUTION CCD CAMERA
+ 0246 02 INPE ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS HSB
+ HUMIDITY SOUNDER/BRAZIL
+ 0248 02 INPE IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) OBA
+ OBSERVADOR BRASILEIRO DA AMAZONIA
+ 0250 01 CAST RADIOMETER WFI WIDE FIELD IMAGER
+ 0255 02 CAST SPECTROMETER IRMSS INFRA RED MULTI SPECTRAL SCA
+ NNER
+ 0260 01 ISRO PRECISION ORBIT BSS & FSS TRANSPONDERS
+ 0261 01 ISRO PRECISION ORBIT DRT-S&R
+ 0262 02 ISRO COMMUNICATIONS INSAT COMMS COMMUNICATIONS PACKA
+ GE FOR INSAT
+ 0268 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS HR-PAN HIGH RESOLUT
+ ION PANCHROMATIC CAMERA
+ 0269 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) MSMR MULTIFREQUENCY SCANNING MICROWAVE RADIOMETER
+ 0270 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VHRR
+ VERY HIGH RESOLUTION RADIOMETER
+ 0271 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) WIFS
+ WIDE FIELD SENSOR
+ 0275 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS AWIFS ADVANCED WID
+ E FIELD SENSOR
+ 0276 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-I LINEAR IMAGI
+ NG SELF SCANNER - I
+ 0277 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-II LINEAR IMAGI
+ NG SELF SCANNER - II
+ 0278 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-III LINE
+ AR IMAGING SELF SCANNER - III
+ 0279 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS LISS-IV LINEAR IMAGI
+ NG SELF SCANNER - IV
+ 0284 02 ISRO HIGH RESOLUTION OPTICAL IMAGERS PAN PANCHROMATIC
+ SENSOR
+ 0285 02 ISRO IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MOS
+ MODULAR OPTO-ELECTRONIC SCANNER
+ 0286 02 ISRO OCEAN COLOUR INSTRUMENTS OCM OCEAN COLOUR
+ MONITOR
+ 0290 02 JMA COMMUNICATIONS MTSAT COMMS COMMUNICATIONS PACKA
+ GE FOR MTSAT
+ 0294 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS IMAGER/MTSAT
+ -1R IMAGER/MTSAT
+ 0295 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS IMAGER/MTSAT
+ IMAGER/MTSAT
+ 0296 02 JMA IMAGING MULTI-SPECTRAL RADIOMETERS VISSR (GMS4)
+ VISIBLE AND INFRA-RED SPIN SCAN RADIOMETER (GMS4)
+ 0300 01 NASA LIDARS GLAS GEOSCIENCE LASER ALTIMETER SYSTEM
+ 0301 01 NASA PRECISION ORBIT LRA LASER RETROREFLECTOR ARRAY
+ 0302 01 NASA LIDARS MBLA MULTI BEAM LASER ALTIMETER
+ 0309 02 NASA CLOUD PROFILE AND RAIN RADARS CPR (CLOUDSAT) CLOU
+ D PROFILING RADAR
+ 0312 01 NASA RADAR NSCAT NASA SCATTEROMETER
+ 0313 01 NASA RADAR SEAWINDS ADEOS II - NASA SCATTEROMETER
+ 0330 02 NASA EARTH RADIATION BUDGET RADIOMETER ACRIM ACTI
+ VE CAVITY RADIOMETER IRRADIANCE MONITOR
+ 0334 02 NASA TOTAL AND PROFILE OZONE BUV BACKSCATTER ULTRAVIO
+ LET INSTRUMENT
+ 0336 02 NASA HIGH RESOLUTION OPTICAL IMAGERS ALI ADVANCED LAN
+ D IMAGER
+ 0347 02 NASA HIGH RESOLUTION OPTICAL IMAGERS ASTER ADVANCED SPA
+ CEBORNE THERMAL EMISSION AND REFLECTION RADIOMETER
+ 0348 02 NASA EARTH RADIATION BUDGET RADIOMETER CERES-2 CLOU
+ D AND THE EARTH'S RADIANT ENERGY SYSTEM
+ 0351 02 CONAE ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GPSD
+ R GPS DEMONSTRATION RECEIVER
+ 0353 02 NASA TOTAL AND PROFILE OZONE HIRDLS HIGH RESOLUTION DYNA
+ MICS LIMB SOUNDER
+ 0354 02 NASA TOTAL AND PROFILE OZONE HRDI HIGH RESOLUTION DOPP
+ LER IMAGER
+ 0356 01 NASA RADIOMETER LIS LIGHTNING IMAGING SENSOR
+ 0358 02 NASA MAGNETIC FIELD, AUROAL IMAGERYSCINTILLATION BOUNDARY
+ PEM PARTICLE ENVIRONMENT MONITOR
+ 0359 02 NASA OCEAN COLOUR INSTRUMENTS SEAWIFS SEA-VIEWING
+ WIDE FIELD-OF-VIEW SENSOR
+ 0360 02 NASA EARTH RADIATION BUDGET RADIOMETER SUSIM (UARS)
+ SOLAR ULTRAVIOLET IRRADIANCE MONITOR
+ 0363 02 NASA TOTAL AND PROFILE OZONE SBUV/1 SOLAR BACKSCATTER UL
+ TRAVIOLET 1 INSTRUMENT
+ 0365 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) TMI TRMM MICROWAVE IMAGER
+ 0366 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) JMR JASON-1 MICROWAVE RADIOMETER
+ 0369 02 NASA TOTAL AND PROFILE OZONE LIMS LIMB INFRARED MONITO
+ R OF THE STRATOSPHERE
+ 0370 02 NASA TOTAL AND PROFILE OZONE LRIR LIMB RADIANCE INVERS
+ ION RADIOMETER INSTRUMENT
+ 0371 02 NASA TOTAL AND PROFILE OZONE EPIC EARTH POLYCHROMATIC
+ IMAGING CAMERA
+ 0372 02 NASA EARTH RADIATION BUDGET RADIOMETER NISTAR NIST
+ ADVANCED RADIOMETER
+ 0373 02 NASA MAGNETIC FIELD, AUROAL IMAGERY SCINTILLATION BOUNDAR
+ Y PLASMA-MAG
+ 0374 01 NASA OTHER XPS XUV PHOTOMETER SYSTEM
+ 0375 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIRS
+ VISIBLE INFRA-RED SCANNER
+ 0376 03 CNES MULTIPLE DIRECTION/POLARISATION RADIOMETERS POLD
+ ER II POLARIZATION AND DIRECTIONALITY OF THE EARTH'S R
+ EFLECTANCE - II
+ 0377 02 NASA EARTH RADIATION BUDGET RADIOMETER TIM TOTA
+ L IRRADIANCE MONITOR
+ 0379 02 NASA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) WFC
+ WIDE FIELD CAMERA
+ 0382 02 NASA SPECTRO-RADIOMETER CLAES CRYOGENIC LIMB ARRAY
+ ETALON SPECTROMETER
+ 0383 02 NASA SPECTRO-RADIOMETER HALOE HALOGEN OCCULTATION
+ EXPERIMENT
+ 0384 02 NASA SPECTRO-RADIOMETER ISAMS IMPROVED STRATOSPHER
+ IC AND MESOSPHERIC SOUNDER
+ 0385 02 NASA SPECTRO-RADIOMETER MISR MULTI-ANGLE IMAGING
+ SPECTRORADIOMETER
+ 0386 01 NASA SPECTRO-RADIOMETER MLS MICROWAVE LIMB SOUNDER
+ 0387 02 NASA SPECTRO-RADIOMETER MLS (EOS-AURA) MICROWAVE LIMB
+ SOUNDER (EOS-AURA)
+ 0389 02 NASA SPECTRO-RADIOMETER MODIS MODERATE-RESOLUTION
+ IMAGING SPECTRORADIOMETER
+ 0393 02 NASA GRAVITY HAIRS HIGH ACCURACY INTER-SATELLITE RANGIN
+ G SYSTEM
+ 0394 02 NASA TOTAL AND PROFILE OZONE OMI OZONE MEASURING INST
+ RUMENT
+ 0395 02 NASA RADIOMETER ATMOSPHERIC CORRECTOR ATMOSPHERIC
+ CORRECTOR
+ 0396 01 NASA RADIOMETER HYPERION HYPERSPECTRAL IMAGER
+ 0399 02 NASA SPECTRO-RADIOMETER SAGE I STRATOSPHERIC AEROSO
+ L AND GAS EXPERIMENT-I
+ 0400 02 NASA SPECTRO-RADIOMETER SAGE II STRATOSPHERIC AEROSO
+ L AND GAS EXPERIMENT-II
+ 0401 02 NASA SPECTRO-RADIOMETER SAGE III STRATOSPHERI
+ C AEROSOL AND GAS EXPERIMENT-III
+ 0402 02 NASA SPECTRO-RADIOMETER SAMS STRATOSPHERIC AND ME
+ SOSPHERIC SOUNDER
+ 0403 02 NASA SPECTRO-RADIOMETER SAM II STRATOSPHERIC AEROSO
+ L MEASUREMENT II
+ 0404 02 NASA SPECTRO-RADIOMETER IRIS INFRARED INTERFEROME
+ TER SPECTROMETER
+ 0405 02 NASA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS GIFT
+ S GEOSYNCHRONOUS IMAGING FOURIER TRANSFORM SPECTROMETER
+ 0420 01 NASA SPECTROMETER AIRS ATMOSPHERIC INFRA-RED SOUNDER
+ 0426 02 NASA SPECTROMETER SOLSTICE SOLAR STELLAR IRRADI
+ ANCE COMPARISON EXPERIMENT
+ 0430 02 NASA SPECTROMETER TES TROPOSHPERIC EMISSION SPECTR
+ OMETER
+ 0431 02 NASA SPECTROMETER TOMS TOTAL OZONE MAPPING SPECTROM
+ ETER
+ 0450 02 JAXA COMMUNICATIONS ADEOS COMMS COMMUNICATIONS PACKA
+ GE FOR ADEOS
+ 0451 02 JAXA COMMUNICATIONS DCS (JAXA) DATA COLLECTION SYST
+ EM (JAXA)
+ 0453 02 JAXA COMMUNICATIONS GMS COMMS COMMUNICATIONS PACKA
+ GE ON GMS
+ 0454 02 JAXA COMMUNICATIONS JERS-1 COMMS COMMUNICATIONS PACKA
+ GE FOR JERS-1
+ 0460 01 JAXA LIDAR RIS RETROREFLECTOR IN SPACE
+ 0461 01 JAXA RADAR PR PRECIPITATION RADAR
+ 0462 02 JAXA IMAGING MICROWAVE RADARS SAR SYNTETIC APE
+ RTURE RADAR
+ 0470 02 JAXA IMAGING MICROWAVE RADARS PALSAR PHASED ARRAY
+ TYPE L-BAND SYNTHETIC APERTURE RADAR
+ 0479 02 JAXA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) AMSR-E ADVANCED MICROWAVE SCANNING RADIOMETER-EOS
+ 0480 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS PRISM (ALOS) PANC
+ HROMATIC REMOTE-SENSING INSTRUMENT FOR STEREO MAPPING
+ 0481 02 JAXA RADIOMETER AMSR ADVANCED MICROWAVE SCANNING
+ RADIOMETER
+ 0482 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS AVNIR ADVANCED VIS
+ IBLE AND NEAR INFRARED RADIOMETER
+ 0483 02 JAXA HIGH RESOLUTION OPTICAL IMAGERS AVNIR-2 ADVANCED VIS
+ IBLE AND NEAR INFRA-RED RADIOMETER TYPE 2
+ 0484 01 JAXA IMAGER GLI GLOBAL IMAGER
+ 0485 02 JAXA RADIOMETER MESSR MULTISPECTRAL ELECTRONIC SEL
+ F SCANNING RADIOMETER
+ 0486 01 JAXA RADIOMETER MSR MICROWAVE SCANNING RADIOMETER
+ 0487 02 JAXA RADIOMETER OCTS OCEAN COLOR AND TEMPERATURE S
+ CANNER
+ 0488 01 JAXA RADIOMETER OPS OPTICAL SENSOR
+ 0489 02 JAXA SPECTRO-RADIOMETER VISSR (GMS5) VISIBLE AND
+ INFRA-RED SPIN SCAN RADIOMETER (GMS5)
+ 0490 02 JAXA RADIOMETER VTIR VISIBLE AND THERMAL INFRA-RE
+ D RADIOMETER
+ 0510 02 JAXA SPECTROMETER ILAS-I IMOROVED LIMB ATOMOSPHIRIC S
+ PECTROMETER
+ 0511 02 JAXA SPECTROMETER ILAS-II IMPROVED LIMB ATOMOSPHIRIC S
+ PECTROMETER
+ 0512 02 JAXA SPECTROMETER IMG INFEROMETRIC MONITOR OF GREE
+ NHOUSE GASES
+ 0514 02 JAXA SPACE ENVIRONMENT SEM SPACE ENVIRONMENT MO
+ NITOR (JAXA)
+ 0515 02 JAXA TOTAL AND PROFILE OZONE SOFIS SOLAR OCCULTATION FO
+ URIER TRANSFORM SPECTROMETER FOR INCLINED ORBIT SATELLITE
+ 0540 02 NOAA COMMUNICATIONS DCS (NOAA) DATA COLLECTION SYST
+ EM (NOAA)
+ 0541 02 NOAA COMMUNICATIONS GOES COMMS COMMUNICATIONS PACKA
+ GE ON GOES
+ 0542 02 NOAA COMMUNICATIONS LANDSAT COMMS COMMUNICATIONS PACKA
+ GE FOR LANDSAT
+ 0543 02 NOAA COMMUNICATIONS NOAA COMMS COMMUNICATIONS PACKA
+ GE FOR NOAA
+ 0544 01 NOAA COMMUNICATIONS S&R (GOES) SEARCH AND RESCUE
+ 0545 01 NOAA COMMUNICATIONS S&R (NOAA) SEARCH AND RESCUE
+ 0546 01 NOAA COMMUNICATIONS WEFAX WEATHER FACSIMILE
+ 0547 02 NOAA SPECTROMETER SEM(GOES) SPACE ENVIRONMENT MO
+ NITOR
+ 0550 01 NOAA MAGNETIC FIELD SSM SPECIAL SENSOR MAGNETOMETER
+ 0551 02 NOAA MAGNETIC FIELD SSJ/4 SPECIAL SENSOR PRECIPITATING
+ PLASMA MONITOR
+ 0552 02 NOAA SPACE ENVIRONMENT SSIES-2 SPECIAL SENSOR IONOS
+ PHERIC PLASMA DRIFT/SCINTILLATION METER
+ 0553 02 NOAA SPACE ENVIRONMENT SSB/X-2 SPECIAL SENSOR GAMMA
+ RAY PARTICLE DECTECTOR
+ 0570 02 NOAA RADIOMETER AMSU-A ADVANCED MICROWAVE SOUNDING
+ UNIT-A
+ 0574 02 NOAA RADIOMETER AMSU-B ADVANCED MICROWAVE SOUNDING
+ UNIT-B
+ 0580 02 NOAA RADIOMETER ATOVS (HIRS/3 + AMSU + AVHRR/3) ADVA
+ NCED TIROS OPERATIONAL VERTICAL SOUNDER
+ 0590 02 NOAA RADIOMETER AVHRR/2 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/2
+ 0591 02 NOAA RADIOMETER AVHRR/3 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/3
+ 0592 02 NOAA RADIOMETER AVHRR/4 ADVANCED VERY HIGH RESOLUTIO
+ N RADIOMETER/4
+ 0600 02 NOAA RADIOMETER ERBE EARTH'S RADIATION BUDGET EXP
+ ERIMENT
+ 0601 01 NOAA RADIOMETER ETM+ ENHANCED THEMATIC MAPPER
+ 0605 02 NOAA RADIOMETER HIRS/2 HIGH RESOLUTION INFRA-RED SO
+ UNDER/2
+ 0606 02 NOAA RADIOMETER HIRS/3 HIGH RESOLUTION INFRA-RED SO
+ UNDER/3
+ 0607 02 NOAA RADIOMETER HIRS/4 HIGH RESOLUTION INFRA-RED SO
+ UNDER/4
+ 0615 01 NOAA RADIOMETER IMAGER IMAGER
+ 0616 02 NOAA IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIIR
+ S VISIBLE/INFRARED IMAGER RADIOMETER SUITE
+ 0620 02 NOAA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS CRIR
+ S/NP CROSS TRACK INFRA-RED SOUNDER/NPOESS
+ 0621 02 NOAA ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS ATMS
+ ADVANCED TECHNOLOGY MICROWAVE SOUNDER
+ 0622 01 NOAA RADIOMETER MSS MULTISPECTRAL SCANNING SYSTEM
+ 0623 01 NOAA RADIOMETER MSU MICROWAVE SOUNDING UNIT
+ 0624 02 NOAA RADIOMETER SBUV/2 SOLAR BACKSCATTTER ULTRA-VIO
+ LET INSTRUMENT/2
+ 0625 02 NOAA RADIOMETER SBUV/3 SOLAR BACKSCATTTER ULTRA-VIO
+ LET INSTRUMENT/3
+ 0626 01 NOAA RADIOMETER SOUNDER SOUNDER
+ 0627 01 NOAA RADIOMETER SSU STRATOSPHERIC SOUNDING UNIT
+ 0628 01 NOAA RADIOMETER TM THEMATIC MAPPER
+ 0629 02 NOAA RADIOMETER TOVS (HIRS/2 + MSU + SSU) TIRO
+ S OPERATIONAL VERTICAL SOUNDER
+ 0630 01 NOAA RADIOMETER VAS VISSR ATMOSPHERIC SOUNDER
+ 0631 01 NOAA RADIOMETER SSZ
+ 0645 01 NOAA SPECTROMETER SEM SPACE ENVIRONMENT MONITOR
+ 0650 02 NRSCC RADIOMETER MVIRSR (10 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0651 02 NRSCC RADIOMETER MVIRSR (3 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0652 02 NRSCC RADIOMETER MVIRSR (5 CHANNEL) MULTISPECTRA
+ L VISIBLE AND INFRA-RED SCAN RADIOMETER
+ 0670 01 NSAU RADAR RLSBO SIDE LOOKING MICROWAVE RADAR
+ 0680 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS MSU-EU MULTI-SPECTR
+ AL RADIOMETER WITH HIGH RESOLUTION
+ 0681 02 NSAU IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MSU-
+ UM VISIBLE MULTI-SPECTRAL RADIOMETER
+ 0682 01 NSAU RADIOMETER RM-08 IMAGING MICROWAVE RADIOMETER
+ 0683 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS SU-UMS STEREO RADIO
+ METER WITH HIGH RESOLUTION
+ 0684 02 NSAU HIGH RESOLUTION OPTICAL IMAGERS SU-VR VISIBLE RADI
+ OMETER WITH HIGH RESOLUTION
+ 0685 01 NSAU RADIOMETER TRASSER
+ 0700 02 ROSCOSMOS COMMUNICATIONS KONDOR-2 DATA COLLECT
+ ION AND TRANSMISSION SYSTEM
+ 0701 01 ROSCOSMOS COMMUNICATIONS BRK
+ 0710 01 ROSCOSMOS LIDAR ALISSA BACKSCATTER LIDAR
+ 0712 01 ROSCOSMOS LIDAR BALKAN-2 LIDAR
+ 0715 01 ROSCOSMOS LIDAR MK-4
+ 0716 01 ROSCOSMOS LIDAR MK-4M
+ 0730 01 ROSCOSMOS RADAR GREBEN RADAR ALTIMETER
+ 0731 01 ROSCOSMOS RADAR SAR-10 SYNTETIC APERTURE RADAR
+ 0732 01 ROSCOSMOS RADAR SAR-3 SYNTETIC APERTURE RADAR
+ 0733 01 ROSCOSMOS RADAR SAR-70 SYNTETIC APERTURE RADAR
+ 0740 01 ROSCOSMOS RADAR SLR-3 SIDE LOOKING RADAR
+ 0745 01 ROSCOSMOS RADAR TRAVERS SAR
+ 0750 02 ROSCOSMOS RADIOMETER 174-K TEMPERATURE AND HUMI
+ DITY PROFILER
+ 0751 02 ROSCOSMOS RADIOMETER BTVK SCANNING TELEVISION
+ RADIOMETER
+ 0752 02 ROSCOSMOS RADIOMETER CHAIKA SCANNING IR RADIOMET
+ ER
+ 0753 02 ROSCOSMOS RADIOMETER DELTA-2 MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0755 02 ROSCOSMOS RADIOMETER IKAR-D MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0756 02 ROSCOSMOS RADIOMETER IKAR-N MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0757 02 ROSCOSMOS RADIOMETER IKAR-P MULTISPECTRAL MICROW
+ AVE SCANNER
+ 0760 01 ROSCOSMOS RADIOMETER ISP
+ 0761 02 ROSCOSMOS RADIOMETER KFA-1000 PHOTOGRAPHIC
+ CAMERA
+ 0762 01 ROSCOSMOS RADIOMETER KFA-200 PHOTOGRAPHIC CAMERA
+ 0763 02 ROSCOSMOS RADIOMETER KFA-3000 PHOTOGRAPHIC
+ CAMERA
+ 0770 01 ROSCOSMOS RADIOMETER KLIMAT SCANNING IR RADIOMETER
+ 0771 02 ROSCOSMOS RADIOMETER KLIMAT-2 SCANNING IR
+ RADIOMETER
+ 0775 01 ROSCOSMOS RADIOMETER MIRAS
+ 0776 01 ROSCOSMOS RADIOMETER MIVZA
+ 0777 02 ROSCOSMOS RADIOMETER MIVZA-M MICROWAVE SCANNING R
+ ADIOMETER
+ 0780 01 ROSCOSMOS RADIOMETER MR-2000
+ 0781 01 ROSCOSMOS RADIOMETER MR-2000M
+ 0785 02 ROSCOSMOS RADIOMETER MR-900 SCANNING TELEPHOTOME
+ TER
+ 0786 02 ROSCOSMOS RADIOMETER MR-900B SCANNING VISUAL BAND
+ TELEPHOTOMETER
+ 0790 02 ROSCOSMOS RADIOMETER MSU-E MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0791 02 ROSCOSMOS RADIOMETER MSU-E1 MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0792 02 ROSCOSMOS RADIOMETER MSU-E2 MULTISPECTRAL HIGH R
+ ESOLUTION ELECTRONIC SCANNER
+ 0793 01 ROSCOSMOS RADIOMETER MSU-M
+ 0794 02 ROSCOSMOS RADIOMETER MSU-S MULTISPECTRAL MEDIUM
+ RESOLUTION SCANNER
+ 0795 02 ROSCOSMOS RADIOMETER MSU-SK MULTISPECTRAL MEDIUM
+ RESOLUTION CONICAL SCANNER
+ 0796 02 ROSCOSMOS RADIOMETER MSU-V MULTISPECTRAL HIGH R
+ ESOLUTION CONICAL SCANNER
+ 0810 02 ROSCOSMOS RADIOMETER MTZA SCANNING MICROWAVE R
+ ADIOMETER
+ 0815 03 ROSCOSMOS IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE
+ MICROWAVE) MZOAS SCANNING MICROWAVE RADIO
+ METER
+ 0820 03 ROSCOSMOS IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE
+ MICROWAVE) R-225 SINGLE CHANNEL MICROWAVE
+ RADIOMETER
+ 0821 01 ROSCOSMOS RADIOMETER R-400
+ 0822 02 ROSCOSMOS RADIOMETER R-600 SINGLE CHANNEL MICRO
+ WAVE RADIOMETER
+ 0830 02 ROSCOSMOS RADIOMETER RMS RADIATION MEASUREMEN
+ T SYSTEM
+ 0835 01 ROSCOSMOS RADIOMETER TV CAMERA
+ 0836 01 ROSCOSMOS RADIOMETER SILVA
+ 0840 02 ROSCOSMOS SPECTRO-RADIOMETER SROSMO SPECTRORADIO
+ METER FOR OCEAN MONITORING
+ 0850 02 ROSCOSMOS SPECTROMETER BUFS-2 BACKSCATTER SPECTROM
+ ETER/2
+ 0851 02 ROSCOSMOS SPECTROMETER BUFS-4 BACKSCATTER SPECTROM
+ ETER/4
+ 0855 02 ROSCOSMOS SPECTROMETER ISTOK-1 INFRA-RED SPECTROMET
+ ER
+ 0856 02 ROSCOSMOS SPECTROMETER SFM-2 SPECTROMETER TO MEAS
+ URE DIRECT SOLAR RADIATION
+ 0857 01 ROSCOSMOS SPECTROMETER DOPI
+ 0858 01 ROSCOSMOS SPECTROMETER KGI-4
+ 0859 01 ROSCOSMOS SPECTROMETER OZON-M
+ 0860 01 ROSCOSMOS SPECTROMETER RMK-2
+ 0900 02 NOAA RADIOMETER MAXIE MAGNETOSPHERIC ATMOSPHERIC X
+ -RAY IMAGING EXPERIMENT
+ 0901 01 NOAA RADIOMETER OLS OPERATIONAL LINESCAN SYSTEM
+ 0905 02 NOAA RADIOMETER SSM/I MISSION SENSOR MICROWAVE IMA
+ GER
+ 0906 02 NOAA RADIOMETER SSM/T-1 MISSION SENSOR MICROWAVE TEM
+ PERATURE SOUNDER
+ 0907 02 NOAA RADIOMETER SSM/T-2 MISSION SENSOR MICROWAVE WAT
+ ER VAPOR SOUNDER
+ 0908 02 NOAA RADIOMETER SSMIS SPECIAL SENSOR MICROWAVE IMA
+ GER SOUNDER
+ 0910 01 NOAA RADIOMETER SXI SOLAR X-RAY IMAGER
+ 0930 02 NOAA SPECTROMETER EHIC ENERGETIC HEAVY ION COMPOSIT
+ ION EXPERIMENT
+ 0931 01 NOAA SPECTROMETER X-RAY ASTRONOMY PAYLOAD
+ 0932 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) IVIS
+ SR (FY-2) IMPROVED MULTISPECTRAL VISIBLE AND INFRA-RED SCA
+ N RADIOMETER (5 CHANNELS)
+ 0933 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS IRAS
+ INFRARED ATMOSPHERIC SOUNDER
+ 0934 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS MWAS
+ MICROWAVE ATMOSPHERIC SOUNDER
+ 0935 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS IMWA
+ S IMPROVED MICROWAVE ATMOSPHERIC SOUNDER
+ 0936 02 NRSCC ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS MWHS
+ MICROWAVE HUMIDITY SOUNDER
+ 0937 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) MVIR
+ S MODERATE RESOLUTION VISIBLE AND INFRARED IMAGING SPECTRO
+ RADIOMETER
+ 0938 02 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) MWRI MICROWAVE RADIATION IMAGER
+ 0940 02 ROSCOSMOS ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDER
+ S MTVZA-OK SCANNING MICROWAVE RADIOMETER
+ 0941 02 CNES ATMOSPHERIC TEMPERATURE AND HUMIDITY SOUNDERS SAPH
+ IR
+ 0944 01 NOAA RADAR ALTIMETERS ALT ALTIMETER
+ 0945 02 NOAA EARTH RADIATION BUDGET RADIOMETER TSIS TOTA
+ L SOLAR IRRADIANCE SENSOR
+ 0946 02 NOAA IMAGING MULTI-SPECTRAL RADIOMETERS (PASSIVE MICROWAV
+ E) CMIS CONICAL-SCANNING MICROWAVE IMAGER/SOUNDER
+ 0947 02 NOAA TOTAL AND PROFILE OZONE OMPS OZONE MAPPING AND PR
+ OFILER SUITE
+ 0948 03 NOAA SPACE ENVIRONMENT ATMOSPHERIC TEMPERATURE AND HUMIDI
+ TY SOUNDERS GPSOS GLOBAL POSITIONING SYSTEM OCCULTATION SE
+ NSOR
+ 0949 02 NOAA MAGNETIC FIELD, AUROAL IMAGERY SCINTILLATION BOUNDAR
+ Y SESS SPACE ENVIRONMENTAL SENSOR SUITE
+ 0950 03 NRSCC IMAGING MULTI-SPECTRAL RADIOMETERS (VIS/IR) VIRR
+ MULTISPECTRAL VISIBLE AND INFRA-RED SCAN RADIOMETER (10
+ CHANNELS
+ 0951 01 NRSCC TOTAL AND PROFILE OZONE TOM TOTAL OZONE MAPPER
+ 0952 01 NRSCC TOTAL AND PROFILE OZONE OP OZONE PROFILER
+ 2047 01 MISSING VALUE
+002020 0024 0000 01 NIMBUS
+ 0001 01 VTPR
+ 0002 01 TIROS 1 (TIROS, NOAA-6 TO NOAA-13)
+ 0003 01 TIROS 2 (NOAA-14 ONWARDS)
+ 0010 01 EOS
+ 0031 01 DMSP
+ 0061 01 EUMETSAT POLAR SYSTEM (EPS)
+ 0091 01 ERS
+ 0121 01 ADEOS
+ 0241 01 GOES
+ 0261 01 JASON
+ 0271 01 GMS
+ 0272 01 MTSAT
+ 0301 01 INSAT
+ 0331 01 METEOSAT OPERATIONAL PROGRAMME (MOP)
+ 0332 01 METEOSAT TRANSITIONAL PROGRAMME (MTP)
+ 0333 01 METEOSAT SECOND GENERATION PROGRAMME (MSG)
+ 0351 01 GOMS
+ 0380 01 FY-1
+ 0381 01 FY-2
+ 0401 01 GPS
+ 0402 01 GLONASS
+ 0403 01 GALILEO
+ 0511 01 MISSING VALUE
+002021 0008 0001 01 HIGH RESOLUTION INFRA RED SOUNDER (HIRS)
+ 0002 01 MICROWAVE SOUNDING UNIT (MSU )
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+002022 0005 0001 01 PROCESSING TECHNIQUE NOT DEFINED
+ 0002 01 AUTOMATED STATISTICAL REGRESSION
+ 0003 01 CLEAR PATH
+ 0004 01 PARTLY CLOUDY PATH
+ 0005 01 CLOUDY PATH
+002023 0012 0000 01 RESERVED
+ 0001 02 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE INFRARED
+ CHANNEL
+ 0002 01 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE VISIBLE CHANNEL
+ 0003 01 WIND DERIVED FROM CLOUD MOTION OBSERVED IN WATER VAPOUR CHANNEL
+ 0004 02 WIND DERIVED FROM MOTION OBSERVED IN COMBINATION OF SPECTRAL
+ CHANNELS
+ 0005 02 WIND DERIVED FROM MOTION OBSERVED IN THE WATER VAPOUR CHANNEL
+ IN CLEAR AIR
+ 0006 01 WIND DERIVED FROM MOTION OBSERVED IN THE OZONE CHANNEL
+ 0007 02 WIND DERIVED FROM MOTION OBSERVED IN WATER VAPOUR CHANNEL
+ (CLOUD OR CLEAR AIR NOT SPECIFIED)
+ 0008 01 WIND DERIVED FROM ALTIMETER
+ 0009 01 WIND DERIVED FROM RADIOMETER
+ 0013 01 ROOT MEAN SQUARE
+ 0015 01 MISSING VALUE
+002024 0003 0001 01 TABLE WITH FULL RANGE OF HUMIDITY VARIATION IN LAYER
+ 0002 01 REGRESSION TECHNIQUE ON 2 HUMIDITY VALUES IN LAYER
+ 0015 01 MISSING VALUE
+002025 0016 0001 01 RESERVED
+ 0002 01 HIRS
+ 0003 01 MSU
+ 0006 01 HIRS
+ 0007 01 MSU
+ 0010 01 HIRS(1, 2, 3, 8,9, 16, 17)
+ 0011 01 HIRS(1, 2, 3, 9, 17)
+ 0012 01 MSU
+ 0015 01 HIRS
+ 0016 01 HIRS
+ 0017 01 MSU
+ 0018 01 SKINTK(OCEAN ONLY)
+ 0021 01 HIRS
+ 0022 01 SSU
+ 0023 01 MSU (3 ,4)
+ 0025 01 MISSING
+002030 0007 0001 01 ADCP (ACOUSTIC DOPPLER CURRENT PROFILER)
+ 0002 01 GEK (GEOMAGNETIC ELECTRO KINETOGRAPH)
+ 0003 01 SHIPS'S SET AND DRIFT DETERMINED BY FIXES 3-6 HOURS APART
+ 0004 02 SHIPS'S SET AND DRIFT DETERMINED BY MORE THAN 6 HOURS
+ BUT LESS THAN 12 HOURS APART
+ 0005 01 DRIFT OF BUOY
+ 0006 01 ADCP (ACOUSTIC DOPPLER CURRENT PROFILER)
+ 0007 01 MISSIN VALUE
+002031 0021 0000 01 RESERVED
+ 0001 01 INSTANTANEOUS
+ 0002 01 AVERAGED OVER 3 MINUTES OR LESS
+ 0003 01 AVERAGED OVER MORE THAN 3 MINUTES, BUT 6 AT THE MOST
+ 0004 01 AVERAGED OVER MORE THAN 6 MINUTES, BUT 12 AT THE MOST
+ 0005 01 INSTANTANEOUS
+ 0006 01 AVERAGED OVER 3 MINUTES OR LESS
+ 0007 01 AVERAGED OVER MORE THAN 3 MINUTES, BUT 6 AT THE MOST
+ 0008 01 AVERAGED OVER MORE THAN 6 MINUTES, BUT 12 AT THE MOST
+ 0009 01 VECTOR OR DOPPLER CURRENT PROFILLING METHOD NOT USED
+ 0010 01 RESERVED
+ 0011 01 1 HOUR OR LESS
+ 0012 01 MORE THAN 1 HOUR BUT 2 AT THE MOST
+ 0013 01 MORE THAN 2 HOUR BUT 4 AT THE MOST
+ 0014 01 MORE THAN 4 HOUR BUT 8 AT THE MOST
+ 0015 01 MORE THAN 8 HOUR BUT 12 AT THE MOST
+ 0016 01 MORE THAN 12 HOUR BUT 18 AT THE MOST
+ 0017 01 MORE THAN 18 HOUR BUT 24 AT THE MOST
+ 0018 01 RESERVED
+ 0019 01 DRIFT METHOD NOT USED
+ 0031 01 MISSING
+002032 0004 0000 02 VALUES AT SELECTED DEPTHS (DATA POINTS FIXED BY THE INSTRUME
+ NT OR SELECTED BY ANY OTHER METHOD)
+ 0001 02 VALUES AT SIGNIFICANT DEPTHS (DATA POINTS TAKEN FROM TRACES
+ AT SIGNIFICANT DEPTHS)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002033 0005 0000 01 NO SALINITY MEASURED
+ 0001 01 IN SITU SENSOR, ACCURACY BETTER THAN 0.02 %
+ 0002 01 IN SITU SENSOR, ACCURACY LESS THAN 0.02 %
+ 0003 01 SAMPLE ANALYSIS
+ 0007 01 MISSING VALUE
+002034 0007 0000 01 UNSPECIFIED DROGUE
+ 0001 01 HOLEY SOCK
+ 0002 01 TRISTAR
+ 0003 01 WINDOW SHADE
+ 0004 01 PARACHUTE
+ 0005 01 NON-LAGRANGIAN SEA ANCHOR
+ 0031 01 MISSING VALUE
+002036 0004 0000 01 DRIFTING BUOY
+ 0001 01 FIXED BUOY
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002037 0007 0000 01 REASERVED
+ 0001 01 MANUAL READING FROM VERTICAL TIDE STAFF
+ 0002 01 MANUAL READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ 0003 01 MANUAL READING FROM MULTIPLE AUTOMATIC RECORDERS AT STATION
+ 0004 02 AUTOMATIC READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ WITHOUT LEVEL REFERENCE CHECK
+ 0005 02 AUTOMATIC READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+ WITH LEVEL REFERENCE CHECK,OR MULTIPLE AUTOMATIC RECORDERS
+ 0007 01 MISSING
+002038 0012 0000 01 SHIP INTAKE
+ 0001 01 BUCKET
+ 0002 01 HULL CONTACT SENSOR
+ 0003 01 REVERSING TERMOMETER
+ 0004 01 STD/CTD SENSOR
+ 0005 01 MECHANICAL BT
+ 0006 01 EXPANDABLE BT
+ 0007 01 DIGITAL BT
+ 0008 01 THERMISTOR CHAIN
+ 0009 01 INFRARED SCANNER
+ 0010 01 MICROWAVE SCANNER
+ 0015 01 MISSING VALUE
+002039 0005 0000 01 MEASURED WET-BULB TEMPERATURE
+ 0001 01 ICED BULB MEASURED WET-BULB TEMPERATURE
+ 0002 01 COMPUTED WET-BULB TEMPERATURE
+ 0003 01 ICED BULB COMPUTED WET-BULB TEMPERATURE
+ 0007 01 MISSING VALUE
+002040 0008 0000 01 SHIPS MOTION REMOVED BY AVARAGING
+ 0001 01 SHIPS MOTION REMOVED BY MOTION COMPENSATION
+ 0002 01 SHIPS MOTION NOT REMOVED
+ 0003 01 SHIPS MOTION REMOVED BY AVERAGING
+ 0004 01 SHIPS MOTION REMOVED BY MOTION COMPENSATION
+ 0005 01 SHIPS MOTION NOT REMOVED
+ 0006 01 DOPPLER CURRENT PROFILING METHOD NOT USED
+ 0015 01 MISSING VALUE
+002041 0006 0000 01 INFORMATION BASED ON MANUAL ANALYSIS
+ 0001 01 INFORMATION BASED ON COMPUTER ANALYSIS
+ 0002 01 INFORMATION BASED ON DATA ASSIMILATION
+ 0003 02 INFORMATION BASED ON COMPUTER ANALYSIS OR
+ DATA ASSIMILATION MANUALLY MODIFIED
+ 0010 01 INFORMATION BASED ON THE NUMERICAL WEATHER PREDICTION
+ 0063 01 MISSING VALUE
+002044 0006 0000 01 RESERVED
+ 0001 01 LONGUET-HIGGINS (1964)
+ 0002 01 LONGUET-HIGGINS (F3 METHOS)
+ 0003 01 MAXIMUM LIKELIHOOD METHOD
+ 0004 01 MAXIMUM ENTROPY METHOD
+ 0015 01 MISSING VALUE
+002045 0005 0000 01 SEA STATION
+ 0001 01 AUTOMATIC DATA BUOY
+ 0002 01 AIRCRAFT
+ 0003 01 SATELLITE
+ 0015 01 MISSING VALUE
+
+002046 0004 0000 01 RESERVED
+ 0001 01 HEAVE SENSOR
+ 0002 01 SLOPE SENSOR
+ 0015 01 MISSING VALUE
+002048 0012 0000 01 HIRS
+ 0001 01 MSU
+ 0002 01 SSU
+ 0003 01 AMSU-A
+ 0004 01 AMSU-B
+ 0005 01 AVHRR
+ 0006 01 SSMI
+ 0007 01 NSCAT
+ 0008 01 SEA WINDS
+ 0009 01 POSEIDON ALTIMETER
+ 0010 01 JMR (JASON MICROWAVE RADIOMETER)
+ 0015 01 MISSING VALUE
+002049 0004 0001 01 PROCESSING TECHNIQUE NOT DEFINED
+ 0002 01 SIMULTANIOUS PHISICAL RETRIEVAL
+ 0003 01 CLEAR SOUNDING
+ 0004 01 CLOUDY COUNDING
+002050 0019 0001 01 CHANNEL 1 14.71 MICROMETERS
+ 0002 01 CHANNEL 2 14.37 MICROMETERS
+ 0003 01 CHANNEL 3 14.06 MICROMETERS
+ 0004 01 CHANNEL 4 13.64 MICROMETERS
+ 0005 01 CHANNEL 5 13.37 MICROMETERS
+ 0006 01 CHANNEL 6 12.66 MICROMETERS
+ 0007 01 CHANNEL 7 12.02 MICROMETERS
+ 0008 01 CHANNEL 8 11.03 MICROMETERS
+ 0009 01 CHANNEL 9 9.71 MICROMETERS
+ 0010 01 CHANNEL 10 7.43 MICROMETERS
+ 0011 01 CHANNEL 11 7.02 MICROMETERS
+ 0012 01 CHANNEL 12 6.51 MICROMETERS
+ 0013 01 CHANNEL 13 4.57 MICROMETERS
+ 0014 01 CHANNEL 14 4.52 MICROMETERS
+ 0015 01 CHANNEL 15 4.45 MICROMETERS
+ 0016 01 CHANNEL 16 4.13 MICROMETERS
+ 0017 01 CHANNEL 17 3.98 MICROMETERS
+ 0018 01 CHANNEL 18 3.74 MICROMETERS
+ 0019 01 CHANNEL 19 0.969 MICROMETERS
+002051 0004 0001 01 MAXIMUM/MINIMUM THERMOMETERS
+ 0002 01 AUTOMATED INSTRUMENT
+ 0003 01 THERMOGRAPH
+ 0015 01 MISSING VALUE
+002052 0005 0001 01 CHANNEL 1 0.55-.75 MICROMETERS
+ 0002 01 CHANNEL 2 3.9 MICROMETERS
+ 0003 01 CHANNEL 3 6.7 MICROMETERS
+ 0004 01 CHANNEL 4 10.7 MICROMETERS
+ 0005 01 CHANNEL 5 12.0 MICROMETERS
+002053 0005 0000 01 OBSERVED BRIGHTNESS TEMPERATURES
+ 0001 01 BRIGHTNESS TEMPERATURE WITH BIAS CORRECTION APPLIED
+ 0002 01 BRIGHTNESS TEMPERATURE CALCULATED FROM FIRST GUESS
+ 0003 01 BRIGHTNESS TEMPERATURE CALCULATED FROM SOUNDING
+ 0015 01 MISSING VALUE
+002054 0006 0000 01 PARAMETER DERIVED USING OBSERVED SOUNDER BRIGHTNESS TEMPERATURES
+ 0001 01 PARAMETER DERIVED USING OBSERVED IMAGER BRIGHTNESS TEMPERATURES
+ 0002 01 PARAMETER DERIVED USING FIRST GUESS INFORMATION
+ 0003 01 PARAMETER DERIVED USING NMC ANALYSIS INFORMATION
+ 0004 01 PARAMETER DERIVED USING RADIOSONDE INFORMATION
+ 0015 01 MISSING VALUE
+002055 0010 0000 01 STATISTICS GENERATED COMPARING RETRIEVAL VERSUS RADIOSONDE
+ 0001 01 STATISTICS GENERATED COMPARING RETRIEVAL VERSUS FIRST GUESS
+ 0002 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS FIRST GUESS
+ 0003 01 STATISTICS GENERATED COMPARING OBSERVED VERSUS RETRIEVAL
+ 0004 01 STATISTICS GENERATED COMPARING OBSERVED VERSUS FORST GUESS
+ 0005 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS IMAGER
+ 0006 01 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS SOUNDER
+ 0007 01 STATISTICS GENERATED FOR RADIOSONDE
+ 0008 01 STATISTICS GENERATED FOR FIRST GUESS
+002056 0006 0000 01 SUMS OF DIFFERENCE
+ 0001 01 SUMS OF SQUARED DIFFERENCES
+ 0002 01 SAMPLE SIZE
+ 0003 01 MINIMUM DIFFERENCE
+ 0004 01 MAXIMUM DIFFERENCE
+ 0015 01 MISSING VALUE
+002057 0007 0000 01 NESTED GRID MODEL (NMG)
+ 0001 01 AVIATION MODEL(AVN)
+ 0002 01 MEDIUM RANGE FORECAST (MRF) MODEL
+ 0003 01 GLOBAL DATA ASSIMILATION SYSTEM (GDAS) FORECAST MODEL
+ 0004 01 PRIOR SOUNDINGS (WITHIN 3 HOURS OF CURRENT TIME)
+ 0005 01 CLIMATOLOGY
+002058 0005 0000 01 12 HOUR AND 18 HOUR
+ 0001 01 18 HOUR AND 24 HOUR
+ 0002 01 6 HOUR AND 12 HOUR
+ 0003 01 GREATER THAN 24 HOUR
+ 0015 01 MISSING VALUE
+002059 0005 0000 01 NCEP NESTED GRID MODEL ANALYSIS
+ 0001 01 NCEP AVIATION MODEL ANALYSIS
+ 0002 01 NCEP MEDIUM RANGE FORECAST MODEL ANALYSIS
+ 0003 01 NCEP GLOBAL DATA ASSIMILATION SYSTEM FORECAST MODEL ANALYSIS
+ 0015 01 MISSING VALUE
+002060 0007 0000 01 CURRENT SURFACE HOURLY REPORTS
+ 0001 01 CURRENT SHIP REPORTS
+ 0002 01 CURRENT BUOY REPORTS
+ 0003 01 ONE HOUR OLD SURFACE HOURLY REPORTS
+ 0004 01 ONE HOUR SHIP OLD REPORTS
+ 0005 01 ONE HOUR BUOY OLD REPORTS
+ 0015 01 MISSING VALUE
+002061 0003 0000 01 INERTIAL NAVIGATOR SYSTEM
+ 0001 01 OMEGA
+ 0007 01 MISSING VALUE
+002062 0007 0000 01 ASDAR
+ 0001 01 ASDAR(ACARS ALSO AVAILABLE BUT NOT OPERATIVE)
+ 0002 01 ASDAR(ACARS ALSO AVAILABLE AND OPERATIVE)
+ 0003 01 ACARS
+ 0004 01 ACARS(ASDAR ALSO AVALILABLE BUT NOT OPERATIVE)
+ 0005 01 ACARS(ASDAR ALSO AVAILABLE AND OPERATIVE)
+ 0015 01 MISSING VALUE
+002064 0004 0000 01 GOOD
+ 0001 01 BAD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+002066 0004 0000 01 TRS 2000
+ 0001 01 IMS 1500C
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+002070 0013 0000 01 ACTUAL LOCATION IN SECONDS
+ 0001 01 ACTUAL LOCATION IN MINUTES
+ 0002 01 ACTUAL LOCATION IN DEGREES
+ 0003 01 ACTUAL LOCATION IN DECIDEGREES
+ 0004 01 ACTUAL LOCATION OM CENTIDEGREES
+ 0005 01 REFERENCED TO CHECKPOINT IN SECONDS
+ 0006 01 REFERENCED TO CHECKPOINT IN MINUTES
+ 0007 01 REFERENCED TO CHECKPOINT IN DEGREES
+ 0008 01 REFERENCED TO CHECKPOINT IN DECIDEGREES
+ 0009 01 REFERENCED TO CHECKPOINT IN CENTIDEGREES
+ 0010 01 ACTUAL LOCATION IN TENTHS OF A MINUTE
+ 0011 01 REFERENCED TO CHECKPOINT IN TENTHS OF A MINUTE
+ 0015 01 MISSING VALUE
+002080 0005 0000 01 KAYSAM
+ 0001 01 TOTEX
+ 0002 01 KKS
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+002081 0009 0000 01 GP26
+ 0001 01 GP28
+ 0002 01 GP30
+ 0003 01 HM26
+ 0004 01 HM28
+ 0005 01 HM30
+ 0006 01 SV16
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002083 0006 0000 01 HIGH BAY
+ 0001 01 LOW BAY
+ 0002 01 BALLOON INFLATION LAUNCH SYSTEM (BILS)
+ 0003 01 ROOF-TOP BILS
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002084 0005 0000 01 HYDROGEN
+ 0001 01 HELIUM
+ 0002 01 NATURAL GAS
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002095 0005 0000 01 CAPACITANCE ANEROID
+ 0001 01 DERIVED FROM GPS
+ 0002 01 RESISTIVE STRAIN GAUGE
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002096 0005 0000 01 ROD THERMISTOR
+ 0001 01 BEAD THERMISTOR
+ 0002 01 CAPACITANCE BEAD
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002097 0008 0000 01 VIZ MARK II CARBON HYGRISTOR
+ 0001 01 VIZ B2 HYGRISTOR
+ 0002 01 VAISALA A-HUMICAP
+ 0003 01 VAISALA H-HUMICAP
+ 0004 01 CAPACITANCE SENSOR
+ 0005 01 VAISALA RS90
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002098 0005 0000 01 HH POLARISATION
+ 0001 01 VV POLARISATION
+ 0002 01 HV POLARISATION REAL VALUED COMPONENT
+ 0003 01 HV POLARISATION IMAGINARY VALUED COMPONENT
+ 0007 01 MISSING VALUE
+002101 0010 0000 01 CENTRE FRONT-FED PARABOLOID
+ 0001 01 OFFSET FRONT-FED PARABOLOID
+ 0002 01 CENTRE CASSEGRAIN PARABOLOID
+ 0003 01 OFFSET CASSEGRAIN PARABOLOID
+ 0004 01 PLANAR ARRAY
+ 0005 01 COAXIAL-COLLINEAR ARRAY
+ 0006 01 YAGI ELEMENTS ARRAY
+ 0007 01 MICROSTRIP
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002103 0002 0001 01 RADAR ANTENNA IS PROTECTED BY A RADOME
+ 0002 01 MISSING VALUE
+002104 0007 0000 01 HORIZONTAL POLARISATION
+ 0001 01 VERTICAL POLARISATION
+ 0002 01 RIGHT CIRCULAR POLARISATION
+ 0003 01 LEFT CIRCULAR POLARSZATION
+ 0004 01 HORIZONTAL AND VERTICAL POLARISATION
+ 0005 01 RIGHT AND LEFT CIRCULAR POLARISATION
+ 0015 01 MISSING VALUE
+002115 0007 0000 01 PDB
+ 0001 01 RSOIS
+ 0002 01 ASOS
+ 0003 01 PSYCHROMETER
+ 0004 01 F420
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+002119 0008 0000 01 INTERMEDIATE FREQUENCY CALIBRATION MODE (IFCAL)
+ 0001 01 BUILT-IN TEST EQUIPMENT DIGITAL (BITE DGT)
+ 0002 01 BUILT-IN TEST EQUIPMENT RADIO FREQUENCY (BITE RF)
+ 0003 01 PRESET TRACKING (PSET TRK)
+ 0004 01 PRESET LOOP OUT
+ 0005 01 ACQUISITION
+ 0006 01 TRACKING
+ 0007 01 MISSING VALUE
+002131 0001 0001 01 STC OPERATIONAL
+002143 0021 0000 01 RESERVED
+ 0001 01 BREWER SPECTROPHOTOMETER
+ 0002 01 CAVER TEICHERT
+ 0003 01 DOBSON
+ 0004 01 DOBSON (JAPAN)
+ 0005 01 EHMET
+ 0006 01 FECKER TELESCOPE
+ 0007 01 HOELPER
+ 0008 01 JODMETER
+ 0009 01 FILTER OZONOMETER M-83
+ 0010 01 MAST
+ 0011 01 OXFORD
+ 0012 01 PAETZOLD
+ 0013 01 REGENER
+ 0014 01 RESERVED FOR FUTURE USE
+ 0015 01 VASSY FILTER OZONOMETER
+ 0016 01 CARBON IODIDE
+ 0017 01 SURFACE OZONE BUBLER
+ 0018 01 FILTER OZONOMETER M-124
+ 0019 01 ECC SONDE
+ 0127 01 MISSING VALUE
+002144 0008 0000 01 DIRECT SUN
+ 0001 01 DIRECT SUN, ATTENUATOR #1
+ 0002 01 DIRECT SUN, ATTENUATOR #2
+ 0003 01 FOCUSSED MOON
+ 0004 01 FOCUSSED SUN
+ 0005 01 FOCUSSED SUN CORRECTED WITH ADJACENT SKY MEASUREMENTS
+ 0006 01 ZENITH SKY
+ 0015 01 MISSING VALUE
+002216 0017 0001 01 CALIBRATION/MEASUREMENT PULSE FLAG (1)
+ 0002 01 CALIBRATION/MEASUREMENT PULSE FLAG (2)
+ 0003 01 OUTER ANTENNA BEAM
+ 0004 01 SIGMA-0 CELL IS AFT OF SPACECRAFT
+ 0005 01 CURRENT MODE (1)
+ 0006 01 CURRENT MODE (2)
+ 0007 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (1)
+ 0008 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (2)
+ 0009 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (3)
+ 0010 01 LOW RESOLUTION MODE - WHOLE PULSE DATA
+ 0011 01 SCATTEROMETER ELECTRONIC SUBSYSTEM B
+ 0012 01 ALTERNATE SPIN RATE - 19.8 RPM
+ 0013 01 RECEIVER PROTECTION ON
+ 0014 01 SLICES PER COMPOSITE FLAG(1)
+ 0015 01 SLICES PER COMPOSITE FLAG(2)
+ 0016 01 SLICES PER COMPOSITE FLAG(3)
+ 0017 01 MISSING VALUE
+002131 0002 0001 01 STC OPERATIONAL
+ 0003 01 MISSING VALUE
+002143 0021 0000 01 RESERVED
+ 0001 01 BREWER SPECTROMETER
+ 0002 01 CAVER TEICHERT
+ 0003 01 DOBSON
+ 0004 01 DOBSON (JAPAN)
+ 0005 01 EHMET
+ 0006 01 FECKER TELESCOPE
+ 0007 01 HOELPER
+ 0008 01 JODMETER
+ 0009 01 FILTER OZONOMETER M-83
+ 0010 01 MAST
+ 0011 01 OXFORD
+ 0012 01 PAETZOLD
+ 0013 01 REGENER
+ 0014 01 RESERVED
+ 0015 01 VASSY FILTER OZONOMETER
+ 0016 01 CARBON IODIDE
+ 0017 01 SURFACE OZONE BUBLLER
+ 0018 01 FILTER OZONOMETER M-124
+ 0019 01 ECC SONDE
+ 0127 01 MISSING VALUE
+002144 0008 0000 01 DIRECT SUN, ATTENUATOR #0
+ 0001 01 DIRECT SUN, ATTENUATOR #1
+ 0002 01 DIRECT SUN, ATTENUATOR #2
+ 0003 01 FOCUSSED MOON
+ 0004 01 FOCUSSED SUN
+ 0005 01 FOCUSSED SUN CORRECTED WITH ADJACENT SKY MEASUREMENTS
+ 0006 01 ZENITH SKY
+ 0015 01 MISSING VALUE
+002145 0009 0000 01 WAVELENGTH AD ORDINARY SETTING
+ 0001 01 WAVELENGTH BD ORDINARY SETTING
+ 0002 01 WAVELENGTH CD ORDINARY SETTING
+ 0003 01 WAVELENGTH CC' ORDINARY SETTING
+ 0004 01 WAVELENGTH AD FOCUSSING IMAGE
+ 0005 01 WAVELENGTH BD FOCUSSING IMAGE
+ 0006 01 WAVELENGTH CD FOCUSSING IMAGE
+ 0007 01 WAVELENGTH CC' FOCUSSING IMAGE
+ 0015 01 MISSING VALUE
+002146 0011 0000 01 ON DIRECT SUN
+ 0001 01 ON DIRECT MOON
+ 0002 01 ON BLUE ZENITH SKY
+ 0003 01 ON ZENITH CLOUD (UNIFORM STRATIFIED LAYER OF SMALL OPACITY)
+ 0004 01 ON ZENITH CLOUD (UNIFORM OR MODERATELY VARIABLE LAYER OF MEDIUM OPACITY)
+ 0005 01 ON ZENITH CLOUD (UNIFORM OR MODERATELY VARIABLE LAYER OF LARGE OPACITY)
+ 0006 01 ON ZENITH CLOUD (HIGHLY VARIABLE OPACITY, WITH OR WITOUT PRECIPITATION)
+ 0007 01 ON ZENITH CLOUD (FOG)
+ 0008 01 ON ZENITH HAZE
+ 0009 01 ON DIRECT SUN THROUGH THIN CLOUD, FOG OR HAZE
+ 0015 01 MISSING VALUE
+002148 0006 0000 01 RESERVED
+ 0001 01 ARGOS
+ 0002 01 GPS
+ 0003 01 GOES DCP
+ 0004 01 METEOSAT DCP
+ 0031 01 MISSING VALUE
+002149 0022 0000 01 UNSPECIFIED DRIFTING BUOY
+ 0001 01 STANDARD LAGRANGIAN DRIFTER (GLOBAL DRIFTER PROGRAMME)
+ 0002 01 STANDARD FGGE TYPE DRIFTING BUOY
+ 0003 01 WIND MEASURING FGGE TYPE DRIFTING BUOY
+ 0004 01 ICE FLOAT
+ 0008 01 UNSPECIFIED SUB-SURFACE FLOAT
+ 0009 01 SOFAR
+ 0010 01 ALACE
+ 0011 01 MARVOR
+ 0012 01 RAFOS
+ 0016 01 UNSPECIFIED MOORED BUOY
+ 0017 01 NOMAD
+ 0018 01 3-METRE DISCUS
+ 0019 01 10-12-METRE DISCUS
+ 0020 01 ODAS 30 SERIES
+ 0021 01 ATLAS (E.G. TAO AREA)
+ 0022 01 TRITON BUOY
+ 0023 01 RESERVED
+ 0024 01 OMNIDIRECTIONAL WAVERIDER
+ 0025 01 DIRECTIONAL WAVERIDER
+ 0026 01 SUB-SURFACE ARGO FLOAT
+ 0063 01 MISSING VALUE
+002150 0055 0000 01 RESERVED
+ 0001 01 HIRS 1
+ 0002 01 HIRS 2
+ 0003 01 HIRS 3
+ 0004 01 HIRS 4
+ 0005 01 HIRS 5
+ 0006 01 HIRS 6
+ 0007 01 HIRS 7
+ 0008 01 HIRS 8
+ 0009 01 HIRS 9
+ 0010 01 HIRS 10
+ 0011 01 HIRS 11
+ 0012 01 HIRS 12
+ 0013 01 HIRS 13
+ 0014 01 HIRS 14
+ 0015 01 HIRS 15
+ 0016 01 HIRS 16
+ 0017 01 HIRS 17
+ 0018 01 HIRS 18
+ 0019 01 HIRS 19
+ 0020 01 HIRS 20
+ 0021 01 MSU 1
+ 0022 01 MSU 2
+ 0023 01 MSU 3
+ 0024 01 MSU 4
+ 0025 01 SSU 1
+ 0026 01 SSU 2
+ 0027 01 SSU 3
+ 0028 01 AMSU-A 1
+ 0029 01 AMSU-A 2
+ 0030 01 AMSU-A 3
+ 0031 01 AMSU-A 4
+ 0032 01 AMSU-A 5
+ 0033 01 AMSU-A 6
+ 0034 01 AMSU-A 7
+ 0035 01 AMSU-A 8
+ 0036 01 AMSU-A 9
+ 0037 01 AMSU-A 10
+ 0038 01 AMSU-A 11
+ 0039 01 AMSU-A 12
+ 0040 01 AMSU-A 13
+ 0041 01 AMSU-A 14
+ 0042 01 AMSU-A 15
+ 0043 01 AMSU-B 1
+ 0044 01 AMSU-B 2
+ 0045 01 AMSU-B 3
+ 0046 01 AMSU-B 4
+ 0047 01 AMSU-B 5
+ 0048 01 AVHRR 1
+ 0049 01 AVHRR 2
+ 0050 01 AVHRR 3A
+ 0051 01 AVHRR 3B
+ 0052 01 AVHRR 4
+ 0053 01 AVHRR 5
+ 0063 01 MISSING VALUE
+002151 0009 0000 01 HIRS
+ 0001 01 MSU
+ 0002 01 SSU
+ 0003 01 AMSU-A1-1
+ 0004 01 AMSU-A1-2
+ 0005 01 AMSU-A2
+ 0006 01 AMSU-B
+ 0007 01 AVHRR
+ 2047 01 MISSING VALUE
+002152 0011 0001 01 HIGH-RESOLUTION INFRARED SOUNDER(HIRS)
+ 0002 01 MICROWAVE SOUNDING UNIT (MSU)
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+ 0009 01 GEOSTATIONARY IMAGER
+ 0010 01 GEOSTATIONARY SOUNDER
+ 0011 01 GEOSTATIONARY EARTH RADIATION (GERB)
+002158 0008 0001 01 MISMATCH IN RED VEC HPA
+ 0002 01 MISMATCH IN RED VEC RFSS
+ 0003 01 PTR CALIBRATION BAND 320 MHZ (KU)
+ 0004 01 PTR CALIBRATION BAND 80 MHZ (KU)
+ 0005 01 PTR CALIBRATION BAND 20 MHZ (KU)
+ 0006 01 PTR CALIBRATION BAND 160 MHZ (S)
+ 0007 01 KU FLIGHT CALIBRATION PARAMETERS AVAILABLE
+ 0008 01 S FLIGHT CALIBRATION PARAMETERS AVAILABLE
+002159 0005 0001 01 TEMPERATURE INCONSISTENCY
+ 0002 01 DATA IS MISSING
+ 0003 01 REDUNDANCY CHANNEL
+ 0004 01 POWER BUS PROTECTION
+ 0005 01 OVERVOLTAGE/OVERLOAD PROTECTION
+002163 0015 0000 01 AUTO EDITOR
+ 0001 01 IRW HEIGHT ASSIGNMENT
+ 0002 01 WV HEIGHT ASSIGNMENT
+ 0003 01 H2O INTERCEPT HEIGHT ASSIGNMENT
+ 0004 01 CO2 SLICING HEIGHT ASSIGNMENT
+ 0005 01 LOW PIXEL MAX GRADIENT
+ 0006 01 HIGHER PIXEL MAX GRADIENT
+ 0007 01 PRIMARY HEIGHT ASSIGNMENT
+ 0008 01 LAYER THICKNESS ASSIGNMENT
+ 0009 01 CUMULATIVE CONTRIBUTION FUNCTION -10 PERCENT HEIGHT
+ 0010 01 CUMULATIVE CONTRIBUTION FUNCTION -50 PERCENT HEIGHT
+ 0011 01 CUMULATIVE CONTRIBUTION FUNCTION -90 PERCENT HEIGHT
+ 0012 02 CUMULATIVE CONTRIBUTION FUNCTION - HEIGHT OF
+ MAXIMUM GRADIENT
+ 0014 01 COMPOSITE HEIGHT ASSIGNMENT
+ 0015 01 MISSING VALUE
+002164 0004 0000 01 LP - NORMS LEAST SQUARE MINIMUM
+ 0001 01 EN - EUCLIDEAN NORM WITH RADIANCE CORRELATION
+ 0002 01 CC - CROSS CORRELATION
+ 0007 01 MISSING VALUE
+002166 0009 0000 01 TYPE NOT DEFINED
+ 0001 01 AUTOMATED STATISTICAL REGRESSION
+ 0002 01 CLEAR PATH
+ 0003 01 PARTLY CLOUDY PATH
+ 0004 01 CLOUDY PATH
+ 0005 01 APODIZED
+ 0006 01 UNAPODIZED
+ 0007 01 RECONSTRUCTED
+ 0008 01 CLOUD CLEARED
+002167 0004 0000 01 METHOD NOT DEFINE
+ 0001 01 1B RAW RADIANCE
+ 0002 01 PROCESSED RADIANCE
+ 0015 01 MISSING VALUE
+002169 0004 0000 01 CUP ROTOR
+ 0001 01 PROPELLER ROTOR
+ 0002 01 WIND OBSERVATION THROUGH AMBIENT NOISE (WOTAN)
+ 0015 01 MISSING VALUE
+002172 0003 0001 01 RETRIEVAL FROM A NADIR SOUNDING
+ 0002 01 RETRIEVAL FROM A LIMB SOUNDING
+ 0255 01 MISSING VALUE
+002175 0009 0000 01 MANUAL MEASUREMENT
+ 0001 01 TIPPING BUCKET METHOD
+ 0002 01 WEIGHING METHOD
+ 0003 01 OPTICAL METHOD
+ 0004 01 PRESSURE METHOD
+ 0005 01 FLOAT METHOD
+ 0006 01 DROP COUNTER METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002176 0006 0000 01 MANUAL OBSERVATION
+ 0001 01 VIDEO CAMERA METHOD
+ 0002 01 INFRA-RED METHOD
+ 0003 01 LASER METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002177 0005 0000 01 MANUAL OBSERVATION
+ 0001 01 ULTRASONIC METHOD
+ 0002 01 VIDEO CAMERA METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002178 0005 0000 01 MANUAL OBSERVATION
+ 0001 01 OPTICAL METHOD
+ 0002 01 CAPACITIVE METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002179 0006 0000 01 MANUAL OBSERVATION
+ 0001 01 VAISALA ALGORITHM
+ 0002 01 ASOS (FAA) ALGORITHM
+ 0003 01 AWOS (CANADA) ALGORITHM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002180 0008 0000 01 MANUAL OBSERVATION
+ 0001 02 OPTICAL SCATTER SYSTEM COMBINED WITH PRECIPITATION
+ OCCURRENCE SENSING SYSTEM
+ 0002 01 FORWARD AND/OR BACK-SCATTER SYSTEM OF VISIBLE LIGHT
+ 0003 01 FORWARD AND/OR BACK-SCATTER SYSTEM OF INFRARED LIGHT
+ 0004 01 INFRARED LIGHT EMITTING DIODE (IRED) SYSTEM
+ 0005 01 DOPPLER RADAR SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002181 0005 0001 01 RAIN DETECTOR
+ 0002 01 FREEZING RAIN SENSOR
+ 0003 01 ICE DETECTION SENSOR
+ 0004 01 HAIL AND ICE PELLET SENSOR
+ 0020 01 OTHER
+002182 0007 0000 01 MANUAL MEASUREMENT
+ 0001 01 TRANSMISSOMETER SYSTEM (BASE > 25)
+ 0002 01 TRANSMISSOMETER SYSTEM (BASE < 25 M)
+ 0003 01 FORWARD SCATTER SYSTEM
+ 0004 01 BACK SCATTER SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002183 0009 0000 01 MANUAL OBSERVATION
+ 0001 01 CEILOMETER SYSTEM
+ 0002 01 INFRARED CAMERA SYSTEM
+ 0003 01 MICROWAVE VISUAL CAMERA SYSTEM
+ 0004 01 SKY IMAGER SYSTEM
+ 0005 01 VIDEO TIME LAPSED CAMERA SYSTEM
+ 0006 01 MICRO PULSE LIDAR (MPL) SYSTEM
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002184 0008 0000 01 MANUAL OBSERVATION
+ 0001 01 LIGHTNING IMAGING SENSOR
+ 0002 01 ELECTRICAL STORM IDENTIFICATION SENSOR
+ 0003 01 MAGNETIC FINDER SENSOR
+ 0004 01 LIGHTNING STRIKE SENSOR
+ 0005 01 FLASH COUNTER
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002185 0007 0000 01 MANUAL MEASUREMENT
+ 0001 01 BALANCED FLOATING METHOD
+ 0002 01 PRESSURE METHOD
+ 0003 01 ULTRASONIC METHOD
+ 0004 01 HYDRAULIC METHOD
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+002186 0023 0001 01 PRECIPITATION-UNKNOWN TYPE
+ 0002 01 LIQUID PRECIPITATION NOT FREEZING
+ 0003 01 LIQUID FREEZING PRECIPITATION
+ 0004 01 DRIZZLE
+ 0005 01 RAIN
+ 0006 01 SOLID PRECIPITATION
+ 0007 01 SNOW
+ 0008 01 SNOW GRAINS
+ 0009 01 SNOW PELLETS
+ 0010 01 ICE PELLETS
+ 0011 01 ICE CRYSTALS
+ 0012 01 DIAMOND DUST
+ 0013 01 SMALL HAIL
+ 0014 01 HAIL
+ 0015 01 GLAZE
+ 0016 01 RIME
+ 0017 01 SOFT RIME
+ 0018 01 HARD RIME
+ 0019 01 CLEAR ICE
+ 0020 01 WET SNOW
+ 0021 01 HOAR FROST
+ 0022 01 DEW
+ 0023 01 WHITE DEW
+002187 0011 0001 01 DUST/SAND WHIRL
+ 0002 01 SQUALLS
+ 0003 01 SAND STORM
+ 0004 01 DUST STORM
+ 0005 01 LIGHTNING - CLOUD TO SURFACE
+ 0006 01 LIGHTNING - CLOUD TO CLOUD
+ 0007 01 LIGHTNING - DISTANT
+ 0008 01 THUNDERSTORM
+ 0009 01 FUNNEL CLOUD NOT TOUCHING SURFACE
+ 0010 01 FUNNEL CLOUD TOUCHING SURFACE
+ 0011 01 SPRAY
+002188 0010 0001 01 FOG
+ 0002 01 ICE FOG
+ 0003 01 STEAM FOG
+ 0007 01 MIST
+ 0008 01 HAZE
+ 0009 01 SMOKE
+ 0010 01 VOLCANIC ASH
+ 0011 01 DUST
+ 0012 01 SAND
+ 0013 01 SNOW
+002189 0004 0001 01 MANUAL OBSERVATION
+ 0002 01 ALL LIGHTNING STRIKES WITHOUT DISCRIMINATION
+ 0003 01 LIGHTNING STRIKES CLOUD TO GROUND ONLY
+ 0004 02 ALL LIGHTNING STRIKES WITH DISCRIMINATION BETWEEN
+ CLOUD TO GROUND AND CLOUD TO CLOUD
+002194 0002 0000 01 FGGE
+ 0015 01 MISSING VALUE
+002196 0017 0000 01 NIMBUS
+ 0001 01 VTPR
+ 0002 01 TIROS 1 ( TIROS NOAA 6 TO NOAA 13)
+ 0003 01 TIROS 2 ( NOAA-14 ONWARD)
+ 0031 01 DMSP
+ 0061 01 EUMETSAT POLAR SYSTEM (EPS)
+ 0091 01 ERS
+ 0121 01 ADEOS
+ 0241 01 GOES
+ 0271 01 GMS
+ 0301 01 INSAT
+ 0331 01 METEOSAT OPERATIONAL PROGRAMME(MOP)
+ 0332 01 METEOSAT TRANSITIONAL PROGRAMME(MTP)
+ 0333 01 METEOSAT SECOND GENERATION PROGRAMME(MSG)
+ 0351 01 GOMS
+ 0381 01 FY-2
+ 0512 01 MISSING VALUE
+002199 0004 0000 01 RESERVED
+ 0001 01 TABLE WITH FULL RANGE OF HUMMIDITY VALUES IN LAYER
+ 0002 01 REGRESSION TECHNIQUE ON 2 HUMMIDITY VALUES IN LAYER
+ 0015 01 MISSING VALUE
+002207 0003 0000 01 AFR SCAN
+ 0001 01 FORWARD AFT SCAN
+ 0007 01 MISSING VALUE
+002231 0015 0000 01 RESERVED
+ 0001 01 IRW HEIGHT ASSIGNMENT
+ 0002 01 WV HEIGHT ASSIGNMENT
+ 0003 01 H2O INTERCEPT HEIGHT ASSIGNMENT
+ 0004 01 CO2 SLICING HEIGHT ASSIGNMENT
+ 0005 01 LOW PIXEL MAX GRADIENT
+ 0006 01 HIGHER PIXEL MAX GRADIENT
+ 0007 01 PRIMARY HEIGHT ASSIGNMENT
+ 0008 01 LAYER THICKNESS ASSIGNMENT
+ 0009 01 CUMULATIVE CONTRIBUTION FUNCTION -10 PERCENT HEIGHT
+ 0010 01 CUMULATIVE CONTRIBUTION FUNCTION -50 PERCENT HEIGHT
+ 0011 01 CUMULATIVE CONTRIBUTION FUNCTION -90 PERCENT HEIGHT
+ 0012 02 CUMULATIVE CONTRIBUTION FUNCTION - HEIGHT OF
+ MAXIMUM GRADIENT
+ 0014 01 COMPOSITE HEIGHT ASSIGNMENT
+ 0015 01 MISSING VALUE
+002232 0004 0000 01 P - NORMS LEAST SQUARE MINIMUM
+ 0001 01 EN - EUCLIDEAN NORM WITH RADIANCE CORRELATION
+ 0002 01 CC - CROSS CORRELATION
+ 0003 01 MISSING VALUE
+002251 0004 0000 01 METHOD NOT DEFINED
+ 0001 01 1B RAW RADIANCE
+ 0002 01 PROCESSED RADIANCE
+ 0015 01 MISSING VALUE
+002252 0012 0001 01 HIGH-RESOLUTION INFRARED SOUNDER(HIRS)
+ 0002 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0003 01 STRATOSPHERIC SOUNDING UNIT (SSU)
+ 0004 01 AMI WIND MODE
+ 0005 01 AMI WAVE MODE
+ 0006 01 AMI IMAGE MODE
+ 0007 01 RADAR ALTIMETER
+ 0008 01 ATSR
+ 0009 01 GEOSTATIONARY IMAGER
+ 0010 01 GEOSTATIONARY SOUNDER
+ 0011 01 GEOSTATIONARY EARTH RADIATION (GERB)
+ 0031 01 ALL BITS SET - MISSING VALUE
+002254 0006 0000 01 TYPE NOT DEFINED
+ 0001 01 AUTOMATED STATISTICAL REGRESSION
+ 0002 01 CLEAR PATH
+ 0003 01 PARTLY CLOUDY PATH
+ 0004 01 CLOUDY PATH
+ 0015 01 MISSING VALUE
+004059 0005 0001 01 00 UTC
+ 0002 01 06 UTC
+ 0003 01 12 UTC
+ 0004 01 18 UTC
+ 0005 01 OTHER HOURS
+008001 0007 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 MAXIMUM WIND LEVEL
+ 0005 01 SIGNIFICANT LEVEL, TEMPERATURE AND/OR RELATIVE HUMIDITY
+ 0006 01 SIGNIFICANT LEVEL, WIND
+ 0007 01 MISSING VALUE
+008002 0013 0000 02 OBSERVING RULES FOR BASE OF LOWEST CLOUD AND CLOUD TYPES OF
+ FM 12-IX EXT. SYNOP AND FM 13-IX EXT. SHIP APPLY
+ 0001 01 FIRST NON - CB SIGNIFICANT LAYER
+ 0002 01 SECOND NON - CB SIGNIFICANT LAYER
+ 0003 01 THIRD NON - CB SIGNIFICANT LAYER
+ 0004 01 CUMULONIMBUS LAYER
+ 0005 01 CEILING
+ 0006 01 CLOUD NOT DETECTED BELOW THE FOLLOWING HEIGHT(S)
+ 0007 01 LOW CLOUD
+ 0008 01 MIDDLE CLOUD
+ 0009 01 HIGH CLOUD
+ 0010 02 CLOUD LAYER WITH BASE BELOW THE STATION LEVEL AND TOP
+ ABOVE THE STATION LEVEL
+ 0011 01 CLOUD LAYER WITH BASE AND TOP BELOW THE STATION LEVEL
+ 0063 01 MISSING VALUE
+008003 0009 0000 01 SURFACE
+ 0001 01 BASE OF SATELLITE SOUNDING
+ 0002 01 CLOUD TOP
+ 0003 01 TROPOPAUSE
+ 0004 01 PRECIPITABLE WATER
+ 0005 01 SOUNDING RADIANCES
+ 0006 01 MEAN TEMPERATURES
+ 0007 01 OZON
+ 0063 01 MISSING VALUE
+008004 0006 0002 01 UNSTEADY (UNS)
+ 0003 01 LEVEL FLIGHT, ROUTINE OBSERVATION (LVR)
+ 0004 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED (LVW)
+ 0005 01 ASCENDING (ASC)
+ 0006 01 DESCENDING(DES)
+ 0007 01 MISSING VALUE
+008005 0005 0000 01 RESERVED
+ 0001 01 STORM CENTRE
+ 0002 01 OUTER LIMIT OR EDGE OF STORM
+ 0003 01 LOCATION OF MAXIMUM WIND
+ 0004 01 LOCATION OF STORM IN THE PERTURBED ANALYSIS
+ 0005 01 LOCATION OF STORM IN THE ANALYSIS
+ 0015 01 MISSING VALUE
+008006 0008 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 PROMINENT MAXIMUM LEVEL
+ 0005 01 PROMINENT MINIMUM LEVEL
+ 0006 01 MINIMUM PRESSURE LEVEL
+ 0007 01 RESERVED
+ 0008 01 LEVEL OF UNDETERMINED SIGNIFICANCE
+008007 0005 0000 01 POINT
+ 0001 01 LINE
+ 0002 01 AREA
+ 0003 01 VOLUME
+ 0015 01 MISSING VALUE
+008008 0008 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 LEVEL OF BETA RADIATION MAXIMUM
+ 0005 01 LEVEL OF GAMMA RADIATION MAXIMUM
+ 0006 01 MINIMUM PRESSURE LEVEL
+ 0007 01 RESERVED
+ 0008 01 LEVEL OF UNDETERMINED SIGNIFICANCE
+008009 0016 0000 01 LEVEL FLIGHT, ROUTINE OBSERVATION, UNSTEADY
+ 0001 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED, UNSTEADY
+ 0002 01 UNSTEADY (UNS)
+ 0003 01 LEVEL FLIGHT, ROUTINE OBSERVATION (LVR)
+ 0004 01 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED (LVW)
+ 0005 01 ASCENDING (ASC)
+ 0006 01 DESCENDING (DES)
+ 0007 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS
+ 0008 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS, UNSTEADY
+ 0009 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS
+ 0010 02 ASCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS, UNSTEADY
+ 0011 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS
+ 0012 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ TIME INCREMENTS, UNSTEADY
+ 0013 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS
+ 0014 02 DESCENDING, OBSERVATION INTERVALS SELECTED BY
+ PRESSURE INCREMENTS, UNSTEADY
+ 0015 01 MISSING VALUE
+008010 0013 0000 01 RESERVED
+ 0001 01 BARE SOIL
+ 0002 01 BARE ROCK
+ 0003 01 LAND GRASS COVER
+ 0004 01 WATER (LAKE, SEA)
+ 0005 01 FLOOD WATER UNDERNEATH
+ 0006 01 SNOW
+ 0007 01 ICE
+ 0008 01 RUNWAY OR ROAD
+ 0009 01 SHIP OR PLATFORM DECK IN STEEL
+ 0010 01 SHIP OR PLATFORM DECK IN WOOD
+ 0011 01 SHIP OR PLATFORM DECK PARTLY COVERED WITH RUBBER MAT
+ 0031 01 MISSING VALUE
+008011 0026 0000 01 QUASI-STATIONARY FRONT AT THE SURFACE
+ 0001 01 QUASI-STATIONARY FRONT ABOVE THE SURFACE
+ 0002 01 WARM FRONT AT THE SURFACE
+ 0003 01 WARM FRONT ABOVE THE SURFACE
+ 0004 01 COLD FRONT AT THE SURFACE
+ 0005 01 COLD FRONT ABOVE THE SURFACE
+ 0006 01 OCCLUSION
+ 0007 01 INSTABILITY LINE
+ 0008 01 INTERTROPICAL FRONT
+ 0009 01 CONVERGENCE LINE
+ 0010 01 JET STREAM
+ 0011 01 CLOUD CLEAR
+ 0012 01 CLOUD
+ 0013 01 TURBULENCE
+ 0014 01 STORM
+ 0015 01 AIRFRAME ICING
+ 0016 01 PHENOMENON
+ 0017 01 VOLCANO
+ 0018 01 ATMOSPHERICS
+ 0020 01 SPECIAL CLOUDS
+ 0021 01 THUNDERSTORM (VAL)
+ 0022 01 TROPICAL CYCLONE (VAL)
+ 0023 01 MOUNTAIN WAVE (VAL)
+ 0024 01 DUSTSTORM (VAL)
+ 0025 01 SANDSTORM (VAL)
+ 0063 01 MISSING VALUE
+008012 0004 0000 01 LAND
+ 0001 01 SEA
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008013 0004 0000 01 NIGHT
+ 0001 01 DAY
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008014 0010 0000 01 10-MINUTE MEAN VALUE - NORMAL VALUE
+ 0001 01 10-MINUTE MEAN VALUE - ABOVE THE UPPER LIMIT FOR ASSESSMENT OF RVR (P)
+ 0002 01 10-MINUTE MEAN VALUE - BELOW LOWER LIMIT FOR ASSESSMENT OF RVR (M)
+ 0003 01 ONE MINUTE MINIMUM VALUE - NORMAL VALUE
+ 0004 01 ONE MINUTE MINIMUM VALUE - ABOVE THE UPPER LIMIT FOR ASSESSMENT OF RVR (P)
+ 0005 01 ONE MINUTE MINIMUM VALUE - BELOW LOWER LIMIT FOR ASSESSMENT OF RVR (M)
+ 0006 01 ONE MINUTE MAXIMUM VALUE - NORMAL VALUE
+ 0007 01 ONE MINUTE MAXIMUM VALUE - ABOVE THE UPPER LIMIT FOR ASSESSMENT OF RVR (P)
+ 0008 01 ONE MINUTE MAXIMUM VALUE - BELOW LOWER LIMIT FOR ASSESSMENT OF RVR (M)
+ 0015 01 MISSING VALUE
+008016 0005 0000 01 NOSIG
+ 0001 01 BECMG
+ 0002 01 TEMPO
+ 0003 01 FM
+ 0007 01 MISSING VALUE
+008017 0004 0000 01 FM
+ 0001 01 TL
+ 0002 01 AT
+ 0003 01 MISSING VALUE
+008018 0005 0001 01 LAND IS PRESENT
+ 0002 01 SURFACE ICE MAP INDICATES ICE IS PRESENT
+ 0011 01 ICE MAP DATA NOT AVAILABLE
+ 0012 01 ATTENUATION MAP DATA NOT AVAILABLE
+ 0017 01 MISSING VALUE
+008021 0028 0000 01 RESERVED
+ 0001 01 TIME SERIES
+ 0002 01 TIME AVERAGED
+ 0003 01 ACCUMULATED
+ 0004 01 FORECAST
+ 0005 01 FORECAST TIME SERIES
+ 0006 01 FORECAST TIME AVERAGED
+ 0007 01 FORECAST ACCUMULATED
+ 0008 01 ENSEMBLE MEAN
+ 0009 01 ENSEMBLE MEAN TIME SERIES
+ 0010 01 ENSEMBLE MEAN TIME AVERAGED
+ 0011 01 ENSEMBLE MEAN ACCUMULATED
+ 0012 01 ENSEMBLE MEAN FORECAST
+ 0013 01 ENSEMBLE MEAN FORECAST TIME SERIES
+ 0014 01 ENSEMBLE MEAN FORECAST AVERAGED
+ 0015 01 ENSEMBLE MEAN FORECAST ACCUMULATED
+ 0016 01 ANALYSIS
+ 0017 01 START OF PHENOMENON
+ 0018 01 RADIOSONDE LAUNCH TIME
+ 0019 01 START OF ORBIT
+ 0020 01 END OF ORBIT
+ 0021 01 TIME OF ASCENDING NODE
+ 0022 01 TIME OF OCCURENCE OF WIND SHIFT
+ 0027 01 FIRST GUESS --NOT WMO ENTRY
+ 0028 01 START OF SCAN --NOT WMO ENTRY
+ 0029 01 END OF SCAN --NOT WMO ENTRY
+ 0031 01 MISSING VALUE
+008023 0017 0002 01 MAXIMUM VALUE
+ 0003 01 MINIMUM VALUE
+ 0004 01 MEAN VALUE
+ 0005 01 MEDIAN VALUE
+ 0006 01 MODAL VALUE
+ 0007 01 MEAN ABSOLUTE ERROR
+ 0009 01 BEST ESTIMATE OF STANDARD DEVIATION (N-1)
+ 0010 01 STANDARD DEVIATION
+ 0011 01 HARMONIC MEAN
+ 0012 01 ROOT MEAN SQUARE VECTOR ERROR
+ 0013 01 ROOT-MEAN-SQUARE
+ 0032 01 VECTOR MEAN
+ 0033 01 PRESCRIBED OBSERVATION ERROR
+ 0034 01 PERSISTENCE OBSERVATION ERROR
+ 0035 01 FINAL OBSERVATION ERROR
+ 0036 01 REPRESENTATIVNESS OBSERVATION ERROR
+ 0063 01 MISSING
+008024 0012 0002 01 OBSERVED MINUS MAXIMUM
+ 0003 01 OBSERVED MINUS MINIMUM
+ 0004 01 OBSERVED MINUS MEAN
+ 0005 01 OBSERVED MINUS MEDIAN
+ 0006 01 OBSERVED MINUS MODE
+ 0011 01 OBSERVED MINUS CLIMATOLOGY (ANOMALY)
+ 0012 01 OBSERVED MINUS ANALYZED VALUE
+ 0013 01 OBSERVED MINUS INITIALISED ANALYZED VALUE
+ 0014 01 OBSERVED MINUS FORECAST VALUE
+ 0021 01 OBSERVED MINUS INTERPOLATED VALUE
+ 0022 01 OBSERVED MINUS HYDROSTATICALLY CALCULATED VALUE
+ 0032 01 OBSERVED MINUS FIRST GUESS
+ 0033 01 OBSERVED MINUS ANALYSIS
+ 0034 01 OBSERVED MINUS INITIALIZED ANALYSIS
+ 0063 01 MISSING
+008025 0005 0000 02 UNIVERSAL TIME COORDINATED (UTC) MINUS
+ LOCAL STANDARD TIME (LST)
+ 0001 01 LOCAL STANDARD TIME
+ 0002 01 UNIVERSAL TIME COORDINATED (UTC) MINUS SATELLITE CLOCK
+ 0005 01 TIME DIFFERENCE FROM EDGE OF PROCESSING SEGMENT
+ 0015 01 MISSING
+008026 0005 0000 01 AVERAGING KERNEL MATRIX
+ 0001 01 CORRELATION MATRIX
+ 0002 01 LOWER TRIANGULAR CORRELATION MATRIX SQUARE ROOT (L FROM C=LLT)
+ 0003 01 INVERSE LOWER TRIANGULAR CORRELATION MATRIX SQUARE ROOT (L**-1)
+ 0063 01 MISSING VALUE
+008027 0007 0000 01 ASSUME NO PARTICULAR MATRIX GEOMETRY
+ 0001 01 DIAGONAL MATRIX
+ 0002 01 TRIDIAGONAL MATRIX
+ 0003 01 MULTI-DIAGONAL MATRIX (GENERAL CASE: DIAGONAL AND ABOVE)
+ 0004 01 LOWER TRIANGULAR MATRIX
+ 0005 01 SYMETRICAL MATRIX
+ 0063 01 MISSING VALUE
+008029 0005 0000 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0001 01 ENCLOSED SEA OR LAKE
+ 0002 01 CONTINENTAL ICE
+ 0003 01 LAND
+ 0255 01 MISSING
+008033 0004 0000 01 RESERVED
+ 0001 01 PERCENTAGE CONFIDENCE CALCULATED USING CLOUD FRACTION
+ 0002 01 PERCENTAGE CONFIDENCE CALCULATED USING STANDARD
+ DEVIATION OF TEMPERATURE
+ 0003 02 PERCENTAGE CONFIDENCE CALCULATED USING PROBABILITY OF
+ THE CLOUD CONTAMINATION
+ 0004 01 PERCENTAGE CONFIDENCE CALCULATED USING NORMALITY OF DISTRIBUTION
+ 0127 01 MISSING
+008035 0008 0000 01 GLOBAL
+ 0001 01 REGIONAL
+ 0002 01 NATIONAL
+ 0003 01 SPECIAL
+ 0004 01 BILATERAL
+ 0005 01 RESERVED
+ 0006 01 RESERVED
+ 0007 01 MISSING
+008036 0008 0000 01 WMO SECRETARIAT
+ 0001 01 WMO
+ 0002 01 RSMC
+ 0003 01 NMC
+ 0004 01 RTH
+ 0005 01 OBSERVING SITE
+ 0006 01 OTHER
+ 0007 01 MISSING
+008039 0008 0000 01 ISSUE TIME OF FORECAST
+ 0001 01 TIME OF COMMNENCEMENT OF PERIOD OF THE FORECAST
+ 0002 01 TIME OF ENDING OF PERIOD OF THE FORECAST
+ 0003 01 FORECSAT TIME OF MAXIMUM TEMPERATURE
+ 0004 01 FORECSAT TIME OF MINIMUM TEMPERATURE
+ 0005 01 TIME OF BEGINNING OF THE FORECAST
+ 0006 01 TIME OF ENDING OF THE FORECAST
+ 0063 01 MISSING VALUE
+008040 0043 0000 01 HIGH RESOLUTION DATA SAMPLE
+ 0001 01 WITHIN 20 HPA OF SURFACE
+ 0002 02 PRESSURE LESS THAN 10 HPA (I.E., 9, 8, 7, ETC.)
+ WHEN NO OTHER REASON APPLIES
+ 0003 01 BASE PRESSURE LEVEL FOR STABILITY INDEX
+ 0004 01 BEGIN DOUBTFUL TEMPERATURE, HEIGHT DATA
+ 0005 01 BEGIN MISSING DATA (ALL ELEMENTS)
+ 0006 01 BEGIN MISSING RH DATA
+ 0007 01 BEGIN MISSING TEMPERATURE DATA
+ 0008 02 HIGHEST LEVEL REACHED BEFORE BALLOON
+ DESCENT BECAUSE OF ICING OR TURBULENCE
+ 0009 01 END DOUBTFUL TEMPERATURE, HEIGHT DATA
+ 0010 01 END MISSING DATA (ALL ELEMENTS)
+ 0011 01 END MISSING RH DATA
+ 0012 01 END MISSING TEMPERATURE DATA
+ 0013 01 ZERO DEGREES C CROSSING(S) FOR RADAT
+ 0014 01 STANDARD PRESSURE LEVEL
+ 0015 01 OPERATOR ADDED LEVEL
+ 0016 01 OPERATOR DELETED LEVEL
+ 0017 01 BALLOON RE-ASCENDED BEYOND PREVIOUS HIGHEST ASCENT LEVEL
+ 0018 01 SIGNIFICANT RH LEVEL
+ 0019 01 RH LEVEL SELECTION TERMINATED
+ 0020 01 SURFACE LEVEL
+ 0021 01 SIGNIFICANT TEMPERATURE LEVEL
+ 0022 01 MANDATORY TEMPERATURE LEVEL
+ 0023 01 FLIGHT TERMINATION LEVEL
+ 0024 01 TROPOPAUSE(S)
+ 0025 01 AIRCRAFT REPORT
+ 0026 01 INTERPOLATED (GENERATED) LEVEL
+ 0027 01 MANDATORY WIND LEVEL
+ 0028 01 SIGNIFICANT WIND LEVEL
+ 0029 01 MAXIMUM WIND LEVEL
+ 0030 01 INCREMENTAL WIND LEVEL (FIXED REGIONAL)
+ 0031 01 INCREMENTAL HEIGHT LEVEL (GENERATED)
+ 0032 01 WIND TERMINATION LEVEL
+ 0033 01 PRESSURE 100 TO 110 HPA, WHEN NO OTHER REASON APPLIES
+ 0040 01 SIGNIFICANT THERMODYNAMIC LEVEL (INVERSION)
+ 0041 01 SIGNIFICANT RH LEVEL ( PER NCDC CRITERIA)
+ 0042 01 SIGNIFICANT TEMPERATURE LEVEL (PER NCDC)
+ 0043 01 BEGIN MISSING WIND DATA
+ 0044 01 END MISSING WIND DATA
+ 0060 01 LEVEL OF 80-KNOT ISOTACH ABOVE JET
+ 0061 01 LEVEL OF 80-KNOT ISOTACH BELOW JET
+ 0062 01 OTHER
+ 0063 01 MISSING VALUE
+008041 0009 0000 01 PARENT SITE
+ 0001 01 OBSERVATION SITE
+ 0002 01 BALLOON MANUFACTURE DATE
+ 0003 01 BALLOON LAUNCH POINT
+ 0004 01 SURFACE OBSERVATION
+ 0005 01 SURFACE OBSERVATION DISPLACEMENT FROM LAUNCH POINT
+ 0006 01 FLIGHT LEVEL OBSERVATION
+ 0007 01 FLIGHT LEVEL TERMINATION POINT
+ 0031 01 MISSING VALUE
+008042 0014 0001 01 SURFACE
+ 0002 01 STANDARD LEVEL
+ 0003 01 TROPOPAUSE LEVEL
+ 0004 01 MAXIMUM WIND LEVEL
+ 0005 01 SIGNIFICANT TEMPERATURE LEVEL
+ 0006 01 SIGNIFICANT HUMIDITY LEVEL
+ 0007 01 SIGNIFICANT WIND LEVEL
+ 0008 01 BEGINNING OF MISSING TEMPERATURE DATA
+ 0009 01 END OF MISSING TEMPERATURE DATA
+ 0010 01 BEGINNING OF MISSING HUMIDITY DATA
+ 0011 01 END OF MISSING HUMIDITY DATA
+ 0012 01 BEGINNING OF MISSING WIND DATA
+ 0013 01 END OF MISSING WIND DATA
+ 0018 01 ALL 18 MISSING
+008043 21 0000 01 OZONE, O3,10028-15-6
+ 0001 01 WATER VAPOUR, H2O, 7732-18-5
+ 0002 01 METHANE, CH4, 74-82-8
+ 0003 01 CARBON DIOXIDE, CO2, 37210-16-5
+ 0004 01 CARBON MONOXIDE, CO, 630-08-0
+ 0005 01 NITROGEN DIOXIDE, NO2, 10102-44-0
+ 0006 01 NITROUS OXIDE, N2O, 10024-97-2
+ 0007 01 FORMALDEHYDE, HCHO, 50-00-0
+ 0008 01 SULFUR DIOXIDE, SO2, 7446-09-5
+ 0009 01 BROMINE OXIDE, BRO, 15656-19-6
+ 0010 01 CHLORINE DIOXIDE, OCLO, 10049-04-4
+ 0011 01 NITROGEN MONOXIDE, NO, 10102-43-9
+ 0012 01 AMMONIA, NH3, 7664-41-7
+ 0025 01 PARTICULATE MATTER < 1.0 MICRONS
+ 0026 01 PARTICULATE MATTER < 2.5 MICRONS
+ 0027 01 PARTICULATE MATTER < 10 MICRONS
+ 0028 01 AEROSOLS GENERIC
+ 0029 01 SMOKE GENERIC
+ 0030 01 CRUSTAL MATERIAL (GENERIC DUST)
+ 0031 01 VOLCANIC ASH
+ 0255 01 MISSING
+008050 0011 0000 01 RESERVED
+ 0001 01 PRESSURE
+ 0002 01 TEMPERATURE
+ 0003 01 EXTREME TEMPERATURE
+ 0004 01 VAPOUR PRESSURE
+ 0005 01 PRECIPITATION
+ 0006 01 SUNSHINE DURATION
+ 0007 01 MAXIMUM TEMPERATURE
+ 0008 01 MINIMUM TEMPERATURE
+ 0009 01 WIND
+ 0015 01 MISSING VALUE
+008051 0007 0001 01 PRESSURE
+ 0002 01 TEMPERATURE
+ 0003 01 EXTREME TEMPERATURE
+ 0004 01 VAPOUR PRESSURE
+ 0005 01 PRECIPITATION
+ 0006 01 SUNSHINE DURATION
+ 0007 01 MISSING VALUE
+008052 0026 0000 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 10 M/S
+ 0001 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 20 M/S
+ 0002 02 MEAN WIND SPEED OVER 10-MINUTES PERIOD OBSERVED OR RECORDED
+ EQUAL TO OR MORE THAN 30 M/S
+ 0003 01 MAXIMUM TEMPERATURE LESS THAN 273.2 K
+ 0004 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 298.2 K
+ 0005 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 303.2 K
+ 0006 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 308.2 K
+ 0007 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 313.2 K
+ 0008 01 MINIMUM TEMPERATURE LESS THAN 273.2 K
+ 0009 01 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 273.2 K
+ 0010 01 PRECIPITATION EQUAL TO OR MORE THAN 1.0 KG/M**2
+ 0011 01 PRECIPITATION EQUAL TO OR MORE THAN 5.0 KG/M**2
+ 0012 01 PRECIPITATION EQUAL TO OR MORE THAN 10.0 KG/M**2
+ 0013 01 PRECIPITATION EQUAL TO OR MORE THAN 50.0 KG/M**2
+ 0014 01 PRECIPITATION EQUAL TO OR MORE THAN 100.0 KG/M**2
+ 0015 01 PRECIPITATION EQUAL TO OR MORE THAN 150.0 KG/M**2
+ 0016 01 SNOW DEPTH MORE THAN 0.0 M
+ 0017 01 SNOW DEPTH MORE THAN 0.01 M
+ 0018 01 SNOW DEPTH MORE THAN 0.10 M
+ 0019 01 SNOW DEPTH MORE THAN 0.50 M
+ 0020 01 HORIZONTAL VISIBILITY LESS THAN 50 M
+ 0021 01 HORIZONTAL VISIBILITY LESS THAN 100 M
+ 0022 01 HORIZONTAL VISIBILITY LESS THAN 1000 M
+ 0023 01 HAIL
+ 0024 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+008053 0004 0000 01 VALUE OCCURED ON ONLY ONE DAY IN THE MONTH
+ 0001 01 VALUE OCCURED ON MORE THAN ONE DAY IN THE MONTH
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008054 0003 0000 01 WIND SPEED OR GUST IS AS REPORTED
+ 0001 01 WIND SPEED IS GREATER THAN THAT REPRTED (P IN METAR/TAF/SPECI)
+ 0007 01 MISSING VALUE
+008060 0008 0000 01 RESERVED
+ 0001 01 RANGE
+ 0002 01 AZIMUTH
+ 0003 01 HORIZONTAL
+ 0004 01 VERTICAL
+ 0005 01 NORTH/SOUTH
+ 0006 01 EAST/WEST
+ 0015 01 MISSING VALUE
+008065 0004 0000 01 NO SUN-GLINT
+ 0001 01 SUN-GLINT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008066 0004 0000 01 OPAQUE
+ 0001 01 SEMI-TRANSPARENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008070 0006 0000 01 RESERVED
+ 0001 01 RESERVED
+ 0002 02 EARTH LOCATED INSTRUMENT COUNTS,
+ CALIBRATION COEFFICIENTS AND HOUSEKEEPING (LEVEL 1B)
+ 0003 01 EARTH LOCATED CALIBRATED RADIANCES (LEVEL 1C)
+ 0004 02 MAPPED TO A COMMON FOOTPRINT, EARTH LOCATED
+ CALIBRATED RADIANCES (LEVEL 1D)
+ 0015 01 MISSING VALUE
+008072 0004 0000 01 MIXED
+ 0001 01 CLEAR
+ 0002 01 CLOUDY
+ 0007 01 MISSING VALUE
+008074 0004 0000 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0001 01 NON-OCEAN LIKE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008075 0004 0000 01 ASCENDING ORBIT
+ 0001 01 DESCENDING ORBIT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+008076 0003 0000 01 KU
+ 0001 01 C
+ 0063 01 MISSING VALUE
+008077 0007 0000 01 LAND
+ 0001 01 SEA
+ 0002 01 COASTAL
+ 0003 01 OPEN OCEAN OR SEMI-ENCLOSED SEA
+ 0004 01 ENCLOSED SEA OR LAKE
+ 0005 01 CONTINENTAL ICE
+ 0127 01 MISSING VALUE
+008079 0009 0000 01 NORMAL ISSUE
+ 0001 01 CORRECTION TO A PREVIOUSLY ISSUED PRODUCT (COR)
+ 0002 01 AMANDMENT TO A PREVIOUSLY ISSUED PRODUCT *AMD)
+ 0003 01 CORRECTION TO A PREVIOUSLY ISSUED AMENDED PRODUCT (COR AMD)
+ 0004 01 CANCELLATION OD A PREVIOUSLY ISSUED PRODUCT (CNL)
+ 0005 01 NO PRODUCT AVAILABLE (NIL)
+ 0006 01 SPECIAL REPORT ( SPECI)
+ 0007 01 CORRECTED SPECIAL REPORT (SPECI COR)
+ 0015 01 MISSING VALUE
+008080 0009 0000 01 TOTAL WATER PRESSURE PROFILE
+ 0001 01 TOTAL WATER TEMPERATURE PROFILE
+ 0002 01 TOTAL WATER SALINITY PROFILE
+ 0003 01 TOTAL WATER CONDUCTIVITY PROFILE
+ 0010 01 WATER PRESSURE AT A LEVEL
+ 0011 01 WATER TEMPERATURE AT A LEVEL
+ 0012 01 SALINITY AT A LEVEL
+ 0020 01 POSITION
+ 0063 01 MISSING VALUE
+008081 0005 0000 01 SENSOR
+ 0001 01 TRANSMITTER
+ 0002 01 RECEIVER
+ 0003 01 OBSERVING PLATFORM
+ 0063 01 MISSING VALUE
+008082 0003 0000 01 SENSOR HEIGHT IS NOT MODIFIED
+ 0001 01 SENSOR HEIGHT IS MODIFIED TO STANDARD LEVEL
+ 0007 01 MISSING VALUE
+008083 0009 0001 02 ADJUSTED WITH RESPECT TO REPRESENTATIVE HEIGHT OF SENSOR ABOVE
+ LOCAL GROUND (OR DECK OF MARINE PLATFORM)
+ 0002 02 ADJUSTED WITH RESPECT TO REPRESENTATIVE HEIGHT OF SENSOR ABOVE
+ WATER SURFACE
+ 0003 01 ADJUSTED WITH RESPECT TO STANDARD SURFACE ROUGHNESS
+ 0004 01 ADJUSTED WITH RESPECT TO WIND SPEED
+ 0005 01 ADJUSTED WITH RESPECT TO TEMPERATURE
+ 0006 01 ADJUSTED WITH RESPECT TO PRESSURE
+ 0007 01 ADJUSTED WITH RESPECT TO HUMIDITY
+ 0008 01 ADJUSTED WITH RESPECT TO EVAPORATION
+ 0009 01 ADJUSTED WITH RESPECT TO WETTING LOSSES
+008085 0004 0000 01 FORE BEAM
+ 0001 01 MID BEAM
+ 0002 01 AFT BEAM
+ 0003 01 RESERVED
+ 0004 01 RESERVED
+ 0005 01 RESERVED
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+008193 0007 0000 01 START TIME OF ORBIT
+ 0001 01 END TIME OF ORBIT
+ 0002 01 TIME OF ASCENDING NODE
+ 0003 01 ASSIMILATION TIME
+ 0004 01 START TIME OF ASSIMILATION
+ 0005 01 END TIME OF ASSIMLATION
+ 0063 01 MISSING
+008195 0032 0001 01 FIRST GUESS
+ 0002 01 ANALYSIS
+ 0003 01 INITIALISED ANALYSIS
+ 0004 01 OI ANALYSIS
+ 0005 01 3 D VARIATIONAL ANALYSIS
+ 0006 01 4 D VARIATIONAL ANALYSIS
+ 0007 01 3 D VARIATIONAL GRADIENTS
+ 0008 01 4 D VARIATIONAL GRADIENTS
+ 0009 01 FORECAST
+ 0010 01 CONTROL FORECAST
+ 0011 01 PERTURBED FORECAST
+ 0012 01 ERRORS IN FIRST GUESS
+ 0013 01 ERRORS IN ANALYSIS
+ 0014 01 CLUSTER MEANS
+ 0015 01 CLUSTER STANDARD DEVIATIONS
+ 0016 01 FORECAST PROBABILITIES
+ 0017 01 ENSEMBLE MEANS
+ 0018 01 ENSEMBLE STANDARD DEVIATIONS
+ 0019 01 FORECAST ACCUMULATIONS
+ 0020 01 CLIMATOLOGY
+ 0021 01 CLIMATE SIMULATION
+ 0030 01 OBSERVATIONS
+ 0031 01 QUALITY CONTROL
+ 0032 01 DIFFERENCE STATISTICS
+ 0040 01 IMAGE DATA
+ 0050 01 SENSITIVITY GRADIENTS
+ 0051 01 TRAJECTORY FORECAST
+ 0052 01 SENSITIVITY FORECAST
+ 0060 01 PERTURBED ANALYSIS
+ 0061 01 PERTURBATION
+ 0062 01 SINGULAR VECTOR
+ 0127 01 MISSING VALUE
+010063 0010 0000 02 INCREASING, THEN DECREASING: ATMOSPHERIC PRESURE THE SAME OR
+ HIGHER THAN 3 HOURS AGO (OR 24 HOURS AGO )
+ 0001 01 INCREASING, THEN STEADY; OR INCREASING; THEN MORE SLOWLY
+ 0002 01 INCREASING (STEADILY OR UNSTEADILY )
+ 0003 01 DECREASING OR STEADY, THEN INCREASING; RAPIDLY
+ 0004 02 STEADY; ATMOSPHERIC PRESSURE THE SAME AS 3 HOURS AGO (OR 24
+ HOURS)
+ 0005 02 DECREASING; THEN INCREASING; ATMOSPHERIC PRESSURE THE SAME O
+ R LOWER THAN 3 HOURS AGO
+ 0006 02 DECREASING, THEN STEADY; OR DECREASING, DECREASING MORE SLOW
+ LY
+ 0007 01 DECREASING (STEADILY OR UNSTEADELY )
+ 0008 02 STEADY OR INCREASING, THEN DECREASING; OR DECREASING, THEN
+ DECREASING MORE RAPIDLY
+ 0015 01 MISSING
+010064 0004 0000 01 SUBSONIC
+ 0001 01 TRANSONIC
+ 0002 01 SUPERSONIC
+ 0007 01 MISSING VALUE
+011031 0009 0000 01 NIL IN CLOUD
+ 0001 01 SLIGHT IN CLOUD
+ 0002 01 MODERATE IN CLOUD
+ 0003 01 SEVERE IN CLOUD
+ 0004 01 NIL IN CLEAR AIR
+ 0005 01 SLIGHT IN CLEAR AIR
+ 0006 01 MODERATE IN CLEAR AIR
+ 0007 01 SEVERE IN CLEAR AIR
+ 0015 01 MISSING VALUE
+011037 0030 0000 01 AVE <0.1 PEAK <0.1
+ 0001 01 AVE <0.1 0.1 <= PEAK <0.2
+ 0002 01 0.1 <= AVE <0.2 0.1 <= PEAK <0.2
+ 0003 01 AVE <0.1 0.2 <= PEAK <0.3
+ 0004 01 0.1 <= AVE <0.2 0.2 <= PEAK <0.3
+ 0005 01 0.2 <= AVE <0.3 0.2 <= PEAK <0.3
+ 0006 01 AVE <0.1 0.3 <= PEAK <0.4
+ 0007 01 0.1 <= AVE <0.2 0.3 <= PEAK <0.4
+ 0008 01 0.2 <= AVE <0.3 0.3 <= PEAK <0.4
+ 0009 01 0.3 <= AVE <0.4 0.3 <= PEAK <0.4
+ 0010 01 AVE <0.1 0.4 <= PEAK <0.5
+ 0011 01 0.1 <= AVE <0.2 0.4 <= PEAK <0.5
+ 0012 01 0.2 <= AVE <0.3 0.4 <= PEAK <0.5
+ 0013 01 0.3 <= AVE <0.4 0.4 <= PEAK <0.5
+ 0014 01 0.4 <= AVE <0.5 0.4 <= PEAK <0.5
+ 0015 01 AVE <0.1 0.5 <= PEAK <0.8
+ 0016 01 0.1 <= AVE <0.2 0.5 <= PEAK <0.8
+ 0017 01 0.2 <= AVE <0.3 0.5 <= PEAK <0.8
+ 0018 01 0.3 <= AVE <0.4 0.5 <= PEAK <0.8
+ 0019 01 0.4 <= AVE <0.5 0.5 <= PEAK <0.8
+ 0020 01 0.5 <= AVE <0.8 0.5 <= PEAK <0.8
+ 0021 01 AVE <0.1 0.8 <= PEAK
+ 0022 01 0.1 <= AVE <0.2 0.8 <= PEAK
+ 0023 01 0.2 <= AVE <0.3 0.8 <= PEAK
+ 0024 01 0.3 <= AVE <0.4 0.8 <= PEAK
+ 0025 01 0.4 <= AVE <0.5 0.8 <= PEAK
+ 0026 01 0.5 <= AVE <0.8 0.8 <= PEAK
+ 0027 01 0.8 <= AVE 0.8 <= PEAK
+ 0028 01 NIL NIL
+ 0063 01 MISSING VALUE
+011038 0017 0000 01 MIN < 1
+ 0001 01 1 <= MIN < 2
+ 0002 01 2 <= MIN < 3
+ 0003 01 3 <= MIN < 4
+ 0004 01 4 <= MIN < 5
+ 0005 01 5 <= MIN < 6
+ 0006 01 6 <= MIN < 7
+ 0007 01 7 <= MIN < 8
+ 0008 01 8 <= MIN < 9
+ 0009 01 9 <= MIN < 10
+ 0010 01 10 <= MIN < 11
+ 0011 01 11 <= MIN < 12
+ 0012 01 12 <= MIN < 13
+ 0013 01 13 <= MIN < 14
+ 0014 01 14 <= MIN < 15
+ 0015 01 NO TIMING INFORMATION AVAILABLE
+ 0031 01 MISSING VALUE
+011039 0016 0000 01 1 <= MIN < 2
+ 0001 01 2 <= MIN < 3
+ 0002 01 3 <= MIN < 4
+ 0004 01 4 <= MIN < 5
+ 0005 01 5 <= MIN < 6
+ 0006 01 6 <= MIN < 7
+ 0007 01 7 <= MIN < 8
+ 0008 01 8 <= MIN < 9
+ 0009 01 9 <= MIN < 10
+ 0010 01 10 <= MIN < 11
+ 0011 01 11 <= MIN < 12
+ 0012 01 12 <= MIN < 13
+ 0013 01 13 <= MIN < 14
+ 0014 01 14 <= MIN < 15
+ 0060 01 NO TIMING INFORMATION AVAILABLE
+ 0063 01 MISSING VALUE
+013038 0004 0000 01 NOT SUPERADIABATIC
+ 0001 01 SUPERADIABATIC
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+013039 0003 0000 01 SEA ICE
+ 0001 01 SNOW ON LAND
+ 0007 01 MISSING VALUE
+013040 0009 0000 01 LAND
+ 0001 01 RESERVED
+ 0002 01 NEAR COAST
+ 0003 01 ICE
+ 0004 01 POSSIBLE ICE
+ 0005 01 OCEAN
+ 0006 01 COAST
+ 0007 01 DESERT
+ 0015 01 MISSING VALUE
+013041 0010 0001 01 A
+ 0002 01 A-B
+ 0003 01 B
+ 0004 01 B-C
+ 0005 01 C
+ 0006 01 D
+ 0007 01 E
+ 0008 01 F
+ 0009 01 G
+ 0015 01 MISSING VALUE
+013051 0008 0000 01 SMALLER THAN ANY VALUE IN THE 30 YEARS PERIOD
+ 0001 01 IN THE FIRST QUINTILE
+ 0002 01 IN THE SECOND QUINTILE
+ 0003 01 IN THE THIRD QUINTILE
+ 0004 01 IN THE FOURTH QUINTILE
+ 0005 01 IN THE FIFTH QUINTILE
+ 0006 01 GREATER THAN ANY VALUE IN THE 30 YEAR PERIOD
+ 0015 01 MISSING VALUE
+013056 0010 0000 01 NO PRECIPITATION
+ 0001 01 LIGHT INTERMITTENT
+ 0002 01 MODERATE INTERMITTENT
+ 0003 01 HEAVY INTERMITTENT
+ 0004 01 VERY HEAVY INTERMITTENT
+ 0005 01 LIGHT CONTINUOUS
+ 0006 01 MODERATE CONTINUOUS
+ 0007 01 VERY HEAVY CONTINUOUS
+ 0009 01 VARIABLE-ALTERNATIVELY LIGHT AND HEAVY
+ 0015 01 MISSING VALUE
+013057 0011 0000 01 NO PRECIPITATION
+ 0001 01 WITHIN THE LAST HOUR
+ 0002 01 1 TO 2 HOURS AGO
+ 0003 01 2 TO 3 HOURS AGO
+ 0004 01 3 TO 4 HOURS AGO
+ 0005 01 4 TO 5 HOURS AGO
+ 0006 01 5 TO 6 HOURS AGO
+ 0007 01 6 TO 8 HOURS AGO
+ 0008 01 8 TO 10 HOURS AGO
+ 0009 01 MORE THAN 10 HOURS AHO
+ 0015 01 MISSING VALUE
+013202 0007 0000 01 LAND
+ 0001 01 VEGETATION
+ 0003 01 MULTI-YEAR ICE
+ 0004 01 POSSIBLE ICE OR FIRST YEAR ICE
+ 0005 01 OCEAN
+ 0006 01 COASTLINE
+ 0015 01 MISSING
+015025 0000 0000 01 OZONE
+ 0015 01 MISSING VALUE
+019001 0007 0000 01 DEPRESSION OR LOW (EXTRATROPICAL)
+ 0001 01 TROPICAL DEPRESSION
+ 0002 01 TROPICAL STORM
+ 0003 01 SEVERE TROPICAL STORM
+ 0004 01 TYPHOON
+ 0010 01 DUST/SANDSTORM
+ 0063 01 MISSING VALUE
+019008 0005 0000 01 RESERVED
+ 0001 01 SHALLOW (TOP OF CIRCULATION BELOW 700-HPA LEVEL
+ 0002 01 MEDIUM(TOP BETWEEN 700-HPA AND 400-HPA)
+ 0003 01 DEEP(TOP ABOVE 400-HPA LEVEL
+ 0007 01 MISSING VALUE
+019010 0004 0000 01 RESERVED
+ 0001 01 MINIMUM VALUE OF SEA LEVEL PRESSURE
+ 0002 01 MAXIMUM VALUE OF 850 HPA RELATIVE VORTICITY
+ 0015 01 MISSING VALUE
+020003 0250 0000 01 CLOUD DEVELOPMENT NOT OBSERVED OR NOT OBSERVABLE
+ 0001 01 CLOUDS GENERALLY DISSOLVING OR BECOMING LESS DEVELOPED
+ 0002 01 STATE OF SKY ON THE WHOLE UNCHANGED
+ 0003 01 CLOUDS GENERALLY FORMING OR DEVELOPING
+ 0004 02 VISIBILITY REDUCED BY SMOKE, E.G. VELDT OR FOREST FIRES, IN
+ DUSTRIAL SMOKE OR VOLCANIC ASHES
+ 0005 01 HAZE
+ 0006 02 WIDESPREAD DUST IN SUSPENSION IN THE AIR, NOT RAISED BY WIND
+ AT OR NEAR THE STATION AT THE TIME OF OBSERVATION
+ 0007 04 DUST OR SEND RAISED BY WIND AT OR NEAR THE STATION AT THE TI
+ ME OF OBSERVATION, BUT NO WELL-DEVELOPED DUST WHRIL(S) OR SA
+ ND WHRIL(S), AND NO DUSTSTORM OR SANDSTORM SEEN; OR, IN THE
+ CASE OF SHIPS, BLOWING SPRAY AT THE STATION
+ 0008 03 WELL-DEVELOPED DUST WHRIL(S) OR SAND WHRILS SEEN AT OR NEAR
+ THE STATION DURING THE PRECEDING HOUR OR AT THE SAME TIME OF
+ OBSERVATION, BUT NO DUSTSTORM OR SANDSTORM
+ 0009 02 DUSTSTORM OR SANDSTORM WITHIN SIGHT AT THE TIME OF OBSERVATI
+ ON, OR AT THE STATION DURING THE PRECEDING HOR
+ 0010 01 MIST
+ 0011 02 PACHES SHALLOW FOG OR ICE AT THE STATION, WHETHER ON LAND OR
+ SEA, NOT DEEPER THAN 2 METRES ON LAND OR 10 METRES AT SEA
+ 0012 03 MORE OR LESS CONTINUOUS SHALLOW FOG OR ICE AT THE STATION,
+ WHETHER ON LAND OR SEA, NOT DEEPER THAN 2 METRES ON LAND OR
+ 10 METRES AT SEA
+ 0013 01 LIGHTNING VISIBLE, NO THUNDER HEARD
+ 0014 02 PRECIPITATION WITHIN SIGHT, NOT REACHING THE GROUND OR THE
+ SURFACE OF THE SEA
+ 0015 03 PRECIPITATION WITHIN SIGHT, REACHING THE GROUND OR THE SURFA
+ CE OF THE SEA, BUT DISTANT, I.E. ESTIMATED TO BE MORE THAN
+ 5 KM FROM THE STATION
+ 0016 02 PRECIPITATION WITHIN SIGHT, REACHING THE GROUND OR THE SURFA
+ CE OF THE SEA, NEAR TO, BUT NOT AT THE STATION
+ 0017 02 THUNDERSTORM, BUT NO PRECIPITATION AT THE TIME OF OBSERVATIO
+ N
+ 0018 02 SQUALLS AT OR WITHIN SIGHT OF THE STATION DURING THE PRECEDI
+ NG HOUR OR AT THE TIME OF OBSERVATION
+ 0019 02 FUNNEL CLOUD(S) AT OR WITHIN SIGHT OF THE STATION DURING THE
+ PRECEDING HOUR OR AT THE TIME OF OBSERVATION
+ 0020 03 DRIZZEL (NOT FREEZING) OR SNOW GRAINS NOT FALLING AS SHOWERS
+ ; DURING THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVAT
+ IONS
+ 0021 02 RAIN (NOT FREEZING) NOT FALLING AS SHOWER(S); DURING THE PRE
+ ECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0022 02 SNOW NOT FALLING AS SHOWER(S); DURING THE PRECEDING HOUR BUT
+ NOT AT THE TIME OF OBSERVATION
+ 0023 02 RAIN AND SNOW OR ICE PELLETS NOT FALLING AS SHOWER(S); DURIN
+ G THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0024 02 FREEZING DRIZZEL OR FREEZING RAIN NOT FALLING AS SHOWER(S);
+ DURING THE PRECEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0025 02 SHOWER(S) OF RAIN; DURING THE PRECEDING HOUR BUT NOT AT THE
+ TIME OF OBSERVATION
+ 0026 02 SHOWER(S) OF SNOW, OR OF RAIN AND SNOW; DURING THE PRECEDING
+ HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0027 02 SHOWER(S) OF HAIL, OR OF RAIN AND HAIL; DURING THE PRECEDING
+ HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0028 02 FOG OR ICE FOG; DURING THE PRECEDING HOUR BUT NOT AT THE TIM
+ E OF OBSERVATION
+ 0029 02 THUNDERSTORM (WITH OR WITHOUT PRECIPITATION); DURING THE PRE
+ CEDING HOUR BUT NOT AT THE TIME OF OBSERVATION
+ 0030 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM HAS DECREASED DURI
+ NG THE PRECEDING HOURS
+ 0031 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM NO APPRECIABLE CHA
+ NGE DURING THE PRECEDING HOUR
+ 0032 02 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM HAS BEGUN OR HAS I
+ NCEASED DURING THE PRECEDING HOUR
+ 0033 02 SEVERE DUSTSTORM OR SANDSTORM HAS DECREASED DURING THE PREC
+ EDING HOURS
+ 0034 02 SEVERE DUSTSTORM OR SANDSTORM NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0035 02 SEVERE DUSTSTORM OR SANDSTORM HAS BEGUN OR HAS INCREASED DUR
+ ING THE PRECEDING HOUR
+ 0036 02 SLIGHT OR MODERATE DRIFTING SNOW GENERALLY LOW (BELOW EYE LE
+ VEL)
+ 0037 01 HEAVY DRIFTING SNOW GENERALY LOW (BELOW EYE LEVEL)
+ 0038 02 SLIGHT OR MODERATE BLOWING SNOW GENERALLY HIGH (ABOVE EYE LE
+ VEL)
+ 0039 01 HEAVY BLOWING SNOW GENERALY HIGH (ABOVE EYE LEVEL)
+ 0040 03 FOG OR ICE FOG AT A DISTANCE AT THE TIME OF OBSERVATION, BUT
+ NOT AT THE STATION DURING THE PRECEDING HOUR, THE FOG OR IC
+ E FOG EXTENDING TO A LEVEL ABOVE THAT OF THE OBSERVER
+ 0041 01 FOG OR ICE FOG IN PATCHES
+ 0042 02 FOG OR ICE FOG, SKY VISIBLE,HAS BECOME THINNER DURING THE PR
+ ECEDING HOUR
+ 0043 02 FOG OR ICE FOG, SKY INVISIBLE,HAS BECOME THINNER DURING THE
+ PRECEDING HOUR
+ 0044 02 FOG OR ICE FOG, SKY VISIBLE,NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0045 02 FOG OR ICE FOG, SKY INVISIBLE,NO APPRECIABLE CHANGE DURING T
+ HE PRECEDING HOUR
+ 0046 02 FOG OR ICE FOG, SKY VISIBLE,HAS BEGUN OR HAS BECOME THICKE
+ R DURING THE PRECEDING HOUR
+ 0047 02 FOG OR ICE FOG, SKY INVISIBLE,HAS BEGUN OR HAS BECOME THICKE
+ R DURING THE PRECEDING HOUR
+ 0048 01 FOG, DEPOSITING RIME, SKY VISIBLE
+ 0049 01 FOG, DEPOSITING RIME, SKY INVISIBLE
+ 0050 02 DRIZZLE, NOT FREEZING, INTERMITTENT;SLIGHT AT TIME OF OBSERV
+ ATION
+ 0051 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;SLIGHT AT TIME OF OBSERV
+ ATION
+ 0052 02 DRIZZLE, NOT FREEZING, INTERMITTENT;MODERATE AT TIME OF OBSE
+ RVATION
+ 0053 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;MODERATE AT TIME OF OBSE
+ RVATION
+ 0054 02 DRIZZLE, NOT FREEZING, INTERMITTENT;HEAVY (DENSE) AT THE TIM
+ E OF OBSERVATION
+ 0055 02 DRIZZLE, NOT FREEZING, CONTINUOUS ;HEAVY (DENSE) AT THE TIM
+ E OF OBSERVATION
+ 0056 01 DRIZZLE, FREEZING, SLIGHT
+ 0057 01 DRIZZLE, FREEZING, MODERATE OR HEAVY (DENSE)
+ 0058 01 DRIZZLE AND RAIN, SLIGHT
+ 0059 01 DRIZZLE AND RAIN, MODERATE OR HEAVY
+ 0060 01 RAIN,NOT FREEZING,INTERMITTENT;SLIGHT AT TIME OF OBSERVATION
+ 0061 01 RAIN,NOT FREEZING,CONTINUOUS ;SLIGHT AT TIME OF OBSERVATION
+ 0062 02 RAIN,NOT FREEZING,INTERMITTENT;MODERATE AT TIME OF OBSERVATI
+ ON
+ 0063 02 RAIN,NOT FREEZING,CONTINUOUS ;MODERATE AT TIME OF OBSERVATI
+ ON
+ 0064 02 RAIN, NOT FREEZING, INTERMITTENT;HEAVY AT TIME OF OBSERVATIO
+ ON
+ 0065 01 RAIN, NOT FREEZING, CONTINUOUS;HEAVY AT TIME OF OBSERVATION
+ 0066 01 RAIN, FREEZING, SLIGHT
+ 0067 01 RAIN, FREEZING, MODERATE OR HEAVY
+ 0068 01 RAIN OR DRIZZLE AND SNOW, LIGHT
+ 0069 01 RAIN OR DRIZZLE AND SNOW, MODERATE OR HEAVY
+ 0070 02 INTERMITTENT FALL OF SNOWFLAKES, SLIGHT AT TIME OF OBSERVATI
+ ON
+ 0071 02 CONTINUOUS FALL OF SNOWFLAKES, SLIGHT AT TIME OF OBSERVATI
+ ON
+ 0072 02 INTERMITTENT FALL OF SNOWFLAKES, MODERATE AT TIME OF OBSERVA
+ TION
+ 0073 02 CONTINUOUS FALL OF SNOWFLAKES, MODERATE AT TIME OF OBSERVA
+ TION
+ 0074 02 INTERMITTENT FALL OF SNOWFLAKES, HEAVY AT TIME OF OBSERVATIO
+ ONS
+ 0075 02 CONTINUOUS FALL OF SNOWFLAKES, HEAVY AT TIME OF OBSERVATIO
+ ONS
+ 0076 01 DIAMOND DUST (WITH OR WITHOUT FOG)
+ 0077 01 SNOW GRAINS (WITH OR WITHOUT FOG)
+ 0078 01 ISOLATED STAR-LIKE SNOW CRYSTALS (WITH OR WITHOUT FOG)
+ 0079 01 ICE PELLETS
+ 0080 01 RAIN SHOWER(S), SLIGHT
+ 0081 01 RAIN SHOWER(S), MODERATE OR HEAVY
+ 0082 01 RAIN SHOWER(S), VIOLENT
+ 0083 01 SHOWER(S) OF RAIN AND SNOW MIXED, SLIGHT
+ 0084 01 SHOWER(S) OF RAIN AND SNOW MIXED, MODERATE OR HEAVY
+ 0085 01 SNOW SHOWER(S), SLIGHT
+ 0086 01 SNOW SHOWER(S), MODERATE OR HEAVY
+ 0087 02 SHOWER(S) OF SNOW PELLETS OR SMALL HAIL, WITH OR WITHOUT RAI
+ N OR RAIN AND SNOW MIXED, SLIGHT
+ 0088 02 SHOWER(S) OF SNOW PELLETS OR SMALL HAIL, WITH OR WITHOUT RAI
+ N OR RAIN AND SNOW MIXED, MODERATE OR HEAVY
+ 0089 02 SHOWER(S) OF HAIL, WITH OR WITHOUT RAIN OR RAIN AND SNOW MIX
+ ED, NOT ASSOCIATED WITH THUNDER, SLIGHT
+ 0090 02 SHOWER(S) OF HAIL, WITH OR WITHOUT RAIN OR RAIN AND SNOW MIX
+ ED, NOT ASSOCIATED WITH THUNDER, MODERATE OR HEAVY
+ 0091 02 SLIGHT RAIN AT TIME OF OBSERVATION, THUNDERSTORM DURING THE
+ PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0092 02 MODERATE OR HEAVY RAIN AT TIME OF OBSERVATION, THUNDERSTORM
+ DURING THE PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0093 03 SLIGHT SNOW, OR RAIN AND SNOW MIXED OR HAIL AT TIME OF OBSER
+ VATION, THUNDERSTORM DURING THE PRECEDING HOUR BUT NOT AT TI
+ ME OF OBSERVATION
+ 0094 03 MODERATE OR HEAVY SNOW, OR RAIN AND SNOW MIXED OR HAIL AT TI
+ ME OF OBSERVATION, THUNDERSTORM DURING PRECEDING HOUR BUT NO
+ T AT TIME OF OBSERVATION
+ 0095 03 THUNDERSTORM, SLIGHT OR MODERATE, WITHOUT HAIL, BUT WITH RAI
+ N AND/OR SNOW AT TIME OF OBSERVATION, THUNDERSTORM DURING TH
+ E PRECEDING HOUR BUT NOT AT TIME OF OBSERVATION
+ 0096 02 THUNDERSTORM, SLIGHT OR MODERATE,WITH HAIL AT TIME OF OBSERV
+ ATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0097 02 THUNDERSTORM, HEAVY, WITHOUT HAIL BUT WITH RAIN AND/OR SNOW
+ AT TIME OF OBSERVATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0098 02 THUNDERSTORM COMBINED WITH DUSTSTORM OR SANDSTORM AT TIME OF
+ OBSERVATION, THUNDERSTORM AT TIME OF OBSERVATION
+ 0099 02 THUNDERSTORM, HEAVY, WITH HAIL AT TIME OF OBSERVATION, THUND
+ ERSTORM AT TIME OF OBSERVATION
+ 0100 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0101 02 CLOUDS GENERALLY DISSOLVING OR BECOMING LESS DEVELOPED DURIN
+ G THE PAST HOUR
+ 0102 01 STATE OF SKY ON THE WHOLE UNCHANGED DURING THE PAST HOUR
+ 0103 01 CLOUDS GENERALLY FORMING OR DEVELOPING DURING THE PAST HOUR
+ 0104 02 HAZE OR SMOKE, OR DUST IN SUSPENSION IN THE AIR, VISIBILITY
+ EQUAL TO, OR GREATER THAN 1KM
+ 0105 02 HAZE OR SMOKE, OR DUST IN SUSPENSION IN THE AIR, VISIBILITY
+ LESS THAN 1KM
+ 0110 01 MIST
+ 0111 01 DIAMOND DUST
+ 0112 01 DISTANT LIGHTING
+ 0118 01 SQUALLS
+ 0120 01 FOG
+ 0121 01 PRECIPITATION
+ 0122 01 DRIZZLE (NOT FREEZING) OR SNOW GRAINS
+ 0123 01 RAIN (NOT FREEZING)
+ 0124 01 SNOW
+ 0125 01 FREEZING DRIZZLE OR FREEZING RAIN
+ 0126 01 THUNDERSTORM (WITH OR WITHOUT PRECIPITATION)
+ 0127 01 BLOWING OR DRIFTING SNOW OR SAND
+ 0128 02 BLOWING OR DRIFTING SNOW OR SAND, VISIBILITY EQUAL TO, OR GR
+ ATER THAN, 1KM
+ 0129 01 BLOWING OR DRIFTING SNOW OR SAND, VISIBILITY LESS THAN 1 KM
+ 0130 01 FOG
+ 0131 01 FOG OR ICE FOG, IN PATCHES
+ 0132 01 FOG OR ICE FOG, HAS BECOME THINNER DURING PAST HOUR
+ 0133 01 FOG OR ICE FOG, NO APPRECIABLE CHANGE DURING PAST HOUR
+ 0134 01 FOG OR ICE FOG, HAS BECUNOR BECOME THICKER DURING PAST HOUR
+ 0135 01 FOG, DEPOSITION RIME
+ 0140 01 PRECIPITATION
+ 0141 01 PRECIPITATION SLIGHT OR MODERATE
+ 0142 01 PRECIPITATION, HEAVY
+ 0143 01 LIQUID PRECIPITATION, SLIGHT OR MODERATE
+ 0144 01 LIQUID PRECIPITATION, HEAVY
+ 0145 01 SOLID PRECIPITATION, SLIGHT OR MODERATE
+ 0146 01 SOLID PRECIPITATION, HEAVY
+ 0147 01 FREEZING PRECIPITATION, SLIGHT OR MODERATE
+ 0148 01 FREEZING PRECIPITATION, HEAVY
+ 0150 01 DRIZZLE
+ 0151 01 DRIZZLE, NOT FREEZING, SLIGHT
+ 0152 01 DRIZZLE, NOT FREEZING, MODERATE
+ 0153 01 DRIZZLE, NOT FREEZING, HEAVY
+ 0154 01 DRIZZLE, FREEZING, SLIGHT
+ 0155 01 DRIZZLE, FREEZING, MODERATE
+ 0156 01 DRIZZLE, FREEZING, HEAVY
+ 0157 01 DRIZZLE AND RAIN, SLIGHT
+ 0158 01 DRIZZLE AND RAIN, MODERATE OR HEAVY
+ 0160 01 RAIN
+ 0161 01 RAIN, NOT FREEZING, SLIGHT
+ 0162 01 RAIN, NOT FREEZING, MODERATE
+ 0163 01 RAIN, NOT FREEZING, HEAVY
+ 0164 01 RAIN, FREEZING, SLIGHT
+ 0165 01 RAIN, FREEZING, MODERATE
+ 0166 01 RAIN, FREEZING, HEAVY
+ 0167 01 RAIN (OR DRIZZLE) AND SNOW, SLIGHT
+ 0168 01 RAIN (OR DRIZZLE) AND SNOW, MODERATE AND HEAVY
+ 0170 01 SNOW
+ 0171 01 SNOW, SLIGHT
+ 0172 01 SNOW, MODERATE
+ 0173 01 SNOW, HEAVY
+ 0174 01 ICE PELLETS, SLIGHT
+ 0175 01 ICE PELLETS, MODERATE
+ 0176 01 ICE PELLETS, HEAVY
+ 0180 01 SHOWER(S) OR INTERMITTENT PRECIPITATION
+ 0181 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, SLIGHT
+ 0182 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, MODERATE
+ 0183 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, HEAVY
+ 0184 01 RAIN SHOWER(S) OR INTERMITTENT RAIN, VIOLENT
+ 0185 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, SLIGHT
+ 0186 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, MODERATE
+ 0187 01 SNOW SHOWER(S) OR INTERMITTENT SNOW, HEAVY
+ 0190 01 THUNDERSTORM
+ 0191 01 THUNDERSTORM, SLIGHT OR MODERATE, WITH NO PRECIPITATION
+ 0192 02 THUNDERSTORM, SLIGHT OR MODERATE, WITH RAIN SHOWERS AND/OR S
+ NOW SHOWERS
+ 0193 01 THUNDERSTORM, SLIGHT OR MODERATE, WITH HAIL
+ 0194 01 THUNDERSTORM, HEAVY, WITH NO PRECIPITATION
+ 0195 01 THUNDERSTORM, HEAVY, WITH RAIN SHOWERS AND/OR SNOW SHOWERS
+ 0196 01 THUNDERSTORM, HEAVY, WITH HAIL
+ 0204 01 VOLCANIC ASH SUSPENDED IN THE AIR ALOFT
+ 0206 01 THICK DUST HAZE, VISIBILITY LESS THAN 1 KM
+ 0207 01 BLOWING SPRAY AT THE STATION
+ 0208 01 DRIFTING DUST (SAND)
+ 0209 01 WALL OF DUST OR SAND IN DISTANCE (LIKE HABOOB)
+ 0210 01 SNOW HAZE
+ 0211 01 WHITEOUT
+ 0213 01 LIGHTING, CLOUD TO SURFACE
+ 0217 01 DRY THUNDERSTORM
+ 0219 02 TORNADO CLOUD (DESTRUCTIVE AT OR WITHIN SIGHT OF THE STATION
+ DURING PRECEDING HOUR OR AT THE TIME OF OBSERVATION
+ 0220 01 DEPOSITION OF VOLCANIC ASH
+ 0221 01 DEPOSITION OF DUST OR SAND
+ 0222 01 DEPOSITION OF DEW
+ 0223 01 DEPOSITION OF WET SNOW
+ 0224 01 DEPOSITION OF SOFT RIME
+ 0225 01 DEPOSITION OF HARD RIME
+ 0226 01 DEPOSITION OF HOAR FROST
+ 0227 01 DEPOSITION OF GLAZE
+ 0228 01 DEPOSITION OF ICE CRUST (ICE SLICK)
+ 0230 01 DUSTSTORM OR SANDSTORM WITH TEMPERATURE BELOW 0 C DEGREES
+ 0239 02 BLOWING SNOW, IMPOSSIBLE TO DETERMINE WHETHER SNOW IS FALLIN
+ G OR NOT
+ 0241 01 FOG ON SEA
+ 0242 01 FOG IN VALLEYS
+ 0243 01 ARCTIC OR ANTARCTIC SEA SMOKE
+ 0244 01 STEAM FOG (SEA,LAKE OR RIVER)
+ 0245 01 STEAM FOG (LAND)
+ 0246 01 FOG OVER ICE OR SNOW COVER
+ 0247 01 DENCE FOG VISIBILITY 60-90 M
+ 0248 01 DENCE FOG VISIBILITY 30-60 M
+ 0249 01 DENCE FOG VISIBILITY LESS THAN 30 M
+ 0250 01 DRIZZLE, RATE OF FALL LESS THAN 0.10 MM/H
+ 0251 01 DRIZZLE, RATE OF FALL 0.10 - .19 MM/H
+ 0252 01 DRIZZLE, RATE OF FALL 0.20 - .39 MM/H
+ 0253 01 DRIZZLE, RATE OF FALL 0.40 - .79 MM/H
+ 0254 01 DRIZZLE, RATE OF FALL 0.80 - 1.59 MM/H
+ 0255 01 DRIZZLE, RATE OF FALL 1.60 - 3.19 MM/H
+ 0256 01 DRIZZLE, RATE OF FALL 3.20 - 6.39 MM/H
+ 0257 01 DRIZZLE, RATE OF FALL 6.40 MM/H OR MORE
+ 0259 01 DRIZZLE AND SNOW
+ 0260 01 RAIN, RATE OF FALL LESS THAN 1.0 MM/H
+ 0261 01 RAIN, RATE OF FALL 1.0 - 1.9 MM/H
+ 0262 01 RAIN, RATE OF FALL 2.0 - 3.9 MM/H
+ 0263 01 RAIN, RATE OF FALL 4.0 - 7.9 MM/H
+ 0264 01 RAIN, RATE OF FALL 8.0 - 15.9 MM/H
+ 0265 01 RAIN, RATE OF FALL 16.0 - 31.9 MM/H
+ 0266 01 RAIN, RATE OF FALL 32.0 - 63.9 MM/H
+ 0267 01 RAIN, RATE OF FALL 64.0 MM/H OR MORE
+ 0270 01 SNOW, RATE OF FALL LESS THAN 1.0 CM/H
+ 0271 01 SNOW, RATE OF FALL 1.0 - 1.9 CM/H
+ 0272 01 SNOW, RATE OF FALL 2.0 - 3.9 CM/H
+ 0273 01 SNOW, RATE OF FALL 4.0 - 7.9 CM/H
+ 0274 01 SNOW, RATE OF FALL 8.0 - 15.9 CM/H
+ 0275 01 SNOW, RATE OF FALL 16.0 - 31.9 CM/H
+ 0276 01 SNOW, RATE OF FALL 32.0 - 63.9 CM/H
+ 0277 01 SNOW, RATE OF FALL 64.0 CM/H OR MORE
+ 0278 01 SNOW OR ICE CRISTAL PRECIPITATION FROM A CLEAR SKY
+ 0279 01 WET SNOW, FREEZING ON CONTACT
+ 0280 01 PRECIPITATION OF RAIN (WW= 87-99)
+ 0281 01 PRECIPITATION OF RAIN,FREEZING (WW= 80-82)
+ 0282 01 PRECIPITATION OF RAIN AND SNOW MIXED
+ 0283 01 PRECIPITATION OF SNOW
+ 0284 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL
+ 0285 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH RAIN
+ 0286 02 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH RAIN AND S
+ NOW MIXED
+ 0287 01 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH SNOW
+ 0288 01 PRECIPITATION OF HAIL
+ 0289 01 PRECIPITATION OF HAIL, WITH RAIN
+ 0290 01 PRECIPITATION OF HAIL, WITH RAIN AND SNOW MIXED
+ 0291 01 PRECIPITATION OF HAIL, WITH SNOW
+ 0292 01 SHOWER(S) OR THUNDERSTORM OVER SEA
+ 0293 01 SHOWER(S) OR THUNDERSTORM OVER MOUNTAINS
+ 0508 02 NO SIGNIFICANT PHENOMENA TO REPORT, PRESENT AND PAST WEATHER
+ OMITTED
+ 0509 02 NOT OBSERVED, NO DATA AVAILABLE, PRESENT AND PAST WEATHER OM
+ ITTED
+ 0510 01 PRESENT AND PAST WEATHER MISSING, BUT EXPECTED
+ 0511 01 MISSING VALUE
+020004 0021 0000 02 CLOUD COVERING 1/2 OR LESS OF THE SKY THROUGHOUT THE APPROPP
+ RIATE PERIOD
+ 0001 03 CLOUD COVERING MORE THAN 1/2 OF THE SKY DURING PART OF THE A
+ PPROPRIATE PERIOD AND COVERING 1/2 OR LESS DURING PART OF TH
+ E PERIOD
+ 0002 02 CLOUD COVERING MORE THAN 1/2 OF THE SKY THROUGHOUT THE APPRP
+ PRIATE PERIOD
+ 0003 01 SANSTORM, DUSTSTORM OR BLOWING SNOW
+ 0004 01 FOG OR ICE OR THICK HAZE
+ 0005 01 DRIZZLE
+ 0006 01 RAIN
+ 0007 01 SNOW, OR RAIN AND SNOW MIXED
+ 0008 01 SHOWER(S)
+ 0009 01 THUNDERSTORM(S) WITH OR WITHOUT PRECIPITATION
+ 0010 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0011 01 VISIBILITY REDUCED
+ 0012 01 BLOWING PHENOMENA, VISIBILITY REDUCED
+ 0013 01 FOG
+ 0014 01 PRECIPITATION
+ 0015 01 DRIZZLE
+ 0016 01 RAIN
+ 0017 01 SNOW OR ICE PELLETS
+ 0018 01 SHOWERS OR INTERMITTENT PRECIPITATION
+ 0019 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+020005 0021 0000 02 CLOUD COVERING 1/2 OR LESS OF THE SKY THROUGHOUT THE APPROPP
+ RIATE PERIOD
+ 0001 03 CLOUD COVERING MORE THAN 1/2 OF THE SKY DURING PART OF THE A
+ PPROPRIATE PERIOD AND COVERING 1/2 OR LESS DURING PART OF TH
+ E PERIOD
+ 0002 02 CLOUD COVERING MORE THAN 1/2 OF THE SKY THROUGHOUT THE APPRP
+ PRIATE PERIOD
+ 0003 01 SANSTORM, DUSTSTORM OR BLOWING SNOW
+ 0004 01 FOG OR ICE OR THICK HAZE
+ 0005 01 DRIZZLE
+ 0006 01 RAIN
+ 0007 01 SNOW, OR RAIN AND SNOW MIXED
+ 0008 01 SHOWER(S)
+ 0009 01 THUNDERSTORM(S) WITH OR WITHOUT PRECIPITATION
+ 0010 01 NO SIGNIFICANT WEATHER OBSERVED
+ 0011 01 VISIBILITY REDUCED
+ 0012 01 BLOWING PHENOMENA, VISIBILITY REDUCED
+ 0013 01 FOG
+ 0014 01 PRECIPITATION
+ 0015 01 DRIZZLE
+ 0016 01 RAIN
+ 0017 01 SNOW OR ICE PELLETS
+ 0018 01 SHOWERS OR INTERMITTENT PRECIPITATION
+ 0019 01 THUNDERSTORM
+ 0031 01 MISSING VALUE
+020008 0019 0000 01 SKY CLEAR
+ 0001 01 FEW
+ 0002 01 SCATTERED
+ 0003 01 BROKEN
+ 0004 01 OVERCAST
+ 0005 01 RESERVED
+ 0006 01 SCATTERED/BROKEN (MANY FORECASTS USE SCATTERED/BROKEN
+ 0007 01 BROKEN/OVERCAST (BROKEN/OVERCAST FOLLOWED BY CLOUD TYPE(S))
+ 0008 01 ISOLATED (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE CB)
+ 0009 01 ISOLATED EMBEDDED (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE CB)
+ 0010 01 OCCASIONAL (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE CB)
+ 0011 01 OCCASIONAL EMBEDDED (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE CB)
+ 0012 01 FREQUENT (USED ON AVIATION CHARTS TO DESCRIBE THE CLOUD TYPE CB)
+ 0013 02 DENSE (USED ON AVIATION CHARTS TO DESCRIBE CLOUD THAT WOULD CAUSE
+ SUDDEN CHANGES IN VISIBILITY (LESS THAN 1000M))
+ 0014 01 LAYERS
+ 0015 01 OBSCURED (OBSC)
+ 0016 01 EMBEDDED (EMBD)
+ 0017 01 FREQUENT EMBEDDED
+ 0031 01 MISSING VALUE
+020009 0006 0000 01 RESERVED
+ 0001 01 NSC MIL SIGNIFICANT CLOUD
+ 0002 01 CAVOK
+ 0003 01 SKC SKY CLEAR
+ 0004 01 NSW NIL SIGNIFICANT WEATHER
+ 0015 01 MISSING VALUE
+020011 0011 0000 01 0 0
+ 0001 01 1 OKTA OR LESS, BUT NOT ZERO 1/10 OR LESS, BUT NOT ZERO
+ 0002 01 2 OKTAS 2/10 - 3/10
+ 0003 01 3 OKTAS 4/10
+ 0004 01 4 OKTAS 5/10
+ 0005 01 5 OKTAS 6/10
+ 0006 01 6 OKTAS 7/10 - 8/10
+ 0007 01 7 OKTAS OR MORE,BUT NOT 8 OKTAS9/10 OR MORE, BUT NOT 10/10
+ 0008 01 8 OKTAS 10/10
+ 0009 01 SKY OBSCURED BY FOG AND OR OTHER METEOROLOGICAL PHENOMENA
+ 0015 02 CLOUD COVE IS INDISCERNIBLE FOR REASONS OTHER THAN FOG OR OT
+ HER METEOROLOGICAL PHENOMENA, OR OBSERVATION IS NOT MADE
+020012 0045 0000 01 CIRRUS (CI)...............CI
+ 0001 01 CIRROCUMULUS (CC).........CC
+ 0002 01 CIRROSTRATUS (CS).........CS
+ 0003 01 ALTOCUMULUS (AC).........AC
+ 0004 01 ALTOSTRATUS (AS).........AS
+ 0005 01 NIMBOSTRATUS (NS).........NS
+ 0006 01 STRATOCUMULUS(SC).........SC
+ 0007 01 STRATUS (ST).........ST
+ 0008 01 CUMULUS (CU).........CU
+ 0009 01 CUMULONIMBUS (CB).........CB
+ 0010 01 NO CH CLOUDS
+ 0011 02 CIRRUS FIBRATUS, SOMETIMES UNCINUS, NOT PROGRESSIVELY INADIN
+ G THE SKY
+ 0012 04 CIRRUS SPISSATUS, IN PATCHES OR ENTANGLED SHEAVES, WHICH USU
+ ALLY DO NOT INCREASE AND SOMETIMES SEEM TO BE THE REMAINS OF
+ THE UPPER PART OF A CUMULONIMBUS; OR CIRRUS CASTELLANUS OR
+ FLOCCUS
+ 0013 01 CIRRUS SPISSATUS CUMULONIMBOGENITUS
+ 0014 02 CIRRUS UNCINUS OR FIBRATUS,OR BOTH, PROGRESSIVELY INVADING T
+ HE SKY ; THEY GENERALLY THICKEN AS A WHOLE
+ 0015 04 CIRRUS (OFTEN IN BANDS) AND CIRROSTRATUS, OR CIRROSTRATUS AL
+ ONE, PROGRESSIVELY INVADING THE SKY; THEY GENERALLY THICKEN
+ ASA WHOLE, BUT THE CONTINUOUS VEIL DOES NOT REACH 45 DEGREES
+ ABOVE THE HORIZON
+ 0016 05 CIRRUS (OFTEN IN BANDS) AND CIRROSTRATUS, OR CIRROSTRATUS AL
+ ONE, PROGRESSIVELY INVADING THE SKY; THEY GENERALLY THICKEN
+ ASA WHOLE, BUT THE CONTINUOUS VEIL EXTENDS MORE THAN 45 DEGR
+ REES ABOVE THE HORIZON, WITHOUT THE SKY BEING TOTALLY COVERE
+ D
+ 0017 01 CIRROSTRATUS COVERING THE WHOLE SKY
+ 0018 02 CIRROSTRATUS NOT PROGRESSIVELY INVADING THE SKY AND NOT ENTI
+ RELY COVERING IT
+ 0019 02 CIRROCUMULUS ALONE, OR CIRROCUMULUS PREDOMINANT AMONG THE CH
+ CLOUDS
+ 0020 01 NO CM CLOUDS
+ 0021 01 ALTOSTRATUS TRANSLUCIDUS
+ 0022 01 ALTOSTRATUS OPACUS OR NIMBOSTRATUS
+ 0023 01 ALTOCUMULUS TRANSLUCIDUS AT A SINGLE LEVEL
+ 0024 02 PATCHES (OFTEN LENTICULARIS) OF ALTOCUMULUS TRANSLUCIDUS, CO
+ NTINUALLY CHANGING AND OCCURING AT ONE OR MORE LEVELS
+ 0025 04 ALTOCUMULUS TRANSLUCIDUS IN BANDS, OR ONE OR MORE LAYERS OF
+ ALTOCUMULUS TRANSLUCIDUS OR OPACUS, PROGRESSIVELY INVADING T
+ HE SKY; THESE ALTOCUMULUS CLOUDS GENERALLY THICKEN AS A WHOL
+ E
+ 0026 01 ALTOCUMULUS CUMULOGENITUS (OR CUMULONIMBOGENITUS)
+ 0027 04 ALTOCUMULUS TRANSLUCIDUS OR OPACUS IN TWO OR MORE LAYERS, OR
+ ALTOCUMULUS OPACUS IN A SINGLE LAYER, NOT PROGRESSIVELY INV
+ ADING THE SKY, OR ALTOCUMULUS WITH ALTOSTRATUS OR NIMBOSTRAT
+ US
+ 0028 01 ALTOCUMULUS CASTELLANUS OR FLOCUS
+ 0029 01 ALTOCUMULUS OF CHAOTIC SKY, GENERALLY AT SEVERAL LEVELS
+ 0030 01 NO CL CLOUDS
+ 0031 02 CUMULUS HUMILIS OR CUMULUS FRACTUS OTHER THAN OF BAD WEATHER
+ , OR BOTH
+ 0032 03 CUMULUS MEDIOCRIS OR CONGESTUS, WITH OR WITHOUT CUMULUS OF S
+ PECIES FRACTUS OR HUMULIS OR STRATOCUMULUS, ALL HAVING THEIR
+ BASES AT THE SAME LEVEL
+ 0033 02 CUMULONIMBUS CALVUS, WITH OR WITHOUT CUMULUS, STRATOCUMULUS
+ OR STRATUS
+ 0034 01 STRATOCUMULUS CUMULOGENITUS
+ 0035 01 STRATOCUMULUS OTHER THAN STRATOCUMULUS CUMULOGENITUS
+ 0036 02 STRATUS NEBULOSUS OR STRATUS FRACTUS OTHER THAN OF BAD WEATH
+ ER, OR BOTH
+ 0037 02 STRATUS FRACTUS OR CUMULUS FRACTUS OF BAD WEATHER, OR BOTH
+ (PANNUS), USUALLY BELOW ALTOSTRATUS OR NIMBOSTRATUS
+ 0038 02 CUMULUS AND STRATOCUMULUS OTHER THAN STRATOCUMULUS CUMULOGEN
+ ITUS, WITH BASES AT DIFFERENT LEVELS
+ 0039 03 CUMULONIMBUS CAPILLATUS (OFTEN WITH AN ANVIL), WITH OR WITHO
+ UT CUMULONIMBUS CALVUS, CUMULUS, STRATOCUMULUS, STRATUS OR P
+ ANNUS
+ 0059 02 CLOUD NOT VISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDSTO
+ RM, OR OTHER ANALOGOUS PHENOMENA
+ 0060 03 CH CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA, OR BECAUSE OF A CONTINUOUS
+ LAYER OF LOWER CLOUDS
+ 0061 03 CM CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA, OR BECAUSE OF A CONTINUOUS
+ LAYER OF LOWER CLOUDS
+ 0062 02 CL CLOUDS INVISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDS
+ TORM, OR OTHER SIMILAR PHENOMENA
+ 0063 01 MISSING VALUE
+020017 0011 0000 01 ISOLATED CLOUD OR FRAGMENTS OF CLOUD
+ 0001 01 CONTINUOUS CLOUD
+ 0002 01 BROKEN CLOUD - SMALL BREAKS, FLAT TOPS
+ 0003 01 BROKEN CLOUD - LARGE BREAKS, FLAT TOPS
+ 0004 01 CONTINUOUS CLOUD
+ 0005 01 BROKEN CLOUD - SMALL BREAKS, UNDULATED TOPS
+ 0006 01 BROKEN CLOUD - LARGE BREAKS, UNDULATED TOPS
+ 0007 02 CONTINUOUS OR ALMOST CONTINUOUS WAVES WITH TOWERING CLOUDS A
+ BOVE THE TOP OF THE LAYER
+ 0008 02 GROUPS OF WAVES WITH TOWERING CLOUDS ABOVE THE TOP OF THE LA
+ YER
+ 0009 01 TWO OR MORE LAYERS AT DIFFERENT LEVELS
+ 0015 01 MISSING VALUE
+020018 0004 0000 01 INCREASING (U)
+ 0001 01 DECREASING (D)
+ 0002 01 NO DISTINCT CHANGE (N)
+ 0003 01 MISSING VALUE
+020021 0024 0001 01 PRECIPITATION-UNKNOWN TYPE
+ 0002 01 LIQUID PRECIPITATION NOT FREEZING
+ 0003 01 LIQUID FREEZING PRECIPITATION
+ 0004 01 DRIZZLE
+ 0005 01 RAIN
+ 0006 01 SOLID PRECIPITATION
+ 0007 01 SNOW
+ 0008 01 SNOW GRAINS
+ 0009 01 SNOW PELLETS
+ 0010 01 ICE PELLETS
+ 0011 01 ICE CRYSTALS
+ 0012 01 DIAMOND DUST
+ 0013 01 SMALL HAIL
+ 0014 01 HAIL
+ 0015 01 GLAZE
+ 0016 01 RIME
+ 0017 01 SOFT RIME
+ 0018 01 HARD RIME
+ 0019 01 CLEAR ICE
+ 0020 01 WET SNOW
+ 0021 01 HOAR FROST
+ 0022 01 DEW
+ 0023 01 WHITE DEW
+ 0030 01 ALL 30 MISSING VALUE
+020022 0007 0000 01 NO PRECIPITATION
+ 0001 01 CONTINUOUS
+ 0002 01 INTERMITTENT
+ 0003 01 SHOWER
+ 0004 01 NOT REACHING GROUND
+ 0005 01 DEPOSITION
+ 0015 01 MISSING VALUE
+020023 0012 0001 01 DUST/SAND WHIRL
+ 0002 01 SQUALLS
+ 0003 01 SAND STORM
+ 0004 01 DUST STORM
+ 0005 01 LIGHTNING - CLOUD TO SURFACE
+ 0006 01 LIGHTNING - CLOUD TO CLOUD
+ 0007 01 LIGHTNING - DISTANT
+ 0008 01 THUNDERSTORM
+ 0009 01 FUNNEL CLOUD NOT TOUCHING SURFACE
+ 0010 01 FUNNEL CLOUD TOUCHING SURFACE
+ 0011 01 SPRAY
+ 0012 01 WATER-SPOUT
+020024 0007 0000 01 NO PHENOMENA
+ 0001 01 LIGHT
+ 0002 01 MODERATE
+ 0003 01 HEAVY
+ 0004 01 VIOLENT
+ 0005 01 SEVERE (VAL)
+ 0007 01 MISSING VALUE
+020025 0011 0001 01 FOG
+ 0002 01 ICE FOG
+ 0003 01 STEAM FOG
+ 0007 01 MIST
+ 0008 01 HAZE
+ 0009 01 SMOKE
+ 0010 01 VOLCANIC ASH
+ 0011 01 DUST
+ 0012 01 SAND
+ 0013 01 SNOW
+ 0021 01 ALL 21 MISSING VALUE
+020026 0014 0000 01 NO CHANGE
+ 0001 01 SHALLOW
+ 0002 01 PATCHES
+ 0003 01 PARTIAL
+ 0004 01 FREEZING
+ 0005 01 LOW DRIFTING
+ 0006 01 BLOWING
+ 0007 01 INCREASING
+ 0008 01 DECREASING
+ 0009 01 IN SUSPENSION IN THE AIR
+ 0010 01 WALL
+ 0011 01 DENSE
+ 0012 01 WHITEOUT
+ 0015 01 MISSING VALUE
+020027 0007 0001 01 AT TIME OF OBSERVATION
+ 0002 01 IN PAST HOUR
+ 0003 01 IN TIME PERIOD FOR PAST WEATHER W1W2
+ 0004 01 IN TIME PERIOD SPECIFIED
+ 0006 01 BELOW STATION LEVEL
+ 0007 01 AT THE STATION
+ 0008 01 IN THE VICINITY
+ 0009 01 ALL 9 MISSING VALUE
+020029 0004 0000 01 NO RAIN
+ 0001 01 RAIN
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020032 0006 0000 01 ICE NOT BUILDING UP
+ 0001 01 ICE BUILDING UP SLOWLY
+ 0002 01 ICE BUILDING UP QUICKLY
+ 0003 01 ICE MELTING OR BREAKING UP SLOWLY
+ 0004 01 ICE MELTING OR BREAKING UP RAPIDLY
+ 0007 01 MISSING VALUE
+020033 0004 0001 01 ICING FROM OCEAN SPRAY
+ 0002 01 ICING FROM FOG
+ 0003 01 ICING FROM RAIN
+ 0004 01 MISSING VALUE
+020034 0012 0000 01 NO SEA ICE IN SIGHT
+ 0001 02 SHIP IN OPEN LEAD MORE THAN 1.0 NAUTICAL MILE WIDE, OR SHIP
+ IN FAST ICE WITH BOUNDARY BEYOND LIMIT OF VISIBILITY
+ 0002 04 SEA ICE PRESENT IN CONCETRATION LESS THAN 3/10 (3/8), OPEN W
+ ATER OR VERY OPEN PACK ICE, SEA ICE CONCETRATION IS UNIFORM
+ IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL
+ MILE OF ICE EDGE
+ 0003 03 4/10 TO 6/10 (3/8 TO LESS THAN 6/8) ,OPEN PACK ICE, SEA ICE
+ CONCETRATION IS UNIFORM IN THE OBSERVATION AREA, SHIP IN ICE
+ OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0004 03 7/10 TO 8/10 (6/8 TO LESS THAN 7/8), CLOSE PACK ICE, SEA ICE
+ CONCETRATION IS UNIFORM IN THE OBSERVATION AREA, SHIP IN IC
+ E OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0005 04 9/10 OR MORE, BUT NOT 10/10 (7/8 TO LESS THAN 8/8), VERY CLO
+ SE PACK ICE, SEA ICE CONCETRATION IS UNIFORM IN THE OBSERVAT
+ ION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE EDG
+ E
+ 0006 03 STRIPS AND PATCHES OF PACK ICE WITH OPEN WATER BETWEEN, SEA
+ ICE CONCENTRATION IS NOT UNIFORM IN THE OBSERVATION AREA, SH
+ IP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE EDGE
+ 0007 04 STRIPS AND PATCHES OF CLOSE OR VERY CLOSE PACK ICE WITH AREA
+ S OF LESSER CONCENTRATION BETWEEN, SEA ICE CONCETRATION IS N
+ OT UNIFORM IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.
+ 5 NAUTICAL MILE OF ICE EDGE
+ 0008 04 FAST ICE WITH OPEN WATER,VERY OPEN OR OPEN PACK ICE TO SEAWA
+ RD OF THE ICE BOUNDARY, SEA ICE CONCENTRATION IS NOT UNIFORM
+ IN THE OBSERVATION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL
+ MILE OF ICE EDGE
+ 0009 04 FAST ICE CLOSE OR VERY CLOSE PACK ICE TO SEAWARD OF THE ICE
+ BOUNDARY, SEA ICE CONCETRATION IS NOT UNIFORM IN THE OBSERVA
+ TION AREA, SHIP IN ICE OR WITHIN 0.5 NAUTICAL MILE OF ICE ED
+ GE
+ 0014 03 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY, O
+ R BECAUSE SHIP IS MORE THAN 0.5 NAUTICAL MILE AWAY FROM ICE
+ EDGE
+ 0015 01 MISSING VALUE
+020035 0012 0000 01 NO ICE OF LAND ORIGIN
+ 0001 01 1-5 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0002 01 6-10 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0003 01 11-20 ICEBERGS, NO GROWLERS OR BERGY BITS
+ 0004 01 UP TO AND INCLUDING 10 GROWLERS AND BERGY BITS - NO ICEBERGS
+ 0005 01 MORE THAN 10 GROWLERS AND BERGY BITS - NO ICEBERGS
+ 0006 01 1-5 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0007 01 6-10 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0008 01 11-20 ICEBERGS, WITH GROWLERS AND BERGY BITS
+ 0009 02 MORE THAN 20 ICEBERGS,WITH GROWLERS AND BERGY BITS - A MAJOR
+ HAZARD TO NAVIGATION
+ 0014 02 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY OR
+ BECAUSE ONLY SEA ICE IS VISIBLE
+ 0015 01 MISSING VALUE
+020036 0012 0000 01 SHIP IN OPEN WATER WITH FLOATING ICE IN SIGHT
+ 0001 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS IMPROVING
+ 0002 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS NOT CHANGING
+ 0003 01 SHIP IN EASILY PENETRABLE ICE; CONDITIONS WORSENING
+ 0004 01 SHIP IN ICE DIFFICULT TO PENETRATE; CONDITIONS IMPROVING
+ 0005 01 SHIP IN ICE DIFFICULT TO PENETRATE; CONDITIONS NOT CHANGING
+ 0006 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE FORMING AND FLOES FREEZING TOGETHAR
+ 0007 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE UNDER SLIGHT PRESSURE
+ 0008 02 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING.
+ ICE UNDER MODERATE OR SEVERE PRESSURE
+ 0009 01 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING. SHIP BESET.
+ 0030 01 UNABLE TO REPORT, BECAUSE OF DARKNESS OR LACK OF VISIBILITY
+ 0031 01 MISSING VALUE
+020037 0012 0000 01 NEW ICE ONLY (FRAZIL ICE, GREASE ICE, SLUSH, SHUGA)
+ 0001 01 NILAS OR ICE RIND, LESS THAN 10 CM THICK
+ 0002 01 YOUNG ICE(GREY ICE, GREY-WHITE ICE
+ 0003 01 PREDOMINANTLY NEW AND/OR YOUNG ICE WITH SOME FIRST-YEAR ICE
+ 0004 01 PREDOMINANTLY THIN FIRST-YEAR ICE WITH SOME NEW AND/OR YOUNG ICE
+ 0005 01 ALL THIN FIRST-YEAR ICE (30-70 CM THICK)
+ 0006 02 PREDOMINANTLY MEDIUM FIRST-YEAR ICE
+ (70-120 CM THICK) AND THICK FIRST-YEAR ICE (>120 CM
+ 0007 01 ALL MEDIUM AND THICK FIRST-YEAR ICE
+ 0008 02 PREDOMINANTLY MEDIUM AND THICK FIRST-YEAR ICE WITH SOME
+ OLD ICE (USUALLY MORE THAN 2 METRES THICK)
+ 0009 01 PREDOMINANTLY OLD ICE
+ 0030 03 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY OR BECAUSE
+ ONLY ICE OF LAND ORIGIN IS VISIBLE OR BECAUSE SHIP IS MORE THAN 0.5
+ NAUTICAL MILE AWAY FROM ICE EDGE
+ 0031 01 MISSING VALUE
+020040 0009 0000 01 DRIFT SNOW ENDED BEFORE THE HOUR OF OBSERVATION
+ 0001 01 INTENSITY DIMINISHING
+ 0002 01 NO CHANGE
+ 0003 01 INTENSITY INCREASING
+ 0004 01 CONTINUES, APART FROM INTERRUPTION LASTING LESS THAN 30 MINUTES
+ 0005 01 GENERAL DRIFT SNOW HAS BECOME DRIFT SNOW NEAR THE GROUND
+ 0006 01 DRIFT SNOW NEAR THE GROUND HAS BECOME GENERAL DRIFT SNOW
+ 0007 01 DRIFT SNOW HAS STARTED AGAIN AFTER AN INTERRUPTION OF MORE THAN 30 MINUTES
+ 0015 01 MISSING VALUE
+020041 0011 0000 01 NO ICING
+ 0001 01 LIGHT ICING
+ 0002 01 LIGHT ICING IN CLOUD
+ 0003 01 LIGHT ICING IN PRECIPITATION
+ 0004 01 MODERATE ICING
+ 0005 01 MODERATE ICING IN CLOUD
+ 0006 01 MODERATE ICING IN PRECIPITATION
+ 0007 01 SEVERE ICING
+ 0008 01 SEVERE ICING IN CLOUD
+ 0009 01 SEVERE ICING IN PRECIPITATION
+ 0015 01 MISSING VALUE
+020042 0004 0000 01 NO ICING
+ 0001 01 ICING PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020045 0004 0000 01 NO SLD CONDITIONS PRESENT
+ 0001 01 SLD CONDITIONS PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+020050 0010 0000 01 RESERVED
+ 0001 01 1ST LOW CLOUD
+ 0002 01 2ND LOW CLOUD
+ 0003 01 3RD LOW CLOUD
+ 0004 01 1ST MEDIUM CLOUD
+ 0005 01 2ND MEDIUM CLOUD
+ 0006 01 3RD MEDIUM CLOUD
+ 0007 01 1ST HIGH CLOUD
+ 0008 01 2ND HIGH CLOUD
+ 0255 01 MISSING VALUE
+020055 0011 0000 01 CUMULUS, IF ANY, ARE QUITE SMALL
+ 0001 01 CUMULUS OF INTERMEDIATE SIZE
+ 0002 01 SWELLING CUMULUS
+ 0003 01 SWELLING CUMULUS WITH TOWERS
+ 0004 01 SWELLING CUMULUS WITH TOWERS HAVING PRONOUNCED TILT
+ 0005 01 TALL CUMULUS CONGESTUS
+ 0006 01 ISOLATED CUMULONIMBUS
+ 0007 01 NUMEROUS CUMULONIMBUS
+ 0008 01 CONTINUOUS DENSE MIDDLE CLOUDS
+ 0009 01 CONTINUOUS SHEETS OF MIDDLE CLOUDS
+ 0015 01 MISSING VALUE
+020056 0005 0000 01 UNKNOWN
+ 0001 01 WATER
+ 0002 01 ICE
+ 0003 01 MIXED
+ 0007 01 MISSING VALUE
+020062 0021 0000 02 SURFACE OF GROUND DRY (WITHOUT CRACKS AND NO APPRECIABLE
+ AMOUNT OF DUST OR LOOSE SAND)
+ 0001 01 SURFACE OF GROUND MOIST
+ 0002 02 SURFACE OF GROUND WET (STANDING WATER IN SMALL
+ OR LARGE POOLS ON SURFACE)
+ 0003 01 FLOODED WITHOUT SNOW
+ 0004 01 SURFACE OF GROUND FROZEN MEASURABLE ICE
+ 0005 01 GLAZE ON GROUND COVER
+ 0006 01 LOOSE DRY DUST OR SAND NOT COVERING GROUND COMPLETELY
+ 0007 01 THIN COVER OF LOOSE DRY DUST OR SAND COVERING GROUND COMPLETELY
+ 0008 02 MODERATE OR THICK COVER OF LOOSE DRY DUST OR SAND COVERING
+ GROUND COMPLETELY
+ 0009 01 EXTREMELY DRY WITH CRACKS
+ 0010 01 GROUND PREDOMINANTLY COVERED BY ICE
+ 0011 02 COMPACT OR WET SNOW (WITH OR WITHOUT ICE) COVERING LESS THAN
+ ONE-HALF OF THE GROUND
+ 0012 02 COMPACT OR WET SNOW (WITH OR WITHOUT ICE) COVERING AT LEAST
+ ONE-HALF OF THE GROUND BUT GROUND NOT COMPLETELY COVERED
+ 0013 01 EVEN LAYER OF COMPACT OR WET SNOW COVERING GROUND COMPLETELY
+ 0014 02 UNEVEN LAYER OF COMPACT OR WET SNOW COVERING GROUND
+ WITH SNOW OR COMPLETELY MEASURABLE ICE
+ 0015 01 LOOSE DRY SNOW COVERING LESS THAN ONE-HALF OF THE GROUND COVER
+ 0016 02 LOOSE DRY SNOW COVERING AT LEAST ONE-HALF OF THE
+ GROUND (BUT NOT COMPLETELY)
+ 0017 01 EVEN LAYER OF LOOSE DRY SNOW COVERING GROUND COMPLETELY
+ 0018 01 UNEVEN LAYER OF LOOSE DRY SNOW COVERING GROUND COMPLETELY
+ 0019 01 SNOW COVERING GROUND COMPLETELY; DEEP DRIFTS
+ 0031 01 MISSING VALUE
+020063 0001 0000 01 TO BE DEVELOPED
+020071 0011 0000 01 NO ASSESSMENT NO ASSESSMENT
+ 0001 01 LESS THAN 50 KM LESS THAN 1 PER SECOND
+ 0002 01 BETWEEN 50 AND 200 KM LESS THAN 1 PER SECOND
+ 0003 01 MORE THAN 200 KM LESS THAN 1 PER SECOND
+ 0004 01 LESS THAN 50 KM 1 OR MORE PER SECOND
+ 0005 01 BETWEEN 50 AND 200 KM 1 OR MORE PER SECOND
+ 0006 01 MORE THAN 200 KM 1 OR MORE PER SECOND
+ 0007 01 LESS THANK 50 KM RATE SO RAPID NUMBER CANNOT BE COUNTED
+ 0008 01 BETWEEN 50 AND 200 KM RATE SO RAPID NUMBER CANNOT BE COUNTED
+ 0009 01 MORE THAN 200 KM RATE SO RAPID NUMBER CANNOT BE COUNTED
+ 0015 01 MISSING VALUE
+020086 0008 0000 01 CLEAR AND DRY
+ 0001 01 DAMP
+ 0005 01 WET SNOW
+ 0006 01 SLUSH
+ 0007 01 ICE
+ 0008 01 COMPACTED OR ROLLED SNOW
+ 0009 01 FROZEN RUTS OR RIDGES
+ 0015 01 MISSING VALUE
+020090 0007 0000 01 RESERVED
+ 0001 01 NACREOUS CLOUDS
+ 0002 01 NOCTILUCENT CLOUDS
+ 0003 01 CLOUDS FROM WATERFALLS
+ 0004 01 CLOUDS FROM FIRES
+ 0005 01 CLOUDS FROM VULCANIC ERUPTIONS
+ 0015 01 MISSING VALUE
+020101 0010 0001 01 SCHISTOCERCA GREGARIA
+ 0002 01 LOCUSTA MIGRATORIA
+ 0003 01 NOMADACRIS SEPTEMFASCIATA
+ 0004 01 OEDALEUS SENAGALENSIS
+ 0005 01 ANRACRIDIUM SPP
+ 0006 01 OTHER LOCUST
+ 0007 01 OTHER GRASSHOPPERS
+ 0008 01 ITHER CRICKETS
+ 0009 01 SPODOPTERA EXEMPTA
+ 0015 01 MISSING VALUE
+020102 0011 0000 01 GREEN
+ 0001 01 GREEN AND BLACK
+ 0002 01 BLACK
+ 0003 01 YELLOW AND BLACK
+ 0004 01 STRAW/GREY
+ 0005 01 PINK
+ 0006 01 DARK RED/BROWN
+ 0007 01 MIXED RED AND YELLOW
+ 0008 01 YELLOW
+ 0009 01 OTHER
+ 0015 01 MISSING VALUE
+020151 0003 0000 01 FIRST YEAR ICE
+ 0001 01 MULTI YEAR ICE
+ 0007 01 MISSING
+020252 0003 0000 01 NO EDGE
+ 0001 01 EDGE PRESENT
+ 0007 01 MISSING
+020253 0007 0000 01 LAND
+ 0001 01 VEGETATION COVERED LAND
+ 0002 01 RESERVED
+ 0003 01 ICE
+ 0004 01 POSSIBLE ICE
+ 0005 01 OCEAN
+ 0006 01 COAST
+ 0007 01 MISSING
+021066 0011 0001 01 PROCESSING EQUIPMENT NOT WORKING
+ 0002 01 EQUIPMENT FAILED
+ 0003 01 PRF CODE CHANGED DURING IMAGE GENERATION
+ 0004 01 SAMPLINH WINDOW CHANGED DURING IMAGE GENERATION
+ 0005 01 GAIN CHANGED DURING IMAGE GENERATION
+ 0006 01 CHIRP REPLICA EXCEEDS SPECIFIC VALUE
+ 0007 02 INPUT DATA MEAN AND STANDARD DEVIATION OF IN-PHASE AND
+ QUADRATURE OUT OF RANGE
+ 0008 01 DOPPLER CENTROID CONFIDENCE > MMCC VALUE
+ 0009 01 DOPPLER CENTROID ABSOLUTE VALUE > PRF/2
+ 0010 01 DOPPLER AMBIGUITY CONFIDENCE < MMCC VALUE
+ 0011 01 OUTPUT DATA MEAN AND STANDARD DEVIATION =< MMCC VALUE
+021067 0012 0001 01 NO FOREBEAM CALCULATION
+ 0002 01 NO MIDBEAM CALCULATION
+ 0003 01 NO AFTBEAM CALCULATION
+ 0004 01 FOREBEAM ARCING DETECTED
+ 0005 01 MID ARCING DETECTED
+ 0006 01 AFTBEAM ARCING DETECTED
+ 0007 01 ANY BEAM NOISE CONTENT ABOVE OR EQUAL TO TRESHOLD
+ 0008 01 LAND (ANY LAND IN CELL FOOTPRINT)
+ 0009 01 AUTONOMOUS AMBIGUITY REMOVAL NOT USED
+ 0010 01 METEOROLOGICAL BACKGROUND NOT USED
+ 0011 01 MINIMUM RESIDUAL EXCEEDED TRESHOLD
+ 0012 01 FRAME CHECKSUM ERROR DETECTED
+021068 0007 0001 01 STANDARD DEVIATION OF WIND SPEED OUTSIDE MMCC LIMIT
+ 0002 01 STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT OUTSIDE MMCC LIMIT
+ 0003 01 STANDARD DEVIATION OF ALTITUDE OUTSIDE MMCC LIMIT
+ 0004 01 MEAN PEAKINESS OUTSIDE MMCC LIMIT
+ 0005 01 FRAME CHECKSUM ERROR DETECTED
+ 0006 01 HEIGHT-TIME LOOP TIME CONSTANT CORRECTION NOT PERFORMED
+ 0007 01 NOT ENOUGH MEASUREMENTS ( N< 10)
+021069 0009 0001 01 12.0 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0002 01 11.0 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0003 01 3.7 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0004 01 1.6 MICROMETERS CHANNEL PRESENT IN SOURCE DATA
+ 0005 02 CLOUD IDENTIFICATION USED 1.6 MICROMETERS
+ HISTOGRAM REFLECTANCE CLOUD TEST
+ 0006 02 1.6 MICROMETERS HISTOGRAM REFLECTANCE CLOUD
+ TEST USED DYNAMIC TRESHOLD
+ 0007 01 SUN GLINT DETECTED BY 1.6 MICROMETERS REFLECTANCE CLOUD TEST
+ 0008 01 3.7 MICROMETERS USED IN SEA-SURFACE TEMPERATURE RETRIEVAL
+ 0009 02 SEA-SURFACE TEMPERATURE DERIVATION USED DAYTIME DATA
+ (NIGHT-TIME IF ZERO)
+021070 0024 0001 01 CELL 1:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0002 01 CELL 2:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL CELL NUMBERING
+ 0003 01 CELL 3:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0004 01 CELL 4:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL NW NE
+ 0005 01 CELL 5:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 7 8 9
+ 0006 01 CELL 6:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 4 5 6
+ 0007 01 CELL 7:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 1 2 3
+ 0008 01 CELL 8:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL SW SE
+ 0009 01 CELL 9:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0010 01 CELL 1:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0011 01 CELL 2:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL CELL NUMBERING
+ 0012 01 CELL 3:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0013 01 CELL 4:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL NW NE
+ 0014 01 CELL 5:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 7 8 9
+ 0015 01 CELL 6:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 4 5 6
+ 0016 01 CELL 7:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL 1 2 3
+ 0017 01 CELL 8:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL SW SE
+ 0018 01 CELL 9:NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+ 0019 01 NADIR VIEW CONTAINS DAY-TIME DATA (NIGHT IF ZERO)
+ 0020 01 FORWARD VIEW CONTAINS DAY-TIME DATA (NIGHT IF ZERO)
+ 0021 02 RECORD CONTAINS CONTRIBUTIONS FROM INSTRUMENT SCANS ACQUIRED WHEN ERS PLATFORM NOT IN
+ YAW-STEERING MODE
+ 0022 02 RECORD CONTAINS CONTRIBUTIONS FROM INSTRUMENT SCANS FOR WHICH PRODUCT CONFIDENCE DATA
+ SHOW QUALITY IS POOR OR UNKNOWN
+ 0023 01 MISSING VALUE
+021072 0003 0001 01 HEIGHT ERROR CORRECTION APPLIED INSTEAD OF OPEN LOOP CALIBRATION
+ 0002 01 MICROWAVE SOUNDER USED FOR TROPOSPHERE CORRECTION
+ 0003 01 AGC OUTPUT CORRECTION APPLIED INSTED OF OPEN LOOP CALIBRATION
+021073 0008 0001 01 BLANK DATA RECORD
+ 0002 01 TEST
+ 0003 01 CALIBRATION (CLOSED LOOP)
+ 0004 01 BITE
+ 0005 01 ACQUISITION ON ICE
+ 0006 01 ACQUISITION ON OCEAN
+ 0007 01 TRACKING ON ICE
+ 0008 01 TRACKING ON OCEAN
+021076 0004 0000 01 LINEAR
+ 0001 01 LOGARITHMIC (BASE E)
+ 0002 01 LOGARITHMIC (BASE 10)
+ 0007 01 MISSING VALUE
+021109 0008 0001 01 NOT ENOUGH GOOD SIGMA-0 AVAILABLE FOR WIND RETRIEVAL
+ 0002 01 POOR AZIMUTH DIVERSITY AMONG SIGMA0- FOR WIND RETRIEVAL
+ 0008 01 SOME PORTION OF WIND VECTOR CELL IS OVER LAND
+ 0009 01 SOME PORTION OF WIND VECTOR CELL IS OVER ICE
+ 0010 01 WIND RETRIEVAL NOT PERFORMED FOR WIND VECTOR CELL
+ 0011 01 REPORTED WIND SPEED IS GREATER THAN 30 M/S
+ 0012 01 REPORTED WIND SPEED IS LESS THAN OR EQUAL TO 3 M/S
+ 0017 01 MISSING VALUE
+021115 0011 0001 01 SIGMA-0 MEASUREMENT IS NOT USABLE
+ 0002 01 SIGNAL TO NOISE RATIO IS LOW
+ 0003 01 SIGMA-0 IS NEGATIVE
+ 0004 01 SIGMA-0 IS OUTSIDE OF ACCEPTABLE RANGE
+ 0005 01 SCATTEROMETER PULSE QUALITY IS NOT ACCEPTABLE
+ 0006 01 SIGMA-0 CELL LOCATION ALGORITHM DOES NOT CONVERGE
+ 0007 01 FREQUENCY SHIFT LIES BEYOND THE RANGE OF THE X FACTOR TABLE
+ 0008 01 SPACECRAFT TEMPERATURE IS BEYOND CALIBRATION COEFFICIENT RANGE
+ 0009 01 NO APPLICABLE ATTITUDE RECORDS WERE FOUND FOR THIS SIGMA-0
+ 0010 01 INTERPOLATED EPHEMERIS DATA ARE NOT ACCEPTABLE FOR THIS SIGMA-0
+ 0017 01 MISSING VALUE
+021116 0016 0001 01 CALIBRATION/MEASUREMENT PULSE FLAG (1)
+ 0002 01 CALIBRATION/MEASUREMENT PULSE FLAG (2)
+ 0003 01 OUTER ANTENNA BEAM
+ 0004 01 SIGMA-0 CELL IS AFT OF SPACECRAFT
+ 0005 01 CURRENT MODE (1)
+ 0006 01 CURRENT MODE (2)
+ 0007 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (1)
+ 0008 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (2)
+ 0009 01 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (3)
+ 0010 01 LOW RESOLUTION MODE - WHOLE PULSE DATA
+ 0011 01 SCATTEROMETER ELECTRONIC SUBSYSTEM B
+ 0012 01 ALTERNATE SPIN RATE - 19.8 RPM
+ 0013 01 RECEIVER PROTECTION ON
+ 0014 01 SLICES PER COMPOSITE FLAG (1)
+ 0015 01 SLICES PER COMPOSITE FLAG (2)
+ 0016 01 SLICES PER COMPOSITE FLAG (3)
+021119 0014 0000 01 RESERVED
+ 0001 01 SASS
+ 0002 01 SASS2
+ 0003 01 NSCAT0
+ 0004 01 NSCAT1
+ 0005 01 NSCAT2
+ 0006 01 QSCAT0
+ 0007 01 QSCAT1
+ 0031 01 CMOD1
+ 0032 01 CMOD2
+ 0033 01 CMOD3
+ 0034 01 CMOD4
+ 0035 01 CMOD5
+ 0064 01 MISSING VALUE
+021144 0001 0001 01 RAIN
+021150 0004 0000 01 DATA FROM SINGLE GROUND STATION (NO CO-LOCATION)
+ 0001 01 DATA FROM MULTIPLE GROUND STATION (CO-LOCATED DATA)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021155 0016 0001 01 NOT ENOUGH GOOD SIGMA-0 AVAILABLE FOR WIND RETRIEVAL
+ 0002 01 POOR AZIMUTH DIVERSITY AMONG SIGMA-0 FOR WIND RETRIEVAL
+ 0003 01 ANY BEAM NOISE CONTENT ABOVE TRESHOLD
+ 0004 01 PRODUCT MONITORING NOT USED
+ 0005 01 PRODUCT MONITORING FLAG
+ 0006 01 KNMI QUALITY CONTROL FAILS
+ 0007 01 VARIATIONAL QUALITY CONTROL FAILS
+ 0008 01 SOME PORTION OF WIND VECTOR CELL IS OVER LAND
+ 0009 01 SOME PORTION OF WIND VECTOR CELL IS OVER ICE
+ 0010 01 WIND RETRIEVAL NOT PERFORMED FOR WIND VECTOR CELL
+ 0011 01 REPORTED WIND SPEED IS GREATER THAN 30 M/S
+ 0012 01 REPORTED WIND SPEED IS LESS THAN OR EQUAL TO 3 M/S
+ 0013 01 RAIN FLAG FOR THE WIND VECTOR CELL IS NOT USABLE
+ 0014 01 RAIN FLAG ALGORITHM DETECTS RAIN
+ 0015 01 NO METEOROLOGICAL BACKGROUND USED
+ 0016 01 DATA ARE REDUNDANT
+021158 0004 0000 01 ACCEPTABLE
+ 0001 01 NOT ACCEPTABLE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021159 0004 0000 01 GOOD
+ 0001 01 USABLE
+ 0002 01 BAD
+ 0003 01 MISSING VALUE
+021169 0004 0000 01 NO ICE PRESENT
+ 0001 01 ICE PRESENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+021196 0012 0001 01 PROCESSING EQUIPMENT NOT WORKING
+ 0002 01 EQUIPMENT FAILED
+ 0003 01 PRF CODE CHANGED DURING IMAGE GENERATION
+ 0004 01 SAMPLING WINDOW CHANGED DURING IMAGE GENERATION
+ 0005 01 GAIN CHANGED DURING IMAGE GENERATION
+ 0006 01 CHIRP REPLICA EXCEEDS SPECIFIED VALUE
+ 0007 01 INPUT DATA MEAN AND STANDARD DEVIATION OF I AND Q OUT OF RANGE
+ 0008 01 DOPPLER CENTROID CONFIDENCE > MMCC VALUE
+ 0009 01 DOPPLER CENTROID ABSOLUTE VCALUE > PRF/2
+ 0010 01 DOPPLER AMBIGUITY CONFIDENCE < MMCC VALUE
+ 0011 01 OUTPUT DATA MEAN AND STANDARD DEVIATION <= MMCC VALUE
+ 0012 01 MISSING VALUE
+021199 0007 0001 01 3.7 MICRO CHANNEL USED IN ASST DERIVATION
+ 0002 01 ASST DERIVATION USED DATTIME DATA
+ 0003 02 COMPARISON OF ASST AGAINST PREVIOUS
+ EQUIVALENT PASS PERFORMED
+ 0004 02 COMPARISON OF ASST AGAINST WEEKLY AVERAGE
+ OF ASST PERFORMED
+ 0005 01
+ 0006 02 COMPARISON OF RATE OF CHANGE OF ASST AGAINST
+ STATIC TRESHOLD PERFORMED
+ 0007 01 MISSING VALUE
+021227 0034 0000 01 RESERVED
+ 0001 01 0-2 DEGREES
+ 0002 01 3-4 DEGREES
+ 0003 01 5-6 DEGREES
+ 0004 01 7-6 DEGREES
+ 0005 01 9-6 DEGREES
+ 0006 01 11-12 DEGREES
+ 0007 01 13-14 DEGREES
+ 0008 01 15-16 DEGREES
+ 0009 01 17-18 DEGREES
+ 0010 01 19-20 DEGREES
+ 0011 01 21-22 DEGREES
+ 0012 01 23-24 DEGREES
+ 0013 01 25-26 DEGREES
+ 0014 01 27-28 DEGREES
+ 0015 01 29-30 DEGREES
+ 0016 01 31-32 DEGREES
+ 0017 01 33-34 DEGREES
+ 0018 01 35-36 DEGREES
+ 0019 01 37-38 DEGREES
+ 0020 01 39-40 DEGREES
+ 0021 01 41-42 DEGREES
+ 0022 01 43-44 DEGREES
+ 0023 01 45-46 DEGREES
+ 0024 01 47-48 DEGREES
+ 0025 01 49-50 DEGREES
+ 0026 01 51-52 DEGREES
+ 0027 01 53-54 DEGREES
+ 0028 01 55-56 DEGREES
+ 0029 01 57-58 DEGREES
+ 0030 01 59-60 DEGREES
+ 0031 01 > 60 DEGREES
+ 0032 01 INVALID
+ 0064 01 MISSING VALUE
+022056 0004 0000 01 UPWARDS PROFILE
+ 0001 01 DOWNWARDS PROFILE
+ 0002 01 HORIZONTAL
+ 0003 01 MISSING VALUE
+022060 0004 0000 01 DROGUE IS DETACHED
+ 0001 01 DROGUE IS ATTACHED
+ 0002 01 DROGUE STATUS UNKNOWN
+ 0007 01 MISSING VALUE
+022061 0011 0000 01 CALM (GLASSY) HEIGHT 0 M
+ 0001 01 CALM (RIPPLED) HEIGHT 0 - 0.1 M
+ 0002 01 SMOOTH (WAVELETS) HEIGHT 0.1 - 0.5 M
+ 0003 01 SLIGHT HEIGHT 0.5 - 1.5 M
+ 0004 01 MODERATE HEIGHT 1.25 - 2.5 M
+ 0005 01 ROUGH HEIGHT 2.5 - 4 M
+ 0006 01 VERY ROUGH HEIGHT 4 - 6 M
+ 0007 01 HIGH HEIGHT 6 - 9 M
+ 0008 01 VERY HIGH HEIGHT 9 -14 M
+ 0009 01 PHENOMANAL HEIGHT OVER 14 M
+ 0015 01 MISSING VALUE
+022067 0001 0000 01 SEE COMMON CODE TABLE C3
+022068 0001 0000 01 SEE COMMON CODE TABLE C4
+022120 0013 0000 01 GOOD DATA
+ 0001 01 MAXIMUM (HIGH) WATER LEVEL LIMIT EXCEEDED
+ 0002 01 MINIMUM (LOW) WATER LEVEL LIMIT EXCEEDED
+ 0003 01 RATE OF CHANGE LIMIT FOR WATER LEVEL EXCEEDED
+ 0004 01 FLAT LIMIT FOR WATER LEVEL EXCEEDED
+ 0005 01 OBSERVED MINUS PREDICTED WATER LEVEL VALUE LIMIT EXCEEDED
+ 0006 02 OBSERVED VALUE FROM PRIMARY WATER LEVEL SENSOR MINUS
+ BACKUP WATER LEVEL SENSOR
+ 0007 01 VALUE EXCEEDED SPECIFIED TOLERANCE FROM EXPECTED VALUE
+ 0008 01 WATER LEVEL QA PARAMETER (SIGMAS AND/OR OUTLIERS) LIMITS EXCEEDED
+ 0009 01 SEA TEMPERATURE OUTSIDE OF EXPECTED RANGE
+ 0010 01 MULTIPLE QC CHECKS (ABOVE) FAILED
+ 0011 01 NO AUTOMATED WATER LEVEL CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022121 0009 0000 01 OPERATIONAL
+ 0001 01 POSSIBLE CLOGGING PROBLEM OR OTHERWISE DEGRADED WATE LEVEL DATA
+ 0002 01 POSSIBLE DATUM SHIFT
+ 0003 01 UNKNOWN STATUS OF WATER LEVEL SENSOR
+ 0004 01 SUSPECTED OR KNOWN SEA TEMPERATURE SENSOR PROBLEM
+ 0005 01 MULTIPLE POSSIBLE PROBLEMS (ABOVE)
+ 0006 01 BAD DATA- DO NOT DISSEMINATE
+ 0007 01 NO MANUAL WATER LEVEL CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022122 0008 0000 01 GOOD DATA FROM ALL SENSORS
+ 0001 01 WIND DIRECTION OUTSIDE OF ALLOWABLE RANGE
+ 0002 01 WIND SPEED OUTSIDE OF EXPECTED RANGE
+ 0003 01 BAROMETRIC PRESSURE OUTSIDE OF EXPECTED RANGE
+ 0004 01 AIR TEMPERATURE OUTSIDE OF EXPECTED RANGE
+ 0005 01 MULTIPLE SENSOR FAILED QC CHECKS
+ 0006 01 NO AUTOMATED METEOROLOGICAL DATA CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022123 0009 0000 01 OPERATIONAL
+ 0001 01 SUSPECTED OR KNOWN PROBLEM WITH WIND SENSOR
+ 0002 01 SUSPECTED OR KNOWN PROBLEM WITH BAROMETRIC PRESSURE SENSOR
+ 0003 01 SUSPECTED OR KNOWN PROBLEM WITH AIR TEMPERATURE SENSOR
+ 0004 01 UNKNOWN STATUS OF ALL SENSORS
+ 0005 01 SUSPECTED OR KNOWN PROBLEMS WITH MULTIPLE SENSORS
+ 0006 01 BAD DATA - DO NOT DISSEMINATE
+ 0007 01 NO MANUAL METEOROLOGICAL DATA CHECKS PERFORMED
+ 0031 01 MISSING VALUE
+022252 0006 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 02 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND
+ PASSED
+ 0002 02 AUTOMATIC QUALITY CONTROL PASSED AND MAGNOLIA CHECKED AND
+ DELETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND
+ FAILED
+ 0005 02 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND
+ RE-INSERTED
+023001 0005 0000 01 RESERVED
+ 0001 01 ARTICLES 1 AND 2
+ 0002 01 ARTICLE 3
+ 0003 01 ARTICLE 5.2
+ 0007 01 MISSING VALUE
+023002 0016 0000 01 RESERVED
+ 0001 01 NUCLEAR REACTOR ON GROUND
+ 0002 01 NUCLEAR REACTOR ON SEA
+ 0003 01 NUCLEAR REACTOR IN SPACE
+ 0004 01 NUCLEAR FULE FACILITY
+ 0005 01 RADIOACTIVE WASTE MANAGMENT FACITILY
+ 0006 01 TRANSPORT OF NUCLEAR FUEL OR RADIOACTIVE WASTE
+ 0007 01 STORAGE OF NUCLEAR FUEL OR RADIOACTIVE WASTE
+ 0008 01 MANUFACTURE OF RADIO-ISOTOPES
+ 0009 01 USE OF RADIO-ISOTOPES
+ 0010 01 STORAGE OF RADIO-ISOTOPES
+ 0011 01 DISPOSAL OF RADIO-ISOTOPS
+ 0012 01 TRANSPORT OF RADIO-ISOTOPES
+ 0013 01 USE OF RADIO-ISOTOPES FOR POWER GENERATION
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+023003 0008 0000 01 NO RELEASE
+ 0001 01 RELEASE TO ATMOSPHERE
+ 0002 01 RELEASE TO WATER
+ 0003 01 RELEASE TO BOTH ATMOSPHERE AND WATER
+ 0004 01 EXPECTED RELEASE TO ATMOSPHERE
+ 0005 01 EXPECTED RELEASE TO WATER
+ 0006 01 EXPECTED RELEASE TO BOTH ATMOSPHERE AND WATER
+ 0007 01 MISSING VALUE
+023004 0006 0000 01 NO COUNTERMEASURE
+ 0001 01 EVACUATION
+ 0002 01 SHELTERING
+ 0003 01 PROPHILAXIS
+ 0004 01 WATER
+ 0007 01 MISSING VALUE
+023005 0004 0000 01 INCIDENT STAT DOES NOT UNDERSTAND WHAT HAPPENED
+ 0001 01 INCIDENT STATE KNOWS THE CAUSE OF THE INCIDENT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023006 0008 0000 01 NO IMPROVEMENT
+ 0001 01 UNSTABLE
+ 0002 01 NO DETERIORATION
+ 0003 01 IMPROVING
+ 0004 01 STABLE
+ 0005 01 DETERIORATING
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+023007 0005 0000 01 NO RELEASE
+ 0001 01 RELEASE HAS STOPPED
+ 0002 01 RELEASE
+ 0003 01 RELEASE IS CONTINUING
+ 0007 01 MISSING VALUE
+023008 0004 0000 01 GASEUS
+ 0001 01 PARTICULATE
+ 0002 01 MIXTURE OF GASEUS AND PARTICULATE
+ 0003 01 MISSING VALUE
+023009 0004 0000 01 GASEUS
+ 0001 01 PARTICULATE
+ 0002 01 MIXTURE OF GASEUS AND PARTICULATE
+ 0003 01 MISSING VALUE
+023016 0004 0000 01 NO SIGNIFICANT TOXIC HEALTH EFFECT
+ 0001 01 SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT POSSIBLE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023018 0006 0000 01 RELEASE NO LONGER OCCURRING
+ 0001 01 RELEASE STILL OCCURRING
+ 0002 01 RELEASE EXPECTED TO INCREASE IN NEXT SIX HOURS
+ 0003 01 RELEASE EXPECTED TO REMAIN CONSTANT IN NEXT SIX HOURS
+ 0004 01 RELEASE EXPECTED TO DECREASE IN NEXT SIX HOURS
+ 0007 01 MISSING VALUE
+023031 0004 0000 01 PLUME WILL NOT ENCOUNTER RAIN IN INCIDENT STATE
+ 0001 01 PLUME WILL ENCOUNTER RAIN IN INCIDENT STATE
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+023032 0004 0000 01 NO SIGNIFICANT CHANGE EXPECTED WITHIN NEXT SIX HOURS
+ 0001 01 ANTICIPATED SIGNIFICANT CHANGE EXPECTED WITHIN NEXT SIX HOURS
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+024003 0005 0000 01 NOBLE GASES
+ 0001 01 IODINES
+ 0002 01 CAESIUM
+ 0003 01 TRANSURANICS
+ 0031 01 MISSING VALUE
+025004 0004 0000 01 INCOHERENT
+ 0001 01 COHERENT (DOPPLER)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025005 0004 0000 01 LOGATITHM - 2.5 DB
+ 0001 01 LINEAR
+ 0002 01 SPECIAL
+ 0003 01 MISSING VALUE
+025006 0005 0000 01 ZH TO R CONVERSION
+ 0001 01 (ZH, ZDR) TO (NO.DO) TO R
+ 0002 01 (Z(F1),Z(F2)) TO ATTENUATION TO R
+ 0006 01 OTHER
+ 0007 01 MISSING VALUE
+025009 0004 0001 01 NONE
+ 0002 01 CALIBRATION TARGET OR SIGNAL
+ 0003 01 AGAINST RAINGAGES
+ 0004 01 AGAINST OTHER INSTRUMENTS (DISTROMETER-ATTENUATION)
+025010 0008 0000 01 NONE
+ 0001 01 MAP
+ 0002 01 INSERTION OF HIGHER ELEVATION DATA AND MAP
+ 0003 01 ANALYSIS OF FLUCTUATING LOGARITHM SIGNAL (CLUTTER DETECTION)
+ 0004 01 EXTRACTION OF FLUCTUATING PART OF LINEAR SIGNAL (CLUTTER SUPPRESSION)
+ 0005 01 CLUTTER SUPPRESSION DOPPLER
+ 0006 01 MULTIPARAMETER ANALYSIS
+ 0015 01 MISSING VALUE
+025011 0004 0000 01 NONE
+ 0001 01 MAP OF CORRECTION FACTORS
+ 0002 01 INTERPOLATION (AZIMUTH OR ELEVATION)
+ 0003 01 MISSING VALUE
+025012 0004 0000 01 HARDWARE
+ 0001 01 SOFTWARE
+ 0002 01 HARDWARE AND SOFTWARE
+ 0003 01 MISSING VALUE
+025013 0001 0001 01 BRIGHT BAND CORRECTION
+025015 0001 0001 01 RADOME ATTENUATION CORRECTION
+025017 0001 0001 01 PRECIPITATION ATTENUATION CORRECTION
+025020 0004 0000 01 FTT (FAST FOURIER TRANSFORM
+ 0001 01 PPP (PULSE PAIR PROCESSING
+ 0002 01 VPC (VECTOR-PHASE CHANGE)
+ 0003 01 MISSING VALUE
+025021 0005 0001 01 SIMPLE AVERAGE
+ 0002 01 CONSENSUS AVERAGE
+ 0003 01 MEDIAN CHECK
+ 0004 01 VERTICAL CONSISTENCY CHECK
+ 0005 01 OTHER
+025030 0004 0000 01 RUNNING MEAN SEA-SURFACE TEMPERATURE NOT USED BECAUSE USAGE CRITERIA NOT MET
+ 0001 01 RUNNING MEAN SEA-SURFACE TEMPERATURE NOT USED BECAUSE DATA NOT AVAILABLE
+ 0002 01 RUNNING MEAN SEA-SURFACE TEMPERATURE USED AS PREDICTOR
+ 0003 01 MISSING VALUE
+025032 0004 0000 01 RESERVED
+ 0001 01 DATA FROM LOW MODE
+ 0002 01 DATA FROM HIGH MODE
+ 0003 01 MISSING VALUE
+025033 0004 0000 01 WIND PROFILER OPERATING IN SUBMODE A
+ 0001 01 WIND PROFILER OPERATING IN SUBMODE B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025034 0004 0001 01 TEST A PERFORMED AND FAILED
+ 0002 01 TEST B PERFORMED AND FAILED
+ 0003 01 TEST RESULTS INCONCLUSIVE
+025036 0004 0000 02 NETWORK OF SEVERAL DIRECTION-FINDERS OPERATING ON
+ THE SAME INDIVIDUAL ATMOSPHERICS
+ 0001 02 NETWORK OF SEVERAL ARRIVAL-TIME STATIONS OPERATING ON
+ THE SAME INDIVIDUAL ATMOSPHERICS
+ 0006 01 SINGLE STATION RANGE BEARING TECHNIQUE
+ 0015 01 MISSING VALUE
+025040 0010 0000 01 NON-SPECIFIC MODE
+ 0001 01 FIRST GUESS DATA
+ 0002 01 CLOUD DATA
+ 0003 01 AVERAGE VECTOR DATA
+ 0004 01 PRIMARY DATA
+ 0005 01 GUESS DATA
+ 0006 01 VECTOR DATA
+ 0007 01 TRACER DATA; THE IMAGE
+ 0008 01 TRACER DATA TO NEXT IMAGE
+ 0015 01 MISSING VALUE
+025041 0004 0000 01 DIRECTION ORIGINALLY REPORTED IN TRUE DEGREES
+ 0001 01 DIRECTION ORIGINALLY REPORTED USING CODE TABLE 0700, FM 13
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025042 0004 0000 01 SPEED ORIGINALLY REPORTED IN METERS PER SECOND
+ 0001 01 SPEED ORIGINALLY REPORTED USING CODE TABLE 2251, FM 13
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025045 0020 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+ 0007 01 CHANNEL 7 PRESENT - (SET TO 1 PRESENT)
+ 0008 01 CHANNEL 8 PRESENT - (SET TO 1 PRESENT)
+ 0009 01 CHANNEL 9 PRESENT - (SET TO 1 PRESENT)
+ 0010 01 CHANNEL 10 PRESENT - (SET TO 1 PRESENT)
+ 0011 01 CHANNEL 11 PRESENT - (SET TO 1 PRESENT)
+ 0012 01 CHANNEL 12 PRESENT - (SET TO 1 PRESENT)
+ 0013 01 CHANNEL 13 PRESENT - (SET TO 1 PRESENT)
+ 0014 01 CHANNEL 14 PRESENT - (SET TO 1 PRESENT)
+ 0015 01 CHANNEL 15 PRESENT - (SET TO 1 PRESENT)
+ 0016 01 CHANNEL 16 PRESENT - (SET TO 1 PRESENT)
+ 0017 01 CHANNEL 17 PRESENT - (SET TO 1 PRESENT)
+ 0018 01 CHANNEL 18 PRESENT - (SET TO 1 PRESENT)
+ 0019 01 CHANNEL 19 PRESENT - (SET TO 1 PRESENT)
+ 0020 01 CHANNEL 20 PRESENT - (SET TO 1 PRESENT)
+025046 0004 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+025047 0003 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+025048 0015 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+ 0007 01 CHANNEL 7 PRESENT - (SET TO 1 PRESENT)
+ 0008 01 CHANNEL 8 PRESENT - (SET TO 1 PRESENT)
+ 0009 01 CHANNEL 9 PRESENT - (SET TO 1 PRESENT)
+ 0010 01 CHANNEL 10 PRESENT - (SET TO 1 PRESENT)
+ 0011 01 CHANNEL 11 PRESENT - (SET TO 1 PRESENT)
+ 0012 01 CHANNEL 12 PRESENT - (SET TO 1 PRESENT)
+ 0013 01 CHANNEL 13 PRESENT - (SET TO 1 PRESENT)
+ 0014 01 CHANNEL 14 PRESENT - (SET TO 1 PRESENT)
+ 0015 01 CHANNEL 15 PRESENT - (SET TO 1 PRESENT)
+025049 0005 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+025051 0006 0001 01 CHANNEL 1 PRESENT - (SET TO 1 PRESENT)
+ 0002 01 CHANNEL 2 PRESENT - (SET TO 1 PRESENT)
+ 0003 01 CHANNEL 3 PRESENT - (SET TO 1 PRESENT)
+ 0004 01 CHANNEL 4 PRESENT - (SET TO 1 PRESENT)
+ 0005 01 CHANNEL 5 PRESENT - (SET TO 1 PRESENT)
+ 0006 01 CHANNEL 6 PRESENT - (SET TO 1 PRESENT)
+025053 0006 0001 01 GOOD
+ 0002 01 REDUNDANT
+ 0003 01 QUESTIONABLE
+ 0004 01 BAD
+ 0005 01 EXPERIMENTAL
+ 0006 01 PRECIPITATING
+025069 0007 0001 01 SMOOTHED
+ 0002 01 BASELINE ADJUSTED
+ 0003 01 NORMALIZED TIME INTERVAL
+ 0004 01 OUTLIER CHECKED
+ 0005 01 PLAUSIBILITY CHECKED
+ 0006 01 CONSISTENCY CHECKED
+ 0007 01 INTERPOLATED
+025086 0004 0000 01 DEPTHS ARE NOT CORRECTED
+ 0001 01 DEPTHS ARE CORRECTED
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025093 0003 0001 01 NO CORRECTION
+ 0002 01 VERTICAL VELOCITY CORRECTION
+ 0007 01 ALL CORRECTIONS
+025095 0001 0001 02 ALTIMETER OPERATING (SET TO 0 IF NOMINAL, SET TO
+ BACKUP)
+025096 0004 0001 01 MODE INDICATOR (0 IF MODE 2, 1 IF MODE 1)
+ 0002 03 MODE 1 CALIBRATION SEQUENCE INDICATOR (0 IF
+ NORMAL DATA TAKING EITHER MODE 1 OR 2, 1 IF MODE 1 CALIBRATION SEQUENCE)
+ BITS 3 AND 4 INDICATE ACTIVE 23.8 GHZ CHANNEL
+ 0003 01 CHANNEL 2 (0 IF ON, 1 IF OFF)
+ 0004 01 CHANNEL 3 (0 IF ON, 1 IF OFF)
+025097 0011 0000 01 RANGES BETWEEN 0 AND 30 CM
+ 0001 01 RANGES BETWEEN 30 AND 60 CM
+ 0002 01 RANGES BETWEEN 60 AND 90 CM
+ 0003 01 RANGES BETWEEN 90 AND 120 CM
+ 0004 01 RANGES BETWEEN 120 AND 150 CM
+ 0005 01 RANGES BETWEEN 150 AND 180 CM
+ 0006 01 RANGES BETWEEN 180 AND 210 CM
+ 0007 01 RANGES BETWEEN 210 AND 240 CM
+ 0008 01 RANGES BETWEEN 240 AND 270 CM
+ 0009 01 RANGES LARGER THAN 270 CM
+ 0015 01 MISSING VALUE
+025098 0008 0001 01 KU BAND RANGE
+ 0002 01 C BAND RANGE
+ 0003 01 KU BAND SWH
+ 0004 01 C BAND SWH
+ 0005 01 KU BAND SCATTEROMETER COEFFICIENT
+ 0006 01 C BAND SCATTEROMETER COEFFICIENT
+ 0007 01 OFF NADIR ANGLE FROM KU BAND WVEFORM PARAMETERS
+ 0008 01 OFF NADIR FROM PLATFORM
+025099 0006 0001 01 KU BAND RANGE INSTRUMENTAL CORRECTION
+ 0002 01 C BAND RANGE INSTRUMENTAL CORRECTION
+ 0003 01 KU BAND SWH INSTRUMENTAL CORRECTION
+ 0004 01 C BAND SWH INSTRUMENTAL CORRECTION
+ 0005 01 KU BAND SCATTEROMETER COEFFICIENT INSTRUMENTAL CORRECTION
+ 0006 01 C BAND SCATTEROMETER COEFFICIENT INSTRUMENTAL CORRECTION
+025110 0006 0001 02 RAW DATA ANALYSIS USED FOR RAW DATA CORRECTION.
+ CORRECTION DONE USING DEFAULT PARAMETERS
+ 0002 01 RAW DATA ANALYSIS USED FOR RAW DATA CORRECTION.
+ CORRECTION DONE USING RAW DATA ANALYSIS RESULTS
+ 0003 01 ANTENNA ELEVATION PATTERN CORRECTION APPLIED
+ 0004 01 NOMINAL CHIRP REPLICA USED
+ 0005 01 RECONSTRUCTED CHIRP USED
+ 0006 01 SLANT RANGE TO GROUND RANGE CONVERSION APPLIED
+025120 0004 0000 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS GREATER THAN THE ACCEPTABLE THRESHOLD
+ 0001 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS LESS THAN THE ACCEPTABLE THRESHOLD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025122 0004 0000 01 HARDWARE CONFIGURATION FOR RF IS A
+ 0001 01 HARDWARE CONFIGURATION FOR RF IS B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025123 0004 0000 01 HARDWARE CONFIGURATION FOR HPA IS A
+ 0001 01 HARDWARE CONFIGURATION FOR HPA IS B
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025124 0004 0000 01 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS GREATER THAN THE ACCEPTABLE THRESHOLD
+ 0001 02 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL
+ 2 PROCESSING IS LESS THAN THE ACCEPTABLE THRESHOLD
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+025144 0014 0001 01 PIXEL IS AFFECTED BY RFI EFFECTS
+ 0002 01 PIXEL IS LOCATED IN THE HEXAGONAL ALIAS DIRECTION CENTRED ON SUN ALIAS
+ 0003 01 PIXEL IS CLOSE TO THE BORDER DELIMITING THE EXTENDED ALIAS FREE ZONE
+ 0004 01 PIXEL IS INSIDE THE EXTENDED ALIAS FREE ZONE
+ 0005 01 PIXEL IS INSIDE THE EXCLUSIVE OF ALIAS FREE ZONE
+ 0006 01 PIXEL IS LOCATED IN ZONE WHERE A MOON ALIAS WAS RECONSTRUCTED
+ 0007 01 PIXEL IS LOCATED IN ZONE WHERE SUN REFLECTION HAS BEEN DETECTED
+ 0008 01 PIXEL IS LOCATED IN ZONE WHERE SUN ALIAS WAS RECONSTRUCTED
+ 0009 02 FLAT TARGET TRANSFORMATION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION OF THIS PIXEL
+ 0010 02 SCENE HAS BEEN COMBINED WITH AN ADJUSTMENT SCENE IN OPOSITE POLARISATION
+ DURING IMAGE RECONSTRUCTION TO ACCOUNT FOR CROSS-POLARISATION LEAKAGE
+ 0011 02 DIRECT MOON CORRECTION HAS BENN PERFORMED DURING IMAGE RECONSTRUCTION OF
+ THIS PIXEL
+ 0012 02 REFLECTED SUN CORRECTION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION IF THIS PIXEL
+ 0013 02 DIRECT SUN CORRECTION HAS BEEN PERFORMED DURING IMAGE
+ RECONSTRUCTION OF THIS IMAGE
+026010 0025 0001 01 0100 INCLUDED
+ 0002 01 0200 INCLUDED
+ 0003 01 0300 INCLUDED
+ 0004 01 0400 INCLUDED
+ 0005 01 0500 INCLUDED
+ 0006 01 0600 INCLUDED
+ 0007 01 0700 INCLUDED
+ 0008 01 0800 INCLUDED
+ 0009 01 0900 INCLUDED
+ 0010 01 1000 INCLUDED
+ 0011 01 1100 INCLUDED
+ 0012 01 1200 INCLUDED
+ 0013 01 1300 INCLUDED
+ 0014 01 1400 INCLUDED
+ 0015 01 1500 INCLUDED
+ 0016 01 1600 INCLUDED
+ 0017 01 1700 INCLUDED
+ 0018 01 1800 INCLUDED
+ 0019 01 1900 INCLUDED
+ 0020 01 2000 INCLUDED
+ 0021 01 2100 INCLUDED
+ 0022 01 2200 INCLUDED
+ 0023 01 2300 INCLUDED
+ 0024 01 2400 INCLUDED
+ 0025 01 UNKNOWN MIXTURE OF HOURS
+029001 0006 0000 01 GNOMONIC PROJECTION
+ 0001 01 POLAR STEREOGRAPHIC PROJECTION
+ 0002 01 LAMBERT'S CONFORMAL CONIC PROJECTION
+ 0003 01 MERCATOR'S PROJECTION
+ 0004 01 SCANNING CONE (RADAR)
+ 0007 01 MISSING VALUE
+029002 0004 0000 01 CARTESIAN
+ 0001 01 POLAR
+ 0002 01 OTHER
+ 0007 01 MISSING VALUE
+030031 0013 0000 01 PPI
+ 0001 01 COMPOSITE
+ 0002 01 CAPPI
+ 0003 01 VERTICAL SECTION
+ 0004 01 ALPHANUMERIC DATA
+ 0005 01 MAP OF SUBJECT CLUTTER
+ 0006 01 MAP
+ 0007 01 TEST PICTURE
+ 0008 01 COMMENTS
+ 0009 01 MAP OF GROUND OCCULTATION
+ 0010 01 MAP OF RADAR BEAM HEIGHT
+ 0014 01 OTHER
+ 0015 01 MISSING VALUE
+030032 0009 0001 01 MAP
+ 0002 01 SATELLITE IR
+ 0003 01 SATELLITE VIS
+ 0004 01 SATELLITE WV
+ 0005 01 SATELLITE MULTISPECTRAL
+ 0006 01 SYNOPTIC OBSERVATIONS
+ 0007 01 FORECAST PARAMETERS
+ 0008 01 LIGHTNING DATA
+ 0015 01 OTHER DATA
+031021 0004 0001 01 1 BIT INDICATOR OF QUALITY, 0= GOOD; 1=SUSPECT OR BAD
+ 0002 02 2 BIT INDICATOR OF QUALITY, 0= GOOD; 1= SLIGHTLY SUSPECTED;
+ 2= HIGHLY SUSPECTED; 3=BAD
+ 0007 01 PERCENTAGE CONFIDENCE
+ 0063 01 MISSING VALUE
+031031 0001 0001 01 DATA NOT PRESENT
+033002 0004 0000 01 DATA NOT SUSPECT
+ 0001 01 DATA SUSPECT
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033003 0005 0000 01 DATA NOT SUSPECT
+ 0001 01 DATA SLIGHTLY SUSPECT
+ 0002 01 DATA HIGHTLY SUSPECT
+ 0003 01 DATA CONSIDERED UNFIT FOR USE
+ 0007 01 MISSING VALUE
+033005 0023 0001 01 NO AUTOMATED METEOROLOGICAL DATA CHECKS PERFORMED
+ 0002 01 PRESSURE DATA SUSPECT
+ 0003 01 WIND DATA SUSPECT
+ 0004 01 DRY-BULB TEMPERATURE DATA SUSPECT
+ 0005 01 WET-BULB TEMPERATURE DATA SUSPECT
+ 0006 01 HUMIDITY DATA SUSPECT
+ 0007 01 GROUND TEMPERATURE DATA SUSPECT
+ 0008 01 SOIL TEMPERATURE (DEPTH 1) DATA SUSPECT
+ 0009 01 SOIL TEMPERATURE (DEPTH 2) DATA SUSPECT
+ 0010 01 SOIL TEMPERATURE (DEPTH 3) DATA SUSPECT
+ 0011 01 SOIL TEMPERATURE (DEPTH 4) DATA SUSPECT
+ 0012 01 SOIL TEMPERATURE (DEPTH 5) DATA SUSPECT
+ 0013 01 CLOUD DATA SUSPECT
+ 0014 01 VISIBILITY DATA SUSPECT
+ 0015 01 PRESENT WEATHER DATA SUSPECT
+ 0016 01 LIGHTNING DATA SUSPECT
+ 0017 01 ICE DEPOSIT DATA SUSPECT
+ 0018 01 PRECIPITATION DATA SUSPECT
+ 0019 01 STATE OF GROUND DATA SUSPECT
+ 0020 01 SNOW DATA SUSPECT
+ 0021 01 WATER CONTENT DATA SUSPECT
+ 0022 01 EVAPORATION/EVAPOTRANSPIRATION DATA SUSPECT
+ 0023 01 SUNSHINE DATA SUSPECT
+033006 0005 0000 01 SELF-CHECK OK
+ 0001 01 AT LEAST ONE WARNING ACTIVE, NO ALARMS
+ 0002 01 AT LEAST ONE ALARM ACTIVE
+ 0003 01 SENSOR FAILURE
+ 0007 01 MISSING VALUE
+033015 0016 0000 01 PASSED ALL CHECKS
+ 0001 01 MISSING-DATA CHECK
+ 0002 01 DESCENDING/REASCENDING BALLOON CHECK
+ 0003 01 DATA PLAUSIBILITY CHECK (ABOVE LIMITS)
+ 0004 01 DATA PLAUSIBILITY CHECK (BELOW LIMITS)
+ 0005 01 SUPERADIABATIC LAPSE RATE CHECK
+ 0006 01 LIMITING ANGLES CHECK
+ 0007 01 ASCENSION RATE CHECK
+ 0008 01 EXCESSIVE CHANGE FROM PREVIOUS FLIGHT
+ 0009 01 BALLOON OVERHEAD CHECK
+ 0010 01 WIND SPEED CHECK
+ 0011 01 WIND DIRECTION CHECK
+ 0012 01 DEPENDENCY CHECK
+ 0013 01 DATA VALID BUT MODIFIED
+ 0014 01 DATA OUTLIER CHECK
+ 0063 01 MISSING DATA
+033020 0008 0000 01 GOOD
+ 0001 01 INCONSISTENT
+ 0002 01 DOUBTFUL
+ 0003 01 WRONG
+ 0004 01 NOT CHECKED
+ 0005 01 HAS BEEN CHECKED
+ 0006 01 RESERVED
+ 0007 01 MISSING VALUE
+033021 0004 0000 01 WITHIN LIMITS
+ 0001 01 OUTSIDE LIMITS
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033022 0004 0000 01 GOOD (SEVERAL IDENTICAL REPORTS HAVE BEEN RECEIVED)
+ 0001 01 DUBIOUS (NO IDENTICAL REPORT HAVE BEEN RECEIVED)
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033023 0004 0000 01 RELIABLE (LOCATION WAS MADE OVER TWO SATELLITE PASSES)
+ 0001 01 LATEST KNOWN (NO LOCATION OVER CORRESPONDING PASS)
+ 0002 01 DUBIOUS
+ 0003 01 MISSING VALUE
+033024 0010 0000 01 RESERVED
+ 0001 01 EXELLENT - WITHIN 3 METRES
+ 0002 01 GOOD - WITHIN 10 METRES
+ 0003 01 FAIR - WITHIN 20 METRES
+ 0004 01 POOR - MORE THAN 20 METRES
+ 0005 01 EXELLENT -WITHIN 10 FEET
+ 0006 01 GOOD WITHIN-30 FEET
+ 0007 01 FAIR WITHIN 60 FEET
+ 0008 01 POOR - MORE THAN 60 FEET
+ 0015 01 MISSING VALUE
+033025 0005 0000 01 TIME INTERPOLATED, LATITUDE AND LONGITUDE REPORTED
+ 0001 01 TIME REPORTED, LATITUDE AND LONGITUDE INTERPOLATED
+ 0002 01 TIME, LATITUDE AND LONGITUDE INTERPOLATED
+ 0003 01 TIME, LATITUDE AND LONGITUDE REPORTED
+ 0007 01 MISSING VALUE
+033026 0010 0000 01 NORMAL OPERATIONS - MEASUREMENT MODE
+ 0001 01 NORMAL OPERATIONS - NON-MEASUREMENT MODE
+ 0002 01 SMALL RH
+ 0003 01 HUMIDITY ELEMENT IS WET
+ 0004 01 HUMIDITY ELEMENT IS CONTAMINATED
+ 0005 01 HEATER FAIL
+ 0006 01 HEATER FAIL AND WET/CONTAMINATED HUMIDITY ELEMENT
+ 0007 01 SINGLE VALIDITY BAD
+ 0008 01 NUMERIC ERROR
+ 0063 01 MISSING VALUE
+033027 0005 0000 01 RADIUS >= 1500 M
+ 0001 01 500 M <= RADIUS < 1500 M
+ 0002 01 250 M <= RADIUS < 500 M
+ 0003 01 RADIUS < 250 M
+ 0007 01 MISSING VALUE
+033028 0006 0000 01 RESERVED
+ 0001 01 NOMINAL
+ 0002 01 DEGRADED BY SW ERROR; ANY ERROR REPORTED BY THE ALGORITHMS
+ 0003 01 DEGRADED BY INSTRUMENT ERROR
+ 0004 01 DEGRADED BY CORRUPTED/MISSING ADF
+ 0007 01 MISSING
+033030 0007 0001 01 DO NOT USE SCAN FOR PRODUCT GENERATION
+ 0002 01 TIME SEQUENCE ERROR DETECTED WITH THIS SCAN
+ 0003 01 DATA GAP PRECEDES THIS SCAN
+ 0004 01 NO CALIBRATION
+ 0005 01 NO EARTH LOCATION
+ 0006 01 FIRST GOOD TIME FOLLOWING A CLOCK UPDATE
+ 0007 01 INSTRUMENT STATUS CHANGED WITH THIS SCAN
+033031 0021 0001 01 TIME FIELD IS BAD BUT CAN PROBABLY BE INFERRED FROM THE PREVIOUS GOOD TIME
+ 0002 01 TIME FIELD IS BAD AND CAN�~@~YT BE INFERRED FROM THE PREVIOUS GOOD TIME
+ 0003 04 THIS RECORD STARTS A SEQUENCE THAT IS INCONSISTENT WITH
+ PREVIOUS TIMES (I.E. THERE IS A TIME DISCONTINUITY). THIS MAY OR MAY
+ NOT BE ASSOCIATED WITH A SPACECRAFT CLOCK UPDATE (SEE SCAN LINE
+ STATUS FLAGS FOR ATOVS)
+ 0004 02 START OF A SEQUENCE THAT APPARENTLY REPEATS SCAN
+ TIMES THAT HAVE BEEN PREVIOUSLY ACCEPTED
+ 0005 01 SCAN LINE WAS NOT CALIBRATED BECAUSE OF BAD TIME
+ 0006 03 SCAN LINE WAS CALIBRATED USING FEWER THAN THE PREFERRED
+ NUMBER OF SCAN LINES BECAUSE OF PROXIMATY TO START OR
+ END OF DATA OR TO A DATA GAP
+ 0007 01 SCAN LINE WAS NOT CALIBRATED BECAUSE OF BAD OR INSUFFICIENT PRT DATA
+ 0008 01 SCAN LINE WAS CALIBRATED BUT WITH MARGINAL PRT DATA
+ 0009 01 SOME UNCALIBRATED CHANNELS ON THIS SCAN
+ 0010 01 UNCALIBRATED DUE TO INSTRUMENT MODE
+ 0011 01 QUESTIONABLE CALIBRATION BECAUSE OF ANTENNA POSITION ERROR OF SPACE VIEW
+ 0012 01 QUESTIONABLE CALIBRATION BECAUSE OF ANTENNA POSITION ERROR OF BLACK BODY
+ 0013 01 NOT EARTH LOCATED BECAUSE OF BAD TIME
+ 0014 03 EARTH LOCATION QUESTIONABLE BECAUSE OF
+ QUESTIONABLE TIME CODE (SEE TIME PROBLEM
+ CODE BITS)
+ 0015 02 EARTH LOCATION QUESTIONABLE - ONLY MARGINAL AGREEMENT
+ WITH REASONABLENESS CHECK
+ 0016 01 EARTH LOCATION QUESTIONABLE - FAILS REASONABLENESS CHECK
+ 0017 01 EARTH LOCATION QUESTIONABLE BECAUSE OF ANTENNA POSITION CHECK
+ 0018 01 SCAN LINE CALIBRATION COLD BLACK BODY
+ 0019 01 SCAN LINE CALIBRATION WARM BLACK BODY
+ 0020 01 SCAN LINE CALIBRATION SPACE VIEW
+ 0021 01 EARTH VIEW
+033032 0006 0001 01 NO GOOD BLACKBODY COUNTS FOR SCAN LINE
+ 0002 01 NO GOOD SPACE VIEW COUNTS FOR THIS LINE
+ 0003 01 NO GOOD PRTS FOR THIS LINE
+ 0004 01 SOME BAD BLACKBODY VIEW COUNTS FOR THIS LINE
+ 0005 01 SOME BAD SPACE VIEW COUNTS FOR THIS LINE
+ 0006 01 SOME BAD PRT TEMPS ON THIS LINE
+033033 0023 0001 01 SET IF SECONDARY CALIBRATION USED
+ 0002 02 BRIGHTNESS TEMPERATURE IN CHANNEL 1 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0003 02 BRIGHTNESS TEMPERATURE IN CHANNEL 2 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0004 02 BRIGHTNESS TEMPERATURE IN CHANNEL 3 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0005 02 BRIGHTNESS TEMPERATURE IN CHANNEL 4 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0006 02 BRIGHTNESS TEMPERATURE IN CHANNEL 5 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0007 02 BRIGHTNESS TEMPERATURE IN CHANNEL 6 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0008 02 BRIGHTNESS TEMPERATURE IN CHANNEL 7 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0009 02 BRIGHTNESS TEMPERATURE IN CHANNEL 8 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0010 02 BRIGHTNESS TEMPERATURE IN CHANNEL 9 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0011 02 BRIGHTNESS TEMPERATURE IN CHANNEL 10 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0012 02 BRIGHTNESS TEMPERATURE IN CHANNEL 11 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0013 02 BRIGHTNESS TEMPERATURE IN CHANNEL 12 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0014 02 BRIGHTNESS TEMPERATURE IN CHANNEL 13 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0015 02 BRIGHTNESS TEMPERATURE IN CHANNEL 14 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0016 02 BRIGHTNESS TEMPERATURE IN CHANNEL 15 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0017 02 BRIGHTNESS TEMPERATURE IN CHANNEL 16 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0018 02 BRIGHTNESS TEMPERATURE IN CHANNEL 17 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0019 02 BRIGHTNESS TEMPERATURE IN CHANNEL 18 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0020 02 BRIGHTNESS TEMPERATURE IN CHANNEL 19 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0021 02 BRIGHTNESS TEMPERATURE IN CHANNEL 20 IS PHYSICALLY UNREASONABLE OR HAS NOT
+ BEEN CALCULATED DUE TO CALIBRATION PROBLEMS
+ 0022 01 SET IF ALL CHANNELS ARE MISSING
+ 0023 01 SUSPECT
+033035 0010 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 01 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND PASSED
+ 0002 01 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND DELETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND FAILED
+ 0005 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND RE-INSERTED
+ 0006 01 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND NOT MANUALLY CHECCKED
+ 0007 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE
+ AND MANUALLY CHECKED AND FAILED
+ 0008 01 MANUALLY CHECKED AND FAILED
+ 0015 01 MISSING VALUE
+033037 0020 0001 01 U DEPARTURE FROM GUESS
+ 0002 01 V DEPARTURE FROM GUESS
+ 0003 01 U & V DEPARTURE FROM GUESS
+ 0004 01 U ACCELERATION
+ 0005 01 V ACCELERATION
+ 0006 01 U & V ACCELERATION
+ 0007 01 POSSIBLE LAND FEATURE
+ 0008 01 U ACCELERATION AND POSSIBLE LAND FEATURE
+ 0009 01 V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0010 01 U & V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0011 01 BAD WIND GUESS
+ 0012 01 CORRELATION FAILURE
+ 0013 01 SEARCH BOX OFF EDGE OF AREA
+ 0014 01 TARGET BOX OFF EDGE OF AREA
+ 0015 01 PIXEL BRIGHTNESS OUT OF BOUNDS (NOISY LINE)
+ 0016 01 TARGET OUTSIDE OF LAT/LONG BOX
+ 0017 01 TARGET OUTSIDE OF PRESSURE MIN/MAX
+ 0018 01 AUTOEDITOR FLAGGED SLOW VECTOR
+ 0019 01 AUTOEDITOR FLAGGED VECTORS
+033038 0009 0001 01 TOTAL ZENITH DELAY QUALITY IS CONSIDERED POOR
+ 0002 01 GALILEO SATELLITES USED
+ 0003 01 GLONASS SATELLITES USED
+ 0004 01 GPS SATELLITES USED
+ 0005 01 METEOROLOGICAL DATA APPLIED
+ 0006 01 ATMOSPHERIC LOADING CORRECTION APPLIED
+ 0007 01 OCEAN TIDE LOADING APPLIED
+ 0008 01 CLIMATE QUALITY DATA PROCESSING
+ 0009 01 NEAR-REAL TIME DATA PROCESSING
+033039 0009 0001 01 NON-NOMINAL QUALITY
+ 0002 01 OFFLINE PRODUCT
+ 0003 01 ASCENDING OCCULTATION FLAG
+ 0004 01 EXCESS PHASE PROCESSING NON-NOMINAL
+ 0005 01 BENDING ANGLE PROCESSING NON-NOMINAL
+ 0006 01 REFRACTIVITY PROCESSING NON-NOMINAL
+ 0007 01 METEOROLOGICAL PROCESSING NON-NOMINAL
+ 0014 01 BACKGROUND PROFILE NON-NOMINAL
+ 0015 01 BACKGROUND (I.E. NOT RETRIEVED) PROFILE PRESENT
+033041 0004 0000 01 THE FOLLOWING VALUE IS THE TRUE VALUE
+ 0001 02 THE FOLLOWING VALUE IS HIGHER THAN THE TRUE VALUE
+ (THE MEASUREMENT HIT THE LOWER LIMIT OF THE INSTRUMENT)
+ 0002 02 THE FOLLOWING VALUE IS LOWER THAN THE TRUE VALUE
+ (THE MEASUREMENT HIT THE HIGHER LIMIT OF THE INSTRUMENT)
+ 0003 01 MISSING VALUE
+033042 0005 0000 01 EXCLUSIVE LOWER LIMIT (>)
+ 0001 01 INCLUSIVE LOWER LIMIT (>=)
+ 0002 01 EXCLUSIVE UPPER LIMIT (<)
+ 0003 01 INCLUSIVE UPPER LIMIT (=<)
+ 0007 01 MISSING VALUE
+033043 0004 0001 02 SEA MDS. NADIR ONLY SST RETRIEVAL USED 3.7 MICRON
+ CHANNEL. LAND MDS RESERVED
+ 0002 02 SEA MDS. DUAL VIEW SST RETRIEVAL USED 3.7 MICRON
+ CHANNEL. LAND MDS RESERVED.
+ 0003 01 NADIR VIEW CONTAINS DAY TIME DATA
+ 0004 01 FORWARD VIEW CONTAINS DAY TIME DATA
+033044 0014 0001 01 INPUT DATA MEAN OUTSIDE NOMINAL RANGE FLAG
+ 0002 01 INPUT DATA STANDARD DEVIATION OUTSIDE NOMINAL RANGE FLAG
+ 0003 01 NUMBER OF INPUT DATA GAPS > THRESHOLD VALUE
+ 0004 01 PERCENTAGE OF MISSING LINES > THRESHOLD VALUE
+ 0005 01 DOPPLER CENTROID UNCERTAIN. CONFIDENCE MEASURE < SPECIFIC VALUE
+ 0006 01 DOPPLER AMBIGUITY ESTIMATE UNCERTAIN. CONFIDENCE MEASURE < SPECIFIC VALUE
+ 0007 01 OUTPUT DATA MEAN OUTSIDE NOMINAL RANGE FLAG
+ 0008 01 OUTPUT DATA STANDARD DEVIATION OUTSIDE NOMINAL RANGE FLAG
+ 0009 01 CHIRP RECONSTRUCTION FAILED OR IS OF LOW QUALITY FLAG
+ 0010 01 DATA SET MISSING
+ 0011 01 INVALID DOWNLINK PARAMETERS
+ 0012 02 AZIMUTH CUT-OFF ITERATION COUNT. THE AZIMUTH
+ CUT-OFF FIT DID NOT CONVERGE WITHIN A MINIMUM NUMBER OF ITERATIONS
+ 0013 02 AZIMUTH CUT-OFF FIT DID NOT CONVERGE WITHIN A MINIMUM
+ NUMBER OF ITERATIONS
+ 0014 03 PHASE INFORMATION CONFIDENCE MEASURE. THE IMAGINARY SPECTRAL
+ PEAK IS LESS THAN A MINIMUM THRESHOLD, OR THE ZERO LAG SHIFT
+ IS GREATER THAN A MINIMUM THRESHOLD
+033047 0026 0001 01 ERROR DETECTED AND ATTEMPTS TO RECOVER MADE
+ 0002 01 ANOMALY IN ON-BOARD DATA HANDLING (OBDH) VALUE DETECTED
+ 0003 01 ANOMALY IN ULTRA STABLE OSCILLATOR PROCESSING (USOP) VALUE DETECTED
+ 0004 01 ERRORS DETECTED BY ON-BOARD COMPUTER
+ 0005 01 AUTOMATIC GAIN CONTROL (AGC) OUT OF RANGE
+ 0006 01 RX DELAY FAULT. RX DISTANCE OUT OF RANGE
+ 0007 01 WAVE FORM SAMPLES FAULT IDENTIFIER. ERROR
+ 0012 01 BRIGHTNESS TEMPERATURE (CHANNEL 1) OUT OF RANGE
+ 0013 01 BRIGHTNESS TEMPERATURE (CHANNEL 2) OUT OF RANGE
+ 0014 01 RESERVED
+ 0015 01 KU OCEAN RETRACKING ERROR
+ 0016 01 S OCEAN RETRACKING ERROR
+ 0017 01 KU ICE 1 RETRACKING ERROR
+ 0018 01 S ICE 1 RETRACKING ERROR
+ 0019 01 KU ICE 2 RETRACKING ERROR
+ 0020 01 S ICE 2 RETRACKING ERROR
+ 0021 01 KU SEA ICE RETRACKING ERROR
+ 0022 01 ARITHMETIC FAULT ERROR
+ 0023 01 METEO DATA STATE. NO MAP
+ 0024 01 METEO DATA STATE. 1 MAP
+ 0025 01 METEO DATA STATE 2 MAPS DEGRADED
+ 0026 01 METEO DATA STATE 2 MAPS NOMINAL
+ 0027 01 ORBIT PROPAGATOR STATUS FOR PROPAGATION MODE, SEVERAL ERRORS
+ 0028 01 ORBIT PROPAGATOR STATUS FOR PROPAGATION MODE, WARNING DETECTED
+ 0029 01 ORBIT PROPAGATOR STATUS FOR INITIALISATION MODE, SEVERAL ERRORS
+ 0030 01 ORBIT PROPAGATOR STATUS FOR INITIALISATION MODE, WARNING DETECTED
+033048 0004 0000 01 INVERSION SUCCESSFUL
+ 0001 01 INVERSION NOT SUCCESSFUL
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033049 0004 0000 01 EXTERNAL WIND DIRECTION USED DURING INVERSION
+ 0001 01 EXTERNAL WIND DIRECTION NOT USED DURING INVERSION
+ 0002 01 RESERVED
+ 0003 01 MISSING VALUE
+033050 0008 0000 01 UNQUALIFIED
+ 0001 01 CORRECT VALUE (ALL CHECKS PASSED)
+ 0002 01 PROBABLY GOOD BUT VALUE INCONSISTENT WITH STATISTICS (DIFFER FROM CLIMATOLOGY)
+ 0003 01 PROBABLY BAD (SPIKE, GRADIENT, �~E IF OTHER TESTS PASSED)
+ 0004 02 BAD VALUE, IMPOSSIBLE VALUE (OUT OF SCALE, VERTICAL
+ INSTABILITY, CONSTANT PROFILE)
+ 0005 01 VALUE MODIFIED DURING QUALITY CONTROL
+ 0008 01 INTERPOLATED VALUE
+ 0015 01 MISSING VALUE
+033052 0020 0001 01 DATA BLOCK 1 INVALID (S BAND)
+ 0002 01 DATA BLOCK 2 INVALID (S BAND)
+ 0003 01 DATA BLOCK 3 INVALID (S BAND)
+ 0004 01 DATA BLOCK 4 INVALID (S BAND)
+ 0005 01 DATA BLOCK 5 INVALID (S BAND)
+ 0006 01 DATA BLOCK 6 INVALID (S BAND)
+ 0007 01 DATA BLOCK 7 INVALID (S BAND)
+ 0008 01 DATA BLOCK 8 INVALID (S BAND)
+ 0009 01 DATA BLOCK 9 INVALID (S BAND)
+ 0010 01 DATA BLOCK 10 INVALID (S BAND)
+ 0011 01 DATA BLOCK 11 INVALID (S BAND)
+ 0012 01 DATA BLOCK 12 INVALID (S BAND)
+ 0013 01 DATA BLOCK 13 INVALID (S BAND)
+ 0014 01 DATA BLOCK 14 INVALID (S BAND)
+ 0015 01 DATA BLOCK 15 INVALID (S BAND)
+ 0016 01 DATA BLOCK 16 INVALID (S BAND)
+ 0017 01 DATA BLOCK 17 INVALID (S BAND)
+ 0018 01 DATA BLOCK 18 INVALID (S BAND)
+ 0019 01 DATA BLOCK 19 INVALID (S BAND)
+ 0020 01 DATA BLOCK 20 INVALID (S BAND)
+033053 0020 0001 01 DATA BLOCK 1 INVALID (KU BAND)
+ 0002 01 DATA BLOCK 2 INVALID (KU BAND)
+ 0003 01 DATA BLOCK 3 INVALID (KU BAND)
+ 0004 01 DATA BLOCK 4 INVALID (KU BAND)
+ 0005 01 DATA BLOCK 5 INVALID (KU BAND)
+ 0006 01 DATA BLOCK 6 INVALID (KU BAND)
+ 0007 01 DATA BLOCK 7 INVALID (KU BAND)
+ 0008 01 DATA BLOCK 8 INVALID (KU BAND)
+ 0009 01 DATA BLOCK 9 INVALID (KU BAND)
+ 0010 01 DATA BLOCK 10 INVALID (KU BAND)
+ 0011 01 DATA BLOCK 11 INVALID (KU BAND)
+ 0012 01 DATA BLOCK 12 INVALID (KU BAND)
+ 0013 01 DATA BLOCK 13 INVALID (KU BAND)
+ 0014 01 DATA BLOCK 14 INVALID (KU BAND)
+ 0015 01 DATA BLOCK 15 INVALID (KU BAND)
+ 0016 01 DATA BLOCK 16 INVALID (KU BAND)
+ 0017 01 DATA BLOCK 17 INVALID (KU BAND)
+ 0018 01 DATA BLOCK 18 INVALID (KU BAND)
+ 0019 01 DATA BLOCK 19 INVALID (KU BAND)
+ 0020 01 DATA BLOCK 20 INVALID (KU BAND)
+033060 0004 0000 01 PARAMETER=GOOD
+ 0001 01 PARAMETER=BAD
+ 0002 01 PARAMETER=RESERVED
+ 0003 01 MISSING
+033075 0005 0001 01 GAP IN RAW DATA RECORD DATA DETECTED
+ 0002 01 RECORDED TIME IS NOT IN SEQUENCE
+ 0003 01 LAMDA MONITORED CALCULATION CANNOT BE CALCULATED
+ 0004 02 THE MEASURED TEMPERATURE OF ANY INSTRUMENT COMPONENT
+ IS OUTSIDE THE ALLOWABLE RANGE
+ 0005 02 AT LEAST ONE OF THE MONITORED INSTRUMENT TEMPERATURES
+ HAS DRIFTED MORE THAN A SPECIFIED TOLERANCE VALUE
+033076 0002 0001 01 LUNAR INTRUSION ON FIRST DEEP SPACE VIEW
+ 0002 01 LUNAR INTRUSION ON SECOND DEEP SPACE VIEW
+033077 0012 0001 01 DEGRADED SDR QUALITY
+ 0002 01 INVALID SDR QUALITY
+ 0003 01 INVALID SDR GEOLOCATION INFORMATION
+ 0004 01 DEGRADED RADIOMETRIC CALIBRATION
+ 0005 01 INVALID RADIOMETRIC CALIBRATION
+ 0006 01 DEGRADED SPECTRAL CALIBRATION
+ 0007 01 INVALID SPECTRAL CALIBRATION
+ 0008 01 FRINGE COUNT ERROR DETECTED AND CORRECTED
+ 0009 01 DAy/NIGHT INDICATOR
+ 0010 01 INVALID RDR DATA
+ 0011 01 SIGNIFICANT FRINGE COUNT ERROR DETECTED
+ 0012 01 BIT TRIM FAILED
+033078 0005 0000 01 NOMINAL- ALTITUDE AND EPHEMERIS DATA AVAILABLE
+ 0001 01 MISSING AT MOST A SMALL GAP OF ALTITUDE AND EPHEMERIS
+ 0002 02 MISSING MORE THAN A SMALL GAP OF ALTITUDE AND EPHEMERIS
+ DATA, BUT NO MORE THAN A GRANULE BOUNDARY
+ 0003 01 MISSING MORE THAN GRANULE BOUNDARY OF ALTITUDE AND EPHEMERIS
+ 0015 01 MISSING VALUE
+033195 0004 0000 01 DEALIASING NOT USED
+ 0001 01 DEALIASING USED
+ 0002 01 RESERVED
+ 0003 01 MISSING
+033205 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033206 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033207 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033208 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033209 0016 0000 01 DATUM CORRECT
+ 0001 01 DATUM PROBABLY CORRECT
+ 0002 01 DATUM PROBABLY INCORRECT
+ 0003 01 DATUM INCORRECT
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 MISSING VALUE
+033220 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 REPORT REJECTED THROUGH THE NAMELIST
+ 0017 01 MODEL SUR. TOO FAR FROM STAT. ALT.
+ 0018 01 MISSING STATION ALTITUDE
+ 0019 01 REPORT OVER SEA
+ 0020 01 REPORT OVER LAND
+ 0021 01 REDUNDANT REPORT
+ 0022 01 TIME OUT OF RANGE
+ 0023 01 VERTICAL POSITION OUT OF RANGE
+ 0024 01 HORIZONTAL POSITION OUT OF RANGE
+ 0025 01 ACTIVATED BY WHITELIST
+ 0026 01 ACTIVATED DUE TO RDB FLAG
+ 0027 01 REJECTED DUE TO RDB FLAG
+ 0028 01 BAD REPORTING PRACTICE
+ 0029 01 ALL DATA REJECTED
+ 0030 01 NO DATA IN THE REPORT
+033221 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033222 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033223 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033224 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033225 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033226 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033227 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033228 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033229 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 THINNED REPORT
+033230 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033232 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 BLACKLISTED DUE TO DISTANCE FROM REF. POINT
+ 0015 01 BLACKLISTED DUE TO MODEL OROGRAPHY
+ 0016 01 BLACKLISTED DUE TO LAND/SEA MASK
+ 0017 01 STATION ALTITUDE BLACKLISTED
+ 0018 01 LONGITUDE BLACKLISTED
+ 0019 01 LATITUDE BLACKLISTED
+ 0020 01 TIME BLACKLISTED
+ 0021 01 DATE BLACKLISTED
+ 0022 01 INSTRUMENT TYPE BLACKLISTED
+ 0023 01 CODE TYPE BLACKLISTED
+ 0024 01 STATION ID BLACKLISTED
+ 0025 01 BLACKLISTED DUE TO FIRST GUESS DEPARTURE
+ 0026 01 BLACKLISTED DUE TO OBSERVED VALUE
+ 0027 01 BLACKLISTED DUE TO TYPE OF VERTICAL COORDINATE
+ 0028 01 BLACKLISTED DUE TO PRESSURE CODE
+ 0029 01 VARIABLE NAME BLACKLISTED
+ 0030 01 MONTHLY MONITORING
+033233 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 REPORT BLACK LISTED
+ 0028 01 REPORT REJECTED
+ 0029 01 REPORT PASSIVE
+ 0030 01 REPORT ACTIVE
+033234 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 DATUM BLACK LISTED
+ 0028 01 DATUM REJECTED
+ 0029 01 DATUM PASSIVE
+ 0030 01 DATUM ACTIVE
+033236 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 DATUM REJECTED DUE TO REJECTED REPORT
+ 0006 01 COMBINED FLAGGING
+ 0007 01 DATUM REJECTED DUE TO NAMELIST
+ 0008 01 VERTICAL COORDINATE CHANGE FROM Z TO P
+ 0009 01 VERTICAL CONSISTENCY CHECK
+ 0010 01 LEVEL SELECTION
+ 0011 01 MULTI LEVEL CHECK
+ 0012 01 TOO MANY SURFACE DATA/LEVELS
+ 0013 01 DUPLICATED DATUM/LEVEL
+ 0014 01 NOT AN ANALYSIS VARIABLE
+ 0015 01 REPORT OVER SEA
+ 0016 01 REPORT OVER LAND
+ 0017 01 REDUNDANT LEVEL
+ 0018 01 REDUNDANT DATUM
+ 0019 01 TOO BIG OBSERVATION ERROR
+ 0020 01 TOO BIG DEPARTURE IN ASSIMILATION
+ 0021 01 TOO BIG FIRST GUESS DEPARTURE
+ 0022 01 REFERENCE LEVEL POSITION OUT OF RANGE
+ 0023 01 VERTICAL POSITION OUT OF RANGE
+ 0024 01 BAD REPORTING PRACTICE
+ 0025 01 ACTIVATED BY WHITELIST
+ 0026 01 ACTIVATED DUE TO RDB FLAG
+ 0027 01 REJECTED DUE TO RDB FLAG
+ 0028 01 MISSING FIRST GUESS VALUE
+ 0029 01 MISSING OBSERVED VALUE
+ 0030 01 MISSING VERTICAL COORDINATE
+033237 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033238 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033239 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033240 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033243 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033244 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033245 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 LAYER FORMED BY SUMMING UP
+ 0029 01 LAYER FORMED BY THINNING UP
+ 0030 01 NOT PREDEFINED LAYER
+033246 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033247 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033248 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 NOT DEFINED
+ 0025 01 NOT DEFINED
+ 0026 01 NOT DEFINED
+ 0027 01 NOT DEFINED
+ 0028 01 NOT DEFINED
+ 0029 01 NOT DEFINED
+ 0030 01 NOT DEFINED
+033249 0030 0001 01 NOT DEFINED
+ 0002 01 NOT DEFINED
+ 0003 01 NOT DEFINED
+ 0004 01 NOT DEFINED
+ 0005 01 NOT DEFINED
+ 0006 01 NOT DEFINED
+ 0007 01 NOT DEFINED
+ 0008 01 NOT DEFINED
+ 0009 01 NOT DEFINED
+ 0010 01 NOT DEFINED
+ 0011 01 NOT DEFINED
+ 0012 01 NOT DEFINED
+ 0013 01 NOT DEFINED
+ 0014 01 NOT DEFINED
+ 0015 01 NOT DEFINED
+ 0016 01 NOT DEFINED
+ 0017 01 NOT DEFINED
+ 0018 01 NOT DEFINED
+ 0019 01 NOT DEFINED
+ 0020 01 NOT DEFINED
+ 0021 01 NOT DEFINED
+ 0022 01 NOT DEFINED
+ 0023 01 NOT DEFINED
+ 0024 01 BLACKLISTED DUE TO FIRST GUESS DEPARTURE
+ 0025 01 BLACKLISTED DUE TO OBSERVED VALUE
+ 0026 01 BLACKLISTED DUE TO TYPE OF VERTICAL COORDINATE
+ 0027 01 BLACKLISTED DUE TO DISTANCE FROM REFERENCE POINT
+ 0028 01 BLACKLISTED DUE TO PRESSURE CODE
+ 0029 01 VARIABLE BLACKLISTED
+ 0030 01 PRESSURE BLACKLISTED
+033252 0010 0000 01 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+ 0001 01 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND PASSED
+ 0002 01 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND DELETED
+ 0003 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+ 0004 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND FAILED
+ 0005 01 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND RE-INSERTED
+ 0006 01 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND NOT MANUALLY CHECCKED
+ 0007 02 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE
+ AND MANUALLY CHECKED AND FAILED
+ 0008 01 MANUALLY CHECKED AND FAILED
+ 0015 01 MISSING VALUE
+
+033254 0019 0001 01 U DEPARTURE FROM GUESS
+ 0002 01 V DEPARTURE FROM GUESS
+ 0003 01 U & V DEPARTURE FROM GUESS
+ 0004 01 U ACCELERATION
+ 0005 01 V ACCELERATION
+ 0006 01 U & V ACCELERATION
+ 0007 01 POSSIBLE LAND FEATURE
+ 0008 01 U ACCELERATION AND POSSIBLE LAND FEATURE
+ 0009 01 V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0010 01 U & V ACCELERATION AND POSSIBLE LAND FEATURE
+ 0011 01 BAD WIND GUESS
+ 0012 01 CORRELATION FAILURE
+ 0013 01 SEARCH BOX OFF EDGE OF AREA
+ 0014 01 TARGET BOX OFF EDGE OF AREA
+ 0015 01 PIXEL BRIGHTNESS OUT OF BOUNDS (NOISY LINE)
+ 0016 01 TARGET OUTSIDE OF LAT/LONG BOX
+ 0017 01 TARGET OUTSIDE OF PRESSURE MIN/MAX
+ 0018 01 AUTOEDITOR FLAGGED SLOW VECTOR
+ 0019 01 AUTOEDITOR FLAGGED VECTORS
+035000 0011 0011 01 000-099 INTERNATIONAL FM CODES
+ 0001 01 100-199 RA I CODES
+ 0002 01 200-299 RA II CODES
+ 0003 01 300-399 RA III CODES
+ 0004 01 400-499 RA IV CODES
+ 0005 01 500-599 RA V CODES
+ 0006 01 600-699 RA VI CODES
+ 0007 01 700-799 ANTARCTIC CODES
+ 0008 01 800-999 RESERVED
+ 0009 01 1000-1022 NOT USED
+ 1023 01 MISSING VALUE
+035001 0004 0000 01 REAL TIME
+ 0001 01 NEAR-REAL TIME
+ 0002 01 NON-REAL TIME
+ 0007 01 MISSING VALUE
+035030 0010 0000 01 NO DISCREPANCIES
+ 0001 02 NON-COMPLIANCE WITH STANDARD AND RECOMMENDED PRACTICES
+ AND PROCEDURES INCLUDINGTHOSE OF MONITORING
+ 0002 01 CATALOGUES OF METEOROLOGICAL BULLETINS NOT UPDATED IN A TIMELY MANNER
+ 0003 01 INCORRECT ROUTEING DIRECTORIES
+ 0004 01 LACK OF FLEXIBILITY IN THE ROUTEING ARRANGEMENTS
+ 0005 01 DEFICIENCIES IN THE OPERATION OF GTS CENTRES AND CIRCUITS
+ 0006 01 LOSS OF DATA OR DELAYS IN RELAYING DATA ON THE GTS
+ 0007 01 ROUTEING OF DATA DIFFERENT FROM THE ROUTEING PROVIDED IN THE PLAN
+ 0008 01 VARIOUS MALPRACTICES
+ 0015 01 MISSING VALUE
+035031 0020 0001 01 SUFFICIENT AND ALL OF ACCEPTABLE QUALITY
+ 0002 01 SUFFICIENT BUT PARTLY OF ACCEPTABLE QUALITY
+ 0003 01 INSUFFICIENT BUT ALL OF ACCEPTABLE QUALITY
+ 0004 01 INSUFFICIENT AND OF UNACCEPTABLE QUALITY
+ 0005 01 SOME MESSAGES NOT COMPLETE
+ 0006 01 SUSPECT OR WRONGLY CODED GROUPS COULD NOT BE INTERPRETED CONFIDENTLY
+ 0007 01 GROSS CODING ERRORS
+ 0008 01 TRANSMISSION SEQUENTIAL ORDER NOT OBSERVED
+ 0009 01 REPORT COMPLETELY GARBLED AND THUS DISCARDED
+ 0010 01 DEFICIENCIES IDENTIFIED AND RECTIFIED
+ 0011 01 DEFICIENCIES IDENTIFIED BUT NOT RECTIFIED
+ 0012 01 DEFICIENCIES NOT IDENTIFIED
+ 0013 01 MEASURING ERRORS
+ 0014 01 MUTUAL INCONSISTENCY
+ 0015 01 TEMPORAL INCONSISTENCY
+ 0016 01 FORECAST ERROR
+ 0017 01 BIAS
+ 0018 01 IMPROVE SYSTEM OF QUALITY CONTROL
+ 0019 01 EXPAND TRAINING PROGRAMMES
+ 0123 01 MISSING VALUE
+035032 0010 0001 01 DATA GROUPS MISSING DUE TO RADIO FADING
+ 0002 01 DATA GROUPS MISSING DUE TO OUTAGE OF CENTRE
+ 0003 01 DATA GROUPS MISSING DUE TO OUTAGE OF CIRCUIT
+ 0004 01 NON-IMPLEMENTATION OR MAINTENANCE OF REQUIRED RBSN DENSITY
+ 0005 01 SHORTAGE OF QUALIFIED STAFF TO MAN STATIONS
+ 0006 01 LACK OF CONSUMABLES
+ 0007 01 INSTRUMENT FAILURE
+ 0008 01 NON-ADHERENCE TO TELECOMMUNICATION PROCEDURES
+ 0009 01 SOME OBSERVING PROGRAMMES CEASED
+ 0015 01 MISSING VALUE
+035033 0012 0001 01 NO DEFICIENCY
+ 0002 01 OBSERVATIONS NOT MADE REGULARLY
+ 0003 01 OBSERVATIONS NOT MADE AT RIGHT TIME
+ 0004 01 OBSERVATIONS MADE BUT NOT DISSEMINATED
+ 0005 01 OBSERVATIONS MADE AND SENT TO INCORRECT USERS
+ 0006 01 COLLECTION NOT RECEIVED
+ 0007 01 COLLECTION TRANSMITTED LATE
+ 0008 01 COLLECTION NOT TRANSMITTED
+ 0009 01 DIFFICULTIES IN HF PROPAGATION AND SELECTION OF SUITABLE FREQUENCY
+ 0010 01 DIFFICULTIES IN MAINTENANCE OF COMMUNICATION EQUIPMENT AT REMOTE STATIONS
+ 0011 01 NO ALTERNATIVE ARRANGEMENT FOR ROUTEING METEOROLOGICAL OBSERVATION
+ 0123 01 MISSING VALUE
+035034 0007 0001 01 SLIGHT IMPROVEMENT
+ 0002 01 SIGNIFICANT IMPROVEMENT
+ 0003 01 MOST SIGNIFICANT IMPROVEMENT
+ 0004 01 STEADY
+ 0005 01 DECREASING
+ 0006 01 EFFORTS REQUIRED TO IMPROVE NIGHT-TIME OBSERVATIONS
+ 0007 01 MISSING VALUE
+035035 0016 0000 01 RESERVED
+ 0001 01 BALLOON BURST
+ 0002 01 BALLOON FORCED DOWN BY ICING
+ 0003 01 LEAKING OR FLOATING BALLOON
+ 0004 01 WEAK OR FADING SIGNAL
+ 0005 01 BATTERY FAILURE
+ 0006 01 GROUND EQUIPMENT FAILURE
+ 0007 01 SIGNAL INTERFERENCE
+ 0008 01 RADIOSONDE FAILURE
+ 0009 01 EXCESSIVE MISSING DATA FRAMES
+ 0010 01 RESERVED
+ 0011 01 EXCESSIVE MISSING TEMPERATURE
+ 0012 01 EXCESSIVE MISSING PRESSURE
+ 0013 01 USER TERMINATED
+ 0030 01 OTHER
+ 0031 01 MISSING VALUE
+040011 0004 0001 01 MEAN SEA SURFACE (MSS) INTERPOLATION FLAG
+ 0002 01 OCEAN TIDE SOLUTION 1 INTERPOLATION FLAG (0= 4 POINTS OVER OCEAN, 1=LESS THAN 4 POINTS)
+ 0003 01 OCEAN TIDE SOLUTION 2 INTERPOLATION FLAG (0= 4 POINTS OVER OCEAN, 1=LESS THAN 4 POINTS)
+ 0004 01 METEOROLOGICAL DATA INTERPOLATION FLAG (0= 4 POINTS OVER OCEAN, 1=LESS THAN 4 POINTS)
+040012 0003 0001 01 18.7 GHZ BRIGHTNESS TEMPERATURE
+ 0002 01 23.8 GHZ BRIGHTNESS TEMPERATURE
+ 0003 01 34 GHZ BRIGHTNESS TEMPERATURE
+040013 0005 0000 01 INTERPOLATION WITH NO GAP BETWEEN JMR DATA
+ 0001 01 INTERPOLATION WITH GAP BETWEEN JMR DATA
+ 0002 01 EXTRAOLATION OF JMR DATA
+ 0003 01 FAILURE OF EXTRAPOLATION AND INTERPOLATION
+ 0007 01 MISSING VALUE
+040203 0012 0001 01 WARM LOAD IS CHANGING TOO RAPIDLY
+ 0002 01 COLD LOAD MOON CONTAMINATION PRESENT IN SCAN FOR 6.8 GHz CHANNEL
+ 0003 01 COLD LOAD MOON CONTAMINATION PRESENT IN SCAN FOR 10.7 GHz CHANNEL
+ 0004 01 COLD LOAD MOON CONTAMINATION PRESENT IN SCAN FOR 18.7 GHz CHANNEL
+ 0005 01 COLD LOAD MOON CONTAMINATION PRESENT IN SCAN FOR 23.8 GHz CHANNEL
+ 0006 01 COLD LOAD MOON CONTAMINATION PRESENT IN SCAN FOR 37.0 GHz CHANNEL
+ 0007 01 WARM LOAD PRESENCE OF TERMAL GRADIENT IN SCAN FOR 6.8 GHz CHANNEL
+ 0008 01 WARM LOAD PRESENCE OF TERMAL GRADIENT IN SCAN FOR 10.7 GHz CHANNEL
+ 0009 01 WARM LOAD PRESENCE OF TERMAL GRADIENT IN SCAN FOR 18.7 GHz CHANNEL
+ 0010 01 WARM LOAD PRESENCE OF TERMAL GRADIENT IN SCAN FOR 23.8 GHz CHANNEL
+ 0011 01 WARM LOAD PRESENCE OF TERMAL GRADIENT IN SCAN FOR 37.0 GHz CHANNEL
+ 0012 01 ALL MISSING VALUE
+049194 0014 0001 01 PASSED QUALITY CONTROL
+ 0002 01 OUTSIDE TIME WINDOW
+ 0003 01 ABOVE LAND
+ 0004 01 OUTSIDE ENTIRE GRID
+ 0005 01 WAVE HEIGHT OUT OF RANGE
+ 0006 01 TOO HIGH ALONG TRACK JUMP
+ 0007 01 TOO SHORT ALONG TRACK JUMP
+ 0008 01 TOO HIGH ALONG TRACK VARIANCE
+ 0009 01 OUTSIDE CONFIDENCE LIMIT
+ 0010 01 DOUBLE OBSERVATION
+ 0011 01 PEAKINESS ABOVE THRESHOLD
+ 0012 01 RESERVED
+ 0013 01 RESERVED
+ 0014 01 RESERVED
+049193 0014 0001 01 EXELLENT (COST LESS THAN 0.1)
+ 0002 01 GOOD (COST LESS THAN 0.5)
+ 0003 01 QUESTIONABLE (COST LARGER THAN 0.5)
+ 0004 01 RESULTS UNTABLE
+ 0005 01 OBSERVED SAR SPECTRUM REJECTED
+ 0006 01 WAM FIRST GUESS REJECTED
+ 0007 01 SIMULATED SAR REJECTED
+ 0008 01 NO AZIMUTH CUT-OFF ADJUSTMENT
+ 0009 01 RESERVED
+ 0010 01 RESERVED
+ 0011 01 RESERVED
+ 0012 01 RESERVED
+ 0013 01 RESERVED
+ 0014 01 RESERVED
diff --git a/bufrtables/D0000000000000014000.TXT b/bufrtables/D0000000000000014000.TXT
new file mode 100755
index 0000000..3f9467d
--- /dev/null
+++ b/bufrtables/D0000000000000014000.TXT
@@ -0,0 +1,4859 @@
+ 300002 2 000002
+ 000003
+ 300003 3 000010
+ 000011
+ 000012
+ 300004 9 300003
+ 000013
+ 000014
+ 000015
+ 000016
+ 000017
+ 000018
+ 000019
+ 000020
+ 300010 4 300003
+ 101000
+ 031001
+ 000030
+ 301001 2 001001
+ 001002
+ 301002 3 001003
+ 001004
+ 001005
+ 301003 3 001011
+ 001012
+ 001013
+ 301004 4 001001
+ 001002
+ 001015
+ 002001
+ 301005 2 001035
+ 001034
+ 301011 3 004001
+ 004002
+ 004003
+ 301012 2 004004
+ 004005
+ 301013 3 004004
+ 004005
+ 004006
+ 301014 3 102002
+ 301011
+ 301012
+ 301021 2 005001
+ 006001
+ 301022 3 005001
+ 006001
+ 007001
+ 301023 2 005002
+ 006002
+ 301024 3 005002
+ 006002
+ 007001
+ 301025 3 301023
+ 004003
+ 301012
+ 301026 7 301021
+ 004003
+ 004003
+ 004004
+ 004004
+ 004005
+ 004005
+ 301027 5 008007
+ 101000
+ 031001
+ 301028
+ 008007
+ 301028 8 008040
+ 033042
+ 007010
+ 101000
+ 031002
+ 301023
+ 019007
+ 008040
+ 301031 5 301001
+ 002001
+ 301011
+ 301012
+ 301022
+ 301032 5 301001
+ 002001
+ 301011
+ 301012
+ 301024
+ 301033 5 001005
+ 002001
+ 301011
+ 301012
+ 301021
+ 301034 5 001005
+ 002001
+ 301011
+ 301012
+ 301023
+ 301035 7 001005
+ 001012
+ 001013
+ 002001
+ 301011
+ 301012
+ 301023
+ 301036 5 301003
+ 002001
+ 301011
+ 301012
+ 301023
+ 301037 6 301001
+ 002011
+ 002012
+ 301011
+ 301012
+ 301022
+ 301038 6 301001
+ 002011
+ 002012
+ 301011
+ 301012
+ 301024
+ 301039 6 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 301040 6 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301024
+ 301041 5 001007
+ 002021
+ 002022
+ 301011
+ 301012
+ 301042 2 301041
+ 301021
+ 301043 5 001007
+ 002023
+ 301011
+ 301013
+ 301021
+ 301044 5 001007
+ 002024
+ 301011
+ 301013
+ 301021
+ 301045 9 301011
+ 301012
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 304030
+ 304031
+ 301046 10 001007
+ 001012
+ 002048
+ 021119
+ 025060
+ 202124
+ 002026
+ 002027
+ 202000
+ 005040
+ 301047 15 001007
+ 025060
+ 001033
+ 001034
+ 001012
+ 301045
+ 002021
+ 301011
+ 301012
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 301023
+ 301048 14 002104
+ 002121
+ 002113
+ 002026
+ 002027
+ 002111
+ 002140
+ 202127
+ 001013
+ 202126
+ 007001
+ 202000
+ 025010
+ 021064
+ 301049 5 002111
+ 002112
+ 021062
+ 021063
+ 021065
+ 301051 6 001006
+ 002061
+ 301011
+ 301012
+ 301021
+ 008004
+ 301055 7 001005
+ 002001
+ 301011
+ 301012
+ 301021
+ 001012
+ 001014
+ 301062 3 101000
+ 031001
+ 301001
+ 301065 8 001006
+ 001008
+ 002001
+ 002002
+ 002005
+ 002062
+ 002070
+ 002065
+ 301066 6 301011
+ 301013
+ 301023
+ 007004
+ 002064
+ 008004
+ 301070 3 002143
+ 002142
+ 002144
+ 301071 5 001007
+ 001031
+ 002020
+ 002028
+ 002029
+ 301072 4 301071
+ 301011
+ 301013
+ 301021
+ 301074 4 002143
+ 002142
+ 002145
+ 002146
+ 301075 6 301001
+ 001015
+ 301024
+ 008021
+ 301011
+ 301012
+ 301076 3 002011
+ 002143
+ 002142
+ 301090 6 301004
+ 301011
+ 301012
+ 301021
+ 007030
+ 007031
+ 301091 10 002180
+ 002181
+ 002182
+ 002183
+ 002184
+ 002179
+ 002186
+ 002187
+ 002188
+ 002189
+ 301092 9 001011
+ 001003
+ 002001
+ 301011
+ 301012
+ 301021
+ 007030
+ 007031
+ 033024
+ 301093 3 301036
+ 007030
+ 007031
+ 301110 5 301001
+ 001011
+ 002011
+ 002014
+ 002003
+ 301111 6 301001
+ 001011
+ 002011
+ 002013
+ 002014
+ 002003
+ 301112 5 001006
+ 002011
+ 002013
+ 002014
+ 002003
+ 301113 3 008021
+ 301011
+ 301013
+ 301114 5 301021
+ 007030
+ 007031
+ 007007
+ 033024
+ 301120 4 301001
+ 001094
+ 002011
+ 301121
+ 301121 5 008041
+ 301122
+ 301021
+ 007031
+ 007007
+ 301122 7 301011
+ 301012
+ 201135
+ 202130
+ 004006
+ 202000
+ 201000
+ 301123 33 102002
+ 008041
+ 001062
+ 301001
+ 001094
+ 002011
+ 001018
+ 001095
+ 025061
+ 025068
+ 001082
+ 001083
+ 001081
+ 002067
+ 002066
+ 002014
+ 025067
+ 025065
+ 025066
+ 002095
+ 002096
+ 002097
+ 002016
+ 002083
+ 002080
+ 002081
+ 001093
+ 002084
+ 002085
+ 002086
+ 002082
+ 008041
+ 301011
+ 301125 6 001033
+ 001034
+ 025060
+ 001007
+ 002019
+ 001012
+ 301193 5 001007
+ 001031
+ 002196
+ 002221
+ 002222
+ 301194 9 001194
+ 001012
+ 001013
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301195 9 001195
+ 001012
+ 001013
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301196 7 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301197 9 001006
+ 001008
+ 002061
+ 002062
+ 002002
+ 002005
+ 002070
+ 002063
+ 002001
+ 301198 9 001011
+ 001012
+ 001013
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301200 2 001032
+ 033194
+ 301201 2 101003
+ 033193
+ 301202 2 001031
+ 001032
+ 301237 12 001007
+ 001012
+ 002021
+ 301011
+ 004004
+ 004005
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 301023
+ 301238 14 002104
+ 002121
+ 002113
+ 002026
+ 002027
+ 002111
+ 002192
+ 202127
+ 001013
+ 202126
+ 007001
+ 202000
+ 025010
+ 021194
+ 301239 5 002111
+ 002112
+ 021192
+ 021193
+ 021195
+ 301240 5 201131
+ 202129
+ 022021
+ 201000
+ 202000
+ 301241 5 201141
+ 202130
+ 007001
+ 201000
+ 202000
+ 301242 6 021207
+ 021208
+ 021209
+ 021210
+ 021211
+ 021212
+ 301250 4 301193
+ 301011
+ 301013
+ 301021
+ 302001 4 010004
+ 010051
+ 010061
+ 010063
+ 302002 5 010004
+ 007004
+ 010003
+ 010061
+ 010063
+ 302003 9 011011
+ 011012
+ 012004
+ 012006
+ 013003
+ 020001
+ 020003
+ 020004
+ 020005
+ 302004 7 020010
+ 008002
+ 020011
+ 020013
+ 020012
+ 020012
+ 020012
+ 302005 4 008002
+ 020011
+ 020012
+ 020013
+ 302006 4 010004
+ 010051
+ 010062
+ 010063
+ 302011 3 302001
+ 302003
+ 302004
+ 302012 3 302002
+ 302003
+ 302004
+ 302013 5 302006
+ 302003
+ 101000
+ 031001
+ 302005
+ 302021 3 022001
+ 022011
+ 022021
+ 302022 3 022002
+ 022012
+ 022022
+ 302023 3 022003
+ 022013
+ 022023
+ 302024 3 302022
+ 101002
+ 302023
+ 302031 4 302001
+ 010062
+ 007004
+ 010009
+ 302032 4 007032
+ 012101
+ 012103
+ 013003
+ 302033 2 007032
+ 020001
+ 302034 2 007032
+ 013023
+ 302035 8 302032
+ 302033
+ 302034
+ 007032
+ 302004
+ 101000
+ 031001
+ 302005
+ 302036 7 105000
+ 031001
+ 008002
+ 020011
+ 020012
+ 020014
+ 020017
+ 302037 3 020062
+ 013013
+ 012113
+ 302038 4 020003
+ 004024
+ 020004
+ 020005
+ 302039 2 004024
+ 014031
+ 302040 4 007032
+ 102002
+ 004024
+ 013011
+ 302041 7 007032
+ 004024
+ 004024
+ 012111
+ 004024
+ 004024
+ 012112
+ 302042 11 007032
+ 002002
+ 008021
+ 004025
+ 011001
+ 011002
+ 008021
+ 103002
+ 004025
+ 011043
+ 011041
+ 302043 7 302038
+ 101002
+ 302039
+ 302040
+ 302041
+ 302042
+ 007032
+ 302044 3 004024
+ 002004
+ 013033
+ 302045 7 004024
+ 014002
+ 014004
+ 014016
+ 014028
+ 014029
+ 014030
+ 302046 3 004024
+ 004024
+ 012049
+ 302047 3 102003
+ 008002
+ 020054
+ 302048 5 005021
+ 007021
+ 020012
+ 005021
+ 007021
+ 302049 7 008002
+ 020011
+ 020013
+ 020012
+ 020012
+ 020012
+ 008002
+ 302050 31 008041
+ 005021
+ 007005
+ 202130
+ 006021
+ 202000
+ 008041
+ 201131
+ 202129
+ 002115
+ 010004
+ 002115
+ 013003
+ 202000
+ 201000
+ 002115
+ 011001
+ 011002
+ 002115
+ 102002
+ 012101
+ 004024
+ 002115
+ 012103
+ 012102
+ 101003
+ 020012
+ 020011
+ 020013
+ 101002
+ 020003
+ 302051 12 010004
+ 010051
+ 007004
+ 010003
+ 012004
+ 012051
+ 012016
+ 012017
+ 013004
+ 102004
+ 008051
+ 008020
+ 302052 7 007032
+ 007033
+ 012101
+ 002039
+ 012102
+ 012103
+ 013003
+ 302053 3 007032
+ 007033
+ 020001
+ 302054 9 302052
+ 302053
+ 007033
+ 302034
+ 007032
+ 302004
+ 101000
+ 031001
+ 302005
+ 302055 8 020031
+ 020032
+ 020033
+ 020034
+ 020035
+ 020036
+ 020037
+ 020038
+ 302056 4 002038
+ 007063
+ 022043
+ 007063
+ 302057 3 302056
+ 302021
+ 302024
+ 302058 8 007032
+ 007033
+ 004024
+ 004024
+ 012111
+ 004024
+ 004024
+ 012112
+ 302059 12 007032
+ 007033
+ 002002
+ 008021
+ 004025
+ 011001
+ 011002
+ 008021
+ 103002
+ 004025
+ 011043
+ 011041
+ 302060 4 302038
+ 302040
+ 302058
+ 302059
+ 302062 24 302001
+ 302052
+ 302053
+ 007033
+ 101000
+ 031000
+ 302034
+ 007032
+ 101000
+ 031001
+ 302005
+ 008002
+ 101000
+ 031000
+ 302055
+ 101000
+ 031000
+ 302056
+ 101000
+ 031000
+ 302021
+ 101000
+ 031000
+ 302024
+ 302063 8 302038
+ 101000
+ 031000
+ 302040
+ 101000
+ 031000
+ 302058
+ 302059
+ 302066 16 020023
+ 020024
+ 020027
+ 020054
+ 020023
+ 020027
+ 020054
+ 020025
+ 020026
+ 020027
+ 020040
+ 020066
+ 020027
+ 020021
+ 020067
+ 020027
+ 302069 4 007032
+ 007033
+ 033041
+ 020001
+ 302070 8 007032
+ 007033
+ 011001
+ 011002
+ 011043
+ 011041
+ 011016
+ 011017
+ 302071 14 007032
+ 007033
+ 008021
+ 004025
+ 011001
+ 011002
+ 008021
+ 103002
+ 004025
+ 011043
+ 011041
+ 004025
+ 011016
+ 011017
+ 302072 5 007032
+ 007033
+ 012101
+ 012103
+ 013003
+ 302073 7 020010
+ 105004
+ 008002
+ 020011
+ 020012
+ 033041
+ 020013
+ 302074 4 020003
+ 004025
+ 020004
+ 020005
+ 302075 5 008021
+ 004025
+ 013055
+ 013058
+ 008021
+ 302076 7 020021
+ 020022
+ 026020
+ 020023
+ 020024
+ 020025
+ 020026
+ 302077 8 007032
+ 007033
+ 004025
+ 012111
+ 012112
+ 007032
+ 004025
+ 012112
+ 302078 4 002176
+ 020062
+ 002177
+ 013013
+ 302079 5 007032
+ 002175
+ 002178
+ 004025
+ 013011
+ 302080 3 002185
+ 004025
+ 013033
+ 302081 2 004025
+ 014031
+ 302082 7 004025
+ 014002
+ 014004
+ 014016
+ 014028
+ 014029
+ 014030
+ 302083 8 004025
+ 008023
+ 010004
+ 011001
+ 011002
+ 012101
+ 013003
+ 008023
+ 302205 5 201131
+ 202129
+ 022021
+ 201000
+ 202000
+ 302206 9 302205
+ 201130
+ 202129
+ 022011
+ 201000
+ 202000
+ 022001
+ 011001
+ 011002
+ 302207 5 022193
+ 022194
+ 022195
+ 022196
+ 022197
+ 302250 5 102000
+ 031001
+ 020193
+ 020194
+ 020012
+ 303001 3 007003
+ 011001
+ 011002
+ 303002 3 007004
+ 011001
+ 011002
+ 303003 4 007004
+ 010003
+ 012001
+ 012003
+ 303004 6 007004
+ 010003
+ 012001
+ 012003
+ 011001
+ 011002
+ 303011 4 007003
+ 008001
+ 011001
+ 011002
+ 303012 4 007004
+ 008001
+ 011001
+ 011002
+ 303013 7 007004
+ 008001
+ 010003
+ 012001
+ 013003
+ 011001
+ 011002
+ 303014 7 007004
+ 008001
+ 010003
+ 012001
+ 012003
+ 011001
+ 011002
+ 303021 4 007004
+ 007004
+ 204007
+ 031021
+ 303022 3 303021
+ 010003
+ 204000
+ 303023 3 303021
+ 012001
+ 204000
+ 303024 3 303021
+ 013016
+ 204000
+ 303025 5 002025
+ 204007
+ 031021
+ 012063
+ 204000
+ 303026 6 007004
+ 008003
+ 204007
+ 031021
+ 012001
+ 204000
+ 303027 5 007004
+ 204007
+ 031021
+ 010003
+ 204000
+ 303031 6 007004
+ 008003
+ 007021
+ 007022
+ 008012
+ 012061
+ 303032 2 020011
+ 020016
+ 303033 2 020010
+ 020016
+ 303040 18 008041
+ 004025
+ 004026
+ 301021
+ 301122
+ 201131
+ 202129
+ 025069
+ 007004
+ 013003
+ 202000
+ 201000
+ 002013
+ 012101
+ 010009
+ 102002
+ 008040
+ 035035
+ 303041 8 002152
+ 002023
+ 007004
+ 011001
+ 011002
+ 002153
+ 002154
+ 012071
+ 303050 7 004086
+ 008042
+ 007004
+ 005015
+ 006015
+ 011001
+ 011002
+ 303051 7 004086
+ 008042
+ 007004
+ 005015
+ 006015
+ 011061
+ 011062
+ 303052 7 004086
+ 008042
+ 007009
+ 005015
+ 006015
+ 011001
+ 011002
+ 303053 7 004086
+ 008042
+ 007009
+ 005015
+ 006015
+ 011061
+ 011062
+ 303054 10 004086
+ 008042
+ 007004
+ 010009
+ 005015
+ 006015
+ 012101
+ 012103
+ 011001
+ 011002
+ 303249 7 002252
+ 104000
+ 031001
+ 002199
+ 007004
+ 007004
+ 013003
+ 303250 8 002252
+ 002023
+ 007004
+ 011001
+ 011002
+ 002197
+ 002198
+ 012193
+ 303251 8 002252
+ 105000
+ 031001
+ 002254
+ 002251
+ 002197
+ 002198
+ 012063
+ 303252 8 002252
+ 105000
+ 031001
+ 002254
+ 002251
+ 002197
+ 002198
+ 012194
+ 304001 5 008003
+ 010004
+ 012001
+ 011001
+ 011002
+ 304002 4 008003
+ 010004
+ 011001
+ 011002
+ 304003 2 008003
+ 012001
+ 304004 4 008003
+ 010004
+ 020010
+ 012001
+ 304005 4 002024
+ 007004
+ 007004
+ 013003
+ 304006 3 014001
+ 014001
+ 014003
+ 304011 27 002163
+ 002164
+ 008012
+ 007024
+ 002057
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 008021
+ 004024
+ 110004
+ 008021
+ 004004
+ 004005
+ 004006
+ 008021
+ 004004
+ 004005
+ 004006
+ 011001
+ 011002
+ 103010
+ 002163
+ 007004
+ 012001
+ 304030 3 027031
+ 028031
+ 010031
+ 304031 3 001041
+ 001042
+ 001043
+ 304032 5 002153
+ 002154
+ 020081
+ 020082
+ 020012
+ 304033 8 002152
+ 002166
+ 002167
+ 002153
+ 002154
+ 012075
+ 012076
+ 012063
+ 304034 9 102004
+ 027001
+ 028001
+ 007022
+ 005043
+ 020010
+ 020016
+ 033003
+ 010040
+ 304035 15 002153
+ 002154
+ 012063
+ 008001
+ 012063
+ 008001
+ 012063
+ 008001
+ 008003
+ 012063
+ 008003
+ 012063
+ 008003
+ 012063
+ 008003
+ 304036 12 020082
+ 008012
+ 020082
+ 008012
+ 020081
+ 008003
+ 020081
+ 008003
+ 020081
+ 008003
+ 020081
+ 008003
+ 304228 3 005217
+ 006217
+ 007217
+ 304229 3 001208
+ 001209
+ 001210
+ 304250 27 002231
+ 002232
+ 008012
+ 007024
+ 002057
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 008021
+ 004024
+ 110004
+ 008021
+ 004004
+ 004005
+ 004006
+ 008021
+ 004004
+ 004005
+ 004006
+ 011001
+ 011002
+ 103010
+ 002231
+ 007004
+ 012001
+ 305003 5 301012
+ 004065
+ 101000
+ 031001
+ 305001
+ 305006 6 013072
+ 013082
+ 013019
+ 012001
+ 013073
+ 013060
+ 305007 6 301029
+ 301012
+ 004065
+ 101000
+ 031001
+ 305006
+ 305008 2 305006
+ 012030
+ 305009 6 301029
+ 301012
+ 004065
+ 101000
+ 031001
+ 305008
+ 305011 6 301029
+ 301012
+ 004065
+ 101000
+ 031001
+ 305010
+ 305018 8 301029
+ 301012
+ 004065
+ 103000
+ 031001
+ 305008
+ 305016
+ 305017
+ 306001 5 002032
+ 102000
+ 031001
+ 007062
+ 022042
+ 306002 3 002031
+ 022004
+ 022031
+ 306003 4 002002
+ 011011
+ 011012
+ 012004
+ 306004 7 002032
+ 002033
+ 103000
+ 031001
+ 007062
+ 022043
+ 022062
+ 306005 6 002031
+ 103000
+ 031001
+ 007062
+ 022004
+ 022031
+ 306006 3 306003
+ 306002
+ 022063
+ 306007 6 001012
+ 001014
+ 306008
+ 004024
+ 027003
+ 028003
+ 306008 3 002034
+ 002035
+ 002036
+ 306019 8 001075
+ 301011
+ 301012
+ 022042
+ 022120
+ 022121
+ 004015
+ 004065
+ 306020 4 306024
+ 102006
+ 022038
+ 022039
+ 306021 7 001075
+ 301011
+ 301012
+ 022122
+ 022123
+ 012001
+ 303002
+ 306022 5 001075
+ 301011
+ 301012
+ 022038
+ 022039
+ 306023 8 001015
+ 301023
+ 301011
+ 301012
+ 022038
+ 022039
+ 022120
+ 022121
+ 306024 8 001075
+ 301011
+ 301012
+ 022042
+ 022120
+ 022121
+ 004025
+ 004015
+ 306025 4 306019
+ 102006
+ 022038
+ 022039
+ 307001 2 301031
+ 302011
+ 307002 2 301032
+ 302011
+ 307003 4 307001
+ 101000
+ 031001
+ 302005
+ 307004 4 307002
+ 101000
+ 031001
+ 302005
+ 307005 3 307001
+ 101004
+ 302005
+ 307006 3 307002
+ 101004
+ 302005
+ 307007 2 301031
+ 302012
+ 307008 2 301032
+ 302012
+ 307009 2 301031
+ 302013
+ 307011 16 001063
+ 002001
+ 301011
+ 301012
+ 301024
+ 007006
+ 011001
+ 011016
+ 011017
+ 011002
+ 011041
+ 007006
+ 012001
+ 012003
+ 010052
+ 020009
+ 307012 5 103000
+ 031001
+ 008023
+ 005021
+ 020001
+ 307013 8 106000
+ 031001
+ 001064
+ 008014
+ 020061
+ 008014
+ 020061
+ 020018
+ 307014 3 101000
+ 031001
+ 020019
+ 307015 4 101000
+ 031001
+ 302005
+ 020002
+ 307016 3 101000
+ 031001
+ 020020
+ 307017 3 101000
+ 031001
+ 011070
+ 307018 16 008016
+ 102000
+ 031001
+ 008017
+ 301012
+ 104000
+ 031001
+ 007006
+ 011001
+ 011002
+ 011041
+ 020009
+ 101000
+ 031001
+ 020001
+ 307014
+ 307020 3 307011
+ 307014
+ 307016
+ 307021 9 307011
+ 307012
+ 307013
+ 307014
+ 307015
+ 307016
+ 307017
+ 307018
+ 307015
+ 307022 31 001015
+ 301011
+ 301012
+ 301022
+ 008021
+ 004025
+ 010004
+ 012001
+ 013003
+ 033038
+ 008022
+ 106025
+ 002020
+ 001050
+ 005021
+ 007021
+ 015031
+ 015032
+ 008060
+ 015033
+ 015034
+ 008060
+ 015033
+ 015034
+ 015035
+ 201131
+ 202129
+ 013016
+ 202000
+ 201000
+ 015011
+ 307030 2 015001
+ 015002
+ 307031 7 008022
+ 008023
+ 015001
+ 008023
+ 015001
+ 008023
+ 015002
+ 307041 7 301001
+ 001015
+ 301022
+ 301011
+ 301012
+ 301070
+ 307030
+ 307042 9 301001
+ 001015
+ 301022
+ 301011
+ 301012
+ 008021
+ 004025
+ 301070
+ 307031
+ 307043 7 301001
+ 001015
+ 301024
+ 301011
+ 301012
+ 301074
+ 307030
+ 307045 25 001063
+ 008079
+ 002001
+ 301011
+ 301012
+ 301024
+ 007032
+ 011001
+ 011016
+ 011017
+ 008054
+ 011083
+ 011084
+ 011002
+ 008054
+ 011085
+ 011086
+ 011041
+ 008054
+ 007032
+ 012023
+ 012024
+ 007032
+ 010052
+ 020009
+ 307046 5 020060 Metar/speci visibility
+ 102000
+ 031001
+ 005021
+ 020059
+ 307047 9 105000 Metar/speci clouds
+ 031001
+ 008002
+ 020011
+ 020012
+ 020013
+ 020092
+ 020002
+ 020091
+ 307048 25 008016
+ 102000
+ 031001
+ 008017
+ 301012
+ 112000
+ 031000
+ 007032
+ 011001
+ 008054
+ 011083
+ 011084
+ 011002
+ 008054
+ 011085
+ 011086
+ 011041
+ 008054
+ 007032
+ 020009
+ 101000
+ 031000
+ 020060
+ 307014
+ 307047
+ 307049 4 102000
+ 031000
+ 022043
+ 022021
+ 307050 14 101000
+ 031000
+ 020085
+ 102000
+ 031001
+ 001064
+ 020085
+ 105000
+ 031001
+ 001064
+ 020086
+ 020087
+ 020088
+ 020089
+ 307059 12 307045 Full METAR/SPECI
+ 307046
+ 307013
+ 307014
+ 307047
+ 307016
+ 307017
+ 307049
+ 307050
+ 101000
+ 031001
+ 307048 Trend forecast
+ 307052 12 001063
+ 008039
+ 301011
+ 301012
+ 008079
+ 008039
+ 301011 start of forecast
+ 301012
+ 008039
+ 301011 end of forecast
+ 301012
+ 301024
+ 307053 16 007032
+ 011001
+ 008054
+ 011083
+ 011084
+ 011002
+ 008054
+ 011085
+ 011086
+ 011041
+ 008054
+ 007032
+ 020009
+ 020060
+ 307014
+ 307047
+ 307054 13 007032
+ 008039
+ 004003
+ 004004
+ 008023
+ 012023
+ 008039
+ 004003
+ 004004
+ 008023
+ 012023
+ 008023
+ 007032
+ 307055 9 033045
+ 008016
+ 008039
+ 004003
+ 301012
+ 008039
+ 004003
+ 301012
+ 307053
+ 307056 6 307052 Aerodrome forecast
+ 307053
+ 307054
+ 101000
+ 031001
+ 307055
+ 307059 12 307045 Full METAR/SPECI
+ 307046
+ 307013
+ 307014
+ 307047
+ 307016
+ 307017
+ 307049
+ 307050
+ 101000
+ 031001
+ 307048 Trend forecast
+ 307060 2 007061
+ 012030
+ 307061 3 301031
+ 101005
+ 307060
+ 307062 3 301032
+ 101005
+ 307060
+ 307063 2 007061
+ 012130
+ 307071 67 301090
+ 004074
+ 004023
+ 008023
+ 010004
+ 010051
+ 007004
+ 010009
+ 007032
+ 012101
+ 002051
+ 004051
+ 012118
+ 004052
+ 012119
+ 013004
+ 008023
+ 012151
+ 007032
+ 102005
+ 008050
+ 008020
+ 014032
+ 014033
+ 008050
+ 008020
+ 102018
+ 008052
+ 008022
+ 007032
+ 008053
+ 004003
+ 012152
+ 008053
+ 004003
+ 012153
+ 008053
+ 004003
+ 008023
+ 012101
+ 008053
+ 004003
+ 008023
+ 012101
+ 008023
+ 007032
+ 002002
+ 008053
+ 004003
+ 011046
+ 008053
+ 004003
+ 004004
+ 004023
+ 007032
+ 013060
+ 013051
+ 004053
+ 008050
+ 008020
+ 102006
+ 008052
+ 008022
+ 008053
+ 004003
+ 013052
+ 007032
+ 307072 38 004001
+ 004001
+ 004002
+ 004003
+ 004004
+ 004074
+ 004022
+ 008023
+ 010004
+ 010051
+ 007004
+ 010009
+ 007032
+ 012101
+ 002051
+ 004051
+ 012118
+ 004052
+ 012119
+ 013004
+ 012151
+ 007032
+ 014032
+ 008023
+ 004001
+ 004001
+ 004002
+ 004003
+ 004004
+ 004022
+ 007032
+ 008023
+ 013060
+ 004053
+ 008023
+ 102008
+ 008050
+ 008020
+ 307073 2 307071
+ 307072
+ 307079 30 301090 SYNOP data and marine data from costal stations
+ 302031
+ 302035
+ 302036
+ 101000
+ 031000
+ 302047
+ 008002
+ 101000
+ 031000
+ 302048
+ 302037
+ 102000
+ 031000
+ 022061
+ 020058
+ 101000
+ 031000
+ 302056
+ 101000
+ 031000
+ 302055
+ 302043
+ 302044
+ 101000
+ 031001
+ 302045
+ 101000
+ 031000
+ 302046
+ 307080 13 301090 BUFR template for synoptic reports
+ 302031
+ 302035
+ 302036
+ 302047
+ 008002
+ 302048
+ 302037
+ 302043
+ 302044
+ 101002
+ 302045
+ 302046
+ 307081 24 301090 BUFR template for synoptic reports RA I
+ 302031
+ 302035
+ 302036
+ 302047
+ 008002
+ 302048
+ 302037
+ 012122
+ 013056
+ 013057
+ 020101
+ 020102
+ 020103
+ 020104
+ 020105
+ 020106
+ 020107
+ 020108
+ 302043
+ 302044
+ 101002
+ 302045
+ 302046
+ 307082 15 301090 BUFR template for synoptic reports RA II
+ 302031
+ 302035
+ 302036
+ 302047
+ 008002
+ 302048
+ 302037
+ 012121
+ 012122
+ 302043
+ 302044
+ 101002
+ 302045
+ 302046
+ 307083 14 301090 BUFR template for synoptic reports RA III
+ 302031
+ 302035
+ 302036
+ 302047
+ 008002
+ 302048
+ 302037
+ 012122
+ 302043
+ 302044
+ 101002
+ 302045
+ 302046
+ 307084 17 301090 BUFR template for synoptic reports RA IV
+ 302031
+ 302035
+ 302036
+ 302047
+ 008002
+ 302048
+ 302037
+ 020055
+ 101000
+ 031000
+ 205001
+ 302043
+ 302044
+ 101002
+ 302045
+ 302046
+ 307086 11 301090 BUFR template for synoptic reports RA VI
+ 302031
+ 302035
+ 302036
+ 008002
+ 302037
+ 302066
+ 302043
+ 302044
+ 101002
+ 302045
+ 307090 13 301092 BUFR template for synoptic reports from mobile land stations
+ 302031
+ 302035
+ 302036
+ 302047
+ 008002
+ 302048
+ 302037
+ 302043
+ 302044
+ 101002
+ 302045
+ 302046
+ 307091 66 301089
+ 301090
+ 008010
+ 301091
+ 302001
+ 007004
+ 010009
+ 302072
+ 103000
+ 031000
+ 101005
+ 307063
+ 007061
+ 101000
+ 031000
+ 302069
+ 007032
+ 007033
+ 105000
+ 031000
+ 020031
+ 020032
+ 002038
+ 022043
+ 302021
+ 101000
+ 031000
+ 302078
+ 101000
+ 031000
+ 302073
+ 101000
+ 031000
+ 302074
+ 101000
+ 031000
+ 302075
+ 102000
+ 031000
+ 004025
+ 302076
+ 302071
+ 302077
+ 007033
+ 101000
+ 031000
+ 302079
+ 007032
+ 101000
+ 031000
+ 302080
+ 101000
+ 031000
+ 302081
+ 101000
+ 031000
+ 302082
+ 102000
+ 031000
+ 004025
+ 013059
+ 101000
+ 031000
+ 302083
+ 033005
+ 033006
+ 307092 62 301089 Surface obs drom N-minute period
+ 301090
+ 008010
+ 301091
+ 004015
+ 004065
+ 125000
+ 031001
+ 010004
+ 302070
+ 302072
+ 007032
+ 012101
+ 103000
+ 031000
+ 101005
+ 307063
+ 007061
+ 101000
+ 031000
+ 302069
+ 007032
+ 007033
+ 101000
+ 031000
+ 302073
+ 101000
+ 031000
+ 302076
+ 102000
+ 031000
+ 013055
+ 013058
+ 102000
+ 031000
+ 020031
+ 020032
+ 101000
+ 031000
+ 302078
+ 102000
+ 031000
+ 302079
+ 007032
+ 101000
+ 031000
+ 302080
+ 101000
+ 031000
+ 302081
+ 101000
+ 031000
+ 302083
+ 102000
+ 031000
+ 004025
+ 013059
+ 101000
+ 031000
+ 302083
+ 033005
+ 033006
+ 308001 3 301033
+ 302011
+ 022042
+ 308002 3 301034
+ 302011
+ 022042
+ 308003 3 301035
+ 302011
+ 022042
+ 308004 3 301036
+ 302011
+ 022042
+ 308005 2 308004
+ 302024
+ 308006 8 010004
+ 010061
+ 010063
+ 011001
+ 011002
+ 012004
+ 013003
+ 022042
+ 308007 4 301055
+ 302011
+ 007062
+ 022042
+ 308008 84 001003 BUOY
+ 001020
+ 001005
+ 002001
+ 002036
+ 002149
+ 301011
+ 301012
+ 008021
+ 301011
+ 301012
+ 008021
+ 301021
+ 027004
+ 028004
+ 007030
+ 001051
+ 002148
+ 001012
+ 001014
+ 002040
+ 033022
+ 033023
+ 033027
+ 022063
+ 302021
+ 302022
+ 302023
+ 008081
+ 025026
+ 008081
+ 025026
+ 008081
+ 025026
+ 008081
+ 002034
+ 022060
+ 007070
+ 002190
+ 025086
+ 002035
+ 002168
+ 020031
+ 002038
+ 306004
+ 002030
+ 306005
+ 007031
+ 008081
+ 012064
+ 302001
+ 008081
+ 007032
+ 007033
+ 012101
+ 012103
+ 013003
+ 007032
+ 007033
+ 008082
+ 007033
+ 002169
+ 002002
+ 008021
+ 004025
+ 011001
+ 011002
+ 008021
+ 004025
+ 011043
+ 011041
+ 008082
+ 007033
+ 007032
+ 004024
+ 013011
+ 007032
+ 008021
+ 004024
+ 014021
+ 008021
+ 025028
+ 025028
+ 025028
+ 308009 7 301093
+ 302001
+ 302054
+ 008002
+ 302055
+ 302057
+ 302060
+ 308010 16 001011 TRACKOB template
+ 113000
+ 031001
+ 301011
+ 301012
+ 301021
+ 004080
+ 022049
+ 004080
+ 022059
+ 004080
+ 022005
+ 002042
+ 022032
+ 002042
+ 004080
+ 308011 27 001011 Climat ship
+ 002001
+ 301011
+ 301012
+ 301023
+ 007030
+ 007031
+ 004074
+ 004023
+ 008023
+ 010051
+ 007032
+ 007033
+ 012101
+ 013004
+ 007032
+ 007033
+ 302056
+ 008023
+ 004003
+ 004004
+ 004023
+ 007032
+ 013060
+ 013051
+ 004053
+ 007032
+ 308012 28 004001 Monthly normals from an ocean weather station
+ 004001
+ 004002
+ 004003
+ 004004
+ 004074
+ 004022
+ 008023
+ 010051
+ 007032
+ 007033
+ 012101
+ 013002
+ 007032
+ 007033
+ 302056
+ 008023
+ 004001
+ 004001
+ 004002
+ 004003
+ 004004
+ 004022
+ 007032
+ 008023
+ 013060
+ 004053
+ 008023
+ 308013 2 308011
+ 308012
+ 309001 4 301037
+ 101000
+ 031001
+ 303011
+ 309002 4 301038
+ 101000
+ 031001
+ 303011
+ 309003 4 301037
+ 101000
+ 031001
+ 303012
+ 309004 4 301038
+ 101000
+ 031001
+ 303012
+ 309005 5 301037
+ 302004
+ 101000
+ 031001
+ 303013
+ 309006 5 301038
+ 302004
+ 101000
+ 031001
+ 303013
+ 309007 5 301037
+ 302004
+ 101000
+ 031001
+ 303014
+ 309008 5 301038
+ 302004
+ 101000
+ 031001
+ 303014
+ 309011 4 301039
+ 101000
+ 031001
+ 303011
+ 309012 4 301039
+ 101000
+ 031001
+ 303012
+ 309013 5 301039
+ 302004
+ 101000
+ 031001
+ 303013
+ 309014 5 301039
+ 302004
+ 101000
+ 031001
+ 303014
+ 309015 4 301040
+ 101000
+ 031001
+ 303011
+ 309016 4 301040
+ 101000
+ 031001
+ 303012
+ 309017 5 301040
+ 302004
+ 101000
+ 031001
+ 303013
+ 309018 5 301040
+ 302004
+ 101000
+ 031001
+ 303014
+ 309019 5 301031
+ 002003
+ 101000
+ 031001
+ 303011
+ 309020 8 301031
+ 002003
+ 104000
+ 031001
+ 007003
+ 011003
+ 011004
+ 011005
+ 309030 8 015004
+ 015005
+ 104000
+ 031001
+ 004015
+ 008006
+ 007004
+ 015003
+ 309031 8 015004
+ 015005
+ 104000
+ 031001
+ 004025
+ 008006
+ 007004
+ 015003
+ 309040 3 301075
+ 301076
+ 309030
+ 309042 4 307042
+ 301075
+ 301076
+ 309030
+ 309050 9 301110
+ 301113
+ 301114
+ 101000
+ 031002
+ 303050
+ 101000
+ 031001
+ 303051
+ 309051 9 301110
+ 301113
+ 301114
+ 101000
+ 031002
+ 303052
+ 101000
+ 031001
+ 303053
+ 309052 11 301111
+ 301113
+ 301114
+ 302049
+ 022043
+ 101000
+ 031002
+ 303054
+ 101000
+ 031001
+ 303051
+ 309053 9 301112
+ 301113
+ 301114
+ 101000
+ 031002
+ 303054
+ 101000
+ 031001
+ 303051
+ 309054 27 301001
+ 001011
+ 301011
+ 301012
+ 301021
+ 007030
+ 007031
+ 007007
+ 004023
+ 004059
+ 115000
+ 031001
+ 008001
+ 008023
+ 007004
+ 010009
+ 012101
+ 012103
+ 008023
+ 011001
+ 011002
+ 008023
+ 011019
+ 008050
+ 008020
+ 008050
+ 008020
+ 309060 4 301123
+ 301121
+ 302050
+ 303040
+ 309061 21 301120
+ 008041
+ 301122
+ 201131
+ 202129
+ 025069
+ 007004
+ 202000
+ 201000
+ 033007
+ 033035
+ 033015
+ 013009
+ 033007
+ 033035
+ 033015
+ 002013
+ 012101
+ 033007
+ 033035
+ 033015
+ 309062 19 301120
+ 008041
+ 301122
+ 005001
+ 033035
+ 033015
+ 006001
+ 033035
+ 033015
+ 007007
+ 033035
+ 033015
+ 011003
+ 033035
+ 033015
+ 011004
+ 033035
+ 033015
+ 033007
+ 309063 19 301120
+ 008041
+ 301122
+ 005001
+ 033035
+ 033015
+ 006001
+ 033035
+ 033015
+ 007007
+ 033035
+ 033015
+ 011003
+ 033035
+ 033015
+ 011004
+ 033035
+ 033015
+ 033007
+ 309064 26 301120
+ 008041
+ 301122
+ 201131
+ 202129
+ 104002
+ 025069
+ 007004
+ 033035
+ 033015
+ 013003
+ 033035
+ 033015
+ 202000
+ 201000
+ 104002
+ 002013
+ 012101
+ 033035
+ 033015
+ 012103
+ 033035
+ 033015
+ 010009
+ 033035
+ 033015
+ 309065 18 301120
+ 008041
+ 301122
+ 005001
+ 033035
+ 033015
+ 006001
+ 033035
+ 033015
+ 007007
+ 033035
+ 033015
+ 011003
+ 033035
+ 033015
+ 011004
+ 033035
+ 033015
+ 309066 18 301120
+ 008041
+ 301122
+ 008040
+ 201131
+ 202129
+ 025069
+ 007004
+ 013003
+ 202000
+ 201000
+ 002013
+ 012101
+ 012103
+ 010009
+ 010007
+ 011002
+ 011001
+ 309194 5 301194
+ 302004
+ 101000
+ 031001
+ 303014
+ 309195 5 301195
+ 302004
+ 101000
+ 031001
+ 303014
+ 309196 5 301196
+ 302004
+ 101000
+ 031001
+ 303014
+ 309198 5 301198
+ 302004
+ 101000
+ 031001
+ 303014
+ 310001 5 301042
+ 303031
+ 303032
+ 101026
+ 303025
+ 310002 5 301042
+ 303031
+ 303032
+ 101009
+ 303023
+ 310003 5 301042
+ 303031
+ 303032
+ 101006
+ 303023
+ 310004 5 301042
+ 303031
+ 303032
+ 101003
+ 303024
+ 310005 6 301042
+ 303031
+ 303033
+ 101000
+ 031001
+ 303025
+ 310006 6 301042
+ 303031
+ 303033
+ 101000
+ 031001
+ 303023
+ 310007 6 301042
+ 303031
+ 303033
+ 101000
+ 031001
+ 303024
+ 310008 8 310011
+ 101019
+ 310012
+ 002150
+ 025079
+ 025080
+ 033032
+ 014045
+ 310009 3 310011
+ 101015
+ 310012
+ 310010 3 310011
+ 101005
+ 310012
+ 310011 45 008070
+ 001033
+ 001034
+ 008070
+ 001033
+ 001034
+ 001007
+ 002048
+ 005040
+ 025075
+ 201133
+ 005041
+ 201000
+ 005043
+ 025070
+ 033030
+ 033031
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 005001
+ 006001
+ 202126
+ 007001
+ 202000
+ 007024
+ 005021
+ 007025
+ 005022
+ 033033
+ 002151
+ 012064
+ 002151
+ 012064
+ 002151
+ 012064
+ 002151
+ 012064
+ 310012 10 002150
+ 025076
+ 025077
+ 025078
+ 033032
+ 201132
+ 202129
+ 012063
+ 202000
+ 201000
+ 310013 62 001007
+ 005040
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 004006
+ 005001
+ 006001
+ 007025
+ 005043
+ 025085
+ 201131
+ 202129
+ 002150
+ 008023
+ 008072
+ 014027
+ 008072
+ 014027
+ 002150
+ 008023
+ 008072
+ 014027
+ 008072
+ 014027
+ 002150
+ 008023
+ 008072
+ 014027
+ 008072
+ 014027
+ 202000
+ 201000
+ 201132
+ 202129
+ 002150
+ 008023
+ 008072
+ 012063
+ 008072
+ 012063
+ 002150
+ 008023
+ 008072
+ 012063
+ 008072
+ 012063
+ 008023
+ 008072
+ 012063
+ 008072
+ 012063
+ 002150
+ 008023
+ 008072
+ 012063
+ 008072
+ 012063
+ 202000
+ 201000
+ 310014 3 301072
+ 303041
+ 304011
+ 310015 13 301072
+ 007024
+ 010002
+ 303041
+ 101003
+ 304032
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101003
+ 304033
+ 310016 13 301072
+ 007024
+ 010002
+ 303041
+ 101012
+ 304032
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101012
+ 304033
+ 310019 68 001007
+ 002019
+ 301011
+ 301013
+ 301023
+ 007025
+ 008021
+ 007025
+ 008021
+ 007025
+ 008021
+ 008029
+ 005040
+ 008075
+ 008003
+ 010004
+ 008003
+ 207002
+ 015001
+ 207000
+ 033070
+ 015030
+ 207002
+ 020081
+ 207000
+ 008003
+ 033042
+ 007004
+ 207002
+ 015001
+ 207000
+ 008003
+ 113021
+ 007004
+ 007004
+ 207002
+ 008021
+ 015005
+ 008021
+ 015005
+ 033007
+ 207000
+ 008026
+ 101020
+ 025143
+ 008026
+ 008043
+ 109015
+ 007004
+ 008090
+ 207006
+ 015008
+ 207000
+ 008090
+ 207002
+ 033007
+ 207000
+ 008043
+ 033071
+ 108008
+ 202124
+ 201107
+ 002071
+ 201000
+ 202000
+ 207002
+ 020081
+ 207000
+ 310020 6 310022
+ 301011
+ 301013
+ 301021
+ 304034
+ 310021
+ 310021 10 108000
+ 031001
+ 201131
+ 202129
+ 007004
+ 007004
+ 202000
+ 201000
+ 015020
+ 010002
+ 310022 4 001007
+ 002019
+ 001033
+ 002172
+ 310023 17 301072
+ 030021
+ 030022
+ 008012
+ 007024
+ 007025
+ 010002
+ 101012
+ 304032
+ 105002
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101012
+ 304033
+ 310024 17 301072
+ 030021
+ 030022
+ 008012
+ 007024
+ 007025
+ 010002
+ 101003
+ 304032
+ 105002
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101003
+ 304033
+ 310025 61 001007
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 201138
+ 202131
+ 004006
+ 202000
+ 201000
+ 201132
+ 005041
+ 201000
+ 201129
+ 005043
+ 201000
+ 005002
+ 006002
+ 013040
+ 020029
+ 104024
+ 005042
+ 012163
+ 021083
+ 021084
+ 115003
+ 004001
+ 004002
+ 004003
+ 201142
+ 202131
+ 004026
+ 202000
+ 201000
+ 005001
+ 006001
+ 201138
+ 202129
+ 007001
+ 202000
+ 201000
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 005040
+ 101003
+ 012070
+ 025054
+ 101004
+ 025055
+ 008007
+ 104028
+ 005002
+ 006002
+ 002111
+ 005021
+ 310026 82 310022
+ 025060
+ 008021
+ 301011
+ 301012
+ 201138
+ 202131
+ 004006
+ 202000
+ 201000
+ 033039
+ 033007
+ 304030
+ 304031
+ 002020
+ 001050
+ 202127
+ 304030
+ 202000
+ 304031
+ 201133
+ 202131
+ 004016
+ 202000
+ 201000
+ 301021
+ 304030
+ 010035
+ 005021
+ 010036
+ 113000
+ 031002
+ 301021
+ 005021
+ 108000
+ 031001
+ 002121
+ 007040
+ 015037
+ 008023
+ 201125
+ 015037
+ 201000
+ 008023
+ 033007
+ 108000
+ 031002
+ 007007
+ 015036
+ 008023
+ 201123
+ 015036
+ 201000
+ 008023
+ 033007
+ 116000
+ 031002
+ 007009
+ 010004
+ 012001
+ 013001
+ 008023
+ 201120
+ 010004
+ 201000
+ 201122
+ 012001
+ 201000
+ 201123
+ 013001
+ 201000
+ 008023
+ 033007
+ 008003
+ 007009
+ 010004
+ 008023
+ 201120
+ 010004
+ 201000
+ 008023
+ 033007
+ 310027 12 301071
+ 301011
+ 301013
+ 301021
+ 030021
+ 030022
+ 010002
+ 304036
+ 002152
+ 002167
+ 101011
+ 304035
+ 310029 12 110000
+ 031001
+ 201138
+ 202130
+ 007004
+ 007004
+ 202000
+ 201000
+ 015020
+ 010002
+ 012101
+ 013098
+ 310030 6 310022
+ 301011
+ 301013
+ 301021
+ 304034
+ 310029
+ 310050 14 310051
+ 310052
+ 101000
+ 031002
+ 310053
+ 101004
+ 310054
+ 020010
+ 310052
+ 101015
+ 310053
+ 310052
+ 101005
+ 310053
+ 310051 16 001007
+ 005040
+ 201133
+ 005041
+ 201000
+ 201132
+ 025070
+ 201000
+ 202126
+ 007001
+ 202000
+ 007025
+ 005022
+ 102009
+ 002151
+ 012064
+ 310052 12 002019
+ 301011
+ 301012
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 301021
+ 007024
+ 005021
+ 005043
+ 310053 6 201134
+ 005042
+ 201000
+ 025076
+ 033032
+ 012163
+ 310054 13 201134
+ 005042
+ 201000
+ 025076
+ 033032
+ 201131
+ 202129
+ 102002
+ 008023
+ 014027
+ 008023
+ 202000
+ 201000
+ 310055 8 310051
+ 310052
+ 102020
+ 025076
+ 025052
+ 101000
+ 031002
+ 025050
+ 310060 53 001007
+ 001033
+ 002019
+ 002020
+ 301011
+ 301012
+ 207003
+ 004006
+ 207000
+ 304030
+ 301021
+ 007024
+ 005021
+ 007025
+ 005022
+ 008075
+ 201133
+ 005041
+ 201000
+ 005045
+ 005043
+ 005040
+ 010001
+ 201129
+ 007002
+ 201000
+ 202127
+ 201125
+ 021166
+ 201000
+ 202000
+ 008012
+ 020010
+ 020014
+ 002165
+ 033075
+ 107003
+ 008076
+ 006029
+ 006029
+ 025140
+ 025141
+ 033076
+ 033077
+ 008076
+ 033078
+ 033003
+ 104000
+ 031002
+ 201133
+ 005042
+ 201000
+ 014044
+ 310193 5 301250
+ 303250
+ 302250
+ 303249
+ 303251
+ 310194 5 301250
+ 303250
+ 302250
+ 303249
+ 303252
+ 310195 3 301250
+ 303250
+ 304250
+ 310196 3 301250
+ 303249
+ 303251
+ 310226 39 310022
+ 025060
+ 008021
+ 301011
+ 301012
+ 201138
+ 202131
+ 004006
+ 202000
+ 201000
+ 033039
+ 033007
+ 304030
+ 304031
+ 002020
+ 001050
+ 202127
+ 304030
+ 202000
+ 304031
+ 201133
+ 202131
+ 004016
+ 202000
+ 201000
+ 301021
+ 304030
+ 010035
+ 005021
+ 010036
+ 107000
+ 031002
+ 301021
+ 005021
+ 103000
+ 031001
+ 002121
+ 007040
+ 015037
+ 311001 9 301051
+ 007002
+ 012001
+ 011001
+ 011002
+ 011031
+ 011032
+ 011033
+ 020041
+ 311002 4 301065
+ 301066
+ 311003
+ 311004
+ 311003 5 010070
+ 011001
+ 011002
+ 012001
+ 013002
+ 311004 18 101000
+ 031000
+ 011034
+ 101000
+ 031000
+ 011035
+ 101000
+ 031000
+ 011075
+ 101000
+ 031000
+ 011076
+ 101000
+ 031000
+ 033025
+ 101000
+ 031000
+ 033026
+ 311005 13 001008
+ 001023
+ 301021
+ 301011
+ 301013
+ 007010
+ 008009
+ 011001
+ 011002
+ 011031
+ 011036
+ 012101
+ 033025
+ 311006 6 007010
+ 011001
+ 011002
+ 002064
+ 012101
+ 012103
+ 311007 7 007010
+ 301021
+ 011001
+ 011002
+ 002064
+ 012101
+ 012103
+ 311008 8 001008
+ 301011
+ 301013
+ 301021
+ 008004
+ 101000
+ 031001
+ 311006
+ 311009 8 001008
+ 301011
+ 301013
+ 301021
+ 008004
+ 101000
+ 031001
+ 311007
+ 311193 16 301197
+ 301011
+ 301012
+ 301023
+ 008004
+ 007004
+ 008021
+ 011001
+ 011002
+ 011031
+ 011034
+ 011035
+ 012001
+ 012003
+ 013003
+ 020041
+ 312001 2 301043
+ 304001
+ 312002 2 301043
+ 304002
+ 312003 2 301042
+ 304003
+ 312004 2 301042
+ 304004
+ 312005 2 301042
+ 020014
+ 312006 2 301044
+ 304005
+ 312007 2 301042
+ 304006
+ 312010 6 001007
+ 005040
+ 002021
+ 005041
+ 004001
+ 004043
+ 312011 9 202131
+ 201149
+ 004006
+ 201000
+ 202126
+ 010002
+ 202000
+ 005043
+ 005053
+ 312012 6 202129
+ 201132
+ 101019
+ 012063
+ 201000
+ 202000
+ 312013 6 005042
+ 202129
+ 201135
+ 012063
+ 201000
+ 202000
+ 312014 8 312010
+ 312011
+ 105056
+ 301023
+ 005042
+ 005052
+ 312012
+ 312013
+ 312015 10 109011
+ 301023
+ 005042
+ 005052
+ 202129
+ 201132
+ 101004
+ 012063
+ 202000
+ 201000
+ 312016 3 312010
+ 312011
+ 312015
+ 312017 10 109008
+ 301023
+ 005042
+ 005052
+ 202129
+ 201132
+ 101003
+ 012063
+ 202000
+ 201000
+ 312018 3 312010
+ 312011
+ 312017
+ 312019 13 301047
+ 301048
+ 015015
+ 029002
+ 021076
+ 106012
+ 201129
+ 006030
+ 201000
+ 102012
+ 005030
+ 021075
+ 021066
+ 312020 11 301047
+ 301048
+ 015015
+ 029002
+ 021076
+ 104012
+ 006030
+ 102012
+ 005030
+ 021075
+ 021066
+ 312021 6 301047
+ 101003
+ 301049
+ 011012
+ 011011
+ 021067
+ 312022 15 301047
+ 008022
+ 011012
+ 011050
+ 022070
+ 022026
+ 312041
+ 010050
+ 021068
+ 021071
+ 021072
+ 021073
+ 312042
+ 021062
+ 015011
+ 312023 7 301047
+ 103003
+ 008022
+ 012061
+ 022050
+ 021069
+ 021085
+ 312024 11 312020
+ 008060
+ 008022
+ 008060
+ 008022
+ 025014
+ 022101
+ 022097
+ 022098
+ 022099
+ 022100
+ 312025 11 312019
+ 008060
+ 008022
+ 008060
+ 008022
+ 025014
+ 022101
+ 022097
+ 022098
+ 022099
+ 022100
+ 312026 19 301046
+ 301011
+ 301013
+ 301023
+ 312031
+ 101004
+ 312030
+ 021110
+ 301023
+ 321027
+ 021111
+ 301023
+ 321027
+ 021112
+ 301023
+ 321027
+ 021113
+ 301023
+ 321027
+ 312027 9 301047
+ 105009
+ 301023
+ 007021
+ 012061
+ 007021
+ 012061
+ 021085
+ 021070
+ 312028 26 301046
+ 301011
+ 301013
+ 301023
+ 008025
+ 201136
+ 004006
+ 201000
+ 312031
+ 312032
+ 101004
+ 312030
+ 101002
+ 312033
+ 021110
+ 301023
+ 321028
+ 021111
+ 301023
+ 321028
+ 021112
+ 301023
+ 321028
+ 021113
+ 301023
+ 321028
+ 312030 13 201130
+ 202129
+ 011012
+ 202000
+ 201000
+ 011052
+ 201135
+ 202130
+ 011011
+ 202000
+ 201000
+ 011053
+ 021104
+ 312031 8 005034
+ 006034
+ 021109
+ 011081
+ 011082
+ 021101
+ 021102
+ 021103
+ 312032 4 021120
+ 021121
+ 013055
+ 021122
+ 312033 4 002104
+ 008022
+ 012063
+ 012065
+ 312041 5 201141
+ 202130
+ 007001
+ 201000
+ 202000
+ 312042 6 021077
+ 021078
+ 021079
+ 021080
+ 021081
+ 021082
+ 312045 21 001007
+ 002019
+ 001096
+ 025061
+ 005040
+ 301011
+ 301013
+ 301021
+ 007002
+ 012180
+ 012181
+ 012182
+ 012183
+ 012184
+ 012185
+ 002174
+ 021086
+ 012186
+ 021087
+ 012187
+ 033043
+ 312050 23 001007
+ 002019
+ 001096
+ 025061
+ 005040
+ 301011
+ 301013
+ 301021
+ 007025
+ 005022
+ 010080
+ 027080
+ 008003
+ 007004
+ 013093
+ 008003
+ 201131
+ 202129
+ 007004
+ 007004
+ 202000
+ 201000
+ 013095
+ 312051 48 001007
+ 002019
+ 001096
+ 025061
+ 005040
+ 008075
+ 301011
+ 301013
+ 301021
+ 001012
+ 201131
+ 001013
+ 201000
+ 010032
+ 010033
+ 010034
+ 007002
+ 008012
+ 025110
+ 025111
+ 025102
+ 002104
+ 025103
+ 025104
+ 025105
+ 025106
+ 025107
+ 025108
+ 002111
+ 002121
+ 002026
+ 002027
+ 021130
+ 021131
+ 021132
+ 021133
+ 021064
+ 025014
+ 021134
+ 107018
+ 005030
+ 105024
+ 201130
+ 006030
+ 201000
+ 021135
+ 021136
+ 033044
+ 312052 77 001007
+ 002019
+ 001096
+ 025061
+ 005040
+ 025120
+ 025121
+ 025124
+ 025125
+ 025122
+ 025123
+ 301011
+ 301013
+ 301021
+ 007002
+ 002119
+ 033047
+ 010081
+ 010082
+ 010083
+ 010084
+ 002116
+ 002117
+ 002118
+ 002156
+ 002157
+ 014055
+ 022150
+ 022151
+ 022152
+ 022153
+ 022154
+ 022155
+ 022156
+ 022157
+ 022158
+ 022159
+ 021137
+ 021138
+ 021139
+ 021140
+ 021141
+ 021142
+ 010085
+ 010086
+ 010087
+ 010088
+ 010089
+ 010090
+ 010091
+ 010092
+ 010093
+ 011002
+ 025126
+ 025127
+ 025128
+ 025129
+ 025130
+ 025131
+ 025132
+ 025133
+ 025134
+ 025135
+ 025136
+ 025137
+ 013096
+ 013097
+ 011095
+ 011096
+ 012188
+ 012189
+ 002158
+ 002159
+ 033052
+ 033053
+ 021143
+ 021144
+ 312053 54 001007
+ 002019
+ 001096
+ 025061
+ 005040
+ 008075
+ 301011
+ 301013
+ 301021
+ 001012
+ 201131
+ 001013
+ 201000
+ 010032
+ 010033
+ 010034
+ 007002
+ 008012
+ 025110
+ 025111
+ 025102
+ 002104
+ 025103
+ 025104
+ 025105
+ 025106
+ 025107
+ 025108
+ 011001
+ 011002
+ 022160
+ 025138
+ 201130
+ 202129
+ 022021
+ 202000
+ 201000
+ 033048
+ 033049
+ 002026
+ 002027
+ 021130
+ 021131
+ 021132
+ 021133
+ 025014
+ 106036
+ 005030
+ 104024
+ 201130
+ 006030
+ 201000
+ 022161
+ 033044
+ 312055 5 005033
+ 005040
+ 006034
+ 010095
+ 021157
+ 312056 11 025060
+ 001032
+ 011082
+ 011081
+ 020095
+ 020096
+ 021155
+ 201133
+ 021101
+ 021102
+ 201000
+ 312057 12 201130
+ 202129
+ 011012
+ 202000
+ 201000
+ 201131
+ 202129
+ 011011
+ 202000
+ 201000
+ 021156
+ 021104
+ 312058 8 301125
+ 301011
+ 301013
+ 301021
+ 312055
+ 021150
+ 101003
+ 321030
+ 312059 4 312056
+ 101000
+ 031001
+ 312057
+ 312060 20 025060
+ 025062
+ 040001
+ 040002
+ 021062
+ 021151
+ 021152
+ 021153
+ 021154
+ 021062
+ 021062
+ 040003
+ 040004
+ 040005
+ 040006
+ 040007
+ 020065
+ 040008
+ 040009
+ 040010
+ 312061 3 312058
+ 312060
+ 312059
+ 312070 27 001007
+ 002019
+ 001144
+ 001124
+ 030010
+ 301011
+ 301013
+ 301021
+ 007012
+ 015012
+ 012165
+ 012166
+ 012167
+ 012168
+ 027010
+ 028010
+ 002099
+ 013048
+ 025081
+ 025082
+ 025083
+ 025084
+ 012080
+ 012081
+ 012082
+ 025174
+ 033028
+ 312200 10 301237
+ 301238
+ 029002
+ 021206
+ 104012
+ 006232
+ 102012
+ 005232
+ 021205
+ 021196
+ 312201 6 301237
+ 101003
+ 301239
+ 011012
+ 011011
+ 021197
+ 312202 13 301237
+ 008022
+ 011012
+ 011050
+ 301240
+ 022243
+ 301241
+ 010050
+ 021198
+ 021201
+ 021202
+ 021203
+ 301242
+ 312203 8 301237
+ 008022
+ 012061
+ 022050
+ 021204
+ 021199
+ 021214
+ 021215
+ 312204 12 312201
+ 001031
+ 011012
+ 011011
+ 021200
+ 021213
+ 004004
+ 008021
+ 004024
+ 055003
+ 011012
+ 011011
+ 312207 3 312202
+ 301202
+ 033191
+ 312208 17 301202
+ 008022
+ 008021
+ 301011
+ 301013
+ 301023
+ 302205
+ 011002
+ 001007
+ 002021
+ 301011
+ 301013
+ 301023
+ 001032
+ 001192
+ 302205
+ 011002
+ 312209 11 301202
+ 001192
+ 301011
+ 301013
+ 301023
+ 302206
+ 104000
+ 022192
+ 102000
+ 005232
+ 022191
+ 312210 13 312202
+ 021192
+ 015202
+ 301011
+ 004004
+ 004005
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 304228
+ 304229
+ 312211 19 301046
+ 301011
+ 301013
+ 301023
+ 312031
+ 101004
+ 312030
+ 021110
+ 101004
+ 312212
+ 021111
+ 101004
+ 312212
+ 021112
+ 101004
+ 312212
+ 021113
+ 101004
+ 312212
+ 312212 2 301023
+ 321027
+ 313009 4 021001
+ 101000
+ 031001
+ 021001
+ 313010 4 021036
+ 101000
+ 031001
+ 021036
+ 313031 5 006002
+ 006012
+ 101000
+ 031002
+ 030001
+ 313032 5 005002
+ 005012
+ 101000
+ 031002
+ 313031
+ 313041 13 006002
+ 110000
+ 031001
+ 104000
+ 031001
+ 006012
+ 101000
+ 031012
+ 030001
+ 006012
+ 101000
+ 031001
+ 030001
+ 313042 5 005002
+ 005012
+ 101000
+ 031002
+ 313041
+ 313043 17 006002
+ 005002
+ 005012
+ 112000
+ 031001
+ 110000
+ 031001
+ 104000
+ 031001
+ 006012
+ 101000
+ 031011
+ 030001
+ 006012
+ 101000
+ 031001
+ 030001
+ 315001 5 001011
+ 301011
+ 301012
+ 301023
+ 306001
+ 315002 5 001011
+ 301011
+ 301012
+ 301023
+ 306004
+ 315003 25 001087
+ 001085
+ 001086
+ 002036
+ 002148
+ 002149
+ 022055
+ 022056
+ 022067
+ 301011
+ 301012
+ 301021
+ 008080
+ 033050
+ 109000
+ 031002
+ 007065
+ 008080
+ 033050
+ 022045
+ 008080
+ 033050
+ 022064
+ 008080
+ 033050
+ 316001 10 301011
+ 004004
+ 301023
+ 001021
+ 002041
+ 019001
+ 010051
+ 019002
+ 019003
+ 019004
+ 316002 15 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 001033
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 007002
+ 007002
+ 316003 12 110000
+ 031001
+ 008011
+ 008007
+ 104000
+ 031001
+ 005002
+ 006002
+ 010002
+ 011002
+ 008007
+ 008011
+ 316004 13 111000
+ 031001
+ 008011
+ 008007
+ 007002
+ 007002
+ 102000
+ 031001
+ 005002
+ 006002
+ 011031
+ 008007
+ 008011
+ 316005 10 108000
+ 031001
+ 008005
+ 008007
+ 005002
+ 006002
+ 001026
+ 019001
+ 008007
+ 008005
+ 316006 14 112000
+ 031001
+ 008011
+ 008007
+ 007002
+ 007002
+ 102000
+ 031001
+ 005002
+ 006002
+ 020011
+ 020012
+ 008007
+ 008011
+ 316007 12 110000
+ 031001
+ 008011
+ 008007
+ 104000
+ 031001
+ 005002
+ 006002
+ 019005
+ 019006
+ 008007
+ 008011
+ 316008 13 111000
+ 031001
+ 008001
+ 008007
+ 008023
+ 103000
+ 031001
+ 005002
+ 006002
+ 010002
+ 008023
+ 008007
+ 008001
+ 316009 13 111000
+ 031001
+ 008011
+ 008007
+ 007002
+ 007002
+ 102000
+ 031001
+ 005002
+ 006002
+ 020041
+ 008007
+ 008011
+ 316010 9 107000
+ 031001
+ 008011
+ 008007
+ 001022
+ 005002
+ 006002
+ 008007
+ 008011
+ 316011 19 117000
+ 031001
+ 008011
+ 001022
+ 008007
+ 102000
+ 031001
+ 005002
+ 006002
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 020090
+ 008021
+ 008007
+ 008011
+ 316020 5 001023
+ 001025
+ 001027
+ 301011
+ 301012
+ 316021 23 301023
+ 002041
+ 019001
+ 019007
+ 019005
+ 019006
+ 019008
+ 008005
+ 010004
+ 008005
+ 010004
+ 019007
+ 008005
+ 008021
+ 004075
+ 011040
+ 019007
+ 105004
+ 005021
+ 005021
+ 102002
+ 019003
+ 019004
+ 316022 24 001032
+ 002041
+ 019001
+ 019010
+ 118000
+ 031001
+ 008021
+ 004014
+ 008005
+ 301023
+ 019005
+ 019006
+ 010004
+ 011041
+ 008021
+ 004075
+ 011040
+ 019008
+ 105004
+ 005021
+ 005021
+ 102002
+ 019003
+ 019004
+ 316026 2 316020
+ 316021
+ 316030 10 301014
+ 001037
+ 010064
+ 008019
+ 001062
+ 008019
+ 001065
+ 008019
+ 001062
+ 008019
+ 316031 8 008021
+ 301011
+ 301012
+ 301027
+ 019005
+ 019006
+ 020028
+ 008021
+ 316032 5 008021
+ 301011
+ 301012
+ 301027
+ 008021
+ 316033 7 008021
+ 301011
+ 301012
+ 101000
+ 031001
+ 301027
+ 008021
+ 316034 17 008079
+ 316030
+ 008011
+ 001022
+ 008007
+ 301023
+ 008007
+ 020090
+ 316031
+ 101000
+ 031000
+ 316032
+ 101000
+ 031001
+ 316033
+ 008011
+ 008079
+ 316035 9 008079
+ 316030
+ 008011
+ 020023
+ 020021
+ 020008
+ 316031
+ 008011
+ 008079
+ 316036 13 008079
+ 316030
+ 008011
+ 001027
+ 316031
+ 101000
+ 031000
+ 316032
+ 101000
+ 031001
+ 316033
+ 008011
+ 008079
+ 316037 7 008079
+ 316030
+ 008011
+ 011031
+ 316031
+ 008011
+ 008079
+ 316038 8 008079
+ 316030
+ 008011
+ 020041
+ 020021
+ 316031
+ 008011
+ 008079
+ 316039 7 008079
+ 316030
+ 008011
+ 020024
+ 316031
+ 008011
+ 008079
+ 316040 6 316030
+ 008079
+ 301014
+ 001037
+ 010064
+ 008079
+ 316050 16 301001
+ 301011
+ 301012
+ 002160
+ 008005
+ 005002
+ 006002
+ 008005
+ 019100
+ 019005
+ 019006
+ 019101
+ 019102
+ 019103
+ 019104
+ 019105
+ 316052 29 301005
+ 301011
+ 301012
+ 001007
+ 025150
+ 122000
+ 031001
+ 001027
+ 019150
+ 019106
+ 008005
+ 005002
+ 006002
+ 008005
+ 019107
+ 019005
+ 019006
+ 019108
+ 019109
+ 019110
+ 019111
+ 019112
+ 019113
+ 019114
+ 019115
+ 019116
+ 019117
+ 019118
+ 019119
+ 318001 2 301025
+ 024011
+ 318003 4 301026
+ 024005
+ 024004
+ 024021
+ 318004 6 301025
+ 004023
+ 013011
+ 024005
+ 024004
+ 024022
+ 321001 6 002101
+ 002114
+ 002105
+ 002106
+ 002107
+ 002121
+ 321003 4 021051
+ 021014
+ 021017
+ 021030
+ 321004 5 301031
+ 002003
+ 101000
+ 031001
+ 321003
+ 321005 12 025004
+ 002121
+ 002122
+ 002123
+ 002124
+ 002125
+ 002126
+ 002127
+ 002128
+ 002129
+ 002130
+ 002131
+ 321006 4 025001
+ 025002
+ 025003
+ 025005
+ 321007 8 025009
+ 025010
+ 025011
+ 025012
+ 025013
+ 025015
+ 025016
+ 025017
+ 321008 3 025006
+ 025007
+ 025008
+ 321009 2 025018
+ 025019
+ 321010 13 002101
+ 007002
+ 002102
+ 002103
+ 002104
+ 002105
+ 002106
+ 002107
+ 002108
+ 002109
+ 002110
+ 002132
+ 002133
+ 321011 3 030031
+ 030032
+ 029002
+ 321012 3 101000
+ 031001
+ 002135
+ 321021 15 002003
+ 002101
+ 201130
+ 002106
+ 201000
+ 201132
+ 202130
+ 002121
+ 202000
+ 201000
+ 201133
+ 202129
+ 025001
+ 202000
+ 201000
+ 321022 11 007007
+ 204001
+ 031021
+ 011001
+ 204000
+ 011002
+ 204001
+ 031021
+ 011006
+ 204000
+ 021030
+ 321023 9 007007
+ 021091
+ 021030
+ 202129
+ 021014
+ 201129
+ 021017
+ 202000
+ 201000
+ 321024 7 007007
+ 204001
+ 031021
+ 012007
+ 011006
+ 204000
+ 021030
+ 321025 17 007007
+ 021091
+ 021030
+ 202129
+ 021014
+ 201129
+ 021017
+ 202000
+ 201000
+ 021092
+ 021030
+ 025092
+ 201129
+ 202129
+ 021017
+ 202000
+ 201000
+ 321026 10 007007
+ 204001
+ 031021
+ 012007
+ 025091
+ 011071
+ 011072
+ 011073
+ 011074
+ 204000
+ 321027 18 021118
+ 202129
+ 201132
+ 002112
+ 201000
+ 201131
+ 002111
+ 201000
+ 202000
+ 002104
+ 021105
+ 021106
+ 021107
+ 021114
+ 021115
+ 021116
+ 008018
+ 021117
+ 321028 18 021118
+ 202129
+ 201132
+ 002112
+ 201000
+ 201131
+ 002111
+ 201000
+ 202000
+ 002104
+ 021123
+ 021106
+ 021107
+ 021114
+ 021115
+ 021116
+ 008018
+ 021117
+ 321030 18 008085
+ 202129
+ 201131
+ 002111
+ 201000
+ 202000
+ 002134
+ 021062
+ 021063
+ 021158
+ 021159
+ 021160
+ 021161
+ 021162
+ 021163
+ 021164
+ 021165
+ 021166
+ 340001 45 001007
+ 001031
+ 002019
+ 002020
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 005001
+ 006001
+ 007024
+ 005021
+ 007025
+ 005022
+ 005043
+ 005040
+ 201133
+ 005041
+ 201000
+ 201132
+ 025070
+ 201000
+ 202126
+ 007001
+ 202000
+ 033060
+ 033061
+ 033062
+ 033063
+ 033064
+ 033065
+ 101010
+ 340002
+ 101087
+ 340003
+ 002019
+ 025051
+ 101007
+ 340004
+ 340002 3 025140
+ 025141
+ 025142
+ 340003 5 104100
+ 201136
+ 005042
+ 201000
+ 014046
+ 340004 9 005060
+ 005061
+ 025085
+ 105006
+ 005042
+ 025142
+ 014047
+ 025142
+ 014048
+ 340005 94 001007
+ 002019
+ 001096
+ 025061
+ 005044
+ 005040
+ 001030
+ 301011
+ 301012
+ 004007
+ 005001
+ 006001
+ 008029
+ 008074
+ 008077
+ 040011
+ 025097
+ 025095
+ 025098
+ 025099
+ 021144
+ 025096
+ 040012
+ 040013
+ 021169
+ 022151
+ 022162
+ 022163
+ 025160
+ 025133
+ 022156
+ 022164
+ 022165
+ 022166
+ 021137
+ 021138
+ 022167
+ 021139
+ 021118
+ 021145
+ 021146
+ 021147
+ 022168
+ 022169
+ 022170
+ 025161
+ 025162
+ 022171
+ 022172
+ 022173
+ 022174
+ 021170
+ 021171
+ 022175
+ 021172
+ 021118
+ 021173
+ 021174
+ 021175
+ 102003
+ 002153
+ 012063
+ 013090
+ 013091
+ 007002
+ 011097
+ 011098
+ 007002
+ 011095
+ 011096
+ 010096
+ 010081
+ 010082
+ 010083
+ 010101
+ 025132
+ 025163
+ 025126
+ 025128
+ 025164
+ 010085
+ 010097
+ 010086
+ 010087
+ 010092
+ 010088
+ 010089
+ 010098
+ 010099
+ 010090
+ 010100
+ 010093
+ 025127
+ 040014
+ 340007 57 001007
+ 001031
+ 002019
+ 002020
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 005001
+ 006001
+ 007024
+ 005021
+ 007025
+ 005022
+ 005043
+ 005040
+ 201133
+ 005041
+ 201000
+ 201132
+ 025070
+ 201000
+ 202126
+ 007001
+ 202000
+ 103003
+ 025140
+ 025141
+ 033060
+ 033061
+ 033062
+ 033063
+ 033064
+ 033065
+ 040020
+ 101010
+ 340002
+ 101087
+ 340003
+ 002019
+ 025051
+ 101007
+ 340004
+ 020081
+ 008029
+ 020083
+ 008029
+ 040018
+ 040019
+ 040021
+ 040022
+ 340008 70 001007
+ 001031
+ 002019
+ 002020
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 005001
+ 006001
+ 007024
+ 005021
+ 007025
+ 005022
+ 005043
+ 005040
+ 201133
+ 005041
+ 201000
+ 201132
+ 025070
+ 201000
+ 202126
+ 007001
+ 202000
+ 103003
+ 025140
+ 025141
+ 033060
+ 033061
+ 033062
+ 033063
+ 033064
+ 033065
+ 040020
+ 101010
+ 340002
+ 104000
+ 031002
+ 201136
+ 005042
+ 201000
+ 014046
+ 108003
+ 025140
+ 025141
+ 040015
+ 040016
+ 025062
+ 101000
+ 031002
+ 040017
+ 002019
+ 025051
+ 101007
+ 340004
+ 020081
+ 008029
+ 020083
+ 008029
+ 040018
+ 040019
+ 040021
+ 040022
diff --git a/bufrtables/D0000000000098000000.TXT b/bufrtables/D0000000000098000000.TXT
new file mode 100755
index 0000000..be697a7
--- /dev/null
+++ b/bufrtables/D0000000000098000000.TXT
@@ -0,0 +1,787 @@
+ 300002 2 000002
+ 000003
+ 300003 3 000010
+ 000011
+ 000012
+ 300004 9 300003
+ 000013
+ 000014
+ 000015
+ 000016
+ 000017
+ 000018
+ 000019
+ 000020
+ 300010 4 300003
+ 101000
+ 031001
+ 000030
+ 301001 2 001001
+ 001002
+ 301002 3 001003
+ 001004
+ 001005
+ 301003 3 001011
+ 001012
+ 001013
+ 301011 3 004001
+ 004002
+ 004003
+ 301012 2 004004
+ 004005
+ 301013 3 004004
+ 004005
+ 004006
+ 301021 2 005001
+ 006001
+ 301022 3 005001
+ 006001
+ 007001
+ 301023 2 005002
+ 006002
+ 301024 3 005002
+ 006002
+ 007001
+ 301025 3 301023
+ 004003
+ 301012
+ 301026 7 301021
+ 004003
+ 004003
+ 004004
+ 004004
+ 004005
+ 004005
+ 301031 5 301001
+ 002001
+ 301011
+ 301012
+ 301022
+ 301032 5 301001
+ 002001
+ 301011
+ 301012
+ 301024
+ 301033 5 001005
+ 002001
+ 301011
+ 301012
+ 301021
+ 301034 5 001005
+ 002001
+ 301011
+ 301012
+ 301023
+ 301035 7 001005
+ 001012
+ 001013
+ 002001
+ 301011
+ 301012
+ 301023
+ 301036 5 301003
+ 002001
+ 301011
+ 301012
+ 301023
+ 301037 6 301001
+ 002011
+ 002012
+ 301011
+ 301012
+ 301022
+ 301038 6 301001
+ 002001
+ 002012
+ 301011
+ 301012
+ 301024
+ 301039 6 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 301040 6 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301024
+ 301041 5 001007
+ 002021
+ 002022
+ 301011
+ 301012
+ 301042 2 301041
+ 301021
+ 301043 5 001007
+ 002023
+ 301011
+ 301013
+ 301021
+ 301044 5 001007
+ 002024
+ 301011
+ 301013
+ 301021
+ 301051 6 001006
+ 002061
+ 301011
+ 301012
+ 301021
+ 008004
+ 301194 8 001194
+ 001012
+ 001013
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 301195 8 001195
+ 001012
+ 001013
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 301200 2 001032
+ 033194
+ 301201 2 101003
+ 033193
+ 301237 6 001007
+ 001012
+ 002021
+ 301011
+ 301013
+ 301023
+ 301238 14 002104
+ 002121
+ 002113
+ 002026
+ 002027
+ 002111
+ 002112
+ 202127
+ 001013
+ 202126
+ 007001
+ 202000
+ 025010
+ 021194
+ 301239 5 002111
+ 002112
+ 021192
+ 021193
+ 021195
+ 301240 5 201131
+ 202129
+ 022021
+ 201000
+ 202000
+ 301241 5 201141
+ 202130
+ 007001
+ 201000
+ 202000
+ 301242 6 021207
+ 021208
+ 021209
+ 021210
+ 021211
+ 021212
+ 302001 4 010004
+ 010051
+ 010061
+ 010063
+ 302002 5 010004
+ 007004
+ 010003
+ 010061
+ 010063
+ 302003 9 011011
+ 011012
+ 012004
+ 012006
+ 013003
+ 020001
+ 020003
+ 020004
+ 020005
+ 302004 7 020010
+ 008002
+ 020011
+ 020013
+ 020012
+ 020012
+ 020012
+ 302005 4 008002
+ 020011
+ 020012
+ 020013
+ 302011 3 302001
+ 302003
+ 302004
+ 302012 3 302002
+ 302003
+ 302004
+ 302021 3 022001
+ 022011
+ 022021
+ 302022 3 022002
+ 022012
+ 022022
+ 302023 3 022003
+ 022013
+ 022023
+ 302024 3 302022
+ 302023
+ 302023
+ 303001 3 007003
+ 011001
+ 011002
+ 303002 3 007004
+ 011001
+ 011002
+ 303003 4 007004
+ 010003
+ 012001
+ 012003
+ 303004 6 007004
+ 010003
+ 012001
+ 012003
+ 011001
+ 011002
+ 303011 4 007003
+ 008001
+ 011001
+ 011002
+ 303012 4 007004
+ 008001
+ 011001
+ 011002
+ 303013 7 007004
+ 008001
+ 010003
+ 012001
+ 013003
+ 011001
+ 011002
+ 303014 7 007004
+ 008001
+ 010003
+ 012001
+ 012003
+ 011001
+ 011002
+ 303021 4 007004
+ 007004
+ 204007
+ 031021
+ 303022 3 303021
+ 010003
+ 204000
+ 303023 3 303021
+ 012001
+ 204000
+ 303024 3 303021
+ 013016
+ 204000
+ 303025 5 002025
+ 204007
+ 031021
+ 012063
+ 204000
+ 303026 6 007004
+ 008003
+ 204007
+ 031021
+ 012001
+ 204000
+ 303027 5 007004
+ 204007
+ 031021
+ 010003
+ 204000
+ 303031 6 007004
+ 008003
+ 007021
+ 007022
+ 008012
+ 012061
+ 303032 2 020011
+ 020016
+ 304001 5 008003
+ 010004
+ 012001
+ 011001
+ 011002
+ 304002 4 008003
+ 010004
+ 011001
+ 011002
+ 304003 2 008003
+ 012001
+ 304004 4 008003
+ 010004
+ 020010
+ 012001
+ 304005 4 002024
+ 007004
+ 007004
+ 013003
+ 304006 3 014001
+ 014001
+ 014003
+ 306001 5 002032
+ 102000
+ 031001
+ 007062
+ 022042
+ 306002 3 002031
+ 022004
+ 022031
+ 306003 4 002002
+ 011011
+ 011012
+ 012004
+ 306004 7 002032
+ 002033
+ 103000
+ 031001
+ 007062
+ 022043
+ 022062
+ 306005 6 002031
+ 103000
+ 031001
+ 007062
+ 022004
+ 022031
+ 306006 3 306003
+ 306002
+ 022063
+ 306007 6 001012
+ 001014
+ 306008
+ 004024
+ 027003
+ 028003
+ 306008 3 002034
+ 002035
+ 002036
+ 307001 2 301031
+ 302011
+ 307002 2 301032
+ 302011
+ 307003 4 307001
+ 101000
+ 031001
+ 302005
+ 307004 4 307002
+ 101000
+ 031001
+ 302005
+ 307005 3 307001
+ 101004
+ 302005
+ 307006 3 307002
+ 101004
+ 302005
+ 307007 2 301031
+ 302012
+ 307008 2 301032
+ 302012
+ 308001 3 301033
+ 302011
+ 022042
+ 308002 3 301034
+ 302011
+ 022042
+ 308003 3 301035
+ 302011
+ 022042
+ 308004 3 301036
+ 302011
+ 022042
+ 308005 2 308004
+ 302024
+ 308006 8 010004
+ 010061
+ 010063
+ 011001
+ 011002
+ 012004
+ 013003
+ 022042
+ 309001 4 301037
+ 101000
+ 031001
+ 303011
+ 309002 4 301038
+ 101000
+ 031001
+ 303011
+ 309003 4 301037
+ 101000
+ 031001
+ 303012
+ 309004 4 301038
+ 101000
+ 031001
+ 303012
+ 309005 5 301037
+ 302004
+ 101000
+ 031001
+ 303013
+ 309006 5 301038
+ 302004
+ 101000
+ 031001
+ 303013
+ 309007 5 301037
+ 302004
+ 101000
+ 031001
+ 303014
+ 309008 5 301038
+ 302004
+ 101000
+ 031001
+ 303014
+ 309011 4 301039
+ 101000
+ 031001
+ 303011
+ 309012 4 301039
+ 101000
+ 031001
+ 303012
+ 309013 5 301039
+ 302004
+ 101000
+ 031001
+ 303013
+ 309014 5 301039
+ 302004
+ 101000
+ 031001
+ 303014
+ 309015 4 301040
+ 101000
+ 031001
+ 303011
+ 309016 4 301040
+ 101000
+ 031001
+ 303012
+ 309017 5 301040
+ 302004
+ 101000
+ 031001
+ 303013
+ 309018 5 301031
+ 002003
+ 101000
+ 031001
+ 303011
+ 309019 8 301031
+ 002003
+ 104000
+ 031001
+ 007003
+ 011003
+ 011004
+ 011005
+ 309194 5 301194
+ 302004
+ 101000
+ 031001
+ 303014
+ 309195 5 301195
+ 302004
+ 101000
+ 031001
+ 303014
+ 310001 5 301042
+ 303031
+ 303032
+ 101026
+ 303025
+ 310002 5 301042
+ 303031
+ 303032
+ 101009
+ 303023
+ 310003 5 301042
+ 303031
+ 303032
+ 101006
+ 303023
+ 310004 5 301042
+ 303031
+ 303032
+ 101003
+ 303024
+ 311001 9 301051
+ 007002
+ 012001
+ 011001
+ 011002
+ 011031
+ 011032
+ 011033
+ 020041
+ 312001 2 301043
+ 304001
+ 312002 2 301043
+ 304002
+ 312003 2 301042
+ 304003
+ 312004 2 301042
+ 304004
+ 312005 2 301042
+ 020014
+ 312006 2 301044
+ 304005
+ 312007 2 301042
+ 304006
+ 312010 6 001007
+ 005040
+ 002021
+ 005041
+ 004001
+ 004043
+ 312011 9 202131
+ 201149
+ 004006
+ 201000
+ 102032
+ 010002
+ 202000
+ 005043
+ 005053
+ 312012 6 202129
+ 201132
+ 101019
+ 012063
+ 201000
+ 202000
+ 312013 6 005033
+ 202129
+ 201135
+ 012063
+ 201000
+ 202000
+ 312014 8 312010
+ 312011
+ 105056
+ 301023
+ 005042
+ 005052
+ 312012
+ 312013
+ 312015 10 109011
+ 301023
+ 005042
+ 005052
+ 202129
+ 201132
+ 101004
+ 012063
+ 202000
+ 201000
+ 312016 3 312010
+ 312011
+ 312015
+ 312017 10 109008
+ 301023
+ 005042
+ 005052
+ 202129
+ 201132
+ 101003
+ 012063
+ 202000
+ 201000
+ 312018 3 312010
+ 312011
+ 312017
+ 312200 10 301237
+ 301238
+ 029002
+ 021206
+ 104012
+ 006232
+ 102012
+ 005232
+ 021205
+ 021196
+ 312201 6 301237
+ 101003
+ 301239
+ 011012
+ 011011
+ 021197
+ 312202 13 301237
+ 008022
+ 011012
+ 011050
+ 301240
+ 022243
+ 301241
+ 010050
+ 021198
+ 021201
+ 021202
+ 021203
+ 301242
+ 312203 6 301237
+ 008022
+ 012061
+ 022050
+ 021204
+ 021199
+ 312204 11 312201
+ 011012
+ 011011
+ 021200
+ 004003
+ 004004
+ 008222
+ 004024
+ 002192
+ 011012
+ 011011
+ 313009 4 021001
+ 101000
+ 031001
+ 021001
+ 313010 4 021036
+ 101000
+ 031001
+ 021036
+ 313031 5 006002
+ 006012
+ 101000
+ 031002
+ 030001
+ 313032 5 005002
+ 005012
+ 101000
+ 031002
+ 313031
+ 313041 10 006002
+ 006012
+ 106000
+ 031001
+ 101000
+ 031011
+ 030001
+ 101000
+ 031001
+ 030001
+ 313042 5 005002
+ 005012
+ 101000
+ 031002
+ 313041
+ 315001 5 001011
+ 301011
+ 301012
+ 301023
+ 306001
+ 315002 5 001011
+ 301011
+ 301012
+ 301023
+ 306004
+ 316001 10 301011
+ 004004
+ 301023
+ 001021
+ 002041
+ 019001
+ 010051
+ 019002
+ 019003
+ 019004
+ 318001 2 301025
+ 024011
+ 318003 4 301026
+ 024005
+ 024004
+ 024021
+ 318004 6 301025
+ 004023
+ 013011
+ 024005
+ 024004
+ 024022
+ 321001 6 002101
+ 002114
+ 002105
+ 002106
+ 002107
+ 002121
+ 321003 4 021051
+ 021014
+ 021017
+ 025030
+ 321004 5 301031
+ 002003
+ 101000
+ 031001
+ 321003
+ 321005 12 025004
+ 002121
+ 002122
+ 002123
+ 002124
+ 002125
+ 002126
+ 002127
+ 002128
+ 002129
+ 002130
+ 002131
+ 321006 4 025001
+ 025002
+ 025003
+ 025005
+ 321007 8 025009
+ 025010
+ 025011
+ 025012
+ 025013
+ 025015
+ 025016
+ 025017
+ 321008 3 025006
+ 025007
+ 025008
+ 321009 2 025018
+ 025019
+ 321010 13 002101
+ 007002
+ 002102
+ 002103
+ 002104
+ 002105
+ 002106
+ 002107
+ 002108
+ 002109
+ 002110
+ 002132
+ 002133
+ 321011 3 030031
+ 030032
+ 029002
+ 321012 3 101000
+ 031001
+ 002135
diff --git a/bufrtables/D0000000000098002001.TXT b/bufrtables/D0000000000098002001.TXT
new file mode 100755
index 0000000..619249e
--- /dev/null
+++ b/bufrtables/D0000000000098002001.TXT
@@ -0,0 +1,914 @@
+ 300002 2 000002
+ 000003
+ 300003 3 000010
+ 000011
+ 000012
+ 300004 9 300003
+ 000013
+ 000014
+ 000015
+ 000016
+ 000017
+ 000018
+ 000019
+ 000020
+ 300010 4 300003
+ 101000
+ 031001
+ 000030
+ 301001 2 001001
+ 001002
+ 301002 3 001003
+ 001004
+ 001005
+ 301003 3 001011
+ 001012
+ 001013
+ 301011 3 004001
+ 004002
+ 004003
+ 301012 2 004004
+ 004005
+ 301013 3 004004
+ 004005
+ 004006
+ 301021 2 005001
+ 006001
+ 301022 3 005001
+ 006001
+ 007001
+ 301023 2 005002
+ 006002
+ 301024 3 005002
+ 006002
+ 007001
+ 301025 3 301023
+ 004003
+ 301012
+ 301026 7 301021
+ 004003
+ 004003
+ 004004
+ 004004
+ 004005
+ 004005
+ 301031 5 301001
+ 002001
+ 301011
+ 301012
+ 301022
+ 301032 5 301001
+ 002001
+ 301011
+ 301012
+ 301024
+ 301033 5 001005
+ 002001
+ 301011
+ 301012
+ 301021
+ 301034 5 001005
+ 002001
+ 301011
+ 301012
+ 301023
+ 301035 7 001005
+ 001012
+ 001013
+ 002001
+ 301011
+ 301012
+ 301023
+ 301036 5 301003
+ 002001
+ 301011
+ 301012
+ 301023
+ 301037 6 301001
+ 002011
+ 002012
+ 301011
+ 301012
+ 301022
+ 301038 6 301001
+ 002011
+ 002012
+ 301011
+ 301012
+ 301024
+ 301039 6 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 301040 6 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301024
+ 301041 5 001007
+ 002021
+ 002022
+ 301011
+ 301012
+ 301042 2 301041
+ 301021
+ 301043 5 001007
+ 002023
+ 301011
+ 301013
+ 301021
+ 301044 5 001007
+ 002024
+ 301011
+ 301013
+ 301021
+ 301051 6 001006
+ 002061
+ 301011
+ 301012
+ 301021
+ 008004
+ 301062 3 101000
+ 031001
+ 301001
+ 301194 9 001194
+ 001012
+ 001013
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301195 9 001195
+ 001012
+ 001013
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301196 7 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301197 9 001006
+ 001008
+ 002061
+ 002062
+ 002002
+ 002005
+ 002070
+ 002063
+ 002001
+ 301200 2 001032
+ 033194
+ 301201 2 101003
+ 033193
+ 301202 2 001031
+ 001032
+ 301237 12 001007
+ 001012
+ 002021
+ 301011
+ 004004
+ 004005
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 301023
+ 301238 14 002104
+ 002121
+ 002113
+ 002026
+ 002027
+ 002111
+ 002192
+ 202127
+ 001013
+ 202126
+ 007001
+ 202000
+ 025010
+ 021194
+ 301239 5 002111
+ 002112
+ 021192
+ 021193
+ 021195
+ 301240 5 201131
+ 202129
+ 022021
+ 201000
+ 202000
+ 301241 5 201141
+ 202130
+ 007001
+ 201000
+ 202000
+ 301242 6 021207
+ 021208
+ 021209
+ 021210
+ 021211
+ 021212
+ 302001 4 010004
+ 010051
+ 010061
+ 010063
+ 302002 5 010004
+ 007004
+ 010003
+ 010061
+ 010063
+ 302003 9 011011
+ 011012
+ 012004
+ 012006
+ 013003
+ 020001
+ 020003
+ 020004
+ 020005
+ 302004 7 020010
+ 008002
+ 020011
+ 020013
+ 020012
+ 020012
+ 020012
+ 302005 4 008002
+ 020011
+ 020012
+ 020013
+ 302011 3 302001
+ 302003
+ 302004
+ 302012 3 302002
+ 302003
+ 302004
+ 302021 3 022001
+ 022011
+ 022021
+ 302022 3 022002
+ 022012
+ 022022
+ 302023 3 022003
+ 022013
+ 022023
+ 302024 3 302022
+ 101002
+ 302023
+ 302205 5 201131
+ 202129
+ 022021
+ 201000
+ 202000
+ 302206 9 302205
+ 201130
+ 202129
+ 022011
+ 201000
+ 202000
+ 022001
+ 011001
+ 011002
+ 302207 5 022193
+ 022194
+ 022195
+ 022196
+ 022197
+ 303001 3 007003
+ 011001
+ 011002
+ 303002 3 007004
+ 011001
+ 011002
+ 303003 4 007004
+ 010003
+ 012001
+ 012003
+ 303004 6 007004
+ 010003
+ 012001
+ 012003
+ 011001
+ 011002
+ 303011 4 007003
+ 008001
+ 011001
+ 011002
+ 303012 4 007004
+ 008001
+ 011001
+ 011002
+ 303013 7 007004
+ 008001
+ 010003
+ 012001
+ 013003
+ 011001
+ 011002
+ 303014 7 007004
+ 008001
+ 010003
+ 012001
+ 012003
+ 011001
+ 011002
+ 303021 4 007004
+ 007004
+ 204007
+ 031021
+ 303022 3 303021
+ 010003
+ 204000
+ 303023 3 303021
+ 012001
+ 204000
+ 303024 3 303021
+ 013016
+ 204000
+ 303025 5 002025
+ 204007
+ 031021
+ 012063
+ 204000
+ 303026 6 007004
+ 008003
+ 204007
+ 031021
+ 012001
+ 204000
+ 303027 5 007004
+ 204007
+ 031021
+ 010003
+ 204000
+ 303031 6 007004
+ 008003
+ 007021
+ 007022
+ 008012
+ 012061
+ 303032 2 020011
+ 020016
+ 304001 5 008003
+ 010004
+ 012001
+ 011001
+ 011002
+ 304002 4 008003
+ 010004
+ 011001
+ 011002
+ 304003 2 008003
+ 012001
+ 304004 4 008003
+ 010004
+ 020010
+ 012001
+ 304005 4 002024
+ 007004
+ 007004
+ 013003
+ 304006 3 014001
+ 014001
+ 014003
+ 304228 3 005217
+ 006217
+ 007217
+ 304229 3 001208
+ 001209
+ 001210
+ 306001 5 002032
+ 102000
+ 031001
+ 007062
+ 022042
+ 306002 3 002031
+ 022004
+ 022031
+ 306003 4 002002
+ 011011
+ 011012
+ 012004
+ 306004 7 002032
+ 002033
+ 103000
+ 031001
+ 007062
+ 022043
+ 022062
+ 306005 6 002031
+ 103000
+ 031001
+ 007062
+ 022004
+ 022031
+ 306006 3 306003
+ 306002
+ 022063
+ 306007 6 001012
+ 001014
+ 306008
+ 004024
+ 027003
+ 028003
+ 306008 3 002034
+ 002035
+ 002036
+ 307001 2 301031
+ 302011
+ 307002 2 301032
+ 302011
+ 307003 4 307001
+ 101000
+ 031001
+ 302005
+ 307004 4 307002
+ 101000
+ 031001
+ 302005
+ 307005 3 307001
+ 101004
+ 302005
+ 307006 3 307002
+ 101004
+ 302005
+ 307007 2 301031
+ 302012
+ 307008 2 301032
+ 302012
+ 308001 3 301033
+ 302011
+ 022042
+ 308002 3 301034
+ 302011
+ 022042
+ 308003 3 301035
+ 302011
+ 022042
+ 308004 3 301036
+ 302011
+ 022042
+ 308005 2 308004
+ 302024
+ 308006 8 010004
+ 010061
+ 010063
+ 011001
+ 011002
+ 012004
+ 013003
+ 022042
+ 309001 4 301037
+ 101000
+ 031001
+ 303011
+ 309002 4 301038
+ 101000
+ 031001
+ 303011
+ 309003 4 301037
+ 101000
+ 031001
+ 303012
+ 309004 4 301038
+ 101000
+ 031001
+ 303012
+ 309005 5 301037
+ 302004
+ 101000
+ 031001
+ 303013
+ 309006 5 301038
+ 302004
+ 101000
+ 031001
+ 303013
+ 309007 5 301037
+ 302004
+ 101000
+ 031001
+ 303014
+ 309008 5 301038
+ 302004
+ 101000
+ 031001
+ 303014
+ 309011 4 301039
+ 101000
+ 031001
+ 303011
+ 309012 4 301039
+ 101000
+ 031001
+ 303012
+ 309013 5 301039
+ 302004
+ 101000
+ 031001
+ 303013
+ 309014 5 301039
+ 302004
+ 101000
+ 031001
+ 303014
+ 309015 4 301040
+ 101000
+ 031001
+ 303011
+ 309016 4 301040
+ 101000
+ 031001
+ 303012
+ 309017 5 301040
+ 302004
+ 101000
+ 031001
+ 303013
+ 309018 5 301031
+ 302004
+ 101000
+ 031001
+ 303014
+ 309019 5 301031
+ 002003
+ 101000
+ 031001
+ 303011
+ 309020 8 301031
+ 002003
+ 104000
+ 031001
+ 007003
+ 011003
+ 011004
+ 011005
+ 309194 5 301194
+ 302004
+ 101000
+ 031001
+ 303014
+ 309195 5 301195
+ 302004
+ 101000
+ 031001
+ 303014
+ 309196 5 301196
+ 302004
+ 101000
+ 031001
+ 303014
+ 310001 5 301042
+ 303031
+ 303032
+ 101026
+ 303025
+ 310002 5 301042
+ 303031
+ 303032
+ 101009
+ 303023
+ 310003 5 301042
+ 303031
+ 303032
+ 101006
+ 303023
+ 310004 5 301042
+ 303031
+ 303032
+ 101003
+ 303024
+ 311001 9 301051
+ 007002
+ 012001
+ 011001
+ 011002
+ 011031
+ 011032
+ 011033
+ 020041
+ 311193 16 301197
+ 301011
+ 301012
+ 301023
+ 008004
+ 007004
+ 008021
+ 011001
+ 011002
+ 011031
+ 011034
+ 011035
+ 012001
+ 012003
+ 013003
+ 020041
+ 312001 2 301043
+ 304001
+ 312002 2 301043
+ 304002
+ 312003 2 301042
+ 304003
+ 312004 2 301042
+ 304004
+ 312005 2 301042
+ 020014
+ 312006 2 301044
+ 304005
+ 312007 2 301042
+ 304006
+ 312010 6 001007
+ 005040
+ 002021
+ 005041
+ 004001
+ 004043
+ 312011 9 202131
+ 201149
+ 004006
+ 201000
+ 202126
+ 010002
+ 202000
+ 005043
+ 005053
+ 312012 6 202129
+ 201132
+ 101019
+ 012063
+ 201000
+ 202000
+ 312013 6 005033
+ 202129
+ 201135
+ 012063
+ 201000
+ 202000
+ 312014 8 312010
+ 312011
+ 105056
+ 301023
+ 005042
+ 005052
+ 312012
+ 312013
+ 312015 10 109011
+ 301023
+ 005042
+ 005052
+ 202129
+ 201132
+ 101004
+ 012063
+ 202000
+ 201000
+ 312016 3 312010
+ 312011
+ 312015
+ 312017 10 109008
+ 301023
+ 005042
+ 005052
+ 202129
+ 201132
+ 101003
+ 012063
+ 202000
+ 201000
+ 312018 3 312010
+ 312011
+ 312017
+ 312200 10 301237
+ 301238
+ 029002
+ 021206
+ 104012
+ 006232
+ 102012
+ 005232
+ 021205
+ 021196
+ 312201 6 301237
+ 101003
+ 301239
+ 011012
+ 011011
+ 021197
+ 312202 13 301237
+ 008022
+ 011012
+ 011050
+ 301240
+ 022243
+ 301241
+ 010050
+ 021198
+ 021201
+ 021202
+ 021203
+ 301242
+ 312203 8 301237
+ 008022
+ 012061
+ 022050
+ 021204
+ 021199
+ 021214
+ 021215
+ 312204 12 312201
+ 001031
+ 011012
+ 011011
+ 021200
+ 021213
+ 004004
+ 008021
+ 004024
+ 055003
+ 011012
+ 011011
+ 312207 3 312202
+ 301202
+ 033191
+ 312208 17 301202
+ 008022
+ 008021
+ 301011
+ 301013
+ 301023
+ 302205
+ 011002
+ 001007
+ 002021
+ 301011
+ 301013
+ 301023
+ 001032
+ 001192
+ 302205
+ 011002
+ 312209 11 301202
+ 001192
+ 301011
+ 301013
+ 301023
+ 302206
+ 104000
+ 022192
+ 102000
+ 005232
+ 022191
+ 312210 13 312202
+ 021192
+ 015202
+ 301011
+ 004004
+ 004005
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 304228
+ 304229
+ 313009 4 021001
+ 101000
+ 031001
+ 021001
+ 313010 4 021036
+ 101000
+ 031001
+ 021036
+ 313031 5 006002
+ 006012
+ 101000
+ 031002
+ 030001
+ 313032 5 005002
+ 005012
+ 101000
+ 031002
+ 313031
+ 313041 10 006002
+ 006012
+ 106000
+ 031001
+ 101000
+ 031011
+ 030001
+ 101000
+ 031001
+ 030001
+ 313042 5 005002
+ 005012
+ 101000
+ 031002
+ 313041
+ 315001 5 001011
+ 301011
+ 301012
+ 301023
+ 306001
+ 315002 5 001011
+ 301011
+ 301012
+ 301023
+ 306004
+ 316001 10 301011
+ 004004
+ 301023
+ 001021
+ 002041
+ 019001
+ 010051
+ 019002
+ 019003
+ 019004
+ 318001 2 301025
+ 024011
+ 318003 4 301026
+ 024005
+ 024004
+ 024021
+ 318004 6 301025
+ 004023
+ 013011
+ 024005
+ 024004
+ 024022
+ 321001 6 002101
+ 002114
+ 002105
+ 002106
+ 002107
+ 002121
+ 321003 4 021051
+ 021014
+ 021017
+ 025030
+ 321004 5 301031
+ 002003
+ 101000
+ 031001
+ 321003
+ 321005 12 025004
+ 002121
+ 002122
+ 002123
+ 002124
+ 002125
+ 002126
+ 002127
+ 002128
+ 002129
+ 002130
+ 002131
+ 321006 4 025001
+ 025002
+ 025003
+ 025005
+ 321007 8 025009
+ 025010
+ 025011
+ 025012
+ 025013
+ 025015
+ 025016
+ 025017
+ 321008 3 025006
+ 025007
+ 025008
+ 321009 2 025018
+ 025019
+ 321010 13 002101
+ 007002
+ 002102
+ 002103
+ 002104
+ 002105
+ 002106
+ 002107
+ 002108
+ 002109
+ 002110
+ 002132
+ 002133
+ 321011 3 030031
+ 030032
+ 029002
+ 321012 3 101000
+ 031001
+ 002135
diff --git a/bufrtables/D0000000000098006000.TXT b/bufrtables/D0000000000098006000.TXT
new file mode 100755
index 0000000..d2d2c78
--- /dev/null
+++ b/bufrtables/D0000000000098006000.TXT
@@ -0,0 +1,2077 @@
+ 300002 2 000002
+ 000003
+ 300003 3 000010
+ 000011
+ 000012
+ 300004 9 300003
+ 000013
+ 000014
+ 000015
+ 000016
+ 000017
+ 000018
+ 000019
+ 000020
+ 300010 4 300003
+ 101000
+ 031001
+ 000030
+ 301001 2 001001
+ 001002
+ 301002 3 001003
+ 001004
+ 001005
+ 301003 3 001011
+ 001012
+ 001013
+ 301011 3 004001
+ 004002
+ 004003
+ 301012 2 004004
+ 004005
+ 301013 3 004004
+ 004005
+ 004006
+ 301021 2 005001
+ 006001
+ 301022 3 005001
+ 006001
+ 007001
+ 301023 2 005002
+ 006002
+ 301024 3 005002
+ 006002
+ 007001
+ 301025 3 301023
+ 004003
+ 301012
+ 301026 7 301021
+ 004003
+ 004003
+ 004004
+ 004004
+ 004005
+ 004005
+ 301029 3 001018
+ 002001
+ 301011
+ 301030 4 001018
+ 002001
+ 301011
+ 301024
+ 301031 5 301001
+ 002001
+ 301011
+ 301012
+ 301022
+ 301032 5 301001
+ 002001
+ 301011
+ 301012
+ 301024
+ 301033 5 001005
+ 002001
+ 301011
+ 301012
+ 301021
+ 301034 5 001005
+ 002001
+ 301011
+ 301012
+ 301023
+ 301035 7 001005
+ 001012
+ 001013
+ 002001
+ 301011
+ 301012
+ 301023
+ 301036 5 301003
+ 002001
+ 301011
+ 301012
+ 301023
+ 301037 6 301001
+ 002011
+ 002012
+ 301011
+ 301012
+ 301022
+ 301038 6 301001
+ 002011
+ 002012
+ 301011
+ 301012
+ 301024
+ 301039 6 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 301040 6 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301024
+ 301041 5 001007
+ 002021
+ 002022
+ 301011
+ 301012
+ 301042 2 301041
+ 301021
+ 301043 5 001007
+ 002023
+ 301011
+ 301013
+ 301021
+ 301044 5 001007
+ 002024
+ 301011
+ 301013
+ 301021
+ 301045 9 301011
+ 301012
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 304030
+ 304031
+ 301046 10 001007 SeaWinds header information::SATELLITE IDENTIFIER
+ 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM
+ 002048 SATELLITE SENSOR INDICATOR
+ 021119 WIND SCATTEROMETER GEOPHYSICAL MODEL FUNCTION
+ 025060 SOFTWARE INDENTIFICATION
+ 202124 *** decrease scaling by 10^4
+ 002026 ALONG TRACK RESOLUTION
+ 002027 CROSS TRACK RESOLUTION
+ 202000 *** cancel change scaling
+ 005040 ORBIT NUMBER
+ 301047 15 001007
+ 025060
+ 001033
+ 001034
+ 001012
+ 301045
+ 002021
+ 301011
+ 301012
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 301023
+ 301048 14 002104
+ 002121
+ 002113
+ 002026
+ 002027
+ 002111
+ 002140
+ 202127
+ 001013
+ 202126
+ 007001
+ 202000
+ 025010
+ 021064
+ 301049 5 002111
+ 002112
+ 021062
+ 021063
+ 021065
+ 301051 6 001006
+ 002061
+ 301011
+ 301012
+ 301021
+ 008004
+ 301055 7 001005
+ 002001
+ 301011
+ 301012
+ 301021
+ 001012
+ 001014
+ 301062 3 101000
+ 031001
+ 301001
+ 301065 8 001006
+ 001008
+ 002001
+ 002002
+ 002005
+ 002062
+ 002070
+ 002065
+ 301066 6 301011
+ 301013
+ 301023
+ 007004
+ 002064
+ 008004
+ 301070 3 002143
+ 002142
+ 002144
+ 301071 4 002143
+ 002142
+ 002145
+ 002146
+ 301072 4 301071
+ 301011
+ 301013
+ 301021
+ 301074 4 002143
+ 002142
+ 002145
+ 002146
+ 301075 6 301001
+ 001015
+ 301022
+ 008021
+ 301011
+ 301012
+ 301076 3 002011
+ 002143
+ 002142
+ 301193 5 001007
+ 001031
+ 002196
+ 002221
+ 002222
+ 301194 9 001194
+ 001012
+ 001013
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301195 9 001195
+ 001012
+ 001013
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301196 7 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301197 9 001006
+ 001008
+ 002061
+ 002062
+ 002002
+ 002005
+ 002070
+ 002063
+ 002001
+ 301200 2 001032
+ 033194
+ 301201 2 101003
+ 033193
+ 301202 2 001031
+ 001032
+ 301237 12 001007
+ 001012
+ 002021
+ 301011
+ 004004
+ 004005
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 301023
+ 301238 14 002104
+ 002121
+ 002113
+ 002026
+ 002027
+ 002111
+ 002192
+ 202127
+ 001013
+ 202126
+ 007001
+ 202000
+ 025010
+ 021194
+ 301239 5 002111
+ 002112
+ 021192
+ 021193
+ 021195
+ 301240 5 201131
+ 202129
+ 022021
+ 201000
+ 202000
+ 301241 5 201141
+ 202130
+ 007001
+ 201000
+ 202000
+ 301242 6 021207
+ 021208
+ 021209
+ 021210
+ 021211
+ 021212
+ 301250 4 301193
+ 301011
+ 301013
+ 301021
+ 302001 4 010004
+ 010051
+ 010061
+ 010063
+ 302002 5 010004
+ 007004
+ 010003
+ 010061
+ 010063
+ 302003 9 011011
+ 011012
+ 012004
+ 012006
+ 013003
+ 020001
+ 020003
+ 020004
+ 020005
+ 302004 7 020010
+ 008002
+ 020011
+ 020013
+ 020012
+ 020012
+ 020012
+ 302005 4 008002
+ 020011
+ 020012
+ 020013
+ 302006 4 010004
+ 010051
+ 010062
+ 010063
+ 302011 3 302001
+ 302003
+ 302004
+ 302012 3 302002
+ 302003
+ 302004
+ 302013 5 302006
+ 302003
+ 101000
+ 031001
+ 302005
+ 302021 3 022001
+ 022011
+ 022021
+ 302022 3 022002
+ 022012
+ 022022
+ 302023 3 022003
+ 022013
+ 022023
+ 302024 3 302022
+ 101002
+ 302023
+ 302051 12 010004
+ 010051
+ 007004
+ 010003
+ 012004
+ 012051
+ 012016
+ 012017
+ 013004
+ 102004
+ 008051
+ 008020
+ 302205 5 201131
+ 202129
+ 022021
+ 201000
+ 202000
+ 302206 9 302205
+ 201130
+ 202129
+ 022011
+ 201000
+ 202000
+ 022001
+ 011001
+ 011002
+ 302207 5 022193
+ 022194
+ 022195
+ 022196
+ 022197
+ 302250 5 102000
+ 031001
+ 020193
+ 020194
+ 020012
+ 303001 3 007003
+ 011001
+ 011002
+ 303002 3 007004
+ 011001
+ 011002
+ 303003 4 007004
+ 010003
+ 012001
+ 012003
+ 303004 6 007004
+ 010003
+ 012001
+ 012003
+ 011001
+ 011002
+ 303011 4 007003
+ 008001
+ 011001
+ 011002
+ 303012 4 007004
+ 008001
+ 011001
+ 011002
+ 303013 7 007004
+ 008001
+ 010003
+ 012001
+ 013003
+ 011001
+ 011002
+ 303014 7 007004
+ 008001
+ 010003
+ 012001
+ 012003
+ 011001
+ 011002
+ 303021 4 007004
+ 007004
+ 204007
+ 031021
+ 303022 3 303021
+ 010003
+ 204000
+ 303023 3 303021
+ 012001
+ 204000
+ 303024 3 303021
+ 013016
+ 204000
+ 303025 5 002025
+ 204007
+ 031021
+ 012063
+ 204000
+ 303026 6 007004
+ 008003
+ 204007
+ 031021
+ 012001
+ 204000
+ 303027 5 007004
+ 204007
+ 031021
+ 010003
+ 204000
+ 303031 6 007004
+ 008003
+ 007021
+ 007022
+ 008012
+ 012061
+ 303032 2 020011
+ 020016
+ 303033 2 020010
+ 020016
+ 303041 8 002152
+ 002023
+ 007004
+ 011001
+ 011002
+ 002153
+ 002154
+ 012071
+ 303249 7 002252
+ 104000
+ 031001
+ 002199
+ 007004
+ 007004
+ 013003
+ 303250 8 002252
+ 002023
+ 007004
+ 011001
+ 011002
+ 002197
+ 002198
+ 012193
+ 303251 8 002252
+ 105000
+ 031001
+ 002254
+ 002251
+ 002197
+ 002198
+ 012063
+ 303252 8 002252
+ 105000
+ 031001
+ 002254
+ 002251
+ 002197
+ 002198
+ 012194
+ 304001 5 008003
+ 010004
+ 012001
+ 011001
+ 011002
+ 304002 4 008003
+ 010004
+ 011001
+ 011002
+ 304003 2 008003
+ 012001
+ 304004 4 008003
+ 010004
+ 020010
+ 012001
+ 304005 4 002024
+ 007004
+ 007004
+ 013003
+ 304006 3 014001
+ 014001
+ 014003
+ 304011 27 002163
+ 002164
+ 008012
+ 007024
+ 002057
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 008021
+ 004024
+ 110004
+ 008021
+ 004004
+ 004005
+ 004006
+ 008021
+ 004004
+ 004005
+ 004006
+ 011001
+ 011002
+ 103010
+ 002163
+ 007004
+ 012001
+ 304030 3 027031
+ 028031
+ 010031
+ 304031 3 001041
+ 001042
+ 001043
+ 304032 5 002153
+ 002154
+ 020081
+ 020082
+ 020012
+ 304033 8 002152
+ 002166
+ 002167
+ 002153
+ 002154
+ 012075
+ 012076
+ 012063
+ 304034 9 102004
+ 027001
+ 028001
+ 007022
+ 005043
+ 020010
+ 020016
+ 033003
+ 010040
+ 304228 3 005217
+ 006217
+ 007217
+ 304229 3 001208
+ 001209
+ 001210
+ 304250 27 002231
+ 002232
+ 008012
+ 007024
+ 002057
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 008021
+ 004024
+ 110004
+ 008021
+ 004004
+ 004005
+ 004006
+ 008021
+ 004004
+ 004005
+ 004006
+ 011001
+ 011002
+ 103010
+ 002231
+ 007004
+ 012001
+ 306001 5 002032
+ 102000
+ 031001
+ 007062
+ 022042
+ 306002 3 002031
+ 022004
+ 022031
+ 306003 4 002002
+ 011011
+ 011012
+ 012004
+ 306004 7 002032
+ 002033
+ 103000
+ 031001
+ 007062
+ 022043
+ 022062
+ 306005 6 002031
+ 103000
+ 031001
+ 007062
+ 022004
+ 022031
+ 306006 3 306003
+ 306002
+ 022063
+ 306007 6 001012
+ 001014
+ 306008
+ 004024
+ 027003
+ 028003
+ 306008 3 002034
+ 002035
+ 002036
+ 306023 8 001015
+ 301023
+ 301011
+ 301012
+ 022038
+ 022039
+ 022120
+ 022121
+ 307001 2 301031
+ 302011
+ 307002 2 301032
+ 302011
+ 307003 4 307001
+ 101000
+ 031001
+ 302005
+ 307004 4 307002
+ 101000
+ 031001
+ 302005
+ 307005 3 307001
+ 101004
+ 302005
+ 307006 3 307002
+ 101004
+ 302005
+ 307007 2 301031
+ 302012
+ 307008 2 301032
+ 302012
+ 307009 2 301031
+ 302013
+ 307011 16 001063
+ 002001
+ 301011
+ 301012
+ 301024
+ 007006
+ 011001
+ 011016
+ 011017
+ 011002
+ 011041
+ 007006
+ 012001
+ 012003
+ 010052
+ 020009
+ 307012 5 103000
+ 031001
+ 008023
+ 005021
+ 020001
+ 307013 8 106000
+ 031001
+ 001064
+ 008014
+ 020061
+ 008014
+ 020061
+ 020018
+ 307014 3 101000
+ 031001
+ 020019
+ 307015 8 101000
+ 031001
+ 302005
+ 008002
+ 020011
+ 020012
+ 020013
+ 020002
+ 307016 3 101000
+ 031001
+ 020020
+ 307017 3 101000
+ 031001
+ 020020
+ 307018 18 008016
+ 102000
+ 031001
+ 008017
+ 301012
+ 104000
+ 031001
+ 007006
+ 011001
+ 011002
+ 011041
+ 020009
+ 101000
+ 031001
+ 020001
+ 101000
+ 031001
+ 020019
+ 307020 3 307011
+ 307014
+ 307016
+ 307021 9 307011
+ 307012
+ 307013
+ 307014
+ 307015
+ 307016
+ 307017
+ 307018
+ 307015
+ 307030 2 015001
+ 015002
+ 307031 7 008022
+ 008023
+ 015001
+ 008023
+ 015001
+ 008023
+ 015002
+ 307041 7 301001
+ 001015
+ 301022
+ 301011
+ 301012
+ 301070
+ 307030
+ 307042 9 301001
+ 001015
+ 301022
+ 301011
+ 301012
+ 008021
+ 004025
+ 301070
+ 307031
+ 307043 7 301001
+ 001015
+ 301024
+ 301011
+ 301012
+ 301074
+ 307030
+ 308001 3 301033
+ 302011
+ 022042
+ 308002 3 301034
+ 302011
+ 022042
+ 308003 3 301035
+ 302011
+ 022042
+ 308004 3 301036
+ 302011
+ 022042
+ 308005 2 308004
+ 302024
+ 308006 8 010004
+ 010061
+ 010063
+ 011001
+ 011002
+ 012004
+ 013003
+ 022042
+ 308007 4 301055
+ 302011
+ 007062
+ 022042
+ 309001 4 301037
+ 101000
+ 031001
+ 303011
+ 309002 4 301038
+ 101000
+ 031001
+ 303011
+ 309003 4 301037
+ 101000
+ 031001
+ 303012
+ 309004 4 301038
+ 101000
+ 031001
+ 303012
+ 309005 5 301037
+ 302004
+ 101000
+ 031001
+ 303013
+ 309006 5 301038
+ 302004
+ 101000
+ 031001
+ 303013
+ 309007 5 301037
+ 302004
+ 101000
+ 031001
+ 303014
+ 309008 5 301038
+ 302004
+ 101000
+ 031001
+ 303014
+ 309011 4 301039
+ 101000
+ 031001
+ 303011
+ 309012 4 301039
+ 101000
+ 031001
+ 303012
+ 309013 5 301039
+ 302004
+ 101000
+ 031001
+ 303013
+ 309014 5 301039
+ 302004
+ 101000
+ 031001
+ 303014
+ 309015 4 301040
+ 101000
+ 031001
+ 303011
+ 309016 4 301040
+ 101000
+ 031001
+ 303012
+ 309017 5 301040
+ 302004
+ 101000
+ 031001
+ 303013
+ 309018 5 301040
+ 302004
+ 101000
+ 031001
+ 303014
+ 309019 5 301031
+ 002003
+ 101000
+ 031001
+ 303011
+ 309020 8 301031
+ 002003
+ 104000
+ 031001
+ 007003
+ 011003
+ 011004
+ 011005
+ 309030 8 015004
+ 015005
+ 104000
+ 031001
+ 004015
+ 008006
+ 007004
+ 015003
+ 309040 3 301075
+ 301076
+ 309030
+ 309042 4 307042
+ 301075
+ 301076
+ 309030
+ 309194 5 301194
+ 302004
+ 101000
+ 031001
+ 303014
+ 309195 5 301195
+ 302004
+ 101000
+ 031001
+ 303014
+ 309196 5 301196
+ 302004
+ 101000
+ 031001
+ 303014
+ 310001 5 301042
+ 303031
+ 303032
+ 101026
+ 303025
+ 310002 5 301042
+ 303031
+ 303032
+ 101009
+ 303023
+ 310003 5 301042
+ 303031
+ 303032
+ 101006
+ 303023
+ 310004 5 301042
+ 303031
+ 303032
+ 101003
+ 303024
+ 310005 6 301042
+ 303031
+ 303033
+ 101000
+ 031001
+ 303025
+ 310006 6 301042
+ 303031
+ 303033
+ 101000
+ 031001
+ 303023
+ 310007 6 301042
+ 303031
+ 303033
+ 101000
+ 031001
+ 303024
+ 310008 8 310011
+ 101019
+ 310012
+ 002150
+ 025079
+ 025080
+ 033032
+ 014045
+ 310009 3 310011
+ 101015
+ 310012
+ 310010 3 310011
+ 101005
+ 310012
+ 310011 45 008070
+ 001033
+ 001034
+ 008070
+ 001033
+ 001034
+ 001007
+ 002048
+ 005040
+ 025075
+ 201133
+ 005041
+ 201000
+ 005043
+ 025070
+ 033030
+ 033031
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 005001
+ 006001
+ 202126
+ 007001
+ 202000
+ 007024
+ 005021
+ 007025
+ 005022
+ 033033
+ 002151
+ 012064
+ 002151
+ 012064
+ 002151
+ 012064
+ 002151
+ 012064
+ 310012 10 002150
+ 025076
+ 025077
+ 025078
+ 033032
+ 201132
+ 202129
+ 012063
+ 202000
+ 201000
+ 310013 62 001007 Satellite ID
+ 005040 Orbit number
+ 004001 Year
+ 004002 Month
+ 004003 Day
+ 004004 Hour
+ 004005 Minute
+ 004006 Second
+ 005001 Latitude
+ 006001 Longitude
+ 007025 Solar zenith angle
+ 005043 Field of view number
+ 025085 Fraction of clear pixels in HIRS field of view
+ 201131 Change width
+ 202129 Change scale
+ 002150 TOVS/ATOVS/AVHRR instrumentation channel number
+ 008023 First order statistics
+ 008072 Pixel(s) type
+ 014027 Albedo
+ 008072 Pixel(s) type
+ 014027 Albedo
+ 002150 TOVS/ATOVS/AVHRR instrumentation channel number
+ 008023 First order statistics
+ 008072 Pixel(s) type
+ 014027 Albedo
+ 008072 Pixel(s) type
+ 014027 Albedo
+ 002150 ATOVS/AVHRR instrumentation channel number
+ 008023 First order statistics
+ 008072 Pixel(s) type
+ 014027 Albedo
+ 008072 Pixel(s) type
+ 014027 Albedo
+ 202000 Change scale
+ 201000 Change width
+ 201132 Change width
+ 202129 Change scale
+ 002150 ATOVS/AVHRR instrumentation channel number
+ 008023 First order statistics
+ 008072 Pixel(s) type
+ 012063 Brightness temperature
+ 008072 Pixel(s) type
+ 012063 Brightness temperature
+ 002150 ATOVS/AVHRR instrumentation channel number
+ 008023 First order statistics
+ 008072 Pixel(s) type
+ 012063 Brightness temperature
+ 008072 Pixel(s) type
+ 012063 Brightness temperature
+ 008023 First order statistics
+ 008072 Pixel(s) type
+ 012063 Brightness temperature
+ 008072 Pixel(s) type
+ 012063 Brightness temperature
+ 002150 ATOVS/AVHRR instrumentation channel number
+ 008023 First order statistics
+ 008072 Pixel(s) type
+ 012063 Brightness temperature
+ 008072 Pixel(s) type
+ 012063 Brightness temperature
+ 202000 Change scale
+ 201000 Change width
+ 310014 3 301072 Satellite geostationary wind data
+ 303041
+ 304011
+ 310015 13 301072 Meteosat radiance data
+ 007024
+ 010002
+ 303041
+ 101003
+ 304032
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101003
+ 304033
+ 310016 13 301072 Meteosat second generation radiance data
+ 007024
+ 010002
+ 303041
+ 101012
+ 304032
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101012
+ 304033
+ 310020 6 310022
+ 301011
+ 301013
+ 301021
+ 304034
+ 310021
+ 310021 10 108000
+ 031001
+ 201131
+ 202129
+ 007004
+ 007004
+ 202000
+ 201000
+ 015020
+ 010002
+ 310022 4 001007
+ 002019
+ 001033
+ 002172
+ 310023 17 301072
+ 030021
+ 030022
+ 008012
+ 007024
+ 007025
+ 010002
+ 101012
+ 304032
+ 105002
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101012
+ 304033
+ 310024 17 301072
+ 030021
+ 030022
+ 008012
+ 007024
+ 007025
+ 010002
+ 101003
+ 304032
+ 105002
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101003
+ 304033
+ 310050 14 310051
+ 310052
+ 101000
+ 031002
+ 310053
+ 101004
+ 310054
+ 020010
+ 310052
+ 101015
+ 310053
+ 310052
+ 101004
+ 310053
+ 310051 16 001007
+ 005040
+ 201133
+ 005041
+ 201000
+ 201132
+ 025070
+ 201000
+ 202126
+ 007001
+ 202000
+ 007025
+ 005022
+ 102009
+ 002151
+ 012064
+ 310052 12 002019
+ 301011
+ 301012
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 301021
+ 007024
+ 005021
+ 005043
+ 310053 6 201134
+ 005042
+ 201000
+ 025076
+ 033032
+ 012163
+ 310054 13 201134
+ 005042
+ 201000
+ 025076
+ 033032
+ 201131
+ 202129
+ 102002
+ 008023
+ 014027
+ 008023
+ 202000
+ 201000
+ 310055 8 310051
+ 310052
+ 102020
+ 025076
+ 025051
+ 101000
+ 031002
+ 025050
+ 310193 5 301250
+ 303250
+ 302250
+ 303249
+ 303251
+ 310194 5 301250
+ 303250
+ 302250
+ 303249
+ 303252
+ 310195 3 301250
+ 303250
+ 304250
+ 310196 3 301250
+ 303249
+ 303251
+ 311001 9 301051
+ 007002
+ 012001
+ 011001
+ 011002
+ 011031
+ 011032
+ 011033
+ 020041
+ 311002 4 301065
+ 301066
+ 311003
+ 311004
+ 311003 5 010070
+ 011001
+ 011002
+ 012001
+ 013002
+ 311004 18 101000
+ 031000
+ 011034
+ 101000
+ 031000
+ 011035
+ 101000
+ 031000
+ 011075
+ 101000
+ 031000
+ 011076
+ 101000
+ 031000
+ 033025
+ 101000
+ 031000
+ 033026
+ 311193 16 301197
+ 301011
+ 301012
+ 301023
+ 008004
+ 007004
+ 008021
+ 011001
+ 011002
+ 011031
+ 011034
+ 011035
+ 012001
+ 012003
+ 013003
+ 020041
+ 312001 2 301043
+ 304001
+ 312002 2 301043
+ 304002
+ 312003 2 301042
+ 304003
+ 312004 2 301042
+ 304004
+ 312005 2 301042
+ 020014
+ 312006 2 301044
+ 304005
+ 312007 2 301042
+ 304006
+ 312010 6 001007
+ 005040
+ 002021
+ 005041
+ 004001
+ 004043
+ 312011 9 202131
+ 201149
+ 004006
+ 201000
+ 202126
+ 010002
+ 202000
+ 005043
+ 005053
+ 312012 6 202129
+ 201132
+ 101019
+ 012063
+ 201000
+ 202000
+ 312013 6 005033
+ 202129
+ 201135
+ 012063
+ 201000
+ 202000
+ 312014 8 312010
+ 312011
+ 105056
+ 301023
+ 005042
+ 005052
+ 312012
+ 312013
+ 312015 10 109011
+ 301023
+ 005042
+ 005052
+ 202129
+ 201132
+ 101004
+ 012063
+ 202000
+ 201000
+ 312016 3 312010
+ 312011
+ 312015
+ 312017 10 109008
+ 301023
+ 005042
+ 005052
+ 202129
+ 201132
+ 101003
+ 012063
+ 202000
+ 201000
+ 312018 3 312010
+ 312011
+ 312017
+ 312020 11 301047
+ 301048
+ 015015
+ 029002
+ 021076
+ 104012
+ 006030
+ 102012
+ 005030
+ 021075
+ 021066
+ 312021 6 301047
+ 101003
+ 301049
+ 011012
+ 011011
+ 021067
+ 312022 15 301047
+ 008022
+ 011012
+ 011050
+ 022070
+ 022026
+ 312041
+ 010050
+ 021068
+ 021071
+ 021072
+ 021073
+ 312042
+ 021062
+ 015011
+ 312023 7 301047
+ 103003
+ 008022
+ 012061
+ 022050
+ 021069
+ 021085
+ 312024 11 312020
+ 008060
+ 008022
+ 008060
+ 008022
+ 025014
+ 022101
+ 022097
+ 022098
+ 022099
+ 022100
+ 312026 19 301046 SeaWinds 25km data::SeaWinds header information
+ 301011 Date information
+ 301013 Time information
+ 301023 Position information
+ 312031 SeaWinds WVC information
+ 101004 *** replicate 1 descriptor 4 times
+ 312030 SeaWinds ambiguous wind data
+ 021110 NUMBER OF INNER-BEAM SIGMA-0 (FORWARD OF SATELLITE)
+ 301023 Position information
+ 321027 SeaWinds Sigma-0 data
+ 021111 NUMBER OF OUTER-BEAM SIGMA-0 (FORWARD OF SATELLITE)
+ 301023 Position information
+ 321027 SeaWinds Sigma-0 data
+ 021112 NUMBER OF INNER-BEAM SIGMA-0 (AFT OF SATELLITE)
+ 301023 Position information
+ 321027 SeaWinds Sigma-0 data
+ 021113 NUMBER OF OUTER-BEAM SIGMA-0 (AFT OF SATELLITE)
+ 301023 Position information
+ 321027 SeaWinds Sigma-0 data
+ 312027 9 301047
+ 105009
+ 301023
+ 007021
+ 012061
+ 007021
+ 012061
+ 021085
+ 021070
+ 312028 26 301046
+ 301011
+ 301013
+ 301023
+ 008025
+ 201136
+ 004006
+ 201000
+ 312031
+ 312032
+ 101004
+ 312030
+ 101002
+ 312033
+ 021110
+ 301023
+ 321028
+ 021111
+ 301023
+ 321028
+ 021112
+ 301023
+ 321028
+ 021113
+ 301023
+ 321028
+ 312030 13 201130 SeaWinds ambiguous wind data::*** increase data width by 2 bits
+ 202129 *** increase scaling by 10^1
+ 011012 WIND SPEED AT 10 M
+ 202000 *** cancel change scaling
+ 201000 *** cancel change data width
+ 011052 FORMAL UNCERTAINTY IN WIND SPEED
+ 201135 *** increase data width by 7 bits
+ 202130 *** increase scaling by 10^2
+ 011011 WIND DIRECTION AT 10 M
+ 202000 *** cancel change scaling
+ 201000 *** cancel change data width
+ 011053 FORMAL UNCERTAINTY IN WIND DIRECTION
+ 021104 LIKELIHOOD COMPUTED FOR SOLUTION
+ 312031 8 005034 SeaWinds WVC information::ALONG TRACK ROW NUMBER
+ 006034 CROSS TRACK CELL NUMBER
+ 021109 QSCAT WIND VECTOR CELL QUALITY FLAG
+ 011081 MODEL WIND DIRECTION AT 10 M
+ 011082 MODEL WIND SPEED AT 10 M
+ 021101 NUMBER OF VECTOR AMBIGUITIES
+ 021102 INDEX OF SELECTED WIND VECTOR
+ 021103 TOTAL NUMBER OF SIGMA-0 MEASUREMENTS
+ 312032 4 021120
+ 021121
+ 013055
+ 021122
+ 312033 4 002104
+ 008022
+ 012063
+ 012065
+ 312041 5 201141
+ 202130
+ 007001
+ 201000
+ 202000
+ 312042 6 021077
+ 021078
+ 021079
+ 021080
+ 021081
+ 021082
+ 312200 10 301237
+ 301238
+ 029002
+ 021206
+ 104012
+ 006232
+ 102012
+ 005232
+ 021205
+ 021196
+ 312201 6 301237
+ 101003
+ 301239
+ 011012
+ 011011
+ 021197
+ 312202 13 301237
+ 008022
+ 011012
+ 011050
+ 301240
+ 022243
+ 301241
+ 010050
+ 021198
+ 021201
+ 021202
+ 021203
+ 301242
+ 312203 8 301237
+ 008022
+ 012061
+ 022050
+ 021204
+ 021199
+ 021214
+ 021215
+ 312204 12 312201
+ 001031
+ 011012
+ 011011
+ 021200
+ 021213
+ 004004
+ 008021
+ 004024
+ 055003
+ 011012
+ 011011
+ 312207 3 312202
+ 301202
+ 033191
+ 312208 17 301202
+ 008022
+ 008021
+ 301011
+ 301013
+ 301023
+ 302205
+ 011002
+ 001007
+ 002021
+ 301011
+ 301013
+ 301023
+ 001032
+ 001192
+ 302205
+ 011002
+ 312209 11 301202
+ 001192
+ 301011
+ 301013
+ 301023
+ 302206
+ 104000
+ 022192
+ 102000
+ 005232
+ 022191
+ 312210 13 312202
+ 021192
+ 015202
+ 301011
+ 004004
+ 004005
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 304228
+ 304229
+ 312211 19 301046 SeaWinds 50km data::SeaWinds header information
+ 301011 Date information
+ 301013 Time information
+ 301023 Position information
+ 312031 SeaWinds WVC information
+ 101004 *** replicate 1 descriptor 4 times
+ 312030 SeaWinds ambiguous wind data
+ 021110 NUMBER OF INNER-BEAM SIGMA-0 (FORWARD OF SATELLITE)
+ 101004 *** replicate 1 descriptor 4 times
+ 312212 SeaWinds Sigma-0 position and data
+ 021111 NUMBER OF OUTER-BEAM SIGMA-0 (FORWARD OF SATELLITE)
+ 101004 *** replicate 1 descriptor 4 times
+ 312212 SeaWinds Sigma-0 position and data
+ 021112 NUMBER OF INNER-BEAM SIGMA-0 (AFT OF SATELLITE)
+ 101004 *** replicate 1 descriptor 4 times
+ 312212 SeaWinds Sigma-0 position and data
+ 021113 NUMBER OF OUTER-BEAM SIGMA-0 (AFT OF SATELLITE)
+ 101004 *** replicate 1 descriptor 4 times
+ 312212 SeaWinds Sigma-0 position and data
+ 312212 2 301023
+ 321027
+ 313009 4 021001
+ 101000
+ 031001
+ 021001
+ 313010 4 021036
+ 101000
+ 031001
+ 021036
+ 313031 5 006002
+ 006012
+ 101000
+ 031002
+ 030001
+ 313032 5 005002
+ 005012
+ 101000
+ 031002
+ 313031
+ 313041 13 006002
+ 110000
+ 031001
+ 104000
+ 031001
+ 006012
+ 101000
+ 031012
+ 030001
+ 006012
+ 101000
+ 031001
+ 030001
+ 313042 5 005002
+ 005012
+ 101000
+ 031002
+ 313041
+ 313043 16 006002
+ 005002
+ 005012
+ 112000
+ 031001
+ 110000
+ 031001
+ 104000
+ 031001
+ 006012
+ 101000
+ 031011
+ 030001
+ 101000
+ 031001
+ 030001
+ 315001 5 001011
+ 301011
+ 301012
+ 301023
+ 306001
+ 315002 5 001011
+ 301011
+ 301012
+ 301023
+ 306004
+ 316001 10 301011
+ 004004
+ 301023
+ 001021
+ 002041
+ 019001
+ 010051
+ 019002
+ 019003
+ 019004
+ 316002 15 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 001033
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 007002
+ 007002
+ 316003 12 110000
+ 031001
+ 008011
+ 008007
+ 104000
+ 031001
+ 005002
+ 006002
+ 010002
+ 011002
+ 008007
+ 008011
+ 316004 13 111000
+ 031001
+ 008011
+ 008007
+ 007002
+ 007002
+ 102000
+ 031001
+ 005002
+ 006002
+ 011031
+ 008007
+ 008011
+ 316005 10 108000
+ 031001
+ 008005
+ 008007
+ 005002
+ 006002
+ 001026
+ 019001
+ 008007
+ 008005
+ 316006 14 112000
+ 031001
+ 008011
+ 008007
+ 007002
+ 007002
+ 102000
+ 031001
+ 005002
+ 006002
+ 020011
+ 020012
+ 008007
+ 008011
+ 316007 12 110000
+ 031001
+ 008011
+ 008007
+ 104000
+ 031001
+ 005002
+ 006002
+ 019005
+ 019006
+ 008007
+ 008011
+ 316008 13 111000
+ 031001
+ 008001
+ 008007
+ 008023
+ 103000
+ 031001
+ 005002
+ 006002
+ 010002
+ 008023
+ 008007
+ 008001
+ 316009 13 111000
+ 031001
+ 008011
+ 008007
+ 007002
+ 007002
+ 102000
+ 031001
+ 005002
+ 006002
+ 020041
+ 008007
+ 008011
+ 316010 9 107000
+ 031001
+ 008011
+ 008007
+ 001022
+ 005002
+ 006002
+ 008007
+ 008011
+ 316011 19 116000
+ 031001
+ 008011
+ 001022
+ 008007
+ 102000
+ 031001
+ 005002
+ 006002
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 020090
+ 008021
+ 008007
+ 008011
+ 318001 2 301025
+ 024011
+ 318003 4 301026
+ 024005
+ 024004
+ 024021
+ 318004 6 301025
+ 004023
+ 013011
+ 024005
+ 024004
+ 024022
+ 321001 6 002101
+ 002114
+ 002105
+ 002106
+ 002107
+ 002121
+ 321003 4 021051
+ 021014
+ 021017
+ 021030
+ 321004 5 301031
+ 002003
+ 101000
+ 031001
+ 321003
+ 321005 12 025004
+ 002121
+ 002122
+ 002123
+ 002124
+ 002125
+ 002126
+ 002127
+ 002128
+ 002129
+ 002130
+ 002131
+ 321006 4 025001
+ 025002
+ 025003
+ 025005
+ 321007 8 025009
+ 025010
+ 025011
+ 025012
+ 025013
+ 025015
+ 025016
+ 025017
+ 321008 3 025006
+ 025007
+ 025008
+ 321009 2 025018
+ 025019
+ 321010 13 002101
+ 007002
+ 002102
+ 002103
+ 002104
+ 002105
+ 002106
+ 002107
+ 002108
+ 002109
+ 002110
+ 002132
+ 002133
+ 321011 3 030031
+ 030032
+ 029002
+ 321012 3 101000
+ 031001
+ 002135
+ 321021 15 002003
+ 002101
+ 201130
+ 002106
+ 201000
+ 201132
+ 202130
+ 002121
+ 202000
+ 201000
+ 201133
+ 202129
+ 025001
+ 202000
+ 201000
+ 321022 11 010007
+ 204001
+ 031021
+ 011001
+ 204000
+ 011002
+ 204001
+ 031021
+ 011006
+ 204000
+ 021030
+ 321023 9 007007
+ 021091
+ 021030
+ 202129
+ 021014
+ 201129
+ 021017
+ 202000
+ 201000
+ 321024 7 007007
+ 204002
+ 031021
+ 012007
+ 011006
+ 204000
+ 021030
+ 321025 17 007007
+ 021091
+ 021030
+ 202129
+ 021014
+ 201129
+ 021017
+ 202000
+ 201000
+ 021092
+ 021030
+ 025092
+ 201129
+ 202129
+ 021017
+ 202000
+ 201000
+ 321026 10 010007
+ 204001
+ 031021
+ 012007
+ 025091
+ 011071
+ 011072
+ 011073
+ 011074
+ 204000
+ 321027 18 021118 SeaWinds Sigma-0 data::ATTENUATION CORRECTION ON SIGMA-0
+ 202129 *** increase scaling by 10^1
+ 201132 *** increase data width by 4 bits
+ 002112 RADAR LOOK ANGLE
+ 201000 *** cancel change data width
+ 201131 *** increase data width by 3 bits
+ 002111 RADAR INCIDENCE ANGLE
+ 201000 *** cancel change data width
+ 202000 *** cancel change scaling
+ 002104 ANTENNA POLARISATION
+ 021105 NORMALIZED RADAR CROSS SECTION
+ 021106 Kp VARIANCE COEFFICIENT (ALPHA)
+ 021107 Kp VARIANCE COEFFICIENT (BETA)
+ 021114 Kp VARIANCE COEFFICIENT (GAMMA)
+ 021115 SEAWINDS SIGMA-0 QUALITY FLAG
+ 021116 SEAWINDS SIGMA-0 MODE FLAG
+ 008018 SEAWINDS LAND/ICE SURFACE FLAG
+ 021117 SIGMA-0 VARIANCE QUALITY CONTROL
+ 321028 18 021118 SeaWinds Sigma-0 data::ATTENUATION CORRECTION ON SIGMA-0
+ 202129
+ 201132 *** increase data width by 4 bits
+ 002112 RADAR LOOK ANGLE
+ 201000 *** cancel change data width
+ 201131 *** increase data width by 3 bits
+ 002111 RADAR INCIDENCE ANGLE
+ 201000 *** cancel change data width
+ 202000 *** cancel change scaling
+ 002104 ANTENNA POLARISATION
+ 021123 SeaWinds NORMALIZED RADAR CROSS SECTION
+ 021106 Kp VARIANCE COEFFICIENT (ALPHA)
+ 021107 Kp VARIANCE COEFFICIENT (BETA)
+ 021114 Kp VARIANCE COEFFICIENT (GAMMA)
+ 021115 SEAWINDS SIGMA-0 QUALITY FLAG
+ 021116 SEAWINDS SIGMA-0 MODE FLAG
+ 008018 SEAWINDS LAND/ICE SURFACE FLAG
+ 021117
diff --git a/bufrtables/D0000000000098006001.TXT b/bufrtables/D0000000000098006001.TXT
new file mode 100755
index 0000000..7df875d
--- /dev/null
+++ b/bufrtables/D0000000000098006001.TXT
@@ -0,0 +1,2102 @@
+ 300002 2 000002
+ 000003
+ 300003 3 000010
+ 000011
+ 000012
+ 300004 9 300003
+ 000013
+ 000014
+ 000015
+ 000016
+ 000017
+ 000018
+ 000019
+ 000020
+ 300010 4 300003
+ 101000
+ 031001
+ 000030
+ 301001 2 001001
+ 001002
+ 301002 3 001003
+ 001004
+ 001005
+ 301003 3 001011
+ 001012
+ 001013
+ 301011 3 004001
+ 004002
+ 004003
+ 301012 2 004004
+ 004005
+ 301013 3 004004
+ 004005
+ 004006
+ 301021 2 005001
+ 006001
+ 301022 3 005001
+ 006001
+ 007001
+ 301023 2 005002
+ 006002
+ 301024 3 005002
+ 006002
+ 007001
+ 301025 3 301023
+ 004003
+ 301012
+ 301026 7 301021
+ 004003
+ 004003
+ 004004
+ 004004
+ 004005
+ 004005
+ 301029 3 001018
+ 002001
+ 301011
+ 301030 4 001018
+ 002001
+ 301011
+ 301024
+ 301031 5 301001
+ 002001
+ 301011
+ 301012
+ 301022
+ 301032 5 301001
+ 002001
+ 301011
+ 301012
+ 301024
+ 301033 5 001005
+ 002001
+ 301011
+ 301012
+ 301021
+ 301034 5 001005
+ 002001
+ 301011
+ 301012
+ 301023
+ 301035 7 001005
+ 001012
+ 001013
+ 002001
+ 301011
+ 301012
+ 301023
+ 301036 5 301003
+ 002001
+ 301011
+ 301012
+ 301023
+ 301037 6 301001
+ 002011
+ 002012
+ 301011
+ 301012
+ 301022
+ 301038 6 301001
+ 002011
+ 002012
+ 301011
+ 301012
+ 301024
+ 301039 6 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 301040 6 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301024
+ 301041 5 001007
+ 002021
+ 002022
+ 301011
+ 301012
+ 301042 2 301041
+ 301021
+ 301043 5 001007
+ 002023
+ 301011
+ 301013
+ 301021
+ 301044 5 001007
+ 002024
+ 301011
+ 301013
+ 301021
+ 301045 9 301011
+ 301012
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 304030
+ 304031
+ 301046 10 001007
+ 001012
+ 002048
+ 021119
+ 025060
+ 202124
+ 002026
+ 002027
+ 202000
+ 005040
+ 301047 15 001007
+ 025060
+ 001033
+ 001034
+ 001012
+ 301045
+ 002021
+ 301011
+ 301012
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 301023
+ 301048 14 002104
+ 002121
+ 002113
+ 002026
+ 002027
+ 002111
+ 002140
+ 202127
+ 001013
+ 202126
+ 007001
+ 202000
+ 025010
+ 021064
+ 301049 5 002111
+ 002112
+ 021062
+ 021063
+ 021065
+ 301051 6 001006
+ 002061
+ 301011
+ 301012
+ 301021
+ 008004
+ 301055 7 001005
+ 002001
+ 301011
+ 301012
+ 301021
+ 001012
+ 001014
+ 301062 3 101000
+ 031001
+ 301001
+ 301065 8 001006
+ 001008
+ 002001
+ 002002
+ 002005
+ 002062
+ 002070
+ 002065
+ 301066 6 301011
+ 301013
+ 301023
+ 007004
+ 002064
+ 008004
+ 301070 3 002143
+ 002142
+ 002144
+ 301071 5 001007
+ 001031
+ 002020
+ 002028
+ 002029
+ 301072 4 301071
+ 301011
+ 301013
+ 301021
+ 301074 4 002143
+ 002142
+ 002145
+ 002146
+ 301075 6 301001
+ 001015
+ 301022
+ 008021
+ 301011
+ 301012
+ 301076 3 002011
+ 002143
+ 002142
+ 301193 5 001007
+ 001031
+ 002196
+ 002221
+ 002222
+ 301194 9 001194
+ 001012
+ 001013
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301195 9 001195
+ 001012
+ 001013
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301196 7 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301197 9 001006
+ 001008
+ 002061
+ 002062
+ 002002
+ 002005
+ 002070
+ 002063
+ 002001
+ 301198 9 001011
+ 001012
+ 001013
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301200 2 001032
+ 033194
+ 301201 2 101003
+ 033193
+ 301202 2 001031
+ 001032
+ 301237 12 001007
+ 001012
+ 002021
+ 301011
+ 004004
+ 004005
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 301023
+ 301238 14 002104
+ 002121
+ 002113
+ 002026
+ 002027
+ 002111
+ 002192
+ 202127
+ 001013
+ 202126
+ 007001
+ 202000
+ 025010
+ 021194
+ 301239 5 002111
+ 002112
+ 021192
+ 021193
+ 021195
+ 301240 5 201131
+ 202129
+ 022021
+ 201000
+ 202000
+ 301241 5 201141
+ 202130
+ 007001
+ 201000
+ 202000
+ 301242 6 021207
+ 021208
+ 021209
+ 021210
+ 021211
+ 021212
+ 301250 4 301193
+ 301011
+ 301013
+ 301021
+ 302001 4 010004
+ 010051
+ 010061
+ 010063
+ 302002 5 010004
+ 007004
+ 010003
+ 010061
+ 010063
+ 302003 9 011011
+ 011012
+ 012004
+ 012006
+ 013003
+ 020001
+ 020003
+ 020004
+ 020005
+ 302004 7 020010
+ 008002
+ 020011
+ 020013
+ 020012
+ 020012
+ 020012
+ 302005 4 008002
+ 020011
+ 020012
+ 020013
+ 302006 4 010004
+ 010051
+ 010062
+ 010063
+ 302011 3 302001
+ 302003
+ 302004
+ 302012 3 302002
+ 302003
+ 302004
+ 302013 5 302006
+ 302003
+ 101000
+ 031001
+ 302005
+ 302021 3 022001
+ 022011
+ 022021
+ 302022 3 022002
+ 022012
+ 022022
+ 302023 3 022003
+ 022013
+ 022023
+ 302024 3 302022
+ 101002
+ 302023
+ 302051 12 010004
+ 010051
+ 007004
+ 010003
+ 012004
+ 012051
+ 012016
+ 012017
+ 013004
+ 102004
+ 008051
+ 008020
+ 302205 5 201131
+ 202129
+ 022021
+ 201000
+ 202000
+ 302206 9 302205
+ 201130
+ 202129
+ 022011
+ 201000
+ 202000
+ 022001
+ 011001
+ 011002
+ 302207 5 022193
+ 022194
+ 022195
+ 022196
+ 022197
+ 302250 5 102000
+ 031001
+ 020193
+ 020194
+ 020012
+ 303001 3 007003
+ 011001
+ 011002
+ 303002 3 007004
+ 011001
+ 011002
+ 303003 4 007004
+ 010003
+ 012001
+ 012003
+ 303004 6 007004
+ 010003
+ 012001
+ 012003
+ 011001
+ 011002
+ 303011 4 007003
+ 008001
+ 011001
+ 011002
+ 303012 4 007004
+ 008001
+ 011001
+ 011002
+ 303013 7 007004
+ 008001
+ 010003
+ 012001
+ 013003
+ 011001
+ 011002
+ 303014 7 007004
+ 008001
+ 010003
+ 012001
+ 012003
+ 011001
+ 011002
+ 303021 4 007004
+ 007004
+ 204007
+ 031021
+ 303022 3 303021
+ 010003
+ 204000
+ 303023 3 303021
+ 012001
+ 204000
+ 303024 3 303021
+ 013016
+ 204000
+ 303025 5 002025
+ 204007
+ 031021
+ 012063
+ 204000
+ 303026 6 007004
+ 008003
+ 204007
+ 031021
+ 012001
+ 204000
+ 303027 5 007004
+ 204007
+ 031021
+ 010003
+ 204000
+ 303031 6 007004
+ 008003
+ 007021
+ 007022
+ 008012
+ 012061
+ 303032 2 020011
+ 020016
+ 303033 2 020010
+ 020016
+ 303041 8 002152
+ 002023
+ 007004
+ 011001
+ 011002
+ 002153
+ 002154
+ 012071
+ 303249 7 002252
+ 104000
+ 031001
+ 002199
+ 007004
+ 007004
+ 013003
+ 303250 8 002252
+ 002023
+ 007004
+ 011001
+ 011002
+ 002197
+ 002198
+ 012193
+ 303251 8 002252
+ 105000
+ 031001
+ 002254
+ 002251
+ 002197
+ 002198
+ 012063
+ 303252 8 002252
+ 105000
+ 031001
+ 002254
+ 002251
+ 002197
+ 002198
+ 012194
+ 304001 5 008003
+ 010004
+ 012001
+ 011001
+ 011002
+ 304002 4 008003
+ 010004
+ 011001
+ 011002
+ 304003 2 008003
+ 012001
+ 304004 4 008003
+ 010004
+ 020010
+ 012001
+ 304005 4 002024
+ 007004
+ 007004
+ 013003
+ 304006 3 014001
+ 014001
+ 014003
+ 304011 27 002163
+ 002164
+ 008012
+ 007024
+ 002057
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 008021
+ 004024
+ 110004
+ 008021
+ 004004
+ 004005
+ 004006
+ 008021
+ 004004
+ 004005
+ 004006
+ 011001
+ 011002
+ 103010
+ 002163
+ 007004
+ 012001
+ 304030 3 027031
+ 028031
+ 010031
+ 304031 3 001041
+ 001042
+ 001043
+ 304032 5 002153
+ 002154
+ 020081
+ 020082
+ 020012
+ 304033 8 002152
+ 002166
+ 002167
+ 002153
+ 002154
+ 012075
+ 012076
+ 012063
+ 304034 9 102004
+ 027001
+ 028001
+ 007022
+ 005043
+ 020010
+ 020016
+ 033003
+ 010040
+ 304228 3 005217
+ 006217
+ 007217
+ 304229 3 001208
+ 001209
+ 001210
+ 304250 27 002231
+ 002232
+ 008012
+ 007024
+ 002057
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 008021
+ 004024
+ 110004
+ 008021
+ 004004
+ 004005
+ 004006
+ 008021
+ 004004
+ 004005
+ 004006
+ 011001
+ 011002
+ 103010
+ 002231
+ 007004
+ 012001
+ 306001 5 002032
+ 102000
+ 031001
+ 007062
+ 022042
+ 306002 3 002031
+ 022004
+ 022031
+ 306003 4 002002
+ 011011
+ 011012
+ 012004
+ 306004 7 002032
+ 002033
+ 103000
+ 031001
+ 007062
+ 022043
+ 022062
+ 306005 6 002031
+ 103000
+ 031001
+ 007062
+ 022004
+ 022031
+ 306006 3 306003
+ 306002
+ 022063
+ 306007 6 001012
+ 001014
+ 306008
+ 004024
+ 027003
+ 028003
+ 306008 3 002034
+ 002035
+ 002036
+ 306023 8 001015
+ 301023
+ 301011
+ 301012
+ 022038
+ 022039
+ 022120
+ 022121
+ 307001 2 301031
+ 302011
+ 307002 2 301032
+ 302011
+ 307003 4 307001
+ 101000
+ 031001
+ 302005
+ 307004 4 307002
+ 101000
+ 031001
+ 302005
+ 307005 3 307001
+ 101004
+ 302005
+ 307006 3 307002
+ 101004
+ 302005
+ 307007 2 301031
+ 302012
+ 307008 2 301032
+ 302012
+ 307009 2 301031
+ 302013
+ 307011 16 001063
+ 002001
+ 301011
+ 301012
+ 301024
+ 007006
+ 011001
+ 011016
+ 011017
+ 011002
+ 011041
+ 007006
+ 012001
+ 012003
+ 010052
+ 020009
+ 307012 5 103000
+ 031001
+ 008023
+ 005021
+ 020001
+ 307013 8 106000
+ 031001
+ 001064
+ 008014
+ 020061
+ 008014
+ 020061
+ 020018
+ 307014 3 101000
+ 031001
+ 020019
+ 307015 8 101000
+ 031001
+ 302005
+ 008002
+ 020011
+ 020012
+ 020013
+ 020002
+ 307016 3 101000
+ 031001
+ 020020
+ 307017 3 101000
+ 031001
+ 020020
+ 307018 18 008016
+ 102000
+ 031001
+ 008017
+ 301012
+ 104000
+ 031001
+ 007006
+ 011001
+ 011002
+ 011041
+ 020009
+ 101000
+ 031001
+ 020001
+ 101000
+ 031001
+ 020019
+ 307020 3 307011
+ 307014
+ 307016
+ 307021 9 307011
+ 307012
+ 307013
+ 307014
+ 307015
+ 307016
+ 307017
+ 307018
+ 307015
+ 307030 2 015001
+ 015002
+ 307031 7 008022
+ 008023
+ 015001
+ 008023
+ 015001
+ 008023
+ 015002
+ 307041 7 301001
+ 001015
+ 301022
+ 301011
+ 301012
+ 301070
+ 307030
+ 307042 9 301001
+ 001015
+ 301022
+ 301011
+ 301012
+ 008021
+ 004025
+ 301070
+ 307031
+ 307043 7 301001
+ 001015
+ 301024
+ 301011
+ 301012
+ 301074
+ 307030
+ 307060 2 007061
+ 012030
+ 307061 3 301031
+ 101005
+ 307060
+ 307062 3 301032
+ 101005
+ 307060
+ 307063 2 007061
+ 012130
+ 308001 3 301033
+ 302011
+ 022042
+ 308002 3 301034
+ 302011
+ 022042
+ 308003 3 301035
+ 302011
+ 022042
+ 308004 3 301036
+ 302011
+ 022042
+ 308005 2 308004
+ 302024
+ 308006 8 010004
+ 010061
+ 010063
+ 011001
+ 011002
+ 012004
+ 013003
+ 022042
+ 308007 4 301055
+ 302011
+ 007062
+ 022042
+ 309001 4 301037
+ 101000
+ 031001
+ 303011
+ 309002 4 301038
+ 101000
+ 031001
+ 303011
+ 309003 4 301037
+ 101000
+ 031001
+ 303012
+ 309004 4 301038
+ 101000
+ 031001
+ 303012
+ 309005 5 301037
+ 302004
+ 101000
+ 031001
+ 303013
+ 309006 5 301038
+ 302004
+ 101000
+ 031001
+ 303013
+ 309007 5 301037
+ 302004
+ 101000
+ 031001
+ 303014
+ 309008 5 301038
+ 302004
+ 101000
+ 031001
+ 303014
+ 309011 4 301039
+ 101000
+ 031001
+ 303011
+ 309012 4 301039
+ 101000
+ 031001
+ 303012
+ 309013 5 301039
+ 302004
+ 101000
+ 031001
+ 303013
+ 309014 5 301039
+ 302004
+ 101000
+ 031001
+ 303014
+ 309015 4 301040
+ 101000
+ 031001
+ 303011
+ 309016 4 301040
+ 101000
+ 031001
+ 303012
+ 309017 5 301040
+ 302004
+ 101000
+ 031001
+ 303013
+ 309018 5 301040
+ 302004
+ 101000
+ 031001
+ 303014
+ 309019 5 301031
+ 002003
+ 101000
+ 031001
+ 303011
+ 309020 8 301031
+ 002003
+ 104000
+ 031001
+ 007003
+ 011003
+ 011004
+ 011005
+ 309030 8 015004
+ 015005
+ 104000
+ 031001
+ 004015
+ 008006
+ 007004
+ 015003
+ 309040 3 301075
+ 301076
+ 309030
+ 309042 4 307042
+ 301075
+ 301076
+ 309030
+ 309194 5 301194
+ 302004
+ 101000
+ 031001
+ 303014
+ 309195 5 301195
+ 302004
+ 101000
+ 031001
+ 303014
+ 309196 5 301196
+ 302004
+ 101000
+ 031001
+ 303014
+ 309198 5 301198
+ 302004
+ 101000
+ 031001
+ 303014
+ 310001 5 301042
+ 303031
+ 303032
+ 101026
+ 303025
+ 310002 5 301042
+ 303031
+ 303032
+ 101009
+ 303023
+ 310003 5 301042
+ 303031
+ 303032
+ 101006
+ 303023
+ 310004 5 301042
+ 303031
+ 303032
+ 101003
+ 303024
+ 310005 6 301042
+ 303031
+ 303033
+ 101000
+ 031001
+ 303025
+ 310006 6 301042
+ 303031
+ 303033
+ 101000
+ 031001
+ 303023
+ 310007 6 301042
+ 303031
+ 303033
+ 101000
+ 031001
+ 303024
+ 310008 8 310011
+ 101019
+ 310012
+ 002150
+ 025079
+ 025080
+ 033032
+ 014045
+ 310009 3 310011
+ 101015
+ 310012
+ 310010 3 310011
+ 101005
+ 310012
+ 310011 45 008070
+ 001033
+ 001034
+ 008070
+ 001033
+ 001034
+ 001007
+ 002048
+ 005040
+ 025075
+ 201133
+ 005041
+ 201000
+ 005043
+ 025070
+ 033030
+ 033031
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 005001
+ 006001
+ 202126
+ 007001
+ 202000
+ 007024
+ 005021
+ 007025
+ 005022
+ 033033
+ 002151
+ 012064
+ 002151
+ 012064
+ 002151
+ 012064
+ 002151
+ 012064
+ 310012 10 002150
+ 025076
+ 025077
+ 025078
+ 033032
+ 201132
+ 202129
+ 012063
+ 202000
+ 201000
+ 310013 62 001007
+ 005040
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 004006
+ 005001
+ 006001
+ 007025
+ 005043
+ 025085
+ 201131
+ 202129
+ 002150
+ 008023
+ 008072
+ 014027
+ 008072
+ 014027
+ 002150
+ 008023
+ 008072
+ 014027
+ 008072
+ 014027
+ 002150
+ 008023
+ 008072
+ 014027
+ 008072
+ 014027
+ 202000
+ 201000
+ 201132
+ 202129
+ 002150
+ 008023
+ 008072
+ 012063
+ 008072
+ 012063
+ 002150
+ 008023
+ 008072
+ 012063
+ 008072
+ 012063
+ 008023
+ 008072
+ 012063
+ 008072
+ 012063
+ 002150
+ 008023
+ 008072
+ 012063
+ 008072
+ 012063
+ 202000
+ 201000
+ 310014 3 301072
+ 303041
+ 304011
+ 310015 13 301072
+ 007024
+ 010002
+ 303041
+ 101003
+ 304032
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101003
+ 304033
+ 310016 13 301072
+ 007024
+ 010002
+ 303041
+ 101012
+ 304032
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101012
+ 304033
+ 310020 6 310022
+ 301011
+ 301013
+ 301021
+ 304034
+ 310021
+ 310021 10 108000
+ 031001
+ 201131
+ 202129
+ 007004
+ 007004
+ 202000
+ 201000
+ 015020
+ 010002
+ 310022 4 001007
+ 002019
+ 001033
+ 002172
+ 310023 17 301072
+ 030021
+ 030022
+ 008012
+ 007024
+ 007025
+ 010002
+ 101012
+ 304032
+ 105002
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101012
+ 304033
+ 310024 17 301072
+ 030021
+ 030022
+ 008012
+ 007024
+ 007025
+ 010002
+ 101003
+ 304032
+ 105002
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101003
+ 304033
+ 310050 14 310051
+ 310052
+ 101000
+ 031002
+ 310053
+ 101004
+ 310054
+ 020010
+ 310052
+ 101015
+ 310053
+ 310052
+ 101004
+ 310053
+ 310051 16 001007
+ 005040
+ 201133
+ 005041
+ 201000
+ 201132
+ 025070
+ 201000
+ 202126
+ 007001
+ 202000
+ 007025
+ 005022
+ 102009
+ 002151
+ 012064
+ 310052 12 002019
+ 301011
+ 301012
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 301021
+ 007024
+ 005021
+ 005043
+ 310053 6 201134
+ 005042
+ 201000
+ 025076
+ 033032
+ 012163
+ 310054 13 201134
+ 005042
+ 201000
+ 025076
+ 033032
+ 201131
+ 202129
+ 102002
+ 008023
+ 014027
+ 008023
+ 202000
+ 201000
+ 310055 8 310051
+ 310052
+ 102020
+ 025076
+ 025051
+ 101000
+ 031002
+ 025050
+ 310193 5 301250
+ 303250
+ 302250
+ 303249
+ 303251
+ 310194 5 301250
+ 303250
+ 302250
+ 303249
+ 303252
+ 310195 3 301250
+ 303250
+ 304250
+ 310196 3 301250
+ 303249
+ 303251
+ 311001 9 301051
+ 007002
+ 012001
+ 011001
+ 011002
+ 011031
+ 011032
+ 011033
+ 020041
+ 311002 4 301065
+ 301066
+ 311003
+ 311004
+ 311003 5 010070
+ 011001
+ 011002
+ 012001
+ 013002
+ 311004 18 101000
+ 031000
+ 011034
+ 101000
+ 031000
+ 011035
+ 101000
+ 031000
+ 011075
+ 101000
+ 031000
+ 011076
+ 101000
+ 031000
+ 033025
+ 101000
+ 031000
+ 033026
+ 311193 16 301197
+ 301011
+ 301012
+ 301023
+ 008004
+ 007004
+ 008021
+ 011001
+ 011002
+ 011031
+ 011034
+ 011035
+ 012001
+ 012003
+ 013003
+ 020041
+ 312001 2 301043
+ 304001
+ 312002 2 301043
+ 304002
+ 312003 2 301042
+ 304003
+ 312004 2 301042
+ 304004
+ 312005 2 301042
+ 020014
+ 312006 2 301044
+ 304005
+ 312007 2 301042
+ 304006
+ 312010 6 001007
+ 005040
+ 002021
+ 005041
+ 004001
+ 004043
+ 312011 9 202131
+ 201149
+ 004006
+ 201000
+ 202126
+ 010002
+ 202000
+ 005043
+ 005053
+ 312012 6 202129
+ 201132
+ 101019
+ 012063
+ 201000
+ 202000
+ 312013 6 005033
+ 202129
+ 201135
+ 012063
+ 201000
+ 202000
+ 312014 8 312010
+ 312011
+ 105056
+ 301023
+ 005042
+ 005052
+ 312012
+ 312013
+ 312015 10 109011
+ 301023
+ 005042
+ 005052
+ 202129
+ 201132
+ 101004
+ 012063
+ 202000
+ 201000
+ 312016 3 312010
+ 312011
+ 312015
+ 312017 10 109008
+ 301023
+ 005042
+ 005052
+ 202129
+ 201132
+ 101003
+ 012063
+ 202000
+ 201000
+ 312018 3 312010
+ 312011
+ 312017
+ 312020 11 301047
+ 301048
+ 015015
+ 029002
+ 021076
+ 104012
+ 006030
+ 102012
+ 005030
+ 021075
+ 021066
+ 312021 6 301047
+ 101003
+ 301049
+ 011012
+ 011011
+ 021067
+ 312022 15 301047
+ 008022
+ 011012
+ 011050
+ 022070
+ 022026
+ 312041
+ 010050
+ 021068
+ 021071
+ 021072
+ 021073
+ 312042
+ 021062
+ 015011
+ 312023 7 301047
+ 103003
+ 008022
+ 012061
+ 022050
+ 021069
+ 021085
+ 312024 11 312020
+ 008060
+ 008022
+ 008060
+ 008022
+ 025014
+ 022101
+ 022097
+ 022098
+ 022099
+ 022100
+ 312026 19 301046
+ 301011
+ 301013
+ 301023
+ 312031
+ 101004
+ 312030
+ 021110
+ 301023
+ 321027
+ 021111
+ 301023
+ 321027
+ 021112
+ 301023
+ 321027
+ 021113
+ 301023
+ 321027
+ 312027 9 301047
+ 105009
+ 301023
+ 007021
+ 012061
+ 007021
+ 012061
+ 021085
+ 021070
+ 312028 26 301046
+ 301011
+ 301013
+ 301023
+ 008025
+ 201136
+ 004006
+ 201000
+ 312031
+ 312032
+ 101004
+ 312030
+ 101002
+ 312033
+ 021110
+ 301023
+ 321028
+ 021111
+ 301023
+ 321028
+ 021112
+ 301023
+ 321028
+ 021113
+ 301023
+ 321028
+ 312030 13 201130
+ 202129
+ 011012
+ 202000
+ 201000
+ 011052
+ 201135
+ 202130
+ 011011
+ 202000
+ 201000
+ 011053
+ 021104
+ 312031 8 005034
+ 006034
+ 021109
+ 011081
+ 011082
+ 021101
+ 021102
+ 021103
+ 312032 4 021120
+ 021121
+ 013055
+ 021122
+ 312033 4 002104
+ 008022
+ 012063
+ 012065
+ 312041 5 201141
+ 202130
+ 007001
+ 201000
+ 202000
+ 312042 6 021077
+ 021078
+ 021079
+ 021080
+ 021081
+ 021082
+ 312200 10 301237
+ 301238
+ 029002
+ 021206
+ 104012
+ 006232
+ 102012
+ 005232
+ 021205
+ 021196
+ 312201 6 301237
+ 101003
+ 301239
+ 011012
+ 011011
+ 021197
+ 312202 13 301237
+ 008022
+ 011012
+ 011050
+ 301240
+ 022243
+ 301241
+ 010050
+ 021198
+ 021201
+ 021202
+ 021203
+ 301242
+ 312203 8 301237
+ 008022
+ 012061
+ 022050
+ 021204
+ 021199
+ 021214
+ 021215
+ 312204 12 312201
+ 001031
+ 011012
+ 011011
+ 021200
+ 021213
+ 004004
+ 008021
+ 004024
+ 055003
+ 011012
+ 011011
+ 312207 3 312202
+ 301202
+ 033191
+ 312208 17 301202
+ 008022
+ 008021
+ 301011
+ 301013
+ 301023
+ 302205
+ 011002
+ 001007
+ 002021
+ 301011
+ 301013
+ 301023
+ 001032
+ 001192
+ 302205
+ 011002
+ 312209 11 301202
+ 001192
+ 301011
+ 301013
+ 301023
+ 302206
+ 104000
+ 022192
+ 102000
+ 005232
+ 022191
+ 312210 13 312202
+ 021192
+ 015202
+ 301011
+ 004004
+ 004005
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 304228
+ 304229
+ 312211 19 301046
+ 301011
+ 301013
+ 301023
+ 312031
+ 101004
+ 312030
+ 021110
+ 101004
+ 312212
+ 021111
+ 101004
+ 312212
+ 021112
+ 101004
+ 312212
+ 021113
+ 101004
+ 312212
+ 312212 2 301023
+ 321027
+ 313009 4 021001
+ 101000
+ 031001
+ 021001
+ 313010 4 021036
+ 101000
+ 031001
+ 021036
+ 313031 5 006002
+ 006012
+ 101000
+ 031002
+ 030001
+ 313032 5 005002
+ 005012
+ 101000
+ 031002
+ 313031
+ 313041 13 006002
+ 110000
+ 031001
+ 104000
+ 031001
+ 006012
+ 101000
+ 031012
+ 030001
+ 006012
+ 101000
+ 031001
+ 030001
+ 313042 5 005002
+ 005012
+ 101000
+ 031002
+ 313041
+ 313043 16 006002
+ 005002
+ 005012
+ 112000
+ 031001
+ 110000
+ 031001
+ 104000
+ 031001
+ 006012
+ 101000
+ 031011
+ 030001
+ 101000
+ 031001
+ 030001
+ 315001 5 001011
+ 301011
+ 301012
+ 301023
+ 306001
+ 315002 5 001011
+ 301011
+ 301012
+ 301023
+ 306004
+ 316001 10 301011
+ 004004
+ 301023
+ 001021
+ 002041
+ 019001
+ 010051
+ 019002
+ 019003
+ 019004
+ 316002 15 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 001033
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 007002
+ 007002
+ 316003 12 110000
+ 031001
+ 008011
+ 008007
+ 104000
+ 031001
+ 005002
+ 006002
+ 010002
+ 011002
+ 008007
+ 008011
+ 316004 13 111000
+ 031001
+ 008011
+ 008007
+ 007002
+ 007002
+ 102000
+ 031001
+ 005002
+ 006002
+ 011031
+ 008007
+ 008011
+ 316005 10 108000
+ 031001
+ 008005
+ 008007
+ 005002
+ 006002
+ 001026
+ 019001
+ 008007
+ 008005
+ 316006 14 112000
+ 031001
+ 008011
+ 008007
+ 007002
+ 007002
+ 102000
+ 031001
+ 005002
+ 006002
+ 020011
+ 020012
+ 008007
+ 008011
+ 316007 12 110000
+ 031001
+ 008011
+ 008007
+ 104000
+ 031001
+ 005002
+ 006002
+ 019005
+ 019006
+ 008007
+ 008011
+ 316008 13 111000
+ 031001
+ 008001
+ 008007
+ 008023
+ 103000
+ 031001
+ 005002
+ 006002
+ 010002
+ 008023
+ 008007
+ 008001
+ 316009 13 111000
+ 031001
+ 008011
+ 008007
+ 007002
+ 007002
+ 102000
+ 031001
+ 005002
+ 006002
+ 020041
+ 008007
+ 008011
+ 316010 9 107000
+ 031001
+ 008011
+ 008007
+ 001022
+ 005002
+ 006002
+ 008007
+ 008011
+ 316011 19 116000
+ 031001
+ 008011
+ 001022
+ 008007
+ 102000
+ 031001
+ 005002
+ 006002
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 020090
+ 008021
+ 008007
+ 008011
+ 318001 2 301025
+ 024011
+ 318003 4 301026
+ 024005
+ 024004
+ 024021
+ 318004 6 301025
+ 004023
+ 013011
+ 024005
+ 024004
+ 024022
+ 321001 6 002101
+ 002114
+ 002105
+ 002106
+ 002107
+ 002121
+ 321003 4 021051
+ 021014
+ 021017
+ 021030
+ 321004 5 301031
+ 002003
+ 101000
+ 031001
+ 321003
+ 321005 12 025004
+ 002121
+ 002122
+ 002123
+ 002124
+ 002125
+ 002126
+ 002127
+ 002128
+ 002129
+ 002130
+ 002131
+ 321006 4 025001
+ 025002
+ 025003
+ 025005
+ 321007 8 025009
+ 025010
+ 025011
+ 025012
+ 025013
+ 025015
+ 025016
+ 025017
+ 321008 3 025006
+ 025007
+ 025008
+ 321009 2 025018
+ 025019
+ 321010 13 002101
+ 007002
+ 002102
+ 002103
+ 002104
+ 002105
+ 002106
+ 002107
+ 002108
+ 002109
+ 002110
+ 002132
+ 002133
+ 321011 3 030031
+ 030032
+ 029002
+ 321012 3 101000
+ 031001
+ 002135
+ 321021 15 002003
+ 002101
+ 201130
+ 002106
+ 201000
+ 201132
+ 202130
+ 002121
+ 202000
+ 201000
+ 201133
+ 202129
+ 025001
+ 202000
+ 201000
+ 321022 11 010007
+ 204001
+ 031021
+ 011001
+ 204000
+ 011002
+ 204001
+ 031021
+ 011006
+ 204000
+ 021030
+ 321023 9 007007
+ 021091
+ 021030
+ 202129
+ 021014
+ 201129
+ 021017
+ 202000
+ 201000
+ 321024 7 007007
+ 204002
+ 031021
+ 012007
+ 011006
+ 204000
+ 021030
+ 321025 17 007007
+ 021091
+ 021030
+ 202129
+ 021014
+ 201129
+ 021017
+ 202000
+ 201000
+ 021092
+ 021030
+ 025092
+ 201129
+ 202129
+ 021017
+ 202000
+ 201000
+ 321026 10 010007
+ 204001
+ 031021
+ 012007
+ 025091
+ 011071
+ 011072
+ 011073
+ 011074
+ 204000
+ 321027 18 021118
+ 202129
+ 201132
+ 002112
+ 201000
+ 201131
+ 002111
+ 201000
+ 202000
+ 002104
+ 021105
+ 021106
+ 021107
+ 021114
+ 021115
+ 021116
+ 008018
+ 021117
+ 321028 18 021118
+ 202129
+ 201132
+ 002112
+ 201000
+ 201131
+ 002111
+ 201000
+ 202000
+ 002104
+ 021123
+ 021106
+ 021107
+ 021114
+ 021115
+ 021116
+ 008018
+ 021117
diff --git a/bufrtables/D0000000000098013001.TXT b/bufrtables/D0000000000098013001.TXT
new file mode 100755
index 0000000..2f291b0
--- /dev/null
+++ b/bufrtables/D0000000000098013001.TXT
@@ -0,0 +1,4820 @@
+ 300002 2 000002
+ 000003
+ 300003 3 000010
+ 000011
+ 000012
+ 300004 9 300003
+ 000013
+ 000014
+ 000015
+ 000016
+ 000017
+ 000018
+ 000019
+ 000020
+ 300010 4 300003
+ 101000
+ 031001
+ 000030
+ 301001 2 001001
+ 001002
+ 301002 3 001003
+ 001004
+ 001005
+ 301003 3 001011
+ 001012
+ 001013
+ 301004 4 001001
+ 001002
+ 001015
+ 002001
+ 301005 2 001035
+ 001034
+ 301011 3 004001
+ 004002
+ 004003
+ 301012 2 004004
+ 004005
+ 301013 3 004004
+ 004005
+ 004006
+ 301014 3 102002
+ 301011
+ 301012
+ 301021 2 005001
+ 006001
+ 301022 3 005001
+ 006001
+ 007001
+ 301023 2 005002
+ 006002
+ 301024 3 005002
+ 006002
+ 007001
+ 301025 3 301023
+ 004003
+ 301012
+ 301026 7 301021
+ 004003
+ 004003
+ 004004
+ 004004
+ 004005
+ 004005
+ 301027 5 008007
+ 101000
+ 031001
+ 301028
+ 008007
+ 301028 8 008040
+ 033042
+ 007010
+ 101000
+ 031002
+ 301023
+ 019007
+ 008040
+ 301031 5 301001
+ 002001
+ 301011
+ 301012
+ 301022
+ 301032 5 301001
+ 002001
+ 301011
+ 301012
+ 301024
+ 301033 5 001005
+ 002001
+ 301011
+ 301012
+ 301021
+ 301034 5 001005
+ 002001
+ 301011
+ 301012
+ 301023
+ 301035 7 001005
+ 001012
+ 001013
+ 002001
+ 301011
+ 301012
+ 301023
+ 301036 5 301003
+ 002001
+ 301011
+ 301012
+ 301023
+ 301037 6 301001
+ 002011
+ 002012
+ 301011
+ 301012
+ 301022
+ 301038 6 301001
+ 002011
+ 002012
+ 301011
+ 301012
+ 301024
+ 301039 6 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 301040 6 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301024
+ 301041 5 001007
+ 002021
+ 002022
+ 301011
+ 301012
+ 301042 2 301041
+ 301021
+ 301043 5 001007
+ 002023
+ 301011
+ 301013
+ 301021
+ 301044 5 001007
+ 002024
+ 301011
+ 301013
+ 301021
+ 301045 9 301011
+ 301012
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 304030
+ 304031
+ 301046 10 001007
+ 001012
+ 002048
+ 021119
+ 025060
+ 202124
+ 002026
+ 002027
+ 202000
+ 005040
+ 301047 15 001007
+ 025060
+ 001033
+ 001034
+ 001012
+ 301045
+ 002021
+ 301011
+ 301012
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 301023
+ 301048 14 002104
+ 002121
+ 002113
+ 002026
+ 002027
+ 002111
+ 002140
+ 202127
+ 001013
+ 202126
+ 007001
+ 202000
+ 025010
+ 021064
+ 301049 5 002111
+ 002112
+ 021062
+ 021063
+ 021065
+ 301051 6 001006
+ 002061
+ 301011
+ 301012
+ 301021
+ 008004
+ 301055 7 001005
+ 002001
+ 301011
+ 301012
+ 301021
+ 001012
+ 001014
+ 301062 3 101000
+ 031001
+ 301001
+ 301065 8 001006
+ 001008
+ 002001
+ 002002
+ 002005
+ 002062
+ 002070
+ 002065
+ 301066 6 301011
+ 301013
+ 301023
+ 007004
+ 002064
+ 008004
+ 301070 3 002143
+ 002142
+ 002144
+ 301071 5 001007
+ 001031
+ 002020
+ 002028
+ 002029
+ 301072 4 301071
+ 301011
+ 301013
+ 301021
+ 301074 4 002143
+ 002142
+ 002145
+ 002146
+ 301075 6 301001
+ 001015
+ 301024
+ 008021
+ 301011
+ 301012
+ 301076 3 002011
+ 002143
+ 002142
+ 301089 2 001101
+ 001102
+ 301090 6 301004
+ 301011
+ 301012
+ 301021
+ 007030
+ 007031
+ 301091 10 002180
+ 002181
+ 002182
+ 002183
+ 002184
+ 002179
+ 002186
+ 002187
+ 002188
+ 002189
+ 301092 9 001011
+ 001003
+ 002001
+ 301011
+ 301012
+ 301021
+ 007030
+ 007031
+ 033024
+ 301093 3 301036
+ 007030
+ 007031
+ 301110 5 301001
+ 001011
+ 002011
+ 002014
+ 002003
+ 301111 6 301001
+ 001011
+ 002011
+ 002013
+ 002014
+ 002003
+ 301112 5 001006
+ 002011
+ 002013
+ 002014
+ 002003
+ 301113 3 008021
+ 301011
+ 301013
+ 301114 5 301021
+ 007030
+ 007031
+ 007007
+ 033024
+ 301120 4 301001
+ 001094
+ 002011
+ 301121
+ 301121 5 008041
+ 301122
+ 301021
+ 007031
+ 007007
+ 301122 7 301011
+ 301012
+ 201135
+ 202130
+ 004006
+ 202000
+ 201000
+ 301123 33 102002
+ 008041
+ 001062
+ 301001
+ 001094
+ 002011
+ 001018
+ 001095
+ 025061
+ 025068
+ 001082
+ 001083
+ 001081
+ 002067
+ 002066
+ 002014
+ 025067
+ 025065
+ 025066
+ 002095
+ 002096
+ 002097
+ 002016
+ 002083
+ 002080
+ 002081
+ 001093
+ 002084
+ 002085
+ 002086
+ 002082
+ 008041
+ 301011
+ 301125 6 001033
+ 001034
+ 025060
+ 001007
+ 002019
+ 001012
+ 301193 5 001007
+ 001031
+ 002196
+ 002221
+ 002222
+ 301194 9 001194
+ 001012
+ 001013
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301195 9 001195
+ 001012
+ 001013
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301196 7 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301197 9 001006
+ 001008
+ 002061
+ 002062
+ 002002
+ 002005
+ 002070
+ 002063
+ 002001
+ 301198 9 001011
+ 001012
+ 001013
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301200 2 001032
+ 033194
+ 301201 2 101003
+ 033193
+ 301202 2 001031
+ 001032
+ 301237 12 001007
+ 001012
+ 002021
+ 301011
+ 004004
+ 004005
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 301023
+ 301238 14 002104
+ 002121
+ 002113
+ 002026
+ 002027
+ 002111
+ 002192
+ 202127
+ 001013
+ 202126
+ 007001
+ 202000
+ 025010
+ 021194
+ 301239 5 002111
+ 002112
+ 021192
+ 021193
+ 021195
+ 301240 5 201131
+ 202129
+ 022021
+ 201000
+ 202000
+ 301241 5 201141
+ 202130
+ 007001
+ 201000
+ 202000
+ 301242 6 021207
+ 021208
+ 021209
+ 021210
+ 021211
+ 021212
+ 301250 4 301193
+ 301011
+ 301013
+ 301021
+ 302001 4 010004
+ 010051
+ 010061
+ 010063
+ 302002 5 010004
+ 007004
+ 010003
+ 010061
+ 010063
+ 302003 9 011011
+ 011012
+ 012004
+ 012006
+ 013003
+ 020001
+ 020003
+ 020004
+ 020005
+ 302004 7 020010
+ 008002
+ 020011
+ 020013
+ 020012
+ 020012
+ 020012
+ 302005 4 008002
+ 020011
+ 020012
+ 020013
+ 302006 4 010004
+ 010051
+ 010062
+ 010063
+ 302011 3 302001
+ 302003
+ 302004
+ 302012 3 302002
+ 302003
+ 302004
+ 302013 5 302006
+ 302003
+ 101000
+ 031001
+ 302005
+ 302021 3 022001
+ 022011
+ 022021
+ 302022 3 022002
+ 022012
+ 022022
+ 302023 3 022003
+ 022013
+ 022023
+ 302024 3 302022
+ 101002
+ 302023
+ 302031 4 302001
+ 010062
+ 007004
+ 010009
+ 302032 4 007032
+ 012101
+ 012103
+ 013003
+ 302033 2 007032
+ 020001
+ 302034 2 007032
+ 013023
+ 302035 8 302032
+ 302033
+ 302034
+ 007032
+ 302004
+ 101000
+ 031001
+ 302005
+ 302036 7 105000
+ 031001
+ 008002
+ 020011
+ 020012
+ 020014
+ 020017
+ 302037 3 020062
+ 013013
+ 012113
+ 302038 4 020003
+ 004024
+ 020004
+ 020005
+ 302039 2 004024
+ 014031
+ 302040 4 007032
+ 102002
+ 004024
+ 013011
+ 302041 7 007032
+ 004024
+ 004024
+ 012111
+ 004024
+ 004024
+ 012112
+ 302042 11 007032
+ 002002
+ 008021
+ 004025
+ 011001
+ 011002
+ 008021
+ 103002
+ 004025
+ 011043
+ 011041
+ 302043 7 302038
+ 101002
+ 302039
+ 302040
+ 302041
+ 302042
+ 007032
+ 302044 3 004024
+ 002004
+ 013033
+ 302045 7 004024
+ 014002
+ 014004
+ 014016
+ 014028
+ 014029
+ 014030
+ 302046 3 004024
+ 004024
+ 012049
+ 302047 3 102003
+ 008002
+ 020054
+ 302048 5 005021
+ 007021
+ 020012
+ 005021
+ 007021
+ 302049 7 008002
+ 020011
+ 020013
+ 020012
+ 020012
+ 020012
+ 008002
+ 302050 31 008041
+ 005021
+ 007005
+ 202130
+ 006021
+ 202000
+ 008041
+ 201131
+ 202129
+ 002115
+ 010004
+ 002115
+ 013003
+ 202000
+ 201000
+ 002115
+ 011001
+ 011002
+ 002115
+ 102002
+ 012101
+ 004024
+ 002115
+ 012103
+ 012102
+ 101003
+ 020012
+ 020011
+ 020013
+ 101002
+ 020003
+ 302051 12 010004
+ 010051
+ 007004
+ 010003
+ 012004
+ 012051
+ 012016
+ 012017
+ 013004
+ 102004
+ 008051
+ 008020
+ 302052 7 007032
+ 007033
+ 012101
+ 002039
+ 012102
+ 012103
+ 013003
+ 302053 3 007032
+ 007033
+ 020001
+ 302054 9 302052
+ 302053
+ 007033
+ 302034
+ 007032
+ 302004
+ 101000
+ 031001
+ 302005
+ 302055 8 020031
+ 020032
+ 020033
+ 020034
+ 020035
+ 020036
+ 020037
+ 020038
+ 302056 4 002038
+ 007063
+ 022043
+ 007063
+ 302057 3 302056
+ 302021
+ 302024
+ 302058 8 007032
+ 007033
+ 004024
+ 004024
+ 012111
+ 004024
+ 004024
+ 012112
+ 302059 12 007032
+ 007033
+ 002002
+ 008021
+ 004025
+ 011001
+ 011002
+ 008021
+ 103002
+ 004025
+ 011043
+ 011041
+ 302060 4 302038
+ 302040
+ 302058
+ 302059
+ 302062 24 302001
+ 302052
+ 302053
+ 007033
+ 101000
+ 031000
+ 302034
+ 007032
+ 101000
+ 031001
+ 302005
+ 008002
+ 101000
+ 031000
+ 302055
+ 101000
+ 031000
+ 302056
+ 101000
+ 031000
+ 302021
+ 101000
+ 031000
+ 302024
+ 302063 8 302038
+ 101000
+ 031000
+ 302040
+ 101000
+ 031000
+ 302058
+ 302059
+ 302066 16 020023
+ 020024
+ 020027
+ 020054
+ 020023
+ 020027
+ 020054
+ 020025
+ 020026
+ 020027
+ 020040
+ 020066
+ 020027
+ 020021
+ 020067
+ 020027
+ 302069 4 007032
+ 007033
+ 033041
+ 020001
+ 302070 8 007032
+ 007033
+ 011001
+ 011002
+ 011043
+ 011041
+ 011016
+ 011017
+ 302071 14 007032
+ 007033
+ 008021
+ 004025
+ 011001
+ 011002
+ 008021
+ 103002
+ 004025
+ 011043
+ 011041
+ 004025
+ 011016
+ 011017
+ 302072 5 007032
+ 007033
+ 012101
+ 012103
+ 013003
+ 302073 7 020010
+ 105004
+ 008002
+ 020011
+ 020012
+ 033041
+ 020013
+ 302074 4 020003
+ 004025
+ 020004
+ 020005
+ 302075 5 008021
+ 004025
+ 013055
+ 013058
+ 008021
+ 302076 7 020021
+ 020022
+ 026020
+ 020023
+ 020024
+ 020025
+ 020026
+ 302077 8 007032
+ 007033
+ 004025
+ 012111
+ 012112
+ 007032
+ 004025
+ 012112
+ 302078 4 002176
+ 020062
+ 002177
+ 013013
+ 302079 5 007032
+ 002175
+ 002178
+ 004025
+ 013011
+ 302080 3 002185
+ 004025
+ 013033
+ 302081 2 004025
+ 014031
+ 302082 7 004025
+ 014002
+ 014004
+ 014016
+ 014028
+ 014029
+ 014030
+ 302083 8 004025
+ 008023
+ 010004
+ 011001
+ 011002
+ 012101
+ 013003
+ 008023
+ 302205 5 201131
+ 202129
+ 022021
+ 201000
+ 202000
+ 302206 9 302205
+ 201130
+ 202129
+ 022011
+ 201000
+ 202000
+ 022001
+ 011001
+ 011002
+ 302207 5 022193
+ 022194
+ 022195
+ 022196
+ 022197
+ 302250 5 102000
+ 031001
+ 020193
+ 020194
+ 020012
+ 303001 3 007003
+ 011001
+ 011002
+ 303002 3 007004
+ 011001
+ 011002
+ 303003 4 007004
+ 010003
+ 012001
+ 012003
+ 303004 6 007004
+ 010003
+ 012001
+ 012003
+ 011001
+ 011002
+ 303011 4 007003
+ 008001
+ 011001
+ 011002
+ 303012 4 007004
+ 008001
+ 011001
+ 011002
+ 303013 7 007004
+ 008001
+ 010003
+ 012001
+ 013003
+ 011001
+ 011002
+ 303014 7 007004
+ 008001
+ 010003
+ 012001
+ 012003
+ 011001
+ 011002
+ 303021 4 007004
+ 007004
+ 204007
+ 031021
+ 303022 3 303021
+ 010003
+ 204000
+ 303023 3 303021
+ 012001
+ 204000
+ 303024 3 303021
+ 013016
+ 204000
+ 303025 5 002025
+ 204007
+ 031021
+ 012063
+ 204000
+ 303026 6 007004
+ 008003
+ 204007
+ 031021
+ 012001
+ 204000
+ 303027 5 007004
+ 204007
+ 031021
+ 010003
+ 204000
+ 303031 6 007004
+ 008003
+ 007021
+ 007022
+ 008012
+ 012061
+ 303032 2 020011
+ 020016
+ 303033 2 020010
+ 020016
+ 303040 18 008041
+ 004025
+ 004026
+ 301021
+ 301122
+ 201131
+ 202129
+ 025069
+ 007004
+ 013003
+ 202000
+ 201000
+ 002013
+ 012101
+ 010009
+ 102002
+ 008040
+ 035035
+ 303041 8 002152
+ 002023
+ 007004
+ 011001
+ 011002
+ 002153
+ 002154
+ 012071
+ 303050 7 004086
+ 008042
+ 007004
+ 005015
+ 006015
+ 011001
+ 011002
+ 303051 7 004086
+ 008042
+ 007004
+ 005015
+ 006015
+ 011061
+ 011062
+ 303052 7 004086
+ 008042
+ 007009
+ 005015
+ 006015
+ 011001
+ 011002
+ 303053 7 004086
+ 008042
+ 007009
+ 005015
+ 006015
+ 011061
+ 011062
+ 303054 10 004086
+ 008042
+ 007004
+ 010009
+ 005015
+ 006015
+ 012101
+ 012103
+ 011001
+ 011002
+ 303249 7 002252
+ 104000
+ 031001
+ 002199
+ 007004
+ 007004
+ 013003
+ 303250 8 002252
+ 002023
+ 007004
+ 011001
+ 011002
+ 002197
+ 002198
+ 012193
+ 303251 8 002252
+ 105000
+ 031001
+ 002254
+ 002251
+ 002197
+ 002198
+ 012063
+ 303252 8 002252
+ 105000
+ 031001
+ 002254
+ 002251
+ 002197
+ 002198
+ 012194
+ 304001 5 008003
+ 010004
+ 012001
+ 011001
+ 011002
+ 304002 4 008003
+ 010004
+ 011001
+ 011002
+ 304003 2 008003
+ 012001
+ 304004 4 008003
+ 010004
+ 020010
+ 012001
+ 304005 4 002024
+ 007004
+ 007004
+ 013003
+ 304006 3 014001
+ 014001
+ 014003
+ 304011 27 002163
+ 002164
+ 008012
+ 007024
+ 002057
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 008021
+ 004024
+ 110004
+ 008021
+ 004004
+ 004005
+ 004006
+ 008021
+ 004004
+ 004005
+ 004006
+ 011001
+ 011002
+ 103010
+ 002163
+ 007004
+ 012001
+ 304030 3 027031
+ 028031
+ 010031
+ 304031 3 001041
+ 001042
+ 001043
+ 304032 5 002153
+ 002154
+ 020081
+ 020082
+ 020012
+ 304033 8 002152
+ 002166
+ 002167
+ 002153
+ 002154
+ 012075
+ 012076
+ 012063
+ 304034 9 102004
+ 027001
+ 028001
+ 007022
+ 005043
+ 020010
+ 020016
+ 033003
+ 010040
+ 304035 15 002153
+ 002154
+ 012063
+ 008001
+ 012063
+ 008001
+ 012063
+ 008001
+ 008003
+ 012063
+ 008003
+ 012063
+ 008003
+ 012063
+ 008003
+ 304036 12 020082
+ 008012
+ 020082
+ 008012
+ 020081
+ 008003
+ 020081
+ 008003
+ 020081
+ 008003
+ 020081
+ 008003
+ 304037 15 002153
+ 002154
+ 012063
+ 008011
+ 012063
+ 008011
+ 012063
+ 008011
+ 008003
+ 012063
+ 008003
+ 012063
+ 008003
+ 012063
+ 008003
+ 304228 3 005217
+ 006217
+ 007217
+ 304229 3 001208
+ 001209
+ 001210
+ 304250 27 002231
+ 002232
+ 008012
+ 007024
+ 002057
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 008021
+ 004024
+ 110004
+ 008021
+ 004004
+ 004005
+ 004006
+ 008021
+ 004004
+ 004005
+ 004006
+ 011001
+ 011002
+ 103010
+ 002231
+ 007004
+ 012001
+ 305003 5 301012
+ 004065
+ 101000
+ 031001
+ 305001
+ 305006 6 013072
+ 013082
+ 013019
+ 012001
+ 013073
+ 013060
+ 305007 6 301029
+ 301012
+ 004065
+ 101000
+ 031001
+ 305006
+ 305008 2 305006
+ 012030
+ 305009 6 301029
+ 301012
+ 004065
+ 101000
+ 031001
+ 305008
+ 305011 6 301029
+ 301012
+ 004065
+ 101000
+ 031001
+ 305010
+ 305018 8 301029
+ 301012
+ 004065
+ 103000
+ 031001
+ 305008
+ 305016
+ 305017
+ 306001 5 002032
+ 102000
+ 031001
+ 007062
+ 022042
+ 306002 3 002031
+ 022004
+ 022031
+ 306003 4 002002
+ 011011
+ 011012
+ 012004
+ 306004 7 002032
+ 002033
+ 103000
+ 031001
+ 007062
+ 022043
+ 022062
+ 306005 6 002031
+ 103000
+ 031001
+ 007062
+ 022004
+ 022031
+ 306006 3 306003
+ 306002
+ 022063
+ 306007 6 001012
+ 001014
+ 306008
+ 004024
+ 027003
+ 028003
+ 306008 3 002034
+ 002035
+ 002036
+ 306019 8 001075
+ 301011
+ 301012
+ 022042
+ 022120
+ 022121
+ 004015
+ 004065
+ 306020 4 306024
+ 102006
+ 022038
+ 022039
+ 306021 7 001075
+ 301011
+ 301012
+ 022122
+ 022123
+ 012001
+ 303002
+ 306022 5 001075
+ 301011
+ 301012
+ 022038
+ 022039
+ 306023 8 001015
+ 301023
+ 301011
+ 301012
+ 022038
+ 022039
+ 022120
+ 022121
+ 306024 8 001075
+ 301011
+ 301012
+ 022042
+ 022120
+ 022121
+ 004025
+ 004015
+ 306025 4 306019
+ 102006
+ 022038
+ 022039
+ 307001 2 301031
+ 302011
+ 307002 2 301032
+ 302011
+ 307003 4 307001
+ 101000
+ 031001
+ 302005
+ 307004 4 307002
+ 101000
+ 031001
+ 302005
+ 307005 3 307001
+ 101004
+ 302005
+ 307006 3 307002
+ 101004
+ 302005
+ 307007 2 301031
+ 302012
+ 307008 2 301032
+ 302012
+ 307009 2 301031
+ 302013
+ 307011 16 001063
+ 002001
+ 301011
+ 301012
+ 301024
+ 007006
+ 011001
+ 011016
+ 011017
+ 011002
+ 011041
+ 007006
+ 012001
+ 012003
+ 010052
+ 020009
+ 307012 5 103000
+ 031001
+ 008023
+ 005021
+ 020001
+ 307013 8 106000
+ 031001
+ 001064
+ 008014
+ 020061
+ 008014
+ 020061
+ 020018
+ 307014 3 101000
+ 031001
+ 020019
+ 307015 4 101000
+ 031001
+ 302005
+ 020002
+ 307016 3 101000
+ 031001
+ 020020
+ 307017 3 101000
+ 031001
+ 011070
+ 307018 16 008016
+ 102000
+ 031001
+ 008017
+ 301012
+ 104000
+ 031001
+ 007006
+ 011001
+ 011002
+ 011041
+ 020009
+ 101000
+ 031001
+ 020001
+ 307014
+ 307020 3 307011
+ 307014
+ 307016
+ 307021 9 307011
+ 307012
+ 307013
+ 307014
+ 307015
+ 307016
+ 307017
+ 307018
+ 307015
+ 307022 31 001015
+ 301011
+ 301012
+ 301022
+ 008021
+ 004025
+ 010004
+ 012001
+ 013003
+ 033038
+ 008022
+ 106025
+ 002020
+ 001050
+ 005021
+ 007021
+ 015031
+ 015032
+ 008060
+ 015033
+ 015034
+ 008060
+ 015033
+ 015034
+ 015035
+ 201131
+ 202129
+ 013016
+ 202000
+ 201000
+ 015011
+ 307030 2 015001
+ 015002
+ 307031 7 008022
+ 008023
+ 015001
+ 008023
+ 015001
+ 008023
+ 015002
+ 307041 7 301001
+ 001015
+ 301022
+ 301011
+ 301012
+ 301070
+ 307030
+ 307042 9 301001
+ 001015
+ 301022
+ 301011
+ 301012
+ 008021
+ 004025
+ 301070
+ 307031
+ 307043 7 301001
+ 001015
+ 301024
+ 301011
+ 301012
+ 301074
+ 307030
+ 307045 25 001063
+ 008079
+ 002001
+ 301011
+ 301012
+ 301024
+ 007032
+ 011001
+ 011016
+ 011017
+ 008054
+ 011083
+ 011084
+ 011002
+ 008054
+ 011085
+ 011086
+ 011041
+ 008054
+ 007032
+ 012023
+ 012024
+ 007032
+ 010052
+ 020009
+ 307046 5 020060
+ 102000
+ 031001
+ 005021
+ 020059
+ 307047 9 105000
+ 031001
+ 008002
+ 020011
+ 020012
+ 020013
+ 020092
+ 020002
+ 020091
+ 307048 25 008016
+ 102000
+ 031001
+ 008017
+ 301012
+ 112000
+ 031000
+ 007032
+ 011001
+ 008054
+ 011083
+ 011084
+ 011002
+ 008054
+ 011085
+ 011086
+ 011041
+ 008054
+ 007032
+ 020009
+ 101000
+ 031000
+ 020060
+ 307014
+ 307047
+ 307049 4 102000
+ 031000
+ 022043
+ 022021
+ 307050 14 101000
+ 031000
+ 020085
+ 102000
+ 031001
+ 001064
+ 020085
+ 105000
+ 031001
+ 001064
+ 020086
+ 020087
+ 020088
+ 020089
+ 307052 12 001063
+ 008039
+ 301011
+ 301012
+ 008079
+ 008039
+ 301011
+ 301012
+ 008039
+ 301011
+ 301012
+ 301024
+ 307053 16 007032
+ 011001
+ 008054
+ 011083
+ 011084
+ 011002
+ 008054
+ 011085
+ 011086
+ 011041
+ 008054
+ 007032
+ 020009
+ 020060
+ 307014
+ 307047
+ 307054 13 007032
+ 008039
+ 004003
+ 004004
+ 008023
+ 012023
+ 008039
+ 004003
+ 004004
+ 008023
+ 012023
+ 008023
+ 007032
+ 307055 9 033045
+ 008016
+ 008039
+ 004003
+ 301012
+ 008039
+ 004003
+ 301012
+ 307053
+ 307056 6 307052
+ 307053
+ 307054
+ 101000
+ 031001
+ 307055
+ 307059 12 307045
+ 307046
+ 307013
+ 307014
+ 307047
+ 307016
+ 307017
+ 307049
+ 307050
+ 101000
+ 031001
+ 307048
+ 307060 2 007061
+ 012030
+ 307061 3 301031
+ 101005
+ 307060
+ 307062 3 301032
+ 101005
+ 307060
+ 307063 2 007061
+ 012130
+ 307071 67 301090
+ 004074
+ 004023
+ 008023
+ 010004
+ 010051
+ 007004
+ 010009
+ 007032
+ 012101
+ 002051
+ 004051
+ 012118
+ 004052
+ 012119
+ 013004
+ 008023
+ 012151
+ 007032
+ 102005
+ 008050
+ 008020
+ 014032
+ 014033
+ 008050
+ 008020
+ 102018
+ 008052
+ 008022
+ 007032
+ 008053
+ 004003
+ 012152
+ 008053
+ 004003
+ 012153
+ 008053
+ 004003
+ 008023
+ 012101
+ 008053
+ 004003
+ 008023
+ 012101
+ 008023
+ 007032
+ 002002
+ 008053
+ 004003
+ 011046
+ 008053
+ 004003
+ 004004
+ 004023
+ 007032
+ 013060
+ 013051
+ 004053
+ 008050
+ 008020
+ 102006
+ 008052
+ 008022
+ 008053
+ 004003
+ 013052
+ 007032
+ 307072 38 004001
+ 004001
+ 004002
+ 004003
+ 004004
+ 004074
+ 004022
+ 008023
+ 010004
+ 010051
+ 007004
+ 010009
+ 007032
+ 012101
+ 002051
+ 004051
+ 012118
+ 004052
+ 012119
+ 013004
+ 012151
+ 007032
+ 014032
+ 008023
+ 004001
+ 004001
+ 004002
+ 004003
+ 004004
+ 004022
+ 007032
+ 008023
+ 013060
+ 004053
+ 008023
+ 102008
+ 008050
+ 008020
+ 307073 2 307071
+ 307072
+ 307080 13 301090
+ 302031
+ 302035
+ 302036
+ 302047
+ 008002
+ 302048
+ 302037
+ 302043
+ 302044
+ 101002
+ 302045
+ 302046
+ 307081 24 301090
+ 302031
+ 302035
+ 302036
+ 302047
+ 008002
+ 302048
+ 302037
+ 012122
+ 013056
+ 013057
+ 020101
+ 020102
+ 020103
+ 020104
+ 020105
+ 020106
+ 020107
+ 020108
+ 302043
+ 302044
+ 101002
+ 302045
+ 302046
+ 307082 15 301090
+ 302031
+ 302035
+ 302036
+ 302047
+ 008002
+ 302048
+ 302037
+ 012121
+ 012122
+ 302043
+ 302044
+ 101002
+ 302045
+ 302046
+ 307083 14 301090
+ 302031
+ 302035
+ 302036
+ 302047
+ 008002
+ 302048
+ 302037
+ 012122
+ 302043
+ 302044
+ 101002
+ 302045
+ 302046
+ 307084 17 301090
+ 302031
+ 302035
+ 302036
+ 302047
+ 008002
+ 302048
+ 302037
+ 020055
+ 101000
+ 031000
+ 205001
+ 302043
+ 302044
+ 101002
+ 302045
+ 302046
+ 307086 11 301090
+ 302031
+ 302035
+ 302036
+ 008002
+ 302037
+ 302066
+ 302043
+ 302044
+ 101002
+ 302045
+ 307090 13 301092
+ 302031
+ 302035
+ 302036
+ 302047
+ 008002
+ 302048
+ 302037
+ 302043
+ 302044
+ 101002
+ 302045
+ 302046
+ 307091 66 301089
+ 301090
+ 008010
+ 301091
+ 302001
+ 007004
+ 010009
+ 302072
+ 103000
+ 031000
+ 101005
+ 307063
+ 007061
+ 101000
+ 031000
+ 302069
+ 007032
+ 007033
+ 105000
+ 031000
+ 020031
+ 020032
+ 002038
+ 022043
+ 302021
+ 101000
+ 031000
+ 302078
+ 101000
+ 031000
+ 302073
+ 101000
+ 031000
+ 302074
+ 101000
+ 031000
+ 302075
+ 102000
+ 031000
+ 004025
+ 302076
+ 302071
+ 302077
+ 007033
+ 101000
+ 031000
+ 302079
+ 007032
+ 101000
+ 031000
+ 302080
+ 101000
+ 031000
+ 302081
+ 101000
+ 031000
+ 302082
+ 102000
+ 031000
+ 004025
+ 013059
+ 101000
+ 031000
+ 302083
+ 033005
+ 033006
+ 308001 3 301033
+ 302011
+ 022042
+ 308002 3 301034
+ 302011
+ 022042
+ 308003 3 301035
+ 302011
+ 022042
+ 308004 3 301036
+ 302011
+ 022042
+ 308005 2 308004
+ 302024
+ 308006 8 010004
+ 010061
+ 010063
+ 011001
+ 011002
+ 012004
+ 013003
+ 022042
+ 308007 4 301055
+ 302011
+ 007062
+ 022042
+ 308008 84 001003
+ 001020
+ 001005
+ 002001
+ 002036
+ 002149
+ 301011
+ 301012
+ 008021
+ 301011
+ 301012
+ 008021
+ 301021
+ 027004
+ 028004
+ 007030
+ 001051
+ 002148
+ 001012
+ 001014
+ 002040
+ 033022
+ 033023
+ 033027
+ 022063
+ 302021
+ 302022
+ 302023
+ 008081
+ 025026
+ 008081
+ 025026
+ 008081
+ 025026
+ 008081
+ 002034
+ 022060
+ 007070
+ 002190
+ 025086
+ 002035
+ 002168
+ 020031
+ 002038
+ 306004
+ 002030
+ 306005
+ 007031
+ 008081
+ 012064
+ 302001
+ 008081
+ 007032
+ 007033
+ 012101
+ 012103
+ 013003
+ 007032
+ 007033
+ 008082
+ 007033
+ 002169
+ 002002
+ 008021
+ 004025
+ 011001
+ 011002
+ 008021
+ 004025
+ 011043
+ 011041
+ 008082
+ 007033
+ 007032
+ 004024
+ 013011
+ 007032
+ 008021
+ 004024
+ 014021
+ 008021
+ 025028
+ 025028
+ 025028
+ 308009 7 301093
+ 302001
+ 302054
+ 008002
+ 302055
+ 302057
+ 302060
+ 308010 16 001011
+ 113000
+ 031001
+ 301011
+ 301012
+ 301021
+ 004080
+ 022049
+ 004080
+ 022059
+ 004080
+ 022005
+ 002042
+ 022032
+ 002042
+ 004080
+ 308011 27 001011
+ 002001
+ 301011
+ 301012
+ 301023
+ 007030
+ 007031
+ 004074
+ 004023
+ 008023
+ 010051
+ 007032
+ 007033
+ 012101
+ 013004
+ 007032
+ 007033
+ 302056
+ 008023
+ 004003
+ 004004
+ 004023
+ 007032
+ 013060
+ 013051
+ 004053
+ 007032
+ 308012 28 004001
+ 004001
+ 004002
+ 004003
+ 004004
+ 004074
+ 004022
+ 008023
+ 010051
+ 007032
+ 007033
+ 012101
+ 013002
+ 007032
+ 007033
+ 302056
+ 008023
+ 004001
+ 004001
+ 004002
+ 004003
+ 004004
+ 004022
+ 007032
+ 008023
+ 013060
+ 004053
+ 008023
+ 308013 2 308011
+ 308012
+ 308015 49 001003
+ 001020
+ 001005
+ 001011
+ 001205
+ 001001
+ 001002
+ 002044
+ 002045
+ 301011
+ 301012
+ 301021
+ 022063
+ 105002
+ 002098
+ 022070
+ 022071
+ 022073
+ 022074
+ 002098
+ 022076
+ 022077
+ 022094
+ 025043
+ 022078
+ 121000
+ 031001
+ 002098
+ 022082
+ 022084
+ 116000
+ 031001
+ 022080
+ 022085
+ 022086
+ 022087
+ 022088
+ 022089
+ 103000
+ 031001
+ 022090
+ 022186
+ 022187
+ 103000
+ 031001
+ 022092
+ 022186
+ 022187
+ 002098
+ 308016 49 001003
+ 001020
+ 001005
+ 001011
+ 001205
+ 001001
+ 001002
+ 002044
+ 002045
+ 301011
+ 301012
+ 301021
+ 022063
+ 105002
+ 002098
+ 022070
+ 022072
+ 022073
+ 022075
+ 002098
+ 022076
+ 022077
+ 022094
+ 025044
+ 022079
+ 121000
+ 031001
+ 002098
+ 022083
+ 022084
+ 116000
+ 031001
+ 022081
+ 022085
+ 022086
+ 022087
+ 022088
+ 022089
+ 103000
+ 031001
+ 022091
+ 022186
+ 022187
+ 103000
+ 031001
+ 022093
+ 022186
+ 022187
+ 002098
+ 309001 4 301037
+ 101000
+ 031001
+ 303011
+ 309002 4 301038
+ 101000
+ 031001
+ 303011
+ 309003 4 301037
+ 101000
+ 031001
+ 303012
+ 309004 4 301038
+ 101000
+ 031001
+ 303012
+ 309005 5 301037
+ 302004
+ 101000
+ 031001
+ 303013
+ 309006 5 301038
+ 302004
+ 101000
+ 031001
+ 303013
+ 309007 5 301037
+ 302004
+ 101000
+ 031001
+ 303014
+ 309008 5 301038
+ 302004
+ 101000
+ 031001
+ 303014
+ 309011 4 301039
+ 101000
+ 031001
+ 303011
+ 309012 4 301039
+ 101000
+ 031001
+ 303012
+ 309013 5 301039
+ 302004
+ 101000
+ 031001
+ 303013
+ 309014 5 301039
+ 302004
+ 101000
+ 031001
+ 303014
+ 309015 4 301040
+ 101000
+ 031001
+ 303011
+ 309016 4 301040
+ 101000
+ 031001
+ 303012
+ 309017 5 301040
+ 302004
+ 101000
+ 031001
+ 303013
+ 309018 5 301040
+ 302004
+ 101000
+ 031001
+ 303014
+ 309019 5 301031
+ 002003
+ 101000
+ 031001
+ 303011
+ 309020 8 301031
+ 002003
+ 104000
+ 031001
+ 007003
+ 011003
+ 011004
+ 011005
+ 309030 8 015004
+ 015005
+ 104000
+ 031001
+ 004015
+ 008006
+ 007004
+ 015003
+ 309031 8 015004
+ 015005
+ 104000
+ 031001
+ 004025
+ 008006
+ 007004
+ 015003
+ 309040 3 301075
+ 301076
+ 309030
+ 309042 4 307042
+ 301075
+ 301076
+ 309030
+ 309050 9 301110
+ 301113
+ 301114
+ 101000
+ 031002
+ 303050
+ 101000
+ 031001
+ 303051
+ 309051 9 301110
+ 301113
+ 301114
+ 101000
+ 031002
+ 303052
+ 101000
+ 031001
+ 303053
+ 309052 11 301111
+ 301113
+ 301114
+ 302049
+ 022043
+ 101000
+ 031002
+ 303054
+ 101000
+ 031001
+ 303051
+ 309053 9 301112
+ 301113
+ 301114
+ 101000
+ 031002
+ 303054
+ 101000
+ 031001
+ 303051
+ 309054 27 301001
+ 001011
+ 301011
+ 301012
+ 301021
+ 007030
+ 007031
+ 007007
+ 004023
+ 004059
+ 115000
+ 031001
+ 008001
+ 008023
+ 007004
+ 010009
+ 012101
+ 012103
+ 008023
+ 011001
+ 011002
+ 008023
+ 011019
+ 008050
+ 008020
+ 008050
+ 008020
+ 309060 4 301123
+ 301121
+ 302050
+ 303040
+ 309061 21 301120
+ 008041
+ 301122
+ 201131
+ 202129
+ 025069
+ 007004
+ 202000
+ 201000
+ 033007
+ 033035
+ 033015
+ 013009
+ 033007
+ 033035
+ 033015
+ 002013
+ 012101
+ 033007
+ 033035
+ 033015
+ 309062 19 301120
+ 008041
+ 301122
+ 005001
+ 033035
+ 033015
+ 006001
+ 033035
+ 033015
+ 007007
+ 033035
+ 033015
+ 011003
+ 033035
+ 033015
+ 011004
+ 033035
+ 033015
+ 033007
+ 309063 19 301120
+ 008041
+ 301122
+ 005001
+ 033035
+ 033015
+ 006001
+ 033035
+ 033015
+ 007007
+ 033035
+ 033015
+ 011003
+ 033035
+ 033015
+ 011004
+ 033035
+ 033015
+ 033007
+ 309064 26 301120
+ 008041
+ 301122
+ 201131
+ 202129
+ 104002
+ 025069
+ 007004
+ 033035
+ 033015
+ 013003
+ 033035
+ 033015
+ 202000
+ 201000
+ 104002
+ 002013
+ 012101
+ 033035
+ 033015
+ 012103
+ 033035
+ 033015
+ 010009
+ 033035
+ 033015
+ 309065 18 301120
+ 008041
+ 301122
+ 005001
+ 033035
+ 033015
+ 006001
+ 033035
+ 033015
+ 007007
+ 033035
+ 033015
+ 011003
+ 033035
+ 033015
+ 011004
+ 033035
+ 033015
+ 309066 18 301120
+ 008041
+ 301122
+ 008040
+ 201131
+ 202129
+ 025069
+ 007004
+ 013003
+ 202000
+ 201000
+ 002013
+ 012101
+ 012103
+ 010009
+ 010007
+ 011002
+ 011001
+ 309194 5 301194
+ 302004
+ 101000
+ 031001
+ 303014
+ 309195 5 301195
+ 302004
+ 101000
+ 031001
+ 303014
+ 309196 5 301196
+ 302004
+ 101000
+ 031001
+ 303014
+ 309198 5 301198
+ 302004
+ 101000
+ 031001
+ 303014
+ 310001 5 301042
+ 303031
+ 303032
+ 101026
+ 303025
+ 310002 5 301042
+ 303031
+ 303032
+ 101009
+ 303023
+ 310003 5 301042
+ 303031
+ 303032
+ 101006
+ 303023
+ 310004 5 301042
+ 303031
+ 303032
+ 101003
+ 303024
+ 310005 6 301042
+ 303031
+ 303033
+ 101000
+ 031001
+ 303025
+ 310006 6 301042
+ 303031
+ 303033
+ 101000
+ 031001
+ 303023
+ 310007 6 301042
+ 303031
+ 303033
+ 101000
+ 031001
+ 303024
+ 310008 8 310011
+ 101019
+ 310012
+ 002150
+ 025079
+ 025080
+ 033032
+ 014045
+ 310009 3 310011
+ 101015
+ 310012
+ 310010 3 310011
+ 101005
+ 310012
+ 310011 45 008070
+ 001033
+ 001034
+ 008070
+ 001033
+ 001034
+ 001007
+ 002048
+ 005040
+ 025075
+ 201133
+ 005041
+ 201000
+ 005043
+ 025070
+ 033030
+ 033031
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 005001
+ 006001
+ 202126
+ 007001
+ 202000
+ 007024
+ 005021
+ 007025
+ 005022
+ 033033
+ 002151
+ 012064
+ 002151
+ 012064
+ 002151
+ 012064
+ 002151
+ 012064
+ 310012 10 002150
+ 025076
+ 025077
+ 025078
+ 033032
+ 201132
+ 202129
+ 012063
+ 202000
+ 201000
+ 310013 62 001007
+ 005040
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 004006
+ 005001
+ 006001
+ 007025
+ 005043
+ 025085
+ 201131
+ 202129
+ 002150
+ 008023
+ 008072
+ 014027
+ 008072
+ 014027
+ 002150
+ 008023
+ 008072
+ 014027
+ 008072
+ 014027
+ 002150
+ 008023
+ 008072
+ 014027
+ 008072
+ 014027
+ 202000
+ 201000
+ 201132
+ 202129
+ 002150
+ 008023
+ 008072
+ 012063
+ 008072
+ 012063
+ 002150
+ 008023
+ 008072
+ 012063
+ 008072
+ 012063
+ 008023
+ 008072
+ 012063
+ 008072
+ 012063
+ 002150
+ 008023
+ 008072
+ 012063
+ 008072
+ 012063
+ 202000
+ 201000
+ 310014 3 301072
+ 303041
+ 304011
+ 310015 13 301072
+ 007024
+ 010002
+ 303041
+ 101003
+ 304032
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101003
+ 304033
+ 310016 13 301072
+ 007024
+ 010002
+ 303041
+ 101012
+ 304032
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101012
+ 304033
+ 310019 68 001007
+ 002019
+ 301011
+ 301013
+ 301023
+ 007025
+ 008021
+ 007025
+ 008021
+ 007025
+ 008021
+ 008029
+ 005040
+ 008075
+ 008003
+ 010004
+ 008003
+ 207002
+ 015001
+ 207000
+ 033070
+ 015030
+ 207002
+ 020081
+ 207000
+ 008003
+ 033042
+ 007004
+ 207002
+ 015001
+ 207000
+ 008003
+ 113021
+ 007004
+ 007004
+ 207002
+ 008021
+ 015005
+ 008021
+ 015005
+ 033007
+ 207000
+ 008026
+ 101020
+ 025143
+ 008026
+ 008043
+ 109015
+ 007004
+ 008090
+ 207006
+ 015008
+ 207000
+ 008090
+ 207002
+ 033007
+ 207000
+ 008043
+ 033071
+ 108008
+ 202124
+ 201107
+ 002071
+ 201000
+ 202000
+ 207002
+ 020081
+ 207000
+ 310020 6 310022
+ 301011
+ 301013
+ 301021
+ 304034
+ 310021
+ 310021 10 108000
+ 031001
+ 201131
+ 202129
+ 007004
+ 007004
+ 202000
+ 201000
+ 015020
+ 010002
+ 310022 4 001007
+ 002019
+ 001033
+ 002172
+ 310023 17 301072
+ 030021
+ 030022
+ 008012
+ 007024
+ 007025
+ 010002
+ 101012
+ 304032
+ 105002
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101012
+ 304033
+ 310024 17 301072
+ 030021
+ 030022
+ 008012
+ 007024
+ 007025
+ 010002
+ 101003
+ 304032
+ 105002
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101003
+ 304033
+ 310025 61 001007
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 201138
+ 202131
+ 004006
+ 202000
+ 201000
+ 201132
+ 005041
+ 201000
+ 201129
+ 005043
+ 201000
+ 005002
+ 006002
+ 013040
+ 020029
+ 104024
+ 005042
+ 012163
+ 021083
+ 021084
+ 115003
+ 004001
+ 004002
+ 004003
+ 201142
+ 202131
+ 004026
+ 202000
+ 201000
+ 005001
+ 006001
+ 201138
+ 202129
+ 007001
+ 202000
+ 201000
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 005040
+ 101003
+ 012070
+ 025054
+ 101004
+ 025055
+ 008007
+ 104028
+ 005002
+ 006002
+ 002111
+ 005021
+ 310026 82 310022
+ 025060
+ 008021
+ 301011
+ 301012
+ 201138
+ 202131
+ 004006
+ 202000
+ 201000
+ 033039
+ 033007
+ 304030
+ 304031
+ 002020
+ 001050
+ 202127
+ 304030
+ 202000
+ 304031
+ 201133
+ 202131
+ 004016
+ 202000
+ 201000
+ 301021
+ 304030
+ 010035
+ 005021
+ 010036
+ 113000
+ 031002
+ 301021
+ 005021
+ 108000
+ 031001
+ 002121
+ 007040
+ 015037
+ 008023
+ 201125
+ 015037
+ 201000
+ 008023
+ 033007
+ 108000
+ 031002
+ 007007
+ 015036
+ 008023
+ 201123
+ 015036
+ 201000
+ 008023
+ 033007
+ 116000
+ 031002
+ 007009
+ 010004
+ 012001
+ 013001
+ 008023
+ 201120
+ 010004
+ 201000
+ 201122
+ 012001
+ 201000
+ 201123
+ 013001
+ 201000
+ 008023
+ 033007
+ 008003
+ 007009
+ 010004
+ 008023
+ 201120
+ 010004
+ 201000
+ 008023
+ 033007
+ 310027 12 301071
+ 301011
+ 301013
+ 301021
+ 030021
+ 030022
+ 010002
+ 304036
+ 002152
+ 002167
+ 101011
+ 304035
+ 310028 12 301071
+ 301011
+ 301013
+ 301021
+ 030021
+ 030022
+ 010002
+ 304036
+ 002152
+ 002167
+ 101011
+ 304037
+ 310029 12 110000
+ 031001
+ 201138
+ 202130
+ 007004
+ 007004
+ 202000
+ 201000
+ 015020
+ 010002
+ 012101
+ 013098
+ 310030 6 310022
+ 301011
+ 301013
+ 301021
+ 304034
+ 310029
+ 310050 14 310051
+ 310052
+ 101000
+ 031002
+ 310053
+ 101004
+ 310054
+ 020010
+ 310052
+ 101015
+ 310053
+ 310052
+ 101005
+ 310053
+ 310051 16 001007
+ 005040
+ 201133
+ 005041
+ 201000
+ 201132
+ 025070
+ 201000
+ 202126
+ 007001
+ 202000
+ 007025
+ 005022
+ 102009
+ 002151
+ 012064
+ 310052 12 002019
+ 301011
+ 301012
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 301021
+ 007024
+ 005021
+ 005043
+ 310053 6 201134
+ 005042
+ 201000
+ 025076
+ 033032
+ 012163
+ 310054 13 201134
+ 005042
+ 201000
+ 025076
+ 033032
+ 201131
+ 202129
+ 102002
+ 008023
+ 014027
+ 008023
+ 202000
+ 201000
+ 310055 8 310051
+ 310052
+ 102020
+ 025076
+ 025052
+ 101000
+ 031002
+ 025050
+ 310193 5 301250
+ 303250
+ 302250
+ 303249
+ 303251
+ 310194 5 301250
+ 303250
+ 302250
+ 303249
+ 303252
+ 310195 3 301250
+ 303250
+ 304250
+ 310196 3 301250
+ 303249
+ 303251
+ 310226 39 310022
+ 025060
+ 008021
+ 301011
+ 301012
+ 201138
+ 202131
+ 004006
+ 202000
+ 201000
+ 033039
+ 033007
+ 304030
+ 304031
+ 002020
+ 001050
+ 202127
+ 304030
+ 202000
+ 304031
+ 201133
+ 202131
+ 004016
+ 202000
+ 201000
+ 301021
+ 304030
+ 010035
+ 005021
+ 010036
+ 107000
+ 031002
+ 301021
+ 005021
+ 103000
+ 031001
+ 002121
+ 007040
+ 015037
+ 311001 9 301051
+ 007002
+ 012001
+ 011001
+ 011002
+ 011031
+ 011032
+ 011033
+ 020041
+ 311002 4 301065
+ 301066
+ 311003
+ 311004
+ 311003 5 010070
+ 011001
+ 011002
+ 012001
+ 013002
+ 311004 18 101000
+ 031000
+ 011034
+ 101000
+ 031000
+ 011035
+ 101000
+ 031000
+ 011075
+ 101000
+ 031000
+ 011076
+ 101000
+ 031000
+ 033025
+ 101000
+ 031000
+ 033026
+ 311005 13 001008
+ 001023
+ 301021
+ 301011
+ 301013
+ 007010
+ 008009
+ 011001
+ 011002
+ 011031
+ 011036
+ 012101
+ 033025
+ 311006 6 007010
+ 011001
+ 011002
+ 002064
+ 012101
+ 012103
+ 311007 7 007010
+ 301021
+ 011001
+ 011002
+ 002064
+ 012101
+ 012103
+ 311008 8 001008
+ 301011
+ 301013
+ 301021
+ 008004
+ 101000
+ 031001
+ 311006
+ 311009 8 001008
+ 301011
+ 301013
+ 301021
+ 008004
+ 101000
+ 031001
+ 311007
+ 311193 16 301197
+ 301011
+ 301012
+ 301023
+ 008004
+ 007004
+ 008021
+ 011001
+ 011002
+ 011031
+ 011034
+ 011035
+ 012001
+ 012003
+ 013003
+ 020041
+ 312001 2 301043
+ 304001
+ 312002 2 301043
+ 304002
+ 312003 2 301042
+ 304003
+ 312004 2 301042
+ 304004
+ 312005 2 301042
+ 020014
+ 312006 2 301044
+ 304005
+ 312007 2 301042
+ 304006
+ 312010 6 001007
+ 005040
+ 002021
+ 005041
+ 004001
+ 004043
+ 312011 9 202131
+ 201149
+ 004006
+ 201000
+ 202126
+ 010002
+ 202000
+ 005043
+ 005053
+ 312012 6 202129
+ 201132
+ 101019
+ 012063
+ 201000
+ 202000
+ 312013 6 005042
+ 202129
+ 201135
+ 012063
+ 201000
+ 202000
+ 312014 8 312010
+ 312011
+ 105056
+ 301023
+ 005042
+ 005052
+ 312012
+ 312013
+ 312015 10 109011
+ 301023
+ 005042
+ 005052
+ 202129
+ 201132
+ 101004
+ 012063
+ 202000
+ 201000
+ 312016 3 312010
+ 312011
+ 312015
+ 312017 10 109008
+ 301023
+ 005042
+ 005052
+ 202129
+ 201132
+ 101003
+ 012063
+ 202000
+ 201000
+ 312018 3 312010
+ 312011
+ 312017
+ 312019 13 301047
+ 301048
+ 015015
+ 029002
+ 021076
+ 106012
+ 201129
+ 006030
+ 201000
+ 102012
+ 005030
+ 021075
+ 021066
+ 312020 11 301047
+ 301048
+ 015015
+ 029002
+ 021076
+ 104012
+ 006030
+ 102012
+ 005030
+ 021075
+ 021066
+ 312021 6 301047
+ 101003
+ 301049
+ 011012
+ 011011
+ 021067
+ 312022 15 301047
+ 008022
+ 011012
+ 011050
+ 022070
+ 022026
+ 312041
+ 010050
+ 021068
+ 021071
+ 021072
+ 021073
+ 312042
+ 021062
+ 015011
+ 312023 7 301047
+ 103003
+ 008022
+ 012061
+ 022050
+ 021069
+ 021085
+ 312024 11 312020
+ 008060
+ 008022
+ 008060
+ 008022
+ 025014
+ 022101
+ 022097
+ 022098
+ 022099
+ 022100
+ 312025 11 312019
+ 008060
+ 008022
+ 008060
+ 008022
+ 025014
+ 022101
+ 022097
+ 022098
+ 022099
+ 022100
+ 312026 19 301046
+ 301011
+ 301013
+ 301023
+ 312031
+ 101004
+ 312030
+ 021110
+ 301023
+ 321027
+ 021111
+ 301023
+ 321027
+ 021112
+ 301023
+ 321027
+ 021113
+ 301023
+ 321027
+ 312027 9 301047
+ 105009
+ 301023
+ 007021
+ 012061
+ 007021
+ 012061
+ 021085
+ 021070
+ 312028 26 301046
+ 301011
+ 301013
+ 301023
+ 008025
+ 201136
+ 004006
+ 201000
+ 312031
+ 312032
+ 101004
+ 312030
+ 101002
+ 312033
+ 021110
+ 301023
+ 321028
+ 021111
+ 301023
+ 321028
+ 021112
+ 301023
+ 321028
+ 021113
+ 301023
+ 321028
+ 312030 13 201130
+ 202129
+ 011012
+ 202000
+ 201000
+ 011052
+ 201135
+ 202130
+ 011011
+ 202000
+ 201000
+ 011053
+ 021104
+ 312031 8 005034
+ 006034
+ 021109
+ 011081
+ 011082
+ 021101
+ 021102
+ 021103
+ 312032 4 021120
+ 021121
+ 013055
+ 021122
+ 312033 4 002104
+ 008022
+ 012063
+ 012065
+ 312041 5 201141
+ 202130
+ 007001
+ 201000
+ 202000
+ 312042 6 021077
+ 021078
+ 021079
+ 021080
+ 021081
+ 021082
+ 312045 21 001007
+ 002019
+ 001096
+ 025061
+ 005040
+ 301011
+ 301013
+ 301021
+ 007002
+ 012180
+ 012181
+ 012182
+ 012183
+ 012184
+ 012185
+ 002174
+ 021086
+ 012186
+ 021087
+ 012187
+ 033043
+ 312050 23 001007
+ 002019
+ 001096
+ 025061
+ 005040
+ 301011
+ 301013
+ 301021
+ 007025
+ 005022
+ 010080
+ 027080
+ 008003
+ 007004
+ 013093
+ 008003
+ 201131
+ 202129
+ 007004
+ 007004
+ 202000
+ 201000
+ 013095
+ 312051 48 001007
+ 002019
+ 001096
+ 025061
+ 005040
+ 008075
+ 301011
+ 301013
+ 301021
+ 001012
+ 201131
+ 001013
+ 201000
+ 010032
+ 010033
+ 010034
+ 007002
+ 008012
+ 025110
+ 025111
+ 025102
+ 002104
+ 025103
+ 025104
+ 025105
+ 025106
+ 025107
+ 025108
+ 002111
+ 002121
+ 002026
+ 002027
+ 021130
+ 021131
+ 021132
+ 021133
+ 021064
+ 025014
+ 021134
+ 107018
+ 005030
+ 105024
+ 201130
+ 006030
+ 201000
+ 021135
+ 021136
+ 033044
+ 312052 77 001007
+ 002019
+ 001096
+ 025061
+ 005040
+ 025120
+ 025121
+ 025124
+ 025125
+ 025122
+ 025123
+ 301011
+ 301013
+ 301021
+ 007002
+ 002119
+ 033047
+ 010081
+ 010082
+ 010083
+ 010084
+ 002116
+ 002117
+ 002118
+ 002156
+ 002157
+ 014055
+ 022150
+ 022151
+ 022152
+ 022153
+ 022154
+ 022155
+ 022156
+ 022157
+ 022158
+ 022159
+ 021137
+ 021138
+ 021139
+ 021140
+ 021141
+ 021142
+ 010085
+ 010086
+ 010087
+ 010088
+ 010089
+ 010090
+ 010091
+ 010092
+ 010093
+ 011002
+ 025126
+ 025127
+ 025128
+ 025129
+ 025130
+ 025131
+ 025132
+ 025133
+ 025134
+ 025135
+ 025136
+ 025137
+ 013096
+ 013097
+ 011095
+ 011096
+ 012188
+ 012189
+ 002158
+ 002159
+ 033052
+ 033053
+ 021143
+ 021144
+ 312053 54 001007
+ 002019
+ 001096
+ 025061
+ 005040
+ 008075
+ 301011
+ 301013
+ 301021
+ 001012
+ 201131
+ 001013
+ 201000
+ 010032
+ 010033
+ 010034
+ 007002
+ 008012
+ 025110
+ 025111
+ 025102
+ 002104
+ 025103
+ 025104
+ 025105
+ 025106
+ 025107
+ 025108
+ 011001
+ 011002
+ 022160
+ 025138
+ 201130
+ 202129
+ 022021
+ 202000
+ 201000
+ 033048
+ 033049
+ 002026
+ 002027
+ 021130
+ 021131
+ 021132
+ 021133
+ 025014
+ 106036
+ 005030
+ 104024
+ 201130
+ 006030
+ 201000
+ 022161
+ 033044
+ 312055 5 005033
+ 005040
+ 006034
+ 010095
+ 021157
+ 312056 11 025060
+ 001032
+ 011082
+ 011081
+ 020095
+ 020096
+ 021155
+ 201133
+ 021101
+ 021102
+ 201000
+ 312057 12 201130
+ 202129
+ 011012
+ 202000
+ 201000
+ 201131
+ 202129
+ 011011
+ 202000
+ 201000
+ 021156
+ 021104
+ 312058 8 301125
+ 301011
+ 301013
+ 301021
+ 312055
+ 021150
+ 101003
+ 321030
+ 312059 4 312056
+ 101000
+ 031001
+ 312057
+ 312060 20 025060
+ 025062
+ 040001
+ 040002
+ 021062
+ 021151
+ 021152
+ 021153
+ 021154
+ 021062
+ 021062
+ 040003
+ 040004
+ 040005
+ 040006
+ 040007
+ 020065
+ 040008
+ 040009
+ 040010
+ 312061 3 312058
+ 312060
+ 312059
+ 312070 27 001007
+ 002019
+ 001144
+ 001124
+ 030010
+ 301011
+ 301013
+ 301021
+ 007012
+ 015012
+ 012165
+ 012166
+ 012167
+ 012168
+ 027010
+ 028010
+ 002099
+ 013048
+ 025081
+ 025082
+ 025083
+ 025084
+ 012080
+ 012081
+ 012082
+ 025174
+ 033028
+ 312200 10 301237
+ 301238
+ 029002
+ 021206
+ 104012
+ 006232
+ 102012
+ 005232
+ 021205
+ 021196
+ 312201 6 301237
+ 101003
+ 301239
+ 011012
+ 011011
+ 021197
+ 312202 13 301237
+ 008022
+ 011012
+ 011050
+ 301240
+ 022243
+ 301241
+ 010050
+ 021198
+ 021201
+ 021202
+ 021203
+ 301242
+ 312203 8 301237
+ 008022
+ 012061
+ 022050
+ 021204
+ 021199
+ 021214
+ 021215
+ 312204 12 312201
+ 001031
+ 011012
+ 011011
+ 021200
+ 021213
+ 004004
+ 008021
+ 004024
+ 055003
+ 011012
+ 011011
+ 312207 3 312202
+ 301202
+ 033191
+ 312208 17 301202
+ 008022
+ 008021
+ 301011
+ 301013
+ 301023
+ 302205
+ 011002
+ 001007
+ 002021
+ 301011
+ 301013
+ 301023
+ 001032
+ 001192
+ 302205
+ 011002
+ 312209 11 301202
+ 001192
+ 301011
+ 301013
+ 301023
+ 302206
+ 104000
+ 022192
+ 102000
+ 005232
+ 022191
+ 312210 13 312202
+ 021192
+ 015202
+ 301011
+ 004004
+ 004005
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 304228
+ 304229
+ 312211 19 301046
+ 301011
+ 301013
+ 301023
+ 312031
+ 101004
+ 312030
+ 021110
+ 101004
+ 312212
+ 021111
+ 101004
+ 312212
+ 021112
+ 101004
+ 312212
+ 021113
+ 101004
+ 312212
+ 312212 2 301023
+ 321027
+ 313009 4 021001
+ 101000
+ 031001
+ 021001
+ 313010 4 021036
+ 101000
+ 031001
+ 021036
+ 313031 5 006002
+ 006012
+ 101000
+ 031002
+ 030001
+ 313032 5 005002
+ 005012
+ 101000
+ 031002
+ 313031
+ 313041 13 006002
+ 110000
+ 031001
+ 104000
+ 031001
+ 006012
+ 101000
+ 031012
+ 030001
+ 006012
+ 101000
+ 031001
+ 030001
+ 313042 5 005002
+ 005012
+ 101000
+ 031002
+ 313041
+ 313043 17 006002
+ 005002
+ 005012
+ 112000
+ 031001
+ 110000
+ 031001
+ 104000
+ 031001
+ 006012
+ 101000
+ 031011
+ 030001
+ 006012
+ 101000
+ 031001
+ 030001
+ 315001 5 001011
+ 301011
+ 301012
+ 301023
+ 306001
+ 315002 5 001011
+ 301011
+ 301012
+ 301023
+ 306004
+ 315003 25 001087
+ 001085
+ 001086
+ 002036
+ 002148
+ 002149
+ 022055
+ 022056
+ 022067
+ 301011
+ 301012
+ 301021
+ 008080
+ 033050
+ 109000
+ 031002
+ 007065
+ 008080
+ 033050
+ 022045
+ 008080
+ 033050
+ 022064
+ 008080
+ 033050
+ 316001 10 301011
+ 004004
+ 301023
+ 001021
+ 002041
+ 019001
+ 010051
+ 019002
+ 019003
+ 019004
+ 316002 15 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 001033
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 007002
+ 007002
+ 316003 12 110000
+ 031001
+ 008011
+ 008007
+ 104000
+ 031001
+ 005002
+ 006002
+ 010002
+ 011002
+ 008007
+ 008011
+ 316004 13 111000
+ 031001
+ 008011
+ 008007
+ 007002
+ 007002
+ 102000
+ 031001
+ 005002
+ 006002
+ 011031
+ 008007
+ 008011
+ 316005 10 108000
+ 031001
+ 008005
+ 008007
+ 005002
+ 006002
+ 001026
+ 019001
+ 008007
+ 008005
+ 316006 14 112000
+ 031001
+ 008011
+ 008007
+ 007002
+ 007002
+ 102000
+ 031001
+ 005002
+ 006002
+ 020011
+ 020012
+ 008007
+ 008011
+ 316007 12 110000
+ 031001
+ 008011
+ 008007
+ 104000
+ 031001
+ 005002
+ 006002
+ 019005
+ 019006
+ 008007
+ 008011
+ 316008 13 111000
+ 031001
+ 008001
+ 008007
+ 008023
+ 103000
+ 031001
+ 005002
+ 006002
+ 010002
+ 008023
+ 008007
+ 008001
+ 316009 13 111000
+ 031001
+ 008011
+ 008007
+ 007002
+ 007002
+ 102000
+ 031001
+ 005002
+ 006002
+ 020041
+ 008007
+ 008011
+ 316010 9 107000
+ 031001
+ 008011
+ 008007
+ 001022
+ 005002
+ 006002
+ 008007
+ 008011
+ 316011 19 117000
+ 031001
+ 008011
+ 001022
+ 008007
+ 102000
+ 031001
+ 005002
+ 006002
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 020090
+ 008021
+ 008007
+ 008011
+ 316020 5 001023
+ 001025
+ 001027
+ 301011
+ 301012
+ 316021 23 301023
+ 002041
+ 019001
+ 019007
+ 019005
+ 019006
+ 019008
+ 008005
+ 010004
+ 008005
+ 010004
+ 019007
+ 008005
+ 008021
+ 004075
+ 011040
+ 019007
+ 105004
+ 005021
+ 005021
+ 102002
+ 019003
+ 019004
+ 316022 24 001032
+ 002041
+ 019001
+ 019010
+ 118000
+ 031001
+ 008021
+ 004014
+ 008005
+ 301023
+ 019005
+ 019006
+ 010004
+ 011041
+ 008021
+ 004075
+ 011040
+ 019008
+ 105004
+ 005021
+ 005021
+ 102002
+ 019003
+ 019004
+ 316026 2 316020
+ 316021
+ 316030 10 301014
+ 001037
+ 010064
+ 008019
+ 001062
+ 008019
+ 001065
+ 008019
+ 001062
+ 008019
+ 316031 8 008021
+ 301011
+ 301012
+ 301027
+ 019005
+ 019006
+ 020028
+ 008021
+ 316032 5 008021
+ 301011
+ 301012
+ 301027
+ 008021
+ 316033 7 008021
+ 301011
+ 301012
+ 101000
+ 031001
+ 301027
+ 008021
+ 316034 17 008079
+ 316030
+ 008011
+ 001022
+ 008007
+ 301023
+ 008007
+ 020090
+ 316031
+ 101000
+ 031000
+ 316032
+ 101000
+ 031001
+ 316033
+ 008011
+ 008079
+ 316035 9 008079
+ 316030
+ 008011
+ 020023
+ 020021
+ 020008
+ 316031
+ 008011
+ 008079
+ 316036 13 008079
+ 316030
+ 008011
+ 001027
+ 316031
+ 101000
+ 031000
+ 316032
+ 101000
+ 031001
+ 316033
+ 008011
+ 008079
+ 316037 7 008079
+ 316030
+ 008011
+ 011031
+ 316031
+ 008011
+ 008079
+ 316038 8 008079
+ 316030
+ 008011
+ 020041
+ 020021
+ 316031
+ 008011
+ 008079
+ 316039 7 008079
+ 316030
+ 008011
+ 020024
+ 316031
+ 008011
+ 008079
+ 316040 6 316030
+ 008079
+ 301014
+ 001037
+ 010064
+ 008079
+ 316050 16 301001
+ 301011
+ 301012
+ 002160
+ 008005
+ 005002
+ 006002
+ 008005
+ 019100
+ 019005
+ 019006
+ 019101
+ 019102
+ 019103
+ 019104
+ 019105
+ 316052 29 301005
+ 301011
+ 301012
+ 001007
+ 025150
+ 122000
+ 031001
+ 001027
+ 019150
+ 019106
+ 008005
+ 005002
+ 006002
+ 008005
+ 019107
+ 019005
+ 019006
+ 019108
+ 019109
+ 019110
+ 019111
+ 019112
+ 019113
+ 019114
+ 019115
+ 019116
+ 019117
+ 019118
+ 019119
+ 318001 2 301025
+ 024011
+ 318003 4 301026
+ 024005
+ 024004
+ 024021
+ 318004 6 301025
+ 004023
+ 013011
+ 024005
+ 024004
+ 024022
+ 321001 6 002101
+ 002114
+ 002105
+ 002106
+ 002107
+ 002121
+ 321003 4 021051
+ 021014
+ 021017
+ 021030
+ 321004 5 301031
+ 002003
+ 101000
+ 031001
+ 321003
+ 321005 12 025004
+ 002121
+ 002122
+ 002123
+ 002124
+ 002125
+ 002126
+ 002127
+ 002128
+ 002129
+ 002130
+ 002131
+ 321006 4 025001
+ 025002
+ 025003
+ 025005
+ 321007 8 025009
+ 025010
+ 025011
+ 025012
+ 025013
+ 025015
+ 025016
+ 025017
+ 321008 3 025006
+ 025007
+ 025008
+ 321009 2 025018
+ 025019
+ 321010 13 002101
+ 007002
+ 002102
+ 002103
+ 002104
+ 002105
+ 002106
+ 002107
+ 002108
+ 002109
+ 002110
+ 002132
+ 002133
+ 321011 3 030031
+ 030032
+ 029002
+ 321012 3 101000
+ 031001
+ 002135
+ 321021 15 002003
+ 002101
+ 201130
+ 002106
+ 201000
+ 201132
+ 202130
+ 002121
+ 202000
+ 201000
+ 201133
+ 202129
+ 025001
+ 202000
+ 201000
+ 321022 11 007007
+ 204001
+ 031021
+ 011001
+ 204000
+ 011002
+ 204001
+ 031021
+ 011006
+ 204000
+ 021030
+ 321023 9 007007
+ 021091
+ 021030
+ 202129
+ 021014
+ 201129
+ 021017
+ 202000
+ 201000
+ 321024 7 007007
+ 204001
+ 031021
+ 012007
+ 011006
+ 204000
+ 021030
+ 321025 17 007007
+ 021091
+ 021030
+ 202129
+ 021014
+ 201129
+ 021017
+ 202000
+ 201000
+ 021092
+ 021030
+ 025092
+ 201129
+ 202129
+ 021017
+ 202000
+ 201000
+ 321026 10 007007
+ 204001
+ 031021
+ 012007
+ 025091
+ 011071
+ 011072
+ 011073
+ 011074
+ 204000
+ 321027 18 021118
+ 202129
+ 201132
+ 002112
+ 201000
+ 201131
+ 002111
+ 201000
+ 202000
+ 002104
+ 021105
+ 021106
+ 021107
+ 021114
+ 021115
+ 021116
+ 008018
+ 021117
+ 321028 18 021118
+ 202129
+ 201132
+ 002112
+ 201000
+ 201131
+ 002111
+ 201000
+ 202000
+ 002104
+ 021123
+ 021106
+ 021107
+ 021114
+ 021115
+ 021116
+ 008018
+ 021117
+ 321030 18 008085
+ 202129
+ 201131
+ 002111
+ 201000
+ 202000
+ 002134
+ 021062
+ 021063
+ 021158
+ 021159
+ 021160
+ 021161
+ 021162
+ 021163
+ 021164
+ 021165
+ 021166
+ 340001 45 001007
+ 001031
+ 002019
+ 002020
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 005001
+ 006001
+ 007024
+ 005021
+ 007025
+ 005022
+ 005043
+ 005040
+ 201133
+ 005041
+ 201000
+ 201132
+ 025070
+ 201000
+ 202126
+ 007001
+ 202000
+ 033060
+ 033061
+ 033062
+ 033063
+ 033064
+ 033065
+ 101010
+ 340002
+ 101087
+ 340003
+ 002019
+ 025051
+ 101007
+ 340004
+ 340002 3 025140
+ 025141
+ 025142
+ 340003 5 104100
+ 201136
+ 005042
+ 201000
+ 014046
+ 340004 9 005060
+ 005061
+ 025085
+ 105006
+ 005042
+ 025142
+ 014047
+ 025142
+ 014048
+ 340005 94 001007
+ 002019
+ 001096
+ 025061
+ 005044
+ 005040
+ 001030
+ 301011
+ 301012
+ 004007
+ 005001
+ 006001
+ 008029
+ 008074
+ 008077
+ 040011
+ 025097
+ 025095
+ 025098
+ 025099
+ 021144
+ 025096
+ 040012
+ 040013
+ 021169
+ 022151
+ 022162
+ 022163
+ 025160
+ 025133
+ 022156
+ 022164
+ 022165
+ 022166
+ 021137
+ 021138
+ 022167
+ 021139
+ 021118
+ 021145
+ 021146
+ 021147
+ 022168
+ 022169
+ 022170
+ 025161
+ 025162
+ 022171
+ 022172
+ 022173
+ 022174
+ 021170
+ 021171
+ 022175
+ 021172
+ 021118
+ 021173
+ 021174
+ 021175
+ 102003
+ 002153
+ 012063
+ 013090
+ 013091
+ 007002
+ 011097
+ 011098
+ 007002
+ 011095
+ 011096
+ 010096
+ 010081
+ 010082
+ 010083
+ 010101
+ 025132
+ 025163
+ 025126
+ 025128
+ 025164
+ 010085
+ 010097
+ 010086
+ 010087
+ 010092
+ 010088
+ 010089
+ 010098
+ 010099
+ 010090
+ 010100
+ 010093
+ 025127
+ 040014
+ 340007 57 001007
+ 001031
+ 002019
+ 002020
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 005001
+ 006001
+ 007024
+ 005021
+ 007025
+ 005022
+ 005043
+ 005040
+ 201133
+ 005041
+ 201000
+ 201132
+ 025070
+ 201000
+ 202126
+ 007001
+ 202000
+ 103003
+ 025140
+ 025141
+ 033060
+ 033061
+ 033062
+ 033063
+ 033064
+ 033065
+ 040020
+ 101010
+ 340002
+ 101087
+ 340003
+ 002019
+ 025051
+ 101007
+ 340004
+ 020081
+ 008029
+ 020083
+ 008029
+ 040018
+ 040019
+ 040021
+ 040022
+ 340008 61 001007
+ 001031
+ 002019
+ 002020
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 005001
+ 006001
+ 007024
+ 005021
+ 007025
+ 005022
+ 005043
+ 005040
+ 201133
+ 005041
+ 201000
+ 201132
+ 025070
+ 201000
+ 202126
+ 007001
+ 202000
+ 103003
+ 025140
+ 025141
+ 033060
+ 033061
+ 033062
+ 033063
+ 033064
+ 033065
+ 040020
+ 101010
+ 340002
+ 104000
+ 031002
+ 201136
+ 005042
+ 201000
+ 014046
+ 002019
+ 025051
+ 101007
+ 340004
+ 020081
+ 008029
+ 020083
+ 008029
+ 040018
+ 040019
+ 040021
+ 040022
diff --git a/bufrtables/D0000000000098014001.TXT b/bufrtables/D0000000000098014001.TXT
new file mode 100755
index 0000000..7e90777
--- /dev/null
+++ b/bufrtables/D0000000000098014001.TXT
@@ -0,0 +1,5115 @@
+ 300002 2 000002
+ 000003
+ 300003 3 000010
+ 000011
+ 000012
+ 300004 9 300003
+ 000013
+ 000014
+ 000015
+ 000016
+ 000017
+ 000018
+ 000019
+ 000020
+ 300010 4 300003
+ 101000
+ 031001
+ 000030
+ 301001 2 001001
+ 001002
+ 301002 3 001003
+ 001004
+ 001005
+ 301003 3 001011
+ 001012
+ 001013
+ 301004 4 001001
+ 001002
+ 001015
+ 002001
+ 301005 2 001035
+ 001034
+ 301011 3 004001
+ 004002
+ 004003
+ 301012 2 004004
+ 004005
+ 301013 3 004004
+ 004005
+ 004006
+ 301014 3 102002
+ 301011
+ 301012
+ 301021 2 005001
+ 006001
+ 301022 3 005001
+ 006001
+ 007001
+ 301023 2 005002
+ 006002
+ 301024 3 005002
+ 006002
+ 007001
+ 301025 3 301023
+ 004003
+ 301012
+ 301026 7 301021
+ 004003
+ 004003
+ 004004
+ 004004
+ 004005
+ 004005
+ 301027 5 008007
+ 101000
+ 031001
+ 301028
+ 008007
+ 301028 8 008040
+ 033042
+ 007010
+ 101000
+ 031002
+ 301023
+ 019007
+ 008040
+ 301031 5 301001
+ 002001
+ 301011
+ 301012
+ 301022
+ 301032 5 301001
+ 002001
+ 301011
+ 301012
+ 301024
+ 301033 5 001005
+ 002001
+ 301011
+ 301012
+ 301021
+ 301034 5 001005
+ 002001
+ 301011
+ 301012
+ 301023
+ 301035 7 001005
+ 001012
+ 001013
+ 002001
+ 301011
+ 301012
+ 301023
+ 301036 5 301003
+ 002001
+ 301011
+ 301012
+ 301023
+ 301037 6 301001
+ 002011
+ 002012
+ 301011
+ 301012
+ 301022
+ 301038 6 301001
+ 002011
+ 002012
+ 301011
+ 301012
+ 301024
+ 301039 6 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 301040 6 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301024
+ 301041 5 001007
+ 002021
+ 002022
+ 301011
+ 301012
+ 301042 2 301041
+ 301021
+ 301043 5 001007
+ 002023
+ 301011
+ 301013
+ 301021
+ 301044 5 001007
+ 002024
+ 301011
+ 301013
+ 301021
+ 301045 9 301011
+ 301012
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 304030
+ 304031
+ 301046 10 001007
+ 001012
+ 002048
+ 021119
+ 025060
+ 202124
+ 002026
+ 002027
+ 202000
+ 005040
+ 301047 15 001007
+ 025060
+ 001033
+ 001034
+ 001012
+ 301045
+ 002021
+ 301011
+ 301012
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 301023
+ 301048 14 002104
+ 002121
+ 002113
+ 002026
+ 002027
+ 002111
+ 002140
+ 202127
+ 001013
+ 202126
+ 007001
+ 202000
+ 025010
+ 021064
+ 301049 5 002111
+ 002112
+ 021062
+ 021063
+ 021065
+ 301051 6 001006
+ 002061
+ 301011
+ 301012
+ 301021
+ 008004
+ 301055 7 001005
+ 002001
+ 301011
+ 301012
+ 301021
+ 001012
+ 001014
+ 301062 3 101000
+ 031001
+ 301001
+ 301065 8 001006
+ 001008
+ 002001
+ 002002
+ 002005
+ 002062
+ 002070
+ 002065
+ 301066 6 301011
+ 301013
+ 301023
+ 007004
+ 002064
+ 008004
+ 301070 3 002143
+ 002142
+ 002144
+ 301071 5 001007
+ 001031
+ 002020
+ 002028
+ 002029
+ 301072 4 301071
+ 301011
+ 301013
+ 301021
+ 301074 4 002143
+ 002142
+ 002145
+ 002146
+ 301075 6 301001
+ 001015
+ 301024
+ 008021
+ 301011
+ 301012
+ 301076 3 002011
+ 002143
+ 002142
+ 301089 2 001101
+ 001102
+ 301090 6 301004
+ 301011
+ 301012
+ 301021
+ 007030
+ 007031
+ 301091 10 002180
+ 002181
+ 002182
+ 002183
+ 002184
+ 002179
+ 002186
+ 002187
+ 002188
+ 002189
+ 301092 9 001011
+ 001003
+ 002001
+ 301011
+ 301012
+ 301021
+ 007030
+ 007031
+ 033024
+ 301093 3 301036
+ 007030
+ 007031
+ 301110 5 301001
+ 001011
+ 002011
+ 002014
+ 002003
+ 301111 6 301001
+ 001011
+ 002011
+ 002013
+ 002014
+ 002003
+ 301112 5 001006
+ 002011
+ 002013
+ 002014
+ 002003
+ 301113 3 008021
+ 301011
+ 301013
+ 301114 5 301021
+ 007030
+ 007031
+ 007007
+ 033024
+ 301120 4 301001
+ 001094
+ 002011
+ 301121
+ 301121 5 008041
+ 301122
+ 301021
+ 007031
+ 007007
+ 301122 7 301011
+ 301012
+ 201135
+ 202130
+ 004006
+ 202000
+ 201000
+ 301123 33 102002
+ 008041
+ 001062
+ 301001
+ 001094
+ 002011
+ 001018
+ 001095
+ 025061
+ 025068
+ 001082
+ 001083
+ 001081
+ 002067
+ 002066
+ 002014
+ 025067
+ 025065
+ 025066
+ 002095
+ 002096
+ 002097
+ 002016
+ 002083
+ 002080
+ 002081
+ 001093
+ 002084
+ 002085
+ 002086
+ 002082
+ 008041
+ 301011
+ 301125 6 001033
+ 001034
+ 025060
+ 001007
+ 002019
+ 001012
+ 301193 5 001007
+ 001031
+ 002196
+ 002221
+ 002222
+ 301194 9 001194
+ 001012
+ 001013
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301195 9 001195
+ 001012
+ 001013
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301196 7 301003
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301197 9 001006
+ 001008
+ 002061
+ 002062
+ 002002
+ 002005
+ 002070
+ 002063
+ 002001
+ 301198 9 001011
+ 001012
+ 001013
+ 002011
+ 002012
+ 301011
+ 301012
+ 301023
+ 007001
+ 301200 2 001032
+ 033194
+ 301201 2 101003
+ 033193
+ 301202 2 001031
+ 001032
+ 301237 12 001007
+ 001012
+ 002021
+ 301011
+ 004004
+ 004005
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 301023
+ 301238 14 002104
+ 002121
+ 002113
+ 002026
+ 002027
+ 002111
+ 002192
+ 202127
+ 001013
+ 202126
+ 007001
+ 202000
+ 025010
+ 021194
+ 301239 5 002111
+ 002112
+ 021192
+ 021193
+ 021195
+ 301240 5 201131
+ 202129
+ 022021
+ 201000
+ 202000
+ 301241 5 201141
+ 202130
+ 007001
+ 201000
+ 202000
+ 301242 6 021207
+ 021208
+ 021209
+ 021210
+ 021211
+ 021212
+ 301250 4 301193
+ 301011
+ 301013
+ 301021
+ 302001 4 010004
+ 010051
+ 010061
+ 010063
+ 302002 5 010004
+ 007004
+ 010003
+ 010061
+ 010063
+ 302003 9 011011
+ 011012
+ 012004
+ 012006
+ 013003
+ 020001
+ 020003
+ 020004
+ 020005
+ 302004 7 020010
+ 008002
+ 020011
+ 020013
+ 020012
+ 020012
+ 020012
+ 302005 4 008002
+ 020011
+ 020012
+ 020013
+ 302006 4 010004
+ 010051
+ 010062
+ 010063
+ 302011 3 302001
+ 302003
+ 302004
+ 302012 3 302002
+ 302003
+ 302004
+ 302013 5 302006
+ 302003
+ 101000
+ 031001
+ 302005
+ 302021 3 022001
+ 022011
+ 022021
+ 302022 3 022002
+ 022012
+ 022022
+ 302023 3 022003
+ 022013
+ 022023
+ 302024 3 302022
+ 101002
+ 302023
+ 302031 4 302001
+ 010062
+ 007004
+ 010009
+ 302032 4 007032
+ 012101
+ 012103
+ 013003
+ 302033 2 007032
+ 020001
+ 302034 2 007032
+ 013023
+ 302035 8 302032
+ 302033
+ 302034
+ 007032
+ 302004
+ 101000
+ 031001
+ 302005
+ 302036 7 105000
+ 031001
+ 008002
+ 020011
+ 020012
+ 020014
+ 020017
+ 302037 3 020062
+ 013013
+ 012113
+ 302038 4 020003
+ 004024
+ 020004
+ 020005
+ 302039 2 004024
+ 014031
+ 302040 4 007032
+ 102002
+ 004024
+ 013011
+ 302041 7 007032
+ 004024
+ 004024
+ 012111
+ 004024
+ 004024
+ 012112
+ 302042 11 007032
+ 002002
+ 008021
+ 004025
+ 011001
+ 011002
+ 008021
+ 103002
+ 004025
+ 011043
+ 011041
+ 302043 7 302038
+ 101002
+ 302039
+ 302040
+ 302041
+ 302042
+ 007032
+ 302044 3 004024
+ 002004
+ 013033
+ 302045 7 004024
+ 014002
+ 014004
+ 014016
+ 014028
+ 014029
+ 014030
+ 302046 3 004024
+ 004024
+ 012049
+ 302047 3 102003
+ 008002
+ 020054
+ 302048 5 005021
+ 007021
+ 020012
+ 005021
+ 007021
+ 302049 7 008002
+ 020011
+ 020013
+ 020012
+ 020012
+ 020012
+ 008002
+ 302050 31 008041
+ 005021
+ 007005
+ 202130
+ 006021
+ 202000
+ 008041
+ 201131
+ 202129
+ 002115
+ 010004
+ 002115
+ 013003
+ 202000
+ 201000
+ 002115
+ 011001
+ 011002
+ 002115
+ 102002
+ 012101
+ 004024
+ 002115
+ 012103
+ 012102
+ 101003
+ 020012
+ 020011
+ 020013
+ 101002
+ 020003
+ 302051 12 010004
+ 010051
+ 007004
+ 010003
+ 012004
+ 012051
+ 012016
+ 012017
+ 013004
+ 102004
+ 008051
+ 008020
+ 302052 7 007032
+ 007033
+ 012101
+ 002039
+ 012102
+ 012103
+ 013003
+ 302053 3 007032
+ 007033
+ 020001
+ 302054 9 302052
+ 302053
+ 007033
+ 302034
+ 007032
+ 302004
+ 101000
+ 031001
+ 302005
+ 302055 8 020031
+ 020032
+ 020033
+ 020034
+ 020035
+ 020036
+ 020037
+ 020038
+ 302056 4 002038
+ 007063
+ 022043
+ 007063
+ 302057 3 302056
+ 302021
+ 302024
+ 302058 8 007032
+ 007033
+ 004024
+ 004024
+ 012111
+ 004024
+ 004024
+ 012112
+ 302059 12 007032
+ 007033
+ 002002
+ 008021
+ 004025
+ 011001
+ 011002
+ 008021
+ 103002
+ 004025
+ 011043
+ 011041
+ 302060 4 302038
+ 302040
+ 302058
+ 302059
+ 302062 24 302001
+ 302052
+ 302053
+ 007033
+ 101000
+ 031000
+ 302034
+ 007032
+ 101000
+ 031001
+ 302005
+ 008002
+ 101000
+ 031000
+ 302055
+ 101000
+ 031000
+ 302056
+ 101000
+ 031000
+ 302021
+ 101000
+ 031000
+ 302024
+ 302063 8 302038
+ 101000
+ 031000
+ 302040
+ 101000
+ 031000
+ 302058
+ 302059
+ 302066 16 020023
+ 020024
+ 020027
+ 020054
+ 020023
+ 020027
+ 020054
+ 020025
+ 020026
+ 020027
+ 020040
+ 020066
+ 020027
+ 020021
+ 020067
+ 020027
+ 302069 4 007032
+ 007033
+ 033041
+ 020001
+ 302070 8 007032
+ 007033
+ 011001
+ 011002
+ 011043
+ 011041
+ 011016
+ 011017
+ 302071 14 007032
+ 007033
+ 008021
+ 004025
+ 011001
+ 011002
+ 008021
+ 103002
+ 004025
+ 011043
+ 011041
+ 004025
+ 011016
+ 011017
+ 302072 5 007032
+ 007033
+ 012101
+ 012103
+ 013003
+ 302073 7 020010
+ 105004
+ 008002
+ 020011
+ 020012
+ 033041
+ 020013
+ 302074 4 020003
+ 004025
+ 020004
+ 020005
+ 302075 5 008021
+ 004025
+ 013055
+ 013058
+ 008021
+ 302076 7 020021
+ 020022
+ 026020
+ 020023
+ 020024
+ 020025
+ 020026
+ 302077 8 007032
+ 007033
+ 004025
+ 012111
+ 012112
+ 007032
+ 004025
+ 012112
+ 302078 4 002176
+ 020062
+ 002177
+ 013013
+ 302079 5 007032
+ 002175
+ 002178
+ 004025
+ 013011
+ 302080 3 002185
+ 004025
+ 013033
+ 302081 2 004025
+ 014031
+ 302082 7 004025
+ 014002
+ 014004
+ 014016
+ 014028
+ 014029
+ 014030
+ 302083 8 004025
+ 008023
+ 010004
+ 011001
+ 011002
+ 012101
+ 013003
+ 008023
+ 302084 41 302031
+ 302072
+ 103000
+ 031000
+ 101005
+ 307063
+ 007061
+ 101000
+ 031000
+ 302069
+ 007032
+ 007033
+ 105000
+ 031000
+ 020031
+ 020032
+ 002038
+ 022043
+ 302021
+ 101000
+ 031000
+ 302078
+ 012113
+ 101000
+ 031000
+ 302004
+ 105000
+ 031001
+ 008002
+ 020011
+ 020012
+ 033041
+ 020013
+ 302036
+ 101000
+ 031000
+ 302047
+ 008002
+ 101000
+ 031000
+ 302048
+ 302085 63 105000
+ 031000
+ 020003
+ 103002
+ 004024
+ 020004
+ 020005
+ 101000
+ 031000
+ 302175
+ 102000
+ 031000
+ 004025
+ 302076
+ 102000
+ 031000
+ 004025
+ 013059
+ 007032
+ 007033
+ 008021
+ 004025
+ 011001
+ 011002
+ 008021
+ 103003
+ 004025
+ 011043
+ 011041
+ 004025
+ 011016
+ 011017
+ 302077
+ 007033
+ 302041
+ 106000
+ 031000
+ 007032
+ 002175
+ 002178
+ 102005
+ 004024
+ 013011
+ 007032
+ 103000
+ 031000
+ 002185
+ 101002
+ 302044
+ 102000
+ 031000
+ 101002
+ 302039
+ 102000
+ 031000
+ 101002
+ 302045
+ 101000
+ 031000
+ 302046
+ 101000
+ 031000
+ 302083
+ 302089 8 020101
+ 020102
+ 020103
+ 020104
+ 020105
+ 020106
+ 020107
+ 020108
+ 302175 5 008021
+ 004025
+ 013155
+ 013058
+ 008021
+ 302205 5 201131
+ 202129
+ 022021
+ 201000
+ 202000
+ 302206 9 302205
+ 201130
+ 202129
+ 022011
+ 201000
+ 202000
+ 022001
+ 011001
+ 011002
+ 302207 5 022193
+ 022194
+ 022195
+ 022196
+ 022197
+ 302250 5 102000
+ 031001
+ 020193
+ 020194
+ 020012
+ 303001 3 007003
+ 011001
+ 011002
+ 303002 3 007004
+ 011001
+ 011002
+ 303003 4 007004
+ 010003
+ 012001
+ 012003
+ 303004 6 007004
+ 010003
+ 012001
+ 012003
+ 011001
+ 011002
+ 303011 4 007003
+ 008001
+ 011001
+ 011002
+ 303012 4 007004
+ 008001
+ 011001
+ 011002
+ 303013 7 007004
+ 008001
+ 010003
+ 012001
+ 013003
+ 011001
+ 011002
+ 303014 7 007004
+ 008001
+ 010003
+ 012001
+ 012003
+ 011001
+ 011002
+ 303021 4 007004
+ 007004
+ 204007
+ 031021
+ 303022 3 303021
+ 010003
+ 204000
+ 303023 3 303021
+ 012001
+ 204000
+ 303024 3 303021
+ 013016
+ 204000
+ 303025 5 002025
+ 204007
+ 031021
+ 012063
+ 204000
+ 303026 6 007004
+ 008003
+ 204007
+ 031021
+ 012001
+ 204000
+ 303027 5 007004
+ 204007
+ 031021
+ 010003
+ 204000
+ 303031 6 007004
+ 008003
+ 007021
+ 007022
+ 008012
+ 012061
+ 303032 2 020011
+ 020016
+ 303033 2 020010
+ 020016
+ 303040 18 008041
+ 004025
+ 004026
+ 301021
+ 301122
+ 201131
+ 202129
+ 025069
+ 007004
+ 013003
+ 202000
+ 201000
+ 002013
+ 012101
+ 010009
+ 102002
+ 008040
+ 035035
+ 303041 8 002152
+ 002023
+ 007004
+ 011001
+ 011002
+ 002153
+ 002154
+ 012071
+ 303050 7 004086
+ 008042
+ 007004
+ 005015
+ 006015
+ 011001
+ 011002
+ 303051 7 004086
+ 008042
+ 007004
+ 005015
+ 006015
+ 011061
+ 011062
+ 303052 7 004086
+ 008042
+ 007009
+ 005015
+ 006015
+ 011001
+ 011002
+ 303053 7 004086
+ 008042
+ 007009
+ 005015
+ 006015
+ 011061
+ 011062
+ 303054 10 004086
+ 008042
+ 007004
+ 010009
+ 005015
+ 006015
+ 012101
+ 012103
+ 011001
+ 011002
+ 303249 7 002252
+ 104000
+ 031001
+ 002199
+ 007004
+ 007004
+ 013003
+ 303250 8 002252
+ 002023
+ 007004
+ 011001
+ 011002
+ 002197
+ 002198
+ 012193
+ 303251 8 002252
+ 105000
+ 031001
+ 002254
+ 002251
+ 002197
+ 002198
+ 012063
+ 303252 8 002252
+ 105000
+ 031001
+ 002254
+ 002251
+ 002197
+ 002198
+ 012194
+ 304001 5 008003
+ 010004
+ 012001
+ 011001
+ 011002
+ 304002 4 008003
+ 010004
+ 011001
+ 011002
+ 304003 2 008003
+ 012001
+ 304004 4 008003
+ 010004
+ 020010
+ 012001
+ 304005 4 002024
+ 007004
+ 007004
+ 013003
+ 304006 3 014001
+ 014001
+ 014003
+ 304011 27 002163
+ 002164
+ 008012
+ 007024
+ 002057
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 008021
+ 004024
+ 110004
+ 008021
+ 004004
+ 004005
+ 004006
+ 008021
+ 004004
+ 004005
+ 004006
+ 011001
+ 011002
+ 103010
+ 002163
+ 007004
+ 012001
+ 304030 3 027031
+ 028031
+ 010031
+ 304031 3 001041
+ 001042
+ 001043
+ 304032 5 002153
+ 002154
+ 020081
+ 020082
+ 020012
+ 304033 8 002152
+ 002166
+ 002167
+ 002153
+ 002154
+ 012075
+ 012076
+ 012063
+ 304034 9 102004
+ 027001
+ 028001
+ 007022
+ 005043
+ 020010
+ 020016
+ 033003
+ 010040
+ 304035 15 002153
+ 002154
+ 012063
+ 008001
+ 012063
+ 008001
+ 012063
+ 008001
+ 008003
+ 012063
+ 008003
+ 012063
+ 008003
+ 012063
+ 008003
+ 304036 12 020082
+ 008012
+ 020082
+ 008012
+ 020081
+ 008003
+ 020081
+ 008003
+ 020081
+ 008003
+ 020081
+ 008003
+ 304228 3 005217
+ 006217
+ 007217
+ 304229 3 001208
+ 001209
+ 001210
+ 304250 27 002231
+ 002232
+ 008012
+ 007024
+ 002057
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 008021
+ 004024
+ 110004
+ 008021
+ 004004
+ 004005
+ 004006
+ 008021
+ 004004
+ 004005
+ 004006
+ 011001
+ 011002
+ 103010
+ 002231
+ 007004
+ 012001
+ 305003 5 301012
+ 004065
+ 101000
+ 031001
+ 305001
+ 305006 6 013072
+ 013082
+ 013019
+ 012001
+ 013073
+ 013060
+ 305007 6 301029
+ 301012
+ 004065
+ 101000
+ 031001
+ 305006
+ 305008 2 305006
+ 012030
+ 305009 6 301029
+ 301012
+ 004065
+ 101000
+ 031001
+ 305008
+ 305011 6 301029
+ 301012
+ 004065
+ 101000
+ 031001
+ 305010
+ 305018 8 301029
+ 301012
+ 004065
+ 103000
+ 031001
+ 305008
+ 305016
+ 305017
+ 306001 5 002032
+ 102000
+ 031001
+ 007062
+ 022042
+ 306002 3 002031
+ 022004
+ 022031
+ 306003 4 002002
+ 011011
+ 011012
+ 012004
+ 306004 7 002032
+ 002033
+ 103000
+ 031001
+ 007062
+ 022043
+ 022062
+ 306005 6 002031
+ 103000
+ 031001
+ 007062
+ 022004
+ 022031
+ 306006 3 306003
+ 306002
+ 022063
+ 306007 6 001012
+ 001014
+ 306008
+ 004024
+ 027003
+ 028003
+ 306008 3 002034
+ 002035
+ 002036
+ 306019 8 001075
+ 301011
+ 301012
+ 022042
+ 022120
+ 022121
+ 004015
+ 004065
+ 306020 4 306024
+ 102006
+ 022038
+ 022039
+ 306021 7 001075
+ 301011
+ 301012
+ 022122
+ 022123
+ 012001
+ 303002
+ 306022 5 001075
+ 301011
+ 301012
+ 022038
+ 022039
+ 306023 8 001015
+ 301023
+ 301011
+ 301012
+ 022038
+ 022039
+ 022120
+ 022121
+ 306024 8 001075
+ 301011
+ 301012
+ 022042
+ 022120
+ 022121
+ 004025
+ 004015
+ 306025 4 306019
+ 102006
+ 022038
+ 022039
+ 307001 2 301031
+ 302011
+ 307002 2 301032
+ 302011
+ 307003 4 307001
+ 101000
+ 031001
+ 302005
+ 307004 4 307002
+ 101000
+ 031001
+ 302005
+ 307005 3 307001
+ 101004
+ 302005
+ 307006 3 307002
+ 101004
+ 302005
+ 307007 2 301031
+ 302012
+ 307008 2 301032
+ 302012
+ 307009 2 301031
+ 302013
+ 307011 16 001063
+ 002001
+ 301011
+ 301012
+ 301024
+ 007006
+ 011001
+ 011016
+ 011017
+ 011002
+ 011041
+ 007006
+ 012001
+ 012003
+ 010052
+ 020009
+ 307012 5 103000
+ 031001
+ 008023
+ 005021
+ 020001
+ 307013 8 106000
+ 031001
+ 001064
+ 008014
+ 020061
+ 008014
+ 020061
+ 020018
+ 307014 3 101000
+ 031001
+ 020019
+ 307015 4 101000
+ 031001
+ 302005
+ 020002
+ 307016 3 101000
+ 031001
+ 020020
+ 307017 3 101000
+ 031001
+ 011070
+ 307018 16 008016
+ 102000
+ 031001
+ 008017
+ 301012
+ 104000
+ 031001
+ 007006
+ 011001
+ 011002
+ 011041
+ 020009
+ 101000
+ 031001
+ 020001
+ 307014
+ 307020 3 307011
+ 307014
+ 307016
+ 307021 9 307011
+ 307012
+ 307013
+ 307014
+ 307015
+ 307016
+ 307017
+ 307018
+ 307015
+ 307022 31 001015
+ 301011
+ 301012
+ 301022
+ 008021
+ 004025
+ 010004
+ 012001
+ 013003
+ 033038
+ 008022
+ 106025
+ 002020
+ 001050
+ 005021
+ 007021
+ 015031
+ 015032
+ 008060
+ 015033
+ 015034
+ 008060
+ 015033
+ 015034
+ 015035
+ 201131
+ 202129
+ 013016
+ 202000
+ 201000
+ 015011
+ 307030 2 015001
+ 015002
+ 307031 7 008022
+ 008023
+ 015001
+ 008023
+ 015001
+ 008023
+ 015002
+ 307041 7 301001
+ 001015
+ 301022
+ 301011
+ 301012
+ 301070
+ 307030
+ 307042 9 301001
+ 001015
+ 301022
+ 301011
+ 301012
+ 008021
+ 004025
+ 301070
+ 307031
+ 307043 7 301001
+ 001015
+ 301024
+ 301011
+ 301012
+ 301074
+ 307030
+ 307045 25 001063
+ 008079
+ 002001
+ 301011
+ 301012
+ 301024
+ 007032
+ 011001
+ 011016
+ 011017
+ 008054
+ 011083
+ 011084
+ 011002
+ 008054
+ 011085
+ 011086
+ 011041
+ 008054
+ 007032
+ 012023
+ 012024
+ 007032
+ 010052
+ 020009
+ 307046 5 020060 Metar/speci visibility
+ 102000
+ 031001
+ 005021
+ 020059
+ 307047 9 105000 Metar/speci clouds
+ 031001
+ 008002
+ 020011
+ 020012
+ 020013
+ 020092
+ 020002
+ 020091
+ 307048 25 008016
+ 102000
+ 031001
+ 008017
+ 301012
+ 112000
+ 031000
+ 007032
+ 011001
+ 008054
+ 011083
+ 011084
+ 011002
+ 008054
+ 011085
+ 011086
+ 011041
+ 008054
+ 007032
+ 020009
+ 101000
+ 031000
+ 020060
+ 307014
+ 307047
+ 307049 4 102000
+ 031000
+ 022043
+ 022021
+ 307050 14 101000
+ 031000
+ 020085
+ 102000
+ 031001
+ 001064
+ 020085
+ 105000
+ 031001
+ 001064
+ 020086
+ 020087
+ 020088
+ 020089
+ 307052 12 001063
+ 008039
+ 301011
+ 301012
+ 008079
+ 008039
+ 301011 start of forecast
+ 301012
+ 008039
+ 301011 end of forecast
+ 301012
+ 301024
+ 307053 16 007032
+ 011001
+ 008054
+ 011083
+ 011084
+ 011002
+ 008054
+ 011085
+ 011086
+ 011041
+ 008054
+ 007032
+ 020009
+ 020060
+ 307014
+ 307047
+ 307054 13 007032
+ 008039
+ 004003
+ 004004
+ 008023
+ 012023
+ 008039
+ 004003
+ 004004
+ 008023
+ 012023
+ 008023
+ 007032
+ 307055 9 033045
+ 008016
+ 008039
+ 004003
+ 301012
+ 008039
+ 004003
+ 301012
+ 307053
+ 307056 6 307052 Aerodrome forecast
+ 307053
+ 307054
+ 101000
+ 031001
+ 307055
+ 307059 12 307045 Full METAR/SPECI
+ 307046
+ 307013
+ 307014
+ 307047
+ 307016
+ 307017
+ 307049
+ 307050
+ 101000
+ 031001
+ 307048 Trend forecast
+ 307060 2 007061
+ 012030
+ 307061 3 301031
+ 101005
+ 307060
+ 307062 3 301032
+ 101005
+ 307060
+ 307063 2 007061
+ 012130
+ 307071 67 301090
+ 004074
+ 004023
+ 008023
+ 010004
+ 010051
+ 007004
+ 010009
+ 007032
+ 012101
+ 002051
+ 004051
+ 012118
+ 004052
+ 012119
+ 013004
+ 008023
+ 012151
+ 007032
+ 102005
+ 008050
+ 008020
+ 014032
+ 014033
+ 008050
+ 008020
+ 102018
+ 008052
+ 008022
+ 007032
+ 008053
+ 004003
+ 012152
+ 008053
+ 004003
+ 012153
+ 008053
+ 004003
+ 008023
+ 012101
+ 008053
+ 004003
+ 008023
+ 012101
+ 008023
+ 007032
+ 002002
+ 008053
+ 004003
+ 011046
+ 008053
+ 004003
+ 004004
+ 004023
+ 007032
+ 013060
+ 013051
+ 004053
+ 008050
+ 008020
+ 102006
+ 008052
+ 008022
+ 008053
+ 004003
+ 013052
+ 007032
+ 307072 38 004001
+ 004001
+ 004002
+ 004003
+ 004004
+ 004074
+ 004022
+ 008023
+ 010004
+ 010051
+ 007004
+ 010009
+ 007032
+ 012101
+ 002051
+ 004051
+ 012118
+ 004052
+ 012119
+ 013004
+ 012151
+ 007032
+ 014032
+ 008023
+ 004001
+ 004001
+ 004002
+ 004003
+ 004004
+ 004022
+ 007032
+ 008023
+ 013060
+ 004053
+ 008023
+ 102008
+ 008050
+ 008020
+ 307073 2 307071
+ 307072
+ 307079 30 301090 SYNOP data and marine data from costal stations
+ 302031
+ 302035
+ 302036
+ 101000
+ 031000
+ 302047
+ 008002
+ 101000
+ 031000
+ 302048
+ 302037
+ 102000
+ 031000
+ 022061
+ 020058
+ 101000
+ 031000
+ 302056
+ 101000
+ 031000
+ 302055
+ 302043
+ 302044
+ 101000
+ 031001
+ 302045
+ 101000
+ 031000
+ 302046
+ 307080 13 301090 BUFR template for synoptic reports
+ 302031
+ 302035
+ 302036
+ 302047
+ 008002
+ 302048
+ 302037
+ 302043
+ 302044
+ 101002
+ 302045
+ 302046
+ 307081 24 301090 BUFR template for synoptic reports RA I
+ 302031
+ 302035
+ 302036
+ 302047
+ 008002
+ 302048
+ 302037
+ 012122
+ 013056
+ 013057
+ 020101
+ 020102
+ 020103
+ 020104
+ 020105
+ 020106
+ 020107
+ 020108
+ 302043
+ 302044
+ 101002
+ 302045
+ 302046
+ 307082 15 301090 BUFR template for synoptic reports RA II
+ 302031
+ 302035
+ 302036
+ 302047
+ 008002
+ 302048
+ 302037
+ 012121
+ 012122
+ 302043
+ 302044
+ 101002
+ 302045
+ 302046
+ 307083 14 301090 BUFR template for synoptic reports RA III
+ 302031
+ 302035
+ 302036
+ 302047
+ 008002
+ 302048
+ 302037
+ 012122
+ 302043
+ 302044
+ 101002
+ 302045
+ 302046
+ 307084 17 301090 BUFR template for synoptic reports RA IV
+ 302031
+ 302035
+ 302036
+ 302047
+ 008002
+ 302048
+ 302037
+ 020055
+ 101000
+ 031000
+ 205001
+ 302043
+ 302044
+ 101002
+ 302045
+ 302046
+ 307086 11 301090 BUFR template for synoptic reports RA VI
+ 302031
+ 302035
+ 302036
+ 008002
+ 302037
+ 302066
+ 302043
+ 302044
+ 101002
+ 302045
+ 307090 13 301092 BUFR template for synoptic reports from mobile land stations
+ 302031
+ 302035
+ 302036
+ 302047
+ 008002
+ 302048
+ 302037
+ 302043
+ 302044
+ 101002
+ 302045
+ 302046
+ 307091 66 301089
+ 301090
+ 008010
+ 301091
+ 302001
+ 007004
+ 010009
+ 302072
+ 103000
+ 031000
+ 101005
+ 307063
+ 007061
+ 101000
+ 031000
+ 302069
+ 007032
+ 007033
+ 105000
+ 031000
+ 020031
+ 020032
+ 002038
+ 022043
+ 302021
+ 101000
+ 031000
+ 302078
+ 101000
+ 031000
+ 302073
+ 101000
+ 031000
+ 302074
+ 101000
+ 031000
+ 302075
+ 102000
+ 031000
+ 004025
+ 302076
+ 302071
+ 302077
+ 007033
+ 101000
+ 031000
+ 302079
+ 007032
+ 101000
+ 031000
+ 302080
+ 101000
+ 031000
+ 302081
+ 101000
+ 031000
+ 302082
+ 102000
+ 031000
+ 004025
+ 013059
+ 101000
+ 031000
+ 302083
+ 033005
+ 033006
+ 307092 62 301089 Surface obs drom N-minute period
+ 301090
+ 008010
+ 301091
+ 004015
+ 004065
+ 125000
+ 031001
+ 010004
+ 302070
+ 302072
+ 007032
+ 012101
+ 103000
+ 031000
+ 101005
+ 307063
+ 007061
+ 101000
+ 031000
+ 302069
+ 007032
+ 007033
+ 101000
+ 031000
+ 302073
+ 101000
+ 031000
+ 302076
+ 102000
+ 031000
+ 013055
+ 013058
+ 102000
+ 031000
+ 020031
+ 020032
+ 101000
+ 031000
+ 302078
+ 102000
+ 031000
+ 302079
+ 007032
+ 101000
+ 031000
+ 302080
+ 101000
+ 031000
+ 302081
+ 101000
+ 031000
+ 302083
+ 102000
+ 031000
+ 004025
+ 013059
+ 101000
+ 031000
+ 302083
+ 033005
+ 033006
+ 307093 21 223000
+ 236000
+ 101000
+ 031001
+ 031031
+ 001033
+ 001032
+ 008083
+ 101000
+ 031001
+ 223255
+ 108000
+ 031001
+ 223000
+ 237000
+ 001033
+ 001032
+ 008083
+ 101000
+ 031001
+ 223255
+ 307096 8 301090
+ 301089
+ 008010
+ 301091
+ 302084
+ 302085
+ 033005
+ 033006
+ 308001 3 301033
+ 302011
+ 022042
+ 308002 3 301034
+ 302011
+ 022042
+ 308003 3 301035
+ 302011
+ 022042
+ 308004 3 301036
+ 302011
+ 022042
+ 308005 2 308004
+ 302024
+ 308006 8 010004
+ 010061
+ 010063
+ 011001
+ 011002
+ 012004
+ 013003
+ 022042
+ 308007 4 301055
+ 302011
+ 007062
+ 022042
+ 308008 84 001003 BUOY
+ 001020
+ 001005
+ 002001
+ 002036
+ 002149
+ 301011
+ 301012
+ 008021
+ 301011
+ 301012
+ 008021
+ 301021
+ 027004
+ 028004
+ 007030
+ 001051
+ 002148
+ 001012
+ 001014
+ 002040
+ 033022
+ 033023
+ 033027
+ 022063
+ 302021
+ 302022
+ 302023
+ 008081
+ 025026
+ 008081
+ 025026
+ 008081
+ 025026
+ 008081
+ 002034
+ 022060
+ 007070
+ 002190
+ 025086
+ 002035
+ 002168
+ 020031
+ 002038
+ 306004
+ 002030
+ 306005
+ 007031
+ 008081
+ 012064
+ 302001
+ 008081
+ 007032
+ 007033
+ 012101
+ 012103
+ 013003
+ 007032
+ 007033
+ 008082
+ 007033
+ 002169
+ 002002
+ 008021
+ 004025
+ 011001
+ 011002
+ 008021
+ 004025
+ 011043
+ 011041
+ 008082
+ 007033
+ 007032
+ 004024
+ 013011
+ 007032
+ 008021
+ 004024
+ 014021
+ 008021
+ 025028
+ 025028
+ 025028
+ 308009 7 301093
+ 302001
+ 302054
+ 008002
+ 302055
+ 302057
+ 302060
+ 308010 16 001011 TRACKOB template
+ 113000
+ 031001
+ 301011
+ 301012
+ 301021
+ 004080
+ 022049
+ 004080
+ 022059
+ 004080
+ 022005
+ 002042
+ 022032
+ 002042
+ 004080
+ 308011 27 001011 Climat ship
+ 002001
+ 301011
+ 301012
+ 301023
+ 007030
+ 007031
+ 004074
+ 004023
+ 008023
+ 010051
+ 007032
+ 007033
+ 012101
+ 013004
+ 007032
+ 007033
+ 302056
+ 008023
+ 004003
+ 004004
+ 004023
+ 007032
+ 013060
+ 013051
+ 004053
+ 007032
+ 308012 28 004001 Monthly normals from an ocean weather station
+ 004001
+ 004002
+ 004003
+ 004004
+ 004074
+ 004022
+ 008023
+ 010051
+ 007032
+ 007033
+ 012101
+ 013002
+ 007032
+ 007033
+ 302056
+ 008023
+ 004001
+ 004001
+ 004002
+ 004003
+ 004004
+ 004022
+ 007032
+ 008023
+ 013060
+ 004053
+ 008023
+ 308013 2 308011
+ 308012
+ 309001 4 301037
+ 101000
+ 031001
+ 303011
+ 309002 4 301038
+ 101000
+ 031001
+ 303011
+ 309003 4 301037
+ 101000
+ 031001
+ 303012
+ 309004 4 301038
+ 101000
+ 031001
+ 303012
+ 309005 5 301037
+ 302004
+ 101000
+ 031001
+ 303013
+ 309006 5 301038
+ 302004
+ 101000
+ 031001
+ 303013
+ 309007 5 301037
+ 302004
+ 101000
+ 031001
+ 303014
+ 309008 5 301038
+ 302004
+ 101000
+ 031001
+ 303014
+ 309011 4 301039
+ 101000
+ 031001
+ 303011
+ 309012 4 301039
+ 101000
+ 031001
+ 303012
+ 309013 5 301039
+ 302004
+ 101000
+ 031001
+ 303013
+ 309014 5 301039
+ 302004
+ 101000
+ 031001
+ 303014
+ 309015 4 301040
+ 101000
+ 031001
+ 303011
+ 309016 4 301040
+ 101000
+ 031001
+ 303012
+ 309017 5 301040
+ 302004
+ 101000
+ 031001
+ 303013
+ 309018 5 301040
+ 302004
+ 101000
+ 031001
+ 303014
+ 309019 5 301031
+ 002003
+ 101000
+ 031001
+ 303011
+ 309020 8 301031
+ 002003
+ 104000
+ 031001
+ 007003
+ 011003
+ 011004
+ 011005
+ 309030 8 015004
+ 015005
+ 104000
+ 031001
+ 004015
+ 008006
+ 007004
+ 015003
+ 309031 8 015004
+ 015005
+ 104000
+ 031001
+ 004025
+ 008006
+ 007004
+ 015003
+ 309040 3 301075
+ 301076
+ 309030
+ 309042 4 307042
+ 301075
+ 301076
+ 309030
+ 309050 9 301110
+ 301113
+ 301114
+ 101000
+ 031002
+ 303050
+ 101000
+ 031001
+ 303051
+ 309051 9 301110
+ 301113
+ 301114
+ 101000
+ 031002
+ 303052
+ 101000
+ 031001
+ 303053
+ 309052 11 301111
+ 301113
+ 301114
+ 302049
+ 022043
+ 101000
+ 031002
+ 303054
+ 101000
+ 031001
+ 303051
+ 309053 9 301112
+ 301113
+ 301114
+ 101000
+ 031002
+ 303054
+ 101000
+ 031001
+ 303051
+ 309054 27 301001
+ 001011
+ 301011
+ 301012
+ 301021
+ 007030
+ 007031
+ 007007
+ 004023
+ 004059
+ 115000
+ 031001
+ 008001
+ 008023
+ 007004
+ 010009
+ 012101
+ 012103
+ 008023
+ 011001
+ 011002
+ 008023
+ 011019
+ 008050
+ 008020
+ 008050
+ 008020
+ 309060 4 301123
+ 301121
+ 302050
+ 303040
+ 309061 21 301120
+ 008041
+ 301122
+ 201131
+ 202129
+ 025069
+ 007004
+ 202000
+ 201000
+ 033007
+ 033035
+ 033015
+ 013009
+ 033007
+ 033035
+ 033015
+ 002013
+ 012101
+ 033007
+ 033035
+ 033015
+ 309062 19 301120
+ 008041
+ 301122
+ 005001
+ 033035
+ 033015
+ 006001
+ 033035
+ 033015
+ 007007
+ 033035
+ 033015
+ 011003
+ 033035
+ 033015
+ 011004
+ 033035
+ 033015
+ 033007
+ 309063 19 301120
+ 008041
+ 301122
+ 005001
+ 033035
+ 033015
+ 006001
+ 033035
+ 033015
+ 007007
+ 033035
+ 033015
+ 011003
+ 033035
+ 033015
+ 011004
+ 033035
+ 033015
+ 033007
+ 309064 26 301120
+ 008041
+ 301122
+ 201131
+ 202129
+ 104002
+ 025069
+ 007004
+ 033035
+ 033015
+ 013003
+ 033035
+ 033015
+ 202000
+ 201000
+ 104002
+ 002013
+ 012101
+ 033035
+ 033015
+ 012103
+ 033035
+ 033015
+ 010009
+ 033035
+ 033015
+ 309065 18 301120
+ 008041
+ 301122
+ 005001
+ 033035
+ 033015
+ 006001
+ 033035
+ 033015
+ 007007
+ 033035
+ 033015
+ 011003
+ 033035
+ 033015
+ 011004
+ 033035
+ 033015
+ 309066 18 301120
+ 008041
+ 301122
+ 008040
+ 201131
+ 202129
+ 025069
+ 007004
+ 013003
+ 202000
+ 201000
+ 002013
+ 012101
+ 012103
+ 010009
+ 010007
+ 011002
+ 011001
+ 309194 5 301194
+ 302004
+ 101000
+ 031001
+ 303014
+ 309195 5 301195
+ 302004
+ 101000
+ 031001
+ 303014
+ 309196 5 301196
+ 302004
+ 101000
+ 031001
+ 303014
+ 309198 5 301198
+ 302004
+ 101000
+ 031001
+ 303014
+ 310001 5 301042
+ 303031
+ 303032
+ 101026
+ 303025
+ 310002 5 301042
+ 303031
+ 303032
+ 101009
+ 303023
+ 310003 5 301042
+ 303031
+ 303032
+ 101006
+ 303023
+ 310004 5 301042
+ 303031
+ 303032
+ 101003
+ 303024
+ 310005 6 301042
+ 303031
+ 303033
+ 101000
+ 031001
+ 303025
+ 310006 6 301042
+ 303031
+ 303033
+ 101000
+ 031001
+ 303023
+ 310007 6 301042
+ 303031
+ 303033
+ 101000
+ 031001
+ 303024
+ 310008 8 310011
+ 101019
+ 310012
+ 002150
+ 025079
+ 025080
+ 033032
+ 014045
+ 310009 3 310011
+ 101015
+ 310012
+ 310010 3 310011
+ 101005
+ 310012
+ 310011 45 008070
+ 001033
+ 001034
+ 008070
+ 001033
+ 001034
+ 001007
+ 002048
+ 005040
+ 025075
+ 201133
+ 005041
+ 201000
+ 005043
+ 025070
+ 033030
+ 033031
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 005001
+ 006001
+ 202126
+ 007001
+ 202000
+ 007024
+ 005021
+ 007025
+ 005022
+ 033033
+ 002151
+ 012064
+ 002151
+ 012064
+ 002151
+ 012064
+ 002151
+ 012064
+ 310012 10 002150
+ 025076
+ 025077
+ 025078
+ 033032
+ 201132
+ 202129
+ 012063
+ 202000
+ 201000
+ 310013 62 001007
+ 005040
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 004006
+ 005001
+ 006001
+ 007025
+ 005043
+ 025085
+ 201131
+ 202129
+ 002150
+ 008023
+ 008072
+ 014027
+ 008072
+ 014027
+ 002150
+ 008023
+ 008072
+ 014027
+ 008072
+ 014027
+ 002150
+ 008023
+ 008072
+ 014027
+ 008072
+ 014027
+ 202000
+ 201000
+ 201132
+ 202129
+ 002150
+ 008023
+ 008072
+ 012063
+ 008072
+ 012063
+ 002150
+ 008023
+ 008072
+ 012063
+ 008072
+ 012063
+ 008023
+ 008072
+ 012063
+ 008072
+ 012063
+ 002150
+ 008023
+ 008072
+ 012063
+ 008072
+ 012063
+ 202000
+ 201000
+ 310014 3 301072
+ 303041
+ 304011
+ 310015 13 301072
+ 007024
+ 010002
+ 303041
+ 101003
+ 304032
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101003
+ 304033
+ 310016 13 301072
+ 007024
+ 010002
+ 303041
+ 101012
+ 304032
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101012
+ 304033
+ 310019 68 001007
+ 002019
+ 301011
+ 301013
+ 301023
+ 007025
+ 008021
+ 007025
+ 008021
+ 007025
+ 008021
+ 008029
+ 005040
+ 008075
+ 008003
+ 010004
+ 008003
+ 207002
+ 015001
+ 207000
+ 033070
+ 015030
+ 207002
+ 020081
+ 207000
+ 008003
+ 033042
+ 007004
+ 207002
+ 015001
+ 207000
+ 008003
+ 113021
+ 007004
+ 007004
+ 207002
+ 008021
+ 015005
+ 008021
+ 015005
+ 033007
+ 207000
+ 008026
+ 101020
+ 025143
+ 008026
+ 008043
+ 109015
+ 007004
+ 008090
+ 207006
+ 015008
+ 207000
+ 008090
+ 207002
+ 033007
+ 207000
+ 008043
+ 033071
+ 108008
+ 202124
+ 201107
+ 002071
+ 201000
+ 202000
+ 207002
+ 020081
+ 207000
+ 310020 6 310022
+ 301011
+ 301013
+ 301021
+ 304034
+ 310021
+ 310021 10 108000
+ 031001
+ 201131
+ 202129
+ 007004
+ 007004
+ 202000
+ 201000
+ 015020
+ 010002
+ 310022 4 001007
+ 002019
+ 001033
+ 002172
+ 310023 17 301072
+ 030021
+ 030022
+ 008012
+ 007024
+ 007025
+ 010002
+ 101012
+ 304032
+ 105002
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101012
+ 304033
+ 310024 17 301072
+ 030021
+ 030022
+ 008012
+ 007024
+ 007025
+ 010002
+ 101003
+ 304032
+ 105002
+ 002152
+ 002024
+ 007004
+ 007004
+ 013003
+ 101003
+ 304033
+ 310025 61 001007
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 201138
+ 202131
+ 004006
+ 202000
+ 201000
+ 201132
+ 005041
+ 201000
+ 201129
+ 005043
+ 201000
+ 005002
+ 006002
+ 013040
+ 020029
+ 104024
+ 005042
+ 012163
+ 021083
+ 021084
+ 115003
+ 004001
+ 004002
+ 004003
+ 201142
+ 202131
+ 004026
+ 202000
+ 201000
+ 005001
+ 006001
+ 201138
+ 202129
+ 007001
+ 202000
+ 201000
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 005040
+ 101003
+ 012070
+ 025054
+ 101004
+ 025055
+ 008007
+ 104028
+ 005002
+ 006002
+ 002111
+ 005021
+ 310026 82 310022
+ 025060
+ 008021
+ 301011
+ 301012
+ 201138
+ 202131
+ 004006
+ 202000
+ 201000
+ 033039
+ 033007
+ 304030
+ 304031
+ 002020
+ 001050
+ 202127
+ 304030
+ 202000
+ 304031
+ 201133
+ 202131
+ 004016
+ 202000
+ 201000
+ 301021
+ 304030
+ 010035
+ 005021
+ 010036
+ 113000
+ 031002
+ 301021
+ 005021
+ 108000
+ 031001
+ 002121
+ 007040
+ 015037
+ 008023
+ 201125
+ 015037
+ 201000
+ 008023
+ 033007
+ 108000
+ 031002
+ 007007
+ 015036
+ 008023
+ 201123
+ 015036
+ 201000
+ 008023
+ 033007
+ 116000
+ 031002
+ 007009
+ 010004
+ 012001
+ 013001
+ 008023
+ 201120
+ 010004
+ 201000
+ 201122
+ 012001
+ 201000
+ 201123
+ 013001
+ 201000
+ 008023
+ 033007
+ 008003
+ 007009
+ 010004
+ 008023
+ 201120
+ 010004
+ 201000
+ 008023
+ 033007
+ 310027 12 301071
+ 301011
+ 301013
+ 301021
+ 030021
+ 030022
+ 010002
+ 304036
+ 002152
+ 002167
+ 101011
+ 304035
+ 310029 12 110000
+ 031001
+ 201138
+ 202130
+ 007004
+ 007004
+ 202000
+ 201000
+ 015020
+ 010002
+ 012101
+ 013098
+ 310030 6 310022
+ 301011
+ 301013
+ 301021
+ 304034
+ 310029
+ 310050 14 310051
+ 310052
+ 101000
+ 031002
+ 310053
+ 101004
+ 310054
+ 020010
+ 310052
+ 101015
+ 310053
+ 310052
+ 101005
+ 310053
+ 310051 16 001007
+ 005040
+ 201133
+ 005041
+ 201000
+ 201132
+ 025070
+ 201000
+ 202126
+ 007001
+ 202000
+ 007025
+ 005022
+ 102009
+ 002151
+ 012064
+ 310052 12 002019
+ 301011
+ 301012
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 301021
+ 007024
+ 005021
+ 005043
+ 310053 6 201134
+ 005042
+ 201000
+ 025076
+ 033032
+ 012163
+ 310054 13 201134
+ 005042
+ 201000
+ 025076
+ 033032
+ 201131
+ 202129
+ 102002
+ 008023
+ 014027
+ 008023
+ 202000
+ 201000
+ 310055 8 310051
+ 310052
+ 102020
+ 025076
+ 025052
+ 101000
+ 031002
+ 025050
+ 310060 53 001007
+ 001033
+ 002019
+ 002020
+ 301011
+ 301012
+ 207003
+ 004006
+ 207000
+ 304030
+ 301021
+ 007024
+ 005021
+ 007025
+ 005022
+ 008075
+ 201133
+ 005041
+ 201000
+ 005045
+ 005043
+ 005040
+ 010001
+ 201129
+ 007002
+ 201000
+ 202127
+ 201125
+ 021166
+ 201000
+ 202000
+ 008012
+ 020010
+ 020014
+ 002165
+ 033075
+ 107003
+ 008076
+ 006029
+ 006029
+ 025140
+ 025141
+ 033076
+ 033077
+ 008076
+ 033078
+ 033003
+ 104000
+ 031002
+ 201133
+ 005042
+ 201000
+ 014044
+ 310193 5 301250
+ 303250
+ 302250
+ 303249
+ 303251
+ 310194 5 301250
+ 303250
+ 302250
+ 303249
+ 303252
+ 310195 3 301250
+ 303250
+ 304250
+ 310196 3 301250
+ 303249
+ 303251
+ 310226 39 310022
+ 025060
+ 008021
+ 301011
+ 301012
+ 201138
+ 202131
+ 004006
+ 202000
+ 201000
+ 033039
+ 033007
+ 304030
+ 304031
+ 002020
+ 001050
+ 202127
+ 304030
+ 202000
+ 304031
+ 201133
+ 202131
+ 004016
+ 202000
+ 201000
+ 301021
+ 304030
+ 010035
+ 005021
+ 010036
+ 107000
+ 031002
+ 301021
+ 005021
+ 103000
+ 031001
+ 002121
+ 007040
+ 015037
+ 311001 9 301051
+ 007002
+ 012001
+ 011001
+ 011002
+ 011031
+ 011032
+ 011033
+ 020041
+ 311002 4 301065
+ 301066
+ 311003
+ 311004
+ 311003 5 010070
+ 011001
+ 011002
+ 012001
+ 013002
+ 311004 18 101000
+ 031000
+ 011034
+ 101000
+ 031000
+ 011035
+ 101000
+ 031000
+ 011075
+ 101000
+ 031000
+ 011076
+ 101000
+ 031000
+ 033025
+ 101000
+ 031000
+ 033026
+ 311005 13 001008
+ 001023
+ 301021
+ 301011
+ 301013
+ 007010
+ 008009
+ 011001
+ 011002
+ 011031
+ 011036
+ 012101
+ 033025
+ 311006 6 007010
+ 011001
+ 011002
+ 002064
+ 012101
+ 012103
+ 311007 7 007010
+ 301021
+ 011001
+ 011002
+ 002064
+ 012101
+ 012103
+ 311008 8 001008
+ 301011
+ 301013
+ 301021
+ 008004
+ 101000
+ 031001
+ 311006
+ 311009 8 001008
+ 301011
+ 301013
+ 301021
+ 008004
+ 101000
+ 031001
+ 311007
+ 311193 16 301197
+ 301011
+ 301012
+ 301023
+ 008004
+ 007004
+ 008021
+ 011001
+ 011002
+ 011031
+ 011034
+ 011035
+ 012001
+ 012003
+ 013003
+ 020041
+ 312001 2 301043
+ 304001
+ 312002 2 301043
+ 304002
+ 312003 2 301042
+ 304003
+ 312004 2 301042
+ 304004
+ 312005 2 301042
+ 020014
+ 312006 2 301044
+ 304005
+ 312007 2 301042
+ 304006
+ 312010 6 001007
+ 005040
+ 002021
+ 005041
+ 004001
+ 004043
+ 312011 9 202131
+ 201149
+ 004006
+ 201000
+ 202126
+ 010002
+ 202000
+ 005043
+ 005053
+ 312012 6 202129
+ 201132
+ 101019
+ 012063
+ 201000
+ 202000
+ 312013 6 005042
+ 202129
+ 201135
+ 012063
+ 201000
+ 202000
+ 312014 8 312010
+ 312011
+ 105056
+ 301023
+ 005042
+ 005052
+ 312012
+ 312013
+ 312015 10 109011
+ 301023
+ 005042
+ 005052
+ 202129
+ 201132
+ 101004
+ 012063
+ 202000
+ 201000
+ 312016 3 312010
+ 312011
+ 312015
+ 312017 10 109008
+ 301023
+ 005042
+ 005052
+ 202129
+ 201132
+ 101003
+ 012063
+ 202000
+ 201000
+ 312018 3 312010
+ 312011
+ 312017
+ 312019 13 301047
+ 301048
+ 015015
+ 029002
+ 021076
+ 106012
+ 201129
+ 006030
+ 201000
+ 102012
+ 005030
+ 021075
+ 021066
+ 312020 11 301047
+ 301048
+ 015015
+ 029002
+ 021076
+ 104012
+ 006030
+ 102012
+ 005030
+ 021075
+ 021066
+ 312021 6 301047
+ 101003
+ 301049
+ 011012
+ 011011
+ 021067
+ 312022 15 301047
+ 008022
+ 011012
+ 011050
+ 022070
+ 022026
+ 312041
+ 010050
+ 021068
+ 021071
+ 021072
+ 021073
+ 312042
+ 021062
+ 015011
+ 312023 7 301047
+ 103003
+ 008022
+ 012061
+ 022050
+ 021069
+ 021085
+ 312024 11 312020
+ 008060
+ 008022
+ 008060
+ 008022
+ 025014
+ 022101
+ 022097
+ 022098
+ 022099
+ 022100
+ 312025 11 312019
+ 008060
+ 008022
+ 008060
+ 008022
+ 025014
+ 022101
+ 022097
+ 022098
+ 022099
+ 022100
+ 312026 19 301046
+ 301011
+ 301013
+ 301023
+ 312031
+ 101004
+ 312030
+ 021110
+ 301023
+ 321027
+ 021111
+ 301023
+ 321027
+ 021112
+ 301023
+ 321027
+ 021113
+ 301023
+ 321027
+ 312027 9 301047
+ 105009
+ 301023
+ 007021
+ 012061
+ 007021
+ 012061
+ 021085
+ 021070
+ 312028 26 301046
+ 301011
+ 301013
+ 301023
+ 008025
+ 201136
+ 004006
+ 201000
+ 312031
+ 312032
+ 101004
+ 312030
+ 101002
+ 312033
+ 021110
+ 301023
+ 321028
+ 021111
+ 301023
+ 321028
+ 021112
+ 301023
+ 321028
+ 021113
+ 301023
+ 321028
+ 312030 13 201130
+ 202129
+ 011012
+ 202000
+ 201000
+ 011052
+ 201135
+ 202130
+ 011011
+ 202000
+ 201000
+ 011053
+ 021104
+ 312031 8 005034
+ 006034
+ 021109
+ 011081
+ 011082
+ 021101
+ 021102
+ 021103
+ 312032 4 021120
+ 021121
+ 013055
+ 021122
+ 312033 4 002104
+ 008022
+ 012063
+ 012065
+ 312041 5 201141
+ 202130
+ 007001
+ 201000
+ 202000
+ 312042 6 021077
+ 021078
+ 021079
+ 021080
+ 021081
+ 021082
+ 312045 21 001007
+ 002019
+ 001096
+ 025061
+ 005040
+ 301011
+ 301013
+ 301021
+ 007002
+ 012180
+ 012181
+ 012182
+ 012183
+ 012184
+ 012185
+ 002174
+ 021086
+ 012186
+ 021087
+ 012187
+ 033043
+ 312050 23 001007
+ 002019
+ 001096
+ 025061
+ 005040
+ 301011
+ 301013
+ 301021
+ 007025
+ 005022
+ 010080
+ 027080
+ 008003
+ 007004
+ 013093
+ 008003
+ 201131
+ 202129
+ 007004
+ 007004
+ 202000
+ 201000
+ 013095
+ 312051 48 001007
+ 002019
+ 001096
+ 025061
+ 005040
+ 008075
+ 301011
+ 301013
+ 301021
+ 001012
+ 201131
+ 001013
+ 201000
+ 010032
+ 010033
+ 010034
+ 007002
+ 008012
+ 025110
+ 025111
+ 025102
+ 002104
+ 025103
+ 025104
+ 025105
+ 025106
+ 025107
+ 025108
+ 002111
+ 002121
+ 002026
+ 002027
+ 021130
+ 021131
+ 021132
+ 021133
+ 021064
+ 025014
+ 021134
+ 107018
+ 005030
+ 105024
+ 201130
+ 006030
+ 201000
+ 021135
+ 021136
+ 033044
+ 312052 77 001007
+ 002019
+ 001096
+ 025061
+ 005040
+ 025120
+ 025121
+ 025124
+ 025125
+ 025122
+ 025123
+ 301011
+ 301013
+ 301021
+ 007002
+ 002119
+ 033047
+ 010081
+ 010082
+ 010083
+ 010084
+ 002116
+ 002117
+ 002118
+ 002156
+ 002157
+ 014055
+ 022150
+ 022151
+ 022152
+ 022153
+ 022154
+ 022155
+ 022156
+ 022157
+ 022158
+ 022159
+ 021137
+ 021138
+ 021139
+ 021140
+ 021141
+ 021142
+ 010085
+ 010086
+ 010087
+ 010088
+ 010089
+ 010090
+ 010091
+ 010092
+ 010093
+ 011002
+ 025126
+ 025127
+ 025128
+ 025129
+ 025130
+ 025131
+ 025132
+ 025133
+ 025134
+ 025135
+ 025136
+ 025137
+ 013096
+ 013097
+ 011095
+ 011096
+ 012188
+ 012189
+ 002158
+ 002159
+ 033052
+ 033053
+ 021143
+ 021144
+ 312053 54 001007
+ 002019
+ 001096
+ 025061
+ 005040
+ 008075
+ 301011
+ 301013
+ 301021
+ 001012
+ 201131
+ 001013
+ 201000
+ 010032
+ 010033
+ 010034
+ 007002
+ 008012
+ 025110
+ 025111
+ 025102
+ 002104
+ 025103
+ 025104
+ 025105
+ 025106
+ 025107
+ 025108
+ 011001
+ 011002
+ 022160
+ 025138
+ 201130
+ 202129
+ 022021
+ 202000
+ 201000
+ 033048
+ 033049
+ 002026
+ 002027
+ 021130
+ 021131
+ 021132
+ 021133
+ 025014
+ 106036
+ 005030
+ 104024
+ 201130
+ 006030
+ 201000
+ 022161
+ 033044
+ 312055 5 005033
+ 005040
+ 006034
+ 010095
+ 021157
+ 312056 11 025060
+ 001032
+ 011082
+ 011081
+ 020095
+ 020096
+ 021155
+ 201133
+ 021101
+ 021102
+ 201000
+ 312057 12 201130
+ 202129
+ 011012
+ 202000
+ 201000
+ 201131
+ 202129
+ 011011
+ 202000
+ 201000
+ 021156
+ 021104
+ 312058 8 301125
+ 301011
+ 301013
+ 301021
+ 312055
+ 021150
+ 101003
+ 321030
+ 312059 4 312056
+ 101000
+ 031001
+ 312057
+ 312060 20 025060
+ 025062
+ 040001
+ 040002
+ 021062
+ 021151
+ 021152
+ 021153
+ 021154
+ 021062
+ 021062
+ 040003
+ 040004
+ 040005
+ 040006
+ 040007
+ 020065
+ 040008
+ 040009
+ 040010
+ 312061 3 312058
+ 312060
+ 312059
+ 312070 27 001007
+ 002019
+ 001144
+ 001124
+ 030010
+ 301011
+ 301013
+ 301021
+ 007012
+ 015012
+ 012165
+ 012166
+ 012167
+ 012168
+ 027010
+ 028010
+ 002099
+ 013048
+ 025081
+ 025082
+ 025083
+ 025084
+ 012080
+ 012081
+ 012082
+ 025174
+ 033028
+ 312200 10 301237
+ 301238
+ 029002
+ 021206
+ 104012
+ 006232
+ 102012
+ 005232
+ 021205
+ 021196
+ 312201 6 301237
+ 101003
+ 301239
+ 011012
+ 011011
+ 021197
+ 312202 13 301237
+ 008022
+ 011012
+ 011050
+ 301240
+ 022243
+ 301241
+ 010050
+ 021198
+ 021201
+ 021202
+ 021203
+ 301242
+ 312203 8 301237
+ 008022
+ 012061
+ 022050
+ 021204
+ 021199
+ 021214
+ 021215
+ 312204 12 312201
+ 001031
+ 011012
+ 011011
+ 021200
+ 021213
+ 004004
+ 008021
+ 004024
+ 055003
+ 011012
+ 011011
+ 312207 3 312202
+ 301202
+ 033191
+ 312208 17 301202
+ 008022
+ 008021
+ 301011
+ 301013
+ 301023
+ 302205
+ 011002
+ 001007
+ 002021
+ 301011
+ 301013
+ 301023
+ 001032
+ 001192
+ 302205
+ 011002
+ 312209 11 301202
+ 001192
+ 301011
+ 301013
+ 301023
+ 302206
+ 104000
+ 022192
+ 102000
+ 005232
+ 022191
+ 312210 13 312202
+ 021192
+ 015202
+ 301011
+ 004004
+ 004005
+ 201138
+ 202131
+ 004006
+ 201000
+ 202000
+ 304228
+ 304229
+ 312211 19 301046
+ 301011
+ 301013
+ 301023
+ 312031
+ 101004
+ 312030
+ 021110
+ 101004
+ 312212
+ 021111
+ 101004
+ 312212
+ 021112
+ 101004
+ 312212
+ 021113
+ 101004
+ 312212
+ 312212 2 301023
+ 321027
+ 313009 4 021001
+ 101000
+ 031001
+ 021001
+ 313010 4 021036
+ 101000
+ 031001
+ 021036
+ 313031 5 006002
+ 006012
+ 101000
+ 031002
+ 030001
+ 313032 5 005002
+ 005012
+ 101000
+ 031002
+ 313031
+ 313041 13 006002
+ 110000
+ 031001
+ 104000
+ 031001
+ 006012
+ 101000
+ 031012
+ 030001
+ 006012
+ 101000
+ 031001
+ 030001
+ 313042 5 005002
+ 005012
+ 101000
+ 031002
+ 313041
+ 313043 17 006002
+ 005002
+ 005012
+ 112000
+ 031001
+ 110000
+ 031001
+ 104000
+ 031001
+ 006012
+ 101000
+ 031011
+ 030001
+ 006012
+ 101000
+ 031001
+ 030001
+ 315001 5 001011
+ 301011
+ 301012
+ 301023
+ 306001
+ 315002 5 001011
+ 301011
+ 301012
+ 301023
+ 306004
+ 315003 25 001087
+ 001085
+ 001086
+ 002036
+ 002148
+ 002149
+ 022055
+ 022056
+ 022067
+ 301011
+ 301012
+ 301021
+ 008080
+ 033050
+ 109000
+ 031002
+ 007065
+ 008080
+ 033050
+ 022045
+ 008080
+ 033050
+ 022064
+ 008080
+ 033050
+ 316001 10 301011
+ 004004
+ 301023
+ 001021
+ 002041
+ 019001
+ 010051
+ 019002
+ 019003
+ 019004
+ 316002 15 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 001033
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 007002
+ 007002
+ 316003 12 110000
+ 031001
+ 008011
+ 008007
+ 104000
+ 031001
+ 005002
+ 006002
+ 010002
+ 011002
+ 008007
+ 008011
+ 316004 13 111000
+ 031001
+ 008011
+ 008007
+ 007002
+ 007002
+ 102000
+ 031001
+ 005002
+ 006002
+ 011031
+ 008007
+ 008011
+ 316005 10 108000
+ 031001
+ 008005
+ 008007
+ 005002
+ 006002
+ 001026
+ 019001
+ 008007
+ 008005
+ 316006 14 112000
+ 031001
+ 008011
+ 008007
+ 007002
+ 007002
+ 102000
+ 031001
+ 005002
+ 006002
+ 020011
+ 020012
+ 008007
+ 008011
+ 316007 12 110000
+ 031001
+ 008011
+ 008007
+ 104000
+ 031001
+ 005002
+ 006002
+ 019005
+ 019006
+ 008007
+ 008011
+ 316008 13 111000
+ 031001
+ 008001
+ 008007
+ 008023
+ 103000
+ 031001
+ 005002
+ 006002
+ 010002
+ 008023
+ 008007
+ 008001
+ 316009 13 111000
+ 031001
+ 008011
+ 008007
+ 007002
+ 007002
+ 102000
+ 031001
+ 005002
+ 006002
+ 020041
+ 008007
+ 008011
+ 316010 9 107000
+ 031001
+ 008011
+ 008007
+ 001022
+ 005002
+ 006002
+ 008007
+ 008011
+ 316011 19 117000
+ 031001
+ 008011
+ 001022
+ 008007
+ 102000
+ 031001
+ 005002
+ 006002
+ 008021
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 020090
+ 008021
+ 008007
+ 008011
+ 316020 5 001023
+ 001025
+ 001027
+ 301011
+ 301012
+ 316021 23 301023
+ 002041
+ 019001
+ 019007
+ 019005
+ 019006
+ 019008
+ 008005
+ 010004
+ 008005
+ 010004
+ 019007
+ 008005
+ 008021
+ 004075
+ 011040
+ 019007
+ 105004
+ 005021
+ 005021
+ 102002
+ 019003
+ 019004
+ 316022 24 001032
+ 002041
+ 019001
+ 019010
+ 118000
+ 031001
+ 008021
+ 004014
+ 008005
+ 301023
+ 019005
+ 019006
+ 010004
+ 011041
+ 008021
+ 004075
+ 011040
+ 019008
+ 105004
+ 005021
+ 005021
+ 102002
+ 019003
+ 019004
+ 316026 2 316020
+ 316021
+ 316030 10 301014
+ 001037
+ 010064
+ 008019
+ 001062
+ 008019
+ 001065
+ 008019
+ 001062
+ 008019
+ 316031 8 008021
+ 301011
+ 301012
+ 301027
+ 019005
+ 019006
+ 020028
+ 008021
+ 316032 5 008021
+ 301011
+ 301012
+ 301027
+ 008021
+ 316033 7 008021
+ 301011
+ 301012
+ 101000
+ 031001
+ 301027
+ 008021
+ 316034 17 008079
+ 316030
+ 008011
+ 001022
+ 008007
+ 301023
+ 008007
+ 020090
+ 316031
+ 101000
+ 031000
+ 316032
+ 101000
+ 031001
+ 316033
+ 008011
+ 008079
+ 316035 9 008079
+ 316030
+ 008011
+ 020023
+ 020021
+ 020008
+ 316031
+ 008011
+ 008079
+ 316036 13 008079
+ 316030
+ 008011
+ 001027
+ 316031
+ 101000
+ 031000
+ 316032
+ 101000
+ 031001
+ 316033
+ 008011
+ 008079
+ 316037 7 008079
+ 316030
+ 008011
+ 011031
+ 316031
+ 008011
+ 008079
+ 316038 8 008079
+ 316030
+ 008011
+ 020041
+ 020021
+ 316031
+ 008011
+ 008079
+ 316039 7 008079
+ 316030
+ 008011
+ 020024
+ 316031
+ 008011
+ 008079
+ 316040 6 316030
+ 008079
+ 301014
+ 001037
+ 010064
+ 008079
+ 316050 16 301001
+ 301011
+ 301012
+ 002160
+ 008005
+ 005002
+ 006002
+ 008005
+ 019100
+ 019005
+ 019006
+ 019101
+ 019102
+ 019103
+ 019104
+ 019105
+ 316052 29 301005
+ 301011
+ 301012
+ 001007
+ 025150
+ 122000
+ 031001
+ 001027
+ 019150
+ 019106
+ 008005
+ 005002
+ 006002
+ 008005
+ 019107
+ 019005
+ 019006
+ 019108
+ 019109
+ 019110
+ 019111
+ 019112
+ 019113
+ 019114
+ 019115
+ 019116
+ 019117
+ 019118
+ 019119
+ 318001 2 301025
+ 024011
+ 318003 4 301026
+ 024005
+ 024004
+ 024021
+ 318004 6 301025
+ 004023
+ 013011
+ 024005
+ 024004
+ 024022
+ 321001 6 002101
+ 002114
+ 002105
+ 002106
+ 002107
+ 002121
+ 321003 4 021051
+ 021014
+ 021017
+ 021030
+ 321004 5 301031
+ 002003
+ 101000
+ 031001
+ 321003
+ 321005 12 025004
+ 002121
+ 002122
+ 002123
+ 002124
+ 002125
+ 002126
+ 002127
+ 002128
+ 002129
+ 002130
+ 002131
+ 321006 4 025001
+ 025002
+ 025003
+ 025005
+ 321007 8 025009
+ 025010
+ 025011
+ 025012
+ 025013
+ 025015
+ 025016
+ 025017
+ 321008 3 025006
+ 025007
+ 025008
+ 321009 2 025018
+ 025019
+ 321010 13 002101
+ 007002
+ 002102
+ 002103
+ 002104
+ 002105
+ 002106
+ 002107
+ 002108
+ 002109
+ 002110
+ 002132
+ 002133
+ 321011 3 030031
+ 030032
+ 029002
+ 321012 3 101000
+ 031001
+ 002135
+ 321021 15 002003
+ 002101
+ 201130
+ 002106
+ 201000
+ 201132
+ 202130
+ 002121
+ 202000
+ 201000
+ 201133
+ 202129
+ 025001
+ 202000
+ 201000
+ 321022 11 007007
+ 204001
+ 031021
+ 011001
+ 204000
+ 011002
+ 204001
+ 031021
+ 011006
+ 204000
+ 021030
+ 321023 9 007007
+ 021091
+ 021030
+ 202129
+ 021014
+ 201129
+ 021017
+ 202000
+ 201000
+ 321024 7 007007
+ 204001
+ 031021
+ 012007
+ 011006
+ 204000
+ 021030
+ 321025 17 007007
+ 021091
+ 021030
+ 202129
+ 021014
+ 201129
+ 021017
+ 202000
+ 201000
+ 021092
+ 021030
+ 025092
+ 201129
+ 202129
+ 021017
+ 202000
+ 201000
+ 321026 10 007007
+ 204001
+ 031021
+ 012007
+ 025091
+ 011071
+ 011072
+ 011073
+ 011074
+ 204000
+ 321027 18 021118
+ 202129
+ 201132
+ 002112
+ 201000
+ 201131
+ 002111
+ 201000
+ 202000
+ 002104
+ 021105
+ 021106
+ 021107
+ 021114
+ 021115
+ 021116
+ 008018
+ 021117
+ 321028 18 021118
+ 202129
+ 201132
+ 002112
+ 201000
+ 201131
+ 002111
+ 201000
+ 202000
+ 002104
+ 021123
+ 021106
+ 021107
+ 021114
+ 021115
+ 021116
+ 008018
+ 021117
+ 321030 18 008085
+ 202129
+ 201131
+ 002111
+ 201000
+ 202000
+ 002134
+ 021062
+ 021063
+ 021158
+ 021159
+ 021160
+ 021161
+ 021162
+ 021163
+ 021164
+ 021165
+ 021166
+ 340001 45 001007
+ 001031
+ 002019
+ 002020
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 005001
+ 006001
+ 007024
+ 005021
+ 007025
+ 005022
+ 005043
+ 005040
+ 201133
+ 005041
+ 201000
+ 201132
+ 025070
+ 201000
+ 202126
+ 007001
+ 202000
+ 033060
+ 033061
+ 033062
+ 033063
+ 033064
+ 033065
+ 101010
+ 340002
+ 101087
+ 340003
+ 002019
+ 025051
+ 101007
+ 340004
+ 340002 3 025140
+ 025141
+ 025142
+ 340003 5 104100
+ 201136
+ 005042
+ 201000
+ 014046
+ 340004 9 005060
+ 005061
+ 025085
+ 105006
+ 005042
+ 025142
+ 014047
+ 025142
+ 014048
+ 340005 94 001007
+ 002019
+ 001096
+ 025061
+ 005044
+ 005040
+ 001030
+ 301011
+ 301012
+ 004007
+ 005001
+ 006001
+ 008029
+ 008074
+ 008077
+ 040011
+ 025097
+ 025095
+ 025098
+ 025099
+ 021144
+ 025096
+ 040012
+ 040013
+ 021169
+ 022151
+ 022162
+ 022163
+ 025160
+ 025133
+ 022156
+ 022164
+ 022165
+ 022166
+ 021137
+ 021138
+ 022167
+ 021139
+ 021118
+ 021145
+ 021146
+ 021147
+ 022168
+ 022169
+ 022170
+ 025161
+ 025162
+ 022171
+ 022172
+ 022173
+ 022174
+ 021170
+ 021171
+ 022175
+ 021172
+ 021118
+ 021173
+ 021174
+ 021175
+ 102003
+ 002153
+ 012063
+ 013090
+ 013091
+ 007002
+ 011097
+ 011098
+ 007002
+ 011095
+ 011096
+ 010096
+ 010081
+ 010082
+ 010083
+ 010101
+ 025132
+ 025163
+ 025126
+ 025128
+ 025164
+ 010085
+ 010097
+ 010086
+ 010087
+ 010092
+ 010088
+ 010089
+ 010098
+ 010099
+ 010090
+ 010100
+ 010093
+ 025127
+ 040014
+ 340007 57 001007
+ 001031
+ 002019
+ 002020
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 005001
+ 006001
+ 007024
+ 005021
+ 007025
+ 005022
+ 005043
+ 005040
+ 201133
+ 005041
+ 201000
+ 201132
+ 025070
+ 201000
+ 202126
+ 007001
+ 202000
+ 103003
+ 025140
+ 025141
+ 033060
+ 033061
+ 033062
+ 033063
+ 033064
+ 033065
+ 040020
+ 101010
+ 340002
+ 101087
+ 340003
+ 002019
+ 025051
+ 101007
+ 340004
+ 020081
+ 008029
+ 020083
+ 008029
+ 040018
+ 040019
+ 040021
+ 040022
+ 340008 70 001007
+ 001031
+ 002019
+ 002020
+ 004001
+ 004002
+ 004003
+ 004004
+ 004005
+ 202131
+ 201138
+ 004006
+ 201000
+ 202000
+ 005001
+ 006001
+ 007024
+ 005021
+ 007025
+ 005022
+ 005043
+ 005040
+ 201133
+ 005041
+ 201000
+ 201132
+ 025070
+ 201000
+ 202126
+ 007001
+ 202000
+ 103003
+ 025140
+ 025141
+ 033060
+ 033061
+ 033062
+ 033063
+ 033064
+ 033065
+ 040020
+ 101010
+ 340002
+ 104000
+ 031002
+ 201136
+ 005042
+ 201000
+ 014046
+ 108003
+ 025140
+ 025141
+ 040015
+ 040016
+ 025062
+ 101000
+ 031002
+ 040017
+ 002019
+ 025051
+ 101007
+ 340004
+ 020081
+ 008029
+ 020083
+ 008029
+ 040018
+ 040019
+ 040021
+ 040022
+ 340009 23 001007
+ 001031
+ 002019
+ 002020
+ 301011
+ 301013
+ 005040
+ 201136
+ 005041
+ 201000
+ 025071
+ 005001
+ 005001
+ 006001
+ 006001
+ 107064
+ 106032
+ 008012
+ 008013
+ 008065
+ 008072
+ 013039
+ 040015
+ 340010 97 001007
+ 002019
+ 001096
+ 025061
+ 005044
+ 005040
+ 001030
+ 301011
+ 301012
+ 004007
+ 301021
+ 008029
+ 008074
+ 008077
+ 040011
+ 025097
+ 025095
+ 025098
+ 025099
+ 021144
+ 025096
+ 040012
+ 040013
+ 021169
+ 040023
+ 040024
+ 040025
+ 022151
+ 022162
+ 022163
+ 025160
+ 025133
+ 022156
+ 022164
+ 022165
+ 022166
+ 021137
+ 021138
+ 022167
+ 021139
+ 021118
+ 021145
+ 021146
+ 021147
+ 022168
+ 022169
+ 022170
+ 025161
+ 025162
+ 022171
+ 022172
+ 022173
+ 022174
+ 021170
+ 021171
+ 022175
+ 021172
+ 021118
+ 021173
+ 021174
+ 021175
+ 102003
+ 002153
+ 012063
+ 013090
+ 013091
+ 007002
+ 011097
+ 011098
+ 007002
+ 011095
+ 011096
+ 010096
+ 010081
+ 010082
+ 010083
+ 010101
+ 025132
+ 025163
+ 025126
+ 025128
+ 025164
+ 010085
+ 010097
+ 010086
+ 010087
+ 010092
+ 010088
+ 010089
+ 010098
+ 010099
+ 010090
+ 010100
+ 010093
+ 025127
+ 040014
+ 010102
diff --git a/bufrtables/Makefile b/bufrtables/Makefile
new file mode 100755
index 0000000..a266c56
--- /dev/null
+++ b/bufrtables/Makefile
@@ -0,0 +1,76 @@
+#
+# Makefile for bufrtables
+#
+LIBRARY = ../lib$(LIB)$(R64).a
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+TARGETS = all clean
+#
+SOURCES.F=
+
+LINKS= B0000000000099010001.TXT \
+ D0000000000098011000.TXT \
+ D0000000000078011007.TXT \
+ B0000000000098011000.TXT \
+ B0000000000098010000.TXT \
+ B0000000000089011255.TXT \
+ B0000000000078011007.TXT \
+ D0000000000099010001.TXT \
+ D0000000000089012001.TXT \
+ D0000000000078011008.TXT \
+ D0000000000034011001.TXT \
+ B0000000000089012001.TXT \
+ B0000000000078011008.TXT \
+ B0000000000034011001.TXT \
+ B0000000000254010001.TXT \
+ D0000000000254010001.TXT \
+ B0000000000000007000.TXT \
+ D0000000000000007000.TXT \
+ B0000000000000008000.TXT \
+ D0000000000000008000.TXT \
+ B0000000000000009000.TXT \
+ D0000000000000009000.TXT \
+ B0000000000000010000.TXT \
+ D0000000000000010000.TXT \
+ B0000000000000011000.TXT \
+ D0000000000000011000.TXT \
+ B0000000000000012000.TXT \
+ D0000000000000012000.TXT \
+ B0000000000098007001.TXT \
+ D0000000000098007001.TXT \
+ B0000000000098008001.TXT \
+ D0000000000098008001.TXT \
+ B0000000000098009001.TXT \
+ D0000000000098009001.TXT \
+ B0000000000098010001.TXT \
+ D0000000000098010001.TXT \
+ B0000000000098011001.TXT \
+ D0000000000098011001.TXT \
+ B0000000000098012001.TXT \
+ D0000000000098012001.TXT
+
+
+#
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.F) $(OBJECTS.c)
+#
+#
+all: links bufr2txt_tables bufr_split_tables txt2bufr_tables
+
+links:
+ ./links.sh
+
+bufr2txt_tables: bufr2txt_tables.f
+ $(FC) $(FFLAGS) -o bufr2txt_tables bufr2txt_tables.f $(LIBRARY)
+bufr_split_tables: bufr_split_tables.f
+ $(FC) $(FFLAGS) -o bufr_split_tables bufr_split_tables.f $(LIBRARY)
+txt2bufr_tables: txt2bufr_tables.f
+ $(FC) $(FFLAGS) -o txt2bufr_tables txt2bufr_tables.f $(LIBRARY)
+
+clean:
+ \rm -f $(LINKS) *.o
+ \rm -f bufr2txt_tables; \rm -f bufr_split_tables; \rm -f txt2bufr_tables
diff --git a/bufrtables/Makefile.in b/bufrtables/Makefile.in
new file mode 100755
index 0000000..5fb5f25
--- /dev/null
+++ b/bufrtables/Makefile.in
@@ -0,0 +1,81 @@
+#
+# Makefile for bufrtables
+#
+R64 = reals
+ARCH = arch
+CNAME = comp
+LIB = depl
+A64 = plat
+#
+LIBRARY = ../lib$(LIB)$(R64).a
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+TARGETS = all clean
+#
+SOURCES.F=
+
+LINKS= B0000000000099010001.TXT \
+ D0000000000098011000.TXT \
+ D0000000000078011007.TXT \
+ B0000000000098011000.TXT \
+ B0000000000098010000.TXT \
+ B0000000000089011255.TXT \
+ B0000000000078011007.TXT \
+ D0000000000099010001.TXT \
+ D0000000000089012001.TXT \
+ D0000000000078011008.TXT \
+ D0000000000034011001.TXT \
+ B0000000000089012001.TXT \
+ B0000000000078011008.TXT \
+ B0000000000034011001.TXT \
+ B0000000000254010001.TXT \
+ D0000000000254010001.TXT \
+ B0000000000000007000.TXT \
+ D0000000000000007000.TXT \
+ B0000000000000008000.TXT \
+ D0000000000000008000.TXT \
+ B0000000000000009000.TXT \
+ D0000000000000009000.TXT \
+ B0000000000000010000.TXT \
+ D0000000000000010000.TXT \
+ B0000000000000011000.TXT \
+ D0000000000000011000.TXT \
+ B0000000000000012000.TXT \
+ D0000000000000012000.TXT \
+ B0000000000098007001.TXT \
+ D0000000000098007001.TXT \
+ B0000000000098008001.TXT \
+ D0000000000098008001.TXT \
+ B0000000000098009001.TXT \
+ D0000000000098009001.TXT \
+ B0000000000098010001.TXT \
+ D0000000000098010001.TXT \
+ B0000000000098011001.TXT \
+ D0000000000098011001.TXT \
+ B0000000000098012001.TXT \
+ D0000000000098012001.TXT
+
+
+#
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.F) $(OBJECTS.c)
+#
+#
+all: links bufr2txt_tables bufr_split_tables txt2bufr_tables
+
+links:
+ ./links.sh
+bufr2txt_tables: bufr2txt_tables.f
+ $(FC) $(FFLAGS) -o bufr2txt_tables bufr2txt_tables.f $(LIBRARY)
+bufr_split_tables: bufr_split_tables.f
+ $(FC) $(FFLAGS) -o bufr_split_tables bufr_split_tables.f $(LIBRARY)
+txt2bufr_tables: txt2bufr_tables.f
+ $(FC) $(FFLAGS) -o txt2bufr_tables txt2bufr_tables.f $(LIBRARY)
+
+clean:
+ \rm -f $(LINKS) *.o
+ \rm -f bufr2txt_tables; \rm -f bufr_split_tables; \rm -f txt2bufr_tables
diff --git a/bufrtables/bufr2txt_tables.f b/bufrtables/bufr2txt_tables.f
new file mode 100755
index 0000000..8608956
--- /dev/null
+++ b/bufrtables/bufr2txt_tables.f
@@ -0,0 +1,592 @@
+ PROGRAM BUFR2TXT_TABLES
+C
+C**** *BUFR2TXT_TABLES*
+C
+C
+C PURPOSE.
+C --------
+C Unpacks input bufr tables in bufr form and creates
+C text version of bufr tables and binary bufr tables
+C used by bufr software.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C NONE.
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C CALL BUFREX
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/07/97.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2=4096 ,JSEC3= 4,
+ 1 JSEC4=2,JELEM=160000,JSUBS=400,JCVAL=150 ,JBUFL=512000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=3000,JCTST=3000,JCTEXT=6000,
+ 3 JWORK=4096000,JKEY=46)
+C
+ PARAMETER (KELEM=80000)
+ PARAMETER (KVALS=360000)
+C
+ DIMENSION KBUFF(JBUFL)
+ DIMENSION KBUFR(JBUFL)
+ DIMENSION KSUP(JSUP) ,KSEC0(JSEC0),KSEC1(JSEC1)
+ DIMENSION KSEC2(JSEC2),KSEC3(JSEC3),KSEC4(JSEC4)
+ DIMENSION KEY (JKEY),KREQ(2)
+C
+ REAL*8 VALUES(KVALS),VALUE(KVALS)
+ DIMENSION KTDLST(JELEM),KTDEXP(JELEM),KRQ(KELEM)
+ REAL*8 RQV(KELEM)
+ DIMENSION KDATA(200),KBOXR(JELEM*4)
+ REAL*8 VALS(KVALS)
+C
+ CHARACTER*256 CF,COUT,CARG(4)
+ CHARACTER*64 CNAMES(KELEM),CBOXN(JELEM*4)
+ CHARACTER*24 CUNITS(KELEM),CBOXU(JELEM*4)
+ CHARACTER*80 CVALS(KVALS)
+ CHARACTER*80 CVAL(KVALS)
+ CHARACTER*80 YENC
+ REAL*8 EPS, RVIND
+c
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+C Missing value indicator
+C
+ NBYTPW=JBPW/8
+ RVIND=1.7E38
+ nvind=2147483647
+ EPS=10.E-10
+ NPACK=0
+ N=0
+ OO=.FALSE.
+C
+C Input file name
+C
+C Get input and output file name.
+C
+ NARG=IARGC()
+c
+ IF(NARG.NE.2) THEN
+ print*,'Usage -- bufr2txt_tables -i infile '
+ stop
+ END IF
+c
+ do 101 j=1,narg
+ call getarg(j,carg(j))
+ 101 continue
+c
+ if(carg(1).ne.'-i'.and.carg(1).ne.'-I'.or.
+ 1 carg(2).eq.' ') then
+ print*,'Usage -- bufr2txt_tables -i inpfile '
+ stop
+ end if
+c
+ cf=carg(2)
+ ii=index(cf,' ')
+c
+ KRQL=0
+ NR=0
+ KREQ(1)=0
+ KREQ(2)=0
+C
+C* 1.2 OPEN FILE CONTAINING BUFR DATA.
+C -------------------------------
+ 120 CONTINUE
+C
+ IRET=0
+ CALL PBOPEN(IUNIT,CF(1:ii),'r',IRET)
+ IF(IRET.EQ.-1) STOP 'open failed'
+ IF(IRET.EQ.-2) STOP 'Invalid file name'
+ IF(IRET.EQ.-3) STOP 'Invalid open mode specified'
+C
+C -----------------------------------------------------------------
+C* 2. SET REQUEST FOR EXPANSION.
+C --------------------------
+ 200 CONTINUE
+C
+C
+C
+C -----------------------------------------------------------------
+C* 3. READ BUFR MESSAGE.
+C ------------------
+ 300 CONTINUE
+C
+ IERR=0
+ KBUFL=0
+C
+ IRET=0
+ CALL PBBUFR(IUNIT,KBUFF,JBUFL,KBUFL,IRET)
+ IF(IRET.EQ.-1) THEN
+c IF(N.NE.0) GO TO 600
+ print*,'Number of messages ',n
+ STOP 'EOF'
+ END IF
+ IF(IRET.EQ.-2) STOP 'File handling problem'
+ IF(IRET.EQ.-3) STOP 'Array too small for product'
+C
+ N=N+1
+ print*,'----------------------------------',n
+ KBUFL=KBUFL/nbytpw+1
+C
+C -----------------------------------------------------------------
+C* 4. EXPAND BUFR MESSAGE.
+C --------------------
+ 400 CONTINUE
+C
+ CALL BUS012(KBUFL,KBUFF,KSUP,KSEC0,KSEC1,KSEC2,KERR)
+ IF(KERR.NE.0) THEN
+ PRINT*,'Error in BUS012: ',KERR
+ PRINT*,' BUFR MESSAGE NUMBER ',N,' CORRUPTED.'
+ KERR=0
+ GO TO 300
+ END IF
+C
+ IF(KSUP(6).GT.1) THEN
+ KEL=JWORK/KSUP(6)
+ IF(KEL.GT.KELEM) KEL=KELEM
+ ELSE
+ KEL=KELEM
+ END IF
+C
+ CALL BUFREX(KBUFL,KBUFF,KSUP,KSEC0 ,KSEC1,KSEC2 ,KSEC3 ,KSEC4,
+ 1 KEL,CNAMES,CUNITS,KVALS,VALUES,CVALS,IERR)
+C
+ print*,'ierr=',ierr
+ IF(IERR.NE.0) call exit(2)
+C
+C* 5. Create text and binary Bufr tables
+C ----------------------------------
+ 500 continue
+c
+ CALL BUSEL(KTDLEN,KTDLST,KTDEXL,KTDEXP,KERR)
+ IF(KERR.NE.0) CALL EXIT(2)
+c
+ CALL BUTABLES(KSUP,KSEC1,KTDLEN,KTDLST,KTDEXL,KTDEXP,
+ 1 VALUES,CVALS,KERR)
+ if(kerr.ne.0) call exit(2)
+c
+ GO TO 300
+C -----------------------------------------------------------------
+C
+ 810 CONTINUE
+C
+ WRITE(*,'(1H ,A)') 'OPEN ERROR ON INPUT FILE'
+ GO TO 900
+C
+ 800 CONTINUE
+C
+ IF(iret.EQ.-1) THEN
+ print*,'Number of records processed ',n
+ ELSE
+ print*,' BUFR : error= ',ierr
+ END IF
+C
+ 900 CONTINUE
+C
+ CALL PBCLOSE(IUNIT,IRET)
+ CALL PBCLOSE(IUNIT1,IRET)
+C
+ END
+ SUBROUTINE BUTABLES(KSUP,KSEC1,KTDLEN,KTDLST,KTDEXL,KTDEXP,
+ 1 VALUES,CVALS,KERR)
+C
+C**** *BUTABLES*
+C
+C
+C PURPOSE.
+C --------
+C Create text and binary Bufr tables from Bufr data.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C CALL BUTABLES(KSEC1,KTDLEN,KTDLST,KTDEXL,KTDEXP,
+C KVALS,VALUES,CVALS,KERR)
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C CALL BUSEL
+C CALL BUFREX
+C CALL BUFREN
+C CALL BUPRS0
+C CALL BUPRS1
+C CALL BUPRS2
+C CALL BUPRS3
+C CALL BUPRT
+C CALL BUUKEY
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/09/87.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H,Y)
+C
+ dimension ksec1(*),ktdlst(*),ktdexp(*),ksup(*)
+ real*8 values(*), rvind
+ character*80 cvals(*)
+c
+ character*120 crec
+ character*256 YFNAME
+ character*21 YTABB,YTABC,YTABD
+C
+C ------------------------------------------------------------------
+C* 1. Initialize constants and variables.
+C -----------------------------------
+ 100 continue
+C
+C Missing value indicator
+C
+ IREP=0
+ RVIND=1.7E38
+ NVIND=2147483647
+c
+C BUFR EDITION 2 NAMING CONVENTION
+C
+C BXXXXXYYZZ , CXXXXXYYZZ , DXXXXXYYZZ
+C
+C B - BUFR TABLE 'B'
+C C - BUFR TABLE 'C'
+C D - BUFR TABLE 'D'
+C XXXXX - ORIGINATING CENTRE
+C YY - VERSION NUMBER OF MASTER TABLE
+C USED( CURRENTLY 2 )
+C ZZ - VERSION NUMBER OF LOCAL TABLE USED
+C
+C BUFR EDITION 3 NAMING CONVENTION
+C
+C BWWWXXXYYZZ , CWWWXXXYYZZ , DWWWXXXYYZZ
+C
+C B - BUFR TABLE 'B'
+C C - BUFR TABLE 'C'
+C D - BUFR TABLE 'D'
+C WWW - ORIGINATING SUB-CENTRE
+C XXX - ORIGINATING CENTRE
+C YY - VERSION NUMBER OF MASTER TABLE
+C USED( CURRENTLY 2 )
+C ZZ - VERSION NUMBER OF LOCAL TABLE USED
+C
+C
+C BUFR EDITION 4 NAMING CONVENTION
+C
+C BSSSWWWWWXXXXXYYYZZZ , CSSSWWWWWXXXXXYYYZZZ , DSSSWWWWWXXXXXYYYZZZ
+C
+C B - BUFR TABLE 'B'
+C C - BUFR TABLE 'C'
+C D - BUFR TABLE 'D'
+C SSS - MASTER TABLE
+C WWWWWW - ORIGINATING SUB-CENTRE
+C XXXXXX - ORIGINATING CENTRE
+C YYY - VERSION NUMBER OF MASTER
+C TABLE USED( CURRENTLY 12 )
+C ZZZ - VERSION NUMBER OF LOCAL TABLE USED
+
+ IXX=KSEC1(3)
+ IYY=KSEC1(15)
+ IZZ=KSEC1(08)
+ IF(KSEC1(2).EQ.3) THEN
+ IWW=KSEC1(16)
+ ISS=KSEC1(14)
+ ELSEIF(KSEC1(2).EQ.4) THEN
+ IWW=KSEC1(16)
+ ISS=KSEC1(14)
+ ELSE
+ IWW=0
+ ISS=0
+ END IF
+C
+C IF STANDARD TABLES USED, USE ECMWF ORIGINATING CENTRE ID
+C
+ IF(KSEC1(8).EQ.0.OR.KSEC1(8).EQ.255) THEN
+ IXX=98
+ IWW=0
+ IZZ=0
+ ENDIF
+C
+ if(ksec1(2).ge.3) then
+ WRITE(YTABB,'(A1,I3.3,2(I5.5),I3.3,I3.3)')
+ 1 'B',ISS,IWW,IXX,IYY,IZZ
+ WRITE(YTABC,'(A1,I3.3,2(I5.5),I3.3,I3.3)')
+ 1 'C',ISS,IWW,IXX,IYY,IZZ
+ WRITE(YTABD,'(A1,I3.3,2(I5.5),I3.3,I3.3)')
+ 1 'D',ISS,IWW,IXX,IYY,IZZ
+ iend=20
+ else
+ WRITE(YTABB,'(A1,I5.5,I2.2,I2.2)') 'B',IXX,IYY,IZZ
+ WRITE(YTABC,'(A1,I5.5,I2.2,I2.2)') 'C',IXX,IYY,IZZ
+ WRITE(YTABD,'(A1,I5.5,I2.2,I2.2)') 'D',IXX,IYY,IZZ
+ iend=10
+ end if
+C
+ if(ksec1(7).eq.1.or.ksec1(17).eq.1) then
+C
+C Bufr table B
+C
+ yfname=YTABB(1:iend)//'.TXT'
+ PRINT*,'BUFR Tables to be created ',yfname
+ open(unit=67,file=yfname,status='unknown',iostat=ios,err=500)
+C
+c
+c 1.1 Find replication factors if any
+c
+ do 101 i=1,ktdexl
+ if(ktdexp(i).eq.031001.or.ktdexp(i).eq.031002) then
+ irep=nint(values(i))
+ go to 102
+ end if
+ 101 continue
+c
+ 102 continue
+c
+c 1.2 Find first F descriptor
+c
+ 120 continue
+c
+ do 121 i=1,ktdexl
+ if(ktdexp(i).eq.000010) then
+ ist=i
+ go to 122
+ end if
+ 121 continue
+c
+ 122 continue
+c
+ do 201 i=1,irep
+ crec=' '
+c
+c F DESCRIPTOR TO BE ADDED OR DEFINED
+C
+ icv=nint(values(ist)/1000) ! index to cval array
+ iln=nint(values(ist))-icv*1000 ! length if chatacter string
+ crec(2:2)=cvals(icv)(1:iln)
+c
+c X DESCRIPTOR TO BE ADDED OR DEFINED
+c
+ icv=nint(values(ist+1)/1000) ! index to cval array
+ iln=nint(values(ist+1))-icv*1000 ! length if chatacter string
+ crec(3:4)=cvals(icv)(1:iln)
+c
+c Y DESCRIPTOR TO BE ADDED OR DEFINED
+c
+ icv=nint(values(ist+2)/1000) ! index to cval array
+ iln=nint(values(ist+2))-icv*1000 ! length if chatacter string
+ crec(5:7)=cvals(icv)(1:iln)
+c
+c ELEMENT NAME, LINE 1
+c
+ icv=nint(values(ist+3)/1000) ! index to cval array
+ iln=nint(values(ist+3))-icv*1000 ! length if chatacter string
+ crec(9:40)=cvals(icv)(1:iln)
+c
+c ELEMENT NAME, LINE 2
+c
+ icv=nint(values(ist+4)/1000) ! index to cval array
+ iln=nint(values(ist+4))-icv*1000 ! length if chatacter string
+ crec(41:72)=cvals(icv)(1:iln)
+c
+c UNITS NAME
+c
+ icv=nint(values(ist+5)/1000) ! index to cval array
+ iln=nint(values(ist+5))-icv*1000 ! length if chatacter string
+ crec(74:97)=cvals(icv)(1:iln)
+ if(crec(74:83).eq.'CODE TABLE'.or.
+ 1 crec(74:83).eq.'FLAG TABLE') then
+ crec(85:90)=crec(2:7)
+ end if
+c
+c UNITS SCALE SIGN
+c
+ icv=nint(values(ist+6)/1000) ! index to cval array
+ iln=nint(values(ist+6))-icv*1000 ! length if character string
+ yscale(1:1)=cvals(icv)(1:iln)
+ if(yscale(1:1).eq.'+') yscale(1:1)=' '
+c
+c UNITS SCALE
+c
+ icv=nint(values(ist+7)/1000) ! index to cval array
+ iln=nint(values(ist+7))-icv*1000 ! length if chatacter string
+ iii=101
+ do 112 ii=iln,1,-1
+ crec(iii:iii)=cvals(icv)(ii:ii)
+ if(cvals(icv)(ii:ii).ne.' ') iii=iii-1
+ 112 continue
+ crec(iii:iii)=yscale(1:1)
+
+c
+c UNITS REFERENCE SIGN
+c
+ icv=nint(values(ist+8)/1000) ! index to cval array
+ iln=nint(values(ist+8))-icv*1000 ! length if chatacter string
+ yref(1:1)=cvals(icv)(1:iln)
+ if(yref(1:1).eq.'+') yref(1:1)=' '
+c
+c UNITS REFERENCE VALUE
+c
+ icv=nint(values(ist+9)/1000) ! index to cval array
+ iln=nint(values(ist+9))-icv*1000 ! length if chatacter string
+ iii=114
+ do 111 ii=iln,1,-1
+ crec(iii:iii)=cvals(icv)(ii:ii)
+ if(cvals(icv)(ii:ii).ne.' ') iii=iii-1
+ 111 continue
+ crec(iii:iii)=yref(1:1)
+c
+c ELEMENT DATA WIDTH
+c
+ icv=nint(values(ist+10)/1000) ! index to cval array
+ iln=nint(values(ist+10))-icv*1000 ! length if chatacter string
+ iii=118
+ do 113 ii=iln,1,-1
+ crec(iii:iii)=cvals(icv)(ii:ii)
+ if(cvals(icv)(ii:ii).ne.' ') iii=iii-1
+ 113 continue
+
+c
+ ist=ist+11
+ print*,crec
+ write(67,'(a)',iostat=ios,err=400) crec
+c
+ 201 continue
+c
+ close(67)
+C
+ elseif(ksec1(7).eq.2.or.ksec1(17).eq.2) then
+C
+C Bufr table D
+C
+ yfname=YTABD(1:iend)//'.TXT'
+ PRINT*,'BUFR Table to be created ',yfname
+ open(unit=68,file=yfname,status='unknown',iostat=ios,err=500)
+c
+ ist=8
+ irep=1
+ if(ktdexp(8).eq.31001.or.ktdexp(8).eq.31002) then
+ irep=nint(values(8))
+ ist=9
+ end if
+c
+
+ inc=0
+ do 301 i=1,irep
+ crec=' '
+c
+c F DESCRIPTOR TO BE ADDED OR DEFINED
+C
+ icv=nint(values(ist)/1000) ! index to cval array
+ iln=nint(values(ist))-icv*1000 ! length if chatacter string
+ crec(2:2)=cvals(icv)(1:iln)
+c
+c X DESCRIPTOR TO BE ADDED OR DEFINED
+c
+ inc=inc+1
+ icv=nint(values(ist+inc)/1000) ! index to cval array
+ iln=nint(values(ist+inc))-icv*1000 ! length if chatacter string
+ crec(3:4)=cvals(icv)(1:iln)
+c
+c Y DESCRIPTOR TO BE ADDED OR DEFINED
+c
+ inc=inc+1
+ icv=nint(values(ist+inc)/1000) ! index to cval array
+ iln=nint(values(ist+inc))-icv*1000 ! length if chatacter string
+ crec(5:7)=cvals(icv)(1:iln)
+c
+c Number of sequences
+c
+ inc=inc+1
+ irep1=nint(values(ist+inc))
+ write(crec(8:10),'(i3)') irep1
+c
+c First in sequence
+c
+ inc=inc+1
+ icv=nint(values(ist+inc)/1000) ! index to cval array
+ iln=nint(values(ist+inc))-icv*1000 ! length if chatacter string
+ crec(12:17)=cvals(icv)(1:iln)
+c
+ write(*,'(a)') crec
+ write(68,'(a)') crec
+c
+ do 302 j=1,irep1-1
+ crec=' '
+ inc=inc+1
+ icv=nint(values(ist+inc)/1000) ! index to cval array
+ iln=nint(values(ist+inc))-icv*1000 ! length if chatacter string
+ crec(12:17)=cvals(icv)(1:iln)
+ write(*,'(a)') crec
+ write(68,'(a)') crec
+ 302 continue
+c
+ ist=ist+inc+1
+ inc=0
+c
+ 301 continue
+c
+ close(68)
+ return
+c
+ else
+ kerr=1
+ print*,'Not known table.'
+ call exit(2)
+ end if
+c
+ return
+c
+ 400 continue
+c
+ print*,'Write error ',ios
+ return
+c
+ 500 continue
+c
+ print*,'Open error ',ios
+ return
+ end
diff --git a/bufrtables/bufr_split_tables.f b/bufrtables/bufr_split_tables.f
new file mode 100755
index 0000000..9800764
--- /dev/null
+++ b/bufrtables/bufr_split_tables.f
@@ -0,0 +1,147 @@
+ PROGRAM BUFR_SPLIT_TABLES
+C
+C**** *BUFR_SPLIT_TABLES*
+C
+C
+C PURPOSE.
+C --------
+C
+C Splits bufr source text bufr tables into
+C standard wmo table and local table
+C
+C
+C** INTERFACE.
+C ----------
+C
+C NONE.
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C CALL BUFREX
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/07/97.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ CHARACTER*256 CF1,CF2,CF3,carg(4)
+ character*120 record
+c
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+C Input file name
+C
+C Get input and output file name.
+C
+ narg=IARGC()
+c
+ IF(narg.NE.2) THEN
+ print*,'Usage -- bufr_split_tables -i infile '
+ stop
+ END IF
+c
+ do 101 j=1,narg
+ call getarg(j,carg(j))
+ 101 continue
+c
+ if(carg(1).ne.'-i'.and.carg(1).ne.'-I'.or.
+ 1 carg(2).eq.' ') then
+ print*,'Usage -- bufr_split_tables -i inpfile '
+ stop
+ end if
+c
+ cf1=carg(2)
+ ii=index(cf1,' ')
+ if(ii.gt.1) ii=ii-1
+ cf2='L'//cf1(2:ii)
+ cf3=cf1(1:II-6)//'00.TXT'
+C
+C* 1.2 OPEN FILE CONTAINING BUFR DATA.
+C -------------------------------
+ 120 CONTINUE
+C
+ iunit1=23
+ iunit2=24
+ iunit3=25
+ open(iunit1,file=cf1(1:ii),status='old',
+ 1 recl=120,form='formatted')
+ open(iunit2,file=cf2(1:ii),status='unknown',
+ 1 recl=120,form='formatted')
+ open(iunit3,file=cf3(1:ii),status='unknown',
+ 1 recl=120,form='formatted')
+C
+C -----------------------------------------------------------------
+C* 3. READ BUFR TABLE
+C ------------------
+ 300 CONTINUE
+C
+ read(iunit1,'(a)',end=400) record
+ read(record(5:7),'(i3)') ix
+c
+ if(cf1(1:1).eq.'B') then
+ if(ix.ge.193) then
+ write(iunit2,'(a)') record
+ else
+ write(iunit3,'(a)') record
+ end if
+ elseif(cf1(1:1).eq.'D') then
+ if(ix.ge.193) then
+ read(record(8:10),'(i3)') iloop
+ write(iunit2,'(a)') record
+ do i=1,iloop-1
+ read(iunit1,'(a)',end=400) record
+ write(iunit2,'(a)') record
+ end do
+ else
+ read(record(8:10),'(i3)') iloop
+ write(iunit3,'(a)') record
+ do i=1,iloop-1
+ read(iunit1,'(a)',end=400) record
+ write(iunit3,'(a)') record
+ end do
+ end if
+ else
+ print*,'The table has not been split'
+ go to 400
+ end if
+C
+ go to 300
+C
+C -----------------------------------------------------------------
+C* 4. Close files
+C --------------------
+ 400 CONTINUE
+C
+ close(iunit1)
+ close(iunit2)
+ close(iunit3)
+C -----------------------------------------------------------------
+C
+C
+C
+ END
diff --git a/bufrtables/links.sh b/bufrtables/links.sh
new file mode 100755
index 0000000..88d9f66
--- /dev/null
+++ b/bufrtables/links.sh
@@ -0,0 +1,77 @@
+#!/bin/sh
+
+ln -fs B0000000000098013001.TXT B0000000000099010001.TXT
+ln -fs C0000000000098013001.TXT C0000000000099010001.TXT
+ln -fs D0000000000098013001.TXT D0000000000099010001.TXT
+ln -fs B0000000000098013001.TXT B0000000000089011255.TXT
+ln -fs C0000000000098013001.TXT C0000000000089011255.TXT
+ln -fs D0000000000098013001.TXT D0000000000089011255.TXT
+ln -fs B0000000000098013001.TXT B0000000000078011007.TXT
+ln -fs C0000000000098013001.TXT C0000000000078011007.TXT
+ln -fs D0000000000098013001.TXT D0000000000078011007.TXT
+ln -fs B0000000000098013001.TXT B0000000000089012001.TXT
+ln -fs C0000000000098013001.TXT C0000000000089012001.TXT
+ln -fs D0000000000098013001.TXT D0000000000089012001.TXT
+ln -fs B0000000000098013001.TXT B0000000000078011008.TXT
+ln -fs C0000000000098013001.TXT C0000000000078011008.TXT
+ln -fs D0000000000098013001.TXT D0000000000078011008.TXT
+ln -fs B0000000000098013001.TXT B0000000000034011001.TXT
+ln -fs C0000000000098013001.TXT C0000000000034011001.TXT
+ln -fs D0000000000098013001.TXT D0000000000034011001.TXT
+ln -fs B0000000000098013001.TXT B0000000000254010001.TXT
+ln -fs C0000000000098013001.TXT C0000000000254010001.TXT
+ln -fs D0000000000098013001.TXT D0000000000254010001.TXT
+ln -fs B0000000000098013001.TXT B0000000000000007000.TXT
+ln -fs C0000000000098013001.TXT C0000000000000007000.TXT
+ln -fs D0000000000098013001.TXT D0000000000000007000.TXT
+ln -fs B0000000000098013001.TXT B0000000000000008000.TXT
+ln -fs C0000000000098013001.TXT C0000000000000008000.TXT
+ln -fs D0000000000098013001.TXT D0000000000000008000.TXT
+ln -fs B0000000000098013001.TXT B0000000000000009000.TXT
+ln -fs C0000000000098013001.TXT C0000000000000009000.TXT
+ln -fs D0000000000098013001.TXT D0000000000000009000.TXT
+ln -fs B0000000000098013001.TXT B0000000000000010000.TXT
+ln -fs C0000000000098013001.TXT C0000000000000010000.TXT
+ln -fs D0000000000098013001.TXT D0000000000000010000.TXT
+ln -fs B0000000000098013001.TXT B0000000000000011000.TXT
+ln -fs C0000000000098013001.TXT C0000000000000011000.TXT
+ln -fs D0000000000098013001.TXT D0000000000000011000.TXT
+ln -fs B0000000000098013001.TXT B0000000000000012000.TXT
+ln -fs C0000000000098013001.TXT C0000000000000012000.TXT
+ln -fs D0000000000098013001.TXT D0000000000000012000.TXT
+ln -fs B0000000000098013001.TXT B0000000000000013000.TXT
+ln -fs C0000000000098013001.TXT C0000000000000013000.TXT
+ln -fs D0000000000098013001.TXT D0000000000000013000.TXT
+ln -fs B0000000000098013001.TXT B0000000000098012001.TXT
+ln -fs C0000000000098013001.TXT C0000000000098012001.TXT
+ln -fs D0000000000098013001.TXT D0000000000098012001.TXT
+ln -fs B0000000000098013001.TXT B0000000000098012000.TXT
+ln -fs C0000000000098013001.TXT C0000000000098012000.TXT
+ln -fs D0000000000098013001.TXT D0000000000098012000.TXT
+ln -fs B0000000000098013001.TXT B0000000000098011001.TXT
+ln -fs C0000000000098013001.TXT C0000000000098011001.TXT
+ln -fs D0000000000098013001.TXT D0000000000098011001.TXT
+ln -fs B0000000000098013001.TXT B0000000000098011000.TXT
+ln -fs C0000000000098013001.TXT C0000000000098011000.TXT
+ln -fs D0000000000098013001.TXT D0000000000098011000.TXT
+ln -fs B0000000000098013001.TXT B0000000000098010001.TXT
+ln -fs C0000000000098013001.TXT C0000000000098010001.TXT
+ln -fs D0000000000098013001.TXT D0000000000098010001.TXT
+ln -fs B0000000000098013001.TXT B0000000000098009001.TXT
+ln -fs C0000000000098013001.TXT C0000000000098009001.TXT
+ln -fs D0000000000098013001.TXT D0000000000098009001.TXT
+ln -fs B0000000000098013001.TXT B0000000000098008001.TXT
+ln -fs C0000000000098013001.TXT C0000000000098008001.TXT
+ln -fs D0000000000098013001.TXT D0000000000098008001.TXT
+ln -fs B0000000000098013001.TXT B0000000000098007001.TXT
+ln -fs C0000000000098013001.TXT C0000000000098007001.TXT
+ln -fs D0000000000098013001.TXT D0000000000098007001.TXT
+ln -fs B0000000000098013001.TXT B0000000000034013001.TXT
+ln -fs C0000000000098013001.TXT C0000000000034013001.TXT
+ln -fs D0000000000098013001.TXT D0000000000034013001.TXT
+ln -fs B0000000000098013001.TXT B0000000000059003003.TXT
+ln -fs C0000000000098013001.TXT C0000000000059003003.TXT
+ln -fs D0000000000098013001.TXT D0000000000059003003.TXT
+ln -fs B0000000000098014001.TXT B0000000000000014000.TXT
+ln -fs C0000000000098014001.TXT C0000000000000014000.TXT
+ln -fs D0000000000098014001.TXT D0000000000000014000.TXT
diff --git a/bufrtables/txt2bufr_tables.f b/bufrtables/txt2bufr_tables.f
new file mode 100755
index 0000000..d791a49
--- /dev/null
+++ b/bufrtables/txt2bufr_tables.f
@@ -0,0 +1,1205 @@
+ PROGRAM TXT2BUFR_TABLES
+C
+C**** *TXT2BUFR_TABLES*
+C
+C
+C PURPOSE.
+C --------
+C CREATES BYNARY BUFR TABLES USED BY BUFR EXPANSION
+C OR BUFR ENCODING SOFTWARE
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C BINARY UNIVERSAL FORM FOR DATA REPRESENTATION, FM 94 BUFR.
+C
+C J.K.GIBSON AND M.DRAGOSAVAC,1987: DECODING DATA
+C REPRESENTATION FM 94 BUFR,TECHNICAL MEMORANDUM NO.
+C
+C J.K.GIBSON,1986:EMOS 2 - STANDARDS FOR SOFTWARE DEVELOPMENT
+C AND MAINTANANCE ,TECHICAL MEMORANDUM NO. ECMWF.
+C
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JANUARY 1991.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ character*256 carg(2),cf
+c
+C
+C ------------------------------------------------------------------
+C* 1. CREATE BINARY BUFR TABLES.
+C __________________________
+ 100 CONTINUE
+C
+ ierr=0
+C Input file name
+C
+C Get input and output file name.
+C
+ narg=IARGC()
+c
+ IF(narg.NE.2) THEN
+ print*,'Usage -- txt2bufr_tables -i infile '
+ stop
+ END IF
+c
+ do 101 j=1,narg
+ call getarg(j,carg(j))
+ 101 continue
+c
+ if(carg(1).ne.'-i'.and.carg(1).ne.'-I'.or.
+ 1 carg(2).eq.' ') then
+ print*,'Usage -- txt2bufr_tables -i inpfile '
+ stop
+ end if
+c
+ cf=carg(2)
+ ii=index(cf,' ')
+ ii=ii-1
+c
+C* 2. TABLE B.
+C --------
+ 200 CONTINUE
+C
+ IF(cf(1:1).eq.'B') THEN
+ CALL BTABLE(cf,IERR)
+ IF(IERR.NE.0) THEN
+ WRITE(*,'(1H ,A,A,A)') 'Warning --- Bufr Table ',ybtable,
+ 1 ' not created.'
+ IERR=0
+ END IF
+C
+C* 3. TABLE C.
+C --------
+ 300 CONTINUE
+C
+ ELSEIF(cf(1:1).eq.'C') THEN
+ CALL CTABLE(cf,IERR)
+ IF(IERR.NE.0) THEN
+ WRITE(*,'(1H ,A,A,A)') 'Warning --- Bufr Table ',yctable,
+ 1 ' not created'
+ IERR=0
+ END IF
+C
+C* 4. TABLE D.
+C --------
+ 400 CONTINUE
+C
+ ELSEIF(cf(1:1).eq.'D') THEN
+ CALL DTABLE(cf,IERR)
+ IF(IERR.NE.0) THEN
+ WRITE(*,'(1H ,A,A,A)') 'Warning --- Bufr Table ',ydtable,
+ 1 ' not created'
+ IERR=0
+ END IF
+ ELSE
+ PRINT*,'Error - This is not B,C or D bufr Table!'
+ ENDIF
+C
+ END
+ SUBROUTINE BTABLE(YNAME,KERR)
+C
+C**** *BTABLE*
+C
+C
+C PURPOSE.
+C --------
+C CREATE BUFR TABLE B IN BINARY FORM.
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C BINARY UNIVERSAL FORM FOR DATA REPRESENTATION, FM 94 BUFR.
+C
+C J.K.GIBSON AND M.DRAGOSAVAC,1987: DECODING DATA
+C REPRESENTATION FM 94 BUFR,TECHNICAL MEMORANDUM NO.
+C
+C J.K.GIBSON,1986:EMOS 2 - STANDARDS FOR SOFTWARE DEVELOPMENT
+C AND MAINTANANCE ,TECHICAL MEMORANDUM NO. ECMWF.
+C
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JANUARY 1991.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H)
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2=4096 ,JSEC3= 4,
+ 1 JSEC4=2,JELEM=160000,JSUBS=400,JCVAL=150 ,JBUFL=512000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=3000,JCTST=3000,JCTEXT=6000,
+ 3 JWORK=4096000,JKEY=46)
+C
+ PARAMETER (KELEM=80000)
+ PARAMETER (KVALS=360000)
+C
+ DIMENSION KBUFF(JBUFL)
+ DIMENSION KSUP(JSUP) ,KSEC0(JSEC0),KSEC1(JSEC1)
+ DIMENSION KSEC2(JSEC2),KSEC3(JSEC3),KSEC4(JSEC4)
+C
+ REAL*8 VALUES(KVALS)
+ DIMENSION KTDLST(KELEM)
+ DIMENSION KDATA(10)
+C
+
+ CHARACTER*80 CVALS(KVALS)
+C
+ CHARACTER*120 YENTRY,YENTRY1
+C
+ CHARACTER*(*) YNAME
+ CHARACTER*120 YFNAME
+c
+C
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+ kbufl=jbufl
+ i=index(yname,' ')
+ i=i-1
+ if(i.eq.14) then
+C
+C Bufr Edition 0,1,2
+C
+ read(yname(9:10),'(i2)') ilocal
+ read(yname(7:8),'(i2)') imaster
+ iedition=2
+ yfname=yname(1:10)//'.buf'
+ elseif(i.eq.15) then
+C
+C Bufr Edition 3
+C
+ read(yname(10:11),'(i2)') ilocal
+ read(yname(8:9),'(i2)') imaster
+ read(yname(2:4),'(i2)') isubcentre
+ read(yname(5:7),'(i2)') icentre
+ iedition=3
+ yfname=yname(1:11)//'.buf'
+ elseif(i.eq.24) then
+C
+C Bufr Edition 4
+C
+ read(yname(18:20),'(i3)') ilocal
+ read(yname(15:17),'(i3)') imaster
+ read(yname(5:9),'(i5)') isubcentre
+ read(yname(10:14),'(i5)') icentre
+ iedition=4
+ yfname=' '
+ yfname=yname(1:20)//'.buf'
+ else
+ print*,'Wrong Bufr table name --',cf
+ call exit(2)
+ end if
+
+ J=0
+ jj=0
+C
+C
+ call pbopen(IUNIT1,yfname,'w',IRET)
+ IF(IRET.EQ.-1) STOP 'open failed on bufr.dat'
+ IF(IRET.EQ.-2) STOP 'Invalid file name'
+ IF(IRET.EQ.-3) STOP 'Invalid open mode specified'
+
+ OPEN(UNIT=21,FILE=YNAME(1:i),
+ 1 ERR=401,
+ 2 IOSTAT=IOS,
+ 3 STATUS='OLD')
+c
+c 000001
+ jj=jj+1
+ cvals(jj)='011'
+ values(jj)=jj*1000+3
+c
+c 000002
+ jj=jj+1
+ cvals(jj)='BUFR TABLES, COMPLETE'
+ values(jj)=jj*1000+32
+c
+c 000003
+ jj=jj+1
+ cvals(jj)=' '
+ values(jj)=jj*1000+32
+
+c
+c 000004 BUFR master table
+ jj=jj+1
+ cvals(jj)='00'
+ values(jj)=jj*1000+2
+c
+c 000005 BUFR edition number
+c
+ jj=jj+1
+ cvals(jj)='004'
+ values(jj)=jj*1000+3
+c
+c 000006 BUFR master table version number
+ jj=jj+1
+ print*,'imaster=',imaster
+ write(cvals(jj)(1:2),'(I2.2)') imaster
+ values(jj)=jj*1000+2
+c
+c 000008 BUFR local table version number
+ jj=jj+1
+ print*,'ilocal=',ilocal
+ write(cvals(jj)(1:2),'(I2.2)') ilocal
+ values(jj)=jj*1000+2
+
+
+c Replication factor
+ jj=jj+1
+ values(jj)=0
+c
+C ------------------------------------------------------------------
+C* 2. READ IN TABLE B ELEMENT.
+C ------------------------
+C
+ iii=0
+ 200 CONTINUE
+C
+ YENTRY=' '
+ READ(21,'(A)',ERR=402,END=300) YENTRY
+ iii=iii+1
+C
+C
+C* 2.1 SET ARRAYS FOR TABLE REFERENCE, ELEMENT NAME, UNITS,
+C* REFERENCE VALUE AND DATA WIDTH.
+C
+ 210 CONTINUE
+C
+c
+c F
+c
+ jj=jj+1
+ cvals (jj)=yentry(2:2)
+ values(jj)=jj*1000+1
+c
+c X
+c
+ jj=jj+1
+ cvals (jj)=yentry(3:4)
+ values(jj)=jj*1000+2
+c
+c Y
+c
+ jj=jj+1
+ cvals (jj)=yentry(5:7)
+ values(jj)=jj*1000+3
+c
+c Namne 1
+c
+ jj=jj+1
+ cvals (jj)=yentry(9:40)
+ values(jj)=jj*1000+32
+c
+c Name 2
+c
+ jj=jj+1
+ cvals (jj)=yentry(41:72)
+ values(jj)=jj*1000+32
+c
+c Unit name
+c
+ jj=jj+1
+ cvals (jj)=yentry(74:97)
+ values(jj)=jj*1000+24
+c
+c Unit scale sign
+c
+ iz=0
+ jj=jj+1
+ iz=index(yentry(98:101),'-')
+ if(iz.eq.0) then
+ cvals (jj)='+'
+ values(jj)=jj*1000+1
+ else
+ cvals (jj)='-'
+ values(jj)=jj*1000+1
+ end if
+c
+c Unit scale
+c
+ jj=jj+1
+ if(iz.ne.0) then
+ izz=98+iz-1
+ yentry(izz:izz)=' '
+ cvals (jj)=yentry(99:101)
+ values(jj)=jj*1000+3
+ else
+ cvals (jj)=yentry(99:101)
+ values(jj)=jj*1000+3
+ end if
+c
+c Unit reference sign
+c
+ iz=0
+ jj=jj+1
+ iz=index(yentry(102:114),'-')
+ if(iz.eq.0) then
+ cvals (jj)='+'
+ values(jj)=jj*1000+1
+ else
+ cvals (jj)='-'
+ values(jj)=jj*1000+1
+ end if
+c
+c Unit reference
+c
+ jj=jj+1
+ if(iz.ne.0) then
+ izz=102+iz-1
+ yentry(izz:izz)=' '
+ cvals (jj)=yentry(105:114)
+ values(jj)=jj*1000+10
+ else
+ cvals (jj)=yentry(105:114)
+ values(jj)=jj*1000+10
+ end if
+c
+c Element data width
+c
+ jj=jj+1
+ cvals (jj)=yentry(116:118)
+ values(jj)=jj*1000+3
+c
+c end of element descriptors
+c
+ GO TO 200
+C
+C ------------------------------------------------------------------
+C* 3. Pack tables into bufr message
+C --------------------------------
+ 300 CONTINUE
+C
+c Set section 0
+c
+ ksec0(3)=iedition
+c
+c Set section 1
+c
+ IF(KSEC0(3).LE.3) THEN
+ ksec1(1)=18
+ ksec1(2)=iedition
+ ksec1(3)=icentre
+ ksec1(4)=1
+ ksec1(5)=0
+ ksec1(6)=11
+ ksec1(7)=1
+ ksec1(8)=ilocal
+ ksec1(9)=4
+ ksec1(10)=6
+ ksec1(11)=21
+ ksec1(12)=0
+ ksec1(13)=0
+ ksec1(14)=0
+ ksec1(15)=imaster
+ ksec1(16)=isubcentre
+ ELSE
+ ksec1(1)=22
+ ksec1(2)=iedition
+ ksec1(3)=icentre
+ ksec1(4)=1
+ ksec1(5)=0
+ ksec1(6)=11
+ ksec1(7)=0
+ ksec1(8)=ilocal
+ ksec1(9)=2007
+ ksec1(10)=2
+ ksec1(11)=7
+ ksec1(12)=0
+ ksec1(13)=0
+ ksec1(14)=0
+ ksec1(15)=imaster
+ ksec1(16)=isubcentre
+ ksec1(17)=1
+ ksec1(18)=0
+ END IF
+c
+c Set section 3
+c
+ ksec3(3)=1
+ ksec3(4)=128
+c
+c Set replication factor
+c
+ print*,'delayed replication is ',iii
+ kdata(1)=iii
+ kdlen=1
+ values(8)=iii
+c
+c Set list of descriptors
+c
+ ktdlst( 1)= 000001
+ ktdlst( 2)= 000002
+ ktdlst( 3)= 000003
+ ktdlst( 4)= 000004
+ ktdlst( 5)= 000005
+ ktdlst( 6)= 000006
+ ktdlst( 7)= 000008
+ ktdlst( 8)= 101000
+ ktdlst( 9)= 031002
+ ktdlst(10)= 300004
+c
+ ktdlen=10
+c
+ call bufren(ksec0,ksec1,ksec2,ksec3,ksec4,ktdlen,ktdlst,
+ 1 kdlen,kdata,kelem,kvals,values,cvals,
+ 2 kbufl,kbuff,ierr)
+c
+ if(ierr.ne.0) then
+ print*,'bufren: error ',ierr
+ call exit(2)
+ end if
+c
+ print*,'Number of table B entries packed =',iii
+c
+ ilen=kbufl*4
+ print*,'total length of bufr message is ',ilen
+ call pbwrite(IUNIT1,KBUFF,ILEN,IERR)
+ return
+C -----------------------------------------------------------------
+ 400 CONTINUE
+C
+ RETURN
+C
+404 CONTINUE
+ KERR=1
+ WRITE(*,4404) IOS,yname
+ 4404 FORMAT(1H ,'Write error',i4,' on ',a)
+ RETURN
+C
+403 CONTINUE
+ KERR=1
+ WRITE(*,4403) IOS,yname
+4403 FORMAT(1H ,'Open error',i4,' on ',a)
+ RETURN
+C
+C
+402 CONTINUE
+ KERR=1
+ WRITE(*,4402) IOS,yfname
+ 4402 FORMAT(1H ,'Read error',i4,' on ',a)
+ RETURN
+C
+C
+ 401 CONTINUE
+C
+ KERR=1
+ WRITE(*,4401) IOS,yfname
+ 4401 FORMAT(1H ,'Open error',i4,' on ',a)
+C
+ RETURN
+ END
+ SUBROUTINE DTABLE(YNAME,KERR)
+C
+C**** *DTABLE*
+C
+C
+C PURPOSE.
+C --------
+C THE MAIN PURPOSE OF THIS PROGRAMME IS TO CREATE WORKING
+C TABLE OF SEQUENCE DESCRIPTORS FOR *BUFR* DECODING.
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C BINARY UNIVERSAL FORM FOR DATA REPRESENTATION, *FM 94 BUFR*.
+C
+C J.K.GIBSON AND *M.DRAGOSAVAC,1987:* DECODING *DATA *REPRESENTATION
+C *FM 94 BUFR*,*TECHNICAL *MEMORANDUM *NO.
+C
+C J.K.GIBSON,1986:*EMOS 2 - *STANDARDS FOR SOFTWARE DEVELOPMENT
+C AND MAINTANANCE *,*TECHICAL MEMORANDUM *NO.
+C *ECMWF*.
+C
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JANUARY 1991.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H)
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2=4096 ,JSEC3= 4,
+ 1 JSEC4=2,JELEM=160000,JSUBS=400,JCVAL=150 ,JBUFL=512000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=3000,JCTST=3000,JCTEXT=6000,
+ 3 JWORK=4096000,JKEY=46)
+C
+ PARAMETER (KELEM=20000)
+ PARAMETER (KVALS=360000)
+C
+ DIMENSION KBUFF(JBUFL)
+ DIMENSION KSUP(JSUP) ,KSEC0(JSEC0),KSEC1(JSEC1)
+ DIMENSION KSEC2(JSEC2),KSEC3(JSEC3),KSEC4(JSEC4)
+C
+ REAL*8 VALUES(KVALS)
+ DIMENSION KTDLST(KELEM)
+ DIMENSION KDATA(1000)
+C
+ CHARACTER*80 CVALS(KVALS)
+C
+ character*80 YENTRY
+C
+ CHARACTER*(*) YNAME
+ CHARACTER*256 YFNAME
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+ kbufl=jbufl
+ i=index(yname,' ')
+ i=i-1
+ if(i.eq.14) then
+c
+c Bufr Edition 0,1,2
+c
+ read(yname(9:10),'(i2)') ilocal
+ read(yname(7:8),'(i2)') imaster
+ iedition=2
+ yfname=' '
+ yfname=yname(1:10)//'.buf'
+ elseif(i.eq.15) then
+c
+c Bufr Editin 3
+c
+ read(yname(10:11),'(i2)') ilocal
+ read(yname(8:9),'(i2)') imaster
+ iedition=3
+ yfname=' '
+ yfname=yname(1:11)//'.buf'
+ elseif(i.eq.24) then
+c
+c Bufr Editin 4
+c
+ read(yname(18:20),'(i3)') ilocal
+ read(yname(15:17),'(i3)') imaster
+ read(yname(5:9),'(i5)') isubcentre
+ read(yname(10:14),'(i5)') icentre
+
+ iedition=4
+ yfname=' '
+ yfname=yname(1:20)//'.buf'
+
+
+ else
+ print*,'Wrong table name ---',yname
+ call exit(2)
+ end if
+c
+ J=1
+ jj=0
+C
+ call pbopen(IUNIT1,yfname,'w',IRET)
+ IF(IRET.EQ.-1) STOP 'open failed on bufr.dat'
+ IF(IRET.EQ.-2) STOP 'Invalid file name'
+ IF(IRET.EQ.-3) STOP 'Invalid open mode specified'
+
+ OPEN(UNIT=21,FILE=YNAME(1:i),
+ 1 ERR=401,
+ 2 IOSTAT=IOS,
+ 3 STATUS='OLD')
+c
+ jj=jj+1
+ cvals(jj)='011'
+ values(jj)=jj*1000+3
+C 000002
+ jj=jj+1
+ cvals(jj)='BUFR TABLES, COMPLETE'
+ values(jj)=jj*1000+32
+c
+c 000003
+ jj=jj+1
+ cvals(jj)=' '
+ values(jj)=jj*1000+32
+
+c
+c 000004 BUFR master table
+ jj=jj+1
+ cvals(jj)='00'
+ values(jj)=jj*1000+2
+c
+c 000005 BUFR edition number
+c
+ jj=jj+1
+ cvals(jj)='004'
+ values(jj)=jj*1000+3
+c
+c 000006 BUFR master table version number
+ jj=jj+1
+ print*,'imaster=',imaster
+ write(cvals(jj)(1:2),'(I2.2)') imaster
+ values(jj)=jj*1000+2
+c
+c 000008 BUFR local table version number
+ jj=jj+1
+ print*,'ilocal=',ilocal
+ write(cvals(jj)(1:2),'(I2.2)') ilocal
+ values(jj)=jj*1000+2
+
+c Replication factor for all table D entries
+c
+ jj=jj+1
+ values(jj)=0
+C
+C ------------------------------------------------------------------
+C* 2. READ IN TABLE D ELEMENT.
+C ------------------------
+C
+ 200 CONTINUE
+C
+ YENTRY=' '
+ READ(21,'(A)',ERR=402,END=300) YENTRY
+ j=j+1
+C
+C
+C* 2.1 SET ARRAYS FOR TABLE REFERENCE, ELEMENT NAME, UNITS,
+C* REFERENCE VALUE AND DATA WIDTH.
+C
+ 210 CONTINUE
+C
+c
+c F
+c
+ jj=jj+1
+ cvals (jj)=yentry(2:2)
+ values(jj)=jj*1000+1
+c
+c X
+c
+ jj=jj+1
+ cvals (jj)=yentry(3:4)
+ values(jj)=jj*1000+2
+c
+c Y
+c
+ jj=jj+1
+ cvals (jj)=yentry(5:7)
+ values(jj)=jj*1000+3
+c
+c Replication factor
+c
+ jj=jj+1
+ read(yentry(9:10),'(i2)') irepl
+ values(jj)=float(irepl)
+ kdata(j)=irepl
+c
+c Sequence descriptors
+c
+ jj=jj+1
+ cvals(jj)=yentry(12:17)
+ values(jj)=jj*1000+6
+c
+ do 220 i=1,irepl-1
+ READ(21,'(A)',ERR=402,END=300) YENTRY
+c
+ jj=jj+1
+ cvals(jj)=yentry(12:17)
+ values(jj)=jj*1000+6
+220 continue
+c
+ GO TO 200
+C
+C ------------------------------------------------------------------
+C* 3. Pack tables into bufr message
+C --------------------------------
+ 300 CONTINUE
+C
+c Set section 0
+c
+ ksec0(3)=iedition
+c
+c Set section 1
+c
+ IF(KSEC0(3).LE.3) THEN
+ ksec1(1)=18
+ ksec1(2)=iedition
+ ksec1(3)=98
+ ksec1(4)=1
+ ksec1(5)=0
+ ksec1(6)=11
+ ksec1(7)=2
+ ksec1(8)=ilocal
+ ksec1(9)=95
+ ksec1(10)=9
+ ksec1(11)=17
+ ksec1(12)=12
+ ksec1(13)=0
+ ksec1(14)=0
+ ksec1(15)=imaster
+ ksec1(16)=0
+ ELSE
+ ksec1(1)=22
+ ksec1(2)=iedition
+ ksec1(3)=icentre
+ ksec1(4)=1
+ ksec1(5)=0
+ ksec1(6)=11
+ ksec1(7)=0
+ ksec1(8)=ilocal
+ ksec1(9)=2005
+ ksec1(10)=6
+ ksec1(11)=7
+ ksec1(12)=0
+ ksec1(13)=0
+ ksec1(14)=0
+ ksec1(15)=imaster
+ ksec1(16)=isubcentre
+ ksec1(17)=2
+ ksec1(18)=0
+ END IF
+c
+c Set section 3
+c
+ ksec3(3)=1
+ ksec3(4)=128
+c
+c Set replication factor
+c
+ print*,'delayed replication is ',j
+ kdata(1)=j-1
+ kdlen=j
+ values(8)=j-1
+c
+c Set list of descriptors
+c
+ ktdlst(1)=000001
+ ktdlst(2)=000002
+ ktdlst(3)=000003
+ ktdlst(4)=000004
+ ktdlst(5)=000005
+ ktdlst(6)=000006
+ ktdlst(7)=000008
+ ktdlst(8)=104000
+ ktdlst(9)=031002
+ ktdlst(10)=300003
+ ktdlst(11)=101000
+ ktdlst(12)=031002
+ ktdlst(13)=000030
+c
+ ktdlen=13
+c
+ call bufren(ksec0,ksec1,ksec2,ksec3,ksec4,ktdlen,ktdlst,
+ 1 kdlen,kdata,kelem,kvals,values,cvals,
+ 2 kbufl,kbuff,ierr)
+c
+ if(ierr.gt.0) then
+ print*,'bufren: error ',ierr
+ call exit(2)
+ end if
+c
+ print*,'Number of table D entries packed =',j
+c
+ ilen=kbufl*JBPW/8
+ print*,'total length of bufr message is ',ilen
+ call pbwrite(IUNIT1,KBUFF,ILEN,IERR)
+ return
+C -----------------------------------------------------------------
+ 400 CONTINUE
+C
+ RETURN
+C
+404 CONTINUE
+ KERR=1
+ WRITE(*,4404) IOS,yname
+ 4404 FORMAT(1H ,'Write error',i4,' on ',a)
+ RETURN
+C
+403 CONTINUE
+ KERR=1
+ WRITE(*,4403) IOS,yname
+4403 FORMAT(1H ,'Open error',i4,' on ',a)
+ RETURN
+C
+C
+402 CONTINUE
+ KERR=1
+ WRITE(*,4402) IOS,yfname
+ 4402 FORMAT(1H ,'Read error',i4,' on ',a)
+ RETURN
+C
+C
+ 401 CONTINUE
+C
+ KERR=1
+ WRITE(*,4401) IOS,yfname
+ 4401 FORMAT(1H ,'Open error',i4,' on ',a)
+C
+ RETURN
+ END
+ SUBROUTINE CTABLE(YNAME,KERR)
+C
+C**** *CTABLE*
+C
+C
+C PURPOSE.
+C --------
+C THE MAIN PURPOSE OF THIS PROGRAMME IS TO CREATE WORKING
+C CODE TABLES FOR *BUFR* DECODING.
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C BINARY UNIVERSAL FORM FOR DATA REPRESENTATION, *FM 94 BUFR*.
+C
+C J.K.GIBSON AND *M.DRAGOSAVAC,1987:* DECODING *DATA *REPRESENTATION
+C *FM 94 BUFR*,*TECHNICAL *MEMORANDUM *NO. 134
+C
+C J.K.GIBSON,1986:*EMOS 2 - *STANDARDS FOR SOFTWARE DEVELOPMENT
+C AND MAINTANANCE *,*TECHICAL MEMORANDUM *NO.
+C *ECMWF*.
+C
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* JANUARY 1991.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2=4096 ,JSEC3= 4,
+ 1 JSEC4=2,JELEM=160000,JSUBS=400,JCVAL=150 ,JBUFL=512000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=3000,JCTST=3000,JCTEXT=6000,
+ 3 JWORK=4096000,JKEY=46)
+
+C
+ CHARACTER*64 CTEXT(JCTEXT)
+ CHARACTER*80 YENTRY
+ CHARACTER*120 YFNAME
+ CHARACTER*(*) YNAME
+C
+ DIMENSION NREF(JCTAB),NSTART(JCTAB),NLEN(JCTAB),NCODNUM(JCTST),
+ 1 NSTARTC(JCTST),NLENC(JCTST)
+C
+C ------------------------------------------------------------------
+C* 1. SET INITIAL CONSTANTS AND POINTERS
+C ----------------------------------
+ 100 CONTINUE
+C
+ J=0
+ iynamep=index(yname,' ')
+ iynamep=iynamep-1
+
+c
+ if(iynamep.eq.14) then
+c
+c Bufr Edition 0,1,2
+c
+ read(yname(9:10),'(i2)') ilocal
+ read(yname(7:8),'(i2)') imaster
+ iedition=2
+ yfname=yname(1:10)//'.buf'
+ elseif(iynamep.eq.15) then
+c
+c Bufr Editin 3
+c
+ read(yname(10:11),'(i2)') ilocal
+ read(yname(8:9),'(i2)') imaster
+ iedition=3
+ yfname=yname(1:11)//'.buf'
+ elseif(iynamep.eq.24) then
+c
+c Bufr Editin 4
+c
+ read(yname(18:20),'(i3)') ilocal
+ read(yname(15:17),'(i3)') imaster
+ read(yname(5:9),'(i5)') isubcentre
+ read(yname(10:14),'(i5)') icentre
+ iedition=4
+ yfname=' '
+ yfname=yname(1:20)//'.buf'
+ else
+ print*,'Wrong table name ---',yname
+ call exit(2)
+ end if
+c
+c
+ JPN4=JP*JPN*4
+C
+ DO 101 I=1,JPN4
+ CTEXT(I)=' '
+ 101 CONTINUE
+C
+ DO 102 I=1,JP
+ NREF(I)=0
+ NSTART(I)=0
+ NLEN(I)=0
+ 102 CONTINUE
+C
+ DO 103 I=1,JP*JPN
+ NCODNUM(I)=0
+ NSTARTC(I)=0
+ NLENC (I)=0
+ 103 CONTINUE
+C
+ OPEN(UNIT=21,FILE=YNAME(1:iynamep),ERR=401,STATUS='OLD')
+C
+C ------------------------------------------------------------------
+C* 2. READ IN CODE TABLE ENTRY
+C ------------------------
+ 200 CONTINUE
+C
+C
+ READ(21,'(A)',ERR=402,END=300) YENTRY
+ print*,YENTRY
+C
+ J = J+1
+C
+ IF(J.GT.JP) THEN
+ PRINT*,' DIMENSION TOO SMALL J=',J
+ CALL EXIT(2)
+ END IF
+C
+C ------------------------------------------------------------------
+C* 2.1 SET ARRAYS FOR CODE TABLE TABLE REFERENCE, STARTING POINTERS
+C FOR LIST OF CODE NUMBERS, LENGTH , LIST OF CODE NUMBERS,
+C STARTING POINTERS AND LENGTH OF TEXT INFORMATION.
+ 210 CONTINUE
+C
+ READ(YENTRY,'(I6,1X,I4,1X,I4,1X,I2)') NREF(J),NLEN(J),NCODE,NLINE
+C
+ IF(J.EQ.1) THEN
+ NSTART (J) = 1
+ NSTARTC(J) = 1
+ IPT = 1
+ IIPT= 1
+ ELSE
+ NSTART(J) = NSTART(J-1) + NLEN(J-1)
+ IPT = NSTART(J)
+ IIPT = IIPT + 1
+ NSTARTC(IPT)= IIPT
+ END IF
+C
+C
+ NCODNUM(IPT)=NCODE
+ NLENC ( IPT)=NLINE
+C
+ CTEXT (IIPT)=YENTRY(21:80)
+C -------------------------------------------------------------------
+ IF(NLENC(IPT).GT.1) THEN
+ DO 220 JA=1,NLENC(IPT)-1
+ READ(21,'(A)',END=300) YENTRY
+ IIPT=IIPT+1
+ CTEXT(IIPT)=YENTRY(21:80)
+ 220 CONTINUE
+ END IF
+C
+ IF(NLEN(J).GT.1) THEN
+ DO 230 JA=1,NLEN(J)-1
+ READ(21,'(A)',END=300) YENTRY
+ print*,YENTRY
+ READ(YENTRY,'(12X,I4,1X,I2)') NCODE,NLINE
+ IPT = IPT + 1
+ IIPT =IIPT + 1
+ NCODNUM(IPT)= NCODE
+ NSTARTC(IPT)= IIPT
+ NLENC (IPT)=NLINE
+ CTEXT(IIPT) = YENTRY(21:80)
+ IF(NLENC(IPT).GT.1) THEN
+ DO 240 JB=1,NLENC(IPT)-1
+ READ(21,'(A)',END=300) YENTRY
+ IIPT=IIPT+1
+ CTEXT(IIPT)=YENTRY(21:80)
+ 240 CONTINUE
+ END IF
+ 230 CONTINUE
+ END IF
+C
+ GO TO 200
+C
+C ------------------------------------------------------------------
+C* 3. WRITE WORKING CODE TABLE INTO FILE.
+C -----------------------------------
+ 300 CONTINUE
+C
+ i=index(yfname,' ')
+ OPEN(UNIT=22,FILE=yfname(1:I-1),ERR=403,
+ 1 FORM='UNFORMATTED',
+ 2 STATUS='NEW')
+c
+ WRITE(22,IOSTAT=IOS,ERR=404) NREF,NSTART,NLEN,NCODNUM,
+ 1 NSTARTC,NLENC,CTEXT
+C
+ CLOSE(21)
+ CLOSE(22)
+C -----------------------------------------------------------------
+C* 3.1 WRITE TABLES ON OUTPUT FILE
+C ---------------------------
+ 310 CONTINUE
+C
+c JEND=J
+c DO 311 J=1,JEND
+C
+c IPT=NSTART(J)
+c IIPT=NSTARTC(IPT)
+c WRITE(*,999) NREF(J),NLEN(J),NCODNUM(IPT),NLENC(IPT),CTEXT(IIPT)
+C
+c IF(NLENC(IPT).GT.1) THEN
+c DO 312 JA=1,NLENC(IPT)-1
+c IIPT = IIPT + 1
+c WRITE(*,998) CTEXT(IIPT)
+c 312 CONTINUE
+c END IF
+C
+c IF(NLEN(J).GT.1) THEN
+c DO 313 JB=1,NLEN(J)-1
+c IPT = IPT + 1
+c IIPT= NSTARTC(IPT)
+c WRITE(*,997) NCODNUM(IPT),NLENC(IPT),CTEXT(IIPT)
+c IF(NLENC(IPT).GT.1) THEN
+c DO 314 JC=1,NLENC(IPT)-1
+c IIPT= IIPT + 1
+c WRITE(*,998) CTEXT(IIPT)
+c 314 CONTINUE
+c END IF
+c 313 CONTINUE
+c END IF
+C
+c 311 CONTINUE
+C
+ write(*,'(1h )')
+ write(*,'(1H ,a,i4)') 'Total number of entries in the Table C is',
+ 1 j
+C
+ RETURN
+C -----------------------------------------------------------------
+ 400 CONTINUE
+C
+ 401 CONTINUE
+C
+ KERR=1
+ WRITE(*,4401) IOS,yfname
+ 4401 FORMAT(1H ,'Open error ',i4,' on ',a)
+ RETURN
+C
+ 402 CONTINUE
+ KERR=1
+ WRITE(*,4402) IOS,yfname
+ 4402 FORMAT(1H ,'Read error ',i4,' on ',a)
+ RETURN
+C
+ 403 CONTINUE
+C
+ KERR=1
+ WRITE(*,4403) IOS,yname
+ 4403 FORMAT(1H ,'Open error ',i4,' on ',a)
+ RETURN
+ 404 CONTINUE
+C
+ KERR=1
+ WRITE(*,4404) IOS,yname
+ 4404 FORMAT(1H ,'Write error ',i4,' on ',a)
+ RETURN
+C
+ 997 FORMAT(1H ,14X,I4,1X,I2,1X,A)
+ 998 FORMAT(1H ,22X,A)
+ 999 FORMAT(1H ,2X,I6,1X,I4,1X,I4,1X,I2,1X,A)
+C
+ END
diff --git a/build_library b/build_library
new file mode 100755
index 0000000..fac0bdb
--- /dev/null
+++ b/build_library
@@ -0,0 +1,266 @@
+#! /bin/sh
+
+set -e
+
+umask 0
+
+# make sure all directories exists.
+for subdirs in gribex gribtables pbio bufrdc bufrtables crexdc crextables interpolation land_sea_mask examples config options
+do
+ if test ! -d $subdirs ; then
+ echo
+ echo "Tarfile is incomplete ; $subdirs does not exist."
+ echo " Incorrect tarfile downloaded?"
+ quit
+ fi
+done
+
+
+# is the uname available ?
+
+type uname > /dev/null 2>&1
+if test $? -ne 0 ; then
+ echo "install: uname not found"
+ echo "You should try compilation without install script"
+ quit
+fi
+target=`uname -s | tr '[A-Z]' '[a-z]'`
+
+gnu=
+
+echo
+
+case $target in
+
+linux )
+ target=linux
+ gnu=yes
+ platform=`uname -m`
+ case $platform in
+ x86_64 )
+ A64=A64
+ CNAME=_x86_64
+ ;;
+ ia64 )
+ gnu=
+ A64=
+ target=itanium
+ ;;
+ * )
+ A64=
+ ;;
+ esac
+ echo "Default compilers are Portland: pgf77 and pgcc."
+ ;;
+darwin* )
+ target=darwin
+ platform=`machine`
+ case $platform in
+ ppc970 )
+ target=ppc
+ A64=_G5
+ ;;
+ ppc* )
+ target=ppc
+ A64=
+ ;;
+ i486 )
+ target=darwin
+ A64=_i486
+ ;;
+ *64 )
+ target=darwin
+ A64=A64
+ ;;
+ * )
+ target=darwin
+ A64=
+ ;;
+ esac
+
+ echo "Default compilers are : gfortran and gcc."
+ ;;
+sunos )
+ target=sun4
+# platform=`uname -m`
+# if test "$platform" = "i86pc" ; then
+# target=i86pc
+# fi
+
+ ;;
+irix* )
+ target=sgimips
+ ;;
+aix )
+ target=rs6000
+ ;;
+osf1 )
+ target=decalpha
+ ;;
+hp-ux )
+ target=hppa
+ platform=`uname -m`
+ if test "$platform" = "ia64" ; then
+ target=hpia64
+ fi
+ ;;
+fujitsu* )
+ target=FUJITSU
+ ;;
+
+ * )
+ echo
+ echo "install: products can only be installed on Linux, Solaris, Sgi"
+ echo "Alpha, HP, IBM operating systems."
+ echo "You should try compilation without install script"
+ quit
+ ;;
+esac
+
+CNAME=
+if test "$gnu" = "yes" ; then
+ echo "Do you want to work with GNU gfortran/gcc (answer y), ifort (answer i) ? [n]"
+ read ans
+ echo
+ if test -n "$ans" ; then
+ if test "$ans" = "y" -o "$ans" = "yes" ; then
+ CNAME=_gfortran
+ fi
+ if test "$ans" = "i" -o "$ans" = "intel" ; then
+ CNAME=_intel
+ fi
+ fi
+fi
+
+if test "$target" = "rs6000" ; then
+ echo "Do you want to force 64 bit addressing mode? (answer y) [n]"
+ read ans
+ echo
+ if test -n "$ans" ; then
+ if test "$ans" = "y" -o "$ans" = "yes" ; then
+ A64=A64
+ fi
+ fi
+fi
+
+
+R64=
+ echo "Default is 32 bit reals."
+ echo "Do you want 64 bit reals ? [y,n]"
+ read ans
+ echo
+if test -n "$ans" ; then
+ if test "$ans" = "y" -o "$ans" = "yes" ; then
+ R64=R64
+ fi
+fi
+
+GRIB_API=
+ echo "Do you want to build with grib_api ? [y,n]"
+ read ans
+ echo
+if test -n "$ans" ; then
+ if test "$ans" = "y" -o "$ans" = "yes" ; then
+ GRIB_API=grib_api_merging
+ echo " Can you specify the directory path for GRIB_API ?"
+ read ans
+ GRIB_API_DIR=$ans
+JASPER_DIR=
+ echo "Do you need jpeg support for grib_api ? [y,n]"
+ read ans
+ echo
+if test -n "$ans" ; then
+ if test "$ans" = "y" -o "$ans" = "yes" ; then
+ echo " Can you specify the directory path for JASPER ?"
+ read ans
+ JASPER_DIR="$ans/libjasper.a"
+ fi
+fi
+fi
+fi
+
+echo $R64 > .r64
+
+cat Makefile.in | sed s:reals:$R64: | sed s:glue:$GRIB_API: > Makefile
+
+for subdirs in gribex pbio bufrdc bufrtables crexdc interpolation fft
+do
+cat $subdirs/Makefile.in | sed s:reals:$R64: | sed s:arch:$target: | sed s:plat:$A64: | sed s:depl:emos: | sed s:comp:$CNAME: > $subdirs/Makefile
+done
+
+for subdirs in examples/gribex examples/bufr examples/crex examples/interpolation examples/fft
+do
+cat $subdirs/Makefile.in | sed s:reals:$R64: | sed s:arch:$target: | sed s:plat:$A64: | sed s:comp:$CNAME: > $subdirs/Makefile
+done
+
+#grib_api
+cat grib_api_merging/Makefile.in | sed s:reals:$R64: | sed s:arch:$target: | sed s:plat:$A64: | sed s:comp:$CNAME: | sed s:depl:emos: | sed s:glue:$GRIB_API_DIR: > grib_api_merging/Makefile
+cat examples/interpolation_grib_api/Makefile.in | sed s:reals:$R64: | sed s:arch:$target: | sed s:plat:$A64: | sed s:comp:$CNAME: | sed s:glue:$GRIB_API_DIR: | sed s:jasp:$JASPER_DIR: > examples/interpolation_grib_api/Makefile
+
+
+INSTALL_DIR=/usr/local/lib
+
+echo
+echo " The default directory for gribtables, bufrtables, crextables,"
+echo "land_sea_mask, gribtemplates and libemos$R64.a will be $INSTALL_DIR,"
+echo " but you may put them anywhere you wish assuming"
+echo "you have permission to do so."
+echo
+echo " You can specify the directory path for GRIB, BUFR, CREX tables"
+echo "local definition templates, land-sea mask, and libemos$R64.a library"
+echo "or just press RETURN if you want default directory."
+echo
+echo "Tables, templates, land-sea mask and libemos$R64.a directory [$INSTALL_DIR]: "
+read ans
+
+if test -n "$ans" ; then
+ INSTALL_DIR=$ans
+fi
+
+echo $INSTALL_DIR > .emos
+
+cat config/config.$target$CNAME$R64$A64.in | sed s:emos:$INSTALL_DIR: > config/config.$target$CNAME$R64$A64
+
+make
+
+chmod a-xw libemos$R64.a
+
+ls bufrtables/*000* > .list/bufrtables
+
+echo "*******************************************************************"
+echo
+echo "Compilation is completed !"
+echo
+echo "*******************************************************************"
+echo
+echo " You can put other options for compilation in"
+echo "config/config.$target$R64 like level of optimisation etc."
+echo "and make compilation again. "
+echo
+echo "When you finish your changes run"
+echo
+echo "make clean"
+echo
+echo "make"
+echo
+echo "in order to produce library "
+echo
+echo "*******************************************************************"
+echo
+echo " Now, if you want to install libemos$R64.a and gribtables, bufrtables, crextables,"
+echo "land_sea_mask it is recomended to do that runing ./install script."
+echo "You must have root permission runinig ./install , if you want"
+echo "to put them on /usr/local/lib "
+echo "Also you can choose your directories."
+echo
+echo "*******************************************************************"
+echo
+echo "Any comments on the document or the software would be appreciated"
+echo
+echo "e-mail software.services at ecmwf.int"
+echo
+echo "*******************************************************************"
+
+exit 0
+
+
diff --git a/config/config.CRAY b/config/config.CRAY
new file mode 100755
index 0000000..b6efceb
--- /dev/null
+++ b/config/config.CRAY
@@ -0,0 +1,18 @@
+#
+# Configuration file for CRAY.
+#
+AR = ar
+ARFLAGS = rv
+#
+CFLAGS = -DPOINTER_64
+FASTCFLAGS = -DPOINTER_64
+#
+FC = f90
+FFLAGS = -DREAL_8 -DINTEGER_8 -DCRAY -DPOINTER_64
+VECTFFLAGS = -DREAL_8 -DINTEGER_8 -DCRAY -DPOINTER_64
+#
+LDFLAGS = -Wl"-L . -l emos -V"
+#
+RANLIB = /bin/true
+CT = /bin/true
+NPROC = 1
diff --git a/config/config.FUJITSU b/config/config.FUJITSU
new file mode 100755
index 0000000..afb74c8
--- /dev/null
+++ b/config/config.FUJITSU
@@ -0,0 +1,25 @@
+#
+# Configuration file for FUJITSU (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PLATFORM_DEFINES_FORTRAN = -Wp,"-DFUJITSU" -Wp,"-D__uxp__"
+PLATFORM_DEFINES_C = -DFUJITSU -D__uxp__
+#
+#
+CC = vcc
+CFLAGS = -K 3 -Wv,-Ps -c -Wv,-m3 $(PLATFORM_DEFINES_C)
+FASTCFLAGS = -O -K3 -Keopt -Kpopt -Wv,-Ps -Wv,-m3 $(PLATFORM_DEFINES_C)
+#
+FC = frt
+VECTFFLAGS = -X9 -Aab -Sw -Wv,-v $(PLATFORM_DEFINES_FORTRAN)
+FFLAGS = -X9 -Aab -Oe,-E,-P,-U -Sw $(PLATFORM_DEFINES_FORTRAN)
+# |
+# v
+# 32-bit reals
+#
+LDFLAGS = -L . -l emos$(R64)
+RANLIB = /bin/true
+CT = /bin/true
+NPROC = 1
diff --git a/config/config.FUJITSU.in b/config/config.FUJITSU.in
new file mode 100755
index 0000000..7ebffbf
--- /dev/null
+++ b/config/config.FUJITSU.in
@@ -0,0 +1,25 @@
+#
+# Configuration file for FUJITSU (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PLATFORM_DEFINES_FORTRAN = -Wp,"-DFUJITSU" -Wp,"-D__uxp__"
+PLATFORM_DEFINES_C = -DFUJITSU -D__uxp__
+#
+#
+CC = vcc
+CFLAGS = -K 3 -Wv,-Ps -c -Wv,-m3 $(PLATFORM_DEFINES_C) -DTABLE_PATH=\"emos\"
+FASTCFLAGS = -O -K3 -Keopt -Kpopt -Wv,-Ps -Wv,-m3 $(PLATFORM_DEFINES_C) -DTABLE_PATH=\"emos\"
+#
+FC = frt
+VECTFFLAGS = -X9 -Aab -Sw -Wv,-v $(PLATFORM_DEFINES_FORTRAN) -DTABLE_PATH=\"emos\"
+FFLAGS = -X9 -Aab -Oe,-E,-P,-U -Sw $(PLATFORM_DEFINES_FORTRAN) -DTABLE_PATH=\"emos\"
+# |
+# v
+# 32-bit reals
+#
+LDFLAGS = -L . -l emos$(R64)
+RANLIB = /bin/true
+CT = /bin/true
+NPROC = 1
diff --git a/config/config.FUJITSUR64 b/config/config.FUJITSUR64
new file mode 100755
index 0000000..768cac6
--- /dev/null
+++ b/config/config.FUJITSUR64
@@ -0,0 +1,24 @@
+#
+# Configuration file for FUJITSU (64-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PLATFORM_DEFINES_FORTRAN = -Wp,"-DFUJITSU" -Wp,"-D__uxp__"
+PLATFORM_DEFINES_C = -DFUJITSU -D__uxp__
+#
+CC = vcc
+CFLAGS = -K 3 -Wv,-Ps -c -Wv,-m3 -DREAL_8 $(PLATFORM_DEFINES_C)
+FASTCFLAGS = -O -K3 -Keopt -Kpopt -Wv,-Ps -Wv,-m3 -DREAL_8 $(PLATFORM_DEFINES_C)
+#
+FC = frt
+VECTFFLAGS = -X9 -Aabd -Sw -Wp,"-DREAL_8" -Wp,"-DREAL_BIGGER_THAN_INTEGER" -Wv,-v $(PLATFORM_DEFINES_FORTRAN)
+FFLAGS = -X9 -Aabd -Oe,-E,-P,-U -Sw -Wp,"-DREAL_8" -Wp,"-DREAL_BIGGER_THAN_INTEGER" $(PLATFORM_DEFINES_FORTRAN)
+# |
+# v
+# 64-bit reals
+#
+LDFLAGS = -L . -l emos$(R64)
+RANLIB = /bin/true
+CT = /bin/true
+NPROC = 1
diff --git a/config/config.FUJITSUR64.in b/config/config.FUJITSUR64.in
new file mode 100755
index 0000000..704f909
--- /dev/null
+++ b/config/config.FUJITSUR64.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for FUJITSU (64-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PLATFORM_DEFINES_FORTRAN = -Wp,"-DFUJITSU" -Wp,"-D__uxp__"
+PLATFORM_DEFINES_C = -DFUJITSU -D__uxp__
+#
+CC = vcc
+CFLAGS = -K 3 -Wv,-Ps -c -Wv,-m3 -DREAL_8 $(PLATFORM_DEFINES_C) -DTABLE_PATH=\"emos\"
+FASTCFLAGS = -O -K3 -Keopt -Kpopt -Wv,-Ps -Wv,-m3 -DREAL_8 $(PLATFORM_DEFINES_C) -DTABLE_PATH=\"emos\"
+#
+FC = frt
+VECTFFLAGS = -X9 -Aabd -Sw -Wp,"-DREAL_8" -Wp,"-DREAL_BIGGER_THAN_INTEGER" -Wv,-v $(PLATFORM_DEFINES_FORTRAN) -DTABLE_PATH=\"emos\"
+FFLAGS = -X9 -Aabd -Oe,-E,-P,-U -Sw -Wp,"-DREAL_8" -Wp,"-DREAL_BIGGER_THAN_INTEGER" $(PLATFORM_DEFINES_FORTRAN) -DTABLE_PATH=\"emos\"
+# |
+# v
+# 64-bit reals
+#
+LDFLAGS = -L . -l emos$(R64)
+RANLIB = /bin/true
+CT = /bin/true
+NPROC = 1
diff --git a/config/config.VPP5000 b/config/config.VPP5000
new file mode 100755
index 0000000..bc4859c
--- /dev/null
+++ b/config/config.VPP5000
@@ -0,0 +1,24 @@
+#
+# Configuration file for FUJITSU (64-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PLATFORM_DEFINES_FORTRAN = -Wp,"-DFUJITSU" -Wp,"-D__uxp__"
+PLATFORM_DEFINES_C = -DFUJITSU -D__uxp__
+#
+CC = cc
+CFLAGS = -K 3 -Wv,-Ps -c -Wv,-m3 -DREAL_8=1 -DPOINTER_64 -DINTEGER_IS_INT $(PLATFORM_DEFINES_C)
+FASTCFLAGS = -O -K3 -Keopt -Kpopt -Wv,-Ps -Wv,-m3 -DREAL_8=1 -DPOINTER_64 -DINTEGER_IS_INT $(PLATFORM_DEFINES_C)
+#
+FC = frt
+VECTFFLAGS = -X9 -Aabd -Sw -Wp,"-DPOINTER_64" -Wp,"-DREAL_8=1" -Wp,"-DINTEGER_IS_INT" -Wp,"-DREAL_BIGGER_THAN_INTEGER" -Wv,-v $(PLATFORM_DEFINES_FORTRAN)
+FFLAGS = -X9 -Aabd -Oe,-E,-P,-U -Sw -Wp,"-DPOINTER_64" -Wp,"-DREAL_8=1" -Wp,"-DINTEGER_IS_INT" -Wp,"-DREAL_BIGGER_THAN_INTEGER" $(PLATFORM_DEFINES_FORTRAN)
+# |
+# v
+# 64-bit reals
+#
+LDFLAGS = -L . -l emos$(R64)
+RANLIB = /bin/true
+CT = /bin/true
+NPROC = 1
diff --git a/config/config.VPP5000R64 b/config/config.VPP5000R64
new file mode 100755
index 0000000..013755a
--- /dev/null
+++ b/config/config.VPP5000R64
@@ -0,0 +1,24 @@
+#
+# Configuration file for VPP5000 (64-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PLATFORM_DEFINES_FORTRAN = -Wp,"-DFUJITSU" -Wp,"-D__uxp__"
+PLATFORM_DEFINES_C = -DFUJITSU -D__uxp__
+#
+CC = cc
+CFLAGS = -K 3 -Wv,-Ps -c -Wv,-m3 -DREAL_8 -DPOINTER_64 -DINTEGER_IS_INT $(PLATFORM_DEFINES_C)
+FASTCFLAGS = -O -K3 -Keopt -Kpopt -Wv,-Ps -Wv,-m3 -DREAL_8 -DPOINTER_64 -DINTEGER_IS_INT $(PLATFORM_DEFINES_C)
+#
+FC = frt
+VECTFFLAGS = -X9 -Aabd -Sw -Wp,"-DPOINTER_64" -Wp,"-DREAL_8" -Wp,"-DINTEGER_IS_INT" -Wp,"-DREAL_BIGGER_THAN_INTEGER" -Wv,-v $(PLATFORM_DEFINES_FORTRAN)
+FFLAGS = -X9 -Aabd -Oe,-E,-P,-U -Sw -Wp,"-DPOINTER_64" -Wp,"-DREAL_8" -Wp,"-DINTEGER_IS_INT" -Wp,"-DREAL_BIGGER_THAN_INTEGER" $(PLATFORM_DEFINES_FORTRAN)
+# |
+# v
+# 64-bit reals
+#
+LDFLAGS = -L . -l emos$(R64)
+RANLIB = /bin/true
+CT = /bin/true
+NPROC = 1
diff --git a/config/config.darwin b/config/config.darwin
new file mode 100755
index 0000000..cf27d3d
--- /dev/null
+++ b/config/config.darwin
@@ -0,0 +1,26 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+CC_A32 =
+USE_NO_POINTERS =
+LARGE_FILE =
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DLITTLE_ENDIAN -DPOINTER_64 -DINTEGER_IS_INT $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fcray-pointer -fno-second-underscore -Dlinux -DINTEGER_IS_INT $(USE_NO_POINTERS) -Dgfortran -DLITTLE_ENDIAN
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.darwin.in b/config/config.darwin.in
new file mode 100755
index 0000000..65eff74
--- /dev/null
+++ b/config/config.darwin.in
@@ -0,0 +1,26 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+CC_A32 =
+USE_NO_POINTERS =
+LARGE_FILE =
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DLITTLE_ENDIAN -DPOINTER_64 -DINTEGER_IS_INT $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fcray-pointer -fno-second-underscore -Dlinux -DINTEGER_IS_INT $(USE_NO_POINTERS) -Dgfortran -DTABLE_PATH=\"emos\" -DLITTLE_ENDIAN
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.darwinA64 b/config/config.darwinA64
new file mode 100755
index 0000000..2f48cbb
--- /dev/null
+++ b/config/config.darwinA64
@@ -0,0 +1,26 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+CC_A32 = -m64
+USE_NO_POINTERS = -DPOINTER_64
+LARGE_FILE =
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DLITTLE_ENDIAN -DPOINTER_64 -DINTEGER_IS_INT $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fcray-pointer -fno-second-underscore -Dlinux -DINTEGER_IS_INT $(USE_NO_POINTERS) -Dgfortran -DTABLE_PATH=\"emos\" -DLITTLE_ENDIAN
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.darwinA64.in b/config/config.darwinA64.in
new file mode 100755
index 0000000..2f48cbb
--- /dev/null
+++ b/config/config.darwinA64.in
@@ -0,0 +1,26 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+CC_A32 = -m64
+USE_NO_POINTERS = -DPOINTER_64
+LARGE_FILE =
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DLITTLE_ENDIAN -DPOINTER_64 -DINTEGER_IS_INT $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fcray-pointer -fno-second-underscore -Dlinux -DINTEGER_IS_INT $(USE_NO_POINTERS) -Dgfortran -DTABLE_PATH=\"emos\" -DLITTLE_ENDIAN
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.darwinR64 b/config/config.darwinR64
new file mode 100755
index 0000000..5721a1d
--- /dev/null
+++ b/config/config.darwinR64
@@ -0,0 +1,26 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+USE_NO_POINTERS =
+LARGE_FILE =
+CC_A32 =
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 -DLITTLE_ENDIAN -DPOINTER_64 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fdefault-real-8 -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT -Dgfortran
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.darwinR64.in b/config/config.darwinR64.in
new file mode 100755
index 0000000..f604c3e
--- /dev/null
+++ b/config/config.darwinR64.in
@@ -0,0 +1,26 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+USE_NO_POINTERS =
+LARGE_FILE =
+CC_A32 =
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 -DLITTLE_ENDIAN -DPOINTER_64 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fdefault-real-8 -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT -Dgfortran -DTABLE_PATH=\"emos\" -DLITTLE_ENDIAN
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.darwinR64A64 b/config/config.darwinR64A64
new file mode 100755
index 0000000..19377c0
--- /dev/null
+++ b/config/config.darwinR64A64
@@ -0,0 +1,26 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+USE_NO_POINTERS = -DPOINTER_64
+LARGE_FILE =
+CC_A32 = -m64
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 -DLITTLE_ENDIAN -DPOINTER_64 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fdefault-real-8 -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT -Dgfortran -DLITTLE_ENDIAN
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.darwinR64A64.in b/config/config.darwinR64A64.in
new file mode 100755
index 0000000..73fccc9
--- /dev/null
+++ b/config/config.darwinR64A64.in
@@ -0,0 +1,26 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+USE_NO_POINTERS = -DPOINTER_64
+LARGE_FILE =
+CC_A32 = -m64
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 -DLITTLE_ENDIAN -DPOINTER_64 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fdefault-real-8 -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT -Dgfortran -DTABLE_PATH=\"emos\" -DLITTLE_ENDIAN
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.darwin_g95A64.in b/config/config.darwin_g95A64.in
new file mode 100755
index 0000000..c8a76dc
--- /dev/null
+++ b/config/config.darwin_g95A64.in
@@ -0,0 +1,25 @@
+#
+# Configuration file for darwin (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG = -g -O2
+#
+LARGE_FILE =
+#
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DINTEGER_IS_INT -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g95
+FFLAGS = $(DEBUG) -DINTEGER_IS_INT -fno-second-underscore -fsloppy-char -Dlinux -DUSE_NO_POINTERS -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.darwin_g95R64A64.in b/config/config.darwin_g95R64A64.in
new file mode 100755
index 0000000..8c906a5
--- /dev/null
+++ b/config/config.darwin_g95R64A64.in
@@ -0,0 +1,25 @@
+#
+# Configuration file for darwin (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE =
+#
+DEBUG = -g -O2
+#
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) -m64 -DREAL_8 -DINTEGER_IS_INT -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(DEBUG)
+#
+FC = g95
+FFLAGS = $(DEBUG) -fno-second-underscore -r8 -i4 -m64 -Dlinux -fsloppy-char -DUSE_NO_POINTERS -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.darwin_g95R64_i486.in b/config/config.darwin_g95R64_i486.in
new file mode 100755
index 0000000..6cadf59
--- /dev/null
+++ b/config/config.darwin_g95R64_i486.in
@@ -0,0 +1,25 @@
+#
+# Configuration file for darwin (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE =
+#
+DEBUG = -g -O2
+#
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DREAL_8 -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) -m32 -mtune=i486
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g95
+FFLAGS = $(DEBUG) -fno-second-underscore -r8 -i4 -m32 -mtune=i486 -fsloppy-char -Dlinux -DUSE_NO_POINTERS -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.darwin_g95_i486.in b/config/config.darwin_g95_i486.in
new file mode 100755
index 0000000..bd594e3
--- /dev/null
+++ b/config/config.darwin_g95_i486.in
@@ -0,0 +1,25 @@
+#
+# Configuration file for darwin (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG = -g -O2
+#
+LARGE_FILE =
+#
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) -m32 -mtune=i486
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g95
+FFLAGS = $(DEBUG) -fno-second-underscore -m32 -mtune=i486 -fsloppy-char -Dlinux -DUSE_NO_POINTERS -fzeros -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.darwin_gfortranR64_i486.in b/config/config.darwin_gfortranR64_i486.in
new file mode 100755
index 0000000..670e11a
--- /dev/null
+++ b/config/config.darwin_gfortranR64_i486.in
@@ -0,0 +1,27 @@
+#
+# Configuration file for darwin (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+USE_NO_POINTERS =
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+CC_A32 = -m32 -mtune=i486
+#
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 -DLITTLE_ENDIAN $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fdefault-real-8 -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -Dgfortran -DTABLE_PATH=\"emos\" -DLITTLE_ENDIAN
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.darwin_gfortran_i486.in b/config/config.darwin_gfortran_i486.in
new file mode 100755
index 0000000..588678b
--- /dev/null
+++ b/config/config.darwin_gfortran_i486.in
@@ -0,0 +1,28 @@
+#
+# Configuration file for darwin (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+CC_A32 = -m32 -mtune=i486
+USE_NO_POINTERS =
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+#
+#
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DLITTLE_ENDIAN $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -Dgfortran -DTABLE_PATH=\"emos\" -DLITTLE_ENDIAN
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.decalpha b/config/config.decalpha
new file mode 100755
index 0000000..7f2b212
--- /dev/null
+++ b/config/config.decalpha
@@ -0,0 +1,14 @@
+#
+# configuration file for ALPHA/osf
+#
+CC = cxx
+CFLAGS = -O2 -DINTEGER_IS_INT -DPOINTER_64 -D__alpha -DLITTLE_ENDIAN
+FASTCFLAGS = -O2 -DINTEGER_IS_INT -DPOINTER_64 -D__alpha -DLITTLE_ENDIAN
+FC = f90
+FFLAGS = -convert big_endian -O2 -align commons -DINTEGER_IS_INT -DPOINTER_64 -D__alpha -DLITTLE_ENDIAN
+VECTFFLAGS= -convert big_endian -O2 -align commons -DINTEGER_IS_INT -DPOINTER_64 -D__alpha -DLITTLE_ENDIAN
+ARFLAGS = rlv
+
+RANLIB = /usr/bin/ranlib -t
+
+CT = /bin/true
diff --git a/config/config.decalpha.in b/config/config.decalpha.in
new file mode 100755
index 0000000..22f7457
--- /dev/null
+++ b/config/config.decalpha.in
@@ -0,0 +1,14 @@
+#
+# configuration file for ALPHA/osf
+#
+CC = cxx
+CFLAGS = -O2 -DINTEGER_IS_INT -DPOINTER_64 -D__alpha -DLITTLE_ENDIAN -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+FC = f90
+FFLAGS = -convert big_endian -O2 -align commons -DINTEGER_IS_INT -DPOINTER_64 -D__alpha -DLITTLE_ENDIAN -DTABLE_PATH=\"emos\"
+VECTFFLAGS= $(FFLAGS)
+ARFLAGS = rlv
+
+RANLIB = /usr/bin/ranlib -t
+
+CT = /bin/true
diff --git a/config/config.decalphaR64 b/config/config.decalphaR64
new file mode 100755
index 0000000..a9b3696
--- /dev/null
+++ b/config/config.decalphaR64
@@ -0,0 +1,14 @@
+#
+# Configuration file for ALPHA, 64-bit reals
+#
+CC = cxx
+CFLAGS = -DREAL_8 -O2 -DINTEGER_IS_INT -DPOINTER_64 -D__alpha -DLITTLE_ENDIAN
+FASTCFLAGS = $(CFLAGS)
+FC = f90
+FFLAGS = -convert big_endian -O2 -align dcommons -real_size 64 -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT -DPOINTER_64 -D__alpha -DLITTLE_ENDIAN
+VECTFFLAGS= $(FFLAGS)
+#
+ARFLAGS = rlv
+RANLIB = /usr/bin/ranlib -t
+
+CT = /bin/true
diff --git a/config/config.decalphaR64.in b/config/config.decalphaR64.in
new file mode 100755
index 0000000..ce8a5de
--- /dev/null
+++ b/config/config.decalphaR64.in
@@ -0,0 +1,14 @@
+#
+# Configuration file for ALPHA, 64-bit reals
+#
+CC = cxx
+CFLAGS = -DREAL_8 -O2 -DINTEGER_IS_INT -DPOINTER_64 -D__alpha -DLITTLE_ENDIAN -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+FC = f90
+FFLAGS = -convert big_endian -O2 -align dcommons -real_size 64 -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT -DPOINTER_64 -D__alpha -DLITTLE_ENDIAN -DTABLE_PATH=\"emos\"
+VECTFFLAGS= $(FFLAGS)
+#
+ARFLAGS = rlv
+RANLIB = /usr/bin/ranlib -t
+
+CT = /bin/true
diff --git a/config/config.decmips b/config/config.decmips
new file mode 100755
index 0000000..8589431
--- /dev/null
+++ b/config/config.decmips
@@ -0,0 +1,13 @@
+#
+# configuration file for ALPHA/osf
+#
+CC = cxx
+CFLAGS = -g
+FASTCFLAGS =
+FC = f77
+FFLAGS = -convert big_endian -g
+VECTFFLAGS= -convert big_endian -g
+#
+ARFLAGS = rlv
+RANLIB = /usr/bin/ranlib
+CT = /bin/true
diff --git a/config/config.hp b/config/config.hp
new file mode 100755
index 0000000..559c5f7
--- /dev/null
+++ b/config/config.hp
@@ -0,0 +1,16 @@
+#
+# configuration file for hp
+#
+CC = cc
+CFLAGS = -Aa -D_INCLUDE_HPUX_SOURCE -D_INCLUDE_XOPEN_SOURCE -D_INCLUDE_AES_SOURCE -D_INCLUDE_POSIX_SOURCE -D_XPG2 -Dhp
+FASTCFLAGS = -O -Aa -D_INCLUDE_HPUX_SOURCE -D_INCLUDE_XOPEN_SOURCE -D_INCLUDE_AES_SOURCE -D_INCLUDE_POSIX_SOURCE -D_XPG2 -Dhp
+#
+FC = f77
+FFLAGS = +ppu -Dhp
+VECTFFLAGS = +ppu -Dhp
+#
+RANLIB = /bin/true
+CT = /bin/true
+
+
+
diff --git a/config/config.hpia64 b/config/config.hpia64
new file mode 100755
index 0000000..2e9ac9a
--- /dev/null
+++ b/config/config.hpia64
@@ -0,0 +1,24 @@
+#
+# Configuration file for hpia (32-bit reals, 32-bit integers).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG = +O0
+#
+CPPFLAGS= -Dhp -DPOINTER_64 -DhpiaR32
+#
+CC = cc
+CFLAGS = +DD32 -Ae -D_XPG2 -Dhp -DPOINTER_64 +z -O
+
+FASTCFLAGS= $(CFLAGS)
+#
+FC = /opt/fortran90/bin/f90
+FFLAGS = +DD32 -g $(DEBUG) +pic=short
+
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+LDFLAGS = -Wl,-B,immediate,-B,nonfatal,+s +s -L . -l emos
+RANLIB = /usr/bin/ranlib
+CT = /bin/true
diff --git a/config/config.hpia64.in b/config/config.hpia64.in
new file mode 100755
index 0000000..e84ea4b
--- /dev/null
+++ b/config/config.hpia64.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for hpia (32-bit reals, 32-bit integers).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG = +O0
+#
+CPPFLAGS= -Dhp -DPOINTER_64 -DhpiaR32
+#
+CC = cc
+CFLAGS = +DD32 -Ae -D_XPG2 -Dhp -DPOINTER_64 +z -O -DTABLE_PATH=\"emos\"
+
+FASTCFLAGS= $(CFLAGS)
+#
+FC = /opt/fortran90/bin/f90
+FFLAGS = +DD32 -g $(DEBUG) +pic=short -DTABLE_PATH=\"emos\"
+
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+LDFLAGS = -Wl,-B,immediate,-B,nonfatal,+s +s -L . -l emos
+RANLIB = /usr/bin/ranlib
+CT = /bin/true
diff --git a/config/config.hpia64R64 b/config/config.hpia64R64
new file mode 100755
index 0000000..1dd06ca
--- /dev/null
+++ b/config/config.hpia64R64
@@ -0,0 +1,22 @@
+#
+# Configuration file for hpia (64-bit reals, 64-bit integers).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG = +O0
+#
+CPPFLAGS= -Dhp -DhpiaR64 -DREAL_8 -DINTEGER_8 -DJBPW_64 -DPOINTER_64
+#
+CC = cc
+CFLAGS = +DD64 -Ae -D_XPG2 -Dhp -DhpiaR64 -DREAL_8 -DINTEGER_8 -DPOINTER_64 +Z -O
+FASTCFLAGS= $(CFLAGS)
+#
+FC = /opt/fortran90/bin/f90
+FFLAGS = +DD64 +autodbl $(DEBUG) +pic=long +real_constant=double
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+LDFLAGS = -Wl,-B,immediate,-B,nonfatal,+s +s -L . -l emos
+RANLIB = /usr/bin/ranlib
+CT = /bin/true
diff --git a/config/config.hpia64R64.in b/config/config.hpia64R64.in
new file mode 100755
index 0000000..91aacbe
--- /dev/null
+++ b/config/config.hpia64R64.in
@@ -0,0 +1,22 @@
+#
+# Configuration file for hpia (64-bit reals, 64-bit integers).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG = +O0
+#
+CPPFLAGS= -Dhp -DhpiaR64 -DREAL_8 -DINTEGER_8 -DJBPW_64 -DPOINTER_64
+#
+CC = cc
+CFLAGS = +DD64 -Ae -D_XPG2 -Dhp -DhpiaR64 -DREAL_8 -DINTEGER_8 -DPOINTER_64 +Z -O -DTABLE_PATH=\"emos\"
+FASTCFLAGS= $(CFLAGS)
+#
+FC = /opt/fortran90/bin/f90
+FFLAGS = +DD64 +autodbl $(DEBUG) +pic=long +real_constant=double -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+LDFLAGS = -Wl,-B,immediate,-B,nonfatal,+s +s -L . -l emos
+RANLIB = /usr/bin/ranlib
+CT = /bin/true
diff --git a/config/config.hppa b/config/config.hppa
new file mode 100755
index 0000000..e85b503
--- /dev/null
+++ b/config/config.hppa
@@ -0,0 +1,28 @@
+#
+# Configuration file for hp.
+#
+AR = ar
+ARFLAGS = rv
+#
+CPPFLAGS = -Dhp
+#
+CC = cc
+CFLAGS = -Aa +e -D_INCLUDE_HPUX_SOURCE -D_INCLUDE_XOPEN_SOURCE \
+-D_INCLUDE_AES_SOURCE -D_INCLUDE_POSIX_SOURCE -D_XPG2 \
+-DFORTRAN_NO_UNDERSCORE -Dhp +z +O1 +DA2.0
+
+FASTCFLAGS = -Aa +e -D_INCLUDE_HPUX_SOURCE -D_INCLUDE_XOPEN_SOURCE \
+-D_INCLUDE_AES_SOURCE -D_INCLUDE_POSIX_SOURCE -D_XPG2 \
+-DFORTRAN_NO_UNDERSCORE -Dhp +z +O1 +DA2.0
+
+FC = f90
+FFLAGS = +z +U77 +O2 -Dhp +FPD +DA2.0
+
+VECTFFLAGS = +z +U77 +O2 -Dhp +FPD +DA2.0
+NOOPTFFLAGS = +z +U77 -Dhp +FPD +DA2.0
+#
+LDFLAGS = -Wl,-B,immediate,-B,nonfatal,+s
+RANLIB = /usr/bin/ranlib
+CT = /bin/true
+
+
diff --git a/config/config.hppa.in b/config/config.hppa.in
new file mode 100755
index 0000000..834b30d
--- /dev/null
+++ b/config/config.hppa.in
@@ -0,0 +1,28 @@
+#
+# Configuration file for hp.
+#
+AR = ar
+ARFLAGS = rv
+#
+CPPFLAGS = -Dhp
+#
+CC = cc
+CFLAGS = -Aa +e -D_INCLUDE_HPUX_SOURCE -D_INCLUDE_XOPEN_SOURCE \
+-D_INCLUDE_AES_SOURCE -D_INCLUDE_POSIX_SOURCE -D_XPG2 \
+-DFORTRAN_NO_UNDERSCORE -Dhp +z +O1 +DA2.0 -DTABLE_PATH=\"emos\"
+
+FASTCFLAGS = -Aa +e -D_INCLUDE_HPUX_SOURCE -D_INCLUDE_XOPEN_SOURCE \
+-D_INCLUDE_AES_SOURCE -D_INCLUDE_POSIX_SOURCE -D_XPG2 \
+-DFORTRAN_NO_UNDERSCORE -Dhp +z +O1 +DA2.0 -DTABLE_PATH=\"emos\"
+
+FC = f90
+FFLAGS = +z +U77 +O2 -Dhp +FPD +DA2.0 -DTABLE_PATH=\"emos\"
+
+VECTFFLAGS = +z +U77 +O2 -Dhp +FPD +DA2.0 -DTABLE_PATH=\"emos\"
+NOOPTFFLAGS = +z +U77 -Dhp +FPD +DA2.0 -DTABLE_PATH=\"emos\"
+#
+LDFLAGS = -Wl,-B,immediate,-B,nonfatal,+s
+RANLIB = /usr/bin/ranlib
+CT = /bin/true
+
+
diff --git a/config/config.hppaR64 b/config/config.hppaR64
new file mode 100755
index 0000000..937bca2
--- /dev/null
+++ b/config/config.hppaR64
@@ -0,0 +1,25 @@
+#
+# Configuration file for hp (64-bit reals, 64-bit integers).
+#
+AR = ar
+ARFLAGS = rv
+#
+CPPFLAGS= -Dhp -DhpR64 -DREAL_8 -DINTEGER_8 -DJBPW_64 -DPOINTER_64
+#
+CC = cc
+CFLAGS = -Ae +e -D_INCLUDE_HPUX_SOURCE -D_INCLUDE_XOPEN_SOURCE \
+-D_INCLUDE_AES_SOURCE -D_INCLUDE_POSIX_SOURCE -D_XPG2 \
+-DFORTRAN_NO_UNDERSCORE -Dhp -DhpR64 -DREAL_8 -DINTEGER_8 -DPOINTER_64 +z +O1 +DA2.0
+FASTCFLAGS= -Ae +e -D_INCLUDE_HPUX_SOURCE -D_INCLUDE_XOPEN_SOURCE \
+-D_INCLUDE_AES_SOURCE -D_INCLUDE_POSIX_SOURCE -D_XPG2 \
+-DFORTRAN_NO_UNDERSCORE -Dhp -DhpR64 -DREAL_8 -DINTEGER_8 -DPOINTER_64 +z +O1 +DA2.0
+#
+FC = f90
+FFLAGS = +z +U77 +autodbl +O2 -Dhp +FPD +DA2.0 +pic=long +real_constant=double
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+# LDFLAGS = -Wl,-B,immediate,-B,nonfatal,+s +s -L . -l emos
+LDFLAGS = -Wl,-B,immediate,-B,nonfatal,+s +s
+RANLIB = /usr/bin/ranlib
+CT = /bin/true
diff --git a/config/config.hppaR64.in b/config/config.hppaR64.in
new file mode 100755
index 0000000..5d1b673
--- /dev/null
+++ b/config/config.hppaR64.in
@@ -0,0 +1,25 @@
+#
+# Configuration file for hp (64-bit reals, 64-bit integers).
+#
+AR = ar
+ARFLAGS = rv
+#
+CPPFLAGS= -Dhp -DhpR64 -DREAL_8 -DINTEGER_8 -DJBPW_64 -DPOINTER_64
+#
+CC = cc
+CFLAGS = -Ae +e -D_INCLUDE_HPUX_SOURCE -D_INCLUDE_XOPEN_SOURCE \
+-D_INCLUDE_AES_SOURCE -D_INCLUDE_POSIX_SOURCE -D_XPG2 \
+-DFORTRAN_NO_UNDERSCORE -Dhp -DhpR64 -DREAL_8 -DINTEGER_8 -DPOINTER_64 +z +O1 +DA2.0
+FASTCFLAGS= -Ae +e -D_INCLUDE_HPUX_SOURCE -D_INCLUDE_XOPEN_SOURCE \
+-D_INCLUDE_AES_SOURCE -D_INCLUDE_POSIX_SOURCE -D_XPG2 \
+-DFORTRAN_NO_UNDERSCORE -Dhp -DhpR64 -DREAL_8 -DINTEGER_8 -DPOINTER_64 +z +O1 +DA2.0 -DTABLE_PATH=\"emos\"
+#
+FC = f90
+FFLAGS = +z +U77 +autodbl +O2 -Dhp +FPD +DA2.0 +pic=long +real_constant=double -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+# LDFLAGS = -Wl,-B,immediate,-B,nonfatal,+s +s -L . -l emos
+LDFLAGS = -Wl,-B,immediate,-B,nonfatal,+s +s
+RANLIB = /usr/bin/ranlib
+CT = /bin/true
diff --git a/config/config.i686R64 b/config/config.i686R64
new file mode 100755
index 0000000..dc1614b
--- /dev/null
+++ b/config/config.i686R64
@@ -0,0 +1,21 @@
+#
+# Configuration file for i686 (64-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+CC = cc
+CFLAGS = -g -DREAL_8
+FASTCFLAGS = -g -DREAL_8
+#
+FC = f90
+VECTFFLAGS = -Ad -Wp,"-Dlinux" -Wp,"-DREAL_8" -Wp,"-DREAL_BIGGER_THAN_INTEGER" -Wv,-v
+FFLAGS = -Ad -Wp,"-Dlinux" -Wp,"-DREAL_8" -Wp,"-DREAL_BIGGER_THAN_INTEGER"
+# |
+# v
+# 64-bit reals
+#
+LDFLAGS = -L . -l emos$(R64)
+RANLIB = /bin/true
+CT = /bin/true
+NPROC = 1
diff --git a/config/config.i86pc b/config/config.i86pc
new file mode 100755
index 0000000..2f987fe
--- /dev/null
+++ b/config/config.i86pc
@@ -0,0 +1,16 @@
+#
+# Configuration file for sun4.
+#
+AR = ar
+ARFLAGS = rv
+#
+CC = /opt/SUNWspro/bin/cc
+CFLAGS = -xO0
+FASTCFLAGS = $(CFLAGS)
+#
+FC = /opt/SUNWspro/bin/f90
+FFLAGS = -ftrap=invalid,overflow,no%underflow,division
+VECTFFLAGS = $(FFLAGS)
+#
+RANLIB = /usr/bin/ranlib
+CT = /bin/true
diff --git a/config/config.i86pc.in b/config/config.i86pc.in
new file mode 100755
index 0000000..6040a8d
--- /dev/null
+++ b/config/config.i86pc.in
@@ -0,0 +1,16 @@
+#
+# Configuration file for sun4.
+#
+AR = ar
+ARFLAGS = rv
+#
+CC = /opt/SUNWspro/bin/cc
+CFLAGS = -xO0
+FASTCFLAGS = $(CFLAGS) -DTABLE_PATH=\"emos\"
+#
+FC = /opt/SUNWspro/bin/f90
+FFLAGS = -ftrap=invalid,overflow,no%underflow,division -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+#
+RANLIB = /usr/bin/ranlib
+CT = /bin/true
diff --git a/config/config.i86pcR64 b/config/config.i86pcR64
new file mode 100755
index 0000000..30f206e
--- /dev/null
+++ b/config/config.i86pcR64
@@ -0,0 +1,16 @@
+#
+# Configuration file for sun4.
+#
+AR = ar
+ARFLAGS = rv
+#
+CC = /opt/SUNWspro/bin/cc
+CFLAGS = -xO0 -DREAL_8
+FASTCFLAGS = $(CFLAGS)
+#
+FC = /opt/SUNWspro/bin/f90
+FFLAGS = -ftrap=invalid,overflow,no%underflow,division -DREAL_8 -DR64 -DREAL_BIGGER_THAN_INTEGER
+VECTFFLAGS = $(FFLAGS)
+#
+RANLIB = /usr/bin/ranlib
+CT = /bin/true
diff --git a/config/config.i86pcR64.in b/config/config.i86pcR64.in
new file mode 100755
index 0000000..e9ed028
--- /dev/null
+++ b/config/config.i86pcR64.in
@@ -0,0 +1,16 @@
+#
+# Configuration file for sun4.
+#
+AR = ar
+ARFLAGS = rv
+#
+CC = /opt/SUNWspro/bin/cc
+CFLAGS = -xO0 -DREAL_8 -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = /opt/SUNWspro/bin/f90
+FFLAGS = -ftrap=invalid,overflow,no%underflow,division -DREAL_8 -DR64 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+#
+RANLIB = /usr/bin/ranlib
+CT = /bin/true
diff --git a/config/config.ibm_power4 b/config/config.ibm_power4
new file mode 100755
index 0000000..7792487
--- /dev/null
+++ b/config/config.ibm_power4
@@ -0,0 +1,25 @@
+#
+# Configuration file for rs6000 (32-bit REALs).
+#
+AR = ar
+ARFLAGS = -r -v -X64
+OLI=-qwarn64
+PROFILE=
+DEBUG=-O3
+#
+CC = xlc_r
+
+
+CFLAGS = $(DEBUG) $(PROFILE) -qstrict -q64 $(OLI) -qarch=auto -qtune=auto -DIBM -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64
+
+FASTCFLAGS = $(DEBUG) $(PROFILE) -qstrict -q64 $(OLI) -qarch=auto -qtune=auto -DIBM -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64
+#
+FC = xlf90_r
+CPPFLAGS=-DIBM,-Drs6000,-DPOINTER_64,-DINTEGER_IS_INT,-DIBM_POWER4,-DSHAREDMEMORY,-DFOPEN64
+
+FFLAGS = -qsigtrap $(DEBUG) $(PROFILE) -qstrict -q64 -qextname -qarch=auto -qtune=auto -qwarn64 -qrealsize=4 -qintsize=4 -qalign=4k -qnosource -qflttrap=overflow:zerodivide:invalid:enable:imprecise -qfixed=72 -qintlog
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.ibm_power4.in b/config/config.ibm_power4.in
new file mode 100755
index 0000000..56ea952
--- /dev/null
+++ b/config/config.ibm_power4.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for rs6000 (32-bit REALs).
+#
+AR = ar
+ARFLAGS = -r -v -X64
+OLI=-qwarn64
+#
+CC = xlc_r
+DEBUG=-O3
+
+
+CFLAGS = $(DEBUG) -qstrict -q64 $(OLI) -qarch=auto -qtune=auto -DIBM -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64 -WF,-DTABLE_PATH=\"emos\"
+
+FASTCFLAGS = $(DEBUG)-qstrict -q64 $(OLI) -qarch=auto -qtune=auto -DIBM -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64 -WF,-DTABLE_PATH=\"emos\"
+#
+FC = xlf90_r
+CPPFLAGS=-DIBM,-Drs6000,-DPOINTER_64,-DINTEGER_IS_INT,-DIBM_POWER4,-DSHAREDMEMORY,-DFOPEN64
+
+FFLAGS = -qsigtrap $(DEBUG) -qstrict -q64 -qextname -qarch=auto -qtune=auto -qwarn64 -qrealsize=4 -qintsize=4 -qalign=4k -qnosource -qflttrap=overflow:zerodivide:invalid:enable:imprecise -qfixed=72 -qintlog -WF,-DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.ibm_power4R64 b/config/config.ibm_power4R64
new file mode 100755
index 0000000..5086a56
--- /dev/null
+++ b/config/config.ibm_power4R64
@@ -0,0 +1,24 @@
+#
+# Configuration file for rs6000 (64-bit REALs).
+#
+AR = ar
+ARFLAGS = -r -v -X64
+OLI=-qwarn64
+#
+CC = xlc_r
+PROFILE=
+DEBUG=-O3
+#
+CFLAGS = $(DEBUG) -qstrict -q64 $(OLI) -qarch=auto -qtune=auto -DREAL_BIGGER_THAN_INTEGER -DREAL_8 -DIBM -DIBM_POWER4 -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64
+
+FASTCFLAGS = $(DEBUG) -qstrict -qinline -q64 $(OLI) -qarch=auto -qtune=auto -DREAL_BIGGER_THAN_INTEGER -DREAL_8 -DIBM -DIBM_POWER4 -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64
+#
+FC = xlf90_r
+CPPFLAGS=-DREAL_BIGGER_THAN_INTEGER,-DREAL_8,-DIBM,-Drs6000,-DPOINTER_64,-DINTEGER_IS_INT,-DIBM_POWER4,-DSHAREDMEMORY,-DFOPEN64
+
+FFLAGS = -qsigtrap $(DEBUG) -qstrict -q64 -qextname -qarch=auto -qtune=auto -qwarn64 -qrealsize=8 -qintsize=4 -qalign=4k -qsource -qflttrap=overflow:zerodivide:invalid:enable:imprecise -qfixed=72 -qintlog
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.ibm_power4R64.in b/config/config.ibm_power4R64.in
new file mode 100755
index 0000000..8972fd4
--- /dev/null
+++ b/config/config.ibm_power4R64.in
@@ -0,0 +1,23 @@
+#
+# Configuration file for rs6000 (64-bit REALs).
+#
+AR = ar
+ARFLAGS = -r -v -X64
+OLI=-qwarn64
+#
+CC = xlc_r
+DEBUG=-O3
+#
+CFLAGS = $(DEBUG) -qstrict -q64 $(OLI) -qarch=auto -qtune=auto -DREAL_BIGGER_THAN_INTEGER -DREAL_8 -DIBM -DIBM_POWER4 -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64 -WF,-DTABLE_PATH=\"emos\"
+
+FASTCFLAGS = $(DEBUG) -qstrict -qinline -q64 $(OLI) -qarch=auto -qtune=auto -DREAL_BIGGER_THAN_INTEGER -DREAL_8 -DIBM -DIBM_POWER4 -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64 -WF,-DTABLE_PATH=\"emos\"
+#
+FC = xlf90_r
+CPPFLAGS=-DREAL_BIGGER_THAN_INTEGER,-DREAL_8,-DIBM,-Drs6000,-DPOINTER_64,-DINTEGER_IS_INT,-DIBM_POWER4,-DSHAREDMEMORY,-DFOPEN64
+
+FFLAGS = -qsigtrap $(DEBUG) -qstrict -q64 -qextname -qarch=auto -qtune=auto -qwarn64 -qrealsize=8 -qintsize=4 -qalign=4k -qsource -qflttrap=overflow:zerodivide:invalid:enable:imprecise -qfixed=72 -qintlog -WF,-DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.ibm_power6 b/config/config.ibm_power6
new file mode 100755
index 0000000..31f1265
--- /dev/null
+++ b/config/config.ibm_power6
@@ -0,0 +1,25 @@
+#
+# Configuration file for rs6000 (32-bit REALs).
+#
+AR = ar
+ARFLAGS = -r -v -X64
+OLI=-qwarn64
+PROFILE=
+DEBUG=-O3
+#
+CC = xlc_r
+
+
+CFLAGS = $(DEBUG) $(PROFILE) -qstrict -q64 $(OLI) -qarch=auto -qtune=auto -DIBM -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64
+
+FASTCFLAGS = $(DEBUG) $(PROFILE) -qstrict -q64 $(OLI) -qarch=auto -qtune=auto -DIBM -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64
+#
+FC = xlf90_r
+CPPFLAGS=-DIBM,-Drs6000,-DPOINTER_64,-DINTEGER_IS_INT,-DIBM_POWER4,-DSHAREDMEMORY,-DFOPEN64
+
+FFLAGS = -qsigtrap $(DEBUG) $(PROFILE) -qstrict -q64 -qextname -qarch=auto -qtune=auto -qwarn64 -qrealsize=4 -qintsize=4 -qalign=4k -qnosource -qfixed=72 -qintlog
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.ibm_power6.in b/config/config.ibm_power6.in
new file mode 100755
index 0000000..043458b
--- /dev/null
+++ b/config/config.ibm_power6.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for rs6000 (32-bit REALs).
+#
+AR = ar
+ARFLAGS = -r -v -X64
+OLI=-qwarn64
+#
+CC = xlc_r
+DEBUG=-O3
+
+
+CFLAGS = $(DEBUG) -qstrict -q64 $(OLI) -qarch=auto -qtune=auto -DIBM -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64 -WF,-DTABLE_PATH=\"emos\"
+
+FASTCFLAGS = $(DEBUG)-qstrict -q64 $(OLI) -qarch=auto -qtune=auto -DIBM -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64 -WF,-DTABLE_PATH=\"emos\"
+#
+FC = xlf90_r
+CPPFLAGS=-DIBM,-Drs6000,-DPOINTER_64,-DINTEGER_IS_INT,-DIBM_POWER4,-DSHAREDMEMORY,-DFOPEN64
+
+FFLAGS = -qsigtrap $(DEBUG)-qstrict -q64 -qextname -qarch=auto -qtune=auto -qwarn64 -qrealsize=4 -qintsize=4 -qalign=4k -qnosource -qfixed=72 -qintlog -WF,-DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.ibm_power6R64 b/config/config.ibm_power6R64
new file mode 100755
index 0000000..02e192e
--- /dev/null
+++ b/config/config.ibm_power6R64
@@ -0,0 +1,27 @@
+#
+# Configuration file for ibm_power6 (64-bit REALs).
+#
+AR = ar
+ARFLAGS = -r -v -X64
+OLI=-qwarn64
+#
+CC = xlc_r
+PROFILE=
+DEBUG=-O3
+
+
+
+CFLAGS = $(DEBUG) -qstrict -q64 $(OLI) -qarch=auto -qtune=auto -DREAL_BIGGER_THAN_INTEGER -DREAL_8 -DIBM -DIBM_POWER4 -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64
+
+FASTCFLAGS = $(DEBUG) -qstrict -qinline -q64 $(OLI) -qarch=auto -qtune=auto -DREAL_BIGGER_THAN_INTEGER -DREAL_8 -DIBM -DIBM_POWER4 -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64
+#
+FC = xlf90_r
+CPPFLAGS=-DREAL_BIGGER_THAN_INTEGER,-DREAL_8,-DIBM,-Drs6000,-DPOINTER_64,-DINTEGER_IS_INT,-DIBM_POWER4,-DSHAREDMEMORY,-DFOPEN64
+
+FFLAGS = -qsigtrap $(DEBUG) -qstrict -q64 -qarch=auto -qtune=auto -qwarn64 -qrealsize=8 -qintsize=4 -qalign=4k -qsource -qfixed=72 -qintlog
+
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.ibm_power6R64.in b/config/config.ibm_power6R64.in
new file mode 100755
index 0000000..7f345db
--- /dev/null
+++ b/config/config.ibm_power6R64.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for ibm_power6 (64-bit REALs).
+#
+AR = ar
+ARFLAGS = -r -v -X64
+OLI=-qwarn64
+#
+CC = xlc_r
+DEBUG=-O3
+
+
+CFLAGS = $(DEBUG) -qstrict -q64 $(OLI) -qarch=auto -qtune=auto -DREAL_BIGGER_THAN_INTEGER -DREAL_8 -DIBM -DIBM_POWER4 -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64 -WF,-DTABLE_PATH=\"emos\"
+
+FASTCFLAGS = -g -O3 -qstrict -qinline -q64 $(OLI) -qarch=auto -qtune=auto -DREAL_BIGGER_THAN_INTEGER -DREAL_8 -DIBM -DIBM_POWER4 -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64 -WF,-DTABLE_PATH=\"emos\"
+#
+FC = xlf90_r
+CPPFLAGS=-DREAL_BIGGER_THAN_INTEGER,-DREAL_8,-DIBM,-Drs6000,-DPOINTER_64,-DINTEGER_IS_INT,-DIBM_POWER4,-DSHAREDMEMORY,-DFOPEN64
+
+FFLAGS = -qsigtrap $(DEBUG) -qstrict -q64 -qarch=auto -qtune=auto -qwarn64 -qrealsize=8 -qintsize=4 -qalign=4k -qsource -qfixed=72 -qintlog -WF,-DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.ibm_power7 b/config/config.ibm_power7
new file mode 100755
index 0000000..31f1265
--- /dev/null
+++ b/config/config.ibm_power7
@@ -0,0 +1,25 @@
+#
+# Configuration file for rs6000 (32-bit REALs).
+#
+AR = ar
+ARFLAGS = -r -v -X64
+OLI=-qwarn64
+PROFILE=
+DEBUG=-O3
+#
+CC = xlc_r
+
+
+CFLAGS = $(DEBUG) $(PROFILE) -qstrict -q64 $(OLI) -qarch=auto -qtune=auto -DIBM -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64
+
+FASTCFLAGS = $(DEBUG) $(PROFILE) -qstrict -q64 $(OLI) -qarch=auto -qtune=auto -DIBM -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64
+#
+FC = xlf90_r
+CPPFLAGS=-DIBM,-Drs6000,-DPOINTER_64,-DINTEGER_IS_INT,-DIBM_POWER4,-DSHAREDMEMORY,-DFOPEN64
+
+FFLAGS = -qsigtrap $(DEBUG) $(PROFILE) -qstrict -q64 -qextname -qarch=auto -qtune=auto -qwarn64 -qrealsize=4 -qintsize=4 -qalign=4k -qnosource -qfixed=72 -qintlog
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.ibm_power7.in b/config/config.ibm_power7.in
new file mode 100755
index 0000000..043458b
--- /dev/null
+++ b/config/config.ibm_power7.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for rs6000 (32-bit REALs).
+#
+AR = ar
+ARFLAGS = -r -v -X64
+OLI=-qwarn64
+#
+CC = xlc_r
+DEBUG=-O3
+
+
+CFLAGS = $(DEBUG) -qstrict -q64 $(OLI) -qarch=auto -qtune=auto -DIBM -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64 -WF,-DTABLE_PATH=\"emos\"
+
+FASTCFLAGS = $(DEBUG)-qstrict -q64 $(OLI) -qarch=auto -qtune=auto -DIBM -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64 -WF,-DTABLE_PATH=\"emos\"
+#
+FC = xlf90_r
+CPPFLAGS=-DIBM,-Drs6000,-DPOINTER_64,-DINTEGER_IS_INT,-DIBM_POWER4,-DSHAREDMEMORY,-DFOPEN64
+
+FFLAGS = -qsigtrap $(DEBUG)-qstrict -q64 -qextname -qarch=auto -qtune=auto -qwarn64 -qrealsize=4 -qintsize=4 -qalign=4k -qnosource -qfixed=72 -qintlog -WF,-DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.ibm_power7R64 b/config/config.ibm_power7R64
new file mode 100755
index 0000000..02e192e
--- /dev/null
+++ b/config/config.ibm_power7R64
@@ -0,0 +1,27 @@
+#
+# Configuration file for ibm_power6 (64-bit REALs).
+#
+AR = ar
+ARFLAGS = -r -v -X64
+OLI=-qwarn64
+#
+CC = xlc_r
+PROFILE=
+DEBUG=-O3
+
+
+
+CFLAGS = $(DEBUG) -qstrict -q64 $(OLI) -qarch=auto -qtune=auto -DREAL_BIGGER_THAN_INTEGER -DREAL_8 -DIBM -DIBM_POWER4 -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64
+
+FASTCFLAGS = $(DEBUG) -qstrict -qinline -q64 $(OLI) -qarch=auto -qtune=auto -DREAL_BIGGER_THAN_INTEGER -DREAL_8 -DIBM -DIBM_POWER4 -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64
+#
+FC = xlf90_r
+CPPFLAGS=-DREAL_BIGGER_THAN_INTEGER,-DREAL_8,-DIBM,-Drs6000,-DPOINTER_64,-DINTEGER_IS_INT,-DIBM_POWER4,-DSHAREDMEMORY,-DFOPEN64
+
+FFLAGS = -qsigtrap $(DEBUG) -qstrict -q64 -qarch=auto -qtune=auto -qwarn64 -qrealsize=8 -qintsize=4 -qalign=4k -qsource -qfixed=72 -qintlog
+
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.ibm_power7R64.in b/config/config.ibm_power7R64.in
new file mode 100755
index 0000000..7f345db
--- /dev/null
+++ b/config/config.ibm_power7R64.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for ibm_power6 (64-bit REALs).
+#
+AR = ar
+ARFLAGS = -r -v -X64
+OLI=-qwarn64
+#
+CC = xlc_r
+DEBUG=-O3
+
+
+CFLAGS = $(DEBUG) -qstrict -q64 $(OLI) -qarch=auto -qtune=auto -DREAL_BIGGER_THAN_INTEGER -DREAL_8 -DIBM -DIBM_POWER4 -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64 -WF,-DTABLE_PATH=\"emos\"
+
+FASTCFLAGS = -g -O3 -qstrict -qinline -q64 $(OLI) -qarch=auto -qtune=auto -DREAL_BIGGER_THAN_INTEGER -DREAL_8 -DIBM -DIBM_POWER4 -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64 -WF,-DTABLE_PATH=\"emos\"
+#
+FC = xlf90_r
+CPPFLAGS=-DREAL_BIGGER_THAN_INTEGER,-DREAL_8,-DIBM,-Drs6000,-DPOINTER_64,-DINTEGER_IS_INT,-DIBM_POWER4,-DSHAREDMEMORY,-DFOPEN64
+
+FFLAGS = -qsigtrap $(DEBUG) -qstrict -q64 -qarch=auto -qtune=auto -qwarn64 -qrealsize=8 -qintsize=4 -qalign=4k -qsource -qfixed=72 -qintlog -WF,-DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.itanium b/config/config.itanium
new file mode 100755
index 0000000..c5f674c
--- /dev/null
+++ b/config/config.itanium
@@ -0,0 +1,22 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux
+CC_A32 = -m32
+#
+CC = gcc
+CFLAGS = -g -DLITTLE_ENDIAN $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = /opt/intel/fc/9.0/bin/ifort
+FFLAGS = -i4 -r4 -Dlinux -DLITTLE_ENDIAN -convert big_endian
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.itanium.in b/config/config.itanium.in
new file mode 100755
index 0000000..c0d3ddf
--- /dev/null
+++ b/config/config.itanium.in
@@ -0,0 +1,21 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux
+#
+CC = gcc
+CFLAGS = -g -DLITTLE_ENDIAN -DINTEGER_IS_INT $(LOCAL_CFLAGS) $(LARGE_FILE) -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = ifort
+FFLAGS = -i4 -r4 -Dlinux -DLITTLE_ENDIAN -DINTEGER_IS_INT -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.itaniumR64 b/config/config.itaniumR64
new file mode 100755
index 0000000..b8e700c
--- /dev/null
+++ b/config/config.itaniumR64
@@ -0,0 +1,24 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG=-g
+#
+LARGE_FILE = -Dlinux
+CC_A32 = -m32
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DLITTLE_ENDIAN $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = /opt/intel/fc/9.0/bin/ifort
+FFLAGS = $(DEBUG) -i4 -r8 -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -convert big_endian -DREAL_8 -DREAL_BIGGER_THAN_INTEGER
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.itaniumR64.in b/config/config.itaniumR64.in
new file mode 100755
index 0000000..aadc3f7
--- /dev/null
+++ b/config/config.itaniumR64.in
@@ -0,0 +1,23 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG=-g
+#
+LARGE_FILE = -Dlinux
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN $(LOCAL_CFLAGS) $(LARGE_FILE) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = ifort
+FFLAGS = $(DEBUG) -i4 -r8 -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -Vaxlib -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux b/config/config.linux
new file mode 100755
index 0000000..c216fa7
--- /dev/null
+++ b/config/config.linux
@@ -0,0 +1,22 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+#
+#
+CC = pgcc
+CFLAGS = -g -tp px $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = -i4 -r4 -tp px -Dlinux
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux.in b/config/config.linux.in
new file mode 100755
index 0000000..2e92589
--- /dev/null
+++ b/config/config.linux.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+DEBUG = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = pgcc
+CFLAGS = $(DEBUG) -tp px -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUG) -i4 -r4 -tp px -Dlinux -Mextend -DTABLE_PATH=\"emos\" $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linuxA64 b/config/config.linuxA64
new file mode 100755
index 0000000..19822e3
--- /dev/null
+++ b/config/config.linuxA64
@@ -0,0 +1,21 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+#
+CC = pgcc
+
+CFLAGS = -g -tp k8-64 -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = -g -i4 -r4 -tp k8-64 -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -fast -Kieee -Mvect=prefetch
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linuxA64.in b/config/config.linuxA64.in
new file mode 100755
index 0000000..6b90544
--- /dev/null
+++ b/config/config.linuxA64.in
@@ -0,0 +1,24 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = pgcc
+
+CFLAGS = $(DEBUG) -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUG) -i4 -r4 -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -Kieee -Mvect=prefetch -DTABLE_PATH=\"emos\" $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linuxR64 b/config/config.linuxR64
new file mode 100755
index 0000000..71b5f55
--- /dev/null
+++ b/config/config.linuxR64
@@ -0,0 +1,21 @@
+#
+# Configuration file for linux (64-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+#
+#
+CC = pgcc
+CFLAGS = -g -tp px -DREAL_8 $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = -g -i4 -r8 -tp px -Dlinux -DREAL_8 -DREAL_BIGGER_THAN_INTEGER
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linuxR64.in b/config/config.linuxR64.in
new file mode 100755
index 0000000..4dbdaaf
--- /dev/null
+++ b/config/config.linuxR64.in
@@ -0,0 +1,23 @@
+#
+# Configuration file for linux (64-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+DEBUG = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = pgcc
+CFLAGS = $(DEBUG) -tp px -DREAL_8 -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUG) -i4 -r8 -tp px -Dlinux -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -Mextend -DTABLE_PATH=\"emos\" $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linuxR64A64 b/config/config.linuxR64A64
new file mode 100755
index 0000000..518f53b
--- /dev/null
+++ b/config/config.linuxR64A64
@@ -0,0 +1,21 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+#
+CC = pgcc
+
+CFLAGS = -g -tp k8-64 -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN -DREAL_8 -DREAL_BIGGER_THAN_INTEGER $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = -g -i4 -r8 -tp k8-64 -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -fast -Kieee -Mvect=prefetch -DREAL_8 -DREAL_BIGGER_THAN_INTEGER
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linuxR64A64.in b/config/config.linuxR64A64.in
new file mode 100755
index 0000000..0ce4648
--- /dev/null
+++ b/config/config.linuxR64A64.in
@@ -0,0 +1,24 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = pgcc
+
+CFLAGS = $(DEBUG) -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUG) -i4 -r8 -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -Kieee -Mvect=prefetch -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -Mextend -DTABLE_PATH=\"emos\" $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linuxR64_shared b/config/config.linuxR64_shared
new file mode 100755
index 0000000..e9c3e3c
--- /dev/null
+++ b/config/config.linuxR64_shared
@@ -0,0 +1,28 @@
+#
+# Configuration file for linux (64-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+#
+SHLIB=-fPIC
+DYNLINKFLAGS=-shared
+PROFILE=
+#DEBUG = -O2
+USE_NO_POINTERS =
+LARGE_FILE = -Dlinux -DFOPEN64
+CC_A32 = -m32
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 -DLITTLE_ENDIAN $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUG) $(PROFILE) -i4 -r8 -tp px -Dlinux -DREAL_8 -DREAL_BIGGER_THAN_INTEGER $(USE_NO_POINTERS) -DLITTLE_ENDIAN
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_amd b/config/config.linux_amd
new file mode 100755
index 0000000..55b5ef6
--- /dev/null
+++ b/config/config.linux_amd
@@ -0,0 +1,28 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+PROFILE=
+#
+DEBUG = -O3
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+CC_A32 = -m32
+DEBUGF = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DLITTLE_ENDIAN $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUGF) $(PROFILE) -i4 -r4 -tp px -Dlinux -DLITTLE_ENDIAN $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_amd.in b/config/config.linux_amd.in
new file mode 100755
index 0000000..51068a4
--- /dev/null
+++ b/config/config.linux_amd.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+DEBUG = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = pgcc
+CFLAGS = $(DEBUG) -tp px -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUG) -i4 -r4 -tp px -Dlinux -DTABLE_PATH=\"emos\" $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_amdA64 b/config/config.linux_amdA64
new file mode 100755
index 0000000..29f8779
--- /dev/null
+++ b/config/config.linux_amdA64
@@ -0,0 +1,25 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG=-O3
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+DEBUGF = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = gcc
+
+CFLAGS = $(DEBUG) $(PROFILE) -m64 -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(DEBUG) $(PROFILE) -m64 $(MEM_MAP)
+#
+FC = pgf77
+FFLAGS = $(DEBUGF) $(PROFILE) -i4 -r4 -tp k8-64 -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -fast -Kieee -Mvect=prefetch $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_amdA64.in b/config/config.linux_amdA64.in
new file mode 100755
index 0000000..406f993
--- /dev/null
+++ b/config/config.linux_amdA64.in
@@ -0,0 +1,24 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = pgcc
+
+CFLAGS = $(DEBUG) -tp k8-64 -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUG) -i4 -r4 -tp k8-64 -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -Kieee -Mvect=prefetch -DTABLE_PATH=\"emos\" $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_amdR64 b/config/config.linux_amdR64
new file mode 100755
index 0000000..b20e563
--- /dev/null
+++ b/config/config.linux_amdR64
@@ -0,0 +1,31 @@
+#
+# Configuration file for linux (64-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+#
+SHLIB=-fPIC
+DYNLINKFLAGS=-shared
+PROFILE=
+DEBUG = -O3
+USE_NO_POINTERS =
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+CC_A32 = -m32
+DEBUGF = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 -DLITTLE_ENDIAN $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUGF) $(PROFILE) -i4 -r8 -tp px -Dlinux -DREAL_8 -DREAL_BIGGER_THAN_INTEGER $(USE_NO_POINTERS) -DLITTLE_ENDIAN $(MEM_MAP)
+
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_amdR64.in b/config/config.linux_amdR64.in
new file mode 100755
index 0000000..35490d7
--- /dev/null
+++ b/config/config.linux_amdR64.in
@@ -0,0 +1,23 @@
+#
+# Configuration file for linux (64-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+DEBUG = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = pgcc
+CFLAGS = $(DEBUG) -tp px -DREAL_8 -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUG) -i4 -r8 -tp px -Dlinux -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\" $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_amdR64A64 b/config/config.linux_amdR64A64
new file mode 100755
index 0000000..7c6bd7b
--- /dev/null
+++ b/config/config.linux_amdR64A64
@@ -0,0 +1,28 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+#
+SHLIB=-fPIC
+DYNLINKFLAGS=-shared
+PROFILE=
+DEBUG=-O3
+DEBUGF = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = gcc
+
+CFLAGS = $(DEBUG) $(PROFILE) -m64 -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN -DREAL_8 -DREAL_BIGGER_THAN_INTEGER $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(DEBUG) $(PROFILE) -m64
+#
+FC = pgf77
+FFLAGS = $(DEBUGF) $(PROFILE) -i4 -r8 -tp k8-64 -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -Kieee -Mvect=prefetch -DREAL_8 -DREAL_BIGGER_THAN_INTEGER $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_amdR64A64.in b/config/config.linux_amdR64A64.in
new file mode 100755
index 0000000..31314f0
--- /dev/null
+++ b/config/config.linux_amdR64A64.in
@@ -0,0 +1,24 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = pgcc
+
+CFLAGS = $(DEBUG) -tp k8-64 -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUG) -i4 -r8 -tp k8-64 -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -Kieee -Mvect=prefetch -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\" $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_core2 b/config/config.linux_core2
new file mode 100755
index 0000000..55b5ef6
--- /dev/null
+++ b/config/config.linux_core2
@@ -0,0 +1,28 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+PROFILE=
+#
+DEBUG = -O3
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+CC_A32 = -m32
+DEBUGF = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DLITTLE_ENDIAN $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUGF) $(PROFILE) -i4 -r4 -tp px -Dlinux -DLITTLE_ENDIAN $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_core2.in b/config/config.linux_core2.in
new file mode 100755
index 0000000..51068a4
--- /dev/null
+++ b/config/config.linux_core2.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+DEBUG = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = pgcc
+CFLAGS = $(DEBUG) -tp px -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUG) -i4 -r4 -tp px -Dlinux -DTABLE_PATH=\"emos\" $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_core2A64 b/config/config.linux_core2A64
new file mode 100755
index 0000000..2dc1f7a
--- /dev/null
+++ b/config/config.linux_core2A64
@@ -0,0 +1,25 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG=-O3
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+DEBUGF = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = gcc
+
+CFLAGS = $(DEBUG) $(PROFILE) -m64 -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(DEBUG) $(PROFILE) -m64 $(MEM_MAP)
+#
+FC = pgf77
+FFLAGS = $(DEBUGF) $(PROFILE) -i4 -r4 -tp core2 -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -fast -Kieee -Mvect=prefetch $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_core2A64.in b/config/config.linux_core2A64.in
new file mode 100755
index 0000000..6b90544
--- /dev/null
+++ b/config/config.linux_core2A64.in
@@ -0,0 +1,24 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = pgcc
+
+CFLAGS = $(DEBUG) -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUG) -i4 -r4 -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -Kieee -Mvect=prefetch -DTABLE_PATH=\"emos\" $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_core2R64 b/config/config.linux_core2R64
new file mode 100755
index 0000000..344f4d1
--- /dev/null
+++ b/config/config.linux_core2R64
@@ -0,0 +1,31 @@
+#
+# Configuration file for linux (64-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+#
+SHLIB=-fPIC
+DYNLINKFLAGS=-shared
+PROFILE=
+DEBUG = -O3
+USE_NO_POINTERS =
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+CC_A32 = -m32
+DEBUGF = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 -DLITTLE_ENDIAN $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUGF) $(PROFILE) -i4 -r8 -tp core2 -Dlinux -DREAL_8 -DREAL_BIGGER_THAN_INTEGER $(USE_NO_POINTERS) -DLITTLE_ENDIAN $(MEM_MAP)
+
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_core2R64.in b/config/config.linux_core2R64.in
new file mode 100755
index 0000000..0f2add3
--- /dev/null
+++ b/config/config.linux_core2R64.in
@@ -0,0 +1,23 @@
+#
+# Configuration file for linux (64-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+DEBUG = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = pgcc
+CFLAGS = $(DEBUG) -tp core2 -DREAL_8 -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUG) -i4 -r8 -tp core2 -Dlinux -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\" $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_core2R64A64 b/config/config.linux_core2R64A64
new file mode 100755
index 0000000..f1c7d45
--- /dev/null
+++ b/config/config.linux_core2R64A64
@@ -0,0 +1,28 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+#
+SHLIB=-fPIC
+DYNLINKFLAGS=-shared
+PROFILE=
+DEBUG=-O3
+DEBUGF = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = gcc
+
+CFLAGS = $(DEBUG) $(PROFILE) -m64 -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN -DREAL_8 -DREAL_BIGGER_THAN_INTEGER $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(DEBUG) $(PROFILE) -m64
+#
+FC = pgf77
+FFLAGS = $(DEBUGF) $(PROFILE) -i4 -r8 -tp core2 -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -Kieee -Mvect=prefetch -DREAL_8 -DREAL_BIGGER_THAN_INTEGER $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_core2R64A64.in b/config/config.linux_core2R64A64.in
new file mode 100755
index 0000000..fb59a76
--- /dev/null
+++ b/config/config.linux_core2R64A64.in
@@ -0,0 +1,24 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = pgcc
+
+CFLAGS = $(DEBUG) -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUG) -i4 -r8 -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -Kieee -Mvect=prefetch -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\" $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_g95.in b/config/config.linux_g95.in
new file mode 100755
index 0000000..f42182c
--- /dev/null
+++ b/config/config.linux_g95.in
@@ -0,0 +1,23 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG = -g -O2
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) -m32
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g95
+FFLAGS = $(DEBUG) -fno-second-underscore -fsloppy-char -Dlinux -DUSE_NO_POINTERS -fzeros -DTABLE_PATH=\"emos\" -m32
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_g95A64.in b/config/config.linux_g95A64.in
new file mode 100755
index 0000000..c2dafd8
--- /dev/null
+++ b/config/config.linux_g95A64.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG = -g -O2
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DINTEGER_IS_INT -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g95
+FFLAGS = $(DEBUG) -DINTEGER_IS_INT -fno-second-underscore -fsloppy-char -Dlinux -DUSE_NO_POINTERS -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_g95R64.in b/config/config.linux_g95R64.in
new file mode 100755
index 0000000..1a97649
--- /dev/null
+++ b/config/config.linux_g95R64.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG = -g -O2
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DREAL_8 -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) -m32
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g95
+FFLAGS = $(DEBUG) -fno-second-underscore -r8 -i4 -fsloppy-char -Dlinux -DUSE_NO_POINTERS -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\" -m32
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_g95R64A64.in b/config/config.linux_g95R64A64.in
new file mode 100755
index 0000000..b3ed690
--- /dev/null
+++ b/config/config.linux_g95R64A64.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG = -g -O2
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) -m64 -DREAL_8 -DINTEGER_IS_INT -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(DEBUG)
+#
+FC = g95
+FFLAGS = $(DEBUG) -fno-second-underscore -r8 -i4 -m64 -Dlinux -fsloppy-char -DUSE_NO_POINTERS -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_gfortran b/config/config.linux_gfortran
new file mode 100755
index 0000000..5c969b3
--- /dev/null
+++ b/config/config.linux_gfortran
@@ -0,0 +1,28 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+#CC_A32 = -m32
+CC_A32 =
+USE_NO_POINTERS =
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+#
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DLITTLE_ENDIAN $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -Dgfortran -DLITTLE_ENDIAN
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_gfortran.in b/config/config.linux_gfortran.in
new file mode 100755
index 0000000..5b77022
--- /dev/null
+++ b/config/config.linux_gfortran.in
@@ -0,0 +1,27 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+CC_A32 = -m32
+USE_NO_POINTERS =
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+#
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DLITTLE_ENDIAN $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -Dgfortran -DTABLE_PATH=\"emos\" -DLITTLE_ENDIAN
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_gfortranA64 b/config/config.linux_gfortranA64
new file mode 100755
index 0000000..0980fb8
--- /dev/null
+++ b/config/config.linux_gfortranA64
@@ -0,0 +1,27 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+#CC_A32 = -m64
+CC_A32 =
+USE_NO_POINTERS = -DPOINTER_64
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DPOINTER_64 -DLITTLE_ENDIAN -DINTEGER_IS_INT $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -Dgfortran -DLITTLE_ENDIAN -DINTEGER_IS_INT
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_gfortranA64.in b/config/config.linux_gfortranA64.in
new file mode 100755
index 0000000..764b1c0
--- /dev/null
+++ b/config/config.linux_gfortranA64.in
@@ -0,0 +1,27 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+#CC_A32 = -m64
+CC_A32 =
+USE_NO_POINTERS = -DPOINTER_64
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DLITTLE_ENDIAN -DPOINTER_64 -DINTEGER_IS_INT $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fcray-pointer -fno-second-underscore -Dlinux -DINTEGER_IS_INT $(USE_NO_POINTERS) -Dgfortran -DTABLE_PATH=\"emos\" -DLITTLE_ENDIAN
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_gfortranR64 b/config/config.linux_gfortranR64
new file mode 100755
index 0000000..a556756
--- /dev/null
+++ b/config/config.linux_gfortranR64
@@ -0,0 +1,27 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+USE_NO_POINTERS =
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+#CC_A32 = -m32
+CC_A32 =
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 -DLITTLE_ENDIAN $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fdefault-real-8 -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -Dgfortran -DLITTLE_ENDIAN
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_gfortranR64.in b/config/config.linux_gfortranR64.in
new file mode 100755
index 0000000..7332371
--- /dev/null
+++ b/config/config.linux_gfortranR64.in
@@ -0,0 +1,26 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+USE_NO_POINTERS =
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+CC_A32 = -m32
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 -DLITTLE_ENDIAN $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fdefault-real-8 -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -Dgfortran -DTABLE_PATH=\"emos\" -DLITTLE_ENDIAN
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_gfortranR64A64 b/config/config.linux_gfortranR64A64
new file mode 100755
index 0000000..9794920
--- /dev/null
+++ b/config/config.linux_gfortranR64A64
@@ -0,0 +1,30 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+USE_NO_POINTERS = -DPOINTER_64
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+# This doesn't work for gfortran
+#CC_A32 = -m64
+CC_A32 =-m64 -Ofast -flto -march=native -funroll-loops
+CC_A32 =
+GFORTRAN_EXTRA=-march=native -ffast-math -funroll-loops -O3
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 -DLITTLE_ENDIAN -DPOINTER_64 $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fdefault-real-8 -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT -Dgfortran -DLITTLE_ENDIAN $(GFORTRAN_EXTRA)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_gfortranR64A64.in b/config/config.linux_gfortranR64A64.in
new file mode 100755
index 0000000..9ec1e85
--- /dev/null
+++ b/config/config.linux_gfortranR64A64.in
@@ -0,0 +1,27 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+USE_NO_POINTERS = -DPOINTER_64
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+#CC_A32 = -m64
+CC_A32 =
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 -DLITTLE_ENDIAN -DPOINTER_64 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fdefault-real-8 -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT -Dgfortran -DTABLE_PATH=\"emos\" -DLITTLE_ENDIAN
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_gnu b/config/config.linux_gnu
new file mode 100755
index 0000000..b2af380
--- /dev/null
+++ b/config/config.linux_gnu
@@ -0,0 +1,24 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG =
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g77
+FFLAGS = $(DEBUG) -I. -fno-second-underscore -Dlinux -DUSE_NO_POINTERS
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_gnu.in b/config/config.linux_gnu.in
new file mode 100755
index 0000000..6a58e17
--- /dev/null
+++ b/config/config.linux_gnu.in
@@ -0,0 +1,23 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG =
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g77
+FFLAGS = $(DEBUG) -I. -fno-second-underscore -Dlinux -DUSE_NO_POINTERS -g -fzeros -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_gnuA64 b/config/config.linux_gnuA64
new file mode 100755
index 0000000..365f7a1
--- /dev/null
+++ b/config/config.linux_gnuA64
@@ -0,0 +1,24 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG =
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DINTEGER_IS_INT $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g77
+FFLAGS = $(DEBUG) -I. -DINTEGER_IS_INT -fno-second-underscore -Dlinux -DUSE_NO_POINTERS
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_gnuA64.in b/config/config.linux_gnuA64.in
new file mode 100755
index 0000000..2e670bc
--- /dev/null
+++ b/config/config.linux_gnuA64.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG =
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DINTEGER_IS_INT -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g77
+FFLAGS = $(DEBUG) -I. -DINTEGER_IS_INT -fno-second-underscore -Dlinux -DUSE_NO_POINTERS -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_gnuR64 b/config/config.linux_gnuR64
new file mode 100755
index 0000000..29306f7
--- /dev/null
+++ b/config/config.linux_gnuR64
@@ -0,0 +1,24 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG =
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g77
+FFLAGS = $(DEBUG) -I. -fno-second-underscore -Dlinux -DUSE_NO_POINTERS -DREAL_8 -DREAL_BIGGER_THAN_INTEGER
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_gnuR64.in b/config/config.linux_gnuR64.in
new file mode 100755
index 0000000..5dd4394
--- /dev/null
+++ b/config/config.linux_gnuR64.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG =
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DREAL_8 -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g77
+FFLAGS = $(DEBUG) -I. -fno-second-underscore -Dlinux -DUSE_NO_POINTERS -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_gnuR64A64 b/config/config.linux_gnuR64A64
new file mode 100755
index 0000000..171ec93
--- /dev/null
+++ b/config/config.linux_gnuR64A64
@@ -0,0 +1,24 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG =
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DREAL_8 -DINTEGER_IS_INT $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g77
+FFLAGS = $(DEBUG) -I. -fno-second-underscore -Dlinux -DUSE_NO_POINTERS -DREAL_8 -DREAL_BIGGER_THAN_INTEGER
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_gnuR64A64.in b/config/config.linux_gnuR64A64.in
new file mode 100755
index 0000000..aaddaf3
--- /dev/null
+++ b/config/config.linux_gnuR64A64.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG = -g
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DREAL_8 -DINTEGER_IS_INT -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(DEBUG)
+#
+FC = g77
+FFLAGS = $(DEBUG) -I. -fno-second-underscore -Dlinux -DUSE_NO_POINTERS -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_intel b/config/config.linux_intel
new file mode 100755
index 0000000..093c517
--- /dev/null
+++ b/config/config.linux_intel
@@ -0,0 +1,22 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG =
+CC = gcc
+CFLAGS = $(DEBUG) -DLITTLE_ENDIAN -DINTEGER_IS_INT $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = ifort
+FFLAGS = $(DEBUG) -i4 -r4 -Dlinux -DLITTLE_ENDIAN -DINTEGER_IS_INT
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_intel.in b/config/config.linux_intel.in
new file mode 100755
index 0000000..dfb86ad
--- /dev/null
+++ b/config/config.linux_intel.in
@@ -0,0 +1,22 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG =
+CC = gcc
+CFLAGS = $(DEBUG) -DLITTLE_ENDIAN -DINTEGER_IS_INT $(LOCAL_CFLAGS) $(LARGE_FILE) -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = ifort
+FFLAGS = $(DEBUG) -i4 -r4 -Dlinux -DLITTLE_ENDIAN -DINTEGER_IS_INT -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_intelA64.in b/config/config.linux_intelA64.in
new file mode 100755
index 0000000..dfb86ad
--- /dev/null
+++ b/config/config.linux_intelA64.in
@@ -0,0 +1,22 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG =
+CC = gcc
+CFLAGS = $(DEBUG) -DLITTLE_ENDIAN -DINTEGER_IS_INT $(LOCAL_CFLAGS) $(LARGE_FILE) -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = ifort
+FFLAGS = $(DEBUG) -i4 -r4 -Dlinux -DLITTLE_ENDIAN -DINTEGER_IS_INT -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_intelR64 b/config/config.linux_intelR64
new file mode 100755
index 0000000..5404d14
--- /dev/null
+++ b/config/config.linux_intelR64
@@ -0,0 +1,24 @@
+#
+# Configuration file for linux (64-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG=-g
+DEBUG=-O3
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DLITTLE_ENDIAN -DPOINTER_64 -DINTEGER_IS_INT $(LOCAL_CFLAGS) $(LARGE_FILE) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) -i4 -r8 -Dlinux -DLITTLE_ENDIAN -DPOINTER_64 -DINTEGER_IS_INT -DREAL_8 -DREAL_BIGGER_THAN_INTEGER
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_intelR64.in b/config/config.linux_intelR64.in
new file mode 100755
index 0000000..14139ab
--- /dev/null
+++ b/config/config.linux_intelR64.in
@@ -0,0 +1,23 @@
+#
+# Configuration file for linux (64-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG=-g
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DLITTLE_ENDIAN -DPOINTER_64 -DINTEGER_IS_INT $(LOCAL_CFLAGS) $(LARGE_FILE) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = ifort
+FFLAGS = $(DEBUG) -i4 -r8 -Dlinux -DLITTLE_ENDIAN -DPOINTER_64 -DINTEGER_IS_INT -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -Vaxlib -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_intelR64A64.in b/config/config.linux_intelR64A64.in
new file mode 100755
index 0000000..14139ab
--- /dev/null
+++ b/config/config.linux_intelR64A64.in
@@ -0,0 +1,23 @@
+#
+# Configuration file for linux (64-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG=-g
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DLITTLE_ENDIAN -DPOINTER_64 -DINTEGER_IS_INT $(LOCAL_CFLAGS) $(LARGE_FILE) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = ifort
+FFLAGS = $(DEBUG) -i4 -r8 -Dlinux -DLITTLE_ENDIAN -DPOINTER_64 -DINTEGER_IS_INT -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -Vaxlib -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_pgf90 b/config/config.linux_pgf90
new file mode 100755
index 0000000..71cfb33
--- /dev/null
+++ b/config/config.linux_pgf90
@@ -0,0 +1,28 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+PROFILE=
+#
+DEBUG = -O3
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+CC_A32 = -m32
+DEBUGF = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DLITTLE_ENDIAN $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf90
+FFLAGS = $(DEBUGF) $(PROFILE) -i4 -r4 -tp px -Dlinux -DLITTLE_ENDIAN $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.linux_pgf90R64 b/config/config.linux_pgf90R64
new file mode 100755
index 0000000..58ca60d
--- /dev/null
+++ b/config/config.linux_pgf90R64
@@ -0,0 +1,34 @@
+#
+# Configuration file for linux (64-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+#
+SHLIB=-fPIC
+DYNLINKFLAGS=-shared
+PROFILE=
+DEBUG = -O3
+USE_NO_POINTERS =
+#
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+# -D_LARGEFILE64_SOURCE proposed by Peter Towers
+#
+CC_A32 = -m32
+DEBUGF = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 -DLITTLE_ENDIAN $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf90
+FFLAGS = $(DEBUGF) $(PROFILE) -i4 -r8 -tp px -Dlinux -DREAL_8 -DREAL_BIGGER_THAN_INTEGER $(USE_NO_POINTERS) -DLITTLE_ENDIAN $(MEM_MAP)
+
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_x86_64 b/config/config.linux_x86_64
new file mode 100755
index 0000000..50b6186
--- /dev/null
+++ b/config/config.linux_x86_64
@@ -0,0 +1,28 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG=-O3
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+DEBUGF = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#COMP = nehalem
+COMP =
+#
+CC = gcc
+
+CFLAGS = $(DEBUG) $(PROFILE) -m32 -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+#FASTCFLAGS = $(DEBUG) $(PROFILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUGF) $(PROFILE) -i4 -r4 $(COMP) -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -fast -Kieee -Mvect=prefetch $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_x86_64.in b/config/config.linux_x86_64.in
new file mode 100755
index 0000000..de12bc6
--- /dev/null
+++ b/config/config.linux_x86_64.in
@@ -0,0 +1,25 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+COMP =
+#
+CC = pgcc
+
+CFLAGS = $(DEBUG) -tp px -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUG) -i4 -r4 $(COMP) -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -Kieee -Mvect=prefetch -DTABLE_PATH=\"emos\" $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_x86_64A64 b/config/config.linux_x86_64A64
new file mode 100755
index 0000000..f610591
--- /dev/null
+++ b/config/config.linux_x86_64A64
@@ -0,0 +1,28 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG=-O3
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+DEBUGF = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#COMP = nehalem-64
+COMP =
+#
+CC = gcc
+
+CFLAGS = $(DEBUG) $(PROFILE) -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+#FASTCFLAGS = $(DEBUG) $(PROFILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUGF) $(PROFILE) -i4 -r4 $(COMP) -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -fast -Kieee -Mvect=prefetch $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_x86_64A64.in b/config/config.linux_x86_64A64.in
new file mode 100755
index 0000000..bbcac6d
--- /dev/null
+++ b/config/config.linux_x86_64A64.in
@@ -0,0 +1,25 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+COMP =
+#
+CC = pgcc
+
+CFLAGS = $(DEBUG) -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUG) -i4 -r4 $(COMP) -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -Kieee -Mvect=prefetch -DTABLE_PATH=\"emos\" $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_x86_64R64 b/config/config.linux_x86_64R64
new file mode 100755
index 0000000..f04eab0
--- /dev/null
+++ b/config/config.linux_x86_64R64
@@ -0,0 +1,31 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+#
+SHLIB=-fPIC
+DYNLINKFLAGS=-shared
+PROFILE=
+DEBUG=-O3
+DEBUGF = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#COMP = nehalem
+COMP =
+#
+CC = gcc
+
+CFLAGS = $(DEBUG) $(PROFILE) -m32 -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN -DREAL_8 -DREAL_BIGGER_THAN_INTEGER $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+#FASTCFLAGS = $(DEBUG) $(PROFILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUGF) $(PROFILE) -i4 -r8 $(COMP) -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -Kieee -Mvect=prefetch -DREAL_8 -DREAL_BIGGER_THAN_INTEGER $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_x86_64R64.in b/config/config.linux_x86_64R64.in
new file mode 100755
index 0000000..77ac430
--- /dev/null
+++ b/config/config.linux_x86_64R64.in
@@ -0,0 +1,25 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+COMP =
+#
+CC = pgcc
+
+CFLAGS = $(DEBUG) -tp px -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUG) -i4 -r8 $(COMP) -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -Kieee -Mvect=prefetch -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\" $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_x86_64R64A64 b/config/config.linux_x86_64R64A64
new file mode 100755
index 0000000..ed268d8
--- /dev/null
+++ b/config/config.linux_x86_64R64A64
@@ -0,0 +1,31 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+#
+SHLIB=-fPIC
+DYNLINKFLAGS=-shared
+PROFILE=
+DEBUG=-O3
+DEBUGF = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+#COMP = nehalem-64
+COMP =
+#
+CC = gcc
+
+CFLAGS = $(DEBUG) $(PROFILE) -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN -DREAL_8 -DREAL_BIGGER_THAN_INTEGER $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+#FASTCFLAGS = $(DEBUG) $(PROFILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUGF) $(PROFILE) -i4 -r8 $(COMP) -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -Kieee -Mvect=prefetch -DREAL_8 -DREAL_BIGGER_THAN_INTEGER $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.linux_x86_64R64A64.in b/config/config.linux_x86_64R64A64.in
new file mode 100755
index 0000000..8a859f9
--- /dev/null
+++ b/config/config.linux_x86_64R64A64.in
@@ -0,0 +1,25 @@
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -Dlinux -DFOPEN64
+#
+DEBUG = -fast
+MEM_MAP = -D_FILE_OFFSET_BITS=64
+#
+COMP =
+#
+CC = pgcc
+
+CFLAGS = $(DEBUG) -DPOINTER_64 -DINTEGER_IS_INT -DLITTLE_ENDIAN -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) $(MEM_MAP)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = pgf77
+FFLAGS = $(DEBUG) -i4 -r8 $(COMP) -DPOINTER_64 -DINTEGER_IS_INT -Dlinux -DLITTLE_ENDIAN -Kieee -Mvect=prefetch -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\" $(MEM_MAP)
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
diff --git a/config/config.mac_intel b/config/config.mac_intel
new file mode 100755
index 0000000..4d4a887
--- /dev/null
+++ b/config/config.mac_intel
@@ -0,0 +1,23 @@
+#
+# Configuration file for mac (32-bit reals).
+#
+AR = ar
+ARFLAGS = ru
+#
+LARGE_FILE =
+#
+#
+CPP = cpp -C -P -xassembler-with-cpp -traditional
+CC = icc
+CFLAGS = -w -O3 -ip $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = ifort
+FFLAGS = -O3 -unroll0 -xT -fno-alias -ip -w -align all -fno-alias -fp-model precise -convert big_endian
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.mac_intel.in b/config/config.mac_intel.in
new file mode 100755
index 0000000..98053ca
--- /dev/null
+++ b/config/config.mac_intel.in
@@ -0,0 +1,23 @@
+#
+# Configuration file for mac (32-bit reals).
+#
+AR = ar
+ARFLAGS = ru
+#
+LARGE_FILE =
+#
+#
+CPP = cpp -C -P -xassembler-with-cpp -traditional
+CC = icc
+CFLAGS = -w -O3 -ip -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = ifort
+FFLAGS = -O3 -unroll0 -xT -fno-alias -ip -w -align all -fno-alias -fp-model precise -convert big_endian -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.mac_intelR64 b/config/config.mac_intelR64
new file mode 100755
index 0000000..5e554c2
--- /dev/null
+++ b/config/config.mac_intelR64
@@ -0,0 +1,23 @@
+#
+# Configuration file for mac (64-bit reals).
+#
+AR = ar
+ARFLAGS = ru
+#
+LARGE_FILE =
+#
+#
+CPP = cpp -C -P -xassembler-with-cpp -traditional
+CC = icc
+CFLAGS = -w -O3 -ip -DREAL_8 -DTABLE_PATH=\"/usr/local/bufr/lib\" $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = ifort
+FFLAGS = -O3 -i4 -r8 -unroll0 -xT -fno-alias -ip -w -align all -fno-alias -fp-model precise -convert big_endian -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"/usr/local/bufr/lib\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.mac_intelR64.in b/config/config.mac_intelR64.in
new file mode 100755
index 0000000..5c11454
--- /dev/null
+++ b/config/config.mac_intelR64.in
@@ -0,0 +1,23 @@
+#
+# Configuration file for mac (64-bit reals).
+#
+AR = ar
+ARFLAGS = ru
+#
+LARGE_FILE =
+#
+#
+CPP = cpp -C -P -xassembler-with-cpp -traditional
+CC = icc
+CFLAGS = -w -O3 -ip -DREAL_8 -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = ifort
+FFLAGS = -O3 -i4 -r8 -unroll0 -xT -fno-alias -ip -w -align all -fno-alias -fp-model precise -convert big_endian -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 64-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.ppc b/config/config.ppc
new file mode 100755
index 0000000..bad57e0
--- /dev/null
+++ b/config/config.ppc
@@ -0,0 +1,28 @@
+#
+# Configuration file for powerpc G4 (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+CC_A32 = -mcpu=G4 -mtune=G4
+USE_NO_POINTERS =
+LARGE_FILE =
+#
+#
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DPOWERPC
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -Dgfortran -DPOWERPC
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.ppc.in b/config/config.ppc.in
new file mode 100755
index 0000000..641bcc9
--- /dev/null
+++ b/config/config.ppc.in
@@ -0,0 +1,28 @@
+#
+# Configuration file for powerpc G4 (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+CC_A32 = -mcpu=G4 -mtune=G4
+USE_NO_POINTERS =
+LARGE_FILE =
+#
+#
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DPOWERPC -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -Dgfortran -DPOWERPC -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.ppcR64 b/config/config.ppcR64
new file mode 100755
index 0000000..206450c
--- /dev/null
+++ b/config/config.ppcR64
@@ -0,0 +1,27 @@
+#
+# Configuration file for powerpc G4 (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+USE_NO_POINTERS =
+LARGE_FILE =
+CC_A32 = -mcpu=G4 -mtune=G4
+#
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DPOWERPC
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fdefault-real-8 -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -Dgfortran -DPOWERPC
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.ppcR64.in b/config/config.ppcR64.in
new file mode 100755
index 0000000..a6d74b8
--- /dev/null
+++ b/config/config.ppcR64.in
@@ -0,0 +1,27 @@
+#
+# Configuration file for powerpc G4 (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+USE_NO_POINTERS =
+LARGE_FILE =
+CC_A32 = -mcpu=G4 -mtune=G4
+#
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DPOWERPC -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fdefault-real-8 -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -Dgfortran -DPOWERPC -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.ppcR64_G5 b/config/config.ppcR64_G5
new file mode 100755
index 0000000..b09434f
--- /dev/null
+++ b/config/config.ppcR64_G5
@@ -0,0 +1,26 @@
+#
+# Configuration file for powerpc G5 (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+USE_NO_POINTERS = -DPOINTER_64
+LARGE_FILE =
+CC_A32 = -mcpu=G5 -mtune=G5
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 -DPOINTER_64 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DPOWERPC
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fdefault-real-8 -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT -Dgfortran -DPOWERPC
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.ppcR64_G5.in b/config/config.ppcR64_G5.in
new file mode 100755
index 0000000..715780b
--- /dev/null
+++ b/config/config.ppcR64_G5.in
@@ -0,0 +1,26 @@
+#
+# Configuration file for powerpc G5 (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+USE_NO_POINTERS = -DPOINTER_64
+LARGE_FILE =
+CC_A32 = -mcpu=G5 -mtune=G5
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 -DPOINTER_64 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DPOWERPC -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fdefault-real-8 -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT -Dgfortran -DPOWERPC -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.ppc_G5 b/config/config.ppc_G5
new file mode 100755
index 0000000..aaf2537
--- /dev/null
+++ b/config/config.ppc_G5
@@ -0,0 +1,26 @@
+#
+# Configuration file for powerpc G5 (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+CC_A32 = -mcpu=G5 -mtune=G5
+USE_NO_POINTERS = -DPOINTER_64
+LARGE_FILE =
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DPOINTER_64 -DINTEGER_IS_INT $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DPOWERPC
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fcray-pointer -fno-second-underscore -Dlinux -DINTEGER_IS_INT $(USE_NO_POINTERS) -Dgfortran -DPOWERPC
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.ppc_G5.in b/config/config.ppc_G5.in
new file mode 100755
index 0000000..60be9b9
--- /dev/null
+++ b/config/config.ppc_G5.in
@@ -0,0 +1,26 @@
+#
+# Configuration file for powerpc G5 (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+CC_A32 = -mcpu=G5 -mtune=G5
+USE_NO_POINTERS = -DPOINTER_64
+LARGE_FILE =
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DPOINTER_64 -DINTEGER_IS_INT $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DPOWERPC -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fcray-pointer -fno-second-underscore -Dlinux -DINTEGER_IS_INT $(USE_NO_POINTERS) -Dgfortran -DPOWERPC -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.ppc_g95.in b/config/config.ppc_g95.in
new file mode 100755
index 0000000..6549cba
--- /dev/null
+++ b/config/config.ppc_g95.in
@@ -0,0 +1,25 @@
+#
+# Configuration file for powerpc G4 (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG = -g -O2
+#
+LARGE_FILE =
+#
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) -mcpu=G4 -mtune=G4 -DPOWERPC
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g95
+FFLAGS = $(DEBUG) -fno-second-underscore -DPOWERPC -mcpu=G4 -mtune=G4 -fsloppy-char -Dlinux -DUSE_NO_POINTERS -fzeros -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.ppc_g95R64.in b/config/config.ppc_g95R64.in
new file mode 100755
index 0000000..165f1a0
--- /dev/null
+++ b/config/config.ppc_g95R64.in
@@ -0,0 +1,25 @@
+#
+# Configuration file for powerpc G4 (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE =
+#
+DEBUG = -g -O2
+#
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DREAL_8 -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) -mcpu=G4 -mtune=G4 -DPOWERPC
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g95
+FFLAGS = $(DEBUG) -fno-second-underscore -r8 -i4 -DPOWERPC -mcpu=G4 -mtune=G4 -fsloppy-char -Dlinux -DUSE_NO_POINTERS -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.ppc_g95R64_G5.in b/config/config.ppc_g95R64_G5.in
new file mode 100755
index 0000000..67e7008
--- /dev/null
+++ b/config/config.ppc_g95R64_G5.in
@@ -0,0 +1,25 @@
+#
+# Configuration file for powerpc G5 (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE =
+#
+DEBUG = -g -O2
+#
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) -mcpu=G5 -mtune=G5 -DREAL_8 -DINTEGER_IS_INT -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) -DPOWERPC
+FASTCFLAGS = $(DEBUG)
+#
+FC = g95
+FFLAGS = $(DEBUG) -fno-second-underscore -r8 -i4 -mcpu=G5 -mtune=G5 -Dlinux -fsloppy-char -DUSE_NO_POINTERS -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\" -DPOWERPC
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.ppc_g95_G5.in b/config/config.ppc_g95_G5.in
new file mode 100755
index 0000000..6c97d00
--- /dev/null
+++ b/config/config.ppc_g95_G5.in
@@ -0,0 +1,25 @@
+#
+# Configuration file for darwin (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG = -g -O2
+#
+LARGE_FILE =
+#
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DINTEGER_IS_INT -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE) -mcpu=G5 -mtune=G5 -DPOWERPC
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g95
+FFLAGS = $(DEBUG) -DINTEGER_IS_INT -DPOWERPC -fno-second-underscore -fsloppy-char -mcpu=G5 -mtune=G5 -Dlinux -DUSE_NO_POINTERS -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.ppc_gfortran.in b/config/config.ppc_gfortran.in
new file mode 100755
index 0000000..3ee94ec
--- /dev/null
+++ b/config/config.ppc_gfortran.in
@@ -0,0 +1,28 @@
+#
+# Configuration file for powerpc G4 (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+CC_A32 = -mcpu=G4 -mtune=G4
+USE_NO_POINTERS =
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+#
+#
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DPOWERPC -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -Dgfortran -DPOWERPC -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.ppc_gfortranR64.in b/config/config.ppc_gfortranR64.in
new file mode 100755
index 0000000..386ac7b
--- /dev/null
+++ b/config/config.ppc_gfortranR64.in
@@ -0,0 +1,27 @@
+#
+# Configuration file for powerpc G4 (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+USE_NO_POINTERS =
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+CC_A32 = -mcpu=G4 -mtune=G4
+#
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DPOWERPC -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fdefault-real-8 -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -Dgfortran -DPOWERPC -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.ppc_gfortranR64_G5.in b/config/config.ppc_gfortranR64_G5.in
new file mode 100755
index 0000000..2877b50
--- /dev/null
+++ b/config/config.ppc_gfortranR64_G5.in
@@ -0,0 +1,26 @@
+#
+# Configuration file for powerpc G5 (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+USE_NO_POINTERS = -DPOINTER_64
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+CC_A32 = -mcpu=G5 -mtune=G5
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DREAL_8 -DPOINTER_64 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DPOWERPC -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fdefault-real-8 -fcray-pointer -fno-second-underscore -Dlinux $(USE_NO_POINTERS) -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DINTEGER_IS_INT -Dgfortran -DPOWERPC -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.ppc_gfortran_G5.in b/config/config.ppc_gfortran_G5.in
new file mode 100755
index 0000000..2939382
--- /dev/null
+++ b/config/config.ppc_gfortran_G5.in
@@ -0,0 +1,26 @@
+#
+# Configuration file for powerpc G5 (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+PROFILE=
+DEBUG = -O2
+CC_A32 = -mcpu=G5 -mtune=G5
+USE_NO_POINTERS = -DPOINTER_64
+LARGE_FILE = -Dlinux -DFOPEN64 -D_LARGEFILE64_SOURCE
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(PROFILE) -DPOINTER_64 -DINTEGER_IS_INT $(CC_A32) $(LOCAL_CFLAGS) $(LARGE_FILE) -DPOWERPC -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = gfortran
+FFLAGS = $(DEBUG) $(PROFILE) $(CC_A32) -fcray-pointer -fno-second-underscore -Dlinux -DINTEGER_IS_INT $(USE_NO_POINTERS) -Dgfortran -DPOWERPC -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.rs6000 b/config/config.rs6000
new file mode 100755
index 0000000..47eef4e
--- /dev/null
+++ b/config/config.rs6000
@@ -0,0 +1,24 @@
+#
+# Configuration file for rs6000.
+#
+AR = ar
+ARFLAGS = rv
+#
+SHAREDMEM = -DSHAREDMEMORY
+PROFILE=
+DEBUG=-O3
+#
+UNDERSCORE=with
+#
+include ../config/fortran_underscore$(UNDERSCORE)
+
+CC = cc
+CFLAGS = $(DEBUG) $(PROFILE) -qstrict -qarch=pwr3 -qtune=pwr3 $(SHAREDMEM) $(UNDERSCORE_CFLAGS) -DIBM -Drs6000
+FASTCFLAGS = $(CFLAGS)
+#
+FC = xlf
+FFLAGS = $(DEBUG) $(PROFILE) $(UNDERSCORE_FFLAGS) -qstrict -qarch=pwr3 -qtune=pwr3
+VECTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.rs6000.in b/config/config.rs6000.in
new file mode 100755
index 0000000..2e4fd44
--- /dev/null
+++ b/config/config.rs6000.in
@@ -0,0 +1,22 @@
+#
+# Configuration file for rs6000.
+#
+AR = ar
+ARFLAGS = rv
+#
+SHAREDMEM = -DSHAREDMEMORY
+#
+UNDERSCORE=with
+#
+include ../config/fortran_underscore$(UNDERSCORE)
+
+CC = cc
+CFLAGS = -g -O3 -qstrict -qarch=pwr3 -qtune=pwr3 $(SHAREDMEM) $(UNDERSCORE_CFLAGS) -DIBM -Drs6000 -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = xlf
+FFLAGS = -g -O3 $(UNDERSCORE_FFLAGS) -qstrict -qarch=pwr3 -qtune=pwr3 -WF,-DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.rs6000A64 b/config/config.rs6000A64
new file mode 100755
index 0000000..5b9d8c9
--- /dev/null
+++ b/config/config.rs6000A64
@@ -0,0 +1,27 @@
+#
+# Configuration file for rs6000 (32-bit REALs).
+#
+AR = ar
+ARFLAGS = -r -v -X64
+PROFILE=
+DEBUG=-O3
+#
+SHAREDMEM = -DSHAREDMEMORY
+#
+UNDERSCORE=with
+include ../config/fortran_underscore$(UNDERSCORE)
+#
+CC = xlc_r
+CFLAGS = $(DEBUG) $(PROFILE) $(SHAREDMEM) -qstrict -q64 -qarch=auto -qtune=auto -DIBM -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DFOPEN64
+
+FASTCFLAGS = $(DEBUG) $(PROFILE) -qstrict -q64 -qarch=auto -qtune=auto -DIBM -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64
+#
+FC = xlf90_r
+CPPFLAGS=-DIBM,-Drs6000,-DPOINTER_64,-DINTEGER_IS_INT,-DIBM_POWER4,-DSHAREDMEMORY,-DFOPEN64
+
+FFLAGS = -qsigtrap $(DEBUG) $(PROFILE) $(UNDERSCORE_FFLAGS) -qstrict -q64 -qextname -qarch=auto -qtune=auto -qwarn64 -qrealsize=4 -qintsize=4 -qalign=4k -qnosource -qfixed=72 -qintlog
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.rs6000A64.in b/config/config.rs6000A64.in
new file mode 100755
index 0000000..cd94dca
--- /dev/null
+++ b/config/config.rs6000A64.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for rs6000 (32-bit REALs).
+#
+AR = ar
+ARFLAGS = -r -v -X64
+PROFILE=
+DEBUG=-O3
+#
+CC = xlc_r
+
+
+CFLAGS = $(DEBUG) $(PROFILE) -qstrict -q64 -qarch=auto -qtune=auto -DIBM -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64 -DTABLE_PATH=\"emos\"
+
+FASTCFLAGS = $(DEBUG) $(PROFILE) -qstrict -q64 -qarch=auto -qtune=auto -DIBM -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64 -DTABLE_PATH=\"emos\"
+#
+FC = xlf90_r
+CPPFLAGS=-DIBM,-Drs6000,-DPOINTER_64,-DINTEGER_IS_INT,-DIBM_POWER4,-DSHAREDMEMORY,-DFOPEN64
+
+FFLAGS = -qsigtrap $(DEBUG) $(PROFILE) -qstrict -q64 -qextname -qarch=auto -qtune=auto -qwarn64 -qrealsize=4 -qintsize=4 -qalign=4k -qnosource -qfixed=72 -qintlog -WF,-DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.rs6000R64 b/config/config.rs6000R64
new file mode 100755
index 0000000..0503de0
--- /dev/null
+++ b/config/config.rs6000R64
@@ -0,0 +1,25 @@
+#
+# Configuration file for rs6000 (64-bit REALs).
+#
+AR = ar
+ARFLAGS = rv
+#
+SHAREDMEM = -DSHAREDMEMORY
+#
+UNDERSCORE=with
+PROFILE=
+DEBUG=-O3
+#
+include ../config/fortran_underscore$(UNDERSCORE)
+#
+#
+CC = cc
+CFLAGS = $(DEBUG) $(PROFILE) $(SHAREDMEM) -DREAL_BIGGER_THAN_INTEGER -DREAL_8 $(UNDERSCORE_CFLAGS) -DIBM -Drs6000 -qstrict -qarch=pwr3 -qtune=pwr3 -DFOPEN64
+FASTCFLAGS = $(CFLAGS)
+#
+FC = xlf
+FFLAGS = $(DEBUG) $(PROFILE) $(UNDERSCORE_FFLAGS) -qrealsize=8 -qintsize=4 -qalign=4k -qnosource -qstrict -qarch=pwr3 -qtune=pwr3
+VECTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.rs6000R64.in b/config/config.rs6000R64.in
new file mode 100755
index 0000000..a6c78dc
--- /dev/null
+++ b/config/config.rs6000R64.in
@@ -0,0 +1,20 @@
+#
+# Configuration file for rs6000 (64-bit REALs).
+#
+AR = ar
+ARFLAGS = rv
+#
+SHAREDMEM = -DSHAREDMEMORY
+#
+DEBUG = -O3
+#
+CC = cc
+CFLAGS = $(SHAREDMEM) $(DEBUG) -DREAL_BIGGER_THAN_INTEGER -DREAL_8 -DIBM -Drs6000 -qstrict -qarch=pwr3 -qtune=pwr3 -DFOPEN64 -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = xlf
+FFLAGS = $(DEBUG) -qextname -qrealsize=8 -qintsize=4 -qalign=4k -qnosource -qstrict -qarch=pwr3 -qtune=pwr3 -WF,-DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.rs6000R64A64 b/config/config.rs6000R64A64
new file mode 100755
index 0000000..60b5754
--- /dev/null
+++ b/config/config.rs6000R64A64
@@ -0,0 +1,28 @@
+#
+# Configuration file for rs6000 (64-bit REALs).
+#
+AR = ar
+ARFLAGS = -r -v -X64
+#
+SHAREDMEM = -DSHAREDMEMORY
+#
+UNDERSCORE=with
+PROFILE=
+DEBUG=-O3
+#
+include ../config/fortran_underscore$(UNDERSCORE)
+#
+CC = xlc_r
+CFLAGS = $(DEBUG) $(PROFILE) $(SHAREDMEM) -qstrict -q64 -qarch=auto -qtune=auto -DREAL_BIGGER_THAN_INTEGER -DREAL_8 -DIBM -DIBM_POWER4 -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DFOPEN64
+
+FASTCFLAGS = $(DEBUG) -qstrict -qinline -q64 -qarch=auto -qtune=auto -DREAL_BIGGER_THAN_INTEGER -DREAL_8 -DIBM -DIBM_POWER4 -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64
+#
+FC = xlf90_r
+CPPFLAGS=-DREAL_BIGGER_THAN_INTEGER,-DREAL_8,-DIBM,-Drs6000,-DPOINTER_64,-DINTEGER_IS_INT,-DIBM_POWER4,-DSHAREDMEMORY,-DFOPEN64
+
+FFLAGS = -qsigtrap $(DEBUG) $(PROFILE) $(UNDERSCORE_FFLAGS) -qstrict -q64 -qarch=auto -qtune=auto -qwarn64 -qrealsize=8 -qintsize=4 -qalign=4k -qsource -qfixed=72 -qintlog
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.rs6000R64A64.in b/config/config.rs6000R64A64.in
new file mode 100755
index 0000000..61761a7
--- /dev/null
+++ b/config/config.rs6000R64A64.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for rs6000 (64-bit REALs).
+#
+AR = ar
+ARFLAGS = -r -v -X64
+#
+CC = xlc_r
+PROFILE=
+DEBUG=-O3
+
+
+CFLAGS = $(DEBUG) -qstrict -q64 -qarch=auto -qtune=auto -DREAL_BIGGER_THAN_INTEGER -DREAL_8 -DIBM -DIBM_POWER4 -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64 -DTABLE_PATH=\"emos\"
+
+FASTCFLAGS = $(DEBUG) -qstrict -qinline -q64 -qarch=auto -qtune=auto -DREAL_BIGGER_THAN_INTEGER -DREAL_8 -DIBM -DIBM_POWER4 -Drs6000 -DPOINTER_64 -DINTEGER_IS_INT -DSHAREDMEMORY -DFOPEN64 -DTABLE_PATH=\"emos\"
+#
+FC = xlf90_r
+CPPFLAGS=-DREAL_BIGGER_THAN_INTEGER,-DREAL_8,-DIBM,-Drs6000,-DPOINTER_64,-DINTEGER_IS_INT,-DIBM_POWER4,-DSHAREDMEMORY,-DFOPEN64
+
+FFLAGS = -qsigtrap $(DEBUG) -qstrict -q64 -qarch=auto -qtune=auto -qwarn64 -qrealsize=8 -qintsize=4 -qalign=4k -qsource -qfixed=72 -qintlog -WF,-DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+NOOPTFFLAGS = $(FFLAGS)
+#
+RANLIB = /bin/ranlib
+CT = /bin/true
diff --git a/config/config.sgimips b/config/config.sgimips
new file mode 100755
index 0000000..f111869
--- /dev/null
+++ b/config/config.sgimips
@@ -0,0 +1,28 @@
+#
+# Configuration file for sgimips (32-bit reals).
+#
+#
+.SUFFIXES: .o .c .F
+#
+AR = ar
+ARFLAGS = rv
+RANLIB = /bin/true
+CT = cleartool
+#
+CFLAGS = $(DEBUG)
+FASTCFLAGS = $(DEBUG)
+#
+FC = f77
+FFLAGS = $(DEBUG)
+VECTFFLAGS = $(DEBUG)
+#
+#
+# 32-bit reals (default).
+#
+.F.o:
+ rm -f $@
+ $(FC) $(FFLAGS) -c $<
+.c.o:
+ rm -f $@
+ $(CC) $(CFLAGS) -c $<
+#
diff --git a/config/config.sgimips.in b/config/config.sgimips.in
new file mode 100755
index 0000000..e3d80da
--- /dev/null
+++ b/config/config.sgimips.in
@@ -0,0 +1,28 @@
+#
+# Configuration file for sgimips (32-bit reals).
+#
+#
+.SUFFIXES: .o .c .F
+#
+AR = ar
+ARFLAGS = rv
+RANLIB = /bin/true
+CT = cleartool
+#
+CFLAGS = $(DEBUG) -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = f77
+FFLAGS = $(DEBUG) -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(DEBUG)
+#
+#
+# 32-bit reals (default).
+#
+.F.o:
+ rm -f $@
+ $(FC) $(FFLAGS) -c $<
+.c.o:
+ rm -f $@
+ $(CC) $(CFLAGS) -c $<
+#
diff --git a/config/config.sgimipsR64 b/config/config.sgimipsR64
new file mode 100755
index 0000000..90a0f57
--- /dev/null
+++ b/config/config.sgimipsR64
@@ -0,0 +1,29 @@
+#
+# Configuration file for sgimips (64-bit reals).
+#
+#
+.SUFFIXES: .o .c .F
+#
+AR = ar
+ARFLAGS = rv
+RANLIB = /bin/true
+CT = cleartool
+#
+CFLAGS = $(DEBUG) -DREAL_8
+FASTCFLAGS = $(DEBUG) -DREAL_8
+#
+FC = f77
+FFLAGS = -align64 -r8 -DREAL_8 -DREAL_BIGGER_THAN_INTEGER $(DEBUG)
+VECTFFLAGS = $(FFLAGS)
+#
+# |
+# v
+# 64-bit reals.
+#
+.F.o:
+ rm -f $@
+ $(FC) $(FFLAGS) -c $<
+.c.o:
+ rm -f $@
+ $(CC) $(CFLAGS) -c $<
+#
diff --git a/config/config.sgimipsR64.in b/config/config.sgimipsR64.in
new file mode 100755
index 0000000..0fa71d8
--- /dev/null
+++ b/config/config.sgimipsR64.in
@@ -0,0 +1,29 @@
+#
+# Configuration file for sgimips (64-bit reals).
+#
+#
+.SUFFIXES: .o .c .F
+#
+AR = ar
+ARFLAGS = rv
+RANLIB = /bin/true
+CT = cleartool
+#
+CFLAGS = $(DEBUG) -DREAL_8 -DTABLE_PATH=\"emos\"
+FASTCFLAGS = $(CFLAGS)
+#
+FC = f77
+FFLAGS = -align64 -r8 -DREAL_8 -DREAL_BIGGER_THAN_INTEGER $(DEBUG) -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+#
+# |
+# v
+# 64-bit reals.
+#
+.F.o:
+ rm -f $@
+ $(FC) $(FFLAGS) -c $<
+.c.o:
+ rm -f $@
+ $(CC) $(CFLAGS) -c $<
+#
diff --git a/config/config.sun4 b/config/config.sun4
new file mode 100755
index 0000000..efa02eb
--- /dev/null
+++ b/config/config.sun4
@@ -0,0 +1,16 @@
+#
+# Configuration file for sun4.
+#
+AR = ar
+ARFLAGS = rv
+#
+CC = cc
+CFLAGS =
+FASTCFLAGS = -O
+#
+FC = f90
+FFLAGS = -f77 -ftrap=%none
+VECTFFLAGS = $(FFLAGS)
+#
+RANLIB = /usr/bin/ranlib
+CT = /bin/true
diff --git a/config/config.sun4.in b/config/config.sun4.in
new file mode 100755
index 0000000..7907f27
--- /dev/null
+++ b/config/config.sun4.in
@@ -0,0 +1,16 @@
+#
+# Configuration file for sun4.
+#
+AR = ar
+ARFLAGS = rv
+#
+CC = cc
+CFLAGS = -DTABLE_PATH=\"emos\"
+FASTCFLAGS = -O -DTABLE_PATH=\"emos\"
+#
+FC = f90
+FFLAGS = -f77 -ftrap=%none -O1 -g -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+#
+RANLIB = /usr/bin/ranlib
+CT = /bin/true
diff --git a/config/config.sun4R64 b/config/config.sun4R64
new file mode 100755
index 0000000..768b368
--- /dev/null
+++ b/config/config.sun4R64
@@ -0,0 +1,16 @@
+#
+# Configuration file for sun4. (64-bit REALs)
+#
+AR = ar
+ARFLAGS = rv
+#
+CC = cc
+CFLAGS = -DREAL_8
+FASTCFLAGS = -O -DREAL_8
+#
+FC = f90
+FFLAGS = -f77 -ftrap=%none -dalign -xtypemap=real:64,double:64,integer:32 -DREAL_8 -DR64 -DREAL_BIGGER_THAN_INTEGER
+VECTFFLAGS = $(FFLAGS)
+#
+RANLIB = /usr/bin/ranlib
+CT = /bin/true
diff --git a/config/config.sun4R64.in b/config/config.sun4R64.in
new file mode 100755
index 0000000..515905b
--- /dev/null
+++ b/config/config.sun4R64.in
@@ -0,0 +1,16 @@
+#
+# Configuration file for sun4. (64-bit REALs)
+#
+AR = ar
+ARFLAGS = rv
+#
+CC = cc
+CFLAGS = -DREAL_8 -DTABLE_PATH=\"emos\"
+FASTCFLAGS = -O -DREAL_8 -DTABLE_PATH=\"emos\"
+#
+FC = f90
+FFLAGS = -f77 -ftrap=%none -dalign -O1 -g -xtypemap=real:64,double:64,integer:32 -DREAL_8 -DR64 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+#
+RANLIB = /usr/bin/ranlib
+CT = /bin/true
diff --git a/config/config.sun4_gnu b/config/config.sun4_gnu
new file mode 100755
index 0000000..125b827
--- /dev/null
+++ b/config/config.sun4_gnu
@@ -0,0 +1,24 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -DFOPEN64
+#
+DEBUG =
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g77
+FFLAGS = $(DEBUG) -fno-second-underscore -Dlinux -DUSE_NO_POINTERS
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.sun4_gnu.in b/config/config.sun4_gnu.in
new file mode 100755
index 0000000..1a0d0e8
--- /dev/null
+++ b/config/config.sun4_gnu.in
@@ -0,0 +1,23 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG =
+#
+LARGE_FILE = -DFOPEN64
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g77
+FFLAGS = $(DEBUG) -fno-second-underscore -Dlinux -DUSE_NO_POINTERS -g -fzeros -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.sun4_gnuR64 b/config/config.sun4_gnuR64
new file mode 100755
index 0000000..63cafac
--- /dev/null
+++ b/config/config.sun4_gnuR64
@@ -0,0 +1,24 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+DEBUG =
+#
+LARGE_FILE = -DFOPEN64
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g77
+FFLAGS = $(DEBUG) -fno-second-underscore -Dlinux -DUSE_NO_POINTERS -DREAL_8 -DREAL_BIGGER_THAN_INTEGER
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.sun4_gnuR64.in b/config/config.sun4_gnuR64.in
new file mode 100755
index 0000000..c05fbf8
--- /dev/null
+++ b/config/config.sun4_gnuR64.in
@@ -0,0 +1,24 @@
+#
+# Configuration file for linux (32-bit reals).
+#
+AR = ar
+ARFLAGS = rv
+#
+LARGE_FILE = -DFOPEN64
+#
+DEBUG =
+#
+#
+CC = gcc
+CFLAGS = $(DEBUG) -DREAL_8 -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = g77
+FFLAGS = $(DEBUG) -fno-second-underscore -Dlinux -DUSE_NO_POINTERS -DREAL_8 -DREAL_BIGGER_THAN_INTEGER -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /usr/bin/ranlib
+
diff --git a/config/config.super-uxR64.in b/config/config.super-uxR64.in
new file mode 100755
index 0000000..93d9318
--- /dev/null
+++ b/config/config.super-uxR64.in
@@ -0,0 +1,23 @@
+#
+# Configuration file for NEC SX cross-compiler (64-bit reals).
+#
+AR = sxar
+ARFLAGS = -rv
+#
+DEBUG =
+LARGE_FILE =
+#
+#
+CC = sxmpicc
+CFLAGS = $(DEBUG) -Chopt -pi auto -pvctl,fullmsg,loopcnt=1000000 -DINTEGER_IS_INT -DNECSX -USX -DMPI -DREAL_8 -DR64 -DREENTRANT -DTABLE_PATH=\"emos\" $(LOCAL_CFLAGS) $(LARGE_FILE)
+FASTCFLAGS = $(CFLAGS)
+#
+FC = sxmpif90
+FFLAGS = $(DEBUG) -Pstack -C hopt -Wf,-pvctl,noassume,loopcnt=1000000 -eb -Wf"-L fmtlist transform -pvctl fullmsg -ptr byte -pvctl vwork=stack -O extendreorder" -DNECSX -USX -DMPI -DREAL_8 -DR64 -DREAL_BIGGER_THAN_INTEGER -Wf"-A idbl4" -DTABLE_PATH=\"emos\"
+VECTFFLAGS = $(FFLAGS)
+# |
+# v
+# 32-bit reals
+#
+RANLIB = /bin/true
+LDFLAGS =
diff --git a/config/fortran2c b/config/fortran2c
new file mode 100755
index 0000000..96159e6
--- /dev/null
+++ b/config/fortran2c
@@ -0,0 +1,7 @@
+
+#FORTRAN2C = -lpgf90 -lpgf90_rpm1 -lpgf902 -lpgf90rtl -lpgftnrtl -lpghpf -lpgc -lpgf90 -lc
+FORTRAN2C = -L/usr/local/apps/pgi/pgi-5.2-4/linux86/lib -lpgftnrtl -lnspgc -lpgc -lgcc -lc -lndbm -lm
+FORTRAN2C = -pgf77libs -pgf90libs -lpgftnrtl -lnspgc -lpgc -lgcc -lc -lndbm -lm
+
+# for ECMWF only
+#-L/usr/local/apps/pgi/pgi-5.2-4/linux86/lib
diff --git a/config/fortran2c_g95 b/config/fortran2c_g95
new file mode 100755
index 0000000..5e73a88
--- /dev/null
+++ b/config/fortran2c_g95
@@ -0,0 +1,3 @@
+
+FORTRAN2C = -lf95 -lgcc
+
diff --git a/config/fortran2c_gfortran b/config/fortran2c_gfortran
new file mode 100755
index 0000000..680ee4c
--- /dev/null
+++ b/config/fortran2c_gfortran
@@ -0,0 +1,3 @@
+
+FORTRAN2C = -lgfortran
+
diff --git a/config/fortran2c_gnu b/config/fortran2c_gnu
new file mode 100755
index 0000000..c121126
--- /dev/null
+++ b/config/fortran2c_gnu
@@ -0,0 +1,3 @@
+
+FORTRAN2C = -lg2c -lgcc
+
diff --git a/config/fortran_underscore b/config/fortran_underscore
new file mode 100755
index 0000000..766b028
--- /dev/null
+++ b/config/fortran_underscore
@@ -0,0 +1,2 @@
+UNDERSCORE_CFLAGS=-DFORTRAN_NO_UNDERSCORE
+UNDERSCORE_FFLAGS= -qnoextname
diff --git a/config/fortran_underscorewith b/config/fortran_underscorewith
new file mode 100755
index 0000000..7f913e0
--- /dev/null
+++ b/config/fortran_underscorewith
@@ -0,0 +1,2 @@
+UNDERSCORE_CFLAGS=
+UNDERSCORE_FFLAGS= -qextname
diff --git a/crexdc/Makefile b/crexdc/Makefile
new file mode 100755
index 0000000..97e8578
--- /dev/null
+++ b/crexdc/Makefile
@@ -0,0 +1,30 @@
+#
+# Makefile for crexdc
+#
+LIBRARY = ../lib$(LIB)$(R64).a
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+TARGETS = all clean
+#
+include sources
+#
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.f = $(SOURCES.f:.f=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.F) $(OBJECTS.f) $(OBJECTS.c)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+#$(LIBRARY) : $(LIBRARY)($(OBJECTS))
+$(LIBRARY): $(OBJECTS)
+ $(AR) $(ARFLAGS) $@ $?
+ $(RANLIB) $@
+
+clean:
+ \rm -f $(OBJECTS) *.f
diff --git a/crexdc/Makefile.in b/crexdc/Makefile.in
new file mode 100755
index 0000000..ff20c0d
--- /dev/null
+++ b/crexdc/Makefile.in
@@ -0,0 +1,35 @@
+#
+# Makefile for crexdc
+#
+A64 = plat
+R64 = reals
+ARCH = arch
+CNAME = comp
+LIB = depl
+#
+LIBRARY = ../lib$(LIB)$(R64).a
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+TARGETS = all clean
+#
+include sources
+#
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.f = $(SOURCES.f:.f=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.F) $(OBJECTS.f) $(OBJECTS.c)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+$(LIBRARY): $(OBJECTS)
+ $(AR) $(ARFLAGS) $@ $?
+ $(RANLIB) $@
+
+clean:
+ \rm -f $(OBJECTS) *.f
diff --git a/crexdc/Makefile.shared b/crexdc/Makefile.shared
new file mode 100755
index 0000000..c44375a
--- /dev/null
+++ b/crexdc/Makefile.shared
@@ -0,0 +1,30 @@
+#
+# Makefile for crexdc
+#
+LIBRARY = ../lib$(LIB)$(R64).so
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+PROFILE=$(SHLIB)
+#
+TARGETS = all clean
+#
+include sources
+#
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.f = $(SOURCES.f:.f=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.F) $(OBJECTS.f) $(OBJECTS.c)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+$(LIBRARY): $(OBJECTS) $(EXTRAOBJ)
+ $(LD) $(DYNLINKFLAGS) $? -o $@
+
+clean:
+ \rm -f $(OBJECTS) *.f
diff --git a/crexdc/crex_get_name_unit.F b/crexdc/crex_get_name_unit.F
new file mode 100755
index 0000000..c0c1167
--- /dev/null
+++ b/crexdc/crex_get_name_unit.F
@@ -0,0 +1,103 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREX_GET_NAME_UNIT(KREFERENCE,YNAME,YUNIT)
+C
+C**** *CREX_GET_NAME_UNIT*
+
+C
+C
+C PURPOSE.
+C --------
+C FIND NAME AND THE UNIT FOR THE PARTICULAR REFERENCE NUMBER.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREX_GET_NAME_UNIT(KREFERENCE,YNAME,YUNIT)*
+C
+C
+C INPUT : *KREFERENCE* - TABLE B REFERENCE NUMBER
+C OUTPUT:
+C *CNAMES* - ARRAY CONTAINING ELEMENT NAMES
+C *CUNITS* - ARRAY CONTAINING ELEMENT UNITS
+C
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/01/2006.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+
+C
+ CHARACTER*64 YNAME
+ CHARACTER*24 YUNIT
+C
+C
+ COMMON/CREXTAB/ NCREXBR(JTAB),NCREXBS(JTAB) , NCREXBDW(JTAB),
+ 1 NCREXDR(JTAB),NCREXDST(JTAB) ,
+ 2 NCREXDL(JTAB),NCREXDSQ(JTAB*20),NCREXP(64,255)
+
+C
+C NCREXBR - table B, table reference array
+C NCREXBS - table B, scale array
+C NCREXBDW - table B, data width array
+C NCREXDR - table D, table reference array
+C NCREXDST - table D, starting pointers array
+C NCREXDL - table D, lengths array
+C NCREXDSQ - table D, list of sequence descriptors array
+C
+ COMMON/CREXTABC/ CREXNAME(JTAB),CREXUNIT(JTAB),CREXLST(JELEM)
+C
+C CREXNAME - table B, ELEMENT NAME array
+C CREXUNIT - table B, unit array
+C
+ CHARACTER CREXNAME*64,CREXUNIT*24
+ CHARACTER*6 CREXLST
+C
+ ICLASS=KREFERENCE/1000
+ IYYY =KREFERENCE-ICLASS*1000+1
+ ICLASS=ICLASS+1
+C
+ I=NCREXP(ICLASS,IYYY)
+ YNAME=CREXNAME(I)
+ YUNIT=CREXUNIT(I)
+C
+ RETURN
+ END
diff --git a/crexdc/crexdes.F b/crexdc/crexdes.F
new file mode 100755
index 0000000..ed83542
--- /dev/null
+++ b/crexdc/crexdes.F
@@ -0,0 +1,265 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXDES(K,KSEC1,KTDLEN,CREXKTDLST,KDLEN,KDATA,KELEM,
+ 1 KTDEXL,CREXKTDEXP,CNAMES,CUNITS,KERR)
+C
+C**** *CREXDES*
+C
+C
+C PURPOSE.
+C --------
+C EXPAND DATA DESCRIPTORS TO SHOW USER TEMPLATE
+C DESCRIBED BY ARRAY KTDLST AND KDATA
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXDES(K,KSEC1,KTDLEN,CREXKTDLST,KDLEN,KDATA,KELEM,
+C KTDEXL,CREXKTDEXP,CNAMES,CUNITS,KERR)*
+C
+C
+C
+C INPUT :
+C *K* - AN INTEGER, PRINTING SWITCH 0 - NO PRINT
+C 1 - PRINT
+C *KSEC1* - Integer array of at least 40 words
+C containing CREX section 1 information
+C KSEC1( 1)-- Reserved
+C KSEC1( 2)-- CREX Edition number
+C KSEC1( 3)-- Reserved
+C KSEC1( 4)-- Reserved
+C KSEC1( 5)-- Reserved
+C KSEC1( 6)-- CREX message type
+C KSEC1( 7)-- Reserved
+C KSEC1( 8)-- version number of local table used
+C KSEC1( 9)-- Reserved
+C KSEC1(10)-- Reserved
+C KSEC1(11)-- Reserved
+C KSEC1(12)-- Reserved
+C KSEC1(13)-- Reserved
+C KSEC1(14)-- CREX Master table
+C KSEC1(15)-- version number of Master table used
+C KSEC1(16) - KSEC1(40) -- Reserved
+C
+C Crex Edition 2
+C
+C
+C *KSEC1* - Integer array of at least 40 words
+C containing CREX section 1 information
+C KSEC1( 1)-- Reserved
+C KSEC1( 2)-- CREX Edition number
+C KSEC1( 3)-- Originating Centre ( oooo)
+C KSEC1( 4)-- Update sequence number (uu)
+C KSEC1( 5)-- Number of subsets (sss)
+C KSEC1( 6)-- CREX data category (nnn)
+C KSEC1( 7)-- International data sub-category (mmm)
+C KSEC1( 8)-- version number of local table used
+C KSEC1( 9)-- Year (yyyy)
+C KSEC1(10)-- Month (mm)
+C KSEC1(11)-- Day (dd)
+C KSEC1(12)-- Hour (hh)
+C KSEC1(13)-- Minute (mm)
+C KSEC1(14)-- CREX Master table (tt)
+C KSEC1(15)-- version number of Master table used (vv)
+C KSEC1(16)-- Originating sub-centre (ppp)
+C KSEC1(17)-- Bufr master table version number
+C KSEC1(18)-- Bufr version number of local table used
+C KSEC1(19) - KSEC1(40) -- Reserved
+C
+C
+C *KTDLEN* - Integer number of data descriptors in the list
+C *CREXKTDLST* Integer array of at least ktdlen words
+C *KDLEN* - Integer (dimension of kdata array)
+C *KDATA* - Integer array containing data needed for data
+C descriptor expansion (delayed replication factors)
+C which appear in the values array
+C *KELEM* -
+C OUTPUT:
+C
+C *KTDEXL - An integer containing number of expanded elements
+C
+C *KTDEXP* - An integer array containing expanded list of descriptors
+C
+C *CNAMES* - Character*64 array of KELEM containing
+C CREX Table B element names
+C *CUNITS* - Character*24 array of KELEM containig
+C CREX Table B units
+C *VALUES* - Real*8 array of KVALS containing expanded
+C data values
+C *KERR* - returned error code
+C
+C
+C
+C
+C METHOD.
+C -------
+C
+C NONE
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 04/02/2003.
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+
+
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+C
+ COMMON /CRWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+C
+ COMMON /CRWT/ NCREXDWINC,NCREXSCAM,NCREXAFDW,NCREXWT ,ODREPF,
+ 2 NCREXSTACK(JELEM),NCREXWTEN(JELEM),
+ 3 NCREXWTR (JELEM),NCREXWTS (JELEM),
+ 4 NCREXWTDW(JELEM)
+C
+C NCREXDWINC - data width increment
+C NCREXSCAM - scale multiplier
+C NCREXAFDW - augmented field data width
+C NCREXWT - pointer to working table
+C NCREXSTACK - list of data descriptors
+C ODREPF - replication (logical)
+C NCREXWTR - working table reference
+C NCREXWTS - working scale
+C NCREXWTDW - working data width
+C
+C
+C
+ COMMON /CRWTC/ CREXWTEN(JELEM),CREXWTU(JELEM)
+C
+C CREXWTEN - working table element naame
+C CREXWTU - working table units
+C
+ CHARACTER CREXWTEN*64,CREXWTU*24
+C
+ COMMON /CREL/ NCREXTDLEN,NCREXTDLST(JELEM),NCREXTDEXL,
+ 1 NCREXTDEXP(JELEM)
+C
+C NCREXTDLEN - number of Data descriptors in section 3
+C NCREXTDLST - list of Data descriptors
+C NCREXTDEXL - number of expanded Data Descriptors
+C NCREXTDEXP - list of expanded Data descriptors
+C
+ COMMON /CRBEF / M,MM,N,JCV
+C
+C M - Number of elements
+C MM - Number of elements
+C N - Number of data sub_sets
+C JCV - Number of character values
+
+ CHARACTER*15 FMT
+ CHARACTER*6 CREXKTDLST(KELEM)
+ CHARACTER*6 CREXKTDEXP(KELEM)
+C
+ INTEGER IVALUE(KELEM)
+C
+ INTEGER IVAL,IIVAL
+c
+ REAL*8 EPS
+ REAL*8 RVIND
+ REAL*8 VAL
+C
+ CHARACTER*64 CNAMES(kelem)
+ CHARACTER*24 CUNITS(kelem)
+
+ DIMENSION KSEC0(JSEC0),KSEC1(JSEC1)
+C
+ CHARACTER*4 CECMWF
+C
+C ------------------------------------------------------------------
+C
+c* 1. Set Constants
+c ----------------
+ 100 CONTINUE
+c
+ KERR=0
+ IF(CECMWF.NE.'ECMF') THEN
+ CALL CREXIVAR(KERR)
+ CECMWF='ECMF'
+ END IF
+c
+c* 2. Load Crex Tables
+c ----------------
+ 200 CONTINUE
+c
+ CALL CREXETAB(KSEC1,KERR)
+ IF(KERR.GT.0) RETURN
+
+c
+c* 3.1 Expand Data Descriptors
+c -----------------------
+c
+ 310 CONTINUE
+c
+ KPT=0
+ CALL CREXEDD(KPT,KTDLEN,CREXKTDLST,KDLEN,KDATA,KSEC3,
+ 1 KELEM,CNAMES,CUNITS,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ KTDEXL =M
+ DO 301 I=1,KTDEXL
+ WRITE(CREXKTDEXP(I),'(i6.6)') NCREXWTR(I)
+ IF(CREXKTDEXP(I)(1:1).EQ.'0') CREXKTDEXP(I)(1:1)="B"
+ 301 CONTINUE
+C
+ IF(K.EQ.1) THEN
+C
+ WRITE(*,'(1H ,//)')
+ WRITE(*,'(1H ,A)') ' DATA DESCRIPTORS (UNEXPANDED)'
+C
+ WRITE(*,'(1H )')
+ DO 110 I=1,KTDLEN
+ IF(CREXKTDLST(I)(1:1).EQ.'3') CREXKTDLST(I)(1:1)="D"
+ IF(CREXKTDLST(I)(1:1).EQ.'2') CREXKTDLST(I)(1:1)="C"
+ IF(CREXKTDLST(I)(1:1).EQ.'1') CREXKTDLST(I)(1:1)="R"
+ IF(CREXKTDLST(I)(1:1).EQ.'0') CREXKTDLST(I)(1:1)="B"
+ WRITE(*,'(1H ,I4,2X,A)') I,CREXKTDLST(I)
+ 110 CONTINUE
+C
+ WRITE(*,'(1H ,/)')
+ WRITE(*,'(1H ,A)') ' DATA DESCRIPTORS (EXPANDED)'
+ WRITE(*,'(1H )')
+ WRITE(*,'(1H ,A,A)')' ELEMENT NAME',
+ 1 ' UNIT'
+ WRITE(*,'(1H )')
+C
+ DO 120 I=1,KTDEXL
+ WRITE(*,'(1H ,I5,2X,A,2X,A,2X,A)') I,CREXKTDEXP(I),
+ 1 CNAMES(I)(1:40),CUNITS(I)(1:18)
+ 120 CONTINUE
+ END IF
+C
+C
+C -----------------------------------------------------------------
+ RETURN
+C
+ END
diff --git a/crexdc/crexedd.F b/crexdc/crexedd.F
new file mode 100755
index 0000000..aad8d56
--- /dev/null
+++ b/crexdc/crexedd.F
@@ -0,0 +1,309 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXEDD(KPT,KTDLEN,CREXLST,KDLEN,KDATA,KSEC3,
+ 1 KELEM,CNAMES,CUNITS,KERR)
+C
+C**** *CREXEDD*
+C
+C
+C PURPOSE.
+C --------
+C
+C Expand Crex data descriptors
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXETD( KPT,KTDLEN,CREXLST,KDLEN,KDATA,KSEC3,
+C KVALS,VALUES,KELEM,KERR)*
+C
+C INPUT :
+C *KPT* - POINTER TO KDATA ARRAY
+C *KTDLEN* - number of data descriptors in section 1
+C *KTDLST* - array containing data descriptors in section 1
+C *KDLEN* - DIMENSION OF KDATA ARRAY
+C *KDATA* - ARRAY CONTAINING DATA NEEDED FOR DESCRIPTOR
+C EXPANSION ( delayed replications)
+C *KSEC3* - Integer array of 4 words containing
+C
+C KSEC3( 1)-- Reserved
+C KSEC3( 2)-- Reserved
+C KSEC3( 3)-- number of subsets
+C KSEC3( 4)-- Reserved
+C data values
+C *KELEM* - dimension of CNAMES, CUNITS array
+C OUTPUT:
+C *KERR* - returned error code
+C
+C METHOD.
+C -------
+C
+C Expands list of data descriptors in section 1
+C of Crex message. Working tables for further data decoding are set,
+C list of Crex data descriptors and a list of expanded Crex data descriptors
+C according to table D reference are returned respectively.
+C
+C
+C
+
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C------------------------------------------------------------------------------------
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+C
+C
+ COMMON /CRWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+C
+ COMMON/CRTAB/ NCREXBR(JTAB),NCREXBS(JTAB) , NCREXBDW(JTAB),
+ 1 NCREXDR(JTAB),NCREXDST(JTAB) ,
+ 2 NCREXDL(JTAB),NCREXDSQ(JTAB*20),NCREXP(64,255)
+
+C
+C NCREXBR - table B, table reference array
+C NCREXBS - table B, scale array
+C NCREXBDW - table B, data width array
+C NCREXDR - table D, table reference array
+C NCREXDST - table D, starting pointers array
+C NCREXDL - table D, lengths array
+C NCREXDSQ - table D, list of sequence descriptors array
+C
+ COMMON /CRTABC/ CREXNAME(JTAB),CREXUNIT(JTAB)
+C
+C CREXNAME - table B, ELEMENT NAME array
+C CREXUNIT - table B, unit array
+c
+C
+ COMMON /CRBEF / M,MM,N,JCV
+C
+C M - Number of elements
+C MM - Number of elements
+C N - Number of data sub_sets
+C JCV - Number of character values
+C
+C
+ COMMON /CRWT/ NCREXDWINC,NCREXSCAM,NCREXAFDW,NCREXWT ,ODREPF,
+ 2 NCREXSTACK(JELEM),NCREXWTEN(JELEM),
+ 3 NCREXWTR (JELEM),NCREXWTS (JELEM),
+ 4 NCREXWTDW(JELEM)
+C
+C NCREXDWINC - data width increment
+C NCREXSCAM - scale multiplier
+C NCREXAFDW - augmented field data width
+C NCREXWT - pointer to working table
+C NCREXSTACK - list of data descriptors
+C ODREPF - replication (logical)
+C NCREXWTR - working table reference
+C NCREXWTS - working scale
+C NCREXWTDW - working data width
+C
+C
+C
+ COMMON /CRWTC/ CREXWTEN(JELEM),CREXWTU(JELEM)
+C
+C CREXWTEN - working table element naame
+C CREXWTU - working table units
+C
+C
+ COMMON /CREL/ NCREXTDLEN,NCREXTDLST(JELEM),NCREXTDEXL,
+ 1 NCREXTDEXP(JELEM)
+C
+C NCREXTDLEN - number of Data descriptors in section 3
+C NCREXTDLST - list of Data descriptors
+C NCREXTDEXL - number of expanded Data Descriptors
+C NCREXTDEXP - list of expanded Data descriptors
+C
+ CHARACTER*64 CREXWTEN
+ CHARACTER*24 CREXWTU
+C
+ CHARACTER*64 CREXNAME
+ CHARACTER*24 CREXUNIT
+C
+ CHARACTER*(*) CREXLST(*)
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+C
+ DIMENSION ISTACK(JELEM),IISTACK(JELEM)
+C
+ DIMENSION KSUP(JSUP),KSEC3(JSEC3)
+C
+ REAL*8 RVIND,EPS
+c
+C ------------------------------------------------------------------
+C
+C* 1. EXPAND PRELIMINARY ITEMS OF SECTION 3.
+C --------------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+CC -----------------------------------------------------------------
+C
+C* 2. EXPAND DATA DESCRIPTORS.
+C ------------------------
+ 200 CONTINUE
+C
+C
+C* 2.1 CALCULATE EXPECTED NUMBER OF DATA DESCRIPTORS.
+C ----------------------------------------------
+C AND INITIALIZE NUMBER OF DATA VALUES PER SUB-SET.
+C -------------------------------------------------
+ 210 CONTINUE
+C
+ J = 0
+ M = 0
+ KPT=0
+ NCREXWT=0
+ NCREXTDLEN=ktdlen
+C
+C
+C* 2.2 PUT DATA DESCRIPTORS IN STACK.
+C -----------------------------------------
+ 220 CONTINUE
+C
+ DO 221 JJ=1,KTDLEN
+C
+ if(CREXLST(JJ)(1:1).eq.'D') CREXLST(JJ)(1:1)='3'
+ if(CREXLST(JJ)(1:1).eq.'B') CREXLST(JJ)(1:1)='0'
+ if(CREXLST(JJ)(1:1).eq.'C') CREXLST(JJ)(1:1)='2'
+ if(CREXLST(JJ)(1:1).eq.'R') CREXLST(JJ)(1:1)='1'
+c
+ IOS=0
+ READ( CREXLST(JJ),'(i6.6)',IOSTAT=IOS) ISTACK(JJ)
+ IF(IOS.NE.0) THEN
+ print*,'Internal read error in CREXLST.'
+ print*,'NCREXTDLEN=ktdlen=',NCREXTDLEN
+ print*,jj,' CREXLST(JJ)=',CREXLST(JJ)
+ kerr=35
+ RETURN
+ END IF
+C
+ IISTACK(JJ)=ISTACK(JJ)
+C
+ 221 CONTINUE
+C
+ JMAX=NCREXTDLEN
+C ------------------------------------------------------------------
+C* 2.3 GET NEXT DESCRIPTOR FROM THE STACK.
+C -----------------------------------
+ 230 CONTINUE
+C
+C
+ J = J + 1
+ IF(J.GT.JMAX) GO TO 300
+C
+ IDD = ISTACK(J)
+ IF(IDD.EQ.0) GO TO 230
+C
+ IF = IDD/100000
+C
+C ------------------------------------------------------------------
+C* 2.4 CHECK IF IT IS REPLICATION DESCRIPTOR.
+C --------------------------------------
+ 240 CONTINUE
+C
+ IF( IF.EQ.0) THEN
+C
+C* 2.6 ELEMENT DESCRIPTOR, SO UPDATE WORKING TABLE.
+C --------------------------------------------
+ 260 CONTINUE
+C
+ CALL CREXEPWT(IDD,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ ELSEIF( IF.EQ.1) THEN
+C
+C* 2.4.1 SOLVE REPLICATION PROBLEM.
+C --------------------------
+C
+C
+ CALL CREXREP(KPT,KDLEN,KDATA,J,JMAX,IDD,ISTACK,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ ELSEIF( IF.EQ.2) THEN
+C
+C* 2.5.3 PROCESS OPERATOR.
+C -----------------
+ CALL CREXOPER(KPT,KDLEN,KDATA,J,IDD,ISTACK,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ ELSEIF( IF.EQ.3) THEN
+C
+C* 2.5.2 REPLACE BY LIST OF DESCRIPTORS FROM TABLE *D.
+C ---------------------------------------------
+ CALL CREXETDR(J,JMAX,IDD,ISTACK,KERR)
+ IF(KERR.GT.0) THEN
+ DO 252 IQ=1,JELEM
+ NCREXSTACK(IQ)=0.
+ 252 CONTINUE
+ RETURN
+ END IF
+ ELSE
+ KERR=37
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+ GO TO 230
+C
+C ------------------------------------------------------------------
+C
+C* 3. COLLECT SUPPLEMENTARY ITEMS.
+C -----------------------------
+ 300 CONTINUE
+C
+ NCREXTDEXL =M
+ DO 301 I=1,NCREXTDEXL
+ NCREXTDEXP(I)=NCREXWTR(I)
+ CNAMES(I)=CREXWTEN(I)
+ CUNITS(I)=CREXWTU(I)
+ 301 CONTINUE
+C
+ DO 302 I=1,NCREXTDLEN
+ NCREXTDLST (I)=IISTACK(I)
+ 302 CONTINUE
+C
+ KSUP(3)= 4
+ KSUP(5)= M
+ KSEC3(3)=NSUBSET
+ KSUP(6)= KSEC3(3)
+C
+ RETURN
+C
+ END
diff --git a/crexdc/crexen.F b/crexdc/crexen.F
new file mode 100755
index 0000000..5afe695
--- /dev/null
+++ b/crexdc/crexen.F
@@ -0,0 +1,521 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXEN(KSEC0,KSEC1,KSEC3,
+ 1 KTDLEN,CREXKTDLST,KDLEN,KDATA,KELEM,KVALS,
+ 2 VALUES,CVALS,KBUFL,KBUFF,KERR)
+C
+C**** *CREXEN*
+C
+C
+C PURPOSE.
+C --------
+C Creates CREX message
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXEN(KSEC0,KSEC1,KSEC3,
+C KTDLEN,CREXKTDLST,KDLEN,KDATA,KELEM,KVALS,
+C VALUES,CVALS,KBUFL,KBUFF,KERR)*
+C
+C
+C
+C INPUT :
+C *KBUFL* - Length of CREX message (words)
+C *KELEM* - Integer (expected number of expanded elements)
+C *KVALS* - Integer (expected number of data values)
+C OUTPUT:
+C
+C *KSUP* - Integer array of 9 words containing
+C suplementary information
+C - KSUP( 1) -- IDIM1, dimension of KSEC1
+C - KSUP( 2) -- Reserved
+C - KSUP( 3) -- IDIM3, dimension of KSEC3
+C - KSUP( 4) -- Reserved
+C - KSUP( 5) -- M (number of elements in values
+C array, first index)
+C - KSUP( 6) -- N (number of subsets,second index
+C of values array)
+C - KSUP( 7) -- JVC (number of elements in CVAL array)
+C - KSUP( 8) -- total CREX message length in bytes
+C - KSUP( 9) -- IDIM0, dimension of KSEC0
+C
+C *KSEC0* - Integer array of 3 words containing
+C CREX section 0 information
+C KSEC0( 1)-- length of section 0 (bytes)
+C KSEC0( 2)-- total length of CREX message (bytes)
+C KSEC0( 3)-- CREX Edition number
+C
+C *KSEC1* - Integer array of at least 40 words
+C containing CREX section 1 information
+C KSEC1( 1)-- Reserved
+C KSEC1( 2)-- CREX Edition number
+C KSEC1( 3)-- Reserved
+C KSEC1( 4)-- Reserved
+C KSEC1( 5)-- Reserved
+C KSEC1( 6)-- CREX message type
+C KSEC1( 7)-- Reserved
+C KSEC1( 8)-- version number of local table used
+C KSEC1( 9)-- Reserved
+C KSEC1(10)-- Reserved
+C KSEC1(11)-- Reserved
+C KSEC1(12)-- Reserved
+C KSEC1(13)-- Reserved
+C KSEC1(14)-- CREX Master table
+C KSEC1(15)-- version number of Master table used
+C KSEC1(16) - KSEC1(40) -- Reserved
+C
+C
+C Crex Edition 2
+C
+C *KSEC1* - Integer array of at least 40 words
+C containing CREX section 1 information
+C KSEC1( 1)-- Reserved
+C KSEC1( 2)-- CREX Edition number
+C KSEC1( 3)-- Originating Centre ( oooo)
+C KSEC1( 4)-- Update sequence number (uu)
+C KSEC1( 5)-- Number of subsets (sss)
+C KSEC1( 6)-- CREX data category (nnn)
+C KSEC1( 7)-- International data sub-category (mmm)
+C KSEC1( 8)-- version number of local table used
+C KSEC1( 9)-- Year (yyyy)
+C KSEC1(10)-- Month (mm)
+C KSEC1(11)-- Day (dd)
+C KSEC1(12)-- Hour (hh)
+C KSEC1(13)-- Minute (mm)
+C KSEC1(14)-- CREX Master table (tt)
+C KSEC1(15)-- version number of Master table used (vv)
+C KSEC1(16)-- Originating sub-centre (ppp)
+C KSEC1(17)-- Bufr master table version number
+C KSEC1(18)-- Bufr version number of local table used
+C KSEC1(19) - KSEC1(40) -- Reserved
+C
+C
+C *KSEC3* - Integer array of 4 words containing
+C CREX section 3 information
+C KSEC3( 1)-- length of section 3 (bytes)
+C KSEC3( 2)-- reserved
+C KSEC3( 3)-- number of subsets
+C KSEC3( 4)-- flag (data type,data compression)
+C
+C *CNAMES* - Character*64 array of KELEM containing
+C CREX Table B element names
+C *CUNITS* - Character*24 array of KELEM containig
+C CREX Table B units
+C *VALUES* - Real*8 array of KVALS containing expanded
+C data values
+C *CVALS* - Character*80 array of KVALS containing
+C CREX code table or CCITTIA5 CREX elements
+C entries
+C *KERR* - returned error code
+C
+C
+C
+C
+C METHOD.
+C -------
+C
+C NONE
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 04/02/2003.
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+
+
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+C
+ COMMON /CRWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+C
+ COMMON /CRWT/ NCREXDWINC,NCREXSCAM,NCREXAFDW,NCREXWT ,ODREPF,
+ 2 NCREXSTACK(JELEM),NCREXWTEN(JELEM),
+ 3 NCREXWTR (JELEM),NCREXWTS (JELEM),
+ 4 NCREXWTDW(JELEM)
+C
+C NCREXDWINC - data width increment
+C NCREXSCAM - scale multiplier
+C NCREXAFDW - augmented field data width
+C NCREXWT - pointer to working table
+C NCREXSTACK - list of data descriptors
+C ODREPF - replication (logical)
+C NCREXWTR - working table reference
+C NCREXWTS - working scale
+C NCREXWTDW - working data width
+C
+C
+C
+ COMMON /CRWTC/ CREXWTEN(JELEM),CREXWTU(JELEM)
+C
+C CREXWTEN - working table element naame
+C CREXWTU - working table units
+C
+ CHARACTER CREXWTEN*64,CREXWTU*24
+C
+ COMMON /CREL/ NCREXTDLEN,NCREXTDLST(JELEM),NCREXTDEXL,
+ 1 NCREXTDEXP(JELEM)
+C
+C NCREXTDLEN - number of Data descriptors in section 3
+C NCREXTDLST - list of Data descriptors
+C NCREXTDEXL - number of expanded Data Descriptors
+C NCREXTDEXP - list of expanded Data descriptors
+C
+ COMMON /CRCMOFF/ NSUBSET
+C
+
+ CHARACTER*120 YENTRY
+ CHARACTER*15 FMT
+ CHARACTER*6 CREXKTDLST(KELEM),CREXKTDLST0
+C
+ INTEGER IVALUE(KELEM)
+C
+ CHARACTER*4 YUSE_E
+C
+ INTEGER IVAL,IIVAL
+c
+ REAL*8 EPS
+ REAL*8 RVIND
+ REAL*8 VAL
+C
+
+ DIMENSION KSUP(JSUP),KSEC0(JSEC0),KSEC1(JSEC1)
+ DIMENSION KSEC3(JSEC3)
+ DIMENSION KBUFF(KBUFL)
+ DIMENSION KBUFR(JBUFL)
+C
+ REAL*8 VALUES(KVALS)
+C
+ CHARACTER*80 CVALS(KVALS),CV
+C
+ CHARACTER*(JBUFL*4) YOUT
+C
+ CHARACTER*3 crcrlf
+C
+ CHARACTER*4 CECMWF
+C
+ EQUIVALENCE(KBUFR(1),YOUT)
+
+C ------------------------------------------------------------------
+C
+ CALL GETENV('USE_E',YUSE_E)
+C
+ YOUT=' '
+ IPT=1
+ IPT0=1
+ crcrlf=char(13)//char(13)//char(10)
+c
+c* 1. Set Constants
+c ----------------
+ 100 continue
+c
+ KERR=0
+ IF(CECMWF.NE.'ECMF') THEN
+ CALL CREXIVAR(KERR)
+ IPT = 1
+ IPT0 = 1
+ CECMWF='ECMF'
+ END IF
+c
+C* 1. Create Section 0 - Indicator Section
+C ------------------------------------
+ 110 CONTINUE
+c
+ YOUT(1:9)='CREX++'//crcrlf
+c
+c* 2. Create Section 1 - Data Description Section
+c -------------------------------------------
+ 200 CONTINUE
+c
+ IF(KSEC1(2).LT.2) THEN
+ YOUT(10:10)='T'
+ WRITE(YOUT(10:16),'(A1,3(i2.2))') 'T',KSEC1(14),KSEC1(2),KSEC1(15)
+ YOUT(17:18)=' A'
+ WRITE(YOUT(19:21),'(I3.3)',IOSTAT=IOS) KSEC1(6)
+ IF(IOS.NE.0) THEN
+ print*,'Internal write error.'
+ KERR=33
+ RETURN
+ END IF
+ IPT=22
+ ELSE
+ YOUT(10:10)='T'
+ WRITE(YOUT(10:20),'(A1,5(i2.2))') 'T',KSEC1(14),KSEC1(2),
+ 1 KSEC1(15),KSEC1(17),KSEC1(18)
+ YOUT(22:22)='A'
+ WRITE(YOUT(23:28),'(2(i3.3))') KSEC1(6), KSEC1(7)
+ YOUT(30:30)='P'
+ WRITE(YOUT(31:38),'(i5.5,i3.3)') KSEC1(3), KSEC1(16)
+ YOUT(40:40)='U'
+ WRITE(YOUT(41:42),'(i2.2)') ksec1(4)
+ YOUT(44:44)='S'
+ WRITE(YOUT(45:47),'(i3.3)') KSEC1(5)
+ YOUT(49:49)='Y'
+ WRITE(YOUT(50:57),'(I4.4,2(i2.2))') KSEC1(9),KSEC1(10),
+ 1 KSEC1(11)
+ YOUT(59:59)='H'
+ WRITE(YOUT(60:63),'(2(i2.2))') KSEC1(12),KSEC1(13)
+
+ IPT=64
+ END IF
+C
+ DO 201 I=1,KTDLEN
+ YOUT(IPT:IPT+6)=' '//CREXKTDLST(I)
+ IPT=IPT+7
+c
+ IF((IPT-IPT0).GT.60) THEN
+ YOUT(IPT:IPT+2)=crcrlf
+ IPT=IPT+3
+ IPT0=IPT
+ END IF
+c
+ 201 CONTINUE
+c
+ IF(YUSE_E.EQ.'true') THEN
+ iE=1
+ YOUT(IPT:IPT+6)=' E++'//crcrlf
+ IPT=IPT+7
+ ELSE
+ YOUT(IPT:IPT+4)='++'//crcrlf
+ IPT=IPT+5
+ END IF
+c
+c* 3. Load Crex Tables
+c ----------------
+ 300 CONTINUE
+c
+ CALL CREXETAB(KSEC1,KERR)
+ IF(KERR.GT.0) RETURN
+
+c
+c* 3.1 Expand Data Descriptors
+c -----------------------
+c
+ 310 CONTINUE
+c
+ KPT=0
+ IPT0=IPT
+ NSUBSET=0
+ DO 401 IX=1,KSEC3(3)
+C
+ NSUBSET=NSUBSET+1
+C
+ CALL CREXETD(KPT,KTDLEN,CREXKTDLST,KDLEN,KDATA,KSEC3,
+ 1 KVALS,VALUES,KELEM,KERR)
+ IF(KERR.GT.0) RETURN
+c
+c* 4. Create Section 2 - Data Section
+c -------------------------------
+ 400 CONTINUE
+c
+C
+C
+ DO 402 iy=1,NCREXTDEXL
+ IZ=IY+(NSUBSET-1)*KELEM
+c
+ IF(ABS(VALUES(IZ)-RVIND)/RVIND.gt.EPS) THEN
+ if(CREXWTU(IY)(1:4).EQ.'CHAR') THEN
+ ICP=NINT(VALUES(IZ)/1000)
+ ICH=NINT(VALUES(IZ))-ICP*1000
+ IF(YUSE_E.EQ.'true') THEN
+ YOUT(IPT:IPT)=CHAR(iE+48)
+ iE=iE+1
+ IF(iE.GT.9) iE=0
+ IPT=IPT+1
+ END IF
+ YOUT(IPT:IPT)=' '
+ IPT=IPT+1
+ IF(ICHAR(CVALS(ICP)(1:1)).EQ.255) then
+ cv=' '
+ do ii=1,NCREXWTDW(IY)
+ cv(ii:ii)='/'
+ end do
+ YOUT(IPT:IPT+NCREXWTDW(IY)-1)=cv
+ else
+ YOUT(IPT:IPT+NCREXWTDW(IY)-1)=CVALS(ICP)
+ end if
+ IPT=IPT+NCREXWTDW(IY)
+ YOUT(IPT:IPT)=' '
+ IPT=IPT+1
+ ELSE
+ IF(CREXWTU(IY)(1:4).EQ.'FLAG') THEN
+ IVAL=INT(VALUES(IZ))
+ CALL DEC2OCTAL(IIVAL,IVAL,IERR)
+ IF(IERR.NE.0) THEN
+ print*,'Error during flag conversion'
+ print*,'iz=',iz,' ','values(iz)=',values(iz)
+ print*,'iz=',iz,' ','ival =',ival
+ print*,'iz=',iz,' ','iival =',iival
+ KERR=34
+ RETURN
+ END IF
+ VALUES(IZ)=FLOAT(IIVAL)
+c ELSEIF(CREXWTU(IY)(1:4).eq.'C ') THEN
+c convert Kelvin into Celsius
+c VALUES(IZ)=VALUES(IZ)-273.16
+ END IF
+
+ IF(NCREXWTS(IY).GE.0) THEN
+ IVALUE(IY)=NINT(VALUES(IZ)*10.**NCREXWTS(IY))
+ ELSE
+ IVALUE(IY)=NINT(VALUES(IZ)/10.**IABS(NCREXWTS(IY)))
+ END IF
+C
+c-----------------------------------------------------------------
+ JZ=0
+ IRES=IABS(IVALUE(IY))
+ DO WHILE(IRES.GT.0)
+ JZ=JZ+1
+ IRES=IRES/10
+ END DO
+c
+ IF(JZ.GT.NCREXWTDW(IY)) THEN
+ print*,'Element=',iy,' NCREXWTR=',NCREXWTR(iy),'value=',ivalue(iy)
+ print*,'number of figures calculated ',jz
+ print*,'number of figures in tables ',NCREXWTDW(iy)
+c
+c Replace this value with missing value '/'
+c
+ YOUT(IPT:IPT)=' '
+ IPT=IPT+1
+ if(YUSE_E.EQ.'true') THEN
+ YOUT(IPT:IPT)=CHAR(iE+48)
+ iE=iE+1
+ if(iE.gt.9) iE=0
+ IPT=IPT+1
+ END IF
+ DO III=1,NCREXWTDW(IY)
+ YOUT(IPT:IPT)='/'
+ IPT=IPT+1
+ END DO
+ ELSE
+c-----------------------------------------------------------------
+ IF(IVALUE(IY).LT.0) THEN
+ YOUT(IPT:IPT)=' '
+ IF(YUSE_E.eq.'true') THEN
+ IPT=IPT+1
+ YOUT(IPT:IPT)=CHAR(iE+48)
+ iE=iE+1
+ IF(iE.gt.9) iE=0
+ END IF
+ IPT=IPT+1
+ YOUT(IPT:IPT)='-'
+ ELSE
+ YOUT(IPT:IPT)=' '
+ IF(YUSE_E.EQ.'true') THEN
+ IPT=IPT+1
+ YOUT(IPT:IPT)=CHAR(iE+48)
+ iE=iE+1
+ IF(iE.gt.9) iE=0
+ END IF
+ END IF
+c
+ IPT=IPT+1
+c
+ FMT='(i02.02)'
+ IF(NCREXWTR(iy).eq.031001.or.NCREXWTR(iy).eq.031002) then
+ NCREXWTDW(iy)=4
+ END IF
+ WRITE(FMT(3:4),'(I2.2)',IOSTAT=IOS) NCREXWTDW(iy)
+ IF(IOS.NE.0) THEN
+ print*,'Internal write error.'
+ KERR=33
+ RETURN
+ END IF
+ FMT(6:7)=FMT(3:4)
+ WRITE(YOUT(IPT:IPT+NCREXWTDW(iy)-1),FMT,IOSTAT=IOS)
+ 1 IABS(IVALUE(IY))
+ IF(IOS.NE.0) THEN
+ print*,'Internal write error ',ios
+ KERR=33
+ RETURN
+ END IF
+ IPT=IPT+NCREXWTDW(iy)
+ END IF
+ END IF
+ ELSE
+ YOUT(IPT:IPT)=' '
+ IF(YUSE_E.eq.'true') THEN
+ IPT=IPT+1
+ YOUT(IPT:IPT)=CHAR(iE+48)
+ iE=iE+1
+ IF(iE.gt.9) iE=0
+ END IF
+c
+ IPT=IPT+1
+c
+ DO III=1,NCREXWTDW(iy)
+ YOUT(IPT:IPT)='/'
+ IPT=IPT+1
+ END DO
+ END IF
+c
+ IF((IPT-IPT0).GT.60) THEN
+ YOUT(IPT:IPT+2)=crcrlf
+ IPT=IPT+3
+ IPT0=IPT
+ END IF
+C
+ 402 CONTINUE
+c
+ YOUT(IPT:IPT+3)='+'//crcrlf
+ IPT=IPT+4
+ IPT0=IPT
+c
+ 401 CONTINUE
+C
+ IPT=IPT-4
+ YOUT(IPT:IPT+4)='++'//crcrlf
+ IPT=IPT+5
+c
+c* 5. Create Section 4 - End Section
+c -------------------------------
+ 500 continue
+c
+ YOUT(IPT:IPT+6)='7777'//crcrlf
+ IPT=IPT+6
+ IPT0=IPT
+C
+C 6. Return the size of crex in bytes
+C --------------------------------
+ 600 CONTINUE
+
+ NBYTPW=JBPW/8
+ K=IPT/NBYTPW+1
+ DO 601 I=1,K
+ KBUFF(i)=KBUFR(i)
+ 601 END DO
+C
+ KBUFL=IPT
+C
+ RETURN
+ END
diff --git a/crexdc/crexepwt.F b/crexdc/crexepwt.F
new file mode 100755
index 0000000..da6c0bd
--- /dev/null
+++ b/crexdc/crexepwt.F
@@ -0,0 +1,294 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXEPWT(KDD,KERR)
+C
+C**** *CREXEPWT*
+C
+C
+C PURPOSE.
+C --------
+C UPDATES WORKING TABLES SETTING ELEMENT NAME,UNIT,SCALE,
+C REFERENCE VALUE AND DATA WIDTH.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXEPWT(KDD,KELEM,KERR)*
+C
+C INPUT :
+C *KDD* - DATA DESCRIPTOR
+C OUTPUT:
+C *KERR* - RETURN ERROR CODE
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4=2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+C
+C
+ COMMON /CRWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+C
+ COMMON /CRWT/ NCREXDWINC,NCREXSCAM,NCREXAFDW,NCREXWT ,ODREPF,
+ 2 NCREXSTACK(JELEM),NCREXWTEN(JELEM),
+ 3 NCREXWTR (JELEM),NCREXWTS (JELEM),
+ 4 NCREXWTDW(JELEM)
+C
+C NCREXDWINC - data width increment
+C NCREXSCAM - scale multiplier
+C NCREXAFDW - augmented field data width
+C NCREXWT - pointer to working table
+C NCREXSTACK - list of data descriptors
+C ODREPF - replication (logical)
+C NCREXWTR - working table reference
+C NCREXWTS - working scale
+C NCREXWTDW - working data width
+C
+C
+C
+ COMMON /CRWTC/ CREXWTEN(JELEM),CREXWTU(JELEM)
+C
+C CREXWTEN - working table element naame
+C CREXWTU - working table units
+C
+ CHARACTER CREXWTEN*64,CREXWTU*24
+C
+C
+C
+
+ COMMON/CRTAB/ NCREXBR(JTAB),NCREXBS(JTAB) , NCREXBDW(JTAB),
+ 1 NCREXDR(JTAB),NCREXDST(JTAB) ,
+ 2 NCREXDL(JTAB),NCREXDSQ(JTAB*20),NCREXP(64,255)
+
+C
+C NCREXBR - table B, table reference array
+C NCREXBS - table B, scale array
+C NCREXBDW - table B, data width array
+C NCREXDR - table D, table reference array
+C NCREXDST - table D, starting pointers array
+C NCREXDL - table D, lengths array
+C NCREXDSQ - table D, list of sequence descriptors array
+C
+C
+C
+
+C COMMON /CRTABC/ CREXNAME(JTAB),CREXUNIT(JTAB),CREXLST(JELEM)
+ COMMON /CRTABC/ CREXNAME(JTAB),CREXUNIT(JTAB)
+C
+C CREXNAME - table B, ELEMENT NAME array
+C CREXUNIT - table B, unit array
+C
+ COMMON /CRATB/ NJA,NCREXATBTR(JTAB),NCREXATBS (JTAB),
+ 1 NCREXATBDW(JTAB)
+C
+C
+C NCREXATBTR - augmented table B table reference
+C NCREXATBS - augmented table B scale
+C NCREXATBDW - augmented table B data width
+C
+C
+ COMMON /CRATBC/ CREXATBEN(JTAB),CREXATBU (JTAB)
+C
+C CREXATBEN - augmented table B element name
+C CREXATBU - augmented table B units
+C
+C
+ COMMON /CRBEF / M,MM,N,JCV
+C
+C M - Number of elements
+C MM - Number of elements
+C N - Number of data sub_sets
+C JCV - Number of character values
+C
+C
+C
+C
+ REAL*8 RVIND,EPS
+C
+ character*64 CREXNAME, CREXATBEN
+ character*24 CREXATBU,CREXUNIT
+C
+C
+C
+C ------------------------------------------------------------------
+C* 1. UPDATE WORKING TABLE.
+C ---------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ ICLASS=KDD/1000
+ IYYY =KDD-ICLASS*1000+1
+ ICLASS=ICLASS+1
+C
+C* 1.1 ASSOCIATED FIELD ?
+C ------------------
+ 110 CONTINUE
+C
+ IF(NCREXAFDW.EQ.0) GO TO 140
+C
+C* 1.2 UNITS ELEMENT DESCRIPTOR ?
+C --------------------------
+ 120 CONTINUE
+C
+ I=NCREXP(ICLASS,IYYY)
+ IF(I.EQ.0) THEN
+ KERR=23
+ WRITE(*,*) ' CREXEPWT : ', KDD
+ CALL CREXERR(KERR)
+ DO IQ=1,JELEM
+ NCREXSTACK(IQ)=0.
+ END DO
+ RETURN
+ END IF
+C
+ IF(CREXUNIT(I)(1:4).EQ.'CODE') GO TO 140
+ IF(CREXUNIT(I)(1:4).EQ.'FLAG') GO TO 140
+ IF(CREXUNIT(I)(1:3).EQ.'NUM' ) GO TO 140
+C
+C* 1.3 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ 130 CONTINUE
+C
+ NCREXWT=NCREXWT+1
+ CREXWTEN(NCREXWT)='ASSOCIATED FIELD'
+ CREXWTU (NCREXWT)=' '
+ NCREXWTDW(NCREXWT)=NCREXAFDW
+ NCREXWTR (NCREXWT)= 999999
+ NCREXWTEN(NCREXWT)= 0
+ NCREXWTS (NCREXWT)= 0
+ NCREXAFDW=0
+C
+ M=NCREXWT
+C
+C ------------------------------------------------------------------
+C* 1.4 SEARCH AUGMENTED TABLE *B ENTRIES .
+C -----------------------------------
+ 140 CONTINUE
+C
+C
+C
+C* 1.5 GET TABLE *B ENTRY .
+C ---------------------
+ 150 CONTINUE
+C
+ I=NCREXP(ICLASS,IYYY)
+ IF(I.EQ.0) THEN
+ KERR=23
+ WRITE(*,*) 'CREXEPWT : ',KDD
+ CALL CREXERR(KERR)
+ DO 2 IQ=1,JELEM
+ NCREXSTACK(IQ)=0.
+ 2 CONTINUE
+ RETURN
+ END IF
+C
+ 155 CONTINUE
+C
+C -----------------------------------------------------------------
+C* 1.6 MODIFY ENTRY FOR OPERATOR IN FORCE.
+C -----------------------------------
+ 160 CONTINUE
+C
+C* ADD ENTRY TO WORKING TABLE.
+C ---------------------------
+ NCREXWT=NCREXWT+1
+ NCREXWTR (NCREXWT) = KDD
+ IF(NCREXSCAM.ne.0) THEN
+ NCREXWTS (NCREXWT) = NCREXSCAM
+ ELSE
+ NCREXWTS (NCREXWT) = NCREXBS (I)
+ END IF
+C
+ NCREXSCAM=0
+C
+ IF(NCREXDWINC.ne.0) THEN
+ NCREXWTDW(NCREXWT) = NCREXDWINC
+ ELSE
+ NCREXWTDW(NCREXWT) = NCREXBDW(I)
+ END IF
+C
+ NCREXDWINC=0
+C
+ IF(NCREXWTR (NCREXWT).eq.031002) THEN
+ NCREXWTDW(NCREXWT)=4
+ END IF
+C
+C CHECK IF DATA ARE PRESENT IN DATA SECTION.
+C
+ IF(NCREXWTR(NCREXWT).eq.31011.or.
+ 1 NCREXWTR(NCREXWT).eq.31012) then
+ IF(NCREXWTR(NCREXWT-1).eq.31011.or.
+ 2 NCREXWTR(NCREXWT-1).eq.31012) THEN
+ NCREXWTDW(NCREXWT)=0
+ END IF
+ END IF
+
+ 175 CONTINUE
+C
+C* 1.8 UPDATE M.
+C ---------
+ 180 CONTINUE
+C
+C
+ CREXWTEN(NCREXWT) = CREXNAME(I)
+ IF(NC07YYY.NE.0) THEN
+ CREXWTU (NCREXWT) = YUNIT
+ YUNIT=' '
+ NC07YYY=0
+ else
+ CREXWTU (NCREXWT) = CREXUNIT(I)
+ END IF
+ NCREXWTEN(NCREXWT) = 0
+ IF(CREXUNIT(I)(1:3).EQ.'CHA') NCREXWTEN(NCREXWT)=658367
+C
+ M = M + 1
+C
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/crexdc/crexerr.F b/crexdc/crexerr.F
new file mode 100755
index 0000000..7445d03
--- /dev/null
+++ b/crexdc/crexerr.F
@@ -0,0 +1,115 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXERR(KERR)
+C**** *CREXERR*
+C
+C
+C PURPOSE.
+C --------
+C PRINT ERROR CODE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXERR(KERR)*
+C
+C INPUT: *NONE*
+C
+C OUTPUT: *KERR* - Return error code
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+ CHARACTER*80 CERROR(100)
+C
+ DATA CERROR/100*' '/
+C
+C ------------------------------------------------------------------
+C
+C* 1. INITIALIZE MESSAGES.
+C --------------------
+ 100 CONTINUE
+C
+ CERROR( 1)=' Start of CREX message not found.'
+ CERROR( 2)=' End of CREX message not found.'
+ CERROR( 3)=' Array to receive CREX message too small.'
+ CERROR( 6)=' Error during read CREX table B.'
+ CERROR( 7)=' Error during read CREX table C.'
+ CERROR( 8)=' Error during read CREX table D.'
+ CERROR( 9)=' Open error.'
+ CERROR(10)=' Error during close CREX table B.'
+ CERROR(11)=' Error during close CREX table C.'
+ CERROR(12)=' Error during close CREX table D.'
+ CERROR(13)=' Too many elements in the table'
+ CERROR(14)=' Argument KVALS too small.'
+ CERROR(19)=' Delayed replication factor too big.'
+ CERROR(20)=' Table D reference not found.'
+ CERROR(21)=' Data descriptor operator not found.'
+ CERROR(22)=' CREX Opeartor name not found.'
+ CERROR(23)=' Table B reference not found.'
+ CERROR(25)=' KELEM argument too small.'
+ CERROR(26)=' Word pointer out of range.'
+ CERROR(30)=' Number of elements greater than JELEM.'
+ CERROR(31)=' Too few elements in KDATA array.'
+ CERROR(32)=' Number of subsets equal to zero.'
+ CERROR(33)=' Internal write error'
+ CERROR(34)=' Decimal to octal conversion error'
+ CERROR(35)=' Internal read error'
+ CERROR(36)=' Bad order of data descriptors.'
+ CERROR(37)=' Wrong data descriptor.'
+ CERROR(38)=' Open error on units.cinfig.dat file'
+ CERROR(39)=' Read error on units.cinfig.dat file'
+ CERROR(40)=' Could not find next section'
+ CERROR(41)=' '
+ CERROR(42)=' Wrong start of section 1 of CREX message '
+ CERROR(43)=' Could not find the end of section 1'
+ CERROR(44)=' Error during extraction of Master table'
+ CERROR(45)=' Error during extraction of Edition number'
+ CERROR(46)=' Error during extraction of version number'
+ CERROR(47)=' Unit not found'
+C
+ IF(KERR.GE.0.AND.KERR.LE.100) THEN
+ WRITE(*,'(1h ,A)') CERROR(KERR)
+ ELSE
+ WRITE(*,'(1h ,A)') ' Error number out of range !'
+ END IF
+C
+ RETURN
+ END
diff --git a/crexdc/crexetab.F b/crexdc/crexetab.F
new file mode 100755
index 0000000..d33e7a8
--- /dev/null
+++ b/crexdc/crexetab.F
@@ -0,0 +1,515 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXETAB(KSEC1,KERR)
+C
+C**** *CREXETAB*
+C
+C
+C PURPOSE.
+C --------
+C Load Crex table B and D according to Edition and version
+C of Crex code.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXETAB(KSEC1,KERR)*
+C
+C OUTPUT:
+C *KSEC1* - Integer array of at least 40 words
+C containing CREX section 1 information
+C KSEC1( 1)-- Reserved
+C KSEC1( 2)-- CREX Edition number
+C KSEC1( 3)-- Reserved
+C KSEC1( 4)-- Reserved
+C KSEC1( 5)-- Reserved
+C KSEC1( 6)-- CREX message type
+C KSEC1( 7)-- Reserved
+C KSEC1( 8)-- version number of local table used
+C KSEC1( 9)-- Reserved
+C KSEC1(10)-- Reserved
+C KSEC1(11)-- Reserved
+C KSEC1(12)-- Reserved
+C KSEC1(13)-- Reserved
+C KSEC1(14)-- CREX Master table
+C KSEC1(15)-- version number of Master table used
+C KSEC1(16) - KSEC1(40) -- Reserved
+C
+C
+C Crex Edition 2
+C
+C *KSEC1* - Integer array of at least 40 words
+C containing CREX section 1 information
+C KSEC1( 1)-- Reserved
+C KSEC1( 2)-- CREX Edition number
+C KSEC1( 3)-- Originating Centre ( oooo)
+C KSEC1( 4)-- Update sequence number (uu)
+C KSEC1( 5)-- Number of subsets (sss)
+C KSEC1( 6)-- CREX data category (nnn)
+C KSEC1( 7)-- International data sub-category (mmm)
+C KSEC1( 8)-- version number of local table used
+C KSEC1( 9)-- Year (yyyy)
+C KSEC1(10)-- Month (mm)
+C KSEC1(11)-- Day (dd)
+C KSEC1(12)-- Hour (hh)
+C KSEC1(13)-- Minute (mm)
+C KSEC1(14)-- CREX Master table (tt)
+C KSEC1(15)-- version number of Master table used (vv)
+C KSEC1(16)-- Originating sub-centre (ppp)
+C KSEC1(17)-- Bufr master table version number
+C KSEC1(18)-- Bufr version number of local table used
+C KSEC1(19) - KSEC1(40) -- Reserved
+C
+C *KERR* - returned error code
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 06/11/2003.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+ PARAMETER(JP=3000,JL=20)
+C
+ COMMON/CRTAB/ NCREXBR(JTAB),NCREXBS(JTAB) , NCREXBDW(JTAB),
+ 1 NCREXDR(JTAB),NCREXDST(JTAB) ,
+ 2 NCREXDL(JTAB),NCREXDSQ(JTAB*20),NCREXP(64,255)
+
+C
+C NCREXBR - table B, table reference array
+C NCREXBS - table B, scale array
+C NCREXBDW - table B, data width array
+C NCREXDR - table D, table reference array
+C NCREXDST - table D, starting pointers array
+C NCREXDL - table D, lengths array
+C NCREXDSQ - table D, list of sequence descriptors array
+C
+ COMMON /CRTABC/ CREXNAME(JTAB),CREXUNIT(JTAB)
+C
+C CREXNAME - table B, ELEMENT NAME array
+C CREXUNIT - table B, unit array
+C
+C
+ COMMON /CRROOT/ CROOT
+C
+C croot - path for Crex tables
+C
+ CHARACTER*64 CREXNAME
+ CHARACTER*24 CREXUNIT
+ CHARACTER*6 CREXLST
+C
+ CHARACTER*256 YNAME
+ CHARACTER*256 YFNAME
+ CHARACTER*160 YENTRY
+C
+ CHARACTER*256 YTAB ,YTAC ,YTAD
+ CHARACTER*7 YTABB,YTABC,YTABD
+ CHARACTER*256 CROOT
+ CHARACTER*6 CNCREXBR
+C
+ DIMENSION KSEC1(*)
+C
+C EXTERNAL FUNCTIONS
+C
+ INTEGER EMOSNUM
+ EXTERNAL EMOSNUM
+
+ SAVE OFIRST, NXXP, NYYP, NZZP
+C
+C ------------------------------------------------------------------
+C
+C* 1. GET CREX TABLES/LOCAL CREX TABLES.
+C ----------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0) RETURN
+C
+C
+C* 2. SET UP CREX TABLE FILE NAME.
+C ----------------------------
+ 200 CONTINUE
+C
+C
+C CREX EDITION 1 NAMING CONVENTION
+C
+C BXXYYZZ , DXXYYZZ
+C
+C B - CREX TABLE 'B'
+C D - CREX TABLE 'D'
+C XX - Crex Master table used '00'
+C YY - Crex Edition number used '01'
+C ZZ - Crex Table version number '01'
+C
+ IXX=0
+ IYY=KSEC1( 2)
+ IZZ=KSEC1(15)
+C
+ IF(OFIRST) THEN
+ IF(IXX.EQ.NXXP.AND.IYY.EQ.NYYP.AND.
+ 1 IZZ.EQ.NZZP) RETURN
+ END IF
+C
+ J=0
+ ICLASS0=0
+ IVIND=2147483647
+C
+ DO 101 I=1,64
+ do 101 ii=1,255
+ NCREXP(I,ii)=0
+ 101 CONTINUE
+C
+ DO 102 i=1,JP
+ NCREXBR(I)=IVIND
+ NCREXBS (I)=IVIND
+ NCREXBDW(I)=IVIND
+ CREXNAME(I)=' '
+ CREXUNIT(I)=' '
+ 102 CONTINUE
+C
+ J =0
+ IST=1
+C
+ DO 103 I=1,JP
+ NCREXDR(I)=999999
+ NCREXDL (I)=0
+ NCREXDST(I)=0
+ 103 CONTINUE
+C
+ DO 104 I=1,JP*20
+ NCREXDSQ(I)=0
+ 104 CONTINUE
+
+ OFIRST=.TRUE.
+C
+ NXXP=IXX
+ NYYP=IYY
+ NZZP=IZZ
+C
+ WRITE(YTABB,'(A1,I2.2,I2.2,I2.2)') 'B',IXX,IYY,IZZ
+C WRITE(YTABC,'(A1,I2.2,I2.2,I2.2)') 'C',IXX,IYY,IZZ
+ WRITE(YTABD,'(A1,I2.2,I2.2,I2.2)') 'D',IXX,IYY,IZZ
+C
+ PRINT*,'CREX Tables to be loaded ',YTABB,',',YTABD
+C
+C ----------------------------------------------------------------
+C* 3. OPEN AND READ FILES CONTAINING CREX TABLES.
+C -------------------------------------------
+ 300 CONTINUE
+C
+ CROOT=' '
+ CALL GETENV('CREX_TABLES',CROOT)
+ ILNG=INDEX(CROOT,' ')
+ IF(ILNG.EQ.1) THEN
+C
+C SGI/HP/SUN CREX TABLES PATH
+C
+ CROOT='/home/ma/emos/tables/crex/'
+C
+C ADD VERSION NUMBER
+C
+ ILNG=INDEX(CROOT,' ')
+ IEMOSNM = EMOSNUM(1)
+ WRITE(CROOT(ILNG:ILNG+5),'(I6.6)') IEMOSNM
+ CROOT(ILNG+6:) = '/'
+ ENDIF
+
+ I=INDEX(CROOT,' ')
+ IF(I.NE.0) I=I-1
+ PRINT*,'Path for CREX tables:',CROOT(1:I)
+C
+C* 3.1 READ CREX TABLE B.
+C ------------------
+ 310 CONTINUE
+C
+ YTAB=CROOT(1:I)//YTABB
+ II=I+7
+C
+ OPEN(UNIT=38,IOSTAT=IOS,ERR=311,FILE=YTAB(1:II),
+ 1 FORM='FORMATTED',
+ 2 recl=160,
+ 5 STATUS='OLD')
+C
+ J=0
+ GO TO 312
+C
+ 311 CONTINUE
+C
+ CLOSE(38)
+C
+ print*,'Open error on ',YTAB(1:II)
+C
+ KERR=9
+ CALL CREXERR(KERR)
+ RETURN
+
+C
+ 312 CONTINUE
+C
+ J=J+1
+ READ(38,ERR=400,IOSTAT=IOS,END=329,
+ 1 FMT='(1x,A,1x,A64,47x,A24,I3,7x,I3)')
+ 2 CNCREXBR,CREXNAME(J),CREXUNIT(J),NCREXBS(J),NCREXBDW(J)
+C
+ CNCREXBR(1:1)='0'
+C
+ READ(CNCREXBR,'(I6.6)',IOSTAT=IOS) NCREXBR(J)
+ IF(IOS.NE.0) THEN
+ print*,'Internal read error.'
+ print*,CNCREXBR
+ KERR=35
+ RETURN
+ end if
+C
+C
+ ICLASS=NCREXBR(J)/1000
+ IYYY =NCREXBR(J)-ICLASS*1000+1
+C
+ ICLASS=ICLASS+1
+ NCREXP(ICLASS,IYYY)=J
+
+ GO TO 312
+C
+ 329 CONTINUE
+C
+ CLOSE(UNIT=38,IOSTAT=IOS,ERR=420)
+C
+C* 3.3 READ CREX TABLE D.
+CC ------------------
+ 330 CONTINUE
+C
+ YTAD=CROOT(1:I)//YTABD
+C
+ OPEN(UNIT=40,IOSTAT=IOS,ERR=331,FILE=YTAD(1:II),
+ 1 FORM='FORMATTED',
+ 2 recl=160,
+ 5 STATUS='OLD')
+C
+ GO TO 332
+C
+ 331 CONTINUE
+C
+ CLOSE(40)
+C
+ print*,'Open error on ',YTAD
+C
+ kerr=9
+ CALL CREXERR(KERR)
+ return
+C
+ 332 CONTINUE
+C
+ j=0
+ 340 continue
+c
+ YENTRY=' '
+ READ(40,'(a)',iostat=ios,end=390) yentry
+ if(ios.ne.0) then
+ print*,'Read error on CREX table D.'
+ KERR=35
+ RETURN
+ end if
+ if(yentry(2:2).eq.'D') yentry(2:2)='3'
+c
+ j=j+1
+ READ(YENTRY,'(1X,I6,1X,I2)',iostat=ios) NCREXDR(J),NCREXDL(J)
+ if(ios.ne.0) then
+ print*,'Internal read error.'
+ print*,YENTRY
+ KERR=35
+ RETURN
+ end if
+ IF(J.GT.JP) THEN
+ PRINT*,' DIMENSION TOO SMALL J=',J
+ kerr=13
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+ IF(J.EQ.1) THEN
+ IST=1
+ NCREXDST(J)=IST
+ ELSE
+ IST=IST + NCREXDL(J-1)
+ NCREXDST(J)=IST
+ END IF
+C
+ IF(NCREXDL(J).GT.1) THEN
+ if(YENTRY(12:12).eq.'D') YENTRY(12:12)='3'
+ if(YENTRY(12:12).eq.'C') then
+ YENTRY(12:12)='2'
+c checkif negative scale is present
+ iminus=0
+ iminus=index(YENTRY(12:16),'-')
+ if(iminus.ne.0) YENTRY(iminus:iminus)='9'
+ end if
+ if(YENTRY(12:12).eq.'R') YENTRY(12:12)='1'
+ if(YENTRY(12:12).eq.'B') YENTRY(12:12)='0'
+ READ(YENTRY,'(11X,I6)',iostat=ios) NCREXDSQ(IST)
+ if(ios.ne.0) then
+ print*,YENTRY
+ KERR=35
+ CALL CREXERR(KERR)
+ RETURN
+ end if
+c
+ IIST=IST
+C
+ DO 220 JA=1,NCREXDL(J)-1
+ IIST=IIST+1
+ READ(40,'(A)',END=300,iostat=ios) YENTRY
+ if(ios.ne.0) then
+ print*,YENTRY
+ KERR=35
+ CALL CREXERR(KERR)
+ RETURN
+ end if
+c
+ if(YENTRY(12:12).eq.'D') YENTRY(12:12)='3'
+ if(YENTRY(12:12).eq.'C') YENTRY(12:12)='2'
+ if(YENTRY(12:12).eq.'R') YENTRY(12:12)='1'
+ if(YENTRY(12:12).eq.'B') YENTRY(12:12)='0'
+ READ(YENTRY,'(11X,I6)',iostat=ios) NCREXDSQ(IIST)
+ if(ios.ne.0) then
+ print*,YENTRY
+ KERR=35
+ CALL CREXERR(KERR)
+ RETURN
+ end if
+ 220 CONTINUE
+C
+ ELSE
+ if(YENTRY(12:12).eq.'D') YENTRY(12:12)='3'
+ if(YENTRY(12:12).eq.'C') YENTRY(12:12)='2'
+ if(YENTRY(12:12).eq.'R') YENTRY(12:12)='1'
+ if(YENTRY(12:12).eq.'B') YENTRY(12:12)='0'
+ READ(YENTRY,'(11X,I6)',iostat=ios) NCREXDSQ(IST)
+ if(ios.ne.0) then
+ print*,'Internal read error.'
+ print*,YENTRY
+ KERR=35
+ RETURN
+ end if
+ END IF
+C
+ go to 340
+c
+ 390 continue
+C
+ CLOSE(UNIT=40,IOSTAT=IOS,ERR=620)
+C
+C
+ RETURN
+C ----------------------------------------------------------------
+ 400 CONTINUE
+C
+ KERR=6
+ PRINT*,'CREXETAB: IOS ',IOS
+ CALL CREXERR(KERR)
+ OFIRST=.FALSE.
+ RETURN
+C
+ 410 CONTINUE
+C
+ KERR=9
+ PRINT*,'CREXETAB: IOS ',IOS
+ CALL CREXERR(KERR)
+ OFIRST=.FALSE.
+ RETURN
+C
+ 420 CONTINUE
+C
+ KERR=10
+ PRINT*,'CREXETAB: IOS ',IOS
+ CALL CREXERR(KERR)
+ OFIRST=.FALSE.
+ RETURN
+C ----------------------------------------------------------------
+ 500 CONTINUE
+C
+ KERR=7
+ PRINT*,'CREXETAB: IOS ',IOS
+ CALL CREXERR(KERR)
+ OFIRST=.FALSE.
+ RETURN
+C
+ 510 CONTINUE
+C
+ KERR=9
+ PRINT*,'CREXETAB: IOS ',IOS
+ CALL CREXERR(KERR)
+ OFIRST=.FALSE.
+ RETURN
+C
+ 520 CONTINUE
+C
+ KERR=11
+ PRINT*,'CREXETAB: IOS ',IOS
+ CALL CREXERR(KERR)
+ OFIRST=.FALSE.
+ RETURN
+C -----------------------------------------------------------------
+ 600 CONTINUE
+C
+ KERR=8
+ PRINT*,'CREXETAB: IOS ',IOS
+ CALL CREXERR(KERR)
+ OFIRST=.FALSE.
+ RETURN
+C
+ 610 CONTINUE
+C
+ KERR=9
+ PRINT*,'CREXETAB: IOS ',IOS
+ CALL CREXERR(KERR)
+ OFIRST=.FALSE.
+ RETURN
+C
+ 620 CONTINUE
+C
+ KERR=12
+ PRINT*,'CREXETAB: IOS ',IOS
+ CALL CREXERR(KERR)
+ OFIRST=.FALSE.
+ RETURN
+C -----------------------------------------------------------------
+C
+ END
diff --git a/crexdc/crexetd.F b/crexdc/crexetd.F
new file mode 100755
index 0000000..a8679b6
--- /dev/null
+++ b/crexdc/crexetd.F
@@ -0,0 +1,305 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXETD(KPT,KTDLEN,CREXLST,KDLEN,KDATA,KSEC3,
+ 1 KVALS,VALUES,KELEM,KERR)
+C
+C**** *CREXETD*
+C
+C
+C PURPOSE.
+C --------
+C
+C Expand Crex data descriptors
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXETD( KPT,KTDLEN,CREXLST,KDLEN,KDATA,KSEC3,
+C KVALS,VALUES,KELEM,KERR)*
+C
+C INPUT :
+C *KPT* - POINTER TO KDATA ARRAY
+C *KTDLEN* - number of data descriptors in section 1
+C *KTDLST* - array containing data descriptors in section 1
+C *KDLEN* - DIMENSION OF KDATA ARRAY
+C *KDATA* - ARRAY CONTAINING DATA NEEDED FOR DESCRIPTOR
+C EXPANSION ( delayed replications)
+C *KSEC3* - Integer array of 4 words containing
+C
+C KSEC3( 1)-- Reserved
+C KSEC3( 2)-- Reserved
+C KSEC3( 3)-- number of subsets
+C KSEC3( 4)-- Reserved
+C *KVALS - Integer (expected number of data values)
+C *VALUES* - Real*8 array of KVALS containing expanded
+C data values
+C *KELEM* - dimension of CNAMES, CUNITS array
+C OUTPUT:
+C *KERR* - returned error code
+C
+C METHOD.
+C -------
+C
+C Expands list of data descriptors in section 1
+C of Crex message. Working tables for further data decoding are set,
+C list of Crex data descriptors and a list of expanded Crex data descriptors
+C according to table D reference are returned respectively.
+C
+C
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C------------------------------------------------------------------------------------
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+C
+C
+ COMMON /CRWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+C
+ COMMON /CRTAB/ NCREXBR(JTAB),NCREXBS(JTAB) , NCREXBDW(JTAB),
+ 1 NCREXDR(JTAB),NCREXDST(JTAB) ,
+ 2 NCREXDL(JTAB),NCREXDSQ(JTAB*20),NCREXP(64,255)
+
+C
+C NCREXBR - table B, table reference array
+C NCREXBS - table B, scale array
+C NCREXBDW - table B, data width array
+C NCREXDR - table D, table reference array
+C NCREXDST - table D, starting pointers array
+C NCREXDL - table D, lengths array
+C NCREXDSQ - table D, list of sequence descriptors array
+C
+ COMMON /CRTABC/ CREXNAME(JTAB),CREXUNIT(JTAB)
+C
+C CREXNAME - table B, ELEMENT NAME array
+C CREXUNIT - table B, unit array
+c
+C
+ COMMON /CRBEF / M,MM,N,JCV
+C
+C M - Number of elements
+C MM - Number of elements
+C N - Number of data sub_sets
+C JCV - Number of character values
+C
+C
+ COMMON /CRWT/ NCREXDWINC,NCREXSCAM,NCREXAFDW,NCREXWT ,ODREPF,
+ 2 NCREXSTACK(JELEM),NCREXWTEN(JELEM),
+ 3 NCREXWTR (JELEM),NCREXWTS (JELEM),
+ 4 NCREXWTDW(JELEM)
+C
+C NCREXDWINC - data width increment
+C NCREXSCAM - scale multiplier
+C NCREXAFDW - augmented field data width
+C NCREXWT - pointer to working table
+C NCREXSTACK - list of data descriptors
+C ODREPF - replication (logical)
+C NCREXWTR - working table reference
+C NCREXWTS - working scale
+C NCREXWTDW - working data width
+C
+C
+C
+ COMMON /CRWTC/ CREXWTEN(JELEM),CREXWTU(JELEM)
+C
+C CREXWTEN - working table element naame
+C CREXWTU - working table units
+C
+ CHARACTER CREXWTEN*64,CREXWTU*24
+C
+ COMMON /CREL/ NCREXTDLEN,NCREXTDLST(JELEM),NCREXTDEXL,
+ 1 NCREXTDEXP(JELEM)
+C
+C NCREXTDLEN - number of Data descriptors in section 3
+C NCREXTDLST - list of Data descriptors
+C NCREXTDEXL - number of expanded Data Descriptors
+C NCREXTDEXP - list of expanded Data descriptors
+C
+ COMMON /CRCOFF/ NSUBSET
+C
+ CHARACTER*64 CREXNAME
+ CHARACTER*24 CREXUNIT
+ CHARACTER*(*) CREXLST(*)
+C
+ DIMENSION ISTACK(JELEM),IISTACK(JELEM)
+C
+ DIMENSION KSUP(JSUP),KSEC3(JSEC3)
+C
+ REAL*8 RVIND,EPS
+ REAL*8 VALUES(KVALS)
+c
+C ------------------------------------------------------------------
+C
+C* 1. EXPAND PRELIMINARY ITEMS OF SECTION 3.
+C --------------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+C -----------------------------------------------------------------
+C
+C* 2. EXPAND DATA DESCRIPTORS.
+C ------------------------
+ 200 CONTINUE
+C
+C
+C* 2.1 CALCULATE EXPECTED NUMBER OF DATA DESCRIPTORS.
+C ----------------------------------------------
+C AND INITIALIZE NUMBER OF DATA VALUES PER SUB-SET.
+C -------------------------------------------------
+ 210 CONTINUE
+C
+ J = 0
+ M = 0
+ IF(NSUBSET.EQ.1) KPT=0
+ NCREXWT=0
+ NCREXTDLEN=KTDLEN
+C
+C
+C* 2.2 PUT DATA DESCRIPTORS IN STACK.
+C -----------------------------------------
+ 220 CONTINUE
+C
+ DO 221 JJ=1,KTDLEN
+C
+ if(CREXLST(JJ)(1:1).eq.'D') CREXLST(JJ)(1:1)='3'
+ if(CREXLST(JJ)(1:1).eq.'B') CREXLST(JJ)(1:1)='0'
+ if(CREXLST(JJ)(1:1).eq.'C') CREXLST(JJ)(1:1)='2'
+ if(CREXLST(JJ)(1:1).eq.'R') CREXLST(JJ)(1:1)='1'
+c
+ IOS=0
+ READ( CREXLST(JJ),'(i6.6)',IOSTAT=IOS) ISTACK(JJ)
+ IF(IOS.NE.0) THEN
+ PRINT*,'NCREXTDLEN=KTDLEN=',NCREXTDLEN
+ PRINT*,JJ,' CREXLST(JJ)=',CREXLST(JJ)
+ kerr=35
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+ IISTACK(JJ)=ISTACK(JJ)
+C
+ 221 CONTINUE
+C
+ JMAX=NCREXTDLEN
+C ------------------------------------------------------------------
+C* 2.3 GET NEXT DESCRIPTOR FROM THE STACK.
+C -----------------------------------
+ 230 CONTINUE
+C
+C
+ J = J + 1
+ IF(J.GT.JMAX) GO TO 300
+C
+ IDD = ISTACK(J)
+ IF(IDD.EQ.0) GO TO 230
+C
+ IF = IDD/100000
+C
+C ------------------------------------------------------------------
+C* 2.4 CHECK IF IT IS REPLICATION DESCRIPTOR.
+C --------------------------------------
+ 240 CONTINUE
+C
+ IF( IF.EQ.0) THEN
+C
+C* 2.6 ELEMENT DESCRIPTOR, SO UPDATE WORKING TABLE.
+C --------------------------------------------
+ 260 CONTINUE
+C
+ CALL CREXEPWT(IDD,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ ELSEIF( IF.EQ.1) THEN
+C
+C* 2.4.1 SOLVE REPLICATION PROBLEM.
+C --------------------------
+C
+C
+ CALL CREXREP(KPT,KDLEN,KDATA,J,JMAX,IDD,ISTACK,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ ELSEIF( IF.EQ.2) THEN
+C
+C* 2.5.3 PROCESS OPERATOR.
+C -----------------
+ CALL CREXOPER(KPT,KDLEN,KDATA,J,IDD,ISTACK,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ ELSEIF( IF.EQ.3) THEN
+C
+C* 2.5.2 REPLACE BY LIST OF DESCRIPTORS FROM TABLE *D.
+C ---------------------------------------------
+ CALL CREXETDR(J,JMAX,IDD,ISTACK,KERR)
+ IF(KERR.GT.0) THEN
+ DO 252 IQ=1,JELEM
+ NCREXSTACK(IQ)=0.
+ 252 CONTINUE
+ RETURN
+ END IF
+ ELSE
+ KERR=37
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+c
+ GO TO 230
+C
+C ------------------------------------------------------------------
+C
+C* 3. COLLECT SUPPLEMENTARY ITEMS.
+C -----------------------------
+ 300 CONTINUE
+C
+ NCREXTDEXL =M
+ DO 301 I=1,NCREXTDEXL
+ NCREXTDEXP(I)=NCREXWTR(I)
+ 301 CONTINUE
+C
+ DO 302 I=1,NCREXTDLEN
+ NCREXTDLST (I)=IISTACK(I)
+ 302 CONTINUE
+C
+ KSUP(3)= 4
+ KSUP(5)= M
+ KSUP(6)= KSEC3(3)
+C
+ RETURN
+C
+ END
diff --git a/crexdc/crexetdr.F b/crexdc/crexetdr.F
new file mode 100755
index 0000000..cd9ac1f
--- /dev/null
+++ b/crexdc/crexetdr.F
@@ -0,0 +1,195 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXETDR(KJ,KJ1,KDD,KSTACK,KERR)
+C
+C**** *CREXETDR*
+C
+C
+C PURPOSE.
+C --------
+C SOLVE BUFR TABLE D REFERENCE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXETDR(KJ,KJ1,KDD,KSTACK,KERR)*
+C
+C INPUT :
+C *KDD* - DATA DESCRIPTOR
+C OUTPUT:
+C *KJ* - POINTER TO KSTACK ARRAY
+C *KJ1* - POINTER TO LAST ELEMENT IN KSTACK
+C *KSTACK* - LIST OF DATA DESCRIPTORS
+C *KERR* - RETURN ERROR CODE
+C
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4=2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+C
+ COMMON /CRWT/ NCREXDWINC,NCREXSCAM,NCREXAFDW,NCREXWT ,ODREPF,
+ 2 NCREXSTACK(JELEM),NCREXWTEN(JELEM),
+ 3 NCREXWTR (JELEM),NCREXWTS (JELEM),
+ 4 NCREXWTDW(JELEM)
+C
+C NCREXDWINC - data width increment
+C NCREXSCAM - scale multiplier
+C NCREXAFDW - augmented field data width
+C NCREXWT - pointer to working table
+C NCREXSTACK - list of data descriptors
+C ODREPF - replication (logical)
+C NCREXWTR - working table reference
+C NCREXWTS - working scale
+C NCREXWTDW - working data width
+C
+ CHARACTER CREXWTEN*64,CREXWTU*24
+C
+C
+ COMMON/CRTAB/ NCREXBR(JTAB),NCREXBS(JTAB) , NCREXBDW(JTAB),
+ 1 NCREXDR(JTAB),NCREXDST(JTAB) ,
+ 2 NCREXDL(JTAB),NCREXDSQ(JTAB*20),NCREXP(64,255)
+
+C
+C NCREXBR - table B, table reference array
+C NCREXBS - table B, scale array
+C NCREXBDW - table B, data width array
+C NCREXDR - table D, table reference array
+C NCREXDST - table D, starting pointers array
+C NCREXDL - table D, lengths array
+C NCREXDSQ - table D, list of sequence descriptors array
+C
+ COMMON /CRTABC/ CREXNAME(JTAB),CREXUNIT(JTAB)
+C
+C CREXNAME - table B, ELEMENT NAME array
+C CREXUNIT - table B, unit array
+C
+C
+C
+ CHARACTER*64 CREXNAME
+ CHARACTER*24 CREXUNIT
+C
+ DIMENSION ILIST(JELEM),KSTACK(*)
+C
+C ------------------------------------------------------------------
+C
+C* 1. OBTAIN LIST OF DESCRIPTORS FROM BUFR TABLE D.
+C ---------------------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ DO 110 J=1,JTAB
+C
+ IF(KDD.EQ.NCREXDR(J)) THEN
+ I=J
+ GO TO 120
+ END IF
+C
+ 110 CONTINUE
+C
+ KERR=20
+ WRITE(*,*) 'CREXETDR : ',KDD
+ CALL CREXERR(KERR)
+ RETURN
+C
+ 120 CONTINUE
+C
+ J1=NCREXDST(I)
+ J2=NCREXDL (I)
+ J3=0
+C
+ DO 121 J=J1,J1+J2-1
+C
+ J3 = J3 +1
+ ILIST(J3) = NCREXDSQ(J)
+C
+ 121 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 2. PUSH DOWN DATA DESCRIPTION DESCRIPTORS
+C --------------------------------------
+C TO MAKE ROOM FOR LIST.
+C ----------------------
+ 200 CONTINUE
+C
+ J2M1=J2-1
+C
+ DO 210 J=KJ1,KJ+1,-1
+C
+ KSTACK(J+J2M1) = KSTACK(J)
+C
+ 210 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 3. INSERT LIST IN PLACE OF SEQUENCE DESCRIPTORS.
+C ---------------------------------------------
+ 300 CONTINUE
+C
+ KJM1=KJ-1
+C
+ DO 310 J=1,J3
+C
+ KSTACK(KJM1+J)= ILIST(J)
+C
+ 310 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 4. ADJUST DESCRIPTOR COUNT FOR LIST LENGTH.
+C ----------------------------------------
+ 400 CONTINUE
+C
+ KJ = KJ - 1
+ KJ1 = KJ1 +J3 -1
+C ------------------------------------------------------------------
+C* 4.1 ADJUST NUMBER OF DATA DESCRIPTORS NOT PRESENT.
+C ----------------------------------------------
+ 610 CONTINUE
+C
+ IF(N221.NE.0) N221= KJ1 - KJ + 1
+C -----------------------------------------------------------------
+ 500 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/crexdc/crexex.F b/crexdc/crexex.F
new file mode 100755
index 0000000..1bf4798
--- /dev/null
+++ b/crexdc/crexex.F
@@ -0,0 +1,261 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXEX(KBUFL,YBUFF,KSUP,KSEC0,KSEC1,KSEC3,
+ 2 KELEM,CNAMES,CUNITS,KVALS,VALUES,CVALS,KERR)
+C
+C**** *CREXEX*
+C
+C
+C PURPOSE.
+C --------
+C Decode Crex message into fully expanded form; returning
+C information relevant for all CREX sections, expanded values,
+C their names and units.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXEX(KBUFL,YBUFF,KSUP,KSEC0,KSEC1,KSEC3,
+C 1 KELEM,CNAMES,CUNITS,KVALS,VALUES,CVALS,KERR)*
+C
+C INPUT :
+C *KBUFL* - Length of CREX message (words)
+C *YBUFF* - Character string containing Crex message
+C *KELEM* - Integer (expected number of expanded elements)
+C *KVALS* - Integer (expected number of data values)
+C OUTPUT:
+C *KSUP* - Integer array of 9 words containing
+C suplementary information
+C - KSUP( 1) -- IDIM1, dimension of KSEC1
+C - KSUP( 2) -- Reserved
+C - KSUP( 3) -- IDIM3, dimension of KSEC3
+C - KSUP( 4) -- Reserved
+C - KSUP( 5) -- M (number of elements in values
+C array, first index)
+C - KSUP( 6) -- N (number of subsets,second index
+C of values array)
+C - KSUP( 7) -- JVC (number of elements in CVAL array)
+C - KSUP( 8) -- total CREX message length in bytes
+C - KSUP( 9) -- IDIM0, dimension of KSEC0
+C
+C *KSEC0* - Integer array of 3 words containing
+C CREX section 0 information
+C KSEC0( 1)-- length of section 0 (bytes)
+C KSEC0( 2)-- total length of CREX message (bytes)
+C KSEC0( 3)-- CREX Edition number
+C
+C *KSEC1* - Integer array of at least 40 words
+C containing CREX section 1 information
+C KSEC1( 1)-- Reserved
+C KSEC1( 2)-- CREX Edition number
+C KSEC1( 3)-- Reserved
+C KSEC1( 4)-- Reserved
+C KSEC1( 5)-- Reserved
+C KSEC1( 6)-- CREX message type
+C KSEC1( 7)-- Reserved
+C KSEC1( 8)-- version number of local table used
+C KSEC1( 9)-- Reserved
+C KSEC1(10)-- Reserved
+C KSEC1(11)-- Reserved
+C KSEC1(12)-- Reserved
+C KSEC1(13)-- Reserved
+C KSEC1(14)-- CREX Master table
+C KSEC1(15)-- version number of Master table used
+C KSEC1(16) - KSEC1(40) -- Reserved
+C
+C Crex Edition 2
+C
+C *KSEC1* - Integer array of at least 40 words
+C containing CREX section 1 information
+C KSEC1( 1)-- Reserved
+C KSEC1( 2)-- CREX Edition number
+C KSEC1( 3)-- Originating Centre ( oooo)
+C KSEC1( 4)-- Update sequence number (uu)
+C KSEC1( 5)-- Number of subsets (sss)
+C KSEC1( 6)-- CREX data category (nnn)
+C KSEC1( 7)-- International data sub-category (mmm)
+C KSEC1( 8)-- version number of local table used
+C KSEC1( 9)-- Year (yyyy)
+C KSEC1(10)-- Month (mm)
+C KSEC1(11)-- Day (dd)
+C KSEC1(12)-- Hour (hh)
+C KSEC1(13)-- Minute (mm)
+C KSEC1(14)-- CREX Master table (tt)
+C KSEC1(15)-- version number of Master table used (vv)
+C KSEC1(16)-- Originating sub-centre (ppp)
+C KSEC1(17)-- Bufr master table version number
+C KSEC1(18)-- Bufr version number of local table used
+C KSEC1(19) - KSEC1(40) -- Reserved
+C
+C
+C *KSEC3* - Integer array of 4 words containing
+C
+C KSEC3( 1)-- Reserved
+C KSEC3( 2)-- Reserved
+C KSEC3( 3)-- number of subsets
+C KSEC3( 4)-- Reserved
+C
+C
+C *CNAMES* - Character*64 array of KELEM containing
+C CREX Table B element names
+C *CUNITS* - Character*24 array of KELEM containig
+C CREX Table B units
+C *VALUES* - Real*8 array of KVALS containing expanded
+C data values
+C *CVALS* - Character*80 array of KVALS containing
+C CREX code table or CCITTIA5 CREX elements
+C entries
+C *KERR* - returned error code
+C
+C
+C METHOD.
+C -------
+C
+C Crex message passed as argument to this routine is decoded
+C section by section. Suplementary information and expanded data
+C are returned as well as error code.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+C
+ DIMENSION KSUP(JSUP),KSEC0(JSEC0),KSEC1(JSEC1)
+ DIMENSION KSEC3(JSEC3)
+C
+ COMMON /CREXOFF/ NSIZEG(JELEM),NCREXWTRG(JWORK),
+ 1 NBP,NSUBSET,OMULTI
+C
+ REAL*8 VALUES(KVALS)
+C
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+ CHARACTER*80 CVALS(KVALS)
+C
+ CHARACTER*(*) YBUFF
+C
+ CHARACTER*4 CECMWF
+C
+C ------------------------------------------------------------------
+C
+C* 1. SET CONSTANTS.
+C --------------
+ 100 CONTINUE
+C
+ KERR=0
+C
+ M0=1
+C
+ DO 101 I=1,JSEC0
+ KSEC0(I)=0
+ 101 CONTINUE
+C
+ DO 102 I=1,JSEC1
+ KSEC1(I)=0
+ 102 CONTINUE
+C
+ DO 103 I=1,JSEC3
+ KSEC3(I)=0
+ 103 CONTINUE
+C
+ DO 104 I=1,JSUP
+ KSUP(I)=0
+ 104 CONTINUE
+C
+C
+ CALL CREXINIT(KBUFL,KERR)
+C
+C -----------------------------------------------------------------
+C* 2. EXPAND SECTION 0.
+C -----------------
+ 200 CONTINUE
+C
+ CALL CREXS0( KBUFL,YBUFF,KSUP,KSEC0,KERR )
+ IF(KERR.GT.0) RETURN
+C
+C ------------------------------------------------------------------
+C* 3. EXPAND SECTION 1.
+C ------------------
+ 300 CONTINUE
+C
+ CALL CREXS1( KBUFL,YBUFF,KSUP,KSEC0,KSEC1,KERR )
+ IF(KERR.GT.0) RETURN
+C
+C ------------------------------------------------------------------
+C* 4. LOAD CREX TABLES.
+C -----------------
+ 400 CONTINUE
+C
+ CALL CREXTB(KSEC1,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C ------------------------------------------------------------------
+C* 5. EXPAND SECTION 2.
+C -----------------
+ 500 CONTINUE
+C
+ OMULTI=.TRUE.
+ NSUBSET=0
+C
+ DO WHILE(OMULTI)
+C
+ NSUBSET=NSUBSET+1
+C
+ CALL CREXS2(KBUFL,YBUFF,KSUP,KSEC3,KELEM,CNAMES,CUNITS,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C ------------------------------------------------------------------
+C
+ CALL CREXS2DATA(KBUFL ,YBUFF ,KSUP ,KSEC3,
+ 1 KELEM ,CNAMES,CUNITS,KVALS,VALUES,CVALS,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ END DO
+C
+C ------------------------------------------------------------------
+C* 6. EXPAND SECTION 3.
+C -----------------
+ 600 CONTINUE
+C
+ CALL CREXS5(KBUFL,YBUFF,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C -----------------------------------------------------------------
+ RETURN
+C
+ END
diff --git a/crexdc/crexinit.F b/crexdc/crexinit.F
new file mode 100755
index 0000000..017f2a0
--- /dev/null
+++ b/crexdc/crexinit.F
@@ -0,0 +1,200 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXINIT(KBUFL,KERR)
+C
+C**** *CREXINIT*
+C
+C
+C PURPOSE.
+C --------
+C Initialize variables and constants.
+C Read in Units conversion table
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXINIT(KBUFL,KERR)*
+C
+C INPUT:
+C *KBUFL* - Size of CREX message in bytes
+C
+C OUTPUT:
+C *KERR* - Return error code
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+ COMMON /CREXWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+C
+ COMMON /CREXBEF / M,MM,N,JCV
+C
+C M - Number of elements
+C MM - Number of elements
+C N - Number of data sub_sets
+C JCV - Number of character values
+C
+ COMMON /CREXWT/ NCREXDWINC,NCREXSCAM,NCREXAFDW,NCREXWT ,ODREPF,
+ 2 NCREXSTACK(JELEM),NCREXWTEN(JELEM),
+ 3 NCREXWTR (JELEM),NCREXWTS (JELEM),NCREXWTRV(JELEM),
+ 4 NCREXWTDW(JELEM),NWTIW(JELEM),NWTIWS(JELEM)
+C
+C NCREXDWINC - data width increment
+C NCREXSCAM - scale multiplier
+C NCREXAFDW - augmented field data width
+C NCREXWT - pointer to working table
+C NCREXSTACK - list of data descriptors
+C ODREPF - replication (logical)
+C NCREXWTR - working table reference
+C NCREXWTS - working scale
+C NCREXWTRV - working reference value
+C NCREXWTDW - working data width
+C NWTIW - working data width of increments
+C NWTIWS - working total data width of element set
+C
+ COMMON /CREXUT/ YUNIT,CUNITNAME,CIA5,CIA2,NCODE,NRECORDS
+C
+C NCODE - array containing unit code number
+C CUNITNAME - array containing unit name
+C CIA5 - array containing unit CCITTIA5 name
+C CIA2 - array containing unit CCITTIA2 name
+C NRECORDS - number of entries in the list
+C
+
+ SAVE IFIRST
+C
+ DIMENSION NCODE(JCTEXT)
+ CHARACTER*30 CUNITNAME(JCTEXT)
+ CHARACTER*24 CIA5(JCTEXT)
+ CHARACTER*24 CIA2(JCTEXT)
+ CHARACTER*24 YUNIT
+C
+ LOGICAL OFIRST
+ LOGICAL ODREPF
+ REAL*8 RVIND
+ REAL*8 EPS
+ CHARACTER*256 CROOT
+ CHARACTER*256 FILENAME
+C
+ INTEGER EMOSNUM
+ EXTERNAL EMOSNUM
+C
+ FILENAME=' '
+ CROOT=' '
+ CALL GETENV('CREX_TABLES',CROOT)
+ ILNG=INDEX(CROOT,' ')
+ ILNG=ILNG-1
+ IF(ILNG.EQ.1) THEN
+C
+C SGI/HP/SUN CREX TABLES PATH
+C
+ CROOT='/home/ma/emos/tables/crex/'
+C
+C ADD VERSION NUMBER
+C
+ ILNG=INDEX(CROOT,' ')
+ IEMOSNM = EMOSNUM(1)
+ WRITE(CROOT(ILNG:ILNG+5),'(I6.6)') IEMOSNM
+ CROOT(ILNG+6:) = '/'
+ ILNG=ILNG+6
+ END IF
+
+ NGS=KBUFL
+ NE=0
+ NVIND=2147483647
+ RVIND=1.7D38
+ EPS=1.0D-8
+ M=0
+ N=0
+ NCREXWT=0
+ ODREPF=.false.
+ NCREXSCAM=0
+ NCREXAFDW=0
+ NCREXDWINC=0
+ NC07YYY=0
+ YUNIT=' '
+ IFIRST=1
+c
+ IF(IFIRST.NE.2) THEN
+C
+C Open/read table containing units associated with code numbers
+C to be used with C07YYY operator
+C
+ FILENAME=CROOT(1:ILNG)//'units.config.dat'
+ I=INDEX(FILENAME,' ')
+ I=I-1
+C
+ print*,'Units configuration file:'
+ print*,FILENAME
+ OPEN(UNIT=21,FILE=FILENAME(1:I),IOSTAT=IOS,STATUS="OLD")
+ IF(IOS.NE.0) THEN
+ print*,'Open error on units.config.dat'
+ KERR=38
+ RETURN
+ END IF
+
+ I=0
+ DO I=1,JCTEXT
+ READ(21,'(I3,1X,A30,A24,A24)',IOSTAT=IOS,END=100) NCODE(I),
+ 1 CUNITNAME(I),CIA5(I),CIA2(I)
+ IF(IOS.NE.0) THEN
+ WRITE(*,'(A)') 'Read error on units.config.dat'
+ KERR=39
+ RETURN
+ END IF
+C
+C WRITE(*,'(I3,1X,I3,1X,A30,A24,A24)') I, NCODE(I),
+C 1 CUNITNAME(I),CIA5(I),CIA2(I)
+ END DO
+C
+ 100 CONTINUE
+ NRECORDS=I-1
+ IFIRST=2
+ CLOSE(21)
+ END IF
+C
+ RETURN
+ END
diff --git a/crexdc/crexivar.F b/crexdc/crexivar.F
new file mode 100755
index 0000000..ee20abc
--- /dev/null
+++ b/crexdc/crexivar.F
@@ -0,0 +1,117 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXIVAR(KERR)
+C
+C**** *CREXIVAR*
+C
+C
+C PURPOSE.
+C --------
+C PRINT ERROR CODE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXIVAR(KERR)*
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 15/02/2003.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+ COMMON /CRWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+C
+ COMMON /CRBEF / M,MM,N,JCV
+C
+C M - Number of elements
+C MM - Number of elements
+C N - Number of data sub_sets
+C JCV - Number of character values
+C
+ COMMON /CRWT/ NCREXDWINC,NCREXSCAM,NCREXAFDW,NCREXWT ,ODREPF,
+ 2 NCREXSTACK(JELEM),NCREXWTEN(JELEM),
+ 3 NCREXWTR (JELEM),NCREXWTS (JELEM),
+ 4 NCREXWTDW(JELEM)
+C
+C NCREXDWINC - data width increment
+C NCREXSCAM - scale multiplier
+C NCREXAFDW - augmented field data width
+C NCREXWT - pointer to working table
+C NCREXSTACK - list of data descriptors
+C ODREPF - replication (logical)
+C NCREXWTR - working table reference
+C NCREXWTS - working scale
+C NCREXWTDW - working data width
+c
+
+c
+ DIMENSION NCODE(JCTEXT)
+ CHARACTER*30 CUNITNAME(JCTEXT)
+ CHARACTER*24 CIA5(JCTEXT)
+ CHARACTER*24 CIA2(JCTEXT)
+ CHARACTER*24 YUNIT
+c
+ LOGICAL OFIRST
+ LOGICAL ODREPF
+ REAL*8 RVIND
+ REAL*8 EPS
+
+ NGS=KBUFL
+ NE=0
+ NVIND=2147483647
+ RVIND=1.7D38
+ EPS=1.0D-8
+ M=0
+ N=0
+ NCREXWT=0
+ ODREPF=.false.
+ NCREXSCAM=0
+ NCREXAFDW=0
+ NCREXDWINC=0
+ NC07YYY=0
+ YUNIT=' '
+C
+ RETURN
+ END
diff --git a/crexdc/crexoper.F b/crexdc/crexoper.F
new file mode 100755
index 0000000..0fcdaf9
--- /dev/null
+++ b/crexdc/crexoper.F
@@ -0,0 +1,222 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXOPER(KPT,KDLEN,KDATA,KJ,KDD,KSTACK,KERR)
+C
+C
+C**** *CREXOPER*
+C
+C
+C PURPOSE.
+C --------
+C
+C PROCESS BUFR OPERATOR.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXOPER(KPT,KDLEN,KDATA,KJ,KDD,KSTACK,KERR)*
+C
+C INPUT :
+C *KPT* - POINTER TO KDATA ARRAY
+C *KDLEN* - DIMENSION OF KDATA ARRAY
+C *KDATA* - ARRAY CONTAINING DATA NEEDED FOR DESCRIPTOR
+C EXPANSION
+C *KJ* - POINTER T ARRAY KSTACK
+C *KDD* - DATA DESCRIPTOR
+C OUTPUT:
+C *KSTACK* - LIST OF DESCRIPTORS
+C *KERR* - RETURN ERROR CODE
+C
+C *METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4=2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+C
+ COMMON /CRWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+
+C
+ COMMON /CRWT/ NCREXDWINC,NCREXSCAM,NCREXAFDW,NCREXWT ,ODREPF,
+ 2 NCREXSTACK(JELEM),NCREXWTEN(JELEM),
+ 3 NCREXWTR (JELEM),NCREXWTS (JELEM),
+ 4 NCREXWTDW(JELEM)
+C
+C NCREXDWINC - data width increment
+C NCREXSCAM - scale multiplier
+C NCREXAFDW - augmented field data width
+C NCREXWT - pointer to working table
+C NCREXSTACK - list of data descriptors
+C ODREPF - replication (logical)
+C NCREXWTR - working table reference
+C NCREXWTS - working scale
+C NCREXWTDW - working data width
+C
+ CHARACTER CREXWTEN*64,CREXWTU*24
+C
+ COMMON /CRWTC/ CREXWTEN(JELEM),CREXWTU(JELEM)
+C
+C CREXWTEN - working table element naame
+C CREXWTU - working table units
+C
+C
+C
+ COMMON /CRBEF / M,MM,N,JCV
+C
+C M - Number of elements
+C MM - Number of elements
+C N - Number of data sub_sets
+C JCV - Number of character values
+
+C
+C
+ REAL*8 RVIND
+ REAL*8 EPS
+C
+ DIMENSION KSTACK(*)
+ DIMENSION KDATA(KDLEN)
+C
+C ------------------------------------------------------------------
+C
+C* 1. DETERMINE *F *X AND *Y.
+C -----------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ IF = KDD / 100000
+ IDIF= KDD - IF * 100000
+ IX = IDIF / 1000
+ IY = IDIF - IX * 1000
+C
+ IF( IF.NE.2 ) THEN
+ KERR=21
+ WRITE(*,*) ' CREXOPER :'
+ CALL CREXERR(KERR)
+ GO TO 400
+ END IF
+C
+C* 1.1 CHANGE DATA WIDTH ?
+C -------------------
+ 110 CONTINUE
+C
+ IF(IX.EQ.1) THEN
+ NCREXDWINC= IY
+ GO TO 400
+ END IF
+C
+C* 1.2 CHANGE SCALE ?
+C --------------
+ 120 CONTINUE
+C
+ IF(IX.EQ.2) THEN
+C
+C
+C* 1.2.1 UPDATE SCALE MULTIPLIER.
+C ------------------------
+C
+ IF(IY.GT.900) IY=-(IY-900)
+ NCREXSCAM=IY
+ GO TO 400
+ END IF
+C
+C
+C* 1.4 ADD ASSOCIATED FIELD ?
+C ----------------------
+ 140 CONTINUE
+C
+ IF(IX.EQ.4) THEN
+C
+C* 1.4.1 UPDATE ASSOCIATED FIELD WIDTH.
+C ------------------------------
+ NCREXAFDW= IY
+ GO TO 400
+ END IF
+C
+C* 1.5 SIGNIFY CHARACTER ?
+C -------------------
+ 150 CONTINUE
+C
+ IF(IX.EQ.5) THEN
+C
+C* 1.5.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NCREXWT = NCREXWT + 1
+ CREXWTEN(NCREXWT)='CHARACTERS'
+ CREXWTU(NCREXWT)=' '
+ NCREXWTR (NCREXWT)= kdd
+ NCREXWTDW(NCREXWT)= IY
+ NCREXWTEN(NCREXWT)=658367
+ NCREXWTS (NCREXWT)=0
+ GO TO 400
+ END IF
+C
+C
+C* 1.6 CHANGE UNIT
+C ------------
+ 160 CONTINUE
+C
+ IF(IX.EQ.7) THEN
+C
+ IERR=0
+ CALL GET_UNITS(IY,IERR)
+ IF(IERR.EQ.0) THEN
+ NC07YYY=IY
+ END IF
+C
+ GO TO 400
+C
+ END IF
+C
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ KERR=22
+ WRITE(*,*) 'CREXOPER:'
+ CALL CREXERR(KERR)
+C
+C ------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ RETURN
+ END
diff --git a/crexdc/crexprco.F b/crexdc/crexprco.F
new file mode 100755
index 0000000..bbeb858
--- /dev/null
+++ b/crexdc/crexprco.F
@@ -0,0 +1,219 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXPRCO(KBUFL,YBUFF,KJ,KDD,KSTACK,KELEM,KERR)
+C
+C**** *CREXPRCO*
+C
+C
+C PURPOSE.
+C --------
+C
+C Process CREX operator.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXPRCO(KBUFL,YBUFF,KJ,KDD,KSTACK,KELEM,KERR)*
+C
+C INPUT :
+C *KBUFL* - length of CREX message (words)
+C *YBUFF* - array containing CREX message
+C *KJ* - pointer to array kstack
+C *KDD* - data descriptor
+C *KELEM* - dimension of CNAMES, CUNITS array
+C OUTPUT:
+C *KSTACK* - list of descriptors
+C *KERR* - return error code
+C
+C *METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+C
+C
+ COMMON /CREXWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+C
+ COMMON /CREXWT/ NCREXDWINC,NCREXSCAM,NCREXAFDW,NCREXWT ,ODREPF,
+ 2 NCREXSTACK(JELEM),NCREXWTEN(JELEM),
+ 3 NCREXWTR (JELEM),NCREXWTS (JELEM),NCREXWTRV(JELEM),
+ 4 NCREXWTDW(JELEM),NWTIW(JELEM),NWTIWS(JELEM)
+C
+C NCREXDWINC - data width increment
+C NCREXSCAM - scale multiplier
+C NCREXAFDW - augmented field data width
+C NCREXWT - pointer to working table
+C NCREXSTACK - list of data descriptors
+C ODREPF - replication (logical)
+C NCREXWTR - working table reference
+C NCREXWTS - working scale
+C NCREXWTRV - working reference value
+C NCREXWTDW - working data width
+C NWTIW - working data width of increments
+C NWTIWS - working total data width of element set
+C
+C
+ COMMON /CREXWTC/ CREXWTEN(JELEM),CREXWTU (JELEM)
+C
+C CREXWTEN - working table element naame
+C CREXWTU - working table units
+C
+C
+ COMMON /CREXBEF / M,MM,N,JCV
+C
+C M - Number of elements
+C MM - Number of elements
+C N - Number of data sub_sets
+C JCV - Number of character values
+C
+C
+ COMMON /CREXUT/ YUNIT,CUNITNAME,CIA5,CIA2,NCODE,NRECORDS
+C
+C NCODE - array containing unit code number
+C CUNITNAME - array containing unit name
+C CIA5 - array containing unit CCITTIA5 name
+C CIA2 - array containing unit CCITTIA2 name
+C NRECORDS - number of entries in the list
+C
+ DIMENSION NCODE(JCTEXT)
+ CHARACTER*30 CUNITNAME(JCTEXT)
+ CHARACTER*24 CIA5(JCTEXT)
+ CHARACTER*24 CIA2(JCTEXT)
+ CHARACTER*24 YUNIT
+C
+ CHARACTER CREXWTEN*64,CREXWTU*24
+ DIMENSION KSTACK(*)
+ CHARACTER*(*) YBUFF
+ REAL*8 RVIND,EPS
+C
+C ------------------------------------------------------------------
+C
+C* 1. DETERMINE *F *X AND *Y.
+C -----------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ IF = KDD / 100000
+ IDIF= KDD - IF * 100000
+ IX = IDIF / 1000
+ IY = IDIF - IX * 1000
+C
+ IF( IF.NE.2 ) THEN
+ KERR=21
+ PRINT*,' CREXPRCO :'
+ CALL CREXERR(KERR)
+ GO TO 400
+ END IF
+C
+C* 1.1 CHANGE DATA WIDTH ?
+C -------------------
+ 110 CONTINUE
+C
+ IF(IX.EQ.1) THEN
+ NCREXDWINC= IY
+ GO TO 400
+ END IF
+C
+C* 1.2 CHANGE SCALE ?
+C --------------
+ 120 CONTINUE
+C
+ IF(IX.EQ.2) THEN
+C
+C* 1.2.1 UPDATE SCALE MULTIPLIER.
+C ------------------------
+C
+ IF(IY.GT.900) IY=-(IY-900)
+ NCREXSCAM=IY
+ GO TO 400
+ END IF
+C
+C
+C* 1.5 SIGNIFY CHARACTER ?
+C -------------------
+ 150 CONTINUE
+C
+ IF(IX.EQ.5) THEN
+C
+C* 1.5.1 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ NCREXWT = NCREXWT + 1
+ CREXWTEN(NCREXWT)='CHARACTERS'
+ CREXWTU (NCREXWT)=' '
+ NCREXWTR (NCREXWT)= kdd
+ NCREXWTDW(NCREXWT)= IY
+ NCREXWTEN(NCREXWT)=658367
+ NCREXWTS (NCREXWT)=0
+ NCREXWTRV(NCREXWT)=0
+ GO TO 400
+ END IF
+C
+C 1.6 CHANGE UNIT
+C -----------
+ 160 CONTINUE
+C
+ IERR=0
+ IF(IX.EQ.7) THEN
+ CALL GET_UNITS(IY,IERR)
+ IF(IERR.EQ.0) THEN
+ NC07YYY=IY
+ END IF
+C
+ GO TO 400
+C
+ END IF
+C
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ KERR=22
+ PRINT*,'CREXPRCO:'
+ CALL CREXERR(KERR)
+C
+C ------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ RETURN
+ END
diff --git a/crexdc/crexprs0.F b/crexdc/crexprs0.F
new file mode 100755
index 0000000..ffde02c
--- /dev/null
+++ b/crexdc/crexprs0.F
@@ -0,0 +1,77 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXPRS0(KSEC0)
+C
+C**** *CREXPRS0*
+C
+C
+C PURPOSE.
+C --------
+C PRINT SECTION 0 OF CREX MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXPRS0(KSEC0)*
+C
+C INPUT :
+C *KSEC0* - ARRAY CONTAINING SECTION 0 INFORMATION
+C KSEC0( 1)-- LENGTH OF SECTION 0 (BYTES)
+C KSEC0( 2)-- TOTAL LENGTH OF CREX MESSAGE (BYTES)
+C KSEC0( 3)-- Crex Edition number
+C
+C METHOD.
+C -------
+C
+C NONE
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ DIMENSION KSEC0(*)
+C
+C ------------------------------------------------------------------
+C
+C* 1. PRINT SECTION 0.
+C ----------------
+ 100 CONTINUE
+C
+ WRITE(*,'(1H1)')
+C
+ WRITE(*,'(1H ,A)') ' CREX SECTION 0 '
+ WRITE(*,'(1H )')
+ WRITE(*,'(1H ,A,I5)') 'LENGTH OF SECTION 0 (BYTES) ',
+ 1 KSEC0(1)
+ WRITE(*,'(1H ,A,I5)') 'TOTAL LENGTH OF CREX MESSAGE (BYTES)',
+ 1 KSEC0(2)
+C
+ RETURN
+ END
diff --git a/crexdc/crexprs1.F b/crexdc/crexprs1.F
new file mode 100755
index 0000000..807804a
--- /dev/null
+++ b/crexdc/crexprs1.F
@@ -0,0 +1,195 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXPRS1(KSEC1,KSEC3,KTDLEN,KTDLST,KTDEXL,KTDEXP,
+ 1 KELEM,CNAMES)
+C
+C**** *CREXPRS1*
+C
+C
+C PURPOSE.
+C --------
+C PRINT SECTION 1 OF CREX MESSAGE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXPRS1(KSEC1,KSEC3,KTDLEN,KTDLST,KTDEXL,KTDEXP,
+C KELEM,CNAMES)*
+C
+C INPUT :
+C
+C *KSEC1* - ARRAY CONTAINING SECTION 1 INFORMATION
+C KSEC1( 1)-- Not used
+C KSEC1( 2)-- CREX EDITION NUMBER
+C KSEC1( 3)-- Not used
+C KSEC1( 4)-- Not Used
+C KSEC1( 5)-- Not used
+C KSEC1( 6)-- CREX MESSAGE TYPE
+C KSEC1( 7)-- Not used
+C KSEC1( 8)-- VERSION NUMBER OF LOCAL TABLE USED
+C KSEC1( 9)-- Not used
+C KSEC1(10)-- Not used
+C KSEC1(11)-- Not used
+C KSEC1(12)-- Not used
+C KSEC1(13)-- Not used
+C KSEC1(14)-- CREX MASTER TABLE
+C KSEC1(15)-- VERSION NUMBER OF MASTER TABLE USED
+C KSEC1(16) - KSEC1(JSEC1) -- Not used
+C
+C Crex Edition 2
+C
+C *KSEC1* - Integer array of at least 40 words
+C containing CREX section 1 information
+C KSEC1( 1)-- Reserved
+C KSEC1( 2)-- CREX Edition number
+C KSEC1( 3)-- Originating Centre ( oooo)
+C KSEC1( 4)-- Update sequence number (uu)
+C KSEC1( 5)-- Number of subsets (sss)
+C KSEC1( 6)-- CREX data category (nnn)
+C KSEC1( 7)-- International data sub-category (mmm)
+C KSEC1( 8)-- version number of local table used
+C KSEC1( 9)-- Year (yyyy)
+C KSEC1(10)-- Month (mm)
+C KSEC1(11)-- Day (dd)
+C KSEC1(12)-- Hour (hh)
+C KSEC1(13)-- Minute (mm)
+C KSEC1(14)-- CREX Master table (tt)
+C KSEC1(15)-- version number of Master table used (vv)
+C KSEC1(16)-- Originating sub-centre (ppp)
+C KSEC1(17)-- Bufr master table version number
+C KSEC1(18)-- Bufr version number of local table used
+C KSEC1(19) - KSEC1(40) -- Reserved
+C
+
+C
+C *KSEC3* - Integer array of 4 words containing
+C KSEC3( 1)-- Reserved
+C KSEC3( 2)-- Reserved
+C KSEC3( 3)-- number of subsets
+C KSEC3( 4)-- Reserved
+
+C *KTDLEN* - number of data descriptors in section 1
+C *KTDLST* - array containing data descriptors in section 1
+C *KTDEXL* - number of entries in list of expanded data descriptors
+C *KTDEXP* - array containig expanded data descriptors
+C *KELEM* - Integer (expected number of expanded elements)
+C *CNAMES* - Character*64 array of KELEM containing
+C CREX Table B element names
+C
+C
+C METHOD.
+C -------
+C
+C NONE
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+ DIMENSION KSEC1(*)
+ DIMENSION KSEC3(*)
+ DIMENSION KTDLST(KTDLEN),KTDEXP(KTDEXL)
+C
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*6 YYYYYY
+
+C
+C ------------------------------------------------------------------
+C
+C* 1. PRINT SECTION 1.
+C ----------------
+ 100 CONTINUE
+C
+ WRITE(*,'(1H1)')
+C
+ WRITE(*,'(1H ,A)') ' CREX SECTION 1 '
+ WRITE(*,'(1H )')
+ IF(KSEC1(2).LT.2) THEN
+ WRITE(*,'(1H ,A,I5)')'CREX EDITION NUMBER ',KSEC1( 2)
+ WRITE(*,'(1H ,A,I5)')'CREX MESSAGE TYPE ',KSEC1( 6)
+ WRITE(*,'(1H ,A,I5)')'VERSION NUMBER OF LOCAL TABLE ',KSEC1( 8)
+ WRITE(*,'(1H ,A,I5)')'VERSION NUMBER OF MASTER TABLE ',KSEC1(15)
+ WRITE(*,'(1H ,A,I5)')'CREX MASTER TABLE ',KSEC1(14)
+C
+ WRITE(*,'(1H1)')
+ WRITE(*,'(1H ,A,I5)')'NUMBER OF SUBSETS ',KSEC3( 3)
+ ELSE
+ WRITE(*,'(1H ,A,I5)')'CREX EDITION NUMBER ',KSEC1( 2)
+ WRITE(*,'(1H ,A,I5)')'ORIGINATING CENTRE ',KSEC1( 3)
+ WRITE(*,'(1H ,A,I5)')'ORIGINATING SUB-CENTRE ',KSEC1(16)
+ WRITE(*,'(1H ,A,I5)')'UPDATE SEQUENCE NUMBER ',KSEC1( 4)
+ WRITE(*,'(1H ,A,I5)')'CREX DATA CATEGORY ',KSEC1( 6)
+ WRITE(*,'(1H ,A,I5)')'INTERNATIONAL DATA SUB-CATEGORY',KSEC1( 7)
+ WRITE(*,'(1H ,A,I5)')'YEAR ',KSEC1( 9)
+ WRITE(*,'(1H ,A,I5)')'MONTH ',KSEC1(10)
+ WRITE(*,'(1H ,A,I5)')'DAY ',KSEC1(11)
+ WRITE(*,'(1H ,A,I5)')'HOUR ',KSEC1(12)
+ WRITE(*,'(1H ,A,I5)')'MINUTE ',KSEC1(13)
+ WRITE(*,'(1H ,A,I5)')'VERSION NUMBER OF MASTER TABLE ',KSEC1(15)
+ WRITE(*,'(1H ,A,I5)')'VERSION NUMBER OF LOCAL TABLE ',KSEC1( 8)
+ WRITE(*,'(1H ,A,I5)')'CREX MASTER TABLE ',KSEC1(14)
+ WRITE(*,'(1H ,A,I5)')'BUFR MASTER TABLE NUMBER ',KSEC1(17)
+ WRITE(*,'(1H ,A,I5)')'BUFR VERSION OF LOCAL TABLE ',KSEC1(18)
+C
+ WRITE(*,'(1H1)')
+ WRITE(*,'(1H ,A,I5)')'NUMBER OF SUBSETS ',KSEC3( 3)
+C
+ END IF
+C
+C
+ WRITE(*,'(1H ,//)')
+ WRITE(*,'(1H ,A)') ' DATA DESCRIPTORS (UNEXPANDED)'
+ WRITE(*,'(1H )')
+C
+ WRITE(*,'(1H )')
+ DO 110 I=1,KTDLEN
+ write(yyyyyy,'(i6.6)') KTDLST(I)
+ if(yyyyyy(1:1).eq.'0') yyyyyy(1:1)='B'
+ if(yyyyyy(1:1).eq.'1') yyyyyy(1:1)='R'
+ if(yyyyyy(1:1).eq.'2') yyyyyy(1:1)='C'
+ if(yyyyyy(1:1).eq.'3') yyyyyy(1:1)='D'
+ WRITE(*,'(1H ,I4,2X,A)') I,yyyyyy
+ 110 CONTINUE
+C
+ WRITE(*,'(1H ,/)')
+ WRITE(*,'(1H ,A)') ' DATA DESCRIPTORS (EXPANDED)'
+ WRITE(*,'(1H )')
+ DO 120 I=1,KTDEXL
+ write(yyyyyy,'(i6.6)') KTDEXP(I)
+ if(yyyyyy(1:1).eq.'0') yyyyyy(1:1)='B'
+ if(yyyyyy(1:1).eq.'1') yyyyyy(1:1)='R'
+ if(yyyyyy(1:1).eq.'2') yyyyyy(1:1)='C'
+ if(yyyyyy(1:1).eq.'3') yyyyyy(1:1)='D'
+ WRITE(*,'(1H ,I5,2X,A,2X,A)') I,yyyyyy,CNAMES(I)
+ 120 CONTINUE
+
+ RETURN
+ END
diff --git a/crexdc/crexprt.F b/crexdc/crexprt.F
new file mode 100755
index 0000000..a62590c
--- /dev/null
+++ b/crexdc/crexprt.F
@@ -0,0 +1,422 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXPRT(K,KSUB1,KSUB2,KELEM,CNAMES,CUNITS,
+ 1 CVALS,KVALS,VALUES,KSUP,KSEC1,KERR)
+C
+C**** *CREXPRT*
+C
+C
+C PURPOSE.
+C --------
+C PRINT EXPANDED CREX MESSAG.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXPRT(K,KSUB1,KSUB2,KELEM,CNAMES,CUNITS,
+C CVALS,KVALS,VALUES,KSUP,KSEC1,KERR)*
+C
+C INPUT :
+C *K* - SWITCH TO PRINT WITH/WITOUT CONTENT OF CODE TABLES
+C 0 - NO CODE TABLE CONTENT
+C 1 - YES CODE TABLE CONTENT
+C *KSUB1* - STARTING SUBSET
+C *KSUB2* - ENDING SUBSET
+C *KELEM* - DIMENSION OF CNAMES, CUNITS ARRAY
+C *CNAMES* - CHARACTER ARRAY CONTAINING ELEMENT NAMES
+C *CUNITS* - CHARACTER ARRAY CONTAINIG UNITS
+C *CVALS* - CHARACTER ARRAY CONTAINING CREX CODE TABLE
+C ENTRIES
+C *KVALS* - DIMENSION OF VALUES ARRAY
+C *VALUES* - REAL*8 ARRAY (EXPANDED DATA VALUES)
+C
+C *KSUP* - Integer array of 9 words containing
+C suplementary information
+C - KSUP( 1) -- IDIM1, dimension of KSEC1
+C - KSUP( 2) -- Reserved
+C - KSUP( 3) -- IDIM3, dimension of KSEC3
+C - KSUP( 4) -- Reserved
+C - KSUP( 5) -- M (number of elements in values
+C array, first index)
+C - KSUP( 6) -- N (number of subsets,second index
+C of values array)
+C - KSUP( 7) -- JVC (number of elements in CVAL array)
+C - KSUP( 8) -- total CREX message length in bytes
+C - KSUP( 9) -- IDIM0, dimension of KSEC0
+C
+C *KSEC1* - Integer array of at least 40 words
+C containing CREX section 1 information
+C KSEC1( 1)-- Reserved
+C KSEC1( 2)-- CREX Edition number
+C KSEC1( 3)-- Reserved
+C KSEC1( 4)-- Reserved
+C KSEC1( 5)-- Reserved
+C KSEC1( 6)-- CREX message type
+C KSEC1( 7)-- Reserved
+C KSEC1( 8)-- version number of local table used
+C KSEC1( 9)-- Reserved
+C KSEC1(10)-- Reserved
+C KSEC1(11)-- Reserved
+C KSEC1(12)-- Reserved
+C KSEC1(13)-- Reserved
+C KSEC1(14)-- CREX Master table
+C KSEC1(15)-- version number of Master table used
+C KSEC1(16) - KSEC1(40) -- Reserved
+C
+C
+C Crex Edition 2
+C
+C *KSEC1* - Integer array of at least 40 words
+C containing CREX section 1 information
+C KSEC1( 1)-- Reserved
+C KSEC1( 2)-- CREX Edition number
+C KSEC1( 3)-- Originating Centre ( oooo)
+C KSEC1( 4)-- Update sequence number (uu)
+C KSEC1( 5)-- Number of subsets (sss)
+C KSEC1( 6)-- CREX data category (nnn)
+C KSEC1( 7)-- International data sub-category (mmm)
+C KSEC1( 8)-- version number of local table used
+C KSEC1( 9)-- Year (yyyy)
+C KSEC1(10)-- Month (mm)
+C KSEC1(11)-- Day (dd)
+C KSEC1(12)-- Hour (hh)
+C KSEC1(13)-- Minute (mm)
+C KSEC1(14)-- CREX Master table (tt)
+C KSEC1(15)-- version number of Master table used (vv)
+C KSEC1(16)-- Originating sub-centre (ppp)
+C KSEC1(17)-- Bufr master table version number
+C KSEC1(18)-- Bufr version number of local table used
+C KSEC1(19) - KSEC1(40) -- Reserved
+C
+C OUTPUT:
+C *KERR* - RETURNED ERROR CODE
+C
+C
+C
+C
+C METHOD.
+C -------
+C
+C NONE
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 04/02/2003.
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+ COMMON /CREXWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+
+C
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+ CHARACTER*80 CVALS(KVALS)
+ CHARACTER YCHAR*30,YLONG*320
+C
+C
+ DIMENSION KTDLST(JELEM)
+ DIMENSION KTDEXP(JELEM)
+
+ DIMENSION KSUP(*),KSEC1(*)
+ REAL*8 VALUES(KVALS)
+ REAL*8 RVIND, EPS
+C
+C
+C ------------------------------------------------------------------
+C
+C* 1. PRINT CREX MESSAGE.
+C -------------------
+ 100 CONTINUE
+C
+ KERR=0
+C
+ ISUB1=KSUB1
+ ISUB2=KSUB2
+ IF(ISUB1.LE.0.OR.ISUB2.LE.0) THEN
+ WRITE(*,'(A)') ' WARNING - NEGATIVE KSUB1 OR KSUB2.'
+ WRITE(*,'(A,I5)') ' WARNING - NUMBER OF SUBSETS IS ',KSUP(6)
+ RETURN
+ END IF
+ IF(ISUB1.GT.KSUP(6)) THEN
+ WRITE(*,'(A,I5)') ' WARNING - NUMBER OF SUBSETS IS ',KSUP(6)
+ RETURN
+ END IF
+ IF(ISUB2.GT.KSUP(6)) THEN
+ ISUB2=KSUP(6)
+ WRITE(*,'(A,I5)') ' WARNING - KSUB2 REPLACED BY ',KSUP(6)
+ END IF
+C
+ JQCP1= 0
+C
+ IF(K.EQ.0) THEN
+ JQPR=0
+ JQUA=0
+ JQC=0
+C DO 171 J171=1,KSUP(5)
+C IF(CNAMES(J171)(1:8).EQ.'DATA PRE') THEN
+C JQPR=J171
+C GO TO 172
+C END IF
+C 171 CONTINUE
+C 172 DO 173 J173=1,KSUP(5)
+C IF(CNAMES(J173)(1:9).EQ.'QUALITY I') JQUA=J173
+C 173 CONTINUE
+C DO 174 J174=1,KSUP(5)
+C IF(CNAMES(J174)(1:3).EQ.'% C') THEN
+C JQC =J174
+C GO TO 175
+C END IF
+C 174 CONTINUE
+C
+C 175 CONTINUE
+C
+C WRITE(*,'(1H1)')
+C
+C WRITE(*,'(1H ,A)') 'EXPANDED CREX MESSAGE '
+C WRITE(*,'(1H ,//)')
+C WRITE(*,'(1H ,A,I6)') 'CREX MESSAGE DATA TYPE ',KSEC1(6)
+C WRITE(*,'(1H ,A,I6)') 'RDB DATA SUBTYPE ',KSEC1(7)
+C WRITE(*,'(1H ,A,I6)') 'TOTAL BUFR LENGTH (BYTES) ',KSUP(8)
+C
+ NTYPE=KSEC1(7)
+ IF(JQUA.EQ.0) THEN !IF(JQUA.NE.0) THEN
+ JQUA=KSUP(5)
+C
+ DO 103 JB=ISUB1,ISUB2
+ CALL CREXSEL2(JB,KELEM,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+ 1 CUNITS,KERR)
+ JQUA=KTDEXL
+C
+ ILN=0
+ WRITE(*,'(1H )')
+C
+ DO 104 JA=1,JQUA
+C
+ ILN=ILN+1
+ JAJB=JA+(JB-1)*KELEM
+C
+ IF(ABS(VALUES(JAJB)-RVIND).LT.EPS) THEN
+ WRITE(*,9918) ILN,CNAMES(JA),CUNITS(JA)
+ ELSE
+ IF(CUNITS(JA)(1:4).EQ.'CCIT') THEN
+ I=NINT(VALUES(JAJB)/1000)
+ NCHAR=VALUES(JAJB)-I*1000
+ NW=NCHAR/80
+ NWOFF=NCHAR-NW*80
+ IF(NWOFF.NE.0) NW=NW+1
+C
+ YLONG=' '
+ YLONG(1:80)=CVALS(I)
+C
+ II=I
+ DO 125 JC=1,NW-1
+ II=II+1
+ KF=JC*80+1
+ KL=(JC+1)*80
+ YLONG(KF:KL)=CVALS(II)
+ 125 CONTINUE
+C
+ NLINE=NCHAR/30
+ IDIF =NCHAR-NLINE*30
+ IF(IDIF.NE.0) NLINE=NLINE+1
+ YCHAR=' '
+ YCHAR=YLONG(1:30)
+C
+ WRITE(*,9919)ILN,CNAMES(JA),VALUES(JAJB),
+ 1 CUNITS(JA),YCHAR
+C
+ IF(NLINE.GT.1) THEN
+ DO 130 JJ=1,NLINE-1
+C
+ K2=JJ*30+1
+ K1=(JJ+1)*30
+ YCHAR=' '
+ YCHAR=YLONG(K2:K1)
+C
+ WRITE(*,9920) YCHAR
+ 130 CONTINUE
+C
+ END IF
+ ELSE
+ WRITE(*,9917) ILN,CNAMES(JA),VALUES(JAJB),
+ 1 CUNITS(JA)
+ END IF
+ END IF
+C
+ 104 CONTINUE
+ 103 CONTINUE
+C
+ ELSE
+ JQPRM1=JQPR-1
+ JQC=JQC-1
+C
+ DO 101 JB=ISUB1,ISUB2
+C
+ ILN=0
+ JQCP1=0
+C
+ WRITE(*,'(1H )')
+C
+ DO 102 JA=1,JQUA-1
+C
+ ILN=ILN+1
+ JAJB=JA+(JB-1)*KELEM
+ JQPJB=JQPRM1+JA+(JB-1)*KELEM
+C
+ IF(VALUES(JQPJB).EQ.0.0) THEN
+ JQCP1=JQCP1+1
+ JQCPP1=JQC+JQCP1+(JB-1)*KELEM
+ IF(ABS(VALUES(JAJB)-RVIND).LT.EPS) THEN
+ WRITE(*,9918) ILN,CNAMES(JA),CUNITS(JA)
+ ELSE
+ WRITE(*,9916) ILN,CNAMES(JA),VALUES(JAJB),
+ 1 CUNITS(JA),
+ 1 CNAMES(JQC+JQCP1),VALUES(JQCPP1),
+ 1 CUNITS(JQC+JQCP1)
+ END IF
+ ELSE
+ IF(ABS(VALUES(JAJB)-RVIND).LT.EPS) THEN
+ WRITE(*,9918) ILN,CNAMES(JA),CUNITS(JA)
+ IF(NTYPE.EQ.5.OR.NTYPE.EQ.3) JQCP1=JQCP1+1
+ ELSE
+ WRITE(*,9917) ILN,CNAMES(JA),VALUES(JAJB),
+ 1 CUNITS(JA)
+ IF(NTYPE.EQ.5.OR.NTYPE.EQ.3) JQCP1=JQCP1+1
+ END IF
+ END IF
+C
+C
+ 102 CONTINUE
+ 101 CONTINUE
+C
+ END IF
+ END IF
+C
+ IF(K.EQ.1) THEN
+C
+C---------------------------------------------------------------------
+ WRITE(*,'(1H1)')
+C
+ WRITE(*,'(1H ,A)') 'WARNING : PRINTING CONTENT OF CODE'//
+ 1 ' TABLES NOT YET IMPLEMENTED.'
+ RETURN
+C---------------------------------------------------------------------
+C
+C WRITE(*,'(1H ,A)') 'EXPANDED CREX MESSAGE '
+C WRITE(*,'(1H ,//)')
+C WRITE(*,'(1H ,A,I6)') 'RDB DATA TYPE ',KSEC1(6)
+C WRITE(*,'(1H ,A,I6)') 'RDB DATA SUBTYPE ',KSEC1(7)
+C WRITE(*,'(1H ,A,I6)') 'TOTAL BUFR LENGTH (BYTES) ',KSUP(8)
+C
+C DO 150 JB=1,KSUP(6)
+C
+C WRITE(*,'(1H )')
+C
+C DO 160 JA=1,KSUP(5)
+C
+C JAJB=JA+(JB-1)*KELEM
+C
+C IF(ABS(VALUES(JAJB)-RVIND).LT.EPS) THEN
+C WRITE(*,9903) CNAMES(JA)(1:32),CUNITS(JA)
+C WRITE(*,9903) CNAMES(JA)(33:64)
+C ELSE
+C IF(CUNITS(JA)(1:10).EQ.'CODE TABLE'.OR.
+C 1 CUNITS(JA)(1:9) .EQ.'CCITTIA5' ) THEN
+C I=NINT(VALUES(JAJB)/1000)
+C NCHAR=VALUES(JAJB)-I*1000
+C NW=NCHAR/80
+C NWOFF=NCHAR-NW*80
+C IF(NWOFF.NE.0) NW=NW+1
+CC
+C YLONG(1:80)=CVALS(I)
+C
+C II=I
+C DO 165 JC=1,NW-1
+C II=II+1
+C KF=JC*80+1
+C KL=(JC+1)*80
+C YLONG(KF:KL)=CVALS(II)
+C 165 CONTINUE
+C
+C NLINE=NCHAR/30
+C IDIF =NCHAR-NLINE*30
+C IF(IDIF.NE.0) NLINE=NLINE+1
+C YCHAR=YLONG(1:30)
+C
+C WRITE(*,9904)CNAMES(JA)(1:32),VALUES(JAJB),
+C 1 CUNITS(JA),YCHAR
+C WRITE(*,9904)CNAMES(JA)(33:64)
+C
+C IF(NLINE.GT.1) THEN
+C DO 170 JJ=1,NLINE-1
+C
+C K2=JJ*30+1
+C K1=(JJ+1)*30
+C YCHAR=YLONG(K2:K1)
+C
+C WRITE(*,9905) YCHAR
+C 170 CONTINUE
+C
+C END IF
+C ELSE
+C WRITE(*,9906) CNAMES(JA)(1:32),VALUES(JAJB),
+C 1 CUNITS(JA)
+C WRITE(*,9906) CNAMES(JA)(33:64)
+C END IF
+C END IF
+C
+C 160 CONTINUE
+C 150 CONTINUE
+C
+ END IF
+C
+C
+C RETURN
+C
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C ------------------------------------------------------------------
+ 9903 FORMAT(1H ,A,' MISSING',2X,A)
+ 9904 FORMAT(1H ,A,F20.4,2X,A,2X,A)
+ 9905 FORMAT(1H ,100X,A)
+ 9906 FORMAT(1H ,I5,1X,A,E14.4,2X,A)
+ 9916 FORMAT(1H ,I5,1X,A15,1X,F20.4,1X,A20,1X,A15,1X,F3.0,1X,A15)
+ 9917 FORMAT(1H ,I5,1X,A15,1X,F20.4,1X,A24)
+ 9918 FORMAT(1H ,I5,1X,A15,1X,' MISSING',1X,A24)
+ 9919 FORMAT(1H ,I5,1X,A15,1X,F20.4,1X,A24,1X,A)
+ 9920 FORMAT(1H ,62X,A)
+ END
diff --git a/crexdc/crexrep.F b/crexdc/crexrep.F
new file mode 100755
index 0000000..dc3879a
--- /dev/null
+++ b/crexdc/crexrep.F
@@ -0,0 +1,339 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXREP(KPT,KDLEN,KDATA,KJ,KJ1,KDD,KSTACK,KERR)
+C
+C**** *CREXREP*
+C
+C
+C PURPOSE.
+C --------
+C RESOLVE DATA DESCRIPTOR REPLICATION PROBLEM.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXREP(KPT,KDLEN,KDATA,KJ,KJ1,KDD,KSTACK,KERR)*
+C
+C INPUT :
+C *KPT* - POINTER TOO KDATA ARRAY
+C *KDLEN* - DIMENSION OF KDATA ARRAY
+C *KDATA* - ARRAY CONTAINING DATA NEEDED FOR DATA DESCRIPTOR
+C EXPANSION
+C *KDD* - DATA DESCRIPTOR
+C OUTPUT:
+C *KJ* - POINTER TO KSTACK ARRAY
+C *KJ1* - POINTER TO LAST ELEMENT IN KSTACK
+C *KSTACK* - LIST OF DATA DESCRIPTORS
+C *KERR* - RETURN CODE
+C
+C METHOD.
+C -------
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C BUETDR - RESOLVE TABLE D REFERENCE
+C BUEPWT - UPDATE WORKING TABLES
+C GBYTE - UNPACK BIT PATHERN
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 01/02/91.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4=2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+C
+ COMMON /CRWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+C
+ COMMON /CRWT/ NCREXDWINC,NCREXSCAM,NCREXAFDW,NCREXWT ,ODREPF,
+ 2 NCREXSTACK(JELEM),NCREXWTEN(JELEM),
+ 3 NCREXWTR (JELEM),NCREXWTS (JELEM),
+ 4 NCREXWTDW(JELEM)
+C
+C NCREXDWINC - data width increment
+C NCREXSCAM - scale multiplier
+C NCREXAFDW - augmented field data width
+C NCREXWT - pointer to working table
+C NCREXSTACK - list of data descriptors
+C ODREPF - replication (logical)
+C NCREXWTR - working table reference
+C NCREXWTS - working scale
+C NCREXWTDW - working data width
+C
+C
+ COMMON /CRWTC/ CREXWTEN(JELEM),CREXWTU(JELEM)
+C
+C CREXWTEN - working table element naame
+C CREXWTU - working table units
+C
+C
+ COMMON /CRBEF / M,MM,N,JCV
+C
+C M - Number of elements
+C MM - Number of elements
+C N - Number of data sub_sets
+C JCV - Number of character values
+C
+C
+C
+C
+ CHARACTER CREXWTEN*64,CREXWTU*24
+C
+ DIMENSION ILIST(JELEM)
+ DIMENSION KSTACK(*)
+ DIMENSION KDATA(KDLEN)
+ REAL*8 RVIND
+ REAL*8 EPS
+C
+C ------------------------------------------------------------------
+C
+C* 1. STORE K, NUMBER OF DESCRIPTORS TO BE REPLICATED.
+C ------------------------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ IF = KDD / 100000
+ IDIF= KDD - IF * 100000
+ IX = IDIF / 1000
+ IY = IDIF - IX * 1000
+ K = IX
+ IF(IY.EQ.0) ODREPF=.TRUE.
+C
+C* 1.1 DELAYED REPLICATION ?
+C ---------------------
+ 110 CONTINUE
+C
+ IF( IY .NE. 0 ) THEN
+C
+C* 1.2 STORE NUMBER OF DESCRIPTORS, K, AND REPLICATION
+C -----------------------------------------------
+C FACTOR JR.
+C ----------
+ 120 CONTINUE
+C
+ JR = IY
+ GO TO 500
+
+ ELSE
+ KDD=31002
+ go to 300
+ END IF
+C
+C ------------------------------------------------------------------
+C
+C* 2. GET NEXT DESCRIPTOR.
+C --------------------
+ 200 CONTINUE
+C
+ KJ =KJ + 1
+ KDD= KSTACK(KJ)
+C
+C ------------------------------------------------------------------
+C
+C* 2.1 REPLICATION FACTOR ?
+C --------------------
+ 210 CONTINUE
+C
+ IF(KDD.NE.31001.AND.KDD.NE.31002.AND.
+ 1 KDD.NE.31000.AND.
+ 1 KDD.NE.31011.AND.KDD.NE.31012 )THEN
+C
+C* 2.1.1 SEQUENCE DESCRIPTOR ?
+C ---------------------
+C
+ IF=KDD/100000
+C
+ IF( IF.EQ.3) THEN
+C
+C* 2.1.1.1 SOLVE TABLE D REFERENCE.
+C ------------------------
+ CALL CREXETDR(KJ,KJ1,KDD,KSTACK,KERR)
+ IF(KERR.GT.0) THEN
+ DO 252 IQ=1,JELEM
+ NCREXSTACK(IQ)=0.
+ 252 CONTINUE
+ RETURN
+ END IF
+ GO TO 200
+ END IF
+C
+ IF( IF.EQ.2) THEN
+ CALL CREXOPER(KPT,KDLEN,KDATA,KJ,KDD,KSTACK,KERR)
+ IF(KERR.GT.0) THEN
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+ GO TO 200
+ END IF
+C
+ KERR=36
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+C ------------------------------------------------------------------
+C
+C* 3. UPDATE WORKING TABLE.
+C ---------------------
+ 300 CONTINUE
+C
+ CALL CREXEPWT (KDD,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C ------------------------------------------------------------------
+C
+C* 4. STORE JR, THE REPLICATION FACTOR FROM DATA.
+C ------------------------------------------------------
+ 400 CONTINUE
+C
+ KPT=KPT+1
+ IF(KPT.GT.KDLEN) THEN
+ KERR=31
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+ JR=KDATA(KPT)
+C
+ IF(JR.EQ.0) THEN
+ IIIF=KSTACK(KJ+1)/100000
+ IIII=KSTACK(KJ+1)-IIIF*100000
+ IIIX=IIII/1000
+ IIIY=IIII-IIIX*1000
+C
+ IF(IIIF.EQ.2.AND.IIIY.EQ.0) THEN
+ KJ=KJ+1
+ CALL CREXOPER(KPT,KDLEN,KDATA,KJ,KSTACK(KJ),KSTACK,KERR)
+ IF(KERR.GT.0) THEN
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+ END IF
+
+ KJ=KJ+K
+ GO TO 640
+ END IF
+
+ JRTK=JR*K+KJ1-K
+ IF(JRTK.GT.JELEM) THEN
+ KERR=30
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+C CHECK IF NEXT DESCRIPTOR CANCEL OPERATOR FOR DELAYED
+C REPLICATION
+C
+ IIIF=KSTACK(KJ+1)/100000
+ IIII=KSTACK(KJ+1)-IIIF*100000
+ IIIX=IIII/1000
+ IIIY=IIII-IIIX*1000
+C
+ IF(IIIF.EQ.2.AND.IIIY.EQ.0) THEN
+ KJ=KJ+1
+ CALL CREXOPER(KPT,KDLEN,KDATA,KJ,KSTACK(KJ),KSTACK,KERR)
+ IF(KERR.GT.0) THEN
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+ END IF
+C ------------------------------------------------------------------
+C* 5. GET NEXT K DESCRIPTORS.
+C -----------------------
+ 500 CONTINUE
+C
+ DO 501 J=1,K
+C
+ ILIST(J)=KSTACK(KJ+J)
+C
+ 501 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 6. ADD JR TIMES K DESCRIPTORS IN PLACE OF K
+C ----------------------------------------
+C DESCRIPTORS OBTAINED.
+C ---------------------
+ 600 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 6.1 PUSH DOWN DESCRIPTORS IN KSTACK FOR (JR-1)*K PLACES
+C ---------------------------------------------------
+C STARTING AT KJ1 AND ENDING AT KJ+K.
+C -----------------------------------
+ 610 CONTINUE
+C
+ JRKM1=(JR-1)*K
+C
+ DO 611 J=KJ1,KJ+K,-1
+C
+ KSTACK(J+JRKM1)=KSTACK(J)
+C
+ 611 CONTINUE
+C
+C* 6.2 INSERT LIST IN THE STACK.
+C -------------------------
+ 620 CONTINUE
+C
+ DO 622 J=1,JR
+C
+ KJJM1K=KJ+(J-1)*K
+C
+ DO 623 J1=1,K
+C
+ KSTACK(KJJM1K+J1)=ILIST(J1)
+C
+ 623 CONTINUE
+ 622 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 6.3 ADJUST DESCRIPTOR COUNT FOR LIST LENGTH.
+C ----------------------------------------
+ 630 CONTINUE
+C
+ KJ1 = KJ1 + (JR-1)*K
+C
+C ------------------------------------------------------------------
+C* 6.4 ADJUST NUMBER OF DATA DESCRIPTORS NOT PRESENT.
+C ----------------------------------------------
+ 640 CONTINUE
+C
+ IF(N221.NE.0) N221= KJ1 - KJ + 1
+C
+C ------------------------------------------------------------------
+ 700 CONTINUE
+C
+ RETURN
+ END
diff --git a/crexdc/crexs0.F b/crexdc/crexs0.F
new file mode 100755
index 0000000..17ba83c
--- /dev/null
+++ b/crexdc/crexs0.F
@@ -0,0 +1,145 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXS0( KBUFL,YBUFF,KSUP,KSEC0,KERR)
+C
+C**** *BUEXS0*
+C
+C
+C PURPOSE.
+C --------
+C Expands section 0 of Crex message.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXS0( KBUFL,YBUFF,KSUP,KSEC0,KERR)*
+C
+C INPUT :
+C *KBUFL* - length of CREX message (words)
+C *YBUFF* - Character string containing Crex message
+C OUTPUT:
+C *KSUP* - Integer array of 9 words containing
+C suplementary information
+C - KSUP( 1) -- IDIM1, dimension of KSEC1
+C - KSUP( 2) -- Reserved
+C - KSUP( 3) -- IDIM3, dimension of KSEC3
+C - KSUP( 4) -- Reserved
+C - KSUP( 5) -- M (number of elements in values
+C array, first index)
+C - KSUP( 6) -- N (number of subsets,second index
+C of values array)
+C - KSUP( 7) -- JVC (number of elements in CVAL array)
+C - KSUP( 8) -- total CREX message length in bytes
+C - KSUP( 9) -- IDIM0, dimension of KSEC0
+C
+C *KSEC0* - array containing section 0 information
+C KSEC0( 1)-- length of section 0 (bytes)
+C KSEC0( 2)-- total length of CREX message (bytes)
+C KSEC0( 3)-- Not used
+C
+C *KERR* - returned error code
+C
+C METHOD.
+C --------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ COMMON /CREXWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+C
+ DIMENSION KSEC0(*)
+ DIMENSION KSUP(*)
+ CHARACTER*(*) YBUFF
+C
+ CHARACTER*4 YCREX
+ REAL*8 RVIND,EPS
+C
+C ------------------------------------------------------------------
+C* 1. EXPAND SECTION 0.
+C -----------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ KSEC0(1)=4
+ KSEC0(2)=KBUFL
+ KSUP(8) =KBUFL
+C
+C* 1.1 INITIALIZE WORKING POINTERS NWPT AND NBPT.
+C ------------------------------------------
+ NBPT = 1
+C
+C* 1.2 UNPACK FIRST FOUR OCTETS CONTAINING *CREX*.
+C -------------------------------------------
+C
+ IF(YBUFF(NBPT:NBPT+3).ne.'CREX') then
+ KERR=1
+ print*,'This bulletin is not CREX message.'
+ RETURN
+ END IF
+C
+C 1.2 Position pointer to begining of section1.
+C ---------------------------------------------
+ 120 CONTINUE
+C
+ NBPT=NBPT+4
+ IF(NBPT.GT.KBUFL) THEN
+ KERR=26
+ print*,'CREXS0:'
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+ IRET=0
+ CALL NEXTSEC(KBUFL,YBUFF,NBPT,NGS,KERR)
+ IF(KERR.NE.0) THEN
+ KERR=40
+ print*,'NEXTSEC :'
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+ CALL NEXTGRP(KBUFL,YBUFF,NBPT,NGS,KERR)
+ IF(KERR.NE.0) THEN
+ KERR=41
+ print*,'NEXTGRP : '
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+ RETURN
+C -----------------------------------------------------------------
+C
+ END
diff --git a/crexdc/crexs1.F b/crexdc/crexs1.F
new file mode 100755
index 0000000..197b5bc
--- /dev/null
+++ b/crexdc/crexs1.F
@@ -0,0 +1,445 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXS1( KBUFL,YBUFF,KSUP,KSEC0,KSEC1,KERR)
+C
+C**** *CREXS1*
+C
+C
+C PURPOSE.
+C --------
+C Expands section 1 of CREX message. Saves expanded information
+C in the array KSEC1.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *BUEXS1( KBUFL,YBUFF,KSUP,KSEC0,KSEC1,KERR)*
+C
+C INPUT :
+C *KBUFL* - length of CREX message (words)
+C *YBUFF* - array containing CREX message
+C OUTPUT:
+C *KSUP* - Integer array of 9 words containing
+C suplementary information
+C - KSUP( 1) -- IDIM1, dimension of KSEC1
+C - KSUP( 2) -- Reserved
+C - KSUP( 3) -- IDIM3, dimension of KSEC3
+C - KSUP( 4) -- Reserved
+C - KSUP( 5) -- M (number of elements in values
+C array, first index)
+C - KSUP( 6) -- N (number of subsets,second index
+C of values array)
+C - KSUP( 7) -- JVC (number of elements in CVAL array)
+C - KSUP( 8) -- total CREX message length in bytes
+C - KSUP( 9) -- IDIM0, dimension of KSEC0
+C
+C *KSEC0* - array containing section 0 information
+C KSEC0( 1)-- length of section 0 (bytes)
+C KSEC0( 2)-- total length of CREX message (bytes)
+C KSEC0( 3)-- CREX Edition number
+C
+C *KSEC1* - Integer array of at least 40 words
+C containing CREX section 1 information
+C KSEC1( 1)-- Reserved
+C KSEC1( 2)-- CREX Edition number
+C KSEC1( 3)-- Reserved
+C KSEC1( 4)-- Reserved
+C KSEC1( 5)-- Reserved
+C KSEC1( 6)-- CREX message type
+C KSEC1( 7)-- Reserved
+C KSEC1( 8)-- version number of local table used
+C KSEC1( 9)-- Reserved
+C KSEC1(10)-- Reserved
+C KSEC1(11)-- Reserved
+C KSEC1(12)-- Reserved
+C KSEC1(13)-- Reserved
+C KSEC1(14)-- CREX Master table
+C KSEC1(15)-- version number of Master table used
+C KSEC1(16) - KSEC1(40) -- Reserved
+C
+C
+C Crex Edition 2
+C
+C *KSEC1* - Integer array of at least 40 words
+C containing CREX section 1 information
+C KSEC1( 1)-- Reserved
+C KSEC1( 2)-- CREX Edition number
+C KSEC1( 3)-- Originating Centre ( oooo)
+C KSEC1( 4)-- Update sequence number (uu)
+C KSEC1( 5)-- Number of subsets (sss)
+C KSEC1( 6)-- CREX data category (nnn)
+C KSEC1( 7)-- International data sub-category (mmm)
+C KSEC1( 8)-- version number of local table used
+C KSEC1( 9)-- Year (yyyy)
+C KSEC1(10)-- Month (mm)
+C KSEC1(11)-- Day (dd)
+C KSEC1(12)-- Hour (hh)
+C KSEC1(13)-- Minute (mm)
+C KSEC1(14)-- CREX Master table (tt)
+C KSEC1(15)-- version number of Master table used (vv)
+C KSEC1(16)-- Originating sub-centre (ppp)
+C KSEC1(17)-- Bufr master table version number
+C KSEC1(18)-- Bufr version number of local table used
+C KSEC1(19) - KSEC1(40) -- Reserved
+C
+C *KERR* - Return error code
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+C
+ DIMENSION KSUP(JSUP),KSEC0(JSEC0),KSEC1(JSEC1)
+ DIMENSION ISEC1(JSEC1)
+C
+ COMMON /CREXWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+C
+ COMMON/CREXTAB/ NCREXBR(JTAB),NCREXBS(JTAB) , NCREXBDW(JTAB),
+ 1 NCREXDR(JTAB),NCREXDST(JTAB) ,
+ 2 NCREXDL(JTAB),NCREXDSQ(JTAB*20),NCREXP(64,255)
+
+C
+C NCREXBR - table B, table reference array
+C NCREXBS - table B, scale array
+C NCREXBDW - table B, data width array
+C NCREXDR - table D, table reference array
+C NCREXDST - table D, starting pointers array
+C NCREXDL - table D, lengths array
+C NCREXDSQ - table D, list of sequence descriptors array
+C
+ COMMON/CREXTABC/ CREXNAME(JTAB),CREXUNIT(JTAB),CREXLST(JELEM)
+C
+C CREXNAME - table B, ELEMENT NAME array
+C CREXUNIT - table B, unit array
+c
+C
+ COMMON /CREXEL/ NCREXTDLEN,NCREXTDLST(JELEM),NCREXTDEXL,
+ 1 NCREXTDEXP(JELEM)
+c
+ CHARACTER*6 CREXLST
+ CHARACTER*64 CREXNAME
+ CHARACTER*24 CREXUNIT
+ REAL*8 RVIND,EPS
+c
+ CHARACTER*(*) YBUFF
+C
+C ------------------------------------------------------------------
+C* 1. EXPAND SECTION 1.
+C ------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ IF(YBUFF(NBPT:NBPT).NE.'T') THEN
+ KERR=42
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+ NBPT=NBPT+1
+ ITEMP=NBPT
+ CALL NEXTSEC(KBUFL,YBUFF, ITEMP,NGS,KERR )
+ IF(KERR.NE.0) THEN
+ KERR=40
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+ IF(ITEMP.GT.NGS) THEN
+ KERR=43
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+C
+C Get Master table used tt
+C
+ CALL EXTGRP(KBUFL,YBUFF, NBPT,2,KSEC1(14),KERR )
+ IF(KERR.NE.0) THEN
+ KERR=44
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+C Get CREX Edition number ee
+C
+ CALL EXTGRP(KBUFL,YBUFF, NBPT,2,KSEC1(2),KERR)
+ IF(KERR.NE.0) THEN
+ KERR=45
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+ KSEC0(3)=KSEC1(2)
+C
+C Get Version number of master table used vv
+C
+ CALL EXTGRP(KBUFL,YBUFF, NBPT,2,KSEC1(15),KERR)
+ IF(KERR.NE.0) THEN
+ KERR=46
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+ IF(KSEC1(2).EQ.2 ) THEN
+C
+C Bufr master table version number bb
+C
+ CALL EXTGRP(KBUFL,YBUFF, NBPT,2,KSEC1(17),KERR)
+ IF(KERR.NE.0) THEN
+ KERR=46
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+C Bufr version number of local table ww
+C
+ CALL EXTGRP(KBUFL,YBUFF, NBPT,2,KSEC1(18),KERR)
+ IF(KERR.NE.0) THEN
+ KERR=46
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+
+ END IF
+
+ CALL NEXTSEP(KBUFL,YBUFF,NBPT,ITEMP,KERR)
+ CALL NEXTPRT(KBUFL,YBUFF,NBPT,ITEMP,KERR )
+ IF(KERR.NE.0) THEN
+ print*,'nextprt: error ',ierr
+ RETURN
+ END IF
+C
+ IF(YBUFF(NBPT:NBPT).NE.'A') THEN
+ print*,'CREX table A not found.'
+ RETURN
+ END IF
+C
+ NBPT=NBPT+1
+C
+C Get CREX table A nnn
+C
+ CALL EXTGRP(KBUFL,YBUFF, NBPT,3,KSEC1(6),KERR)
+ IF(KERR.NE.0) THEN
+ print*,'extgrp : error ',kerr
+ RETURN
+ END IF
+ IF(KSEC1(2).eq.2) THEN
+C
+C Get international sub-category mmm
+C
+ CALL EXTGRP(KBUFL,YBUFF, NBPT,3,KSEC1(7),KERR)
+ IF(KERR.NE.0) THEN
+ print*,'extgrp : error ',kerr
+ RETURN
+ END IF
+
+ CALL NEXTSEP(KBUFL,YBUFF,NBPT,ITEMP,KERR)
+ CALL NEXTPRT(KBUFL,YBUFF,NBPT,ITEMP,KERR )
+ IF(KERR.NE.0) THEN
+ print*,'nextprt: error ',ierr
+ RETURN
+ END IF
+C
+ IF(YBUFF(NBPT:NBPT).NE.'P') THEN
+ print*,'CREX oiginating centre not found.'
+ RETURN
+ END IF
+C
+ NBPT=NBPT+1
+C
+C Get originating centre ooooo
+C
+ CALL EXTGRP(KBUFL,YBUFF, NBPT,5,KSEC1(3),KERR)
+ IF(KERR.NE.0) THEN
+ print*,'extgrp : error ',kerr
+ RETURN
+ END IF
+C
+C Get originating sub-centre ppp
+C
+ CALL EXTGRP(KBUFL,YBUFF, NBPT,3,KSEC1(16),KERR)
+ IF(KERR.NE.0) THEN
+ print*,'extgrp : error ',kerr
+ RETURN
+ END IF
+
+ CALL NEXTSEP(KBUFL,YBUFF,NBPT,ITEMP,KERR)
+ CALL NEXTPRT(KBUFL,YBUFF,NBPT,ITEMP,KERR )
+ IF(KERR.NE.0) THEN
+ print*,'nextprt: error ',ierr
+ RETURN
+ END IF
+C
+ IF(YBUFF(NBPT:NBPT).NE.'U') THEN
+ print*,'CREX update sequence number not found.'
+ RETURN
+ END IF
+C
+ NBPT=NBPT+1
+C
+C Get update sequence number uu
+C
+ CALL EXTGRP(KBUFL,YBUFF, NBPT,2,KSEC1(4),KERR)
+ IF(KERR.NE.0) THEN
+ print*,'extgrp : error ',kerr
+ RETURN
+ END IF
+C
+ CALL NEXTSEP(KBUFL,YBUFF,NBPT,ITEMP,KERR)
+ CALL NEXTPRT(KBUFL,YBUFF,NBPT,ITEMP,KERR )
+ IF(KERR.NE.0) THEN
+ print*,'nextprt: error ',ierr
+ RETURN
+ END IF
+C
+ IF(YBUFF(NBPT:NBPT).NE.'S') THEN
+ print*,'CREX number of subsets not found.'
+ RETURN
+ END IF
+C
+ NBPT=NBPT+1
+C Get number of subsets
+C
+ CALL EXTGRP(KBUFL,YBUFF, NBPT,3,KSEC1(5),KERR)
+ IF(KERR.NE.0) THEN
+ print*,'extgrp : error ',kerr
+ RETURN
+ END IF
+C
+ CALL NEXTSEP(KBUFL,YBUFF,NBPT,ITEMP,KERR)
+ CALL NEXTPRT(KBUFL,YBUFF,NBPT,ITEMP,KERR )
+ IF(KERR.NE.0) THEN
+ print*,'nextprt: error ',ierr
+ RETURN
+ END IF
+
+ IF(YBUFF(NBPT:NBPT).NE.'Y') THEN
+ print*,'CREX date not found.'
+ RETURN
+ END IF
+
+C
+ NBPT=NBPT+1
+C
+C Get CREX date
+C
+ CALL EXTGRP(KBUFL,YBUFF, NBPT,4,KSEC1(9),KERR)
+ IF(KERR.NE.0) THEN
+ print*,'extgrp : error ',kerr
+ RETURN
+ END IF
+ CALL EXTGRP(KBUFL,YBUFF, NBPT,2,KSEC1(10),KERR)
+ IF(KERR.NE.0) THEN
+ print*,'extgrp : error ',kerr
+ RETURN
+ END IF
+C
+ CALL EXTGRP(KBUFL,YBUFF, NBPT,2,KSEC1(11),KERR)
+ IF(KERR.NE.0) THEN
+ print*,'extgrp : error ',kerr
+ RETURN
+ END IF
+
+ CALL NEXTSEP(KBUFL,YBUFF,NBPT,ITEMP,KERR)
+ CALL NEXTPRT(KBUFL,YBUFF,NBPT,ITEMP,KERR )
+ IF(KERR.NE.0) THEN
+ print*,'nextprt: error ',ierr
+ RETURN
+ END IF
+C
+ IF(YBUFF(NBPT:NBPT).NE.'H') THEN
+ print*,'CREX time not found.'
+ RETURN
+ END IF
+C
+ NBPT=NBPT+1
+C
+C Get CREX time
+C
+ CALL EXTGRP(KBUFL,YBUFF, NBPT,2,KSEC1(12),KERR)
+ IF(KERR.NE.0) THEN
+ print*,'extgrp : error ',kerr
+ RETURN
+ END IF
+ CALL EXTGRP(KBUFL,YBUFF, NBPT,2,KSEC1(13),KERR)
+ IF(KERR.NE.0) THEN
+ print*,'extgrp : error ',kerr
+ RETURN
+ END IF
+
+C
+ END IF
+C
+ KTDLEN=0
+C
+ 200 CONTINUE
+C
+ CALL NEXTSEP(KBUFL,YBUFF,NBPT,ITEMP,KERR)
+ CALL NEXTPRT(KBUFL,YBUFF,NBPT,ITEMP,KERR )
+ IF(KERR.NE.0) THEN
+ print*,'nextprt: error ',ierr
+ RETURN
+ END IF
+C
+ IF(NBPT.GE.ITEMP) GO TO 300
+C
+ IF(YBUFF(NBPT:NBPT).EQ.'E') THEN
+ NE=1
+ GO TO 200
+ END IF
+ KTDLEN=KTDLEN+1
+ CALL EXTGRPC(KBUFL,YBUFF, NBPT,6,CREXLST(KTDLEN),KERR)
+ IF(KERR.NE.0) THEN
+ print*,'extgrpc : error ',kerr
+ RETURN
+ END IF
+C
+ GO TO 200
+C
+ 300 CONTINUE
+C
+ NCREXTDLEN=KTDLEN
+C ------------------------------------------------------------------
+C
+ RETURN
+ END
diff --git a/crexdc/crexs2.F b/crexdc/crexs2.F
new file mode 100755
index 0000000..5a2e01a
--- /dev/null
+++ b/crexdc/crexs2.F
@@ -0,0 +1,324 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXS2(KBUFL,YBUFF,KSUP,KSEC3,KELEM,CNAMES,CUNITS,KERR)
+C
+C**** *CREXS2*
+C
+C
+C PURPOSE.
+C --------
+C
+C Expand Crex data descriptors
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXS2( KBUFL,YBUFF,KSUP,KSEC3,KELEM,CNAMES,CUNITS,KERR)*
+C
+C INPUT :
+C *KBUFL* - length of crex message (words)
+C *YBUFF* - array containing CREX message
+C *KELEM* - dimension of CNAMES, CUNITS array
+C OUTPUT:
+C *KSUP* - Integer array of 9 words containing
+C suplementary information
+C - KSUP( 1) -- IDIM1, dimension of KSEC1
+C - KSUP( 2) -- Reserved
+C - KSUP( 3) -- IDIM3, dimension of KSEC3
+C - KSUP( 4) -- Reserved
+C - KSUP( 5) -- M (number of elements in values
+C array, first index)
+C - KSUP( 6) -- N (number of subsets,second index
+C of values array)
+C - KSUP( 7) -- JVC (number of elements in CVAL array)
+C - KSUP( 8) -- total CREX message length in bytes
+C - KSUP( 9) -- IDIM0, dimension of KSEC0
+C
+C *KSEC3* - array containing section 3 information
+C KSEC3( 1)-- length of section 3 (bytes)
+C KSEC3( 2)-- reserved
+C KSEC3( 3)-- number of subsets
+C KSEC3( 4)-- flag (data type,data compression)
+C *CNAMES* - character array containing element names
+C *CUNITS* - character array containig units
+C *KERR* - returned error code
+C
+C METHOD.
+C -------
+C
+C Expands list of data descriptors in section 1
+C of Crex message. Working tables for further data decoding are set,
+C list of Crex data descriptors and a list of expanded Crex data descriptors
+C according to table D reference are returned respectively.
+C
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C------------------------------------------------------------------------------------
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+C
+C
+ COMMON /CREXWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+C
+ COMMON/CREXTAB/ NCREXBR(JTAB),NCREXBS(JTAB) , NCREXBDW(JTAB),
+ 1 NCREXDR(JTAB),NCREXDST(JTAB) ,
+ 2 NCREXDL(JTAB),NCREXDSQ(JTAB*20),NCREXP(64,255)
+
+C
+C NCREXBR - table B, table reference array
+C NCREXBS - table B, scale array
+C NCREXBDW - table B, data width array
+C NCREXDR - table D, table reference array
+C NCREXDST - table D, starting pointers array
+C NCREXDL - table D, lengths array
+C NCREXDSQ - table D, list of sequence descriptors array
+C
+ COMMON/CREXTABC/ CREXNAME(JTAB),CREXUNIT(JTAB),CREXLST(JELEM)
+C
+C CREXNAME - table B, ELEMENT NAME array
+C CREXUNIT - table B, unit array
+c
+C
+ COMMON /CREXBEF / M,MM,N,JCV
+C
+C M - Number of elements
+C MM - Number of elements
+C N - Number of data sub_sets
+C JCV - Number of character values
+C
+C
+ COMMON /CREXWT/ NCREXDWINC,NCREXSCAM,NCREXAFDW,NCREXWT ,ODREPF,
+ 2 NCREXSTACK(JELEM),NCREXWTEN(JELEM),
+ 3 NCREXWTR (JELEM),NCREXWTS (JELEM),NCREXWTRV(JELEM),
+ 4 NCREXWTDW(JELEM),NWTIW(JELEM),NWTIWS(JELEM)
+C
+C NCREXDWINC - data width increment
+C NCREXSCAM - scale multiplier
+C NCREXAFDW - augmented field data width
+C NCREXWT - pointer to working table
+C NCREXSTACK - list of data descriptors
+C ODREPF - replication (logical)
+C NCREXWTR - working table reference
+C NCREXWTS - working scale
+C NCREXWTRV - working reference value
+C NCREXWTDW - working data width
+C NWTIW - working data width of increments
+C NWTIWS - working total data width of element set
+C
+ CHARACTER CREXWTEN*64,CREXWTU*24
+C
+C
+ COMMON /CREXWTC/ CREXWTEN(JELEM),CREXWTU (JELEM)
+C
+C CREXWTEN - working table element naame
+C CREXWTU - working table units
+C
+ COMMON /CREXEL/ NCREXTDLEN,NCREXTDLST(JELEM),NCREXTDEXL,
+ 1 NCREXTDEXP(JELEM)
+C
+C NCREXTDLEN - number of Data descriptors in section 3
+C NCREXTDLST - list of Data descriptors
+C NCREXTDEXL - number of expanded Data Descriptors
+C NCREXTDEXP - list of expanded Data descriptors
+C
+C
+ COMMON /CREXOFF/ NSIZEG(JELEM),NCREXWTRG(JWORK),
+ 1 NBP,NSUBSET,OMULTI
+C
+ CHARACTER*64 CNAMES(KELEM),CREXNAME
+ CHARACTER*24 CUNITS(KELEM),CREXUNIT
+ CHARACTER*(*) YBUFF
+ CHARACTER*6 CREXLST
+C
+ DIMENSION ISTACK(JELEM),IISTACK(JELEM)
+C
+ DIMENSION KSUP(JSUP),KSEC3(JSEC3)
+C
+ REAL*8 RVIND,EPS
+c
+C ------------------------------------------------------------------
+C
+C* 1. EXPAND PRELIMINARY ITEMS OF SECTION 3.
+C --------------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+C -----------------------------------------------------------------
+C
+C* 2. EXPAND DATA DESCRIPTORS.
+C ------------------------
+ 200 CONTINUE
+C
+C
+C* 2.1 CALCULATE EXPECTED NUMBER OF DATA DESCRIPTORS.
+C ----------------------------------------------
+C AND INITIALIZE NUMBER OF DATA VALUES PER SUB-SET.
+C -------------------------------------------------
+ 210 CONTINUE
+C
+ J = 0
+ M = 0
+ NCREXWT=0
+ IF( NSUBSET.EQ.1) THEN
+ NBPTSEC2=NBPT
+ END IF
+C
+C
+C* 2.2 UNPACK AND PUT DATA DESCRIPTORS IN STACK.
+C -----------------------------------------
+ 220 CONTINUE
+C
+ DO 221 JJ=1,NCREXTDLEN
+C
+ if(CREXLST(JJ)(1:1).eq.'D') CREXLST(JJ)(1:1)='3'
+ if(CREXLST(JJ)(1:1).eq.'B') CREXLST(JJ)(1:1)='0'
+ if(CREXLST(JJ)(1:1).eq.'C') CREXLST(JJ)(1:1)='2'
+ if(CREXLST(JJ)(1:1).eq.'R') CREXLST(JJ)(1:1)='1'
+c
+ IOS=0
+ READ( CREXLST(JJ),'(i6.6)',IOSTAT=IOS) ISTACK(JJ)
+ IF(IOS.NE.0) THEN
+ KERR=35
+ CALL CREXERR(KERR)
+ print*,'Internal read error in CREXLST.'
+ print*,'NCREXTDLEN=ktdlen=',NCREXTDLEN
+ print*,jj,' CREXLST(JJ)=',CREXLST(JJ)
+ RETURN
+ END IF
+C
+ IISTACK(JJ)=ISTACK(JJ)
+C
+ 221 CONTINUE
+C
+ JMAX=NCREXTDLEN
+C ------------------------------------------------------------------
+C* 2.3 GET NEXT DESCRIPTOR FROM THE STACK.
+C -----------------------------------
+ 230 CONTINUE
+C
+ J = J + 1
+ IF(J.GT.JMAX) GO TO 300
+C
+ IDD = ISTACK(J)
+ IF(IDD.EQ.0) GO TO 230
+C
+ IF = IDD/100000
+C
+C ------------------------------------------------------------------
+C* 2.4 CHECK IF IT IS REPLICATION DESCRIPTOR.
+C --------------------------------------
+ 240 CONTINUE
+C
+ IF( IF.EQ.0) THEN
+C
+C* 2.6 ELEMENT DESCRIPTOR, SO UPDATE WORKING TABLE.
+C --------------------------------------------
+ 260 CONTINUE
+C
+ CALL CREXUPWT(IDD,KELEM,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ ELSEIF( IF.EQ.1) THEN
+C
+C* 2.4.1 SOLVE REPLICATION PROBLEM.
+C --------------------------
+C
+C
+ CALL CREXSRP(KBUFL,YBUFF,KSEC3,J,JMAX,
+ 1 IDD,ISTACK,KELEM,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ ELSEIF( IF.EQ.2) THEN
+C
+C* 2.5.3 PROCESS OPERATOR.
+C -----------------
+ CALL CREXPRCO(KBUFL,YBUFF,J,IDD,ISTACK,KELEM,KERR)
+ IF(KERR.GT.0) RETURN
+C
+ ELSEIF( IF.EQ.3) THEN
+C
+C* 2.5.2 REPLACE BY LIST OF DESCRIPTORS FROM TABLE *D.
+C ---------------------------------------------
+ CALL CREXSTDR(J,JMAX,IDD,ISTACK,KERR)
+ IF(KERR.GT.0) THEN
+ DO 252 IQ=1,JELEM
+ NCREXSTACK(IQ)=0.
+ 252 CONTINUE
+ RETURN
+ END IF
+ ELSE
+ KERR=37
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+c
+ GO TO 230
+C
+C ------------------------------------------------------------------
+C
+C* 3. COLLECT SUPPLEMENTARY ITEMS.
+C -----------------------------
+ 300 CONTINUE
+C
+ NCREXTDEXL =M
+ DO 301 I=1,NCREXTDEXL
+ NCREXTDEXP(I)=NCREXWTR(I)
+ CNAMES(I)=CREXWTEN(I)
+ CUNITS(I)=CREXWTU(I)
+ 301 CONTINUE
+C
+ DO 302 I=1,NCREXTDLEN
+ NCREXTDLST (I)=IISTACK(I)
+ 302 CONTINUE
+C
+ DO 303 I=1,NCREXTDEXL
+ IJ=I+(NSUBSET-1)*KELEM
+ NCREXWTRG(IJ)=NCREXWTR(I)
+ 303 CONTINUE
+C
+ NSIZEG(NSUBSET) =M
+
+ KSUP(3)= 4
+ KSUP(5)= M
+ KSUP(6)= KSEC3(3)
+C
+ RETURN
+ END
diff --git a/crexdc/crexs2data.F b/crexdc/crexs2data.F
new file mode 100755
index 0000000..bda803b
--- /dev/null
+++ b/crexdc/crexs2data.F
@@ -0,0 +1,442 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXS2DATA(KBUFL ,YBUFF ,KSUP ,KSEC3, KELEM,
+ 1 CNAMES,CUNITS,KVALS,VALUES,CVALS,KERR)
+C
+C**** *CREXS2DATA*
+C
+C
+C PURPOSE.
+C --------
+C Expand section 2 of Crex (data section)
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXS2DATA(KBUFL,YBUFF,KSUP,KSEC3,KELEM,CNAMES,
+C CUNITS,KVALS,VALUES,CVALS,KERR)*
+C
+C INPUT :
+C *KBUFL* - length of CREX message (words)
+C *YBUFF* - Character string containing data
+C *KELEM* - dimension of CNAMES, CUNITS array
+C *KVALS* - dimension of VALUES array
+C OUTPUT:
+C *KSUP* - Integer array of 9 words containing
+C suplementary information
+C - KSUP( 1) -- IDIM1, dimension of KSEC1
+C - KSUP( 2) -- Reserved
+C - KSUP( 3) -- IDIM3, dimension of KSEC3
+C - KSUP( 4) -- Reserved
+C - KSUP( 5) -- M (number of elements in values
+C array, first index)
+C - KSUP( 6) -- N (number of subsets,second index
+C of values array)
+C - KSUP( 7) -- JVC (number of elements in CVAL array)
+C - KSUP( 8) -- total CREX message length in bytes
+C - KSUP( 9) -- IDIM0, dimension of KSEC0
+C
+C *KSEC3* - array containing section 3 information
+C KSEC3( 1)-- length of section 3 (bytes)
+C KSEC3( 2)-- reserved
+C KSEC3( 3)-- number of subsets
+C KSEC3( 4)-- flag (data type,data compression)
+C *CNAMES* - character array containing element names
+C *CUNITS* - character array containig units
+C *VALUES* - real*8 array (expanded data values)
+C *CVALS* - character array containing text
+C *KERR* - returned error code
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 17/01/2003.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C--------------------------------------------------------------------------------------------
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+ COMMON /CREXWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+C
+C
+ COMMON /CREXWT/ NCREXDWINC,NCREXSCAM,NCREXAFDW,NCREXWT ,ODREPF,
+ 2 NCREXSTACK(JELEM),NCREXWTEN(JELEM),
+ 3 NCREXWTR (JELEM),NCREXWTS (JELEM),NCREXWTRV(JELEM),
+ 4 NCREXWTDW(JELEM),NWTIW(JELEM),NWTIWS(JELEM)
+C
+C NCREXDWINC - data width increment
+C NCREXSCAM - scale multiplier
+C NCREXAFDW - augmented field data width
+C NCREXWT - pointer to working table
+C NCREXSTACK - list of data descriptors
+C ODREPF - replication (logical)
+C NCREXWTR - working table reference
+C NCREXWTS - working scale
+C NCREXWTRV - working reference value
+C NCREXWTDW - working data width
+C NWTIW - working data width of increments
+C NWTIWS - working total data width of element set
+C
+ CHARACTER CREXWTEN*64,CREXWTU*24
+C
+C
+ COMMON /CREXWTC/ CREXWTEN(JELEM),CREXWTU (JELEM)
+C
+C CREXWTEN - working table element naame
+C CREXWTU - working table units
+C
+C
+C
+ COMMON /CREXBEF / M,MM,N,JCV
+C
+C M - Number of elements
+C MM - Number of elements
+C N - Number of data sub_sets
+C JCV - Number of character values
+C
+C
+C
+ COMMON /CREXOFF/ NSIZEG(JELEM),NCREXWTRG(JWORK),
+ 1 NBP,NSUBSET,OMULTI
+C
+C
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+ CHARACTER*80 CVALS(KVALS),CH
+C
+ CHARACTER*(*) YBUFF
+C
+ DIMENSION ILIST(JELEM),IVALUES(JELEM)
+C
+C
+ REAL*8 VALUES(KVALS)
+ REAL*8 RVIND
+ REAL*8 EPS
+C
+ DIMENSION KSUP(JSUP),KSEC3(JSEC3)
+C
+C ------------------------------------------------------------------
+C* 1. EXPAND PRELIMINARY ITEMS FROM SECTION4.
+C ---------------------------------------
+ 100 CONTINUE
+C
+C JCV - POINTER TO CVALS ARRAY
+C JWT - POINTER TO WORKING TABLE ARRAY
+C JNS - POINTER TO VALUES ARRAY FOR SUB-SETS.
+C
+ IF(KERR.GT.0) RETURN
+C
+ IF(NSUBSET.EQ.1) THEN
+ JCV = 0
+ END IF
+ OREPF =.FALSE.
+ IEOLD=0
+C
+C ------------------------------------------------------------------
+C
+C* 3. Expand the data
+C ---------------
+ 300 CONTINUE
+C
+ IF(KELEM.LT.M) THEN
+ KERR=25
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+c
+ JNS=NSUBSET
+C
+ KSEC3(4)=0
+ KSUP(5)=NSIZEG(NSUBSET)
+C
+ CALL NEXTPRT(KBUFL,YBUFF,NBPT,NGS,KERR )
+ IF(KERR.NE.0) THEN
+ print*,'nextprt: error ',ierr
+ RETURN
+ END IF
+c
+ ITEMP=NBPT
+ CALL NEXTSEC(KBUFL,YBUFF, ITEMP,NGS,KERR )
+ IF(KERR.NE.0) THEN
+ print*,'nextsec: error ',ierr
+ RETURN
+ END IF
+c
+ 301 CONTINUE
+C
+ KSEC3(3)=JNS
+ KSUP(6)=JNS
+C
+ JNSK=(JNS-1)*KELEM
+ IF(JNSK.GT.KVALS) THEN
+ KERR=14
+ CALL CREXERR(KERR)
+ print*,'Size of values array too small.'
+ print*,'Number of subsets=',jns
+ print*,'Number of elements=',M
+ print*,'Kelem=',KELEM
+
+ RETURN
+ END IF
+C
+ DO IZ=JNSK+1,JNSK+M
+ VALUES(IZ)=RVIND
+ END DO
+C
+ DO 302 JWT=1,M
+C
+ JWTJNS=JWT+JNSK
+C
+
+ IF(NCREXWTDW(JWT).EQ.0) THEN
+ VALUES(JWTJNS)=0.0
+ GO TO 302
+ END IF
+C
+ NBPTKEEP=NBPT
+c CALL NEXTSEP(KBUFL,YBUFF,NBPT,ITEMP,KERR)
+ CALL NEXTPRT(KBUFL,YBUFF,NBPT,ITEMP,KERR )
+ IF(NBPT.GE.ITEMP) GO TO 600
+c
+c
+c Check for next E
+C
+ IF(NE.EQ.1) THEN
+ IE=ICHAR(YBUFF(NBPT:NBPT))-48
+ IF(IE.LT.0.OR.IE.GT.9) THEN
+ print*,'E leading character is not a figure',
+ 1 'for ',JWT,' element.'
+ IEOLD=IEOLD+1
+ IF(IEOLD.EQ.10) IEOLD=0
+ CALL NEXTSEP(KBUFL,YBUFF,NBPT,ITEMP,KERR)
+ VALUES(JWTJNS)=RVIND
+ GO TO 302
+ END IF
+c
+ IF((IE-IEOLD).EQ.1.OR.(IE-IEOLD).EQ.-9) THEN
+ IEOLD=IE
+ ELSE
+c check next group
+ IBPT=NBPT
+ CALL NEXTSEP(KBUFL,YBUFF,IBPT,ITEMP,KERR)
+ CALL NEXTPRT(KBUFL,YBUFF,IBPT,ITEMP,KERR )
+ IENEXT=ICHAR(YBUFF(NBPT:NBPT))-48
+ IF((IENEXT-IEOLD).GE.2.OR.(IENEXT-IEOLD).LT.0) THEN
+ print*,JWT,' Group is missing for ',NCREXWTR(JWT),
+ 1 ' element.'
+ IEOLD=IEOLD+1
+ IF(IEOLD.EQ.10) IEOLD=0
+ NBPT=NBPTKEEP
+ VALUES(JWTJNS)=RVIND
+ GO TO 302
+ END IF
+ END IF
+ NBPT=NBPT+1
+ ELSE
+c check next group
+c nbpt points to first character of next group
+ IBPT=NBPT
+ CALL NEXTSEP(KBUFL,YBUFF,IBPT,ITEMP,KERR)
+ if((IBPT-NBPT).ne.NCREXWTDW(JWT)) THEN
+ if(NCREXWTEN(JWT).eq.658367) THEN
+ izz=NBPT+NCREXWTDW(JWT)
+ if(YBUFF(izz:izz).eq.' ') then
+ IBPT=NBPT+NCREXWTDW(JWT)
+ go to 305
+ end if
+ end if
+ do iz=JWT-1,1,-1
+ if(NCREXWTDW(JWT).eq.NCREXWTDW(iz)) then
+ print*,iz,'Group is possibly missing ',
+ 1 NCREXWTR(iz),
+ 2 'values replaced with missing value'
+ VALUES(iz)=rvind
+ else
+ go to 111
+ end if
+ end do
+c
+
+ 111 CONTINUE
+ IF(NCREXWTEN(JWT).EQ.658367) THEN
+ JCV=JCV+1
+ VALUES(JWTJNS)=JCV*1000+NCREXWTDW(JWT)
+ CVALS(JCV)=' '
+ ELSE
+ VALUES(JWTJNS)=RVIND
+ END IF
+ NBPT=IBPT
+ GO TO 302
+ end if
+ END IF
+C
+ 305 CONTINUE
+C
+ IF(NCREXWTR(JWT).EQ.31011.OR.
+ 1 NCREXWTR(JWT).EQ.31012) OREPF=.TRUE.
+C
+C
+C ------------------------------------------------------------------
+C* 3.1 CHARACTER DATA ?
+C ----------------
+ 310 CONTINUE
+C
+ IF(NCREXWTEN(JWT).EQ.658367) THEN
+C
+C* 3.2 OBTAIN CHARACTER DATA FROM DATA SECTION.
+C ----------------------------------------
+ 320 CONTINUE
+C
+ IY=NCREXWTDW(JWT)
+C
+ CALL EXTGRPC(KBUFL,YBUFF, NBPT,IY,CH,KERR)
+ IF(KERR.NE.0) THEN
+ print*,'extgrpc : problem for ',JWT,' th'
+ print*,' element', NCREXWTR(JWT)
+ print*,'Element is missing'
+ END IF
+C
+C* 3.3 MOVE CHARACTER DATA TO "CVALS".
+C -------------------------------
+ 330 CONTINUE
+C
+ IYLINE=IY/80
+ IYOFF =IY-IYLINE*80
+ JCVINC=IYLINE
+C
+ JCV = JCV + 1
+ JCVW= JCV
+C
+ IF(IYLINE.EQ.0) THEN
+ CVALS(JCVW)(1:iy)=ch(1:iY)
+ ELSE
+ DO 332 J=1,IYLINE
+ DO 333 JJ=1,80
+ CVALS(JCVW)(JJ:JJ)= CH(JJ:JJ)
+ 333 CONTINUE
+C
+ JCVW=JCVW+1
+C
+ 332 CONTINUE
+C
+ DO 334 J=1,IYOFF
+ CVALS(JCVW)(J:J)= CH(J:J)
+ 334 CONTINUE
+C
+ END IF
+C
+C* 3.4 COMPUTE POINTER VALUES TO BE STORED IN "VALUES".
+C ------------------------------------------------
+ 340 CONTINUE
+C
+ VALUES(JWTJNS) = JCV*1000 + IY
+ JCV = JCV + JCVINC
+C
+ GO TO 302
+C
+ END IF
+C
+C* 3.5 OBTAIN VALUE FROM DATA SECTION.
+C -------------------------------
+ 350 CONTINUE
+C
+ CALL EXTGRP(KBUFL,YBUFF, NBPT,NCREXWTDW(JWT),IVAL,KERR)
+ IF(KERR.NE.0) THEN
+ print*,'extgrp : error ',kerr
+ RETURN
+ END IF
+C
+C -----------------------------------------------------------------
+C* 3.6 UPDATE THE ARRAY "VALUES".
+C --------------------------
+ 360 CONTINUE
+C
+C
+C CHECK IF DATA IS MISSING
+C
+ IF(IVAL.EQ.NVIND) THEN
+ VALUES(JWTJNS)=RVIND
+ ELSE
+ IF(CREXWTU(JWT)(1:4).EQ.'FLAG') then
+ CALL OCTAL2DEC(IVAL,IIVAL,KERR)
+ IVAL=IIVAL
+ END IF
+ IF(NCREXWTS(JWT).GT.0) THEN
+ VALUES(JWTJNS)= IVAL/10.**NCREXWTS(JWT)
+ ELSE
+ IIWTS=IABS(NCREXWTS(JWT))
+ VALUES(JWTJNS)= IVAL*10.**IIWTS
+ END IF
+ END IF
+C
+ CALL NEXTSEP(KBUFL,YBUFF,NBPT,ITEMP,KERR)
+c
+ IF(NBPT.GE.ITEMP) THEN
+ OMULTI=.FALSE.
+ GO TO 600
+ END IF
+C
+ 302 CONTINUE
+C
+ ITEMP1=NBPT
+ CALL NEXTSUBSET(KBUFL,YBUFF, ITEMP1,NGS,KERR )
+ IF(ITEMP1.LT.NGS) THEN
+c JNS=JNS+1
+ N=JNS
+ IEOLD=0
+c GO TO 301
+ ELSE
+ OMULTI=.FALSE.
+ END IF
+C
+ KSUP(7)=JCV
+C
+C -----------------------------------------------------------------
+C* 6. SET SUPPLEMENTARY INFORMATION.
+C ------------------------------
+C
+ 600 CONTINUE
+C
+ NBP=NBPT
+ KSUP(4)= 2
+C
+C ------------------------------------------------------------------
+ RETURN
+ END
diff --git a/crexdc/crexs5.F b/crexdc/crexs5.F
new file mode 100755
index 0000000..43056e8
--- /dev/null
+++ b/crexdc/crexs5.F
@@ -0,0 +1,65 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXS5(KBUFL,YBUFF,KERR)
+C
+C**** *CREXS5*
+C
+C
+C PURPOSE.
+C --------
+C Expand CREX section 5
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXS5(KBUFL,YBUFF,KERR)*
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 15/02/92.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+ CHARACTER*(*) YBUFF
+C
+ RETURN
+ END
diff --git a/crexdc/crexsel.F b/crexdc/crexsel.F
new file mode 100755
index 0000000..db418bc
--- /dev/null
+++ b/crexdc/crexsel.F
@@ -0,0 +1,108 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXSEL(KTDLEN,KTDLST,KTDEXL,KTDEXP,KERR)
+C
+C**** *CREXSEL*
+C
+C
+C
+C PURPOSE.
+C --------
+C Returns list of Data Descriptors as in Section 1 of Crex
+C message and total/requested list of elements.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXSEL(KTDLEN,KTDLST,KTDEXL,KTDEXP,KERR)*
+C
+C
+C OUTPUT:
+C *KTDLEN* - number of data descriptors in section 1
+C *KTDLST* - array containing data descriptors in section 1
+C *KTDEXL* - number of entries in list of expanded data
+C descriptors
+C *KTDEXP* - array containig expanded data descriptors
+C *KERR* - returned error code
+C
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+C
+ COMMON /CREXEL/ NCREXTDLEN,NCREXTDLST(JELEM),NCREXTDEXL,
+ 1 NCREXTDEXP(JELEM)
+C
+C NCREXTDLEN - number of Data descriptors in section 1
+C NCREXTDLST - list of Data descriptors
+C NCREXTDEXL - number of expanded Data Descriptors
+C NCREXTDEXP - list of expanded Data descriptors
+C
+C
+ DIMENSION KTDLST(*),KTDEXP(*)
+C
+C
+C -----------------------------------------------------------------
+
+C* 1. PUT LIST OF ELEMENTS FROM COMMON BLOCK
+C --------------------------------------
+C TO REQUESTED ARRAYS.
+C --------------------
+ 100 CONTINUE
+C
+ KERR=0
+C
+ KTDLEN=NCREXTDLEN
+ KTDEXL=NCREXTDEXL
+C
+ DO 101 I=1,NCREXTDLEN
+ KTDLST(I)=NCREXTDLST(I)
+ 101 CONTINUE
+C
+ DO 102 I=1,NCREXTDEXL
+ KTDEXP(I)=NCREXTDEXP(I)
+ 102 CONTINUE
+C
+ RETURN
+ END
diff --git a/crexdc/crexsel2.F b/crexdc/crexsel2.F
new file mode 100755
index 0000000..14dc095
--- /dev/null
+++ b/crexdc/crexsel2.F
@@ -0,0 +1,124 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXSEL2(KSUBSET,KELEM,KTDLEN,KTDLST,KTDEXL,KTDEXP,
+ 1 CNAMES,CUNITS,KERR)
+C
+C**** *CREXSEL2*
+C
+C
+C
+C PURPOSE.
+C --------
+C Returns list of Data Descriptors as in Section 1 of Crex
+C message and total/requested list of elements.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXSEL(KSUBSET,KELEM,KTDLEN,KTDLST,KTDEXL,KTDEXP,
+C CNAMES,CUNITS,KERR)*
+C
+C
+C INPUT: *KSUBSET* - Subset number
+C *KELEM* -
+C OUTPUT:
+C *KTDLEN* - number of data descriptors in section 1
+C *KTDLST* - array containing data descriptors in section 1
+C *KTDEXL* - number of entries in list of expanded data
+C descriptors
+C *KTDEXP* - array containig expanded data descriptors
+C *CNAMES* - ARRAY CONTAINING ELEMENT NAMES
+C *CUNITS* - ARRAY CONTAINING ELEMENT UNITS
+C *KERR* - returned error code
+C
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+C
+ COMMON /CREXEL/ NCREXTDLEN,NCREXTDLST(JELEM),NCREXTDEXL,
+ 1 NCREXTDEXP(JELEM)
+C
+C NCREXTDLEN - number of Data descriptors in section 1
+C NCREXTDLST - list of Data descriptors
+C NCREXTDEXL - number of expanded Data Descriptors
+C NCREXTDEXP - list of expanded Data descriptors
+C
+C
+ COMMON /CREXOFF/ NSIZEG(JELEM),NCREXWTRG(JWORK),
+ 1 NBP,NSUBSET,OMULTI
+C
+ DIMENSION KTDLST(*),KTDEXP(*)
+C
+ CHARACTER*64 CNAMES(*)
+ CHARACTER*24 CUNITS(*)
+C
+C -----------------------------------------------------------------
+
+C* 1. PUT LIST OF ELEMENTS FROM COMMON BLOCK
+C --------------------------------------
+C TO REQUESTED ARRAYS.
+C --------------------
+ 100 CONTINUE
+C
+ KERR=0
+C
+ KTDLEN=NCREXTDLEN
+C
+ DO 101 I=1,NCREXTDLEN
+ KTDLST(I)=NCREXTDLST(I)
+ 101 CONTINUE
+C
+ NTDEXL=NSIZEG(KSUBSET)
+ KTDEXL=NTDEXL
+ IJ=(KSUBSET-1)*KELEM
+
+ DO 102 I=1,KTDEXL
+ IIJ=I+IJ
+ KTDEXP(I)=NCREXWTRG(IIJ)
+ CALL CREX_GET_NAME_UNIT(KTDEXP(I),CNAMES(I),CUNITS(I))
+ 102 CONTINUE
+C
+ RETURN
+ END
diff --git a/crexdc/crexsrp.F b/crexdc/crexsrp.F
new file mode 100755
index 0000000..a1be8ea
--- /dev/null
+++ b/crexdc/crexsrp.F
@@ -0,0 +1,381 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXSRP(KBUFL,YBUFF,KSEC3,KJ,KJ1,KDD,KSTACK,KELEM,KERR)
+C
+C**** *CREXSRP*
+C
+C
+C PURPOSE.
+C --------
+C Resolve data descriptor replication problem.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXSRP(KBUFL,YBUFF,KSEC3,KJ,KJ1,KDD,KSTACK,KELEM,KERR)*
+C
+C INPUT :
+C *KBUFL* - length of CREX message (words)
+C *YBUFF* - array containing CREX message
+C *KSEC3* - array containig section 3 information
+C *KELEM* - dimension of CNAMES, CUNITS array
+C *KDD* - data descriptor
+C OUTPUT:
+C *KJ* - pointer to kstack array
+C *KJ1* - pointer to last element in kstack
+C *KSTACK* - list of data descriptors
+C *KERR* - return code
+C
+C METHOD.
+C -------
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 01/02/2003.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ CHARACTER CREXWTEN*64,CREXWTU*24
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+C
+ COMMON /CREXWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+C
+ COMMON /CREXWT/ NCREXDWINC,NCREXSCAM,NCREXAFDW,NCREXWT ,ODREPF,
+ 2 NCREXSTACK(JELEM),NCREXWTEN(JELEM),
+ 3 NCREXWTR (JELEM),NCREXWTS (JELEM),NCREXWTRV(JELEM),
+ 4 NCREXWTDW(JELEM),NWTIW(JELEM),NWTIWS(JELEM)
+C
+C NCREXDWINC - data width increment
+C NCREXSCAM - scale multiplier
+C NCREXAFDW - augmented field data width
+C NCREXWT - pointer to working table
+C NCREXSTACK - list of data descriptors
+C ODREPF - replication (logical)
+C NCREXWTR - working table reference
+C NCREXWTS - working scale
+C NCREXWTRV - working reference value
+C NCREXWTDW - working data width
+C NWTIW - working data width of increments
+C NWTIWS - working total data width of element set
+C
+C
+ COMMON /CREXWTC/ CREXWTEN(JELEM),CREXWTU (JELEM)
+C
+C CREXWTEN - working table element naame
+C CREXWTU - working table units
+C
+C
+ COMMON /CREXBEF / M,MM,N,JCV
+C
+C M - Number of elements
+C MM - Number of elements
+C N - Number of data sub_sets
+C JCV - Number of character values
+C
+C
+ COMMON /CREXOFF/ NSIZEG(JELEM),NCREXWTRG(JWORK),
+ 1 NBP,NSUBSET,OMULTI
+
+C
+ DIMENSION ILIST(JELEM)
+ DIMENSION KSTACK(*),KSEC3(JSEC3)
+C
+ CHARACTER*(*) YBUFF
+ REAL*8 RVIND,EPS
+C
+C
+C ------------------------------------------------------------------
+C
+C* 1. STORE K, NUMBER OF DESCRIPTORS TO BE REPLICATED.
+C ------------------------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ IF = KDD / 100000
+ IDIF= KDD - IF * 100000
+ IX = IDIF / 1000
+ IY = IDIF - IX * 1000
+ K = IX
+C
+C
+C* 1.1 DELAYED REPLICATION ?
+C ---------------------
+ 110 CONTINUE
+C
+ IF( IY .NE. 0 ) THEN
+C
+C* 1.2 STORE NUMBER OF DESCRIPTORS, K, AND REPLICATION
+C -----------------------------------------------
+C FACTOR JR.
+C ----------
+ 120 CONTINUE
+C
+ K = IX
+ JR = IY
+ GO TO 500
+ ELSE
+C
+C 1.3 INSERT DELAYED REPLICATION
+C
+ ODREPF=.TRUE.
+ KDD=31002
+ GO TO 300
+ END IF
+C
+C ------------------------------------------------------------------
+C
+C* 2. GET NEXT DESCRIPTOR.
+C --------------------
+ 200 CONTINUE
+C
+ KJ =KJ + 1
+ KDD= KSTACK(KJ)
+C
+C ------------------------------------------------------------------
+C
+C* 2.1 REPLICATION FACTOR ?
+C --------------------
+ 210 CONTINUE
+C
+ IF(KDD.NE.31001.AND.KDD.NE.31002.AND.
+ 1 KDD.NE.31000.AND.
+ 1 KDD.NE.31011.AND.KDD.NE.31012 )THEN
+C
+C* 2.1.1 SEQUENCE DESCRIPTOR ?
+C ---------------------
+C
+ IF=KDD/100000
+C
+ IF( IF.EQ.3) THEN
+C
+C* 2.1.1.1 SOLVE TABLE D REFERENCE.
+C ------------------------
+ CALL CREXSTDR(KJ,KJ1,KDD,KSTACK,KERR)
+ IF(KERR.GT.0) THEN
+ DO 252 IQ=1,JELEM
+ NCREXSTACK(IQ)=0.
+ 252 CONTINUE
+ RETURN
+ END IF
+ GO TO 200
+ END IF
+C
+ IF( IF.EQ.2) THEN
+ CALL CREXPRCO(KBUFL,YBUFF,KJ,KDD,KSTACK,KELEM,KERR)
+ IF(KERR.GT.0) THEN
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+ GO TO 200
+ END IF
+C
+ KERR=36
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+C ------------------------------------------------------------------
+C
+C* 3. UPDATE WORKING TABLE.
+C ---------------------
+ 300 CONTINUE
+C
+ CALL CREXUPWT(KDD,KELEM,KERR)
+ IF(KERR.GT.0) RETURN
+C
+C CHECK IF NEXT DESCRIPTOR CANCEL OPERATOR FOR DELAYED
+C REPLICATION
+C
+ IIIF=KSTACK(KJ+1)/100000
+ IIII=KSTACK(KJ+1)-IIIF*100000
+ IIIX=IIII/1000
+ IIIY=IIII-IIIX*1000
+C
+ IF(IIIF.EQ.2.AND.IIIY.EQ.0) THEN
+ KJ=KJ+1
+ KDD=KSTACK(KJ)
+ CALL CREXPRCO(KBUFL,YBUFF,KJ,KDD,KSTACK,KELEM,KERR)
+ IF(KERR.GT.0) THEN
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+ END IF
+C
+C ------------------------------------------------------------------
+C
+C* 4. LOCATE AND STORE JR, THE REPLICATION FACTOR FROM DATA.
+C ------------------------------------------------------
+ 400 CONTINUE
+C
+C
+C UNCOMPRESSED DATA
+C
+ IF(NSUBSET.EQ.1) THEN
+ IBPT=NBPTSEC2
+ ELSE
+ IBPT=NBP
+ END IF
+ CALL NEXTPRT(KBUFL,YBUFF,IBPT,NGS,KERR )
+ IF(KERR.NE.0) THEN
+ print*,'nextprt: error ',ierr
+ RETURN
+ END IF
+C
+c Now IBPT points to the first group
+c
+ ITEMP=IBPT
+ CALL NEXTSEC(KBUFL,YBUFF, ITEMP,NGS,KERR )
+ IF(KERR.NE.0) THEN
+ print*,'nextsec: error ',ierr
+ RETURN
+ END IF
+C
+c Now itemp points to the end of previous section
+c
+ CALL NEXTPRT(KBUFL,YBUFF,IBPT,ITEMP,KERR )
+ IF(KERR.NE.0) THEN
+ print*,'nextprt: error ',ierr
+ RETURN
+ END IF
+c
+ DO 401 J=1,NCREXWT-1
+C
+ IBPT=IBPT+NCREXWTDW(j)+NE
+c CALL NEXTPRT(KBUFL,YBUFF,IBPT,ITEMP,KERR )
+c IF(KERR.NE.0) THEN
+c print*,'nextprt: error ',ierr
+c RETURN
+c END IF
+c
+ CALL NEXTSEP(KBUFL,YBUFF,IBPT,ITEMP,KERR )
+ CALL NEXTGRP(KBUFL,YBUFF,IBPT,ITEMP,KERR)
+ IF(KERR.NE.0) THEN
+ print*,'nextsec: error ',ierr
+ RETURN
+ END IF
+C
+ 401 CONTINUE
+C
+ IF(NE.EQ.1) IBPT=IBPT+1
+ CALL EXTGRP(KBUFL,YBUFF, IBPT,NCREXWTDW(NCREXWT),JR,KERR)
+ IF(KERR.NE.0) THEN
+ print*,'extgrp : error ',kerr
+ RETURN
+ end if
+C
+ IF(JR.EQ.0) THEN
+ KJ=KJ+K
+ GO TO 640
+ END IF
+C
+ JRTK=JR*K+KJ1-K
+ IF(JRTK.GT.JELEM) THEN
+ KERR=19
+ PRINT*,'BUSRP :'
+ CALL CREXERR(KERR)
+ PRINT*,'Replication factor =',JR
+ RETURN
+ END IF
+C
+C ------------------------------------------------------------------
+C* 5. GET NEXT K DESCRIPTORS.
+C -----------------------
+ 500 CONTINUE
+C
+ DO 501 J=1,K
+C
+ ILIST(J)=KSTACK(KJ+J)
+C
+ 501 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 6. ADD JR TIMES K DESCRIPTORS IN PLACE OF K
+C ----------------------------------------
+C DESCRIPTORS OBTAINED.
+C ---------------------
+ 600 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 6.1 PUSH DOWN DESCRIPTORS IN KSTACK FOR (JR-1)*K PLACES
+C ---------------------------------------------------
+C STARTING AT KJ1 AND ENDING AT KJ+K.
+C -----------------------------------
+ 610 CONTINUE
+C
+ JRKM1=(JR-1)*K
+C
+ DO 611 J=KJ1,KJ+K,-1
+C
+ KSTACK(J+JRKM1)=KSTACK(J)
+C
+ 611 CONTINUE
+C
+C* 6.2 INSERT LIST IN THE STACK.
+C -------------------------
+ 620 CONTINUE
+C
+ DO 622 J=1,JR
+C
+ KJJM1K=KJ+(J-1)*K
+C
+ DO 623 J1=1,K
+C
+ KSTACK(KJJM1K+J1)=ILIST(J1)
+C
+ 623 CONTINUE
+ 622 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 6.3 ADJUST DESCRIPTOR COUNT FOR LIST LENGTH.
+C ----------------------------------------
+ 630 CONTINUE
+C
+ KJ1 = KJ1 + (JR-1)*K
+C
+C ------------------------------------------------------------------
+C* 6.4 ADJUST NUMBER OF DATA DESCRIPTORS NOT PRESENT.
+C ----------------------------------------------
+ 640 CONTINUE
+C
+C
+C ------------------------------------------------------------------
+ 700 CONTINUE
+C
+ RETURN
+ END
diff --git a/crexdc/crexstdr.F b/crexdc/crexstdr.F
new file mode 100755
index 0000000..8e4a29f
--- /dev/null
+++ b/crexdc/crexstdr.F
@@ -0,0 +1,179 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXSTDR(KJ,KJ1,KDD,KSTACK,KERR)
+C
+C**** *CREXSTDR*
+C
+C
+C PURPOSE.
+C --------
+C Solve CREX table D reference.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXSTDR(KJ,KJ1,KDD,KSTACK,KERR)*
+C
+C INPUT :
+C *KDD* - data descriptor
+C OUTPUT:
+C *KJ* - pointer to kstack array
+C *KJ1* - pointer to last element in kstack
+C *KSTACK* - list of data descriptors
+C *KERR* - return error code
+C
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+C
+ COMMON/CREXTAB/ NCREXBR(JTAB),NCREXBS(JTAB) , NCREXBDW(JTAB),
+ 1 NCREXDR(JTAB),NCREXDST(JTAB) ,
+ 2 NCREXDL(JTAB),NCREXDSQ(JTAB*20),NCREXP(64,255)
+
+C
+C NCREXBR - table B, table reference array
+C NCREXBS - table B, scale array
+C NCREXBDW - table B, data width array
+C NCREXDR - table D, table reference array
+C NCREXDST - table D, starting pointers array
+C NCREXDL - table D, lengths array
+C NCREXDSQ - table D, list of sequence descriptors array
+C
+
+ COMMON/CREXTABC/ CREXNAME(JTAB),CREXUNIT(JTAB),CREXLST(JELEM)
+C
+C CREXNAME - table B, ELEMENT NAME array
+C CREXUNIT - table B, unit array
+C
+C
+ character*64 CREXNAME
+ character*24 CREXUNIT
+ character*6 CREXLST
+C
+ DIMENSION ILIST(JELEM),KSTACK(*)
+C
+C ------------------------------------------------------------------
+C
+C* 1. OBTAIN LIST OF DESCRIPTORS FROM CREX TABLE D.
+C ---------------------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ DO 110 J=1,JTAB
+C
+ IF(KDD.EQ.NCREXDR(J)) THEN
+ I=J
+ GO TO 120
+ END IF
+C
+ 110 CONTINUE
+C
+ KERR=20
+ PRINT*,' CREXSTDR :',KDD
+ CALL CREXERR(KERR)
+ RETURN
+C
+ 120 CONTINUE
+C
+ J1=NCREXDST(I)
+ J2=NCREXDL (I)
+ J3=0
+C
+ DO 121 J=J1,J1+J2-1
+C
+ J3 = J3 +1
+ ILIST(J3) = NCREXDSQ(J)
+C
+ 121 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 2. PUSH DOWN DATA DESCRIPTION DESCRIPTORS
+C --------------------------------------
+C TO MAKE ROOM FOR LIST.
+C ----------------------
+ 200 CONTINUE
+C
+ J2M1=J2-1
+C
+ DO 210 J=KJ1,KJ+1,-1
+C
+ KSTACK(J+J2M1) = KSTACK(J)
+C
+ 210 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 3. INSERT LIST IN PLACE OF SEQUENCE DESCRIPTORS.
+C ---------------------------------------------
+ 300 CONTINUE
+C
+ KJM1=KJ-1
+C
+ DO 310 J=1,J3
+C
+ KSTACK(KJM1+J)= ILIST(J)
+C
+ 310 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 4. ADJUST DESCRIPTOR COUNT FOR LIST LENGTH.
+C ----------------------------------------
+ 400 CONTINUE
+C
+ KJ = KJ - 1
+ KJ1 = KJ1 +J3 -1
+C ------------------------------------------------------------------
+C* 4.1 ADJUST NUMBER OF DATA DESCRIPTORS NOT PRESENT.
+C ----------------------------------------------
+ 610 CONTINUE
+C
+C -----------------------------------------------------------------
+ 500 CONTINUE
+C
+ RETURN
+C
+ 9901 FORMAT(1H ,' CREXSTDR : table D reference not found, error=',I2)
+C
+ END
diff --git a/crexdc/crextables.F b/crexdc/crextables.F
new file mode 100755
index 0000000..395ae02
--- /dev/null
+++ b/crexdc/crextables.F
@@ -0,0 +1,243 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXTABLES(KSEC1,CREXBTR,CREXBS,CREXBDW,CREXNAMES,
+ 1 CREXUNITS,CREXBP,KERR)
+C
+C**** *BTABLE*
+C
+C
+C PURPOSE.
+C --------
+C CREATE CREX TABLE B IN BINARY FORM.
+C THIS ROUTINE IS USED IN BUFR2CREX PROGRAM
+C
+C** INTERFACE.
+C ----------
+C NONE.
+C
+C
+C *METHOD.
+C -------
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C NONE.
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* JANUARY 2003.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+c
+ PARAMETER(JP=3000)
+C
+ CHARACTER*64 CREXNAMES(JP)
+ CHARACTER*24 CREXUNITS(JP)
+ CHARACTER*160 YENTRY
+ CHARACTER*256 YFNAME
+C
+ DIMENSION KSEC1(*)
+ INTEGER CREXBTR(JP),CREXBS(JP),CREXBDW(JP)
+ INTEGER CREXBP(64,255)
+C
+ CHARACTER*7 YTABB
+ CHARACTER*256 CROOT
+ INTEGER IEMOSNM
+C
+ INTEGER EMOSNUM
+ EXTERNAL EMOSNUM
+C
+ SAVE NXXP,NYYP,NZZP, OFIRST
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+ J=0
+ ICLASS0=0
+ IVIND=2147483647
+C
+ CROOT=' '
+ CALL GETENV('CREX_TABLES',CROOT)
+ ILNG=INDEX(CROOT,' ')
+ ILNG=ILNG-1
+ IF(ILNG.EQ.1) THEN
+C
+C SGI/HP/SUN CREX TABLES PATH
+C
+ CROOT='/home/ma/emos/tables/crex/'
+C
+C ADD VERSION NUMBER
+C
+ ILNG=INDEX(CROOT,' ')
+ IEMOSNM = EMOSNUM(1)
+ WRITE(CROOT(ILNG:ILNG+5),'(I6.6)') IEMOSNM
+ CROOT(ILNG+6:) = '/'
+ ILNG=ILNG+6
+ END IF
+C
+C CREX EDITION 1 NAMING CONVENTION
+C
+C BXXYYZZ , DXXYYZZ
+C
+C B - CREX TABLE 'B'
+C D - CREX TABLE 'D'
+C XX - Crex Master table used '00'
+C YY - Crex Edition number used '01'
+C ZZ - Crex Table version number '01'
+C
+ IXX=KSEC1(14) ! BUFR Master Table 0
+ IYY=KSEC1( 2) ! BUFR Edition
+ IZZ=KSEC1(15) ! Version of Master table
+C
+ IF(OFIRST) THEN
+ IF(IXX.EQ.NXXP.AND.IYY.EQ.NYYP.AND.
+ 1 IZZ.EQ.NZZP) RETURN
+ END IF
+C
+ WRITE(*,'(1H ,A)') 'Your path for crex tables is :'
+ WRITE(*,'(1H ,A)') CROOT(1:ILNG)
+
+ OFIRST=.TRUE.
+
+ NXXP=IXX
+ NYYP=IYY
+ NZZP=IZZ
+C
+C
+ DO 101 I=1,64
+ DO 101 II=1,255
+ CREXBP(I,II)=0
+ 101 CONTINUE
+C
+ DO 102 I=1,JP
+ CREXBTR(I)=IVIND
+ CREXBS(I)=IVIND
+ CREXBDW(I)=IVIND
+ CREXNAMES(I)=' '
+ CREXUNITS(I)=' '
+ 102 CONTINUE
+
+C
+ WRITE(YTABB,'(A1,I2.2,I2.2,I2.2)',iostat=ios) 'B',IXX,IYY,IZZ
+ IF(IOS.NE.0) then
+ KERR=33
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+ print*,'Crex table to be loaded :',YTABB
+C
+ YFNAME=CROOT(1:ILNG)//YTABB
+C
+ DO 301 JJ=1,99
+ INQUIRE(UNIT=JJ,IOSTAT=IOS,OPENED=OPN)
+ IF(.NOT.OPN) THEN
+ IUNIT=JJ
+ OPEN(UNIT=IUNIT,IOSTAT=IOS,ERR=401,FILE=YFNAME,
+ 4 FORM='FORMATTED',
+ 5 RECL=160,
+ 5 STATUS='OLD')
+ GO TO 200
+ END IF
+ 301 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 2. READ IN TABLE B ELEMENT.
+C ------------------------
+C
+ 200 CONTINUE
+C
+ YENTRY=' '
+ READ(IUNIT,'(A)',ERR=402,END=300) YENTRY
+C
+ J=J+1
+ IF(J.GT.JP) THEN
+ PRINT*,' DIMENSION TOO SMALL J=',J
+ KERR=13
+ RETURN
+ END IF
+C
+C ------------------------------------------------------------------
+C* 2.1 SET ARRAYS FOR TABLE REFERENCE, ELEMENT NAME, UNITS,
+C* REFERENCE VALUE AND DATA WIDTH.
+C
+ 210 CONTINUE
+C
+C
+ IMINUS=0
+ IMINUS=INDEX(YENTRY(12:16),'-')
+ IF(IMINUS.NE.0) YENTRY(IMINUS:IMINUS)='9'
+c 1 FMT='(1x,A,1x,A64,47x,A24,I3,8x,I3)')
+ READ(YENTRY,'(2X,I5,1x,64x,71x,I3,7x,I3)',IOSTAT=IOS)
+ 1 CREXBTR(J),CREXBS(J),
+ 1 CREXBDW(J)
+ IF(IOS.NE.0) THEN
+ KERR=35
+ CALL CREXERR(KERR)
+ print*,'Line number ',j
+ RETURN
+ END IF
+C
+ CREXNAMES(J)=YENTRY( 9:72)
+ CREXUNITS(J)=YENTRY(120:123)
+C
+ ICLASS=CREXBTR(J)/1000
+ IYYY =CREXBTR(J)-ICLASS*1000+1
+C
+ ICLASS=ICLASS+1
+ CREXBP(ICLASS,IYYY)=J
+C
+ GO TO 200
+C
+ 300 CONTINUE
+C
+ CLOSE(UNIT=IUNIT)
+ RETURN
+C
+C
+C
+402 CONTINUE
+ KERR=35
+ CALL CREXERR(KERR)
+ WRITE(*,4402) IOS,yfname
+ 4402 FORMAT(1H ,'Read error',i4,' on ',a)
+ RETURN
+C
+C
+ 401 CONTINUE
+C
+ KERR=9
+ CALL CREXERR(KERR)
+ WRITE(*,4401) IOS,yfname
+ 4401 FORMAT(1H ,'Open error',i4,' on ',a)
+C
+ RETURN
+ END
diff --git a/crexdc/crextb.F b/crexdc/crextb.F
new file mode 100755
index 0000000..d4f2e1a
--- /dev/null
+++ b/crexdc/crextb.F
@@ -0,0 +1,525 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXTB(KSEC1,KERR)
+C
+C**** *CREXTB*
+C
+C
+C PURPOSE.
+C --------
+C Load Crex table B and D according to Edition and version
+C of Crex code.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXTB(KSEC1,KERR)*
+C
+C OUTPUT:
+C *KSEC1* - Integer array of at least 40 words
+C containing CREX section 1 information
+C KSEC1( 1)-- Reserved
+C KSEC1( 2)-- CREX Edition number
+C KSEC1( 3)-- Reserved
+C KSEC1( 4)-- Reserved
+C KSEC1( 5)-- Reserved
+C KSEC1( 6)-- CREX message type
+C KSEC1( 7)-- Reserved
+C KSEC1( 8)-- version number of local table used
+C KSEC1( 9)-- Reserved
+C KSEC1(10)-- Reserved
+C KSEC1(11)-- Reserved
+C KSEC1(12)-- Reserved
+C KSEC1(13)-- Reserved
+C KSEC1(14)-- CREX Master table
+C KSEC1(15)-- version number of Master table used
+C KSEC1(16) - KSEC1(40) -- Reserved
+C
+C Crex Edition 2
+C
+C *KSEC1* - Integer array of at least 40 words
+C containing CREX section 1 information
+C KSEC1( 1)-- Reserved
+C KSEC1( 2)-- CREX Edition number
+C KSEC1( 3)-- Originating Centre ( oooo)
+C KSEC1( 4)-- Update sequence number (uu)
+C KSEC1( 5)-- Number of subsets (sss)
+C KSEC1( 6)-- CREX data category (nnn)
+C KSEC1( 7)-- International data sub-category (mmm)
+C KSEC1( 8)-- version number of local table used
+C KSEC1( 9)-- Year (yyyy)
+C KSEC1(10)-- Month (mm)
+C KSEC1(11)-- Day (dd)
+C KSEC1(12)-- Hour (hh)
+C KSEC1(13)-- Minute (mm)
+C KSEC1(14)-- CREX Master table (tt)
+C KSEC1(15)-- version number of Master table used (vv)
+C KSEC1(16)-- Originating sub-centre (ppp)
+C KSEC1(17)-- Bufr master table version number
+C KSEC1(18)-- Bufr version number of local table used
+C KSEC1(19) - KSEC1(40) -- Reserved
+C
+
+C *KERR* - returned error code
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+ PARAMETER(JP=3000,JL=20)
+C
+ COMMON/CREXTAB/ NCREXBR(JTAB),NCREXBS(JTAB) , NCREXBDW(JTAB),
+ 1 NCREXDR(JTAB),NCREXDST(JTAB) ,
+ 2 NCREXDL(JTAB),NCREXDSQ(JTAB*20),NCREXP(64,255)
+
+C
+C NCREXBR - table B, table reference array
+C NCREXBS - table B, scale array
+C NCREXBDW - table B, data width array
+C NCREXDR - table D, table reference array
+C NCREXDST - table D, starting pointers array
+C NCREXDL - table D, lengths array
+C NCREXDSQ - table D, list of sequence descriptors array
+C
+ COMMON/CREXTABC/ CREXNAME(JTAB),CREXUNIT(JTAB),CREXLST(JELEM)
+C
+C CREXNAME - table B, ELEMENT NAME array
+C CREXUNIT - table B, unit array
+C
+C
+ COMMON /CREXROOT/ CROOT
+C
+C croot - path for Crex tables
+C
+ CHARACTER*64 CREXNAME
+ CHARACTER*24 CREXUNIT
+ character*6 CREXLST
+C
+ CHARACTER*256 YNAME
+ CHARACTER*256 YFNAME
+ CHARACTER*160 YENTRY
+C
+ CHARACTER*256 YTAB ,YTAC ,YTAD
+ CHARACTER*7 YTABB,YTABC,YTABD
+ CHARACTER*256 CROOT
+ CHARACTER*6 CNCREXBR
+C
+ DIMENSION KSEC1(*)
+C
+ INTEGER IEMOSNUM
+C EXTERNAL FUNCTIONS
+C
+ INTEGER EMOSNUM
+ EXTERNAL EMOSNUM
+
+ SAVE OFIRST
+C
+C ------------------------------------------------------------------
+C
+C* 1. GET CREX TABLES/LOCAL CREX TABLES.
+C ----------------------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0) RETURN
+C
+C
+C* 2. SET UP CREX TABLE FILE NAME.
+C ----------------------------
+ 200 CONTINUE
+C
+C
+C CREX EDITION 1 NAMING CONVENTION
+C
+C BXXYYZZ , DXXYYZZ
+C
+C B - CREX TABLE 'B'
+C D - CREX TABLE 'D'
+C XX - Crex Master table used '00'
+C YY - Crex Edition number used '01'
+C ZZ - Crex Table version number '01'
+C
+ IXX=0
+ IYY=KSEC1( 2)
+ IZZ=KSEC1(15)
+C
+ IF(OFIRST) THEN
+ IF(IXX.EQ.NXXP.AND.IYY.EQ.NYYP.AND.
+ 1 IZZ.EQ.NZZP) RETURN
+ END IF
+C
+ J=0
+ ICLASS0=0
+ IVIND=2147483647
+C
+ DO 101 I=1,64
+ DO 101 II=1,255
+ NCREXP(I,II)=0
+ 101 CONTINUE
+C
+ DO 102 i=1,JP
+ NCREXBR(I)=IVIND
+ NCREXBS (I)=IVIND
+ NCREXBDW(I)=IVIND
+ CREXNAME(I)=' '
+ CREXUNIT(I)=' '
+ 102 CONTINUE
+C
+ J =0
+ IST=1
+C
+ DO 103 I=1,JP
+ NCREXDR(I)=999999
+ NCREXDL (I)=0
+ NCREXDST(I)=0
+ 103 CONTINUE
+C
+ DO 104 I=1,JP*20
+ NCREXDSQ(I)=0
+ 104 CONTINUE
+
+ OFIRST=.TRUE.
+C
+ NXXP=IXX
+ NYYP=IYY
+ NZZP=IZZ
+C
+ WRITE(YTABB,'(A1,I2.2,I2.2,I2.2)') 'B',IXX,IYY,IZZ
+C WRITE(YTABC,'(A1,I2.2,I2.2,I2.2)') 'C',IXX,IYY,IZZ
+ WRITE(YTABD,'(A1,I2.2,I2.2,I2.2)') 'D',IXX,IYY,IZZ
+C
+ PRINT*,'CREX Tables to be loaded ',YTABB,',',YTABD
+C
+C ----------------------------------------------------------------
+C* 3. OPEN AND READ FILES CONTAINING CREX TABLES.
+C -------------------------------------------
+ 300 CONTINUE
+C
+ CROOT=' '
+ CALL GETENV('CREX_TABLES',CROOT)
+ ILNG=INDEX(CROOT,' ')
+ IF(ILNG.EQ.1) THEN
+C
+C SGI/HP/SUN CREX TABLES PATH
+C
+ CROOT='/home/ma/emos/tables/crex/'
+C
+C ADD VERSION NUMBER
+C
+ ILNG=INDEX(CROOT,' ')
+ IEMOSNM = EMOSNUM(1)
+ WRITE(CROOT(ILNG:ILNG+5),'(I6.6)') IEMOSNM
+ CROOT(ILNG+6:) = '/'
+ ENDIF
+
+ I=INDEX(CROOT,' ')
+ IF(I.NE.0) I=I-1
+C
+C* 3.1 READ CREX TABLE B.
+C ------------------
+ 310 CONTINUE
+C
+ YTAB=CROOT(1:I)//YTABB
+ II=I+7
+C
+ OPEN(UNIT=38,IOSTAT=IOS,ERR=311,FILE=YTAB(1:II),
+ 1 FORM='FORMATTED',
+ 2 recl=160,
+ 5 STATUS='OLD')
+C
+ J=0
+ GO TO 312
+C
+ 311 CONTINUE
+C
+ CLOSE(38)
+C
+ KERR=9
+ CALL CREXERR(KERR)
+ print*,'Open error on ',YTAB(1:II)
+C
+ RETURN
+
+C
+ 312 CONTINUE
+C
+ J=J+1
+ READ(38,ERR=400,IOSTAT=IOS,END=329,
+ 1 FMT='(1x,A,1x,A64,47x,A24,I3,7x,I3)')
+ 2 CNCREXBR,CREXNAME(J),CREXUNIT(J),NCREXBS(J),NCREXBDW(J)
+ IF(IOS.NE.0) THEN
+ print*,'Internal read error.'
+ print*,CNCREXBR
+ KERR=35
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+
+C
+ CNCREXBR(1:1)='0'
+C
+ READ(CNCREXBR,'(i6.6)',IOSTAT=IOS) NCREXBR(J)
+ IF(IOS.NE.0) THEN
+ print*,'Internal read error.'
+ print*,CNCREXBR
+ KERR=35
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+C
+ ICLASS=NCREXBR(J)/1000
+ IYYY =NCREXBR(J)-ICLASS*1000+1
+C
+ ICLASS=ICLASS+1
+ NCREXP(ICLASS,IYYY)=J
+
+ GO TO 312
+C
+ 329 CONTINUE
+C
+ CLOSE(UNIT=38,IOSTAT=IOS,ERR=420)
+C
+C* 3.3 READ CREX TABLE D.
+C ------------------
+ 330 CONTINUE
+C
+ YTAD=CROOT(1:I)//YTABD
+C
+ OPEN(UNIT=40,IOSTAT=IOS,ERR=331,FILE=YTAD(1:II),
+ 1 FORM='FORMATTED',
+ 2 recl=160,
+ 5 STATUS='OLD')
+C
+ GO TO 332
+C
+ 331 CONTINUE
+C
+ CLOSE(40)
+C
+ print*,'Open error on ',YTAD
+C
+ KERR=9
+ CALL CREXERR(KERR)
+ RETURN
+C
+ 332 CONTINUE
+C
+ J=0
+ 340 CONTINUE
+c
+ YENTRY=' '
+ READ(40,'(A)',IOSTAT=IOS,END=390) YENTRY
+ IF(IOS.NE.0) THEN
+ print*,'Read error on CREX table D.'
+ KERR=35
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+ IF(YENTRY(2:2).EQ.'D') YENTRY(2:2)='3'
+c
+ j=j+1
+ READ(YENTRY,'(1X,I6,1X,I2)',IOSTAT=IOS) NCREXDR(J),NCREXDL(J)
+ IF(IOS.NE.0) THEN
+ print*,YENTRY
+ KERR=35
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+ IF(J.GT.JP) THEN
+ PRINT*,' DIMENSION TOO SMALL J=',J
+ KERR=13
+ RETURN
+ END IF
+C
+ IF(J.EQ.1) THEN
+ IST=1
+ NCREXDST(J)=IST
+ ELSE
+ IST=IST + NCREXDL(J-1)
+ NCREXDST(J)=IST
+ END IF
+C
+ IF(NCREXDL(J).GT.1) THEN
+ if(YENTRY(12:12).eq.'D') YENTRY(12:12)='3'
+ if(YENTRY(12:12).eq.'C') then
+ YENTRY(12:12)='2'
+c check if negative scale is present
+ IMINUS=0
+ IMINUS=INDEX(YENTRY(12:16),'-')
+ IF(IMINUS.NE.0) YENTRY(IMINUS:IMINUS)='9'
+ end if
+ IF(YENTRY(12:12).eq.'R') YENTRY(12:12)='1'
+ IF(YENTRY(12:12).eq.'B') YENTRY(12:12)='0'
+ READ(YENTRY,'(11X,I6)',IOSTAT=IOS) NCREXDSQ(IST)
+ IF(IOS.NE.0) THEN
+ print*,YENTRY
+ KERR=35
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+c
+ IIST=IST
+C
+ DO 220 JA=1,NCREXDL(J)-1
+ IIST=IIST+1
+ READ(40,'(A)',END=300,IOSTAT=IOS) YENTRY
+ IF(IOS.NE.0) THEN
+ print*,YENTRY
+ KERR=35
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+c
+ IF(YENTRY(12:12).eq.'D') YENTRY(12:12)='3'
+ IF(YENTRY(12:12).eq.'C') YENTRY(12:12)='2'
+ IF(YENTRY(12:12).eq.'R') YENTRY(12:12)='1'
+ IF(YENTRY(12:12).eq.'B') YENTRY(12:12)='0'
+ READ(YENTRY,'(11X,I6)',IOSTAT=IOS) NCREXDSQ(IIST)
+ IF(IOS.NE.0) THEN
+ print*,'Internal read error.'
+ print*,YENTRY
+ KERR=35
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+ 220 CONTINUE
+C
+ ELSE
+ IF(YENTRY(12:12).eq.'D') YENTRY(12:12)='3'
+ IF(YENTRY(12:12).eq.'C') YENTRY(12:12)='2'
+ IF(YENTRY(12:12).eq.'R') YENTRY(12:12)='1'
+ IF(YENTRY(12:12).eq.'B') YENTRY(12:12)='0'
+ READ(YENTRY,'(11X,I6)',IOSTAT=IOS) NCREXDSQ(IST)
+ IF(IOS.NE.0) THEN
+ print*,YENTRY
+ KERR=35
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+ END IF
+C
+ GO TO 340
+c
+ 390 CONTINUE
+C
+ CLOSE(UNIT=40,IOSTAT=IOS,ERR=620)
+C
+C
+ RETURN
+C ----------------------------------------------------------------
+ 400 CONTINUE
+C
+ KERR=6
+ PRINT*,'BUGBTS: IOS ',IOS
+ CALL CREXERR(KERR)
+ OFIRST=.FALSE.
+ RETURN
+C
+ 410 CONTINUE
+C
+ KERR=9
+ PRINT*,'BUGBTS: IOS ',IOS
+ CALL CREXERR(KERR)
+ OFIRST=.FALSE.
+ RETURN
+C
+ 420 CONTINUE
+C
+ KERR=10
+ PRINT*,'BUGBTS: IOS ',IOS
+ CALL CREXERR(KERR)
+ OFIRST=.FALSE.
+ RETURN
+C ----------------------------------------------------------------
+ 500 CONTINUE
+C
+ KERR=7
+ PRINT*,'BUGBTS: IOS ',IOS
+ CALL CREXERR(KERR)
+ OFIRST=.FALSE.
+ RETURN
+C
+ 510 CONTINUE
+C
+ KERR=9
+ PRINT*,'BUGBTS: IOS ',IOS
+ CALL CREXERR(KERR)
+ OFIRST=.FALSE.
+ RETURN
+C
+ 520 CONTINUE
+C
+ KERR=11
+ PRINT*,'BUGBTS: IOS ',IOS
+ CALL CREXERR(KERR)
+ OFIRST=.FALSE.
+ RETURN
+C -----------------------------------------------------------------
+ 600 CONTINUE
+C
+ KERR=8
+ PRINT*,'BUGBTS: IOS ',IOS
+ CALL CREXERR(KERR)
+ OFIRST=.FALSE.
+ RETURN
+C
+ 610 CONTINUE
+C
+ KERR=9
+ PRINT*,'BUGBTS: IOS ',IOS
+ CALL CREXERR(KERR)
+ OFIRST=.FALSE.
+ RETURN
+C
+ 620 CONTINUE
+C
+ KERR=12
+ PRINT*,'BUGBTS: IOS ',IOS
+ CALL CREXERR(KERR)
+ OFIRST=.FALSE.
+ RETURN
+C -----------------------------------------------------------------
+C
+ END
diff --git a/crexdc/crexupwt.F b/crexdc/crexupwt.F
new file mode 100755
index 0000000..16a4d65
--- /dev/null
+++ b/crexdc/crexupwt.F
@@ -0,0 +1,323 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CREXUPWT(KDD,KELEM,KERR)
+C
+C**** *CREXUPWT*
+C
+C
+C PURPOSE.
+C --------
+C Updates working tables setting element name,unit,scale,
+C reference value and data width.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *CREXUPWT(KDD,KELEM,KERR)*
+C
+C INPUT :
+C *KDD* - data descriptor
+C *KELEM* - dimension of CNAMES, CUNITS array
+C OUTPUT:
+C *KERR* - return error code
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+C
+C
+ COMMON /CREXWT/ NCREXDWINC,NCREXSCAM,NCREXAFDW,NCREXWT ,ODREPF,
+ 2 NCREXSTACK(JELEM),NCREXWTEN(JELEM),
+ 3 NCREXWTR (JELEM),NCREXWTS (JELEM),NCREXWTRV(JELEM),
+ 4 NCREXWTDW(JELEM),NWTIW(JELEM),NWTIWS(JELEM)
+C
+C NCREXDWINC - data width increment
+C NCREXSCAM - scale multiplier
+C NCREXAFDW - augmented field data width
+C NCREXWT - pointer to working table
+C NCREXSTACK - list of data descriptors
+C ODREPF - replication (logical)
+C NCREXWTR - working table reference
+C NCREXWTS - working scale
+C NCREXWTRV - working reference value
+C NCREXWTDW - working data width
+C NWTIW - working data width of increments
+C NWTIWS - working total data width of element set
+C
+C
+ COMMON /CREXWTC/ CREXWTEN(JELEM),CREXWTU (JELEM)
+C
+C CREXWTEN - working table element naame
+C CREXWTU - working table units
+C
+C
+
+ COMMON/CREXTAB/ NCREXBR(JTAB),NCREXBS(JTAB) , NCREXBDW(JTAB),
+ 1 NCREXDR(JTAB),NCREXDST(JTAB) ,
+ 2 NCREXDL(JTAB),NCREXDSQ(JTAB*20),NCREXP(64,255)
+
+C
+C NCREXBR - table B, table reference array
+C NCREXBS - table B, scale array
+C NCREXBDW - table B, data width array
+C NCREXDR - table D, table reference array
+C NCREXDST - table D, starting pointers array
+C NCREXDL - table D, lengths array
+C NCREXDSQ - table D, list of sequence descriptors array
+C
+C
+C
+
+ COMMON/CREXTABC/ CREXNAME(JTAB),CREXUNIT(JTAB),CREXLST(JELEM)
+C
+C CREXNAME - table B, ELEMENT NAME array
+C CREXUNIT - table B, unit array
+C
+C
+ COMMON /CREXATB/ NJA,NCREXATBTR(JTAB),NCREXATBS (JTAB),
+ 1 NCREXATBRV(JTAB),NCREXATBDW(JTAB)
+C
+C
+C NCREXATBTR - augmented table B table reference
+C NCREXATBS - augmented table B scale
+C NCREXATBRV - augmented table B reference value
+C NCREXATBDW - augmented table B data width
+C
+C
+ COMMON /CREXATBC/ CREXATBEN(JTAB),CREXATBU (JTAB)
+C
+C CREXATBEN - augmented table B element name
+C CREXATBU - augmented table B units
+C
+C
+ COMMON /CREXBEF / M,MM,N,JCV
+C
+C M - Number of elements
+C MM - Number of elements
+C N - Number of data sub_sets
+C JCV - Number of character values
+C
+ COMMON /CREXUT/ YUNIT,CUNITNAME,CIA5,CIA2,NCODE,NRECORDS
+c
+c NCODE - array containing unit code number
+c CUNITNAME - array containing unit name
+c CIA5 - array containing unit CCITTIA5 name
+c CIA2 - array containing unit CCITTIA2 name
+c NRECORDS - number of entries in the list
+c
+C
+ COMMON /CREXWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+C
+
+ DIMENSION NCODE(JCTEXT)
+ CHARACTER*30 CUNITNAME(JCTEXT)
+ CHARACTER*24 CIA5(JCTEXT)
+ CHARACTER*24 CIA2(JCTEXT)
+ CHARACTER*24 YUNIT
+
+C
+ CHARACTER*64 CREXNAME, CREXATBEN
+ CHARACTER*24 CREXATBU,CREXUNIT
+ CHARACTER*6 CREXLST
+C
+ CHARACTER*64 CREXWTEN
+ CHARACTER*24 CREXWTU
+ CHARACTER YCH6*6
+ REAL*8 RVIND
+ REAL*8 EPS
+C
+C
+C ------------------------------------------------------------------
+C* 1. UPDATE WORKING TABLE.
+C ---------------------
+ 100 CONTINUE
+C
+ IF( KERR.NE.0 ) RETURN
+C
+ ICLASS=KDD/1000
+ IYYY =KDD-ICLASS*1000+1
+ ICLASS=ICLASS+1
+C
+C* 1.1 ASSOCIATED FIELD ?
+C ------------------
+ 110 CONTINUE
+C
+ IF(NCREXAFDW.EQ.0) GO TO 140
+C
+C* 1.2 UNITS ELEMENT DESCRIPTOR ?
+C --------------------------
+ 120 CONTINUE
+C
+ I=NCREXP(ICLASS,IYYY)
+ IF(I.EQ.0) THEN
+ KERR=23
+ PRINT*,'CREXUPWT : ',KDD
+ CALL CREXERR(KERR)
+ DO 1 IQ=1,JELEM
+ NCREXSTACK(IQ)=0.
+ 1 CONTINUE
+ RETURN
+ end if
+C
+ IF(CREXUNIT(I)(1:4).EQ.'CODE') GO TO 140
+ IF(CREXUNIT(I)(1:4).EQ.'FLAG') GO TO 140
+ IF(CREXUNIT(I)(1:3).EQ.'NUM' ) GO TO 140
+C
+C* 1.3 ADD SPECIAL ENTRY TO WORKING TABLE.
+C -----------------------------------
+ 130 CONTINUE
+C
+ NCREXWT=NCREXWT+1
+ CREXWTEN(NCREXWT)='ASSOCIATED FIELD'
+ CREXWTU (NCREXWT)=' '
+ NCREXWTDW(NCREXWT)=NCREXAFDW
+ NCREXWTR (NCREXWT)= 999999
+ NCREXWTEN(NCREXWT)= 0
+ NCREXWTS (NCREXWT)= 0
+ NCREXWTRV(NCREXWT)= 0
+ NCREXAFDW=0
+C
+C* UPDATE CNAMES AND CUNITS
+C
+ M=M+1
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ PRINT*,'CREXUPWT:'
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+C ------------------------------------------------------------------
+C* 1.4 SEARCH AUGMENTED TABLE *B ENTRIES .
+C -----------------------------------
+ 140 CONTINUE
+C
+C* 1.5 GET TABLE *B ENTRY .
+C ---------------------
+ 150 CONTINUE
+C
+ I=NCREXP(ICLASS,IYYY)
+ IF(I.EQ.0) THEN
+ KERR=23
+ PRINT*,'CREXUPWT : ',KDD
+ CALL CREXERR(KERR)
+ DO 2 IQ=1,JELEM
+ NCREXSTACK(IQ)=0.
+ 2 CONTINUE
+ RETURN
+ END IF
+C
+ 155 CONTINUE
+C
+C -----------------------------------------------------------------
+C* 1.6 MODIFY ENTRY FOR OPERATOR IN FORCE.
+C -----------------------------------
+ 160 CONTINUE
+C
+C* ADD ENTRY TO WORKING TABLE.
+C ---------------------------
+ NCREXWT=NCREXWT+1
+ NCREXWTR (NCREXWT) = KDD
+ if(NCREXSCAM.ne.0) then
+ NCREXWTS (NCREXWT) = NCREXSCAM
+ else
+ NCREXWTS (NCREXWT) = NCREXBS (I)
+ end if
+ NCREXSCAM=0
+c
+ NCREXWTRV(NCREXWT) = NCREXBR(I)
+ if(NCREXDWINC.ne.0) then
+ NCREXWTDW(NCREXWT) = NCREXDWINC
+ else
+ NCREXWTDW(NCREXWT) = NCREXBDW(I)
+ end if
+ NCREXDWINC=0
+ if(NCREXWTR (NCREXWT).eq.031002) then
+ NCREXWTDW(NCREXWT)=4
+ NCREXWTRV(NCREXWT) = 0
+ end if
+C
+C CHECK IF DATA ARE PRESENT IN DATA SECTION.
+C
+ if(NCREXWTR(NCREXWT).eq.31011.or.
+ 1 NCREXWTR(NCREXWT).eq.31012) then
+ if(NCREXWTR(NCREXWT-1).eq.31011.or.
+ 2 NCREXWTR(NCREXWT-1).eq.31012) then
+ NCREXWTDW(NCREXWT)=0
+ end if
+ end if
+C
+ 175 CONTINUE
+C
+C ------------------------------------------------------------------
+C* 1.8 UPDATE M, CNAMES, CUNITS.
+C -------------------------
+ 180 CONTINUE
+C
+ CREXWTEN(NCREXWT) = CREXNAME(I)
+ IF(NC07YYY.NE.0) THEN
+ CREXWTU (NCREXWT) = YUNIT
+ YUNIT=' '
+ NC07YYY=0
+ else
+ CREXWTU (NCREXWT) = CREXUNIT(I)
+ END IF
+ NCREXWTEN(NCREXWT) = 0
+ IF(CREXUNIT(I)(1:3).EQ.'CHA') NCREXWTEN(NCREXWT)=658367
+C
+ M = M + 1
+ IF(M.GT.KELEM) THEN
+ KERR=25
+ PRINT*,'CREXUPWT:'
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ RETURN
+ END
diff --git a/crexdc/dec2octal.F b/crexdc/dec2octal.F
new file mode 100755
index 0000000..40c35cd
--- /dev/null
+++ b/crexdc/dec2octal.F
@@ -0,0 +1,77 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE DEC2OCTAL(KOCTAL,KDECIMAL,KERR)
+C**** *DEC2OCTAL*
+C
+C
+C PURPOSE.
+C --------
+C Convert decomal integer into octal value
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *DEC2OCTAL(KOCTAL,KDECIMAL,KERR)
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+
+ INTEGER KOCTAL
+ INTEGER KDECIMAL
+ CHARACTER*10 C
+c
+ KERR=0
+ WRITE(C,'(O10)',IOSTAT=IOS) KDECIMAL
+ IF(IOS.NE.0) then
+ Print*,'DEC2OCTAL: internal write error ',ios
+ KERR=33
+ RETURN
+ ENDIF
+C
+ READ(C, '(I10)',IOSTAT=IOS) KOCTAL
+ IF(IOS.NE.0) then
+ Print*,'DEC2OCTAL: internal read error ',ios
+ KERR=35
+ RETURN
+ ENDIF
+
+c
+ RETURN
+ END
diff --git a/crexdc/extgrp.F b/crexdc/extgrp.F
new file mode 100755
index 0000000..dd97008
--- /dev/null
+++ b/crexdc/extgrp.F
@@ -0,0 +1,114 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE EXTGRP(KBUFL,YBUFF, I,K,IVAL,KERR )
+C
+C**** *EXTGRP*
+C
+C
+C PURPOSE.
+C --------
+C
+C Extract value of group of character
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *EXTGRP(kbufl,ybuff, i,k,ival,kerr )
+C
+C kbufl - size of ybuff in bytes
+C ybuff - character string
+C
+C I - CONVERSION OF GROUP STARTS IN WORD I
+C OF ARRAY 'KCHAR' .
+C
+C K - number of characters to convert
+C
+C
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C M. D. DRAGOSAVAC *ECMWF* 15/09/2003.
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H,Y)
+C
+C
+ COMMON /CREXWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+C
+ CHARACTER*(*) YBUFF
+ CHARACTER*8 FMT
+ REAL*8 RVIND, EPS
+C
+ DIMENSION NN(5)
+C
+C ------------------------------------------------------------------
+C* 1. EXTRACT GROUP OF CHARACTERS.
+C ----------------------------
+ 100 CONTINUE
+C
+ IVAL=NVIND
+C
+ FMT='(I10.10)'
+ WRITE(FMT(3:4),'(I2.2)') K
+ FMT(6:7)=FMT(3:4)
+C
+C
+c Check for '-' sign
+c
+ IF(NE.EQ.1) THEN
+ IF(YBUFF(I:I).EQ.'-') THEN
+ I=I+1
+ END IF
+ END IF
+c
+c Check for slash or non figure character
+c
+ DO IZ=I,I+K-1
+ IF(YBUFF(IZ:IZ).EQ.'/') RETURN
+ IICH=ICHAR(YBUFF(IZ:IZ))
+ IF(IICH.LT.48.OR.IICH.GT.57) RETURN
+ END DO
+c
+ READ(YBUFF(I:I+K-1),FMT,IOSTAT=IOS) IVAL
+ IF(IOS.NE.0) THEN
+ KERR=35
+ CALL CREXERR(KERR)
+ RETURN
+ END IF
+C
+ IF(YBUFF(I-1:I-1).EQ.'-') IVAL=-IVAL
+C
+ I=I+K
+C
+ RETURN
+ END
diff --git a/crexdc/extgrpc.F b/crexdc/extgrpc.F
new file mode 100755
index 0000000..6048ab9
--- /dev/null
+++ b/crexdc/extgrpc.F
@@ -0,0 +1,80 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE EXTGRPC(KBUFL,YBUFF, I,K,CVAL,KERR )
+C
+C**** *EXTGRP*
+C
+C
+C PURPOSE.
+C --------
+C CONVERT GROUP IN THE REPORT
+C TO INTEGERS IN ARRAY 'KINT' .
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *EXTGRP(KBUFL,YBUFF, I,K,IVAL,KERR )
+C
+C kbufl - size of ybuff in bytes
+C ybuff - character string
+C
+C I - CONVERSION OF GROUP STARTS IN WORD I
+C OF ARRAY 'ybuff' .
+C
+C k - number of characters to convert
+C
+C
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C M. D. DRAGOSAVAC *ECMWF* 15/09/2003.
+C
+C
+ IMPLICIT LOGICAL(O,G)
+C
+ CHARACTER*(*) YBUFF , CVAL
+C
+C
+C ------------------------------------------------------------------
+C* 1. EXTRACT GROUP OF CHARACTERS.
+C ----------------------------
+ 100 CONTINUE
+C
+C
+ CVAL=YBUFF(I:I+K-1)
+C
+ I=I+K
+C
+C
+ RETURN
+ END
diff --git a/crexdc/get_units.F b/crexdc/get_units.F
new file mode 100755
index 0000000..a60c3cd
--- /dev/null
+++ b/crexdc/get_units.F
@@ -0,0 +1,89 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GET_UNITS(KY,KERR)
+C**** *GET_UNITS*
+C
+C
+C PURPOSE.
+C --------
+C
+C Get units for the code number KY
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *GET_UNITS(KY,KERR)*
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+
+c
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2= 64 ,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+ 3 JWORK=360000,JKEY=46)
+
+ COMMON /CREXUT/ YUNIT,CUNITNAME,CIA5,CIA2,NCODE,NRECORDS
+c
+c NCODE - array containing unit code number
+c CUNITNAME - array containing unit name
+c CIA5 - array containing unit CCITTIA5 name
+c CIA2 - array containing unit CCITTIA2 name
+c NRECORDS - number of entries in the list
+c
+ DIMENSION NCODE(JCTEXT)
+ CHARACTER*30 CUNITNAME(JCTEXT)
+ CHARACTER*24 CIA5(JCTEXT)
+ CHARACTER*24 CIA2(JCTEXT)
+ CHARACTER*24 YUNIT
+c
+ KERR=0
+ DO I=1,NRECORDS
+ IF(NCODE(I).EQ.KY) THEN
+ YUNIT=CIA5(I)
+ RETURN
+ END IF
+ END DO
+c
+ KERR=47
+ CALL CREXERR(KERR)
+c
+ RETURN
+ END
diff --git a/crexdc/nextgrp.F b/crexdc/nextgrp.F
new file mode 100755
index 0000000..8842c66
--- /dev/null
+++ b/crexdc/nextgrp.F
@@ -0,0 +1,105 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE NEXTGRP(KBUFL,YBUFF,I,J,KERR)
+C
+C**** *NEXTGRP*
+C
+C
+C PURPOSE.
+C --------
+C LOCATE THE NEXT SEPARATOR
+C CHARACTER WHICH IS NOT 'CR' OR 'LF' OR 'SPACE' OR '+'
+C
+C INPUT : KBUFL - size if ybuff
+C YBUFF - character string
+C I - SCAN STARTS AT byte 'I' OF YBUFF
+C J - SCAN ENDS AT byte 'J' OF YBUFF
+C
+C OUTPUT : I - POSITION OF NEXT 'CR' OR 'LF' OR 'SPACE'
+C OR '+'
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *NEXTGRP(KBUFL,YBUFF,I,J,KERR)*
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H,Y)
+C
+ CHARACTER*(*) YBUFF
+ CHARACTER*1 CR,LF,SPACE,PLUS,MINUS
+C
+ COMMON /CREXWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+ REAL*8 RVIND, EPS
+C
+C ------------------------------------------------------------------
+C
+C* 1. SCAN BULLETIN.
+C --------------
+ 100 CONTINUE
+C
+C 'CR' = 13 , 'LF' = 10 , 'SPACE' = 32 'PLUS' = 43
+C
+ KERR=0
+ cr=char(13)
+ lf=char(10)
+ space=char(32)
+ plus=char(43)
+ minus='-'
+C
+ i=iabs(i)
+ k = i
+ do 101 i=k,j
+ if(NE.eq.0) then
+ if(ybuff(I:I).ne.cr.and.
+ 1 ybuff(I:I).ne.lf.and.
+ 2 ybuff(I:I).ne.space.and.
+ 2 ybuff(I:I).ne.minus.and.
+ 2 ybuff(I:I+2).ne.'E++'.and.
+ 3 ybuff(I:I).ne.plus) return
+ else
+ if(ybuff(I:I).ne.cr.and.
+ 1 ybuff(I:I).ne.lf.and.
+ 2 ybuff(I:I).ne.space.and.
+ 2 ybuff(I:I+2).ne.'E++'.and.
+ 3 ybuff(I:I).ne.plus) return
+ end if
+ 101 continue
+C
+ RETURN
+ END
diff --git a/crexdc/nextprt.F b/crexdc/nextprt.F
new file mode 100755
index 0000000..6c581c7
--- /dev/null
+++ b/crexdc/nextprt.F
@@ -0,0 +1,101 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE NEXTPRT (KBUFL,YBUFF,I,J,KERR )
+C
+C**** *NEXTPRT*
+C
+C
+C PURPOSE.
+C --------
+C SCANS BULLETIN IN 'KCHAR' FOR NEXT CHARACTER WHICH
+C IS NOT 'SOH' , 'CR' , 'LF' , 'SPACE' OR 'GS' .
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *NEXTPRT(KBUFL,YBUFF,I,J,KERR*
+C
+C INPUT : KBUFL - length of YBUFF in bytes
+C YBUFF - charcter string
+C I - SCAN STARTS AT WORD I.
+C J - SCAN STOPS AT WORD J .
+C
+C OUTPUT : I - POSITION OF REQUIRED CHARACTER
+C KERR - ERROR CODE
+C
+
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C M. D. DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H,Y)
+C
+ CHARACTER*(*) YBUFF
+ CHARACTER*1 soh,lf,cr,space,gs,plus,minus
+C
+C ------------------------------------------------------------------
+C
+C* 1. SCAN BULLETIN.
+C --------------
+ 100 CONTINUE
+C
+C 'SOH' = 1 , 'LF' = 10 , 'CR' = 13 , SPACE = 32 , 'GS' = 29.
+C '+' = 43, 'MINUS'='-'
+c
+ kerr=0
+ soh=char(1)
+ lf=char(10)
+ cr=char(13)
+ space=char(32)
+ gs=char(29)
+ plus=char(43)
+ minus='-'
+C
+ i = iabs(i)
+ K = I
+ do 101 i=k,j
+ if(ybuff(i:i).ne.soh.and.
+ 1 ybuff(i:i).ne.lf.and.
+ 2 ybuff(i:i).ne.cr.and.
+ 3 ybuff(i:i).ne.space.and.
+ 4 ybuff(i:i).ne.gs.and.
+ 4 ybuff(i:i).ne.minus.and.
+ 5 ybuff(i:i).ne.plus) then
+ return
+ end if
+ 101 continue
+C
+ RETURN
+ END
diff --git a/crexdc/nextsec.F b/crexdc/nextsec.F
new file mode 100755
index 0000000..0935ce3
--- /dev/null
+++ b/crexdc/nextsec.F
@@ -0,0 +1,84 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE NEXTSEC(KBUFL,YBUFF, I,J,KERR )
+C
+C**** *NEXTSEC*
+C
+C
+C PURPOSE.
+C --------
+C
+C Scan ybuff for '++' characters
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *NEXTSEC(I,J)*
+C INPUT : KBUFL - size of ybuff in bytes
+C YBUFF - character string
+C I - scan starts at word I.
+C J - scan stops at word J .
+C
+C OUTPUT : I - position of required character.
+C KERR - error code
+
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H,Y)
+C
+ CHARACTER*(*) YBUFF
+ CHARACTER*2 plusplus
+C
+C ------------------------------------------------------------------
+C* 1. SCANE BULLETIN FOR NEXT '=' SIGN.
+C ---------------------------------
+ 100 CONTINUE
+C
+ plusplus='++'
+C
+
+ i = iabs(i)
+ k = i
+ do 101 i=k,j
+ if(ybuff(i:i+1).eq.plusplus) return
+ 101 continue
+C
+ i=j
+ RETURN
+ END
diff --git a/crexdc/nextsep.F b/crexdc/nextsep.F
new file mode 100755
index 0000000..628a6c8
--- /dev/null
+++ b/crexdc/nextsep.F
@@ -0,0 +1,103 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE NEXTSEP(KBUFL,YBUFF,I,J,KERR)
+C
+C**** *NEXTSEP*
+C
+C
+C PURPOSE.
+C --------
+C LOCATE THE NEXT SEPARATOR
+C CHARACTER WHICH IS 'CR' OR 'LF' OR 'SPACE' OR '+'
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *NEXTSEP(KBUFL,YBUFF,I,J,KERR)*
+C INPUT : KBUFL - size if ybuff
+C YBUFF - character string
+C I - SCAN STARTS AT byte 'I' OF YBUFF
+C J - SCAN ENDS AT byte 'J' OF YBUFF
+C
+C OUTPUT : I - POSITION OF NEXT 'CR' OR 'LF' OR 'SPACE'
+C OR '+'
+
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C MILAN DRAGOSAVAC *ECMWF* 15/02/2003.
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H,Y)
+C
+ CHARACTER*(*) YBUFF
+ CHARACTER*1 cr,lf,space,plus,minus
+C
+ COMMON /CREXWORK/ NBPT,NGS,NVIND,NBPTSEC2,RVIND,EPS,NE,IEOLD,
+ 1 NC07YYY
+ REAL*8 RVIND,EPS
+C
+C ------------------------------------------------------------------
+C
+C* 1. SCAN BULLETIN.
+C --------------
+ 100 CONTINUE
+C
+C 'CR' = 13 , 'LF' = 10 , 'SPACE' = 32 'PLUS' = 43,
+C
+ cr=char(13)
+ lf=char(10)
+ space=char(32)
+ plus=char(43)
+ minus='-'
+C
+ i=iabs(i)
+ k = i
+ do 101 i=k,j
+ if(NE.eq.0) then
+ if(ybuff(I:I).eq.cr.or.
+ 1 ybuff(I:I).eq.lf.or.
+ 2 ybuff(I:I).eq.space.or.
+ 3 ybuff(I:I).eq.minus.or.
+ 3 ybuff(I:I).eq.plus) return
+ else
+ if(ybuff(I:I).eq.cr.or.
+ 1 ybuff(I:I).eq.lf.or.
+ 2 ybuff(I:I).eq.space.or.
+ 3 ybuff(I:I).eq.plus) return
+ end if
+ 101 continue
+C
+ return
+ end
diff --git a/crexdc/nextsubset.F b/crexdc/nextsubset.F
new file mode 100755
index 0000000..e085fcb
--- /dev/null
+++ b/crexdc/nextsubset.F
@@ -0,0 +1,90 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE NEXTSUBSET(KBUFL,YBUFF, I,J,KERR )
+C
+C**** *NEXTSUBSET*
+C
+C
+C PURPOSE.
+C --------
+C
+C SCANS BULLETIN IN 'KCHAR' FOR NEXT '+CrCrLf' CHARACTER.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *NEXTSUBSET((KBUFL,YBUFF, I,J,KERR)*
+C INPUT : KBUFL - size of ybuff in bytes
+C YBUFF - character string
+C I - scan starts at character I.
+C J - scan stops at character J .
+C
+C OUTPUT : I - position of required character
+C character not found.
+C KERR - return error code
+
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 05/11/2003
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H,Y)
+C
+ character*(*) ybuff
+ character*1 plus
+ character*4 plcrlf
+C
+C ------------------------------------------------------------------
+C* 1. SCANE BULLETIN FOR NEXT '+CrCrLf'
+C ---------------------------------
+ 100 CONTINUE
+C
+ plus='+'
+ plcrlf='+'//char(13)//char(13)//char(10)
+C
+
+ i = iabs(i)
+ k = i
+ do 101 i=k,j
+ if(ybuff(i-1:i-1).ne.plus.and.ybuff(i:i).eq.plus.and.
+ 1 ybuff(i+1:i+1).ne.plus) then
+ return
+ end if
+ 101 continue
+C
+ I=J
+ RETURN
+ END
diff --git a/crexdc/octal2dec.F b/crexdc/octal2dec.F
new file mode 100755
index 0000000..9775c91
--- /dev/null
+++ b/crexdc/octal2dec.F
@@ -0,0 +1,75 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE OCTAL2DEC(KOCTAL,KDECIMAL,KERR)
+C**** *DEC2OCTAL*
+C
+C
+C PURPOSE.
+C --------
+C Convert decomal integer into octal value
+C
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *DEC2OCTAL(KOCTAL,KDECIMAL,KERR)
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+
+ INTEGER KOCTAL
+ INTEGER KDECIMAL
+ CHARACTER*10 C
+c
+ KERR=0
+ WRITE(C,'(I10)',IOSTAT=IOS) KOCTAL
+ IF(IOS.NE.0) then
+ Print*,'OCTAL2DEC: internal write error ',ios
+ KERR=33
+ RETURN
+ ENDIF
+
+ READ(C, '(O10)',IOSTAT=IOS) KDECIMAL
+ IF(IOS.NE.0) then
+ Print*,'OCTAL2DEC: internal write error ',ios
+ KERR=33
+ RETURN
+ ENDIF
+c
+ RETURN
+ END
diff --git a/crexdc/sources b/crexdc/sources
new file mode 100755
index 0000000..073248b
--- /dev/null
+++ b/crexdc/sources
@@ -0,0 +1,45 @@
+#
+# Sources for crexdc
+#
+
+SOURCES.F = \
+ crexdes.F \
+ crexedd.F \
+ crexen.F \
+ crexepwt.F \
+ crexerr.F \
+ crexetab.F \
+ crexetd.F \
+ crexetdr.F \
+ crexex.F \
+ crexinit.F \
+ crexivar.F \
+ crexoper.F \
+ crexprco.F \
+ crexprs0.F \
+ crexprs1.F \
+ crexprt.F \
+ crexrep.F \
+ crexs0.F \
+ crexs1.F \
+ crexs2.F \
+ crexs2data.F \
+ crexs5.F \
+ crexsel.F \
+ crexsrp.F \
+ crexstdr.F \
+ crextables.F \
+ crextb.F \
+ crexupwt.F \
+ dec2octal.F \
+ extgrp.F \
+ extgrpc.F \
+ get_units.F \
+ nextgrp.F \
+ nextprt.F \
+ nextsec.F \
+ nextsep.F \
+ nextsubset.F \
+ crex_get_name_unit.F \
+ crexsel2.F \
+ octal2dec.F
diff --git a/crextables/B000101 b/crextables/B000101
new file mode 100755
index 0000000..176d728
--- /dev/null
+++ b/crextables/B000101
@@ -0,0 +1,1197 @@
+ 000001 TABLE A: ENTRY CCITTIA5 0 0 24 CHARACTER 0 3
+ 000002 TABLE A: DATA CATEGORY DESCRIPTION, LINE 1 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000003 TABLE A: DATA CATEGORY DESCRIPTION, LINE 2 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000004 BUFR/CREX MASTER TABLE CCITTIA5 0 0 16 CHARACTER 0 2
+ 000005 BUFR/CREX EDITION NUMBER CCITTIA5 0 0 24 CHARACTER 0 3
+ 000006 BUFR MASTER TABLE VERSION NUMBER CCITTIA5 0 0 16 CHARACTER 0 2
+ 000007 CREX MASTER TABLE VERSION NUMBER CCITTIA5 0 0 16 CHARACTER 0 2
+ 000008 BUFR LOCAL TABLE VERSION NUMBER CCITTIA5 0 0 16 CHARACTER 0 2
+ 000010 F DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 8 CHARACTER 0 1
+ 000011 X DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 16 CHARACTER 0 2
+ 000012 Y DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 24 CHARACTER 0 3
+ 000013 ELEMENT NAME, LINE 1 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000014 ELEMENT NAME, LINE 2 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000015 UNITS NAME CCITTIA5 0 0 192 CHARACTER 0 24
+ 000016 UNITS SCALE SIGN CCITTIA5 0 0 8 CHARACTER 0 1
+ 000017 UNITS SCALE CCITTIA5 0 0 24 CHARACTER 0 3
+ 000018 UNITS REFERENCE SIGN CCITTIA5 0 0 8 CHARACTER 0 1
+ 000019 UNITS REFERENCE VALUE CCITTIA5 0 0 80 CHARACTER 0 10
+ 000020 ELEMENT DATA WIDTH CCITTIA5 0 0 24 CHARACTER 0 3
+ 000030 DESCRIPTOR DEFINING SEQUENCE CCITTIA5 0 0 48 CHARACTER 0 6
+ 001001 WMO BLOCK NUMBER NUMERIC 0 0 7 NUMERIC 0 2
+ 001002 WMO STATION NUMBER NUMERIC 0 0 10 NUMERIC 0 3
+ 001003 WMO REGION NUMBER/GEOGRAPHICAL AREA CODE TABLE 1003 0 0 3 CODE TABLE 1003 0 1
+ 001004 WMO REGION SUB-AREA (SEE NOTE 9) NUMERIC 0 0 3 NUMERIC 0 1
+ 001005 BUOY/PLATFORM IDENTIFIER NUMERIC 0 0 17 NUMERIC 0 5
+ 001006 AIRCRAFT FLIGHT NUMBER CCITTIA5 0 0 64 CHARACTER 0 8
+ 001007 SATELLITE IDENTIFIER CODE TABLE 1007 0 0 10 CODE TABLE 1007 0 4
+ 001008 AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION CCITTIA5 0 0 64 CHARACTER 0 8
+ 001009 TYPE OF COMMERCIAL AIRCRAFT CCITTIA5 0 0 64 CHARACTER 0 8
+ 001010 STATIONARY BUOY PLATFORM IDENTIFIER; E.G. C-MAN BUOYS CCITTIA5 0 0 64 CHARACTER 0 8
+ 001011 SHIP OR MOBILE LAND STATION IDENTIFIER CCITTIA5 0 0 72 CHARACTER 0 9
+ 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM* M/S 0 0 10 M/S 0 3
+ 001014 PLATFORM DRIFT SPEED (HIGH PRECISION) M/S 2 0 10 M/S 2 4
+ 001015 STATION OR SITE NAME CCITTIA5 0 0 160 CHARACTER 0 20
+ 001018 SHORT STATION OR SITE NAME CCITTIA5 0 0 40 CHARACTER 0 5
+ 001019 LONG STATION OR SITE NAME CCITTIA5 0 0 256 CHARACTER 0 32
+ 001020 WMO REGION SUB-AREA NUMERIC 0 0 4 NUMERIC 0 2
+ 001021 SYNOPTIC FEATURE IDENTIFIER NUMERIC 0 0 14 NUMERIC 0 4
+ 001022 NAME OF FEATURE (SEE NOTE 11) CCITTIA5 0 0 224 CHARACTER 0 28
+ 001023 OBSERVATION SEQUENCE NUMBER NUMERIC 0 0 9 NUMERIC 0 3
+ 001025 STORM IDENTIFIER CCITTIA5 0 0 24 CHARACTER 0 3
+ 001026 WMO STORM NAME CCITTIA5 0 0 64 CHARACTER 0 8
+ 001027 WMO LONG STORM NAME CCITTIA5 0 0 80 CHARACTER 0 10
+ 001031 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE (SEE NOTE 10) CODE TABLE 1031 0 0 16 CODE TABLE 1031 0 5
+ 001032 GENERATING APPLICATION CODE TABLE 1032 0 0 8 CODE TABLE 1032 0 3
+ 001033 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE CODE TABLE 1033 0 0 8 CODE TABLE 1033 0 3
+ 001034 IDENTIFICATION OF ORIGINATING/GENERATING SUB-CENTRE CODE TABLE 1034 0 0 8 CODE TABLE 1034 0 3
+ 001035 ORIGINATING CENTRE COMMON CODE TABLE C-11 0 0 16 COMMON CODE TABLE C-11 0 5
+ 001036 AGENCY IN CHARGE OF OPERATING THE OBSERVING PLATFORM CODE TABLE 1036 0 0 20 CODE TABLE 1036 0 7
+ 001041 ABSOLUTE PLATFORM VELOCITY - FIRST COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001042 ABSOLUTE PLATFORM VELOCITY - SECOND COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001043 ABSOLUTE PLATFORM VELOCITY - THIRD COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001050 PLATFORM TRANSMITTER ID NUMBER NUMERIC 0 0 17 NUMERIC 0 6
+ 001051 PLATFORM TRANSMITTER ID NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 001060 AIRCRAFT REPORTING POINT (BEACON IDENTIFIER) CCITTIA5 0 0 64 CHARACTER 0 8
+ 001062 SHORT ICAO LOCATION INDICATOR CCITTIA5 0 0 32 CHARACTER 0 4
+ 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64 CHARACTER 0 8
+ 001064 RUNWAY DESIGNATOR CCITTIA5 0 0 32 CHARACTER 0 4
+ 001075 TIDE STATION IDENTIFICATION CCITTIA5 0 0 40 CHARACTER 0 5
+ 001080 SHIP LINE NUMBER ACCORDING TO SOOP CCITTIA5 0 0 32 CHARACTER 0 4
+ 001081 RADIOSONDE SERIAL NUMBER CCITTIA5 0 0 160 CHARACTER 0 20
+ 001082 RADIOSONDE ASCENSION NUMBER (SEE NOTE 12) NUMERIC 0 0 14 NUMERIC 0 4
+ 001083 RADIOSONDE RELEASE NUMBER (SEE NOTE 12) NUMERIC 0 0 3 NUMERIC 0 1
+ 001085 OBSERVING PLATFORM MANUFACTURER'S MODEL CCITTIA5 0 0 160 CHARACTER 0 20
+ 001086 OBSERVING PLATFORM MANUFACTURER'S SERIAL NUMBER CCITTIA5 0 0 256 CHARACTER 0 32
+ 001087 WMO MARINE OBSERVING PLATFORM EXTENDED IDENTIFIER NUMERIC 0 0 23 NUMERIC 0 7
+ 001090 TECHNIQUE FOR MAKING UP INITIAL PERTURBATIONS CODE TABLE 1090 0 0 8 CODE TABLE 1090 0 3
+ 001091 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 10 NUMERIC 0 4
+ 001092 TYPE OF ENSEMBLE FORECAST CODE TABLE 1092 0 0 8 CODE TABLE 1092 0 3
+ 001093 BALLOON LOT NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 001094 WBAN NUMBER NUMERIC 0 0 17 NUMERIC 0 5
+ 001095 OBSERVER IDENTIFICATION CCITTIA5 0 0 32 CHARACTER 0 4
+ 001096 STATION ACQUISITION CCITTIA5 0 0 160 CHARACTER 0 20
+ 002001 TYPE OF STATION CODE TABLE 2001 0 0 2 CODE TABLE 2001 0 1
+ 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 2002 0 0 4 FLAG TABLE 2002 0 2
+ 002003 TYPE OF MEASURING EQUIPMENT USED CODE TABLE 2003 0 0 4 CODE TABLE 2003 0 2
+ 002004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUREMENT OR TYPE OF C CODE TABLE 2004 0 0 4 CODE TABLE 2004 0 2
+ 002005 PRECISION OF TEMPERATURE OBSERVATION K 2 0 7 K 2 3
+ 002011 RADIOSONDE TYPE CODE TABLE 2011 0 0 8 CODE TABLE 2011 0 3
+ 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 2012 0 0 4 CODE TABLE 2012 0 2
+ 002013 SOLAR AND INFRARED RADIATION CORRECTION CODE TABLE 2013 0 0 4 CODE TABLE 2013 0 2
+ 002014 TRACKING TECHNIQUE/STATUS OF SYSTEM USED CODE TABLE 2014 0 0 7 CODE TABLE 2014 0 3
+ 002015 RADIOSONDE COMPLETENESS CODE TABLE 2015 0 0 4 CODE TABLE 2015 0 2
+ 002016 RADIOSONDE CONFIGURATION FLAG TABLE 2016 0 0 5 FLAG TABLE 2016 0 2
+ 002019 SATELLITE INSTRUMENTS CODE TABLE 2019 0 0 11 CODE TABLE 2019 0 4
+ 002020 SATELLITE CLASSIFICATION CODE TABLE 2020 0 0 9 CODE TABLE 2020 0 3
+ 002021 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 2021 0 0 9 FLAG TABLE 2021 0 3
+ 002022 SATELLITE DATA-PROCESSING TECHNIQUE USED FLAG TABLE 2022 0 0 8 FLAG TABLE 2022 0 3
+ 002023 SATELLITE DERIVED WIND COMPUTATION METHOD CODE TABLE 2023 0 0 4 CODE TABLE 2023 0 2
+ 002024 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2024 0 0 4 CODE TABLE 2024 0 2
+ 002025 SATELLITE CHANNEL(S) USED IN COMPUTATION FLAG TABLE 2025 0 0 25 FLAG TABLE 2025 0 9
+ 002026 CROSS TRACK RESOLUTION M 2 0 12 M 2 4
+ 002027 ALONG TRACK RESOLUTION M 2 0 12 M 2 4
+ 002028 SEGMENT SIZE AT NADIR IN X DIRECTION M 0 0 18 M 0 6
+ 002029 SEGMENT SIZE AT NADIR IN Y DIRECTION M 0 0 18 M 0 6
+ 002030 METHOD OF CURRENT MEASUREMENT CODE TABLE 2030 0 0 3 CODE TABLE 2030 0 1
+ 002031 DURATION AND TIME OF CURRENT MEASUREMENT CODE TABLE 2031 0 0 5 CODE TABLE 2031 0 2
+ 002032 INDICATOR FOR DIGITIZATION CODE TABLE 2032 0 0 2 CODE TABLE 2032 0 1
+ 002033 METHOD OF SALINITY/DEPTH MEASUREMENT CODE TABLE 2033 0 0 3 CODE TABLE 2033 0 1
+ 002034 DROGUE TYPE CODE TABLE 2034 0 0 5 CODE TABLE 2034 0 2
+ 002035 CABLE LENGTH M 0 0 9 M 0 3
+ 002036 BUOY TYPE CODE TABLE 2036 0 0 2 CODE TABLE 2036 0 1
+ 002037 METHOD OF TIDAL OBSERVATION CODE TABLE 2037 0 0 3 CODE TABLE 2037 0 1
+ 002038 METHOD OF WATER TEMPERATURE AND/OR SALINITY MEASUREMENT CODE TABLE 2038 0 0 4 CODE TABLE 2038 0 2
+ 002039 METHOD OF WET-BULB TEMPERATURE MEASUREMENT CODE TABLE 2039 0 0 3 CODE TABLE 2039 0 1
+ 002040 METHOD OF REMOVING VELOCITY AND MOTION OF PLATFORM FROM CURRENT CODE TABLE 2040 0 0 4 CODE TABLE 2040 0 2
+ 002041 METHOD FOR ESTIMATING REPORTS RELATED TO SYNOPTIC FEATURES CODE TABLE 2041 0 0 6 CODE TABLE 2041 0 2
+ 002042 INDICATOR FOR SEA SURFACE CURRENT SPEED CODE TABLE 2042 0 0 2 CODE TABLE 2042 0 1
+ 002044 INDICATOR FOR METHOD OF CALCULATING SPECTRAL WAVE DATA CODE TABLE 2044 0 0 4 CODE TABLE 2044 0 2
+ 002045 INDICATOR FOR TYPE OF PLATFORM CODE TABLE 2045 0 0 4 CODE TABLE 2045 0 2
+ 002046 WAVE MEASUREMENT INSTRUMENTATION CODE TABLE 2046 0 0 4 CODE TABLE 2046 0 2
+ 002048 SATELLITE SENSOR INDICATOR CODE TABLE 2048 0 0 4 CODE TABLE 2048 0 2
+ 002049 GEOSTATIONARY SATELLITE DATA-PROCESSING TECHNIQUE USED FLAG TABLE 2049 0 0 8 FLAG TABLE 2049 0 3
+ 002050 GEOSTATIONARY SOUNDER SATELLITE CHANNELS USED FLAG TABLE 2050 0 0 20 FLAG TABLE 2050 0 7
+ 002051 INDICATOR TO SPECIFY OBSERVING METHOD FOR EXTREME TEMPERATURES CODE TABLE 2051 0 0 4 CODE TABLE 2051 0 2
+ 002052 GEOSTATIONARY IMAGER SATELLITE CHANNELS USED FLAG TABLE 2052 0 0 6 FLAG TABLE 2052 0 2
+ 002053 GOES-I/M BRIGHTNESS TEMPERATURE CHARACTERISTICS CODE TABLE 2053 0 0 4 CODE TABLE 2053 0 2
+ 002054 GOES-I/M SOUNDINGS PARAMETER CHARACTERISTICS CODE TABLE 2054 0 0 4 CODE TABLE 2054 0 2
+ 002055 GEOSTATIONARY SOUNDINGS STATISTICAL PARAMETERS CODE TABLE 2055 0 0 4 CODE TABLE 2055 0 2
+ 002056 GEOSTATIONARY SOUNDINGS ACCURACY STATISTICS CODE TABLE 2056 0 0 4 CODE TABLE 2056 0 2
+ 002057 ORIGIN OF FIRST GUESS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2057 0 0 4 CODE TABLE 2057 0 2
+ 002058 VALID TIMES OF FIRST GUESS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2058 0 0 4 CODE TABLE 2058 0 2
+ 002059 ORIGIN OF ANALYSIS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2059 0 0 4 CODE TABLE 2059 0 2
+ 002060 ORIGIN OF SURFACE INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2060 0 0 4 CODE TABLE 2060 0 2
+ 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 2061 0 0 3 CODE TABLE 2061 0 1
+ 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 2062 0 0 4 CODE TABLE 2062 0 2
+ 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16 DEGREE 2 5
+ 002064 AIRCRAFT ROLL ANGLE QUALITY CODE TABLE 2064 0 0 2 CODE TABLE 2064 0 1
+ 002065 ACARS GROUND RECEIVING STATION CCITTIA5 0 0 40 CHARACTER 0 5
+ 002066 RADIOSONDE GROUND RECEIVING SYSTEM CODE TABLE 2066 0 0 6 CODE TABLE 2066 0 2
+ 002067 RADIOSONDE OPERATING FREQUENCY Hz -5 0 15 Hz -5 5
+ 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 2070 0 0 4 CODE TABLE 2070 0 2
+ 002080 BALLOON MANUFACTURER CODE TABLE 2080 0 0 6 CODE TABLE 2080 0 2
+ 002081 TYPE OF BALLOON CODE TABLE 2081 0 0 5 CODE TABLE 2081 0 2
+ 002082 WEIGHT OF BALLOON KG 3 0 12 KG 3 4
+ 002083 TYPE OF BALLOON SHELTER CODE TABLE 2083 0 0 4 CODE TABLE 2083 0 2
+ 002084 TYPE OF GAS USED IN BALLOON CODE TABLE 2084 0 0 4 CODE TABLE 2084 0 2
+ 002085 AMOUNT OF GAS USED IN BALLOON KG 3 0 13 KG 3 4
+ 002086 BALLOON FLIGHT TRAIN LENGTH M 1 0 10 M 1 4
+ 002091 ENTRY SENSOR 4/20 MA A 4 0 10 A 4 3
+ 002095 TYPE OF PRESSURE SENSOR CODE TABLE 2095 0 0 5 CODE TABLE 2095 0 2
+ 002096 TYPE OF TEMPERATURE SENSOR CODE TABLE 2096 0 0 5 CODE TABLE 2096 0 2
+ 002097 TYPE OF HUMIDITY SENSOR CODE TABLE 2097 0 0 5 CODE TABLE 2097 0 2
+ 002100 RADAR CONSTANT dB 1 0 12 dB 1 4
+ 002101 TYPE OF ANTENNA CODE TABLE 2101 0 0 4 CODE TABLE 2101 0 2
+ 002102 ANTENNA HEIGHT ABOVE TOWER BASE M 0 0 8 M 0 3
+ 002103 RADOME FLAG TABLE 2103 0 0 2 FLAG TABLE 2103 0 1
+ 002104 ANTENNA POLARISATION CODE TABLE 2104 0 0 4 CODE TABLE 2104 0 2
+ 002105 MAXIMUM ANTENNA GAIN dB 0 0 6 dB 0 2
+ 002106 3-DB BEAMWIDTH DEGREE 1 0 6 DEGREE 1 2
+ 002107 SIDELOBE SUPPRESSION dB 0 0 6 dB 0 2
+ 002108 CROSSPOL DISCRIMINATION (ON AXIS) dB 0 0 6 dB 0 2
+ 002109 ANTENNA SPEED (AZIMUTH) DEGREE/S 2 0 12 DEGREE/S 2 4
+ 002110 ANTENNA SPEED (ELEVATION) DEGREE/S 2 0 12 DEGREE/S 2 4
+ 002111 RADAR INCIDENCE ANGLE DEGREE 1 0 10 DEGREE 1 4
+ 002112 RADAR LOOK ANGLE DEGREE 1 0 12 DEGREE 1 4
+ 002113 NUMBER OF AZIMUTH LOOKS NUMERIC 0 0 4 NUMERIC 0 2
+ 002114 ANTENNA EFFECTIVE SURFACE AREA M**2 0 0 15 M**2 0 5
+ 002115 TYPE OF SURFACE OBSERVING EQUIPMENT CODE TABLE 2115 0 0 5 CODE TABLE 2115 0 2
+ 002116 PERCENTAGE OF 320 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002117 PERCENTAGE OF 80 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002118 PERCENTAGE OF 20 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002119 RA-2 INSTRUMENT OPERATIONS CODE TABLE 2119 0 0 3 CODE TABLE 2119 0 1
+ 002120 OCEAN WAVE FREQUENCY Hz 3 0 10 Hz 3 4
+ 002121 MEAN FREQUENCY Hz -8 0 7 Hz -8 3
+ 002122 FREQUENCY AGILITY RANGE Hz -6 -128 8 Hz -6 3
+ 002123 PEAK POWER W -4 0 7 W -4 3
+ 002124 AVERAGE POWER W -1 0 7 W -1 3
+ 002125 PULSE REPETITION FREQUENCY Hz -1 0 8 Hz -1 3
+ 002126 PULSE WIDTH S 7 0 6 S 7 2
+ 002127 RECEIVER INTERMEDIATE FREQUENCY Hz -6 0 7 Hz -6 3
+ 002128 INTERMEDIATE FREQUENCY BANDWIDTH Hz -5 0 6 Hz -5 2
+ 002129 MINIMUM DETECTABLE SIGNAL dB 0 -150 5 dB 0 3
+ 002130 DYNAMIC RANGE dB 0 0 7 dB 0 3
+ 002131 SENSITIVITY TIME CONTROL (STC) FLAG TABLE 2131 0 0 2 FLAG TABLE 2131 0 1
+ 002132 AZIMUTH POINTING ACCURACY DEGREE 2 0 6 DEGREE 2 2
+ 002133 ELEVATION POINTING ACCURACY DEGREE 2 0 6 DEGREE 2 2
+ 002134 ANTENNA BEAM AZIMUTH DEGREE 2 0 16 DEGREE 2 5
+ 002135 ANTENNA ELEVATION DEGREE 2 -9000 15 DEGREE 2 5
+ 002136 RANGE PROCESSED BY RANGE ATTENUATION CORRECTION M -3 0 16 M -3 5
+ 002140 SATELLITE RADAR BEAM AZIMUTH ANGLE DEGREE 0 0 9 DEGREE 0 3
+ 002141 MEASUREMENT TYPE CCITTIA5 0 0 24 CHARACTER 0 3
+ 002142 OZONE INSTRUMENT SERIAL NUMBER/ IDENTIFICATION CCITTIA5 0 0 32 CHARACTER 0 4
+ 002143 OZONE INSTRUMENT TYPE CODE TABLE 2143 0 0 7 CODE TABLE 2143 0 3
+ 002144 LIGHT SOURCE TYPE FOR BREWER SPECTRO PHOTOMETER CODE TABLE 2144 0 0 4 CODE TABLE 2144 0 2
+ 002145 WAVE LENGTH SETTING FOR DOBSON INSTRUMENTS CODE TABLE 2145 0 0 4 CODE TABLE 2145 0 2
+ 002146 SOURCE CONDITIONS FOR DOBSON INSTRUMENTS CODE TABLE 2146 0 0 4 CODE TABLE 2146 0 2
+ 002148 DATA COLLECTION AND/OR LOCATION SYSTEM CODE TABLE 2148 0 0 5 CODE TABLE 2148 0 2
+ 002149 TYPE OF DATA BUOY CODE TABLE 2149 0 0 6 CODE TABLE 2149 0 2
+ 002150 TOVS/ATOVS/AVHRR INSTRUMENTATION CHANNEL NUMBER CODE TABLE 2150 0 0 6 CODE TABLE 2150 0 2
+ 002151 RADIOMETER IDENTIFIER CODE TABLE 2151 0 0 11 CODE TABLE 2151 0 4
+ 002152 SATELLITE INSTRUMENT USED IN DATA PROCESSING(6) FLAG TABLE 2152 0 0 31 FLAG TABLE 2152 0 10
+ 002153 SATELLITE CHANNEL CENTRE FREQUENCY Hz -8 0 26 Hz -8 8
+ 002154 SATELLITE CHANNEL BAND WIDTH Hz -8 0 26 Hz -8 8
+ 002156 PERCENTAGE OF VALID KU OCEAN RETRACKER MEASUREMENTS % 0 0 7 % 0 3
+ 002157 PERCENTAGE OF VALID S OCEAN RETRACKER MEASUREMENTS % 0 0 7 % 0 3
+ 002158 RA-2 INSTRUMENT FLAG TABLE 2158 0 0 9 FLAG TABLE 2158 0 3
+ 002159 MWR INSTRUMENT FLAG TABLE 2159 0 0 8 FLAG TABLE 2159 0 3
+ 002160 WAVE LENGTH OF THE RADAR CODE TABLE 2160 0 0 4 CODE TABLE 2160 0 2
+ 002163 HEIGHT ASSIGNMENT METHOD CODE TABLE 2163 0 0 4 CODE TABLE 2163 0 2
+ 002164 TRACER CORRELATION METHOD CODE TABLE 2164 0 0 3 CODE TABLE 2164 0 1
+ 002166 RADIANCE TYPE CODE TABLE 2166 0 0 4 CODE TABLE 2166 0 2
+ 002167 RADIANCE COMPUTATIONAL METHOD CODE TABLE 2167 0 0 4 CODE TABLE 2167 0 2
+ 002168 HYDROSTATIC PRESSURE OF LOWER END OF CABLE (THERMISTOR STRING) PA -3 0 16 KPA 0 5
+ 002169 ANEMOMETER TYPE CODE TABLE 2169 0 0 4 CODE TABLE 2169 0 2
+ 002172 PRODUCT TYPE FOR RETRIEVED ATMOSPHERIC GASES CODE TABLE 2172 0 0 8 CODE TABLE 2172 0 3
+ 002173 SQUARE OF THE OFF NADIR ANGLE (7) DEGREE2 4 0 10 DEGREE2 4 4
+ 002174 MEAN ACROSS TRACK PIXEL NUMBER NUMERIC 0 0 9 NUMERIC 0 3
+ 002175 METHOD OF PRECIPITATION MEASUREMENT CODE TABLE 2175 0 0 4 CODE TABLE 2175 0 2
+ 002176 METHOD OF STATE OF GROUND MEASUREMENT CODE TABLE 2176 0 0 4 CODE TABLE 2176 0 2
+ 002177 METHOD OF SNOW DEPTH MEASUREMENT CODE TABLE 2177 0 0 4 CODE TABLE 2177 0 2
+ 002178 METHOD OF LIQUID CONTENT MEASUREMENT OF PRECIPITATION CODE TABLE 2178 0 0 4 CODE TABLE 2178 0 2
+ 002179 TYPE OF SKY CONDITION ALGORITHM CODE TABLE 2179 0 0 4 CODE TABLE 2179 0 2
+ 002180 MAIN PRESENT WEATHER DETECTING SYSTEM CODE TABLE 2180 0 0 4 CODE TABLE 2180 0 2
+ 002181 SUPPLEMENTARY PRESENT WEATHER SENSOR FLAG TABLE 2181 0 0 21 FLAG TABLE 2181 0 7
+ 002182 VISIBILITY MEASUREMENT SYSTEM CODE TABLE 2182 0 0 4 CODE TABLE 2182 0 2
+ 002183 CLOUD DETECTION SYSTEM CODE TABLE 2183 0 0 4 CODE TABLE 2183 0 2
+ 002184 TYPE OF LIGHTNING DETECTION SENSOR CODE TABLE 2184 0 0 4 CODE TABLE 2184 0 2
+ 002185 METHOD OF EVAPORATION MEASUREMENT CODE TABLE 2185 0 0 4 CODE TABLE 2185 0 2
+ 002186 CAPABILITY TO DETECT PRECIPITATION PHENOMENA FLAG TABLE 2186 0 0 30 FLAG TABLE 2186 0 10
+ 002187 CAPABILITY TO DETECT OTHER WEATHER PHENOMENA FLAG TABLE 2187 0 0 18 FLAG TABLE 2187 0 6
+ 002188 CAPABILITY TO DETECT OBSCURATION FLAG TABLE 2188 0 0 21 FLAG TABLE 2188 0 7
+ 002189 CAPABILITY TO DISCRIMINATE LIGHTNING STRIKES FLAG TABLE 2189 0 0 12 FLAG TABLE 2189 0 4
+ 002190 LAGRANGIAN DRIFTER SUBMERGENCE (% TIME SUBMERGED) % 0 0 7 % 0 3
+ 004001 YEAR YEAR 0 0 12 YEAR 0 4
+ 004002 MONTH MONTH 0 0 4 MONTH 0 2
+ 004003 DAY DAY 0 0 6 DAY 0 2
+ 004004 HOUR HOUR 0 0 5 HOUR 0 2
+ 004005 MINUTE MINUTE 0 0 6 MINUTE 0 2
+ 004006 SECOND SECOND 0 0 6 SECOND 0 2
+ 004007 SECONDS WITHIN A MINUTE (MICROSECOND ACCURACY) SECOND 6 0 26 S 6 8
+ 004011 TIME INCREMENT YEAR 0 -1024 11 YEAR 0 4
+ 004012 TIME INCREMENT MONTH 0 -1024 11 MONTH 0 4
+ 004013 TIME INCREMENT DAY 0 -1024 11 DAY 0 4
+ 004014 TIME INCREMENT HOUR 0 -1024 11 HOUR 0 4
+ 004015 TIME INCREMENT MINUTE 0 -2048 12 MINUTE 0 4
+ 004016 TIME INCREMENT SECOND 0 -4096 13 SECOND 0 4
+ 004017 REFERENCE TIME PERIOD FOR ACCUMULATED OR EXTREME DATA MINUTE 0 -1440 12 MINUTE 0 4
+ 004021 TIME PERIOD OR DISPLACEMENT YEAR 0 -1024 11 YEAR 0 4
+ 004022 TIME PERIOD OR DISPLACEMENT MONTH 0 -1024 11 MONTH 0 4
+ 004023 TIME PERIOD OR DISPLACEMENT DAY 0 -1024 11 DAY 0 4
+ 004024 TIME PERIOD OR DISPLACEMENT HOUR 0 -2048 12 HOUR 0 4
+ 004025 TIME PERIOD OR DISPLACEMENT MINUTE 0 -2048 12 MINUTE 0 4
+ 004026 TIME PERIOD OR DISPLACEMENT SECOND 0 -4096 13 SECOND 0 4
+ 004031 DURATION OF TIME RELATING TO FOLLOWING VALUE HOUR 0 0 8 HOUR 0 3
+ 004032 DURATION OF TIME RELATING TO FOLLOWING VALUE MINUTE 0 0 6 MINUTE 0 2
+ 004041 TIME DIFFERENCE, UTC -LMT (SEE NOTE 6) MINUTE 0 -1440 12 MINUTE 0 4
+ 004043 DAY OF THE YEAR DAY 0 0 9 DAY 0 3
+ 004051 PRINCIPAL TIME OF DAILY READING OF MAXIMUM TEMPERATURE HOUR 0 0 5 HOUR 0 2
+ 004052 PRINCIPAL TIME OF DAILY READING OF MINIMUM TEMPERATURE HOUR 0 0 5 HOUR 0 2
+ 004053 NUMBER OF DAYS WITH PRECIPITATION EQUAL TO OR MORE THAN 1 MM NUMERIC 0 0 6 NUMERIC 0 2
+ 004059 TIMES OF OBSERVATION USED TO COMPUTE THE REPORTED MEAN VALUES FLAG TABLE 4059 0 0 6 FLAG TABLE 4059 0 2
+ 004065 SHORT TIME INCREMENT MINUTE 0 -128 8 MINUTE 0 2
+ 004073 SHORT TIME PERIOD OR DISPLACEMENT DAY 0 -128 8 DAY 0 2
+ 004074 SHORT TIME PERIOD OR DISPLACEMENT HOUR 0 -128 8 HOUR 0 2
+ 004075 SHORT TIME PERIOD OR DISPLACEMENT MINUTE 0 -128 8 MINUTE 0 2
+ 004080 AVERAGING PERIOD FOR FOLLOWING VALUE CODE TABLE 4080 0 0 4 CODE TABLE 4080 0 2
+ 004086 LONG TIME PERIOD OR DISPLACEMENT SECOND 0 -8192 15 SECOND 0 5
+ 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005011 LATITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005012 LATITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005015 LATITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005016 LATITUDE DISPLACEMENT (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 005023 SUN TO SATELLITE AZIMUTH DIFFERENCE DEGREE 1 -1800 12 DEGREE 1 4
+ 005030 DIRECTION (SPECTRAL) DEGREE 0 0 12 DEGREE 0 4
+ 005031 ROW NUMBER NUMERIC 0 0 12 NUMERIC 0 4
+ 005033 PIXEL SIZE ON HORIZONTAL - 1 M -1 0 16 M -1 5
+ 005034 ALONG TRACK ROW NUMBER NUMERIC 0 0 11 NUMERIC 0 4
+ 005036 SHIP TRANSECT NUMBER ACCORDING TO SOOP NUMERIC 0 0 7 NUMERIC 0 2
+ 005040 ORBIT NUMBER NUMERIC 0 0 24 NUMERIC 0 8
+ 005041 SCAN LINE NUMBER NUMERIC 0 0 8 NUMERIC 0 3
+ 005042 CHANNEL NUMBER NUMERIC 0 0 6 NUMERIC 0 2^M
+ 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8 NUMERIC 0 3
+ 005044 SATELLITE CYCLE NUMBER NUMERIC 0 0 11 NUMERIC 0 4
+ 005052 CHANNEL NUMBER INCREMENT NUMERIC 0 0 5 NUMERIC 0 2
+ 005053 FIELD OF VIEW NUMBER INCREMENT NUMERIC 0 0 5 NUMERIC 0 2
+ 005060 Y ANGULAR POSITION FROM CENTRE OF GRAVITY DEGREE 6 -8000000 24 DEGREE 6 8
+ 005061 Z ANGULAR POSITION FROM CENTRE OF GRAVITY DEGREE 6 -8000000 24 DEGREE 6 8
+ 005193 ALONG TRACK ROW NUMBER AT 50 KM NUMERIC 0 0 10 NUMERIC 0 4
+ 005194 ALONG TRACK ROW NUMBER AT 25 KM NUMERIC 0 0 11 NUMERIC 0 4
+ 005195 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 7 NUMERIC 0 3
+ 005217 LOCATION OF PLATFORM, X M 2 -1073741824 31 M 2 10
+ 005232 DIRECTION (SPECTRAL) DEGREE 2 0 16 DEGREE 2 5
+ 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006011 LONGITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006012 LONGITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006015 LONGITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006016 LONGITUDE DISPLACEMENT (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006021 DISTANCE M -1 0 13 M -1 4
+ 006030 WAVE NUMBER (SPECTRAL) RAD/M 5 0 13 RAD/M 5 4
+ 006031 COLUMN NUMBER NUMERIC 0 0 12 NUMERIC 0 4
+ 006033 PIXEL SIZE ON HORIZONTAL - 2 M -1 0 16 M -1 5
+ 006034 CROSS-TRACK CELL NUMBER NUMERIC 0 0 7 NUMERIC 0 3
+ 006040 RADIUS OF CONFIDENCE M 0 0 13 M 0 4
+ 006193 CROSS TRACK CELL NUMBER AT 50 KM NUMERIC 0 0 6 NUMERIC 0 2
+ 006194 CROSS TRACK CELL NUMBER AT 25 KM NUMERIC 0 0 7 NUMERIC 0 3
+ 006217 LOCATION OF PLATFORM, Y M 2 -1073741824 31 M 2 10
+ 006232 WAVENUMBER (SPECTRAL) RADS/M 5 0 13 ADS/M 5 4
+ 007001 HEIGHT OF STATION (SEE NOTE 1) M 0 -400 15 M 0 5
+ 007002 HEIGHT OR ALTITUDE M -1 -40 16 M -1 5
+ 007003 GEOPOTENTIAL M**2/S**2 -1 -400 17 M**2/S**2 -1 6
+ 007004 PRESSURE PA -1 0 14 PA -1 5
+ 007005 HEIGHT INCREMENT M 0 -400 12 M 0 4
+ 007006 HEIGHT ABOVE STATION M 0 0 15 M 0 5
+ 007007 HEIGHT M 0 -1000 17 M 0 6
+ 007008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7
+ 007009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17 GPM 0 5
+ 007010 FLIGHT LEVEL M 0 -1024 16 FT -1 5
+ 007021 ELEVATION (SEE NOTE 2) DEGREE 2 -9000 15 DEGREE 2 5
+ 007022 SOLAR ELEVATION DEGREE 2 -9000 15 DEGREE 2 5
+ 007024 SATELLITE ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 007025 SOLAR ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 007026 SATELLITE ZENITH ANGLE DEGREE 4 -900000 21 DEGREE 4 7
+ 007030 HEIGHT OF STATION GROUND ABOVE MEAN SEA LEVEL (SEE NOTE 3) M 1 - 4000 17 M 1 5
+ 007031 HEIGHT OF BAROMETER ABOVE MEAN SEA LEVEL (SEE NOTE 4) M 1 - 4000 17 M 1 5
+ 007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM) M 2 0 16 M 2 5
+ 007033 HEIGHT OF SENSOR ABOVE WATER SURFACE (SEE NOTE 6) M 1 0 12 M 1 4
+ 007040 IMPACT PARAMETER (SEE NOTE 8) M 1 62000000 22 M 1 8
+ 007061 DEPTH BELOW LAND SURFACE M 2 0 14 M 2 5
+ 007062 DEPTH BELOW SEA/WATER SURFACE M 1 0 17 M 1 6
+ 007063 DEPTH BELOW SEA/WATER SURFACE M 2 0 20 M 2 7
+ 007064 REPRESENTATIVE HEIGHT OF SENSOR ABOVE STATION (SEE NOTE 7) M 0 0 4 M 0 2
+ 007065 WATER PRESSURE PA -3 0 17 PA 0 6
+ 007070 DROGUE DEPTH M 0 0 10 M 0 4
+ 007217 LOCATION OF PLATFORM, Z M 2 -1073741824 31 M 2 10
+ 008001 VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8001 0 0 7 FLAG TABLE 8001 0 3
+ 008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS) CODE TABLE 8002 0 0 6 CODE TABLE 8002 0 2
+ 008003 VERTICAL SIGNIFICANCE (SATELLITE OBSERVATIONS) CODE TABLE 8003 0 0 6 CODE TABLE 8003 0 2
+ 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 8004 0 0 3 CODE TABLE 8004 0 1
+ 008005 METEOROLOGICAL ATTRIBUTE SIGNIFICANCE CODE TABLE 8005 0 0 4 CODE TABLE 8005 0 2
+ 008006 OZONE VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8006 0 0 9 FLAG TABLE 8006 0 3
+ 008007 DIMENSIONAL SIGNIFICANCE CODE TABLE 8007 0 0 4 CODE TABLE 8007 0 2
+ 008008 RADIATION VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8008 0 0 9 FLAG TABLE 8008 0 3
+ 008009 DETAILED PHASE OF FLIGHT CODE TABLE 8009 0 0 4 CODE TABLE 8009 0 2
+ 008010 SURFACE QUALIFIER (TEMPERATURE DATA) CODE TABLE 8010 0 0 5 CODE TABLE 8010 0 2
+ 008011 METEOROLOGICAL FEATURE CODE TABLE 8011 0 0 6 CODE TABLE 8011 0 2
+ 008012 LAND/SEA QUALIFIER CODE TABLE 8012 0 0 2 CODE TABLE 8012 0 1
+ 008013 DAY/NIGHT QUALIFIER CODE TABLE 8013 0 0 2 CODE TABLE 8013 0 1
+ 008014 QUALIFIER FOR RUNWAY VISUAL RANGE CODE TABLE 8014 0 0 4 CODE TABLE 8014 0 2
+ 008016 CHANGE QUALIFIER OF A TREND-TYPE FORECAST OR AN AERODROME FORECA CODE TABLE 8016 0 0 3 CODE TABLE 8016 0 1
+ 008017 QUALIFIER OF THE TIME WHEN THE FORECAST CHANGE IS EXPECTED CODE TABLE 8017 0 0 2 CODE TABLE 8017 0 1
+ 008018 SEAWINDS LAND/ICE SURFACE TYPE FLAG TABLE 8018 0 0 17 FLAG TABLE 8018 0 6
+ 008020 TOTAL NUMBER OF MISSING ENTITIES (WITH RESPECT TO ACCUMULATION O NUMERIC 0 0 16 NUMERIC 0 5
+ 008021 TIME SIGNIFICANCE CODE TABLE 8021 0 0 5 CODE TABLE 8021 0 2
+ 008022 TOTAL NUMBER (WITH RESPECT TO ACCUMULATION OR AVERAGE) NUMERIC 0 0 16 NUMERIC 0 5
+ 008023 FIRST ORDER STATISTICS CODE TABLE 8023 0 0 6 CODE TABLE 8023 0 2
+ 008024 DIFFERENCE STATISTICS CODE TABLE 8024 0 0 6 CODE TABLE 8024 0 2
+ 008025 TIME DIFFERENCE QUALIFIER CODE TABLE 8025 0 0 4 CODE TABLE 8025 0 2
+ 008029 REMOTLY SENSED SURFACE TYPE CODE TABLE 8029 0 0 8 CODE TABLE 8029 0 3
+ 008030 MANUAL ON CODES (VOLUME I.1, SECTION C) CODE TABLE FROM WHICH DA NUMERIC 0 0 13 NUMERIC 0 4
+ 008031 DATA CATEGORY CREX TABLE A NUMERIC 0 0 8 NUMERIC 0 3
+ 008033 METHOD OF DERIVATION OF PERCENTAGE CONFIDENCE CODE TABLE 8033 0 0 7 CODE TABLE 8033 0 3
+ 008035 TYPE OF MONITORING EXERCISE CODE TABLE 8035 0 0 3 CODE TABLE 8035 0 1
+ 008036 TYPE OF CENTRE OR STATION PERFORMING MONITORING CODE TABLE 8036 0 0 3 CODE TABLE 8036 0 1
+ 008040 FLIGHT LEVEL SIGNIFICANCE CODE TABLE 8040 0 0 6 CODE TABLE 8040 0 2
+ 008041 DATA SIGNIFICANCE CODE TABLE 8041 0 0 5 CODE TABLE 8041 0 2
+ 008042 EXTENDED VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8042 0 0 18 FLAG TABLE 8042 0 6
+ 008049 NUMBER OF OBSERVATIONS NUMERIC 0 0 8 NUMERIC 0 3
+ 008050 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 8050 0 0 4 CODE TABLE 8050 0 2
+ 008051 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 8051 0 0 3 CODE TABLE 8051 0 1
+ 008052 CONDITION FOR WHICH NUMBER OF DAYS OF OCCURRENCE FOLLOWS CODE TABLE 8052 0 0 5 CODE TABLE 8052 0 2
+ 008053 DAY OF OCCURRENCE QUALIFIER CODE TABLE 8053 0 0 2 CODE TABLE 8053 0 1
+ 008060 SAMPLE SCANNING MODE SIGNIFICANCE CODE TABLE 8060 0 0 4 CODE TABLE 8060 0 2
+ 008065 SUN-GLINT INDICATOR CODE TABLE 8065 0 0 2 CODE TABLE 8065 0 1
+ 008066 SEMI-TRANSPARENCY INDICATOR CODE TABLE 8066 0 0 2 CODE TABLE 8066 0 1
+ 008070 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8070 0 0 4 CODE TABLE 8070 0 2
+ 008072 PIXEL(S) TYPE CODE TABLE 8072 0 0 3 CODE TABLE 8072 0 1
+ 008074 ALTIMETER ECHO TYPE CODE TABLE 8074 0 0 2 CODE TABLE 8074 0 1
+ 008075 ASCENDING/DESCENDING ORBIT QUALIFIER CODE TABLE 8075 0 0 2 CODE TABLE 8075 0 1
+ 008076 TYPE OF BAND CODE TABLE 8076 0 0 6 CODE TABLE 8076 0 2
+ 008081 TYPE OF EQUIPMENT CODE TABLE 8081 0 0 6 CODE TABLE 8081 0 2
+ 008082 (CBS) ARTIFICIAL CORRECTION OF SENSOR HEIGHT TO ANOTHER VALUE CODE TABLE 8082 0 0 3 CODE TABLE 8082 0 1
+ 008083 NOMINAL VALUE INDICATOR FLAG TABLE 8083 0 0 15 FLAG TABLE 8083 0 5
+ 008085 BEAM IDENTIFIER CODE TABLE 8085 0 0 3 CODE TABLE 8085 0 1
+ 008193 TIME QUALIFIER CODE TABLE 8193 0 0 6 CODE TABLE 8193 0 2
+ 008194 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8194 0 0 4 CODE TABLE 8194 0 2
+ 008195 DATA TYPE CODE TABLE 8195 0 0 7 CODE TABLE 8195 0 3
+ 008200 NUMBER OF OBSERVATIONS NUMERIC 0 0 8 NUMERIC 0 3
+ 008222 GENERATOR SIGNIFICANCE CODE TABLE 8222 0 0 4 CODE TABLE 8222 0 2
+ 008223 LAND/ICE SURFACE FLAG FLAG TABLE 8223 0 0 7 FLAG TABLE 8223 0 3
+ 008224 LAND/SEA FRACTION NUMERIC 3 0 10 NUMERIC 3 4
+ 010001 HEIGHT OF LAND SURFACE M 0 -400 15 M 0 5
+ 010002 HEIGHT M -1 -40 16 M -1 5
+ 010003 GEOPOTENTIAL M**2/S**2 -1 -400 17 M**2/S**2 -1 6
+ 010004 PRESSURE PA -1 0 14 PA -1 5
+ 010007 HEIGHT M 0 -1000 17 M 0 6
+ 010008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7
+ 010009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17 GPM 0 5
+ 010010 MINIMUM PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010011 MAXIMUM PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010031 IN DIRECTION OF THE NORTH POLE, DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31 M 2 10
+ 010032 SATELLITE DISTANCE TO EARTH'S CENTRE M 1 0 27 M 2 9
+ 010033 ALTITUDE (PLATFORM TO ELLIPSOID) M 1 0 27 M 2 9
+ 010034 EARTH RADIUS M 1 0 27 M 2 9
+ 010035 EARTH'S LOCAL RADIUS OF CURVATURE M 1 62000000 22 M 1 8
+ 010036 GEOID UNDULATION (SEE NOTE 4) M 2 -15000 15 M 2 6
+ 010040 NUMBER OF RETRIEVED LAYERS NUMERIC 0 0 10 NUMERIC 0 4
+ 010050 STANDARD DEVIATION ALTITUDE M 2 0 16 M 2 5
+ 010051 PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010052 ALTIMETER SETTING (QNH) PA -1 0 14 PA -1 5
+ 010060 PRESSURE CHANGE PA -1 -1024 11 PA -1 4
+ 010061 3-HOUR PRESSURE CHANGE PA -1 -500 10 PA -1 4
+ 010062 24-HOUR PRESSURE CHANGE PA -1 -1000 11 PA -1 4
+ 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 10063 0 0 4 CODE TABLE 10063 0 2
+ 010070 INDICATED AIRCRAFT ALTITUDE M 0 -400 16 M 0 5
+ 010080 VIEWING ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 010081 ALTITUDE OF COG ABOVE REFERENCE ELLIPSOID M 3 0 31 M 3 10
+ 010082 INSTANTANEOUS ALTITUDE RATE MS-1 3 -65536 17 MS-1 3 6
+ 010083 SQUARED OFF NADIR ANGLE OF THE SATELLITE FROM PLATFORM DATA DEGREE2 2 0 16 DEGREE2 2 5
+ 010084 SQUARED OFF NADIR ANGLE OF THE SATELLITE FROM WAVEFORM DATA DEGREE2 2 0 16 DEGREE2 2 5
+ 010085 MEAN SEA SURFACE HEIGHT M 3 -131072 18 M 3 6
+ 010086 GEOID'S HEIGHT M 3 -131072 18 M 3 6
+ 010087 OCEAN DEPTH/LAND ELEVATION M 1 -131072 18 M 3 6
+ 010088 TOTAL GEOCENTRIC OCEAN TIDE HEIGHT SOLUTION 1 M 3 -32768 16 M 3 5
+ 010089 TOTAL GEOCENTRIC OCEAN TIDE HEIGHT SOLUTION 2 M 3 -32768 16 M 3 5
+ 010090 LONG PERIOD TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010091 TIDAL LOADING HEIGHT M 3 -32768 16 M 3 5
+ 010092 SOLID EARTH TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010093 GEOCENTRIC POLE TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010095 HEIGHT OF ATMOSPHERE USED M 0 0 16 M 0 5
+ 011001 WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011002 WIND SPEED M/S 1 0 12 M/S 1 4
+ 011003 U-COMPONENT M/S 1 -4096 13 M/S 1 4
+ 011004 V-COMPONENT M/S 1 -4096 13 M/S 1 4
+ 011005 W-COMPONENT PA/S 1 -512 10 PA/S 1 4
+ 011006 W-COMPONENT M/S 2 -4096 13 M/S 2 4
+ 011010 WIND DIRECTION ASSOCIATED WITH WIND SPEED WHICH FOLLOWS DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011011 WIND DIRECTION AT 10 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011012 WIND SPEED AT 10 M M/S 1 0 12 M/S 1 4
+ 011013 WIND DIRECTION AT 5 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011014 WIND SPEED AT 5 M M/S 1 0 12 M/S 1 4
+ 011016 EXTREME COUNTERCLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011017 EXTREME CLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011019 STEADINESS OF WIND (6) % 0 0 7 % 0 3
+ 011021 RELATIVE VORTICITY 1/S 9 -65536 17 1/S 9 6
+ 011022 DIVERGENCE 1/S 9 -65536 17 1/S 9 6
+ 011023 VELOCITY POTENTIAL M**2/S -2 -65536 17 M**2/S -2 6
+ 011030 EXTENDED DEGREE OF TURBULENCE CODE TABLE 11030 0 0 6 CODE TABLE 0 2
+ 011031 DEGREE OF TURBULENCE CODE TABLE 11031 0 0 4 CODE TABLE 11031 0 2
+ 011032 HEIGHT OF BASE OF TURBULENCE M -1 -40 16 M -1 5
+ 011033 HEIGHT OF TOP OF TURBULENCE M -1 -40 16 M -1 5
+ 011034 VERTICAL GUST VELOCITY M/S 1 -1024 11 M/S 1 4
+ 011035 VERTICAL GUST ACCELERATION M/S**2 2 -8192 14 M/S**2 2 5
+ 011036 MAXIMUM DERIVED EQUIVALENT VERTICAL GUST SPEED M/S 1 0 10 M/S 1 4
+ 011037 TURBULENCE INDEX CODE TABLE 11037 0 0 6 CODE TABLE 11037 0 2
+ 011038 TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11038 0 0 5 CODE TABLE 11038 0 2
+ 011039 EXTENDED TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11039 0 0 6 CODE TABLE 11039 0 2
+ 011040 MAXIMUM WIND SPEED (MEAN WIND) M/S 1 0 12 M/S 1 4
+ 011041 MAXIMUM WIND GUST SPEED M/S 1 0 12 M/S 1 4
+ 011042 MAXIMUM WIND SPEED (10-MIN MEAN WIND) M/S 1 0 12 M/S 1 4
+ 011043 MAXIMUM WIND GUST DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011044 MEAN WIND DIRECTION FOR SURFACE - 1500 M (5000 FEET) DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011045 MEAN WIND SPEED FOR SURFACE - 1500 M (5000 FEET) M/S 1 0 12 M/S 1 4
+ 011046 MAXIMUM INSTANTANEOUS WIND SPEED M/S 1 0 12 M/S 1 4
+ 011047 MAXIMUM INSTANTANEOUS WIND SPEED OVER 10 MINUTES M/S 1 0 12 M/S 1 4
+ 011049 STANDARD DEVIATION OF WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011050 STANDARD DEVIATION OF HORIZONTAL WIND SPEED M/S 1 0 12 M/S 1 4
+ 011051 STANDARD DEVIATION OF VERTICAL WIND SPEED M/S 1 0 8 M/S 1 3
+ 011052 FORMAL UNCERTAINTY IN WIND SPEED M/S 2 0 13 M/S 2 5
+ 011053 FORMAL UNCERTAINTY IN WIND DIRECTION DEGREE TRUE 2 0 15 DEGREE TRUE 2 5
+ 011054 MEAN WIND DIRECTION FOR 1500 M - 3000 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011055 MEAN WIND SPEED FOR 1500 M - 3000 M M/S 1 0 12 M/S 1 4
+ 011061 ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW M/S 1 0 12 M/S 1 4
+ 011062 ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE M/S 1 0 12 M/S 1 4
+ 011070 DESIGNATOR OF THE RUNWAY AFFECTED BY WIND SHEAR (INCLUDING ALL) CCITTIA5 0 0 32 CHARACTER 0 4
+ 011071 TURBULENT VERTICAL MOMENTUM FLUX M**2/S**2 3 -128 14 M**2/S**2 3 5
+ 011072 TURBULENT VERTICAL BUOYANCY FLUX KM/S 3 -128 11 KM/S 3 4
+ 011073 TURBULENT KINETIC ENERGY M**2/S**2 2 -1024 13 M**2/S**2 2 4
+ 011074 DISSIPATION ENERGY M**2/S**2 2 -1024 10 M**2/S**2 2 4
+ 011075 MEAN TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3
+ 011076 PEAK TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3
+ 011077 REPORTING INTERVAL OR AVERAGING TIME FOR EDDY DISSIPATION RATE S 0 0 12 S 0 4
+ 011081 MODEL WIND DIRECTION AT 10M DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 011082 MODEL WIND SPEED AT 10M M/S 2 0 14 M/S 2 4
+ 011095 U COMPONENT OF THE MODEL WIND VECTOR M/S 1 -4096 13 M/S 1 4
+ 011096 V COMPONENT OF THE MODEL WIND VECTOR M/S 1 -4096 13 M/S 1 4
+ 011230 MAXIMUM MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4^M
+ 011231 MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4^M
+ 011232 MINIMUM MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4^M
+ 011233 HIGHEST GUST DURING THE 10 MINUTE PERIOD PRECEDING OBSERVATION M/S 1 -4096 13 M/S 1 4^M
+ 012001 TEMPERATURE/DRY-BULB TEMPERATURE K 1 0 12 C 1 3
+ 012002 WET-BULB TEMPERATURE K 1 0 12 C 1 3
+ 012003 DEW-POINT TEMPERATURE K 1 0 12 C 1 3
+ 012004 DRY-BULB TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012005 WET-BULB TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012006 DEW-POINT TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012007 VIRTUAL TEMPERATURE K 1 0 12 C 1 3
+ 012011 MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12 C 1 3
+ 012012 MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12 C 1 3
+ 012013 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS K 1 0 12 C 1 3
+ 012014 MAXIMUM TEMPERATURE AT 2 M, PAST 12 HOURS K 1 0 12 C 1 3
+ 012015 MINIMUM TEMPERATURE AT 2 M, PAST 12 HOURS K 1 0 12 C 1 3
+ 012016 MAXIMUM TEMPERATURE AT 2 M, PAST 24 HOURS K 1 0 12 C 1 3
+ 012017 MINIMUM TEMPERATURE AT 2 M, PAST 24 HOURS K 1 0 12 C 1 3
+ 012021 MAXIMUM TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012022 MINIMUM TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012030 SOIL TEMPERATURE K 1 0 12 C 1 3
+ 012049 TEMPERATURE CHANGE OVER SPECIFIED PERIOD K 0 -30 6 C 0 2
+ 012051 STANDARD DEVIATION TEMPERATURE K 1 0 10 C 1 3
+ 012052 HIGHEST DAILY MEAN TEMPERATURE K 1 0 12 C 1 3
+ 012053 LOWEST DAILY MEAN TEMPERATURE K 1 0 12 C 1 3
+ 012061 SKIN TEMPERATURE K 1 0 12 C 1 3
+ 012062 EQUIVALENT BLACK BODY TEMPERATURE K 1 0 12 C 1 3
+ 012063 BRIGHTNESS TEMPERATURE K 1 0 12 C 1 3
+ 012064 INSTRUMENT TEMPERATURE K 1 0 12 K 1 4
+ 012065 STANDARD DEVIATION BRIGHTNESS TEMPERATURE K 1 0 12 K 1 4
+ 012070 WARM LOAD TEMPERATURE K 2 0 16 K 2 5
+ 012071 COLDEST CLUSTER TEMPERATURE K 1 0 12 K 1 4
+ 012072 RADIANCE WM**(-2)SR**(-1) 6 0 31 WM**(-2)SR**(-1) 6 9
+ 012073 TEMPERATURE K 2 0 16 K 2 5
+ 012075 SPECTRAL RADIANCE WM**(-3)SR**(-1) -3 0 16 WM**(-3)SR**(-1) -3 5
+ 012076 RADIANCE WM**(-2)SR**(-1) 3 0 16 WM**(-2)SR**(-1) 3 5
+ 012101 TEMPERATURE/DRY-BULB TEMPERATURE K 2 0 16 C 2 4
+ 012102 WET-BULB TEMPERATURE K 2 0 16 C 2 4
+ 012103 DEW-POINT TEMPERATURE K 2 0 16 C 2 4
+ 012104 DRY-BULB TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012105 WEB-BULB TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012106 DEW-POINT TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012107 VIRTUAL TEMPERATURE K 2 0 16 C 2 4
+ 012111 MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 2 0 16 C 2 4
+ 012112 MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 2 0 16 C 2 4
+ 012113 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS K 2 0 16 C 2 4
+ 012114 MAXIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 2 0 16 C 2 4
+ 012115 MINIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 2 0 16 C 2 4
+ 012116 MAXIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 2 0 16 C 2 4
+ 012117 MINIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 2 0 16 C 2 4
+ 012118 MAXIMUM TEMPERATURE AT HEIGHT SPECIFIED, PAST 24 HOURS K 2 0 16 C 2 4
+ 012119 MINIMUM TEMPERATURE AT HEIGHT SPECIFIED, PAST 24 HOURS K 2 0 16 C 2 4
+ 012121 GROUND MINIMUM TEMPERATURE K 2 0 16 C 2 4
+ 012122 GROUND MINIMUM TEMPERATURE OF THE PRECEDING NIGHT K 2 0 16 C 2 4
+ 012130 SOIL TEMPERATURE K 2 0 16 C 2 4
+ 012151 STANDARD DEVIATION OF DAILY MEAN TEMPERATURE K 2 0 12 C 2 4
+ 012152 HIGHEST DAILY MEAN TEMPERATURE K 2 0 16 C 2 4
+ 012153 LOWEST DAILY MEAN TEMPERATURE K 2 0 16 C 2 4
+ 012161 SKIN TEMPERATURE K 2 0 16 C 2 4
+ 012162 EQUIVALENT BLACK BODY TEMPERATURE K 2 0 16 C 2 4
+ 012163 BRIGHTNESS TEMPERATURE K 2 0 16 C 2 4
+ 012164 INSTRUMENT TEMPERATURE K 2 0 16 K 2 5
+ 012171 COLDEST CLUSTER TEMPERATURE K 2 0 16 K 2 5
+ 012180 AVERAGED 12 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012181 AVERAGED 11 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012182 AVERAGED 3.7 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012183 AVERAGED 12 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012184 AVERAGED 11 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012185 AVERAGED 3.7 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012186 MEAN NADIR SEA SURFACE TEMPERATURE K 2 0 16 K 2 5
+ 012187 MEAN DUAL VIEW SEA SURFACE TEMPERATURE K 2 0 16 K 2 5
+ 012188 INTERPOLATED 23.8 GHZ BRIGHTNESS T FROM MWR K 2 0 16 K 2 5
+ 012189 INTERPOLATED 36.5 GHZ BRIGHTNESS T FROM MWR K 2 0 16 K 2 5
+ 013001 SPECIFIC HUMIDITY KG/KG 5 0 14 KG/KG 5 5
+ 013002 MIXING RATIO KG/KG 5 0 14 KG/KG 5 5
+ 013003 RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013004 VAPOUR PRESSURE PA -1 0 10 PA -1 4
+ 013005 VAPOUR DENSITY KG/M**3 3 0 7 KG/M**3 3 3
+ 013006 MIXING HEIGHTS M -1 -40 16 M -1 5
+ 013007 MINIMUM RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013008 MAXIMUM RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013009 RELATIVE HUMIDITY % 1 -1000 12 % 1 4
+ 013011 TOTAL PRECIPITATION/TOTAL WATER EQUIVALENT KG/M**2 1 -1 14 KG/M**2 1 5
+ 013012 DEPTH OF FRESH SNOW M 2 -2 12 M 2 4
+ 013013 TOTAL SNOW DEPTH M 2 -2 16 M 2 5
+ 013014 RAINFALL/WATER EQUIVALENT OF SNOW (AVERAGED RATE) KG/(M**2)S 4 0 12 KG/(M**2)S 4 4
+ 013015 SNOWFALL (AVERAGED RATE) M/S 7 0 12 M/S 7 4
+ 013016 PRECIPITABLE WATER KG/M**2 0 0 7 KG/M**2 0 3
+ 013019 TOTAL PRECIPITATION PAST 1 HOUR KG/M**2 1 -1 14 KG/M**2 1 4
+ 013020 TOTAL PRECIPITATION PAST 3 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013021 TOTAL PRECIPITATION PAST 6 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013022 TOTAL PRECIPITATION PAST 12 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013023 TOTAL PRECIPITATION PAST 24 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013031 EVAPOTRANSPIRATION KG/M**2 0 0 7 KG/M**2 0 3
+ 013032 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 8 KG/M**2 1 3
+ 013033 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 10 KG/M**2 1 4
+ 013038 SUPERADIABATIC INDICATOR CODE TABLE 13038 0 0 2 CODE TABLE 13038 0 1
+ 013039 TERRAIN TYPE (ICE/SNOW) CODE TABLE 13039 0 0 3 CODE TABLE 13039 0 1
+ 013040 SURFACE FLAG CODE TABLE 13040 0 0 4 CODE TABLE 13040 0 2
+ 013041 PASQUILL-GIFFORD STABILITY CATEGORY CODE TABLE 13041 0 0 4 CODE TABLE 13041 0 2
+ 013042 PARCEL LIFTED INDEX (TO 500 HPA) K 0 -20 6 K 0 2
+ 013043 BEST LIFTED INDEX (TO 500 HPA) K 0 -20 6 K 0 2
+ 013044 K INDEX K 0 -30 8 K 0 3
+ 013045 KO INDEX K 0 -30 8 K 0 3
+ 013046 MAXIMUM BUOYANCY K 0 -30 8 K 0 3
+ 013047 MODIFIED SHOWALTER STABILITY INDEX K 0 -60 6 C 0 2
+ 013051 FREQUENCY GROUP, PRECIPITATION CODE TABLE 13051 0 0 4 CODE TABLE 13051 0 2
+ 013052 HIGHEST DAILY AMOUNT OF PRECIPITATION KG/M**2 1 -1 14 KG/M**2 1 5
+ 013055 INTENSITY OF PRECIPITATION KG/(M**2)S 4 0 8 MM H-1 1 3
+ 013056 CHARACTER AND INTENSITY OF PRECIPITATION CODE TABLE 13056 0 0 4 CODE TABLE 13056 0 2
+ 013057 TIME OF BEGINNING OR END OF PRECIPITATION CODE TABLE 13057 0 0 4 CODE TABLE 13057 0 2
+ 013058 SIZE OF PRECIPITATING ELEMENT M 4 0 7 MM 1 3
+ 013059 NUMBER OF FLASHES (THUNDERSTORM) NUMERIC 0 0 7 NUMERIC 0 3
+ 013060 TOTAL ACCUMULATED PRECIPITATION KG/M**2 1 -1 17 KG/M**2 1 5
+ 013071 UPSTREAM WATER LEVEL M 2 0 14 M 2 5
+ 013072 DOWNSTREAM WATER LEVEL M 2 0 14 M 2 4
+ 013073 MAXIMUM WATER LEVEL M 2 0 14 M 2 4
+ 013080 WATER PH pH 1 0 10 pH 1 3
+ 013081 WATER CONDUCTIVITY S M-1 3 0 14 S M-1 3 4
+ 013082 WATER TEMPERATURE K 1 0 12 K 1 4
+ 013083 DISSOLVED OXYGEN KG/M**3 6 0 15 KG/M**3 6 5
+ 013084 TURBIDITY LUMEN 0 0 14 LUMEN 0 4
+ 013085 OXYDATION REDUCTION POTENTIAL (ORP) V 3 0 14 V 3 4
+ 013090 RADIOMETER WATER VAPOUR CONTENT KG/M**2 1 0 10 KG/M**2 1 4
+ 013091 RADIOMETER LIQUID CONTENT KG/M**2 2 0 8 KG/M**2 2 3
+ 013093 CLOUD OPTICAL THICKNESS NUMERIC 0 0 8 NUMERIC 0 3
+ 013095 TOTAL COLUMN WATER VAPOUR KG/M**2 4 0 19 KG/M**2 4 6
+ 013096 MWR WATER VAPOUR CONTENT KG/M**2 2 0 14 KG/M**2 2 4
+ 013097 MWR LIQUID WATER CONTENT KG/M**2 2 0 14 KG/M**2 2 4
+ 013098 INTEGRATED WATER VAPOUR DENSITY KG/M**2 8 0 30 KG/M**2 8 10
+ 014001 LONG-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014002 LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014003 SHORT-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014004 SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014011 NET LONG-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014012 NET LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014013 NET SHORT-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014014 NET SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014015 NET RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 -16384 15 J/M**2 -4 5
+ 014016 NET RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 -16384 15 J/M**2 -4 5
+ 014017 INSTANTANEOUS LONG-WAVE RADIATION (SEE NOTE 6) W/M**2 -3 -2048 12 W/M**2 -3 4
+ 014018 INSTANTANEOUS SHORT-WAVE RADIATION (SEE NOTE 6) W/M**2 -3 -2048 12 W/M**2 -3 4
+ 014019 SURFACE ALBEDO % 0 0 7 % 0 3
+ 014020 GLOBAL SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014021 GLOBAL SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014022 DIFFUSE SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014023 DIFFUSE SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014024 DIRECT SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014025 DIRECT SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014026 ALBEDO AT THE TOP OF CLOUDS % 0 0 7 % 0 3
+ 014027 ALBEDO % 0 0 7 % 0 3
+ 014028 GLOBAL SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S J/M**2 -2 0 16 J/M**2 -2 5
+ 014029 DIFFUSE SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD J/M**2 -2 0 16 J/M**2 -2 5
+ 014030 DIRECT SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S J/M**2 -2 0 16 J/M**2 -2 5
+ 014031 TOTAL SUNSHINE MINUTE 0 0 11 MINUTE 0 4
+ 014032 TOTAL SUNSHINE HOUR 0 0 10 HOUR 0 4
+ 014033 TOTAL SUNSHINE % 0 0 9 % 0 3
+ 014034 SUNSHINE OVER PERIOD SPECIFIED MINUTE 0 0 11 MINUTE 0 4
+ 014042 BI-DIRECTIONAL REFLECTANCE % 0 0 7 % 0 3
+ 014045 CHANNEL RADIANCE (W/M**2)*(1/SR)*CM 0 0 11 WM-2SR-1CM-1 0 4
+ 014046 SCALED IASI RADIANCE (W/M**2)*(1/SR)*(1/M) 0 -5000 16 (W/M**2)*(1/SR)*(1/M) 0 5
+ 014047 SCALED MEAN AVHRR RADIANCE (W/M**2)*(1/SR)*(1/M) 0 0 31 (W/M**2)*(1/SR)*(1/M) 0 10
+ 014048 SCALED STANDARD DEVIATION RADIANCE (W/M**2)*(1/SR)*(1/M) 0 0 31 (W/M**2)*(1/SR)*(1/M) 0 10
+ 014050 EMISSIVITY (SEE NOTE 5) % 1 0 10 % 1 4
+ 014051 DIRECT SOLAR RADIATION INTEGRATED OVER LAST HOUR J/M**2 -3 0 14 JM-2 -3 4
+ 014055 SOLAR ACTIVITY INDEX NUMERIC 0 -32768 16 NUMERIC 0 5
+ 014061 (VAL) INSTANTANEOUS LONG-WAVE RADIATION W/M**2 0 -512 10 W/M**2 0 4
+ 014062 (VAL) INSTANTANEOUS SHORT-WAVE RADIATION W/M**2 0 -2048 12 W/M**2 0 4
+ 015001 TOTAL OZONE DU 0 0 10 DU 0 4
+ 015002 AIR MASS (SLANT PATH AT 22 KM) NUMERIC 2 0 10 NUMERIC 2 3
+ 015003 MEASURED OZONE PARTIAL PRESSURE (SOUNDING) PA 4 0 9 NBAR 0 3
+ 015004 OZONE SOUNDING CORRECTION FACTOR NUMERIC 3 0 11 NUMERIC 3 4
+ 015005 OZONE P DU 0 0 10 DU 0 3
+ 015011 LOG 10 OF INTEGRATED ELECTRON DENSITY LOG (1/M2) 3 14000 13 LOG (M-2) 3 4
+ 015015 MAXIMUM IMAGE SPECTRAL COMPONENT BEFORE NORMALIZATION NUMERIC 0 0 31 NUMERIC 0 10
+ 015020 INTEGRATED 03 DENSITY KG/M**2 8 0 21 KG/M**2 8 7
+ 015025 TYPE OF POLLUTANT CODE TABLE 15025 0 0 4 CODE TABLE 15025 0 2
+ 015026 CONCENTRATION OF POLLUTANT MOLMOL-1 9 0 9 MOLMOL-1 9 3
+ 015027 CONCENTRATION OF POLLUTANT KG/M3 9 0 10 KG/M3 9 4
+ 015031 ATMOSPHERIC PATH DELAY IN SATELLITE SIGNAL M 4 10000 15 M 4 5
+ 015032 ESTIMATED ERROR IN ATMOSPHERIC PATH DELAY M 4 0 10 M 4 4
+ 015033 DIFFERENCE IN PATH DELAYS FOR LIMB VIEWS AT EXTREMES OF SCAN M 5 -10000 15 M 5 5
+ 015034 ESTIMATED ERROR IN PATH DELAY DIFFERENCE M 5 0 14 M 5 5
+ 015035 COMPONENT OF ZENITH PATH DELAY DUE TO WATER VAPOUR M 4 0 14 M 4 5
+ 015036 ATMOSPHERIC REFRACTIVITY (SEE NOTE 5) N-UNITS 3 0 19 N-UNITS 3 6
+ 015037 BENDING ANGLE RADIANS 8 -100000 23 RADIANS 8 7
+ 019001 TYPE OF SYNOPTIC FEATURE CODE TABLE 19001 0 0 6 CODE TABLE 19001 0 2
+ 019002 EFFECTIVE RADIUS OF FEATURE M -2 0 12 M -2 4
+ 019003 WIND SPEED THRESHOLD M/S 0 0 8 M/S 0 3
+ 019004 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD M -2 0 12 M -2 4
+ 019005 DIRECTION OF MOTION OF FEATURE DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 019006 SPEED OF MOTION OF FEATURE M/S 2 0 14 M/S 2 5
+ 019007 EFFECTIVE RADIUS OF FEATURE M -3 0 12 M -3 4
+ 019008 VERTICAL EXTENT OF CIRCULATION CODE TABLE 19008 0 0 3 CODE TABLE 19008 0 1
+ 019009 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD (LA M -3 0 12 M -3 4
+ 019010 METHOD FOR TRACKING THE CENTRE OF SYNOPTIC FEATURE CODE TABLE 19010 0 0 4 CODE TABLE 19010 0 2
+ 019100 TIME INTERVAL TO CALCULATE THE MOVEMENT OF THE TROPICAL CYCLONE CODE TABLE 19100 0 0 4 CODE TABLE 19100 0 2
+ 019101 ACCURACY OF THE POSITION OF THE CENTRE OF THE TROPICAL CYCLONE CODE TABLE 19101 0 0 4 CODE TABLE 19101 0 2
+ 019102 SHAPE AND DEFINITION OF THE EYE OF THE TROPICAL CYCLONE CODE TABLE 19102 0 0 3 CODE TABLE 19102 0 1
+ 019103 DIAMETER OF MAJOR AXIS OF THE EYE OF THE TROPICAL CYCLONE CODE TABLE 19103 0 0 4 CODE TABLE 19103 0 2
+ 019104 CHANGE IN CHARACTER OF THE EYE DURING THE 30 MINUTES CODE TABLE 19104 0 0 4 CODE TABLE 19104 0 2
+ 019105 DISTANCE BETWEEN THE END OF SPIRAL BAND AND THE CENTRE CODE TABLE 19105 0 0 4 CODE TABLE 19105 0 2
+ 019106 IDENTIFICATION NUMBER OF TROPICAL CYCLONE NUMERIC 0 0 7 NUMERIC 0 3
+ 019107 TIME INTERVAL OF THE TROPICAL CYCLONE ANALYSIS CODE TABLE 19107 0 0 4 CODE TABLE 19107 0 2
+ 019108 ACCURACY OF GEOGRAPHICAL POSITION OF THE TROPICAL CYCLONE CODE TABLE 19108 0 0 3 CODE TABLE 19108 0 1
+ 019109 MEAN DIAMETER OF THE OVERCAST CLOUD OF THE TROPICAL CYCLONE CODE TABLE 19109 0 0 4 CODE TABLE 19109 0 2
+ 019110 APPARENT 24-HOUR CHANGE IN INTENSITY OF TROPICAL CYCLONE CODE TABLE 19110 0 0 4 CODE TABLE 19110 0 2
+ 019111 CURRENT INTENSITY (CI) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019112 DATA TROPICAL (DT) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019113 CLOUD PATTERN TYPE OF THE DT- NUMBER CODE TABLE 19113 0 0 4 CODE TABLE 19113 0 2
+ 019114 MODEL EXPECTED TROPICAL (MET) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019115 TREND OF PAST 24-HOUR CHANGE (+: DEVELOPED, -: WEAKENED) NUMERIC 1 -30 6 NUMERIC 1 2
+ 019116 PATTERN TROPICAL (PT) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019117 CLOUD PICTURE TYPE OF THE PT- NUMBER CODE TABLE 19117 0 0 3 CODE TABLE 19117 0 1
+ 019118 FINAL TROPICAL (T) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019119 TYPE OF THE FINAL T-NUMBER CODE TABLE 19119 0 0 3 CODE TABLE 19119 0 1
+ 019150 TYPHOON INTERNATIONAL COMMON NUMBER (TYPHOON COMMITTEE) CCITTIA5 0 0 32 CHARACTER 0 4
+ 020001 HORIZONTAL VISIBILITY M -1 0 13 M -1 4
+ 020002 VERTICAL VISIBILITY M -1 0 7 M -1 3
+ 020003 PRESENT WEATHER (SEE NOTE 1) CODE TABLE 20003 0 0 9 CODE TABLE 20003 0 3
+ 020004 PAST WEATHER (1) (SEE NOTE 2) CODE TABLE 20004 0 0 5 CODE TABLE 20004 0 2
+ 020005 PAST WEATHER (2) (SEE NOTE 2) CODE TABLE 20005 0 0 5 CODE TABLE 20005 0 2
+ 020008 CLOUD DISTRIBUTION FOR AVIATION CODE TABLE 20008 0 0 5 CODE TABLE 20008 0 2
+ 020009 GENERAL WEATHER INDICATOR (TAF/METAR) CODE TABLE 20009 0 0 4 CODE TABLE 20009 0 2
+ 020010 CLOUD COVER (TOTAL) % 0 0 7 % 0 3
+ 020011 CLOUD AMOUNT CODE TABLE 20011 0 0 4 CODE TABLE 20011 0 2
+ 020012 CLOUD TYPE CODE TABLE 20012 0 0 6 CODE TABLE 20012 0 2
+ 020013 HEIGHT OF BASE OF CLOUD M -1 -40 11 M -1 4
+ 020014 HEIGHT OF TOP OF CLOUD M -1 -40 11 M -1 4
+ 020015 PRESSURE AT BASE OF CLOUD PA -1 0 14 PA -1 5
+ 020016 PRESSURE AT TOP OF CLOUD PA -1 0 14 PA -1 5
+ 020017 CLOUD TOP DESCRIPTION CODE TABLE 20017 0 0 4 CODE TABLE 20017 0 2
+ 020018 TENDENCY OF RUNWAY VISUAL RANGE CODE TABLE 20018 0 0 2 CODE TABLE 20018 0 1
+ 020019 SIGNIFICANT PRESENT OR FORECAST WEATHER CCITTIA5 0 0 72 CHARACTER 0 9
+ 020020 SIGNIFICANT RECENT WEATHER PHENOMENA CCITTIA5 0 0 32 CHARACTER 0 4
+ 020021 TYPE OF PRECIPITATION FLAG TABLE 20021 0 0 30 FLAG TABLE 20021 0 10
+ 020022 CHARACTER OF PRECIPITATION CODE TABLE 20022 0 0 4 CODE TABLE 20022 0 2
+ 020023 OTHER WEATHER PHENOMENA FLAG TABLE 20023 0 0 18 FLAG TABLE 20023 0 6
+ 020024 INTENSITY OF PHENOMENA CODE TABLE 20024 0 0 3 CODE TABLE 20024 0 1
+ 020025 OBSCURATION FLAG TABLE 20025 0 0 21 FLAG TABLE 20025 0 7
+ 020026 CHARACTER OF OBSCURATION CODE TABLE 20026 0 0 4 CODE TABLE 20026 0 2
+ 020027 PHENOMENA OCCURRENCE FLAG TABLE 20027 0 0 9 FLAG TABLE 20027 0 3
+ 020029 RAIN FLAG CODE TABLE 20029 0 0 2 CODE TABLE 20029 0 1
+ 020031 ICE DEPOSIT (THICKNESS) M 2 0 7 M 2 3
+ 020032 RATE OF ICE ACCRETION CODE TABLE 20032 0 0 3 CODE TABLE 20032 0 1
+ 020033 CAUSE OF ICE ACCRETION FLAG TABLE 20033 0 0 4 FLAG TABLE 20033 0 2
+ 020034 SEA ICE CONCENTRATION CODE TABLE 20034 0 0 5 CODE TABLE 20034 0 2
+ 020035 AMOUNT AND TYPE OF ICE CODE TABLE 20035 0 0 4 CODE TABLE 20035 0 2
+ 020036 ICE SITUATION CODE TABLE 20036 0 0 5 CODE TABLE 20036 0 2
+ 020037 ICE DEVELOPMENT CODE TABLE 20037 0 0 5 CODE TABLE 20037 0 2
+ 020038 BEARING OF ICE EDGE (SEE NOTE 3) DEGREE TRUE 0 0 12 DEGREE TRUE 0 3
+ 020039 ICE DISTANCE M -1 0 13 M -1 4
+ 020040 EVOLUTION OF DRIFT OF SNOW CODE TABLE 20040 0 0 4 CODE TABLE 20040 0 2
+ 020041 AIRFRAME ICING CODE TABLE 20041 0 0 4 CODE TABLE 20041 0 2
+ 020042 AIRFRAME ICING PRESENT CODE TABLE 20042 0 0 2 CODE TABLE 20042 0 1
+ 020043 PEAK LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2
+ 020044 AVERAGE LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2
+ 020045 SUPERCOOLED LARGE DROPLET (SLD) CONDITIONS CODE TABLE 20045 0 0 2 CODE TABLE 20045 0 2
+ 020050 CLOUD INDEX CODE TABLE 20050 0 0 8 CODE TABLE 20050 0 3
+ 020051 AMOUNT OF LOW CLOUDS % 0 0 7 % 0 3
+ 020052 AMOUNT OF MIDDLE CLOUDS % 0 0 7 % 0 3
+ 020053 AMOUNT OF HIGH CLOUDS % 0 0 7 % 0 3
+ 020054 TRUE DIRECTION FROM WHICH CLOUDS ARE MOVING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 020055 STATE OF SKY IN TROPICS CODE TABLE 20055 0 0 4 CODE TABLE 20055 0 2
+ 020056 CLOUD PHASE CODE TABLE 20056 0 0 3 CODE TABLE 20056 0 1
+ 020061 RUNWAY VISUAL RANGE (RVR) M 0 0 12 M 0 4
+ 020062 STATE OF THE GROUND (WITH OR WITHOUT SNOW) CODE TABLE 20062 0 0 5 CODE TABLE 20062 0 2
+ 020063 SPECIAL PHENOMENA CODE TABLE 20063 0 0 10 CODE TABLE 20063 0 4
+ 020065 SNOW COVER (SEE NOTE 4) % 0 0 7 % 0 3
+ 020066 MAXIMUM DIAMETER OF HAILSTONES M 3 0 8 M 3 3
+ 020067 DIAMETER OF DEPOSIT M 3 0 9 M 3 3
+ 020070 MINIMUM NUMBER OF ATMOSPHERICS NUMERIC 0 0 7 NUMERIC 0 3
+ 020071 ACCURACY OF FIX AND RATE OF ATMOSPHERICS CODE TABLE 20071 0 0 4 CODE TABLE 20071 0 2
+ 020081 CLOUD AMOUNT IN SEGMENT % 0 0 7 % 0 3
+ 020082 AMOUNT SEGMENT CLOUD FREE % 0 0 7 % 0 3
+ 020083 AMOUNT OF SEGMENT COVERED BY SCENE % 0 0 7 % 0 3
+ 020090 SPECIAL CLOUDS CODE TABLE 20090 0 0 4 CODE TABLE 20090 0 2
+ 020095 ICE PROBABILITY NUMERIC 3 0 10 NUMERIC 3 4
+ 020096 ICE AGE ("A" PARAMETER) dB 2 -4096 13 dB 2 4
+ 020101 LOCUST (ACRIDIAN) NAME CODE TABLE 20101 0 0 4 CODE TABLE 20101 0 2
+ 020102 LOCUST (MATURITY) COLOR CODE TABLE 20102 0 0 4 CODE TABLE 20102 0 2
+ 020103 STAGE OF DEVELOPMENT OF LOCUSTS CODE TABLE 20103 0 0 4 CODE TABLE 20103 0 2
+ 020104 ORGANIZATION STATE OF SWARM OR BAND OF LOCUSTS CODE TABLE 20104 0 0 4 CODE TABLE 20104 0 2
+ 020105 SIZE OF SWARM OR BAND OF LOCUSTS AND DURATION OF PASSAGE OF SWARMCODE TABLE 20105 0 0 4 CODE TABLE 20105 0 2
+ 020106 LOCUST POPULATION DENSITY CODE TABLE 20106 0 0 4 CODE TABLE 20106 0 2
+ 020107 DIRECTION OF MOVEMENTS OF LOCUST SWARM CODE TABLE 20107 0 0 4 CODE TABLE 20107 0 2
+ 020108 EXTENT OF VEGETATION CODE TABLE 20108 0 0 4 CODE TABLE 20108 0 2
+ 020193 CLOUD AMOUNT IN SEGMENT % 0 0 7 % 0 3
+ 020194 AMOUNT OF SEGMENT CLOUD FREE % 0 0 7 % 0 3
+ 020215 PRESSURE AT THE BASE OF CLOUD PA -1 0 14 PA -1 5
+ 021001 HORIZONTAL REFLECTIVITY dB 0 -64 7 dB 0 3
+ 021002 VERTICAL REFLECTIVITY dB 0 -64 7 dB 0 3
+ 021003 DIFFERENTIAL REFLECTIVITY dB 1 -5 7 dB 1 3
+ 021005 LINEAR DEPOLARISATION RATIO dB 0 -65 6 dB 0 2
+ 021006 CIRCULAR DEPOLARISATION RATIO dB 0 -65 6 dB 0 2
+ 021011 DOPPLER MEAN VELOCITY IN X-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021012 DOPPLER MEAN VELOCITY IN Y-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021013 DOPPLER MEAN VELOCITY IN Z-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021014 DOPPLER MEAN VELOCITY (RADIAL) M/S 1 -4096 13 M/S 1 4
+ 021017 DOPPLER VELOCITY SPECTRAL WIDTH M/S 1 0 8 M/S 1 3
+ 021021 ECHO TOPS M -3 0 4 M -3 2
+ 021030 SIGNAL TO NOISE RATIO dB 0 -32 8 dB 0 3
+ 021031 VERTICALLY INTEGRATED LIQUID-WATER CONTENT KG/M**2 0 0 7 KG/M**2 0 3
+ 021036 RADAR RAINFALL INTENSITY M/S 7 0 12 M/S 7 4
+ 021041 BRIGHT-BAND HEIGHT M -2 0 8 M -2 3
+ 021051 SIGNAL POWER ABOVE 1 MW dB 0 -256 8 dB 0 3
+ 021062 BACKSCATTER dB 2 -5000 13 dB 2 4
+ 021063 RADIOMETRIC RESOLUTION (NOISE VALUE) % 1 0 10 % 1 4
+ 021064 CLUTTER NOISE ESTIMATE NUMERIC 0 0 8 NUMERIC 0 3
+ 021065 MISSING PACKET COUNTER NUMERIC 0 -127 8 NUMERIC 0 3
+ 021066 WAVE SCATTEROMETER PRODUCT CONFIDENCE DATA FLAG TABLE 21066 0 0 12 FLAG TABLE 21066 0 4
+ 021067 WIND PRODUCT CONFIDENCE DATA FLAG TABLE 21067 0 0 13 FLAG TABLE 21067 0 5
+ 021068 RADAR ALTIMETER PRODUCT CONFIDENCE DATA FLAG TABLE 21068 0 0 8 FLAG TABLE 21068 0 3
+ 021069 SST PRODUCT CONFIDENCE DATA FLAG TABLE 21069 0 0 10 FLAG TABLE 21069 0 4
+ 021070 SST PRODUCT CONFIDENCE DATA (SADIST-2) FLAG TABLE 21070 0 0 23 FLAG TABLE 21070 0 6
+ 021071 PEAKINESS NUMERIC 0 0 16 NUMERIC 0 5
+ 021072 SATELLITE ALTIMETER CALIBRATION STATUS FLAG TABLE 21072 0 0 4 FLAG TABLE 21072 0 2
+ 021073 SATELLLITE ALTIMETER INSTRUMENT MODE FLAG TABLE 21073 0 0 9 FLAG TABLE 21073 0 3
+ 021075 IMAGE SPECTRUM INTENSITY NUMERIC 0 0 8 NUMERIC 0 3
+ 021076 REPRESENTATION OF INTENSITIES CODE TABLE 21076 0 0 3 CODE TABLE 21076 0 1
+ 021077 ALTITUDE CORRECTION (IONOSPHERE) M 3 0 14 M 3 5
+ 021078 ALTITUDE CORRECTION (DRY TROPOSPHERE) M 3 0 9 M 3 3
+ 021079 ALTITUDE CORRECTION (WET TROPOSPHERE) M 3 2000 10 M 3 4
+ 021080 ALTITUDE CORRECTION (CALIBRATION CONSTANT) M 3 0 11 M 3 4
+ 021081 OPEN LOOP CORRECTION (HEIGHT-TIME LOOP) M 3 0 10 M 3 4
+ 021082 OPEN LOOP CORRECTION (AUTO GAIN CONTROL) dB 3 -3000 14 dB 3 5
+ 021083 WARM TARGET CALIBRATION NUMERIC 0 0 16 NUMERIC 0 5
+ 021084 COLD TARGET CALIBRATION NUMERIC 0 0 16 NUMERIC 0 5
+ 021085 ATSR SEA SURFACE TEMPERATURE ACROSS- TRACK BAND NUMBER NUMERIC 0 0 4 NUMERIC 0 2
+ 021086 NUMBER OF PIXELS IN NADIR ONLY, AVERAGE NUMERIC 0 0 9 NUMERIC 0 3
+ 021087 NUMBER OF PIXELS IN DUAL VIEW, AVERAGE NUMERIC 0 0 9 NUMERIC 0 3
+ 021088 WET BACKSCATTER dB 2 -5000 13 dB 2 4
+ 021091 RADAR SIGNAL DOPPLER SPECTRUM 0TH MOMENT dB 0 -100 8 dB 0 3
+ 021092 RASS SIGNAL DOPPLER SPECTRUM 0TH MOMENT, REFERRING TO RASS SIGNA dB 0 -100 8 dB 0 3
+ 021093 Ku BAND PEAKINESS NUMERIC 3 0 16 NUMERIC 0 5
+ 021094 S BAND PEAKINESS NUMERIC 3 0 16 NUMERIC 0 5
+ 021101 NUMBER OF VECTOR AMBIGUITIES NUMERIC 0 0 3 NUMERIC 0 1
+ 021102 INDEX OF SELECTED WIND VECTOR NUMERIC 0 0 3 NUMERIC 0 1
+ 021103 TOTAL NUMBER OF SIGMA-0 MEASUREMENTS NUMERIC 0 0 5 NUMERIC 0 2
+ 021104 LIKELIHOOD COMPUTED FOR SOLUTION NUMERIC 3 -30000 15 NUMERIC 3 5
+ 021105 NORMALIZED RADAR CROSS-SECTION dB 2 -10000 14 dB 2 5
+ 021106 KP VARIANCE COEFFICIENT (ALPHA) NUMERIC 3 0 14 NUMERIC 3 5
+ 021107 KP VARIANCE COEFFICIENT (BETA) NUMERIC 8 0 16 NUMERIC 8 5
+ 021109 SEAWINDS WIND VECTOR CELL QUALITY FLAG TABLE 21109 0 0 17 FLAG TABLE 21109 0 6
+ 021110 NUMBER OF INNER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021111 NUMBER OF OUTER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021112 NUMBER OF INNER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021113 NUMBER OF OUTER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021114 KP VARIANCE COEFFICENT (GAMMA) dB 3 -140000 18 dB 3 6
+ 021115 SEAWINDS SIGMA-0 QUALITY FLAG TABLE 21115 0 0 17 FLAG TABLE 21115 0 6
+ 021116 SEAWINDS SIGMA-0 MODE FLAG TABLE 21116 0 0 17 FLAG TABLE 21116 0 6
+ 021117 SIGMA-0 VARIANCE QUALITY CONTROL NUMERIC 2 0 16 NUMERIC 2 5
+ 021118 ATTENUATION CORRECTION ON SIGMA-0 dB 2 -10000 14 dB 2 5
+ 021119 WIND SCATTEROMETER GEOPHYSICAL MODEL FUNCTION CODE TABLE 21119 0 0 6 CODE TABLE 21119 0 2
+ 021120 PROBABILITY OF RAIN NUMERIC 3 0 10 NUMERIC 3 4
+ 021121 SEAWINDS NOF* RAIN INDEX NUMERIC 0 0 8 NUMERIC 0 3
+ 021122 ATTENUATION CORRECTION OF SIGMA-0 (FROM TB) dB 2 -10000 14 dB 2 5
+ 021123 SEAWINDS NORMALIZED RADAR CROSS SECTION dB 2 -30000 15 dB 2 5
+ 021128 NUMBER OF VALID POINTS PER SECOND USED TO DERIVE PREVIOUS PARAME NUMERIC 0 0 8 NUMERIC 0 3
+ 021130 SPECTRUM TOTAL ENERGY NUMERIC 6 0 28 NUMERIC 6 9
+ 021131 SPECTRUM MAX ENERGY NUMERIC 6 0 28 NUMERIC 6 9
+ 021132 DIRECTION OF SPECTRUM MAX ON HIGHER RESOLUTION GRID DEGREE 3 0 19 DEGREE 3 6
+ 021133 WAVE-LENGTH OF SPECTRUM MAX ON HIGHER RESOLUTION GRID M 3 0 29 M 3 9
+ 021134 RANGE RESOLUTION OF CRESS COVARIANCE SPECTRUM RAD/M 3 0 19 RAD/M 3 6
+ 021135 REAL PART OF CROSS SPECTRA POLAR GRID NUMBER OF BINS NUMERIC 3 -524288 20 NUMERIC 3 7
+ 021136 IMAGINARY PART OF CROSS SPECTRA POLAR GRID NUMBER OF BINS NUMERIC 3 -524288 20 NUMERIC 3 7
+ 021137 KU BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021138 STD KU BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021139 KU BAND NET INSTRUMENTAL CORRECTION FOR AGC dB 2 -2048 12 dB 2 4
+ 021140 S BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021141 STD S BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021142 S BAND NET INSTRUMENTAL CORRECTION FOR AGC dB 2 -1024 11 dB 2 4
+ 021143 KU BAND RAIN ATTENUATION dB 2 -1073741824 31 dB 2 10
+ 021144 ALTIMETER RAIN FLAG FLAG TABLE 21144 0 0 2 FLAG TABLE 21144 0 1
+ 021150 BEAM COLLOCATION CODE TABLE 21150 0 0 2 CODE TABLE 21150 0 1
+ 021151 ESTIMATED ERROR IN SIGMA0 AT 40DEG INCIDENCE ANGLE dB 2 0 9 dB 2 3
+ 021152 SLOPE AT 40DEG INCIDENCE ANGLE dB/DEG 2 -80 7 dB/DEG 2 3
+ 021153 ESTIMATED ERROR IN SLOPE AT 40DEG INCIDENCE ANGLE dB/DEG 2 -40 6 dB/DEG 2 3
+ 021154 SOIL MOISTURE SENSITIVITY dB 2 0 12 dB 2 4
+ 021155 WIND VECTOR CELL QUALITY FLAG TABLE 21155 0 0 24 FLAG TABLE 21155 0 8
+ 021156 BACKSCATTER DISTANCE NUMERIC 1 -4096 13 NUMERIC 1 4
+ 021157 LOSS PER UNIT LENGTH OF ATMOSPHERE USED dB/M 10 0 22 dB/M 10 7
+ 021158 ASCAT kp ESTIMATE QUALITY CODE TABLE 21158 0 0 2 CODE TABLE 21158 0 1
+ 021159 ASCAT SIGMA-0 USABILITY CODE TABLE 21159 0 0 2 CODE TABLE 21159 0 1
+ 021160 ASCAT USE OF SYNTHETIC DATA NUMERIC 3 0 10 NUMERIC 3 4
+ 021161 ASCAT SYNTHETIC DATA QUALITY NUMERIC 3 0 10 NUMERIC 3 4
+ 021162 ASCAT SATELLITE ORBIT AND ATTITUDE QUALITY NUMERIC 3 0 10 NUMERIC 3 4
+ 021163 ASCAT SOLAR ARRAY REFLECTION CONTAMINATION NUMERIC 3 0 10 NUMERIC 3 4
+ 021164 ASCAT TELEMETRY PRESENCE AND QUALITY NUMERIC 3 0 10 NUMERIC 3 4
+ 021165 ASCAT EXTRAPOLATED REFERENCE FUNCTION PRESENCE NUMERIC 3 0 10 NUMERIC 3 4
+ 021166 ASCAT LAND FRACTION NUMERIC 3 0 10 NUMERIC 3 4
+ 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022002 DIRECTION OF WIND WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022003 DIRECTION OF SWELL WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022004 DIRECTION OF CURRENT DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022005 DIRECTION OF SEA SURFACE CURRENT DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022011 PERIOD OF WAVES S 0 0 6 S 0 2
+ 022012 PERIOD OF WIND WAVES S 0 0 6 S 0 2
+ 022013 PERIOD OF SWELL WAVES S 0 0 6 S 0 2
+ 022021 HEIGHT OF WAVES M 1 0 10 M 1 4
+ 022022 HEIGHT OF WIND WAVES M 1 0 10 M 1 4
+ 022023 HEIGHT OF SWELL WAVES M 1 0 10 M 1 4
+ 022025 STANDARD DEVIATION WAVE HEIGHT M 2 0 10 M 2 4
+ 022026 STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT M 2 0 10 M 2 4
+ 022031 SPEED OF CURRENT M/S 2 0 13 M/S 2 4
+ 022032 SPEED OF SEA SURFACE CURRENT M/S 2 0 13 M/S 2 4
+ 022035 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 2 0 14 M 2 4
+ 022036 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 2 0 14 M 2 4
+ 022037 TIDAL ELEVATION WITH RESPECT TO NATIONAL LAND DATUM M 3 -10000 15 M 3 5
+ 022038 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 3 -10000 15 M 3 5
+ 022039 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 3 -5000 12 M 3 4
+ 022040 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 3 -5000 14 M 3 5
+ 022041 SEA-SURFACE TEMPERATURE (15-DAY RUNNING MEAN) K 1 0 12 K 1 4
+ 022042 SEA/WATER TEMPERATURE K 1 0 12 K 1 4
+ 022043 SEA/WATER TEMPERATURE K 2 0 15 K 2 5
+ 022044 SOUND VELOCITY M/S 1 0 14 M/S 1 5
+ 022045 SEA/WATER TEMPERATURE K 3 0 19 K 3 6
+ 022049 SEA SURFACE TEMPERATURE K 2 0 15 K 2 5
+ 022050 STANDARD DEVIATION SEA-SURFACE TEMPERATURE K 2 0 8 K 2 3
+ 022055 FLOAT CYCLE NUMBER NUMERIC 0 0 10 NUMERIC 0 3
+ 022056 DIRECTION OF PROFILE CODE TABLE 22056 0 0 2 CODE TABLE 22056 0 1
+ 022059 SEA SURFACE SALINITY PART PER THOUSAND 2 0 14 PART PER THOUSAND 2 5
+ 022060 LAGRANGIAN DRIFTER DROGUE STATUS CODE TABLE 22060 0 0 3 CODE TABLE 22060 0 1
+ 022061 STATE OF THE SEA CODE TABLE 22061 0 0 4 CODE TABLE 22061 0 2
+ 022062 SALINITY PART PER THOUSAND 2 0 14 PART PER THOUSAND 2 5
+ 022063 TOTAL WATER DEPTH M 0 0 14 M 0 5
+ 022064 SALINITY PART PER THOUSAND 3 0 17 PART PER THOUSAND 3 6
+ 022065 WATER PRESSURE PA -3 0 17 PA -3 6
+ 022066 WATER CONDUCTIVITY S M-1 6 0 26 S M-1 6 8
+ 022067 INSTRUMENT TYPE FOR WATER TEMPERATURE PROFILE MEASUREMENT CODE TABLE 22067 0 0 10 CODE TABLE 22067 0 4
+ 022068 WATER TEMPERATURE PROFILE RECORDER TYPES CODE TABLE 22068 0 0 7 CODE TABLE 22068 0 3
+ 022069 SPECTRAL WAVE DENSITY M2HZ-1 3 0 22 M2HZ-1 3 7
+ 022070 SIGNIFICANT WAVE HEIGHT M 2 0 13 M 2 4
+ 022071 SPECTRAL PEAK WAVE PERIOD S 1 0 9 S 1 3
+ 022072 SPECTRAL PEAK WAVE LENGTH M 0 0 13 M 0 4
+ 022073 MAXIMUM WAVE HEIGHT M 2 0 13 M 2 4
+ 022074 AVERAGE WAVE PERIOD S 1 0 9 S 1 3
+ 022075 AVERAGE WAVE LENGTH M 0 0 13 M 0 4
+ 022076 DIRECTION FROM WHICH DOMINANT WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022077 DIRECTIONAL SPREAD OF DOMINANT WAVE DEGREE 0 0 9 DEGREE 0 3
+ 022078 DURATION OF WAVE RECORD S 0 0 12 S 0 4
+ 022079 LENGTH OF WAVE RECORD M 0 0 16 M 0 5
+ 022080 WAVEBAND CENTRAL FREQUENCY Hz 3 0 10 Hz 3 4
+ 022081 WAVEBAND CENTRAL WAVE NUMBER 1/M 5 0 13 1/M 5 4
+ 022082 MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE DENSITY M**2S 2 0 20 M**2S 2 7
+ 022083 MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE NUMBER M**3 2 0 20 M**3 2 7
+ 022084 BAND CONTAINING MAXIMUM NON- DIRECTIONAL SPECTRAL WAVE DENSITY NUMERIC 0 0 7 NUMERIC 0 3
+ 022085 SPECTRAL WAVE DENSITY RATIO NUMERIC 0 0 7 NUMERIC 0 3
+ 022086 MEAN DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022087 PRINCIPAL DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022088 FIRST NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7 NUMERIC 2 3
+ 022089 SECOND NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7 NUMERIC 2 3
+ 022090 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S 2 0 20 M**2S 2 7
+ 022091 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**3 2 0 20 M**3 2 7
+ 022092 DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S/RAD 2 0 20 M**2S/RAD 2 7
+ 022093 DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**4 2 0 20 M**4 2 7
+ 022094 TOTAL NUMBER OF WAVE BANDS NUMERIC 0 0 7 NUMERIC 0 3
+ 022095 DIRECTIONAL SPREAD OF INDIVIDUAL WAVES DEGREE 0 0 8 DEGREE 0 3
+ 022096 SPECTRAL BAND WIDTH 1/S 3 0 4 1/S 3 2
+ 022097 MEAN WAVELENGTH > 731 M OF IMAGE SPECTRUM AT LOW WAVE NUMBERS M 0 0 14 M 0 5
+ 022098 WAVELENGTH SPREAD (WAVELENGTH > 731 M) AT LOW WAVE NUMBERS M 0 0 14 M 0 5
+ 022099 MEAN DIRECTION AT LOW WAVE NUMBERS (WAVELENGTH > 731 M) DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022100 DIRECTION SPREAD AT LOW WAVE NUMBERS(WAVELENGTH > 731 M) DEGREE 0 0 9 DEGREE 0 3
+ 022101 TOTAL ENERGY (WAVELENGTH > 731M) AT LOW WAVE NUMBERS NUMERIC 0 0 31 NUMERIC 0 10
+ 022120 TIDE STATION AUTOMATED WATER LEVEL CHECK CODE TABLE 22120 0 0 5 CODE TABLE 22120 0 2
+ 022121 TIDE STATION MANUAL WATER LEVEL CHECK CODE TABLE 22121 0 0 5 CODE TABLE 22121 0 2
+ 022122 TIDE STATION AUTOMATED METEOROLOGICAL DATA CHECK CODE TABLE 22122 0 0 5 CODE TABLE 22122 0 2
+ 022123 TIDE STATION MANUAL METEOROLOGICAL DATA CHECK CODE TABLE 22123 0 0 5 CODE TABLE 22123 0 2
+ 022141 SEA-SURFACE TEMPERATURE (15-DAY RUNNING MEAN) K 2 0 15 K 2 5
+ 022150 NUMBER OF 18 HZ VALID POINTS FOR KU BAND NUMERIC 0 0 10 NUMERIC 0 4
+ 022151 KU BAND OCEAN RANGE M 3 0 31 M 3 10
+ 022152 STD OF 18 HZ KU BAND OCEAN RANGE M 3 0 16 M 3 5
+ 022153 NUMBER OF 18 HZ VALID POINTS FOR S BAND NUMERIC 0 0 10 NUMERIC 0 4
+ 022154 S BAND OCEAN RANGE M 3 0 31 M 3 10
+ 022155 STD OF 18 HZ S BAND OCEAN RANGE M 3 0 16 M 3 5
+ 022156 KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022157 STD 18HZ KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022158 S BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022159 STD 18HZ S BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022160 NORMALIZED INVERSE WAVE AGE NUMERIC 6 0 21 NUMERIC 6 7
+ 022161 WAVE SPECTRA M**4 4 0 27 M**4 4 9
+ 023001 ACCIDENT EARLY NOTIFICATION ARTICLE APPLICABLE CODE TABLE 23001 0 0 3 CODE TABLE 23001 0 1
+ 023002 ACTIVITY OR FACILITY INVOLVED IN INCIDENT CODE TABLE 23002 0 0 5 CODE TABLE 23002 0 2
+ 023003 TYPE OF RELEASE CODE TABLE 23003 0 0 3 CODE TABLE 23003 0 1
+ 023004 COUNTERMEASURES TAKEN NEAR BORDER CODE TABLE 23004 0 0 3 CODE TABLE 23004 0 1
+ 023005 CAUSE OF INCIDENT CODE TABLE 23005 0 0 2 CODE TABLE 23005 0 1
+ 023006 INCIDENT SITUATION CODE TABLE 23006 0 0 3 CODE TABLE 23006 0 1
+ 023007 CHARACTERISTICS OF RELEASE CODE TABLE 23007 0 0 3 CODE TABLE 23007 0 1
+ 023008 STATE OF CURRENT RELEASE CODE TABLE 23008 0 0 2 CODE TABLE 23008 0 1
+ 023009 STATE OF EXPECTED RELEASE CODE TABLE 23009 0 0 2 CODE TABLE 23009 0 1
+ 023016 POSSIBILITY OF SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT CODE TABLE 23016 0 0 2 CODE TABLE 23016 0 1
+ 023017 FLOW DISCHARGE OF MAJOR RECIPIENT M**3/S 6 0 20 M**3/S 6 7
+ 023018 RELEASE BEHAVIOUR OVER TIME CODE TABLE 23018 0 0 3 CODE TABLE 23018 0 1
+ 023019 ACTUAL RELEASE HEIGHT M 0 -15000 17 M 0 6
+ 023021 EFFECTIVE RELEASE HEIGHT M 0 -15000 17 M 0 6
+ 023022 DISTANCE OF RELEASE POINT OR SITE OF INCIDENT M 0 0 24 M 0 8
+ 023023 MAIN TRANSPORT SPEED IN THE ATMOSPHERE M/S 1 0 12 M/S 1 4
+ 023024 MAIN TRANSPORT SPEED IN WATER M/S 2 0 13 M/S 2 4
+ 023025 MAIN TRANSPORT SPEED IN GROUND WATER M/S 2 0 13 M/S 2 4
+ 023027 MAIN TRANSPORT DIRECTION IN THE ATMOSPHERE DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023028 MAIN TRANSPORT DIRECTION IN WATER DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023029 MAIN TRANSPORT DIRECTION IN GROUND WATER DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023031 POSSIBILITY THAT PLUME WILL ENCOUNTER PRECIPITATION IN STATE IN CODE TABLE 23031 0 0 2 CODE TABLE 23031 0 1
+ 023032 PLUME WILL ENCOUNTER CHANGE IN WIND DIRECTION AND/OR SPEED FLAG CODE TABLE 23032 0 0 2 CODE TABLE 23032 0 1
+ 024001 ESTIMATE OF AMOUNT OF RADIOACTIVITY RELEASED UP TO SPECIFIED TIM Bq -11 0 28 Bq -11 9
+ 024002 ESTIMATED MAXIMUM POTENTIAL RELEASE Bq -11 0 28 Bq -11 9
+ 024003 COMPOSITION OF RELEASE CODE TABLE 24003 0 0 5 CODE TABLE 24003 0 2
+ 024004 ELEMENT NAME CCITTIA5 0 0 16 CHARACTER 0 2
+ 024005 ISOTOPE MASS NUMERIC 0 0 9 NUMERIC 0 3
+ 024011 DOSE mSv 2 0 32 mSv 2 10
+ 024012 TRAJECTORY DOSE (DEFINED LOCATION AND EXPECTED TIME OF ARRIVAL) mSv 2 0 32 mSv 2 10
+ 024013 GAMMA DOSE IN AIR ALONG THE MAIN TRANSPORT PATH (DEFINED LOCATIO mSv 2 0 32 mSv 2 10
+ 024021 AIR CONCENTRATION (OF NAMED ISOTOPE TYPE INCLUDING GROSS BETA) Bq/M**3 2 0 32 Bq/M**3 2 10
+ 024022 CONCENTRATION IN PRECIPITATION (OF NAMES ISOTOPE TYPE) Bq/L 2 0 32 BQ L-1 2 10
+ 024023 PULSE RATE OF BETA RADIATION 1/S 1 0 14 1/S 1 4
+ 024024 PULSE RATE OF GAMMA RADIATION 1/S 1 0 14 1/S 1 4
+ 025001 RANGE-GATE LENGTH M -1 0 6 M -1 2
+ 025002 NUMBER OF GATES AVERAGED NUMERIC 0 0 4 NUMERIC 0 2
+ 025003 NUMBER OF INTEGRATED PULSES NUMERIC 0 0 8 NUMERIC 0 3
+ 025004 ECHO PROCESSING CODE TABLE 25004 0 0 2 CODE TABLE 25004 0 1
+ 025005 ECHO INTEGRATION CODE TABLE 25005 0 0 2 CODE TABLE 25005 0 1
+ 025006 Z TO R CONVERSION CODE TABLE 25006 0 0 3 CODE TABLE 25006 0 1
+ 025007 Z TO R CONVERSION FACTOR NUMERIC 0 0 12 NUMERIC 0 4
+ 025008 Z TO R CONVERSION EXPONENT NUMERIC 2 0 9 NUMERIC 2 3
+ 025009 CALIBRATION METHOD FLAG TABLE 25009 0 0 4 FLAG TABLE 25009 0 2
+ 025010 CLUTTER TREATMENT CODE TABLE 25010 0 0 4 CODE TABLE 25010 0 2
+ 025011 GROUND OCCULTATION CORRECTION (SCREENING) CODE TABLE 25011 0 0 2 CODE TABLE 25011 0 1
+ 025012 RANGE ATTENUATION CORRECTION CODE TABLE 25012 0 0 2 CODE TABLE 25012 0 1
+ 025013 BRIGHT-BAND CORRECTION FLAG TABLE 25013 0 0 2 FLAG TABLE 25013 0 1
+ 025014 AZIMUTH CLUTTER CUT-OFF (SEE NOTE 1) NUMERIC 0 0 12 NUMERIC 0 4
+ 025015 RADOME ATTENUATION CORRECTION FLAG TABLE 25015 0 0 2 FLAG TABLE 25015 0 1
+ 025016 CLEAR-AIR ATTENUATION CORRECTION dB/M 5 0 6 dB/M 5 2
+ 025017 PRECIPITATION ATTENUATION CORRECTION FLAG TABLE 25017 0 0 2 FLAG TABLE 25017 0 1
+ 025018 A TO Z LAW FOR ATTENUATION FACTOR NUMERIC 7 0 6 NUMERIC 7 2
+ 025019 A TO Z LAW FOR ATTENUATION EXPONENT NUMERIC 2 0 7 NUMERIC 2 3
+ 025020 MEAN SPEED ESTIMATION CODE TABLE 25020 0 0 2 CODE TABLE 25020 0 1
+ 025021 WIND COMPUTATION ENHANCEMENT FLAG TABLE 25021 0 0 8 FLAG TABLE 25021 0 3
+ 025025 BATTERY VOLTAGE V 1 0 9 V 1 3
+ 025026 BATTERY VOLTAGE (LARGE RANGE) V 1 0 12 V 1 4
+ 025028 OPERATOR OR MANUFACTURER DEFINED PARAMETER NUMERIC 1 -16384 15 NUMERIC 1 5
+ 025030 RUNNING MEAN SEA-SURFACE TEMPERATURE USAGE CODE TABLE 25030 0 0 2 CODE TABLE 25030 0 1
+ 025032 WIND PROFILER MODE INFORMATION CODE TABLE 25032 0 0 2 CODE TABLE 25032 0 1
+ 025033 WIND PROFILER SUBMODE INFORMATION* CODE TABLE 25033 0 0 2 CODE TABLE 25033 0 1
+ 025034 WIND PROFILER QUALITY CONTROL TEST RESULTS* FLAG TABLE 25034 0 0 4 FLAG TABLE 25034 0 2
+ 025036 ATMOSPHERICS LOCATION METHOD CODE TABLE 25036 0 0 4 CODE TABLE 25036 0 2
+ 025040 CO2 WIND PRODUCT DERIVATION CODE TABLE 25040 0 0 4 CODE TABLE 25040 0 2
+ 025041 MOVING PLATFORM DIRECTION REPORTING METHOD CODE TABLE 25041 0 0 2 CODE TABLE 25041 0 1
+ 025042 MOVING PLATFORM SPEED REPORTING METHOD CODE TABLE 25042 0 0 2 CODE TABLE 25042 0 1
+ 025043 WAVE SAMPLING INTERVAL (TIME) S 4 0 15 S 4 5
+ 025044 WAVE SAMPLING INTERVAL (SPACE) M 2 0 14 M 2 5
+ 025045 HIRS CHANNEL COMBINATION FLAG TABLE 25045 0 0 21 FLAG TABLE 25045 0 7
+ 025046 MSU CHANNEL COMBINATION FLAG TABLE 25046 0 0 5 FLAG TABLE 25046 0 2
+ 025047 SSU CHANNEL COMBINATION FLAG TABLE 25047 0 0 4 FLAG TABLE 25047 0 2
+ 025048 AMSU-A CHANNEL COMBINATION FLAG TABLE 25048 0 0 16 FLAG TABLE 25048 0 6
+ 025049 AMSU-B CHANNEL COMBINATION FLAG TABLE 25049 0 0 6 FLAG TABLE 25049 0 2
+ 025051 AVHRR CHANNEL COMBINATION FLAG TABLE 25051 0 0 7 FLAG TABLE 25051 0 3
+ 025052 LOG-10 OF PRINCIPAL COMPONENTS NORMALIZED FIT TO DATA NUMERIC 4 0 15 NUMERIC 4 5
+ 025053 OBSERVATION QUALITY FLAG TABLE 25053 0 0 12 FLAG TABLE 25053 0 4
+ 025054 SSMIS SUBFRAME ID NEMBER NUMERIC 0 0 5 NUMERIC 0 2
+ 025055 MULTIPLEXER HOUSEKEEPING K 2 0 16 K 2 5
+ 025060 SOFTWARE IDENTIFICATION (SEE NOTE 2) NUMERIC 0 0 14 NUMERIC 0 5
+ 025061 SOFTWARE IDENTIFICATION AND VERSION NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 025062 DATABASE IDENTIFICATION NUMERIC 0 0 14 NUMERIC 0 5
+ 025065 ORIENTATION CORRECTION (AZIMUTH) DEGREE 2 -1000 11 DEGREE 2 4
+ 025066 ORIENTATION CORRECTION (ELEVATION) DEGREE 2 -1000 11 DEGREE 2 4
+ 025067 RADIOSONDE RELEASE POINT PRESSURE CORRECTION PA 0 -8000 14 PA 0 4
+ 025068 NUMBER OF ARCHIVE RECOMPUTES NUMERIC 0 0 7 NUMERIC 0 3
+ 025069 FLIGHT LEVEL PRESSURE CORRECTIONS FLAG TABLE 25069 0 0 8 FLAG TABLE 25069 0 3
+ 025070 MAJOR FRAME COUNT NUMERIC 0 0 4 NUMERIC 0 2
+ 025071 FRAME COUNT NUMERIC 0 0 5 NUMERIC 0 2
+ 025075 SATELLITE ANTENNA CORRECTIONS VERSION NUMBER NUMERIC 0 0 5 NUMERIC 0 2
+ 025076 LOG-10 OF (TEMPERATURE-RADIANCE CENTRAL WAVENUMBER) FOR ATOVS LOG (1/M) 8 0 30 LOG (1/M) 8 10
+ 025077 BANDWIDTH CORRECTION COEFFICIENT 1 FOR ATOVS NUMERIC 5 -100000 18 NUMERIC 5 7
+ 025078 BANDWIDTH CORRECTION COEFFICIENT 2 FOR ATOVS NUMERIC 5 0 17 NUMERIC 5 6
+ 025079 ALBEDO-RADIANCE SOLAR FILTERED IRRADIANCE FOR ATOVS W/M**2 4 0 24 W/M**2 4 8
+ 025080 ALBEDO-RADIANCE EQUIVALENT FILTER WIDTH FOR ATOVS M 10 0 14 M 10 5
+ 025085 FRACTION OF CLEAR PIXELS IN HIRS FOV NUMERIC 0 0 7 NUMERIC 0 3
+ 025086 DEPTH CORRECTION INDICATOR CODE TABLE 25086 0 0 2 CODE TABLE 25086 0 1
+ 025091 STRUCTURE CONSTANT OF THE REFRACTION INDEX (CN2) dB 3 -18192 13 dB 3 5
+ 025092 ACOUSTIC PROPAGATION VELOCITY M/S 2 28000 14 M/S 2 5
+ 025093 RASS COMPUTATION CORRECTION FLAG TABLE 25093 0 0 8 FLAG TABLE 25093 0 3
+ 025095 ALTIMETER STATE FLAG FLAG TABLE 25095 0 0 2 FLAG TABLE 25095 0 1
+ 025096 RADIOMETER STATE FLAG FLAG TABLE 25096 0 0 5 FLAG TABLE 25096 0 2
+ 025097 THREE DIMENSIONAL ERROR ESTIMATE OF THE NAVIGATOR ORBIT CODE TABLE 25097 0 0 4 CODE TABLE 25097 0 2
+ 025100 XBT/XCTD FALL RATE EQUATION COEFFICIENT A NUMERIC 5 0 20 NUMERIC 5 6
+ 025101 XBT/XCTD FALL RATE EQUATION COEFFICIENT B NUMERIC 5 -500000 21 NUMERIC 5 6
+ 025102 NUMBER OF MISSING LINES EXCLUDING DATA GAPS NUMERIC 0 0 8 NUMERIC 0 3
+ 025103 NUMBER OF DIRECTIONAL BINS NUMERIC 0 0 8 NUMERIC 0 3
+ 025104 NUMBER OF WAVE-LENGTH BINS NUMERIC 0 0 8 NUMERIC 0 3
+ 025107 FIRST WAVE-LENGTH BIN M 3 0 29 M 3 9
+ 025108 LAST WAVE-LENGTH BIN M 3 0 29 M 3 9
+ 025111 NUMBER OF INPUT DATA GAPS NUMERIC 0 0 8 NUMERIC 0 3
+ 025120 RA2-L2-PROCESSING FLAG CODE TABLE 25120 0 0 2 CODE TABLE 25120 0 1
+ 025121 RA2-L2-PROCESSING QUALITY % 0 0 7 % 0 3
+ 025122 HARDWARE CONFIGURATION FOR RF CODE TABLE 25122 0 0 2 CODE TABLE 25122 0 1
+ 025123 HARDWARE CONFIGURATION FOR HPA CODE TABLE 25123 0 0 2 CODE TABLE 25123 0 1
+ 025124 MWR L2 PROCESSING FLAG CODE TABLE 25124 0 0 2 CODE TABLE 25124 0 1
+ 025125 MWR L2-PROCESSING QUALITY % 0 0 7 % 0 3
+ 025126 MODEL DRY TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025127 INVERTED BAROMETER CORRECTION M 3 -32768 16 M 3 5
+ 025128 MODEL WET TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025129 MWR DERIVED WET TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025130 RA2 IONOSPHERIC CORRECTION ON KU BAND M 3 -32768 16 M 3 5
+ 025131 IONOSPHERIC CORRECTION FROM DORIS ON KU BAND M 3 -32768 16 M 3 5
+ 025132 IONOSPHERIC CORRECTION FROM MODEL ON KU BAND M 3 -32768 16 M 3 5
+ 025133 SEA STATE BIAS CORRECTION ON KU BAND M 3 -32768 16 M 3 5
+ 025134 RA2 IONOSPHERIC CORRECTION ON S BAND M 3 -32768 16 M 3 5
+ 025135 IONOSPHERIC CORRECTION FROM DORIS ON S BAND M 3 -32768 16 M 3 5
+ 025136 IONOSPHERIC CORRECTION FROM MODEL ON S BAND M 3 -32768 16 M 3 5
+ 025137 SEA STATE BIAS CORRECTION ON S BAND M 3 -32768 16 M 3 5
+ 025138 AVERAGE SIGNAL TO NOISE RATION NUMERIC 0 -2048 12 NUMERIC 0 4
+ 025140 START CHANNEL NUMERIC 0 0 14 NUMERIC 0 5
+ 025141 END CHANNEL NUMERIC 0 0 14 NUMERIC 0 5
+ 025142 CHANNEL SCALE FACTOR NUMERIC 0 0 6 NUMERIC 0 2
+ 025150 SATELLITE INTENSITY ANALYSIS METHOD OF TROPICAL CYCLONE CODE TABLE 25150 0 0 4 CODE TABLE 25150 2 2
+ 026001 PRINCIPAL TIME OF DAILY READING IN UTC OF MAXIMUM TEMPERATURE HOUR 1 0 12 HOUR 1 3
+ 026002 PRINCIPAL TIME OF DAILY READING IN UTC OF MINIMUM TEMPERATURE HOUR 1 0 12 HOUR 1 3
+ 026003 TIME DIFFERENCE MINUTE 0 -1440 12 MINUTE 0 4
+ 026010 HOURS INCLUDED FLAG TABLE 26010 0 0 26 FLAG TABLE 26010 0 9
+ 026020 DURATION OF PRECIPITATION MINUTE 0 0 11 MINUTE 0 4
+ 027001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 027002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 027003 ALTERNATE LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 027004 ALTERNATE LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 027020 SATELLITE LOCATION COUNTER NUMERIC 0 0 16 NUMERIC 0 5
+ 027021 SATELLITE SUBLOCATION DIMENSION NUMERIC 0 0 16 NUMERIC 0 5
+ 027031 IN DIRECTION OF 0 DEGREES LONGITUDE, DISTANCE FROM THE EARTH'S C M 2 -1073741824 31 M 2 10
+ 027080 VIEWING AZIMUTH ANGLE DEGREE TRUE 2 0 16 DEGREE TRUE 0 5
+ 028001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 028002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 028003 ALTERNATE LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 028004 ALTERNATE LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 028031 IN DIRECTION 90 DEGREES EAST, DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31 M 2 10
+ 029001 PROJECTION TYPE CODE TABLE 29001 0 0 3 CODE TABLE 29001 0 1
+ 029002 CO-ORDINATE GRID TYPE CODE TABLE 29002 0 0 3 CODE TABLE 29002 0 1
+ 030001 PIXEL VALUE (4 BITS) NUMERIC 0 0 4 NUMERIC 0 2
+ 030002 PIXEL VALUE (8 BITS) NUMERIC 0 0 8 NUMERIC 0 3
+ 030004 PIXEL VALUE (16 BITS) NUMERIC 0 0 16 NUMERIC 0 5
+ 030021 NUMBER OF PIXELS PER ROW NUMERIC 0 0 12 NUMERIC 0 4
+ 030022 NUMBER OF PIXELS PER COLUMN NUMERIC 0 0 12 NUMERIC 0 4
+ 030031 PICTURE TYPE CODE TABLE 30031 0 0 4 CODE TABLE 30031 0 2
+ 030032 COMBINATION WITH OTHER DATA FLAG TABLE 30032 0 0 16 FLAG TABLE 30032 0 6
+ 031000 SHORT DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 1 NUMERIC 0 1
+ 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8 NUMERIC 0 3
+ 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16 NUMERIC 0 5
+ 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8 NUMERIC 0 3
+ 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16 NUMERIC 0 5
+ 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 31021 0 0 6 CODE TABLE 31021 0 2
+ 031031 DATA PRESENT INDICATOR FLAG TABLE 31031 0 0 1 FLAG TABLE 31031 0 1
+ 033002 QUALITY INFORMATION CODE TABLE 33002 0 0 2 CODE TABLE 33002 0 1
+ 033003 QUALITY INFORMATION CODE TABLE 33003 0 0 3 CODE TABLE 33003 0 1
+ 033005 QUALITY INFORMATION (AWS DATA) FLAG TABLE 33005 0 0 30 FLAG TABLE 33005 0 10
+ 033006 INTERNAL MEASUREMENT STATUS INFORMATION (AWS) CODE TABLE 33006 0 0 3 CODE TABLE 33006 0 1
+ 033007 PER CENT CONFIDENCE % 0 0 7 % 0 3
+ 033015 DATA QUALITY CHECK INDICATOR CODE TABLE 33015 0 0 6 CODE TABLE 33015 0 2
+ 033020 QUALITY CONTROL INDICATION OF FOLLOWING VALUE CODE TABLE 33020 0 0 3 CODE TABLE 33020 0 1
+ 033021 QUALITY OF FOLLOWING VALUE CODE TABLE 33021 0 0 2 CODE TABLE 33021 0 1
+ 033022 QUALITY OF BUOY SATELLITE TRANSMISSION CODE TABLE 33022 0 0 2 CODE TABLE 33022 0 1
+ 033023 QUALITY OF BUOY LOCATION CODE TABLE 33023 0 0 2 CODE TABLE 33023 0 1
+ 033024 STATION ELEVATION QUALITY MARK (FOR MOBILE STATIONS) CODE TABLE 33024 0 0 4 CODE TABLE 33024 0 2
+ 033025 ACARS INTERPOLATED VALUES CODE TABLE 33025 0 0 3 CODE TABLE 33025 0 1
+ 033026 MOISTURE QUALITY CODE TABLE 33026 0 0 6 CODE TABLE 33026 0 2
+ 033027 LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66 % CONFIDENCE) CODE TABLE 33027 0 0 3 CODE TABLE 33027 0 1
+ 033030 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 33030 0 0 24 FLAG TABLE 33030 0 8
+ 033031 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 33031 0 0 24 FLAG TABLE 33031 0 8
+ 033032 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 33032 0 0 24 FLAG TABLE 33032 0 8
+ 033033 FIELD OF VIEW QUALITY FLAGS FOR ATOVS FLAG TABLE 33033 0 0 24 FLAG TABLE 33033 0 8
+ 033035 MANUAL/AUTOMATIC QUALITY CONTROL CODE TABLE 33035 0 0 4 CODE TABLE 33035 0 2
+ 033036 NOMINAL CONFIDENCE THRESHOLD % 0 0 7 % 0 3
+ 033037 WIND CORRELATION ERROR FLAG TABLE 33037 0 0 20 FLAG TABLE 33037 0 7
+ 033038 QUALITY FLAGS FOR GROUND-BASED GNSS DATA FLAG TABLE 33038 0 0 10 FLAG TABLE 33038 0 4
+ 033039 QUALITY FLAGS FOR RADIO OCCULTATION DATA FLAG TABLE 33039 0 0 16 FLAG TABLE 33039 0 6
+ 033040 CONFIDENCE INTERVAL % 0 0 7 PERCENT 0 3
+ 033041 ATTRIBUTE OF FOLLOWING VALUE CODE TABLE 33041 0 0 2 CODE TABLE 33041 0 1
+ 033042 TYPE OF LIMIT REPRESENTED BY FOLLOWING VALUE CODE TABLE 33042 0 0 3 CODE TABLE 33042 0 1
+ 033043 AST CONFIDENCE FLAG TABLE 33043 0 0 8 FLAG TABLE 33043 0 3
+ 033044 ASAR QUALITY INFORMATION FLAG TABLE 33044 0 0 15 FLAG TABLE 33044 0 5
+ 033045 PROBABILITY OF FOLLOWING EVENT % 0 0 7 % 0 3
+ 033046 CONDITIONAL PROBABILITY OF FOLLOWING EVENT WITH RESPECT TO SPECI % 0 0 7 % 0 3
+ 033047 MEASUREMENT CONFIDENCE DATA FLAG TABLE 33047 0 0 31 FLAG TABLE 33047 0 11
+ 033048 CONFIDENCE MEASURE OF SAR INVERSION CODE TABLE 33048 0 0 2 CODE TABLE 33048 0 1
+ 033049 CONFIDENCE MEASURE OF WIND RETRIEVAL CODE TABLE 33049 0 0 2 CODE TABLE 33049 0 1
+ 033050 GLOBAL GTSPP QUALITY FLAG CODE TABLE 33050 0 0 4 CODE TABLE 33050 0 2
+ 033052 S BAND OCEAN RETRACKING QUALITY FLAG TABLE 33052 0 0 21 FLAG TABLE 33052 0 7
+ 033053 KU BAND OCEAN RETRACKING QUALITY FLAG TABLE 33053 0 0 21 FLAG TABLE 33053 0 7
+ 033060 GQISFLAGQUAL-INDIVIDUAL IASI-SYSTEM QUALITY FLAG CODE TABLE 33060 0 0 2 CODE TABLE 33060 0 1
+ 033061 GQISQUALINDEX - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE % 0 0 7 % 0 3
+ 033062 GQISQUALINDEXLOC - INDICATOR FOR GEOMETRIC QUALITY INDEX % 0 0 7 % 0 3
+ 033063 GQISQUALINDEXRAD - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE % 0 0 7 % 0 3
+ 033064 GQISQUALINDEXSPECT - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE % 0 0 7 % 0 3
+ 033065 GQISSYSTECSONDQUAL - OUTPUT OF SYSTEM TEC QUALITY FUNCTION NUMERIC 0 0 24 NUMERIC 0 24
+ 033066 SBUV TOTAL OZONE QUALITY CODE TABLE 33066 0 0 4 CODE TABLE 33066 0 2
+ 033067 SBUV PROFILE OZONE QUALITY CODE TABLE 33067 0 0 4 CODE TABLE 33067 0 2
+ 035000 FM AND REGIONAL CODE NUMBER CODE TABLE 35000 0 0 10 CODE TABLE 35000 0 3
+ 035001 TIME-FRAME FOR MONITORING CODE TABLE 35001 0 0 3 CODE TABLE 35001 0 1
+ 035011 NUMBER OF REPORTS ACTUALLY RECEIVED NUMERIC 0 0 14 NUMERIC 0 4
+ 035021 BULLETIN BEING MONITORED (TTAAII) CCITTIA5 0 0 48 CHARACTER 0 6
+ 035022 BULLETIN BEING MONITORED (YYGGGG) CCITTIA5 0 0 48 CHARACTER 0 6
+ 035023 BULLETIN BEING MONITORED (CCCC) CCITTIA5 0 0 32 CHARACTER 0 4
+ 035024 BULLETIN BEING MONITORED (BBB) CCITTIA5 0 0 24 CHARACTER 0 3
+ 035030 DISCREPANCIES IN THE AVAILABILITY OF EXPECTED DATA CODE TABLE 35030 0 0 4 CODE TABLE 35030 0 1
+ 035031 QUALIFIER ON MONITORING RESULTS CODE TABLE 35031 0 0 7 CODE TABLE 35031 0 2
+ 035032 CAUSE OF MISSING DATA CODE TABLE 35032 0 0 4 CODE TABLE 35032 0 1
+ 035033 OBSERVATION AND COLLECTION DEFICIENCIES CODE TABLE 35033 0 0 7 CODE TABLE 35033 0 2
+ 035034 STATISTICAL TRENDS FOR AVAILABILITY OF DATA (DURING THE SURVEY P CODE TABLE 35034 0 0 3 CODE TABLE 35034 0 1
+ 035035 REASON FOR TERMINATION CODE TABLE 35035 0 0 5 CODE TABLE 35035 0 2
+ 040001 SURFACE SOIL MOISTURE (MS) % 1 0 10 % 1 4
+ 040002 ESTIMATED ERROR IN SURFACE SOIL MOISTURE % 1 0 10 % 1 4
+ 040003 MEAN SURFACE SOIL MOISTURE NUMERIC 3 0 10 NUMERIC 3 4
+ 040004 RAIN FALL DETECTION NUMERIC 3 0 10 NUMERIC 3 4
+ 040005 SOIL MOISTURE CORRECTION FLAG FLAG TABLE 40005 0 0 8 FLAG FLAG TABLE 40005 0 3
+ 040006 SOIL MOISTURE PROCESSING FLAG FLAG TABLE 40006 0 0 16 FLAG FLAG TABLE 40006 0 5
+ 040007 SOIL MOISTURE QUALITY % 1 0 10 % 1 4
+ 040008 FROZEN LAND SURFACE FRACTION % 1 0 10 % 1 4
+ 040009 INUNDATION AND WETLAND FRACTION % 1 0 10 % 1 4
+ 040010 TOPOGRAPHIC COMPLEXITY % 1 0 10 % 1 4
diff --git a/crextables/B000103 b/crextables/B000103
new file mode 100755
index 0000000..176d728
--- /dev/null
+++ b/crextables/B000103
@@ -0,0 +1,1197 @@
+ 000001 TABLE A: ENTRY CCITTIA5 0 0 24 CHARACTER 0 3
+ 000002 TABLE A: DATA CATEGORY DESCRIPTION, LINE 1 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000003 TABLE A: DATA CATEGORY DESCRIPTION, LINE 2 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000004 BUFR/CREX MASTER TABLE CCITTIA5 0 0 16 CHARACTER 0 2
+ 000005 BUFR/CREX EDITION NUMBER CCITTIA5 0 0 24 CHARACTER 0 3
+ 000006 BUFR MASTER TABLE VERSION NUMBER CCITTIA5 0 0 16 CHARACTER 0 2
+ 000007 CREX MASTER TABLE VERSION NUMBER CCITTIA5 0 0 16 CHARACTER 0 2
+ 000008 BUFR LOCAL TABLE VERSION NUMBER CCITTIA5 0 0 16 CHARACTER 0 2
+ 000010 F DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 8 CHARACTER 0 1
+ 000011 X DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 16 CHARACTER 0 2
+ 000012 Y DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 24 CHARACTER 0 3
+ 000013 ELEMENT NAME, LINE 1 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000014 ELEMENT NAME, LINE 2 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000015 UNITS NAME CCITTIA5 0 0 192 CHARACTER 0 24
+ 000016 UNITS SCALE SIGN CCITTIA5 0 0 8 CHARACTER 0 1
+ 000017 UNITS SCALE CCITTIA5 0 0 24 CHARACTER 0 3
+ 000018 UNITS REFERENCE SIGN CCITTIA5 0 0 8 CHARACTER 0 1
+ 000019 UNITS REFERENCE VALUE CCITTIA5 0 0 80 CHARACTER 0 10
+ 000020 ELEMENT DATA WIDTH CCITTIA5 0 0 24 CHARACTER 0 3
+ 000030 DESCRIPTOR DEFINING SEQUENCE CCITTIA5 0 0 48 CHARACTER 0 6
+ 001001 WMO BLOCK NUMBER NUMERIC 0 0 7 NUMERIC 0 2
+ 001002 WMO STATION NUMBER NUMERIC 0 0 10 NUMERIC 0 3
+ 001003 WMO REGION NUMBER/GEOGRAPHICAL AREA CODE TABLE 1003 0 0 3 CODE TABLE 1003 0 1
+ 001004 WMO REGION SUB-AREA (SEE NOTE 9) NUMERIC 0 0 3 NUMERIC 0 1
+ 001005 BUOY/PLATFORM IDENTIFIER NUMERIC 0 0 17 NUMERIC 0 5
+ 001006 AIRCRAFT FLIGHT NUMBER CCITTIA5 0 0 64 CHARACTER 0 8
+ 001007 SATELLITE IDENTIFIER CODE TABLE 1007 0 0 10 CODE TABLE 1007 0 4
+ 001008 AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION CCITTIA5 0 0 64 CHARACTER 0 8
+ 001009 TYPE OF COMMERCIAL AIRCRAFT CCITTIA5 0 0 64 CHARACTER 0 8
+ 001010 STATIONARY BUOY PLATFORM IDENTIFIER; E.G. C-MAN BUOYS CCITTIA5 0 0 64 CHARACTER 0 8
+ 001011 SHIP OR MOBILE LAND STATION IDENTIFIER CCITTIA5 0 0 72 CHARACTER 0 9
+ 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM* M/S 0 0 10 M/S 0 3
+ 001014 PLATFORM DRIFT SPEED (HIGH PRECISION) M/S 2 0 10 M/S 2 4
+ 001015 STATION OR SITE NAME CCITTIA5 0 0 160 CHARACTER 0 20
+ 001018 SHORT STATION OR SITE NAME CCITTIA5 0 0 40 CHARACTER 0 5
+ 001019 LONG STATION OR SITE NAME CCITTIA5 0 0 256 CHARACTER 0 32
+ 001020 WMO REGION SUB-AREA NUMERIC 0 0 4 NUMERIC 0 2
+ 001021 SYNOPTIC FEATURE IDENTIFIER NUMERIC 0 0 14 NUMERIC 0 4
+ 001022 NAME OF FEATURE (SEE NOTE 11) CCITTIA5 0 0 224 CHARACTER 0 28
+ 001023 OBSERVATION SEQUENCE NUMBER NUMERIC 0 0 9 NUMERIC 0 3
+ 001025 STORM IDENTIFIER CCITTIA5 0 0 24 CHARACTER 0 3
+ 001026 WMO STORM NAME CCITTIA5 0 0 64 CHARACTER 0 8
+ 001027 WMO LONG STORM NAME CCITTIA5 0 0 80 CHARACTER 0 10
+ 001031 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE (SEE NOTE 10) CODE TABLE 1031 0 0 16 CODE TABLE 1031 0 5
+ 001032 GENERATING APPLICATION CODE TABLE 1032 0 0 8 CODE TABLE 1032 0 3
+ 001033 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE CODE TABLE 1033 0 0 8 CODE TABLE 1033 0 3
+ 001034 IDENTIFICATION OF ORIGINATING/GENERATING SUB-CENTRE CODE TABLE 1034 0 0 8 CODE TABLE 1034 0 3
+ 001035 ORIGINATING CENTRE COMMON CODE TABLE C-11 0 0 16 COMMON CODE TABLE C-11 0 5
+ 001036 AGENCY IN CHARGE OF OPERATING THE OBSERVING PLATFORM CODE TABLE 1036 0 0 20 CODE TABLE 1036 0 7
+ 001041 ABSOLUTE PLATFORM VELOCITY - FIRST COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001042 ABSOLUTE PLATFORM VELOCITY - SECOND COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001043 ABSOLUTE PLATFORM VELOCITY - THIRD COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001050 PLATFORM TRANSMITTER ID NUMBER NUMERIC 0 0 17 NUMERIC 0 6
+ 001051 PLATFORM TRANSMITTER ID NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 001060 AIRCRAFT REPORTING POINT (BEACON IDENTIFIER) CCITTIA5 0 0 64 CHARACTER 0 8
+ 001062 SHORT ICAO LOCATION INDICATOR CCITTIA5 0 0 32 CHARACTER 0 4
+ 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64 CHARACTER 0 8
+ 001064 RUNWAY DESIGNATOR CCITTIA5 0 0 32 CHARACTER 0 4
+ 001075 TIDE STATION IDENTIFICATION CCITTIA5 0 0 40 CHARACTER 0 5
+ 001080 SHIP LINE NUMBER ACCORDING TO SOOP CCITTIA5 0 0 32 CHARACTER 0 4
+ 001081 RADIOSONDE SERIAL NUMBER CCITTIA5 0 0 160 CHARACTER 0 20
+ 001082 RADIOSONDE ASCENSION NUMBER (SEE NOTE 12) NUMERIC 0 0 14 NUMERIC 0 4
+ 001083 RADIOSONDE RELEASE NUMBER (SEE NOTE 12) NUMERIC 0 0 3 NUMERIC 0 1
+ 001085 OBSERVING PLATFORM MANUFACTURER'S MODEL CCITTIA5 0 0 160 CHARACTER 0 20
+ 001086 OBSERVING PLATFORM MANUFACTURER'S SERIAL NUMBER CCITTIA5 0 0 256 CHARACTER 0 32
+ 001087 WMO MARINE OBSERVING PLATFORM EXTENDED IDENTIFIER NUMERIC 0 0 23 NUMERIC 0 7
+ 001090 TECHNIQUE FOR MAKING UP INITIAL PERTURBATIONS CODE TABLE 1090 0 0 8 CODE TABLE 1090 0 3
+ 001091 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 10 NUMERIC 0 4
+ 001092 TYPE OF ENSEMBLE FORECAST CODE TABLE 1092 0 0 8 CODE TABLE 1092 0 3
+ 001093 BALLOON LOT NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 001094 WBAN NUMBER NUMERIC 0 0 17 NUMERIC 0 5
+ 001095 OBSERVER IDENTIFICATION CCITTIA5 0 0 32 CHARACTER 0 4
+ 001096 STATION ACQUISITION CCITTIA5 0 0 160 CHARACTER 0 20
+ 002001 TYPE OF STATION CODE TABLE 2001 0 0 2 CODE TABLE 2001 0 1
+ 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 2002 0 0 4 FLAG TABLE 2002 0 2
+ 002003 TYPE OF MEASURING EQUIPMENT USED CODE TABLE 2003 0 0 4 CODE TABLE 2003 0 2
+ 002004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUREMENT OR TYPE OF C CODE TABLE 2004 0 0 4 CODE TABLE 2004 0 2
+ 002005 PRECISION OF TEMPERATURE OBSERVATION K 2 0 7 K 2 3
+ 002011 RADIOSONDE TYPE CODE TABLE 2011 0 0 8 CODE TABLE 2011 0 3
+ 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 2012 0 0 4 CODE TABLE 2012 0 2
+ 002013 SOLAR AND INFRARED RADIATION CORRECTION CODE TABLE 2013 0 0 4 CODE TABLE 2013 0 2
+ 002014 TRACKING TECHNIQUE/STATUS OF SYSTEM USED CODE TABLE 2014 0 0 7 CODE TABLE 2014 0 3
+ 002015 RADIOSONDE COMPLETENESS CODE TABLE 2015 0 0 4 CODE TABLE 2015 0 2
+ 002016 RADIOSONDE CONFIGURATION FLAG TABLE 2016 0 0 5 FLAG TABLE 2016 0 2
+ 002019 SATELLITE INSTRUMENTS CODE TABLE 2019 0 0 11 CODE TABLE 2019 0 4
+ 002020 SATELLITE CLASSIFICATION CODE TABLE 2020 0 0 9 CODE TABLE 2020 0 3
+ 002021 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 2021 0 0 9 FLAG TABLE 2021 0 3
+ 002022 SATELLITE DATA-PROCESSING TECHNIQUE USED FLAG TABLE 2022 0 0 8 FLAG TABLE 2022 0 3
+ 002023 SATELLITE DERIVED WIND COMPUTATION METHOD CODE TABLE 2023 0 0 4 CODE TABLE 2023 0 2
+ 002024 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2024 0 0 4 CODE TABLE 2024 0 2
+ 002025 SATELLITE CHANNEL(S) USED IN COMPUTATION FLAG TABLE 2025 0 0 25 FLAG TABLE 2025 0 9
+ 002026 CROSS TRACK RESOLUTION M 2 0 12 M 2 4
+ 002027 ALONG TRACK RESOLUTION M 2 0 12 M 2 4
+ 002028 SEGMENT SIZE AT NADIR IN X DIRECTION M 0 0 18 M 0 6
+ 002029 SEGMENT SIZE AT NADIR IN Y DIRECTION M 0 0 18 M 0 6
+ 002030 METHOD OF CURRENT MEASUREMENT CODE TABLE 2030 0 0 3 CODE TABLE 2030 0 1
+ 002031 DURATION AND TIME OF CURRENT MEASUREMENT CODE TABLE 2031 0 0 5 CODE TABLE 2031 0 2
+ 002032 INDICATOR FOR DIGITIZATION CODE TABLE 2032 0 0 2 CODE TABLE 2032 0 1
+ 002033 METHOD OF SALINITY/DEPTH MEASUREMENT CODE TABLE 2033 0 0 3 CODE TABLE 2033 0 1
+ 002034 DROGUE TYPE CODE TABLE 2034 0 0 5 CODE TABLE 2034 0 2
+ 002035 CABLE LENGTH M 0 0 9 M 0 3
+ 002036 BUOY TYPE CODE TABLE 2036 0 0 2 CODE TABLE 2036 0 1
+ 002037 METHOD OF TIDAL OBSERVATION CODE TABLE 2037 0 0 3 CODE TABLE 2037 0 1
+ 002038 METHOD OF WATER TEMPERATURE AND/OR SALINITY MEASUREMENT CODE TABLE 2038 0 0 4 CODE TABLE 2038 0 2
+ 002039 METHOD OF WET-BULB TEMPERATURE MEASUREMENT CODE TABLE 2039 0 0 3 CODE TABLE 2039 0 1
+ 002040 METHOD OF REMOVING VELOCITY AND MOTION OF PLATFORM FROM CURRENT CODE TABLE 2040 0 0 4 CODE TABLE 2040 0 2
+ 002041 METHOD FOR ESTIMATING REPORTS RELATED TO SYNOPTIC FEATURES CODE TABLE 2041 0 0 6 CODE TABLE 2041 0 2
+ 002042 INDICATOR FOR SEA SURFACE CURRENT SPEED CODE TABLE 2042 0 0 2 CODE TABLE 2042 0 1
+ 002044 INDICATOR FOR METHOD OF CALCULATING SPECTRAL WAVE DATA CODE TABLE 2044 0 0 4 CODE TABLE 2044 0 2
+ 002045 INDICATOR FOR TYPE OF PLATFORM CODE TABLE 2045 0 0 4 CODE TABLE 2045 0 2
+ 002046 WAVE MEASUREMENT INSTRUMENTATION CODE TABLE 2046 0 0 4 CODE TABLE 2046 0 2
+ 002048 SATELLITE SENSOR INDICATOR CODE TABLE 2048 0 0 4 CODE TABLE 2048 0 2
+ 002049 GEOSTATIONARY SATELLITE DATA-PROCESSING TECHNIQUE USED FLAG TABLE 2049 0 0 8 FLAG TABLE 2049 0 3
+ 002050 GEOSTATIONARY SOUNDER SATELLITE CHANNELS USED FLAG TABLE 2050 0 0 20 FLAG TABLE 2050 0 7
+ 002051 INDICATOR TO SPECIFY OBSERVING METHOD FOR EXTREME TEMPERATURES CODE TABLE 2051 0 0 4 CODE TABLE 2051 0 2
+ 002052 GEOSTATIONARY IMAGER SATELLITE CHANNELS USED FLAG TABLE 2052 0 0 6 FLAG TABLE 2052 0 2
+ 002053 GOES-I/M BRIGHTNESS TEMPERATURE CHARACTERISTICS CODE TABLE 2053 0 0 4 CODE TABLE 2053 0 2
+ 002054 GOES-I/M SOUNDINGS PARAMETER CHARACTERISTICS CODE TABLE 2054 0 0 4 CODE TABLE 2054 0 2
+ 002055 GEOSTATIONARY SOUNDINGS STATISTICAL PARAMETERS CODE TABLE 2055 0 0 4 CODE TABLE 2055 0 2
+ 002056 GEOSTATIONARY SOUNDINGS ACCURACY STATISTICS CODE TABLE 2056 0 0 4 CODE TABLE 2056 0 2
+ 002057 ORIGIN OF FIRST GUESS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2057 0 0 4 CODE TABLE 2057 0 2
+ 002058 VALID TIMES OF FIRST GUESS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2058 0 0 4 CODE TABLE 2058 0 2
+ 002059 ORIGIN OF ANALYSIS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2059 0 0 4 CODE TABLE 2059 0 2
+ 002060 ORIGIN OF SURFACE INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2060 0 0 4 CODE TABLE 2060 0 2
+ 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 2061 0 0 3 CODE TABLE 2061 0 1
+ 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 2062 0 0 4 CODE TABLE 2062 0 2
+ 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16 DEGREE 2 5
+ 002064 AIRCRAFT ROLL ANGLE QUALITY CODE TABLE 2064 0 0 2 CODE TABLE 2064 0 1
+ 002065 ACARS GROUND RECEIVING STATION CCITTIA5 0 0 40 CHARACTER 0 5
+ 002066 RADIOSONDE GROUND RECEIVING SYSTEM CODE TABLE 2066 0 0 6 CODE TABLE 2066 0 2
+ 002067 RADIOSONDE OPERATING FREQUENCY Hz -5 0 15 Hz -5 5
+ 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 2070 0 0 4 CODE TABLE 2070 0 2
+ 002080 BALLOON MANUFACTURER CODE TABLE 2080 0 0 6 CODE TABLE 2080 0 2
+ 002081 TYPE OF BALLOON CODE TABLE 2081 0 0 5 CODE TABLE 2081 0 2
+ 002082 WEIGHT OF BALLOON KG 3 0 12 KG 3 4
+ 002083 TYPE OF BALLOON SHELTER CODE TABLE 2083 0 0 4 CODE TABLE 2083 0 2
+ 002084 TYPE OF GAS USED IN BALLOON CODE TABLE 2084 0 0 4 CODE TABLE 2084 0 2
+ 002085 AMOUNT OF GAS USED IN BALLOON KG 3 0 13 KG 3 4
+ 002086 BALLOON FLIGHT TRAIN LENGTH M 1 0 10 M 1 4
+ 002091 ENTRY SENSOR 4/20 MA A 4 0 10 A 4 3
+ 002095 TYPE OF PRESSURE SENSOR CODE TABLE 2095 0 0 5 CODE TABLE 2095 0 2
+ 002096 TYPE OF TEMPERATURE SENSOR CODE TABLE 2096 0 0 5 CODE TABLE 2096 0 2
+ 002097 TYPE OF HUMIDITY SENSOR CODE TABLE 2097 0 0 5 CODE TABLE 2097 0 2
+ 002100 RADAR CONSTANT dB 1 0 12 dB 1 4
+ 002101 TYPE OF ANTENNA CODE TABLE 2101 0 0 4 CODE TABLE 2101 0 2
+ 002102 ANTENNA HEIGHT ABOVE TOWER BASE M 0 0 8 M 0 3
+ 002103 RADOME FLAG TABLE 2103 0 0 2 FLAG TABLE 2103 0 1
+ 002104 ANTENNA POLARISATION CODE TABLE 2104 0 0 4 CODE TABLE 2104 0 2
+ 002105 MAXIMUM ANTENNA GAIN dB 0 0 6 dB 0 2
+ 002106 3-DB BEAMWIDTH DEGREE 1 0 6 DEGREE 1 2
+ 002107 SIDELOBE SUPPRESSION dB 0 0 6 dB 0 2
+ 002108 CROSSPOL DISCRIMINATION (ON AXIS) dB 0 0 6 dB 0 2
+ 002109 ANTENNA SPEED (AZIMUTH) DEGREE/S 2 0 12 DEGREE/S 2 4
+ 002110 ANTENNA SPEED (ELEVATION) DEGREE/S 2 0 12 DEGREE/S 2 4
+ 002111 RADAR INCIDENCE ANGLE DEGREE 1 0 10 DEGREE 1 4
+ 002112 RADAR LOOK ANGLE DEGREE 1 0 12 DEGREE 1 4
+ 002113 NUMBER OF AZIMUTH LOOKS NUMERIC 0 0 4 NUMERIC 0 2
+ 002114 ANTENNA EFFECTIVE SURFACE AREA M**2 0 0 15 M**2 0 5
+ 002115 TYPE OF SURFACE OBSERVING EQUIPMENT CODE TABLE 2115 0 0 5 CODE TABLE 2115 0 2
+ 002116 PERCENTAGE OF 320 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002117 PERCENTAGE OF 80 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002118 PERCENTAGE OF 20 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002119 RA-2 INSTRUMENT OPERATIONS CODE TABLE 2119 0 0 3 CODE TABLE 2119 0 1
+ 002120 OCEAN WAVE FREQUENCY Hz 3 0 10 Hz 3 4
+ 002121 MEAN FREQUENCY Hz -8 0 7 Hz -8 3
+ 002122 FREQUENCY AGILITY RANGE Hz -6 -128 8 Hz -6 3
+ 002123 PEAK POWER W -4 0 7 W -4 3
+ 002124 AVERAGE POWER W -1 0 7 W -1 3
+ 002125 PULSE REPETITION FREQUENCY Hz -1 0 8 Hz -1 3
+ 002126 PULSE WIDTH S 7 0 6 S 7 2
+ 002127 RECEIVER INTERMEDIATE FREQUENCY Hz -6 0 7 Hz -6 3
+ 002128 INTERMEDIATE FREQUENCY BANDWIDTH Hz -5 0 6 Hz -5 2
+ 002129 MINIMUM DETECTABLE SIGNAL dB 0 -150 5 dB 0 3
+ 002130 DYNAMIC RANGE dB 0 0 7 dB 0 3
+ 002131 SENSITIVITY TIME CONTROL (STC) FLAG TABLE 2131 0 0 2 FLAG TABLE 2131 0 1
+ 002132 AZIMUTH POINTING ACCURACY DEGREE 2 0 6 DEGREE 2 2
+ 002133 ELEVATION POINTING ACCURACY DEGREE 2 0 6 DEGREE 2 2
+ 002134 ANTENNA BEAM AZIMUTH DEGREE 2 0 16 DEGREE 2 5
+ 002135 ANTENNA ELEVATION DEGREE 2 -9000 15 DEGREE 2 5
+ 002136 RANGE PROCESSED BY RANGE ATTENUATION CORRECTION M -3 0 16 M -3 5
+ 002140 SATELLITE RADAR BEAM AZIMUTH ANGLE DEGREE 0 0 9 DEGREE 0 3
+ 002141 MEASUREMENT TYPE CCITTIA5 0 0 24 CHARACTER 0 3
+ 002142 OZONE INSTRUMENT SERIAL NUMBER/ IDENTIFICATION CCITTIA5 0 0 32 CHARACTER 0 4
+ 002143 OZONE INSTRUMENT TYPE CODE TABLE 2143 0 0 7 CODE TABLE 2143 0 3
+ 002144 LIGHT SOURCE TYPE FOR BREWER SPECTRO PHOTOMETER CODE TABLE 2144 0 0 4 CODE TABLE 2144 0 2
+ 002145 WAVE LENGTH SETTING FOR DOBSON INSTRUMENTS CODE TABLE 2145 0 0 4 CODE TABLE 2145 0 2
+ 002146 SOURCE CONDITIONS FOR DOBSON INSTRUMENTS CODE TABLE 2146 0 0 4 CODE TABLE 2146 0 2
+ 002148 DATA COLLECTION AND/OR LOCATION SYSTEM CODE TABLE 2148 0 0 5 CODE TABLE 2148 0 2
+ 002149 TYPE OF DATA BUOY CODE TABLE 2149 0 0 6 CODE TABLE 2149 0 2
+ 002150 TOVS/ATOVS/AVHRR INSTRUMENTATION CHANNEL NUMBER CODE TABLE 2150 0 0 6 CODE TABLE 2150 0 2
+ 002151 RADIOMETER IDENTIFIER CODE TABLE 2151 0 0 11 CODE TABLE 2151 0 4
+ 002152 SATELLITE INSTRUMENT USED IN DATA PROCESSING(6) FLAG TABLE 2152 0 0 31 FLAG TABLE 2152 0 10
+ 002153 SATELLITE CHANNEL CENTRE FREQUENCY Hz -8 0 26 Hz -8 8
+ 002154 SATELLITE CHANNEL BAND WIDTH Hz -8 0 26 Hz -8 8
+ 002156 PERCENTAGE OF VALID KU OCEAN RETRACKER MEASUREMENTS % 0 0 7 % 0 3
+ 002157 PERCENTAGE OF VALID S OCEAN RETRACKER MEASUREMENTS % 0 0 7 % 0 3
+ 002158 RA-2 INSTRUMENT FLAG TABLE 2158 0 0 9 FLAG TABLE 2158 0 3
+ 002159 MWR INSTRUMENT FLAG TABLE 2159 0 0 8 FLAG TABLE 2159 0 3
+ 002160 WAVE LENGTH OF THE RADAR CODE TABLE 2160 0 0 4 CODE TABLE 2160 0 2
+ 002163 HEIGHT ASSIGNMENT METHOD CODE TABLE 2163 0 0 4 CODE TABLE 2163 0 2
+ 002164 TRACER CORRELATION METHOD CODE TABLE 2164 0 0 3 CODE TABLE 2164 0 1
+ 002166 RADIANCE TYPE CODE TABLE 2166 0 0 4 CODE TABLE 2166 0 2
+ 002167 RADIANCE COMPUTATIONAL METHOD CODE TABLE 2167 0 0 4 CODE TABLE 2167 0 2
+ 002168 HYDROSTATIC PRESSURE OF LOWER END OF CABLE (THERMISTOR STRING) PA -3 0 16 KPA 0 5
+ 002169 ANEMOMETER TYPE CODE TABLE 2169 0 0 4 CODE TABLE 2169 0 2
+ 002172 PRODUCT TYPE FOR RETRIEVED ATMOSPHERIC GASES CODE TABLE 2172 0 0 8 CODE TABLE 2172 0 3
+ 002173 SQUARE OF THE OFF NADIR ANGLE (7) DEGREE2 4 0 10 DEGREE2 4 4
+ 002174 MEAN ACROSS TRACK PIXEL NUMBER NUMERIC 0 0 9 NUMERIC 0 3
+ 002175 METHOD OF PRECIPITATION MEASUREMENT CODE TABLE 2175 0 0 4 CODE TABLE 2175 0 2
+ 002176 METHOD OF STATE OF GROUND MEASUREMENT CODE TABLE 2176 0 0 4 CODE TABLE 2176 0 2
+ 002177 METHOD OF SNOW DEPTH MEASUREMENT CODE TABLE 2177 0 0 4 CODE TABLE 2177 0 2
+ 002178 METHOD OF LIQUID CONTENT MEASUREMENT OF PRECIPITATION CODE TABLE 2178 0 0 4 CODE TABLE 2178 0 2
+ 002179 TYPE OF SKY CONDITION ALGORITHM CODE TABLE 2179 0 0 4 CODE TABLE 2179 0 2
+ 002180 MAIN PRESENT WEATHER DETECTING SYSTEM CODE TABLE 2180 0 0 4 CODE TABLE 2180 0 2
+ 002181 SUPPLEMENTARY PRESENT WEATHER SENSOR FLAG TABLE 2181 0 0 21 FLAG TABLE 2181 0 7
+ 002182 VISIBILITY MEASUREMENT SYSTEM CODE TABLE 2182 0 0 4 CODE TABLE 2182 0 2
+ 002183 CLOUD DETECTION SYSTEM CODE TABLE 2183 0 0 4 CODE TABLE 2183 0 2
+ 002184 TYPE OF LIGHTNING DETECTION SENSOR CODE TABLE 2184 0 0 4 CODE TABLE 2184 0 2
+ 002185 METHOD OF EVAPORATION MEASUREMENT CODE TABLE 2185 0 0 4 CODE TABLE 2185 0 2
+ 002186 CAPABILITY TO DETECT PRECIPITATION PHENOMENA FLAG TABLE 2186 0 0 30 FLAG TABLE 2186 0 10
+ 002187 CAPABILITY TO DETECT OTHER WEATHER PHENOMENA FLAG TABLE 2187 0 0 18 FLAG TABLE 2187 0 6
+ 002188 CAPABILITY TO DETECT OBSCURATION FLAG TABLE 2188 0 0 21 FLAG TABLE 2188 0 7
+ 002189 CAPABILITY TO DISCRIMINATE LIGHTNING STRIKES FLAG TABLE 2189 0 0 12 FLAG TABLE 2189 0 4
+ 002190 LAGRANGIAN DRIFTER SUBMERGENCE (% TIME SUBMERGED) % 0 0 7 % 0 3
+ 004001 YEAR YEAR 0 0 12 YEAR 0 4
+ 004002 MONTH MONTH 0 0 4 MONTH 0 2
+ 004003 DAY DAY 0 0 6 DAY 0 2
+ 004004 HOUR HOUR 0 0 5 HOUR 0 2
+ 004005 MINUTE MINUTE 0 0 6 MINUTE 0 2
+ 004006 SECOND SECOND 0 0 6 SECOND 0 2
+ 004007 SECONDS WITHIN A MINUTE (MICROSECOND ACCURACY) SECOND 6 0 26 S 6 8
+ 004011 TIME INCREMENT YEAR 0 -1024 11 YEAR 0 4
+ 004012 TIME INCREMENT MONTH 0 -1024 11 MONTH 0 4
+ 004013 TIME INCREMENT DAY 0 -1024 11 DAY 0 4
+ 004014 TIME INCREMENT HOUR 0 -1024 11 HOUR 0 4
+ 004015 TIME INCREMENT MINUTE 0 -2048 12 MINUTE 0 4
+ 004016 TIME INCREMENT SECOND 0 -4096 13 SECOND 0 4
+ 004017 REFERENCE TIME PERIOD FOR ACCUMULATED OR EXTREME DATA MINUTE 0 -1440 12 MINUTE 0 4
+ 004021 TIME PERIOD OR DISPLACEMENT YEAR 0 -1024 11 YEAR 0 4
+ 004022 TIME PERIOD OR DISPLACEMENT MONTH 0 -1024 11 MONTH 0 4
+ 004023 TIME PERIOD OR DISPLACEMENT DAY 0 -1024 11 DAY 0 4
+ 004024 TIME PERIOD OR DISPLACEMENT HOUR 0 -2048 12 HOUR 0 4
+ 004025 TIME PERIOD OR DISPLACEMENT MINUTE 0 -2048 12 MINUTE 0 4
+ 004026 TIME PERIOD OR DISPLACEMENT SECOND 0 -4096 13 SECOND 0 4
+ 004031 DURATION OF TIME RELATING TO FOLLOWING VALUE HOUR 0 0 8 HOUR 0 3
+ 004032 DURATION OF TIME RELATING TO FOLLOWING VALUE MINUTE 0 0 6 MINUTE 0 2
+ 004041 TIME DIFFERENCE, UTC -LMT (SEE NOTE 6) MINUTE 0 -1440 12 MINUTE 0 4
+ 004043 DAY OF THE YEAR DAY 0 0 9 DAY 0 3
+ 004051 PRINCIPAL TIME OF DAILY READING OF MAXIMUM TEMPERATURE HOUR 0 0 5 HOUR 0 2
+ 004052 PRINCIPAL TIME OF DAILY READING OF MINIMUM TEMPERATURE HOUR 0 0 5 HOUR 0 2
+ 004053 NUMBER OF DAYS WITH PRECIPITATION EQUAL TO OR MORE THAN 1 MM NUMERIC 0 0 6 NUMERIC 0 2
+ 004059 TIMES OF OBSERVATION USED TO COMPUTE THE REPORTED MEAN VALUES FLAG TABLE 4059 0 0 6 FLAG TABLE 4059 0 2
+ 004065 SHORT TIME INCREMENT MINUTE 0 -128 8 MINUTE 0 2
+ 004073 SHORT TIME PERIOD OR DISPLACEMENT DAY 0 -128 8 DAY 0 2
+ 004074 SHORT TIME PERIOD OR DISPLACEMENT HOUR 0 -128 8 HOUR 0 2
+ 004075 SHORT TIME PERIOD OR DISPLACEMENT MINUTE 0 -128 8 MINUTE 0 2
+ 004080 AVERAGING PERIOD FOR FOLLOWING VALUE CODE TABLE 4080 0 0 4 CODE TABLE 4080 0 2
+ 004086 LONG TIME PERIOD OR DISPLACEMENT SECOND 0 -8192 15 SECOND 0 5
+ 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005011 LATITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005012 LATITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005015 LATITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005016 LATITUDE DISPLACEMENT (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 005023 SUN TO SATELLITE AZIMUTH DIFFERENCE DEGREE 1 -1800 12 DEGREE 1 4
+ 005030 DIRECTION (SPECTRAL) DEGREE 0 0 12 DEGREE 0 4
+ 005031 ROW NUMBER NUMERIC 0 0 12 NUMERIC 0 4
+ 005033 PIXEL SIZE ON HORIZONTAL - 1 M -1 0 16 M -1 5
+ 005034 ALONG TRACK ROW NUMBER NUMERIC 0 0 11 NUMERIC 0 4
+ 005036 SHIP TRANSECT NUMBER ACCORDING TO SOOP NUMERIC 0 0 7 NUMERIC 0 2
+ 005040 ORBIT NUMBER NUMERIC 0 0 24 NUMERIC 0 8
+ 005041 SCAN LINE NUMBER NUMERIC 0 0 8 NUMERIC 0 3
+ 005042 CHANNEL NUMBER NUMERIC 0 0 6 NUMERIC 0 2^M
+ 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8 NUMERIC 0 3
+ 005044 SATELLITE CYCLE NUMBER NUMERIC 0 0 11 NUMERIC 0 4
+ 005052 CHANNEL NUMBER INCREMENT NUMERIC 0 0 5 NUMERIC 0 2
+ 005053 FIELD OF VIEW NUMBER INCREMENT NUMERIC 0 0 5 NUMERIC 0 2
+ 005060 Y ANGULAR POSITION FROM CENTRE OF GRAVITY DEGREE 6 -8000000 24 DEGREE 6 8
+ 005061 Z ANGULAR POSITION FROM CENTRE OF GRAVITY DEGREE 6 -8000000 24 DEGREE 6 8
+ 005193 ALONG TRACK ROW NUMBER AT 50 KM NUMERIC 0 0 10 NUMERIC 0 4
+ 005194 ALONG TRACK ROW NUMBER AT 25 KM NUMERIC 0 0 11 NUMERIC 0 4
+ 005195 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 7 NUMERIC 0 3
+ 005217 LOCATION OF PLATFORM, X M 2 -1073741824 31 M 2 10
+ 005232 DIRECTION (SPECTRAL) DEGREE 2 0 16 DEGREE 2 5
+ 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006011 LONGITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006012 LONGITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006015 LONGITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006016 LONGITUDE DISPLACEMENT (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006021 DISTANCE M -1 0 13 M -1 4
+ 006030 WAVE NUMBER (SPECTRAL) RAD/M 5 0 13 RAD/M 5 4
+ 006031 COLUMN NUMBER NUMERIC 0 0 12 NUMERIC 0 4
+ 006033 PIXEL SIZE ON HORIZONTAL - 2 M -1 0 16 M -1 5
+ 006034 CROSS-TRACK CELL NUMBER NUMERIC 0 0 7 NUMERIC 0 3
+ 006040 RADIUS OF CONFIDENCE M 0 0 13 M 0 4
+ 006193 CROSS TRACK CELL NUMBER AT 50 KM NUMERIC 0 0 6 NUMERIC 0 2
+ 006194 CROSS TRACK CELL NUMBER AT 25 KM NUMERIC 0 0 7 NUMERIC 0 3
+ 006217 LOCATION OF PLATFORM, Y M 2 -1073741824 31 M 2 10
+ 006232 WAVENUMBER (SPECTRAL) RADS/M 5 0 13 ADS/M 5 4
+ 007001 HEIGHT OF STATION (SEE NOTE 1) M 0 -400 15 M 0 5
+ 007002 HEIGHT OR ALTITUDE M -1 -40 16 M -1 5
+ 007003 GEOPOTENTIAL M**2/S**2 -1 -400 17 M**2/S**2 -1 6
+ 007004 PRESSURE PA -1 0 14 PA -1 5
+ 007005 HEIGHT INCREMENT M 0 -400 12 M 0 4
+ 007006 HEIGHT ABOVE STATION M 0 0 15 M 0 5
+ 007007 HEIGHT M 0 -1000 17 M 0 6
+ 007008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7
+ 007009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17 GPM 0 5
+ 007010 FLIGHT LEVEL M 0 -1024 16 FT -1 5
+ 007021 ELEVATION (SEE NOTE 2) DEGREE 2 -9000 15 DEGREE 2 5
+ 007022 SOLAR ELEVATION DEGREE 2 -9000 15 DEGREE 2 5
+ 007024 SATELLITE ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 007025 SOLAR ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 007026 SATELLITE ZENITH ANGLE DEGREE 4 -900000 21 DEGREE 4 7
+ 007030 HEIGHT OF STATION GROUND ABOVE MEAN SEA LEVEL (SEE NOTE 3) M 1 - 4000 17 M 1 5
+ 007031 HEIGHT OF BAROMETER ABOVE MEAN SEA LEVEL (SEE NOTE 4) M 1 - 4000 17 M 1 5
+ 007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM) M 2 0 16 M 2 5
+ 007033 HEIGHT OF SENSOR ABOVE WATER SURFACE (SEE NOTE 6) M 1 0 12 M 1 4
+ 007040 IMPACT PARAMETER (SEE NOTE 8) M 1 62000000 22 M 1 8
+ 007061 DEPTH BELOW LAND SURFACE M 2 0 14 M 2 5
+ 007062 DEPTH BELOW SEA/WATER SURFACE M 1 0 17 M 1 6
+ 007063 DEPTH BELOW SEA/WATER SURFACE M 2 0 20 M 2 7
+ 007064 REPRESENTATIVE HEIGHT OF SENSOR ABOVE STATION (SEE NOTE 7) M 0 0 4 M 0 2
+ 007065 WATER PRESSURE PA -3 0 17 PA 0 6
+ 007070 DROGUE DEPTH M 0 0 10 M 0 4
+ 007217 LOCATION OF PLATFORM, Z M 2 -1073741824 31 M 2 10
+ 008001 VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8001 0 0 7 FLAG TABLE 8001 0 3
+ 008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS) CODE TABLE 8002 0 0 6 CODE TABLE 8002 0 2
+ 008003 VERTICAL SIGNIFICANCE (SATELLITE OBSERVATIONS) CODE TABLE 8003 0 0 6 CODE TABLE 8003 0 2
+ 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 8004 0 0 3 CODE TABLE 8004 0 1
+ 008005 METEOROLOGICAL ATTRIBUTE SIGNIFICANCE CODE TABLE 8005 0 0 4 CODE TABLE 8005 0 2
+ 008006 OZONE VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8006 0 0 9 FLAG TABLE 8006 0 3
+ 008007 DIMENSIONAL SIGNIFICANCE CODE TABLE 8007 0 0 4 CODE TABLE 8007 0 2
+ 008008 RADIATION VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8008 0 0 9 FLAG TABLE 8008 0 3
+ 008009 DETAILED PHASE OF FLIGHT CODE TABLE 8009 0 0 4 CODE TABLE 8009 0 2
+ 008010 SURFACE QUALIFIER (TEMPERATURE DATA) CODE TABLE 8010 0 0 5 CODE TABLE 8010 0 2
+ 008011 METEOROLOGICAL FEATURE CODE TABLE 8011 0 0 6 CODE TABLE 8011 0 2
+ 008012 LAND/SEA QUALIFIER CODE TABLE 8012 0 0 2 CODE TABLE 8012 0 1
+ 008013 DAY/NIGHT QUALIFIER CODE TABLE 8013 0 0 2 CODE TABLE 8013 0 1
+ 008014 QUALIFIER FOR RUNWAY VISUAL RANGE CODE TABLE 8014 0 0 4 CODE TABLE 8014 0 2
+ 008016 CHANGE QUALIFIER OF A TREND-TYPE FORECAST OR AN AERODROME FORECA CODE TABLE 8016 0 0 3 CODE TABLE 8016 0 1
+ 008017 QUALIFIER OF THE TIME WHEN THE FORECAST CHANGE IS EXPECTED CODE TABLE 8017 0 0 2 CODE TABLE 8017 0 1
+ 008018 SEAWINDS LAND/ICE SURFACE TYPE FLAG TABLE 8018 0 0 17 FLAG TABLE 8018 0 6
+ 008020 TOTAL NUMBER OF MISSING ENTITIES (WITH RESPECT TO ACCUMULATION O NUMERIC 0 0 16 NUMERIC 0 5
+ 008021 TIME SIGNIFICANCE CODE TABLE 8021 0 0 5 CODE TABLE 8021 0 2
+ 008022 TOTAL NUMBER (WITH RESPECT TO ACCUMULATION OR AVERAGE) NUMERIC 0 0 16 NUMERIC 0 5
+ 008023 FIRST ORDER STATISTICS CODE TABLE 8023 0 0 6 CODE TABLE 8023 0 2
+ 008024 DIFFERENCE STATISTICS CODE TABLE 8024 0 0 6 CODE TABLE 8024 0 2
+ 008025 TIME DIFFERENCE QUALIFIER CODE TABLE 8025 0 0 4 CODE TABLE 8025 0 2
+ 008029 REMOTLY SENSED SURFACE TYPE CODE TABLE 8029 0 0 8 CODE TABLE 8029 0 3
+ 008030 MANUAL ON CODES (VOLUME I.1, SECTION C) CODE TABLE FROM WHICH DA NUMERIC 0 0 13 NUMERIC 0 4
+ 008031 DATA CATEGORY CREX TABLE A NUMERIC 0 0 8 NUMERIC 0 3
+ 008033 METHOD OF DERIVATION OF PERCENTAGE CONFIDENCE CODE TABLE 8033 0 0 7 CODE TABLE 8033 0 3
+ 008035 TYPE OF MONITORING EXERCISE CODE TABLE 8035 0 0 3 CODE TABLE 8035 0 1
+ 008036 TYPE OF CENTRE OR STATION PERFORMING MONITORING CODE TABLE 8036 0 0 3 CODE TABLE 8036 0 1
+ 008040 FLIGHT LEVEL SIGNIFICANCE CODE TABLE 8040 0 0 6 CODE TABLE 8040 0 2
+ 008041 DATA SIGNIFICANCE CODE TABLE 8041 0 0 5 CODE TABLE 8041 0 2
+ 008042 EXTENDED VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8042 0 0 18 FLAG TABLE 8042 0 6
+ 008049 NUMBER OF OBSERVATIONS NUMERIC 0 0 8 NUMERIC 0 3
+ 008050 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 8050 0 0 4 CODE TABLE 8050 0 2
+ 008051 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 8051 0 0 3 CODE TABLE 8051 0 1
+ 008052 CONDITION FOR WHICH NUMBER OF DAYS OF OCCURRENCE FOLLOWS CODE TABLE 8052 0 0 5 CODE TABLE 8052 0 2
+ 008053 DAY OF OCCURRENCE QUALIFIER CODE TABLE 8053 0 0 2 CODE TABLE 8053 0 1
+ 008060 SAMPLE SCANNING MODE SIGNIFICANCE CODE TABLE 8060 0 0 4 CODE TABLE 8060 0 2
+ 008065 SUN-GLINT INDICATOR CODE TABLE 8065 0 0 2 CODE TABLE 8065 0 1
+ 008066 SEMI-TRANSPARENCY INDICATOR CODE TABLE 8066 0 0 2 CODE TABLE 8066 0 1
+ 008070 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8070 0 0 4 CODE TABLE 8070 0 2
+ 008072 PIXEL(S) TYPE CODE TABLE 8072 0 0 3 CODE TABLE 8072 0 1
+ 008074 ALTIMETER ECHO TYPE CODE TABLE 8074 0 0 2 CODE TABLE 8074 0 1
+ 008075 ASCENDING/DESCENDING ORBIT QUALIFIER CODE TABLE 8075 0 0 2 CODE TABLE 8075 0 1
+ 008076 TYPE OF BAND CODE TABLE 8076 0 0 6 CODE TABLE 8076 0 2
+ 008081 TYPE OF EQUIPMENT CODE TABLE 8081 0 0 6 CODE TABLE 8081 0 2
+ 008082 (CBS) ARTIFICIAL CORRECTION OF SENSOR HEIGHT TO ANOTHER VALUE CODE TABLE 8082 0 0 3 CODE TABLE 8082 0 1
+ 008083 NOMINAL VALUE INDICATOR FLAG TABLE 8083 0 0 15 FLAG TABLE 8083 0 5
+ 008085 BEAM IDENTIFIER CODE TABLE 8085 0 0 3 CODE TABLE 8085 0 1
+ 008193 TIME QUALIFIER CODE TABLE 8193 0 0 6 CODE TABLE 8193 0 2
+ 008194 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8194 0 0 4 CODE TABLE 8194 0 2
+ 008195 DATA TYPE CODE TABLE 8195 0 0 7 CODE TABLE 8195 0 3
+ 008200 NUMBER OF OBSERVATIONS NUMERIC 0 0 8 NUMERIC 0 3
+ 008222 GENERATOR SIGNIFICANCE CODE TABLE 8222 0 0 4 CODE TABLE 8222 0 2
+ 008223 LAND/ICE SURFACE FLAG FLAG TABLE 8223 0 0 7 FLAG TABLE 8223 0 3
+ 008224 LAND/SEA FRACTION NUMERIC 3 0 10 NUMERIC 3 4
+ 010001 HEIGHT OF LAND SURFACE M 0 -400 15 M 0 5
+ 010002 HEIGHT M -1 -40 16 M -1 5
+ 010003 GEOPOTENTIAL M**2/S**2 -1 -400 17 M**2/S**2 -1 6
+ 010004 PRESSURE PA -1 0 14 PA -1 5
+ 010007 HEIGHT M 0 -1000 17 M 0 6
+ 010008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7
+ 010009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17 GPM 0 5
+ 010010 MINIMUM PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010011 MAXIMUM PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010031 IN DIRECTION OF THE NORTH POLE, DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31 M 2 10
+ 010032 SATELLITE DISTANCE TO EARTH'S CENTRE M 1 0 27 M 2 9
+ 010033 ALTITUDE (PLATFORM TO ELLIPSOID) M 1 0 27 M 2 9
+ 010034 EARTH RADIUS M 1 0 27 M 2 9
+ 010035 EARTH'S LOCAL RADIUS OF CURVATURE M 1 62000000 22 M 1 8
+ 010036 GEOID UNDULATION (SEE NOTE 4) M 2 -15000 15 M 2 6
+ 010040 NUMBER OF RETRIEVED LAYERS NUMERIC 0 0 10 NUMERIC 0 4
+ 010050 STANDARD DEVIATION ALTITUDE M 2 0 16 M 2 5
+ 010051 PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010052 ALTIMETER SETTING (QNH) PA -1 0 14 PA -1 5
+ 010060 PRESSURE CHANGE PA -1 -1024 11 PA -1 4
+ 010061 3-HOUR PRESSURE CHANGE PA -1 -500 10 PA -1 4
+ 010062 24-HOUR PRESSURE CHANGE PA -1 -1000 11 PA -1 4
+ 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 10063 0 0 4 CODE TABLE 10063 0 2
+ 010070 INDICATED AIRCRAFT ALTITUDE M 0 -400 16 M 0 5
+ 010080 VIEWING ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 010081 ALTITUDE OF COG ABOVE REFERENCE ELLIPSOID M 3 0 31 M 3 10
+ 010082 INSTANTANEOUS ALTITUDE RATE MS-1 3 -65536 17 MS-1 3 6
+ 010083 SQUARED OFF NADIR ANGLE OF THE SATELLITE FROM PLATFORM DATA DEGREE2 2 0 16 DEGREE2 2 5
+ 010084 SQUARED OFF NADIR ANGLE OF THE SATELLITE FROM WAVEFORM DATA DEGREE2 2 0 16 DEGREE2 2 5
+ 010085 MEAN SEA SURFACE HEIGHT M 3 -131072 18 M 3 6
+ 010086 GEOID'S HEIGHT M 3 -131072 18 M 3 6
+ 010087 OCEAN DEPTH/LAND ELEVATION M 1 -131072 18 M 3 6
+ 010088 TOTAL GEOCENTRIC OCEAN TIDE HEIGHT SOLUTION 1 M 3 -32768 16 M 3 5
+ 010089 TOTAL GEOCENTRIC OCEAN TIDE HEIGHT SOLUTION 2 M 3 -32768 16 M 3 5
+ 010090 LONG PERIOD TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010091 TIDAL LOADING HEIGHT M 3 -32768 16 M 3 5
+ 010092 SOLID EARTH TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010093 GEOCENTRIC POLE TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010095 HEIGHT OF ATMOSPHERE USED M 0 0 16 M 0 5
+ 011001 WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011002 WIND SPEED M/S 1 0 12 M/S 1 4
+ 011003 U-COMPONENT M/S 1 -4096 13 M/S 1 4
+ 011004 V-COMPONENT M/S 1 -4096 13 M/S 1 4
+ 011005 W-COMPONENT PA/S 1 -512 10 PA/S 1 4
+ 011006 W-COMPONENT M/S 2 -4096 13 M/S 2 4
+ 011010 WIND DIRECTION ASSOCIATED WITH WIND SPEED WHICH FOLLOWS DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011011 WIND DIRECTION AT 10 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011012 WIND SPEED AT 10 M M/S 1 0 12 M/S 1 4
+ 011013 WIND DIRECTION AT 5 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011014 WIND SPEED AT 5 M M/S 1 0 12 M/S 1 4
+ 011016 EXTREME COUNTERCLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011017 EXTREME CLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011019 STEADINESS OF WIND (6) % 0 0 7 % 0 3
+ 011021 RELATIVE VORTICITY 1/S 9 -65536 17 1/S 9 6
+ 011022 DIVERGENCE 1/S 9 -65536 17 1/S 9 6
+ 011023 VELOCITY POTENTIAL M**2/S -2 -65536 17 M**2/S -2 6
+ 011030 EXTENDED DEGREE OF TURBULENCE CODE TABLE 11030 0 0 6 CODE TABLE 0 2
+ 011031 DEGREE OF TURBULENCE CODE TABLE 11031 0 0 4 CODE TABLE 11031 0 2
+ 011032 HEIGHT OF BASE OF TURBULENCE M -1 -40 16 M -1 5
+ 011033 HEIGHT OF TOP OF TURBULENCE M -1 -40 16 M -1 5
+ 011034 VERTICAL GUST VELOCITY M/S 1 -1024 11 M/S 1 4
+ 011035 VERTICAL GUST ACCELERATION M/S**2 2 -8192 14 M/S**2 2 5
+ 011036 MAXIMUM DERIVED EQUIVALENT VERTICAL GUST SPEED M/S 1 0 10 M/S 1 4
+ 011037 TURBULENCE INDEX CODE TABLE 11037 0 0 6 CODE TABLE 11037 0 2
+ 011038 TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11038 0 0 5 CODE TABLE 11038 0 2
+ 011039 EXTENDED TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11039 0 0 6 CODE TABLE 11039 0 2
+ 011040 MAXIMUM WIND SPEED (MEAN WIND) M/S 1 0 12 M/S 1 4
+ 011041 MAXIMUM WIND GUST SPEED M/S 1 0 12 M/S 1 4
+ 011042 MAXIMUM WIND SPEED (10-MIN MEAN WIND) M/S 1 0 12 M/S 1 4
+ 011043 MAXIMUM WIND GUST DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011044 MEAN WIND DIRECTION FOR SURFACE - 1500 M (5000 FEET) DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011045 MEAN WIND SPEED FOR SURFACE - 1500 M (5000 FEET) M/S 1 0 12 M/S 1 4
+ 011046 MAXIMUM INSTANTANEOUS WIND SPEED M/S 1 0 12 M/S 1 4
+ 011047 MAXIMUM INSTANTANEOUS WIND SPEED OVER 10 MINUTES M/S 1 0 12 M/S 1 4
+ 011049 STANDARD DEVIATION OF WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011050 STANDARD DEVIATION OF HORIZONTAL WIND SPEED M/S 1 0 12 M/S 1 4
+ 011051 STANDARD DEVIATION OF VERTICAL WIND SPEED M/S 1 0 8 M/S 1 3
+ 011052 FORMAL UNCERTAINTY IN WIND SPEED M/S 2 0 13 M/S 2 5
+ 011053 FORMAL UNCERTAINTY IN WIND DIRECTION DEGREE TRUE 2 0 15 DEGREE TRUE 2 5
+ 011054 MEAN WIND DIRECTION FOR 1500 M - 3000 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011055 MEAN WIND SPEED FOR 1500 M - 3000 M M/S 1 0 12 M/S 1 4
+ 011061 ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW M/S 1 0 12 M/S 1 4
+ 011062 ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE M/S 1 0 12 M/S 1 4
+ 011070 DESIGNATOR OF THE RUNWAY AFFECTED BY WIND SHEAR (INCLUDING ALL) CCITTIA5 0 0 32 CHARACTER 0 4
+ 011071 TURBULENT VERTICAL MOMENTUM FLUX M**2/S**2 3 -128 14 M**2/S**2 3 5
+ 011072 TURBULENT VERTICAL BUOYANCY FLUX KM/S 3 -128 11 KM/S 3 4
+ 011073 TURBULENT KINETIC ENERGY M**2/S**2 2 -1024 13 M**2/S**2 2 4
+ 011074 DISSIPATION ENERGY M**2/S**2 2 -1024 10 M**2/S**2 2 4
+ 011075 MEAN TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3
+ 011076 PEAK TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3
+ 011077 REPORTING INTERVAL OR AVERAGING TIME FOR EDDY DISSIPATION RATE S 0 0 12 S 0 4
+ 011081 MODEL WIND DIRECTION AT 10M DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 011082 MODEL WIND SPEED AT 10M M/S 2 0 14 M/S 2 4
+ 011095 U COMPONENT OF THE MODEL WIND VECTOR M/S 1 -4096 13 M/S 1 4
+ 011096 V COMPONENT OF THE MODEL WIND VECTOR M/S 1 -4096 13 M/S 1 4
+ 011230 MAXIMUM MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4^M
+ 011231 MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4^M
+ 011232 MINIMUM MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4^M
+ 011233 HIGHEST GUST DURING THE 10 MINUTE PERIOD PRECEDING OBSERVATION M/S 1 -4096 13 M/S 1 4^M
+ 012001 TEMPERATURE/DRY-BULB TEMPERATURE K 1 0 12 C 1 3
+ 012002 WET-BULB TEMPERATURE K 1 0 12 C 1 3
+ 012003 DEW-POINT TEMPERATURE K 1 0 12 C 1 3
+ 012004 DRY-BULB TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012005 WET-BULB TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012006 DEW-POINT TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012007 VIRTUAL TEMPERATURE K 1 0 12 C 1 3
+ 012011 MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12 C 1 3
+ 012012 MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12 C 1 3
+ 012013 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS K 1 0 12 C 1 3
+ 012014 MAXIMUM TEMPERATURE AT 2 M, PAST 12 HOURS K 1 0 12 C 1 3
+ 012015 MINIMUM TEMPERATURE AT 2 M, PAST 12 HOURS K 1 0 12 C 1 3
+ 012016 MAXIMUM TEMPERATURE AT 2 M, PAST 24 HOURS K 1 0 12 C 1 3
+ 012017 MINIMUM TEMPERATURE AT 2 M, PAST 24 HOURS K 1 0 12 C 1 3
+ 012021 MAXIMUM TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012022 MINIMUM TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012030 SOIL TEMPERATURE K 1 0 12 C 1 3
+ 012049 TEMPERATURE CHANGE OVER SPECIFIED PERIOD K 0 -30 6 C 0 2
+ 012051 STANDARD DEVIATION TEMPERATURE K 1 0 10 C 1 3
+ 012052 HIGHEST DAILY MEAN TEMPERATURE K 1 0 12 C 1 3
+ 012053 LOWEST DAILY MEAN TEMPERATURE K 1 0 12 C 1 3
+ 012061 SKIN TEMPERATURE K 1 0 12 C 1 3
+ 012062 EQUIVALENT BLACK BODY TEMPERATURE K 1 0 12 C 1 3
+ 012063 BRIGHTNESS TEMPERATURE K 1 0 12 C 1 3
+ 012064 INSTRUMENT TEMPERATURE K 1 0 12 K 1 4
+ 012065 STANDARD DEVIATION BRIGHTNESS TEMPERATURE K 1 0 12 K 1 4
+ 012070 WARM LOAD TEMPERATURE K 2 0 16 K 2 5
+ 012071 COLDEST CLUSTER TEMPERATURE K 1 0 12 K 1 4
+ 012072 RADIANCE WM**(-2)SR**(-1) 6 0 31 WM**(-2)SR**(-1) 6 9
+ 012073 TEMPERATURE K 2 0 16 K 2 5
+ 012075 SPECTRAL RADIANCE WM**(-3)SR**(-1) -3 0 16 WM**(-3)SR**(-1) -3 5
+ 012076 RADIANCE WM**(-2)SR**(-1) 3 0 16 WM**(-2)SR**(-1) 3 5
+ 012101 TEMPERATURE/DRY-BULB TEMPERATURE K 2 0 16 C 2 4
+ 012102 WET-BULB TEMPERATURE K 2 0 16 C 2 4
+ 012103 DEW-POINT TEMPERATURE K 2 0 16 C 2 4
+ 012104 DRY-BULB TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012105 WEB-BULB TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012106 DEW-POINT TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012107 VIRTUAL TEMPERATURE K 2 0 16 C 2 4
+ 012111 MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 2 0 16 C 2 4
+ 012112 MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 2 0 16 C 2 4
+ 012113 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS K 2 0 16 C 2 4
+ 012114 MAXIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 2 0 16 C 2 4
+ 012115 MINIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 2 0 16 C 2 4
+ 012116 MAXIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 2 0 16 C 2 4
+ 012117 MINIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 2 0 16 C 2 4
+ 012118 MAXIMUM TEMPERATURE AT HEIGHT SPECIFIED, PAST 24 HOURS K 2 0 16 C 2 4
+ 012119 MINIMUM TEMPERATURE AT HEIGHT SPECIFIED, PAST 24 HOURS K 2 0 16 C 2 4
+ 012121 GROUND MINIMUM TEMPERATURE K 2 0 16 C 2 4
+ 012122 GROUND MINIMUM TEMPERATURE OF THE PRECEDING NIGHT K 2 0 16 C 2 4
+ 012130 SOIL TEMPERATURE K 2 0 16 C 2 4
+ 012151 STANDARD DEVIATION OF DAILY MEAN TEMPERATURE K 2 0 12 C 2 4
+ 012152 HIGHEST DAILY MEAN TEMPERATURE K 2 0 16 C 2 4
+ 012153 LOWEST DAILY MEAN TEMPERATURE K 2 0 16 C 2 4
+ 012161 SKIN TEMPERATURE K 2 0 16 C 2 4
+ 012162 EQUIVALENT BLACK BODY TEMPERATURE K 2 0 16 C 2 4
+ 012163 BRIGHTNESS TEMPERATURE K 2 0 16 C 2 4
+ 012164 INSTRUMENT TEMPERATURE K 2 0 16 K 2 5
+ 012171 COLDEST CLUSTER TEMPERATURE K 2 0 16 K 2 5
+ 012180 AVERAGED 12 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012181 AVERAGED 11 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012182 AVERAGED 3.7 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012183 AVERAGED 12 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012184 AVERAGED 11 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012185 AVERAGED 3.7 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012186 MEAN NADIR SEA SURFACE TEMPERATURE K 2 0 16 K 2 5
+ 012187 MEAN DUAL VIEW SEA SURFACE TEMPERATURE K 2 0 16 K 2 5
+ 012188 INTERPOLATED 23.8 GHZ BRIGHTNESS T FROM MWR K 2 0 16 K 2 5
+ 012189 INTERPOLATED 36.5 GHZ BRIGHTNESS T FROM MWR K 2 0 16 K 2 5
+ 013001 SPECIFIC HUMIDITY KG/KG 5 0 14 KG/KG 5 5
+ 013002 MIXING RATIO KG/KG 5 0 14 KG/KG 5 5
+ 013003 RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013004 VAPOUR PRESSURE PA -1 0 10 PA -1 4
+ 013005 VAPOUR DENSITY KG/M**3 3 0 7 KG/M**3 3 3
+ 013006 MIXING HEIGHTS M -1 -40 16 M -1 5
+ 013007 MINIMUM RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013008 MAXIMUM RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013009 RELATIVE HUMIDITY % 1 -1000 12 % 1 4
+ 013011 TOTAL PRECIPITATION/TOTAL WATER EQUIVALENT KG/M**2 1 -1 14 KG/M**2 1 5
+ 013012 DEPTH OF FRESH SNOW M 2 -2 12 M 2 4
+ 013013 TOTAL SNOW DEPTH M 2 -2 16 M 2 5
+ 013014 RAINFALL/WATER EQUIVALENT OF SNOW (AVERAGED RATE) KG/(M**2)S 4 0 12 KG/(M**2)S 4 4
+ 013015 SNOWFALL (AVERAGED RATE) M/S 7 0 12 M/S 7 4
+ 013016 PRECIPITABLE WATER KG/M**2 0 0 7 KG/M**2 0 3
+ 013019 TOTAL PRECIPITATION PAST 1 HOUR KG/M**2 1 -1 14 KG/M**2 1 4
+ 013020 TOTAL PRECIPITATION PAST 3 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013021 TOTAL PRECIPITATION PAST 6 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013022 TOTAL PRECIPITATION PAST 12 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013023 TOTAL PRECIPITATION PAST 24 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013031 EVAPOTRANSPIRATION KG/M**2 0 0 7 KG/M**2 0 3
+ 013032 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 8 KG/M**2 1 3
+ 013033 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 10 KG/M**2 1 4
+ 013038 SUPERADIABATIC INDICATOR CODE TABLE 13038 0 0 2 CODE TABLE 13038 0 1
+ 013039 TERRAIN TYPE (ICE/SNOW) CODE TABLE 13039 0 0 3 CODE TABLE 13039 0 1
+ 013040 SURFACE FLAG CODE TABLE 13040 0 0 4 CODE TABLE 13040 0 2
+ 013041 PASQUILL-GIFFORD STABILITY CATEGORY CODE TABLE 13041 0 0 4 CODE TABLE 13041 0 2
+ 013042 PARCEL LIFTED INDEX (TO 500 HPA) K 0 -20 6 K 0 2
+ 013043 BEST LIFTED INDEX (TO 500 HPA) K 0 -20 6 K 0 2
+ 013044 K INDEX K 0 -30 8 K 0 3
+ 013045 KO INDEX K 0 -30 8 K 0 3
+ 013046 MAXIMUM BUOYANCY K 0 -30 8 K 0 3
+ 013047 MODIFIED SHOWALTER STABILITY INDEX K 0 -60 6 C 0 2
+ 013051 FREQUENCY GROUP, PRECIPITATION CODE TABLE 13051 0 0 4 CODE TABLE 13051 0 2
+ 013052 HIGHEST DAILY AMOUNT OF PRECIPITATION KG/M**2 1 -1 14 KG/M**2 1 5
+ 013055 INTENSITY OF PRECIPITATION KG/(M**2)S 4 0 8 MM H-1 1 3
+ 013056 CHARACTER AND INTENSITY OF PRECIPITATION CODE TABLE 13056 0 0 4 CODE TABLE 13056 0 2
+ 013057 TIME OF BEGINNING OR END OF PRECIPITATION CODE TABLE 13057 0 0 4 CODE TABLE 13057 0 2
+ 013058 SIZE OF PRECIPITATING ELEMENT M 4 0 7 MM 1 3
+ 013059 NUMBER OF FLASHES (THUNDERSTORM) NUMERIC 0 0 7 NUMERIC 0 3
+ 013060 TOTAL ACCUMULATED PRECIPITATION KG/M**2 1 -1 17 KG/M**2 1 5
+ 013071 UPSTREAM WATER LEVEL M 2 0 14 M 2 5
+ 013072 DOWNSTREAM WATER LEVEL M 2 0 14 M 2 4
+ 013073 MAXIMUM WATER LEVEL M 2 0 14 M 2 4
+ 013080 WATER PH pH 1 0 10 pH 1 3
+ 013081 WATER CONDUCTIVITY S M-1 3 0 14 S M-1 3 4
+ 013082 WATER TEMPERATURE K 1 0 12 K 1 4
+ 013083 DISSOLVED OXYGEN KG/M**3 6 0 15 KG/M**3 6 5
+ 013084 TURBIDITY LUMEN 0 0 14 LUMEN 0 4
+ 013085 OXYDATION REDUCTION POTENTIAL (ORP) V 3 0 14 V 3 4
+ 013090 RADIOMETER WATER VAPOUR CONTENT KG/M**2 1 0 10 KG/M**2 1 4
+ 013091 RADIOMETER LIQUID CONTENT KG/M**2 2 0 8 KG/M**2 2 3
+ 013093 CLOUD OPTICAL THICKNESS NUMERIC 0 0 8 NUMERIC 0 3
+ 013095 TOTAL COLUMN WATER VAPOUR KG/M**2 4 0 19 KG/M**2 4 6
+ 013096 MWR WATER VAPOUR CONTENT KG/M**2 2 0 14 KG/M**2 2 4
+ 013097 MWR LIQUID WATER CONTENT KG/M**2 2 0 14 KG/M**2 2 4
+ 013098 INTEGRATED WATER VAPOUR DENSITY KG/M**2 8 0 30 KG/M**2 8 10
+ 014001 LONG-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014002 LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014003 SHORT-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014004 SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014011 NET LONG-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014012 NET LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014013 NET SHORT-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014014 NET SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014015 NET RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 -16384 15 J/M**2 -4 5
+ 014016 NET RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 -16384 15 J/M**2 -4 5
+ 014017 INSTANTANEOUS LONG-WAVE RADIATION (SEE NOTE 6) W/M**2 -3 -2048 12 W/M**2 -3 4
+ 014018 INSTANTANEOUS SHORT-WAVE RADIATION (SEE NOTE 6) W/M**2 -3 -2048 12 W/M**2 -3 4
+ 014019 SURFACE ALBEDO % 0 0 7 % 0 3
+ 014020 GLOBAL SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014021 GLOBAL SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014022 DIFFUSE SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014023 DIFFUSE SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014024 DIRECT SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014025 DIRECT SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014026 ALBEDO AT THE TOP OF CLOUDS % 0 0 7 % 0 3
+ 014027 ALBEDO % 0 0 7 % 0 3
+ 014028 GLOBAL SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S J/M**2 -2 0 16 J/M**2 -2 5
+ 014029 DIFFUSE SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD J/M**2 -2 0 16 J/M**2 -2 5
+ 014030 DIRECT SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S J/M**2 -2 0 16 J/M**2 -2 5
+ 014031 TOTAL SUNSHINE MINUTE 0 0 11 MINUTE 0 4
+ 014032 TOTAL SUNSHINE HOUR 0 0 10 HOUR 0 4
+ 014033 TOTAL SUNSHINE % 0 0 9 % 0 3
+ 014034 SUNSHINE OVER PERIOD SPECIFIED MINUTE 0 0 11 MINUTE 0 4
+ 014042 BI-DIRECTIONAL REFLECTANCE % 0 0 7 % 0 3
+ 014045 CHANNEL RADIANCE (W/M**2)*(1/SR)*CM 0 0 11 WM-2SR-1CM-1 0 4
+ 014046 SCALED IASI RADIANCE (W/M**2)*(1/SR)*(1/M) 0 -5000 16 (W/M**2)*(1/SR)*(1/M) 0 5
+ 014047 SCALED MEAN AVHRR RADIANCE (W/M**2)*(1/SR)*(1/M) 0 0 31 (W/M**2)*(1/SR)*(1/M) 0 10
+ 014048 SCALED STANDARD DEVIATION RADIANCE (W/M**2)*(1/SR)*(1/M) 0 0 31 (W/M**2)*(1/SR)*(1/M) 0 10
+ 014050 EMISSIVITY (SEE NOTE 5) % 1 0 10 % 1 4
+ 014051 DIRECT SOLAR RADIATION INTEGRATED OVER LAST HOUR J/M**2 -3 0 14 JM-2 -3 4
+ 014055 SOLAR ACTIVITY INDEX NUMERIC 0 -32768 16 NUMERIC 0 5
+ 014061 (VAL) INSTANTANEOUS LONG-WAVE RADIATION W/M**2 0 -512 10 W/M**2 0 4
+ 014062 (VAL) INSTANTANEOUS SHORT-WAVE RADIATION W/M**2 0 -2048 12 W/M**2 0 4
+ 015001 TOTAL OZONE DU 0 0 10 DU 0 4
+ 015002 AIR MASS (SLANT PATH AT 22 KM) NUMERIC 2 0 10 NUMERIC 2 3
+ 015003 MEASURED OZONE PARTIAL PRESSURE (SOUNDING) PA 4 0 9 NBAR 0 3
+ 015004 OZONE SOUNDING CORRECTION FACTOR NUMERIC 3 0 11 NUMERIC 3 4
+ 015005 OZONE P DU 0 0 10 DU 0 3
+ 015011 LOG 10 OF INTEGRATED ELECTRON DENSITY LOG (1/M2) 3 14000 13 LOG (M-2) 3 4
+ 015015 MAXIMUM IMAGE SPECTRAL COMPONENT BEFORE NORMALIZATION NUMERIC 0 0 31 NUMERIC 0 10
+ 015020 INTEGRATED 03 DENSITY KG/M**2 8 0 21 KG/M**2 8 7
+ 015025 TYPE OF POLLUTANT CODE TABLE 15025 0 0 4 CODE TABLE 15025 0 2
+ 015026 CONCENTRATION OF POLLUTANT MOLMOL-1 9 0 9 MOLMOL-1 9 3
+ 015027 CONCENTRATION OF POLLUTANT KG/M3 9 0 10 KG/M3 9 4
+ 015031 ATMOSPHERIC PATH DELAY IN SATELLITE SIGNAL M 4 10000 15 M 4 5
+ 015032 ESTIMATED ERROR IN ATMOSPHERIC PATH DELAY M 4 0 10 M 4 4
+ 015033 DIFFERENCE IN PATH DELAYS FOR LIMB VIEWS AT EXTREMES OF SCAN M 5 -10000 15 M 5 5
+ 015034 ESTIMATED ERROR IN PATH DELAY DIFFERENCE M 5 0 14 M 5 5
+ 015035 COMPONENT OF ZENITH PATH DELAY DUE TO WATER VAPOUR M 4 0 14 M 4 5
+ 015036 ATMOSPHERIC REFRACTIVITY (SEE NOTE 5) N-UNITS 3 0 19 N-UNITS 3 6
+ 015037 BENDING ANGLE RADIANS 8 -100000 23 RADIANS 8 7
+ 019001 TYPE OF SYNOPTIC FEATURE CODE TABLE 19001 0 0 6 CODE TABLE 19001 0 2
+ 019002 EFFECTIVE RADIUS OF FEATURE M -2 0 12 M -2 4
+ 019003 WIND SPEED THRESHOLD M/S 0 0 8 M/S 0 3
+ 019004 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD M -2 0 12 M -2 4
+ 019005 DIRECTION OF MOTION OF FEATURE DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 019006 SPEED OF MOTION OF FEATURE M/S 2 0 14 M/S 2 5
+ 019007 EFFECTIVE RADIUS OF FEATURE M -3 0 12 M -3 4
+ 019008 VERTICAL EXTENT OF CIRCULATION CODE TABLE 19008 0 0 3 CODE TABLE 19008 0 1
+ 019009 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD (LA M -3 0 12 M -3 4
+ 019010 METHOD FOR TRACKING THE CENTRE OF SYNOPTIC FEATURE CODE TABLE 19010 0 0 4 CODE TABLE 19010 0 2
+ 019100 TIME INTERVAL TO CALCULATE THE MOVEMENT OF THE TROPICAL CYCLONE CODE TABLE 19100 0 0 4 CODE TABLE 19100 0 2
+ 019101 ACCURACY OF THE POSITION OF THE CENTRE OF THE TROPICAL CYCLONE CODE TABLE 19101 0 0 4 CODE TABLE 19101 0 2
+ 019102 SHAPE AND DEFINITION OF THE EYE OF THE TROPICAL CYCLONE CODE TABLE 19102 0 0 3 CODE TABLE 19102 0 1
+ 019103 DIAMETER OF MAJOR AXIS OF THE EYE OF THE TROPICAL CYCLONE CODE TABLE 19103 0 0 4 CODE TABLE 19103 0 2
+ 019104 CHANGE IN CHARACTER OF THE EYE DURING THE 30 MINUTES CODE TABLE 19104 0 0 4 CODE TABLE 19104 0 2
+ 019105 DISTANCE BETWEEN THE END OF SPIRAL BAND AND THE CENTRE CODE TABLE 19105 0 0 4 CODE TABLE 19105 0 2
+ 019106 IDENTIFICATION NUMBER OF TROPICAL CYCLONE NUMERIC 0 0 7 NUMERIC 0 3
+ 019107 TIME INTERVAL OF THE TROPICAL CYCLONE ANALYSIS CODE TABLE 19107 0 0 4 CODE TABLE 19107 0 2
+ 019108 ACCURACY OF GEOGRAPHICAL POSITION OF THE TROPICAL CYCLONE CODE TABLE 19108 0 0 3 CODE TABLE 19108 0 1
+ 019109 MEAN DIAMETER OF THE OVERCAST CLOUD OF THE TROPICAL CYCLONE CODE TABLE 19109 0 0 4 CODE TABLE 19109 0 2
+ 019110 APPARENT 24-HOUR CHANGE IN INTENSITY OF TROPICAL CYCLONE CODE TABLE 19110 0 0 4 CODE TABLE 19110 0 2
+ 019111 CURRENT INTENSITY (CI) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019112 DATA TROPICAL (DT) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019113 CLOUD PATTERN TYPE OF THE DT- NUMBER CODE TABLE 19113 0 0 4 CODE TABLE 19113 0 2
+ 019114 MODEL EXPECTED TROPICAL (MET) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019115 TREND OF PAST 24-HOUR CHANGE (+: DEVELOPED, -: WEAKENED) NUMERIC 1 -30 6 NUMERIC 1 2
+ 019116 PATTERN TROPICAL (PT) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019117 CLOUD PICTURE TYPE OF THE PT- NUMBER CODE TABLE 19117 0 0 3 CODE TABLE 19117 0 1
+ 019118 FINAL TROPICAL (T) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019119 TYPE OF THE FINAL T-NUMBER CODE TABLE 19119 0 0 3 CODE TABLE 19119 0 1
+ 019150 TYPHOON INTERNATIONAL COMMON NUMBER (TYPHOON COMMITTEE) CCITTIA5 0 0 32 CHARACTER 0 4
+ 020001 HORIZONTAL VISIBILITY M -1 0 13 M -1 4
+ 020002 VERTICAL VISIBILITY M -1 0 7 M -1 3
+ 020003 PRESENT WEATHER (SEE NOTE 1) CODE TABLE 20003 0 0 9 CODE TABLE 20003 0 3
+ 020004 PAST WEATHER (1) (SEE NOTE 2) CODE TABLE 20004 0 0 5 CODE TABLE 20004 0 2
+ 020005 PAST WEATHER (2) (SEE NOTE 2) CODE TABLE 20005 0 0 5 CODE TABLE 20005 0 2
+ 020008 CLOUD DISTRIBUTION FOR AVIATION CODE TABLE 20008 0 0 5 CODE TABLE 20008 0 2
+ 020009 GENERAL WEATHER INDICATOR (TAF/METAR) CODE TABLE 20009 0 0 4 CODE TABLE 20009 0 2
+ 020010 CLOUD COVER (TOTAL) % 0 0 7 % 0 3
+ 020011 CLOUD AMOUNT CODE TABLE 20011 0 0 4 CODE TABLE 20011 0 2
+ 020012 CLOUD TYPE CODE TABLE 20012 0 0 6 CODE TABLE 20012 0 2
+ 020013 HEIGHT OF BASE OF CLOUD M -1 -40 11 M -1 4
+ 020014 HEIGHT OF TOP OF CLOUD M -1 -40 11 M -1 4
+ 020015 PRESSURE AT BASE OF CLOUD PA -1 0 14 PA -1 5
+ 020016 PRESSURE AT TOP OF CLOUD PA -1 0 14 PA -1 5
+ 020017 CLOUD TOP DESCRIPTION CODE TABLE 20017 0 0 4 CODE TABLE 20017 0 2
+ 020018 TENDENCY OF RUNWAY VISUAL RANGE CODE TABLE 20018 0 0 2 CODE TABLE 20018 0 1
+ 020019 SIGNIFICANT PRESENT OR FORECAST WEATHER CCITTIA5 0 0 72 CHARACTER 0 9
+ 020020 SIGNIFICANT RECENT WEATHER PHENOMENA CCITTIA5 0 0 32 CHARACTER 0 4
+ 020021 TYPE OF PRECIPITATION FLAG TABLE 20021 0 0 30 FLAG TABLE 20021 0 10
+ 020022 CHARACTER OF PRECIPITATION CODE TABLE 20022 0 0 4 CODE TABLE 20022 0 2
+ 020023 OTHER WEATHER PHENOMENA FLAG TABLE 20023 0 0 18 FLAG TABLE 20023 0 6
+ 020024 INTENSITY OF PHENOMENA CODE TABLE 20024 0 0 3 CODE TABLE 20024 0 1
+ 020025 OBSCURATION FLAG TABLE 20025 0 0 21 FLAG TABLE 20025 0 7
+ 020026 CHARACTER OF OBSCURATION CODE TABLE 20026 0 0 4 CODE TABLE 20026 0 2
+ 020027 PHENOMENA OCCURRENCE FLAG TABLE 20027 0 0 9 FLAG TABLE 20027 0 3
+ 020029 RAIN FLAG CODE TABLE 20029 0 0 2 CODE TABLE 20029 0 1
+ 020031 ICE DEPOSIT (THICKNESS) M 2 0 7 M 2 3
+ 020032 RATE OF ICE ACCRETION CODE TABLE 20032 0 0 3 CODE TABLE 20032 0 1
+ 020033 CAUSE OF ICE ACCRETION FLAG TABLE 20033 0 0 4 FLAG TABLE 20033 0 2
+ 020034 SEA ICE CONCENTRATION CODE TABLE 20034 0 0 5 CODE TABLE 20034 0 2
+ 020035 AMOUNT AND TYPE OF ICE CODE TABLE 20035 0 0 4 CODE TABLE 20035 0 2
+ 020036 ICE SITUATION CODE TABLE 20036 0 0 5 CODE TABLE 20036 0 2
+ 020037 ICE DEVELOPMENT CODE TABLE 20037 0 0 5 CODE TABLE 20037 0 2
+ 020038 BEARING OF ICE EDGE (SEE NOTE 3) DEGREE TRUE 0 0 12 DEGREE TRUE 0 3
+ 020039 ICE DISTANCE M -1 0 13 M -1 4
+ 020040 EVOLUTION OF DRIFT OF SNOW CODE TABLE 20040 0 0 4 CODE TABLE 20040 0 2
+ 020041 AIRFRAME ICING CODE TABLE 20041 0 0 4 CODE TABLE 20041 0 2
+ 020042 AIRFRAME ICING PRESENT CODE TABLE 20042 0 0 2 CODE TABLE 20042 0 1
+ 020043 PEAK LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2
+ 020044 AVERAGE LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2
+ 020045 SUPERCOOLED LARGE DROPLET (SLD) CONDITIONS CODE TABLE 20045 0 0 2 CODE TABLE 20045 0 2
+ 020050 CLOUD INDEX CODE TABLE 20050 0 0 8 CODE TABLE 20050 0 3
+ 020051 AMOUNT OF LOW CLOUDS % 0 0 7 % 0 3
+ 020052 AMOUNT OF MIDDLE CLOUDS % 0 0 7 % 0 3
+ 020053 AMOUNT OF HIGH CLOUDS % 0 0 7 % 0 3
+ 020054 TRUE DIRECTION FROM WHICH CLOUDS ARE MOVING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 020055 STATE OF SKY IN TROPICS CODE TABLE 20055 0 0 4 CODE TABLE 20055 0 2
+ 020056 CLOUD PHASE CODE TABLE 20056 0 0 3 CODE TABLE 20056 0 1
+ 020061 RUNWAY VISUAL RANGE (RVR) M 0 0 12 M 0 4
+ 020062 STATE OF THE GROUND (WITH OR WITHOUT SNOW) CODE TABLE 20062 0 0 5 CODE TABLE 20062 0 2
+ 020063 SPECIAL PHENOMENA CODE TABLE 20063 0 0 10 CODE TABLE 20063 0 4
+ 020065 SNOW COVER (SEE NOTE 4) % 0 0 7 % 0 3
+ 020066 MAXIMUM DIAMETER OF HAILSTONES M 3 0 8 M 3 3
+ 020067 DIAMETER OF DEPOSIT M 3 0 9 M 3 3
+ 020070 MINIMUM NUMBER OF ATMOSPHERICS NUMERIC 0 0 7 NUMERIC 0 3
+ 020071 ACCURACY OF FIX AND RATE OF ATMOSPHERICS CODE TABLE 20071 0 0 4 CODE TABLE 20071 0 2
+ 020081 CLOUD AMOUNT IN SEGMENT % 0 0 7 % 0 3
+ 020082 AMOUNT SEGMENT CLOUD FREE % 0 0 7 % 0 3
+ 020083 AMOUNT OF SEGMENT COVERED BY SCENE % 0 0 7 % 0 3
+ 020090 SPECIAL CLOUDS CODE TABLE 20090 0 0 4 CODE TABLE 20090 0 2
+ 020095 ICE PROBABILITY NUMERIC 3 0 10 NUMERIC 3 4
+ 020096 ICE AGE ("A" PARAMETER) dB 2 -4096 13 dB 2 4
+ 020101 LOCUST (ACRIDIAN) NAME CODE TABLE 20101 0 0 4 CODE TABLE 20101 0 2
+ 020102 LOCUST (MATURITY) COLOR CODE TABLE 20102 0 0 4 CODE TABLE 20102 0 2
+ 020103 STAGE OF DEVELOPMENT OF LOCUSTS CODE TABLE 20103 0 0 4 CODE TABLE 20103 0 2
+ 020104 ORGANIZATION STATE OF SWARM OR BAND OF LOCUSTS CODE TABLE 20104 0 0 4 CODE TABLE 20104 0 2
+ 020105 SIZE OF SWARM OR BAND OF LOCUSTS AND DURATION OF PASSAGE OF SWARMCODE TABLE 20105 0 0 4 CODE TABLE 20105 0 2
+ 020106 LOCUST POPULATION DENSITY CODE TABLE 20106 0 0 4 CODE TABLE 20106 0 2
+ 020107 DIRECTION OF MOVEMENTS OF LOCUST SWARM CODE TABLE 20107 0 0 4 CODE TABLE 20107 0 2
+ 020108 EXTENT OF VEGETATION CODE TABLE 20108 0 0 4 CODE TABLE 20108 0 2
+ 020193 CLOUD AMOUNT IN SEGMENT % 0 0 7 % 0 3
+ 020194 AMOUNT OF SEGMENT CLOUD FREE % 0 0 7 % 0 3
+ 020215 PRESSURE AT THE BASE OF CLOUD PA -1 0 14 PA -1 5
+ 021001 HORIZONTAL REFLECTIVITY dB 0 -64 7 dB 0 3
+ 021002 VERTICAL REFLECTIVITY dB 0 -64 7 dB 0 3
+ 021003 DIFFERENTIAL REFLECTIVITY dB 1 -5 7 dB 1 3
+ 021005 LINEAR DEPOLARISATION RATIO dB 0 -65 6 dB 0 2
+ 021006 CIRCULAR DEPOLARISATION RATIO dB 0 -65 6 dB 0 2
+ 021011 DOPPLER MEAN VELOCITY IN X-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021012 DOPPLER MEAN VELOCITY IN Y-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021013 DOPPLER MEAN VELOCITY IN Z-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021014 DOPPLER MEAN VELOCITY (RADIAL) M/S 1 -4096 13 M/S 1 4
+ 021017 DOPPLER VELOCITY SPECTRAL WIDTH M/S 1 0 8 M/S 1 3
+ 021021 ECHO TOPS M -3 0 4 M -3 2
+ 021030 SIGNAL TO NOISE RATIO dB 0 -32 8 dB 0 3
+ 021031 VERTICALLY INTEGRATED LIQUID-WATER CONTENT KG/M**2 0 0 7 KG/M**2 0 3
+ 021036 RADAR RAINFALL INTENSITY M/S 7 0 12 M/S 7 4
+ 021041 BRIGHT-BAND HEIGHT M -2 0 8 M -2 3
+ 021051 SIGNAL POWER ABOVE 1 MW dB 0 -256 8 dB 0 3
+ 021062 BACKSCATTER dB 2 -5000 13 dB 2 4
+ 021063 RADIOMETRIC RESOLUTION (NOISE VALUE) % 1 0 10 % 1 4
+ 021064 CLUTTER NOISE ESTIMATE NUMERIC 0 0 8 NUMERIC 0 3
+ 021065 MISSING PACKET COUNTER NUMERIC 0 -127 8 NUMERIC 0 3
+ 021066 WAVE SCATTEROMETER PRODUCT CONFIDENCE DATA FLAG TABLE 21066 0 0 12 FLAG TABLE 21066 0 4
+ 021067 WIND PRODUCT CONFIDENCE DATA FLAG TABLE 21067 0 0 13 FLAG TABLE 21067 0 5
+ 021068 RADAR ALTIMETER PRODUCT CONFIDENCE DATA FLAG TABLE 21068 0 0 8 FLAG TABLE 21068 0 3
+ 021069 SST PRODUCT CONFIDENCE DATA FLAG TABLE 21069 0 0 10 FLAG TABLE 21069 0 4
+ 021070 SST PRODUCT CONFIDENCE DATA (SADIST-2) FLAG TABLE 21070 0 0 23 FLAG TABLE 21070 0 6
+ 021071 PEAKINESS NUMERIC 0 0 16 NUMERIC 0 5
+ 021072 SATELLITE ALTIMETER CALIBRATION STATUS FLAG TABLE 21072 0 0 4 FLAG TABLE 21072 0 2
+ 021073 SATELLLITE ALTIMETER INSTRUMENT MODE FLAG TABLE 21073 0 0 9 FLAG TABLE 21073 0 3
+ 021075 IMAGE SPECTRUM INTENSITY NUMERIC 0 0 8 NUMERIC 0 3
+ 021076 REPRESENTATION OF INTENSITIES CODE TABLE 21076 0 0 3 CODE TABLE 21076 0 1
+ 021077 ALTITUDE CORRECTION (IONOSPHERE) M 3 0 14 M 3 5
+ 021078 ALTITUDE CORRECTION (DRY TROPOSPHERE) M 3 0 9 M 3 3
+ 021079 ALTITUDE CORRECTION (WET TROPOSPHERE) M 3 2000 10 M 3 4
+ 021080 ALTITUDE CORRECTION (CALIBRATION CONSTANT) M 3 0 11 M 3 4
+ 021081 OPEN LOOP CORRECTION (HEIGHT-TIME LOOP) M 3 0 10 M 3 4
+ 021082 OPEN LOOP CORRECTION (AUTO GAIN CONTROL) dB 3 -3000 14 dB 3 5
+ 021083 WARM TARGET CALIBRATION NUMERIC 0 0 16 NUMERIC 0 5
+ 021084 COLD TARGET CALIBRATION NUMERIC 0 0 16 NUMERIC 0 5
+ 021085 ATSR SEA SURFACE TEMPERATURE ACROSS- TRACK BAND NUMBER NUMERIC 0 0 4 NUMERIC 0 2
+ 021086 NUMBER OF PIXELS IN NADIR ONLY, AVERAGE NUMERIC 0 0 9 NUMERIC 0 3
+ 021087 NUMBER OF PIXELS IN DUAL VIEW, AVERAGE NUMERIC 0 0 9 NUMERIC 0 3
+ 021088 WET BACKSCATTER dB 2 -5000 13 dB 2 4
+ 021091 RADAR SIGNAL DOPPLER SPECTRUM 0TH MOMENT dB 0 -100 8 dB 0 3
+ 021092 RASS SIGNAL DOPPLER SPECTRUM 0TH MOMENT, REFERRING TO RASS SIGNA dB 0 -100 8 dB 0 3
+ 021093 Ku BAND PEAKINESS NUMERIC 3 0 16 NUMERIC 0 5
+ 021094 S BAND PEAKINESS NUMERIC 3 0 16 NUMERIC 0 5
+ 021101 NUMBER OF VECTOR AMBIGUITIES NUMERIC 0 0 3 NUMERIC 0 1
+ 021102 INDEX OF SELECTED WIND VECTOR NUMERIC 0 0 3 NUMERIC 0 1
+ 021103 TOTAL NUMBER OF SIGMA-0 MEASUREMENTS NUMERIC 0 0 5 NUMERIC 0 2
+ 021104 LIKELIHOOD COMPUTED FOR SOLUTION NUMERIC 3 -30000 15 NUMERIC 3 5
+ 021105 NORMALIZED RADAR CROSS-SECTION dB 2 -10000 14 dB 2 5
+ 021106 KP VARIANCE COEFFICIENT (ALPHA) NUMERIC 3 0 14 NUMERIC 3 5
+ 021107 KP VARIANCE COEFFICIENT (BETA) NUMERIC 8 0 16 NUMERIC 8 5
+ 021109 SEAWINDS WIND VECTOR CELL QUALITY FLAG TABLE 21109 0 0 17 FLAG TABLE 21109 0 6
+ 021110 NUMBER OF INNER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021111 NUMBER OF OUTER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021112 NUMBER OF INNER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021113 NUMBER OF OUTER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021114 KP VARIANCE COEFFICENT (GAMMA) dB 3 -140000 18 dB 3 6
+ 021115 SEAWINDS SIGMA-0 QUALITY FLAG TABLE 21115 0 0 17 FLAG TABLE 21115 0 6
+ 021116 SEAWINDS SIGMA-0 MODE FLAG TABLE 21116 0 0 17 FLAG TABLE 21116 0 6
+ 021117 SIGMA-0 VARIANCE QUALITY CONTROL NUMERIC 2 0 16 NUMERIC 2 5
+ 021118 ATTENUATION CORRECTION ON SIGMA-0 dB 2 -10000 14 dB 2 5
+ 021119 WIND SCATTEROMETER GEOPHYSICAL MODEL FUNCTION CODE TABLE 21119 0 0 6 CODE TABLE 21119 0 2
+ 021120 PROBABILITY OF RAIN NUMERIC 3 0 10 NUMERIC 3 4
+ 021121 SEAWINDS NOF* RAIN INDEX NUMERIC 0 0 8 NUMERIC 0 3
+ 021122 ATTENUATION CORRECTION OF SIGMA-0 (FROM TB) dB 2 -10000 14 dB 2 5
+ 021123 SEAWINDS NORMALIZED RADAR CROSS SECTION dB 2 -30000 15 dB 2 5
+ 021128 NUMBER OF VALID POINTS PER SECOND USED TO DERIVE PREVIOUS PARAME NUMERIC 0 0 8 NUMERIC 0 3
+ 021130 SPECTRUM TOTAL ENERGY NUMERIC 6 0 28 NUMERIC 6 9
+ 021131 SPECTRUM MAX ENERGY NUMERIC 6 0 28 NUMERIC 6 9
+ 021132 DIRECTION OF SPECTRUM MAX ON HIGHER RESOLUTION GRID DEGREE 3 0 19 DEGREE 3 6
+ 021133 WAVE-LENGTH OF SPECTRUM MAX ON HIGHER RESOLUTION GRID M 3 0 29 M 3 9
+ 021134 RANGE RESOLUTION OF CRESS COVARIANCE SPECTRUM RAD/M 3 0 19 RAD/M 3 6
+ 021135 REAL PART OF CROSS SPECTRA POLAR GRID NUMBER OF BINS NUMERIC 3 -524288 20 NUMERIC 3 7
+ 021136 IMAGINARY PART OF CROSS SPECTRA POLAR GRID NUMBER OF BINS NUMERIC 3 -524288 20 NUMERIC 3 7
+ 021137 KU BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021138 STD KU BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021139 KU BAND NET INSTRUMENTAL CORRECTION FOR AGC dB 2 -2048 12 dB 2 4
+ 021140 S BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021141 STD S BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021142 S BAND NET INSTRUMENTAL CORRECTION FOR AGC dB 2 -1024 11 dB 2 4
+ 021143 KU BAND RAIN ATTENUATION dB 2 -1073741824 31 dB 2 10
+ 021144 ALTIMETER RAIN FLAG FLAG TABLE 21144 0 0 2 FLAG TABLE 21144 0 1
+ 021150 BEAM COLLOCATION CODE TABLE 21150 0 0 2 CODE TABLE 21150 0 1
+ 021151 ESTIMATED ERROR IN SIGMA0 AT 40DEG INCIDENCE ANGLE dB 2 0 9 dB 2 3
+ 021152 SLOPE AT 40DEG INCIDENCE ANGLE dB/DEG 2 -80 7 dB/DEG 2 3
+ 021153 ESTIMATED ERROR IN SLOPE AT 40DEG INCIDENCE ANGLE dB/DEG 2 -40 6 dB/DEG 2 3
+ 021154 SOIL MOISTURE SENSITIVITY dB 2 0 12 dB 2 4
+ 021155 WIND VECTOR CELL QUALITY FLAG TABLE 21155 0 0 24 FLAG TABLE 21155 0 8
+ 021156 BACKSCATTER DISTANCE NUMERIC 1 -4096 13 NUMERIC 1 4
+ 021157 LOSS PER UNIT LENGTH OF ATMOSPHERE USED dB/M 10 0 22 dB/M 10 7
+ 021158 ASCAT kp ESTIMATE QUALITY CODE TABLE 21158 0 0 2 CODE TABLE 21158 0 1
+ 021159 ASCAT SIGMA-0 USABILITY CODE TABLE 21159 0 0 2 CODE TABLE 21159 0 1
+ 021160 ASCAT USE OF SYNTHETIC DATA NUMERIC 3 0 10 NUMERIC 3 4
+ 021161 ASCAT SYNTHETIC DATA QUALITY NUMERIC 3 0 10 NUMERIC 3 4
+ 021162 ASCAT SATELLITE ORBIT AND ATTITUDE QUALITY NUMERIC 3 0 10 NUMERIC 3 4
+ 021163 ASCAT SOLAR ARRAY REFLECTION CONTAMINATION NUMERIC 3 0 10 NUMERIC 3 4
+ 021164 ASCAT TELEMETRY PRESENCE AND QUALITY NUMERIC 3 0 10 NUMERIC 3 4
+ 021165 ASCAT EXTRAPOLATED REFERENCE FUNCTION PRESENCE NUMERIC 3 0 10 NUMERIC 3 4
+ 021166 ASCAT LAND FRACTION NUMERIC 3 0 10 NUMERIC 3 4
+ 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022002 DIRECTION OF WIND WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022003 DIRECTION OF SWELL WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022004 DIRECTION OF CURRENT DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022005 DIRECTION OF SEA SURFACE CURRENT DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022011 PERIOD OF WAVES S 0 0 6 S 0 2
+ 022012 PERIOD OF WIND WAVES S 0 0 6 S 0 2
+ 022013 PERIOD OF SWELL WAVES S 0 0 6 S 0 2
+ 022021 HEIGHT OF WAVES M 1 0 10 M 1 4
+ 022022 HEIGHT OF WIND WAVES M 1 0 10 M 1 4
+ 022023 HEIGHT OF SWELL WAVES M 1 0 10 M 1 4
+ 022025 STANDARD DEVIATION WAVE HEIGHT M 2 0 10 M 2 4
+ 022026 STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT M 2 0 10 M 2 4
+ 022031 SPEED OF CURRENT M/S 2 0 13 M/S 2 4
+ 022032 SPEED OF SEA SURFACE CURRENT M/S 2 0 13 M/S 2 4
+ 022035 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 2 0 14 M 2 4
+ 022036 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 2 0 14 M 2 4
+ 022037 TIDAL ELEVATION WITH RESPECT TO NATIONAL LAND DATUM M 3 -10000 15 M 3 5
+ 022038 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 3 -10000 15 M 3 5
+ 022039 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 3 -5000 12 M 3 4
+ 022040 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 3 -5000 14 M 3 5
+ 022041 SEA-SURFACE TEMPERATURE (15-DAY RUNNING MEAN) K 1 0 12 K 1 4
+ 022042 SEA/WATER TEMPERATURE K 1 0 12 K 1 4
+ 022043 SEA/WATER TEMPERATURE K 2 0 15 K 2 5
+ 022044 SOUND VELOCITY M/S 1 0 14 M/S 1 5
+ 022045 SEA/WATER TEMPERATURE K 3 0 19 K 3 6
+ 022049 SEA SURFACE TEMPERATURE K 2 0 15 K 2 5
+ 022050 STANDARD DEVIATION SEA-SURFACE TEMPERATURE K 2 0 8 K 2 3
+ 022055 FLOAT CYCLE NUMBER NUMERIC 0 0 10 NUMERIC 0 3
+ 022056 DIRECTION OF PROFILE CODE TABLE 22056 0 0 2 CODE TABLE 22056 0 1
+ 022059 SEA SURFACE SALINITY PART PER THOUSAND 2 0 14 PART PER THOUSAND 2 5
+ 022060 LAGRANGIAN DRIFTER DROGUE STATUS CODE TABLE 22060 0 0 3 CODE TABLE 22060 0 1
+ 022061 STATE OF THE SEA CODE TABLE 22061 0 0 4 CODE TABLE 22061 0 2
+ 022062 SALINITY PART PER THOUSAND 2 0 14 PART PER THOUSAND 2 5
+ 022063 TOTAL WATER DEPTH M 0 0 14 M 0 5
+ 022064 SALINITY PART PER THOUSAND 3 0 17 PART PER THOUSAND 3 6
+ 022065 WATER PRESSURE PA -3 0 17 PA -3 6
+ 022066 WATER CONDUCTIVITY S M-1 6 0 26 S M-1 6 8
+ 022067 INSTRUMENT TYPE FOR WATER TEMPERATURE PROFILE MEASUREMENT CODE TABLE 22067 0 0 10 CODE TABLE 22067 0 4
+ 022068 WATER TEMPERATURE PROFILE RECORDER TYPES CODE TABLE 22068 0 0 7 CODE TABLE 22068 0 3
+ 022069 SPECTRAL WAVE DENSITY M2HZ-1 3 0 22 M2HZ-1 3 7
+ 022070 SIGNIFICANT WAVE HEIGHT M 2 0 13 M 2 4
+ 022071 SPECTRAL PEAK WAVE PERIOD S 1 0 9 S 1 3
+ 022072 SPECTRAL PEAK WAVE LENGTH M 0 0 13 M 0 4
+ 022073 MAXIMUM WAVE HEIGHT M 2 0 13 M 2 4
+ 022074 AVERAGE WAVE PERIOD S 1 0 9 S 1 3
+ 022075 AVERAGE WAVE LENGTH M 0 0 13 M 0 4
+ 022076 DIRECTION FROM WHICH DOMINANT WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022077 DIRECTIONAL SPREAD OF DOMINANT WAVE DEGREE 0 0 9 DEGREE 0 3
+ 022078 DURATION OF WAVE RECORD S 0 0 12 S 0 4
+ 022079 LENGTH OF WAVE RECORD M 0 0 16 M 0 5
+ 022080 WAVEBAND CENTRAL FREQUENCY Hz 3 0 10 Hz 3 4
+ 022081 WAVEBAND CENTRAL WAVE NUMBER 1/M 5 0 13 1/M 5 4
+ 022082 MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE DENSITY M**2S 2 0 20 M**2S 2 7
+ 022083 MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE NUMBER M**3 2 0 20 M**3 2 7
+ 022084 BAND CONTAINING MAXIMUM NON- DIRECTIONAL SPECTRAL WAVE DENSITY NUMERIC 0 0 7 NUMERIC 0 3
+ 022085 SPECTRAL WAVE DENSITY RATIO NUMERIC 0 0 7 NUMERIC 0 3
+ 022086 MEAN DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022087 PRINCIPAL DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022088 FIRST NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7 NUMERIC 2 3
+ 022089 SECOND NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7 NUMERIC 2 3
+ 022090 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S 2 0 20 M**2S 2 7
+ 022091 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**3 2 0 20 M**3 2 7
+ 022092 DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S/RAD 2 0 20 M**2S/RAD 2 7
+ 022093 DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**4 2 0 20 M**4 2 7
+ 022094 TOTAL NUMBER OF WAVE BANDS NUMERIC 0 0 7 NUMERIC 0 3
+ 022095 DIRECTIONAL SPREAD OF INDIVIDUAL WAVES DEGREE 0 0 8 DEGREE 0 3
+ 022096 SPECTRAL BAND WIDTH 1/S 3 0 4 1/S 3 2
+ 022097 MEAN WAVELENGTH > 731 M OF IMAGE SPECTRUM AT LOW WAVE NUMBERS M 0 0 14 M 0 5
+ 022098 WAVELENGTH SPREAD (WAVELENGTH > 731 M) AT LOW WAVE NUMBERS M 0 0 14 M 0 5
+ 022099 MEAN DIRECTION AT LOW WAVE NUMBERS (WAVELENGTH > 731 M) DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022100 DIRECTION SPREAD AT LOW WAVE NUMBERS(WAVELENGTH > 731 M) DEGREE 0 0 9 DEGREE 0 3
+ 022101 TOTAL ENERGY (WAVELENGTH > 731M) AT LOW WAVE NUMBERS NUMERIC 0 0 31 NUMERIC 0 10
+ 022120 TIDE STATION AUTOMATED WATER LEVEL CHECK CODE TABLE 22120 0 0 5 CODE TABLE 22120 0 2
+ 022121 TIDE STATION MANUAL WATER LEVEL CHECK CODE TABLE 22121 0 0 5 CODE TABLE 22121 0 2
+ 022122 TIDE STATION AUTOMATED METEOROLOGICAL DATA CHECK CODE TABLE 22122 0 0 5 CODE TABLE 22122 0 2
+ 022123 TIDE STATION MANUAL METEOROLOGICAL DATA CHECK CODE TABLE 22123 0 0 5 CODE TABLE 22123 0 2
+ 022141 SEA-SURFACE TEMPERATURE (15-DAY RUNNING MEAN) K 2 0 15 K 2 5
+ 022150 NUMBER OF 18 HZ VALID POINTS FOR KU BAND NUMERIC 0 0 10 NUMERIC 0 4
+ 022151 KU BAND OCEAN RANGE M 3 0 31 M 3 10
+ 022152 STD OF 18 HZ KU BAND OCEAN RANGE M 3 0 16 M 3 5
+ 022153 NUMBER OF 18 HZ VALID POINTS FOR S BAND NUMERIC 0 0 10 NUMERIC 0 4
+ 022154 S BAND OCEAN RANGE M 3 0 31 M 3 10
+ 022155 STD OF 18 HZ S BAND OCEAN RANGE M 3 0 16 M 3 5
+ 022156 KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022157 STD 18HZ KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022158 S BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022159 STD 18HZ S BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022160 NORMALIZED INVERSE WAVE AGE NUMERIC 6 0 21 NUMERIC 6 7
+ 022161 WAVE SPECTRA M**4 4 0 27 M**4 4 9
+ 023001 ACCIDENT EARLY NOTIFICATION ARTICLE APPLICABLE CODE TABLE 23001 0 0 3 CODE TABLE 23001 0 1
+ 023002 ACTIVITY OR FACILITY INVOLVED IN INCIDENT CODE TABLE 23002 0 0 5 CODE TABLE 23002 0 2
+ 023003 TYPE OF RELEASE CODE TABLE 23003 0 0 3 CODE TABLE 23003 0 1
+ 023004 COUNTERMEASURES TAKEN NEAR BORDER CODE TABLE 23004 0 0 3 CODE TABLE 23004 0 1
+ 023005 CAUSE OF INCIDENT CODE TABLE 23005 0 0 2 CODE TABLE 23005 0 1
+ 023006 INCIDENT SITUATION CODE TABLE 23006 0 0 3 CODE TABLE 23006 0 1
+ 023007 CHARACTERISTICS OF RELEASE CODE TABLE 23007 0 0 3 CODE TABLE 23007 0 1
+ 023008 STATE OF CURRENT RELEASE CODE TABLE 23008 0 0 2 CODE TABLE 23008 0 1
+ 023009 STATE OF EXPECTED RELEASE CODE TABLE 23009 0 0 2 CODE TABLE 23009 0 1
+ 023016 POSSIBILITY OF SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT CODE TABLE 23016 0 0 2 CODE TABLE 23016 0 1
+ 023017 FLOW DISCHARGE OF MAJOR RECIPIENT M**3/S 6 0 20 M**3/S 6 7
+ 023018 RELEASE BEHAVIOUR OVER TIME CODE TABLE 23018 0 0 3 CODE TABLE 23018 0 1
+ 023019 ACTUAL RELEASE HEIGHT M 0 -15000 17 M 0 6
+ 023021 EFFECTIVE RELEASE HEIGHT M 0 -15000 17 M 0 6
+ 023022 DISTANCE OF RELEASE POINT OR SITE OF INCIDENT M 0 0 24 M 0 8
+ 023023 MAIN TRANSPORT SPEED IN THE ATMOSPHERE M/S 1 0 12 M/S 1 4
+ 023024 MAIN TRANSPORT SPEED IN WATER M/S 2 0 13 M/S 2 4
+ 023025 MAIN TRANSPORT SPEED IN GROUND WATER M/S 2 0 13 M/S 2 4
+ 023027 MAIN TRANSPORT DIRECTION IN THE ATMOSPHERE DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023028 MAIN TRANSPORT DIRECTION IN WATER DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023029 MAIN TRANSPORT DIRECTION IN GROUND WATER DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023031 POSSIBILITY THAT PLUME WILL ENCOUNTER PRECIPITATION IN STATE IN CODE TABLE 23031 0 0 2 CODE TABLE 23031 0 1
+ 023032 PLUME WILL ENCOUNTER CHANGE IN WIND DIRECTION AND/OR SPEED FLAG CODE TABLE 23032 0 0 2 CODE TABLE 23032 0 1
+ 024001 ESTIMATE OF AMOUNT OF RADIOACTIVITY RELEASED UP TO SPECIFIED TIM Bq -11 0 28 Bq -11 9
+ 024002 ESTIMATED MAXIMUM POTENTIAL RELEASE Bq -11 0 28 Bq -11 9
+ 024003 COMPOSITION OF RELEASE CODE TABLE 24003 0 0 5 CODE TABLE 24003 0 2
+ 024004 ELEMENT NAME CCITTIA5 0 0 16 CHARACTER 0 2
+ 024005 ISOTOPE MASS NUMERIC 0 0 9 NUMERIC 0 3
+ 024011 DOSE mSv 2 0 32 mSv 2 10
+ 024012 TRAJECTORY DOSE (DEFINED LOCATION AND EXPECTED TIME OF ARRIVAL) mSv 2 0 32 mSv 2 10
+ 024013 GAMMA DOSE IN AIR ALONG THE MAIN TRANSPORT PATH (DEFINED LOCATIO mSv 2 0 32 mSv 2 10
+ 024021 AIR CONCENTRATION (OF NAMED ISOTOPE TYPE INCLUDING GROSS BETA) Bq/M**3 2 0 32 Bq/M**3 2 10
+ 024022 CONCENTRATION IN PRECIPITATION (OF NAMES ISOTOPE TYPE) Bq/L 2 0 32 BQ L-1 2 10
+ 024023 PULSE RATE OF BETA RADIATION 1/S 1 0 14 1/S 1 4
+ 024024 PULSE RATE OF GAMMA RADIATION 1/S 1 0 14 1/S 1 4
+ 025001 RANGE-GATE LENGTH M -1 0 6 M -1 2
+ 025002 NUMBER OF GATES AVERAGED NUMERIC 0 0 4 NUMERIC 0 2
+ 025003 NUMBER OF INTEGRATED PULSES NUMERIC 0 0 8 NUMERIC 0 3
+ 025004 ECHO PROCESSING CODE TABLE 25004 0 0 2 CODE TABLE 25004 0 1
+ 025005 ECHO INTEGRATION CODE TABLE 25005 0 0 2 CODE TABLE 25005 0 1
+ 025006 Z TO R CONVERSION CODE TABLE 25006 0 0 3 CODE TABLE 25006 0 1
+ 025007 Z TO R CONVERSION FACTOR NUMERIC 0 0 12 NUMERIC 0 4
+ 025008 Z TO R CONVERSION EXPONENT NUMERIC 2 0 9 NUMERIC 2 3
+ 025009 CALIBRATION METHOD FLAG TABLE 25009 0 0 4 FLAG TABLE 25009 0 2
+ 025010 CLUTTER TREATMENT CODE TABLE 25010 0 0 4 CODE TABLE 25010 0 2
+ 025011 GROUND OCCULTATION CORRECTION (SCREENING) CODE TABLE 25011 0 0 2 CODE TABLE 25011 0 1
+ 025012 RANGE ATTENUATION CORRECTION CODE TABLE 25012 0 0 2 CODE TABLE 25012 0 1
+ 025013 BRIGHT-BAND CORRECTION FLAG TABLE 25013 0 0 2 FLAG TABLE 25013 0 1
+ 025014 AZIMUTH CLUTTER CUT-OFF (SEE NOTE 1) NUMERIC 0 0 12 NUMERIC 0 4
+ 025015 RADOME ATTENUATION CORRECTION FLAG TABLE 25015 0 0 2 FLAG TABLE 25015 0 1
+ 025016 CLEAR-AIR ATTENUATION CORRECTION dB/M 5 0 6 dB/M 5 2
+ 025017 PRECIPITATION ATTENUATION CORRECTION FLAG TABLE 25017 0 0 2 FLAG TABLE 25017 0 1
+ 025018 A TO Z LAW FOR ATTENUATION FACTOR NUMERIC 7 0 6 NUMERIC 7 2
+ 025019 A TO Z LAW FOR ATTENUATION EXPONENT NUMERIC 2 0 7 NUMERIC 2 3
+ 025020 MEAN SPEED ESTIMATION CODE TABLE 25020 0 0 2 CODE TABLE 25020 0 1
+ 025021 WIND COMPUTATION ENHANCEMENT FLAG TABLE 25021 0 0 8 FLAG TABLE 25021 0 3
+ 025025 BATTERY VOLTAGE V 1 0 9 V 1 3
+ 025026 BATTERY VOLTAGE (LARGE RANGE) V 1 0 12 V 1 4
+ 025028 OPERATOR OR MANUFACTURER DEFINED PARAMETER NUMERIC 1 -16384 15 NUMERIC 1 5
+ 025030 RUNNING MEAN SEA-SURFACE TEMPERATURE USAGE CODE TABLE 25030 0 0 2 CODE TABLE 25030 0 1
+ 025032 WIND PROFILER MODE INFORMATION CODE TABLE 25032 0 0 2 CODE TABLE 25032 0 1
+ 025033 WIND PROFILER SUBMODE INFORMATION* CODE TABLE 25033 0 0 2 CODE TABLE 25033 0 1
+ 025034 WIND PROFILER QUALITY CONTROL TEST RESULTS* FLAG TABLE 25034 0 0 4 FLAG TABLE 25034 0 2
+ 025036 ATMOSPHERICS LOCATION METHOD CODE TABLE 25036 0 0 4 CODE TABLE 25036 0 2
+ 025040 CO2 WIND PRODUCT DERIVATION CODE TABLE 25040 0 0 4 CODE TABLE 25040 0 2
+ 025041 MOVING PLATFORM DIRECTION REPORTING METHOD CODE TABLE 25041 0 0 2 CODE TABLE 25041 0 1
+ 025042 MOVING PLATFORM SPEED REPORTING METHOD CODE TABLE 25042 0 0 2 CODE TABLE 25042 0 1
+ 025043 WAVE SAMPLING INTERVAL (TIME) S 4 0 15 S 4 5
+ 025044 WAVE SAMPLING INTERVAL (SPACE) M 2 0 14 M 2 5
+ 025045 HIRS CHANNEL COMBINATION FLAG TABLE 25045 0 0 21 FLAG TABLE 25045 0 7
+ 025046 MSU CHANNEL COMBINATION FLAG TABLE 25046 0 0 5 FLAG TABLE 25046 0 2
+ 025047 SSU CHANNEL COMBINATION FLAG TABLE 25047 0 0 4 FLAG TABLE 25047 0 2
+ 025048 AMSU-A CHANNEL COMBINATION FLAG TABLE 25048 0 0 16 FLAG TABLE 25048 0 6
+ 025049 AMSU-B CHANNEL COMBINATION FLAG TABLE 25049 0 0 6 FLAG TABLE 25049 0 2
+ 025051 AVHRR CHANNEL COMBINATION FLAG TABLE 25051 0 0 7 FLAG TABLE 25051 0 3
+ 025052 LOG-10 OF PRINCIPAL COMPONENTS NORMALIZED FIT TO DATA NUMERIC 4 0 15 NUMERIC 4 5
+ 025053 OBSERVATION QUALITY FLAG TABLE 25053 0 0 12 FLAG TABLE 25053 0 4
+ 025054 SSMIS SUBFRAME ID NEMBER NUMERIC 0 0 5 NUMERIC 0 2
+ 025055 MULTIPLEXER HOUSEKEEPING K 2 0 16 K 2 5
+ 025060 SOFTWARE IDENTIFICATION (SEE NOTE 2) NUMERIC 0 0 14 NUMERIC 0 5
+ 025061 SOFTWARE IDENTIFICATION AND VERSION NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 025062 DATABASE IDENTIFICATION NUMERIC 0 0 14 NUMERIC 0 5
+ 025065 ORIENTATION CORRECTION (AZIMUTH) DEGREE 2 -1000 11 DEGREE 2 4
+ 025066 ORIENTATION CORRECTION (ELEVATION) DEGREE 2 -1000 11 DEGREE 2 4
+ 025067 RADIOSONDE RELEASE POINT PRESSURE CORRECTION PA 0 -8000 14 PA 0 4
+ 025068 NUMBER OF ARCHIVE RECOMPUTES NUMERIC 0 0 7 NUMERIC 0 3
+ 025069 FLIGHT LEVEL PRESSURE CORRECTIONS FLAG TABLE 25069 0 0 8 FLAG TABLE 25069 0 3
+ 025070 MAJOR FRAME COUNT NUMERIC 0 0 4 NUMERIC 0 2
+ 025071 FRAME COUNT NUMERIC 0 0 5 NUMERIC 0 2
+ 025075 SATELLITE ANTENNA CORRECTIONS VERSION NUMBER NUMERIC 0 0 5 NUMERIC 0 2
+ 025076 LOG-10 OF (TEMPERATURE-RADIANCE CENTRAL WAVENUMBER) FOR ATOVS LOG (1/M) 8 0 30 LOG (1/M) 8 10
+ 025077 BANDWIDTH CORRECTION COEFFICIENT 1 FOR ATOVS NUMERIC 5 -100000 18 NUMERIC 5 7
+ 025078 BANDWIDTH CORRECTION COEFFICIENT 2 FOR ATOVS NUMERIC 5 0 17 NUMERIC 5 6
+ 025079 ALBEDO-RADIANCE SOLAR FILTERED IRRADIANCE FOR ATOVS W/M**2 4 0 24 W/M**2 4 8
+ 025080 ALBEDO-RADIANCE EQUIVALENT FILTER WIDTH FOR ATOVS M 10 0 14 M 10 5
+ 025085 FRACTION OF CLEAR PIXELS IN HIRS FOV NUMERIC 0 0 7 NUMERIC 0 3
+ 025086 DEPTH CORRECTION INDICATOR CODE TABLE 25086 0 0 2 CODE TABLE 25086 0 1
+ 025091 STRUCTURE CONSTANT OF THE REFRACTION INDEX (CN2) dB 3 -18192 13 dB 3 5
+ 025092 ACOUSTIC PROPAGATION VELOCITY M/S 2 28000 14 M/S 2 5
+ 025093 RASS COMPUTATION CORRECTION FLAG TABLE 25093 0 0 8 FLAG TABLE 25093 0 3
+ 025095 ALTIMETER STATE FLAG FLAG TABLE 25095 0 0 2 FLAG TABLE 25095 0 1
+ 025096 RADIOMETER STATE FLAG FLAG TABLE 25096 0 0 5 FLAG TABLE 25096 0 2
+ 025097 THREE DIMENSIONAL ERROR ESTIMATE OF THE NAVIGATOR ORBIT CODE TABLE 25097 0 0 4 CODE TABLE 25097 0 2
+ 025100 XBT/XCTD FALL RATE EQUATION COEFFICIENT A NUMERIC 5 0 20 NUMERIC 5 6
+ 025101 XBT/XCTD FALL RATE EQUATION COEFFICIENT B NUMERIC 5 -500000 21 NUMERIC 5 6
+ 025102 NUMBER OF MISSING LINES EXCLUDING DATA GAPS NUMERIC 0 0 8 NUMERIC 0 3
+ 025103 NUMBER OF DIRECTIONAL BINS NUMERIC 0 0 8 NUMERIC 0 3
+ 025104 NUMBER OF WAVE-LENGTH BINS NUMERIC 0 0 8 NUMERIC 0 3
+ 025107 FIRST WAVE-LENGTH BIN M 3 0 29 M 3 9
+ 025108 LAST WAVE-LENGTH BIN M 3 0 29 M 3 9
+ 025111 NUMBER OF INPUT DATA GAPS NUMERIC 0 0 8 NUMERIC 0 3
+ 025120 RA2-L2-PROCESSING FLAG CODE TABLE 25120 0 0 2 CODE TABLE 25120 0 1
+ 025121 RA2-L2-PROCESSING QUALITY % 0 0 7 % 0 3
+ 025122 HARDWARE CONFIGURATION FOR RF CODE TABLE 25122 0 0 2 CODE TABLE 25122 0 1
+ 025123 HARDWARE CONFIGURATION FOR HPA CODE TABLE 25123 0 0 2 CODE TABLE 25123 0 1
+ 025124 MWR L2 PROCESSING FLAG CODE TABLE 25124 0 0 2 CODE TABLE 25124 0 1
+ 025125 MWR L2-PROCESSING QUALITY % 0 0 7 % 0 3
+ 025126 MODEL DRY TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025127 INVERTED BAROMETER CORRECTION M 3 -32768 16 M 3 5
+ 025128 MODEL WET TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025129 MWR DERIVED WET TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025130 RA2 IONOSPHERIC CORRECTION ON KU BAND M 3 -32768 16 M 3 5
+ 025131 IONOSPHERIC CORRECTION FROM DORIS ON KU BAND M 3 -32768 16 M 3 5
+ 025132 IONOSPHERIC CORRECTION FROM MODEL ON KU BAND M 3 -32768 16 M 3 5
+ 025133 SEA STATE BIAS CORRECTION ON KU BAND M 3 -32768 16 M 3 5
+ 025134 RA2 IONOSPHERIC CORRECTION ON S BAND M 3 -32768 16 M 3 5
+ 025135 IONOSPHERIC CORRECTION FROM DORIS ON S BAND M 3 -32768 16 M 3 5
+ 025136 IONOSPHERIC CORRECTION FROM MODEL ON S BAND M 3 -32768 16 M 3 5
+ 025137 SEA STATE BIAS CORRECTION ON S BAND M 3 -32768 16 M 3 5
+ 025138 AVERAGE SIGNAL TO NOISE RATION NUMERIC 0 -2048 12 NUMERIC 0 4
+ 025140 START CHANNEL NUMERIC 0 0 14 NUMERIC 0 5
+ 025141 END CHANNEL NUMERIC 0 0 14 NUMERIC 0 5
+ 025142 CHANNEL SCALE FACTOR NUMERIC 0 0 6 NUMERIC 0 2
+ 025150 SATELLITE INTENSITY ANALYSIS METHOD OF TROPICAL CYCLONE CODE TABLE 25150 0 0 4 CODE TABLE 25150 2 2
+ 026001 PRINCIPAL TIME OF DAILY READING IN UTC OF MAXIMUM TEMPERATURE HOUR 1 0 12 HOUR 1 3
+ 026002 PRINCIPAL TIME OF DAILY READING IN UTC OF MINIMUM TEMPERATURE HOUR 1 0 12 HOUR 1 3
+ 026003 TIME DIFFERENCE MINUTE 0 -1440 12 MINUTE 0 4
+ 026010 HOURS INCLUDED FLAG TABLE 26010 0 0 26 FLAG TABLE 26010 0 9
+ 026020 DURATION OF PRECIPITATION MINUTE 0 0 11 MINUTE 0 4
+ 027001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 027002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 027003 ALTERNATE LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 027004 ALTERNATE LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 027020 SATELLITE LOCATION COUNTER NUMERIC 0 0 16 NUMERIC 0 5
+ 027021 SATELLITE SUBLOCATION DIMENSION NUMERIC 0 0 16 NUMERIC 0 5
+ 027031 IN DIRECTION OF 0 DEGREES LONGITUDE, DISTANCE FROM THE EARTH'S C M 2 -1073741824 31 M 2 10
+ 027080 VIEWING AZIMUTH ANGLE DEGREE TRUE 2 0 16 DEGREE TRUE 0 5
+ 028001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 028002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 028003 ALTERNATE LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 028004 ALTERNATE LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 028031 IN DIRECTION 90 DEGREES EAST, DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31 M 2 10
+ 029001 PROJECTION TYPE CODE TABLE 29001 0 0 3 CODE TABLE 29001 0 1
+ 029002 CO-ORDINATE GRID TYPE CODE TABLE 29002 0 0 3 CODE TABLE 29002 0 1
+ 030001 PIXEL VALUE (4 BITS) NUMERIC 0 0 4 NUMERIC 0 2
+ 030002 PIXEL VALUE (8 BITS) NUMERIC 0 0 8 NUMERIC 0 3
+ 030004 PIXEL VALUE (16 BITS) NUMERIC 0 0 16 NUMERIC 0 5
+ 030021 NUMBER OF PIXELS PER ROW NUMERIC 0 0 12 NUMERIC 0 4
+ 030022 NUMBER OF PIXELS PER COLUMN NUMERIC 0 0 12 NUMERIC 0 4
+ 030031 PICTURE TYPE CODE TABLE 30031 0 0 4 CODE TABLE 30031 0 2
+ 030032 COMBINATION WITH OTHER DATA FLAG TABLE 30032 0 0 16 FLAG TABLE 30032 0 6
+ 031000 SHORT DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 1 NUMERIC 0 1
+ 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8 NUMERIC 0 3
+ 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16 NUMERIC 0 5
+ 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8 NUMERIC 0 3
+ 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16 NUMERIC 0 5
+ 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 31021 0 0 6 CODE TABLE 31021 0 2
+ 031031 DATA PRESENT INDICATOR FLAG TABLE 31031 0 0 1 FLAG TABLE 31031 0 1
+ 033002 QUALITY INFORMATION CODE TABLE 33002 0 0 2 CODE TABLE 33002 0 1
+ 033003 QUALITY INFORMATION CODE TABLE 33003 0 0 3 CODE TABLE 33003 0 1
+ 033005 QUALITY INFORMATION (AWS DATA) FLAG TABLE 33005 0 0 30 FLAG TABLE 33005 0 10
+ 033006 INTERNAL MEASUREMENT STATUS INFORMATION (AWS) CODE TABLE 33006 0 0 3 CODE TABLE 33006 0 1
+ 033007 PER CENT CONFIDENCE % 0 0 7 % 0 3
+ 033015 DATA QUALITY CHECK INDICATOR CODE TABLE 33015 0 0 6 CODE TABLE 33015 0 2
+ 033020 QUALITY CONTROL INDICATION OF FOLLOWING VALUE CODE TABLE 33020 0 0 3 CODE TABLE 33020 0 1
+ 033021 QUALITY OF FOLLOWING VALUE CODE TABLE 33021 0 0 2 CODE TABLE 33021 0 1
+ 033022 QUALITY OF BUOY SATELLITE TRANSMISSION CODE TABLE 33022 0 0 2 CODE TABLE 33022 0 1
+ 033023 QUALITY OF BUOY LOCATION CODE TABLE 33023 0 0 2 CODE TABLE 33023 0 1
+ 033024 STATION ELEVATION QUALITY MARK (FOR MOBILE STATIONS) CODE TABLE 33024 0 0 4 CODE TABLE 33024 0 2
+ 033025 ACARS INTERPOLATED VALUES CODE TABLE 33025 0 0 3 CODE TABLE 33025 0 1
+ 033026 MOISTURE QUALITY CODE TABLE 33026 0 0 6 CODE TABLE 33026 0 2
+ 033027 LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66 % CONFIDENCE) CODE TABLE 33027 0 0 3 CODE TABLE 33027 0 1
+ 033030 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 33030 0 0 24 FLAG TABLE 33030 0 8
+ 033031 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 33031 0 0 24 FLAG TABLE 33031 0 8
+ 033032 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 33032 0 0 24 FLAG TABLE 33032 0 8
+ 033033 FIELD OF VIEW QUALITY FLAGS FOR ATOVS FLAG TABLE 33033 0 0 24 FLAG TABLE 33033 0 8
+ 033035 MANUAL/AUTOMATIC QUALITY CONTROL CODE TABLE 33035 0 0 4 CODE TABLE 33035 0 2
+ 033036 NOMINAL CONFIDENCE THRESHOLD % 0 0 7 % 0 3
+ 033037 WIND CORRELATION ERROR FLAG TABLE 33037 0 0 20 FLAG TABLE 33037 0 7
+ 033038 QUALITY FLAGS FOR GROUND-BASED GNSS DATA FLAG TABLE 33038 0 0 10 FLAG TABLE 33038 0 4
+ 033039 QUALITY FLAGS FOR RADIO OCCULTATION DATA FLAG TABLE 33039 0 0 16 FLAG TABLE 33039 0 6
+ 033040 CONFIDENCE INTERVAL % 0 0 7 PERCENT 0 3
+ 033041 ATTRIBUTE OF FOLLOWING VALUE CODE TABLE 33041 0 0 2 CODE TABLE 33041 0 1
+ 033042 TYPE OF LIMIT REPRESENTED BY FOLLOWING VALUE CODE TABLE 33042 0 0 3 CODE TABLE 33042 0 1
+ 033043 AST CONFIDENCE FLAG TABLE 33043 0 0 8 FLAG TABLE 33043 0 3
+ 033044 ASAR QUALITY INFORMATION FLAG TABLE 33044 0 0 15 FLAG TABLE 33044 0 5
+ 033045 PROBABILITY OF FOLLOWING EVENT % 0 0 7 % 0 3
+ 033046 CONDITIONAL PROBABILITY OF FOLLOWING EVENT WITH RESPECT TO SPECI % 0 0 7 % 0 3
+ 033047 MEASUREMENT CONFIDENCE DATA FLAG TABLE 33047 0 0 31 FLAG TABLE 33047 0 11
+ 033048 CONFIDENCE MEASURE OF SAR INVERSION CODE TABLE 33048 0 0 2 CODE TABLE 33048 0 1
+ 033049 CONFIDENCE MEASURE OF WIND RETRIEVAL CODE TABLE 33049 0 0 2 CODE TABLE 33049 0 1
+ 033050 GLOBAL GTSPP QUALITY FLAG CODE TABLE 33050 0 0 4 CODE TABLE 33050 0 2
+ 033052 S BAND OCEAN RETRACKING QUALITY FLAG TABLE 33052 0 0 21 FLAG TABLE 33052 0 7
+ 033053 KU BAND OCEAN RETRACKING QUALITY FLAG TABLE 33053 0 0 21 FLAG TABLE 33053 0 7
+ 033060 GQISFLAGQUAL-INDIVIDUAL IASI-SYSTEM QUALITY FLAG CODE TABLE 33060 0 0 2 CODE TABLE 33060 0 1
+ 033061 GQISQUALINDEX - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE % 0 0 7 % 0 3
+ 033062 GQISQUALINDEXLOC - INDICATOR FOR GEOMETRIC QUALITY INDEX % 0 0 7 % 0 3
+ 033063 GQISQUALINDEXRAD - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE % 0 0 7 % 0 3
+ 033064 GQISQUALINDEXSPECT - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE % 0 0 7 % 0 3
+ 033065 GQISSYSTECSONDQUAL - OUTPUT OF SYSTEM TEC QUALITY FUNCTION NUMERIC 0 0 24 NUMERIC 0 24
+ 033066 SBUV TOTAL OZONE QUALITY CODE TABLE 33066 0 0 4 CODE TABLE 33066 0 2
+ 033067 SBUV PROFILE OZONE QUALITY CODE TABLE 33067 0 0 4 CODE TABLE 33067 0 2
+ 035000 FM AND REGIONAL CODE NUMBER CODE TABLE 35000 0 0 10 CODE TABLE 35000 0 3
+ 035001 TIME-FRAME FOR MONITORING CODE TABLE 35001 0 0 3 CODE TABLE 35001 0 1
+ 035011 NUMBER OF REPORTS ACTUALLY RECEIVED NUMERIC 0 0 14 NUMERIC 0 4
+ 035021 BULLETIN BEING MONITORED (TTAAII) CCITTIA5 0 0 48 CHARACTER 0 6
+ 035022 BULLETIN BEING MONITORED (YYGGGG) CCITTIA5 0 0 48 CHARACTER 0 6
+ 035023 BULLETIN BEING MONITORED (CCCC) CCITTIA5 0 0 32 CHARACTER 0 4
+ 035024 BULLETIN BEING MONITORED (BBB) CCITTIA5 0 0 24 CHARACTER 0 3
+ 035030 DISCREPANCIES IN THE AVAILABILITY OF EXPECTED DATA CODE TABLE 35030 0 0 4 CODE TABLE 35030 0 1
+ 035031 QUALIFIER ON MONITORING RESULTS CODE TABLE 35031 0 0 7 CODE TABLE 35031 0 2
+ 035032 CAUSE OF MISSING DATA CODE TABLE 35032 0 0 4 CODE TABLE 35032 0 1
+ 035033 OBSERVATION AND COLLECTION DEFICIENCIES CODE TABLE 35033 0 0 7 CODE TABLE 35033 0 2
+ 035034 STATISTICAL TRENDS FOR AVAILABILITY OF DATA (DURING THE SURVEY P CODE TABLE 35034 0 0 3 CODE TABLE 35034 0 1
+ 035035 REASON FOR TERMINATION CODE TABLE 35035 0 0 5 CODE TABLE 35035 0 2
+ 040001 SURFACE SOIL MOISTURE (MS) % 1 0 10 % 1 4
+ 040002 ESTIMATED ERROR IN SURFACE SOIL MOISTURE % 1 0 10 % 1 4
+ 040003 MEAN SURFACE SOIL MOISTURE NUMERIC 3 0 10 NUMERIC 3 4
+ 040004 RAIN FALL DETECTION NUMERIC 3 0 10 NUMERIC 3 4
+ 040005 SOIL MOISTURE CORRECTION FLAG FLAG TABLE 40005 0 0 8 FLAG FLAG TABLE 40005 0 3
+ 040006 SOIL MOISTURE PROCESSING FLAG FLAG TABLE 40006 0 0 16 FLAG FLAG TABLE 40006 0 5
+ 040007 SOIL MOISTURE QUALITY % 1 0 10 % 1 4
+ 040008 FROZEN LAND SURFACE FRACTION % 1 0 10 % 1 4
+ 040009 INUNDATION AND WETLAND FRACTION % 1 0 10 % 1 4
+ 040010 TOPOGRAPHIC COMPLEXITY % 1 0 10 % 1 4
diff --git a/crextables/B000203 b/crextables/B000203
new file mode 100755
index 0000000..176d728
--- /dev/null
+++ b/crextables/B000203
@@ -0,0 +1,1197 @@
+ 000001 TABLE A: ENTRY CCITTIA5 0 0 24 CHARACTER 0 3
+ 000002 TABLE A: DATA CATEGORY DESCRIPTION, LINE 1 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000003 TABLE A: DATA CATEGORY DESCRIPTION, LINE 2 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000004 BUFR/CREX MASTER TABLE CCITTIA5 0 0 16 CHARACTER 0 2
+ 000005 BUFR/CREX EDITION NUMBER CCITTIA5 0 0 24 CHARACTER 0 3
+ 000006 BUFR MASTER TABLE VERSION NUMBER CCITTIA5 0 0 16 CHARACTER 0 2
+ 000007 CREX MASTER TABLE VERSION NUMBER CCITTIA5 0 0 16 CHARACTER 0 2
+ 000008 BUFR LOCAL TABLE VERSION NUMBER CCITTIA5 0 0 16 CHARACTER 0 2
+ 000010 F DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 8 CHARACTER 0 1
+ 000011 X DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 16 CHARACTER 0 2
+ 000012 Y DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 24 CHARACTER 0 3
+ 000013 ELEMENT NAME, LINE 1 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000014 ELEMENT NAME, LINE 2 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000015 UNITS NAME CCITTIA5 0 0 192 CHARACTER 0 24
+ 000016 UNITS SCALE SIGN CCITTIA5 0 0 8 CHARACTER 0 1
+ 000017 UNITS SCALE CCITTIA5 0 0 24 CHARACTER 0 3
+ 000018 UNITS REFERENCE SIGN CCITTIA5 0 0 8 CHARACTER 0 1
+ 000019 UNITS REFERENCE VALUE CCITTIA5 0 0 80 CHARACTER 0 10
+ 000020 ELEMENT DATA WIDTH CCITTIA5 0 0 24 CHARACTER 0 3
+ 000030 DESCRIPTOR DEFINING SEQUENCE CCITTIA5 0 0 48 CHARACTER 0 6
+ 001001 WMO BLOCK NUMBER NUMERIC 0 0 7 NUMERIC 0 2
+ 001002 WMO STATION NUMBER NUMERIC 0 0 10 NUMERIC 0 3
+ 001003 WMO REGION NUMBER/GEOGRAPHICAL AREA CODE TABLE 1003 0 0 3 CODE TABLE 1003 0 1
+ 001004 WMO REGION SUB-AREA (SEE NOTE 9) NUMERIC 0 0 3 NUMERIC 0 1
+ 001005 BUOY/PLATFORM IDENTIFIER NUMERIC 0 0 17 NUMERIC 0 5
+ 001006 AIRCRAFT FLIGHT NUMBER CCITTIA5 0 0 64 CHARACTER 0 8
+ 001007 SATELLITE IDENTIFIER CODE TABLE 1007 0 0 10 CODE TABLE 1007 0 4
+ 001008 AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION CCITTIA5 0 0 64 CHARACTER 0 8
+ 001009 TYPE OF COMMERCIAL AIRCRAFT CCITTIA5 0 0 64 CHARACTER 0 8
+ 001010 STATIONARY BUOY PLATFORM IDENTIFIER; E.G. C-MAN BUOYS CCITTIA5 0 0 64 CHARACTER 0 8
+ 001011 SHIP OR MOBILE LAND STATION IDENTIFIER CCITTIA5 0 0 72 CHARACTER 0 9
+ 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM* M/S 0 0 10 M/S 0 3
+ 001014 PLATFORM DRIFT SPEED (HIGH PRECISION) M/S 2 0 10 M/S 2 4
+ 001015 STATION OR SITE NAME CCITTIA5 0 0 160 CHARACTER 0 20
+ 001018 SHORT STATION OR SITE NAME CCITTIA5 0 0 40 CHARACTER 0 5
+ 001019 LONG STATION OR SITE NAME CCITTIA5 0 0 256 CHARACTER 0 32
+ 001020 WMO REGION SUB-AREA NUMERIC 0 0 4 NUMERIC 0 2
+ 001021 SYNOPTIC FEATURE IDENTIFIER NUMERIC 0 0 14 NUMERIC 0 4
+ 001022 NAME OF FEATURE (SEE NOTE 11) CCITTIA5 0 0 224 CHARACTER 0 28
+ 001023 OBSERVATION SEQUENCE NUMBER NUMERIC 0 0 9 NUMERIC 0 3
+ 001025 STORM IDENTIFIER CCITTIA5 0 0 24 CHARACTER 0 3
+ 001026 WMO STORM NAME CCITTIA5 0 0 64 CHARACTER 0 8
+ 001027 WMO LONG STORM NAME CCITTIA5 0 0 80 CHARACTER 0 10
+ 001031 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE (SEE NOTE 10) CODE TABLE 1031 0 0 16 CODE TABLE 1031 0 5
+ 001032 GENERATING APPLICATION CODE TABLE 1032 0 0 8 CODE TABLE 1032 0 3
+ 001033 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE CODE TABLE 1033 0 0 8 CODE TABLE 1033 0 3
+ 001034 IDENTIFICATION OF ORIGINATING/GENERATING SUB-CENTRE CODE TABLE 1034 0 0 8 CODE TABLE 1034 0 3
+ 001035 ORIGINATING CENTRE COMMON CODE TABLE C-11 0 0 16 COMMON CODE TABLE C-11 0 5
+ 001036 AGENCY IN CHARGE OF OPERATING THE OBSERVING PLATFORM CODE TABLE 1036 0 0 20 CODE TABLE 1036 0 7
+ 001041 ABSOLUTE PLATFORM VELOCITY - FIRST COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001042 ABSOLUTE PLATFORM VELOCITY - SECOND COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001043 ABSOLUTE PLATFORM VELOCITY - THIRD COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001050 PLATFORM TRANSMITTER ID NUMBER NUMERIC 0 0 17 NUMERIC 0 6
+ 001051 PLATFORM TRANSMITTER ID NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 001060 AIRCRAFT REPORTING POINT (BEACON IDENTIFIER) CCITTIA5 0 0 64 CHARACTER 0 8
+ 001062 SHORT ICAO LOCATION INDICATOR CCITTIA5 0 0 32 CHARACTER 0 4
+ 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64 CHARACTER 0 8
+ 001064 RUNWAY DESIGNATOR CCITTIA5 0 0 32 CHARACTER 0 4
+ 001075 TIDE STATION IDENTIFICATION CCITTIA5 0 0 40 CHARACTER 0 5
+ 001080 SHIP LINE NUMBER ACCORDING TO SOOP CCITTIA5 0 0 32 CHARACTER 0 4
+ 001081 RADIOSONDE SERIAL NUMBER CCITTIA5 0 0 160 CHARACTER 0 20
+ 001082 RADIOSONDE ASCENSION NUMBER (SEE NOTE 12) NUMERIC 0 0 14 NUMERIC 0 4
+ 001083 RADIOSONDE RELEASE NUMBER (SEE NOTE 12) NUMERIC 0 0 3 NUMERIC 0 1
+ 001085 OBSERVING PLATFORM MANUFACTURER'S MODEL CCITTIA5 0 0 160 CHARACTER 0 20
+ 001086 OBSERVING PLATFORM MANUFACTURER'S SERIAL NUMBER CCITTIA5 0 0 256 CHARACTER 0 32
+ 001087 WMO MARINE OBSERVING PLATFORM EXTENDED IDENTIFIER NUMERIC 0 0 23 NUMERIC 0 7
+ 001090 TECHNIQUE FOR MAKING UP INITIAL PERTURBATIONS CODE TABLE 1090 0 0 8 CODE TABLE 1090 0 3
+ 001091 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 10 NUMERIC 0 4
+ 001092 TYPE OF ENSEMBLE FORECAST CODE TABLE 1092 0 0 8 CODE TABLE 1092 0 3
+ 001093 BALLOON LOT NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 001094 WBAN NUMBER NUMERIC 0 0 17 NUMERIC 0 5
+ 001095 OBSERVER IDENTIFICATION CCITTIA5 0 0 32 CHARACTER 0 4
+ 001096 STATION ACQUISITION CCITTIA5 0 0 160 CHARACTER 0 20
+ 002001 TYPE OF STATION CODE TABLE 2001 0 0 2 CODE TABLE 2001 0 1
+ 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 2002 0 0 4 FLAG TABLE 2002 0 2
+ 002003 TYPE OF MEASURING EQUIPMENT USED CODE TABLE 2003 0 0 4 CODE TABLE 2003 0 2
+ 002004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUREMENT OR TYPE OF C CODE TABLE 2004 0 0 4 CODE TABLE 2004 0 2
+ 002005 PRECISION OF TEMPERATURE OBSERVATION K 2 0 7 K 2 3
+ 002011 RADIOSONDE TYPE CODE TABLE 2011 0 0 8 CODE TABLE 2011 0 3
+ 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 2012 0 0 4 CODE TABLE 2012 0 2
+ 002013 SOLAR AND INFRARED RADIATION CORRECTION CODE TABLE 2013 0 0 4 CODE TABLE 2013 0 2
+ 002014 TRACKING TECHNIQUE/STATUS OF SYSTEM USED CODE TABLE 2014 0 0 7 CODE TABLE 2014 0 3
+ 002015 RADIOSONDE COMPLETENESS CODE TABLE 2015 0 0 4 CODE TABLE 2015 0 2
+ 002016 RADIOSONDE CONFIGURATION FLAG TABLE 2016 0 0 5 FLAG TABLE 2016 0 2
+ 002019 SATELLITE INSTRUMENTS CODE TABLE 2019 0 0 11 CODE TABLE 2019 0 4
+ 002020 SATELLITE CLASSIFICATION CODE TABLE 2020 0 0 9 CODE TABLE 2020 0 3
+ 002021 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 2021 0 0 9 FLAG TABLE 2021 0 3
+ 002022 SATELLITE DATA-PROCESSING TECHNIQUE USED FLAG TABLE 2022 0 0 8 FLAG TABLE 2022 0 3
+ 002023 SATELLITE DERIVED WIND COMPUTATION METHOD CODE TABLE 2023 0 0 4 CODE TABLE 2023 0 2
+ 002024 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2024 0 0 4 CODE TABLE 2024 0 2
+ 002025 SATELLITE CHANNEL(S) USED IN COMPUTATION FLAG TABLE 2025 0 0 25 FLAG TABLE 2025 0 9
+ 002026 CROSS TRACK RESOLUTION M 2 0 12 M 2 4
+ 002027 ALONG TRACK RESOLUTION M 2 0 12 M 2 4
+ 002028 SEGMENT SIZE AT NADIR IN X DIRECTION M 0 0 18 M 0 6
+ 002029 SEGMENT SIZE AT NADIR IN Y DIRECTION M 0 0 18 M 0 6
+ 002030 METHOD OF CURRENT MEASUREMENT CODE TABLE 2030 0 0 3 CODE TABLE 2030 0 1
+ 002031 DURATION AND TIME OF CURRENT MEASUREMENT CODE TABLE 2031 0 0 5 CODE TABLE 2031 0 2
+ 002032 INDICATOR FOR DIGITIZATION CODE TABLE 2032 0 0 2 CODE TABLE 2032 0 1
+ 002033 METHOD OF SALINITY/DEPTH MEASUREMENT CODE TABLE 2033 0 0 3 CODE TABLE 2033 0 1
+ 002034 DROGUE TYPE CODE TABLE 2034 0 0 5 CODE TABLE 2034 0 2
+ 002035 CABLE LENGTH M 0 0 9 M 0 3
+ 002036 BUOY TYPE CODE TABLE 2036 0 0 2 CODE TABLE 2036 0 1
+ 002037 METHOD OF TIDAL OBSERVATION CODE TABLE 2037 0 0 3 CODE TABLE 2037 0 1
+ 002038 METHOD OF WATER TEMPERATURE AND/OR SALINITY MEASUREMENT CODE TABLE 2038 0 0 4 CODE TABLE 2038 0 2
+ 002039 METHOD OF WET-BULB TEMPERATURE MEASUREMENT CODE TABLE 2039 0 0 3 CODE TABLE 2039 0 1
+ 002040 METHOD OF REMOVING VELOCITY AND MOTION OF PLATFORM FROM CURRENT CODE TABLE 2040 0 0 4 CODE TABLE 2040 0 2
+ 002041 METHOD FOR ESTIMATING REPORTS RELATED TO SYNOPTIC FEATURES CODE TABLE 2041 0 0 6 CODE TABLE 2041 0 2
+ 002042 INDICATOR FOR SEA SURFACE CURRENT SPEED CODE TABLE 2042 0 0 2 CODE TABLE 2042 0 1
+ 002044 INDICATOR FOR METHOD OF CALCULATING SPECTRAL WAVE DATA CODE TABLE 2044 0 0 4 CODE TABLE 2044 0 2
+ 002045 INDICATOR FOR TYPE OF PLATFORM CODE TABLE 2045 0 0 4 CODE TABLE 2045 0 2
+ 002046 WAVE MEASUREMENT INSTRUMENTATION CODE TABLE 2046 0 0 4 CODE TABLE 2046 0 2
+ 002048 SATELLITE SENSOR INDICATOR CODE TABLE 2048 0 0 4 CODE TABLE 2048 0 2
+ 002049 GEOSTATIONARY SATELLITE DATA-PROCESSING TECHNIQUE USED FLAG TABLE 2049 0 0 8 FLAG TABLE 2049 0 3
+ 002050 GEOSTATIONARY SOUNDER SATELLITE CHANNELS USED FLAG TABLE 2050 0 0 20 FLAG TABLE 2050 0 7
+ 002051 INDICATOR TO SPECIFY OBSERVING METHOD FOR EXTREME TEMPERATURES CODE TABLE 2051 0 0 4 CODE TABLE 2051 0 2
+ 002052 GEOSTATIONARY IMAGER SATELLITE CHANNELS USED FLAG TABLE 2052 0 0 6 FLAG TABLE 2052 0 2
+ 002053 GOES-I/M BRIGHTNESS TEMPERATURE CHARACTERISTICS CODE TABLE 2053 0 0 4 CODE TABLE 2053 0 2
+ 002054 GOES-I/M SOUNDINGS PARAMETER CHARACTERISTICS CODE TABLE 2054 0 0 4 CODE TABLE 2054 0 2
+ 002055 GEOSTATIONARY SOUNDINGS STATISTICAL PARAMETERS CODE TABLE 2055 0 0 4 CODE TABLE 2055 0 2
+ 002056 GEOSTATIONARY SOUNDINGS ACCURACY STATISTICS CODE TABLE 2056 0 0 4 CODE TABLE 2056 0 2
+ 002057 ORIGIN OF FIRST GUESS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2057 0 0 4 CODE TABLE 2057 0 2
+ 002058 VALID TIMES OF FIRST GUESS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2058 0 0 4 CODE TABLE 2058 0 2
+ 002059 ORIGIN OF ANALYSIS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2059 0 0 4 CODE TABLE 2059 0 2
+ 002060 ORIGIN OF SURFACE INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2060 0 0 4 CODE TABLE 2060 0 2
+ 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 2061 0 0 3 CODE TABLE 2061 0 1
+ 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 2062 0 0 4 CODE TABLE 2062 0 2
+ 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16 DEGREE 2 5
+ 002064 AIRCRAFT ROLL ANGLE QUALITY CODE TABLE 2064 0 0 2 CODE TABLE 2064 0 1
+ 002065 ACARS GROUND RECEIVING STATION CCITTIA5 0 0 40 CHARACTER 0 5
+ 002066 RADIOSONDE GROUND RECEIVING SYSTEM CODE TABLE 2066 0 0 6 CODE TABLE 2066 0 2
+ 002067 RADIOSONDE OPERATING FREQUENCY Hz -5 0 15 Hz -5 5
+ 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 2070 0 0 4 CODE TABLE 2070 0 2
+ 002080 BALLOON MANUFACTURER CODE TABLE 2080 0 0 6 CODE TABLE 2080 0 2
+ 002081 TYPE OF BALLOON CODE TABLE 2081 0 0 5 CODE TABLE 2081 0 2
+ 002082 WEIGHT OF BALLOON KG 3 0 12 KG 3 4
+ 002083 TYPE OF BALLOON SHELTER CODE TABLE 2083 0 0 4 CODE TABLE 2083 0 2
+ 002084 TYPE OF GAS USED IN BALLOON CODE TABLE 2084 0 0 4 CODE TABLE 2084 0 2
+ 002085 AMOUNT OF GAS USED IN BALLOON KG 3 0 13 KG 3 4
+ 002086 BALLOON FLIGHT TRAIN LENGTH M 1 0 10 M 1 4
+ 002091 ENTRY SENSOR 4/20 MA A 4 0 10 A 4 3
+ 002095 TYPE OF PRESSURE SENSOR CODE TABLE 2095 0 0 5 CODE TABLE 2095 0 2
+ 002096 TYPE OF TEMPERATURE SENSOR CODE TABLE 2096 0 0 5 CODE TABLE 2096 0 2
+ 002097 TYPE OF HUMIDITY SENSOR CODE TABLE 2097 0 0 5 CODE TABLE 2097 0 2
+ 002100 RADAR CONSTANT dB 1 0 12 dB 1 4
+ 002101 TYPE OF ANTENNA CODE TABLE 2101 0 0 4 CODE TABLE 2101 0 2
+ 002102 ANTENNA HEIGHT ABOVE TOWER BASE M 0 0 8 M 0 3
+ 002103 RADOME FLAG TABLE 2103 0 0 2 FLAG TABLE 2103 0 1
+ 002104 ANTENNA POLARISATION CODE TABLE 2104 0 0 4 CODE TABLE 2104 0 2
+ 002105 MAXIMUM ANTENNA GAIN dB 0 0 6 dB 0 2
+ 002106 3-DB BEAMWIDTH DEGREE 1 0 6 DEGREE 1 2
+ 002107 SIDELOBE SUPPRESSION dB 0 0 6 dB 0 2
+ 002108 CROSSPOL DISCRIMINATION (ON AXIS) dB 0 0 6 dB 0 2
+ 002109 ANTENNA SPEED (AZIMUTH) DEGREE/S 2 0 12 DEGREE/S 2 4
+ 002110 ANTENNA SPEED (ELEVATION) DEGREE/S 2 0 12 DEGREE/S 2 4
+ 002111 RADAR INCIDENCE ANGLE DEGREE 1 0 10 DEGREE 1 4
+ 002112 RADAR LOOK ANGLE DEGREE 1 0 12 DEGREE 1 4
+ 002113 NUMBER OF AZIMUTH LOOKS NUMERIC 0 0 4 NUMERIC 0 2
+ 002114 ANTENNA EFFECTIVE SURFACE AREA M**2 0 0 15 M**2 0 5
+ 002115 TYPE OF SURFACE OBSERVING EQUIPMENT CODE TABLE 2115 0 0 5 CODE TABLE 2115 0 2
+ 002116 PERCENTAGE OF 320 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002117 PERCENTAGE OF 80 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002118 PERCENTAGE OF 20 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002119 RA-2 INSTRUMENT OPERATIONS CODE TABLE 2119 0 0 3 CODE TABLE 2119 0 1
+ 002120 OCEAN WAVE FREQUENCY Hz 3 0 10 Hz 3 4
+ 002121 MEAN FREQUENCY Hz -8 0 7 Hz -8 3
+ 002122 FREQUENCY AGILITY RANGE Hz -6 -128 8 Hz -6 3
+ 002123 PEAK POWER W -4 0 7 W -4 3
+ 002124 AVERAGE POWER W -1 0 7 W -1 3
+ 002125 PULSE REPETITION FREQUENCY Hz -1 0 8 Hz -1 3
+ 002126 PULSE WIDTH S 7 0 6 S 7 2
+ 002127 RECEIVER INTERMEDIATE FREQUENCY Hz -6 0 7 Hz -6 3
+ 002128 INTERMEDIATE FREQUENCY BANDWIDTH Hz -5 0 6 Hz -5 2
+ 002129 MINIMUM DETECTABLE SIGNAL dB 0 -150 5 dB 0 3
+ 002130 DYNAMIC RANGE dB 0 0 7 dB 0 3
+ 002131 SENSITIVITY TIME CONTROL (STC) FLAG TABLE 2131 0 0 2 FLAG TABLE 2131 0 1
+ 002132 AZIMUTH POINTING ACCURACY DEGREE 2 0 6 DEGREE 2 2
+ 002133 ELEVATION POINTING ACCURACY DEGREE 2 0 6 DEGREE 2 2
+ 002134 ANTENNA BEAM AZIMUTH DEGREE 2 0 16 DEGREE 2 5
+ 002135 ANTENNA ELEVATION DEGREE 2 -9000 15 DEGREE 2 5
+ 002136 RANGE PROCESSED BY RANGE ATTENUATION CORRECTION M -3 0 16 M -3 5
+ 002140 SATELLITE RADAR BEAM AZIMUTH ANGLE DEGREE 0 0 9 DEGREE 0 3
+ 002141 MEASUREMENT TYPE CCITTIA5 0 0 24 CHARACTER 0 3
+ 002142 OZONE INSTRUMENT SERIAL NUMBER/ IDENTIFICATION CCITTIA5 0 0 32 CHARACTER 0 4
+ 002143 OZONE INSTRUMENT TYPE CODE TABLE 2143 0 0 7 CODE TABLE 2143 0 3
+ 002144 LIGHT SOURCE TYPE FOR BREWER SPECTRO PHOTOMETER CODE TABLE 2144 0 0 4 CODE TABLE 2144 0 2
+ 002145 WAVE LENGTH SETTING FOR DOBSON INSTRUMENTS CODE TABLE 2145 0 0 4 CODE TABLE 2145 0 2
+ 002146 SOURCE CONDITIONS FOR DOBSON INSTRUMENTS CODE TABLE 2146 0 0 4 CODE TABLE 2146 0 2
+ 002148 DATA COLLECTION AND/OR LOCATION SYSTEM CODE TABLE 2148 0 0 5 CODE TABLE 2148 0 2
+ 002149 TYPE OF DATA BUOY CODE TABLE 2149 0 0 6 CODE TABLE 2149 0 2
+ 002150 TOVS/ATOVS/AVHRR INSTRUMENTATION CHANNEL NUMBER CODE TABLE 2150 0 0 6 CODE TABLE 2150 0 2
+ 002151 RADIOMETER IDENTIFIER CODE TABLE 2151 0 0 11 CODE TABLE 2151 0 4
+ 002152 SATELLITE INSTRUMENT USED IN DATA PROCESSING(6) FLAG TABLE 2152 0 0 31 FLAG TABLE 2152 0 10
+ 002153 SATELLITE CHANNEL CENTRE FREQUENCY Hz -8 0 26 Hz -8 8
+ 002154 SATELLITE CHANNEL BAND WIDTH Hz -8 0 26 Hz -8 8
+ 002156 PERCENTAGE OF VALID KU OCEAN RETRACKER MEASUREMENTS % 0 0 7 % 0 3
+ 002157 PERCENTAGE OF VALID S OCEAN RETRACKER MEASUREMENTS % 0 0 7 % 0 3
+ 002158 RA-2 INSTRUMENT FLAG TABLE 2158 0 0 9 FLAG TABLE 2158 0 3
+ 002159 MWR INSTRUMENT FLAG TABLE 2159 0 0 8 FLAG TABLE 2159 0 3
+ 002160 WAVE LENGTH OF THE RADAR CODE TABLE 2160 0 0 4 CODE TABLE 2160 0 2
+ 002163 HEIGHT ASSIGNMENT METHOD CODE TABLE 2163 0 0 4 CODE TABLE 2163 0 2
+ 002164 TRACER CORRELATION METHOD CODE TABLE 2164 0 0 3 CODE TABLE 2164 0 1
+ 002166 RADIANCE TYPE CODE TABLE 2166 0 0 4 CODE TABLE 2166 0 2
+ 002167 RADIANCE COMPUTATIONAL METHOD CODE TABLE 2167 0 0 4 CODE TABLE 2167 0 2
+ 002168 HYDROSTATIC PRESSURE OF LOWER END OF CABLE (THERMISTOR STRING) PA -3 0 16 KPA 0 5
+ 002169 ANEMOMETER TYPE CODE TABLE 2169 0 0 4 CODE TABLE 2169 0 2
+ 002172 PRODUCT TYPE FOR RETRIEVED ATMOSPHERIC GASES CODE TABLE 2172 0 0 8 CODE TABLE 2172 0 3
+ 002173 SQUARE OF THE OFF NADIR ANGLE (7) DEGREE2 4 0 10 DEGREE2 4 4
+ 002174 MEAN ACROSS TRACK PIXEL NUMBER NUMERIC 0 0 9 NUMERIC 0 3
+ 002175 METHOD OF PRECIPITATION MEASUREMENT CODE TABLE 2175 0 0 4 CODE TABLE 2175 0 2
+ 002176 METHOD OF STATE OF GROUND MEASUREMENT CODE TABLE 2176 0 0 4 CODE TABLE 2176 0 2
+ 002177 METHOD OF SNOW DEPTH MEASUREMENT CODE TABLE 2177 0 0 4 CODE TABLE 2177 0 2
+ 002178 METHOD OF LIQUID CONTENT MEASUREMENT OF PRECIPITATION CODE TABLE 2178 0 0 4 CODE TABLE 2178 0 2
+ 002179 TYPE OF SKY CONDITION ALGORITHM CODE TABLE 2179 0 0 4 CODE TABLE 2179 0 2
+ 002180 MAIN PRESENT WEATHER DETECTING SYSTEM CODE TABLE 2180 0 0 4 CODE TABLE 2180 0 2
+ 002181 SUPPLEMENTARY PRESENT WEATHER SENSOR FLAG TABLE 2181 0 0 21 FLAG TABLE 2181 0 7
+ 002182 VISIBILITY MEASUREMENT SYSTEM CODE TABLE 2182 0 0 4 CODE TABLE 2182 0 2
+ 002183 CLOUD DETECTION SYSTEM CODE TABLE 2183 0 0 4 CODE TABLE 2183 0 2
+ 002184 TYPE OF LIGHTNING DETECTION SENSOR CODE TABLE 2184 0 0 4 CODE TABLE 2184 0 2
+ 002185 METHOD OF EVAPORATION MEASUREMENT CODE TABLE 2185 0 0 4 CODE TABLE 2185 0 2
+ 002186 CAPABILITY TO DETECT PRECIPITATION PHENOMENA FLAG TABLE 2186 0 0 30 FLAG TABLE 2186 0 10
+ 002187 CAPABILITY TO DETECT OTHER WEATHER PHENOMENA FLAG TABLE 2187 0 0 18 FLAG TABLE 2187 0 6
+ 002188 CAPABILITY TO DETECT OBSCURATION FLAG TABLE 2188 0 0 21 FLAG TABLE 2188 0 7
+ 002189 CAPABILITY TO DISCRIMINATE LIGHTNING STRIKES FLAG TABLE 2189 0 0 12 FLAG TABLE 2189 0 4
+ 002190 LAGRANGIAN DRIFTER SUBMERGENCE (% TIME SUBMERGED) % 0 0 7 % 0 3
+ 004001 YEAR YEAR 0 0 12 YEAR 0 4
+ 004002 MONTH MONTH 0 0 4 MONTH 0 2
+ 004003 DAY DAY 0 0 6 DAY 0 2
+ 004004 HOUR HOUR 0 0 5 HOUR 0 2
+ 004005 MINUTE MINUTE 0 0 6 MINUTE 0 2
+ 004006 SECOND SECOND 0 0 6 SECOND 0 2
+ 004007 SECONDS WITHIN A MINUTE (MICROSECOND ACCURACY) SECOND 6 0 26 S 6 8
+ 004011 TIME INCREMENT YEAR 0 -1024 11 YEAR 0 4
+ 004012 TIME INCREMENT MONTH 0 -1024 11 MONTH 0 4
+ 004013 TIME INCREMENT DAY 0 -1024 11 DAY 0 4
+ 004014 TIME INCREMENT HOUR 0 -1024 11 HOUR 0 4
+ 004015 TIME INCREMENT MINUTE 0 -2048 12 MINUTE 0 4
+ 004016 TIME INCREMENT SECOND 0 -4096 13 SECOND 0 4
+ 004017 REFERENCE TIME PERIOD FOR ACCUMULATED OR EXTREME DATA MINUTE 0 -1440 12 MINUTE 0 4
+ 004021 TIME PERIOD OR DISPLACEMENT YEAR 0 -1024 11 YEAR 0 4
+ 004022 TIME PERIOD OR DISPLACEMENT MONTH 0 -1024 11 MONTH 0 4
+ 004023 TIME PERIOD OR DISPLACEMENT DAY 0 -1024 11 DAY 0 4
+ 004024 TIME PERIOD OR DISPLACEMENT HOUR 0 -2048 12 HOUR 0 4
+ 004025 TIME PERIOD OR DISPLACEMENT MINUTE 0 -2048 12 MINUTE 0 4
+ 004026 TIME PERIOD OR DISPLACEMENT SECOND 0 -4096 13 SECOND 0 4
+ 004031 DURATION OF TIME RELATING TO FOLLOWING VALUE HOUR 0 0 8 HOUR 0 3
+ 004032 DURATION OF TIME RELATING TO FOLLOWING VALUE MINUTE 0 0 6 MINUTE 0 2
+ 004041 TIME DIFFERENCE, UTC -LMT (SEE NOTE 6) MINUTE 0 -1440 12 MINUTE 0 4
+ 004043 DAY OF THE YEAR DAY 0 0 9 DAY 0 3
+ 004051 PRINCIPAL TIME OF DAILY READING OF MAXIMUM TEMPERATURE HOUR 0 0 5 HOUR 0 2
+ 004052 PRINCIPAL TIME OF DAILY READING OF MINIMUM TEMPERATURE HOUR 0 0 5 HOUR 0 2
+ 004053 NUMBER OF DAYS WITH PRECIPITATION EQUAL TO OR MORE THAN 1 MM NUMERIC 0 0 6 NUMERIC 0 2
+ 004059 TIMES OF OBSERVATION USED TO COMPUTE THE REPORTED MEAN VALUES FLAG TABLE 4059 0 0 6 FLAG TABLE 4059 0 2
+ 004065 SHORT TIME INCREMENT MINUTE 0 -128 8 MINUTE 0 2
+ 004073 SHORT TIME PERIOD OR DISPLACEMENT DAY 0 -128 8 DAY 0 2
+ 004074 SHORT TIME PERIOD OR DISPLACEMENT HOUR 0 -128 8 HOUR 0 2
+ 004075 SHORT TIME PERIOD OR DISPLACEMENT MINUTE 0 -128 8 MINUTE 0 2
+ 004080 AVERAGING PERIOD FOR FOLLOWING VALUE CODE TABLE 4080 0 0 4 CODE TABLE 4080 0 2
+ 004086 LONG TIME PERIOD OR DISPLACEMENT SECOND 0 -8192 15 SECOND 0 5
+ 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005011 LATITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005012 LATITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005015 LATITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005016 LATITUDE DISPLACEMENT (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 005023 SUN TO SATELLITE AZIMUTH DIFFERENCE DEGREE 1 -1800 12 DEGREE 1 4
+ 005030 DIRECTION (SPECTRAL) DEGREE 0 0 12 DEGREE 0 4
+ 005031 ROW NUMBER NUMERIC 0 0 12 NUMERIC 0 4
+ 005033 PIXEL SIZE ON HORIZONTAL - 1 M -1 0 16 M -1 5
+ 005034 ALONG TRACK ROW NUMBER NUMERIC 0 0 11 NUMERIC 0 4
+ 005036 SHIP TRANSECT NUMBER ACCORDING TO SOOP NUMERIC 0 0 7 NUMERIC 0 2
+ 005040 ORBIT NUMBER NUMERIC 0 0 24 NUMERIC 0 8
+ 005041 SCAN LINE NUMBER NUMERIC 0 0 8 NUMERIC 0 3
+ 005042 CHANNEL NUMBER NUMERIC 0 0 6 NUMERIC 0 2^M
+ 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8 NUMERIC 0 3
+ 005044 SATELLITE CYCLE NUMBER NUMERIC 0 0 11 NUMERIC 0 4
+ 005052 CHANNEL NUMBER INCREMENT NUMERIC 0 0 5 NUMERIC 0 2
+ 005053 FIELD OF VIEW NUMBER INCREMENT NUMERIC 0 0 5 NUMERIC 0 2
+ 005060 Y ANGULAR POSITION FROM CENTRE OF GRAVITY DEGREE 6 -8000000 24 DEGREE 6 8
+ 005061 Z ANGULAR POSITION FROM CENTRE OF GRAVITY DEGREE 6 -8000000 24 DEGREE 6 8
+ 005193 ALONG TRACK ROW NUMBER AT 50 KM NUMERIC 0 0 10 NUMERIC 0 4
+ 005194 ALONG TRACK ROW NUMBER AT 25 KM NUMERIC 0 0 11 NUMERIC 0 4
+ 005195 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 7 NUMERIC 0 3
+ 005217 LOCATION OF PLATFORM, X M 2 -1073741824 31 M 2 10
+ 005232 DIRECTION (SPECTRAL) DEGREE 2 0 16 DEGREE 2 5
+ 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006011 LONGITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006012 LONGITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006015 LONGITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006016 LONGITUDE DISPLACEMENT (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006021 DISTANCE M -1 0 13 M -1 4
+ 006030 WAVE NUMBER (SPECTRAL) RAD/M 5 0 13 RAD/M 5 4
+ 006031 COLUMN NUMBER NUMERIC 0 0 12 NUMERIC 0 4
+ 006033 PIXEL SIZE ON HORIZONTAL - 2 M -1 0 16 M -1 5
+ 006034 CROSS-TRACK CELL NUMBER NUMERIC 0 0 7 NUMERIC 0 3
+ 006040 RADIUS OF CONFIDENCE M 0 0 13 M 0 4
+ 006193 CROSS TRACK CELL NUMBER AT 50 KM NUMERIC 0 0 6 NUMERIC 0 2
+ 006194 CROSS TRACK CELL NUMBER AT 25 KM NUMERIC 0 0 7 NUMERIC 0 3
+ 006217 LOCATION OF PLATFORM, Y M 2 -1073741824 31 M 2 10
+ 006232 WAVENUMBER (SPECTRAL) RADS/M 5 0 13 ADS/M 5 4
+ 007001 HEIGHT OF STATION (SEE NOTE 1) M 0 -400 15 M 0 5
+ 007002 HEIGHT OR ALTITUDE M -1 -40 16 M -1 5
+ 007003 GEOPOTENTIAL M**2/S**2 -1 -400 17 M**2/S**2 -1 6
+ 007004 PRESSURE PA -1 0 14 PA -1 5
+ 007005 HEIGHT INCREMENT M 0 -400 12 M 0 4
+ 007006 HEIGHT ABOVE STATION M 0 0 15 M 0 5
+ 007007 HEIGHT M 0 -1000 17 M 0 6
+ 007008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7
+ 007009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17 GPM 0 5
+ 007010 FLIGHT LEVEL M 0 -1024 16 FT -1 5
+ 007021 ELEVATION (SEE NOTE 2) DEGREE 2 -9000 15 DEGREE 2 5
+ 007022 SOLAR ELEVATION DEGREE 2 -9000 15 DEGREE 2 5
+ 007024 SATELLITE ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 007025 SOLAR ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 007026 SATELLITE ZENITH ANGLE DEGREE 4 -900000 21 DEGREE 4 7
+ 007030 HEIGHT OF STATION GROUND ABOVE MEAN SEA LEVEL (SEE NOTE 3) M 1 - 4000 17 M 1 5
+ 007031 HEIGHT OF BAROMETER ABOVE MEAN SEA LEVEL (SEE NOTE 4) M 1 - 4000 17 M 1 5
+ 007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM) M 2 0 16 M 2 5
+ 007033 HEIGHT OF SENSOR ABOVE WATER SURFACE (SEE NOTE 6) M 1 0 12 M 1 4
+ 007040 IMPACT PARAMETER (SEE NOTE 8) M 1 62000000 22 M 1 8
+ 007061 DEPTH BELOW LAND SURFACE M 2 0 14 M 2 5
+ 007062 DEPTH BELOW SEA/WATER SURFACE M 1 0 17 M 1 6
+ 007063 DEPTH BELOW SEA/WATER SURFACE M 2 0 20 M 2 7
+ 007064 REPRESENTATIVE HEIGHT OF SENSOR ABOVE STATION (SEE NOTE 7) M 0 0 4 M 0 2
+ 007065 WATER PRESSURE PA -3 0 17 PA 0 6
+ 007070 DROGUE DEPTH M 0 0 10 M 0 4
+ 007217 LOCATION OF PLATFORM, Z M 2 -1073741824 31 M 2 10
+ 008001 VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8001 0 0 7 FLAG TABLE 8001 0 3
+ 008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS) CODE TABLE 8002 0 0 6 CODE TABLE 8002 0 2
+ 008003 VERTICAL SIGNIFICANCE (SATELLITE OBSERVATIONS) CODE TABLE 8003 0 0 6 CODE TABLE 8003 0 2
+ 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 8004 0 0 3 CODE TABLE 8004 0 1
+ 008005 METEOROLOGICAL ATTRIBUTE SIGNIFICANCE CODE TABLE 8005 0 0 4 CODE TABLE 8005 0 2
+ 008006 OZONE VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8006 0 0 9 FLAG TABLE 8006 0 3
+ 008007 DIMENSIONAL SIGNIFICANCE CODE TABLE 8007 0 0 4 CODE TABLE 8007 0 2
+ 008008 RADIATION VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8008 0 0 9 FLAG TABLE 8008 0 3
+ 008009 DETAILED PHASE OF FLIGHT CODE TABLE 8009 0 0 4 CODE TABLE 8009 0 2
+ 008010 SURFACE QUALIFIER (TEMPERATURE DATA) CODE TABLE 8010 0 0 5 CODE TABLE 8010 0 2
+ 008011 METEOROLOGICAL FEATURE CODE TABLE 8011 0 0 6 CODE TABLE 8011 0 2
+ 008012 LAND/SEA QUALIFIER CODE TABLE 8012 0 0 2 CODE TABLE 8012 0 1
+ 008013 DAY/NIGHT QUALIFIER CODE TABLE 8013 0 0 2 CODE TABLE 8013 0 1
+ 008014 QUALIFIER FOR RUNWAY VISUAL RANGE CODE TABLE 8014 0 0 4 CODE TABLE 8014 0 2
+ 008016 CHANGE QUALIFIER OF A TREND-TYPE FORECAST OR AN AERODROME FORECA CODE TABLE 8016 0 0 3 CODE TABLE 8016 0 1
+ 008017 QUALIFIER OF THE TIME WHEN THE FORECAST CHANGE IS EXPECTED CODE TABLE 8017 0 0 2 CODE TABLE 8017 0 1
+ 008018 SEAWINDS LAND/ICE SURFACE TYPE FLAG TABLE 8018 0 0 17 FLAG TABLE 8018 0 6
+ 008020 TOTAL NUMBER OF MISSING ENTITIES (WITH RESPECT TO ACCUMULATION O NUMERIC 0 0 16 NUMERIC 0 5
+ 008021 TIME SIGNIFICANCE CODE TABLE 8021 0 0 5 CODE TABLE 8021 0 2
+ 008022 TOTAL NUMBER (WITH RESPECT TO ACCUMULATION OR AVERAGE) NUMERIC 0 0 16 NUMERIC 0 5
+ 008023 FIRST ORDER STATISTICS CODE TABLE 8023 0 0 6 CODE TABLE 8023 0 2
+ 008024 DIFFERENCE STATISTICS CODE TABLE 8024 0 0 6 CODE TABLE 8024 0 2
+ 008025 TIME DIFFERENCE QUALIFIER CODE TABLE 8025 0 0 4 CODE TABLE 8025 0 2
+ 008029 REMOTLY SENSED SURFACE TYPE CODE TABLE 8029 0 0 8 CODE TABLE 8029 0 3
+ 008030 MANUAL ON CODES (VOLUME I.1, SECTION C) CODE TABLE FROM WHICH DA NUMERIC 0 0 13 NUMERIC 0 4
+ 008031 DATA CATEGORY CREX TABLE A NUMERIC 0 0 8 NUMERIC 0 3
+ 008033 METHOD OF DERIVATION OF PERCENTAGE CONFIDENCE CODE TABLE 8033 0 0 7 CODE TABLE 8033 0 3
+ 008035 TYPE OF MONITORING EXERCISE CODE TABLE 8035 0 0 3 CODE TABLE 8035 0 1
+ 008036 TYPE OF CENTRE OR STATION PERFORMING MONITORING CODE TABLE 8036 0 0 3 CODE TABLE 8036 0 1
+ 008040 FLIGHT LEVEL SIGNIFICANCE CODE TABLE 8040 0 0 6 CODE TABLE 8040 0 2
+ 008041 DATA SIGNIFICANCE CODE TABLE 8041 0 0 5 CODE TABLE 8041 0 2
+ 008042 EXTENDED VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8042 0 0 18 FLAG TABLE 8042 0 6
+ 008049 NUMBER OF OBSERVATIONS NUMERIC 0 0 8 NUMERIC 0 3
+ 008050 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 8050 0 0 4 CODE TABLE 8050 0 2
+ 008051 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 8051 0 0 3 CODE TABLE 8051 0 1
+ 008052 CONDITION FOR WHICH NUMBER OF DAYS OF OCCURRENCE FOLLOWS CODE TABLE 8052 0 0 5 CODE TABLE 8052 0 2
+ 008053 DAY OF OCCURRENCE QUALIFIER CODE TABLE 8053 0 0 2 CODE TABLE 8053 0 1
+ 008060 SAMPLE SCANNING MODE SIGNIFICANCE CODE TABLE 8060 0 0 4 CODE TABLE 8060 0 2
+ 008065 SUN-GLINT INDICATOR CODE TABLE 8065 0 0 2 CODE TABLE 8065 0 1
+ 008066 SEMI-TRANSPARENCY INDICATOR CODE TABLE 8066 0 0 2 CODE TABLE 8066 0 1
+ 008070 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8070 0 0 4 CODE TABLE 8070 0 2
+ 008072 PIXEL(S) TYPE CODE TABLE 8072 0 0 3 CODE TABLE 8072 0 1
+ 008074 ALTIMETER ECHO TYPE CODE TABLE 8074 0 0 2 CODE TABLE 8074 0 1
+ 008075 ASCENDING/DESCENDING ORBIT QUALIFIER CODE TABLE 8075 0 0 2 CODE TABLE 8075 0 1
+ 008076 TYPE OF BAND CODE TABLE 8076 0 0 6 CODE TABLE 8076 0 2
+ 008081 TYPE OF EQUIPMENT CODE TABLE 8081 0 0 6 CODE TABLE 8081 0 2
+ 008082 (CBS) ARTIFICIAL CORRECTION OF SENSOR HEIGHT TO ANOTHER VALUE CODE TABLE 8082 0 0 3 CODE TABLE 8082 0 1
+ 008083 NOMINAL VALUE INDICATOR FLAG TABLE 8083 0 0 15 FLAG TABLE 8083 0 5
+ 008085 BEAM IDENTIFIER CODE TABLE 8085 0 0 3 CODE TABLE 8085 0 1
+ 008193 TIME QUALIFIER CODE TABLE 8193 0 0 6 CODE TABLE 8193 0 2
+ 008194 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8194 0 0 4 CODE TABLE 8194 0 2
+ 008195 DATA TYPE CODE TABLE 8195 0 0 7 CODE TABLE 8195 0 3
+ 008200 NUMBER OF OBSERVATIONS NUMERIC 0 0 8 NUMERIC 0 3
+ 008222 GENERATOR SIGNIFICANCE CODE TABLE 8222 0 0 4 CODE TABLE 8222 0 2
+ 008223 LAND/ICE SURFACE FLAG FLAG TABLE 8223 0 0 7 FLAG TABLE 8223 0 3
+ 008224 LAND/SEA FRACTION NUMERIC 3 0 10 NUMERIC 3 4
+ 010001 HEIGHT OF LAND SURFACE M 0 -400 15 M 0 5
+ 010002 HEIGHT M -1 -40 16 M -1 5
+ 010003 GEOPOTENTIAL M**2/S**2 -1 -400 17 M**2/S**2 -1 6
+ 010004 PRESSURE PA -1 0 14 PA -1 5
+ 010007 HEIGHT M 0 -1000 17 M 0 6
+ 010008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7
+ 010009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17 GPM 0 5
+ 010010 MINIMUM PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010011 MAXIMUM PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010031 IN DIRECTION OF THE NORTH POLE, DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31 M 2 10
+ 010032 SATELLITE DISTANCE TO EARTH'S CENTRE M 1 0 27 M 2 9
+ 010033 ALTITUDE (PLATFORM TO ELLIPSOID) M 1 0 27 M 2 9
+ 010034 EARTH RADIUS M 1 0 27 M 2 9
+ 010035 EARTH'S LOCAL RADIUS OF CURVATURE M 1 62000000 22 M 1 8
+ 010036 GEOID UNDULATION (SEE NOTE 4) M 2 -15000 15 M 2 6
+ 010040 NUMBER OF RETRIEVED LAYERS NUMERIC 0 0 10 NUMERIC 0 4
+ 010050 STANDARD DEVIATION ALTITUDE M 2 0 16 M 2 5
+ 010051 PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010052 ALTIMETER SETTING (QNH) PA -1 0 14 PA -1 5
+ 010060 PRESSURE CHANGE PA -1 -1024 11 PA -1 4
+ 010061 3-HOUR PRESSURE CHANGE PA -1 -500 10 PA -1 4
+ 010062 24-HOUR PRESSURE CHANGE PA -1 -1000 11 PA -1 4
+ 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 10063 0 0 4 CODE TABLE 10063 0 2
+ 010070 INDICATED AIRCRAFT ALTITUDE M 0 -400 16 M 0 5
+ 010080 VIEWING ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 010081 ALTITUDE OF COG ABOVE REFERENCE ELLIPSOID M 3 0 31 M 3 10
+ 010082 INSTANTANEOUS ALTITUDE RATE MS-1 3 -65536 17 MS-1 3 6
+ 010083 SQUARED OFF NADIR ANGLE OF THE SATELLITE FROM PLATFORM DATA DEGREE2 2 0 16 DEGREE2 2 5
+ 010084 SQUARED OFF NADIR ANGLE OF THE SATELLITE FROM WAVEFORM DATA DEGREE2 2 0 16 DEGREE2 2 5
+ 010085 MEAN SEA SURFACE HEIGHT M 3 -131072 18 M 3 6
+ 010086 GEOID'S HEIGHT M 3 -131072 18 M 3 6
+ 010087 OCEAN DEPTH/LAND ELEVATION M 1 -131072 18 M 3 6
+ 010088 TOTAL GEOCENTRIC OCEAN TIDE HEIGHT SOLUTION 1 M 3 -32768 16 M 3 5
+ 010089 TOTAL GEOCENTRIC OCEAN TIDE HEIGHT SOLUTION 2 M 3 -32768 16 M 3 5
+ 010090 LONG PERIOD TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010091 TIDAL LOADING HEIGHT M 3 -32768 16 M 3 5
+ 010092 SOLID EARTH TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010093 GEOCENTRIC POLE TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010095 HEIGHT OF ATMOSPHERE USED M 0 0 16 M 0 5
+ 011001 WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011002 WIND SPEED M/S 1 0 12 M/S 1 4
+ 011003 U-COMPONENT M/S 1 -4096 13 M/S 1 4
+ 011004 V-COMPONENT M/S 1 -4096 13 M/S 1 4
+ 011005 W-COMPONENT PA/S 1 -512 10 PA/S 1 4
+ 011006 W-COMPONENT M/S 2 -4096 13 M/S 2 4
+ 011010 WIND DIRECTION ASSOCIATED WITH WIND SPEED WHICH FOLLOWS DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011011 WIND DIRECTION AT 10 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011012 WIND SPEED AT 10 M M/S 1 0 12 M/S 1 4
+ 011013 WIND DIRECTION AT 5 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011014 WIND SPEED AT 5 M M/S 1 0 12 M/S 1 4
+ 011016 EXTREME COUNTERCLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011017 EXTREME CLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011019 STEADINESS OF WIND (6) % 0 0 7 % 0 3
+ 011021 RELATIVE VORTICITY 1/S 9 -65536 17 1/S 9 6
+ 011022 DIVERGENCE 1/S 9 -65536 17 1/S 9 6
+ 011023 VELOCITY POTENTIAL M**2/S -2 -65536 17 M**2/S -2 6
+ 011030 EXTENDED DEGREE OF TURBULENCE CODE TABLE 11030 0 0 6 CODE TABLE 0 2
+ 011031 DEGREE OF TURBULENCE CODE TABLE 11031 0 0 4 CODE TABLE 11031 0 2
+ 011032 HEIGHT OF BASE OF TURBULENCE M -1 -40 16 M -1 5
+ 011033 HEIGHT OF TOP OF TURBULENCE M -1 -40 16 M -1 5
+ 011034 VERTICAL GUST VELOCITY M/S 1 -1024 11 M/S 1 4
+ 011035 VERTICAL GUST ACCELERATION M/S**2 2 -8192 14 M/S**2 2 5
+ 011036 MAXIMUM DERIVED EQUIVALENT VERTICAL GUST SPEED M/S 1 0 10 M/S 1 4
+ 011037 TURBULENCE INDEX CODE TABLE 11037 0 0 6 CODE TABLE 11037 0 2
+ 011038 TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11038 0 0 5 CODE TABLE 11038 0 2
+ 011039 EXTENDED TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11039 0 0 6 CODE TABLE 11039 0 2
+ 011040 MAXIMUM WIND SPEED (MEAN WIND) M/S 1 0 12 M/S 1 4
+ 011041 MAXIMUM WIND GUST SPEED M/S 1 0 12 M/S 1 4
+ 011042 MAXIMUM WIND SPEED (10-MIN MEAN WIND) M/S 1 0 12 M/S 1 4
+ 011043 MAXIMUM WIND GUST DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011044 MEAN WIND DIRECTION FOR SURFACE - 1500 M (5000 FEET) DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011045 MEAN WIND SPEED FOR SURFACE - 1500 M (5000 FEET) M/S 1 0 12 M/S 1 4
+ 011046 MAXIMUM INSTANTANEOUS WIND SPEED M/S 1 0 12 M/S 1 4
+ 011047 MAXIMUM INSTANTANEOUS WIND SPEED OVER 10 MINUTES M/S 1 0 12 M/S 1 4
+ 011049 STANDARD DEVIATION OF WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011050 STANDARD DEVIATION OF HORIZONTAL WIND SPEED M/S 1 0 12 M/S 1 4
+ 011051 STANDARD DEVIATION OF VERTICAL WIND SPEED M/S 1 0 8 M/S 1 3
+ 011052 FORMAL UNCERTAINTY IN WIND SPEED M/S 2 0 13 M/S 2 5
+ 011053 FORMAL UNCERTAINTY IN WIND DIRECTION DEGREE TRUE 2 0 15 DEGREE TRUE 2 5
+ 011054 MEAN WIND DIRECTION FOR 1500 M - 3000 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011055 MEAN WIND SPEED FOR 1500 M - 3000 M M/S 1 0 12 M/S 1 4
+ 011061 ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW M/S 1 0 12 M/S 1 4
+ 011062 ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE M/S 1 0 12 M/S 1 4
+ 011070 DESIGNATOR OF THE RUNWAY AFFECTED BY WIND SHEAR (INCLUDING ALL) CCITTIA5 0 0 32 CHARACTER 0 4
+ 011071 TURBULENT VERTICAL MOMENTUM FLUX M**2/S**2 3 -128 14 M**2/S**2 3 5
+ 011072 TURBULENT VERTICAL BUOYANCY FLUX KM/S 3 -128 11 KM/S 3 4
+ 011073 TURBULENT KINETIC ENERGY M**2/S**2 2 -1024 13 M**2/S**2 2 4
+ 011074 DISSIPATION ENERGY M**2/S**2 2 -1024 10 M**2/S**2 2 4
+ 011075 MEAN TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3
+ 011076 PEAK TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3
+ 011077 REPORTING INTERVAL OR AVERAGING TIME FOR EDDY DISSIPATION RATE S 0 0 12 S 0 4
+ 011081 MODEL WIND DIRECTION AT 10M DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 011082 MODEL WIND SPEED AT 10M M/S 2 0 14 M/S 2 4
+ 011095 U COMPONENT OF THE MODEL WIND VECTOR M/S 1 -4096 13 M/S 1 4
+ 011096 V COMPONENT OF THE MODEL WIND VECTOR M/S 1 -4096 13 M/S 1 4
+ 011230 MAXIMUM MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4^M
+ 011231 MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4^M
+ 011232 MINIMUM MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4^M
+ 011233 HIGHEST GUST DURING THE 10 MINUTE PERIOD PRECEDING OBSERVATION M/S 1 -4096 13 M/S 1 4^M
+ 012001 TEMPERATURE/DRY-BULB TEMPERATURE K 1 0 12 C 1 3
+ 012002 WET-BULB TEMPERATURE K 1 0 12 C 1 3
+ 012003 DEW-POINT TEMPERATURE K 1 0 12 C 1 3
+ 012004 DRY-BULB TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012005 WET-BULB TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012006 DEW-POINT TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012007 VIRTUAL TEMPERATURE K 1 0 12 C 1 3
+ 012011 MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12 C 1 3
+ 012012 MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12 C 1 3
+ 012013 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS K 1 0 12 C 1 3
+ 012014 MAXIMUM TEMPERATURE AT 2 M, PAST 12 HOURS K 1 0 12 C 1 3
+ 012015 MINIMUM TEMPERATURE AT 2 M, PAST 12 HOURS K 1 0 12 C 1 3
+ 012016 MAXIMUM TEMPERATURE AT 2 M, PAST 24 HOURS K 1 0 12 C 1 3
+ 012017 MINIMUM TEMPERATURE AT 2 M, PAST 24 HOURS K 1 0 12 C 1 3
+ 012021 MAXIMUM TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012022 MINIMUM TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012030 SOIL TEMPERATURE K 1 0 12 C 1 3
+ 012049 TEMPERATURE CHANGE OVER SPECIFIED PERIOD K 0 -30 6 C 0 2
+ 012051 STANDARD DEVIATION TEMPERATURE K 1 0 10 C 1 3
+ 012052 HIGHEST DAILY MEAN TEMPERATURE K 1 0 12 C 1 3
+ 012053 LOWEST DAILY MEAN TEMPERATURE K 1 0 12 C 1 3
+ 012061 SKIN TEMPERATURE K 1 0 12 C 1 3
+ 012062 EQUIVALENT BLACK BODY TEMPERATURE K 1 0 12 C 1 3
+ 012063 BRIGHTNESS TEMPERATURE K 1 0 12 C 1 3
+ 012064 INSTRUMENT TEMPERATURE K 1 0 12 K 1 4
+ 012065 STANDARD DEVIATION BRIGHTNESS TEMPERATURE K 1 0 12 K 1 4
+ 012070 WARM LOAD TEMPERATURE K 2 0 16 K 2 5
+ 012071 COLDEST CLUSTER TEMPERATURE K 1 0 12 K 1 4
+ 012072 RADIANCE WM**(-2)SR**(-1) 6 0 31 WM**(-2)SR**(-1) 6 9
+ 012073 TEMPERATURE K 2 0 16 K 2 5
+ 012075 SPECTRAL RADIANCE WM**(-3)SR**(-1) -3 0 16 WM**(-3)SR**(-1) -3 5
+ 012076 RADIANCE WM**(-2)SR**(-1) 3 0 16 WM**(-2)SR**(-1) 3 5
+ 012101 TEMPERATURE/DRY-BULB TEMPERATURE K 2 0 16 C 2 4
+ 012102 WET-BULB TEMPERATURE K 2 0 16 C 2 4
+ 012103 DEW-POINT TEMPERATURE K 2 0 16 C 2 4
+ 012104 DRY-BULB TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012105 WEB-BULB TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012106 DEW-POINT TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012107 VIRTUAL TEMPERATURE K 2 0 16 C 2 4
+ 012111 MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 2 0 16 C 2 4
+ 012112 MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 2 0 16 C 2 4
+ 012113 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS K 2 0 16 C 2 4
+ 012114 MAXIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 2 0 16 C 2 4
+ 012115 MINIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 2 0 16 C 2 4
+ 012116 MAXIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 2 0 16 C 2 4
+ 012117 MINIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 2 0 16 C 2 4
+ 012118 MAXIMUM TEMPERATURE AT HEIGHT SPECIFIED, PAST 24 HOURS K 2 0 16 C 2 4
+ 012119 MINIMUM TEMPERATURE AT HEIGHT SPECIFIED, PAST 24 HOURS K 2 0 16 C 2 4
+ 012121 GROUND MINIMUM TEMPERATURE K 2 0 16 C 2 4
+ 012122 GROUND MINIMUM TEMPERATURE OF THE PRECEDING NIGHT K 2 0 16 C 2 4
+ 012130 SOIL TEMPERATURE K 2 0 16 C 2 4
+ 012151 STANDARD DEVIATION OF DAILY MEAN TEMPERATURE K 2 0 12 C 2 4
+ 012152 HIGHEST DAILY MEAN TEMPERATURE K 2 0 16 C 2 4
+ 012153 LOWEST DAILY MEAN TEMPERATURE K 2 0 16 C 2 4
+ 012161 SKIN TEMPERATURE K 2 0 16 C 2 4
+ 012162 EQUIVALENT BLACK BODY TEMPERATURE K 2 0 16 C 2 4
+ 012163 BRIGHTNESS TEMPERATURE K 2 0 16 C 2 4
+ 012164 INSTRUMENT TEMPERATURE K 2 0 16 K 2 5
+ 012171 COLDEST CLUSTER TEMPERATURE K 2 0 16 K 2 5
+ 012180 AVERAGED 12 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012181 AVERAGED 11 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012182 AVERAGED 3.7 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012183 AVERAGED 12 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012184 AVERAGED 11 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012185 AVERAGED 3.7 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012186 MEAN NADIR SEA SURFACE TEMPERATURE K 2 0 16 K 2 5
+ 012187 MEAN DUAL VIEW SEA SURFACE TEMPERATURE K 2 0 16 K 2 5
+ 012188 INTERPOLATED 23.8 GHZ BRIGHTNESS T FROM MWR K 2 0 16 K 2 5
+ 012189 INTERPOLATED 36.5 GHZ BRIGHTNESS T FROM MWR K 2 0 16 K 2 5
+ 013001 SPECIFIC HUMIDITY KG/KG 5 0 14 KG/KG 5 5
+ 013002 MIXING RATIO KG/KG 5 0 14 KG/KG 5 5
+ 013003 RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013004 VAPOUR PRESSURE PA -1 0 10 PA -1 4
+ 013005 VAPOUR DENSITY KG/M**3 3 0 7 KG/M**3 3 3
+ 013006 MIXING HEIGHTS M -1 -40 16 M -1 5
+ 013007 MINIMUM RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013008 MAXIMUM RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013009 RELATIVE HUMIDITY % 1 -1000 12 % 1 4
+ 013011 TOTAL PRECIPITATION/TOTAL WATER EQUIVALENT KG/M**2 1 -1 14 KG/M**2 1 5
+ 013012 DEPTH OF FRESH SNOW M 2 -2 12 M 2 4
+ 013013 TOTAL SNOW DEPTH M 2 -2 16 M 2 5
+ 013014 RAINFALL/WATER EQUIVALENT OF SNOW (AVERAGED RATE) KG/(M**2)S 4 0 12 KG/(M**2)S 4 4
+ 013015 SNOWFALL (AVERAGED RATE) M/S 7 0 12 M/S 7 4
+ 013016 PRECIPITABLE WATER KG/M**2 0 0 7 KG/M**2 0 3
+ 013019 TOTAL PRECIPITATION PAST 1 HOUR KG/M**2 1 -1 14 KG/M**2 1 4
+ 013020 TOTAL PRECIPITATION PAST 3 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013021 TOTAL PRECIPITATION PAST 6 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013022 TOTAL PRECIPITATION PAST 12 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013023 TOTAL PRECIPITATION PAST 24 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013031 EVAPOTRANSPIRATION KG/M**2 0 0 7 KG/M**2 0 3
+ 013032 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 8 KG/M**2 1 3
+ 013033 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 10 KG/M**2 1 4
+ 013038 SUPERADIABATIC INDICATOR CODE TABLE 13038 0 0 2 CODE TABLE 13038 0 1
+ 013039 TERRAIN TYPE (ICE/SNOW) CODE TABLE 13039 0 0 3 CODE TABLE 13039 0 1
+ 013040 SURFACE FLAG CODE TABLE 13040 0 0 4 CODE TABLE 13040 0 2
+ 013041 PASQUILL-GIFFORD STABILITY CATEGORY CODE TABLE 13041 0 0 4 CODE TABLE 13041 0 2
+ 013042 PARCEL LIFTED INDEX (TO 500 HPA) K 0 -20 6 K 0 2
+ 013043 BEST LIFTED INDEX (TO 500 HPA) K 0 -20 6 K 0 2
+ 013044 K INDEX K 0 -30 8 K 0 3
+ 013045 KO INDEX K 0 -30 8 K 0 3
+ 013046 MAXIMUM BUOYANCY K 0 -30 8 K 0 3
+ 013047 MODIFIED SHOWALTER STABILITY INDEX K 0 -60 6 C 0 2
+ 013051 FREQUENCY GROUP, PRECIPITATION CODE TABLE 13051 0 0 4 CODE TABLE 13051 0 2
+ 013052 HIGHEST DAILY AMOUNT OF PRECIPITATION KG/M**2 1 -1 14 KG/M**2 1 5
+ 013055 INTENSITY OF PRECIPITATION KG/(M**2)S 4 0 8 MM H-1 1 3
+ 013056 CHARACTER AND INTENSITY OF PRECIPITATION CODE TABLE 13056 0 0 4 CODE TABLE 13056 0 2
+ 013057 TIME OF BEGINNING OR END OF PRECIPITATION CODE TABLE 13057 0 0 4 CODE TABLE 13057 0 2
+ 013058 SIZE OF PRECIPITATING ELEMENT M 4 0 7 MM 1 3
+ 013059 NUMBER OF FLASHES (THUNDERSTORM) NUMERIC 0 0 7 NUMERIC 0 3
+ 013060 TOTAL ACCUMULATED PRECIPITATION KG/M**2 1 -1 17 KG/M**2 1 5
+ 013071 UPSTREAM WATER LEVEL M 2 0 14 M 2 5
+ 013072 DOWNSTREAM WATER LEVEL M 2 0 14 M 2 4
+ 013073 MAXIMUM WATER LEVEL M 2 0 14 M 2 4
+ 013080 WATER PH pH 1 0 10 pH 1 3
+ 013081 WATER CONDUCTIVITY S M-1 3 0 14 S M-1 3 4
+ 013082 WATER TEMPERATURE K 1 0 12 K 1 4
+ 013083 DISSOLVED OXYGEN KG/M**3 6 0 15 KG/M**3 6 5
+ 013084 TURBIDITY LUMEN 0 0 14 LUMEN 0 4
+ 013085 OXYDATION REDUCTION POTENTIAL (ORP) V 3 0 14 V 3 4
+ 013090 RADIOMETER WATER VAPOUR CONTENT KG/M**2 1 0 10 KG/M**2 1 4
+ 013091 RADIOMETER LIQUID CONTENT KG/M**2 2 0 8 KG/M**2 2 3
+ 013093 CLOUD OPTICAL THICKNESS NUMERIC 0 0 8 NUMERIC 0 3
+ 013095 TOTAL COLUMN WATER VAPOUR KG/M**2 4 0 19 KG/M**2 4 6
+ 013096 MWR WATER VAPOUR CONTENT KG/M**2 2 0 14 KG/M**2 2 4
+ 013097 MWR LIQUID WATER CONTENT KG/M**2 2 0 14 KG/M**2 2 4
+ 013098 INTEGRATED WATER VAPOUR DENSITY KG/M**2 8 0 30 KG/M**2 8 10
+ 014001 LONG-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014002 LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014003 SHORT-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014004 SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014011 NET LONG-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014012 NET LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014013 NET SHORT-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014014 NET SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014015 NET RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 -16384 15 J/M**2 -4 5
+ 014016 NET RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 -16384 15 J/M**2 -4 5
+ 014017 INSTANTANEOUS LONG-WAVE RADIATION (SEE NOTE 6) W/M**2 -3 -2048 12 W/M**2 -3 4
+ 014018 INSTANTANEOUS SHORT-WAVE RADIATION (SEE NOTE 6) W/M**2 -3 -2048 12 W/M**2 -3 4
+ 014019 SURFACE ALBEDO % 0 0 7 % 0 3
+ 014020 GLOBAL SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014021 GLOBAL SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014022 DIFFUSE SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014023 DIFFUSE SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014024 DIRECT SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014025 DIRECT SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014026 ALBEDO AT THE TOP OF CLOUDS % 0 0 7 % 0 3
+ 014027 ALBEDO % 0 0 7 % 0 3
+ 014028 GLOBAL SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S J/M**2 -2 0 16 J/M**2 -2 5
+ 014029 DIFFUSE SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD J/M**2 -2 0 16 J/M**2 -2 5
+ 014030 DIRECT SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S J/M**2 -2 0 16 J/M**2 -2 5
+ 014031 TOTAL SUNSHINE MINUTE 0 0 11 MINUTE 0 4
+ 014032 TOTAL SUNSHINE HOUR 0 0 10 HOUR 0 4
+ 014033 TOTAL SUNSHINE % 0 0 9 % 0 3
+ 014034 SUNSHINE OVER PERIOD SPECIFIED MINUTE 0 0 11 MINUTE 0 4
+ 014042 BI-DIRECTIONAL REFLECTANCE % 0 0 7 % 0 3
+ 014045 CHANNEL RADIANCE (W/M**2)*(1/SR)*CM 0 0 11 WM-2SR-1CM-1 0 4
+ 014046 SCALED IASI RADIANCE (W/M**2)*(1/SR)*(1/M) 0 -5000 16 (W/M**2)*(1/SR)*(1/M) 0 5
+ 014047 SCALED MEAN AVHRR RADIANCE (W/M**2)*(1/SR)*(1/M) 0 0 31 (W/M**2)*(1/SR)*(1/M) 0 10
+ 014048 SCALED STANDARD DEVIATION RADIANCE (W/M**2)*(1/SR)*(1/M) 0 0 31 (W/M**2)*(1/SR)*(1/M) 0 10
+ 014050 EMISSIVITY (SEE NOTE 5) % 1 0 10 % 1 4
+ 014051 DIRECT SOLAR RADIATION INTEGRATED OVER LAST HOUR J/M**2 -3 0 14 JM-2 -3 4
+ 014055 SOLAR ACTIVITY INDEX NUMERIC 0 -32768 16 NUMERIC 0 5
+ 014061 (VAL) INSTANTANEOUS LONG-WAVE RADIATION W/M**2 0 -512 10 W/M**2 0 4
+ 014062 (VAL) INSTANTANEOUS SHORT-WAVE RADIATION W/M**2 0 -2048 12 W/M**2 0 4
+ 015001 TOTAL OZONE DU 0 0 10 DU 0 4
+ 015002 AIR MASS (SLANT PATH AT 22 KM) NUMERIC 2 0 10 NUMERIC 2 3
+ 015003 MEASURED OZONE PARTIAL PRESSURE (SOUNDING) PA 4 0 9 NBAR 0 3
+ 015004 OZONE SOUNDING CORRECTION FACTOR NUMERIC 3 0 11 NUMERIC 3 4
+ 015005 OZONE P DU 0 0 10 DU 0 3
+ 015011 LOG 10 OF INTEGRATED ELECTRON DENSITY LOG (1/M2) 3 14000 13 LOG (M-2) 3 4
+ 015015 MAXIMUM IMAGE SPECTRAL COMPONENT BEFORE NORMALIZATION NUMERIC 0 0 31 NUMERIC 0 10
+ 015020 INTEGRATED 03 DENSITY KG/M**2 8 0 21 KG/M**2 8 7
+ 015025 TYPE OF POLLUTANT CODE TABLE 15025 0 0 4 CODE TABLE 15025 0 2
+ 015026 CONCENTRATION OF POLLUTANT MOLMOL-1 9 0 9 MOLMOL-1 9 3
+ 015027 CONCENTRATION OF POLLUTANT KG/M3 9 0 10 KG/M3 9 4
+ 015031 ATMOSPHERIC PATH DELAY IN SATELLITE SIGNAL M 4 10000 15 M 4 5
+ 015032 ESTIMATED ERROR IN ATMOSPHERIC PATH DELAY M 4 0 10 M 4 4
+ 015033 DIFFERENCE IN PATH DELAYS FOR LIMB VIEWS AT EXTREMES OF SCAN M 5 -10000 15 M 5 5
+ 015034 ESTIMATED ERROR IN PATH DELAY DIFFERENCE M 5 0 14 M 5 5
+ 015035 COMPONENT OF ZENITH PATH DELAY DUE TO WATER VAPOUR M 4 0 14 M 4 5
+ 015036 ATMOSPHERIC REFRACTIVITY (SEE NOTE 5) N-UNITS 3 0 19 N-UNITS 3 6
+ 015037 BENDING ANGLE RADIANS 8 -100000 23 RADIANS 8 7
+ 019001 TYPE OF SYNOPTIC FEATURE CODE TABLE 19001 0 0 6 CODE TABLE 19001 0 2
+ 019002 EFFECTIVE RADIUS OF FEATURE M -2 0 12 M -2 4
+ 019003 WIND SPEED THRESHOLD M/S 0 0 8 M/S 0 3
+ 019004 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD M -2 0 12 M -2 4
+ 019005 DIRECTION OF MOTION OF FEATURE DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 019006 SPEED OF MOTION OF FEATURE M/S 2 0 14 M/S 2 5
+ 019007 EFFECTIVE RADIUS OF FEATURE M -3 0 12 M -3 4
+ 019008 VERTICAL EXTENT OF CIRCULATION CODE TABLE 19008 0 0 3 CODE TABLE 19008 0 1
+ 019009 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD (LA M -3 0 12 M -3 4
+ 019010 METHOD FOR TRACKING THE CENTRE OF SYNOPTIC FEATURE CODE TABLE 19010 0 0 4 CODE TABLE 19010 0 2
+ 019100 TIME INTERVAL TO CALCULATE THE MOVEMENT OF THE TROPICAL CYCLONE CODE TABLE 19100 0 0 4 CODE TABLE 19100 0 2
+ 019101 ACCURACY OF THE POSITION OF THE CENTRE OF THE TROPICAL CYCLONE CODE TABLE 19101 0 0 4 CODE TABLE 19101 0 2
+ 019102 SHAPE AND DEFINITION OF THE EYE OF THE TROPICAL CYCLONE CODE TABLE 19102 0 0 3 CODE TABLE 19102 0 1
+ 019103 DIAMETER OF MAJOR AXIS OF THE EYE OF THE TROPICAL CYCLONE CODE TABLE 19103 0 0 4 CODE TABLE 19103 0 2
+ 019104 CHANGE IN CHARACTER OF THE EYE DURING THE 30 MINUTES CODE TABLE 19104 0 0 4 CODE TABLE 19104 0 2
+ 019105 DISTANCE BETWEEN THE END OF SPIRAL BAND AND THE CENTRE CODE TABLE 19105 0 0 4 CODE TABLE 19105 0 2
+ 019106 IDENTIFICATION NUMBER OF TROPICAL CYCLONE NUMERIC 0 0 7 NUMERIC 0 3
+ 019107 TIME INTERVAL OF THE TROPICAL CYCLONE ANALYSIS CODE TABLE 19107 0 0 4 CODE TABLE 19107 0 2
+ 019108 ACCURACY OF GEOGRAPHICAL POSITION OF THE TROPICAL CYCLONE CODE TABLE 19108 0 0 3 CODE TABLE 19108 0 1
+ 019109 MEAN DIAMETER OF THE OVERCAST CLOUD OF THE TROPICAL CYCLONE CODE TABLE 19109 0 0 4 CODE TABLE 19109 0 2
+ 019110 APPARENT 24-HOUR CHANGE IN INTENSITY OF TROPICAL CYCLONE CODE TABLE 19110 0 0 4 CODE TABLE 19110 0 2
+ 019111 CURRENT INTENSITY (CI) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019112 DATA TROPICAL (DT) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019113 CLOUD PATTERN TYPE OF THE DT- NUMBER CODE TABLE 19113 0 0 4 CODE TABLE 19113 0 2
+ 019114 MODEL EXPECTED TROPICAL (MET) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019115 TREND OF PAST 24-HOUR CHANGE (+: DEVELOPED, -: WEAKENED) NUMERIC 1 -30 6 NUMERIC 1 2
+ 019116 PATTERN TROPICAL (PT) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019117 CLOUD PICTURE TYPE OF THE PT- NUMBER CODE TABLE 19117 0 0 3 CODE TABLE 19117 0 1
+ 019118 FINAL TROPICAL (T) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019119 TYPE OF THE FINAL T-NUMBER CODE TABLE 19119 0 0 3 CODE TABLE 19119 0 1
+ 019150 TYPHOON INTERNATIONAL COMMON NUMBER (TYPHOON COMMITTEE) CCITTIA5 0 0 32 CHARACTER 0 4
+ 020001 HORIZONTAL VISIBILITY M -1 0 13 M -1 4
+ 020002 VERTICAL VISIBILITY M -1 0 7 M -1 3
+ 020003 PRESENT WEATHER (SEE NOTE 1) CODE TABLE 20003 0 0 9 CODE TABLE 20003 0 3
+ 020004 PAST WEATHER (1) (SEE NOTE 2) CODE TABLE 20004 0 0 5 CODE TABLE 20004 0 2
+ 020005 PAST WEATHER (2) (SEE NOTE 2) CODE TABLE 20005 0 0 5 CODE TABLE 20005 0 2
+ 020008 CLOUD DISTRIBUTION FOR AVIATION CODE TABLE 20008 0 0 5 CODE TABLE 20008 0 2
+ 020009 GENERAL WEATHER INDICATOR (TAF/METAR) CODE TABLE 20009 0 0 4 CODE TABLE 20009 0 2
+ 020010 CLOUD COVER (TOTAL) % 0 0 7 % 0 3
+ 020011 CLOUD AMOUNT CODE TABLE 20011 0 0 4 CODE TABLE 20011 0 2
+ 020012 CLOUD TYPE CODE TABLE 20012 0 0 6 CODE TABLE 20012 0 2
+ 020013 HEIGHT OF BASE OF CLOUD M -1 -40 11 M -1 4
+ 020014 HEIGHT OF TOP OF CLOUD M -1 -40 11 M -1 4
+ 020015 PRESSURE AT BASE OF CLOUD PA -1 0 14 PA -1 5
+ 020016 PRESSURE AT TOP OF CLOUD PA -1 0 14 PA -1 5
+ 020017 CLOUD TOP DESCRIPTION CODE TABLE 20017 0 0 4 CODE TABLE 20017 0 2
+ 020018 TENDENCY OF RUNWAY VISUAL RANGE CODE TABLE 20018 0 0 2 CODE TABLE 20018 0 1
+ 020019 SIGNIFICANT PRESENT OR FORECAST WEATHER CCITTIA5 0 0 72 CHARACTER 0 9
+ 020020 SIGNIFICANT RECENT WEATHER PHENOMENA CCITTIA5 0 0 32 CHARACTER 0 4
+ 020021 TYPE OF PRECIPITATION FLAG TABLE 20021 0 0 30 FLAG TABLE 20021 0 10
+ 020022 CHARACTER OF PRECIPITATION CODE TABLE 20022 0 0 4 CODE TABLE 20022 0 2
+ 020023 OTHER WEATHER PHENOMENA FLAG TABLE 20023 0 0 18 FLAG TABLE 20023 0 6
+ 020024 INTENSITY OF PHENOMENA CODE TABLE 20024 0 0 3 CODE TABLE 20024 0 1
+ 020025 OBSCURATION FLAG TABLE 20025 0 0 21 FLAG TABLE 20025 0 7
+ 020026 CHARACTER OF OBSCURATION CODE TABLE 20026 0 0 4 CODE TABLE 20026 0 2
+ 020027 PHENOMENA OCCURRENCE FLAG TABLE 20027 0 0 9 FLAG TABLE 20027 0 3
+ 020029 RAIN FLAG CODE TABLE 20029 0 0 2 CODE TABLE 20029 0 1
+ 020031 ICE DEPOSIT (THICKNESS) M 2 0 7 M 2 3
+ 020032 RATE OF ICE ACCRETION CODE TABLE 20032 0 0 3 CODE TABLE 20032 0 1
+ 020033 CAUSE OF ICE ACCRETION FLAG TABLE 20033 0 0 4 FLAG TABLE 20033 0 2
+ 020034 SEA ICE CONCENTRATION CODE TABLE 20034 0 0 5 CODE TABLE 20034 0 2
+ 020035 AMOUNT AND TYPE OF ICE CODE TABLE 20035 0 0 4 CODE TABLE 20035 0 2
+ 020036 ICE SITUATION CODE TABLE 20036 0 0 5 CODE TABLE 20036 0 2
+ 020037 ICE DEVELOPMENT CODE TABLE 20037 0 0 5 CODE TABLE 20037 0 2
+ 020038 BEARING OF ICE EDGE (SEE NOTE 3) DEGREE TRUE 0 0 12 DEGREE TRUE 0 3
+ 020039 ICE DISTANCE M -1 0 13 M -1 4
+ 020040 EVOLUTION OF DRIFT OF SNOW CODE TABLE 20040 0 0 4 CODE TABLE 20040 0 2
+ 020041 AIRFRAME ICING CODE TABLE 20041 0 0 4 CODE TABLE 20041 0 2
+ 020042 AIRFRAME ICING PRESENT CODE TABLE 20042 0 0 2 CODE TABLE 20042 0 1
+ 020043 PEAK LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2
+ 020044 AVERAGE LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2
+ 020045 SUPERCOOLED LARGE DROPLET (SLD) CONDITIONS CODE TABLE 20045 0 0 2 CODE TABLE 20045 0 2
+ 020050 CLOUD INDEX CODE TABLE 20050 0 0 8 CODE TABLE 20050 0 3
+ 020051 AMOUNT OF LOW CLOUDS % 0 0 7 % 0 3
+ 020052 AMOUNT OF MIDDLE CLOUDS % 0 0 7 % 0 3
+ 020053 AMOUNT OF HIGH CLOUDS % 0 0 7 % 0 3
+ 020054 TRUE DIRECTION FROM WHICH CLOUDS ARE MOVING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 020055 STATE OF SKY IN TROPICS CODE TABLE 20055 0 0 4 CODE TABLE 20055 0 2
+ 020056 CLOUD PHASE CODE TABLE 20056 0 0 3 CODE TABLE 20056 0 1
+ 020061 RUNWAY VISUAL RANGE (RVR) M 0 0 12 M 0 4
+ 020062 STATE OF THE GROUND (WITH OR WITHOUT SNOW) CODE TABLE 20062 0 0 5 CODE TABLE 20062 0 2
+ 020063 SPECIAL PHENOMENA CODE TABLE 20063 0 0 10 CODE TABLE 20063 0 4
+ 020065 SNOW COVER (SEE NOTE 4) % 0 0 7 % 0 3
+ 020066 MAXIMUM DIAMETER OF HAILSTONES M 3 0 8 M 3 3
+ 020067 DIAMETER OF DEPOSIT M 3 0 9 M 3 3
+ 020070 MINIMUM NUMBER OF ATMOSPHERICS NUMERIC 0 0 7 NUMERIC 0 3
+ 020071 ACCURACY OF FIX AND RATE OF ATMOSPHERICS CODE TABLE 20071 0 0 4 CODE TABLE 20071 0 2
+ 020081 CLOUD AMOUNT IN SEGMENT % 0 0 7 % 0 3
+ 020082 AMOUNT SEGMENT CLOUD FREE % 0 0 7 % 0 3
+ 020083 AMOUNT OF SEGMENT COVERED BY SCENE % 0 0 7 % 0 3
+ 020090 SPECIAL CLOUDS CODE TABLE 20090 0 0 4 CODE TABLE 20090 0 2
+ 020095 ICE PROBABILITY NUMERIC 3 0 10 NUMERIC 3 4
+ 020096 ICE AGE ("A" PARAMETER) dB 2 -4096 13 dB 2 4
+ 020101 LOCUST (ACRIDIAN) NAME CODE TABLE 20101 0 0 4 CODE TABLE 20101 0 2
+ 020102 LOCUST (MATURITY) COLOR CODE TABLE 20102 0 0 4 CODE TABLE 20102 0 2
+ 020103 STAGE OF DEVELOPMENT OF LOCUSTS CODE TABLE 20103 0 0 4 CODE TABLE 20103 0 2
+ 020104 ORGANIZATION STATE OF SWARM OR BAND OF LOCUSTS CODE TABLE 20104 0 0 4 CODE TABLE 20104 0 2
+ 020105 SIZE OF SWARM OR BAND OF LOCUSTS AND DURATION OF PASSAGE OF SWARMCODE TABLE 20105 0 0 4 CODE TABLE 20105 0 2
+ 020106 LOCUST POPULATION DENSITY CODE TABLE 20106 0 0 4 CODE TABLE 20106 0 2
+ 020107 DIRECTION OF MOVEMENTS OF LOCUST SWARM CODE TABLE 20107 0 0 4 CODE TABLE 20107 0 2
+ 020108 EXTENT OF VEGETATION CODE TABLE 20108 0 0 4 CODE TABLE 20108 0 2
+ 020193 CLOUD AMOUNT IN SEGMENT % 0 0 7 % 0 3
+ 020194 AMOUNT OF SEGMENT CLOUD FREE % 0 0 7 % 0 3
+ 020215 PRESSURE AT THE BASE OF CLOUD PA -1 0 14 PA -1 5
+ 021001 HORIZONTAL REFLECTIVITY dB 0 -64 7 dB 0 3
+ 021002 VERTICAL REFLECTIVITY dB 0 -64 7 dB 0 3
+ 021003 DIFFERENTIAL REFLECTIVITY dB 1 -5 7 dB 1 3
+ 021005 LINEAR DEPOLARISATION RATIO dB 0 -65 6 dB 0 2
+ 021006 CIRCULAR DEPOLARISATION RATIO dB 0 -65 6 dB 0 2
+ 021011 DOPPLER MEAN VELOCITY IN X-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021012 DOPPLER MEAN VELOCITY IN Y-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021013 DOPPLER MEAN VELOCITY IN Z-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021014 DOPPLER MEAN VELOCITY (RADIAL) M/S 1 -4096 13 M/S 1 4
+ 021017 DOPPLER VELOCITY SPECTRAL WIDTH M/S 1 0 8 M/S 1 3
+ 021021 ECHO TOPS M -3 0 4 M -3 2
+ 021030 SIGNAL TO NOISE RATIO dB 0 -32 8 dB 0 3
+ 021031 VERTICALLY INTEGRATED LIQUID-WATER CONTENT KG/M**2 0 0 7 KG/M**2 0 3
+ 021036 RADAR RAINFALL INTENSITY M/S 7 0 12 M/S 7 4
+ 021041 BRIGHT-BAND HEIGHT M -2 0 8 M -2 3
+ 021051 SIGNAL POWER ABOVE 1 MW dB 0 -256 8 dB 0 3
+ 021062 BACKSCATTER dB 2 -5000 13 dB 2 4
+ 021063 RADIOMETRIC RESOLUTION (NOISE VALUE) % 1 0 10 % 1 4
+ 021064 CLUTTER NOISE ESTIMATE NUMERIC 0 0 8 NUMERIC 0 3
+ 021065 MISSING PACKET COUNTER NUMERIC 0 -127 8 NUMERIC 0 3
+ 021066 WAVE SCATTEROMETER PRODUCT CONFIDENCE DATA FLAG TABLE 21066 0 0 12 FLAG TABLE 21066 0 4
+ 021067 WIND PRODUCT CONFIDENCE DATA FLAG TABLE 21067 0 0 13 FLAG TABLE 21067 0 5
+ 021068 RADAR ALTIMETER PRODUCT CONFIDENCE DATA FLAG TABLE 21068 0 0 8 FLAG TABLE 21068 0 3
+ 021069 SST PRODUCT CONFIDENCE DATA FLAG TABLE 21069 0 0 10 FLAG TABLE 21069 0 4
+ 021070 SST PRODUCT CONFIDENCE DATA (SADIST-2) FLAG TABLE 21070 0 0 23 FLAG TABLE 21070 0 6
+ 021071 PEAKINESS NUMERIC 0 0 16 NUMERIC 0 5
+ 021072 SATELLITE ALTIMETER CALIBRATION STATUS FLAG TABLE 21072 0 0 4 FLAG TABLE 21072 0 2
+ 021073 SATELLLITE ALTIMETER INSTRUMENT MODE FLAG TABLE 21073 0 0 9 FLAG TABLE 21073 0 3
+ 021075 IMAGE SPECTRUM INTENSITY NUMERIC 0 0 8 NUMERIC 0 3
+ 021076 REPRESENTATION OF INTENSITIES CODE TABLE 21076 0 0 3 CODE TABLE 21076 0 1
+ 021077 ALTITUDE CORRECTION (IONOSPHERE) M 3 0 14 M 3 5
+ 021078 ALTITUDE CORRECTION (DRY TROPOSPHERE) M 3 0 9 M 3 3
+ 021079 ALTITUDE CORRECTION (WET TROPOSPHERE) M 3 2000 10 M 3 4
+ 021080 ALTITUDE CORRECTION (CALIBRATION CONSTANT) M 3 0 11 M 3 4
+ 021081 OPEN LOOP CORRECTION (HEIGHT-TIME LOOP) M 3 0 10 M 3 4
+ 021082 OPEN LOOP CORRECTION (AUTO GAIN CONTROL) dB 3 -3000 14 dB 3 5
+ 021083 WARM TARGET CALIBRATION NUMERIC 0 0 16 NUMERIC 0 5
+ 021084 COLD TARGET CALIBRATION NUMERIC 0 0 16 NUMERIC 0 5
+ 021085 ATSR SEA SURFACE TEMPERATURE ACROSS- TRACK BAND NUMBER NUMERIC 0 0 4 NUMERIC 0 2
+ 021086 NUMBER OF PIXELS IN NADIR ONLY, AVERAGE NUMERIC 0 0 9 NUMERIC 0 3
+ 021087 NUMBER OF PIXELS IN DUAL VIEW, AVERAGE NUMERIC 0 0 9 NUMERIC 0 3
+ 021088 WET BACKSCATTER dB 2 -5000 13 dB 2 4
+ 021091 RADAR SIGNAL DOPPLER SPECTRUM 0TH MOMENT dB 0 -100 8 dB 0 3
+ 021092 RASS SIGNAL DOPPLER SPECTRUM 0TH MOMENT, REFERRING TO RASS SIGNA dB 0 -100 8 dB 0 3
+ 021093 Ku BAND PEAKINESS NUMERIC 3 0 16 NUMERIC 0 5
+ 021094 S BAND PEAKINESS NUMERIC 3 0 16 NUMERIC 0 5
+ 021101 NUMBER OF VECTOR AMBIGUITIES NUMERIC 0 0 3 NUMERIC 0 1
+ 021102 INDEX OF SELECTED WIND VECTOR NUMERIC 0 0 3 NUMERIC 0 1
+ 021103 TOTAL NUMBER OF SIGMA-0 MEASUREMENTS NUMERIC 0 0 5 NUMERIC 0 2
+ 021104 LIKELIHOOD COMPUTED FOR SOLUTION NUMERIC 3 -30000 15 NUMERIC 3 5
+ 021105 NORMALIZED RADAR CROSS-SECTION dB 2 -10000 14 dB 2 5
+ 021106 KP VARIANCE COEFFICIENT (ALPHA) NUMERIC 3 0 14 NUMERIC 3 5
+ 021107 KP VARIANCE COEFFICIENT (BETA) NUMERIC 8 0 16 NUMERIC 8 5
+ 021109 SEAWINDS WIND VECTOR CELL QUALITY FLAG TABLE 21109 0 0 17 FLAG TABLE 21109 0 6
+ 021110 NUMBER OF INNER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021111 NUMBER OF OUTER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021112 NUMBER OF INNER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021113 NUMBER OF OUTER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021114 KP VARIANCE COEFFICENT (GAMMA) dB 3 -140000 18 dB 3 6
+ 021115 SEAWINDS SIGMA-0 QUALITY FLAG TABLE 21115 0 0 17 FLAG TABLE 21115 0 6
+ 021116 SEAWINDS SIGMA-0 MODE FLAG TABLE 21116 0 0 17 FLAG TABLE 21116 0 6
+ 021117 SIGMA-0 VARIANCE QUALITY CONTROL NUMERIC 2 0 16 NUMERIC 2 5
+ 021118 ATTENUATION CORRECTION ON SIGMA-0 dB 2 -10000 14 dB 2 5
+ 021119 WIND SCATTEROMETER GEOPHYSICAL MODEL FUNCTION CODE TABLE 21119 0 0 6 CODE TABLE 21119 0 2
+ 021120 PROBABILITY OF RAIN NUMERIC 3 0 10 NUMERIC 3 4
+ 021121 SEAWINDS NOF* RAIN INDEX NUMERIC 0 0 8 NUMERIC 0 3
+ 021122 ATTENUATION CORRECTION OF SIGMA-0 (FROM TB) dB 2 -10000 14 dB 2 5
+ 021123 SEAWINDS NORMALIZED RADAR CROSS SECTION dB 2 -30000 15 dB 2 5
+ 021128 NUMBER OF VALID POINTS PER SECOND USED TO DERIVE PREVIOUS PARAME NUMERIC 0 0 8 NUMERIC 0 3
+ 021130 SPECTRUM TOTAL ENERGY NUMERIC 6 0 28 NUMERIC 6 9
+ 021131 SPECTRUM MAX ENERGY NUMERIC 6 0 28 NUMERIC 6 9
+ 021132 DIRECTION OF SPECTRUM MAX ON HIGHER RESOLUTION GRID DEGREE 3 0 19 DEGREE 3 6
+ 021133 WAVE-LENGTH OF SPECTRUM MAX ON HIGHER RESOLUTION GRID M 3 0 29 M 3 9
+ 021134 RANGE RESOLUTION OF CRESS COVARIANCE SPECTRUM RAD/M 3 0 19 RAD/M 3 6
+ 021135 REAL PART OF CROSS SPECTRA POLAR GRID NUMBER OF BINS NUMERIC 3 -524288 20 NUMERIC 3 7
+ 021136 IMAGINARY PART OF CROSS SPECTRA POLAR GRID NUMBER OF BINS NUMERIC 3 -524288 20 NUMERIC 3 7
+ 021137 KU BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021138 STD KU BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021139 KU BAND NET INSTRUMENTAL CORRECTION FOR AGC dB 2 -2048 12 dB 2 4
+ 021140 S BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021141 STD S BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021142 S BAND NET INSTRUMENTAL CORRECTION FOR AGC dB 2 -1024 11 dB 2 4
+ 021143 KU BAND RAIN ATTENUATION dB 2 -1073741824 31 dB 2 10
+ 021144 ALTIMETER RAIN FLAG FLAG TABLE 21144 0 0 2 FLAG TABLE 21144 0 1
+ 021150 BEAM COLLOCATION CODE TABLE 21150 0 0 2 CODE TABLE 21150 0 1
+ 021151 ESTIMATED ERROR IN SIGMA0 AT 40DEG INCIDENCE ANGLE dB 2 0 9 dB 2 3
+ 021152 SLOPE AT 40DEG INCIDENCE ANGLE dB/DEG 2 -80 7 dB/DEG 2 3
+ 021153 ESTIMATED ERROR IN SLOPE AT 40DEG INCIDENCE ANGLE dB/DEG 2 -40 6 dB/DEG 2 3
+ 021154 SOIL MOISTURE SENSITIVITY dB 2 0 12 dB 2 4
+ 021155 WIND VECTOR CELL QUALITY FLAG TABLE 21155 0 0 24 FLAG TABLE 21155 0 8
+ 021156 BACKSCATTER DISTANCE NUMERIC 1 -4096 13 NUMERIC 1 4
+ 021157 LOSS PER UNIT LENGTH OF ATMOSPHERE USED dB/M 10 0 22 dB/M 10 7
+ 021158 ASCAT kp ESTIMATE QUALITY CODE TABLE 21158 0 0 2 CODE TABLE 21158 0 1
+ 021159 ASCAT SIGMA-0 USABILITY CODE TABLE 21159 0 0 2 CODE TABLE 21159 0 1
+ 021160 ASCAT USE OF SYNTHETIC DATA NUMERIC 3 0 10 NUMERIC 3 4
+ 021161 ASCAT SYNTHETIC DATA QUALITY NUMERIC 3 0 10 NUMERIC 3 4
+ 021162 ASCAT SATELLITE ORBIT AND ATTITUDE QUALITY NUMERIC 3 0 10 NUMERIC 3 4
+ 021163 ASCAT SOLAR ARRAY REFLECTION CONTAMINATION NUMERIC 3 0 10 NUMERIC 3 4
+ 021164 ASCAT TELEMETRY PRESENCE AND QUALITY NUMERIC 3 0 10 NUMERIC 3 4
+ 021165 ASCAT EXTRAPOLATED REFERENCE FUNCTION PRESENCE NUMERIC 3 0 10 NUMERIC 3 4
+ 021166 ASCAT LAND FRACTION NUMERIC 3 0 10 NUMERIC 3 4
+ 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022002 DIRECTION OF WIND WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022003 DIRECTION OF SWELL WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022004 DIRECTION OF CURRENT DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022005 DIRECTION OF SEA SURFACE CURRENT DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022011 PERIOD OF WAVES S 0 0 6 S 0 2
+ 022012 PERIOD OF WIND WAVES S 0 0 6 S 0 2
+ 022013 PERIOD OF SWELL WAVES S 0 0 6 S 0 2
+ 022021 HEIGHT OF WAVES M 1 0 10 M 1 4
+ 022022 HEIGHT OF WIND WAVES M 1 0 10 M 1 4
+ 022023 HEIGHT OF SWELL WAVES M 1 0 10 M 1 4
+ 022025 STANDARD DEVIATION WAVE HEIGHT M 2 0 10 M 2 4
+ 022026 STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT M 2 0 10 M 2 4
+ 022031 SPEED OF CURRENT M/S 2 0 13 M/S 2 4
+ 022032 SPEED OF SEA SURFACE CURRENT M/S 2 0 13 M/S 2 4
+ 022035 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 2 0 14 M 2 4
+ 022036 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 2 0 14 M 2 4
+ 022037 TIDAL ELEVATION WITH RESPECT TO NATIONAL LAND DATUM M 3 -10000 15 M 3 5
+ 022038 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 3 -10000 15 M 3 5
+ 022039 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 3 -5000 12 M 3 4
+ 022040 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 3 -5000 14 M 3 5
+ 022041 SEA-SURFACE TEMPERATURE (15-DAY RUNNING MEAN) K 1 0 12 K 1 4
+ 022042 SEA/WATER TEMPERATURE K 1 0 12 K 1 4
+ 022043 SEA/WATER TEMPERATURE K 2 0 15 K 2 5
+ 022044 SOUND VELOCITY M/S 1 0 14 M/S 1 5
+ 022045 SEA/WATER TEMPERATURE K 3 0 19 K 3 6
+ 022049 SEA SURFACE TEMPERATURE K 2 0 15 K 2 5
+ 022050 STANDARD DEVIATION SEA-SURFACE TEMPERATURE K 2 0 8 K 2 3
+ 022055 FLOAT CYCLE NUMBER NUMERIC 0 0 10 NUMERIC 0 3
+ 022056 DIRECTION OF PROFILE CODE TABLE 22056 0 0 2 CODE TABLE 22056 0 1
+ 022059 SEA SURFACE SALINITY PART PER THOUSAND 2 0 14 PART PER THOUSAND 2 5
+ 022060 LAGRANGIAN DRIFTER DROGUE STATUS CODE TABLE 22060 0 0 3 CODE TABLE 22060 0 1
+ 022061 STATE OF THE SEA CODE TABLE 22061 0 0 4 CODE TABLE 22061 0 2
+ 022062 SALINITY PART PER THOUSAND 2 0 14 PART PER THOUSAND 2 5
+ 022063 TOTAL WATER DEPTH M 0 0 14 M 0 5
+ 022064 SALINITY PART PER THOUSAND 3 0 17 PART PER THOUSAND 3 6
+ 022065 WATER PRESSURE PA -3 0 17 PA -3 6
+ 022066 WATER CONDUCTIVITY S M-1 6 0 26 S M-1 6 8
+ 022067 INSTRUMENT TYPE FOR WATER TEMPERATURE PROFILE MEASUREMENT CODE TABLE 22067 0 0 10 CODE TABLE 22067 0 4
+ 022068 WATER TEMPERATURE PROFILE RECORDER TYPES CODE TABLE 22068 0 0 7 CODE TABLE 22068 0 3
+ 022069 SPECTRAL WAVE DENSITY M2HZ-1 3 0 22 M2HZ-1 3 7
+ 022070 SIGNIFICANT WAVE HEIGHT M 2 0 13 M 2 4
+ 022071 SPECTRAL PEAK WAVE PERIOD S 1 0 9 S 1 3
+ 022072 SPECTRAL PEAK WAVE LENGTH M 0 0 13 M 0 4
+ 022073 MAXIMUM WAVE HEIGHT M 2 0 13 M 2 4
+ 022074 AVERAGE WAVE PERIOD S 1 0 9 S 1 3
+ 022075 AVERAGE WAVE LENGTH M 0 0 13 M 0 4
+ 022076 DIRECTION FROM WHICH DOMINANT WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022077 DIRECTIONAL SPREAD OF DOMINANT WAVE DEGREE 0 0 9 DEGREE 0 3
+ 022078 DURATION OF WAVE RECORD S 0 0 12 S 0 4
+ 022079 LENGTH OF WAVE RECORD M 0 0 16 M 0 5
+ 022080 WAVEBAND CENTRAL FREQUENCY Hz 3 0 10 Hz 3 4
+ 022081 WAVEBAND CENTRAL WAVE NUMBER 1/M 5 0 13 1/M 5 4
+ 022082 MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE DENSITY M**2S 2 0 20 M**2S 2 7
+ 022083 MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE NUMBER M**3 2 0 20 M**3 2 7
+ 022084 BAND CONTAINING MAXIMUM NON- DIRECTIONAL SPECTRAL WAVE DENSITY NUMERIC 0 0 7 NUMERIC 0 3
+ 022085 SPECTRAL WAVE DENSITY RATIO NUMERIC 0 0 7 NUMERIC 0 3
+ 022086 MEAN DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022087 PRINCIPAL DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022088 FIRST NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7 NUMERIC 2 3
+ 022089 SECOND NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7 NUMERIC 2 3
+ 022090 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S 2 0 20 M**2S 2 7
+ 022091 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**3 2 0 20 M**3 2 7
+ 022092 DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S/RAD 2 0 20 M**2S/RAD 2 7
+ 022093 DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**4 2 0 20 M**4 2 7
+ 022094 TOTAL NUMBER OF WAVE BANDS NUMERIC 0 0 7 NUMERIC 0 3
+ 022095 DIRECTIONAL SPREAD OF INDIVIDUAL WAVES DEGREE 0 0 8 DEGREE 0 3
+ 022096 SPECTRAL BAND WIDTH 1/S 3 0 4 1/S 3 2
+ 022097 MEAN WAVELENGTH > 731 M OF IMAGE SPECTRUM AT LOW WAVE NUMBERS M 0 0 14 M 0 5
+ 022098 WAVELENGTH SPREAD (WAVELENGTH > 731 M) AT LOW WAVE NUMBERS M 0 0 14 M 0 5
+ 022099 MEAN DIRECTION AT LOW WAVE NUMBERS (WAVELENGTH > 731 M) DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022100 DIRECTION SPREAD AT LOW WAVE NUMBERS(WAVELENGTH > 731 M) DEGREE 0 0 9 DEGREE 0 3
+ 022101 TOTAL ENERGY (WAVELENGTH > 731M) AT LOW WAVE NUMBERS NUMERIC 0 0 31 NUMERIC 0 10
+ 022120 TIDE STATION AUTOMATED WATER LEVEL CHECK CODE TABLE 22120 0 0 5 CODE TABLE 22120 0 2
+ 022121 TIDE STATION MANUAL WATER LEVEL CHECK CODE TABLE 22121 0 0 5 CODE TABLE 22121 0 2
+ 022122 TIDE STATION AUTOMATED METEOROLOGICAL DATA CHECK CODE TABLE 22122 0 0 5 CODE TABLE 22122 0 2
+ 022123 TIDE STATION MANUAL METEOROLOGICAL DATA CHECK CODE TABLE 22123 0 0 5 CODE TABLE 22123 0 2
+ 022141 SEA-SURFACE TEMPERATURE (15-DAY RUNNING MEAN) K 2 0 15 K 2 5
+ 022150 NUMBER OF 18 HZ VALID POINTS FOR KU BAND NUMERIC 0 0 10 NUMERIC 0 4
+ 022151 KU BAND OCEAN RANGE M 3 0 31 M 3 10
+ 022152 STD OF 18 HZ KU BAND OCEAN RANGE M 3 0 16 M 3 5
+ 022153 NUMBER OF 18 HZ VALID POINTS FOR S BAND NUMERIC 0 0 10 NUMERIC 0 4
+ 022154 S BAND OCEAN RANGE M 3 0 31 M 3 10
+ 022155 STD OF 18 HZ S BAND OCEAN RANGE M 3 0 16 M 3 5
+ 022156 KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022157 STD 18HZ KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022158 S BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022159 STD 18HZ S BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022160 NORMALIZED INVERSE WAVE AGE NUMERIC 6 0 21 NUMERIC 6 7
+ 022161 WAVE SPECTRA M**4 4 0 27 M**4 4 9
+ 023001 ACCIDENT EARLY NOTIFICATION ARTICLE APPLICABLE CODE TABLE 23001 0 0 3 CODE TABLE 23001 0 1
+ 023002 ACTIVITY OR FACILITY INVOLVED IN INCIDENT CODE TABLE 23002 0 0 5 CODE TABLE 23002 0 2
+ 023003 TYPE OF RELEASE CODE TABLE 23003 0 0 3 CODE TABLE 23003 0 1
+ 023004 COUNTERMEASURES TAKEN NEAR BORDER CODE TABLE 23004 0 0 3 CODE TABLE 23004 0 1
+ 023005 CAUSE OF INCIDENT CODE TABLE 23005 0 0 2 CODE TABLE 23005 0 1
+ 023006 INCIDENT SITUATION CODE TABLE 23006 0 0 3 CODE TABLE 23006 0 1
+ 023007 CHARACTERISTICS OF RELEASE CODE TABLE 23007 0 0 3 CODE TABLE 23007 0 1
+ 023008 STATE OF CURRENT RELEASE CODE TABLE 23008 0 0 2 CODE TABLE 23008 0 1
+ 023009 STATE OF EXPECTED RELEASE CODE TABLE 23009 0 0 2 CODE TABLE 23009 0 1
+ 023016 POSSIBILITY OF SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT CODE TABLE 23016 0 0 2 CODE TABLE 23016 0 1
+ 023017 FLOW DISCHARGE OF MAJOR RECIPIENT M**3/S 6 0 20 M**3/S 6 7
+ 023018 RELEASE BEHAVIOUR OVER TIME CODE TABLE 23018 0 0 3 CODE TABLE 23018 0 1
+ 023019 ACTUAL RELEASE HEIGHT M 0 -15000 17 M 0 6
+ 023021 EFFECTIVE RELEASE HEIGHT M 0 -15000 17 M 0 6
+ 023022 DISTANCE OF RELEASE POINT OR SITE OF INCIDENT M 0 0 24 M 0 8
+ 023023 MAIN TRANSPORT SPEED IN THE ATMOSPHERE M/S 1 0 12 M/S 1 4
+ 023024 MAIN TRANSPORT SPEED IN WATER M/S 2 0 13 M/S 2 4
+ 023025 MAIN TRANSPORT SPEED IN GROUND WATER M/S 2 0 13 M/S 2 4
+ 023027 MAIN TRANSPORT DIRECTION IN THE ATMOSPHERE DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023028 MAIN TRANSPORT DIRECTION IN WATER DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023029 MAIN TRANSPORT DIRECTION IN GROUND WATER DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023031 POSSIBILITY THAT PLUME WILL ENCOUNTER PRECIPITATION IN STATE IN CODE TABLE 23031 0 0 2 CODE TABLE 23031 0 1
+ 023032 PLUME WILL ENCOUNTER CHANGE IN WIND DIRECTION AND/OR SPEED FLAG CODE TABLE 23032 0 0 2 CODE TABLE 23032 0 1
+ 024001 ESTIMATE OF AMOUNT OF RADIOACTIVITY RELEASED UP TO SPECIFIED TIM Bq -11 0 28 Bq -11 9
+ 024002 ESTIMATED MAXIMUM POTENTIAL RELEASE Bq -11 0 28 Bq -11 9
+ 024003 COMPOSITION OF RELEASE CODE TABLE 24003 0 0 5 CODE TABLE 24003 0 2
+ 024004 ELEMENT NAME CCITTIA5 0 0 16 CHARACTER 0 2
+ 024005 ISOTOPE MASS NUMERIC 0 0 9 NUMERIC 0 3
+ 024011 DOSE mSv 2 0 32 mSv 2 10
+ 024012 TRAJECTORY DOSE (DEFINED LOCATION AND EXPECTED TIME OF ARRIVAL) mSv 2 0 32 mSv 2 10
+ 024013 GAMMA DOSE IN AIR ALONG THE MAIN TRANSPORT PATH (DEFINED LOCATIO mSv 2 0 32 mSv 2 10
+ 024021 AIR CONCENTRATION (OF NAMED ISOTOPE TYPE INCLUDING GROSS BETA) Bq/M**3 2 0 32 Bq/M**3 2 10
+ 024022 CONCENTRATION IN PRECIPITATION (OF NAMES ISOTOPE TYPE) Bq/L 2 0 32 BQ L-1 2 10
+ 024023 PULSE RATE OF BETA RADIATION 1/S 1 0 14 1/S 1 4
+ 024024 PULSE RATE OF GAMMA RADIATION 1/S 1 0 14 1/S 1 4
+ 025001 RANGE-GATE LENGTH M -1 0 6 M -1 2
+ 025002 NUMBER OF GATES AVERAGED NUMERIC 0 0 4 NUMERIC 0 2
+ 025003 NUMBER OF INTEGRATED PULSES NUMERIC 0 0 8 NUMERIC 0 3
+ 025004 ECHO PROCESSING CODE TABLE 25004 0 0 2 CODE TABLE 25004 0 1
+ 025005 ECHO INTEGRATION CODE TABLE 25005 0 0 2 CODE TABLE 25005 0 1
+ 025006 Z TO R CONVERSION CODE TABLE 25006 0 0 3 CODE TABLE 25006 0 1
+ 025007 Z TO R CONVERSION FACTOR NUMERIC 0 0 12 NUMERIC 0 4
+ 025008 Z TO R CONVERSION EXPONENT NUMERIC 2 0 9 NUMERIC 2 3
+ 025009 CALIBRATION METHOD FLAG TABLE 25009 0 0 4 FLAG TABLE 25009 0 2
+ 025010 CLUTTER TREATMENT CODE TABLE 25010 0 0 4 CODE TABLE 25010 0 2
+ 025011 GROUND OCCULTATION CORRECTION (SCREENING) CODE TABLE 25011 0 0 2 CODE TABLE 25011 0 1
+ 025012 RANGE ATTENUATION CORRECTION CODE TABLE 25012 0 0 2 CODE TABLE 25012 0 1
+ 025013 BRIGHT-BAND CORRECTION FLAG TABLE 25013 0 0 2 FLAG TABLE 25013 0 1
+ 025014 AZIMUTH CLUTTER CUT-OFF (SEE NOTE 1) NUMERIC 0 0 12 NUMERIC 0 4
+ 025015 RADOME ATTENUATION CORRECTION FLAG TABLE 25015 0 0 2 FLAG TABLE 25015 0 1
+ 025016 CLEAR-AIR ATTENUATION CORRECTION dB/M 5 0 6 dB/M 5 2
+ 025017 PRECIPITATION ATTENUATION CORRECTION FLAG TABLE 25017 0 0 2 FLAG TABLE 25017 0 1
+ 025018 A TO Z LAW FOR ATTENUATION FACTOR NUMERIC 7 0 6 NUMERIC 7 2
+ 025019 A TO Z LAW FOR ATTENUATION EXPONENT NUMERIC 2 0 7 NUMERIC 2 3
+ 025020 MEAN SPEED ESTIMATION CODE TABLE 25020 0 0 2 CODE TABLE 25020 0 1
+ 025021 WIND COMPUTATION ENHANCEMENT FLAG TABLE 25021 0 0 8 FLAG TABLE 25021 0 3
+ 025025 BATTERY VOLTAGE V 1 0 9 V 1 3
+ 025026 BATTERY VOLTAGE (LARGE RANGE) V 1 0 12 V 1 4
+ 025028 OPERATOR OR MANUFACTURER DEFINED PARAMETER NUMERIC 1 -16384 15 NUMERIC 1 5
+ 025030 RUNNING MEAN SEA-SURFACE TEMPERATURE USAGE CODE TABLE 25030 0 0 2 CODE TABLE 25030 0 1
+ 025032 WIND PROFILER MODE INFORMATION CODE TABLE 25032 0 0 2 CODE TABLE 25032 0 1
+ 025033 WIND PROFILER SUBMODE INFORMATION* CODE TABLE 25033 0 0 2 CODE TABLE 25033 0 1
+ 025034 WIND PROFILER QUALITY CONTROL TEST RESULTS* FLAG TABLE 25034 0 0 4 FLAG TABLE 25034 0 2
+ 025036 ATMOSPHERICS LOCATION METHOD CODE TABLE 25036 0 0 4 CODE TABLE 25036 0 2
+ 025040 CO2 WIND PRODUCT DERIVATION CODE TABLE 25040 0 0 4 CODE TABLE 25040 0 2
+ 025041 MOVING PLATFORM DIRECTION REPORTING METHOD CODE TABLE 25041 0 0 2 CODE TABLE 25041 0 1
+ 025042 MOVING PLATFORM SPEED REPORTING METHOD CODE TABLE 25042 0 0 2 CODE TABLE 25042 0 1
+ 025043 WAVE SAMPLING INTERVAL (TIME) S 4 0 15 S 4 5
+ 025044 WAVE SAMPLING INTERVAL (SPACE) M 2 0 14 M 2 5
+ 025045 HIRS CHANNEL COMBINATION FLAG TABLE 25045 0 0 21 FLAG TABLE 25045 0 7
+ 025046 MSU CHANNEL COMBINATION FLAG TABLE 25046 0 0 5 FLAG TABLE 25046 0 2
+ 025047 SSU CHANNEL COMBINATION FLAG TABLE 25047 0 0 4 FLAG TABLE 25047 0 2
+ 025048 AMSU-A CHANNEL COMBINATION FLAG TABLE 25048 0 0 16 FLAG TABLE 25048 0 6
+ 025049 AMSU-B CHANNEL COMBINATION FLAG TABLE 25049 0 0 6 FLAG TABLE 25049 0 2
+ 025051 AVHRR CHANNEL COMBINATION FLAG TABLE 25051 0 0 7 FLAG TABLE 25051 0 3
+ 025052 LOG-10 OF PRINCIPAL COMPONENTS NORMALIZED FIT TO DATA NUMERIC 4 0 15 NUMERIC 4 5
+ 025053 OBSERVATION QUALITY FLAG TABLE 25053 0 0 12 FLAG TABLE 25053 0 4
+ 025054 SSMIS SUBFRAME ID NEMBER NUMERIC 0 0 5 NUMERIC 0 2
+ 025055 MULTIPLEXER HOUSEKEEPING K 2 0 16 K 2 5
+ 025060 SOFTWARE IDENTIFICATION (SEE NOTE 2) NUMERIC 0 0 14 NUMERIC 0 5
+ 025061 SOFTWARE IDENTIFICATION AND VERSION NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 025062 DATABASE IDENTIFICATION NUMERIC 0 0 14 NUMERIC 0 5
+ 025065 ORIENTATION CORRECTION (AZIMUTH) DEGREE 2 -1000 11 DEGREE 2 4
+ 025066 ORIENTATION CORRECTION (ELEVATION) DEGREE 2 -1000 11 DEGREE 2 4
+ 025067 RADIOSONDE RELEASE POINT PRESSURE CORRECTION PA 0 -8000 14 PA 0 4
+ 025068 NUMBER OF ARCHIVE RECOMPUTES NUMERIC 0 0 7 NUMERIC 0 3
+ 025069 FLIGHT LEVEL PRESSURE CORRECTIONS FLAG TABLE 25069 0 0 8 FLAG TABLE 25069 0 3
+ 025070 MAJOR FRAME COUNT NUMERIC 0 0 4 NUMERIC 0 2
+ 025071 FRAME COUNT NUMERIC 0 0 5 NUMERIC 0 2
+ 025075 SATELLITE ANTENNA CORRECTIONS VERSION NUMBER NUMERIC 0 0 5 NUMERIC 0 2
+ 025076 LOG-10 OF (TEMPERATURE-RADIANCE CENTRAL WAVENUMBER) FOR ATOVS LOG (1/M) 8 0 30 LOG (1/M) 8 10
+ 025077 BANDWIDTH CORRECTION COEFFICIENT 1 FOR ATOVS NUMERIC 5 -100000 18 NUMERIC 5 7
+ 025078 BANDWIDTH CORRECTION COEFFICIENT 2 FOR ATOVS NUMERIC 5 0 17 NUMERIC 5 6
+ 025079 ALBEDO-RADIANCE SOLAR FILTERED IRRADIANCE FOR ATOVS W/M**2 4 0 24 W/M**2 4 8
+ 025080 ALBEDO-RADIANCE EQUIVALENT FILTER WIDTH FOR ATOVS M 10 0 14 M 10 5
+ 025085 FRACTION OF CLEAR PIXELS IN HIRS FOV NUMERIC 0 0 7 NUMERIC 0 3
+ 025086 DEPTH CORRECTION INDICATOR CODE TABLE 25086 0 0 2 CODE TABLE 25086 0 1
+ 025091 STRUCTURE CONSTANT OF THE REFRACTION INDEX (CN2) dB 3 -18192 13 dB 3 5
+ 025092 ACOUSTIC PROPAGATION VELOCITY M/S 2 28000 14 M/S 2 5
+ 025093 RASS COMPUTATION CORRECTION FLAG TABLE 25093 0 0 8 FLAG TABLE 25093 0 3
+ 025095 ALTIMETER STATE FLAG FLAG TABLE 25095 0 0 2 FLAG TABLE 25095 0 1
+ 025096 RADIOMETER STATE FLAG FLAG TABLE 25096 0 0 5 FLAG TABLE 25096 0 2
+ 025097 THREE DIMENSIONAL ERROR ESTIMATE OF THE NAVIGATOR ORBIT CODE TABLE 25097 0 0 4 CODE TABLE 25097 0 2
+ 025100 XBT/XCTD FALL RATE EQUATION COEFFICIENT A NUMERIC 5 0 20 NUMERIC 5 6
+ 025101 XBT/XCTD FALL RATE EQUATION COEFFICIENT B NUMERIC 5 -500000 21 NUMERIC 5 6
+ 025102 NUMBER OF MISSING LINES EXCLUDING DATA GAPS NUMERIC 0 0 8 NUMERIC 0 3
+ 025103 NUMBER OF DIRECTIONAL BINS NUMERIC 0 0 8 NUMERIC 0 3
+ 025104 NUMBER OF WAVE-LENGTH BINS NUMERIC 0 0 8 NUMERIC 0 3
+ 025107 FIRST WAVE-LENGTH BIN M 3 0 29 M 3 9
+ 025108 LAST WAVE-LENGTH BIN M 3 0 29 M 3 9
+ 025111 NUMBER OF INPUT DATA GAPS NUMERIC 0 0 8 NUMERIC 0 3
+ 025120 RA2-L2-PROCESSING FLAG CODE TABLE 25120 0 0 2 CODE TABLE 25120 0 1
+ 025121 RA2-L2-PROCESSING QUALITY % 0 0 7 % 0 3
+ 025122 HARDWARE CONFIGURATION FOR RF CODE TABLE 25122 0 0 2 CODE TABLE 25122 0 1
+ 025123 HARDWARE CONFIGURATION FOR HPA CODE TABLE 25123 0 0 2 CODE TABLE 25123 0 1
+ 025124 MWR L2 PROCESSING FLAG CODE TABLE 25124 0 0 2 CODE TABLE 25124 0 1
+ 025125 MWR L2-PROCESSING QUALITY % 0 0 7 % 0 3
+ 025126 MODEL DRY TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025127 INVERTED BAROMETER CORRECTION M 3 -32768 16 M 3 5
+ 025128 MODEL WET TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025129 MWR DERIVED WET TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025130 RA2 IONOSPHERIC CORRECTION ON KU BAND M 3 -32768 16 M 3 5
+ 025131 IONOSPHERIC CORRECTION FROM DORIS ON KU BAND M 3 -32768 16 M 3 5
+ 025132 IONOSPHERIC CORRECTION FROM MODEL ON KU BAND M 3 -32768 16 M 3 5
+ 025133 SEA STATE BIAS CORRECTION ON KU BAND M 3 -32768 16 M 3 5
+ 025134 RA2 IONOSPHERIC CORRECTION ON S BAND M 3 -32768 16 M 3 5
+ 025135 IONOSPHERIC CORRECTION FROM DORIS ON S BAND M 3 -32768 16 M 3 5
+ 025136 IONOSPHERIC CORRECTION FROM MODEL ON S BAND M 3 -32768 16 M 3 5
+ 025137 SEA STATE BIAS CORRECTION ON S BAND M 3 -32768 16 M 3 5
+ 025138 AVERAGE SIGNAL TO NOISE RATION NUMERIC 0 -2048 12 NUMERIC 0 4
+ 025140 START CHANNEL NUMERIC 0 0 14 NUMERIC 0 5
+ 025141 END CHANNEL NUMERIC 0 0 14 NUMERIC 0 5
+ 025142 CHANNEL SCALE FACTOR NUMERIC 0 0 6 NUMERIC 0 2
+ 025150 SATELLITE INTENSITY ANALYSIS METHOD OF TROPICAL CYCLONE CODE TABLE 25150 0 0 4 CODE TABLE 25150 2 2
+ 026001 PRINCIPAL TIME OF DAILY READING IN UTC OF MAXIMUM TEMPERATURE HOUR 1 0 12 HOUR 1 3
+ 026002 PRINCIPAL TIME OF DAILY READING IN UTC OF MINIMUM TEMPERATURE HOUR 1 0 12 HOUR 1 3
+ 026003 TIME DIFFERENCE MINUTE 0 -1440 12 MINUTE 0 4
+ 026010 HOURS INCLUDED FLAG TABLE 26010 0 0 26 FLAG TABLE 26010 0 9
+ 026020 DURATION OF PRECIPITATION MINUTE 0 0 11 MINUTE 0 4
+ 027001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 027002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 027003 ALTERNATE LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 027004 ALTERNATE LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 027020 SATELLITE LOCATION COUNTER NUMERIC 0 0 16 NUMERIC 0 5
+ 027021 SATELLITE SUBLOCATION DIMENSION NUMERIC 0 0 16 NUMERIC 0 5
+ 027031 IN DIRECTION OF 0 DEGREES LONGITUDE, DISTANCE FROM THE EARTH'S C M 2 -1073741824 31 M 2 10
+ 027080 VIEWING AZIMUTH ANGLE DEGREE TRUE 2 0 16 DEGREE TRUE 0 5
+ 028001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 028002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 028003 ALTERNATE LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 028004 ALTERNATE LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 028031 IN DIRECTION 90 DEGREES EAST, DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31 M 2 10
+ 029001 PROJECTION TYPE CODE TABLE 29001 0 0 3 CODE TABLE 29001 0 1
+ 029002 CO-ORDINATE GRID TYPE CODE TABLE 29002 0 0 3 CODE TABLE 29002 0 1
+ 030001 PIXEL VALUE (4 BITS) NUMERIC 0 0 4 NUMERIC 0 2
+ 030002 PIXEL VALUE (8 BITS) NUMERIC 0 0 8 NUMERIC 0 3
+ 030004 PIXEL VALUE (16 BITS) NUMERIC 0 0 16 NUMERIC 0 5
+ 030021 NUMBER OF PIXELS PER ROW NUMERIC 0 0 12 NUMERIC 0 4
+ 030022 NUMBER OF PIXELS PER COLUMN NUMERIC 0 0 12 NUMERIC 0 4
+ 030031 PICTURE TYPE CODE TABLE 30031 0 0 4 CODE TABLE 30031 0 2
+ 030032 COMBINATION WITH OTHER DATA FLAG TABLE 30032 0 0 16 FLAG TABLE 30032 0 6
+ 031000 SHORT DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 1 NUMERIC 0 1
+ 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8 NUMERIC 0 3
+ 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16 NUMERIC 0 5
+ 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8 NUMERIC 0 3
+ 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16 NUMERIC 0 5
+ 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 31021 0 0 6 CODE TABLE 31021 0 2
+ 031031 DATA PRESENT INDICATOR FLAG TABLE 31031 0 0 1 FLAG TABLE 31031 0 1
+ 033002 QUALITY INFORMATION CODE TABLE 33002 0 0 2 CODE TABLE 33002 0 1
+ 033003 QUALITY INFORMATION CODE TABLE 33003 0 0 3 CODE TABLE 33003 0 1
+ 033005 QUALITY INFORMATION (AWS DATA) FLAG TABLE 33005 0 0 30 FLAG TABLE 33005 0 10
+ 033006 INTERNAL MEASUREMENT STATUS INFORMATION (AWS) CODE TABLE 33006 0 0 3 CODE TABLE 33006 0 1
+ 033007 PER CENT CONFIDENCE % 0 0 7 % 0 3
+ 033015 DATA QUALITY CHECK INDICATOR CODE TABLE 33015 0 0 6 CODE TABLE 33015 0 2
+ 033020 QUALITY CONTROL INDICATION OF FOLLOWING VALUE CODE TABLE 33020 0 0 3 CODE TABLE 33020 0 1
+ 033021 QUALITY OF FOLLOWING VALUE CODE TABLE 33021 0 0 2 CODE TABLE 33021 0 1
+ 033022 QUALITY OF BUOY SATELLITE TRANSMISSION CODE TABLE 33022 0 0 2 CODE TABLE 33022 0 1
+ 033023 QUALITY OF BUOY LOCATION CODE TABLE 33023 0 0 2 CODE TABLE 33023 0 1
+ 033024 STATION ELEVATION QUALITY MARK (FOR MOBILE STATIONS) CODE TABLE 33024 0 0 4 CODE TABLE 33024 0 2
+ 033025 ACARS INTERPOLATED VALUES CODE TABLE 33025 0 0 3 CODE TABLE 33025 0 1
+ 033026 MOISTURE QUALITY CODE TABLE 33026 0 0 6 CODE TABLE 33026 0 2
+ 033027 LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66 % CONFIDENCE) CODE TABLE 33027 0 0 3 CODE TABLE 33027 0 1
+ 033030 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 33030 0 0 24 FLAG TABLE 33030 0 8
+ 033031 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 33031 0 0 24 FLAG TABLE 33031 0 8
+ 033032 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 33032 0 0 24 FLAG TABLE 33032 0 8
+ 033033 FIELD OF VIEW QUALITY FLAGS FOR ATOVS FLAG TABLE 33033 0 0 24 FLAG TABLE 33033 0 8
+ 033035 MANUAL/AUTOMATIC QUALITY CONTROL CODE TABLE 33035 0 0 4 CODE TABLE 33035 0 2
+ 033036 NOMINAL CONFIDENCE THRESHOLD % 0 0 7 % 0 3
+ 033037 WIND CORRELATION ERROR FLAG TABLE 33037 0 0 20 FLAG TABLE 33037 0 7
+ 033038 QUALITY FLAGS FOR GROUND-BASED GNSS DATA FLAG TABLE 33038 0 0 10 FLAG TABLE 33038 0 4
+ 033039 QUALITY FLAGS FOR RADIO OCCULTATION DATA FLAG TABLE 33039 0 0 16 FLAG TABLE 33039 0 6
+ 033040 CONFIDENCE INTERVAL % 0 0 7 PERCENT 0 3
+ 033041 ATTRIBUTE OF FOLLOWING VALUE CODE TABLE 33041 0 0 2 CODE TABLE 33041 0 1
+ 033042 TYPE OF LIMIT REPRESENTED BY FOLLOWING VALUE CODE TABLE 33042 0 0 3 CODE TABLE 33042 0 1
+ 033043 AST CONFIDENCE FLAG TABLE 33043 0 0 8 FLAG TABLE 33043 0 3
+ 033044 ASAR QUALITY INFORMATION FLAG TABLE 33044 0 0 15 FLAG TABLE 33044 0 5
+ 033045 PROBABILITY OF FOLLOWING EVENT % 0 0 7 % 0 3
+ 033046 CONDITIONAL PROBABILITY OF FOLLOWING EVENT WITH RESPECT TO SPECI % 0 0 7 % 0 3
+ 033047 MEASUREMENT CONFIDENCE DATA FLAG TABLE 33047 0 0 31 FLAG TABLE 33047 0 11
+ 033048 CONFIDENCE MEASURE OF SAR INVERSION CODE TABLE 33048 0 0 2 CODE TABLE 33048 0 1
+ 033049 CONFIDENCE MEASURE OF WIND RETRIEVAL CODE TABLE 33049 0 0 2 CODE TABLE 33049 0 1
+ 033050 GLOBAL GTSPP QUALITY FLAG CODE TABLE 33050 0 0 4 CODE TABLE 33050 0 2
+ 033052 S BAND OCEAN RETRACKING QUALITY FLAG TABLE 33052 0 0 21 FLAG TABLE 33052 0 7
+ 033053 KU BAND OCEAN RETRACKING QUALITY FLAG TABLE 33053 0 0 21 FLAG TABLE 33053 0 7
+ 033060 GQISFLAGQUAL-INDIVIDUAL IASI-SYSTEM QUALITY FLAG CODE TABLE 33060 0 0 2 CODE TABLE 33060 0 1
+ 033061 GQISQUALINDEX - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE % 0 0 7 % 0 3
+ 033062 GQISQUALINDEXLOC - INDICATOR FOR GEOMETRIC QUALITY INDEX % 0 0 7 % 0 3
+ 033063 GQISQUALINDEXRAD - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE % 0 0 7 % 0 3
+ 033064 GQISQUALINDEXSPECT - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE % 0 0 7 % 0 3
+ 033065 GQISSYSTECSONDQUAL - OUTPUT OF SYSTEM TEC QUALITY FUNCTION NUMERIC 0 0 24 NUMERIC 0 24
+ 033066 SBUV TOTAL OZONE QUALITY CODE TABLE 33066 0 0 4 CODE TABLE 33066 0 2
+ 033067 SBUV PROFILE OZONE QUALITY CODE TABLE 33067 0 0 4 CODE TABLE 33067 0 2
+ 035000 FM AND REGIONAL CODE NUMBER CODE TABLE 35000 0 0 10 CODE TABLE 35000 0 3
+ 035001 TIME-FRAME FOR MONITORING CODE TABLE 35001 0 0 3 CODE TABLE 35001 0 1
+ 035011 NUMBER OF REPORTS ACTUALLY RECEIVED NUMERIC 0 0 14 NUMERIC 0 4
+ 035021 BULLETIN BEING MONITORED (TTAAII) CCITTIA5 0 0 48 CHARACTER 0 6
+ 035022 BULLETIN BEING MONITORED (YYGGGG) CCITTIA5 0 0 48 CHARACTER 0 6
+ 035023 BULLETIN BEING MONITORED (CCCC) CCITTIA5 0 0 32 CHARACTER 0 4
+ 035024 BULLETIN BEING MONITORED (BBB) CCITTIA5 0 0 24 CHARACTER 0 3
+ 035030 DISCREPANCIES IN THE AVAILABILITY OF EXPECTED DATA CODE TABLE 35030 0 0 4 CODE TABLE 35030 0 1
+ 035031 QUALIFIER ON MONITORING RESULTS CODE TABLE 35031 0 0 7 CODE TABLE 35031 0 2
+ 035032 CAUSE OF MISSING DATA CODE TABLE 35032 0 0 4 CODE TABLE 35032 0 1
+ 035033 OBSERVATION AND COLLECTION DEFICIENCIES CODE TABLE 35033 0 0 7 CODE TABLE 35033 0 2
+ 035034 STATISTICAL TRENDS FOR AVAILABILITY OF DATA (DURING THE SURVEY P CODE TABLE 35034 0 0 3 CODE TABLE 35034 0 1
+ 035035 REASON FOR TERMINATION CODE TABLE 35035 0 0 5 CODE TABLE 35035 0 2
+ 040001 SURFACE SOIL MOISTURE (MS) % 1 0 10 % 1 4
+ 040002 ESTIMATED ERROR IN SURFACE SOIL MOISTURE % 1 0 10 % 1 4
+ 040003 MEAN SURFACE SOIL MOISTURE NUMERIC 3 0 10 NUMERIC 3 4
+ 040004 RAIN FALL DETECTION NUMERIC 3 0 10 NUMERIC 3 4
+ 040005 SOIL MOISTURE CORRECTION FLAG FLAG TABLE 40005 0 0 8 FLAG FLAG TABLE 40005 0 3
+ 040006 SOIL MOISTURE PROCESSING FLAG FLAG TABLE 40006 0 0 16 FLAG FLAG TABLE 40006 0 5
+ 040007 SOIL MOISTURE QUALITY % 1 0 10 % 1 4
+ 040008 FROZEN LAND SURFACE FRACTION % 1 0 10 % 1 4
+ 040009 INUNDATION AND WETLAND FRACTION % 1 0 10 % 1 4
+ 040010 TOPOGRAPHIC COMPLEXITY % 1 0 10 % 1 4
diff --git a/crextables/B000207 b/crextables/B000207
new file mode 100755
index 0000000..d476ab6
--- /dev/null
+++ b/crextables/B000207
@@ -0,0 +1,1210 @@
+ 000001 TABLE A: ENTRY CCITTIA5 0 0 24 CHARACTER 0 3
+ 000002 TABLE A: DATA CATEGORY DESCRIPTION, LINE 1 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000003 TABLE A: DATA CATEGORY DESCRIPTION, LINE 2 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000004 BUFR/CREX MASTER TABLE CCITTIA5 0 0 16 CHARACTER 0 2
+ 000005 BUFR/CREX EDITION NUMBER CCITTIA5 0 0 24 CHARACTER 0 3
+ 000006 BUFR MASTER TABLE VERSION NUMBER CCITTIA5 0 0 16 CHARACTER 0 2
+ 000007 CREX MASTER TABLE VERSION NUMBER CCITTIA5 0 0 16 CHARACTER 0 2
+ 000008 BUFR LOCAL TABLE VERSION NUMBER CCITTIA5 0 0 16 CHARACTER 0 2
+ 000010 F DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 8 CHARACTER 0 1
+ 000011 X DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 16 CHARACTER 0 2
+ 000012 Y DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 24 CHARACTER 0 3
+ 000013 ELEMENT NAME, LINE 1 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000014 ELEMENT NAME, LINE 2 CCITTIA5 0 0 256 CHARACTER 0 32
+ 000015 UNITS NAME CCITTIA5 0 0 192 CHARACTER 0 24
+ 000016 UNITS SCALE SIGN CCITTIA5 0 0 8 CHARACTER 0 1
+ 000017 UNITS SCALE CCITTIA5 0 0 24 CHARACTER 0 3
+ 000018 UNITS REFERENCE SIGN CCITTIA5 0 0 8 CHARACTER 0 1
+ 000019 UNITS REFERENCE VALUE CCITTIA5 0 0 80 CHARACTER 0 10
+ 000020 ELEMENT DATA WIDTH CCITTIA5 0 0 24 CHARACTER 0 3
+ 000030 DESCRIPTOR DEFINING SEQUENCE CCITTIA5 0 0 48 CHARACTER 0 6
+ 001001 WMO BLOCK NUMBER NUMERIC 0 0 7 NUMERIC 0 2
+ 001002 WMO STATION NUMBER NUMERIC 0 0 10 NUMERIC 0 3
+ 001003 WMO REGION NUMBER/GEOGRAPHICAL AREA CODE TABLE 1003 0 0 3 CODE TABLE 1003 0 1
+ 001004 WMO REGION SUB-AREA (SEE NOTE 9) NUMERIC 0 0 3 NUMERIC 0 1
+ 001005 BUOY/PLATFORM IDENTIFIER NUMERIC 0 0 17 NUMERIC 0 5
+ 001006 AIRCRAFT FLIGHT NUMBER CCITTIA5 0 0 64 CHARACTER 0 8
+ 001007 SATELLITE IDENTIFIER CODE TABLE 1007 0 0 10 CODE TABLE 1007 0 4
+ 001008 AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION CCITTIA5 0 0 64 CHARACTER 0 8
+ 001009 TYPE OF COMMERCIAL AIRCRAFT CCITTIA5 0 0 64 CHARACTER 0 8
+ 001010 STATIONARY BUOY PLATFORM IDENTIFIER; E.G. C-MAN BUOYS CCITTIA5 0 0 64 CHARACTER 0 8
+ 001011 SHIP OR MOBILE LAND STATION IDENTIFIER CCITTIA5 0 0 72 CHARACTER 0 9
+ 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM* M/S 0 0 10 M/S 0 3
+ 001014 PLATFORM DRIFT SPEED (HIGH PRECISION) M/S 2 0 10 M/S 2 4
+ 001015 STATION OR SITE NAME CCITTIA5 0 0 160 CHARACTER 0 20
+ 001018 SHORT STATION OR SITE NAME CCITTIA5 0 0 40 CHARACTER 0 5
+ 001019 LONG STATION OR SITE NAME CCITTIA5 0 0 256 CHARACTER 0 32
+ 001020 WMO REGION SUB-AREA NUMERIC 0 0 4 NUMERIC 0 2
+ 001021 SYNOPTIC FEATURE IDENTIFIER NUMERIC 0 0 14 NUMERIC 0 4
+ 001022 NAME OF FEATURE (SEE NOTE 11) CCITTIA5 0 0 224 CHARACTER 0 28
+ 001023 OBSERVATION SEQUENCE NUMBER NUMERIC 0 0 9 NUMERIC 0 3
+ 001025 STORM IDENTIFIER CCITTIA5 0 0 24 CHARACTER 0 3
+ 001026 WMO STORM NAME CCITTIA5 0 0 64 CHARACTER 0 8
+ 001027 WMO LONG STORM NAME CCITTIA5 0 0 80 CHARACTER 0 10
+ 001031 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE (SEE NOTE 10) CODE TABLE 1031 0 0 16 CODE TABLE 1031 0 5
+ 001032 GENERATING APPLICATION CODE TABLE 1032 0 0 8 CODE TABLE 1032 0 3
+ 001033 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE CODE TABLE 1033 0 0 8 CODE TABLE 1033 0 3
+ 001034 IDENTIFICATION OF ORIGINATING/GENERATING SUB-CENTRE CODE TABLE 1034 0 0 8 CODE TABLE 1034 0 3
+ 001035 ORIGINATING CENTRE COMMON CODE TABLE C-11 0 0 16 COMMON CODE TABLE C-11 0 5
+ 001036 AGENCY IN CHARGE OF OPERATING THE OBSERVING PLATFORM CODE TABLE 1036 0 0 20 CODE TABLE 1036 0 7
+ 001041 ABSOLUTE PLATFORM VELOCITY - FIRST COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001042 ABSOLUTE PLATFORM VELOCITY - SECOND COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001043 ABSOLUTE PLATFORM VELOCITY - THIRD COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10
+ 001050 PLATFORM TRANSMITTER ID NUMBER NUMERIC 0 0 17 NUMERIC 0 6
+ 001051 PLATFORM TRANSMITTER ID NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 001052 PLATFORM TRANSMITTER ID CODE TABLE 1052 0 0 3 CODE TABLE 1052 0 1
+ 001053 TSUNAMETER REPORT SEQUENCE NUMBER TRIGGERED BY A TSUNAMI EVENT NUMERIC 0 0 7 NUMERIC 0 2
+ 001060 AIRCRAFT REPORTING POINT (BEACON IDENTIFIER) CCITTIA5 0 0 64 CHARACTER 0 8
+ 001062 SHORT ICAO LOCATION INDICATOR CCITTIA5 0 0 32 CHARACTER 0 4
+ 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64 CHARACTER 0 8
+ 001064 RUNWAY DESIGNATOR CCITTIA5 0 0 32 CHARACTER 0 4
+ 001075 TIDE STATION IDENTIFICATION CCITTIA5 0 0 40 CHARACTER 0 5
+ 001080 SHIP LINE NUMBER ACCORDING TO SOOP CCITTIA5 0 0 32 CHARACTER 0 4
+ 001081 RADIOSONDE SERIAL NUMBER CCITTIA5 0 0 160 CHARACTER 0 20
+ 001082 RADIOSONDE ASCENSION NUMBER (SEE NOTE 12) NUMERIC 0 0 14 NUMERIC 0 4
+ 001083 RADIOSONDE RELEASE NUMBER (SEE NOTE 12) NUMERIC 0 0 3 NUMERIC 0 1
+ 001085 OBSERVING PLATFORM MANUFACTURER'S MODEL CCITTIA5 0 0 160 CHARACTER 0 20
+ 001086 OBSERVING PLATFORM MANUFACTURER'S SERIAL NUMBER CCITTIA5 0 0 256 CHARACTER 0 32
+ 001087 WMO MARINE OBSERVING PLATFORM EXTENDED IDENTIFIER NUMERIC 0 0 23 NUMERIC 0 7
+ 001090 TECHNIQUE FOR MAKING UP INITIAL PERTURBATIONS CODE TABLE 1090 0 0 8 CODE TABLE 1090 0 3
+ 001091 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 10 NUMERIC 0 4
+ 001092 TYPE OF ENSEMBLE FORECAST CODE TABLE 1092 0 0 8 CODE TABLE 1092 0 3
+ 001093 BALLOON LOT NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 001094 WBAN NUMBER NUMERIC 0 0 17 NUMERIC 0 5
+ 001095 OBSERVER IDENTIFICATION CCITTIA5 0 0 32 CHARACTER 0 4
+ 001096 STATION ACQUISITION CCITTIA5 0 0 160 CHARACTER 0 20
+ 002001 TYPE OF STATION CODE TABLE 2001 0 0 2 CODE TABLE 2001 0 1
+ 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 2002 0 0 4 FLAG TABLE 2002 0 2
+ 002003 TYPE OF MEASURING EQUIPMENT USED CODE TABLE 2003 0 0 4 CODE TABLE 2003 0 2
+ 002004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUREMENT OR TYPE OF C CODE TABLE 2004 0 0 4 CODE TABLE 2004 0 2
+ 002005 PRECISION OF TEMPERATURE OBSERVATION K 2 0 7 K 2 3
+ 002011 RADIOSONDE TYPE CODE TABLE 2011 0 0 8 CODE TABLE 2011 0 3
+ 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 2012 0 0 4 CODE TABLE 2012 0 2
+ 002013 SOLAR AND INFRARED RADIATION CORRECTION CODE TABLE 2013 0 0 4 CODE TABLE 2013 0 2
+ 002014 TRACKING TECHNIQUE/STATUS OF SYSTEM USED CODE TABLE 2014 0 0 7 CODE TABLE 2014 0 3
+ 002015 RADIOSONDE COMPLETENESS CODE TABLE 2015 0 0 4 CODE TABLE 2015 0 2
+ 002016 RADIOSONDE CONFIGURATION FLAG TABLE 2016 0 0 5 FLAG TABLE 2016 0 2
+ 002019 SATELLITE INSTRUMENTS CODE TABLE 2019 0 0 11 CODE TABLE 2019 0 4
+ 002020 SATELLITE CLASSIFICATION CODE TABLE 2020 0 0 9 CODE TABLE 2020 0 3
+ 002021 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 2021 0 0 9 FLAG TABLE 2021 0 3
+ 002022 SATELLITE DATA-PROCESSING TECHNIQUE USED FLAG TABLE 2022 0 0 8 FLAG TABLE 2022 0 3
+ 002023 SATELLITE DERIVED WIND COMPUTATION METHOD CODE TABLE 2023 0 0 4 CODE TABLE 2023 0 2
+ 002024 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2024 0 0 4 CODE TABLE 2024 0 2
+ 002025 SATELLITE CHANNEL(S) USED IN COMPUTATION FLAG TABLE 2025 0 0 25 FLAG TABLE 2025 0 9
+ 002026 CROSS TRACK RESOLUTION M 2 0 12 M 2 4
+ 002027 ALONG TRACK RESOLUTION M 2 0 12 M 2 4
+ 002028 SEGMENT SIZE AT NADIR IN X DIRECTION M 0 0 18 M 0 6
+ 002029 SEGMENT SIZE AT NADIR IN Y DIRECTION M 0 0 18 M 0 6
+ 002030 METHOD OF CURRENT MEASUREMENT CODE TABLE 2030 0 0 3 CODE TABLE 2030 0 1
+ 002031 DURATION AND TIME OF CURRENT MEASUREMENT CODE TABLE 2031 0 0 5 CODE TABLE 2031 0 2
+ 002032 INDICATOR FOR DIGITIZATION CODE TABLE 2032 0 0 2 CODE TABLE 2032 0 1
+ 002033 METHOD OF SALINITY/DEPTH MEASUREMENT CODE TABLE 2033 0 0 3 CODE TABLE 2033 0 1
+ 002034 DROGUE TYPE CODE TABLE 2034 0 0 5 CODE TABLE 2034 0 2
+ 002035 CABLE LENGTH M 0 0 9 M 0 3
+ 002036 BUOY TYPE CODE TABLE 2036 0 0 2 CODE TABLE 2036 0 1
+ 002037 METHOD OF TIDAL OBSERVATION CODE TABLE 2037 0 0 3 CODE TABLE 2037 0 1
+ 002038 METHOD OF WATER TEMPERATURE AND/OR SALINITY MEASUREMENT CODE TABLE 2038 0 0 4 CODE TABLE 2038 0 2
+ 002039 METHOD OF WET-BULB TEMPERATURE MEASUREMENT CODE TABLE 2039 0 0 3 CODE TABLE 2039 0 1
+ 002040 METHOD OF REMOVING VELOCITY AND MOTION OF PLATFORM FROM CURRENT CODE TABLE 2040 0 0 4 CODE TABLE 2040 0 2
+ 002041 METHOD FOR ESTIMATING REPORTS RELATED TO SYNOPTIC FEATURES CODE TABLE 2041 0 0 6 CODE TABLE 2041 0 2
+ 002042 INDICATOR FOR SEA SURFACE CURRENT SPEED CODE TABLE 2042 0 0 2 CODE TABLE 2042 0 1
+ 002044 INDICATOR FOR METHOD OF CALCULATING SPECTRAL WAVE DATA CODE TABLE 2044 0 0 4 CODE TABLE 2044 0 2
+ 002045 INDICATOR FOR TYPE OF PLATFORM CODE TABLE 2045 0 0 4 CODE TABLE 2045 0 2
+ 002046 WAVE MEASUREMENT INSTRUMENTATION CODE TABLE 2046 0 0 4 CODE TABLE 2046 0 2
+ 002047 DEEP-OCEAN TSUNAMETER TYPE CODE TABLE 2047 0 0 7 CODE TABLE 2047 0 2
+ 002048 SATELLITE SENSOR INDICATOR CODE TABLE 2048 0 0 4 CODE TABLE 2048 0 2
+ 002049 GEOSTATIONARY SATELLITE DATA-PROCESSING TECHNIQUE USED FLAG TABLE 2049 0 0 8 FLAG TABLE 2049 0 3
+ 002050 GEOSTATIONARY SOUNDER SATELLITE CHANNELS USED FLAG TABLE 2050 0 0 20 FLAG TABLE 2050 0 7
+ 002051 INDICATOR TO SPECIFY OBSERVING METHOD FOR EXTREME TEMPERATURES CODE TABLE 2051 0 0 4 CODE TABLE 2051 0 2
+ 002052 GEOSTATIONARY IMAGER SATELLITE CHANNELS USED FLAG TABLE 2052 0 0 6 FLAG TABLE 2052 0 2
+ 002053 GOES-I/M BRIGHTNESS TEMPERATURE CHARACTERISTICS CODE TABLE 2053 0 0 4 CODE TABLE 2053 0 2
+ 002054 GOES-I/M SOUNDINGS PARAMETER CHARACTERISTICS CODE TABLE 2054 0 0 4 CODE TABLE 2054 0 2
+ 002055 GEOSTATIONARY SOUNDINGS STATISTICAL PARAMETERS CODE TABLE 2055 0 0 4 CODE TABLE 2055 0 2
+ 002056 GEOSTATIONARY SOUNDINGS ACCURACY STATISTICS CODE TABLE 2056 0 0 4 CODE TABLE 2056 0 2
+ 002057 ORIGIN OF FIRST GUESS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2057 0 0 4 CODE TABLE 2057 0 2
+ 002058 VALID TIMES OF FIRST GUESS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2058 0 0 4 CODE TABLE 2058 0 2
+ 002059 ORIGIN OF ANALYSIS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2059 0 0 4 CODE TABLE 2059 0 2
+ 002060 ORIGIN OF SURFACE INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2060 0 0 4 CODE TABLE 2060 0 2
+ 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 2061 0 0 3 CODE TABLE 2061 0 1
+ 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 2062 0 0 4 CODE TABLE 2062 0 2
+ 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16 DEGREE 2 5
+ 002064 AIRCRAFT ROLL ANGLE QUALITY CODE TABLE 2064 0 0 2 CODE TABLE 2064 0 1
+ 002065 ACARS GROUND RECEIVING STATION CCITTIA5 0 0 40 CHARACTER 0 5
+ 002066 RADIOSONDE GROUND RECEIVING SYSTEM CODE TABLE 2066 0 0 6 CODE TABLE 2066 0 2
+ 002067 RADIOSONDE OPERATING FREQUENCY Hz -5 0 15 Hz -5 5
+ 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 2070 0 0 4 CODE TABLE 2070 0 2
+ 002080 BALLOON MANUFACTURER CODE TABLE 2080 0 0 6 CODE TABLE 2080 0 2
+ 002081 TYPE OF BALLOON CODE TABLE 2081 0 0 5 CODE TABLE 2081 0 2
+ 002082 WEIGHT OF BALLOON KG 3 0 12 KG 3 4
+ 002083 TYPE OF BALLOON SHELTER CODE TABLE 2083 0 0 4 CODE TABLE 2083 0 2
+ 002084 TYPE OF GAS USED IN BALLOON CODE TABLE 2084 0 0 4 CODE TABLE 2084 0 2
+ 002085 AMOUNT OF GAS USED IN BALLOON KG 3 0 13 KG 3 4
+ 002086 BALLOON FLIGHT TRAIN LENGTH M 1 0 10 M 1 4
+ 002091 ENTRY SENSOR 4/20 MA A 4 0 10 A 4 3
+ 002095 TYPE OF PRESSURE SENSOR CODE TABLE 2095 0 0 5 CODE TABLE 2095 0 2
+ 002096 TYPE OF TEMPERATURE SENSOR CODE TABLE 2096 0 0 5 CODE TABLE 2096 0 2
+ 002097 TYPE OF HUMIDITY SENSOR CODE TABLE 2097 0 0 5 CODE TABLE 2097 0 2
+ 002100 RADAR CONSTANT dB 1 0 12 dB 1 4
+ 002101 TYPE OF ANTENNA CODE TABLE 2101 0 0 4 CODE TABLE 2101 0 2
+ 002102 ANTENNA HEIGHT ABOVE TOWER BASE M 0 0 8 M 0 3
+ 002103 RADOME FLAG TABLE 2103 0 0 2 FLAG TABLE 2103 0 1
+ 002104 ANTENNA POLARISATION CODE TABLE 2104 0 0 4 CODE TABLE 2104 0 2
+ 002105 MAXIMUM ANTENNA GAIN dB 0 0 6 dB 0 2
+ 002106 3-DB BEAMWIDTH DEGREE 1 0 6 DEGREE 1 2
+ 002107 SIDELOBE SUPPRESSION dB 0 0 6 dB 0 2
+ 002108 CROSSPOL DISCRIMINATION (ON AXIS) dB 0 0 6 dB 0 2
+ 002109 ANTENNA SPEED (AZIMUTH) DEGREE/S 2 0 12 DEGREE/S 2 4
+ 002110 ANTENNA SPEED (ELEVATION) DEGREE/S 2 0 12 DEGREE/S 2 4
+ 002111 RADAR INCIDENCE ANGLE DEGREE 1 0 10 DEGREE 1 4
+ 002112 RADAR LOOK ANGLE DEGREE 1 0 12 DEGREE 1 4
+ 002113 NUMBER OF AZIMUTH LOOKS NUMERIC 0 0 4 NUMERIC 0 2
+ 002114 ANTENNA EFFECTIVE SURFACE AREA M**2 0 0 15 M**2 0 5
+ 002115 TYPE OF SURFACE OBSERVING EQUIPMENT CODE TABLE 2115 0 0 5 CODE TABLE 2115 0 2
+ 002116 PERCENTAGE OF 320 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002117 PERCENTAGE OF 80 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002118 PERCENTAGE OF 20 MHZ BAND PROCESSED % 0 0 7 % 0 3
+ 002119 RA-2 INSTRUMENT OPERATIONS CODE TABLE 2119 0 0 3 CODE TABLE 2119 0 1
+ 002120 OCEAN WAVE FREQUENCY Hz 3 0 10 Hz 3 4
+ 002121 MEAN FREQUENCY Hz -8 0 7 Hz -8 3
+ 002122 FREQUENCY AGILITY RANGE Hz -6 -128 8 Hz -6 3
+ 002123 PEAK POWER W -4 0 7 W -4 3
+ 002124 AVERAGE POWER W -1 0 7 W -1 3
+ 002125 PULSE REPETITION FREQUENCY Hz -1 0 8 Hz -1 3
+ 002126 PULSE WIDTH S 7 0 6 S 7 2
+ 002127 RECEIVER INTERMEDIATE FREQUENCY Hz -6 0 7 Hz -6 3
+ 002128 INTERMEDIATE FREQUENCY BANDWIDTH Hz -5 0 6 Hz -5 2
+ 002129 MINIMUM DETECTABLE SIGNAL dB 0 -150 5 dB 0 3
+ 002130 DYNAMIC RANGE dB 0 0 7 dB 0 3
+ 002131 SENSITIVITY TIME CONTROL (STC) FLAG TABLE 2131 0 0 2 FLAG TABLE 2131 0 1
+ 002132 AZIMUTH POINTING ACCURACY DEGREE 2 0 6 DEGREE 2 2
+ 002133 ELEVATION POINTING ACCURACY DEGREE 2 0 6 DEGREE 2 2
+ 002134 ANTENNA BEAM AZIMUTH DEGREE 2 0 16 DEGREE 2 5
+ 002135 ANTENNA ELEVATION DEGREE 2 -9000 15 DEGREE 2 5
+ 002136 RANGE PROCESSED BY RANGE ATTENUATION CORRECTION M -3 0 16 M -3 5
+ 002140 SATELLITE RADAR BEAM AZIMUTH ANGLE DEGREE 0 0 9 DEGREE 0 3
+ 002141 MEASUREMENT TYPE CCITTIA5 0 0 24 CHARACTER 0 3
+ 002142 OZONE INSTRUMENT SERIAL NUMBER/ IDENTIFICATION CCITTIA5 0 0 32 CHARACTER 0 4
+ 002143 OZONE INSTRUMENT TYPE CODE TABLE 2143 0 0 7 CODE TABLE 2143 0 3
+ 002144 LIGHT SOURCE TYPE FOR BREWER SPECTRO PHOTOMETER CODE TABLE 2144 0 0 4 CODE TABLE 2144 0 2
+ 002145 WAVE LENGTH SETTING FOR DOBSON INSTRUMENTS CODE TABLE 2145 0 0 4 CODE TABLE 2145 0 2
+ 002146 SOURCE CONDITIONS FOR DOBSON INSTRUMENTS CODE TABLE 2146 0 0 4 CODE TABLE 2146 0 2
+ 002148 DATA COLLECTION AND/OR LOCATION SYSTEM CODE TABLE 2148 0 0 5 CODE TABLE 2148 0 2
+ 002149 TYPE OF DATA BUOY CODE TABLE 2149 0 0 6 CODE TABLE 2149 0 2
+ 002150 TOVS/ATOVS/AVHRR INSTRUMENTATION CHANNEL NUMBER CODE TABLE 2150 0 0 6 CODE TABLE 2150 0 2
+ 002151 RADIOMETER IDENTIFIER CODE TABLE 2151 0 0 11 CODE TABLE 2151 0 4
+ 002152 SATELLITE INSTRUMENT USED IN DATA PROCESSING(6) FLAG TABLE 2152 0 0 31 FLAG TABLE 2152 0 10
+ 002153 SATELLITE CHANNEL CENTRE FREQUENCY Hz -8 0 26 Hz -8 8
+ 002154 SATELLITE CHANNEL BAND WIDTH Hz -8 0 26 Hz -8 8
+ 002156 PERCENTAGE OF VALID KU OCEAN RETRACKER MEASUREMENTS % 0 0 7 % 0 3
+ 002157 PERCENTAGE OF VALID S OCEAN RETRACKER MEASUREMENTS % 0 0 7 % 0 3
+ 002158 RA-2 INSTRUMENT FLAG TABLE 2158 0 0 9 FLAG TABLE 2158 0 3
+ 002159 MWR INSTRUMENT FLAG TABLE 2159 0 0 8 FLAG TABLE 2159 0 3
+ 002160 WAVE LENGTH OF THE RADAR CODE TABLE 2160 0 0 4 CODE TABLE 2160 0 2
+ 002163 HEIGHT ASSIGNMENT METHOD CODE TABLE 2163 0 0 4 CODE TABLE 2163 0 2
+ 002164 TRACER CORRELATION METHOD CODE TABLE 2164 0 0 3 CODE TABLE 2164 0 1
+ 002165 RADIANCE TYPE FLAGS FLAG TABLE 2165 0 0 15 FLAG TABLE 2165 0 5
+ 002166 RADIANCE TYPE CODE TABLE 2166 0 0 4 CODE TABLE 2166 0 2
+ 002167 RADIANCE COMPUTATIONAL METHOD CODE TABLE 2167 0 0 4 CODE TABLE 2167 0 2
+ 002168 HYDROSTATIC PRESSURE OF LOWER END OF CABLE (THERMISTOR STRING) PA -3 0 16 KPA 0 5
+ 002169 ANEMOMETER TYPE CODE TABLE 2169 0 0 4 CODE TABLE 2169 0 2
+ 002172 PRODUCT TYPE FOR RETRIEVED ATMOSPHERIC GASES CODE TABLE 2172 0 0 8 CODE TABLE 2172 0 3
+ 002173 SQUARE OF THE OFF NADIR ANGLE (7) DEGREE2 4 0 10 DEGREE2 4 4
+ 002174 MEAN ACROSS TRACK PIXEL NUMBER NUMERIC 0 0 9 NUMERIC 0 3
+ 002175 METHOD OF PRECIPITATION MEASUREMENT CODE TABLE 2175 0 0 4 CODE TABLE 2175 0 2
+ 002176 METHOD OF STATE OF GROUND MEASUREMENT CODE TABLE 2176 0 0 4 CODE TABLE 2176 0 2
+ 002177 METHOD OF SNOW DEPTH MEASUREMENT CODE TABLE 2177 0 0 4 CODE TABLE 2177 0 2
+ 002178 METHOD OF LIQUID CONTENT MEASUREMENT OF PRECIPITATION CODE TABLE 2178 0 0 4 CODE TABLE 2178 0 2
+ 002179 TYPE OF SKY CONDITION ALGORITHM CODE TABLE 2179 0 0 4 CODE TABLE 2179 0 2
+ 002180 MAIN PRESENT WEATHER DETECTING SYSTEM CODE TABLE 2180 0 0 4 CODE TABLE 2180 0 2
+ 002181 SUPPLEMENTARY PRESENT WEATHER SENSOR FLAG TABLE 2181 0 0 21 FLAG TABLE 2181 0 7
+ 002182 VISIBILITY MEASUREMENT SYSTEM CODE TABLE 2182 0 0 4 CODE TABLE 2182 0 2
+ 002183 CLOUD DETECTION SYSTEM CODE TABLE 2183 0 0 4 CODE TABLE 2183 0 2
+ 002184 TYPE OF LIGHTNING DETECTION SENSOR CODE TABLE 2184 0 0 4 CODE TABLE 2184 0 2
+ 002185 METHOD OF EVAPORATION MEASUREMENT CODE TABLE 2185 0 0 4 CODE TABLE 2185 0 2
+ 002186 CAPABILITY TO DETECT PRECIPITATION PHENOMENA FLAG TABLE 2186 0 0 30 FLAG TABLE 2186 0 10
+ 002187 CAPABILITY TO DETECT OTHER WEATHER PHENOMENA FLAG TABLE 2187 0 0 18 FLAG TABLE 2187 0 6
+ 002188 CAPABILITY TO DETECT OBSCURATION FLAG TABLE 2188 0 0 21 FLAG TABLE 2188 0 7
+ 002189 CAPABILITY TO DISCRIMINATE LIGHTNING STRIKES FLAG TABLE 2189 0 0 12 FLAG TABLE 2189 0 4
+ 002190 LAGRANGIAN DRIFTER SUBMERGENCE (% TIME SUBMERGED) % 0 0 7 % 0 3
+ 004001 YEAR YEAR 0 0 12 YEAR 0 4
+ 004002 MONTH MONTH 0 0 4 MONTH 0 2
+ 004003 DAY DAY 0 0 6 DAY 0 2
+ 004004 HOUR HOUR 0 0 5 HOUR 0 2
+ 004005 MINUTE MINUTE 0 0 6 MINUTE 0 2
+ 004006 SECOND SECOND 0 0 6 SECOND 0 2
+ 004007 SECONDS WITHIN A MINUTE (MICROSECOND ACCURACY) SECOND 6 0 26 S 6 8
+ 004011 TIME INCREMENT YEAR 0 -1024 11 YEAR 0 4
+ 004012 TIME INCREMENT MONTH 0 -1024 11 MONTH 0 4
+ 004013 TIME INCREMENT DAY 0 -1024 11 DAY 0 4
+ 004014 TIME INCREMENT HOUR 0 -1024 11 HOUR 0 4
+ 004015 TIME INCREMENT MINUTE 0 -2048 12 MINUTE 0 4
+ 004016 TIME INCREMENT SECOND 0 -4096 13 SECOND 0 4
+ 004017 REFERENCE TIME PERIOD FOR ACCUMULATED OR EXTREME DATA MINUTE 0 -1440 12 MINUTE 0 4
+ 004021 TIME PERIOD OR DISPLACEMENT YEAR 0 -1024 11 YEAR 0 4
+ 004022 TIME PERIOD OR DISPLACEMENT MONTH 0 -1024 11 MONTH 0 4
+ 004023 TIME PERIOD OR DISPLACEMENT DAY 0 -1024 11 DAY 0 4
+ 004024 TIME PERIOD OR DISPLACEMENT HOUR 0 -2048 12 HOUR 0 4
+ 004025 TIME PERIOD OR DISPLACEMENT MINUTE 0 -2048 12 MINUTE 0 4
+ 004026 TIME PERIOD OR DISPLACEMENT SECOND 0 -4096 13 SECOND 0 4
+ 004031 DURATION OF TIME RELATING TO FOLLOWING VALUE HOUR 0 0 8 HOUR 0 3
+ 004032 DURATION OF TIME RELATING TO FOLLOWING VALUE MINUTE 0 0 6 MINUTE 0 2
+ 004041 TIME DIFFERENCE, UTC -LMT (SEE NOTE 6) MINUTE 0 -1440 12 MINUTE 0 4
+ 004043 DAY OF THE YEAR DAY 0 0 9 DAY 0 3
+ 004051 PRINCIPAL TIME OF DAILY READING OF MAXIMUM TEMPERATURE HOUR 0 0 5 HOUR 0 2
+ 004052 PRINCIPAL TIME OF DAILY READING OF MINIMUM TEMPERATURE HOUR 0 0 5 HOUR 0 2
+ 004053 NUMBER OF DAYS WITH PRECIPITATION EQUAL TO OR MORE THAN 1 MM NUMERIC 0 0 6 NUMERIC 0 2
+ 004059 TIMES OF OBSERVATION USED TO COMPUTE THE REPORTED MEAN VALUES FLAG TABLE 4059 0 0 6 FLAG TABLE 4059 0 2
+ 004065 SHORT TIME INCREMENT MINUTE 0 -128 8 MINUTE 0 2
+ 004066 SHORT TIME INCREMENT SECOND 0 -128 8 SECOND 0 2
+ 004073 SHORT TIME PERIOD OR DISPLACEMENT DAY 0 -128 8 DAY 0 2
+ 004074 SHORT TIME PERIOD OR DISPLACEMENT HOUR 0 -128 8 HOUR 0 2
+ 004075 SHORT TIME PERIOD OR DISPLACEMENT MINUTE 0 -128 8 MINUTE 0 2
+ 004080 AVERAGING PERIOD FOR FOLLOWING VALUE CODE TABLE 4080 0 0 4 CODE TABLE 4080 0 2
+ 004086 LONG TIME PERIOD OR DISPLACEMENT SECOND 0 -8192 15 SECOND 0 5
+ 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005011 LATITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005012 LATITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005015 LATITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 005016 LATITUDE DISPLACEMENT (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 005023 SUN TO SATELLITE AZIMUTH DIFFERENCE DEGREE 1 -1800 12 DEGREE 1 4
+ 005030 DIRECTION (SPECTRAL) DEGREE 0 0 12 DEGREE 0 4
+ 005031 ROW NUMBER NUMERIC 0 0 12 NUMERIC 0 4
+ 005033 PIXEL SIZE ON HORIZONTAL - 1 M -1 0 16 M -1 5
+ 005034 ALONG TRACK ROW NUMBER NUMERIC 0 0 11 NUMERIC 0 4
+ 005036 SHIP TRANSECT NUMBER ACCORDING TO SOOP NUMERIC 0 0 7 NUMERIC 0 2
+ 005040 ORBIT NUMBER NUMERIC 0 0 24 NUMERIC 0 8
+ 005041 SCAN LINE NUMBER NUMERIC 0 0 8 NUMERIC 0 3
+ 005042 CHANNEL NUMBER NUMERIC 0 0 6 NUMERIC 0 2^M
+ 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8 NUMERIC 0 3
+ 005044 SATELLITE CYCLE NUMBER NUMERIC 0 0 11 NUMERIC 0 4
+ 055045 FIELD OF REGARD NUMBER NUMERIC 0 0 8 NUMERIC 0 3
+ 005052 CHANNEL NUMBER INCREMENT NUMERIC 0 0 5 NUMERIC 0 2
+ 005053 FIELD OF VIEW NUMBER INCREMENT NUMERIC 0 0 5 NUMERIC 0 2
+ 005060 Y ANGULAR POSITION FROM CENTRE OF GRAVITY DEGREE 6 -8000000 24 DEGREE 6 8
+ 005061 Z ANGULAR POSITION FROM CENTRE OF GRAVITY DEGREE 6 -8000000 24 DEGREE 6 8
+ 005193 ALONG TRACK ROW NUMBER AT 50 KM NUMERIC 0 0 10 NUMERIC 0 4
+ 005194 ALONG TRACK ROW NUMBER AT 25 KM NUMERIC 0 0 11 NUMERIC 0 4
+ 005195 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 7 NUMERIC 0 3
+ 005217 LOCATION OF PLATFORM, X M 2 -1073741824 31 M 2 10
+ 005232 DIRECTION (SPECTRAL) DEGREE 2 0 16 DEGREE 2 5
+ 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006011 LONGITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006012 LONGITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006015 LONGITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 006016 LONGITUDE DISPLACEMENT (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 006021 DISTANCE M -1 0 13 M -1 4
+ 006030 WAVE NUMBER (SPECTRAL) RAD/M 5 0 13 RAD/M 5 4
+ 006031 COLUMN NUMBER NUMERIC 0 0 12 NUMERIC 0 4
+ 006033 PIXEL SIZE ON HORIZONTAL - 2 M -1 0 16 M -1 5
+ 006034 CROSS-TRACK CELL NUMBER NUMERIC 0 0 7 NUMERIC 0 3
+ 006040 RADIUS OF CONFIDENCE M 0 0 13 M 0 4
+ 006193 CROSS TRACK CELL NUMBER AT 50 KM NUMERIC 0 0 6 NUMERIC 0 2
+ 006194 CROSS TRACK CELL NUMBER AT 25 KM NUMERIC 0 0 7 NUMERIC 0 3
+ 006217 LOCATION OF PLATFORM, Y M 2 -1073741824 31 M 2 10
+ 006232 WAVENUMBER (SPECTRAL) RADS/M 5 0 13 ADS/M 5 4
+ 007001 HEIGHT OF STATION (SEE NOTE 1) M 0 -400 15 M 0 5
+ 007002 HEIGHT OR ALTITUDE M -1 -40 16 M -1 5
+ 007003 GEOPOTENTIAL M**2/S**2 -1 -400 17 M**2/S**2 -1 6
+ 007004 PRESSURE PA -1 0 14 PA -1 5
+ 007005 HEIGHT INCREMENT M 0 -400 12 M 0 4
+ 007006 HEIGHT ABOVE STATION M 0 0 15 M 0 5
+ 007007 HEIGHT M 0 -1000 17 M 0 6
+ 007008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7
+ 007009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17 GPM 0 5
+ 007010 FLIGHT LEVEL M 0 -1024 16 FT -1 5
+ 007021 ELEVATION (SEE NOTE 2) DEGREE 2 -9000 15 DEGREE 2 5
+ 007022 SOLAR ELEVATION DEGREE 2 -9000 15 DEGREE 2 5
+ 007024 SATELLITE ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 007025 SOLAR ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 007026 SATELLITE ZENITH ANGLE DEGREE 4 -900000 21 DEGREE 4 7
+ 007030 HEIGHT OF STATION GROUND ABOVE MEAN SEA LEVEL (SEE NOTE 3) M 1 - 4000 17 M 1 5
+ 007031 HEIGHT OF BAROMETER ABOVE MEAN SEA LEVEL (SEE NOTE 4) M 1 - 4000 17 M 1 5
+ 007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM) M 2 0 16 M 2 5
+ 007033 HEIGHT OF SENSOR ABOVE WATER SURFACE (SEE NOTE 6) M 1 0 12 M 1 4
+ 007040 IMPACT PARAMETER (SEE NOTE 8) M 1 62000000 22 M 1 8
+ 007061 DEPTH BELOW LAND SURFACE M 2 0 14 M 2 5
+ 007062 DEPTH BELOW SEA/WATER SURFACE M 1 0 17 M 1 6
+ 007063 DEPTH BELOW SEA/WATER SURFACE M 2 0 20 M 2 7
+ 007064 REPRESENTATIVE HEIGHT OF SENSOR ABOVE STATION (SEE NOTE 7) M 0 0 4 M 0 2
+ 007065 WATER PRESSURE PA -3 0 17 PA 0 6
+ 007070 DROGUE DEPTH M 0 0 10 M 0 4
+ 007217 LOCATION OF PLATFORM, Z M 2 -1073741824 31 M 2 10
+ 008001 VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8001 0 0 7 FLAG TABLE 8001 0 3
+ 008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS) CODE TABLE 8002 0 0 6 CODE TABLE 8002 0 2
+ 008003 VERTICAL SIGNIFICANCE (SATELLITE OBSERVATIONS) CODE TABLE 8003 0 0 6 CODE TABLE 8003 0 2
+ 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 8004 0 0 3 CODE TABLE 8004 0 1
+ 008005 METEOROLOGICAL ATTRIBUTE SIGNIFICANCE CODE TABLE 8005 0 0 4 CODE TABLE 8005 0 2
+ 008006 OZONE VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8006 0 0 9 FLAG TABLE 8006 0 3
+ 008007 DIMENSIONAL SIGNIFICANCE CODE TABLE 8007 0 0 4 CODE TABLE 8007 0 2
+ 008008 RADIATION VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8008 0 0 9 FLAG TABLE 8008 0 3
+ 008009 DETAILED PHASE OF FLIGHT CODE TABLE 8009 0 0 4 CODE TABLE 8009 0 2
+ 008010 SURFACE QUALIFIER (TEMPERATURE DATA) CODE TABLE 8010 0 0 5 CODE TABLE 8010 0 2
+ 008011 METEOROLOGICAL FEATURE CODE TABLE 8011 0 0 6 CODE TABLE 8011 0 2
+ 008012 LAND/SEA QUALIFIER CODE TABLE 8012 0 0 2 CODE TABLE 8012 0 1
+ 008013 DAY/NIGHT QUALIFIER CODE TABLE 8013 0 0 2 CODE TABLE 8013 0 1
+ 008014 QUALIFIER FOR RUNWAY VISUAL RANGE CODE TABLE 8014 0 0 4 CODE TABLE 8014 0 2
+ 008016 CHANGE QUALIFIER OF A TREND-TYPE FORECAST OR AN AERODROME FORECA CODE TABLE 8016 0 0 3 CODE TABLE 8016 0 1
+ 008017 QUALIFIER OF THE TIME WHEN THE FORECAST CHANGE IS EXPECTED CODE TABLE 8017 0 0 2 CODE TABLE 8017 0 1
+ 008018 SEAWINDS LAND/ICE SURFACE TYPE FLAG TABLE 8018 0 0 17 FLAG TABLE 8018 0 6
+ 008020 TOTAL NUMBER OF MISSING ENTITIES (WITH RESPECT TO ACCUMULATION O NUMERIC 0 0 16 NUMERIC 0 5
+ 008021 TIME SIGNIFICANCE CODE TABLE 8021 0 0 5 CODE TABLE 8021 0 2
+ 008022 TOTAL NUMBER (WITH RESPECT TO ACCUMULATION OR AVERAGE) NUMERIC 0 0 16 NUMERIC 0 5
+ 008023 FIRST ORDER STATISTICS CODE TABLE 8023 0 0 6 CODE TABLE 8023 0 2
+ 008024 DIFFERENCE STATISTICS CODE TABLE 8024 0 0 6 CODE TABLE 8024 0 2
+ 008025 TIME DIFFERENCE QUALIFIER CODE TABLE 8025 0 0 4 CODE TABLE 8025 0 2
+ 008029 REMOTLY SENSED SURFACE TYPE CODE TABLE 8029 0 0 8 CODE TABLE 8029 0 3
+ 008030 MANUAL ON CODES (VOLUME I.1, SECTION C) CODE TABLE FROM WHICH DA NUMERIC 0 0 13 NUMERIC 0 4
+ 008031 DATA CATEGORY CREX TABLE A NUMERIC 0 0 8 NUMERIC 0 3
+ 008032 STAUS OF OPERATIONS CODE TABLE 8032 0 0 3 CODE TABLE 8032 0 1
+ 008033 METHOD OF DERIVATION OF PERCENTAGE CONFIDENCE CODE TABLE 8033 0 0 7 CODE TABLE 8033 0 3
+ 008035 TYPE OF MONITORING EXERCISE CODE TABLE 8035 0 0 3 CODE TABLE 8035 0 1
+ 008036 TYPE OF CENTRE OR STATION PERFORMING MONITORING CODE TABLE 8036 0 0 3 CODE TABLE 8036 0 1
+ 008040 FLIGHT LEVEL SIGNIFICANCE CODE TABLE 8040 0 0 6 CODE TABLE 8040 0 2
+ 008041 DATA SIGNIFICANCE CODE TABLE 8041 0 0 5 CODE TABLE 8041 0 2
+ 008042 EXTENDED VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8042 0 0 18 FLAG TABLE 8042 0 6
+ 008049 NUMBER OF OBSERVATIONS NUMERIC 0 0 8 NUMERIC 0 3
+ 008050 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 8050 0 0 4 CODE TABLE 8050 0 2
+ 008051 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 8051 0 0 3 CODE TABLE 8051 0 1
+ 008052 CONDITION FOR WHICH NUMBER OF DAYS OF OCCURRENCE FOLLOWS CODE TABLE 8052 0 0 5 CODE TABLE 8052 0 2
+ 008053 DAY OF OCCURRENCE QUALIFIER CODE TABLE 8053 0 0 2 CODE TABLE 8053 0 1
+ 008060 SAMPLE SCANNING MODE SIGNIFICANCE CODE TABLE 8060 0 0 4 CODE TABLE 8060 0 2
+ 008065 SUN-GLINT INDICATOR CODE TABLE 8065 0 0 2 CODE TABLE 8065 0 1
+ 008066 SEMI-TRANSPARENCY INDICATOR CODE TABLE 8066 0 0 2 CODE TABLE 8066 0 1
+ 008070 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8070 0 0 4 CODE TABLE 8070 0 2
+ 008072 PIXEL(S) TYPE CODE TABLE 8072 0 0 3 CODE TABLE 8072 0 1
+ 008074 ALTIMETER ECHO TYPE CODE TABLE 8074 0 0 2 CODE TABLE 8074 0 1
+ 008075 ASCENDING/DESCENDING ORBIT QUALIFIER CODE TABLE 8075 0 0 2 CODE TABLE 8075 0 1
+ 008076 TYPE OF BAND CODE TABLE 8076 0 0 6 CODE TABLE 8076 0 2
+ 008081 TYPE OF EQUIPMENT CODE TABLE 8081 0 0 6 CODE TABLE 8081 0 2
+ 008082 (CBS) ARTIFICIAL CORRECTION OF SENSOR HEIGHT TO ANOTHER VALUE CODE TABLE 8082 0 0 3 CODE TABLE 8082 0 1
+ 008083 NOMINAL VALUE INDICATOR FLAG TABLE 8083 0 0 15 FLAG TABLE 8083 0 5
+ 008085 BEAM IDENTIFIER CODE TABLE 8085 0 0 3 CODE TABLE 8085 0 1
+ 008193 TIME QUALIFIER CODE TABLE 8193 0 0 6 CODE TABLE 8193 0 2
+ 008194 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8194 0 0 4 CODE TABLE 8194 0 2
+ 008195 DATA TYPE CODE TABLE 8195 0 0 7 CODE TABLE 8195 0 3
+ 008200 NUMBER OF OBSERVATIONS NUMERIC 0 0 8 NUMERIC 0 3
+ 008222 GENERATOR SIGNIFICANCE CODE TABLE 8222 0 0 4 CODE TABLE 8222 0 2
+ 008223 LAND/ICE SURFACE FLAG FLAG TABLE 8223 0 0 7 FLAG TABLE 8223 0 3
+ 008224 LAND/SEA FRACTION NUMERIC 3 0 10 NUMERIC 3 4
+ 010001 HEIGHT OF LAND SURFACE M 0 -400 15 M 0 5
+ 010002 HEIGHT M -1 -40 16 M -1 5
+ 010003 GEOPOTENTIAL M**2/S**2 -1 -400 17 M**2/S**2 -1 6
+ 010004 PRESSURE PA -1 0 14 PA -1 5
+ 010007 HEIGHT M 0 -1000 17 M 0 6
+ 010008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7
+ 010009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17 GPM 0 5
+ 010010 MINIMUM PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010011 MAXIMUM PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010031 IN DIRECTION OF THE NORTH POLE, DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31 M 2 10
+ 010032 SATELLITE DISTANCE TO EARTH'S CENTRE M 1 0 27 M 2 9
+ 010033 ALTITUDE (PLATFORM TO ELLIPSOID) M 1 0 27 M 2 9
+ 010034 EARTH RADIUS M 1 0 27 M 2 9
+ 010035 EARTH'S LOCAL RADIUS OF CURVATURE M 1 62000000 22 M 1 8
+ 010036 GEOID UNDULATION (SEE NOTE 4) M 2 -15000 15 M 2 6
+ 010040 NUMBER OF RETRIEVED LAYERS NUMERIC 0 0 10 NUMERIC 0 4
+ 010050 STANDARD DEVIATION ALTITUDE M 2 0 16 M 2 5
+ 010051 PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5
+ 010052 ALTIMETER SETTING (QNH) PA -1 0 14 PA -1 5
+ 010060 PRESSURE CHANGE PA -1 -1024 11 PA -1 4
+ 010061 3-HOUR PRESSURE CHANGE PA -1 -500 10 PA -1 4
+ 010062 24-HOUR PRESSURE CHANGE PA -1 -1000 11 PA -1 4
+ 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 10063 0 0 4 CODE TABLE 10063 0 2
+ 010070 INDICATED AIRCRAFT ALTITUDE M 0 -400 16 M 0 5
+ 010080 VIEWING ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5
+ 010081 ALTITUDE OF COG ABOVE REFERENCE ELLIPSOID M 3 0 31 M 3 10
+ 010082 INSTANTANEOUS ALTITUDE RATE MS-1 3 -65536 17 MS-1 3 6
+ 010083 SQUARED OFF NADIR ANGLE OF THE SATELLITE FROM PLATFORM DATA DEGREE2 2 0 16 DEGREE2 2 5
+ 010084 SQUARED OFF NADIR ANGLE OF THE SATELLITE FROM WAVEFORM DATA DEGREE2 2 0 16 DEGREE2 2 5
+ 010085 MEAN SEA SURFACE HEIGHT M 3 -131072 18 M 3 6
+ 010086 GEOID'S HEIGHT M 3 -131072 18 M 3 6
+ 010087 OCEAN DEPTH/LAND ELEVATION M 1 -131072 18 M 3 6
+ 010088 TOTAL GEOCENTRIC OCEAN TIDE HEIGHT SOLUTION 1 M 3 -32768 16 M 3 5
+ 010089 TOTAL GEOCENTRIC OCEAN TIDE HEIGHT SOLUTION 2 M 3 -32768 16 M 3 5
+ 010090 LONG PERIOD TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010091 TIDAL LOADING HEIGHT M 3 -32768 16 M 3 5
+ 010092 SOLID EARTH TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010093 GEOCENTRIC POLE TIDE HEIGHT M 3 -32768 16 M 3 5
+ 010095 HEIGHT OF ATMOSPHERE USED M 0 0 16 M 0 5
+ 011001 WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011002 WIND SPEED M/S 1 0 12 M/S 1 4
+ 011003 U-COMPONENT M/S 1 -4096 13 M/S 1 4
+ 011004 V-COMPONENT M/S 1 -4096 13 M/S 1 4
+ 011005 W-COMPONENT PA/S 1 -512 10 PA/S 1 4
+ 011006 W-COMPONENT M/S 2 -4096 13 M/S 2 4
+ 011010 WIND DIRECTION ASSOCIATED WITH WIND SPEED WHICH FOLLOWS DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011011 WIND DIRECTION AT 10 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011012 WIND SPEED AT 10 M M/S 1 0 12 M/S 1 4
+ 011013 WIND DIRECTION AT 5 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011014 WIND SPEED AT 5 M M/S 1 0 12 M/S 1 4
+ 011016 EXTREME COUNTERCLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011017 EXTREME CLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011019 STEADINESS OF WIND (6) % 0 0 7 % 0 3
+ 011021 RELATIVE VORTICITY 1/S 9 -65536 17 1/S 9 6
+ 011022 DIVERGENCE 1/S 9 -65536 17 1/S 9 6
+ 011023 VELOCITY POTENTIAL M**2/S -2 -65536 17 M**2/S -2 6
+ 011030 EXTENDED DEGREE OF TURBULENCE CODE TABLE 11030 0 0 6 CODE TABLE 0 2
+ 011031 DEGREE OF TURBULENCE CODE TABLE 11031 0 0 4 CODE TABLE 11031 0 2
+ 011032 HEIGHT OF BASE OF TURBULENCE M -1 -40 16 M -1 5
+ 011033 HEIGHT OF TOP OF TURBULENCE M -1 -40 16 M -1 5
+ 011034 VERTICAL GUST VELOCITY M/S 1 -1024 11 M/S 1 4
+ 011035 VERTICAL GUST ACCELERATION M/S**2 2 -8192 14 M/S**2 2 5
+ 011036 MAXIMUM DERIVED EQUIVALENT VERTICAL GUST SPEED M/S 1 0 10 M/S 1 4
+ 011037 TURBULENCE INDEX CODE TABLE 11037 0 0 6 CODE TABLE 11037 0 2
+ 011038 TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11038 0 0 5 CODE TABLE 11038 0 2
+ 011039 EXTENDED TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11039 0 0 6 CODE TABLE 11039 0 2
+ 011040 MAXIMUM WIND SPEED (MEAN WIND) M/S 1 0 12 M/S 1 4
+ 011041 MAXIMUM WIND GUST SPEED M/S 1 0 12 M/S 1 4
+ 011042 MAXIMUM WIND SPEED (10-MIN MEAN WIND) M/S 1 0 12 M/S 1 4
+ 011043 MAXIMUM WIND GUST DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011044 MEAN WIND DIRECTION FOR SURFACE - 1500 M (5000 FEET) DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011045 MEAN WIND SPEED FOR SURFACE - 1500 M (5000 FEET) M/S 1 0 12 M/S 1 4
+ 011046 MAXIMUM INSTANTANEOUS WIND SPEED M/S 1 0 12 M/S 1 4
+ 011047 MAXIMUM INSTANTANEOUS WIND SPEED OVER 10 MINUTES M/S 1 0 12 M/S 1 4
+ 011049 STANDARD DEVIATION OF WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011050 STANDARD DEVIATION OF HORIZONTAL WIND SPEED M/S 1 0 12 M/S 1 4
+ 011051 STANDARD DEVIATION OF VERTICAL WIND SPEED M/S 1 0 8 M/S 1 3
+ 011052 FORMAL UNCERTAINTY IN WIND SPEED M/S 2 0 13 M/S 2 5
+ 011053 FORMAL UNCERTAINTY IN WIND DIRECTION DEGREE TRUE 2 0 15 DEGREE TRUE 2 5
+ 011054 MEAN WIND DIRECTION FOR 1500 M - 3000 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 011055 MEAN WIND SPEED FOR 1500 M - 3000 M M/S 1 0 12 M/S 1 4
+ 011061 ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW M/S 1 0 12 M/S 1 4
+ 011062 ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE M/S 1 0 12 M/S 1 4
+ 011070 DESIGNATOR OF THE RUNWAY AFFECTED BY WIND SHEAR (INCLUDING ALL) CCITTIA5 0 0 32 CHARACTER 0 4
+ 011071 TURBULENT VERTICAL MOMENTUM FLUX M**2/S**2 3 -128 14 M**2/S**2 3 5
+ 011072 TURBULENT VERTICAL BUOYANCY FLUX KM/S 3 -128 11 KM/S 3 4
+ 011073 TURBULENT KINETIC ENERGY M**2/S**2 2 -1024 13 M**2/S**2 2 4
+ 011074 DISSIPATION ENERGY M**2/S**2 2 -1024 10 M**2/S**2 2 4
+ 011075 MEAN TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3
+ 011076 PEAK TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3
+ 011077 REPORTING INTERVAL OR AVERAGING TIME FOR EDDY DISSIPATION RATE S 0 0 12 S 0 4
+ 011081 MODEL WIND DIRECTION AT 10M DEGREE TRUE 2 0 16 DEGREE TRUE 2 5
+ 011082 MODEL WIND SPEED AT 10M M/S 2 0 14 M/S 2 4
+ 011095 U COMPONENT OF THE MODEL WIND VECTOR M/S 1 -4096 13 M/S 1 4
+ 011096 V COMPONENT OF THE MODEL WIND VECTOR M/S 1 -4096 13 M/S 1 4
+ 011230 MAXIMUM MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4^M
+ 011231 MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4^M
+ 011232 MINIMUM MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4^M
+ 011233 HIGHEST GUST DURING THE 10 MINUTE PERIOD PRECEDING OBSERVATION M/S 1 -4096 13 M/S 1 4^M
+ 012001 TEMPERATURE/DRY-BULB TEMPERATURE K 1 0 12 C 1 3
+ 012002 WET-BULB TEMPERATURE K 1 0 12 C 1 3
+ 012003 DEW-POINT TEMPERATURE K 1 0 12 C 1 3
+ 012004 DRY-BULB TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012005 WET-BULB TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012006 DEW-POINT TEMPERATURE AT 2 M K 1 0 12 C 1 3
+ 012007 VIRTUAL TEMPERATURE K 1 0 12 C 1 3
+ 012011 MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12 C 1 3
+ 012012 MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12 C 1 3
+ 012013 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS K 1 0 12 C 1 3
+ 012014 MAXIMUM TEMPERATURE AT 2 M, PAST 12 HOURS K 1 0 12 C 1 3
+ 012015 MINIMUM TEMPERATURE AT 2 M, PAST 12 HOURS K 1 0 12 C 1 3
+ 012016 MAXIMUM TEMPERATURE AT 2 M, PAST 24 HOURS K 1 0 12 C 1 3
+ 012017 MINIMUM TEMPERATURE AT 2 M, PAST 24 HOURS K 1 0 12 C 1 3
+ 012021 MAXIMUM TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012022 MINIMUM TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012030 SOIL TEMPERATURE K 1 0 12 C 1 3
+ 012049 TEMPERATURE CHANGE OVER SPECIFIED PERIOD K 0 -30 6 C 0 2
+ 012051 STANDARD DEVIATION TEMPERATURE K 1 0 10 C 1 3
+ 012052 HIGHEST DAILY MEAN TEMPERATURE K 1 0 12 C 1 3
+ 012053 LOWEST DAILY MEAN TEMPERATURE K 1 0 12 C 1 3
+ 012061 SKIN TEMPERATURE K 1 0 12 C 1 3
+ 012062 EQUIVALENT BLACK BODY TEMPERATURE K 1 0 12 C 1 3
+ 012063 BRIGHTNESS TEMPERATURE K 1 0 12 C 1 3
+ 012064 INSTRUMENT TEMPERATURE K 1 0 12 K 1 4
+ 012065 STANDARD DEVIATION BRIGHTNESS TEMPERATURE K 1 0 12 K 1 4
+ 012070 WARM LOAD TEMPERATURE K 2 0 16 K 2 5
+ 012071 COLDEST CLUSTER TEMPERATURE K 1 0 12 K 1 4
+ 012072 RADIANCE WM**(-2)SR**(-1) 6 0 31 WM**(-2)SR**(-1) 6 9
+ 012073 TEMPERATURE K 2 0 16 K 2 5
+ 012075 SPECTRAL RADIANCE WM**(-3)SR**(-1) -3 0 16 WM**(-3)SR**(-1) -3 5
+ 012076 RADIANCE WM**(-2)SR**(-1) 3 0 16 WM**(-2)SR**(-1) 3 5
+ 012101 TEMPERATURE/DRY-BULB TEMPERATURE K 2 0 16 C 2 4
+ 012102 WET-BULB TEMPERATURE K 2 0 16 C 2 4
+ 012103 DEW-POINT TEMPERATURE K 2 0 16 C 2 4
+ 012104 DRY-BULB TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012105 WEB-BULB TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012106 DEW-POINT TEMPERATURE AT 2M K 2 0 16 C 2 4
+ 012107 VIRTUAL TEMPERATURE K 2 0 16 C 2 4
+ 012111 MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 2 0 16 C 2 4
+ 012112 MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 2 0 16 C 2 4
+ 012113 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS K 2 0 16 C 2 4
+ 012114 MAXIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 2 0 16 C 2 4
+ 012115 MINIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 2 0 16 C 2 4
+ 012116 MAXIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 2 0 16 C 2 4
+ 012117 MINIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 2 0 16 C 2 4
+ 012118 MAXIMUM TEMPERATURE AT HEIGHT SPECIFIED, PAST 24 HOURS K 2 0 16 C 2 4
+ 012119 MINIMUM TEMPERATURE AT HEIGHT SPECIFIED, PAST 24 HOURS K 2 0 16 C 2 4
+ 012121 GROUND MINIMUM TEMPERATURE K 2 0 16 C 2 4
+ 012122 GROUND MINIMUM TEMPERATURE OF THE PRECEDING NIGHT K 2 0 16 C 2 4
+ 012130 SOIL TEMPERATURE K 2 0 16 C 2 4
+ 012151 STANDARD DEVIATION OF DAILY MEAN TEMPERATURE K 2 0 12 C 2 4
+ 012152 HIGHEST DAILY MEAN TEMPERATURE K 2 0 16 C 2 4
+ 012153 LOWEST DAILY MEAN TEMPERATURE K 2 0 16 C 2 4
+ 012161 SKIN TEMPERATURE K 2 0 16 C 2 4
+ 012162 EQUIVALENT BLACK BODY TEMPERATURE K 2 0 16 C 2 4
+ 012163 BRIGHTNESS TEMPERATURE K 2 0 16 C 2 4
+ 012164 INSTRUMENT TEMPERATURE K 2 0 16 K 2 5
+ 012171 COLDEST CLUSTER TEMPERATURE K 2 0 16 K 2 5
+ 012180 AVERAGED 12 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012181 AVERAGED 11 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012182 AVERAGED 3.7 MICRON BT FOR ALL CLEAR PIXELS AT NADIR K 2 0 16 K 2 5
+ 012183 AVERAGED 12 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012184 AVERAGED 11 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012185 AVERAGED 3.7 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW K 2 0 16 K 2 5
+ 012186 MEAN NADIR SEA SURFACE TEMPERATURE K 2 0 16 K 2 5
+ 012187 MEAN DUAL VIEW SEA SURFACE TEMPERATURE K 2 0 16 K 2 5
+ 012188 INTERPOLATED 23.8 GHZ BRIGHTNESS T FROM MWR K 2 0 16 K 2 5
+ 012189 INTERPOLATED 36.5 GHZ BRIGHTNESS T FROM MWR K 2 0 16 K 2 5
+ 013001 SPECIFIC HUMIDITY KG/KG 5 0 14 KG/KG 5 5
+ 013002 MIXING RATIO KG/KG 5 0 14 KG/KG 5 5
+ 013003 RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013004 VAPOUR PRESSURE PA -1 0 10 PA -1 4
+ 013005 VAPOUR DENSITY KG/M**3 3 0 7 KG/M**3 3 3
+ 013006 MIXING HEIGHTS M -1 -40 16 M -1 5
+ 013007 MINIMUM RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013008 MAXIMUM RELATIVE HUMIDITY % 0 0 7 % 0 3
+ 013009 RELATIVE HUMIDITY % 1 -1000 12 % 1 4
+ 013011 TOTAL PRECIPITATION/TOTAL WATER EQUIVALENT KG/M**2 1 -1 14 KG/M**2 1 5
+ 013012 DEPTH OF FRESH SNOW M 2 -2 12 M 2 4
+ 013013 TOTAL SNOW DEPTH M 2 -2 16 M 2 5
+ 013014 RAINFALL/WATER EQUIVALENT OF SNOW (AVERAGED RATE) KG/(M**2)S 4 0 12 KG/(M**2)S 4 4
+ 013015 SNOWFALL (AVERAGED RATE) M/S 7 0 12 M/S 7 4
+ 013016 PRECIPITABLE WATER KG/M**2 0 0 7 KG/M**2 0 3
+ 013019 TOTAL PRECIPITATION PAST 1 HOUR KG/M**2 1 -1 14 KG/M**2 1 4
+ 013020 TOTAL PRECIPITATION PAST 3 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013021 TOTAL PRECIPITATION PAST 6 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013022 TOTAL PRECIPITATION PAST 12 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013023 TOTAL PRECIPITATION PAST 24 HOURS KG/M**2 1 -1 14 KG/M**2 1 5
+ 013031 EVAPOTRANSPIRATION KG/M**2 0 0 7 KG/M**2 0 3
+ 013032 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 8 KG/M**2 1 3
+ 013033 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 10 KG/M**2 1 4
+ 013038 SUPERADIABATIC INDICATOR CODE TABLE 13038 0 0 2 CODE TABLE 13038 0 1
+ 013039 TERRAIN TYPE (ICE/SNOW) CODE TABLE 13039 0 0 3 CODE TABLE 13039 0 1
+ 013040 SURFACE FLAG CODE TABLE 13040 0 0 4 CODE TABLE 13040 0 2
+ 013041 PASQUILL-GIFFORD STABILITY CATEGORY CODE TABLE 13041 0 0 4 CODE TABLE 13041 0 2
+ 013042 PARCEL LIFTED INDEX (TO 500 HPA) K 0 -20 6 K 0 2
+ 013043 BEST LIFTED INDEX (TO 500 HPA) K 0 -20 6 K 0 2
+ 013044 K INDEX K 0 -30 8 K 0 3
+ 013045 KO INDEX K 0 -30 8 K 0 3
+ 013046 MAXIMUM BUOYANCY K 0 -30 8 K 0 3
+ 013047 MODIFIED SHOWALTER STABILITY INDEX K 0 -60 6 C 0 2
+ 013051 FREQUENCY GROUP, PRECIPITATION CODE TABLE 13051 0 0 4 CODE TABLE 13051 0 2
+ 013052 HIGHEST DAILY AMOUNT OF PRECIPITATION KG/M**2 1 -1 14 KG/M**2 1 5
+ 013055 INTENSITY OF PRECIPITATION KG/(M**2)S 4 0 8 MM H-1 1 3
+ 013056 CHARACTER AND INTENSITY OF PRECIPITATION CODE TABLE 13056 0 0 4 CODE TABLE 13056 0 2
+ 013057 TIME OF BEGINNING OR END OF PRECIPITATION CODE TABLE 13057 0 0 4 CODE TABLE 13057 0 2
+ 013058 SIZE OF PRECIPITATING ELEMENT M 4 0 7 MM 1 3
+ 013059 NUMBER OF FLASHES (THUNDERSTORM) NUMERIC 0 0 7 NUMERIC 0 3
+ 013060 TOTAL ACCUMULATED PRECIPITATION KG/M**2 1 -1 17 KG/M**2 1 5
+ 013071 UPSTREAM WATER LEVEL M 2 0 14 M 2 5
+ 013072 DOWNSTREAM WATER LEVEL M 2 0 14 M 2 4
+ 013073 MAXIMUM WATER LEVEL M 2 0 14 M 2 4
+ 013080 WATER PH pH 1 0 10 pH 1 3
+ 013081 WATER CONDUCTIVITY S M-1 3 0 14 S M-1 3 4
+ 013082 WATER TEMPERATURE K 1 0 12 K 1 4
+ 013083 DISSOLVED OXYGEN KG/M**3 6 0 15 KG/M**3 6 5
+ 013084 TURBIDITY LUMEN 0 0 14 LUMEN 0 4
+ 013085 OXYDATION REDUCTION POTENTIAL (ORP) V 3 0 14 V 3 4
+ 013090 RADIOMETER WATER VAPOUR CONTENT KG/M**2 1 0 10 KG/M**2 1 4
+ 013091 RADIOMETER LIQUID CONTENT KG/M**2 2 0 8 KG/M**2 2 3
+ 013093 CLOUD OPTICAL THICKNESS NUMERIC 0 0 8 NUMERIC 0 3
+ 013095 TOTAL COLUMN WATER VAPOUR KG/M**2 4 0 19 KG/M**2 4 6
+ 013096 MWR WATER VAPOUR CONTENT KG/M**2 2 0 14 KG/M**2 2 4
+ 013097 MWR LIQUID WATER CONTENT KG/M**2 2 0 14 KG/M**2 2 4
+ 013098 INTEGRATED WATER VAPOUR DENSITY KG/M**2 8 0 30 KG/M**2 8 10
+ 014001 LONG-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014002 LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014003 SHORT-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014004 SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014011 NET LONG-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014012 NET LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014013 NET SHORT-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014014 NET SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4
+ 014015 NET RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 -16384 15 J/M**2 -4 5
+ 014016 NET RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 -16384 15 J/M**2 -4 5
+ 014017 INSTANTANEOUS LONG-WAVE RADIATION (SEE NOTE 6) W/M**2 -3 -2048 12 W/M**2 -3 4
+ 014018 INSTANTANEOUS SHORT-WAVE RADIATION (SEE NOTE 6) W/M**2 -3 -2048 12 W/M**2 -3 4
+ 014019 SURFACE ALBEDO % 0 0 7 % 0 3
+ 014020 GLOBAL SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014021 GLOBAL SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014022 DIFFUSE SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014023 DIFFUSE SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014024 DIRECT SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5
+ 014025 DIRECT SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5
+ 014026 ALBEDO AT THE TOP OF CLOUDS % 0 0 7 % 0 3
+ 014027 ALBEDO % 0 0 7 % 0 3
+ 014028 GLOBAL SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S J/M**2 -2 0 16 J/M**2 -2 5
+ 014029 DIFFUSE SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD J/M**2 -2 0 16 J/M**2 -2 5
+ 014030 DIRECT SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S J/M**2 -2 0 16 J/M**2 -2 5
+ 014031 TOTAL SUNSHINE MINUTE 0 0 11 MINUTE 0 4
+ 014032 TOTAL SUNSHINE HOUR 0 0 10 HOUR 0 4
+ 014033 TOTAL SUNSHINE % 0 0 9 % 0 3
+ 014034 SUNSHINE OVER PERIOD SPECIFIED MINUTE 0 0 11 MINUTE 0 4
+ 014042 BI-DIRECTIONAL REFLECTANCE % 0 0 7 % 0 3
+ 014045 CHANNEL RADIANCE (W/M**2)*(1/SR)*CM 0 0 11 WM-2SR-1CM-1 0 4
+ 014046 SCALED IASI RADIANCE (W/M**2)*(1/SR)*(1/M) 0 -5000 16 (W/M**2)*(1/SR)*(1/M) 0 5
+ 014047 SCALED MEAN AVHRR RADIANCE (W/M**2)*(1/SR)*(1/M) 0 0 31 (W/M**2)*(1/SR)*(1/M) 0 10
+ 014048 SCALED STANDARD DEVIATION RADIANCE (W/M**2)*(1/SR)*(1/M) 0 0 31 (W/M**2)*(1/SR)*(1/M) 0 10
+ 014050 EMISSIVITY (SEE NOTE 5) % 1 0 10 % 1 4
+ 014051 DIRECT SOLAR RADIATION INTEGRATED OVER LAST HOUR J/M**2 -3 0 14 JM-2 -3 4
+ 014055 SOLAR ACTIVITY INDEX NUMERIC 0 -32768 16 NUMERIC 0 5
+ 014061 (VAL) INSTANTANEOUS LONG-WAVE RADIATION W/M**2 0 -512 10 W/M**2 0 4
+ 014062 (VAL) INSTANTANEOUS SHORT-WAVE RADIATION W/M**2 0 -2048 12 W/M**2 0 4
+ 015001 TOTAL OZONE DU 0 0 10 DU 0 4
+ 015002 AIR MASS (SLANT PATH AT 22 KM) NUMERIC 2 0 10 NUMERIC 2 3
+ 015003 MEASURED OZONE PARTIAL PRESSURE (SOUNDING) PA 4 0 9 NBAR 0 3
+ 015004 OZONE SOUNDING CORRECTION FACTOR NUMERIC 3 0 11 NUMERIC 3 4
+ 015005 OZONE P DU 0 0 10 DU 0 3
+ 015011 LOG 10 OF INTEGRATED ELECTRON DENSITY LOG (1/M2) 3 14000 13 LOG (M-2) 3 4
+ 015015 MAXIMUM IMAGE SPECTRAL COMPONENT BEFORE NORMALIZATION NUMERIC 0 0 31 NUMERIC 0 10
+ 015020 INTEGRATED 03 DENSITY KG/M**2 8 0 21 KG/M**2 8 7
+ 015025 TYPE OF POLLUTANT CODE TABLE 15025 0 0 4 CODE TABLE 15025 0 2
+ 015026 CONCENTRATION OF POLLUTANT MOLMOL-1 9 0 9 MOLMOL-1 9 3
+ 015027 CONCENTRATION OF POLLUTANT KG/M3 9 0 10 KG/M3 9 4
+ 015031 ATMOSPHERIC PATH DELAY IN SATELLITE SIGNAL M 4 10000 15 M 4 5
+ 015032 ESTIMATED ERROR IN ATMOSPHERIC PATH DELAY M 4 0 10 M 4 4
+ 015033 DIFFERENCE IN PATH DELAYS FOR LIMB VIEWS AT EXTREMES OF SCAN M 5 -10000 15 M 5 5
+ 015034 ESTIMATED ERROR IN PATH DELAY DIFFERENCE M 5 0 14 M 5 5
+ 015035 COMPONENT OF ZENITH PATH DELAY DUE TO WATER VAPOUR M 4 0 14 M 4 5
+ 015036 ATMOSPHERIC REFRACTIVITY (SEE NOTE 5) N-UNITS 3 0 19 N-UNITS 3 6
+ 015037 BENDING ANGLE RADIANS 8 -100000 23 RADIANS 8 7
+ 019001 TYPE OF SYNOPTIC FEATURE CODE TABLE 19001 0 0 6 CODE TABLE 19001 0 2
+ 019002 EFFECTIVE RADIUS OF FEATURE M -2 0 12 M -2 4
+ 019003 WIND SPEED THRESHOLD M/S 0 0 8 M/S 0 3
+ 019004 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD M -2 0 12 M -2 4
+ 019005 DIRECTION OF MOTION OF FEATURE DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 019006 SPEED OF MOTION OF FEATURE M/S 2 0 14 M/S 2 5
+ 019007 EFFECTIVE RADIUS OF FEATURE M -3 0 12 M -3 4
+ 019008 VERTICAL EXTENT OF CIRCULATION CODE TABLE 19008 0 0 3 CODE TABLE 19008 0 1
+ 019009 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD (LA M -3 0 12 M -3 4
+ 019010 METHOD FOR TRACKING THE CENTRE OF SYNOPTIC FEATURE CODE TABLE 19010 0 0 4 CODE TABLE 19010 0 2
+ 019100 TIME INTERVAL TO CALCULATE THE MOVEMENT OF THE TROPICAL CYCLONE CODE TABLE 19100 0 0 4 CODE TABLE 19100 0 2
+ 019101 ACCURACY OF THE POSITION OF THE CENTRE OF THE TROPICAL CYCLONE CODE TABLE 19101 0 0 4 CODE TABLE 19101 0 2
+ 019102 SHAPE AND DEFINITION OF THE EYE OF THE TROPICAL CYCLONE CODE TABLE 19102 0 0 3 CODE TABLE 19102 0 1
+ 019103 DIAMETER OF MAJOR AXIS OF THE EYE OF THE TROPICAL CYCLONE CODE TABLE 19103 0 0 4 CODE TABLE 19103 0 2
+ 019104 CHANGE IN CHARACTER OF THE EYE DURING THE 30 MINUTES CODE TABLE 19104 0 0 4 CODE TABLE 19104 0 2
+ 019105 DISTANCE BETWEEN THE END OF SPIRAL BAND AND THE CENTRE CODE TABLE 19105 0 0 4 CODE TABLE 19105 0 2
+ 019106 IDENTIFICATION NUMBER OF TROPICAL CYCLONE NUMERIC 0 0 7 NUMERIC 0 3
+ 019107 TIME INTERVAL OF THE TROPICAL CYCLONE ANALYSIS CODE TABLE 19107 0 0 4 CODE TABLE 19107 0 2
+ 019108 ACCURACY OF GEOGRAPHICAL POSITION OF THE TROPICAL CYCLONE CODE TABLE 19108 0 0 3 CODE TABLE 19108 0 1
+ 019109 MEAN DIAMETER OF THE OVERCAST CLOUD OF THE TROPICAL CYCLONE CODE TABLE 19109 0 0 4 CODE TABLE 19109 0 2
+ 019110 APPARENT 24-HOUR CHANGE IN INTENSITY OF TROPICAL CYCLONE CODE TABLE 19110 0 0 4 CODE TABLE 19110 0 2
+ 019111 CURRENT INTENSITY (CI) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019112 DATA TROPICAL (DT) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019113 CLOUD PATTERN TYPE OF THE DT- NUMBER CODE TABLE 19113 0 0 4 CODE TABLE 19113 0 2
+ 019114 MODEL EXPECTED TROPICAL (MET) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019115 TREND OF PAST 24-HOUR CHANGE (+: DEVELOPED, -: WEAKENED) NUMERIC 1 -30 6 NUMERIC 1 2
+ 019116 PATTERN TROPICAL (PT) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019117 CLOUD PICTURE TYPE OF THE PT- NUMBER CODE TABLE 19117 0 0 3 CODE TABLE 19117 0 1
+ 019118 FINAL TROPICAL (T) NUMBER OF THE TROPICAL CYCLONE NUMERIC 1 0 7 NUMERIC 1 3
+ 019119 TYPE OF THE FINAL T-NUMBER CODE TABLE 19119 0 0 3 CODE TABLE 19119 0 1
+ 019150 TYPHOON INTERNATIONAL COMMON NUMBER (TYPHOON COMMITTEE) CCITTIA5 0 0 32 CHARACTER 0 4
+ 020001 HORIZONTAL VISIBILITY M -1 0 13 M -1 4
+ 020002 VERTICAL VISIBILITY M -1 0 7 M -1 3
+ 020003 PRESENT WEATHER (SEE NOTE 1) CODE TABLE 20003 0 0 9 CODE TABLE 20003 0 3
+ 020004 PAST WEATHER (1) (SEE NOTE 2) CODE TABLE 20004 0 0 5 CODE TABLE 20004 0 2
+ 020005 PAST WEATHER (2) (SEE NOTE 2) CODE TABLE 20005 0 0 5 CODE TABLE 20005 0 2
+ 020008 CLOUD DISTRIBUTION FOR AVIATION CODE TABLE 20008 0 0 5 CODE TABLE 20008 0 2
+ 020009 GENERAL WEATHER INDICATOR (TAF/METAR) CODE TABLE 20009 0 0 4 CODE TABLE 20009 0 2
+ 020010 CLOUD COVER (TOTAL) % 0 0 7 % 0 3
+ 020011 CLOUD AMOUNT CODE TABLE 20011 0 0 4 CODE TABLE 20011 0 2
+ 020012 CLOUD TYPE CODE TABLE 20012 0 0 6 CODE TABLE 20012 0 2
+ 020013 HEIGHT OF BASE OF CLOUD M -1 -40 11 M -1 4
+ 020014 HEIGHT OF TOP OF CLOUD M -1 -40 11 M -1 4
+ 020015 PRESSURE AT BASE OF CLOUD PA -1 0 14 PA -1 5
+ 020016 PRESSURE AT TOP OF CLOUD PA -1 0 14 PA -1 5
+ 020017 CLOUD TOP DESCRIPTION CODE TABLE 20017 0 0 4 CODE TABLE 20017 0 2
+ 020018 TENDENCY OF RUNWAY VISUAL RANGE CODE TABLE 20018 0 0 2 CODE TABLE 20018 0 1
+ 020019 SIGNIFICANT PRESENT OR FORECAST WEATHER CCITTIA5 0 0 72 CHARACTER 0 9
+ 020020 SIGNIFICANT RECENT WEATHER PHENOMENA CCITTIA5 0 0 32 CHARACTER 0 4
+ 020021 TYPE OF PRECIPITATION FLAG TABLE 20021 0 0 30 FLAG TABLE 20021 0 10
+ 020022 CHARACTER OF PRECIPITATION CODE TABLE 20022 0 0 4 CODE TABLE 20022 0 2
+ 020023 OTHER WEATHER PHENOMENA FLAG TABLE 20023 0 0 18 FLAG TABLE 20023 0 6
+ 020024 INTENSITY OF PHENOMENA CODE TABLE 20024 0 0 3 CODE TABLE 20024 0 1
+ 020025 OBSCURATION FLAG TABLE 20025 0 0 21 FLAG TABLE 20025 0 7
+ 020026 CHARACTER OF OBSCURATION CODE TABLE 20026 0 0 4 CODE TABLE 20026 0 2
+ 020027 PHENOMENA OCCURRENCE FLAG TABLE 20027 0 0 9 FLAG TABLE 20027 0 3
+ 020029 RAIN FLAG CODE TABLE 20029 0 0 2 CODE TABLE 20029 0 1
+ 020031 ICE DEPOSIT (THICKNESS) M 2 0 7 M 2 3
+ 020032 RATE OF ICE ACCRETION CODE TABLE 20032 0 0 3 CODE TABLE 20032 0 1
+ 020033 CAUSE OF ICE ACCRETION FLAG TABLE 20033 0 0 4 FLAG TABLE 20033 0 2
+ 020034 SEA ICE CONCENTRATION CODE TABLE 20034 0 0 5 CODE TABLE 20034 0 2
+ 020035 AMOUNT AND TYPE OF ICE CODE TABLE 20035 0 0 4 CODE TABLE 20035 0 2
+ 020036 ICE SITUATION CODE TABLE 20036 0 0 5 CODE TABLE 20036 0 2
+ 020037 ICE DEVELOPMENT CODE TABLE 20037 0 0 5 CODE TABLE 20037 0 2
+ 020038 BEARING OF ICE EDGE (SEE NOTE 3) DEGREE TRUE 0 0 12 DEGREE TRUE 0 3
+ 020039 ICE DISTANCE M -1 0 13 M -1 4
+ 020040 EVOLUTION OF DRIFT OF SNOW CODE TABLE 20040 0 0 4 CODE TABLE 20040 0 2
+ 020041 AIRFRAME ICING CODE TABLE 20041 0 0 4 CODE TABLE 20041 0 2
+ 020042 AIRFRAME ICING PRESENT CODE TABLE 20042 0 0 2 CODE TABLE 20042 0 1
+ 020043 PEAK LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2
+ 020044 AVERAGE LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2
+ 020045 SUPERCOOLED LARGE DROPLET (SLD) CONDITIONS CODE TABLE 20045 0 0 2 CODE TABLE 20045 0 2
+ 020050 CLOUD INDEX CODE TABLE 20050 0 0 8 CODE TABLE 20050 0 3
+ 020051 AMOUNT OF LOW CLOUDS % 0 0 7 % 0 3
+ 020052 AMOUNT OF MIDDLE CLOUDS % 0 0 7 % 0 3
+ 020053 AMOUNT OF HIGH CLOUDS % 0 0 7 % 0 3
+ 020054 TRUE DIRECTION FROM WHICH CLOUDS ARE MOVING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 020055 STATE OF SKY IN TROPICS CODE TABLE 20055 0 0 4 CODE TABLE 20055 0 2
+ 020056 CLOUD PHASE CODE TABLE 20056 0 0 3 CODE TABLE 20056 0 1
+ 020061 RUNWAY VISUAL RANGE (RVR) M 0 0 12 M 0 4
+ 020062 STATE OF THE GROUND (WITH OR WITHOUT SNOW) CODE TABLE 20062 0 0 5 CODE TABLE 20062 0 2
+ 020063 SPECIAL PHENOMENA CODE TABLE 20063 0 0 10 CODE TABLE 20063 0 4
+ 020065 SNOW COVER (SEE NOTE 4) % 0 0 7 % 0 3
+ 020066 MAXIMUM DIAMETER OF HAILSTONES M 3 0 8 M 3 3
+ 020067 DIAMETER OF DEPOSIT M 3 0 9 M 3 3
+ 020070 MINIMUM NUMBER OF ATMOSPHERICS NUMERIC 0 0 7 NUMERIC 0 3
+ 020071 ACCURACY OF FIX AND RATE OF ATMOSPHERICS CODE TABLE 20071 0 0 4 CODE TABLE 20071 0 2
+ 020081 CLOUD AMOUNT IN SEGMENT % 0 0 7 % 0 3
+ 020082 AMOUNT SEGMENT CLOUD FREE % 0 0 7 % 0 3
+ 020083 AMOUNT OF SEGMENT COVERED BY SCENE % 0 0 7 % 0 3
+ 020090 SPECIAL CLOUDS CODE TABLE 20090 0 0 4 CODE TABLE 20090 0 2
+ 020095 ICE PROBABILITY NUMERIC 3 0 10 NUMERIC 3 4
+ 020096 ICE AGE ("A" PARAMETER) dB 2 -4096 13 dB 2 4
+ 020101 LOCUST (ACRIDIAN) NAME CODE TABLE 20101 0 0 4 CODE TABLE 20101 0 2
+ 020102 LOCUST (MATURITY) COLOR CODE TABLE 20102 0 0 4 CODE TABLE 20102 0 2
+ 020103 STAGE OF DEVELOPMENT OF LOCUSTS CODE TABLE 20103 0 0 4 CODE TABLE 20103 0 2
+ 020104 ORGANIZATION STATE OF SWARM OR BAND OF LOCUSTS CODE TABLE 20104 0 0 4 CODE TABLE 20104 0 2
+ 020105 SIZE OF SWARM OR BAND OF LOCUSTS AND DURATION OF PASSAGE OF SWARMCODE TABLE 20105 0 0 4 CODE TABLE 20105 0 2
+ 020106 LOCUST POPULATION DENSITY CODE TABLE 20106 0 0 4 CODE TABLE 20106 0 2
+ 020107 DIRECTION OF MOVEMENTS OF LOCUST SWARM CODE TABLE 20107 0 0 4 CODE TABLE 20107 0 2
+ 020108 EXTENT OF VEGETATION CODE TABLE 20108 0 0 4 CODE TABLE 20108 0 2
+ 020193 CLOUD AMOUNT IN SEGMENT % 0 0 7 % 0 3
+ 020194 AMOUNT OF SEGMENT CLOUD FREE % 0 0 7 % 0 3
+ 020215 PRESSURE AT THE BASE OF CLOUD PA -1 0 14 PA -1 5
+ 021001 HORIZONTAL REFLECTIVITY dB 0 -64 7 dB 0 3
+ 021002 VERTICAL REFLECTIVITY dB 0 -64 7 dB 0 3
+ 021003 DIFFERENTIAL REFLECTIVITY dB 1 -5 7 dB 1 3
+ 021005 LINEAR DEPOLARISATION RATIO dB 0 -65 6 dB 0 2
+ 021006 CIRCULAR DEPOLARISATION RATIO dB 0 -65 6 dB 0 2
+ 021011 DOPPLER MEAN VELOCITY IN X-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021012 DOPPLER MEAN VELOCITY IN Y-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021013 DOPPLER MEAN VELOCITY IN Z-DIRECTION M/S 0 -128 8 M/S 0 3
+ 021014 DOPPLER MEAN VELOCITY (RADIAL) M/S 1 -4096 13 M/S 1 4
+ 021017 DOPPLER VELOCITY SPECTRAL WIDTH M/S 1 0 8 M/S 1 3
+ 021021 ECHO TOPS M -3 0 4 M -3 2
+ 021030 SIGNAL TO NOISE RATIO dB 0 -32 8 dB 0 3
+ 021031 VERTICALLY INTEGRATED LIQUID-WATER CONTENT KG/M**2 0 0 7 KG/M**2 0 3
+ 021036 RADAR RAINFALL INTENSITY M/S 7 0 12 M/S 7 4
+ 021041 BRIGHT-BAND HEIGHT M -2 0 8 M -2 3
+ 021051 SIGNAL POWER ABOVE 1 MW dB 0 -256 8 dB 0 3
+ 021062 BACKSCATTER dB 2 -5000 13 dB 2 4
+ 021063 RADIOMETRIC RESOLUTION (NOISE VALUE) % 1 0 10 % 1 4
+ 021064 CLUTTER NOISE ESTIMATE NUMERIC 0 0 8 NUMERIC 0 3
+ 021065 MISSING PACKET COUNTER NUMERIC 0 -127 8 NUMERIC 0 3
+ 021066 WAVE SCATTEROMETER PRODUCT CONFIDENCE DATA FLAG TABLE 21066 0 0 12 FLAG TABLE 21066 0 4
+ 021067 WIND PRODUCT CONFIDENCE DATA FLAG TABLE 21067 0 0 13 FLAG TABLE 21067 0 5
+ 021068 RADAR ALTIMETER PRODUCT CONFIDENCE DATA FLAG TABLE 21068 0 0 8 FLAG TABLE 21068 0 3
+ 021069 SST PRODUCT CONFIDENCE DATA FLAG TABLE 21069 0 0 10 FLAG TABLE 21069 0 4
+ 021070 SST PRODUCT CONFIDENCE DATA (SADIST-2) FLAG TABLE 21070 0 0 23 FLAG TABLE 21070 0 6
+ 021071 PEAKINESS NUMERIC 0 0 16 NUMERIC 0 5
+ 021072 SATELLITE ALTIMETER CALIBRATION STATUS FLAG TABLE 21072 0 0 4 FLAG TABLE 21072 0 2
+ 021073 SATELLLITE ALTIMETER INSTRUMENT MODE FLAG TABLE 21073 0 0 9 FLAG TABLE 21073 0 3
+ 021075 IMAGE SPECTRUM INTENSITY NUMERIC 0 0 8 NUMERIC 0 3
+ 021076 REPRESENTATION OF INTENSITIES CODE TABLE 21076 0 0 3 CODE TABLE 21076 0 1
+ 021077 ALTITUDE CORRECTION (IONOSPHERE) M 3 0 14 M 3 5
+ 021078 ALTITUDE CORRECTION (DRY TROPOSPHERE) M 3 0 9 M 3 3
+ 021079 ALTITUDE CORRECTION (WET TROPOSPHERE) M 3 2000 10 M 3 4
+ 021080 ALTITUDE CORRECTION (CALIBRATION CONSTANT) M 3 0 11 M 3 4
+ 021081 OPEN LOOP CORRECTION (HEIGHT-TIME LOOP) M 3 0 10 M 3 4
+ 021082 OPEN LOOP CORRECTION (AUTO GAIN CONTROL) dB 3 -3000 14 dB 3 5
+ 021083 WARM TARGET CALIBRATION NUMERIC 0 0 16 NUMERIC 0 5
+ 021084 COLD TARGET CALIBRATION NUMERIC 0 0 16 NUMERIC 0 5
+ 021085 ATSR SEA SURFACE TEMPERATURE ACROSS- TRACK BAND NUMBER NUMERIC 0 0 4 NUMERIC 0 2
+ 021086 NUMBER OF PIXELS IN NADIR ONLY, AVERAGE NUMERIC 0 0 9 NUMERIC 0 3
+ 021087 NUMBER OF PIXELS IN DUAL VIEW, AVERAGE NUMERIC 0 0 9 NUMERIC 0 3
+ 021088 WET BACKSCATTER dB 2 -5000 13 dB 2 4
+ 021091 RADAR SIGNAL DOPPLER SPECTRUM 0TH MOMENT dB 0 -100 8 dB 0 3
+ 021092 RASS SIGNAL DOPPLER SPECTRUM 0TH MOMENT, REFERRING TO RASS SIGNA dB 0 -100 8 dB 0 3
+ 021093 Ku BAND PEAKINESS NUMERIC 3 0 16 NUMERIC 0 5
+ 021094 S BAND PEAKINESS NUMERIC 3 0 16 NUMERIC 0 5
+ 021101 NUMBER OF VECTOR AMBIGUITIES NUMERIC 0 0 3 NUMERIC 0 1
+ 021102 INDEX OF SELECTED WIND VECTOR NUMERIC 0 0 3 NUMERIC 0 1
+ 021103 TOTAL NUMBER OF SIGMA-0 MEASUREMENTS NUMERIC 0 0 5 NUMERIC 0 2
+ 021104 LIKELIHOOD COMPUTED FOR SOLUTION NUMERIC 3 -30000 15 NUMERIC 3 5
+ 021105 NORMALIZED RADAR CROSS-SECTION dB 2 -10000 14 dB 2 5
+ 021106 KP VARIANCE COEFFICIENT (ALPHA) NUMERIC 3 0 14 NUMERIC 3 5
+ 021107 KP VARIANCE COEFFICIENT (BETA) NUMERIC 8 0 16 NUMERIC 8 5
+ 021109 SEAWINDS WIND VECTOR CELL QUALITY FLAG TABLE 21109 0 0 17 FLAG TABLE 21109 0 6
+ 021110 NUMBER OF INNER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021111 NUMBER OF OUTER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021112 NUMBER OF INNER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021113 NUMBER OF OUTER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2
+ 021114 KP VARIANCE COEFFICENT (GAMMA) dB 3 -140000 18 dB 3 6
+ 021115 SEAWINDS SIGMA-0 QUALITY FLAG TABLE 21115 0 0 17 FLAG TABLE 21115 0 6
+ 021116 SEAWINDS SIGMA-0 MODE FLAG TABLE 21116 0 0 17 FLAG TABLE 21116 0 6
+ 021117 SIGMA-0 VARIANCE QUALITY CONTROL NUMERIC 2 0 16 NUMERIC 2 5
+ 021118 ATTENUATION CORRECTION ON SIGMA-0 dB 2 -10000 14 dB 2 5
+ 021119 WIND SCATTEROMETER GEOPHYSICAL MODEL FUNCTION CODE TABLE 21119 0 0 6 CODE TABLE 21119 0 2
+ 021120 PROBABILITY OF RAIN NUMERIC 3 0 10 NUMERIC 3 4
+ 021121 SEAWINDS NOF* RAIN INDEX NUMERIC 0 0 8 NUMERIC 0 3
+ 021122 ATTENUATION CORRECTION OF SIGMA-0 (FROM TB) dB 2 -10000 14 dB 2 5
+ 021123 SEAWINDS NORMALIZED RADAR CROSS SECTION dB 2 -30000 15 dB 2 5
+ 021128 NUMBER OF VALID POINTS PER SECOND USED TO DERIVE PREVIOUS PARAME NUMERIC 0 0 8 NUMERIC 0 3
+ 021130 SPECTRUM TOTAL ENERGY NUMERIC 6 0 28 NUMERIC 6 9
+ 021131 SPECTRUM MAX ENERGY NUMERIC 6 0 28 NUMERIC 6 9
+ 021132 DIRECTION OF SPECTRUM MAX ON HIGHER RESOLUTION GRID DEGREE 3 0 19 DEGREE 3 6
+ 021133 WAVE-LENGTH OF SPECTRUM MAX ON HIGHER RESOLUTION GRID M 3 0 29 M 3 9
+ 021134 RANGE RESOLUTION OF CRESS COVARIANCE SPECTRUM RAD/M 3 0 19 RAD/M 3 6
+ 021135 REAL PART OF CROSS SPECTRA POLAR GRID NUMBER OF BINS NUMERIC 3 -524288 20 NUMERIC 3 7
+ 021136 IMAGINARY PART OF CROSS SPECTRA POLAR GRID NUMBER OF BINS NUMERIC 3 -524288 20 NUMERIC 3 7
+ 021137 KU BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021138 STD KU BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021139 KU BAND NET INSTRUMENTAL CORRECTION FOR AGC dB 2 -2048 12 dB 2 4
+ 021140 S BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021141 STD S BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT dB 2 -32768 16 dB 2 5
+ 021142 S BAND NET INSTRUMENTAL CORRECTION FOR AGC dB 2 -1024 11 dB 2 4
+ 021143 KU BAND RAIN ATTENUATION dB 2 -1073741824 31 dB 2 10
+ 021144 ALTIMETER RAIN FLAG FLAG TABLE 21144 0 0 2 FLAG TABLE 21144 0 1
+ 021150 BEAM COLLOCATION CODE TABLE 21150 0 0 2 CODE TABLE 21150 0 1
+ 021151 ESTIMATED ERROR IN SIGMA0 AT 40DEG INCIDENCE ANGLE dB 2 0 9 dB 2 3
+ 021152 SLOPE AT 40DEG INCIDENCE ANGLE dB/DEG 2 -80 7 dB/DEG 2 3
+ 021153 ESTIMATED ERROR IN SLOPE AT 40DEG INCIDENCE ANGLE dB/DEG 2 -40 6 dB/DEG 2 3
+ 021154 SOIL MOISTURE SENSITIVITY dB 2 0 12 dB 2 4
+ 021155 WIND VECTOR CELL QUALITY FLAG TABLE 21155 0 0 24 FLAG TABLE 21155 0 8
+ 021156 BACKSCATTER DISTANCE NUMERIC 1 -4096 13 NUMERIC 1 4
+ 021157 LOSS PER UNIT LENGTH OF ATMOSPHERE USED dB/M 10 0 22 dB/M 10 7
+ 021158 ASCAT kp ESTIMATE QUALITY CODE TABLE 21158 0 0 2 CODE TABLE 21158 0 1
+ 021159 ASCAT SIGMA-0 USABILITY CODE TABLE 21159 0 0 2 CODE TABLE 21159 0 1
+ 021160 ASCAT USE OF SYNTHETIC DATA NUMERIC 3 0 10 NUMERIC 3 4
+ 021161 ASCAT SYNTHETIC DATA QUALITY NUMERIC 3 0 10 NUMERIC 3 4
+ 021162 ASCAT SATELLITE ORBIT AND ATTITUDE QUALITY NUMERIC 3 0 10 NUMERIC 3 4
+ 021163 ASCAT SOLAR ARRAY REFLECTION CONTAMINATION NUMERIC 3 0 10 NUMERIC 3 4
+ 021164 ASCAT TELEMETRY PRESENCE AND QUALITY NUMERIC 3 0 10 NUMERIC 3 4
+ 021165 ASCAT EXTRAPOLATED REFERENCE FUNCTION PRESENCE NUMERIC 3 0 10 NUMERIC 3 4
+ 021166 ASCAT LAND FRACTION NUMERIC 3 0 10 NUMERIC 3 4
+ 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022002 DIRECTION OF WIND WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022003 DIRECTION OF SWELL WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022004 DIRECTION OF CURRENT DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022005 DIRECTION OF SEA SURFACE CURRENT DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022011 PERIOD OF WAVES S 0 0 6 S 0 2
+ 022012 PERIOD OF WIND WAVES S 0 0 6 S 0 2
+ 022013 PERIOD OF SWELL WAVES S 0 0 6 S 0 2
+ 022021 HEIGHT OF WAVES M 1 0 10 M 1 4
+ 022022 HEIGHT OF WIND WAVES M 1 0 10 M 1 4
+ 022023 HEIGHT OF SWELL WAVES M 1 0 10 M 1 4
+ 022025 STANDARD DEVIATION WAVE HEIGHT M 2 0 10 M 2 4
+ 022026 STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT M 2 0 10 M 2 4
+ 022031 SPEED OF CURRENT M/S 2 0 13 M/S 2 4
+ 022032 SPEED OF SEA SURFACE CURRENT M/S 2 0 13 M/S 2 4
+ 022035 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 2 0 14 M 2 4
+ 022036 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 2 0 14 M 2 4
+ 022037 TIDAL ELEVATION WITH RESPECT TO NATIONAL LAND DATUM M 3 -10000 15 M 3 5
+ 022038 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 3 -10000 15 M 3 5
+ 022039 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 3 -5000 12 M 3 4
+ 022040 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 3 -5000 14 M 3 5
+ 022041 SEA-SURFACE TEMPERATURE (15-DAY RUNNING MEAN) K 1 0 12 K 1 4
+ 022042 SEA/WATER TEMPERATURE K 1 0 12 K 1 4
+ 022043 SEA/WATER TEMPERATURE K 2 0 15 K 2 5
+ 022044 SOUND VELOCITY M/S 1 0 14 M/S 1 5
+ 022045 SEA/WATER TEMPERATURE K 3 0 19 K 3 6
+ 022049 SEA SURFACE TEMPERATURE K 2 0 15 K 2 5
+ 022050 STANDARD DEVIATION SEA-SURFACE TEMPERATURE K 2 0 8 K 2 3
+ 022055 FLOAT CYCLE NUMBER NUMERIC 0 0 10 NUMERIC 0 3
+ 022056 DIRECTION OF PROFILE CODE TABLE 22056 0 0 2 CODE TABLE 22056 0 1
+ 022059 SEA SURFACE SALINITY PART PER THOUSAND 2 0 14 PART PER THOUSAND 2 5
+ 022060 LAGRANGIAN DRIFTER DROGUE STATUS CODE TABLE 22060 0 0 3 CODE TABLE 22060 0 1
+ 022061 STATE OF THE SEA CODE TABLE 22061 0 0 4 CODE TABLE 22061 0 2
+ 022062 SALINITY PART PER THOUSAND 2 0 14 PART PER THOUSAND 2 5
+ 022063 TOTAL WATER DEPTH M 0 0 14 M 0 5
+ 022064 SALINITY PART PER THOUSAND 3 0 17 PART PER THOUSAND 3 6
+ 022065 WATER PRESSURE PA -3 0 17 PA -3 6
+ 022066 WATER CONDUCTIVITY S M-1 6 0 26 S M-1 6 8
+ 022067 INSTRUMENT TYPE FOR WATER TEMPERATURE PROFILE MEASUREMENT CODE TABLE 22067 0 0 10 CODE TABLE 22067 0 4
+ 022068 WATER TEMPERATURE PROFILE RECORDER TYPES CODE TABLE 22068 0 0 7 CODE TABLE 22068 0 3
+ 022069 SPECTRAL WAVE DENSITY M2HZ-1 3 0 22 M2HZ-1 3 7
+ 022070 SIGNIFICANT WAVE HEIGHT M 2 0 13 M 2 4
+ 022071 SPECTRAL PEAK WAVE PERIOD S 1 0 9 S 1 3
+ 022072 SPECTRAL PEAK WAVE LENGTH M 0 0 13 M 0 4
+ 022073 MAXIMUM WAVE HEIGHT M 2 0 13 M 2 4
+ 022074 AVERAGE WAVE PERIOD S 1 0 9 S 1 3
+ 022075 AVERAGE WAVE LENGTH M 0 0 13 M 0 4
+ 022076 DIRECTION FROM WHICH DOMINANT WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022077 DIRECTIONAL SPREAD OF DOMINANT WAVE DEGREE 0 0 9 DEGREE 0 3
+ 022078 DURATION OF WAVE RECORD S 0 0 12 S 0 4
+ 022079 LENGTH OF WAVE RECORD M 0 0 16 M 0 5
+ 022080 WAVEBAND CENTRAL FREQUENCY Hz 3 0 10 Hz 3 4
+ 022081 WAVEBAND CENTRAL WAVE NUMBER 1/M 5 0 13 1/M 5 4
+ 022082 MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE DENSITY M**2S 2 0 20 M**2S 2 7
+ 022083 MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE NUMBER M**3 2 0 20 M**3 2 7
+ 022084 BAND CONTAINING MAXIMUM NON- DIRECTIONAL SPECTRAL WAVE DENSITY NUMERIC 0 0 7 NUMERIC 0 3
+ 022085 SPECTRAL WAVE DENSITY RATIO NUMERIC 0 0 7 NUMERIC 0 3
+ 022086 MEAN DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022087 PRINCIPAL DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022088 FIRST NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7 NUMERIC 2 3
+ 022089 SECOND NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7 NUMERIC 2 3
+ 022090 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S 2 0 20 M**2S 2 7
+ 022091 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**3 2 0 20 M**3 2 7
+ 022092 DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S/RAD 2 0 20 M**2S/RAD 2 7
+ 022093 DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**4 2 0 20 M**4 2 7
+ 022094 TOTAL NUMBER OF WAVE BANDS NUMERIC 0 0 7 NUMERIC 0 3
+ 022095 DIRECTIONAL SPREAD OF INDIVIDUAL WAVES DEGREE 0 0 8 DEGREE 0 3
+ 022096 SPECTRAL BAND WIDTH 1/S 3 0 4 1/S 3 2
+ 022097 MEAN WAVELENGTH > 731 M OF IMAGE SPECTRUM AT LOW WAVE NUMBERS M 0 0 14 M 0 5
+ 022098 WAVELENGTH SPREAD (WAVELENGTH > 731 M) AT LOW WAVE NUMBERS M 0 0 14 M 0 5
+ 022099 MEAN DIRECTION AT LOW WAVE NUMBERS (WAVELENGTH > 731 M) DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 022100 DIRECTION SPREAD AT LOW WAVE NUMBERS(WAVELENGTH > 731 M) DEGREE 0 0 9 DEGREE 0 3
+ 022101 TOTAL ENERGY (WAVELENGTH > 731M) AT LOW WAVE NUMBERS NUMERIC 0 0 31 NUMERIC 0 10
+ 022120 TIDE STATION AUTOMATED WATER LEVEL CHECK CODE TABLE 22120 0 0 5 CODE TABLE 22120 0 2
+ 022121 TIDE STATION MANUAL WATER LEVEL CHECK CODE TABLE 22121 0 0 5 CODE TABLE 22121 0 2
+ 022122 TIDE STATION AUTOMATED METEOROLOGICAL DATA CHECK CODE TABLE 22122 0 0 5 CODE TABLE 22122 0 2
+ 022123 TIDE STATION MANUAL METEOROLOGICAL DATA CHECK CODE TABLE 22123 0 0 5 CODE TABLE 22123 0 2
+ 022141 SEA-SURFACE TEMPERATURE (15-DAY RUNNING MEAN) K 2 0 15 K 2 5
+ 022150 NUMBER OF 18 HZ VALID POINTS FOR KU BAND NUMERIC 0 0 10 NUMERIC 0 4
+ 022151 KU BAND OCEAN RANGE M 3 0 31 M 3 10
+ 022152 STD OF 18 HZ KU BAND OCEAN RANGE M 3 0 16 M 3 5
+ 022153 NUMBER OF 18 HZ VALID POINTS FOR S BAND NUMERIC 0 0 10 NUMERIC 0 4
+ 022154 S BAND OCEAN RANGE M 3 0 31 M 3 10
+ 022155 STD OF 18 HZ S BAND OCEAN RANGE M 3 0 16 M 3 5
+ 022156 KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022157 STD 18HZ KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022158 S BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022159 STD 18HZ S BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 M 3 5
+ 022160 NORMALIZED INVERSE WAVE AGE NUMERIC 6 0 21 NUMERIC 6 7
+ 022161 WAVE SPECTRA M**4 4 0 27 M**4 4 9
+ 022182 WATER COLUMN HEIGHT M 3 0 23 M 3 7
+ 022184 WATER COLUMN HEIGHT DEVIATION FROM THE REFERENCE VALUE M -2000 0 12 M 3 4
+ 022185 BPR TRANSMISSION COUNT NUMERIC 0 0 10 NUMERIC 0 3
+ 023001 ACCIDENT EARLY NOTIFICATION ARTICLE APPLICABLE CODE TABLE 23001 0 0 3 CODE TABLE 23001 0 1
+ 023002 ACTIVITY OR FACILITY INVOLVED IN INCIDENT CODE TABLE 23002 0 0 5 CODE TABLE 23002 0 2
+ 023003 TYPE OF RELEASE CODE TABLE 23003 0 0 3 CODE TABLE 23003 0 1
+ 023004 COUNTERMEASURES TAKEN NEAR BORDER CODE TABLE 23004 0 0 3 CODE TABLE 23004 0 1
+ 023005 CAUSE OF INCIDENT CODE TABLE 23005 0 0 2 CODE TABLE 23005 0 1
+ 023006 INCIDENT SITUATION CODE TABLE 23006 0 0 3 CODE TABLE 23006 0 1
+ 023007 CHARACTERISTICS OF RELEASE CODE TABLE 23007 0 0 3 CODE TABLE 23007 0 1
+ 023008 STATE OF CURRENT RELEASE CODE TABLE 23008 0 0 2 CODE TABLE 23008 0 1
+ 023009 STATE OF EXPECTED RELEASE CODE TABLE 23009 0 0 2 CODE TABLE 23009 0 1
+ 023016 POSSIBILITY OF SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT CODE TABLE 23016 0 0 2 CODE TABLE 23016 0 1
+ 023017 FLOW DISCHARGE OF MAJOR RECIPIENT M**3/S 6 0 20 M**3/S 6 7
+ 023018 RELEASE BEHAVIOUR OVER TIME CODE TABLE 23018 0 0 3 CODE TABLE 23018 0 1
+ 023019 ACTUAL RELEASE HEIGHT M 0 -15000 17 M 0 6
+ 023021 EFFECTIVE RELEASE HEIGHT M 0 -15000 17 M 0 6
+ 023022 DISTANCE OF RELEASE POINT OR SITE OF INCIDENT M 0 0 24 M 0 8
+ 023023 MAIN TRANSPORT SPEED IN THE ATMOSPHERE M/S 1 0 12 M/S 1 4
+ 023024 MAIN TRANSPORT SPEED IN WATER M/S 2 0 13 M/S 2 4
+ 023025 MAIN TRANSPORT SPEED IN GROUND WATER M/S 2 0 13 M/S 2 4
+ 023027 MAIN TRANSPORT DIRECTION IN THE ATMOSPHERE DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023028 MAIN TRANSPORT DIRECTION IN WATER DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023029 MAIN TRANSPORT DIRECTION IN GROUND WATER DEGREE TRUE 0 0 9 DEGREE TRUE 0 3
+ 023031 POSSIBILITY THAT PLUME WILL ENCOUNTER PRECIPITATION IN STATE IN CODE TABLE 23031 0 0 2 CODE TABLE 23031 0 1
+ 023032 PLUME WILL ENCOUNTER CHANGE IN WIND DIRECTION AND/OR SPEED FLAG CODE TABLE 23032 0 0 2 CODE TABLE 23032 0 1
+ 024001 ESTIMATE OF AMOUNT OF RADIOACTIVITY RELEASED UP TO SPECIFIED TIM Bq -11 0 28 Bq -11 9
+ 024002 ESTIMATED MAXIMUM POTENTIAL RELEASE Bq -11 0 28 Bq -11 9
+ 024003 COMPOSITION OF RELEASE CODE TABLE 24003 0 0 5 CODE TABLE 24003 0 2
+ 024004 ELEMENT NAME CCITTIA5 0 0 16 CHARACTER 0 2
+ 024005 ISOTOPE MASS NUMERIC 0 0 9 NUMERIC 0 3
+ 024011 DOSE mSv 2 0 32 mSv 2 10
+ 024012 TRAJECTORY DOSE (DEFINED LOCATION AND EXPECTED TIME OF ARRIVAL) mSv 2 0 32 mSv 2 10
+ 024013 GAMMA DOSE IN AIR ALONG THE MAIN TRANSPORT PATH (DEFINED LOCATIO mSv 2 0 32 mSv 2 10
+ 024021 AIR CONCENTRATION (OF NAMED ISOTOPE TYPE INCLUDING GROSS BETA) Bq/M**3 2 0 32 Bq/M**3 2 10
+ 024022 CONCENTRATION IN PRECIPITATION (OF NAMES ISOTOPE TYPE) Bq/L 2 0 32 BQ L-1 2 10
+ 024023 PULSE RATE OF BETA RADIATION 1/S 1 0 14 1/S 1 4
+ 024024 PULSE RATE OF GAMMA RADIATION 1/S 1 0 14 1/S 1 4
+ 025001 RANGE-GATE LENGTH M -1 0 6 M -1 2
+ 025002 NUMBER OF GATES AVERAGED NUMERIC 0 0 4 NUMERIC 0 2
+ 025003 NUMBER OF INTEGRATED PULSES NUMERIC 0 0 8 NUMERIC 0 3
+ 025004 ECHO PROCESSING CODE TABLE 25004 0 0 2 CODE TABLE 25004 0 1
+ 025005 ECHO INTEGRATION CODE TABLE 25005 0 0 2 CODE TABLE 25005 0 1
+ 025006 Z TO R CONVERSION CODE TABLE 25006 0 0 3 CODE TABLE 25006 0 1
+ 025007 Z TO R CONVERSION FACTOR NUMERIC 0 0 12 NUMERIC 0 4
+ 025008 Z TO R CONVERSION EXPONENT NUMERIC 2 0 9 NUMERIC 2 3
+ 025009 CALIBRATION METHOD FLAG TABLE 25009 0 0 4 FLAG TABLE 25009 0 2
+ 025010 CLUTTER TREATMENT CODE TABLE 25010 0 0 4 CODE TABLE 25010 0 2
+ 025011 GROUND OCCULTATION CORRECTION (SCREENING) CODE TABLE 25011 0 0 2 CODE TABLE 25011 0 1
+ 025012 RANGE ATTENUATION CORRECTION CODE TABLE 25012 0 0 2 CODE TABLE 25012 0 1
+ 025013 BRIGHT-BAND CORRECTION FLAG TABLE 25013 0 0 2 FLAG TABLE 25013 0 1
+ 025014 AZIMUTH CLUTTER CUT-OFF (SEE NOTE 1) NUMERIC 0 0 12 NUMERIC 0 4
+ 025015 RADOME ATTENUATION CORRECTION FLAG TABLE 25015 0 0 2 FLAG TABLE 25015 0 1
+ 025016 CLEAR-AIR ATTENUATION CORRECTION dB/M 5 0 6 dB/M 5 2
+ 025017 PRECIPITATION ATTENUATION CORRECTION FLAG TABLE 25017 0 0 2 FLAG TABLE 25017 0 1
+ 025018 A TO Z LAW FOR ATTENUATION FACTOR NUMERIC 7 0 6 NUMERIC 7 2
+ 025019 A TO Z LAW FOR ATTENUATION EXPONENT NUMERIC 2 0 7 NUMERIC 2 3
+ 025020 MEAN SPEED ESTIMATION CODE TABLE 25020 0 0 2 CODE TABLE 25020 0 1
+ 025021 WIND COMPUTATION ENHANCEMENT FLAG TABLE 25021 0 0 8 FLAG TABLE 25021 0 3
+ 025025 BATTERY VOLTAGE V 1 0 9 V 1 3
+ 025026 BATTERY VOLTAGE (LARGE RANGE) V 1 0 12 V 1 4
+ 025028 OPERATOR OR MANUFACTURER DEFINED PARAMETER NUMERIC 1 -16384 15 NUMERIC 1 5
+ 025030 RUNNING MEAN SEA-SURFACE TEMPERATURE USAGE CODE TABLE 25030 0 0 2 CODE TABLE 25030 0 1
+ 025032 WIND PROFILER MODE INFORMATION CODE TABLE 25032 0 0 2 CODE TABLE 25032 0 1
+ 025033 WIND PROFILER SUBMODE INFORMATION* CODE TABLE 25033 0 0 2 CODE TABLE 25033 0 1
+ 025034 WIND PROFILER QUALITY CONTROL TEST RESULTS* FLAG TABLE 25034 0 0 4 FLAG TABLE 25034 0 2
+ 025036 ATMOSPHERICS LOCATION METHOD CODE TABLE 25036 0 0 4 CODE TABLE 25036 0 2
+ 025040 CO2 WIND PRODUCT DERIVATION CODE TABLE 25040 0 0 4 CODE TABLE 25040 0 2
+ 025041 MOVING PLATFORM DIRECTION REPORTING METHOD CODE TABLE 25041 0 0 2 CODE TABLE 25041 0 1
+ 025042 MOVING PLATFORM SPEED REPORTING METHOD CODE TABLE 25042 0 0 2 CODE TABLE 25042 0 1
+ 025043 WAVE SAMPLING INTERVAL (TIME) S 4 0 15 S 4 5
+ 025044 WAVE SAMPLING INTERVAL (SPACE) M 2 0 14 M 2 5
+ 025045 HIRS CHANNEL COMBINATION FLAG TABLE 25045 0 0 21 FLAG TABLE 25045 0 7
+ 025046 MSU CHANNEL COMBINATION FLAG TABLE 25046 0 0 5 FLAG TABLE 25046 0 2
+ 025047 SSU CHANNEL COMBINATION FLAG TABLE 25047 0 0 4 FLAG TABLE 25047 0 2
+ 025048 AMSU-A CHANNEL COMBINATION FLAG TABLE 25048 0 0 16 FLAG TABLE 25048 0 6
+ 025049 AMSU-B CHANNEL COMBINATION FLAG TABLE 25049 0 0 6 FLAG TABLE 25049 0 2
+ 025051 AVHRR CHANNEL COMBINATION FLAG TABLE 25051 0 0 7 FLAG TABLE 25051 0 3
+ 025052 LOG-10 OF PRINCIPAL COMPONENTS NORMALIZED FIT TO DATA NUMERIC 4 0 15 NUMERIC 4 5
+ 025053 OBSERVATION QUALITY FLAG TABLE 25053 0 0 12 FLAG TABLE 25053 0 4
+ 025054 SSMIS SUBFRAME ID NEMBER NUMERIC 0 0 5 NUMERIC 0 2
+ 025055 MULTIPLEXER HOUSEKEEPING K 2 0 16 K 2 5
+ 025060 SOFTWARE IDENTIFICATION (SEE NOTE 2) NUMERIC 0 0 14 NUMERIC 0 5
+ 025061 SOFTWARE IDENTIFICATION AND VERSION NUMBER CCITTIA5 0 0 96 CHARACTER 0 12
+ 025062 DATABASE IDENTIFICATION NUMERIC 0 0 14 NUMERIC 0 5
+ 025065 ORIENTATION CORRECTION (AZIMUTH) DEGREE 2 -1000 11 DEGREE 2 4
+ 025066 ORIENTATION CORRECTION (ELEVATION) DEGREE 2 -1000 11 DEGREE 2 4
+ 025067 RADIOSONDE RELEASE POINT PRESSURE CORRECTION PA 0 -8000 14 PA 0 4
+ 025068 NUMBER OF ARCHIVE RECOMPUTES NUMERIC 0 0 7 NUMERIC 0 3
+ 025069 FLIGHT LEVEL PRESSURE CORRECTIONS FLAG TABLE 25069 0 0 8 FLAG TABLE 25069 0 3
+ 025070 MAJOR FRAME COUNT NUMERIC 0 0 4 NUMERIC 0 2
+ 025071 FRAME COUNT NUMERIC 0 0 5 NUMERIC 0 2
+ 025075 SATELLITE ANTENNA CORRECTIONS VERSION NUMBER NUMERIC 0 0 5 NUMERIC 0 2
+ 025076 LOG-10 OF (TEMPERATURE-RADIANCE CENTRAL WAVENUMBER) FOR ATOVS LOG (1/M) 8 0 30 LOG (1/M) 8 10
+ 025077 BANDWIDTH CORRECTION COEFFICIENT 1 FOR ATOVS NUMERIC 5 -100000 18 NUMERIC 5 7
+ 025078 BANDWIDTH CORRECTION COEFFICIENT 2 FOR ATOVS NUMERIC 5 0 17 NUMERIC 5 6
+ 025079 ALBEDO-RADIANCE SOLAR FILTERED IRRADIANCE FOR ATOVS W/M**2 4 0 24 W/M**2 4 8
+ 025080 ALBEDO-RADIANCE EQUIVALENT FILTER WIDTH FOR ATOVS M 10 0 14 M 10 5
+ 025085 FRACTION OF CLEAR PIXELS IN HIRS FOV NUMERIC 0 0 7 NUMERIC 0 3
+ 025086 DEPTH CORRECTION INDICATOR CODE TABLE 25086 0 0 2 CODE TABLE 25086 0 1
+ 025091 STRUCTURE CONSTANT OF THE REFRACTION INDEX (CN2) dB 3 -18192 13 dB 3 5
+ 025092 ACOUSTIC PROPAGATION VELOCITY M/S 2 28000 14 M/S 2 5
+ 025093 RASS COMPUTATION CORRECTION FLAG TABLE 25093 0 0 8 FLAG TABLE 25093 0 3
+ 025095 ALTIMETER STATE FLAG FLAG TABLE 25095 0 0 2 FLAG TABLE 25095 0 1
+ 025096 RADIOMETER STATE FLAG FLAG TABLE 25096 0 0 5 FLAG TABLE 25096 0 2
+ 025097 THREE DIMENSIONAL ERROR ESTIMATE OF THE NAVIGATOR ORBIT CODE TABLE 25097 0 0 4 CODE TABLE 25097 0 2
+ 025100 XBT/XCTD FALL RATE EQUATION COEFFICIENT A NUMERIC 5 0 20 NUMERIC 5 6
+ 025101 XBT/XCTD FALL RATE EQUATION COEFFICIENT B NUMERIC 5 -500000 21 NUMERIC 5 6
+ 025102 NUMBER OF MISSING LINES EXCLUDING DATA GAPS NUMERIC 0 0 8 NUMERIC 0 3
+ 025103 NUMBER OF DIRECTIONAL BINS NUMERIC 0 0 8 NUMERIC 0 3
+ 025104 NUMBER OF WAVE-LENGTH BINS NUMERIC 0 0 8 NUMERIC 0 3
+ 025107 FIRST WAVE-LENGTH BIN M 3 0 29 M 3 9
+ 025108 LAST WAVE-LENGTH BIN M 3 0 29 M 3 9
+ 025111 NUMBER OF INPUT DATA GAPS NUMERIC 0 0 8 NUMERIC 0 3
+ 025120 RA2-L2-PROCESSING FLAG CODE TABLE 25120 0 0 2 CODE TABLE 25120 0 1
+ 025121 RA2-L2-PROCESSING QUALITY % 0 0 7 % 0 3
+ 025122 HARDWARE CONFIGURATION FOR RF CODE TABLE 25122 0 0 2 CODE TABLE 25122 0 1
+ 025123 HARDWARE CONFIGURATION FOR HPA CODE TABLE 25123 0 0 2 CODE TABLE 25123 0 1
+ 025124 MWR L2 PROCESSING FLAG CODE TABLE 25124 0 0 2 CODE TABLE 25124 0 1
+ 025125 MWR L2-PROCESSING QUALITY % 0 0 7 % 0 3
+ 025126 MODEL DRY TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025127 INVERTED BAROMETER CORRECTION M 3 -32768 16 M 3 5
+ 025128 MODEL WET TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025129 MWR DERIVED WET TROPOSPHERIC CORRECTION M 3 -32768 16 M 3 5
+ 025130 RA2 IONOSPHERIC CORRECTION ON KU BAND M 3 -32768 16 M 3 5
+ 025131 IONOSPHERIC CORRECTION FROM DORIS ON KU BAND M 3 -32768 16 M 3 5
+ 025132 IONOSPHERIC CORRECTION FROM MODEL ON KU BAND M 3 -32768 16 M 3 5
+ 025133 SEA STATE BIAS CORRECTION ON KU BAND M 3 -32768 16 M 3 5
+ 025134 RA2 IONOSPHERIC CORRECTION ON S BAND M 3 -32768 16 M 3 5
+ 025135 IONOSPHERIC CORRECTION FROM DORIS ON S BAND M 3 -32768 16 M 3 5
+ 025136 IONOSPHERIC CORRECTION FROM MODEL ON S BAND M 3 -32768 16 M 3 5
+ 025137 SEA STATE BIAS CORRECTION ON S BAND M 3 -32768 16 M 3 5
+ 025138 AVERAGE SIGNAL TO NOISE RATION NUMERIC 0 -2048 12 NUMERIC 0 4
+ 025140 START CHANNEL NUMERIC 0 0 14 NUMERIC 0 5
+ 025141 END CHANNEL NUMERIC 0 0 14 NUMERIC 0 5
+ 025142 CHANNEL SCALE FACTOR NUMERIC 0 0 6 NUMERIC 0 2
+ 025150 SATELLITE INTENSITY ANALYSIS METHOD OF TROPICAL CYCLONE CODE TABLE 25150 0 0 4 CODE TABLE 25150 2 2
+ 025170 SAMPLING INTERVAL (TIME) SECOND 0 0 10 SECOND 0 4
+ 025171 SAMPLE AVERAGING PERIOD SECOND 0 0 10 SECOND 0 4
+ 025172 NUMBER OF SAMPLES SECOND 0 0 10 SECOND 0 4
+ 026001 PRINCIPAL TIME OF DAILY READING IN UTC OF MAXIMUM TEMPERATURE HOUR 1 0 12 HOUR 1 3
+ 026002 PRINCIPAL TIME OF DAILY READING IN UTC OF MINIMUM TEMPERATURE HOUR 1 0 12 HOUR 1 3
+ 026003 TIME DIFFERENCE MINUTE 0 -1440 12 MINUTE 0 4
+ 026010 HOURS INCLUDED FLAG TABLE 26010 0 0 26 FLAG TABLE 26010 0 9
+ 026020 DURATION OF PRECIPITATION MINUTE 0 0 11 MINUTE 0 4
+ 027001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 027002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 027003 ALTERNATE LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4
+ 027004 ALTERNATE LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7
+ 027020 SATELLITE LOCATION COUNTER NUMERIC 0 0 16 NUMERIC 0 5
+ 027021 SATELLITE SUBLOCATION DIMENSION NUMERIC 0 0 16 NUMERIC 0 5
+ 027031 IN DIRECTION OF 0 DEGREES LONGITUDE, DISTANCE FROM THE EARTH'S C M 2 -1073741824 31 M 2 10
+ 027080 VIEWING AZIMUTH ANGLE DEGREE TRUE 2 0 16 DEGREE TRUE 0 5
+ 028001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 028002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 028003 ALTERNATE LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5
+ 028004 ALTERNATE LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8
+ 028031 IN DIRECTION 90 DEGREES EAST, DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31 M 2 10
+ 029001 PROJECTION TYPE CODE TABLE 29001 0 0 3 CODE TABLE 29001 0 1
+ 029002 CO-ORDINATE GRID TYPE CODE TABLE 29002 0 0 3 CODE TABLE 29002 0 1
+ 030001 PIXEL VALUE (4 BITS) NUMERIC 0 0 4 NUMERIC 0 2
+ 030002 PIXEL VALUE (8 BITS) NUMERIC 0 0 8 NUMERIC 0 3
+ 030004 PIXEL VALUE (16 BITS) NUMERIC 0 0 16 NUMERIC 0 5
+ 030021 NUMBER OF PIXELS PER ROW NUMERIC 0 0 12 NUMERIC 0 4
+ 030022 NUMBER OF PIXELS PER COLUMN NUMERIC 0 0 12 NUMERIC 0 4
+ 030031 PICTURE TYPE CODE TABLE 30031 0 0 4 CODE TABLE 30031 0 2
+ 030032 COMBINATION WITH OTHER DATA FLAG TABLE 30032 0 0 16 FLAG TABLE 30032 0 6
+ 031000 SHORT DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 1 NUMERIC 0 1
+ 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8 NUMERIC 0 3
+ 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16 NUMERIC 0 5
+ 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8 NUMERIC 0 3
+ 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16 NUMERIC 0 5
+ 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 31021 0 0 6 CODE TABLE 31021 0 2
+ 031031 DATA PRESENT INDICATOR FLAG TABLE 31031 0 0 1 FLAG TABLE 31031 0 1
+ 033002 QUALITY INFORMATION CODE TABLE 33002 0 0 2 CODE TABLE 33002 0 1
+ 033003 QUALITY INFORMATION CODE TABLE 33003 0 0 3 CODE TABLE 33003 0 1
+ 033005 QUALITY INFORMATION (AWS DATA) FLAG TABLE 33005 0 0 30 FLAG TABLE 33005 0 10
+ 033006 INTERNAL MEASUREMENT STATUS INFORMATION (AWS) CODE TABLE 33006 0 0 3 CODE TABLE 33006 0 1
+ 033007 PER CENT CONFIDENCE % 0 0 7 % 0 3
+ 033015 DATA QUALITY CHECK INDICATOR CODE TABLE 33015 0 0 6 CODE TABLE 33015 0 2
+ 033020 QUALITY CONTROL INDICATION OF FOLLOWING VALUE CODE TABLE 33020 0 0 3 CODE TABLE 33020 0 1
+ 033021 QUALITY OF FOLLOWING VALUE CODE TABLE 33021 0 0 2 CODE TABLE 33021 0 1
+ 033022 QUALITY OF BUOY SATELLITE TRANSMISSION CODE TABLE 33022 0 0 2 CODE TABLE 33022 0 1
+ 033023 QUALITY OF BUOY LOCATION CODE TABLE 33023 0 0 2 CODE TABLE 33023 0 1
+ 033024 STATION ELEVATION QUALITY MARK (FOR MOBILE STATIONS) CODE TABLE 33024 0 0 4 CODE TABLE 33024 0 2
+ 033025 ACARS INTERPOLATED VALUES CODE TABLE 33025 0 0 3 CODE TABLE 33025 0 1
+ 033026 MOISTURE QUALITY CODE TABLE 33026 0 0 6 CODE TABLE 33026 0 2
+ 033027 LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66 % CONFIDENCE) CODE TABLE 33027 0 0 3 CODE TABLE 33027 0 1
+ 033030 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 33030 0 0 24 FLAG TABLE 33030 0 8
+ 033031 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 33031 0 0 24 FLAG TABLE 33031 0 8
+ 033032 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 33032 0 0 24 FLAG TABLE 33032 0 8
+ 033033 FIELD OF VIEW QUALITY FLAGS FOR ATOVS FLAG TABLE 33033 0 0 24 FLAG TABLE 33033 0 8
+ 033035 MANUAL/AUTOMATIC QUALITY CONTROL CODE TABLE 33035 0 0 4 CODE TABLE 33035 0 2
+ 033036 NOMINAL CONFIDENCE THRESHOLD % 0 0 7 % 0 3
+ 033037 WIND CORRELATION ERROR FLAG TABLE 33037 0 0 20 FLAG TABLE 33037 0 7
+ 033038 QUALITY FLAGS FOR GROUND-BASED GNSS DATA FLAG TABLE 33038 0 0 10 FLAG TABLE 33038 0 4
+ 033039 QUALITY FLAGS FOR RADIO OCCULTATION DATA FLAG TABLE 33039 0 0 16 FLAG TABLE 33039 0 6
+ 033040 CONFIDENCE INTERVAL % 0 0 7 PERCENT 0 3
+ 033041 ATTRIBUTE OF FOLLOWING VALUE CODE TABLE 33041 0 0 2 CODE TABLE 33041 0 1
+ 033042 TYPE OF LIMIT REPRESENTED BY FOLLOWING VALUE CODE TABLE 33042 0 0 3 CODE TABLE 33042 0 1
+ 033043 AST CONFIDENCE FLAG TABLE 33043 0 0 8 FLAG TABLE 33043 0 3
+ 033044 ASAR QUALITY INFORMATION FLAG TABLE 33044 0 0 15 FLAG TABLE 33044 0 5
+ 033045 PROBABILITY OF FOLLOWING EVENT % 0 0 7 % 0 3
+ 033046 CONDITIONAL PROBABILITY OF FOLLOWING EVENT WITH RESPECT TO SPECI % 0 0 7 % 0 3
+ 033047 MEASUREMENT CONFIDENCE DATA FLAG TABLE 33047 0 0 31 FLAG TABLE 33047 0 11
+ 033048 CONFIDENCE MEASURE OF SAR INVERSION CODE TABLE 33048 0 0 2 CODE TABLE 33048 0 1
+ 033049 CONFIDENCE MEASURE OF WIND RETRIEVAL CODE TABLE 33049 0 0 2 CODE TABLE 33049 0 1
+ 033050 GLOBAL GTSPP QUALITY FLAG CODE TABLE 33050 0 0 4 CODE TABLE 33050 0 2
+ 033052 S BAND OCEAN RETRACKING QUALITY FLAG TABLE 33052 0 0 21 FLAG TABLE 33052 0 7
+ 033053 KU BAND OCEAN RETRACKING QUALITY FLAG TABLE 33053 0 0 21 FLAG TABLE 33053 0 7
+ 033060 GQISFLAGQUAL-INDIVIDUAL IASI-SYSTEM QUALITY FLAG CODE TABLE 33060 0 0 2 CODE TABLE 33060 0 1
+ 033061 GQISQUALINDEX - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE % 0 0 7 % 0 3
+ 033062 GQISQUALINDEXLOC - INDICATOR FOR GEOMETRIC QUALITY INDEX % 0 0 7 % 0 3
+ 033063 GQISQUALINDEXRAD - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE % 0 0 7 % 0 3
+ 033064 GQISQUALINDEXSPECT - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE % 0 0 7 % 0 3
+ 033065 GQISSYSTECSONDQUAL - OUTPUT OF SYSTEM TEC QUALITY FUNCTION NUMERIC 0 0 24 NUMERIC 0 24
+ 033066 SBUV TOTAL OZONE QUALITY CODE TABLE 33066 0 0 4 CODE TABLE 33066 0 2
+ 033067 SBUV PROFILE OZONE QUALITY CODE TABLE 33067 0 0 4 CODE TABLE 33067 0 2
+ 035000 FM AND REGIONAL CODE NUMBER CODE TABLE 35000 0 0 10 CODE TABLE 35000 0 3
+ 035001 TIME-FRAME FOR MONITORING CODE TABLE 35001 0 0 3 CODE TABLE 35001 0 1
+ 035011 NUMBER OF REPORTS ACTUALLY RECEIVED NUMERIC 0 0 14 NUMERIC 0 4
+ 035021 BULLETIN BEING MONITORED (TTAAII) CCITTIA5 0 0 48 CHARACTER 0 6
+ 035022 BULLETIN BEING MONITORED (YYGGGG) CCITTIA5 0 0 48 CHARACTER 0 6
+ 035023 BULLETIN BEING MONITORED (CCCC) CCITTIA5 0 0 32 CHARACTER 0 4
+ 035024 BULLETIN BEING MONITORED (BBB) CCITTIA5 0 0 24 CHARACTER 0 3
+ 035030 DISCREPANCIES IN THE AVAILABILITY OF EXPECTED DATA CODE TABLE 35030 0 0 4 CODE TABLE 35030 0 1
+ 035031 QUALIFIER ON MONITORING RESULTS CODE TABLE 35031 0 0 7 CODE TABLE 35031 0 2
+ 035032 CAUSE OF MISSING DATA CODE TABLE 35032 0 0 4 CODE TABLE 35032 0 1
+ 035033 OBSERVATION AND COLLECTION DEFICIENCIES CODE TABLE 35033 0 0 7 CODE TABLE 35033 0 2
+ 035034 STATISTICAL TRENDS FOR AVAILABILITY OF DATA (DURING THE SURVEY P CODE TABLE 35034 0 0 3 CODE TABLE 35034 0 1
+ 035035 REASON FOR TERMINATION CODE TABLE 35035 0 0 5 CODE TABLE 35035 0 2
+ 040001 SURFACE SOIL MOISTURE (MS) % 1 0 10 % 1 4
+ 040002 ESTIMATED ERROR IN SURFACE SOIL MOISTURE % 1 0 10 % 1 4
+ 040003 MEAN SURFACE SOIL MOISTURE NUMERIC 3 0 10 NUMERIC 3 4
+ 040004 RAIN FALL DETECTION NUMERIC 3 0 10 NUMERIC 3 4
+ 040005 SOIL MOISTURE CORRECTION FLAG FLAG TABLE 40005 0 0 8 FLAG FLAG TABLE 40005 0 3
+ 040006 SOIL MOISTURE PROCESSING FLAG FLAG TABLE 40006 0 0 16 FLAG FLAG TABLE 40006 0 5
+ 040007 SOIL MOISTURE QUALITY % 1 0 10 % 1 4
+ 040008 FROZEN LAND SURFACE FRACTION % 1 0 10 % 1 4
+ 040009 INUNDATION AND WETLAND FRACTION % 1 0 10 % 1 4
+ 040010 TOPOGRAPHIC COMPLEXITY % 1 0 10 % 1 4
diff --git a/crextables/D000101 b/crextables/D000101
new file mode 100755
index 0000000..c0c0921
--- /dev/null
+++ b/crextables/D000101
@@ -0,0 +1,2128 @@
+ D00002 2 B00002
+ B00003
+ D00003 3 B00010
+ B00011
+ B00012
+ D00004 9 D00003
+ B00013
+ B00014
+ B00015
+ B00016
+ B00017
+ B00018
+ B00019
+ B00020
+ D00010 3 D00003
+ R01000
+ B00030
+ D01001 2 B01001
+ B01002
+ D01002 3 B01003
+ B01004
+ B01005
+ D01003 3 B01011
+ B01012
+ B01013
+ D01004 4 B01001
+ B01002
+ B01015
+ B02001
+ D01005 2 001035
+ 001034
+ D01011 3 B04001
+ B04002
+ B04003
+ D01012 2 B04004
+ B04005
+ D01013 3 B04004
+ B04005
+ B04006
+ D01021 2 B05001
+ B06001
+ D01022 3 B05001
+ B06001
+ B07001
+ D01023 2 B05002
+ B06002
+ D01024 3 B05002
+ B06002
+ B07001
+ D01025 3 D01023
+ B04003
+ D01012
+ D01026 7 D01021
+ B04003
+ B04003
+ B04004
+ B04004
+ B04005
+ B04005
+ D01029 3 B01018
+ B02001
+ D01011
+ D01030 4 B01018
+ B02001
+ D01011
+ D01024
+ D01031 5 D01001
+ B02001
+ D01011
+ D01012
+ D01022
+ D01032 5 D01001
+ B02001
+ D01011
+ D01012
+ D01024
+ D01033 5 B01005
+ B02001
+ D01011
+ D01012
+ D01021
+ D01034 5 B01005
+ B02001
+ D01011
+ D01012
+ D01023
+ D01035 7 B01005
+ B01012
+ B01013
+ B02001
+ D01011
+ D01012
+ D01023
+ D01036 5 D01003
+ B02001
+ D01011
+ D01012
+ D01023
+ D01037 6 D01001
+ B02011
+ B02012
+ D01011
+ D01012
+ D01022
+ D01038 6 D01001
+ B02011
+ B02012
+ D01011
+ D01012
+ D01024
+ D01039 6 D01003
+ B02011
+ B02012
+ D01011
+ D01012
+ D01023
+ D01040 6 D01003
+ B02011
+ B02012
+ D01011
+ D01012
+ D01024
+ D01041 5 B01007
+ B02021
+ B02022
+ D01011
+ D01012
+ D01042 2 D01041
+ D01021
+ D01043 5 B01007
+ B02023
+ D01011
+ D01013
+ D01021
+ D01044 5 B01007
+ B02024
+ D01011
+ D01013
+ D01021
+ D01049 5 B02111
+ B02112
+ B21062
+ B21063
+ B21065
+ D01051 6 B01006
+ B02061
+ D01011
+ D01012
+ D01021
+ B08004
+ D01055 7 B01005
+ B02001
+ D01011
+ D01012
+ D01021
+ B01012
+ B01014
+ D01062 2 R01000
+ D01001
+ D01065 8 B01006
+ B01008
+ B02001
+ B02002
+ B02005
+ B02062
+ B02070
+ B02065
+ D01066 6 D01011
+ D01013
+ D01023
+ B07004
+ B02064
+ B08004
+ D01070 3 B02143
+ B02142
+ B02144
+ D01071 5 B01007
+ B01031
+ B02020
+ B02028
+ B02029
+ D01072 4 D01071
+ D01011
+ D01013
+ D01021
+ D01074 4 B02143
+ B02142
+ B02145
+ B02146
+ D01075 6 D01001
+ B01015
+ D01024
+ B08021
+ D01011
+ D01012
+ D01076 3 B02011
+ B02143
+ B02142
+ D01090 6 D01004
+ D01011
+ D01012
+ D01021
+ B07030
+ B07031
+ D01091 10 B02180
+ B02181
+ B02182
+ B02183
+ B02184
+ B02179
+ B02186
+ B02187
+ B02188
+ B02189
+ D01092 9 B01011
+ B01003
+ B02001
+ D01011
+ D01012
+ D01021
+ B07030
+ B07031
+ B33024
+ D01093 3 D01036
+ B07030
+ B07031
+ D01110 5 D01001
+ B01011
+ B02011
+ B02014
+ B02003
+ D01111 6 D01001
+ B01011
+ B02011
+ B02013
+ B02014
+ B02003
+ D01112 5 B01006
+ B02011
+ B02013
+ B02014
+ B02003
+ D01113 3 B08021
+ D01011
+ D01013
+ D01114 5 D01021
+ B07030
+ B07031
+ B07007
+ B33024
+ D01193 5 001007
+ 001031
+ 002196
+ 002221
+ 002222
+ D01250 4 D01193
+ D01011
+ D01013
+ D01021
+ D02001 4 B10004
+ B10051
+ B10061
+ B10063
+ D02002 5 B10004
+ B07004
+ B10003
+ B10061
+ B10063
+ D02003 9 B11011
+ B11012
+ B12004
+ B12006
+ B13003
+ B20001
+ B20003
+ B20004
+ B20005
+ D02004 7 B20010
+ B08002
+ B20011
+ B20013
+ B20012
+ B20012
+ B20012
+ D02005 4 B08002
+ B20011
+ B20012
+ B20013
+ D02006 4 B10004
+ B10051
+ B10062
+ B10063
+ D02011 3 D02001
+ D02003
+ D02004
+ D02012 3 D02002
+ D02003
+ D02004
+ D02013 4 D02006
+ D02003
+ R01000
+ D02005
+ D02021 3 B22001
+ B22011
+ B22021
+ D02022 3 B22002
+ B22012
+ B22022
+ D02023 3 B22003
+ B22013
+ B22023
+ D02024 3 D02022
+ R01002
+ D02023
+ D02031 4 D02001
+ B10062
+ B07004
+ B10009
+ D02032 4 B07032
+ B12101
+ B12103
+ B13003
+ D02033 2 B07032
+ B20001
+ D02034 2 B07032
+ B13023
+ D02035 7 D02032
+ D02033
+ D02034
+ B07032
+ D02004
+ R01000
+ D02005
+ D02036 6 R05000
+ B08002
+ B20011
+ B20012
+ B20014
+ B20017
+ D02037 3 B20062
+ B13013
+ B12113
+ D02038 4 B20003
+ B04024
+ B20004
+ B20005
+ D02039 2 B04024
+ B14031
+ D02040 4 B07032
+ R02002
+ B04024
+ B13011
+ D02041 7 B07032
+ B04024
+ B04024
+ B12111
+ B04024
+ B04024
+ B12112
+ D02042 11 B07032
+ B02002
+ B08021
+ B04025
+ B11001
+ B11002
+ B08021
+ R03002
+ B04025
+ B11043
+ B11041
+ D02043 7 D02038
+ R01002
+ D02039
+ D02040
+ D02041
+ D02042
+ B07032
+ D02044 3 B04024
+ B02004
+ B13033
+ D02045 7 B04024
+ B14002
+ B14004
+ B14016
+ B14028
+ B14029
+ B14030
+ D02046 3 B04024
+ B04024
+ B12049
+ D02047 3 R02003
+ B08002
+ B20054
+ D02043 7 D02038
+ R01002
+ D02039
+ D02040
+ D02041
+ D02042
+ B07032
+ D02048 5 B05021
+ B07021
+ B20012
+ B05021
+ B07021
+ D02049 7 B08002
+ B20011
+ B20013
+ B20012
+ B20012
+ B20012
+ B08002
+ D02051 12 B10004
+ B10051
+ B07004
+ B10003
+ B12004
+ B12051
+ B12016
+ B12017
+ B13004
+ R02004
+ B08051
+ B08020
+ D02052 7 B07032
+ B07033
+ B12101
+ B02039
+ B12102
+ B12103
+ B13003
+ D02053 3 B07032
+ B07033
+ B20001
+ D02054 8 D02052
+ D02053
+ B07033
+ D02034
+ B07032
+ D02004
+ R01000
+ 302005
+ D02055 8 B20031
+ B20032
+ B20033
+ B20034
+ B20035
+ B20036
+ B20037
+ B20038
+ D02056 2 B02038
+ B22043
+ D02057 3 D02056
+ D02021
+ D02024
+ D02058 8 B07032
+ B07033
+ B04024
+ B04024
+ B12111
+ B04024
+ B04024
+ B12112
+ D02059 12 B07032
+ B07033
+ B02002
+ B08021
+ B04025
+ B11001
+ B11002
+ B08021
+ R03002
+ B04025
+ B11043
+ B11041
+ D02060 4 D02038
+ D02040
+ D02058
+ D02059
+ D02062 18 D02001
+ D02052
+ D02053
+ 007033
+ R01000
+ D02034
+ 007032
+ R01000
+ D02005
+ 008002
+ R01000
+ D02055
+ R01000
+ D02056
+ R01000
+ D02021
+ R01000
+ D02024
+ D02063 6 D02038
+ R01000
+ D02040
+ R01000
+ D02058
+ D02059
+ D02066 16 B20023
+ B20024
+ B20027
+ B20054
+ B20023
+ B20027
+ B20054
+ B20025
+ B20026
+ B20027
+ B20040
+ B20066
+ B20027
+ B20021
+ B20067
+ B20027
+ D02069 4 B07032
+ B07033
+ B33041
+ B20001
+ D02070 8 B07032
+ B07033
+ B11001
+ B11002
+ B11043
+ B11041
+ B11016
+ B11017
+ D02071 14 B07032
+ B07033
+ B08021
+ B04025
+ B11001
+ B11002
+ B08021
+ R03002
+ B04025
+ B11043
+ B11041
+ B04025
+ B11016
+ B11017
+ D02072 5 B07032
+ B07033
+ B12101
+ B12103
+ B13003
+ D02073 7 B20010
+ R05004
+ B08002
+ B20011
+ B20012
+ B33041
+ B20013
+ D02074 4 B20003
+ B04025
+ B20004
+ B20005
+ D02075 5 B08021
+ B04025
+ B13055
+ B13058
+ B08021
+ D02076 7 B02021
+ B20022
+ B26020
+ B20023
+ B20024
+ B20025
+ B20026
+ D02077 12 B07032
+ B07033
+ B04025
+ B12111
+ B12112
+ B07032
+ B04025
+ B12112
+ B02176
+ B20062
+ B02177
+ B13013
+ D02078 4 B02176
+ B20062
+ B02177
+ B13013
+ D02079 5 B07032
+ B02175
+ B02178
+ B04025
+ B13011
+ D02080 3 B02185
+ B04025
+ B13033
+ D02081 2 B04025
+ B14031
+ D02082 7 B04025
+ B14002
+ B14004
+ B14016
+ B14028
+ B14029
+ B14030
+ D02083 8 B04025
+ B08023
+ B10004
+ B11001
+ B11002
+ B12101
+ B13003
+ B08023
+ D03001 3 B07003
+ B11001
+ B11002
+ D03002 3 B07004
+ B11001
+ B11002
+ D03003 4 B07004
+ B10003
+ B12001
+ B12003
+ D03004 6 B07004
+ B10003
+ B12001
+ B12003
+ B11001
+ B11002
+ D03011 4 B07003
+ B08001
+ B11001
+ B11002
+ D03012 4 B07004
+ B08001
+ B11001
+ B11002
+ D03013 7 B07004
+ B08001
+ B10003
+ B12001
+ B13003
+ B11001
+ B11002
+ D03014 7 B07004
+ B08001
+ B10003
+ B12001
+ B12003
+ B11001
+ B11002
+ D03031 6 B07004
+ B08003
+ B07021
+ B07022
+ B08012
+ B12061
+ D03032 2 B20011
+ B20016
+ D03033 2 B20010
+ B20016
+ D03041 8 B02152
+ B02023
+ B07004
+ B11001
+ B11002
+ B02153
+ B02154
+ B12071
+ D03050 7 B04086
+ B08042
+ B07004
+ B05015
+ B06015
+ B11001
+ B11002
+ D03051 7 B04086
+ B08042
+ B07004
+ B05015
+ B06015
+ B11061
+ B11062
+ D03051 7 B04086
+ B08042
+ B07004
+ B05015
+ B06015
+ B11061
+ B11062
+ D03052 7 B04086
+ B08042
+ B07009
+ B05015
+ B06015
+ B11001
+ B11002
+ D03053 7 B04086
+ B08042
+ B07009
+ B05015
+ B06015
+ B11061
+ B11062
+ D03054 10 B04086
+ B08042
+ B07004
+ B10009
+ B05015
+ B06015
+ B12101
+ B12103
+ B11001
+ B11002
+ D03250 8 B02252
+ B02023
+ B07004
+ B11001
+ B11002
+ B02197
+ B02198
+ B12193
+ D04001 5 B08003
+ B10004
+ B12001
+ B11001
+ B11002
+ D04002 4 B08003
+ B10004
+ B11001
+ B11002
+ D04003 2 B08003
+ B12001
+ D04004 4 B08003
+ B10004
+ B20010
+ B12001
+ D04005 4 B02024
+ B07004
+ B07004
+ B13003
+ D04006 3 B14001
+ B14001
+ B14003
+ D04011 27 B02163
+ B02164
+ B08012
+ B07024
+ B02057
+ B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B08021
+ B04024
+ R10004
+ B08021
+ B04004
+ B04005
+ B04006
+ B08021
+ B04004
+ B04005
+ B04006
+ B11001
+ B11002
+ R03010
+ B02163
+ B07004
+ B12001
+ D04030 3 B27031
+ B28031
+ B10031
+ D04031 3 B01041
+ B01042
+ B01043
+ D04032 5 B02153
+ B02154
+ B20081
+ B20082
+ B20012
+ D04033 8 B02152
+ B02166
+ B02167
+ B02153
+ B02154
+ B12075
+ B12076
+ B12063
+ D04034 9 R02004
+ B27001
+ B28001
+ B07022
+ B05043
+ B20010
+ B20016
+ B33003
+ B10040
+ D04250 27 B02231
+ B02232
+ B08012
+ B07024
+ B02057
+ B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B08021
+ B04024
+ R10004
+ B08021
+ B04004
+ B04005
+ B04006
+ B08021
+ B04004
+ B04005
+ B04006
+ B11001
+ B11002
+ R03010
+ B02231
+ B07004
+ B12001
+ D05001 4 B11001
+ B11002
+ B13060
+ B13071
+ D05002 11 D01012
+ B12001
+ B13003
+ B14051
+ B13060
+ B13072
+ B13080
+ B13081
+ B13082
+ B13083
+ B13084
+ D05003 4 D01012
+ B04065
+ R01000
+ D05001
+ D05004 3 D01030
+ D05002
+ D05003
+ D05006 8 B13072
+ B13082
+ B13019
+ C07005
+ C01004
+ B12001
+ B13073
+ B13060
+ D05007 5 D01029
+ D01012
+ B04065
+ R01000
+ D05006
+ D05008 4 D05006
+ C07005
+ C01004
+ B12030
+ D05009 5 D01029
+ D01012
+ B04065
+ R01000
+ D05008
+ D05010 3 D05008
+ B02091
+ B02091
+ D05011 5 D01029
+ D01012
+ B04065
+ R01000
+ D05010
+ D05016 7 B14021
+ B07004
+ B13003
+ B11002
+ B11001
+ B11041
+ B11043
+ D05017 5 B13080
+ B13081
+ B13083
+ B13085
+ B13084
+ D05018 7 D01029
+ D01012
+ B04065
+ R03000
+ D05008
+ D05016
+ D05017
+ D06001 4 B02032
+ R02000
+ B07062
+ B22042
+ D06002 3 B02031
+ B22004
+ B22031
+ D06003 4 B02002
+ B11011
+ B11012
+ B12004
+ D06004 6 B02032
+ B02033
+ R03000
+ B07062
+ B22043
+ B22062
+ D06005 5 B02031
+ R03000
+ B07062
+ B22004
+ B22031
+ D06006 3 D06003
+ D06002
+ B22063
+ D06007 6 B01012
+ B01014
+ D06008
+ B04024
+ B27003
+ B28003
+ D06008 3 B02034
+ B02035
+ B02036
+ D06019 9 B01075
+ D01011
+ D01012
+ B22042
+ B22120
+ B22121
+ C01002
+ B04015
+ B04065
+ D06020 8 B01075
+ D01011
+ D01012
+ B22042
+ B22120
+ B22121
+ B04075
+ B04065
+ D06021 7 B01075
+ D01011
+ D01012
+ B22122
+ B22123
+ B12001
+ D03002
+ D06022 5 B01075
+ D01011
+ D01012
+ B22038
+ B22039
+ D06023 8 B01015
+ D01023
+ D01011
+ D01012
+ B22038
+ B22039
+ B22120
+ B22121
+ D06024 4 D06020
+ R02000
+ B22038
+ B22039
+ D06025 4 D06019
+ R02006
+ B22038
+ B22039
+ D07001 2 D01031
+ D02011
+ D07002 2 D01032
+ D02011
+ D07003 3 D07001
+ R01000
+ D02005
+ D07004 3 D07002
+ R01000
+ D02005
+ D07005 3 D07001
+ R01004
+ D02005
+ D07006 3 D07002
+ R01004
+ D02005
+ D07007 2 D01031
+ D02012
+ D07008 2 D01032
+ D02012
+ D07009 2 D01031
+ D02013
+ D07011 16 B01063
+ B02001
+ D01011
+ D01012
+ D01024
+ B07006
+ B11001
+ B11016
+ B11017
+ B11002
+ B11041
+ B07006
+ B12001
+ B12003
+ B10052
+ B20009
+ D07012 4 R03000
+ B08023
+ B05021
+ B20001
+ D07013 7 R06000
+ B01064
+ B08014
+ B20061
+ B08014
+ B20061
+ B20018
+ D07014 2 R01000
+ B20019
+ D07015 3 R01000
+ D02005
+ B20002
+ D07016 2 R01000
+ B20020
+ D07017 2 R01000
+ B11070
+ D07018 13 B08016
+ R02000
+ B08017
+ D01012
+ R04000
+ B07006
+ B11001
+ B11002
+ B11041
+ B20009
+ R01000
+ B20001
+ D07014
+ D07020 3 D07011
+ D07014
+ D07016
+ D07021 9 D07011
+ D07012
+ D07013
+ D07014
+ D07015
+ D07016
+ D07017
+ D07018
+ D07015
+ D07030 2 B15001
+ B15002
+ D07031 7 B08022
+ B08023
+ B15001
+ B08023
+ B15001
+ B08023
+ B15002
+ D07041 7 D01001
+ B01015
+ D01024
+ D01011
+ D01012
+ D01070
+ D07030
+ D07042 9 D01001
+ B01015
+ D01024
+ D01011
+ D01012
+ B08021
+ B04025
+ D01070
+ D07031
+ D07043 7 D01001
+ B01015
+ D01024
+ D01011
+ D01012
+ D01074
+ D07030
+ D07044 9 D01001
+ B01015
+ D01024
+ D01011
+ D01012
+ B08021
+ B04025
+ D01074
+ D07031
+ D07060 2 B07061
+ B12030
+ D07061 3 D01031
+ R01005
+ D07060
+ D07062 3 D01032
+ R01005
+ D07060
+ D07063 2 B07061
+ B12130
+ D07080 13 D01090 CREX template for synoptic reports
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07081 24 D01090 CREX template for synoptic reports RA I
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ B12122
+ B13056
+ B13057
+ B20101
+ B20102
+ B20103
+ B20104
+ B20105
+ B20106
+ B20107
+ B20108
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07082 15 D01090 CREX template for synoptic reports RA II
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ B12121
+ B12122
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07083 14 D01090 CREX template for synoptic reports RA III
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ B12122
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07084 16 D01090 CREX template for synoptic reports RA IV
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ B20055
+ R01000
+ C05001
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07086 11 D01090 CREX template for synoptic reports RA VI
+ D02031
+ D02035
+ D02036
+ B08002
+ D02037
+ D02066
+ D02043
+ D02044
+ R01002
+ D02045
+ D07090 13 D01092 CREX template for synoptic reports from mobile land stations
+ D02031
+ D02035
+ D02036
+ D02047
+ 008002
+ D02048
+ D02037
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D08001 3 D01033
+ D02011
+ B22042
+ D08002 3 D01034
+ D02011
+ B22042
+ D08003 3 D01035
+ D02011
+ B22042
+ D08004 3 D01036
+ D02011
+ B22042
+ D08005 2 D08004
+ D02024
+ D08006 8 B10004
+ B10061
+ B10063
+ B11001
+ B11002
+ B12004
+ B13003
+ B22042
+ D08007 4 D01055
+ D02011
+ B07062
+ B22042
+ D08008 3 D01093
+ D02062
+ D02063
+ D08009 7 D01093
+ D02001
+ D02054
+ B08002
+ D02055
+ D02057
+ D02060
+ D08010 15 B01011
+ R13000
+ D01011
+ D01012
+ D01021
+ B04080
+ B22049
+ B04080
+ B22059
+ B04080
+ B22005
+ B02042
+ B22032
+ B02042
+ B04080
+ D09001 3 D01037
+ R01000
+ D03011
+ D09002 3 D01038
+ R01000
+ D03011
+ D09003 3 D01037
+ R01000
+ D03012
+ D09004 3 D01038
+ R01000
+ D03012
+ D09005 4 D01037
+ D02004
+ R01000
+ D03013
+ D09006 4 D01038
+ D02004
+ R01000
+ D03013
+ D09007 4 D01037
+ D02004
+ R01000
+ D03014
+ D09008 4 D01038
+ D02004
+ R01000
+ D03014
+ D09011 3 D01039
+ R01000
+ D03011
+ D09012 3 D01039
+ R01000
+ D03012
+ D09013 4 D01039
+ D02004
+ R01000
+ D03013
+ D09014 4 D01039
+ D02004
+ R01000
+ D03014
+ D09015 3 D01040
+ R01000
+ D03011
+ D09016 3 D01040
+ R01000
+ D03012
+ D09017 4 D01040
+ D02004
+ R01000
+ D03013
+ D09018 4 D01040
+ D02004
+ R01000
+ D03014
+ D09019 4 D01031
+ B02003
+ R01000
+ D03011
+ D09020 7 D01031
+ B02003
+ R04000
+ B07003
+ B11003
+ B11004
+ B11005
+ D09030 7 B15004
+ B15005
+ R04000
+ B04015
+ B08006
+ B07004
+ B15003
+ D09040 3 D01075
+ D01076
+ D09030
+ D09041 4 D07041
+ D01075
+ D01076
+ D09030
+ D09042 4 D07042
+ D01075
+ D01076
+ D09030
+ D09044 4 D07044
+ D01075
+ D01076
+ D09030
+ D09050 7 D01110
+ D01113
+ D01114
+ R01000
+ D03050
+ R01000
+ D03051
+ D09051 7 D01110
+ D01113
+ D01114
+ R01000
+ D03052
+ R01000
+ D03053
+ D09052 9 D01111
+ D01113
+ D01114
+ D02049
+ B22043
+ R01000
+ D03054
+ R01000
+ D03051
+ D09053 7 D01112
+ D01113
+ D01114
+ R01000
+ D03054
+ R01000
+ D03051
+ D10001 5 D01042
+ D03031
+ D03032
+ R01026
+ D03025
+ D10002 5 D01042
+ D03031
+ D03032
+ R01009
+ D03023
+ D10003 5 D01042
+ D03031
+ D03032
+ R01006
+ D03023
+ D10004 5 D01042
+ D03031
+ D03032
+ R01003
+ D03024
+ D10005 5 D01042
+ D03031
+ D03033
+ R01000
+ D03025
+ D10006 5 D01042
+ D03031
+ D03033
+ R01000
+ D03023
+ D10007 5 D01042
+ D03031
+ D03033
+ R01000
+ D03024
+ D10008 8 D10011
+ R01019
+ D10012
+ B02150
+ B25079
+ B25080
+ B33032
+ B14045
+ D10009 3 D10011
+ R01015
+ D10012
+ D10010 3 D10011
+ R01005
+ D10012
+ D10014 3 D01072
+ D03041
+ D04011
+ D10015 13 D01072
+ B07024
+ B10002
+ D03041
+ R01003
+ D04032
+ B02152
+ B02024
+ B07004
+ B07004
+ B13003
+ R01003
+ D04033
+ D10016 13 D01072
+ B07024
+ B10002
+ D03041
+ R01012
+ D04032
+ B02152
+ B02024
+ B07004
+ B07004
+ B13003
+ R01012
+ D04033
+ D10020 6 D10022
+ D01011
+ D01013
+ D01021
+ D04034
+ D10021
+ D10022 4 B01007
+ B02019
+ B01033
+ B02172
+ D10023 17 D01072
+ B30021
+ B30022
+ B08012
+ B07024
+ B07025
+ B10002
+ R01012
+ D04032
+ R05002
+ B02152
+ B02024
+ B07004
+ B07004
+ B13003
+ R01012
+ D04033
+ D10050 13 D10051
+ D10052
+ R01000
+ D10053
+ R01004
+ D10054
+ B20010
+ D10052
+ R01015
+ D10053
+ D10052
+ R01004
+ D10053
+ D10195 3 D01250
+ D03250
+ D04250
+ D11001 9 D01051
+ B07002
+ B12001
+ B11001
+ B11002
+ B11031
+ B11032
+ B11033
+ B20041
+ D11002 4 D01065
+ D01066
+ D11003
+ D11004
+ D11003 5 B10070
+ B11001
+ B11002
+ B12001
+ B13002
+ D11004 12 R01000
+ B11034
+ R01000
+ B11035
+ R01000
+ B11075
+ R01000
+ B11076
+ R01000
+ B33025
+ R01000
+ B33026
+ D11005 13 B01008
+ B01023
+ D01021
+ D01011
+ D01013
+ B07010
+ B08009
+ B11001
+ B11002
+ B11031
+ B11036
+ B12101
+ B33025
+ D11006 6 B07010
+ B11001
+ B11002
+ B02064
+ B12101
+ B12103
+ D11193 16 D01197
+ D01011
+ D01012
+ D01023
+ B08004
+ B07004
+ B08021
+ B11001
+ B11002
+ B11031
+ B11034
+ B11035
+ B12001
+ B12003
+ B13003
+ B20041
+ D12001 2 D01043
+ D04001
+ D12002 2 D01043
+ D04002
+ D12003 2 D01042
+ D04003
+ D12004 2 D01042
+ D04004
+ D12005 2 D01042
+ B20014
+ D12006 2 D01044
+ D04005
+ D12007 2 D01042
+ D04006
+ D12010 6 B01007
+ B05040
+ B02021
+ B05041
+ B04001
+ B04043
+ D12014 8 D12010
+ D12011
+ R05056
+ D01023
+ B05042
+ B05052
+ D12012
+ D12013
+ D12016 3 D12010
+ D12011
+ D12015
+ D12018 3 D12010
+ D12011
+ D12017
+ D12020 11 D01047
+ D01048
+ B15015
+ B29002
+ B21076
+ R04012
+ B06030
+ R02012
+ B05030
+ B21075
+ B21066
+ D12021 6 D01047
+ R01003
+ D01049
+ B11012
+ B11011
+ B21067
+ D12022 15 D01047
+ B08022
+ B11012
+ B11050
+ B22070
+ B22026
+ D12041
+ B10050
+ B21068
+ B21071
+ B21072
+ B21073
+ D12042
+ B21062
+ B15011
+ D12023 7 D01047
+ R03003
+ B08022
+ B12061
+ B22050
+ B21069
+ B21085
+ D12024 11 D12020
+ B08060
+ B08022
+ B08060
+ B08022
+ B25014
+ B22101
+ B22097
+ B22098
+ B22099
+ B22100
+ D12025 11 D12019
+ B08060
+ B08022
+ B08060
+ B08022
+ B25014
+ B22101
+ B22097
+ B22098
+ B22099
+ B22100
+ D12026 19 D01046
+ D01011
+ D01013
+ D01023
+ D12031
+ R01004
+ D12030
+ B21110
+ D01023
+ D21027
+ B21111
+ D01023
+ D21027
+ B21112
+ D01023
+ D21027
+ B21113
+ D01023
+ D21027
+ D12027 9 D01047
+ R05009
+ D01023
+ B07021
+ B12061
+ B07021
+ B12061
+ B21085
+ B21070
+ D12031 8 B05034
+ B06034
+ B21109
+ B11081
+ B11082
+ B21101
+ B21102
+ B21103
+ D12032 4 B21120
+ B21121
+ B13055
+ B21122
+ D12033 4 B02104
+ B08022
+ B12063
+ B12065
+ D12042 6 B21077
+ B21078
+ B21079
+ B21080
+ B21081
+ B21082
+ D12045 21 B01007
+ B02019
+ B01096
+ B25061
+ B05040
+ D01011
+ D01013
+ D01021
+ B07002
+ B12180
+ B12181
+ B12182
+ B12183
+ B12184
+ B12185
+ B02174
+ B21086
+ B12186
+ B21087
+ B12187
+ B33043
+ D13009 3 B21001
+ R01000
+ B21001
+ D13010 3 B21036
+ R01000
+ B21036
+ D13031 4 B06002
+ B06012
+ R01000
+ B30001
+ D13032 4 B05002
+ B05012
+ R01000
+ D13031
+ D13041 9 B06002
+ R10000
+ R04000
+ B06012
+ R01000
+ B30001
+ B06012
+ R01000
+ B30001
+ D13042 4 B05002
+ B05012
+ R01000
+ D13041
+ D13043 11 B06002
+ B05002
+ B05012
+ R12000
+ R10000
+ R04000
+ B06012
+ R01000
+ B30001
+ R01000
+ B30001
+ D15001 5 B01011
+ D01011
+ D01012
+ D01023
+ D06001
+ D15002 5 B01011
+ D01011
+ D01012
+ D01023
+ D06004
+ D16001 10 D01011
+ B04004
+ D01023
+ B01021
+ B02041
+ B19001
+ B10051
+ B19002
+ B19003
+ B19004
+ D16002 15 B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B04005
+ B01033
+ B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B04005
+ B07002
+ B07002
+ D16003 10 R09000
+ B08011
+ B08007
+ R04000
+ B05002
+ B06002
+ B10002
+ B11002
+ B08007
+ B08011
+ D16004 11 R10000
+ B08011
+ B08007
+ B07002
+ B07002
+ R02000
+ B05002
+ B06002
+ B11031
+ B08007
+ B08011
+ D16005 9 R08000
+ B08005
+ B08007
+ B05002
+ B06002
+ B01026
+ B19001
+ B08007
+ B08005
+ D16006 12 R11000
+ B08011
+ B08007
+ B07002
+ B07002
+ R02000
+ B05002
+ B06002
+ B20011
+ B20012
+ B08007
+ B08011
+ D16007 10 R09000
+ B08011
+ B08007
+ R04000
+ B05002
+ B06002
+ B19005
+ B19006
+ B08007
+ B08011
+ D16008 11 R10000
+ B08001
+ B08007
+ B08023
+ R03000
+ B05002
+ B06002
+ B10002
+ B08023
+ B08007
+ B08001
+ D16009 11 R10000
+ B08011
+ B08007
+ B07002
+ B07002
+ R02000
+ B05002
+ B06002
+ B20041
+ B08007
+ B08011
+ D16010 8 R07000
+ B08011
+ B08007
+ B01022
+ B05002
+ B06002
+ B08007
+ B08011
+ D16011 17 R16000
+ B08011
+ B01022
+ B08007
+ R02000
+ B05002
+ B06002
+ B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B04005
+ B20090
+ B08021
+ B08007
+ B08011
+ D16020 5 B01023
+ B01025
+ B01027
+ D01011
+ D01012
+ D16021 23 D01023
+ B02041
+ B19001
+ B19007
+ B19005
+ B19006
+ B19008
+ B08005
+ B10004
+ B08005
+ B10004
+ B19007
+ B08005
+ B08021
+ B04075
+ B11040
+ B19007
+ R05004
+ B05021
+ B05021
+ R02002
+ B19003
+ B19004
+ D16022 23 B01032
+ B02041
+ B19001
+ B19010
+ R18000
+ B08021
+ B04014
+ B08005
+ D01023
+ B19005
+ B19006
+ B10004
+ B11041
+ B08021
+ B04075
+ B11040
+ B19008
+ R05004
+ B05021
+ B05021
+ R02002
+ B19003
+ B19004
+ D16026 2 D16020
+ D16021
+ D16050 16 D01001
+ D01011
+ D01012
+ 002160
+ 008005
+ 005002
+ 006002
+ 008005
+ 019100
+ 019005
+ 019006
+ 019101
+ 019102
+ 019103
+ 019104
+ 019105
+ D16052 28 D01005
+ D01011
+ D01012
+ 001007
+ 025150
+ R22000
+ 001027
+ 019150
+ 019106
+ 008005
+ 005002
+ 006002
+ 008005
+ 019107
+ 019005
+ 019006
+ 019108
+ 019109
+ 019110
+ 019111
+ 019112
+ 019113
+ 019114
+ 019115
+ 019116
+ 019117
+ 019118
+ 019119
+ D18001 2 D01025
+ B24011
+ D18003 4 D01026
+ B24005
+ B24004
+ B24021
+ D18004 6 D01025
+ B04023
+ B13011
+ B24005
+ B24004
+ B24022
+ D21001 6 B02101
+ B02114
+ B02105
+ B02106
+ B02107
+ B02121
+ D21003 4 B21051
+ B21014
+ B21017
+ B21030
+ D21004 4 D01031
+ B02003
+ R01000
+ D21003
+ D21005 12 B25004
+ B02121
+ B02122
+ B02123
+ B02124
+ B02125
+ B02126
+ B02127
+ B02128
+ B02129
+ B02130
+ B02131
+ D21006 4 B25001
+ B25002
+ B25003
+ B25005
+ D21007 8 B25009
+ B25010
+ B25011
+ B25012
+ B25013
+ B25015
+ B25016
+ B25017
+ D21008 3 B25006
+ B25007
+ B25008
+ D21009 2 B25018
+ B25019
+ D21010 13 B02101
+ B07002
+ B02102
+ B02103
+ B02104
+ B02105
+ B02106
+ B02107
+ B02108
+ B02109
+ B02110
+ B02132
+ B02133
+ D21011 3 B30031
+ B30032
+ B29002
+ D21012 2 R01000
+ B02135
+ D35001 4 B08035
+ B35001
+ B08036
+ D01001
+ D35002 4 B08035
+ B35001
+ B08036
+ B01033
+ D35003 6 B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B04073
+ D35004 7 B08021
+ B04004
+ B08021
+ B04004
+ B35000
+ D01001
+ B35011
+ D35005 7 B08021
+ B04004
+ B08021
+ B04004
+ B35000
+ B01001
+ B35011
+ D35006 7 B08021
+ B04004
+ B08021
+ B04004
+ B35000
+ B01003
+ B35011
+ D35007 9 B08021
+ B04004
+ B08021
+ B04004
+ B35000
+ B01001
+ R02000
+ B01002
+ B35011
+ D35010 3 D35002
+ D35003
+ D35007
diff --git a/crextables/D000103 b/crextables/D000103
new file mode 100755
index 0000000..c0c0921
--- /dev/null
+++ b/crextables/D000103
@@ -0,0 +1,2128 @@
+ D00002 2 B00002
+ B00003
+ D00003 3 B00010
+ B00011
+ B00012
+ D00004 9 D00003
+ B00013
+ B00014
+ B00015
+ B00016
+ B00017
+ B00018
+ B00019
+ B00020
+ D00010 3 D00003
+ R01000
+ B00030
+ D01001 2 B01001
+ B01002
+ D01002 3 B01003
+ B01004
+ B01005
+ D01003 3 B01011
+ B01012
+ B01013
+ D01004 4 B01001
+ B01002
+ B01015
+ B02001
+ D01005 2 001035
+ 001034
+ D01011 3 B04001
+ B04002
+ B04003
+ D01012 2 B04004
+ B04005
+ D01013 3 B04004
+ B04005
+ B04006
+ D01021 2 B05001
+ B06001
+ D01022 3 B05001
+ B06001
+ B07001
+ D01023 2 B05002
+ B06002
+ D01024 3 B05002
+ B06002
+ B07001
+ D01025 3 D01023
+ B04003
+ D01012
+ D01026 7 D01021
+ B04003
+ B04003
+ B04004
+ B04004
+ B04005
+ B04005
+ D01029 3 B01018
+ B02001
+ D01011
+ D01030 4 B01018
+ B02001
+ D01011
+ D01024
+ D01031 5 D01001
+ B02001
+ D01011
+ D01012
+ D01022
+ D01032 5 D01001
+ B02001
+ D01011
+ D01012
+ D01024
+ D01033 5 B01005
+ B02001
+ D01011
+ D01012
+ D01021
+ D01034 5 B01005
+ B02001
+ D01011
+ D01012
+ D01023
+ D01035 7 B01005
+ B01012
+ B01013
+ B02001
+ D01011
+ D01012
+ D01023
+ D01036 5 D01003
+ B02001
+ D01011
+ D01012
+ D01023
+ D01037 6 D01001
+ B02011
+ B02012
+ D01011
+ D01012
+ D01022
+ D01038 6 D01001
+ B02011
+ B02012
+ D01011
+ D01012
+ D01024
+ D01039 6 D01003
+ B02011
+ B02012
+ D01011
+ D01012
+ D01023
+ D01040 6 D01003
+ B02011
+ B02012
+ D01011
+ D01012
+ D01024
+ D01041 5 B01007
+ B02021
+ B02022
+ D01011
+ D01012
+ D01042 2 D01041
+ D01021
+ D01043 5 B01007
+ B02023
+ D01011
+ D01013
+ D01021
+ D01044 5 B01007
+ B02024
+ D01011
+ D01013
+ D01021
+ D01049 5 B02111
+ B02112
+ B21062
+ B21063
+ B21065
+ D01051 6 B01006
+ B02061
+ D01011
+ D01012
+ D01021
+ B08004
+ D01055 7 B01005
+ B02001
+ D01011
+ D01012
+ D01021
+ B01012
+ B01014
+ D01062 2 R01000
+ D01001
+ D01065 8 B01006
+ B01008
+ B02001
+ B02002
+ B02005
+ B02062
+ B02070
+ B02065
+ D01066 6 D01011
+ D01013
+ D01023
+ B07004
+ B02064
+ B08004
+ D01070 3 B02143
+ B02142
+ B02144
+ D01071 5 B01007
+ B01031
+ B02020
+ B02028
+ B02029
+ D01072 4 D01071
+ D01011
+ D01013
+ D01021
+ D01074 4 B02143
+ B02142
+ B02145
+ B02146
+ D01075 6 D01001
+ B01015
+ D01024
+ B08021
+ D01011
+ D01012
+ D01076 3 B02011
+ B02143
+ B02142
+ D01090 6 D01004
+ D01011
+ D01012
+ D01021
+ B07030
+ B07031
+ D01091 10 B02180
+ B02181
+ B02182
+ B02183
+ B02184
+ B02179
+ B02186
+ B02187
+ B02188
+ B02189
+ D01092 9 B01011
+ B01003
+ B02001
+ D01011
+ D01012
+ D01021
+ B07030
+ B07031
+ B33024
+ D01093 3 D01036
+ B07030
+ B07031
+ D01110 5 D01001
+ B01011
+ B02011
+ B02014
+ B02003
+ D01111 6 D01001
+ B01011
+ B02011
+ B02013
+ B02014
+ B02003
+ D01112 5 B01006
+ B02011
+ B02013
+ B02014
+ B02003
+ D01113 3 B08021
+ D01011
+ D01013
+ D01114 5 D01021
+ B07030
+ B07031
+ B07007
+ B33024
+ D01193 5 001007
+ 001031
+ 002196
+ 002221
+ 002222
+ D01250 4 D01193
+ D01011
+ D01013
+ D01021
+ D02001 4 B10004
+ B10051
+ B10061
+ B10063
+ D02002 5 B10004
+ B07004
+ B10003
+ B10061
+ B10063
+ D02003 9 B11011
+ B11012
+ B12004
+ B12006
+ B13003
+ B20001
+ B20003
+ B20004
+ B20005
+ D02004 7 B20010
+ B08002
+ B20011
+ B20013
+ B20012
+ B20012
+ B20012
+ D02005 4 B08002
+ B20011
+ B20012
+ B20013
+ D02006 4 B10004
+ B10051
+ B10062
+ B10063
+ D02011 3 D02001
+ D02003
+ D02004
+ D02012 3 D02002
+ D02003
+ D02004
+ D02013 4 D02006
+ D02003
+ R01000
+ D02005
+ D02021 3 B22001
+ B22011
+ B22021
+ D02022 3 B22002
+ B22012
+ B22022
+ D02023 3 B22003
+ B22013
+ B22023
+ D02024 3 D02022
+ R01002
+ D02023
+ D02031 4 D02001
+ B10062
+ B07004
+ B10009
+ D02032 4 B07032
+ B12101
+ B12103
+ B13003
+ D02033 2 B07032
+ B20001
+ D02034 2 B07032
+ B13023
+ D02035 7 D02032
+ D02033
+ D02034
+ B07032
+ D02004
+ R01000
+ D02005
+ D02036 6 R05000
+ B08002
+ B20011
+ B20012
+ B20014
+ B20017
+ D02037 3 B20062
+ B13013
+ B12113
+ D02038 4 B20003
+ B04024
+ B20004
+ B20005
+ D02039 2 B04024
+ B14031
+ D02040 4 B07032
+ R02002
+ B04024
+ B13011
+ D02041 7 B07032
+ B04024
+ B04024
+ B12111
+ B04024
+ B04024
+ B12112
+ D02042 11 B07032
+ B02002
+ B08021
+ B04025
+ B11001
+ B11002
+ B08021
+ R03002
+ B04025
+ B11043
+ B11041
+ D02043 7 D02038
+ R01002
+ D02039
+ D02040
+ D02041
+ D02042
+ B07032
+ D02044 3 B04024
+ B02004
+ B13033
+ D02045 7 B04024
+ B14002
+ B14004
+ B14016
+ B14028
+ B14029
+ B14030
+ D02046 3 B04024
+ B04024
+ B12049
+ D02047 3 R02003
+ B08002
+ B20054
+ D02043 7 D02038
+ R01002
+ D02039
+ D02040
+ D02041
+ D02042
+ B07032
+ D02048 5 B05021
+ B07021
+ B20012
+ B05021
+ B07021
+ D02049 7 B08002
+ B20011
+ B20013
+ B20012
+ B20012
+ B20012
+ B08002
+ D02051 12 B10004
+ B10051
+ B07004
+ B10003
+ B12004
+ B12051
+ B12016
+ B12017
+ B13004
+ R02004
+ B08051
+ B08020
+ D02052 7 B07032
+ B07033
+ B12101
+ B02039
+ B12102
+ B12103
+ B13003
+ D02053 3 B07032
+ B07033
+ B20001
+ D02054 8 D02052
+ D02053
+ B07033
+ D02034
+ B07032
+ D02004
+ R01000
+ 302005
+ D02055 8 B20031
+ B20032
+ B20033
+ B20034
+ B20035
+ B20036
+ B20037
+ B20038
+ D02056 2 B02038
+ B22043
+ D02057 3 D02056
+ D02021
+ D02024
+ D02058 8 B07032
+ B07033
+ B04024
+ B04024
+ B12111
+ B04024
+ B04024
+ B12112
+ D02059 12 B07032
+ B07033
+ B02002
+ B08021
+ B04025
+ B11001
+ B11002
+ B08021
+ R03002
+ B04025
+ B11043
+ B11041
+ D02060 4 D02038
+ D02040
+ D02058
+ D02059
+ D02062 18 D02001
+ D02052
+ D02053
+ 007033
+ R01000
+ D02034
+ 007032
+ R01000
+ D02005
+ 008002
+ R01000
+ D02055
+ R01000
+ D02056
+ R01000
+ D02021
+ R01000
+ D02024
+ D02063 6 D02038
+ R01000
+ D02040
+ R01000
+ D02058
+ D02059
+ D02066 16 B20023
+ B20024
+ B20027
+ B20054
+ B20023
+ B20027
+ B20054
+ B20025
+ B20026
+ B20027
+ B20040
+ B20066
+ B20027
+ B20021
+ B20067
+ B20027
+ D02069 4 B07032
+ B07033
+ B33041
+ B20001
+ D02070 8 B07032
+ B07033
+ B11001
+ B11002
+ B11043
+ B11041
+ B11016
+ B11017
+ D02071 14 B07032
+ B07033
+ B08021
+ B04025
+ B11001
+ B11002
+ B08021
+ R03002
+ B04025
+ B11043
+ B11041
+ B04025
+ B11016
+ B11017
+ D02072 5 B07032
+ B07033
+ B12101
+ B12103
+ B13003
+ D02073 7 B20010
+ R05004
+ B08002
+ B20011
+ B20012
+ B33041
+ B20013
+ D02074 4 B20003
+ B04025
+ B20004
+ B20005
+ D02075 5 B08021
+ B04025
+ B13055
+ B13058
+ B08021
+ D02076 7 B02021
+ B20022
+ B26020
+ B20023
+ B20024
+ B20025
+ B20026
+ D02077 12 B07032
+ B07033
+ B04025
+ B12111
+ B12112
+ B07032
+ B04025
+ B12112
+ B02176
+ B20062
+ B02177
+ B13013
+ D02078 4 B02176
+ B20062
+ B02177
+ B13013
+ D02079 5 B07032
+ B02175
+ B02178
+ B04025
+ B13011
+ D02080 3 B02185
+ B04025
+ B13033
+ D02081 2 B04025
+ B14031
+ D02082 7 B04025
+ B14002
+ B14004
+ B14016
+ B14028
+ B14029
+ B14030
+ D02083 8 B04025
+ B08023
+ B10004
+ B11001
+ B11002
+ B12101
+ B13003
+ B08023
+ D03001 3 B07003
+ B11001
+ B11002
+ D03002 3 B07004
+ B11001
+ B11002
+ D03003 4 B07004
+ B10003
+ B12001
+ B12003
+ D03004 6 B07004
+ B10003
+ B12001
+ B12003
+ B11001
+ B11002
+ D03011 4 B07003
+ B08001
+ B11001
+ B11002
+ D03012 4 B07004
+ B08001
+ B11001
+ B11002
+ D03013 7 B07004
+ B08001
+ B10003
+ B12001
+ B13003
+ B11001
+ B11002
+ D03014 7 B07004
+ B08001
+ B10003
+ B12001
+ B12003
+ B11001
+ B11002
+ D03031 6 B07004
+ B08003
+ B07021
+ B07022
+ B08012
+ B12061
+ D03032 2 B20011
+ B20016
+ D03033 2 B20010
+ B20016
+ D03041 8 B02152
+ B02023
+ B07004
+ B11001
+ B11002
+ B02153
+ B02154
+ B12071
+ D03050 7 B04086
+ B08042
+ B07004
+ B05015
+ B06015
+ B11001
+ B11002
+ D03051 7 B04086
+ B08042
+ B07004
+ B05015
+ B06015
+ B11061
+ B11062
+ D03051 7 B04086
+ B08042
+ B07004
+ B05015
+ B06015
+ B11061
+ B11062
+ D03052 7 B04086
+ B08042
+ B07009
+ B05015
+ B06015
+ B11001
+ B11002
+ D03053 7 B04086
+ B08042
+ B07009
+ B05015
+ B06015
+ B11061
+ B11062
+ D03054 10 B04086
+ B08042
+ B07004
+ B10009
+ B05015
+ B06015
+ B12101
+ B12103
+ B11001
+ B11002
+ D03250 8 B02252
+ B02023
+ B07004
+ B11001
+ B11002
+ B02197
+ B02198
+ B12193
+ D04001 5 B08003
+ B10004
+ B12001
+ B11001
+ B11002
+ D04002 4 B08003
+ B10004
+ B11001
+ B11002
+ D04003 2 B08003
+ B12001
+ D04004 4 B08003
+ B10004
+ B20010
+ B12001
+ D04005 4 B02024
+ B07004
+ B07004
+ B13003
+ D04006 3 B14001
+ B14001
+ B14003
+ D04011 27 B02163
+ B02164
+ B08012
+ B07024
+ B02057
+ B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B08021
+ B04024
+ R10004
+ B08021
+ B04004
+ B04005
+ B04006
+ B08021
+ B04004
+ B04005
+ B04006
+ B11001
+ B11002
+ R03010
+ B02163
+ B07004
+ B12001
+ D04030 3 B27031
+ B28031
+ B10031
+ D04031 3 B01041
+ B01042
+ B01043
+ D04032 5 B02153
+ B02154
+ B20081
+ B20082
+ B20012
+ D04033 8 B02152
+ B02166
+ B02167
+ B02153
+ B02154
+ B12075
+ B12076
+ B12063
+ D04034 9 R02004
+ B27001
+ B28001
+ B07022
+ B05043
+ B20010
+ B20016
+ B33003
+ B10040
+ D04250 27 B02231
+ B02232
+ B08012
+ B07024
+ B02057
+ B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B08021
+ B04024
+ R10004
+ B08021
+ B04004
+ B04005
+ B04006
+ B08021
+ B04004
+ B04005
+ B04006
+ B11001
+ B11002
+ R03010
+ B02231
+ B07004
+ B12001
+ D05001 4 B11001
+ B11002
+ B13060
+ B13071
+ D05002 11 D01012
+ B12001
+ B13003
+ B14051
+ B13060
+ B13072
+ B13080
+ B13081
+ B13082
+ B13083
+ B13084
+ D05003 4 D01012
+ B04065
+ R01000
+ D05001
+ D05004 3 D01030
+ D05002
+ D05003
+ D05006 8 B13072
+ B13082
+ B13019
+ C07005
+ C01004
+ B12001
+ B13073
+ B13060
+ D05007 5 D01029
+ D01012
+ B04065
+ R01000
+ D05006
+ D05008 4 D05006
+ C07005
+ C01004
+ B12030
+ D05009 5 D01029
+ D01012
+ B04065
+ R01000
+ D05008
+ D05010 3 D05008
+ B02091
+ B02091
+ D05011 5 D01029
+ D01012
+ B04065
+ R01000
+ D05010
+ D05016 7 B14021
+ B07004
+ B13003
+ B11002
+ B11001
+ B11041
+ B11043
+ D05017 5 B13080
+ B13081
+ B13083
+ B13085
+ B13084
+ D05018 7 D01029
+ D01012
+ B04065
+ R03000
+ D05008
+ D05016
+ D05017
+ D06001 4 B02032
+ R02000
+ B07062
+ B22042
+ D06002 3 B02031
+ B22004
+ B22031
+ D06003 4 B02002
+ B11011
+ B11012
+ B12004
+ D06004 6 B02032
+ B02033
+ R03000
+ B07062
+ B22043
+ B22062
+ D06005 5 B02031
+ R03000
+ B07062
+ B22004
+ B22031
+ D06006 3 D06003
+ D06002
+ B22063
+ D06007 6 B01012
+ B01014
+ D06008
+ B04024
+ B27003
+ B28003
+ D06008 3 B02034
+ B02035
+ B02036
+ D06019 9 B01075
+ D01011
+ D01012
+ B22042
+ B22120
+ B22121
+ C01002
+ B04015
+ B04065
+ D06020 8 B01075
+ D01011
+ D01012
+ B22042
+ B22120
+ B22121
+ B04075
+ B04065
+ D06021 7 B01075
+ D01011
+ D01012
+ B22122
+ B22123
+ B12001
+ D03002
+ D06022 5 B01075
+ D01011
+ D01012
+ B22038
+ B22039
+ D06023 8 B01015
+ D01023
+ D01011
+ D01012
+ B22038
+ B22039
+ B22120
+ B22121
+ D06024 4 D06020
+ R02000
+ B22038
+ B22039
+ D06025 4 D06019
+ R02006
+ B22038
+ B22039
+ D07001 2 D01031
+ D02011
+ D07002 2 D01032
+ D02011
+ D07003 3 D07001
+ R01000
+ D02005
+ D07004 3 D07002
+ R01000
+ D02005
+ D07005 3 D07001
+ R01004
+ D02005
+ D07006 3 D07002
+ R01004
+ D02005
+ D07007 2 D01031
+ D02012
+ D07008 2 D01032
+ D02012
+ D07009 2 D01031
+ D02013
+ D07011 16 B01063
+ B02001
+ D01011
+ D01012
+ D01024
+ B07006
+ B11001
+ B11016
+ B11017
+ B11002
+ B11041
+ B07006
+ B12001
+ B12003
+ B10052
+ B20009
+ D07012 4 R03000
+ B08023
+ B05021
+ B20001
+ D07013 7 R06000
+ B01064
+ B08014
+ B20061
+ B08014
+ B20061
+ B20018
+ D07014 2 R01000
+ B20019
+ D07015 3 R01000
+ D02005
+ B20002
+ D07016 2 R01000
+ B20020
+ D07017 2 R01000
+ B11070
+ D07018 13 B08016
+ R02000
+ B08017
+ D01012
+ R04000
+ B07006
+ B11001
+ B11002
+ B11041
+ B20009
+ R01000
+ B20001
+ D07014
+ D07020 3 D07011
+ D07014
+ D07016
+ D07021 9 D07011
+ D07012
+ D07013
+ D07014
+ D07015
+ D07016
+ D07017
+ D07018
+ D07015
+ D07030 2 B15001
+ B15002
+ D07031 7 B08022
+ B08023
+ B15001
+ B08023
+ B15001
+ B08023
+ B15002
+ D07041 7 D01001
+ B01015
+ D01024
+ D01011
+ D01012
+ D01070
+ D07030
+ D07042 9 D01001
+ B01015
+ D01024
+ D01011
+ D01012
+ B08021
+ B04025
+ D01070
+ D07031
+ D07043 7 D01001
+ B01015
+ D01024
+ D01011
+ D01012
+ D01074
+ D07030
+ D07044 9 D01001
+ B01015
+ D01024
+ D01011
+ D01012
+ B08021
+ B04025
+ D01074
+ D07031
+ D07060 2 B07061
+ B12030
+ D07061 3 D01031
+ R01005
+ D07060
+ D07062 3 D01032
+ R01005
+ D07060
+ D07063 2 B07061
+ B12130
+ D07080 13 D01090 CREX template for synoptic reports
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07081 24 D01090 CREX template for synoptic reports RA I
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ B12122
+ B13056
+ B13057
+ B20101
+ B20102
+ B20103
+ B20104
+ B20105
+ B20106
+ B20107
+ B20108
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07082 15 D01090 CREX template for synoptic reports RA II
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ B12121
+ B12122
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07083 14 D01090 CREX template for synoptic reports RA III
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ B12122
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07084 16 D01090 CREX template for synoptic reports RA IV
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ B20055
+ R01000
+ C05001
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07086 11 D01090 CREX template for synoptic reports RA VI
+ D02031
+ D02035
+ D02036
+ B08002
+ D02037
+ D02066
+ D02043
+ D02044
+ R01002
+ D02045
+ D07090 13 D01092 CREX template for synoptic reports from mobile land stations
+ D02031
+ D02035
+ D02036
+ D02047
+ 008002
+ D02048
+ D02037
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D08001 3 D01033
+ D02011
+ B22042
+ D08002 3 D01034
+ D02011
+ B22042
+ D08003 3 D01035
+ D02011
+ B22042
+ D08004 3 D01036
+ D02011
+ B22042
+ D08005 2 D08004
+ D02024
+ D08006 8 B10004
+ B10061
+ B10063
+ B11001
+ B11002
+ B12004
+ B13003
+ B22042
+ D08007 4 D01055
+ D02011
+ B07062
+ B22042
+ D08008 3 D01093
+ D02062
+ D02063
+ D08009 7 D01093
+ D02001
+ D02054
+ B08002
+ D02055
+ D02057
+ D02060
+ D08010 15 B01011
+ R13000
+ D01011
+ D01012
+ D01021
+ B04080
+ B22049
+ B04080
+ B22059
+ B04080
+ B22005
+ B02042
+ B22032
+ B02042
+ B04080
+ D09001 3 D01037
+ R01000
+ D03011
+ D09002 3 D01038
+ R01000
+ D03011
+ D09003 3 D01037
+ R01000
+ D03012
+ D09004 3 D01038
+ R01000
+ D03012
+ D09005 4 D01037
+ D02004
+ R01000
+ D03013
+ D09006 4 D01038
+ D02004
+ R01000
+ D03013
+ D09007 4 D01037
+ D02004
+ R01000
+ D03014
+ D09008 4 D01038
+ D02004
+ R01000
+ D03014
+ D09011 3 D01039
+ R01000
+ D03011
+ D09012 3 D01039
+ R01000
+ D03012
+ D09013 4 D01039
+ D02004
+ R01000
+ D03013
+ D09014 4 D01039
+ D02004
+ R01000
+ D03014
+ D09015 3 D01040
+ R01000
+ D03011
+ D09016 3 D01040
+ R01000
+ D03012
+ D09017 4 D01040
+ D02004
+ R01000
+ D03013
+ D09018 4 D01040
+ D02004
+ R01000
+ D03014
+ D09019 4 D01031
+ B02003
+ R01000
+ D03011
+ D09020 7 D01031
+ B02003
+ R04000
+ B07003
+ B11003
+ B11004
+ B11005
+ D09030 7 B15004
+ B15005
+ R04000
+ B04015
+ B08006
+ B07004
+ B15003
+ D09040 3 D01075
+ D01076
+ D09030
+ D09041 4 D07041
+ D01075
+ D01076
+ D09030
+ D09042 4 D07042
+ D01075
+ D01076
+ D09030
+ D09044 4 D07044
+ D01075
+ D01076
+ D09030
+ D09050 7 D01110
+ D01113
+ D01114
+ R01000
+ D03050
+ R01000
+ D03051
+ D09051 7 D01110
+ D01113
+ D01114
+ R01000
+ D03052
+ R01000
+ D03053
+ D09052 9 D01111
+ D01113
+ D01114
+ D02049
+ B22043
+ R01000
+ D03054
+ R01000
+ D03051
+ D09053 7 D01112
+ D01113
+ D01114
+ R01000
+ D03054
+ R01000
+ D03051
+ D10001 5 D01042
+ D03031
+ D03032
+ R01026
+ D03025
+ D10002 5 D01042
+ D03031
+ D03032
+ R01009
+ D03023
+ D10003 5 D01042
+ D03031
+ D03032
+ R01006
+ D03023
+ D10004 5 D01042
+ D03031
+ D03032
+ R01003
+ D03024
+ D10005 5 D01042
+ D03031
+ D03033
+ R01000
+ D03025
+ D10006 5 D01042
+ D03031
+ D03033
+ R01000
+ D03023
+ D10007 5 D01042
+ D03031
+ D03033
+ R01000
+ D03024
+ D10008 8 D10011
+ R01019
+ D10012
+ B02150
+ B25079
+ B25080
+ B33032
+ B14045
+ D10009 3 D10011
+ R01015
+ D10012
+ D10010 3 D10011
+ R01005
+ D10012
+ D10014 3 D01072
+ D03041
+ D04011
+ D10015 13 D01072
+ B07024
+ B10002
+ D03041
+ R01003
+ D04032
+ B02152
+ B02024
+ B07004
+ B07004
+ B13003
+ R01003
+ D04033
+ D10016 13 D01072
+ B07024
+ B10002
+ D03041
+ R01012
+ D04032
+ B02152
+ B02024
+ B07004
+ B07004
+ B13003
+ R01012
+ D04033
+ D10020 6 D10022
+ D01011
+ D01013
+ D01021
+ D04034
+ D10021
+ D10022 4 B01007
+ B02019
+ B01033
+ B02172
+ D10023 17 D01072
+ B30021
+ B30022
+ B08012
+ B07024
+ B07025
+ B10002
+ R01012
+ D04032
+ R05002
+ B02152
+ B02024
+ B07004
+ B07004
+ B13003
+ R01012
+ D04033
+ D10050 13 D10051
+ D10052
+ R01000
+ D10053
+ R01004
+ D10054
+ B20010
+ D10052
+ R01015
+ D10053
+ D10052
+ R01004
+ D10053
+ D10195 3 D01250
+ D03250
+ D04250
+ D11001 9 D01051
+ B07002
+ B12001
+ B11001
+ B11002
+ B11031
+ B11032
+ B11033
+ B20041
+ D11002 4 D01065
+ D01066
+ D11003
+ D11004
+ D11003 5 B10070
+ B11001
+ B11002
+ B12001
+ B13002
+ D11004 12 R01000
+ B11034
+ R01000
+ B11035
+ R01000
+ B11075
+ R01000
+ B11076
+ R01000
+ B33025
+ R01000
+ B33026
+ D11005 13 B01008
+ B01023
+ D01021
+ D01011
+ D01013
+ B07010
+ B08009
+ B11001
+ B11002
+ B11031
+ B11036
+ B12101
+ B33025
+ D11006 6 B07010
+ B11001
+ B11002
+ B02064
+ B12101
+ B12103
+ D11193 16 D01197
+ D01011
+ D01012
+ D01023
+ B08004
+ B07004
+ B08021
+ B11001
+ B11002
+ B11031
+ B11034
+ B11035
+ B12001
+ B12003
+ B13003
+ B20041
+ D12001 2 D01043
+ D04001
+ D12002 2 D01043
+ D04002
+ D12003 2 D01042
+ D04003
+ D12004 2 D01042
+ D04004
+ D12005 2 D01042
+ B20014
+ D12006 2 D01044
+ D04005
+ D12007 2 D01042
+ D04006
+ D12010 6 B01007
+ B05040
+ B02021
+ B05041
+ B04001
+ B04043
+ D12014 8 D12010
+ D12011
+ R05056
+ D01023
+ B05042
+ B05052
+ D12012
+ D12013
+ D12016 3 D12010
+ D12011
+ D12015
+ D12018 3 D12010
+ D12011
+ D12017
+ D12020 11 D01047
+ D01048
+ B15015
+ B29002
+ B21076
+ R04012
+ B06030
+ R02012
+ B05030
+ B21075
+ B21066
+ D12021 6 D01047
+ R01003
+ D01049
+ B11012
+ B11011
+ B21067
+ D12022 15 D01047
+ B08022
+ B11012
+ B11050
+ B22070
+ B22026
+ D12041
+ B10050
+ B21068
+ B21071
+ B21072
+ B21073
+ D12042
+ B21062
+ B15011
+ D12023 7 D01047
+ R03003
+ B08022
+ B12061
+ B22050
+ B21069
+ B21085
+ D12024 11 D12020
+ B08060
+ B08022
+ B08060
+ B08022
+ B25014
+ B22101
+ B22097
+ B22098
+ B22099
+ B22100
+ D12025 11 D12019
+ B08060
+ B08022
+ B08060
+ B08022
+ B25014
+ B22101
+ B22097
+ B22098
+ B22099
+ B22100
+ D12026 19 D01046
+ D01011
+ D01013
+ D01023
+ D12031
+ R01004
+ D12030
+ B21110
+ D01023
+ D21027
+ B21111
+ D01023
+ D21027
+ B21112
+ D01023
+ D21027
+ B21113
+ D01023
+ D21027
+ D12027 9 D01047
+ R05009
+ D01023
+ B07021
+ B12061
+ B07021
+ B12061
+ B21085
+ B21070
+ D12031 8 B05034
+ B06034
+ B21109
+ B11081
+ B11082
+ B21101
+ B21102
+ B21103
+ D12032 4 B21120
+ B21121
+ B13055
+ B21122
+ D12033 4 B02104
+ B08022
+ B12063
+ B12065
+ D12042 6 B21077
+ B21078
+ B21079
+ B21080
+ B21081
+ B21082
+ D12045 21 B01007
+ B02019
+ B01096
+ B25061
+ B05040
+ D01011
+ D01013
+ D01021
+ B07002
+ B12180
+ B12181
+ B12182
+ B12183
+ B12184
+ B12185
+ B02174
+ B21086
+ B12186
+ B21087
+ B12187
+ B33043
+ D13009 3 B21001
+ R01000
+ B21001
+ D13010 3 B21036
+ R01000
+ B21036
+ D13031 4 B06002
+ B06012
+ R01000
+ B30001
+ D13032 4 B05002
+ B05012
+ R01000
+ D13031
+ D13041 9 B06002
+ R10000
+ R04000
+ B06012
+ R01000
+ B30001
+ B06012
+ R01000
+ B30001
+ D13042 4 B05002
+ B05012
+ R01000
+ D13041
+ D13043 11 B06002
+ B05002
+ B05012
+ R12000
+ R10000
+ R04000
+ B06012
+ R01000
+ B30001
+ R01000
+ B30001
+ D15001 5 B01011
+ D01011
+ D01012
+ D01023
+ D06001
+ D15002 5 B01011
+ D01011
+ D01012
+ D01023
+ D06004
+ D16001 10 D01011
+ B04004
+ D01023
+ B01021
+ B02041
+ B19001
+ B10051
+ B19002
+ B19003
+ B19004
+ D16002 15 B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B04005
+ B01033
+ B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B04005
+ B07002
+ B07002
+ D16003 10 R09000
+ B08011
+ B08007
+ R04000
+ B05002
+ B06002
+ B10002
+ B11002
+ B08007
+ B08011
+ D16004 11 R10000
+ B08011
+ B08007
+ B07002
+ B07002
+ R02000
+ B05002
+ B06002
+ B11031
+ B08007
+ B08011
+ D16005 9 R08000
+ B08005
+ B08007
+ B05002
+ B06002
+ B01026
+ B19001
+ B08007
+ B08005
+ D16006 12 R11000
+ B08011
+ B08007
+ B07002
+ B07002
+ R02000
+ B05002
+ B06002
+ B20011
+ B20012
+ B08007
+ B08011
+ D16007 10 R09000
+ B08011
+ B08007
+ R04000
+ B05002
+ B06002
+ B19005
+ B19006
+ B08007
+ B08011
+ D16008 11 R10000
+ B08001
+ B08007
+ B08023
+ R03000
+ B05002
+ B06002
+ B10002
+ B08023
+ B08007
+ B08001
+ D16009 11 R10000
+ B08011
+ B08007
+ B07002
+ B07002
+ R02000
+ B05002
+ B06002
+ B20041
+ B08007
+ B08011
+ D16010 8 R07000
+ B08011
+ B08007
+ B01022
+ B05002
+ B06002
+ B08007
+ B08011
+ D16011 17 R16000
+ B08011
+ B01022
+ B08007
+ R02000
+ B05002
+ B06002
+ B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B04005
+ B20090
+ B08021
+ B08007
+ B08011
+ D16020 5 B01023
+ B01025
+ B01027
+ D01011
+ D01012
+ D16021 23 D01023
+ B02041
+ B19001
+ B19007
+ B19005
+ B19006
+ B19008
+ B08005
+ B10004
+ B08005
+ B10004
+ B19007
+ B08005
+ B08021
+ B04075
+ B11040
+ B19007
+ R05004
+ B05021
+ B05021
+ R02002
+ B19003
+ B19004
+ D16022 23 B01032
+ B02041
+ B19001
+ B19010
+ R18000
+ B08021
+ B04014
+ B08005
+ D01023
+ B19005
+ B19006
+ B10004
+ B11041
+ B08021
+ B04075
+ B11040
+ B19008
+ R05004
+ B05021
+ B05021
+ R02002
+ B19003
+ B19004
+ D16026 2 D16020
+ D16021
+ D16050 16 D01001
+ D01011
+ D01012
+ 002160
+ 008005
+ 005002
+ 006002
+ 008005
+ 019100
+ 019005
+ 019006
+ 019101
+ 019102
+ 019103
+ 019104
+ 019105
+ D16052 28 D01005
+ D01011
+ D01012
+ 001007
+ 025150
+ R22000
+ 001027
+ 019150
+ 019106
+ 008005
+ 005002
+ 006002
+ 008005
+ 019107
+ 019005
+ 019006
+ 019108
+ 019109
+ 019110
+ 019111
+ 019112
+ 019113
+ 019114
+ 019115
+ 019116
+ 019117
+ 019118
+ 019119
+ D18001 2 D01025
+ B24011
+ D18003 4 D01026
+ B24005
+ B24004
+ B24021
+ D18004 6 D01025
+ B04023
+ B13011
+ B24005
+ B24004
+ B24022
+ D21001 6 B02101
+ B02114
+ B02105
+ B02106
+ B02107
+ B02121
+ D21003 4 B21051
+ B21014
+ B21017
+ B21030
+ D21004 4 D01031
+ B02003
+ R01000
+ D21003
+ D21005 12 B25004
+ B02121
+ B02122
+ B02123
+ B02124
+ B02125
+ B02126
+ B02127
+ B02128
+ B02129
+ B02130
+ B02131
+ D21006 4 B25001
+ B25002
+ B25003
+ B25005
+ D21007 8 B25009
+ B25010
+ B25011
+ B25012
+ B25013
+ B25015
+ B25016
+ B25017
+ D21008 3 B25006
+ B25007
+ B25008
+ D21009 2 B25018
+ B25019
+ D21010 13 B02101
+ B07002
+ B02102
+ B02103
+ B02104
+ B02105
+ B02106
+ B02107
+ B02108
+ B02109
+ B02110
+ B02132
+ B02133
+ D21011 3 B30031
+ B30032
+ B29002
+ D21012 2 R01000
+ B02135
+ D35001 4 B08035
+ B35001
+ B08036
+ D01001
+ D35002 4 B08035
+ B35001
+ B08036
+ B01033
+ D35003 6 B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B04073
+ D35004 7 B08021
+ B04004
+ B08021
+ B04004
+ B35000
+ D01001
+ B35011
+ D35005 7 B08021
+ B04004
+ B08021
+ B04004
+ B35000
+ B01001
+ B35011
+ D35006 7 B08021
+ B04004
+ B08021
+ B04004
+ B35000
+ B01003
+ B35011
+ D35007 9 B08021
+ B04004
+ B08021
+ B04004
+ B35000
+ B01001
+ R02000
+ B01002
+ B35011
+ D35010 3 D35002
+ D35003
+ D35007
diff --git a/crextables/D000203 b/crextables/D000203
new file mode 100755
index 0000000..c0c0921
--- /dev/null
+++ b/crextables/D000203
@@ -0,0 +1,2128 @@
+ D00002 2 B00002
+ B00003
+ D00003 3 B00010
+ B00011
+ B00012
+ D00004 9 D00003
+ B00013
+ B00014
+ B00015
+ B00016
+ B00017
+ B00018
+ B00019
+ B00020
+ D00010 3 D00003
+ R01000
+ B00030
+ D01001 2 B01001
+ B01002
+ D01002 3 B01003
+ B01004
+ B01005
+ D01003 3 B01011
+ B01012
+ B01013
+ D01004 4 B01001
+ B01002
+ B01015
+ B02001
+ D01005 2 001035
+ 001034
+ D01011 3 B04001
+ B04002
+ B04003
+ D01012 2 B04004
+ B04005
+ D01013 3 B04004
+ B04005
+ B04006
+ D01021 2 B05001
+ B06001
+ D01022 3 B05001
+ B06001
+ B07001
+ D01023 2 B05002
+ B06002
+ D01024 3 B05002
+ B06002
+ B07001
+ D01025 3 D01023
+ B04003
+ D01012
+ D01026 7 D01021
+ B04003
+ B04003
+ B04004
+ B04004
+ B04005
+ B04005
+ D01029 3 B01018
+ B02001
+ D01011
+ D01030 4 B01018
+ B02001
+ D01011
+ D01024
+ D01031 5 D01001
+ B02001
+ D01011
+ D01012
+ D01022
+ D01032 5 D01001
+ B02001
+ D01011
+ D01012
+ D01024
+ D01033 5 B01005
+ B02001
+ D01011
+ D01012
+ D01021
+ D01034 5 B01005
+ B02001
+ D01011
+ D01012
+ D01023
+ D01035 7 B01005
+ B01012
+ B01013
+ B02001
+ D01011
+ D01012
+ D01023
+ D01036 5 D01003
+ B02001
+ D01011
+ D01012
+ D01023
+ D01037 6 D01001
+ B02011
+ B02012
+ D01011
+ D01012
+ D01022
+ D01038 6 D01001
+ B02011
+ B02012
+ D01011
+ D01012
+ D01024
+ D01039 6 D01003
+ B02011
+ B02012
+ D01011
+ D01012
+ D01023
+ D01040 6 D01003
+ B02011
+ B02012
+ D01011
+ D01012
+ D01024
+ D01041 5 B01007
+ B02021
+ B02022
+ D01011
+ D01012
+ D01042 2 D01041
+ D01021
+ D01043 5 B01007
+ B02023
+ D01011
+ D01013
+ D01021
+ D01044 5 B01007
+ B02024
+ D01011
+ D01013
+ D01021
+ D01049 5 B02111
+ B02112
+ B21062
+ B21063
+ B21065
+ D01051 6 B01006
+ B02061
+ D01011
+ D01012
+ D01021
+ B08004
+ D01055 7 B01005
+ B02001
+ D01011
+ D01012
+ D01021
+ B01012
+ B01014
+ D01062 2 R01000
+ D01001
+ D01065 8 B01006
+ B01008
+ B02001
+ B02002
+ B02005
+ B02062
+ B02070
+ B02065
+ D01066 6 D01011
+ D01013
+ D01023
+ B07004
+ B02064
+ B08004
+ D01070 3 B02143
+ B02142
+ B02144
+ D01071 5 B01007
+ B01031
+ B02020
+ B02028
+ B02029
+ D01072 4 D01071
+ D01011
+ D01013
+ D01021
+ D01074 4 B02143
+ B02142
+ B02145
+ B02146
+ D01075 6 D01001
+ B01015
+ D01024
+ B08021
+ D01011
+ D01012
+ D01076 3 B02011
+ B02143
+ B02142
+ D01090 6 D01004
+ D01011
+ D01012
+ D01021
+ B07030
+ B07031
+ D01091 10 B02180
+ B02181
+ B02182
+ B02183
+ B02184
+ B02179
+ B02186
+ B02187
+ B02188
+ B02189
+ D01092 9 B01011
+ B01003
+ B02001
+ D01011
+ D01012
+ D01021
+ B07030
+ B07031
+ B33024
+ D01093 3 D01036
+ B07030
+ B07031
+ D01110 5 D01001
+ B01011
+ B02011
+ B02014
+ B02003
+ D01111 6 D01001
+ B01011
+ B02011
+ B02013
+ B02014
+ B02003
+ D01112 5 B01006
+ B02011
+ B02013
+ B02014
+ B02003
+ D01113 3 B08021
+ D01011
+ D01013
+ D01114 5 D01021
+ B07030
+ B07031
+ B07007
+ B33024
+ D01193 5 001007
+ 001031
+ 002196
+ 002221
+ 002222
+ D01250 4 D01193
+ D01011
+ D01013
+ D01021
+ D02001 4 B10004
+ B10051
+ B10061
+ B10063
+ D02002 5 B10004
+ B07004
+ B10003
+ B10061
+ B10063
+ D02003 9 B11011
+ B11012
+ B12004
+ B12006
+ B13003
+ B20001
+ B20003
+ B20004
+ B20005
+ D02004 7 B20010
+ B08002
+ B20011
+ B20013
+ B20012
+ B20012
+ B20012
+ D02005 4 B08002
+ B20011
+ B20012
+ B20013
+ D02006 4 B10004
+ B10051
+ B10062
+ B10063
+ D02011 3 D02001
+ D02003
+ D02004
+ D02012 3 D02002
+ D02003
+ D02004
+ D02013 4 D02006
+ D02003
+ R01000
+ D02005
+ D02021 3 B22001
+ B22011
+ B22021
+ D02022 3 B22002
+ B22012
+ B22022
+ D02023 3 B22003
+ B22013
+ B22023
+ D02024 3 D02022
+ R01002
+ D02023
+ D02031 4 D02001
+ B10062
+ B07004
+ B10009
+ D02032 4 B07032
+ B12101
+ B12103
+ B13003
+ D02033 2 B07032
+ B20001
+ D02034 2 B07032
+ B13023
+ D02035 7 D02032
+ D02033
+ D02034
+ B07032
+ D02004
+ R01000
+ D02005
+ D02036 6 R05000
+ B08002
+ B20011
+ B20012
+ B20014
+ B20017
+ D02037 3 B20062
+ B13013
+ B12113
+ D02038 4 B20003
+ B04024
+ B20004
+ B20005
+ D02039 2 B04024
+ B14031
+ D02040 4 B07032
+ R02002
+ B04024
+ B13011
+ D02041 7 B07032
+ B04024
+ B04024
+ B12111
+ B04024
+ B04024
+ B12112
+ D02042 11 B07032
+ B02002
+ B08021
+ B04025
+ B11001
+ B11002
+ B08021
+ R03002
+ B04025
+ B11043
+ B11041
+ D02043 7 D02038
+ R01002
+ D02039
+ D02040
+ D02041
+ D02042
+ B07032
+ D02044 3 B04024
+ B02004
+ B13033
+ D02045 7 B04024
+ B14002
+ B14004
+ B14016
+ B14028
+ B14029
+ B14030
+ D02046 3 B04024
+ B04024
+ B12049
+ D02047 3 R02003
+ B08002
+ B20054
+ D02043 7 D02038
+ R01002
+ D02039
+ D02040
+ D02041
+ D02042
+ B07032
+ D02048 5 B05021
+ B07021
+ B20012
+ B05021
+ B07021
+ D02049 7 B08002
+ B20011
+ B20013
+ B20012
+ B20012
+ B20012
+ B08002
+ D02051 12 B10004
+ B10051
+ B07004
+ B10003
+ B12004
+ B12051
+ B12016
+ B12017
+ B13004
+ R02004
+ B08051
+ B08020
+ D02052 7 B07032
+ B07033
+ B12101
+ B02039
+ B12102
+ B12103
+ B13003
+ D02053 3 B07032
+ B07033
+ B20001
+ D02054 8 D02052
+ D02053
+ B07033
+ D02034
+ B07032
+ D02004
+ R01000
+ 302005
+ D02055 8 B20031
+ B20032
+ B20033
+ B20034
+ B20035
+ B20036
+ B20037
+ B20038
+ D02056 2 B02038
+ B22043
+ D02057 3 D02056
+ D02021
+ D02024
+ D02058 8 B07032
+ B07033
+ B04024
+ B04024
+ B12111
+ B04024
+ B04024
+ B12112
+ D02059 12 B07032
+ B07033
+ B02002
+ B08021
+ B04025
+ B11001
+ B11002
+ B08021
+ R03002
+ B04025
+ B11043
+ B11041
+ D02060 4 D02038
+ D02040
+ D02058
+ D02059
+ D02062 18 D02001
+ D02052
+ D02053
+ 007033
+ R01000
+ D02034
+ 007032
+ R01000
+ D02005
+ 008002
+ R01000
+ D02055
+ R01000
+ D02056
+ R01000
+ D02021
+ R01000
+ D02024
+ D02063 6 D02038
+ R01000
+ D02040
+ R01000
+ D02058
+ D02059
+ D02066 16 B20023
+ B20024
+ B20027
+ B20054
+ B20023
+ B20027
+ B20054
+ B20025
+ B20026
+ B20027
+ B20040
+ B20066
+ B20027
+ B20021
+ B20067
+ B20027
+ D02069 4 B07032
+ B07033
+ B33041
+ B20001
+ D02070 8 B07032
+ B07033
+ B11001
+ B11002
+ B11043
+ B11041
+ B11016
+ B11017
+ D02071 14 B07032
+ B07033
+ B08021
+ B04025
+ B11001
+ B11002
+ B08021
+ R03002
+ B04025
+ B11043
+ B11041
+ B04025
+ B11016
+ B11017
+ D02072 5 B07032
+ B07033
+ B12101
+ B12103
+ B13003
+ D02073 7 B20010
+ R05004
+ B08002
+ B20011
+ B20012
+ B33041
+ B20013
+ D02074 4 B20003
+ B04025
+ B20004
+ B20005
+ D02075 5 B08021
+ B04025
+ B13055
+ B13058
+ B08021
+ D02076 7 B02021
+ B20022
+ B26020
+ B20023
+ B20024
+ B20025
+ B20026
+ D02077 12 B07032
+ B07033
+ B04025
+ B12111
+ B12112
+ B07032
+ B04025
+ B12112
+ B02176
+ B20062
+ B02177
+ B13013
+ D02078 4 B02176
+ B20062
+ B02177
+ B13013
+ D02079 5 B07032
+ B02175
+ B02178
+ B04025
+ B13011
+ D02080 3 B02185
+ B04025
+ B13033
+ D02081 2 B04025
+ B14031
+ D02082 7 B04025
+ B14002
+ B14004
+ B14016
+ B14028
+ B14029
+ B14030
+ D02083 8 B04025
+ B08023
+ B10004
+ B11001
+ B11002
+ B12101
+ B13003
+ B08023
+ D03001 3 B07003
+ B11001
+ B11002
+ D03002 3 B07004
+ B11001
+ B11002
+ D03003 4 B07004
+ B10003
+ B12001
+ B12003
+ D03004 6 B07004
+ B10003
+ B12001
+ B12003
+ B11001
+ B11002
+ D03011 4 B07003
+ B08001
+ B11001
+ B11002
+ D03012 4 B07004
+ B08001
+ B11001
+ B11002
+ D03013 7 B07004
+ B08001
+ B10003
+ B12001
+ B13003
+ B11001
+ B11002
+ D03014 7 B07004
+ B08001
+ B10003
+ B12001
+ B12003
+ B11001
+ B11002
+ D03031 6 B07004
+ B08003
+ B07021
+ B07022
+ B08012
+ B12061
+ D03032 2 B20011
+ B20016
+ D03033 2 B20010
+ B20016
+ D03041 8 B02152
+ B02023
+ B07004
+ B11001
+ B11002
+ B02153
+ B02154
+ B12071
+ D03050 7 B04086
+ B08042
+ B07004
+ B05015
+ B06015
+ B11001
+ B11002
+ D03051 7 B04086
+ B08042
+ B07004
+ B05015
+ B06015
+ B11061
+ B11062
+ D03051 7 B04086
+ B08042
+ B07004
+ B05015
+ B06015
+ B11061
+ B11062
+ D03052 7 B04086
+ B08042
+ B07009
+ B05015
+ B06015
+ B11001
+ B11002
+ D03053 7 B04086
+ B08042
+ B07009
+ B05015
+ B06015
+ B11061
+ B11062
+ D03054 10 B04086
+ B08042
+ B07004
+ B10009
+ B05015
+ B06015
+ B12101
+ B12103
+ B11001
+ B11002
+ D03250 8 B02252
+ B02023
+ B07004
+ B11001
+ B11002
+ B02197
+ B02198
+ B12193
+ D04001 5 B08003
+ B10004
+ B12001
+ B11001
+ B11002
+ D04002 4 B08003
+ B10004
+ B11001
+ B11002
+ D04003 2 B08003
+ B12001
+ D04004 4 B08003
+ B10004
+ B20010
+ B12001
+ D04005 4 B02024
+ B07004
+ B07004
+ B13003
+ D04006 3 B14001
+ B14001
+ B14003
+ D04011 27 B02163
+ B02164
+ B08012
+ B07024
+ B02057
+ B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B08021
+ B04024
+ R10004
+ B08021
+ B04004
+ B04005
+ B04006
+ B08021
+ B04004
+ B04005
+ B04006
+ B11001
+ B11002
+ R03010
+ B02163
+ B07004
+ B12001
+ D04030 3 B27031
+ B28031
+ B10031
+ D04031 3 B01041
+ B01042
+ B01043
+ D04032 5 B02153
+ B02154
+ B20081
+ B20082
+ B20012
+ D04033 8 B02152
+ B02166
+ B02167
+ B02153
+ B02154
+ B12075
+ B12076
+ B12063
+ D04034 9 R02004
+ B27001
+ B28001
+ B07022
+ B05043
+ B20010
+ B20016
+ B33003
+ B10040
+ D04250 27 B02231
+ B02232
+ B08012
+ B07024
+ B02057
+ B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B08021
+ B04024
+ R10004
+ B08021
+ B04004
+ B04005
+ B04006
+ B08021
+ B04004
+ B04005
+ B04006
+ B11001
+ B11002
+ R03010
+ B02231
+ B07004
+ B12001
+ D05001 4 B11001
+ B11002
+ B13060
+ B13071
+ D05002 11 D01012
+ B12001
+ B13003
+ B14051
+ B13060
+ B13072
+ B13080
+ B13081
+ B13082
+ B13083
+ B13084
+ D05003 4 D01012
+ B04065
+ R01000
+ D05001
+ D05004 3 D01030
+ D05002
+ D05003
+ D05006 8 B13072
+ B13082
+ B13019
+ C07005
+ C01004
+ B12001
+ B13073
+ B13060
+ D05007 5 D01029
+ D01012
+ B04065
+ R01000
+ D05006
+ D05008 4 D05006
+ C07005
+ C01004
+ B12030
+ D05009 5 D01029
+ D01012
+ B04065
+ R01000
+ D05008
+ D05010 3 D05008
+ B02091
+ B02091
+ D05011 5 D01029
+ D01012
+ B04065
+ R01000
+ D05010
+ D05016 7 B14021
+ B07004
+ B13003
+ B11002
+ B11001
+ B11041
+ B11043
+ D05017 5 B13080
+ B13081
+ B13083
+ B13085
+ B13084
+ D05018 7 D01029
+ D01012
+ B04065
+ R03000
+ D05008
+ D05016
+ D05017
+ D06001 4 B02032
+ R02000
+ B07062
+ B22042
+ D06002 3 B02031
+ B22004
+ B22031
+ D06003 4 B02002
+ B11011
+ B11012
+ B12004
+ D06004 6 B02032
+ B02033
+ R03000
+ B07062
+ B22043
+ B22062
+ D06005 5 B02031
+ R03000
+ B07062
+ B22004
+ B22031
+ D06006 3 D06003
+ D06002
+ B22063
+ D06007 6 B01012
+ B01014
+ D06008
+ B04024
+ B27003
+ B28003
+ D06008 3 B02034
+ B02035
+ B02036
+ D06019 9 B01075
+ D01011
+ D01012
+ B22042
+ B22120
+ B22121
+ C01002
+ B04015
+ B04065
+ D06020 8 B01075
+ D01011
+ D01012
+ B22042
+ B22120
+ B22121
+ B04075
+ B04065
+ D06021 7 B01075
+ D01011
+ D01012
+ B22122
+ B22123
+ B12001
+ D03002
+ D06022 5 B01075
+ D01011
+ D01012
+ B22038
+ B22039
+ D06023 8 B01015
+ D01023
+ D01011
+ D01012
+ B22038
+ B22039
+ B22120
+ B22121
+ D06024 4 D06020
+ R02000
+ B22038
+ B22039
+ D06025 4 D06019
+ R02006
+ B22038
+ B22039
+ D07001 2 D01031
+ D02011
+ D07002 2 D01032
+ D02011
+ D07003 3 D07001
+ R01000
+ D02005
+ D07004 3 D07002
+ R01000
+ D02005
+ D07005 3 D07001
+ R01004
+ D02005
+ D07006 3 D07002
+ R01004
+ D02005
+ D07007 2 D01031
+ D02012
+ D07008 2 D01032
+ D02012
+ D07009 2 D01031
+ D02013
+ D07011 16 B01063
+ B02001
+ D01011
+ D01012
+ D01024
+ B07006
+ B11001
+ B11016
+ B11017
+ B11002
+ B11041
+ B07006
+ B12001
+ B12003
+ B10052
+ B20009
+ D07012 4 R03000
+ B08023
+ B05021
+ B20001
+ D07013 7 R06000
+ B01064
+ B08014
+ B20061
+ B08014
+ B20061
+ B20018
+ D07014 2 R01000
+ B20019
+ D07015 3 R01000
+ D02005
+ B20002
+ D07016 2 R01000
+ B20020
+ D07017 2 R01000
+ B11070
+ D07018 13 B08016
+ R02000
+ B08017
+ D01012
+ R04000
+ B07006
+ B11001
+ B11002
+ B11041
+ B20009
+ R01000
+ B20001
+ D07014
+ D07020 3 D07011
+ D07014
+ D07016
+ D07021 9 D07011
+ D07012
+ D07013
+ D07014
+ D07015
+ D07016
+ D07017
+ D07018
+ D07015
+ D07030 2 B15001
+ B15002
+ D07031 7 B08022
+ B08023
+ B15001
+ B08023
+ B15001
+ B08023
+ B15002
+ D07041 7 D01001
+ B01015
+ D01024
+ D01011
+ D01012
+ D01070
+ D07030
+ D07042 9 D01001
+ B01015
+ D01024
+ D01011
+ D01012
+ B08021
+ B04025
+ D01070
+ D07031
+ D07043 7 D01001
+ B01015
+ D01024
+ D01011
+ D01012
+ D01074
+ D07030
+ D07044 9 D01001
+ B01015
+ D01024
+ D01011
+ D01012
+ B08021
+ B04025
+ D01074
+ D07031
+ D07060 2 B07061
+ B12030
+ D07061 3 D01031
+ R01005
+ D07060
+ D07062 3 D01032
+ R01005
+ D07060
+ D07063 2 B07061
+ B12130
+ D07080 13 D01090 CREX template for synoptic reports
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07081 24 D01090 CREX template for synoptic reports RA I
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ B12122
+ B13056
+ B13057
+ B20101
+ B20102
+ B20103
+ B20104
+ B20105
+ B20106
+ B20107
+ B20108
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07082 15 D01090 CREX template for synoptic reports RA II
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ B12121
+ B12122
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07083 14 D01090 CREX template for synoptic reports RA III
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ B12122
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07084 16 D01090 CREX template for synoptic reports RA IV
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ B20055
+ R01000
+ C05001
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07086 11 D01090 CREX template for synoptic reports RA VI
+ D02031
+ D02035
+ D02036
+ B08002
+ D02037
+ D02066
+ D02043
+ D02044
+ R01002
+ D02045
+ D07090 13 D01092 CREX template for synoptic reports from mobile land stations
+ D02031
+ D02035
+ D02036
+ D02047
+ 008002
+ D02048
+ D02037
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D08001 3 D01033
+ D02011
+ B22042
+ D08002 3 D01034
+ D02011
+ B22042
+ D08003 3 D01035
+ D02011
+ B22042
+ D08004 3 D01036
+ D02011
+ B22042
+ D08005 2 D08004
+ D02024
+ D08006 8 B10004
+ B10061
+ B10063
+ B11001
+ B11002
+ B12004
+ B13003
+ B22042
+ D08007 4 D01055
+ D02011
+ B07062
+ B22042
+ D08008 3 D01093
+ D02062
+ D02063
+ D08009 7 D01093
+ D02001
+ D02054
+ B08002
+ D02055
+ D02057
+ D02060
+ D08010 15 B01011
+ R13000
+ D01011
+ D01012
+ D01021
+ B04080
+ B22049
+ B04080
+ B22059
+ B04080
+ B22005
+ B02042
+ B22032
+ B02042
+ B04080
+ D09001 3 D01037
+ R01000
+ D03011
+ D09002 3 D01038
+ R01000
+ D03011
+ D09003 3 D01037
+ R01000
+ D03012
+ D09004 3 D01038
+ R01000
+ D03012
+ D09005 4 D01037
+ D02004
+ R01000
+ D03013
+ D09006 4 D01038
+ D02004
+ R01000
+ D03013
+ D09007 4 D01037
+ D02004
+ R01000
+ D03014
+ D09008 4 D01038
+ D02004
+ R01000
+ D03014
+ D09011 3 D01039
+ R01000
+ D03011
+ D09012 3 D01039
+ R01000
+ D03012
+ D09013 4 D01039
+ D02004
+ R01000
+ D03013
+ D09014 4 D01039
+ D02004
+ R01000
+ D03014
+ D09015 3 D01040
+ R01000
+ D03011
+ D09016 3 D01040
+ R01000
+ D03012
+ D09017 4 D01040
+ D02004
+ R01000
+ D03013
+ D09018 4 D01040
+ D02004
+ R01000
+ D03014
+ D09019 4 D01031
+ B02003
+ R01000
+ D03011
+ D09020 7 D01031
+ B02003
+ R04000
+ B07003
+ B11003
+ B11004
+ B11005
+ D09030 7 B15004
+ B15005
+ R04000
+ B04015
+ B08006
+ B07004
+ B15003
+ D09040 3 D01075
+ D01076
+ D09030
+ D09041 4 D07041
+ D01075
+ D01076
+ D09030
+ D09042 4 D07042
+ D01075
+ D01076
+ D09030
+ D09044 4 D07044
+ D01075
+ D01076
+ D09030
+ D09050 7 D01110
+ D01113
+ D01114
+ R01000
+ D03050
+ R01000
+ D03051
+ D09051 7 D01110
+ D01113
+ D01114
+ R01000
+ D03052
+ R01000
+ D03053
+ D09052 9 D01111
+ D01113
+ D01114
+ D02049
+ B22043
+ R01000
+ D03054
+ R01000
+ D03051
+ D09053 7 D01112
+ D01113
+ D01114
+ R01000
+ D03054
+ R01000
+ D03051
+ D10001 5 D01042
+ D03031
+ D03032
+ R01026
+ D03025
+ D10002 5 D01042
+ D03031
+ D03032
+ R01009
+ D03023
+ D10003 5 D01042
+ D03031
+ D03032
+ R01006
+ D03023
+ D10004 5 D01042
+ D03031
+ D03032
+ R01003
+ D03024
+ D10005 5 D01042
+ D03031
+ D03033
+ R01000
+ D03025
+ D10006 5 D01042
+ D03031
+ D03033
+ R01000
+ D03023
+ D10007 5 D01042
+ D03031
+ D03033
+ R01000
+ D03024
+ D10008 8 D10011
+ R01019
+ D10012
+ B02150
+ B25079
+ B25080
+ B33032
+ B14045
+ D10009 3 D10011
+ R01015
+ D10012
+ D10010 3 D10011
+ R01005
+ D10012
+ D10014 3 D01072
+ D03041
+ D04011
+ D10015 13 D01072
+ B07024
+ B10002
+ D03041
+ R01003
+ D04032
+ B02152
+ B02024
+ B07004
+ B07004
+ B13003
+ R01003
+ D04033
+ D10016 13 D01072
+ B07024
+ B10002
+ D03041
+ R01012
+ D04032
+ B02152
+ B02024
+ B07004
+ B07004
+ B13003
+ R01012
+ D04033
+ D10020 6 D10022
+ D01011
+ D01013
+ D01021
+ D04034
+ D10021
+ D10022 4 B01007
+ B02019
+ B01033
+ B02172
+ D10023 17 D01072
+ B30021
+ B30022
+ B08012
+ B07024
+ B07025
+ B10002
+ R01012
+ D04032
+ R05002
+ B02152
+ B02024
+ B07004
+ B07004
+ B13003
+ R01012
+ D04033
+ D10050 13 D10051
+ D10052
+ R01000
+ D10053
+ R01004
+ D10054
+ B20010
+ D10052
+ R01015
+ D10053
+ D10052
+ R01004
+ D10053
+ D10195 3 D01250
+ D03250
+ D04250
+ D11001 9 D01051
+ B07002
+ B12001
+ B11001
+ B11002
+ B11031
+ B11032
+ B11033
+ B20041
+ D11002 4 D01065
+ D01066
+ D11003
+ D11004
+ D11003 5 B10070
+ B11001
+ B11002
+ B12001
+ B13002
+ D11004 12 R01000
+ B11034
+ R01000
+ B11035
+ R01000
+ B11075
+ R01000
+ B11076
+ R01000
+ B33025
+ R01000
+ B33026
+ D11005 13 B01008
+ B01023
+ D01021
+ D01011
+ D01013
+ B07010
+ B08009
+ B11001
+ B11002
+ B11031
+ B11036
+ B12101
+ B33025
+ D11006 6 B07010
+ B11001
+ B11002
+ B02064
+ B12101
+ B12103
+ D11193 16 D01197
+ D01011
+ D01012
+ D01023
+ B08004
+ B07004
+ B08021
+ B11001
+ B11002
+ B11031
+ B11034
+ B11035
+ B12001
+ B12003
+ B13003
+ B20041
+ D12001 2 D01043
+ D04001
+ D12002 2 D01043
+ D04002
+ D12003 2 D01042
+ D04003
+ D12004 2 D01042
+ D04004
+ D12005 2 D01042
+ B20014
+ D12006 2 D01044
+ D04005
+ D12007 2 D01042
+ D04006
+ D12010 6 B01007
+ B05040
+ B02021
+ B05041
+ B04001
+ B04043
+ D12014 8 D12010
+ D12011
+ R05056
+ D01023
+ B05042
+ B05052
+ D12012
+ D12013
+ D12016 3 D12010
+ D12011
+ D12015
+ D12018 3 D12010
+ D12011
+ D12017
+ D12020 11 D01047
+ D01048
+ B15015
+ B29002
+ B21076
+ R04012
+ B06030
+ R02012
+ B05030
+ B21075
+ B21066
+ D12021 6 D01047
+ R01003
+ D01049
+ B11012
+ B11011
+ B21067
+ D12022 15 D01047
+ B08022
+ B11012
+ B11050
+ B22070
+ B22026
+ D12041
+ B10050
+ B21068
+ B21071
+ B21072
+ B21073
+ D12042
+ B21062
+ B15011
+ D12023 7 D01047
+ R03003
+ B08022
+ B12061
+ B22050
+ B21069
+ B21085
+ D12024 11 D12020
+ B08060
+ B08022
+ B08060
+ B08022
+ B25014
+ B22101
+ B22097
+ B22098
+ B22099
+ B22100
+ D12025 11 D12019
+ B08060
+ B08022
+ B08060
+ B08022
+ B25014
+ B22101
+ B22097
+ B22098
+ B22099
+ B22100
+ D12026 19 D01046
+ D01011
+ D01013
+ D01023
+ D12031
+ R01004
+ D12030
+ B21110
+ D01023
+ D21027
+ B21111
+ D01023
+ D21027
+ B21112
+ D01023
+ D21027
+ B21113
+ D01023
+ D21027
+ D12027 9 D01047
+ R05009
+ D01023
+ B07021
+ B12061
+ B07021
+ B12061
+ B21085
+ B21070
+ D12031 8 B05034
+ B06034
+ B21109
+ B11081
+ B11082
+ B21101
+ B21102
+ B21103
+ D12032 4 B21120
+ B21121
+ B13055
+ B21122
+ D12033 4 B02104
+ B08022
+ B12063
+ B12065
+ D12042 6 B21077
+ B21078
+ B21079
+ B21080
+ B21081
+ B21082
+ D12045 21 B01007
+ B02019
+ B01096
+ B25061
+ B05040
+ D01011
+ D01013
+ D01021
+ B07002
+ B12180
+ B12181
+ B12182
+ B12183
+ B12184
+ B12185
+ B02174
+ B21086
+ B12186
+ B21087
+ B12187
+ B33043
+ D13009 3 B21001
+ R01000
+ B21001
+ D13010 3 B21036
+ R01000
+ B21036
+ D13031 4 B06002
+ B06012
+ R01000
+ B30001
+ D13032 4 B05002
+ B05012
+ R01000
+ D13031
+ D13041 9 B06002
+ R10000
+ R04000
+ B06012
+ R01000
+ B30001
+ B06012
+ R01000
+ B30001
+ D13042 4 B05002
+ B05012
+ R01000
+ D13041
+ D13043 11 B06002
+ B05002
+ B05012
+ R12000
+ R10000
+ R04000
+ B06012
+ R01000
+ B30001
+ R01000
+ B30001
+ D15001 5 B01011
+ D01011
+ D01012
+ D01023
+ D06001
+ D15002 5 B01011
+ D01011
+ D01012
+ D01023
+ D06004
+ D16001 10 D01011
+ B04004
+ D01023
+ B01021
+ B02041
+ B19001
+ B10051
+ B19002
+ B19003
+ B19004
+ D16002 15 B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B04005
+ B01033
+ B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B04005
+ B07002
+ B07002
+ D16003 10 R09000
+ B08011
+ B08007
+ R04000
+ B05002
+ B06002
+ B10002
+ B11002
+ B08007
+ B08011
+ D16004 11 R10000
+ B08011
+ B08007
+ B07002
+ B07002
+ R02000
+ B05002
+ B06002
+ B11031
+ B08007
+ B08011
+ D16005 9 R08000
+ B08005
+ B08007
+ B05002
+ B06002
+ B01026
+ B19001
+ B08007
+ B08005
+ D16006 12 R11000
+ B08011
+ B08007
+ B07002
+ B07002
+ R02000
+ B05002
+ B06002
+ B20011
+ B20012
+ B08007
+ B08011
+ D16007 10 R09000
+ B08011
+ B08007
+ R04000
+ B05002
+ B06002
+ B19005
+ B19006
+ B08007
+ B08011
+ D16008 11 R10000
+ B08001
+ B08007
+ B08023
+ R03000
+ B05002
+ B06002
+ B10002
+ B08023
+ B08007
+ B08001
+ D16009 11 R10000
+ B08011
+ B08007
+ B07002
+ B07002
+ R02000
+ B05002
+ B06002
+ B20041
+ B08007
+ B08011
+ D16010 8 R07000
+ B08011
+ B08007
+ B01022
+ B05002
+ B06002
+ B08007
+ B08011
+ D16011 17 R16000
+ B08011
+ B01022
+ B08007
+ R02000
+ B05002
+ B06002
+ B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B04005
+ B20090
+ B08021
+ B08007
+ B08011
+ D16020 5 B01023
+ B01025
+ B01027
+ D01011
+ D01012
+ D16021 23 D01023
+ B02041
+ B19001
+ B19007
+ B19005
+ B19006
+ B19008
+ B08005
+ B10004
+ B08005
+ B10004
+ B19007
+ B08005
+ B08021
+ B04075
+ B11040
+ B19007
+ R05004
+ B05021
+ B05021
+ R02002
+ B19003
+ B19004
+ D16022 23 B01032
+ B02041
+ B19001
+ B19010
+ R18000
+ B08021
+ B04014
+ B08005
+ D01023
+ B19005
+ B19006
+ B10004
+ B11041
+ B08021
+ B04075
+ B11040
+ B19008
+ R05004
+ B05021
+ B05021
+ R02002
+ B19003
+ B19004
+ D16026 2 D16020
+ D16021
+ D16050 16 D01001
+ D01011
+ D01012
+ 002160
+ 008005
+ 005002
+ 006002
+ 008005
+ 019100
+ 019005
+ 019006
+ 019101
+ 019102
+ 019103
+ 019104
+ 019105
+ D16052 28 D01005
+ D01011
+ D01012
+ 001007
+ 025150
+ R22000
+ 001027
+ 019150
+ 019106
+ 008005
+ 005002
+ 006002
+ 008005
+ 019107
+ 019005
+ 019006
+ 019108
+ 019109
+ 019110
+ 019111
+ 019112
+ 019113
+ 019114
+ 019115
+ 019116
+ 019117
+ 019118
+ 019119
+ D18001 2 D01025
+ B24011
+ D18003 4 D01026
+ B24005
+ B24004
+ B24021
+ D18004 6 D01025
+ B04023
+ B13011
+ B24005
+ B24004
+ B24022
+ D21001 6 B02101
+ B02114
+ B02105
+ B02106
+ B02107
+ B02121
+ D21003 4 B21051
+ B21014
+ B21017
+ B21030
+ D21004 4 D01031
+ B02003
+ R01000
+ D21003
+ D21005 12 B25004
+ B02121
+ B02122
+ B02123
+ B02124
+ B02125
+ B02126
+ B02127
+ B02128
+ B02129
+ B02130
+ B02131
+ D21006 4 B25001
+ B25002
+ B25003
+ B25005
+ D21007 8 B25009
+ B25010
+ B25011
+ B25012
+ B25013
+ B25015
+ B25016
+ B25017
+ D21008 3 B25006
+ B25007
+ B25008
+ D21009 2 B25018
+ B25019
+ D21010 13 B02101
+ B07002
+ B02102
+ B02103
+ B02104
+ B02105
+ B02106
+ B02107
+ B02108
+ B02109
+ B02110
+ B02132
+ B02133
+ D21011 3 B30031
+ B30032
+ B29002
+ D21012 2 R01000
+ B02135
+ D35001 4 B08035
+ B35001
+ B08036
+ D01001
+ D35002 4 B08035
+ B35001
+ B08036
+ B01033
+ D35003 6 B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B04073
+ D35004 7 B08021
+ B04004
+ B08021
+ B04004
+ B35000
+ D01001
+ B35011
+ D35005 7 B08021
+ B04004
+ B08021
+ B04004
+ B35000
+ B01001
+ B35011
+ D35006 7 B08021
+ B04004
+ B08021
+ B04004
+ B35000
+ B01003
+ B35011
+ D35007 9 B08021
+ B04004
+ B08021
+ B04004
+ B35000
+ B01001
+ R02000
+ B01002
+ B35011
+ D35010 3 D35002
+ D35003
+ D35007
diff --git a/crextables/D000207 b/crextables/D000207
new file mode 100755
index 0000000..e29c30c
--- /dev/null
+++ b/crextables/D000207
@@ -0,0 +1,2326 @@
+ D00002 2 B00002
+ B00003
+ D00003 3 B00010
+ B00011
+ B00012
+ D00004 9 D00003
+ B00013
+ B00014
+ B00015
+ B00016
+ B00017
+ B00018
+ B00019
+ B00020
+ D00010 3 D00003
+ R01000
+ B00030
+ D01001 2 B01001
+ B01002
+ D01002 3 B01003
+ B01004
+ B01005
+ D01003 3 B01011
+ B01012
+ B01013
+ D01004 4 B01001
+ B01002
+ B01015
+ B02001
+ D01005 2 001035
+ 001034
+ D01011 3 B04001
+ B04002
+ B04003
+ D01012 2 B04004
+ B04005
+ D01013 3 B04004
+ B04005
+ B04006
+ D01021 2 B05001
+ B06001
+ D01022 3 B05001
+ B06001
+ B07001
+ D01023 2 B05002
+ B06002
+ D01024 3 B05002
+ B06002
+ B07001
+ D01025 3 D01023
+ B04003
+ D01012
+ D01026 7 D01021
+ B04003
+ B04003
+ B04004
+ B04004
+ B04005
+ B04005
+ D01029 3 B01018
+ B02001
+ D01011
+ D01030 4 B01018
+ B02001
+ D01011
+ D01024
+ D01031 5 D01001
+ B02001
+ D01011
+ D01012
+ D01022
+ D01032 5 D01001
+ B02001
+ D01011
+ D01012
+ D01024
+ D01033 5 B01005
+ B02001
+ D01011
+ D01012
+ D01021
+ D01034 5 B01005
+ B02001
+ D01011
+ D01012
+ D01023
+ D01035 7 B01005
+ B01012
+ B01013
+ B02001
+ D01011
+ D01012
+ D01023
+ D01036 5 D01003
+ B02001
+ D01011
+ D01012
+ D01023
+ D01037 6 D01001
+ B02011
+ B02012
+ D01011
+ D01012
+ D01022
+ D01038 6 D01001
+ B02011
+ B02012
+ D01011
+ D01012
+ D01024
+ D01039 6 D01003
+ B02011
+ B02012
+ D01011
+ D01012
+ D01023
+ D01040 6 D01003
+ B02011
+ B02012
+ D01011
+ D01012
+ D01024
+ D01041 5 B01007
+ B02021
+ B02022
+ D01011
+ D01012
+ D01042 2 D01041
+ D01021
+ D01043 5 B01007
+ B02023
+ D01011
+ D01013
+ D01021
+ D01044 5 B01007
+ B02024
+ D01011
+ D01013
+ D01021
+ D01049 5 B02111
+ B02112
+ B21062
+ B21063
+ B21065
+ D01051 6 B01006
+ B02061
+ D01011
+ D01012
+ D01021
+ B08004
+ D01055 7 B01005
+ B02001
+ D01011
+ D01012
+ D01021
+ B01012
+ B01014
+ D01062 2 R01000
+ D01001
+ D01065 8 B01006
+ B01008
+ B02001
+ B02002
+ B02005
+ B02062
+ B02070
+ B02065
+ D01066 6 D01011
+ D01013
+ D01023
+ B07004
+ B02064
+ B08004
+ D01070 3 B02143
+ B02142
+ B02144
+ D01071 5 B01007
+ B01031
+ B02020
+ B02028
+ B02029
+ D01072 4 D01071
+ D01011
+ D01013
+ D01021
+ D01074 4 B02143
+ B02142
+ B02145
+ B02146
+ D01075 6 D01001
+ B01015
+ D01024
+ B08021
+ D01011
+ D01012
+ D01076 3 B02011
+ B02143
+ B02142
+ D01090 6 D01004
+ D01011
+ D01012
+ D01021
+ B07030
+ B07031
+ D01091 10 B02180
+ B02181
+ B02182
+ B02183
+ B02184
+ B02179
+ B02186
+ B02187
+ B02188
+ B02189
+ D01092 9 B01011
+ B01003
+ B02001
+ D01011
+ D01012
+ D01021
+ B07030
+ B07031
+ B33024
+ D01093 3 D01036
+ B07030
+ B07031
+ D01110 5 D01001
+ B01011
+ B02011
+ B02014
+ B02003
+ D01111 6 D01001
+ B01011
+ B02011
+ B02013
+ B02014
+ B02003
+ D01112 5 B01006
+ B02011
+ B02013
+ B02014
+ B02003
+ D01113 3 B08021
+ D01011
+ D01013
+ D01114 5 D01021
+ B07030
+ B07031
+ B07007
+ B33024
+ D01193 5 001007
+ 001031
+ 002196
+ 002221
+ 002222
+ D01250 4 D01193
+ D01011
+ D01013
+ D01021
+ D02001 4 B10004
+ B10051
+ B10061
+ B10063
+ D02002 5 B10004
+ B07004
+ B10003
+ B10061
+ B10063
+ D02003 9 B11011
+ B11012
+ B12004
+ B12006
+ B13003
+ B20001
+ B20003
+ B20004
+ B20005
+ D02004 7 B20010
+ B08002
+ B20011
+ B20013
+ B20012
+ B20012
+ B20012
+ D02005 4 B08002
+ B20011
+ B20012
+ B20013
+ D02006 4 B10004
+ B10051
+ B10062
+ B10063
+ D02011 3 D02001
+ D02003
+ D02004
+ D02012 3 D02002
+ D02003
+ D02004
+ D02013 4 D02006
+ D02003
+ R01000
+ D02005
+ D02021 3 B22001
+ B22011
+ B22021
+ D02022 3 B22002
+ B22012
+ B22022
+ D02023 3 B22003
+ B22013
+ B22023
+ D02024 3 D02022
+ R01002
+ D02023
+ D02031 4 D02001
+ B10062
+ B07004
+ B10009
+ D02032 4 B07032
+ B12101
+ B12103
+ B13003
+ D02033 2 B07032
+ B20001
+ D02034 2 B07032
+ B13023
+ D02035 7 D02032
+ D02033
+ D02034
+ B07032
+ D02004
+ R01000
+ D02005
+ D02036 6 R05000
+ B08002
+ B20011
+ B20012
+ B20014
+ B20017
+ D02037 3 B20062
+ B13013
+ B12113
+ D02038 4 B20003
+ B04024
+ B20004
+ B20005
+ D02039 2 B04024
+ B14031
+ D02040 4 B07032
+ R02002
+ B04024
+ B13011
+ D02041 7 B07032
+ B04024
+ B04024
+ B12111
+ B04024
+ B04024
+ B12112
+ D02042 11 B07032
+ B02002
+ B08021
+ B04025
+ B11001
+ B11002
+ B08021
+ R03002
+ B04025
+ B11043
+ B11041
+ D02043 7 D02038
+ R01002
+ D02039
+ D02040
+ D02041
+ D02042
+ B07032
+ D02044 3 B04024
+ B02004
+ B13033
+ D02045 7 B04024
+ B14002
+ B14004
+ B14016
+ B14028
+ B14029
+ B14030
+ D02046 3 B04024
+ B04024
+ B12049
+ D02047 3 R02003
+ B08002
+ B20054
+ D02043 7 D02038
+ R01002
+ D02039
+ D02040
+ D02041
+ D02042
+ B07032
+ D02048 5 B05021
+ B07021
+ B20012
+ B05021
+ B07021
+ D02049 7 B08002
+ B20011
+ B20013
+ B20012
+ B20012
+ B20012
+ B08002
+ D02051 12 B10004
+ B10051
+ B07004
+ B10003
+ B12004
+ B12051
+ B12016
+ B12017
+ B13004
+ R02004
+ B08051
+ B08020
+ D02052 7 B07032
+ B07033
+ B12101
+ B02039
+ B12102
+ B12103
+ B13003
+ D02053 3 B07032
+ B07033
+ B20001
+ D02054 8 D02052
+ D02053
+ B07033
+ D02034
+ B07032
+ D02004
+ R01000
+ 302005
+ D02055 8 B20031
+ B20032
+ B20033
+ B20034
+ B20035
+ B20036
+ B20037
+ B20038
+ D02056 2 B02038
+ B22043
+ D02057 3 D02056
+ D02021
+ D02024
+ D02058 8 B07032
+ B07033
+ B04024
+ B04024
+ B12111
+ B04024
+ B04024
+ B12112
+ D02059 12 B07032
+ B07033
+ B02002
+ B08021
+ B04025
+ B11001
+ B11002
+ B08021
+ R03002
+ B04025
+ B11043
+ B11041
+ D02060 4 D02038
+ D02040
+ D02058
+ D02059
+ D02062 18 D02001
+ D02052
+ D02053
+ 007033
+ R01000
+ D02034
+ 007032
+ R01000
+ D02005
+ 008002
+ R01000
+ D02055
+ R01000
+ D02056
+ R01000
+ D02021
+ R01000
+ D02024
+ D02063 6 D02038
+ R01000
+ D02040
+ R01000
+ D02058
+ D02059
+ D02066 16 B20023
+ B20024
+ B20027
+ B20054
+ B20023
+ B20027
+ B20054
+ B20025
+ B20026
+ B20027
+ B20040
+ B20066
+ B20027
+ B20021
+ B20067
+ B20027
+ D02069 4 B07032
+ B07033
+ B33041
+ B20001
+ D02070 8 B07032
+ B07033
+ B11001
+ B11002
+ B11043
+ B11041
+ B11016
+ B11017
+ D02071 14 B07032
+ B07033
+ B08021
+ B04025
+ B11001
+ B11002
+ B08021
+ R03002
+ B04025
+ B11043
+ B11041
+ B04025
+ B11016
+ B11017
+ D02072 5 B07032
+ B07033
+ B12101
+ B12103
+ B13003
+ D02073 7 B20010
+ R05004
+ B08002
+ B20011
+ B20012
+ B33041
+ B20013
+ D02074 4 B20003
+ B04025
+ B20004
+ B20005
+ D02075 5 B08021
+ B04025
+ B13055
+ B13058
+ B08021
+ D02076 7 B02021
+ B20022
+ B26020
+ B20023
+ B20024
+ B20025
+ B20026
+ D02077 12 B07032
+ B07033
+ B04025
+ B12111
+ B12112
+ B07032
+ B04025
+ B12112
+ B02176
+ B20062
+ B02177
+ B13013
+ D02078 4 B02176
+ B20062
+ B02177
+ B13013
+ D02079 5 B07032
+ B02175
+ B02178
+ B04025
+ B13011
+ D02080 3 B02185
+ B04025
+ B13033
+ D02081 2 B04025
+ B14031
+ D02082 7 B04025
+ B14002
+ B14004
+ B14016
+ B14028
+ B14029
+ B14030
+ D02083 8 B04025
+ B08023
+ B10004
+ B11001
+ B11002
+ B12101
+ B13003
+ B08023
+ D03001 3 B07003
+ B11001
+ B11002
+ D03002 3 B07004
+ B11001
+ B11002
+ D03003 4 B07004
+ B10003
+ B12001
+ B12003
+ D03004 6 B07004
+ B10003
+ B12001
+ B12003
+ B11001
+ B11002
+ D03011 4 B07003
+ B08001
+ B11001
+ B11002
+ D03012 4 B07004
+ B08001
+ B11001
+ B11002
+ D03013 7 B07004
+ B08001
+ B10003
+ B12001
+ B13003
+ B11001
+ B11002
+ D03014 7 B07004
+ B08001
+ B10003
+ B12001
+ B12003
+ B11001
+ B11002
+ D03031 6 B07004
+ B08003
+ B07021
+ B07022
+ B08012
+ B12061
+ D03032 2 B20011
+ B20016
+ D03033 2 B20010
+ B20016
+ D03041 8 B02152
+ B02023
+ B07004
+ B11001
+ B11002
+ B02153
+ B02154
+ B12071
+ D03050 7 B04086
+ B08042
+ B07004
+ B05015
+ B06015
+ B11001
+ B11002
+ D03051 7 B04086
+ B08042
+ B07004
+ B05015
+ B06015
+ B11061
+ B11062
+ D03051 7 B04086
+ B08042
+ B07004
+ B05015
+ B06015
+ B11061
+ B11062
+ D03052 7 B04086
+ B08042
+ B07009
+ B05015
+ B06015
+ B11001
+ B11002
+ D03053 7 B04086
+ B08042
+ B07009
+ B05015
+ B06015
+ B11061
+ B11062
+ D03054 10 B04086
+ B08042
+ B07004
+ B10009
+ B05015
+ B06015
+ B12101
+ B12103
+ B11001
+ B11002
+ D03250 8 B02252
+ B02023
+ B07004
+ B11001
+ B11002
+ B02197
+ B02198
+ B12193
+ D04001 5 B08003
+ B10004
+ B12001
+ B11001
+ B11002
+ D04002 4 B08003
+ B10004
+ B11001
+ B11002
+ D04003 2 B08003
+ B12001
+ D04004 4 B08003
+ B10004
+ B20010
+ B12001
+ D04005 4 B02024
+ B07004
+ B07004
+ B13003
+ D04006 3 B14001
+ B14001
+ B14003
+ D04011 27 B02163
+ B02164
+ B08012
+ B07024
+ B02057
+ B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B08021
+ B04024
+ R10004
+ B08021
+ B04004
+ B04005
+ B04006
+ B08021
+ B04004
+ B04005
+ B04006
+ B11001
+ B11002
+ R03010
+ B02163
+ B07004
+ B12001
+ D04030 3 B27031
+ B28031
+ B10031
+ D04031 3 B01041
+ B01042
+ B01043
+ D04032 5 B02153
+ B02154
+ B20081
+ B20082
+ B20012
+ D04033 8 B02152
+ B02166
+ B02167
+ B02153
+ B02154
+ B12075
+ B12076
+ B12063
+ D04034 9 R02004
+ B27001
+ B28001
+ B07022
+ B05043
+ B20010
+ B20016
+ B33003
+ B10040
+ D04250 27 B02231
+ B02232
+ B08012
+ B07024
+ B02057
+ B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B08021
+ B04024
+ R10004
+ B08021
+ B04004
+ B04005
+ B04006
+ B08021
+ B04004
+ B04005
+ B04006
+ B11001
+ B11002
+ R03010
+ B02231
+ B07004
+ B12001
+ D05001 4 B11001
+ B11002
+ B13060
+ B13071
+ D05002 11 D01012
+ B12001
+ B13003
+ B14051
+ B13060
+ B13072
+ B13080
+ B13081
+ B13082
+ B13083
+ B13084
+ D05003 4 D01012
+ B04065
+ R01000
+ D05001
+ D05004 3 D01030
+ D05002
+ D05003
+ D05006 8 B13072
+ B13082
+ B13019
+ C07005
+ C01004
+ B12001
+ B13073
+ B13060
+ D05007 5 D01029
+ D01012
+ B04065
+ R01000
+ D05006
+ D05008 4 D05006
+ C07005
+ C01004
+ B12030
+ D05009 5 D01029
+ D01012
+ B04065
+ R01000
+ D05008
+ D05010 3 D05008
+ B02091
+ B02091
+ D05011 5 D01029
+ D01012
+ B04065
+ R01000
+ D05010
+ D05016 7 B14021
+ B07004
+ B13003
+ B11002
+ B11001
+ B11041
+ B11043
+ D05017 5 B13080
+ B13081
+ B13083
+ B13085
+ B13084
+ D05018 7 D01029
+ D01012
+ B04065
+ R03000
+ D05008
+ D05016
+ D05017
+ D06001 4 B02032
+ R02000
+ B07062
+ B22042
+ D06002 3 B02031
+ B22004
+ B22031
+ D06003 4 B02002
+ B11011
+ B11012
+ B12004
+ D06004 6 B02032
+ B02033
+ R03000
+ B07062
+ B22043
+ B22062
+ D06005 5 B02031
+ R03000
+ B07062
+ B22004
+ B22031
+ D06006 3 D06003
+ D06002
+ B22063
+ D06007 6 B01012
+ B01014
+ D06008
+ B04024
+ B27003
+ B28003
+ D06008 3 B02034
+ B02035
+ B02036
+ D06019 9 B01075
+ D01011
+ D01012
+ B22042
+ B22120
+ B22121
+ C01002
+ B04015
+ B04065
+ D06020 8 B01075
+ D01011
+ D01012
+ B22042
+ B22120
+ B22121
+ B04075
+ B04065
+ D06021 7 B01075
+ D01011
+ D01012
+ B22122
+ B22123
+ B12001
+ D03002
+ D06022 5 B01075
+ D01011
+ D01012
+ B22038
+ B22039
+ D06023 8 B01015
+ D01023
+ D01011
+ D01012
+ B22038
+ B22039
+ B22120
+ B22121
+ D06024 4 D06020
+ R02000
+ B22038
+ B22039
+ D06025 4 D06019
+ R02006
+ B22038
+ B22039
+ D06026 21 B01075
+ B01015
+ D01021
+ D01011
+ D01013
+ R15000
+ B04016
+ B08015
+ B02007
+ B22120
+ B22121
+ B04016
+ R08000
+ B10051
+ B22038
+ B22040
+ B04026
+ R03004
+ B08023
+ B22038
+ B22040
+ D06027 5 B01005
+ B01052
+ B02047
+ D01011
+ D01013
+ D06028 4 D06027
+ D01011
+ D01013
+ D01021
+ D06029 3 B25170
+ B25171
+ B25172
+ D06030 14 D06027
+ D06029
+ R11000
+ B33002
+ D01011
+ D01013
+ B25025
+ B25025
+ B25026
+ B22185
+ B04015
+ B04065
+ R01004
+ B22182
+ D06031 14 D06027
+ D06029
+ B01053
+ B33002
+ D01011
+ D01013
+ D01011
+ D01013
+ B22185
+ B22182
+ B04016
+ B04066
+ R01000
+ B22184
+ D06032 7 B02032
+ B02033
+ R03000
+ B07062
+ B22043
+ B22062
+ B22066
+ D07001 2 D01031
+ D02011
+ D07002 2 D01032
+ D02011
+ D07003 3 D07001
+ R01000
+ D02005
+ D07004 3 D07002
+ R01000
+ D02005
+ D07005 3 D07001
+ R01004
+ D02005
+ D07006 3 D07002
+ R01004
+ D02005
+ D07007 2 D01031
+ D02012
+ D07008 2 D01032
+ D02012
+ D07009 2 D01031
+ D02013
+ D07011 16 B01063
+ B02001
+ D01011
+ D01012
+ D01024
+ B07006
+ B11001
+ B11016
+ B11017
+ B11002
+ B11041
+ B07006
+ B12001
+ B12003
+ B10052
+ B20009
+ D07012 4 R03000
+ B08023
+ B05021
+ B20001
+ D07013 7 R06000
+ B01064
+ B08014
+ B20061
+ B08014
+ B20061
+ B20018
+ D07014 2 R01000
+ B20019
+ D07015 3 R01000
+ D02005
+ B20002
+ D07016 2 R01000
+ B20020
+ D07017 2 R01000
+ B11070
+ D07018 13 B08016
+ R02000
+ B08017
+ D01012
+ R04000
+ B07006
+ B11001
+ B11002
+ B11041
+ B20009
+ R01000
+ B20001
+ D07014
+ D07020 3 D07011
+ D07014
+ D07016
+ D07021 9 D07011
+ D07012
+ D07013
+ D07014
+ D07015
+ D07016
+ D07017
+ D07018
+ D07015
+ D07030 2 B15001
+ B15002
+ D07031 7 B08022
+ B08023
+ B15001
+ B08023
+ B15001
+ B08023
+ B15002
+ D07041 7 D01001
+ B01015
+ D01024
+ D01011
+ D01012
+ D01070
+ D07030
+ D07042 9 D01001
+ B01015
+ D01024
+ D01011
+ D01012
+ B08021
+ B04025
+ D01070
+ D07031
+ D07043 7 D01001
+ B01015
+ D01024
+ D01011
+ D01012
+ D01074
+ D07030
+ D07044 9 D01001
+ B01015
+ D01024
+ D01011
+ D01012
+ B08021
+ B04025
+ D01074
+ D07031
+ D07060 2 B07061
+ B12030
+ D07061 3 D01031
+ R01005
+ D07060
+ D07062 3 D01032
+ R01005
+ D07060
+ D07063 2 B07061
+ B12130
+ D07080 13 D01090 CREX template for synoptic reports
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07081 24 D01090 CREX template for synoptic reports RA I
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ B12122
+ B13056
+ B13057
+ B20101
+ B20102
+ B20103
+ B20104
+ B20105
+ B20106
+ B20107
+ B20108
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07082 15 D01090 CREX template for synoptic reports RA II
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ B12121
+ B12122
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07083 14 D01090 CREX template for synoptic reports RA III
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ B12122
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07084 16 D01090 CREX template for synoptic reports RA IV
+ D02031
+ D02035
+ D02036
+ D02047
+ B08002
+ D02048
+ D02037
+ B20055
+ R01000
+ C05001
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D07086 11 D01090 CREX template for synoptic reports RA VI
+ D02031
+ D02035
+ D02036
+ B08002
+ D02037
+ D02066
+ D02043
+ D02044
+ R01002
+ D02045
+ D07087 20 D01001
+ B02001
+ D01011
+ D01012
+ D01023
+ B07030
+ B07031
+ D02001
+ B10062
+ B07004
+ B10009
+ B07032
+ B12101
+ B12103
+ B13003
+ B07032
+ B20001
+ D02004
+ R01000
+ D02005
+ D07088 25 B20003
+ B04024
+ B20004
+ B20005
+ B04024
+ B02004
+ B13033
+ R02002
+ B04024
+ B14031
+ R02002
+ B04024
+ B13011
+ B07032
+ B04024
+ B12111
+ B04024
+ B12112
+ B07032
+ B02002
+ B08021
+ B04025
+ B11001
+ B11002
+ B08021
+ D07089 2 D07087
+ D07088
+ D07090 13 D01092 CREX template for synoptic reports from mobile land stations
+ D02031
+ D02035
+ D02036
+ D02047
+ 008002
+ D02048
+ D02037
+ D02043
+ D02044
+ R01002
+ D02045
+ D02046
+ D08001 3 D01033
+ D02011
+ B22042
+ D08002 3 D01034
+ D02011
+ B22042
+ D08003 3 D01035
+ D02011
+ B22042
+ D08004 3 D01036
+ D02011
+ B22042
+ D08005 2 D08004
+ D02024
+ D08006 8 B10004
+ B10061
+ B10063
+ B11001
+ B11002
+ B12004
+ B13003
+ B22042
+ D08007 4 D01055
+ D02011
+ B07062
+ B22042
+ D08008 3 D01093
+ D02062
+ D02063
+ D08009 7 D01093
+ D02001
+ D02054
+ B08002
+ D02055
+ D02057
+ D02060
+ D08010 15 B01011
+ R13000
+ D01011
+ D01012
+ D01021
+ B04080
+ B22049
+ B04080
+ B22059
+ B04080
+ B22005
+ B02042
+ B22032
+ B02042
+ B04080
+ D09001 3 D01037
+ R01000
+ D03011
+ D09002 3 D01038
+ R01000
+ D03011
+ D09003 3 D01037
+ R01000
+ D03012
+ D09004 3 D01038
+ R01000
+ D03012
+ D09005 4 D01037
+ D02004
+ R01000
+ D03013
+ D09006 4 D01038
+ D02004
+ R01000
+ D03013
+ D09007 4 D01037
+ D02004
+ R01000
+ D03014
+ D09008 4 D01038
+ D02004
+ R01000
+ D03014
+ D09011 3 D01039
+ R01000
+ D03011
+ D09012 3 D01039
+ R01000
+ D03012
+ D09013 4 D01039
+ D02004
+ R01000
+ D03013
+ D09014 4 D01039
+ D02004
+ R01000
+ D03014
+ D09015 3 D01040
+ R01000
+ D03011
+ D09016 3 D01040
+ R01000
+ D03012
+ D09017 4 D01040
+ D02004
+ R01000
+ D03013
+ D09018 4 D01040
+ D02004
+ R01000
+ D03014
+ D09019 4 D01031
+ B02003
+ R01000
+ D03011
+ D09020 7 D01031
+ B02003
+ R04000
+ B07003
+ B11003
+ B11004
+ B11005
+ D09030 7 B15004
+ B15005
+ R04000
+ B04015
+ B08006
+ B07004
+ B15003
+ D09031 7 B15004
+ B15005
+ R04000
+ B04025
+ B08006
+ B07004
+ B15003
+ D09040 3 D01075
+ D01076
+ D09030
+ D09041 4 D07041
+ D01075
+ D01076
+ D09030
+ D09042 4 D07042
+ D01075
+ D01076
+ D09030
+ D09043 4 D07043
+ D01075
+ D01076
+ D09030
+ D09044 4 D07044
+ D01075
+ D01076
+ D09030
+ D09045 3 D01075
+ D01076
+ D09031
+ D09046 4 D07041
+ D01075
+ D01076
+ D09031
+ D09047 4 D07042
+ D01075
+ D01076
+ D09031
+ D09048 4 D07043
+ D01075
+ D01076
+ D09031
+ D09049 4 D07044
+ D01075
+ D01076
+ D09031
+ D09050 7 D01110
+ D01113
+ D01114
+ R01000
+ D03050
+ R01000
+ D03051
+ D09051 7 D01110
+ D01113
+ D01114
+ R01000
+ D03052
+ R01000
+ D03053
+ D09052 9 D01111
+ D01113
+ D01114
+ D02049
+ B22043
+ R01000
+ D03054
+ R01000
+ D03051
+ D09053 7 D01112
+ D01113
+ D01114
+ R01000
+ D03054
+ R01000
+ D03051
+ D10001 5 D01042
+ D03031
+ D03032
+ R01026
+ D03025
+ D10002 5 D01042
+ D03031
+ D03032
+ R01009
+ D03023
+ D10003 5 D01042
+ D03031
+ D03032
+ R01006
+ D03023
+ D10004 5 D01042
+ D03031
+ D03032
+ R01003
+ D03024
+ D10005 5 D01042
+ D03031
+ D03033
+ R01000
+ D03025
+ D10006 5 D01042
+ D03031
+ D03033
+ R01000
+ D03023
+ D10007 5 D01042
+ D03031
+ D03033
+ R01000
+ D03024
+ D10008 8 D10011
+ R01019
+ D10012
+ B02150
+ B25079
+ B25080
+ B33032
+ B14045
+ D10009 3 D10011
+ R01015
+ D10012
+ D10010 3 D10011
+ R01005
+ D10012
+ D10014 3 D01072
+ D03041
+ D04011
+ D10015 13 D01072
+ B07024
+ B10002
+ D03041
+ R01003
+ D04032
+ B02152
+ B02024
+ B07004
+ B07004
+ B13003
+ R01003
+ D04033
+ D10016 13 D01072
+ B07024
+ B10002
+ D03041
+ R01012
+ D04032
+ B02152
+ B02024
+ B07004
+ B07004
+ B13003
+ R01012
+ D04033
+ D10020 6 D10022
+ D01011
+ D01013
+ D01021
+ D04034
+ D10021
+ D10022 4 B01007
+ B02019
+ B01033
+ B02172
+ D10023 17 D01072
+ B30021
+ B30022
+ B08012
+ B07024
+ B07025
+ B10002
+ R01012
+ D04032
+ R05002
+ B02152
+ B02024
+ B07004
+ B07004
+ B13003
+ R01012
+ D04033
+ D10050 13 D10051
+ D10052
+ R01000
+ D10053
+ R01004
+ D10054
+ B20010
+ D10052
+ R01015
+ D10053
+ D10052
+ R01004
+ D10053
+ D10195 3 D01250
+ D03250
+ D04250
+ D11001 9 D01051
+ B07002
+ B12001
+ B11001
+ B11002
+ B11031
+ B11032
+ B11033
+ B20041
+ D11002 4 D01065
+ D01066
+ D11003
+ D11004
+ D11003 5 B10070
+ B11001
+ B11002
+ B12001
+ B13002
+ D11004 12 R01000
+ B11034
+ R01000
+ B11035
+ R01000
+ B11075
+ R01000
+ B11076
+ R01000
+ B33025
+ R01000
+ B33026
+ D11005 13 B01008
+ B01023
+ D01021
+ D01011
+ D01013
+ B07010
+ B08009
+ B11001
+ B11002
+ B11031
+ B11036
+ B12101
+ B33025
+ D11006 6 B07010
+ B11001
+ B11002
+ B02064
+ B12101
+ B12103
+ D11007 7 B07010
+ D01021
+ B11001
+ B11002
+ B02064
+ B12101
+ B12103
+ D11008 7 B01008
+ D01011
+ D01013
+ D01021
+ B08004
+ R01000
+ D11006
+ D11009 7 B01008
+ D01011
+ D01013
+ D01021
+ B08004
+ R01000
+ D11007
+ D11193 16 D01197
+ D01011
+ D01012
+ D01023
+ B08004
+ B07004
+ B08021
+ B11001
+ B11002
+ B11031
+ B11034
+ B11035
+ B12001
+ B12003
+ B13003
+ B20041
+ D12001 2 D01043
+ D04001
+ D12002 2 D01043
+ D04002
+ D12003 2 D01042
+ D04003
+ D12004 2 D01042
+ D04004
+ D12005 2 D01042
+ B20014
+ D12006 2 D01044
+ D04005
+ D12007 2 D01042
+ D04006
+ D12010 6 B01007
+ B05040
+ B02021
+ B05041
+ B04001
+ B04043
+ D12014 8 D12010
+ D12011
+ R05056
+ D01023
+ B05042
+ B05052
+ D12012
+ D12013
+ D12016 3 D12010
+ D12011
+ D12015
+ D12018 3 D12010
+ D12011
+ D12017
+ D12020 11 D01047
+ D01048
+ B15015
+ B29002
+ B21076
+ R04012
+ B06030
+ R02012
+ B05030
+ B21075
+ B21066
+ D12021 6 D01047
+ R01003
+ D01049
+ B11012
+ B11011
+ B21067
+ D12022 15 D01047
+ B08022
+ B11012
+ B11050
+ B22070
+ B22026
+ D12041
+ B10050
+ B21068
+ B21071
+ B21072
+ B21073
+ D12042
+ B21062
+ B15011
+ D12023 7 D01047
+ R03003
+ B08022
+ B12061
+ B22050
+ B21069
+ B21085
+ D12024 11 D12020
+ B08060
+ B08022
+ B08060
+ B08022
+ B25014
+ B22101
+ B22097
+ B22098
+ B22099
+ B22100
+ D12025 11 D12019
+ B08060
+ B08022
+ B08060
+ B08022
+ B25014
+ B22101
+ B22097
+ B22098
+ B22099
+ B22100
+ D12026 19 D01046
+ D01011
+ D01013
+ D01023
+ D12031
+ R01004
+ D12030
+ B21110
+ D01023
+ D21027
+ B21111
+ D01023
+ D21027
+ B21112
+ D01023
+ D21027
+ B21113
+ D01023
+ D21027
+ D12027 9 D01047
+ R05009
+ D01023
+ B07021
+ B12061
+ B07021
+ B12061
+ B21085
+ B21070
+ D12031 8 B05034
+ B06034
+ B21109
+ B11081
+ B11082
+ B21101
+ B21102
+ B21103
+ D12032 4 B21120
+ B21121
+ B13055
+ B21122
+ D12033 4 B02104
+ B08022
+ B12063
+ B12065
+ D12042 6 B21077
+ B21078
+ B21079
+ B21080
+ B21081
+ B21082
+ D12045 21 B01007
+ B02019
+ B01096
+ B25061
+ B05040
+ D01011
+ D01013
+ D01021
+ B07002
+ B12180
+ B12181
+ B12182
+ B12183
+ B12184
+ B12185
+ B02174
+ B21086
+ B12186
+ B21087
+ B12187
+ B33043
+ D13009 3 B21001
+ R01000
+ B21001
+ D13010 3 B21036
+ R01000
+ B21036
+ D13031 4 B06002
+ B06012
+ R01000
+ B30001
+ D13032 4 B05002
+ B05012
+ R01000
+ D13031
+ D13041 9 B06002
+ R10000
+ R04000
+ B06012
+ R01000
+ B30001
+ B06012
+ R01000
+ B30001
+ D13042 4 B05002
+ B05012
+ R01000
+ D13041
+ D13043 11 B06002
+ B05002
+ B05012
+ R12000
+ R10000
+ R04000
+ B06012
+ R01000
+ B30001
+ R01000
+ B30001
+ D15001 5 B01011
+ D01011
+ D01012
+ D01023
+ D06001
+ D15002 5 B01011
+ D01011
+ D01012
+ D01023
+ D06004
+ D16001 10 D01011
+ B04004
+ D01023
+ B01021
+ B02041
+ B19001
+ B10051
+ B19002
+ B19003
+ B19004
+ D16002 15 B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B04005
+ B01033
+ B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B04005
+ B07002
+ B07002
+ D16003 10 R09000
+ B08011
+ B08007
+ R04000
+ B05002
+ B06002
+ B10002
+ B11002
+ B08007
+ B08011
+ D16004 11 R10000
+ B08011
+ B08007
+ B07002
+ B07002
+ R02000
+ B05002
+ B06002
+ B11031
+ B08007
+ B08011
+ D16005 9 R08000
+ B08005
+ B08007
+ B05002
+ B06002
+ B01026
+ B19001
+ B08007
+ B08005
+ D16006 12 R11000
+ B08011
+ B08007
+ B07002
+ B07002
+ R02000
+ B05002
+ B06002
+ B20011
+ B20012
+ B08007
+ B08011
+ D16007 10 R09000
+ B08011
+ B08007
+ R04000
+ B05002
+ B06002
+ B19005
+ B19006
+ B08007
+ B08011
+ D16008 11 R10000
+ B08001
+ B08007
+ B08023
+ R03000
+ B05002
+ B06002
+ B10002
+ B08023
+ B08007
+ B08001
+ D16009 11 R10000
+ B08011
+ B08007
+ B07002
+ B07002
+ R02000
+ B05002
+ B06002
+ B20041
+ B08007
+ B08011
+ D16010 8 R07000
+ B08011
+ B08007
+ B01022
+ B05002
+ B06002
+ B08007
+ B08011
+ D16011 17 R16000
+ B08011
+ B01022
+ B08007
+ R02000
+ B05002
+ B06002
+ B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B04005
+ B20090
+ B08021
+ B08007
+ B08011
+ D16020 5 B01023
+ B01025
+ B01027
+ D01011
+ D01012
+ D16021 23 D01023
+ B02041
+ B19001
+ B19007
+ B19005
+ B19006
+ B19008
+ B08005
+ B10004
+ B08005
+ B10004
+ B19007
+ B08005
+ B08021
+ B04075
+ B11040
+ B19007
+ R05004
+ B05021
+ B05021
+ R02002
+ B19003
+ B19004
+ D16022 23 B01032
+ B02041
+ B19001
+ B19010
+ R18000
+ B08021
+ B04014
+ B08005
+ D01023
+ B19005
+ B19006
+ B10004
+ B11041
+ B08021
+ B04075
+ B11040
+ B19008
+ R05004
+ B05021
+ B05021
+ R02002
+ B19003
+ B19004
+ D16026 2 D16020
+ D16021
+ D16027 2 D16020
+ D16022
+ D16050 16 D01001
+ D01011
+ D01012
+ 002160
+ 008005
+ 005002
+ 006002
+ 008005
+ 019100
+ 019005
+ 019006
+ 019101
+ 019102
+ 019103
+ 019104
+ 019105
+ D16052 28 D01005
+ D01011
+ D01012
+ 001007
+ 025150
+ R22000
+ 001027
+ 019150
+ 019106
+ 008005
+ 005002
+ 006002
+ 008005
+ 019107
+ 019005
+ 019006
+ 019108
+ 019109
+ 019110
+ 019111
+ 019112
+ 019113
+ 019114
+ 019115
+ 019116
+ 019117
+ 019118
+ 019119
+ D16060 14 D01011
+ D01012
+ B05002
+ B06002
+ B19005
+ B19006
+ B05002
+ B06002
+ B05002
+ B06002
+ B04074
+ B20048
+ B11041
+ B13055
+ D16061 16 D01011
+ D01012
+ B05002
+ B06002
+ B19005
+ B19006
+ R02000
+ B05002
+ B06002
+ R02002
+ B05002
+ B06002
+ B04074
+ B20048
+ B11041
+ B13055
+ D18001 2 D01025
+ B24011
+ D18003 4 D01026
+ B24005
+ B24004
+ B24021
+ D18004 6 D01025
+ B04023
+ B13011
+ B24005
+ B24004
+ B24022
+ D21001 6 B02101
+ B02114
+ B02105
+ B02106
+ B02107
+ B02121
+ D21003 4 B21051
+ B21014
+ B21017
+ B21030
+ D21004 4 D01031
+ B02003
+ R01000
+ D21003
+ D21005 12 B25004
+ B02121
+ B02122
+ B02123
+ B02124
+ B02125
+ B02126
+ B02127
+ B02128
+ B02129
+ B02130
+ B02131
+ D21006 4 B25001
+ B25002
+ B25003
+ B25005
+ D21007 8 B25009
+ B25010
+ B25011
+ B25012
+ B25013
+ B25015
+ B25016
+ B25017
+ D21008 3 B25006
+ B25007
+ B25008
+ D21009 2 B25018
+ B25019
+ D21010 13 B02101
+ B07002
+ B02102
+ B02103
+ B02104
+ B02105
+ B02106
+ B02107
+ B02108
+ B02109
+ B02110
+ B02132
+ B02133
+ D21011 3 B30031
+ B30032
+ B29002
+ D21012 2 R01000
+ B02135
+ D35001 4 B08035
+ B35001
+ B08036
+ D01001
+ D35002 4 B08035
+ B35001
+ B08036
+ B01033
+ D35003 6 B08021
+ B04001
+ B04002
+ B04003
+ B04004
+ B04073
+ D35004 7 B08021
+ B04004
+ B08021
+ B04004
+ B35000
+ D01001
+ B35011
+ D35005 7 B08021
+ B04004
+ B08021
+ B04004
+ B35000
+ B01001
+ B35011
+ D35006 7 B08021
+ B04004
+ B08021
+ B04004
+ B35000
+ B01003
+ B35011
+ D35007 9 B08021
+ B04004
+ B08021
+ B04004
+ B35000
+ B01001
+ R02000
+ B01002
+ B35011
+ D35010 3 D35002
+ D35003
+ D35007
diff --git a/crextables/units.config.dat b/crextables/units.config.dat
new file mode 100755
index 0000000..39dfc1b
--- /dev/null
+++ b/crextables/units.config.dat
@@ -0,0 +1,59 @@
+001 metre m M 1
+002 kilogram kg KG 1
+003 second s S 1
+004 ampere A A 1
+005 kelvin K K 1
+006 mole mol MOL 1
+007 candela cd CD 1
+021 radian rad RAD 1
+022 steradian sr SR 1
+030 hertz Hz HZ 1
+031 newton N N 1
+032 pascal Pa PA 1
+033 joule J J 1
+034 watt W W 1
+035 coulomb C C 1
+036 volt V V 1
+037 farad F F 1
+038 ohm ohm OHM 1
+039 siemens S SIE 1
+040 weber Wb WB 1
+041 tesla T T 1
+042 henry H H 1
+060 degree Celsius Cel CEL 1
+070 lumen lm LM 1
+071 lux lx LX 1
+080 becquerel Bq BQ 1
+081 gray Gy GY 1
+082 sievert Sv SV 1
+110 degree (angle) deg DEG 1
+111 minute (angle) ' MNT 1
+112 second (angle) " SEC 1
+120 litre l L 1
+130 minute (time) min MIN 1
+131 hour h HR 1
+132 day d D 1
+150 tonne t TNE 1
+160 electron volt eV EV 1
+161 astronomic unit AU AU 1
+170 parsec pc PRS 1
+201 knot kt KT 1
+210 decibel dB DB 1
+220 hectare ha HAR 1
+231 year a ANN 1
+300 per cent % PERCENT 1
+301 parts per thousand 0/00 PERTHOU 1
+310 eiths of cloud octa OCTA 1
+320 degree true deg DEG 1
+321 degrees per second deg/s DEG/S 1
+350 degrees Celsius C C 1
+351 degrees Celsius per metre C/m C/M 1
+352 degrees Celsius per 100 metresC/100 m C/100 M 1
+360 Dobson Unit DU DU 1
+430 month mon MON 1
+441 per second /s /S 1
+510 foot ft FT 1
+530 hectopascal hPa HPAL 1
+620 grams per kilogram g/kg G/KG 1
+710 millimetre mm MM 1
+740 kilometre km KM 1
diff --git a/data/850ght.grib b/data/850ght.grib
new file mode 100755
index 0000000..1a7e0dd
Binary files /dev/null and b/data/850ght.grib differ
diff --git a/data/ISMD01_OKPR.bufr b/data/ISMD01_OKPR.bufr
new file mode 100755
index 0000000..5019284
Binary files /dev/null and b/data/ISMD01_OKPR.bufr differ
diff --git a/data/ISMD01_OKPR.crex b/data/ISMD01_OKPR.crex
new file mode 100755
index 0000000..d139873
--- /dev/null
+++ b/data/ISMD01_OKPR.crex
@@ -0,0 +1,296 @@
+CREX++
+T0002031300 A000002 P00089000 U00 S007 Y20071121 H1200 D07080
+++
+ 11 423 Primda 1 2007 11 21 12 00 4966944 01267778
+ 07422 07470 09252 ///// -0006 05 //// 09250 00749 00195 -0230
+ -0270 097 00480 0020 00112 ///// ///// 113 05 09 0000 62 61 60
+ 0001 05 09 59 0000 0001 11 // // //// // 07 /// 08 /// 09 ///
+ // ///// ///// // ///// ///// // ///// //// 049 -0006 04 04 -0001
+ //// -0024 //// 00112 -0006 00000 -0001 00000 00195 -0012 0000
+ //// -0012 0000 //// 01025 10 02 -0010 110 0050 // -0010 ///
+ //// -0360 /// 0120 ///// -0024 // //// -0001 //// //// /////
+ ///// ///// ///// -0024 //// //// ///// ///// ///// ///// ////
+ //// //+
+ 11 487 Kocelovice 1 2007 11 21 12 00 4946500 01383111
+ 05190 05219 09522 10162 -0008 08 //// ///// ///// 00200 -0130
+ -0140 099 00490 0270 00101 ///// ///// 100 07 08 0012 36 61 60
+ 0001 01 08 07 0012 0001 // // // //// // 07 /// 08 /// 09 ///
+ // ///// ///// // ///// ///// // ///// //// 010 -0006 04 02 -0001
+ //// -0024 //// 00101 -0006 00000 -0001 00000 00200 -0012 0000
+ //// -0012 0000 //// 01015 10 02 -0010 120 0040 // -0010 ///
+ //// -0360 /// //// ///// -0024 // //// -0001 //// //// /////
+ ///// ///// ///// -0024 //// //// ///// ///// ///// ///// ////
+ //// //+
+ 11 518 Praha-Ruzyne 1 2007 11 21 12 00 5010083 01425778
+ 03640 03653 09713 10164 -0011 08 //// ///// ///// 00200 -0010
+ -0200 087 00170 0800 00102 ///// ///// 100 07 08 0024 36 61 60
+ 0001 01 08 07 0024 0001 // // // //// // 07 /// 08 /// 09 ///
+ // ///// ///// // ///// ///// // ///// //// 010 -0006 02 02 -0001
+ //// -0024 //// 00102 -0006 00000 -0001 00000 00200 -0012 0000
+ //// -0012 0000 //// 01000 10 02 -0010 140 0030 // -0010 ///
+ //// -0360 /// //// ///// -0024 // //// -0001 //// //// /////
+ ///// ///// ///// -0024 //// //// ///// ///// ///// ///// ////
+ //// //+
+ 11 603 Liberec 1 2007 11 21 12 00 5077000 01502417
+ 03977 04015 09665 10158 -0007 05 //// ///// ///// 00198 0050
+ -0120 088 00465 0600 00100 ///// ///// 100 07 08 0024 36 61 60
+ 0001 01 08 07 0024 0001 // // // //// // 07 /// 08 /// 09 ///
+ // ///// ///// // ///// ///// // ///// //// 010 -0006 02 02 -0001
+ //// -0024 //// 00100 -0006 00000 -0001 00000 00198 -0012 0000
+ //// -0012 0000 //// 01030 10 02 -0010 130 0070 // -0010 ///
+ //// -0360 /// 0130 ///// -0024 // //// -0001 //// //// /////
+ ///// ///// ///// -0024 //// //// ///// ///// ///// ///// ////
+ //// //+
+ 11 659 Pribyslav 1 2007 11 21 12 00 4958278 01576278
+ 05325 05364 09513 10171 -0013 07 //// ///// ///// 00201 -0130
+ -0230 093 00624 0180 00096 ///// ///// 100 07 08 0012 36 61 60
+ 0001 01 08 07 0012 0001 // // // //// // 07 /// 08 /// 09 ///
+ // ///// ///// // ///// ///// // ///// //// 010 -0006 04 02 -0001
+ //// -0024 //// 00096 -0006 00000 -0001 00000 00201 -0012 0000
+ //// -0012 0000 //// 01408 10 02 -0010 140 0070 // -0010 ///
+ //// -0360 /// 0130 ///// -0024 // //// -0001 //// //// /////
+ ///// ///// ///// -0024 //// //// ///// ///// ///// ///// ////
+ //// //+
+ 11 723 Brno-Turany 1 2007 11 21 12 00 4915306 01668889
+ 02410 02457 09873 10178 -0012 08 //// ///// ///// 00200 0190
+ -0070 083 00540 0800 00100 ///// ///// 100 07 08 0045 36 61 60
+ 0001 01 08 07 0045 0001 // // // //// // 07 /// 08 /// 09 ///
+ // ///// ///// // ///// ///// // ///// //// 010 -0006 02 02 -0001
+ //// -0024 //// 00100 -0006 00000 -0001 00000 00200 -0012 0000
+ //// -0012 0000 //// 00800 10 02 -0010 160 0030 // -0010 ///
+ //// -0360 /// //// ///// -0024 // //// -0001 //// //// /////
+ ///// ///// ///// -0024 //// //// ///// ///// ///// ///// ////
+ //// //+
+ 11 782 Ostrava-Mosnov 1 2007 11 21 12 00 4969750 01812083
+ 02504 02601 09839 10156 -0017 07 //// ///// ///// 00200 0550
+ -0010 067 01100 2500 00100 ///// ///// 025 00 00 0690 30 20 11
+ 0001 01 02 00 0690 0001 // // // //// // 07 /// 08 /// 09 ///
+ // ///// ///// // ///// ///// // ///// //// 508 -0006 10 10 -0001
+ //// -0024 //// 00100 -0006 00000 -0001 00000 00200 -0012 0000
+ //// -0012 0000 //// 01000 10 02 -0010 250 0060 // -0010 ///
+ //// -0360 /// //// ///// -0024 // //// -0001 //// //// /////
+ ///// ///// ///// -0024 //// //// ///// ///// ///// ///// ////
+ //// //++
+7777
+CREX++
+T0002031300 A000002 P00089000 U00 S007 Y20071121 H0600 D07080
+++
+ 11 423 Primda 1 2007 11 21 06 00 4966944 01267778
+ 07422 07470 09252 ///// -0012 07 //// 09250 00749 00195 -0300
+ -0330 098 00480 0020 00112 00000 ///// 113 05 09 0003 62 61 60
+ 0001 05 09 59 0003 0001 11 // // //// // 07 /// 08 /// 09 ///
+ // ///// ///// // ///// ///// 14 00019 -0300 049 -0006 // //
+ -0001 //// -0024 //// 00112 -0012 00000 -0001 00000 00195 -0012
+ 0000 //// -0012 0000 -0310 01025 10 02 -0010 100 0070 // -0010
+ /// //// -0360 /// 0110 ///// -0024 // //// -0001 //// //// /////
+ ///// ///// ///// -0024 //// //// ///// ///// ///// ///// ////
+ //// //+
+ 11 487 Kocelovice 1 2007 11 21 06 00 4946500 01383111
+ 05190 05219 09531 10172 -0008 06 //// ///// ///// 00200 -0160
+ -0170 099 00490 0030 00101 00000 ///// 113 05 09 0006 62 61 60
+ 0001 05 09 59 0006 0001 // // // //// // 07 /// 08 /// 09 ///
+ // ///// ///// // ///// ///// 11 -00002 -0200 049 -0006 02 02
+ -0001 //// -0024 //// 00101 -0012 00000 -0001 00000 00200 -0012
+ 0000 //// -0012 0000 -0170 01015 10 02 -0010 130 0040 // -0010
+ /// //// -0360 /// //// ///// -0024 // //// -0001 //// //// /////
+ ///// ///// ///// -0024 //// //// ///// ///// ///// ///// ////
+ //// //+
+ 11 518 Praha-Ruzyne 1 2007 11 21 06 00 5010083 01425778
+ 03640 03653 09725 10177 -0006 05 //// ///// ///// 00200 -0060
+ -0200 090 00170 0800 00102 00000 ///// 100 07 08 0024 36 61 60
+ 0001 01 08 07 0024 0001 // // // //// // 07 /// 08 /// 09 ///
+ // ///// ///// // ///// ///// 04 00000 -0100 010 -0006 02 02
+ -0001 //// -0024 //// 00102 -0012 00000 -0001 00000 00200 -0012
+ 0000 //// -0012 0000 -0060 01000 10 02 -0010 180 0020 // -0010
+ /// //// -0360 /// //// ///// -0024 // //// -0001 //// //// /////
+ ///// ///// ///// -0024 //// //// ///// ///// ///// ///// ////
+ //// //+
+ 11 603 Liberec 1 2007 11 21 06 00 5077000 01502417
+ 03977 04015 09675 10168 -0006 05 //// ///// ///// 00198 0100
+ -0120 085 00465 1000 00100 00000 ///// 100 07 08 0036 35 61 60
+ 0001 01 08 06 0036 0001 // // // //// // 07 /// 08 /// 09 ///
+ // ///// ///// // ///// ///// 14 00010 0100 002 -0006 // // -0001
+ //// -0024 //// 00100 -0012 00000 -0001 00000 00198 -0012 0000
+ //// -0012 0000 0060 01030 10 02 -0010 140 0070 // -0010 ///
+ //// -0360 /// 0120 ///// -0024 // //// -0001 //// //// /////
+ ///// ///// ///// -0024 //// //// ///// ///// ///// ///// ////
+ //// //+
+ 11 659 Pribyslav 1 2007 11 21 06 00 4958278 01576278
+ 05325 05364 09525 10185 -0004 07 //// ///// ///// 00201 -0200
+ -0260 096 00624 0150 00096 00000 ///// 100 07 08 0012 36 61 60
+ 0001 01 08 07 0012 0001 // // // //// // 07 /// 08 /// 09 ///
+ // ///// ///// // ///// ///// 14 00018 -0200 010 -0006 02 02
+ -0001 //// -0024 //// 00096 -0012 00000 -0001 00000 00201 -0012
+ 0000 //// -0012 0000 -0210 01408 10 02 -0010 140 0080 // -0010
+ /// 0130 -0360 /// 0140 ///// -0024 // //// -0001 //// //// /////
+ ///// ///// ///// -0024 //// //// ///// ///// ///// ///// ////
+ //// //+
+ 11 723 Brno-Turany 1 2007 11 21 06 00 4915306 01668889
+ 02410 02457 09887 10193 -0005 07 //// ///// ///// 00200 0140
+ -0040 088 00540 0500 00100 00000 ///// 100 07 08 0030 36 61 60
+ 0001 01 08 07 0030 0001 // // // //// // 07 /// 08 /// 09 ///
+ // ///// ///// // ///// ///// 01 00000 0100 010 -0006 02 02 -0001
+ //// -0024 //// 00100 -0012 00000 -0001 00000 00200 -0012 0000
+ //// -0012 0000 0130 00800 10 02 -0010 140 0030 // -0010 ///
+ //// -0360 /// //// ///// -0024 // //// -0001 //// //// /////
+ ///// ///// ///// -0024 //// //// ///// ///// ///// ///// ////
+ //// //+
+ 11 782 Ostrava-Mosnov 1 2007 11 21 06 00 4969750 01812083
+ 02504 02601 09858 10182 -0010 07 //// ///// ///// 00200 0050
+ -0210 083 01100 2000 00100 00000 ///// 013 00 00 0690 30 20 11
+ 0001 01 01 00 0690 0001 // // // //// // 07 /// 08 /// 09 ///
+ // ///// ///// // ///// ///// 12 00002 -0200 508 -0006 10 10
+ -0001 //// -0024 //// 00100 -0012 00000 -0001 00000 00200 -0012
+ 0000 //// -0012 0000 -0060 01000 10 02 -0010 240 0060 // -0010
+ /// //// -0360 /// //// ///// -0024 // //// -0001 //// //// /////
+ ///// ///// ///// -0024 //// //// ///// ///// ///// ///// ////
+ //// //++
+7777
+CREX++
+T0002031300 A000002 P00089000 U00 S007 Y20071121 H1800 D07080
+++
+ 11 423 Primda 1 2007 11 21 18 00 4966944 01267778
+ 07422 07470 09265 ///// 0004 02 //// 09250 00761 00195 -0290
+ -0320 098 00480 0020 00112 ///// ///// 113 05 09 0003 62 61 60
+ 0001 05 09 59 0003 0001 11 // // //// // 07 /// 08 /// 09 ///
+ // ///// ///// // ///// ///// 14 00019 //// 049 -0006 04 04 -0001
+ //// -0024 //// 00112 -0012 00000 -0001 00000 00195 -0012 0000
+ -0200 -0012 0000 //// 01025 10 02 -0010 000 0020 // -0010 ///
+ //// -0360 /// //// ///// -0024 // //// -0001 //// //// /////
+ ///// ///// ///// -0024 //// //// ///// ///// ///// ///// ////
+ //// //+
+ 11 487 Kocelovice 1 2007 11 21 18 00 4946500 01383111
+ 05190 05219 09536 10177 0008 02 //// ///// ///// 00200 -0140
+ -0160 099 00490 0240 00101 ///// ///// 100 07 08 0009 36 61 60
+ 0001 01 08 07 0009 0001 // // // //// // 07 /// 08 /// 09 ///
+ // ///// ///// // ///// ///// 11 -00002 //// 010 -0006 02 02
+ -0001 //// -0024 //// 00101 -0012 00000 -0001 00000 00200 -0012
+ 0000 -0100 -0012 0000 //// 01015 10 02 -0010 000 0020 // -0010
+ /// //// -0360 /// //// ///// -0024 // //// -0001 //// //// /////
+ ///// ///// ///// -0024 //// //// ///// ///// ///// ///// ////
+ //// //+
+ 11 518 Praha-Ruzyne 1 2007 11 21 18 00 5010083 01425778
+ 03640 03653 09724 10175 0006 01 //// ///// ///// 00200 0000 -0170
+ 088 00170 0900 00102 ///// ///// 100 07 08 0027 36 61 60 0001
+ 01 08 07 0027 0001 // // // //// // 07 /// 08 /// 09 /// // /////
+ ///// // ///// ///// // 00000 //// 010 -0006 02 02 -0001 ////
+ -0024 //// 00102 -0012 00000 -0001 00000 00200 -0012 0000 0020
+ -0012 0000 //// 01000 10 02 -0010 180 0020 // -0010 /// ////
+ -0360 /// //// ///// -0024 // //// -0001 //// //// ///// /////
+ ///// ///// -0024 //// //// ///// ///// ///// ///// //// ////
+ //+
+ 11 603 Liberec 1 2007 11 21 18 00 5077000 01502417
+ 03977 04015 09674 10169 0007 01 //// ///// ///// 00198 0020 -0130
+ 090 00465 0600 00100 ///// ///// 100 07 08 0024 36 61 60 0001
+ 01 08 07 0024 0001 // // // //// // 07 /// 08 /// 09 /// // /////
+ ///// // ///// ///// 14 00009 //// 010 -0006 02 02 -0001 ////
+ -0024 //// 00100 -0012 00000 -0001 00000 00198 -0012 0000 0110
+ -0012 0000 //// 01030 10 02 -0010 130 0070 // -0010 /// ////
+ -0360 /// 0120 ///// -0024 // //// -0001 //// //// ///// /////
+ ///// ///// -0024 //// //// ///// ///// ///// ///// //// ////
+ //+
+ 11 659 Pribyslav 1 2007 11 21 18 00 4958278 01576278
+ 05325 05364 09520 10177 0000 04 //// ///// ///// 00201 -0070
+ -0130 096 00624 0110 00096 ///// ///// 100 07 08 0012 36 61 60
+ 0001 01 08 07 0012 0001 // // // //// // 07 /// 08 /// 09 ///
+ // ///// ///// // ///// ///// 14 00018 //// 010 -0006 04 02 -0001
+ //// -0024 //// 00096 -0012 00000 -0001 00000 00201 -0012 0000
+ -0070 -0012 0000 //// 01408 10 02 -0010 150 0050 // -0010 ///
+ //// -0360 /// //// ///// -0024 // //// -0001 //// //// /////
+ ///// ///// ///// -0024 //// //// ///// ///// ///// ///// ////
+ //// //+
+ 11 723 Brno-Turany 1 2007 11 21 18 00 4915306 01668889
+ 02410 02457 09872 10177 0001 00 //// ///// ///// 00200 0190 -0020
+ 086 00540 0500 00100 ///// ///// 100 07 08 0051 35 61 60 0001
+ 01 08 06 0051 0001 // // // //// // 07 /// 08 /// 09 /// // /////
+ ///// // ///// ///// // 00000 //// 010 -0006 02 02 -0001 ////
+ -0024 //// 00100 -0012 00000 -0001 00000 00200 -0012 0000 0210
+ -0012 0000 //// 00800 10 02 -0010 010 0010 // -0010 /// ////
+ -0360 /// //// ///// -0024 // //// -0001 //// //// ///// /////
+ ///// ///// -0024 //// //// ///// ///// ///// ///// //// ////
+ //+
+ 11 782 Ostrava-Mosnov 1 2007 11 21 18 00 4969750 01812083
+ 02504 02601 09842 10163 0003 03 //// ///// ///// 00200 0250 -0020
+ 082 01100 1200 00100 ///// ///// 025 08 01 0390 30 24 12 0001
+ 01 01 03 0390 0001 // // // //// // 07 /// 08 /// 09 /// // /////
+ ///// // ///// ///// // 00000 //// 508 -0006 10 10 -0001 ////
+ -0024 //// 00100 -0012 00000 -0001 00000 00200 -0012 0000 0600
+ -0012 0000 //// 01000 10 02 -0010 240 0070 // -0010 /// ////
+ -0360 /// //// ///// -0024 // //// -0001 //// //// ///// /////
+ ///// ///// -0024 //// //// ///// ///// ///// ///// //// ////
+ //++
+7777
+CREX++
+T0002031300 A000002 P00089000 U00 S007 Y20071121 H0000 D07080
+++
+ 11 423 Primda 0 2007 11 21 00 00 4966944 01267778
+ 07422 07470 09269 ///// -0009 05 //// 09250 00764 00195 -0260
+ -0280 099 00196 0030 00112 ///// ///// /// // // 0003 // // //
+ 0002 05 09 // 0003 // // // //// 0001 11 // // //// // 07 ///
+ 08 /// 09 /// // ///// ///// // ///// ///// // ///// //// 185
+ -0006 17 13 -0001 //// -0024 0000 00112 -0006 -00001 -0001 -00001
+ 00195 -0012 0000 //// -0012 0000 //// 01025 10 02 -0010 100 0070
+ // -0010 /// //// -0360 /// //// ///// -0024 // //// -0001 ////
+ //// ///// ///// ///// ///// -0024 //// //// ///// ///// /////
+ ///// //// //// //+
+ 11 487 Kocelovice 1 2007 11 21 00 00 4946500 01383111
+ 05190 05219 09544 10185 -0008 07 //// ///// ///// 00200 -0110
+ -0120 099 00490 0250 00101 ///// ///// 100 07 08 0012 36 61 60
+ 0002 01 08 07 0012 // // // //// 0001 // // // //// // 07 ///
+ 08 /// 09 /// // ///// ///// // ///// ///// // ///// //// 010
+ -0006 02 02 -0001 //// -0024 0000 00101 -0006 00000 -0001 00000
+ 00200 -0012 0000 //// -0012 0000 //// 01015 10 02 -0010 140 0060
+ // -0010 /// //// -0360 /// //// ///// -0024 // //// -0001 ////
+ //// ///// ///// ///// ///// -0024 //// //// ///// ///// /////
+ ///// //// //// //+
+ 11 518 Praha-Ruzyne 1 2007 11 21 00 00 5010083 01425778
+ 03640 03653 09738 10190 -0007 07 //// ///// ///// 00200 0010
+ -0150 089 00170 0900 00102 ///// ///// 100 07 08 0027 36 61 60
+ 0002 01 08 07 0027 // // // //// 0001 // // // //// // 07 ///
+ 08 /// 09 /// // ///// ///// // ///// ///// // ///// //// 010
+ -0006 02 02 -0001 //// -0024 0000 00102 -0006 00000 -0001 00000
+ 00200 -0012 0000 //// -0012 0000 //// 01000 10 02 -0010 140 0040
+ // -0010 /// //// -0360 /// //// ///// -0024 // //// -0001 ////
+ //// ///// ///// ///// ///// -0024 //// //// ///// ///// /////
+ ///// //// //// //+
+ 11 603 Liberec 0 2007 11 21 00 00 5077000 01502417
+ 03977 04015 09690 10183 -0006 05 //// ///// ///// 00198 0130
+ -0100 085 00190 1000 00100 ///// ///// /// // // 0039 // // //
+ 0002 21 05 // 0039 22 07 // 0270 0001 // // // //// // 07 ///
+ 08 /// 09 /// // ///// ///// // ///// ///// // ///// //// 100
+ -0006 11 10 -0001 //// -0024 0000 00100 -0006 00000 -0001 00000
+ 00198 -0012 0000 //// -0012 0000 //// 01030 10 02 -0010 140 0060
+ // -0010 /// //// -0360 /// 0130 ///// -0024 // //// -0001 ////
+ //// ///// ///// ///// ///// -0024 //// //// ///// ///// /////
+ ///// //// //// //+
+ 11 659 Pribyslav 1 2007 11 21 00 00 4958278 01576278
+ 05325 05364 09539 10198 -0005 07 //// ///// ///// 00201 -0100
+ -0180 094 00624 0360 00096 ///// ///// 100 07 08 0015 35 61 60
+ 0002 01 08 07 0015 // // // //// 0001 // // // //// // 07 ///
+ 08 /// 09 /// // ///// ///// // ///// ///// // ///// //// 010
+ -0006 02 02 -0001 //// -0024 0000 00096 -0006 00000 -0001 00000
+ 00201 -0012 0000 //// -0012 0000 //// 01408 10 02 -0010 140 0090
+ // -0010 /// //// -0360 /// 0170 ///// -0024 // //// -0001 ////
+ //// ///// ///// ///// ///// -0024 //// //// ///// ///// /////
+ ///// //// //// //+
+ 11 723 Brno-Turany 1 2007 11 21 00 00 4915306 01668889
+ 02410 02457 09900 10206 -0012 07 //// ///// ///// 00200 0170
+ 0010 089 00540 0700 00100 ///// ///// 100 07 08 0033 36 61 60
+ 0002 01 08 07 0033 // // // //// 0001 // // // //// // 07 ///
+ 08 /// 09 /// // ///// ///// // ///// ///// // ///// //// 010
+ -0006 02 02 -0001 //// -0024 0000 00100 -0006 00000 -0001 00000
+ 00200 -0012 0000 //// -0012 0000 //// 00800 10 02 -0010 230 0010
+ // -0010 /// //// -0360 /// //// ///// -0024 // //// -0001 ////
+ //// ///// ///// ///// ///// -0024 //// //// ///// ///// /////
+ ///// //// //// //+
+ 11 782 Ostrava-Mosnov 1 2007 11 21 00 00 4969750 01812083
+ 02504 02601 09878 10201 -0013 07 //// ///// ///// 00200 0130
+ -0170 081 01100 1800 00100 ///// ///// 025 00 00 0600 30 20 19
+ 0002 01 02 01 0600 // // // //// 0001 // // // //// // 07 ///
+ 08 /// 09 /// // ///// ///// // ///// ///// // ///// //// 508
+ -0006 10 10 -0001 //// -0024 0084 00100 -0006 00000 -0001 00000
+ 00200 -0012 0000 //// -0012 0000 //// 01000 10 02 -0010 240 0050
+ // -0010 /// //// -0360 /// //// ///// -0024 // //// -0001 ////
+ //// ///// ///// ///// ///// -0024 //// //// ///// ///// /////
+ ///// //// //// //++
+7777
diff --git a/data/IUSD40_OKLI.bufr b/data/IUSD40_OKLI.bufr
new file mode 100755
index 0000000..6bf87a5
Binary files /dev/null and b/data/IUSD40_OKLI.bufr differ
diff --git a/data/IUSD40_OKLI.crex b/data/IUSD40_OKLI.crex
new file mode 100755
index 0000000..6331dee
--- /dev/null
+++ b/data/IUSD40_OKLI.crex
@@ -0,0 +1,303 @@
+CREX++
+T000103 A002 D09052++
+ 11 520 ///////// 080 04 006 05 18 2007 11 20 17 30 00 5000833
+ 01444806 03020 03034 000304 // 07 08 0040 36 61 60 // ///// 0082
+ 00000 200000 10000 00160 0000000 00000000 //// //// /// ////
+ 00000 434000 09823 00304 0001000 00001000 0205 -0085 156 0013
+ 00088 200000 09250 00785 0001000 00001000 -0255 -0275 161 0039
+ 00125 030000 08989 01012 0001000 00001000 -0405 -0405 174 0037
+ 00130 030000 08951 01046 0001000 00001000 -0395 -0445 176 0036
+ 00135 020000 08917 01076 0001000 00001000 0315 -0415 179 0036
+ 00140 010000 08882 01108 0001000 00001000 0545 -0855 182 0035
+ 00145 020000 08848 01140 0001000 00001000 0655 -1105 186 0035
+ 00155 020000 08787 01196 0001000 00001000 0715 -1275 193 0034
+ 00199 200000 08500 01470 0001000 00001000 0735 -1465 230 0036
+ 00210 010000 08429 01538 0001000 00001000 0775 -1765 236 0038
+ 00255 030000 08158 01807 0001000 00001000 0755 -0975 244 0047
+ 00420 010000 07160 02869 0002000 00002000 0115 -1175 227 0042
+ 00446 200000 07000 03051 0002000 00002000 0035 -1355 233 0049
+ 00480 004000 06820 03258 0002000 00002000 -0125 -1565 241 0056
+ 00570 020000 06326 03854 0002000 00003000 -0495 -2375 224 0075
+ 00605 004000 06140 04089 0002000 00003000 -0515 -3065 216 0075
+ 00620 010000 06057 04196 0002000 00003000 -0565 -3345 216 0072
+ 00635 030000 05983 04292 0003000 00003000 -0605 -2005 218 0068
+ 00730 004000 05520 04916 0003000 00004000 -1175 -1735 239 0085
+ 00755 020000 05401 05082 0003000 00004000 -1335 -1755 246 0084
+ 00840 010000 05004 05659 0003000 00005000 -1715 -2015 277 0078
+ 00841 200000 05000 05665 0003000 00005000 -1715 -2025 277 0078
+ 00860 004000 04923 05781 0003000 00005000 -1795 -2165 281 0081
+ 00920 010000 04658 06192 0003000 00006000 -2075 -2595 283 0078
+ 00935 010000 04596 06292 0003000 00006000 -2145 -3095 284 0074
+ 00975 030000 04435 06553 0003000 00007000 -2385 -3085 288 0064
+ 00980 030000 04414 06587 0003000 00007000 -2385 -3605 289 0063
+ 01085 030000 04009 07281 0003000 00007000 -2995 -3395 311 0050
+ 01087 200000 04000 07298 0003000 00007000 -3005 -3405 311 0050
+ 01100 004000 03943 07399 0003000 00007000 -3075 -3595 313 0043
+ 01140 004000 03794 07672 0003000 00008000 -3265 -4215 335 0030
+ 01190 004000 03620 08000 0002000 00008000 -3535 -4755 338 0057
+ 01200 010000 03585 08069 0002000 00008000 -3575 -4885 330 0061
+ 01245 004000 03422 08389 0002000 00008000 -3845 -4865 275 0084
+ 01280 004000 03315 08607 0002000 00008000 -4045 -4985 271 0107
+ 01335 010000 03131 08993 0002000 00009000 -4395 -5145 297 0139
+ 01380 200000 03000 09279 0002000 00010000 -4615 -5985 308 0169
+ 01380 014000 02999 09280 0002000 00010000 -4615 -5975 308 0169
+ 01420 004000 02870 09570 0001000 00011000 -4875 -6005 309 0162
+ 01505 004000 02635 10127 0001000 00013000 -5395 -6305 257 0158
+ 01555 200000 02500 10461 0001000 00014000 -5695 -6485 258 0172
+ 01585 020000 02420 10666 0001000 00014000 -5895 -6575 266 0178
+ 01660 004000 02231 11172 0001000 00016000 -6325 -6795 290 0192
+ 01680 010000 02180 11313 0001000 00017000 -6435 -6895 292 0197
+ 01750 004000 02020 11774 0001000 00019000 -6755 -7225 289 0224
+ 01759 200000 02000 11834 0000000 00019000 -6805 -7275 290 0224
+ 01820 120000 01855 12284 0000000 00021000 -7125 -7615 303 0187
+ 01860 004000 01755 12614 0000000 00021000 -6875 -7385 311 0130
+ 01890 030000 01689 12841 -0001000 00022000 -6605 -7175 310 0080
+ 01900 004000 01667 12923 -0001000 00022000 -6615 -7245 307 0068
+ 01915 004000 01632 13050 -0001000 00022000 -6675 -7375 297 0060
+ 01950 004000 01578 13253 -0001000 00022000 -6685 -7535 280 0087
+ 01989 200000 01500 13560 -0001000 00023000 -6595 -7665 287 0112
+ 02010 020000 01459 13728 -0001000 00023000 -6435 -7645 290 0103
+ 02050 010000 01386 14042 -0001000 00023000 -6575 -7975 286 0082
+ 02085 004000 01327 14308 -0001000 00024000 -6585 -8115 284 0079
+ 02140 004000 01233 14757 -0001000 00024000 -6405 -8155 301 0051
+ 02235 004000 01101 15446 -0001000 00025000 -6415 -8395 286 0082
+ 02320 034000 01004 16012 -0002000 00026000 -6375 -8485 302 0089
+ 02323 200000 01000 16035 -0002000 00026000 -6385 -8435 303 0087
+ 02430 004000 00882 16804 -0002000 00027000 -6375 -8615 287 0099
+ 02480 020000 00836 17136 -0002000 00028000 -6295 -8605 292 0121
+ 02550 004000 00771 17633 -0003000 00029000 -6505 -8795 307 0116
+ 02634 200000 00700 18218 -0003000 00030000 -6515 -8845 305 0100
+ 02964 200000 00500 20264 -0005000 00035000 -6635 -8935 296 0151
+ 03150 020000 00414 21399 -0007000 00039000 -6955 -9175 302 0180
+ 03215 004000 00387 21799 -0007000 00041000 -6835 -9095 293 0192
+ 03365 004000 00328 22793 -0009000 00044000 -6855 -9115 310 0201
+ 03454 200000 00300 23325 -0010000 00046000 -6895 -9135 295 0218
+ 03500 004000 00286 23605 -0010000 00048000 -6825 -9105 289 0221
+ 03842 200000 00200 25750 -0013000 00059000 -6975 -9195 294 0288
+ 03860 020000 00196 25863 -0013000 00059000 -6985 -9255 295 0287
+ 03975 004000 00173 26623 -0015000 00063000 -6865 -9195 298 0283
+ 04060 004000 00157 27187 -0015000 00066000 -6865 -9215 283 0312
+ 04095 020000 00151 27416 -0016000 00068000 -6735 -9145 284 0312
+ 04150 004000 00142 27788 -0016000 00070000 -6875 -9235 294 0288
+ 04270 020000 00124 28627 -0017000 00075000 -6935 -9275 286 0376
+ 04315 044000 00118 28925 -0018000 00077000 -6695 -9165 285 0392
+ 04345 020000 00114 29111 -0018000 00079000 -6615 -9115 285 0381
+ 04370 004100 00111 29265 -0018000 00080000 -6655 -9125 285 0374
+ 04375 030000 00111 29295 /////// //////// -6645 -9115 /// ////
+ 0001 04315 044000 00118 -0018000 00077000 0113 ////++
+7777
+CREX++
+T000103 A002 D09052++
+ 11 520 ///////// 080 04 006 05 18 2007 11 20 11 15 00 5000833
+ 01444806 03020 03034 000304 // 07 08 0040 36 61 60 // ///// 0075
+ 00000 200000 10000 00161 0000000 00000000 //// //// /// ////
+ 00000 434000 09825 00304 0001000 00001000 0245 -0075 170 0013
+ 00080 200000 09251 00786 0001000 00001000 -0235 -0265 168 0032
+ 00130 030000 08894 01098 0001000 00001000 -0455 -0475 199 0045
+ 00135 020000 08857 01130 0001000 00001000 -0175 -0385 202 0046
+ 00140 020000 08824 01160 0001000 00001000 0275 -0555 205 0048
+ 00145 010000 08792 01190 0001000 00001000 0445 -0745 207 0049
+ 00155 020000 08727 01251 0001000 00001000 0675 -1045 211 0052
+ 00160 004000 08694 01282 0001000 00001000 0675 -1145 212 0053
+ 00190 200000 08500 01467 0001000 00001000 0645 -1605 210 0060
+ 00285 030000 07934 02032 0002000 00001000 0685 -2705 206 0068
+ 00440 010000 07033 03009 0003000 00002000 0115 -3995 200 0105
+ 00445 004000 07007 03039 0003000 00002000 0095 -3825 200 0106
+ 00446 200000 07000 03046 0003000 00002000 0085 -3905 200 0106
+ 00590 010000 06252 03942 0004000 00003000 -0595 -3505 219 0070
+ 00615 010000 06132 04093 0004000 00003000 -0715 -2115 221 0072
+ 00625 004000 06082 04157 0004000 00003000 -0765 -2305 222 0074
+ 00640 010000 06008 04252 0004000 00003000 -0815 -4835 222 0076
+ 00670 010000 05863 04440 0004000 00003000 -0915 -2395 220 0076
+ 00730 004000 05566 04840 0005000 00004000 -1205 -2815 214 0069
+ 00810 030000 05216 05335 0005000 00004000 -1545 -3465 232 0066
+ 00850 010000 05038 05595 0005000 00005000 -1765 -3615 238 0053
+ 00859 200000 05000 05652 0005000 00005000 -1805 -3315 242 0050
+ 00870 004000 04953 05722 0005000 00005000 -1875 -3085 248 0047
+ 00910 004000 04787 05974 0005000 00005000 -2065 -2675 265 0057
+ 00925 010000 04724 06072 0005000 00005000 -2155 -2635 264 0066
+ 01000 004000 04427 06548 0005000 00006000 -2525 -2905 255 0103
+ 01075 030000 04144 07024 0006000 00007000 -2925 -3245 264 0102
+ 01115 200000 04000 07275 0006000 00008000 -3115 -3495 279 0102
+ 01140 004000 03912 07433 0005000 00008000 -3225 -3655 285 0109
+ 01220 020000 03638 07941 0005000 00009000 -3605 -4065 288 0143
+ 01360 010000 03176 08867 0005000 00012000 -4395 -4705 287 0161
+ 01420 200000 03000 09247 0004000 00013000 -4725 -5165 290 0174
+ 01480 004000 02831 09628 0004000 00015000 -5045 -5605 293 0197
+ 01602 200000 02500 10425 0003000 00018000 -5785 -6365 289 0205
+ 01655 030000 02365 10772 0003000 00019000 -6105 -6715 295 0193
+ 01740 004000 02163 11322 0002000 00021000 -6545 -7185 302 0176
+ 01810 200000 02000 11794 0002000 00023000 -6765 -7395 287 0182
+ 01875 130000 01867 12207 0001000 00025000 -6925 -7575 282 0238
+ 01880 004000 01856 12242 0001000 00025000 -6925 -7575 283 0239
+ 01965 004000 01666 12893 0001000 00027000 -6735 -7595 303 0131
+ 02030 004000 01556 13307 0000000 00028000 -6465 -7875 296 0084
+ 02063 200000 01500 13531 0000000 00028000 -6425 -8075 283 0079
+ 02065 010000 01495 13552 0000000 00028000 -6425 -8085 283 0079
+ 02085 004000 01455 13716 0000000 00028000 -6495 -8235 280 0087
+ 02185 004000 01290 14453 0000000 00029000 -6275 -8435 284 0062
+ 02255 020000 01196 14922 0000000 00030000 -6145 -8485 276 0083
+ 02400 034000 01002 16008 0000000 00032000 -6405 -8745 263 0089
+ 02402 200000 01000 16023 0000000 00032000 -6415 -8765 263 0089
+ 02490 020000 00899 16675 0000000 00033000 -6255 -8705 293 0102
+ 02520 004000 00866 16905 0000000 00033000 -6405 -8805 301 0093
+ 02690 004000 00729 17960 -0001000 00035000 -6355 -8805 286 0113
+ 02736 200000 00700 18210 -0001000 00036000 -6315 -8925 289 0141
+ 02790 020000 00665 18522 -0001000 00037000 -6295 -8805 295 0141
+ 02955 004000 00566 19511 -0002000 00040000 -6575 -8995 295 0148
+ 03030 004000 00528 19934 -0002000 00041000 -6645 -9055 278 0146
+ 03090 200000 00500 20260 -0003000 00043000 -6645 -8945 281 0158
+ 03185 004000 00458 20795 -0003000 00045000 -6745 -9085 294 0170
+ 03410 004000 00365 22143 -0005000 00051000 -6985 -9235 293 0232
+ 03480 004000 00341 22559 -0005000 00053000 -7085 -9295 301 0211
+ 03525 020000 00325 22838 -0006000 00054000 -7135 -9325 300 0206
+ 03602 200000 00300 23313 -0006000 00056000 -6995 -9215 300 0218
+ 03760 020000 00254 24308 -0008000 00060000 -6765 -9105 298 0206
+ 03905 004000 00218 25231 -0009000 00064000 -6845 -9155 289 0226
+ 03980 200000 00200 25736 -0010000 00066000 -6965 -9195 285 0258
+ 04070 020000 00180 26361 -0010000 00069000 -7205 -9355 291 0280
+ 04340 020000 00133 28168 -0013000 00080000 -6335 -8815 281 0371
+ 04580 020000 00101 29850 -0014000 00092000 -6635 -8945 282 0377
+ 04589 200000 00100 29914 -0014000 00093000 -6585 -8895 281 0381
+ 04645 020000 00094 30308 -0015000 00096000 -6315 -8755 280 0417
+ 04690 004000 00089 30627 -0015000 00098000 -6475 -8825 278 0436
+ 04740 020000 00084 30953 -0015000 00101000 -6425 -8795 274 0417
+ 04765 004000 00082 31117 -0015000 00103000 -6305 -8735 272 0414
+ 04880 044100 00073 31869 -0015000 00110000 -5855 -8445 270 0518
+ 04890 030000 00072 31938 /////// //////// -5805 -8375 /// ////
+ 0001 04880 044000 00073 -0015000 00110000 0105 ////++
+7777
+CREX++
+T000103 A002 D09052++
+ 11 520 ///////// 080 04 006 05 18 2007 11 20 05 29 00 5000833
+ 01444806 03020 03034 000304 // 07 07 0040 36 61 60 // ///// 0057
+ 00000 200000 10000 00154 0000000 00000000 //// //// /// ////
+ 00000 434000 09816 00304 0001000 00001000 0115 -0065 079 0021
+ 00088 200000 09250 00780 0001000 00000000 -0215 -0255 148 0044
+ 00125 030000 08989 01007 0001000 00000000 -0395 -0395 182 0059
+ 00130 024000 08956 01036 0001000 00000000 -0305 -0315 186 0063
+ 00140 020000 08891 01094 0001000 00000000 0505 -0435 192 0072
+ 00150 030000 08828 01153 0001000 00000000 0635 -1005 197 0080
+ 00190 004000 08570 01395 0002000 00001000 0545 -1585 202 0098
+ 00201 200000 08500 01462 0002000 00001000 0495 -1625 199 0098
+ 00220 020000 08377 01580 0002000 00001000 0445 -1565 190 0098
+ 00260 020000 08127 01827 0002000 00001000 0665 -2795 167 0097
+ 00300 004000 07881 02079 0002000 00000000 0595 -2175 154 0093
+ 00310 030000 07818 02145 0003000 00000000 0605 -3395 154 0093
+ 00442 200000 07000 03041 0004000 00000000 0045 -2535 173 0088
+ 00470 020000 06841 03223 0004000 00000000 -0045 -2885 179 0088
+ 00600 004000 06132 04086 0005000 00000000 -0735 -3665 205 0087
+ 00730 004000 05490 04935 0006000 00001000 -1465 -4355 203 0114
+ 00810 030000 05114 05467 0006000 00002000 -1945 -4975 223 0092
+ 00833 200000 05000 05635 0007000 00002000 -2025 -5105 230 0081
+ 00840 010000 04967 05683 0007000 00002000 -2055 -5185 231 0080
+ 00915 010000 04637 06187 0007000 00002000 -2415 -3095 241 0070
+ 00925 004000 04595 06254 0007000 00003000 -2475 -3135 244 0068
+ 01005 010000 04234 06845 0007000 00004000 -2835 -3845 268 0127
+ 01060 200000 04000 07250 0007000 00004000 -3125 -3665 282 0123
+ 01065 030000 03980 07285 0007000 00005000 -3145 -3745 284 0122
+ 01095 004000 03861 07498 0007000 00005000 -3335 -3995 292 0127
+ 01170 010000 03577 08030 0006000 00006000 -3785 -4545 298 0146
+ 01205 020000 03452 08274 0006000 00007000 -4005 -4475 296 0155
+ 01340 010000 03029 09153 0005000 00010000 -4715 -5045 298 0199
+ 01349 200000 03000 09217 0005000 00010000 -4755 -5085 299 0201
+ 01524 200000 02500 10395 0003000 00015000 -5735 -6065 298 0250
+ 01600 020000 02312 10884 0003000 00018000 -6175 -6505 299 0272
+ 01645 004000 02189 11220 0002000 00019000 -6395 -6765 299 0296
+ 01724 200000 02000 11768 0001000 00022000 -6785 -7175 296 0239
+ 01765 030000 01910 12043 0001000 00023000 -6845 -7185 293 0219
+ 01835 134000 01744 12586 0001000 00025000 -7045 -7405 277 0230
+ 01905 020000 01582 13176 0000000 00027000 -6265 -7135 291 0100
+ 01946 200000 01500 13504 0000000 00027000 -6425 -7625 294 0064
+ 01950 004000 01492 13539 0000000 00027000 -6435 -7665 292 0063
+ 01960 010000 01472 13621 0000000 00027000 -6405 -7695 289 0063
+ 02065 004000 01279 14489 0000000 00028000 -6175 -8045 263 0076
+ 02255 034000 01005 15973 0000000 00030000 -6305 -8425 290 0068
+ 02259 200000 01000 16004 0000000 00030000 -6305 -8375 291 0067
+ 02400 020000 00847 17025 0000000 00032000 -6235 -8435 289 0100
+ 02525 004000 00748 17787 -0001000 00034000 -6305 -8535 286 0106
+ 02592 200000 00700 18197 -0001000 00034000 -6365 -8555 294 0094
+ 02855 020000 00540 19784 -0002000 00039000 -6435 -8715 297 0187
+ 02920 004000 00505 20186 -0003000 00041000 -6545 -8795 305 0193
+ 02930 200000 00500 20248 -0003000 00041000 -6585 -8815 305 0189
+ 02985 020000 00472 20595 -0004000 00042000 -6815 -8975 298 0172
+ 03270 004000 00349 22404 -0006000 00049000 -7025 -9115 290 0204
+ 03325 020000 00329 22760 -0006000 00051000 -7095 -9155 294 0216
+ 03413 200000 00300 23303 -0007000 00053000 -7005 -9065 290 0214
+ 03645 004000 00232 24822 -0009000 00060000 -7095 -9175 306 0261
+ 03770 020000 00204 25606 -0010000 00064000 -7125 -9195 298 0265
+ 03786 200000 00200 25710 -0011000 00064000 -7105 -9145 298 0264
+ 04045 034000 00151 27394 -0013000 00073000 -6835 -9035 283 0299
+ 0000++
+7777
+CREX++
+T000103 A002 D09052++
+ 11 520 ///////// 080 04 006 05 18 2007 11 19 23 15 00 5000833
+ 01444806 03020 03034 000304 // 07 07 0080 36 61 60 // ///// 0065
+ 00000 200000 10000 00162 0000000 00000000 //// //// /// ////
+ 00000 434000 09826 00304 0001000 00001000 0065 -0085 094 0026
+ 00015 020000 09742 00373 0001000 00001000 0165 -0065 100 0039
+ 00093 200000 09250 00789 0001000 00000000 -0135 -0195 131 0039
+ 00120 034000 09084 00933 0001000 00000000 -0235 -0235 152 0049
+ 00135 020000 08997 01010 0001000 00000000 -0035 -0195 161 0061
+ 00145 020000 08934 01067 0001000 00000000 0245 -0295 165 0071
+ 00150 020000 08905 01093 0001000 00000000 0535 -0465 166 0076
+ 00165 030000 08816 01175 0001000 00000000 0625 -0495 168 0090
+ 00200 004000 08603 01375 0002000 00000000 0535 -0415 169 0107
+ 00218 200000 08500 01474 0002000 00000000 0555 -0415 171 0103
+ 00240 004000 08375 01595 0002000 00000000 0485 -0555 173 0096
+ 00340 030000 07782 02189 0003000 00000000 0175 -1025 155 0096
+ 00360 024000 07671 02305 0003000 -00001000 0365 -1415 155 0099
+ 00385 030000 07530 02456 0003000 -00001000 0335 -1885 159 0094
+ 00485 200000 07000 03042 0004000 -00001000 -0105 -1955 176 0075
+ 00495 004000 06947 03103 0004000 -00001000 -0155 -1955 176 0074
+ 00585 004000 06492 03638 0004000 -00001000 -0445 -2255 188 0108
+ 00600 030000 06426 03719 0005000 -00001000 -0485 -2315 189 0115
+ 00835 004000 05346 05133 0007000 00000000 -1615 -3815 196 0145
+ 00913 200000 05000 05631 0008000 00001000 -2035 -4515 201 0120
+ 01125 030000 04144 06990 0010000 00002000 -3225 -5635 202 0112
+ 01130 004000 04124 07023 0010000 00002000 -3245 -5645 202 0114
+ 01165 200000 04000 07238 0011000 00002000 -3355 -6215 207 0119
+ 01165 010000 03999 07240 0011000 00002000 -3355 -6165 207 0119
+ 01245 004000 03727 07730 0011000 00003000 -3735 -6085 220 0100
+ 01315 010000 03488 08182 0012000 00004000 -4125 -6265 247 0128
+ 01345 004000 03391 08374 0012000 00004000 -4205 -5075 256 0141
+ 01360 010000 03340 08477 0012000 00004000 -4265 -4995 257 0143
+ 01425 004000 03143 08883 0012000 00006000 -4585 -5375 252 0127
+ 01465 030000 03015 09160 0012000 00006000 -4785 -5525 261 0123
+ 01470 200000 03000 09192 0012000 00006000 -4825 -5555 263 0123
+ 01505 004000 02886 09446 0012000 00007000 -5055 -5675 279 0123
+ 01530 004000 02811 09618 0012000 00007000 -5185 -5725 289 0136
+ 01635 200000 02500 10365 0012000 00010000 -5855 -6335 296 0228
+ 01670 010000 02393 10639 0011000 00011000 -6125 -6545 300 0255
+ 01735 030000 02194 11170 0010000 00013000 -6595 -7015 300 0328
+ 01755 044000 02132 11345 0010000 00014000 -6635 -7065 299 0335
+ 01810 200000 02000 11730 0009000 00016000 -6755 -7155 294 0267
+ 01825 130000 01967 11830 0009000 00017000 -6805 -7185 292 0246
+ 01885 020000 01832 12260 0009000 00018000 -6715 -7235 283 0208
+ 01950 020000 01694 12740 0009000 00020000 -6045 -7195 280 0110
+ 01955 004000 01682 12783 0009000 00020000 -6055 -7255 280 0100
+ 01980 004000 01639 12944 0009000 00020000 -6135 -7575 271 0067
+ 01990 010000 01622 13011 0009000 00020000 -6155 -7665 265 0062
+ 02035 004000 01531 13367 0009000 00021000 -6035 -7845 249 0071
+ 02051 200000 01500 13495 0009000 00021000 -5995 -7905 249 0072
+ 02155 004000 01323 14275 0009000 00022000 -6135 -8355 272 0050
+ 02275 004000 01158 15099 0009000 00022000 -6235 -8545 236 0068
+ 02345 004000 01067 15605 0009000 00023000 -6255 -8575 261 0081
+ 02400 034000 01002 15989 0009000 00024000 -6255 -8605 260 0086
+ 02402 200000 01000 16003 0009000 00024000 -6245 -8635 260 0086
+ 02475 004000 00918 16532 0009000 00025000 -6235 -8645 294 0097
+ 02555 004000 00842 17066 0009000 00026000 -6245 -8725 277 0090
+ 02735 200000 00700 18202 0009000 00029000 -6235 -8865 290 0150
+ 02755 020000 00687 18319 0008000 00029000 -6195 -8805 292 0151
+ 02940 004000 00567 19489 0007000 00033000 -6565 -9105 309 0153
+ 03050 200000 00500 20253 0006000 00034000 -6795 -9215 298 0135
+ 03060 120000 00495 20319 0006000 00034000 -6835 -9235 297 0133
+ 03135 004000 00457 20794 0006000 00036000 -6815 -9195 292 0146
+ 03245 004000 00406 21504 0005000 00038000 -6945 -9255 306 0179
+ 03440 004000 00332 22695 0004000 00042000 -6895 -9215 299 0212
+ 03536 200000 00300 23305 0003000 00045000 -6985 -9205 303 0192
+ 03640 004100 00271 23915 0002000 00047000 -7065 -9355 296 0173
+ 03645 030000 00269 23943 /////// //////// -7025 -9335 /// ////
+ 0001 01755 044000 02132 0010000 00014000 0113 0156++
+7777
diff --git a/data/acar.crex b/data/acar.crex
new file mode 100755
index 0000000..47a727d
--- /dev/null
+++ b/data/acar.crex
@@ -0,0 +1,8 @@
+CREX++
+T000103 A004 B01006 B01008 B02061 B02062 B02002 B02005
+ B02070 B02063 B02001 B04001 B04002 B04003 B04004 B04005 B05002
+ B06002 B08004 B07004 B08021 B11001 B11002 B11031 B11034 B11035
+ B12001 B12003 B13003 B20041++
+ 00001008 JEWEITRA / 03 04 025 10 ///// 0 2003 12 21 21 01 3400
+ -08501 / 06318 // 296 0093 // //// ///// -035 /// /// //++
+7777
diff --git a/data/airep.bufr b/data/airep.bufr
new file mode 100755
index 0000000..1b42f00
Binary files /dev/null and b/data/airep.bufr differ
diff --git a/data/amdar.crex b/data/amdar.crex
new file mode 100755
index 0000000..0b61c7b
--- /dev/null
+++ b/data/amdar.crex
@@ -0,0 +1,5 @@
+CREX++
+T000103 A004 D11001++
+ 00001008 0 2003 11 05 00 00 3150500 01311833 3 01005 -482 318
+ 0293 // ///// ///// //++
+7777
diff --git a/data/buoy.crex b/data/buoy.crex
new file mode 100755
index 0000000..1e5a0a8
--- /dev/null
+++ b/data/buoy.crex
@@ -0,0 +1,6 @@
+CREX++
+T000103 A001 D08003 E++
+ 148583 2/// 3/// 40 52003 611 725 815 910 08336 1-14709 2/////
+ 310114 4//// 5// 6/// 7//// 8/// 9/// 0/// 1//// 2/// 3// 4//
+ 5/// 6// 7// 8//// 9// 0// 1// 2////++
+7777
diff --git a/data/gaussian.grib b/data/gaussian.grib
new file mode 100755
index 0000000..998ee49
Binary files /dev/null and b/data/gaussian.grib differ
diff --git a/data/latlon.grib b/data/latlon.grib
new file mode 100755
index 0000000..c5f6080
Binary files /dev/null and b/data/latlon.grib differ
diff --git a/data/reduced_gg.grib b/data/reduced_gg.grib
new file mode 100755
index 0000000..84b716b
Binary files /dev/null and b/data/reduced_gg.grib differ
diff --git a/data/satob.crex b/data/satob.crex
new file mode 100755
index 0000000..82520ac
--- /dev/null
+++ b/data/satob.crex
@@ -0,0 +1,15 @@
+CREX++
+T000103 A005 D01043 D04001++
+ 0254 01 2003 12 21 23 00 00 3990000 -08950000 02 02600 -495 285
+ 0267+
+ 0254 01 2003 12 21 23 00 00 3990000 -08950000 02 02600 -495 280
+ 0267+
+ 0254 01 2003 12 21 23 00 00 3960000 -08890000 02 03100 -395 285
+ 0216+
+ 0254 01 2003 12 21 23 00 00 3980000 -08790000 02 02800 -473 285
+ 0231+
+ 0254 01 2003 12 21 23 00 00 3850000 -08960000 02 02600 -511 290
+ 0236+
+ 0254 01 2003 12 21 23 00 00 3830000 -08970000 02 02200 -519 290
+ 0241++
+7777
diff --git a/data/spectral.grib b/data/spectral.grib
new file mode 100755
index 0000000..3403817
Binary files /dev/null and b/data/spectral.grib differ
diff --git a/data/synop.crex b/data/synop.crex
new file mode 100755
index 0000000..258cd80
--- /dev/null
+++ b/data/synop.crex
@@ -0,0 +1,7 @@
+CREX++
+T000103 A000 D07005 B13023 B13013 E++
+ 110 2033 31 42003 512 621 722 800 95483000 000950000 100033 209917
+ 309958 40041 5// 6300 70100 8011 9-005 0/// 12500 2002 301 401
+ 5025 601 702 80175 935 020 110 201 307 406 50152 602 7// 8//
+ 9//// 003 1// 2// 3//// 4// 5// 6// 7//// 8///// 9/////++
+7777
diff --git a/data/synop_ship.crex b/data/synop_ship.crex
new file mode 100755
index 0000000..ba63daa
--- /dev/null
+++ b/data/synop_ship.crex
@@ -0,0 +1,6 @@
+CREX++
+T000103 A001 D08004 B12005 B10197 E++
+ 1000001009 2315 3009 41 52003 611 705 806 900 0-0800 1-00320
+ 2///// 310134 40001 500 6150 70080 8220 9171 0/// 12000 2003
+ 302 402 5090 601 707 80045 937 025 116 22948 3190 4///++
+7777
diff --git a/data/temp.crex b/data/temp.crex
new file mode 100755
index 0000000..11b0e36
--- /dev/null
+++ b/data/temp.crex
@@ -0,0 +1,41 @@
+CREX++
+T000103 A002 D09007 R04000 B07004 B08001 B11061 B11062
+ E++
+ 161 2052 3/// 4// 52003 612 721 822 900 01348000 100217000 200227
+ 3/// 4// 5// 6//// 7// 8// 9// 00052 110000 2040 3000126 4///
+ 5/// 6/// 7//// 809890 9100 0000223 1234 2-046 3020 40020 509250
+ 6040 7000792 8228 9-092 0065 10100 208500 3040 4001505 5184 6-216
+ 7080 80060 907000 0040 1003114 2094 3-066 4225 50060 605000 7040
+ 8005766 9-059 0-539 1145 20040 304000 4040 5007443 6-159 7-609
+ 8280 90040 003000 1040 2009493 3-335 4-605 5345 60140 702500
+ 8040 9010719 0-437 1/// 2305 30150 402000 5040 6012160 7-555
+ 8/// 9280 00180 101500 2040 3013896 4-695 5/// 6250 70310 801420
+ 9010 0////// 1/// 2/// 3260 40320 501000 6040 7016240 8-785 9///
+ 0265 10090 200970 3024 4////// 5-799 6/// 7245 80070 900943 0002
+ 1////// 2/// 3/// 4240 50060 600882 7002 8////// 9/// 0/// 1325
+ 20050 300839 4002 5////// 6/// 7/// 8035 90050 000817 1002 2//////
+ 3/// 4/// 5105 60050 700799 8002 9////// 0/// 1/// 2145 30060
+ 400768 5004 6////// 7-819 8/// 9/// 0//// 100700 2044 3018221
+ 4-757 5/// 6215 70050 800668 9002 0////// 1/// 2/// 3245 40050
+ 500615 6004 7////// 8-717 9/// 0/// 1//// 200586 3002 4//////
+ 5/// 6/// 7150 80020 900575 0002 1////// 2/// 3/// 4055 50030
+ 600539 7002 8////// 9/// 0/// 1065 20070 300511 4002 5//////
+ 6/// 7/// 8120 90100 000500 1040 2020172 3-697 4/// 5115 60100
+ 700494 8002 9////// 0/// 1/// 2110 30100 400474 5004 6//////
+ 7-689 8/// 9/// 0//// 100470 2002 3////// 4/// 5/// 6130 70070
+ 800444 9002 0////// 1/// 2/// 3100 40050 500424 6002 7//////
+ 8/// 9/// 0055 10040 200422 3004 4////// 5-641 6/// 7/// 8////
+ 900412 0002 1////// 2/// 3/// 4035 50050 600388 7002 8//////
+ 9/// 0/// 1045 20060 300386 4004 5////// 6-657 7/// 8/// 9////
+ 000369 1002 2////// 3/// 4/// 5075 60070 700356 8004 9//////
+ 0-619 1/// 2/// 3//// 400352 5002 6////// 7/// 8/// 9070 00100
+ 100335 2002 3////// 4/// 5/// 6090 70120 800316 9002 0//////
+ 1/// 2/// 3105 40090 500300 6040 7023232 8-605 9/// 0095 10080
+ 200297 3002 4////// 5/// 6/// 7085 80090 900294 0004 1//////
+ 2-605 3/// 4/// 5//// 600287 7002 8////// 9/// 0/// 1105 20080
+ 300263 4002 5////// 6/// 7/// 8070 90080 000254 1002 2//////
+ 3/// 4/// 5075 60100 700239 8002 9////// 0/// 1/// 2040 30090
+ 400222 5002 6////// 7/// 8/// 9090 00080 100209 2006 3//////
+ 4-523 5/// 6080 70090 800200 9040 0025762 1/// 2/// 3/// 4////
+ 50001 601420 7010 80070 90220++
+7777
diff --git a/data/tigge.grib2 b/data/tigge.grib2
new file mode 100755
index 0000000..bdaa618
Binary files /dev/null and b/data/tigge.grib2 differ
diff --git a/data/wmo_aws.bufr b/data/wmo_aws.bufr
new file mode 100755
index 0000000..18e1f6b
Binary files /dev/null and b/data/wmo_aws.bufr differ
diff --git a/data/wmo_aws_3.bufr b/data/wmo_aws_3.bufr
new file mode 100755
index 0000000..337bc4d
Binary files /dev/null and b/data/wmo_aws_3.bufr differ
diff --git a/data/wmo_buoy.bufr b/data/wmo_buoy.bufr
new file mode 100755
index 0000000..fc97f22
Binary files /dev/null and b/data/wmo_buoy.bufr differ
diff --git a/data/wmo_climat_synop.bufr b/data/wmo_climat_synop.bufr
new file mode 100755
index 0000000..342a740
Binary files /dev/null and b/data/wmo_climat_synop.bufr differ
diff --git a/data/wmo_climat_synop_2.bufr b/data/wmo_climat_synop_2.bufr
new file mode 100755
index 0000000..71dd4bb
Binary files /dev/null and b/data/wmo_climat_synop_2.bufr differ
diff --git a/data/wmo_sarep.bufr b/data/wmo_sarep.bufr
new file mode 100755
index 0000000..d292021
Binary files /dev/null and b/data/wmo_sarep.bufr differ
diff --git a/data/wmo_synop.bufr b/data/wmo_synop.bufr
new file mode 100755
index 0000000..89b7fce
Binary files /dev/null and b/data/wmo_synop.bufr differ
diff --git a/data/wmo_synop_1.bufr b/data/wmo_synop_1.bufr
new file mode 100755
index 0000000..8e0a7ff
Binary files /dev/null and b/data/wmo_synop_1.bufr differ
diff --git a/data/wmo_temp.bufr b/data/wmo_temp.bufr
new file mode 100755
index 0000000..dc5b02d
Binary files /dev/null and b/data/wmo_temp.bufr differ
diff --git a/data/wmo_temp_2.bufr b/data/wmo_temp_2.bufr
new file mode 100755
index 0000000..5939467
Binary files /dev/null and b/data/wmo_temp_2.bufr differ
diff --git a/examples/bufr/Makefile b/examples/bufr/Makefile
new file mode 100755
index 0000000..50fd241
--- /dev/null
+++ b/examples/bufr/Makefile
@@ -0,0 +1,46 @@
+#
+# Makefile for example programs
+#
+PLACE = ../../
+LIB = emos
+#
+include $(PLACE)config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include $(PLACE)options/options_$(ARCH)
+#
+include ../../config/fortran2c$(CNAME)
+#
+TARGDIR = ./
+#
+#
+TARGETS = all clean
+EXECS = decode_bufr decode_bufr_image bufr_decode tdexp create_bufr bufr2crex crex2bufr
+#
+#
+all :$(EXECS)
+
+decode_bufr: decode_bufr.o
+ $(FC) $(FFLAGS) -o $@ decode_bufr.o -L$(PLACE) -l$(LIB)$(R64)
+
+decode_bufr_image: decode_bufr_image.o
+ $(FC) $(FFLAGS) -o $@ decode_bufr_image.o -L$(PLACE) -l$(LIB)$(R64)
+
+bufr_decode: bufr_decode.o
+ $(CC) $(CFLAGS) -o $@ bufr_decode.o -L$(PLACE) -l$(LIB)$(R64) $(FORTRAN2C)
+
+bufr2crex : bufr2crex.o
+ $(FC) $(FFLAGS) -o $@ bufr2crex.o -L$(PLACE) -l$(LIB)$(R64)
+
+crex2bufr : crex2bufr.o
+ $(FC) $(FFLAGS) -o $@ crex2bufr.o -L$(PLACE) -l$(LIB)$(R64)
+
+create_bufr: create_bufr.o
+ $(FC) $(FFLAGS) -o $@ create_bufr.o -L$(PLACE) -l$(LIB)$(R64)
+
+tdexp: tdexp.o
+ $(FC) $(FFLAGS) -o $@ tdexp.o -L$(PLACE) -l$(LIB)$(R64)
+
+clean :
+ @for name in $(EXECS); do\
+ (rm -f $$name *.o ); \
+ done
diff --git a/examples/bufr/Makefile.in b/examples/bufr/Makefile.in
new file mode 100755
index 0000000..d943a56
--- /dev/null
+++ b/examples/bufr/Makefile.in
@@ -0,0 +1,50 @@
+#
+# Makefile for example programs
+A64 = plat
+R64 = reals
+ARCH = arch
+CNAME = comp
+#
+PLACE = ../../
+LIB = emos
+#
+include $(PLACE)config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include $(PLACE)options/options_$(ARCH)
+#
+include ../../config/fortran2c$(CNAME)
+#
+TARGDIR = ./
+#
+#
+TARGETS = all clean
+EXECS = decode_bufr decode_bufr_image bufr_decode create_bufr tdexp bufr2crex crex2bufr
+#
+#
+all :$(EXECS)
+
+decode_bufr: decode_bufr.o
+ $(FC) $(FFLAGS) -o $@ decode_bufr.o -L$(PLACE) -l$(LIB)$(R64)
+
+decode_bufr_image: decode_bufr_image.o
+ $(FC) $(FFLAGS) -o $@ decode_bufr_image.o -L$(PLACE) -l$(LIB)$(R64)
+
+bufr_decode: bufr_decode.o
+ $(CC) $(CFLAGS) -o $@ bufr_decode.o -L$(PLACE) -l$(LIB)$(R64) $(FORTRAN2C)
+
+bufr2crex : bufr2crex.o
+ $(FC) $(FFLAGS) -o $@ bufr2crex.o -L$(PLACE) -l$(LIB)$(R64)
+
+crex2bufr : crex2bufr.o
+ $(FC) $(FFLAGS) -o $@ crex2bufr.o -L$(PLACE) -l$(LIB)$(R64)
+
+create_bufr: create_bufr.o
+ $(FC) $(FFLAGS) -o $@ create_bufr.o -L$(PLACE) -l$(LIB)$(R64)
+
+tdexp: tdexp.o
+ $(FC) $(FFLAGS) -o $@ tdexp.o -L$(PLACE) -l$(LIB)$(R64)
+
+clean :
+ @for name in $(EXECS); do\
+ (rm -f $$name *.o ); \
+ done
diff --git a/examples/bufr/README b/examples/bufr/README
new file mode 100755
index 0000000..c5847b7
--- /dev/null
+++ b/examples/bufr/README
@@ -0,0 +1,74 @@
+ This directory contains example for the BUFR decoding and programs
+for conversion between BUFR and CREX
+
+Note:
+Conversion programs can be compiled only if you have installed both
+crex and bufer libraries!!!
+
+Compilation of C program for decoding bufr_decode.c is optional
+and if you want to compile it please type:
+
+make bufr_decode
+
+This is available only on Linux platform for Gnu compilers g77 and gcc,
+for pgf77 and pgfcc.
+
+ Relevant data in BUFR format are in data directory.
+
+decode_bufr.f :
+
+
+make
+
+will compile examples
+
+If you want to run example programs before instal library and Bufr tables
+just run small script:
+
+./test.sh
+
+that will set temporary environment variable: BUFR_TABLES
+and run:
+
+./decode_bufr -i data/input_bufr
+
+Answer the prompts as in the Bufr User's Manual example
+
+
+y
+n
+n
+1
+press return
+press return
+press return
+press return
+y
+1
+1
+
+
+where:
+ input_bufr - file name containing BUFR data
+
+ The result will be description of data and its values.
+ bufr_example can be run for different sort of observation data:
+synop.buf, amdar.bufr, atovs.bufr, satob.bufr, synop_ship.bufr, temp.bufr
+
+bufr2crex.f :
+
+ It very useful if there is need for automatic conversion between BUFR and
+CREX data formats, when some centres can not handle meteorogical binary data
+
+./bufr2crex -i input_bufr -o out_crex
+
+where:
+ out_crex - file name containing CREX data
+
+
+
+crex2bufr.f :
+
+ CREX to BUFR conversion program.
+
+./crex2bufr -i input_crex -o out_bufr
diff --git a/examples/bufr/bufr2crex.F b/examples/bufr/bufr2crex.F
new file mode 100755
index 0000000..bf427b2
--- /dev/null
+++ b/examples/bufr/bufr2crex.F
@@ -0,0 +1,605 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ PROGRAM BUFR2CREX
+C
+C**** *BUFRCREX*
+C
+C
+C PURPOSE.
+C --------
+C Bufr to CREX conversion.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C NONE.
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2=4096,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=320000,JSUBS=400,JCVAL=150 ,JBUFL=512000,
+#ifdef JBPW_64
+ 2 JBPW = 64,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT=1200,
+#else
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT=1200,
+#endif
+ 3 JWORK=4096000,JKEY=46,JBYTE=80000)
+C
+ PARAMETER (KELEM=20000)
+ PARAMETER (KVALS=360000)
+C
+ DIMENSION KBUFF(JBUFL)
+ DIMENSION KBUFR(JBUFL)
+ DIMENSION KSUP(JSUP) ,KSEC0(JSEC0),KSEC1(JSEC1)
+ DIMENSION KSEC2(JSEC2),KSEC3(JSEC3),KSEC4(JSEC4)
+ DIMENSION KEY (JKEY),KREQ(2)
+C
+ REAL*8 VALUES(KVALS)
+ REAL*8 RQV(KELEM)
+C
+ DIMENSION KTDLST(KELEM),KTDEXP(KELEM),KRQ(KELEM)
+ DIMENSION KDATA(2000)
+C
+ CHARACTER*256 COUT,CARG(4),CFIN
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+ CHARACTER*80 CVALS(KVALS)
+ CHARACTER*80 YENC
+ CHARACTER*160000 YOUT
+ CHARACTER*3 CRCRLF
+C
+C Common block containing bufr tables
+C
+ COMMON /BCOMTAB/ NTABBTR(JTAB),NTABBS (JTAB),NTABBRV(JTAB),
+ 1 NTABBDW(JTAB),NTABDTR(JTAB),NTABDST(JTAB),
+ 2 NTABDL (JTAB),NTABDSQ(JTAB*20),NTABP(64,255)
+C
+C NTABBTR - table B, table reference array
+C NTABBS - table B, scale array
+C NTABBRF - table B, reference value array
+C NTABBDW - table B, data width array
+C NTABDTR - table D, table reference array
+C NTABDST - table D, starting pointers array
+C NTABDL - table D, lengths array
+C NTABDSQ - table D, list of sequence descriptors array
+C
+ COMMON /BCOMWT/ NDWINC,NSCAM,NAFDW,NWT ,ODREPF,
+ 1 N221,MREL,NFCM,NFUCM,MBMP,OMARKER,M0,
+ 2 MBMPL,NSTACK(JELEM),NWTEN(JELEM),
+ 3 NWTR (JELEM),NWTS (JELEM),NWTRV (JELEM),
+ 4 NWTDW(JELEM)
+C
+C NDWINC - data width increment
+C NSCAM - scale multiplier
+C NAFDW - augmented field data width
+C NWT - pointer to working table
+C NSTACK - list of data descriptors
+C ODREPF - replication (logical)
+C N221 - data not present for n221 elements
+C MREL - pointer to the last data element
+C NFCM - first compressed message
+C MBMP - pointer to the begining of bit map
+C NWTR - working table reference
+C NWTS - working scale
+C NWTRV - working reference value
+C NWTDW - working data width
+C
+ COMMON /BCOMWTC/ CWTEN(JELEM),CWTU (JELEM)
+C
+C CWTEN - working table element naame
+C CWTU - working table units
+C
+c
+ PARAMETER(JP=3000)
+C
+ CHARACTER*120 YENTRY
+ CHARACTER*15 YFNAME
+ CHARACTER*15 FMT
+ CHARACTER*6 CREXKTDLST(KELEM),CREXKTDLST0
+C
+ INTEGER IVALUE(KELEM)
+C
+C Logical switch to use check digit indicator
+C
+ CHARACTER*4 YUSE_E
+C
+ INTEGER IVAL,IIVAL
+c
+ REAL*8 EPS
+ REAL*8 RVIND
+ REAL*8 VAL
+C
+ EQUIVALENCE (YOUT,KBUFR(1))
+C
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+C
+ NBYTPW=JBPW/8
+ RVIND=1.7E38
+ NVIND=2147483647
+ IOBS=0
+ EPS=1.0E-8
+ NPACK=0
+ N=0
+ OO=.FALSE.
+C
+ CRCRLF=CHAR(13)//CHAR(13)//CHAR(10)
+C
+C Get input and output file name.
+C
+ NARG=IARGC()
+c
+ IF(NARG.LT.4) THEN
+ print*,'Usage -- bufr2crex -i infile -o outfile'
+ STOP
+ END IF
+c
+ COUT=' '
+ CFIN=' '
+c
+ DO 101 J=1,NARG
+ CALL GETARG(J,CARG(J))
+ 101 CONTINUE
+c
+ DO 102 J=1,NARG,2
+ IF(CARG(J).EQ.'-i') THEN
+ CFIN=CARG(J+1)
+ ELSEIF(CARG(J).EQ.'-o') THEN
+ COUT=CARG(J+1)
+ ELSE
+ print*,'Usage -- bufr2crex -i infile -o outfile'
+ STOP
+ END IF
+ 102 CONTINUE
+C
+ II=INDEX(CFIN,' ')
+ II=II-1
+ JJ=INDEX(COUT,' ')
+ JJ=JJ-1
+C
+ KRQL=0
+ NR=0
+ KREQ(1)=0
+ KREQ(2)=0
+C
+C
+C* 1.2 OPEN FILE CONTAINING BUFR DATA.
+C -------------------------------
+ 120 CONTINUE
+C
+ IRET=0
+ CALL PBOPEN(IUNIT,CFIN(1:ii),'r',IRET)
+ IF(IRET.EQ.-1) STOP 'open failed'
+ IF(IRET.EQ.-2) STOP 'Invalid file name'
+ IF(IRET.EQ.-3) STOP 'Invalid open mode specified'
+C
+ CALL PBOPEN(IUNIT1,cout(1:jj),'w',IRET)
+ IF(IRET.EQ.-1) STOP 'open failed on bufr.dat'
+ IF(IRET.EQ.-2) STOP 'Invalid file name'
+ IF(IRET.EQ.-3) STOP 'Invalid open mode specified'
+C
+C -----------------------------------------------------------------
+C* 2. SET REQUEST FOR EXPANSION.
+C --------------------------
+ 200 CONTINUE
+C
+ KREQ(1)=1
+ KREQ(2)=0
+C
+ OSEC3=.FALSE.
+ OPRT=.FALSE.
+ OENC=.TRUE.
+ ICODE=0
+ OCOMP=.FALSE.
+C
+C* 2.1 SET REQUEST FOR PARTIAL EXPANSION.
+C ----------------------------------
+ 210 CONTINUE
+C
+ KERR=0
+ CALL BUSRQ(KREQ,KRQL,KRQ,RQV,KERR)
+C
+C -----------------------------------------------------------------
+C* 3. READ BUFR MESSAGE.
+C ------------------
+ 300 CONTINUE
+C
+ IERR=0
+ KBUFL=0
+C
+ IRET=0
+ CALL PBBUFR(IUNIT,KBUFF,JBYTE,KBUFL,IRET)
+ IF(IRET.EQ.-1) THEN
+c IF(N.NE.0) GO TO 600
+ print*,'Number of subsets ',iobs
+ print*,'Number of messages ',n
+ STOP 'EOF'
+ END IF
+ IF(IRET.EQ.-2) STOP 'File handling problem'
+ IF(IRET.EQ.-3) STOP 'Array too small for product'
+C
+ N=N+1
+ KBUFL=KBUFL/nbytpw+1
+ IF(N.LT.NR) GO TO 300
+ print*,'----------------------',n
+C
+C -----------------------------------------------------------------
+C* 4. EXPAND BUFR MESSAGE.
+C --------------------
+ 400 CONTINUE
+C
+ CALL BUS012(KBUFL,KBUFF,KSUP,KSEC0,KSEC1,KSEC2,KERR)
+ IF(KERR.NE.0) THEN
+ PRINT*,'Error in BUS012: ',KERR
+ PRINT*,' BUFR MESSAGE NUMBER ',N,' CORRUPTED.'
+ KERR=0
+ GO TO 300
+ END IF
+C
+ KEL=KELEM
+ IF(KSUP(6).GT.1) THEN
+ KEL=KVALS/KSUP(6)
+ IF(KEL.GT.KELEM) KEL=KELEM
+ END IF
+C
+ CALL BUFREX(KBUFL,KBUFF,KSUP,KSEC0 ,KSEC1,KSEC2 ,KSEC3 ,KSEC4,
+ 1 KEL,CNAMES,CUNITS,KVALS,VALUES,CVALS,IERR)
+C
+ IF(IERR.NE.0) THEN
+ IF(IERR.EQ.45) GO TO 300
+ IF(IERR.EQ.2) THEN
+ IERR=0
+ GO TO 300
+ END IF
+ CALL EXIT(2)
+ END IF
+c
+ IOBS=IOBS+KSEC3(3)
+c
+ NPACK=NPACK+1
+C
+ ISUBSET=1
+ CALL BUSEL2(ISUBSET,KEL,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+ 1 CUNITS,IERR)
+ IF(KERR.NE.0) CALL EXIT(2)
+C
+C* 4.1 PRINT CONTENT OF EXPANDED DATA.
+C -------------------------------
+ 410 CONTINUE
+C
+ IF(.NOT.OPRT) GO TO 500
+ IF(.NOT.OSEC3) GO TO 450
+C
+C* 4.2 PRINT SECTION ZERO OF BUFR MESSAGE.
+C -----------------------------------
+ 420 CONTINUE
+C
+
+ CALL BUPRS0(KSEC0)
+C
+C* 4.3 PRINT SECTION ONE OF BUFR MESSAGE.
+C -----------------------------------
+ 430 CONTINUE
+C
+ CALL BUPRS1(KSEC1)
+C
+C
+C* 4.4 PRINT SECTION TWO OF BUFR MESSAGE.
+C -----------------------------------
+ 440 CONTINUE
+c
+C AT ECMWF SECTION 2 CONTAINS RDB KEY.
+C SO UNPACK KEY
+C
+ CALL BUUKEY(KSEC1,KSEC2,KEY,KSUP,KERR)
+C
+C PRINT KEY
+C
+ CALL BUPRS2(KSUP ,KEY)
+C
+C* 4.5 PRINT SECTION 3 OF BUFR MESSAGE.
+C -----------------------------------
+ 450 CONTINUE
+C
+C FIRST GET DATA DESCRIPTORS
+C
+ ISUBSET=1
+ CALL BUSEL2(ISUBSET,KEL,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+ 1 CUNITS,IERR)
+ IF(KERR.NE.0) CALL EXIT(2)
+C
+C PRINT CONTENT
+C
+ IF(OSEC3) THEN
+ CALL BUPRS3(KSEC3,KTDLEN,KTDLST,KTDEXL,KTDEXP,KEL,CNAMES)
+ END IF
+c
+C
+C* 4.6 PRINT SECTION 4 (DATA).
+C -----------------------
+ 460 CONTINUE
+C
+C IN THE CASE OF MANY SUBSETS DEFINE RANGE OF SUBSETS
+C
+ IF(.NOT.OO) THEN
+ WRITE(*,'(a,$)') ' STARTING SUBSET TO BE PRINTED : '
+ READ(*,'(BN,I6)') IST
+ WRITE(*,'(a,$)') ' ENDING SUBSET TO BE PRINTED : '
+ READ(*,'(BN,I6)') IEND
+ OO=.FALSE.
+ END IF
+C
+C PRINT DATA
+C
+ ICODE=0
+ CALL BUPRT(ICODE,IST,IEND,KEL,CNAMES,CUNITS,CVALS,
+ 1 KVALS,VALUES,KSUP,KSEC1,IERR)
+C
+C
+C -----------------------------------------------------------------
+C* 5. COLLECT DATA FOR REPACKING.
+C ---------------------------
+ 500 CONTINUE
+C
+C FIRST GET DATA DESCRIPTORS
+C
+ ISUBSET=1
+ CALL BUSEL2(ISUBSET,KEL,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+ 1 CUNITS,IERR)
+ IF(KERR.NE.0) CALL EXIT(2)
+C
+C -----------------------------------------------------------------
+C* 6. PACK CREX MESSAGE.
+C ------------------
+ 600 CONTINUE
+C
+C Modify BUFR operators
+C
+ J=0
+ DO 602 I=1,KTDLEN
+ IF(KTDLST(I).EQ.222000) GO TO 603
+ IF(KTDLST(I).EQ.201000) GO TO 602
+ IF(KTDLST(I).EQ.202000) GO TO 602
+ IF(KTDLST(I).EQ.204000) GO TO 602
+ IF(KTDLST(I).EQ.031000) GO TO 602
+ IF(KTDLST(I).EQ.031001) GO TO 602
+ IF(KTDLST(I).EQ.031002) GO TO 602
+C
+ CREXKTDLST0=' '
+ WRITE(CREXKTDLST0,'(I6.6)',IOSTAT=IOS) KTDLST(I)
+ IF(IOS.NE.0) THEN
+ print*,'Internal write error.'
+ CALL EXIT(2)
+ END IF
+ J=J+1
+ CREXKTDLST(J)(1:6)=CREXKTDLST0
+C
+ IF(CREXKTDLST(J)(1:1).EQ.'3') THEN
+ CREXKTDLST(J)(1:1)='D'
+ ELSEIF(CREXKTDLST(J)(1:1).EQ.'0') THEN
+ CREXKTDLST(J)(1:1)='B'
+ ELSEIF(CREXKTDLST(J)(1:1).EQ.'1') THEN
+ CREXKTDLST(J)(1:1)='R'
+c scan for any 201000,202000 or 201y,202y followed by 206y
+ READ(CREXKTDLST(J)(2:3),'(I2.2)',IOSTAT=IOS) IELEMENTS
+ IF(IOS.NE.0) THEN
+ print*,'Internal read error.'
+ CALL EXIT(2)
+ END IF
+ IEL=IELEMENTS
+ DO IN=I,I+IELEMENTS-1
+ IF(KTDLST(IN).EQ.201000) IEL=IEL-1
+ IF(KTDLST(IN).EQ.202000) IEL=IEL-1
+ IF(KTDLST(IN).GE.201001.AND.KTDLST(IN).LE.201999.AND.
+ 1 KTDLST(IN+1)/1000.EQ.206) IEL=IEL-1
+ IF(KTDLST(IN).GE.202001.AND.KTDLST(IN).LE.202999.AND.
+ 1 KTDLST(IN+1)/1000.EQ.206) IEL=IEL-1
+ END DO
+ WRITE(CREXKTDLST(J)(2:3),'(I2.2)',IOSTAT=IOS) IEl
+ IF(IOS.NE.0) THEN
+ print*,'Internal write error.'
+ CALL EXIT(2)
+ END IF
+ ELSEIF(CREXKTDLST(J)(1:3).EQ.'201') THEN
+ IF(KTDLST(I+1)/1000.EQ.206) THEN
+ J=J-1
+ GO TO 602
+ END IF
+ READ(CREXKTDLST(J)(4:6),'(I3.3)',IOSTAT=IOS) IY
+ IF(IOS.NE.0) THEN
+ print*,'Internal read error.'
+ CALL EXIT(2)
+ END IF
+ IBITS=IY-128
+ ICLASS=KTDLST(I+1)/1000
+ IYYY =KTDLST(I+1)-ICLASS*1000+1
+ ICLASS=ICLASS+1
+ III=NTABP(ICLASS,IYYY)
+ IDW=NTABBDW(III)+IBITS
+ IRES=2.**IDW-1
+ JZ=0
+ DO WHILE(IRES.GT.0)
+ JZ=JZ+1
+ IRES=IRES/10
+ END DO
+ CREXKTDLST(J)(1:3)='C01'
+ WRITE(CREXKTDLST(J)(4:6),'(I3.3)',IOSTAT=IOS) JZ
+ IF(IOS.NE.0) THEN
+ print*,'Internal write error.'
+ CALL EXIT(2)
+ END IF
+ ELSEIF(CREXKTDLST(J)(1:3).EQ.'202') THEN
+ GO TO 602
+ ELSEIF(CREXKTDLST(J)(1:3).EQ.'205') THEN
+ CREXKTDLST(J)(1:3)='C05'
+ ELSE
+ print*,'Wrong data descriptor ',crexktdlst(j)
+ print*,'Data containing above descriptor can',
+ 1 ' not be converted'
+ go to 300
+ END IF
+ 602 CONTINUE
+c
+ 603 CONTINUE
+C
+ ICREXLEN=J
+c
+C Find delayed replications
+c
+ KDLEN=0
+C
+ IST=1
+ IEND=1
+ OMULTI=.FALSE.
+ IF(IAND(KSEC3(4),64).NE.0.AND.KSEC3(3).GT.1) THEN
+ IEND=KSEC3(3)
+ OMULTI=.TRUE.
+ END IF
+C
+ DO ISUBSET=IST, IEND
+
+ JJ=(ISUBSET-1)*KEL
+C
+ CALL BUSEL2(ISUBSET,KEL,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+ 1 CUNITS,IERR)
+C
+ DO I=1,KTDEXL
+C
+ II=I+JJ
+C
+ IF(KTDEXP(I).EQ.031001.OR.
+ 1 KTDEXP(I).EQ.031000.OR.
+ 2 KTDEXP(I).EQ.031002) THEN
+ KDLEN=KDLEN+1
+ KDATA(KDLEN)=NINT(VALUES(II))
+ END IF
+ END DO
+C
+C* Make unit conversion from K to Celsius
+C
+ DO I=1,KTDEXL
+ IF(CUNITS(I)(1:2).EQ.'K '.AND.
+ 1 KTDEXP(I)/1000.EQ.12) THEN
+ IF(KTDEXP(I).NE.012064.AND.
+ 1 KTDEXP(I).NE.012065.AND.
+ 2 KTDEXP(I).NE.012070.AND.
+ 2 KTDEXP(I).NE.012071.AND.
+ 4 KTDEXP(I).NE.012164.AND.
+ 5 KTDEXP(I).NE.012151.AND.
+ 6 KTDEXP(I).NE.012051.AND.
+ 7 KTDEXP(I).NE.022050.AND.
+ 8 KTDEXP(I).NE.012171) THEN
+ IF(OMULTI) THEN
+ IJ=I+JJ
+ IF(abs(VALUES(IJ)-rvind)/rvind.GT.eps)
+ 1 VALUES(IJ)=VALUES(IJ)-273.15
+ ELSE
+ DO J=1,KSEC3(3)
+ IJ=I+(J-1)*KEL
+ IF(abs(VALUES(IJ)-rvind)/rvind.GT.eps)
+ 1 VALUES(IJ)=VALUES(IJ)-273.15
+ END DO
+ END IF
+ END IF
+ END IF
+ IF(CUNITS(I)(1:2).EQ.'PA'.AND.
+ 1 KTDEXP(I).EQ.015003) THEN
+ IF(OMULTI) THEN
+ IJ=I+JJ
+ IF(abs(VALUES(IJ)-rvind)/rvind.GT.eps)
+ 1 VALUES(IJ)=VALUES(IJ)*10000.
+ ELSE
+ DO J=1,KSEC3(3)
+ IJ=I+(J-1)*KEL
+ IF(abs(VALUES(IJ)-rvind)/rvind.GT.eps)
+ 1 VALUES(IJ)=VALUES(IJ)*10000.
+ END DO
+ END IF
+ END IF
+ END DO
+C
+ END DO
+
+C
+C* 6.2 ENCODE DATA INTO CREX MESSAGE.
+C ------------------------------
+ 620 CONTINUE
+C
+ IF(KSEC1(2).EQ.4) THEN ! Bufr edition number
+ KSEC1(2)=2 ! Crex edition number
+ KSEC1(5)=KSEC3(3) ! Number of subsets
+ KSEC1( 7)=KSEC1(17) ! International sub category
+ KSEC1(17)=KSEC1(15) ! Bufr master table version number
+ KSEC1(15)=3 ! Crex version number used
+ KSEC1(18)=KSEC1(8) ! Bufr version number of local tables
+ ELSE
+ KSEC1(17)=KSEC1(15) ! Bufr master table version number
+ KSEC1(2)=1 ! Crex edition number
+ KSEC1(15)=3 ! Crex version number used
+ KSEC1(18)=KSEC1(8) ! Bufr version number of local tables
+ END IF
+c
+ CALL CREXEN(KSEC0,KSEC1,KSEC3,
+ 1 ICREXLEN,CREXKTDLST,KDLEN,KDATA,KEL,KVALS,
+ 2 VALUES,CVALS,KBUFL,KBUFR,KERR)
+ IF(KERR.GT.0) THEN
+ print*,'CREXEN error:',KERR
+ go to 300
+ END IF
+C
+C 6.3 WRITE CREX MESSAGE INTO FILE.
+C -----------------------------
+ 630 CONTINUE
+C
+ ILEN=KBUFL
+C
+ IERR=0
+ CALL PBWRITE(IUNIT1,KBUFR,ILEN,IERR)
+ IF(IERR.LT.0) THEN
+ print*,'Error writing into target file.'
+ CALL EXIT(2)
+ END IF
+C
+ GO TO 300
+C
+ END
diff --git a/examples/bufr/bufr_decode.c b/examples/bufr/bufr_decode.c
new file mode 100755
index 0000000..ca6a221
--- /dev/null
+++ b/examples/bufr/bufr_decode.c
@@ -0,0 +1,182 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+
+int main(int argc, char *argv[])
+/*******************************************************************
+*
+* Program : Bufr_decode
+*
+*
+* Author: Milan Dragosavac ECMWF July 1996
+*
+* Purpose: Decode bufr message
+*
+*
+*
+* Usage:
+*
+*
+*
+* References:
+*
+*
+*
+*
+* File formats:
+*
+*
+*
+* Restrictions:
+*
+*
+* Error handling:
+*
+*
+*
+* Notes:
+*
+*
+*
+*******************************************************************/
+{
+#define KVALS 4096000
+#define KELEM 160000
+
+ FILE *fp;
+ char bufr_message[512000];
+ char filename[256];
+ long int length=512000;
+ long int status = 0;
+ int Nbpw;
+
+ unsigned long int *kbuff;
+ long int ksup[9];
+ long int ksec0[3];
+ long int ksec1[40];
+ long int ksec2[4096];
+ long int ksec3[4];
+ long int ksec4[2];
+ long int key[46];
+ long int kerr;
+
+
+
+ int i;
+ long kelem = KELEM,kvals = KVALS;
+
+ static char cnames[KELEM][64],cunits[KELEM][24];
+
+
+ char cvals[KVALS][80];
+
+ double values[KVALS],vals[KVALS];
+ long icode = 0;
+ long ktdlst[KELEM],ktdexp[KELEM],ktdlen,ktdexl;
+
+ if(sizeof(long) == 4) Nbpw=32;
+ else if(sizeof(long) == 8) Nbpw=64;
+ else{
+ printf("Abort.....\n");
+ }
+
+ printf("%d\n",Nbpw);
+
+/* Get input and output file name. */
+/* ------------------------------- */
+
+ if(argc != 3) {
+ printf("Usage: bufr_decode -i infile \n");
+ printf("Please try again. \n");
+ exit(1);
+ }
+
+ printf("%c",argc);
+
+ if(!strcmp(argv[1],"-i")) strcpy(filename,argv[2]);
+ else {
+ printf("Usage: bufr_decode -i infile \n");
+ exit(1);
+ }
+
+/* Open input file */
+/* --------------- */
+
+ if((fp = fopen(filename,"r")) == NULL) {
+ printf("cannot open file\n");
+ exit(1);
+ }
+
+/* Read in bufr messages */
+/* --------------------- */
+
+ while(status >= 0){
+ long current_ss;
+ status = readbufr( fp,&bufr_message,&length);
+
+ if( status == -1 ) printf("End of file.\n");
+ else if(status == -2 ) printf("Error in file handling\n");
+ else if(status == -3 ) printf("Too small input array.\n");
+ else if(status == -4 ) printf("Too small input array.\n");
+ else {
+ printf("It is OK.\n");
+ printf("message read ");
+ printf("%d\n",length);
+ printf("%s\n",&bufr_message[0]);
+ }
+ status=-1;
+
+/* Expand bufr message calling fortran program */
+ kbuff = (unsigned long *) bufr_message;
+ length /= 4;
+
+ bus012_(&length, kbuff , ksup, ksec0, ksec1, ksec2, &kerr) ;
+ buprs0_(ksec0);
+ buprs1_(ksec1);
+
+ if (ksup[5] > 1)
+ kelem = kvals/ksup[5];
+ else
+ kelem = KELEM;
+
+ if ( kelem > KELEM ) kelem = KELEM;
+ kerr = 0;
+ bufrex_(&length,(long *)kbuff,ksup,ksec0,ksec1,ksec2,ksec3,ksec4,
+ &kelem,(char **)cnames,(char **)cunits,&kvals,
+ values,(char **)cvals,&kerr);
+ if ( kerr )
+ {
+ kerr = 0;
+ }
+
+ buukey_(ksec1,ksec2,key,ksup,&kerr);
+
+ busel_(&ktdlen,ktdlst,&ktdexl,ktdexp,&kerr);
+ buprs3_(ksec3,&ktdlen,ktdlst,&ktdexl,ktdexp,&kelem,(char **)cnames);
+
+ icode = 0;
+ current_ss = 1;
+ buprt_(&icode,¤t_ss,¤t_ss,&kelem,(char **)cnames,
+ (char **)cunits,(char **)cvals,
+ &kvals,values,ksup,ksec1,&kerr);
+
+
+ }
+
+ return kerr;
+
+}
+
diff --git a/examples/bufr/create_bufr.F b/examples/bufr/create_bufr.F
new file mode 100755
index 0000000..6524f3b
--- /dev/null
+++ b/examples/bufr/create_bufr.F
@@ -0,0 +1,417 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ PROGRAM BUFR
+C
+C**** *BUFR*
+C
+C
+C PURPOSE.
+C --------
+C An example of using Bufr packing/unpacking software.
+C It will create synop data in bufr edition 4
+C
+C
+C** INTERFACE.
+C ----------
+C
+C NONE.
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 05/04/2005.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H,Y)
+C
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2=4096,JSEC3= 4,
+ 1 JSEC4=2,JELEM=320000,JSUBS=400,JCVAL=150 ,JBUFL=512000,
+#ifdef JBPW_64
+ 2 JBPW = 64,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+#else
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT= 200,
+#endif
+ 3 JWORK=4096000,JKEY=46)
+
+C
+ PARAMETER (KDLEN=200,KELEM=4000)
+ parameter (KVALS=4000,KVALS1=4000)
+C
+ DIMENSION KBUFR(JBUFL)
+ DIMENSION KSUP(JSUP) ,KSEC0(JSEC0),KSEC1(JSEC1)
+ DIMENSION KSEC2(JSEC2),KSEC3(JSEC3),KSEC4(JSEC4)
+ DIMENSION KEY (JKEY)
+ DIMENSION ISUP(JSUP) ,ISEC0(JSEC0),ISEC1(JSEC1)
+ DIMENSION ISEC2(JSEC2),ISEC3(JSEC3),ISEC4(JSEC4)
+C
+#ifndef R_4
+ REAL*8 VALUES(KVALS),VALUE(KVALS1)
+ REAL*8 RQV(KELEM)
+ REAL*8 RVIND
+#else
+ REAL VALUES(KVALS),VALUE(KVALS1)
+ REAL RQV(KELEM)
+ REAL RVIND
+#endif
+
+ DIMENSION KTDLST(KELEM),KTDEXP(KELEM),KRQ(KELEM)
+ DIMENSION ITDLST(KELEM),ITDEXP(KELEM)
+ DIMENSION KDATA(KDLEN),IDATA(KDLEN)
+C
+ CHARACTER*8 CF
+ CHARACTER*64 CNAMES(KELEM),CNAME(KELEM)
+ CHARACTER*24 CUNITS(KELEM),CUNIT(KELEM)
+ CHARACTER*80 CVALS(KVALS)
+ CHARACTER*80 CVAL (KVALS1)
+ CHARACTER*80 YENC
+C
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+C
+ RVIND=1.7D38
+C
+
+ CALL PBOPEN(IUNIT1,'synop.bufr','W',IRET)
+ IF(IRET.EQ.-1) STOP 'OPEN FAILED ON synop.dat'
+ IF(IRET.EQ.-2) STOP 'INVALID FILE NAME'
+ IF(IRET.EQ.-3) STOP 'INVALID OPEN MODE SPECIFIED'
+C
+
+C
+C INITIALIZE DELAYED REPLICATION FACTORS OR REFERENCE VALUES ETD.
+C
+ DO 101 I=1,KDLEN
+ KDATA(I)=1
+ VALUES(I)=RVIND
+ 101 CONTINUE
+C
+c
+ KDLENG=3
+C
+C
+C SET DATA DECSRIPTORS
+C
+
+
+ ktdlst( 1)= 307080
+
+ ktdlen=1
+
+ values( 1)=11. !001001 WMO BLOCK NUMBER
+ values( 2)=423. !001002 WMO STATION NUMBER
+ values( 3)=1020. !001015 STATION OR SITE NAME
+ values( 4)=1. !002001 TYPE OF STATION
+ values( 5)=2007. !004001 YEAR
+ values( 6)=11. !004002 MONTH
+ values( 7)=21. !004003 DAY
+ values( 8)=12. !004004 HOUR
+ values( 9)=0. !004005 MINUTE
+ values( 10)=49.66944 !005001 LATITUDE (HIGH ACCURACY)
+ values( 11)=12.67778 !006001 LONGITUDE (HIGH ACCURACY)
+ values( 12)=742.2 !007030 HEIGHT OF STATION GROUND ABOVE MEAN SEA LEVEL (SEE NOTE 3)
+ values( 13)=747. !007031 HEIGHT OF BAROMETER ABOVE MEAN SEA LEVEL (SEE NOTE 4)
+ values( 14)=92520. !010004 PRESSURE
+ values( 15)=rvind !010051 PRESSURE REDUCED TO MEAN SEA LEVEL
+ values( 16)=-60. !010061 3-HOUR PRESSURE CHANGE
+ values( 17)=5. !010063 CHARACTERISTIC OF PRESSURE TENDENCY
+ values( 18)=rvind !010062 24-HOUR PRESSURE CHANGE
+ values( 19)=92500. !007004 PRESSURE
+ values( 20)=749. !010009 GEOPOTENTIAL HEIGHT
+ values( 21)=1.95 !007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM)
+ values( 22)=270.85 !012101 TEMPERATURE/DRY-BULB TEMPERATURE
+ values( 23)=270.45 !012103 DEW-POINT TEMPERATURE
+ values( 24)=97. !013003 RELATIVE HUMIDITY
+ values( 25)=4.8 !007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM)
+ values( 26)=200. !020001 HORIZONTAL VISIBILITY
+ values( 27)=1.12 !007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM)
+ values( 28)=rvind !013023 TOTAL PRECIPITATION PAST 24 HOURS
+ values( 29)=rvind !007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM)
+ values( 30)=100. !020010 CLOUD COVER (TOTAL)
+ values( 31)=5. !008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS)
+ values( 32)=9. !020011 CLOUD AMOUNT
+ values( 33)=0. !020013 HEIGHT OF BASE OF CLOUD
+ values( 34)=62. !020012 CLOUD TYPE
+ values( 35)=61. !020012 CLOUD TYPE
+ values( 36)=60. !020012 CLOUD TYPE
+ values( 37)=1. !031001 DELAYED DESCRIPTOR REPLICATION FACTOR
+ values( 38)=5. !008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS)
+ values( 39)=9. !020011 CLOUD AMOUNT
+ values( 40)=59. !020012 CLOUD TYPE
+ values( 41)=0. !020013 HEIGHT OF BASE OF CLOUD
+ values( 42)=1. !031001 DELAYED DESCRIPTOR REPLICATION FACTOR
+ values( 43)=11. !008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS)
+ values( 44)=rvind !020011 CLOUD AMOUNT
+ values( 45)=rvind !020012 CLOUD TYPE
+ values( 46)=rvind !020014 HEIGHT OF TOP OF CLOUD
+ values( 47)=rvind !020017 CLOUD TOP DESCRIPTION
+ values( 48)=7. !008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS)
+ values( 49)=rvind !020054 TRUE DIRECTION FROM WHICH CLOUDS ARE MOVING
+ values( 50)=8. !008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS)
+ values( 51)=rvind !020054 TRUE DIRECTION FROM WHICH CLOUDS ARE MOVING
+ values( 52)=9. !008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS)
+ values( 53)=rvind !020054 TRUE DIRECTION FROM WHICH CLOUDS ARE MOVING
+ values( 54)=rvind !008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS)
+ values( 55)=rvind !005021 BEARING OR AZIMUTH
+ values( 56)=rvind !007021 ELEVATION (SEE NOTE 2)
+ values( 57)=rvind !020012 CLOUD TYPE
+ values( 58)=rvind !005021 BEARING OR AZIMUTH
+ values( 59)=rvind !007021 ELEVATION (SEE NOTE 2)
+ values( 60)=rvind !020062 STATE OF THE GROUND (WITH OR WITHOUT SNOW)
+ values( 61)=rvind !013013 TOTAL SNOW DEPTH
+ values( 62)=rvind !012113 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS
+ values( 63)=49. !020003 PRESENT WEATHER (SEE NOTE 1)
+ values( 64)=-6. !004024 TIME PERIOD OR DISPLACEMENT
+ values( 65)=4. !020004 PAST WEATHER (1) (SEE NOTE 2)
+ values( 66)=4. !020005 PAST WEATHER (2) (SEE NOTE 2)
+ values( 67)=-1. !004024 TIME PERIOD OR DISPLACEMENT
+ values( 68)=rvind !014031 TOTAL SUNSHINE
+ values( 69)=-24. !004024 TIME PERIOD OR DISPLACEMENT
+ values( 70)=rvind !014031 TOTAL SUNSHINE
+ values( 71)=1.12 !007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM)
+ values( 72)=-6. !004024 TIME PERIOD OR DISPLACEMENT
+ values( 73)=0. !013011 TOTAL PRECIPITATION/TOTAL WATER EQUIVALENT
+ values( 74)=-1. !004024 TIME PERIOD OR DISPLACEMENT
+ values( 75)=0. !013011 TOTAL PRECIPITATION/TOTAL WATER EQUIVALENT
+ values( 76)=1.95 !007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM)
+ values( 77)=-12. !004024 TIME PERIOD OR DISPLACEMENT
+ values( 78)=0. !004024 TIME PERIOD OR DISPLACEMENT
+ values( 79)=rvind !012111 MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED
+ values( 80)=-12. !004024 TIME PERIOD OR DISPLACEMENT
+ values( 81)=0. !004024 TIME PERIOD OR DISPLACEMENT
+ values( 82)=rvind !012112 MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED
+ values( 83)=10.25 !007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM)
+ values( 84)=8. !002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT
+ values( 85)=2. !008021 TIME SIGNIFICANCE
+ values( 86)=-10. !004025 TIME PERIOD OR DISPLACEMENT
+ values( 87)=110. !011001 WIND DIRECTION
+ values( 88)=5. !011002 WIND SPEED
+ values( 89)=rvind !008021 TIME SIGNIFICANCE
+ values( 90)=-10. !004025 TIME PERIOD OR DISPLACEMENT
+ values( 91)=rvind !011043 MAXIMUM WIND GUST DIRECTION
+ values( 92)=rvind !011041 MAXIMUM WIND GUST SPEED
+ values( 93)=-360. !004025 TIME PERIOD OR DISPLACEMENT
+ values( 94)=rvind !011043 MAXIMUM WIND GUST DIRECTION
+ values( 95)=12. !011041 MAXIMUM WIND GUST SPEED
+ values( 96)=rvind !007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM)
+ values( 97)=-24. !004024 TIME PERIOD OR DISPLACEMENT
+ values( 98)=rvind !002004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUREMENT OR TYPE OF C
+ values( 99)=rvind !013033 EVAPORATION/EVAPOTRANSPIRATION
+ values(100)=-1. !004024 TIME PERIOD OR DISPLACEMENT
+ values(101)=rvind !014002 LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED
+ values(102)=rvind !014004 SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED
+ values(103)=rvind !014016 NET RADIATION, INTEGRATED OVER PERIOD SPECIFIED
+ values(104)=rvind !014028 GLOBAL SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S
+ values(105)=rvind !014029 DIFFUSE SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD
+ values(106)=rvind !014030 DIRECT SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S
+ values(107)=-24. !004024 TIME PERIOD OR DISPLACEMENT
+ values(108)=rvind !014002 LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED
+ values(109)=rvind !014004 SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED
+ values(110)=rvind !014016 NET RADIATION, INTEGRATED OVER PERIOD SPECIFIED
+ values(111)=rvind !014028 GLOBAL SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S
+ values(112)=rvind !014029 DIFFUSE SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD
+ values(113)=rvind !014030 DIRECT SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S
+ values(114)=rvind !004024 TIME PERIOD OR DISPLACEMENT
+ values(115)=rvind !004024 TIME PERIOD OR DISPLACEMENT
+ values(116)=rvind !012049 TEMPERATURE CHANGE OVER SPECIFIED PERIOD
+
+
+C SET CCITTIA5 STATION OR SITE NAME
+
+ cvals(1)='PRIMDA'
+C
+C
+C SECTION 0 CONTENT
+C
+ KSEC0(1)=0 ! TOTAL LENGTH OF SECTION 0
+ KSEC0(2)=0 ! TOTAL LENGTH OF BUFR MESSAGE
+ KSEC0(3)=4 ! BUFR EDITION NUMBER
+C
+C SECTION 1 CONTENT
+C
+ KSEC1(1)=22 ! TOTTAL LENGTH OF SECTION 1 ( set to 18 for edition <= 3)
+ KSEC1(2)=4 ! BUFR EDITION NUMBER
+ KSEC1(3)=89 ! ORIGINATING CENTRE
+ KSEC1(4)=1 ! UPDATE SEQUENCE NUMBER
+ KSEC1(5)=0 ! FLAG (PRESENCE OF SECTION 2)
+ KSEC1(6)=0 ! DATA CATEGORY
+ KSEC1(7)=0 ! LOCAL DATA SUB-CATEGORY
+ KSEC1(8)=0 ! VERSION NUMBER OF LOCAL TABLE USED
+ KSEC1(9)=nint(values(5))
+ if(KSEC1(2).le.3) then
+ if(ksec1(9).gt.2000) then
+ ksec1(9)=ksec1(9)-2000
+ else
+ ksec1(9)=ksec1(9)-1900
+ end if
+ end if
+ KSEC1(10)=nint(values(6))
+ KSEC1(11)=nint(values(7)) ! DAY
+ KSEC1(12)=nint(values(8)) ! HOUR
+ KSEC1(13)=nint(values(9)) ! MINUTE
+ KSEC1(14)=0 ! BUFR MASTER TABLE( ZERO) FOR METEOROLOGICAL DATA)
+ KSEC1(15)=13 ! VERSION NUMBER OF MASTER TABLE USED
+ KSEC1(16)=255 ! ORIGINATING SUB-CENTRE
+ KSEC1(17)=2 ! INTERNATIONAL SUB-CATEGORY
+ KSEC1(18)=0 ! SECOND
+
+C
+C SECTION 2 CONTENT
+C
+ KSEC2(1)=52
+C
+ DO 110 I=2,JSEC2
+ KSEC2(I)=0
+ 110 CONTINUE
+C
+C SECTION 3 CONTENT
+C
+ KSEC3(1)=0 ! TOTAL LENGTH OF SECTION 3
+ KSEC3(2)=0 ! RESERVED
+ KSEC3(3)=1
+ KSEC3(4)=0 ! 64 FOR COMPRESSION/ 0 MANY SUBSETS
+ if(KSEC3(3).GT.1) KSEC3(4)=64
+C
+ IREP=0
+C
+C
+C* 6. PACK BUFR MESSAGE
+C -----------------
+ 600 CONTINUE
+C
+C---------------------------------------------------------------
+C This call is not needed for packing. It just
+C prints expanded list corresponding to ktdlst sequence
+C and delayed replications in kdata array. This four
+C lines can be deleted or commented out.
+ K=1
+ CALL BUXDES(K,KSEC1,KTDLEN,KTDLST,KDLENG,KDATA,KELEM,
+ 1 KTDEXL,KTDEXP,CNAMES,CUNITS,KERR)
+C
+ IF(KERR.NE.0) CALL EXIT(2)
+C---------------------------------------------------------------
+C
+C
+C* 6.2 ENCODE DATA INTO BUFR MESSAGE.
+C ------------------------------
+ 620 CONTINUE
+C
+ KBUFL=3000
+ KPMISS=1
+ KPRUS=1
+ NOKEY=0
+ CALL BUPRQ(KPMISS,KPRUS,NOKEY)
+C
+ KERR=0
+ CALL BUFREN( KSEC0,KSEC1,KSEC2,KSEC3,KSEC4,
+ 1 KTDLEN,KTDLST,KDLENG,KDATA,KELEM,
+ 2 KVALS,VALUES,CVALS,KBUFL,KBUFR,KERR)
+C
+
+ IF(KERR.GT.0) THEN
+ CALL EXIT(2)
+ ELSEIF(KERR.lt.0) then
+ print*,'Encoding return_code=',kerr
+ END IF
+c
+C ILEN=KBUFL*JBPW/8
+ ILEN=KSEC0(2)
+C
+ IERR=0
+ CALL PBWRITE(IUNIT1,KBUFR,ILEN,IERR)
+ IF(IERR.LT.0) THEN
+ PRINT*,'ERROR WRITING INTO TARGET FILE.'
+ CALL EXIT(2)
+ END IF
+
+C
+C -----------------------------------------------------------------
+C* 7. UNPACK MESSAGE.
+C -------------
+ 700 CONTINUE
+C
+ DO 702 I=1,KVALS1
+ VALUE(I)=RVIND
+ 702 CONTINUE
+c
+ 701 CONTINUE
+C
+ CALL BUFREX(KBUFL,KBUFR,ISUP,ISEC0 ,ISEC1,ISEC2 ,ISEC3 ,ISEC4,
+ 1 KELEM,CNAME,CUNIT,KVALS1,VALUE,CVAL,IERR)
+c
+ IF(IERR.NE.0) CALL EXIT(2)
+C
+ CALL BUPRS0(ISEC0)
+ CALL BUPRS1(ISEC1)
+ CALL BUUKEY(ISEC1,ISEC2,KEY,ISUP,KERR)
+ CALL BUPRS2(ISUP ,KEY)
+ ISUBSET=1
+ CALL BUSEL2(ISUBSET,KELEM,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+ 1 CUNITS,IERR)
+ CALL BUPRS3(ISEC3,KTDLEN,KTDLST,KTDEXL,KTDEXP,KELEM,CNAME)
+C
+ WRITE(*,'(a,$)') ' STARTING SUBSET TO BE PRINTED : '
+ READ(*,'(I5)') IST
+ WRITE(*,'(a,$)') ' ENDING SUBSET TO BE PRINTED : '
+ READ(*,'(I6)') IEND
+C
+ ICODE=0
+ CALL BUPRT(ICODE,IST,IEND,KELEM,CNAME,CUNIT,CVAL,
+ 1 KVALS1,VALUE,ISUP,ISEC1,IERR)
+C
+C
+ IREP=IREP+1
+C
+ IF(IREP.GT.3) GO TO 900
+ GO TO 900
+C
+ 810 CONTINUE
+C
+ WRITE(*,'(1H ,A)') 'OPEN ERROR ON INPUT FILE'
+ GO TO 900
+C
+ 800 CONTINUE
+C
+ IF(IERR.EQ.-1) THEN
+ print*,'Number of records processed ',IREP
+ ELSE
+ print*,' BUFR : error= ',ierr
+ END IF
+C
+ 900 CONTINUE
+C
+ STOP
+ END
diff --git a/examples/bufr/crex2bufr.F b/examples/bufr/crex2bufr.F
new file mode 100755
index 0000000..15c0ad3
--- /dev/null
+++ b/examples/bufr/crex2bufr.F
@@ -0,0 +1,499 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ PROGRAM CREX2BUFR
+C
+C**** *CREX2BUFR*
+C
+C
+C PURPOSE.
+C --------
+C Decode CREX coded data into BUFR format
+C
+C
+C** INTERFACE.
+C ----------
+C
+C NONE.
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2=4096,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=320000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+#ifdef JBPW_64
+ 2 JBPW = 64,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT=1200,
+#else
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT=1200,
+#endif
+ 3 JWORK=4096000,JKEY=46,JBYTE=80000)
+C
+ PARAMETER (KELEM=40000)
+ PARAMETER (KVALS=360000)
+C
+ DIMENSION KBUFF(JBUFL),KBUFR(JBUFL)
+ DIMENSION KSUP(JSUP) ,KSEC0(JSEC0),KSEC1(JSEC1)
+ DIMENSION KSEC2(JSEC2),KSEC3(JSEC3),KSEC4(JSEC4)
+ DIMENSION KEY (JKEY),KREQ(2)
+C
+ REAL*8 VALUES(KVALS), VALUE(KVALS)
+ REAL*8 RVIND
+ REAL*8 EPS
+C
+ DIMENSION KTDLST(KELEM),KTDEXP(KELEM),KTDLST1(KELEM)
+ DIMENSION KDATA(2000)
+C
+ CHARACTER*256 CF,COUT,CARG(4)
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+ CHARACTER*80 CVALS(KVALS)
+ CHARACTER*80 CVAL(KVALS),CV
+ CHARACTER*80 YENC
+ CHARACTER*160000 YBUFF
+c
+ EQUIVALENCE(YBUFF,KBUFF(1))
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+ NBYTPW=JBPW/8
+ RVIND=1.7D38
+ NVIND=2147483647
+ IOBS=0
+ EPS=10.D-8
+ N=0
+ OCOMP=.FALSE.
+ OO=.FALSE.
+ CF=' '
+ COUT=' '
+ KKK=0
+C
+C GET INPUT AND OUTPUT FILE NAME.
+C
+ NARG=IARGC()
+c
+ IF(NARG.NE.4) THEN
+ print*,'Usage -- crex2bufr -i infile -o outfile'
+ STOP
+ END IF
+c
+ DO 101 J=1,NARG
+ CALL GETARG(J,CARG(J))
+ 101 CONTINUE
+c
+ IF(CARG(1).NE.'-i'.AND.CARG(1).NE.'-I'.OR.
+ 1 CARG(2).EQ.' ') THEN
+ print*,'Usage -- crex2bufr -i inpfile -o outfile'
+ STOP
+ END IF
+ IF(CARG(3).NE.'-o'.AND.CARG(3).NE.'-O'.OR.
+ 1 CARG(4).EQ.' ') THEN
+ print*,'Usage -- crex2bufr -i inpfile -o outfile'
+ STOP
+ END IF
+c
+ CF=CARG(2)
+ II=INDEX(CF,' ')
+ II=II-1
+ COUT=CARG(4)
+ I=INDEX(COUT,' ')
+ I=I-1
+C
+C* 1.2 OPEN FILE CONTAINING CREX DATA.
+C -------------------------------
+ 120 CONTINUE
+C
+ IRET=0
+ CALL PBOPEN(IUNIT,CF(1:II),'r',IRET)
+ IF(IRET.EQ.-1) STOP 'open failed on input file'
+ IF(IRET.EQ.-2) STOP 'Invalid file name'
+ IF(IRET.EQ.-3) STOP 'Invalid open mode specified'
+c
+C
+C* 1.2.1 OPEN OUTPUT FILE.
+C ------------------
+ 121 CONTINUE
+C
+
+ CALL PBOPEN(IUNIT1,COUT(1:I),'w',IRET)
+ IF(IRET.EQ.-1) STOP 'open failed on output file'
+ IF(IRET.EQ.-2) STOP 'Invalid output file name'
+ IF(IRET.EQ.-3) STOP 'Invalid open mode specified'
+C
+C -----------------------------------------------------------------
+C* 2. SET REQUEST FOR EXPANSION.
+C --------------------------
+ 200 CONTINUE
+C
+ NR=1
+ OPRT=.TRUE.
+ OENC=.FALSE.
+C
+ OENC=.TRUE.
+
+ 210 CONTINUE
+C
+C
+C -----------------------------------------------------------------
+C* 3. READ CREX MESSAGE.
+C ------------------
+ 300 CONTINUE
+C
+ IERR=0
+ IRET=0
+c
+ CALL PBCREX(IUNIT,KBUFF,JBUFL,KBUFL,IRET)
+ IF(IRET.LT.0) THEN
+ if(iret.eq.-1) stop 'End of file '
+ if(iret.eq.-2) stop 'Error in handling the file'
+ if(iret.eq.-3) stop 'Error during read CREX file.'
+ END IF
+c
+ N=N+1
+ print*,'----------------------------------',n
+ IF(N.LT.NR) GO TO 300
+ KEL=KELEM
+C
+C -----------------------------------------------------------------
+C* 4. EXPAND CREX MESSAGE.
+C --------------------
+ 400 CONTINUE
+C
+ IERR=0
+ CALL CREXEX(KBUFL,YBUFF,KSUP,KSEC0 ,KSEC1,KSEC3 ,
+ 1 KEL,CNAMES,CUNITS,KVALS,VALUES,CVALS,IERR)
+C
+ IF(IERR.NE.0) then
+ print*,'CREX error ', ierr
+ IF(IERR.EQ.20.or.IERR.EQ.14) THEN
+ KEL=KVALS/KSUP(6)
+ GO TO 400
+ ELSE
+ CALL EXIT(2)
+ END IF
+ END IF
+C
+
+ IOBS=IOBS+KSEC3(3)
+C
+ ISUBSET=1
+ CALL CREXSEL2(ISUBSET,KEL,KTDLEN,KTDLST,KTDEXL,KTDEXP,
+ 1 CNAMES,CUNITS,KERR)
+ IF(KERR.NE.0) then
+ print*,'CREXSEL: error.'
+ CALL EXIT(2)
+ END IF
+C
+C* 4.1 PRINT CONTENT OF EXPANDED DATA.
+C -------------------------------
+ 410 CONTINUE
+C
+ IF(.NOT.OPRT) GO TO 500
+C
+C* 4.2 PRINT SECTION ZERO OF CREX MESSAGE.
+C -----------------------------------
+ 420 CONTINUE
+C
+
+ CALL CREXPRS0(KSEC0)
+C
+C* 4.3 PRINT SECTION ONE OF CREX MESSAGE.
+C -----------------------------------
+ 430 CONTINUE
+C
+ CALL CREXPRS1(KSEC1,KSEC3,KTDLEN,KTDLST,KTDEXL,
+ 1 KTDEXP,KEL,CNAMES)
+C
+C
+C
+C* 4.6 PRINT SECTION 4 (DATA).
+C -----------------------
+ 460 CONTINUE
+C
+C IN THE CASE OF MANY SUBSETS DEFINE RANGE OF SUBSETS
+C
+ IF(.NOT.OO) THEN
+ WRITE(*,'(a,$)') ' STARTING SUBSET TO BE PRINTED : '
+ READ(*,'(BN,I6)') IST
+ WRITE(*,'(a,$)') ' ENDING SUBSET TO BE PRINTED : '
+ READ(*,'(BN,I6)') IEND
+ OO=.false.
+ END IF
+C
+C PRINT DATA
+C
+ ICODE=0
+ CALL CREXPRT(ICODE,IST,KSEC3(3),KEL,CNAMES,CUNITS,CVALS,
+ 1 KVALS,VALUES,KSUP,KSEC1,IERR)
+C
+C
+C -----------------------------------------------------------------
+C* 5. COLLECT DATA FOR REPACKING.
+C ---------------------------
+ 500 CONTINUE
+C
+ IF(.NOT.OENC) GO TO 300
+C
+C FIRST GET DATA DESCRIPTORS
+C
+ KK=0
+ IST=1
+ IEND=KSEC3(3)
+C
+ DO ISUBSET=IST, IEND
+
+
+ CALL CREXSEL2(ISUBSET,KEL,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+ 1 CUNITS,IERR)
+ IF(KERR.NE.0) THEN
+ print*,'CREXSEL: error ',kerr
+ CALL EXIT(2)
+ END IF
+C
+ JM1KELEM=(ISUBSET-1)*KEL
+C
+ DO 501 I=1,KTDEXL
+ INV=I+JM1KELEM
+ IN =I+JM1KELEM
+C
+ IF(CUNITS(I).EQ.'CHARACTER') THEN
+ IPOS =VALUES(INV)/1000.
+ ICH=NINT(VALUES(INV)-IPOS*1000)
+ KKK=KKK+1
+ VALUE(IN)=KKK*1000+ICH
+ IF(CVALS(IPOS)(1:1).EQ.'/') THEN
+ CV=' '
+ DO II=1,ICH
+ CV(II:II)=CHAR(255)
+ END DO
+ CVAL(KKK)=CV
+ ELSE
+ CVAL(KKK)=CVALS(IPOS)
+ END IF
+ ELSEIF(CUNITS(I)(1:2).EQ.'C '.AND.
+ 1 KTDEXP(I)/1000.eq.12 ) THEN
+ VALUE(IN)=VALUES(INV)+273.15
+ ELSEIF(CUNITS(I)(1:2).EQ.'NB'.AND.
+ 1 KTDEXP(I).EQ.015003) THEN
+ VALUE(IN)=VALUES(INV)*0.0001
+ ELSE
+ VALUE(IN)=VALUES(INV)
+ END IF
+C
+ IF(KTDEXP(I).EQ.31001.OR.KTDEXP(I).EQ.31002.OR.
+ 1 KTDEXP(I).EQ.31000) THEN
+ KK=KK+1
+ KDATA(KK)=NINT(VALUES(INV))
+ END IF
+ 501 CONTINUE
+C
+ END DO
+C
+ KDLEN=2
+ IF(KK.NE.0) KDLEN=KK
+
+C -----------------------------------------------------------------
+C* 6. PACK BUFR MESSAGE.
+C -----------------
+ 600 CONTINUE
+C
+ KKK=0
+C
+ IF(KSEC0(3).LE.1) THEN
+ KSEC0(3)=3 ! Edition 3 of bufr message
+C
+ KSEC1(1)=18
+ KSEC1(2)=3 ! Bufr edition number
+ KSEC1(3)=KSEC1(3)
+ KSEC1(4)=1
+ KSEC1(5)=0 ! presence od section 2
+ KSEC1(7)=0
+ KSEC1(8)=0 ! Bufr local tables version number
+ KSEC1(9)=0
+ KSEC1(10)=0
+ KSEC1(11)=0
+ KSEC1(12)=0
+ KSEC1(13)=0
+ KSEC1(14)=0
+ KSEC1(15)=0 ! Bufr master table version number
+c
+ I_004001=0
+ I_004002=0
+ I_004003=0
+ I_004004=0
+ I_004005=0
+c
+ DO I=1,KTDEXL
+ IF(KTDEXP(I).EQ.004001) THEN
+ IF(I_004001.EQ.0) I_004001=I
+ ELSEIF(KTDEXP(I).EQ.004002) THEN
+ IF(I_004002.EQ.0) I_004002=I
+ ELSEIF(KTDEXP(I).EQ.004003) THEN
+ IF(I_004003.EQ.0) I_004003=I
+ ELSEIF(KTDEXP(I).EQ.004004) THEN
+ IF(I_004004.EQ.0) I_004004=I
+ ELSEIF(KTDEXP(I).EQ.004005) THEN
+ IF(I_004005.EQ.0) I_004005=I
+ END IF
+ END DO
+c
+ KSEC1(9)=NINT(VALUE(I_004001))-1900
+ IF(NINT(VALUE(I_004001)).GE.2000) THEN
+ KSEC1(9)=NINT(VALUE(I_004001))-2000
+ END IF
+ KSEC1(10)=NINT(VALUE(I_004002))
+ KSEC1(11)=NINT(VALUE(I_004003))
+ KSEC1(12)=NINT(VALUE(I_004004))
+ KSEC1(13)=NINT(VALUE(I_004005))
+c
+ KSEC1(14)=0
+ KSEC1(15)=13
+ KSEC1(16)=0
+ ELSEIF(KSEC0(3).EQ.2) THEN
+ KSEC0(3)=4 ! Edition 4 of bufr message
+c
+ KSEC1(1)=22 ! The size of section 1
+ KSEC1(2)=4
+ KSEC1(3)=KSEC1(3)
+ KSEC1(5)=0 ! presence od section 2
+ KSEC1(9)=0
+ KSEC1(10)=0
+ KSEC1(11)=0
+ KSEC1(12)=0
+ KSEC1(13)=0
+c
+ I_004001=0
+ I_004002=0
+ I_004003=0
+ I_004004=0
+ I_004005=0
+c
+ DO I=1,KTDEXL
+ IF(KTDEXP(I).EQ.004001) THEN
+ IF(I_004001.EQ.0) I_004001=I
+ ELSEIF(KTDEXP(I).EQ.004002) THEN
+ IF(I_004002.EQ.0) I_004002=I
+ ELSEIF(KTDEXP(I).EQ.004003) THEN
+ IF(I_004003.EQ.0) I_004003=I
+ ELSEIF(KTDEXP(I).EQ.004004) THEN
+ IF(I_004004.EQ.0) I_004004=I
+ ELSEIF(KTDEXP(I).EQ.004005) THEN
+ IF(I_004005.EQ.0) I_004005=I
+ END IF
+ END DO
+c
+ KSEC1( 9)=NINT(VALUE(I_004001))
+ KSEC1(10)=NINT(VALUE(I_004002))
+ KSEC1(11)=NINT(VALUE(I_004003))
+ KSEC1(12)=NINT(VALUE(I_004004))
+ KSEC1(13)=NINT(VALUE(I_004005))
+c
+ KSEC1(14)=0 ! Bufr master table
+ KSEC1(15)=KSEC1(17) ! Bufr master table version number
+ KSEC1(16)=KSEC1(16) ! Originating sub-centre
+ KSEC1(17)=KSEC1( 7) ! International sub-category
+ KSEC1( 7)=0
+ KSEC1(18)=0 ! Second
+c
+
+ END IF
+c
+ KSEC3(4)=192 ! No compression
+c
+ KBUFL=JBUFL
+C
+C
+C* 6.2 ENCODE DATA INTO BUFR MESSAGE.
+C ------------------------------
+ 620 CONTINUE
+C
+c Modify descriptor list for delayed
+c replication factor
+c
+ J=0
+ DO I=1,KTDLEN
+ IIF=KTDLST(I)/100000
+ IF(IIF.EQ.1) THEN
+ II=KTDLST(I)/1000
+ IY=KTDLST(I)-II*1000
+ IF(IY.EQ.0) THEN
+ J=J+1
+ KTDLST1(J)=KTDLST(I)
+ J=J+1
+ KTDLST1(J)=031002
+ ELSE
+ j=j+1
+ KTDlst1(j)=KTDlst(i)
+ END IF
+ ELSE
+ J=J+1
+ KTDLST1(J)=KTDLST(I)
+ END IF
+ END DO
+c
+ KTDLEN=J
+c
+ KERR=0
+c
+ CALL BUFREN( KSEC0,KSEC1,KSEC2,KSEC3,KSEC4,
+ 1 KTDLEN,KTDLST1,KDLEN,KDATA,KEL,
+ 2 KVALS,VALUE,CVAL,KBUFL,KBUFR,KERR)
+C
+ IF(KERR.gt.0) THEN
+ print*,'error is ',kerr
+ PRINT*,'ERROR DURING ENCODING.'
+ CALL EXIT(2)
+ END IF
+C
+C 6.3 WRITE PACKED BUFR MESSAGE INTO FILE.
+C ------------------------------------
+ 630 CONTINUE
+C
+ ILEN=KBUFL*NBYTPW
+C
+ IERR=0
+ CALL PBWRITE(IUNIT1,KBUFR,ILEN,IERR)
+ if(ierr.lt.0) then
+ print*,'Error writing into target file.'
+ CALL EXIT(2)
+ END IF
+C
+ GO TO 300
+C -----------------------------------------------------------------
+C
+ END
diff --git a/examples/bufr/decode_bufr.F b/examples/bufr/decode_bufr.F
new file mode 100755
index 0000000..d6fa27f
--- /dev/null
+++ b/examples/bufr/decode_bufr.F
@@ -0,0 +1,623 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ PROGRAM BUFR
+C
+C**** *BUFR*
+C
+C
+C PURPOSE.
+C --------
+C EXAMPLE OF USING BUFR UNPACKING/PACKING SOFTWARE.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C NONE.
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C CALL BUSEL2
+C CALL BUFREX
+C CALL BUFREN
+C CALL BUPRS0
+C CALL BUPRS1
+C CALL BUPRS2
+C CALL BUPRS3
+C CALL BUPRT
+C CALL BUUKEY
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/09/87.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2=4096,JSEC3= 4,
+ 1 JSEC4=2,JELEM=320000,JSUBS=400,JCVAL=150 ,JBUFL=512000,
+#ifdef JBPW_64
+ 2 JBPW = 64,JTAB =3000,JCTAB=3000,JCTST=9000,JCTEXT=9000,
+#else
+ 2 JBPW = 32,JTAB =3000,JCTAB=3000,JCTST=9000,JCTEXT=9000,
+#endif
+ 3 JWORK=4096000,JKEY=46, JTMAX=10,JTCLAS=64,JTEL=255)
+
+C
+ PARAMETER (KELEM=40000)
+ PARAMETER (KVALS=4096000)
+C
+ DIMENSION KBUFF(JBUFL)
+ DIMENSION KBUFR(JBUFL)
+ DIMENSION KSUP(JSUP) ,KSEC0(JSEC0),KSEC1(JSEC1)
+ DIMENSION KSEC2(JSEC2),KSEC3(JSEC3),KSEC4(JSEC4)
+ DIMENSION KEY (JKEY),KREQ(2)
+ DIMENSION NREQUEST(2)
+C
+ REAL*8 VALUES(KVALS),VALUE(KVALS)
+ DIMENSION KTDLST(JELEM),KTDEXP(JELEM),KRQ(KELEM)
+ REAL*8 RQV(KELEM)
+ DIMENSION KDATA(200),KBOXR(JELEM*4)
+ REAL*8 VALS(KVALS)
+C
+ CHARACTER*256 CF,COUT,CARG(4)
+ CHARACTER*64 CNAMES(KELEM),CBOXN(JELEM*4)
+ CHARACTER*24 CUNITS(KELEM),CBOXU(JELEM*4)
+ CHARACTER*80 CVALS(kelem)
+ CHARACTER*80 CVAL(kelem)
+ CHARACTER*80 YENC
+ REAL*8 RVIND
+ REAL*8 EPS
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+C MISSING VALUE INDICATOR
+C
+ NBYTPW=JBPW/8
+ RVIND=1.7D38
+ NVIND=2147483647
+ IOBS=0
+ EPS=10.D-8
+ NPACK=0
+ IYEAR=NVIND
+ N=0
+ NCOM=0
+ OO=.FALSE.
+C
+C
+C
+C GET INPUT AND OUTPUT FILE NAME.
+C
+ NARG=IARGC()
+C
+C
+ DO 104 J=1,NARG
+ CALL GETARG(J,CARG(J))
+ 104 CONTINUE
+
+ II=0
+ IO=0
+ DO 105 J=1,NARG
+ IF(CARG(J).EQ.'-i') THEN
+ IN=J
+ ELSEIF(CARG(J).EQ.'-o') THEN
+ IO=J
+ END IF
+ 105 CONTINUE
+ IF(IN.EQ.0) THEN
+ PRINT*,'USAGE -- decode_bufr -i infile'
+ STOP
+ END IF
+ IF(IO.EQ.0.and.IN.EQ.0) THEN
+ PRINT*,'USAGE -- decode_bufr -i infile -o outfile'
+ STOP
+ END IF
+
+C
+ IF(IO.NE.0) COUT=CARG(IO+1)
+C
+ IF(IO.LT.IN) THEN
+ IST=IN+1
+ IEND=NARG
+ ELSE
+ IST=IN+1
+ IEND=IO-1
+ END IF
+C
+C
+ IF(IO.NE.0) THEN
+ JJ=INDEX(COUT,' ')
+ JJ=JJ-1
+ CALL PBOPEN(IUNIT1,COUT(1:JJ),'W',IRET)
+ IF(IRET.EQ.-1) STOP 'OPEN FAILED ON BUFR.DAT'
+ IF(IRET.EQ.-2) STOP 'INVALID FILE NAME'
+ IF(IRET.EQ.-3) STOP 'INVALID OPEN MODE SPECIFIED'
+ END IF
+C
+ DO 101 II=IST,IEND
+
+ CF=CARG(II)
+ ILN=INDEX(CF,' ')
+ ILN=ILN-1
+
+ KRQL=0
+ NR=0
+ KREQ(1)=0
+ KREQ(2)=0
+ DO 103 I=1,KELEM
+ RQV(I)=RVIND
+ KRQ(I)=NVIND
+ 103 CONTINUE
+C
+C* 1.2 OPEN FILE CONTAINING BUFR DATA.
+C -------------------------------
+ 120 CONTINUE
+C
+ IRET=0
+ CALL PBOPEN(IUNIT,CF(1:ILN),'R',IRET)
+ IF(IRET.EQ.-1) STOP 'OPEN FAILED'
+ IF(IRET.EQ.-2) STOP 'INVALID FILE NAME'
+ IF(IRET.EQ.-3) STOP 'INVALID OPEN MODE SPECIFIED'
+C
+ IF(IO.NE.0) THEN
+ CALL PBOPEN(IUNIT1,COUT(1:JJ),'W',IRET)
+ IF(IRET.EQ.-1) STOP 'OPEN FAILED ON BUFR.DAT'
+ IF(IRET.EQ.-2) STOP 'INVALID FILE NAME'
+ IF(IRET.EQ.-3) STOP 'INVALID OPEN MODE SPECIFIED'
+ END IF
+C
+
+C
+C
+C -----------------------------------------------------------------
+C* 2. SET REQUEST FOR EXPANSION.
+C --------------------------
+ 200 CONTINUE
+C
+ OPRT=.FALSE.
+ OENC=.FALSE.
+ WRITE(*,'(A,$)') ' DO YOU WANT TO PRINT( Y/N ) : '
+ READ (*,'(A)') YENC
+ IF(YENC(1:1).EQ.'Y'.OR.YENC(1:1).EQ.'y') THEN
+ OPRT=.TRUE.
+ END IF
+ ICODE=0
+ WRITE(*,'(A,$)') ' CODE TABLES TO BE PRINTED ( Y/N ) : '
+ READ (*,'(A)') YCODC
+ IF(YCODC(1:1).EQ.'Y'.OR.YCODC(1:1).EQ.'y') THEN
+ ICODE=1
+ END IF
+ WRITE(*,'(A,$)') ' DO YOU WANT ENCODING( Y/N ) : '
+ READ (*,'(A)') YENC
+ IF(YENC(1:1).EQ.'Y'.OR.YENC(1:1).EQ.'y') THEN
+ OENC=.TRUE.
+ WRITE(*,'(A,$)') ' NUMBER OF SUBSETS TO PACK : '
+ READ(*,'(BN,I4)') NCOM
+ OCOMP=.FALSE.
+ WRITE(*,'(A,$)') ' DO YOU WANT COMPRESSION( Y/N ) : '
+ READ (*,'(A)') YCOMP
+ IF(YCOMP(1:1).EQ.'Y'.OR.YCOMP(1:1).EQ.'y') OCOMP=.TRUE.
+ END IF
+ WRITE(*,'(A,$)') ' RECORD NUMBER TO START FROM : '
+ READ(*,'(BN,I6)') NR
+C
+ 201 CONTINUE
+C
+ WRITE(*,'(A,$)') ' REQUESTED ELEMENT : '
+ READ(*,'(BN,I6)') IEL
+ WRITE(*,'(A,$)') ' REQUESTED VALUE : '
+ READ(*,'(BN,F12.2)') VAL
+ IF(IEL.EQ.0) THEN
+ KRQL=J
+ ELSE
+ J=J+1
+ KRQ(J)=IEL
+ RQV(J)=VAL
+ IF(VAL.EQ.0.) RQV(J)=RVIND
+ GO TO 201
+ END IF
+C
+ WRITE(*,'(A,$)') ' REQUESTED FLAG 1 : '
+ READ(*,'(BN,I6)') KREQ(1)
+C
+ WRITE(*,'(A,$)') ' REQUESTED FLAG 2 : '
+ READ(*,'(BN,I6)') KREQ(2)
+C
+ WRITE(*,'(A,$)') ' DO YOU WANT TO PRINT SECTION 0-3( Y/N ) : '
+ READ (*,'(A,$)') YENC
+ OSEC3=.FALSE.
+ IF(YENC(1:1).EQ.'Y'.OR.YENC(1:1).EQ.'y') OSEC3=.TRUE.
+C
+C* 2.1 SET REQUEST FOR PARTIAL EXPANSION.
+C ----------------------------------
+ 210 CONTINUE
+C
+ IERR=0
+ CALL BUSRQ(KREQ,KRQL,KRQ,RQV,IERR)
+C
+C SET VARIABLE TO PACK BIG VALUES AS MISSING VALUE INDICATOR
+C
+ KPMISS=1
+ KPRUS=0
+ KOKEY=0
+ CALL BUPRQ(KPMISS,KPRUS,KOKEY)
+C
+C -----------------------------------------------------------------
+ IF(NCOM.NE.0) THEN
+ KEL1=KVALS/NCOM
+ IF(KEL1.GT.KELEM) KEL1=KELEM
+ END IF
+C
+C* 3. READ BUFR MESSAGE.
+C ------------------
+ 300 CONTINUE
+C
+ IERR=0
+ KBUFL=0
+C
+ CALL PBBUFR(IUNIT,KBUFF,JBUFL,KBUFL,IERR)
+ IF(IERR.EQ.-1) THEN
+ IF(NPACK.NE.0) GO TO 600
+ PRINT*,'NUMBER OF SUBSETS ',IOBS
+ PRINT*,'NUMBER OF MESSAGES ',N
+ STOP 'EOF'
+ END IF
+ IF(IERR.EQ.-2) STOP 'FILE HANDLING PROBLEM'
+ IF(IERR.EQ.-3) STOP 'ARRAY TOO SMALL FOR PRODUCT'
+C
+ N=N+1
+c PRINT*,'----------------------------------',N,' ',KBUFL
+ KBUFL=KBUFL/NBYTPW+1
+ IF(N.LT.NR) GO TO 300
+C
+C -----------------------------------------------------------------
+C* 4. EXPAND BUFR MESSAGE.
+C --------------------
+ 400 CONTINUE
+C
+ CALL BUS0123( KBUFL,KBUFF,KSUP,KSEC0,KSEC1,KSEC2,KSEC3,IERR)
+ IF(IERR.NE.0) THEN
+ PRINT*,'ERROR IN BUS012: ',IERR
+ PRINT*,' BUFR MESSAGE NUMBER ',N,' CORRUPTED.'
+ IERR=0
+ GO TO 300
+ END IF
+C
+ KEL=KVALS/KSEC3(3)
+ IF(KEL.GT.KELEM) KEL=KELEM
+C
+ CALL BUFREX(KBUFL,KBUFF,KSUP,KSEC0 ,KSEC1,KSEC2 ,KSEC3 ,KSEC4,
+ 1 KEL,CNAMES,CUNITS,KVALS,VALUES,CVALS,IERR)
+C
+ IF(IERR.NE.0) THEN
+ CALL EXIT(2)
+ END IF
+C
+C
+ IOBS=IOBS+KSEC3(3)
+C
+C
+ ISUBSET=1
+ CALL BUSEL2(ISUBSET,KEL,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+ 1 CUNITS,IERR)
+C IF(IERR.NE.0) CALL EXIT(2)
+C
+C
+c DO 401 IK=1,KSEC3(3)
+c
+c CALL BUSEL2(IK,KEL,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+c 1 CUNITS,IERR)
+c KSUP(5)=KTDEXL
+c CALL BUBOX(IK,KSUP,KEL,KTDEXP,CNAMES,CUNITS,KVALS,VALUES,
+c 1 KBOX,KAPP,KLEN,KBOXR,VALS,CBOXN,CBOXU,IERR)
+C
+c 401 CONTINUE
+C
+C
+C* 4.1 PRINT CONTENT OF EXPANDED DATA.
+C -------------------------------
+ 410 CONTINUE
+C
+ IF(.NOT.OPRT) GO TO 500
+ IF(.NOT.OSEC3) GO TO 450
+C
+C* 4.2 PRINT SECTION ZERO OF BUFR MESSAGE.
+C -----------------------------------
+ 420 CONTINUE
+C
+
+ CALL BUPRS0(KSEC0)
+C
+C* 4.3 PRINT SECTION ONE OF BUFR MESSAGE.
+C -----------------------------------
+ 430 CONTINUE
+C
+ CALL BUPRS1(KSEC1)
+C
+C
+C* 4.4 PRINT SECTION TWO OF BUFR MESSAGE.
+C -----------------------------------
+ 440 CONTINUE
+C
+C AT ECMWF SECTION 2 CONTAINS RDB KEY.
+C SO UNPACK KEY
+C
+ CALL BUUKEY(KSEC1,KSEC2,KEY,KSUP,IERR)
+C
+C PRINT KEY
+C
+ CALL BUPRS2(KSUP ,KEY)
+C
+C* 4.5 PRINT SECTION 3 OF BUFR MESSAGE.
+C -----------------------------------
+ 450 CONTINUE
+C
+C FIRST GET DATA DESCRIPTORS
+C
+C Multi subset uncompressed data descriptors for the 1st subset
+C Each subset can contain completly different list of expanded
+C discriptors
+C
+ ISUBSET=1
+ CALL BUSEL2(ISUBSET,KEL,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+ 1 CUNITS,IERR)
+ IF(IERR.NE.0) CALL EXIT(2)
+C
+C PRINT CONTENT
+C
+ IF(OSEC3) THEN
+ CALL BUPRS3(KSEC3,KTDLEN,KTDLST,KTDEXL,KTDEXP,KEL,CNAMES)
+ END IF
+C
+C* 4.6 PRINT SECTION 4 (DATA).
+C -----------------------
+ 460 CONTINUE
+C
+C IN THE CASE OF MANY SUBSETS DEFINE RANGE OF SUBSETS
+C
+ IF(.NOT.OO) THEN
+ WRITE(*,'(A,$)') ' STARTING SUBSET TO BE PRINTED : '
+ READ(*,'(BN,I4)') IST
+ WRITE(*,'(A,$)') ' ENDING SUBSET TO BE PRINTED : '
+ READ(*,'(BN,I4)') IEND
+ OO=.FALSE.
+ END IF
+C
+C PRINT DATA
+C
+C IF(KSEC1(6).EQ.11) THEN
+C
+C IST=1
+C IEND=KSEC3(3)
+C
+ CALL BUPRT(ICODE,IST,IEND,KEL,CNAMES,CUNITS,CVALS,
+ 1 KVALS,VALUES,KSUP,KSEC1,IERR)
+C ELSE
+C
+C RESOLVE BIT MAPS FOR EACH SUBSET
+C
+C ist=1
+C iend=ksec3(3)
+C
+C IF(IEND.GT.KSEC3(3)) IEND=KSEC3(3)
+C
+C DO 461 IK=IST,IEND
+C
+C CALL BUSEL2(IK,KEL,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+C 1 CUNITS,IERR)
+C
+C KSUP(5)=KTDEXL
+C CALL BUBOX(IK,KSUP,KEL,KTDEXP,CNAMES,CUNITS,KVALS,VALUES,
+C 1 KBOX,KAPP,KLEN,KBOXR,VALS,CBOXN,CBOXU,IERR)
+C IF(IERR.NE.0) CALL EXIT(2)
+C
+C CALL BUPRTBOX(KBOX,KAPP,KLEN,KBOXR,VALS,CBOXN,CBOXU)
+C
+C461 CONTINUE
+C END IF
+C
+C -----------------------------------------------------------------
+C* 5. COLLECT DATA FOR REPACKING.
+C ---------------------------
+ 500 CONTINUE
+C
+C
+ IF(.NOT.OENC) GO TO 300
+C
+ ISUBS=KSEC3(3)
+ DO J=1,ISUBS
+C
+ NPACK=NPACK+1
+C
+C FIRST GET DATA DESCRIPTORS
+C
+ CALL BUSEL2(J,KEL,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+ 1 CUNITS,IERR)
+ IF(IERR.NE.0) CALL EXIT(2)
+C
+ DO I=1,KTDEXL
+ IO=I+(NPACK-1)*KEL1
+ IN=I+(J-1)*KEL
+C
+ IF(CUNITS(I).EQ.'CCITTIA5') THEN
+ IPOS =VALUES(IN)/1000.
+ ICH=NINT(VALUES(IN)-IPOS*1000)
+ KKK=KKK+1
+ VALUE(IO)=KKK*1000+ICH
+ CVAL(KKK)=CVALS(IPOS)
+ ELSE
+ VALUE(IO)=VALUES(IN)
+ END IF
+ IF(KTDEXP(I).EQ.31001.OR.KTDEXP(I).EQ.31002) THEN
+ KK=KK+1
+ KDATA(KK)=NINT(VALUE(IO))
+ END IF
+ IF(KTDEXP(I).EQ.004001) THEN
+ IYEAR=NINT(VALUE(IO))
+ END IF
+
+ END DO
+C
+ KDLEN=KK
+ IF(NPACK.EQ.NCOM) THEN
+
+
+ KSEC3(3)=NPACK
+ KSEC1(5)=0
+ KSEC1(8)=1
+ KSEC1(15)=12
+ IF(KSEC0(3).LT.4) THEN
+ KSEC1(17)=255
+ KSEC1(18)=0
+ END IF
+ KSEC0(3)=3 ! EDITION 4 OF BUFR MESSAGE
+ IF(KSEC0(3).GE.4) KSEC1(1)=22
+ KSEC3(4)=0 ! NO COMPRESSION
+ IF(KSEC0(3).LE.3) THEN
+ IF(IYEAR.GT.2000) THEN
+ KSEC1(9)=IYEAR-2000
+ ELSE
+ KSEC1(9)=IYEAR-1900
+ END IF
+ ELSE
+ KSEC1(9)=IYEAR
+ END IF
+ IF(OCOMP) KSEC3(4)=64 ! COMPRESSION
+ KBUFL=JBUFL
+ CALL BUFREN( KSEC0,KSEC1,KSEC2,KSEC3,KSEC4,
+ 1 KTDLEN,KTDLST,KDLEN,KDATA,KEL1,
+ 2 KVALS,VALUE,CVAL,KBUFL,KBUFR,IERR)
+ IF(IERR.NE.0) THEN
+ PRINT*,'ERROR IS ',IERR
+ PRINT*,'ERROR DURING ENCODING.'
+ CALL EXIT(2)
+ END IF
+C
+ ILEN=KBUFL*NBYTPW
+C
+ IERR=0
+C
+ CALL PBWRITE(IUNIT1,KBUFR,ILEN,IERR)
+ IF(IERR.LT.0) THEN
+ PRINT*,'ERROR WRITING INTO TARGET FILE.'
+ CALL EXIT(2)
+ END IF
+ PRINT*,'RECORD WRITTEN INTO FILE '
+C
+ NPACK=0
+ KKK=0
+ KK=0
+ END IF
+C
+ END DO
+C
+ GO TO 300
+C -----------------------------------------------------------------
+C* 6. PACK BUFR MESSAGE BACK INTO BUFR.
+C ---------------------------------
+ 600 CONTINUE
+C
+
+ KSEC3(3)=NPACK
+ KSEC1(8)=1
+ KSEC1(15)=12
+ KSEC0(3)=4 ! EDITION 4 OF BUFR MESSAGE
+ IF(KSEC0(3).GE.4) KSEC1(1)=22
+ IF(KSEC0(3).LT.4) THEN
+ KSEC1(17)=255
+ KSEC1(18)=0
+ END IF
+
+ KSEC3(4)=0 ! NO COMPRESSION
+ IF(KSEC1(9).LT.101) THEN
+ KSEC1(9)=IYEAR
+ END IF
+
+C
+ IF(OCOMP) KSEC3(4)=64 ! COMPRESSION
+ KBUFL=JBUFL
+C
+C
+C* 6.2 ENCODE DATA INTO BUFR MESSAGE.
+C ------------------------------
+ 620 CONTINUE
+C
+ CALL BUFREN( KSEC0,KSEC1,KSEC2,KSEC3,KSEC4,
+ 1 KTDLEN,KTDLST,KDLEN,KDATA,KEL1,
+ 2 KVALS,VALUE,CVAL,KBUFL,KBUFR,IERR)
+ IF(IERR.NE.0) THEN
+ PRINT*,'ERROR IS ',IERR
+ PRINT*,'ERROR DURING ENCODING.'
+ CALL EXIT(2)
+ END IF
+C
+C 6.3 WRITE PACKED BUFR MESSAGE INTO FILE.
+C ------------------------------------
+ 630 CONTINUE
+C
+ ILEN=KBUFL*NBYTPW
+C
+ CALL PBWRITE(IUNIT1,KBUFR,ILEN,IERR)
+ IF(IERR.LT.0) THEN
+ PRINT*,'ERROR WRITING INTO TARGET FILE.'
+ CALL EXIT(2)
+ END IF
+ PRINT*,'RECORD WRITTEN INTO FILE '
+C
+ NPACK=0
+ KKK=0
+C
+ GO TO 300
+C -----------------------------------------------------------------
+C
+ 810 CONTINUE
+C
+ WRITE(*,'(1H ,A)') 'OPEN ERROR ON INPUT FILE'
+ GO TO 900
+C
+ 800 CONTINUE
+C
+ IF(IRET.EQ.-1) THEN
+ PRINT*,'NUMBER OF RECORDS PROCESSED ',N
+ PRINT*,'NUMBER OF OBSERVATIONS ',IOBS
+ ELSE
+ PRINT*,' BUFR : ERROR= ',IERR
+ END IF
+C
+ 900 CONTINUE
+C
+ CALL PBCLOSE(IUNIT,IRET)
+ 101 CONTINUE
+ CALL PBCLOSE(IUNIT1,IRET)
+C
+ END
diff --git a/examples/bufr/decode_bufr_image.F b/examples/bufr/decode_bufr_image.F
new file mode 100755
index 0000000..2d37421
--- /dev/null
+++ b/examples/bufr/decode_bufr_image.F
@@ -0,0 +1,262 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ PROGRAM DECODE_BUFR_IMAGE
+C
+C**** *DECODE_BUFR_IMAGE*
+C
+C
+C PURPOSE.
+C --------
+C Expnds Opera run-length encoded composite images
+C and creates image header and image file.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C NONE.
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/07/2008.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2=4096,JSEC3= 4,
+ 1 JSEC4=2,JELEM=320000,JSUBS=400,JCVAL=150 ,JBUFL=512000,
+#ifdef JBPW_64
+ 2 JBPW = 64,JTAB =3000,JCTAB=3000,JCTST=9000,JCTEXT=9000,
+#else
+ 2 JBPW = 32,JTAB =3000,JCTAB=3000,JCTST=9000,JCTEXT=9000,
+#endif
+ 3 JWORK=4096000,JKEY=46, JTMAX=10,JTCLAS=64,JTEL=255)
+
+C
+ PARAMETER (JIMG=2500000)
+ PARAMETER (KELEM=320000)
+ PARAMETER (KVALS=4096000)
+
+C
+ DIMENSION KBUFF(JBUFL)
+ DIMENSION KBUFR(JBUFL)
+ DIMENSION KSUP(JSUP) ,KSEC0(JSEC0),KSEC1(JSEC1)
+ DIMENSION KSEC2(JSEC2),KSEC3(JSEC3),KSEC4(JSEC4)
+C
+ REAL*8 VALUES(KVALS),VALUES_IMG(500)
+ INTEGER IMAGE(JIMG)
+ DIMENSION KTDLST(KELEM),KTDEXP(KELEM)
+ DIMENSION KTDEXP_IMG(KELEM)
+C
+ CHARACTER*256 CF,COUT,CARG(4),COUT1,COUT2,COUT3
+ CHARACTER*64 CNAMES(KELEM),CNAMES_IMG(KELEM)
+ CHARACTER*24 CUNITS(KELEM),CUNITS_IMG(KELEM)
+ CHARACTER*80 CVALS(KELEM),CVALS_IMG(KELEM)
+ REAL*8 RVIND
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+C MISSING VALUE INDICATOR
+C
+ NBYTPW=JBPW/8
+ RVIND=1.7D38
+ NVIND=2147483647
+ IOBS=0
+ N=0
+C
+C
+C
+C GET INPUT AND OUTPUT FILE NAME.
+C
+ NARG=IARGC()
+C
+C
+ DO 104 J=1,NARG
+ CALL GETARG(J,CARG(J))
+ 104 CONTINUE
+
+ IF(NARG.EQ.0) THEN
+ PRINT*,'USAGE -- decode_bufr_image infile'
+ STOP
+ END IF
+C
+ DO 101 II=1,NARG
+
+ CF=CARG(II)
+ ILN=INDEX(CF,' ')-1
+C
+C* 1.2 OPEN FILE CONTAINING BUFR DATA.
+C -------------------------------
+ 120 CONTINUE
+C
+ IRET=0
+ CALL PBOPEN(IUNIT,CF(1:ILN),'R',IRET)
+ IF(IRET.EQ.-1) STOP 'OPEN FAILED'
+ IF(IRET.EQ.-2) STOP 'INVALID FILE NAME'
+ IF(IRET.EQ.-3) STOP 'INVALID OPEN MODE SPECIFIED'
+C
+ COUT1=CF(1:ILN-5)//'.img'
+ ILN1=INDEX(COUT1,' ')-1
+ CALL PBOPEN(IUNIT1,COUT1(1:ILN1),'W',IRET)
+ IF(IRET.EQ.-1) STOP 'OPEN FAILED ON *.img file'
+ IF(IRET.EQ.-2) STOP 'INVALID FILE NAME'
+ IF(IRET.EQ.-3) STOP 'INVALID OPEN MODE SPECIFIED'
+C
+ COUT2=CF(1:ILN-5)//'.img_header'
+ ILN2=INDEX(COUT2,' ')-1
+ IUNIT2=40
+ OPEN(UNIT=IUNIT2,FILE=COUT2(1:ILN2),STATUS='UNKNOWN',IOSTAT=ios)
+ IF(IOS.NE.0) THEN
+ PRINT*,'Open error on ',COUT2(1:ILN2)
+ STOP
+ END IF
+
+C
+ COUT3=CF(1:ILN-5)//'.section_1'
+ ILN3=INDEX(COUT3,' ')-1
+ IUNIT3=41
+ OPEN(UNIT=IUNIT3,FILE=COUT3(1:ILN3),STATUS='UNKNOWN',IOSTAT=ios)
+ IF(IOS.NE.0) THEN
+ PRINT*,'Open error on ',COUT3(1:ILN3)
+ STOP
+ END IF
+C
+C -----------------------------------------------------------------
+C
+C* 3. READ BUFR MESSAGE.
+C ------------------
+ 300 CONTINUE
+C
+ IERR=0
+ KBUFL=0
+C
+ CALL PBBUFR(IUNIT,KBUFF,JBUFL,KBUFL,IERR)
+ IF(IERR.EQ.-1) THEN
+ PRINT*,'NUMBER OF SUBSETS ',IOBS
+ PRINT*,'NUMBER OF MESSAGES ',N
+ STOP 'EOF'
+ END IF
+ IF(IERR.EQ.-2) STOP 'FILE HANDLING PROBLEM'
+ IF(IERR.EQ.-3) STOP 'ARRAY TOO SMALL FOR PRODUCT'
+C
+ N=N+1
+ PRINT*,'----------------------------------',N,' ',KBUFL
+ KBUFL=KBUFL/NBYTPW+1
+C
+C -----------------------------------------------------------------
+C* 4. EXPAND BUFR MESSAGE.
+C --------------------
+ 400 CONTINUE
+C
+ CALL BUS0123( KBUFL,KBUFF,KSUP,KSEC0,KSEC1,KSEC2,KSEC3,IERR)
+ IF(IERR.NE.0) THEN
+ PRINT*,'ERROR IN BUS012: ',IERR
+ PRINT*,' BUFR MESSAGE NUMBER ',N,' CORRUPTED.'
+ IERR=0
+ GO TO 300
+ END IF
+C
+ KEL=KVALS/KSEC3(3)
+ IF(KEL.GT.KELEM) KEL=KELEM
+C
+ CALL BUFREX(KBUFL,KBUFF,KSUP,KSEC0 ,KSEC1,KSEC2 ,KSEC3 ,KSEC4,
+ 1 KEL,CNAMES,CUNITS,KVALS,VALUES,CVALS,IERR)
+C
+ IF(IERR.NE.0) THEN
+ CALL EXIT(2)
+ END IF
+C
+ IOBS=IOBS+KSEC3(3)
+C
+C
+ ISUBSET=1
+ CALL BUSEL2(ISUBSET,KEL,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+ 1 CUNITS,IERR)
+C IF(IERR.NE.0) CALL EXIT(2)
+C
+C Get full image as array of pixel values
+
+ CALL BUGET_OPERA_IMAGE(KSEC1,KTDEXL,KTDEXP,CNAMES,CUNITS,
+ 1 KELEM,KVALS,VALUES,CVALS,KTDEXL_IMG,KTDEXP_IMG,
+ 2 CNAMES_IMG,CUNITS_IMG,KVALS_IMG,VALUES_IMG,
+ 3 CVALS_IMG,KSIZE_IMG_BYTES,IMAGE,KPIXEL_SIZE,KERR)
+
+c
+c
+C
+C Write image meta data into file
+C -------------------------------
+ DO I=1,KTDEXL_IMG
+ WRITE(IUNIT2,'(I6,1X,A64,1x,F20.8,1x,a24)') I,CNAMES_IMG(I),
+ c VALUES_IMG(I),CUNITS_IMG(I)
+ END DO
+
+C
+C Write bufr section 1 into file
+C ------------------------------
+ CALL BBUPRS1(IUNIT3,KSEC1)
+ IMX=KSIZE_IMG_BYTES
+C
+C Write image ( pixel values ) into file
+C -----------------------------------------------------------------
+ CALL PBWRITE(IUNIT1,IMAGE,IMX,IERR)
+C
+C
+ GO TO 900
+C -----------------------------------------------------------------
+C
+ 810 CONTINUE
+C
+ WRITE(*,'(1H ,A)') 'OPEN ERROR ON INPUT FILE'
+ GO TO 900
+C
+ 800 CONTINUE
+C
+ IF(IRET.EQ.-1) THEN
+ PRINT*,'NUMBER OF RECORDS PROCESSED ',N
+ PRINT*,'NUMBER OF OBSERVATIONS ',IOBS
+ ELSE
+ PRINT*,' BUFR : ERROR= ',IERR
+ END IF
+C
+ 900 CONTINUE
+C
+ CALL PBCLOSE(IUNIT,IRET)
+ CALL PBCLOSE(IUNIT1,IRET)
+ CLOSE(IUNIT2)
+ CLOSE(IUNIT3)
+ 101 CONTINUE
+C
+ END
diff --git a/examples/bufr/tdexp.F b/examples/bufr/tdexp.F
new file mode 100755
index 0000000..c8365a5
--- /dev/null
+++ b/examples/bufr/tdexp.F
@@ -0,0 +1,187 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ PROGRAM TDEXP
+C
+C**** *TDEXP*
+C
+C
+C PURPOSE.
+C --------
+C Expands list of Bufr data descriptors.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C NONE.
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C CALL BUSEL
+C CALL BUFREX
+C CALL BUFREN
+C CALL BUPRS0
+C CALL BUPRS1
+C CALL BUPRS2
+C CALL BUPRS3
+C CALL BUPRT
+C CALL BUUKEY
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* June 2005.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ PARAMETER(JSEC1=40,JSEC3=4)
+ PARAMETER (KDLEN=200,KELEM=40000,KVALS=360000)
+C
+ DIMENSION KSEC1(JSEC1) ! ,KSEC3(JSEC3)
+C
+ DIMENSION KTDLST(KELEM),KTDEXP(KELEM)
+ DIMENSION KDATA(KDLEN)
+C
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+C
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+C
+ RVIND=1.7E38
+C
+C INITIALIZE DELAYED REPLICATION FACTORS OR REFERENCE VALUES ETD.
+C
+C
+ KDATA(1)=127
+ KDATA(2)=5
+ KDATA(3)=5
+ KDATA(4)=5
+ KDATA(5)=5
+C
+C SET DATA DECSRIPTORS
+C
+ KTDLST( 1)=301090
+ KTDLST( 2)=301091
+ KTDLST( 3)=302001
+ KTDLST( 4)=007004
+ KTDLST( 5)=010009
+ KTDLST( 6)=302072
+ KTDLST( 7)=101005
+ KTDLST( 8)=307063
+ KTDLST( 9)=302069
+ KTDLST( 10)=007032
+ KTDLST( 11)=007033
+ KTDLST( 12)=020031
+ KTDLST( 13)=020032
+ KTDLST( 14)=002038
+ KTDLST( 15)=022043
+ KTDLST( 16)=302021
+ KTDLST( 17)=302078
+ KTDLST( 18)=302073
+ KTDLST( 19)=302074
+ KTDLST( 20)=302075
+ KTDLST( 21)=004025
+ KTDLST( 22)=302076
+ KTDLST( 23)=302071
+ KTDLST( 24)=004025
+ KTDLST( 25)=013059
+ KTDLST( 26)=302083
+ KTDLST( 27)=033005
+ KTDLST( 28)=033006
+
+ KTDLST( 29)=223000
+ KTDLST( 30)=236000
+ KTDLST( 31)=101000
+ KTDLST( 32)=031001
+ KTDLST( 33)=031031
+ KTDLST( 34)=001031
+ KTDLST( 35)=001032
+ KTDLST( 36)=008083
+ KTDLST( 37)=101000
+ KTDLST( 38)=031001
+ KTDLST( 39)=223255
+
+ KTDLST( 40)=223000
+ KTDLST( 41)=237000
+ KTDLST( 42)=001031
+ KTDLST( 43)=001032
+ KTDLST( 44)=008083
+ KTDLST( 45)=101000
+ KTDLST( 46)=031001
+ KTDLST( 47)=223255
+
+ KTDLST( 48)=223000
+ KTDLST( 49)=237000
+ KTDLST( 50)=001031
+ KTDLST( 51)=001032
+ KTDLST( 52)=008083
+ KTDLST( 53)=101000
+ KTDLST( 54)=031001
+ KTDLST( 55)=223255
+
+ KTDLST( 56)=223000
+ KTDLST( 57)=237000
+ KTDLST( 58)=001031
+ KTDLST( 59)=001032
+ KTDLST( 60)=008083
+ KTDLST( 61)=101000
+ KTDLST( 62)=031001
+ KTDLST( 63)=223255
+
+
+
+ ktdlen=63
+
+C
+C SET DATA DECSRIPTORS
+C
+C SECTION 1 CONTENT
+C
+ KSEC1(2)=4 ! BUFR EDITION NUMBER
+ KSEC1(14)=0 ! BUFR MASTER TABLE USED
+ ksec1(16)=0 ! ORIGINATING SUB-CENTRE
+ KSEC1(3)=98 ! ORIGINATING CENTRE
+ KSEC1(8)=1 ! VERSION NUMBER OF LOCAL TABLE USED
+ KSEC1(15)=12 ! VERSION NUMBER OF MASTER TABLE USED
+C
+C SECTION 3 CONTENT
+C
+C
+c
+ K=1
+ CALL BUXDES(K,KSEC1,KTDLEN,KTDLST,KDLEN,KDATA,KELEM,
+ 1 KTDEXL,KTDEXP,CNAMES,CUNITS,KERR)
+C
+ END
diff --git a/examples/bufr/test.sh b/examples/bufr/test.sh
new file mode 100755
index 0000000..765efcd
--- /dev/null
+++ b/examples/bufr/test.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+cd ../../
+path=`pwd`
+
+
+BUFR_TABLES=$path/bufrtables/
+export BUFR_TABLES
+
+cd examples/bufr
+
+./decode_bufr -i ../../data/ISMD01_OKPR.bufr
diff --git a/examples/crex/Makefile b/examples/crex/Makefile
new file mode 100755
index 0000000..219da73
--- /dev/null
+++ b/examples/crex/Makefile
@@ -0,0 +1,40 @@
+#
+# Makefile for example programs
+#
+#
+PLACE = ../../
+LIB = emos
+#
+
+include $(PLACE)config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include $(PLACE)options/options_$(ARCH)
+#
+#
+TARGETS = all clean
+EXECS = decode_crex create_crex crextdexp bufr2crex crex2bufr
+#
+#
+all :$(EXECS)
+
+decode_crex : decode_crex.o
+ $(FC) $(FFLAGS) -o $@ decode_crex.o -L$(PLACE) -l$(LIB)$(R64)
+
+create_crex : create_crex.o
+ $(FC) $(FFLAGS) -o $@ create_crex.o -L$(PLACE) -l$(LIB)$(R64)
+
+crextdexp : crextdexp.o
+ $(FC) $(FFLAGS) -o $@ crextdexp.o -L$(PLACE) -l$(LIB)$(R64)
+
+bufr2crex : bufr2crex.o
+ $(FC) $(FFLAGS) -o $@ bufr2crex.o -L$(PLACE) -l$(LIB)$(R64)
+
+crex2bufr : crex2bufr.o
+ $(FC) $(FFLAGS) -o $@ crex2bufr.o -L$(PLACE) -l$(LIB)$(R64)
+
+clean :
+ @for name in $(EXECS); do\
+ (rm -f $$name *.o ); \
+ done
+
+
diff --git a/examples/crex/Makefile.in b/examples/crex/Makefile.in
new file mode 100755
index 0000000..99ad4ac
--- /dev/null
+++ b/examples/crex/Makefile.in
@@ -0,0 +1,46 @@
+#
+# Makefile for example programs
+#
+A64 = plat
+R64 = reals
+ARCH = arch
+CNAME = comp
+#
+#
+PLACE = ../../
+#
+#
+include $(PLACE)config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include $(PLACE)options/options_$(ARCH)
+#
+TARGDIR = ./
+#
+#
+TARGETS = all clean
+EXECS = decode_crex create_crex crextdexp bufr2crex crex2bufr
+#
+#
+all :$(EXECS)
+
+decode_crex : decode_crex.o
+ $(FC) $(FFLAGS) -o $@ decode_crex.o -L$(PLACE) -lemos$(R64)
+
+create_crex : create_crex.o
+ $(FC) $(FFLAGS) -o $@ create_crex.o -L$(PLACE) -lemos$(R64)
+
+crextdexp : crextdexp.o
+ $(FC) $(FFLAGS) -o $@ crextdexp.o -L$(PLACE) -lemos$(R64)
+
+bufr2crex : bufr2crex.o
+ $(FC) $(FFLAGS) -o $@ bufr2crex.o -L$(PLACE) -lemos$(R64)
+
+crex2bufr : crex2bufr.o
+ $(FC) $(FFLAGS) -o $@ crex2bufr.o -L$(PLACE) -lemos$(R64)
+
+clean :
+ @for name in $(EXECS); do\
+ (rm -f $$name *.o ); \
+ done
+
+
diff --git a/examples/crex/bufr2crex.F b/examples/crex/bufr2crex.F
new file mode 100755
index 0000000..bf427b2
--- /dev/null
+++ b/examples/crex/bufr2crex.F
@@ -0,0 +1,605 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ PROGRAM BUFR2CREX
+C
+C**** *BUFRCREX*
+C
+C
+C PURPOSE.
+C --------
+C Bufr to CREX conversion.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C NONE.
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2=4096,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=320000,JSUBS=400,JCVAL=150 ,JBUFL=512000,
+#ifdef JBPW_64
+ 2 JBPW = 64,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT=1200,
+#else
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT=1200,
+#endif
+ 3 JWORK=4096000,JKEY=46,JBYTE=80000)
+C
+ PARAMETER (KELEM=20000)
+ PARAMETER (KVALS=360000)
+C
+ DIMENSION KBUFF(JBUFL)
+ DIMENSION KBUFR(JBUFL)
+ DIMENSION KSUP(JSUP) ,KSEC0(JSEC0),KSEC1(JSEC1)
+ DIMENSION KSEC2(JSEC2),KSEC3(JSEC3),KSEC4(JSEC4)
+ DIMENSION KEY (JKEY),KREQ(2)
+C
+ REAL*8 VALUES(KVALS)
+ REAL*8 RQV(KELEM)
+C
+ DIMENSION KTDLST(KELEM),KTDEXP(KELEM),KRQ(KELEM)
+ DIMENSION KDATA(2000)
+C
+ CHARACTER*256 COUT,CARG(4),CFIN
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+ CHARACTER*80 CVALS(KVALS)
+ CHARACTER*80 YENC
+ CHARACTER*160000 YOUT
+ CHARACTER*3 CRCRLF
+C
+C Common block containing bufr tables
+C
+ COMMON /BCOMTAB/ NTABBTR(JTAB),NTABBS (JTAB),NTABBRV(JTAB),
+ 1 NTABBDW(JTAB),NTABDTR(JTAB),NTABDST(JTAB),
+ 2 NTABDL (JTAB),NTABDSQ(JTAB*20),NTABP(64,255)
+C
+C NTABBTR - table B, table reference array
+C NTABBS - table B, scale array
+C NTABBRF - table B, reference value array
+C NTABBDW - table B, data width array
+C NTABDTR - table D, table reference array
+C NTABDST - table D, starting pointers array
+C NTABDL - table D, lengths array
+C NTABDSQ - table D, list of sequence descriptors array
+C
+ COMMON /BCOMWT/ NDWINC,NSCAM,NAFDW,NWT ,ODREPF,
+ 1 N221,MREL,NFCM,NFUCM,MBMP,OMARKER,M0,
+ 2 MBMPL,NSTACK(JELEM),NWTEN(JELEM),
+ 3 NWTR (JELEM),NWTS (JELEM),NWTRV (JELEM),
+ 4 NWTDW(JELEM)
+C
+C NDWINC - data width increment
+C NSCAM - scale multiplier
+C NAFDW - augmented field data width
+C NWT - pointer to working table
+C NSTACK - list of data descriptors
+C ODREPF - replication (logical)
+C N221 - data not present for n221 elements
+C MREL - pointer to the last data element
+C NFCM - first compressed message
+C MBMP - pointer to the begining of bit map
+C NWTR - working table reference
+C NWTS - working scale
+C NWTRV - working reference value
+C NWTDW - working data width
+C
+ COMMON /BCOMWTC/ CWTEN(JELEM),CWTU (JELEM)
+C
+C CWTEN - working table element naame
+C CWTU - working table units
+C
+c
+ PARAMETER(JP=3000)
+C
+ CHARACTER*120 YENTRY
+ CHARACTER*15 YFNAME
+ CHARACTER*15 FMT
+ CHARACTER*6 CREXKTDLST(KELEM),CREXKTDLST0
+C
+ INTEGER IVALUE(KELEM)
+C
+C Logical switch to use check digit indicator
+C
+ CHARACTER*4 YUSE_E
+C
+ INTEGER IVAL,IIVAL
+c
+ REAL*8 EPS
+ REAL*8 RVIND
+ REAL*8 VAL
+C
+ EQUIVALENCE (YOUT,KBUFR(1))
+C
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+C
+ NBYTPW=JBPW/8
+ RVIND=1.7E38
+ NVIND=2147483647
+ IOBS=0
+ EPS=1.0E-8
+ NPACK=0
+ N=0
+ OO=.FALSE.
+C
+ CRCRLF=CHAR(13)//CHAR(13)//CHAR(10)
+C
+C Get input and output file name.
+C
+ NARG=IARGC()
+c
+ IF(NARG.LT.4) THEN
+ print*,'Usage -- bufr2crex -i infile -o outfile'
+ STOP
+ END IF
+c
+ COUT=' '
+ CFIN=' '
+c
+ DO 101 J=1,NARG
+ CALL GETARG(J,CARG(J))
+ 101 CONTINUE
+c
+ DO 102 J=1,NARG,2
+ IF(CARG(J).EQ.'-i') THEN
+ CFIN=CARG(J+1)
+ ELSEIF(CARG(J).EQ.'-o') THEN
+ COUT=CARG(J+1)
+ ELSE
+ print*,'Usage -- bufr2crex -i infile -o outfile'
+ STOP
+ END IF
+ 102 CONTINUE
+C
+ II=INDEX(CFIN,' ')
+ II=II-1
+ JJ=INDEX(COUT,' ')
+ JJ=JJ-1
+C
+ KRQL=0
+ NR=0
+ KREQ(1)=0
+ KREQ(2)=0
+C
+C
+C* 1.2 OPEN FILE CONTAINING BUFR DATA.
+C -------------------------------
+ 120 CONTINUE
+C
+ IRET=0
+ CALL PBOPEN(IUNIT,CFIN(1:ii),'r',IRET)
+ IF(IRET.EQ.-1) STOP 'open failed'
+ IF(IRET.EQ.-2) STOP 'Invalid file name'
+ IF(IRET.EQ.-3) STOP 'Invalid open mode specified'
+C
+ CALL PBOPEN(IUNIT1,cout(1:jj),'w',IRET)
+ IF(IRET.EQ.-1) STOP 'open failed on bufr.dat'
+ IF(IRET.EQ.-2) STOP 'Invalid file name'
+ IF(IRET.EQ.-3) STOP 'Invalid open mode specified'
+C
+C -----------------------------------------------------------------
+C* 2. SET REQUEST FOR EXPANSION.
+C --------------------------
+ 200 CONTINUE
+C
+ KREQ(1)=1
+ KREQ(2)=0
+C
+ OSEC3=.FALSE.
+ OPRT=.FALSE.
+ OENC=.TRUE.
+ ICODE=0
+ OCOMP=.FALSE.
+C
+C* 2.1 SET REQUEST FOR PARTIAL EXPANSION.
+C ----------------------------------
+ 210 CONTINUE
+C
+ KERR=0
+ CALL BUSRQ(KREQ,KRQL,KRQ,RQV,KERR)
+C
+C -----------------------------------------------------------------
+C* 3. READ BUFR MESSAGE.
+C ------------------
+ 300 CONTINUE
+C
+ IERR=0
+ KBUFL=0
+C
+ IRET=0
+ CALL PBBUFR(IUNIT,KBUFF,JBYTE,KBUFL,IRET)
+ IF(IRET.EQ.-1) THEN
+c IF(N.NE.0) GO TO 600
+ print*,'Number of subsets ',iobs
+ print*,'Number of messages ',n
+ STOP 'EOF'
+ END IF
+ IF(IRET.EQ.-2) STOP 'File handling problem'
+ IF(IRET.EQ.-3) STOP 'Array too small for product'
+C
+ N=N+1
+ KBUFL=KBUFL/nbytpw+1
+ IF(N.LT.NR) GO TO 300
+ print*,'----------------------',n
+C
+C -----------------------------------------------------------------
+C* 4. EXPAND BUFR MESSAGE.
+C --------------------
+ 400 CONTINUE
+C
+ CALL BUS012(KBUFL,KBUFF,KSUP,KSEC0,KSEC1,KSEC2,KERR)
+ IF(KERR.NE.0) THEN
+ PRINT*,'Error in BUS012: ',KERR
+ PRINT*,' BUFR MESSAGE NUMBER ',N,' CORRUPTED.'
+ KERR=0
+ GO TO 300
+ END IF
+C
+ KEL=KELEM
+ IF(KSUP(6).GT.1) THEN
+ KEL=KVALS/KSUP(6)
+ IF(KEL.GT.KELEM) KEL=KELEM
+ END IF
+C
+ CALL BUFREX(KBUFL,KBUFF,KSUP,KSEC0 ,KSEC1,KSEC2 ,KSEC3 ,KSEC4,
+ 1 KEL,CNAMES,CUNITS,KVALS,VALUES,CVALS,IERR)
+C
+ IF(IERR.NE.0) THEN
+ IF(IERR.EQ.45) GO TO 300
+ IF(IERR.EQ.2) THEN
+ IERR=0
+ GO TO 300
+ END IF
+ CALL EXIT(2)
+ END IF
+c
+ IOBS=IOBS+KSEC3(3)
+c
+ NPACK=NPACK+1
+C
+ ISUBSET=1
+ CALL BUSEL2(ISUBSET,KEL,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+ 1 CUNITS,IERR)
+ IF(KERR.NE.0) CALL EXIT(2)
+C
+C* 4.1 PRINT CONTENT OF EXPANDED DATA.
+C -------------------------------
+ 410 CONTINUE
+C
+ IF(.NOT.OPRT) GO TO 500
+ IF(.NOT.OSEC3) GO TO 450
+C
+C* 4.2 PRINT SECTION ZERO OF BUFR MESSAGE.
+C -----------------------------------
+ 420 CONTINUE
+C
+
+ CALL BUPRS0(KSEC0)
+C
+C* 4.3 PRINT SECTION ONE OF BUFR MESSAGE.
+C -----------------------------------
+ 430 CONTINUE
+C
+ CALL BUPRS1(KSEC1)
+C
+C
+C* 4.4 PRINT SECTION TWO OF BUFR MESSAGE.
+C -----------------------------------
+ 440 CONTINUE
+c
+C AT ECMWF SECTION 2 CONTAINS RDB KEY.
+C SO UNPACK KEY
+C
+ CALL BUUKEY(KSEC1,KSEC2,KEY,KSUP,KERR)
+C
+C PRINT KEY
+C
+ CALL BUPRS2(KSUP ,KEY)
+C
+C* 4.5 PRINT SECTION 3 OF BUFR MESSAGE.
+C -----------------------------------
+ 450 CONTINUE
+C
+C FIRST GET DATA DESCRIPTORS
+C
+ ISUBSET=1
+ CALL BUSEL2(ISUBSET,KEL,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+ 1 CUNITS,IERR)
+ IF(KERR.NE.0) CALL EXIT(2)
+C
+C PRINT CONTENT
+C
+ IF(OSEC3) THEN
+ CALL BUPRS3(KSEC3,KTDLEN,KTDLST,KTDEXL,KTDEXP,KEL,CNAMES)
+ END IF
+c
+C
+C* 4.6 PRINT SECTION 4 (DATA).
+C -----------------------
+ 460 CONTINUE
+C
+C IN THE CASE OF MANY SUBSETS DEFINE RANGE OF SUBSETS
+C
+ IF(.NOT.OO) THEN
+ WRITE(*,'(a,$)') ' STARTING SUBSET TO BE PRINTED : '
+ READ(*,'(BN,I6)') IST
+ WRITE(*,'(a,$)') ' ENDING SUBSET TO BE PRINTED : '
+ READ(*,'(BN,I6)') IEND
+ OO=.FALSE.
+ END IF
+C
+C PRINT DATA
+C
+ ICODE=0
+ CALL BUPRT(ICODE,IST,IEND,KEL,CNAMES,CUNITS,CVALS,
+ 1 KVALS,VALUES,KSUP,KSEC1,IERR)
+C
+C
+C -----------------------------------------------------------------
+C* 5. COLLECT DATA FOR REPACKING.
+C ---------------------------
+ 500 CONTINUE
+C
+C FIRST GET DATA DESCRIPTORS
+C
+ ISUBSET=1
+ CALL BUSEL2(ISUBSET,KEL,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+ 1 CUNITS,IERR)
+ IF(KERR.NE.0) CALL EXIT(2)
+C
+C -----------------------------------------------------------------
+C* 6. PACK CREX MESSAGE.
+C ------------------
+ 600 CONTINUE
+C
+C Modify BUFR operators
+C
+ J=0
+ DO 602 I=1,KTDLEN
+ IF(KTDLST(I).EQ.222000) GO TO 603
+ IF(KTDLST(I).EQ.201000) GO TO 602
+ IF(KTDLST(I).EQ.202000) GO TO 602
+ IF(KTDLST(I).EQ.204000) GO TO 602
+ IF(KTDLST(I).EQ.031000) GO TO 602
+ IF(KTDLST(I).EQ.031001) GO TO 602
+ IF(KTDLST(I).EQ.031002) GO TO 602
+C
+ CREXKTDLST0=' '
+ WRITE(CREXKTDLST0,'(I6.6)',IOSTAT=IOS) KTDLST(I)
+ IF(IOS.NE.0) THEN
+ print*,'Internal write error.'
+ CALL EXIT(2)
+ END IF
+ J=J+1
+ CREXKTDLST(J)(1:6)=CREXKTDLST0
+C
+ IF(CREXKTDLST(J)(1:1).EQ.'3') THEN
+ CREXKTDLST(J)(1:1)='D'
+ ELSEIF(CREXKTDLST(J)(1:1).EQ.'0') THEN
+ CREXKTDLST(J)(1:1)='B'
+ ELSEIF(CREXKTDLST(J)(1:1).EQ.'1') THEN
+ CREXKTDLST(J)(1:1)='R'
+c scan for any 201000,202000 or 201y,202y followed by 206y
+ READ(CREXKTDLST(J)(2:3),'(I2.2)',IOSTAT=IOS) IELEMENTS
+ IF(IOS.NE.0) THEN
+ print*,'Internal read error.'
+ CALL EXIT(2)
+ END IF
+ IEL=IELEMENTS
+ DO IN=I,I+IELEMENTS-1
+ IF(KTDLST(IN).EQ.201000) IEL=IEL-1
+ IF(KTDLST(IN).EQ.202000) IEL=IEL-1
+ IF(KTDLST(IN).GE.201001.AND.KTDLST(IN).LE.201999.AND.
+ 1 KTDLST(IN+1)/1000.EQ.206) IEL=IEL-1
+ IF(KTDLST(IN).GE.202001.AND.KTDLST(IN).LE.202999.AND.
+ 1 KTDLST(IN+1)/1000.EQ.206) IEL=IEL-1
+ END DO
+ WRITE(CREXKTDLST(J)(2:3),'(I2.2)',IOSTAT=IOS) IEl
+ IF(IOS.NE.0) THEN
+ print*,'Internal write error.'
+ CALL EXIT(2)
+ END IF
+ ELSEIF(CREXKTDLST(J)(1:3).EQ.'201') THEN
+ IF(KTDLST(I+1)/1000.EQ.206) THEN
+ J=J-1
+ GO TO 602
+ END IF
+ READ(CREXKTDLST(J)(4:6),'(I3.3)',IOSTAT=IOS) IY
+ IF(IOS.NE.0) THEN
+ print*,'Internal read error.'
+ CALL EXIT(2)
+ END IF
+ IBITS=IY-128
+ ICLASS=KTDLST(I+1)/1000
+ IYYY =KTDLST(I+1)-ICLASS*1000+1
+ ICLASS=ICLASS+1
+ III=NTABP(ICLASS,IYYY)
+ IDW=NTABBDW(III)+IBITS
+ IRES=2.**IDW-1
+ JZ=0
+ DO WHILE(IRES.GT.0)
+ JZ=JZ+1
+ IRES=IRES/10
+ END DO
+ CREXKTDLST(J)(1:3)='C01'
+ WRITE(CREXKTDLST(J)(4:6),'(I3.3)',IOSTAT=IOS) JZ
+ IF(IOS.NE.0) THEN
+ print*,'Internal write error.'
+ CALL EXIT(2)
+ END IF
+ ELSEIF(CREXKTDLST(J)(1:3).EQ.'202') THEN
+ GO TO 602
+ ELSEIF(CREXKTDLST(J)(1:3).EQ.'205') THEN
+ CREXKTDLST(J)(1:3)='C05'
+ ELSE
+ print*,'Wrong data descriptor ',crexktdlst(j)
+ print*,'Data containing above descriptor can',
+ 1 ' not be converted'
+ go to 300
+ END IF
+ 602 CONTINUE
+c
+ 603 CONTINUE
+C
+ ICREXLEN=J
+c
+C Find delayed replications
+c
+ KDLEN=0
+C
+ IST=1
+ IEND=1
+ OMULTI=.FALSE.
+ IF(IAND(KSEC3(4),64).NE.0.AND.KSEC3(3).GT.1) THEN
+ IEND=KSEC3(3)
+ OMULTI=.TRUE.
+ END IF
+C
+ DO ISUBSET=IST, IEND
+
+ JJ=(ISUBSET-1)*KEL
+C
+ CALL BUSEL2(ISUBSET,KEL,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+ 1 CUNITS,IERR)
+C
+ DO I=1,KTDEXL
+C
+ II=I+JJ
+C
+ IF(KTDEXP(I).EQ.031001.OR.
+ 1 KTDEXP(I).EQ.031000.OR.
+ 2 KTDEXP(I).EQ.031002) THEN
+ KDLEN=KDLEN+1
+ KDATA(KDLEN)=NINT(VALUES(II))
+ END IF
+ END DO
+C
+C* Make unit conversion from K to Celsius
+C
+ DO I=1,KTDEXL
+ IF(CUNITS(I)(1:2).EQ.'K '.AND.
+ 1 KTDEXP(I)/1000.EQ.12) THEN
+ IF(KTDEXP(I).NE.012064.AND.
+ 1 KTDEXP(I).NE.012065.AND.
+ 2 KTDEXP(I).NE.012070.AND.
+ 2 KTDEXP(I).NE.012071.AND.
+ 4 KTDEXP(I).NE.012164.AND.
+ 5 KTDEXP(I).NE.012151.AND.
+ 6 KTDEXP(I).NE.012051.AND.
+ 7 KTDEXP(I).NE.022050.AND.
+ 8 KTDEXP(I).NE.012171) THEN
+ IF(OMULTI) THEN
+ IJ=I+JJ
+ IF(abs(VALUES(IJ)-rvind)/rvind.GT.eps)
+ 1 VALUES(IJ)=VALUES(IJ)-273.15
+ ELSE
+ DO J=1,KSEC3(3)
+ IJ=I+(J-1)*KEL
+ IF(abs(VALUES(IJ)-rvind)/rvind.GT.eps)
+ 1 VALUES(IJ)=VALUES(IJ)-273.15
+ END DO
+ END IF
+ END IF
+ END IF
+ IF(CUNITS(I)(1:2).EQ.'PA'.AND.
+ 1 KTDEXP(I).EQ.015003) THEN
+ IF(OMULTI) THEN
+ IJ=I+JJ
+ IF(abs(VALUES(IJ)-rvind)/rvind.GT.eps)
+ 1 VALUES(IJ)=VALUES(IJ)*10000.
+ ELSE
+ DO J=1,KSEC3(3)
+ IJ=I+(J-1)*KEL
+ IF(abs(VALUES(IJ)-rvind)/rvind.GT.eps)
+ 1 VALUES(IJ)=VALUES(IJ)*10000.
+ END DO
+ END IF
+ END IF
+ END DO
+C
+ END DO
+
+C
+C* 6.2 ENCODE DATA INTO CREX MESSAGE.
+C ------------------------------
+ 620 CONTINUE
+C
+ IF(KSEC1(2).EQ.4) THEN ! Bufr edition number
+ KSEC1(2)=2 ! Crex edition number
+ KSEC1(5)=KSEC3(3) ! Number of subsets
+ KSEC1( 7)=KSEC1(17) ! International sub category
+ KSEC1(17)=KSEC1(15) ! Bufr master table version number
+ KSEC1(15)=3 ! Crex version number used
+ KSEC1(18)=KSEC1(8) ! Bufr version number of local tables
+ ELSE
+ KSEC1(17)=KSEC1(15) ! Bufr master table version number
+ KSEC1(2)=1 ! Crex edition number
+ KSEC1(15)=3 ! Crex version number used
+ KSEC1(18)=KSEC1(8) ! Bufr version number of local tables
+ END IF
+c
+ CALL CREXEN(KSEC0,KSEC1,KSEC3,
+ 1 ICREXLEN,CREXKTDLST,KDLEN,KDATA,KEL,KVALS,
+ 2 VALUES,CVALS,KBUFL,KBUFR,KERR)
+ IF(KERR.GT.0) THEN
+ print*,'CREXEN error:',KERR
+ go to 300
+ END IF
+C
+C 6.3 WRITE CREX MESSAGE INTO FILE.
+C -----------------------------
+ 630 CONTINUE
+C
+ ILEN=KBUFL
+C
+ IERR=0
+ CALL PBWRITE(IUNIT1,KBUFR,ILEN,IERR)
+ IF(IERR.LT.0) THEN
+ print*,'Error writing into target file.'
+ CALL EXIT(2)
+ END IF
+C
+ GO TO 300
+C
+ END
diff --git a/examples/crex/create_crex.F b/examples/crex/create_crex.F
new file mode 100755
index 0000000..58b807c
--- /dev/null
+++ b/examples/crex/create_crex.F
@@ -0,0 +1,296 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ PROGRAM CREX
+C
+C**** *CREX*
+C
+C
+C PURPOSE.
+C --------
+C Example of creating CREX message
+C
+C
+C** INTERFACE.
+C ----------
+C
+C NONE.
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(O,G), CHARACTER*8(C,H,Y)
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC3= 4,
+ 1 JBUFL= 8192)
+C
+ PARAMETER (KDLEN=200,KELEM=2000)
+ PARAMETER (KVALS=80000)
+C
+ DIMENSION KBUFR(JBUFL)
+ DIMENSION KSEC0(JSEC0),KSEC1(JSEC1), KSEC3(JSEC3)
+C
+ REAL*8 VALUES(KVALS)
+ REAL*8 RVIND
+C
+ DIMENSION KDATA(KDLEN)
+C
+ CHARACTER*6 CREXKTDLST(KELEM),CREXKTDEXP(KELEM)
+ CHARACTER*64 CNAMES(kelem)
+ CHARACTER*24 CUNITS(kelem)
+ CHARACTER*80 CVALS(KVALS)
+ CHARACTER*80 YENC
+ CHARACTER*256 COUT, CARG(4)
+C
+ CHARACTER*15000 YOUT
+ EQUIVALENCE(KBUFR(1),YOUT)
+C
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+ RVIND=1.7D38
+ NVIND=2147483647
+C
+C GET INPUT AND OUTPUT FILE NAME.
+C
+ NARG=IARGC()
+C
+ IF(NARG.LT.2) THEN
+ print*,'Usage -- create_crex -o outfile'
+ STOP
+ END IF
+C
+ COUT=' '
+ CFIN=' '
+C
+ DO 101 J=1,NARG
+ CALL GETARG(J,CARG(J))
+ 101 CONTINUE
+C
+ DO 102 J=1,NARG,2
+ IF(CARG(J).EQ.'-o') THEN
+ COUT=CARG(J+1)
+ ELSE
+ print*,'Usage -- create_crex -o outfile'
+ STOP
+ END IF
+ 102 CONTINUE
+C
+ JJ=INDEX(COUT,' ')
+ JJ=JJ-1
+C
+ CALL PBOPEN(IUNIT1,COUT(1:JJ),'w',IRET)
+ IF(IRET.EQ.-1) STOP 'open failed on bufr.dat'
+ IF(IRET.EQ.-2) STOP 'Invalid file name'
+ IF(IRET.EQ.-3) STOP 'Invalid open mode specified'
+C
+C INITIALIZE DELAYED REPLICATION FACTORS OR REFERENCE VALUES ETD.
+C
+ KDATA( 1)=0
+ KDATA( 2)=0
+ KDATA( 3)=0
+ KDATA( 4)=0
+C
+ DO I=5,KDLEN
+ KDATA(I)=0
+ END DO
+C
+ KDLENG=200
+C
+C SET DATA DECSRIPTORS
+C
+ CREXKTDLST( 1)= "D07005"
+c
+ KTDLEN=1
+
+ KSEC0(1)=0
+ KSEC0(2)=0
+ KSEC0(3)=2 ! Crex edition number
+C
+C SECTION 1 CONTENT
+C
+ KSEC1(1)=0
+ KSEC1(2)=2 ! CREX Edition number (currently)
+ KSEC1(3)=98 ! Originating centre
+ KSEC1(4)=0 ! Update sequence number
+ KSEC1(5)=1 ! Number of subsets
+ KSEC1(6)=0 ! CREX data category
+ KSEC1(7)=2 ! International data sub-category
+ KSEC1(8)=0 ! version number of local table used
+ KSEC1(9)=2003 ! Year
+ KSEC1(10)=12 ! Month
+ KSEC1(11)=2 ! Day
+ KSEC1(12)=12 ! Hour
+ KSEC1(13)=0 ! Minute
+ KSEC1(14)=0 ! CREX Master table ( 0 for standard WMO crex tables)
+ KSEC1(15)=3 ! CREX table version number
+ KSEC1(16)=0 ! Originating sub-centre
+ KSEC1(17)=14 ! BUFR master table version number
+ KSEC1(18)=0 ! BUFR local table version number
+C
+
+ K=1
+ CALL CREXDES(K,KSEC1,KTDLEN,CREXKTDLST,KDLEN,KDATA,KELEM,
+ 1 KTDEXL,CREXKTDEXP,CNAMES,CUNITS,KERR)
+ IF(KERR.NE.0) THEN
+ print*,'CREXDES: error'
+ STOP
+ END IF
+
+C
+C SET VALUES TO BE PACKED
+C
+ K=1
+ KSUBSETS=1
+c
+ DO J=1,KSUBSETS
+
+ IK=(J-1)*KELEM
+ N=1
+ VALUES(N+IK)=13. ! Block number
+ N=N+1 !
+ VALUES(N+IK)=274. ! station number
+ N=N+1 !
+ VALUES(N+IK)=0. ! type of station
+ N=N+1 !
+ VALUES(N+IK)=2003. ! year
+ N=N+1 !
+ VALUES(N+IK)=12. ! month
+ N=N+1 !
+ VALUES(N+IK)=2. ! day
+ N=N+1 !
+ VALUES(N+IK)=12. ! hour
+ N=N+1 !
+ VALUES(N+IK)=0. ! minute
+ N=N+1
+ VALUES(N+IK)=45.2 ! lat
+ N=N+1 !
+ VALUES(N+IK)=20.5 ! lon
+ N=N+1 !
+ VALUES(N+IK)=170. ! station height
+ N=N+1 !
+ VALUES(N+IK)=102000. ! station level pressure
+ N=N+1
+ VALUES(N+IK)=102500. ! msl pressure
+ N=N+1 !
+ VALUES(N+IK)=100. ! pressure change
+ N=N+1 !
+ VALUES(N+IK)=rvind ! characteristic of pressure change
+ N=N+1 !
+ VALUES(N+IK)=300. ! wind dir
+ N=N+1 !
+ VALUES(N+IK)=8.5 ! wind speed
+ N=N+1 !
+ VALUES(N+IK)=-5.0 ! T
+ N=N+1 !
+ VALUES(N+IK)=-7.0 ! Td
+ N=N+1 !
+ VALUES(N+IK)=70. ! RH
+ N=N+1 !
+ VALUES(N+IK)=1000. ! visibility
+ N=N+1 !
+ VALUES(N+IK)=rvind
+ N=N+1 !
+ VALUES(N+IK)=rvind
+ N=N+1 !
+ VALUES(N+IK)=rvind
+ N=N+1 !
+ VALUES(N+IK)=rvind
+ N=N+1 !
+ VALUES(N+IK)=rvind
+c
+ DO I=N,47
+ N=N+1 !
+ VALUES(N+IK)=rvind
+ END DO
+C !
+ END DO !
+C
+C SET CCITTIA5 CALL SIGN
+C
+ DO I=1,200
+ CVALS( I )=' '
+ END DO
+C
+C
+C SECTION 3 CONTENT
+C
+ KSEC3(1)=0 ! TOTAL LENGTH OF SECTION 3
+ KSEC3(2)=0 ! RESERVED
+ KSEC3(3)= ksubsets ! NUMBER OF SUBSETS
+ KSEC3(4)=0
+C
+ IREP=0
+C
+C
+C* 6. PACK CREX MESSAGE
+C -----------------
+ 600 CONTINUE
+C
+C
+ KERR=0
+ CALL CREXEN( KSEC0,KSEC1,KSEC3,
+ 1 KTDLEN,crexKTDLST,KDLENG,KDATA,KELEM,
+ 2 KVALS,VALUES,CVALS,KBUFL,KBUFR,KERR)
+C
+
+ IF(KERR.GT.0) THEN
+ CALL EXIT(2)
+ ELSEIF(KERR.lt.0) then
+ print*,'Encoding return_code=',kerr
+ END IF
+C
+C
+ ILEN=KBUFL
+C ILEN=KSEC0(2)
+C
+ IERR=0
+ CALL PBWRITE(IUNIT1,KBUFR,ILEN,IERR)
+ IF(IERR.LT.0) THEN
+ print*,'Error writing into target file.'
+ CALL EXIT(2)
+ END IF
+C
+C Print CREX message on screen
+ print*,yout(1:ilen)
+C
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ STOP
+ END
diff --git a/examples/crex/crex2bufr.F b/examples/crex/crex2bufr.F
new file mode 100755
index 0000000..15c0ad3
--- /dev/null
+++ b/examples/crex/crex2bufr.F
@@ -0,0 +1,499 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ PROGRAM CREX2BUFR
+C
+C**** *CREX2BUFR*
+C
+C
+C PURPOSE.
+C --------
+C Decode CREX coded data into BUFR format
+C
+C
+C** INTERFACE.
+C ----------
+C
+C NONE.
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C MILAN DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2=4096,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=320000,JSUBS=400,JCVAL=150 ,JBUFL=40000,
+#ifdef JBPW_64
+ 2 JBPW = 64,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT=1200,
+#else
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT=1200,
+#endif
+ 3 JWORK=4096000,JKEY=46,JBYTE=80000)
+C
+ PARAMETER (KELEM=40000)
+ PARAMETER (KVALS=360000)
+C
+ DIMENSION KBUFF(JBUFL),KBUFR(JBUFL)
+ DIMENSION KSUP(JSUP) ,KSEC0(JSEC0),KSEC1(JSEC1)
+ DIMENSION KSEC2(JSEC2),KSEC3(JSEC3),KSEC4(JSEC4)
+ DIMENSION KEY (JKEY),KREQ(2)
+C
+ REAL*8 VALUES(KVALS), VALUE(KVALS)
+ REAL*8 RVIND
+ REAL*8 EPS
+C
+ DIMENSION KTDLST(KELEM),KTDEXP(KELEM),KTDLST1(KELEM)
+ DIMENSION KDATA(2000)
+C
+ CHARACTER*256 CF,COUT,CARG(4)
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+ CHARACTER*80 CVALS(KVALS)
+ CHARACTER*80 CVAL(KVALS),CV
+ CHARACTER*80 YENC
+ CHARACTER*160000 YBUFF
+c
+ EQUIVALENCE(YBUFF,KBUFF(1))
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+ NBYTPW=JBPW/8
+ RVIND=1.7D38
+ NVIND=2147483647
+ IOBS=0
+ EPS=10.D-8
+ N=0
+ OCOMP=.FALSE.
+ OO=.FALSE.
+ CF=' '
+ COUT=' '
+ KKK=0
+C
+C GET INPUT AND OUTPUT FILE NAME.
+C
+ NARG=IARGC()
+c
+ IF(NARG.NE.4) THEN
+ print*,'Usage -- crex2bufr -i infile -o outfile'
+ STOP
+ END IF
+c
+ DO 101 J=1,NARG
+ CALL GETARG(J,CARG(J))
+ 101 CONTINUE
+c
+ IF(CARG(1).NE.'-i'.AND.CARG(1).NE.'-I'.OR.
+ 1 CARG(2).EQ.' ') THEN
+ print*,'Usage -- crex2bufr -i inpfile -o outfile'
+ STOP
+ END IF
+ IF(CARG(3).NE.'-o'.AND.CARG(3).NE.'-O'.OR.
+ 1 CARG(4).EQ.' ') THEN
+ print*,'Usage -- crex2bufr -i inpfile -o outfile'
+ STOP
+ END IF
+c
+ CF=CARG(2)
+ II=INDEX(CF,' ')
+ II=II-1
+ COUT=CARG(4)
+ I=INDEX(COUT,' ')
+ I=I-1
+C
+C* 1.2 OPEN FILE CONTAINING CREX DATA.
+C -------------------------------
+ 120 CONTINUE
+C
+ IRET=0
+ CALL PBOPEN(IUNIT,CF(1:II),'r',IRET)
+ IF(IRET.EQ.-1) STOP 'open failed on input file'
+ IF(IRET.EQ.-2) STOP 'Invalid file name'
+ IF(IRET.EQ.-3) STOP 'Invalid open mode specified'
+c
+C
+C* 1.2.1 OPEN OUTPUT FILE.
+C ------------------
+ 121 CONTINUE
+C
+
+ CALL PBOPEN(IUNIT1,COUT(1:I),'w',IRET)
+ IF(IRET.EQ.-1) STOP 'open failed on output file'
+ IF(IRET.EQ.-2) STOP 'Invalid output file name'
+ IF(IRET.EQ.-3) STOP 'Invalid open mode specified'
+C
+C -----------------------------------------------------------------
+C* 2. SET REQUEST FOR EXPANSION.
+C --------------------------
+ 200 CONTINUE
+C
+ NR=1
+ OPRT=.TRUE.
+ OENC=.FALSE.
+C
+ OENC=.TRUE.
+
+ 210 CONTINUE
+C
+C
+C -----------------------------------------------------------------
+C* 3. READ CREX MESSAGE.
+C ------------------
+ 300 CONTINUE
+C
+ IERR=0
+ IRET=0
+c
+ CALL PBCREX(IUNIT,KBUFF,JBUFL,KBUFL,IRET)
+ IF(IRET.LT.0) THEN
+ if(iret.eq.-1) stop 'End of file '
+ if(iret.eq.-2) stop 'Error in handling the file'
+ if(iret.eq.-3) stop 'Error during read CREX file.'
+ END IF
+c
+ N=N+1
+ print*,'----------------------------------',n
+ IF(N.LT.NR) GO TO 300
+ KEL=KELEM
+C
+C -----------------------------------------------------------------
+C* 4. EXPAND CREX MESSAGE.
+C --------------------
+ 400 CONTINUE
+C
+ IERR=0
+ CALL CREXEX(KBUFL,YBUFF,KSUP,KSEC0 ,KSEC1,KSEC3 ,
+ 1 KEL,CNAMES,CUNITS,KVALS,VALUES,CVALS,IERR)
+C
+ IF(IERR.NE.0) then
+ print*,'CREX error ', ierr
+ IF(IERR.EQ.20.or.IERR.EQ.14) THEN
+ KEL=KVALS/KSUP(6)
+ GO TO 400
+ ELSE
+ CALL EXIT(2)
+ END IF
+ END IF
+C
+
+ IOBS=IOBS+KSEC3(3)
+C
+ ISUBSET=1
+ CALL CREXSEL2(ISUBSET,KEL,KTDLEN,KTDLST,KTDEXL,KTDEXP,
+ 1 CNAMES,CUNITS,KERR)
+ IF(KERR.NE.0) then
+ print*,'CREXSEL: error.'
+ CALL EXIT(2)
+ END IF
+C
+C* 4.1 PRINT CONTENT OF EXPANDED DATA.
+C -------------------------------
+ 410 CONTINUE
+C
+ IF(.NOT.OPRT) GO TO 500
+C
+C* 4.2 PRINT SECTION ZERO OF CREX MESSAGE.
+C -----------------------------------
+ 420 CONTINUE
+C
+
+ CALL CREXPRS0(KSEC0)
+C
+C* 4.3 PRINT SECTION ONE OF CREX MESSAGE.
+C -----------------------------------
+ 430 CONTINUE
+C
+ CALL CREXPRS1(KSEC1,KSEC3,KTDLEN,KTDLST,KTDEXL,
+ 1 KTDEXP,KEL,CNAMES)
+C
+C
+C
+C* 4.6 PRINT SECTION 4 (DATA).
+C -----------------------
+ 460 CONTINUE
+C
+C IN THE CASE OF MANY SUBSETS DEFINE RANGE OF SUBSETS
+C
+ IF(.NOT.OO) THEN
+ WRITE(*,'(a,$)') ' STARTING SUBSET TO BE PRINTED : '
+ READ(*,'(BN,I6)') IST
+ WRITE(*,'(a,$)') ' ENDING SUBSET TO BE PRINTED : '
+ READ(*,'(BN,I6)') IEND
+ OO=.false.
+ END IF
+C
+C PRINT DATA
+C
+ ICODE=0
+ CALL CREXPRT(ICODE,IST,KSEC3(3),KEL,CNAMES,CUNITS,CVALS,
+ 1 KVALS,VALUES,KSUP,KSEC1,IERR)
+C
+C
+C -----------------------------------------------------------------
+C* 5. COLLECT DATA FOR REPACKING.
+C ---------------------------
+ 500 CONTINUE
+C
+ IF(.NOT.OENC) GO TO 300
+C
+C FIRST GET DATA DESCRIPTORS
+C
+ KK=0
+ IST=1
+ IEND=KSEC3(3)
+C
+ DO ISUBSET=IST, IEND
+
+
+ CALL CREXSEL2(ISUBSET,KEL,KTDLEN,KTDLST,KTDEXL,KTDEXP,CNAMES,
+ 1 CUNITS,IERR)
+ IF(KERR.NE.0) THEN
+ print*,'CREXSEL: error ',kerr
+ CALL EXIT(2)
+ END IF
+C
+ JM1KELEM=(ISUBSET-1)*KEL
+C
+ DO 501 I=1,KTDEXL
+ INV=I+JM1KELEM
+ IN =I+JM1KELEM
+C
+ IF(CUNITS(I).EQ.'CHARACTER') THEN
+ IPOS =VALUES(INV)/1000.
+ ICH=NINT(VALUES(INV)-IPOS*1000)
+ KKK=KKK+1
+ VALUE(IN)=KKK*1000+ICH
+ IF(CVALS(IPOS)(1:1).EQ.'/') THEN
+ CV=' '
+ DO II=1,ICH
+ CV(II:II)=CHAR(255)
+ END DO
+ CVAL(KKK)=CV
+ ELSE
+ CVAL(KKK)=CVALS(IPOS)
+ END IF
+ ELSEIF(CUNITS(I)(1:2).EQ.'C '.AND.
+ 1 KTDEXP(I)/1000.eq.12 ) THEN
+ VALUE(IN)=VALUES(INV)+273.15
+ ELSEIF(CUNITS(I)(1:2).EQ.'NB'.AND.
+ 1 KTDEXP(I).EQ.015003) THEN
+ VALUE(IN)=VALUES(INV)*0.0001
+ ELSE
+ VALUE(IN)=VALUES(INV)
+ END IF
+C
+ IF(KTDEXP(I).EQ.31001.OR.KTDEXP(I).EQ.31002.OR.
+ 1 KTDEXP(I).EQ.31000) THEN
+ KK=KK+1
+ KDATA(KK)=NINT(VALUES(INV))
+ END IF
+ 501 CONTINUE
+C
+ END DO
+C
+ KDLEN=2
+ IF(KK.NE.0) KDLEN=KK
+
+C -----------------------------------------------------------------
+C* 6. PACK BUFR MESSAGE.
+C -----------------
+ 600 CONTINUE
+C
+ KKK=0
+C
+ IF(KSEC0(3).LE.1) THEN
+ KSEC0(3)=3 ! Edition 3 of bufr message
+C
+ KSEC1(1)=18
+ KSEC1(2)=3 ! Bufr edition number
+ KSEC1(3)=KSEC1(3)
+ KSEC1(4)=1
+ KSEC1(5)=0 ! presence od section 2
+ KSEC1(7)=0
+ KSEC1(8)=0 ! Bufr local tables version number
+ KSEC1(9)=0
+ KSEC1(10)=0
+ KSEC1(11)=0
+ KSEC1(12)=0
+ KSEC1(13)=0
+ KSEC1(14)=0
+ KSEC1(15)=0 ! Bufr master table version number
+c
+ I_004001=0
+ I_004002=0
+ I_004003=0
+ I_004004=0
+ I_004005=0
+c
+ DO I=1,KTDEXL
+ IF(KTDEXP(I).EQ.004001) THEN
+ IF(I_004001.EQ.0) I_004001=I
+ ELSEIF(KTDEXP(I).EQ.004002) THEN
+ IF(I_004002.EQ.0) I_004002=I
+ ELSEIF(KTDEXP(I).EQ.004003) THEN
+ IF(I_004003.EQ.0) I_004003=I
+ ELSEIF(KTDEXP(I).EQ.004004) THEN
+ IF(I_004004.EQ.0) I_004004=I
+ ELSEIF(KTDEXP(I).EQ.004005) THEN
+ IF(I_004005.EQ.0) I_004005=I
+ END IF
+ END DO
+c
+ KSEC1(9)=NINT(VALUE(I_004001))-1900
+ IF(NINT(VALUE(I_004001)).GE.2000) THEN
+ KSEC1(9)=NINT(VALUE(I_004001))-2000
+ END IF
+ KSEC1(10)=NINT(VALUE(I_004002))
+ KSEC1(11)=NINT(VALUE(I_004003))
+ KSEC1(12)=NINT(VALUE(I_004004))
+ KSEC1(13)=NINT(VALUE(I_004005))
+c
+ KSEC1(14)=0
+ KSEC1(15)=13
+ KSEC1(16)=0
+ ELSEIF(KSEC0(3).EQ.2) THEN
+ KSEC0(3)=4 ! Edition 4 of bufr message
+c
+ KSEC1(1)=22 ! The size of section 1
+ KSEC1(2)=4
+ KSEC1(3)=KSEC1(3)
+ KSEC1(5)=0 ! presence od section 2
+ KSEC1(9)=0
+ KSEC1(10)=0
+ KSEC1(11)=0
+ KSEC1(12)=0
+ KSEC1(13)=0
+c
+ I_004001=0
+ I_004002=0
+ I_004003=0
+ I_004004=0
+ I_004005=0
+c
+ DO I=1,KTDEXL
+ IF(KTDEXP(I).EQ.004001) THEN
+ IF(I_004001.EQ.0) I_004001=I
+ ELSEIF(KTDEXP(I).EQ.004002) THEN
+ IF(I_004002.EQ.0) I_004002=I
+ ELSEIF(KTDEXP(I).EQ.004003) THEN
+ IF(I_004003.EQ.0) I_004003=I
+ ELSEIF(KTDEXP(I).EQ.004004) THEN
+ IF(I_004004.EQ.0) I_004004=I
+ ELSEIF(KTDEXP(I).EQ.004005) THEN
+ IF(I_004005.EQ.0) I_004005=I
+ END IF
+ END DO
+c
+ KSEC1( 9)=NINT(VALUE(I_004001))
+ KSEC1(10)=NINT(VALUE(I_004002))
+ KSEC1(11)=NINT(VALUE(I_004003))
+ KSEC1(12)=NINT(VALUE(I_004004))
+ KSEC1(13)=NINT(VALUE(I_004005))
+c
+ KSEC1(14)=0 ! Bufr master table
+ KSEC1(15)=KSEC1(17) ! Bufr master table version number
+ KSEC1(16)=KSEC1(16) ! Originating sub-centre
+ KSEC1(17)=KSEC1( 7) ! International sub-category
+ KSEC1( 7)=0
+ KSEC1(18)=0 ! Second
+c
+
+ END IF
+c
+ KSEC3(4)=192 ! No compression
+c
+ KBUFL=JBUFL
+C
+C
+C* 6.2 ENCODE DATA INTO BUFR MESSAGE.
+C ------------------------------
+ 620 CONTINUE
+C
+c Modify descriptor list for delayed
+c replication factor
+c
+ J=0
+ DO I=1,KTDLEN
+ IIF=KTDLST(I)/100000
+ IF(IIF.EQ.1) THEN
+ II=KTDLST(I)/1000
+ IY=KTDLST(I)-II*1000
+ IF(IY.EQ.0) THEN
+ J=J+1
+ KTDLST1(J)=KTDLST(I)
+ J=J+1
+ KTDLST1(J)=031002
+ ELSE
+ j=j+1
+ KTDlst1(j)=KTDlst(i)
+ END IF
+ ELSE
+ J=J+1
+ KTDLST1(J)=KTDLST(I)
+ END IF
+ END DO
+c
+ KTDLEN=J
+c
+ KERR=0
+c
+ CALL BUFREN( KSEC0,KSEC1,KSEC2,KSEC3,KSEC4,
+ 1 KTDLEN,KTDLST1,KDLEN,KDATA,KEL,
+ 2 KVALS,VALUE,CVAL,KBUFL,KBUFR,KERR)
+C
+ IF(KERR.gt.0) THEN
+ print*,'error is ',kerr
+ PRINT*,'ERROR DURING ENCODING.'
+ CALL EXIT(2)
+ END IF
+C
+C 6.3 WRITE PACKED BUFR MESSAGE INTO FILE.
+C ------------------------------------
+ 630 CONTINUE
+C
+ ILEN=KBUFL*NBYTPW
+C
+ IERR=0
+ CALL PBWRITE(IUNIT1,KBUFR,ILEN,IERR)
+ if(ierr.lt.0) then
+ print*,'Error writing into target file.'
+ CALL EXIT(2)
+ END IF
+C
+ GO TO 300
+C -----------------------------------------------------------------
+C
+ END
diff --git a/examples/crex/crextdexp.F b/examples/crex/crextdexp.F
new file mode 100755
index 0000000..917f340
--- /dev/null
+++ b/examples/crex/crextdexp.F
@@ -0,0 +1,167 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ PROGRAM CREXEXP
+C
+C**** *CREXEXP*
+C
+C
+C PURPOSE.
+C --------
+C Expands list of CREX data descriptors.
+C
+C
+C** INTERFACE.
+C ----------
+C
+C NONE.
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 07/01/2004.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ PARAMETER(JSEC1=40,JSEC3=4)
+ PARAMETER (KDLEN=200,KELEM=4000)
+C
+ DIMENSION KSEC1(JSEC1)
+C
+ DIMENSION KDATA(KDLEN)
+C
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+ CHARACTER*6 CREXKTDLST(KELEM)
+ CHARACTER*6 CREXKTDEXP(KELEM)
+C
+ REAL*8 RVIND
+C
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+C
+ RVIND=1.7E38
+C
+C INITIALIZE DELAYED REPLICATION FACTORS
+C
+ DO I=1,KDLEN
+ KDATA(I)=1
+ END DO
+C
+C SET DATA DECSRIPTORS
+C
+ N=1
+ CREXKTDLST( N)="D01090"
+ N=N+1
+ CREXKTDLST( N)="D02031"
+ N=N+1
+ CREXKTDLST( N)="D02032"
+ N=N+1
+ CREXKTDLST( N)="D02033"
+ N=N+1
+ CREXKTDLST( N)="D02004"
+ N=N+1
+ CREXKTDLST( N)="R01000"
+ N=N+1
+ CREXKTDLST( N)="D02005"
+ N=N+1
+ CREXKTDLST( N)="D02038"
+ N=N+1
+ CREXKTDLST( N)="D02044"
+ N=N+1
+ CREXKTDLST( N)="R01002"
+ N=N+1
+ CREXKTDLST( N)="D02039"
+ N=N+1
+ CREXKTDLST( N)="R02002"
+ N=N+1
+ CREXKTDLST( N)="B04024"
+ N=N+1
+ CREXKTDLST( N)="B13011"
+ N=N+1
+ CREXKTDLST( N)="B07032"
+ N=N+1
+ CREXKTDLST( N)="B04024"
+ N=N+1
+ CREXKTDLST( N)="B12111"
+ N=N+1
+ CREXKTDLST( N)="B04024"
+ N=N+1
+ CREXKTDLST( N)="B12112"
+ N=N+1
+ CREXKTDLST( N)="B07032"
+ N=N+1
+ CREXKTDLST( N)="B02002"
+ N=N+1
+ CREXKTDLST( N)="B08021"
+ N=N+1
+ CREXKTDLST( N)="B04025"
+ N=N+1
+ CREXKTDLST( N)="B11001"
+ N=N+1
+ CREXKTDLST( N)="B11002"
+ N=N+1
+ CREXKTDLST( N)="B08021"
+
+ KTDLEN=N
+C
+C SECTION 1 CONTENT
+C
+ KSEC1(2)=2 ! CREX EDITION NUMBER
+ KSEC1(3)=98 ! Originating Centre ( oooo)
+ KSEC1(4)=0 ! Update sequence number (uu)
+ KSEC1(5)=1 ! Number of subsets ( sss)
+ KSEC1(6)=0 ! CREX data category (nnn)
+ KSEC1(7)=1 ! International data sub-category (mmm)
+ KSEC1(8)=1 ! Version number of local table used
+ KSEC1(9)=2004 ! Year
+ KSEC1(10)=11 ! Month
+ KSEC1(11)=29 ! Daay
+ KSEC1(12)=12 ! Hour
+ KSEC1(13)=00 ! Minute
+ KSEC1(14)=0 ! CREX Master table (tt)
+ KSEC1(15)=3 ! Version number of Master table used (vv)
+ KSEC1(16)=0 ! Originating sub-centre (ppp)
+ KSEC1(17)=12 ! Bufr master table version number
+ KSEC1(18)=0 ! Bufr version number of local table used
+C
+C SECTION 3 CONTENT
+C
+ K=1
+ CALL CREXDES(K,KSEC1,KTDLEN,CREXKTDLST,KDLEN,KDATA,KELEM,
+ 1 KTDEXL,CREXKTDEXP,CNAMES,CUNITS,KERR)
+C
+ END
diff --git a/examples/crex/decode_crex.F b/examples/crex/decode_crex.F
new file mode 100755
index 0000000..3462a90
--- /dev/null
+++ b/examples/crex/decode_crex.F
@@ -0,0 +1,280 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ PROGRAM DECODE_CREX
+C
+C**** *DECODE_CREX*
+C
+C
+C PURPOSE.
+C --------
+C DECODE CREX CODED DATA
+C
+C
+C** INTERFACE.
+C ----------
+C
+C NONE.
+C
+C METHOD.
+C -------
+C
+C NONE.
+C
+C
+C EXTERNALS.
+C ----------
+C
+C CREXEX
+C CREXSEL
+C CREXPRS0
+C CREXPRT
+C PBOPEN
+C PBCLOSE
+C PBCREX
+C GETARG
+C
+C
+C
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C AUTHOR.
+C -------
+C
+C M. DRAGOSAVAC *ECMWF* 15/09/2003.
+C
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE.
+C
+C
+ IMPLICIT LOGICAL(L,O,G), CHARACTER*8(C,H,Y)
+C
+ PARAMETER(JSUP = 9,JSEC0= 3,JSEC1= 40,JSEC2=4096,JSEC3= 4,
+ 1 JSEC4= 2,JELEM=40000,JSUBS=400,JCVAL=150 ,JBUFL=80000,
+#ifdef JBPW_64
+ 2 JBPW = 64,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT=1200,
+#else
+ 2 JBPW = 32,JTAB =3000,JCTAB=120,JCTST=1800,JCTEXT=1200,
+#endif
+ 3 JWORK=360000,JKEY=46,JBYTE=80000)
+C
+ PARAMETER (KELEM=8000)
+ PARAMETER (KVALS=360000)
+C
+ DIMENSION KBUFF(JBUFL)
+ DIMENSION KSUP(JSUP) ,KSEC0(JSEC0),KSEC1(JSEC1)
+ DIMENSION KSEC3(JSEC3)
+C
+ REAL*8 VALUES(KVALS)
+ REAL*8 RVIND
+ REAL*8 EPS
+C
+ DIMENSION KTDLST(JELEM),KTDEXP(JELEM)
+ DIMENSION KDATA(200)
+C
+ CHARACTER*256 CF,CARG(4)
+ CHARACTER*64 CNAMES(KELEM)
+ CHARACTER*24 CUNITS(KELEM)
+ CHARACTER*80 CVALS(KVALS)
+ CHARACTER*80 YENC
+ CHARACTER*320000 YBUFF
+C
+ EQUIVALENCE(YBUFF,KBUFF(1))
+C
+C ------------------------------------------------------------------
+C* 1. INITIALIZE CONSTANTS AND VARIABLES.
+C -----------------------------------
+ 100 CONTINUE
+C
+ NBYTPW=JBPW/8
+ RVIND=1.7D38
+ NVIND=2147483647
+ IOBS=0
+ EPS=1.D-8
+ N=0
+ OO=.FALSE.
+ CF=' '
+C
+C INPUT FILE NAME
+C
+C GET INPUT AND OUTPUT FILE NAME.
+C
+ NARG=IARGC()
+C
+ IF(NARG.NE.2) THEN
+ PRINT*,'USAGE -- decode_crex -i infile '
+ STOP
+ END IF
+C
+ DO 101 J=1,NARG
+ CALL GETARG(J,CARG(J))
+ 101 CONTINUE
+C
+ IF(CARG(1).NE.'-I'.AND.CARG(1).NE.'-i'.OR.
+ 1 CARG(2).EQ.' ') THEN
+ PRINT*,'USAGE -- decode_crex -i inpfile '
+ STOP
+ END IF
+
+C
+ CF=CARG(2)
+ II=INDEX(CF,' ')
+ II=II-1
+C
+C* 1.2 OPEN FILE CONTAINING CREX DATA.
+C -------------------------------
+ 120 CONTINUE
+C
+ IRET=0
+ CALL PBOPEN(IUNIT,CF(1:II),'R',IRET)
+ IF(IRET.EQ.-1) STOP 'OPEN FAILED ON INPUT FILE'
+ IF(IRET.EQ.-2) STOP 'INVALID FILE NAME'
+ IF(IRET.EQ.-3) STOP 'INVALID OPEN MODE SPECIFIED'
+C
+C -----------------------------------------------------------------
+C* 2. SET REQUEST FOR EXPANSION.
+C --------------------------
+ 200 CONTINUE
+C
+ OPRT=.FALSE.
+ OENC=.FALSE.
+ WRITE(*,'(A,$)') ' DO YOU WANT TO PRINT( Y/N ) : '
+ READ (*,'(A)') YENC
+ IF(YENC(1:1).EQ.'Y'.OR.YENC(1:1).EQ.'y') THEN
+ OPRT=.TRUE.
+ END IF
+C
+ 201 CONTINUE
+C
+ WRITE(*,'(A,$)') ' DO YOU WANT TO PRINT SECTION 0-3( Y/N ) : '
+ READ (*,'(A,$)') YENC
+ OSEC3=.FALSE.
+ IF(YENC(1:1).EQ.'Y'.OR.YENC(1:1).EQ.'y') OSEC3=.TRUE.
+C
+ 210 CONTINUE
+C
+C
+C -----------------------------------------------------------------
+C* 3. READ CREX MESSAGE.
+C ------------------
+ 300 CONTINUE
+C
+ IERR=0
+ IRET=0
+C
+ YBUFF(1:15000)=' '
+ CALL PBCREX(IUNIT,KBUFF,JBUFL,KBUFL,IRET)
+ IF(IRET.LT.0) THEN
+ IF(IRET.EQ.-1) THEN
+ PRINT*,'NUMBER OF CREX MESSAGES PROCESSED ',N
+ PRINT*,'NUMBER OF CREX OBSERVATIONS ',IOBS
+ STOP 'END OF FILE '
+ END IF
+ IF(IRET.EQ.-2) STOP 'ERROR IN HANDLING THE FILE'
+ IF(IRET.EQ.-3) STOP 'ERROR DURING READ CREX FILE.'
+ END IF
+C
+ N=N+1
+ PRINT*,'----------------------------------',N
+ print*,YBUFF(1:KBUFL)
+C
+C -----------------------------------------------------------------
+C* 4. EXPAND CREX MESSAGE.
+C --------------------
+ 400 CONTINUE
+C
+
+ IERR=0
+ CALL CREXEX(KBUFL,YBUFF,KSUP,KSEC0 ,KSEC1,KSEC3 ,
+ 1 KELEM,CNAMES,CUNITS,KVALS,VALUES,CVALS,IERR)
+C
+ IF(IERR.NE.0) THEN
+ PRINT*,'CREX ERROR ', IERR
+ GO TO 300
+ END IF
+C
+C
+ IOBS=IOBS+KSEC3(3)
+C
+ ISUBSET=1
+ CALL CREXSEL2(ISUBSET,KELEM,KTDLEN,KTDLST,KTDEXL,KTDEXP,
+ 1 CNAMES,CUNITS,KERR)
+ IF(KERR.NE.0) THEN
+ PRINT*,'CREXSEL: ERROR.'
+ CALL EXIT(2)
+ END IF
+C
+C* 4.1 PRINT CONTENT OF EXPANDED DATA.
+C -------------------------------
+ 410 CONTINUE
+C
+ IF(.NOT.OPRT) GO TO 300
+ IF(.NOT.OSEC3) GO TO 450
+C
+C* 4.2 PRINT SECTION ZERO OF CREX MESSAGE.
+C -----------------------------------
+ 420 CONTINUE
+C
+ CALL CREXPRS0(KSEC0)
+C
+C* 4.3 PRINT SECTION ONE OF CREX MESSAGE.
+C -----------------------------------
+ 430 CONTINUE
+C
+ ISUBSET=1
+ CALL CREXSEL2(ISUBSET,KELEM,KTDLEN,KTDLST,KTDEXL,KTDEXP,
+ 1 CNAMES,CUNITS,KERR)
+ IF(KERR.NE.0) CALL EXIT(2)
+C
+ CALL CREXPRS1(KSEC1,KSEC3,KTDLEN,KTDLST,KTDEXL,
+ 1 KTDEXP,KELEM,CNAMES)
+C
+C
+C
+C* 4.5 PRINT SECTION 2 OF CREX MESSAGE.
+C -----------------------------------
+ 450 CONTINUE
+C
+C
+C* 4.6 PRINT SECTION 2 (DATA).
+C -----------------------
+ 460 CONTINUE
+C
+C IN THE CASE OF MANY SUBSETS DEFINE RANGE OF SUBSETS
+C
+ IF(.NOT.OO) THEN
+ WRITE(*,'(A,$)') ' STARTING SUBSET TO BE PRINTED : '
+ READ(*,'(BN,I4)') IST
+ WRITE(*,'(A,$)') ' ENDING SUBSET TO BE PRINTED : '
+ READ(*,'(BN,I4)') IEND
+ OO=.FALSE.
+ END IF
+C
+C PRINT DATA
+C
+ ICODE=0
+ CALL CREXPRT(ICODE,IST,IEND,KELEM,CNAMES,CUNITS,CVALS,
+ 1 KVALS,VALUES,KSUP,KSEC1,IERR)
+C
+C
+ GO TO 300
+C
+
+C -----------------------------------------------------------------
+ 900 CONTINUE
+C
+ END
diff --git a/examples/crex/test.sh b/examples/crex/test.sh
new file mode 100755
index 0000000..6f0674f
--- /dev/null
+++ b/examples/crex/test.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+cd ../../
+path=`pwd`
+
+
+CREX_TABLES=$path/crextables/
+export CREX_TABLES
+
+cd examples/crex
+
+./decode_crex -i ../../data/temp.crex
diff --git a/examples/fft/Makefile b/examples/fft/Makefile
new file mode 100755
index 0000000..05c56cc
--- /dev/null
+++ b/examples/fft/Makefile
@@ -0,0 +1,26 @@
+#
+# Makefile for example programs
+#
+PLACE = ../../
+LIB = emos
+#
+include $(PLACE)config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include $(PLACE)options/options_$(ARCH)
+#
+TARGDIR = ./
+#
+#
+TARGETS = all clean
+EXECS = fft
+#
+#
+all :$(EXECS)
+
+fft: fft.o
+ $(FC) $(FFLAGS) -o $@ fft.o -L$(PLACE) -l$(LIB)$(R64)
+
+clean :
+ @for name in $(EXECS); do\
+ (rm -f $$name *.o ); \
+ done
diff --git a/examples/fft/Makefile.in b/examples/fft/Makefile.in
new file mode 100755
index 0000000..bb0212c
--- /dev/null
+++ b/examples/fft/Makefile.in
@@ -0,0 +1,29 @@
+#
+# Makefile for example programs
+A64 = plat
+R64 = reals
+ARCH = arch
+CNAME = comp
+#
+PLACE = ../../
+LIB = emos
+#
+include $(PLACE)config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include $(PLACE)options/options_$(ARCH)
+#
+TARGDIR = ./
+#
+TARGETS = all clean
+EXECS = fft
+#
+#
+all :$(EXECS)
+
+fft: fft.o
+ $(FC) $(FFLAGS) -o $@ fft.o -L$(PLACE) -l$(LIB)$(R64)
+
+clean :
+ @for name in $(EXECS); do\
+ (rm -f $$name *.o ); \
+ done
diff --git a/examples/fft/fft.f b/examples/fft/fft.f
new file mode 100755
index 0000000..b832a7a
--- /dev/null
+++ b/examples/fft/fft.f
@@ -0,0 +1,30 @@
+ program fft
+c Copyright 1981-2012 ECMWF.
+c
+c This software is licensed under the terms of the Apache Licence
+c Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+c
+c In applying this licence, ECMWF does not waive the privileges and immunities
+c granted to it by virtue of its status as an intergovernmental organisation
+c nor does it submit to any jurisdiction.
+c
+ parameter (n=2*2*3*5,m=20)
+ dimension a((n+2)*m),trigs(n),work(m*(n+1))
+ integer ifax(10)
+ call set99(trigs,ifax,n)
+ do 11 i=1,(n+2)*m
+ a(i)=0
+11 continue
+ do 1 j=1,m
+ do 1 i=1,n
+ a((j-1)*(n+2)+i)=j
+1 continue
+c write (2,*)(a(i),i=1,n)
+c t1=secnds(real(0.))
+c write(*,*)t1
+ call fft99(a,work,trigs,ifax,1,n+2,n,m,-1)
+c t2=secnds(real(t1))
+c write(*,*)t2
+ write (*,2)(a(i),i=1,n)
+ 2 format(4(f20.12,2x))
+ end
diff --git a/examples/gribex/Makefile b/examples/gribex/Makefile
new file mode 100755
index 0000000..8a576fd
--- /dev/null
+++ b/examples/gribex/Makefile
@@ -0,0 +1,26 @@
+#
+# Makefile for example programs
+#
+LIBPATH = ../../
+#
+include ../../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../../options/options_$(ARCH)
+#
+TARGETS = all clean
+EXECS = agrdemo find_t
+#
+#
+all: $(EXECS)
+
+agrdemo: agrdemo.o
+ $(FC) $(FFLAGS) -o $@ agrdemo.o -L$(LIBPATH) -lemos$(R64)
+
+find_t: find_t.o
+ $(FC) $(FFLAGS) -o $@ find_t.o -L$(LIBPATH) -lemos$(R64)
+
+
+clean:
+ @for name in $(EXECS) ; do\
+ (rm -f $$name $$name.o $$name.f); \
+ done
diff --git a/examples/gribex/Makefile.in b/examples/gribex/Makefile.in
new file mode 100755
index 0000000..68e51db
--- /dev/null
+++ b/examples/gribex/Makefile.in
@@ -0,0 +1,30 @@
+#
+# Makefile for example programs
+A64 = plat
+R64 = reals
+ARCH = arch
+CNAME = comp
+#
+LIBPATH = ../../
+#
+include ../../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../../options/options_$(ARCH)
+#
+TARGETS = all clean
+EXECS = agrdemo find_t
+#
+#
+all: $(EXECS)
+
+agrdemo: agrdemo.o
+ $(FC) $(FFLAGS) -o $@ agrdemo.o -L$(LIBPATH) -lemos$(R64)
+
+find_t: find_t.o
+ $(FC) $(FFLAGS) -o $@ find_t.o -L$(LIBPATH) -lemos$(R64)
+
+
+clean:
+ @for name in $(EXECS) ; do\
+ (rm -f $$name $$name.o $$name.f); \
+ done
diff --git a/examples/gribex/README b/examples/gribex/README
new file mode 100755
index 0000000..3238363
--- /dev/null
+++ b/examples/gribex/README
@@ -0,0 +1,36 @@
+
+ This directory contains example for the GRIB decoding and how to handle
+a Unix file containing GRIB edition 1 products in an indexed fashion.
+
+ GRIB data are in ../data directory.
+
+ make
+
+ will compile both examples
+
+ Before you run you have to set two environment variables:
+ ECMWF_LOCAL_TABLE_PATH and LOCAL_DEFINITION_TEMPLATES
+
+ or just run:
+
+ ./test.sh
+
+agrdemo.F :
+
+Executable version of agrdemo.F can be run:
+
+./agrdemo -i ../data/latlon.grib
+
+ It will print a listing of the Grib header records together
+with a few of the data values.
+ Also, you can run ./agrdemo for different sort of grib data:
+gaussian.grib , spectral.grib , latlon.grib
+
+find_t.F :
+
+ This program uses PBGPARM to locate temperature fields in a file of GRIB
+products and writes them to a target file.
+
+./find_t -i ../data/850ght.grib -o outputfile
+
+Program can be easy modified to select the geopotencial field instead
diff --git a/examples/gribex/agrdemo.F b/examples/gribex/agrdemo.F
new file mode 100755
index 0000000..e47f33b
--- /dev/null
+++ b/examples/gribex/agrdemo.F
@@ -0,0 +1,265 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ PROGRAM GRDEMO
+C
+ IMPLICIT NONE
+C
+C**** GRDEMO - Program to demonstrate use of GRIBEX routine.
+C
+C Purpose.
+C --------
+C
+C Demonstrates use of GRIBEX routine to unpack
+C GRIB coded data.
+C
+C** Interface.
+C ----------
+C
+C Method.
+C -------
+C
+C Prints sections 0, 1, 2, 3 and 4 of GRIB message.
+C
+C Externals.
+C ----------
+C
+C GRIBEX
+C GRPRS0
+C GRPRS1
+C GRPRS2
+C GRPRS3
+C GRPRS4
+C PBOPEN
+C PBGRIB
+C PBCLOSE
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes for GRIB definition.
+C WMO Publication No. 9, Volume B, for grid catalogue numbers.
+C
+C Modifications
+C -------------
+C
+C K. Fielding ECMWF Dec 2000
+C Set missing value for bit controlled fields.
+C
+C Comments.
+C ---------
+C
+C GRIBEX provides a number of packing/unpacking options.
+C See documentation for details.
+C
+C
+C -----------------------------------------------------------------
+C
+C Arrays are dimensioned to accommodate T213/N160 data volumes.
+C JPBYTE is number of bytes per REAL
+C
+ INTEGER JPACK, JPBYTE
+C
+ PARAMETER (JPACK = 280000)
+ PARAMETER (JPBYTE = 4)
+C
+C Array for integer parameters from section 0 of GRIB message.
+C
+ INTEGER ISEC0 (2)
+C
+C Array for integer parameters from section 1 of GRIB message.
+C
+ INTEGER ISEC1 (1024)
+C
+C Array for integer parameters from section 2 of GRIB message.
+C
+ INTEGER ISEC2 (1024)
+C
+C Array for integer parameters from section 3 of GRIB message.
+C
+ INTEGER ISEC3 (2)
+C
+C Array for integer parameters from section 4 of GRIB message.
+C
+ INTEGER ISEC4 (512)
+C
+C Array for real parameters from section 2 of GRIB message.
+C
+ REAL ZSEC2 (512)
+C
+C Array for real parameters from section 3 of GRIB message.
+C
+ REAL ZSEC3 (2)
+C
+C Array for real parameters from section 4 of GRIB message.
+C This is the binary data section and the array to hold
+C the unpacked data may need to be 4 times as long as that
+C for the packed data.
+C
+ REAL ZSEC4 (JPACK * 4)
+C
+C Array to read in packed data.
+C
+ INTEGER INBUFF (JPACK)
+C
+C GRIBEX routine has a number of encoding/decoding options.
+C
+ CHARACTER*256 YDATAFILE
+ CHARACTER*2 INPUT
+ CHARACTER*1 YOPER
+ INTEGER IFILE, NUMERR, IPBLEN, IWORD, IFILEN, IRET, IARGC, NARGS
+ INTEGER JCOUNT, LENOUT
+ INTEGER JLAT, JLONG, JSTART, JEND
+ REAL ZFIRST, ZLAST, ZSTEP, ZLAT
+ REAL ZMAX
+C
+C Pick up file names from command line.
+C
+ NARGS = IARGC()
+ IF( NARGS.LT.2 ) THEN
+ print*,'Usage: agrdemo -i inputfile'
+ STOP
+ END IF
+
+ CALL GETARG(1,INPUT)
+
+ IF(INPUT.EQ.'-i') THEN
+ CALL GETARG(2,YDATAFILE)
+ ELSE
+ print*,'Usage: agrdemo -i inputfile'
+ STOP
+ END IF
+
+C Clear error counter.
+C
+ NUMERR = 0
+C
+C Lengths of INBUFF and PSEC4
+C
+ IPBLEN = JPACK * JPBYTE
+C
+ IFILEN = INDEX(YDATAFILE,' ') - 1
+C
+ CALL PBOPEN (IFILE, YDATAFILE (1: IFILEN), 'R', IRET)
+C
+ IF ( IRET .NE. 0 ) THEN
+ WRITE (*, *) ' Return code from PBOPEN = ', IRET
+ CALL PBCLOSE(IFILE, IRET)
+ STOP 'Fault in PBOPEN'
+ ENDIF
+C
+C Loop through GRIB products in file.
+ JCOUNT = 0
+C
+ 50 CONTINUE
+ JCOUNT = JCOUNT + 1
+C
+C Read packed field into INBUFF.
+ CALL PBGRIB (IFILE, INBUFF, IPBLEN, LENOUT, IRET )
+C
+ IF ( IRET .LT. 0 ) THEN
+ WRITE (*, *) ' Return code from pbgrib = ', IRET
+ IF ( IRET .EQ. -1) THEN
+ WRITE (*, *) ' End of file. Number of products =', (JCOUNT-1)
+ CALL PBCLOSE (IFILE, IRET)
+ WRITE (*,*) ' GRDEMO : Number of decoding errors = ', NUMERR
+ STOP 'EOF'
+ ELSE
+ WRITE (*, *) ' kret = ',IRET,' after ', JCOUNT,' products.'
+ CALL PBCLOSE (IFILE, IRET)
+ STOP 'Fault in PBGRIB'
+ ENDIF
+ ENDIF
+C
+C 'D' function to unpack entire GRIB message.
+C
+ YOPER = 'D'
+ WRITE (*,*) ' GRDEMO : Function code = ', YOPER
+C
+ IRET = 1
+ LENOUT = LENOUT / JPBYTE
+C
+C Set missing data values
+C
+ ISEC3 (2) = -99999
+ ZSEC3 (2) = -99999.0
+C
+ CALL GRIBEX (ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X ZSEC4, IPBLEN, INBUFF, LENOUT, IWORD, YOPER, IRET)
+C
+C Check return code.
+C
+ WRITE (*,*) ' GRDEMO : GRIBEX return code = ', IRET
+ IF (IRET .EQ. - 6) WRITE (*,*) ' GRDEMO : Pseudo-grib data found.'
+ IF (IRET .GT. 0) THEN
+ NUMERR = NUMERR + 1
+ GO TO 50
+ ENDIF
+C
+C Print section 0 , 1 , 2 and 3 (if present) and 4.
+C Section 1 is the product definition section.
+C Section 2 is the grid definition section.
+C Section 3 is the bit-map section.
+C Section 4 is the data section.
+C
+ CALL GRPRS0 (ISEC0)
+ CALL GRPRS1 (ISEC0, ISEC1)
+C
+ IF (ISEC1 (5) .EQ. 0 .OR. ISEC1 (5) .EQ. 64) THEN
+ WRITE (*,*) ' GRDEMO : No section 2 in GRIB message.'
+ ELSE
+ CALL GRPRS2 (ISEC0, ISEC2, ZSEC2)
+ ENDIF
+C
+ IF (ISEC1 (5) .EQ. 0 .OR. ISEC1 (5) .EQ. 128) THEN
+ WRITE (*,*) ' GRDEMO : No section 3 in GRIB message.'
+ ELSE
+ CALL GRPRS3 (ISEC0, ISEC3, ZSEC3)
+ ENDIF
+C
+ CALL GRPRS4 (ISEC0, ISEC4, ZSEC4)
+C
+C Sample code to print maximum and minimum value in data.
+C
+C ZMAX = ZSEC4 (1)
+C ZMIN = ZSEC4 (1)
+C
+C DO JLAT = 2, ISEC4 (1)
+C ZMAX = MAX (ZMAX, ZSEC4 (JLAT) )
+C ZMIN = MIN (ZMIN, ZSEC4 (JLAT) )
+C ENDDO
+C WRITE (*, *)
+C WRITE (*, *) 'Maximum value in field is ', ZMAX
+C WRITE (*, *) 'Minimum value in field is ', ZMIN
+C WRITE (*, *)
+C
+C Sample code to print all values along lines of
+C latitude for a lat/long grid only.
+C
+C ZFIRST = REAL (ISEC2 (5) ) / 1000.0
+C ZLAST = REAL (ISEC2 (8) ) / 1000.0
+C ZSTEP = REAL (ISEC2 (9) ) / 1000.0
+C WRITE (*, *) 'Longitudes from ', ZFIRST, ' to ', ZLAST,
+C 1 ' with stride ', ZSTEP
+C
+C DO JLAT = 1, ISEC2 (3)
+C ZLAT = REAL (ISEC2 (4) - (JLAT - 1) * ISEC2 (10) ) / 1000.0
+C JSTART = (JLAT - 1) * ISEC2 (2) + 1
+C JEND = JLAT * ISEC2 (2)
+C WRITE (*, *)
+C WRITE (*, *) 'Values at latitude ', ZLAT
+C WRITE (*, *)
+C WRITE(*, '(1H , 5E16.5)' )
+C 1 (ZSEC4 (JLONG), JLONG = JSTART, JEND)
+C ENDDO
+C
+ GO TO 50
+C
+ END
diff --git a/examples/gribex/find_t.F b/examples/gribex/find_t.F
new file mode 100755
index 0000000..ad9c722
--- /dev/null
+++ b/examples/gribex/find_t.F
@@ -0,0 +1,101 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ PROGRAM FIND_T
+ IMPLICIT NONE
+C
+ INTEGER JPACK, JPBYTES
+ PARAMETER (JPACK = 300000)
+ PARAMETER (JPBYTES = 4)
+C
+ INTEGER INBUFF
+ DIMENSION INBUFF(JPACK)
+ INTEGER IRET, NARGS, N, J, ILENB, LENOUT, NTEMPS
+ INTEGER IVALUE, NUMBER, ISIZE, IPARAM, ITEMP, IARGC
+C
+ INTEGER PBGTOTL, PBGPUT, PBGGET, PBGLENG, PBGPARM
+ EXTERNAL PBGTOTL, PBGPUT, PBGGET, PBGLENG, PBGPARM
+ EXTERNAL GETENV
+C
+ CHARACTER*128 INFILE, OUTFILE, CARG(4)
+C
+C **********************************************************************
+C
+C Pick up file names from command line.
+C
+ NARGS = IARGC()
+ IF( NARGS.LT.4 ) THEN
+ print*,'Usage: find_t -i inputfile -o outputfile'
+ STOP
+ END IF
+
+ DO 101 J=1,NARGS
+ CALL GETARG(J,CARG(J))
+ 101 CONTINUE
+
+ DO 102 J=1,NARGS,2
+ IF(CARG(J).EQ.'-i') THEN
+ INFILE=CARG(J+1)
+ ELSEIF(CARG(J).EQ.'-o') THEN
+ OUTFILE=CARG(J+1)
+ ELSE
+ print*,'Usage: find_t -i inputfile -o outputfile'
+ STOP
+ END IF
+ 102 CONTINUE
+C
+C Count number of GRIBs in the file
+C
+ NUMBER = PBGTOTL(INFILE)
+ WRITE(*,*) 'Number of GRIBs in the file = ', NUMBER
+ IF( NUMBER.EQ.0 ) STOP 'No Gribs found'
+C
+C Search for temperature fields.
+C (Temperature is code 130 in table 128.)
+C
+ NTEMPS = 0
+ ITEMP = (128*1000) + 130
+ ILENB = JPACK * JPBYTES
+C
+ DO N = 1, NUMBER
+C
+ IPARAM = PBGPARM(INFILE,N)
+C
+C Handle the GRIB product if it is a temperature field
+C
+ IF( IPARAM.EQ.ITEMP ) THEN
+C
+C Check buffer is big enough for GRIB field.
+C
+ ISIZE = PBGLENG(INFILE,N)
+ IF( ISIZE.GT.ILENB ) THEN
+ WRITE(*,*) 'Field size (bytes) = ', ISIZE
+ WRITE(*,*) 'Buffer size (bytes) = ', ILENB
+ STOP 'Buffer too small for field'
+ ENDIF
+C
+C Read temperature field and write it to the output file.
+C
+ NTEMPS = NTEMPS + 1
+ LENOUT = PBGGET(INFILE, INBUFF, ILENB, N)
+ IF( LENOUT.LT.0 ) STOP 'Problem reading temperature field'
+C
+ IRET = PBGPUT(OUTFILE, INBUFF, LENOUT)
+ IF( IRET.LT.LENOUT ) STOP 'Problem writing temperature field'
+C
+ ENDIF
+C
+ ENDDO
+C
+ WRITE(*,*) 'Number of temperature fields copied = ', NTEMPS
+ IF( NTEMPS.EQ.0 ) WRITE(*,*) 'No output file created'
+C
+ STOP
+ END
diff --git a/examples/gribex/test.sh b/examples/gribex/test.sh
new file mode 100755
index 0000000..02fa7aa
--- /dev/null
+++ b/examples/gribex/test.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+cd ../../
+path=`pwd`
+
+ECMWF_LOCAL_TABLE_PATH=$path/gribtables
+export ECMWF_LOCAL_TABLE_PATH
+
+LOCAL_DEFINITION_TEMPLATES=$path/gribtemplates
+export LOCAL_DEFINITION_TEMPLATES
+
+cd examples/gribex
+
+./agrdemo -i ../../data/latlon.grib
diff --git a/examples/interpolation/Makefile b/examples/interpolation/Makefile
new file mode 100755
index 0000000..6bc5264
--- /dev/null
+++ b/examples/interpolation/Makefile
@@ -0,0 +1,24 @@
+#
+# Makefile for example programs
+#
+PLACE = ../../
+LIB = emos
+#
+include $(PLACE)config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include $(PLACE)options/options_$(ARCH)
+#
+#
+TARGETS = all clean
+EXECS = interpolation_example
+#
+#
+all: $(EXECS)
+
+interpolation_example: interpolation_example.o
+ $(FC) $(FFLAGS) -o $@ interpolation_example.o -L$(PLACE) -l$(LIB)$(R64)
+
+clean:
+ @for name in $(EXECS) ; do\
+ (rm -f $$name $$name.o $$name.f); \
+ done
diff --git a/examples/interpolation/Makefile.in b/examples/interpolation/Makefile.in
new file mode 100755
index 0000000..12efcf0
--- /dev/null
+++ b/examples/interpolation/Makefile.in
@@ -0,0 +1,28 @@
+#
+# Makefile for example programs
+A64 = plat
+R64 = reals
+ARCH = arch
+CNAME = comp
+#
+LIB = emos
+PLACE = ../../
+#
+include $(PLACE)config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include $(PLACE)options/options_$(ARCH)
+#
+#
+TARGETS = all clean
+EXECS = interpolation_example
+#
+#
+all: $(EXECS)
+
+interpolation_example: interpolation_example.o
+ $(FC) $(FFLAGS) -o $@ interpolation_example.o -L$(PLACE) -l$(LIB)$(R64)
+
+clean:
+ @for name in $(EXECS) ; do\
+ (rm -f $$name $$name.o $$name.f); \
+ done
diff --git a/examples/interpolation/interpolation_example.F b/examples/interpolation/interpolation_example.F
new file mode 100755
index 0000000..cc38a3f
--- /dev/null
+++ b/examples/interpolation/interpolation_example.F
@@ -0,0 +1,142 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ PROGRAM SAMPLE1
+C
+ IMPLICIT NONE
+ INTEGER IPROD
+ INTEGER INTV
+ REAL REALV
+ CHARACTER*20 CHARV
+ DIMENSION INTV(4), REALV(4), CHARV(4)
+C
+ INTEGER JPGRIB, JPBYTES
+C
+ PARAMETER (JPGRIB = 2000000)
+C
+C JPBYTES is the size in bytes on an 'INTEGER'
+C Set JPBYTES = 8 on a 64-bit machine.
+C
+ PARAMETER (JPBYTES = 4)
+C
+ INTEGER INGRIB, NEWFLD
+ DIMENSION INGRIB(JPGRIB), NEWFLD(JPGRIB)
+C
+ REAL ZNFELDI, ZNFELDO
+ DIMENSION ZNFELDI(1), ZNFELDO(1)
+C
+ INTEGER IUNIT1, IUNIT2, IREC, INLEN, NEWLEN, IRET, NARGS
+ INTEGER*4 J
+C
+C Externals
+ INTEGER INTOUT, INTF, IARGC
+
+ CHARACTER*128 INFILE, OUTFILE, CARG(4)
+C
+C **********************************************************************
+C
+C Pick up file names from command line.
+C
+ NARGS = IARGC()
+ IF( NARGS.LT.4 ) THEN
+ print*,'Usage: interpolation_example -i inputfile -o outputfile'
+ STOP
+ END IF
+
+ DO 101 J=1,NARGS
+ CALL GETARG(J,CARG(J))
+ 101 CONTINUE
+
+ DO 102 J=1,NARGS,2
+ IF(CARG(J).EQ.'-i') THEN
+ INFILE=CARG(J+1)
+ ELSEIF(CARG(J).EQ.'-o') THEN
+ OUTFILE=CARG(J+1)
+ ELSE
+ print*,'Usage: interpolation_example -i inputfile -o outputfile'
+ STOP
+ END IF
+ 102 CONTINUE
+
+C Define the packing accuracy for the new field(s).
+C
+ INTV(1) = 24
+ IRET = INTOUT('accuracy', INTV, REALV, CHARV)
+ IF ( IRET.NE.0 ) THEN
+ WRITE(*,*) ' First INTOUT failed.'
+ STOP
+ ENDIF
+C
+C Define the grid interval for the new field(s).
+C
+cs REALV(1) = 1.5
+cs REALV(2) = 1.5
+cs IRET = INTOUT('grid', INTV, REALV, CHARV)
+ INTV(1) = 640
+ IRET = INTOUT('reduced', INTV, REALV, CHARV)
+ IF ( IRET.NE.0 ) THEN
+ WRITE(*,*) ' Third INTOUT failed.'
+ STOP
+ ENDIF
+
+C
+C Open input and output files.
+C
+ CALL PBOPEN(IUNIT1, INFILE, 'r', IRET)
+ IF ( IRET.NE.0 ) STOP ' PBOPEN failed'
+ CALL PBOPEN(IUNIT2, OUTFILE, 'w', IRET)
+ IF ( IRET.NE.0 ) STOP ' PBOPEN failed'
+ IPROD = 0
+C
+C Start of loop through input GRIB-coded fields
+C
+ 200 CONTINUE
+ IPROD = IPROD + 1
+C
+C Read next product.
+C
+ CALL PBGRIB(IUNIT1, INGRIB, JPGRIB*JPBYTES, IREC, IRET)
+ IF ( IRET.EQ.-1 ) GOTO 900
+ IF ( IRET.NE.0 ) STOP ' PBGRIB failed'
+C
+C Interpolate.
+C
+ WRITE(*,*) ' Interpolate product number ', IPROD
+ NEWLEN = JPGRIB
+ INLEN = IREC/JPBYTES
+ IRET = INTF(INGRIB,INLEN,ZNFELDI,NEWFLD,NEWLEN,ZNFELDO)
+ IF ( IRET.NE.0 ) THEN
+ WRITE(*,*) ' INTF failed.'
+ STOP
+ ENDIF
+C
+C Write the new product to file.
+C
+ CALL PBWRITE( IUNIT2, NEWFLD, NEWLEN*JPBYTES, IRET)
+ IF ( IRET.LT.(NEWLEN*JPBYTES) ) STOP ' PBWRITE failed'
+C
+C Loop back for next product.
+C
+ GOTO 200
+C
+C Closedown.
+C
+ 900 CONTINUE
+C
+ IPROD = IPROD - 1
+ WRITE(*,*) ' All done after ', IPROD, ' products.'
+C
+C Close input and output files.
+C
+ CALL PBCLOSE(IUNIT1, IRET)
+ CALL PBCLOSE(IUNIT2, IRET)
+C
+ STOP
+ END
diff --git a/examples/interpolation/test.sh b/examples/interpolation/test.sh
new file mode 100755
index 0000000..46f9afa
--- /dev/null
+++ b/examples/interpolation/test.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+cd ../../
+path=`pwd`
+
+export HIRLAM_LSM_PATH=$path/land_sea_mask
+ECMWF_LOCAL_TABLE_PATH=$path/gribtables
+export ECMWF_LOCAL_TABLE_PATH
+
+LOCAL_DEFINITION_TEMPLATES=$path/gribtemplates
+export LOCAL_DEFINITION_TEMPLATES
+
+MARS_LSM_PATH=$path/land_sea_mask
+export MARS_LSM_PATH
+
+cd examples/interpolation
+
+./interpolation_example -i ../../data/latlon.grib -o output.grib
diff --git a/examples/interpolation_grib_api/Makefile b/examples/interpolation_grib_api/Makefile
new file mode 100755
index 0000000..8ac2b46
--- /dev/null
+++ b/examples/interpolation_grib_api/Makefile
@@ -0,0 +1,27 @@
+#
+# Makefile for example programs
+#
+GRIB_API=libgrib_api.a
+JASPER=/usr/lib/libjasper.a
+PLACE = ../../
+LIBEMOS = $(PLACE)$(LIB)$(R64)
+LIB = emos
+#
+include $(PLACE)config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include $(PLACE)options/options_$(ARCH)
+#
+#
+TARGETS = all clean
+EXECS = interpolation_example
+#
+#
+all: $(EXECS)
+
+interpolation_example: interpolation_example.o $(LIBEMOS)
+ $(FC) $(FFLAGS) -o $@ interpolation_example.o $(LIBEMOS) $(GRIB_API) $(JASPER)
+
+clean:
+ @for name in $(EXECS) ; do\
+ (rm -f $$name $$name.o $$name.f); \
+ done
diff --git a/examples/interpolation_grib_api/Makefile.in b/examples/interpolation_grib_api/Makefile.in
new file mode 100755
index 0000000..de42173
--- /dev/null
+++ b/examples/interpolation_grib_api/Makefile.in
@@ -0,0 +1,34 @@
+#
+# Makefile for example programs
+GRIB_API_DIR=glue
+JASPER_DIR=jasp
+A64 = plat
+R64 = reals
+ARCH = arch
+CNAME = comp
+#
+GRIB_API=$(GRIB_API_DIR)/lib/libgrib_api.a
+#JASPER=/usr/lib/libjasper.a
+JASPER=$(JASPER_DIR)
+LIB = libemos$(R64).a
+PLACE = ../../
+LIBEMOS = $(PLACE)$(LIB)
+#
+include $(PLACE)config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include $(PLACE)options/options_$(ARCH)
+#
+#
+TARGETS = all clean
+EXECS = interpolation_example
+#
+#
+all: $(EXECS)
+
+interpolation_example: interpolation_example.o $(LIBEMOS)
+ $(FC) $(FFLAGS) -o $@ interpolation_example.o $(LIBEMOS) $(GRIB_API) $(JASPER)
+
+clean:
+ @for name in $(EXECS) ; do\
+ (rm -f $$name $$name.o $$name.f); \
+ done
diff --git a/examples/interpolation_grib_api/interpolation_example.F b/examples/interpolation_grib_api/interpolation_example.F
new file mode 100755
index 0000000..1f2b77c
--- /dev/null
+++ b/examples/interpolation_grib_api/interpolation_example.F
@@ -0,0 +1,151 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ PROGRAM SAMPLE1
+C
+ IMPLICIT NONE
+ INTEGER IPROD
+ INTEGER INTV
+ REAL REALV
+ CHARACTER*20 CHARV
+ DIMENSION INTV(4), REALV(4), CHARV(4)
+C
+ INTEGER JPGRIB, JPBYTES
+C
+ PARAMETER (JPGRIB = 2000000)
+C
+C JPBYTES is the size in bytes on an 'INTEGER'
+C Set JPBYTES = 8 on a 64-bit machine.
+C
+ PARAMETER (JPBYTES = 4)
+C
+ INTEGER INGRIB, NEWFLD
+ DIMENSION INGRIB(JPGRIB), NEWFLD(JPGRIB)
+C
+ REAL ZNFELDI, ZNFELDO
+ DIMENSION ZNFELDI(1), ZNFELDO(1)
+C
+ INTEGER IUNIT1, IUNIT2, IREC, INLEN, NEWLEN, IRET, NARGS
+ INTEGER*4 J
+C
+C Externals
+ INTEGER INTOUT, INTF2, IARGC
+
+ CHARACTER*128 INFILE, OUTFILE, CARG(4)
+C
+C **********************************************************************
+C
+C Pick up file names from command line.
+C
+ NARGS = IARGC()
+ IF( NARGS.LT.4 ) THEN
+ print*,'Usage: interpolation_example -i inputfile -o outputfile'
+ STOP
+ END IF
+
+ DO 101 J=1,NARGS
+ CALL GETARG(J,CARG(J))
+ 101 CONTINUE
+
+ DO 102 J=1,NARGS,2
+ IF(CARG(J).EQ.'-i') THEN
+ INFILE=CARG(J+1)
+ ELSEIF(CARG(J).EQ.'-o') THEN
+ OUTFILE=CARG(J+1)
+ ELSE
+ print*,'Usage: interpolation_example -i inputfile -o outputfile'
+ STOP
+ END IF
+ 102 CONTINUE
+
+C Define the packing accuracy for the new field(s).
+C
+ INTV(1) = 24
+ IRET = INTOUT('accuracy', INTV, REALV, CHARV)
+ IF ( IRET.NE.0 ) THEN
+ WRITE(*,*) ' First INTOUT failed.'
+ STOP
+ ENDIF
+C
+C Define the geographical area for the new field(s).
+C
+ REALV(1) = 60.0
+ REALV(2) = -10.0
+ REALV(3) = 40.0
+ REALV(4) = 15.0
+ IRET = INTOUT('area', INTV, REALV, CHARV)
+ IF ( IRET.NE.0 ) THEN
+ WRITE(*,*) ' Second INTOUT failed.'
+ STOP
+ ENDIF
+C
+C Define the grid interval for the new field(s).
+C
+ REALV(1) = 1.5
+ REALV(2) = 1.5
+ IRET = INTOUT('grid', INTV, REALV, CHARV)
+ IF ( IRET.NE.0 ) THEN
+ WRITE(*,*) ' Third INTOUT failed.'
+ STOP
+ ENDIF
+C
+C Open input and output files.
+C
+ CALL PBOPEN(IUNIT1, INFILE, 'r', IRET)
+ IF ( IRET.NE.0 ) STOP ' PBOPEN failed'
+ CALL PBOPEN(IUNIT2, OUTFILE, 'w', IRET)
+ IF ( IRET.NE.0 ) STOP ' PBOPEN failed'
+ IPROD = 0
+C
+C Start of loop through input GRIB-coded fields
+C
+ 200 CONTINUE
+ IPROD = IPROD + 1
+C
+C Read next product.
+C
+ CALL PBGRIB(IUNIT1, INGRIB, JPGRIB*JPBYTES, IREC, IRET)
+ IF ( IRET.EQ.-1 ) GOTO 900
+ IF ( IRET.NE.0 ) STOP ' PBGRIB failed'
+C
+C Interpolate.
+C
+ WRITE(*,*) ' Interpolate product number ', IPROD
+ NEWLEN = JPGRIB
+ INLEN = IREC
+ IRET = INTF2(INGRIB,INLEN,NEWFLD,NEWLEN)
+ IF ( IRET.NE.0 ) THEN
+ WRITE(*,*) ' INTF failed.'
+ STOP
+ ENDIF
+C
+C Write the new product to file.
+C
+ CALL PBWRITE( IUNIT2, NEWFLD, NEWLEN*JPBYTES, IRET)
+ IF ( IRET.LT.(NEWLEN*JPBYTES) ) STOP ' PBWRITE failed'
+C
+C Loop back for next product.
+C
+ GOTO 200
+C
+C Closedown.
+C
+ 900 CONTINUE
+C
+ IPROD = IPROD - 1
+ WRITE(*,*) ' All done after ', IPROD, ' products.'
+C
+C Close input and output files.
+C
+ CALL PBCLOSE(IUNIT1, IRET)
+ CALL PBCLOSE(IUNIT2, IRET)
+C
+ STOP
+ END
diff --git a/examples/interpolation_grib_api/test.sh b/examples/interpolation_grib_api/test.sh
new file mode 100755
index 0000000..e486f33
--- /dev/null
+++ b/examples/interpolation_grib_api/test.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+cd ../../
+path=`pwd`
+
+export HIRLAM_LSM_PATH=$path/land_sea_mask
+ECMWF_LOCAL_TABLE_PATH=$path/gribtables
+export ECMWF_LOCAL_TABLE_PATH
+
+LOCAL_DEFINITION_TEMPLATES=$path/gribtemplates
+export LOCAL_DEFINITION_TEMPLATES
+
+MARS_LSM_PATH=$path/land_sea_mask
+export MARS_LSM_PATH
+
+cd examples/interpolation_grib_api
+
+./interpolation_example -i ../../data/tigge.grib2 -o output.grib
diff --git a/fft/Makefile b/fft/Makefile
new file mode 100755
index 0000000..3067e86
--- /dev/null
+++ b/fft/Makefile
@@ -0,0 +1,30 @@
+#
+# Makefile for libemos/bufrdc
+#
+LIBRARY = ../lib$(LIB)$(R64).a
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+TARGETS = all clean
+#
+include sources
+#
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.f = $(SOURCES.f:.f=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.F) $(OBJECTS.f) $(OBJECTS.c)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+ $(LIBRARY) : $(LIBRARY)($(OBJECTS))
+#$(LIBRARY): $(OBJECTS)
+ #$(AR) $(ARFLAGS) $@ $?
+ #$(RANLIB) $@
+
+clean:
+ \rm -f $(OBJECTS)
diff --git a/fft/Makefile.in b/fft/Makefile.in
new file mode 100755
index 0000000..3ef42e4
--- /dev/null
+++ b/fft/Makefile.in
@@ -0,0 +1,34 @@
+#
+# Makefile for bufrdc
+#
+A64 = plat
+R64 = reals
+ARCH = arch
+LIB = depl
+CNAME = comp
+
+LIBRARY = ../lib$(LIB)$(R64).a
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+TARGETS = all clean
+#
+include sources
+#
+OBJECTS.f = $(SOURCES.f:.f=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.F) $(OBJECTS.f) $(OBJECTS.c)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+$(LIBRARY): $(OBJECTS)
+ $(AR) $(ARFLAGS) $@ $?
+ $(RANLIB) $@
+
+clean:
+ \rm -f $(OBJECTS)
diff --git a/fft/Makefile.shared b/fft/Makefile.shared
new file mode 100755
index 0000000..8581025
--- /dev/null
+++ b/fft/Makefile.shared
@@ -0,0 +1,30 @@
+#
+# Makefile for libemos/bufrdc
+#
+LIBRARY = ../lib$(LIB)$(R64).so
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+PROFILE=$(SHLIB)
+#
+TARGETS = all clean
+#
+include sources
+#
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.f = $(SOURCES.f:.f=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.F) $(OBJECTS.f) $(OBJECTS.c)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+$(LIBRARY): $(OBJECTS) $(EXTRAOBJ)
+ $(LD) $(DYNLINKFLAGS) $? -o $@
+
+clean:
+ \rm -f $(OBJECTS)
diff --git a/fft/fax.f b/fft/fax.f
new file mode 100755
index 0000000..20ecfd4
--- /dev/null
+++ b/fft/fax.f
@@ -0,0 +1,78 @@
+c Copyright 1981-2012 ECMWF.
+c
+c This software is licensed under the terms of the Apache Licence
+c Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+c
+c In applying this licence, ECMWF does not waive the privileges and immunities
+c granted to it by virtue of its status as an intergovernmental organisation
+c nor does it submit to any jurisdiction.
+c
+
+ SUBROUTINE FAX(IFAX,N,MODE)
+ DIMENSION IFAX(10)
+ COMMON /QQQQFFT/ IXXX
+C
+C MARK INITIALISATION AS 'OLD' TYPE
+C
+ IXXX=0
+C
+ NN=N
+ IF (IABS(MODE).EQ.1) GO TO 10
+ IF (IABS(MODE).EQ.8) GO TO 10
+ NN=N/2
+ IF ((NN+NN).EQ.N) GO TO 10
+ IFAX(1)=-99
+ RETURN
+ 10 K=1
+C TEST FOR FACTORS OF 4
+ 20 IF (MOD(NN,4).NE.0) GO TO 30
+ K=K+1
+ IFAX(K)=4
+ NN=NN/4
+ IF (NN.EQ.1) GO TO 80
+ GO TO 20
+C TEST FOR EXTRA FACTOR OF 2
+ 30 IF (MOD(NN,2).NE.0) GO TO 40
+ K=K+1
+ IFAX(K)=2
+ NN=NN/2
+ IF (NN.EQ.1) GO TO 80
+C TEST FOR FACTORS OF 3
+ 40 IF (MOD(NN,3).NE.0) GO TO 50
+ K=K+1
+ IFAX(K)=3
+ NN=NN/3
+ IF (NN.EQ.1) GO TO 80
+ GO TO 40
+C NOW FIND REMAINING FACTORS
+ 50 L=5
+ INC=2
+C INC ALTERNATELY TAKES ON VALUES 2 AND 4
+ 60 IF (MOD(NN,L).NE.0) GO TO 70
+ K=K+1
+ IFAX(K)=L
+ NN=NN/L
+ IF (NN.EQ.1) GO TO 80
+ GO TO 60
+ 70 L=L+INC
+ INC=6-INC
+ GO TO 60
+ 80 IFAX(1)=K-1
+C IFAX(1) CONTAINS NUMBER OF FACTORS
+C IFAX(1) CONTAINS NUMBER OF FACTORS
+ NFAX=IFAX(1)
+C SORT FACTORS INTO ASCENDING ORDER
+ IF (NFAX.EQ.1) GO TO 110
+ DO 100 II=2,NFAX
+ ISTOP=NFAX+2-II
+ DO 90 I=2,ISTOP
+ IF (IFAX(I+1).GE.IFAX(I)) GO TO 90
+ ITEM=IFAX(I)
+ IFAX(I)=IFAX(I+1)
+ IFAX(I+1)=ITEM
+ 90 CONTINUE
+ 100 CONTINUE
+ 110 CONTINUE
+ IFAX(10)=0
+ RETURN
+ END
diff --git a/fft/fft99.f b/fft/fft99.f
new file mode 100755
index 0000000..081c0a4
--- /dev/null
+++ b/fft/fft99.f
@@ -0,0 +1,218 @@
+c Copyright 1981-2012 ECMWF.
+c
+c This software is licensed under the terms of the Apache Licence
+c Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+c
+c In applying this licence, ECMWF does not waive the privileges and immunities
+c granted to it by virtue of its status as an intergovernmental organisation
+c nor does it submit to any jurisdiction.
+c
+
+ SUBROUTINE FFT99(A,WORK,TRIGS,IFAX,INC,JUMP,N,LOT,ISIGN)
+ DIMENSION A(N),WORK(N),TRIGS(N),IFAX(*)
+C
+C SUBROUTINE 'FFT99' - MULTIPLE FAST REAL PERIODIC TRANSFORM
+C SUPERSEDES PREVIOUS ROUTINE 'FFT99'
+C
+C REAL TRANSFORM OF LENGTH N PERFORMED BY REMOVING REDUNDANT
+C OPERATIONS FROM COMPLEX TRANSFORM OF LENGTH N
+C
+C A IS THE ARRAY CONTAINING INPUT & OUTPUT DATA
+C WORK IS AN AREA OF SIZE (N+1)*MIN(LOT,64)
+C TRIGS IS A PREVIOUSLY PREPARED LIST OF TRIG FUNCTION VALUES
+C IFAX IS A PREVIOUSLY PREPARED LIST OF FACTORS OF N
+C INC IS THE INCREMENT WITHIN EACH DATA 'VECTOR'
+C (E.G. INC=1 FOR CONSECUTIVELY STORED DATA)
+C JUMP IS THE INCREMENT BETWEEN THE START OF EACH DATA VECTOR
+C N IS THE LENGTH OF THE DATA VECTORS
+C LOT IS THE NUMBER OF DATA VECTORS
+C ISIGN = +1 FOR TRANSFORM FROM SPECTRAL TO GRIDPOINT
+C = -1 FOR TRANSFORM FROM GRIDPOINT TO SPECTRAL
+C
+C ORDERING OF COEFFICIENTS:
+C A(0),B(0),A(1),B(1),A(2),B(2),...,A(N/2),B(N/2)
+C WHERE B(0)=B(N/2)=0; (N+2) LOCATIONS REQUIRED
+C
+C ORDERING OF DATA:
+C X(N-1),X(0),X(1),X(2),...,X(N-1),X(0)
+C I.E. EXPLICIT CYCLIC CONTINUITY; (N+2) LOCATIONS REQUIRED
+C
+C VECTORIZATION IS ACHIEVED ON CRAY BY DOING THE TRANSFORMS
+C IN PARALLEL
+C
+C N MUST BE COMPOSED OF FACTORS 2,3 & 5 BUT DOES NOT HAVE TO BE EVEN
+C
+C DEFINITION OF TRANSFORMS:
+C -------------------------
+C
+C ISIGN=+1: X(J)=SUM(K=0,...,N-1)(C(K)*EXP(2*I*J*K*PI/N))
+C WHERE C(K)=A(K)+I*B(K) AND C(N-K)=A(K)-I*B(K)
+C
+C ISIGN=-1: A(K)=(1/N)*SUM(J=0,...,N-1)(X(J)*COS(2*J*K*PI/N))
+C B(K)=-(1/N)*SUM(J=0,...,N-1)(X(J)*SIN(2*J*K*PI/N))
+C
+ IF(IFAX(10).NE.N) CALL SET99(TRIGS,IFAX,N)
+ NFAX=IFAX(1)
+ NX=N+1
+ IF (MOD(N,2).EQ.1) NX=N
+ NBLOX=1+(LOT-1)/64
+ NVEX=LOT-(NBLOX-1)*64
+ IF (ISIGN.EQ.-1) GO TO 300
+C
+C ISIGN=+1, SPECTRAL TO GRIDPOINT TRANSFORM
+C -----------------------------------------
+ 100 CONTINUE
+ ISTART=1
+ DO 220 NB=1,NBLOX
+ IA=ISTART
+ I=ISTART
+ DO 110 J=1,NVEX
+ A(I+INC)=0.5*A(I)
+ I=I+JUMP
+ 110 CONTINUE
+ IF (MOD(N,2).EQ.1) GO TO 130
+ I=ISTART+N*INC
+ DO 120 J=1,NVEX
+ A(I)=0.5*A(I)
+ I=I+JUMP
+ 120 CONTINUE
+ 130 CONTINUE
+ IA=ISTART+INC
+ LA=1
+ IGO=+1
+C
+ DO 160 K=1,NFAX
+ IFAC=IFAX(K+1)
+ IERR=-1
+ IF (IGO.EQ.-1) GO TO 140
+ CALL RPASSM(A(IA),A(IA+LA*INC),WORK(1),WORK(IFAC*LA+1),TRIGS,
+ * INC,1,JUMP,NX,NVEX,N,IFAC,LA,IERR)
+ GO TO 150
+ 140 CONTINUE
+ CALL RPASSM(WORK(1),WORK(LA+1),A(IA),A(IA+IFAC*LA*INC),TRIGS,
+ * 1,INC,NX,JUMP,NVEX,N,IFAC,LA,IERR)
+ 150 CONTINUE
+ IF (IERR.NE.0) GO TO 500
+ LA=IFAC*LA
+ IGO=-IGO
+ IA=ISTART+INC
+ 160 CONTINUE
+C
+C IF NECESSARY, COPY RESULTS BACK TO A
+C ------------------------------------
+ IF (MOD(NFAX,2).EQ.0) GO TO 190
+ IBASE=1
+ JBASE=IA
+ DO 180 JJ=1,NVEX
+ I=IBASE
+ J=JBASE
+ DO 170 II=1,N
+ A(J)=WORK(I)
+ I=I+1
+ J=J+INC
+ 170 CONTINUE
+ IBASE=IBASE+NX
+ JBASE=JBASE+JUMP
+ 180 CONTINUE
+ 190 CONTINUE
+C
+C FILL IN CYCLIC BOUNDARY VALUES
+C ------------------------------
+ IX=ISTART
+ IZ=ISTART+N*INC
+CDIR$ IVDEP
+ DO 200 J=1,NVEX
+ A(IX)=A(IZ)
+ A(IZ+INC)=A(IX+INC)
+ IX=IX+JUMP
+ IZ=IZ+JUMP
+ 200 CONTINUE
+C
+ ISTART=ISTART+NVEX*JUMP
+ NVEX=64
+ 220 CONTINUE
+ RETURN
+C
+C ISIGN=-1, GRIDPOINT TO SPECTRAL TRANSFORM
+C -----------------------------------------
+ 300 CONTINUE
+ ISTART=1
+ DO 410 NB=1,NBLOX
+ IA=ISTART+INC
+ LA=N
+ IGO=+1
+C
+ DO 340 K=1,NFAX
+ IFAC=IFAX(NFAX+2-K)
+ LA=LA/IFAC
+ IERR=-1
+ IF (IGO.EQ.-1) GO TO 320
+ CALL QPASSM(A(IA),A(IA+IFAC*LA*INC),WORK(1),WORK(LA+1),TRIGS,
+ * INC,1,JUMP,NX,NVEX,N,IFAC,LA,IERR)
+ GO TO 330
+ 320 CONTINUE
+ CALL QPASSM(WORK(1),WORK(IFAC*LA+1),A(IA),A(IA+LA*INC),TRIGS,
+ * 1,INC,NX,JUMP,NVEX,N,IFAC,LA,IERR)
+ 330 CONTINUE
+ IF (IERR.NE.0) GO TO 500
+ IGO=-IGO
+ IA=ISTART+INC
+ 340 CONTINUE
+C
+C IF NECESSARY, COPY RESULTS BACK TO A
+C ------------------------------------
+ IF (MOD(NFAX,2).EQ.0) GO TO 370
+ IBASE=1
+ JBASE=IA
+ DO 360 JJ=1,NVEX
+ I=IBASE
+ J=JBASE
+ DO 350 II=1,N
+ A(J)=WORK(I)
+ I=I+1
+ J=J+INC
+ 350 CONTINUE
+ IBASE=IBASE+NX
+ JBASE=JBASE+JUMP
+ 360 CONTINUE
+ 370 CONTINUE
+C
+C SHIFT A(0) & FILL IN ZERO IMAG PARTS
+C ------------------------------------
+ IX=ISTART
+ DO 380 J=1,NVEX
+ A(IX)=A(IX+INC)
+ A(IX+INC)=0.0
+ IX=IX+JUMP
+ 380 CONTINUE
+ IF (MOD(N,2).EQ.1) GO TO 400
+ IZ=ISTART+(N+1)*INC
+ DO 390 J=1,NVEX
+ A(IZ)=0.0
+ IZ=IZ+JUMP
+ 390 CONTINUE
+ 400 CONTINUE
+C
+ ISTART=ISTART+NVEX*JUMP
+ NVEX=64
+ 410 CONTINUE
+ RETURN
+C
+C ERROR MESSAGES
+C --------------
+ 500 CONTINUE
+ GO TO (510,530,550) IERR
+ 510 CONTINUE
+ WRITE(6,520) NVEX
+ 520 FORMAT('1VECTOR LENGTH =',I4,', GREATER THAN 64')
+ GO TO 570
+ 530 CONTINUE
+ WRITE(6,540) IFAC
+ 540 FORMAT( '1FACTOR =',I3,', NOT CATERED FOR')
+ GO TO 570
+ 550 CONTINUE
+ WRITE(6,560) IFAC
+ 560 FORMAT('1FACTOR =',I3,', ONLY CATERED FOR IF LA*IFAC=N')
+ 570 CONTINUE
+ RETURN
+ END
diff --git a/fft/fft991.f b/fft/fft991.f
new file mode 100755
index 0000000..073f333
--- /dev/null
+++ b/fft/fft991.f
@@ -0,0 +1,218 @@
+c Copyright 1981-2012 ECMWF.
+c
+c This software is licensed under the terms of the Apache Licence
+c Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+c
+c In applying this licence, ECMWF does not waive the privileges and immunities
+c granted to it by virtue of its status as an intergovernmental organisation
+c nor does it submit to any jurisdiction.
+c
+
+ SUBROUTINE FFT991(A,WORK,TRIGS,IFAX,INC,JUMP,N,ILOT,ISIGN)
+ REAL A(*),WORK(*),
+ * TRIGS(*)
+ INTEGER IFAX(*)
+C
+C SUBROUTINE 'FFT991' - MULTIPLE FAST REAL PERIODIC TRANSFORM
+C SUPERSEDES PREVIOUS ROUTINE 'FFT991'
+C
+C REAL TRANSFORM OF LENGTH N PERFORMED BY REMOVING REDUNDANT
+C OPERATIONS FROM COMPLEX TRANSFORM OF LENGTH N
+C
+C A IS THE ARRAY CONTAINING INPUT & OUTPUT DATA
+C WORK IS AN AREA OF SIZE (N+1)*MIN(ILOT,JP_LOT)
+C TRIGS IS A PREVIOUSLY PREPARED LIST OF TRIG FUNCTION VALUES
+C IFAX IS A PREVIOUSLY PREPARED LIST OF FACTORS OF N
+C INC IS THE INCREMENT WITHIN EACH DATA 'VECTOR'
+C (E.G. INC=1 FOR CONSECUTIVELY STORED DATA)
+C JUMP IS THE INCREMENT BETWEEN THE START OF EACH DATA VECTOR
+C N IS THE LENGTH OF THE DATA VECTORS
+C ILOT IS THE NUMBER OF DATA VECTORS
+C ISIGN = +1 FOR TRANSFORM FROM SPECTRAL TO GRIDPOINT
+C = -1 FOR TRANSFORM FROM GRIDPOINT TO SPECTRAL
+C
+C ORDERING OF COEFFICIENTS:
+C A(0),B(0),A(1),B(1),A(2),B(2),...,A(N/2),B(N/2)
+C WHERE B(0)=B(N/2)=0; (N+2) LOCATIONS REQUIRED
+C
+C ORDERING OF DATA:
+C X(0),X(1),X(2),...,X(N-1), 0 , 0 ; (N+2) LOCATIONS REQUIRED
+C
+C VECTORIZATION IS ACHIEVED ON CRAY BY DOING THE TRANSFORMS
+C IN PARALLEL
+C
+C N MUST BE COMPOSED OF FACTORS 2,3 & 5 BUT DOES NOT HAVE TO BE EVEN
+C
+C DEFINITION OF TRANSFORMS:
+C -------------------------
+C
+C ISIGN=+1: X(J)=SUM(K=0,...,N-1)(C(K)*EXP(2*I*J*K*PI/N))
+C WHERE C(K)=A(K)+I*B(K) AND C(N-K)=A(K)-I*B(K)
+C
+C ISIGN=-1: A(K)=(1/N)*SUM(J=0,...,N-1)(X(J)*COS(2*J*K*PI/N))
+C B(K)=-(1/N)*SUM(J=0,...,N-1)(X(J)*SIN(2*J*K*PI/N))
+C
+ IF(IFAX(10).NE.N) CALL SET99(TRIGS,IFAX,N)
+ NFAX=IFAX(1)
+ NX=N+1
+ IF (MOD(N,2).EQ.1) NX=N
+cfse NBLOX=1+(ILOT-1)/64
+cfse NVEX=ILOT-(NBLOX-1)*64
+ NBLOX=1+(ILOT-1)/512
+ NVEX=ILOT-(NBLOX-1)*512
+ IF (ISIGN.EQ.-1) GO TO 300
+C
+C ISIGN=+1, SPECTRAL TO GRIDPOINT TRANSFORM
+C -----------------------------------------
+ 100 CONTINUE
+ ISTART=1
+ DO 220 NB=1,NBLOX
+ IA=ISTART
+ I=ISTART
+*vocl loop,novrec
+ DO 110 J=1,NVEX
+ A(I+INC)=0.5*A(I)
+ I=I+JUMP
+ 110 CONTINUE
+ IF (MOD(N,2).EQ.1) GO TO 130
+ I=ISTART+N*INC
+*vocl loop,novrec
+ DO 120 J=1,NVEX
+ A(I)=0.5*A(I)
+ I=I+JUMP
+ 120 CONTINUE
+ 130 CONTINUE
+ IA=ISTART+INC
+ ILA=1
+ IGO=+1
+C
+ DO 160 K=1,NFAX
+ IFAC=IFAX(K+1)
+ IERR=-1
+ IF (IGO.EQ.-1) GO TO 140
+ CALL RPASSM(A(IA),A(IA+ILA*INC),WORK(1),WORK(IFAC*ILA+1),TRIGS,
+ * INC,1,JUMP,NX,NVEX,N,IFAC,ILA,IERR)
+ GO TO 150
+ 140 CONTINUE
+ CALL RPASSM(WORK(1),WORK(ILA+1),A(IA),A(IA+IFAC*ILA*INC),TRIGS,
+ * 1,INC,NX,JUMP,NVEX,N,IFAC,ILA,IERR)
+ 150 CONTINUE
+ IF (IERR.NE.0) GO TO 500
+ ILA=IFAC*ILA
+ IGO=-IGO
+ IA=ISTART
+ 160 CONTINUE
+C
+C IF NECESSARY, COPY RESULTS BACK TO A
+C ------------------------------------
+ IF (MOD(NFAX,2).EQ.0) GO TO 190
+ IBASE=1
+ JBASE=IA
+ DO 180 JJ=1,NVEX
+ I=IBASE
+ J=JBASE
+ DO 170 II=1,N
+ A(J)=WORK(I)
+ I=I+1
+ J=J+INC
+ 170 CONTINUE
+ IBASE=IBASE+NX
+ JBASE=JBASE+JUMP
+ 180 CONTINUE
+ 190 CONTINUE
+C
+C FILL IN ZEROS AT END
+C --------------------
+ IX=ISTART+N*INC
+*vocl loop,novrec
+ DO 210 J=1,NVEX
+ A(IX)=0.0
+ A(IX+INC)=0.0
+ IX=IX+JUMP
+ 210 CONTINUE
+C
+ ISTART=ISTART+NVEX*JUMP
+cfse NVEX=64
+ NVEX=512
+ 220 CONTINUE
+ RETURN
+C
+C ISIGN=-1, GRIDPOINT TO SPECTRAL TRANSFORM
+C -----------------------------------------
+ 300 CONTINUE
+ ISTART=1
+ DO 410 NB=1,NBLOX
+ IA=ISTART
+ ILA=N
+ IGO=+1
+C
+ DO 340 K=1,NFAX
+ IFAC=IFAX(NFAX+2-K)
+ ILA=ILA/IFAC
+ IERR=-1
+ IF (IGO.EQ.-1) GO TO 320
+ CALL QPASSM(A(IA),A(IA+IFAC*ILA*INC),WORK(1),WORK(ILA+1),TRIGS,
+ * INC,1,JUMP,NX,NVEX,N,IFAC,ILA,IERR)
+ GO TO 330
+ 320 CONTINUE
+ CALL QPASSM(WORK(1),WORK(IFAC*ILA+1),A(IA),A(IA+ILA*INC),TRIGS,
+ * 1,INC,NX,JUMP,NVEX,N,IFAC,ILA,IERR)
+ 330 CONTINUE
+ IF (IERR.NE.0) GO TO 500
+ IGO=-IGO
+ IA=ISTART+INC
+ 340 CONTINUE
+C
+C IF NECESSARY, COPY RESULTS BACK TO A
+C ------------------------------------
+ IF (MOD(NFAX,2).EQ.0) GO TO 370
+ IBASE=1
+ JBASE=IA
+ DO 360 JJ=1,NVEX
+ I=IBASE
+ J=JBASE
+ DO 350 II=1,N
+ A(J)=WORK(I)
+ I=I+1
+ J=J+INC
+ 350 CONTINUE
+ IBASE=IBASE+NX
+ JBASE=JBASE+JUMP
+ 360 CONTINUE
+ 370 CONTINUE
+C
+C SHIFT A(0) & FILL IN ZERO IMAG PARTS
+C ------------------------------------
+ IX=ISTART
+ DO 380 J=1,NVEX
+ A(IX)=A(IX+INC)
+ A(IX+INC)=0.0
+ IX=IX+JUMP
+ 380 CONTINUE
+ IF (MOD(N,2).EQ.1) GO TO 400
+ IZ=ISTART+(N+1)*INC
+ DO 390 J=1,NVEX
+ A(IZ)=0.0
+ IZ=IZ+JUMP
+ 390 CONTINUE
+ 400 CONTINUE
+C
+ ISTART=ISTART+NVEX*JUMP
+cfse NVEX=64
+ NVEX=512
+ 410 CONTINUE
+ RETURN
+C
+C ERROR MESSAGES
+C --------------
+ 500 CONTINUE
+ IF(IERR.EQ.1) THEN
+ 520 FORMAT('VECTOR LENGTH =',I4,', GREATER THAN 64')
+ ELSEIF(IERR.EQ.2) THEN
+ WRITE(6,540) IFAC
+ 540 FORMAT( 'FACTOR =',I3,', NOT CATERED FOR')
+ ELSE
+ WRITE(6,560) IFAC
+ 560 FORMAT('FACTOR =',I3,', ONLY CATERED FOR IF ILA*IFAC=N')
+ ENDIF
+ END
diff --git a/fft/fftrig.f b/fft/fftrig.f
new file mode 100755
index 0000000..3349fa9
--- /dev/null
+++ b/fft/fftrig.f
@@ -0,0 +1,57 @@
+c Copyright 1981-2012 ECMWF.
+c
+c This software is licensed under the terms of the Apache Licence
+c Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+c
+c In applying this licence, ECMWF does not waive the privileges and immunities
+c granted to it by virtue of its status as an intergovernmental organisation
+c nor does it submit to any jurisdiction.
+c
+
+ SUBROUTINE FFTRIG(TRIGS,N,MODE)
+ DIMENSION TRIGS(N)
+ COMMON /QQQQFFT/ IXXX
+C
+C MARK INITIALISATION AS 'OLD' TYPE
+C
+ IXXX=0
+C
+ PI=2.0*ASIN(1.0)
+ IMODE=IABS(MODE)
+ NN=N
+ IF (IMODE.GT.1.AND.IMODE.LT.6) NN=N/2
+ DEL=(PI+PI)/FLOAT(NN)
+ L=NN+NN
+ DO 10 I=1,L,2
+ ANGLE=0.5*FLOAT(I-1)*DEL
+ TRIGS(I)=COS(ANGLE)
+ TRIGS(I+1)=SIN(ANGLE)
+ 10 CONTINUE
+ IF (IMODE.EQ.1) RETURN
+ IF (IMODE.EQ.8) RETURN
+ DEL=0.5*DEL
+ NH=(NN+1)/2
+ L=NH+NH
+ LA=NN+NN
+ DO 20 I=1,L,2
+ ANGLE=0.5*FLOAT(I-1)*DEL
+ TRIGS(LA+I)=COS(ANGLE)
+ TRIGS(LA+I+1)=SIN(ANGLE)
+ 20 CONTINUE
+ IF (IMODE.LE.3) RETURN
+ DEL=0.5*DEL
+ LA=LA+NN
+ IF (MODE.EQ.5) GO TO 40
+ DO 30 I=2,NN
+ ANGLE=FLOAT(I-1)*DEL
+ TRIGS(LA+I)=2.0*SIN(ANGLE)
+ 30 CONTINUE
+ RETURN
+ 40 CONTINUE
+ DEL=0.5*DEL
+ DO 50 I=2,N
+ ANGLE=FLOAT(I-1)*DEL
+ TRIGS(LA+I)=SIN(ANGLE)
+ 50 CONTINUE
+ RETURN
+ END
diff --git a/fft/gpfa.f b/fft/gpfa.f
new file mode 100755
index 0000000..df52ff8
--- /dev/null
+++ b/fft/gpfa.f
@@ -0,0 +1,98 @@
+c Copyright 1981-2012 ECMWF.
+c
+c This software is licensed under the terms of the Apache Licence
+c Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+c
+c In applying this licence, ECMWF does not waive the privileges and immunities
+c granted to it by virtue of its status as an intergovernmental organisation
+c nor does it submit to any jurisdiction.
+c
+
+ SUBROUTINE GPFA(A,B,TRIGS,INC,JUMP,N,LOT,ISIGN)
+*
+* SUBROUTINE 'GPFA'
+* SELF-SORTING IN-PLACE GENERALIZED PRIME FACTOR (COMPLEX) FFT
+*
+* CALL GPFA(A,B,TRIGS,INC,JUMP,N,LOT,ISIGN)
+*
+* A IS FIRST REAL INPUT/OUTPUT VECTOR
+* B IS FIRST IMAGINARY INPUT/OUTPUT VECTOR
+* TRIGS IS A TABLE OF TWIDDLE FACTORS, PRECALCULATED
+* BY CALLING SUBROUTINE 'SETGPFA'
+* INC IS THE INCREMENT WITHIN EACH DATA VECTOR
+* JUMP IS THE INCREMENT BETWEEN DATA VECTORS
+* N IS THE LENGTH OF THE TRANSFORMS:
+* -----------------------------------
+* N = (2**IP) * (3**IQ) * (5**IR)
+* -----------------------------------
+* LOT IS THE NUMBER OF TRANSFORMS
+* ISIGN = +1 FOR FORWARD TRANSFORM
+* = -1 FOR INVERSE TRANSFORM
+*
+* WRITTEN BY CLIVE TEMPERTON ECMWF 1990
+*
+*----------------------------------------------------------------------
+*
+* DEFINITION OF TRANSFORM
+* -----------------------
+*
+* X(J) = SUM(K=0,...,N-1)(C(K)*EXP(ISIGN*2*I*J*K*PI/N))
+*
+*---------------------------------------------------------------------
+*
+* FOR A MATHEMATICAL DEVELOPMENT OF THE ALGORITHM USED,
+* SEE:
+*
+* C TEMPERTON : "A GENERALIZED PRIME FACTOR FFT ALGORITHM
+* FOR ANY N = (2**P)(3**Q)(5**R)",
+* SIAM J. SCI. STAT. COMP., MAY 1992.
+*
+*----------------------------------------------------------------------
+*
+ DIMENSION A(*), B(*), TRIGS(*)
+ DIMENSION NJ(3)
+*
+* DECOMPOSE N INTO FACTORS 2,3,5
+* ------------------------------
+ NN = N
+ IFAC = 2
+*
+ DO 30 LL = 1 , 3
+ KK = 0
+ 10 CONTINUE
+ IF (MOD(NN,IFAC).NE.0) GO TO 20
+ KK = KK + 1
+ NN = NN / IFAC
+ GO TO 10
+ 20 CONTINUE
+ NJ(LL) = KK
+ IFAC = IFAC + LL
+ 30 CONTINUE
+*
+ IF (NN.NE.1) THEN
+ WRITE(6,40) N
+ 40 FORMAT(' *** WARNING!!!',I10,' IS NOT A LEGAL VALUE OF N ***')
+ RETURN
+ ENDIF
+*
+ IP = NJ(1)
+ IQ = NJ(2)
+ IR = NJ(3)
+*
+* COMPUTE THE TRANSFORM
+* ---------------------
+ I = 1
+ IF (IP.GT.0) THEN
+ CALL GPFA2(A,B,TRIGS,INC,JUMP,N,IP,LOT,ISIGN)
+ I = I + 2 * ( 2**IP)
+ ENDIF
+ IF (IQ.GT.0) THEN
+ CALL GPFA3(A,B,TRIGS(I),INC,JUMP,N,IQ,LOT,ISIGN)
+ I = I + 2 * (3**IQ)
+ ENDIF
+ IF (IR.GT.0) THEN
+ CALL GPFA5(A,B,TRIGS(I),INC,JUMP,N,IR,LOT,ISIGN)
+ ENDIF
+*
+ RETURN
+ END
diff --git a/fft/gpfa2.F b/fft/gpfa2.F
new file mode 100755
index 0000000..e621d9c
--- /dev/null
+++ b/fft/gpfa2.F
@@ -0,0 +1,834 @@
+ subroutine gpfa2(a,b,trigs,inc,jump,n,mm,lot,isign)
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+* fortran version of *gpfa2* -
+* radix-2 section of self-sorting, in-place, generalized pfa
+* central radix-2 and radix-8 passes included
+* so that transform length can be any power of 2
+*
+*-------------------------------------------------------------------
+*
+ dimension a(*), b(*), trigs(*)
+ data lvr/128/
+*
+* ***************************************************************
+* * *
+* * N.B. LVR = LENGTH OF VECTOR REGISTERS, SET TO 128 FOR C90. *
+* * RESET TO 64 FOR OTHER CRAY MACHINES, OR TO ANY LARGE VALUE *
+* * (GREATER THAN OR EQUAL TO LOT) FOR A SCALAR COMPUTER. *
+* * *
+* ***************************************************************
+*
+ n2 = 2**mm
+ inq = n/n2
+ jstepx = (n2-n) * inc
+ ninc = n * inc
+ ink = inc * inq
+*
+ m2 = 0
+ m8 = 0
+ if (mod(mm,2).eq.0) then
+ m = mm/2
+ else if (mod(mm,4).eq.1) then
+ m = (mm-1)/2
+ m2 = 1
+ else if (mod(mm,4).eq.3) then
+ m = (mm-3)/2
+ m8 = 1
+ endif
+ mh = (m+1)/2
+*
+ nblox = 1 + (lot-1)/lvr
+ left = lot
+ s = float(isign)
+ istart = 1
+*
+* loop on blocks of lvr transforms
+* --------------------------------
+ do 500 nb = 1 , nblox
+*
+ if (left.le.lvr) then
+ nvex = left
+ else if (left.lt.(2*lvr)) then
+ nvex = left/2
+ nvex = nvex + mod(nvex,2)
+ else
+ nvex = lvr
+ endif
+ left = left - nvex
+*
+ la = 1
+*
+* loop on type I radix-4 passes
+* -----------------------------
+ mu = mod(inq,4)
+ if (isign.eq.-1) mu = 4 - mu
+ ss = 1.0
+ if (mu.eq.3) ss = -1.0
+*
+ if (mh.eq.0) go to 200
+*
+ do 160 ipass = 1 , mh
+ jstep = (n*inc) / (4*la)
+ jstepl = jstep - ninc
+*
+* k = 0 loop (no twiddle factors)
+* -------------------------------
+ do 120 jjj = 0 , (n-1)*inc , 4*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 115 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = jc + jstepl
+ if (jd.lt.istart) jd = jd + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+cdir$ ivdep,shortloop
+ do 110 l = 1 , nvex
+ t0 = a(ja+j) + a(jc+j)
+ t2 = a(ja+j) - a(jc+j)
+ t1 = a(jb+j) + a(jd+j)
+ t3 = ss * ( a(jb+j) - a(jd+j) )
+ u0 = b(ja+j) + b(jc+j)
+ u2 = b(ja+j) - b(jc+j)
+ u1 = b(jb+j) + b(jd+j)
+ u3 = ss * ( b(jb+j) - b(jd+j) )
+ a(ja+j) = t0 + t1
+ a(jc+j) = t0 - t1
+ b(ja+j) = u0 + u1
+ b(jc+j) = u0 - u1
+ a(jb+j) = t2 - u3
+ a(jd+j) = t2 + u3
+ b(jb+j) = u2 + t3
+ b(jd+j) = u2 - t3
+ j = j + jump
+ 110 continue
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 115 continue
+ 120 continue
+*
+* finished if n2 = 4
+* ------------------
+ if (n2.eq.4) go to 490
+ kk = 2 * la
+*
+* loop on nonzero k
+* -----------------
+ do 150 k = ink , jstep-ink , ink
+ co1 = trigs(kk+1)
+ si1 = s*trigs(kk+2)
+ co2 = trigs(2*kk+1)
+ si2 = s*trigs(2*kk+2)
+ co3 = trigs(3*kk+1)
+ si3 = s*trigs(3*kk+2)
+*
+* loop along transform
+* --------------------
+ do 140 jjj = k , (n-1)*inc , 4*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 135 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = jc + jstepl
+ if (jd.lt.istart) jd = jd + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+cdir$ ivdep,shortloop
+ do 130 l = 1 , nvex
+ t0 = a(ja+j) + a(jc+j)
+ t2 = a(ja+j) - a(jc+j)
+ t1 = a(jb+j) + a(jd+j)
+ t3 = ss * ( a(jb+j) - a(jd+j ) )
+ u0 = b(ja+j) + b(jc+j)
+ u2 = b(ja+j) - b(jc+j)
+ u1 = b(jb+j) + b(jd+j)
+ u3 = ss * ( b(jb+j) - b(jd+j) )
+ a(ja+j) = t0 + t1
+ b(ja+j) = u0 + u1
+ a(jb+j) = co1*(t2-u3) - si1*(u2+t3)
+ b(jb+j) = si1*(t2-u3) + co1*(u2+t3)
+ a(jc+j) = co2*(t0-t1) - si2*(u0-u1)
+ b(jc+j) = si2*(t0-t1) + co2*(u0-u1)
+ a(jd+j) = co3*(t2+u3) - si3*(u2-t3)
+ b(jd+j) = si3*(t2+u3) + co3*(u2-t3)
+ j = j + jump
+ 130 continue
+*-----( end of loop across transforms )
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 135 continue
+ 140 continue
+*-----( end of loop along transforms )
+ kk = kk + 2*la
+ 150 continue
+*-----( end of loop on nonzero k )
+ la = 4*la
+ 160 continue
+*-----( end of loop on type I radix-4 passes)
+*
+* central radix-2 pass
+* --------------------
+ 200 continue
+ if (m2.eq.0) go to 300
+*
+ jstep = (n*inc) / (2*la)
+ jstepl = jstep - ninc
+*
+* k=0 loop (no twiddle factors)
+* -----------------------------
+ do 220 jjj = 0 , (n-1)*inc , 2*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 215 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+cdir$ ivdep,shortloop
+ do 210 l = 1 , nvex
+ t0 = a(ja+j) - a(jb+j)
+ a(ja+j) = a(ja+j) + a(jb+j)
+ a(jb+j) = t0
+ u0 = b(ja+j) - b(jb+j)
+ b(ja+j) = b(ja+j) + b(jb+j)
+ b(jb+j) = u0
+ j = j + jump
+ 210 continue
+*-----(end of loop across transforms)
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 215 continue
+ 220 continue
+*
+* finished if n2=2
+* ----------------
+ if (n2.eq.2) go to 490
+*
+ kk = 2 * la
+*
+* loop on nonzero k
+* -----------------
+ do 260 k = ink , jstep - ink , ink
+ co1 = trigs(kk+1)
+ si1 = s*trigs(kk+2)
+*
+* loop along transforms
+* ---------------------
+ do 250 jjj = k , (n-1)*inc , 2*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 245 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+ if (kk.eq.n2/2) then
+cdir$ ivdep,shortloop
+ do 230 l = 1 , nvex
+ t0 = ss * ( a(ja+j) - a(jb+j) )
+ a(ja+j) = a(ja+j) + a(jb+j)
+ a(jb+j) = ss * ( b(jb+j) - b(ja+j) )
+ b(ja+j) = b(ja+j) + b(jb+j)
+ b(jb+j) = t0
+ j = j + jump
+ 230 continue
+*
+ else
+*
+cdir$ ivdep,shortloop
+ do 240 l = 1 , nvex
+ t0 = a(ja+j) - a(jb+j)
+ a(ja+j) = a(ja+j) + a(jb+j)
+ u0 = b(ja+j) - b(jb+j)
+ b(ja+j) = b(ja+j) + b(jb+j)
+ a(jb+j) = co1*t0 - si1*u0
+ b(jb+j) = si1*t0 + co1*u0
+ j = j + jump
+ 240 continue
+*
+ endif
+*
+*-----(end of loop across transforms)
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 245 continue
+ 250 continue
+*-----(end of loop along transforms)
+ kk = kk + 2 * la
+ 260 continue
+*-----(end of loop on nonzero k)
+*-----(end of radix-2 pass)
+*
+ la = 2 * la
+ go to 400
+*
+* central radix-8 pass
+* --------------------
+ 300 continue
+ if (m8.eq.0) go to 400
+ jstep = (n*inc) / (8*la)
+ jstepl = jstep - ninc
+ mu = mod(inq,8)
+ if (isign.eq.-1) mu = 8 - mu
+ c1 = 1.0
+ if (mu.eq.3.or.mu.eq.7) c1 = -1.0
+ c2 = sqrt(0.5)
+ if (mu.eq.3.or.mu.eq.5) c2 = -c2
+ c3 = c1 * c2
+*
+* stage 1
+* -------
+ do 320 k = 0 , jstep - ink , ink
+ do 315 jjj = k , (n-1)*inc , 8*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 312 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = jc + jstepl
+ if (jd.lt.istart) jd = jd + ninc
+ je = jd + jstepl
+ if (je.lt.istart) je = je + ninc
+ jf = je + jstepl
+ if (jf.lt.istart) jf = jf + ninc
+ jg = jf + jstepl
+ if (jg.lt.istart) jg = jg + ninc
+ jh = jg + jstepl
+ if (jh.lt.istart) jh = jh + ninc
+ j = 0
+cdir$ ivdep,shortloop
+ do 310 l = 1 , nvex
+ t0 = a(ja+j) - a(je+j)
+ a(ja+j) = a(ja+j) + a(je+j)
+ t1 = c1 * ( a(jc+j) - a(jg+j) )
+ a(je+j) = a(jc+j) + a(jg+j)
+ t2 = a(jb+j) - a(jf+j)
+ a(jc+j) = a(jb+j) + a(jf+j)
+ t3 = a(jd+j) - a(jh+j)
+ a(jg+j) = a(jd+j) + a(jh+j)
+ a(jb+j) = t0
+ a(jf+j) = t1
+ a(jd+j) = c2 * ( t2 - t3 )
+ a(jh+j) = c3 * ( t2 + t3 )
+ u0 = b(ja+j) - b(je+j)
+ b(ja+j) = b(ja+j) + b(je+j)
+ u1 = c1 * ( b(jc+j) - b(jg+j) )
+ b(je+j) = b(jc+j) + b(jg+j)
+ u2 = b(jb+j) - b(jf+j)
+ b(jc+j) = b(jb+j) + b(jf+j)
+ u3 = b(jd+j) - b(jh+j)
+ b(jg+j) = b(jd+j) + b(jh+j)
+ b(jb+j) = u0
+ b(jf+j) = u1
+ b(jd+j) = c2 * ( u2 - u3 )
+ b(jh+j) = c3 * ( u2 + u3 )
+ j = j + jump
+ 310 continue
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 312 continue
+ 315 continue
+ 320 continue
+*
+* stage 2
+* -------
+*
+* k=0 (no twiddle factors)
+* ------------------------
+ do 330 jjj = 0 , (n-1)*inc , 8*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 328 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = jc + jstepl
+ if (jd.lt.istart) jd = jd + ninc
+ je = jd + jstepl
+ if (je.lt.istart) je = je + ninc
+ jf = je + jstepl
+ if (jf.lt.istart) jf = jf + ninc
+ jg = jf + jstepl
+ if (jg.lt.istart) jg = jg + ninc
+ jh = jg + jstepl
+ if (jh.lt.istart) jh = jh + ninc
+ j = 0
+cdir$ ivdep,shortloop
+ do 325 l = 1 , nvex
+ t0 = a(ja+j) + a(je+j)
+ t2 = a(ja+j) - a(je+j)
+ t1 = a(jc+j) + a(jg+j)
+ t3 = c1 * ( a(jc+j) - a(jg+j) )
+ u0 = b(ja+j) + b(je+j)
+ u2 = b(ja+j) - b(je+j)
+ u1 = b(jc+j) + b(jg+j)
+ u3 = c1 * ( b(jc+j) - b(jg+j ) )
+ a(ja+j) = t0 + t1
+ a(je+j) = t0 - t1
+ b(ja+j) = u0 + u1
+ b(je+j) = u0 - u1
+ a(jc+j) = t2 - u3
+ a(jg+j) = t2 + u3
+ b(jc+j) = u2 + t3
+ b(jg+j) = u2 - t3
+ t0 = a(jb+j) + a(jd+j)
+ t2 = a(jb+j) - a(jd+j)
+ t1 = a(jf+j) - a(jh+j)
+ t3 = a(jf+j) + a(jh+j)
+ u0 = b(jb+j) + b(jd+j)
+ u2 = b(jb+j) - b(jd+j)
+ u1 = b(jf+j) - b(jh+j)
+ u3 = b(jf+j) + b(jh+j)
+ a(jb+j) = t0 - u3
+ a(jh+j) = t0 + u3
+ b(jb+j) = u0 + t3
+ b(jh+j) = u0 - t3
+ a(jd+j) = t2 + u1
+ a(jf+j) = t2 - u1
+ b(jd+j) = u2 - t1
+ b(jf+j) = u2 + t1
+ j = j + jump
+ 325 continue
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 328 continue
+ 330 continue
+*
+ if (n2.eq.8) go to 490
+*
+* loop on nonzero k
+* -----------------
+ kk = 2 * la
+*
+ do 350 k = ink , jstep - ink , ink
+*
+ co1 = trigs(kk+1)
+ si1 = s * trigs(kk+2)
+ co2 = trigs(2*kk+1)
+ si2 = s * trigs(2*kk+2)
+ co3 = trigs(3*kk+1)
+ si3 = s * trigs(3*kk+2)
+ co4 = trigs(4*kk+1)
+ si4 = s * trigs(4*kk+2)
+ co5 = trigs(5*kk+1)
+ si5 = s * trigs(5*kk+2)
+ co6 = trigs(6*kk+1)
+ si6 = s * trigs(6*kk+2)
+ co7 = trigs(7*kk+1)
+ si7 = s * trigs(7*kk+2)
+*
+ do 345 jjj = k , (n-1)*inc , 8*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 342 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = jc + jstepl
+ if (jd.lt.istart) jd = jd + ninc
+ je = jd + jstepl
+ if (je.lt.istart) je = je + ninc
+ jf = je + jstepl
+ if (jf.lt.istart) jf = jf + ninc
+ jg = jf + jstepl
+ if (jg.lt.istart) jg = jg + ninc
+ jh = jg + jstepl
+ if (jh.lt.istart) jh = jh + ninc
+ j = 0
+cdir$ ivdep,shortloop
+ do 340 l = 1 , nvex
+ t0 = a(ja+j) + a(je+j)
+ t2 = a(ja+j) - a(je+j)
+ t1 = a(jc+j) + a(jg+j)
+ t3 = c1 * ( a(jc+j) - a(jg+j) )
+ u0 = b(ja+j) + b(je+j)
+ u2 = b(ja+j) - b(je+j)
+ u1 = b(jc+j) + b(jg+j)
+ u3 = c1 * ( b(jc+j) - b(jg+j ) )
+ a(ja+j) = t0 + t1
+ b(ja+j) = u0 + u1
+ a(je+j) = co4*(t0-t1) - si4*(u0-u1)
+ b(je+j) = si4*(t0-t1) + co4*(u0-u1)
+ a(jc+j) = co2*(t2-u3) - si2*(u2+t3)
+ b(jc+j) = si2*(t2-u3) + co2*(u2+t3)
+ a(jg+j) = co6*(t2+u3) - si6*(u2-t3)
+ b(jg+j) = si6*(t2+u3) + co6*(u2-t3)
+ t0 = a(jb+j) + a(jd+j)
+ t2 = a(jb+j) - a(jd+j)
+ t1 = a(jf+j) - a(jh+j)
+ t3 = a(jf+j) + a(jh+j)
+ u0 = b(jb+j) + b(jd+j)
+ u2 = b(jb+j) - b(jd+j)
+ u1 = b(jf+j) - b(jh+j)
+ u3 = b(jf+j) + b(jh+j)
+ a(jb+j) = co1*(t0-u3) - si1*(u0+t3)
+ b(jb+j) = si1*(t0-u3) + co1*(u0+t3)
+ a(jh+j) = co7*(t0+u3) - si7*(u0-t3)
+ b(jh+j) = si7*(t0+u3) + co7*(u0-t3)
+ a(jd+j) = co3*(t2+u1) - si3*(u2-t1)
+ b(jd+j) = si3*(t2+u1) + co3*(u2-t1)
+ a(jf+j) = co5*(t2-u1) - si5*(u2+t1)
+ b(jf+j) = si5*(t2-u1) + co5*(u2+t1)
+ j = j + jump
+ 340 continue
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 342 continue
+ 345 continue
+ kk = kk + 2 * la
+ 350 continue
+*
+ la = 8 * la
+*
+* loop on type II radix-4 passes
+* ------------------------------
+ 400 continue
+ mu = mod(inq,4)
+ if (isign.eq.-1) mu = 4 - mu
+ ss = 1.0
+ if (mu.eq.3) ss = -1.0
+*
+ do 480 ipass = mh+1 , m
+ jstep = (n*inc) / (4*la)
+ jstepl = jstep - ninc
+ laincl = la * ink - ninc
+*
+* k=0 loop (no twiddle factors)
+* -----------------------------
+ do 430 ll = 0 , (la-1)*ink , 4*jstep
+*
+ do 420 jjj = ll , (n-1)*inc , 4*la*ink
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 415 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = jc + jstepl
+ if (jd.lt.istart) jd = jd + ninc
+ je = ja + laincl
+ if (je.lt.istart) je = je + ninc
+ jf = je + jstepl
+ if (jf.lt.istart) jf = jf + ninc
+ jg = jf + jstepl
+ if (jg.lt.istart) jg = jg + ninc
+ jh = jg + jstepl
+ if (jh.lt.istart) jh = jh + ninc
+ ji = je + laincl
+ if (ji.lt.istart) ji = ji + ninc
+ jj = ji + jstepl
+ if (jj.lt.istart) jj = jj + ninc
+ jk = jj + jstepl
+ if (jk.lt.istart) jk = jk + ninc
+ jl = jk + jstepl
+ if (jl.lt.istart) jl = jl + ninc
+ jm = ji + laincl
+ if (jm.lt.istart) jm = jm + ninc
+ jn = jm + jstepl
+ if (jn.lt.istart) jn = jn + ninc
+ jo = jn + jstepl
+ if (jo.lt.istart) jo = jo + ninc
+ jp = jo + jstepl
+ if (jp.lt.istart) jp = jp + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+cdir$ ivdep,shortloop
+ do 410 l = 1 , nvex
+ t0 = a(ja+j) + a(jc+j)
+ t2 = a(ja+j) - a(jc+j)
+ t1 = a(jb+j) + a(jd+j)
+ t3 = ss * ( a(jb+j) - a(jd+j) )
+ a(jc+j) = a(ji+j)
+ u0 = b(ja+j) + b(jc+j)
+ u2 = b(ja+j) - b(jc+j)
+ u1 = b(jb+j) + b(jd+j)
+ u3 = ss * ( b(jb+j) - b(jd+j) )
+ a(jb+j) = a(je+j)
+ a(ja+j) = t0 + t1
+ a(ji+j) = t0 - t1
+ b(ja+j) = u0 + u1
+ b(jc+j) = u0 - u1
+ b(jd+j) = b(jm+j)
+ a(je+j) = t2 - u3
+ a(jd+j) = t2 + u3
+ b(jb+j) = u2 + t3
+ b(jm+j) = u2 - t3
+*----------------------
+ t0 = a(jb+j) + a(jg+j)
+ t2 = a(jb+j) - a(jg+j)
+ t1 = a(jf+j) + a(jh+j)
+ t3 = ss * ( a(jf+j) - a(jh+j) )
+ a(jg+j) = a(jj+j)
+ u0 = b(je+j) + b(jg+j)
+ u2 = b(je+j) - b(jg+j)
+ u1 = b(jf+j) + b(jh+j)
+ u3 = ss * ( b(jf+j) - b(jh+j) )
+ b(je+j) = b(jb+j)
+ a(jb+j) = t0 + t1
+ a(jj+j) = t0 - t1
+ b(jg+j) = b(jj+j)
+ b(jb+j) = u0 + u1
+ b(jj+j) = u0 - u1
+ a(jf+j) = t2 - u3
+ a(jh+j) = t2 + u3
+ b(jf+j) = u2 + t3
+ b(jh+j) = u2 - t3
+*----------------------
+ t0 = a(jc+j) + a(jk+j)
+ t2 = a(jc+j) - a(jk+j)
+ t1 = a(jg+j) + a(jl+j)
+ t3 = ss * ( a(jg+j) - a(jl+j) )
+ u0 = b(ji+j) + b(jk+j)
+ u2 = b(ji+j) - b(jk+j)
+ a(jl+j) = a(jo+j)
+ u1 = b(jg+j) + b(jl+j)
+ u3 = ss * ( b(jg+j) - b(jl+j) )
+ b(ji+j) = b(jc+j)
+ a(jc+j) = t0 + t1
+ a(jk+j) = t0 - t1
+ b(jl+j) = b(jo+j)
+ b(jc+j) = u0 + u1
+ b(jk+j) = u0 - u1
+ a(jg+j) = t2 - u3
+ a(jo+j) = t2 + u3
+ b(jg+j) = u2 + t3
+ b(jo+j) = u2 - t3
+*----------------------
+ t0 = a(jm+j) + a(jl+j)
+ t2 = a(jm+j) - a(jl+j)
+ t1 = a(jn+j) + a(jp+j)
+ t3 = ss * ( a(jn+j) - a(jp+j) )
+ a(jm+j) = a(jd+j)
+ u0 = b(jd+j) + b(jl+j)
+ u2 = b(jd+j) - b(jl+j)
+ u1 = b(jn+j) + b(jp+j)
+ u3 = ss * ( b(jn+j) - b(jp+j) )
+ a(jn+j) = a(jh+j)
+ a(jd+j) = t0 + t1
+ a(jl+j) = t0 - t1
+ b(jd+j) = u0 + u1
+ b(jl+j) = u0 - u1
+ b(jn+j) = b(jh+j)
+ a(jh+j) = t2 - u3
+ a(jp+j) = t2 + u3
+ b(jh+j) = u2 + t3
+ b(jp+j) = u2 - t3
+ j = j + jump
+ 410 continue
+*-----( end of loop across transforms )
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 415 continue
+ 420 continue
+ 430 continue
+*-----( end of double loop for k=0 )
+*
+* finished if last pass
+* ---------------------
+ if (ipass.eq.m) go to 490
+*
+ kk = 2*la
+*
+* loop on nonzero k
+* -----------------
+ do 470 k = ink , jstep-ink , ink
+ co1 = trigs(kk+1)
+ si1 = s*trigs(kk+2)
+ co2 = trigs(2*kk+1)
+ si2 = s*trigs(2*kk+2)
+ co3 = trigs(3*kk+1)
+ si3 = s*trigs(3*kk+2)
+*
+* double loop along first transform in block
+* ------------------------------------------
+ do 460 ll = k , (la-1)*ink , 4*jstep
+*
+ do 450 jjj = ll , (n-1)*inc , 4*la*ink
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 445 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = jc + jstepl
+ if (jd.lt.istart) jd = jd + ninc
+ je = ja + laincl
+ if (je.lt.istart) je = je + ninc
+ jf = je + jstepl
+ if (jf.lt.istart) jf = jf + ninc
+ jg = jf + jstepl
+ if (jg.lt.istart) jg = jg + ninc
+ jh = jg + jstepl
+ if (jh.lt.istart) jh = jh + ninc
+ ji = je + laincl
+ if (ji.lt.istart) ji = ji + ninc
+ jj = ji + jstepl
+ if (jj.lt.istart) jj = jj + ninc
+ jk = jj + jstepl
+ if (jk.lt.istart) jk = jk + ninc
+ jl = jk + jstepl
+ if (jl.lt.istart) jl = jl + ninc
+ jm = ji + laincl
+ if (jm.lt.istart) jm = jm + ninc
+ jn = jm + jstepl
+ if (jn.lt.istart) jn = jn + ninc
+ jo = jn + jstepl
+ if (jo.lt.istart) jo = jo + ninc
+ jp = jo + jstepl
+ if (jp.lt.istart) jp = jp + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+cdir$ ivdep,shortloop
+ do 440 l = 1 , nvex
+ t0 = a(ja+j) + a(jc+j)
+ t2 = a(ja+j) - a(jc+j)
+ t1 = a(jb+j) + a(jd+j)
+ t3 = ss * ( a(jb+j) - a(jd+j) )
+ a(jc+j) = a(ji+j)
+ u0 = b(ja+j) + b(jc+j)
+ u2 = b(ja+j) - b(jc+j)
+ u1 = b(jb+j) + b(jd+j)
+ u3 = ss * ( b(jb+j) - b(jd+j) )
+ a(jb+j) = a(je+j)
+ a(ja+j) = t0 + t1
+ b(ja+j) = u0 + u1
+ a(je+j) = co1*(t2-u3) - si1*(u2+t3)
+ b(jb+j) = si1*(t2-u3) + co1*(u2+t3)
+ b(jd+j) = b(jm+j)
+ a(ji+j) = co2*(t0-t1) - si2*(u0-u1)
+ b(jc+j) = si2*(t0-t1) + co2*(u0-u1)
+ a(jd+j) = co3*(t2+u3) - si3*(u2-t3)
+ b(jm+j) = si3*(t2+u3) + co3*(u2-t3)
+*----------------------------------------
+ t0 = a(jb+j) + a(jg+j)
+ t2 = a(jb+j) - a(jg+j)
+ t1 = a(jf+j) + a(jh+j)
+ t3 = ss * ( a(jf+j) - a(jh+j) )
+ a(jg+j) = a(jj+j)
+ u0 = b(je+j) + b(jg+j)
+ u2 = b(je+j) - b(jg+j)
+ u1 = b(jf+j) + b(jh+j)
+ u3 = ss * ( b(jf+j) - b(jh+j) )
+ b(je+j) = b(jb+j)
+ a(jb+j) = t0 + t1
+ b(jb+j) = u0 + u1
+ b(jg+j) = b(jj+j)
+ a(jf+j) = co1*(t2-u3) - si1*(u2+t3)
+ b(jf+j) = si1*(t2-u3) + co1*(u2+t3)
+ a(jj+j) = co2*(t0-t1) - si2*(u0-u1)
+ b(jj+j) = si2*(t0-t1) + co2*(u0-u1)
+ a(jh+j) = co3*(t2+u3) - si3*(u2-t3)
+ b(jh+j) = si3*(t2+u3) + co3*(u2-t3)
+*----------------------------------------
+ t0 = a(jc+j) + a(jk+j)
+ t2 = a(jc+j) - a(jk+j)
+ t1 = a(jg+j) + a(jl+j)
+ t3 = ss * ( a(jg+j) - a(jl+j) )
+ u0 = b(ji+j) + b(jk+j)
+ u2 = b(ji+j) - b(jk+j)
+ a(jl+j) = a(jo+j)
+ u1 = b(jg+j) + b(jl+j)
+ u3 = ss * ( b(jg+j) - b(jl+j) )
+ b(ji+j) = b(jc+j)
+ a(jc+j) = t0 + t1
+ b(jc+j) = u0 + u1
+ b(jl+j) = b(jo+j)
+ a(jg+j) = co1*(t2-u3) - si1*(u2+t3)
+ b(jg+j) = si1*(t2-u3) + co1*(u2+t3)
+ a(jk+j) = co2*(t0-t1) - si2*(u0-u1)
+ b(jk+j) = si2*(t0-t1) + co2*(u0-u1)
+ a(jo+j) = co3*(t2+u3) - si3*(u2-t3)
+ b(jo+j) = si3*(t2+u3) + co3*(u2-t3)
+*----------------------------------------
+ t0 = a(jm+j) + a(jl+j)
+ t2 = a(jm+j) - a(jl+j)
+ t1 = a(jn+j) + a(jp+j)
+ t3 = ss * ( a(jn+j) - a(jp+j) )
+ a(jm+j) = a(jd+j)
+ u0 = b(jd+j) + b(jl+j)
+ u2 = b(jd+j) - b(jl+j)
+ a(jn+j) = a(jh+j)
+ u1 = b(jn+j) + b(jp+j)
+ u3 = ss * ( b(jn+j) - b(jp+j) )
+ b(jn+j) = b(jh+j)
+ a(jd+j) = t0 + t1
+ b(jd+j) = u0 + u1
+ a(jh+j) = co1*(t2-u3) - si1*(u2+t3)
+ b(jh+j) = si1*(t2-u3) + co1*(u2+t3)
+ a(jl+j) = co2*(t0-t1) - si2*(u0-u1)
+ b(jl+j) = si2*(t0-t1) + co2*(u0-u1)
+ a(jp+j) = co3*(t2+u3) - si3*(u2-t3)
+ b(jp+j) = si3*(t2+u3) + co3*(u2-t3)
+ j = j + jump
+ 440 continue
+*-----(end of loop across transforms)
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 445 continue
+ 450 continue
+ 460 continue
+*-----( end of double loop for this k )
+ kk = kk + 2*la
+ 470 continue
+*-----( end of loop over values of k )
+ la = 4*la
+ 480 continue
+*-----( end of loop on type II radix-4 passes )
+*-----( nvex transforms completed)
+ 490 continue
+ istart = istart + nvex * jump
+ 500 continue
+*-----( end of loop on blocks of transforms )
+*
+ return
+ end
diff --git a/fft/gpfa2.f b/fft/gpfa2.f
new file mode 100755
index 0000000..3804d1b
--- /dev/null
+++ b/fft/gpfa2.f
@@ -0,0 +1,835 @@
+c Copyright 1981-2012 ECMWF.
+c
+c This software is licensed under the terms of the Apache Licence
+c Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+c
+c In applying this licence, ECMWF does not waive the privileges and immunities
+c granted to it by virtue of its status as an intergovernmental organisation
+c nor does it submit to any jurisdiction.
+c
+
+ subroutine gpfa2(a,b,trigs,inc,jump,n,mm,lot,isign)
+* fortran version of *gpfa2* -
+* radix-2 section of self-sorting, in-place, generalized pfa
+* central radix-2 and radix-8 passes included
+* so that transform length can be any power of 2
+*
+*-------------------------------------------------------------------
+*
+ dimension a(*), b(*), trigs(*)
+ data lvr/128/
+*
+* ***************************************************************
+* * *
+* * N.B. LVR = LENGTH OF VECTOR REGISTERS, SET TO 128 FOR C90. *
+* * RESET TO 64 FOR OTHER CRAY MACHINES, OR TO ANY LARGE VALUE *
+* * (GREATER THAN OR EQUAL TO LOT) FOR A SCALAR COMPUTER. *
+* * *
+* ***************************************************************
+*
+ n2 = 2**mm
+ inq = n/n2
+ jstepx = (n2-n) * inc
+ ninc = n * inc
+ ink = inc * inq
+*
+ m2 = 0
+ m8 = 0
+ if (mod(mm,2).eq.0) then
+ m = mm/2
+ else if (mod(mm,4).eq.1) then
+ m = (mm-1)/2
+ m2 = 1
+ else if (mod(mm,4).eq.3) then
+ m = (mm-3)/2
+ m8 = 1
+ endif
+ mh = (m+1)/2
+*
+ nblox = 1 + (lot-1)/lvr
+ left = lot
+ s = float(isign)
+ istart = 1
+*
+* loop on blocks of lvr transforms
+* --------------------------------
+ do 500 nb = 1 , nblox
+*
+ if (left.le.lvr) then
+ nvex = left
+ else if (left.lt.(2*lvr)) then
+ nvex = left/2
+ nvex = nvex + mod(nvex,2)
+ else
+ nvex = lvr
+ endif
+ left = left - nvex
+*
+ la = 1
+*
+* loop on type I radix-4 passes
+* -----------------------------
+ mu = mod(inq,4)
+ if (isign.eq.-1) mu = 4 - mu
+ ss = 1.0
+ if (mu.eq.3) ss = -1.0
+*
+ if (mh.eq.0) go to 200
+*
+ do 160 ipass = 1 , mh
+ jstep = (n*inc) / (4*la)
+ jstepl = jstep - ninc
+*
+* k = 0 loop (no twiddle factors)
+* -------------------------------
+ do 120 jjj = 0 , (n-1)*inc , 4*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 115 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = jc + jstepl
+ if (jd.lt.istart) jd = jd + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+cdir$ ivdep,shortloop
+ do 110 l = 1 , nvex
+ t0 = a(ja+j) + a(jc+j)
+ t2 = a(ja+j) - a(jc+j)
+ t1 = a(jb+j) + a(jd+j)
+ t3 = ss * ( a(jb+j) - a(jd+j) )
+ u0 = b(ja+j) + b(jc+j)
+ u2 = b(ja+j) - b(jc+j)
+ u1 = b(jb+j) + b(jd+j)
+ u3 = ss * ( b(jb+j) - b(jd+j) )
+ a(ja+j) = t0 + t1
+ a(jc+j) = t0 - t1
+ b(ja+j) = u0 + u1
+ b(jc+j) = u0 - u1
+ a(jb+j) = t2 - u3
+ a(jd+j) = t2 + u3
+ b(jb+j) = u2 + t3
+ b(jd+j) = u2 - t3
+ j = j + jump
+ 110 continue
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 115 continue
+ 120 continue
+*
+* finished if n2 = 4
+* ------------------
+ if (n2.eq.4) go to 490
+ kk = 2 * la
+*
+* loop on nonzero k
+* -----------------
+ do 150 k = ink , jstep-ink , ink
+ co1 = trigs(kk+1)
+ si1 = s*trigs(kk+2)
+ co2 = trigs(2*kk+1)
+ si2 = s*trigs(2*kk+2)
+ co3 = trigs(3*kk+1)
+ si3 = s*trigs(3*kk+2)
+*
+* loop along transform
+* --------------------
+ do 140 jjj = k , (n-1)*inc , 4*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 135 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = jc + jstepl
+ if (jd.lt.istart) jd = jd + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+cdir$ ivdep,shortloop
+ do 130 l = 1 , nvex
+ t0 = a(ja+j) + a(jc+j)
+ t2 = a(ja+j) - a(jc+j)
+ t1 = a(jb+j) + a(jd+j)
+ t3 = ss * ( a(jb+j) - a(jd+j ) )
+ u0 = b(ja+j) + b(jc+j)
+ u2 = b(ja+j) - b(jc+j)
+ u1 = b(jb+j) + b(jd+j)
+ u3 = ss * ( b(jb+j) - b(jd+j) )
+ a(ja+j) = t0 + t1
+ b(ja+j) = u0 + u1
+ a(jb+j) = co1*(t2-u3) - si1*(u2+t3)
+ b(jb+j) = si1*(t2-u3) + co1*(u2+t3)
+ a(jc+j) = co2*(t0-t1) - si2*(u0-u1)
+ b(jc+j) = si2*(t0-t1) + co2*(u0-u1)
+ a(jd+j) = co3*(t2+u3) - si3*(u2-t3)
+ b(jd+j) = si3*(t2+u3) + co3*(u2-t3)
+ j = j + jump
+ 130 continue
+*-----( end of loop across transforms )
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 135 continue
+ 140 continue
+*-----( end of loop along transforms )
+ kk = kk + 2*la
+ 150 continue
+*-----( end of loop on nonzero k )
+ la = 4*la
+ 160 continue
+*-----( end of loop on type I radix-4 passes)
+*
+* central radix-2 pass
+* --------------------
+ 200 continue
+ if (m2.eq.0) go to 300
+*
+ jstep = (n*inc) / (2*la)
+ jstepl = jstep - ninc
+*
+* k=0 loop (no twiddle factors)
+* -----------------------------
+ do 220 jjj = 0 , (n-1)*inc , 2*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 215 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+cdir$ ivdep,shortloop
+ do 210 l = 1 , nvex
+ t0 = a(ja+j) - a(jb+j)
+ a(ja+j) = a(ja+j) + a(jb+j)
+ a(jb+j) = t0
+ u0 = b(ja+j) - b(jb+j)
+ b(ja+j) = b(ja+j) + b(jb+j)
+ b(jb+j) = u0
+ j = j + jump
+ 210 continue
+*-----(end of loop across transforms)
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 215 continue
+ 220 continue
+*
+* finished if n2=2
+* ----------------
+ if (n2.eq.2) go to 490
+*
+ kk = 2 * la
+*
+* loop on nonzero k
+* -----------------
+ do 260 k = ink , jstep - ink , ink
+ co1 = trigs(kk+1)
+ si1 = s*trigs(kk+2)
+*
+* loop along transforms
+* ---------------------
+ do 250 jjj = k , (n-1)*inc , 2*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 245 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+ if (kk.eq.n2/2) then
+cdir$ ivdep,shortloop
+ do 230 l = 1 , nvex
+ t0 = ss * ( a(ja+j) - a(jb+j) )
+ a(ja+j) = a(ja+j) + a(jb+j)
+ a(jb+j) = ss * ( b(jb+j) - b(ja+j) )
+ b(ja+j) = b(ja+j) + b(jb+j)
+ b(jb+j) = t0
+ j = j + jump
+ 230 continue
+*
+ else
+*
+cdir$ ivdep,shortloop
+ do 240 l = 1 , nvex
+ t0 = a(ja+j) - a(jb+j)
+ a(ja+j) = a(ja+j) + a(jb+j)
+ u0 = b(ja+j) - b(jb+j)
+ b(ja+j) = b(ja+j) + b(jb+j)
+ a(jb+j) = co1*t0 - si1*u0
+ b(jb+j) = si1*t0 + co1*u0
+ j = j + jump
+ 240 continue
+*
+ endif
+*
+*-----(end of loop across transforms)
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 245 continue
+ 250 continue
+*-----(end of loop along transforms)
+ kk = kk + 2 * la
+ 260 continue
+*-----(end of loop on nonzero k)
+*-----(end of radix-2 pass)
+*
+ la = 2 * la
+ go to 400
+*
+* central radix-8 pass
+* --------------------
+ 300 continue
+ if (m8.eq.0) go to 400
+ jstep = (n*inc) / (8*la)
+ jstepl = jstep - ninc
+ mu = mod(inq,8)
+ if (isign.eq.-1) mu = 8 - mu
+ c1 = 1.0
+ if (mu.eq.3.or.mu.eq.7) c1 = -1.0
+ c2 = sqrt(0.5)
+ if (mu.eq.3.or.mu.eq.5) c2 = -c2
+ c3 = c1 * c2
+*
+* stage 1
+* -------
+ do 320 k = 0 , jstep - ink , ink
+ do 315 jjj = k , (n-1)*inc , 8*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 312 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = jc + jstepl
+ if (jd.lt.istart) jd = jd + ninc
+ je = jd + jstepl
+ if (je.lt.istart) je = je + ninc
+ jf = je + jstepl
+ if (jf.lt.istart) jf = jf + ninc
+ jg = jf + jstepl
+ if (jg.lt.istart) jg = jg + ninc
+ jh = jg + jstepl
+ if (jh.lt.istart) jh = jh + ninc
+ j = 0
+cdir$ ivdep,shortloop
+ do 310 l = 1 , nvex
+ t0 = a(ja+j) - a(je+j)
+ a(ja+j) = a(ja+j) + a(je+j)
+ t1 = c1 * ( a(jc+j) - a(jg+j) )
+ a(je+j) = a(jc+j) + a(jg+j)
+ t2 = a(jb+j) - a(jf+j)
+ a(jc+j) = a(jb+j) + a(jf+j)
+ t3 = a(jd+j) - a(jh+j)
+ a(jg+j) = a(jd+j) + a(jh+j)
+ a(jb+j) = t0
+ a(jf+j) = t1
+ a(jd+j) = c2 * ( t2 - t3 )
+ a(jh+j) = c3 * ( t2 + t3 )
+ u0 = b(ja+j) - b(je+j)
+ b(ja+j) = b(ja+j) + b(je+j)
+ u1 = c1 * ( b(jc+j) - b(jg+j) )
+ b(je+j) = b(jc+j) + b(jg+j)
+ u2 = b(jb+j) - b(jf+j)
+ b(jc+j) = b(jb+j) + b(jf+j)
+ u3 = b(jd+j) - b(jh+j)
+ b(jg+j) = b(jd+j) + b(jh+j)
+ b(jb+j) = u0
+ b(jf+j) = u1
+ b(jd+j) = c2 * ( u2 - u3 )
+ b(jh+j) = c3 * ( u2 + u3 )
+ j = j + jump
+ 310 continue
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 312 continue
+ 315 continue
+ 320 continue
+*
+* stage 2
+* -------
+*
+* k=0 (no twiddle factors)
+* ------------------------
+ do 330 jjj = 0 , (n-1)*inc , 8*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 328 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = jc + jstepl
+ if (jd.lt.istart) jd = jd + ninc
+ je = jd + jstepl
+ if (je.lt.istart) je = je + ninc
+ jf = je + jstepl
+ if (jf.lt.istart) jf = jf + ninc
+ jg = jf + jstepl
+ if (jg.lt.istart) jg = jg + ninc
+ jh = jg + jstepl
+ if (jh.lt.istart) jh = jh + ninc
+ j = 0
+cdir$ ivdep,shortloop
+ do 325 l = 1 , nvex
+ t0 = a(ja+j) + a(je+j)
+ t2 = a(ja+j) - a(je+j)
+ t1 = a(jc+j) + a(jg+j)
+ t3 = c1 * ( a(jc+j) - a(jg+j) )
+ u0 = b(ja+j) + b(je+j)
+ u2 = b(ja+j) - b(je+j)
+ u1 = b(jc+j) + b(jg+j)
+ u3 = c1 * ( b(jc+j) - b(jg+j ) )
+ a(ja+j) = t0 + t1
+ a(je+j) = t0 - t1
+ b(ja+j) = u0 + u1
+ b(je+j) = u0 - u1
+ a(jc+j) = t2 - u3
+ a(jg+j) = t2 + u3
+ b(jc+j) = u2 + t3
+ b(jg+j) = u2 - t3
+ t0 = a(jb+j) + a(jd+j)
+ t2 = a(jb+j) - a(jd+j)
+ t1 = a(jf+j) - a(jh+j)
+ t3 = a(jf+j) + a(jh+j)
+ u0 = b(jb+j) + b(jd+j)
+ u2 = b(jb+j) - b(jd+j)
+ u1 = b(jf+j) - b(jh+j)
+ u3 = b(jf+j) + b(jh+j)
+ a(jb+j) = t0 - u3
+ a(jh+j) = t0 + u3
+ b(jb+j) = u0 + t3
+ b(jh+j) = u0 - t3
+ a(jd+j) = t2 + u1
+ a(jf+j) = t2 - u1
+ b(jd+j) = u2 - t1
+ b(jf+j) = u2 + t1
+ j = j + jump
+ 325 continue
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 328 continue
+ 330 continue
+*
+ if (n2.eq.8) go to 490
+*
+* loop on nonzero k
+* -----------------
+ kk = 2 * la
+*
+ do 350 k = ink , jstep - ink , ink
+*
+ co1 = trigs(kk+1)
+ si1 = s * trigs(kk+2)
+ co2 = trigs(2*kk+1)
+ si2 = s * trigs(2*kk+2)
+ co3 = trigs(3*kk+1)
+ si3 = s * trigs(3*kk+2)
+ co4 = trigs(4*kk+1)
+ si4 = s * trigs(4*kk+2)
+ co5 = trigs(5*kk+1)
+ si5 = s * trigs(5*kk+2)
+ co6 = trigs(6*kk+1)
+ si6 = s * trigs(6*kk+2)
+ co7 = trigs(7*kk+1)
+ si7 = s * trigs(7*kk+2)
+*
+ do 345 jjj = k , (n-1)*inc , 8*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 342 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = jc + jstepl
+ if (jd.lt.istart) jd = jd + ninc
+ je = jd + jstepl
+ if (je.lt.istart) je = je + ninc
+ jf = je + jstepl
+ if (jf.lt.istart) jf = jf + ninc
+ jg = jf + jstepl
+ if (jg.lt.istart) jg = jg + ninc
+ jh = jg + jstepl
+ if (jh.lt.istart) jh = jh + ninc
+ j = 0
+cdir$ ivdep,shortloop
+ do 340 l = 1 , nvex
+ t0 = a(ja+j) + a(je+j)
+ t2 = a(ja+j) - a(je+j)
+ t1 = a(jc+j) + a(jg+j)
+ t3 = c1 * ( a(jc+j) - a(jg+j) )
+ u0 = b(ja+j) + b(je+j)
+ u2 = b(ja+j) - b(je+j)
+ u1 = b(jc+j) + b(jg+j)
+ u3 = c1 * ( b(jc+j) - b(jg+j ) )
+ a(ja+j) = t0 + t1
+ b(ja+j) = u0 + u1
+ a(je+j) = co4*(t0-t1) - si4*(u0-u1)
+ b(je+j) = si4*(t0-t1) + co4*(u0-u1)
+ a(jc+j) = co2*(t2-u3) - si2*(u2+t3)
+ b(jc+j) = si2*(t2-u3) + co2*(u2+t3)
+ a(jg+j) = co6*(t2+u3) - si6*(u2-t3)
+ b(jg+j) = si6*(t2+u3) + co6*(u2-t3)
+ t0 = a(jb+j) + a(jd+j)
+ t2 = a(jb+j) - a(jd+j)
+ t1 = a(jf+j) - a(jh+j)
+ t3 = a(jf+j) + a(jh+j)
+ u0 = b(jb+j) + b(jd+j)
+ u2 = b(jb+j) - b(jd+j)
+ u1 = b(jf+j) - b(jh+j)
+ u3 = b(jf+j) + b(jh+j)
+ a(jb+j) = co1*(t0-u3) - si1*(u0+t3)
+ b(jb+j) = si1*(t0-u3) + co1*(u0+t3)
+ a(jh+j) = co7*(t0+u3) - si7*(u0-t3)
+ b(jh+j) = si7*(t0+u3) + co7*(u0-t3)
+ a(jd+j) = co3*(t2+u1) - si3*(u2-t1)
+ b(jd+j) = si3*(t2+u1) + co3*(u2-t1)
+ a(jf+j) = co5*(t2-u1) - si5*(u2+t1)
+ b(jf+j) = si5*(t2-u1) + co5*(u2+t1)
+ j = j + jump
+ 340 continue
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 342 continue
+ 345 continue
+ kk = kk + 2 * la
+ 350 continue
+*
+ la = 8 * la
+*
+* loop on type II radix-4 passes
+* ------------------------------
+ 400 continue
+ mu = mod(inq,4)
+ if (isign.eq.-1) mu = 4 - mu
+ ss = 1.0
+ if (mu.eq.3) ss = -1.0
+*
+ do 480 ipass = mh+1 , m
+ jstep = (n*inc) / (4*la)
+ jstepl = jstep - ninc
+ laincl = la * ink - ninc
+*
+* k=0 loop (no twiddle factors)
+* -----------------------------
+ do 430 ll = 0 , (la-1)*ink , 4*jstep
+*
+ do 420 jjj = ll , (n-1)*inc , 4*la*ink
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 415 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = jc + jstepl
+ if (jd.lt.istart) jd = jd + ninc
+ je = ja + laincl
+ if (je.lt.istart) je = je + ninc
+ jf = je + jstepl
+ if (jf.lt.istart) jf = jf + ninc
+ jg = jf + jstepl
+ if (jg.lt.istart) jg = jg + ninc
+ jh = jg + jstepl
+ if (jh.lt.istart) jh = jh + ninc
+ ji = je + laincl
+ if (ji.lt.istart) ji = ji + ninc
+ jj = ji + jstepl
+ if (jj.lt.istart) jj = jj + ninc
+ jk = jj + jstepl
+ if (jk.lt.istart) jk = jk + ninc
+ jl = jk + jstepl
+ if (jl.lt.istart) jl = jl + ninc
+ jm = ji + laincl
+ if (jm.lt.istart) jm = jm + ninc
+ jn = jm + jstepl
+ if (jn.lt.istart) jn = jn + ninc
+ jo = jn + jstepl
+ if (jo.lt.istart) jo = jo + ninc
+ jp = jo + jstepl
+ if (jp.lt.istart) jp = jp + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+cdir$ ivdep,shortloop
+ do 410 l = 1 , nvex
+ t0 = a(ja+j) + a(jc+j)
+ t2 = a(ja+j) - a(jc+j)
+ t1 = a(jb+j) + a(jd+j)
+ t3 = ss * ( a(jb+j) - a(jd+j) )
+ a(jc+j) = a(ji+j)
+ u0 = b(ja+j) + b(jc+j)
+ u2 = b(ja+j) - b(jc+j)
+ u1 = b(jb+j) + b(jd+j)
+ u3 = ss * ( b(jb+j) - b(jd+j) )
+ a(jb+j) = a(je+j)
+ a(ja+j) = t0 + t1
+ a(ji+j) = t0 - t1
+ b(ja+j) = u0 + u1
+ b(jc+j) = u0 - u1
+ b(jd+j) = b(jm+j)
+ a(je+j) = t2 - u3
+ a(jd+j) = t2 + u3
+ b(jb+j) = u2 + t3
+ b(jm+j) = u2 - t3
+*----------------------
+ t0 = a(jb+j) + a(jg+j)
+ t2 = a(jb+j) - a(jg+j)
+ t1 = a(jf+j) + a(jh+j)
+ t3 = ss * ( a(jf+j) - a(jh+j) )
+ a(jg+j) = a(jj+j)
+ u0 = b(je+j) + b(jg+j)
+ u2 = b(je+j) - b(jg+j)
+ u1 = b(jf+j) + b(jh+j)
+ u3 = ss * ( b(jf+j) - b(jh+j) )
+ b(je+j) = b(jb+j)
+ a(jb+j) = t0 + t1
+ a(jj+j) = t0 - t1
+ b(jg+j) = b(jj+j)
+ b(jb+j) = u0 + u1
+ b(jj+j) = u0 - u1
+ a(jf+j) = t2 - u3
+ a(jh+j) = t2 + u3
+ b(jf+j) = u2 + t3
+ b(jh+j) = u2 - t3
+*----------------------
+ t0 = a(jc+j) + a(jk+j)
+ t2 = a(jc+j) - a(jk+j)
+ t1 = a(jg+j) + a(jl+j)
+ t3 = ss * ( a(jg+j) - a(jl+j) )
+ u0 = b(ji+j) + b(jk+j)
+ u2 = b(ji+j) - b(jk+j)
+ a(jl+j) = a(jo+j)
+ u1 = b(jg+j) + b(jl+j)
+ u3 = ss * ( b(jg+j) - b(jl+j) )
+ b(ji+j) = b(jc+j)
+ a(jc+j) = t0 + t1
+ a(jk+j) = t0 - t1
+ b(jl+j) = b(jo+j)
+ b(jc+j) = u0 + u1
+ b(jk+j) = u0 - u1
+ a(jg+j) = t2 - u3
+ a(jo+j) = t2 + u3
+ b(jg+j) = u2 + t3
+ b(jo+j) = u2 - t3
+*----------------------
+ t0 = a(jm+j) + a(jl+j)
+ t2 = a(jm+j) - a(jl+j)
+ t1 = a(jn+j) + a(jp+j)
+ t3 = ss * ( a(jn+j) - a(jp+j) )
+ a(jm+j) = a(jd+j)
+ u0 = b(jd+j) + b(jl+j)
+ u2 = b(jd+j) - b(jl+j)
+ u1 = b(jn+j) + b(jp+j)
+ u3 = ss * ( b(jn+j) - b(jp+j) )
+ a(jn+j) = a(jh+j)
+ a(jd+j) = t0 + t1
+ a(jl+j) = t0 - t1
+ b(jd+j) = u0 + u1
+ b(jl+j) = u0 - u1
+ b(jn+j) = b(jh+j)
+ a(jh+j) = t2 - u3
+ a(jp+j) = t2 + u3
+ b(jh+j) = u2 + t3
+ b(jp+j) = u2 - t3
+ j = j + jump
+ 410 continue
+*-----( end of loop across transforms )
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 415 continue
+ 420 continue
+ 430 continue
+*-----( end of double loop for k=0 )
+*
+* finished if last pass
+* ---------------------
+ if (ipass.eq.m) go to 490
+*
+ kk = 2*la
+*
+* loop on nonzero k
+* -----------------
+ do 470 k = ink , jstep-ink , ink
+ co1 = trigs(kk+1)
+ si1 = s*trigs(kk+2)
+ co2 = trigs(2*kk+1)
+ si2 = s*trigs(2*kk+2)
+ co3 = trigs(3*kk+1)
+ si3 = s*trigs(3*kk+2)
+*
+* double loop along first transform in block
+* ------------------------------------------
+ do 460 ll = k , (la-1)*ink , 4*jstep
+*
+ do 450 jjj = ll , (n-1)*inc , 4*la*ink
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 445 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = jc + jstepl
+ if (jd.lt.istart) jd = jd + ninc
+ je = ja + laincl
+ if (je.lt.istart) je = je + ninc
+ jf = je + jstepl
+ if (jf.lt.istart) jf = jf + ninc
+ jg = jf + jstepl
+ if (jg.lt.istart) jg = jg + ninc
+ jh = jg + jstepl
+ if (jh.lt.istart) jh = jh + ninc
+ ji = je + laincl
+ if (ji.lt.istart) ji = ji + ninc
+ jj = ji + jstepl
+ if (jj.lt.istart) jj = jj + ninc
+ jk = jj + jstepl
+ if (jk.lt.istart) jk = jk + ninc
+ jl = jk + jstepl
+ if (jl.lt.istart) jl = jl + ninc
+ jm = ji + laincl
+ if (jm.lt.istart) jm = jm + ninc
+ jn = jm + jstepl
+ if (jn.lt.istart) jn = jn + ninc
+ jo = jn + jstepl
+ if (jo.lt.istart) jo = jo + ninc
+ jp = jo + jstepl
+ if (jp.lt.istart) jp = jp + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+cdir$ ivdep,shortloop
+ do 440 l = 1 , nvex
+ t0 = a(ja+j) + a(jc+j)
+ t2 = a(ja+j) - a(jc+j)
+ t1 = a(jb+j) + a(jd+j)
+ t3 = ss * ( a(jb+j) - a(jd+j) )
+ a(jc+j) = a(ji+j)
+ u0 = b(ja+j) + b(jc+j)
+ u2 = b(ja+j) - b(jc+j)
+ u1 = b(jb+j) + b(jd+j)
+ u3 = ss * ( b(jb+j) - b(jd+j) )
+ a(jb+j) = a(je+j)
+ a(ja+j) = t0 + t1
+ b(ja+j) = u0 + u1
+ a(je+j) = co1*(t2-u3) - si1*(u2+t3)
+ b(jb+j) = si1*(t2-u3) + co1*(u2+t3)
+ b(jd+j) = b(jm+j)
+ a(ji+j) = co2*(t0-t1) - si2*(u0-u1)
+ b(jc+j) = si2*(t0-t1) + co2*(u0-u1)
+ a(jd+j) = co3*(t2+u3) - si3*(u2-t3)
+ b(jm+j) = si3*(t2+u3) + co3*(u2-t3)
+*----------------------------------------
+ t0 = a(jb+j) + a(jg+j)
+ t2 = a(jb+j) - a(jg+j)
+ t1 = a(jf+j) + a(jh+j)
+ t3 = ss * ( a(jf+j) - a(jh+j) )
+ a(jg+j) = a(jj+j)
+ u0 = b(je+j) + b(jg+j)
+ u2 = b(je+j) - b(jg+j)
+ u1 = b(jf+j) + b(jh+j)
+ u3 = ss * ( b(jf+j) - b(jh+j) )
+ b(je+j) = b(jb+j)
+ a(jb+j) = t0 + t1
+ b(jb+j) = u0 + u1
+ b(jg+j) = b(jj+j)
+ a(jf+j) = co1*(t2-u3) - si1*(u2+t3)
+ b(jf+j) = si1*(t2-u3) + co1*(u2+t3)
+ a(jj+j) = co2*(t0-t1) - si2*(u0-u1)
+ b(jj+j) = si2*(t0-t1) + co2*(u0-u1)
+ a(jh+j) = co3*(t2+u3) - si3*(u2-t3)
+ b(jh+j) = si3*(t2+u3) + co3*(u2-t3)
+*----------------------------------------
+ t0 = a(jc+j) + a(jk+j)
+ t2 = a(jc+j) - a(jk+j)
+ t1 = a(jg+j) + a(jl+j)
+ t3 = ss * ( a(jg+j) - a(jl+j) )
+ u0 = b(ji+j) + b(jk+j)
+ u2 = b(ji+j) - b(jk+j)
+ a(jl+j) = a(jo+j)
+ u1 = b(jg+j) + b(jl+j)
+ u3 = ss * ( b(jg+j) - b(jl+j) )
+ b(ji+j) = b(jc+j)
+ a(jc+j) = t0 + t1
+ b(jc+j) = u0 + u1
+ b(jl+j) = b(jo+j)
+ a(jg+j) = co1*(t2-u3) - si1*(u2+t3)
+ b(jg+j) = si1*(t2-u3) + co1*(u2+t3)
+ a(jk+j) = co2*(t0-t1) - si2*(u0-u1)
+ b(jk+j) = si2*(t0-t1) + co2*(u0-u1)
+ a(jo+j) = co3*(t2+u3) - si3*(u2-t3)
+ b(jo+j) = si3*(t2+u3) + co3*(u2-t3)
+*----------------------------------------
+ t0 = a(jm+j) + a(jl+j)
+ t2 = a(jm+j) - a(jl+j)
+ t1 = a(jn+j) + a(jp+j)
+ t3 = ss * ( a(jn+j) - a(jp+j) )
+ a(jm+j) = a(jd+j)
+ u0 = b(jd+j) + b(jl+j)
+ u2 = b(jd+j) - b(jl+j)
+ a(jn+j) = a(jh+j)
+ u1 = b(jn+j) + b(jp+j)
+ u3 = ss * ( b(jn+j) - b(jp+j) )
+ b(jn+j) = b(jh+j)
+ a(jd+j) = t0 + t1
+ b(jd+j) = u0 + u1
+ a(jh+j) = co1*(t2-u3) - si1*(u2+t3)
+ b(jh+j) = si1*(t2-u3) + co1*(u2+t3)
+ a(jl+j) = co2*(t0-t1) - si2*(u0-u1)
+ b(jl+j) = si2*(t0-t1) + co2*(u0-u1)
+ a(jp+j) = co3*(t2+u3) - si3*(u2-t3)
+ b(jp+j) = si3*(t2+u3) + co3*(u2-t3)
+ j = j + jump
+ 440 continue
+*-----(end of loop across transforms)
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 445 continue
+ 450 continue
+ 460 continue
+*-----( end of double loop for this k )
+ kk = kk + 2*la
+ 470 continue
+*-----( end of loop over values of k )
+ la = 4*la
+ 480 continue
+*-----( end of loop on type II radix-4 passes )
+*-----( nvex transforms completed)
+ 490 continue
+ istart = istart + nvex * jump
+ 500 continue
+*-----( end of loop on blocks of transforms )
+*
+ return
+ end
diff --git a/fft/gpfa3.F b/fft/gpfa3.F
new file mode 100755
index 0000000..67e31dd
--- /dev/null
+++ b/fft/gpfa3.F
@@ -0,0 +1,375 @@
+ subroutine gpfa3(a,b,trigs,inc,jump,n,mm,lot,isign)
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+* fortran version of *gpfa3* -
+* radix-3 section of self-sorting, in-place
+* generalized PFA
+*
+*-------------------------------------------------------------------
+*
+ dimension a(*), b(*), trigs(*)
+ data sin60/0.866025403784437/
+ data lvr/128/
+*
+* ***************************************************************
+* * *
+* * N.B. LVR = LENGTH OF VECTOR REGISTERS, SET TO 128 FOR C90. *
+* * RESET TO 64 FOR OTHER CRAY MACHINES, OR TO ANY LARGE VALUE *
+* * (GREATER THAN OR EQUAL TO LOT) FOR A SCALAR COMPUTER. *
+* * *
+* ***************************************************************
+*
+ n3 = 3**mm
+ inq = n/n3
+ jstepx = (n3-n) * inc
+ ninc = n * inc
+ ink = inc * inq
+ mu = mod(inq,3)
+ if (isign.eq.-1) mu = 3-mu
+ m = mm
+ mh = (m+1)/2
+ s = float(isign)
+ c1 = sin60
+ if (mu.eq.2) c1 = -c1
+*
+ nblox = 1 + (lot-1)/lvr
+ left = lot
+ s = float(isign)
+ istart = 1
+*
+* loop on blocks of lvr transforms
+* --------------------------------
+ do 500 nb = 1 , nblox
+*
+ if (left.le.lvr) then
+ nvex = left
+ else if (left.lt.(2*lvr)) then
+ nvex = left/2
+ nvex = nvex + mod(nvex,2)
+ else
+ nvex = lvr
+ endif
+ left = left - nvex
+*
+ la = 1
+*
+* loop on type I radix-3 passes
+* -----------------------------
+ do 160 ipass = 1 , mh
+ jstep = (n*inc) / (3*la)
+ jstepl = jstep - ninc
+*
+* k = 0 loop (no twiddle factors)
+* -------------------------------
+ do 120 jjj = 0 , (n-1)*inc , 3*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 115 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+cdir$ ivdep, shortloop
+ do 110 l = 1 , nvex
+ t1 = a(jb+j) + a(jc+j)
+ t2 = a(ja+j) - 0.5 * t1
+ t3 = c1 * ( a(jb+j) - a(jc+j) )
+ u1 = b(jb+j) + b(jc+j)
+ u2 = b(ja+j) - 0.5 * u1
+ u3 = c1 * ( b(jb+j) - b(jc+j) )
+ a(ja+j) = a(ja+j) + t1
+ b(ja+j) = b(ja+j) + u1
+ a(jb+j) = t2 - u3
+ b(jb+j) = u2 + t3
+ a(jc+j) = t2 + u3
+ b(jc+j) = u2 - t3
+ j = j + jump
+ 110 continue
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 115 continue
+ 120 continue
+*
+* finished if n3 = 3
+* ------------------
+ if (n3.eq.3) go to 490
+ kk = 2 * la
+*
+* loop on nonzero k
+* -----------------
+ do 150 k = ink , jstep-ink , ink
+ co1 = trigs(kk+1)
+ si1 = s*trigs(kk+2)
+ co2 = trigs(2*kk+1)
+ si2 = s*trigs(2*kk+2)
+*
+* loop along transform
+* --------------------
+ do 140 jjj = k , (n-1)*inc , 3*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 135 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+cdir$ ivdep,shortloop
+ do 130 l = 1 , nvex
+ t1 = a(jb+j) + a(jc+j)
+ t2 = a(ja+j) - 0.5 * t1
+ t3 = c1 * ( a(jb+j) - a(jc+j) )
+ u1 = b(jb+j) + b(jc+j)
+ u2 = b(ja+j) - 0.5 * u1
+ u3 = c1 * ( b(jb+j) - b(jc+j) )
+ a(ja+j) = a(ja+j) + t1
+ b(ja+j) = b(ja+j) + u1
+ a(jb+j) = co1*(t2-u3) - si1*(u2+t3)
+ b(jb+j) = si1*(t2-u3) + co1*(u2+t3)
+ a(jc+j) = co2*(t2+u3) - si2*(u2-t3)
+ b(jc+j) = si2*(t2+u3) + co2*(u2-t3)
+ j = j + jump
+ 130 continue
+*-----( end of loop across transforms )
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 135 continue
+ 140 continue
+*-----( end of loop along transforms )
+ kk = kk + 2*la
+ 150 continue
+*-----( end of loop on nonzero k )
+ la = 3*la
+ 160 continue
+*-----( end of loop on type I radix-3 passes)
+*
+* loop on type II radix-3 passes
+* ------------------------------
+ 400 continue
+*
+ do 480 ipass = mh+1 , m
+ jstep = (n*inc) / (3*la)
+ jstepl = jstep - ninc
+ laincl = la*ink - ninc
+*
+* k=0 loop (no twiddle factors)
+* -----------------------------
+ do 430 ll = 0 , (la-1)*ink , 3*jstep
+*
+ do 420 jjj = ll , (n-1)*inc , 3*la*ink
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 415 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = ja + laincl
+ if (jd.lt.istart) jd = jd + ninc
+ je = jd + jstepl
+ if (je.lt.istart) je = je + ninc
+ jf = je + jstepl
+ if (jf.lt.istart) jf = jf + ninc
+ jg = jd + laincl
+ if (jg.lt.istart) jg = jg + ninc
+ jh = jg + jstepl
+ if (jh.lt.istart) jh = jh + ninc
+ ji = jh + jstepl
+ if (ji.lt.istart) ji = ji + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+cdir$ ivdep, shortloop
+ do 410 l = 1 , nvex
+ t1 = a(jb+j) + a(jc+j)
+ t2 = a(ja+j) - 0.5 * t1
+ t3 = c1 * ( a(jb+j) - a(jc+j) )
+ a(jb+j) = a(jd+j)
+ u1 = b(jb+j) + b(jc+j)
+ u2 = b(ja+j) - 0.5 * u1
+ u3 = c1 * ( b(jb+j) - b(jc+j) )
+ b(jb+j) = b(jd+j)
+ a(ja+j) = a(ja+j) + t1
+ b(ja+j) = b(ja+j) + u1
+ a(jd+j) = t2 - u3
+ b(jd+j) = u2 + t3
+ a(jc+j) = t2 + u3
+ b(jc+j) = u2 - t3
+*----------------------
+ t1 = a(je+j) + a(jf+j)
+ t2 = a(jb+j) - 0.5 * t1
+ t3 = c1 * ( a(je+j) - a(jf+j) )
+ a(jf+j) = a(jh+j)
+ u1 = b(je+j) + b(jf+j)
+ u2 = b(jb+j) - 0.5 * u1
+ u3 = c1 * ( b(je+j) - b(jf+j) )
+ b(jf+j) = b(jh+j)
+ a(jb+j) = a(jb+j) + t1
+ b(jb+j) = b(jb+j) + u1
+ a(je+j) = t2 - u3
+ b(je+j) = u2 + t3
+ a(jh+j) = t2 + u3
+ b(jh+j) = u2 - t3
+*----------------------
+ t1 = a(jf+j) + a(ji+j)
+ t2 = a(jg+j) - 0.5 * t1
+ t3 = c1 * ( a(jf+j) - a(ji+j) )
+ t1 = a(jg+j) + t1
+ a(jg+j) = a(jc+j)
+ u1 = b(jf+j) + b(ji+j)
+ u2 = b(jg+j) - 0.5 * u1
+ u3 = c1 * ( b(jf+j) - b(ji+j) )
+ u1 = b(jg+j) + u1
+ b(jg+j) = b(jc+j)
+ a(jc+j) = t1
+ b(jc+j) = u1
+ a(jf+j) = t2 - u3
+ b(jf+j) = u2 + t3
+ a(ji+j) = t2 + u3
+ b(ji+j) = u2 - t3
+ j = j + jump
+ 410 continue
+*-----( end of loop across transforms )
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 415 continue
+ 420 continue
+ 430 continue
+*-----( end of double loop for k=0 )
+*
+* finished if last pass
+* ---------------------
+ if (ipass.eq.m) go to 490
+*
+ kk = 2*la
+*
+* loop on nonzero k
+* -----------------
+ do 470 k = ink , jstep-ink , ink
+ co1 = trigs(kk+1)
+ si1 = s*trigs(kk+2)
+ co2 = trigs(2*kk+1)
+ si2 = s*trigs(2*kk+2)
+*
+* double loop along first transform in block
+* ------------------------------------------
+ do 460 ll = k , (la-1)*ink , 3*jstep
+*
+ do 450 jjj = ll , (n-1)*inc , 3*la*ink
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 445 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = ja + laincl
+ if (jd.lt.istart) jd = jd + ninc
+ je = jd + jstepl
+ if (je.lt.istart) je = je + ninc
+ jf = je + jstepl
+ if (jf.lt.istart) jf = jf + ninc
+ jg = jd + laincl
+ if (jg.lt.istart) jg = jg + ninc
+ jh = jg + jstepl
+ if (jh.lt.istart) jh = jh + ninc
+ ji = jh + jstepl
+ if (ji.lt.istart) ji = ji + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+cdir$ ivdep, shortloop
+ do 440 l = 1 , nvex
+ t1 = a(jb+j) + a(jc+j)
+ t2 = a(ja+j) - 0.5 * t1
+ t3 = c1 * ( a(jb+j) - a(jc+j) )
+ a(jb+j) = a(jd+j)
+ u1 = b(jb+j) + b(jc+j)
+ u2 = b(ja+j) - 0.5 * u1
+ u3 = c1 * ( b(jb+j) - b(jc+j) )
+ b(jb+j) = b(jd+j)
+ a(ja+j) = a(ja+j) + t1
+ b(ja+j) = b(ja+j) + u1
+ a(jd+j) = co1*(t2-u3) - si1*(u2+t3)
+ b(jd+j) = si1*(t2-u3) + co1*(u2+t3)
+ a(jc+j) = co2*(t2+u3) - si2*(u2-t3)
+ b(jc+j) = si2*(t2+u3) + co2*(u2-t3)
+*----------------------
+ t1 = a(je+j) + a(jf+j)
+ t2 = a(jb+j) - 0.5 * t1
+ t3 = c1 * ( a(je+j) - a(jf+j) )
+ a(jf+j) = a(jh+j)
+ u1 = b(je+j) + b(jf+j)
+ u2 = b(jb+j) - 0.5 * u1
+ u3 = c1 * ( b(je+j) - b(jf+j) )
+ b(jf+j) = b(jh+j)
+ a(jb+j) = a(jb+j) + t1
+ b(jb+j) = b(jb+j) + u1
+ a(je+j) = co1*(t2-u3) - si1*(u2+t3)
+ b(je+j) = si1*(t2-u3) + co1*(u2+t3)
+ a(jh+j) = co2*(t2+u3) - si2*(u2-t3)
+ b(jh+j) = si2*(t2+u3) + co2*(u2-t3)
+*----------------------
+ t1 = a(jf+j) + a(ji+j)
+ t2 = a(jg+j) - 0.5 * t1
+ t3 = c1 * ( a(jf+j) - a(ji+j) )
+ t1 = a(jg+j) + t1
+ a(jg+j) = a(jc+j)
+ u1 = b(jf+j) + b(ji+j)
+ u2 = b(jg+j) - 0.5 * u1
+ u3 = c1 * ( b(jf+j) - b(ji+j) )
+ u1 = b(jg+j) + u1
+ b(jg+j) = b(jc+j)
+ a(jc+j) = t1
+ b(jc+j) = u1
+ a(jf+j) = co1*(t2-u3) - si1*(u2+t3)
+ b(jf+j) = si1*(t2-u3) + co1*(u2+t3)
+ a(ji+j) = co2*(t2+u3) - si2*(u2-t3)
+ b(ji+j) = si2*(t2+u3) + co2*(u2-t3)
+ j = j + jump
+ 440 continue
+*-----(end of loop across transforms)
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 445 continue
+ 450 continue
+ 460 continue
+*-----( end of double loop for this k )
+ kk = kk + 2*la
+ 470 continue
+*-----( end of loop over values of k )
+ la = 3*la
+ 480 continue
+*-----( end of loop on type II radix-3 passes )
+*-----( nvex transforms completed)
+ 490 continue
+ istart = istart + nvex * jump
+ 500 continue
+*-----( end of loop on blocks of transforms )
+*
+ return
+ end
diff --git a/fft/gpfa3.f b/fft/gpfa3.f
new file mode 100755
index 0000000..5c2b571
--- /dev/null
+++ b/fft/gpfa3.f
@@ -0,0 +1,376 @@
+c Copyright 1981-2012 ECMWF.
+c
+c This software is licensed under the terms of the Apache Licence
+c Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+c
+c In applying this licence, ECMWF does not waive the privileges and immunities
+c granted to it by virtue of its status as an intergovernmental organisation
+c nor does it submit to any jurisdiction.
+c
+
+ subroutine gpfa3(a,b,trigs,inc,jump,n,mm,lot,isign)
+* fortran version of *gpfa3* -
+* radix-3 section of self-sorting, in-place
+* generalized PFA
+*
+*-------------------------------------------------------------------
+*
+ dimension a(*), b(*), trigs(*)
+ data sin60/0.866025403784437/
+ data lvr/128/
+*
+* ***************************************************************
+* * *
+* * N.B. LVR = LENGTH OF VECTOR REGISTERS, SET TO 128 FOR C90. *
+* * RESET TO 64 FOR OTHER CRAY MACHINES, OR TO ANY LARGE VALUE *
+* * (GREATER THAN OR EQUAL TO LOT) FOR A SCALAR COMPUTER. *
+* * *
+* ***************************************************************
+*
+ n3 = 3**mm
+ inq = n/n3
+ jstepx = (n3-n) * inc
+ ninc = n * inc
+ ink = inc * inq
+ mu = mod(inq,3)
+ if (isign.eq.-1) mu = 3-mu
+ m = mm
+ mh = (m+1)/2
+ s = float(isign)
+ c1 = sin60
+ if (mu.eq.2) c1 = -c1
+*
+ nblox = 1 + (lot-1)/lvr
+ left = lot
+ s = float(isign)
+ istart = 1
+*
+* loop on blocks of lvr transforms
+* --------------------------------
+ do 500 nb = 1 , nblox
+*
+ if (left.le.lvr) then
+ nvex = left
+ else if (left.lt.(2*lvr)) then
+ nvex = left/2
+ nvex = nvex + mod(nvex,2)
+ else
+ nvex = lvr
+ endif
+ left = left - nvex
+*
+ la = 1
+*
+* loop on type I radix-3 passes
+* -----------------------------
+ do 160 ipass = 1 , mh
+ jstep = (n*inc) / (3*la)
+ jstepl = jstep - ninc
+*
+* k = 0 loop (no twiddle factors)
+* -------------------------------
+ do 120 jjj = 0 , (n-1)*inc , 3*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 115 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+cdir$ ivdep, shortloop
+ do 110 l = 1 , nvex
+ t1 = a(jb+j) + a(jc+j)
+ t2 = a(ja+j) - 0.5 * t1
+ t3 = c1 * ( a(jb+j) - a(jc+j) )
+ u1 = b(jb+j) + b(jc+j)
+ u2 = b(ja+j) - 0.5 * u1
+ u3 = c1 * ( b(jb+j) - b(jc+j) )
+ a(ja+j) = a(ja+j) + t1
+ b(ja+j) = b(ja+j) + u1
+ a(jb+j) = t2 - u3
+ b(jb+j) = u2 + t3
+ a(jc+j) = t2 + u3
+ b(jc+j) = u2 - t3
+ j = j + jump
+ 110 continue
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 115 continue
+ 120 continue
+*
+* finished if n3 = 3
+* ------------------
+ if (n3.eq.3) go to 490
+ kk = 2 * la
+*
+* loop on nonzero k
+* -----------------
+ do 150 k = ink , jstep-ink , ink
+ co1 = trigs(kk+1)
+ si1 = s*trigs(kk+2)
+ co2 = trigs(2*kk+1)
+ si2 = s*trigs(2*kk+2)
+*
+* loop along transform
+* --------------------
+ do 140 jjj = k , (n-1)*inc , 3*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 135 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+cdir$ ivdep,shortloop
+ do 130 l = 1 , nvex
+ t1 = a(jb+j) + a(jc+j)
+ t2 = a(ja+j) - 0.5 * t1
+ t3 = c1 * ( a(jb+j) - a(jc+j) )
+ u1 = b(jb+j) + b(jc+j)
+ u2 = b(ja+j) - 0.5 * u1
+ u3 = c1 * ( b(jb+j) - b(jc+j) )
+ a(ja+j) = a(ja+j) + t1
+ b(ja+j) = b(ja+j) + u1
+ a(jb+j) = co1*(t2-u3) - si1*(u2+t3)
+ b(jb+j) = si1*(t2-u3) + co1*(u2+t3)
+ a(jc+j) = co2*(t2+u3) - si2*(u2-t3)
+ b(jc+j) = si2*(t2+u3) + co2*(u2-t3)
+ j = j + jump
+ 130 continue
+*-----( end of loop across transforms )
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 135 continue
+ 140 continue
+*-----( end of loop along transforms )
+ kk = kk + 2*la
+ 150 continue
+*-----( end of loop on nonzero k )
+ la = 3*la
+ 160 continue
+*-----( end of loop on type I radix-3 passes)
+*
+* loop on type II radix-3 passes
+* ------------------------------
+ 400 continue
+*
+ do 480 ipass = mh+1 , m
+ jstep = (n*inc) / (3*la)
+ jstepl = jstep - ninc
+ laincl = la*ink - ninc
+*
+* k=0 loop (no twiddle factors)
+* -----------------------------
+ do 430 ll = 0 , (la-1)*ink , 3*jstep
+*
+ do 420 jjj = ll , (n-1)*inc , 3*la*ink
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 415 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = ja + laincl
+ if (jd.lt.istart) jd = jd + ninc
+ je = jd + jstepl
+ if (je.lt.istart) je = je + ninc
+ jf = je + jstepl
+ if (jf.lt.istart) jf = jf + ninc
+ jg = jd + laincl
+ if (jg.lt.istart) jg = jg + ninc
+ jh = jg + jstepl
+ if (jh.lt.istart) jh = jh + ninc
+ ji = jh + jstepl
+ if (ji.lt.istart) ji = ji + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+cdir$ ivdep, shortloop
+ do 410 l = 1 , nvex
+ t1 = a(jb+j) + a(jc+j)
+ t2 = a(ja+j) - 0.5 * t1
+ t3 = c1 * ( a(jb+j) - a(jc+j) )
+ a(jb+j) = a(jd+j)
+ u1 = b(jb+j) + b(jc+j)
+ u2 = b(ja+j) - 0.5 * u1
+ u3 = c1 * ( b(jb+j) - b(jc+j) )
+ b(jb+j) = b(jd+j)
+ a(ja+j) = a(ja+j) + t1
+ b(ja+j) = b(ja+j) + u1
+ a(jd+j) = t2 - u3
+ b(jd+j) = u2 + t3
+ a(jc+j) = t2 + u3
+ b(jc+j) = u2 - t3
+*----------------------
+ t1 = a(je+j) + a(jf+j)
+ t2 = a(jb+j) - 0.5 * t1
+ t3 = c1 * ( a(je+j) - a(jf+j) )
+ a(jf+j) = a(jh+j)
+ u1 = b(je+j) + b(jf+j)
+ u2 = b(jb+j) - 0.5 * u1
+ u3 = c1 * ( b(je+j) - b(jf+j) )
+ b(jf+j) = b(jh+j)
+ a(jb+j) = a(jb+j) + t1
+ b(jb+j) = b(jb+j) + u1
+ a(je+j) = t2 - u3
+ b(je+j) = u2 + t3
+ a(jh+j) = t2 + u3
+ b(jh+j) = u2 - t3
+*----------------------
+ t1 = a(jf+j) + a(ji+j)
+ t2 = a(jg+j) - 0.5 * t1
+ t3 = c1 * ( a(jf+j) - a(ji+j) )
+ t1 = a(jg+j) + t1
+ a(jg+j) = a(jc+j)
+ u1 = b(jf+j) + b(ji+j)
+ u2 = b(jg+j) - 0.5 * u1
+ u3 = c1 * ( b(jf+j) - b(ji+j) )
+ u1 = b(jg+j) + u1
+ b(jg+j) = b(jc+j)
+ a(jc+j) = t1
+ b(jc+j) = u1
+ a(jf+j) = t2 - u3
+ b(jf+j) = u2 + t3
+ a(ji+j) = t2 + u3
+ b(ji+j) = u2 - t3
+ j = j + jump
+ 410 continue
+*-----( end of loop across transforms )
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 415 continue
+ 420 continue
+ 430 continue
+*-----( end of double loop for k=0 )
+*
+* finished if last pass
+* ---------------------
+ if (ipass.eq.m) go to 490
+*
+ kk = 2*la
+*
+* loop on nonzero k
+* -----------------
+ do 470 k = ink , jstep-ink , ink
+ co1 = trigs(kk+1)
+ si1 = s*trigs(kk+2)
+ co2 = trigs(2*kk+1)
+ si2 = s*trigs(2*kk+2)
+*
+* double loop along first transform in block
+* ------------------------------------------
+ do 460 ll = k , (la-1)*ink , 3*jstep
+*
+ do 450 jjj = ll , (n-1)*inc , 3*la*ink
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 445 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = ja + laincl
+ if (jd.lt.istart) jd = jd + ninc
+ je = jd + jstepl
+ if (je.lt.istart) je = je + ninc
+ jf = je + jstepl
+ if (jf.lt.istart) jf = jf + ninc
+ jg = jd + laincl
+ if (jg.lt.istart) jg = jg + ninc
+ jh = jg + jstepl
+ if (jh.lt.istart) jh = jh + ninc
+ ji = jh + jstepl
+ if (ji.lt.istart) ji = ji + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+cdir$ ivdep, shortloop
+ do 440 l = 1 , nvex
+ t1 = a(jb+j) + a(jc+j)
+ t2 = a(ja+j) - 0.5 * t1
+ t3 = c1 * ( a(jb+j) - a(jc+j) )
+ a(jb+j) = a(jd+j)
+ u1 = b(jb+j) + b(jc+j)
+ u2 = b(ja+j) - 0.5 * u1
+ u3 = c1 * ( b(jb+j) - b(jc+j) )
+ b(jb+j) = b(jd+j)
+ a(ja+j) = a(ja+j) + t1
+ b(ja+j) = b(ja+j) + u1
+ a(jd+j) = co1*(t2-u3) - si1*(u2+t3)
+ b(jd+j) = si1*(t2-u3) + co1*(u2+t3)
+ a(jc+j) = co2*(t2+u3) - si2*(u2-t3)
+ b(jc+j) = si2*(t2+u3) + co2*(u2-t3)
+*----------------------
+ t1 = a(je+j) + a(jf+j)
+ t2 = a(jb+j) - 0.5 * t1
+ t3 = c1 * ( a(je+j) - a(jf+j) )
+ a(jf+j) = a(jh+j)
+ u1 = b(je+j) + b(jf+j)
+ u2 = b(jb+j) - 0.5 * u1
+ u3 = c1 * ( b(je+j) - b(jf+j) )
+ b(jf+j) = b(jh+j)
+ a(jb+j) = a(jb+j) + t1
+ b(jb+j) = b(jb+j) + u1
+ a(je+j) = co1*(t2-u3) - si1*(u2+t3)
+ b(je+j) = si1*(t2-u3) + co1*(u2+t3)
+ a(jh+j) = co2*(t2+u3) - si2*(u2-t3)
+ b(jh+j) = si2*(t2+u3) + co2*(u2-t3)
+*----------------------
+ t1 = a(jf+j) + a(ji+j)
+ t2 = a(jg+j) - 0.5 * t1
+ t3 = c1 * ( a(jf+j) - a(ji+j) )
+ t1 = a(jg+j) + t1
+ a(jg+j) = a(jc+j)
+ u1 = b(jf+j) + b(ji+j)
+ u2 = b(jg+j) - 0.5 * u1
+ u3 = c1 * ( b(jf+j) - b(ji+j) )
+ u1 = b(jg+j) + u1
+ b(jg+j) = b(jc+j)
+ a(jc+j) = t1
+ b(jc+j) = u1
+ a(jf+j) = co1*(t2-u3) - si1*(u2+t3)
+ b(jf+j) = si1*(t2-u3) + co1*(u2+t3)
+ a(ji+j) = co2*(t2+u3) - si2*(u2-t3)
+ b(ji+j) = si2*(t2+u3) + co2*(u2-t3)
+ j = j + jump
+ 440 continue
+*-----(end of loop across transforms)
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 445 continue
+ 450 continue
+ 460 continue
+*-----( end of double loop for this k )
+ kk = kk + 2*la
+ 470 continue
+*-----( end of loop over values of k )
+ la = 3*la
+ 480 continue
+*-----( end of loop on type II radix-3 passes )
+*-----( nvex transforms completed)
+ 490 continue
+ istart = istart + nvex * jump
+ 500 continue
+*-----( end of loop on blocks of transforms )
+*
+ return
+ end
diff --git a/fft/gpfa5.F b/fft/gpfa5.F
new file mode 100755
index 0000000..6e951ef
--- /dev/null
+++ b/fft/gpfa5.F
@@ -0,0 +1,719 @@
+ subroutine gpfa5(a,b,trigs,inc,jump,n,mm,lot,isign)
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+* fortran version of *gpfa5* -
+* radix-5 section of self-sorting, in-place,
+* generalized pfa
+*
+*-------------------------------------------------------------------
+*
+ dimension a(*), b(*), trigs(*)
+ data sin36/0.587785252292473/, sin72/0.951056516295154/,
+ * qrt5/0.559016994374947/
+ data lvr/128/
+*
+* ***************************************************************
+* * *
+* * N.B. LVR = LENGTH OF VECTOR REGISTERS, SET TO 128 FOR C90. *
+* * RESET TO 64 FOR OTHER CRAY MACHINES, OR TO ANY LARGE VALUE *
+* * (GREATER THAN OR EQUAL TO LOT) FOR A SCALAR COMPUTER. *
+* * *
+* ***************************************************************
+*
+ n5 = 5 ** mm
+ inq = n / n5
+ jstepx = (n5-n) * inc
+ ninc = n * inc
+ ink = inc * inq
+ mu = mod(inq,5)
+ if (isign.eq.-1) mu = 5 - mu
+*
+ m = mm
+ mh = (m+1)/2
+ s = float(isign)
+ c1 = qrt5
+ c2 = sin72
+ c3 = sin36
+ if (mu.eq.2.or.mu.eq.3) then
+ c1 = -c1
+ c2 = sin36
+ c3 = sin72
+ endif
+ if (mu.eq.3.or.mu.eq.4) c2 = -c2
+ if (mu.eq.2.or.mu.eq.4) c3 = -c3
+*
+ nblox = 1 + (lot-1)/lvr
+ left = lot
+ s = float(isign)
+ istart = 1
+*
+* loop on blocks of lvr transforms
+* --------------------------------
+ do 500 nb = 1 , nblox
+*
+ if (left.le.lvr) then
+ nvex = left
+ else if (left.lt.(2*lvr)) then
+ nvex = left/2
+ nvex = nvex + mod(nvex,2)
+ else
+ nvex = lvr
+ endif
+ left = left - nvex
+*
+ la = 1
+*
+* loop on type I radix-5 passes
+* -----------------------------
+ do 160 ipass = 1 , mh
+ jstep = (n*inc) / (5*la)
+ jstepl = jstep - ninc
+ kk = 0
+*
+* loop on k
+* ---------
+ do 150 k = 0 , jstep-ink , ink
+*
+ if (k.gt.0) then
+ co1 = trigs(kk+1)
+ si1 = s*trigs(kk+2)
+ co2 = trigs(2*kk+1)
+ si2 = s*trigs(2*kk+2)
+ co3 = trigs(3*kk+1)
+ si3 = s*trigs(3*kk+2)
+ co4 = trigs(4*kk+1)
+ si4 = s*trigs(4*kk+2)
+ endif
+*
+* loop along transform
+* --------------------
+ do 140 jjj = k , (n-1)*inc , 5*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 135 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = jc + jstepl
+ if (jd.lt.istart) jd = jd + ninc
+ je = jd + jstepl
+ if (je.lt.istart) je = je + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+ if (k.eq.0) then
+*
+#ifdef _CRAY
+cdir$ ivdep,shortloop
+#endif
+ do 110 l = 1 , nvex
+ t1 = a(jb+j) + a(je+j)
+ t2 = a(jc+j) + a(jd+j)
+ t3 = a(jb+j) - a(je+j)
+ t4 = a(jc+j) - a(jd+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(ja+j) - 0.25 * t5
+ a(ja+j) = a(ja+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ u1 = b(jb+j) + b(je+j)
+ u2 = b(jc+j) + b(jd+j)
+ u3 = b(jb+j) - b(je+j)
+ u4 = b(jc+j) - b(jd+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(ja+j) - 0.25 * u5
+ b(ja+j) = b(ja+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ a(jb+j) = t8 - u11
+ b(jb+j) = u8 + t11
+ a(je+j) = t8 + u11
+ b(je+j) = u8 - t11
+ a(jc+j) = t9 - u10
+ b(jc+j) = u9 + t10
+ a(jd+j) = t9 + u10
+ b(jd+j) = u9 - t10
+ j = j + jump
+ 110 continue
+*
+ else
+*
+#ifdef _CRAY
+cdir$ ivdep,shortloop
+#endif
+ do 130 l = 1 , nvex
+ t1 = a(jb+j) + a(je+j)
+ t2 = a(jc+j) + a(jd+j)
+ t3 = a(jb+j) - a(je+j)
+ t4 = a(jc+j) - a(jd+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(ja+j) - 0.25 * t5
+ a(ja+j) = a(ja+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ u1 = b(jb+j) + b(je+j)
+ u2 = b(jc+j) + b(jd+j)
+ u3 = b(jb+j) - b(je+j)
+ u4 = b(jc+j) - b(jd+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(ja+j) - 0.25 * u5
+ b(ja+j) = b(ja+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ a(jb+j) = co1*(t8-u11) - si1*(u8+t11)
+ b(jb+j) = si1*(t8-u11) + co1*(u8+t11)
+ a(je+j) = co4*(t8+u11) - si4*(u8-t11)
+ b(je+j) = si4*(t8+u11) + co4*(u8-t11)
+ a(jc+j) = co2*(t9-u10) - si2*(u9+t10)
+ b(jc+j) = si2*(t9-u10) + co2*(u9+t10)
+ a(jd+j) = co3*(t9+u10) - si3*(u9-t10)
+ b(jd+j) = si3*(t9+u10) + co3*(u9-t10)
+ j = j + jump
+ 130 continue
+*
+ endif
+*
+*-----( end of loop across transforms )
+*
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 135 continue
+ 140 continue
+*-----( end of loop along transforms )
+ kk = kk + 2*la
+ 150 continue
+*-----( end of loop on nonzero k )
+ la = 5*la
+ 160 continue
+*-----( end of loop on type I radix-5 passes)
+*
+ if (n.eq.5) go to 490
+*
+* loop on type II radix-5 passes
+* ------------------------------
+ 400 continue
+*
+ do 480 ipass = mh+1 , m
+ jstep = (n*inc) / (5*la)
+ jstepl = jstep - ninc
+ laincl = la * ink - ninc
+ kk = 0
+*
+* loop on k
+* ---------
+ do 470 k = 0 , jstep-ink , ink
+*
+ if (k.gt.0) then
+ co1 = trigs(kk+1)
+ si1 = s*trigs(kk+2)
+ co2 = trigs(2*kk+1)
+ si2 = s*trigs(2*kk+2)
+ co3 = trigs(3*kk+1)
+ si3 = s*trigs(3*kk+2)
+ co4 = trigs(4*kk+1)
+ si4 = s*trigs(4*kk+2)
+ endif
+*
+* double loop along first transform in block
+* ------------------------------------------
+ do 460 ll = k , (la-1)*ink , 5*jstep
+*
+ do 450 jjj = ll , (n-1)*inc , 5*la*ink
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 445 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = jc + jstepl
+ if (jd.lt.istart) jd = jd + ninc
+ je = jd + jstepl
+ if (je.lt.istart) je = je + ninc
+ jf = ja + laincl
+ if (jf.lt.istart) jf = jf + ninc
+ jg = jf + jstepl
+ if (jg.lt.istart) jg = jg + ninc
+ jh = jg + jstepl
+ if (jh.lt.istart) jh = jh + ninc
+ ji = jh + jstepl
+ if (ji.lt.istart) ji = ji + ninc
+ jj = ji + jstepl
+ if (jj.lt.istart) jj = jj + ninc
+ jk = jf + laincl
+ if (jk.lt.istart) jk = jk + ninc
+ jl = jk + jstepl
+ if (jl.lt.istart) jl = jl + ninc
+ jm = jl + jstepl
+ if (jm.lt.istart) jm = jm + ninc
+ jn = jm + jstepl
+ if (jn.lt.istart) jn = jn + ninc
+ jo = jn + jstepl
+ if (jo.lt.istart) jo = jo + ninc
+ jp = jk + laincl
+ if (jp.lt.istart) jp = jp + ninc
+ jq = jp + jstepl
+ if (jq.lt.istart) jq = jq + ninc
+ jr = jq + jstepl
+ if (jr.lt.istart) jr = jr + ninc
+ js = jr + jstepl
+ if (js.lt.istart) js = js + ninc
+ jt = js + jstepl
+ if (jt.lt.istart) jt = jt + ninc
+ ju = jp + laincl
+ if (ju.lt.istart) ju = ju + ninc
+ jv = ju + jstepl
+ if (jv.lt.istart) jv = jv + ninc
+ jw = jv + jstepl
+ if (jw.lt.istart) jw = jw + ninc
+ jx = jw + jstepl
+ if (jx.lt.istart) jx = jx + ninc
+ jy = jx + jstepl
+ if (jy.lt.istart) jy = jy + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+ if (k.eq.0) then
+*
+#ifdef _CRAY
+cdir$ ivdep,shortloop
+#endif
+ do 410 l = 1 , nvex
+ t1 = a(jb+j) + a(je+j)
+ t2 = a(jc+j) + a(jd+j)
+ t3 = a(jb+j) - a(je+j)
+ t4 = a(jc+j) - a(jd+j)
+ a(jb+j) = a(jf+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(ja+j) - 0.25 * t5
+ a(ja+j) = a(ja+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(jc+j) = a(jk+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ u1 = b(jb+j) + b(je+j)
+ u2 = b(jc+j) + b(jd+j)
+ u3 = b(jb+j) - b(je+j)
+ u4 = b(jc+j) - b(jd+j)
+ b(jb+j) = b(jf+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(ja+j) - 0.25 * u5
+ b(ja+j) = b(ja+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(jc+j) = b(jk+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ a(jf+j) = t8 - u11
+ b(jf+j) = u8 + t11
+ a(je+j) = t8 + u11
+ b(je+j) = u8 - t11
+ a(jk+j) = t9 - u10
+ b(jk+j) = u9 + t10
+ a(jd+j) = t9 + u10
+ b(jd+j) = u9 - t10
+*----------------------
+ t1 = a(jg+j) + a(jj+j)
+ t2 = a(jh+j) + a(ji+j)
+ t3 = a(jg+j) - a(jj+j)
+ t4 = a(jh+j) - a(ji+j)
+ a(jh+j) = a(jl+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(jb+j) - 0.25 * t5
+ a(jb+j) = a(jb+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(ji+j) = a(jq+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ u1 = b(jg+j) + b(jj+j)
+ u2 = b(jh+j) + b(ji+j)
+ u3 = b(jg+j) - b(jj+j)
+ u4 = b(jh+j) - b(ji+j)
+ b(jh+j) = b(jl+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(jb+j) - 0.25 * u5
+ b(jb+j) = b(jb+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(ji+j) = b(jq+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ a(jg+j) = t8 - u11
+ b(jg+j) = u8 + t11
+ a(jj+j) = t8 + u11
+ b(jj+j) = u8 - t11
+ a(jl+j) = t9 - u10
+ b(jl+j) = u9 + t10
+ a(jq+j) = t9 + u10
+ b(jq+j) = u9 - t10
+*----------------------
+ t1 = a(jh+j) + a(jo+j)
+ t2 = a(jm+j) + a(jn+j)
+ t3 = a(jh+j) - a(jo+j)
+ t4 = a(jm+j) - a(jn+j)
+ a(jn+j) = a(jr+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(jc+j) - 0.25 * t5
+ a(jc+j) = a(jc+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(jo+j) = a(jw+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ u1 = b(jh+j) + b(jo+j)
+ u2 = b(jm+j) + b(jn+j)
+ u3 = b(jh+j) - b(jo+j)
+ u4 = b(jm+j) - b(jn+j)
+ b(jn+j) = b(jr+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(jc+j) - 0.25 * u5
+ b(jc+j) = b(jc+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(jo+j) = b(jw+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ a(jh+j) = t8 - u11
+ b(jh+j) = u8 + t11
+ a(jw+j) = t8 + u11
+ b(jw+j) = u8 - t11
+ a(jm+j) = t9 - u10
+ b(jm+j) = u9 + t10
+ a(jr+j) = t9 + u10
+ b(jr+j) = u9 - t10
+*----------------------
+ t1 = a(ji+j) + a(jt+j)
+ t2 = a(jn+j) + a(js+j)
+ t3 = a(ji+j) - a(jt+j)
+ t4 = a(jn+j) - a(js+j)
+ a(jt+j) = a(jx+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(jp+j) - 0.25 * t5
+ ax = a(jp+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(jp+j) = a(jd+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ a(jd+j) = ax
+ u1 = b(ji+j) + b(jt+j)
+ u2 = b(jn+j) + b(js+j)
+ u3 = b(ji+j) - b(jt+j)
+ u4 = b(jn+j) - b(js+j)
+ b(jt+j) = b(jx+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(jp+j) - 0.25 * u5
+ bx = b(jp+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(jp+j) = b(jd+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ b(jd+j) = bx
+ a(ji+j) = t8 - u11
+ b(ji+j) = u8 + t11
+ a(jx+j) = t8 + u11
+ b(jx+j) = u8 - t11
+ a(jn+j) = t9 - u10
+ b(jn+j) = u9 + t10
+ a(js+j) = t9 + u10
+ b(js+j) = u9 - t10
+*----------------------
+ t1 = a(jv+j) + a(jy+j)
+ t2 = a(jo+j) + a(jt+j)
+ t3 = a(jv+j) - a(jy+j)
+ t4 = a(jo+j) - a(jt+j)
+ a(jv+j) = a(jj+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(ju+j) - 0.25 * t5
+ ax = a(ju+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(ju+j) = a(je+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ a(je+j) = ax
+ u1 = b(jv+j) + b(jy+j)
+ u2 = b(jo+j) + b(jt+j)
+ u3 = b(jv+j) - b(jy+j)
+ u4 = b(jo+j) - b(jt+j)
+ b(jv+j) = b(jj+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(ju+j) - 0.25 * u5
+ bx = b(ju+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(ju+j) = b(je+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ b(je+j) = bx
+ a(jj+j) = t8 - u11
+ b(jj+j) = u8 + t11
+ a(jy+j) = t8 + u11
+ b(jy+j) = u8 - t11
+ a(jo+j) = t9 - u10
+ b(jo+j) = u9 + t10
+ a(jt+j) = t9 + u10
+ b(jt+j) = u9 - t10
+ j = j + jump
+ 410 continue
+*
+ else
+*
+#ifdef _CRAY
+cdir$ ivdep,shortloop
+#endif
+ do 440 l = 1 , nvex
+ t1 = a(jb+j) + a(je+j)
+ t2 = a(jc+j) + a(jd+j)
+ t3 = a(jb+j) - a(je+j)
+ t4 = a(jc+j) - a(jd+j)
+ a(jb+j) = a(jf+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(ja+j) - 0.25 * t5
+ a(ja+j) = a(ja+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(jc+j) = a(jk+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ u1 = b(jb+j) + b(je+j)
+ u2 = b(jc+j) + b(jd+j)
+ u3 = b(jb+j) - b(je+j)
+ u4 = b(jc+j) - b(jd+j)
+ b(jb+j) = b(jf+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(ja+j) - 0.25 * u5
+ b(ja+j) = b(ja+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(jc+j) = b(jk+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ a(jf+j) = co1*(t8-u11) - si1*(u8+t11)
+ b(jf+j) = si1*(t8-u11) + co1*(u8+t11)
+ a(je+j) = co4*(t8+u11) - si4*(u8-t11)
+ b(je+j) = si4*(t8+u11) + co4*(u8-t11)
+ a(jk+j) = co2*(t9-u10) - si2*(u9+t10)
+ b(jk+j) = si2*(t9-u10) + co2*(u9+t10)
+ a(jd+j) = co3*(t9+u10) - si3*(u9-t10)
+ b(jd+j) = si3*(t9+u10) + co3*(u9-t10)
+*----------------------
+ t1 = a(jg+j) + a(jj+j)
+ t2 = a(jh+j) + a(ji+j)
+ t3 = a(jg+j) - a(jj+j)
+ t4 = a(jh+j) - a(ji+j)
+ a(jh+j) = a(jl+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(jb+j) - 0.25 * t5
+ a(jb+j) = a(jb+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(ji+j) = a(jq+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ u1 = b(jg+j) + b(jj+j)
+ u2 = b(jh+j) + b(ji+j)
+ u3 = b(jg+j) - b(jj+j)
+ u4 = b(jh+j) - b(ji+j)
+ b(jh+j) = b(jl+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(jb+j) - 0.25 * u5
+ b(jb+j) = b(jb+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(ji+j) = b(jq+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ a(jg+j) = co1*(t8-u11) - si1*(u8+t11)
+ b(jg+j) = si1*(t8-u11) + co1*(u8+t11)
+ a(jj+j) = co4*(t8+u11) - si4*(u8-t11)
+ b(jj+j) = si4*(t8+u11) + co4*(u8-t11)
+ a(jl+j) = co2*(t9-u10) - si2*(u9+t10)
+ b(jl+j) = si2*(t9-u10) + co2*(u9+t10)
+ a(jq+j) = co3*(t9+u10) - si3*(u9-t10)
+ b(jq+j) = si3*(t9+u10) + co3*(u9-t10)
+*----------------------
+ t1 = a(jh+j) + a(jo+j)
+ t2 = a(jm+j) + a(jn+j)
+ t3 = a(jh+j) - a(jo+j)
+ t4 = a(jm+j) - a(jn+j)
+ a(jn+j) = a(jr+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(jc+j) - 0.25 * t5
+ a(jc+j) = a(jc+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(jo+j) = a(jw+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ u1 = b(jh+j) + b(jo+j)
+ u2 = b(jm+j) + b(jn+j)
+ u3 = b(jh+j) - b(jo+j)
+ u4 = b(jm+j) - b(jn+j)
+ b(jn+j) = b(jr+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(jc+j) - 0.25 * u5
+ b(jc+j) = b(jc+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(jo+j) = b(jw+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ a(jh+j) = co1*(t8-u11) - si1*(u8+t11)
+ b(jh+j) = si1*(t8-u11) + co1*(u8+t11)
+ a(jw+j) = co4*(t8+u11) - si4*(u8-t11)
+ b(jw+j) = si4*(t8+u11) + co4*(u8-t11)
+ a(jm+j) = co2*(t9-u10) - si2*(u9+t10)
+ b(jm+j) = si2*(t9-u10) + co2*(u9+t10)
+ a(jr+j) = co3*(t9+u10) - si3*(u9-t10)
+ b(jr+j) = si3*(t9+u10) + co3*(u9-t10)
+*----------------------
+ t1 = a(ji+j) + a(jt+j)
+ t2 = a(jn+j) + a(js+j)
+ t3 = a(ji+j) - a(jt+j)
+ t4 = a(jn+j) - a(js+j)
+ a(jt+j) = a(jx+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(jp+j) - 0.25 * t5
+ ax = a(jp+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(jp+j) = a(jd+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ a(jd+j) = ax
+ u1 = b(ji+j) + b(jt+j)
+ u2 = b(jn+j) + b(js+j)
+ u3 = b(ji+j) - b(jt+j)
+ u4 = b(jn+j) - b(js+j)
+ b(jt+j) = b(jx+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(jp+j) - 0.25 * u5
+ bx = b(jp+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(jp+j) = b(jd+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ b(jd+j) = bx
+ a(ji+j) = co1*(t8-u11) - si1*(u8+t11)
+ b(ji+j) = si1*(t8-u11) + co1*(u8+t11)
+ a(jx+j) = co4*(t8+u11) - si4*(u8-t11)
+ b(jx+j) = si4*(t8+u11) + co4*(u8-t11)
+ a(jn+j) = co2*(t9-u10) - si2*(u9+t10)
+ b(jn+j) = si2*(t9-u10) + co2*(u9+t10)
+ a(js+j) = co3*(t9+u10) - si3*(u9-t10)
+ b(js+j) = si3*(t9+u10) + co3*(u9-t10)
+*----------------------
+ t1 = a(jv+j) + a(jy+j)
+ t2 = a(jo+j) + a(jt+j)
+ t3 = a(jv+j) - a(jy+j)
+ t4 = a(jo+j) - a(jt+j)
+ a(jv+j) = a(jj+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(ju+j) - 0.25 * t5
+ ax = a(ju+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(ju+j) = a(je+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ a(je+j) = ax
+ u1 = b(jv+j) + b(jy+j)
+ u2 = b(jo+j) + b(jt+j)
+ u3 = b(jv+j) - b(jy+j)
+ u4 = b(jo+j) - b(jt+j)
+ b(jv+j) = b(jj+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(ju+j) - 0.25 * u5
+ bx = b(ju+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(ju+j) = b(je+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ b(je+j) = bx
+ a(jj+j) = co1*(t8-u11) - si1*(u8+t11)
+ b(jj+j) = si1*(t8-u11) + co1*(u8+t11)
+ a(jy+j) = co4*(t8+u11) - si4*(u8-t11)
+ b(jy+j) = si4*(t8+u11) + co4*(u8-t11)
+ a(jo+j) = co2*(t9-u10) - si2*(u9+t10)
+ b(jo+j) = si2*(t9-u10) + co2*(u9+t10)
+ a(jt+j) = co3*(t9+u10) - si3*(u9-t10)
+ b(jt+j) = si3*(t9+u10) + co3*(u9-t10)
+ j = j + jump
+ 440 continue
+*
+ endif
+*
+*-----(end of loop across transforms)
+*
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 445 continue
+ 450 continue
+ 460 continue
+*-----( end of double loop for this k )
+ kk = kk + 2*la
+ 470 continue
+*-----( end of loop over values of k )
+ la = 5*la
+ 480 continue
+*-----( end of loop on type II radix-5 passes )
+*-----( nvex transforms completed)
+ 490 continue
+ istart = istart + nvex * jump
+ 500 continue
+*-----( end of loop on blocks of transforms )
+*
+ return
+ end
diff --git a/fft/gpfa5.f b/fft/gpfa5.f
new file mode 100755
index 0000000..8c43f48
--- /dev/null
+++ b/fft/gpfa5.f
@@ -0,0 +1,708 @@
+c Copyright 1981-2012 ECMWF.
+c
+c This software is licensed under the terms of the Apache Licence
+c Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+c
+c In applying this licence, ECMWF does not waive the privileges and immunities
+c granted to it by virtue of its status as an intergovernmental organisation
+c nor does it submit to any jurisdiction.
+c
+
+ subroutine gpfa5(a,b,trigs,inc,jump,n,mm,lot,isign)
+* fortran version of *gpfa5* -
+* radix-5 section of self-sorting, in-place,
+* generalized pfa
+*
+*-------------------------------------------------------------------
+*
+ dimension a(*), b(*), trigs(*)
+ data sin36/0.587785252292473/, sin72/0.951056516295154/,
+ * qrt5/0.559016994374947/
+ data lvr/128/
+*
+* ***************************************************************
+* * *
+* * N.B. LVR = LENGTH OF VECTOR REGISTERS, SET TO 128 FOR C90. *
+* * RESET TO 64 FOR OTHER CRAY MACHINES, OR TO ANY LARGE VALUE *
+* * (GREATER THAN OR EQUAL TO LOT) FOR A SCALAR COMPUTER. *
+* * *
+* ***************************************************************
+*
+ n5 = 5 ** mm
+ inq = n / n5
+ jstepx = (n5-n) * inc
+ ninc = n * inc
+ ink = inc * inq
+ mu = mod(inq,5)
+ if (isign.eq.-1) mu = 5 - mu
+*
+ m = mm
+ mh = (m+1)/2
+ s = float(isign)
+ c1 = qrt5
+ c2 = sin72
+ c3 = sin36
+ if (mu.eq.2.or.mu.eq.3) then
+ c1 = -c1
+ c2 = sin36
+ c3 = sin72
+ endif
+ if (mu.eq.3.or.mu.eq.4) c2 = -c2
+ if (mu.eq.2.or.mu.eq.4) c3 = -c3
+*
+ nblox = 1 + (lot-1)/lvr
+ left = lot
+ s = float(isign)
+ istart = 1
+*
+* loop on blocks of lvr transforms
+* --------------------------------
+ do 500 nb = 1 , nblox
+*
+ if (left.le.lvr) then
+ nvex = left
+ else if (left.lt.(2*lvr)) then
+ nvex = left/2
+ nvex = nvex + mod(nvex,2)
+ else
+ nvex = lvr
+ endif
+ left = left - nvex
+*
+ la = 1
+*
+* loop on type I radix-5 passes
+* -----------------------------
+ do 160 ipass = 1 , mh
+ jstep = (n*inc) / (5*la)
+ jstepl = jstep - ninc
+ kk = 0
+*
+* loop on k
+* ---------
+ do 150 k = 0 , jstep-ink , ink
+*
+ if (k.gt.0) then
+ co1 = trigs(kk+1)
+ si1 = s*trigs(kk+2)
+ co2 = trigs(2*kk+1)
+ si2 = s*trigs(2*kk+2)
+ co3 = trigs(3*kk+1)
+ si3 = s*trigs(3*kk+2)
+ co4 = trigs(4*kk+1)
+ si4 = s*trigs(4*kk+2)
+ endif
+*
+* loop along transform
+* --------------------
+ do 140 jjj = k , (n-1)*inc , 5*jstep
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 135 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = jc + jstepl
+ if (jd.lt.istart) jd = jd + ninc
+ je = jd + jstepl
+ if (je.lt.istart) je = je + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+ if (k.eq.0) then
+*
+ do 110 l = 1 , nvex
+ t1 = a(jb+j) + a(je+j)
+ t2 = a(jc+j) + a(jd+j)
+ t3 = a(jb+j) - a(je+j)
+ t4 = a(jc+j) - a(jd+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(ja+j) - 0.25 * t5
+ a(ja+j) = a(ja+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ u1 = b(jb+j) + b(je+j)
+ u2 = b(jc+j) + b(jd+j)
+ u3 = b(jb+j) - b(je+j)
+ u4 = b(jc+j) - b(jd+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(ja+j) - 0.25 * u5
+ b(ja+j) = b(ja+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ a(jb+j) = t8 - u11
+ b(jb+j) = u8 + t11
+ a(je+j) = t8 + u11
+ b(je+j) = u8 - t11
+ a(jc+j) = t9 - u10
+ b(jc+j) = u9 + t10
+ a(jd+j) = t9 + u10
+ b(jd+j) = u9 - t10
+ j = j + jump
+ 110 continue
+*
+ else
+*
+ do 130 l = 1 , nvex
+ t1 = a(jb+j) + a(je+j)
+ t2 = a(jc+j) + a(jd+j)
+ t3 = a(jb+j) - a(je+j)
+ t4 = a(jc+j) - a(jd+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(ja+j) - 0.25 * t5
+ a(ja+j) = a(ja+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ u1 = b(jb+j) + b(je+j)
+ u2 = b(jc+j) + b(jd+j)
+ u3 = b(jb+j) - b(je+j)
+ u4 = b(jc+j) - b(jd+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(ja+j) - 0.25 * u5
+ b(ja+j) = b(ja+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ a(jb+j) = co1*(t8-u11) - si1*(u8+t11)
+ b(jb+j) = si1*(t8-u11) + co1*(u8+t11)
+ a(je+j) = co4*(t8+u11) - si4*(u8-t11)
+ b(je+j) = si4*(t8+u11) + co4*(u8-t11)
+ a(jc+j) = co2*(t9-u10) - si2*(u9+t10)
+ b(jc+j) = si2*(t9-u10) + co2*(u9+t10)
+ a(jd+j) = co3*(t9+u10) - si3*(u9-t10)
+ b(jd+j) = si3*(t9+u10) + co3*(u9-t10)
+ j = j + jump
+ 130 continue
+*
+ endif
+*
+*-----( end of loop across transforms )
+*
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 135 continue
+ 140 continue
+*-----( end of loop along transforms )
+ kk = kk + 2*la
+ 150 continue
+*-----( end of loop on nonzero k )
+ la = 5*la
+ 160 continue
+*-----( end of loop on type I radix-5 passes)
+*
+ if (n.eq.5) go to 490
+*
+* loop on type II radix-5 passes
+* ------------------------------
+ 400 continue
+*
+ do 480 ipass = mh+1 , m
+ jstep = (n*inc) / (5*la)
+ jstepl = jstep - ninc
+ laincl = la * ink - ninc
+ kk = 0
+*
+* loop on k
+* ---------
+ do 470 k = 0 , jstep-ink , ink
+*
+ if (k.gt.0) then
+ co1 = trigs(kk+1)
+ si1 = s*trigs(kk+2)
+ co2 = trigs(2*kk+1)
+ si2 = s*trigs(2*kk+2)
+ co3 = trigs(3*kk+1)
+ si3 = s*trigs(3*kk+2)
+ co4 = trigs(4*kk+1)
+ si4 = s*trigs(4*kk+2)
+ endif
+*
+* double loop along first transform in block
+* ------------------------------------------
+ do 460 ll = k , (la-1)*ink , 5*jstep
+*
+ do 450 jjj = ll , (n-1)*inc , 5*la*ink
+ ja = istart + jjj
+*
+* "transverse" loop
+* -----------------
+ do 445 nu = 1 , inq
+ jb = ja + jstepl
+ if (jb.lt.istart) jb = jb + ninc
+ jc = jb + jstepl
+ if (jc.lt.istart) jc = jc + ninc
+ jd = jc + jstepl
+ if (jd.lt.istart) jd = jd + ninc
+ je = jd + jstepl
+ if (je.lt.istart) je = je + ninc
+ jf = ja + laincl
+ if (jf.lt.istart) jf = jf + ninc
+ jg = jf + jstepl
+ if (jg.lt.istart) jg = jg + ninc
+ jh = jg + jstepl
+ if (jh.lt.istart) jh = jh + ninc
+ ji = jh + jstepl
+ if (ji.lt.istart) ji = ji + ninc
+ jj = ji + jstepl
+ if (jj.lt.istart) jj = jj + ninc
+ jk = jf + laincl
+ if (jk.lt.istart) jk = jk + ninc
+ jl = jk + jstepl
+ if (jl.lt.istart) jl = jl + ninc
+ jm = jl + jstepl
+ if (jm.lt.istart) jm = jm + ninc
+ jn = jm + jstepl
+ if (jn.lt.istart) jn = jn + ninc
+ jo = jn + jstepl
+ if (jo.lt.istart) jo = jo + ninc
+ jp = jk + laincl
+ if (jp.lt.istart) jp = jp + ninc
+ jq = jp + jstepl
+ if (jq.lt.istart) jq = jq + ninc
+ jr = jq + jstepl
+ if (jr.lt.istart) jr = jr + ninc
+ js = jr + jstepl
+ if (js.lt.istart) js = js + ninc
+ jt = js + jstepl
+ if (jt.lt.istart) jt = jt + ninc
+ ju = jp + laincl
+ if (ju.lt.istart) ju = ju + ninc
+ jv = ju + jstepl
+ if (jv.lt.istart) jv = jv + ninc
+ jw = jv + jstepl
+ if (jw.lt.istart) jw = jw + ninc
+ jx = jw + jstepl
+ if (jx.lt.istart) jx = jx + ninc
+ jy = jx + jstepl
+ if (jy.lt.istart) jy = jy + ninc
+ j = 0
+*
+* loop across transforms
+* ----------------------
+ if (k.eq.0) then
+*
+ do 410 l = 1 , nvex
+ t1 = a(jb+j) + a(je+j)
+ t2 = a(jc+j) + a(jd+j)
+ t3 = a(jb+j) - a(je+j)
+ t4 = a(jc+j) - a(jd+j)
+ a(jb+j) = a(jf+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(ja+j) - 0.25 * t5
+ a(ja+j) = a(ja+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(jc+j) = a(jk+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ u1 = b(jb+j) + b(je+j)
+ u2 = b(jc+j) + b(jd+j)
+ u3 = b(jb+j) - b(je+j)
+ u4 = b(jc+j) - b(jd+j)
+ b(jb+j) = b(jf+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(ja+j) - 0.25 * u5
+ b(ja+j) = b(ja+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(jc+j) = b(jk+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ a(jf+j) = t8 - u11
+ b(jf+j) = u8 + t11
+ a(je+j) = t8 + u11
+ b(je+j) = u8 - t11
+ a(jk+j) = t9 - u10
+ b(jk+j) = u9 + t10
+ a(jd+j) = t9 + u10
+ b(jd+j) = u9 - t10
+*----------------------
+ t1 = a(jg+j) + a(jj+j)
+ t2 = a(jh+j) + a(ji+j)
+ t3 = a(jg+j) - a(jj+j)
+ t4 = a(jh+j) - a(ji+j)
+ a(jh+j) = a(jl+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(jb+j) - 0.25 * t5
+ a(jb+j) = a(jb+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(ji+j) = a(jq+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ u1 = b(jg+j) + b(jj+j)
+ u2 = b(jh+j) + b(ji+j)
+ u3 = b(jg+j) - b(jj+j)
+ u4 = b(jh+j) - b(ji+j)
+ b(jh+j) = b(jl+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(jb+j) - 0.25 * u5
+ b(jb+j) = b(jb+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(ji+j) = b(jq+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ a(jg+j) = t8 - u11
+ b(jg+j) = u8 + t11
+ a(jj+j) = t8 + u11
+ b(jj+j) = u8 - t11
+ a(jl+j) = t9 - u10
+ b(jl+j) = u9 + t10
+ a(jq+j) = t9 + u10
+ b(jq+j) = u9 - t10
+*----------------------
+ t1 = a(jh+j) + a(jo+j)
+ t2 = a(jm+j) + a(jn+j)
+ t3 = a(jh+j) - a(jo+j)
+ t4 = a(jm+j) - a(jn+j)
+ a(jn+j) = a(jr+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(jc+j) - 0.25 * t5
+ a(jc+j) = a(jc+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(jo+j) = a(jw+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ u1 = b(jh+j) + b(jo+j)
+ u2 = b(jm+j) + b(jn+j)
+ u3 = b(jh+j) - b(jo+j)
+ u4 = b(jm+j) - b(jn+j)
+ b(jn+j) = b(jr+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(jc+j) - 0.25 * u5
+ b(jc+j) = b(jc+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(jo+j) = b(jw+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ a(jh+j) = t8 - u11
+ b(jh+j) = u8 + t11
+ a(jw+j) = t8 + u11
+ b(jw+j) = u8 - t11
+ a(jm+j) = t9 - u10
+ b(jm+j) = u9 + t10
+ a(jr+j) = t9 + u10
+ b(jr+j) = u9 - t10
+*----------------------
+ t1 = a(ji+j) + a(jt+j)
+ t2 = a(jn+j) + a(js+j)
+ t3 = a(ji+j) - a(jt+j)
+ t4 = a(jn+j) - a(js+j)
+ a(jt+j) = a(jx+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(jp+j) - 0.25 * t5
+ ax = a(jp+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(jp+j) = a(jd+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ a(jd+j) = ax
+ u1 = b(ji+j) + b(jt+j)
+ u2 = b(jn+j) + b(js+j)
+ u3 = b(ji+j) - b(jt+j)
+ u4 = b(jn+j) - b(js+j)
+ b(jt+j) = b(jx+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(jp+j) - 0.25 * u5
+ bx = b(jp+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(jp+j) = b(jd+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ b(jd+j) = bx
+ a(ji+j) = t8 - u11
+ b(ji+j) = u8 + t11
+ a(jx+j) = t8 + u11
+ b(jx+j) = u8 - t11
+ a(jn+j) = t9 - u10
+ b(jn+j) = u9 + t10
+ a(js+j) = t9 + u10
+ b(js+j) = u9 - t10
+*----------------------
+ t1 = a(jv+j) + a(jy+j)
+ t2 = a(jo+j) + a(jt+j)
+ t3 = a(jv+j) - a(jy+j)
+ t4 = a(jo+j) - a(jt+j)
+ a(jv+j) = a(jj+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(ju+j) - 0.25 * t5
+ ax = a(ju+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(ju+j) = a(je+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ a(je+j) = ax
+ u1 = b(jv+j) + b(jy+j)
+ u2 = b(jo+j) + b(jt+j)
+ u3 = b(jv+j) - b(jy+j)
+ u4 = b(jo+j) - b(jt+j)
+ b(jv+j) = b(jj+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(ju+j) - 0.25 * u5
+ bx = b(ju+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(ju+j) = b(je+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ b(je+j) = bx
+ a(jj+j) = t8 - u11
+ b(jj+j) = u8 + t11
+ a(jy+j) = t8 + u11
+ b(jy+j) = u8 - t11
+ a(jo+j) = t9 - u10
+ b(jo+j) = u9 + t10
+ a(jt+j) = t9 + u10
+ b(jt+j) = u9 - t10
+ j = j + jump
+ 410 continue
+*
+ else
+*
+ do 440 l = 1 , nvex
+ t1 = a(jb+j) + a(je+j)
+ t2 = a(jc+j) + a(jd+j)
+ t3 = a(jb+j) - a(je+j)
+ t4 = a(jc+j) - a(jd+j)
+ a(jb+j) = a(jf+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(ja+j) - 0.25 * t5
+ a(ja+j) = a(ja+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(jc+j) = a(jk+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ u1 = b(jb+j) + b(je+j)
+ u2 = b(jc+j) + b(jd+j)
+ u3 = b(jb+j) - b(je+j)
+ u4 = b(jc+j) - b(jd+j)
+ b(jb+j) = b(jf+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(ja+j) - 0.25 * u5
+ b(ja+j) = b(ja+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(jc+j) = b(jk+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ a(jf+j) = co1*(t8-u11) - si1*(u8+t11)
+ b(jf+j) = si1*(t8-u11) + co1*(u8+t11)
+ a(je+j) = co4*(t8+u11) - si4*(u8-t11)
+ b(je+j) = si4*(t8+u11) + co4*(u8-t11)
+ a(jk+j) = co2*(t9-u10) - si2*(u9+t10)
+ b(jk+j) = si2*(t9-u10) + co2*(u9+t10)
+ a(jd+j) = co3*(t9+u10) - si3*(u9-t10)
+ b(jd+j) = si3*(t9+u10) + co3*(u9-t10)
+*----------------------
+ t1 = a(jg+j) + a(jj+j)
+ t2 = a(jh+j) + a(ji+j)
+ t3 = a(jg+j) - a(jj+j)
+ t4 = a(jh+j) - a(ji+j)
+ a(jh+j) = a(jl+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(jb+j) - 0.25 * t5
+ a(jb+j) = a(jb+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(ji+j) = a(jq+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ u1 = b(jg+j) + b(jj+j)
+ u2 = b(jh+j) + b(ji+j)
+ u3 = b(jg+j) - b(jj+j)
+ u4 = b(jh+j) - b(ji+j)
+ b(jh+j) = b(jl+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(jb+j) - 0.25 * u5
+ b(jb+j) = b(jb+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(ji+j) = b(jq+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ a(jg+j) = co1*(t8-u11) - si1*(u8+t11)
+ b(jg+j) = si1*(t8-u11) + co1*(u8+t11)
+ a(jj+j) = co4*(t8+u11) - si4*(u8-t11)
+ b(jj+j) = si4*(t8+u11) + co4*(u8-t11)
+ a(jl+j) = co2*(t9-u10) - si2*(u9+t10)
+ b(jl+j) = si2*(t9-u10) + co2*(u9+t10)
+ a(jq+j) = co3*(t9+u10) - si3*(u9-t10)
+ b(jq+j) = si3*(t9+u10) + co3*(u9-t10)
+*----------------------
+ t1 = a(jh+j) + a(jo+j)
+ t2 = a(jm+j) + a(jn+j)
+ t3 = a(jh+j) - a(jo+j)
+ t4 = a(jm+j) - a(jn+j)
+ a(jn+j) = a(jr+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(jc+j) - 0.25 * t5
+ a(jc+j) = a(jc+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(jo+j) = a(jw+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ u1 = b(jh+j) + b(jo+j)
+ u2 = b(jm+j) + b(jn+j)
+ u3 = b(jh+j) - b(jo+j)
+ u4 = b(jm+j) - b(jn+j)
+ b(jn+j) = b(jr+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(jc+j) - 0.25 * u5
+ b(jc+j) = b(jc+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(jo+j) = b(jw+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ a(jh+j) = co1*(t8-u11) - si1*(u8+t11)
+ b(jh+j) = si1*(t8-u11) + co1*(u8+t11)
+ a(jw+j) = co4*(t8+u11) - si4*(u8-t11)
+ b(jw+j) = si4*(t8+u11) + co4*(u8-t11)
+ a(jm+j) = co2*(t9-u10) - si2*(u9+t10)
+ b(jm+j) = si2*(t9-u10) + co2*(u9+t10)
+ a(jr+j) = co3*(t9+u10) - si3*(u9-t10)
+ b(jr+j) = si3*(t9+u10) + co3*(u9-t10)
+*----------------------
+ t1 = a(ji+j) + a(jt+j)
+ t2 = a(jn+j) + a(js+j)
+ t3 = a(ji+j) - a(jt+j)
+ t4 = a(jn+j) - a(js+j)
+ a(jt+j) = a(jx+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(jp+j) - 0.25 * t5
+ ax = a(jp+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(jp+j) = a(jd+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ a(jd+j) = ax
+ u1 = b(ji+j) + b(jt+j)
+ u2 = b(jn+j) + b(js+j)
+ u3 = b(ji+j) - b(jt+j)
+ u4 = b(jn+j) - b(js+j)
+ b(jt+j) = b(jx+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(jp+j) - 0.25 * u5
+ bx = b(jp+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(jp+j) = b(jd+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ b(jd+j) = bx
+ a(ji+j) = co1*(t8-u11) - si1*(u8+t11)
+ b(ji+j) = si1*(t8-u11) + co1*(u8+t11)
+ a(jx+j) = co4*(t8+u11) - si4*(u8-t11)
+ b(jx+j) = si4*(t8+u11) + co4*(u8-t11)
+ a(jn+j) = co2*(t9-u10) - si2*(u9+t10)
+ b(jn+j) = si2*(t9-u10) + co2*(u9+t10)
+ a(js+j) = co3*(t9+u10) - si3*(u9-t10)
+ b(js+j) = si3*(t9+u10) + co3*(u9-t10)
+*----------------------
+ t1 = a(jv+j) + a(jy+j)
+ t2 = a(jo+j) + a(jt+j)
+ t3 = a(jv+j) - a(jy+j)
+ t4 = a(jo+j) - a(jt+j)
+ a(jv+j) = a(jj+j)
+ t5 = t1 + t2
+ t6 = c1 * ( t1 - t2 )
+ t7 = a(ju+j) - 0.25 * t5
+ ax = a(ju+j) + t5
+ t8 = t7 + t6
+ t9 = t7 - t6
+ a(ju+j) = a(je+j)
+ t10 = c3 * t3 - c2 * t4
+ t11 = c2 * t3 + c3 * t4
+ a(je+j) = ax
+ u1 = b(jv+j) + b(jy+j)
+ u2 = b(jo+j) + b(jt+j)
+ u3 = b(jv+j) - b(jy+j)
+ u4 = b(jo+j) - b(jt+j)
+ b(jv+j) = b(jj+j)
+ u5 = u1 + u2
+ u6 = c1 * ( u1 - u2 )
+ u7 = b(ju+j) - 0.25 * u5
+ bx = b(ju+j) + u5
+ u8 = u7 + u6
+ u9 = u7 - u6
+ b(ju+j) = b(je+j)
+ u10 = c3 * u3 - c2 * u4
+ u11 = c2 * u3 + c3 * u4
+ b(je+j) = bx
+ a(jj+j) = co1*(t8-u11) - si1*(u8+t11)
+ b(jj+j) = si1*(t8-u11) + co1*(u8+t11)
+ a(jy+j) = co4*(t8+u11) - si4*(u8-t11)
+ b(jy+j) = si4*(t8+u11) + co4*(u8-t11)
+ a(jo+j) = co2*(t9-u10) - si2*(u9+t10)
+ b(jo+j) = si2*(t9-u10) + co2*(u9+t10)
+ a(jt+j) = co3*(t9+u10) - si3*(u9-t10)
+ b(jt+j) = si3*(t9+u10) + co3*(u9-t10)
+ j = j + jump
+ 440 continue
+*
+ endif
+*
+*-----(end of loop across transforms)
+*
+ ja = ja + jstepx
+ if (ja.lt.istart) ja = ja + ninc
+ 445 continue
+ 450 continue
+ 460 continue
+*-----( end of double loop for this k )
+ kk = kk + 2*la
+ 470 continue
+*-----( end of loop over values of k )
+ la = 5*la
+ 480 continue
+*-----( end of loop on type II radix-5 passes )
+*-----( nvex transforms completed)
+ 490 continue
+ istart = istart + nvex * jump
+ 500 continue
+*-----( end of loop on blocks of transforms )
+*
+ return
+ end
diff --git a/fft/qpassf.f b/fft/qpassf.f
new file mode 100755
index 0000000..8ee711f
--- /dev/null
+++ b/fft/qpassf.f
@@ -0,0 +1,920 @@
+c Copyright 1981-2012 ECMWF.
+c
+c This software is licensed under the terms of the Apache Licence
+c Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+c
+c In applying this licence, ECMWF does not waive the privileges and immunities
+c granted to it by virtue of its status as an intergovernmental organisation
+c nor does it submit to any jurisdiction.
+c
+
+C SUBROUTINE 'QPASSF' - PERFORMS ONE PASS THROUGH DATA AS PART
+C OF MULTIPLE REAL FFT (FOURIER ANALYSIS) ROUTINE
+C
+C A IS FIRST REAL INPUT VECTOR
+C EQUIVALENCE B(1) WITH A(IFAC*LA*INC1+1)
+C C IS FIRST REAL OUTPUT VECTOR
+C EQUIVALENCE D(1) WITH C(LA*INC2+1)
+C TRIGS IS A PRECALCULATED LIST OF SINES & COSINES
+C INC1 IS THE ADDRESSING INCREMENT FOR A
+C INC2 IS THE ADDRESSING INCREMENT FOR C
+C INC3 IS THE INCREMENT BETWEEN INPUT VECTORS A
+C INC4 IS THE INCREMENT BETWEEN OUTPUT VECTORS C
+C LOT IS THE NUMBER OF VECTORS
+C N IS THE LENGTH OF THE VECTORS
+C IFAC IS THE CURRENT FACTOR OF N
+C LA = N/(PRODUCT OF FACTORS USED SO FAR)
+C IERR IS AN ERROR INDICATOR:
+C 0 - PASS COMPLETED WITHOUT ERROR
+C 2 - IFAC NOT CATERED FOR
+C 3 - IFAC ONLY CATERED FOR IF LA=N/IFAC
+C LIPL=.T. => RESULTS ARE RETURNED TO INPUT ARRAY
+C (ONLY VALID IF LA=N/IFAC, I.E. ON FIRST PASS)
+C
+C-----------------------------------------------------------------------
+C
+ SUBROUTINE QPASSF(A,B,C,D,TRIGS,INC1,INC2,INC3,INC4,LOT,N,IFAC,
+ * LA,IERR,LIPL)
+ DIMENSION A(N),B(N),C(N),D(N),TRIGS(N)
+ LOGICAL LIPL
+C
+ DATA SIN36/0.587785252292473/,SIN72/0.951056516295154/,
+ * QRT5/0.559016994374947/,SIN60/0.866025403784437/
+C
+ M=N/IFAC
+ IINK=LA*INC1
+ JINK=LA*INC2
+ IJUMP=(IFAC-1)*IINK
+ KSTOP=(N-IFAC)/(2*IFAC)
+C
+ IBASE=0
+ JBASE=0
+ IBAD=0
+C
+! Increase the vector length by fusing the loops if the
+! data layout is appropriate:
+ IF (INC1.EQ.LOT.AND.INC2.EQ.LOT.AND.INC3.EQ.1.AND.INC4.EQ.1) THEN
+ ILA=1
+ ILOT=LA*LOT
+ INC11=LA*LOT
+ ELSE
+ ILA=LA
+ ILOT=LOT
+ INC11=INC1
+ ENDIF
+
+C
+ IF (IFAC.EQ.2) THEN
+C
+C CODING FOR FACTOR 2
+C -------------------
+ 200 CONTINUE
+ IA=1
+ IB=IA+IINK
+ JA=1
+ JB=JA+(2*M-LA)*INC2
+C
+ IF (LA.NE.M) THEN
+C
+ DO 220 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 210 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+A(IB+I)
+ C(JB+J)=A(IA+I)-A(IB+I)
+ I=I+INC3
+ J=J+INC4
+ 210 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 220 CONTINUE
+ JA=JA+JINK
+ JINK=2*JINK
+ JB=JB-JINK
+ IBASE=IBASE+IJUMP
+ IJUMP=2*IJUMP+IINK
+C
+ IF (JA.LT.JB) THEN
+ DO 250 K=LA,KSTOP,LA
+ KB=K+K
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ JBASE=0
+ DO 240 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 230 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+(C1*A(IB+I)+S1*B(IB+I))
+ C(JB+J)=A(IA+I)-(C1*A(IB+I)+S1*B(IB+I))
+ D(JA+J)=(C1*B(IB+I)-S1*A(IB+I))+B(IA+I)
+ D(JB+J)=(C1*B(IB+I)-S1*A(IB+I))-B(IA+I)
+ I=I+INC3
+ J=J+INC4
+ 230 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 240 CONTINUE
+ IBASE=IBASE+IJUMP
+ JA=JA+JINK
+ JB=JB-JINK
+ 250 CONTINUE
+ ENDIF
+C
+ IF (JA.EQ.JB) THEN
+ JBASE=0
+ DO 280 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 270 IJK=1,ILOT
+ C(JA+J)=A(IA+I)
+ D(JA+J)=-A(IB+I)
+ I=I+INC3
+ J=J+INC4
+ 270 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 280 CONTINUE
+ ENDIF
+C
+ ELSE !!! Case LA=M
+ Z=1.0/FLOAT(N)
+ IF (LIPL) THEN
+ DO 294 L=1,ILA
+ I=IBASE
+!OCL NOVREC
+ DO 292 IJK=1,ILOT
+ T1=Z*(A(IA+I)-A(IB+I))
+ A(IA+I)=Z*(A(IA+I)+A(IB+I))
+ A(IB+I)=T1
+ I=I+INC3
+ 292 CONTINUE
+ IBASE=IBASE+INC11
+ 294 CONTINUE
+ ELSE
+ DO 298 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 296 IJK=1,ILOT
+ C(JA+J)=Z*(A(IA+I)+A(IB+I))
+ C(JB+J)=Z*(A(IA+I)-A(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 296 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 298 CONTINUE
+ ENDIF
+ ENDIF
+C
+ ELSEIF (IFAC.EQ.3) THEN
+C
+C CODING FOR FACTOR 3
+C -------------------
+ 300 CONTINUE
+ IA=1
+ IB=IA+IINK
+ IC=IB+IINK
+ JA=1
+ JB=JA+(2*M-LA)*INC2
+ JC=JB
+C
+ IF (LA.NE.M) THEN
+C
+ DO 320 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 310 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+(A(IB+I)+A(IC+I))
+ C(JB+J)=A(IA+I)-0.5*(A(IB+I)+A(IC+I))
+ D(JB+J)=SIN60*(A(IC+I)-A(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 310 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 320 CONTINUE
+ JA=JA+JINK
+ JINK=2*JINK
+ JB=JB+JINK
+ JC=JC-JINK
+ IBASE=IBASE+IJUMP
+ IJUMP=2*IJUMP+IINK
+C
+ IF (JA.LT.JC) THEN
+ DO 350 K=LA,KSTOP,LA
+ KB=K+K
+ KC=KB+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ JBASE=0
+ DO 340 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 330 IJK=1,ILOT
+ A1=(C1*A(IB+I)+S1*B(IB+I))+(C2*A(IC+I)+S2*B(IC+I))
+ B1=(C1*B(IB+I)-S1*A(IB+I))+(C2*B(IC+I)-S2*A(IC+I))
+ A2=A(IA+I)-0.5*A1
+ B2=B(IA+I)-0.5*B1
+ A3=SIN60*((C1*A(IB+I)+S1*B(IB+I))-(C2*A(IC+I)+S2*B(IC+I)))
+ B3=SIN60*((C1*B(IB+I)-S1*A(IB+I))-(C2*B(IC+I)-S2*A(IC+I)))
+ C(JA+J)=A(IA+I)+A1
+ D(JA+J)=B(IA+I)+B1
+ C(JB+J)=A2+B3
+ D(JB+J)=B2-A3
+ C(JC+J)=A2-B3
+ D(JC+J)=-(B2+A3)
+ I=I+INC3
+ J=J+INC4
+ 330 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 340 CONTINUE
+ IBASE=IBASE+IJUMP
+ JA=JA+JINK
+ JB=JB+JINK
+ JC=JC-JINK
+ 350 CONTINUE
+ ENDIF
+C
+ IF (JA.EQ.JC) THEN
+ JBASE=0
+ DO 380 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 370 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+0.5*(A(IB+I)-A(IC+I))
+ D(JA+J)=-SIN60*(A(IB+I)+A(IC+I))
+ C(JB+J)=A(IA+I)-(A(IB+I)-A(IC+I))
+ I=I+INC3
+ J=J+INC4
+ 370 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 380 CONTINUE
+ ENDIF
+C
+ ELSE !!! Case LA=M
+ Z=1.0/FLOAT(N)
+ ZSIN60=Z*SIN60
+ IF (LIPL) THEN
+ DO 394 L=1,ILA
+ I=IBASE
+!OCL NOVREC
+ DO 392 IJK=1,ILOT
+ T1=Z*(A(IA+I)-0.5*(A(IB+I)+A(IC+I)))
+ T2=ZSIN60*(A(IC+I)-A(IB+I))
+ A(IA+I)=Z*(A(IA+I)+(A(IB+I)+A(IC+I)))
+ A(IB+I)=T1
+ A(IC+I)=T2
+ I=I+INC3
+ 392 CONTINUE
+ IBASE=IBASE+INC11
+ 394 CONTINUE
+ ELSE
+ DO 398 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 396 IJK=1,ILOT
+ C(JA+J)=Z*(A(IA+I)+(A(IB+I)+A(IC+I)))
+ C(JB+J)=Z*(A(IA+I)-0.5*(A(IB+I)+A(IC+I)))
+ D(JB+J)=ZSIN60*(A(IC+I)-A(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 396 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 398 CONTINUE
+ ENDIF
+ ENDIF
+C
+ ELSEIF (IFAC.EQ.4) THEN
+C
+C CODING FOR FACTOR 4
+C -------------------
+ 400 CONTINUE
+ IA=1
+ IB=IA+IINK
+ IC=IB+IINK
+ ID=IC+IINK
+ JA=1
+ JB=JA+(2*M-LA)*INC2
+ JC=JB+2*M*INC2
+ JD=JB
+C
+ IF (LA.NE.M) THEN
+C
+ DO 420 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 410 IJK=1,ILOT
+ C(JA+J)=(A(IA+I)+A(IC+I))+(A(IB+I)+A(ID+I))
+ C(JC+J)=(A(IA+I)+A(IC+I))-(A(IB+I)+A(ID+I))
+ C(JB+J)=A(IA+I)-A(IC+I)
+ D(JB+J)=A(ID+I)-A(IB+I)
+ I=I+INC3
+ J=J+INC4
+ 410 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 420 CONTINUE
+ JA=JA+JINK
+ JINK=2*JINK
+ JB=JB+JINK
+ JC=JC-JINK
+ JD=JD-JINK
+ IBASE=IBASE+IJUMP
+ IJUMP=2*IJUMP+IINK
+C
+ IF (JB.LT.JC) THEN
+ DO 450 K=LA,KSTOP,LA
+ KB=K+K
+ KC=KB+KB
+ KD=KC+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ C3=TRIGS(KD+1)
+ S3=TRIGS(KD+2)
+ JBASE=0
+ DO 440 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 430 IJK=1,ILOT
+ A0=A(IA+I)+(C2*A(IC+I)+S2*B(IC+I))
+ A2=A(IA+I)-(C2*A(IC+I)+S2*B(IC+I))
+ A1=(C1*A(IB+I)+S1*B(IB+I))+(C3*A(ID+I)+S3*B(ID+I))
+ A3=(C1*A(IB+I)+S1*B(IB+I))-(C3*A(ID+I)+S3*B(ID+I))
+ B0=B(IA+I)+(C2*B(IC+I)-S2*A(IC+I))
+ B2=B(IA+I)-(C2*B(IC+I)-S2*A(IC+I))
+ B1=(C1*B(IB+I)-S1*A(IB+I))+(C3*B(ID+I)-S3*A(ID+I))
+ B3=(C1*B(IB+I)-S1*A(IB+I))-(C3*B(ID+I)-S3*A(ID+I))
+ C(JA+J)=A0+A1
+ C(JC+J)=A0-A1
+ D(JA+J)=B0+B1
+ D(JC+J)=B1-B0
+ C(JB+J)=A2+B3
+ C(JD+J)=A2-B3
+ D(JB+J)=B2-A3
+ D(JD+J)=-(B2+A3)
+ I=I+INC3
+ J=J+INC4
+ 430 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 440 CONTINUE
+ IBASE=IBASE+IJUMP
+ JA=JA+JINK
+ JB=JB+JINK
+ JC=JC-JINK
+ JD=JD-JINK
+ 450 CONTINUE
+ ENDIF
+C
+ IF (JB.EQ.JC) THEN
+ SIN45=SQRT(0.5)
+ JBASE=0
+ DO 480 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 470 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+SIN45*(A(IB+I)-A(ID+I))
+ C(JB+J)=A(IA+I)-SIN45*(A(IB+I)-A(ID+I))
+ D(JA+J)=-A(IC+I)-SIN45*(A(IB+I)+A(ID+I))
+ D(JB+J)=A(IC+I)-SIN45*(A(IB+I)+A(ID+I))
+ I=I+INC3
+ J=J+INC4
+ 470 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 480 CONTINUE
+ ENDIF
+C
+ ELSE !!! Case LA=M
+ Z=1.0/FLOAT(N)
+ IF (LIPL) THEN
+ DO 494 L=1,ILA
+ I=IBASE
+!OCL NOVREC
+ DO 492 IJK=1,ILOT
+ T1=Z*(A(IA+I)-A(IC+I))
+ T3=Z*(A(ID+I)-A(IB+I))
+ T2=Z*((A(IA+I)+A(IC+I))-(A(IB+I)+A(ID+I)))
+ A(IA+I)=Z*((A(IA+I)+A(IC+I))+(A(IB+I)+A(ID+I)))
+ A(IB+I)=T1
+ A(IC+I)=T2
+ A(ID+I)=T3
+ I=I+INC3
+ 492 CONTINUE
+ IBASE=IBASE+INC11
+ 494 CONTINUE
+ ELSE
+ DO 498 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 496 IJK=1,ILOT
+ C(JA+J)=Z*((A(IA+I)+A(IC+I))+(A(IB+I)+A(ID+I)))
+ C(JC+J)=Z*((A(IA+I)+A(IC+I))-(A(IB+I)+A(ID+I)))
+ C(JB+J)=Z*(A(IA+I)-A(IC+I))
+ D(JB+J)=Z*(A(ID+I)-A(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 496 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 498 CONTINUE
+ ENDIF
+ ENDIF
+C
+ ELSEIF (IFAC.EQ.5) THEN
+C
+C CODING FOR FACTOR 5
+C -------------------
+ 500 CONTINUE
+ IA=1
+ IB=IA+IINK
+ IC=IB+IINK
+ ID=IC+IINK
+ IE=ID+IINK
+ JA=1
+ JB=JA+(2*M-LA)*INC2
+ JC=JB+2*M*INC2
+ JD=JC
+ JE=JB
+C
+ IF (LA.NE.M) THEN
+C
+ DO 520 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 510 IJK=1,ILOT
+ A1=A(IB+I)+A(IE+I)
+ A3=A(IB+I)-A(IE+I)
+ A2=A(IC+I)+A(ID+I)
+ A4=A(IC+I)-A(ID+I)
+ A5=A(IA+I)-0.25*(A1+A2)
+ A6=QRT5*(A1-A2)
+ C(JA+J)=A(IA+I)+(A1+A2)
+ C(JB+J)=A5+A6
+ C(JC+J)=A5-A6
+ D(JB+J)=-SIN72*A3-SIN36*A4
+ D(JC+J)=-SIN36*A3+SIN72*A4
+ I=I+INC3
+ J=J+INC4
+ 510 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 520 CONTINUE
+ JA=JA+JINK
+ JINK=2*JINK
+ JB=JB+JINK
+ JC=JC+JINK
+ JD=JD-JINK
+ JE=JE-JINK
+ IBASE=IBASE+IJUMP
+ IJUMP=2*IJUMP+IINK
+C
+ IF (JB.LT.JD) THEN
+ DO 550 K=LA,KSTOP,LA
+ KB=K+K
+ KC=KB+KB
+ KD=KC+KB
+ KE=KD+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ C3=TRIGS(KD+1)
+ S3=TRIGS(KD+2)
+ C4=TRIGS(KE+1)
+ S4=TRIGS(KE+2)
+ JBASE=0
+ DO 540 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 530 IJK=1,ILOT
+ A1=(C1*A(IB+I)+S1*B(IB+I))+(C4*A(IE+I)+S4*B(IE+I))
+ A3=(C1*A(IB+I)+S1*B(IB+I))-(C4*A(IE+I)+S4*B(IE+I))
+ A2=(C2*A(IC+I)+S2*B(IC+I))+(C3*A(ID+I)+S3*B(ID+I))
+ A4=(C2*A(IC+I)+S2*B(IC+I))-(C3*A(ID+I)+S3*B(ID+I))
+ B1=(C1*B(IB+I)-S1*A(IB+I))+(C4*B(IE+I)-S4*A(IE+I))
+ B3=(C1*B(IB+I)-S1*A(IB+I))-(C4*B(IE+I)-S4*A(IE+I))
+ B2=(C2*B(IC+I)-S2*A(IC+I))+(C3*B(ID+I)-S3*A(ID+I))
+ B4=(C2*B(IC+I)-S2*A(IC+I))-(C3*B(ID+I)-S3*A(ID+I))
+ A5=A(IA+I)-0.25*(A1+A2)
+ A6=QRT5*(A1-A2)
+ B5=B(IA+I)-0.25*(B1+B2)
+ B6=QRT5*(B1-B2)
+ A10=A5+A6
+ A20=A5-A6
+ B10=B5+B6
+ B20=B5-B6
+ A11=SIN72*B3+SIN36*B4
+ A21=SIN36*B3-SIN72*B4
+ B11=SIN72*A3+SIN36*A4
+ B21=SIN36*A3-SIN72*A4
+ C(JA+J)=A(IA+I)+(A1+A2)
+ C(JB+J)=A10+A11
+ C(JE+J)=A10-A11
+ C(JC+J)=A20+A21
+ C(JD+J)=A20-A21
+ D(JA+J)=B(IA+I)+(B1+B2)
+ D(JB+J)=B10-B11
+ D(JE+J)=-(B10+B11)
+ D(JC+J)=B20-B21
+ D(JD+J)=-(B20+B21)
+ I=I+INC3
+ J=J+INC4
+ 530 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 540 CONTINUE
+ IBASE=IBASE+IJUMP
+ JA=JA+JINK
+ JB=JB+JINK
+ JC=JC+JINK
+ JD=JD-JINK
+ JE=JE-JINK
+ 550 CONTINUE
+ ENDIF
+C
+ IF (JB.EQ.JD) THEN
+ JBASE=0
+ DO 580 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 570 IJK=1,ILOT
+ A1=A(IB+I)+A(IE+I)
+ A3=A(IB+I)-A(IE+I)
+ A2=A(IC+I)+A(ID+I)
+ A4=A(IC+I)-A(ID+I)
+ A5=A(IA+I)+0.25*(A3-A4)
+ A6=QRT5*(A3+A4)
+ C(JA+J)=A5+A6
+ C(JB+J)=A5-A6
+ C(JC+J)=A(IA+I)-(A3-A4)
+ D(JA+J)=-SIN36*A1-SIN72*A2
+ D(JB+J)=-SIN72*A1+SIN36*A2
+ I=I+INC3
+ J=J+INC4
+ 570 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 580 CONTINUE
+ ENDIF
+C
+ ELSE !!! Case LA=M
+ Z=1.0/FLOAT(N)
+ ZQRT5=Z*QRT5
+ ZSIN36=Z*SIN36
+ ZSIN72=Z*SIN72
+ IF (LIPL) THEN
+ DO 594 L=1,ILA
+ I=IBASE
+!OCL NOVREC
+ DO 592 IJK=1,ILOT
+ A1=A(IB+I)+A(IE+I)
+ A3=A(IB+I)-A(IE+I)
+ A2=A(IC+I)+A(ID+I)
+ A4=A(IC+I)-A(ID+I)
+ A5=Z*(A(IA+I)-0.25*(A1+A2))
+ A6=ZQRT5*(A1-A2)
+ A(IA+I)=Z*(A(IA+I)+(A1+A2))
+ A(IB+I)=A5+A6
+ A(ID+I)=A5-A6
+ A(IC+I)=-ZSIN72*A3-ZSIN36*A4
+ A(IE+I)=-ZSIN36*A3+ZSIN72*A4
+ I=I+INC3
+ 592 CONTINUE
+ IBASE=IBASE+INC11
+ 594 CONTINUE
+ ELSE
+ DO 598 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 596 IJK=1,ILOT
+ A1=A(IB+I)+A(IE+I)
+ A3=A(IB+I)-A(IE+I)
+ A2=A(IC+I)+A(ID+I)
+ A4=A(IC+I)-A(ID+I)
+ A5=Z*(A(IA+I)-0.25*(A1+A2))
+ A6=ZQRT5*(A1-A2)
+ C(JA+J)=Z*(A(IA+I)+(A1+A2))
+ C(JB+J)=A5+A6
+ C(JC+J)=A5-A6
+ D(JB+J)=-ZSIN72*A3-ZSIN36*A4
+ D(JC+J)=-ZSIN36*A3+ZSIN72*A4
+ I=I+INC3
+ J=J+INC4
+ 596 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 598 CONTINUE
+ ENDIF
+ ENDIF
+C
+ ELSEIF (IFAC.EQ.6) THEN
+C
+C CODING FOR FACTOR 6
+C -------------------
+ 600 CONTINUE
+ IA=1
+ IB=IA+IINK
+ IC=IB+IINK
+ ID=IC+IINK
+ IE=ID+IINK
+ IF=IE+IINK
+ JA=1
+ JB=JA+(2*M-LA)*INC2
+ JC=JB+2*M*INC2
+ JD=JC+2*M*INC2
+ JE=JC
+ JF=JB
+C
+ IF (LA.NE.M) THEN
+C
+ DO 620 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 610 IJK=1,ILOT
+ A11=(A(IC+I)+A(IF+I))+(A(IB+I)+A(IE+I))
+ C(JA+J)=(A(IA+I)+A(ID+I))+A11
+ C(JC+J)=(A(IA+I)+A(ID+I)-0.5*A11)
+ D(JC+J)=SIN60*((A(IC+I)+A(IF+I))-(A(IB+I)+A(IE+I)))
+ A11=(A(IC+I)-A(IF+I))+(A(IE+I)-A(IB+I))
+ C(JB+J)=(A(IA+I)-A(ID+I))-0.5*A11
+ D(JB+J)=SIN60*((A(IE+I)-A(IB+I))-(A(IC+I)-A(IF+I)))
+ C(JD+J)=(A(IA+I)-A(ID+I))+A11
+ I=I+INC3
+ J=J+INC4
+ 610 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 620 CONTINUE
+ JA=JA+JINK
+ JINK=2*JINK
+ JB=JB+JINK
+ JC=JC+JINK
+ JD=JD-JINK
+ JE=JE-JINK
+ JF=JF-JINK
+ IBASE=IBASE+IJUMP
+ IJUMP=2*IJUMP+IINK
+C
+ IF (JC.LT.JD) THEN
+ DO 650 K=LA,KSTOP,LA
+ KB=K+K
+ KC=KB+KB
+ KD=KC+KB
+ KE=KD+KB
+ KF=KE+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ C3=TRIGS(KD+1)
+ S3=TRIGS(KD+2)
+ C4=TRIGS(KE+1)
+ S4=TRIGS(KE+2)
+ C5=TRIGS(KF+1)
+ S5=TRIGS(KF+2)
+ JBASE=0
+ DO 640 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 630 IJK=1,ILOT
+ A1=C1*A(IB+I)+S1*B(IB+I)
+ B1=C1*B(IB+I)-S1*A(IB+I)
+ A2=C2*A(IC+I)+S2*B(IC+I)
+ B2=C2*B(IC+I)-S2*A(IC+I)
+ A3=C3*A(ID+I)+S3*B(ID+I)
+ B3=C3*B(ID+I)-S3*A(ID+I)
+ A4=C4*A(IE+I)+S4*B(IE+I)
+ B4=C4*B(IE+I)-S4*A(IE+I)
+ A5=C5*A(IF+I)+S5*B(IF+I)
+ B5=C5*B(IF+I)-S5*A(IF+I)
+ A11=(A2+A5)+(A1+A4)
+ A20=(A(IA+I)+A3)-0.5*A11
+ A21=SIN60*((A2+A5)-(A1+A4))
+ B11=(B2+B5)+(B1+B4)
+ B20=(B(IA+I)+B3)-0.5*B11
+ B21=SIN60*((B2+B5)-(B1+B4))
+ C(JA+J)=(A(IA+I)+A3)+A11
+ D(JA+J)=(B(IA+I)+B3)+B11
+ C(JC+J)=A20-B21
+ D(JC+J)=A21+B20
+ C(JE+J)=A20+B21
+ D(JE+J)=A21-B20
+ A11=(A2-A5)+(A4-A1)
+ A20=(A(IA+I)-A3)-0.5*A11
+ A21=SIN60*((A4-A1)-(A2-A5))
+ B11=(B5-B2)-(B4-B1)
+ B20=(B3-B(IA+I))-0.5*B11
+ B21=SIN60*((B5-B2)+(B4-B1))
+ C(JB+J)=A20-B21
+ D(JB+J)=A21-B20
+ C(JD+J)=A11+(A(IA+I)-A3)
+ D(JD+J)=B11+(B3-B(IA+I))
+ C(JF+J)=A20+B21
+ D(JF+J)=A21+B20
+ I=I+INC3
+ J=J+INC4
+ 630 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 640 CONTINUE
+ IBASE=IBASE+IJUMP
+ JA=JA+JINK
+ JB=JB+JINK
+ JC=JC+JINK
+ JD=JD-JINK
+ JE=JE-JINK
+ JF=JF-JINK
+ 650 CONTINUE
+ ENDIF
+C
+ IF (JC.EQ.JD) THEN
+ JBASE=0
+ DO 680 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 670 IJK=1,ILOT
+ C(JA+J)=(A(IA+I)+0.5*(A(IC+I)-A(IE+I)))+ SIN60*(A(IB+I)-A(IF+I))
+ D(JA+J)=-(A(ID+I)+0.5*(A(IB+I)+A(IF+I)))-SIN60*(A(IC+I)+A(IE+I))
+ C(JB+J)=A(IA+I)-(A(IC+I)-A(IE+I))
+ D(JB+J)=A(ID+I)-(A(IB+I)+A(IF+I))
+ C(JC+J)=(A(IA+I)+0.5*(A(IC+I)-A(IE+I)))-SIN60*(A(IB+I)-A(IF+I))
+ D(JC+J)=-(A(ID+I)+0.5*(A(IB+I)+A(IF+I)))+SIN60*(A(IC+I)+A(IE+I))
+ I=I+INC3
+ J=J+INC4
+ 670 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 680 CONTINUE
+ ENDIF
+C
+ ELSE !!! Case LA=M
+ Z=1.0/FLOAT(N)
+ ZSIN60=Z*SIN60
+ IF (LIPL) THEN
+ DO 694 L=1,ILA
+ I=IBASE
+!OCL NOVREC
+ DO 692 IJK=1,ILOT
+ A11=(A(IC+I)-A(IF+I))+(A(IE+I)-A(IB+I))
+ T1=Z*((A(IA+I)-A(ID+I))-0.5*A11)
+ T5=Z*((A(IA+I)-A(ID+I))+A11)
+ T2=ZSIN60*((A(IE+I)-A(IB+I))-(A(IC+I)-A(IF+I)))
+ T4=ZSIN60*((A(IC+I)+A(IF+I))-(A(IB+I)+A(IE+I)))
+ A11=(A(IC+I)+A(IF+I))+(A(IB+I)+A(IE+I))
+ T3=Z*((A(IA+I)+A(ID+I))-0.5*A11)
+ A(IA+I)=Z*((A(IA+I)+A(ID+I))+A11)
+ A(IB+I)=T1
+ A(IC+I)=T2
+ A(ID+I)=T3
+ A(IE+I)=T4
+ A(IF+I)=T5
+ I=I+INC3
+ 692 CONTINUE
+ IBASE=IBASE+INC11
+ 694 CONTINUE
+ ELSE
+ DO 698 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 696 IJK=1,ILOT
+ A11=(A(IC+I)+A(IF+I))+(A(IB+I)+A(IE+I))
+ C(JA+J)=Z*((A(IA+I)+A(ID+I))+A11)
+ C(JC+J)=Z*((A(IA+I)+A(ID+I))-0.5*A11)
+ D(JC+J)=ZSIN60*((A(IC+I)+A(IF+I))-(A(IB+I)+A(IE+I)))
+ A11=(A(IC+I)-A(IF+I))+(A(IE+I)-A(IB+I))
+ C(JB+J)=Z*((A(IA+I)-A(ID+I))-0.5*A11)
+ D(JB+J)=ZSIN60*((A(IE+I)-A(IB+I))-(A(IC+I)-A(IF+I)))
+ C(JD+J)=Z*((A(IA+I)-A(ID+I))+A11)
+ I=I+INC3
+ J=J+INC4
+ 696 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 698 CONTINUE
+ ENDIF
+ ENDIF
+C
+ ELSEIF (IFAC.EQ.8) THEN
+C
+C CODING FOR FACTOR 8
+C -------------------
+ 800 CONTINUE
+ IF (LA.NE.M) THEN
+ IBAD=3
+ ELSE
+ IA=1
+ IB=IA+IINK
+ IC=IB+IINK
+ ID=IC+IINK
+ IE=ID+IINK
+ IF=IE+IINK
+ IG=IF+IINK
+ IH=IG+IINK
+ JA=1
+ JB=JA+LA*INC2
+ JC=JB+2*M*INC2
+ JD=JC+2*M*INC2
+ JE=JD+2*M*INC2
+ Z=1.0/FLOAT(N)
+ ZSIN45=Z*SQRT(0.5)
+C
+ IF (LIPL) THEN
+ DO 820 L=1,ILA
+ I=IBASE
+!OCL NOVREC
+ DO 810 IJK=1,ILOT
+ T3=Z*((A(IA+I)+A(IE+I))-(A(IC+I)+A(IG+I)))
+ T4=Z*((A(ID+I)+A(IH+I))-(A(IB+I)+A(IF+I)))
+ T1=Z*(A(IA+I)-A(IE+I))
+ * +ZSIN45*((A(IH+I)-A(ID+I))-(A(IF+I)-A(IB+I)))
+ T5=Z*(A(IA+I)-A(IE+I))
+ * -ZSIN45*((A(IH+I)-A(ID+I))-(A(IF+I)-A(IB+I)))
+ T2=ZSIN45*((A(IH+I)-A(ID+I))+(A(IF+I)-A(IB+I)))
+ * +Z*(A(IG+I)-A(IC+I))
+ T6=ZSIN45*((A(IH+I)-A(ID+I))+(A(IF+I)-A(IB+I)))
+ * -Z*(A(IG+I)-A(IC+I))
+ T7=Z*(((A(IA+I)+A(IE+I))+(A(IC+I)+A(IG+I)))-
+ * ((A(ID+I)+A(IH+I))+(A(IB+I)+A(IF+I))))
+ A(IA+I)=Z*(((A(IA+I)+A(IE+I))+(A(IC+I)+A(IG+I)))+
+ * ((A(ID+I)+A(IH+I))+(A(IB+I)+A(IF+I))))
+ A(IB+I)=T1
+ A(IC+I)=T2
+ A(ID+I)=T3
+ A(IE+I)=T4
+ A(IF+I)=T5
+ A(IG+I)=T6
+ A(IH+I)=T7
+ I=I+INC3
+ 810 CONTINUE
+ IBASE=IBASE+INC11
+ 820 CONTINUE
+ ELSE
+ DO 840 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 830 IJK=1,ILOT
+ C(JA+J)=Z*(((A(IA+I)+A(IE+I))+(A(IC+I)+A(IG+I)))+
+ * ((A(ID+I)+A(IH+I))+(A(IB+I)+A(IF+I))))
+ C(JE+J)=Z*(((A(IA+I)+A(IE+I))+(A(IC+I)+A(IG+I)))-
+ * ((A(ID+I)+A(IH+I))+(A(IB+I)+A(IF+I))))
+ C(JC+J)=Z*((A(IA+I)+A(IE+I))-(A(IC+I)+A(IG+I)))
+ D(JC+J)=Z*((A(ID+I)+A(IH+I))-(A(IB+I)+A(IF+I)))
+ C(JB+J)=Z*(A(IA+I)-A(IE+I))
+ * +ZSIN45*((A(IH+I)-A(ID+I))-(A(IF+I)-A(IB+I)))
+ C(JD+J)=Z*(A(IA+I)-A(IE+I))
+ * -ZSIN45*((A(IH+I)-A(ID+I))-(A(IF+I)-A(IB+I)))
+ D(JB+J)=ZSIN45*((A(IH+I)-A(ID+I))+(A(IF+I)-A(IB+I)))
+ * +Z*(A(IG+I)-A(IC+I))
+ D(JD+J)=ZSIN45*((A(IH+I)-A(ID+I))+(A(IF+I)-A(IB+I)))
+ * -Z*(A(IG+I)-A(IC+I))
+ I=I+INC3
+ J=J+INC4
+ 830 CONTINUE
+ IBASE=IBASE+INC11
+ JBASE=JBASE+INC2
+ 840 CONTINUE
+ ENDIF
+C
+ ENDIF
+C
+ ELSE
+C
+ IBAD=2 !!! Illegal factor
+C
+ ENDIF
+C
+C RETURN
+C ------
+ 900 CONTINUE
+ IERR=IBAD
+ RETURN
+ END
diff --git a/fft/qpassm.f b/fft/qpassm.f
new file mode 100755
index 0000000..c716d06
--- /dev/null
+++ b/fft/qpassm.f
@@ -0,0 +1,779 @@
+c Copyright 1981-2012 ECMWF.
+c
+c This software is licensed under the terms of the Apache Licence
+c Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+c
+c In applying this licence, ECMWF does not waive the privileges and immunities
+c granted to it by virtue of its status as an intergovernmental organisation
+c nor does it submit to any jurisdiction.
+c
+
+ SUBROUTINE QPASSM(A,B,C,D,TRIGS,INC1,INC2,INC3,INC4,ILOT,N,IFAC,
+ * ILA,IERR)
+ REAL A(*),B(*),C(*),D(*),TRIGS(*)
+C
+C SUBROUTINE 'QPASSM' - PERFORMS ONE PASS THROUGH DATA AS PART
+C OF MULTIPLE REAL FFT (FOURIER ANALYSIS) ROUTINE
+C
+C A IS FIRST REAL INPUT VECTOR
+C EQUIVALENCE B(1) WITH A(IFAC*ILA*INC1+1)
+C C IS FIRST REAL OUTPUT VECTOR
+C EQUIVALENCE D(1) WITH C(ILA*INC2+1)
+C TRIGS IS A PRECALCULATED LIST OF SINES & COSINES
+C INC1 IS THE ADDRESSING INCREMENT FOR A
+C INC2 IS THE ADDRESSING INCREMENT FOR C
+C INC3 IS THE INCREMENT BETWEEN INPUT VECTORS A
+C INC4 IS THE INCREMENT BETWEEN OUTPUT VECTORS C
+C ILOT IS THE NUMBER OF VECTORS
+C N IS THE LENGTH OF THE VECTORS
+C IFAC IS THE CURRENT FACTOR OF N
+C ILA = N/(PRODUCT OF FACTORS USED SO FAR)
+C IERR IS AN ERROR INDICATOR:
+C 0 - PASS COMPLETED WITHOUT ERROR
+C 1 - ILOT GREATER THAN 64
+C 2 - IFAC NOT CATERED FOR
+C 3 - IFAC ONLY CATERED FOR IF ILA=N/IFAC
+C
+C-----------------------------------------------------------------------
+C
+ SAVE SIN36, SIN72, QRT5, SIN60
+C
+ DATA SIN36/0.587785252292473/,SIN72/0.951056516295154/,
+ * QRT5/0.559016994374947/,SIN60/0.866025403784437/
+C
+ M=N/IFAC
+ IINK=ILA*INC1
+ JINK=ILA*INC2
+ IJUMP=(IFAC-1)*IINK
+ KSTOP=(N-IFAC)/(2*IFAC)
+C
+ IBAD=1
+ IF (ILOT.GT.512) GO TO 910
+ IBASE=0
+ JBASE=0
+ IGO=IFAC-1
+ IF (IGO.EQ.7) IGO=6
+ IBAD=2
+ IF (IGO.LT.1.OR.IGO.GT.6) GO TO 910
+ GO TO (200,300,400,500,600,800),IGO
+C
+C CODING FOR FACTOR 2
+C -------------------
+ 200 CONTINUE
+ IA=1
+ IB=IA+IINK
+ JA=1
+ JB=JA+(2*M-ILA)*INC2
+C
+ IF (ILA.EQ.M) GO TO 290
+C
+ DO 220 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 210 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+A(IB+I)
+ C(JB+J)=A(IA+I)-A(IB+I)
+ I=I+INC3
+ J=J+INC4
+ 210 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 220 CONTINUE
+ JA=JA+JINK
+ JINK=2*JINK
+ JB=JB-JINK
+ IBASE=IBASE+IJUMP
+ IJUMP=2*IJUMP+IINK
+ IF (JA.EQ.JB) GO TO 260
+ DO 250 K=ILA,KSTOP,ILA
+ KB=K+K
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ JBASE=0
+ DO 240 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 230 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+(C1*A(IB+I)+S1*B(IB+I))
+ C(JB+J)=A(IA+I)-(C1*A(IB+I)+S1*B(IB+I))
+ D(JA+J)=(C1*B(IB+I)-S1*A(IB+I))+B(IA+I)
+ D(JB+J)=(C1*B(IB+I)-S1*A(IB+I))-B(IA+I)
+ I=I+INC3
+ J=J+INC4
+ 230 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 240 CONTINUE
+ IBASE=IBASE+IJUMP
+ JA=JA+JINK
+ JB=JB-JINK
+ 250 CONTINUE
+ IF (JA.GT.JB) GO TO 900
+ 260 CONTINUE
+ JBASE=0
+ DO 280 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 270 IJK=1,ILOT
+ C(JA+J)=A(IA+I)
+ D(JA+J)=-A(IB+I)
+ I=I+INC3
+ J=J+INC4
+ 270 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 280 CONTINUE
+ GO TO 900
+C
+ 290 CONTINUE
+ Z=1.0/FLOAT(N)
+ DO 294 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 292 IJK=1,ILOT
+ C(JA+J)=Z*(A(IA+I)+A(IB+I))
+ C(JB+J)=Z*(A(IA+I)-A(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 292 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 294 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 3
+C -------------------
+ 300 CONTINUE
+ IA=1
+ IB=IA+IINK
+ IC=IB+IINK
+ JA=1
+ JB=JA+(2*M-ILA)*INC2
+ JC=JB
+C
+ IF (ILA.EQ.M) GO TO 390
+C
+ DO 320 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 310 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+(A(IB+I)+A(IC+I))
+ C(JB+J)=A(IA+I)-0.5*(A(IB+I)+A(IC+I))
+ D(JB+J)=SIN60*(A(IC+I)-A(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 310 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 320 CONTINUE
+ JA=JA+JINK
+ JINK=2*JINK
+ JB=JB+JINK
+ JC=JC-JINK
+ IBASE=IBASE+IJUMP
+ IJUMP=2*IJUMP+IINK
+ IF (JA.EQ.JC) GO TO 360
+ DO 350 K=ILA,KSTOP,ILA
+ KB=K+K
+ KC=KB+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ JBASE=0
+ DO 340 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 330 IJK=1,ILOT
+ A1=(C1*A(IB+I)+S1*B(IB+I))+(C2*A(IC+I)+S2*B(IC+I))
+ B1=(C1*B(IB+I)-S1*A(IB+I))+(C2*B(IC+I)-S2*A(IC+I))
+ A2=A(IA+I)-0.5*A1
+ B2=B(IA+I)-0.5*B1
+ A3=SIN60*((C1*A(IB+I)+S1*B(IB+I))-(C2*A(IC+I)+S2*B(IC+I)))
+ B3=SIN60*((C1*B(IB+I)-S1*A(IB+I))-(C2*B(IC+I)-S2*A(IC+I)))
+ C(JA+J)=A(IA+I)+A1
+ D(JA+J)=B(IA+I)+B1
+ C(JB+J)=A2+B3
+ D(JB+J)=B2-A3
+ C(JC+J)=A2-B3
+ D(JC+J)=-(B2+A3)
+ I=I+INC3
+ J=J+INC4
+ 330 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 340 CONTINUE
+ IBASE=IBASE+IJUMP
+ JA=JA+JINK
+ JB=JB+JINK
+ JC=JC-JINK
+ 350 CONTINUE
+ IF (JA.GT.JC) GO TO 900
+ 360 CONTINUE
+ JBASE=0
+ DO 380 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 370 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+0.5*(A(IB+I)-A(IC+I))
+ D(JA+J)=-SIN60*(A(IB+I)+A(IC+I))
+ C(JB+J)=A(IA+I)-(A(IB+I)-A(IC+I))
+ I=I+INC3
+ J=J+INC4
+ 370 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 380 CONTINUE
+ GO TO 900
+C
+ 390 CONTINUE
+ Z=1.0/FLOAT(N)
+ ZSIN60=Z*SIN60
+ DO 394 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 392 IJK=1,ILOT
+ C(JA+J)=Z*(A(IA+I)+(A(IB+I)+A(IC+I)))
+ C(JB+J)=Z*(A(IA+I)-0.5*(A(IB+I)+A(IC+I)))
+ D(JB+J)=ZSIN60*(A(IC+I)-A(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 392 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 394 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 4
+C -------------------
+ 400 CONTINUE
+ IA=1
+ IB=IA+IINK
+ IC=IB+IINK
+ ID=IC+IINK
+ JA=1
+ JB=JA+(2*M-ILA)*INC2
+ JC=JB+2*M*INC2
+ JD=JB
+C
+ IF (ILA.EQ.M) GO TO 490
+C
+ DO 420 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 410 IJK=1,ILOT
+ C(JA+J)=(A(IA+I)+A(IC+I))+(A(IB+I)+A(ID+I))
+ C(JC+J)=(A(IA+I)+A(IC+I))-(A(IB+I)+A(ID+I))
+ C(JB+J)=A(IA+I)-A(IC+I)
+ D(JB+J)=A(ID+I)-A(IB+I)
+ I=I+INC3
+ J=J+INC4
+ 410 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 420 CONTINUE
+ JA=JA+JINK
+ JINK=2*JINK
+ JB=JB+JINK
+ JC=JC-JINK
+ JD=JD-JINK
+ IBASE=IBASE+IJUMP
+ IJUMP=2*IJUMP+IINK
+ IF (JB.EQ.JC) GO TO 460
+ DO 450 K=ILA,KSTOP,ILA
+ KB=K+K
+ KC=KB+KB
+ KD=KC+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ C3=TRIGS(KD+1)
+ S3=TRIGS(KD+2)
+ JBASE=0
+ DO 440 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 430 IJK=1,ILOT
+ A0=A(IA+I)+(C2*A(IC+I)+S2*B(IC+I))
+ A2=A(IA+I)-(C2*A(IC+I)+S2*B(IC+I))
+ A1=(C1*A(IB+I)+S1*B(IB+I))+(C3*A(ID+I)+S3*B(ID+I))
+ A3=(C1*A(IB+I)+S1*B(IB+I))-(C3*A(ID+I)+S3*B(ID+I))
+ B0=B(IA+I)+(C2*B(IC+I)-S2*A(IC+I))
+ B2=B(IA+I)-(C2*B(IC+I)-S2*A(IC+I))
+ B1=(C1*B(IB+I)-S1*A(IB+I))+(C3*B(ID+I)-S3*A(ID+I))
+ B3=(C1*B(IB+I)-S1*A(IB+I))-(C3*B(ID+I)-S3*A(ID+I))
+ C(JA+J)=A0+A1
+ C(JC+J)=A0-A1
+ D(JA+J)=B0+B1
+ D(JC+J)=B1-B0
+ C(JB+J)=A2+B3
+ C(JD+J)=A2-B3
+ D(JB+J)=B2-A3
+ D(JD+J)=-(B2+A3)
+ I=I+INC3
+ J=J+INC4
+ 430 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 440 CONTINUE
+ IBASE=IBASE+IJUMP
+ JA=JA+JINK
+ JB=JB+JINK
+ JC=JC-JINK
+ JD=JD-JINK
+ 450 CONTINUE
+ IF (JB.GT.JC) GO TO 900
+ 460 CONTINUE
+ SIN45=SQRT(0.5)
+ JBASE=0
+ DO 480 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 470 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+SIN45*(A(IB+I)-A(ID+I))
+ C(JB+J)=A(IA+I)-SIN45*(A(IB+I)-A(ID+I))
+ D(JA+J)=-A(IC+I)-SIN45*(A(IB+I)+A(ID+I))
+ D(JB+J)=A(IC+I)-SIN45*(A(IB+I)+A(ID+I))
+ I=I+INC3
+ J=J+INC4
+ 470 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 480 CONTINUE
+ GO TO 900
+C
+ 490 CONTINUE
+ Z=1.0/FLOAT(N)
+ DO 494 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 492 IJK=1,ILOT
+ C(JA+J)=Z*((A(IA+I)+A(IC+I))+(A(IB+I)+A(ID+I)))
+ C(JC+J)=Z*((A(IA+I)+A(IC+I))-(A(IB+I)+A(ID+I)))
+ C(JB+J)=Z*(A(IA+I)-A(IC+I))
+ D(JB+J)=Z*(A(ID+I)-A(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 492 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 494 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 5
+C -------------------
+ 500 CONTINUE
+ IA=1
+ IB=IA+IINK
+ IC=IB+IINK
+ ID=IC+IINK
+ IE=ID+IINK
+ JA=1
+ JB=JA+(2*M-ILA)*INC2
+ JC=JB+2*M*INC2
+ JD=JC
+ JE=JB
+C
+ IF (ILA.EQ.M) GO TO 590
+C
+ DO 520 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 510 IJK=1,ILOT
+ A1=A(IB+I)+A(IE+I)
+ A3=A(IB+I)-A(IE+I)
+ A2=A(IC+I)+A(ID+I)
+ A4=A(IC+I)-A(ID+I)
+ A5=A(IA+I)-0.25*(A1+A2)
+ A6=QRT5*(A1-A2)
+ C(JA+J)=A(IA+I)+(A1+A2)
+ C(JB+J)=A5+A6
+ C(JC+J)=A5-A6
+ D(JB+J)=-SIN72*A3-SIN36*A4
+ D(JC+J)=-SIN36*A3+SIN72*A4
+ I=I+INC3
+ J=J+INC4
+ 510 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 520 CONTINUE
+ JA=JA+JINK
+ JINK=2*JINK
+ JB=JB+JINK
+ JC=JC+JINK
+ JD=JD-JINK
+ JE=JE-JINK
+ IBASE=IBASE+IJUMP
+ IJUMP=2*IJUMP+IINK
+ IF (JB.EQ.JD) GO TO 560
+ DO 550 K=ILA,KSTOP,ILA
+ KB=K+K
+ KC=KB+KB
+ KD=KC+KB
+ KE=KD+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ C3=TRIGS(KD+1)
+ S3=TRIGS(KD+2)
+ C4=TRIGS(KE+1)
+ S4=TRIGS(KE+2)
+ JBASE=0
+ DO 540 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 530 IJK=1,ILOT
+ A1=(C1*A(IB+I)+S1*B(IB+I))+(C4*A(IE+I)+S4*B(IE+I))
+ A3=(C1*A(IB+I)+S1*B(IB+I))-(C4*A(IE+I)+S4*B(IE+I))
+ A2=(C2*A(IC+I)+S2*B(IC+I))+(C3*A(ID+I)+S3*B(ID+I))
+ A4=(C2*A(IC+I)+S2*B(IC+I))-(C3*A(ID+I)+S3*B(ID+I))
+ B1=(C1*B(IB+I)-S1*A(IB+I))+(C4*B(IE+I)-S4*A(IE+I))
+ B3=(C1*B(IB+I)-S1*A(IB+I))-(C4*B(IE+I)-S4*A(IE+I))
+ B2=(C2*B(IC+I)-S2*A(IC+I))+(C3*B(ID+I)-S3*A(ID+I))
+ B4=(C2*B(IC+I)-S2*A(IC+I))-(C3*B(ID+I)-S3*A(ID+I))
+ A5=A(IA+I)-0.25*(A1+A2)
+ A6=QRT5*(A1-A2)
+ B5=B(IA+I)-0.25*(B1+B2)
+ B6=QRT5*(B1-B2)
+ A10=A5+A6
+ A20=A5-A6
+ B10=B5+B6
+ B20=B5-B6
+ A11=SIN72*B3+SIN36*B4
+ A21=SIN36*B3-SIN72*B4
+ B11=SIN72*A3+SIN36*A4
+ B21=SIN36*A3-SIN72*A4
+ C(JA+J)=A(IA+I)+(A1+A2)
+ C(JB+J)=A10+A11
+ C(JE+J)=A10-A11
+ C(JC+J)=A20+A21
+ C(JD+J)=A20-A21
+ D(JA+J)=B(IA+I)+(B1+B2)
+ D(JB+J)=B10-B11
+ D(JE+J)=-(B10+B11)
+ D(JC+J)=B20-B21
+ D(JD+J)=-(B20+B21)
+ I=I+INC3
+ J=J+INC4
+ 530 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 540 CONTINUE
+ IBASE=IBASE+IJUMP
+ JA=JA+JINK
+ JB=JB+JINK
+ JC=JC+JINK
+ JD=JD-JINK
+ JE=JE-JINK
+ 550 CONTINUE
+ IF (JB.GT.JD) GO TO 900
+ 560 CONTINUE
+ JBASE=0
+ DO 580 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 570 IJK=1,ILOT
+ A1=A(IB+I)+A(IE+I)
+ A3=A(IB+I)-A(IE+I)
+ A2=A(IC+I)+A(ID+I)
+ A4=A(IC+I)-A(ID+I)
+ A5=A(IA+I)+0.25*(A3-A4)
+ A6=QRT5*(A3+A4)
+ C(JA+J)=A5+A6
+ C(JB+J)=A5-A6
+ C(JC+J)=A(IA+I)-(A3-A4)
+ D(JA+J)=-SIN36*A1-SIN72*A2
+ D(JB+J)=-SIN72*A1+SIN36*A2
+ I=I+INC3
+ J=J+INC4
+ 570 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 580 CONTINUE
+ GO TO 900
+C
+ 590 CONTINUE
+ Z=1.0/FLOAT(N)
+ ZQRT5=Z*QRT5
+ ZSIN36=Z*SIN36
+ ZSIN72=Z*SIN72
+ DO 594 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 592 IJK=1,ILOT
+ A1=A(IB+I)+A(IE+I)
+ A3=A(IB+I)-A(IE+I)
+ A2=A(IC+I)+A(ID+I)
+ A4=A(IC+I)-A(ID+I)
+ A5=Z*(A(IA+I)-0.25*(A1+A2))
+ A6=ZQRT5*(A1-A2)
+ C(JA+J)=Z*(A(IA+I)+(A1+A2))
+ C(JB+J)=A5+A6
+ C(JC+J)=A5-A6
+ D(JB+J)=-ZSIN72*A3-ZSIN36*A4
+ D(JC+J)=-ZSIN36*A3+ZSIN72*A4
+ I=I+INC3
+ J=J+INC4
+ 592 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 594 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 6
+C -------------------
+ 600 CONTINUE
+ IA=1
+ IB=IA+IINK
+ IC=IB+IINK
+ ID=IC+IINK
+ IE=ID+IINK
+ IF=IE+IINK
+ JA=1
+ JB=JA+(2*M-ILA)*INC2
+ JC=JB+2*M*INC2
+ JD=JC+2*M*INC2
+ JE=JC
+ JF=JB
+C
+ IF (ILA.EQ.M) GO TO 690
+C
+ DO 620 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 610 IJK=1,ILOT
+ A11=(A(IC+I)+A(IF+I))+(A(IB+I)+A(IE+I))
+ C(JA+J)=(A(IA+I)+A(ID+I))+A11
+ C(JC+J)=(A(IA+I)+A(ID+I)-0.5*A11)
+ D(JC+J)=SIN60*((A(IC+I)+A(IF+I))-(A(IB+I)+A(IE+I)))
+ A11=(A(IC+I)-A(IF+I))+(A(IE+I)-A(IB+I))
+ C(JB+J)=(A(IA+I)-A(ID+I))-0.5*A11
+ D(JB+J)=SIN60*((A(IE+I)-A(IB+I))-(A(IC+I)-A(IF+I)))
+ C(JD+J)=(A(IA+I)-A(ID+I))+A11
+ I=I+INC3
+ J=J+INC4
+ 610 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 620 CONTINUE
+ JA=JA+JINK
+ JINK=2*JINK
+ JB=JB+JINK
+ JC=JC+JINK
+ JD=JD-JINK
+ JE=JE-JINK
+ JF=JF-JINK
+ IBASE=IBASE+IJUMP
+ IJUMP=2*IJUMP+IINK
+ IF (JC.EQ.JD) GO TO 660
+ DO 650 K=ILA,KSTOP,ILA
+ KB=K+K
+ KC=KB+KB
+ KD=KC+KB
+ KE=KD+KB
+ KF=KE+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ C3=TRIGS(KD+1)
+ S3=TRIGS(KD+2)
+ C4=TRIGS(KE+1)
+ S4=TRIGS(KE+2)
+ C5=TRIGS(KF+1)
+ S5=TRIGS(KF+2)
+ JBASE=0
+ DO 640 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 630 IJK=1,ILOT
+ A1=C1*A(IB+I)+S1*B(IB+I)
+ B1=C1*B(IB+I)-S1*A(IB+I)
+ A2=C2*A(IC+I)+S2*B(IC+I)
+ B2=C2*B(IC+I)-S2*A(IC+I)
+ A3=C3*A(ID+I)+S3*B(ID+I)
+ B3=C3*B(ID+I)-S3*A(ID+I)
+ A4=C4*A(IE+I)+S4*B(IE+I)
+ B4=C4*B(IE+I)-S4*A(IE+I)
+ A5=C5*A(IF+I)+S5*B(IF+I)
+ B5=C5*B(IF+I)-S5*A(IF+I)
+ A11=(A2+A5)+(A1+A4)
+ A20=(A(IA+I)+A3)-0.5*A11
+ A21=SIN60*((A2+A5)-(A1+A4))
+ B11=(B2+B5)+(B1+B4)
+ B20=(B(IA+I)+B3)-0.5*B11
+ B21=SIN60*((B2+B5)-(B1+B4))
+ C(JA+J)=(A(IA+I)+A3)+A11
+ D(JA+J)=(B(IA+I)+B3)+B11
+ C(JC+J)=A20-B21
+ D(JC+J)=A21+B20
+ C(JE+J)=A20+B21
+ D(JE+J)=A21-B20
+ A11=(A2-A5)+(A4-A1)
+ A20=(A(IA+I)-A3)-0.5*A11
+ A21=SIN60*((A4-A1)-(A2-A5))
+ B11=(B5-B2)-(B4-B1)
+ B20=(B3-B(IA+I))-0.5*B11
+ B21=SIN60*((B5-B2)+(B4-B1))
+ C(JB+J)=A20-B21
+ D(JB+J)=A21-B20
+ C(JD+J)=A11+(A(IA+I)-A3)
+ D(JD+J)=B11+(B3-B(IA+I))
+ C(JF+J)=A20+B21
+ D(JF+J)=A21+B20
+ I=I+INC3
+ J=J+INC4
+ 630 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 640 CONTINUE
+ IBASE=IBASE+IJUMP
+ JA=JA+JINK
+ JB=JB+JINK
+ JC=JC+JINK
+ JD=JD-JINK
+ JE=JE-JINK
+ JF=JF-JINK
+ 650 CONTINUE
+ IF (JC.GT.JD) GO TO 900
+ 660 CONTINUE
+ JBASE=0
+ DO 680 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 670 IJK=1,ILOT
+ C(JA+J)=(A(IA+I)+0.5*(A(IC+I)-A(IE+I)))+ SIN60*(A(IB+I)-A(IF+I))
+ D(JA+J)=-(A(ID+I)+0.5*(A(IB+I)+A(IF+I)))-SIN60*(A(IC+I)+A(IE+I))
+ C(JB+J)=A(IA+I)-(A(IC+I)-A(IE+I))
+ D(JB+J)=A(ID+I)-(A(IB+I)+A(IF+I))
+ C(JC+J)=(A(IA+I)+0.5*(A(IC+I)-A(IE+I)))-SIN60*(A(IB+I)-A(IF+I))
+ D(JC+J)=-(A(ID+I)+0.5*(A(IB+I)+A(IF+I)))+SIN60*(A(IC+I)+A(IE+I))
+ I=I+INC3
+ J=J+INC4
+ 670 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 680 CONTINUE
+ GO TO 900
+C
+ 690 CONTINUE
+ Z=1.0/FLOAT(N)
+ ZSIN60=Z*SIN60
+ DO 694 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 692 IJK=1,ILOT
+ A11=(A(IC+I)+A(IF+I))+(A(IB+I)+A(IE+I))
+ C(JA+J)=Z*((A(IA+I)+A(ID+I))+A11)
+ C(JC+J)=Z*((A(IA+I)+A(ID+I))-0.5*A11)
+ D(JC+J)=ZSIN60*((A(IC+I)+A(IF+I))-(A(IB+I)+A(IE+I)))
+ A11=(A(IC+I)-A(IF+I))+(A(IE+I)-A(IB+I))
+ C(JB+J)=Z*((A(IA+I)-A(ID+I))-0.5*A11)
+ D(JB+J)=ZSIN60*((A(IE+I)-A(IB+I))-(A(IC+I)-A(IF+I)))
+ C(JD+J)=Z*((A(IA+I)-A(ID+I))+A11)
+ I=I+INC3
+ J=J+INC4
+ 692 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 694 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 8
+C -------------------
+ 800 CONTINUE
+ IBAD=3
+ IF (ILA.NE.M) GO TO 910
+ IA=1
+ IB=IA+IINK
+ IC=IB+IINK
+ ID=IC+IINK
+ IE=ID+IINK
+ IF=IE+IINK
+ IG=IF+IINK
+ IH=IG+IINK
+ JA=1
+ JB=JA+ILA*INC2
+ JC=JB+2*M*INC2
+ JD=JC+2*M*INC2
+ JE=JD+2*M*INC2
+ Z=1.0/FLOAT(N)
+ ZSIN45=Z*SQRT(0.5)
+C
+ DO 820 JL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 810 IJK=1,ILOT
+ C(JA+J)=Z*(((A(IA+I)+A(IE+I))+(A(IC+I)+A(IG+I)))+
+ * ((A(ID+I)+A(IH+I))+(A(IB+I)+A(IF+I))))
+ C(JE+J)=Z*(((A(IA+I)+A(IE+I))+(A(IC+I)+A(IG+I)))-
+ * ((A(ID+I)+A(IH+I))+(A(IB+I)+A(IF+I))))
+ C(JC+J)=Z*((A(IA+I)+A(IE+I))-(A(IC+I)+A(IG+I)))
+ D(JC+J)=Z*((A(ID+I)+A(IH+I))-(A(IB+I)+A(IF+I)))
+ C(JB+J)=Z*(A(IA+I)-A(IE+I))
+ * +ZSIN45*((A(IH+I)-A(ID+I))-(A(IF+I)-A(IB+I)))
+ C(JD+J)=Z*(A(IA+I)-A(IE+I))
+ * -ZSIN45*((A(IH+I)-A(ID+I))-(A(IF+I)-A(IB+I)))
+ D(JB+J)=ZSIN45*((A(IH+I)-A(ID+I))+(A(IF+I)-A(IB+I)))
+ * +Z*(A(IG+I)-A(IC+I))
+ D(JD+J)=ZSIN45*((A(IH+I)-A(ID+I))+(A(IF+I)-A(IB+I)))
+ * -Z*(A(IG+I)-A(IC+I))
+ I=I+INC3
+ J=J+INC4
+ 810 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 820 CONTINUE
+C
+C RETURN
+C ------
+ 900 CONTINUE
+ IBAD=0
+ 910 CONTINUE
+ IERR=IBAD
+ RETURN
+ END
diff --git a/fft/rpassf.f b/fft/rpassf.f
new file mode 100755
index 0000000..32ea34e
--- /dev/null
+++ b/fft/rpassf.f
@@ -0,0 +1,910 @@
+c Copyright 1981-2012 ECMWF.
+c
+c This software is licensed under the terms of the Apache Licence
+c Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+c
+c In applying this licence, ECMWF does not waive the privileges and immunities
+c granted to it by virtue of its status as an intergovernmental organisation
+c nor does it submit to any jurisdiction.
+c
+
+C SUBROUTINE 'RPASSF' - PERFORMS ONE PASS THROUGH DATA AS PART
+C OF MULTIPLE REAL FFT (FOURIER SYNTHESIS) ROUTINE
+C
+C A IS FIRST REAL INPUT VECTOR
+C EQUIVALENCE B(1) WITH A (LA*INC1+1)
+C C IS FIRST REAL OUTPUT VECTOR
+C EQUIVALENCE D(1) WITH C(IFAC*LA*INC2+1)
+C TRIGS IS A PRECALCULATED LIST OF SINES & COSINES
+C INC1 IS THE ADDRESSING INCREMENT FOR A
+C INC2 IS THE ADDRESSING INCREMENT FOR C
+C INC3 IS THE INCREMENT BETWEEN INPUT VECTORS A
+C INC4 IS THE INCREMENT BETWEEN OUTPUT VECTORS C
+C LOT IS THE NUMBER OF VECTORS
+C N IS THE LENGTH OF THE VECTORS
+C IFAC IS THE CURRENT FACTOR OF N
+C LA IS THE PRODUCT OF PREVIOUS FACTORS
+C IERR IS AN ERROR INDICATOR:
+C 0 - PASS COMPLETED WITHOUT ERROR
+C 2 - IFAC NOT CATERED FOR
+C 3 - IFAC ONLY CATERED FOR IF LA=N/IFAC
+C LIPL=.T. => RESULTS ARE RETURNED TO INPUT ARRAY
+C (ONLY VALID IF LA=N/IFAC, I.E. ON LAST PASS)
+C
+C-----------------------------------------------------------------------
+C
+ SUBROUTINE RPASSF(A,B,C,D,TRIGS,INC1,INC2,INC3,INC4,LOT,N,IFAC,
+ * LA,IERR,LIPL)
+ DIMENSION A(N),B(N),C(N),D(N),TRIGS(N)
+ LOGICAL LIPL
+C
+ DATA SIN36/0.587785252292473/,SIN72/0.951056516295154/,
+ * QRT5/0.559016994374947/,SIN60/0.866025403784437/
+C
+ M=N/IFAC
+ IINK=LA*INC1
+ JINK=LA*INC2
+ JUMP=(IFAC-1)*JINK
+ KSTOP=(N-IFAC)/(2*IFAC)
+C
+ IBASE=0
+ JBASE=0
+ IBAD=0
+C
+! Increase the vector length by fusing the loops if the
+! data layout is appropriate:
+ IF (INC1.EQ.LOT.AND.INC2.EQ.LOT.AND.INC3.EQ.1.AND.INC4.EQ.1) THEN
+ ILA=1
+ ILOT=LA*LOT
+ INC21=LA*LOT
+ ELSE
+ ILA=LA
+ ILOT=LOT
+ INC21=INC2
+ ENDIF
+C
+ IF (IFAC.EQ.2) THEN
+C
+C CODING FOR FACTOR 2
+C -------------------
+ 200 CONTINUE
+ IA=1
+ IB=IA+(2*M-LA)*INC1
+ JA=1
+ JB=JA+JINK
+C
+ IF (LA.NE.M) THEN
+C
+ DO 220 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 210 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+A(IB+I)
+ C(JB+J)=A(IA+I)-A(IB+I)
+ I=I+INC3
+ J=J+INC4
+ 210 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 220 CONTINUE
+ IA=IA+IINK
+ IINK=2*IINK
+ IB=IB-IINK
+ IBASE=0
+ JBASE=JBASE+JUMP
+ JUMP=2*JUMP+JINK
+C
+ IF (IA.LT.IB) THEN
+ DO 250 K=LA,KSTOP,LA
+ KB=K+K
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ IBASE=0
+ DO 240 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 230 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+A(IB+I)
+ D(JA+J)=B(IA+I)-B(IB+I)
+ C(JB+J)=C1*(A(IA+I)-A(IB+I))-S1*(B(IA+I)+B(IB+I))
+ D(JB+J)=S1*(A(IA+I)-A(IB+I))+C1*(B(IA+I)+B(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 230 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 240 CONTINUE
+ IA=IA+IINK
+ IB=IB-IINK
+ JBASE=JBASE+JUMP
+ 250 CONTINUE
+ ENDIF
+C
+ IF (IA.EQ.IB) THEN
+ IBASE=0
+ DO 280 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 270 IJK=1,ILOT
+ C(JA+J)=A(IA+I)
+ C(JB+J)=-B(IA+I)
+ I=I+INC3
+ J=J+INC4
+ 270 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 280 CONTINUE
+ ENDIF
+C
+ ELSE !!! Case LA=M
+ IF (LIPL) THEN
+ DO 294 L=1,ILA
+ I=IBASE
+!OCL NOVREC
+ DO 292 IJK=1,ILOT
+ T1=2.0*(A(IA+I)-A(IB+I))
+ A(IA+I)=2.0*(A(IA+I)+A(IB+I))
+ A(IB+I)=T1
+ I=I+INC3
+ 292 CONTINUE
+ IBASE=IBASE+INC1
+ 294 CONTINUE
+ ELSE
+ DO 298 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 296 IJK=1,ILOT
+ C(JA+J)=2.0*(A(IA+I)+A(IB+I))
+ C(JB+J)=2.0*(A(IA+I)-A(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 296 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 298 CONTINUE
+ ENDIF
+ ENDIF
+C
+ ELSEIF (IFAC.EQ.3) THEN
+C
+C CODING FOR FACTOR 3
+C -------------------
+ 300 CONTINUE
+ IA=1
+ IB=IA+(2*M-LA)*INC1
+ IC=IB
+ JA=1
+ JB=JA+JINK
+ JC=JB+JINK
+C
+ IF (LA.NE.M) THEN
+C
+ DO 320 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 310 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+A(IB+I)
+ C(JB+J)=(A(IA+I)-0.5*A(IB+I))-(SIN60*(B(IB+I)))
+ C(JC+J)=(A(IA+I)-0.5*A(IB+I))+(SIN60*(B(IB+I)))
+ I=I+INC3
+ J=J+INC4
+ 310 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 320 CONTINUE
+ IA=IA+IINK
+ IINK=2*IINK
+ IB=IB+IINK
+ IC=IC-IINK
+ JBASE=JBASE+JUMP
+ JUMP=2*JUMP+JINK
+C
+ IF (IA.LT.IC) THEN
+ DO 350 K=LA,KSTOP,LA
+ KB=K+K
+ KC=KB+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ IBASE=0
+ DO 340 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 330 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+(A(IB+I)+A(IC+I))
+ D(JA+J)=B(IA+I)+(B(IB+I)-B(IC+I))
+ C(JB+J)=
+ * C1*((A(IA+I)-0.5*(A(IB+I)+A(IC+I)))-(SIN60*(B(IB+I)+B(IC+I))))
+ * -S1*((B(IA+I)-0.5*(B(IB+I)-B(IC+I)))+(SIN60*(A(IB+I)-A(IC+I))))
+ D(JB+J)=
+ * S1*((A(IA+I)-0.5*(A(IB+I)+A(IC+I)))-(SIN60*(B(IB+I)+B(IC+I))))
+ * +C1*((B(IA+I)-0.5*(B(IB+I)-B(IC+I)))+(SIN60*(A(IB+I)-A(IC+I))))
+ C(JC+J)=
+ * C2*((A(IA+I)-0.5*(A(IB+I)+A(IC+I)))+(SIN60*(B(IB+I)+B(IC+I))))
+ * -S2*((B(IA+I)-0.5*(B(IB+I)-B(IC+I)))-(SIN60*(A(IB+I)-A(IC+I))))
+ D(JC+J)=
+ * S2*((A(IA+I)-0.5*(A(IB+I)+A(IC+I)))+(SIN60*(B(IB+I)+B(IC+I))))
+ * +C2*((B(IA+I)-0.5*(B(IB+I)-B(IC+I)))-(SIN60*(A(IB+I)-A(IC+I))))
+ I=I+INC3
+ J=J+INC4
+ 330 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 340 CONTINUE
+ IA=IA+IINK
+ IB=IB+IINK
+ IC=IC-IINK
+ JBASE=JBASE+JUMP
+ 350 CONTINUE
+ ENDIF
+C
+ IF (IA.EQ.IC) THEN
+ IBASE=0
+ DO 380 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 370 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+A(IB+I)
+ C(JB+J)=(0.5*A(IA+I)-A(IB+I))-(SIN60*B(IA+I))
+ C(JC+J)=-(0.5*A(IA+I)-A(IB+I))-(SIN60*B(IA+I))
+ I=I+INC3
+ J=J+INC4
+ 370 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 380 CONTINUE
+ ENDIF
+C
+ ELSE !!! Case LA=M
+ SSIN60=2.0*SIN60
+ IF (LIPL) THEN
+ DO 394 L=1,ILA
+ I=IBASE
+!OCL NOVREC
+ DO 392 IJK=1,ILOT
+ T1=(2.0*A(IA+I)-A(IB+I))-(SSIN60*B(IB+I))
+ T2=(2.0*A(IA+I)-A(IB+I))+(SSIN60*B(IB+I))
+ A(IA+I)=2.0*(A(IA+I)+A(IB+I))
+ A(IB+I)=T1
+ B(IB+I)=T2
+ I=I+INC3
+ 392 CONTINUE
+ IBASE=IBASE+INC1
+ 394 CONTINUE
+ ELSE
+ DO 398 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 396 IJK=1,ILOT
+ C(JA+J)=2.0*(A(IA+I)+A(IB+I))
+ C(JB+J)=(2.0*A(IA+I)-A(IB+I))-(SSIN60*B(IB+I))
+ C(JC+J)=(2.0*A(IA+I)-A(IB+I))+(SSIN60*B(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 396 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 398 CONTINUE
+ ENDIF
+ ENDIF
+C
+ ELSEIF (IFAC.EQ.4) THEN
+C
+C CODING FOR FACTOR 4
+C -------------------
+ 400 CONTINUE
+ IA=1
+ IB=IA+(2*M-LA)*INC1
+ IC=IB+2*M*INC1
+ ID=IB
+ JA=1
+ JB=JA+JINK
+ JC=JB+JINK
+ JD=JC+JINK
+C
+ IF (LA.NE.M) THEN
+C
+ DO 420 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 410 IJK=1,ILOT
+ C(JA+J)=(A(IA+I)+A(IC+I))+A(IB+I)
+ C(JB+J)=(A(IA+I)-A(IC+I))-B(IB+I)
+ C(JC+J)=(A(IA+I)+A(IC+I))-A(IB+I)
+ C(JD+J)=(A(IA+I)-A(IC+I))+B(IB+I)
+ I=I+INC3
+ J=J+INC4
+ 410 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 420 CONTINUE
+ IA=IA+IINK
+ IINK=2*IINK
+ IB=IB+IINK
+ IC=IC-IINK
+ ID=ID-IINK
+ JBASE=JBASE+JUMP
+ JUMP=2*JUMP+JINK
+C
+ IF (IB.LT.IC) THEN
+ DO 450 K=LA,KSTOP,LA
+ KB=K+K
+ KC=KB+KB
+ KD=KC+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ C3=TRIGS(KD+1)
+ S3=TRIGS(KD+2)
+ IBASE=0
+ DO 440 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 430 IJK=1,ILOT
+ C(JA+J)=(A(IA+I)+A(IC+I))+(A(IB+I)+A(ID+I))
+ D(JA+J)=(B(IA+I)-B(IC+I))+(B(IB+I)-B(ID+I))
+ C(JC+J)=
+ * C2*((A(IA+I)+A(IC+I))-(A(IB+I)+A(ID+I)))
+ * -S2*((B(IA+I)-B(IC+I))-(B(IB+I)-B(ID+I)))
+ D(JC+J)=
+ * S2*((A(IA+I)+A(IC+I))-(A(IB+I)+A(ID+I)))
+ * +C2*((B(IA+I)-B(IC+I))-(B(IB+I)-B(ID+I)))
+ C(JB+J)=
+ * C1*((A(IA+I)-A(IC+I))-(B(IB+I)+B(ID+I)))
+ * -S1*((B(IA+I)+B(IC+I))+(A(IB+I)-A(ID+I)))
+ D(JB+J)=
+ * S1*((A(IA+I)-A(IC+I))-(B(IB+I)+B(ID+I)))
+ * +C1*((B(IA+I)+B(IC+I))+(A(IB+I)-A(ID+I)))
+ C(JD+J)=
+ * C3*((A(IA+I)-A(IC+I))+(B(IB+I)+B(ID+I)))
+ * -S3*((B(IA+I)+B(IC+I))-(A(IB+I)-A(ID+I)))
+ D(JD+J)=
+ * S3*((A(IA+I)-A(IC+I))+(B(IB+I)+B(ID+I)))
+ * +C3*((B(IA+I)+B(IC+I))-(A(IB+I)-A(ID+I)))
+ I=I+INC3
+ J=J+INC4
+ 430 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 440 CONTINUE
+ IA=IA+IINK
+ IB=IB+IINK
+ IC=IC-IINK
+ ID=ID-IINK
+ JBASE=JBASE+JUMP
+ 450 CONTINUE
+ ENDIF
+C
+ IF (IB.EQ.IC) THEN
+ IBASE=0
+ SIN45=SQRT(0.5)
+ DO 480 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 470 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+A(IB+I)
+ C(JB+J)=SIN45*((A(IA+I)-A(IB+I))-(B(IA+I)+B(IB+I)))
+ C(JC+J)=B(IB+I)-B(IA+I)
+ C(JD+J)=-SIN45*((A(IA+I)-A(IB+I))+(B(IA+I)+B(IB+I)))
+ I=I+INC3
+ J=J+INC4
+ 470 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 480 CONTINUE
+ ENDIF
+C
+ ELSE !!! Case LA=M
+ IF (LIPL) THEN
+ DO 494 L=1,ILA
+ I=IBASE
+!OCL NOVREC
+ DO 492 IJK=1,ILOT
+ T1=2.0*((A(IA+I)-A(IC+I))-B(IB+I))
+ T2=2.0*((A(IA+I)+A(IC+I))-A(IB+I))
+ T3=2.0*((A(IA+I)-A(IC+I))+B(IB+I))
+ A(IA+I)=2.0*((A(IA+I)+A(IC+I))+A(IB+I))
+ A(IB+I)=T1
+ B(IB+I)=T2
+ A(IC+I)=T3
+ I=I+INC3
+ 492 CONTINUE
+ IBASE=IBASE+INC1
+ 494 CONTINUE
+ ELSE
+ DO 498 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 496 IJK=1,ILOT
+ C(JA+J)=2.0*((A(IA+I)+A(IC+I))+A(IB+I))
+ C(JB+J)=2.0*((A(IA+I)-A(IC+I))-B(IB+I))
+ C(JC+J)=2.0*((A(IA+I)+A(IC+I))-A(IB+I))
+ C(JD+J)=2.0*((A(IA+I)-A(IC+I))+B(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 496 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 498 CONTINUE
+ ENDIF
+ ENDIF
+C
+ ELSEIF (IFAC.EQ.5) THEN
+C
+C CODING FOR FACTOR 5
+C -------------------
+ 500 CONTINUE
+ IA=1
+ IB=IA+(2*M-LA)*INC1
+ IC=IB+2*M*INC1
+ ID=IC
+ IE=IB
+ JA=1
+ JB=JA+JINK
+ JC=JB+JINK
+ JD=JC+JINK
+ JE=JD+JINK
+C
+ IF (LA.NE.M) THEN
+C
+ DO 520 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 510 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+(A(IB+I)+A(IC+I))
+ C(JB+J)=((A(IA+I)-0.25*(A(IB+I)+A(IC+I)))+QRT5*(A(IB+I)-A(IC+I)))
+ * -(SIN72*B(IB+I)+SIN36*B(IC+I))
+ C(JC+J)=((A(IA+I)-0.25*(A(IB+I)+A(IC+I)))-QRT5*(A(IB+I)-A(IC+I)))
+ * -(SIN36*B(IB+I)-SIN72*B(IC+I))
+ C(JD+J)=((A(IA+I)-0.25*(A(IB+I)+A(IC+I)))-QRT5*(A(IB+I)-A(IC+I)))
+ * +(SIN36*B(IB+I)-SIN72*B(IC+I))
+ C(JE+J)=((A(IA+I)-0.25*(A(IB+I)+A(IC+I)))+QRT5*(A(IB+I)-A(IC+I)))
+ * +(SIN72*B(IB+I)+SIN36*B(IC+I))
+ I=I+INC3
+ J=J+INC4
+ 510 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 520 CONTINUE
+ IA=IA+IINK
+ IINK=2*IINK
+ IB=IB+IINK
+ IC=IC+IINK
+ ID=ID-IINK
+ IE=IE-IINK
+ JBASE=JBASE+JUMP
+ JUMP=2*JUMP+JINK
+C
+ IF (IB.LT.ID) THEN
+ DO 550 K=LA,KSTOP,LA
+ KB=K+K
+ KC=KB+KB
+ KD=KC+KB
+ KE=KD+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ C3=TRIGS(KD+1)
+ S3=TRIGS(KD+2)
+ C4=TRIGS(KE+1)
+ S4=TRIGS(KE+2)
+ IBASE=0
+ DO 540 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 530 IJK=1,ILOT
+C
+ A10=(A(IA+I)-0.25*((A(IB+I)+A(IE+I))+(A(IC+I)+A(ID+I))))
+ * +QRT5*((A(IB+I)+A(IE+I))-(A(IC+I)+A(ID+I)))
+ A20=(A(IA+I)-0.25*((A(IB+I)+A(IE+I))+(A(IC+I)+A(ID+I))))
+ * -QRT5*((A(IB+I)+A(IE+I))-(A(IC+I)+A(ID+I)))
+ B10=(B(IA+I)-0.25*((B(IB+I)-B(IE+I))+(B(IC+I)-B(ID+I))))
+ * +QRT5*((B(IB+I)-B(IE+I))-(B(IC+I)-B(ID+I)))
+ B20=(B(IA+I)-0.25*((B(IB+I)-B(IE+I))+(B(IC+I)-B(ID+I))))
+ * -QRT5*((B(IB+I)-B(IE+I))-(B(IC+I)-B(ID+I)))
+ A11=SIN72*(B(IB+I)+B(IE+I))+SIN36*(B(IC+I)+B(ID+I))
+ A21=SIN36*(B(IB+I)+B(IE+I))-SIN72*(B(IC+I)+B(ID+I))
+ B11=SIN72*(A(IB+I)-A(IE+I))+SIN36*(A(IC+I)-A(ID+I))
+ B21=SIN36*(A(IB+I)-A(IE+I))-SIN72*(A(IC+I)-A(ID+I))
+C
+ C(JA+J)=A(IA+I)+((A(IB+I)+A(IE+I))+(A(IC+I)+A(ID+I)))
+ D(JA+J)=B(IA+I)+((B(IB+I)-B(IE+I))+(B(IC+I)-B(ID+I)))
+ C(JB+J)=C1*(A10-A11)-S1*(B10+B11)
+ D(JB+J)=S1*(A10-A11)+C1*(B10+B11)
+ C(JE+J)=C4*(A10+A11)-S4*(B10-B11)
+ D(JE+J)=S4*(A10+A11)+C4*(B10-B11)
+ C(JC+J)=C2*(A20-A21)-S2*(B20+B21)
+ D(JC+J)=S2*(A20-A21)+C2*(B20+B21)
+ C(JD+J)=C3*(A20+A21)-S3*(B20-B21)
+ D(JD+J)=S3*(A20+A21)+C3*(B20-B21)
+C
+ I=I+INC3
+ J=J+INC4
+ 530 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 540 CONTINUE
+ IA=IA+IINK
+ IB=IB+IINK
+ IC=IC+IINK
+ ID=ID-IINK
+ IE=IE-IINK
+ JBASE=JBASE+JUMP
+ 550 CONTINUE
+ ENDIF
+C
+ IF (IB.EQ.ID) THEN
+ IBASE=0
+ DO 580 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 570 IJK=1,ILOT
+ C(JA+J)=(A(IA+I)+A(IB+I))+A(IC+I)
+ C(JB+J)=(QRT5*(A(IA+I)-A(IB+I))+(0.25*(A(IA+I)+A(IB+I))-A(IC+I)))
+ * -(SIN36*B(IA+I)+SIN72*B(IB+I))
+ C(JE+J)=-(QRT5*(A(IA+I)-A(IB+I))+(0.25*(A(IA+I)+A(IB+I))-A(IC+I)))
+ * -(SIN36*B(IA+I)+SIN72*B(IB+I))
+ C(JC+J)=(QRT5*(A(IA+I)-A(IB+I))-(0.25*(A(IA+I)+A(IB+I))-A(IC+I)))
+ * -(SIN72*B(IA+I)-SIN36*B(IB+I))
+ C(JD+J)=-(QRT5*(A(IA+I)-A(IB+I))-(0.25*(A(IA+I)+A(IB+I))-A(IC+I)))
+ * -(SIN72*B(IA+I)-SIN36*B(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 570 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 580 CONTINUE
+ ENDIF
+C
+ ELSE !!! Case LA=M
+ QQRT5=2.0*QRT5
+ SSIN36=2.0*SIN36
+ SSIN72=2.0*SIN72
+ IF (LIPL) THEN
+ DO 594 L=1,ILA
+ I=IBASE
+!OCL NOVREC
+ DO 592 IJK=1,ILOT
+ T1=(2.0*(A(IA+I)-0.25*(A(IB+I)+A(IC+I)))
+ * +QQRT5*(A(IB+I)-A(IC+I)))-(SSIN72*B(IB+I)+SSIN36*B(IC+I))
+ T2=(2.0*(A(IA+I)-0.25*(A(IB+I)+A(IC+I)))
+ * -QQRT5*(A(IB+I)-A(IC+I)))-(SSIN36*B(IB+I)-SSIN72*B(IC+I))
+ T3=(2.0*(A(IA+I)-0.25*(A(IB+I)+A(IC+I)))
+ * -QQRT5*(A(IB+I)-A(IC+I)))+(SSIN36*B(IB+I)-SSIN72*B(IC+I))
+ T4=(2.0*(A(IA+I)-0.25*(A(IB+I)+A(IC+I)))
+ * +QQRT5*(A(IB+I)-A(IC+I)))+(SSIN72*B(IB+I)+SSIN36*B(IC+I))
+ A(IA+I)=2.0*(A(IA+I)+(A(IB+I)+A(IC+I)))
+ A(IB+I)=T1
+ B(IB+I)=T2
+ A(IC+I)=T3
+ B(IC+I)=T4
+ I=I+INC3
+ 592 CONTINUE
+ IBASE=IBASE+INC1
+ 594 CONTINUE
+ ELSE
+ DO 598 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 596 IJK=1,ILOT
+ C(JA+J)=2.0*(A(IA+I)+(A(IB+I)+A(IC+I)))
+ C(JB+J)=(2.0*(A(IA+I)-0.25*(A(IB+I)+A(IC+I)))
+ * +QQRT5*(A(IB+I)-A(IC+I)))-(SSIN72*B(IB+I)+SSIN36*B(IC+I))
+ C(JC+J)=(2.0*(A(IA+I)-0.25*(A(IB+I)+A(IC+I)))
+ * -QQRT5*(A(IB+I)-A(IC+I)))-(SSIN36*B(IB+I)-SSIN72*B(IC+I))
+ C(JD+J)=(2.0*(A(IA+I)-0.25*(A(IB+I)+A(IC+I)))
+ * -QQRT5*(A(IB+I)-A(IC+I)))+(SSIN36*B(IB+I)-SSIN72*B(IC+I))
+ C(JE+J)=(2.0*(A(IA+I)-0.25*(A(IB+I)+A(IC+I)))
+ * +QQRT5*(A(IB+I)-A(IC+I)))+(SSIN72*B(IB+I)+SSIN36*B(IC+I))
+ I=I+INC3
+ J=J+INC4
+ 596 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 598 CONTINUE
+ ENDIF
+ ENDIF
+C
+ ELSEIF (IFAC.EQ.6) THEN
+C
+C CODING FOR FACTOR 6
+C -------------------
+ 600 CONTINUE
+ IA=1
+ IB=IA+(2*M-LA)*INC1
+ IC=IB+2*M*INC1
+ ID=IC+2*M*INC1
+ IE=IC
+ IF=IB
+ JA=1
+ JB=JA+JINK
+ JC=JB+JINK
+ JD=JC+JINK
+ JE=JD+JINK
+ JF=JE+JINK
+C
+ IF (LA.NE.M) THEN
+C
+ DO 620 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 610 IJK=1,ILOT
+ C(JA+J)=(A(IA+I)+A(ID+I))+(A(IB+I)+A(IC+I))
+ C(JD+J)=(A(IA+I)-A(ID+I))-(A(IB+I)-A(IC+I))
+ C(JB+J)=((A(IA+I)-A(ID+I))+0.5*(A(IB+I)-A(IC+I)))
+ * -(SIN60*(B(IB+I)+B(IC+I)))
+ C(JF+J)=((A(IA+I)-A(ID+I))+0.5*(A(IB+I)-A(IC+I)))
+ * +(SIN60*(B(IB+I)+B(IC+I)))
+ C(JC+J)=((A(IA+I)+A(ID+I))-0.5*(A(IB+I)+A(IC+I)))
+ * -(SIN60*(B(IB+I)-B(IC+I)))
+ C(JE+J)=((A(IA+I)+A(ID+I))-0.5*(A(IB+I)+A(IC+I)))
+ * +(SIN60*(B(IB+I)-B(IC+I)))
+ I=I+INC3
+ J=J+INC4
+ 610 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 620 CONTINUE
+ IA=IA+IINK
+ IINK=2*IINK
+ IB=IB+IINK
+ IC=IC+IINK
+ ID=ID-IINK
+ IE=IE-IINK
+ IF=IF-IINK
+ JBASE=JBASE+JUMP
+ JUMP=2*JUMP+JINK
+C
+ IF (IC.LT.ID) THEN
+ DO 650 K=LA,KSTOP,LA
+ KB=K+K
+ KC=KB+KB
+ KD=KC+KB
+ KE=KD+KB
+ KF=KE+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ C3=TRIGS(KD+1)
+ S3=TRIGS(KD+2)
+ C4=TRIGS(KE+1)
+ S4=TRIGS(KE+2)
+ C5=TRIGS(KF+1)
+ S5=TRIGS(KF+2)
+ IBASE=0
+ DO 640 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 630 IJK=1,ILOT
+C
+ A11= (A(IE+I)+A(IB+I))+(A(IC+I)+A(IF+I))
+ A20=(A(IA+I)+A(ID+I))-0.5*A11
+ A21=SIN60*((A(IE+I)+A(IB+I))-(A(IC+I)+A(IF+I)))
+ B11= (B(IB+I)-B(IE+I))+(B(IC+I)-B(IF+I))
+ B20=(B(IA+I)-B(ID+I))-0.5*B11
+ B21=SIN60*((B(IB+I)-B(IE+I))-(B(IC+I)-B(IF+I)))
+C
+ C(JA+J)=(A(IA+I)+A(ID+I))+A11
+ D(JA+J)=(B(IA+I)-B(ID+I))+B11
+ C(JC+J)=C2*(A20-B21)-S2*(B20+A21)
+ D(JC+J)=S2*(A20-B21)+C2*(B20+A21)
+ C(JE+J)=C4*(A20+B21)-S4*(B20-A21)
+ D(JE+J)=S4*(A20+B21)+C4*(B20-A21)
+C
+ A11=(A(IE+I)-A(IB+I))+(A(IC+I)-A(IF+I))
+ B11=(B(IE+I)+B(IB+I))-(B(IC+I)+B(IF+I))
+ A20=(A(IA+I)-A(ID+I))-0.5*A11
+ A21=SIN60*((A(IE+I)-A(IB+I))-(A(IC+I)-A(IF+I)))
+ B20=(B(IA+I)+B(ID+I))+0.5*B11
+ B21=SIN60*((B(IE+I)+B(IB+I))+(B(IC+I)+B(IF+I)))
+C
+ C(JD+J)=
+ * C3*((A(IA+I)-A(ID+I))+A11)-S3*((B(IA+I)+B(ID+I))-B11)
+ D(JD+J)=
+ * S3*((A(IA+I)-A(ID+I))+A11)+C3*((B(IA+I)+B(ID+I))-B11)
+ C(JB+J)=C1*(A20-B21)-S1*(B20-A21)
+ D(JB+J)=S1*(A20-B21)+C1*(B20-A21)
+ C(JF+J)=C5*(A20+B21)-S5*(B20+A21)
+ D(JF+J)=S5*(A20+B21)+C5*(B20+A21)
+C
+ I=I+INC3
+ J=J+INC4
+ 630 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 640 CONTINUE
+ IA=IA+IINK
+ IB=IB+IINK
+ IC=IC+IINK
+ ID=ID-IINK
+ IE=IE-IINK
+ IF=IF-IINK
+ JBASE=JBASE+JUMP
+ 650 CONTINUE
+ ENDIF
+C
+ IF (IC.EQ.ID) THEN
+ IBASE=0
+ DO 680 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 670 IJK=1,ILOT
+ C(JA+J)=A(IB+I)+(A(IA+I)+A(IC+I))
+ C(JD+J)=B(IB+I)-(B(IA+I)+B(IC+I))
+ C(JB+J)=(SIN60*(A(IA+I)-A(IC+I)))-(0.5*(B(IA+I)+B(IC+I))+B(IB+I))
+ C(JF+J)=-(SIN60*(A(IA+I)-A(IC+I)))-(0.5*(B(IA+I)+B(IC+I))+B(IB+I))
+ C(JC+J)=SIN60*(B(IC+I)-B(IA+I))+(0.5*(A(IA+I)+A(IC+I))-A(IB+I))
+ C(JE+J)=SIN60*(B(IC+I)-B(IA+I))-(0.5*(A(IA+I)+A(IC+I))-A(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 670 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 680 CONTINUE
+ ENDIF
+C
+ ELSE !!! Case LA=M
+ SSIN60=2.0*SIN60
+ IF (LIPL) THEN
+ DO 694 L=1,ILA
+ I=IBASE
+!OCL NOVREC
+ DO 692 IJK=1,ILOT
+ T1=(2.0*(A(IA+I)-A(ID+I))+(A(IB+I)-A(IC+I)))
+ * -(SSIN60*(B(IB+I)+B(IC+I)))
+ T5=(2.0*(A(IA+I)-A(ID+I))+(A(IB+I)-A(IC+I)))
+ * +(SSIN60*(B(IB+I)+B(IC+I)))
+ T2=(2.0*(A(IA+I)+A(ID+I))-(A(IB+I)+A(IC+I)))
+ * -(SSIN60*(B(IB+I)-B(IC+I)))
+ T4=(2.0*(A(IA+I)+A(ID+I))-(A(IB+I)+A(IC+I)))
+ * +(SSIN60*(B(IB+I)-B(IC+I)))
+ T3=(2.0*(A(IA+I)-A(ID+I)))-(2.0*(A(IB+I)-A(IC+I)))
+ A(IA+I)=(2.0*(A(IA+I)+A(ID+I)))+(2.0*(A(IB+I)+A(IC+I)))
+ A(IB+I)=T1
+ B(IB+I)=T2
+ A(IC+I)=T3
+ B(IC+I)=T4
+ A(ID+I)=T5
+ I=I+INC3
+ 692 CONTINUE
+ IBASE=IBASE+INC1
+ 694 CONTINUE
+ ELSE
+ DO 698 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 696 IJK=1,ILOT
+ C(JA+J)=(2.0*(A(IA+I)+A(ID+I)))+(2.0*(A(IB+I)+A(IC+I)))
+ C(JD+J)=(2.0*(A(IA+I)-A(ID+I)))-(2.0*(A(IB+I)-A(IC+I)))
+ C(JB+J)=(2.0*(A(IA+I)-A(ID+I))+(A(IB+I)-A(IC+I)))
+ * -(SSIN60*(B(IB+I)+B(IC+I)))
+ C(JF+J)=(2.0*(A(IA+I)-A(ID+I))+(A(IB+I)-A(IC+I)))
+ * +(SSIN60*(B(IB+I)+B(IC+I)))
+ C(JC+J)=(2.0*(A(IA+I)+A(ID+I))-(A(IB+I)+A(IC+I)))
+ * -(SSIN60*(B(IB+I)-B(IC+I)))
+ C(JE+J)=(2.0*(A(IA+I)+A(ID+I))-(A(IB+I)+A(IC+I)))
+ * +(SSIN60*(B(IB+I)-B(IC+I)))
+ I=I+INC3
+ J=J+INC4
+ 696 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 698 CONTINUE
+ ENDIF
+ ENDIF
+C
+ ELSEIF (IFAC.EQ.8) THEN
+C
+C CODING FOR FACTOR 8
+C -------------------
+ 800 CONTINUE
+ IF (LA.NE.M) THEN
+ IBAD=3
+ ELSE
+ IA=1
+ IB=IA+LA*INC1
+ IC=IB+2*LA*INC1
+ ID=IC+2*LA*INC1
+ IE=ID+2*LA*INC1
+ JA=1
+ JB=JA+JINK
+ JC=JB+JINK
+ JD=JC+JINK
+ JE=JD+JINK
+ JF=JE+JINK
+ JG=JF+JINK
+ JH=JG+JINK
+ SSIN45=SQRT(2.0)
+C
+ IF (LIPL) THEN
+ DO 820 L=1,ILA
+ I=IBASE
+!OCL NOVREC
+ DO 810 IJK=1,ILOT
+ T2=2.0*(((A(IA+I)+A(IE+I))-A(IC+I))-(B(IB+I)-B(ID+I)))
+ T6=2.0*(((A(IA+I)+A(IE+I))-A(IC+I))+(B(IB+I)-B(ID+I)))
+ T1=2.0*((A(IA+I)-A(IE+I))-B(IC+I))
+ * +SSIN45*((A(IB+I)-A(ID+I))-(B(IB+I)+B(ID+I)))
+ T5=2.0*((A(IA+I)-A(IE+I))-B(IC+I))
+ * -SSIN45*((A(IB+I)-A(ID+I))-(B(IB+I)+B(ID+I)))
+ T3=2.0*((A(IA+I)-A(IE+I))+B(IC+I))
+ * -SSIN45*((A(IB+I)-A(ID+I))+(B(IB+I)+B(ID+I)))
+ T7=2.0*((A(IA+I)-A(IE+I))+B(IC+I))
+ * +SSIN45*((A(IB+I)-A(ID+I))+(B(IB+I)+B(ID+I)))
+ T4=2.0*(((A(IA+I)+A(IE+I))+A(IC+I))-(A(IB+I)+A(ID+I)))
+ A(IA+I)=2.0*(((A(IA+I)+A(IE+I))+A(IC+I))+(A(IB+I)+A(ID+I)))
+ A(IB+I)=T1
+ B(IB+I)=T2
+ A(IC+I)=T3
+ B(IC+I)=T4
+ A(ID+I)=T5
+ B(ID+I)=T6
+ A(IE+I)=T7
+ I=I+INC3
+ 810 CONTINUE
+ IBASE=IBASE+INC1
+ 820 CONTINUE
+ ELSE
+ DO 840 L=1,ILA
+ I=IBASE
+ J=JBASE
+!OCL NOVREC
+ DO 830 IJK=1,ILOT
+ C(JA+J)=2.0*(((A(IA+I)+A(IE+I))+A(IC+I))+(A(IB+I)+A(ID+I)))
+ C(JE+J)=2.0*(((A(IA+I)+A(IE+I))+A(IC+I))-(A(IB+I)+A(ID+I)))
+ C(JC+J)=2.0*(((A(IA+I)+A(IE+I))-A(IC+I))-(B(IB+I)-B(ID+I)))
+ C(JG+J)=2.0*(((A(IA+I)+A(IE+I))-A(IC+I))+(B(IB+I)-B(ID+I)))
+ C(JB+J)=2.0*((A(IA+I)-A(IE+I))-B(IC+I))
+ * +SSIN45*((A(IB+I)-A(ID+I))-(B(IB+I)+B(ID+I)))
+ C(JF+J)=2.0*((A(IA+I)-A(IE+I))-B(IC+I))
+ * -SSIN45*((A(IB+I)-A(ID+I))-(B(IB+I)+B(ID+I)))
+ C(JD+J)=2.0*((A(IA+I)-A(IE+I))+B(IC+I))
+ * -SSIN45*((A(IB+I)-A(ID+I))+(B(IB+I)+B(ID+I)))
+ C(JH+J)=2.0*((A(IA+I)-A(IE+I))+B(IC+I))
+ * +SSIN45*((A(IB+I)-A(ID+I))+(B(IB+I)+B(ID+I)))
+ I=I+INC3
+ J=J+INC4
+ 830 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC21
+ 840 CONTINUE
+ ENDIF
+C
+ ENDIF
+C
+ ELSE
+C
+ IBAD=2 !!! Illegal factor
+C
+ ENDIF
+C
+C RETURN
+C ------
+ 900 CONTINUE
+ IERR=IBAD
+ RETURN
+ END
diff --git a/fft/rpassm.f b/fft/rpassm.f
new file mode 100755
index 0000000..5596973
--- /dev/null
+++ b/fft/rpassm.f
@@ -0,0 +1,790 @@
+c Copyright 1981-2012 ECMWF.
+c
+c This software is licensed under the terms of the Apache Licence
+c Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+c
+c In applying this licence, ECMWF does not waive the privileges and immunities
+c granted to it by virtue of its status as an intergovernmental organisation
+c nor does it submit to any jurisdiction.
+c
+
+ SUBROUTINE RPASSM(A,B,C,D,TRIGS,INC1,INC2,INC3,INC4,ILOT,N,IFAC,
+ * ILA,IERR)
+ REAL A(*),B(*),C(*),D(*),TRIGS(*)
+C
+C SUBROUTINE 'RPASSM' - PERFORMS ONE PASS THROUGH DATA AS PART
+C OF MULTIPLE REAL FFT (FOURIER SYNTHESIS) ROUTINE
+C
+C A IS FIRST REAL INPUT VECTOR
+C EQUIVALENCE B(1) WITH A (ILA*INC1+1)
+C C IS FIRST REAL OUTPUT VECTOR
+C EQUIVALENCE D(1) WITH C(IFAC*ILA*INC2+1)
+C TRIGS IS A PRECALCULATED LIST OF SINES & COSINES
+C INC1 IS THE ADDRESSING INCREMENT FOR A
+C INC2 IS THE ADDRESSING INCREMENT FOR C
+C INC3 IS THE INCREMENT BETWEEN INPUT VECTORS A
+C INC4 IS THE INCREMENT BETWEEN OUTPUT VECTORS C
+C ILOT IS THE NUMBER OF VECTORS
+C N IS THE LENGTH OF THE VECTORS
+C IFAC IS THE CURRENT FACTOR OF N
+C ILA IS THE PRODUCT OF PREVIOUS FACTORS
+C IERR IS AN ERROR INDICATOR:
+C 0 - PASS COMPLETED WITHOUT ERROR
+C 1 - ILOT GREATER THAN 64
+C 2 - IFAC NOT CATERED FOR
+C 3 - IFAC ONLY CATERED FOR IF ILA=N/IFAC
+C
+C-----------------------------------------------------------------------
+C
+ REAL A10(512),A11(512),
+ * A20(512),A21(512),
+ * B10(512),B11(512),B20(512),B21(512)
+C
+ SAVE SIN36, SIN72, QRT5, SIN60
+C
+ DATA SIN36/0.587785252292473/,SIN72/0.951056516295154/,
+ * QRT5/0.559016994374947/,SIN60/0.866025403784437/
+C
+ M=N/IFAC
+ IINK=ILA*INC1
+ JINK=ILA*INC2
+ JUMP=(IFAC-1)*JINK
+ KSTOP=(N-IFAC)/(2*IFAC)
+C
+ IBAD=1
+ IF (ILOT.GT.512) GO TO 910
+ IBASE=0
+ JBASE=0
+ IGO=IFAC-1
+ IF (IGO.EQ.7) IGO=6
+ IBAD=2
+ IF (IGO.LT.1.OR.IGO.GT.6) GO TO 910
+ GO TO (200,300,400,500,600,800),IGO
+C
+C CODING FOR FACTOR 2
+C -------------------
+ 200 CONTINUE
+ IA=1
+ IB=IA+(2*M-ILA)*INC1
+ JA=1
+ JB=JA+JINK
+C
+ IF (ILA.EQ.M) GO TO 290
+C
+ DO 220 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 210 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+A(IB+I)
+ C(JB+J)=A(IA+I)-A(IB+I)
+ I=I+INC3
+ J=J+INC4
+ 210 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 220 CONTINUE
+ IA=IA+IINK
+ IINK=2*IINK
+ IB=IB-IINK
+ IBASE=0
+ JBASE=JBASE+JUMP
+ JUMP=2*JUMP+JINK
+ IF (IA.EQ.IB) GO TO 260
+ DO 250 K=ILA,KSTOP,ILA
+ KB=K+K
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ IBASE=0
+ DO 240 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 230 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+A(IB+I)
+ D(JA+J)=B(IA+I)-B(IB+I)
+ C(JB+J)=C1*(A(IA+I)-A(IB+I))-S1*(B(IA+I)+B(IB+I))
+ D(JB+J)=S1*(A(IA+I)-A(IB+I))+C1*(B(IA+I)+B(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 230 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 240 CONTINUE
+ IA=IA+IINK
+ IB=IB-IINK
+ JBASE=JBASE+JUMP
+ 250 CONTINUE
+ IF (IA.GT.IB) GO TO 900
+ 260 CONTINUE
+ IBASE=0
+ DO 280 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 270 IJK=1,ILOT
+ C(JA+J)=A(IA+I)
+ C(JB+J)=-B(IA+I)
+ I=I+INC3
+ J=J+INC4
+ 270 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 280 CONTINUE
+ GO TO 900
+C
+ 290 CONTINUE
+ DO 294 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 292 IJK=1,ILOT
+ C(JA+J)=2.0*(A(IA+I)+A(IB+I))
+ C(JB+J)=2.0*(A(IA+I)-A(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 292 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 294 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 3
+C -------------------
+ 300 CONTINUE
+ IA=1
+ IB=IA+(2*M-ILA)*INC1
+ IC=IB
+ JA=1
+ JB=JA+JINK
+ JC=JB+JINK
+C
+ IF (ILA.EQ.M) GO TO 390
+C
+ DO 320 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 310 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+A(IB+I)
+ C(JB+J)=(A(IA+I)-0.5*A(IB+I))-(SIN60*(B(IB+I)))
+ C(JC+J)=(A(IA+I)-0.5*A(IB+I))+(SIN60*(B(IB+I)))
+ I=I+INC3
+ J=J+INC4
+ 310 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 320 CONTINUE
+ IA=IA+IINK
+ IINK=2*IINK
+ IB=IB+IINK
+ IC=IC-IINK
+ JBASE=JBASE+JUMP
+ JUMP=2*JUMP+JINK
+ IF (IA.EQ.IC) GO TO 360
+ DO 350 K=ILA,KSTOP,ILA
+ KB=K+K
+ KC=KB+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ IBASE=0
+ DO 340 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 330 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+(A(IB+I)+A(IC+I))
+ D(JA+J)=B(IA+I)+(B(IB+I)-B(IC+I))
+ C(JB+J)=
+ * C1*((A(IA+I)-0.5*(A(IB+I)+A(IC+I)))-(SIN60*(B(IB+I)+B(IC+
+ * I))))
+ * -S1*((B(IA+I)-0.5*(B(IB+I)-B(IC+I)))+(SIN60*(A(IB+I)-A(IC+
+ * I))))
+ D(JB+J)=
+ * S1*((A(IA+I)-0.5*(A(IB+I)+A(IC+I)))-(SIN60*(B(IB+I)+B(IC+
+ * I))))
+ * +C1*((B(IA+I)-0.5*(B(IB+I)-B(IC+I)))+(SIN60*(A(IB+I)-A(IC+
+ * I))))
+ C(JC+J)=
+ * C2*((A(IA+I)-0.5*(A(IB+I)+A(IC+I)))+(SIN60*(B(IB+I)+B(IC+
+ * I))))
+ * -S2*((B(IA+I)-0.5*(B(IB+I)-B(IC+I)))-(SIN60*(A(IB+I)-A(IC+
+ * I))))
+ D(JC+J)=
+ * S2*((A(IA+I)-0.5*(A(IB+I)+A(IC+I)))+(SIN60*(B(IB+I)+B(IC+
+ * I))))
+ * +C2*((B(IA+I)-0.5*(B(IB+I)-B(IC+I)))-(SIN60*(A(IB+I)-A(IC+
+ * I))))
+ I=I+INC3
+ J=J+INC4
+ 330 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 340 CONTINUE
+ IA=IA+IINK
+ IB=IB+IINK
+ IC=IC-IINK
+ JBASE=JBASE+JUMP
+ 350 CONTINUE
+ IF (IA.GT.IC) GO TO 900
+ 360 CONTINUE
+ IBASE=0
+ DO 380 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 370 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+A(IB+I)
+ C(JB+J)=(0.5*A(IA+I)-A(IB+I))-(SIN60*B(IA+I))
+ C(JC+J)=-(0.5*A(IA+I)-A(IB+I))-(SIN60*B(IA+I))
+ I=I+INC3
+ J=J+INC4
+ 370 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 380 CONTINUE
+ GO TO 900
+C
+ 390 CONTINUE
+ SSIN60=2.0*SIN60
+ DO 394 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 392 IJK=1,ILOT
+ C(JA+J)=2.0*(A(IA+I)+A(IB+I))
+ C(JB+J)=(2.0*A(IA+I)-A(IB+I))-(SSIN60*B(IB+I))
+ C(JC+J)=(2.0*A(IA+I)-A(IB+I))+(SSIN60*B(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 392 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 394 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 4
+C -------------------
+ 400 CONTINUE
+ IA=1
+ IB=IA+(2*M-ILA)*INC1
+ IC=IB+2*M*INC1
+ ID=IB
+ JA=1
+ JB=JA+JINK
+ JC=JB+JINK
+ JD=JC+JINK
+C
+ IF (ILA.EQ.M) GO TO 490
+C
+ DO 420 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 410 IJK=1,ILOT
+ C(JA+J)=(A(IA+I)+A(IC+I))+A(IB+I)
+ C(JB+J)=(A(IA+I)-A(IC+I))-B(IB+I)
+ C(JC+J)=(A(IA+I)+A(IC+I))-A(IB+I)
+ C(JD+J)=(A(IA+I)-A(IC+I))+B(IB+I)
+ I=I+INC3
+ J=J+INC4
+ 410 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 420 CONTINUE
+ IA=IA+IINK
+ IINK=2*IINK
+ IB=IB+IINK
+ IC=IC-IINK
+ ID=ID-IINK
+ JBASE=JBASE+JUMP
+ JUMP=2*JUMP+JINK
+ IF (IB.EQ.IC) GO TO 460
+ DO 450 K=ILA,KSTOP,ILA
+ KB=K+K
+ KC=KB+KB
+ KD=KC+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ C3=TRIGS(KD+1)
+ S3=TRIGS(KD+2)
+ IBASE=0
+ DO 440 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 430 IJK=1,ILOT
+ C(JA+J)=(A(IA+I)+A(IC+I))+(A(IB+I)+A(ID+I))
+ D(JA+J)=(B(IA+I)-B(IC+I))+(B(IB+I)-B(ID+I))
+ C(JC+J)=
+ * C2*((A(IA+I)+A(IC+I))-(A(IB+I)+A(ID+I)))
+ * -S2*((B(IA+I)-B(IC+I))-(B(IB+I)-B(ID+I)))
+ D(JC+J)=
+ * S2*((A(IA+I)+A(IC+I))-(A(IB+I)+A(ID+I)))
+ * +C2*((B(IA+I)-B(IC+I))-(B(IB+I)-B(ID+I)))
+ C(JB+J)=
+ * C1*((A(IA+I)-A(IC+I))-(B(IB+I)+B(ID+I)))
+ * -S1*((B(IA+I)+B(IC+I))+(A(IB+I)-A(ID+I)))
+ D(JB+J)=
+ * S1*((A(IA+I)-A(IC+I))-(B(IB+I)+B(ID+I)))
+ * +C1*((B(IA+I)+B(IC+I))+(A(IB+I)-A(ID+I)))
+ C(JD+J)=
+ * C3*((A(IA+I)-A(IC+I))+(B(IB+I)+B(ID+I)))
+ * -S3*((B(IA+I)+B(IC+I))-(A(IB+I)-A(ID+I)))
+ D(JD+J)=
+ * S3*((A(IA+I)-A(IC+I))+(B(IB+I)+B(ID+I)))
+ * +C3*((B(IA+I)+B(IC+I))-(A(IB+I)-A(ID+I)))
+ I=I+INC3
+ J=J+INC4
+ 430 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 440 CONTINUE
+ IA=IA+IINK
+ IB=IB+IINK
+ IC=IC-IINK
+ ID=ID-IINK
+ JBASE=JBASE+JUMP
+ 450 CONTINUE
+ IF (IB.GT.IC) GO TO 900
+ 460 CONTINUE
+ IBASE=0
+ SIN45=SQRT(0.5)
+ DO 480 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 470 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+A(IB+I)
+ C(JB+J)=SIN45*((A(IA+I)-A(IB+I))-(B(IA+I)+B(IB+I)))
+ C(JC+J)=B(IB+I)-B(IA+I)
+ C(JD+J)=-SIN45*((A(IA+I)-A(IB+I))+(B(IA+I)+B(IB+I)))
+ I=I+INC3
+ J=J+INC4
+ 470 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 480 CONTINUE
+ GO TO 900
+C
+ 490 CONTINUE
+ DO 494 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 492 IJK=1,ILOT
+ C(JA+J)=2.0*((A(IA+I)+A(IC+I))+A(IB+I))
+ C(JB+J)=2.0*((A(IA+I)-A(IC+I))-B(IB+I))
+ C(JC+J)=2.0*((A(IA+I)+A(IC+I))-A(IB+I))
+ C(JD+J)=2.0*((A(IA+I)-A(IC+I))+B(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 492 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 494 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 5
+C -------------------
+ 500 CONTINUE
+ IA=1
+ IB=IA+(2*M-ILA)*INC1
+ IC=IB+2*M*INC1
+ ID=IC
+ IE=IB
+ JA=1
+ JB=JA+JINK
+ JC=JB+JINK
+ JD=JC+JINK
+ JE=JD+JINK
+C
+ IF (ILA.EQ.M) GO TO 590
+C
+ DO 520 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 510 IJK=1,ILOT
+ C(JA+J)=A(IA+I)+(A(IB+I)+A(IC+I))
+ C(JB+J)=((A(IA+I)-0.25*(A(IB+I)+A(IC+I)))+QRT5*(A(IB+I)-A(IC+
+ * I)))
+ * -(SIN72*B(IB+I)+SIN36*B(IC+I))
+ C(JC+J)=((A(IA+I)-0.25*(A(IB+I)+A(IC+I)))-QRT5*(A(IB+I)-A(IC+
+ * I)))
+ * -(SIN36*B(IB+I)-SIN72*B(IC+I))
+ C(JD+J)=((A(IA+I)-0.25*(A(IB+I)+A(IC+I)))-QRT5*(A(IB+I)-A(IC+
+ * I)))
+ * +(SIN36*B(IB+I)-SIN72*B(IC+I))
+ C(JE+J)=((A(IA+I)-0.25*(A(IB+I)+A(IC+I)))+QRT5*(A(IB+I)-A(IC+
+ * I)))
+ * +(SIN72*B(IB+I)+SIN36*B(IC+I))
+ I=I+INC3
+ J=J+INC4
+ 510 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 520 CONTINUE
+ IA=IA+IINK
+ IINK=2*IINK
+ IB=IB+IINK
+ IC=IC+IINK
+ ID=ID-IINK
+ IE=IE-IINK
+ JBASE=JBASE+JUMP
+ JUMP=2*JUMP+JINK
+ IF (IB.EQ.ID) GO TO 560
+ DO 550 K=ILA,KSTOP,ILA
+ KB=K+K
+ KC=KB+KB
+ KD=KC+KB
+ KE=KD+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ C3=TRIGS(KD+1)
+ S3=TRIGS(KD+2)
+ C4=TRIGS(KE+1)
+ S4=TRIGS(KE+2)
+ IBASE=0
+ DO 540 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 530 IJK=1,ILOT
+C
+ A10(IJK)=(A(IA+I)-0.25*((A(IB+I)+A(IE+I))+(A(IC+I)+A(ID+I))))
+ * +QRT5*((A(IB+I)+A(IE+I))-(A(IC+I)+A(ID+I)))
+ A20(IJK)=(A(IA+I)-0.25*((A(IB+I)+A(IE+I))+(A(IC+I)+A(ID+I))))
+ * -QRT5*((A(IB+I)+A(IE+I))-(A(IC+I)+A(ID+I)))
+ B10(IJK)=(B(IA+I)-0.25*((B(IB+I)-B(IE+I))+(B(IC+I)-B(ID+I))))
+ * +QRT5*((B(IB+I)-B(IE+I))-(B(IC+I)-B(ID+I)))
+ B20(IJK)=(B(IA+I)-0.25*((B(IB+I)-B(IE+I))+(B(IC+I)-B(ID+I))))
+ * -QRT5*((B(IB+I)-B(IE+I))-(B(IC+I)-B(ID+I)))
+ A11(IJK)=SIN72*(B(IB+I)+B(IE+I))+SIN36*(B(IC+I)+B(ID+I))
+ A21(IJK)=SIN36*(B(IB+I)+B(IE+I))-SIN72*(B(IC+I)+B(ID+I))
+ B11(IJK)=SIN72*(A(IB+I)-A(IE+I))+SIN36*(A(IC+I)-A(ID+I))
+ B21(IJK)=SIN36*(A(IB+I)-A(IE+I))-SIN72*(A(IC+I)-A(ID+I))
+C
+ C(JA+J)=A(IA+I)+((A(IB+I)+A(IE+I))+(A(IC+I)+A(ID+I)))
+ D(JA+J)=B(IA+I)+((B(IB+I)-B(IE+I))+(B(IC+I)-B(ID+I)))
+ C(JB+J)=C1*(A10(IJK)-A11(IJK))-S1*(B10(IJK)+B11(IJK))
+ D(JB+J)=S1*(A10(IJK)-A11(IJK))+C1*(B10(IJK)+B11(IJK))
+ C(JE+J)=C4*(A10(IJK)+A11(IJK))-S4*(B10(IJK)-B11(IJK))
+ D(JE+J)=S4*(A10(IJK)+A11(IJK))+C4*(B10(IJK)-B11(IJK))
+ C(JC+J)=C2*(A20(IJK)-A21(IJK))-S2*(B20(IJK)+B21(IJK))
+ D(JC+J)=S2*(A20(IJK)-A21(IJK))+C2*(B20(IJK)+B21(IJK))
+ C(JD+J)=C3*(A20(IJK)+A21(IJK))-S3*(B20(IJK)-B21(IJK))
+ D(JD+J)=S3*(A20(IJK)+A21(IJK))+C3*(B20(IJK)-B21(IJK))
+C
+ I=I+INC3
+ J=J+INC4
+ 530 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 540 CONTINUE
+ IA=IA+IINK
+ IB=IB+IINK
+ IC=IC+IINK
+ ID=ID-IINK
+ IE=IE-IINK
+ JBASE=JBASE+JUMP
+ 550 CONTINUE
+ IF (IB.GT.ID) GO TO 900
+ 560 CONTINUE
+ IBASE=0
+ DO 580 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 570 IJK=1,ILOT
+ C(JA+J)=(A(IA+I)+A(IB+I))+A(IC+I)
+ C(JB+J)=(QRT5*(A(IA+I)-A(IB+I))+(0.25*(A(IA+I)+A(IB+I))-A(IC+
+ * I)))
+ * -(SIN36*B(IA+I)+SIN72*B(IB+I))
+ C(JE+J)=-(QRT5*(A(IA+I)-A(IB+I))+(0.25*(A(IA+I)+A(IB+I))-A(IC+
+ * I)))
+ * -(SIN36*B(IA+I)+SIN72*B(IB+I))
+ C(JC+J)=(QRT5*(A(IA+I)-A(IB+I))-(0.25*(A(IA+I)+A(IB+I))-A(IC+
+ * I)))
+ * -(SIN72*B(IA+I)-SIN36*B(IB+I))
+ C(JD+J)=-(QRT5*(A(IA+I)-A(IB+I))-(0.25*(A(IA+I)+A(IB+I))-A(IC+
+ * I)))
+ * -(SIN72*B(IA+I)-SIN36*B(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 570 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 580 CONTINUE
+ GO TO 900
+C
+ 590 CONTINUE
+ QQRT5=2.0*QRT5
+ SSIN36=2.0*SIN36
+ SSIN72=2.0*SIN72
+ DO 594 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 592 IJK=1,ILOT
+ C(JA+J)=2.0*(A(IA+I)+(A(IB+I)+A(IC+I)))
+ C(JB+J)=(2.0*(A(IA+I)-0.25*(A(IB+I)+A(IC+I)))
+ * +QQRT5*(A(IB+I)-A(IC+I)))-(SSIN72*B(IB+I)+SSIN36*B(IC+I))
+ C(JC+J)=(2.0*(A(IA+I)-0.25*(A(IB+I)+A(IC+I)))
+ * -QQRT5*(A(IB+I)-A(IC+I)))-(SSIN36*B(IB+I)-SSIN72*B(IC+I))
+ C(JD+J)=(2.0*(A(IA+I)-0.25*(A(IB+I)+A(IC+I)))
+ * -QQRT5*(A(IB+I)-A(IC+I)))+(SSIN36*B(IB+I)-SSIN72*B(IC+I))
+ C(JE+J)=(2.0*(A(IA+I)-0.25*(A(IB+I)+A(IC+I)))
+ * +QQRT5*(A(IB+I)-A(IC+I)))+(SSIN72*B(IB+I)+SSIN36*B(IC+I))
+ I=I+INC3
+ J=J+INC4
+ 592 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 594 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 6
+C -------------------
+ 600 CONTINUE
+ IA=1
+ IB=IA+(2*M-ILA)*INC1
+ IC=IB+2*M*INC1
+ ID=IC+2*M*INC1
+ IE=IC
+ IF=IB
+ JA=1
+ JB=JA+JINK
+ JC=JB+JINK
+ JD=JC+JINK
+ JE=JD+JINK
+ JF=JE+JINK
+C
+ IF (ILA.EQ.M) GO TO 690
+C
+ DO 620 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 610 IJK=1,ILOT
+ C(JA+J)=(A(IA+I)+A(ID+I))+(A(IB+I)+A(IC+I))
+ C(JD+J)=(A(IA+I)-A(ID+I))-(A(IB+I)-A(IC+I))
+ C(JB+J)=((A(IA+I)-A(ID+I))+0.5*(A(IB+I)-A(IC+I)))
+ * -(SIN60*(B(IB+I)+B(IC+I)))
+ C(JF+J)=((A(IA+I)-A(ID+I))+0.5*(A(IB+I)-A(IC+I)))
+ * +(SIN60*(B(IB+I)+B(IC+I)))
+ C(JC+J)=((A(IA+I)+A(ID+I))-0.5*(A(IB+I)+A(IC+I)))
+ * -(SIN60*(B(IB+I)-B(IC+I)))
+ C(JE+J)=((A(IA+I)+A(ID+I))-0.5*(A(IB+I)+A(IC+I)))
+ * +(SIN60*(B(IB+I)-B(IC+I)))
+ I=I+INC3
+ J=J+INC4
+ 610 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 620 CONTINUE
+ IA=IA+IINK
+ IINK=2*IINK
+ IB=IB+IINK
+ IC=IC+IINK
+ ID=ID-IINK
+ IE=IE-IINK
+ IF=IF-IINK
+ JBASE=JBASE+JUMP
+ JUMP=2*JUMP+JINK
+ IF (IC.EQ.ID) GO TO 660
+ DO 650 K=ILA,KSTOP,ILA
+ KB=K+K
+ KC=KB+KB
+ KD=KC+KB
+ KE=KD+KB
+ KF=KE+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ C3=TRIGS(KD+1)
+ S3=TRIGS(KD+2)
+ C4=TRIGS(KE+1)
+ S4=TRIGS(KE+2)
+ C5=TRIGS(KF+1)
+ S5=TRIGS(KF+2)
+ IBASE=0
+ DO 640 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 630 IJK=1,ILOT
+C
+ A11(IJK)= (A(IE+I)+A(IB+I))+(A(IC+I)+A(IF+I))
+ A20(IJK)=(A(IA+I)+A(ID+I))-0.5*A11(IJK)
+ A21(IJK)=SIN60*((A(IE+I)+A(IB+I))-(A(IC+I)+A(IF+I)))
+ B11(IJK)= (B(IB+I)-B(IE+I))+(B(IC+I)-B(IF+I))
+ B20(IJK)=(B(IA+I)-B(ID+I))-0.5*B11(IJK)
+ B21(IJK)=SIN60*((B(IB+I)-B(IE+I))-(B(IC+I)-B(IF+I)))
+C
+ C(JA+J)=(A(IA+I)+A(ID+I))+A11(IJK)
+ D(JA+J)=(B(IA+I)-B(ID+I))+B11(IJK)
+ C(JC+J)=C2*(A20(IJK)-B21(IJK))-S2*(B20(IJK)+A21(IJK))
+ D(JC+J)=S2*(A20(IJK)-B21(IJK))+C2*(B20(IJK)+A21(IJK))
+ C(JE+J)=C4*(A20(IJK)+B21(IJK))-S4*(B20(IJK)-A21(IJK))
+ D(JE+J)=S4*(A20(IJK)+B21(IJK))+C4*(B20(IJK)-A21(IJK))
+C
+ A11(IJK)=(A(IE+I)-A(IB+I))+(A(IC+I)-A(IF+I))
+ B11(IJK)=(B(IE+I)+B(IB+I))-(B(IC+I)+B(IF+I))
+ A20(IJK)=(A(IA+I)-A(ID+I))-0.5*A11(IJK)
+ A21(IJK)=SIN60*((A(IE+I)-A(IB+I))-(A(IC+I)-A(IF+I)))
+ B20(IJK)=(B(IA+I)+B(ID+I))+0.5*B11(IJK)
+ B21(IJK)=SIN60*((B(IE+I)+B(IB+I))+(B(IC+I)+B(IF+I)))
+C
+ C(JD+J)=
+ * C3*((A(IA+I)-A(ID+I))+A11(IJK))-S3*((B(IA+I)+B(ID+I))-B11(IJK))
+ D(JD+J)=
+ * S3*((A(IA+I)-A(ID+I))+A11(IJK))+C3*((B(IA+I)+B(ID+I))-B11(IJK))
+ C(JB+J)=C1*(A20(IJK)-B21(IJK))-S1*(B20(IJK)-A21(IJK))
+ D(JB+J)=S1*(A20(IJK)-B21(IJK))+C1*(B20(IJK)-A21(IJK))
+ C(JF+J)=C5*(A20(IJK)+B21(IJK))-S5*(B20(IJK)+A21(IJK))
+ D(JF+J)=S5*(A20(IJK)+B21(IJK))+C5*(B20(IJK)+A21(IJK))
+C
+ I=I+INC3
+ J=J+INC4
+ 630 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 640 CONTINUE
+ IA=IA+IINK
+ IB=IB+IINK
+ IC=IC+IINK
+ ID=ID-IINK
+ IE=IE-IINK
+ IF=IF-IINK
+ JBASE=JBASE+JUMP
+ 650 CONTINUE
+ IF (IC.GT.ID) GO TO 900
+ 660 CONTINUE
+ IBASE=0
+ DO 680 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 670 IJK=1,ILOT
+ C(JA+J)=A(IB+I)+(A(IA+I)+A(IC+I))
+ C(JD+J)=B(IB+I)-(B(IA+I)+B(IC+I))
+ C(JB+J)=(SIN60*(A(IA+I)-A(IC+I)))-(0.5*(B(IA+I)+B(IC+I))+B(IB+
+ * I))
+ C(JF+J)=-(SIN60*(A(IA+I)-A(IC+I)))-(0.5*(B(IA+I)+B(IC+I))+B(IB+
+ * I))
+ C(JC+J)=SIN60*(B(IC+I)-B(IA+I))+(0.5*(A(IA+I)+A(IC+I))-A(IB+I))
+ C(JE+J)=SIN60*(B(IC+I)-B(IA+I))-(0.5*(A(IA+I)+A(IC+I))-A(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 670 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 680 CONTINUE
+ GO TO 900
+C
+ 690 CONTINUE
+ SSIN60=2.0*SIN60
+ DO 694 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 692 IJK=1,ILOT
+ C(JA+J)=(2.0*(A(IA+I)+A(ID+I)))+(2.0*(A(IB+I)+A(IC+I)))
+ C(JD+J)=(2.0*(A(IA+I)-A(ID+I)))-(2.0*(A(IB+I)-A(IC+I)))
+ C(JB+J)=(2.0*(A(IA+I)-A(ID+I))+(A(IB+I)-A(IC+I)))
+ * -(SSIN60*(B(IB+I)+B(IC+I)))
+ C(JF+J)=(2.0*(A(IA+I)-A(ID+I))+(A(IB+I)-A(IC+I)))
+ * +(SSIN60*(B(IB+I)+B(IC+I)))
+ C(JC+J)=(2.0*(A(IA+I)+A(ID+I))-(A(IB+I)+A(IC+I)))
+ * -(SSIN60*(B(IB+I)-B(IC+I)))
+ C(JE+J)=(2.0*(A(IA+I)+A(ID+I))-(A(IB+I)+A(IC+I)))
+ * +(SSIN60*(B(IB+I)-B(IC+I)))
+ I=I+INC3
+ J=J+INC4
+ 692 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 694 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 8
+C -------------------
+ 800 CONTINUE
+ IBAD=3
+ IF (ILA.NE.M) GO TO 910
+ IA=1
+ IB=IA+ILA*INC1
+ IC=IB+2*ILA*INC1
+ ID=IC+2*ILA*INC1
+ IE=ID+2*ILA*INC1
+ JA=1
+ JB=JA+JINK
+ JC=JB+JINK
+ JD=JC+JINK
+ JE=JD+JINK
+ JF=JE+JINK
+ JG=JF+JINK
+ JH=JG+JINK
+ SSIN45=SQRT(2.0)
+C
+ DO 820 IL=1,ILA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+*VOCL LOOP,NOVREC
+ DO 810 IJK=1,ILOT
+ C(JA+J)=2.0*(((A(IA+I)+A(IE+I))+A(IC+I))+(A(IB+I)+A(ID+I)))
+ C(JE+J)=2.0*(((A(IA+I)+A(IE+I))+A(IC+I))-(A(IB+I)+A(ID+I)))
+ C(JC+J)=2.0*(((A(IA+I)+A(IE+I))-A(IC+I))-(B(IB+I)-B(ID+I)))
+ C(JG+J)=2.0*(((A(IA+I)+A(IE+I))-A(IC+I))+(B(IB+I)-B(ID+I)))
+ C(JB+J)=2.0*((A(IA+I)-A(IE+I))-B(IC+I))
+ * +SSIN45*((A(IB+I)-A(ID+I))-(B(IB+I)+B(ID+I)))
+ C(JF+J)=2.0*((A(IA+I)-A(IE+I))-B(IC+I))
+ * -SSIN45*((A(IB+I)-A(ID+I))-(B(IB+I)+B(ID+I)))
+ C(JD+J)=2.0*((A(IA+I)-A(IE+I))+B(IC+I))
+ * -SSIN45*((A(IB+I)-A(ID+I))+(B(IB+I)+B(ID+I)))
+ C(JH+J)=2.0*((A(IA+I)-A(IE+I))+B(IC+I))
+ * +SSIN45*((A(IB+I)-A(ID+I))+(B(IB+I)+B(ID+I)))
+ I=I+INC3
+ J=J+INC4
+ 810 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 820 CONTINUE
+C
+C RETURN
+C ------
+ 900 CONTINUE
+ IBAD=0
+ 910 CONTINUE
+ IERR=IBAD
+ RETURN
+ END
diff --git a/fft/set99.f b/fft/set99.f
new file mode 100755
index 0000000..4475ae0
--- /dev/null
+++ b/fft/set99.f
@@ -0,0 +1,65 @@
+c Copyright 1981-2012 ECMWF.
+c
+c This software is licensed under the terms of the Apache Licence
+c Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+c
+c In applying this licence, ECMWF does not waive the privileges and immunities
+c granted to it by virtue of its status as an intergovernmental organisation
+c nor does it submit to any jurisdiction.
+c
+
+ SUBROUTINE SET99(TRIGS,IFAX,N)
+ DIMENSION TRIGS(N),IFAX(*),JFAX(10),LFAX(7)
+C
+C SUBROUTINE 'SET99' - COMPUTES FACTORS OF N & TRIGONOMETRIC
+C FUNCTIONS REQUIRED BY FFT99 & FFT991
+C
+ DATA LFAX/6,8,5,4,3,2,1/
+ IXXX=1
+C
+ DEL=4.0*ASIN(1.0)/FLOAT(N)
+ NIL=0
+ NHL=(N/2)-1
+ DO 10 K=NIL,NHL
+ ANGLE=FLOAT(K)*DEL
+ TRIGS(2*K+1)=COS(ANGLE)
+ TRIGS(2*K+2)=SIN(ANGLE)
+ 10 CONTINUE
+C
+C FIND FACTORS OF N (8,6,5,4,3,2; ONLY ONE 8 ALLOWED)
+C LOOK FOR SIXES FIRST, STORE FACTORS IN DESCENDING ORDER
+ NU=N
+ IFAC=6
+ K=0
+ L=1
+ 20 CONTINUE
+ IF (MOD(NU,IFAC).NE.0) GO TO 30
+ K=K+1
+ JFAX(K)=IFAC
+ IF (IFAC.NE.8) GO TO 25
+ IF (K.EQ.1) GO TO 25
+ JFAX(1)=8
+ JFAX(K)=6
+ 25 CONTINUE
+ NU=NU/IFAC
+ IF (NU.EQ.1) GO TO 50
+ IF (IFAC.NE.8) GO TO 20
+ 30 CONTINUE
+ L=L+1
+ IFAC=LFAX(L)
+ IF (IFAC.GT.1) GO TO 20
+C
+ WRITE(6,40) N
+ 40 FORMAT('1N =',I4,' - CONTAINS ILLEGAL FACTORS')
+ RETURN
+C
+C NOW REVERSE ORDER OF FACTORS
+ 50 CONTINUE
+ NFAX=K
+ IFAX(1)=NFAX
+ DO 60 I=1,NFAX
+ IFAX(NFAX+2-I)=JFAX(I)
+ 60 CONTINUE
+ IFAX(10)=N
+ RETURN
+ END
diff --git a/fft/setgpfa.f b/fft/setgpfa.f
new file mode 100755
index 0000000..acf9dcf
--- /dev/null
+++ b/fft/setgpfa.f
@@ -0,0 +1,72 @@
+c Copyright 1981-2012 ECMWF.
+c
+c This software is licensed under the terms of the Apache Licence
+c Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+c
+c In applying this licence, ECMWF does not waive the privileges and immunities
+c granted to it by virtue of its status as an intergovernmental organisation
+c nor does it submit to any jurisdiction.
+c
+
+ SUBROUTINE SETGPFA(TRIGS,N)
+*
+ DIMENSION TRIGS(*)
+ DIMENSION NJ(3)
+*
+* DECOMPOSE N INTO FACTORS 2,3,5
+* ------------------------------
+ NN = N
+ IFAC = 2
+*
+ DO 30 LL = 1 , 3
+ KK = 0
+ 10 CONTINUE
+ IF (MOD(NN,IFAC).NE.0) GO TO 20
+ KK = KK + 1
+ NN = NN / IFAC
+ GO TO 10
+ 20 CONTINUE
+ NJ(LL) = KK
+ IFAC = IFAC + LL
+ 30 CONTINUE
+*
+ IF (NN.NE.1) THEN
+ WRITE(6,40) N
+ 40 FORMAT(' *** WARNING!!!',I10,' IS NOT A LEGAL VALUE OF N ***')
+ RETURN
+ ENDIF
+*
+ IP = NJ(1)
+ IQ = NJ(2)
+ IR = NJ(3)
+*
+* COMPUTE LIST OF ROTATED TWIDDLE FACTORS
+* ---------------------------------------
+ NJ(1) = 2**IP
+ NJ(2) = 3**IQ
+ NJ(3) = 5**IR
+*
+ TWOPI = 4.0 * ASIN(1.0)
+ I = 1
+*
+ DO 60 LL = 1 , 3
+ NI = NJ(LL)
+ IF (NI.EQ.1) GO TO 60
+*
+ DEL = TWOPI / FLOAT(NI)
+ IROT = N / NI
+ KINK = MOD(IROT,NI)
+ KK = 0
+*
+ DO 50 K = 1 , NI
+ ANGLE = FLOAT(KK) * DEL
+ TRIGS(I) = COS(ANGLE)
+ TRIGS(I+1) = SIN(ANGLE)
+ I = I + 2
+ KK = KK + KINK
+ IF (KK.GT.NI) KK = KK - NI
+ 50 CONTINUE
+ 60 CONTINUE
+*
+ RETURN
+ END
diff --git a/fft/sources b/fft/sources
new file mode 100755
index 0000000..e634f85
--- /dev/null
+++ b/fft/sources
@@ -0,0 +1,20 @@
+#
+# Sources for fft
+#
+
+SOURCES.f = \
+ fax.f \
+ fft99.f \
+ fft991.f \
+ fftrig.f \
+ gpfa.f \
+ gpfa2.f \
+ gpfa3.f \
+ gpfa5.f \
+ rpassf.f \
+ rpassm.f \
+ qpassf.f \
+ qpassm.f \
+ set99.f \
+ syminv.f \
+ setgpfa.f
diff --git a/fft/syminv.f b/fft/syminv.f
new file mode 100755
index 0000000..bfc6a30
--- /dev/null
+++ b/fft/syminv.f
@@ -0,0 +1,111 @@
+c Copyright 1981-2012 ECMWF.
+c
+c This software is licensed under the terms of the Apache Licence
+c Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+c
+c In applying this licence, ECMWF does not waive the privileges and immunities
+c granted to it by virtue of its status as an intergovernmental organisation
+c nor does it submit to any jurisdiction.
+c
+
+ SUBROUTINE SYMINV(A,NDIM,N,COND,V,DEPS)
+ DIMENSION A(NDIM,NDIM),V(NDIM)
+C INVERT IN PLACE THE LOWER TRIANGLE OF A (I.E. A(I,J) I.GE.J)
+C A IS A SYMMETRIC POSITIVE DEFINITE MATRIX
+C THE UPPER TRIANGLE OF A (IE. A(I,J) I.LT.J) IS NOT USED OR ALTERED
+C
+C THIS VERSION IS OPTIMIZED FOR THE CDC FTN COMPILER.
+C IT REQUIRES THE FUNCTION 'NUMARG' FROM 'ECLIB'
+C
+ IF(N.LT.1)RETURN
+ EPS=0.
+c IF(NUMARG().EQ.6) EPS=DEPS
+ NDIA=NDIM+1
+ IMX=ISAMAX(N,A(1,1),NDIA)
+ ZMX=A(IMX,IMX)*FLOAT(N*N)
+C SECTION 1 & 2 COMBINED IN THIS VERSION
+C**** 1. ROOT FREE CHOLESKY DECOMPOSITION A =L D L(TRANSPOSE)
+ J=1
+ IF(A(1,1).LE.EPS)GOTO91
+ V(1)=1./A(1,1)
+ IF(N.EQ.1)GOTO20
+ X=A(2,1)*V(1)
+ A(2,2)=A(2,2)-X*A(2,1)
+ A(2,1)=X
+ IF(A(2,2).LE.EPS)GOTO91
+ V(2)=1./A(2,2)
+ IF(N.EQ.2)GOTO20
+ DO 14 I=3,N
+ DO 12 J=3,I
+ S=A(I,J-1)
+ DO 11 K=3,J
+ 11 S=S-A(I,K-2)*A(J-1,K-2)
+ A(I,J-1)=S
+ 12 CONTINUE
+ S=A(I,I)
+ DO 13 J=2,I
+ X=A(I,J-1)*V(J-1)
+ S=S-X*A(I,J-1)
+ 13 A(I,J-1)=X
+ A(I,I)=S
+C CHECK FOR POSITIVE-DEFINITENESS AND INVERT DIAGONAL MATRIX D.
+ IF(A(I,I).LE.EPS)GOTO91
+ V(I)=1./A(I,I)
+ 14 CONTINUE
+C
+C**** 2. COPY INVERSE OF D WHICH HAS ALREADY BEEN CALCULATED.
+ 20 DO 21 J=1,N
+ 21 A(J,J)=V(J)
+ IF(N.EQ.1) GO TO 50
+C
+C**** 3. INVERSION OF L
+ 30 A(2,1)=-A(2,1)
+ NM1=N-1
+ IF(N.EQ.2)GOTO40
+ DO 33 I=2,NM1
+ DO 32 J=2,I
+ S=A(I+1,J-1)
+ DO 31 K=J,I
+ 31 S=S+A(I+1,K)*A(K,J-1)
+ 32 A(I+1,J-1)=-S
+ 33 A(I+1,I)=-A(I+1,I)
+C
+C**** 4. INV A = INV L(TRANSPOSE) * INV D * INV L
+ 40 DO 44 J=2,N
+ S=A(J-1,J-1)
+ DO 41 I=J,N
+ X=A(I,I)*A(I,J-1)
+ S=S+A(I,J-1)*X
+ 41 A(I,J-1)=X
+ A(J-1,J-1)=S
+ IF(J.EQ.N) GO TO 50
+ DO 43 I=J,NM1
+ S=A(I,J-1)
+ DO 42 K=I,NM1
+ 42 S=S+A(K+1,I)*A(K+1,J-1)
+ A(I,J-1)=S
+ 43 CONTINUE
+ 44 CONTINUE
+C
+ 50 IMX=ISAMAX(N,A(1,1),NDIA)
+ COND=1./ABS(A(IMX,IMX)*ZMX)
+ RETURN
+C
+ 91 COND=-FLOAT(J)
+ RETURN
+ END
+ INTEGER FUNCTION ISAMAX(N,A,M)
+C
+C FIND THE LARGEST ABSOLUTE ELEMENT OF A , SPACED M WORDS APART
+C
+ DIMENSION A(*)
+C
+ LARGE=1
+ IF(N.LE.1) GO TO 9
+ INDEX=1+M
+ DO 1 I=2,N
+ IF(ABS(A(INDEX)).GE.ABS(A(LARGE))) LARGE=I
+1 INDEX=INDEX+M
+9 ISAMAX=LARGE
+ RETURN
+ END
diff --git a/grib_api_merging/Makefile b/grib_api_merging/Makefile
new file mode 100755
index 0000000..b857d36
--- /dev/null
+++ b/grib_api_merging/Makefile
@@ -0,0 +1,32 @@
+#
+#
+LIBRARY = ../lib$(LIB)$(R64).a
+
+GRIB_API_RELEASE = 1.9.8
+GRIB_API_PATH = /usr/local/lib/metaps/lib/grib_api/$(GRIB_API_RELEASE)
+GRIB_API_INC = -I$(GRIB_API_PATH)/include
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+#
+TARGETS = all clean
+#
+include sources
+#
+OBJECTS.o = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.o)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+$(OBJECTS.o): $(SOURCES.c)
+ $(CC) $(CFLAGS) $(GRIB_API_INC) -c $(SOURCES.c)
+
+$(LIBRARY): $(OBJECTS)
+ $(AR) $(ARFLAGS) $@ $?
+ $(RANLIB) $@
+
+clean:
+ \rm -f $(OBJECTS)
diff --git a/grib_api_merging/Makefile.in b/grib_api_merging/Makefile.in
new file mode 100755
index 0000000..56b88de
--- /dev/null
+++ b/grib_api_merging/Makefile.in
@@ -0,0 +1,40 @@
+#
+# Makefile for libemos/pbio
+GRIB_API_DIR = glue
+#
+A64 = plat
+R64 = reals
+ARCH = arch
+CNAME = comp
+LIB = depl
+
+LIBRARY = ../lib$(LIB)$(R64).a
+
+#GRIB_API_PATH = /usr/local/lib/metaps/lib/grib_api/exp
+GRIB_API_PATH = $(GRIB_API_DIR)
+GRIB_API_INC = -I$(GRIB_API_PATH)/include
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+#
+TARGETS = all clean
+#
+include sources
+#
+OBJECTS.o = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.o)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+$(OBJECTS.o): $(SOURCES.c)
+ $(CC) $(CFLAGS) $(GRIB_API_INC) -c $(SOURCES.c)
+
+$(LIBRARY): $(OBJECTS)
+ $(AR) $(ARFLAGS) $@ $?
+ $(RANLIB) $@
+
+clean:
+ \rm -f $(OBJECTS)
diff --git a/grib_api_merging/copy_spec_from_ksec.c b/grib_api_merging/copy_spec_from_ksec.c
new file mode 100755
index 0000000..ed38f80
--- /dev/null
+++ b/grib_api_merging/copy_spec_from_ksec.c
@@ -0,0 +1,249 @@
+/**
+* Copyright 1981-2012 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.h"
+#include "emos.h"
+#include <assert.h>
+
+#define ISECTION_2 5000
+#define ISECTION_4 512
+
+extern int mars_interpolation;
+
+#define SET_EXTRA_LONG(x,y) do { assert(packing_spec->extra_settings_count<80); packing_spec->extra_settings[packing_spec->extra_settings_count].name = #x; packing_spec->extra_settings[packing_spec->extra_settings_count].type = GRIB_TYPE_LONG; packing_spec->extra_settings[packing_spec->extra_settings_count].long_value = y; packing_spec->extra_settings_count++; } while(0)
+#define SET_EXTRA_DOUBLE(x,y) do { assert(packing_spec->extra_settings_count<80); packing_spec->extra_settings[packing_spec->extra_settings_count].name = #x; packing_spec->extra_settings[packing_spec->extra_settings_count].type = GRIB_TYPE_DOUBLE; packing_spec->extra_settings[packing_spec->extra_settings_count].double_value = y; packing_spec->extra_settings_count++; } while(0)
+
+
+int copy_spec_from_ksec(grib_util_grid_spec* spec,grib_util_packing_spec* packing_spec) {
+ int err=0;
+
+ fortint isec1[ISECTION_1] = {0,};
+ fortint isec2[ISECTION_2] = {0,};
+ fortint isec3[ISECTION_3] = {0,};
+ fortint isec4[ISECTION_4] = {0,};
+
+ fortfloat zsec3[ISECTION_3] = {0,};
+
+ long rg_def[ISECTION_2] = {0,};
+ char *intf2_debug = getenv("INTF2_DEBUG");
+
+ if((err = int2_gasetup( isec1, isec2, isec3, isec4,zsec3 )) != 0)
+ {
+ return err;
+ }
+
+ memset(spec, 0, sizeof(grib_util_grid_spec));
+ memset(packing_spec, 0, sizeof(grib_util_packing_spec));
+
+ switch (isec4[3]) {
+ case 1:
+ packing_spec->packing_type = GRIB_UTIL_PACKING_TYPE_SPECTRAL_COMPLEX;
+ break;
+ case 2:
+ packing_spec->packing_type = GRIB_UTIL_PACKING_TYPE_SPECTRAL_SIMPLE;
+ packing_spec->packing = GRIB_UTIL_PACKING_USE_PROVIDED;
+ break;
+ case 3:
+ packing_spec->packing_type = GRIB_UTIL_PACKING_TYPE_JPEG;
+ break;
+ case 4:
+ packing_spec->packing_type = GRIB_UTIL_PACKING_TYPE_GRID_SIMPLE;
+ break;
+ case 7:
+ packing_spec->packing_type = GRIB_UTIL_PACKING_TYPE_GRID_SECOND_ORDER;
+ break;
+ default :
+ printf("invalid isec4[3] = %d\n",isec4[3]);
+ abort();
+ }
+ packing_spec->bitsPerValue = isec4[1];
+
+ /* TODO: get that from emoslib */
+ if(intf2_debug){
+ printf("YYYYYYYYYY packing: %d ----- bitsPerValue: %d \n", isec4[3],isec4[1]);
+ printf("missing value XXXXXXXXXX %f\n", zsec3[1]);
+ }
+
+ spec->missingValue = zsec3[1];
+
+
+ if(intf2_debug){
+ printf("missing value XXXXXXXXXX %f \n", spec->missingValue);
+ printf("SIZES double=%d fortfloat=%d\n", sizeof(double), sizeof(fortfloat));
+ printf("is BITMAP present %d\n", isec1[4]);
+ }
+
+ switch(isec2[0]) {
+
+ case 0:
+ spec->grid_type = GRIB_UTIL_GRID_SPEC_REGULAR_LL;
+ spec->Nj = isec2[2];
+ spec->Ni = isec2[1];
+ spec->iDirectionIncrementInDegrees = isec2[8]/1000.0;
+ spec->jDirectionIncrementInDegrees = isec2[9]/1000.0;
+
+ spec->latitudeOfFirstGridPointInDegrees = isec2[3]/1000.0;
+ spec->longitudeOfFirstGridPointInDegrees = isec2[4]/1000.0;
+ spec->latitudeOfLastGridPointInDegrees = isec2[6]/1000.0;
+ spec->longitudeOfLastGridPointInDegrees = isec2[7]/1000.0;
+
+ if (isec1[4]==192 || isec1[4]==64)
+ spec->bitmapPresent=1;
+ else
+ spec->bitmapPresent=0;
+
+ break;
+
+ case 10:
+ spec->grid_type = GRIB_UTIL_GRID_SPEC_ROTATED_LL;
+ spec->Nj = isec2[2];
+ spec->Ni = isec2[1];
+ spec->iDirectionIncrementInDegrees = isec2[8]/1000.0;
+ spec->jDirectionIncrementInDegrees = isec2[9]/1000.0;
+
+ spec->latitudeOfFirstGridPointInDegrees = isec2[3]/1000.0;
+ spec->longitudeOfFirstGridPointInDegrees = isec2[4]/1000.0;
+ spec->latitudeOfLastGridPointInDegrees = isec2[6]/1000.0;
+ spec->longitudeOfLastGridPointInDegrees = isec2[7]/1000.0;
+
+ spec->uvRelativeToGrid= isec2[18]==8 ? 1 : 0;
+ spec->latitudeOfSouthernPoleInDegrees = isec2[12]/1000.0;
+ spec->longitudeOfSouthernPoleInDegrees = isec2[13]/1000.0;
+
+ if (isec1[4]==192 || isec1[4]==64)
+ spec->bitmapPresent=1;
+ else
+ spec->bitmapPresent=0;
+
+ break;
+
+ case 4:
+ spec->grid_type = GRIB_UTIL_GRID_SPEC_REGULAR_GG;
+ spec->Nj = isec2[2];
+ spec->Ni = isec2[1];
+ spec->N = isec2[9];
+ spec->iDirectionIncrementInDegrees = isec2[8]/1000.0;
+ if(isec2[16]) {
+ spec->grid_type = GRIB_UTIL_GRID_SPEC_REDUCED_GG;
+ }
+
+ spec->latitudeOfFirstGridPointInDegrees = isec2[3]/1000.0;
+ spec->longitudeOfFirstGridPointInDegrees = isec2[4]/1000.0;
+ spec->latitudeOfLastGridPointInDegrees = isec2[6]/1000.0;
+ spec->longitudeOfLastGridPointInDegrees = isec2[7]/1000.0;
+
+ if (isec1[4]==192 || isec1[4]==64)
+ spec->bitmapPresent=1;
+ else
+ spec->bitmapPresent=0;
+
+
+ /* grib_api to set global area in full precision for gaussian grid */
+ packing_spec->extra_settings_count=1;
+ packing_spec->extra_settings[0].type = GRIB_TYPE_LONG;
+ packing_spec->extra_settings[0].name = "global";
+ packing_spec->extra_settings[0].long_value = int2_global();
+
+ break;
+
+ case 14:
+ spec->grid_type = GRIB_UTIL_GRID_SPEC_ROTATED_GG;
+ spec->Nj = isec2[2];
+ spec->Ni = isec2[1];
+ spec->N = isec2[9];
+ spec->iDirectionIncrementInDegrees = isec2[8]/1000.0;
+ if(isec2[16]) {
+ /* There is no rotated-reduced, is there ? */
+ abort();
+ }
+
+ spec->latitudeOfFirstGridPointInDegrees = isec2[3]/1000.0;
+ spec->longitudeOfFirstGridPointInDegrees = isec2[4]/1000.0;
+ spec->latitudeOfLastGridPointInDegrees = isec2[6]/1000.0;
+ spec->longitudeOfLastGridPointInDegrees = isec2[7]/1000.0;
+
+ spec->latitudeOfSouthernPoleInDegrees = isec2[12]/1000.0;
+ spec->longitudeOfSouthernPoleInDegrees = isec2[13]/1000.0;
+
+ if (isec1[4]==192 || isec1[4]==64)
+ spec->bitmapPresent=1;
+ else
+ spec->bitmapPresent=0;
+
+ break;
+
+
+ case 50:
+ spec->grid_type = GRIB_UTIL_GRID_SPEC_SH;
+ spec->truncation = isec2[1]; /* truncationJ */
+ packing_spec->truncateLaplacian=1;
+
+ break;
+
+ case 26:
+ spec->grid_type = GRIB_UTIL_GRID_SPEC_REDUCED_LL;
+ break;
+
+ default:
+ fprintf(stdout,"INTF2: ERROR - unknown repres: %d\n", isec2[0]);
+ return -2;
+ break;
+ }
+
+ /* ocean special case */
+ if (isec1[36]==4) {
+ /* Bitmap always present for ocean */
+
+ if (isec1[59] == 3 && isec1[60] == 4)
+ SET_EXTRA_LONG(dataRepresentationType , 0);
+ else
+ SET_EXTRA_LONG(dataRepresentationType , 192);
+
+
+ SET_EXTRA_LONG(coordinate4OfFirstGridPoint,isec1[61]);
+ SET_EXTRA_LONG(coordinate3OfFirstGridPoint,isec1[62]);
+ SET_EXTRA_LONG(coordinate4OfLastGridPoint,isec1[63]);
+ SET_EXTRA_LONG(coordinate3OfLastGridPoint,isec1[64]);
+ SET_EXTRA_LONG(iIncrement,isec1[65]);
+ SET_EXTRA_LONG(jIncrement,isec1[66]);
+ SET_EXTRA_LONG(flagForNormalOrStaggeredGrid,isec1[68]);
+ SET_EXTRA_LONG(flagForIrregularGridCoordinateList,0);
+ SET_EXTRA_LONG(numberInTheGridCoordinateList,0);
+ SET_EXTRA_LONG(flagShowingPostAuxiliaryArrayInUse,0);
+ SET_EXTRA_LONG(flagShowingPostAuxiliaryArrayInUse,1);
+ SET_EXTRA_LONG(sizeOfPostAuxiliaryArrayPlusOne,0);
+
+ }
+
+#define D(a) if(intf2_debug) printf("YYYYYYYYYYYY %s -> %g\n", #a, (double)spec->a);
+
+
+ D(grid_type);
+ D(Ni);
+ D(Nj);
+ D(iDirectionIncrementInDegrees);
+ D(jDirectionIncrementInDegrees);
+ D(longitudeOfFirstGridPointInDegrees);
+ D(longitudeOfLastGridPointInDegrees);
+ D(latitudeOfFirstGridPointInDegrees);
+ D(latitudeOfLastGridPointInDegrees);
+ D(latitudeOfSouthernPoleInDegrees);
+ D(longitudeOfSouthernPoleInDegrees);
+ D(N);
+ D(bitmapPresent);
+ D(missingValue);
+ D(pl_size);
+ D(truncation);
+
+
+ return 0;
+}
diff --git a/grib_api_merging/describe_input_field.c b/grib_api_merging/describe_input_field.c
new file mode 100755
index 0000000..97bd33d
--- /dev/null
+++ b/grib_api_merging/describe_input_field.c
@@ -0,0 +1,726 @@
+/**
+* Copyright 1981-2012 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.h"
+#include "emos.h"
+
+static long levTypeInt(char* typeOfLevel) {
+ if (!typeOfLevel || strlen(typeOfLevel) == 0) return 255;
+ if (!strcmp(typeOfLevel,"missing")) return 255;
+ if (!strcmp(typeOfLevel,"surface")) return 1;
+ if (!strcmp(typeOfLevel,"cloudBase")) return 2;
+ if (!strcmp(typeOfLevel,"cloudTop")) return 3;
+ if (!strcmp(typeOfLevel,"isothermZero")) return 4;
+ if (!strcmp(typeOfLevel,"adiabaticCondensation")) return 5;
+ if (!strcmp(typeOfLevel,"maxWind")) return 6;
+ if (!strcmp(typeOfLevel,"tropopause")) return 7;
+ if (!strcmp(typeOfLevel,"nominalTop")) return 8;
+ if (!strcmp(typeOfLevel,"seaBottom")) return 9;
+
+ if (!strcmp(typeOfLevel,"isobaricInhPa")) return 100;
+ if (!strcmp(typeOfLevel,"isobaricLayer")) return 101;
+ if (!strcmp(typeOfLevel,"meanSea")) return 102;
+ if (!strcmp(typeOfLevel,"heightAboveSea")) return 103;
+ if (!strcmp(typeOfLevel,"heightAboveSeaLayer")) return 104;
+ if (!strcmp(typeOfLevel,"heightAboveGround")) return 105;
+ if (!strcmp(typeOfLevel,"heightAboveGroundLayer")) return 106;
+ if (!strcmp(typeOfLevel,"sigma")) return 107;
+ if (!strcmp(typeOfLevel,"sigmaLayer")) return 108;
+ if (!strcmp(typeOfLevel,"hybrid")) return 109;
+ if (!strcmp(typeOfLevel,"hybridLayer")) return 110;
+
+ if (!strcmp(typeOfLevel,"depthBelowLand")) return 111;
+ if (!strcmp(typeOfLevel,"depthBelowLandLayer")) return 112;
+ if (!strcmp(typeOfLevel,"theta")) return 113;
+ if (!strcmp(typeOfLevel,"thetaLayer")) return 114;
+ if (!strcmp(typeOfLevel,"pressureFromGround")) return 115;
+ if (!strcmp(typeOfLevel,"pressureFromGroundLayer")) return 116;
+ if (!strcmp(typeOfLevel,"potentialVorticity")) return 117;
+ if (!strcmp(typeOfLevel,"isobaricLayerHighPrecision")) return 121;
+
+ if (!strcmp(typeOfLevel,"heightAboveGroundHighPrecision")) return 125;
+
+ if (!strcmp(typeOfLevel,"sigmaLayerHighPrecision")) return 128;
+ if (!strcmp(typeOfLevel,"isobaricLayerMixedPrecision")) return 141;
+ if (!strcmp(typeOfLevel,"depthBelowSea")) return 160;
+
+ if (!strcmp(typeOfLevel,"entireAtmosphere")) return 200;
+ if (!strcmp(typeOfLevel,"entireOcean")) return 201;
+
+ if (!strcmp(typeOfLevel,"isobaricInPa")) return 210;
+ if (!strcmp(typeOfLevel,"oceanWave")) return 211;
+ if (!strcmp(typeOfLevel,"oceanMixedLayer")) return 212;
+
+
+ fprintf(stderr,"levTypeInt: Level type NOT recognized %s\n",typeOfLevel);
+ return 255;
+}
+
+long describe_input_field(grib_handle* handle, long outputRepresentation){
+
+ char *text = "";
+ char *charv = "";
+ size_t size;
+
+ long rll_def[3000];
+ long rg_def[3000];
+ fortint intv[3000];
+ fortfloat realv[4];
+
+ char grid_type[80];
+ int err = 0;
+ int i = 0;
+
+ const void* temp;
+ double missingValue;
+ long level = 0, levelType, parameter, accuracy, scanningMode, table,date;
+ long bitmapPresent = 0;
+ char *intf2_debug = getenv("INTF2_DEBUG");
+ char *intf2_write = getenv("INTF2_WRITE_TO_FILE");
+ long localNumber = 0;
+ char typeOfLevel[50]={0,};
+ size_t typeOfLevelLen=50;
+ long niwe = 0, nins = 0;
+ long matrixOfValues = 0;
+ long centre = 0;
+
+
+
+ size = sizeof(grid_type);
+ if(err = grib_get_string(handle,"typeOfGrid",grid_type,&size))
+ {
+ fprintf(stderr,"Cannot get gridType %s\n",grib_get_error_message(err));
+ }
+
+ if(intf2_debug)
+ {
+ printf("DESCRIBE_INPUT_FIELD:**************************** \n");
+ printf("DESCRIBE_INPUT_FIELD: Input Grid Type - %s \n",grid_type);
+ }
+
+
+ /************************************************************/
+ /* Describe input unpacked field for INTF */
+
+ /* General features */
+
+ if(err = int2_intin("form",intv,realv,"unpacked"))
+ {
+ fprintf(stderr,"Form setup INTIN failed %d\n",err);
+ }
+
+ /* Get Local Definition */
+ err = grib_get_long(handle,"localDefinitionNumber",&localNumber);
+ if (err == GRIB_SUCCESS)
+ {
+ intv[0] = localNumber;
+ if(err = int2_intin("local",intv,realv,text))
+ {
+ fprintf(stderr,"localDefinitionNumber setup INTIN failed %d\n",err);
+ }
+ }
+
+ if (localNumber == 4)
+ {
+ /* OCEAN */
+ long gridCoordinate[1000];
+ size_t o_length = 0;
+ long oo_length = 0, vertCooDef = 0;
+ long coordinate3Flag,coordinate4Flag,coordinate4OfFirstGridPoint,coordinate3OfFirstGridPoint;
+ long coordinate4OfLastGridPoint,coordinate3OfLastGridPoint,iIncrement,jIncrement,flagForIrregularGridCoordinateList,flagForNormalOrStaggeredGrid;
+ if(intf2_debug)
+ {
+ printf("DESCRIBE_INPUT_FIELD:******* OCEAN FIELD ********* \n");
+ }
+ /* starts with KSEC1(60) */
+ if(err = grib_get_long(handle,"coordinate3Flag",&coordinate3Flag))
+ fprintf(stderr,"Cannot get coordinate3Flag %s\n",grib_get_error_message(err));
+ intv[0] = coordinate3Flag;
+ if(err = grib_get_long(handle,"coordinate4Flag",&coordinate4Flag))
+ fprintf(stderr,"Cannot get coordinate4Flag %s\n",grib_get_error_message(err));
+ intv[1] = coordinate4Flag;
+ if(err = grib_get_long(handle,"coordinate4OfFirstGridPoint",&coordinate4OfFirstGridPoint))
+ fprintf(stderr,"Cannot get coordinate4OfFirstGridPoint %s\n",grib_get_error_message(err));
+ intv[2] = coordinate4OfFirstGridPoint;
+ if(err = grib_get_long(handle,"coordinate3OfFirstGridPoint",&coordinate3OfFirstGridPoint))
+ fprintf(stderr,"Cannot get coordinate3OfFirstGridPoint %s\n",grib_get_error_message(err));
+ intv[3] = coordinate3OfFirstGridPoint;
+ if(err = grib_get_long(handle,"coordinate4OfLastGridPoint",&coordinate4OfLastGridPoint))
+ fprintf(stderr,"Cannot get coordinate4OfLastGridPoint %s\n",grib_get_error_message(err));
+ intv[4] = coordinate4OfLastGridPoint;
+ if(err = grib_get_long(handle,"coordinate3OfLastGridPoint",&coordinate3OfLastGridPoint))
+ fprintf(stderr,"Cannot get coordinate3OfLastGridPoint %s\n",grib_get_error_message(err));
+ intv[5] = coordinate3OfLastGridPoint;
+ if(err = grib_get_long(handle,"iIncrement",&iIncrement))
+ fprintf(stderr,"Cannot get iIncrement %s\n",grib_get_error_message(err));
+ if(intf2_debug)
+ {
+ printf("DESCRIBE_INPUT_FIELD:******* north = %d, east = %d , south = %d, west = %d ********* \n", coordinate4OfFirstGridPoint,coordinate3OfFirstGridPoint,coordinate4OfLastGridPoint,coordinate3OfLastGridPoint);
+ }
+ intv[6] = iIncrement;
+ if(err = grib_get_long(handle,"jIncrement",&jIncrement))
+ fprintf(stderr,"Cannot get jIncrement %s\n",grib_get_error_message(err));
+ intv[7] = jIncrement;
+ if(err = grib_get_long(handle,"flagForIrregularGridCoordinateList",&flagForIrregularGridCoordinateList))
+ fprintf(stderr,"Cannot get flagForIrregularGridCoordinateList %s\n",grib_get_error_message(err));
+ intv[8] = flagForIrregularGridCoordinateList;
+ if(err = grib_get_long(handle,"flagForNormalOrStaggeredGrid",&flagForNormalOrStaggeredGrid))
+ fprintf(stderr,"Cannot get flagForNormalOrStaggeredGrid %s\n",grib_get_error_message(err));
+ intv[9] = flagForNormalOrStaggeredGrid;
+
+ if(err = grib_get_long(handle,"numberInTheGridCoordinateList",&oo_length))
+ fprintf(stderr,"Cannot get numberInTheGridCoordinateList %s\n",grib_get_error_message(err));
+ intv[10] = oo_length;
+ if(err = grib_get_long(handle,"verticalCoordinateDefinition",&vertCooDef))
+ fprintf(stderr,"Cannot get verticalCoordinateDefinition %s\n",grib_get_error_message(err));
+ intv[11] = vertCooDef;
+
+ /* INTIN for ocean */
+ if(err = int2_intin("ocean",intv,realv,text))
+ {
+ fprintf(stderr,"Ocean setup INTIN failed %d\n",err);
+ }
+
+ /* if (coordinate3Flag != 3 || coordinate4Flag != 4) { */
+ /* if (coordinate3Flag == 3 && coordinate4Flag == 4) { */
+ /* Tim and Sinisa */
+ if(err = grib_get_size(handle,"gridCoordinate",&o_length))
+ {
+ fprintf(stderr,"Cannot get size of pl %s\n",grib_get_error_message(err));
+ }
+
+ /* Just for Horizontal (lat/long) field interpolation */
+ if(err = grib_get_long_array(handle,"gridCoordinate",gridCoordinate,&o_length))
+ fprintf(stderr,"Cannot get gridCoordinate %s\n",grib_get_error_message(err));
+
+ if(intf2_debug)
+ printf("DESCRIBE_INPUT_FIELD: o_length %d \n", o_length);
+
+ for( i = 0; i< o_length ; i++)
+ {
+ intv[i] = gridCoordinate[i];
+ /* printf("DESCRIBE_INPUT_FIELD: ocean horizontal %d : %d \n", i,intv[i]); */
+ }
+ /* INTIN for ocean gridCoordinate */
+ if(err = int2_intin("coord_ocean",intv,realv,text))
+ {
+ fprintf(stderr,"Ocean setup INTIN failed %d\n",err);
+ }
+ /* } */
+ err = grib_get_double(handle,"missingValue",&missingValue);
+
+ if (err != GRIB_SUCCESS && err != GRIB_NOT_FOUND) {
+ fprintf(stderr,"Missing value for OCEAN %s\n",grib_get_error_message(err));
+ }
+ if(intf2_debug)
+ printf("DESCRIBE_INPUT_FIELD: OCEAN Field Missing Value %f \n",missingValue);
+ if(err == GRIB_SUCCESS)
+ {
+ realv[0] = missingValue;
+ text = "yes";
+ if(err = int2_intin("missingvalue",intv,realv,text))
+ {
+ fprintf(stderr,"Missing Value setup INTIN failed %f\n",err);
+ }
+ }
+ }
+
+
+ /* get Date */
+ if(err = grib_get_long(handle,"dataDate",&date))
+ {
+ fprintf(stderr,"Cannot get date %s\n",grib_get_error_message(err));
+ }
+ intv[0] = date;
+ if(err = int2_intin("date",intv,realv,text))
+ {
+ fprintf(stderr,"Date setup INTIN failed %d\n",err);
+ }
+
+ /* get Level Type */
+ if((err = grib_get_string(handle,"typeOfLevel",typeOfLevel,&typeOfLevelLen))!= GRIB_SUCCESS)
+ {
+ fprintf(stderr,"Cannot get Level Type %s\n",grib_get_error_message(err));
+ return err;
+ }
+
+ levelType=levTypeInt(typeOfLevel);
+ intv[0] = levelType;
+ if(err = int2_intin("levtype",intv,realv,text))
+ {
+ fprintf(stderr,"Level Type setup INTIN failed %d\n",err);
+ }
+ /* printf("Level Type setup INTIN %d\n",levelType); */
+ /* get Level */
+ if(levelType != 255){
+ if((err = grib_get_long(handle,"level",&level))!= GRIB_SUCCESS)
+ {
+ fprintf(stderr,"Cannot get Level %s\n",grib_get_error_message(err));
+ return err;
+ }
+
+ intv[0] = level;
+ if(err = int2_intin("level",intv,realv,text))
+ {
+ fprintf(stderr,"Level setup INTIN failed %d\n",err);
+ }
+ }
+ /* } */
+
+ /* LSM */
+ if( levelType == 100 || levelType == 108 || levelType == 109 || levelType == 255){
+ text = "no";
+ }
+ else
+ text = "yes";
+ if(err = int2_intin("lsmset",intv,realv,text))
+ {
+ fprintf(stderr,"LSM setup INTIN failed %d\n",err);
+ }
+
+ /* get Parameter Number */
+ /* if(err = grib_get_long(handle,"param",¶meter)) */
+ if(err = grib_get_long(handle,"paramId",¶meter))
+ {
+ if(getenv("INTF2_IGNORE_PARAM") != 0)
+ {
+ parameter = 1;
+ table = 1;
+ }
+ else
+ fprintf(stderr,"Cannot Parameter %s\n",grib_get_error_message(err));
+ }
+ if(intf2_debug)
+ {
+ printf("DESCRIBE_INPUT_FIELD: Parameter - %d \n",parameter);
+ }
+
+ if(parameter > 1000)
+ {
+ table = parameter / 1000;
+ parameter = parameter % 1000;
+ }
+ else
+ table = 128;
+
+ intv[0] = table;
+ if(err = int2_intin("table",intv,realv,text))
+ {
+ fprintf(stderr,"Table Number setup INTIN failed %d\n",err);
+ }
+
+ intv[0] = parameter;
+ if(err = int2_intin("parameter",intv,realv,text))
+ {
+ fprintf(stderr,"Parameter Number setup INTIN failed %d\n",err);
+ }
+
+ /* If bitmap Present */
+ if((err = grib_get_long(handle,"bitmapPresent",&bitmapPresent))!= GRIB_SUCCESS)
+ {
+ fprintf(stderr,"Cannot get bitmapPresent %s\n",grib_get_error_message(err));
+ return err;
+ }
+ /* There are exeptions for a few centres */
+ if(err = grib_get_long(handle,"centre",¢re))
+ {
+ fprintf(stderr,"Cannot get centre %s\n",grib_get_error_message(err));
+ }
+ if(levelType == 100 && parameter == 129)
+ bitmapPresent = 0;
+
+ /* if(table == 128 && (parameter == 31 || parameter == 130)){ */
+/* Live emoslib to use its own values
+Can Not set allways external missing value in case bitmap is Present because of some inconsistensy in LIBEMOS
+*/
+ if(bitmapPresent) {
+ /* Try to play in a same style as Libemos
+ missingValue = -2147483647.0;
+ err = grib_set_double(handle,"missingValue",missingValue);
+ */
+
+ err = grib_get_double(handle,"missingValue",&missingValue);
+
+ if (err != GRIB_SUCCESS && err != GRIB_NOT_FOUND) {
+ fprintf(stderr,"Missing value %s\n",grib_get_error_message(err));
+ }
+ if(intf2_debug)
+ printf("DESCRIBE_INPUT_FIELD: BITMAP PRESENT Missing Value %f \n",missingValue);
+ if(err == GRIB_SUCCESS) {
+ realv[0] = missingValue;
+ text = "yes";
+ if(err = int2_intin("missingval",intv,realv,text)) {
+ fprintf(stderr,"Missing Value setup INTIN failed %f\n",err);
+ }
+ }
+ }
+
+
+ /* Default Accuracy */
+ if((err = grib_get_long(handle,"bitsPerValue",&accuracy))!= GRIB_SUCCESS)
+ {
+ fprintf(stderr,"Cannot get accuracy %s\n",grib_get_error_message(err));
+ return err;
+ }
+ intv[0] = accuracy;
+ if(err = int2_intin("accuracy",intv,realv,text))
+ {
+ fprintf(stderr,"Accuracy setup INTIN failed %d\n",err);
+ }
+ if(intf2_debug)
+ {
+ printf("DESCRIBE_INPUT_FIELD: Input Accuracy %d \n",accuracy);
+ }
+
+
+ /* Particular Input fields */
+
+ /* Spherical harmonics */
+ if(strcmp(grid_type,"sh") == 0)
+ {
+ long truncation;
+ /* get Truncation */
+ if((err = grib_get_long(handle,"pentagonalResolutionParameterJ",&truncation))!= GRIB_SUCCESS)
+ {
+ fprintf(stderr,"Cannot get Truncation %s\n",grib_get_error_message(err));
+ return err;
+ }
+ intv[0] = truncation;
+ if(err = int2_intin("truncation",intv,realv,text))
+ {
+ fprintf(stderr,"Truncation setup INTIN failed %d\n",err);
+ }
+ if(outputRepresentation)
+ {
+ if(err = int2_intout("truncation",intv,realv,text))
+ {
+ fprintf(stderr,"Truncation setup INTOUT failed %d\n",err);
+ }
+ }
+ }
+
+
+ /* Gaussian grid */
+ if(strcmp(grid_type,"regular_gg") == 0 || strcmp(grid_type,"reduced_gg") == 0)
+ {
+ long gaussianType, gaussianNumber ;
+
+
+ /* Gaussian Grid Number */
+ if((err = grib_get_long(handle,"numberOfParallelsBetweenAPoleAndTheEquator",&gaussianNumber))!= GRIB_SUCCESS)
+ {
+ fprintf(stderr,"Cannot get gaussian Number %s\n",grib_get_error_message(err));
+ return err;
+ }
+ intv[0] = gaussianNumber;
+
+ /* Regular or Reduced */
+ if(strcmp(grid_type,"reduced_gg") == 0)
+ {
+ size_t rg_length = 0;
+ if(err = int2_intin("reduced",intv,realv,text))
+ {
+ fprintf(stderr,"Reduced Gaussian setup failed %d\n",err);
+ }
+ if(outputRepresentation) {
+ if(err = int2_intout("reduced",intv,realv,text)) {
+ fprintf(stderr,"Reduced Gaussian setup failed %d\n",err);
+ }
+ }
+ if(err = grib_get_size(handle,"pl",&rg_length)) {
+ fprintf(stderr,"reduced_gg Cannot get size of pl %s\n",grib_get_error_message(err));
+ }
+ if(intf2_debug) {
+ printf("DESCRIBE_INPUT_FIELD: Reduced Gaussian north-south number of points %d\n",rg_length);
+ }
+
+ if(err = grib_get_long_array(handle,"pl",rg_def,&rg_length)) {
+ fprintf(stderr,"Cannot get pl %s\n",grib_get_error_message(err));
+ }
+ for( i = 0; i< rg_length ; i++) {
+ intv[i] = rg_def[i];
+ }
+ if(err = int2_intin("ga_pnts",intv,realv,text)) {
+ fprintf(stderr,"Reduced Gaussian setup failed %d\n",err);
+ }
+ }
+ else
+ {
+ if(err = int2_intin("regular",intv,realv,text)) {
+ fprintf(stderr,"Regular Gaussian setup failed %d\n",err);
+ }
+ if(outputRepresentation) {
+ if(err = int2_intout("regular",intv,realv,text)) {
+ fprintf(stderr,"Regular Gaussian setup failed %d\n",err);
+ }
+ }
+ }
+
+ }
+ /* Shall missing value to be used */
+ /* missingval because can not be applied in Emos lib everywhere... */
+
+ /* Pick up area if the field is lat-lon or gaussian, scanning mode and number of points ns we */
+ if(strcmp(grid_type,"regular_ll") == 0 || strcmp(grid_type,"regular_gg") == 0 || strcmp(grid_type,"reduced_gg") == 0 || strcmp(grid_type,"reduced_ll") == 0)
+ {
+ double latitudeOfFirstGridPoint, longitudeOfFirstGridPoint, latitudeOfLastGridPoint, longitudeOfLastGridPoint;
+ if((err = grib_get_double(handle,"latitudeOfFirstGridPointInDegrees",&latitudeOfFirstGridPoint))!= GRIB_SUCCESS)
+ {
+ fprintf(stderr,"Cannot get latitudeOfFirstGridPointInDegrees %s\n",grib_get_error_message(err));
+ return err;
+ }
+ if((err = grib_get_double(handle,"longitudeOfFirstGridPointInDegrees",&longitudeOfFirstGridPoint))!= GRIB_SUCCESS)
+ {
+ fprintf(stderr,"Cannot get longitudeOfFirstGridPointInDegrees %s\n",grib_get_error_message(err));
+ return err;
+ }
+ if((err = grib_get_double(handle,"latitudeOfLastGridPointInDegrees",&latitudeOfLastGridPoint))!= GRIB_SUCCESS)
+ {
+ fprintf(stderr,"Cannot get latitudeOfLastGridPointInDegrees %s\n",grib_get_error_message(err));
+ return err;
+ }
+ if((err = grib_get_double(handle,"longitudeOfLastGridPointInDegrees",&longitudeOfLastGridPoint))!= GRIB_SUCCESS)
+ {
+ fprintf(stderr,"Cannot get longitudeOfLastGridPointInDegrees %s\n",grib_get_error_message(err));
+ return err;
+ }
+
+ realv[0] = latitudeOfFirstGridPoint;
+ realv[1] = longitudeOfFirstGridPoint;
+ realv[2] = latitudeOfLastGridPoint;
+ realv[3] = longitudeOfLastGridPoint;
+ if(intf2_debug)
+ {
+ printf("DESCRIBE_INPUT_FIELD: Input AREA %f %f %f %f \n",latitudeOfFirstGridPoint,longitudeOfFirstGridPoint,latitudeOfLastGridPoint,longitudeOfLastGridPoint);
+ }
+
+ if(err = int2_intin("area",intv,realv,text))
+ {
+ fprintf(stderr,"Area setup INTIN failed %d\n",err);
+ }
+ /* Scanning mode */
+ if((err = grib_get_long(handle,"jScansPositively",&scanningMode))!= GRIB_SUCCESS)
+ {
+ fprintf(stderr,"Cannot get scanning mode %s\n",grib_get_error_message(err));
+ return err;
+ }
+ if(scanningMode)
+ scanningMode = 64;
+ if(intf2_debug)
+ {
+ printf("DESCRIBE_INPUT_FIELD: Input Scanning Mode - %d \n",scanningMode);
+ }
+ intv[0] = scanningMode;
+ if(err = int2_intin("scan",intv,realv,text))
+ {
+ fprintf(stderr,"Scanning mode setup INTIN failed %d\n",err);
+ }
+ /* number Of Points Along A Parallel */
+ if((err = grib_get_long(handle,"numberOfPointsAlongAParallel",&niwe))!= GRIB_SUCCESS)
+ {
+ fprintf(stderr,"Cannot get numberOfPointsAlongAParallel %s\n",grib_get_error_message(err));
+ return err;
+ }
+ intv[0] = niwe;
+ /* number Of Points Along A Meridian */
+ if((err = grib_get_long(handle,"numberOfPointsAlongAMeridian",&nins))!= GRIB_SUCCESS)
+ {
+ fprintf(stderr,"Cannot get numberOfPointsAlongAMeridian %s\n",grib_get_error_message(err));
+ return err;
+ }
+ intv[1] = nins;
+ if(err = int2_intin("npts",intv,realv,text))
+ {
+ fprintf(stderr,"Number of points INTIN failed %d\n",err);
+ }
+
+ }
+
+ /* Lat-Lon grid */
+ if(strcmp(grid_type,"regular_ll") == 0 || strcmp(grid_type,"reduced_ll") == 0)
+ {
+ double iDirectionIncrement = 0, jDirectionIncrement = 0;
+ size_t rll_length = 0;
+
+ if(intf2_debug) {
+ printf("DESCRIBE_INPUT_FIELD: Input Field - %s \n",grid_type);
+ }
+ /* I Direction Increment */
+ if((err = grib_get_double(handle,"iDirectionIncrementInDegrees",&iDirectionIncrement))!= GRIB_SUCCESS)
+ {
+ fprintf(stderr,"Cannot get iDirectionIncrementInDegrees %s\n",grib_get_error_message(err));
+ return err;
+ }
+ /* J Direction Increment */
+ if((err = grib_get_double(handle,"jDirectionIncrementInDegrees",&jDirectionIncrement))!= GRIB_SUCCESS)
+ {
+ fprintf(stderr,"Cannot get jDirectionIncrementInDegrees %s\n",grib_get_error_message(err));
+ return err;
+ }
+
+ realv[0] = iDirectionIncrement;
+ realv[1] = jDirectionIncrement;
+
+ if(strcmp(grid_type,"regular_ll") == 0) {
+ if(err = int2_intin("grid",intv,realv,text))
+ {
+ fprintf(stderr,"Grid setup INTIN failed %d\n",err);
+ }
+ /* Set output representation if it is not set */
+ if(outputRepresentation)
+ {
+ if(err = int2_intout("grid",intv,realv,text))
+ {
+ fprintf(stderr,"Grid setup INTOUT failed %d\n",err);
+ }
+ }
+ }
+ if(strcmp(grid_type,"reduced_ll") == 0) {
+ if(outputRepresentation) {
+ if(err = int2_intout("red_latlon",intv,realv,text)) {
+ fprintf(stderr,"intout Reduced latlon - wave setup failed %d\n",err);
+ }
+ }
+ }
+
+ /* number Of Points Along A Parallel */
+ /* number Of Points Along A Meridian */
+ /*
+ if(err = grib_get_long(handle,"numberOfPointsAlongAParallel",&niwe))
+ {
+ fprintf(stderr,"Cannot get numberOfPointsAlongAParallel %s\n",grib_get_error_message(err));
+ }
+ intv[0] = niwe;
+ if(err = grib_get_long(handle,"numberOfPointsAlongAMeridian",&nins))
+ {
+ fprintf(stderr,"Cannot get numberOfPointsAlongAMeridian %s\n",grib_get_error_message(err));
+ }
+ intv[1] = nins;
+ if(err = int2_intin("npts",intv,realv,text))
+ {
+ fprintf(stderr,"Number of points INTIN failed %d\n",err);
+ }
+ */
+
+ /* If Reduced */
+ /* Force wave processing for certain paramaters */
+ if(strcmp(grid_type,"reduced_ll") == 0 || table == 140 || (table == 131 && (parameter == 232 || parameter == 229)))
+ {
+ if(strcmp(grid_type,"reduced_ll") == 0) {
+ if(err = grib_get_size(handle,"pl",&rll_length)) {
+ fprintf(stderr,"Cannot get size of pl %s\n",grib_get_error_message(err));
+ }
+ if(intf2_debug) {
+ printf("DESCRIBE_INPUT_FIELD: Number of points NS from reduced_ll definition %d\n",rll_length);
+ }
+
+ if(err = grib_get_long_array(handle,"pl",rll_def,&rll_length)) {
+ fprintf(stderr,"Cannot get pl %s\n",grib_get_error_message(err));
+ }
+ intv[0] = rll_length;
+ if(err = int2_intin("redu_ll",intv,realv,text)) {
+ fprintf(stderr,"Reduced LatLon setup failed %d\n",err);
+ }
+ for( i = 0; i< rll_length ; i++) {
+ intv[i] = rll_def[i];
+ }
+ if(err = int2_intin("l_npts",intv,realv,text)) {
+ fprintf(stderr,"Reduced LatLon setup failed %d\n",err);
+ }
+ }
+ err = grib_get_long(handle,"matrixOfValues",&matrixOfValues);
+ if (err == GRIB_SUCCESS) {
+ intv[0] = matrixOfValues;
+ if(err = int2_intin("matrix",intv,realv,text)) {
+ fprintf(stderr,"Matrix Value setup INTIN failed %f\n",err);
+ }
+ }
+
+ err = grib_get_double(handle,"missingValue",&missingValue);
+
+ if (err != GRIB_SUCCESS && err != GRIB_NOT_FOUND) {
+ fprintf(stderr,"Missing value %s\n",grib_get_error_message(err));
+ }
+ if(intf2_debug)
+ printf("DESCRIBE_INPUT_FIELD: Wave field Missing Value %f \n",missingValue);
+ if(err == GRIB_SUCCESS) {
+ realv[0] = missingValue;
+ text = "yes";
+ if(err = int2_intin("missingvalue",intv,realv,text)) {
+ fprintf(stderr,"Missing Value setup INTIN failed %f\n",err);
+ }
+ }
+ }
+
+ }
+
+ /************************************************************/
+ /* Describe output unpacked field for INTF */
+
+
+ /* Set INTOUT to get unpack field from INTF */
+ if(err = int2_intout("form",intv,realv,"unpacked"))
+ {
+ fprintf(stderr,"Form setup INTOUT failed %d\n",err);
+ }
+
+
+ /* Level Type */
+ intv[0] = levelType;
+ if(err = int2_intout("levtype",intv,realv,text))
+ {
+ fprintf(stderr,"Level Type setup INTOUT failed %d\n",err);
+ }
+ /*
+ */
+ /* if(levelType != 1){ */
+ /* Level */
+ intv[0] = level;
+ if(err = int2_intout("level",intv,realv,text))
+ {
+ fprintf(stderr,"Level setup INTOUT failed %d\n",err);
+ }
+ /* } */
+
+
+ /* Table */
+ /* Parameter */
+ intv[0] = table;
+ if(err = int2_intout("table",intv,realv,text))
+ {
+ fprintf(stderr,"Table Number setup INTOUT failed %d\n",err);
+ }
+
+ intv[0] = parameter;
+ if(err = int2_intout("parameter",intv,realv,text))
+ {
+ fprintf(stderr,"Parameter Number setup INTOUT failed %d\n",err);
+ }
+ /*
+ */
+
+ /* Default Accuracy */
+ /*
+ intv[0] = accuracy;
+ if(intf2_debug)
+ {
+ printf("DESCRIBE_INPUT_FIELD: Input Accuracy - %d \n",accuracy);
+ }
+ if(err = int2_intout("accuracy",intv,realv,text))
+ {
+ fprintf(stderr,"Accuracy setup INTOUT failed %d\n",err);
+ }
+ */
+
+ return err;
+
+}
diff --git a/grib_api_merging/emos.c b/grib_api_merging/emos.c
new file mode 100755
index 0000000..9d6a9b8
--- /dev/null
+++ b/grib_api_merging/emos.c
@@ -0,0 +1,139 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "emos.h"
+
+#ifdef FORTRAN_UPPERCASE
+#define outrep_ OUTREP
+#define gettru_ GETTRU
+#define setrep_ SETREP
+#define chkout_ CHKOUT
+#define global_ GLOBAL
+#define intf_ INTF
+#define intout_ INTOUT
+#define intin_ INTIN
+#define gasetup_ GASETUP
+#define intuvs_ INTUVS
+#define intvecy_ INTVECY
+#define estima_ ESTIMA
+#endif
+
+#ifdef FORTRAN_NO_UNDERSCORE
+#define outrep_ outrep
+#define gettru_ gettru
+#define setrep_ setrep
+#define chkout_ chkout
+#define global_ global
+#define intf_ intf
+#define intout_ intout
+#define intin_ intin
+#define gasetup_ gasetup
+#define intuvs_ intuvs
+#define intvecy_ intvecy
+#define estima_ estima
+#endif
+
+
+fortint outrep_();
+fortint estima_();
+fortint gettru_();
+fortint setrep_(fortint*);
+fortint chkout_();
+fortint global_();
+fortint intf_(const char*, fortint*, fortfloat[], const char*, fortint*, fortfloat[]);
+fortint intout_(const char*, fortint[], fortfloat[], const char*, fortint, fortint);
+fortint intin_(const char*, fortint[], fortfloat[], const char*, fortint, fortint);
+fortint gasetup_( fortint isec1[], fortint isec2[], fortint isec3[], fortint isec4[], fortfloat zsec3[]);
+fortint intuvs_(fortfloat[], fortfloat[], fortint*, fortfloat[], fortfloat[], fortint*);
+fortint intuvu_(fortfloat[], fortfloat[], fortint*, fortfloat[], fortfloat[], fortint*);
+fortint intvecy_(fortfloat[], fortfloat[], fortint*, fortfloat[], fortfloat[], fortint*);
+/* fortint intvecy_(fortfloat[], fortfloat[], fortint*, fortfloat[], fortfloat[], fortint*); */
+
+fortint int2_estima()
+{
+ return estima_();
+}
+
+fortint int2_global()
+{
+ return global_();
+}
+
+fortint int2_chkout()
+{
+ return chkout_();
+}
+
+fortint int2_setrep(fortint output_flag)
+{
+ return setrep_(&output_flag);
+}
+
+fortint int2_gettru()
+{
+ return gettru_();
+}
+
+fortint int2_outrep()
+{
+ return outrep_();
+}
+
+fortint int2_intf( fortfloat in_array[], fortint in_array_length, fortfloat *out_array, fortint *out_array_length)
+{
+ char in_grib[1];
+ char out_grib[500000];
+
+ return intf_(in_grib, &in_array_length, in_array, out_grib, out_array_length, out_array);
+}
+
+fortint int2_intout(const char* param,fortint iv[],fortfloat dv[],const char* cv)
+{
+ char *intf2_debug = getenv("INTF2_DEBUG");
+
+ if(!cv) cv = "";
+ if(intf2_debug)
+ {
+ printf("int2_intout: %s\n",param);
+ }
+ return intout_(param,iv,dv,cv,strlen(param),strlen(cv));
+}
+
+fortint int2_intin(const char* param,fortint iv[],fortfloat dv[],const char* cv)
+{
+ if(!cv) cv = "";
+ return intin_(param,iv,dv,cv,strlen(param),strlen(cv));
+}
+
+fortint int2_gasetup( fortint isec1[], fortint isec2[], fortint isec3[], fortint isec4[], fortfloat zsec3[])
+{
+ return gasetup_( isec1, isec2, isec3, isec4, zsec3 );
+}
+
+fortint int2_intuvy(fortfloat vort_in[],fortfloat div_in[] , fortint in_array_length, fortfloat *vort_out, fortfloat *div_out, fortint *out_array_length)
+{
+ return intuvy_( vort_in, div_in , &in_array_length, vort_out, div_out, out_array_length);
+}
+
+fortint int2_intuvu(fortfloat vort_in[],fortfloat div_in[] , fortint in_array_length, fortfloat *vort_out, fortfloat *div_out, fortint *out_array_length)
+{
+ return intuvu_( vort_in, div_in , &in_array_length, vort_out, div_out, out_array_length);
+}
+
+fortint int2_intvecy(fortfloat u_in[],fortfloat v_in[] , fortint in_array_length, fortfloat *u_out, fortfloat *v_out, fortint *out_array_length)
+{
+ return intvecy_( u_in, v_in , &in_array_length, u_out, v_out, out_array_length);
+}
+
diff --git a/grib_api_merging/emos.h b/grib_api_merging/emos.h
new file mode 100755
index 0000000..95964e5
--- /dev/null
+++ b/grib_api_merging/emos.h
@@ -0,0 +1,21 @@
+/**
+* Copyright 1981-2012 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 "fortint.h"
+#define ISECTION_0 2
+#define ISECTION_1 1024 /* beware of for ocean data */
+#define ISECTION_2 5000
+#define ISECTION_3 3
+#define ISECTION_4 512
+
+#define RSECTION_2 512
+#define RSECTION_3 2
+#define RSECTION_4 1
+
diff --git a/grib_api_merging/example.c b/grib_api_merging/example.c
new file mode 100755
index 0000000..4de06b3
--- /dev/null
+++ b/grib_api_merging/example.c
@@ -0,0 +1,184 @@
+/**
+* Copyright 1981-2012 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 <assert.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include "grib_api.h"
+#include "emos.h"
+
+char outgrib[1000000];
+char buffer[1024*1024*10];
+
+fortint intf2(char* grib_in, fortint* length_in, char* grib_out, fortint* length_out);
+
+#define intout intout_
+
+long edition = 2;
+
+int main(int argc, char** argv) {
+
+ int err = 0;
+
+ size_t length = sizeof(buffer);
+ long outlen = sizeof(outgrib);
+ /* size_t outlen = sizeof(outgrib); */
+
+ size_t mesg_len;
+ const void* mesg;
+
+ FILE* in = NULL;
+ FILE* out = NULL;
+
+ grib_handle *h = NULL;
+
+ fortint intv[4] = {0,};
+ double realv[4] = {0,};
+ char* text = "dissemination";
+ long version;
+ double resol;
+ int count = 1;
+
+ if( argc < 3 )
+ {
+ printf("\n Usage: ./example inputgrib outputgrib resol \n");
+ exit(1);
+ }
+
+ in = fopen(argv[1],"r");
+ if(!in)
+ {
+ perror( argv[1] );
+ exit(10);
+ }
+
+ out = fopen(argv[2],"w");
+ if(!out) {
+ perror(argv[2]);
+ exit(10);
+ }
+
+ resol = atof(argv[3]);
+
+ version = grib_get_api_version();
+
+
+ /* printf("--- grib_api version %d \n",version); */
+
+
+ while((err = readany(in,buffer,&length)) == 0)
+ {
+ printf(" =================== %d ============================== \n", count++);
+
+ /* INTOUT settings */
+
+/* Area */
+ /* north */
+ /* realv[0] = 69.5; */
+ /* west */
+ /* realv[1] = 345.5; */
+ /* south */
+ /* realv[2] = 34.5; */
+ /* east */
+ /* realv[3] = 34.5; */
+/*
+ if(err = int2_intout("area", intv, realv, text))
+ {
+ fprintf(stderr,"Area setup INTOUT failed %d\n",err);
+ return err;
+ }
+*/
+
+/* Lat-Lon resolution */
+ realv[0] = resol;
+ realv[1] = resol;
+
+ if( err = int2_intout("grid",intv,realv,text))
+ {
+ fprintf(stderr,"Grid setup INTOUT failed %d\n",err);
+ exit(err);
+ }
+/* Accuracy */
+ /*
+ intv[0] = 16;
+ if(err = int2_intout("accuracy",intv,realv,text))
+ {
+ fprintf(stderr,"Reduced Gaussian setup failed %d\n",err);
+ return err;
+ }
+
+ */
+/* Reduced gaussian */
+ /*
+ intv[0] = 200;
+ if(err = int2_intout("reduced",intv,realv,text))
+ {
+ fprintf(stderr,"Reduced Gaussian setup failed %d\n",err);
+ return err;
+ }
+ */
+/* Regular gaussian */
+ /*
+ intv[0] = 200;
+ if(err = int2_intout("regular",intv,realv,text))
+ {
+ fprintf(stderr,"Regular Gaussian setup failed %d\n",err);
+ return err;
+ }
+ */
+/* Spectral */
+ /*
+ intv[0] = 63;
+ if(err = int2_intout("truncation",intv,realv,text))
+ {
+ fprintf(stderr,"Spherical setup failed %d\n",err);
+ return err;
+ }
+ */
+/* Rotation */
+ /*
+ realv[0] = 0.0;
+ realv[1] = 80.0;
+ if( err = int2_intout("rotation",intv,realv,text))
+ {
+ fprintf(stderr,"Rotation setup INTOUT failed %d\n",err);
+ exit(err);
+ }
+ */
+
+ if(err = intf2(buffer,&length,outgrib,&outlen))
+ {
+ fprintf(stderr,"INTF2 failed %d\n",err);
+ exit(err);
+ }
+
+ if(fwrite(outgrib,1,outlen,out) != outlen)
+ {
+ perror(argv[4]);
+ exit(1);
+ }
+ }
+ if(fclose(in))
+ {
+ perror(argv[3]);
+ exit(1);
+ }
+
+ if(fclose(out))
+ {
+ perror(argv[4]);
+ exit(1);
+ }
+
+ return 0;
+}
+
diff --git a/grib_api_merging/fortint.h b/grib_api_merging/fortint.h
new file mode 100755
index 0000000..15092e1
--- /dev/null
+++ b/grib_api_merging/fortint.h
@@ -0,0 +1,30 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef FORTINT_H
+#define FORTINT_H
+
+#ifdef INTEGER_IS_INT
+#define fortint int
+#else
+#if defined hpR64 || defined hpiaR64
+#define fortint long long
+#else
+#define fortint long
+#endif
+#endif
+
+#ifdef REAL_8
+typedef double fortfloat;
+#else
+typedef float fortfloat; /* fortran single precision float */
+#endif
+
+#endif /* end of FORTINT_H */
diff --git a/grib_api_merging/intf2.c b/grib_api_merging/intf2.c
new file mode 100755
index 0000000..d82af17
--- /dev/null
+++ b/grib_api_merging/intf2.c
@@ -0,0 +1,301 @@
+/**
+* Copyright 1981-2012 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.h"
+#include "emos.h"
+
+fortint intf2_(char* grib_in, fortint* length_in, char* grib_out, fortint* length_out)
+{
+ fortint isec1[ISECTION_1] = {0,};
+ fortint isec2[ISECTION_2] = {0,};
+ fortint isec3[ISECTION_3] = {0,};
+ fortint isec4[ISECTION_4] = {0,};
+
+ static double *values_in = NULL;
+ static double *values_out = NULL;
+ static size_t values_in_len = 0;
+ static size_t values_out_len = 0;
+ double *values =NULL;
+
+ static float *values_in1 = NULL;
+ static float *values_out1 = NULL;
+ static size_t values_in_len1 = 0;
+ static size_t values_out_len1 = 0;
+
+ size_t ii = 0;
+ size_t inlen;
+ size_t len=0;
+ size_t outlen = *length_out;
+ size_t outlen_grib_message = 0;
+
+ fortint out_length = 0;
+
+ long long_length_in = *length_in;
+ fortint fortint_inlen = *length_in;
+ fortint fortint_outlen = outlen;
+
+ grib_handle *handle = 0;
+ grib_handle *outh = 0;
+ grib_handle *finalh = 0;
+
+ fortint err1 = 0, mars_interpolation = 0;
+ int err = 0 , what = 0;
+ int resetOutput = 0;
+ long nins, niwe;
+ long acc = 0;
+ long bitmapPresent = 0;
+
+ size_t size;
+
+ const void* temp;
+ char *intf2_debug = getenv("INTF2_DEBUG");
+ char *intf2_write = getenv("INTF2_WRITE_TO_FILE");
+ int jpeg = 0;
+ int set_spec_flags=0;
+ grib_util_grid_spec spec={0,};
+ grib_util_packing_spec packing_spec={0,};
+
+ mars_interpolation = int2_chkout();
+
+ if(!mars_interpolation)
+ {
+ *length_out = 0;
+ if(intf2_debug){
+ printf("INTF2: There is NOT users settings \n");
+ printf("INTF2: No Interpolation carried out \n");
+ }
+ return err;
+ }
+
+ fortint outputRepresentation = int2_outrep();
+
+ if(intf2_debug)
+ {
+ if(outputRepresentation )
+ printf("INTF2: Output Representation is NOT set by user\n");
+ }
+
+ handle = grib_handle_new_from_message(0,grib_in,long_length_in);
+ if(handle == 0) {
+ err = -1;
+ fprintf(stdout,"INTF2: Cannot create Handle %ld\n",err);
+ /* intlog2("INTF2: Cannot create Handle"); */
+ goto cleanup;
+ }
+
+ if( err = grib_get_size(handle,"values",&inlen))
+ {
+ fprintf(stdout,"INTF2: Cannot get size %s\n",grib_get_error_message(err));
+ return err;
+ }
+
+ if(inlen > values_in_len)
+ {
+ if(values_in) free(values_in);
+ values_in = (double*)malloc(sizeof(double)*inlen);
+ values_in_len = inlen;
+
+ if(!values_in)
+ {
+ err = -1;
+ fprintf(stdout,"INTF2: Cannot allocate %ld\n",inlen);
+ goto cleanup;
+ }
+ }
+
+ /* If bitmap Present */
+ if((err = grib_get_long(handle,"bitmapPresent",&bitmapPresent))!= GRIB_SUCCESS)
+ {
+ fprintf(stderr,"Cannot get bitmapPresent %s\n",grib_get_error_message(err));
+ return err;
+ }
+
+ /* if bitmap present Set missing value which correspond WAVE in Emos */
+ if(bitmapPresent)
+ {
+ /* if(err = grib_set_double(handle,"missingValue",12345.0)) */
+ if(err = grib_set_double(handle,"missingValue",-9999999.0))
+ {
+ fprintf(stdout,"INTF2: Cannot set Missing Value %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ }
+
+ /* Get decoded values */
+ if(err = grib_get_double_array(handle,"values",values_in,&inlen))
+ {
+ fprintf(stdout,"INTF2: Cannot get decoded values %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+
+
+ /* Descibe input field and initial settings for output field */
+ if(err = describe_input_field(handle,outputRepresentation))
+ {
+ fprintf(stdout,"INTF2 describe_input_field failed : %d\n",err);
+ goto cleanup;
+ }
+
+
+ /*============= INTF ====================================*/
+
+ if(outputRepresentation){
+ out_length = inlen;
+ }
+ else{
+ out_length = int2_estima();
+ if(!out_length){
+ fprintf(stdout,"INTF2: Estimate for length of output array is 0 \n");
+ err = -1;
+ goto cleanup;
+ }
+ }
+ if(out_length > values_out_len)
+ {
+ if(values_out) free(values_out);
+ values_out = (double*)malloc(sizeof(double)*out_length);
+ values_out_len = out_length;
+
+ if(!values_out)
+ {
+ fprintf(stdout,"INTF2: Cannot allocate values_out %ld\n",out_length);
+ err = -1;
+ goto cleanup;
+ }
+ }
+
+ fortint_inlen = inlen;
+ fortint_outlen = outlen;
+
+
+#ifdef REAL_8
+ if(err = int2_intf(values_in,fortint_inlen,values_out,&fortint_outlen))
+ {
+ fprintf(stdout,"INTF failed %d\n",err);
+ goto cleanup;
+ }
+#else
+ if(inlen > values_in_len1)
+ {
+ if(values_in1) free(values_in1);
+ values_in1 = (float*)malloc(sizeof(float)*inlen);
+ values_in_len1 = inlen;
+
+ if(!values_in1)
+ {
+ err = -1;
+ fprintf(stdout,"INTF2: Cannot allocate values_in1 %ld\n",inlen);
+ goto cleanup;
+ }
+ }
+ if(out_length > values_out_len1)
+ {
+ if(values_out1) free(values_out1);
+ values_out1 = (float*)malloc(sizeof(float)*out_length);
+ values_out_len1 = out_length;
+
+ if(!values_out1)
+ {
+ fprintf(stdout,"INTF2: Cannot allocate values_out1 %ld\n",out_length);
+ err = -1;
+ goto cleanup;
+ }
+ }
+ for( ii = 0 ; ii < fortint_inlen; ii++){
+ values_in1[ii] = values_in[ii];
+ }
+ if(err = int2_intf(values_in1,fortint_inlen,values_out1,&fortint_outlen))
+ {
+ fprintf(stdout,"INTF failed %d\n",err);
+ goto cleanup;
+ }
+ for( ii = 0 ; ii < fortint_outlen; ii++){
+ values_out[ii] = values_out1[ii];
+ }
+#endif
+ outlen = fortint_outlen;
+
+ if(intf2_debug) {
+ printf("INTF2: Outlen: %d \n",outlen);
+ }
+
+ err=copy_spec_from_ksec(&spec,&packing_spec);
+ if (err) {
+ fprintf(stdout,"INTF2: ERROR - copy_grid_spec_from_ksec unable to copy spec: %d\n", err);
+ goto cleanup;
+ }
+
+ packing_spec.accuracy=GRIB_UTIL_ACCURACY_USE_PROVIDED_BITS_PER_VALUES;
+ packing_spec.packing=GRIB_UTIL_PACKING_USE_PROVIDED;
+
+ if(outlen == 0) {
+ set_spec_flags |= GRIB_UTIL_SET_SPEC_FLAGS_ONLY_PACKING;
+ /* Sinisa and Enrico 7/3/11 comments this line */
+ /* packing_spec.packing=0; */
+ len=inlen;
+ values=values_in;
+ if(intf2_debug )
+ printf("INTF2: Outlen = 0 No Interpolation carried out \n");
+ } else {
+ len=outlen;
+ values=values_out;
+ }
+
+ finalh = grib_util_set_spec(handle,&spec, &packing_spec, set_spec_flags,values, len, &err);
+ if(!finalh) {
+ fprintf(stdout,"INTF2: ERROR - grib_util_set_spec: %d\n", err);
+ if(!err) err = 1;
+ goto cleanup;
+ }
+
+ if (outlen == 0){
+ if(err == -1) {
+ /* -1 coming from grib_util when there is not packing */
+ err = 0;
+ *length_out = 0;
+ if(intf2_debug)
+ printf("INTF2: No Interpolation carried out, nothing repacked \n");
+ goto cleanup;
+ }
+ }
+
+ err = grib_get_message(finalh,&temp,&outlen_grib_message);
+
+ if(outlen_grib_message > *length_out) {
+ fprintf(stdout,"INTF2: ERROR - INTF2 OUTLEN is too large: %d %d\n", outlen, *length_out);
+ err = 1;
+ goto cleanup;
+ }
+
+ memcpy(grib_out,temp,outlen_grib_message);
+
+ *length_out = outlen_grib_message;
+
+ /* goto cleanup; */
+ if(intf2_debug && (set_spec_flags & GRIB_UTIL_SET_SPEC_FLAGS_ONLY_PACKING)){
+ printf("INTF2: No Interpolation carried out but data repacked \n");
+ }
+
+
+cleanup:
+ if(resetOutput = int2_setrep(outputRepresentation)) printf("INTF2: Output Representation reset failed: %d \n",resetOutput);
+ if(handle) {grib_handle_delete(handle);handle=NULL;}
+ if(outh) {grib_handle_delete(outh);outh=NULL;}
+ if(outlen!=0 && finalh) grib_handle_delete(finalh);
+
+ return err;
+}
+
+fortint intf2(char* grib_in, fortint* length_in, char* grib_out, fortint* length_out)
+{
+ return intf2_(grib_in,length_in,grib_out,length_out);
+}
diff --git a/grib_api_merging/intuvp2.c b/grib_api_merging/intuvp2.c
new file mode 100755
index 0000000..6722bfd
--- /dev/null
+++ b/grib_api_merging/intuvp2.c
@@ -0,0 +1,435 @@
+/**
+* Copyright 1981-2012 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.h"
+#include "emos.h"
+
+
+fortint intuvp2_(char* vort_grib_in, char* div_grib_in, fortint* length_in, char* vort_grib_out, char* div_grib_out, fortint* length_out)
+{
+
+ static double *vort_values_in = NULL;
+ static double *div_values_in = NULL;
+ static double *vort_values_out = NULL;
+ static double *div_values_out = NULL;
+ static size_t values_in_len = 0;
+ static size_t values_out_len = 0;
+
+
+ static float *vort_values_in1 = NULL;
+ static float *div_values_in1 = NULL;
+ static float *vort_values_out1 = NULL;
+ static float *div_values_out1 = NULL;
+ static size_t values_in_len1 = 0;
+ static size_t values_out_len1 = 0;
+
+ grib_handle* hu = NULL;
+ grib_handle* hv = NULL;
+
+ size_t inlen;
+ size_t outlen = *length_out;
+ size_t outlen1 = *length_out;
+
+ long long_inlen = *length_in;
+ fortint fortint_inlen = *length_in;
+ fortint fortint_outlen = outlen;
+
+ int jpeg = 0, resetOutput = 0, what = 0;
+ long ii = 0;
+
+ char *text = "";
+ fortint intv[4];
+ fortfloat realv[4];
+ long truncation;
+ grib_handle *handle1 = NULL, *handle2 = NULL;
+ grib_handle *outh_u = NULL, *outh_v = NULL;
+ int err = 0;
+ int grib_err = 0;
+ long accuracy = 0;
+
+ fortint out_length = 0;
+
+ const void* temp1;
+ const void* temp2;
+ char *intf2_debug ;
+ char *intf2_write ;
+ fortint outputRepresentation;
+ int gribex_compatibility;
+ grib_util_grid_spec spec={0,};
+ grib_util_packing_spec packing_spec={0,};
+
+ gribex_compatibility=grib_get_gribex_mode(0);
+
+ intf2_debug = getenv("INTF2_DEBUG");
+ intf2_write = getenv("INTF2_WRITE_TO_FILE");
+
+ outputRepresentation = int2_outrep();
+
+ if(outputRepresentation)
+ if(intf2_debug) {
+ printf("INTUVP2: Output Representation is Not set by user\n");
+ }
+
+ handle1 = grib_handle_new_from_message_copy(0,vort_grib_in,long_inlen);
+ if(!handle1) {
+ err = -1;
+ goto cleanup;
+ }
+
+ handle2 = grib_handle_new_from_message_copy(0,div_grib_in,long_inlen);
+ if(!handle2) {
+ err = -1;
+ goto cleanup;
+ }
+
+ /*----------------------------------*/
+ if( err = grib_get_size(handle1,"values",&inlen))
+ {
+ fprintf(stderr,"INTUVP2: Cannot get size for vorticity %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+
+ if(intf2_debug) { printf("INTUVP2: inlen for vorticity: %d \n",inlen); }
+
+ if(inlen > values_in_len)
+ {
+ if(vort_values_in) free(vort_values_in);
+ vort_values_in = (double*)malloc(sizeof(double)*inlen);
+ values_in_len = inlen;
+
+ if(!vort_values_in)
+ {
+ err = -1;
+ fprintf(stdout,"INTUVP2: Cannot allocate vort_values_in %ld\n",inlen);
+ goto cleanup;
+ }
+
+ if(div_values_in) free(div_values_in);
+ div_values_in = (double*)malloc(sizeof(double)*inlen);
+ if(!div_values_in)
+ {
+ err = -1;
+ fprintf(stderr,"INTUVP2: Cannot allocate input array for divergency %d\n",inlen);
+ goto cleanup;
+ }
+ }
+
+/*
+ if( err = grib_get_size(handle2,"values",&inlen))
+ {
+ fprintf(stderr,"INTUVP2: Cannot get size for divergency %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+*/
+ if(intf2_debug) { printf("INTUVP2: inlen for divergency: %d \n",inlen); }
+
+
+ /* Default Accuracy */
+ if((err = grib_get_long(handle1,"bitsPerValue",&accuracy))!= GRIB_SUCCESS)
+ {
+ fprintf(stderr,"INTUVP2: Cannot get accuracy %s\n",grib_get_error_message(err));
+ return err;
+ }
+ intv[0] = accuracy;
+ if(err = int2_intin("accuracy",intv,realv,text))
+ {
+ fprintf(stderr,"INTUVP2: Accuracy setup INTIN failed %d\n",err);
+ }
+ if(intf2_debug)
+ {
+ printf("INTUVP2: Input Accuracy %d \n",accuracy);
+ }
+
+ /*----------------------------------*/
+
+ /* Get decoded values vorticity */
+ if(err = grib_get_double_array(handle1,"values",vort_values_in,&inlen))
+ {
+ fprintf(stderr,"INTUVP2: Cannot get decoded values %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+
+ /* Get decoded values divergency */
+ if(err = grib_get_double_array(handle2,"values",div_values_in,&inlen))
+ {
+ fprintf(stderr,"INTUVP2: Cannot get decoded values %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ /*----------------------------------*/
+
+ /* get Truncation */
+ if(err = grib_get_long(handle1,"J", &truncation))
+ {
+ fprintf(stderr,"INTUVP2: Cannot get Truncation %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ intv[0] = truncation;
+ if(err = int2_intin("truncation",intv,realv,text))
+ {
+ fprintf(stderr,"INTUVP2: Truncation setup INTIN failed %d\n",err);
+ goto cleanup;
+ }
+ if(outputRepresentation)
+ {
+ if(err = int2_intout("truncation",intv,realv,text))
+ {
+ fprintf(stderr,"INTUVP2: Truncation setup INTOUT failed %d\n",err);
+ goto cleanup;
+ }
+ }
+
+ /*============= INTUVY ====================================*/
+ if(outputRepresentation){
+ out_length = inlen;
+ }
+ else{
+ out_length = int2_estima();
+ if(!out_length){
+ fprintf(stdout,"INTUVP2: Estimate for length of output array is 0 \n");
+ err = -1;
+ goto cleanup;
+ }
+ }
+
+ if(out_length > values_out_len)
+ {
+ if(vort_values_out) free(vort_values_out);
+ vort_values_out = (double*)malloc(sizeof(double)*out_length);
+ values_out_len = out_length;
+
+ if(!vort_values_out)
+ {
+ fprintf(stdout,"INTUVP2: Cannot allocate vort_values_out %ld\n",out_length);
+ err = -1;
+ goto cleanup;
+ }
+ if(div_values_out) free(div_values_out);
+ div_values_out = (double*)malloc(sizeof(double)*out_length);
+
+ if(!div_values_out)
+ {
+ fprintf(stdout,"INTUVP2: Cannot allocate div_values_out %ld\n",out_length);
+ err = -1;
+ goto cleanup;
+ }
+ }
+
+
+ fortint_inlen = inlen;
+ fortint_outlen = outlen;
+#ifdef REAL_8
+ if(err = int2_intuvu(vort_values_in, div_values_in, fortint_inlen, vort_values_out, div_values_out, &fortint_outlen))
+ {
+ fprintf(stderr,"INTUVP2 failed %d\n",err);
+ goto cleanup;
+ }
+#else
+ if(inlen > values_in_len1)
+ {
+ if(vort_values_in1) free(vort_values_in1);
+ vort_values_in1 = (float*)malloc(sizeof(float)*inlen);
+ values_in_len1 = inlen;
+
+ if(!vort_values_in1)
+ {
+ err = -1;
+ fprintf(stdout,"INTUVP2: Cannot allocate vort_values_in %ld\n",inlen);
+ goto cleanup;
+ }
+
+ if(div_values_in1) free(div_values_in1);
+ div_values_in1 = (float*)malloc(sizeof(float)*inlen);
+ if(!div_values_in1)
+ {
+ err = -1;
+ fprintf(stderr,"INTUVP2: Cannot allocate input array for divergency %d\n",inlen);
+ goto cleanup;
+ }
+ }
+ if(out_length > values_out_len1)
+ {
+ if(vort_values_out1) free(vort_values_out1);
+ vort_values_out1 = (float*)malloc(sizeof(float)*out_length);
+ values_out_len1 = out_length;
+
+ if(!vort_values_out1)
+ {
+ fprintf(stdout,"INTUVP2: Cannot allocate vort_values_out %ld\n",out_length);
+ err = -1;
+ goto cleanup;
+ }
+ if(div_values_out1) free(div_values_out1);
+ div_values_out1 = (float*)malloc(sizeof(float)*out_length);
+
+ if(!div_values_out1)
+ {
+ fprintf(stdout,"INTUVP2: Cannot allocate div_values_out %ld\n",out_length);
+ err = -1;
+ goto cleanup;
+ }
+ }
+ for( ii = 0 ; ii < fortint_inlen; ii++){
+ vort_values_in1[ii] = vort_values_in[ii];
+ }
+ for( ii = 0 ; ii < fortint_inlen; ii++){
+ div_values_in1[ii] = div_values_in[ii];
+ }
+ if(err = int2_intuvu(vort_values_in1, div_values_in1, fortint_inlen, vort_values_out1, div_values_out1, &fortint_outlen))
+ {
+ fprintf(stderr,"INTUVP2 failed %d\n",err);
+ goto cleanup;
+ }
+ for( ii = 0 ; ii < fortint_outlen; ii++){
+ vort_values_in[ii] = vort_values_in1[ii];
+ }
+ for( ii = 0 ; ii < fortint_outlen; ii++){
+ div_values_in[ii] = div_values_in1[ii];
+ }
+#endif
+
+ *length_out = fortint_outlen;
+ outlen = fortint_outlen;
+
+ if(intf2_debug)
+ {
+ int i;
+ printf("INTUVP2: outlen: %d \n",outlen);
+ for(i=0; i<10 ; i++)
+ {
+ printf("INTUVP2: output data values U - %d - %f \n",i,vort_values_out[i]);
+ printf("INTUVP2: output data values V - %d - %f \n",i,div_values_out[i]);
+ }
+ }
+
+ if(outlen)
+ {
+ err=copy_spec_from_ksec(&spec,&packing_spec);
+
+ packing_spec.accuracy=GRIB_UTIL_ACCURACY_USE_PROVIDED_BITS_PER_VALUES;
+ packing_spec.packing=GRIB_UTIL_PACKING_USE_PROVIDED;
+
+ if (err) {
+ fprintf(stdout,"INTUVP2: ERROR - copy_grid_spec_from_ksec unable to copy spec: %d\n", err);
+ goto cleanup;
+ }
+ if (spec.grid_type==GRIB_UTIL_GRID_SPEC_SH) {
+ if (0 && gribex_compatibility) {
+ double laplacianOperator=0;
+ long P=0;
+ grib_get_long(handle2,"P",&P);
+ if(err = grib_get_double(handle2,"laplacianOperator",&laplacianOperator))
+ {
+ fprintf(stderr,"INTUVP2: Cannot Get P %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ /*
+ if(err = grib_set_long(handle2,"computeLaplacianOperator",0))
+ {
+ fprintf(stderr,"INTUVP2: Cannot Set computeLaplacianOperator %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ if(err = grib_set_long(handle1,"computeLaplacianOperator",0))
+ {
+ fprintf(stderr,"INTUVP2: Cannot Set computeLaplacianOperator %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ if(err = grib_set_long(handle1,"P",P))
+ {
+ fprintf(stderr,"INTUVP2: Cannot Set P %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ if(err = grib_set_long(handle2,"P",P))
+ {
+ fprintf(stderr,"INTUVP2: Cannot Set P %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ */
+ packing_spec.computeLaplacianOperator=0;
+ packing_spec.truncateLaplacian=1;
+ packing_spec.laplacianOperator=laplacianOperator;
+ } else {
+ packing_spec.computeLaplacianOperator=1;
+ }
+ }
+
+ hu = grib_util_set_spec(handle1,&spec, &packing_spec, 0,vort_values_out, outlen, &err);
+ if(!hu) {
+ fprintf(stdout,"INTUVP2: ERROR - grib_util_set_spec: %d\n", err);
+ if(!err) err = 1;
+ goto cleanup;
+ }
+
+ hv = grib_util_set_spec(handle2,&spec, &packing_spec, 0,div_values_out, outlen, &err);
+ if(!hv) {
+ fprintf(stdout,"INTUVP2: ERROR - grib_util_set_spec: %d\n", err);
+ if(!err) err = 1;
+ goto cleanup;
+ }
+
+ /* U velocity*/
+ if(err = grib_set_long(hu,"paramId",131))
+ {
+ fprintf(stderr,"INTUVP2: Cannot Set V %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+
+ grib_get_message(hu,&temp1,&outlen);
+ if(temp1) {
+ if(intf2_debug) {
+ printf("INTUVP2: outlen u-comp -> %d \n", outlen);
+ }
+ memcpy(vort_grib_out,temp1,outlen);
+ }
+ else
+ fprintf(stderr,"INTUVP2: Error u-comp \n");
+ outlen = *length_out;
+
+ /* V velocity*/
+ if(err = grib_set_long(hv,"paramId",132))
+ {
+ fprintf(stderr,"INTUVP2: Cannot Set V %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ grib_get_message(hv,&temp2,&outlen);
+ if(temp2) {
+ if(intf2_debug) {
+ printf("INTUVP2: outlen v-comp -> %d \n", outlen);
+ }
+ memcpy(div_grib_out,temp2,outlen);
+ }
+ else
+ fprintf(stderr,"INTUVP2: Error v-comp \n");
+ *length_out = outlen;
+
+ goto cleanup;
+
+ }
+ else {
+ fprintf(stderr,"INTUVP2: ERROR - INTUVP2 OUTLEN is: %d\n", outlen);
+ err = 1;
+ }
+
+cleanup:
+
+ if(resetOutput = int2_setrep(outputRepresentation)) printf("INTUVP2: Output Representation reset failed: %d \n",resetOutput);
+ if(hu && (hu != handle1)) grib_handle_delete(hu);
+ if(hv && (hv != handle2)) grib_handle_delete(hv);
+ if(handle1) {grib_handle_delete(handle1);handle1=0;};
+ if(handle2) {grib_handle_delete(handle2);handle2=0;};
+
+ return err;
+}
+
+fortint intuvp2(char* vort_grib_in, char* div_grib_in, fortint* length_in, char* vort_grib_out, char* div_grib_out, fortint* length_out)
+{
+ return intuvp2_(vort_grib_in,div_grib_in,length_in,vort_grib_out,div_grib_out,length_out);
+}
diff --git a/grib_api_merging/intuvs2.c b/grib_api_merging/intuvs2.c
new file mode 100755
index 0000000..1142ca6
--- /dev/null
+++ b/grib_api_merging/intuvs2.c
@@ -0,0 +1,489 @@
+/**
+* Copyright 1981-2012 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.h"
+#include "emos.h"
+
+
+fortint intuvs2_(char* vort_grib_in, char* div_grib_in, fortint* length_in, char* vort_grib_out, char* div_grib_out, fortint* length_out)
+{
+
+ static double *vort_values_in = NULL;
+ static double *div_values_in = NULL;
+ static double *vort_values_out = NULL;
+ static double *div_values_out = NULL;
+ static size_t values_in_len = 0;
+ static size_t values_out_len = 0;
+
+ static float *vort_values_in1 = NULL;
+ static float *div_values_in1 = NULL;
+ static float *vort_values_out1 = NULL;
+ static float *div_values_out1 = NULL;
+ static size_t values_in_len1 = 0;
+ static size_t values_out_len1 = 0;
+
+ long ii = 0;
+ long long_inlen = *length_in;
+ size_t inlen;
+ size_t outlen = *length_out;
+ fortint out_length = 0;
+
+ fortint fortint_inlen = *length_in;
+ fortint fortint_outlen = outlen;
+
+ int jpeg = 0, resetOutput = 0;;
+
+ char *text = "";
+ char *complex_switch = getenv("COMPLIANT_UV_SPECTRAL_COMPLEX");
+ fortint intv[4];
+ fortfloat realv[4];
+ long truncation, inputTrunc;
+ grib_handle *handle1, *handle2;
+ int err = 0;
+ long edition = 1;
+
+ const void* temp1;
+ const void* temp2;
+ char *intf2_debug = getenv("INTF2_DEBUG");
+
+ char packing_type[]="spectral_complex";
+ size_t size_pack=sizeof(packing_type);
+
+ fortint outputRepresentation = int2_outrep();
+
+ if(outputRepresentation)
+ if(intf2_debug) {
+ printf("INTUVS2: Output Representation is Not set by user\n");
+ }
+
+ handle1 = grib_handle_new_from_message_copy(0,vort_grib_in,long_inlen);
+ if(!handle1) {
+ err = -1;
+ goto cleanup;
+ }
+
+ handle2 = grib_handle_new_from_message_copy(0,div_grib_in,long_inlen);
+ if(!handle2) {
+ err = -1;
+ goto cleanup;
+ }
+
+ if(err =grib_get_long(handle1,"pentagonalResolutionParameterJ",&inputTrunc))
+ {
+ fprintf(stderr,"INTUVS2: Cannot get Truncation %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+/*----------------------------------*/
+ if( err = grib_get_size(handle1,"values",&inlen))
+ {
+ fprintf(stderr,"INTUVS2: Cannot get size for vorticity %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+
+ if(intf2_debug) {
+ printf("INTUVS2: inlen for vorticity: %d \n",inlen);
+ }
+
+ if(inlen > values_in_len)
+ {
+ if(vort_values_in) free(vort_values_in);
+ vort_values_in = (double*)malloc(sizeof(double)*inlen);
+ values_in_len = inlen;
+
+ if(!vort_values_in)
+ {
+ err = -1;
+ fprintf(stdout,"INTUVS2: Cannot allocate vort_values_in %ld\n",inlen);
+ goto cleanup;
+ }
+
+ if(div_values_in) free(div_values_in);
+ div_values_in = (double*)malloc(sizeof(double)*inlen);
+ if(!div_values_in)
+ {
+ err = -1;
+ fprintf(stderr,"INTUVS2: Cannot allocate input array for divergency %d\n",inlen);
+ goto cleanup;
+ }
+ }
+
+/*
+ if( err = grib_get_size(handle2,"values",&inlen))
+ {
+ fprintf(stderr,"INTUVS2: Cannot get size for divergency %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+*/
+ /* get edition */
+ if(err = grib_get_long(handle1,"edition", &edition))
+ {
+ fprintf(stderr,"INTUVS2: Cannot get Edition %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+
+ if(intf2_debug) {
+ printf("INTUVS2: inlen for divergency: %d \n",inlen);
+ }
+
+/*----------------------------------*/
+
+ /* Get decoded values vorticity */
+ if(err = grib_get_double_array(handle1,"values",vort_values_in,&inlen))
+ {
+ fprintf(stderr,"INTUVS2: Cannot get decoded values %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+
+ /* Get decoded values divergency */
+ if(err = grib_get_double_array(handle2,"values",div_values_in,&inlen))
+ {
+ fprintf(stderr,"INTUVS2: Cannot get decoded values %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+/*----------------------------------*/
+
+ /* get Truncation */
+ if(err = grib_get_long(handle1,"pentagonalResolutionParameterJ", &truncation))
+ {
+ fprintf(stderr,"INTUVS2: Cannot get Truncation %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ intv[0] = truncation;
+ if(err = int2_intin("truncation",intv,realv,text))
+ {
+ fprintf(stderr,"INTUVS2: Truncation setup INTIN failed %d\n",err);
+ goto cleanup;
+ }
+ if(outputRepresentation)
+ {
+ if(err = int2_intout("truncation",intv,realv,text))
+ {
+ fprintf(stderr,"INTUVS2: Truncation setup INTOUT failed %d\n",err);
+ goto cleanup;
+ }
+ }
+
+ /*============= INTUVY ====================================*/
+ out_length = inlen;
+
+ if(out_length > values_out_len)
+ {
+ if(vort_values_out) free(vort_values_out);
+ vort_values_out = (double*)malloc(sizeof(double)*out_length);
+ values_out_len = out_length;
+
+ if(!vort_values_out)
+ {
+ fprintf(stdout,"INTUVS2: Cannot allocate vort_values_out %ld\n",out_length);
+ err = -1;
+ goto cleanup;
+ }
+ if(div_values_out) free(div_values_out);
+ div_values_out = (double*)malloc(sizeof(double)*out_length);
+
+ if(!div_values_out)
+ {
+ fprintf(stdout,"INTUVS2: Cannot allocate div_values_out %ld\n",out_length);
+ err = -1;
+ goto cleanup;
+ }
+ }
+
+ fortint_inlen = inlen;
+ fortint_outlen = outlen;
+
+#ifdef REAL_8
+ if(err = int2_intuvy(vort_values_in, div_values_in, fortint_inlen, vort_values_out, div_values_out, &fortint_outlen))
+ {
+ fprintf(stderr,"INTUVS failed %d\n",err);
+ goto cleanup;
+ }
+#else
+ if(inlen > values_in_len1)
+ {
+ if(vort_values_in1) free(vort_values_in1);
+ vort_values_in1 = (float*)malloc(sizeof(float)*inlen);
+ values_in_len1 = inlen;
+
+ if(!vort_values_in1)
+ {
+ err = -1;
+ fprintf(stdout,"INTUVS2: Cannot allocate vort_values_in %ld\n",inlen);
+ goto cleanup;
+ }
+
+ if(div_values_in1) free(div_values_in1);
+ div_values_in1 = (float*)malloc(sizeof(float)*inlen);
+ if(!div_values_in1)
+ {
+ err = -1;
+ fprintf(stderr,"INTUVS2: Cannot allocate input array for divergency %d\n",inlen);
+ goto cleanup;
+ }
+ }
+ if(out_length > values_out_len1)
+ {
+ if(vort_values_out1) free(vort_values_out1);
+ vort_values_out1 = (float*)malloc(sizeof(float)*out_length);
+ values_out_len1 = out_length;
+
+ if(!vort_values_out1)
+ {
+ fprintf(stdout,"INTUVS2: Cannot allocate vort_values_out %ld\n",out_length);
+ err = -1;
+ goto cleanup;
+ }
+ if(div_values_out1) free(div_values_out1);
+ div_values_out1 = (float*)malloc(sizeof(float)*out_length);
+
+ if(!div_values_out1)
+ {
+ fprintf(stdout,"INTUVS2: Cannot allocate div_values_out %ld\n",out_length);
+ err = -1;
+ goto cleanup;
+ }
+ }
+ for( ii = 0 ; ii < fortint_inlen; ii++){
+ vort_values_in1[ii] = vort_values_in[ii];
+ }
+ for( ii = 0 ; ii < fortint_inlen; ii++){
+ div_values_in1[ii] = div_values_in[ii];
+ }
+ if(err = int2_intuvu(vort_values_in1, div_values_in1, fortint_inlen, vort_values_out1, div_values_out1, &fortint_outlen))
+ {
+ fprintf(stderr,"INTUVS2 failed %d\n",err);
+ goto cleanup;
+ }
+ for( ii = 0 ; ii < fortint_outlen; ii++){
+ vort_values_in[ii] = vort_values_in1[ii];
+ }
+ for( ii = 0 ; ii < fortint_outlen; ii++){
+ div_values_in[ii] = div_values_in1[ii];
+ }
+
+#endif
+
+ *length_out = fortint_outlen;
+ outlen = fortint_outlen;
+
+ if(intf2_debug)
+ {
+ int i;
+ printf("INTUVS2: outlen: %d \n",outlen);
+ for(i=0; i<10 ; i++)
+ {
+ printf("INTUVS2: output data values U - %d - %f \n",i,vort_values_out[i]);
+ printf("INTUVS2: output data values V - %d - %f \n",i,div_values_out[i]);
+ }
+ }
+
+ if(outlen)
+ {
+ int trunc = 0;
+
+ /* U velocity*/
+ if(err =grib_set_string(handle1,"packingType",packing_type,&size_pack))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set packing %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ if(!outputRepresentation)
+ {
+ trunc = int2_gettru();
+ if(trunc > inputTrunc){
+ printf("INTUVS2: Automatic resolution too high: %d \n Resolution reset to input resolution: %d\n",trunc,inputTrunc);
+ trunc = inputTrunc;
+ }
+ else
+ if(intf2_debug)
+ printf("INTUVS2: trunc - %d \n",trunc);
+
+ /* Set Truncation */
+ if(err =grib_set_long(handle1,"pentagonalResolutionParameterJ",trunc))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set pentagonalResolutionParameterJ %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ if(err =grib_set_long(handle1,"pentagonalResolutionParameterK",trunc))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set pentagonalResolutionParameterK %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ if(err =grib_set_long(handle1,"pentagonalResolutionParameterM",trunc))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set pentagonalResolutionParameterM %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ }
+ if(complex_switch){
+ if(err =grib_set_long(handle1,"JS",20))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set pentagonalResolutionParameterJ %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ if(err =grib_set_long(handle1,"KS",20))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set pentagonalResolutionParameterK %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ if(err =grib_set_long(handle1,"MS",20))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set pentagonalResolutionParameterM %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ }
+
+ if(err = grib_set_long(handle1,"paramId",131))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set U parameter %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ if(err =grib_set_long(handle1,"computeLaplacianOperator",1))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set computeLaplacianOperator %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ if(err =grib_set_long(handle1,"truncateLaplacian",1))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set computeLaplacianOperator %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+
+ if(edition == 1){
+ if(err =grib_set_long(handle1,"representationMode",2))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set representationMode %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ }
+
+ if(err = grib_set_double_array(handle1,"values",vort_values_out,outlen))
+ {
+ fprintf(stderr,"INTUVS2: Error seting the double array vorticity : %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ grib_get_message(handle1,&temp1,&outlen);
+ if(temp1) {
+ if(intf2_debug) {
+ printf("INTUVS2: outlen vorticity -> %d \n", outlen);
+ }
+ memcpy(vort_grib_out,temp1,outlen);
+ }
+ else
+ fprintf(stderr,"INTUVS2: Error memcpy divergency \n");
+ *length_out = outlen;
+
+
+ /* V velocity*/
+ if(err =grib_set_string(handle2,"packingType",packing_type,&size_pack))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set packing %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ if(!outputRepresentation)
+ {
+ if(err =grib_set_long(handle2,"pentagonalResolutionParameterJ",trunc))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set pentagonalResolutionParameterJ %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ if(err =grib_set_long(handle2,"pentagonalResolutionParameterK",trunc))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set pentagonalResolutionParameterK %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ if(err =grib_set_long(handle2,"pentagonalResolutionParameterM",trunc))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set pentagonalResolutionParameterM %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ }
+ if(complex_switch){
+ if(err =grib_set_long(handle2,"JS",20))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set pentagonalResolutionParameterJ %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ if(err =grib_set_long(handle2,"KS",20))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set pentagonalResolutionParameterK %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ if(err =grib_set_long(handle2,"MS",20))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set pentagonalResolutionParameterM %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ }
+
+ if(err = grib_set_long(handle2,"paramId",132))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set V %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ if(err =grib_set_long(handle2,"computeLaplacianOperator",1))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set computeLaplacianOperator %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ if(err =grib_set_long(handle2,"truncateLaplacian",1))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set computeLaplacianOperator %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ if(edition == 1){
+ if(err =grib_set_long(handle2,"representationMode",2))
+ {
+ fprintf(stderr,"INTUVS2: Cannot Set representationMode %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+ }
+
+ outlen = fortint_outlen;
+ if(err = grib_set_double_array(handle2,"values",div_values_out,outlen))
+ {
+ fprintf(stderr,"INTUVS2: Error seting the double array divergency : %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+
+ grib_get_message(handle2,&temp2,&outlen);
+ if(temp2) {
+ if(intf2_debug) {
+ printf("INTUVS2: outlen divergency -> %d \n", outlen);
+ }
+ memcpy(div_grib_out,temp2,*length_out);
+ }
+ else
+ fprintf(stderr,"INTUVS2: Error memcpy divergency \n");
+ *length_out = outlen;
+
+ goto cleanup;
+
+ }
+ else {
+ fprintf(stderr,"INTUVS2: ERROR - INTUVS2 OUTLEN is: %d\n", outlen);
+ err = 1;
+ }
+
+cleanup:
+
+ if(resetOutput = int2_setrep(outputRepresentation)) printf("INTUVS2: Output Representation reset failed: %d \n",resetOutput);
+ if(handle1) grib_handle_delete(handle1);
+ if(handle2) grib_handle_delete(handle2);
+
+ return err;
+}
+
+fortint intuvs2(char* vort_grib_in, char* div_grib_in, fortint* length_in, char* vort_grib_out, char* div_grib_out, fortint* length_out)
+{
+ return intuvs2_(vort_grib_in,div_grib_in,length_in,vort_grib_out,div_grib_out,length_out);
+}
diff --git a/grib_api_merging/intvect2.c b/grib_api_merging/intvect2.c
new file mode 100755
index 0000000..fce7be4
--- /dev/null
+++ b/grib_api_merging/intvect2.c
@@ -0,0 +1,415 @@
+/**
+* Copyright 1981-2012 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.h"
+#include "emos.h"
+
+fortint intvect2_(char* u_grib_in, char* v_grib_in, fortint* length_in, char* u_grib_out, char* v_grib_out, fortint* length_out)
+{
+
+ static double *u_values_in = NULL;
+ static double *v_values_in = NULL;
+ static double *u_values_out = NULL;
+ static double *v_values_out = NULL;
+ static size_t values_in_len = 0;
+ static size_t values_out_len = 0;
+
+ fortint out_length = 0;
+
+ static float *u_values_in1 = NULL;
+ static float *v_values_in1 = NULL;
+ static float *u_values_out1 = NULL;
+ static float *v_values_out1 = NULL;
+ static size_t values_in_len1 = 0;
+ static size_t values_out_len1 = 0;
+
+ grib_handle* hu = NULL;
+ grib_handle* hv = NULL;
+
+ long long_inlen = *length_in;
+ long ii = 0;
+
+
+ size_t inlen;
+ size_t outlen = *length_out;
+ size_t outlen1 = *length_out;
+
+ fortint fortint_inlen = *length_in;
+ fortint fortint_outlen = outlen;
+
+ grib_handle *handle1 = NULL, *handle2 = NULL;
+ grib_handle *outh_u = NULL, *outh_v = NULL;
+ int err = 0;
+ int grib_err = 0;
+
+ long accuracy = 0;
+
+ fortint intv[4];
+ fortfloat realv[4];
+ char *text = "";
+
+ const void* temp1;
+ const void* temp2;
+
+ char *intf2_debug;
+ char *intf2_write ;
+
+ fortint outputRepresentation;
+ int gribex_compatibility;
+ grib_util_grid_spec spec={0,};
+ grib_util_packing_spec packing_spec={0,};
+
+ gribex_compatibility=grib_get_gribex_mode(0);
+
+ intf2_debug = getenv("INTF2_DEBUG");
+ intf2_write = getenv("INTF2_WRITE_TO_FILE");
+
+ outputRepresentation = int2_outrep();
+
+ if(outputRepresentation)
+ if(intf2_debug) {
+ printf("INTVECT2: Output Representation is Not set by user\n");
+ }
+
+
+ handle1 = grib_handle_new_from_message_copy(0,u_grib_in,long_inlen);
+ if(!handle1) {
+ err = -1;
+ goto cleanup;
+ }
+
+ handle2 = grib_handle_new_from_message_copy(0,v_grib_in,long_inlen);
+ if(!handle2) {
+ err = -1;
+ goto cleanup;
+ }
+ /* -------------------------------------------- */
+
+ if( err = grib_get_size(handle1,"values",&inlen))
+ {
+ fprintf(stderr,"INTVECT2: Cannot get size for U %s\n",grib_get_error_message(err));
+ return err;
+ }
+ if(intf2_debug) { printf("INTVECT2: inlen for U: %d \n",inlen); }
+
+
+ if( err = grib_get_size(handle2,"values",&inlen))
+ {
+ fprintf(stderr,"INTVECT2: Cannot get size for V %s\n",grib_get_error_message(err));
+ return err;
+ }
+
+ if(intf2_debug) { printf("INTVECT2: inlen for V: %d \n",inlen); }
+
+ if(inlen > values_in_len)
+ {
+ if(u_values_in) free(u_values_in);
+ u_values_in = (double*)malloc(sizeof(double)*inlen);
+ values_in_len = inlen;
+ if(!u_values_in)
+ {
+ err = -1;
+ fprintf(stderr,"INTVECT2: Cannot allocate input array for U %d\n",inlen);
+ goto cleanup;
+ }
+ if(v_values_in) free(v_values_in);
+ v_values_in = (double*)malloc(sizeof(double)*inlen);
+ if(!v_values_in)
+ {
+ err = -1;
+ fprintf(stderr,"INTVECT2: Cannot allocate input array for V %d\n",inlen);
+ goto cleanup;
+ }
+ }
+ /* -------------------------------------------- */
+
+
+ /* Default Accuracy */
+/*
+ if((err = grib_get_long(handle1,"bitsPerValue",&accuracy))!= GRIB_SUCCESS)
+ {
+ fprintf(stderr,"INTVECT2: Cannot get accuracy %s\n",grib_get_error_message(err));
+ return err;
+ }
+ intv[0] = accuracy;
+ if(err = int2_intin("accuracy",intv,realv,text))
+ {
+ fprintf(stderr,"INTVECT2: Accuracy setup INTIN failed %d\n",err);
+ }
+ if(intf2_debug)
+ {
+ printf("INTVECT2: Input Accuracy %d \n",accuracy);
+ }
+
+*/
+ /* -------------------------------------------- */
+ /* Get decoded U values */
+ if(err = grib_get_double_array(handle1,"values",u_values_in,&inlen))
+ {
+ fprintf(stderr,"INTVECT2: Cannot get decoded values %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+
+ if(err = describe_input_field(handle1,outputRepresentation))
+ {
+ fprintf(stderr,"INTVECT2: describe_input_field failed : %d\n",err);
+ goto cleanup;
+ }
+
+ /* Get decoded V values */
+ if(err = grib_get_double_array(handle2,"values",v_values_in,&inlen))
+ {
+ fprintf(stderr,"INTVECT2: Cannot get decoded values %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+
+ if(err = describe_input_field(handle2,outputRepresentation))
+ {
+ fprintf(stderr,"INTVECT2 describe_input_field failed : %d\n",err);
+ goto cleanup;
+ }
+
+
+ /*============= INTVECY ====================================*/
+ if(outputRepresentation){
+ out_length = inlen;
+ }
+ else{
+ out_length = int2_estima();
+ if(!out_length){
+ fprintf(stdout,"INTVECT2: Estimate for length of output array is 0 \n");
+ err = -1;
+ goto cleanup;
+ }
+ }
+
+ if(out_length > values_out_len)
+ {
+
+ if(intf2_debug)
+ {
+ printf("INTVECT2:----------------- length for malloc %d\n",out_length);
+ }
+ if(u_values_out) free(u_values_out);
+ u_values_out = (double*)malloc(sizeof(double)*out_length);
+ values_out_len = out_length;
+
+ if(!u_values_out)
+ {
+ fprintf(stderr,"INTVECT2: Cannot allocate u_values_out %d\n",out_length);
+ err = -1;
+ goto cleanup;
+ }
+
+ if(v_values_out) free(v_values_out);
+ v_values_out = (double*)malloc(sizeof(double)*out_length);
+
+ if(!v_values_out)
+ {
+ fprintf(stderr,"INTVECT2: Cannot allocate v_values_out %d\n",out_length);
+ err = -1;
+ goto cleanup;
+ }
+ }
+
+ fortint_inlen = inlen;
+ fortint_outlen = outlen;
+#ifdef REAL_8
+ if(err = int2_intvecy(u_values_in,v_values_in,fortint_inlen,u_values_out,v_values_out,&fortint_outlen))
+ {
+ fprintf(stderr,"INTVECT2 failed %d\n",err);
+ goto cleanup;
+ }
+#else
+ if(inlen > values_in_len1)
+ {
+ if(u_values_in1) free(u_values_in1);
+ u_values_in1 = (float*)malloc(sizeof(float)*inlen);
+ values_in_len1 = inlen;
+
+ if(!u_values_in1)
+ {
+ err = -1;
+ fprintf(stdout,"INTVECT2: Cannot allocate u_values_in1 %ld\n",inlen);
+ goto cleanup;
+ }
+
+ if(v_values_in1) free(v_values_in1);
+ v_values_in1 = (float*)malloc(sizeof(float)*inlen);
+ if(!v_values_in1)
+ {
+ err = -1;
+ fprintf(stderr,"INTVECT2: Cannot allocate input array for v_values_in1 %d\n",inlen);
+ goto cleanup;
+ }
+ }
+ if(out_length > values_out_len1)
+ {
+ if(u_values_out1) free(u_values_out1);
+ u_values_out1 = (float*)malloc(sizeof(float)*out_length);
+ values_out_len1 = out_length;
+
+ if(!u_values_out1)
+ {
+ fprintf(stdout,"INTVECT2: Cannot allocate u_values_out1 %ld\n",out_length);
+ err = -1;
+ goto cleanup;
+ }
+ if(v_values_out1) free(v_values_out1);
+ v_values_out1 = (float*)malloc(sizeof(float)*out_length);
+
+ if(!v_values_out1)
+ {
+ fprintf(stdout,"INTVECT2: Cannot allocate v_values_out1 %ld\n",out_length);
+ err = -1;
+ goto cleanup;
+ }
+ }
+
+ for( ii = 0 ; ii < fortint_inlen; ii++){
+ u_values_in1[ii] = u_values_in[ii];
+ }
+ for( ii = 0 ; ii < fortint_inlen; ii++){
+ v_values_in1[ii] = v_values_in[ii];
+ }
+
+ if(err = int2_intvecy(u_values_in1,v_values_in1,fortint_inlen,u_values_out1,v_values_out1,&fortint_outlen))
+ {
+ fprintf(stderr,"INTVECT2 failed %d\n",err);
+ goto cleanup;
+ }
+ for( ii = 0 ; ii < fortint_outlen; ii++){
+ u_values_out[ii] = u_values_out1[ii];
+ }
+ for( ii = 0 ; ii < fortint_outlen; ii++){
+ v_values_out[ii] = v_values_out1[ii];
+ }
+#endif
+ *length_out = fortint_outlen;
+ outlen = fortint_outlen;
+
+ if(intf2_debug)
+ {
+ printf("INTVECT2: outlen: %d \n",outlen);
+ }
+
+ if(outlen)
+ {
+
+ if(intf2_debug) {
+ int i;
+ for(i = 0; i < 10 ; i++){
+ printf("INTVECT2: output data values - %d - %f \n",i,u_values_out[i]);
+ printf("INTVECT2: output data values - %d - %f \n",i,v_values_out[i]);
+ }
+ }
+ err=copy_spec_from_ksec(&spec,&packing_spec);
+ if (err) {
+ fprintf(stdout,"INTVECT2: ERROR - copy_grid_spec_from_ksec unable to copy spec: %d\n", err);
+ goto cleanup;
+ }
+
+ packing_spec.accuracy=GRIB_UTIL_ACCURACY_USE_PROVIDED_BITS_PER_VALUES;
+ packing_spec.packing=GRIB_UTIL_PACKING_USE_PROVIDED;
+/*
+ if(err = set_grid_data_description(handle1,&jpeg,edition))
+ {
+ fprintf(stderr,"INTVECT2 set_grid_data_description failed : %d\n",err);
+ goto cleanup;
+ }
+ if(err = grib_set_long(handle1,"uvRelativeToGrid",1))
+ {
+ fprintf(stderr,"INTVECT2: Cannot Set uvRelativeToGrid %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+
+ if(err = set_grid_data_description(handle2,&jpeg,edition))
+ {
+ fprintf(stderr,"INTVECT2 set_grid_data_description failed : %d\n",err);
+ goto cleanup;
+ }
+ if(err = grib_set_long(handle2,"uvRelativeToGrid",1))
+ {
+ fprintf(stderr,"INTVECT2: Cannot Set uvRelativeToGrid %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+*/
+ hu = grib_util_set_spec(handle1,&spec, &packing_spec, 0, u_values_out, outlen, &err);
+ if(!hu) {
+ fprintf(stdout,"INTVECT2: ERROR - grib_util_set_spec: %d\n", err);
+ if(!err) err = 1;
+ goto cleanup;
+ }
+ if(err = grib_set_long(hu,"uvRelativeToGrid",1))
+ {
+ fprintf(stderr,"INTVECT2: Cannot Set uvRelativeToGrid %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+
+ hv = grib_util_set_spec(handle2,&spec, &packing_spec, 0, v_values_out, outlen, &err);
+ if(!hv) {
+ fprintf(stdout,"INTVECT2: ERROR - grib_util_set_spec: %d\n", err);
+ if(!err) err = 1;
+ goto cleanup;
+ }
+ if(err = grib_set_long(hv,"uvRelativeToGrid",1))
+ {
+ fprintf(stderr,"INTVECT2: Cannot Set uvRelativeToGrid %s\n",grib_get_error_message(err));
+ goto cleanup;
+ }
+
+ grib_get_message(hu,&temp1,&outlen);
+ if(temp1) {
+ if(intf2_debug) {
+ printf("INTVECT2: outlen u-comp -> %d \n", outlen);
+ }
+ memcpy(u_grib_out,temp1,outlen);
+ }
+ else
+ fprintf(stderr,"INTUVP2: Error u-comp \n");
+ outlen = *length_out;
+
+ grib_get_message(hv,&temp2,&outlen);
+ if(temp2) {
+ if(intf2_debug) {
+ printf("INTUVP2: outlen v-comp -> %d \n", outlen);
+ }
+ memcpy(v_grib_out,temp2,outlen);
+ }
+ else
+ fprintf(stderr,"INTUVP2: Error v-comp \n");
+ *length_out = outlen;
+
+ goto cleanup;
+
+
+
+ }
+ else {
+ fprintf(stderr,"INTVECT2: ERROR - INTVECT2 OUTLEN is: %d\n", outlen);
+ err = 1;
+ }
+
+cleanup:
+
+ if(hu && (hu != handle1)) grib_handle_delete(hu);
+ if(hv && (hv != handle2)) grib_handle_delete(hv);
+ if(handle1) grib_handle_delete(handle1);
+ if(handle2) grib_handle_delete(handle2);
+
+ return err;
+}
+
+fortint intvect2(char* u_grib_in, char* v_grib_in, fortint* length_in, char* u_grib_out, char* v_grib_out, fortint* length_out )
+{
+ return intvect2_(u_grib_in,v_grib_in,length_in,u_grib_out,v_grib_out,length_out);
+}
diff --git a/grib_api_merging/sources b/grib_api_merging/sources
new file mode 100755
index 0000000..a75864e
--- /dev/null
+++ b/grib_api_merging/sources
@@ -0,0 +1,12 @@
+#
+# Sources for libemos/pbio for linux
+#
+
+SOURCES.c = \
+ copy_spec_from_ksec.c \
+ emos.c \
+ intuvp2.c \
+ intvect2.c \
+ describe_input_field.c \
+ intf2.c \
+ intuvs2.c
diff --git a/gribex/0-INDEX-0 b/gribex/0-INDEX-0
new file mode 100755
index 0000000..67762de
--- /dev/null
+++ b/gribex/0-INDEX-0
@@ -0,0 +1,265 @@
+0-INDEX-0 mac This index file
+Makefile mac libemos Makefile for this directory
+README mac Description of this directory
+ECMWFdefinitions.c mac Handle ECMWF local definitions in C
+ECMWFdefinitions.h mac Headers for ECMWFdefinitions.c
+abortx.F mah Terminates execution of program.
+analsw.F mah Gets name/content of variables in mars model record.
+blckcr.F mah Converts an unblocked dataset into a blocked dataset.
+bt_cray.F mac Bit handling routines special to CRAY
+bt_cyber.F mac Bit handling routines special to CYBER
+bt_ibm.F mac Bit handling routines special to IBM
+bt_ibm_bal.bal mac Bit handling routines special to IBM(BAL additions)
+bt_sun.F mac Bit handling routines special to SUN
+bt_sun_c.c mac Bit handling routines special to SUN(C additions)
+bt_vax.F mac Bit handling routines special to VAX
+bt_vax_mar.mar mac Bit handling routines special to VAX(MACRO additions)
+bufrin.F mac Mimics original BUFRIN, calls PBBUFR to get BUFR prods.
+c2bitw.F mac Computes bit width of a positive integer value.
+c2cwid.F mac Try/perform constant width encoding. 2nd-order packing.
+c2dosd.F mac Diagnose/apply order of spatial differencing.
+c2gene.F mac Try/perform general encoding of 2nd-order packing.
+c2ordr.F mac 2nd-order packing management routine for encoding.
+c2pack.F mac Bit string encoding for 2nd-order packing.
+c2pkvw.F mac 2nd-order values packing for variable width 2op methods.
+c2rnge.F mac Range diagnostic for spatial differencing.
+c2rows.F mac Try/perform row by row encoding (2nd-order packing).
+calcop.F mac Calculate P scale factor for complex packing.
+ccf1cr.F mah Create requested nodes in CFS for MARS archiving.
+cheknum.F mah Checks that string correctly represents a number.
+chktab2.F mac Checks whether parameter appears in ECMWF local table 2.
+cgsloop.c mac C routines to complete vectorisation on Fujitsu.
+cmpck.F mac Reorder subset of coeffs before packing
+codegb.F mah Code array of floating point values in WMO GRIB code.
+codegc.F mah Code array of floating point values in WMO GRIB code.
+codegr.F mah Code array of floats in GRIB - with ECMWF extensions.
+codeps.F mah Packs data into machine-independent pseudo-GRIB format
+comars.h mah MARS common areas containing job environment info.
+comcomm.h mah Definition of network communications block to MARS/IBM.
+comgrb.h mah Common area for values used in GRIB encoding/decoding.
+config.gribex.CRAY mac Configuration file for make of libemos on CRAY
+config.gribex.sgimips mac Configuration file for make of libemos on SGI
+config.gribex.sun4 mac Configuration file for make of libemos on SUN
+confp.F mah Convert float from machine format to GRIB format.
+confpa.F mac Version of confp used by codeps.
+confp2.F mah Convert float from machine format to GRIB format.
+confp3.F mah Convert float from machine format to GRIB format.
+csect4.F mac Code section 4 GRIB for complex packing.
+csgnbt.c mac Code GRIB signed value. (C version)
+csgnbt.F mac Code GRIB signed value.
+d2ordr.F mac 2nd-order packing management routine for decoding.
+d2rosd.F mac Rebuild field values from spatial differencing.
+decext.F mah Extract values from GRIB coded data.
+decfp.F mah Decode GRIB code format to floating point number.
+decfp2.F mah Convert GRIB format float to machine format.
+decogb.F mah Interface between oldnew DECOGB/GRIBEX GRIB decoding
+decogc.F mah Decode WMO GRIB coded data.
+decogd.F mah Decode WMO GRIB coded data.
+decogr.F mah Decode WMO GRIB coded data.
+decops.F mah Decode pseudo-GRIB coded data.
+decops2.F mah Decode pseudo-GRIB coded data with year as 4-digit YYYY.
+delsp.F mah Delete spaces around valid MARS directive separators.
+dggsec2.F mac Decode GRIB section 2 for gaussian grids.
+dlasec2.F mac Decode GRIB section 2 for lambert conformal grids.
+dllsec2.F mac Decode GRIB section 2 for lat/lon grids.
+dmesec2.F mac Decode GRIB section 2 for Mercator grids.
+docsec2.F mac Decode GRIB section 2 for ECMWF ocean grids.
+dpssec2.F mac Decode GRIB section 2 for polar stereographic grids.
+dshsec2.F mac Decode GRIB section 2 for spherical harmonic fields.
+dsvsec2.F mac Decode GRIB section 2 for space view fields.
+dsect4.F mac Decode section 4 GRIB for complex packing.
+dsect4a.F mac As dsect4 but with modified number of arguments.
+dsgnbt.c mac Decode GRIB signed value. (C version)
+dsgnbt.F mac Decode GRIB signed value.
+dswmrs.F mah Routine to decode a MARS model switch.
+ecdef1.F mac Handle ECMWF section 1 local definition 1.
+ecdef1.h mac Header for ECMWF section 1 local definition 1.
+ecdef2.F mac Handle ECMWF section 1 local definition 2.
+ecdef2.h mac Header for ECMWF section 1 local definition 2.
+ecdef3.F mac Handle ECMWF section 1 local definition 3.
+ecdef3.h mac Header for ECMWF section 1 local definition 3.
+ecdef4.F mac Handle ECMWF section 1 local definition 4.
+ecdef4.h mac Header for ECMWF section 1 local definition 4.
+ecdef5.F mac Handle ECMWF section 1 local definition 5.
+ecdef5.h mac Header for ECMWF section 1 local definition 5.
+ecdef6.F mac Handle ECMWF section 1 local definition 6.
+ecdef6.h mac Header for ECMWF section 1 local definition 6.
+ecdef7.F mac Handle ECMWF section 1 local definition 7.
+ecdef7.h mac Header for ECMWF section 1 local definition 7.
+ecdef8.F mac Handle ECMWF section 1 local definition 8.
+ecdef8.h mac Header for ECMWF section 1 local definition 8.
+ecdef9.F mac Handle ECMWF section 1 local definition 9.
+ecdef9.h mac Header for ECMWF section 1 local definition 9.
+ecdef10.F mac Handle ECMWF section 1 local definition 10.
+ecdef10.h mac Header for ECMWF section 1 local definition 10.
+ecdef11.F mac Handle ECMWF section 1 local definition 11.
+ecdef11.h mac Header for ECMWF section 1 local definition 11.
+ecdef12.F mac Handle ECMWF section 1 local definition 12.
+ecdef12.h mac Header for ECMWF section 1 local definition 12.
+ecdef13.F mac Handle ECMWF section 1 local definition 13.
+ecdef13.h mac Header for ECMWF section 1 local definition 13.
+ecdef14.h mac Header for ECMWF section 1 local definition 14.
+ecdef14.F mac Handle ECMWF section 1 local definition 14.
+ecdef15.h mac Header for ECMWF section 1 local definition 15.
+ecdef15.F mac Handle ECMWF section 1 local definition 15.
+ecdef16.h mac Header for ECMWF section 1 local definition 16.
+ecdef16.F mac Handle ECMWF section 1 local definition 16.
+ecdef17.h mac Header for ECMWF section 1 local definition 17.
+ecdef17.F mac Handle ECMWF section 1 local definition 17.
+ecdef18.h mac Header for ECMWF section 1 local definition 18.
+ecdef18.F mac Handle ECMWF section 1 local definition 18.
+ecdef19.h mac Header for ECMWF section 1 local definition 19.
+ecdef19.F mac Handle ECMWF section 1 local definition 19.
+ecdef20.h mac Header for ECMWF section 1 local definition 20.
+ecdef21.h mac Header for ECMWF section 1 local definition 21.
+ecdef50.h mac Header for ECMWF section 1 local definition 50.
+ecdef50.F mac Handle ECMWF section 1 local definition 50.
+ecdf191.h mac Header for ECMWF section 1 local definition 191.
+ecdf191.F mac Handle ECMWF section 1 local definition 191.
+ecloc1.F mah GRIB coding/decoding of ECMWF local use of Section 1.
+eggsec2.F mac Encode GRIB section 2 for gaussian grids.
+elasec2.F mac Encode GRIB section 2 for lambert conformal grids.
+ellsec2.F mac Encode GRIB section 2 for lat/lon grids.
+emesec2.F mac Encode GRIB section 2 for Mercator grids.
+emoslibVersion.c mac Creates a global variable which is visible using 'nm'.
+emoscyc.F mac Returns CYCLE for EMOS, INT, BUFR, GRIB and PBIO
+emosnum.F mac Returns current EMOSLIB version number.
+eocsec2.F mac Encode GRIB section 2 for ECMWF ocean grids.
+eocsec2.h mac Header describing GRIB section 2 for ECMWF ocean grids.
+epssec2.F mac Encode GRIB section 2 for polar stereographic grids.
+eshsec2.F mac Encode GRIB section 2 for spherical harmonic fields.
+esvsec2.F mac Encode GRIB section 2 for space view fields.
+exscal.F mah Vectorise calculation of values.
+extmap.F mah Extraction of bit maps for routine GRIBEX.
+findLocalDefinitionFile.c mac Find templates for local definitions
+fortranInterface.c mac Routines ELDEFS,DLDEFS,LDEFPRT,ISEC1L,LDEFNUM
+ftn1cr.F mah Gives FORTRAN unit number not currently in use.
+gbitmap.F mac Reads a bitmap from a file.
+gbyte.F mah Extract a single bit field. Cray routine.
+gbytes.F mah Extract a number of bit fields. Cray routine.
+gdecode.c mac C version of GRIB decoding
+gdecode.h mac Header for C version of GRIB decoding
+gdecode1.c mac C version of GRIB decoding local definition 1
+gdecode2.c mac C version of GRIB decoding local definition 2
+gdecodeStruct.h mac Structures for C version of GRIB decoding
+genbin.F mah Produces binary version of input decimal number
+gendir.F mah Generate directive lines for MARS.
+getchd.F mah Get characters from unpacked GRIB/pseudo-GRIB from MARS
+getfb2.F mah Extract real values from section 2 of GRIB code.
+getfpd.F mah Extract data from unpacked GRIB record.
+getib1.F mah Get values from section 1 of GRIB code.
+getib2.F mah Extract integer values from section 2 of GRIB record.
+getib3.F mah Get block 3 values from GRIB/pseudo-GRIB from MARS.
+getind.F mah Get integer data from unpacked GRIB/pseudo-GRIB data.
+getlgd.F mah Get logical data from record of GRIB/pseudo-GRIB data.
+getsys.F mah Get system info.(?)
+getusr.F mah Get user info.(?)
+getsetValues.[hc] mac User API for encoding/decoding GRIB
+grbcom.h mac Common holding various default or user supplied values.
+grchk1.F mah Check Section 1 GRIB params against GRIB Edition 1
+grchk2.F mah Check Section 2 GRIB params against GRIB Edition 1.
+grchk3.F mah Check Section 3 GRIB params against GRIB Edition 1.
+grchk4.F mah Check Section 4 GRIB params against GRIB Edition 1.
+grib_int_t.h mac Headers for handling local definitions using templates.
+gribex.h mac Header comments for gribex.F
+gribex.F mah Coding and decoding of GRIB format data.
+gribin.F mac Mimics original GRIBIN, calls PBGRIB to get GRIB prods.
+gribnum.F mac Returns GRIB_CYCLE number
+groutpt.F mac Set output stream if defined by environment variable.
+grprs.h mac Common blocks holding values for printing.
+grpr190.c mac Displays internal local defb ytes in definition 190
+grprs0.F mah Print information from Section 0 of GRIB code.
+grprs1.F mah Print information from Section 1 of GRIB code.
+grprs1b.F mac Simplified version of grprs1.F used by grpr190.c
+grprs2.F mah Print information from Section 2 of GRIB code.
+grprs3.F mah Print information from Section 3 of GRIB code.
+grprs4.F mah Print information from Section 4 of GRIB code.
+grprs4w.F mac Print the wave coordinate information in section 4.
+grsdef.F mah Default handling of GRIBEX global settings.
+grsdbg.F mah Debug print switch setting for routine GRIBEX.
+grsmax.F mah Set user defined maximum value for routine GRIBEX.
+grsmok.F mah Set/unset exhaustive switch for option 'K' of GRIBEX.
+grsmkp.F mah Set/unset flag which forces GRIBEX to calculate P factor
+grsn2o.F mah Set/unset use of non-local 2nd-order methods for GRIBEX.
+grsref.F mah Set user defined reference value for routine GRIBEX.
+grsrnd.F mah Set GRIB code rounding/no rounding for routine GRIBEX.
+grsubc.F mah Set/unset use of sub-centre for ECMWF fields encoding.
+grsvck.F mah Set GRIB code parameter value check for routine GRIBEX.
+grsx2o.F mah Set/unset use of extended 2nd-order methods for GRIBEX.
+gsbite.F mah Vectorising extract/insert of bits from/to bitstream.
+gscale.F mac Apply/remove field scaling factor for complex packing.
+handleLocalDefinitions.c mac Encode/decode local definitions from templates
+handleLocalDefinitions.h mac Encode/decode local definitions from templates
+inscal.F mah Vectorise calculation of increments.
+insmp1.F mah Insertion of primary bit map for routine GRIBEX.
+insmp2.F mah Insertion of secondary bit maps for routine GRIBEX.
+inxbit.F mah Insert/extract bits consecutively in/from a given array
+inxmap.F mah Bit map handling for routine GRIBEX.
+jabort.c mac Abort routine for HP.
+kwchk1.F mac Check sect 1 of Washington ensemble products.
+kwloc1.F mac Decode sect 1 of Washington ensemble products.
+kwprs1.F mac print sect 1 of Washington ensemble products.
+l2u1cr.F mah Convert character string to upper case.
+ldc1cr.F mah List nodes and files for a given research experiment.
+lnbfcr.F mah Calculate length of BUFR message on Cray.
+lngbcr.F mah Calculate or extract length of GRIB field on Cray.
+local2.F mac Looks up the description of a param in a local table 2
+local2k.F mac Looks up the description of a param in a local table 2
+local2c.c mac Looks up the description of a param in a local table 2
+make.dep mac Make dependencies file.
+maxmin.F mah Get maximum/minimum from array of floats.
+maxmn2.F mah Get max/min from array of floats, ignoring missing data
+maxmni.F mah Get maximum/minimum from array of integers.
+mksign.c mac Put sign in given position to create negative value
+modval.F mah Makes one value a multiple of another.
+mvbytes.c mac Pack/unpack bytes in ECMWF local definitions
+mxmncr.F mah Find the maximum and minimum elements of an array.
+offset.F mah Calculates word/bit offset of start of next bit-field
+orefdat.c mac Returns ECMWF local definition 4 reference date index.
+packcf.F mac Reformat(IBM) and store leading subset, complex packing.
+parval.F mah Extract next parameter and value pair.
+prtbin.F mah Binary to decimal conversion.
+prtbk1.F mah Print product definition block (block 1) of GRIB data.
+prtbk2.F mah Print product definition block (block 2) of GRIB data.
+prtbl1.F mah Print product definition block (block 1) of GRIB data.
+prtbl2.F mah Print GRID definition block (block 2) of GRIB data.
+ptquasi.F mac Print quasi-regular grids from GRIB products.
+qu2reg.F mah Convert quasi-regular grid data to regular
+qu2reg2.F mah Convert quasi-regular grid data to regular (version 2)
+qu2reg3.F mah Convert quasi-regular grid data to regular (version 3)
+reclen.F mah Calculates record length. Gives param, level, level type
+ref2grb mac Code and check reference value in IBM format
+remsp.F mah Remove leading spaces from character string.
+repchr.F mah Replace one character by another.
+revero.F mac Reverse order of even rank rows for 2nd-order packing.
+rorint.F mah Converts real arrays to integer and vice versa.
+rowina.F mah Interpolation of row of values.
+rowina2.F mah Interpolation of row of values. (version 2)
+rowina3.F mah Interpolation of row of values.(version 3 - J.Clochard))
+rtb.F mah Count characters in a string, excluding trailing spaces
+sbyte.F mah Insert a single bit field. Cray routine.
+sbytes.F mah Insert a number of bit fields. Cray routine.
+scm0.F mah Apply SCM0 limiter to derivative estimates.
+search.F mah Search for given character string.
+sencode.c mac C version of GRIB encoding
+sencode.h mac Header for C version of GRIB encoding
+sencode1.c mac C version of GRIB encoding local definition 1
+sencode2.c mac C version of GRIB encoding local definition 2
+setpar.F mac Set largest negative number and number of bits per word
+sfbits.h mah Statement functions to manipulate bits in 64-bit words
+sources.XXX mac Source files to be compiled for platform XXX.
+sort.F mah Sorts array in ascending field code-number & writes out
+sortf.F mah Sorts fields in a file in ascending order.
+swap4.c mac Swaps characters in experiment version (little-endian)
+tab2fil.F mah Builds file name for code table 2 checks/printouts.
+u2l1cr.F mah Convert string to all lower case.
+unbkin.F mah Standard read for COS unblocked or UNICOS binary files
+unbkout.F mah Standard write for COS files or UNICOS binary files.
+unblock.F mah Converts CRAY blocked dataset of GRIB to unblocked.
+uncmpck.F mac Reorder subset of coeffs after packing
+unpkcf.F mac Unformat(IBM) and move leading subset, complex packing.
+usesgn.c mac Use specified sign bit to make number positive/negative
+valpina.c mac Find real index of point in feild described by a bitmap.
+vod2uv.F mah Calculate U and V components from vorticity/divergence
+xgrdemo.F mac Sample program showing use of GRIBEX and PB routines.
+yyyy2cy.F mac Return WMO defined century and year from YYYY date.
diff --git a/gribex/ECMWFdefinitions.c b/gribex/ECMWFdefinitions.c
new file mode 100755
index 0000000..66d6f66
--- /dev/null
+++ b/gribex/ECMWFdefinitions.c
@@ -0,0 +1,3721 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <string.h>
+#include <memory.h>
+
+#include "ECMWFdefinitions.h"
+
+void encodeMarsPart(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes fixed part of ECMWF local definition 1 (from byte 41 onwards)
+// into gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition1.html
+*/
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ *p++ = ONEBYTE(n);n++; /* DEFINITION */
+ *p++ = ONEBYTE(n);n++; /* CLASS */
+ *p++ = ONEBYTE(n);n++; /* TYPE */
+
+ MOVE2BYTES(p,n); /* STREAM */
+ p+=2;
+ n++;
+#ifdef INTEGER_8
+ memcpy(p,((char *)n+4),4); /* EXPVER */
+#else
+ memcpy(p,(char *)n,4); /* EXPVER */
+#endif
+ p += 4;
+ n++;
+
+ return;
+}
+
+void decodeMarsPart(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes fixed part of ECMWF local definition 1 (from byte 41 onwards)
+// from gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition1.html
+*/
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ *n++ = ONEBYTEINT(p); p++; /* DEFINITION */
+ *n++ = ONEBYTEINT(p); p++; /* CLASS */
+ *n++ = ONEBYTEINT(p); p++; /* TYPE */
+ *n++ = TWOBYTEINT(p); p += 2; /* STREAM */
+#ifdef INTEGER_8
+ memcpy(((char *)n+4),p,4); /* EXPVER */
+#else
+ memcpy((char *)n,p,4); /* EXPVER */
+#endif
+ n++; p+= 4;
+
+ return;
+}
+
+
+fortint e_def_1_(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes ECMWF local definition 1 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition1.html
+//
+// Returns the number of bytes (octets) in local definition 1 after
+// byte 40.
+*/
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = ONEBYTE(n);n++; /* NUMBER */
+ *p++ = ONEBYTE(n);n++; /* TOTAL */
+ *p++ = (unsigned char) 0; /* UNUSED */
+
+/*
+// Definition 1 has a fixed length section 1 (52 bytes)
+*/
+ return (fortint) (52-40);
+}
+
+fortint e_def_1(fortint * inputArray, unsigned char * gribSection1) {
+ return e_def_1_(inputArray,gribSection1);
+}
+
+fortint d_def_1_(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes ECMWF local definition 1 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition1.html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = ONEBYTEINT(p);p++; /* NUMBER */
+ *n++ = ONEBYTEINT(p);p++; /* TOTAL */
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_1(fortint * outputArray, unsigned char * gribSection1) {
+ return d_def_1_(outputArray,gribSection1);
+}
+
+fortint e_def_2_(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes ECMWF local definition 2 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition2.html
+//
+// Returns the number of bytes (octets) in local definition 2 after
+// byte 40.
+*/
+int loop, N;
+fortint value;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = ONEBYTE(n);n++; /* NUMBER */
+ *p++ = ONEBYTE(n);n++; /* TOTAL */
+ *p++ = (unsigned char) 0; /* UNUSED */
+ *p++ = ONEBYTE(n);n++; /* METHOD */
+
+ MOVE2BYTES(p,n); /* STARTSTEP */
+ p += 2;
+ n++;
+ MOVE2BYTES(p,n); /* ENDSTEP */
+ p += 2;
+ n++;
+/*
+// When coding values, set sign bit to 1, if value is negative.
+*/
+ value = *n++; /* NORTH */
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(p,&value);
+ p += 3;
+
+ value = *n++; /* WEST */
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(p,&value);
+ p += 3;
+
+ value = *n++; /* SOUTH */
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(p,&value);
+ p += 3;
+
+ value = *n++; /* EAST */
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(p,&value);
+ p += 3;
+
+ *p++ = ONEBYTE(n);n++; /* FORECAST */
+ *p++ = ONEBYTE(n);n++; /* CONTROL */
+
+ N = *n; /* NUMBERINCLUSTER */
+ *p++ = ONEBYTE(n++);
+
+ for( loop = 0; loop < N; loop++) /* LIST */
+ *p++ = ONEBYTE(n++);
+/*
+// Definition 2 has a fixed length section 1 (328 bytes)
+*/
+ for( loop = N; loop < (328-72); loop++)
+ *p++ = (unsigned char) 0;
+
+ return (fortint) (328-40);
+}
+
+fortint e_def_2(fortint * inputArray, unsigned char * gribSection1) {
+ return e_def_2_(inputArray,gribSection1);
+}
+
+fortint d_def_2_(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes ECMWF local definition 2 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition2.html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+int loop, N;
+fortint value;
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = ONEBYTEINT(p);p++; /* NUMBER */
+ *n++ = ONEBYTEINT(p);p++; /* TOTAL */
+ p++; /* UNUSED */
+ *n++ = ONEBYTEINT(p);p++; /* METHOD */
+
+ *n++ = TWOBYTEINT(p); /* STARTSTEP */
+ p += 2;
+ *n++ = TWOBYTEINT(p); /* ENDSTEP */
+ p += 2;
+/*
+// When decoding values, if sign bit is 1, value is negative.
+*/
+ value = THREEBYTEINT(p); /* NORTH */
+ p += 3;
+ if( value & 0x800000 ) value = - (value & 0x7fffff);
+ *n++ = value;
+
+ value = THREEBYTEINT(p); /* WEST */
+ p += 3;
+ if( value & 0x800000 ) value = - (value & 0x7fffff);
+ *n++ = value;
+
+ value = THREEBYTEINT(p); /* SOUTH */
+ p += 3;
+ if( value & 0x800000 ) value = - (value & 0x7fffff);
+ *n++ = value;
+
+ value = THREEBYTEINT(p); /* EAST */
+ p += 3;
+ if( value & 0x800000 ) value = - (value & 0x7fffff);
+ *n++ = value;
+
+ *n++ = ONEBYTEINT(p);p++; /* FORECAST */
+ *n++ = ONEBYTEINT(p);p++; /* CONTROL */
+
+ N = ONEBYTEINT(p);
+ *n++ = ONEBYTEINT(p);p++; /* NUMBERINCLUSTER */
+
+ for( loop = 0; loop < N; loop++) /* LIST */
+ *n++ = ONEBYTEINT(p++);
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_2(fortint * outputArray, unsigned char * gribSection1) {
+ return d_def_2_(outputArray,gribSection1);
+}
+
+fortint e_def_3_(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes ECMWF local definition 3 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition3.html
+//
+// Returns the number of bytes (octets) in local definition 3 after
+// byte 40.
+*/
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = ONEBYTE(n);n++; /* BAND */
+ *p++ = ONEBYTE(n);n++; /* FUNCTION */
+ *p++ = (unsigned char) 0; /* RESERVED */
+
+ return (fortint) (p-gribSection1);
+}
+
+fortint e_def_3(fortint * inputArray, unsigned char * gribSection1) {
+ return e_def_3_(inputArray,gribSection1);
+}
+
+fortint d_def_3_(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes ECMWF local definition 3 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition3.html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = ONEBYTEINT(p);p++; /* BAND */
+ *n++ = ONEBYTEINT(p);p++; /* FUNCTION */
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_3(fortint * outputArray, unsigned char * gribSection1) {
+ return d_def_3_(outputArray,gribSection1);
+}
+
+void encodeNonMarsPartOfDefinition4(
+ fortint** nPointer,
+ unsigned char** pPointer) {
+fortint* n = *nPointer;
+unsigned char* p = *pPointer;
+int loop;
+int N, M, I, J, K;
+int zero = 0;
+fortint value;
+
+/*
+// Coordinate structure definition
+*/
+ *p++ = ONEBYTE(n);n++; /* SPACEUNITFLAG */
+ *p++ = ONEBYTE(n);n++; /* VERTCOORDDEFN */
+ *p++ = ONEBYTE(n);n++; /* HORIZCOORDDEFN */
+ *p++ = ONEBYTE(n);n++; /* TIMEUNITFLAG */
+ *p++ = ONEBYTE(n);n++; /* TIMECOORDDEFN */
+/*
+// Mixed coordinates
+// For positions, set sign bit to 1, if value is negative
+*/
+ *p++ = ONEBYTE(n);n++; /* MIXEDCOORDFLAG */
+ *p++ = ONEBYTE(n);n++; /* COORD1FLAG */
+ *p++ = ONEBYTE(n);n++; /* AVERAGINGFLAG1 */
+
+ value = *n++; /* POSITION1LEVEL1 */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ value = *n++; /* POSITION1LEVEL2 */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ *p++ = ONEBYTE(n);n++; /* COORD2FLAG */
+ *p++ = ONEBYTE(n);n++; /* AVERAGINGFLAG2 */
+
+ value = *n++; /* POSITION2LEVEL1 */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ value = *n++; /* POSITION2LEVEL2 */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+/*
+// Data grid definitions
+// For coordinates and increments, set sign bit to 1, if value is negative
+*/
+ *p++ = ONEBYTE(n);n++; /* COORD3FLAG */
+ *p++ = ONEBYTE(n);n++; /* COORD4FLAG */
+
+ value = *n++; /* COORD4FIRSTPT */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ value = *n++; /* COORD3FIRSTPT */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ value = *n++; /* COORD4LASTPT */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ value = *n++; /* COORD3LASTPT */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ value = *n++; /* I_INCREMENT */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ value = *n++; /* J_INCREMENT */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ *p++ = ONEBYTE(n);n++; /* FLAGIRREGGRIDLIST */
+ *p++ = ONEBYTE(n);n++; /* FLAGOTHERGRIDLIST */
+/*
+// Auxiliary information
+*/
+ *p++ = ONEBYTE(n);n++; /* FLAGOTHERINFO */
+
+ N = *n; /* NUMBERHORIZCOORDS */
+ *p++ = ONEBYTE(n++);
+
+ M = *n; /* NUMBERMIXEDCOORDS */
+ MOVE2BYTES(p,n);
+ p += 2;
+ n++;
+
+ I = *n; /* NUMBERGRIDCOORDS */
+ MOVE2BYTES(p,n);
+ p += 2;
+ n++;
+
+ J = *n; /* NUMBERAUXILIARY */
+ MOVE2BYTES(p,n);
+ p += 2;
+ n++;
+/*
+// Horizontal coordinate definition
+// For coordinates, set sign bit to 1, if value is negative
+*/
+ for( loop = 0; loop < N; loop++) { /* AUXILIARY ARRAY */
+ value = *n++;
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+ }
+/*
+// Mixed coordinate definition
+// For coordinates, set sign bit to 1, if value is negative
+*/
+ for( loop = 0; loop < M; loop++) {
+ value = *n++;
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+ }
+/*
+// Grid coordinate list
+// For coordinates, set sign bit to 1, if value is negative
+*/
+ for( loop = 0; loop < I; loop++) {
+ value = *n++;
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+ }
+/*
+// Auxiliary array
+*/
+ for( loop = 0; loop < J; loop++) {
+ MOVE4BYTES(p,n);
+ p += 4;
+ n++;
+ }
+/*
+// Post-auxiliary array
+*/
+ K = *n;
+ MOVE4BYTES(p,n);
+ p += 4;
+ n++;
+ for( loop = 1; loop < K; loop++) {
+ MOVE4BYTES(p,n);
+ p += 4;
+ n++;
+ }
+
+ *nPointer = n;
+ *pPointer = p;
+ return;
+}
+
+fortint e_def_4_(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+/*
+// Encodes ECMWF local definition 4 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition4.html
+//
+// If *bitPointer is not equal to zero, the length of the GRIB section
+// 1 is stored in 3 bytes starting at (gribSection1-40).
+// *bitPointer is updated by the number of bits in local definition 4.
+//
+// Returns the number of bytes (octets) in local definition 4 after
+// byte 40.
+*/
+fortint byteLength, streamNumber, zero = 0;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ streamNumber = *(n-2);
+ if( streamNumber == 1090 ) {
+ MOVE2BYTES(p,n); /* NUMBER in 2 bytes for stream 1090 */
+ p += 2;
+ n +=2; /* ZERO */
+ }
+ else {
+ *p++ = ONEBYTE(n);n++; /* NUMBER */
+ *p++ = zero; n++; /* ZERO */
+ }
+ *p++ = (unsigned char) 1; /* POST-AUXILIARY FLAG */
+ *p++ = ONEBYTE(n);n++; /* SYSTEM */
+ *p++ = ONEBYTE(n);n++; /* METHOD */
+
+ encodeNonMarsPartOfDefinition4(&n, &p);
+
+ byteLength = 40 + (fortint) (p-gribSection1);
+ if( *bitPointer ) {
+ MOVE3BYTES(gribSection1-40,&byteLength);
+ *bitPointer += (byteLength-40)*8;
+ }
+
+ return (fortint) byteLength;
+}
+
+fortint e_def_4( fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+ return e_def_4_(inputArray,gribSection1,bitPointer);
+}
+
+void decodeNonMarsPartOfDefinition4(
+ fortint postAuxiliaryArrayFlag,
+ fortint** nPointer,
+ unsigned char** pPointer) {
+fortint* n = *nPointer;
+unsigned char* p = *pPointer;
+int loop;
+int N, M, I, J, K;
+fortint value;
+
+/*
+// Coordinate structure definition
+*/
+ *n++ = ONEBYTEINT(p);p++; /* SPACEUNITFLAG */
+ *n++ = ONEBYTEINT(p);p++; /* VERTCOORDDEFN */
+ *n++ = ONEBYTEINT(p);p++; /* HORIZCOORDDEFN */
+ *n++ = ONEBYTEINT(p);p++; /* TIMEUNITFLAG */
+ *n++ = ONEBYTEINT(p);p++; /* TIMECOORDDEFN */
+/*
+// Mixed Coordinates
+// For positions, if sign bit is 1, value is negative
+*/
+ *n++ = ONEBYTEINT(p);p++; /* MIXEDCOORDFLAG */
+ *n++ = ONEBYTEINT(p);p++; /* COORD1FLAG */
+ *n++ = ONEBYTEINT(p);p++; /* AVERAGINGFLAG1 */
+
+ value = FOURBYTEINT(p); /* POSITION1LEVEL1 */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ value = FOURBYTEINT(p); /* POSITION1LEVEL2 */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ *n++ = ONEBYTEINT(p);p++; /* COORD2FLAG */
+ *n++ = ONEBYTEINT(p);p++; /* AVERAGINGFLAG2 */
+
+ value = FOURBYTEINT(p); /* POSITION2LEVEL1 */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ value = FOURBYTEINT(p); /* POSITION2LEVEL2 */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+/*
+// Data grid definitions
+// For coordinates and increments, if sign bit is 1, value is negative
+*/
+ *n++ = ONEBYTEINT(p);p++; /* COORD3FLAG */
+ *n++ = ONEBYTEINT(p);p++; /* COORD4FLAG */
+
+ value = FOURBYTEINT(p); /* COORD4FIRSTPT */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ value = FOURBYTEINT(p); /* COORD3FIRSTPT */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ value = FOURBYTEINT(p); /* COORD4LASTPT */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ value = FOURBYTEINT(p); /* COORD3LASTPT */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ value = FOURBYTEINT(p); /* I_INCREMENT */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ value = FOURBYTEINT(p); /* J_INCREMENT */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ *n++ = ONEBYTEINT(p);p++; /* FLAGIRREGGRIDLIST */
+ *n++ = ONEBYTEINT(p);p++; /* FLAGOTHERGRIDLIST */
+/*
+// Auxiliary information
+*/
+ *n++ = ONEBYTEINT(p);p++; /* FLAGOTHERINFO */
+
+ *n++ = ONEBYTEINT(p);p++; /* NUMBERHORIZCOORDS */
+ N = *(n-1);
+
+ *n++ = TWOBYTEINT(p); /* NUMBERMIXEDCOORDS */
+ M = *(n-1);
+ p += 2;
+
+ *n++ = TWOBYTEINT(p); /* NUMBERGRIDCOORDS */
+ I = *(n-1);
+ p += 2;
+
+ *n++ = TWOBYTEINT(p); /* NUMBERAUXILIARY */
+ J = *(n-1);
+ p += 2;
+/*
+// Horizontal coordinate definition
+// For coordinates, if sign bit is 1, value is negative
+*/
+ for( loop = 0; loop < N; loop++) {
+ value = FOURBYTEINT(p); p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+ }
+/*
+// Mixed coordinate definition
+// For coordinates, if sign bit is 1, value is negative
+*/
+ for( loop = 0; loop < M; loop++) {
+ value = FOURBYTEINT(p); p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+ }
+/*
+// Grid coordinate list
+// For coordinates, set sign bit to 1, if value is negative
+*/
+ for( loop = 0; loop < I; loop++) {
+ value = FOURBYTEINT(p); p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+ }
+/*
+// Auxiliary array
+*/
+ for( loop = 0; loop < J; loop++) {
+ *n++ = FOURBYTEINT(p);
+ p += 4;
+ }
+/*
+// Post-auxiliary array KSEC1 element
+*/
+ if( postAuxiliaryArrayFlag ) {
+ *n++ = FOURBYTEINT(p);
+ p += 4;
+ K = *(n-1);
+ for( loop = 1; loop < K; loop++) {
+ *n++ = FOURBYTEINT(p);
+ p += 4;
+ }
+ }
+
+ *nPointer = n;
+ *pPointer = p;
+ return;
+}
+
+
+fortint d_def_4_(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+/*
+// Decodes ECMWF local definition 4 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition4.html
+//
+// *bitPointer is updated by the number of bits in local definition 4.
+//
+// Returns the number of array elements inserted in outputArray
+*/
+fortint byteLength, streamNumber, postAuxiliaryArrayFlag;
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ streamNumber = *(n-2);
+ if( streamNumber == 1090 ) {
+ *n++ = TWOBYTEINT(p); /* NUMBER in 2 bytes for stream 1090 */
+ p +=2;
+ *n++ = 0; /* ZERO */
+ }
+ else {
+ *n++ = ONEBYTEINT(p);p++; /* NUMBER */
+ *n++ = 0; p++; /* ZERO */
+ }
+ postAuxiliaryArrayFlag = ONEBYTEINT(p);p++; /* FLAG */
+
+ *n++ = ONEBYTEINT(p);p++; /* SYSTEM */
+ *n++ = ONEBYTEINT(p);p++; /* METHOD */
+
+ decodeNonMarsPartOfDefinition4(postAuxiliaryArrayFlag, &n, &p);
+
+ byteLength = 40 + (fortint) (p - gribSection1);
+
+ if( *bitPointer ) *bitPointer += (byteLength-40)*8;
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_4( fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+ return d_def_4_(outputArray,gribSection1,bitPointer);
+}
+
+fortint e_def_5_(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes ECMWF local definition 5 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition5.html
+//
+// Returns the number of bytes (octets) in local definition 5 after
+// byte 40.
+*/
+fortint value;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+fortint indicator;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = ONEBYTE(n);n++; /* NUMBER */
+ *p++ = ONEBYTE(n);n++; /* TOTAL */
+/*
+// When decoding scale, if sign bit is 1, value is negative.
+*/
+ value = *n++; /* SCALE */
+ if( value < 0 ) value = 0x80 | (-value);
+ *p++ = ONEBYTE(&value);
+
+ indicator = *n;
+ *p++ = ONEBYTE(n);n++; /* INDICATOR */
+/*
+// When decoding upper/lower thresholds, if stored value is not 0xffff,
+// if sign bit is 1, value is negative.
+*/
+ value = *n++; /* LOWER */
+ if( indicator != 2 ) {
+ if( value < 0 ) value = 0x8000 | (-value);
+ }
+ else
+ value = 0xffff;
+ MOVE2BYTES(p,&value);
+ p += 2;
+
+ value = *n++; /* UPPER */
+ if( indicator != 1 ) {
+ if( value < 0 ) value = 0x8000 | (-value);
+ }
+ else
+ value = 0xffff;
+ MOVE2BYTES(p,&value);
+ p += 2;
+
+ *p++ = (unsigned char) 0; /* SPARE */
+/*
+// Definition 5 has a fixed length section 1 (58 bytes)
+*/
+ return (fortint) (58-40);
+}
+
+fortint e_def_5(fortint * inputArray, unsigned char * gribSection1) {
+ return e_def_5_(inputArray,gribSection1);
+}
+
+fortint d_def_5_(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes ECMWF local definition 5 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition5.html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+fortint value;
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+fortint indicator;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = ONEBYTEINT(p);p++; /* NUMBER */
+ *n++ = ONEBYTEINT(p);p++; /* TOTAL */
+/*
+// When decoding scale, if sign bit is 1, value is negative.
+*/
+ value = ONEBYTEINT(p);p++; /* SCALE */
+ if( value & 0x80 ) value = - (value & 0x7f);
+ *n++ = value;
+
+ *n++ = ONEBYTEINT(p);p++; /* INDICATOR */
+ indicator = *(n-1);
+/*
+// When decoding upper/lower thresholds, if stored value is not 0xffff,
+// if sign bit is 1, value is negative.
+*/
+ value = TWOBYTEINT(p); /* LOWER */
+ p += 2;
+ if( indicator != 2 ) {
+ if( value & 0x8000 ) value = - (value & 0x7fff);
+ }
+ else
+ value = 0xffff;
+ *n++ = value;
+
+ value = TWOBYTEINT(p); /* UPPER */
+ p += 2;
+ if( indicator != 1 ) {
+ if( value & 0x8000 ) value = - (value & 0x7fff);
+ }
+ else
+ value = 0xffff;
+ *n++ = value;
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_5(fortint * outputArray, unsigned char * gribSection1) {
+ return d_def_5_(outputArray,gribSection1);
+}
+
+fortint e_def_6_(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+/*
+// Encodes ECMWF local definition 6 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition6.html
+//
+// If *bitPointer is not equal to zero, the length of the GRIB section
+// 1 is stored in 3 bytes starting at (gribSection1-40).
+// *bitPointer is updated by the number of bits in local definition 6.
+//
+// Returns the number of bytes (octets) in local definition 6 after
+// byte 40.
+*/
+int loop, N;
+fortint byteLength;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+fortint date;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = (unsigned char) 0; /* ZERO1 */
+ n++;
+ *p++ = (unsigned char) 0; /* ZERO2 */
+ n++;
+
+ date = *n++; /* DATEOFSST */
+ if( date > 19000000 ) date -= 19000000;
+ MOVE3BYTES(p,&date);
+ p += 3;
+
+ *p++ = ONEBYTE(n);n++; /* TYPEOFSST */
+
+ N = *n; /* COUNTOFICE */
+ *p++ = ONEBYTE(n++);
+
+ for( loop = 0; loop < N; loop++) {
+ date = *n++; /* ICEDATE */
+ if( date > 19000000 ) date -= 19000000;
+ MOVE3BYTES(p,&date);
+ p += 3;
+ *p++ = ONEBYTE(n);n++; /* SATELLITE */
+ }
+
+ byteLength = 40 + (fortint) (p-gribSection1);
+ if( *bitPointer ) {
+ MOVE3BYTES(gribSection1-40,&byteLength);
+ *bitPointer += (byteLength-40)*8;
+ }
+
+ return (fortint) byteLength;
+}
+
+fortint e_def_6( fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+ return e_def_6_(inputArray,gribSection1,bitPointer);
+}
+
+fortint d_def_6_(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+/*
+// Decodes ECMWF local definition 6 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition6.html
+//
+// *bitPointer is updated by the number of bits in local definition 6.
+//
+// Returns the number of array elements inserted in outputArray
+*/
+int loop, N, byteLength;
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+fortint date;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = (fortint) 0; p++; /* ZERO1 */
+ *n++ = (fortint) 0; p++; /* ZERO2 */
+
+ date = THREEBYTEINT(p); /* Date of SST field used */
+ p += 3;
+ if( (date < 19000000) && (date > 100 ) ) date += 19000000;
+ *n++ = date;
+
+ *n++ = ONEBYTEINT(p);p++; /* TYPEOFSST */
+ *n++ = ONEBYTEINT(p);p++; /* COUNTOFICE */
+
+ N = *(n-1);
+ for( loop = 0; loop < N; loop++) {
+ date = THREEBYTEINT(p); /* ICEDATE */
+ p += 3;
+ if( (date < 19000000) && (date > 100 ) ) date += 19000000;
+ *n++ = date;
+ *n++ = ONEBYTEINT(p);p++; /* SATELLITE */
+ }
+
+ byteLength = 40 + (fortint) (p - gribSection1);
+
+ if( *bitPointer ) *bitPointer += (byteLength-40)*8;
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_6( fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+ return d_def_6_(outputArray,gribSection1,bitPointer);
+}
+
+fortint e_def_7_(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes ECMWF local definition 7 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition7.html
+//
+// Returns the number of bytes (octets) in local definition 7 after
+// byte 40.
+*/
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = ONEBYTE(n);n++; /* NUMBER */
+ *p++ = ONEBYTE(n);n++; /* TOTAL */
+ *p++ = ONEBYTE(n);n++; /* DOMAIN */
+ *p++ = ONEBYTE(n);n++; /* DIAGNOSTICNUMBER */
+ *p++ = (unsigned char) 0; /* SPARE */
+/*
+// Definition 7 has a fixed length section 1 (54 bytes)
+*/
+ return (fortint) (54-40);
+}
+
+fortint e_def_7(fortint * inputArray, unsigned char * gribSection1) {
+ return e_def_7_(inputArray,gribSection1);
+}
+
+fortint d_def_7_(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes ECMWF local definition 7 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition7.html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = ONEBYTEINT(p);p++; /* NUMBER */
+ *n++ = ONEBYTEINT(p);p++; /* TOTAL */
+ *n++ = ONEBYTEINT(p);p++; /* DOMAIN */
+ *n++ = ONEBYTEINT(p);p++; /* DIAGNOSTICNUMBER */
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_7(fortint * outputArray, unsigned char * gribSection1) {
+ return d_def_7_(outputArray,gribSection1);
+}
+
+fortint e_def_8_(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes ECMWF local definition 8 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition8.html
+//
+// Returns the number of bytes (octets) in local definition 8 after
+// byte 40.
+*/
+int loop;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = ONEBYTE(n);n++; /* INTERVAL */
+
+ for( loop = 0; loop < 12; loop++) {
+ *p++ = ONEBYTE(n); /* UNSIGNED INTEGER */
+ n++;
+ }
+/*
+// Definition 8 has a fixed length section 1 (62 bytes)
+*/
+ return (fortint) (62-40);
+}
+
+fortint e_def_8(fortint * inputArray, unsigned char * gribSection1) {
+ return e_def_8_(inputArray,gribSection1);
+}
+
+fortint d_def_8_(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes ECMWF local definition 8 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition8.html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+int loop;
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = ONEBYTEINT(p);p++; /* INTERVAL */
+
+ for( loop = 0; loop < 12; loop++) {
+ *n++ = ONEBYTEINT(p); /* UNSIGNED INTEGER */
+ p++;
+ }
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_8(fortint * outputArray, unsigned char * gribSection1) {
+ return d_def_8_(outputArray,gribSection1);
+}
+
+fortint e_def_9_(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes ECMWF local definition 9 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition9.html
+//
+// Returns the number of bytes (octets) in local definition 9 after
+// byte 40.
+*/
+fortint value;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ MOVE2BYTES(p,n); /* NUMBER */
+ p += 2;
+ n++;
+ MOVE2BYTES(p,n); /* ITERATIONCOUNT */
+ p += 2;
+ n++;
+ MOVE2BYTES(p,n); /* VECTORCOUNT */
+ p += 2;
+ n++;
+
+ *p++ = ONEBYTE(n);n++; /* INITIALNORM */
+ *p++ = ONEBYTE(n);n++; /* FINALNORM */
+
+ MOVE4BYTES(p,n); /* VECTORCOUNT */
+ p += 4;
+ n++;
+/*
+// When coding values, set sign bit to 1, if value is negative.
+*/
+ value = *n++; /* NORTHWESTLAT */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ value = *n++; /* NORTHWESTLON */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ value = *n++; /* SOUTHEASTLAT */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ value = *n++; /* SOUTHEASTLON */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ MOVE4BYTES(p,n); /* ACCURACY */
+ p += 4;
+ n++;
+
+ MOVE2BYTES(p,n); /* NUMBEREVOLVED */
+ p += 2;
+ n++;
+
+ value = *n++; /* RITZNUMBER1 */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ value = *n++; /* RITZNUMBER2 */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ *p++ = (unsigned char) 0; /* SPARE */
+/*
+// Definition 9 has a fixed length section 1 (92 bytes)
+*/
+
+ return (fortint) (92-40);
+}
+
+fortint e_def_9(fortint * inputArray, unsigned char * gribSection1) {
+ return e_def_9_(inputArray,gribSection1);
+}
+
+fortint d_def_9_(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes ECMWF local definition 9 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition9.html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+fortint value;
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = TWOBYTEINT(p); /* NUMBER */
+ p += 2;
+ *n++ = TWOBYTEINT(p); /* ITERATIONCOUNT */
+ p += 2;
+ *n++ = TWOBYTEINT(p); /* VECTORCOUNT */
+ p += 2;
+
+ *n++ = ONEBYTEINT(p);p++; /* INITIALNORM */
+ *n++ = ONEBYTEINT(p);p++; /* FINALNORM */
+
+ *n++ = FOURBYTEINT(p); /* FACTOR */
+ p += 4;
+
+/*
+// When decoding values, if sign bit is 1, value is negative.
+*/
+ value = FOURBYTEINT(p); /* NORTHWESTLAT */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ value = FOURBYTEINT(p); /* NORTHWESTLON */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ value = FOURBYTEINT(p); /* SOUTHEASTLAT */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ value = FOURBYTEINT(p); /* SOUTHEASTLON */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ *n++ = FOURBYTEINT(p); /* ACCURACY */
+ p += 4;
+
+ *n++ = TWOBYTEINT(p); /* NUMBEREVOLVED */
+ p += 2;
+
+ value = FOURBYTEINT(p); /* RITZNUMBER1 */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ value = FOURBYTEINT(p); /* RITZNUMBER2 */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_9(fortint * outputArray, unsigned char * gribSection1) {
+ return d_def_9_(outputArray,gribSection1);
+}
+
+fortint e_def_10_(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+/*
+// Encodes ECMWF local definition 10 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition10.html
+//
+// If *bitPointer is not equal to zero, the length of the GRIB section
+// 1 is stored in 3 bytes starting at (gribSection1-40).
+// *bitPointer is updated by the number of bits in local definition 10.
+//
+// Returns the number of bytes (octets) in local definition 10 after
+// byte 40.
+*/
+int loop, N;
+fortint value, byteLength;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = ONEBYTE(n);n++; /* NUMBER */
+ *p++ = ONEBYTE(n);n++; /* TOTAL */
+ *p++ = ONEBYTE(n);n++; /* CENTRALDEFINITION */
+ *p++ = ONEBYTE(n);n++; /* PARAMETER */
+ *p++ = ONEBYTE(n);n++; /* LEVELTYPE */
+
+/*
+// When coding values, set sign bit to 1, if value is negative.
+*/
+ value = *n++; /* NORTH */
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(p,&value);
+ p += 3;
+
+ value = *n++; /* WEST */
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(p,&value);
+ p += 3;
+
+ value = *n++; /* SOUTH */
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(p,&value);
+ p += 3;
+
+ value = *n++; /* EAST */
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(p,&value);
+ p += 3;
+
+ *p++ = ONEBYTE(n);n++; /* OPERFORECASTTUBE */
+ *p++ = ONEBYTE(n);n++; /* CONTROLFORECASTTUBE */
+
+ MOVE2BYTES(p,n); /* HEIGHT */
+ p += 2;
+ n++;
+ MOVE2BYTES(p,n); /* STEP */
+ p += 2;
+ n++;
+ MOVE2BYTES(p,n); /* RADIUS */
+ p += 2;
+ n++;
+ MOVE2BYTES(p,n); /* ENSEMBLEDEVIATION */
+ p += 2;
+ n++;
+ MOVE2BYTES(p,n); /* DISTANCEEXTREME */
+ p += 2;
+ n++;
+
+ N = *n; /* NUMBERINTUBE */
+ *p++ = ONEBYTE(n++);
+
+ for( loop = 0; loop < N; loop++) /* ENSEMBLE FORECAST NUMBERS */
+ *p++ = ONEBYTE(n++);
+/*
+// Definition 10 has a fixed length section 1 (334 bytes)
+*/
+ for( loop = N; loop < (334-39); loop++)
+ *p++ = (unsigned char) 0;
+
+ byteLength = 334;
+ if( *bitPointer ) {
+ MOVE3BYTES(gribSection1-40,&byteLength);
+ *bitPointer += (byteLength-40)*8;
+ }
+
+ return (fortint) byteLength;
+}
+
+fortint e_def_10( fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+ return e_def_10_(inputArray,gribSection1,bitPointer);
+}
+
+fortint d_def_10_(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+/*
+// Decodes ECMWF local definition 10 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition10.html
+//
+// *bitPointer is updated by the number of bits in local definition 10.
+//
+// Returns the number of array elements inserted in outputArray
+*/
+int loop, N, byteLength;
+fortint value;
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = ONEBYTEINT(p);p++; /* NUMBER */
+ *n++ = ONEBYTEINT(p);p++; /* TOTAL */
+ *n++ = ONEBYTEINT(p);p++; /* CENTRALDEFINITION */
+ *n++ = ONEBYTEINT(p);p++; /* PARAMETER */
+ *n++ = ONEBYTEINT(p);p++; /* LEVELTYPE */
+/*
+// When decoding values, if sign bit is 1, value is negative.
+*/
+ value = THREEBYTEINT(p); /* NORTH */
+ p += 3;
+ if( value & 0x800000 ) value = - (value & 0x7fffff);
+ *n++ = value;
+
+ value = THREEBYTEINT(p); /* WEST */
+ p += 3;
+ if( value & 0x800000 ) value = - (value & 0x7fffff);
+ *n++ = value;
+
+ value = THREEBYTEINT(p); /* SOUTH */
+ p += 3;
+ if( value & 0x800000 ) value = - (value & 0x7fffff);
+ *n++ = value;
+
+ value = THREEBYTEINT(p); /* EAST */
+ p += 3;
+ if( value & 0x800000 ) value = - (value & 0x7fffff);
+ *n++ = value;
+
+ *n++ = ONEBYTEINT(p);p++; /* OPERFORECASTTUBE */
+ *n++ = ONEBYTEINT(p);p++; /* CONTROLFORECASTTUBE */
+
+ *n++ = TWOBYTEINT(p); /* HEIGHT */
+ p += 2;
+ *n++ = TWOBYTEINT(p); /* STEP */
+ p += 2;
+ *n++ = TWOBYTEINT(p); /* RADIUS */
+ p += 2;
+ *n++ = TWOBYTEINT(p); /* ENSEMBLEDEVIATION */
+ p += 2;
+ *n++ = TWOBYTEINT(p); /* DISTANCEEXTREME */
+ p += 2;
+
+ *n++ = ONEBYTEINT(p);p++; /* NUMBERINTUBE */
+ N = *(n-1);
+
+ for( loop = 0; loop < N; loop++) /* ENSEMBLE FORECAST NUMBERS */
+ *n++ = ONEBYTEINT(p++);
+/*
+// Definition 10 has a fixed length section 1 (334 bytes)
+*/
+ byteLength = 334;
+
+ if( *bitPointer ) *bitPointer += (byteLength-40)*8;
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_10( fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+ return d_def_10_(outputArray,gribSection1,bitPointer);
+}
+
+fortint e_def_11_(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes ECMWF local definition 11 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition11.html
+//
+// Returns the number of bytes (octets) in local definition 11 after
+// byte 40.
+*/
+int loop;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = ONEBYTE(n);n++; /* ANALYSISCLASS */
+ *p++ = ONEBYTE(n);n++; /* ANALYSISTYPE */
+
+ MOVE2BYTES(p,n); /* ANALYSISSTREAM */
+ p += 2;
+ n++;
+
+ MOVE4BYTES(p,n); /* ANALYSISEXPVER */
+ p += 4;
+ n++;
+
+ *p++ = ONEBYTE(n);n++; /* ANALYSIS_YY */
+ *p++ = ONEBYTE(n);n++; /* ANALYSIS_MM */
+ *p++ = ONEBYTE(n);n++; /* ANALYSIS_DD */
+ *p++ = ONEBYTE(n);n++; /* ANALYSIS_HH */
+ *p++ = ONEBYTE(n);n++; /* ANALYSIS_MIN */
+ *p++ = ONEBYTE(n);n++; /* ANALYSISCENTURY */
+ *p++ = ONEBYTE(n);n++; /* ANALYSISORIGIN */
+ *p++ = ONEBYTE(n);n++; /* ANALYSISSUBCENTRE */
+
+
+ for( loop = 0; loop < 7; loop++) /* SPARE */
+ *p++ = (unsigned char) 0;
+/*
+// Definition 11 has a fixed length section 1 (72 bytes)
+*/
+ return (fortint) (72-40);
+}
+
+fortint e_def_11(fortint * inputArray, unsigned char * gribSection1) {
+ return e_def_11_(inputArray,gribSection1);
+}
+
+fortint d_def_11_(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes ECMWF local definition 11 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition11.html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = ONEBYTEINT(p);p++; /* ANALYSISCLASS */
+ *n++ = ONEBYTEINT(p);p++; /* ANALYSISTYPE */
+
+ *n++ = TWOBYTEINT(p); /* ANALYSISSTREAM */
+ p += 2;
+ *n++ = FOURBYTEINT(p); /* ANALYSISEXPVER */
+ p += 4;
+
+ *n++ = ONEBYTEINT(p);p++; /* ANALYSIS_YY */
+ *n++ = ONEBYTEINT(p);p++; /* ANALYSIS_MM */
+ *n++ = ONEBYTEINT(p);p++; /* ANALYSIS_DD */
+ *n++ = ONEBYTEINT(p);p++; /* ANALYSIS_HH */
+ *n++ = ONEBYTEINT(p);p++; /* ANALYSIS_MIN */
+ *n++ = ONEBYTEINT(p);p++; /* ANALYSISCENTURY */
+ *n++ = ONEBYTEINT(p);p++; /* ANALYSISORIGIN */
+ *n++ = ONEBYTEINT(p);p++; /* ANALYSISSUBCENTRE */
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_11(fortint * outputArray, unsigned char * gribSection1) {
+ return d_def_11_(outputArray,gribSection1);
+}
+
+fortint e_def_13_(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+/*
+// Encodes ECMWF local definition 13 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition13.html
+//
+// If *bitPointer is not equal to zero, the length of the GRIB section
+// 1 is stored in 3 bytes starting at (gribSection1-40).
+// *bitPointer is updated by the number of bits in local definition 13.
+//
+// Returns the number of bytes (octets) in local definition 13 after
+// byte 40.
+*/
+int loop, ND, NF;
+fortint byteLength;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = ONEBYTE(n);n++; /* NUMBER */
+ *p++ = ONEBYTE(n);n++; /* TOTAL */
+ *p++ = ONEBYTE(n);n++; /* DIRECTION */
+ *p++ = ONEBYTE(n);n++; /* FREQUENCY */
+
+ ND = *n; /* NUMBERDIRECTIONS */
+ *p++ = ONEBYTE(n++);
+
+ NF = *n; /* NUMBERFREQUENCIES */
+ *p++ = ONEBYTE(n++);
+
+ MOVE4BYTES(p,n); /* SCALEDIRECTIONS */
+ p += 4;
+ n++;
+ MOVE4BYTES(p,n); /* SCALEFREQUENCIES */
+ p += 4;
+ n++;
+/*
+// Set flag for new style coding and include system and method
+// Note the offsets for system/method; n is not updated till later!
+// Modified flag=2 to add:
+// reference date
+// climate date from
+// climate date to.
+*/
+ *p++ = (unsigned char) 2; /* FLAG */
+
+ MOVE2BYTES(p,(n+ND+NF)); /* SYSTEM */
+ p += 2;
+
+ MOVE2BYTES(p,(n+ND+NF+1)); /* METHOD */
+ p += 2;
+
+ MOVE4BYTES(p,(n+ND+NF+2)); /* REFERENCE DATE */
+ p += 4;
+
+ MOVE4BYTES(p,(n+ND+NF+3)); /* CLIMATE DATE FROM */
+ p += 4;
+
+ MOVE4BYTES(p,(n+ND+NF+4)); /* CLIMATE DATE TO */
+ p += 4;
+
+ for( loop = 0; loop < 20; loop++) /* SPARE */
+ *p++ = (unsigned char) 0;
+
+ for( loop = 0; loop < ND; loop++) { /* DIRECTIONS */
+ MOVE4BYTES(p,n);
+ p += 4;
+ n++;
+ }
+
+ for( loop = 0; loop < NF; loop++) { /* FREQUENCIES */
+ MOVE4BYTES(p,n);
+ p += 4;
+ n++;
+ }
+
+ n += 5; /* for system, method, reference date and
+ two climate dates */
+
+ byteLength = 100 + ND*4 + NF*4;
+ if( *bitPointer ) {
+ MOVE3BYTES(gribSection1-40,&byteLength);
+ *bitPointer += (byteLength-40)*8;
+ }
+
+ return (fortint) byteLength;
+}
+
+fortint e_def_13( fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+ return e_def_13_(inputArray,gribSection1,bitPointer);
+}
+
+fortint d_def_13_(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+/*
+// Decodes ECMWF local definition 13 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition13.html
+//
+// *bitPointer is updated by the number of bits in local definition 13.
+//
+// Returns the number of array elements inserted in outputArray
+*/
+int loop, ND, NF, byteLength, flag;
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = ONEBYTEINT(p);p++; /* NUMBER */
+ *n++ = ONEBYTEINT(p);p++; /* TOTAL */
+ *n++ = ONEBYTEINT(p);p++; /* DIRECTION */
+ *n++ = ONEBYTEINT(p);p++; /* FREQUENCY */
+
+ *n++ = ONEBYTEINT(p);p++; /* NUMBERDIRECTIONS */
+ ND = *(n-1);
+ *n++ = ONEBYTEINT(p);p++; /* NUMBERFREQUENCIES */
+ NF = *(n-1);
+
+ *n++ = FOURBYTEINT(p); /* SCALEDIRECTIONS */
+ p += 4;
+ *n++ = FOURBYTEINT(p); /* SCALEFREQUENCIES */
+ p += 4;
+/*
+// Handle system and method if flag = 1 or 2
+// Modified flag=2 added:
+// reference date
+// climate date from
+// climate date to.
+*/
+ flag = ONEBYTEINT(p++); /* FLAG */
+ if( flag == 1 ) {
+ *(n+ND+NF) = TWOBYTEINT(p); /* SYSTEM */
+ p += 2;
+ *(n+ND+NF+1) = TWOBYTEINT(p); /* METHOD */
+
+ p += 34; /* SPARE */
+ }
+ else if( flag == 2 ) {
+ *(n+ND+NF) = TWOBYTEINT(p); /* SYSTEM */
+ p += 2;
+ *(n+ND+NF+1) = TWOBYTEINT(p); /* METHOD */
+ p += 2;
+ *(n+ND+NF+2) = FOURBYTEINT(p); /* REFERENCE DATE */
+ p += 4;
+ *(n+ND+NF+3) = FOURBYTEINT(p); /* CLIMATE DATE FROM */
+ p += 4;
+ *(n+ND+NF+4) = FOURBYTEINT(p); /* CLIMATE DATE TO */
+
+ p += 24; /* SPARE */
+ }
+ else
+ p += 36; /* SPARE */
+
+ for( loop = 0; loop < ND; loop++) { /* DIRECTIONS */
+ *n++ = FOURBYTEINT(p);
+ p += 4;
+ }
+
+ for( loop = 0; loop < NF; loop++) { /* FREQUENCIES */
+ *n++ = FOURBYTEINT(p);
+ p += 4;
+ }
+/*
+// Adjust for system and method if 'new-style' flag is set
+*/
+ if( flag == 1 ) n += 2;
+ if( flag == 2 ) n += 5;
+
+ byteLength = 100 + ND*4 + NF*4;
+
+ if( *bitPointer ) *bitPointer += (byteLength-40)*8;
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_13( fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+ return d_def_13_(outputArray,gribSection1,bitPointer);
+}
+
+fortint e_def_14_(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes ECMWF local definition 14 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition14.html
+//
+// Returns the number of bytes (octets) in local definition 14 after
+// byte 40.
+*/
+int loop, N;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = ONEBYTE(n);n++; /* NUMBER */
+ *p++ = ONEBYTE(n);n++; /* TOTAL */
+ *p++ = ONEBYTE(n);n++; /* CHANNELNUMBER */
+
+ MOVE4BYTES(p,n); /* SCALEFACTOR */
+ p += 4;
+ n++;
+
+ *p++ = ONEBYTE(n);n++; /* NUMBERFREQUENCIES */
+ N = *(n-1);
+
+ for( loop = 0; loop < 3; loop++) /* SPARE */
+ *p++ = (unsigned char) 0;
+
+ for( loop = 0; loop < N; loop++) { /* FREQUENCIES */
+ MOVE4BYTES(p,n);
+ p += 4;
+ n++;
+ }
+/*
+// Definition 14 has a fixed length section 1 (1080 bytes)
+*/
+ for( loop = 0; loop < (1080-60-N*4); loop++)
+ *p++ = (unsigned char) 0;
+
+ return (fortint) (1080-40);
+}
+
+fortint e_def_14(fortint * inputArray, unsigned char * gribSection1) {
+ return e_def_14_(inputArray,gribSection1);
+}
+
+fortint d_def_14_(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes ECMWF local definition 14 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition14.html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+int loop, N;
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = ONEBYTEINT(p);p++; /* NUMBER */
+ *n++ = ONEBYTEINT(p);p++; /* TOTAL */
+ *n++ = ONEBYTEINT(p);p++; /* CHANNELNUMBER */
+
+ *n++ = FOURBYTEINT(p); /* SCALEFACTOR */
+ p += 4;
+
+ *n++ = ONEBYTEINT(p);p++; /* NUMBERFREQUENCIES */
+ N = *(n-1);
+
+ p += 3; /* SPARE */
+
+ for( loop = 0; loop < N; loop++) { /* FREQUENCIES */
+ *n++ = FOURBYTEINT(p);
+ p += 4;
+ }
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_14(fortint * outputArray, unsigned char * gribSection1) {
+ return d_def_14_(outputArray,gribSection1);
+}
+
+fortint e_def_15_(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes ECMWF local definition 15 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition15.html
+//
+// Returns the number of bytes (octets) in local definition 15 after
+// byte 40.
+*/
+int loop;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ MOVE2BYTES(p,n); /* NUMBER */
+ p += 2;
+ n++;
+
+ MOVE2BYTES((p+4),n); /* TOTAL: bytes are out-of-sequence */
+ n++;
+
+ MOVE2BYTES(p,n); /* SYSTEM */
+ p += 2;
+ n++;
+ MOVE2BYTES(p,n); /* METHOD */
+ p += 4; /* to skip TOTAL as well as METHOD */
+ n++;
+/*
+// Definition 15 has a fixed length section 1 (60 bytes)
+*/
+ for( loop = 0; loop < 3; loop++) /* SPARE */
+ *p++ = (unsigned char) 0;
+
+ return (fortint) (60-40);
+}
+
+fortint e_def_15(fortint * inputArray, unsigned char * gribSection1) {
+ return e_def_15_(inputArray,gribSection1);
+}
+
+fortint d_def_15_(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes ECMWF local definition 15 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition15.html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = TWOBYTEINT(p); /* NUMBER */
+ p += 2;
+
+ *n++ = TWOBYTEINT((p+4)); /* TOTAL: bytes are out-of-sequence */
+
+ *n++ = TWOBYTEINT(p); /* SYSTEM */
+ p += 2;
+ *n++ = TWOBYTEINT(p); /* METHOD */
+ p += 2;
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_15(fortint * outputArray, unsigned char * gribSection1) {
+ return d_def_15_(outputArray,gribSection1);
+}
+
+fortint e_def_16_(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes ECMWF local definition 16 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition16.html
+//
+// Returns the number of bytes (octets) in local definition 16 after
+// byte 40.
+*/
+int loop;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ MOVE2BYTES(p,n); /* NUMBER */
+ p += 2;
+ n++;
+
+ n++; /* ZERO */
+
+ MOVE2BYTES(p,n); /* SYSTEM */
+ p += 2;
+ n++;
+ MOVE2BYTES(p,n); /* METHOD */
+ p += 2;
+ n++;
+ MOVE4BYTES(p,n); /* MONTH */
+ p += 4;
+ n++;
+
+ *p++ = ONEBYTE(n);n++; /* PERIOD */
+
+ MOVE2BYTES(p,n); /* Forecast month */
+ p += 2;
+ n++;
+
+ for( loop = 63; loop <= 80; loop++ )
+ *p++ = (unsigned char) 0;
+
+ return (fortint) (80);
+}
+
+fortint e_def_16(fortint * inputArray, unsigned char * gribSection1) {
+ return e_def_16_(inputArray,gribSection1);
+}
+
+fortint d_def_16_(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes ECMWF local definition 16 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition16.html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = TWOBYTEINT(p); /* NUMBER */
+ p += 2;
+
+ *n++ = 0; /* ZERO */
+
+ *n++ = TWOBYTEINT(p); /* SYSTEM */
+ p += 2;
+ *n++ = TWOBYTEINT(p); /* METHOD */
+ p += 2;
+ *n++ = FOURBYTEINT(p); /* MONTH */
+ p += 4;
+ *n++ = ONEBYTEINT(p); /* PERIOD */
+ p++;
+ *n++ = TWOBYTEINT(p); /* Forecast month */
+ p += 2;
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_16(fortint * outputArray, unsigned char * gribSection1) {
+ return d_def_16_(outputArray,gribSection1);
+}
+
+fortint e_def_17_(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+/*
+// Encodes ECMWF local definition 17 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition17.html
+//
+// If *bitPointer is not equal to zero, the length of the GRIB section
+// 1 is stored in 3 bytes starting at (gribSection1-40).
+// *bitPointer is updated by the number of bits in local definition 17.
+//
+// Returns the number of bytes (octets) in local definition 17 after
+// byte 40.
+*/
+int loop, N, M;
+fortint byteLength;
+fortint zero = 0;
+fortint date;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = (unsigned char) 0; /* ZERO1 */
+ n++;
+ *p++ = (unsigned char) 0; /* ZERO2 */
+ n++;
+
+ date = *n++; /* DATEOFSST */
+ if( date > 19000000 ) date -= 19000000;
+ MOVE3BYTES(p,&date);
+ p += 3;
+
+ *p++ = ONEBYTE(n);n++; /* TYPEOFSST */
+ *p++ = ONEBYTE(n);n++; /* COUNTOFICE */
+ N = *(n-1);
+
+ for( loop = 0; loop < N; loop++) { /* ICE data */
+ date = *n++; /* Date of ICE field */
+ if( date > 19000000 ) date -= 19000000;
+ MOVE3BYTES(p,&date);
+ p += 3;
+ *p++ = ONEBYTE(n);n++; /* Satellite number */
+ }
+/*
+// The ICE data entries are padded with zeroes to make upto a multiple
+// of 10 slots
+*/
+ M = ((N+9)/10)*10;
+ if( M == 0 ) M = 10;
+ for( loop = N; loop < M; loop++) {
+ MOVE4BYTES(p,&zero);
+ p += 4;
+ }
+
+ byteLength = 40 + 16 + M*4;
+ if( *bitPointer ) {
+ MOVE3BYTES(gribSection1-40,&byteLength);
+ *bitPointer += (byteLength-40)*8;
+ }
+
+ return (fortint) byteLength;
+}
+
+fortint e_def_17( fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+ return e_def_17_(inputArray,gribSection1,bitPointer);
+}
+
+fortint d_def_17_(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+/*
+// Decodes ECMWF local definition 17 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition17.html
+//
+// *bitPointer is updated by the number of bits in local definition 17.
+//
+// Returns the number of array elements inserted in outputArray
+*/
+int loop, N, M, byteLength;
+fortint date;
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = (fortint) 0; p++; /* ZERO1 */
+ *n++ = (fortint) 0; p++; /* ZERO2 */
+
+ date = THREEBYTEINT(p); /* DATEOFSST */
+ p += 3;
+ if( (date < 19000000) && (date > 100 ) ) date += 19000000;
+ *n++ = date;
+
+ *n++ = ONEBYTEINT(p);p++; /* TYPEOFSST */
+ *n++ = ONEBYTEINT(p);p++; /* COUNTOFICE */
+ N = *(n-1);
+
+ for( loop = 0; loop < N; loop++) { /* ICE data */
+ date = THREEBYTEINT(p); /* Date of ICE field */
+ p += 3;
+ if( (date < 19000000) && (date > 100 ) ) date += 19000000;
+ *n++ = date;
+
+ *n++ = ONEBYTEINT(p);p++; /* Satellite number */
+ }
+
+ M = ((N+9)/10)*10;
+ if( M == 0 ) M = 10;
+ byteLength = 40 + 16 + M*4;
+
+ if( *bitPointer ) *bitPointer += (byteLength-40)*8;
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_17( fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+ return d_def_17_(outputArray,gribSection1,bitPointer);
+}
+
+fortint e_def_18_(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes ECMWF local definition 18 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition18.html
+//
+// Returns the number of bytes (octets) in local definition 18 after
+// byte 40.
+*/
+int loop, N;
+fortint zero = 0, fourBlanks = 0x20202020;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = ONEBYTE(n);n++; /* NUMBER */
+ *p++ = ONEBYTE(n);n++; /* TOTAL */
+ *p++ = ONEBYTE(n);n++; /* ORIGIN */
+
+ MOVE4BYTES(p,n); /* MODEL */
+ p += 4;
+ n++;
+
+ *p++ = ONEBYTE(n);n++; /* CONSENSUS_COUNT */
+ N = *(n-1);
+
+ MOVE3BYTES(p,&zero); /* SPARE */
+ p += 3;
+
+ for( loop = 0; loop < N; loop++) { /* WMO identifiers */
+ MOVE4BYTES(p,n);
+ p += 4;
+ n++;
+ }
+/*
+// Definition 2 has a fixed length section 1 (120 bytes)
+*/
+ for( loop = 0; loop < (15-N); loop++) { /* PADDING */
+ MOVE4BYTES(p,&fourBlanks);
+ p += 4;
+ }
+
+ return (fortint) (120 - 40);
+}
+
+fortint e_def_18(fortint * inputArray, unsigned char * gribSection1) {
+ return e_def_18_(inputArray,gribSection1);
+}
+
+fortint d_def_18_(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes ECMWF local definition 18 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition18.html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+int loop, N;
+unsigned char fourBlanks[5] = " ";
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = ONEBYTEINT(p);p++; /* NUMBER */
+ *n++ = ONEBYTEINT(p);p++; /* TOTAL */
+ *n++ = ONEBYTEINT(p);p++; /* ORIGIN */
+
+ *n++ = FOURBYTEINT(p); /* MODEL */
+ p += 4;
+
+ *n++ = ONEBYTEINT(p);p++; /* CONSENSUS_COUNT */
+ N = *(n-1);
+
+ p += 3; /* SPARE */
+
+ for( loop = 0; loop < N; loop++) { /* WMO identifiers */
+ *n++ = FOURBYTEINT(p);
+ p += 4;
+ }
+/*
+// Definition 2 has a fixed length section 1 (120 bytes)
+*/
+ for( loop = 0; loop < (15-N); loop++)
+ *n++ = FOURBYTEINT(fourBlanks); /* PADDING */
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_18(fortint * outputArray, unsigned char * gribSection1) {
+ return d_def_18_(outputArray,gribSection1);
+}
+
+fortint e_def_19_(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes ECMWF local definition 19 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition19.html
+//
+// Returns the number of bytes (octets) in local definition 19 after
+// byte 40.
+*/
+int loop;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = (unsigned char) 0;n++; /* ZERO */
+ *p++ = ONEBYTE(n);n++; /* ENSEMBLESIZE */
+ *p++ = ONEBYTE(n);n++; /* POWEROFTEN */
+
+ MOVE4BYTES(p,n); /* WEIGHT */
+ p += 4;
+ n++;
+ MOVE3BYTES(p,n); /* FIRSTMONTH1 */
+ p += 3;
+ n++;
+ MOVE3BYTES(p,n); /* LASTMONTH1 */
+ p += 3;
+ n++;
+ MOVE3BYTES(p,n); /* FIRSTMONTH2 */
+ p += 3;
+ n++;
+ MOVE3BYTES(p,n); /* LASTMONTH2 */
+ p += 3;
+ n++;
+ *p++ = ONEBYTE(n);n++; /* EFI order */
+/*
+// Definition 19 has a fixed length section 1 (80 bytes)
+*/
+ for( loop = 0; loop < 11; loop++)
+ *p++ = (unsigned char) 0; /* PADDING */
+
+ return (fortint) (80-40);
+}
+
+fortint e_def_19(fortint * inputArray, unsigned char * gribSection1) {
+ return e_def_19_(inputArray,gribSection1);
+}
+
+fortint d_def_19_(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes ECMWF local definition 19 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition19.html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = (fortint) 0; p++; /* ZERO */
+ *n++ = ONEBYTEINT(p);p++; /* ENSEMBLESIZE */
+ *n++ = ONEBYTEINT(p);p++; /* POWEROFTEN */
+
+ *n++ = FOURBYTEINT(p); /* WEIGHT */
+ p += 4;
+ *n++ = THREEBYTEINT(p); /* FIRSTMONTH1 */
+ p += 3;
+ *n++ = THREEBYTEINT(p); /* LASTMONTH1 */
+ p += 3;
+ *n++ = THREEBYTEINT(p); /* FIRSTMONTH2 */
+ p += 3;
+ *n++ = THREEBYTEINT(p); /* LASTMONTH2 */
+ p += 3;
+ *n++ = ONEBYTEINT(p);p++; /* EFI order */
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_19(fortint * outputArray, unsigned char * gribSection1) {
+ return d_def_19_(outputArray,gribSection1);
+}
+
+fortint e_def_20_(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes ECMWF local definition 20 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition20.html
+//
+// Returns the number of bytes (octets) in local definition 20 after
+// byte 40.
+*/
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = ONEBYTE(n);n++; /* ITERATION */
+ *p++ = ONEBYTE(n);n++; /* TOTAL NUMBER OF ITERATIONS */
+ *p++ = (unsigned char) 0; /* UNUSED */
+
+/*
+// Definition 20 has a fixed length section 1 (52 bytes)
+*/
+ return (fortint) (52-40);
+}
+
+fortint e_def_20(fortint * inputArray, unsigned char * gribSection1) {
+ return e_def_20_(inputArray,gribSection1);
+}
+
+fortint d_def_20_(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes ECMWF local definition 20 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition20.html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = ONEBYTEINT(p);p++; /* ITERATION */
+ *n++ = ONEBYTEINT(p);p++; /* TOTAL NUMBER OF ITERATIONS */
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_20(fortint * outputArray, unsigned char * gribSection1) {
+ return d_def_20_(outputArray,gribSection1);
+}
+
+fortint e_def_21_(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes ECMWF local definition 21 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition21.
+html
+//
+// Returns the number of bytes (octets) in local definition 21 after
+// byte 40.
+*/
+fortint value;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ MOVE2BYTES(p,n); /* Forecast or singular vector number */
+ p += 2;
+ n++;
+ MOVE2BYTES(p,n); /* Number of iterations */
+ p += 2;
+ n++;
+ MOVE2BYTES(p,n); /* Number of singular vectors computed */
+ p += 2;
+ n++;
+ *p++ = ONEBYTE(n);n++; /* Norm used at initial time */
+ *p++ = ONEBYTE(n);n++; /* Norm used at final time */
+
+ MOVE4BYTES(p,n); /* Lat-long multiplication factor */
+ p += 4;
+ n++;
+/*
+// When coding values, set sign bit to 1, if value is negative.
+*/
+ value = *n++; /* North-west latitude */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ value = *n++; /* North-west longitude */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ value = *n++; /* South-east latitude */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ value = *n++; /* South-east longitude */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ MOVE4BYTES(p,n); /* Accuracy */
+ p += 4;
+ n++;
+
+ MOVE2BYTES(p,n); /* Number of singular vectors evolved */
+ p += 2;
+ n++;
+
+ value = *n++; /* Ritz number 1 */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ value = *n++; /* Ritz number 2 */
+ if( value < 0 ) value = 0x80000000 | (-value);
+ MOVE4BYTES(p,&value);
+ p += 4;
+
+ *p++ = ONEBYTE(n);n++; /* Observation offset period */
+ *p++ = ONEBYTE(n);n++; /* Forecast lead time */
+ *p++ = ONEBYTE(n);n++; /* WMO id of data originating centre */
+
+ MOVE2BYTES(p,n); /* Method number */
+ p += 2;
+ n++;
+ MOVE2BYTES(p,n); /* Total number of forecasts in ensemble */
+ p += 2;
+ n++;
+
+ *p++ = ONEBYTE(n);n++; /* Shape of verification region */
+ *p++ = (unsigned char) 0; /* Reserved. Set to zero */
+ n++;
+
+
+/*
+// Definition 21 has a fixed length section 1 (100 bytes)
+*/
+ return (fortint) (100-40);
+}
+
+fortint e_def_21(fortint * inputArray, unsigned char * gribSection1) {
+ return e_def_21_(inputArray,gribSection1);
+}
+
+fortint d_def_21_(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes ECMWF local definition 21 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition21.
+html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+fortint value;
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = TWOBYTEINT(p); /* Forecast or singular vector number */
+ p += 2;
+ *n++ = TWOBYTEINT(p); /* Number of iterations */
+ p += 2;
+ *n++ = TWOBYTEINT(p); /* Number of singular vectors computed */
+ p += 2;
+ *n++ = ONEBYTEINT(p);p++; /* Norm used at initial time */
+ *n++ = ONEBYTEINT(p);p++; /* Norm used at final time */
+
+ *n++ = FOURBYTEINT(p); /* Lat-long multiplication factor */
+ p += 4;
+
+ value = FOURBYTEINT(p); /* North-west latitude */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ value = FOURBYTEINT(p); /* North-west longitude */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ value = FOURBYTEINT(p); /* South-east latitude */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ value = FOURBYTEINT(p); /* South-east longitude */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ *n++ = FOURBYTEINT(p); /* Accuracy */
+ p += 4;
+ *n++ = TWOBYTEINT(p); /* Number of singular vectors evolved */
+ p += 2;
+
+ value = FOURBYTEINT(p); /* Ritz number 1 */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ value = FOURBYTEINT(p); /* Ritz number 2 */
+ p += 4;
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *n++ = value;
+
+ *n++ = ONEBYTEINT(p);p++; /* Observation offset period */
+ *n++ = ONEBYTEINT(p);p++; /* Forecast lead time */
+ *n++ = ONEBYTEINT(p);p++; /* WMO id of data originating centre */
+
+ *n++ = TWOBYTEINT(p); /* Method number */
+ p += 2;
+ *n++ = TWOBYTEINT(p); /* Total number of forecasts in ensemble */
+ p += 2;
+
+ *n++ = ONEBYTEINT(p);p++; /* Shape of verification region */
+
+ p++; /* Reserved. Set to zero */
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_21(fortint * outputArray, unsigned char * gribSection1) {
+ return d_def_21_(outputArray,gribSection1);
+}
+
+fortint e_def_22_(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes ECMWF local definition 22 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition22.html
+//
+// Returns the number of bytes (octets) in local definition 22 after
+// byte 40.
+*/
+int loop;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ MOVE2BYTES(p,n); /* NUMBER */
+ p += 2;
+ n++;
+
+ MOVE2BYTES(p,n); /* TOTAL */
+ p += 2;
+ n++;
+
+ MOVE2BYTES(p,n); /* SYSTEM */
+ p += 2;
+ n++;
+
+ MOVE2BYTES(p,n); /* METHOD */
+ p += 2;
+ n++;
+
+ MOVE4BYTES(p,n); /* REFERENCE DATE */
+ p += 4;
+ n++;
+
+ MOVE4BYTES(p,n); /* CLIMATE DATE (FROM) */
+ p += 4;
+ n++;
+
+ MOVE4BYTES(p,n); /* CLIMATE DATE (TO) */
+ p += 4;
+ n++;
+
+ return (fortint) (69);
+}
+
+fortint e_def_22(fortint * inputArray, unsigned char * gribSection1) {
+ return e_def_22_(inputArray,gribSection1);
+}
+
+fortint d_def_22_(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes ECMWF local definition 22 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition22.html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = TWOBYTEINT(p); /* NUMBER */
+ p += 2;
+ *n++ = TWOBYTEINT(p); /* TOTAL */
+ p += 2;
+ *n++ = TWOBYTEINT(p); /* SYSTEM */
+ p += 2;
+ *n++ = TWOBYTEINT(p); /* METHOD */
+ p += 2;
+ *n++ = FOURBYTEINT(p); /* REFERENCE DATE */
+ p += 4;
+ *n++ = FOURBYTEINT(p); /* CLIMATE DATE (FROM) */
+ p += 4;
+ *n++ = FOURBYTEINT(p); /* CLIMATE DATE (TO) */
+ p += 4;
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_22(fortint * outputArray, unsigned char * gribSection1) {
+ return d_def_22_(outputArray,gribSection1);
+}
+
+fortint e_def_23_(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+/*
+// Encodes ECMWF local definition 23 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition23.html
+//
+// If *bitPointer is not equal to zero, the length of the GRIB section
+// 1 is stored in 3 bytes starting at (gribSection1-40).
+// *bitPointer is updated by the number of bits in local definition 4.
+//
+// Returns the number of bytes (octets) in local definition 23 after
+// byte 40.
+*/
+fortint byteLength;
+int loop;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+fortint zero = 0;
+unsigned char* total;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ MOVE2BYTES(p,n); /* NUMBER */
+ p += 2;
+ n++;
+
+ total = p + 29;
+ MOVE2BYTES(total,n); /* TOTAL */
+ n++;
+
+ MOVE2BYTES(p,n); /* SYSTEM */
+ p += 2;
+ n++;
+ MOVE2BYTES(p,n); /* METHOD */
+ p += 2;
+ n++;
+ MOVE4BYTES(p,n); /* MONTH */
+ p += 4;
+ n++;
+
+ *p++ = ONEBYTE(n);n++; /* PERIOD */
+
+ MOVE2BYTES(p,n); /* FORECAST MONTH */
+ p += 2;
+ n++;
+
+ MOVE4BYTES(p,n); /* REFERENCE DATE */
+ p += 4;
+ n++;
+
+ MOVE4BYTES(p,n); /* CLIMATE DATE (FROM) */
+ p += 4;
+ n++;
+
+ MOVE4BYTES(p,n); /* CLIMATE DATE (TO) */
+ p += 4;
+ n++;
+
+ *p++ = ONEBYTE(n);n++; /* THRESHOLD UNITS */
+
+ *p++ = ONEBYTE(n);n++; /* THRESHOLD INDICATOR */
+
+ MOVE2BYTES(p,n); /* LOWER THRESHOLD VALUE */
+ p += 2;
+ n++;
+ MOVE2BYTES(p,n); /* UPPER THRESHOLD VALUE */
+ p += 2;
+ n++;
+
+/*
+// Skip the total (already packed above)
+*/
+ p +=2;
+
+ MOVE2BYTES(p,&zero); /* SPARE (SET TO ZERO) */
+ p += 2;
+ n += 4;
+
+ byteLength = 40 + (fortint) (p-gribSection1);
+ if( *bitPointer ) {
+ MOVE3BYTES(gribSection1-40,&byteLength);
+ *bitPointer += (byteLength-40)*8;
+ }
+
+ return (fortint) byteLength;
+}
+
+fortint e_def_23(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+
+ return e_def_23_(inputArray,gribSection1,bitPointer);
+}
+
+fortint d_def_23_(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+/*
+// Decodes ECMWF local definition 23 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition23.html
+//
+// *bitPointer is updated by the number of bits in local definition 4.
+//
+// Returns the number of array elements inserted in outputArray
+*/
+fortint byteLength;
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+unsigned char* total;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = TWOBYTEINT(p); /* NUMBER */
+ p += 2;
+
+ total = p + 29;
+ *n++ = TWOBYTEINT(total); /* TOTAL */
+
+ *n++ = TWOBYTEINT(p); /* SYSTEM */
+ p += 2;
+ *n++ = TWOBYTEINT(p); /* METHOD */
+ p += 2;
+ *n++ = FOURBYTEINT(p); /* MONTH */
+ p += 4;
+ *n++ = ONEBYTEINT(p); /* PERIOD */
+ p++;
+ *n++ = TWOBYTEINT(p); /* FORECAST MONTH */
+ p += 2;
+ *n++ = FOURBYTEINT(p); /* REFERENCE DATE */
+ p += 4;
+ *n++ = FOURBYTEINT(p); /* CLIMATE DATE (FROM) */
+ p += 4;
+ *n++ = FOURBYTEINT(p); /* CLIMATE DATE (TO) */
+ p += 4;
+ *n++ = ONEBYTEINT(p); /* THRESHOLD UNITS */
+ p++;
+ *n++ = ONEBYTEINT(p); /* THRESHOLD INDICATOR */
+ p++;
+ *n++ = TWOBYTEINT(p); /* LOWER THRESHOLD */
+ p += 2;
+ *n++ = TWOBYTEINT(p); /* UPPER THRESHOLD */
+ p += 2;
+
+ *n++ = 0; /* SPARE (SET TO ZERO) */
+ *n++ = 0;
+ *n++ = 0;
+ *n++ = 0;
+ p += 4;
+
+ byteLength = 40 + (fortint) (p - gribSection1);
+
+ if( *bitPointer ) *bitPointer += (byteLength-40)*8;
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_23(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+
+ return d_def_23_(outputArray,gribSection1,bitPointer);
+}
+
+fortint e_def_24_(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+/*
+// Encodes ECMWF local definition 24 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition24.html
+//
+// If *bitPointer is not equal to zero, the length of the GRIB section
+// 1 is stored in 3 bytes starting at (gribSection1-40).
+// *bitPointer is updated by the number of bits in local definition 4.
+//
+// Returns the number of bytes (octets) in local definition 24 after
+// byte 40.
+*/
+fortint byteLength;
+int loop;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+fortint zero = 0;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ MOVE2BYTES(p,n); /* Satellite identifier */
+ p += 2;
+ n++;
+
+ MOVE2BYTES(p,n); /* Instrument identifier */
+ p += 2;
+ n++;
+
+ MOVE2BYTES(p,n); /* Channel number */
+ p += 2;
+ n++;
+
+ *p++ = ONEBYTE(n);n++; /* Function code */
+
+ byteLength = 40 + (fortint) (p-gribSection1);
+ if( *bitPointer ) {
+ MOVE3BYTES(gribSection1-40,&byteLength);
+ *bitPointer += (byteLength-40)*8;
+ }
+
+ return (fortint) byteLength;
+}
+
+fortint e_def_24(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+
+ return e_def_24_(inputArray,gribSection1,bitPointer);
+}
+
+fortint d_def_24_(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+/*
+// Decodes ECMWF local definition 24 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition24.html
+//
+// *bitPointer is updated by the number of bits in local definition 4.
+//
+// Returns the number of array elements inserted in outputArray
+*/
+fortint byteLength;
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+unsigned char* total;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = TWOBYTEINT(p); /* Satellite identifier */
+ p += 2;
+
+ *n++ = TWOBYTEINT(p); /* Instrument identifier */
+ p += 2;
+
+ *n++ = TWOBYTEINT(p); /* Channel number */
+ p += 2;
+
+ *n++ = ONEBYTEINT(p); /* Function code */
+ p++;
+
+ byteLength = 40 + (fortint) (p - gribSection1);
+
+ if( *bitPointer ) *bitPointer += (byteLength-40)*8;
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_24(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+
+ return d_def_24_(outputArray,gribSection1,bitPointer);
+}
+
+fortint e_def_25_(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes ECMWF local definition 25 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition25.html
+//
+// Returns the number of bytes (octets) in local definition 25 after
+// byte 40.
+*/
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = ONEBYTE(n);n++; /* component index */
+ *p++ = ONEBYTE(n);n++; /* number of components */
+ *p++ = ONEBYTE(n);n++; /* model error type */
+
+ return (fortint) (p-gribSection1);
+}
+
+fortint e_def_25(fortint * inputArray, unsigned char * gribSection1) {
+ return e_def_25_(inputArray,gribSection1);
+}
+
+fortint d_def_25_(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes ECMWF local definition 25 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition25.html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = ONEBYTEINT(p);p++; /* component index */
+ *n++ = ONEBYTEINT(p);p++; /* number of components */
+ *n++ = ONEBYTEINT(p);p++; /* model error type */
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_25(fortint * outputArray, unsigned char * gribSection1) {
+ return d_def_25_(outputArray,gribSection1);
+}
+
+fortint e_def_50_(fortint * inputArray, unsigned char * gribSection1) {
+/*
+// Encodes ECMWF local definition 50 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition50.html
+//
+// Returns the number of bytes (octets) in local definition 50 after
+// byte 40.
+*/
+int loop;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = ONEBYTE(n);n++; /* NUMBER */
+ *p++ = ONEBYTE(n);n++; /* TOTAL */
+ *p++ = ONEBYTE(n);n++; /* MODEL */
+
+ MOVE4BYTES(p,n); /* NORTHWESTLAT */
+ p += 4;
+ n++;
+
+ MOVE4BYTES(p,n); /* NORTHWESTLON */
+ p += 4;
+ n++;
+
+ MOVE4BYTES(p,n); /* SOUTHWESTLAT */
+ p += 4;
+ n++;
+
+ MOVE4BYTES(p,n); /* SOUTHWESTLON */
+ p += 4;
+ n++;
+/*
+// ECMWF additions
+*/
+ *p++ = ONEBYTE(n);n++; /* ORIGINALPARAM */
+ *p++ = ONEBYTE(n);n++; /* ORIGINALTABLE */
+
+ for( loop = 70; loop < 116; loop++ )
+ *p++ = (unsigned char) 0; /* PADDING */
+ n += 10;
+/*
+// Optional data
+*/
+ for( loop = 0; loop < 46; loop++) { /* Optional data */
+ MOVE4BYTES(p,n);
+ p += 4;
+ n++;
+ }
+/*
+// Definition 50 has a fixed length section 1 (300 bytes)
+*/
+ return (fortint) (300-40);
+}
+
+fortint e_def_50(fortint * inputArray, unsigned char * gribSection1) {
+ return e_def_50_(inputArray,gribSection1);
+}
+
+fortint d_def_50_(fortint * outputArray, unsigned char * gribSection1) {
+/*
+// Decodes ECMWF local definition 50 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition50.html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+int loop;
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = ONEBYTEINT(p);p++; /* NUMBER */
+ *n++ = ONEBYTEINT(p);p++; /* TOTAL */
+ *n++ = ONEBYTEINT(p);p++; /* MODEL */
+
+ *n++ = FOURBYTEINT(p); /* NORTHWESTLAT */
+ p += 4;
+ *n++ = FOURBYTEINT(p); /* NORTHWESTLON */
+ p += 4;
+ *n++ = FOURBYTEINT(p); /* SOUTHWESTLAT */
+ p += 4;
+ *n++ = FOURBYTEINT(p); /* SOUTHWESTLON */
+ p += 4;
+/*
+// ECMWF additions
+*/
+ *n++ = ONEBYTEINT(p);p++; /* ORIGINALPARAM */
+ *n++ = ONEBYTEINT(p);p++; /* ORIGINALTABLE */
+
+ for( loop = 0; loop < 10; loop++ )
+ *n++ = 0;
+
+ p += 46;
+/*
+// Optional data
+*/
+ for( loop = 0; loop < 46; loop++) {
+ *n++ = FOURBYTEINT(p);
+ p += 4;
+ }
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_50(fortint * outputArray, unsigned char * gribSection1) {
+ return d_def_50_(outputArray,gribSection1);
+}
+
+fortint e_def_190_(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * collectedLocalDefinitionBytes,
+ fortint * bitPointer) {
+/*
+// Encodes ECMWF local definition 190 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition190.html
+//
+// collectedLocalDefinitionBytes is an array containing the ready-prepared
+// collected local definition bytes of the multiple ECMWF local definitions.
+//
+// If *bitPointer is not equal to zero, the length of the GRIB section
+// 1 is stored in 3 bytes starting at (gribSection1-40).
+// *bitPointer is updated by the number of bits in local definition 190.
+//
+// Returns the number of bytes (octets) in local definition 190 after
+// byte 40.
+*/
+int loop, N;
+fortint byteLength;
+fortint totalBytes = 0;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = (unsigned char) 0; /* ZERO1 */
+ n++;
+ *p++ = (unsigned char) 0; /* ZERO2 */
+ n++;
+ *p++ = ONEBYTE(n);n++; /* NUMBEROFDEFS */
+ N = *(n-1);
+
+ for( loop = 0; loop < N; loop++) {
+ *p++ = ONEBYTE(n);n++; /* ECMWF local definition number */
+ totalBytes += *n;
+ MOVE2BYTES(p,n); /* Count of bytes */
+ p += 2;
+ n++;
+ }
+/*
+// Transfer the ready-prepared collected local definition bytes
+*/
+ memcpy(p,collectedLocalDefinitionBytes,totalBytes);
+
+ byteLength = 40 + 12 + N*3 + totalBytes;
+ if( *bitPointer ) {
+ MOVE3BYTES(gribSection1-40,&byteLength);
+ *bitPointer += (byteLength-40)*8;
+ }
+
+ return (fortint) byteLength;
+}
+
+fortint e_def_190( fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * collectedLocalDefinitionBytes,
+ fortint * bitPointer) {
+ return e_def_190_(inputArray,gribSection1,collectedLocalDefinitionBytes,
+ bitPointer);
+}
+
+fortint d_def_190_(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * collectedLocalDefinitionBytes,
+ fortint * bitPointer) {
+/*
+// Decodes ECMWF local definition 190 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition190.html
+//
+// *bitPointer is updated by the number of bits in local definition 190.
+//
+// Returns the number of array elements inserted in outputArray
+*/
+int loop, N, byteLength;
+fortint totalBytes = 0;
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = (fortint) 0; p++; /* ZERO1 */
+ *n++ = (fortint) 0; p++; /* ZERO2 */
+ *n++ = ONEBYTEINT(p);p++; /* NUMBEROFDEFS */
+ N = *(n-1);
+
+ for( loop = 0; loop < N; loop++) {
+ *n++ = ONEBYTEINT(p);p++; /* ECMWF local definition number */
+ *n++ = TWOBYTEINT(p); /* Count of bytes */
+ p += 2;
+ totalBytes += *(n-1);
+ }
+/*
+// Transfer the collected local definition bytes
+*/
+ memcpy(collectedLocalDefinitionBytes,p,totalBytes);
+
+ byteLength = 40 + 12 + N*3 + totalBytes;
+
+ if( *bitPointer ) *bitPointer += (byteLength-40)*8;
+
+ return (fortint) ((totalBytes+sizeof(fortint)-1)/sizeof(fortint) +
+ n - outputArray);
+}
+
+fortint d_def_190( fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * collectedLocalDefinitionBytes,
+ fortint * bitPointer) {
+ return d_def_190_(outputArray,gribSection1,collectedLocalDefinitionBytes,
+ bitPointer);
+}
+
+fortint e_def_191_(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+/*
+// Encodes ECMWF local definition 191 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition191.html
+//
+// If *bitPointer is not equal to zero, the length of the GRIB section
+// 1 is stored in 3 bytes starting at (gribSection1-40).
+// *bitPointer is updated by the number of bits in local definition 191.
+//
+// Returns the number of bytes (octets) in local definition 191 after
+// byte 40.
+*/
+int loop, i, I, N, M, size = sizeof(fortint);
+fortint byteLength;
+fortint * n = inputArray;
+unsigned char * p = gribSection1;
+
+ encodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *p++ = (unsigned char) 0; /* ZERO1 */
+ n++;
+ *p++ = (unsigned char) 0; /* ZERO2 */
+ n++;
+ *p++ = ONEBYTE(n);n++; /* MAJOR */
+ *p++ = ONEBYTE(n);n++; /* MINOR */
+ *p++ = ONEBYTE(n);n++; /* ORIGINALSUBCENTRE */
+
+ for( loop = 0; loop < 4; loop++)
+ *p++ = (unsigned char) 0;
+
+ n += 4;
+
+ MOVE2BYTES(p,n); /* NUMBEROFBYTES */
+ p += 2;
+ n++;
+ N = *(n-1);
+
+ I = (N+size-1)/size;
+ for( loop = 0; loop < I; loop++) { /* Data descriptor bytes */
+ unsigned char * np = (unsigned char *) n;
+ for( i = 0; i < size; i++ ) {
+ *p++ = *np++;
+ }
+ n++;
+ }
+/*
+// The data entries are padded with zeroes to make upto a multiple of (60+80*M)
+*/
+ M = 60;
+ do { M += 80; } while( M < (60 + N) );
+
+ for( loop = N; loop < M; loop++) *p++ = (unsigned char) 0;
+
+ byteLength = M;
+ if( *bitPointer ) {
+ MOVE3BYTES(gribSection1-40,&byteLength);
+ *bitPointer += (byteLength-40)*8;
+ }
+
+ return (fortint) byteLength;
+}
+
+fortint e_def_191( fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+ return e_def_191_(inputArray,gribSection1,bitPointer);
+}
+
+fortint d_def_191_(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+/*
+// Decodes ECMWF local definition 191 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition191.html
+//
+// *bitPointer is updated by the number of bits in local definition 191.
+//
+// Returns the number of array elements inserted in outputArray
+*/
+int loop, i, I, N, M, byteLength, size = sizeof(fortint);
+fortint * n = outputArray;
+unsigned char * p = gribSection1;
+
+ decodeMarsPart(n,p);
+ p += 9;
+ n += 5;
+
+ *n++ = (fortint) 0; p++; /* ZERO */
+ *n++ = (fortint) 0; p++; /* ZERO */
+ *n++ = ONEBYTEINT(p);p++; /* MAJOR */
+ *n++ = ONEBYTEINT(p);p++; /* MINOR */
+ *n++ = ONEBYTEINT(p);p++; /* ORIGINALSUBCENTRE */
+
+ for( loop = 0; loop < 4; loop++ ) {
+ *n++ = (fortint) 0;
+ p++; /* ZEROES */
+ }
+
+ *n++ = TWOBYTEINT(p); /* NUMBEROFBYTES */
+ N = *(n-1);
+ p += 2;
+
+ I = (N+size-1)/size;
+ for( loop = 0; loop < I; loop++) { /* Data descriptor bytes */
+ unsigned char * np = (unsigned char *) n;
+ for( i = 0; i < size; i++ ) {
+ *np++ = *p++;
+ }
+ n++;
+ }
+/*
+// The data entries are padded with zeroes to make upto a multiple of (60+80*M)
+*/
+ M = 60;
+ do { M += 80; } while( M < (60 + N) );
+
+ byteLength = M;
+
+ if( *bitPointer ) *bitPointer += (byteLength-40)*8;
+
+ return (fortint) (n - outputArray);
+}
+
+fortint d_def_191( fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer) {
+ return d_def_191_(outputArray,gribSection1,bitPointer);
+}
+
+fortint e_def_x_(
+ fortint * definitionNumber,
+ fortint * inputArray,
+ unsigned char * gribSection1 ) {
+/*
+// Calls the encoding routine for the ECMWF local definition.
+*/
+int number = (int) *definitionNumber;
+fortint zero = 0;
+
+ switch( number ) {
+
+ case 1:
+ return e_def_1_(inputArray,gribSection1);
+
+ case 2:
+ return e_def_2_(inputArray,gribSection1);
+
+ case 3:
+ return e_def_3_(inputArray,gribSection1);
+
+ case 4:
+ return e_def_4_(inputArray,gribSection1,&zero) - 40;
+
+ case 5:
+ return e_def_5_(inputArray,gribSection1);
+
+ case 6:
+ return e_def_6_(inputArray,gribSection1,&zero) - 40;
+
+ case 7:
+ return e_def_7_(inputArray,gribSection1);
+
+ case 8:
+ return e_def_8_(inputArray,gribSection1);
+
+ case 9:
+ return e_def_9_(inputArray,gribSection1);
+
+ case 10:
+ return e_def_10_(inputArray,gribSection1,&zero) - 40;
+
+ case 11:
+ return e_def_11_(inputArray,gribSection1);
+
+ case 13:
+ return e_def_13_(inputArray,gribSection1,&zero) - 40;
+
+ case 14:
+ return e_def_14_(inputArray,gribSection1);
+
+ case 15:
+ return e_def_15_(inputArray,gribSection1);
+
+ case 16:
+ return e_def_16_(inputArray,gribSection1);
+
+ case 17:
+ return e_def_17_(inputArray,gribSection1,&zero) - 40;
+
+ case 18:
+ return e_def_18_(inputArray,gribSection1);
+
+ case 19:
+ return e_def_19_(inputArray,gribSection1);
+
+ case 20:
+ return e_def_20_(inputArray,gribSection1);
+
+ case 21:
+ return e_def_21_(inputArray,gribSection1);
+
+ case 22:
+ return e_def_22_(inputArray,gribSection1);
+
+ case 23:
+ return e_def_23_(inputArray,gribSection1,&zero) - 40;
+
+ case 24:
+ return e_def_24_(inputArray,gribSection1,&zero) - 40;
+
+ case 50:
+ return e_def_50_(inputArray,gribSection1);
+
+ case 191:
+ return e_def_191_(inputArray,gribSection1,&zero);
+
+ default:
+ return (fortint) -1;
+ }
+}
+
+fortint e_def_x( fortint * definitionNumber,
+ fortint * outputArray,
+ unsigned char * gribSection1 ) {
+ return e_def_x_(definitionNumber,outputArray,gribSection1);
+}
+
+fortint d_def_x_(
+ fortint * definitionNumber,
+ fortint * outputArray,
+ unsigned char * gribSection1 ) {
+/*
+// Calls the encoding routine for the ECMWF local definition.
+*/
+int number = (int) *definitionNumber;
+fortint zero = 0;
+
+ switch( number ) {
+
+ case 1:
+ return d_def_1_(outputArray,gribSection1);
+
+ case 2:
+ return d_def_2_(outputArray,gribSection1);
+
+ case 3:
+ return d_def_3_(outputArray,gribSection1);
+
+ case 4:
+ return d_def_4_(outputArray,gribSection1,&zero);
+
+ case 5:
+ return d_def_5_(outputArray,gribSection1);
+
+ case 6:
+ return d_def_6_(outputArray,gribSection1,&zero);
+
+ case 7:
+ return d_def_7_(outputArray,gribSection1);
+
+ case 8:
+ return d_def_8_(outputArray,gribSection1);
+
+ case 9:
+ return d_def_9_(outputArray,gribSection1);
+
+ case 10:
+ return d_def_10_(outputArray,gribSection1,&zero);
+
+ case 11:
+ return d_def_11_(outputArray,gribSection1);
+
+ case 13:
+ return d_def_13_(outputArray,gribSection1,&zero);
+
+ case 14:
+ return d_def_14_(outputArray,gribSection1);
+
+ case 15:
+ return d_def_15_(outputArray,gribSection1);
+
+ case 16:
+ return d_def_16_(outputArray,gribSection1);
+
+ case 17:
+ return d_def_17_(outputArray,gribSection1,&zero);
+
+ case 18:
+ return d_def_18_(outputArray,gribSection1);
+
+ case 19:
+ return d_def_19_(outputArray,gribSection1);
+
+ case 20:
+ return d_def_20_(outputArray,gribSection1);
+
+ case 21:
+ return d_def_21_(outputArray,gribSection1);
+
+ case 22:
+ return d_def_22_(outputArray,gribSection1);
+
+ case 23:
+ return d_def_23_(outputArray,gribSection1,&zero);
+
+ case 24:
+ return d_def_24_(outputArray,gribSection1,&zero);
+
+ case 50:
+ return d_def_50_(outputArray,gribSection1);
+
+ case 191:
+ return d_def_191_(outputArray,gribSection1,&zero);
+
+ default:
+ return (fortint) -1;
+ }
+}
+
+fortint d_def_x( fortint * definitionNumber,
+ fortint * outputArray,
+ unsigned char * gribSection1 ) {
+ return d_def_x_(definitionNumber,outputArray,gribSection1);
+}
+
+fortint e_190_x_(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * collectedLocalDefinitionBytes) {
+/*
+// Encodes ECMWF local definition 190 (from byte 41 onwards) into
+// gribSection1 using integer array values in inputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition190.html
+//
+// collectedLocalDefinitionBytes is an array containing the ready-prepared
+// collected local definition bytes of the multiple ECMWF local definitions.
+//
+// Returns the number of bytes (octets) in local definition 190 after
+// byte 40.
+*/
+fortint zero = 0;
+
+ return e_def_190_(inputArray,gribSection1,collectedLocalDefinitionBytes,&zero);
+
+}
+
+fortint e_190_x( fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * collectedLocalDefinitionBytes) {
+ return e_190_x_(inputArray,gribSection1,collectedLocalDefinitionBytes);
+}
+
+fortint d_190_x_(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * collectedLocalDefinitionBytes) {
+/*
+// Decodes ECMWF local definition 190 (from byte 41 onwards) from
+// gribSection1 into integer array values in outputArray.
+//
+// inputArray[0] corresponds to KSEC1(37) in the description at
+// http://www.ecmwf.int/publications/manuals/libraries/gribex/localDefinition190.html
+//
+// Returns the number of array elements inserted in outputArray
+*/
+fortint zero = 0;
+
+ return d_def_190_(outputArray,gribSection1,collectedLocalDefinitionBytes,&zero);
+
+}
+
+fortint d_190_x( fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * collectedLocalDefinitionBytes) {
+ return d_190_x_(outputArray,gribSection1,collectedLocalDefinitionBytes);
+}
+
+fortint jmemove_(
+ fortint * destination,
+ fortint * destinationOffset,
+ fortint * source,
+ fortint * sourceOffset,
+ fortint * length ) {
+unsigned char* Destination = (unsigned char*)destination + (*destinationOffset);
+unsigned char* Source = (unsigned char*)source + (*sourceOffset);
+size_t n = (size_t) (*length);
+void * result;
+
+ result = memmove(Destination, Source, n);
+ if( result == NULL )
+ return (fortint) -1;
+ else
+ return (fortint) ((*destinationOffset)+ (*length));
+}
+
+fortint jmemove( fortint * destination,
+ fortint * destinationOffset,
+ fortint * source,
+ fortint * sourceOffset,
+ fortint * length ) {
+ return jmemove_(destination,destinationOffset,source,sourceOffset,length);
+}
diff --git a/gribex/ECMWFdefinitions.h b/gribex/ECMWFdefinitions.h
new file mode 100755
index 0000000..f4074e3
--- /dev/null
+++ b/gribex/ECMWFdefinitions.h
@@ -0,0 +1,353 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef ECMWFDEFNS_H
+#define ECMWFDEFNS_H
+
+#include "fortint.h"
+
+void encodeMarsPart(fortint * inputArray, unsigned char * gribSection1);
+
+void decodeMarsPart(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_1(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_1(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_2(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_2(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_3(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_3(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_4(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint d_def_4(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint e_def_5(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_5(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_6(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint d_def_6(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint e_def_7(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_7(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_8(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_8(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_9(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_9(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_10(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint d_def_10(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint e_def_11(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_11(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_13(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint d_def_13(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint e_def_14(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_14(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_15(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_15(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_16(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_16(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_17(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint d_def_17(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint e_def_18(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_18(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_19(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_19(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_20(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_20(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_21(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_21(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_22(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_22(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_23(
+fortint * inputArray, unsigned char * gribSection1, fortint * bitPointer);
+
+fortint d_def_23(
+fortint * outputArray, unsigned char * gribSection1, fortint * bitPointer);
+
+fortint e_def_50(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_50(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_190(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * collectedLocalDefinitionBytes,
+ fortint * bitPointer);
+
+fortint d_def_190(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * collectedLocalDefinitionBytes,
+ fortint * bitPointer);
+
+fortint e_def_191(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint d_def_191(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint e_def_x(
+ fortint * definitionNumber,
+ fortint * outputArray,
+ unsigned char * gribSection1 );
+
+fortint d_def_x(
+ fortint * definitionNumber,
+ fortint * outputArray,
+ unsigned char * gribSection1 );
+
+fortint jmemove(
+ fortint * destination,
+ fortint * destinationOffset,
+ fortint * source,
+ fortint * sourceOffset,
+ fortint * length );
+
+fortint e_def_1_(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_1_(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_2_(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_2_(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_3_(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_3_(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_4_(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint d_def_4_(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint e_def_5_(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_5_(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_6_(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint d_def_6_(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint e_def_7_(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_7_(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_8_(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_8_(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_9_(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_9_(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_10_(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint d_def_10_(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint e_def_11_(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_11_(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_13_(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint d_def_13_(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint e_def_14_(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_14_(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_15_(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_15_(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_16_(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_16_(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_17_(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint d_def_17_(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint e_def_18_(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_18_(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_19_(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_19_(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_20_(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_20_(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_21_(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_21_(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_50_(fortint * inputArray, unsigned char * gribSection1);
+
+fortint d_def_50_(fortint * outputArray, unsigned char * gribSection1);
+
+fortint e_def_190_(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * collectedLocalDefinitionBytes,
+ fortint * bitPointer);
+
+fortint d_def_190_(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * collectedLocalDefinitionBytes,
+ fortint * bitPointer);
+
+fortint e_def_191_(
+ fortint * inputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint d_def_191_(
+ fortint * outputArray,
+ unsigned char * gribSection1,
+ fortint * bitPointer);
+
+fortint e_def_x(
+ fortint * definitionNumber,
+ fortint * outputArray,
+ unsigned char * gribSection1 );
+
+fortint d_def_x(
+ fortint * definitionNumber,
+ fortint * outputArray,
+ unsigned char * gribSection1 );
+
+fortint jmemove_(
+ fortint * destination,
+ fortint * destinationOffset,
+ fortint * source,
+ fortint * sourceOffset,
+ fortint * length );
+
+#define ONEBYTEINT(a) (fortint) ( *(a) )
+#define TWOBYTEINT(a) (fortint) ( (*(a))<<8 | (*((a)+1))<<0 )
+#define THREEBYTEINT(a) (fortint) (TWOBYTEINT((a))<<8 | (*((a)+2))<<0 )
+#define FOURBYTEINT(a) (fortint) (THREEBYTEINT((a))<<8 | (*((a)+3))<<0 )
+
+#define ONEBYTE(n) ((*(n)>> 0) & 0xFF)
+#define MOVE1BYTE(p,n) ( *(p) = ((*(n)>> 0) & 0xFF) )
+#define MOVE2BYTES(p,n) ( *(p) = ((*(n)>> 8) & 0xFF) ) , \
+ ( *((p)+1) = ((*(n)>> 0) & 0xFF) )
+#define MOVE3BYTES(p,n) ( *(p) = ((*(n)>>16) & 0xFF) ) , \
+ ( *((p)+1) = ((*(n)>> 8) & 0xFF) ) , \
+ ( *((p)+2) = ((*(n)>> 0) & 0xFF) )
+#define MOVE4BYTES(p,n) ( *(p) = ((*(n)>>24) & 0xFF) ) , \
+ ( *((p)+1) = ((*(n)>>16) & 0xFF) ) , \
+ ( *((p)+2) = ((*(n)>> 8) & 0xFF) ) , \
+ ( *((p)+3) = ((*(n)>> 0) & 0xFF) )
+
+#endif /* End of ECMWFDEFNS_H */
diff --git a/gribex/Makefile b/gribex/Makefile
new file mode 100755
index 0000000..7d07075
--- /dev/null
+++ b/gribex/Makefile
@@ -0,0 +1,31 @@
+#
+# Makefile for libemos/gribex
+#
+LIBRARY = ../lib$(LIB)$(R64).a
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+TARGETS = all clean
+#
+include sources.$(ARCH)
+#
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.F) $(OBJECTS.c)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+$(LIBRARY): $(OBJECTS) $(EXTRAOBJ)
+ $(AR) $(ARFLAGS) $@ $?
+ $(RANLIB) $@
+
+include make.dep
+
+clean:
+ \rm -f $(OBJECTS) *.f
+
diff --git a/gribex/Makefile.in b/gribex/Makefile.in
new file mode 100755
index 0000000..45629b1
--- /dev/null
+++ b/gribex/Makefile.in
@@ -0,0 +1,37 @@
+#
+# Makefile for gribex
+#
+A64 = plat
+R64 = reals
+ARCH = arch
+LIB = depl
+CNAME = comp
+
+LIBRARY = ../lib$(LIB)$(R64).a
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+TARGETS = all clean
+#
+include sources.$(ARCH)
+#
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.F) $(OBJECTS.c)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+$(LIBRARY): $(OBJECTS) $(EXTRAOBJ)
+ $(AR) $(ARFLAGS) $@ $?
+ $(RANLIB) $@
+
+include make.dep
+
+clean:
+ \rm -f $(OBJECTS) *.f
+
diff --git a/gribex/Makefile.shared b/gribex/Makefile.shared
new file mode 100755
index 0000000..2f65824
--- /dev/null
+++ b/gribex/Makefile.shared
@@ -0,0 +1,32 @@
+#
+# Makefile for libemos/gribex
+#
+LIBRARY = ../lib$(LIB)$(R64).so
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+PROFILE=$(SHLIB)
+
+TARGETS = all clean
+#
+include sources.$(ARCH)
+#
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.F) $(OBJECTS.c)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+$(LIBRARY): $(OBJECTS) $(EXTRAOBJ)
+ $(CC) $(DYNLINKFLAGS) $? -o $@
+
+include make.dep
+
+clean:
+ \rm -f $(OBJECTS) *.f
+
diff --git a/gribex/README b/gribex/README
new file mode 100755
index 0000000..4cf7a12
--- /dev/null
+++ b/gribex/README
@@ -0,0 +1,5 @@
+This directory contains a mixture of software, most of which was in the GRIB
+decoding and encoding update library. The software in this directory is used
+to make part of the libemos library.
+
+John Chambers 30th July 1993.
diff --git a/gribex/abortx.F b/gribex/abortx.F
new file mode 100755
index 0000000..af79387
--- /dev/null
+++ b/gribex/abortx.F
@@ -0,0 +1,153 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ABORTX (HNAME)
+C
+C---->
+C**** ABORTX - Terminates execution of program.
+C
+C Purpose.
+C --------
+C
+C Terminates execution of program.
+C
+C** Interface.
+C ----------
+C
+C CALL ABORTX (HNAME)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HNAME - Name of calling routine.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C Prints message and terminates.
+C
+C Externals.
+C ----------
+C
+#ifdef VAX
+C EXIT
+#endif
+#if (defined IBM) && (!defined rs6000)
+C SYSABN
+#endif
+#ifdef CRAY
+C ABORT
+#endif
+#if defined(sun) || defined (sgi) || (defined rs6000)
+C ABORT
+#endif
+#ifdef CYBER
+C ABORT
+#endif
+#ifdef __uxp__
+C ABORT
+#endif
+#ifdef __hpux
+C JABORT
+#endif
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+#ifdef VAX
+C VAX version of routine.
+#endif
+#if (defined IBM) && (!defined rs6000)
+C IBM version of routine.
+#endif
+#ifdef CRAY
+C Cray version of routine.
+#endif
+#if defined(sun) || defined (sgi)
+C SUN/SGI version of routine.
+#endif
+#ifdef CYBER
+C Cyber version of routine.
+#endif
+#ifdef __uxp__
+C Fujitsu version of routine.
+#endif
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 13.11.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+ CHARACTER*(*) HNAME
+C
+C ------------------------------------------------------------------
+C* Section 1 . Print message and terminate.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WRITE(GRPRSM,9001) HNAME
+C
+#ifdef VAX
+ CALL EXIT (-1)
+#endif
+#if (defined IBM) && (!defined rs6000)
+ CALL SYSABN (1)
+#endif
+#ifdef CRAY
+ CALL ABORT
+#endif
+#ifdef CYBER
+ CALL ABORT ('US',0,' ')
+#endif
+#if defined(__uxp__)
+ CALL ABORT
+#endif
+#if defined(sun) || defined (sgi) || (defined rs6000)
+ CALL ABORT
+#endif
+#ifdef __hpux
+ CALL JABORT
+#endif
+C
+C ------------------------------------------------------------------
+C* Section 9 . Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ 9001 FORMAT (1H ,'ABORTX : Routine ',A,' has requested program',
+ C ' termination.')
+C
+ RETURN
+C
+ END
diff --git a/gribex/analsw.F b/gribex/analsw.F
new file mode 100755
index 0000000..174b44a
--- /dev/null
+++ b/gribex/analsw.F
@@ -0,0 +1,397 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE ANALSW(IBLOCKS,LOGICS,ILENGL,INTEGS,ILENGI,
+ S REALSW,ILENGR)
+C---->
+C
+C G.K.SAKELLARIDES ECMWF 15/10/85.
+C
+C PURPOSE.
+C --------
+C
+C TO GET AS OUTPUT THE NAME AND CONTENT OF VARIABLES WHICH
+C APPEAR IN THE DECODED MARS MODEL SWITCH RECORD
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *ALALSW(IBLOCKS,LOGICS,ILENGL,INTEGS,ILENGI,REALSW,
+C ILENGR)
+C WHERE:
+C INPUT PARAMETERS
+C 1.*IBLOCKS* INTEGER ARRAY OF LENGTH 29 CONTAINING
+C THE FOLLOWING INFORMATIONS OF BLOCK1.
+C 2.*LOGICS* LOGICAL ARRAY WHICH CONTAINS THE LOGICALS.
+C 3.*ILENGL* ACTUAL LENGTH OF LOGICALS
+C 4.*INSOUT* INTEGER ARRAY WHICH CONTAINS THE INTEGER
+C 5.*ILENGI* ACTUAL LENGTH OF INTEGER
+C 6.*REALSW* REAL ARRAY WHICH CONTAINS THE REALS.
+C 7.*ILENGR* ACTUAL LENGTH OF REALS
+C
+C EXTERNALS.
+C ----------
+C
+C *NONE*
+C----<
+C
+ CHARACTER *45,Y1(26),YL(26)
+ CHARACTER *12,YY
+ CHARACTER *45,YI1(6),YI2,YI3(14),YI4,YI5,YI6(10),YI7,YI8,YI9
+ CHARACTER *45,YR1(2),YR2,YR3(53),YR4,YR5,YR6,YR7,YR8(26)
+ DIMENSION INTEGS(*),REALSW(*),IBLOCKS(*)
+ LOGICAL LOGICS(*)
+ DATA YY/' POSITION='/
+ DATA (Y1(I),I=1,14)
+ D /' G =',
+ D ' R =',
+ D ' I =',
+ D ' B =',
+ D 'IDENTIFICATION OF CENTRE. =',
+ D 'MODEL IDENTIFICATION =',
+ D 'GRID DEFINITION =',
+ D 'FLAG (CODE TABLE 1) =',
+ D 'PARAM. INDICATING THE MARS MODEL SWITCH REC.=',
+ D 'TYPE OF LEVEL (CODE TABLE 3) =',
+ D 'VALUE 1 OF LEVEL (CODE TABLE 3) =',
+ D 'VALUE 2 OF LEVEL (CODE TABLE 3) =',
+ D 'YEAR OF INITIAL DATA =',
+ D 'MONTH OF INITIAL DATA ='/
+ DATA (Y1(I),I=15,26)
+ D /'DAY OF INITIAL DATA =',
+ D 'HOUR OF INITIAL DATA =',
+ D 'MINUTE OF INITIAL DATA =',
+ D 'TIME UNIT (CODE TABLE 4) =',
+ D 'TIME RANGE 1 =',
+ D 'TIME RANGE 2 =',
+ D 'TIME RANGE FLAG (CODE TABLE 5) =',
+ D 'LENGTH OF DATA BLOCK (OCTET) =',
+ D 'STARTING ADDRESS OF LOGICAL SECTION(OCTET) =',
+ D 'STARTING ADDRESS OF INTEGER SECTION(OCTET) =',
+ D 'STARTING ADDRESS OF REAL SECTION(OCTET) =',
+ D 'LENGTH OF REAL SECTION(OCTET) ='/
+ DATA (YL(I),I=1,15)
+ D /'LZLS LOGICAL FROM COMMON *COMDIZ* =',
+ D 'LSIMDT LOGICAL FROM COMMON *COMDSW* =',
+ D 'LSIMZQ LOGICAL FROM COMMON *COMDSW* =',
+ D 'LVTMPC1 LOGICAL FROM COMMON *COMDSW* =',
+ D 'LVTMPC2 LOGICAL FROM COMMON *COMDSW* =',
+ D 'LLDIFF LOGICAL FROM COMMON *COMNMI* =',
+ D 'LLROSS LOGICAL FROM COMMON *COMNMI* =',
+ D 'LLPROJ LOGICAL FROM COMMON *COMNMI* =',
+ D 'LLZA LOGICAL FROM COMMON *COMNMI* =',
+ D 'LLPSRS LOGICAL FROM COMMON *COMNMI* =',
+ D 'LLTEND LOGICAL FROM COMMON *COMNMI* =',
+ D 'LLDIAB LOGICAL FROM COMMON *COMNMI* =',
+ D 'LLFILT LOGICAL FROM COMMON *COMNMI* =',
+ D 'LPHYS LOGICAL FROM COMMON *COMPSW* =',
+ D 'LVDIFF LOGICAL FROM COMMON *COMPSW* ='/
+ DATA (YL(I),I=16,26)
+ D /'LKUO LOGICAL FROM COMMON *COMPSW* =',
+ D 'LCOND LOGICAL FROM COMMON *COMPSW* =',
+ D 'LQNEGAT LOGICAL FROM COMMON *COMPSW* =',
+ D 'LSURF LOGICAL FROM COMMON *COMPSW* =',
+ D 'LSCV LOGICAL FROM COMMON *COMPSW* =',
+ D 'LKUO0 LOGICAL FROM COMMON *COMPSW* =',
+ D 'LESFT LOGICAL FROM COMMON *COMPSW* =',
+ D 'LEVAP LOGICAL FROM COMMON *COMPSW* =',
+ D 'LSNRN LOGICAL FROM COMMON *COMPSW* =',
+ D 'LRAD LOGICAL FROM COMMON *COMRSW* =',
+ D 'LDIUR LOGICAL FROM COMMON *COMRSW* ='/
+ DATA YI1/'NCYCLE INTEGER FROM COMMON *COMDOC* =',
+ D 'NVERS INTEGER FROM COMMON *COMDOC* =',
+ D 'NM INTEGER FROM COMMON *COMCTL* =',
+ D 'NN INTEGER FROM COMMON *COMCTL* =',
+ D 'NK INTEGER FROM COMMON *COMCTL* =',
+ D 'NGL INTEGER FROM COMMON *COMCTL* ='/
+ DATA YI2/'NLON( ) INTEGER FROM COMMON *COMCTL* ='/
+ DATA YI3/'NLEV INTEGER FROM COMMON *COMCTL* =',
+ D 'NVCLEV INTEGER FROM COMMON *COMCTL* =',
+ D 'NUMZLS INTEGER FROM COMMON *COMDIZ* =',
+ D 'NFRZLS INTEGER FROM COMMON *COMDIZ* =',
+ D 'NDTSCVL INTEGER FROM COMMON *COMDIZ* =',
+ D 'NDTSCVS INTEGER FROM COMMON *COMDIZ* =',
+ D 'NDQSCVL INTEGER FROM COMMON *COMDIZ* =',
+ D 'NDQSCVS INTEGER FROM COMMON *COMDIZ* =',
+ D 'NDUSCVL INTEGER FROM COMMON *COMDIZ* =',
+ D 'NDUSCVS INTEGER FROM COMMON *COMDIZ* =',
+ D 'NDVSCVL INTEGER FROM COMMON *COMDIZ* =',
+ D 'NDVSCVS INTEGER FROM COMMON *COMDIZ* =',
+ D 'NDESCVL INTEGER FROM COMMON *COMDIZ* =',
+ D 'NDESCVS INTEGER FROM COMMON *COMDIZ* ='/
+ DATA YI4/'NLANDP( ) INTEGER FROM COMMON *COMDIZ* ='/
+ DATA YI5/'NSEAP( ) INTEGER FROM COMMON *COMDIZ* ='/
+ DATA YI6/'NMASKA INTEGER FROM COMMON *COMMSK* =',
+ D 'NMASKV INTEGER FROM COMMON *COMMSK* =',
+ D 'NFRMSK INTEGER FROM COMMON *COMMSK* =',
+ D 'NFRMSKP INTEGER FROM COMMON *COMMSK* =',
+ D 'NRSLT INTEGER FROM COMMON *COMMSK* =',
+ D 'NITNINI INTEGER FROM COMMON *COMNMI* =',
+ D 'NDIFFST INTEGER FROM COMMON *COMNMI* =',
+ D 'NVM INTEGER FROM COMMON *COMNMI* =',
+ D 'NRADFR INTEGER FROM COMMON *COMRSW* =',
+ D 'NRINT INTEGER FROM COMMON *COMRSW* ='/
+ DATA YI7/'NTRM( ) INTEGER FROM COMMON *COMTRU* ='/
+ DATA YI8/'NTRN( ) INTEGER FROM COMMON *COMTRU* ='/
+ DATA YI9/'NTRK( ) INTEGER FROM COMMON *COMTRU* ='/
+ DATA YR1/'DTIME REAL FROM COMMON *COMCTL* =',
+ D 'EPS REAL FROM COMMON *COMCTL* ='/
+ DATA YR2/'VCT( ) REAL FROM COMMON *COMCTL* ='/
+ DATA (YR3(I),I=1,15)
+ D /'CDIATS REAL FROM COMMON *COMDIA* =',
+ D 'CDIATD REAL FROM COMMON *COMDIA* =',
+ D 'CDIAWD REAL FROM COMMON *COMDIA* =',
+ D 'GPEO REAL FROM COMMON *COMDIA* =',
+ D 'GKEO REAL FROM COMMON *COMDIA* =',
+ D 'GQMO REAL FROM COMMON *COMDIA* =',
+ D 'GTSO REAL FROM COMMON *COMDIA* =',
+ D 'GTDO REAL FROM COMMON *COMDIA* =',
+ D 'GWSO REAL FROM COMMON *COMDIA* =',
+ D 'GWDO REAL FROM COMMON *COMDIA* =',
+ D 'GSNO REAL FROM COMMON *COMDIA* =',
+ D 'DSRADO REAL FROM COMMON *COMDIA* =',
+ D 'DTRADO REAL FROM COMMON *COMDIA* =',
+ D 'DSRADS REAL FROM COMMON *COMDIA* =',
+ D 'DTRADS REAL FROM COMMON *COMDIA* ='/
+ DATA (YR3(I),I=16,30)
+ D /'DVDIS REAL FROM COMMON *COMDIA* =',
+ D 'DHFS REAL FROM COMMON *COMDIA* =',
+ D 'DEVAP REAL FROM COMMON *COMDIA* =',
+ D 'DCVFR REAL FROM COMMON *COMDIA* =',
+ D 'DCVQAC REAL FROM COMMON *COMDIA* =',
+ D 'DCVMOI REAL FROM COMMON *COMDIA* =',
+ D 'DCVGR REAL FROM COMMON *COMDIA* =',
+ D 'DCVGS REAL FROM COMMON *COMDIA* =',
+ D 'DCVMS REAL FROM COMMON *COMDIA* =',
+ D 'DCVER REAL FROM COMMON *COMDIA* =',
+ D 'DCVES REAL FROM COMMON *COMDIA* =',
+ D 'DLSGR REAL FROM COMMON *COMDIA* =',
+ D 'DLSGS REAL FROM COMMON *COMDIA* =',
+ D 'DLSMS REAL FROM COMMON *COMDIA* =',
+ D 'DLSER REAL FROM COMMON *COMDIA* ='/
+ DATA (YR3(I),I=31,45)
+ D /'DLSES REAL FROM COMMON *COMDIA* =',
+ D 'DSSRAD REAL FROM COMMON *COMDIA* =',
+ D 'DSTRAD REAL FROM COMMON *COMDIA* =',
+ D 'DSHFL REAL FROM COMMON *COMDIA* =',
+ D 'DSDTFL REAL FROM COMMON *COMDIA* =',
+ D 'DSLSR REAL FROM COMMON *COMDIA* =',
+ D 'DSLSS REAL FROM COMMON *COMDIA* =',
+ D 'DSCVR REAL FROM COMMON *COMDIA* =',
+ D 'DSCVS REAL FROM COMMON *COMDIA* =',
+ D 'DSEVW REAL FROM COMMON *COMDIA* =',
+ D 'DSEVI REAL FROM COMMON *COMDIA* =',
+ D 'DSDWFL REAL FROM COMMON *COMDIA* =',
+ D 'DSSNMT REAL FROM COMMON *COMDIA* =',
+ D 'DDCTFL REAL FROM COMMON *COMDIA* =',
+ D 'DDCWFL REAL FROM COMMON *COMDIA* ='/
+ DATA (YR3(I),I=46,53)
+ D /'DSROS REAL FROM COMMON *COMDIA* =',
+ D 'DSROD REAL FROM COMMON *COMDIA* =',
+ D 'DADCON REAL FROM COMMON *COMDIA* =',
+ D 'DIFVO REAL FROM COMMON *COMHDI* =',
+ D 'DIFD REAL FROM COMMON *COMHDI* =',
+ D 'DIFT REAL FROM COMMON *COMHDI* =',
+ D 'DIFQ REAL FROM COMMON *COMHDI* =',
+ D 'CDRAG REAL FROM COMMON *COMHDI* ='/
+ DATA YR4/'ALATN( ) REAL FROM COMMON *COMMSK* ='/
+ DATA YR5/'ALATS( ) REAL FROM COMMON *COMMSK* ='/
+ DATA YR6/'ALONE( ) REAL FROM COMMON *COMMSK* ='/
+ DATA YR7/'ALONW( ) REAL FROM COMMON *COMMSK* ='/
+ DATA (YR8(I),I=1,15)
+ D /'DTINIT ) REAL FROM COMMON *COMNMI* =',
+ D 'DTDIFF ) REAL FROM COMMON *COMNMI* =',
+ D 'PHYFIL REAL FROM COMMON *COMNMI* =',
+ D 'WSMAX REAL FROM COMMON *COMPSW* =',
+ D 'BETADT REAL FROM COMMON *COMSIM* =',
+ D 'BETAZQ REAL FROM COMMON *COMSIM* =',
+ D 'APR REAL FROM COMMON *COMSIM* =',
+ D 'TR REAL FROM COMMON *COMSIM* =',
+ D 'VCRIT REAL FROM COMMON *COMSIM* =',
+ D 'HDAMP REAL FROM COMMON *COMSIM* =',
+ D 'GVO REAL FROM COMMON *COMSTA* =',
+ D 'GD REAL FROM COMMON *COMSTA* =',
+ D 'GQ REAL FROM COMMON *COMSTA* =',
+ D 'GT REAL FROM COMMON *COMSTA* =',
+ D 'GPS REAL FROM COMMON *COMSTA* ='/
+ DATA (YR8(I),I=16,26)
+ D /'GKE REAL FROM COMMON *COMSTA* =',
+ D 'GPE REAL FROM COMMON *COMSTA* =',
+ D 'GTE REAL FROM COMMON *COMSTA* =',
+ D 'GLQ REAL FROM COMMON *COMSTA* =',
+ D 'GTPE REAL FROM COMMON *COMSTA* =',
+ D 'GQM REAL FROM COMMON *COMSTA* =',
+ D 'GTS REAL FROM COMMON *COMSTA* =',
+ D 'GTD REAL FROM COMMON *COMSTA* =',
+ D 'GWS REAL FROM COMMON *COMSTA* =',
+ D 'GWD REAL FROM COMMON *COMSTA* =',
+ D 'GSN REAL FROM COMMON *COMSTA* ='/
+C
+C* 1. LOCAL VARIABLES
+C
+ 100 CONTINUE
+ INGL=INTEGS(6)
+ INVCLEV=INTEGS(6+INGL+2)
+ INLEV=INTEGS(6+INGL+1)
+C INDEX FOR INTEGERS
+ J1A=1
+ J1T=6
+ J2A=J1T+1
+ J2T=J2A+INGL-1
+ J3A=J2T+1
+ J3T=J3A+14-1
+ J4A=J3T+1
+ J4T=J4A+INGL-1
+ J5A=J4T+1
+ J5T=J5A+INGL-1
+ J6A=J5T+1
+ J6T=J6A+10-1
+ J7A=J6T+1
+ J7T=J7A+INLEV-1
+ J8A=J7T+1
+ J8T=J8A+INLEV-1
+ J9A=J8T+1
+ J9T=J9A+INLEV-1
+C INDEX FOR REALS
+ I1A=1
+ I1T=I1A+2-1
+ I2A=I1T+1
+ I2T=I2A+2*INVCLEV-1
+ I3A=I2T+1
+ I3T=I3A+53-1
+ I4A=I3T+1
+ I4T=I4A+32-1
+ I5A=I4T+1
+ I5T=I5A+32-1
+ I6A=I5T+1
+ I6T=I6A+32-1
+ I7A=I6T+1
+ I7T=I7A+32-1
+ I8A=I7T+1
+ I8T=I8A+26-1
+ PRINT*,' J9T=',J9T,'INTL=',ILENGI,'I8T=',I8T,'REAL=',ILENGR
+ IF (I8T.NE.ILENGR) THEN
+ GO TO 900
+ ENDIF
+C
+C* 2.BLOCK 0 AND 1
+C
+ 200 CONTINUE
+ IMET=0
+ WRITE(*,1100)
+ DO 210 I=1,29
+ IF (I.EQ.22.OR.I.EQ.23.OR.I.EQ.24) THEN
+ GO TO 210
+ ENDIF
+ IMET=IMET+1
+ WRITE(*,'(1X,A,I6,1X,A,I4)') Y1(IMET),IBLOCKS(I),YY,I
+ 210 CONTINUE
+C
+C* 3.LOGICALS
+C
+ 300 CONTINUE
+ WRITE(*,1200)
+ DO 310 I=1,ILENGL
+ WRITE(*,'(1X,A,L6,1X,A,I4)') YL(I),LOGICS(I),YY,I
+ 310 CONTINUE
+C
+C* 4.INTEGER
+C
+ 400 CONTINUE
+ WRITE(*,1300)
+ DO 410 I=J1A,J1T
+ WRITE(*,'(1X,A,I6,1X,A,I4)') YI1(I),INTEGS(I),YY,I
+ 410 CONTINUE
+ DO 420 I=J2A,J2T
+ WRITE(*,'(1X,A,I6,1X,A,I4)') YI2,INTEGS(I),YY,I
+ 420 CONTINUE
+ META3=0
+ DO 430 I=J3A,J3T
+ META3=META3+1
+ WRITE(*,'(1X,A,I6,1X,A,I4)') YI3(META3),INTEGS(I),YY,I
+ 430 CONTINUE
+ DO 440 I=J4A,J4T
+ WRITE(*,'(1X,A,I6,1X,A,I4)') YI4,INTEGS(I),YY,I
+ 440 CONTINUE
+ DO 450 I=J5A,J5T
+ WRITE(*,'(1X,A,I6,1X,A,I4)') YI5,INTEGS(I),YY,I
+ 450 CONTINUE
+ META6=0
+ DO 460 I=J6A,J6T
+ META6=META6+1
+ WRITE(*,'(1X,A,I6,1X,A,I4)') YI6(META6),INTEGS(I),YY,I
+ 460 CONTINUE
+ DO 470 I=J7A,J7T
+ WRITE(*,'(1X,A,I6,1X,A,I4)') YI7,INTEGS(I),YY,I
+ 470 CONTINUE
+ DO 480 I=J8A,J8T
+ WRITE(*,'(1X,A,I6,1X,A,I4)') YI8,INTEGS(I),YY,I
+ 480 CONTINUE
+ DO 490 I=J9A,J9T
+ WRITE(*,'(1X,A,I6,1X,A,I4)') YI9,INTEGS(I),YY,I
+ 490 CONTINUE
+C
+C* 5. REALS
+C
+ 500 CONTINUE
+ WRITE(*,1400)
+ DO 510 I=I1A,I1T
+ WRITE(*,'(1X,A,G12.6,1X,A,I4)') YR1(I),REALSW(I),YY,I
+ 510 CONTINUE
+ DO 520 I=I2A,I2T
+ WRITE(*,'(1X,A,G12.6,1X,A,I4)') YR2,REALSW(I),YY,I
+ 520 CONTINUE
+ METR3=0
+ DO 530 I=I3A,I3T
+ METR3=METR3+1
+ WRITE(*,'(1X,A,G12.6,1X,A,I4)') YR3(METR3),REALSW(I),YY,I
+ 530 CONTINUE
+ DO 540 I=I4A,I4T
+ WRITE(*,'(1X,A,G12.6,1X,A,I4)') YR4,REALSW(I),YY,I
+ 540 CONTINUE
+ DO 550 I=I5A,I5T
+ WRITE(*,'(1X,A,G12.6,1X,A,I4)') YR5,REALSW(I),YY,I
+ 550 CONTINUE
+ DO 560 I=I6A,I6T
+ WRITE(*,'(1X,A,G12.6,1X,A,I4)') YR6,REALSW(I),YY,I
+ 560 CONTINUE
+ DO 570 I=I7A,I7T
+ WRITE(*,'(1X,A,G12.6,1X,A,I4)') YR7,REALSW(I),YY,I
+ 570 CONTINUE
+ METR8=0
+ DO 580 I=I8A,I8T
+ METR8=METR8+1
+ WRITE(*,'(1X,A,G12.6,1X,A,I4)') YR8(METR8),REALSW(I),YY,I
+ 580 CONTINUE
+C
+C* 6. RETURN
+C
+ 600 CONTINUE
+C
+ RETURN
+C
+C
+C* 9.ERRORS
+C
+ 900 CONTINUE
+ WRITE(*,9901)
+ WRITE(*,'(A)') 'ERROR IN THE LENGTH OF REALS'
+ CALL ENDRUN
+ STOP
+ 9901 FORMAT('ERROR IN SUBROUTINE ANALSW')
+C
+C*
+C
+ 1100 FORMAT('1',20X,'VARIABLES OF BLOCK 0 AND 1')
+ 1200 FORMAT('1',20X,'LOGICAL')
+ 1300 FORMAT('1',20X,'INTEGER')
+ 1400 FORMAT('1',20X,'REAL ')
+ END
diff --git a/gribex/blckcr.F b/gribex/blckcr.F
new file mode 100755
index 0000000..e152d5c
--- /dev/null
+++ b/gribex/blckcr.F
@@ -0,0 +1,165 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+#ifdef CRAY
+ SUBROUTINE BLCKCR (UN1,UN2,BUF,IRET)
+C
+C---->
+C**********************************************************************
+C* *
+C* NAME : BLCKCR
+C* *
+C* FUNCTION : CONVERTS AN UNBLOCKED DATASET *
+C* INTO A BLOCKED DATASET *
+C* *
+C* INPUT : UN1 = INPUT LUN *
+C* UN2 = OUTPUT LUN *
+C* BUF = WORK AREA
+C* *
+C* OUTPUT : IRET = -100 BUFFER IN ERROR *
+C* = -200 BUFFER OUT ERROR *
+C* > 0 NO. OF RECORDS WRITTEN *
+C* < 0 ERRORS REPORTED BY SUBROUTINES *
+C* *
+C* GENERAL : BLCKCR CALLS RECLEN *
+C* OFFSET *
+C* MODVAL *
+C* *
+C* AUTHOR : B.V. GURETZKY V.E. DAY *
+C* *
+C* MODIFIED : J. HENNESSY 26.11.85 *
+C* " 24.06.86
+C* " 19.08.86
+C* *
+C**********************************************************************
+C----<
+C
+ IMPLICIT INTEGER (B,U)
+ DIMENSION BUF(*)
+C
+C NO. OF BITS PER CRAY WORD
+ DATA NBIT /64/
+C
+C BLOCK LENGTH FOR CRAY FILES (ICB) = 512
+ DATA ICB /512/
+C
+C
+ IRET = 0
+ IRES = 0
+ INT1 = 0
+ IOFF = 0
+ IPR = 1
+
+C READ FIRST BLOCK AND GET LENGTH OF FIRST DATA RECORD.
+C
+ BUFFER IN (UN1,0) (BUF(1),BUF(ICB))
+ IF (UNIT(UN1)) 100,5500,10000
+C
+ 100 CALL RECLEN (BUF(1),LEN,NBIT,ICODE,INDIC,LEVEL,KERR)
+ IF (KERR.NE.0)
+ C THEN
+ IRET = KERR
+ RETURN
+ ENDIF
+C
+C PRINT RECORD LENGTH , IF REQUIRED.
+C
+ IF (IPR.EQ.1) WRITE (*,9111) LEN
+ 9111 FORMAT (1H ,'BLCKCR : RECORD LENGTH (BYTES) = ',I9)
+C MAKE LENGTH MULTIPLE OF ICB
+C
+ LENW = LEN / 8
+ CALL MODVAL (LENW,IE,ICB)
+ IB = ICB
+C
+ DO 5000 J = 1,10000
+C
+C READ ENOUGH BLOCKS TO INCLUDE REMAINDER OF CURRENT
+C DATA RECORD.
+C
+ IF (IPR.EQ.1) WRITE (*,9112) IB , IE
+ 9112 FORMAT (1H ,'BLCKCR : IB = ',I8,' IE = ',I8)
+ IF (IB.NE.IE)
+ C THEN
+ BUFFER IN (UN1,0) (BUF(IB+1),BUF(IE))
+ IOSTAT = UNIT(UN1)
+ IF (IPR.EQ.1) WRITE (*,7878) IOSTAT
+ 7878 FORMAT (1H ,'IOSTAT = ',I4)
+ IF (UNIT(UN1)) 1000,5500,10000
+ ENDIF
+C
+C WRITE FIELD IN UNBLOCKED FORMAT
+C
+ 1000 BUFFER OUT (UN2,0) (BUF(1),BUF(LENW))
+ IOSTAT = UNIT(UN2)
+ IF (IOSTAT.GT.0) GO TO 10100
+ IRET = IRET + 1
+C
+C MOVE REMAINDER OF BLOCK TO FRONT OF BUFFER.
+C
+ INTER = IE - LENW
+ DO 2000 K = 1,INTER
+ BUF(K) = BUF(LENW+K)
+ 2000 CONTINUE
+ IB = INTER
+C
+C READ NEXT BLOCK TO CHECK LENGTH OF NEXT RECORD
+C AND END-OF-FILE
+C
+ IF (INTER.LT.ICB)
+ C THEN
+ BUFFER IN (UN1,0) (BUF(INTER+1),BUF(INTER+ICB))
+ IF (UNIT(UN1)) 3000,2500,10000
+ 2500 CONTINUE
+ BUFFER IN (UN1,0) (BUF(INTER+1),BUF(INTER+ICB))
+ IF (UNIT(UN1)) 3000,5500,10000
+ 3000 CONTINUE
+ IB = IB + ICB
+ ENDIF
+C
+C GET LENGTH FOR NEXT RECORD.
+C
+ CALL RECLEN (BUF(1),LEN,NBIT,ICODE,INDIC,LEVEL,KERR)
+ IF (KERR.NE.0)
+ C THEN
+ IRET = KERR
+ RETURN
+ ENDIF
+C
+ LENW = LEN / 8
+C
+C MAKE LENGTH MULTIPLE OF ICB
+C
+ INT = LENW - IB
+ CALL MODVAL (INT,IE,ICB)
+C
+C READ OF SHORT RECORDS MAY BE COMPLETE.
+C
+ IF (INT.LT.0) IE = 0
+ IE = IB + IE
+
+ 5000 CONTINUE
+
+ 5500 CONTINUE
+
+ RETURN
+C
+10000 CONTINUE
+ IRET = -100
+ WRITE (*,*) ' BLCKCR : BUFFER IN ERROR'
+ RETURN
+C
+10100 CONTINUE
+ IRET = -200
+ WRITE (*,*) ' BLCKCR : BUFFER OUT ERROR'
+ RETURN
+C
+ END
+#endif
diff --git a/gribex/bt_cray.F b/gribex/bt_cray.F
new file mode 100755
index 0000000..0aa325c
--- /dev/null
+++ b/gribex/bt_cray.F
@@ -0,0 +1,1153 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+ C KBLEN,HFUNC,KRET)
+C
+C---->
+C**** INXBIT - Insert/extract bits consecutively in/from a given array
+C
+C Purpose.
+C --------
+C
+C Take rightmost KBLEN bits from KNUM words of KPARM
+C and insert them consecutively in KGRIB, starting at
+C bit after KNSPT or vice versa.
+C
+C** Interface.
+C ----------
+C
+C CALL INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+C C KBLEN,KRET)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KGRIB - Array containing bitstream.
+C KLENG - Length (words) of this array.
+C KNSPT - Bit number after which insertion or
+C extraction starts.
+C KPARM - Array from which bits are taken for
+C insertion in the bitstream or to which
+C bits are extracted from the bitstream.
+C KBIT - Number of bits in computer word.
+C KNUM - Number of bit fields inserted/extracted.
+C KBLEN - Number of bits per bit field.
+C HFUNC - Requested function.
+C 'C' to insert bits in bitstream,
+C 'D' to extract bits from bitstream.
+C
+C Output Parameters.
+C ------------------
+C
+C KNSPT - Bit number of last bit inserted/extracted.
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Insertion/extraction exceeded
+C array boundary.
+C
+C Method.
+C -------
+C
+C Word and offset pointer calculated before calling
+C insertion/extraction routines.
+C
+C Externals.
+C ----------
+C
+C SBYTES
+C GBYTES
+C GSBITE
+C
+C Reference.
+C ----------
+C
+C ECLIB documentation on SBYTES and GBYTES.
+C
+C Comments.
+C ---------
+C
+C Cray version of routine.
+C This routine should only be used on the Cray as it
+C contains a call to GSBITE, a vectorising version of
+C GBYTE(S) and SBYTE(S).
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 08.11.91
+C Parameter KMACH removed from list of input parameters.
+C
+C J. Hennessy ECMWF 12.10.92
+C Dimension of IMASK changed from 64 to 65.
+C
+C ----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+ IMPLICIT NONE
+C
+ INTEGER IMASK
+ INTEGER IND
+ INTEGER INUM
+ INTEGER IOFF
+ INTEGER IPR
+ INTEGER IWORD
+C
+ INTEGER KBIT
+ INTEGER KBLEN
+ INTEGER KGRIB
+ INTEGER KLENG
+ INTEGER KNSPT
+ INTEGER KNUM
+ INTEGER KPARM
+ INTEGER KRET
+C
+ INTEGER J901
+C
+ DIMENSION KGRIB(KLENG)
+ DIMENSION KPARM(*)
+ DIMENSION IMASK(65)
+C
+ CHARACTER*1 HFUNC
+C
+C Values in IMASK are set in the first call to routine GSBITE, and
+C are used in subsequent calls.
+C
+ SAVE IMASK
+C
+C Force routine GSBITE to calculate bit-masks first time through.
+C
+ DATA IMASK(2) /0/
+C
+C Debug print switch.
+C
+ DATA IPR /0/
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Set initial values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ WRITE (*,*) 'INXBIT : Section 1.'
+ WRITE (*,*) ' Input values used -'
+ WRITE (*,9009) KLENG
+ WRITE (*,9002) KNSPT
+ WRITE (*,9004) KBIT
+ WRITE (*,9005) HFUNC
+ ENDIF
+C
+ KRET = 0
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Bit insertion/extraction.
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 2.'
+C
+C* Calculate word pointer and offset.
+C
+ IWORD = KNSPT / KBIT
+ IOFF = KNSPT - IWORD * KBIT
+ IWORD = IWORD + 1
+ IF (IPR.EQ.1) WRITE (*,9003) IWORD , IOFF
+C
+C Insert/extract bits.
+C
+ IF (KNUM.GE.8)
+ C THEN
+C
+C Cray vectorising routine GSBITE performs the same
+C functions as SBYTE(S) and GBYTE(S).
+C
+ CALL GSBITE (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM,
+ C KBIT,IMASK,HFUNC)
+ ELSE
+C
+C Cray scalar faster.
+C
+ IF (HFUNC.EQ.'C')
+ C THEN
+ CALL SBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ELSE
+ CALL GBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ENDIF
+ ENDIF
+C
+C Update pointer.
+C
+ KNSPT = KNSPT + KBLEN * KNUM
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 3 . Check out of range.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 3.'
+C
+ IND = KNSPT / KBIT
+ IF (IND.GT.KLENG)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) IND , KLENG
+ ENDIF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ INUM = KNUM
+ IF (INUM.GT.360)
+ C THEN
+ INUM = 360
+ WRITE (*,9007) INUM
+ ENDIF
+ DO 901 J901=1,INUM
+ IF (HFUNC.EQ.'C')
+ C THEN
+ WRITE (*,9006) KPARM(J901)
+ ELSE
+ WRITE (*,9008) KPARM(J901)
+ ENDIF
+ 901 CONTINUE
+ WRITE (*,*) 'INXBIT : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9002) KNSPT
+ ENDIF
+C
+C
+ 9001 FORMAT (1H ,'INXBIT : Word ',I8,' is outside array bounds ',I8)
+C
+ 9002 FORMAT (1H ,' KNSPT = ',I8)
+C
+ 9003 FORMAT (1H ,'INXBIT : Word is',I8,', bit offset is ',I2)
+C
+ 9004 FORMAT (1H ,' KBIT = ',I8)
+C
+ 9005 FORMAT (1H ,' HFUNC = ',A)
+C
+ 9006 FORMAT (1H ,' Inserted value = ',I20)
+C
+ 9007 FORMAT (1H ,' First ',I9,' values.')
+C
+ 9008 FORMAT (1H ,' Extracted value = ',I20)
+C
+ 9009 FORMAT (1H ,' KLENG = ',I20)
+C
+ RETURN
+C
+ END
+ SUBROUTINE ABORTX (HNAME)
+C
+C**** ABORTX - Terminates execution of program.
+C
+C Purpose.
+C --------
+C
+C Terminates execution of program.
+C
+C** Interface.
+C ----------
+C
+C CALL ABORTX (HNAME)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C HNAME - Name of calling routine.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C Prints message and terminates.
+C
+C Externals.
+C ----------
+C
+C ABORT
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C Cray version of routine.
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 13.11.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+ IMPLICIT NONE
+C
+ CHARACTER*(*) HNAME
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Print message and terminate.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WRITE (*,9001) HNAME
+C
+ CALL ABORT
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ 9001 FORMAT (1H ,'ABORTX : Routine ',A,' has requested program',
+ C ' termination.')
+C
+ RETURN
+C
+ END
+ SUBROUTINE SETPAR (KBIT,KNEG,KPR)
+C
+C**** SETPAR - Set number of bits in word. Set maximum negative integer.
+C
+C Purpose.
+C --------
+C
+C Set number of bits in word. Set maximum negative integer.
+C
+C** Interface.
+C ----------
+C
+C CALL SETPAR (KBIT,KNEG,KPR)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KPR - Debug print switch.
+C 1 , print out.
+C 0 , No print out.
+C
+C Output Parameters.
+C ------------------
+C
+C KBIT - Number of bits in computer word.
+C
+C KNEG - Maximum negative integer.
+C
+C Method.
+C -------
+C
+C Values are assigned.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C Cray version of routine.
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 28.10.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+ IMPLICIT NONE
+C
+ INTEGER KBIT
+ INTEGER KNEG
+ INTEGER KPR
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Assign values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) ' SETPAR : Section 1.'
+C
+ KBIT = 64
+ KNEG = -9223372036854775807
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (KPR.EQ.1)
+ C THEN
+ WRITE (*,*) ' SETPAR : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9001) KBIT
+ WRITE (*,9002) KNEG
+ ENDIF
+C
+ 9001 FORMAT (1H ,' KBIT = ',I3)
+C
+ 9002 FORMAT (1H ,' KNEG = ',I22)
+C
+ RETURN
+C
+ END
+ SUBROUTINE GSBITE (KS,KD,KSKST,KSIZE,KSKBTW,K,KBPW,KMASK,HADIR)
+C
+C**** GSBITE - Extraction/insertion of bits from/to bitstream on Cray.
+C
+C Purpose.
+C --------
+C
+C Vectorising extraction/insertion of bits from/to bitstream.
+C
+C** Interface.
+C ----------
+C
+C CALL GSBITE (KS,KD,KSKST,KSIZE,KSKBTW,K,KBPW,KMASK,HADIR)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KS - If HADIR='D', input bit stream, else output
+C bit stream.
+C KD - If HADIR='D', output words, else input words.
+C KSKST - Number of bits skipped at beginning of KS.
+C KSIZE - Number of bits to be extracted to one word
+C of KD.
+C KSKBTW - Number of bits skipped between two words to
+C be extracted.
+C K - Number of words to be extracted into KD. If
+C less than or equal to 0 only calculate KBPW
+C and KMASK.
+C KBPW - Number of bits per word in KS,calculated if 0.
+C KMASK - Masks for bit patterns, calculated if
+C KMASK(2) is 0.
+C HADIR - Direction of conversion: 'D' for decoding, ie
+C extract words KD(1...K) from bits
+C KS(KSKST+1....)
+C If not 'D', encode, i.e. pack words
+C KD(1....K) into bits
+C KS(KSKST+1.....KSKST+K*(KSIZE+KSKBTW))
+C
+C Output Parameters.
+C ------------------
+C
+C KS,KD - See above.
+C KSKST - Updated to number of bits used, i.e. to
+C KSKST+K*(KSIZE+KSKBTW)
+C KBPW - If 0 on input, number of bits in each word
+C of KS.
+C KMASK - If KMASK(2) was 0 on input, bit pattern masks.
+C
+C Method.
+C -------
+C
+C Vector loop is over repeatedly occurring bit patterns.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C This routine is for the Cray only.
+C Variable names do not conform to the standard.
+C
+C Author.
+C -------
+C
+C G.J.Cats 08 Dec 87
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 09.09.91
+C Introductory comments changed to conform to standard.
+C
+C ------------------------------------------------------------------
+C
+ DIMENSION KS(*),KD(*),KMASK(*)
+ CHARACTER*1 HADIR
+C
+C STATEMENT FUNCTIONS TO MANIPULATE BITS IN WORDS OF 64 BITS
+C
+C DATA ONES/7777777777777777B/
+C DATA OOOS/0B/
+C
+C 1. SINGLE BIT MANIPULATIONS
+C
+C 1.1 SET BIT KBIT IN WORD PW
+C
+ IBSET(KW,KBIT)=OR(KW,SHIFT(1B,KBIT))
+C
+C 2. WORD MANIPULATIONS, BIT BY BIT
+C
+C 2.1 ARE WORDS PW1 AND PW2 EQUAL?
+C
+C LOGICAL NLEQAL
+C NLEQAL(PW1,PW2)=(PW1.XOR.PW2).EQ.0B
+C
+C 2.2 BITWISE AND AND OR
+C
+ IAND(K1,K2)=AND(K1,K2)
+ IOR (K1,K2)= OR(K1,K2)
+C
+C 2.3 BITWISE NEGATION
+C
+ NOT(K)=COMPL(K)
+C
+C 2.4 SHIFT (LEFT FOR KSH POSITIVE, RIGHT FOR KSH NEGATIVE
+C
+ ISHFT(K,KSH)=CVMGP(SHIFTL(K,KSH),SHIFTR(K,-KSH),KSH)
+C
+C 3. SPECIAL PURPOSE
+C
+C 3.1 TAKE 4 LAST BITS OF KW, PUT THEM IN PW AT POS K*4-1
+C
+C SETLEV(PW,KW,K)=OR(AND(PW,SHIFT(0B.EQV.17B,K*4-4)),
+C +SHIFT(AND(17B,KW),K*4-4))
+C
+C 3.2 EXTRACT FIELD [K*4-1:4] FROM PW
+C
+C MGTLEV(PW,K)=AND(17B,SHIFT(PW,68-K*4))
+C
+C 1. COMPLETE KBPW AND KMASK, RETURN IF 0 WORDS ARE TO BE EXTRACTED
+C
+ IF(KBPW.EQ.0)THEN
+ IS=KS(1)
+ KS(1)=1
+ 1101 CONTINUE
+ IF(KS(1).NE.0)THEN
+ KBPW=KBPW+1
+ KS(1)=ISHFT(KS(1),1)
+ GOTO 1101
+ ENDIF
+ KS(1)=IS
+ ENDIF
+ IF(KMASK(2).EQ.0)THEN
+ KMASK(KBPW+1)=0
+ DO 1110 J=KBPW,1,-1
+ KMASK(J)=IBSET(KMASK(J+1),KBPW-J)
+ 1110 CONTINUE
+ ENDIF
+ IF(K.LE.0)RETURN
+C
+C 2. PRESET KD TO 0 IF KD IS OUTPUT I.E. WHEN DECODING
+C
+ IF(HADIR.EQ.'D')THEN
+ DO 2101 J=1,K
+ KD(J)=0
+ 2101 CONTINUE
+ ENDIF
+C
+C 3. CALCULATE SEVERAL PARAMETERS FOR LOOPING (FOR EFFICIENCY, THE
+C CODE OF SECTIONS 3.3 AND 3.4 FOR K=1 IS SEPARATED INTO 3.2)
+C
+C 3.1 NUMBER OF BITS USED PER WORD, INITIAL NR OF SKIPPED BITS
+C
+ ISTEP=KSIZE+KSKBTW
+ ISKWS=KSKST
+C
+C 3.2 VECTOR LOOP LENGTH AND STEP SIZE IN KD IF K=1;KS STEP IRRELVNT
+C
+ IF(K.EQ.1)THEN
+ ILL=1
+ IBDL=2
+ ISTD=1
+ ELSE
+C
+C 3.3 STEP SIZES IN KS,KD: INVERSE OF LARGEST FACTOR OF ISTEP,KBPW
+C
+ ILCF=KBPW
+ ISHF=ISTEP
+ 331 CONTINUE
+ IF(ILCF.EQ.ISHF)GOTO 332
+ IF(ILCF.EQ.1)GOTO 332
+ IF(ILCF.GT.ISHF)THEN
+ ILCF=ILCF-ISHF
+ ELSE
+ ISHF=ISHF-ILCF
+ ENDIF
+ GOTO 331
+ 332 CONTINUE
+ ISTD=KBPW/ILCF
+ ISTS=ISTEP/ILCF
+C
+C 3.4 VECTOR LOOP LENGTH AND SWITCH-OVER POINT FOR SMALLER LOOP
+C
+ ILL=(K-1)/ISTD+1
+ IBDL=K-(ILL-1)*ISTD
+ ENDIF
+C
+C 4. LOOP OVER FIRST ISTD WORDS OF KD (TRAILS THE VECTOR LOOP)
+C
+ DO 790 JBD=1,ISTD
+C
+C 4.1 LAST BIT IN KS TO BE TREATED
+C
+ IENBS=ISKWS+KSIZE
+C
+C 4.2 NR OF WORDS OF KS TO BE SKIPPED, NR OF BITS IN THOSE AND THIS
+C
+ ISKW=ISKWS/KBPW
+ ISTA=ISKW*KBPW
+ ISKB=ISKWS-ISTA
+C
+C 4.3 MASK AND LEFT SHIFT FOR THE REMAINING BITS
+C
+ IMASK=KMASK(ISKB+1)
+ ISH=KSIZE+ISKB
+C
+C 4.4 POSITION OF CURRENT WORD OF KS
+C
+ IBS=ISKW+1
+C
+C 5. LOOP OVER WORDS OF KS CONTRIBUTING TO ONE WORD OF KD
+C
+ 500 CONTINUE
+C
+C 5.1 UPDATE SHIFT AND LAST BIT IN CURRENT WORD
+C
+ ISH=ISH-KBPW
+ IEND=ISTA+KBPW
+C
+C 5.2 IS LAST BIT OF CURRENT WORD OUTSIDE RANGE TO BE EXTRACTED
+C
+ IF(IEND.GT.IENBS)THEN
+ ISH=IENBS-IEND
+ IMASK=IAND(IMASK,NOT(KMASK(KBPW+ISH+1)))
+ ENDIF
+C
+C 5.3 INITIAL OFFSETS FOR VECTOR ELEMENTS IN VECTOR LOOP
+C
+ IOS=0
+ IOD=0
+C
+C 6. VECTOR LOOP IS OVER REPEATEDLY OCCURRING BITPATTERNS/MASKS
+C
+ IF(HADIR.EQ.'D')THEN
+CDIR$ IVDEP
+ DO 611 JI=1,ILL
+ KD(JBD+IOD)=IOR(KD(JBD+IOD),ISHFT(IAND(IMASK,KS(IBS+IOS)),ISH))
+ IOD=IOD+ISTD
+ IOS=IOS+ISTS
+ 611 CONTINUE
+ ELSE
+CDIR$ IVDEP
+ DO 612 JI=1,ILL
+ KS(IBS+IOS)=IOR(
+ + IAND( KS(IBS+IOS), NOT(IMASK)),
+ + IAND(ISHFT(KD(JBD+IOD),-ISH), IMASK ))
+ IOD=IOD+ISTD
+ IOS=IOS+ISTS
+ 612 CONTINUE
+ ENDIF
+C
+C 7. END LOOPS
+C
+C 7.1 PREPARE FOR END OF LOOP OVER WORDS OF KS WITIHN ONE KD WORD
+C
+ ISTA=ISTA+KBPW
+C
+C 7.2 NEXT WORD OF KD IF EXTRACTION NOT COMPLETED
+C
+ IF(ISTA.LT.IENBS)THEN
+ IMASK=KMASK(1)
+ IBS=IBS+1
+ GOTO 500
+ ENDIF
+C
+C 7.8 PREPARE FOR END OF LOOP OVER FIRST WORDS OF KD
+C
+ IF(JBD.EQ.IBDL)ILL=ILL-1
+ ISKWS=ISKWS+ISTEP
+C
+C 7.9 END LOOP OVER FIRST WORDS OF KD
+C
+ 790 CONTINUE
+C
+C 8. FINISHED: UPDATE KSKST AND RETURN
+C
+ KSKST=KSKST+K*ISTEP
+C
+ RETURN
+ END
+ SUBROUTINE GBYTE (SOURCE,DEST,IOFSET,IBYTSZ)
+C
+C**** GBYTE - Extract a single bit field. Cray routine.
+C
+C* FUNCTION: GET A SINGLE BIT FIELD FROM SOURCE INTO DEST
+C*
+C* INPUT : SOURCE(1)= WORD CONTAINING START OF BIT FIELD
+C* DEST = TARGET WORD
+C* IOFSET = OFFSET IN BITS FOR START OF THE FIELD
+C* IBYTSZ = LENGTH OF FIELD IN BITS
+C*
+C* OUTPUT : SOURCE,IOFSET,IBYTSZ UNCHANGED
+C* DEST CONTAINS FIELD RIGHT JUSTIFIED
+C*
+C* AUTHOR : M.MIQUEU 08/1981 (REWRITTEN FROM J.MARTELLET'S)
+C*
+ PARAMETER(NBPW=64)
+ INTEGER SOURCE(1),DEST
+ INTEGER SH1
+ SH1=IOFSET+IBYTSZ-NBPW
+
+ IF(SH1.GT.0) GO TO 2
+
+
+C BYTES DO NOT SPAN WORDS
+
+
+ SH1=NBPW+SH1
+
+
+ DEST=AND(
+ 1 SHIFT(SOURCE(1),SH1),
+ 2 SHIFT(MASK(IBYTSZ),IBYTSZ)
+ 3 )
+
+ RETURN
+
+C BYTE SPANS WORDS
+
+2 CONTINUE
+
+
+ DEST=OR(
+ 1 SHIFT(
+ 2 AND(SOURCE(1),COMPL(MASK(IOFSET)))
+ 3 ,SH1),
+ 4 SHIFT(
+ 5 AND(SOURCE(2),MASK(SH1))
+ 6 ,SH1)
+ 7 )
+
+
+
+ RETURN
+ END
+ SUBROUTINE GBYTES (S,D,ISKIP1,IBSIZ,ISKIP2,NBYTES,KWOFF)
+C
+C**** GBYTES - Extract a number of bit fields. Cray routine.
+C
+C S CONTAINS A BIT STRING OF INDEFINITE LENGTH. GBYTES WILL
+C EXTRACT NBYTES BITSTRINGS, IBSIZ BITS LONG, AND STORE THEM
+C RIGHT JUSTIFIED 0 FILL, INTO SUCCESSIVE WORDS OF D. THE
+C SUCCESSIVE BITSTRINGS START AT BIT POSITIONS
+C ISKIP1+1+(IBYTE-1)*(IBSIZ+ISKIP2)
+C IN THE BIT STRING S. I.E. SKIP ISKIP1 BITS AT THE START,
+C AND ISKIP2 BITS BETWEEN THE EXTRACTED STRINGS.
+C BIT ISKP+1 IN A STRING IS FOUND IN WORD IS=1+ISKIP/NBPW IN S,
+C WHERE NBPW IS THE NUMBER OF BITS PER WORD. THE STARTING BIT
+C IS FOUND BY SKIPPING MOD(ISKP,NBPW) BITS IN THAT WORD.
+C KWOFF IS AN OPTIONAL 7TH PARAMETER, WHICH DEFAULTS TO 0
+C IF PRESENT KWOFF BITS ARE TOTALLY IGNORED AT THE START OF A WORD
+C THUS IF A PACKED CYBER BIT STRING IS TRANSFERRED TO THE
+C CRAY, WITH EACH 60 BIT CYBER WORD PLACED AT THE RIGHT END OF
+C A 64 BIT CRAY WORD, A BYTE SEQUENCE WHICH WAS ORIGINALLY
+C LOCATED WITH START POINTS IN ARITHMETIC PROGRESSION ON THE
+C CYBER, WILL NO LONGER HAVE THIS PROPERTY ON THE CRAY. BY
+C USING THE ROUTINE WITH KWOFF=4, THE ELEMENTS OF THE BYTE
+C SEQUENCE CAN BE EXTRACTED ON THE CRAY, USING THE SAME SKIPS
+C AS WERE USED ON THE CYBER.
+C
+ PARAMETER(NBPW=64)
+ DIMENSION S(2) , D(NBYTES)
+ INTEGER SH1
+ IGNORE = 0
+ IF(NUMARG().GT.6) IGNORE = KWOFF
+ IS=1+ISKIP1/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP1,NBPW-IGNORE) + IGNORE
+ ISTEP = ISKIP2+IBSIZ
+ DO 75 IBYTE = 1 , NBYTES
+C WITH THE STARTING WORD AND BIT POSITION DETERMINED, THE
+C DESIRED EXTRACTION CAN BE DONE BY
+C*** CALL GBYTE(S(IS),D(IBYTE),ISKIP,IBSIZ)
+C BUT SINCE THE CODE IS SHORT IT IS INSERTED IN-LINE.
+ SH1 = ISKIP+IBSIZ
+ IF(SH1.GT.NBPW) GO TO 50
+C BYTE COMES FROM 1 WORD OF S
+ D(IBYTE) = AND( SHIFT(S(IS),SH1),SHIFT(MASK(IBSIZ),IBSIZ))
+ GO TO 65
+ 50 CONTINUE
+ SH1 =SH1-NBPW
+C BYTE COMES FROM 2 WORDS OF S.
+ D(IBYTE) = OR(SHIFT(AND(S(IS),COMPL(MASK(ISKIP))),SH1)
+ 1 ,
+ 2 SHIFT(AND(SHIFT(S(IS+1),IGNORE),MASK(SH1)),SH1)
+ 3 )
+ 65 CONTINUE
+C UPDATE STARTING WORD AND BIT POSITION
+ ISKIP = ISKIP+ISTEP
+ IF(ISKIP.LT.NBPW) GO TO 75
+ ISKIP =ISKIP-NBPW
+ IS = IS+1+ISKIP/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP,NBPW-IGNORE) + IGNORE
+ 75 CONTINUE
+ RETURN
+ END
+ SUBROUTINE SBYTE (DEST,SOURCE,IOFSET,IBYTSZ)
+C
+C**** SBYTE - Insert a single bit field. Cray routine.
+C
+C* FUNCTION: STORE A SINGLE BIT FIELD FROM SOURCE INTO DEST
+C*
+C* INPUT : SOURCE = WORD CONTAINING BIT FIELD RIGHT JUSTIFIED
+C* DEST(1) = 1ST TARGET WORD
+C* IOFSET = OFFSET IN BITS FOR START OF THE FIELD
+C* IBYTSZ = LENGTH OF FIELD IN BITS ; .LE.WORD SIZE .....
+C*
+C* OUTPUT : SOURCE,IOFSET,IBYTSZ UNCHANGED
+C* DEST(1) AND EVENTUALLY DEST(2) CONTAIN FIELD
+C*
+C* AUTHOR : M.MIQUEU 08/1981 (REWRITTEN FROM J.MARTELLET'S)
+C*
+ PARAMETER(NBPW=64)
+ INTEGER SOURCE,DEST(1)
+ INTEGER SH1,SH2,SH3
+ SH1=IOFSET+IBYTSZ
+ IF(SH1.GT.NBPW) GO TO 2
+
+ SH2=NBPW-SH1
+ IF(SH2.LT.0) SH2=NBPW-SH2
+
+C BYTE DOES NOT SPAN WORDS
+
+
+ DEST(1)=SHIFT(
+ 1 OR(
+ 2 AND(SHIFT(DEST(1),SH1),
+ 3 SHIFT(COMPL(MASK(IBYTSZ)),IBYTSZ) )
+ 4 ,
+ 5 AND(SOURCE,
+ 6 COMPL(SHIFT(COMPL(MASK(IBYTSZ)),IBYTSZ)) )
+ 7 )
+ 8 ,SH2)
+
+
+
+ RETURN
+
+2 CONTINUE
+
+C BYTE SPANS 2 WORDS
+
+ SH3=2*NBPW-SH1
+
+
+ DEST(1)=OR(
+ 1 AND(DEST(1),MASK(IOFSET))
+ 2 ,
+ 3 AND(SHIFT(SOURCE,SH3) , COMPL(MASK(IOFSET)) )
+ 4 )
+
+ DEST(2)=OR(
+ 1 AND(DEST(2) , COMPL(MASK(SH1-NBPW)) )
+ 2 ,
+ 3 SHIFT( AND(SOURCE , COMPL(MASK(SH3)) ) ,SH3)
+ 4 )
+
+
+
+ RETURN
+ END
+ SUBROUTINE SBYTES (D,S,ISKIP1,IBSIZ,ISKIP2,NBYTES,KWOFF)
+C
+C**** SBYTES - Insert a number of bit fields. Cray routine.
+C
+C REVERSES THE ACTION OF GBYTES, TAKING FIELDS FROM S AND
+C INSERTING THEM INTO A BIT STRING IN D. SEE GBYTES.
+C AUTHOR D. ROBERTSON AUG,1981
+C
+ PARAMETER(NBPW=64)
+ DIMENSION D(2) , S(NBYTES)
+ INTEGER SH1,SH2,SH3
+ IGNORE = 0
+ IF(NUMARG().GT.6) IGNORE = KWOFF
+ ID=1+ISKIP1/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP1,NBPW-IGNORE) + IGNORE
+ ISTEP = ISKIP2+IBSIZ
+ DO 75 IBYTE = 1 , NBYTES
+C WITH THE STARTING WORD AND BIT POSITION KNOWN, THE
+C DESIRED INSERTION CAN BE DONE BY
+C** CALL SBYTE(D(ID),S(IBYTE),ISKIP,IBSIZ)
+C BUT THE CODE IS SHORT ENOUGH TO GO IN-LINE.
+ SH1 = ISKIP+IBSIZ
+ IF(SH1.GT.NBPW) GO TO 50
+ SH2 = NBPW-SH1
+ IF(SH2.LT.0) SH2 = NBPW-SH2
+C BYTE GOES INTO 1 WORD OF D.
+ D(ID) = SHIFT(OR(AND(SHIFT(D(ID),SH1),MASK(NBPW-IBSIZ)),
+ 1 AND(S(IBYTE),SHIFT(MASK(IBSIZ),IBSIZ))),SH2)
+ GO TO 65
+ 50 CONTINUE
+C BYTE GOES INTO 2 WORDS OF D.
+ SH3 = 2*NBPW-SH1
+ D(ID)=OR(AND(D(ID),MASK(ISKIP)),
+ 1 AND(SHIFT(S(IBYTE),SH3),COMPL(MASK(ISKIP))))
+ D(ID+1)=OR(AND(D(ID+1),SHIFT(COMPL(MASK(SH1-NBPW)),NBPW-IGNORE)
+ 1 ),
+ 2 SHIFT(AND(S(IBYTE),COMPL(MASK(SH3))),SH3-IGNORE))
+ 65 CONTINUE
+C UPDATE STARTING WORD AND BIT POSITION
+ ISKIP = ISKIP+ISTEP
+ IF(ISKIP.LT.NBPW) GO TO 75
+ ISKIP = ISKIP - NBPW
+ ID = ID+1+ISKIP/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP,NBPW-IGNORE) + IGNORE
+ 75 CONTINUE
+ RETURN
+ END
diff --git a/gribex/bt_cyber.F b/gribex/bt_cyber.F
new file mode 100755
index 0000000..0cc488d
--- /dev/null
+++ b/gribex/bt_cyber.F
@@ -0,0 +1,837 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+ C KBLEN,HFUNC,KRET)
+C
+C---->
+C**** INXBIT - Insert/extract bits consecutively in/from a given array
+C
+C Purpose.
+C --------
+C
+C Take rightmost KBLEN bits from KNUM words of KPARM
+C and insert them consecutively in KGRIB, starting at
+C bit after KNSPT or vice versa.
+C
+C** Interface.
+C ----------
+C
+C CALL INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+C C KBLEN,KRET)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KGRIB - Array containing bitstream.
+C KLENG - Length (words) of this array.
+C KNSPT - Bit number after which insertion or
+C extraction starts.
+C KPARM - Array from which bits are taken for
+C insertion in the bitstream or to which
+C bits are extracted from the bitstream.
+C KBIT - Number of bits in computer word.
+C KNUM - Number of bit fields inserted/extracted.
+C KBLEN - Number of bits per bit field.
+C HFUNC - Requested function.
+C 'C' to insert bits in bitstream,
+C 'D' to extract bits from bitstream.
+C
+C Output Parameters.
+C ------------------
+C
+C KNSPT - Bit number of last bit inserted/extracted.
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Insertion/extraction exceeded
+C array boundary.
+C
+C Method.
+C -------
+C
+C Word and offset pointer calculated before calling
+C insertion/extraction routines.
+C
+C Externals.
+C ----------
+C
+C SBYTES6
+C GBYTES6
+C
+C Reference.
+C ----------
+C
+C ECLIB documentation on SBYTES and GBYTES.
+C
+C Comments.
+C ---------
+C
+C Cyber version of routine.
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 08.11.91
+C Parameter KMACH removed from list of input parameters.
+C
+C J. Hennessy ECMWF 12.10.92
+C Dimension of IMASK changed from 64 to 65.
+C
+C ----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+ INTEGER IND
+ INTEGER INUM
+ INTEGER IOFF
+ INTEGER IPR
+ INTEGER IWORD
+C
+ INTEGER KBIT
+ INTEGER KBLEN
+ INTEGER KGRIB
+ INTEGER KLENG
+ INTEGER KNSPT
+ INTEGER KNUM
+ INTEGER KPARM
+ INTEGER KRET
+C
+ INTEGER J901
+C
+ DIMENSION KGRIB(KLENG)
+ DIMENSION KPARM(*)
+C
+ CHARACTER*1 HFUNC
+C
+C
+C Debug print switch.
+C
+ DATA IPR /0/
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Set initial values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ WRITE (*,*) 'INXBIT : Section 1.'
+ WRITE (*,*) ' Input values used -'
+ WRITE (*,9009) KLENG
+ WRITE (*,9002) KNSPT
+ WRITE (*,9004) KBIT
+ WRITE (*,9005) HFUNC
+ ENDIF
+C
+ KRET = 0
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Bit insertion/extraction.
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 2.'
+C
+C* Calculate word pointer and offset.
+C
+ IWORD = KNSPT / KBIT
+ IOFF = KNSPT - IWORD * KBIT
+ IWORD = IWORD + 1
+ IF (IPR.EQ.1) WRITE (*,9003) IWORD , IOFF
+C
+C Insert/extract bits.
+C
+ IF (HFUNC.EQ.'C')
+ C THEN
+ CALL SBYTES6 (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ELSE
+ CALL GBYTES6 (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ENDIF
+C
+C Update pointer.
+C
+ KNSPT = KNSPT + KBLEN * KNUM
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 3 . Check out of range.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 3.'
+C
+ IND = KNSPT / KBIT
+ IF (IND.GT.KLENG)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) IND , KLENG
+ ENDIF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ INUM = KNUM
+ IF (INUM.GT.360)
+ C THEN
+ INUM = 360
+ WRITE (*,9007) INUM
+ ENDIF
+ DO 901 J901=1,INUM
+ IF (HFUNC.EQ.'C')
+ C THEN
+ WRITE (*,9006) KPARM(J901)
+ ELSE
+ WRITE (*,9008) KPARM(J901)
+ ENDIF
+ 901 CONTINUE
+ WRITE (*,*) 'INXBIT : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9002) KNSPT
+ ENDIF
+C
+C
+ 9001 FORMAT (1H ,'INXBIT : Word ',I8,' is outside array bounds ',I8)
+C
+ 9002 FORMAT (1H ,' KNSPT = ',I8)
+C
+ 9003 FORMAT (1H ,'INXBIT : Word is',I8,', bit offset is ',I2)
+C
+ 9004 FORMAT (1H ,' KBIT = ',I8)
+C
+ 9005 FORMAT (1H ,' HFUNC = ',A)
+C
+ 9006 FORMAT (1H ,' Inserted value = ',I20)
+C
+ 9007 FORMAT (1H ,' First ',I9,' values.')
+C
+ 9008 FORMAT (1H ,' Extracted value = ',I20)
+C
+ 9009 FORMAT (1H ,' KLENG = ',I20)
+C
+ RETURN
+C
+ END
+ SUBROUTINE ABORTX (HNAME)
+C
+C**** ABORTX - Terminates execution of program.
+C
+C Purpose.
+C --------
+C
+C Terminates execution of program.
+C
+C** Interface.
+C ----------
+C
+C CALL ABORTX (HNAME)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C HNAME - Name of calling routine.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C Prints message and terminates.
+C
+C Externals.
+C ----------
+C
+C ABORT
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C Cyber version of routine.
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 13.11.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+C
+ CHARACTER*(*) HNAME
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Print message and terminate.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WRITE (*,9001) HNAME
+C
+ CALL ABORT ('US',0,' ')
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ 9001 FORMAT (1H ,'ABORTX : Routine ',A,' has requested program',
+ C ' termination.')
+C
+ RETURN
+C
+ END
+ SUBROUTINE SETPAR (KBIT,KNEG,KPR)
+C
+C**** SETPAR - Set number of bits in word. Set maximum negative integer.
+C
+C Purpose.
+C --------
+C
+C Set number of bits in word. Set maximum negative integer.
+C
+C** Interface.
+C ----------
+C
+C CALL SETPAR (KBIT,KNEG,KPR)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KPR - Debug print switch.
+C 1 , print out.
+C 0 , No print out.
+C
+C Output Parameters.
+C ------------------
+C
+C KBIT - Number of bits in computer word.
+C
+C KNEG - Maximum negative integer.
+C
+C Method.
+C -------
+C
+C Values are assigned.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C Cyber version of routine.
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 28.10.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+C
+ INTEGER KBIT
+ INTEGER KNEG
+ INTEGER KPR
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Assign values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) ' SETPAR : Section 1.'
+C
+ KBIT = 64
+ KNEG = -9223372036854775807
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (KPR.EQ.1)
+ C THEN
+ WRITE (*,*) ' SETPAR : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9001) KBIT
+ WRITE (*,9002) KNEG
+ ENDIF
+C
+ 9001 FORMAT (1H ,' KBIT = ',I3)
+C
+ 9002 FORMAT (1H ,' KNEG = ',I22)
+C
+ RETURN
+C
+ END
+ SUBROUTINE GBYTE(SOURCE,DEST,IOFSET,IBYTSZ)
+C
+C**** GBYTE - Get a single bit field from SOURCE into DEST on Cyber.
+C
+C* INPUT : SOURCE(1)= WORD CONTAINING START OF BIT FIELD
+C* DEST = TARGET WORD
+C* IOFSET = OFFSET IN BITS FOR START OF THE FIELD
+C* IBYTSZ = LENGTH OF FIELD IN BITS
+C*
+C* OUTPUT : SOURCE,IOFSET,IBYTSZ UNCHANGED
+C* DEST CONTAINS FIELD RIGHT JUSTIFIED
+C*
+C* AUTHOR : M.MIQUEU 08/1981 (REWRITTEN FROM J.MARTELLET'S)
+C*
+C*****
+ INTEGER SOURCE(1),DEST
+ INTEGER SH1
+
+
+ NBPW=64
+ SH1=IOFSET+IBYTSZ-NBPW
+
+ IF(SH1.GT.0) GO TO 2
+
+
+C BYTES DO NOT SPAN WORDS
+
+
+ SH1=NBPW+SH1
+
+
+ DEST=AND(
+ 1 SHIFT(SOURCE(1),SH1),
+ 2 SHIFT(MASK(IBYTSZ),IBYTSZ)
+ 3 )
+
+ RETURN
+
+C BYTE SPANS WORDS
+
+2 CONTINUE
+
+
+ DEST=OR(
+ 1 SHIFT(
+ 2 AND(SOURCE(1),COMPL(MASK(IOFSET)))
+ 3 ,SH1),
+ 4 SHIFT(
+ 5 AND(SOURCE(2),MASK(SH1))
+ 6 ,SH1)
+ 7 )
+
+
+
+ RETURN
+ END
+ SUBROUTINE GBYTES(S,D,ISKIP1,IBSIZ,ISKIP2,NBYTES,KWOFF)
+C
+C**** GBYTES - Cyber version.
+C
+C S CONTAINS A BIT STRING OF INDEFINITE LENGTH. GBYTES WILL
+C EXTRACT NBYTES BITSTRINGS, IBSIZ BITS LONG, AND STORE THEM
+C RIGHT JUSTIFIED 0 FILL, INTO SUCCESSIVE WORDS OF D. THE
+C SUCCESSIVE BITSTRINGS START AT BIT POSITIONS
+C ISKIP1+1+(IBYTE-1)*(IBSIZ+ISKIP2)
+C IN THE BIT STRING S. I.E. SKIP ISKIP1 BITS AT THE START,
+C AND ISKIP2 BITS BETWEEN THE EXTRACTED STRINGS.
+C BIT ISKP+1 IN A STRING IS FOUND IN WORD IS=1+ISKIP/NBPW IN S,
+C WHERE NBPW IS THE NUMBER OF BITS PER WORD. THE STARTING BIT
+C IS FOUND BY SKIPPING MOD(ISKP,NBPW) BITS IN THAT WORD.
+C KWOFF IS AN OPTIONAL 7TH PARAMETER, WHICH DEFAULTS TO 0
+C IF PRESENT KWOFF BITS ARE TOTALLY IGNORED AT THE START OF A WORD
+C THUS IF A PACKED CYBER BIT STRING IS TRANSFERRED TO THE
+C CRAY, WITH EACH 60 BIT CYBER WORD PLACED AT THE RIGHT END OF
+C A 64 BIT CRAY WORD, A BYTE SEQUENCE WHICH WAS ORIGINALLY
+C LOCATED WITH START POINTS IN ARITHMETIC PROGRESSION ON THE
+C CYBER, WILL NO LONGER HAVE THIS PROPERTY ON THE CRAY. BY
+C USING THE ROUTINE WITH KWOFF=4, THE ELEMENTS OF THE BYTE
+C SEQUENCE CAN BE EXTRACTED ON THE CRAY, USING THE SAME SKIPS
+C AS WERE USED ON THE CYBER.
+ DIMENSION S(2) , D(NBYTES)
+ INTEGER SH1
+ ENTRY GBYTES7 (S,D,ISKIP1,IBSIZ,ISKIP2,NBYTES,KWOFF)
+ IGNORE = KWOFF
+ GO TO 10
+ ENTRY GBYTES6 (S,D,ISKIP1,IBSIZ,ISKIP2,NBYTES)
+ IGNORE = 0
+ 10 CONTINUE
+ NBPW=64
+ IS=1+ISKIP1/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP1,NBPW-IGNORE) + IGNORE
+ ISTEP = ISKIP2+IBSIZ
+ DO 75 IBYTE = 1 , NBYTES
+C WITH THE STARTING WORD AND BIT POSITION DETERMINED, THE
+C DESIRED EXTRACTION CAN BE DONE BY
+C*** CALL GBYTE(S(IS),D(IBYTE),ISKIP,IBSIZ)
+C BUT SINCE THE CODE IS SHORT IT IS INSERTED IN-LINE.
+ SH1 = ISKIP+IBSIZ
+ IF(SH1.GT.NBPW) GO TO 50
+C BYTE COMES FROM 1 WORD OF S
+ D(IBYTE) = AND( SHIFT(S(IS),SH1),SHIFT(MASK(IBSIZ),IBSIZ))
+ GO TO 65
+ 50 CONTINUE
+ SH1 =SH1-NBPW
+C BYTE COMES FROM 2 WORDS OF S.
+ D(IBYTE) = OR(SHIFT(AND(S(IS),COMPL(MASK(ISKIP))),SH1)
+ 1 ,
+ 2 SHIFT(AND(SHIFT(S(IS+1),IGNORE),MASK(SH1)),SH1)
+ 3 )
+ 65 CONTINUE
+C UPDATE STARTING WORD AND BIT POSITION
+ ISKIP = ISKIP+ISTEP
+ IF(ISKIP.LT.NBPW) GO TO 75
+ ISKIP =ISKIP-NBPW
+ IS = IS+1+ISKIP/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP,NBPW-IGNORE) + IGNORE
+ 75 CONTINUE
+ RETURN
+ END
+ SUBROUTINE SBYTE(DEST,SOURCE,IOFSET,IBYTSZ)
+C
+C**** GBYTE - Store a single bit field from SOURCE into DEST on Cyber.
+C
+C* INPUT : SOURCE = WORD CONTAINING BIT FIELD RIGHT JUSTIFIED
+C* DEST(1) = 1ST TARGET WORD
+C* IOFSET = OFFSET IN BITS FOR START OF THE FIELD
+C* IBYTSZ = LENGTH OF FIELD IN BITS ; .LE.WORD SIZE .....
+C*
+C* OUTPUT : SOURCE,IOFSET,IBYTSZ UNCHANGED
+C* DEST(1) AND EVENTUALLY DEST(2) CONTAIN FIELD
+C*
+C* AUTHOR : M.MIQUEU 08/1981 (REWRITTEN FROM J.MARTELLET'S)
+C*
+C*****
+ INTEGER SOURCE,DEST(1)
+ INTEGER SH1,SH2,SH3
+
+
+ NBPW=64
+ SH1=IOFSET+IBYTSZ
+ IF(SH1.GT.NBPW) GO TO 2
+
+ SH2=NBPW-SH1
+ IF(SH2.LT.0) SH2=NBPW-SH2
+
+C BYTE DOES NOT SPAN WORDS
+
+
+ DEST(1)=SHIFT(
+ 1 OR(
+ 2 AND(SHIFT(DEST(1),SH1),
+ 3 SHIFT(COMPL(MASK(IBYTSZ)),IBYTSZ) )
+ 4 ,
+ 5 AND(SOURCE,
+ 6 COMPL(SHIFT(COMPL(MASK(IBYTSZ)),IBYTSZ)) )
+ 7 )
+ 8 ,SH2)
+
+
+
+ RETURN
+
+2 CONTINUE
+
+C BYTE SPANS 2 WORDS
+
+ SH3=2*NBPW-SH1
+
+
+ DEST(1)=OR(
+ 1 AND(DEST(1),MASK(IOFSET))
+ 2 ,
+ 3 AND(SHIFT(SOURCE,SH3) , COMPL(MASK(IOFSET)) )
+ 4 )
+
+ DEST(2)=OR(
+ 1 AND(DEST(2) , COMPL(MASK(SH1-NBPW)) )
+ 2 ,
+ 3 SHIFT( AND(SOURCE , COMPL(MASK(SH3)) ) ,SH3)
+ 4 )
+
+
+
+ RETURN
+ END
+ SUBROUTINE SBYTES(D,S,ISKIP1,IBSIZ,ISKIP2,NBYTES,KWOFF)
+C
+C**** SBYTES - Cyber version.
+C
+C REVERSES THE ACTION OF GBYTES, TAKING FIELDS FROM S AND
+C INSERTING THEM INTO A BIT STRING IN D. SEE GBYTES.
+C AUTHOR D. ROBERTSON AUG,1981
+ DIMENSION D(2) , S(NBYTES)
+ INTEGER SH1,SH2,SH3
+ ENTRY SBYTES7 (D,S,ISKIP1,IBSIZ,ISKIP2,NBYTES,KWOFF)
+ IGNORE = KWOFF
+ GO TO 10
+ ENTRY SBYTES6 (D,S,ISKIP1,IBSIZ,ISKIP2,NBYTES)
+ IGNORE = 0
+ 10 CONTINUE
+ NBPW=64
+ ID=1+ISKIP1/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP1,NBPW-IGNORE) + IGNORE
+ ISTEP = ISKIP2+IBSIZ
+ DO 75 IBYTE = 1 , NBYTES
+C WITH THE STARTING WORD AND BIT POSITION KNOWN, THE
+C DESIRED INSERTION CAN BE DONE BY
+C** CALL SBYTE(D(ID),S(IBYTE),ISKIP,IBSIZ)
+C BUT THE CODE IS SHORT ENOUGH TO GO IN-LINE.
+ SH1 = ISKIP+IBSIZ
+ IF(SH1.GT.NBPW) GO TO 50
+ SH2 = NBPW-SH1
+ IF(SH2.LT.0) SH2 = NBPW-SH2
+C BYTE GOES INTO 1 WORD OF D.
+ D(ID) = SHIFT(OR(AND(SHIFT(D(ID),SH1),MASK(NBPW-IBSIZ)),
+ 1 AND(S(IBYTE),SHIFT(MASK(IBSIZ),IBSIZ))),SH2)
+ GO TO 65
+ 50 CONTINUE
+C BYTE GOES INTO 2 WORDS OF D.
+ SH3 = 2*NBPW-SH1
+ D(ID)=OR(AND(D(ID),MASK(ISKIP)),
+ 1 AND(SHIFT(S(IBYTE),SH3),COMPL(MASK(ISKIP))))
+ D(ID+1)=OR(AND(D(ID+1),SHIFT(COMPL(MASK(SH1-NBPW)),NBPW-IGNORE)
+ 1 ),
+ 2 SHIFT(AND(S(IBYTE),COMPL(MASK(SH3))),SH3-IGNORE))
+ 65 CONTINUE
+C UPDATE STARTING WORD AND BIT POSITION
+ ISKIP = ISKIP+ISTEP
+ IF(ISKIP.LT.NBPW) GO TO 75
+ ISKIP = ISKIP - NBPW
+ ID = ID+1+ISKIP/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP,NBPW-IGNORE) + IGNORE
+ 75 CONTINUE
+ RETURN
+ END
diff --git a/gribex/bt_ibm.F b/gribex/bt_ibm.F
new file mode 100755
index 0000000..7293cc6
--- /dev/null
+++ b/gribex/bt_ibm.F
@@ -0,0 +1,602 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+ C KBLEN,HFUNC,KRET)
+C
+C---->
+C**** INXBIT - Insert/extract bits consecutively in/from a given array
+C
+C Purpose.
+C --------
+C
+C Take rightmost KBLEN bits from KNUM words of KPARM
+C and insert them consecutively in KGRIB, starting at
+C bit after KNSPT or vice versa.
+C
+C** Interface.
+C ----------
+C
+C CALL INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+C C KBLEN,KRET)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KGRIB - Array containing bitstream.
+C KLENG - Length (words) of this array.
+C KNSPT - Bit number after which insertion or
+C extraction starts.
+C KPARM - Array from which bits are taken for
+C insertion in the bitstream or to which
+C bits are extracted from the bitstream.
+C KBIT - Number of bits in computer word.
+C KNUM - Number of bit fields inserted/extracted.
+C KBLEN - Number of bits per bit field.
+C HFUNC - Requested function.
+C 'C' to insert bits in bitstream,
+C 'D' to extract bits from bitstream.
+C
+C Output Parameters.
+C ------------------
+C
+C KNSPT - Bit number of last bit inserted/extracted.
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Insertion/extraction exceeded
+C array boundary.
+C
+C Method.
+C -------
+C
+C Word and offset pointer calculated before calling
+C insertion/extraction routines.
+C
+C Externals.
+C ----------
+C
+C SBYTES
+C GBYTES
+C
+C Reference.
+C ----------
+C
+C ECLIB documentation on SBYTES and GBYTES.
+C
+C Comments.
+C ---------
+C
+C IBM version of routine.
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 08.11.91
+C Parameter KMACH removed from list of input parameters.
+C
+C J. Hennessy ECMWF 12.10.92
+C Dimension of IMASK changed from 64 to 65.
+C
+C ----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+ INTEGER IND
+ INTEGER INUM
+ INTEGER IOFF
+ INTEGER IPR
+ INTEGER IWORD
+C
+ INTEGER KBIT
+ INTEGER KBLEN
+ INTEGER KGRIB
+ INTEGER KLENG
+ INTEGER KNSPT
+ INTEGER KNUM
+ INTEGER KPARM
+ INTEGER KRET
+C
+ INTEGER J901
+C
+ DIMENSION KGRIB(KLENG)
+ DIMENSION KPARM(*)
+C
+ CHARACTER*1 HFUNC
+C
+C
+C Debug print switch.
+C
+ DATA IPR /0/
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Set initial values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ WRITE (*,*) 'INXBIT : Section 1.'
+ WRITE (*,*) ' Input values used -'
+ WRITE (*,9009) KLENG
+ WRITE (*,9002) KNSPT
+ WRITE (*,9004) KBIT
+ WRITE (*,9005) HFUNC
+ ENDIF
+C
+ KRET = 0
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Bit insertion/extraction.
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 2.'
+C
+C* Calculate word pointer and offset.
+C
+ IWORD = KNSPT / KBIT
+ IOFF = KNSPT - IWORD * KBIT
+ IWORD = IWORD + 1
+ IF (IPR.EQ.1) WRITE (*,9003) IWORD , IOFF
+C
+C Insert/extract bits.
+C
+ IF (HFUNC.EQ.'C')
+ C THEN
+ CALL SBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ELSE
+ CALL GBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ENDIF
+C
+C Update pointer.
+C
+ KNSPT = KNSPT + KBLEN * KNUM
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 3 . Check out of range.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 3.'
+C
+ IND = KNSPT / KBIT
+ IF (IND.GT.KLENG)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) IND , KLENG
+ ENDIF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ INUM = KNUM
+ IF (INUM.GT.360)
+ C THEN
+ INUM = 360
+ WRITE (*,9007) INUM
+ ENDIF
+ DO 901 J901=1,INUM
+ IF (HFUNC.EQ.'C')
+ C THEN
+ WRITE (*,9006) KPARM(J901)
+ ELSE
+ WRITE (*,9008) KPARM(J901)
+ ENDIF
+ 901 CONTINUE
+ WRITE (*,*) 'INXBIT : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9002) KNSPT
+ ENDIF
+C
+C
+ 9001 FORMAT (1H ,'INXBIT : Word ',I8,' is outside array bounds ',I8)
+C
+ 9002 FORMAT (1H ,' KNSPT = ',I8)
+C
+ 9003 FORMAT (1H ,'INXBIT : Word is',I8,', bit offset is ',I2)
+C
+ 9004 FORMAT (1H ,' KBIT = ',I8)
+C
+ 9005 FORMAT (1H ,' HFUNC = ',A)
+C
+ 9006 FORMAT (1H ,' Inserted value = ',I20)
+C
+ 9007 FORMAT (1H ,' First ',I9,' values.')
+C
+ 9008 FORMAT (1H ,' Extracted value = ',I20)
+C
+ 9009 FORMAT (1H ,' KLENG = ',I20)
+C
+ RETURN
+C
+ END
+ SUBROUTINE ABORTX (HNAME)
+C
+C**** ABORTX - Terminates execution of program.
+C
+C Purpose.
+C --------
+C
+C Terminates execution of program.
+C
+C** Interface.
+C ----------
+C
+C CALL ABORTX (HNAME)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C HNAME - Name of calling routine.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C Prints message and terminates.
+C
+C Externals.
+C ----------
+C
+C SYSABN
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C IBM version of routine.
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 13.11.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+C
+ CHARACTER*(*) HNAME
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Print message and terminate.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WRITE (*,9001) HNAME
+C
+ CALL SYSABN (1)
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ 9001 FORMAT (1H ,'ABORTX : Routine ',A,' has requested program',
+ C ' termination.')
+C
+ RETURN
+C
+ END
+ SUBROUTINE SETPAR (KBIT,KNEG,KPR)
+C
+C**** SETPAR - Set number of bits in word. Set maximum negative integer.
+C
+C Purpose.
+C --------
+C
+C Set number of bits in word. Set maximum negative integer.
+C
+C** Interface.
+C ----------
+C
+C CALL SETPAR (KBIT,KNEG,KPR)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KPR - Debug print switch.
+C 1 , print out.
+C 0 , No print out.
+C
+C Output Parameters.
+C ------------------
+C
+C KBIT - Number of bits in computer word.
+C
+C KNEG - Maximum negative integer.
+C
+C Method.
+C -------
+C
+C Values are assigned.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C IBM version of routine.
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 28.10.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+C
+ INTEGER KBIT
+ INTEGER KNEG
+ INTEGER KPR
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Assign values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) ' SETPAR : Section 1.'
+C
+ KBIT = 32
+ KNEG = -2147483647
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (KPR.EQ.1)
+ C THEN
+ WRITE (*,*) ' SETPAR : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9001) KBIT
+ WRITE (*,9002) KNEG
+ ENDIF
+C
+ 9001 FORMAT (1H ,' KBIT = ',I3)
+C
+ 9002 FORMAT (1H ,' KNEG = ',I22)
+C
+ RETURN
+C
+ END
diff --git a/gribex/bt_ibm_bal.bal b/gribex/bt_ibm_bal.bal
new file mode 100755
index 0000000..b2b5962
--- /dev/null
+++ b/gribex/bt_ibm_bal.bal
@@ -0,0 +1,279 @@
+*
+* IBM Assembler version of GBYTE(S) and SBYTE(S).
+*
+* **** DOCUMENTATION ****
+* WRITTEN BY JORDAN HASTINGS AND DENNIS JOSEPH
+* NCAR, BOULDER, COLORADO
+*
+* THE FOLLOWING ROUTINES ALLOW FORTRAN ACCESS TO BIT STRINGS (BYTE
+* OF ARBITRARY LENGTH AND POSITION, PERHAPS CROSSING WORD BOUNDARIES,
+* IN THE MANNER SPECIFIED BELOW:
+*
+* CALL GBYTE (PCKD,UNPK,INOFST,NBIT)
+* CALL GBYTES(PCKD,UNPK,INOFST,NBIT, NSKIP,ITER)
+*
+* PCKD: THE FULLWORD IN MEMORY FROM WHICH UNPACKING IS TO
+* BEGIN; SUCCESSIVE FULLWORDS WILL BE FETCHED AS
+* REQUIRED.
+* UNPK: THE FULLWORD IN MEMORY INTO WHICH THE INITIAL BYTE
+* OF UNPACKED DATA IS TO BE STORED; SUBSEQUENT BYTES
+* WILL BE STORED INTO SUCCESSIVE FULLWORDS AS
+* REQUIRED.
+* INOFST: A FULLWORD INTEGER SPECIFYING THE INITAL OFFSET
+* IN BITS OF THE FIRST BYTE, COUNTED FROM THE
+* LEFTMOST BIT IN PCKD.
+* NBITS: A FULLWORD INTEGER SPECIFYING THE NUMBER OF BITS
+* IN EACH BYTE TO BE UNPACKED. LEGAL BYTE WIDTHS
+* ARE IN THE RANGE 1 - 32; BYTES OF WIDTH .LT. 32
+* WILL BE RIGHT JUSTIFIED IN THE LOW-ORDER POSITIONS
+* OF THE UNPK FULLWORDS, WITH HIGH-ORDER ZERO FILL.
+* NSKIP: A FULLWORD INTEGER SPECIFYING THE NUMBER OF BITS
+* TO SKIP BETWEEN SUCCESSIVE BYTES. ALL NON-NEGATIVE
+* SKIP COUNTS ARE LEGAL.
+* ITER: A FULLWORD INTEGER SPECIFYING THE TOTAL NUMBER OF
+* BYTES TO BE UNPACKED, AS CONTROLLED BY INOFST,
+* NBIT AND NSKIP ABOVE. ALL NON-NEGATIVE ITERATION
+* COUNTS ARE LEGAL.
+*
+* NOTES ...
+* 1) A MULTIPLE-BYTE ACCESS (GBYTES) WITH ITER=0 (BUT
+* NOT 1) IS EXACTLY EQUIVALENT TO A SINGLE-BYTE
+* ACCESS (GBYTE).
+* 2) AN ERROR DETECTED IN THE CALLING SEQUENCE OF
+* EITHER GBYTE OR GBYTES SUPPRESSES BYTE ACCESS,
+* AND SETS THE FIRST ELEMENT OF UNPK = X'FFFFFFFF'
+*
+GBYT TITLE 'IBM S/360 VERSION OF NCAR CDC/6600 BIT MANIPULATION'
+*
+* **** REGISTER USAGE ****
+ZERO EQU X'0' CONSTANT ZERO
+PCKD EQU X'1' ADDR OF PACKED ARY ELEMENT
+UNPK EQU X'2' ADDR OF UNPACKED ARY ELEMENT
+OFST EQU X'3' INITIAL BIT OFFSET
+NBIT EQU X'4' BYTE LENGTH IN BITS (.LE.32)
+NSKP EQU X'5' ITERATIVE BIT SKIP
+ITER EQU X'6' ITERATION COUNT (.GE.0)
+BITR EQU X'7' BITS REMAINING IN HIWD
+BITS EQU X'8' BITS TO SHIFT (OFST OR NSKP)
+WORK EQU X'9' WORK REGISTER
+HIWD EQU X'A' HI-ORDER WORD (EVEN REGISTER
+LOWD EQU X'B' LO-ORDER WORD (ODD REGISTER)
+BYTE EQU X'C' RESULTANT BYTE
+* EQU X'D' SAVE AREA ADDR (NOT MODIFIED)
+* EQU X'E' RETURN ADDR (NOT MODIFIED)
+BASE EQU X'F' BASE ADDR REGISTER
+NBFW EQU 4 NUMBER OF BYTES/FULL WORD
+*
+*
+* **** CODE ****
+*
+GBYTES CSECT , PRIME ENTRY POINT
+ ENTRY GBYTE ALTERNATE ENTRY POINT
+*
+ USING GBYTES,BASE ENTRY PT ADR ESTB IN R15 BY CALLER
+ SAVE (0,12) SAVE CALLING PROG REGISTERS (MACRO)
+ LM NSKP,ITER,4*NBFW(1) PICK UP NSKIP, ITER PARM ADDRESSES
+ L NSKP,0(,NSKP) PICK UP BIT SKIP COUNT
+ L ITER,0(,ITER) PICK UP ITERATION COUNT
+ B INIT JUMP INTO CODE PROPER
+*
+GBYTE DS 0H FORCE HALFWD ALLIGNMENT
+ USING GBYTE,BASE ALT ENTRY ADDR ESTB IN R15 BY CALLER
+ SAVE (0,12) SAVE CALLING PROG REGISTERS (MACRO)
+ SR ITER,ITER MAKE ITERATION COUNT ZERO
+*
+INIT BALR BASE,0 RE-ESTABLISH ADDRESSABILITY
+ USING *,BASE
+ LM PCKD,NBIT,0(1) PICK UP ARY AND PARAMETER ADDRESSES
+ L LOWD,0(,OFST) COMPUTE FIRST PCKD WORD AND OFFSET
+ LA WORK,32
+ SR HIWD,HIWD
+ DR HIWD,WORK
+ LR OFST,HIWD SET OFFSET TO REMAINDER
+ SLA LOWD,2
+ AR PCKD,LOWD INCR PCKD ADDRESS BY WHOLE WORDS
+ L HIWD,0(,PCKD) PICK UP FIRST WORD OF PACKED ARY
+ LH BITR,=H'32' AFTER HIWD FETCH FULL 32 BITS REMAIN
+ L NBIT,0(,NBIT) PICK UP NO. OF BITS/BYTE TO UNPACK
+ SR ZERO,ZERO ZERO OUT REG 0
+ LR WORK,BITR MAKE WORK=32
+ CR ITER,ZERO TEST FOR ZERO ITERATION COUNT
+ BH INIT1 IF NOT, CONTINUE WITH INITIALIZATION
+INIT0 CR OFST,BITR ELSE, TEST INITIAL OFFSET IN RANGE
+ BNL FAIL IF NOT .LT. 32, FAIL
+ LH ITER,=H'1' FORCE EXACTLY 1 ITERATION
+ B INIT2
+INIT1 AR NSKP,NBIT ADD NBIT TO NSKP FOR MULT ACCESS
+INIT2 LA PCKD,NBFW(PCKD) INCR PACKED ARY POINTER
+ L LOWD,0(,PCKD) PICK UP SECOND WD OF PACKED ARRAY
+ SR WORK,NBIT COMPLEMENT NBITS (MODULO 32)
+ CR WORK,ZERO TEST NBITS IN RANGE
+ BL FAIL IF NOT,.LE.32, FAIL
+ STH WORK,STORE+4 ELSE USE TO SET UP BYTE SHIFT COUNT
+* OF SRL (RX) INSTR IN STORE SEQ
+ LR BITS,OFST MAKE BITS TO SHIFT = INITIAL OFFSET
+ LR WORK,BITR MAKE WORK=32, AGAIN
+*
+TEST CR BITS,BITR COMPARE BITS TO SHIFT WITH REMAINING
+ BL SHIFT IF BITS.LT.BITR, PROCEED WITH SHIFT
+ BH SPLIT IF BITS.GT.BITR, ITER OVER SPLIT WDS
+* BE COPY ELSE, IF BITS.EQ.BITR, RECOPY HIWD
+*
+COPY L HIWD,0(,PCKD) RELOAD HIWD FROM MEM WITH PREV LOWD
+ LA PCKD,NBFW(PCKD) INCR PACKED ARY POINTER
+ L LOWD,0(,PCKD) AND PICK UP NEXT PACKED LOWD
+ LR BITR,WORK RESET BITR TO 32
+ B STORE PROCEED WITH STORE OPERATIONS
+*
+SPLIT STH BITR,*+6 SET UP BITR AS SLDL SHIFT COUNT
+ SLDL HIWD,*-* SHIFT LEFT DOUBLE LOGICAL, HIWD/LOWD
+ SR BITS,BITR DECR BITS TO SHIFT BY SHIFTED BITR
+ B SPLIT1 BYPASS FAST FULLWORD SKIPS
+ LR OFST,BITS COPY BITS REMAINING TO SHIFT TO OFST
+* (DESTROYING INITAL OFFSET PARM)
+ SRA OFST,5 DIVIDE BY 32 TO GET WORDS TO SHIFT
+* CR OFST,ZERO SIMULTANEOUSLY SETTING COND CODE
+* IF REMAINING SHIFT .LT. 1 WORD
+ BNH SPLIT1 FETCH NEXT SEQUENTIAL LOWD IMMED
+ SLA OFST,2 ELSE, MULTIPLY WDS BY 4 TO GET BYTES
+ AR PCKD,OFST INCR PACKED ARRAY POINTER
+ L HIWD,0(,PCKD) AND LOAD NEW HIWD
+ SLA OFST,3 MULTIPY BYTES BY 8 TO GET BITS
+ SR BITS,OFST AND DECR BITS REMAINING TO SHIFT
+SPLIT1 LA PCKD,NBFW(PCKD) INCR PACKED ARY PTR
+ L LOWD,0(,PCKD) AND PICK UP NEXT PACKED LOWD
+ LR BITR,WORK RESET BITR TO 32
+ B TEST ITERATE AS NECESSARY
+*
+SHIFT STH BITS,*+6 SET UP BITS AS SLDL SHIFT COUNT
+ SLDL HIWD,*-* SHIFT LEFT DOUBLE LOGICAL, HIWD/LOWD
+ SR BITR,BITS DECR BITS REMAINING BY BITS SHIFTED
+*
+STORE LR BYTE,HIWD COPY HIWD TO BYTE
+ SRL BYTE,*-* SHIFT RIGHT(WITH HI-ORDER ZERO FILL)
+* *-* SHIFT COUNT SET UP AT INIT2
+STORE1 ST BYTE,0(,UNPK) FILL BYTE INTO UNPACKED ARY
+ LA UNPK,NBFW(UNPK) AND INCR UNPACKED ARY POINTER
+ LR BITS,NSKP RESTORE BITS = (NSKP+NBIT)
+ BCT ITER,TEST DECR ITER COUNT, CONTINUE TILL ZERO
+*
+*
+EXIT RETURN (0,12) RESTORE CALLING PROG REGS (MACRO)
+*
+FAIL LH BYTE,=X'FFFF' MAKE BYTE A FULL WD OF 1'S
+ ST BYTE,0(,UNPK) AND FILL INTO UNPACKED ARRAY
+ B EXIT
+*
+ LTORG
+ END
+R0 EQU X'0'
+R1 EQU X'1'
+R2 EQU X'2'
+R3 EQU X'3'
+R4 EQU X'4'
+R5 EQU X'5'
+R6 EQU X'6'
+R7 EQU X'7'
+R8 EQU X'8'
+R9 EQU X'9'
+R10 EQU X'A'
+R11 EQU X'B'
+R12 EQU X'C'
+R13 EQU X'D'
+R14 EQU X'E'
+R15 EQU X'F'
+SBYTES CSECT ,
+*
+* SBYTE/SBYTES - GENERAL BIT PACKING ROUTINES.
+* SEE NCAR - TN/93, JANUARY 1974.
+* D. JOSEPH OCTOBER, 1981.
+*
+ ENTRY SBYTE
+ USING SBYTES,R15
+ SAVE (0,12)
+ STM R13,R14,REG13 SAVE REGISTER 13 AND 14 LOCAL.
+ LM R11,R12,16(R1) GET SKIP AND ITERATION COUNT.
+ L R11,0(R11)
+ L R12,0(R12)
+ B START
+SBYTE DS 0H
+ USING SBYTE,R15
+ SAVE (0,12)
+ STM R13,R14,REG13 SAVE REGISTER 13 AND 14 LOCAL.
+ SR R12,R12 ZERO ITERATION COUNT.
+START BALR R15,R0 RE-ESTABLISH ADDRESSABILITY.
+ USING *,R15
+ LM R7,R10,0(R1) GET REMAINING ARG ADDRESSES.
+ LA R1,1 SET CONSTANT ONE.
+ L R10,0(R10) GET BYTE SIZE.
+ LA R0,1 MAKE MASK.
+ SLL R0,31
+ SR R10,R1
+ STH R10,MASK+2
+ AR R10,R1
+ LA R6,32 MAKE CONSTANT 32.
+ L R14,COMP LOAD COMPLEMENT MASK.
+MASK SRA R0,*-*
+ LR R13,R0 SAVE MASK.
+ SLL R12,2 NUM OF ITERATIONS * FOUR.
+ AR R12,R8 SET ITERATION LIMIT.
+ L R4,0(R9) APPLY INITIAL OFFSET.
+ LA R1,96
+ CR R4,R1 CHECK FOR LARGE OFFSET.
+ BL NODIV
+ LR R5,R4
+ SR R4,R4
+ DR R4,R6 USE DIVIDE FOR LARGE OFFSET
+ SLL R5,2 CHANGE WORD COUNT TO BYTE COUNT.
+ AR R7,R5
+NODIV EQU *
+ LA R5,4 LOAD CONSTANT FOUR.
+RELOAD CR R4,R6 FIND WORD AND OFFSET.
+ BL ILOAD START IF OFFSET < 32.
+ SR R4,R6
+ AR R7,R5
+ B RELOAD
+ILOAD L R9,0(R7) GET STORE WORD.
+BEGIN STH R4,PMASK+2 POSITION MASK IN DOUBLE WORD.
+ SR R1,R1
+PMASK SRDL R0,*-*
+ L R3,0(R8) LOAD BYTE FOR STORE.
+ LA R2,64
+ SR R2,R10 POSITION BYTE.
+ SR R2,R4
+ STH R2,SHIFTB+2
+ SR R2,R2
+SHIFTB SLDL R2,*-* SHIFT BYTE TO STORE.
+ NR R2,R0 MASK ON CURRENT MASK.
+ XR R0,R14 COMPLEMENT MASK.
+ NR R9,R0 OPEN HOLE FOR BYTE.
+ OR R9,R2 INSERT BYTE.
+ AR R4,R10 ADD BYTE SIZE.
+ CR R4,R6
+ BNH NOPART BRANCH IF NO PARTIAL BYTE.
+ ST R9,0(R7) STORE CURRENT WORD.
+ SR R4,R6
+ AR R7,R5 ADD FOUR TO WORD ADDRESS.
+ L R9,0(R7) LOAD NEXT WORD.
+ NR R3,R1 ISOLATE PARTIAL BYTE.
+ XR R1,R14 COMPLEMENT MASK.
+ NR R9,R1 OPEN HOLE FOR PARTIAL BYTE.
+ OR R9,R3 INSERT PARTIAL BYTE.
+NOPART AR R8,R5 COUNT BYTE.
+ CR R8,R12 CHECK IF DONE.
+ BNL DONE
+ AR R4,R11 ADD SKIP AMOUNT.
+ LR R0,R13 RELOAD MASK
+ CR R4,R6
+ BL BEGIN BRANCH IF IN SAME WORD.
+ ST R9,0(R7) STORE CURRENT WORD.
+ B RELOAD GO TO GET NEW WORD.
+DONE ST R9,0(R7) STORE LAST WORD.
+ LM R13,R14,REG13 RESTORE REGISTER 13 AND 14.
+ RETURN (0,12)
+HMASK DS D ARE FOR CURRENT MASK.
+REG13 DS F
+REG14 DS F
+COMP DC X'FFFFFFFF' COMPLEMENT MASK.
+ LTORG
+ END
diff --git a/gribex/bt_sun.F b/gribex/bt_sun.F
new file mode 100755
index 0000000..cb6fcde
--- /dev/null
+++ b/gribex/bt_sun.F
@@ -0,0 +1,602 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+ C KBLEN,HFUNC,KRET)
+C
+C---->
+C**** INXBIT - Insert/extract bits consecutively in/from a given array
+C
+C Purpose.
+C --------
+C
+C Take rightmost KBLEN bits from KNUM words of KPARM
+C and insert them consecutively in KGRIB, starting at
+C bit after KNSPT or vice versa.
+C
+C** Interface.
+C ----------
+C
+C CALL INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+C C KBLEN,KRET)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KGRIB - Array containing bitstream.
+C KLENG - Length (words) of this array.
+C KNSPT - Bit number after which insertion or
+C extraction starts.
+C KPARM - Array from which bits are taken for
+C insertion in the bitstream or to which
+C bits are extracted from the bitstream.
+C KBIT - Number of bits in computer word.
+C KNUM - Number of bit fields inserted/extracted.
+C KBLEN - Number of bits per bit field.
+C HFUNC - Requested function.
+C 'C' to insert bits in bitstream,
+C 'D' to extract bits from bitstream.
+C
+C Output Parameters.
+C ------------------
+C
+C KNSPT - Bit number of last bit inserted/extracted.
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Insertion/extraction exceeded
+C array boundary.
+C
+C Method.
+C -------
+C
+C Word and offset pointer calculated before calling
+C insertion/extraction routines.
+C
+C Externals.
+C ----------
+C
+C SBYTES
+C GBYTES
+C
+C Reference.
+C ----------
+C
+C ECLIB documentation on SBYTES and GBYTES.
+C
+C Comments.
+C ---------
+C
+C SUN version of routine.
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 08.11.91
+C Parameter KMACH removed from list of input parameters.
+C
+C J. Hennessy ECMWF 12.10.92
+C Dimension of IMASK changed from 64 to 65.
+C
+C ----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+ INTEGER IND
+ INTEGER INUM
+ INTEGER IOFF
+ INTEGER IPR
+ INTEGER IWORD
+C
+ INTEGER KBIT
+ INTEGER KBLEN
+ INTEGER KGRIB
+ INTEGER KLENG
+ INTEGER KNSPT
+ INTEGER KNUM
+ INTEGER KPARM
+ INTEGER KRET
+C
+ INTEGER J901
+C
+ DIMENSION KGRIB(KLENG)
+ DIMENSION KPARM(*)
+C
+ CHARACTER*1 HFUNC
+C
+C
+C Debug print switch.
+C
+ DATA IPR /0/
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Set initial values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ WRITE (*,*) 'INXBIT : Section 1.'
+ WRITE (*,*) ' Input values used -'
+ WRITE (*,9009) KLENG
+ WRITE (*,9002) KNSPT
+ WRITE (*,9004) KBIT
+ WRITE (*,9005) HFUNC
+ ENDIF
+C
+ KRET = 0
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Bit insertion/extraction.
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 2.'
+C
+C* Calculate word pointer and offset.
+C
+ IWORD = KNSPT / KBIT
+ IOFF = KNSPT - IWORD * KBIT
+ IWORD = IWORD + 1
+ IF (IPR.EQ.1) WRITE (*,9003) IWORD , IOFF
+C
+C Insert/extract bits.
+C
+ IF (HFUNC.EQ.'C')
+ C THEN
+ CALL SBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ELSE
+ CALL GBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ENDIF
+C
+C Update pointer.
+C
+ KNSPT = KNSPT + KBLEN * KNUM
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 3 . Check out of range.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 3.'
+C
+ IND = KNSPT / KBIT
+ IF (IND.GT.KLENG)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) IND , KLENG
+ ENDIF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ INUM = KNUM
+ IF (INUM.GT.360)
+ C THEN
+ INUM = 360
+ WRITE (*,9007) INUM
+ ENDIF
+ DO 901 J901=1,INUM
+ IF (HFUNC.EQ.'C')
+ C THEN
+ WRITE (*,9006) KPARM(J901)
+ ELSE
+ WRITE (*,9008) KPARM(J901)
+ ENDIF
+ 901 CONTINUE
+ WRITE (*,*) 'INXBIT : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9002) KNSPT
+ ENDIF
+C
+C
+ 9001 FORMAT (1H ,'INXBIT : Word ',I8,' is outside array bounds ',I8)
+C
+ 9002 FORMAT (1H ,' KNSPT = ',I8)
+C
+ 9003 FORMAT (1H ,'INXBIT : Word is',I8,', bit offset is ',I2)
+C
+ 9004 FORMAT (1H ,' KBIT = ',I8)
+C
+ 9005 FORMAT (1H ,' HFUNC = ',A)
+C
+ 9006 FORMAT (1H ,' Inserted value = ',I20)
+C
+ 9007 FORMAT (1H ,' First ',I9,' values.')
+C
+ 9008 FORMAT (1H ,' Extracted value = ',I20)
+C
+ 9009 FORMAT (1H ,' KLENG = ',I20)
+C
+ RETURN
+C
+ END
+ SUBROUTINE ABORTX (HNAME)
+C
+C**** ABORTX - Terminates execution of program.
+C
+C Purpose.
+C --------
+C
+C Terminates execution of program.
+C
+C** Interface.
+C ----------
+C
+C CALL ABORTX (HNAME)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C HNAME - Name of calling routine.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C Prints message and terminates.
+C
+C Externals.
+C ----------
+C
+C ABORT
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C SUN version of routine.
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 13.11.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+C
+ CHARACTER*(*) HNAME
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Print message and terminate.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WRITE (*,9001) HNAME
+C
+ CALL ABORT
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ 9001 FORMAT (1H ,'ABORTX : Routine ',A,' has requested program',
+ C ' termination.')
+C
+ RETURN
+C
+ END
+ SUBROUTINE SETPAR (KBIT,KNEG,KPR)
+C
+C**** SETPAR - Set number of bits in word. Set maximum negative integer.
+C
+C Purpose.
+C --------
+C
+C Set number of bits in word. Set maximum negative integer.
+C
+C** Interface.
+C ----------
+C
+C CALL SETPAR (KBIT,KNEG,KPR)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KPR - Debug print switch.
+C 1 , print out.
+C 0 , No print out.
+C
+C Output Parameters.
+C ------------------
+C
+C KBIT - Number of bits in computer word.
+C
+C KNEG - Maximum negative integer.
+C
+C Method.
+C -------
+C
+C Values are assigned.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C SUN version of routine.
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 28.10.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+C
+ INTEGER KBIT
+ INTEGER KNEG
+ INTEGER KPR
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Assign values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) ' SETPAR : Section 1.'
+C
+ KBIT = 32
+ KNEG = -2147483647
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (KPR.EQ.1)
+ C THEN
+ WRITE (*,*) ' SETPAR : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9001) KBIT
+ WRITE (*,9002) KNEG
+ ENDIF
+C
+ 9001 FORMAT (1H ,' KBIT = ',I3)
+C
+ 9002 FORMAT (1H ,' KNEG = ',I22)
+C
+ RETURN
+C
+ END
diff --git a/gribex/bt_sun_c.c b/gribex/bt_sun_c.c
new file mode 100755
index 0000000..ef4d680
--- /dev/null
+++ b/gribex/bt_sun_c.c
@@ -0,0 +1,119 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+
+
+/* Tools for storage/retrieval of arbitrary size bytes from 32 bit words
+ (note - this version is not currently (6/30/88) described in the
+ gbytes document)
+ Modified by Arne Jorgensen 12-April-1991 (SUN routine)
+
+ gbytes(p,u,q,b,s,n)
+ gbyte (p,u,q,b)
+ sbytes(p,u,q,b,s,n)
+ sbyte (p,u,q,b)
+
+ q >= 0 number of bits to be skipped preceding first
+ byte in p
+ 0 < b < sword byte size
+ s >= 0 number of bits to be skipped between bytes
+ n >= 0 number of bytes to be packed/unpacked
+
+ gbytes unpacks n b bit bytes from p into u, starting by skipping
+ q bits in p, then skipping s bits between bytes.
+ gbyte unpacks one such byte.
+ sbytes packs n b bit bytes from u into p, starting by skipping
+ q bits in p, then skipping s bits between bytes.
+ sbyte packs one such byte. */
+#define SWORD 32 /* Word size in bits */
+#define MASK 0xffffffff /* Mask of sword bits */
+#define G1BYTE(p,q,b) ((b==32 ? MASK : ~(MASK<<b)) & (p>>(SWORD-(q+b))))
+ /* Get 1 word contained byte */
+# define MASK1(q,b) (b==32 ? MASK : (~(MASK<<b)<<(SWORD-(q+b))))
+ /* Mask of sword bits */
+gsbytes(p,u,q,b,s,n,gsbyte) /* Common code for gbytes, sbytes */
+long p[],u[],*q,*b,*s,*n;
+int (*gsbyte)();
+{ long jp,jq,ju;
+ jp = 0;
+ jq = *q;
+ for (ju = 0; ju < *n; ++ju) {
+ (*gsbyte)(&p[jp],&u[ju],&jq,b);
+ jq += *b + *s;
+ jp += jq/SWORD;
+ jq %= SWORD;
+ }
+}
+gbytes_(p,u,q,b,s,n)
+long p[],u[],*q,*b,*s,*n;
+{
+ int gbyte_();
+ gsbytes(p,u,q,b,s,n,gbyte_);
+}
+gbyte_(p,u,q,b)
+long p[],*u,*q,*b;
+{
+ long qb,j,lb,jq,jb;
+
+ jq = *q;
+ jb = *b;
+ if (jq >= SWORD) {
+ j = jq/SWORD; /* number of words offset */
+ jq %= SWORD; /* odd bits of offset */
+ }
+ else {
+ j=0;
+ }
+ qb = jq + jb;
+ if (qb > SWORD) {
+ qb = SWORD - jq;
+ jb -= qb;
+ lb = (G1BYTE(p[j],jq,qb)) << jb;
+ jq = 0;
+ j++; /* increment to next word */
+ }
+ else lb = 0;
+ *u = lb + (G1BYTE(p[j],jq,jb));
+}
+sbytes_(p,u,q,b,s,n)
+long p[],u[],*q,*b,*s,*n;
+{
+ int sbyte_();
+ gsbytes(p,u,q,b,s,n,sbyte_);
+}
+sbyte_(p,u,q,b)
+long p[],*u,*q,*b;
+{
+ long qb,j,jq,jb,rb;
+
+ jq = *q;
+ jb = *b;
+ if (jq >= SWORD) {
+ j = jq / SWORD; /* number of words offset */
+ jq %= SWORD; /* odd bit offset */
+ }
+ else {
+ j = 0;
+ }
+ qb = jq + jb;
+ if (qb > SWORD) {
+ qb = SWORD - jq;
+ jq = SWORD - jb;
+ jb -= qb;
+ p[j] = ((p[j] >> qb) << qb) + (G1BYTE(*u,jq,qb));
+ jq = 0;
+ j++; /* point to next word */
+ }
+ rb = G1BYTE(*u,SWORD-jb,jb);
+ p[j] = (p[j] & ~MASK1(jq,jb)) + (rb << SWORD-(jb+jq));
+}
+
diff --git a/gribex/bt_vax.F b/gribex/bt_vax.F
new file mode 100755
index 0000000..668e676
--- /dev/null
+++ b/gribex/bt_vax.F
@@ -0,0 +1,992 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+ C KBLEN,HFUNC,KRET)
+C
+C---->
+C**** INXBIT - Insert/extract bits consecutively in/from a given array
+C
+C Purpose.
+C --------
+C
+C Take rightmost KBLEN bits from KNUM words of KPARM
+C and insert them consecutively in KGRIB, starting at
+C bit after KNSPT or vice versa.
+C
+C** Interface.
+C ----------
+C
+C CALL INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+C C KBLEN,KRET)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KGRIB - Array containing bitstream.
+C KLENG - Length (words) of this array.
+C KNSPT - Bit number after which insertion or
+C extraction starts.
+C KPARM - Array from which bits are taken for
+C insertion in the bitstream or to which
+C bits are extracted from the bitstream.
+C KBIT - Number of bits in computer word.
+C KNUM - Number of bit fields inserted/extracted.
+C KBLEN - Number of bits per bit field.
+C HFUNC - Requested function.
+C 'C' to insert bits in bitstream,
+C 'D' to extract bits from bitstream.
+C
+C Output Parameters.
+C ------------------
+C
+C KNSPT - Bit number of last bit inserted/extracted.
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Insertion/extraction exceeded
+C array boundary.
+C
+C Method.
+C -------
+C
+C Word and offset pointer calculated before calling
+C insertion/extraction routines.
+C
+C Externals.
+C ----------
+C
+C SBYTES
+C GBYTES
+C
+C Reference.
+C ----------
+C
+C ECLIB documentation on SBYTES and GBYTES.
+C
+C Comments.
+C ---------
+C
+C VAX version of routine.
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 08.11.91
+C Parameter KMACH removed from list of input parameters.
+C
+C J. Hennessy ECMWF 12.10.92
+C Dimension of IMASK changed from 64 to 65.
+C
+C ----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+ INTEGER IND
+ INTEGER INUM
+ INTEGER IOFF
+ INTEGER IPR
+ INTEGER IWORD
+C
+ INTEGER KBIT
+ INTEGER KBLEN
+ INTEGER KGRIB
+ INTEGER KLENG
+ INTEGER KNSPT
+ INTEGER KNUM
+ INTEGER KPARM
+ INTEGER KRET
+C
+ INTEGER J901
+C
+ DIMENSION KGRIB(KLENG)
+ DIMENSION KPARM(*)
+C
+ CHARACTER*1 HFUNC
+C
+C
+C Debug print switch.
+C
+ DATA IPR /0/
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Set initial values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ WRITE (*,*) 'INXBIT : Section 1.'
+ WRITE (*,*) ' Input values used -'
+ WRITE (*,9009) KLENG
+ WRITE (*,9002) KNSPT
+ WRITE (*,9004) KBIT
+ WRITE (*,9005) HFUNC
+ ENDIF
+C
+ KRET = 0
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Bit insertion/extraction.
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 2.'
+C
+C* Calculate word pointer and offset.
+C
+ IWORD = KNSPT / KBIT
+ IOFF = KNSPT - IWORD * KBIT
+ IWORD = IWORD + 1
+ IF (IPR.EQ.1) WRITE (*,9003) IWORD , IOFF
+C
+C Insert/extract bits.
+C
+ IF (HFUNC.EQ.'C')
+ C THEN
+ CALL SBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ELSE
+ CALL GBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ENDIF
+C
+C Update pointer.
+C
+ KNSPT = KNSPT + KBLEN * KNUM
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 3 . Check out of range.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 3.'
+C
+ IND = KNSPT / KBIT
+ IF (IND.GT.KLENG)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) IND , KLENG
+ ENDIF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ INUM = KNUM
+ IF (INUM.GT.360)
+ C THEN
+ INUM = 360
+ WRITE (*,9007) INUM
+ ENDIF
+ DO 901 J901=1,INUM
+ IF (HFUNC.EQ.'C')
+ C THEN
+ WRITE (*,9006) KPARM(J901)
+ ELSE
+ WRITE (*,9008) KPARM(J901)
+ ENDIF
+ 901 CONTINUE
+ WRITE (*,*) 'INXBIT : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9002) KNSPT
+ ENDIF
+C
+C
+ 9001 FORMAT (1H ,'INXBIT : Word ',I8,' is outside array bounds ',I8)
+C
+ 9002 FORMAT (1H ,' KNSPT = ',I8)
+C
+ 9003 FORMAT (1H ,'INXBIT : Word is',I8,', bit offset is ',I2)
+C
+ 9004 FORMAT (1H ,' KBIT = ',I8)
+C
+ 9005 FORMAT (1H ,' HFUNC = ',A)
+C
+ 9006 FORMAT (1H ,' Inserted value = ',I20)
+C
+ 9007 FORMAT (1H ,' First ',I9,' values.')
+C
+ 9008 FORMAT (1H ,' Extracted value = ',I20)
+C
+ 9009 FORMAT (1H ,' KLENG = ',I20)
+C
+ RETURN
+C
+ END
+ SUBROUTINE ABORTX (HNAME)
+C
+C**** ABORTX - Terminates execution of program.
+C
+C Purpose.
+C --------
+C
+C Terminates execution of program.
+C
+C** Interface.
+C ----------
+C
+C CALL ABORTX (HNAME)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C HNAME - Name of calling routine.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C Prints message and terminates.
+C
+C Externals.
+C ----------
+C
+C EXIT
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C VAX version of routine.
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 13.11.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+C
+ CHARACTER*(*) HNAME
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Print message and terminate.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WRITE (*,9001) HNAME
+C
+ CALL EXIT (-1)
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ 9001 FORMAT (1H ,'ABORTX : Routine ',A,' has requested program',
+ C ' termination.')
+C
+ RETURN
+C
+ END
+ SUBROUTINE SETPAR (KBIT,KNEG,KPR)
+C
+C**** SETPAR - Set number of bits in word. Set maximum negative integer.
+C
+C Purpose.
+C --------
+C
+C Set number of bits in word. Set maximum negative integer.
+C
+C** Interface.
+C ----------
+C
+C CALL SETPAR (KBIT,KNEG,KPR)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KPR - Debug print switch.
+C 1 , print out.
+C 0 , No print out.
+C
+C Output Parameters.
+C ------------------
+C
+C KBIT - Number of bits in computer word.
+C
+C KNEG - Maximum negative integer.
+C
+C Method.
+C -------
+C
+C Values are assigned.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C VAX version of routine.
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 28.10.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+C
+ INTEGER KBIT
+ INTEGER KNEG
+ INTEGER KPR
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Assign values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) ' SETPAR : Section 1.'
+C
+ KBIT = 32
+ KNEG = -2147483648
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (KPR.EQ.1)
+ C THEN
+ WRITE (*,*) ' SETPAR : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9001) KBIT
+ WRITE (*,9002) KNEG
+ ENDIF
+C
+ 9001 FORMAT (1H ,' KBIT = ',I3)
+C
+ 9002 FORMAT (1H ,' KNEG = ',I22)
+C
+ RETURN
+C
+ END
+ SUBROUTINE GBITS(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C
+C**** GBITS - VAX routine.
+C
+ DIMENSION NPACK(*),ISAM(*)
+ PARAMETER (LENWRD=32)
+C
+C ++++++++++
+C CALL GBITS(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C ++++++++++
+C
+C STARTS UNPACKING BITS AT BIT OFFSET IBIT IN ARRAY
+C NPACK. IT TAKES NBITS AND STORES THEM IN THE LONGWORD
+C ARRAY STARTING AT ISAM. THEN NSKIP BITS ARE SKIPPED IN
+C NPACK AND THE NEXT FIELD OF NBITS IS UNPACKED INTO THE
+C NEXT ISAM. THIS IS DONE A TOTAL OF ITER TIMES.
+C
+C THIS ROUTINE EXTRACTS BITS FROM VAX WORDS.
+C IT IS SIMILAR TO NCAR'S GBYTE BUT IT WORKS WITH
+C THE NATURAL UNDERLYING STRUCTURE OF THE VAX.
+C ----------
+C
+ ISW = 1
+ GO TO 8
+C
+C
+ ENTRY SBITS(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C
+C ++++++++++
+C CALL SBITS(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C ++++++++++
+C
+C THIS ROUTINE TAKES THE FIRST LONGWORD LOCATED AT
+C ISAM AND STORES IT INTO THE NBITS OF NPACK STARTING AT
+C BIT OFFSET IBIT. THEN NSKIP BITS ARE SKIPPED IN
+C NPACK AND THE PROCESS IS REPEATED A TOTAL OF ITER TIMES.
+C
+C THIS ROUTINE EXTRACTS BITS FROM VAX WORDS.
+C IT IS SIMILAR TO NCAR'S SBYTE BUT IT WORKS WITH
+C THE NATURAL UNDERLYING STRUCTURE OF THE VAX.
+C ----------
+ ISW = 2
+ GO TO 8
+C
+C ++++++++++
+ ENTRY G_BYTES(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C ++++++++++
+C
+C CALL G_BYTES(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C STARTS UNPACKING BITS AT BIT OFFSET IBIT IN ARRAY
+C NPACK. IT TAKES NBITS AND STORES THEM IN THE LONGWORD
+C ARRAY STARTING AT ISAM. THEN NSKIP BITS ARE SKIPPED IN
+C NPACK AND THE NEXT FIELD OF NBITS IS UNPACKED INTO THE
+C NEXT ISAM. THIS IS DONE A TOTAL OF ITER TIMES.
+C
+C THIS ROUTINE DEALS WITH BITS AND BYTES IN THE ORDER
+C THEY ARE NUMBERED ON THE MESA (IE BIGENDIAN).
+C ----------
+ ISW = 3
+ GO TO 8
+C
+C ++++++++++
+ ENTRY S_BYTES(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C ++++++++++
+C
+C CALL S_BYTES(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C THIS ROUTINE TAKES THE FIRST LONGWORD LOCATED AT
+C ISAM AND STORES IT INTO THE NBITS OF NPACK STARTING AT
+C BIT OFFSET IBIT. THEN NSKIP BITS ARE SKIPPED IN
+C NPACK AND THE PROCESS IS REPEATED A TOTAL OF ITER TIMES.
+C
+C
+C THIS ROUTINE DEALS WITH BITS AND BYTES IN THE ORDER
+C THEY ARE NUMBERED ON THE MESA (IE BIGENDIAN).
+C ----------
+ ISW = 4
+ GOTO 8
+C
+C ++++++++++
+ ENTRY GBYTES(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C ++++++++++
+C
+C THIS ROUTINE IS JUST A REPEATED CALL TO G_BYTE
+C WHERE SUCCESSIVE CALLS SKIP NSKIP BITS
+C AND THE LOOP COUNT IS ITER
+ ISW = 5
+ GOTO 8
+C
+C ++++++++++
+ ENTRY SBYTES(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C ++++++++++
+C
+C THIS ROUTINE IS JUST A REPEATED CALL TO S_BYTE
+C WHERE SUCCESSIVE CALLS SKIP NSKIP BITS
+C AND THE LOOP COUNT IS ITER
+ ISW = 6
+ GO TO 8
+C
+C ++++++++++
+ ENTRY GBILS(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C ++++++++++
+C
+C GBIL(S)/SBIL(S) ENTRIES ALLOW DIRECT MAINTENANCE OF LEFT TO RIGHT
+C BIT STRINGS IN DEC ENVIRONMENT (VAX). THE MODIFICATION RETAINS FUL
+C COMPATIBILITY WITH ORIGINAL ENTRIES, HOWEVER, VERIFICATION BEYOND
+C GBIL(S)/SBIL(S) WAS VIA GBITS/SBITS ONLY (NOT GBYTES/SBYTES).
+C
+C MODIFICATION PROGRAMMED BY A.D.STROUD, COMPASS SYSTEMS, INC.
+C NOVEMBER 1987 UNDER TOGA GRAND FUNDING DURING SOFTWARE DEVELOPMENT
+C FOR WMO PROPOSED STANDARD FM 94 BUFR ON THE VAX STATION II AT THE
+C OAG/NOS/NOAA, MONTEREY, CA.
+C
+C FOR GBIL(S)/SBIL(S) THE FOLLOWING PARAMETER USAGE APPLIES
+C
+C NPACK - LEFT MOST(HIGHEST INDEXED) LONGWORD IN PACKED BIT STRING
+C ARRAY SPACE INFERRED BY IBIT(IN LIEU OF LOWEST INDEX FOR
+C NON-DEC, NOTE - SECOND 32 BIT SUBSTRING IN BIT STRING IS
+C NPACK(0), THIRD 32 BIT SUBSTRING IS NPACK(-1), ETC.,...)
+C
+C ISAM - ARRAY HOLDING/TO HOLD UNPACKED ELEMENT(S) (RJZF) FOR
+C SBIL(S)/GBIL(S), RESPECTIVELY.
+C
+C IBIT - INITIAL LEFT TO RIGHT BIT SKIP WITHIN THE NPACK BIT STRI
+C (INCLUDING LEFTMOST BIT OF NPACK, INTERPRET BIT SKIP THE
+C SAME AS IN NON-DEC ENVIRONMENT)
+C
+C NBITS - FIXED BIT WIDTH OF EACH ELEMENT TO BE UNPACKED.
+C
+C NSKIP - FIXED LEFT TO RIGHT BIT SKIP WIDTH BETWEEN ELEMENTS.
+C
+C ITER - NUMBER OF ELEMENTS TO UNPACK(IMPLIED MINIMUM DIMENSIONAL
+C OF ISAM ARRAY).
+C
+C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C EXAMPLE
+C
+C 1) PARAMETER (N4=1000 , NB=4000, NL=1000)
+C 2) INTEGER I4(N4),UNPACK(99)
+C 3) BYTE IB(NB)
+C 4) EQUIVALENCE (I4(1),IB(1))
+C
+C 5) READ(LUI,'(4000A1)') (IB(I),I=NB,1,-1)
+C FORMATTED READ OF ARBITRARY BITSTRING FROM NON-DEC
+C SITE, OR FROM DEC FILE AS WRITTEN AT 9) BELOW.
+C
+C 6) CALL GBILS(I4(NL),UNPK,67,22,47,95)
+C AFTER INITIALLY SKIPPING 67 BITS TO A POINT BEYOND THE
+C LEFTMOST THREE BITS OF I4(NL-2), GBILS ACQUIRES 95
+C SUBSTRING ELEMENTS OF THE WIDTH 22 BITS(EACH RIGHT JUST
+C WITH HIGH ORDER ZERO FILL) INTO THE RESPECTIVE FIRST
+C 95 ARRAY ELEMENTS OF UNPK. SEPARATED BY 47 BITS IN SOUR
+C BITSTRING ARRAY I4, THE EXTRACTED DUPLICATE SUBSTRING
+C ELEMENTS ARE NOW EFFECTIVELY SEPARATED FROM EACH OTHER
+C BY 10 ZERO BITS IN OBJECT BITSTRING ARRAY UNPK.
+C
+C 7) UNPK(J)=... (J=1,95)
+C
+C 8) CALL SBILS(I4(NL),UNPK,67,22,47,95)
+C AFTER INITIALLY SKIPPING 67 BITS TO A POINT BEYOND THE
+C LEFTMOST THREE BITS OF I4(NL-2), SBILS STORES IN SUCCES
+C SIVE BITS THE FIRST OF 95 MODIFIED UNPK RIGHTMOST 22 BI
+C WIDTH SUBSTRING ELEMENTS. AFTER SKIPPING 47 BITS BEYOND
+C THE RIGHTMOST OF THE FIRST 22 BITS STORED, THE SECOND 2
+C BIT ELEMENT IS STORED, ETC. THE ORIGINAL SUBSTRING
+C ELEMENTS HAVE BEEN REPLACED BY MODIFIED SUBSRING ELEMEN
+C IN SITU WITHIN THE BITSTRING ARRAY I4 WITHOUT MODIFYING
+C ANY OTHER BITS.
+C
+C 9) WRITE(LUO,'(4000A1)') (IB(I),I=NB,1,-1)
+C FILE FOR NON-DEC OR FOR READ 5) ABOVE.
+C
+C
+C
+ ISW = 7
+ GO TO 6
+C
+C ++++++++++
+ ENTRY SBILS(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C ++++++++++
+C
+C
+ ISW = 8
+ GO TO 6
+C
+C ++++++++++
+ ENTRY GBIL(NPACK,ISAM,IBIT,NBITS)
+C ++++++++++
+C
+ ISW = 9
+ GO TO 5
+C
+C ++++++++++
+ ENTRY SBIL(NPACK,ISAM,IBIT,NBITS)
+C ++++++++++
+C
+ ISW=10
+ 5 ITER1= 1
+ NSKIP1=-NBITS
+ GO TO 7
+C
+ 6 NSKIP1=-NSKIP-NBITS
+C
+ 7 JOFF=-IBIT-NBITS
+ IF(ISW.LT.9) GO TO 9
+ GO TO 10
+C
+ 8 NSKIP1=NSKIP+NBITS
+ JOFF=IBIT
+C
+ 9 ITER1=ITER
+C
+C
+ 10 DO 30 I = 1 , ITER1
+C
+ IF(JOFF.GT.0) IBASE=JOFF/LENWRD+1
+ IF(JOFF.LE.0) IBASE=(JOFF+1)/LENWRD+1
+ IOFF=MOD(JOFF,LENWRD)
+ IF(JOFF.LE.0) IOFF=MOD(IOFF+LENWRD,LENWRD)
+C
+ GO TO(11,12,13,14,15,16,11,12,11,12) ISW
+C
+11 CALL GBIT(NPACK(IBASE),ISAM(I),IOFF,NBITS)
+ GO TO 20
+12 CALL SBIT(NPACK(IBASE),ISAM(I),IOFF,NBITS)
+ GO TO 20
+13 CALL G_BYTe(NPACK(IBASE),ISAM(I),IOFF,NBITS)
+ GO TO 20
+14 CALL S_BYTE(NPACK(IBASE),ISAM(I),IOFF,NBITS)
+ GO TO 20
+15 CALL GBYTE(NPACK(IBASE),ISAM(I),IOFF,NBITS)
+ GOTO 20
+16 CALL SBYTE(NPACK(IBASE),ISAM(I),IOFF,NBITS)
+ GOTO 20
+20 JOFF = JOFF + NSKIP1
+30 CONTINUE
+ RETURN
+ END
+ SUBROUTINE GBYTE(NPACK,ISAM,IBIT,NBITS)
+C
+C**** GBYTE - VAX routine.
+C
+C ++++++++++
+C CALL GBYTE(NPACK,ISAM,IBIT,NBITS)
+C STARTS UNPACKING BITS AT BIT OFFSET IBIT IN ARRAY
+C NPACK. IT TAKES NBITS AND STORES THEM IN THE LONGWORD
+C ARRAY STARTING AT ISAM.
+C
+C THIS ROUTINE DEALS WITH BITS AND BYTES IN THE ORDER
+C THEY ARE NUMBERED ON THE MESA (IE BIGENDIAN).
+C ----------
+C
+C GBYTE AND SBYTE ARE SPECIAL ROUTINES TO DO THE SAME
+C THINGS AS THEIR COUNTERPARTS ON THE MESA.
+C THEY DIFFER FROM THE BITS ROUTINES IN THAT BITS
+C ARE COUNTED FROM THE TOP OF THE WORD RATHER THAN
+C THE BOTTOM. THIS MEANS THAT THE BITS THEY SPECIFY JUMP AROUND
+C WHEN CROSSING BYTE BOUNDARIES. THERE IS NO ASSUMPTION
+C MADE ABOUT THE WORDSIZE OF THE MACHINE THEY WERE WRITTEN
+C ON. HOWEVER THE MAXIMUM NUMBER OF BITS EXTRACTED MUST BE
+C LESS THAN OR EQUAL TO 32.
+C
+ BYTE NPACK(8)
+ INTEGER T
+ EXTERNAL SS$_ABORT
+ IDBIT(I) = 7 - MOD(I,8)
+ ISW = 3
+ ISAM = 0
+ GO TO 10
+ ENTRY SBYTE(NPACK,ISAM,IBIT,NBITS)
+C ++++++++++
+C CALL SBYTE(NPACK,ISAM,IBIT,NBITS)
+C THIS ROUTINE TAKES THE FIRST LONGWORD LOCATED AT
+C ISAM AND STORES IT INTO THE NBITS OF NPACK STARTING AT
+C BIT OFFSET IBIT.
+C
+C
+C THIS ROUTINE DEALS WITH BITS AND BYTES IN THE ORDER
+C THEY ARE NUMBERED ON THE MESA (IE BIGENDIAN).
+C ----------
+ ISW = 4
+10 IBASE = IBIT/8
+C IBASE POINTS TO THE FIRST BYTE INVOLVED
+ IOFF = IBIT - 8*IBASE
+C IOFF IS THE BIT OFFSET WITHIN FIRST BYTE
+ M = (IOFF+NBITS-1)/8 + 1
+C M IS THE NUMBER OF BYTES (INCLUDING PARTIALS) INVOLVED
+C IF(M.GT.5)THEN
+ IF(NBITS.GT.32)THEN
+ TYPE *,'ILLEGAL VALUE FOR NBITS IN S/GBYTE(S) CALL'
+ CALL SYS$EXIT(SS$_ABORT)
+ END IF
+ NN = 0
+C NN IS THE NUMBER OF BITS TRANSFERRED
+ DO 20 I = M , 1 , -1
+C LOOP ON BYTES
+ IS = IDBIT(0)
+C CALC FIRST BIT WITHIN BYTE
+ IE = IDBIT(7)
+C CALC LAST BIT WITHIN BYTE
+ IF(I.EQ.1)IS = IDBIT(IOFF)
+C FIRST BIT VARIES FOR FIRST BYTE
+ IF(I.EQ.M)IE = IDBIT(IOFF+NBITS-1)
+C LAST BIT VARIES FOR LAST BYTE
+ N = IS - IE + 1
+C CALC NUMBER OF BITS WITHIN BYTE TO XFER
+ IF(ISW.EQ.4)GO TO 12
+ CALL GBIT(NPACK(IBASE+I),T,IE,N)
+C EXTRACT BITS FROM SOURCE
+ CALL SBIT(ISAM,T,NN,N)
+C AND LOAD INTO DESTINATION
+ GO TO 15
+12 CALL GBIT(ISAM,T,NN,N)
+C EXTRACT BITS FROM SOURCE
+ CALL SBIT(NPACK(IBASE+I),T,IE,N)
+C AND LOAD INTO DESTINATION
+15 NN = NN + N
+C UPDATE BITS XFERRED
+20 CONTINUE
+ RETURN
+ END
+ SUBROUTINE G_BYTE(NPACK,ISAM,IBIT,NBITS)
+C
+C**** G_BYTE - VAX routine.
+C
+C G_BYTE AND S_BYTE ARE SPECIAL ROUTINES TO DO THE SAME
+C THINGS AS THEIR COUNTERPARTS ON THE MESA.
+C THEY DIFFER FROM THE BITS ROUTINES IN THAT BITS
+C ARE COUNTED FROM THE TOP OF THE WORD RATHER THAN
+C THE BOTTOM. THIS MEANS THAT THE BITS THEY SPECIFY JUMP AROUND
+C WHEN CROSSING BYTE BOUNDARIES. THERE IS NO ASSUMPTION
+C MADE ABOUT THE WORDSIZE OF THE MACHINE THEY WERE WRITTEN
+C ON. HOWEVER THE MAXIMUM NUMBER OF BITS EXTRACTED MUST BE
+C LESS THAN OR EQUAL TO 32.
+C
+ BYTE NPACK(8)
+ INTEGER T
+ EXTERNAL SS$_ABORT
+ IDBIT(I) = 7 - MOD(I,8)
+ ISW = 3
+ ISAM = 0
+ GO TO 10
+ ENTRY S_BYTE(NPACK,ISAM,IBIT,NBITS)
+ ISW = 4
+10 IBASE = IBIT/8
+C IBASE POINTS TO THE FIRST BYTE INVOLVED
+ IOFF = IBIT - 8*IBASE
+C IOFF IS THE BIT OFFSET WITHIN FIRST BYTE
+ M = (IOFF+NBITS-1)/8 + 1
+C M IS THE NUMBER OF BYTES (INCLUDING PARTIALS) INVOLVED
+C IF(M.GT.5)THEN
+ IF(NBITS.GT.32)THEN
+ TYPE *,'ILLEGAL VALUE FOR NBITS IN S/G_BYTE(S) CALL'
+ CALL SYS$EXIT(SS$_ABORT)
+ END IF
+ NN = 0
+C NN IS THE NUMBER OF BITS TRANSFERRED
+ DO 20 I = M , 1 , -1
+C LOOP ON BYTES
+ IBB = IBASE + I - 1
+ IBC = IBB/4
+ IBD = 4*IBC+3-MOD(IBB,4) + 1
+C CALCULATE UNSHIFTED BYTE
+ IS = IDBIT(0)
+C CALC FIRST BIT WITHIN BYTE
+ IE = IDBIT(7)
+C CALC LAST BIT WITHIN BYTE
+ IF(I.EQ.1)IS = IDBIT(IOFF)
+C FIRST BIT VARIES FOR FIRST BYTE
+ IF(I.EQ.M)IE = IDBIT(IOFF+NBITS-1)
+C LAST BIT VARIES FOR LAST BYTE
+ N = IS - IE + 1
+C CALC NUMBER OF BITS WITHIN BYTE TO XFER
+ IF(ISW.EQ.4)GO TO 12
+C CALL GBIT(NPACK(IBASE+I),T,IE,N)
+ CALL GBIT(NPACK(IBD),T,IE,N)
+C EXTRACT BITS FROM SOURCE
+ CALL SBIT(ISAM,T,NN,N)
+C AND LOAD INTO DESTINATION
+ GO TO 15
+12 CALL GBIT(ISAM,T,NN,N)
+C EXTRACT BITS FROM SOURCE
+C CALL SBIT(NPACK(IBASE+I),T,IE,N)
+ CALL SBIT(NPACK(IBD),T,IE,N)
+C AND LOAD INTO DESTINATION
+15 NN = NN + N
+C UPDATE BITS XFERRED
+20 CONTINUE
+ RETURN
+ END
diff --git a/gribex/bt_vax_mar.mar b/gribex/bt_vax_mar.mar
new file mode 100755
index 0000000..aee718b
--- /dev/null
+++ b/gribex/bt_vax_mar.mar
@@ -0,0 +1,29 @@
+ .TITLE SGBIT
+; ++++++++++
+; CALL GBIT(NPACK,ISAM,IBIT,NBITS)
+; UNPACKS THE BIT PATTERN LOCATED AT A BIT OFFSET
+; OF IBIT IN NPACK OF LENGTH NBITS INTO ISAM.
+;
+; THIS ROUTINE EXTRACTS BITS FROM VAX WORDS.
+; IT IS SIMILAR TO NCAR'S GBYTE BUT IT WORKS WITH
+; THE NATURAL UNDERLYING STRUCTURE OF THE VAX.
+; ----------
+ .PSECT MACRO_CODE PIC,USR,CON,REL,LCL,SHR,EXE,RD,NOWRT,NOVEC
+ .ENTRY GBIT,0
+ EXTZV @12(AP), at 16(AP), at 4(AP), at 8(AP) ;ISN'T THIS NEAT ?
+ RET
+;
+;
+; ++++++++++
+; CALL SBIT(NPACK,ISAM,IBIT,NBITS)
+; PACKS THE VALUE IN ISAM INTO NPACK
+; WITH NBITS OFFSET BY IBIT.
+;
+; THIS ROUTINE EXTRACTS BITS FROM VAX WORDS.
+; IT IS SIMILAR TO NCAR'S SBYTE BUT IT WORKS WITH
+; THE NATURAL UNDERLYING STRUCTURE OF THE VAX.
+; ----------
+ .ENTRY SBIT,0
+ INSV @8(AP), at 12(AP), at 16(AP), at 4(AP) ;ISN'T THIS NEAT ?
+ RET
+ .END
diff --git a/gribex/btcray.special b/gribex/btcray.special
new file mode 100755
index 0000000..0da7a18
--- /dev/null
+++ b/gribex/btcray.special
@@ -0,0 +1,1141 @@
+ SUBROUTINE INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+ C KBLEN,HFUNC,KRET)
+C
+C**** INXBIT - Insert/extract bits consecutively in/from a given array
+C
+C Purpose.
+C --------
+C
+C Take rightmost KBLEN bits from KNUM words of KPARM
+C and insert them consecutively in KGRIB, starting at
+C bit after KNSPT or vice versa.
+C
+C** Interface.
+C ----------
+C
+C CALL INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+C C KBLEN,KRET)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KGRIB - Array containing bitstream.
+C KLENG - Length (words) of this array.
+C KNSPT - Bit number after which insertion or
+C extraction starts.
+C KPARM - Array from which bits are taken for
+C insertion in the bitstream or to which
+C bits are extracted from the bitstream.
+C KBIT - Number of bits in computer word.
+C KNUM - Number of bit fields inserted/extracted.
+C KBLEN - Number of bits per bit field.
+C HFUNC - Requested function.
+C 'C' to insert bits in bitstream,
+C 'D' to extract bits from bitstream.
+C
+C Output Parameters.
+C ------------------
+C
+C KNSPT - Bit number of last bit inserted/extracted.
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Insertion/extraction exceeded
+C array boundary.
+C
+C Method.
+C -------
+C
+C Word and offset pointer calculated before calling
+C insertion/extraction routines.
+C
+C Externals.
+C ----------
+C
+C SBYTES
+C GBYTES
+C GSBITE
+C
+C Reference.
+C ----------
+C
+C ECLIB documentation on SBYTES and GBYTES.
+C
+C Comments.
+C ---------
+C
+C Cray version of routine.
+C This routine should only be used on the Cray as it
+C contains a call to GSBITE, a vectorising version of
+C GBYTE(S) and SBYTE(S).
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 08.11.91
+C Parameter KMACH removed from list of input parameters.
+C
+C J. Hennessy ECMWF 12.10.92
+C Dimension of IMASK changed from 64 to 65.
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+ IMPLICIT NONE
+C
+ INTEGER IMASK
+ INTEGER IND
+ INTEGER INUM
+ INTEGER IOFF
+ INTEGER IPR
+ INTEGER IWORD
+C
+ INTEGER KBIT
+ INTEGER KBLEN
+ INTEGER KGRIB
+ INTEGER KLENG
+ INTEGER KNSPT
+ INTEGER KNUM
+ INTEGER KPARM
+ INTEGER KRET
+C
+ INTEGER J901
+C
+ DIMENSION KGRIB(KLENG)
+ DIMENSION KPARM(*)
+ DIMENSION IMASK(65)
+C
+ CHARACTER*1 HFUNC
+C
+C Values in IMASK are set in the first call to routine GSBITE, and
+C are used in subsequent calls.
+C
+ SAVE IMASK
+C
+C Force routine GSBITE to calculate bit-masks first time through.
+C
+ DATA IMASK(2) /0/
+C
+C Debug print switch.
+C
+ DATA IPR /0/
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Set initial values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ WRITE (*,*) 'INXBIT : Section 1.'
+ WRITE (*,*) ' Input values used -'
+ WRITE (*,9009) KLENG
+ WRITE (*,9002) KNSPT
+ WRITE (*,9004) KBIT
+ WRITE (*,9005) HFUNC
+ ENDIF
+C
+ KRET = 0
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Bit insertion/extraction.
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 2.'
+C
+C* Calculate word pointer and offset.
+C
+ IWORD = KNSPT / KBIT
+ IOFF = KNSPT - IWORD * KBIT
+ IWORD = IWORD + 1
+ IF (IPR.EQ.1) WRITE (*,9003) IWORD , IOFF
+C
+C Insert/extract bits.
+C
+ IF (KNUM.GE.8)
+ C THEN
+C
+C Cray vectorising routine GSBITE performs the same
+C functions as SBYTE(S) and GBYTE(S).
+C
+ CALL GSBITE (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM,
+ C KBIT,IMASK,HFUNC)
+ ELSE
+C
+C Cray scalar faster.
+C
+ IF (HFUNC.EQ.'C')
+ C THEN
+ CALL SBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ELSE
+ CALL GBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ENDIF
+ ENDIF
+C
+C Update pointer.
+C
+ KNSPT = KNSPT + KBLEN * KNUM
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 3 . Check out of range.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 3.'
+C
+ IND = KNSPT / KBIT
+ IF (IND.GT.KLENG)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) IND , KLENG
+ ENDIF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ INUM = KNUM
+ IF (INUM.GT.360)
+ C THEN
+ INUM = 360
+ WRITE (*,9007) INUM
+ ENDIF
+ DO 901 J901=1,INUM
+ IF (HFUNC.EQ.'C')
+ C THEN
+ WRITE (*,9006) KPARM(J901)
+ ELSE
+ WRITE (*,9008) KPARM(J901)
+ ENDIF
+ 901 CONTINUE
+ WRITE (*,*) 'INXBIT : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9002) KNSPT
+ ENDIF
+C
+C
+ 9001 FORMAT (1H ,'INXBIT : Word ',I8,' is outside array bounds ',I8)
+C
+ 9002 FORMAT (1H ,' KNSPT = ',I8)
+C
+ 9003 FORMAT (1H ,'INXBIT : Word is',I8,', bit offset is ',I2)
+C
+ 9004 FORMAT (1H ,' KBIT = ',I8)
+C
+ 9005 FORMAT (1H ,' HFUNC = ',A)
+C
+ 9006 FORMAT (1H ,' Inserted value = ',I20)
+C
+ 9007 FORMAT (1H ,' First ',I9,' values.')
+C
+ 9008 FORMAT (1H ,' Extracted value = ',I20)
+C
+ 9009 FORMAT (1H ,' KLENG = ',I20)
+C
+ RETURN
+C
+ END
+ SUBROUTINE ABORTX (HNAME)
+C
+C**** ABORTX - Terminates execution of program.
+C
+C Purpose.
+C --------
+C
+C Terminates execution of program.
+C
+C** Interface.
+C ----------
+C
+C CALL ABORTX (HNAME)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C HNAME - Name of calling routine.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C Prints message and terminates.
+C
+C Externals.
+C ----------
+C
+C ABORT
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C Cray version of routine.
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 13.11.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+ IMPLICIT NONE
+C
+ CHARACTER*(*) HNAME
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Print message and terminate.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WRITE (*,9001) HNAME
+C
+ CALL ABORT
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ 9001 FORMAT (1H ,'ABORTX : Routine ',A,' has requested program',
+ C ' termination.')
+C
+ RETURN
+C
+ END
+ SUBROUTINE SETPAR (KBIT,KNEG,KPR)
+C
+C**** SETPAR - Set number of bits in word. Set maximum negative integer.
+C
+C Purpose.
+C --------
+C
+C Set number of bits in word. Set maximum negative integer.
+C
+C** Interface.
+C ----------
+C
+C CALL SETPAR (KBIT,KNEG,KPR)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KPR - Debug print switch.
+C 1 , print out.
+C 0 , No print out.
+C
+C Output Parameters.
+C ------------------
+C
+C KBIT - Number of bits in computer word.
+C
+C KNEG - Maximum negative integer.
+C
+C Method.
+C -------
+C
+C Values are assigned.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C Cray version of routine.
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 28.10.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+ IMPLICIT NONE
+C
+ INTEGER KBIT
+ INTEGER KNEG
+ INTEGER KPR
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Assign values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) ' SETPAR : Section 1.'
+C
+ KBIT = 64
+ KNEG = -9223372036854775807
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (KPR.EQ.1)
+ C THEN
+ WRITE (*,*) ' SETPAR : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9001) KBIT
+ WRITE (*,9002) KNEG
+ ENDIF
+C
+ 9001 FORMAT (1H ,' KBIT = ',I3)
+C
+ 9002 FORMAT (1H ,' KNEG = ',I22)
+C
+ RETURN
+C
+ END
+ SUBROUTINE GSBITE (KS,KD,KSKST,KSIZE,KSKBTW,K,KBPW,KMASK,HADIR)
+C
+C**** GSBITE - Extraction/insertion of bits from/to bitstream on Cray.
+C
+C Purpose.
+C --------
+C
+C Vectorising extraction/insertion of bits from/to bitstream.
+C
+C** Interface.
+C ----------
+C
+C CALL GSBITE (KS,KD,KSKST,KSIZE,KSKBTW,K,KBPW,KMASK,HADIR)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KS - If HADIR='D', input bit stream, else output
+C bit stream.
+C KD - If HADIR='D', output words, else input words.
+C KSKST - Number of bits skipped at beginning of KS.
+C KSIZE - Number of bits to be extracted to one word
+C of KD.
+C KSKBTW - Number of bits skipped between two words to
+C be extracted.
+C K - Number of words to be extracted into KD. If
+C less than or equal to 0 only calculate KBPW
+C and KMASK.
+C KBPW - Number of bits per word in KS,calculated if 0.
+C KMASK - Masks for bit patterns, calculated if
+C KMASK(2) is 0.
+C HADIR - Direction of conversion: 'D' for decoding, ie
+C extract words KD(1...K) from bits
+C KS(KSKST+1....)
+C If not 'D', encode, i.e. pack words
+C KD(1....K) into bits
+C KS(KSKST+1.....KSKST+K*(KSIZE+KSKBTW))
+C
+C Output Parameters.
+C ------------------
+C
+C KS,KD - See above.
+C KSKST - Updated to number of bits used, i.e. to
+C KSKST+K*(KSIZE+KSKBTW)
+C KBPW - If 0 on input, number of bits in each word
+C of KS.
+C KMASK - If KMASK(2) was 0 on input, bit pattern masks.
+C
+C Method.
+C -------
+C
+C Vector loop is over repeatedly occurring bit patterns.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C This routine is for the Cray only.
+C Variable names do not conform to the standard.
+C
+C Author.
+C -------
+C
+C G.J.Cats 08 Dec 87
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 09.09.91
+C Introductory comments changed to conform to standard.
+C
+C ------------------------------------------------------------------
+C
+ DIMENSION KS(*),KD(*),KMASK(*)
+ CHARACTER*1 HADIR
+C
+C STATEMENT FUNCTIONS TO MANIPULATE BITS IN WORDS OF 64 BITS
+C
+C DATA ONES/7777777777777777B/
+C DATA OOOS/0B/
+C
+C 1. SINGLE BIT MANIPULATIONS
+C
+C 1.1 SET BIT KBIT IN WORD PW
+C
+ IBSET(KW,KBIT)=OR(KW,SHIFT(1B,KBIT))
+C
+C 2. WORD MANIPULATIONS, BIT BY BIT
+C
+C 2.1 ARE WORDS PW1 AND PW2 EQUAL?
+C
+C LOGICAL NLEQAL
+C NLEQAL(PW1,PW2)=(PW1.XOR.PW2).EQ.0B
+C
+C 2.2 BITWISE AND AND OR
+C
+ IAND(K1,K2)=AND(K1,K2)
+ IOR (K1,K2)= OR(K1,K2)
+C
+C 2.3 BITWISE NEGATION
+C
+ NOT(K)=COMPL(K)
+C
+C 2.4 SHIFT (LEFT FOR KSH POSITIVE, RIGHT FOR KSH NEGATIVE
+C
+ ISHFT(K,KSH)=CVMGP(SHIFTL(K,KSH),SHIFTR(K,-KSH),KSH)
+C
+C 3. SPECIAL PURPOSE
+C
+C 3.1 TAKE 4 LAST BITS OF KW, PUT THEM IN PW AT POS K*4-1
+C
+C SETLEV(PW,KW,K)=OR(AND(PW,SHIFT(0B.EQV.17B,K*4-4)),
+C +SHIFT(AND(17B,KW),K*4-4))
+C
+C 3.2 EXTRACT FIELD [K*4-1:4] FROM PW
+C
+C MGTLEV(PW,K)=AND(17B,SHIFT(PW,68-K*4))
+C
+C 1. COMPLETE KBPW AND KMASK, RETURN IF 0 WORDS ARE TO BE EXTRACTED
+C
+ IF(KBPW.EQ.0)THEN
+ IS=KS(1)
+ KS(1)=1
+ 1101 CONTINUE
+ IF(KS(1).NE.0)THEN
+ KBPW=KBPW+1
+ KS(1)=ISHFT(KS(1),1)
+ GOTO 1101
+ ENDIF
+ KS(1)=IS
+ ENDIF
+ IF(KMASK(2).EQ.0)THEN
+ KMASK(KBPW+1)=0
+ DO 1110 J=KBPW,1,-1
+ KMASK(J)=IBSET(KMASK(J+1),KBPW-J)
+ 1110 CONTINUE
+ ENDIF
+ IF(K.LE.0)RETURN
+C
+C 2. PRESET KD TO 0 IF KD IS OUTPUT I.E. WHEN DECODING
+C
+ IF(HADIR.EQ.'D')THEN
+ DO 2101 J=1,K
+ KD(J)=0
+ 2101 CONTINUE
+ ENDIF
+C
+C 3. CALCULATE SEVERAL PARAMETERS FOR LOOPING (FOR EFFICIENCY, THE
+C CODE OF SECTIONS 3.3 AND 3.4 FOR K=1 IS SEPARATED INTO 3.2)
+C
+C 3.1 NUMBER OF BITS USED PER WORD, INITIAL NR OF SKIPPED BITS
+C
+ ISTEP=KSIZE+KSKBTW
+ ISKWS=KSKST
+C
+C 3.2 VECTOR LOOP LENGTH AND STEP SIZE IN KD IF K=1;KS STEP IRRELVNT
+C
+ IF(K.EQ.1)THEN
+ ILL=1
+ IBDL=2
+ ISTD=1
+ ELSE
+C
+C 3.3 STEP SIZES IN KS,KD: INVERSE OF LARGEST FACTOR OF ISTEP,KBPW
+C
+ ILCF=KBPW
+ ISHF=ISTEP
+ 331 CONTINUE
+ IF(ILCF.EQ.ISHF)GOTO 332
+ IF(ILCF.EQ.1)GOTO 332
+ IF(ILCF.GT.ISHF)THEN
+ ILCF=ILCF-ISHF
+ ELSE
+ ISHF=ISHF-ILCF
+ ENDIF
+ GOTO 331
+ 332 CONTINUE
+ ISTD=KBPW/ILCF
+ ISTS=ISTEP/ILCF
+C
+C 3.4 VECTOR LOOP LENGTH AND SWITCH-OVER POINT FOR SMALLER LOOP
+C
+ ILL=(K-1)/ISTD+1
+ IBDL=K-(ILL-1)*ISTD
+ ENDIF
+C
+C 4. LOOP OVER FIRST ISTD WORDS OF KD (TRAILS THE VECTOR LOOP)
+C
+ DO 790 JBD=1,ISTD
+C
+C 4.1 LAST BIT IN KS TO BE TREATED
+C
+ IENBS=ISKWS+KSIZE
+C
+C 4.2 NR OF WORDS OF KS TO BE SKIPPED, NR OF BITS IN THOSE AND THIS
+C
+ ISKW=ISKWS/KBPW
+ ISTA=ISKW*KBPW
+ ISKB=ISKWS-ISTA
+C
+C 4.3 MASK AND LEFT SHIFT FOR THE REMAINING BITS
+C
+ IMASK=KMASK(ISKB+1)
+ ISH=KSIZE+ISKB
+C
+C 4.4 POSITION OF CURRENT WORD OF KS
+C
+ IBS=ISKW+1
+C
+C 5. LOOP OVER WORDS OF KS CONTRIBUTING TO ONE WORD OF KD
+C
+ 500 CONTINUE
+C
+C 5.1 UPDATE SHIFT AND LAST BIT IN CURRENT WORD
+C
+ ISH=ISH-KBPW
+ IEND=ISTA+KBPW
+C
+C 5.2 IS LAST BIT OF CURRENT WORD OUTSIDE RANGE TO BE EXTRACTED
+C
+ IF(IEND.GT.IENBS)THEN
+ ISH=IENBS-IEND
+ IMASK=IAND(IMASK,NOT(KMASK(KBPW+ISH+1)))
+ ENDIF
+C
+C 5.3 INITIAL OFFSETS FOR VECTOR ELEMENTS IN VECTOR LOOP
+C
+ IOS=0
+ IOD=0
+C
+C 6. VECTOR LOOP IS OVER REPEATEDLY OCCURRING BITPATTERNS/MASKS
+C
+ IF(HADIR.EQ.'D')THEN
+CDIR$ IVDEP
+ DO 611 JI=1,ILL
+ KD(JBD+IOD)=IOR(KD(JBD+IOD),ISHFT(IAND(IMASK,KS(IBS+IOS)),ISH))
+ IOD=IOD+ISTD
+ IOS=IOS+ISTS
+ 611 CONTINUE
+ ELSE
+CDIR$ IVDEP
+ DO 612 JI=1,ILL
+ KS(IBS+IOS)=IOR(
+ + IAND( KS(IBS+IOS), NOT(IMASK)),
+ + IAND(ISHFT(KD(JBD+IOD),-ISH), IMASK ))
+ IOD=IOD+ISTD
+ IOS=IOS+ISTS
+ 612 CONTINUE
+ ENDIF
+C
+C 7. END LOOPS
+C
+C 7.1 PREPARE FOR END OF LOOP OVER WORDS OF KS WITIHN ONE KD WORD
+C
+ ISTA=ISTA+KBPW
+C
+C 7.2 NEXT WORD OF KD IF EXTRACTION NOT COMPLETED
+C
+ IF(ISTA.LT.IENBS)THEN
+ IMASK=KMASK(1)
+ IBS=IBS+1
+ GOTO 500
+ ENDIF
+C
+C 7.8 PREPARE FOR END OF LOOP OVER FIRST WORDS OF KD
+C
+ IF(JBD.EQ.IBDL)ILL=ILL-1
+ ISKWS=ISKWS+ISTEP
+C
+C 7.9 END LOOP OVER FIRST WORDS OF KD
+C
+ 790 CONTINUE
+C
+C 8. FINISHED: UPDATE KSKST AND RETURN
+C
+ KSKST=KSKST+K*ISTEP
+C
+ RETURN
+ END
+ SUBROUTINE GBYTE (SOURCE,DEST,IOFSET,IBYTSZ)
+C
+C**** GBYTE - Extract a single bit field. Cray routine.
+C
+C* FUNCTION: GET A SINGLE BIT FIELD FROM SOURCE INTO DEST
+C*
+C* INPUT : SOURCE(1)= WORD CONTAINING START OF BIT FIELD
+C* DEST = TARGET WORD
+C* IOFSET = OFFSET IN BITS FOR START OF THE FIELD
+C* IBYTSZ = LENGTH OF FIELD IN BITS
+C*
+C* OUTPUT : SOURCE,IOFSET,IBYTSZ UNCHANGED
+C* DEST CONTAINS FIELD RIGHT JUSTIFIED
+C*
+C* AUTHOR : M.MIQUEU 08/1981 (REWRITTEN FROM J.MARTELLET'S)
+C*
+ PARAMETER(NBPW=64)
+ INTEGER SOURCE(1),DEST
+ INTEGER SH1
+ SH1=IOFSET+IBYTSZ-NBPW
+
+ IF(SH1.GT.0) GO TO 2
+
+
+C BYTES DO NOT SPAN WORDS
+
+
+ SH1=NBPW+SH1
+
+
+ DEST=AND(
+ 1 SHIFT(SOURCE(1),SH1),
+ 2 SHIFT(MASK(IBYTSZ),IBYTSZ)
+ 3 )
+
+ RETURN
+
+C BYTE SPANS WORDS
+
+2 CONTINUE
+
+
+ DEST=OR(
+ 1 SHIFT(
+ 2 AND(SOURCE(1),COMPL(MASK(IOFSET)))
+ 3 ,SH1),
+ 4 SHIFT(
+ 5 AND(SOURCE(2),MASK(SH1))
+ 6 ,SH1)
+ 7 )
+
+
+
+ RETURN
+ END
+ SUBROUTINE GBYTES (S,D,ISKIP1,IBSIZ,ISKIP2,NBYTES,KWOFF)
+C
+C**** GBYTES - Extract a number of bit fields. Cray routine.
+C
+C S CONTAINS A BIT STRING OF INDEFINITE LENGTH. GBYTES WILL
+C EXTRACT NBYTES BITSTRINGS, IBSIZ BITS LONG, AND STORE THEM
+C RIGHT JUSTIFIED 0 FILL, INTO SUCCESSIVE WORDS OF D. THE
+C SUCCESSIVE BITSTRINGS START AT BIT POSITIONS
+C ISKIP1+1+(IBYTE-1)*(IBSIZ+ISKIP2)
+C IN THE BIT STRING S. I.E. SKIP ISKIP1 BITS AT THE START,
+C AND ISKIP2 BITS BETWEEN THE EXTRACTED STRINGS.
+C BIT ISKP+1 IN A STRING IS FOUND IN WORD IS=1+ISKIP/NBPW IN S,
+C WHERE NBPW IS THE NUMBER OF BITS PER WORD. THE STARTING BIT
+C IS FOUND BY SKIPPING MOD(ISKP,NBPW) BITS IN THAT WORD.
+C KWOFF IS AN OPTIONAL 7TH PARAMETER, WHICH DEFAULTS TO 0
+C IF PRESENT KWOFF BITS ARE TOTALLY IGNORED AT THE START OF A WORD
+C THUS IF A PACKED CYBER BIT STRING IS TRANSFERRED TO THE
+C CRAY, WITH EACH 60 BIT CYBER WORD PLACED AT THE RIGHT END OF
+C A 64 BIT CRAY WORD, A BYTE SEQUENCE WHICH WAS ORIGINALLY
+C LOCATED WITH START POINTS IN ARITHMETIC PROGRESSION ON THE
+C CYBER, WILL NO LONGER HAVE THIS PROPERTY ON THE CRAY. BY
+C USING THE ROUTINE WITH KWOFF=4, THE ELEMENTS OF THE BYTE
+C SEQUENCE CAN BE EXTRACTED ON THE CRAY, USING THE SAME SKIPS
+C AS WERE USED ON THE CYBER.
+C
+ PARAMETER(NBPW=64)
+ DIMENSION S(2) , D(NBYTES)
+ INTEGER SH1
+ IGNORE = 0
+ IF(NUMARG().GT.6) IGNORE = KWOFF
+ IS=1+ISKIP1/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP1,NBPW-IGNORE) + IGNORE
+ ISTEP = ISKIP2+IBSIZ
+ DO 75 IBYTE = 1 , NBYTES
+C WITH THE STARTING WORD AND BIT POSITION DETERMINED, THE
+C DESIRED EXTRACTION CAN BE DONE BY
+C*** CALL GBYTE(S(IS),D(IBYTE),ISKIP,IBSIZ)
+C BUT SINCE THE CODE IS SHORT IT IS INSERTED IN-LINE.
+ SH1 = ISKIP+IBSIZ
+ IF(SH1.GT.NBPW) GO TO 50
+C BYTE COMES FROM 1 WORD OF S
+ D(IBYTE) = AND( SHIFT(S(IS),SH1),SHIFT(MASK(IBSIZ),IBSIZ))
+ GO TO 65
+ 50 CONTINUE
+ SH1 =SH1-NBPW
+C BYTE COMES FROM 2 WORDS OF S.
+ D(IBYTE) = OR(SHIFT(AND(S(IS),COMPL(MASK(ISKIP))),SH1)
+ 1 ,
+ 2 SHIFT(AND(SHIFT(S(IS+1),IGNORE),MASK(SH1)),SH1)
+ 3 )
+ 65 CONTINUE
+C UPDATE STARTING WORD AND BIT POSITION
+ ISKIP = ISKIP+ISTEP
+ IF(ISKIP.LT.NBPW) GO TO 75
+ ISKIP =ISKIP-NBPW
+ IS = IS+1+ISKIP/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP,NBPW-IGNORE) + IGNORE
+ 75 CONTINUE
+ RETURN
+ END
+ SUBROUTINE SBYTE (DEST,SOURCE,IOFSET,IBYTSZ)
+C
+C**** SBYTE - Insert a single bit field. Cray routine.
+C
+C* FUNCTION: STORE A SINGLE BIT FIELD FROM SOURCE INTO DEST
+C*
+C* INPUT : SOURCE = WORD CONTAINING BIT FIELD RIGHT JUSTIFIED
+C* DEST(1) = 1ST TARGET WORD
+C* IOFSET = OFFSET IN BITS FOR START OF THE FIELD
+C* IBYTSZ = LENGTH OF FIELD IN BITS ; .LE.WORD SIZE .....
+C*
+C* OUTPUT : SOURCE,IOFSET,IBYTSZ UNCHANGED
+C* DEST(1) AND EVENTUALLY DEST(2) CONTAIN FIELD
+C*
+C* AUTHOR : M.MIQUEU 08/1981 (REWRITTEN FROM J.MARTELLET'S)
+C*
+ PARAMETER(NBPW=64)
+ INTEGER SOURCE,DEST(1)
+ INTEGER SH1,SH2,SH3
+ SH1=IOFSET+IBYTSZ
+ IF(SH1.GT.NBPW) GO TO 2
+
+ SH2=NBPW-SH1
+ IF(SH2.LT.0) SH2=NBPW-SH2
+
+C BYTE DOES NOT SPAN WORDS
+
+
+ DEST(1)=SHIFT(
+ 1 OR(
+ 2 AND(SHIFT(DEST(1),SH1),
+ 3 SHIFT(COMPL(MASK(IBYTSZ)),IBYTSZ) )
+ 4 ,
+ 5 AND(SOURCE,
+ 6 COMPL(SHIFT(COMPL(MASK(IBYTSZ)),IBYTSZ)) )
+ 7 )
+ 8 ,SH2)
+
+
+
+ RETURN
+
+2 CONTINUE
+
+C BYTE SPANS 2 WORDS
+
+ SH3=2*NBPW-SH1
+
+
+ DEST(1)=OR(
+ 1 AND(DEST(1),MASK(IOFSET))
+ 2 ,
+ 3 AND(SHIFT(SOURCE,SH3) , COMPL(MASK(IOFSET)) )
+ 4 )
+
+ DEST(2)=OR(
+ 1 AND(DEST(2) , COMPL(MASK(SH1-NBPW)) )
+ 2 ,
+ 3 SHIFT( AND(SOURCE , COMPL(MASK(SH3)) ) ,SH3)
+ 4 )
+
+
+
+ RETURN
+ END
+ SUBROUTINE SBYTES (D,S,ISKIP1,IBSIZ,ISKIP2,NBYTES,KWOFF)
+C
+C**** SBYTES - Insert a number of bit fields. Cray routine.
+C
+C REVERSES THE ACTION OF GBYTES, TAKING FIELDS FROM S AND
+C INSERTING THEM INTO A BIT STRING IN D. SEE GBYTES.
+C AUTHOR D. ROBERTSON AUG,1981
+C
+ PARAMETER(NBPW=64)
+ DIMENSION D(2) , S(NBYTES)
+ INTEGER SH1,SH2,SH3
+ IGNORE = 0
+ IF(NUMARG().GT.6) IGNORE = KWOFF
+ ID=1+ISKIP1/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP1,NBPW-IGNORE) + IGNORE
+ ISTEP = ISKIP2+IBSIZ
+ DO 75 IBYTE = 1 , NBYTES
+C WITH THE STARTING WORD AND BIT POSITION KNOWN, THE
+C DESIRED INSERTION CAN BE DONE BY
+C** CALL SBYTE(D(ID),S(IBYTE),ISKIP,IBSIZ)
+C BUT THE CODE IS SHORT ENOUGH TO GO IN-LINE.
+ SH1 = ISKIP+IBSIZ
+ IF(SH1.GT.NBPW) GO TO 50
+ SH2 = NBPW-SH1
+ IF(SH2.LT.0) SH2 = NBPW-SH2
+C BYTE GOES INTO 1 WORD OF D.
+ D(ID) = SHIFT(OR(AND(SHIFT(D(ID),SH1),MASK(NBPW-IBSIZ)),
+ 1 AND(S(IBYTE),SHIFT(MASK(IBSIZ),IBSIZ))),SH2)
+ GO TO 65
+ 50 CONTINUE
+C BYTE GOES INTO 2 WORDS OF D.
+ SH3 = 2*NBPW-SH1
+ D(ID)=OR(AND(D(ID),MASK(ISKIP)),
+ 1 AND(SHIFT(S(IBYTE),SH3),COMPL(MASK(ISKIP))))
+ D(ID+1)=OR(AND(D(ID+1),SHIFT(COMPL(MASK(SH1-NBPW)),NBPW-IGNORE)
+ 1 ),
+ 2 SHIFT(AND(S(IBYTE),COMPL(MASK(SH3))),SH3-IGNORE))
+ 65 CONTINUE
+C UPDATE STARTING WORD AND BIT POSITION
+ ISKIP = ISKIP+ISTEP
+ IF(ISKIP.LT.NBPW) GO TO 75
+ ISKIP = ISKIP - NBPW
+ ID = ID+1+ISKIP/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP,NBPW-IGNORE) + IGNORE
+ 75 CONTINUE
+ RETURN
+ END
diff --git a/gribex/btcyber.special b/gribex/btcyber.special
new file mode 100755
index 0000000..b8238c4
--- /dev/null
+++ b/gribex/btcyber.special
@@ -0,0 +1,825 @@
+ SUBROUTINE INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+ C KBLEN,HFUNC,KRET)
+C
+C**** INXBIT - Insert/extract bits consecutively in/from a given array
+C
+C Purpose.
+C --------
+C
+C Take rightmost KBLEN bits from KNUM words of KPARM
+C and insert them consecutively in KGRIB, starting at
+C bit after KNSPT or vice versa.
+C
+C** Interface.
+C ----------
+C
+C CALL INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+C C KBLEN,KRET)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KGRIB - Array containing bitstream.
+C KLENG - Length (words) of this array.
+C KNSPT - Bit number after which insertion or
+C extraction starts.
+C KPARM - Array from which bits are taken for
+C insertion in the bitstream or to which
+C bits are extracted from the bitstream.
+C KBIT - Number of bits in computer word.
+C KNUM - Number of bit fields inserted/extracted.
+C KBLEN - Number of bits per bit field.
+C HFUNC - Requested function.
+C 'C' to insert bits in bitstream,
+C 'D' to extract bits from bitstream.
+C
+C Output Parameters.
+C ------------------
+C
+C KNSPT - Bit number of last bit inserted/extracted.
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Insertion/extraction exceeded
+C array boundary.
+C
+C Method.
+C -------
+C
+C Word and offset pointer calculated before calling
+C insertion/extraction routines.
+C
+C Externals.
+C ----------
+C
+C SBYTES6
+C GBYTES6
+C
+C Reference.
+C ----------
+C
+C ECLIB documentation on SBYTES and GBYTES.
+C
+C Comments.
+C ---------
+C
+C Cyber version of routine.
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 08.11.91
+C Parameter KMACH removed from list of input parameters.
+C
+C J. Hennessy ECMWF 12.10.92
+C Dimension of IMASK changed from 64 to 65.
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+ INTEGER IND
+ INTEGER INUM
+ INTEGER IOFF
+ INTEGER IPR
+ INTEGER IWORD
+C
+ INTEGER KBIT
+ INTEGER KBLEN
+ INTEGER KGRIB
+ INTEGER KLENG
+ INTEGER KNSPT
+ INTEGER KNUM
+ INTEGER KPARM
+ INTEGER KRET
+C
+ INTEGER J901
+C
+ DIMENSION KGRIB(KLENG)
+ DIMENSION KPARM(*)
+C
+ CHARACTER*1 HFUNC
+C
+C
+C Debug print switch.
+C
+ DATA IPR /0/
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Set initial values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ WRITE (*,*) 'INXBIT : Section 1.'
+ WRITE (*,*) ' Input values used -'
+ WRITE (*,9009) KLENG
+ WRITE (*,9002) KNSPT
+ WRITE (*,9004) KBIT
+ WRITE (*,9005) HFUNC
+ ENDIF
+C
+ KRET = 0
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Bit insertion/extraction.
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 2.'
+C
+C* Calculate word pointer and offset.
+C
+ IWORD = KNSPT / KBIT
+ IOFF = KNSPT - IWORD * KBIT
+ IWORD = IWORD + 1
+ IF (IPR.EQ.1) WRITE (*,9003) IWORD , IOFF
+C
+C Insert/extract bits.
+C
+ IF (HFUNC.EQ.'C')
+ C THEN
+ CALL SBYTES6 (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ELSE
+ CALL GBYTES6 (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ENDIF
+C
+C Update pointer.
+C
+ KNSPT = KNSPT + KBLEN * KNUM
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 3 . Check out of range.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 3.'
+C
+ IND = KNSPT / KBIT
+ IF (IND.GT.KLENG)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) IND , KLENG
+ ENDIF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ INUM = KNUM
+ IF (INUM.GT.360)
+ C THEN
+ INUM = 360
+ WRITE (*,9007) INUM
+ ENDIF
+ DO 901 J901=1,INUM
+ IF (HFUNC.EQ.'C')
+ C THEN
+ WRITE (*,9006) KPARM(J901)
+ ELSE
+ WRITE (*,9008) KPARM(J901)
+ ENDIF
+ 901 CONTINUE
+ WRITE (*,*) 'INXBIT : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9002) KNSPT
+ ENDIF
+C
+C
+ 9001 FORMAT (1H ,'INXBIT : Word ',I8,' is outside array bounds ',I8)
+C
+ 9002 FORMAT (1H ,' KNSPT = ',I8)
+C
+ 9003 FORMAT (1H ,'INXBIT : Word is',I8,', bit offset is ',I2)
+C
+ 9004 FORMAT (1H ,' KBIT = ',I8)
+C
+ 9005 FORMAT (1H ,' HFUNC = ',A)
+C
+ 9006 FORMAT (1H ,' Inserted value = ',I20)
+C
+ 9007 FORMAT (1H ,' First ',I9,' values.')
+C
+ 9008 FORMAT (1H ,' Extracted value = ',I20)
+C
+ 9009 FORMAT (1H ,' KLENG = ',I20)
+C
+ RETURN
+C
+ END
+ SUBROUTINE ABORTX (HNAME)
+C
+C**** ABORTX - Terminates execution of program.
+C
+C Purpose.
+C --------
+C
+C Terminates execution of program.
+C
+C** Interface.
+C ----------
+C
+C CALL ABORTX (HNAME)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C HNAME - Name of calling routine.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C Prints message and terminates.
+C
+C Externals.
+C ----------
+C
+C ABORT
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C Cyber version of routine.
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 13.11.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+C
+ CHARACTER*(*) HNAME
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Print message and terminate.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WRITE (*,9001) HNAME
+C
+ CALL ABORT ('US',0,' ')
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ 9001 FORMAT (1H ,'ABORTX : Routine ',A,' has requested program',
+ C ' termination.')
+C
+ RETURN
+C
+ END
+ SUBROUTINE SETPAR (KBIT,KNEG,KPR)
+C
+C**** SETPAR - Set number of bits in word. Set maximum negative integer.
+C
+C Purpose.
+C --------
+C
+C Set number of bits in word. Set maximum negative integer.
+C
+C** Interface.
+C ----------
+C
+C CALL SETPAR (KBIT,KNEG,KPR)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KPR - Debug print switch.
+C 1 , print out.
+C 0 , No print out.
+C
+C Output Parameters.
+C ------------------
+C
+C KBIT - Number of bits in computer word.
+C
+C KNEG - Maximum negative integer.
+C
+C Method.
+C -------
+C
+C Values are assigned.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C Cyber version of routine.
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 28.10.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+C
+ INTEGER KBIT
+ INTEGER KNEG
+ INTEGER KPR
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Assign values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) ' SETPAR : Section 1.'
+C
+ KBIT = 64
+ KNEG = -9223372036854775807
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (KPR.EQ.1)
+ C THEN
+ WRITE (*,*) ' SETPAR : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9001) KBIT
+ WRITE (*,9002) KNEG
+ ENDIF
+C
+ 9001 FORMAT (1H ,' KBIT = ',I3)
+C
+ 9002 FORMAT (1H ,' KNEG = ',I22)
+C
+ RETURN
+C
+ END
+ SUBROUTINE GBYTE(SOURCE,DEST,IOFSET,IBYTSZ)
+C
+C**** GBYTE - Get a single bit field from SOURCE into DEST on Cyber.
+C
+C* INPUT : SOURCE(1)= WORD CONTAINING START OF BIT FIELD
+C* DEST = TARGET WORD
+C* IOFSET = OFFSET IN BITS FOR START OF THE FIELD
+C* IBYTSZ = LENGTH OF FIELD IN BITS
+C*
+C* OUTPUT : SOURCE,IOFSET,IBYTSZ UNCHANGED
+C* DEST CONTAINS FIELD RIGHT JUSTIFIED
+C*
+C* AUTHOR : M.MIQUEU 08/1981 (REWRITTEN FROM J.MARTELLET'S)
+C*
+C*****
+ INTEGER SOURCE(1),DEST
+ INTEGER SH1
+
+
+ NBPW=64
+ SH1=IOFSET+IBYTSZ-NBPW
+
+ IF(SH1.GT.0) GO TO 2
+
+
+C BYTES DO NOT SPAN WORDS
+
+
+ SH1=NBPW+SH1
+
+
+ DEST=AND(
+ 1 SHIFT(SOURCE(1),SH1),
+ 2 SHIFT(MASK(IBYTSZ),IBYTSZ)
+ 3 )
+
+ RETURN
+
+C BYTE SPANS WORDS
+
+2 CONTINUE
+
+
+ DEST=OR(
+ 1 SHIFT(
+ 2 AND(SOURCE(1),COMPL(MASK(IOFSET)))
+ 3 ,SH1),
+ 4 SHIFT(
+ 5 AND(SOURCE(2),MASK(SH1))
+ 6 ,SH1)
+ 7 )
+
+
+
+ RETURN
+ END
+ SUBROUTINE GBYTES(S,D,ISKIP1,IBSIZ,ISKIP2,NBYTES,KWOFF)
+C
+C**** GBYTES - Cyber version.
+C
+C S CONTAINS A BIT STRING OF INDEFINITE LENGTH. GBYTES WILL
+C EXTRACT NBYTES BITSTRINGS, IBSIZ BITS LONG, AND STORE THEM
+C RIGHT JUSTIFIED 0 FILL, INTO SUCCESSIVE WORDS OF D. THE
+C SUCCESSIVE BITSTRINGS START AT BIT POSITIONS
+C ISKIP1+1+(IBYTE-1)*(IBSIZ+ISKIP2)
+C IN THE BIT STRING S. I.E. SKIP ISKIP1 BITS AT THE START,
+C AND ISKIP2 BITS BETWEEN THE EXTRACTED STRINGS.
+C BIT ISKP+1 IN A STRING IS FOUND IN WORD IS=1+ISKIP/NBPW IN S,
+C WHERE NBPW IS THE NUMBER OF BITS PER WORD. THE STARTING BIT
+C IS FOUND BY SKIPPING MOD(ISKP,NBPW) BITS IN THAT WORD.
+C KWOFF IS AN OPTIONAL 7TH PARAMETER, WHICH DEFAULTS TO 0
+C IF PRESENT KWOFF BITS ARE TOTALLY IGNORED AT THE START OF A WORD
+C THUS IF A PACKED CYBER BIT STRING IS TRANSFERRED TO THE
+C CRAY, WITH EACH 60 BIT CYBER WORD PLACED AT THE RIGHT END OF
+C A 64 BIT CRAY WORD, A BYTE SEQUENCE WHICH WAS ORIGINALLY
+C LOCATED WITH START POINTS IN ARITHMETIC PROGRESSION ON THE
+C CYBER, WILL NO LONGER HAVE THIS PROPERTY ON THE CRAY. BY
+C USING THE ROUTINE WITH KWOFF=4, THE ELEMENTS OF THE BYTE
+C SEQUENCE CAN BE EXTRACTED ON THE CRAY, USING THE SAME SKIPS
+C AS WERE USED ON THE CYBER.
+ DIMENSION S(2) , D(NBYTES)
+ INTEGER SH1
+ ENTRY GBYTES7 (S,D,ISKIP1,IBSIZ,ISKIP2,NBYTES,KWOFF)
+ IGNORE = KWOFF
+ GO TO 10
+ ENTRY GBYTES6 (S,D,ISKIP1,IBSIZ,ISKIP2,NBYTES)
+ IGNORE = 0
+ 10 CONTINUE
+ NBPW=64
+ IS=1+ISKIP1/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP1,NBPW-IGNORE) + IGNORE
+ ISTEP = ISKIP2+IBSIZ
+ DO 75 IBYTE = 1 , NBYTES
+C WITH THE STARTING WORD AND BIT POSITION DETERMINED, THE
+C DESIRED EXTRACTION CAN BE DONE BY
+C*** CALL GBYTE(S(IS),D(IBYTE),ISKIP,IBSIZ)
+C BUT SINCE THE CODE IS SHORT IT IS INSERTED IN-LINE.
+ SH1 = ISKIP+IBSIZ
+ IF(SH1.GT.NBPW) GO TO 50
+C BYTE COMES FROM 1 WORD OF S
+ D(IBYTE) = AND( SHIFT(S(IS),SH1),SHIFT(MASK(IBSIZ),IBSIZ))
+ GO TO 65
+ 50 CONTINUE
+ SH1 =SH1-NBPW
+C BYTE COMES FROM 2 WORDS OF S.
+ D(IBYTE) = OR(SHIFT(AND(S(IS),COMPL(MASK(ISKIP))),SH1)
+ 1 ,
+ 2 SHIFT(AND(SHIFT(S(IS+1),IGNORE),MASK(SH1)),SH1)
+ 3 )
+ 65 CONTINUE
+C UPDATE STARTING WORD AND BIT POSITION
+ ISKIP = ISKIP+ISTEP
+ IF(ISKIP.LT.NBPW) GO TO 75
+ ISKIP =ISKIP-NBPW
+ IS = IS+1+ISKIP/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP,NBPW-IGNORE) + IGNORE
+ 75 CONTINUE
+ RETURN
+ END
+ SUBROUTINE SBYTE(DEST,SOURCE,IOFSET,IBYTSZ)
+C
+C**** GBYTE - Store a single bit field from SOURCE into DEST on Cyber.
+C
+C* INPUT : SOURCE = WORD CONTAINING BIT FIELD RIGHT JUSTIFIED
+C* DEST(1) = 1ST TARGET WORD
+C* IOFSET = OFFSET IN BITS FOR START OF THE FIELD
+C* IBYTSZ = LENGTH OF FIELD IN BITS ; .LE.WORD SIZE .....
+C*
+C* OUTPUT : SOURCE,IOFSET,IBYTSZ UNCHANGED
+C* DEST(1) AND EVENTUALLY DEST(2) CONTAIN FIELD
+C*
+C* AUTHOR : M.MIQUEU 08/1981 (REWRITTEN FROM J.MARTELLET'S)
+C*
+C*****
+ INTEGER SOURCE,DEST(1)
+ INTEGER SH1,SH2,SH3
+
+
+ NBPW=64
+ SH1=IOFSET+IBYTSZ
+ IF(SH1.GT.NBPW) GO TO 2
+
+ SH2=NBPW-SH1
+ IF(SH2.LT.0) SH2=NBPW-SH2
+
+C BYTE DOES NOT SPAN WORDS
+
+
+ DEST(1)=SHIFT(
+ 1 OR(
+ 2 AND(SHIFT(DEST(1),SH1),
+ 3 SHIFT(COMPL(MASK(IBYTSZ)),IBYTSZ) )
+ 4 ,
+ 5 AND(SOURCE,
+ 6 COMPL(SHIFT(COMPL(MASK(IBYTSZ)),IBYTSZ)) )
+ 7 )
+ 8 ,SH2)
+
+
+
+ RETURN
+
+2 CONTINUE
+
+C BYTE SPANS 2 WORDS
+
+ SH3=2*NBPW-SH1
+
+
+ DEST(1)=OR(
+ 1 AND(DEST(1),MASK(IOFSET))
+ 2 ,
+ 3 AND(SHIFT(SOURCE,SH3) , COMPL(MASK(IOFSET)) )
+ 4 )
+
+ DEST(2)=OR(
+ 1 AND(DEST(2) , COMPL(MASK(SH1-NBPW)) )
+ 2 ,
+ 3 SHIFT( AND(SOURCE , COMPL(MASK(SH3)) ) ,SH3)
+ 4 )
+
+
+
+ RETURN
+ END
+ SUBROUTINE SBYTES(D,S,ISKIP1,IBSIZ,ISKIP2,NBYTES,KWOFF)
+C
+C**** SBYTES - Cyber version.
+C
+C REVERSES THE ACTION OF GBYTES, TAKING FIELDS FROM S AND
+C INSERTING THEM INTO A BIT STRING IN D. SEE GBYTES.
+C AUTHOR D. ROBERTSON AUG,1981
+ DIMENSION D(2) , S(NBYTES)
+ INTEGER SH1,SH2,SH3
+ ENTRY SBYTES7 (D,S,ISKIP1,IBSIZ,ISKIP2,NBYTES,KWOFF)
+ IGNORE = KWOFF
+ GO TO 10
+ ENTRY SBYTES6 (D,S,ISKIP1,IBSIZ,ISKIP2,NBYTES)
+ IGNORE = 0
+ 10 CONTINUE
+ NBPW=64
+ ID=1+ISKIP1/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP1,NBPW-IGNORE) + IGNORE
+ ISTEP = ISKIP2+IBSIZ
+ DO 75 IBYTE = 1 , NBYTES
+C WITH THE STARTING WORD AND BIT POSITION KNOWN, THE
+C DESIRED INSERTION CAN BE DONE BY
+C** CALL SBYTE(D(ID),S(IBYTE),ISKIP,IBSIZ)
+C BUT THE CODE IS SHORT ENOUGH TO GO IN-LINE.
+ SH1 = ISKIP+IBSIZ
+ IF(SH1.GT.NBPW) GO TO 50
+ SH2 = NBPW-SH1
+ IF(SH2.LT.0) SH2 = NBPW-SH2
+C BYTE GOES INTO 1 WORD OF D.
+ D(ID) = SHIFT(OR(AND(SHIFT(D(ID),SH1),MASK(NBPW-IBSIZ)),
+ 1 AND(S(IBYTE),SHIFT(MASK(IBSIZ),IBSIZ))),SH2)
+ GO TO 65
+ 50 CONTINUE
+C BYTE GOES INTO 2 WORDS OF D.
+ SH3 = 2*NBPW-SH1
+ D(ID)=OR(AND(D(ID),MASK(ISKIP)),
+ 1 AND(SHIFT(S(IBYTE),SH3),COMPL(MASK(ISKIP))))
+ D(ID+1)=OR(AND(D(ID+1),SHIFT(COMPL(MASK(SH1-NBPW)),NBPW-IGNORE)
+ 1 ),
+ 2 SHIFT(AND(S(IBYTE),COMPL(MASK(SH3))),SH3-IGNORE))
+ 65 CONTINUE
+C UPDATE STARTING WORD AND BIT POSITION
+ ISKIP = ISKIP+ISTEP
+ IF(ISKIP.LT.NBPW) GO TO 75
+ ISKIP = ISKIP - NBPW
+ ID = ID+1+ISKIP/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP,NBPW-IGNORE) + IGNORE
+ 75 CONTINUE
+ RETURN
+ END
diff --git a/gribex/btibm.special b/gribex/btibm.special
new file mode 100755
index 0000000..209c15c
--- /dev/null
+++ b/gribex/btibm.special
@@ -0,0 +1,869 @@
+ SUBROUTINE INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+ C KBLEN,HFUNC,KRET)
+C
+C**** INXBIT - Insert/extract bits consecutively in/from a given array
+C
+C Purpose.
+C --------
+C
+C Take rightmost KBLEN bits from KNUM words of KPARM
+C and insert them consecutively in KGRIB, starting at
+C bit after KNSPT or vice versa.
+C
+C** Interface.
+C ----------
+C
+C CALL INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+C C KBLEN,KRET)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KGRIB - Array containing bitstream.
+C KLENG - Length (words) of this array.
+C KNSPT - Bit number after which insertion or
+C extraction starts.
+C KPARM - Array from which bits are taken for
+C insertion in the bitstream or to which
+C bits are extracted from the bitstream.
+C KBIT - Number of bits in computer word.
+C KNUM - Number of bit fields inserted/extracted.
+C KBLEN - Number of bits per bit field.
+C HFUNC - Requested function.
+C 'C' to insert bits in bitstream,
+C 'D' to extract bits from bitstream.
+C
+C Output Parameters.
+C ------------------
+C
+C KNSPT - Bit number of last bit inserted/extracted.
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Insertion/extraction exceeded
+C array boundary.
+C
+C Method.
+C -------
+C
+C Word and offset pointer calculated before calling
+C insertion/extraction routines.
+C
+C Externals.
+C ----------
+C
+C SBYTES
+C GBYTES
+C
+C Reference.
+C ----------
+C
+C ECLIB documentation on SBYTES and GBYTES.
+C
+C Comments.
+C ---------
+C
+C IBM version of routine.
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 08.11.91
+C Parameter KMACH removed from list of input parameters.
+C
+C J. Hennessy ECMWF 12.10.92
+C Dimension of IMASK changed from 64 to 65.
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+ INTEGER IND
+ INTEGER INUM
+ INTEGER IOFF
+ INTEGER IPR
+ INTEGER IWORD
+C
+ INTEGER KBIT
+ INTEGER KBLEN
+ INTEGER KGRIB
+ INTEGER KLENG
+ INTEGER KNSPT
+ INTEGER KNUM
+ INTEGER KPARM
+ INTEGER KRET
+C
+ INTEGER J901
+C
+ DIMENSION KGRIB(KLENG)
+ DIMENSION KPARM(*)
+C
+ CHARACTER*1 HFUNC
+C
+C
+C Debug print switch.
+C
+ DATA IPR /0/
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Set initial values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ WRITE (*,*) 'INXBIT : Section 1.'
+ WRITE (*,*) ' Input values used -'
+ WRITE (*,9009) KLENG
+ WRITE (*,9002) KNSPT
+ WRITE (*,9004) KBIT
+ WRITE (*,9005) HFUNC
+ ENDIF
+C
+ KRET = 0
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Bit insertion/extraction.
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 2.'
+C
+C* Calculate word pointer and offset.
+C
+ IWORD = KNSPT / KBIT
+ IOFF = KNSPT - IWORD * KBIT
+ IWORD = IWORD + 1
+ IF (IPR.EQ.1) WRITE (*,9003) IWORD , IOFF
+C
+C Insert/extract bits.
+C
+ IF (HFUNC.EQ.'C')
+ C THEN
+ CALL SBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ELSE
+ CALL GBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ENDIF
+C
+C Update pointer.
+C
+ KNSPT = KNSPT + KBLEN * KNUM
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 3 . Check out of range.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 3.'
+C
+ IND = KNSPT / KBIT
+ IF (IND.GT.KLENG)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) IND , KLENG
+ ENDIF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ INUM = KNUM
+ IF (INUM.GT.360)
+ C THEN
+ INUM = 360
+ WRITE (*,9007) INUM
+ ENDIF
+ DO 901 J901=1,INUM
+ IF (HFUNC.EQ.'C')
+ C THEN
+ WRITE (*,9006) KPARM(J901)
+ ELSE
+ WRITE (*,9008) KPARM(J901)
+ ENDIF
+ 901 CONTINUE
+ WRITE (*,*) 'INXBIT : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9002) KNSPT
+ ENDIF
+C
+C
+ 9001 FORMAT (1H ,'INXBIT : Word ',I8,' is outside array bounds ',I8)
+C
+ 9002 FORMAT (1H ,' KNSPT = ',I8)
+C
+ 9003 FORMAT (1H ,'INXBIT : Word is',I8,', bit offset is ',I2)
+C
+ 9004 FORMAT (1H ,' KBIT = ',I8)
+C
+ 9005 FORMAT (1H ,' HFUNC = ',A)
+C
+ 9006 FORMAT (1H ,' Inserted value = ',I20)
+C
+ 9007 FORMAT (1H ,' First ',I9,' values.')
+C
+ 9008 FORMAT (1H ,' Extracted value = ',I20)
+C
+ 9009 FORMAT (1H ,' KLENG = ',I20)
+C
+ RETURN
+C
+ END
+ SUBROUTINE ABORTX (HNAME)
+C
+C**** ABORTX - Terminates execution of program.
+C
+C Purpose.
+C --------
+C
+C Terminates execution of program.
+C
+C** Interface.
+C ----------
+C
+C CALL ABORTX (HNAME)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C HNAME - Name of calling routine.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C Prints message and terminates.
+C
+C Externals.
+C ----------
+C
+C SYSABN
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C IBM version of routine.
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 13.11.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+C
+ CHARACTER*(*) HNAME
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Print message and terminate.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WRITE (*,9001) HNAME
+C
+ CALL SYSABN (1)
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ 9001 FORMAT (1H ,'ABORTX : Routine ',A,' has requested program',
+ C ' termination.')
+C
+ RETURN
+C
+ END
+ SUBROUTINE SETPAR (KBIT,KNEG,KPR)
+C
+C**** SETPAR - Set number of bits in word. Set maximum negative integer.
+C
+C Purpose.
+C --------
+C
+C Set number of bits in word. Set maximum negative integer.
+C
+C** Interface.
+C ----------
+C
+C CALL SETPAR (KBIT,KNEG,KPR)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KPR - Debug print switch.
+C 1 , print out.
+C 0 , No print out.
+C
+C Output Parameters.
+C ------------------
+C
+C KBIT - Number of bits in computer word.
+C
+C KNEG - Maximum negative integer.
+C
+C Method.
+C -------
+C
+C Values are assigned.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C IBM version of routine.
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 28.10.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+C
+ INTEGER KBIT
+ INTEGER KNEG
+ INTEGER KPR
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Assign values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) ' SETPAR : Section 1.'
+C
+ KBIT = 32
+ KNEG = -2147483647
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (KPR.EQ.1)
+ C THEN
+ WRITE (*,*) ' SETPAR : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9001) KBIT
+ WRITE (*,9002) KNEG
+ ENDIF
+C
+ 9001 FORMAT (1H ,' KBIT = ',I3)
+C
+ 9002 FORMAT (1H ,' KNEG = ',I22)
+C
+ RETURN
+C
+ END
+*
+* IBM Assembler version of GBYTE(S) and SBYTE(S).
+*
+* **** DOCUMENTATION ****
+* WRITTEN BY JORDAN HASTINGS AND DENNIS JOSEPH
+* NCAR, BOULDER, COLORADO
+*
+* THE FOLLOWING ROUTINES ALLOW FORTRAN ACCESS TO BIT STRINGS (BYTE
+* OF ARBITRARY LENGTH AND POSITION, PERHAPS CROSSING WORD BOUNDARIES,
+* IN THE MANNER SPECIFIED BELOW:
+*
+* CALL GBYTE (PCKD,UNPK,INOFST,NBIT)
+* CALL GBYTES(PCKD,UNPK,INOFST,NBIT, NSKIP,ITER)
+*
+* PCKD: THE FULLWORD IN MEMORY FROM WHICH UNPACKING IS TO
+* BEGIN; SUCCESSIVE FULLWORDS WILL BE FETCHED AS
+* REQUIRED.
+* UNPK: THE FULLWORD IN MEMORY INTO WHICH THE INITIAL BYTE
+* OF UNPACKED DATA IS TO BE STORED; SUBSEQUENT BYTES
+* WILL BE STORED INTO SUCCESSIVE FULLWORDS AS
+* REQUIRED.
+* INOFST: A FULLWORD INTEGER SPECIFYING THE INITAL OFFSET
+* IN BITS OF THE FIRST BYTE, COUNTED FROM THE
+* LEFTMOST BIT IN PCKD.
+* NBITS: A FULLWORD INTEGER SPECIFYING THE NUMBER OF BITS
+* IN EACH BYTE TO BE UNPACKED. LEGAL BYTE WIDTHS
+* ARE IN THE RANGE 1 - 32; BYTES OF WIDTH .LT. 32
+* WILL BE RIGHT JUSTIFIED IN THE LOW-ORDER POSITIONS
+* OF THE UNPK FULLWORDS, WITH HIGH-ORDER ZERO FILL.
+* NSKIP: A FULLWORD INTEGER SPECIFYING THE NUMBER OF BITS
+* TO SKIP BETWEEN SUCCESSIVE BYTES. ALL NON-NEGATIVE
+* SKIP COUNTS ARE LEGAL.
+* ITER: A FULLWORD INTEGER SPECIFYING THE TOTAL NUMBER OF
+* BYTES TO BE UNPACKED, AS CONTROLLED BY INOFST,
+* NBIT AND NSKIP ABOVE. ALL NON-NEGATIVE ITERATION
+* COUNTS ARE LEGAL.
+*
+* NOTES ...
+* 1) A MULTIPLE-BYTE ACCESS (GBYTES) WITH ITER=0 (BUT
+* NOT 1) IS EXACTLY EQUIVALENT TO A SINGLE-BYTE
+* ACCESS (GBYTE).
+* 2) AN ERROR DETECTED IN THE CALLING SEQUENCE OF
+* EITHER GBYTE OR GBYTES SUPPRESSES BYTE ACCESS,
+* AND SETS THE FIRST ELEMENT OF UNPK = X'FFFFFFFF'
+*
+GBYT TITLE 'IBM S/360 VERSION OF NCAR CDC/6600 BIT MANIPULATION'
+*
+* **** REGISTER USAGE ****
+ZERO EQU X'0' CONSTANT ZERO
+PCKD EQU X'1' ADDR OF PACKED ARY ELEMENT
+UNPK EQU X'2' ADDR OF UNPACKED ARY ELEMENT
+OFST EQU X'3' INITIAL BIT OFFSET
+NBIT EQU X'4' BYTE LENGTH IN BITS (.LE.32)
+NSKP EQU X'5' ITERATIVE BIT SKIP
+ITER EQU X'6' ITERATION COUNT (.GE.0)
+BITR EQU X'7' BITS REMAINING IN HIWD
+BITS EQU X'8' BITS TO SHIFT (OFST OR NSKP)
+WORK EQU X'9' WORK REGISTER
+HIWD EQU X'A' HI-ORDER WORD (EVEN REGISTER
+LOWD EQU X'B' LO-ORDER WORD (ODD REGISTER)
+BYTE EQU X'C' RESULTANT BYTE
+* EQU X'D' SAVE AREA ADDR (NOT MODIFIED)
+* EQU X'E' RETURN ADDR (NOT MODIFIED)
+BASE EQU X'F' BASE ADDR REGISTER
+NBFW EQU 4 NUMBER OF BYTES/FULL WORD
+*
+*
+* **** CODE ****
+*
+GBYTES CSECT , PRIME ENTRY POINT
+ ENTRY GBYTE ALTERNATE ENTRY POINT
+*
+ USING GBYTES,BASE ENTRY PT ADR ESTB IN R15 BY CALLER
+ SAVE (0,12) SAVE CALLING PROG REGISTERS (MACRO)
+ LM NSKP,ITER,4*NBFW(1) PICK UP NSKIP, ITER PARM ADDRESSES
+ L NSKP,0(,NSKP) PICK UP BIT SKIP COUNT
+ L ITER,0(,ITER) PICK UP ITERATION COUNT
+ B INIT JUMP INTO CODE PROPER
+*
+GBYTE DS 0H FORCE HALFWD ALLIGNMENT
+ USING GBYTE,BASE ALT ENTRY ADDR ESTB IN R15 BY CALLER
+ SAVE (0,12) SAVE CALLING PROG REGISTERS (MACRO)
+ SR ITER,ITER MAKE ITERATION COUNT ZERO
+*
+INIT BALR BASE,0 RE-ESTABLISH ADDRESSABILITY
+ USING *,BASE
+ LM PCKD,NBIT,0(1) PICK UP ARY AND PARAMETER ADDRESSES
+ L LOWD,0(,OFST) COMPUTE FIRST PCKD WORD AND OFFSET
+ LA WORK,32
+ SR HIWD,HIWD
+ DR HIWD,WORK
+ LR OFST,HIWD SET OFFSET TO REMAINDER
+ SLA LOWD,2
+ AR PCKD,LOWD INCR PCKD ADDRESS BY WHOLE WORDS
+ L HIWD,0(,PCKD) PICK UP FIRST WORD OF PACKED ARY
+ LH BITR,=H'32' AFTER HIWD FETCH FULL 32 BITS REMAIN
+ L NBIT,0(,NBIT) PICK UP NO. OF BITS/BYTE TO UNPACK
+ SR ZERO,ZERO ZERO OUT REG 0
+ LR WORK,BITR MAKE WORK=32
+ CR ITER,ZERO TEST FOR ZERO ITERATION COUNT
+ BH INIT1 IF NOT, CONTINUE WITH INITIALIZATION
+INIT0 CR OFST,BITR ELSE, TEST INITIAL OFFSET IN RANGE
+ BNL FAIL IF NOT .LT. 32, FAIL
+ LH ITER,=H'1' FORCE EXACTLY 1 ITERATION
+ B INIT2
+INIT1 AR NSKP,NBIT ADD NBIT TO NSKP FOR MULT ACCESS
+INIT2 LA PCKD,NBFW(PCKD) INCR PACKED ARY POINTER
+ L LOWD,0(,PCKD) PICK UP SECOND WD OF PACKED ARRAY
+ SR WORK,NBIT COMPLEMENT NBITS (MODULO 32)
+ CR WORK,ZERO TEST NBITS IN RANGE
+ BL FAIL IF NOT,.LE.32, FAIL
+ STH WORK,STORE+4 ELSE USE TO SET UP BYTE SHIFT COUNT
+* OF SRL (RX) INSTR IN STORE SEQ
+ LR BITS,OFST MAKE BITS TO SHIFT = INITIAL OFFSET
+ LR WORK,BITR MAKE WORK=32, AGAIN
+*
+TEST CR BITS,BITR COMPARE BITS TO SHIFT WITH REMAINING
+ BL SHIFT IF BITS.LT.BITR, PROCEED WITH SHIFT
+ BH SPLIT IF BITS.GT.BITR, ITER OVER SPLIT WDS
+* BE COPY ELSE, IF BITS.EQ.BITR, RECOPY HIWD
+*
+COPY L HIWD,0(,PCKD) RELOAD HIWD FROM MEM WITH PREV LOWD
+ LA PCKD,NBFW(PCKD) INCR PACKED ARY POINTER
+ L LOWD,0(,PCKD) AND PICK UP NEXT PACKED LOWD
+ LR BITR,WORK RESET BITR TO 32
+ B STORE PROCEED WITH STORE OPERATIONS
+*
+SPLIT STH BITR,*+6 SET UP BITR AS SLDL SHIFT COUNT
+ SLDL HIWD,*-* SHIFT LEFT DOUBLE LOGICAL, HIWD/LOWD
+ SR BITS,BITR DECR BITS TO SHIFT BY SHIFTED BITR
+ B SPLIT1 BYPASS FAST FULLWORD SKIPS
+ LR OFST,BITS COPY BITS REMAINING TO SHIFT TO OFST
+* (DESTROYING INITAL OFFSET PARM)
+ SRA OFST,5 DIVIDE BY 32 TO GET WORDS TO SHIFT
+* CR OFST,ZERO SIMULTANEOUSLY SETTING COND CODE
+* IF REMAINING SHIFT .LT. 1 WORD
+ BNH SPLIT1 FETCH NEXT SEQUENTIAL LOWD IMMED
+ SLA OFST,2 ELSE, MULTIPLY WDS BY 4 TO GET BYTES
+ AR PCKD,OFST INCR PACKED ARRAY POINTER
+ L HIWD,0(,PCKD) AND LOAD NEW HIWD
+ SLA OFST,3 MULTIPY BYTES BY 8 TO GET BITS
+ SR BITS,OFST AND DECR BITS REMAINING TO SHIFT
+SPLIT1 LA PCKD,NBFW(PCKD) INCR PACKED ARY PTR
+ L LOWD,0(,PCKD) AND PICK UP NEXT PACKED LOWD
+ LR BITR,WORK RESET BITR TO 32
+ B TEST ITERATE AS NECESSARY
+*
+SHIFT STH BITS,*+6 SET UP BITS AS SLDL SHIFT COUNT
+ SLDL HIWD,*-* SHIFT LEFT DOUBLE LOGICAL, HIWD/LOWD
+ SR BITR,BITS DECR BITS REMAINING BY BITS SHIFTED
+*
+STORE LR BYTE,HIWD COPY HIWD TO BYTE
+ SRL BYTE,*-* SHIFT RIGHT(WITH HI-ORDER ZERO FILL)
+* *-* SHIFT COUNT SET UP AT INIT2
+STORE1 ST BYTE,0(,UNPK) FILL BYTE INTO UNPACKED ARY
+ LA UNPK,NBFW(UNPK) AND INCR UNPACKED ARY POINTER
+ LR BITS,NSKP RESTORE BITS = (NSKP+NBIT)
+ BCT ITER,TEST DECR ITER COUNT, CONTINUE TILL ZERO
+*
+*
+EXIT RETURN (0,12) RESTORE CALLING PROG REGS (MACRO)
+*
+FAIL LH BYTE,=X'FFFF' MAKE BYTE A FULL WD OF 1'S
+ ST BYTE,0(,UNPK) AND FILL INTO UNPACKED ARRAY
+ B EXIT
+*
+ LTORG
+ END
+R0 EQU X'0'
+R1 EQU X'1'
+R2 EQU X'2'
+R3 EQU X'3'
+R4 EQU X'4'
+R5 EQU X'5'
+R6 EQU X'6'
+R7 EQU X'7'
+R8 EQU X'8'
+R9 EQU X'9'
+R10 EQU X'A'
+R11 EQU X'B'
+R12 EQU X'C'
+R13 EQU X'D'
+R14 EQU X'E'
+R15 EQU X'F'
+SBYTES CSECT ,
+*
+* SBYTE/SBYTES - GENERAL BIT PACKING ROUTINES.
+* SEE NCAR - TN/93, JANUARY 1974.
+* D. JOSEPH OCTOBER, 1981.
+*
+ ENTRY SBYTE
+ USING SBYTES,R15
+ SAVE (0,12)
+ STM R13,R14,REG13 SAVE REGISTER 13 AND 14 LOCAL.
+ LM R11,R12,16(R1) GET SKIP AND ITERATION COUNT.
+ L R11,0(R11)
+ L R12,0(R12)
+ B START
+SBYTE DS 0H
+ USING SBYTE,R15
+ SAVE (0,12)
+ STM R13,R14,REG13 SAVE REGISTER 13 AND 14 LOCAL.
+ SR R12,R12 ZERO ITERATION COUNT.
+START BALR R15,R0 RE-ESTABLISH ADDRESSABILITY.
+ USING *,R15
+ LM R7,R10,0(R1) GET REMAINING ARG ADDRESSES.
+ LA R1,1 SET CONSTANT ONE.
+ L R10,0(R10) GET BYTE SIZE.
+ LA R0,1 MAKE MASK.
+ SLL R0,31
+ SR R10,R1
+ STH R10,MASK+2
+ AR R10,R1
+ LA R6,32 MAKE CONSTANT 32.
+ L R14,COMP LOAD COMPLEMENT MASK.
+MASK SRA R0,*-*
+ LR R13,R0 SAVE MASK.
+ SLL R12,2 NUM OF ITERATIONS * FOUR.
+ AR R12,R8 SET ITERATION LIMIT.
+ L R4,0(R9) APPLY INITIAL OFFSET.
+ LA R1,96
+ CR R4,R1 CHECK FOR LARGE OFFSET.
+ BL NODIV
+ LR R5,R4
+ SR R4,R4
+ DR R4,R6 USE DIVIDE FOR LARGE OFFSET
+ SLL R5,2 CHANGE WORD COUNT TO BYTE COUNT.
+ AR R7,R5
+NODIV EQU *
+ LA R5,4 LOAD CONSTANT FOUR.
+RELOAD CR R4,R6 FIND WORD AND OFFSET.
+ BL ILOAD START IF OFFSET < 32.
+ SR R4,R6
+ AR R7,R5
+ B RELOAD
+ILOAD L R9,0(R7) GET STORE WORD.
+BEGIN STH R4,PMASK+2 POSITION MASK IN DOUBLE WORD.
+ SR R1,R1
+PMASK SRDL R0,*-*
+ L R3,0(R8) LOAD BYTE FOR STORE.
+ LA R2,64
+ SR R2,R10 POSITION BYTE.
+ SR R2,R4
+ STH R2,SHIFTB+2
+ SR R2,R2
+SHIFTB SLDL R2,*-* SHIFT BYTE TO STORE.
+ NR R2,R0 MASK ON CURRENT MASK.
+ XR R0,R14 COMPLEMENT MASK.
+ NR R9,R0 OPEN HOLE FOR BYTE.
+ OR R9,R2 INSERT BYTE.
+ AR R4,R10 ADD BYTE SIZE.
+ CR R4,R6
+ BNH NOPART BRANCH IF NO PARTIAL BYTE.
+ ST R9,0(R7) STORE CURRENT WORD.
+ SR R4,R6
+ AR R7,R5 ADD FOUR TO WORD ADDRESS.
+ L R9,0(R7) LOAD NEXT WORD.
+ NR R3,R1 ISOLATE PARTIAL BYTE.
+ XR R1,R14 COMPLEMENT MASK.
+ NR R9,R1 OPEN HOLE FOR PARTIAL BYTE.
+ OR R9,R3 INSERT PARTIAL BYTE.
+NOPART AR R8,R5 COUNT BYTE.
+ CR R8,R12 CHECK IF DONE.
+ BNL DONE
+ AR R4,R11 ADD SKIP AMOUNT.
+ LR R0,R13 RELOAD MASK
+ CR R4,R6
+ BL BEGIN BRANCH IF IN SAME WORD.
+ ST R9,0(R7) STORE CURRENT WORD.
+ B RELOAD GO TO GET NEW WORD.
+DONE ST R9,0(R7) STORE LAST WORD.
+ LM R13,R14,REG13 RESTORE REGISTER 13 AND 14.
+ RETURN (0,12)
+HMASK DS D ARE FOR CURRENT MASK.
+REG13 DS F
+REG14 DS F
+COMP DC X'FFFFFFFF' COMPLEMENT MASK.
+ LTORG
+ END
diff --git a/gribex/btsun.special b/gribex/btsun.special
new file mode 100755
index 0000000..1da37e1
--- /dev/null
+++ b/gribex/btsun.special
@@ -0,0 +1,698 @@
+ SUBROUTINE INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+ C KBLEN,HFUNC,KRET)
+C
+C**** INXBIT - Insert/extract bits consecutively in/from a given array
+C
+C Purpose.
+C --------
+C
+C Take rightmost KBLEN bits from KNUM words of KPARM
+C and insert them consecutively in KGRIB, starting at
+C bit after KNSPT or vice versa.
+C
+C** Interface.
+C ----------
+C
+C CALL INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+C C KBLEN,KRET)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KGRIB - Array containing bitstream.
+C KLENG - Length (words) of this array.
+C KNSPT - Bit number after which insertion or
+C extraction starts.
+C KPARM - Array from which bits are taken for
+C insertion in the bitstream or to which
+C bits are extracted from the bitstream.
+C KBIT - Number of bits in computer word.
+C KNUM - Number of bit fields inserted/extracted.
+C KBLEN - Number of bits per bit field.
+C HFUNC - Requested function.
+C 'C' to insert bits in bitstream,
+C 'D' to extract bits from bitstream.
+C
+C Output Parameters.
+C ------------------
+C
+C KNSPT - Bit number of last bit inserted/extracted.
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Insertion/extraction exceeded
+C array boundary.
+C
+C Method.
+C -------
+C
+C Word and offset pointer calculated before calling
+C insertion/extraction routines.
+C
+C Externals.
+C ----------
+C
+C SBYTES
+C GBYTES
+C
+C Reference.
+C ----------
+C
+C ECLIB documentation on SBYTES and GBYTES.
+C
+C Comments.
+C ---------
+C
+C SUN version of routine.
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 08.11.91
+C Parameter KMACH removed from list of input parameters.
+C
+C J. Hennessy ECMWF 12.10.92
+C Dimension of IMASK changed from 64 to 65.
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+ INTEGER IND
+ INTEGER INUM
+ INTEGER IOFF
+ INTEGER IPR
+ INTEGER IWORD
+C
+ INTEGER KBIT
+ INTEGER KBLEN
+ INTEGER KGRIB
+ INTEGER KLENG
+ INTEGER KNSPT
+ INTEGER KNUM
+ INTEGER KPARM
+ INTEGER KRET
+C
+ INTEGER J901
+C
+ DIMENSION KGRIB(KLENG)
+ DIMENSION KPARM(*)
+C
+ CHARACTER*1 HFUNC
+C
+C
+C Debug print switch.
+C
+ DATA IPR /0/
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Set initial values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ WRITE (*,*) 'INXBIT : Section 1.'
+ WRITE (*,*) ' Input values used -'
+ WRITE (*,9009) KLENG
+ WRITE (*,9002) KNSPT
+ WRITE (*,9004) KBIT
+ WRITE (*,9005) HFUNC
+ ENDIF
+C
+ KRET = 0
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Bit insertion/extraction.
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 2.'
+C
+C* Calculate word pointer and offset.
+C
+ IWORD = KNSPT / KBIT
+ IOFF = KNSPT - IWORD * KBIT
+ IWORD = IWORD + 1
+ IF (IPR.EQ.1) WRITE (*,9003) IWORD , IOFF
+C
+C Insert/extract bits.
+C
+ IF (HFUNC.EQ.'C')
+ C THEN
+ CALL SBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ELSE
+ CALL GBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ENDIF
+C
+C Update pointer.
+C
+ KNSPT = KNSPT + KBLEN * KNUM
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 3 . Check out of range.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 3.'
+C
+ IND = KNSPT / KBIT
+ IF (IND.GT.KLENG)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) IND , KLENG
+ ENDIF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ INUM = KNUM
+ IF (INUM.GT.360)
+ C THEN
+ INUM = 360
+ WRITE (*,9007) INUM
+ ENDIF
+ DO 901 J901=1,INUM
+ IF (HFUNC.EQ.'C')
+ C THEN
+ WRITE (*,9006) KPARM(J901)
+ ELSE
+ WRITE (*,9008) KPARM(J901)
+ ENDIF
+ 901 CONTINUE
+ WRITE (*,*) 'INXBIT : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9002) KNSPT
+ ENDIF
+C
+C
+ 9001 FORMAT (1H ,'INXBIT : Word ',I8,' is outside array bounds ',I8)
+C
+ 9002 FORMAT (1H ,' KNSPT = ',I8)
+C
+ 9003 FORMAT (1H ,'INXBIT : Word is',I8,', bit offset is ',I2)
+C
+ 9004 FORMAT (1H ,' KBIT = ',I8)
+C
+ 9005 FORMAT (1H ,' HFUNC = ',A)
+C
+ 9006 FORMAT (1H ,' Inserted value = ',I20)
+C
+ 9007 FORMAT (1H ,' First ',I9,' values.')
+C
+ 9008 FORMAT (1H ,' Extracted value = ',I20)
+C
+ 9009 FORMAT (1H ,' KLENG = ',I20)
+C
+ RETURN
+C
+ END
+ SUBROUTINE ABORTX (HNAME)
+C
+C**** ABORTX - Terminates execution of program.
+C
+C Purpose.
+C --------
+C
+C Terminates execution of program.
+C
+C** Interface.
+C ----------
+C
+C CALL ABORTX (HNAME)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C HNAME - Name of calling routine.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C Prints message and terminates.
+C
+C Externals.
+C ----------
+C
+C ABORT
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C SUN version of routine.
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 13.11.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+C
+ CHARACTER*(*) HNAME
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Print message and terminate.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WRITE (*,9001) HNAME
+C
+ CALL ABORT
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ 9001 FORMAT (1H ,'ABORTX : Routine ',A,' has requested program',
+ C ' termination.')
+C
+ RETURN
+C
+ END
+ SUBROUTINE SETPAR (KBIT,KNEG,KPR)
+C
+C**** SETPAR - Set number of bits in word. Set maximum negative integer.
+C
+C Purpose.
+C --------
+C
+C Set number of bits in word. Set maximum negative integer.
+C
+C** Interface.
+C ----------
+C
+C CALL SETPAR (KBIT,KNEG,KPR)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KPR - Debug print switch.
+C 1 , print out.
+C 0 , No print out.
+C
+C Output Parameters.
+C ------------------
+C
+C KBIT - Number of bits in computer word.
+C
+C KNEG - Maximum negative integer.
+C
+C Method.
+C -------
+C
+C Values are assigned.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C SUN version of routine.
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 28.10.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+C
+ INTEGER KBIT
+ INTEGER KNEG
+ INTEGER KPR
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Assign values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) ' SETPAR : Section 1.'
+C
+ KBIT = 32
+ KNEG = -2147483647
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (KPR.EQ.1)
+ C THEN
+ WRITE (*,*) ' SETPAR : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9001) KBIT
+ WRITE (*,9002) KNEG
+ ENDIF
+C
+ 9001 FORMAT (1H ,' KBIT = ',I3)
+C
+ 9002 FORMAT (1H ,' KNEG = ',I22)
+C
+ RETURN
+C
+ END
+#include <stdio.h>
+
+
+/* Tools for storage/retrieval of arbitrary size bytes from 32 bit words
+ (note - this version is not currently (6/30/88) described in the
+ gbytes document)
+ Modified by Arne Jorgensen 12-April-1991 (SUN routine)
+
+ gbytes(p,u,q,b,s,n)
+ gbyte (p,u,q,b)
+ sbytes(p,u,q,b,s,n)
+ sbyte (p,u,q,b)
+
+ q >= 0 number of bits to be skipped preceding first
+ byte in p
+ 0 < b < sword byte size
+ s >= 0 number of bits to be skipped between bytes
+ n >= 0 number of bytes to be packed/unpacked
+
+ gbytes unpacks n b bit bytes from p into u, starting by skipping
+ q bits in p, then skipping s bits between bytes.
+ gbyte unpacks one such byte.
+ sbytes packs n b bit bytes from u into p, starting by skipping
+ q bits in p, then skipping s bits between bytes.
+ sbyte packs one such byte. */
+#define SWORD 32 /* Word size in bits */
+#define MASK 0xffffffff /* Mask of sword bits */
+#define G1BYTE(p,q,b) ((b==32 ? MASK : ~(MASK<<b)) & (p>>(SWORD-(q+b))))
+ /* Get 1 word contained byte */
+# define MASK1(q,b) (b==32 ? MASK : (~(MASK<<b)<<(SWORD-(q+b))))
+ /* Mask of sword bits */
+gsbytes(p,u,q,b,s,n,gsbyte) /* Common code for gbytes, sbytes */
+long p[],u[],*q,*b,*s,*n;
+int (*gsbyte)();
+{ long jp,jq,ju;
+ jp = 0;
+ jq = *q;
+ for (ju = 0; ju < *n; ++ju) {
+ (*gsbyte)(&p[jp],&u[ju],&jq,b);
+ jq += *b + *s;
+ jp += jq/SWORD;
+ jq %= SWORD;
+ }
+}
+gbytes_(p,u,q,b,s,n)
+long p[],u[],*q,*b,*s,*n;
+{
+ int gbyte_();
+ gsbytes(p,u,q,b,s,n,gbyte_);
+}
+gbyte_(p,u,q,b)
+long p[],*u,*q,*b;
+{
+ long qb,j,lb,jq,jb;
+
+ jq = *q;
+ jb = *b;
+ if (jq >= SWORD) {
+ j = jq/SWORD; /* number of words offset */
+ jq %= SWORD; /* odd bits of offset */
+ }
+ else {
+ j=0;
+ }
+ qb = jq + jb;
+ if (qb > SWORD) {
+ qb = SWORD - jq;
+ jb -= qb;
+ lb = (G1BYTE(p[j],jq,qb)) << jb;
+ jq = 0;
+ j++; /* increment to next word */
+ }
+ else lb = 0;
+ *u = lb + (G1BYTE(p[j],jq,jb));
+}
+sbytes_(p,u,q,b,s,n)
+long p[],u[],*q,*b,*s,*n;
+{
+ int sbyte_();
+ gsbytes(p,u,q,b,s,n,sbyte_);
+}
+sbyte_(p,u,q,b)
+long p[],*u,*q,*b;
+{
+ long qb,j,jq,jb,rb;
+
+ jq = *q;
+ jb = *b;
+ if (jq >= SWORD) {
+ j = jq / SWORD; /* number of words offset */
+ jq %= SWORD; /* odd bit offset */
+ }
+ else {
+ j = 0;
+ }
+ qb = jq + jb;
+ if (qb > SWORD) {
+ qb = SWORD - jq;
+ jq = SWORD - jb;
+ jb -= qb;
+ p[j] = ((p[j] >> qb) << qb) + (G1BYTE(*u,jq,qb));
+ jq = 0;
+ j++; /* point to next word */
+ }
+ rb = G1BYTE(*u,SWORD-jb,jb);
+ p[j] = (p[j] & ~MASK1(jq,jb)) + (rb << SWORD-(jb+jq));
+}
+
diff --git a/gribex/btvax.special b/gribex/btvax.special
new file mode 100755
index 0000000..670dc4a
--- /dev/null
+++ b/gribex/btvax.special
@@ -0,0 +1,1009 @@
+ SUBROUTINE INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+ C KBLEN,HFUNC,KRET)
+C
+C**** INXBIT - Insert/extract bits consecutively in/from a given array
+C
+C Purpose.
+C --------
+C
+C Take rightmost KBLEN bits from KNUM words of KPARM
+C and insert them consecutively in KGRIB, starting at
+C bit after KNSPT or vice versa.
+C
+C** Interface.
+C ----------
+C
+C CALL INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+C C KBLEN,KRET)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KGRIB - Array containing bitstream.
+C KLENG - Length (words) of this array.
+C KNSPT - Bit number after which insertion or
+C extraction starts.
+C KPARM - Array from which bits are taken for
+C insertion in the bitstream or to which
+C bits are extracted from the bitstream.
+C KBIT - Number of bits in computer word.
+C KNUM - Number of bit fields inserted/extracted.
+C KBLEN - Number of bits per bit field.
+C HFUNC - Requested function.
+C 'C' to insert bits in bitstream,
+C 'D' to extract bits from bitstream.
+C
+C Output Parameters.
+C ------------------
+C
+C KNSPT - Bit number of last bit inserted/extracted.
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Insertion/extraction exceeded
+C array boundary.
+C
+C Method.
+C -------
+C
+C Word and offset pointer calculated before calling
+C insertion/extraction routines.
+C
+C Externals.
+C ----------
+C
+C SBYTES
+C GBYTES
+C
+C Reference.
+C ----------
+C
+C ECLIB documentation on SBYTES and GBYTES.
+C
+C Comments.
+C ---------
+C
+C VAX version of routine.
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 08.11.91
+C Parameter KMACH removed from list of input parameters.
+C
+C J. Hennessy ECMWF 12.10.92
+C Dimension of IMASK changed from 64 to 65.
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+ INTEGER IND
+ INTEGER INUM
+ INTEGER IOFF
+ INTEGER IPR
+ INTEGER IWORD
+C
+ INTEGER KBIT
+ INTEGER KBLEN
+ INTEGER KGRIB
+ INTEGER KLENG
+ INTEGER KNSPT
+ INTEGER KNUM
+ INTEGER KPARM
+ INTEGER KRET
+C
+ INTEGER J901
+C
+ DIMENSION KGRIB(KLENG)
+ DIMENSION KPARM(*)
+C
+ CHARACTER*1 HFUNC
+C
+C
+C Debug print switch.
+C
+ DATA IPR /0/
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Set initial values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ WRITE (*,*) 'INXBIT : Section 1.'
+ WRITE (*,*) ' Input values used -'
+ WRITE (*,9009) KLENG
+ WRITE (*,9002) KNSPT
+ WRITE (*,9004) KBIT
+ WRITE (*,9005) HFUNC
+ ENDIF
+C
+ KRET = 0
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Bit insertion/extraction.
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 2.'
+C
+C* Calculate word pointer and offset.
+C
+ IWORD = KNSPT / KBIT
+ IOFF = KNSPT - IWORD * KBIT
+ IWORD = IWORD + 1
+ IF (IPR.EQ.1) WRITE (*,9003) IWORD , IOFF
+C
+C Insert/extract bits.
+C
+ IF (HFUNC.EQ.'C')
+ C THEN
+ CALL SBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ELSE
+ CALL GBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ENDIF
+C
+C Update pointer.
+C
+ KNSPT = KNSPT + KBLEN * KNUM
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 3 . Check out of range.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF (IPR.EQ.1) WRITE (*,*) 'INXBIT : Section 3.'
+C
+ IND = KNSPT / KBIT
+ IF (IND.GT.KLENG)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) IND , KLENG
+ ENDIF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (IPR.EQ.1)
+ C THEN
+ INUM = KNUM
+ IF (INUM.GT.360)
+ C THEN
+ INUM = 360
+ WRITE (*,9007) INUM
+ ENDIF
+ DO 901 J901=1,INUM
+ IF (HFUNC.EQ.'C')
+ C THEN
+ WRITE (*,9006) KPARM(J901)
+ ELSE
+ WRITE (*,9008) KPARM(J901)
+ ENDIF
+ 901 CONTINUE
+ WRITE (*,*) 'INXBIT : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9002) KNSPT
+ ENDIF
+C
+C
+ 9001 FORMAT (1H ,'INXBIT : Word ',I8,' is outside array bounds ',I8)
+C
+ 9002 FORMAT (1H ,' KNSPT = ',I8)
+C
+ 9003 FORMAT (1H ,'INXBIT : Word is',I8,', bit offset is ',I2)
+C
+ 9004 FORMAT (1H ,' KBIT = ',I8)
+C
+ 9005 FORMAT (1H ,' HFUNC = ',A)
+C
+ 9006 FORMAT (1H ,' Inserted value = ',I20)
+C
+ 9007 FORMAT (1H ,' First ',I9,' values.')
+C
+ 9008 FORMAT (1H ,' Extracted value = ',I20)
+C
+ 9009 FORMAT (1H ,' KLENG = ',I20)
+C
+ RETURN
+C
+ END
+ SUBROUTINE ABORTX (HNAME)
+C
+C**** ABORTX - Terminates execution of program.
+C
+C Purpose.
+C --------
+C
+C Terminates execution of program.
+C
+C** Interface.
+C ----------
+C
+C CALL ABORTX (HNAME)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C HNAME - Name of calling routine.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C Prints message and terminates.
+C
+C Externals.
+C ----------
+C
+C EXIT
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C VAX version of routine.
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 13.11.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+C
+ CHARACTER*(*) HNAME
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Print message and terminate.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WRITE (*,9001) HNAME
+C
+ CALL EXIT (-1)
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ 9001 FORMAT (1H ,'ABORTX : Routine ',A,' has requested program',
+ C ' termination.')
+C
+ RETURN
+C
+ END
+ SUBROUTINE SETPAR (KBIT,KNEG,KPR)
+C
+C**** SETPAR - Set number of bits in word. Set maximum negative integer.
+C
+C Purpose.
+C --------
+C
+C Set number of bits in word. Set maximum negative integer.
+C
+C** Interface.
+C ----------
+C
+C CALL SETPAR (KBIT,KNEG,KPR)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KPR - Debug print switch.
+C 1 , print out.
+C 0 , No print out.
+C
+C Output Parameters.
+C ------------------
+C
+C KBIT - Number of bits in computer word.
+C
+C KNEG - Maximum negative integer.
+C
+C Method.
+C -------
+C
+C Values are assigned.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C VAX version of routine.
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 28.10.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+C
+ INTEGER KBIT
+ INTEGER KNEG
+ INTEGER KPR
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Assign values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) ' SETPAR : Section 1.'
+C
+ KBIT = 32
+ KNEG = -2147483648
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (KPR.EQ.1)
+ C THEN
+ WRITE (*,*) ' SETPAR : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9001) KBIT
+ WRITE (*,9002) KNEG
+ ENDIF
+C
+ 9001 FORMAT (1H ,' KBIT = ',I3)
+C
+ 9002 FORMAT (1H ,' KNEG = ',I22)
+C
+ RETURN
+C
+ END
+ SUBROUTINE GBITS(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C
+C**** GBITS - VAX routine.
+C
+ DIMENSION NPACK(*),ISAM(*)
+ PARAMETER (LENWRD=32)
+C
+C ++++++++++
+C CALL GBITS(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C ++++++++++
+C
+C STARTS UNPACKING BITS AT BIT OFFSET IBIT IN ARRAY
+C NPACK. IT TAKES NBITS AND STORES THEM IN THE LONGWORD
+C ARRAY STARTING AT ISAM. THEN NSKIP BITS ARE SKIPPED IN
+C NPACK AND THE NEXT FIELD OF NBITS IS UNPACKED INTO THE
+C NEXT ISAM. THIS IS DONE A TOTAL OF ITER TIMES.
+C
+C THIS ROUTINE EXTRACTS BITS FROM VAX WORDS.
+C IT IS SIMILAR TO NCAR'S GBYTE BUT IT WORKS WITH
+C THE NATURAL UNDERLYING STRUCTURE OF THE VAX.
+C ----------
+C
+ ISW = 1
+ GO TO 8
+C
+C
+ ENTRY SBITS(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C
+C ++++++++++
+C CALL SBITS(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C ++++++++++
+C
+C THIS ROUTINE TAKES THE FIRST LONGWORD LOCATED AT
+C ISAM AND STORES IT INTO THE NBITS OF NPACK STARTING AT
+C BIT OFFSET IBIT. THEN NSKIP BITS ARE SKIPPED IN
+C NPACK AND THE PROCESS IS REPEATED A TOTAL OF ITER TIMES.
+C
+C THIS ROUTINE EXTRACTS BITS FROM VAX WORDS.
+C IT IS SIMILAR TO NCAR'S SBYTE BUT IT WORKS WITH
+C THE NATURAL UNDERLYING STRUCTURE OF THE VAX.
+C ----------
+ ISW = 2
+ GO TO 8
+C
+C ++++++++++
+ ENTRY G_BYTES(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C ++++++++++
+C
+C CALL G_BYTES(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C STARTS UNPACKING BITS AT BIT OFFSET IBIT IN ARRAY
+C NPACK. IT TAKES NBITS AND STORES THEM IN THE LONGWORD
+C ARRAY STARTING AT ISAM. THEN NSKIP BITS ARE SKIPPED IN
+C NPACK AND THE NEXT FIELD OF NBITS IS UNPACKED INTO THE
+C NEXT ISAM. THIS IS DONE A TOTAL OF ITER TIMES.
+C
+C THIS ROUTINE DEALS WITH BITS AND BYTES IN THE ORDER
+C THEY ARE NUMBERED ON THE MESA (IE BIGENDIAN).
+C ----------
+ ISW = 3
+ GO TO 8
+C
+C ++++++++++
+ ENTRY S_BYTES(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C ++++++++++
+C
+C CALL S_BYTES(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C THIS ROUTINE TAKES THE FIRST LONGWORD LOCATED AT
+C ISAM AND STORES IT INTO THE NBITS OF NPACK STARTING AT
+C BIT OFFSET IBIT. THEN NSKIP BITS ARE SKIPPED IN
+C NPACK AND THE PROCESS IS REPEATED A TOTAL OF ITER TIMES.
+C
+C
+C THIS ROUTINE DEALS WITH BITS AND BYTES IN THE ORDER
+C THEY ARE NUMBERED ON THE MESA (IE BIGENDIAN).
+C ----------
+ ISW = 4
+ GOTO 8
+C
+C ++++++++++
+ ENTRY GBYTES(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C ++++++++++
+C
+C THIS ROUTINE IS JUST A REPEATED CALL TO G_BYTE
+C WHERE SUCCESSIVE CALLS SKIP NSKIP BITS
+C AND THE LOOP COUNT IS ITER
+ ISW = 5
+ GOTO 8
+C
+C ++++++++++
+ ENTRY SBYTES(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C ++++++++++
+C
+C THIS ROUTINE IS JUST A REPEATED CALL TO S_BYTE
+C WHERE SUCCESSIVE CALLS SKIP NSKIP BITS
+C AND THE LOOP COUNT IS ITER
+ ISW = 6
+ GO TO 8
+C
+C ++++++++++
+ ENTRY GBILS(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C ++++++++++
+C
+C GBIL(S)/SBIL(S) ENTRIES ALLOW DIRECT MAINTENANCE OF LEFT TO RIGHT
+C BIT STRINGS IN DEC ENVIRONMENT (VAX). THE MODIFICATION RETAINS FUL
+C COMPATIBILITY WITH ORIGINAL ENTRIES, HOWEVER, VERIFICATION BEYOND
+C GBIL(S)/SBIL(S) WAS VIA GBITS/SBITS ONLY (NOT GBYTES/SBYTES).
+C
+C MODIFICATION PROGRAMMED BY A.D.STROUD, COMPASS SYSTEMS, INC.
+C NOVEMBER 1987 UNDER TOGA GRAND FUNDING DURING SOFTWARE DEVELOPMENT
+C FOR WMO PROPOSED STANDARD FM 94 BUFR ON THE VAX STATION II AT THE
+C OAG/NOS/NOAA, MONTEREY, CA.
+C
+C FOR GBIL(S)/SBIL(S) THE FOLLOWING PARAMETER USAGE APPLIES
+C
+C NPACK - LEFT MOST(HIGHEST INDEXED) LONGWORD IN PACKED BIT STRING
+C ARRAY SPACE INFERRED BY IBIT(IN LIEU OF LOWEST INDEX FOR
+C NON-DEC, NOTE - SECOND 32 BIT SUBSTRING IN BIT STRING IS
+C NPACK(0), THIRD 32 BIT SUBSTRING IS NPACK(-1), ETC.,...)
+C
+C ISAM - ARRAY HOLDING/TO HOLD UNPACKED ELEMENT(S) (RJZF) FOR
+C SBIL(S)/GBIL(S), RESPECTIVELY.
+C
+C IBIT - INITIAL LEFT TO RIGHT BIT SKIP WITHIN THE NPACK BIT STRI
+C (INCLUDING LEFTMOST BIT OF NPACK, INTERPRET BIT SKIP THE
+C SAME AS IN NON-DEC ENVIRONMENT)
+C
+C NBITS - FIXED BIT WIDTH OF EACH ELEMENT TO BE UNPACKED.
+C
+C NSKIP - FIXED LEFT TO RIGHT BIT SKIP WIDTH BETWEEN ELEMENTS.
+C
+C ITER - NUMBER OF ELEMENTS TO UNPACK(IMPLIED MINIMUM DIMENSIONAL
+C OF ISAM ARRAY).
+C
+C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C EXAMPLE
+C
+C 1) PARAMETER (N4=1000 , NB=4000, NL=1000)
+C 2) INTEGER I4(N4),UNPACK(99)
+C 3) BYTE IB(NB)
+C 4) EQUIVALENCE (I4(1),IB(1))
+C
+C 5) READ(LUI,'(4000A1)') (IB(I),I=NB,1,-1)
+C FORMATTED READ OF ARBITRARY BITSTRING FROM NON-DEC
+C SITE, OR FROM DEC FILE AS WRITTEN AT 9) BELOW.
+C
+C 6) CALL GBILS(I4(NL),UNPK,67,22,47,95)
+C AFTER INITIALLY SKIPPING 67 BITS TO A POINT BEYOND THE
+C LEFTMOST THREE BITS OF I4(NL-2), GBILS ACQUIRES 95
+C SUBSTRING ELEMENTS OF THE WIDTH 22 BITS(EACH RIGHT JUST
+C WITH HIGH ORDER ZERO FILL) INTO THE RESPECTIVE FIRST
+C 95 ARRAY ELEMENTS OF UNPK. SEPARATED BY 47 BITS IN SOUR
+C BITSTRING ARRAY I4, THE EXTRACTED DUPLICATE SUBSTRING
+C ELEMENTS ARE NOW EFFECTIVELY SEPARATED FROM EACH OTHER
+C BY 10 ZERO BITS IN OBJECT BITSTRING ARRAY UNPK.
+C
+C 7) UNPK(J)=... (J=1,95)
+C
+C 8) CALL SBILS(I4(NL),UNPK,67,22,47,95)
+C AFTER INITIALLY SKIPPING 67 BITS TO A POINT BEYOND THE
+C LEFTMOST THREE BITS OF I4(NL-2), SBILS STORES IN SUCCES
+C SIVE BITS THE FIRST OF 95 MODIFIED UNPK RIGHTMOST 22 BI
+C WIDTH SUBSTRING ELEMENTS. AFTER SKIPPING 47 BITS BEYOND
+C THE RIGHTMOST OF THE FIRST 22 BITS STORED, THE SECOND 2
+C BIT ELEMENT IS STORED, ETC. THE ORIGINAL SUBSTRING
+C ELEMENTS HAVE BEEN REPLACED BY MODIFIED SUBSRING ELEMEN
+C IN SITU WITHIN THE BITSTRING ARRAY I4 WITHOUT MODIFYING
+C ANY OTHER BITS.
+C
+C 9) WRITE(LUO,'(4000A1)') (IB(I),I=NB,1,-1)
+C FILE FOR NON-DEC OR FOR READ 5) ABOVE.
+C
+C
+C
+ ISW = 7
+ GO TO 6
+C
+C ++++++++++
+ ENTRY SBILS(NPACK,ISAM,IBIT,NBITS,NSKIP,ITER)
+C ++++++++++
+C
+C
+ ISW = 8
+ GO TO 6
+C
+C ++++++++++
+ ENTRY GBIL(NPACK,ISAM,IBIT,NBITS)
+C ++++++++++
+C
+ ISW = 9
+ GO TO 5
+C
+C ++++++++++
+ ENTRY SBIL(NPACK,ISAM,IBIT,NBITS)
+C ++++++++++
+C
+ ISW=10
+ 5 ITER1= 1
+ NSKIP1=-NBITS
+ GO TO 7
+C
+ 6 NSKIP1=-NSKIP-NBITS
+C
+ 7 JOFF=-IBIT-NBITS
+ IF(ISW.LT.9) GO TO 9
+ GO TO 10
+C
+ 8 NSKIP1=NSKIP+NBITS
+ JOFF=IBIT
+C
+ 9 ITER1=ITER
+C
+C
+ 10 DO 30 I = 1 , ITER1
+C
+ IF(JOFF.GT.0) IBASE=JOFF/LENWRD+1
+ IF(JOFF.LE.0) IBASE=(JOFF+1)/LENWRD+1
+ IOFF=MOD(JOFF,LENWRD)
+ IF(JOFF.LE.0) IOFF=MOD(IOFF+LENWRD,LENWRD)
+C
+ GO TO(11,12,13,14,15,16,11,12,11,12) ISW
+C
+11 CALL GBIT(NPACK(IBASE),ISAM(I),IOFF,NBITS)
+ GO TO 20
+12 CALL SBIT(NPACK(IBASE),ISAM(I),IOFF,NBITS)
+ GO TO 20
+13 CALL G_BYTe(NPACK(IBASE),ISAM(I),IOFF,NBITS)
+ GO TO 20
+14 CALL S_BYTE(NPACK(IBASE),ISAM(I),IOFF,NBITS)
+ GO TO 20
+15 CALL GBYTE(NPACK(IBASE),ISAM(I),IOFF,NBITS)
+ GOTO 20
+16 CALL SBYTE(NPACK(IBASE),ISAM(I),IOFF,NBITS)
+ GOTO 20
+20 JOFF = JOFF + NSKIP1
+30 CONTINUE
+ RETURN
+ END
+ SUBROUTINE GBYTE(NPACK,ISAM,IBIT,NBITS)
+C
+C**** GBYTE - VAX routine.
+C
+C ++++++++++
+C CALL GBYTE(NPACK,ISAM,IBIT,NBITS)
+C STARTS UNPACKING BITS AT BIT OFFSET IBIT IN ARRAY
+C NPACK. IT TAKES NBITS AND STORES THEM IN THE LONGWORD
+C ARRAY STARTING AT ISAM.
+C
+C THIS ROUTINE DEALS WITH BITS AND BYTES IN THE ORDER
+C THEY ARE NUMBERED ON THE MESA (IE BIGENDIAN).
+C ----------
+C
+C GBYTE AND SBYTE ARE SPECIAL ROUTINES TO DO THE SAME
+C THINGS AS THEIR COUNTERPARTS ON THE MESA.
+C THEY DIFFER FROM THE BITS ROUTINES IN THAT BITS
+C ARE COUNTED FROM THE TOP OF THE WORD RATHER THAN
+C THE BOTTOM. THIS MEANS THAT THE BITS THEY SPECIFY JUMP AROUND
+C WHEN CROSSING BYTE BOUNDARIES. THERE IS NO ASSUMPTION
+C MADE ABOUT THE WORDSIZE OF THE MACHINE THEY WERE WRITTEN
+C ON. HOWEVER THE MAXIMUM NUMBER OF BITS EXTRACTED MUST BE
+C LESS THAN OR EQUAL TO 32.
+C
+ BYTE NPACK(8)
+ INTEGER T
+ EXTERNAL SS$_ABORT
+ IDBIT(I) = 7 - MOD(I,8)
+ ISW = 3
+ ISAM = 0
+ GO TO 10
+ ENTRY SBYTE(NPACK,ISAM,IBIT,NBITS)
+C ++++++++++
+C CALL SBYTE(NPACK,ISAM,IBIT,NBITS)
+C THIS ROUTINE TAKES THE FIRST LONGWORD LOCATED AT
+C ISAM AND STORES IT INTO THE NBITS OF NPACK STARTING AT
+C BIT OFFSET IBIT.
+C
+C
+C THIS ROUTINE DEALS WITH BITS AND BYTES IN THE ORDER
+C THEY ARE NUMBERED ON THE MESA (IE BIGENDIAN).
+C ----------
+ ISW = 4
+10 IBASE = IBIT/8
+C IBASE POINTS TO THE FIRST BYTE INVOLVED
+ IOFF = IBIT - 8*IBASE
+C IOFF IS THE BIT OFFSET WITHIN FIRST BYTE
+ M = (IOFF+NBITS-1)/8 + 1
+C M IS THE NUMBER OF BYTES (INCLUDING PARTIALS) INVOLVED
+C IF(M.GT.5)THEN
+ IF(NBITS.GT.32)THEN
+ TYPE *,'ILLEGAL VALUE FOR NBITS IN S/GBYTE(S) CALL'
+ CALL SYS$EXIT(SS$_ABORT)
+ END IF
+ NN = 0
+C NN IS THE NUMBER OF BITS TRANSFERRED
+ DO 20 I = M , 1 , -1
+C LOOP ON BYTES
+ IS = IDBIT(0)
+C CALC FIRST BIT WITHIN BYTE
+ IE = IDBIT(7)
+C CALC LAST BIT WITHIN BYTE
+ IF(I.EQ.1)IS = IDBIT(IOFF)
+C FIRST BIT VARIES FOR FIRST BYTE
+ IF(I.EQ.M)IE = IDBIT(IOFF+NBITS-1)
+C LAST BIT VARIES FOR LAST BYTE
+ N = IS - IE + 1
+C CALC NUMBER OF BITS WITHIN BYTE TO XFER
+ IF(ISW.EQ.4)GO TO 12
+ CALL GBIT(NPACK(IBASE+I),T,IE,N)
+C EXTRACT BITS FROM SOURCE
+ CALL SBIT(ISAM,T,NN,N)
+C AND LOAD INTO DESTINATION
+ GO TO 15
+12 CALL GBIT(ISAM,T,NN,N)
+C EXTRACT BITS FROM SOURCE
+ CALL SBIT(NPACK(IBASE+I),T,IE,N)
+C AND LOAD INTO DESTINATION
+15 NN = NN + N
+C UPDATE BITS XFERRED
+20 CONTINUE
+ RETURN
+ END
+ SUBROUTINE G_BYTE(NPACK,ISAM,IBIT,NBITS)
+C
+C**** G_BYTE - VAX routine.
+C
+C G_BYTE AND S_BYTE ARE SPECIAL ROUTINES TO DO THE SAME
+C THINGS AS THEIR COUNTERPARTS ON THE MESA.
+C THEY DIFFER FROM THE BITS ROUTINES IN THAT BITS
+C ARE COUNTED FROM THE TOP OF THE WORD RATHER THAN
+C THE BOTTOM. THIS MEANS THAT THE BITS THEY SPECIFY JUMP AROUND
+C WHEN CROSSING BYTE BOUNDARIES. THERE IS NO ASSUMPTION
+C MADE ABOUT THE WORDSIZE OF THE MACHINE THEY WERE WRITTEN
+C ON. HOWEVER THE MAXIMUM NUMBER OF BITS EXTRACTED MUST BE
+C LESS THAN OR EQUAL TO 32.
+C
+ BYTE NPACK(8)
+ INTEGER T
+ EXTERNAL SS$_ABORT
+ IDBIT(I) = 7 - MOD(I,8)
+ ISW = 3
+ ISAM = 0
+ GO TO 10
+ ENTRY S_BYTE(NPACK,ISAM,IBIT,NBITS)
+ ISW = 4
+10 IBASE = IBIT/8
+C IBASE POINTS TO THE FIRST BYTE INVOLVED
+ IOFF = IBIT - 8*IBASE
+C IOFF IS THE BIT OFFSET WITHIN FIRST BYTE
+ M = (IOFF+NBITS-1)/8 + 1
+C M IS THE NUMBER OF BYTES (INCLUDING PARTIALS) INVOLVED
+C IF(M.GT.5)THEN
+ IF(NBITS.GT.32)THEN
+ TYPE *,'ILLEGAL VALUE FOR NBITS IN S/G_BYTE(S) CALL'
+ CALL SYS$EXIT(SS$_ABORT)
+ END IF
+ NN = 0
+C NN IS THE NUMBER OF BITS TRANSFERRED
+ DO 20 I = M , 1 , -1
+C LOOP ON BYTES
+ IBB = IBASE + I - 1
+ IBC = IBB/4
+ IBD = 4*IBC+3-MOD(IBB,4) + 1
+C CALCULATE UNSHIFTED BYTE
+ IS = IDBIT(0)
+C CALC FIRST BIT WITHIN BYTE
+ IE = IDBIT(7)
+C CALC LAST BIT WITHIN BYTE
+ IF(I.EQ.1)IS = IDBIT(IOFF)
+C FIRST BIT VARIES FOR FIRST BYTE
+ IF(I.EQ.M)IE = IDBIT(IOFF+NBITS-1)
+C LAST BIT VARIES FOR LAST BYTE
+ N = IS - IE + 1
+C CALC NUMBER OF BITS WITHIN BYTE TO XFER
+ IF(ISW.EQ.4)GO TO 12
+C CALL GBIT(NPACK(IBASE+I),T,IE,N)
+ CALL GBIT(NPACK(IBD),T,IE,N)
+C EXTRACT BITS FROM SOURCE
+ CALL SBIT(ISAM,T,NN,N)
+C AND LOAD INTO DESTINATION
+ GO TO 15
+12 CALL GBIT(ISAM,T,NN,N)
+C EXTRACT BITS FROM SOURCE
+C CALL SBIT(NPACK(IBASE+I),T,IE,N)
+ CALL SBIT(NPACK(IBD),T,IE,N)
+C AND LOAD INTO DESTINATION
+15 NN = NN + N
+C UPDATE BITS XFERRED
+20 CONTINUE
+ RETURN
+ END
+ .TITLE SGBIT
+; ++++++++++
+; CALL GBIT(NPACK,ISAM,IBIT,NBITS)
+; UNPACKS THE BIT PATTERN LOCATED AT A BIT OFFSET
+; OF IBIT IN NPACK OF LENGTH NBITS INTO ISAM.
+;
+; THIS ROUTINE EXTRACTS BITS FROM VAX WORDS.
+; IT IS SIMILAR TO NCAR'S GBYTE BUT IT WORKS WITH
+; THE NATURAL UNDERLYING STRUCTURE OF THE VAX.
+; ----------
+ .PSECT MACRO_CODE PIC,USR,CON,REL,LCL,SHR,EXE,RD,NOWRT,NOVEC
+ .ENTRY GBIT,0
+ EXTZV @12(AP), at 16(AP), at 4(AP), at 8(AP) ;ISN'T THIS NEAT ?
+ RET
+;
+;
+; ++++++++++
+; CALL SBIT(NPACK,ISAM,IBIT,NBITS)
+; PACKS THE VALUE IN ISAM INTO NPACK
+; WITH NBITS OFFSET BY IBIT.
+;
+; THIS ROUTINE EXTRACTS BITS FROM VAX WORDS.
+; IT IS SIMILAR TO NCAR'S SBYTE BUT IT WORKS WITH
+; THE NATURAL UNDERLYING STRUCTURE OF THE VAX.
+; ----------
+ .ENTRY SBIT,0
+ INSV @8(AP), at 12(AP), at 16(AP), at 4(AP) ;ISN'T THIS NEAT ?
+ RET
+ .END
diff --git a/gribex/bufrin.F b/gribex/bufrin.F
new file mode 100755
index 0000000..0aea204
--- /dev/null
+++ b/gribex/bufrin.F
@@ -0,0 +1,40 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ subroutine bufrin(kunit,karray,kinlen,koutlen,keof,kret)
+C---->
+C
+C This subroutine mimics the behaviour of the original BUFRIN
+C but makes a call to PBBUFR to retrieve BUFR products.
+C
+C----<
+ integer icalls
+ data icalls/0/
+C
+C First time through, print a warning message
+ if (icalls .eq. 0) then
+ icalls = icalls + 1
+ write(*,*) ' *********************************************'
+ write(*,*) ' *********************************************'
+ write(*,*) ' You are using an obsolete subroutine (BUFRIN)'
+ write(*,*) ' for retrieving BUFR products.'
+ write(*,*) ' Please change to using PBBUFR.'
+ write(*,*) ' *********************************************'
+ write(*,*) ' *********************************************'
+ endif
+C
+ call pbbufr(kunit,karray,kinlen,koutlen,kret)
+ if ( kret .eq. -3) then
+ write(*,*) ' Buffer not big enough for BUFR product'
+ kret = -5
+ endif
+C
+ return
+ end
diff --git a/gribex/c2bitw.F b/gribex/c2bitw.F
new file mode 100755
index 0000000..8440c91
--- /dev/null
+++ b/gribex/c2bitw.F
@@ -0,0 +1,126 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION C2BITW ( KVALUE, KXBITS, KPOWER, KMXPWR )
+C
+C---->
+C**** C2BITW
+C
+C Purpose.
+C --------
+C
+C Compute BIT Width necessary to encode a positive integer value.
+C
+C** Interface.
+C ----------
+C
+C IWIDTH = C2BITW ( KVALUE, KXBITS, KPOWER, KMXPWR )
+C
+C Function return value is the requested bit width.
+C
+C Input Parameters.
+C -----------------
+C
+C KVALUE - Positive integer value.
+C KXBITS - MaXimum number of BITS estimated.
+C KPOWER - Auxilary array, containing precomputed powers of 2-1.
+C KMXPWR - Maximum number of bits allowed.
+C
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C
+C Method.
+C -------
+C
+C Loop down on possible bit width values.
+C
+C
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C J. Clochard, Meteo France, for ECMWF - February 1998.
+C
+C
+C Modifications.
+C _____________
+C
+C None.
+C
+C----<
+C
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ INTEGER KVALUE, KXBITS, KMXPWR
+ INTEGER KPOWER (0:KMXPWR)
+C
+C Local variables.
+C
+ INTEGER IRETFN, J
+C
+C -----------------------------------------------------------------
+C* Section 1 . Direct computing.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ DO 101 J=MIN (KXBITS,KMXPWR)-1,0,-1
+C
+ IF (KVALUE.GT.KPOWER(J)) THEN
+ IRETFN=J+1
+ GOTO 102
+ ENDIF
+C
+ 101 CONTINUE
+C
+ IRETFN=0
+C
+ 102 CONTINUE
+C
+C -----------------------------------------------------------------
+C* Section 9 . Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ C2BITW = IRETFN
+C
+C
+ RETURN
+C
+ END
diff --git a/gribex/c2cwid.F b/gribex/c2cwid.F
new file mode 100755
index 0000000..a09c29d
--- /dev/null
+++ b/gribex/c2cwid.F
@@ -0,0 +1,629 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION C2CWID ( KDATA, KLENP, KSEC4, KGRIB, KLENG,
+ X KNSPT, KBITS, OCOMGR, OLONLY, KLEN4,
+ X KFIROV, KLEN, KREFGR, KLENGR, KLWORK,
+ X KSTART, KPOWER, KMXPWR, KNBIFO, KNCMIN,
+ X KLWORX, KIWORK, ODEBUG, OPTLEN )
+C
+C---->
+C**** C2CWID
+C
+C Purpose.
+C --------
+C
+C Performs "constant width packing" method for section 4 of GRIB,
+C and/or computes only length of section 4, with/without coding,
+C with this method.
+C
+C
+C** Interface.
+C ----------
+C
+C KRET = C2CWID ( KDATA, KLENP, KSEC4, KGRIB, KLENG, KNSPT,
+C X KBITS, OCOMGR, OLONLY, KLEN4, KFIROV, KLEN,
+C X KREFGR, KLENGR, KLWORK, KSTART, KPOWER, KMXPWR,
+C X KNBIFO, KNCMIN, KLWORX, KIWORK, ODEBUG, OPTLEN )
+C
+C
+C Input Parameters for all options.
+C --------------------------------
+C
+C KDATA - Array of normalized values.
+C KLENP - Length of array KDATA.
+C KSEC4 - Array of GRIB section 4 integer descriptors.
+C KLENG - Length of GRIB product array.
+C KNSPT - Bit pointer for next value in GRIB product.
+C KBITS - Number of bits per computer word.
+C OCOMGR - True if COMputing of GRoup arrays is requested.
+C OLONLY - True if Length ONLY is requested (no coding).
+C KLEN - Exact number of grid-points to handle.
+C KLWORK - First dimension of work arrays.
+C KPOWER - Auxilary array, containing precomputed powers of 2-1.
+C KMXPWR - Maximum number of bits per original scaled value.
+C KNCMIN - Minimum increment to use when determining groups.
+C ODEBUG - True for some debug printout.
+C OPTLEN - OPTimise LENgth of section 4 (if OCOMGR is true).
+C
+C
+C Output Parameters for all options.
+C ---------------------------------
+C
+C KSEC4 - Array of GRIB section 4 integer descriptors:
+C KSEC4(11) when OCOMGR and OPTLEN are true;
+C other indexes when OLONLY is false.
+C KLEN4 - Length of section 4.
+C KLWORX - Maximum work space used.
+C
+C Output Parameters when OLONLY is false.
+C --------------------------------------
+C
+C KGRIB - Array containing GRIB product.
+C KNSPT - Bit pointer for next value in GRIB product (updated).
+C
+C Output Parameters when OCOMGR is true,
+C Input Parameters when OCOMGR is false.
+C --------------------------------------
+C
+C KFIROV - Number of FIrst-Order Values (and groups) determined.
+C KREFGR - Work array, first-order values for each group.
+C KLENGR - Work array, effective length of each group.
+C KNBIFO - Number of BIts for coding First-Order values.
+C KIWORK - Second index into work arrays corresponding to
+C optimal or computed case.
+C
+C Output Parameters when OCOMGR is true,
+C Input parameter in all cases.
+C --------------------------------------
+C
+C KDATA - Used as work array by C2PACK.
+C
+C Input Parameter when OCOMGR is false.
+C -------------------------------------
+C
+C KSTART - First index value of precomputed work arrays KREFGR
+C and KLENGR.
+C
+C Method.
+C -------
+C
+C Follows WMO Manual of Codes.
+C
+C If requested through OCOMGR, a first scan computes work arrays,
+C bit number for coding first-order values and length of section 4.
+C
+C If requested, coding is applied in a second scan, using
+C descriptors computed in the first scan, possibly in a previous
+C call.
+C
+C When OPTLEN is true, an iterative process is performed in the
+C first scan, to choose an optimal width leading to minimum length
+C of message (through its section 4).
+C
+C Externals.
+C ----------
+C
+C C2BITW - Computes bit width of a positive integer value.
+C C2PACK - Encodes descriptors and data.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C On entry, KNSPT points to the first bit of section 4
+C in the GRIB product.
+C On exit, KNSPT points to the first unused bit of section 4,
+C (or to the first bit of section 5, if unused bit count
+C is zero) in the GRIB product.
+C
+C KDATA is overwritten when coding is requested.
+C This is coherent with GRIBEX.
+C
+C
+C Author.
+C -------
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C
+C
+C Modifications.
+C _____________
+C
+C J. Clochard, April 1998.
+C Use C2BITW function for bit width computations, out of
+C the splitting algorithm itself.
+C When optimisation is required, use -KSEC4(11) as initial and
+C maximum width for iterative search of optimal width.
+C
+C J. Clochard, September 1998.
+C Suppress KSEC1/KSEC2/KSEC3 dummy-arguments.
+C " KSEC1, add KWORK/KPOWER/KMXPWR argument in C2PACK call.
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Subroutine arguments
+C
+ INTEGER KLENP, KLENG, KNSPT, KBITS, KLEN4, KNCMIN, KLWORX, KIWORK
+ INTEGER KLEN, KLWORK, KMXPWR, KNBIFO, KFIROV, KSTART
+ INTEGER KDATA (KLENP), KSEC4 (*), KGRIB (KLENG), KREFGR (KLWORK,2)
+ INTEGER KPOWER (0:KMXPWR), KLENGR (KLWORK,2)
+C
+ LOGICAL OLONLY, OCOMGR, ODEBUG, OPTLEN
+C
+C Local variables.
+C
+ INTEGER INBITN, ICOUNT, INBITX, INBIFO, ILDSTA
+ INTEGER IGROUP, INCR, ISIZEG, INBIT, INCMIR, IPOWER, ICWORK
+ INTEGER J, IDMAX, IDMIN, ISOMAX, ICRITR, ICRITO, INCRBI
+ INTEGER IRETFN, IBITGW, IFOMAX, INCMIN, INBITO, IDMAXG, IDMING
+ INTEGER INBIFX, INBICW, IOFF, IFIROV, ISTART, ILWORK
+C
+ INTEGER C2PACK, C2BITW
+ EXTERNAL C2PACK, C2BITW
+C
+ INTRINSIC ABS
+C
+C -----------------------------------------------------------------
+C* Section 1 . Performs initial checks.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9100) OCOMGR, OPTLEN, OLONLY, KNSPT
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ IRETFN = 0
+ ICOUNT=0
+ ILDSTA=21
+ IBITGW=8
+ INBITO=KSEC4(2)
+ KLWORX=0
+C
+ IF (.NOT.OCOMGR) THEN
+C
+ IF (OLONLY) THEN
+ IRETFN = 21110
+ WRITE(GRPRSM,FMT=9110)
+ GOTO 900
+ ELSE
+ INBIFO=KNBIFO
+ INBICW=KSEC4(11)
+ IFIROV=KFIROV
+ KLWORX=KFIROV
+ ISTART=KSTART
+ GOTO 300
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 2 . Computing of references and lengths of groups.
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IFIROV=(KLWORK+1)
+ INBIFO=INBITO
+ INBICW=INBITO
+ INCMIN=MIN (MAX (KNCMIN,1),1+KLEN/2)
+ ISIZEG=1 + INT ( SQRT ( REAL (KLEN-1) ) /5. )
+ ISIZEG=MAX (ISIZEG,INCMIN)
+ ICWORK=1
+ ISTART=1
+C
+C Initial value for criterion to minimize in iterative process.
+C Over-estimated (expressed in bits instead of octets).
+C
+ ICRITO=8+IFIROV*(INBIFO+1)-1+8+(KLEN+1)*(INBICW+1)-1
+C
+ IF (OPTLEN) THEN
+C
+C In this case, no predetermined number of bits is assigned.
+C An iterative process will compute a number of bits leading to
+C a (relative) minimum length of coded message.
+C
+ INBITX=ABS (KSEC4(11))
+ INBITN=0
+ INBIT=MAX (INBITX-1,INBITN)
+ INCRBI=-MIN ( 3 , MAX (1,(INBIT-INBITN)/3) )
+ ELSE
+C
+C Width (number of bits for second-order values) is KSEC4(11).
+C
+ INBITX=KSEC4(11)
+ INBITN=KSEC4(11)
+ INBIT=KSEC4(11)
+ INCRBI=-1
+ ENDIF
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9200) INBITO, (KSEC4(J),J=1,13),
+ X INCMIN, ISIZEG
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+C -----------------------------------------------------------------
+C Start of iterative process.
+C -----------------------------------------------------------------
+C
+ 210 CONTINUE
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9210) INBITX, INBITN, INBIT, INCRBI
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ ICOUNT=0
+ IGROUP=0
+ IFOMAX=0
+ IPOWER=KPOWER(INBIT)
+C
+C -----------------------------------------------------------------
+C Determination of an initial group.
+C -----------------------------------------------------------------
+C
+ 220 CONTINUE
+C
+ ISIZEG=MIN (ISIZEG,KLEN-ICOUNT)
+C
+C Extrema computed in-line for better efficiency.
+C
+ IDMAX=KDATA(ICOUNT+1)
+ IDMIN=KDATA(ICOUNT+1)
+C
+ DO 221 J=2,ISIZEG
+ IDMAX=MAX (IDMAX,KDATA(ICOUNT+J))
+ IDMIN=MIN (IDMIN,KDATA(ICOUNT+J))
+ 221 CONTINUE
+C
+ ISOMAX=IDMAX-IDMIN
+C PRINT *,'c2cwid - ICOUNT=',ICOUNT,', ISIZEG=',ISIZEG,
+C S ', IDMIN=',IDMIN,', IDMAX=',IDMAX,', ISOMAX=',ISOMAX
+C
+ IF (ISOMAX.GT.IPOWER) THEN
+C
+C Initial segment does not fit within INBIT bits, reduce and retry.
+C
+ ISIZEG=ISIZEG/2
+ GOTO 220
+ ELSEIF (ISIZEG.LT.INCMIN.AND.IGROUP.NE.0) THEN
+C
+C Initial group size very small. Try to join previous group...
+C
+ IDMAXG=MAX (IDMAX,IDMAXG)
+ IDMING=MIN (IDMIN,IDMING)
+ ISOMAX=IDMAXG-IDMING
+C
+ IF (ISOMAX.LE.IPOWER) THEN
+C
+C ... succesfully.
+C
+ KLENGR(IGROUP,ICWORK)=KLENGR(IGROUP,ICWORK)+ISIZEG
+ ICOUNT=ICOUNT+ISIZEG
+ GOTO 241
+ ENDIF
+C
+ ENDIF
+C
+ IDMAXG=IDMAX
+ IDMING=IDMIN
+ IOFF=ICOUNT+ISIZEG
+ INCR=MIN (ISIZEG,KLEN-IOFF)
+C
+ IF (INCR.EQ.0) THEN
+ GOTO 240
+ ENDIF
+C
+C -----------------------------------------------------------------
+C Try to add increments to initial group.
+C -----------------------------------------------------------------
+C
+ 230 CONTINUE
+C
+ IDMAX=IDMAXG
+ IDMIN=IDMING
+C
+#ifdef FUJITSU
+!OCL SCALAR
+#endif
+ DO 231 J=1,INCR
+ IDMAX=MAX (IDMAX,KDATA(IOFF+J))
+ IDMIN=MIN (IDMIN,KDATA(IOFF+J))
+ 231 CONTINUE
+#ifdef FUJITSU
+!OCL VECTOR
+#endif
+C
+ ISOMAX=IDMAX-IDMIN
+C PRINT *,'c2cwid - IOFF=',IOFF,', ISIZEG=',ISIZEG,
+C S ', INCR=',INCR,', ISOMAX=',ISOMAX,', IGROUP+1=',IGROUP+1
+C
+C If end of data very near, relax constraint on minimum increment.
+C
+ INCMIR=MAX ( 1, MIN (KLEN-IOFF,INCMIN) )
+C
+ IF (ISOMAX.LE.IPOWER) THEN
+C
+C Incremental group added to current group.
+C
+ IDMAXG=IDMAX
+ IDMING=IDMIN
+ IOFF=IOFF+INCR
+ INCR=MIN (ISIZEG,KLEN-IOFF)
+C
+ IF (INCR.NE.0) THEN
+ GOTO 230
+ ENDIF
+C
+ ELSEIF (INCR.GT.INCMIR) THEN
+C
+C Incremental group does not fit, try a smaller one.
+C
+ INCR=MAX (INCR/2,INCMIR)
+ GOTO 230
+ ENDIF
+C
+C -----------------------------------------------------------------
+C No incremental group may be added. Current group is closed.
+C -----------------------------------------------------------------
+C
+ 240 CONTINUE
+C
+ IGROUP=IGROUP+1
+ KLENGR(IGROUP,ICWORK)=IOFF-ICOUNT
+ ICOUNT=IOFF
+ ISOMAX=IDMAXG-IDMING
+C
+C Maximum use of width for second-order values: the maximum value
+C of group will be encoded with the biggest value fitting in
+C INBIT bits, and keeping reference value positive or zero.
+C
+C The goal is to get the lowest reference value, thus trying
+C (desperately) to save bit(s) to encode the first-order values.
+C
+ 241 CONTINUE
+C
+ KREFGR(IGROUP,ICWORK)=MAX (0,IDMING-(IPOWER-ISOMAX))
+ IFOMAX=MAX (IFOMAX,KREFGR(IGROUP,ICWORK))
+#ifdef ebug2o
+C
+ IF (.NOT.OLONLY) THEN
+ PRINT *,'c2cwid - group',IGROUP,KLENGR(IGROUP,ICWORK),INBIT
+ X ,' (...)',IDMING,ISOMAX,KREFGR(IGROUP,ICWORK),ICOUNT
+ ENDIF
+#endif
+C
+ IF (ICOUNT.EQ.KLEN) THEN
+ GOTO 250
+ ELSEIF (IGROUP.LT.KLWORK) THEN
+ ISIZEG=MAX (INCMIN,ISIZEG,KLENGR(IGROUP,ICWORK)/2)
+ GOTO 220
+ ELSE
+C
+C Out of work space. A message is issued, except in iterative
+C process, if the estimated length is already bigger than
+C previously computed.
+C
+ KLWORX=MAX (KLWORX,IGROUP)
+ ICRITR=(8+(IGROUP+1)*INBIFO-1)/8+(8+KLEN*INBIT-1)/8
+C
+ IF (ICRITR.LT.ICRITO) THEN
+ WRITE(GRPRSM,FMT=9240) KLWORK, INBIT
+ ENDIF
+C
+ IF (INBIT.LT.INBITX.AND.INBIT.GT.INBITN) THEN
+C
+C Other bit value(s) may still be tried.
+C
+ ICRITR=ICRITO+1
+ GOTO 260
+ ELSEIF (INBICW.NE.INBITO) THEN
+C
+C A constant width has been successfully computed before.
+C It will be used as the best computable result.
+C
+ GOTO 270
+ ELSE
+ IRETFN = 21240
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+ 250 CONTINUE
+C
+ KLWORX=MAX (KLWORX,IGROUP)
+C
+C Number of bits necessary to code first-order values.
+C
+ INBIFX = C2BITW ( IFOMAX, INBITO, KPOWER, KMXPWR )
+C
+ ICRITR=(8+IGROUP*INBIFX-1)/8+(8+KLEN*INBIT-1)/8
+C
+ 260 CONTINUE
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9260) INBIT, INBIFX, IGROUP, ICRITR
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ IF (ICRITR.LT.ICRITO) THEN
+C
+C INBIT may be retained, at least temporarily, for constant width.
+C
+ INBICW=INBIT
+ IFIROV=IGROUP
+ INBIFO=INBIFX
+ KIWORK=ICWORK
+ ICWORK=1+MOD (ICWORK,2)
+ ICRITO=ICRITR
+C
+ IF (INBIT.GT.INBITN) THEN
+C
+C Decrease INBIT for next trial.
+C
+ IF (INCRBI.LT.0) THEN
+ INCRBI=MAX ( INCRBI , MIN (-1,(INBITN-INBIT)/3) )
+ ELSE
+ INCRBI=MAX ( MIN (-1,1-INCRBI) , INBITN-INBIT )
+ ENDIF
+C
+ INBITX=INBIT-1
+ INBIT=INBIT+INCRBI
+ GOTO 210
+ ENDIF
+C
+ ENDIF
+C
+ IF (INBIT.LT.INBITX) THEN
+C
+C INBIT not suitable, increase it and retry.
+C
+ INBITN=INBIT+1
+ INCRBI=MIN ( MAX (ABS(1-INCRBI),1) , INBITX-INBIT )
+ INBIT=INBIT+INCRBI
+ GOTO 210
+C
+ ENDIF
+C
+C Work done, and/or no better length than previously.
+C
+ 270 CONTINUE
+C
+C Compute full length of section 4 of GRIB.
+C
+ KLEN4=ILDSTA + 1 + (8+KLEN-1)/8 + ICRITO
+ KLEN4=2*((2+KLEN4-1)/2)
+ KNBIFO=INBIFO
+ KFIROV=IFIROV
+C
+ IF (OPTLEN) THEN
+ KSEC4(11)=INBICW
+ ENDIF
+C
+ IF (OLONLY) THEN
+C
+C Length has been computed, go back without any coding.
+C
+ GOTO 900
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 3. Definition of fixed-length descriptors and coding.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C The first 10 octets have already been coded in GRIBEX, or will
+C be in a further step of GRIBEX:
+C Length of section, flags+unused bit count, binary scale factor,
+C reference value.
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9300)
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+C Enforce right values for extended flags.
+C
+ KSEC4( 9)=32
+ KSEC4(10)=0
+ KSEC4(12)=0
+C
+C Extra descriptors.
+C
+ KSEC4(18)=KFIROV
+ KSEC4(20)=IBITGW
+ ILWORK=KLWORK-ISTART+1
+C
+C KREFGR alone in call corresponds to a formal argument of function
+C C2PACK, which has to be there but is not used for constant width
+C packing.
+C
+ IRETFN = C2PACK ( KDATA, KLENP, KSEC4, KGRIB, KLENG, KNSPT,
+ X KBITS, KLEN, KREFGR(ISTART,KIWORK),
+ X KLENGR(ISTART,KIWORK), KREFGR,
+ X KREFGR, ILWORK, KPOWER, KMXPWR, KNBIFO, ODEBUG )
+C
+C -----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ C2CWID = IRETFN
+#ifndef ebug2o
+C
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9900) IRETFN, OCOMGR, OPTLEN, OLONLY, KNSPT
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ RETURN
+C
+ 9100 FORMAT (' C2CWID: Function start, OCOMGR = ',L1,
+ X ', OPTLEN = ',L1,', OLONLY = ',L1,', KNSPT =',I10,'.')
+C
+ 9110 FORMAT (' C2CWID: Routine called, but has nothing to do.')
+C
+ 9200 FORMAT (' C2CWID: Computing work arrays, INBITO =',I3,'.',/,
+ X ' C2CWID: KSEC4(1:13)=',I9,I3,I4,3I3,I2,4I3,2I2,'.',/,
+ X ' C2CWID: INCMIN =',I3,', ISIZEG =',I6,'.')
+C
+ 9210 FORMAT (' C2CWID: INBITX =',I3,', INBITN =',I3,', INBIT =',I3,
+ X ', INCRBI =',I3,'.')
+C
+ 9240 FORMAT (' C2CWID: Groups number exceeds work space (',I8,
+ X '), giving up for INBIT =',I3,'.')
+C
+ 9260 FORMAT (' C2CWID: INBIT =',I3,', INBIFX =',I3,', IGROUP =',I8,
+ X ', ICRITR =',I9,'.')
+C
+ 9300 FORMAT (' C2CWID: Coding phase - calling C2PACK.')
+C
+ 9900 FORMAT (' C2CWID: Function return code=',I6,
+ X ', OCOMGR/OPTLEN/OLONLY/KNSPT=',3L1,I10,'.')
+C
+ END
diff --git a/gribex/c2dosd.F b/gribex/c2dosd.F
new file mode 100755
index 0000000..2177a56
--- /dev/null
+++ b/gribex/c2dosd.F
@@ -0,0 +1,666 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION C2DOSD ( KDATA, KLENP, KSEC4, OCOMSD, KLEN,
+ X KWORK, KLWORK, KPOWER, KMXPWR, KPCWID,
+ X KXCWID, KMINPK, KLWORX, KBIAS, KWIDSD,
+ X KWIDOR, OCBIAS, ODEBUG )
+C
+C---->
+C**** C2DOSD
+C
+C Purpose.
+C --------
+C
+C Depending on actual arguments, Diagnose Order of Spatial
+C Differences, and/or when requested and order is not null,
+C computes spatial differences for GRIB second-order extended
+C packing.
+C
+C** Interface.
+C ----------
+C
+C IORDER = C2DOSD ( KDATA, KLENP, KSEC4, OCOMSD, KLEN, KWORK,
+C X KLWORK, KPOWER, KMXPWR, KPCWID, KXCWID, KMINPK,
+C X KLWORX, KBIAS, KWIDSD, KWIDOR, OCBIAS, ODEBUG )
+C
+C Function result value is the order of spatial differencing
+C (diagnosed or imposed).
+C
+C Input Parameters.
+C -----------------
+C
+C KDATA - Array of normalized values.
+C KLENP - Length of array KDATA.
+C KSEC4 - Array of GRIB section 4 integer descriptors.
+C OCOMSD - True for COMputing Spatial Differences.
+C KLEN - Exact number of grid-points to handle.
+C KLWORK - Length of work array KWORK.
+C KPOWER - Auxilary array, precomputed (powers of 2)-1.
+C KMXPWR - Maximum number of bits allowed.
+C KPCWID - Auxilary array, precomputed widths.
+C KXCWID - Maximum width associated to KPCWID.
+C KMINPK - Initial (minimum) length of groups.
+C KBIAS - BIAS of spatial differences (if OCBIAS is .FALSE.).
+C OCBIAS - True for Computation of BIAS.
+C ODEBUG - True for some debug printout.
+C
+C
+C Output Parameters (effective only if function value is non zero).
+C ------------------
+C
+C KDATA - Array of normalized values (transformed).
+C KWORK - Work array.
+C KLWORX - Upper index used within KWORK array.
+C KBIAS - BIAS of spatial differences.
+C KWIDSD - WIDth of Spatial Differencing specific descriptors.
+C KWIDOR - WIDth of field, after possible transformation.
+C
+C
+C Method.
+C -------
+C
+C If requested (KSEC4(14) or KSEC4(15) equal to -1), first
+C compute "best" order of spatial differencing (up to 3) to be
+C applied to KDATA. Estimation is made through comparison of
+C average ranges of original field and of spatial differencing,
+C starting from order 1.
+C
+C If requested through OCOMSD and when order is non zero, computes
+C spatial differences on KDATA (keeping the first IORDER values
+C from original field, for encoding).
+C
+C
+C Externals.
+C ----------
+C
+C MAXMNI - Computes extrema of integer array.
+C C2RNGE - Computes range diagnostics.
+C C2BITW - Computes bit width of a positive integer value.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C Best order is considered reached when average range is found
+C greater than previously diagnosed. This feature is derived from
+C practice, and reduces CPU costs.
+C
+C Work array use when diagnostic is requested:
+C
+C -if OCOMSD is true and if KLWORK is greater than (or equal to)
+C (2*KLEN-3), there is no recomputation from KDATA itself;
+C
+C -if KLWORK is greater than (or equal to) (KLEN-1), then KWORK
+C is used recursively;
+C
+C -otherwise, KDATA has to be used in slices and computation is
+C more expensive.
+C
+C
+C Author.
+C -------
+C
+C J. Clochard, Meteo France, for ECMWF - April 1998.
+C
+C
+C Modifications.
+C _____________
+C
+C J. Clochard, June 1999.
+C Use precomputed array to determine widths . Dummy-arguments
+C KPCWID and KXCWID added . Assumption is made that KXCWID
+C is at least (KMXPWR+1)/2 . KPCWID/KXCWID added in C2RNGE calls .
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JPORDR
+C
+C Maximum order of spatial differencing allowed.
+C
+ PARAMETER ( JPORDR=3 )
+C
+C Subroutine arguments
+C
+ INTEGER KLENP, KLWORX, KLEN, KLWORK, KMXPWR, KMINPK, KBIAS, KWIDOR
+ INTEGER KWIDSD, KXCWID
+ INTEGER KDATA (KLENP), KSEC4 (*), KPOWER (0:KMXPWR), KPCWID (0:*)
+ INTEGER KWORK (KLWORK)
+C
+ LOGICAL OCOMSD, ODEBUG, OCBIAS
+C
+C Local variables.
+C
+ INTEGER IBASE, IOFFWK, IREFER, J, INPACK, IMIN, IMAX, IXORDR
+ INTEGER INBIFO, ILEN, IMAXAB, IWIDAB, IDIAGN, IOFFWP, ILWORX
+ INTEGER JORDER, IORDER, IAUX1, IAUX2, IAUX3, IRANGE, IBITGW
+ INTEGER INPACW, INBSEQ, JSEQ, ILWORK, IAUXIL, INPACS, IXBITS
+C
+ INTEGER IDIAGO ( 0:JPORDR ), IMINAB (JPORDR), INBIAB (JPORDR)
+C
+ INTEGER C2BITW, C2RNGE
+ EXTERNAL C2BITW, C2RNGE
+C
+ INTRINSIC ABS
+C
+ LOGICAL L1PASS, LCBIAS, LIBIAS
+C
+C -----------------------------------------------------------------
+C* Section 1 . Performs initial checks.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9100) OCOMSD, OCBIAS
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ IXORDR=MIN (JPORDR,KLEN)
+ IXBITS=KSEC4(2)
+ ILWORX=0
+ IBASE=0
+ L1PASS=OCOMSD.AND.KLWORK.GE.(KLEN-1)
+ LIBIAS=.FALSE.
+C
+ IF (KSEC4(14).NE.-1.AND.KSEC4(15).NE.-1) THEN
+C
+C Order of spatial differencing explicitly specified.
+C
+ IORDER=MIN ( IXORDR, KSEC4(14)+KSEC4(15) )
+ LCBIAS=OCBIAS
+ L1PASS=.FALSE.
+ GOTO 400
+C
+ ELSEIF (OCOMSD.AND.KLWORK.GE.2*KLEN-3) THEN
+C
+ IBASE=KLEN-1
+C
+ ENDIF
+C
+ LCBIAS=.FALSE.
+C
+C -----------------------------------------------------------------
+C* Section 2 . Computes average range of original normalized values.
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ INPACK=KLEN/KMINPK
+ IDIAGN=0
+ IWIDAB=0
+ IREFER=0
+C
+ IOFFWK = C2RNGE ( INPACK, KMINPK, KSEC4(2), KDATA, IDIAGN,
+ X IWIDAB, IREFER, KPOWER, KMXPWR, KPCWID,
+ X KXCWID )
+C
+ INBIFO = C2BITW ( IREFER, KSEC4(2), KPOWER, KMXPWR )
+C
+ IBITGW = C2BITW ( IWIDAB, KSEC4(2), KPOWER, KMXPWR )
+C
+C IDIAGN=(IDIAGN+7)/8
+ IDIAGN=(IDIAGN+7)/8+(INPACK*IBITGW+7)/8+(INPACK*INBIFO+7)/8
+C IDIAGN=(IDIAGN+7)/8+(INPACK*IBITGW+7)/8
+ IDIAGO(0)=IDIAGN
+ IORDER=0
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ PRINT *, 'IDIAGO(0) = ', IDIAGN, INPACK, IBITGW, INBIFO
+C
+ WRITE(GRPRSM,FMT=9211) 'original values', KMINPK, IDIAGO(0)
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+C
+C -----------------------------------------------------------------
+C* Section 3 . Computes average range of spatial differences.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IOFFWP=0
+ INPACW=KLWORK/KMINPK
+ ILWORK=INPACW*KMINPK
+C
+C Loop on order of spatial differencing.
+C
+ DO 329 JORDER=1,IXORDR
+C
+C Compute spatial differences.
+C
+ ILEN=KLEN-JORDER
+ INPACK=ILEN/KMINPK
+ IDIAGO(JORDER)=0
+ IWIDAB=0
+ IREFER=-KPOWER(KMXPWR)
+ IOFFWK=MOD (JORDER-1,2)*IBASE
+ IXBITS=MIN(IXBITS+1,KMXPWR)
+C
+ IF (L1PASS) THEN
+C
+ IF (JORDER.EQ.1) THEN
+C
+ DO 301 J=1,ILEN
+ KWORK(IOFFWK+J)=KDATA(J+1)-KDATA(J)
+ 301 CONTINUE
+C
+ ELSE
+C
+#ifdef CRAY
+CDIR$ IVDEP
+#endif
+#ifdef FUJITSU
+!OCL NOVREC
+#endif
+ DO 302 J=1,ILEN
+ KWORK(IOFFWK+J)=KWORK(IOFFWP+J+1)-KWORK(IOFFWP+J)
+ 302 CONTINUE
+C
+ ENDIF
+C
+ IOFFWP=IOFFWK
+ ILWORX = MAX ( ILWORX, IOFFWK+ILEN )
+C
+ CALL MAXMNI (KWORK(IOFFWK+1),ILEN,IMAXAB,IMINAB(JORDER))
+C
+C Check that extrema difference would not lead to overflow.
+C
+ IRANGE=IMAXAB/2-IMINAB(JORDER)/2
+C
+ IF (IRANGE.GT.KPOWER(KMXPWR-1)) THEN
+ IORDER=JORDER-1
+ WRITE(GRPRSM,FMT=9301) JORDER, IORDER
+ GOTO 330
+ ENDIF
+C
+ IAUXIL = C2RNGE ( INPACK, KMINPK, IXBITS, KWORK(IOFFWK+1),
+ X IDIAGO(JORDER), IWIDAB, IREFER, KPOWER,
+ X KMXPWR, KPCWID, KXCWID )
+C
+ ELSE
+C
+C Work array too short. Data array processed into slices.
+C
+ INBSEQ=1+(ILEN-1)/ILWORK
+ IMAXAB=-KPOWER(KMXPWR)
+ IMINAB(JORDER)=KPOWER(KMXPWR)
+C
+ DO 314 JSEQ=1,INBSEQ
+C
+ IAUXIL=MIN (ILWORK,ILEN-(JSEQ-1)*ILWORK)
+ INPACS=MIN (INPACW,INPACK-(JSEQ-1)*INPACW)
+C
+ IF (JORDER.EQ.1) THEN
+C
+ DO 311 J=1,IAUXIL
+ KWORK(J)=KDATA(IOFFWK+J+1)-KDATA(IOFFWK+J)
+ 311 CONTINUE
+C
+ ELSEIF (JORDER.EQ.2) THEN
+C
+ DO 312 J=1,IAUXIL
+ IAUX1=KDATA(IOFFWK+J+1)-KDATA(IOFFWK+J )
+ IAUX2=KDATA(IOFFWK+J+2)-KDATA(IOFFWK+J+1)
+ KWORK(J)=IAUX2-IAUX1
+ 312 CONTINUE
+C
+ ELSE
+C
+ DO 313 J=1,IAUXIL
+ IAUX1=KDATA(IOFFWK+J+1)-KDATA(IOFFWK+J )
+ IAUX2=KDATA(IOFFWK+J+2)-KDATA(IOFFWK+J+1)
+ IAUX3=KDATA(IOFFWK+J+3)-KDATA(IOFFWK+J+2)
+ KWORK(J)=(IAUX3-IAUX2)-(IAUX2-IAUX1)
+ 313 CONTINUE
+C
+ ENDIF
+C
+ ILWORX = MAX ( ILWORX, IAUXIL )
+C
+ CALL MAXMNI (KWORK,IAUXIL,IMAX,IMIN)
+ IMAXAB=MAX (IMAXAB,IMAX)
+ IMINAB(JORDER)=MIN (IMINAB(JORDER),IMIN)
+C
+C Check that extrema difference would not lead to overflow.
+C
+ IRANGE=IMAXAB/2-IMINAB(JORDER)/2
+C
+ IF (IRANGE.GT.KPOWER(KMXPWR-1)) THEN
+ IORDER=JORDER-1
+ WRITE(GRPRSM,FMT=9301) JORDER, IORDER
+ GOTO 330
+ ELSEIF (INPACS.GT.0) THEN
+C
+ IAUXIL = C2RNGE ( INPACS, KMINPK, IXBITS, KWORK,
+ S IDIAGO(JORDER), IWIDAB, IREFER,
+ S KPOWER, KMXPWR, KPCWID, KXCWID )
+ IOFFWK=IOFFWK+IAUXIL
+C
+ ENDIF
+C
+ 314 CONTINUE
+C
+ ENDIF
+C
+ IRANGE=IMAXAB-IMINAB(JORDER)
+C
+ INBIAB(JORDER) = C2BITW ( IRANGE, KSEC4(2)+JORDER,
+ X KPOWER, KMXPWR )
+C
+ INBIFO = C2BITW ( IREFER, IXBITS, KPOWER, KMXPWR )
+C
+ IBITGW = C2BITW ( IWIDAB, IXBITS, KPOWER, KMXPWR )
+C
+ IXBITS=INBIAB(JORDER)
+C
+C IDIAGO(JORDER)=(IDIAGO(JORDER)+7)/8
+ IDIAGO(JORDER)=(IDIAGO(JORDER)+7)/8+(INPACK*IBITGW+7)/8
+ S +(INPACK*INBIFO+7)/8
+C IDIAGO(JORDER)=(IDIAGO(JORDER)+7)/8+(INPACK*IBITGW+7)/8
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ PRINT *, 'JORDER=', JORDER, ', IDIAGO(.) = ', IDIAGO(JORDER),
+ S INPACK, IBITGW, INBIFO
+C
+ WRITE(GRPRSM,FMT=9211) 'spatial differences', KMINPK,
+ S IDIAGO(JORDER)
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+C
+ IF (IDIAGO(JORDER).LT.IDIAGN) THEN
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9312) 'in favour', JORDER
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ IDIAGN=IDIAGO(JORDER)
+ IORDER=JORDER
+C
+ ELSE
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9312) '*NOT* in favour', JORDER
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ GOTO 330
+C
+ ENDIF
+C
+ 329 CONTINUE
+C
+ 330 CONTINUE
+C
+ LIBIAS=.TRUE.
+#ifndef ebug2o
+C
+ IF (ODEBUG) THEN
+#endif
+C
+ DO 331 J=IORDER+2,JPORDR
+ IDIAGO(J)=0
+ 331 CONTINUE
+C
+ WRITE(GRPRSM,FMT=9331) IORDER, IDIAGO
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+C -----------------------------------------------------------------
+C* Section 4 . Computes spatial differences back into KDATA.
+C -----------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ IF (IORDER.EQ.0) THEN
+C
+C Prognosis is that spatial differencing is not worth.
+C Nothing more to do then.
+C
+ GOTO 900
+C
+ ELSEIF (.NOT.OCOMSD) THEN
+C
+C Computing of spatial differences not requested.
+C
+ GOTO 500
+C
+ ELSEIF (IBASE.NE.0.OR.(IORDER.EQ.IXORDR.AND.L1PASS)) THEN
+C
+C Required data have been computed above, and are still
+C available.
+C
+ IOFFWK=MOD(IORDER-1,2)*IBASE
+#ifdef ebug2o
+ PRINT *,'c2dosd - Execution of loop 401, IORDER= ',IORDER,
+ X ', IOFFWK= ',IOFFWK
+#endif
+C
+ DO 401 J=1,KLEN-IORDER
+ KDATA(IORDER+J)=KWORK(IOFFWK+J)-IMINAB(IORDER)
+ 401 CONTINUE
+C
+ ELSEIF (LCBIAS) THEN
+C
+C Spatial differences first computed without bias.
+C
+ IF (IORDER.EQ.1) THEN
+#ifdef ebug2o
+C
+ PRINT *,'c2dosd - Execution of loop 402, IORDER= ',IORDER
+#endif
+C
+ DO 402 J=KLEN,2,-1
+ KDATA(J)=KDATA(J)-KDATA(J-1)
+ 402 CONTINUE
+C
+ ELSEIF (IORDER.EQ.2) THEN
+#ifdef ebug2o
+C
+ PRINT *,'c2dosd - Execution of loop 403, IORDER= ',IORDER
+#endif
+C
+ DO 403 J=KLEN,3,-1
+ IAUX1=KDATA(J-1)-KDATA(J-2)
+ IAUX2=KDATA(J )-KDATA(J-1)
+ KDATA(J)=IAUX2-IAUX1
+ 403 CONTINUE
+C
+ ELSE
+#ifdef ebug2o
+C
+ PRINT *,'c2dosd - Execution of loop 404, IORDER= ',IORDER
+#endif
+C
+ DO 404 J=KLEN,4,-1
+ IAUX1=KDATA(J-2)-KDATA(J-3)
+ IAUX2=KDATA(J-1)-KDATA(J-2)
+ IAUX3=KDATA(J )-KDATA(J-1)
+ KDATA(J)=(IAUX3-IAUX2)-(IAUX2-IAUX1)
+ 404 CONTINUE
+C
+ ENDIF
+C
+C Now compute and remove bias.
+C
+ ILEN=KLEN-IORDER
+ CALL MAXMNI (KDATA(IORDER+1),ILEN,IMAXAB,IMINAB(IORDER))
+#ifdef ebug2o
+C
+ PRINT *,'c2dosd - Execution of loop 405, IORDER= ',IORDER,
+ X ', Computed bias= ',IMINAB(IORDER)
+#endif
+C
+ DO 405 J=IORDER+1,KLEN
+ KDATA(J)=KDATA(J)-IMINAB(IORDER)
+ 405 CONTINUE
+C
+C Compute width of spatial differences.
+C
+ IRANGE=IMAXAB-IMINAB(IORDER)
+C
+ INBIAB(IORDER) = C2BITW ( IRANGE, KSEC4(2)+IORDER,
+ X KPOWER, KMXPWR )
+C
+ ELSEIF (IORDER.EQ.1) THEN
+C
+C Explicit computing for 1st-order spatial differences.
+C
+#ifdef ebug2o
+ PRINT *,'c2dosd - Execution of loop 412, IORDER= ',IORDER,
+ X ', Bias= ',KBIAS
+C
+#endif
+ DO 412 J=KLEN,2,-1
+ KDATA(J)=KDATA(J)-KDATA(J-1)-KBIAS
+ 412 CONTINUE
+C
+ ELSEIF (IORDER.EQ.2) THEN
+C
+C Explicit computing for 2nd-order spatial differences.
+C
+#ifdef ebug2o
+ PRINT *,'c2dosd - Execution of loop 413, IORDER= ',IORDER,
+ X ', Bias= ',KBIAS
+C
+#endif
+ DO 413 J=KLEN,3,-1
+ IAUX1=KDATA(J-1)-KDATA(J-2)
+ IAUX2=KDATA(J )-KDATA(J-1)
+ KDATA(J)=IAUX2-IAUX1-KBIAS
+ 413 CONTINUE
+C
+ ELSE
+C
+C Explicit computing for 3rd-order spatial differences.
+C
+#ifdef ebug2o
+ PRINT *,'c2dosd - Execution of loop 414, IORDER= ',IORDER,
+ X ', Bias= ',KBIAS
+C
+#endif
+ DO 414 J=KLEN,4,-1
+ IAUX1=KDATA(J-2)-KDATA(J-3)
+ IAUX2=KDATA(J-1)-KDATA(J-2)
+ IAUX3=KDATA(J )-KDATA(J-1)
+ KDATA(J)=(IAUX3-IAUX2)-(IAUX2-IAUX1)-KBIAS
+ 414 CONTINUE
+C
+ ENDIF
+C
+C Note that the IORDER first values of KDATA are kept unchanged.
+C These "integration constants" will be packed separately.
+C
+C -----------------------------------------------------------------
+C* Section 5 . Computes additional descriptors.
+C -----------------------------------------------------------------
+C
+ 500 CONTINUE
+C
+ IF (LCBIAS.OR.LIBIAS) THEN
+C
+ KBIAS=IMINAB(IORDER)
+ KWIDOR=INBIAB(IORDER)
+C
+C Extra descriptors specific to spatial differencing are
+C the IORDER first values of "original" field, the bias
+C of spatial differences, and the width for all of them.
+C
+ CALL MAXMNI (KDATA,IORDER,IMAX,IMIN)
+ IAUX1 = C2BITW ( IMAX, KMXPWR, KPOWER, KMXPWR )
+ IAUX2=IABS (KBIAS)
+ IAUX3 = C2BITW ( IAUX2, KMXPWR, KPOWER, KMXPWR )
+ KWIDSD=MAX (IAUX1,1+IAUX3)
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9420) IORDER, KWIDOR, KWIDSD,
+ X (KDATA(J),J=1,IORDER), KBIAS
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 9 . Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ KLWORX=ILWORX
+C
+ C2DOSD = IORDER
+C
+#ifndef ebug2o
+C
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9900) IORDER
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ RETURN
+C
+ 9100 FORMAT (' C2DOSD: Function start, OCOMSD = ',L1,', OCBIAS = ',
+ X L1,'.')
+C
+ 9211 FORMAT (' C2DOSD: Approx. s4 length, ',A,',',I3,
+ X '-length groups:',I9,'.')
+C
+ 9301 FORMAT (' C2DOSD: integer overflow for JORDER =',I2,
+ X '. IORDER set to',I2,'.')
+C
+ 9312 FORMAT (' C2DOSD: Range diagnostic is ',A,
+ X ' of spatial differences, order',I2,'.')
+ 9331 FORMAT (' C2DOSD: Selected order:',I2,', range diagnostics:',
+ X 4I8,'.')
+C
+ 9420 FORMAT (' C2DOSD: KWIDSD/KWIDOR/KDATA(1:',I1,')/KBIAS=',2I3,5I11)
+C
+ 9900 FORMAT (' C2DOSD: Function return code =',I3,'.')
+C
+ END
diff --git a/gribex/c2gene.F b/gribex/c2gene.F
new file mode 100755
index 0000000..3a39242
--- /dev/null
+++ b/gribex/c2gene.F
@@ -0,0 +1,931 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION C2GENE ( KDATA, KLENP, KSEC4, KGRIB, KLENG,
+ X KNSPT, KBITS, OCOMGR, OLONLY, KLEN4,
+ X KFIROV, KLEN, KREFGR, KLENGR, KBITGR,
+ X KWORK, KLWORK, KSTART, KPOWER, KMXPWR,
+ X KPCWID, KXCWID, KNBIFO, KNCMIN, KMINPK,
+ X KLWORX, ODEBUG )
+C
+C---->
+C**** C2GENE
+C
+C Purpose.
+C --------
+C
+C Performs a general second-order packing method for section 4
+C of GRIB, and/or computes only length of section 4, with/without
+C coding, with this method.
+C
+C "General" means with explicit descriptors to describe groups
+C position and width (not row-by-row, nor constant-width).
+C
+C When extended 2nd-order packing is enabled, then KSEC4(12:15)
+C values determin if extensions are concerned. Extensions are:
+C
+C - general extended 2nd-order packing, which is the same as WMO
+C except for documentation of descriptors (held more economically);
+C
+C - boustrophedonic ordering, which is held outside of the routine
+C (field re-ordering, swapping values in even rank rows).
+C
+C - spatial differencing, which is held mostly outside of the
+C routine (apply general extended 2nd-order compression algorithm,
+C with or without boustrophedonic ordering, to values obtained
+C through computation of differences between adjacent values,
+C repeated to order wished).
+C
+C** Interface.
+C ----------
+C
+C KRET = C2GENE ( KDATA, KLENP, KSEC4, KGRIB, KLENG, KNSPT,
+C X KBITS, OCOMGR, OLONLY, KLEN4, KFIROV, KLEN,
+C X KREFGR, KLENGR, KBITGR, KWORK, KLWORK, KSTART,
+C X KPOWER, KMXPWR, KPCWID, KXCWID, KNBIFO, KNCMIN,
+C X KMINPK, KLWORX, ODEBUG )
+C
+C
+C Input Parameters for all options.
+C --------------------------------
+C
+C KDATA - Array of normalized values.
+C KLENP - Length of array KDATA.
+C KSEC4 - Array of GRIB section 4 integer descriptors.
+C KSEC4(12) indicates type of general 2nd-order packing
+C (applies only to descriptors):
+C 0 => standard WMO descriptors
+C 8 => extended descriptors
+C KSEC4(13) indicates if boustrophedonic ordering
+C (values swapped in rows of even rank) is selected:
+C 0 => standard ordering
+C 4 => boustrophedonic ordering
+C KSEC4(14:15) indicates if spatial differencing is on:
+C 0:0 => no spatial differencing
+C 0:1,2:0,2:1 => spatial differencing applied at order
+C equal to KSEC4(14)+KSEC4(15)
+C KLENG - Length of GRIB product array.
+C KNSPT - Bit pointer for next value in GRIB product.
+C KBITS - Number of bits per computer word.
+C OCOMGR - True if COMputing of GRoup arrays is requested.
+C OLONLY - True if Length ONLY is requested (no coding).
+C KLEN - Exact number of grid-points to handle.
+C KLWORK - Length of work arrays.
+C KPOWER - Auxilary array, precomputed (powers of 2)-1.
+C KMXPWR - Maximum number of bits per original scaled value.
+C KPCWID - Auxilary array, precomputed widths.
+C KXCWID - Maximum width associated to KPCWID.
+C KNCMIN - Minimum increment to use when determining groups.
+C KMINPK - Initial (minimum) length of groups.
+C ODEBUG - True for some debug printout.
+C
+C
+C Output Parameters for all options.
+C ---------------------------------
+C
+C KSEC4 - Array of GRIB section 4 integer descriptors.
+C (updated, except when both OCOMGR is false
+C and OLONLY it true)
+C KLEN4 - Length of section 4.
+C KLWORX - Maximum work space used.
+C
+C Output Parameters when OLONLY is false.
+C --------------------------------------
+C
+C KGRIB - Array containing GRIB product.
+C KNSPT - Bit pointer for next value in GRIB product (updated).
+C KWORK - Used as work array by C2PACK.
+C
+C Output Parameters when OCOMGR is true,
+C Input Parameters when OCOMGR is false.
+C --------------------------------------
+C
+C KREFGR - Work array, first-order values for each row.
+C KLENGR - Work array, effective length of each row.
+C KBITGR - Work array, bit number ("width") of each row.
+C KNBIFO - Number of BIts for coding First-Order values.
+C
+C Output Parameters when OCOMGR is true,
+C Input parameter in all cases.
+C --------------------------------------
+C
+C KDATA - Used as work array by C2PACK.
+C
+C Input Parameter when OCOMGR is false.
+C -------------------------------------
+C
+C KSTART - First index value of precomputed work arrays KREFGR,
+C KLENGR and KBITGR.
+C
+C Method.
+C -------
+C
+C Follows WMO Manual of Codes.
+C
+C If requested through OCOMGR, a first scan computes work arrays,
+C bit number for coding first-order values and length of section 4.
+C
+C If requested, coding is applied in a second scan, using
+C descriptors computed in the first scan, possibly in a previous
+C call.
+C
+C Algorithm used to determine groups is derived from Harry R. Glahn
+C (U.S. Met Service), from a working paper submitted to WMO SGDR&C
+C in 1995.
+C
+C If extended 2nd-order packing is enabled, then call with OCOMGR
+C to .FALSE. and OLONLY to .TRUE. is enabled, to support aggressive
+C packing without having to recompute work arrays, which would be
+C the same for general WMO and extended packings (for the same
+C option of field ordering: either both boustrophedonic
+C or both not).
+C
+C Externals.
+C ----------
+C
+C MAXMNI - Computes extrema of integer array.
+C C2BITW - Computes bit width of a positive integer value.
+C C2PACK - Encodes descriptors and data.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C On entry, KNSPT points to the first bit of section 4
+C in the GRIB product.
+C On exit, KNSPT points to the first unused bit of section 4,
+C (or to the first bit of section 5, if unused bit count
+C is zero) in the GRIB product.
+C
+C KDATA is overwritten when coding is requested.
+C This is coherent with GRIBEX.
+C
+C Boustrophedonic ordering, if selected, is formally transparent to
+C the current routine. Pre-processing is held at calling routine
+C level (C2ORDR), coding at C2PACK level.
+C
+C Author.
+C -------
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C
+C
+C Modifications.
+C _____________
+C
+C J. Clochard, April 1998.
+C Use C2BITW function for bit width computations, out of
+C the splitting algorithm itself.
+C Introduce spatial differencing.
+C
+C J. Clochard, July 1998.
+C Set KLWORX to KLWORK when out of work space in direct algorithm.
+C
+C J. Clochard, September 1998.
+C Update comments.
+C Adjust KLWORX within splitting algorithm.
+C Limit index range used in KWORK for "small" initial groups number.
+C Suppress KSEC1/KSEC2/KSEC3 dummy-arguments.
+C " KSEC1, add KWORK/KPOWER/KMXPWR argument in C2PACK call.
+C
+C J. Clochard, June 1999.
+C Use precomputed array to determine widths . Dummy-arguments
+C KPCWID and KXCWID added . Assumption is made that KXCWID
+C is at least (KMXPWR+1)/2 .
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Subroutine arguments
+C
+ INTEGER KLENP, KLENG, KNSPT, KBITS, KLEN4, KNCMIN, KLWORX, KXCWID
+ INTEGER KLEN, KLWORK, KMXPWR, KNBIFO, KFIROV, KMINPK, KSTART
+C
+ INTEGER KDATA (KLENP), KSEC4 (*), KPCWID (0:*)
+ INTEGER KGRIB (KLENG), KREFGR (KLWORK), KLENGR (KLWORK)
+ INTEGER KBITGR (KLWORK), KPOWER (0:KMXPWR), KWORK (KLWORK)
+C
+ LOGICAL OLONLY, OCOMGR, ODEBUG
+C
+C Local variables.
+C
+ INTEGER IRETFN, ICOUNT, INBIFO, ILDSTA, IDMAX, IDMIN, IXLDST
+ INTEGER IGROUP, ISIZEG, IPOWER, INBITO, ILENSO, IXLEN4, IXGRBD
+ INTEGER IOFF, J, IFIROV, INCMIN, IBITGW, IMAXAB, IMINAB, IMINPK
+ INTEGER IMAXA, IMINA, ISOMAX, INBITA, IMAXC, IMINC, IXBIGW, ILCWID
+ INTEGER IMAXAC, IMINAC, IMAXB, IMINB, ISIZEA, ISIZEB, ISIZEC
+ INTEGER IXFIRO, ISTART, ILWORK, ILEN
+ INTEGER IBITGS, ILENGS, ILDSTG, INDNEW, ILEN4O, IORDER, IWIDSD
+ INTEGER IBIAS
+ INTEGER IAUXIL, IGRADD, ILEN4S, IGROUS, J2, ILASTG, INGRAD, IPOSGR
+C
+ INTEGER C2PACK, C2BITW
+ EXTERNAL C2PACK, C2BITW
+C
+ LOGICAL LB2A
+ LOGICAL LGENXT
+C
+ REAL ZGAIN
+C
+C Function computing lenth of section 4 (in octets), using as
+C arguments length of static descriptors, number of 1st-order
+C values, width of widthes, and length (bits) of descriptors
+C for groups bounds.
+C
+C Length must always be an even number of octets.
+C
+ IXLEN4 ( IXLDST, IXFIRO, IXBIGW, IXGRBD ) = 2 * ( (
+ X IXLDST + (8+IXFIRO*IXBIGW-1)/8 + (8+IXGRBD-1)/8
+ X + (8+IXFIRO*INBIFO-1)/8 + (8+ILENSO-1)/8
+ X +1 ) / 2 )
+C
+C
+C -----------------------------------------------------------------
+C* Section 1 . Performs initial checks.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ LGENXT=KSEC4(12).NE.0
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9100) OCOMGR, OLONLY, KNSPT
+C
+ IF (LGENXT) THEN
+ WRITE(GRPRSM,FMT=9101) 'general extended'
+ ELSE
+ WRITE(GRPRSM,FMT=9101) 'general WMO standard'
+ ENDIF
+C
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ IRETFN = 0
+ ILCWID = KPOWER(KXCWID)+1
+ IORDER=KSEC4(14)+KSEC4(15)
+ ICOUNT=IORDER
+ ILEN=KLEN-IORDER
+ IWIDSD=KSEC4(11)
+ IBIAS=KSEC4(16)
+ ILDSTA=21
+ INBITO=KSEC4(2)
+ KLWORX=0
+C
+ IF (.NOT.OCOMGR) THEN
+C
+ INBIFO=KNBIFO
+ IFIROV=KFIROV
+ KLWORX=KFIROV
+ ISTART=KSTART
+ IBITGW=KSEC4(20)
+C
+ IF (LGENXT) THEN
+ IBITGS=KSEC4(17)
+ ENDIF
+C
+ IF (OLONLY) THEN
+ ILENSO=KSEC4(19)
+ GOTO 260
+ ENDIF
+ GOTO 300
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 2 . Computing of group characteristics.
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IGROUP=0
+ INCMIN=MIN (MAX (KNCMIN,1),1+ILEN/4)
+ IMINPK=MIN (MAX (KMINPK,2*INCMIN),1+ILEN/2)
+ ISIZEG=IMINPK
+ ISTART=1
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9200) INBITO, (KSEC4(J),J=1,15),
+ X INCMIN, ISIZEG
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+C
+C -----------------------------------------------------------------
+C Determination of an "initial" group, called A.
+C -----------------------------------------------------------------
+C
+ 210 CONTINUE
+C
+ ISIZEA=MIN (ISIZEG,KLEN-ICOUNT)
+C
+C Extrema computed in-line for better efficiency.
+C
+ IMAXA=KDATA(ICOUNT+1)
+ IMINA=KDATA(ICOUNT+1)
+C
+ DO 211 J=2,ISIZEA
+ IMAXA=MAX (IMAXA,KDATA(ICOUNT+J))
+ IMINA=MIN (IMINA,KDATA(ICOUNT+J))
+ 211 CONTINUE
+C
+ 212 CONTINUE
+C
+ LB2A=.FALSE.
+ ISOMAX=IMAXA-IMINA
+C
+ IF (ISOMAX.LT.ILCWID) THEN
+ INBITA=KPCWID(ISOMAX)
+ ELSE
+ INBITA=KXCWID+KPCWID(ISOMAX/ILCWID)
+ ENDIF
+C
+ IPOWER=KPOWER(INBITA)
+C
+ IOFF=ICOUNT+ISIZEA
+#ifdef ebug2o
+ PRINT *,'c2gene - ICOUNT/ISIZEA/IMINA/IMAXA/INBITA/IPOWER=',
+ X ICOUNT,ISIZEA,IMINA,IMAXA,INBITA,IPOWER
+#endif
+C
+ IF (IOFF.EQ.KLEN) THEN
+C
+C Just finished. Group A is closed.
+C
+ GOTO 240
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C Try to add an increment C to initial group A.
+C -----------------------------------------------------------------
+C
+ 220 CONTINUE
+C
+ IF (KLEN-(IOFF+INCMIN).LE.ISIZEG/2) THEN
+C
+C Avoid too small group at the end.
+C
+ INCMIN=KLEN-IOFF
+ ENDIF
+C
+ IMAXC=KDATA(IOFF+1)
+ IMINC=KDATA(IOFF+1)
+C
+#ifdef CRAY
+CDIR$ NOVECTOR
+#endif
+#ifdef FUJITSU
+!OCL SCALAR
+#endif
+ DO 221 J=2,INCMIN
+ IMAXC=MAX (IMAXC,KDATA(IOFF+J))
+ IMINC=MIN (IMINC,KDATA(IOFF+J))
+ 221 CONTINUE
+#ifdef CRAY
+CDIR$ VECTOR
+#endif
+#ifdef FUJITSU
+!OCL VECTOR
+#endif
+C
+ IMAXAC=MAX (IMAXA,IMAXC)
+ IMINAC=MIN (IMINA,IMINC)
+ ISOMAX=IMAXAC-IMINAC
+#ifdef ebug2o
+ PRINT *,'c2gene - IOFF/INCMIN/IMINC/IMAXC/IMINAC/IMAXAC=',
+ X IOFF,INCMIN,IMINC,IMAXC,IMINAC,IMAXAC
+#endif
+C
+ IF (ISOMAX.GT.IPOWER) THEN
+C
+C Added to A, increment C would not fit in same width as A.
+C Group A is closed.
+C
+ GOTO 240
+C
+ ELSEIF ((IOFF+INCMIN).EQ.KLEN) THEN
+C
+C Group C is added to group A. Finished.
+C
+ ISIZEA=ISIZEA+INCMIN
+ IMAXA=IMAXAC
+ IMINA=IMINAC
+ GOTO 240
+C
+ ENDIF
+C
+C Increment C would fit, if added to A.
+C
+C See width of group B, following group A, with its length
+C determined in the same way as A.
+C
+ ISIZEB=MIN (ISIZEG,KLEN-IOFF)
+ IMAXB=IMAXC
+ IMINB=IMINC
+C
+ DO 222 J=INCMIN+1,ISIZEB
+ IMAXB=MAX (IMAXB,KDATA(IOFF+J))
+ IMINB=MIN (IMINB,KDATA(IOFF+J))
+ 222 CONTINUE
+C
+ ISOMAX=IMAXB-IMINB
+ IMAXAB=MAX (IMAXA,IMAXB)
+ IMINAB=MIN (IMINA,IMINB)
+#ifdef ebug2o
+ PRINT *,'c2gene - IMINB/IMAXB/IMINAB/IMAXAB=',
+ X IMINB,IMAXB,IMINAB,IMAXAB
+#endif
+C
+ IF (ISOMAX.LE.IPOWER/2.AND.IPOWER.GT.0) THEN
+C
+C Group B has a smaller width than A.
+C
+C Group A is closed, B replaces A, reminds that new initial group
+C characteristics (with the exception of width) have already been
+C computed.
+C
+ LB2A=.TRUE.
+ GOTO 240
+C
+ ELSEIF ((IMAXAB-IMINAB).LE.IPOWER) THEN
+C
+C Group B just fits with A, and is added to A as an extended
+C C group.
+C
+ ISIZEC=ISIZEB
+ IMAXAC=IMAXAB
+ IMINAC=IMINAB
+C
+ ELSE
+C
+C Group B has a width at least equal to A, and would not fit
+C if added to A.
+C
+C Group C is added to group A, and another C-type group
+C has to be checked.
+C
+ ISIZEC=INCMIN
+C
+ ENDIF
+C
+C Incremental group (C or B) added to A.
+C
+ ISIZEA=ISIZEA+ISIZEC
+ IMAXA=IMAXAC
+ IMINA=IMINAC
+ IOFF=IOFF+ISIZEC
+C
+ IF (IOFF.LT.KLEN) THEN
+C
+C Another C-type group has to be checked...
+C
+ GOTO 220
+C
+ ENDIF
+C
+C ...otherwise, finished.
+C
+C -----------------------------------------------------------------
+C No incremental group may be added. Current A group is closed.
+C -----------------------------------------------------------------
+C
+ 240 CONTINUE
+C
+ IGROUP=IGROUP+1
+ KLENGR(IGROUP)=ISIZEA
+ ICOUNT=ICOUNT+ISIZEA
+ KBITGR(IGROUP)=INBITA
+ ISOMAX=IMAXA-IMINA
+C
+C Maximum use of width for second-order values: the maximum value
+C of group will be encoded with the biggest value fitting within
+C INBITA bits, and keeping reference value positive or zero.
+C
+C The goal is to get the lowest reference value, thus trying
+C (desperately) to save bit(s) to encode the first-order values.
+C
+ KREFGR(IGROUP)=MAX (0,IMINA-(IPOWER-ISOMAX))
+#ifdef ebug2o
+ PRINT *,'c2gene - IGROUP/ISIZEA/INBITA/IMINA/IMAXA/refer=',
+ X IGROUP,ISIZEA,INBITA,IMINA,IMAXA,KREFGR(IGROUP)
+#endif
+C
+ IF (ICOUNT.EQ.KLEN) THEN
+C
+C Work finished.
+C
+ GOTO 250
+C
+ ELSEIF (IGROUP.GE.KLWORK) THEN
+C
+C Out of work space.
+C
+ IRETFN = 21240
+ WRITE(GRPRSM,FMT=9240) KLWORK
+ KLWORX=KLWORK
+ GOTO 900
+C
+ ELSEIF (LB2A) THEN
+C
+C Transforms B group into A group.
+C
+ ISIZEA=ISIZEB
+ IMAXA=IMAXB
+ IMINA=IMINB
+C
+C Go back, starting by width computing.
+C
+ GOTO 212
+C
+ ELSE
+C
+C Another A group must be determined.
+C
+ GOTO 210
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C Groups have been determined. Computes associated descriptors.
+C -----------------------------------------------------------------
+C
+ 250 CONTINUE
+C
+ KLWORX=IGROUP
+ IFIROV=IGROUP
+C
+C Number of bits necessary to code first-order values.
+C
+ CALL MAXMNI (KREFGR,IFIROV,IDMAX,IDMIN)
+ INBIFO = C2BITW ( IDMAX, INBITO, KPOWER, KMXPWR )
+C
+C Length (bits) of second-order values.
+C
+ ILENSO=0
+C
+ DO 253 J=1,IFIROV
+ ILENSO=ILENSO+KLENGR(J)*KBITGR(J)
+ 253 CONTINUE
+C
+C -----------------------------------------------------------------
+C Descriptors that are computed even if OCOMGR is false.
+C -----------------------------------------------------------------
+C
+ 260 CONTINUE
+C
+ IF (LGENXT) THEN
+C
+C Compute group width (width of widths), that may be here
+C different than 8.
+C
+ CALL MAXMNI (KBITGR,IFIROV,ISOMAX,IAUXIL)
+ IBITGW = C2BITW ( ISOMAX, INBITO, KPOWER, KMXPWR )
+C
+C Compute width of lengths.
+C
+ CALL MAXMNI (KLENGR,IFIROV,IDMAX,IDMIN)
+ IBITGS = C2BITW ( IDMAX, KMXPWR, KPOWER, KMXPWR )
+C
+ KSEC4(17)=IBITGS
+C
+ IF (IORDER.EQ.0) THEN
+ ILDSTG=ILDSTA+4
+ ELSE
+ ILDSTG=ILDSTA+5+(8+IWIDSD*(IORDER+1)-1)/8
+ ENDIF
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9260) IAUXIL, ISOMAX, IBITGW, IDMIN, IDMAX,
+ X IBITGS
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ ELSE
+C
+C Define group width (width of widths).
+C
+ IBITGW=8
+C
+ ENDIF
+C
+ KSEC4(20)=IBITGW
+C
+ IF (OCOMGR) THEN
+C
+ KSEC4(19)=ILENSO
+ KNBIFO=INBIFO
+ KFIROV=IFIROV
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C Compute full length of section 4 of GRIB.
+C -----------------------------------------------------------------
+C
+ IF (LGENXT) THEN
+C
+ ILENGS=IFIROV*IBITGS
+ KLEN4=IXLEN4 ( ILDSTG, IFIROV, IBITGW, ILENGS )
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9270) KLEN4
+ ILEN4O=KLEN4
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+C -----------------------------------------------------------------
+C Try to reduce size of lengthes descriptors, splitting groups
+C that require exactly IBITGS bits for their lengthes.
+C -----------------------------------------------------------------
+C
+ IAUXIL=MIN (KLWORK/2,IFIROV)
+C
+ 270 CONTINUE
+C
+ IGROUP=0
+ IGRADD=0
+ IDMAX=KPOWER(IBITGS-1)+1
+C
+ DO 271 J=1,IFIROV
+C
+ IF (KLENGR(J).GE.IDMAX) THEN
+C
+ IF (IGROUP.GE.IAUXIL) THEN
+C
+C Out of work space. No (further) splitting performed.
+C
+ KLWORX=MAX (KLWORX,IAUXIL+IGROUP)
+ GOTO 280
+C
+ ELSE
+C
+C Compute number of sub-groups that would replace current
+C group, with a length requiring one bit less for encoding.
+C (2, except when original length=2**IBITGS-1, where 3
+C sub-groups are necessary)
+C
+C
+ IGROUP=IGROUP+1
+ KWORK(IGROUP)=J
+ KWORK(IAUXIL+IGROUP)=1+(KLENGR(J)+1)/IDMAX
+ IGRADD=IGRADD+KWORK(IAUXIL+IGROUP)
+C
+ ENDIF
+C
+ ENDIF
+C
+ 271 CONTINUE
+C
+ IGRADD=IGRADD-IGROUP
+ IGROUS=IFIROV+IGRADD
+ ILENGS=IGROUS*(IBITGS-1)
+ ILEN4S=IXLEN4 ( ILDSTG, IGROUS, IBITGW, ILENGS )
+ KLWORX=MAX (KLWORX,IAUXIL+IGROUP)
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9271) IFIROV, IGRADD, ILEN4S
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ IF (IGROUS.LE.KLWORK.AND.ILEN4S.LT.KLEN4) THEN
+C
+C Splitting performed, leading to better compression ratio
+C with some shorter groups.
+C
+ ILASTG=IFIROV
+C
+ DO 275 J=IGROUP,1,-1
+C
+ IPOSGR=KWORK(J)
+ INGRAD=KWORK(IAUXIL+J)
+C
+C Push up groups above current group to split.
+C
+#ifdef CRAY
+CDIR$ IVDEP
+#endif
+#ifdef FUJITSU
+!OCL NOVREC
+#endif
+ DO 273 J2=ILASTG,IPOSGR+1,-1
+C
+ KREFGR(J2+IGRADD)=KREFGR(J2)
+ KBITGR(J2+IGRADD)=KBITGR(J2)
+ KLENGR(J2+IGRADD)=KLENGR(J2)
+C
+ 273 CONTINUE
+C
+#ifdef ebug2o
+ PRINT *,'c2gene - after loop 273: ',IPOSGR+1+IGRADD
+#endif
+C
+C Split current group.
+C
+#ifdef CRAY
+CDIR$ NOVECTOR
+#endif
+#ifdef FUJITSU
+!OCL SCALAR
+#endif
+ DO 274 J2=INGRAD,1,-1
+C
+ INDNEW=J2-INGRAD+IGRADD+IPOSGR
+#ifdef ebug2o
+ PRINT *,INDNEW
+#endif
+ KREFGR(INDNEW)=KREFGR(IPOSGR)
+ KBITGR(INDNEW)=KBITGR(IPOSGR)
+ KLENGR(INDNEW)=(KLENGR(IPOSGR)+INGRAD-J2)/INGRAD
+C
+ 274 CONTINUE
+#ifdef CRAY
+CDIR$ VECTOR
+#endif
+#ifdef FUJITSU
+!OCL VECTOR
+#endif
+C
+#ifdef ebug2o
+ PRINT *,'c2gene - J/IPOSGR/INGRAD/ILASTG/IGRADD/len=',
+ X J, IPOSGR, INGRAD, ILASTG, IGRADD,
+ X (KLENGR(J2-INGRAD+IGRADD+IPOSGR),J2=1,INGRAD)
+#endif
+C
+ IGRADD=IGRADD-(INGRAD-1)
+ ILASTG=IPOSGR-1
+C
+ 275 CONTINUE
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9272) IGROUS, IBITGS-1
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+C
+C Update descriptors.
+C
+ IBITGS=IBITGS-1
+ IFIROV=IGROUS
+ KLWORX=MAX (KLWORX,IGROUS)
+ KSEC4(17)=IBITGS
+ KFIROV=IFIROV
+ KLEN4=ILEN4S
+C
+C Loop back to try another splitting.
+C
+ GOTO 270
+C
+ ELSEIF (KLEN4.NE.ILEN4O) THEN
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ ZGAIN=REAL (100*(ILEN4O-KLEN4)) / REAL (ILEN4O)
+ WRITE(GRPRSM,FMT=9273) ZGAIN
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ ENDIF
+C
+ ELSE
+C
+ KLEN4=IXLEN4 ( ILDSTA, IFIROV, IBITGW, KLEN )
+C
+ ENDIF
+C
+ 280 CONTINUE
+C
+ IF (OLONLY) THEN
+C
+C Length has been computed, go back without any coding.
+C
+ GOTO 900
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 3. Definition of fixed-length descriptors, and coding.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C The first 10 octets have already been coded in GRIBEX, or will
+C be in a further step of GRIBEX:
+C Length of section, flags+unused bit count, binary scale factor,
+C reference value.
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9300)
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+C Enforce right values for extended flags.
+C
+ IF (LGENXT) THEN
+ KSEC4( 9)=0
+ KSEC4(12)=8
+ ELSE
+ KSEC4( 9)=32
+ KSEC4(12)=0
+ ENDIF
+C
+ KSEC4(10)=16
+C
+C Extra descriptors.
+C
+ KSEC4(18)=KFIROV
+ KSEC4(20)=IBITGW
+ ILWORK=KLWORK-ISTART+1
+C
+ IRETFN = C2PACK ( KDATA, KLENP, KSEC4, KGRIB, KLENG, KNSPT,
+ X KBITS, KLEN, KREFGR(ISTART), KLENGR(ISTART),
+ X KBITGR(ISTART), KWORK, ILWORK, KPOWER, KMXPWR,
+ X KNBIFO, ODEBUG )
+C
+C -----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ C2GENE = IRETFN
+#ifndef ebug2o
+C
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9900) IRETFN, OCOMGR, OLONLY, KNSPT
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ RETURN
+C
+ 9100 FORMAT (' C2GENE: Function start, OCOMGR = ',L1,
+ X ', OLONLY = ',L1,', KNSPT =',I10,'.')
+ 9101 FORMAT (' C2GENE: Type of 2nd order packing requested: ',A,'.')
+C
+ 9200 FORMAT (' C2GENE: Computing work arrays, INBITO =',I3,'.',/,
+ X ' C2GENE: KSEC4(1:15)=',I9,I3,I4,3I3,I2,4I3,4I2,'.',/,
+ X ' C2GENE: INCMIN =',I3,', ISIZEG =',I6,'.')
+C
+ 9240 FORMAT (' C2GENE: Groups number exceeds work space (',I8,') .')
+C
+ 9260 FORMAT (' C2GENE: Min, Max, Width of widths/lengths =',2(I3,','),
+ X I2,' /',2(I8,','),I3,'.')
+C
+ 9270 FORMAT (' C2GENE: Length of section 4 for general extended case:'
+ X ,I9,'.')
+ 9271 FORMAT (' C2GENE: Group splitting test, from',I8,' groups',SP,
+ X I7,SS,', s4 length',I9,'.')
+ 9272 FORMAT (' C2GENE: Group splitting performed,',I8,
+ X ' groups, new width of lengths =',I3,'.')
+ 9273 FORMAT (' C2GENE: Relative gain of group splitting on section 4 ',
+ X 'length:',F5.1,' %.')
+C
+ 9300 FORMAT (' C2GENE: Coding phase - calling C2PACK.')
+C
+ 9900 FORMAT (' C2GENE: Function return code=',I6,
+ X ', OCOMGR/OLONLY/KNSPT=',2L1,I10,'.')
+C
+ END
diff --git a/gribex/c2ordr.F b/gribex/c2ordr.F
new file mode 100755
index 0000000..b354b12
--- /dev/null
+++ b/gribex/c2ordr.F
@@ -0,0 +1,1527 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION C2ORDR ( KDATA, KLENP, KSEC1, KSEC2, KSEC3,
+ X KSEC4, KGRIB, KLENG, KNSPT, KBITS,
+ X HOPER, KBMAP, KVALS, PREF, PMAX,
+ X KLEN, KDEBUG )
+C
+C---->
+C**** C2ORDR
+C
+C Purpose.
+C --------
+C
+C Encode GRIB section 4 for complex packing of grid-point
+C values ("second-order packing").
+C
+C
+C** Interface.
+C ----------
+C
+C KRET = C2ORDR ( KDATA, KLENP, KSEC1, KSEC2, KSEC3, KSEC4,
+C X KGRIB, KLENG, KNSPT, KBITS, HOPER, KBMAP,
+C X KVALS, PREF, PMAX , KLEN, KDEBUG )
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KDATA - Array of normalized values.
+C KLENP - Length of array KDATA.
+C KSEC1 - Array of GRIB section 1 integer descriptors.
+C KSEC2 - Array of GRIB section 2 integer descriptors.
+C KSEC3 - Array of GRIB section 3 integer descriptors.
+C KSEC4 - Array of GRIB section 4 integer descriptors.
+C KLENG - Length of GRIB product array.
+C KNSPT - Bit pointer for next value in GRIB product.
+C KBITS - Number of bits per computer word.
+C HOPER - Requested function:
+C 'C' for coding, following input descriptors,
+C 'K' for "aggressive pacKing" (choose a solution
+C that leads to minimum size).
+C KBMAP - Bit pointer for start of explicit primary bit-map
+C (if any).
+C KVALS - Number of bits in primary bit-map.
+C PREF - Reference of field.
+C PMAX - Maximum value of field.
+C KLEN - Exact number of points to handle.
+C KDEBUG - >0 for some debug printout.
+C
+C
+C Output Parameters.
+C -----------------
+C
+C KDATA - Used (indirectly) as work array.
+C KSEC4 - Array of GRIB section 4 integer descriptors
+C (updated).
+C KGRIB - Array containing GRIB product.
+C KNSPT - Bit pointer for next value in GRIB product
+C (updated).
+C
+C
+C Method.
+C -------
+C
+C Follows WMO Manual of Codes, and also CSECT4 structure.
+C
+C
+C If ordinary packing is requested (HOPER='C'), then the relevant
+C method described through KSEC4 descriptors is applied:
+C
+C 1) Row by row: KSEC4(9)=0, KSEC4(10)=16 and KSEC4(12)=0;
+C
+C 2) Constant width: KSEC4(9)=32, KSEC4(10)=0, KSEC4(12)=0,
+C width in KSEC4(11) -see "Comments" paragraph below, at the end.
+C
+C 3) General WMO 2nd-order: KSEC4(9)=32, KSEC4(10)=16, KSEC4(12)=0.
+C
+C 4) General extended " : KSEC4(9)=32, KSEC4(10)=16, KSEC4(12)=8.
+C
+C For constant width and general methods, boustrophedonic ordering
+C is requested by KSEC4(13)=4, provided extensions have been
+C alllowed (disabled by default), and is explicitly inhibited
+C by KSEC4(13)=0.
+C Boustrophedonic ordering has no interest for row by row packing.
+C If explicitly requested a warning message is issued and option
+C set to off.
+C
+C For the general extended method, a spatial differencing may be
+C requested through KSEC4(14) and/or KSEC4(15) different from zero:
+C
+C -explicitly: KSEC4(14)=0 or 2, KSEC4(15)=0 or 1, order being then
+C IORDER=KSEC4(14)+KSEC4(15) ;
+C
+C -implicitly: KSEC4(14)=-1 and/or KSEC4(15)=-1; in such a case
+C a diagnostic is performed to estimate which order
+C should lead to minimaum size.
+C
+C
+C If aggressive packing (HOPER='K') is selected:
+C
+C 1) in a first scan, all allowed sub-functions (see Comments
+C below) are called to compute the length of section 4 they
+C would give, but no coding occurs;
+C
+C 2) in a second phase the most efficient method is applied.
+C
+C If no "complex" method is efficient -or applicable-, then a
+C simple packing is performed.
+C
+C If the field is constant, a simple packing with 0 as number
+C of bits (and no data) is applied, without having to perform
+C the steps mentioned above.
+C
+C Externals.
+C ----------
+C
+C INXBIT - Insert bits into GRIB product.
+C CONFP3 - Convert to IBM floating point format.
+C
+C C2ROWS - Row by row packing.
+C C2CWID - Constant width packing.
+C C2GENE - General WMO second-order packing.
+C + general extended second-order packing.
+C REVERO - Reverse order of even rank rows.
+C C2DOSD - Diagnose/compute order of spatial differencing.
+C D2ROSD - Rebuild original values from spatial differencing.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C On entry, KNSPT points to the first bit of section 4
+C in the GRIB product.
+C On exit, KNSPT points to the first unused bit of section 4,
+C (or to the first bit of section 5, if unused bit count
+C is zero) in the GRIB product.
+C
+C KDATA is overwritten. This is coherent with GRIBEX coding.
+C
+C When aggressive packing is selected (HOPER='K') :
+C
+C 1) If exhaustive second-order packing is on, then all possible
+C methods are attempted; note this may lead to expensive CPU
+C cost. Constant width packing will use iterative search of
+C optimal width, starting from (KSEC4(2)-1), regardless of
+C KSEC4(11) value.
+C
+C Notes:
+C
+C -if extensions switch is not set (disabled by default), then
+C none of the extensions on methods will be promoted;
+C
+C -if extensions switch is on, boustrophedonic ordering is then
+C used in conjunction with relevant methods (all 2nd-order but
+C row by row), provided there is a section 2 and no implicit
+C primary bit-map;
+C
+C -if both extensions and non-local switches are on (both are
+C disabled by default), estimation of best order of spatial
+C differencing is activated for general extended packing.
+C
+C 2) If exhaustive second-order packing is off (default), then
+C only explicitly requested methods are tried. More precisely:
+C
+C -row by row packing (cheapest method, but least effective)
+C is always attempted, except without a section 2
+C or with an implicit primary bit-map;
+C
+C -constant width packing is attempted if KSEC4(10)=0 in input;
+C (with iterative search of optimal width only if KSEC4(11) is
+C negative, using -KSEC4(11) as initial and maximum width)
+C
+C -general 2nd-order packing is attempted if KSEC4(9)=32 in
+C input, or if there is no section 2 or in case of an implicit
+C primary bit-map.
+C
+C -general extended second-order packing is attempted if
+C extensions switch has been set and KSEC4(12)=8 in input.
+C
+C Boustrophedonic ordering is attempted if extensions switch
+C has been set and if KSEC4(13)=4 in input,
+C systematically in conjunction with relevant selected
+C method(s), and provided there is a section 2.
+C
+C Spatial differencing is activated for general extended method
+C if this last method is selected (see above), if non-local
+C switch has been set, and if KSEC4(14) and/or KSEC4(15) is not
+C null. Tuning of order is as described earlier for HOPER='C'.
+C
+C Iterative method used in C2CWID to find an optimal width (that
+C minimise length of section 4) may also be used with HOPER='C',
+C using a negative value for KSEC4(11) in input; -KSEC4(11) is then
+C used as initial and maximum width.
+C
+C Author.
+C -------
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C
+C
+C Modifications.
+C _____________
+C
+C J. Clochard, April 1998.
+C Update comments.
+C For constant width packing, interpret KSEC4(11) negative as
+C request for optimal width search, starting from -KSEC4(11) .
+C When both aggressive mode (HOPER='K') is requested and exhaustive
+C use of 2nd-order packing methods is set, initial width is set to
+C (KSEC4(2)-1) .
+C Fix double computing of work arrays for General WMO 2nd-order,
+C when General extended method is not requested.
+C Introduce spatial differencing.
+C Simplify management of boustrophedonic ordering.
+C
+C J. Clochard, August 1998.
+C Raise JPMXGR from 131071 to 220000 to enable proper processing
+C of satellite images for general method.
+C (i.e. METEOSAT full-disk products, 2500x2500)
+C
+C J. Clochard, September 1998.
+C Suppress KSEC1/KSEC2/KSEC3 arguments in C2CWID/C2GENE calls.
+C Suppress KSEC1/KSEC3 arguments in C2ROWS call.
+C Fix definition of LGENXT to be able to select both general methods
+C in non-exhaustive use of 2nd-order methods.
+C Fix to enforce re-computation of work arrays when general extended
+C method is not worth and spatial differencing is used.
+C Inhibit boustrophedonic ordering also for aggressive packing,
+C when there is no section 2 and/or an implicit bit-map.
+C If dynamical estimation of spatial differencing leads to greater
+C message length than general WMO 2nd-order, retry general exten-
+C ded method without spatial differencing.
+C Adjustment of granularity parameters for general methods and small
+C grids.
+C
+C J. Clochard, June 1999.
+C Simple packing method always available as backup, even in explicit
+C encoding cases (HOPER='C') .
+C Use precomputed array to determine widths . Arguments IPCWID and
+C JPXWID added in C2GENE/C2DOSD/C2ROWS calls .
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JP16SET, JPMXGR, JPXPWR, JPMXGF, JPMETH, JPVSE4, JPWORK
+ INTEGER JPORDR, JPXWID, JPCWID
+C
+C Number of possible packing methods.
+C
+ PARAMETER ( JPMETH=4, JPORDR=3 )
+ PARAMETER ( JP16SET= 2**16-1 )
+C `---> 65535 = FFFF(hex)
+#ifdef JBPW_64
+ PARAMETER ( JPMXGR= 220000, JPXPWR=47, JPVSE4=20 )
+#else
+ PARAMETER ( JPMXGR= 220000, JPXPWR=31, JPVSE4=20 )
+#endif
+ PARAMETER ( JPXWID=(JPXPWR+1)/2 )
+ PARAMETER ( JPCWID=2**JPXWID )
+C
+C Size of work array. Must be at least JPMXGF*4 .
+C
+ PARAMETER ( JPWORK=JPMXGR*4 )
+#ifndef wmogrp2o
+ PARAMETER ( JPMXGF= JPMXGR )
+#else
+C
+C Limit maximum number of groups/first-order values to WMO
+C standard upper limit (descriptor is 16-bit wide).
+C
+ PARAMETER ( JPMXGF=
+ X ( JPMXGR*(JP16SET/JPMXGR) + JP16SET*(JPMXGR/JP16SET) )
+ X / ( (JP16SET/JPMXGR) + (JPMXGR/JP16SET) ) )
+#endif
+C
+C Subroutine arguments.
+C
+ INTEGER KLENP, KLENG, KNSPT, KBITS, KBMAP, KVALS, KLEN, KDEBUG
+ INTEGER KDATA (KLENP), KSEC1 (*), KSEC2 (*), KSEC3 (*), KSEC4 (*)
+ INTEGER KGRIB (KLENG)
+C
+ CHARACTER HOPER * (*)
+C
+ REAL PREF, PMAX
+C
+C Global variables.
+C
+#include "grbcom.h"
+C
+C Local variables.
+C
+ INTEGER IRET, INROWS, J, IROWMK, INSPTA, ILOWMK, IHIGMK, IRETFN
+ INTEGER ILSIMP, IL4OPT, ILMETH, IZERO, ICWORK, IROWBF, ICWIMK, J2
+ INTEGER ICWIBF, ICWIFO, IHWM, INCMIN, IOFF, IROWL4, ICWIL4
+ INTEGER IGENMK, IGENBF, IGENFO, IGENL4, IMINPK, IMETHO, JMETHO
+ INTEGER IMTROW, IMTCWI, IMTGEN, IMTMIN, IMTMAX, ILREFR
+C
+ INTEGER IWORK (JPWORK), IPOWER (0:JPXPWR), ISEC4 (JPVSE4,JPMETH)
+ INTEGER IPCWID (0:JPCWID-1)
+C
+ INTEGER C2ROWS, C2CWID, C2GENE
+ EXTERNAL C2ROWS, C2CWID, C2GENE
+C
+ CHARACTER YOPER*1, YMETHO*30, YREFER*30
+C
+ LOGICAL LROW, LQUASI, LCTWID, LSECBI, LPRIBI, LAGGPK, LSIMPK
+ LOGICAL L1CALL, LSECT2, LLONLY, LCOMGR, LFIRST, LGEN2O, LDEBUG
+ LOGICAL LOPTLN, LGPREC
+ LOGICAL LGENXT, LBOUST, LREVER, LPRCLN, LNLOCP, LNLOCF, LDYNOR
+ LOGICAL LCOMSD, LCBIAS, LVECTD
+C
+ INTEGER IWIDSD, INDCLN, IGXTMK, IGXTBF, IGXTFO, IGXTL4, IBOUST
+ INTEGER IMTGXT, IORDER, ILWORX, IBIAS, IXBITS
+C
+ INTEGER REVERO, C2DOSD, D2ROSD
+ EXTERNAL REVERO, C2DOSD, D2ROSD
+C
+ INTRINSIC ABS
+C
+ REAL ZGAIN
+C
+ SAVE L1CALL, IPOWER, IMTROW, IMTCWI, IMTGEN, IPCWID
+ SAVE IMTGXT
+C
+C Function used to adress 4 sub-parts of array IWORK, using
+C first and last argument to specify sub-part.
+C (4 work arrays are joined together to enable use of a single big
+C work array)
+C
+ INTEGER IXIND, IABCDE, IFGHIJ, IKLMNO
+C
+ IXIND ( IABCDE, IFGHIJ, IKLMNO ) =
+C
+ X IFGHIJ + JPMXGF * ( IKLMNO - 1 + 2 * ( IABCDE - 1 ) )
+C
+ DATA L1CALL / .TRUE. /
+ DATA IMTROW / 1 /
+ DATA IMTCWI / 2 /
+ DATA IMTGEN / 3 /
+ DATA IMTGXT / 4 /
+C
+C -----------------------------------------------------------------
+C* Section 1 . Performs initial checks.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (L1CALL) THEN
+C
+ DO 111 J=0,JPXPWR-1
+C
+ IPOWER(J)=2**J-1
+C
+ 111 CONTINUE
+#ifdef JBPW_64
+ IPOWER(JPXPWR)=140737488355327
+#else
+ IPOWER(JPXPWR)=2147483647
+#endif
+C
+ IPCWID(0)=0
+ IOFF=1
+C
+ DO 113 J=1,JPXWID
+C
+ DO 112 J2=0,IPOWER(J-1)
+C
+ IPCWID(IOFF+J2)=J
+C
+ 112 CONTINUE
+C
+ IOFF=IOFF+IPOWER(J-1)+1
+C
+ 113 CONTINUE
+C
+ L1CALL=.FALSE.
+C
+ ENDIF
+C
+ IRETFN = 0
+ IMETHO=0
+ INSPTA=KNSPT
+ LAGGPK=HOPER.EQ.'K'
+ ILSIMP=11+(1+(KLEN*KSEC4(2)-1)/8)
+ ILSIMP=2*(1+(ILSIMP-1)/2)
+ IL4OPT=ILSIMP
+ LSIMPK=LAGGPK
+ LDEBUG=KDEBUG.GE.1
+ IMINPK=MIN ( 15, MAX ( 2, NINT ( SQRT ( REAL (KLEN/3) ) ) ) )
+C IMINPK=12
+ INCMIN=MIN ( 3, 1 + KLEN/1000 )
+C INCMIN=1
+C
+ LSECT2=KSEC1(5).GE.128
+ LPRIBI=MOD (KSEC1(5),128).GE.64
+#ifndef ebug2o
+C
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9100) HOPER(:1), KNSPT, KSEC4(2), LSECT2,
+ X LPRIBI
+ YREFER='simple packing'
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ LSECBI=KSEC4(9).NE.0
+ LROW=.NOT.LSECBI.AND.KSEC4(12).EQ.0
+ LGENXT=(.NOT.LSECBI.OR.LAGGPK).AND.KSEC4(12).NE.0
+ LBOUST=KSEC4(13).NE.0
+ IORDER=IABS (KSEC4(14))+IABS (KSEC4(15))
+ LNLOCP=IORDER.NE.0
+ LREVER=.FALSE.
+ LGPREC=.FALSE.
+#if (defined CRAY) || (defined FUJITSU)
+ LVECTD=.TRUE.
+#else
+ LVECTD=.FALSE.
+#endif
+ LQUASI=KSEC2(17).EQ.1
+ LCTWID=KSEC4(10).EQ.0
+ LGEN2O=LSECBI.AND.(.NOT.LCTWID.OR.LAGGPK)
+C
+ IF (KSEC4(8).NE.0) THEN
+ IRETFN = 18110
+ WRITE(GRPRSM,FMT=9110)
+ GO TO 900
+ ELSEIF (LROW.OR.LAGGPK) THEN
+C
+ IF (.NOT.LSECT2) THEN
+C
+ IF (LAGGPK) THEN
+ LROW=.FALSE.
+ LGEN2O=.TRUE.
+ ELSE
+ IRETFN = 18120
+ WRITE(GRPRSM,FMT=9120) 'Row by row packing'
+ GO TO 900
+ ENDIF
+C
+ ELSEIF (LPRIBI.AND.KSEC3(1).NE.0) THEN
+C
+ IF (LAGGPK) THEN
+ LROW=.FALSE.
+ LGEN2O=.TRUE.
+ ELSE
+ IRETFN = 18130
+ WRITE(GRPRSM,FMT=9130)
+ S 'Row by row', 'implicit primary bit-map'
+ GO TO 900
+ ENDIF
+C
+ ELSE
+C
+ LROW=LROW.OR.LAGGPK
+C
+ ENDIF
+C
+ ENDIF
+C
+ IF (LCTWID) THEN
+C
+ IF (LROW.AND..NOT.LAGGPK) THEN
+ IRETFN = 18135
+ WRITE(GRPRSM,FMT=9130)
+ S 'Row by row', 'constant width'
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ LCTWID=LCTWID.OR.(LAGGPK.AND.NUM2OK.EQ.1)
+ LGEN2O=LGEN2O.OR.(LAGGPK.AND.NUM2OK.EQ.1)
+C
+ IF (KSEC4(12).NE.0.AND.NEXT2O.EQ.1.AND..NOT.LAGGPK) THEN
+C
+C General extended second-order packing explicitly requested.
+C
+ IF (KSEC4(12).NE.8) THEN
+ IRETFN = 18140
+ WRITE(GRPRSM,FMT=9140) 12, 8
+ GO TO 900
+ ELSEIF (LSECBI) THEN
+ IRETFN = 18145
+ WRITE(GRPRSM,FMT=9150) 'no secondary bit-map'
+ GO TO 900
+ ELSEIF (LCTWID) THEN
+ IRETFN = 18150
+ WRITE(GRPRSM,FMT=9150) 'variable group widthes'
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ LGENXT=NEXT2O.EQ.1.AND.(LGENXT.OR.(LAGGPK.AND.NUM2OK.EQ.1))
+C
+ IF (KSEC4(13).NE.0.AND.NEXT2O.EQ.1.AND..NOT.LAGGPK) THEN
+C
+C Boustrophedonic ordering explicitly requested.
+C
+ IF (KSEC4(13).NE.4) THEN
+ IRETFN = 18151
+ WRITE(GRPRSM,FMT=9140) 13, 4
+ GO TO 900
+ ELSEIF (.NOT.LSECT2) THEN
+ IRETFN = 18152
+ WRITE(GRPRSM,FMT=9120) 'Boustrophedonic ordering'
+ GO TO 900
+ ELSEIF (LROW) THEN
+ WRITE(GRPRSM,FMT=9153)
+ KSEC4(13)=0
+ LBOUST=.FALSE.
+ ELSEIF (LPRIBI.AND.KSEC3(1).NE.0) THEN
+ IRETFN = 18154
+ WRITE(GRPRSM,FMT=9130)
+ S 'Boustrophedonic ordering', 'implicit primary bit-map'
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ LBOUST=NEXT2O.EQ.1.AND.(LBOUST.OR.(LAGGPK.AND.NUM2OK.EQ.1)).AND.
+ S LSECT2.AND.(.NOT.LPRIBI.OR.KSEC3(1).EQ.0)
+C
+#ifndef ebug2o
+ IF (LDEBUG) THEN
+#endif
+ PRINT *,'C2ORDR: LBOUST/LNLOCP/LAGGPK=',
+ S LBOUST, LNLOCP, LAGGPK
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ IF (LNLOCP.AND.NEXT2O.EQ.1.AND.NLOC2O.EQ.1.AND..NOT.LAGGPK) THEN
+C
+C Spatial differencing explicitly requested.
+C
+ IF (KSEC4(14).NE.2.AND.KSEC4(14).NE.0.AND.KSEC4(14).NE.-1) THEN
+ IRETFN = 18154
+ WRITE(GRPRSM,FMT=9155) 14, 2
+ GO TO 900
+ ELSEIF (ABS (KSEC4(15)).NE.1.AND.KSEC4(15).NE.0) THEN
+ IRETFN = 18155
+ WRITE(GRPRSM,FMT=9155) 15, 1
+ GO TO 900
+ ELSEIF (.NOT.LGENXT) THEN
+ WRITE(GRPRSM,FMT=9156)
+ KSEC4(14)=0
+ KSEC4(15)=0
+ IORDER=0
+ LNLOCP=.FALSE.
+ ENDIF
+C
+ ENDIF
+C
+ LNLOCF=NEXT2O.EQ.1.AND.NLOC2O.EQ.1.AND.
+ S (LNLOCP.OR.(LGENXT.AND.LAGGPK.AND.NUM2OK.EQ.1))
+C
+ IF (LNLOCF.AND..NOT.LNLOCP) THEN
+C
+C Spatial differencing implicitly requested.
+C Activation of iterative search for best order.
+C
+ KSEC4(14)=-1
+ KSEC4(15)=-1
+ ENDIF
+C
+ LNLOCP=LNLOCF
+C
+ IF (.NOT.LNLOCP) THEN
+ IORDER=0
+ ENDIF
+C
+ IF (KSEC4(2).GT.JPXPWR) THEN
+C
+ IRETFN = 18160
+ WRITE(GRPRSM,FMT=9160) KSEC4(2), JPXPWR
+ GO TO 900
+C
+ ELSEIF (LCTWID) THEN
+C
+ IF (ABS (KSEC4(11)).GE.KSEC4(2)) THEN
+C
+ IF (LAGGPK) THEN
+ KSEC4(11)=-(KSEC4(2)-1)
+ ELSE
+ IRETFN = 18170
+ WRITE(GRPRSM,FMT=9170) KSEC4(11), KSEC4(2)-1
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ ENDIF
+C
+ IF (PMAX.LE.PREF.AND.LAGGPK) THEN
+C
+C Field is constant... code it with zero as bit-number,
+C and nothing else!
+C
+C Enforce right values for flags.
+C
+ KSEC4(4)=0
+ KSEC4(6)=0
+C
+C* Octet 11 : Number of bits containing each first-order value.
+C One 8 bit field.
+C
+#ifndef ebug2o
+ IF (LDEBUG) THEN
+C
+#endif
+ WRITE(GRPRSM,FMT=9175) PMAX
+ IL4OPT=12
+ YREFER='direct method'
+C
+C Switch off LSIMPK to enable printout of gain.
+C
+ LSIMPK=.FALSE.
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ IZERO=0
+ YOPER='C'
+ KNSPT=KNSPT+10*8
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS, 8,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 18180
+ WRITE(GRPRSM,FMT=9001) 'bit number'
+ ENDIF
+C
+ GO TO 900
+C
+ ENDIF
+C
+ IF (LSECT2) THEN
+C
+ IF (MOD (KSEC2(11),64).LT.32) THEN
+ INROWS=KSEC2(3)
+ ELSE
+ INROWS=KSEC2(2)
+ ENDIF
+C
+#ifndef ebug2o
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9180) INROWS, KLEN, LQUASI
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ IF (.NOT.LPRIBI.AND.KLEN.NE.KSEC4(1)) THEN
+ IRETFN = 18185
+ WRITE(GRPRSM,FMT=9185) KLEN, KSEC4(1)
+ GO TO 900
+ ELSEIF (LPRIBI.AND.(KLEN.LE.0.OR.KLEN.GT.KSEC4(1))) THEN
+ IRETFN = 18187
+ WRITE(GRPRSM,FMT=9187) KLEN, KSEC4(1)
+ GO TO 900
+ ELSEIF (LROW.AND.INROWS.GT.JPMXGF) THEN
+C
+ IF (LAGGPK) THEN
+ LROW=.FALSE.
+ ELSE
+ IRETFN = 18190
+ WRITE(GRPRSM,FMT=9190) INROWS, JPMXGF
+ GO TO 900
+ ENDIF
+#ifndef wmogrp2o
+C
+ ELSEIF (LPRIBI.AND.KSEC3(1).NE.0.AND.KLEN.GT.JP16SET) THEN
+C
+C Such a case would lead to no possibility to recover the right
+C number of grid points when decoding through D2ORDR routine.
+C
+ IRETFN = 18192
+ WRITE(GRPRSM,FMT=9192) JP16SET
+ GO TO 900
+#endif
+C
+ ENDIF
+C
+ ENDIF
+C
+ IF (.NOT.(LROW.OR.LCTWID.OR.LGEN2O.OR.LGENXT.OR.LSIMPK)) THEN
+ WRITE(GRPRSM,FMT=9195)
+ LSIMPK=.TRUE.
+ GO TO 600
+ ENDIF
+C
+ LLONLY=LAGGPK
+ ILOWMK=JPMXGF+1
+ IHIGMK=0
+ IROWMK=0
+ ICWIMK=1
+ IGENMK=1
+ IGXTMK=1
+ LFIRST=.TRUE.
+
+C Copy KSEC4 for all possible methods.
+C
+ IF (LROW) THEN
+ IMTMIN=IMTROW
+ IMTMAX=IMTROW
+ ELSE
+ IMTMIN=JPMETH
+ IMTMAX=1
+ ENDIF
+C
+ IF (LCTWID) THEN
+ IMTMIN=MIN (IMTCWI,IMTMIN)
+ IMTMAX=MAX (IMTCWI,IMTMAX)
+ ENDIF
+C
+ IF (LGEN2O) THEN
+ IMTMIN=MIN (IMTGEN,IMTMIN)
+ IMTMAX=MAX (IMTGEN,IMTMAX)
+ ENDIF
+C
+ IF (LGENXT) THEN
+ IMTMIN=MIN (IMTGXT,IMTMIN)
+ IMTMAX=MAX (IMTGXT,IMTMAX)
+ ENDIF
+C
+ DO 122 JMETHO=IMTMIN,IMTMAX
+C
+ DO 121 J=1,JPVSE4
+ ISEC4(J,JMETHO)=KSEC4(J)
+ 121 CONTINUE
+C
+ 122 CONTINUE
+C
+ IF (LBOUST.AND.IMTMIN.EQ.IMTROW.AND.IMTMAX.EQ.IMTROW) THEN
+C
+C This might be the case in aggressive packing mode.
+C
+ WRITE(GRPRSM,FMT=9153)
+ KSEC4(13)=0
+ LBOUST=.FALSE.
+ ENDIF
+C
+ IF (LBOUST) THEN
+C
+ IBOUST=4
+C
+C Reverse field ordering for even rank rows.
+C
+C This is done before trying any method or sub-method,
+C for better prognosis of non-local packing interest
+C (if requested). It allows also more simple source code.
+C
+C There is no influence on trial of row by row packing,
+C because work arrays computed through C2ROWS with LLONLY set
+C to .TRUE. do not depend on field ordering within each row.
+C
+C The only case where field ordering might have to be restored
+C would be in aggressive packing mode, if either row by row
+C or simple packing was found more efficient than all the other
+C 2nd-order methods selected/allowed... Probability of such a
+C case is low, but source code enables it.
+C
+C Apart from that, the only side effect of this anticipated call
+C to REVERO is, when row by row packing is enabled
+C (as in exhaustive mode), to compute twice the lengths of rows.
+C This is considered as a cheap overhead.
+C
+ LPRCLN=.FALSE.
+C
+ IRETFN = REVERO ( KDATA, KLENP, KSEC2, KGRIB, KLENG,
+ X KBITS, KBMAP, KVALS, LPRIBI, LQUASI,
+ X INROWS, KLEN, IWORK(IXIND (2,1,2)),
+ X JPMXGF, LDEBUG, LPRCLN, IWORK(IXIND (2,1,1)) )
+C
+ IF (IRETFN.NE.0) THEN
+ GO TO 900
+ ENDIF
+C
+ LREVER=.TRUE.
+C
+ ELSE
+C
+ IBOUST=0
+C
+ ENDIF
+C
+ DO 123 JMETHO=IMTMIN,IMTMAX
+ ISEC4(13,JMETHO)=IBOUST
+ 123 CONTINUE
+C
+ LDYNOR=LNLOCP.AND.(KSEC4(14).EQ.-1.OR.KSEC4(15).EQ.-1)
+C
+ IF (LDYNOR) THEN
+C
+C Estimate interest of non-local packing use, and order
+C associated to.
+C
+C In non-agressive mode (HOPER='C'), field is also transformed.
+C
+ LCOMSD=.NOT.LAGGPK
+ LCBIAS=.TRUE.
+ IORDER = C2DOSD ( KDATA, KLENP, KSEC4, LCOMSD, KLEN,
+ X IWORK, JPWORK, IPOWER, JPXPWR, IPCWID,
+ X JPXWID, IMINPK, ILWORX, IBIAS, IWIDSD,
+ X IXBITS, LCBIAS, LDEBUG )
+ LCBIAS=.FALSE.
+C
+ ELSE
+C
+ LCOMSD=.FALSE.
+ LCBIAS=.TRUE.
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 2 . Row by row packing method applied, or tried.
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+#ifndef ebug2o
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9200) LROW, LCTWID, LGEN2O, LGENXT, LBOUST,
+ X IORDER, LSIMPK
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ IF (LROW) THEN
+C
+C Upper part of work sub-arrays IWORK(IXIND (1,.,1)),
+C IWORK(IXIND (2,.,1)), IWORK(IXIND (1,.,2))
+C -reference values, effective row lengths, row widths- is used;
+C useful for aggressive packing, if row by row packing turns
+C to be selected as the appropriate method to apply, and if total
+C work space needed by the other methods do not overlap.
+C
+ IMETHO=IMTROW
+ IROWMK=JPMXGF-INROWS+1
+ ILOWMK=IROWMK
+ LCOMGR=LFIRST.OR.IROWMK.LE.IHIGMK
+C
+ IF (LREVER.AND..NOT.LFIRST) THEN
+C
+C Restore initial field ordering.
+C
+ LPRCLN=.NOT.LCOMGR
+C
+ IRETFN = REVERO ( KDATA, KLENP, KSEC2, KGRIB, KLENG,
+ X KBITS, KBMAP, KVALS, LPRIBI, LQUASI,
+ X INROWS, KLEN, IWORK(IXIND (2,1,2)),
+ X JPMXGF, LDEBUG, LPRCLN,
+ X IWORK(IXIND (2,IROWMK,1)) )
+C
+ IF (IRETFN.NE.0) THEN
+ GO TO 900
+ ENDIF
+C
+ LREVER=.FALSE.
+C
+ ENDIF
+C
+C Enforce no extension at all, and especially
+C no boustrophedonic ordering for row by row (useless).
+C
+ DO 201 J=12,15
+ ISEC4(J,IMETHO)=0
+ 201 CONTINUE
+C
+ IRET = C2ROWS ( KDATA, KLENP, KSEC2, ISEC4(1,IMETHO),KGRIB,
+ X KLENG, KNSPT, KBITS, LCOMGR, LLONLY, IROWL4,
+ X KBMAP, KVALS, LPRIBI, LQUASI, INROWS, KLEN,
+ X IWORK(IXIND (1,IROWMK,1)),
+ X IWORK(IXIND (2,IROWMK,1)),
+ X IWORK(IXIND (1,IROWMK,2)),
+ X IWORK(IXIND (2,1,2)), JPMXGF, IPOWER, JPXPWR,
+ X IPCWID, JPXWID, IROWBF, LDEBUG )
+C
+ IF (LLONLY) THEN
+C
+#ifndef ebug2o
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9210) IRET, IROWBF, IROWL4, IL4OPT
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ IF (IRET.NE.0.OR.IROWL4.GE.IL4OPT) THEN
+ LROW=.FALSE.
+C
+ IF (IRET.NE.0.AND.LBOUST) THEN
+C
+C Reset IROWMK to avoid possible misuse of length array
+C in REVERO.
+C
+ IROWMK=0
+ ENDIF
+C
+ ELSE
+ IL4OPT=IROWL4
+ LSIMPK=.FALSE.
+ ENDIF
+C
+ ELSEIF (IRET.NE.0) THEN
+C
+ IRETFN = IRET
+ GO TO 900
+C
+ ENDIF
+C
+#ifdef ebug2o
+ IF (.NOT.LLONLY) THEN
+#else
+ IF (LDEBUG.AND..NOT.LLONLY) THEN
+#endif
+C
+ YMETHO='Row by row'
+ IL4OPT=IROWL4
+C
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 3 . Constant width packing method applied, or tried.
+C -----------------------------------------------------------------
+C
+ IF (LCTWID) THEN
+C
+ IMETHO=IMTCWI
+ ILOWMK=MIN (ICWIMK,ILOWMK)
+ LCOMGR=LFIRST.OR.ICWIMK.LE.IHIGMK
+C
+ IF (LCOMGR) THEN
+ ICWIMK=1
+ ICWORK=1
+ ENDIF
+C
+ IF (LLONLY.AND.NUM2OK.EQ.1) THEN
+C
+C Modulates width use, regardless of KSEC4(11).
+C
+ IF (LGENXT) THEN
+C
+C Experience shows that the only cases where constant width packing
+C may compress data better than general extended method are for a
+C null width.
+C
+ ISEC4(11,IMETHO)=0
+ ELSE
+ ISEC4(11,IMETHO)=-(ISEC4(2,IMETHO)-1)
+ ENDIF
+C
+ ENDIF
+C
+ LOPTLN=LFIRST.AND.ISEC4(11,IMETHO).LT.0
+C
+C Enforce no extension flag, except boustrophedonic ordering.
+C
+ ISEC4(12,IMETHO)=0
+ ISEC4(14,IMETHO)=0
+ ISEC4(15,IMETHO)=0
+C
+ IRET = C2CWID ( KDATA, KLENP, ISEC4(1,IMETHO),KGRIB, KLENG,
+ X KNSPT, KBITS, LCOMGR, LLONLY, ICWIL4, ICWIFO,
+ X KLEN, IWORK(IXIND(1,1,1)),
+ X IWORK(IXIND(2,1,1)), JPMXGF, ICWIMK, IPOWER,
+ X JPXPWR, ICWIBF, INCMIN, IHWM, ICWORK, LDEBUG,
+ X LOPTLN )
+C
+ IF (LLONLY) THEN
+C
+#ifndef ebug2o
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9310) IRET, ICWIBF, ICWIL4, IL4OPT,
+ X ICWIFO, IHWM, ICWORK
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ IF (IRET.NE.0.OR.ICWIL4.GE.IL4OPT) THEN
+ LCTWID=.FALSE.
+ IHIGMK=MAX (IHIGMK,IHWM)
+ ELSE
+C
+C Constant width packing better than simple packing,
+C and possibly row by row.
+C
+ IL4OPT=ICWIL4
+ LSIMPK=.FALSE.
+ LROW=.FALSE.
+C
+ IF (LGEN2O.OR.LGENXT) THEN
+C
+C Push up useful work arrays, trying to keep data if further
+C method(s) tried are not better.
+C
+ IOFF=JPMXGF-ICWIFO
+ ICWIMK=IOFF+1
+ IHIGMK=0
+C
+#ifdef CRAY
+CDIR$ IVDEP
+#endif
+#ifdef FUJITSU
+!OCL NOVREC
+#endif
+ DO 311 J=ICWIFO,1,-1
+ IWORK(IXIND (1,IOFF+J,ICWORK))=IWORK(IXIND (1,J,ICWORK))
+ IWORK(IXIND (2,IOFF+J,ICWORK))=IWORK(IXIND (2,J,ICWORK))
+ 311 CONTINUE
+C
+ ENDIF
+C
+ ENDIF
+C
+ ELSEIF (IRET.NE.0) THEN
+C
+ IRETFN = IRET
+ GO TO 900
+C
+ ENDIF
+C
+#ifdef ebug2o
+ IF (.NOT.LLONLY) THEN
+#else
+ IF (LDEBUG.AND..NOT.LLONLY) THEN
+#endif
+C
+ WRITE (UNIT=YMETHO,FMT=9320) ISEC4(11,IMETHO)
+ IL4OPT=ICWIL4
+C
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 4 . General 2nd-order packing method applied, or tried.
+C -----------------------------------------------------------------
+C
+ IF (LGEN2O) THEN
+C
+ IMETHO=IMTGEN
+ ILOWMK=MIN (IGENMK,ILOWMK)
+ LCOMGR=.NOT.LGPREC
+C
+ IF (LCOMGR) THEN
+ IGENMK=1
+ ENDIF
+C
+C Enforce no extension flag, except boustrophedonic ordering.
+C
+ ISEC4(12,IMETHO)=0
+ ISEC4(14,IMETHO)=0
+ ISEC4(15,IMETHO)=0
+C
+ IRET = C2GENE ( KDATA, KLENP, ISEC4(1,IMETHO),KGRIB, KLENG,
+ X KNSPT, KBITS, LCOMGR, LLONLY, IGENL4, IGENFO,
+ X KLEN, IWORK(IXIND (1,1,1)),
+ X IWORK(IXIND (2,1,1)), IWORK(IXIND (1,1,2)),
+ X IWORK(IXIND (2,1,2)), JPMXGF, IGENMK, IPOWER,
+ X JPXPWR, IPCWID, JPXWID, IGENBF, INCMIN, IMINPK,
+ X IHWM, LDEBUG )
+C
+ IF (LLONLY) THEN
+C
+#ifndef ebug2o
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9410) IRET, IGENBF, IGENL4, IL4OPT,
+ X IGENFO, IHWM
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ IF (IRET.NE.0.OR.IGENL4.GE.IL4OPT) THEN
+ LGEN2O=.FALSE.
+ ELSE
+C
+C General 2nd-order packing better than simple packing,
+C and possibly row by row and/or constant width.
+C
+ IL4OPT=IGENL4
+ LSIMPK=.FALSE.
+ LROW=.FALSE.
+ LCTWID=.FALSE.
+C
+ ENDIF
+C
+ IHIGMK=MAX (IHIGMK,IHWM)
+ LGPREC=IRET.EQ.0
+C
+ IF (LGPREC.AND.LGENXT) THEN
+C
+C Duplicate descriptors for further use by
+C general extended packing trial.
+C
+ IGXTBF=IGENBF
+ IGXTFO=IGENFO
+ IGXTMK=IGENMK
+C
+ ENDIF
+C
+ ELSEIF (IRET.NE.0) THEN
+C
+ IRETFN = IRET
+ GO TO 900
+C
+ ENDIF
+C
+#ifdef ebug2o
+ IF (.NOT.LLONLY) THEN
+#else
+ IF (LDEBUG.AND..NOT.LLONLY) THEN
+#endif
+C
+ YMETHO='General second-order'
+ IL4OPT=IGENL4
+C
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 5 . General extended 2nd-order packing method applied,
+C or tried.
+C -----------------------------------------------------------------
+C
+ IF (LGENXT) THEN
+C
+ IMETHO=IMTGXT
+ ILOWMK=MIN (IGXTMK,ILOWMK)
+ LCOMGR=.NOT.LGPREC.OR.(LFIRST.AND.LNLOCP)
+C
+ 510 CONTINUE
+C
+ IF (LCOMGR) THEN
+ IGXTMK=1
+ ELSEIF (LFIRST) THEN
+C
+C Inherit total length of second-order values from general WMO
+C second-order packing, performed just previously.
+C
+ ISEC4(19,IMETHO)=ISEC4(19,IMTGEN)
+ ENDIF
+C
+ ISEC4(12,IMETHO)=8
+ ISEC4(14,IMETHO)=2*(IORDER/2)
+ ISEC4(15,IMETHO)=MOD (IORDER,2)
+C
+ IF (IORDER.NE.0.AND..NOT.LCOMSD) THEN
+C
+C Spatial differencing has to be applied to field.
+C
+ LCOMSD=.TRUE.
+ IORDER = C2DOSD ( KDATA, KLENP, ISEC4(1,IMETHO), LCOMSD,
+ S KLEN, IWORK, JPWORK, IPOWER, JPXPWR,
+ S IPCWID, JPXWID, IMINPK, ILWORX, IBIAS,
+ S IWIDSD, IXBITS, LCBIAS, LDEBUG )
+C
+C Reset ISEC4, because C2DOSD may have reset IORDER.
+C
+ ISEC4(14,IMETHO)=2*(IORDER/2)
+ ISEC4(15,IMETHO)=MOD (IORDER,2)
+C
+ ENDIF
+C
+ IF (IORDER.NE.0) THEN
+ ISEC4( 2,IMETHO)=IXBITS
+ ISEC4(11,IMETHO)=IWIDSD
+ ISEC4(16,IMETHO)=IBIAS
+ ENDIF
+C
+ IRET = C2GENE ( KDATA, KLENP, ISEC4(1,IMETHO),KGRIB, KLENG,
+ X KNSPT, KBITS, LCOMGR, LLONLY, IGXTL4, IGXTFO,
+ X KLEN, IWORK(IXIND (1,1,1)),
+ X IWORK(IXIND (2,1,1)), IWORK(IXIND (1,1,2)),
+ X IWORK(IXIND (2,1,2)), JPMXGF, IGXTMK, IPOWER,
+ X JPXPWR, IPCWID, JPXWID, IGXTBF, INCMIN, IMINPK,
+ X IHWM, LDEBUG )
+C
+ IF (LLONLY) THEN
+C
+#ifndef ebug2o
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9510) IRET, IGXTBF, IGXTL4, IL4OPT,
+ X IGXTFO, IHWM, IORDER
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ IF (IRET.NE.0.OR.IGXTL4.GE.IL4OPT) THEN
+C
+C Current method is not successful, and has to be discarded.
+C
+ LGENXT=.FALSE.
+C
+ IF (IRET.NE.0.OR..NOT.LGEN2O) THEN
+ LGPREC=.FALSE.
+ ELSE
+ LGPREC=IGXTFO.EQ.IGENFO.AND.IORDER.EQ.0
+ ENDIF
+C
+ IF (LCOMSD.AND.IORDER.NE.0) THEN
+C
+C Spatial differencing has to be reversed.
+C
+ IRETFN = D2ROSD ( KDATA, KLEN, IORDER, IPOWER, JPXPWR,
+ S IBIAS, LVECTD, LDEBUG )
+C
+ IF (IRETFN.NE.0) THEN
+ GO TO 900
+ ENDIF
+C
+ LCOMSD=.FALSE.
+C
+ IF (LGEN2O.AND.LDYNOR) THEN
+C
+C General WMO 2nd-order packing was also selected/promoted, and is
+C the best method. This indicates moreless wrong diagnostic for
+C spatial differencing order.
+C Retry then general extended packing without spatial differencing,
+C that in almost all cases behaves better than general WMO method.
+C
+#ifndef ebug2o
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9520) IORDER
+#ifndef ebug2o
+ ENDIF
+C
+ IORDER=0
+ LGENXT=.TRUE.
+ LGPREC=.FALSE.
+ LCOMGR=.TRUE.
+ ISEC4(2,IMETHO)=KSEC4(2)
+ GOTO 510
+C
+ ENDIF
+C
+ ENDIF
+C
+ ELSE
+C
+C General extended 2nd-order packing better than simple packing,
+C and possibly other methods.
+C
+ IL4OPT=IGXTL4
+ LSIMPK=.FALSE.
+ LROW=.FALSE.
+ LCTWID=.FALSE.
+ LGEN2O=.FALSE.
+ LGPREC=.TRUE.
+C
+ ENDIF
+C
+ IHIGMK=MAX (IHIGMK,IHWM)
+C
+ ELSEIF (IRET.NE.0) THEN
+C
+ IRETFN = IRET
+ GO TO 900
+C
+ ENDIF
+C
+#ifdef ebug2o
+ IF (.NOT.LLONLY) THEN
+#else
+ IF (LDEBUG.AND..NOT.LLONLY) THEN
+#endif
+C
+ YMETHO='Gen.extend.2nd-order'
+ IL4OPT=IGXTL4
+C
+ ENDIF
+C
+ ENDIF
+#endif
+C
+C -----------------------------------------------------------------
+C* Section 6 . Effective in case of aggressive packing only.
+C -----------------------------------------------------------------
+C
+ 600 CONTINUE
+C
+ IF (LSIMPK) THEN
+C
+C Simple packing by default: complex packing not efficient,
+C or not applicable.
+C
+C The first 10 octets have already been coded by GRIBEX, or will
+C be in a further step of GRIBEX:
+C Length of section, flags+unused bit count, binary scale factor,
+C reference value.
+C
+C Enforce right values for flags.
+C
+ KSEC4(4)=0
+ KSEC4(6)=0
+ IMETHO=0
+ YMETHO='Simple'
+C
+C* Octet 11 : Number of bits containing each first-order value.
+C One 8 bit field.
+C
+ YOPER='C'
+ KNSPT=KNSPT+10*8
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC4(2),1,KBITS, 8,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 18610
+ WRITE(GRPRSM,FMT=9001) 'bit number'
+ GO TO 900
+ ENDIF
+C
+ IF (LREVER) THEN
+C
+C Restore initial field ordering.
+C
+ LPRCLN=(LFIRST.AND.LROW).OR.IROWMK.GT.IHIGMK
+ INDCLN=MAX (IROWMK,1)
+C
+ IRETFN = REVERO ( KDATA, KLENP, KSEC2, KGRIB, KLENG,
+ X KBITS, KBMAP, KVALS, LPRIBI, LQUASI,
+ X INROWS, KLEN, IWORK(IXIND (2,1,2)),
+ X JPMXGF, LDEBUG, LPRCLN,
+ X IWORK(IXIND (2,INDCLN,1)) )
+C
+ IF (IRETFN.NE.0) THEN
+ GO TO 900
+ ENDIF
+C
+ LREVER=.NOT.LREVER
+ ENDIF
+C
+C* Octet 12 - onwards: Data.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KDATA,KLEN,KBITS,KSEC4(2),
+ X YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 18620
+ WRITE(GRPRSM,FMT=9001) 'normalized data'
+ GO TO 900
+ ENDIF
+C
+ ELSEIF (LLONLY) THEN
+C
+C Loop back to apply the most efficient second-order method,
+C as previously diagnosed. And hoping work arrays have not
+C been overwritten, to avoid computing them again.
+C
+ LLONLY=.FALSE.
+ LFIRST=.FALSE.
+ GOTO 200
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 7 . Debugging printout.
+C -----------------------------------------------------------------
+C
+ 700 CONTINUE
+C
+#ifndef ebug2o
+ IF (LDEBUG) THEN
+C
+#endif
+ ILMETH=INDEX (YMETHO//' ',' ')-1
+ WRITE(GRPRSM,FMT=9710) HOPER(:1), YMETHO(:ILMETH), IL4OPT
+C
+ IF (.NOT.LSIMPK) THEN
+C
+ IF (LBOUST.AND..NOT.LROW) THEN
+ WRITE(GRPRSM,FMT=9720)
+ ENDIF
+C
+ IF (LGENXT.AND.IORDER.NE.0) THEN
+ WRITE(GRPRSM,FMT=9730) IORDER
+ ENDIF
+C
+ ZGAIN=REAL (100*(ILSIMP-IL4OPT)) / REAL (ILSIMP)
+ ILREFR=INDEX (YREFER//' ',' ')-1
+ WRITE(GRPRSM,FMT=9002) YREFER(:ILREFR), ZGAIN
+C
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+C If second-order method was effectively and successfully used,
+C copy back information of section 4 descriptors to KSEC4.
+C
+ IF (IRETFN.NE.0.AND.IMETHO.NE.0) THEN
+C
+ DO 901 J=1,JPVSE4
+ KSEC4(J)=ISEC4(J,IMETHO)
+ 901 CONTINUE
+C
+ ENDIF
+C
+ C2ORDR = IRETFN
+#ifndef ebug2o
+C
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9900) IRETFN, HOPER(:1), KNSPT
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ RETURN
+C
+ 9001 FORMAT (' C2ORDR: Problem inserting ',A,'.')
+C
+ 9002 FORMAT (' C2ORDR: Gain on section 4 length against ',A,':',
+ X F5.1,' %.')
+C
+ 9100 FORMAT (' C2ORDR: Function start, HOPER = ',A1,', KNSPT =',I10,
+ X '.',/,' C2ORDR: Original number of bits =',I3,'.',/,
+ X ' C2ORDR: Presence of sections 2 and 3 = ',L1,' and ',
+ X L1,'.')
+C
+ 9110 FORMAT (' C2ORDR: Matrix of values invalid here.')
+C
+ 9120 FORMAT (' C2ORDR: ',A,' only supported with a section 2.')
+ 9130 FORMAT (' C2ORDR: ',A,'/',A,': not supported.')
+ 9131 FORMAT (' C2ORDR: Approx. s4 length, ',A,',',I3,
+ X '-length groups:',I9,'.')
+ 9132 FORMAT (' C2ORDR: Range diagnostic is ',A,
+ X ' of spatial differences, order',I2,'.')
+ 9133 FORMAT (' C2ORDR: Selected order:',I2,', range diagnostics:',
+ X 4I8,'.')
+ 9140 FORMAT (' C2ORDR: KSEC4(',I2,') must be 0 or ',I2,'.')
+ 9150 FORMAT (' C2ORDR: General extended packing implies ',A,'.')
+ 9153 FORMAT (' C2ORDR: Boustrophedonic ordering ignored with ',
+ X 'row by row packing.')
+ 9155 FORMAT (' C2ORDR: KSEC4(',I2,') must be 0, -1 or ',I2,'.')
+ 9156 FORMAT (' C2ORDR: Spatial differencing ignored without ',
+ X 'general extended 2nd-order packing.')
+ 9160 FORMAT (' C2ORDR: Bits number =',I3,' - maximum allowed =',I3,
+ X '.')
+ 9170 FORMAT (' C2ORDR: Constant width =',I3,
+ X ' - out of range [-/+',I2,'(=KSEC4(2)-1)].')
+ 9175 FORMAT (' C2ORDR: Constant field, value = ',F30.20,'.')
+ 9180 FORMAT (' C2ORDR: INROWS =',I6,', KLEN =',I9,', LQUASI = ',L1,
+ X '.')
+ 9185 FORMAT (' C2ORDR: Inconsistency: total g.p. number =',I9,
+ X ' expected =',I9,'.')
+ 9187 FORMAT (' C2ORDR: ',I9,' bits set in primary bit-map -',
+ X ' not in range [1,KSEC4(1)=',I9,'].')
+ 9190 FORMAT (' C2ORDR: Too much rows:',I6,' exceeds work space:',I6,
+ X '.')
+#ifndef wmogrp2o
+ 9192 FORMAT (' C2ORDR: Implicit 1ary bit-map/g.p. number >',I6,
+ X ': unsupported.')
+#endif
+ 9195 FORMAT (' C2ORDR: No packing method selected or applicable.',
+ X ' C2ORDR: Simple packing applied as backup.')
+C
+ 9200 FORMAT (' C2ORDR: LROW=',L1,', LCTWID=',L1,', LGEN2O=',L1,
+ X ', LGENXT=',L1,', LBOUST=',L1,', IORDER=',I1,
+ X ', LSIMPK=',L1,'.')
+C
+ 9210 FORMAT (' C2ORDR: (row by row) IRET, IROWBF, IROWL4, IL4OPT=',
+ X I6,I3,I9,I9,'.')
+C
+ 9310 FORMAT (' C2ORDR: (cons.width) IRET, ICWIBF, ICWIL4, IL4OPT=',
+ X I6,I3,I9,I9,'.',/,
+ X ' C2ORDR: ICWIFO, IHWM, ICWORK=',2I8,I2,'.')
+C
+ 9320 FORMAT ('Constant width (',I2,')')
+C
+ 9410 FORMAT (' C2ORDR: (general 2o) IRET, IGENBF, IGENL4, IL4OPT=',
+ X I6,I3,I9,I9,'.',/,
+ X ' C2ORDR: IGENFO, IHWM=',2I8,'.')
+C
+ 9510 FORMAT (' C2ORDR: (gen.extend) IRET, IGXTBF, IGXTL4, IL4OPT=',
+ X I6,I3,I9,I9,'.',/,
+ X ' C2ORDR: IGXTFO, IHWM, IORDER=',2I8,I2,'.')
+ 9520 FORMAT (' C2ORDR: Non-optimal spatial differencing at order',I2,
+ X ', general 2o is better...',/,
+ X' C2ORDR: .. retrying gen.extend. without spatial differencing.')
+C
+ 9710 FORMAT (' C2ORDR: HOPER = ',A1,' - ',A,
+ X ' packing applied, IL4OPT =',I9,'.')
+ 9720 FORMAT (' C2ORDR: Boustrophedonic ordering has been used.')
+ 9730 FORMAT (' C2ORDR: Spatial differencing applied, order is',I2,'.')
+C
+ 9900 FORMAT (' C2ORDR: Function return code =',I6,' HOPER = ',A,
+ X ', KNSPT =',I10,'.')
+C
+ END
diff --git a/gribex/c2pack.F b/gribex/c2pack.F
new file mode 100755
index 0000000..b008383
--- /dev/null
+++ b/gribex/c2pack.F
@@ -0,0 +1,761 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION C2PACK ( KDATA, KLENP, KSEC4, KGRIB, KLENG,
+ X KNSPT, KBITS, KLEN, KREFGR, KLENGR,
+ X KBITGR, KWORK, KLWORK, KPOWER, KMXPWR,
+ X KNBIFO, ODEBUG )
+C
+C---->
+C**** C2PACK
+C
+C Purpose.
+C --------
+C
+C Packs end of GRIB section 4 (except final padding)
+C for second-order packing methods, and computes some descriptors.
+C
+C
+C** Interface.
+C ----------
+C
+C KRET = C2PACK ( KDATA, KLENP, KSEC4, KGRIB, KLENG, KNSPT,
+C X KBITS, KLEN, KREFGR, KLENGR, KBITGR, KWORK,
+C X KLWORK, KPOWER, KMXPWR, KNBIFO, ODEBUG )
+C
+C
+C Input Parameters.
+C ----------------
+C
+C KDATA - Array of normalized values.
+C KLENP - Length of array KDATA.
+C KSEC4 - Array of GRIB section 4 integer descriptors.
+C KLENG - Length of GRIB product array.
+C KNSPT - Bit pointer for next value in GRIB product.
+C KBITS - Number of bits per computer word.
+C KLEN - Exact number of grid-points to handle.
+C KREFGR - Work array, first-order values for each group.
+C KLENGR - Work array, effective length of each group.
+C KBITGR - Work array, bit number ("width") of each group.
+C KLWORK - Length of work arrays.
+C KPOWER - Auxilary array, containing precomputed powers of 2-1.
+C KMXPWR - Maximum number of bits per original scaled value.
+C KNBIFO - Number of BIts for coding First-Order values.
+C ODEBUG - True for some debug printout.
+C
+C
+C Output Parameters.
+C -----------------
+C
+C KDATA - Used as work array for second-order values,
+C and secondary bit-map (if any).
+C KSEC4 - Array of GRIB section 4 integer descriptors
+C (completed).
+C KGRIB - Array containing GRIB product.
+C KNSPT - Bit pointer for next value in GRIB product (updated).
+C KREFGR - Work array, re-used for variable width methods.
+C KBITGR - Work array, re-used for variable width methods.
+C KWORK - Work array, used for variable width methods.
+C
+C
+C Method.
+C -------
+C
+C Follows WMO Manual of Codes.
+C
+C Externals.
+C ----------
+C
+C C2PKVW - Packs 2nd-order values for variable width methods.
+C INXBIT - Insert bits into GRIB product.
+C PRTBIN - Transform integer value in printable "binary" format.
+C CSGNBT - Codes an integer value and its sign bit.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C On entry, KNSPT points to the first bit of section 4
+C in the GRIB product.
+C On exit, KNSPT points to the first unused bit of section 4,
+C (or to the first bit of section 5, if unused bit count
+C is zero) in the GRIB product.
+C
+C KDATA is overwritten. This is coherent with GRIBEX coding.
+C
+C Detailed use of KSEC4 as input/output argument
+C ----------------------------------------------
+C
+C KSEC4(4) set to 64 to indicate complex packing.
+C KSEC4(6) " " 16 " " presence of extended flags.
+C
+C KSEC4(9) used to know secondary bit-map use (0=no,32=yes).
+C KSEC4(10) " " " constant/variable width (0=constant,16=var).
+C KSEC4(11) " " " for width value, if constant.
+C KSEC4(11) used to know width of spatial differencing descriptors.
+C KSEC4(11) set to width of lengths for general extended method,
+C for consistency with D2ORDR routine.
+C KSEC4(12) used to know general extended packing (0=no,8=yes).
+C KSEC4(13) " " " boustrophedonic ordering (0=no,4=yes).
+C KSEC4(14) (0 or 2) and KSEC4(15) (0 or 1) used to know spatial
+C differencing through their sum (0=no,1/2/3=order used).
+C KSEC4(16) used to know bias for spatial differencing.
+C KSEC4(17) " " " width of lengths for general extended
+C method.
+C KSEC4(16) set to pointer to first-order values.
+C KSEC4(17) " " " " 2nd-order " .
+C KSEC4(18) set to number of first-order values.
+C KSEC4(19) " " " " 2nd-order " .
+C KSEC4(20) used to know width of groups.
+C
+C
+C Author.
+C -------
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C
+C
+C Modifications.
+C _____________
+C
+C J. Clochard, April 1998.
+C Update comments.
+C Introduce spatial differencing.
+C
+C J. Clochard, September 1998.
+C Optimisation of bit-string encoding for variable width methods,
+C through routine C2PKVW.
+C Suppress dummy-argument KSEC1, and add KWORK/KPOWER/KMXPWR
+C in calling syntax.
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JP16SET
+C
+ PARAMETER ( JP16SET= 2**16-1 )
+C `---> 65535 = FFFF(hex)
+C
+C Subroutine arguments
+C
+ INTEGER KLENP, KLENG, KNSPT, KBITS, KLEN, KLWORK, KNBIFO, KMXPWR
+ INTEGER KDATA (KLENP), KSEC4 (*), KGRIB (KLENG)
+ INTEGER KREFGR (KLWORK), KLENGR (KLWORK), KBITGR (KLWORK)
+ INTEGER KWORK (KLWORK), KPOWER (0:KMXPWR)
+C
+ LOGICAL ODEBUG
+C
+C Local variables.
+C
+ INTEGER ICOUNT, ILDSTA, IZERO, JGROUP, ILNGTH, IFILL, INSPTB
+ INTEGER IRET, J, ILVARB, IBITGW, IREFER, IFLAGX, INSPTA
+ INTEGER IPTRFO, IPTRSO, IFIROV, ISECOV, IRETFN, IAUXIL
+#ifndef wmogrp2o
+ INTEGER IEXTRA
+#endif
+ INTEGER IBITGS, IPTRGS, IORDER, IWIDSD, IBIAS, ILVARX
+C
+ INTEGER IWORK (3)
+C
+ INTEGER C2PKVW
+ EXTERNAL C2PKVW
+C
+ CHARACTER YOPER*1
+C
+ LOGICAL LROW, LCTWID, LSECBI, LVECTP
+ LOGICAL LGENXT
+C
+C -----------------------------------------------------------------
+C* Section 1 . Initialisations.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9100) KNSPT
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ IRETFN = 0
+ IZERO=0
+ ILDSTA=21
+ INSPTA=KNSPT
+ YOPER='C'
+ LSECBI=KSEC4(9).NE.0
+#if (defined CRAY) || (defined FUJITSU)
+ LVECTP=.TRUE.
+#else
+ LVECTP=.FALSE.
+#endif
+ LROW=.NOT.LSECBI.AND.KSEC4(12).EQ.0
+ LGENXT=.NOT.LSECBI.AND.KSEC4(12).NE.0
+ IORDER=KSEC4(14)+KSEC4(15)
+ LCTWID=KSEC4(10).EQ.0
+ IFIROV=KSEC4(18)
+ IBITGW=KSEC4(20)
+C
+C Enforce right values for flags, for further use by GRIBEX.
+C
+ KSEC4(4)=64
+ KSEC4(6)=16
+C
+C Compute length of "variable-length" descriptors.
+C
+ IF (LROW) THEN
+ ILVARB=8*((8+IFIROV*IBITGW-1)/8)
+ ELSEIF (LCTWID) THEN
+ ILVARB=8+KLEN
+ ELSEIF (LGENXT) THEN
+ IBITGS=KSEC4(17)
+C
+ IF (IORDER.EQ.0) THEN
+ ILVARX=4
+ ELSE
+ IWIDSD=KSEC4(11)
+ IBIAS=KSEC4(16)
+ ILVARX=5+(8+IWIDSD*(IORDER+1)-1)/8
+ ENDIF
+C
+ ILVARB=8*(ILVARX+(8+IFIROV*IBITGW-1)/8)+IFIROV*IBITGS
+C
+C IBITGS stored back in KSEC4(11), for consistency with D2ORDR.
+C
+ KSEC4(11)=IBITGS
+ ELSE
+ ILVARB=8*((8+IFIROV*IBITGW-1)/8)+KLEN
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 2 . Coding of fixed-length descriptors.
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C The first 10 octets have already been coded in GRIBEX, or will
+C be in a further step of GRIBEX:
+C Length of section, flags+unused bit count, binary scale factor,
+C reference value.
+C
+C* Octet 11 : Number of bits containing each first-order value.
+C One 8 bit field.
+C
+ KNSPT=KNSPT+10*8
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KNBIFO,1,KBITS, 8,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20210
+ WRITE(GRPRSM,FMT=9001) 'bit number of first-order values'
+ GO TO 900
+ ENDIF
+C
+C Octets 12 - 13: Octet number of the start of first-order packed
+C data.
+C One 16-bit field.
+C
+ IPTRFO=1+ILDSTA+(8+ILVARB-1)/8
+ KSEC4(16)=IPTRFO
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC4(16),1,KBITS,16,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20220
+ WRITE(GRPRSM,FMT=9001) 'pointer to first-order packed data'
+ GO TO 900
+ ENDIF
+C
+C Octet 14: Extended flags.
+C One 8-bit field.
+C
+ IFLAGX=KSEC4(9)+KSEC4(10)+KSEC4(12)+KSEC4(13)+KSEC4(14)+KSEC4(15)
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IFLAGX,1,KBITS, 8,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20230
+ WRITE(GRPRSM,FMT=9001) 'extended flags'
+ GO TO 900
+ ENDIF
+C
+C Octets 15 - 20: Octet number of the start of second-order packed
+C data, Number of first-order packed data,
+C Number of second-order packed data.
+C Three 16-bit fields.
+C
+ IPTRSO=IPTRFO+(8+IFIROV*KNBIFO-1)/8
+ ISECOV=KLEN-IORDER
+C
+ KSEC4(17)=IPTRSO
+ KSEC4(18)=IFIROV
+ KSEC4(19)=ISECOV
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC4(17),3,KBITS,16,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20240
+ WRITE(GRPRSM,FMT=9001) 'standard second-order descriptors'
+ GO TO 900
+ ENDIF
+C
+#ifndef wmogrp2o
+C Octet 21: Reserved by WMO, so should be zero in standard case.
+C Could be used for extra bits of group number.
+C One 8-bit field.
+C
+ IEXTRA=IFIROV/(JP16SET+1)
+C
+ IF (IEXTRA.NE.0) THEN
+ CALL PRTBIN (IEXTRA,8,IAUXIL,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IAUXIL=IEXTRA
+ ENDIF
+C
+ WRITE(GRPRSM,FMT=9255) IFIROV, JP16SET, IEXTRA, IAUXIL
+ ENDIF
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IEXTRA,1,KBITS, 8,YOPER,IRET)
+#else
+C Octet 21: Reserved by WMO. Set to zero.
+C One 8-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS, 8,YOPER,IRET)
+#endif
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20250
+ WRITE(GRPRSM,FMT=9001) 'reserved octet (section 4, 21st)'
+ GO TO 900
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 3. Coding of variable-length descriptors.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ CALL PRTBIN (IFLAGX,8,IAUXIL,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IAUXIL=IFLAGX
+ ENDIF
+C
+ WRITE(GRPRSM,FMT=9300) KNBIFO, IAUXIL, IFIROV, ISECOV, IPTRFO,
+ X IPTRSO
+ WRITE(GRPRSM,FMT=9310) 'fixed', KNSPT
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+C
+ IF (LCTWID) THEN
+C
+C Octet 22: Common width of groups.
+C One 8-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC4(11),1,KBITS,8,YOPER,IRET)
+C
+ ELSEIF (LGENXT) THEN
+C
+C Octets 22 - 23: Width of widths, Width of lengths.
+C Two 8-bit fields.
+C
+ IWORK(1)=IBITGW
+ IWORK(2)=IBITGS
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IWORK,2,KBITS,8,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20310
+ WRITE(GRPRSM,FMT=9001)
+ X 'Extended descriptors, 1st-order values'
+ GO TO 900
+ ENDIF
+C
+C Octets 24-25: Octet number of the start of group sizes (lengths).
+C One 16-bit field.
+C
+ IPTRGS = 1 + ILDSTA + ILVARX + (8+IFIROV*IBITGW-1)/8
+#ifdef ebug2o
+ PRINT *,'c2pack - IBITGW =',IBITGW,', IBITGS =',IBITGS,
+ X ', IPTRGS =',IPTRGS
+#endif
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IPTRGS,1,KBITS,16,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20315
+ WRITE(GRPRSM,FMT=9001) 'General extended group size pointer'
+ GO TO 900
+ ELSEIF (IORDER.NE.0) THEN
+C
+C Octet 26: Width of spatial differencing specific descriptors.
+C One 8-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IWIDSD,1,KBITS,8,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20316
+ WRITE(GRPRSM,FMT=9001)
+ X 'Width of spatial differencing descriptors'
+ GO TO 900
+ ELSEIF (IWIDSD.NE.0) THEN
+C
+C Octet 27-onwards: first IORDER original values and diff. bias.
+C (IORDER+1) fields of IWIDSD bits.
+C
+C Temporarily use KDATA(IORDER+1) for bias and its sign.
+C
+ IAUXIL=IORDER+1
+ IFILL=KDATA(IAUXIL)
+ CALL CSGNBT(KDATA(IAUXIL),IBIAS,IWIDSD,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20317
+ WRITE(GRPRSM,FMT=9317) IRET
+ GO TO 900
+ ENDIF
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KDATA,IAUXIL,KBITS,IWIDSD,
+ X YOPER,IRET)
+C
+ KDATA(IAUXIL)=IFILL
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20318
+ WRITE(GRPRSM,FMT=9001)
+ X 'First field value(s) (spatial differencing case)'
+ GO TO 900
+ ELSEIF (MOD (KNSPT,8).NE.0) THEN
+C
+C Fill up with binary zeros till next octet boundary.
+C
+ IFILL=8*((8+KNSPT-1)/8)-KNSPT
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,IFILL,
+ X YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20319
+ WRITE(GRPRSM,FMT=9001)
+ X 'padding after spatial differencing descriptors'
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ ENDIF
+C
+ ENDIF
+C
+C Octets XX - XX+(IPTRGS-1): Group widths.
+C IFIROV fields of IBITGW bits.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KBITGR,IFIROV,KBITS,IBITGW,
+ X YOPER,IRET)
+ ELSE
+C
+C Octets 22 - 21+IFIROV: Group widths.
+C IFIROV fields of IBITGW bits.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KBITGR,IFIROV,KBITS,IBITGW,
+ X YOPER,IRET)
+ ENDIF
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20320
+ WRITE(GRPRSM,FMT=9001) 'inserting group width(s)'
+ GO TO 900
+ ELSEIF (MOD (KNSPT,8).NE.0) THEN
+C
+C Fill up with binary zeros till next octet boundary.
+C
+ IFILL=8*((8+KNSPT-1)/8)-KNSPT
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,IFILL,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20330
+ WRITE(GRPRSM,FMT=9001) 'padding after group width(s)'
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ IF (LSECBI) THEN
+C
+C Secondary bit-map will be inserted later, after second-order
+C values processing, to use KDATA as work array. Retain pointer.
+C
+ INSPTB=KNSPT
+ KNSPT=KNSPT+KLEN
+C
+ IF (MOD (KNSPT,8).NE.0) THEN
+C
+C Fill up with binary zeros till next octet boundary.
+C
+ IFILL=8*((8+KNSPT-1)/8)-KNSPT
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,IFILL,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20340
+ WRITE(GRPRSM,FMT=9001) 'padding after secondary bit-map'
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ ELSEIF (LGENXT) THEN
+C
+C Octets IPTRGS - (IPTRFO-1): General extended group sizes(lengths).
+C IFIROV fields of IBITGS bits.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KLENGR,IFIROV,KBITS,IBITGS,
+ X YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20350
+ WRITE(GRPRSM,FMT=9001) 'General extended group sizes'
+ GO TO 900
+ ELSEIF (MOD (KNSPT,8).NE.0) THEN
+C
+C Fill up with binary zeros till next octet boundary.
+C
+ IFILL=8*((8+KNSPT-1)/8)-KNSPT
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,IFILL,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20360
+ WRITE(GRPRSM,FMT=9001)
+ X 'padding after General extended group sizes'
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ ENDIF
+C
+ IF (KNBIFO.NE.0) THEN
+C
+C Octets IPTRFO - (IPTRSO-1): First-order values (reference values
+C of groups).
+C IFIROV fields of KNBIFO bits.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KREFGR,IFIROV,KBITS,KNBIFO,
+ X YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20370
+ WRITE(GRPRSM,FMT=9001)
+ X 'first-order values (reference values of groups)'
+ GO TO 900
+ ELSEIF (MOD (KNSPT,8).NE.0) THEN
+C
+C Fill up with binary zeros till next octet boundary.
+C
+ IFILL=8*((8+KNSPT-1)/8)-KNSPT
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,IFILL,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20380
+ WRITE(GRPRSM,FMT=9001) 'padding after first-order values'
+ S//' of groups.'
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 4. Coding of data (second-order values).
+C -----------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+C Octets IPTRSO - onwards: Second-order values (deviations from
+C groups references).
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9310) 'variable', KNSPT
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ ICOUNT=IORDER
+C
+ IF (LCTWID) THEN
+C
+C Constant width packing.
+C
+ IF (KSEC4(11).NE.0) THEN
+C
+ DO 412 JGROUP=1,IFIROV
+C
+ ILNGTH=KLENGR(JGROUP)
+ IREFER=KREFGR(JGROUP)
+C
+ DO 411 J=1,ILNGTH
+ KDATA(ICOUNT+J)=KDATA(ICOUNT+J)-IREFER
+ 411 CONTINUE
+C
+ ICOUNT=ICOUNT+ILNGTH
+C
+ 412 CONTINUE
+C
+C Effective coding of second-order values, once for all groups.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KDATA,KLEN,KBITS,
+ X KSEC4(11),YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20410
+ WRITE(GRPRSM,FMT=9001)
+ X 'second-order values (deviations from 1st-order values)'
+ GO TO 900
+ ENDIF
+C
+ ELSE
+ ICOUNT=KLEN
+ ENDIF
+C
+ ELSE
+C
+C Packing method(s) with variable width.
+C
+ IRETFN = C2PKVW ( KDATA, KLENP, KGRIB, KLENG, KNSPT,
+ X KBITS, KLEN, KREFGR, KLENGR, KBITGR,
+ X KWORK, KLWORK, IFIROV, ICOUNT, KPOWER,
+ X KMXPWR, LROW, LVECTP, ODEBUG )
+C
+ IF (IRETFN.NE.0) THEN
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+ IF (ICOUNT.NE.KLEN) THEN
+ IRETFN = 20420
+ WRITE(GRPRSM,FMT=9420) ICOUNT, KLEN
+ GO TO 900
+ ENDIF
+C
+C KNSPT pointer is intentionally left as is:
+C GRIBEX will use its value back to compute unused bit count...
+C ...no adjustment to nearest octet boundary here, then.
+C
+C -----------------------------------------------------------------
+C* Section 5. Compute and code secondary bit-map, if any.
+C -----------------------------------------------------------------
+C
+ 500 CONTINUE
+C
+ IF (LSECBI) THEN
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9510) 'Coding secondary bit-map', INSPTB
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+C
+ DO 511 J=1,KLEN
+ KDATA(J)=0
+ 511 CONTINUE
+C
+ ICOUNT=0
+C
+ DO 512 JGROUP=1,IFIROV
+C
+ ILNGTH=KLENGR(JGROUP)
+ KDATA(ICOUNT+1)=1
+ ICOUNT=ICOUNT+ILNGTH
+C
+ 512 CONTINUE
+C
+C Effective coding of secondary bit-map, once for all groups.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPTB,KDATA,KLEN,KBITS,
+ X 1,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 20510
+ WRITE(GRPRSM,FMT=9001) 'secondary bit-map'
+ GO TO 900
+#ifdef ebug2o
+ ELSE
+#else
+ ELSEIF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9510) 'Secondary bit-map encoded', INSPTB
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ C2PACK = IRETFN
+#ifndef ebug2o
+C
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9900) IRETFN, KNSPT
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ RETURN
+C
+ 9001 FORMAT (' C2PACK: Problem inserting ',A,'.')
+C
+ 9100 FORMAT (' C2PACK: Function start, KNSPT =',I10,'.')
+#ifndef wmogrp2o
+C
+ 9255 FORMAT (' C2PACK: Group number',I8,' exceeds',I6,'.',/,TR10,
+ X 'extra bits stored in 21st octet of section 4 (',I3,
+ X '=>',I8.8,').')
+#endif
+C
+ 9300 FORMAT (' C2PACK: KNBIFO =',I3,', IFLAGX =',I9.8,
+ X ', IFIROV =',I8,', ISECOV =',I8,'.',/,
+ X ' C2PACK: IPTRFO =',I8,', IPTRSO =',I8,'.')
+ 9310 FORMAT (' C2PACK: KNSPT after "',A,'-length" descriptors =',
+ X I10,'.')
+ 9317 FORMAT (
+ X' C2PACK: Bias sign management problem, CSGNBT return is',I5,'.')
+C
+ 9420 FORMAT (' C2PACK: Mismatch: sum of group lengths =',I8,
+ X ', expected = ',I8,'.')
+C
+ 9510 FORMAT (' C2PACK: ',A,', bit pointer =',I10,'.')
+C
+ 9900 FORMAT (' C2PACK: Function return code =',I6,', KNSPT =',I10,'.')
+C
+ END
diff --git a/gribex/c2pkvw.F b/gribex/c2pkvw.F
new file mode 100755
index 0000000..7042bda
--- /dev/null
+++ b/gribex/c2pkvw.F
@@ -0,0 +1,613 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION C2PKVW ( KDATA, KLENP, KGRIB, KLENG, KNSPT,
+ X KBITS, KLEN, KREFGR, KLENGR, KBITGR,
+ X KWORK, KLWORK, KFIROV, KCOUNT, KPOWER,
+ X KMXPWR, OROW, OVECTA, ODEBUG )
+C
+C---->
+C**** C2PKVW
+C
+C Purpose.
+C --------
+C
+C Computes and packs second-order values for variable width methods
+C of second-order packing.
+C
+C
+C** Interface.
+C ----------
+C
+C KRET = C2PKVW ( KDATA, KLENP, KGRIB, KLENG, KNSPT, KBITS,
+C X KLEN, KREFGR, KLENGR, KBITGR, KWORK, KLWORK,
+C X KGRIB, KCOUNT, KPOWER, KMXPWR, OROW, OVECTA,
+C X ODEBUG )
+C
+C
+C Input Parameters.
+C ----------------
+C
+C KDATA - Array of normalized values.
+C KLENP - Length of array KDATA.
+C KLENG - Length of GRIB product array.
+C KNSPT - Bit pointer for next value in GRIB product.
+C KBITS - Number of bits per computer word.
+C KLEN - Exact number of grid-points to handle.
+C KREFGR - Work array, first-order values for each group.
+C KLENGR - Work array, effective length of each group.
+C KBITGR - Work array, bit number ("width") of each group.
+C KLWORK - Length of work arrays.
+C KFIROV - Number of FIRst-Order Values.
+C KCOUNT - Initial index into KDATA.
+C KPOWER - Auxilary array, containing precomputed powers of 2-1.
+C KMXPWR - Maximum number of bits per original scaled value.
+C OROW - True if row by row packing is active packing method.
+C OVECTA - True if vector-oriented algorithm has to be used.
+C ODEBUG - True for some debug printout.
+C
+C
+C Output Parameters.
+C -----------------
+C
+C KDATA - Used as work array for second-order values.
+C KGRIB - Array containing GRIB product.
+C KNSPT - Bit pointer for next value in GRIB product (updated).
+C KREFGR - Work array, re-used internally.
+C KBITGR - Work array, re-used internally.
+C KWORK - Work array.
+C KCOUNT - Final index into KDATA.
+C
+C
+C Method.
+C -------
+C
+C Follows WMO Manual of Codes.
+C
+C Externals.
+C ----------
+C
+C INXBIT - Insert bits into GRIB product.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C
+C KDATA is overwritten. This is coherent with GRIBEX coding.
+C
+C
+C Author.
+C -------
+C
+C J. Clochard, Meteo France, for ECMWF - September 1998.
+C
+C
+C Modifications.
+C _____________
+C
+C None.
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Subroutine arguments
+C
+ INTEGER KLENP, KLENG, KNSPT, KBITS, KLEN, KLWORK, KFIROV, KCOUNT
+ INTEGER KMXPWR
+ INTEGER KDATA (KLENP), KGRIB (KLENG), KPOWER (0:KMXPWR)
+ INTEGER KREFGR (KLWORK), KLENGR (KLWORK), KBITGR (KLWORK)
+ INTEGER KWORK (KLWORK)
+C
+ LOGICAL OROW, OVECTA, ODEBUG
+C
+C Local variables.
+C
+ INTEGER ICOUNT, JGROUP, ILNGTH, IRET, J, IWIDTH, IREFER, IOFF
+ INTEGER IRETFN, IPRWID, JTIMES, ILNGTS, IDATA, ICOUNB, IBLOCK
+ INTEGER JBLOCK, IFIRST, ILBITS, IBIT, IWIDPR, INTERM, IPOWER
+C
+ CHARACTER YOPER*1
+C
+C -----------------------------------------------------------------
+C* Section 1 . Initialisations.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9100) KNSPT
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ IRETFN=0
+ YOPER='C'
+ ICOUNT=KCOUNT
+C
+C -----------------------------------------------------------------
+C* Section 2. Blocks groups of same width, compute 2nd-order values.
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Determin blocks of neighbour groups of same width to be
+C "packed" together for coding, and compute 2nd-order values.
+C
+C In both cases any constant groups are not taken into account.
+C
+ ILNGTS=0
+ ICOUNB=0
+ IBLOCK=0
+C
+C Find first non-constant group.
+C
+ DO 201 J=1,KFIROV
+C
+ IF (KBITGR(J).NE.0) THEN
+ IFIRST=J
+ GOTO 202
+ ENDIF
+C
+ ICOUNT=ICOUNT+KLENGR(J)
+C
+ 201 CONTINUE
+C
+C All groups are constant (constant field, at least piecewise).
+C In such a case there are no second-order values to code.
+C
+ IFIRST=KFIROV+1
+ ICOUNT=KLEN
+C
+ 202 CONTINUE
+C
+ IPRWID=KBITGR(MIN (IFIRST,KFIROV))
+C
+ DO 204 JGROUP=IFIRST,KFIROV
+C
+ IWIDTH=KBITGR(JGROUP)
+ ILNGTH=KLENGR(JGROUP)
+ IREFER=KREFGR(JGROUP)
+C
+ IF (IWIDTH.NE.0) THEN
+C
+C Compute second-order values for current group.
+C
+#ifdef CRAY
+CDIR$ IVDEP
+#endif
+#ifdef FUJITSU
+!OCL NOVREC
+#endif
+ DO 203 J=1,ILNGTH
+C
+ KDATA(ICOUNB+J)=KDATA(ICOUNT+J)-IREFER
+C
+ 203 CONTINUE
+C
+ IF (IWIDTH.NE.IPRWID) THEN
+C
+C Current group may not be blocked with previous one(s).
+C
+ IF (ILNGTS.NE.0) THEN
+C
+C Closes current block.
+C
+ IBLOCK=IBLOCK+1
+ KBITGR(IBLOCK)=IPRWID
+ KWORK(IBLOCK)=ILNGTS
+ ILNGTS=0
+C
+ ENDIF
+C
+ IPRWID=IWIDTH
+C
+ ENDIF
+C
+ ICOUNB=ICOUNB+ILNGTH
+ ILNGTS=ILNGTS+ILNGTH
+C
+ ENDIF
+C
+ ICOUNT=ICOUNT+ILNGTH
+C
+ 204 CONTINUE
+C
+ IF (IPRWID.NE.0.AND.ILNGTS.NE.0) THEN
+C
+C Closing last block of group(s).
+C
+ IBLOCK=IBLOCK+1
+ KBITGR(IBLOCK)=IPRWID
+ KWORK(IBLOCK)=ILNGTS
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 3. Packs second-order values.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ ILBITS=0
+ ICOUNB=0
+ ILNGTS=0
+C
+ IF (OROW.OR..NOT.OVECTA) THEN
+C
+C For such a case, granularity is large enough to make one
+C INXBIT call per block of group(s).
+C
+ DO 311 JBLOCK=1,IBLOCK
+C
+ ILNGTH=KWORK(JBLOCK)
+ IWIDTH=KBITGR(JBLOCK)
+#ifdef ebug2o
+ PRINT *,'c2pkvw - block',JBLOCK,
+ X ' KNSPT/IWIDTH/ICOUNB/ILNGTH = ',
+ X KNSPT, IWIDTH, ICOUNB, ILNGTH
+#endif
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KDATA(ICOUNB+1),ILNGTH,KBITS,
+ X IWIDTH,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 24310
+ WRITE(GRPRSM,FMT=9310) 'block', JBLOCK, ILNGTH, IWIDTH
+ GO TO 900
+ ENDIF
+C
+ ICOUNB=ICOUNB+ILNGTH
+C
+ 311 CONTINUE
+C
+ ELSE
+C
+C Granularity is generally small. Except for very big groups,
+C split 2nd-order values into individual bits, blocked into
+C KREFGR work array, that is flushed when full.
+C
+C
+ DO 399 JBLOCK=1,IBLOCK
+C
+ ILNGTH=KWORK(JBLOCK)
+ IWIDTH=KBITGR(JBLOCK)
+C
+ IF ((ILBITS+ILNGTH*IWIDTH).GT.KLWORK.AND.ILBITS.NE.0) THEN
+C
+C Work array of split bits has to be flushed. Pack it.
+C
+#ifdef ebug2o
+ PRINT *,'c2pkvw - blocks..',JBLOCK-1,
+ X ' KNSPT/ILBITS = ',
+ X KNSPT, ILBITS
+#endif
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KREFGR,ILBITS,KBITS,
+ X 1,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 24320
+ WRITE(GRPRSM,FMT=9320) JBLOCK-1, ILBITS
+ GO TO 900
+ ENDIF
+C
+ ILBITS=0
+C
+ ENDIF
+C
+ IF ((ILNGTH*IWIDTH).GT.KLWORK) THEN
+C
+C Current block is too large to fit into KREFGR.
+C Pack it straightforward, without intermediate splitting.
+C
+#ifdef ebug2o
+ PRINT *,'c2pkvw - BLOCK',JBLOCK,
+ X ' KNSPT/IWIDTH/ICOUNB/ILNGTH = ',
+ X KNSPT, IWIDTH, ICOUNB, ILNGTH
+#endif
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KDATA(ICOUNB+1),ILNGTH,KBITS,
+ X IWIDTH,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 24320
+ WRITE(GRPRSM,FMT=9310) 'BLOCK', JBLOCK, ILNGTH, IWIDTH
+ GO TO 900
+ ENDIF
+C
+ ELSE
+C
+C Split current block into individual bits, stored into
+C array KREFGR (one bit per index value).
+C
+C Start processing by "full" packets of 7-bit wide.
+C (even if 7-bit wide, last packet is processed separately).
+C
+ INTERM=(IWIDTH-1)/7
+ IWIDPR=0
+C
+ DO 322 JTIMES=1,INTERM
+C
+ IOFF=ILBITS+IWIDPR
+ IWIDPR=IWIDPR+7
+ IPOWER=KPOWER(IWIDTH-IWIDPR)+1
+C
+#ifdef CRAY
+CDIR$ IVDEP
+#endif
+#ifdef FUJITSU
+!OCL NOVREC
+#endif
+ DO 321 J=1,ILNGTH
+C
+ IDATA=KDATA(ICOUNB+J)/IPOWER
+ KDATA(ICOUNB+J)=KDATA(ICOUNB+J)-IPOWER*IDATA
+ IBIT=IDATA/64
+ KREFGR(IOFF+1)=IBIT
+ IDATA=IDATA-64*IBIT
+ IBIT=IDATA/32
+ KREFGR(IOFF+2)=IBIT
+ IDATA=IDATA-32*IBIT
+ IBIT=IDATA/16
+ KREFGR(IOFF+3)=IBIT
+ IDATA=IDATA-16*IBIT
+ IBIT=IDATA/8
+ KREFGR(IOFF+4)=IBIT
+ IDATA=IDATA-8*IBIT
+ IBIT=IDATA/4
+ KREFGR(IOFF+5)=IBIT
+ IDATA=IDATA-4*IBIT
+ IBIT=IDATA/2
+ KREFGR(IOFF+6)=IBIT
+ KREFGR(IOFF+7)=IDATA-2*IBIT
+ IOFF=IOFF+IWIDTH
+C
+ 321 CONTINUE
+C
+ 322 CONTINUE
+C
+C Now process last packet of bits (least significant ones).
+C No more use to restore KDATA.
+C
+ IOFF=ILBITS+IWIDPR
+ IPRWID=IWIDTH-IWIDPR
+C
+ IF (IPRWID.EQ.7) THEN
+C
+#ifdef CRAY
+CDIR$ IVDEP
+#endif
+#ifdef FUJITSU
+!OCL NOVREC
+#endif
+ DO 323 J=1,ILNGTH
+C
+ IBIT=KDATA(ICOUNB+J)/64
+ KREFGR(IOFF+1)=IBIT
+ IDATA=KDATA(ICOUNB+J)-64*IBIT
+ IBIT=IDATA/32
+ KREFGR(IOFF+2)=IBIT
+ IDATA=IDATA-32*IBIT
+ IBIT=IDATA/16
+ KREFGR(IOFF+3)=IBIT
+ IDATA=IDATA-16*IBIT
+ IBIT=IDATA/8
+ KREFGR(IOFF+4)=IBIT
+ IDATA=IDATA-8*IBIT
+ IBIT=IDATA/4
+ KREFGR(IOFF+5)=IBIT
+ IDATA=IDATA-4*IBIT
+ IBIT=IDATA/2
+ KREFGR(IOFF+6)=IBIT
+ KREFGR(IOFF+7)=IDATA-2*IBIT
+ IOFF=IOFF+IWIDTH
+C
+ 323 CONTINUE
+C
+ ELSEIF (IPRWID.EQ.6) THEN
+C
+#ifdef CRAY
+CDIR$ IVDEP
+#endif
+#ifdef FUJITSU
+!OCL NOVREC
+#endif
+ DO 324 J=1,ILNGTH
+C
+ IBIT=KDATA(ICOUNB+J)/32
+ KREFGR(IOFF+1)=IBIT
+ IDATA=KDATA(ICOUNB+J)-32*IBIT
+ IBIT=IDATA/16
+ KREFGR(IOFF+2)=IBIT
+ IDATA=IDATA-16*IBIT
+ IBIT=IDATA/8
+ KREFGR(IOFF+3)=IBIT
+ IDATA=IDATA-8*IBIT
+ IBIT=IDATA/4
+ KREFGR(IOFF+4)=IBIT
+ IDATA=IDATA-4*IBIT
+ IBIT=IDATA/2
+ KREFGR(IOFF+5)=IBIT
+ KREFGR(IOFF+6)=IDATA-2*IBIT
+ IOFF=IOFF+IWIDTH
+C
+ 324 CONTINUE
+C
+ ELSEIF (IPRWID.EQ.5) THEN
+C
+#ifdef CRAY
+CDIR$ IVDEP
+#endif
+#ifdef FUJITSU
+!OCL NOVREC
+#endif
+ DO 325 J=1,ILNGTH
+C
+ IBIT=KDATA(ICOUNB+J)/16
+ KREFGR(IOFF+1)=IBIT
+ IDATA=KDATA(ICOUNB+J)-16*IBIT
+ IBIT=IDATA/8
+ KREFGR(IOFF+2)=IBIT
+ IDATA=IDATA-8*IBIT
+ IBIT=IDATA/4
+ KREFGR(IOFF+3)=IBIT
+ IDATA=IDATA-4*IBIT
+ IBIT=IDATA/2
+ KREFGR(IOFF+4)=IBIT
+ KREFGR(IOFF+5)=IDATA-2*IBIT
+ IOFF=IOFF+IWIDTH
+C
+ 325 CONTINUE
+C
+ ELSEIF (IPRWID.EQ.4) THEN
+C
+#ifdef CRAY
+CDIR$ IVDEP
+#endif
+#ifdef FUJITSU
+!OCL NOVREC
+#endif
+ DO 326 J=1,ILNGTH
+C
+ IBIT=KDATA(ICOUNB+J)/8
+ KREFGR(IOFF+1)=IBIT
+ IDATA=KDATA(ICOUNB+J)-8*IBIT
+ IBIT=IDATA/4
+ KREFGR(IOFF+2)=IBIT
+ IDATA=IDATA-4*IBIT
+ IBIT=IDATA/2
+ KREFGR(IOFF+3)=IBIT
+ KREFGR(IOFF+4)=IDATA-2*IBIT
+ IOFF=IOFF+IWIDTH
+C
+ 326 CONTINUE
+C
+ ELSEIF (IPRWID.EQ.3) THEN
+C
+#ifdef CRAY
+CDIR$ IVDEP
+#endif
+#ifdef FUJITSU
+!OCL NOVREC
+#endif
+ DO 327 J=1,ILNGTH
+C
+ IBIT=KDATA(ICOUNB+J)/4
+ KREFGR(IOFF+1)=IBIT
+ IDATA=KDATA(ICOUNB+J)-4*IBIT
+ IBIT=IDATA/2
+ KREFGR(IOFF+2)=IBIT
+ KREFGR(IOFF+3)=IDATA-2*IBIT
+ IOFF=IOFF+IWIDTH
+C
+ 327 CONTINUE
+C
+ ELSEIF (IPRWID.EQ.2) THEN
+C
+#ifdef CRAY
+CDIR$ IVDEP
+#endif
+#ifdef FUJITSU
+!OCL NOVREC
+#endif
+ DO 328 J=1,ILNGTH
+C
+ IBIT=KDATA(ICOUNB+J)/2
+ KREFGR(IOFF+1)=IBIT
+ KREFGR(IOFF+2)=KDATA(ICOUNB+J)-2*IBIT
+ IOFF=IOFF+IWIDTH
+C
+ 328 CONTINUE
+C
+ ELSE
+C
+ DO 329 J=1,ILNGTH
+C
+ KREFGR(IOFF+1)=KDATA(ICOUNB+J)
+ IOFF=IOFF+IWIDTH
+C
+ 329 CONTINUE
+C
+ ENDIF
+C
+ ILBITS=ILBITS+ILNGTH*IWIDTH
+C
+ ENDIF
+C
+ ICOUNB=ICOUNB+ILNGTH
+C
+ 399 CONTINUE
+C
+ IF (ILBITS.NE.0) THEN
+C
+C Last flush for work array of split bits. Pack it.
+C
+#ifdef ebug2o
+ PRINT *,'c2pkvw - blocks..',IBLOCK,
+ X ' KNSPT/ILBITS = ',
+ X KNSPT, ILBITS
+#endif
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KREFGR,ILBITS,KBITS,
+ X 1,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 24320
+ WRITE(GRPRSM,FMT=9320) IBLOCK, ILBITS
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ ENDIF
+C
+C
+C -----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ KCOUNT=ICOUNT
+ C2PKVW = IRETFN
+#ifndef ebug2o
+C
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9900) IRETFN, KNSPT
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ RETURN
+C
+ 9100 FORMAT (' C2PKVW: Function start, KNSPT =',I10,'.')
+C
+ 9310 FORMAT (' C2PKVW: Problem inserting 2nd-order values, ',A,I7,
+ S ',',I6,'*',I2,' bits.')
+C
+ 9320 FORMAT (' C2PKVW: Problem inserting 2nd-order values, blocks..',
+ S I7,',',I9,' bits.')
+C
+ 9900 FORMAT (' C2PKVW: Function return code =',I6,', KNSPT =',I10,'.')
+C
+ END
diff --git a/gribex/c2rnge.F b/gribex/c2rnge.F
new file mode 100755
index 0000000..9667595
--- /dev/null
+++ b/gribex/c2rnge.F
@@ -0,0 +1,161 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION C2RNGE ( KNPACK, KPKLEN, KXBITS, KDATA, KDIAGO,
+ X KWIDTH, KREFER, KPOWER, KMXPWR, KPCWID,
+ X KXCWID )
+C
+C---->
+C**** C2RNGE
+C
+C Purpose.
+C --------
+C
+C Utility to assist computing of range diagnostics for spatial
+C differencing.
+C
+C** Interface.
+C ----------
+C
+C IOFF = C2RNGE ( KNPACK, KPKLEN, KXBITS, KDATA, KDIAGO, KWIDTH,
+C X KREFER, KPOWER, KMXPWR, KPCWID, KXCWID )
+C
+C Function result value is the number of values processed within
+C KDATA during call.
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KNPACK - Number of packets to process.
+C KPKLEN - Length of packets.
+C KXBITS - MaXimum number of BITS estimated.
+C KDATA - Array containing values to process.
+C KDIAGO - Diagnostic of cumulated ranges.
+C KWIDTH - Width of packets.
+C KREFER - Reference value.
+C KPOWER - Auxilary array, precomputed (powers of 2)-1.
+C KMXPWR - Maximum number of bits per original scaled value.
+C KPCWID - Auxilary array, precomputed widths.
+C KXCWID - Maximum width associated to KPCWID.
+C
+C
+C Output Parameters (updates).
+C ------------------
+C
+C KDIAGO - Diagnostic of cumulated ranges.
+C KWIDTH - Width of packets.
+C KREFER - Reference value.
+C
+C
+C Method.
+C -------
+C
+C Loop on packets for range diagnostics.
+C
+C
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C J. Clochard, Meteo France, for ECMWF - February 1998.
+C
+C
+C Modifications.
+C _____________
+C
+C J. Clochard, June 1999.
+C Use precomputed array to determine widths . Dummy-arguments
+C KPCWID and KXCWID added . Assumption is made that KXCWID
+C is at least (KMXPWR+1)/2 .
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ INTEGER KNPACK, KPKLEN, KXBITS, KDIAGO, KWIDTH, KREFER, KMXPWR
+ INTEGER KXCWID
+ INTEGER KPOWER (0:KMXPWR), KDATA (*), KPCWID (0:*)
+C
+C Local variables.
+C
+ INTEGER IOFF, J, J2, IMAX, IMIN, IRANGE, IPOWER, IWIDTH, ILCWID
+C
+C -----------------------------------------------------------------
+C* Section 1 . Direct computing.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IOFF = 0
+ ILCWID = KPOWER(KXCWID)+1
+C
+ DO 104 J2=1,KNPACK
+C
+ IMAX=KDATA(IOFF+1)
+ IMIN=KDATA(IOFF+1)
+C
+ DO 101 J=2,KPKLEN
+ IMAX=MAX (IMAX,KDATA(IOFF+J))
+ IMIN=MIN (IMIN,KDATA(IOFF+J))
+ 101 CONTINUE
+C
+ IRANGE=IMAX-IMIN
+C
+ IF (IRANGE.LT.ILCWID) THEN
+ IWIDTH=KPCWID(IRANGE)
+ ELSE
+ IWIDTH=KXCWID+KPCWID(IRANGE/ILCWID)
+ ENDIF
+C
+ IPOWER=KPOWER(IWIDTH)
+C
+ KDIAGO=KDIAGO+KPKLEN*IWIDTH
+ KWIDTH=MAX (KWIDTH,IWIDTH)
+ KREFER=MAX (KREFER,IMIN-(IPOWER-IRANGE))
+ IOFF=IOFF+KPKLEN
+C
+ 104 CONTINUE
+C
+C -----------------------------------------------------------------
+C* Section 9 . Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ C2RNGE = IOFF
+C
+ RETURN
+C
+ END
diff --git a/gribex/c2rows.F b/gribex/c2rows.F
new file mode 100755
index 0000000..ae39c4d
--- /dev/null
+++ b/gribex/c2rows.F
@@ -0,0 +1,464 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION C2ROWS ( KDATA, KLENP, KSEC2, KSEC4, KGRIB,
+ X KLENG, KNSPT, KBITS, OCOMGR, OLONLY,
+ X KLEN4, KBMAP, KVALS, OPRIBI, OQUASI,
+ X KNROWS, KLEN, KREFGR, KLENGR, KBITGR,
+ X KWORK, KLWORK, KPOWER, KMXPWR, KPCWID,
+ X KXCWID, KNBIFO, ODEBUG )
+C
+C---->
+C**** C2ROWS
+C
+C Purpose.
+C --------
+C
+C Performs "row by row packing" method for section 4 of GRIB,
+C and/or computes only length of section 4, with/without coding,
+C with this method.
+C
+C
+C** Interface.
+C ----------
+C
+C KRET = C2ROWS ( KDATA, KLENP, KSEC2, KSEC4, KGRIB, KLENG,
+C X KNSPT, KBITS, OCOMGR, OLONLY, KLEN4, KBMAP,
+C X KVALS, OPRIBI, OQUASI, KNROWS, KLEN, KREFGR,
+C X KLENGR, KBITGR, KWORK, KLWORK, KPOWER, KMXPWR,
+C X KPCWID, KXCWID, KNBIFO, ODEBUG )
+C
+C
+C Input Parameters for all options.
+C --------------------------------
+C
+C KDATA - Array of normalized values.
+C KLENP - Length of array KDATA.
+C KSEC2 - Array of GRIB section 2 integer descriptors.
+C KSEC4 - Array of GRIB section 4 integer descriptors.
+C KGRIB - Array containing GRIB product (for bit-map).
+C KLENG - Length of GRIB product array.
+C KNSPT - Bit pointer for next value in GRIB product.
+C KBITS - Number of bits per computer word.
+C OCOMGR - True if COMputing of GRoup arrays is requested.
+C OLONLY - True if Length ONLY is requested (no coding).
+C KBMAP - Bit pointer for start of explicit primary Bit-MAP
+C (if any).
+C KVALS - Number of bits in primary bit-map.
+C OPRIBI - True if a PRImary BIt-map is present.
+C OQUASI - True if the grid is QUASI-regular.
+C KNROWS - Number of ROWS (or lines) in the grid.
+C KLEN - Exact number of grid-points to handle.
+C KLWORK - Length of work array KWORK.
+C KPOWER - Auxilary array, containing precomputed powers of 2-1.
+C KMXPWR - Maximum number of bits per original scaled value.
+C KPCWID - Auxilary array, precomputed widths.
+C KXCWID - Maximum width associated to KPCWID.
+C ODEBUG - True for some debug printout.
+C
+C
+C Output Parameters for all options.
+C ---------------------------------
+C
+C KLEN4 - Length of section 4.
+C
+C Output Parameters when OLONLY is false.
+C --------------------------------------
+C
+C KSEC4 - Array of GRIB section 4 integer descriptors.
+C (for second-order descriptors)
+C KGRIB - Array containing GRIB product.
+C KNSPT - Bit pointer for next value in GRIB product (updated).
+C KWORK - Used as work array by C2PACK.
+C
+C Output Parameters when OCOMGR is true.
+C -------------------------------------
+C
+C KWORK - Work array, used to unpack a primary bit-map, if any.
+C
+C Output Parameters when OCOMGR is true,
+C Input Parameters when OCOMGR is false.
+C --------------------------------------
+C
+C KREFGR - Work array, first-order values for each row.
+C KLENGR - Work array, effective length of each row.
+C KBITGR - Work array, bit number ("width") of each row.
+C KNBIFO - Number of BIts for coding First-Order values.
+C
+C Output Parameters when OCOMGR is true,
+C Input parameter in all cases.
+C --------------------------------------
+C
+C KDATA - Used as work array by C2PACK.
+C
+C Method.
+C -------
+C
+C Follows WMO Manual of Codes.
+C
+C If requested through OCOMGR, a first scan computes work arrays,
+C bit number for coding first-order values and length of section 4.
+C
+C If requested, coding is applied in a second scan, using
+C descriptors computed in the first scan, possibly in a previous
+C call.
+C
+C Externals.
+C ----------
+C
+C INXBIT - Extract bits from GRIB product.
+C MAXMNI - Computes extrema of integer array.
+C C2BITW - Computes bit width of a positive integer value.
+C C2PACK - Encodes descriptors and data.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C On entry, KNSPT points to the first bit of section 4
+C in the GRIB product.
+C On exit, KNSPT points to the first unused bit of section 4,
+C (or to the first bit of section 5, if unused bit count
+C is zero) in the GRIB product.
+C
+C KDATA is overwritten when coding is requested.
+C This is coherent with GRIBEX.
+C
+C
+C Author.
+C -------
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C
+C
+C Modifications.
+C _____________
+C
+C J. Clochard, February 1998.
+C Use C2BITW function for bit width computations.
+C
+C J. Clochard, September 1998.
+C Suppress KSEC1/KSEC3 dummy-arguments.
+C " KSEC1, add KWORK/KPOWER/KMXPWR argument in C2PACK call.
+C
+C J. Clochard, June 1999.
+C Use precomputed array to determine widths . Dummy-arguments
+C KPCWID and KXCWID added . Assumption is made that KXCWID
+C is at least (KMXPWR+1)/2 .
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Subroutine arguments
+C
+ INTEGER KLENP, KLENG, KNSPT, KBITS, KBMAP, KVALS, KLEN4, KNROWS
+ INTEGER KLEN, KLWORK, KMXPWR, KNBIFO, KXCWID
+ INTEGER KDATA (KLENP), KSEC2 (*), KSEC4 (*), KPCWID (0:*)
+ INTEGER KGRIB (KLENG), KREFGR (KNROWS), KLENGR (KNROWS)
+ INTEGER KBITGR (KNROWS), KWORK (KLWORK), KPOWER (0:KMXPWR)
+C
+ LOGICAL OPRIBI, OQUASI, OLONLY, OCOMGR, ODEBUG
+C
+C Local variables.
+C
+ INTEGER IREFLN, ICOUNT, INBITI, INBIFO, ILENSO, ILDSTA, IZERO
+ INTEGER ILNGTX, ILNGTH, IPTRBM, INBSEQ, JROW, JSEQ, IPTOFF
+ INTEGER IPTNBR, IRET, J, IDMAX, IDMIN, ISOMAX, ILCWID
+ INTEGER IRETFN, IBITGW, IFOMAX
+C
+ INTEGER C2PACK, C2BITW
+ EXTERNAL C2PACK, C2BITW
+C
+ CHARACTER YOPER*1
+C
+C -----------------------------------------------------------------
+C* Section 1 . Performs initial checks.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9100) OCOMGR, OLONLY, KNSPT
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ IRETFN = 0
+ ILCWID = KPOWER(KXCWID)+1
+ IREFLN=22
+ ICOUNT=0
+ INBITI=KSEC4(2)
+ IFOMAX=0
+ ILENSO=0
+ ILDSTA=21
+ IZERO=0
+ IBITGW=8
+ ILNGTX=KSEC4(1)/KNROWS
+C
+ IF (OPRIBI) THEN
+ IPTRBM=KBMAP
+ ENDIF
+C
+ IF (.NOT.OCOMGR) THEN
+C
+ IF (OLONLY) THEN
+ IRETFN = 19110
+ WRITE(GRPRSM,FMT=9110)
+ GOTO 900
+ ELSE
+ INBIFO=KNBIFO
+ GOTO 300
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 2 . Compute effective length, reference, width of rows.
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9200)
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+C
+ YOPER='D'
+C
+ DO 230 JROW=1,KNROWS
+C
+ IF (OQUASI) THEN
+ ILNGTX=KSEC2(IREFLN+JROW)
+ ENDIF
+C
+ IF (OPRIBI.AND.ILNGTX.NE.0) THEN
+C
+C Row by row packing, but an (explicit) bit-map is included.
+C The number of values in current row has to be computed.
+C
+ ILNGTH=0
+ INBSEQ=1+(ILNGTX-1)/KLWORK
+C
+ DO 212 JSEQ=1,INBSEQ
+ IPTOFF=(JSEQ-1)*KLWORK
+ IPTNBR=MIN (KLWORK,ILNGTX-IPTOFF)
+ CALL INXBIT (KGRIB,KLENG,IPTRBM,KWORK,IPTNBR,KBITS,1,
+ X YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 19210
+ WRITE(GRPRSM,FMT=9210) JROW, IPTOFF+1, IPTOFF+IPTNBR
+ GOTO 900
+ ENDIF
+C
+ DO 211 J=1,IPTNBR
+ ILNGTH=ILNGTH+KWORK(J)
+ 211 CONTINUE
+C
+ 212 CONTINUE
+C
+ ELSE
+C
+ ILNGTH=ILNGTX
+C
+ ENDIF
+C
+ KLENGR(JROW)=ILNGTH
+C
+ IF (ILNGTH.NE.0) THEN
+C
+C Width of row (number of bits necessary to code second-order
+C values).
+C
+ CALL MAXMNI (KDATA(ICOUNT+1),ILNGTH,IDMAX,IDMIN)
+C
+ ISOMAX=IDMAX-IDMIN
+C
+ IF (ISOMAX.LT.ILCWID) THEN
+ KBITGR(JROW)=KPCWID(ISOMAX)
+ ELSE
+ KBITGR(JROW)=KXCWID+KPCWID(ISOMAX/ILCWID)
+ ENDIF
+#ifdef row1sc2o
+C
+C Take the minimum value of row as reference value.
+C Consistant with Bracknell's encoder approach.
+C
+ KREFGR(JROW)=IDMIN
+#else
+C
+C Maximum use of width for second-order values: the maximum value
+C of row will be encoded with the biggest value fitting in
+C KBITGR(JROW) bits, and keeping reference value positive or zero.
+C
+C The goal is to get the lowest reference value, thus trying to
+C save bit(s) to encode the first-order values.
+C
+ IF (KBITGR(JROW).NE.0) THEN
+ KREFGR(JROW)=MAX (0,IDMIN-(KPOWER(KBITGR(JROW))-ISOMAX))
+ ELSE
+ KREFGR(JROW)=IDMIN
+ ENDIF
+#endif
+C
+ IFOMAX=MAX (IFOMAX,KREFGR(JROW))
+ ICOUNT=ICOUNT+ILNGTH
+ ILENSO=ILENSO+ILNGTH*KBITGR(JROW)
+C
+ ELSE
+C
+ KREFGR(JROW)=0
+ KBITGR(JROW)=0
+C
+ ENDIF
+C
+#ifdef ebug2o
+ PRINT *,'c2rows - group', JROW, ILNGTH, KBITGR(JROW), ' (',
+ X KNSPT+8*(ILDSTA+(8+KNROWS*(IBITGW+KSEC4(2))-1)/8)+ILENSO, ')',
+ X IDMIN, ISOMAX, KREFGR(JROW), ICOUNT
+#endif
+C
+ 230 CONTINUE
+C
+ IF (ICOUNT.NE.KLEN) THEN
+ IRETFN = 19220
+ WRITE(GRPRSM,FMT=9220) ICOUNT, KLEN
+ GOTO 900
+ ENDIF
+C
+C Number of bits necessary to code first-order values.
+C
+ INBIFO = C2BITW ( IFOMAX, INBITI, KPOWER, KMXPWR )
+C
+#ifdef row1sc2o
+C To obtain an equivalent to a 1-scan coding, as Bracknell
+C coder seems to do. Such a method is more direct, does not
+C require work arrays, but is less efficient: row references are
+C coded with the same number of bits as specified for packing.
+C
+ INBIFO=KSEC4(2)
+#endif
+C
+C Compute length of descriptors, and of full section 4 of GRIB.
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9250) (KSEC4(J),J=1,10), INBIFO
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ KLEN4 = ILDSTA + (8+KNROWS*IBITGW-1)/8 + (8+KNROWS*INBIFO-1)/8
+ X + (8+ILENSO-1)/8
+ KLEN4=2*((2+KLEN4-1)/2)
+ KNBIFO=INBIFO
+C
+ IF (OLONLY) THEN
+C
+C Length has been computed, go back without any coding.
+C
+ GOTO 900
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 3. Definition of fixed-length descriptors and coding.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C The first 10 octets have already been coded in GRIBEX, or will
+C be in a further step of GRIBEX:
+C Length of section, flags+unused bit count, binary scale factor,
+C reference value.
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9300)
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+C Enforce right values for extended flags.
+C
+ KSEC4( 9)=0
+ KSEC4(10)=16
+ KSEC4(12)=0
+ KSEC4(13)=0
+C
+C Extra descriptors.
+C
+ KSEC4(18)=KNROWS
+ KSEC4(20)=IBITGW
+C
+ IRETFN = C2PACK ( KDATA, KLENP, KSEC4, KGRIB, KLENG, KNSPT,
+ X KBITS, KLEN, KREFGR, KLENGR, KBITGR, KWORK,
+ X KLWORK, KPOWER, KMXPWR, KNBIFO, ODEBUG )
+C
+C -----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ C2ROWS = IRETFN
+#ifndef ebug2o
+C
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9900) IRETFN, OCOMGR, OLONLY, KNSPT
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ RETURN
+C
+ 9100 FORMAT (' C2ROWS: Function start, OCOMGR = ',L1,
+ X ', OLONLY = ',L1,', KNSPT =',I10,'.')
+C
+ 9110 FORMAT (' C2ROWS: Routine called, but has nothing to do.')
+C
+ 9200 FORMAT (' C2ROWS: Computing work arrays.')
+C
+ 9210 FORMAT (' C2ROWS: Problem unpacking primary bit-map,row',I6,
+ X ' points ',I8,'..',I8,'.')
+C
+ 9220 FORMAT (' C2ROWS: Inconsistency: computed g.p. number =',I8,
+ X ', expected =',I8,'.')
+C
+ 9250 FORMAT (' C2ROWS: KSEC4(1:10) =',I9,I3,I4,3I3,I2,3I3,
+ X ', INBIFO =',I3,'.')
+C
+ 9300 FORMAT (' C2ROWS: Coding phase - calling C2PACK.')
+C
+ 9900 FORMAT (' C2ROWS: Function return code =',I6,', OCOMGR= ',L1,
+ X ', OLONLY= ',L1,', KNSPT =',I10,'.')
+C
+ END
diff --git a/gribex/calcop.F b/gribex/calcop.F
new file mode 100755
index 0000000..e828c2c
--- /dev/null
+++ b/gribex/calcop.F
@@ -0,0 +1,292 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION CALCOP( PSPEC, KTRUNC, KSUBSP)
+C
+C---->
+C**** *CALCOP* - linear fit of spectrum to (n*(n+1))**P
+C
+C Purpose.
+C --------
+C
+C GRIB allows for "complex packing" of spectral coeficients.
+C This means that a sub-spectrum is not packed and, for the rest,
+C a multiplying factor is applied before packing. The factor is
+C (n*(n+1))**p, where n is the total wave-number.
+C
+C This routine returns an optimal P based on the field itself.
+C
+C
+C** Interface.
+C ----------
+C
+C IP = CALCOP( PSPEC, KTRUNC, KSUBSP)
+C
+C
+C Input arguments.
+C ----------------
+C
+C PSPEC - spectral field
+C KTRUNC - spectral truncation of field
+C KSUBSP - truncation of "non-packed" sub-spectrum
+C
+C
+C Output arguments.
+C -----------------
+C
+C The function return value is the integer value of P*1000.
+C The value is constrained to be in the range (-10000, +10000).
+C
+C
+C Method.
+C -------
+C
+C Consider F(n,m) = (n*(n+1))**(-P) * G(n,m), where F(n,m) is the
+C original spectral field and n the total wavenumber. The aim
+C is to minimize G in a 1 norm with respect to P. This can only
+C partially be achieved.
+C
+C What we do is to to compute H(n), where
+C H(n) = max(F(n,m)) with respect to m.
+C
+C We then perform a least square fit for the equation
+C log(H(n)) = beta0+beta1*log(n*(n+1)).
+C
+C To ensure a better fit for the lower end of the spectrum, we
+C apply an (arbitrary) weighting function before fitting
+C W(n) = 1.0 / (n-KSUBSP+1)
+C
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C
+C Reference.
+C ----------
+C
+C Seber, G.A.F. (1979). Linear Regression Analyses.
+C John Wiley and Sons
+C
+C ECMWF Research Department documentation of the IFS
+C
+C
+C Author.
+C -------
+C
+C Mats Hamrud ECMWF 5th May 1994
+C
+C
+C Modifications.
+C --------------
+C
+C John Chambers ECMWF 6th Sept 1994
+C Add original field truncation as a parameter.
+C Use GRIB ordering of spherical harmonic coefficients in input.
+C
+C John Chambers ECMWF 21st Nov 1994
+C Use double precision intrinsics on VAX
+C
+C Lubia Vinhas ECMWF 9th Oct 1996
+C Intrinsic function MAX in ALPHA platform needs
+C
+C----<
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+ INTEGER JPTMAX
+ PARAMETER ( JPTMAX = 2047 )
+C
+C JPTMAX is current maximum truncation value for input field
+C
+C Subroutine arguments
+ REAL PSPEC
+ DIMENSION PSPEC(*)
+ INTEGER KTRUNC, KSUBSP
+C
+C Local arguments
+ INTEGER ISMIN, ISMAX, INDEX, JN, JM
+#ifdef CRAY
+ REAL ZEPS, ZZ, ZXMW, ZYMW, ZWSUM, ZX, ZY, ZSUM1, ZSUM2
+ REAL ZP
+ REAL ZBETA1
+ REAL ZW(0:(JPTMAX+1)), ZNORM(0:(JPTMAX+1))
+#else
+ DOUBLE PRECISION ZEPS, ZZ, ZXMW, ZYMW, ZWSUM, ZX, ZY, ZSUM1, ZSUM2
+ DOUBLE PRECISION ZP
+ DOUBLE PRECISION ZBETA1
+ DOUBLE PRECISION ZW(0:(JPTMAX+1)), ZNORM(0:(JPTMAX+1))
+#endif
+C
+C ------------------------------------------------------------------
+C* Section 1. Do initial setup and calulate the (arbitrary) weights.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Check internal arrays can handle the truncation
+C
+ IF( KTRUNC.GT.JPTMAX ) THEN
+ WRITE(GRPRSM,*)
+ X 'CALCOP: Cannot use the given truncation ', KTRUNC
+ WRITE(GRPRSM,*) 'CALCOP: Maximum handled is ', JPTMAX
+ CALCOP = -99999
+ RETURN
+ ENDIF
+C
+ ISMIN = KSUBSP+1
+ ISMAX = KTRUNC+1
+ ZEPS = 1.0E-15
+C
+C Set up the weights.
+#ifdef IBM
+ ZZ = DBLE(ISMAX-ISMIN+1)
+#else
+ ZZ = REAL(ISMAX-ISMIN+1)
+#endif
+ DO 110 JN = ISMIN, ISMAX
+#ifdef IBM
+ ZW(JN) = ZZ / DBLE(JN-ISMIN+1)
+#else
+ ZW(JN) = ZZ / REAL(JN-ISMIN+1)
+#endif
+ 110 CONTINUE
+C
+C ------------------------------------------------------------------
+C* Section 2. Compute norms.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Initialise array to zero.
+ DO 210 JN = ISMIN, ISMAX
+ ZNORM(JN) = 0.0
+ 210 CONTINUE
+C
+C Form norms.
+C Handle values 2 at a time (real and imaginary parts)
+C
+C First the rows affected by the subset
+ INDEX = -1
+ DO 230 JM = 0 , KSUBSP-1
+ DO 220 JN = JM , KTRUNC
+ INDEX = INDEX + 2
+ IF ( JN .GE. KSUBSP ) THEN
+#if defined (VAX) || defined (IBM) || defined (__alpha) || defined hpR64 || defined hpiaR64
+ ZNORM(JN) = MAX(ZNORM(JN), DBLE(ABS(PSPEC(INDEX))))
+ ZNORM(JN) = MAX(ZNORM(JN), DBLE(ABS(PSPEC(INDEX+1))))
+#else
+ ZNORM(JN) = MAX(ZNORM(JN), ABS(PSPEC(INDEX)))
+ ZNORM(JN) = MAX(ZNORM(JN), ABS(PSPEC(INDEX+1)))
+#endif
+ ENDIF
+ 220 CONTINUE
+ 230 CONTINUE
+C
+C Next the rows not affected by the subset
+ DO 250 JM = KSUBSP , KTRUNC
+ DO 240 JN = JM , KTRUNC
+ INDEX = INDEX + 2
+#if defined (VAX) || defined (IBM) || defined (__alpha) || defined hpR64 || defined hpiaR64
+ ZNORM(JN) = DMAX1(ZNORM(JN), DBLE(ABS(PSPEC(INDEX))))
+ ZNORM(JN) = DMAX1(ZNORM(JN), DBLE(ABS(PSPEC(INDEX+1))))
+#else
+ ZNORM(JN) = MAX(ZNORM(JN), ABS(PSPEC(INDEX)))
+ ZNORM(JN) = MAX(ZNORM(JN), ABS(PSPEC(INDEX+1)))
+#endif
+ 240 CONTINUE
+ 250 CONTINUE
+C
+C Ensure the norms have a value which is not too small in case of
+C problems with math functions (e.g. LOG).
+C
+ DO 290 JN = ISMIN, ISMAX
+#if defined (VAX) || defined (IBM) || defined hpR64 || defined hpiaR64
+ ZNORM(JN) = DMAX1(ZNORM(JN), ZEPS)
+#else
+ ZNORM(JN) = MAX(ZNORM(JN), ZEPS)
+#endif
+ IF(ZNORM(JN).EQ.ZEPS) ZW(JN) = 100.*ZEPS
+ 290 CONTINUE
+C
+C ------------------------------------------------------------------
+C* Section 3. Do linear fit to find the slope (ZBETA1).
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ ZXMW = 0.0
+ ZYMW = 0.0
+ ZWSUM = 0.0
+C
+C Sum the weighted X and Ys.
+ DO 310 JN = ISMIN, ISMAX
+#ifdef IBM
+ ZX = LOG(DBLE(JN*(JN+1)))
+#else
+ ZX = LOG(REAL(JN*(JN+1)))
+#endif
+ ZY = LOG(ZNORM(JN))
+ ZXMW = ZXMW+ZX*ZW(JN)
+ ZYMW = ZYMW+ZY*ZW(JN)
+ ZWSUM = ZWSUM+ZW(JN)
+ 310 CONTINUE
+C
+C Form mean weighted X and Y.
+ ZXMW = ZXMW / ZWSUM
+ ZYMW = ZYMW / ZWSUM
+ ZSUM1 = 0.0
+ ZSUM2 = 0.0
+C
+C Perform a least square fit for the equation
+ DO 320 JN = ISMIN, ISMAX
+#ifdef IBM
+ ZX = LOG(DBLE(JN*(JN+1)))
+#else
+ ZX = LOG(REAL(JN*(JN+1)))
+#endif
+ ZY = LOG(ZNORM(JN))
+ ZSUM1 = ZSUM1+ZW(JN)*(ZY-ZYMW)*(ZX-ZXMW)
+ ZSUM2 = ZSUM2+ZW(JN)*(ZX-ZXMW)**2
+ 320 CONTINUE
+C
+C Calculate the slope.
+ ZBETA1 = ZSUM1 / ZSUM2
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ ZP = -ZBETA1
+#ifdef CRAY
+ ZP = MAX(-9.999, MIN(9.999, ZP))
+#endif
+#if defined (VAX) || defined (IBM) || defined hpR64 || defined hpiaR64
+ ZP = DMAX1(-9.999D0, DMIN1(9.999D0, ZP))
+#endif
+#if !defined(VAX) && !defined(CRAY) && !defined(IBM)
+ ZP = MAX(-9.999D0, MIN(9.999D0, ZP))
+#endif
+C
+#ifdef IBM
+ CALCOP = IDINT( ZP * 1000.0 )
+#else
+ CALCOP = INT( ZP * 1000.0 )
+#endif
+C
+ RETURN
+ END
diff --git a/gribex/ccf1cr.F b/gribex/ccf1cr.F
new file mode 100755
index 0000000..88c76cb
--- /dev/null
+++ b/gribex/ccf1cr.F
@@ -0,0 +1,537 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE CCF1CR (HEXP,HSTR,HDIS,HTYP,HREP,HLEV,HARE,HPER,HFIR,
+ C HOWN,HBAK,HCLS,HFAM,HRUT,KPR,KRET)
+C
+C
+C---->
+C**** CCF1CR
+C
+C PURPOSE.
+C --------
+C
+C CREATE REQUESTED NODES IN CFS FOR MARS ARCHIVING.
+C
+C** INTERFACE.
+C ----------
+C
+C CALL CCF1CR (HEXP,HSTR,HDIS,HTYP,HREP,HLEV,HARE,HPER,HFIR,
+C C HOWN,HBAK,HCLS,HFAM,HRUT,KPR,KRET)
+C
+C INTEGER K.
+C REAL P.
+C LOGICAL O.
+C CHARACTER H.
+C
+C INPUT PARAMETERS.
+C -----------------
+C
+C HEXP - 4 CHARACTER EXPERIMENT IDENTIFIER.
+C
+C HSTR - ARCHIVE STREAM.
+C FOR RESEARCH.
+C DA - DAILY ARCHIVE.
+C FOR OPERATIONS.
+C DA - DAILY ARCHIVE.
+C CH - CHERNOBYL ARCHIVE.
+C TG - TOGA ARCHIVE.
+C MO - MONTHLY.
+C
+C HDIS - NEW , NEW ENTRY REQUIRED.
+C OLD , DELETE OLD ENTRY BEFORE MAKING
+C NEW ONE.
+C
+C HTYP - AN , ANALYSIS.
+C IA , INITIALISED ANALYSIS.
+C FG , FIRST GUESS.
+C FC , FORECAST.
+C EA , ERRORS IN ANALYSIS.
+C CL , CLIMATOLOGY.
+C
+C
+C HREP - SH , SPHERICAL HARMONICS.
+C GG , GAUSSIAN GRID.
+C LL , LAT/LONG GRID.
+C
+C HLEV - M , MODEL LEVELS.
+C P , PRESSURE LEVELS.
+C S , SURFACE.
+C
+C HARE - G , GLOBAL DATA.
+C
+C HPER - S , SHORT RETENTION PERIOD.
+C M , MEDIUM RETENTION PERIOD.
+C P , PERMANENT RETENTION.
+C
+C HFIR - DATE OF FIRST ARCHIVE (YYMMDD).
+C
+C HOWN - OWNER'S PASSWORD. 6 CHARACTERS FOR
+C RESEARCH EXPERIMENTS, 5 FOR OPERATIONS.
+C
+C HBAK - 0 , NO BACKUP NODES REQUIRED.
+C 1 , 1 BACKUP OF NODES REQUIRED.
+C
+C HCLS - RD , RESEARCH DEPARTMENT.
+C OD , OPERATIONS DEPARTMENT.
+C
+C HFAM - N, NO FAMILY ATTRIBUTE IN NODES.
+C Y , FAMILY ATTRIBUTES IN NODES.
+C
+C HRUT - ROOT NODE TO BE USED.
+C FOR RESEARCH
+C P , PRODUCTION ROOT MARSR.
+C T , TEST ROOT MATSR.
+C FOR OPERATIONS
+C P , PRODUCTION ROOT MARST.
+C O , OLD PRODUCTION ROOT MARSO.
+C T , TEST ROOT MATST.
+C
+C KPR - DEBUG PRINT SWITCH.
+C 0 , NO PRINTOUT.
+C 1 , DEBUG PRINTOUT.
+C
+C OUTPUT PARAMETERS.
+C ------------------
+C
+C KRET - ERROR RETURN CODE.
+C 0 , NO ERROR ENCOUNTERED.
+C 1 , ERROR IN REMOVING OLD NODES.
+C 2 , ERROR IN CREATING NEW NODES.
+C 3 , ERROR IN ADDING VALIDATION ENTRIES.
+C 4 , ERROR IN ADDING FAMILY ATTRIBUTE.
+C 5 , ERROR IN PASSWORD.
+C 6 , ATTEMPT TO DELETE OPERATIONAL NODE.
+C 7 , EXPERIMENT IDENTIFIER NOT FOUR
+C CHARACTERS.
+C 8 , DATE OF FIRST ARCHIVE NOT 6 DIGITS.
+C
+C METHOD.
+C -------
+C
+C ROOT NODES ARE ASSUMED TO EXIST. CACHE NODES CREATED
+C AUTOMATICALLY, BACKUP NODES IF REQUIRED.
+C DELETION OF OPERATIONAL NODES IS PROHIBITED.
+C
+C EXTERNALS.
+C ----------
+C
+C ECFILE
+C
+C REFERENCE.
+C ----------
+C
+C MARS DESIGN NOTE 30. FILE 460 24.03.88.
+C
+C COMMENTS.
+C ---------
+C
+C ROUTINE CONTAINS SECTIONS 0 TO 4 AND SECTION 9.
+C ADDITION OF FAMILY ATTRIBUTE NOT POSSIBLE IN FIRST VERSION.
+C
+C AUTHOR.
+C -------
+C
+C J. HENNESSY ECMWF 28:06:89.
+C
+C MODIFICATIONS
+C --------------
+C
+C NONE.
+C
+C----<
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 0 . DEFINITION OF VARIABLES.
+C ----------------------------------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+C
+ CHARACTER*4 HEXP
+ CHARACTER*2 HSTR
+ CHARACTER*4 HDIS
+ CHARACTER*4 HTYP
+ CHARACTER*4 HREP
+ CHARACTER*4 HLEV
+ CHARACTER*4 HARE
+ CHARACTER*1 HPER
+ CHARACTER*6 HFIR
+ CHARACTER*6 HOWN
+ CHARACTER*1 HBAK
+ CHARACTER*2 HCLS
+ CHARACTER*1 HFAM
+ CHARACTER*1 HRUT
+C
+ CHARACTER*36 YLINE
+C
+ CHARACTER*160 YREQ
+C
+ CHARACTER*6 YNODE1
+ CHARACTER*3 YNODE2
+ CHARACTER*5 YNODE3
+ CHARACTER*5 YNODE4
+ CHARACTER*5 YNODE5
+C
+ DIMENSION IREASON(3)
+C
+ DIMENSION YLINE(3)
+C
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 1 . SET INITIAL VALUES. CHECK PARAMETERS.
+C ----------------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'CCF1CR : SECTION 1.'
+C
+ KRET = 0
+C
+C* CHECK THAT EXPERIMENT OR STREAM IDENTIFIER IS 4 CHARACTERS LONG.
+C
+ I = INDEX (HEXP,' ')
+ IF (I.NE.0)
+ C THEN
+ KRET = 7
+ WRITE (*,9006) HEXP
+ GO TO 9000
+ ENDIF
+C
+C* CHECK THAT FIRST ARCHIVE DATE CONSISTS OF 6 DIGITS.
+C
+ I = INDEX (HFIR,' ')
+ IF (I.NE.0)
+ C THEN
+ KRET = 8
+ WRITE (*,9007) HFIR
+ GO TO 9000
+ ENDIF
+C
+C
+C* FOR COMPATIBILITY WITH PREVIOUS USER INTERFACE A FEW DEFAULT
+C VALUES HAVE TO BE SET UP, WHEN NONE ARE PROVIDED.
+C
+ IF (HCLS.EQ.' ') HCLS = 'RD'
+ IF (HFAM.EQ.' ') HFAM = 'N'
+ IF (HCLS.EQ.'RD') HFAM = 'N'
+ IF (HCLS.EQ.'RD') HSTR = 'DA'
+ IF (HRUT.EQ.' ') HRUT = 'P'
+C
+C
+C CHECK THAT OWNER'S PASSWORD IS CORRECT LENGTH ( 5 FOR OPERATIONS
+C 6 FOR RESEARCH).
+C
+ IL = INDEX (HOWN,' ')
+ IF (IL.EQ.6) IL = 5
+ IF (IL.EQ.0) IL = 6
+ IF (IL.EQ.5.AND.HCLS.NE.'OD') KRET = 5
+ IF (IL.EQ.6.AND.HCLS.NE.'RD') KRET = 5
+ IF (KRET.EQ.5)
+ C THEN
+ WRITE (*,9008) HOWN
+ GO TO 9000
+ ENDIF
+C
+C* RESEARCH ARCHIVE IS DAILY ARCHIVE ONLY. OPERATIONAL ARCHIVES
+C HAVE SEVERAL STREAMS, WHICH ARE USED TO MAKE UP CFS PATHNAME,
+C IN THE SAME NODE AS THE RESEARCH EXPERIMENT IDENTIFIER.
+C
+ IF (HCLS.EQ.'OD')
+ C THEN
+ HEXP = 'OPER'
+ IF (HSTR.EQ.'CH') HEXP = 'CHER'
+ IF (HSTR.EQ.'TG') HEXP = 'TOGA'
+ ENDIF
+C
+C* SET UP VALUES FOR FIRST 5 NODES EG MARSR/FC/EXPV/SPGS/1989.
+C
+C NODE 1.
+C
+ IF (HCLS.EQ.'RD'.AND.HRUT.EQ.'P') YNODE1 = '/MARSR'
+ IF (HCLS.EQ.'RD'.AND.HRUT.EQ.'T') YNODE1 = '/MATSR'
+C
+ IF (HCLS.EQ.'OD'.AND.HRUT.EQ.'T') YNODE1 = '/MATST'
+ IF (HCLS.EQ.'OD'.AND.HRUT.EQ.'O') YNODE1 = '/MARSO'
+ IF (HCLS.EQ.'OD'.AND.HRUT.EQ.'P') YNODE1 = '/MARST'
+C
+C NODE 2.
+C
+ YNODE2 = '/'//HTYP(1:2)
+C
+C NODE 3.
+C
+ YNODE3 = '/'//HEXP
+C
+C NODE 4.
+C
+ YNODE4 = '/'//HREP(1:1)//HLEV(1:1)//HARE(1:1)//HPER
+C
+C NODE 5.
+C
+ YNODE5 = '/19'//HFIR(1:2)
+C
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 2 . REMOVE ANY EXISTING NODES AND FILES, IF REQUIRED.
+C ----------------------------------------------------------------
+C
+ 2000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'CCF1CR : SECTION 2.'
+C
+ IF (HDIS(1:1).EQ.'O')
+ C THEN
+C
+C* REMOVAL OF OPERATIONAL NODES AND FILES NOT ALLOWED.
+C
+ IF (HCLS.EQ.'OD'.AND.(HRUT.EQ.'P'.OR.HRUT.EQ.'O'))
+ C THEN
+ KRET = 6
+ WRITE (*,9004)
+ GO TO 9000
+ ENDIF
+C
+ YTEMP = 'REMOVE'
+ CALL LDC1CR (YTEMP,HOWN(1:IL),HEXP,HTYP,HCLS,HSTR,HRUT,
+ C KPR,IRC)
+C
+C IGNORE RETURN CODE FOR EXPERIMENT DOES NOT EXIST.
+C
+ IF (IRC.GT.1)
+ C THEN
+ KRET = 1
+ WRITE (*,9005)
+ GO TO 9000
+ ENDIF
+ ENDIF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 3 . CREATE NODE (AND BACKUP NODES IF REQUIRED).
+C ----------------------------------------------------------------
+C
+ 3000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'CCF1CR : SECTION 3.'
+C
+ DO 3900 J3900 = 1 , 4
+C
+C* IF FIRST TIME THROUGH SET UP /ROOT/TYPE NODES.
+C
+ IF (J3900.EQ.1)
+ C THEN
+ YLINE(1) = YNODE1//YNODE2//','
+ YLINE(2) = '/CACHE'//YNODE1//YNODE2//','
+ YLINE(3) = '/MARSBACKUP'//YNODE1//YNODE2//','
+ ENDIF
+C
+C* IF SECOND TIME THROUGH SET UP /ROOT/TYPE/EXPVER NODES.
+C
+ IF (J3900.EQ.2)
+ C THEN
+ YLINE(1) = YNODE1//YNODE2//YNODE3//','
+ YLINE(2) = '/CACHE'//YNODE1//YNODE2//YNODE3//','
+ YLINE(3) = '/MARSBACKUP'//YNODE1//YNODE2//YNODE3//','
+ ENDIF
+C
+C* IF THIRD TIME THROUGH SET UP /ROOT/TYPE/EXPVER/DESCRIPTOR NODES.
+C
+ IF (J3900.EQ.3)
+ C THEN
+ YLINE(1) = YNODE1//YNODE2//YNODE3//YNODE4//','
+ YLINE(2) = '/CACHE'//YNODE1//YNODE2//YNODE3//YNODE4//','
+ YLINE(3) = '/MARSBACKUP'//YNODE1//YNODE2//YNODE3//YNODE4
+ C //','
+ ENDIF
+C
+C* IF FOURTH TIME THROUGH SET UP /ROOT/TYPE/EXPVER/DESCRIPTOR/YEAR
+C NODES.
+C
+ IF (J3900.EQ.4)
+ C THEN
+ YLINE(1) = YNODE1//YNODE2//YNODE3//YNODE4//YNODE5//','
+ YLINE(2) = '/CACHE'//YNODE1//YNODE2//YNODE3//YNODE4
+ C //YNODE5//','
+ YLINE(3) = '/MARSBACKUP'//YNODE1//YNODE2//YNODE3//YNODE4
+ C //YNODE5//','
+ ENDIF
+C
+C
+ J = 0
+C
+ 3100 CONTINUE
+C
+ J = J + 1
+ I = INDEX (YLINE(J),',')
+ YREQ = 'FN=ADD,NA,PATH='//YLINE(J)(1:I)//'UVAL=UV1/WMB/'
+ C //HOWN(1:IL)//'/S.'
+ IF (KPR.EQ.1) WRITE (*,9003) YREQ
+ CALL ECFILE (IERR,IREASON,YREQ)
+C
+C TRAP RETURN CODES FOR NODE ALREADY EXISTS.
+C
+ IF (IERR .EQ. 9.
+ C AND.IREASON(1).EQ.1.
+ C AND.IREASON(2).EQ.2.
+ C AND.IREASON(3).EQ.12) GO TO 3300
+C
+ IF (IERR.NE.0)
+ C THEN
+ WRITE (*,9001) IERR , IREASON
+ WRITE (*,9003) YREQ
+ KRET = 2
+ GO TO 9000
+ ENDIF
+C
+C ADD VALIDATION ENTRY.
+C
+ YREQ = 'FN=MODIFY,PW='//HOWN(1:IL)//',NA,PATH='//YLINE(J)(1:I)//
+ C 'AVAL=PUB/IR/-/S.'
+ IF (KPR.EQ.1) WRITE (*,9003) YREQ
+ CALL ECFILE (IERR,IREASON,YREQ)
+C
+C TRAP RETURN CODES FOR ENTRY ALREADY EXISTS.
+C
+ IF (IERR .EQ. 9.
+ C AND.IREASON(1).EQ.1.
+ C AND.IREASON(2).EQ.115.
+ C AND.IREASON(3).EQ.5) GO TO 3300
+C
+ IF (IERR.NE.0)
+ C THEN
+ WRITE (*,9002) IERR , IREASON
+ WRITE (*,9003) YREQ
+ KRET = 3
+ GO TO 9000
+ ENDIF
+C
+ 3300 CONTINUE
+C
+C CREATE CACHE NODES.
+C
+ IF (J.LT.2) GO TO 3100
+C
+C CREAT BACKUP NODES IF REQUIRED.
+C
+ IF (HBAK.EQ.'1'.AND.J.EQ.2) GO TO 3100
+C
+ 3900 CONTINUE
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 4 . ADD FAMILY ATTRIBUTES.
+C ----------------------------------------------------------------
+C
+ 4000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'CCF1CR : SECTION 4.'
+C
+ IF (HFAM.EQ.'Y')
+ C THEN
+ KRET = 4
+ WRITE (*,*) 'CCF1CR : FAMILY ATTRIBUTES NOT IMPLEMENTED.'
+ GO TO 9000
+ ENDIF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 9 . RETURN TO CALLING ROUTINE. FORMAT STATEMENTS.
+C ------------------------------------------------------------------
+C
+ 9000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'CCF1CR : SECTION 9.'
+C
+C
+ RETURN
+C
+C
+ 9001 FORMAT (1H ,'CCF1CR : NODE CREATION ERROR. FAILURE CODE = ',I3,
+ C ' , REASON CODES = ',3I6,' .')
+C
+ 9002 FORMAT (1H ,'CCF1CR : VALIDATION ENTRY. FAILURE CODE = ',I3,
+ C ' , REASON CODES = ',3I6,' .')
+C
+ 9003 FORMAT (1H ,A)
+C
+ 9004 FORMAT (1H ,'CCF1CR : OPERATIONAL NODE DELETION ILLEGAL.')
+C
+ 9005 FORMAT (1H ,'CCF1CR : DELETION OF OLD NODES/FILES FAILED.')
+C
+ 9006 FORMAT (1H ,'CCF1CR : EXPERIMENT IDENTIFIER NOT 4 CHARACTERS - ',
+ C A)
+C
+ 9007 FORMAT (1H ,'CCF1CR : FIRST ARCHIVE DATE NOT 6 DIGITS - ',A)
+C
+ 9008 FORMAT (1H ,'CCF1CR : OWNER (PASSWORD) INVALID - ',A)
+C
+C ------------------------------------------------------------------
+C
+C
+ END
diff --git a/gribex/cgsloop.c b/gribex/cgsloop.c
new file mode 100755
index 0000000..6044f35
--- /dev/null
+++ b/gribex/cgsloop.c
@@ -0,0 +1,124 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+/**************************************************************************
+.TITLE ECMWF Utility
+.NAME GRIBEX
+.SECTION L
+.AUTHOR Otto Pesonen
+.DATE 05-JUN-1996 / 05-JUN-1996 / OP
+.VERSION 1.0
+.LANGUAGE ANSI-C
+.FILE cgsloop.c
+.OS FUJITSU
+*
+* Vector loops of gsbite.f coded in C
+*
+* C has unsigned datatypes
+*
+************************************o*************************************/
+
+#include <stdio.h>
+
+#pragma global noalias
+#pragma global novrec
+
+gsdecode_(
+ unsigned int *in,
+ unsigned int *out,
+ int *ist_, int *ost_, int *len_, unsigned int *mask_, int *ish_)
+{
+ int oidx = 0;
+ int iidx = 0;
+
+ int ist = *ist_;
+ int ost = *ost_;
+ int len = *len_;
+ unsigned int mask = *mask_;
+ int ish = *ish_;
+
+ int factor;
+
+ if( ish < 0 )
+ {
+ ish = (-ish);
+
+ factor = 1<<ish;
+
+#pragma loop novrec
+ for( ; len ; len-- )
+ {
+ out[oidx] = out[oidx] | (in[iidx] & mask) / factor;
+ oidx += ost;
+ iidx += ist;
+ }
+ }
+ else
+ {
+ factor = 1<<ish;
+
+#pragma loop novrec
+ for( ; len ; len-- )
+ {
+ out[oidx] = out[oidx] | (in[iidx] & mask) * factor;
+ oidx += ost;
+ iidx += ist;
+ }
+ }
+}
+
+gsencode_(
+ unsigned int *in,
+ unsigned int *out,
+ int *ist_, int *ost_, int *len_, unsigned int *mask_, int *ish_)
+{
+ int oidx = 0;
+ int iidx = 0;
+
+ int ist = *ist_;
+ int ost = *ost_;
+ int len = *len_;
+ unsigned int mask = *mask_;
+ int ish = *ish_;
+
+ int factor;
+
+ ish = (-ish);
+
+ if( ish < 0 )
+ {
+ ish = (-ish);
+
+ factor = 1<<ish;
+#pragma loop novrec
+ for( ; len ; len-- )
+ {
+ out[oidx] = ((in[iidx] / factor) & mask) |
+ (out[oidx] & (~mask)) ;
+ oidx += ost;
+ iidx += ist;
+ }
+ }
+ else
+ {
+ factor = 1<<ish;
+
+#pragma loop novrec
+ for( ; len ; len-- )
+ {
+ out[oidx] = ((in[iidx] * factor) & mask) |
+ (out[oidx] & (~mask)) ;
+ oidx += ost;
+ iidx += ist;
+ }
+ }
+}
+
diff --git a/gribex/cheknum.F b/gribex/cheknum.F
new file mode 100755
index 0000000..8fd7b6b
--- /dev/null
+++ b/gribex/cheknum.F
@@ -0,0 +1,65 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE CHEKNUM (VALU,LVAL,NUM)
+C
+C---->
+C*
+C* NAME : CHEKNUM
+C*
+C* FUNCTION : CHECKS THAT A CHARACTER STRING CORRECTLY
+C* REPRESENTS A NUMBER.
+C*
+C* INPUT : VALU = CHARACTER STRING TO BE CHECKED
+C* LVAL = NUMBER OF CHARACTERS IN THIS STRING
+C*
+C* OUTPUT : NUM = 0, IF STRING REPRESENTS A NUMBER.
+C* 1, IF INVALID CHARACTER FOUND.
+C*
+C* JOHN HENNESSY, ECMWF, 16TH APRIL 1985
+C
+C----<
+C ---------------------------------------------------------------
+C
+ IMPLICIT INTEGER (A-Z)
+C
+ CHARACTER*(*) VALU
+ NUM = 0
+C
+C CHECK ONE CHARACTER STRING FOR VALID DIGIT.
+C
+ IF (VALU(1:1).LT.'0'.OR.VALU(1:1).GT.'9') NUM=1
+ IF (LVAL.EQ.1) RETURN
+C
+C CHECK FOR SIGN OR DECIMAL POINT AS FIRST CHARACTER IN STRING.
+C
+ IF (VALU(1:1).EQ.'+') NUM = 0
+ IF (VALU(1:1).EQ.'-') NUM = 0
+ IF (VALU(1:1).EQ.'.') NUM = 0
+ IF (NUM.EQ.1) RETURN
+C
+ TOTAL = 1
+ POINT = 0
+ IF (VALU(1:1).EQ.'.') POINT = 1
+C
+ DO 100 I=2,LVAL
+ IF (VALU(I:I).EQ.'.') POINT = POINT + 1
+ IF (VALU(I:I).GE.'0'.AND.VALU(I:I).LE.'9')
+ C TOTAL = TOTAL + 1
+ 100 CONTINUE
+C
+ TOTAL = TOTAL + POINT
+ IF (VALU(1:1).EQ.'.') TOTAL = TOTAL - 1
+ IF (TOTAL.NE.LVAL) NUM = 1
+ IF (POINT.GT.1) NUM = 1
+C
+ RETURN
+ END
diff --git a/gribex/chktab2.F b/gribex/chktab2.F
new file mode 100755
index 0000000..1044fd6
--- /dev/null
+++ b/gribex/chktab2.F
@@ -0,0 +1,257 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION CHKTAB2 ( KSEC1,
+ X HFIRST, HSECOND, HTHIRD, HFOURTH)
+C
+C---->
+C**** CHKTAB2
+C
+C Purpose
+C -------
+C
+C Checks whether or not a parameter appears in a given code
+C table 2 for WMO code FM 92-X Ext. GRIB (WMO standard, ECMWF local,
+C or even local from another centre).
+C
+C
+C Interface
+C ---------
+C
+C IRET = CHKTAB2(KSEC1, HFIRST, HSECOND, HTHIRD, HFOURTH)
+C
+C Input
+C -----
+C
+C KSEC1 - Section 1 values for a GRIB product.
+C
+C
+C Output
+C ------
+C
+C HFIRST - First line of descriptor: MARS mnemonic
+C HSECOND - Second line of descriptor: Parameter description
+C HTHIRD - Third line of descriptor: Units for the parameter
+C HFOURTH - Fourth line of descriptor: Description of units
+C
+C Function return value is:
+C 0 - Parameter found in table
+C 20001 - No match found for the parameter number in the given table.
+C 20002 - Error opening the file holding the given table.
+C 20003 - Error finding an unused fortran unit number for reading table.
+C
+C
+C Method
+C ------
+C
+C Use TAB2FIL to determine file name for code table.
+C
+C Entry for each parameter in table has the format (without quotes):
+C "......................" Separator
+C "051" Paramter number
+C "MX2T24" MARS mnemonic
+C "Max 2m temp" Parameter description
+C "K" Units for the parameter
+C "During previous 24 hours" Further description
+C
+C There is a termination "......................" line in the file
+C and there may be lines of comment before the first parameter entry.
+C
+C The current parameter definition file is kept open between calls.
+C
+C
+C Externals
+C ---------
+C TAB2FIL - Builds code table 2 file name.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF March 1999
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C J. Clochard, Meteo France, for ECMWF - June 1999.
+C Argument KSEC1 instead of KPARAM and KTABLE for replacement of
+C LOCAL2K, and code tables management.
+C Use TAB2FIL function for file name building.
+C
+C _______________________________________________________
+C----<
+C
+C
+ IMPLICIT NONE
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPMAXTB, JPDITB
+ PARAMETER ( JPROUTINE = 20000, JPMAXTB = 10, JPDITB = 256 )
+C
+C Function arguments
+C
+ INTEGER KSEC1 (*)
+C
+ CHARACTER*(*) HFIRST, HSECOND, HTHIRD, HFOURTH
+C
+C Local variables
+C
+ LOGICAL LNEWTAB
+ INTEGER TABLE2(JPDITB,JPMAXTB), INDTAB, NUMTAB, LOOP, NEXT
+ INTEGER IPR, IRET, ISTATUS, ITABLE, IPARAM, ICENTR
+C
+ CHARACTER*81 YFIRST(2:JPDITB,JPMAXTB), YSECOND(2:JPDITB,JPMAXTB)
+ CHARACTER*81 YTHIRD(2:JPDITB,JPMAXTB), YFOURTH(2:JPDITB,JPMAXTB)
+ CHARACTER*256 YFILE, YDUMMY
+C
+ INTEGER NUNIT
+C
+ SAVE NUNIT, NUMTAB, TABLE2, YFIRST, YSECOND, YTHIRD, YFOURTH
+C
+C External functions
+C
+ INTEGER TAB2FIL
+ EXTERNAL TAB2FIL
+C
+ DATA NUMTAB/0/
+C
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C See if a new table is requested.
+C
+ ITABLE = KSEC1(1)
+ IF( KSEC1(22).EQ.98 ) THEN
+ ICENTR = 98
+ ELSE
+ ICENTR = KSEC1(2)
+ ENDIF
+ IPARAM = KSEC1(6)
+C
+ IF( MAX( ITABLE, IPARAM) .GT. 127 ) THEN
+ ITABLE = 1000*ICENTR + ITABLE
+ ENDIF
+C
+ LNEWTAB = .TRUE.
+C print *, 'CHKTAB2: TABLE2(1,:)=', TABLE2(1,:NUMTAB)
+ DO LOOP = 1, NUMTAB
+ IF( ITABLE.EQ.TABLE2(1,LOOP) ) THEN
+ LNEWTAB = .FALSE.
+ INDTAB = LOOP
+ GOTO 300
+ ENDIF
+ ENDDO
+C
+C Read values in the new table.
+C
+ IF( LNEWTAB ) THEN
+ NUMTAB = NUMTAB + 1
+ IF( NUMTAB.GT.JPMAXTB ) NUMTAB = 1
+ INDTAB = NUMTAB
+ TABLE2(1,INDTAB) = ITABLE
+C
+ DO LOOP = 2, JPDITB
+ TABLE2(LOOP,INDTAB) = 0
+ ENDDO
+C
+C Find an unused fortran unit number
+C
+ IPR = 0
+ CALL FTN1CR(NUNIT, IPR, IRET)
+ IF( IRET.NE.0 ) THEN
+ NUMTAB = NUMTAB - 1
+ CHKTAB2 = JPROUTINE + 3
+ RETURN
+ ENDIF
+C
+C Build filename
+C
+ IRET = TAB2FIL( KSEC1(1), IPARAM, ICENTR, YFILE )
+C
+C Open file
+C
+ OPEN(UNIT=NUNIT, FILE=YFILE, ERR=910, IOSTAT=ISTATUS,
+ X STATUS='OLD',FORM='FORMATTED')
+ REWIND(UNIT=NUNIT)
+C
+C ------------------------------------------------------------------
+C* Section 2. Fill the new parameter table.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+ NEXT = 1
+C
+C Skip lines until '......................' separator found
+C
+ 210 CONTINUE
+ READ(NUNIT,'(A)',END=230) YDUMMY
+ IF( YDUMMY(1:22).EQ.'......................') GOTO 225
+ GOTO 210
+C
+C Loop through file
+C
+ 220 CONTINUE
+ READ(NUNIT,'(A)',END=230) YDUMMY
+ 225 CONTINUE
+ NEXT = NEXT + 1
+ READ(NUNIT,'(I3.3)',END=230) TABLE2(NEXT,INDTAB)
+ READ(NUNIT,'(A)',END=230) YFIRST(NEXT,INDTAB)
+ READ(NUNIT,'(A)',END=230) YSECOND(NEXT,INDTAB)
+ READ(NUNIT,'(A)',END=230) YTHIRD(NEXT,INDTAB)
+ READ(NUNIT,'(A)',END=230) YFOURTH(NEXT,INDTAB)
+ GOTO 220
+C
+ 230 CONTINUE
+C
+ CLOSE(UNIT=NUNIT)
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 3. Search for parameter in the table.
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ CHKTAB2 = JPROUTINE + 1
+C
+ DO LOOP = 2,JPDITB
+ IF( IPARAM.EQ.TABLE2(LOOP,INDTAB) ) THEN
+ HFIRST = YFIRST(LOOP,INDTAB)
+ HSECOND = YSECOND(LOOP,INDTAB)
+ HTHIRD = YTHIRD(LOOP,INDTAB)
+ HFOURTH = YFOURTH(LOOP,INDTAB)
+ CHKTAB2 = 0
+ RETURN
+ ENDIF
+ ENDDO
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+C Drop through if not found.
+C
+ RETURN
+C
+C Error opening table file
+C
+ 910 CONTINUE
+ TABLE2(1,NUMTAB) = -1
+ NUMTAB = NUMTAB - 1
+ CHKTAB2 = JPROUTINE + 2
+ RETURN
+ END
diff --git a/gribex/cmpck.F b/gribex/cmpck.F
new file mode 100755
index 0000000..e8a1eab
--- /dev/null
+++ b/gribex/cmpck.F
@@ -0,0 +1,140 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CMPCK(PSPEC,KTRUNC,KTRUNCNP)
+C
+C---->
+C**** CMPCK
+C
+C Purpose.
+C --------
+C
+C Puts spectral coefficients in contiguous locations.
+C
+C
+C** Interface.
+C ----------
+C
+C CALL CMPCK(PSPEC,KTRUNC,KTRUNCNP)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C PSPEC - Array of spectral coefficients.
+C KTRUNC - Truncation of the spherical harmonic coefficients.
+C KTRUNCNP - Truncation of the subset of spherical harmonic
+C coefficients to be ignored.
+C
+C
+C Output Parameters.
+C -----------------
+C
+C PSPEC - Array of spectral coefficients rearranged.
+C
+C
+C Method.
+C -------
+C
+C <subset>|
+C
+C Given numbers: cccccccc|CCCCCC
+C cccccc|CCCCCC
+C cccc|CCCCCC
+C cc|CCCCCC
+C |CCCCCC
+C CCCC
+C CC
+C
+C Removes the subset and makes the CCCCCC...C values contiguous
+C in array PSPEC.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C M.Hamrut ECMWF 09:05:94
+C
+C
+C Modifications.
+C _____________
+C
+C None.
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ INTEGER KTRUNC, KTRUNCNP
+ REAL PSPEC
+ DIMENSION PSPEC((KTRUNC+1)*(KTRUNC+2))
+C
+C Local variables.
+ INTEGER IUC, IC, JM, JN, IL2, IL1, ILEN
+C
+C
+C -----------------------------------------------------------------
+C* Section 1. Move only the required values (overwriting).
+C -----------------------------------------------------------------
+C
+ IUC=0
+ IC =0
+C
+C Loop through rows.
+ DO 102 JM=0,KTRUNC
+C
+C In each row calculate value to start with.
+C For early rows there are some value to skip (in the subset
+C being ignored).
+ IL2=MAX(JM,KTRUNCNP+1)
+ IL1=IL2-1
+ IUC=IUC+MAX((IL1-JM+1)*2,0)
+ ILEN=2*(KTRUNC-IL2+1)
+C
+C Move values for the row.
+CDIR$ IVDEP
+!OCL NOVREC
+ DO 104 JN=1,ILEN
+ IUC = IUC+1
+ IC = IC+1
+ PSPEC(IC) = PSPEC(IUC)
+ 104 CONTINUE
+ 102 CONTINUE
+C
+C -----------------------------------------------------------------
+C* Section 9. Return.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/gribex/cnbits.F b/gribex/cnbits.F
new file mode 100755
index 0000000..3d93e77
--- /dev/null
+++ b/gribex/cnbits.F
@@ -0,0 +1,127 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ INTEGER FUNCTION CNBITS( VALUES, LAT, LONG )
+C
+C---->
+C**** CNBITS
+C
+C Purpose.
+C --------
+C
+C Calculate the number of bits needed to code a range of
+C field values.
+C
+C
+C** Interface.
+C ----------
+C
+C CALL CNBITS( VALUES, LAT, LONG )
+C
+C
+C Input
+C -----
+C
+C VALUES - array of real numbers
+C LAT - first dimension of the array
+C (e.g. number of points along a meridian )
+C LONG - second dimension of the array
+C (e.g. number of points along a parallel )
+C
+C
+C Output
+C ------
+C
+C CNBITS return value is required number of bits.
+C
+C
+C Method.
+C -------
+C
+C Finds power of 2 required to scan the range of values.
+C
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C ---------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 8 Nove 1994
+C
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+C Arguments
+ INTEGER LAT,LONG
+ REAL VALUES( LAT, LONG)
+C
+C Local variables
+ INTEGER ILAT,ILON
+ REAL RMAXV, RMINV, RANGE
+C
+C ----------------------------------------------------------------
+C* Section 1 . Find maximum and minimum for the given values
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+ CNBITS = 0
+C
+C Find maximum and minimum for the given values
+ RMINV = 0.0
+ RMAXV = 0.0
+C
+ DO 120 ILAT = 1, LAT
+ DO 110 ILON = 1, LONG
+ IF ( RMINV .GT. (VALUES( ILAT, ILON)) )
+ X RMINV = (VALUES( ILAT, ILON))
+ IF ( RMAXV .LT. (VALUES( ILAT, ILON)) )
+ X RMAXV = (VALUES( ILAT, ILON))
+ 110 CONTINUE
+ 120 CONTINUE
+C
+ RANGE = ABS( RMAXV - RMINV )
+C
+C Calculate the number of bits needed to span the number range
+ IF ( RANGE .EQ. 0.0 ) THEN
+ CNBITS = 1
+ ELSE
+ CNBITS = INT ( (ALOG( RANGE )/ALOG(2.0)) ) + 1
+ ENDIF
+C
+ RETURN
+ END
diff --git a/gribex/codegb.F b/gribex/codegb.F
new file mode 100755
index 0000000..0de0d0d
--- /dev/null
+++ b/gribex/codegb.F
@@ -0,0 +1,1430 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE CODEGB (FPDATA,ILENF,IBITS,NBIT,IB1PAR,
+ C IB2PAR,FVERT,ILENV,IGRIB,ILENG,IWORD,
+ C IROUND,IERR)
+C
+C---->
+C*
+C* NAME : CODEGB
+C*
+C* FUNCTION : CODE ARRAY OF FLOATING POINT VALUES
+C* IN WMO GRIB CODE.
+C*
+C* INPUT : PARAMETERS FOR BLOCK 1 , PRODUCT DEFINITION BLOCK.
+C* --------------------------------------------------
+C* IB1PAR - INTEGER ARRAY (DIMENSION 18) OF PRODUCT
+C* DEFINITION INFORMATION.
+C*
+C* WORD CONTENTS
+C* ---- --------
+C* 1 ORIGINATING CENTRE IDENTIFIER.
+C* 2 MODEL IDENTIFICATION.
+C* 3 GRID DEFINITION.
+C* 4 FLAG ( CODE TABLE 1 ).
+C* 5 PARAMETER IDENTIFIER (CODE TABLE 2).
+C* 6 TYPE OF LEVEL (CODE TABLE 3).
+C* 7-8 VALUE(S) OF LEVEL (CODE TABLE 3).
+C* 9 YEAR OF DATA
+C* 10 MONTH OF DATA
+C* 11 DAY OF DATA
+C* 12 HOUR OF DATA
+C* 13 MINUTE OF DATA
+C* 14 TIME UNIT (CODE TABLE 4).
+C* 15 TIME RANGE ONE
+C* 16 TIME RANGE TWO
+C* 17 TIME RANGE FLAG (CODE TABLE 5).
+C* 18 NUMBER AVERAGED.
+C*
+C* VALUE(S) OF LEVEL CAN OCCUPY 2 WORDS.
+C* FOR A LAYER THE FIRST WORD DEFINES THE TOP
+C* AND THE SECOND THE BOTTOM OF THE LAYER.
+C* FOR A SINGLE LEVEL, ONLY THE FIRST WORD IS
+C* USED.
+C*
+C* PARAMETERS FOR BLOCK 2 , GRID DEFINITION BLOCK.
+C* -----------------------------------------------
+C* IB2PAR - INTEGER ARRAY (DIMENSION 11) CONTAINING GRID
+C* DEFINITION INFORMATION.
+C* USE VARIES WITH REPRESENTATION TYPE.
+C*
+C* WORD LAT/LONG GRID
+C* ---- -------------
+C* 1 DATA REPRESENTATION TYPE (CODE TABLE 6)
+C* 2 NO. OF POINTS ALONG A LATITUDE
+C* 3 NO. OF POINTS ALONG A MERIDIAN
+C* 4 LATITUDE OF ORIGIN (SOUTH - IVE).
+C* 5 LONGITUDE OF ORIGIN (WEST - IVE).
+C* 6 RESOLUTION FLAG. (CODE TABLE 7)
+C* 7 LATITUDE OF EXTREME POINT (SOUTH - IVE).
+C* 8 LONGITUDE OF EXTREME POINT (WEST - IVE).
+C* 9 LATITUDE INCREMENT
+C* 10 LONGITUDE INCREMENT
+C* 11 SCANNING MODE FLAGS (CODE TABLE 8)
+C*
+C* WORD GAUSSIAN GRID
+C* ---- -------------
+C* 1-9 AS FOR LAT/LONGITUDE GRID.
+C* 10 THE NUMBER OF LATITUDE LINES BETWEEN A POLE
+C* AND THE EQUATOR.
+C* 11 SCANNING MODE FLAGS (CODE TABLE 8)
+C*
+C* WORD SPHERICAL HARMONICS
+C* ---- -------------------
+C* 1 DATA REPRESENTATION TYPE (CODE TABLE 6)
+C* 2 J - PENTAGONAL RESOLUTION PARAMETER
+C* 3 K - PENTAGONAL RESOLUTION PARAMETER
+C* 4 M - PENTAGONAL RESOLUTION PARAMETER
+C* 5 REPRESENTATION TYPE (CODE TABLE 9)
+C* 6 REPRESENTATION MODE (CODE TABLE 10)
+C* 7-11 NOT USED
+C*
+C*
+C* USE FOR OTHER DATA REPRESENTATION TYPES IS
+C* TO BE DEFINED LATER.
+C*
+C* FVERT - REAL ARRAY OF VERTICAL COORDINATE PARAMETERS
+C* ILENV - LENGTH OF THIS ARRAY (NUMBER OF COORDINATE
+C* PARAMETERS).
+C*
+C* USED FOR HYBRID LEVELS ONLY.
+C*
+C*
+C* PARAMETERS FOR BLOCK 3 , BIT-MAP DEFINITION BLOCK.
+C* --------------------------------------------------
+C*
+C* TO BE DEFINED LATER.
+C*
+C* PARAMETERS FOR BLOCK 4 , BINARY DATA BLOCK.
+C* -------------------------------------------
+C* FPDATA - ARRAY OF FLOATING POINT VALUES.
+C*
+C* ****
+C* VALUES IN THIS ARRAY ARE OVERWRITTEN
+C* BY THE SUBROUTINE.
+C* ****
+C*
+C* ILENF - LENGTH OF THIS ARRAY (NUMBER OF DATA
+C* VALUES TO BE CODED)
+C* IBITS - NUMBER OF BITS FOR CODED DATA VALUES.
+C*
+C* TO INDICATE MISSING DATA VALUES, ILENF IS
+C* MADE NEGATIVE AND ALL DATA VALUES SET TO 0.
+C*
+C* OTHER PARAMETERS
+C* ----------------
+C*
+C* NBIT - NUMBER OF BITS IN COMPUTER WORD.
+C*
+C* IGRIB - ARRAY TO RECEIVE DATA IN GRIB CODE.
+C* ILENG - LENGTH OF THIS ARRAY.
+C*
+C* IROUND - 0 , NO ROUNDING.
+C* 1 , ROUND TO NEAREST 120 OCTETS.
+C*
+C* OUTPUT : IGRIB - DATA CODED IN GRIB CODE.
+C* IWORD - NUMBER OF WORDS OCCUPIED BY CODED DATA.
+C*
+C* IERR - ERROR INDICATOR.
+C*
+C* 0, NO ERROR.
+C*
+C* -1, NUMBER OF BITS PER DATA VALUE EXCEEDS
+C* WORD LENGTH, OR MAXIMUM ALLOWED.
+C* -2, OUTPUT ARRAY TOO SMALL TO HOLD CODED
+C* DATA VALUES.
+C* -3, CURRENTLY UNDEFINED OPTION SELECTED.
+C* -4, MISSING DATA FIELD CONTAINS NON-ZERO.
+C*
+C* 1, INVALID ORIGINATING CENTRE.
+C* 2, INVALID MODEL IDENTIFICATION.
+C* 3, INVALID GRID DEFINITION.
+C* 4, INVALID BLOCK INDICATOR FLAG
+C* 5, INVALID PARAMETER IDENTIFIER.
+C* 6, INVALID LEVEL TYPE INDICATOR.
+C* 7, ERROR IN DESCRIPTION OF LEVELS.
+C* 8, DATE/TIME ERROR.
+C* 9, INVALID TIME UNIT OR RANGE.
+C* 10, INVALID DATA REPRESENTATION TYPE.
+C* 11, INVALID EXTREME POINT/INCREMENT FLAG.
+C* 12, INVALID SCANNING MODE FLAGS.
+C*
+C* JOHN HENNESSY , ECMWF , NOVEMBER 1985
+C*
+C Modifications.
+C -------------
+C
+C J. Hennessy ECMWF 08:10:90
+C Use temporary array IDATB to enable loop vectorisation.
+C Add M. Hamrud's modifications to us a vectorising version of
+C SBYTES.
+C
+C J. Hennessy ECMWF 29:11:90
+C Pad last bytes in the word after 7777 correctly with
+C binary zeroes.
+C
+C J. Hennessy ECMWF 19:11:92
+C Dimension of IDATB increased to 300000.
+C
+C----<
+C ---------------------------------------------------------------
+C
+C
+C
+C
+C
+ DIMENSION FPDATA(*),ILAT(2)
+c-- DIMENSION IDATB(ILENF)
+ DIMENSION IDATB(300000)
+ DIMENSION IMASK(100)
+ DIMENSION IGRIB(ILENG),IBLOCK(24)
+c-- DIMENSION FVERT(ILENV),IB1PAR(18),IB2PAR(11)
+ DIMENSION FVERT(ILENV),IB1PAR(*),IB2PAR(*)
+C
+ EQUIVALENCE (ZGRIB,JGRIB)
+C
+C
+C SET MAXIMUM NUMBER OF BITS PER DATA FIELD.
+C
+ DATA IMAX /60/
+C
+C CLEAR ERROR INDICATOR.
+C
+ IERR = 0
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* CHECK FOR MISSING DATA INDICATORS.
+C*
+C********************************************************************
+C
+C
+ IMISS = 0
+ IF (ILENF.LT.0)
+ C THEN
+ KLENF = - ILENF
+ IMISS = 1
+ DO 50 I=1,KLENF
+ IF (FPDATA(I).NE.0.)
+ C THEN
+ IERR = -4
+ WRITE (*,9012)
+ 9012 FORMAT (1H ,'NON-ZERO VALUE IN MISSING DATA',
+ C ' FIELD.')
+ RETURN
+ ENDIF
+ 50 CONTINUE
+ ELSE
+ KLENF = ILENF
+ ENDIF
+C
+C
+C
+C
+C********************************************************************
+C*
+C* CHECK NUMBER OF BITS PER DATA FIELD.
+C*
+C********************************************************************
+C
+C
+ IF (IBITS.GT.NBIT.OR.IBITS.GT.IMAX)
+ C THEN
+ IERR = -1
+ WRITE (*,9000) IBITS,NBIT,IMAX
+ 9000 FORMAT (1H ,'NUMBER OF BITS PER DATA VALUE, ',I3,
+ C 'EXCEEDS WORD LENGTH, ',I3,' OR MAXIMUM ',
+ C ' PERMITTED VALUE, ',I3)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 0 - INDICATOR BLOCK.
+C*
+C********************************************************************
+C
+C
+C
+C***
+C* THE LETTERS G R I B ARE INSERTED IN THE
+C* FIRST 4 ELEMENTS OF 'IBLOCK'.
+C***
+C
+ IBLOCK(1) = 71
+ IBLOCK(2) = 82
+ IBLOCK(3) = 73
+ IBLOCK(4) = 66
+C
+ IWORD = 1
+ IBYTE = 8
+ NVAL = 4
+ IOFF = 0
+C
+C PACK 4 8-BIT FIELDS IN BLOCK 0 OF CODED ARRAY.
+C
+ CALL SBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,IBYTE,0,NVAL)
+ CALL OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 1 - PRODUCT DEFINITION BLOCK.
+C*
+C********************************************************************
+C
+C
+C
+C***
+C* LENGTH OF BLOCK 1 (IN OCTETS) IN FIRST 3 OCTETS.
+C***
+C
+ IBLOCK(1) = 0
+ IBLOCK(2) = 0
+ IBLOCK(3) = 24
+C
+C
+C
+C
+C***
+C* FOURTH OCTET RESERVED AND SET TO 0.
+C***
+C
+ IBLOCK(4) = 0
+C
+C
+C
+C
+C
+C
+C***
+C* IDENTIFICATION OF CENTRE
+C***
+ IBLOCK(5) = IB1PAR(1)
+ IF (IB1PAR(1).LT.1.OR.IB1PAR(1).GT.98)
+ C THEN
+ IERR = 1
+ WRITE (*,9001) IB1PAR(1)
+ 9001 FORMAT (1H ,'INVALID ORIGINATING CENTRE ',I3)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C***
+C* MODEL IDENTIFICATION
+C***
+C
+ IBLOCK(6) = IB1PAR(2)
+ IF (IB1PAR(2).LT.1.OR.IB1PAR(2).GT.255)
+ C THEN
+ IERR = 2
+ WRITE (*,9002) IB1PAR(2)
+ 9002 FORMAT (1H ,'INVALID MODEL IDENTIFICATION ',I4)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* GRID DEFINITION
+C***
+C
+ IBLOCK(7) = IB1PAR(3)
+ IF (IB1PAR(3).LT.1.OR.IB1PAR(3).GT.255)
+ C THEN
+ IERR = 3
+ WRITE (*,9003) IB1PAR(3)
+ 9003 FORMAT (1H ,'INVALID GRID IDENTIFICATION ',I4)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OPTIONAL BLOCK INDICATOR FLAGS ( CODE TABLE 1 ).
+C***
+C
+C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE
+C
+C NONE 00000000 0
+C 2 10000000 128
+C 3 01000000 64
+C 2 AND 3 11000000 192
+C
+ IBLOCK(8) = IB1PAR(4)
+C
+C SHIFT 2-BIT FLAG FIELD RIGHT BY 6 BITS TO FACILITATE CHECKING
+C
+ KTEMP = IB1PAR(4) / 64
+C
+ IF (KTEMP.LT.0.OR.KTEMP.GT.3) IERR = 4
+C
+C CHECK IF GRID SPECIFIED IS UNCATALOGUED.
+C
+ IF (IB1PAR(3).EQ.255.AND.IB1PAR(4).EQ.0) IERR = 4
+ IF (IB1PAR(3).EQ.255.AND.IB1PAR(4).EQ.64) IERR = 4
+C
+ IF (IERR.NE.0)
+ C THEN
+ CALL PRTBIN (IB1PAR(4),8,KTEMP,ERR)
+ WRITE (*,9004) KTEMP
+ 9004 FORMAT (1H ,'INVALID BLOCK INDICATOR FLAG ',I8.8)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C***
+C* PARAMETER IDENTIFIER ( CODE TABLE 2 ).
+C***
+C
+ IBLOCK(9) = IB1PAR(5)
+ IF (IB1PAR(5).LT.0.OR.IB1PAR(5).GT.255)
+ C THEN
+ IERR = 5
+ WRITE (*,9005) IB1PAR(5)
+ 9005 FORMAT (1H ,'INVALID PARAMETER ',I4)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C***
+C* INDICATOR OF LEVEL TYPE ( CODE TABLE 3 ).
+C***
+C
+ IBLOCK(10) = IB1PAR(6)
+C
+C* CODE FIGURES FOR LEVEL TYPE RANGE FROM 0 - 110, WITH 200
+C BEING USED FOR PSEUDO-LEVELS.
+C
+ IF (IB1PAR(6).LT.0.OR.IB1PAR(6).GT.110) IERR = 6
+ IF (IB1PAR(6).EQ.200) IERR = 0
+ IF (IERR.EQ.6)
+ C THEN
+ WRITE (*,9006) IB1PAR(6)
+ 9006 FORMAT (1H ,'INVALID LEVEL TYPE ',I4)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* DESCRIPTION OF LEVEL OR LAYER ( CODE TABLE 3 ).
+C***
+C
+C
+C
+C FOR CERTAIN SPECIAL LEVELS NO FURTHER DESCRIPTION IS
+C NECESSARY, AND THE FIELDS ARE SET TO 0.
+C
+ IF (IB1PAR(6).LT.100.OR.IB1PAR(6).EQ.102)
+ C THEN
+ IB1PAR(7) = 0
+ IB1PAR(8) = 0
+ ENDIF
+C
+ IBLOCK(11) = IB1PAR(7)
+ IBLOCK(12) = IB1PAR(8)
+C
+C CERTAIN LEVEL TYPES REQUIRE THAT THE DESCRIPTION OCCUPY
+C BOTH 8 BIT FIELDS.
+C
+ IF (IB1PAR(6).EQ.100.OR.IB1PAR(6).EQ.103.OR.IB1PAR(6).EQ.105.
+ C OR.IB1PAR(6).EQ.107.OR.IB1PAR(6).EQ.109)
+ C THEN
+C 8 LOW ORDER BITS IN IBLOCK(12)
+C HIGH ORDER BITS IN IBLOCK(11)
+C
+ IBLOCK(12) = IBLOCK(11)
+ IBLOCK(11) = IBLOCK(11) / 256
+ IBLOCK(12) = IBLOCK(12) - IBLOCK(11) * 256
+C
+C CHECK MAXIMUM POSSIBLE IN 16 BITS.
+C
+ IF (IB1PAR(7).GT.65535) IERR = 7
+ ELSE
+ IF (IB1PAR(7).GT.255.OR.IB1PAR(8).GT.255) IERR = 7
+ ENDIF
+C
+ IF (IERR.NE.0)
+ C THEN
+ WRITE (*,9007) IB1PAR(7),IB1PAR(8)
+ 9007 FORMAT (1H ,'LEVEL DESCRIPTION ERROR ',I8,3X,I8)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* DATE AND TIME. CHECK VALID RANGES AND MISSING DATA VALUES.
+C***
+C
+ IBLOCK(13) = IB1PAR(9)
+ IERY = 0
+ IF (IB1PAR(9).LT.0.OR.IB1PAR(9).GT.99) IERY = 1
+ IF (IB1PAR(9).EQ.255) IERY = 0
+ IBLOCK(14) = IB1PAR(10)
+ IERM = 0
+ IF (IB1PAR(10).LT.1.OR.IB1PAR(10).GT.12) IERM = 1
+ IF (IB1PAR(10).EQ.255) IERM = 0
+ IBLOCK(15) = IB1PAR(11)
+ IERD = 0
+ IF (IB1PAR(11).LT.1.OR.IB1PAR(11).GT.31) IERD = 1
+ IF (IB1PAR(11).EQ.255) IERD = 0
+ IBLOCK(16) = IB1PAR(12)
+ IERH = 0
+ IF (IB1PAR(12).LT.0.OR.IB1PAR(12).GT.23) IERH = 1
+ IF (IB1PAR(12).EQ.255) IERH = 0
+ IBLOCK(17) = IB1PAR(13)
+ IERN = 0
+ IF (IB1PAR(13).LT.0.OR.IB1PAR(13).GT.59) IERN = 1
+ IF (IB1PAR(13).EQ.255) IERN = 0
+C
+ IERR = IERY + IERM + IERD + IERH + IERN
+C
+ IF (IERR.NE.0)
+ C THEN
+ IERR = 8
+ WRITE (*,9008) IB1PAR(9),IB1PAR(10),IB1PAR(11),IB1PAR(12),
+ C IB1PAR(13)
+ 9008 FORMAT (1H ,'INVALID DATE/TIME ',3I2,' / ',2I2)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* UNIT OF TIME - ( CODE TABLE 4 ).
+C* TIME RANGE(S) AND TIME RANGE INDICATOR ( CODE TABLE 5 ).
+C***
+C
+C TIME UNIT.
+C
+ IBLOCK(18) = IB1PAR(14)
+ IF (IB1PAR(14).LT.0.OR.IB1PAR(14).GT.7) IERR = 9
+C
+C* TIME UNIT CODES ARE IN THE RANGE 0 - 7, WITH 254 USED FOR SECONDS.
+C
+ IF (IB1PAR(14).EQ.254) IERR = 0
+C
+C THERE CAN BE ONE OR TWO TIME RANGES, EACH IN 1 OCTECT OR
+C ONE TIME RANGE IN 2 OCTECTS.
+C
+ IF (IB1PAR(17).EQ.0.OR.IB1PAR(17).EQ.1
+ C .OR.IB1PAR(17).EQ.10) IB1PAR(16) = 0
+C
+C CROSS CHECK RANGE VALUES AND FLAG VALUES.
+C
+ IF (IB1PAR(15).GT.65535.OR.IB1PAR(15).LT.0) IERR = 9
+ IF (IB1PAR(15).GT.255.AND.IB1PAR(17).NE.10) IERR = 9
+ IF (IB1PAR(16).GT.255.OR.IB1PAR(16).LT.0) IERR = 9
+ IF (IB1PAR(17).LT.0.OR.IB1PAR(17).GT.10) IERR = 9
+ IF (IERR.NE.0)
+ C THEN
+ WRITE (*,9009) IB1PAR(14),IB1PAR(15),IB1PAR(16),IB1PAR(17)
+ 9009 FORMAT (1H ,'TIME UNIT/TIME 1/TIME 2/INDICATOR ERROR - ',
+ C I8,2X,'/',I8,2X,'/',I8,2X,'/',I8)
+ RETURN
+ ENDIF
+C
+ IBLOCK(19) = IB1PAR(15)
+ IBLOCK(20) = IB1PAR(16)
+C
+C ONE TIME RANGE OCCUPYING BOTH OCTETS.
+C
+ IF (IB1PAR(17).EQ.10)
+ C THEN
+C 8 LOW ORDER BITS IN IBLOCK(20)
+C HIGH ORDER BITS IN IBLOCK(19)
+C
+ IBLOCK(20) = IBLOCK(19)
+ IBLOCK(19) = IBLOCK(19) / 256
+ IBLOCK(20) = IBLOCK(20) - IBLOCK(19) * 256
+ ENDIF
+C
+C TIME RANGE INDICATOR
+C
+ IBLOCK(21) = IB1PAR(17)
+C
+C
+C
+C
+C
+C
+C
+C***
+C* NUMBER AVERAGED.
+C***
+C
+ IBLOCK(22) = 0
+ IBLOCK(23) = 0
+C
+C
+C CHECK CONSISTENCY INDICATOR AND NUMBER FIELD.
+C
+ IF (IB1PAR(17).EQ.3.AND.IB1PAR(18).EQ.0)
+ C THEN
+ IERR = 12
+ WRITE (*,9013) IB1PAR(17),IB1PAR(18)
+ 9013 FORMAT (1H ,'INDICATOR/NUMBER AVERAGED ERROR - ',
+ C I8,2X,'/',I8)
+ RETURN
+ ENDIF
+C
+C VALUE IN TWO OCTETS.
+C
+ IBLOCK(22) = IB1PAR(18)
+C
+C 8 LOW ORDER BITS IN IBLOCK(23)
+C HIGH ORDER BITS IN IBLOCK(22)
+C
+ IBLOCK(23) = IBLOCK(22)
+ IBLOCK(22) = IBLOCK(22) / 256
+ IBLOCK(23) = IBLOCK(23) - IBLOCK(22) * 256
+C
+C
+C
+C
+C
+C
+C***
+C* RESERVED ELEMENT.
+C***
+C
+ IBLOCK(24) = 0
+C
+C
+C
+C
+C
+C
+C
+C***
+C*
+C* PACK 24 8-BIT FIELDS OF BLOCK 1 IN CODED ARRAY.
+C*
+C***
+C
+ IBYTE = 8
+ NVAL = 24
+C
+ CALL SBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,IBYTE,0,NVAL)
+ CALL OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 2 - GRID DESCRIPTION BLOCK.
+C*
+C********************************************************************
+C
+C
+C
+C
+C***
+C* SET ARRAY IBLOCK TO 0 . IT IS USED TO ZERO FILL RESERVED OCTETS.
+C***
+C
+ DO 100 I=1,24
+ IBLOCK(I) = 0
+ 100 CONTINUE
+C
+C
+C
+C
+C***
+C* LAT/LONGITUDE GRID, GAUSSIAN GRID AND SPHERICAL HARMONICS
+C* ARE THE ONLY DATA REPRESENTATIONS HANDLED.
+C***
+C
+ IF (IB1PAR(4).EQ.128.OR.IB1PAR(4).EQ.192)
+ C THEN
+ IF (IB2PAR(1).NE.0.AND.IB2PAR(1).NE.4.AND.IB2PAR(1).NE.50)
+ C THEN
+ WRITE (*,*)'GRID DESCRIPTION BLOCK NOT YET DEFINED'
+ IERR = -3
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C***
+C* LENGTH OF GRID DESCRIPTION BLOCK.
+C***
+C
+C LENGTH IS 32 OCTETS FOR LAT/LONG, GAUSSIAN AND SPHERICAL
+C HARMONICS . FOR ANY DATA ON HYBRID LEVELS THE
+C VERTICAL COORDINATES ARE ADDED.
+C
+ I = 32
+ IF (IB1PAR(6).GT.108) I = I + ILENV * 4
+C
+ CALL SBYTE (IGRIB(IWORD),I,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C***
+C* NUMBER OF UNUSED BITS AT END OF BLOCK.
+C* CURRENT DEFINITION IMPLIES 0.
+C***
+C
+ CALL SBYTE (IGRIB(IWORD),IBLOCK(1),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C***
+C* NEXT OCTET IS RESERVED.
+C***
+C
+ CALL SBYTE (IGRIB(IWORD),IBLOCK(1),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C***
+C* DATA REPRESENTATION TYPE.
+C***
+C
+ IF (IB2PAR(1).LT.0.OR.IB2PAR(1).GT.4) IERR = 10
+ IF (IB2PAR(1).EQ.50) IERR = 0
+ IF (IERR.NE.0)
+ C THEN
+ IERR = 10
+ WRITE (*,9010) IB2PAR(1)
+ 9010 FORMAT (1H ,'INVALID DATA REPRESENTATION TYPE - ',I3)
+ RETURN
+ ENDIF
+ CALL SBYTE (IGRIB(IWORD),IB2PAR(1),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* LAT/LONG OR GAUSSIAN GRID.
+C***
+C
+ IF (IB2PAR(1).EQ.0.OR.IB2PAR(1).EQ.4)
+ C THEN
+C
+C NUMBER OF LAT/LONG POINTS.
+C
+ CALL SBYTES (IGRIB(IWORD),IB2PAR(2),IOFF,16,0,2)
+ CALL OFFSET (IOFF,2,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C LAT/LONG OF ORIGIN.
+C SIGN BIT SET TO 1 IF VALUES ARE NEGATIVE.
+C
+ DO 200 I=1,2
+ ILAT(I) = IB2PAR(I+3)
+ ISIGN = 0
+ IF (ILAT(I).LT.0)
+ C THEN
+ ISIGN = 8388608
+ ILAT(I) = - ILAT(I)
+ ENDIF
+ ILAT(I) = ILAT(I) + ISIGN
+ 200 CONTINUE
+C
+ CALL SBYTES (IGRIB(IWORD),ILAT(1),IOFF,24,0,2)
+ CALL OFFSET (IOFF,2,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C RESOLUTION FLAG.
+C
+C INCREMENTS BINARY CODE DECIMAL VALUE
+C
+C NOT GIVEN 00000000 0
+C GIVEN 10000000 128
+C
+C
+C SHIFT 1 BIT FLAG FIELD TO LOW ORDER BIT
+C
+ KTEMP = IB2PAR(6) / 128
+C
+C CHECK ON VALID RESOLUTION FLAG FIELD IS IGNORED IF
+C TYPE OF LEVEL IS GIVEN AS 200 - USED BY ECMWF FOR
+C PACKING DIAGNOSTIC FIELDS IN PSEUDO GRIB.
+C
+ IF (KTEMP.LT.0.OR.KTEMP.GT.1.AND.IB1PAR(6).NE.200)
+ C THEN
+ CALL PRTBIN (IB2PAR(6),8,KTEMP,ERR)
+ WRITE (*,9011) KTEMP
+ 9011 FORMAT (1H ,'INVALID RESOLUTION FLAG ',I8.8)
+ IERR = 11
+ RETURN
+ ENDIF
+C
+C SET TO ALL 1-BITS UNUSED INCREMENT FIELDS.
+C
+ IF (IB2PAR(6).EQ.0)
+ C THEN
+C 1111111111111111 BINARY = 65535 DECIMAL
+ IB2PAR(9) = 65535
+ IB2PAR(10) = 65535
+ ENDIF
+C
+ CALL SBYTE (IGRIB(IWORD),IB2PAR(6),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C LAT/LONG OF EXTREME POINT.
+C
+C SIGN BIT SET TO 1 IF VALUES ARE NEGATIVE.
+C
+ DO 300 I=1,2
+ ILAT(I) = IB2PAR(I+6)
+ ISIGN = 0
+ IF (ILAT(I).LT.0)
+ C THEN
+ ISIGN = 8388608
+ ILAT(I) = - ILAT(I)
+ ENDIF
+ ILAT(I) = ILAT(I) + ISIGN
+ 300 CONTINUE
+C
+ CALL SBYTES (IGRIB(IWORD),ILAT(1),IOFF,24,0,2)
+ CALL OFFSET (IOFF,2,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C DIRECTION INCREMENTS / NUMBER OF LATITUDE LINES.
+C
+ CALL SBYTES (IGRIB(IWORD),IB2PAR(9),IOFF,16,0,2)
+ CALL OFFSET (IOFF,2,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C SCANNING MODE FLAGS.
+C
+C VALID VALUES VALUE / 32
+C BINARY DECIMAL
+C
+C 00000000 0
+C 10000000 4
+C 01000000 2
+C 11000000 6
+C 00100000 1
+C 10100000 5
+C 01100000 3
+C 11100000 7
+C
+C SHIFT 3 BIT FLAG FIELD TO LOW ORDER BITS.
+C
+ KTEMP = IB2PAR(11) / 32
+C
+C CHECK ON VALID SCANNING MODE FLAG FIELD IS IGNORED IF
+C TYPE OF LEVEL IS GIVEN AS 200 - USED BY ECMWF FOR
+C PACKING DIAGNOSTIC FIELDS IN PSEUDO GRIB.
+C
+ IF (KTEMP.LT.0.OR.KTEMP.GT.7.AND.IB1PAR(6).NE.200)
+C
+ C THEN
+ CALL PRTBIN (IB2PAR(11),8,KTEMP,ERR)
+ WRITE (*,9014) KTEMP
+ 9014 FORMAT (1H ,'INVALID SCANNING MODE FLAGS ',I8.8)
+ IERR = 12
+ RETURN
+ ENDIF
+C
+ CALL SBYTE (IGRIB(IWORD),IB2PAR(11),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C 4 RESERVED OCTETS.
+C
+ CALL SBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,8,0,4)
+ CALL OFFSET (IOFF,4,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* SPHERICAL HARMONIC DATA.
+C***
+C
+ IF (IB2PAR(1).EQ.50)
+ C THEN
+C
+C PENTAGONAL RESOLUTION PARAMETERS.
+C
+ CALL SBYTES (IGRIB(IWORD),IB2PAR(2),IOFF,16,0,3)
+ CALL OFFSET (IOFF,3,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C REPRESENTATION TYPE AND MODE.
+C
+ CALL SBYTES (IGRIB(IWORD),IB2PAR(5),IOFF,8,0,2)
+ CALL OFFSET (IOFF,2,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C 18 RESERVED OCTETS.
+C
+ CALL SBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,8,0,18)
+ CALL OFFSET (IOFF,18,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ ENDIF
+C
+C
+C
+C
+C***
+C* ADD VERTICAL COORDINATE PARAMETERS FOR HYBRID LEVELS.
+C***
+C
+ IF (IB1PAR(6).GT.108)
+ C THEN
+ DO 400 I=1,ILENV
+ CALL CONFP (FVERT(I),IEXP,IMANT)
+ CALL SBYTE (IGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL SBYTE (IGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ 400 CONTINUE
+C
+ ENDIF
+C
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 3 (IF REQUIRED) - BIT MAP BLOCK.
+C*
+C********************************************************************
+C
+ IF (IB1PAR(4).EQ.64.OR.IB1PAR(4).EQ.192)
+ C THEN
+ WRITE (*,*)'BIT MAP BLOCK NOT YET DEFINED'
+ IERR = -3
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 4 - BINARY DATA BLOCK.
+C*
+C********************************************************************
+C
+C
+C***
+C* RETAIN POINTERS TO WORD AND BIT POSITION OF BINARY DATA
+C* BLOCK LENGTH FIELD. ENTER LENGTH AS 0.
+C***
+C
+ IPW = IWORD
+ IPB = IOFF
+C
+ CALL SBYTE (IGRIB(IWORD),IBLOCK(1),IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* 4 BIT FLAG / 4 BIT COUNT OF UNUSED BITS AT END OF BLOCK OCTET.
+C***
+C
+C FLAG IS 1000 FOR SPHERICAL HARMONICS, 0000 FOR LAT/LONG
+C OR GAUSSIAN GRID.
+C
+ IREP = 0
+ IF (IB2PAR(1).EQ.50) IREP = 1
+C
+C FLAG FIELD IS IREP SHIFTED LEFT BY 7 BITS
+C
+ IFLAG = IREP * 128
+C
+ CALL SBYTE (IGRIB(IWORD),IFLAG,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* FIND MAXIMUM AND MINIMUM VALUES IN DATA ARRAY. FOR
+C* DATA IN SPHERICAL HARMONIC FORM THE FIRST WORD CONTAINS
+C* THE REAL (0,0)COEFFICIENT, WHICH IS TREATED SEPARATELY.
+C***
+C
+C
+ ILEN = KLENF - IREP
+C-- CALL MXMN (FPDATA(IREP+1),ILEN,FMAX,FMIN)
+ CALL MAXMIN (FPDATA(IREP+1),ILEN,FMAX,FMIN)
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* SCALE FACTOR.
+C***
+C
+C CALCULATE SCALE FACTOR
+C
+ S = (FMAX-FMIN)/(2**(IBITS+1)-1)
+ IF (S.NE.0.) S = ALOG(S)/ALOG(2.) + 2.
+ ISCALE = MIN(INT(S),INT(S+SIGN(1.,S)))
+C
+C
+C
+C
+C SET SIGN BIT (BIT 16) AND PUT SCALE FACTOR INTO REMAINING
+C 15 BITS OF CODED 16 BIT FIELD.
+C
+ JSCALE = ISCALE
+ ISIGN = 0
+ IF (JSCALE.LT.0)
+ C THEN
+ ISIGN = 32768
+ JSCALE = - JSCALE
+ ENDIF
+ JSCALE = JSCALE + ISIGN
+C
+ ZSCALE = 2.**ISCALE
+C
+C FOR MISSING DATA SCALE FACTOR IS SET TO ALL 1-BITS.
+C
+ IF (IMISS.EQ.1) JSCALE = 65535
+C
+ CALL SBYTE (IGRIB(IWORD),JSCALE,IOFF,16)
+ CALL OFFSET (IOFF,1,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* MINIMUM (REFERENCE) VALUE.
+C***
+C
+C CONVERT MINIMUM VALUE (FMIN) TO GRIB FORMAT (IEXP,IMANT)
+C
+ CALL CONFP (FMIN,IEXP,IMANT)
+C
+C EXPONENT AND MANTISSA SET TO ALL 1-BITS FOR MISSING DATA.
+C
+ IF (IMISS.EQ.1)
+ C THEN
+ IEXP = 255
+ IMANT = 16777215
+ ENDIF
+ CALL SBYTE (IGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL SBYTE (IGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C***
+C* NUMBER OF BITS IN EACH DATA VALUE.
+C***
+C
+ CALL SBYTE (IGRIB(IWORD),IBITS,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C***
+C* IF SPHERICAL HARMONICS DATA, NEXT 4 OCTETS ARE DIFFERENT FORMAT.
+C***
+C
+ IF (IREP.EQ.1)
+ C THEN
+C
+C STORE REAL (0,0) COEFFICIENT IN FLOATING
+C POINT FORM.
+C
+ CALL CONFP (FPDATA(1),IEXP,IMANT)
+C
+ CALL SBYTE (IGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL SBYTE (IGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ ENDIF
+C
+C
+C
+C
+C***
+C* SCALE AND STORE DATA VALUES.
+C***
+C
+ DO 600 I = IREP+1 , KLENF
+C-- JGRIB = NINT ( (FPDATA(I)-FMIN) / ZSCALE )
+C-- FPDATA(I) = ZGRIB
+ IDATB(I) = NINT ( (FPDATA(I)-FMIN) / ZSCALE )
+ 600 CONTINUE
+C
+ ILENFM = KLENF - IREP
+ IMASK(2) = 0
+ IOFFX = IOFF
+ CALL GSBITE (IGRIB(IWORD),IDATB(IREP+1),IOFFX,IBITS,0,ILENFM,
+ C NBIT,IMASK,'C')
+C-- CALL SBYTES (IGRIB(IWORD),FPDATA(IREP+1),IOFF,IBITS,0,ILENFM)
+ CALL OFFSET (IOFF,ILENFM,IWORD,IBITS,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* ENTER LENGTH OF BINARY DATA BLOCK, HAVING ENSURED THAT
+C* THE LENGTH IS AN EVEN NUMBER OF OCTETS.
+C***
+C
+C LENGTH OF BINARY DATA BLOCK IN BITS.
+C
+ LBIN = (IWORD-IPW) * NBIT + IOFF - IPB
+C
+ L = LBIN / 16
+ L = LBIN - ( L*16 )
+C
+C FILL UNUSED PORTION OF LAST 2 OCTETS WITH BINARY ZEROES.
+C
+ LNIL = 0
+ IF (L.NE.0)
+ C THEN
+ LNIL = 16 - L
+ CALL SBYTE (IGRIB(IWORD),IBLOCK(1),IOFF,LNIL)
+ CALL OFFSET (IOFF,1,IWORD,LNIL,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ ENDIF
+C
+ LBIN = (IWORD-IPW) * NBIT + IOFF - IPB
+C
+C ENTER LENGTH - IN OCTETS - OF DATA BLOCK.
+C
+ LBIN = LBIN / 8
+ CALL SBYTE (IGRIB(IPW),LBIN,IPB,24)
+ CALL OFFSET (IPB,1,IPW,24,NBIT,ILENG,IERR)
+C
+C ENTER NUMBER OF UNUSED BITS IN FLAG/BIT COUNT FIELD.
+C
+ IFLAG = IFLAG + LNIL
+ CALL SBYTE (IGRIB(IPW),IFLAG,IPB,8)
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 5 - END BLOCK.
+C*
+C********************************************************************
+C
+C
+C***
+C* ADD 7 7 7 7 TO CODED DATA.
+C***
+C
+ IBLOCK(1) = 55
+ IBLOCK(2) = 55
+ IBLOCK(3) = 55
+ IBLOCK(4) = 55
+C
+ CALL SBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,8,0,4)
+ CALL OFFSET (IOFF,4,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C***
+C* SET ANY UNUSED PART OF LAST WORD TO BINARY ZEROES.
+C***
+C
+ IF (IOFF.NE.0)
+ C THEN
+ KBITS = NBIT - IOFF
+ IBLOCK(1) = 0
+ CALL SBYTE (IGRIB(IWORD),IBLOCK(1),IOFF,KBITS)
+ ELSE
+ IWORD = IWORD - 1
+ ENDIF
+C
+C
+C
+C***
+C* ROUND TO 120 OCTETS, IF REQUIRED.
+C***
+C
+ IF (IROUND.EQ.1)
+ C THEN
+ NUMBIT = IWORD * NBIT
+ I = NUMBIT / 960
+ I = I * 960
+ I = NUMBIT - I
+ IF (I.NE.0) I = (960 - I) / NBIT
+C
+ DO 700 J=IWORD+1,IWORD+I
+ IGRIB(J) = 0
+ 700 CONTINUE
+C
+ IWORD = IWORD + I
+ ENDIF
+C
+ RETURN
+ END
diff --git a/gribex/codegc.F b/gribex/codegc.F
new file mode 100755
index 0000000..15f7993
--- /dev/null
+++ b/gribex/codegc.F
@@ -0,0 +1,1446 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE CODEGC (FPDATA,ILENF,IBITS,NBIT,IB1PAR,IB2PAR,IB3PAR,
+ C IBLEN,IBMAP,FVERT,ILENV,IGRIB,ILENG,IWORD,
+ C IROUND,IERR)
+C
+C
+C---->
+C*
+C* NAME : CODEGC
+C*
+C* FUNCTION : CODE ARRAY OF FLOATING POINT VALUES
+C* IN WMO GRIB CODE.
+C*
+C* INPUT : PARAMETERS FOR BLOCK 1 , PRODUCT DEFINITION BLOCK.
+C* --------------------------------------------------
+C* IB1PAR - INTEGER ARRAY (DIMENSION 18) OF PRODUCT
+C* DEFINITION INFORMATION.
+C*
+C* WORD CONTENTS
+C* ---- --------
+C* 1 ORIGINATING CENTRE IDENTIFIER.
+C* 2 MODEL IDENTIFICATION.
+C* 3 GRID DEFINITION.
+C* 4 FLAG ( CODE TABLE 1 ).
+C* 5 PARAMETER IDENTIFIER (CODE TABLE 2).
+C* 6 TYPE OF LEVEL (CODE TABLE 3).
+C* 7-8 VALUE(S) OF LEVEL (CODE TABLE 3).
+C* 9 YEAR OF DATA
+C* 10 MONTH OF DATA
+C* 11 DAY OF DATA
+C* 12 HOUR OF DATA
+C* 13 MINUTE OF DATA
+C* 14 TIME UNIT (CODE TABLE 4).
+C* 15 TIME RANGE ONE
+C* 16 TIME RANGE TWO
+C* 17 TIME RANGE FLAG (CODE TABLE 5).
+C* 18 NUMBER AVERAGED.
+C*
+C* VALUE(S) OF LEVEL CAN OCCUPY 2 WORDS.
+C* FOR A LAYER THE FIRST WORD DEFINES THE TOP
+C* AND THE SECOND THE BOTTOM OF THE LAYER.
+C* FOR A SINGLE LEVEL, ONLY THE FIRST WORD IS
+C* USED.
+C*
+C* PARAMETERS FOR BLOCK 2 , GRID DEFINITION BLOCK.
+C* -----------------------------------------------
+C* IB2PAR - INTEGER ARRAY (DIMENSION 11) CONTAINING GRID
+C* DEFINITION INFORMATION.
+C* USE VARIES WITH REPRESENTATION TYPE.
+C*
+C* WORD LAT/LONG GRID
+C* ---- -------------
+C* 1 DATA REPRESENTATION TYPE (CODE TABLE 6)
+C* 2 NO. OF POINTS ALONG A LATITUDE
+C* 3 NO. OF POINTS ALONG A MERIDIAN
+C* 4 LATITUDE OF ORIGIN (SOUTH - IVE).
+C* 5 LONGITUDE OF ORIGIN (WEST - IVE).
+C* 6 RESOLUTION FLAG. (CODE TABLE 7)
+C* 7 LATITUDE OF EXTREME POINT (SOUTH - IVE).
+C* 8 LONGITUDE OF EXTREME POINT (WEST - IVE).
+C* 9 LATITUDE INCREMENT
+C* 10 LONGITUDE INCREMENT
+C* 11 SCANNING MODE FLAGS (CODE TABLE 8)
+C*
+C* WORD GAUSSIAN GRID
+C* ---- -------------
+C* 1-9 AS FOR LAT/LONGITUDE GRID.
+C* 10 THE NUMBER OF LATITUDE LINES BETWEEN A POLE
+C* AND THE EQUATOR.
+C* 11 SCANNING MODE FLAGS (CODE TABLE 8)
+C*
+C* WORD SPHERICAL HARMONICS
+C* ---- -------------------
+C* 1 DATA REPRESENTATION TYPE (CODE TABLE 6)
+C* 2 J - PENTAGONAL RESOLUTION PARAMETER
+C* 3 K - PENTAGONAL RESOLUTION PARAMETER
+C* 4 M - PENTAGONAL RESOLUTION PARAMETER
+C* 5 REPRESENTATION TYPE (CODE TABLE 9)
+C* 6 REPRESENTATION MODE (CODE TABLE 10)
+C* 7-11 NOT USED
+C*
+C*
+C* USE FOR OTHER DATA REPRESENTATION TYPES IS
+C* TO BE DEFINED LATER.
+C*
+C* FVERT - REAL ARRAY OF VERTICAL COORDINATE PARAMETERS
+C* ILENV - LENGTH OF THIS ARRAY (NUMBER OF COORDINATE
+C* PARAMETERS).
+C*
+C* USED FOR HYBRID LEVELS ONLY.
+C*
+C*
+C* PARAMETERS FOR BLOCK 3 , BIT-MAP DEFINITION BLOCK.
+C* --------------------------------------------------
+C*
+C* TO BE DEFINED LATER.
+C*
+C* PARAMETERS FOR BLOCK 4 , BINARY DATA BLOCK.
+C* -------------------------------------------
+C* FPDATA - ARRAY OF FLOATING POINT VALUES.
+C*
+C* ****
+C* VALUES IN THIS ARRAY ARE OVERWRITTEN
+C* BY THE SUBROUTINE.
+C* ****
+C*
+C* ILENF - LENGTH OF THIS ARRAY (NUMBER OF DATA
+C* VALUES TO BE CODED)
+C* IBITS - NUMBER OF BITS FOR CODED DATA VALUES.
+C*
+C* TO INDICATE MISSING DATA VALUES, ILENF IS
+C* MADE NEGATIVE AND ALL DATA VALUES SET TO 0.
+C*
+C* OTHER PARAMETERS
+C* ----------------
+C*
+C* NBIT - NUMBER OF BITS IN COMPUTER WORD.
+C*
+C* IGRIB - ARRAY TO RECEIVE DATA IN GRIB CODE.
+C* ILENG - LENGTH OF THIS ARRAY.
+C*
+C* IROUND - 0 , NO ROUNDING.
+C* 1 , ROUND TO NEAREST 120 OCTETS.
+C*
+C* OUTPUT : IGRIB - DATA CODED IN GRIB CODE.
+C* IWORD - NUMBER OF WORDS OCCUPIED BY CODED DATA.
+C*
+C* IERR - ERROR INDICATOR.
+C*
+C* 0, NO ERROR.
+C*
+C* -1, NUMBER OF BITS PER DATA VALUE EXCEEDS
+C* WORD LENGTH, OR MAXIMUM ALLOWED.
+C* -2, OUTPUT ARRAY TOO SMALL TO HOLD CODED
+C* DATA VALUES.
+C* -3, CURRENTLY UNDEFINED OPTION SELECTED.
+C* -4, MISSING DATA FIELD CONTAINS NON-ZERO.
+C*
+C* 1, INVALID ORIGINATING CENTRE.
+C* 2, INVALID MODEL IDENTIFICATION.
+C* 3, INVALID GRID DEFINITION.
+C* 4, INVALID BLOCK INDICATOR FLAG
+C* 5, INVALID PARAMETER IDENTIFIER.
+C* 6, INVALID LEVEL TYPE INDICATOR.
+C* 7, ERROR IN DESCRIPTION OF LEVELS.
+C* 8, DATE/TIME ERROR.
+C* 9, INVALID TIME UNIT OR RANGE.
+C* 10, INVALID DATA REPRESENTATION TYPE.
+C* 11, INVALID EXTREME POINT/INCREMENT FLAG.
+C* 12, INVALID SCANNING MODE FLAGS.
+C*
+C* JOHN HENNESSY , ECMWF , NOVEMBER 1985
+C*
+C*
+C----<
+C ---------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+ DIMENSION FPDATA(ILENF),ILAT(2)
+ DIMENSION IGRIB(ILENG),IBLOCK(24),IBMAP(IBLEN)
+ DIMENSION FVERT(ILENV),IB1PAR(18),IB2PAR(11),IB3PAR(2)
+C
+ EQUIVALENCE (ZGRIB,JGRIB)
+C
+C
+C SET MAXIMUM NUMBER OF BITS PER DATA FIELD.
+C
+ DATA IMAX /32/
+C
+C CLEAR ERROR INDICATOR.
+C
+ IERR = 0
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* CHECK FOR MISSING DATA INDICATORS.
+C*
+C********************************************************************
+C
+C
+ IMISS = 0
+ IF (ILENF.LT.0)
+ C THEN
+ KLENF = - ILENF
+ IMISS = 1
+ DO 50 I=1,KLENF
+ IF (FPDATA(I).NE.0.)
+ C THEN
+ IERR = -4
+ WRITE (*,9012)
+ 9012 FORMAT (1H ,'NON-ZERO VALUE IN MISSING DATA',
+ C ' FIELD.')
+ RETURN
+ ENDIF
+ 50 CONTINUE
+ ELSE
+ KLENF = ILENF
+ ENDIF
+C
+C
+C
+C
+C********************************************************************
+C*
+C* CHECK NUMBER OF BITS PER DATA FIELD.
+C*
+C********************************************************************
+C
+C
+ IF (IBITS.GT.NBIT.OR.IBITS.GT.IMAX)
+ C THEN
+ IERR = -1
+ WRITE (*,9000) IBITS,NBIT,IMAX
+ 9000 FORMAT (1H ,'NUMBER OF BITS PER DATA VALUE, ',I3,
+ C 'EXCEEDS WORD LENGTH, ',I3,' OR MAXIMUM ',
+ C ' PERMITTED VALUE, ',I3)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 0 - INDICATOR BLOCK.
+C*
+C********************************************************************
+C
+C
+C
+C***
+C* THE LETTERS G R I B ARE INSERTED IN THE
+C* FIRST 4 ELEMENTS OF 'IBLOCK'.
+C***
+C
+ IBLOCK(1) = 71
+ IBLOCK(2) = 82
+ IBLOCK(3) = 73
+ IBLOCK(4) = 66
+C
+ IWORD = 1
+ IBYTE = 8
+ NVAL = 4
+ IOFF = 0
+C
+C PACK 4 8-BIT FIELDS IN BLOCK 0 OF CODED ARRAY.
+C
+ CALL SBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,IBYTE,0,NVAL)
+ CALL OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 1 - PRODUCT DEFINITION BLOCK.
+C*
+C********************************************************************
+C
+C
+C
+C***
+C* LENGTH OF BLOCK 1 (IN OCTETS) IN FIRST 3 OCTETS.
+C***
+C
+ IBLOCK(1) = 0
+ IBLOCK(2) = 0
+ IBLOCK(3) = 24
+C
+C
+C
+C
+C***
+C* FOURTH OCTET RESERVED AND SET TO 0.
+C***
+C
+ IBLOCK(4) = 0
+C
+C
+C
+C
+C
+C
+C***
+C* IDENTIFICATION OF CENTRE
+C***
+ IBLOCK(5) = IB1PAR(1)
+ IF (IB1PAR(1).LT.1.OR.IB1PAR(1).GT.98)
+ C THEN
+ IERR = 1
+ WRITE (*,9001) IB1PAR(1)
+ 9001 FORMAT (1H ,'INVALID ORIGINATING CENTRE ',I3)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C***
+C* MODEL IDENTIFICATION
+C***
+C
+ IBLOCK(6) = IB1PAR(2)
+ IF (IB1PAR(2).LT.1.OR.IB1PAR(2).GT.255)
+ C THEN
+ IERR = 2
+ WRITE (*,9002) IB1PAR(2)
+ 9002 FORMAT (1H ,'INVALID MODEL IDENTIFICATION ',I4)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* GRID DEFINITION
+C***
+C
+ IBLOCK(7) = IB1PAR(3)
+ IF (IB1PAR(3).LT.1.OR.IB1PAR(3).GT.255)
+ C THEN
+ IERR = 3
+ WRITE (*,9003) IB1PAR(3)
+ 9003 FORMAT (1H ,'INVALID GRID IDENTIFICATION ',I4)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OPTIONAL BLOCK INDICATOR FLAGS ( CODE TABLE 1 ).
+C***
+C
+C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE
+C
+C NONE 00000000 0
+C 2 10000000 128
+C 3 01000000 64
+C 2 AND 3 11000000 192
+C
+ IBLOCK(8) = IB1PAR(4)
+C
+C SHIFT 2-BIT FLAG FIELD RIGHT BY 6 BITS TO FACILITATE CHECKING
+C
+ KTEMP = IB1PAR(4) / 64
+C
+ IF (KTEMP.LT.0.OR.KTEMP.GT.3) IERR = 4
+C
+C CHECK IF GRID SPECIFIED IS UNCATALOGUED.
+C
+ IF (IB1PAR(3).EQ.255.AND.IB1PAR(4).EQ.0) IERR = 4
+ IF (IB1PAR(3).EQ.255.AND.IB1PAR(4).EQ.64) IERR = 4
+C
+ IF (IERR.NE.0)
+ C THEN
+ CALL PRTBIN (IB1PAR(4),8,KTEMP,ERR)
+ WRITE (*,9004) KTEMP
+ 9004 FORMAT (1H ,'INVALID BLOCK INDICATOR FLAG ',I8.8)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C***
+C* PARAMETER IDENTIFIER ( CODE TABLE 2 ).
+C***
+C
+ IBLOCK(9) = IB1PAR(5)
+ IF (IB1PAR(5).LT.0.OR.IB1PAR(5).GT.255)
+ C THEN
+ IERR = 5
+ WRITE (*,9005) IB1PAR(5)
+ 9005 FORMAT (1H ,'INVALID PARAMETER ',I4)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C***
+C* INDICATOR OF LEVEL TYPE ( CODE TABLE 3 ).
+C***
+C
+ IBLOCK(10) = IB1PAR(6)
+C
+C* CODE FIGURES FOR LEVEL TYPE RANGE FROM 0 - 110, WITH 200
+C BEING USED FOR PSEUDO-LEVELS.
+C
+ IF (IB1PAR(6).LT.0.OR.IB1PAR(6).GT.110) IERR = 6
+ IF (IB1PAR(6).EQ.200) IERR = 0
+ IF (IERR.EQ.6)
+ C THEN
+ WRITE (*,9006) IB1PAR(6)
+ 9006 FORMAT (1H ,'INVALID LEVEL TYPE ',I4)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* DESCRIPTION OF LEVEL OR LAYER ( CODE TABLE 3 ).
+C***
+C
+C
+C
+C FOR CERTAIN SPECIAL LEVELS NO FURTHER DESCRIPTION IS
+C NECESSARY, AND THE FIELDS ARE SET TO 0.
+C
+ IF (IB1PAR(6).LT.100.OR.IB1PAR(6).EQ.102)
+ C THEN
+ IB1PAR(7) = 0
+ IB1PAR(8) = 0
+ ENDIF
+C
+ IBLOCK(11) = IB1PAR(7)
+ IBLOCK(12) = IB1PAR(8)
+C
+C CERTAIN LEVEL TYPES REQUIRE THAT THE DESCRIPTION OCCUPY
+C BOTH 8 BIT FIELDS.
+C
+ IF (IB1PAR(6).EQ.100.OR.IB1PAR(6).EQ.103.OR.IB1PAR(6).EQ.105.
+ C OR.IB1PAR(6).EQ.107.OR.IB1PAR(6).EQ.109)
+ C THEN
+C 8 LOW ORDER BITS IN IBLOCK(12)
+C HIGH ORDER BITS IN IBLOCK(11)
+C
+ IBLOCK(12) = IBLOCK(11)
+ IBLOCK(11) = IBLOCK(11) / 256
+ IBLOCK(12) = IBLOCK(12) - IBLOCK(11) * 256
+C
+C CHECK MAXIMUM POSSIBLE IN 16 BITS.
+C
+ IF (IB1PAR(7).GT.65535) IERR = 7
+ ELSE
+ IF (IB1PAR(7).GT.255.OR.IB1PAR(8).GT.255) IERR = 7
+ ENDIF
+C
+ IF (IERR.NE.0)
+ C THEN
+ WRITE (*,9007) IB1PAR(7),IB1PAR(8)
+ 9007 FORMAT (1H ,'LEVEL DESCRIPTION ERROR ',I8,3X,I8)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* DATE AND TIME. CHECK VALID RANGES AND MISSING DATA VALUES.
+C***
+C
+ IBLOCK(13) = IB1PAR(9)
+ IERY = 0
+ IF (IB1PAR(9).LT.0.OR.IB1PAR(9).GT.99) IERY = 1
+ IF (IB1PAR(9).EQ.255) IERY = 0
+ IBLOCK(14) = IB1PAR(10)
+ IERM = 0
+ IF (IB1PAR(10).LT.1.OR.IB1PAR(10).GT.12) IERM = 1
+ IF (IB1PAR(10).EQ.255) IERM = 0
+ IBLOCK(15) = IB1PAR(11)
+ IERD = 0
+ IF (IB1PAR(11).LT.1.OR.IB1PAR(11).GT.31) IERD = 1
+ IF (IB1PAR(11).EQ.255) IERD = 0
+ IBLOCK(16) = IB1PAR(12)
+ IERH = 0
+ IF (IB1PAR(12).LT.0.OR.IB1PAR(12).GT.23) IERH = 1
+ IF (IB1PAR(12).EQ.255) IERH = 0
+ IBLOCK(17) = IB1PAR(13)
+ IERN = 0
+ IF (IB1PAR(13).LT.0.OR.IB1PAR(13).GT.59) IERN = 1
+ IF (IB1PAR(13).EQ.255) IERN = 0
+C
+ IERR = IERY + IERM + IERD + IERH + IERN
+C
+ IF (IERR.NE.0)
+ C THEN
+ IERR = 8
+ WRITE (*,9008) IB1PAR(9),IB1PAR(10),IB1PAR(11),IB1PAR(12),
+ C IB1PAR(13)
+ 9008 FORMAT (1H ,'INVALID DATE/TIME ',3I2,' / ',2I2)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* UNIT OF TIME - ( CODE TABLE 4 ).
+C* TIME RANGE(S) AND TIME RANGE INDICATOR ( CODE TABLE 5 ).
+C***
+C
+C TIME UNIT.
+C
+ IBLOCK(18) = IB1PAR(14)
+ IF (IB1PAR(14).LT.0.OR.IB1PAR(14).GT.7) IERR = 9
+C
+C* TIME UNIT CODES ARE IN THE RANGE 0 - 7, WITH 254 USED FOR SECONDS.
+C
+ IF (IB1PAR(14).EQ.254) IERR = 0
+C
+C THERE CAN BE ONE OR TWO TIME RANGES, EACH IN 1 OCTECT OR
+C ONE TIME RANGE IN 2 OCTECTS.
+C
+ IF (IB1PAR(17).EQ.0.OR.IB1PAR(17).EQ.1
+ C .OR.IB1PAR(17).EQ.10) IB1PAR(16) = 0
+C
+C CROSS CHECK RANGE VALUES AND FLAG VALUES.
+C
+ IF (IB1PAR(15).GT.65535.OR.IB1PAR(15).LT.0) IERR = 9
+ IF (IB1PAR(15).GT.255.AND.IB1PAR(17).NE.10) IERR = 9
+ IF (IB1PAR(16).GT.255.OR.IB1PAR(16).LT.0) IERR = 9
+ IF (IB1PAR(17).LT.0.OR.IB1PAR(17).GT.10) IERR = 9
+ IF (IERR.NE.0)
+ C THEN
+ WRITE (*,9009) IB1PAR(14),IB1PAR(15),IB1PAR(16),IB1PAR(17)
+ 9009 FORMAT (1H ,'TIME UNIT/TIME 1/TIME 2/INDICATOR ERROR - ',
+ C I8,2X,'/',I8,2X,'/',I8,2X,'/',I8)
+ RETURN
+ ENDIF
+C
+ IBLOCK(19) = IB1PAR(15)
+ IBLOCK(20) = IB1PAR(16)
+C
+C ONE TIME RANGE OCCUPYING BOTH OCTETS.
+C
+ IF (IB1PAR(17).EQ.10)
+ C THEN
+C 8 LOW ORDER BITS IN IBLOCK(20)
+C HIGH ORDER BITS IN IBLOCK(19)
+C
+ IBLOCK(20) = IBLOCK(19)
+ IBLOCK(19) = IBLOCK(19) / 256
+ IBLOCK(20) = IBLOCK(20) - IBLOCK(19) * 256
+ ENDIF
+C
+C TIME RANGE INDICATOR
+C
+ IBLOCK(21) = IB1PAR(17)
+C
+C
+C
+C
+C
+C
+C
+C***
+C* NUMBER AVERAGED.
+C***
+C
+ IBLOCK(22) = 0
+ IBLOCK(23) = 0
+C
+C
+C CHECK CONSISTENCY INDICATOR AND NUMBER FIELD.
+C
+ IF (IB1PAR(17).EQ.3.AND.IB1PAR(18).EQ.0)
+ C THEN
+ IERR = 12
+ WRITE (*,9013) IB1PAR(17),IB1PAR(18)
+ 9013 FORMAT (1H ,'INDICATOR/NUMBER AVERAGED ERROR - ',
+ C I8,2X,'/',I8)
+ RETURN
+ ENDIF
+C
+C VALUE IN TWO OCTETS.
+C
+ IBLOCK(22) = IB1PAR(18)
+C
+C 8 LOW ORDER BITS IN IBLOCK(23)
+C HIGH ORDER BITS IN IBLOCK(22)
+C
+ IBLOCK(23) = IBLOCK(22)
+ IBLOCK(22) = IBLOCK(22) / 256
+ IBLOCK(23) = IBLOCK(23) - IBLOCK(22) * 256
+C
+C
+C
+C
+C
+C
+C***
+C* RESERVED ELEMENT.
+C***
+C
+ IBLOCK(24) = 0
+C
+C
+C
+C
+C
+C
+C
+C***
+C*
+C* PACK 24 8-BIT FIELDS OF BLOCK 1 IN CODED ARRAY.
+C*
+C***
+C
+ IBYTE = 8
+ NVAL = 24
+C
+ CALL SBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,IBYTE,0,NVAL)
+ CALL OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 2 - GRID DESCRIPTION BLOCK.
+C*
+C********************************************************************
+C
+C
+C
+C
+C***
+C* SET ARRAY IBLOCK TO 0 . IT IS USED TO ZERO FILL RESERVED OCTETS.
+C***
+C
+ DO 100 I=1,24
+ IBLOCK(I) = 0
+ 100 CONTINUE
+C
+C
+C
+C
+C***
+C* LAT/LONGITUDE GRID, GAUSSIAN GRID AND SPHERICAL HARMONICS
+C* ARE THE ONLY DATA REPRESENTATIONS HANDLED.
+C***
+C
+ IF (IB1PAR(4).EQ.128.OR.IB1PAR(4).EQ.192)
+ C THEN
+ IF (IB2PAR(1).NE.0.AND.IB2PAR(1).NE.4.AND.IB2PAR(1).NE.50)
+ C THEN
+ WRITE (*,*)'GRID DESCRIPTION BLOCK NOT YET DEFINED'
+ IERR = -3
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C***
+C* LENGTH OF GRID DESCRIPTION BLOCK.
+C***
+C
+C LENGTH IS 32 OCTETS FOR LAT/LONG, GAUSSIAN AND SPHERICAL
+C HARMONICS . FOR ANY DATA ON HYBRID LEVELS THE
+C VERTICAL COORDINATES ARE ADDED.
+C
+ I = 32
+ IF (IB1PAR(6).GT.108) I = I + ILENV * 4
+C
+ CALL SBYTE (IGRIB(IWORD),I,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C***
+C* NUMBER OF UNUSED BITS AT END OF BLOCK.
+C* CURRENT DEFINITION IMPLIES 0.
+C***
+C
+ CALL SBYTE (IGRIB(IWORD),IBLOCK(1),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C***
+C* NEXT OCTET IS RESERVED.
+C***
+C
+ CALL SBYTE (IGRIB(IWORD),IBLOCK(1),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C***
+C* DATA REPRESENTATION TYPE.
+C***
+C
+ IF (IB2PAR(1).LT.0.OR.IB2PAR(1).GT.4) IERR = 10
+ IF (IB2PAR(1).EQ.50) IERR = 0
+ IF (IERR.NE.0)
+ C THEN
+ IERR = 10
+ WRITE (*,9010) IB2PAR(1)
+ 9010 FORMAT (1H ,'INVALID DATA REPRESENTATION TYPE - ',I3)
+ RETURN
+ ENDIF
+ CALL SBYTE (IGRIB(IWORD),IB2PAR(1),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* LAT/LONG OR GAUSSIAN GRID.
+C***
+C
+ IF (IB2PAR(1).EQ.0.OR.IB2PAR(1).EQ.4)
+ C THEN
+C
+C NUMBER OF LAT/LONG POINTS.
+C
+ CALL SBYTES (IGRIB(IWORD),IB2PAR(2),IOFF,16,0,2)
+ CALL OFFSET (IOFF,2,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C LAT/LONG OF ORIGIN.
+C SIGN BIT SET TO 1 IF VALUES ARE NEGATIVE.
+C
+ DO 200 I=1,2
+ ILAT(I) = IB2PAR(I+3)
+ ISIGN = 0
+ IF (ILAT(I).LT.0)
+ C THEN
+ ISIGN = 8388608
+ ILAT(I) = - ILAT(I)
+ ENDIF
+ ILAT(I) = ILAT(I) + ISIGN
+ 200 CONTINUE
+C
+ CALL SBYTES (IGRIB(IWORD),ILAT(1),IOFF,24,0,2)
+ CALL OFFSET (IOFF,2,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C RESOLUTION FLAG.
+C
+C INCREMENTS BINARY CODE DECIMAL VALUE
+C
+C NOT GIVEN 00000000 0
+C GIVEN 10000000 128
+C
+C
+C SHIFT 1 BIT FLAG FIELD TO LOW ORDER BIT
+C
+ KTEMP = IB2PAR(6) / 128
+C
+ IF (KTEMP.LE.0.OR.KTEMP.GT.1)
+ C THEN
+ CALL PRTBIN (IB2PAR(6),8,KTEMP,ERR)
+ WRITE (*,9011) KTEMP
+ 9011 FORMAT (1H ,'INVALID RESOLUTION FLAG ',I8.8)
+ IERR = 11
+ RETURN
+ ENDIF
+C
+C SET TO ALL 1-BITS UNUSED INCREMENT FIELDS.
+C
+ IF (IB2PAR(6).EQ.0)
+ C THEN
+C 1111111111111111 BINARY = 65535 DECIMAL
+ IB2PAR(9) = 65535
+ IB2PAR(10) = 65535
+ ENDIF
+C
+ CALL SBYTE (IGRIB(IWORD),IB2PAR(6),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C LAT/LONG OF EXTREME POINT.
+C
+C SIGN BIT SET TO 1 IF VALUES ARE NEGATIVE.
+C
+ DO 300 I=1,2
+ ILAT(I) = IB2PAR(I+6)
+ ISIGN = 0
+ IF (ILAT(I).LT.0)
+ C THEN
+ ISIGN = 8388608
+ ILAT(I) = - ILAT(I)
+ ENDIF
+ ILAT(I) = ILAT(I) + ISIGN
+ 300 CONTINUE
+C
+ CALL SBYTES (IGRIB(IWORD),ILAT(1),IOFF,24,0,2)
+ CALL OFFSET (IOFF,2,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C DIRECTION INCREMENTS / NUMBER OF LATITUDE LINES.
+C
+ CALL SBYTES (IGRIB(IWORD),IB2PAR(9),IOFF,16,0,2)
+ CALL OFFSET (IOFF,2,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C SCANNING MODE FLAGS.
+C
+C VALID VALUES VALUE / 32
+C BINARY DECIMAL
+C
+C 00000000 0
+C 10000000 4
+C 01000000 2
+C 11000000 6
+C 00100000 1
+C 10100000 5
+C 01100000 3
+C 11100000 7
+C
+C SHIFT 3 BIT FLAG FIELD TO LOW ORDER BITS.
+C
+ KTEMP = IB2PAR(11) / 32
+C
+ IF (KTEMP.LT.0.OR.KTEMP.GT.7)
+ C THEN
+ CALL PRTBIN (IB2PAR(11),8,KTEMP,ERR)
+ WRITE (*,9014) KTEMP
+ 9014 FORMAT (1H ,'INVALID SCANNING MODE FLAGS ',I8.8)
+ IERR = 12
+ RETURN
+ ENDIF
+C
+ CALL SBYTE (IGRIB(IWORD),IB2PAR(11),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C 4 RESERVED OCTETS.
+C
+ CALL SBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,8,0,4)
+ CALL OFFSET (IOFF,4,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* SPHERICAL HARMONIC DATA.
+C***
+C
+ IF (IB2PAR(1).EQ.50)
+ C THEN
+C
+C PENTAGONAL RESOLUTION PARAMETERS.
+C
+ CALL SBYTES (IGRIB(IWORD),IB2PAR(2),IOFF,16,0,3)
+ CALL OFFSET (IOFF,3,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C REPRESENTATION TYPE AND MODE.
+C
+ CALL SBYTES (IGRIB(IWORD),IB2PAR(5),IOFF,8,0,2)
+ CALL OFFSET (IOFF,2,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C 18 RESERVED OCTETS.
+C
+ CALL SBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,8,0,18)
+ CALL OFFSET (IOFF,18,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ ENDIF
+C
+C
+C
+C
+C***
+C* ADD VERTICAL COORDINATE PARAMETERS FOR HYBRID LEVELS.
+C***
+C
+ IF (IB1PAR(6).GT.108)
+ C THEN
+ DO 400 I=1,ILENV
+ CALL CONFP (FVERT(I),IEXP,IMANT)
+ CALL SBYTE (IGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL SBYTE (IGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ 400 CONTINUE
+C
+ ENDIF
+C
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 3 (IF REQUIRED) - BIT MAP BLOCK.
+C*
+C********************************************************************
+C
+ IF (IB1PAR(4).EQ.64.OR.IB1PAR(4).EQ.192)
+ C THEN
+C***
+C* SET UP LENGTH OG BLOCK 3.
+C***
+ NUB=0
+ NGRD=IB2PAR(2)*IB2PAR(3)
+ NOCT=NGRD/8
+ IBOF=NGRD-NOCT*8
+C
+ IF(IBOF.NE.0) THEN
+ NUB=8-IBOF
+ NOCT=NOCT+1
+ END IF
+C
+ IF(MOD(NOCT,2).NE.0) THEN
+ NUB=NUB+8
+ NOCT=NOCT+1
+ END IF
+C
+ ILEN3=NOCT+6
+C
+ CALL SBYTE(IGRIB(IWORD),ILEN3,IOFF,24)
+ CALL OFFSET(IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF(IERR.NE.0) RETURN
+C
+C* SET UP NUMBER OF UNUSED BITS AT THE END OF BLOCK.
+C
+ CALL SBYTE(IGRIB(IWORD),NUB,IOFF,8)
+ CALL OFFSET(IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF(IERR.NE.0) RETURN
+C
+C* SET OCTET 5-6 OCTET (NUMERIC).
+C
+ CALL SBYTE(IGRIB(IWORD),0,IOFF,16)
+ CALL OFFSET(IOFF,1,IWORD,16,NBIT,ILENG,IERR)
+ IF(IERR.NE.0) RETURN
+C
+C* SET UP BIT MAP.
+C
+ DO 310 J=1,IBLEN
+C
+ CALL SBYTE(IGRIB(IWORD),IBMAP(J),IOFF,1)
+ CALL OFFSET(IOFF,1,IWORD,1,NBIT,ILENG,IERR)
+ IF(IERR.NE.0) RETURN
+C
+ 310 CONTINUE
+C
+C* SET UP UNUSED BITS.
+C
+ CALL SBYTES(IGRIB(IWORD),0,IOFF,1,0,NUB)
+ CALL OFFSET(IOFF,NUB,IWORD,1,NBIT,ILENG,IERR)
+ IF(IERR.NE.0) RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 4 - BINARY DATA BLOCK.
+C*
+C********************************************************************
+C
+C
+C***
+C* RETAIN POINTERS TO WORD AND BIT POSITION OF BINARY DATA
+C* BLOCK LENGTH FIELD. ENTER LENGTH AS 0.
+C***
+C
+ IPW = IWORD
+ IPB = IOFF
+C
+ CALL SBYTE (IGRIB(IWORD),IBLOCK(1),IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* 4 BIT FLAG / 4 BIT COUNT OF UNUSED BITS AT END OF BLOCK OCTET.
+C***
+C
+C FLAG IS 1000 FOR SPHERICAL HARMONICS, 0000 FOR LAT/LONG
+C OR GAUSSIAN GRID.
+C
+ IREP = 0
+ IF (IB2PAR(1).EQ.50) IREP = 1
+C
+C FLAG FIELD IS IREP SHIFTED LEFT BY 7 BITS
+C
+ IFLAG = IREP * 128
+C
+ CALL SBYTE (IGRIB(IWORD),IFLAG,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* FIND MAXIMUM AND MINIMUM VALUES IN DATA ARRAY. FOR
+C* DATA IN SPHERICAL HARMONIC FORM THE FIRST WORD CONTAINS
+C* THE REAL (0,0)COEFFICIENT, WHICH IS TREATED SEPARATELY.
+C***
+C
+C
+ ILEN = KLENF - IREP
+ CALL MXMN (FPDATA(IREP+1),ILEN,FMAX,FMIN)
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* SCALE FACTOR.
+C***
+C
+C CALCULATE SCALE FACTOR
+C
+ S = (FMAX-FMIN)/(2**(IBITS+1)-1)
+ IF (S.NE.0.) S = ALOG(S)/ALOG(2.) + 2.
+ ISCALE = MIN(INT(S),INT(S+SIGN(1.,S)))
+C
+C
+C
+C
+C SET SIGN BIT (BIT 16) AND PUT SCALE FACTOR INTO REMAINING
+C 15 BITS OF CODED 16 BIT FIELD.
+C
+ JSCALE = ISCALE
+ ISIGN = 0
+ IF (JSCALE.LT.0)
+ C THEN
+ ISIGN = 32768
+ JSCALE = - JSCALE
+ ENDIF
+ JSCALE = JSCALE + ISIGN
+C
+ ZSCALE = 2.**ISCALE
+C
+C FOR MISSING DATA SCALE FACTOR IS SET TO ALL 1-BITS.
+C
+ IF (IMISS.EQ.1) JSCALE = 65535
+C
+ CALL SBYTE (IGRIB(IWORD),JSCALE,IOFF,16)
+ CALL OFFSET (IOFF,1,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* MINIMUM (REFERENCE) VALUE.
+C***
+C
+C CONVERT MINIMUM VALUE (FMIN) TO GRIB FORMAT (IEXP,IMANT)
+C
+ CALL CONFP (FMIN,IEXP,IMANT)
+C
+C EXPONENT AND MANTISSA SET TO ALL 1-BITS FOR MISSING DATA.
+C
+ IF (IMISS.EQ.1)
+ C THEN
+ IEXP = 255
+ IMANT = 16777215
+ ENDIF
+ CALL SBYTE (IGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL SBYTE (IGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C***
+C* NUMBER OF BITS IN EACH DATA VALUE.
+C***
+C
+ CALL SBYTE (IGRIB(IWORD),IBITS,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C***
+C* IF SPHERICAL HARMONICS DATA, NEXT 4 OCTETS ARE DIFFERENT FORMAT.
+C***
+C
+ IF (IREP.EQ.1)
+ C THEN
+C
+C STORE REAL (0,0) COEFFICIENT IN FLOATING
+C POINT FORM.
+C
+ CALL CONFP (FPDATA(1),IEXP,IMANT)
+C
+ CALL SBYTE (IGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL SBYTE (IGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ ENDIF
+C
+C
+C
+C
+C***
+C* SCALE AND STORE DATA VALUES.
+C***
+C
+ DO 600 I = IREP+1 , KLENF
+ JGRIB = NINT ( (FPDATA(I)-FMIN) / ZSCALE )
+ FPDATA(I) = ZGRIB
+ 600 CONTINUE
+C
+ ILENFM = KLENF - IREP
+ CALL SBYTES (IGRIB(IWORD),FPDATA(IREP+1),IOFF,IBITS,0,ILENFM)
+ CALL OFFSET (IOFF,ILENFM,IWORD,IBITS,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* ENTER LENGTH OF BINARY DATA BLOCK, HAVING ENSURED THAT
+C* THE LENGTH IS AN EVEN NUMBER OF OCTETS.
+C***
+C
+C LENGTH OF BINARY DATA BLOCK IN BITS.
+C
+ LBIN = (IWORD-IPW) * NBIT + IOFF - IPB
+C
+ L = LBIN / 16
+ L = LBIN - ( L*16 )
+C
+C FILL UNUSED PORTION OF LAST 2 OCTETS WITH BINARY ZEROES.
+C
+ LNIL = 0
+ IF (L.NE.0)
+ C THEN
+ LNIL = 16 - L
+ CALL SBYTE (IGRIB(IWORD),IBLOCK(1),IOFF,LNIL)
+ CALL OFFSET (IOFF,1,IWORD,LNIL,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ ENDIF
+C
+ LBIN = (IWORD-IPW) * NBIT + IOFF - IPB
+C
+C ENTER LENGTH - IN OCTETS - OF DATA BLOCK.
+C
+ LBIN = LBIN / 8
+ CALL SBYTE (IGRIB(IPW),LBIN,IPB,24)
+ CALL OFFSET (IPB,1,IPW,24,NBIT,ILENG,IERR)
+C
+C ENTER NUMBER OF UNUSED BITS IN FLAG/BIT COUNT FIELD.
+C
+ IFLAG = IFLAG + LNIL
+ CALL SBYTE (IGRIB(IPW),IFLAG,IPB,8)
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 5 - END BLOCK.
+C*
+C********************************************************************
+C
+C
+C***
+C* ADD 7 7 7 7 TO CODED DATA.
+C***
+C
+ IBLOCK(1) = 55
+ IBLOCK(2) = 55
+ IBLOCK(3) = 55
+ IBLOCK(4) = 55
+C
+ CALL SBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,8,0,4)
+ CALL OFFSET (IOFF,4,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C***
+C* SET ANY UNUSED PART OF LAST WORD TO BINARY ZEROES.
+C***
+C
+ IF (IOFF.NE.0)
+ C THEN
+ KBITS = NBIT - IOFF
+ CALL SBYTE (IGRIB(IWORD),IBLOCK(1),IOFF,KBITS)
+ ELSE
+ IWORD = IWORD - 1
+ ENDIF
+C
+C
+C
+C***
+C* ROUND TO 120 OCTETS, IF REQUIRED.
+C***
+C
+ IF (IROUND.EQ.1)
+ C THEN
+ NUMBIT = IWORD * NBIT
+ I = NUMBIT / 960
+ I = I * 960
+ I = NUMBIT - I
+ IF (I.NE.0) I = (960 - I) / NBIT
+C
+ DO 700 J=IWORD+1,IWORD+I
+ IGRIB(J) = 0
+ 700 CONTINUE
+C
+ IWORD = IWORD + I
+ ENDIF
+C
+ RETURN
+ END
diff --git a/gribex/codegr.F b/gribex/codegr.F
new file mode 100755
index 0000000..9dc2a98
--- /dev/null
+++ b/gribex/codegr.F
@@ -0,0 +1,1240 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE CODEGR (FPDATA,ILENF,IBITS,NBIT,IB1PAR,
+ C IB2PAR,FVERT,ILENV,IGRIB,ILENG,IWORD,
+ C IROUND,IERR)
+C
+C
+C---->
+C*
+C* NAME : CODEGR
+C*
+C* FUNCTION : CODE ARRAY OF FLOATING POINT VALUES IN WMO GRIB
+C* CODE - WITH ECMWF EXTENSIONS.
+C*
+C* INPUT : PARAMETERS FOR BLOCK 1 , PRODUCT DEFINITION BLOCK.
+C* --------------------------------------------------
+C* IB1PAR - INTEGER ARRAY (DIMENSION 17) OF PRODUCT
+C* DEFINITION INFORMATION.
+C*
+C* WORD CONTENTS
+C* ---- --------
+C* 1 ORIGINATING CENTRE IDENTIFIER.
+C* 2 MODEL IDENTIFICATION.
+C* 3 GRID DEFINITION.
+C* 4 FLAG ( CODE TABLE 1 ).
+C* 5 PARAMETER IDENTIFIER (CODE TABLE 2).
+C* 6 TYPE OF LEVEL (CODE TABLE 3).
+C* 7-8 VALUE(S) OF LEVEL (CODE TABLE 3).
+C* 9 YEAR OF DATA
+C* 10 MONTH OF DATA
+C* 11 DAY OF DATA
+C* 12 HOUR OF DATA
+C* 13 MINUTE OF DATA
+C* 14 TIME UNIT (CODE TABLE 4).
+C* 15 TIME RANGE ONE
+C* 16 TIME RANGE TWO
+C* 17 TIME RANGE FLAG (CODE TABLE 5).
+C*
+C* VALUE(S) OF LEVEL CAN OCCUPY 2 WORDS.
+C* FOR A LAYER THE FIRST WORD DEFINES THE TOP
+C* AND THE SECOND THE BOTTOM OF THE LAYER.
+C* FOR A SINGLE LEVEL, ONLY THE FIRST WORD IS
+C* USED.
+C*
+C* PARAMETERS FOR BLOCK 2 , GRID DEFINITION BLOCK.
+C* -----------------------------------------------
+C* IB2PAR - INTEGER ARRAY (DIMENSION 11) CONTAINING GRID
+C* DEFINITION INFORMATION.
+C* USE VARIES WITH REPRESENTATION TYPE.
+C*
+C* WORD LAT/LONG GRID
+C* ---- -------------
+C* 1 DATA REPRESENTATION TYPE (CODE TABLE 6)
+C* 2 NO. OF POINTS ALONG A LATITUDE
+C* 3 NO. OF POINTS ALONG A MERIDIAN
+C* 4 LATITUDE OF ORIGIN (SOUTH - IVE).
+C* 5 LONGITUDE OF ORIGIN (WEST - IVE).
+C* 6 EXTREME POINT/INCREMENTS FLAG.(CODE TABLE 7)
+C* 7 LATITUDE OF EXTREME POINT (SOUTH - IVE).
+C* 8 LONGITUDE OF EXTREME POINT (WEST - IVE).
+C* 9 LATITUDE INCREMENT
+C* 10 LONGITUDE INCREMENT
+C* 11 SCANNING MODE (CODE TABLE 8)
+C*
+C* WORD GAUSSIAN GRID
+C* ---- -------------
+C* 1-9 AS FOR LAT/LONGITUDE GRID.
+C* 10 THE NUMBER OF LATITUDE LINES BETWEEN A POLE
+C* AND THE EQUATOR.
+C* 11 SCANNING MODE (CODE TABLE 8)
+C*
+C* WORD SPHERICAL HARMONICS
+C* ---- -------------------
+C* 1 DATA REPRESENTATION TYPE (CODE TABLE 6)
+C* 2 J - PENTAGONAL RESOLUTION PARAMETER
+C* 3 K - PENTAGONAL RESOLUTION PARAMETER
+C* 4 M - PENTAGONAL RESOLUTION PARAMETER
+C* 5 REPRESENTATION TYPE (CODE TABLE 9)
+C* 6 REPRESENTATION MODE (CODE TABLE 10)
+C* 7-11 NOT USED
+C*
+C*
+C* USE FOR OTHER DATA REPRESENTATION TYPES IS
+C* TO BE DEFINED LATER.
+C*
+C* FVERT - REAL ARRAY OF VERTICAL COORDINATE PARAMETERS
+C* ILENV - LENGTH OF THIS ARRAY (NUMBER OF COORDINATE
+C* PARAMETERS).
+C*
+C* USED FOR HYBRID LEVELS ONLY.
+C*
+C*
+C* PARAMETERS FOR BLOCK 3 , BIT-MAP DEFINITION BLOCK.
+C* --------------------------------------------------
+C*
+C* TO BE DEFINED LATER.
+C*
+C* PARAMETERS FOR BLOCK 4 , BINARY DATA BLOCK.
+C* -------------------------------------------
+C* FPDATA - ARRAY OF FLOATING POINT VALUES.
+C* ILENF - LENGTH OF THIS ARRAY (NUMBER OF DATA
+C* VALUES TO BE CODED)
+C* IBITS - NUMBER OF BITS FOR CODED DATA VALUES.
+C*
+C* TO INDICATE MISSING DATA VALUES, ILENF IS
+C* MADE NEGATIVE AND ALL DATA VALUES SET TO 0.
+C*
+C* OTHER PARAMETERS
+C* ----------------
+C*
+C* NBIT - NUMBER OF BITS IN COMPUTER WORD.
+C*
+C* IGRIB - ARRAY TO RECEIVE DATA IN GRIB CODE.
+C* ILENG - LENGTH OF THIS ARRAY.
+C*
+C* IROUND - 0 , NO ROUNDING.
+C* 1 , ROUND TO NEAREST 120 OCTETS.
+C*
+C* OUTPUT : IGRIB - DATA CODED IN GRIB CODE.
+C* IWORD - NUMBER OF WORDS OCCUPIED BY CODED DATA.
+C*
+C* IERR - ERROR INDICATOR.
+C*
+C* 0, NO ERROR.
+C*
+C* -1, NUMBER OF BITS PER DATA VALUE EXCEEDS
+C* WORD LENGTH, OR MAXIMUM ALLOWED.
+C* -2, OUTPUT ARRAY TOO SMALL TO HOLD CODED
+C* DATA VALUES.
+C* -3, CURRENTLY UNDEFINED OPTION SELECTED.
+C* -4, MISSING DATA FIELD CONTAINS NON-ZERO.
+C*
+C* 1, INVALID ORIGINATING CENTRE.
+C* 2, INVALID MODEL IDENTIFICATION.
+C* 3, INVALID GRID DEFINITION.
+C* 4, INVALID BLOCK INDICATOR FLAG
+C* 5, INVALID PARAMETER IDENTIFIER.
+C* 6, INVALID LEVEL TYPE INDICATOR.
+C* 7, ERROR IN DESCRIPTION OF LEVELS.
+C* 8, DATE/TIME ERROR.
+C* 9, INVALID TIME UNIT OR RANGE.
+C* 10, INVALID DATA REPRESENTATION TYPE.
+C* 11, INVALID EXTREME POINT/INCREMENT FLAG.
+C*
+C* JOHN HENNESSY , ECMWF , 15TH APRIL 1985
+C*
+C*
+C----<
+C ---------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+ DIMENSION FPDATA(*),ILAT(2)
+ DIMENSION IGRIB(ILENG),IBLOCK(24)
+ DIMENSION FVERT(ILENV),IB1PAR(17),IB2PAR(11)
+C
+ EQUIVALENCE (ZGRIB,JGRIB)
+C
+C
+C SET MAXIMUM NUMBER OF BITS PER DATA FIELD.
+C
+ DATA IMAX /60/
+C
+C CLEAR ERROR INDICATOR.
+C
+ IERR = 0
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* CHECK FOR MISSING DATA INDICATORS.
+C*
+C********************************************************************
+C
+C
+ IMISS = 0
+ IF (ILENF.LT.0)
+ C THEN
+ KLENF = - ILENF
+ IMISS = 1
+ DO 50 I=1,KLENF
+ IF (FPDATA(I).NE.0.)
+ C THEN
+ IERR = -4
+ WRITE (*,9012)
+ 9012 FORMAT (1H ,'NON-ZERO VALUE IN MISSING DATA',
+ C ' FIELD.')
+ RETURN
+ ENDIF
+ 50 CONTINUE
+ ELSE
+ KLENF = ILENF
+ ENDIF
+C
+C
+C
+C
+C********************************************************************
+C*
+C* CHECK NUMBER OF BITS PER DATA FIELD.
+C*
+C********************************************************************
+C
+C
+ IF (IBITS.GT.NBIT.OR.IBITS.GT.IMAX)
+ C THEN
+ IERR = -1
+ WRITE (*,9000) IBITS,NBIT,IMAX
+ 9000 FORMAT (1H ,'NUMBER OF BITS PER DATA VALUE, ',I3,
+ C 'EXCEEDS WORD LENGTH, ',I3,' OR MAXIMUM ',
+ C ' PERMITTED VALUE, ',I3)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 1 - PRODUCT DEFINITION BLOCK.
+C*
+C********************************************************************
+C
+C
+C
+C***
+C* THE LETTERS G R I B ARE INSERTED IN THE
+C* FIRST 4 ELEMENTS OF 'IBLOCK'.
+C***
+C
+ IBLOCK(1) = 71
+ IBLOCK(2) = 82
+ IBLOCK(3) = 73
+ IBLOCK(4) = 66
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* IDENTIFICATION OF CENTRE
+C***
+ IBLOCK(5) = IB1PAR(1)
+ IF (IB1PAR(1).LT.1.OR.IB1PAR(1).GT.98)
+ C THEN
+ IERR = 1
+ WRITE (*,9001) IB1PAR(1)
+ 9001 FORMAT (1H ,'INVALID ORIGINATING CENTRE ',I3)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C***
+C* MODEL IDENTIFICATION
+C***
+C
+ IBLOCK(6) = IB1PAR(2)
+ IF (IB1PAR(2).LT.1.OR.IB1PAR(2).GT.255)
+ C THEN
+ IERR = 2
+ WRITE (*,9002) IB1PAR(2)
+ 9002 FORMAT (1H ,'INVALID MODEL IDENTIFICATION ',I4)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* GRID DEFINITION
+C***
+C
+ IBLOCK(7) = IB1PAR(3)
+ IF (IB1PAR(3).LT.1.OR.IB1PAR(3).GT.255)
+ C THEN
+ IERR = 3
+ WRITE (*,9003) IB1PAR(3)
+ 9003 FORMAT (1H ,'INVALID GRID IDENTIFICATION ',I4)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OPTIONAL BLOCK INDICATOR FLAG ( CODE TABLE 1 ).
+C***
+C
+ IBLOCK(8) = IB1PAR(4)
+ IF (IB1PAR(4).LT.0.OR.IB1PAR(4).GT.3) IERR = 4
+C
+C CHECK IF GRID SPECIFIED IS UNCATALOGUED.
+C
+ IF (IB1PAR(3).EQ.255.AND.IB1PAR(4).EQ.0) IERR = 4
+ IF (IB1PAR(3).EQ.255.AND.IB1PAR(4).EQ.2) IERR = 4
+C
+ IF (IERR.NE.0)
+ C THEN
+ WRITE (*,9004) IB1PAR(4)
+ 9004 FORMAT (1H ,'INVALID BLOCK INDICATOR ',I4)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C***
+C* PARAMETER IDENTIFIER ( CODE TABLE 2 ).
+C***
+C
+ IBLOCK(9) = IB1PAR(5)
+ IF (IB1PAR(5).LT.0.OR.IB1PAR(5).GT.255)
+ C THEN
+ IERR = 5
+ WRITE (*,9005) IB1PAR(5)
+ 9005 FORMAT (1H ,'INVALID PARAMETER ',I4)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C***
+C* INDICATOR OF LEVEL TYPE ( CODE TABLE 3 ).
+C***
+C
+ IBLOCK(10) = IB1PAR(6)
+ IF (IB1PAR(6).LT.0.OR.IB1PAR(6).GT.110)
+ C THEN
+ IERR = 6
+ WRITE (*,9006) IB1PAR(6)
+ 9006 FORMAT (1H ,'INVALID LEVEL TYPE ',I4)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* DESCRIPTION OF LEVEL OR LAYER ( CODE TABLE 3 ).
+C***
+C
+C
+C
+C FOR CERTAIN SPECIAL LEVELS NO FURTHER DESCRIPTION IS
+C NECESSARY, AND THE FIELDS ARE SET TO 0.
+C
+ IF (IB1PAR(6).LT.100.OR.IB1PAR(6).EQ.102)
+ C THEN
+ IB1PAR(7) = 0
+ IB1PAR(8) = 0
+ ENDIF
+C
+ IBLOCK(11) = IB1PAR(7)
+ IBLOCK(12) = IB1PAR(8)
+C
+C CERTAIN LEVEL TYPES REQUIRE THAT THE DESCRIPTION OCCUPY
+C BOTH 8 BIT FIELDS.
+C
+ IF (IB1PAR(6).EQ.100.OR.IB1PAR(6).EQ.103.OR.IB1PAR(6).EQ.105.
+ C OR.IB1PAR(6).EQ.107.OR.IB1PAR(6).EQ.109)
+ C THEN
+ IBLOCK(12) = IBLOCK(11)
+ IBLOCK(11) = IBLOCK(11) / 32
+ IBLOCK(12) = IBLOCK(12) - IBLOCK(11) * 32
+ IF (IB1PAR(7).GT.65535) IERR = 7
+ ELSE
+ IF (IB1PAR(7).GT.255.OR.IB1PAR(8).GT.255) IERR = 7
+ ENDIF
+C
+ IF (IERR.NE.0)
+ C THEN
+ WRITE (*,9007) IB1PAR(7),IB1PAR(8)
+ 9007 FORMAT (1H ,'LEVEL DESCRIPTION ERROR ',I8,3X,I8)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* DATE AND TIME
+C***
+C
+ IBLOCK(13) = IB1PAR(9)
+ IF (IB1PAR(9).LT.0.OR.IB1PAR(9).GT.99) IERR = 8
+ IBLOCK(14) = IB1PAR(10)
+ IF (IB1PAR(10).LT.1.OR.IB1PAR(10).GT.12) IERR = 8
+ IBLOCK(15) = IB1PAR(11)
+ IF (IB1PAR(11).LT.1.OR.IB1PAR(11).GT.31) IERR = 8
+ IBLOCK(16) = IB1PAR(12)
+ IF (IB1PAR(12).LT.0.OR.IB1PAR(12).GT.23) IERR = 8
+ IBLOCK(17) = IB1PAR(13)
+ IF (IB1PAR(13).LT.0.OR.IB1PAR(13).GT.59) IERR = 8
+C
+ IF (IERR.NE.0)
+ C THEN
+ WRITE (*,9008) IB1PAR(9),IB1PAR(10),IB1PAR(11),IB1PAR(12),
+ C IB1PAR(13)
+ 9008 FORMAT (1H ,'INVALID DATE/TIME ',3I2,' / ',2I2)
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* UNIT OF TIME , TIME RANGE(S) AND TIME RANGE FLAG ( CODE TABLE 5 ).
+C***
+C
+C TIME UNIT.
+C
+ IBLOCK(18) = IB1PAR(14)
+ IF (IB1PAR(14).LT.0.OR.IB1PAR(14).GT.90) IERR = 9
+C
+C THERE CAN BE ONE OR TWO TIME RANGES, EACH IN 1 OCTECT OR
+C ONE TIME RANGE IN 2 OCTECTS.
+C
+ IF (IB1PAR(17).EQ.0.OR.IB1PAR(17).EQ.10) IB1PAR(16) = 0
+C
+C CROSS CHECK RANGE VALUES AND FLAG VALUES.
+C
+ IF (IB1PAR(15).GT.65535.OR.IB1PAR(15).LT.0) IERR = 9
+ IF (IB1PAR(15).GT.255.AND.IB1PAR(17).NE.10) IERR = 9
+ IF (IB1PAR(16).GT.255.OR.IB1PAR(16).LT.0) IERR = 9
+ IF (IB1PAR(17).LT.0.OR.IB1PAR(17).GT.10) IERR = 9
+ IF (IERR.NE.0)
+ C THEN
+ WRITE (*,9009) IB1PAR(14),IB1PAR(15),IB1PAR(16),IB1PAR(17)
+ 9009 FORMAT (1H ,'TIME UNIT/RANGE1/RANGE2/FLAG ERROR - ',
+ C I8,2X,'/',I8,2X,'/',I8,2X,'/',I8)
+ RETURN
+ ENDIF
+C
+ IBLOCK(19) = IB1PAR(15)
+ IBLOCK(20) = IB1PAR(16)
+C
+C ONE TIME RANGE OCCUPYING BOTH OCTETS.
+C
+ IF (IB1PAR(17).EQ.10)
+ C THEN
+ IBLOCK(20) = IBLOCK(19)
+ IBLOCK(19) = IBLOCK(19) / 32
+ IBLOCK(20) = IBLOCK(20) - IBLOCK(19) * 32
+ ENDIF
+C
+C TIME RANGE FLAG
+C
+ IBLOCK(21) = IB1PAR(17)
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* RESERVED ELEMENTS.
+C***
+C
+ IBLOCK(22) = 0
+ IBLOCK(23) = 0
+ IBLOCK(24) = 0
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* PACK 24 8-BIT FIELDS OF BLOCK 1 IN CODED ARRAY.
+C*
+C********************************************************************
+C
+ IWORD = 1
+ IBYTE = 8
+ NVAL = 24
+ IOFF = 0
+C
+ CALL SBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,IBYTE,0,NVAL)
+ CALL OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 2 - GRID DESCRIPTION BLOCK.
+C*
+C********************************************************************
+C
+C
+C
+C
+C***
+C* SET ARRAY IBLOCK TO 0 . IT IS USED TO ZERO FILL RESERVED OCTETS.
+C***
+C
+ DO 100 I=1,24
+ IBLOCK(I) = 0
+ 100 CONTINUE
+C
+C
+C
+C
+C***
+C* LAT/LONGITUDE GRID, GAUSSIAN GRID AND SPHERICAL HARMONICS
+C* ARE THE ONLY DATA REPRESENTATIONS HANDLED.
+C***
+C
+ IF (IB1PAR(4).EQ.1.OR.IB1PAR(4).EQ.3)
+ C THEN
+ IF (IB2PAR(1).NE.0.AND.IB2PAR(1).NE.4.AND.IB2PAR(1).NE.50)
+ C THEN
+ WRITE (*,*)'GRID DESCRIPTION BLOCK NOT YET DEFINED'
+ IERR = -3
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C***
+C* LENGTH OF GRID DESCRIPTION BLOCK.
+C***
+C
+C LENGTH IS 32 OCTETS FOR LAT/LONG, GAUSSIAN AND SPHERICAL
+C HARMONICS . FOR ANY DATA ON HYBRID LEVELS THE
+C VERTICAL COORDINATES ARE ADDED.
+C
+ I = 32
+ IF (IB1PAR(6).GT.108) I = I + ILENV * 4
+C
+ CALL SBYTE (IGRIB(IWORD),I,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C***
+C* NUMBER OF UNUSED BITS AT END OF BLOCK.
+C* CURRENT DEFINITION IMPLIES 0.
+C***
+C
+ CALL SBYTE (IGRIB(IWORD),IBLOCK(1),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C***
+C* NEXT OCTET IS RESERVED.
+C***
+C
+ CALL SBYTE (IGRIB(IWORD),IBLOCK(I),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C***
+C* DATA REPRESENTATION TYPE.
+C***
+C
+ IF (IB2PAR(1).LT.0.OR.IB2PAR(1).GT.4) IERR = 10
+ IF (IB2PAR(1).EQ.50) IERR = 0
+ IF (IERR.NE.0)
+ C THEN
+ IERR = 10
+ WRITE (*,9010) IB2PAR(1)
+ 9010 FORMAT (1H ,'INVALID DATA REPRESENTATION TYPE - ',I3)
+ RETURN
+ ENDIF
+ CALL SBYTE (IGRIB(IWORD),IB2PAR(1),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* LAT/LONG OR GAUSSIAN GRID.
+C***
+C
+ IF (IB2PAR(1).EQ.0.OR.IB2PAR(1).EQ.4)
+ C THEN
+C
+C NUMBER OF LAT/LONG POINTS.
+C
+ CALL SBYTES (IGRIB(IWORD),IB2PAR(2),IOFF,16,0,2)
+ CALL OFFSET (IOFF,2,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C LAT/LONG OF ORIGIN.
+C SIGN BIT SET TO 1 IF VALUES ARE NEGATIVE.
+C
+ DO 200 I=1,2
+ ILAT(I) = IB2PAR(I+3)
+ ISIGN = 0
+ IF (ILAT(I).LT.0)
+ C THEN
+ ISIGN = 8388608
+ ILAT(I) = - ILAT(I)
+ ENDIF
+ ILAT(I) = ILAT(I) + ISIGN
+ 200 CONTINUE
+C
+ CALL SBYTES (IGRIB(IWORD),ILAT(1),IOFF,24,0,2)
+ CALL OFFSET (IOFF,2,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C EXTREME POINT / INCREMENTS FLAG.
+C SET TO 0 UNUSED EXTREME POINT/ INCREMENT FIELDS.
+C
+ IF (IB2PAR(6).LE.1.OR.IB2PAR(6).GT.3)
+ C THEN
+ WRITE (*,9011) IB2PAR(6)
+ 9011 FORMAT (1H ,'INVALID EXTREME POINT / INCREMENT',
+ C ' FLAG - ',I3)
+ IERR = 11
+ RETURN
+ ENDIF
+C
+ IF (IB2PAR(6).EQ.1)
+ C THEN
+ IB2PAR(7) = 0
+ IB2PAR(8) = 0
+ ENDIF
+C
+ IF (IB2PAR(6).EQ.2)
+ C THEN
+ IB2PAR(9) = 0
+ IB2PAR(10) = 0
+ ENDIF
+C
+ CALL SBYTE (IGRIB(IWORD),IB2PAR(6),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C LAT/LONG OF EXTREME POINT.
+C
+C SIGN BIT SET TO 1 IF VALUES ARE NEGATIVE.
+C
+ DO 300 I=1,2
+ ILAT(I) = IB2PAR(I+6)
+ ISIGN = 0
+ IF (ILAT(I).LT.0)
+ C THEN
+ ISIGN = 8388608
+ ILAT(I) = - ILAT(I)
+ ENDIF
+ ILAT(I) = ILAT(I) + ISIGN
+ 300 CONTINUE
+C
+ CALL SBYTES (IGRIB(IWORD),ILAT(1),IOFF,24,0,2)
+ CALL OFFSET (IOFF,2,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C DIRECTION INCREMENTS / NUMBER OF LATITUDE LINES.
+C
+ CALL SBYTES (IGRIB(IWORD),IB2PAR(9),IOFF,16,0,2)
+ CALL OFFSET (IOFF,2,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C SCANNING MODE.
+C
+ CALL SBYTE (IGRIB(IWORD),IB2PAR(11),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C 4 RESERVED OCTETS.
+C
+ CALL SBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,8,0,4)
+ CALL OFFSET (IOFF,4,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* SPHERICAL HARMONIC DATA.
+C***
+C
+ IF (IB2PAR(1).EQ.50)
+ C THEN
+C
+C PENTAGONAL RESOLUTION PARAMETERS.
+C
+ CALL SBYTES (IGRIB(IWORD),IB2PAR(2),IOFF,16,0,3)
+ CALL OFFSET (IOFF,3,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C REPRESENTATION TYPE AND MODE.
+C
+ CALL SBYTES (IGRIB(IWORD),IB2PAR(5),IOFF,8,0,2)
+ CALL OFFSET (IOFF,2,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C 18 RESERVED OCTETS.
+C
+ CALL SBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,8,0,18)
+ CALL OFFSET (IOFF,18,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ ENDIF
+C
+C
+C
+C
+C***
+C* ADD VERTICAL COORDINATE PARAMETERS FOR HYBRID LEVELS.
+C***
+C
+ IF (IB1PAR(6).GT.108)
+ C THEN
+ DO 400 I=1,ILENV
+ CALL CONFP (FVERT(I),IEXP,IMANT)
+ CALL SBYTE (IGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL SBYTE (IGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ 400 CONTINUE
+C
+ ENDIF
+C
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 3 (IF REQUIRED) - BIT MAP BLOCK.
+C*
+C********************************************************************
+C
+ IF (IB1PAR(4).EQ.2.OR.IB1PAR(4).EQ.3)
+ C THEN
+ WRITE (*,*)'BIT MAP BLOCK NOT YET DEFINED'
+ IERR = -3
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 4 - BINARY DATA BLOCK.
+C*
+C********************************************************************
+C
+C
+C***
+C* RETAIN POINTERS TO WORD AND BIT POSITION OF BINARY DATA
+C* BLOCK LENGTH FIELD. ENTER LENGTH AS 0.
+C***
+C
+ IPW = IWORD
+ IPB = IOFF
+C
+ CALL SBYTE (IGRIB(IWORD),IBLOCK(1),IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* 4 BIT FLAG / 4 BIT COUNT OF UNUSED BITS AT END OF BLOCK OCTET.
+C***
+C
+C FLAG IS 1 FOR SPHERICAL HARMONICS, 0 FOR LAT/LONG OR GAUSSIAN.
+C
+ IREP = 0
+ IF (IB2PAR(1).EQ.50) IREP = 1
+ IFLAG = IREP * 16
+C
+ CALL SBYTE (IGRIB(IWORD),IFLAG,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* FIND MAXIMUM AND MINIMUM VALUES IN DATA ARRAY. FOR
+C* DATA IN SPHERICAL HARMONIC FORM THE FIRST WORD CONTAINS
+C* THE REAL (0,0)COEFFICIENT, WHICH IS TREATED SEPARATELY.
+C***
+C
+C
+ ILEN = KLENF - IREP
+ CALL MXMN (FPDATA(IREP+1),ILEN,FMAX,FMIN)
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* SCALE FACTOR.
+C***
+C
+C CALCULATE SCALE FACTOR
+C
+ S = (FMAX-FMIN)/(2**(IBITS+1)-1)
+ IF (S.NE.0.) S = ALOG(S)/ALOG(2.) + 2.
+ ISCALE = MIN(INT(S),INT(S+SIGN(1.,S)))
+C
+C
+C
+C
+C SET SIGN BIT (BIT 16) AND PUT SCALE FACTOR INTO REMAINING
+C 15 BITS OF CODED 16 BIT FIELD.
+C
+ JSCALE = ISCALE
+ ISIGN = 0
+ IF (JSCALE.LT.0)
+ C THEN
+ ISIGN = 32768
+ JSCALE = - JSCALE
+ ENDIF
+ JSCALE = JSCALE + ISIGN
+C
+ ZSCALE = 2.**ISCALE
+C
+C FOR MISSING DATA SCALE FACTOR IS SET TO ALL 1-BITS.
+C
+ IF (IMISS.EQ.1) JSCALE = 65535
+C
+ CALL SBYTE (IGRIB(IWORD),JSCALE,IOFF,16)
+ CALL OFFSET (IOFF,1,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* MINIMUM (REFERENCE) VALUE.
+C***
+C
+C CONVERT MINIMUM VALUE (FMIN) TO GRIB FORMAT (IEXP,IMANT)
+C
+ CALL CONFP (FMIN,IEXP,IMANT)
+C
+C EXPONENT AND MANTISSA SET TO ALL 1-BITS FOR MISSING DATA.
+C
+ IF (IMISS.EQ.1)
+ C THEN
+ IEXP = 255
+ IMANT = 16777215
+ ENDIF
+ CALL SBYTE (IGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL SBYTE (IGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C***
+C* NUMBER OF BITS IN EACH DATA VALUE.
+C***
+C
+ CALL SBYTE (IGRIB(IWORD),IBITS,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C***
+C* IF SPHERICAL HARMONICS DATA, NEXT 4 OCTETS ARE DIFFERENT FORMAT.
+C***
+C
+ IF (IREP.EQ.1)
+ C THEN
+C
+C STORE REAL (0,0) COEFFICIENT IN FLOATING
+C POINT FORM.
+C
+ CALL CONFP (FPDATA(1),IEXP,IMANT)
+C
+ CALL SBYTE (IGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL SBYTE (IGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ ENDIF
+C
+C
+C
+C
+C***
+C* SCALE AND STORE DATA VALUES.
+C***
+C
+ DO 600 I = IREP+1 , KLENF
+ JGRIB = NINT ( (FPDATA(I)-FMIN) / ZSCALE )
+ FPDATA(I) = ZGRIB
+ 600 CONTINUE
+C
+ ILENFM = KLENF - IREP
+ CALL SBYTES (IGRIB(IWORD),FPDATA(IREP+1),IOFF,IBITS,0,ILENFM)
+ CALL OFFSET (IOFF,ILENFM,IWORD,IBITS,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* ENTER LENGTH OF BINARY DATA BLOCK, HAVING ENSURED THAT
+C* THE LENGTH IS AN EVEN NUMBER OF OCTETS.
+C***
+C
+C LENGTH OF BINARY DATA BLOCK IN BITS.
+C
+ LBIN = (IWORD-IPW) * NBIT + IOFF - IPB
+C
+ L = LBIN / 16
+ L = LBIN - ( L*16 )
+C
+C FILL UNUSED PORTION OF LAST 2 OCTETS WITH BINARY ZEROES.
+C
+ LNIL = 0
+ IF (L.NE.0)
+ C THEN
+ LNIL = 16 - L
+ CALL SBYTE (IGRIB(IWORD),IFILL,IOFF,LNIL)
+ CALL OFFSET (IOFF,1,IWORD,LNIL,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ ENDIF
+C
+ LBIN = (IWORD-IPW) * NBIT + IOFF - IPB
+C
+C ENTER LENGTH - IN OCTETS - OF DATA BLOCK.
+C
+ LBIN = LBIN / 8
+ CALL SBYTE (IGRIB(IPW),LBIN,IPB,24)
+ CALL OFFSET (IPB,1,IPW,24,NBIT,ILENG,IERR)
+C
+C ENTER NUMBER OF UNUSED BITS IN FLAG/BIT COUNT FIELD.
+C
+ IFLAG = IFLAG + LNIL
+ CALL SBYTE (IGRIB(IPW),IFLAG,IPB,8)
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 5 - END BLOCK.
+C*
+C********************************************************************
+C
+C
+C***
+C* ADD 7 7 7 7 TO CODED DATA.
+C***
+C
+ IBLOCK(1) = 55
+ IBLOCK(2) = 55
+ IBLOCK(3) = 55
+ IBLOCK(4) = 55
+C
+ CALL SBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,8,0,4)
+ CALL OFFSET (IOFF,4,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C***
+C* SET ANY UNUSED PART OF LAST WORD TO BINARY ZEROES.
+C***
+C
+ IF (IOFF.NE.0)
+ C THEN
+ KBITS = NBIT - IOFF
+ CALL SBYTE (IGRIB(IWORD),IFILL,IOFF,KBITS)
+ ELSE
+ IWORD = IWORD - 1
+ ENDIF
+C
+C
+C
+C***
+C* ROUND TO 120 OCTETS, IF REQUIRED.
+C***
+C
+ IF (IROUND.EQ.1)
+ C THEN
+ NUMBIT = IWORD * NBIT
+ I = NUMBIT / 960
+ I = I * 960
+ I = NUMBIT - I
+ IF (I.NE.0) I = (960 - I) / NBIT
+C
+ DO 700 J=IWORD+1,IWORD+I
+ IGRIB(J) = 0
+ 700 CONTINUE
+C
+ IWORD = IWORD + I
+ ENDIF
+C
+ RETURN
+ END
diff --git a/gribex/codeps.F b/gribex/codeps.F
new file mode 100755
index 0000000..5d51c1e
--- /dev/null
+++ b/gribex/codeps.F
@@ -0,0 +1,848 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CODEPS( NAME,CHDATA,ILENCH,FPDATA,ILENFP,INDATA,ILENIN,
+ X NBYTE,LGDATA,ILENLG,IB1PAR,IPSCOD,ILENPS,
+ X IRSERV,NBIT,IWORD,IROUND,IERR)
+C
+C---->
+C**** CODEPS - Pack pseudo-grib product.
+C
+C Purpose.
+C --------
+C
+C Packs character data and arrays of floating point, integer
+C and logical values in machine-independent pseudo-grib format.
+C
+C** Interface.
+C ----------
+C
+C CALL CODEPS( NAME,CHDATA,ILENCH,FPDATA,ILENFP,INDATA,ILENIN,
+C X NBYTE,LGDATA,ILENLG,IB1PAR,IPSCOD,ILENPS,
+C X IRSERV,NBIT,IWORD,IROUND,IERR)
+C
+C
+C
+C Input Parameters.
+C -----------------
+C
+C NAME - 4 Letters (Code name for section 0).
+C CHDATA - Character string (letters and figures only) (section 4).
+C ILENCH - Length of this string (Maximum length is 600).
+C To indicate missing data ILENCH is made
+C negative and string is all spaces.
+C FPDATA - Array of floating point values (section 4).
+C ILENFP - Length of this array (number of data values to be coded)
+C To indicate missing data values, ILENFP is made
+C negative and all data values are set to 0.
+C INDATA - Array of integer values (section 4).
+C ILENIN - Length of this array (number of data values to be coded)
+C To indicate missing data values, ILENIN is made
+C negative and all data values are set to 0.
+C NBYTE - Number of bytes (8-bit) needed for integers.
+C LGDATA - Array of logical values (section 4).
+C ILENLG - Length of this array (number of data values to be coded)
+C To indicate missing data values, ILENLG is made
+C negative and all data values are set .false.
+C IB1PAR - Integer array of data definition information (section 1)
+C ILENPS - Length of array IPSCOD in bytes.
+C IRSERV - Number of bytes reserved in data section for future use.
+C NBIT - Number of bits per computer word.
+C IROUND - 0 , no rounding.
+C 1 , round to nearest 120 octets.
+C
+C Output Parameters.
+C -----------------
+C
+C IPSCOD - Data coded in pseudo-grib code.
+C ILENPS - Length of this array.
+C IWORD - Number of words occupied by coded data.
+C IERR - Error indicator.
+C 0, no error.
+C -1, number of bytes per integer exceeds
+C word length, or maximum allowed, is 0
+C or negative.
+C -2, output array too small to hold coded
+C data values.
+C -3, currently undefined option selected.
+C -4, missing data field contains non-zero.
+C ( space for missing character data,
+C and .false. for logicals.)
+C -5, integer larger than field width has
+C been encountered.
+C -6, character data contains other than
+C letters, figures or spaces.
+C 1, invalid originating centre.
+C 2, invalid model identification.
+C 3, invalid grid identification.
+C 4, invalid section indicator flag
+C 5, invalid parameter identifier.
+C 6, invalid level type.
+C 7, level description error.
+C 8, date/time error.
+C 9, invalid time unit or range.
+C 10, indicator/number averaged error.
+C
+C
+C Externals.
+C ----------
+C
+C SBYTE
+C SBYTES
+C CONFPA
+C PRTBIN
+C OFFSET
+C
+C
+C Comments.
+C ---------
+C
+C Section 1 , data definition section (IB1PAR).
+C
+C Word Contents
+C ---- --------
+C 1 Originating centre identifier.
+C 2 Model identification.
+C 3 Grid definition.
+C 4 Flag (table 1)
+C 5 Parameter identifier (code table 2).
+C 6 Type of level (code table 3).
+C 7-8 Value(s) of levels (code table 3).
+C 9 Year of data
+C 10 Month of data
+C 11 Day of data
+C 12 Hour of data
+C 13 Minute of data
+C 14 Time unit (code table 4).
+C 15 Time range one
+C 16 Time range two
+C 17 Time range flag (code table 5).
+C 18 Number averaged.
+C
+C Code tables are those for WMO GRIB code.
+C
+C Value(s) of level can occupy 2 words.
+C For a layer the first word defines the top
+C and the second the bottom of the layer.
+C For a single level, only the first word is used.
+C
+C Elements not used or inapplicable should be set to 255.
+C
+C
+C Author.
+C -------
+C
+C J.Hennessy 05.02.86
+C
+C
+C Modifications.
+C --------------
+C
+C J.Hennessy 06.06.86
+C 19.08.86
+C 21.08.86
+C
+C J.Hennessy 17.09.90
+C Lower case letters as well as the characters
+C _ - . , added.
+C
+C J.D.Chambers ECMWF 13.09.94
+C Inhibit abort if NOABORT = 1, use grbcom.h
+C
+C J.D.Chambers ECMWF 12.08.96
+C Call CONFP3 instead of CONFP.
+C
+C J.D.Chambers ECMWF April 1998
+C Call CONFPA instead of CONFP3.
+C (Vectorization improvement from D.Dent).
+C
+C----<
+C********************************************************************
+C
+ IMPLICIT NONE
+C
+C Parameters
+ INTEGER NTYPE, NCHAR
+ PARAMETER (NTYPE=2)
+ PARAMETER (NCHAR=67)
+C
+C Subroutine arguments
+ CHARACTER*4 NAME
+ CHARACTER*(*) CHDATA
+ INTEGER ILENCH, ILENFP, INDATA, ILENIN, NBYTE, ILENLG, IB1PAR
+ INTEGER IPSCOD, ILENPS, IRSERV, NBIT, IWORD, IROUND, IERR
+ REAL FPDATA
+ LOGICAL LGDATA
+ DIMENSION FPDATA(*), INDATA(*), LGDATA(*)
+ DIMENSION IPSCOD(*), IB1PAR(*)
+C
+C Local variables
+ CHARACTER*1 CHAR
+ DIMENSION CHAR(NCHAR)
+ INTEGER IBLOCK
+ DIMENSION IBLOCK(24)
+ INTEGER IASCII
+ DIMENSION IASCII(NCHAR)
+ CHARACTER*4 VNAME
+ DIMENSION VNAME(NTYPE)
+ INTEGER JPAR, JLEN
+ DIMENSION JPAR(NTYPE),JLEN(NTYPE)
+C
+C
+ DATA IASCII /65 ,66 ,67 ,68 ,69 ,70 ,71 ,72 ,73 ,74 ,75 ,76 ,77 ,
+ X 78 ,79 ,80 ,81 ,82 ,83 ,84 ,85 ,86 ,87 ,88 ,89 ,90 ,
+ X 48 ,49 ,50 ,51 ,52 ,53 ,54 ,55 ,56 ,57 ,32 ,
+ X 97 ,98 ,99 ,100,101,102,103,104,105,106,107,108,109,
+ X 110,111,112,113,114,115,116,117,118,119,120,121,122,
+ X 95 ,46 ,44 ,45 /
+C
+ DATA CHAR /'A','B','C','D','E','F','G','H','I','J','K','L','M',
+ X 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
+ X '0','1','2','3','4','5','6','7','8','9',' ' ,
+ X 'a','b','c','d','e','f','g','h','i','j','k','l','m',
+ X 'n','o','p','q','r','s','t','u','v','w','x','y','z',
+ X '_','.',',','-' /
+C
+ DATA VNAME /'BUDG','TIDE'/
+C
+ DATA JLEN / 6000 , 25320/
+C
+ DATA JPAR / 128 , 127 /
+C
+C SET MAXIMUM NUMBER OF BITS FOR INTEGER FIELDS.
+ INTEGER ICMISS, KLENCH, I, IFMISS, KLENFP, IIMISS, KLENIN
+ INTEGER ILMISS, KLENLG, IBITS, IBYTE, NVAL, IOFF, KTEMP
+ INTEGER KERR, IPW, IPB, IEXP, IMANT, NEGSIN, MAXINT, ISIGN
+ INTEGER NTRUE, J, LBIN, L, LNIL, KBITS, NUMBIT, N
+C
+#include "grbcom.h"
+C
+C
+C Clear error indicator.
+ IERR = 0
+C
+C
+C********************************************************************
+C
+C Check for missing data indicators.
+C
+C********************************************************************
+C
+C Character data.
+C
+ ICMISS = 0
+ IF (ILENCH.LT.0) THEN
+ KLENCH = -ILENCH
+ ICMISS = 1
+ DO 50 I=1,KLENCH
+ IF (CHDATA(I:I).NE.' ') THEN
+ IERR = -4
+ WRITE(*,*) 'CODEPS: Invalid value in missing data field.'
+ RETURN
+ ENDIF
+ 50 CONTINUE
+ ELSE
+ KLENCH = ILENCH
+ ENDIF
+C
+C Floating point numbers.
+C
+ IFMISS = 0
+ IF (ILENFP.LT.0) THEN
+ KLENFP = - ILENFP
+ IFMISS = 1
+ DO 100 I=1,KLENFP
+ IF (FPDATA(I).NE.0.) THEN
+ IERR = -4
+ WRITE(*,*) 'CODEPS: Invalid value in missing data field.'
+ RETURN
+ ENDIF
+ 100 CONTINUE
+ ELSE
+ KLENFP = ILENFP
+ ENDIF
+C
+C Integers.
+C
+ IIMISS = 0
+ IF (ILENIN.LT.0) THEN
+ KLENIN = - ILENIN
+ IIMISS = 1
+ DO 200 I=1,KLENIN
+ IF (INDATA(I).NE.0) THEN
+ IERR = -4
+ WRITE(*,*) 'CODEPS: Invalid value in missing data field.'
+ RETURN
+ ENDIF
+ 200 CONTINUE
+ ELSE
+ KLENIN = ILENIN
+ ENDIF
+C
+C Logicals.
+C
+ ILMISS = 0
+ IF (ILENLG.LT.0) THEN
+ KLENLG = - ILENLG
+ ILMISS = 1
+ DO 300 I=1,KLENLG
+ IF (LGDATA(I).NEQV..FALSE.) THEN
+ IERR = -4
+ WRITE(*,*) 'CODEPS: Invalid value in missing data field.'
+ RETURN
+ ENDIF
+ 300 CONTINUE
+ ELSE
+ KLENLG = ILENLG
+ ENDIF
+C
+C
+C
+C********************************************************************
+C
+C Check number of bytes for integer numbers.
+C
+C********************************************************************
+C
+ IBITS = NBYTE * 8
+C
+ IF (IBITS.GT.NBIT) THEN
+ WRITE(*,*) 'CODEPS: Number of bits per data value ', IBITS
+ WRITE(*,*) ' exceeds word length ', NBIT
+ IERR = -1
+ RETURN
+ ENDIF
+C
+ IF (IBITS.LE.0) THEN
+ WRITE(*,*) 'CODEPS: Maximum permitted value ', IBITS
+ WRITE(*,*) ' should be positive.'
+ IERR = -1
+ RETURN
+ ENDIF
+C
+C
+C********************************************************************
+C
+C Section 0 - INDICATOR Section.
+C
+C********************************************************************
+C
+C
+C The letters of the code name are inserted in the
+C first 4 elements of 'IBLOCK'.
+ DO 400 I=1,36
+ IF (NAME(1:1).EQ.CHAR(I)) IBLOCK(1) = IASCII(I)
+ IF (NAME(2:2).EQ.CHAR(I)) IBLOCK(2) = IASCII(I)
+ IF (NAME(3:3).EQ.CHAR(I)) IBLOCK(3) = IASCII(I)
+ IF (NAME(4:4).EQ.CHAR(I)) IBLOCK(4) = IASCII(I)
+ 400 CONTINUE
+C
+C Pack 4 8-bit fields in section 0 of coded array.
+ IWORD = 1
+ IBYTE = 8
+ NVAL = 4
+ IOFF = 0
+ CALL SBYTES(IPSCOD(IWORD),IBLOCK(1),IOFF,IBYTE,0,NVAL)
+ CALL OFFSET(IOFF,NVAL,IWORD,IBYTE,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C********************************************************************
+C
+C Section 1 - PRODUCT DEFINITION Section.
+C
+C********************************************************************
+C
+C
+C Length of section 1 (in octets) in first 3 octets.
+ IBLOCK(1) = 0
+ IBLOCK(2) = 0
+ IBLOCK(3) = 24
+C
+C Fourth octet reserved and set to 0.
+ IBLOCK(4) = 0
+C
+C Identification of centre
+ IBLOCK(5) = IB1PAR(1)
+ IF (IB1PAR(1).LT.1.OR.IB1PAR(1).GT.98) THEN
+ IERR = 1
+ WRITE(*,*) 'CODEPS: Invalid originating centre ', IB1PAR(1)
+ RETURN
+ ENDIF
+C
+C Model identification
+ IBLOCK(6) = IB1PAR(2)
+ IF (IB1PAR(2).LT.1.OR.IB1PAR(2).GT.255) THEN
+ IERR = 2
+ WRITE(*,*) 'CODEPS: Invalid model identification ', IB1PAR(2)
+ RETURN
+ ENDIF
+C
+C Grid definition
+ IBLOCK(7) = IB1PAR(3)
+ IF (IB1PAR(3).LT.1.OR.IB1PAR(3).GT.255) THEN
+ IERR = 3
+ WRITE(*,*) 'CODEPS: Invalid grid definition ', IB1PAR(3)
+ RETURN
+ ENDIF
+C
+C Optional section indicator flags ( code table 1 ).
+C
+C Sections included Binary value Decimal value
+C
+C NONE 00000000 0
+C 2 10000000 128
+C 3 01000000 64
+C 2 AND 3 11000000 192
+C
+ IBLOCK(8) = IB1PAR(4)
+C
+C Shift 2-bit flag field right by 6 bits to facilitate checking
+ KTEMP = IB1PAR(4) / 64
+ IF (KTEMP.NE.0) IERR = 4
+ IF (IERR.NE.0) THEN
+ CALL PRTBIN(IB1PAR(4),8,KTEMP,KERR)
+ WRITE(*,*) 'CODEPS: Invalid section indicator flag ', KTEMP
+ WRITE(*,*) 'CODEPS: Return code from PRTBIN = ', KERR
+ RETURN
+ ENDIF
+C
+C Parameter identifier ( code table 2 ).
+ IBLOCK(9) = IB1PAR(5)
+ IF (IB1PAR(5).LT.0.OR.IB1PAR(5).GT.255) THEN
+ IERR = 5
+ WRITE(*,*) 'CODEPS: Invalid parameter ', IB1PAR(5)
+ RETURN
+ ENDIF
+C
+C Indicator of level type ( code table 3 ).
+ IBLOCK(10) = IB1PAR(6)
+ IF (IB1PAR(6).LT.0.OR.IB1PAR(6).GT.255) THEN
+ IERR = 6
+ WRITE(*,*) 'CODEPS: Invalid level type ', IB1PAR(6)
+ RETURN
+ ENDIF
+C
+C Description of level or layer ( code table 3 ).
+C
+C For certain special levels no further description is
+C necessary, and the fields are set to 0.
+C
+ IF (((IB1PAR(6).LT.100).AND.(IB1PAR(6).NE.20)).OR.
+ X (IB1PAR(6).EQ.102) .OR.
+ X (IB1PAR(6).EQ.200) .OR.
+ X (IB1PAR(6).EQ.201)) THEN
+ IB1PAR(7) = 0
+ IB1PAR(8) = 0
+ ENDIF
+C
+ IBLOCK(11) = IB1PAR(7)
+ IBLOCK(12) = IB1PAR(8)
+C
+C Certain level types require that the description occupy
+C both 8 bit fields.
+C
+ IF ((IB1PAR(6).EQ. 20).OR.
+ X (IB1PAR(6).EQ.100).OR.
+ X (IB1PAR(6).EQ.103).OR.
+ X (IB1PAR(6).EQ.105).OR.
+ X (IB1PAR(6).EQ.107).OR.
+ X (IB1PAR(6).EQ.109).OR.
+ X (IB1PAR(6).EQ.111).OR.
+ X (IB1PAR(6).EQ.113).OR.
+ X (IB1PAR(6).EQ.115).OR.
+ X (IB1PAR(6).EQ.117).OR.
+ X (IB1PAR(6).EQ.125).OR.
+ X (IB1PAR(6).EQ.160) ) THEN
+C
+C 8 low order bits in IBLOCK(12)
+C High order bits in IBLOCK(11)
+ IBLOCK(12) = IBLOCK(11)
+ IBLOCK(11) = IBLOCK(11) / 256
+ IBLOCK(12) = IBLOCK(12) - IBLOCK(11) * 256
+C
+C Check maximum possible in 16 bits not exceeded.
+ IF (IB1PAR(7).GT.65535) IERR = 7
+ ELSE
+ IF (IB1PAR(7).GT.255.OR.IB1PAR(8).GT.255) IERR = 7
+ ENDIF
+C
+ IF (IERR.NE.0) THEN
+ WRITE(*,*) 'CODEPS: Level description error ', IB1PAR(7),
+ X IB1PAR(8)
+ RETURN
+ ENDIF
+C
+C Date and time
+C (Allow: YYYY format, years 1900 upto 2154
+C or YY format, years 00 upto 254)
+C
+ IF( IB1PAR(9).GT.1900 ) THEN
+ IBLOCK(13) = IB1PAR(9) - 1900
+ ELSE
+ IBLOCK(13) = IB1PAR(9)
+ ENDIF
+ IF (IBLOCK(13).LT.0.OR.IBLOCK(13).GT.254) IERR = 8
+C
+ IBLOCK(14) = IB1PAR(10)
+ IF (IB1PAR(10).LT.1.OR.IB1PAR(10).GT.12) IERR = 8
+ IBLOCK(15) = IB1PAR(11)
+ IF (IB1PAR(11).LT.1.OR.IB1PAR(11).GT.31) IERR = 8
+ IBLOCK(16) = IB1PAR(12)
+ IF (IB1PAR(12).LT.0.OR.IB1PAR(12).GT.23) IERR = 8
+ IBLOCK(17) = IB1PAR(13)
+ IF (IB1PAR(13).LT.0.OR.IB1PAR(13).GT.59) IERR = 8
+C
+ IF (IERR.NE.0) THEN
+ WRITE(*,9010) IB1PAR(9),IB1PAR(10),IB1PAR(11),IB1PAR(12),
+ X IB1PAR(13)
+ 9010 FORMAT('CODEPS: Invalid date/time ',I4.4,2I2.2,' / ',2I2.2)
+ RETURN
+ ENDIF
+C
+C Unit of time - ( code table 4 ).
+C Time range(s) and time range indicator ( code table 5 ).
+C
+C Time unit.
+ IBLOCK(18) = IB1PAR(14)
+ IF (IB1PAR(14).LT.0.OR.IB1PAR(14).GT.7) IERR = 9
+C
+C There can be one or two time ranges, each in 1 octect or
+C one time range in 2 octects.
+ IF (IB1PAR(17).EQ.0.OR.
+ X IB1PAR(17).EQ.1.OR.
+ X IB1PAR(17).EQ.10) IB1PAR(16) = 0
+C
+C Cross check range values and flag values.
+ IF (IB1PAR(15).GT.65535.OR.IB1PAR(15).LT.0) IERR = 9
+ IF (IB1PAR(15).GT.255.AND.IB1PAR(17).NE.10) IERR = 9
+ IF (IB1PAR(16).GT.255.OR.IB1PAR(16).LT.0) IERR = 9
+ IF (IB1PAR(17).LT.0.OR.IB1PAR(17).GT.10) IERR = 9
+ IF (IERR.NE.0) THEN
+ WRITE(*,9011) IB1PAR(14),IB1PAR(15),IB1PAR(16),IB1PAR(17)
+ 9011 FORMAT(1H ,'CODEPS: Time unit/Time 1/Time 2/indicator error - ',
+ X I8,2X,'/',I8,2X,'/',I8,2X,'/',I8)
+ RETURN
+ ENDIF
+C
+ IBLOCK(19) = IB1PAR(15)
+ IBLOCK(20) = IB1PAR(16)
+C
+C One time range occupying both octets.
+ IF (IB1PAR(17).EQ.10) THEN
+C
+C 8 low order bits in IBLOCK(20)
+C High order bits in IBLOCK(19)
+ IBLOCK(20) = IBLOCK(19)
+ IBLOCK(19) = IBLOCK(19) / 256
+ IBLOCK(20) = IBLOCK(20) - IBLOCK(19) * 256
+ ENDIF
+C
+C Time range indicator
+ IBLOCK(21) = IB1PAR(17)
+C
+C Number averaged.
+ IBLOCK(22) = 0
+ IBLOCK(23) = 0
+C
+C Check consistency of indicator and number averaged fields.
+ IF (IB1PAR(17).EQ.3.AND.IB1PAR(18).EQ.0) THEN
+ IERR = 10
+ WRITE(*,9012) IB1PAR(17),IB1PAR(18)
+ 9012 FORMAT(1H ,'CODEPS: Indicator/number averaged error - ',
+ C I8,2X,'/',I8)
+ RETURN
+ ENDIF
+C
+C Value in two octets.
+ IBLOCK(22) = IB1PAR(18)
+C
+C 8 low order bits in IBLOCK(23)
+C High order bits in IBLOCK(22)
+ IBLOCK(23) = IBLOCK(22)
+ IBLOCK(22) = IBLOCK(22) / 256
+ IBLOCK(23) = IBLOCK(23) - IBLOCK(22) * 256
+C
+C Reserved element.
+ IBLOCK(24) = 0
+C
+C Pack 24 8-bit fields of section 1 in coded array.
+ IBYTE = 8
+ NVAL = 24
+ CALL SBYTES(IPSCOD(IWORD),IBLOCK(1),IOFF,IBYTE,0,NVAL)
+ CALL OFFSET(IOFF,NVAL,IWORD,IBYTE,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C Set array IBLOCK to 0 . it is used to zero fill reserved octets.
+ DO 500 I=1,24
+ IBLOCK(I) = 0
+ 500 CONTINUE
+C
+C
+C********************************************************************
+C
+C Section 4 - BINARY DATA Section.
+C
+C********************************************************************
+C
+C
+C Octets 1-3 - length of data section (in octets).
+C
+C Retain pointers to word and bit position of binary data
+C section length field. enter length as 0.
+C
+ IPW = IWORD
+ IPB = IOFF
+ CALL SBYTE(IPSCOD(IWORD),IBLOCK(1),IOFF,24)
+ CALL OFFSET(IOFF,1,IWORD,24,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C Octet 4 is reserved.
+ CALL SBYTE(IPSCOD(IWORD),IBLOCK(1),IOFF,8)
+ CALL OFFSET(IOFF,1,IWORD,8,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C Octet 5 - missing data flag.
+C
+C 1--- missing character data
+C -1-- missing floating point data
+C --1- missing integer data
+C ---1 missing logical data
+C
+ KTEMP = ICMISS*8 + IFMISS*4 + IIMISS*2 + ILMISS
+ CALL SBYTE(IPSCOD(IWORD),KTEMP,IOFF,8)
+ CALL OFFSET(IOFF,1,IWORD,8,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C Octet 6 - number of bytes per integer.
+ CALL SBYTE(IPSCOD(IWORD),NBYTE,IOFF,8)
+ CALL OFFSET(IOFF,1,IWORD,8,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C Octets 7-8 reserved.
+ CALL SBYTES(IPSCOD(IWORD),IBLOCK(1),IOFF,8,0,2)
+ CALL OFFSET(IOFF,2,IWORD,8,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C Octets 9-11 - number of characters in character data.
+ CALL SBYTE(IPSCOD(IWORD),KLENCH,IOFF,24)
+ CALL OFFSET(IOFF,1,IWORD,24,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C Octets 12-14 - number of floating point values
+ CALL SBYTE(IPSCOD(IWORD),KLENFP,IOFF,24)
+ CALL OFFSET(IOFF,1,IWORD,24,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C Octets 15-17 - number of integer values
+ CALL SBYTE(IPSCOD(IWORD),KLENIN,IOFF,24)
+ CALL OFFSET(IOFF,1,IWORD,24,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C Octets 18-20 - number of logicals
+ CALL SBYTE(IPSCOD(IWORD),KLENLG,IOFF,24)
+ CALL OFFSET(IOFF,1,IWORD,24,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C Octets 21-23 - number of bytes in data section reserved.
+ CALL SBYTE(IPSCOD(IWORD),IRSERV,IOFF,24)
+ CALL OFFSET(IOFF,1,IWORD,24,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C Octets 24-32 are reserved.
+ CALL SBYTES(IPSCOD(IWORD),IBLOCK(1),IOFF,8,0,9)
+ CALL OFFSET(IOFF,9,IWORD,8,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C Octet 33- floating point numbers.
+C
+C Convert values to pseudo-grib format (IEXP,IMANT)
+C
+ IF (KLENFP.NE.0)
+ X CALL CONFPA(FPDATA,KLENFP,IOFF,IPSCOD(IWORD),IWORD,ILENPS,NBIT)
+C
+C Integer values
+C
+ IF (KLENIN.NE.0) THEN
+C
+C Set up mask for negative numbers.
+ NEGSIN = 2 ** (IBITS-1)
+C
+C Maximum size integer in given field width.
+ MAXINT = NEGSIN - 1
+C
+ DO 700 I=1,KLENIN
+ KTEMP = INDATA(I)
+C
+C Handle negative numbers.
+ ISIGN = 0
+ IF (KTEMP.LT.0) THEN
+ KTEMP = - KTEMP
+ ISIGN = NEGSIN
+ ENDIF
+C
+C Check size of numbers.
+ IF (KTEMP.GT.MAXINT) THEN
+ IERR = -5
+ WRITE(*,*) 'CODEPS: Integer larger than field specified'
+ RETURN
+ ENDIF
+C
+C Include sign bit.
+ KTEMP = KTEMP + ISIGN
+ CALL SBYTE(IPSCOD(IWORD),KTEMP,IOFF,IBITS)
+ CALL OFFSET(IOFF,1,IWORD,IBITS,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ 700 CONTINUE
+C
+ ENDIF
+C
+C Logical values
+C
+ IF (KLENLG.NE.0) THEN
+ DO 800 I=1,KLENLG
+ NTRUE = 0
+ IF (LGDATA(I).EQV..TRUE.) NTRUE = 1
+ CALL SBYTE(IPSCOD(IWORD),NTRUE,IOFF,8)
+ CALL OFFSET(IOFF,1,IWORD,8,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+ 800 CONTINUE
+C
+ ENDIF
+C
+C Character data.
+C
+ IF (KLENCH.NE.0) THEN
+ DO 850 I=1,KLENCH
+ DO 825 J=1,NCHAR
+ IF (CHDATA(I:I).EQ.CHAR(J)) THEN
+ KTEMP = IASCII(J)
+ CALL SBYTE(IPSCOD(IWORD),KTEMP,IOFF,8)
+ CALL OFFSET(IOFF,1,IWORD,8,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+ GO TO 850
+ ENDIF
+ 825 CONTINUE
+ IERR = -6
+ WRITE(*,*) 'CODEPS: Character data contains other than '
+ WRITE(*,*) ' _ - . , letters, figures or spaces.'
+ RETURN
+ 850 CONTINUE
+ ENDIF
+C
+C Reserved bytes
+C
+ IF (IRSERV.NE.0) THEN
+ DO 900 I=1,IRSERV
+ CALL SBYTE(IPSCOD(IWORD),IBLOCK(1),IOFF,8)
+ CALL OFFSET(IOFF,1,IWORD,8,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+ 900 CONTINUE
+C
+ ENDIF
+C
+C Enter length of binary data section, having ensured that
+C the length is an even number of octets.
+C
+C Length of binary data section in bits.
+C
+ LBIN = (IWORD-IPW) * NBIT + IOFF - IPB
+ L = LBIN / 16
+ L = LBIN - ( L*16 )
+C
+C Fill unused portion of last 2 octets with binary zeroes.
+ LNIL = 0
+ IF (L.NE.0) THEN
+ LNIL = 16 - L
+ CALL SBYTE(IPSCOD(IWORD),IBLOCK(1),IOFF,LNIL)
+ CALL OFFSET(IOFF,1,IWORD,LNIL,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+ ENDIF
+ LBIN = (IWORD-IPW) * NBIT + IOFF - IPB
+C
+C Enter length - in octets - of data section.
+ LBIN = LBIN / 8
+ CALL SBYTE(IPSCOD(IPW),LBIN,IPB,24)
+ CALL OFFSET(IPB,1,IPW,24,NBIT,ILENPS,IERR)
+C
+C********************************************************************
+C
+C Section 5 - END Section.
+C
+C********************************************************************
+C
+C
+C Add 7 7 7 7 to coded data.
+ IBLOCK(1) = 55
+ IBLOCK(2) = 55
+ IBLOCK(3) = 55
+ IBLOCK(4) = 55
+ CALL SBYTES(IPSCOD(IWORD),IBLOCK(1),IOFF,8,0,4)
+ CALL OFFSET(IOFF,4,IWORD,8,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C Set any unused part of last word to binary zeroes.
+ IF (IOFF.NE.0) THEN
+ KBITS = NBIT - IOFF
+ CALL SBYTE(IPSCOD(IWORD),IBLOCK(1),IOFF,KBITS)
+ ELSE
+ IWORD = IWORD - 1
+ ENDIF
+C
+C Round to 120 octets, if required.
+ IF (IROUND.EQ.1) THEN
+ NUMBIT = IWORD * NBIT
+ I = NUMBIT / 960
+ I = I * 960
+ I = NUMBIT - I
+ IF (I.NE.0) I = (960 - I) / NBIT
+ DO 1000 J=IWORD+1,IWORD+I
+ IPSCOD(J) = 0
+ 1000 CONTINUE
+C
+ IWORD = IWORD + I
+ ENDIF
+C
+C Check consistency of record name, parameter number and
+C record length.
+C
+C This may cause problems in the future if old
+C versions of the budget value records are unpacked
+C and then repacked.
+C
+C Diagnostic records can have different lengths.
+C
+ IF (NAME.EQ.'DIAG') GO TO 9999
+C
+ N = (NBIT * IWORD) / 8
+ KERR = 0
+ DO 1100 I=1,NTYPE
+ IF (VNAME(I).EQ.NAME) THEN
+ IF (N.NE.JLEN(I)) KERR = 1
+ IF (IB1PAR(5).NE.JPAR(I)) KERR = 1
+ IF (KERR.NE.0) THEN
+ WRITE(*,9013) N , IB1PAR(5)
+ 9013 FORMAT(1H ,'CODEPS: Illegal record length = ',I6,
+ X ' octets, or invalid parameter no. = ', I6,'.')
+C
+ IF( NOABORT .EQ. 0 ) CALL ABORT
+ ENDIF
+ GO TO 9999
+ ENDIF
+C
+ 1100 CONTINUE
+C
+ WRITE(*,*) 'CODEPS: Invalid record name supplied - ', NAME
+ IF( NOABORT .EQ. 0 ) CALL ABORT
+C
+C
+ 9999 RETURN
+ END
diff --git a/gribex/comars.h b/gribex/comars.h
new file mode 100755
index 0000000..af74213
--- /dev/null
+++ b/gribex/comars.h
@@ -0,0 +1,165 @@
+
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C
+C* MARS common areas containing job environment information,
+C parameter settings etc.
+C
+C NFTNOS - 12 Fortran unit numbers used by MARS.
+C NFTNOS(1) is MARSLOG file. Cracked MARS directives.
+C NFTNOS(2) is MARSPAR file. MARS directives in
+C network transmission format.
+C NFTNOS(5) is unit 5 , standard input.
+C NFTNOS(6) is unit 6 , standard output.
+C NFTNOS(7) is MARSDEF or MARSDEFNEXT, language
+C definition, operational or test.
+C Set by routine JENVXX.
+C NUMREQ - Total number of requests.
+C NUMFIL - Numbers of different files to be accessed.
+C NUMFIL(1) , Total number of files to accessed.
+C NUMFIL(2) , Number of IBM disk files to accessed.
+C NUMFIL(3) , Number of IBM MSS files to be accessed.
+C NUMFIL(4) , Number of IBM tape files to be accessed.
+C NUMFIL(5) , Number of worker machine files to accessed.
+C NCNDAY - Century day.
+C Set by routine JENVXX.
+C NJMODE - Mode in which MARS job is running.
+C -1, Quit issued.
+C 0 , Checkout directives only.
+C 1 , Connected mode (normal mode retains connection
+C with IBM at all times).
+C 2 , Disconnected mode (send requests to IBM and
+C terminate).
+C Not yet implemented.
+C NJOBSQ - Unique number identifying job or process.
+C Set by routine JENVXX.
+C NUMBIT - Number of bits in computer word.
+C Set by routine JENVXX.
+C NDBUGS - Debug print switch for IBM.
+C 0 , No debug printout. .
+C 8 , Debug print on IBM.
+C Set by routine JENVXX.
+C NDBUGL - Debug level indicator for worker machine.
+C 0 , No debug print.
+C 4 , Trace through subroutine sections and
+C values of parameters on entry as well as
+C other print statements used when actually
+C debugging.
+C Set by routine JENVXX.
+C NJBCAT - Category assigned to job by MARS.
+C 0 , Archive request.
+C 1 , Manage request.
+C 2 , Checkout request.
+C 3 , Costonly request.
+C 4 , Retrieval from online Operational database on the
+C worker machine.
+C 5 , Retrieve guaranteed online (on IBM ) data.
+C 6 , Retrieve online (on IBM ) data.
+C Not yet implemented. Treated as category 7.
+C 7 , Retrieve off-line (on IBM ) data.
+C 8 , Retrieval of research department data from
+C online Research database on worker machine.
+C NPRITY - Priority assigned to job by MARS.
+C 1 , High.
+C 2 , Normal.
+C 3 , Low.
+C NIAORB - 0 , Current job is an active mode job.
+C 1 , Current job is in interactive edit mode.
+C Set by routine JENVXX.
+C
+ INTEGER NFTNOS
+ INTEGER NCNDAY
+ INTEGER NJMODE
+ INTEGER NJOBSQ
+ INTEGER NUMBIT
+ INTEGER NDBUGS
+ INTEGER NDBUGL
+ INTEGER NJBCAT
+ INTEGER NPRITY
+ INTEGER NIAORB
+ INTEGER NFLTYP
+ INTEGER NUMFIL
+ INTEGER NUMREQ
+C
+ DIMENSION NFTNOS(12)
+ DIMENSION NUMFIL(5)
+C
+ COMMON /INTGCOM/ NFTNOS , NCNDAY , NJMODE , NJOBSQ , NUMBIT ,
+ C NDBUGS , NDBUGL , NJBCAT , NPRITY , NIAORB ,
+ C NFLTYP , NUMFIL , NUMREQ
+C
+C COPSYS - Name of computer operating system.
+C UNICOS
+C COS
+C NOS/VE
+C VMS
+C MVS/XA
+C Set by routine calling MARSXX.
+C CWMACH - Name of machine on which MARS is running.
+C IBM display uses only first three characters, so these
+C are made unique.
+C CRAY Cray XMP
+C Y16 Cray YMP 16
+C Y08 Cray YMP 8
+C Y04 Cray YMP 4
+C CYBER
+C VAX
+C IBM
+C Set by routine JENVXX.
+C CCDATE - Date at start of job in yymmdd format.
+C Set by routine JENVXX.
+C CCTIME - Time at start of job in hhmmss format.
+C Set by routine JENVXX.
+C CJNAME - Name of job or process.
+C Set by routine JENVXX.
+C CACCNT - Account under which job is running.
+C CWMARS - Connect to test or operational MARS/IBM.
+C MATS , Test version.
+C MARS , Operational version.
+C Set by routine JENVXX.
+C CWLANG - Use test or operational version of MARS language.
+C MARSDEF - Operational version.
+C MATSDEF - Test version.
+C Set by routine JENVCO for COS version.
+C CWLAPA - Use test or operational version of MARS language.
+C .../.../marsdef - Operational version.
+C .../.../matsdef - Test version.
+C Set by routine JENVUN for UNICOS version.
+C CWTMDR - Temporary file directory.
+C Set by JENVUN.
+C CWUSER - User name.
+C Set by JENVUN.
+C CUSFDB - FDB Usage indicator.
+C NEVER , Never attempt to access FDB.
+C ALWAYS, Always attempt to access FDB.
+C DEFAULT, Analyse request before deciding usage.
+C Set by JENVUN.
+C CWEDNO - GRIB Code Edition indicator.
+C OFF , use current edition.
+C ON , use edition 0.
+C
+ CHARACTER*8 COPSYS
+ CHARACTER*8 CWMACH
+ CHARACTER*3 CWUSER
+ CHARACTER*6 CCDATE
+ CHARACTER*6 CCTIME
+ CHARACTER*4 CWMARS
+ CHARACTER*7 CWLANG
+ CHARACTER*7 CUSFDB
+ CHARACTER*48 CWLAPA
+ CHARACTER*48 CWTMDR
+ CHARACTER*16 CJNAME
+ CHARACTER*16 CACCNT
+ CHARACTER*3 CWEDNO
+C
+ COMMON /CHARCOM/ COPSYS , CWMACH , CCDATE , CCTIME , CJNAME ,
+ C CACCNT , CWMARS , CWLANG , CWLAPA , CWTMDR ,
+ C CWUSER , CUSFDB , CWEDNO
+C
diff --git a/gribex/comcomm.h b/gribex/comcomm.h
new file mode 100755
index 0000000..c2d892f
--- /dev/null
+++ b/gribex/comcomm.h
@@ -0,0 +1,86 @@
+
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C
+C
+C Definition of network communications block used when
+C talking to MARS/IBM.
+C
+ PARAMETER (JPPHLN=80)
+ PARAMETER (JPSHLN=30)
+ PARAMETER (JPMXTR=99)
+ PARAMETER (JPALEN=400)
+ PARAMETER (JPCLEN=80)
+ PARAMETER (JPDLEN=1520)
+c---- PARAMETER (JPDLEN=960)
+ PARAMETER (JPMAXV=30)
+C
+ CHARACTER*(JPCLEN) YBLOCK
+ CHARACTER*(JPDLEN) YBUFF
+ CHARACTER*(JPDLEN) YTEMP
+C
+ CHARACTER*1 YSTATU
+ CHARACTER*1 YACTCL
+ CHARACTER*1 YACMOD
+ CHARACTER*1 YDEBUG
+ CHARACTER*1 YNOTRY
+ CHARACTER*5 YREQNO
+ CHARACTER*2 YHDRLN
+ CHARACTER*2 YNOHDR
+ CHARACTER*2 YNSHDR
+ CHARACTER*2 YSUBER
+ CHARACTER*2 YVERSN
+ CHARACTER*4 YUSEID
+ CHARACTER*4 YCOMID
+ CHARACTER*4 YREASN
+ CHARACTER*4 YRETCD
+ CHARACTER*5 YMESLN
+ CHARACTER*6 YSBTIM
+ CHARACTER*6 YSBDAT
+ CHARACTER*6 YRCTIM
+ CHARACTER*6 YJOBSQ
+ CHARACTER*7 YSENID
+ CHARACTER*7 YRECID
+ CHARACTER*7 YUSJOB
+ CHARACTER*8 YUSACC
+ CHARACTER*8 YACTON
+ CHARACTER*10 YINT
+ CHARACTER*10 YRESRV
+ CHARACTER*96 YNAMWK
+ CHARACTER*8 YFIDWK
+ CHARACTER*96 YNMIBM
+C
+ DIMENSION YBLOCK(JPALEN)
+C
+ EQUIVALENCE (YBLOCK(1)( 1:2 ) , YHDRLN)
+ EQUIVALENCE (YBLOCK(1)( 3:6 ) , YUSEID)
+ EQUIVALENCE (YBLOCK(1)( 7:10) , YCOMID)
+ EQUIVALENCE (YBLOCK(1)(11:17) , YSENID)
+ EQUIVALENCE (YBLOCK(1)(18:24) , YRECID)
+ EQUIVALENCE (YBLOCK(1)(25:30) , YSBDAT)
+ EQUIVALENCE (YBLOCK(1)(31:36) , YSBTIM)
+ EQUIVALENCE (YBLOCK(1)(37:42) , YJOBSQ)
+ EQUIVALENCE (YBLOCK(1)(43:48) , YRCTIM)
+ EQUIVALENCE (YBLOCK(1)(49:50) , YNOHDR)
+ EQUIVALENCE (YBLOCK(1)(51:52) , YNSHDR)
+ EQUIVALENCE (YBLOCK(1)(53:54) , YSUBER)
+ EQUIVALENCE (YBLOCK(1)(55:55) , YSTATU)
+ EQUIVALENCE (YBLOCK(1)(56:56) , YACTCL)
+ EQUIVALENCE (YBLOCK(1)(57:61) , YMESLN)
+ EQUIVALENCE (YBLOCK(1)(62:62) , YACMOD)
+ EQUIVALENCE (YBLOCK(1)(63:70) , YUSACC)
+ EQUIVALENCE (YBLOCK(1)(71:77) , YUSJOB)
+ EQUIVALENCE (YBLOCK(1)(78:78) , YDEBUG)
+ EQUIVALENCE (YBLOCK(1)(79:80) , YVERSN)
+C
+ EQUIVALENCE (YBLOCK(2)( 3:10) , YACTON)
+ EQUIVALENCE (YBLOCK(2)(21:24) , YRETCD)
+ EQUIVALENCE (YBLOCK(2)(25:28) , YREASN)
+C
diff --git a/gribex/comgrb.h b/gribex/comgrb.h
new file mode 100755
index 0000000..db68f40
--- /dev/null
+++ b/gribex/comgrb.h
@@ -0,0 +1,13 @@
+
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C* Common area to hold values used in GRIB encoding
+C and decoding.
+C
diff --git a/gribex/confp.F b/gribex/confp.F
new file mode 100755
index 0000000..795bd38
--- /dev/null
+++ b/gribex/confp.F
@@ -0,0 +1,96 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE CONFP (FVAL,IEXP,IMANT)
+C
+C
+C
+C
+C
+C---->
+C********************************************************************
+C*
+C* NAME : CONFP
+C*
+C* FUNCTION : CONVERT FLOATING POINT NUMBER FROM MACHINE
+C* REPRESENTATION TO GRIB REPRESENTATION.
+C*
+C* INPUT : FVAL - FLOATING POINT NUMBER TO BE CONVERTED.
+C*
+C* OUTPUT : IEXP - 8 BIT SIGNED EXPONENT
+C* IMANT - 24 BIT MANTISSA
+C* FVAL - UNCHANGED.
+C*
+C* JOHN HENNESSY , ECMWF , 15TH APRIL 1985
+C*
+C********************************************************************
+C----<
+C
+C
+ IF (FVAL.EQ.0.0)
+ C THEN
+ IEXP = 128
+ IMANT = 0
+ RETURN
+ ENDIF
+C
+C
+ EPS = 1.0E-12
+ REF = FVAL
+C
+C SIGN OF VALUE
+C
+ ISIGN = 0
+ IF (REF.LE.0.)
+ C THEN
+ ISIGN = 128
+ REF = - REF
+ ENDIF
+C
+C
+C
+C
+C
+C EXPONENT
+C
+ IF (REF.EQ.0.0)
+ C THEN
+ IEXP = 0
+ ELSE
+ IEXP = INT(ALOG(REF)*(1.0/ALOG(16.0))+64.0+1.0+EPS)
+ ENDIF
+C
+ IF (IEXP.LT.0 ) IEXP = 0
+ IF (IEXP.GT.127) IEXP = 127
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C MANTISSA
+C
+ IMANT = NINT (REF/16.0**(IEXP-70))
+C
+C ADD SIGN BIT TO EXPONENT.
+C
+ IEXP = IEXP + ISIGN
+C
+C
+C
+C
+ RETURN
+C
+ END
diff --git a/gribex/confp2.F b/gribex/confp2.F
new file mode 100755
index 0000000..141e5f9
--- /dev/null
+++ b/gribex/confp2.F
@@ -0,0 +1,186 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE CONFP2 (PVAL,KEXP,KMANT,KBITS)
+C
+C---->
+C**** CONFP2 - Convert floating point number to GRIb representation.
+C
+C Purpose.
+C --------
+C
+C Convert floating point number from machine
+C representation to GRIB representation.
+C
+C** Interface.
+C ----------
+C
+C CALL CONFP2 (PVAL,KEXP,KMANT,KBITS)
+C
+C INTEGER K.
+C REAL P.
+C LOGICAL O.
+C CHARACTER H.
+C
+C Input Parameters.
+C -----------------
+C
+C PVAL - Floating point number to be converted.
+C
+C KBITS - Number of bits in computer word.
+C
+C Output Parameters.
+C -----------------
+C
+C KEXP - 8 Bit signed exponent.
+C
+C KMANT - 24 Bit mantissa.
+C
+C Method.
+C -------
+C
+C Floating point number represented as 8 bit exponent
+C and 24 bit mantissa in integer values.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes re GRIB representation.
+C
+C Comments.
+C ---------
+C
+C Rewritten from CONFP, to include number of bits per
+C computer word, to unite slightly different versions of
+C CONFP.
+C
+C Routine contains sections 0 to 2 and section 9.
+C
+C Author.
+C -------
+C
+C John Hennessy ECMWF 19.03.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C -----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT LOGICAL ( L , O , G )
+ IMPLICIT CHARACTER*8 ( C , H , Y )
+ IMPLICIT INTEGER ( I , J , K , M , N )
+C
+C -----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Convert value of 0.0.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (PVAL.EQ.0.0)
+ C THEN
+ KEXP = 0
+ KMANT = 0
+ GO TO 900
+ ENDIF
+C
+C -----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Convert other values.
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ ZEPS = 1.0E-12
+ IF (KBITS.EQ.32) ZEPS = 1.0E-8
+ ZREF = PVAL
+C
+C Sign of value.
+C
+ ISIGN = 0
+ IF (ZREF.LT.0.)
+ C THEN
+ ISIGN = 128
+ ZREF = - ZREF
+ ENDIF
+C
+C Exponent.
+C
+ KEXP = INT(ALOG(ZREF)*(1.0/ALOG(16.0))+64.0+1.0+ZEPS)
+C
+ IF (KEXP.LT.0 ) KEXP = 0
+ IF (KEXP.GT.127) KEXP = 127
+C
+C Mantissa.
+C
+ KMANT = INT (ZREF/16.0**(KEXP-70))
+C
+C Add sign bit to exponent.
+C
+ KEXP = KEXP + ISIGN
+C
+C -----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/gribex/confp3.F b/gribex/confp3.F
new file mode 100755
index 0000000..66396bb
--- /dev/null
+++ b/gribex/confp3.F
@@ -0,0 +1,308 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CONFP3(PVAL,KEXP,KMANT,KBITS,KROUND)
+C
+C---->
+C**** CONFP3 - Convert floating point number to GRIB representation.
+C
+C Purpose.
+C --------
+C
+C Convert floating point number from machine
+C representation to GRIB representation.
+C
+C** Interface.
+C ----------
+C
+C CALL CONFP3(PVAL,KEXP,KMANT,KBITS,KROUND)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C PVAL - Floating point number to be converted.
+C KBITS - Number of bits in computer word.
+C KROUND - Conversion type.
+C 0 , Closest number in GRIB format less than
+C original number.
+C 1 , Closest number in GRIB format to the
+C original number (equal to, greater than or
+C less than original number).
+C 10 , as for 0 but with debug printout.
+C 11 , as for 1 but with debug printout.
+C
+C Output Parameters.
+C -----------------
+C
+C KEXP - 8 Bit signed exponent.
+C KMANT - 24 Bit mantissa.
+C
+C Method.
+C -------
+C
+C Floating point number represented as 8 bit signed
+C exponent and 24 bit mantissa in integer values.
+C
+C Externals.
+C ----------
+C
+C DECFP2
+C ABORTX
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes re GRIB representation.
+C
+C Comments.
+C ---------
+C
+C Routine aborts if an invalid conversion type parameter
+C is used or if a 24 bit mantissa is not produced.
+C
+C
+C Author.
+C -------
+C
+C John Hennessy ECMWF 18.06.91
+C
+C Modifications.
+C --------------
+C
+C John Hennessy ECMWF 24.09.91
+C Corrections made to descriptions of input parameter KROUND.
+C Changes to comments and format statements.
+C
+C J.D.Chambers ECMWF 13.09.94
+C Inhibit abort if NOABORT = 1, use grbcom.h
+C
+C
+C J.D.Chambers ECMWF 21.11.94
+C Use JNINT for VAX
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0 . Definition of variables. Set initial values.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+#include "grbcom.h"
+C
+C Subroutine arguments
+C
+ REAL PVAL
+ INTEGER KEXP,KMANT,KBITS,KROUND
+C
+C Local variables
+C
+ INTEGER IEXP, IPR, IROUND, ISIGN
+ REAL ZEPS, ZREF, ZVAL
+C
+C -----------------------------------------------------------------
+C* Section 1 . Initialise
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Debug print switch.
+C
+ IF( KROUND.GE.10) THEN
+ IPR = 1
+ IROUND = KROUND - 10
+ ELSE
+ IPR = 0
+ IROUND = KROUND
+ ENDIF
+C
+C Check conversion type parameter.
+C
+ IF( IROUND.NE.0.AND.IROUND.NE.1) THEN
+ WRITE(GRPRSM,*) 'CONFP3: Invalid conversion type = ', KROUND
+C
+ IF( NOABORT.EQ.0 ) CALL ABORTX('CONFP3')
+C
+C If not aborting, arbitrarily set rounding to 'up'.
+C
+ IROUND = 1
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 2 . Convert value of zero.
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF( PVAL.EQ.0.0 ) THEN
+ KEXP = 0
+ KMANT = 0
+ IEXP = 0
+ ISIGN = 0
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 3 . Convert other values.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ ZEPS = 1.0E-12
+ IF( KBITS.EQ.32) ZEPS = 1.0E-8
+ ZREF = PVAL
+C
+C Sign of value.
+C
+ ISIGN = 0
+ IF( ZREF.LT.0.) THEN
+ ISIGN = 128
+ ZREF = - ZREF
+ ENDIF
+C
+C Exponent.
+C
+#ifdef CRAY
+ IEXP = INT(ALOG(ZREF)*(1.0/ALOG(16.0))+64.0+1.0+ZEPS)
+#else
+ IEXP = INT(LOG(ZREF)*(1.0/LOG(16.0))+64.0+1.0+ZEPS)
+#endif
+C
+ IF( IEXP.LT.0 ) IEXP = 0
+ IF( IEXP.GT.127) IEXP = 127
+C
+C Mantissa.
+C
+ IF( IROUND.EQ.0 ) THEN
+C
+C Closest number in GRIB format less than original number.
+C Truncate for positive numbers.
+C Round up for negative numbers.
+C
+ IF( ISIGN.EQ.0 ) THEN
+ KMANT = INT(ZREF/16.0**(IEXP-70))
+ ELSE
+#ifdef VAX
+ KMANT = JNINT(ZREF/16.0**(IEXP-70)+0.5)
+#else
+ KMANT = NINT(ZREF/16.0**(IEXP-70)+0.5)
+#endif
+ ENDIF
+C
+ ELSE
+C
+C Closest number in GRIB format to the original number
+C (equal to, greater than or less than original number).
+C
+#ifdef VAX
+ KMANT = JNINT(ZREF/16.0**(IEXP-70))
+#else
+ KMANT = NINT(ZREF/16.0**(IEXP-70))
+#endif
+ ENDIF
+C
+C Check that mantissa value does not exceed 24 bits.
+C If it does, adjust the exponent upwards and recalculate
+C the mantissa.
+C (Nb. 16777215 = 2**24 - 1)
+C
+ IF( KMANT.GT.16777215) THEN
+C
+ 350 CONTINUE
+C
+ IEXP = IEXP + 1
+C
+C Check for exponent overflow during adjustment
+C
+ IF( IEXP.GT.127 ) THEN
+ WRITE(GRPRSM,*) 'CONFP3: Exponent overflow'
+ WRITE(GRPRSM,9002) PVAL
+ WRITE(GRPRSM,9003) ISIGN, IEXP, KMANT
+C
+ IF( NOABORT.EQ.0 ) CALL ABORTX('CONFP3')
+C
+C If not aborting, arbitrarily set value to zero
+C
+ WRITE(GRPRSM,*) 'CONFP3: Value arbitrarily set to zero.'
+ KEXP = 0
+ KMANT = 0
+ IEXP = 0
+ ISIGN = 0
+ GOTO 900
+C
+ ENDIF
+C
+ IF( IROUND.EQ.0) THEN
+C
+C Closest number in GRIB format less than original number.
+C Truncate for positive numbers.
+C Round up for negative numbers.
+C
+ IF( ISIGN.EQ.0 ) THEN
+ KMANT = INT(ZREF/16.0**(IEXP-70))
+ ELSE
+#ifdef VAX
+ KMANT = JNINT(ZREF/16.0**(IEXP-70)+0.5)
+#else
+ KMANT = NINT(ZREF/16.0**(IEXP-70)+0.5)
+#endif
+ ENDIF
+C
+ ELSE
+C
+C Closest number in GRIB format to the original number
+C (equal to, greater or less than original number).
+C
+#ifdef VAX
+ KMANT = JNINT(ZREF/16.0**(IEXP-70))
+#else
+ KMANT = NINT(ZREF/16.0**(IEXP-70))
+#endif
+ ENDIF
+C
+C Repeat calculation (with modified exponent) if still have
+C mantissa overflow.
+C
+ IF( KMANT.GT.16777215) GOTO 350
+C
+ ENDIF
+C
+C Add sign bit to exponent.
+C
+ KEXP = IEXP + ISIGN
+C
+C -----------------------------------------------------------------
+C* Section 9. Return
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+C Print generated values if required.
+C
+ IF( IPR.EQ.1 ) THEN
+ WRITE(GRPRSM,9006) KROUND
+ WRITE(GRPRSM,9002) PVAL
+ CALL DECFP2(ZVAL,KEXP,KMANT)
+ WRITE(GRPRSM,9007) ZVAL
+ WRITE(GRPRSM,9003) ISIGN, IEXP, KMANT
+ ENDIF
+C
+ RETURN
+C
+C
+ 9002 FORMAT(1H ,'CONFP3: Original number = ',F30.20)
+ 9003 FORMAT(1H ,'CONFP3: Sign = ',I3,', Exponent = ',I3,
+ X ', Mantissa = ',I12)
+ 9006 FORMAT(1H ,'CONFP3: Conversion type parameter = ',I4)
+ 9007 FORMAT(1H ,'CONFP3: Converted to ',F30.20)
+C
+ END
diff --git a/gribex/confpa.F b/gribex/confpa.F
new file mode 100755
index 0000000..30f7576
--- /dev/null
+++ b/gribex/confpa.F
@@ -0,0 +1,91 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CONFPA(FVAL,KLENFP,KOFF,KPACKED,KWORD,KLENPS,KBIT)
+C
+C---->
+C********************************************************************
+C*
+C* NAME : CONFPA
+C*
+C* FUNCTION : CONVERT FLOATING POINT NUMBER FROM MACHINE
+C* REPRESENTATION TO GRIB REPRESENTATION.
+C*
+C* INPUT : FVAL - FLOATING POINT NUMBERS TO BE CONVERTED.
+C* KLENFP : LENGTH OF FVAL
+C* : KOFF - OFFSET IN BITS TO FIRST PACKED FIELD IN KPACKED.
+C* KBIT : NUMBER OF BITS IN OUTPUT WORD
+C* KLENPS : LENGTH OF KPACKED
+C*
+C* OUTPUT : KPACKED : PACKED OUTPUT FIELD
+C*
+C* JOHN HENNESSY , ECMWF , 15TH APRIL 1985
+C* DAVID DENT , ECMWF , 18TH NOVEMBER 1997
+C*
+C* LIMITATION of this VECTOR version:
+C* assumes KOFF=0 and INTEGER word length is 32
+C*
+C********************************************************************
+C----<
+C
+ REAL FVAL(KLENFP)
+ INTEGER KPACKED(KLENPS)
+C
+ EPS = 1.0E-12
+ IOUT=1
+C
+C convert array of real numbers
+C
+ DO 210 JL=1,KLENFP
+ IF (FVAL(JL).EQ.0.0) THEN
+ JEXP = 128
+ JMANT = 0
+ ELSE
+C
+ REF = FVAL(JL)
+C
+C SIGN OF VALUE
+C
+ ISIGN = 0
+ IF (REF.LE.0.) THEN
+ ISIGN = 128
+ REF = - REF
+ ENDIF
+C
+C EXPONENT
+C
+ IF (REF.EQ.0.0) THEN
+ JEXP = 0
+ ELSE
+ JEXP = INT(ALOG(REF)*(1.0/ALOG(16.0))+64.0+1.0+EPS)
+ ENDIF
+C
+ IF (JEXP.LT.0 ) JEXP = 0
+ IF (JEXP.GT.127) JEXP = 127
+C
+C MANTISSA
+C
+ JMANT = NINT (REF/16.0**(JEXP-70))
+C
+C ADD SIGN BIT TO EXPONENT.
+C
+ JEXP = JEXP + ISIGN
+C
+ ENDIF
+C
+ KPACKED(IOUT)=IOR(ISHFT(JEXP,24),JMANT)
+ IOUT=IOUT+1
+ 210 CONTINUE
+C
+ KWORD=KWORD+(KLENFP*32/KBIT)
+C
+ RETURN
+C
+ END
diff --git a/gribex/csect4.F b/gribex/csect4.F
new file mode 100755
index 0000000..5493850
--- /dev/null
+++ b/gribex/csect4.F
@@ -0,0 +1,533 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+#if (defined IBM_POWER4)
+ at PROCESS ALIAS(NOPTEOVRLP)
+#endif
+ INTEGER FUNCTION CSECT4( PDATA, KTRUNC, KSEC1, KSEC4,
+ X KGRIB, KLENG, KNSPT, KBITS, KPACK)
+C
+C---->
+C**** CSECT4
+C
+C Purpose.
+C --------
+C
+C Code GRIB section 4 for complex packing of spherical harmonics.
+C
+C
+C** Interface.
+C ----------
+C
+C KRET = CSECT4( PDATA, KTRUNC, KSEC1, KSEC4,
+C X KGRIB, KLENG, KNSPT, KBITS, KPACK)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C PDATA - Array of floating point values.
+C KTRUNC - Truncation of the spherical harmonic coefficients.
+C KSEC1 - Array of GRIB section 1 values
+C KSEC4 - Array of GRIB section 4 values
+C KLENG - Length of GRIB product array
+C KNSPT - Bit pointer for next value in GRIB product
+C KBITS - Number of bits per computer word.
+C KPACK - Number of bits per packed value.
+C
+C
+C Output Parameters.
+C -----------------
+C
+C KGRIB - Array containing GRIB product.
+C KNSPT - Bit pointer for next value in GRIB product(updated)
+C
+C
+C Method.
+C -------
+C
+C <subset>|
+C
+C Given numbers: cccccccc|cccccc
+C cccccc|cccccc
+C cccc|cccccc
+C cc|cccccc
+C |cccccc
+C cccc
+C cc
+C
+C
+C Externals.
+C ----------
+C
+C GSCALE - Apply power sclaing to values to be packed.
+C PACKCF - Store unscaled coefficients in GRIB product.
+C CMPCK - Make the values to be packed contiguous in memory.
+C MAXMIN - Find max/min values of array.
+C INXBIT - Insert bits into GRIB product.
+C REF2GRB - Convert reference value to IBM floating point format.
+C CONFP3 - Convert to IBM floating point format.
+C DECFP - Decode from IBM floating point format.
+C CALCOP - Calculate the P scale factor for a field
+C JMALLOC - Routine to acquire memory
+C JFREE - Routine to release memory
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C On entry, KNSPT points to the first bit of section 4 in the GRIB
+C product.
+C On exit, KNSPT points to the first bit of section 5 in the GRIB
+C product.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 06:05:94
+C
+C
+C Modifications.
+C _____________
+C
+C J.Clochard, Meteo France, for ECMWF - January 1998.
+C Use of external JFREE instead of FREE.
+C
+C P.J.Towers ECMWF 18.07.02
+C Optimised for IBM Power4.
+C -Added @PROCESS ALIAS(NOPTEOVRLP) directive
+C -Replaced Nint(x) by Int(x+0.5)
+C -Replaced division by scale by multiplication by reciprocal
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JP15BIT, JP87SET, JPBYTES
+#ifdef REAL_8
+ PARAMETER (JPBYTES = 8)
+#else
+ PARAMETER (JPBYTES = 4)
+#endif
+ PARAMETER ( JP15BIT= 2**15 )
+C `---> 32768 = 8000(hex)
+ PARAMETER ( JP87SET= 192 )
+C `---> = C0(hex)
+C
+C Subroutine arguments
+C
+ INTEGER KTRUNC, KSEC1, KSEC4, KGRIB, KLENG, KNSPT, KBITS, KPACK
+ REAL PDATA
+ DIMENSION PDATA(*), KGRIB(*), KSEC1(*), KSEC4(*)
+C
+C Local variables.
+C
+ INTEGER J110,NREST,NLOOPS,ILOOP,LOOP,ILENF,IPOWER,ISUBSET,ISTATUS
+ INTEGER IRET, IRETA, IRETB, IEXP, IMANT, ITEMP
+ INTEGER INSPT1, INSPTA, INSPTB, ILEN, ISCALE, ISIGN
+ INTEGER ILEN4, INIL, IL, IFLAG, ISIZE
+C
+#ifndef USE_NO_POINTERS
+#ifdef POINTER_64
+ INTEGER*8 IPIVAL
+#endif
+ POINTER (IPIVAL, IVAL)
+ INTEGER IVAL(1)
+ SAVE IPIVAL, ISIZE
+#else
+ INTEGER IVAL(1000)
+#endif
+C
+ REAL ZCHANGE, ZMAX, ZREF, ZMIN, ZSCALE,ZRECIP
+#if defined(CRAY) || defined(IBM) || defined(CYBER) || defined(hpiaR32)
+ REAL ZS
+#else
+ DOUBLE PRECISION ZS
+#endif
+C
+#include "grbcom.h"
+C
+C Externals
+C
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+ INTEGER PACKCF, GSCALE, CALCOP, REF2GRB
+ EXTERNAL PACKCF, GSCALE, CALCOP, REF2GRB, JMALLOC
+C
+ DATA ISIZE/0/
+C
+C -----------------------------------------------------------------
+C* Section 1 . Change units of data values , if required.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ CSECT4 = 0
+#ifndef USE_NO_POINTERS
+C
+C Allocate memory (first time only)
+C
+ IF( ISIZE.LT.((KTRUNC+1)*(KTRUNC+2)*JPBYTES) ) THEN
+ IF( ISIZE.NE.0 ) CALL JFREE(IPIVAL)
+ ISIZE = (KTRUNC+1)*(KTRUNC+2)*JPBYTES
+ IPIVAL = JMALLOC(ISIZE)
+#ifdef hpR64
+ IPIVAL = IPIVAL/(1024*1024*1024*4)
+#endif
+ IF( IPIVAL.EQ.0 ) THEN
+ WRITE(GRPRSM,*) 'CSECT4: Memory allocation failed.'
+ WRITE(GRPRSM,*) 'CSECT4: Number of bytes required = ', ISIZE
+ CSECT4 = 16112
+ GOTO 900
+ ENDIF
+ ENDIF
+#endif
+C
+C Preserve bit position of start of section 4.
+ INSPT1 = KNSPT
+C
+C Apply decimal scaling if required.
+ IF (KSEC1(23).NE.0) THEN
+ ZCHANGE = 10.0**KSEC1(23)
+ ILENF = (KTRUNC+1) * (KTRUNC+2)
+ DO 110 J110 = 1 , ILENF
+ PDATA(J110) = PDATA(J110) * ZCHANGE
+ 110 CONTINUE
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 2. Check given truncations.
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ ISUBSET = KSEC4(18)
+ IF ( ISUBSET .GT. KTRUNC ) THEN
+ WRITE(GRPRSM,*) 'CSECT4: Invalid subset truncation given'
+ WRITE(GRPRSM,*) 'CSECT4: ISUBSET, KTRUNC =', ISUBSET, KTRUNC
+ CSECT4 = 16000
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 3 . Apply power scaling to field.
+C -----------------------------------------------------------------
+
+ 300 CONTINUE
+C
+C If user supplied the P factor, use it ..
+ IF ( NONOFF .EQ. 0 ) THEN
+ IPOWER = KSEC4(17)
+C
+C .. otherwise calculate the P factor for the field ..
+ ELSE
+ IPOWER = CALCOP( PDATA, KTRUNC, ISUBSET)
+ IF( IPOWER.LT.-10000 ) THEN
+ CSECT4 = 16001
+ GOTO 900
+ ENDIF
+ KSEC4(17) = IPOWER
+ ENDIF
+C .. and scale the field.
+ IRET = GSCALE( PDATA, KTRUNC, ISUBSET, IPOWER, 'I')
+ IF ( IRET .NE. 0 ) THEN
+ CSECT4 = 16002
+ GOTO 900
+ ENDIF
+C
+C
+C -----------------------------------------------------------------
+C* Section 4 . Store subset of coefficients (IBM style).
+C -----------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+C Adjust pointer to avoid first 18 octets -> filled in later.
+ INSPTA = KNSPT
+ KNSPT = KNSPT + 18*8
+ IRET = PACKCF( PDATA,KTRUNC,ISUBSET,KGRIB,KLENG,KNSPT,KBITS)
+ IF ( IRET .NE. 0 ) THEN
+ CSECT4 = 16003
+ GOTO 900
+ ENDIF
+C
+C Reset bit pointer to start of section 4.
+ INSPTB = KNSPT
+ KNSPT = INSPTA
+C
+C -----------------------------------------------------------------
+C* Section 5 . Find the max and min for the values to be scaled.
+C -----------------------------------------------------------------
+C
+ 500 CONTINUE
+C
+C Rearrange the values to be packed so they are contiguous.
+ CALL CMPCK( PDATA, KTRUNC, ISUBSET)
+C
+C Find the max and min for the contiguous values
+ ILEN = (KTRUNC+1)*(KTRUNC+2) - (ISUBSET+1)*(ISUBSET+2)
+ CALL MAXMIN( PDATA, ILEN, ZMAX, ZMIN)
+C
+C Calculate the scale and reference value
+ ZREF = ZMIN
+ ZS = (ZMAX-ZREF) / (2**(KSEC4(2)+1)-1)
+#ifdef CRAY
+ IF (ZS.NE.0.0) ZS = ALOG(ZS) / ALOG(2.0) + 2.0
+#else
+ IF (ZS.NE.0.0) ZS = LOG(ZS) / LOG(2.0) + 2.0
+#endif
+#if defined hpR32 || defined (__alpha) || defined hpR64 || defined hpiaR64
+ ISCALE = MIN (INT(ZS),INT(ZS+DSIGN(1.0D0,ZS)))
+#elif defined linux
+ ISCALE = MIN (INT(ZS),INT(ZS+SIGN(1.D0,ZS)))
+#else
+ ISCALE = MIN (INT(ZS),INT(ZS+SIGN(1.,ZS)))
+#endif
+ ZSCALE = 2.0**ISCALE
+C
+C Set scale factor sign bit.
+ IF (ISCALE.LT.0) THEN
+ ISCALE = -ISCALE
+ ISIGN = JP15BIT
+ ISCALE = ISCALE + ISIGN
+ ENDIF
+C
+C* Octets 5 - 6 : Scale factor.
+C One 16 bit field.
+C
+C Adjust bit pointer over first 4 octets and insert scale factor.
+ KNSPT = KNSPT + 4*8
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ISCALE,1,KBITS, 16,'C',IRET)
+ IF (IRET.NE.0) THEN
+ WRITE(GRPRSM,*) 'CSECT4: Problem packing scale factor.'
+ CSECT4 = 16004
+ GO TO 900
+ ENDIF
+C
+C* Octets 7 - 10 : Reference value.
+C One 8 bit and one 24 bit field.
+C
+C Convert floating point to GRIB representation.
+ ISTATUS = REF2GRB(ZREF, IEXP, IMANT, KBITS)
+ IF( ISTATUS.NE.0 ) THEN
+ WRITE(GRPRSM,*) 'CSECT4: REF2GRB reference value problem'
+ WRITE(GRPRSM,*) 'CSECT4: for parameter ', KSEC1(6)
+ WRITE(GRPRSM,*) 'CSECT4: level type ', KSEC1(7)
+ WRITE(GRPRSM,*) 'CSECT4: level ', KSEC1(8), KSEC1(9)
+ ENDIF
+C
+C Insert reference value exponent and mantissa.
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IEXP,1,KBITS, 8,'C',IRETA)
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IMANT,1,KBITS, 24,'C',IRETB)
+ IRET = IRETA + IRETB
+ IF (IRET.NE.0) THEN
+ WRITE(GRPRSM,*) 'CSECT4: Problem packing reference value.'
+ CSECT4 = 16005
+ GO TO 900
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 6 . Store octets 11 to 18.
+C -----------------------------------------------------------------
+C
+ 600 CONTINUE
+C
+C* Octet 11 : Number of bits containing each packed value.
+C One 8 bit field.
+C
+C Insert number of bits for each packed value.
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC4(2),1,KBITS, 8,'C',IRET)
+ IF (IRET.NE.0) THEN
+ WRITE(GRPRSM,*) 'CSECT4: Problem packing number of bits/value.'
+ CSECT4 = 16006
+ GO TO 900
+ ENDIF
+C
+C Octets 12 - 13: Octet number of the start of packed data
+C One 16-bit field.
+C
+C Insert octet number of the start of packed data.
+ KSEC4(16) = KNSPT/8 + 7 + 4*(ISUBSET+1)*(ISUBSET+2)
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC4(16),1,KBITS,16,'C',IRET)
+ IF (IRET.NE.0) THEN
+ WRITE(GRPRSM,*) 'CSECT4: Problem packing start of packed data.'
+ CSECT4 = 16007
+ GO TO 900
+ ENDIF
+C
+C Octets 14 - 15: Scaling factor; power of Laplacian operator
+C applied to field before packing.
+C One 16-bit field.
+C
+C Set sign bit if value is negative.
+ IF (KSEC4(17).LT.0) THEN
+ ITEMP = - KSEC4(17)
+ ITEMP = ITEMP + JP15BIT
+ ELSE
+ ITEMP = KSEC4(17)
+ ENDIF
+C
+C Insert scaling power.
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ITEMP,1,KBITS,16,'C',IRET)
+ IF (IRET.NE.0) THEN
+ WRITE(GRPRSM,*) 'CSECT4: Problem packing scaling power.'
+ CSECT4 = 16008
+ GO TO 900
+ ENDIF
+C
+C Octets 16 - 18: Pentagonal resolution parameters J,K,M
+C specifying truncation of subset of data
+C represented unpacked.
+C Three 8-bit fields.
+C
+C Insert pentagonal resolution parameters.
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC4(18),3,KBITS, 8,'C',IRET)
+ IF (IRET.NE.0) THEN
+ WRITE(GRPRSM,*)
+ X 'CSECT4: Problem packing pentagonal resolution params.'
+ CSECT4 = 16009
+ GO TO 900
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 7 . Adjust, scale and pack the binary values.
+C -----------------------------------------------------------------
+C
+ 700 CONTINUE
+#ifndef USE_NO_POINTERS
+ ZRECIP=1.0/ZSCALE
+C
+ DO LOOP = 1 , ILEN
+#ifdef VAX
+ IVAL(LOOP) = JNINT( (PDATA(LOOP) - ZREF) / ZSCALE )
+#else
+ IVAL(LOOP) = INT( (PDATA(LOOP) - ZREF ) * ZRECIP + 0.5 )
+#endif
+ ENDDO
+C
+C Adjust bit pointer to end of stored subset of coefficients and
+C store packed binary values in GRIB product -> updates bit pointer.
+C
+ KNSPT = INSPTB
+ CALL INXBIT (KGRIB,KLENG,KNSPT,IVAL,ILEN, KBITS,KPACK, 'C',IRET)
+ IF ( IRET .NE. 0 ) THEN
+ WRITE(GRPRSM,*) 'CSECT4: Problem packing bits'
+ CSECT4 = 16010
+ GOTO 900
+ ENDIF
+#else
+ NLOOPS = ILEN / 1000
+ NREST = ILEN - (NLOOPS)*1000
+ KNSPT = INSPTB
+C
+ DO ILOOP = 1, NLOOPS
+ DO LOOP = 1 , 1000
+#ifdef VAX
+ IVAL(LOOP) = JNINT((PDATA((ILOOP-1)*1000+LOOP)-ZREF)/ZSCALE)
+#else
+ IVAL(LOOP) = NINT((PDATA((ILOOP-1)*1000+LOOP)-ZREF)/ZSCALE)
+#endif
+ ENDDO
+C
+C Adjust bit pointer to end of stored subset of coefficients and
+C store packed binary values in GRIB product -> updates bit pointer.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IVAL,1000,KBITS,KPACK,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(GRPRSM,*) 'CSECT4: Problem packing bits'
+ CSECT4 = 16010
+ GOTO 900
+ ENDIF
+ ENDDO
+C
+ DO LOOP = 1, NREST
+#ifdef VAX
+ IVAL(LOOP) = JNINT((PDATA((NLOOPS*1000)+LOOP)-ZREF)/ZSCALE)
+#else
+ IVAL(LOOP) = NINT((PDATA((NLOOPS*1000)+LOOP)-ZREF)/ZSCALE)
+#endif
+ ENDDO
+C
+C Adjust bit pointer to end of stored subset of coefficients and
+C store packed binary values in GRIB product -> updates bit pointer.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,IVAL,NREST,KBITS,KPACK,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(GRPRSM,*) 'CSECT4: Problem packing bits'
+ CSECT4 = 16010
+ GOTO 900
+ ENDIF
+#endif
+C
+C -----------------------------------------------------------------
+C* Section 8 . Fill in first 4 octets of section 4.
+C -----------------------------------------------------------------
+C
+ 800 CONTINUE
+C
+C Adjust length of section 4 (in bits) to a multiple of 16.
+ ILEN4 = KNSPT - INSPT1
+ IL = ILEN4 / 16
+ IL = ILEN4 - ( IL * 16 )
+ INIL = 0
+ IF (IL.NE.0) INIL = 16 - IL
+ KNSPT = KNSPT + INIL
+ ILEN4 = ILEN4 + INIL
+C
+C Set length of section 4 to octets.
+ ILEN4 = ILEN4 / 8
+C
+C Octets 1 - 3: Length of section.
+C One 24-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT1,ILEN4,1,KBITS,24,'C',IRET)
+ IF (IRET.NE.0) THEN
+ WRITE(GRPRSM,*) 'CSECT4: Problem packing length of section.'
+ CSECT4 = 16010
+ GO TO 900
+ ENDIF
+C
+C Octet 4:
+C One 4-bit field -> flag, spherical harmonics/complex/float point
+C One 4-bit field -> number of unused bits at end of section 4.
+C
+ IFLAG = JP87SET + INIL
+ CALL INXBIT(KGRIB,KLENG,INSPT1,IFLAG,1,KBITS,8,'C',IRET)
+ IF (IRET.NE.0) THEN
+ WRITE(GRPRSM,*) 'CSECT4: Problem packing flag.'
+ CSECT4 = 16011
+ GO TO 900
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/csgnbt.F b/gribex/csgnbt.F
new file mode 100755
index 0000000..1fb7152
--- /dev/null
+++ b/gribex/csgnbt.F
@@ -0,0 +1,63 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CSGNBT( KOUT, KIN, KPOS, KRET)
+C---->
+C
+C Set the sign bit in position KPOS of word KOUT, and
+C set the rest of bits (KPOS-1) -> using +ve value of
+C KIN.
+C
+C On return, KRET = 0 if all OK.
+C
+C----<
+ IMPLICIT NONE
+ INTEGER KOUT, KIN, KPOS, KRET
+
+ INTEGER JPBITS
+#ifdef INTEGER_8
+ PARAMETER ( JPBITS = 64 )
+#else
+ PARAMETER ( JPBITS = 32 )
+#endif
+ INTEGER ISBIT, IVALUE, INSPT, IRETA, IRETB
+
+ IF ( KIN .LT. 0 ) THEN
+ IVALUE = -KIN
+ ISBIT = 1
+ ELSE
+ IVALUE = KIN
+ ISBIT = 0
+ ENDIF
+
+#if defined (VAX) || defined (__alpha)
+C
+C VAX bit handling with VAX specific intrinsics
+ KOUT = JISHFT( ISBIT, KPOS-1)
+ KOUT = KOUT + IVALUE
+#else
+C
+C Bit handling using INXBIT
+ INSPT = 0
+ CALL INXBIT( KOUT, 1, INSPT, ISBIT, 1, JPBITS,
+ X (JPBITS-KPOS+1), 'C', IRETA)
+ CALL INXBIT( KOUT, 1, INSPT, IVALUE, 1, JPBITS,
+ X (KPOS-1), 'C', IRETB)
+ KRET = IRETA+IRETB
+ IF ( KRET .NE. 0 ) THEN
+ WRITE(*,*) ' CSGNBT - Problem packing bits in value'
+ GOTO 900
+ ENDIF
+#endif
+
+ 900 CONTINUE
+
+ RETURN
+ END
diff --git a/gribex/csgnbt.c b/gribex/csgnbt.c
new file mode 100755
index 0000000..0e36815
--- /dev/null
+++ b/gribex/csgnbt.c
@@ -0,0 +1,40 @@
+/**
+* Copyright 1981-2012 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 "fortint.h"
+
+void csgnbt_(
+ fortint * kout,
+ fortint * kin,
+ fortint * kpos,
+ fortint * kret) {
+
+fortint value = *kin;
+unsigned fortint sign = (value < 0 ) ? (1 << ((*kpos)-1)) : 0;
+unsigned fortint mask = ~(-1 << ((*kpos)-1));
+
+ if( value < 0 )
+ *kout = ((-value) & mask) | sign;
+ else
+ *kout = (value & mask);
+
+ *kret = 0;
+ return;
+}
+
+void csgnbt(
+ fortint * kout,
+ fortint * kin,
+ fortint * kpos,
+ fortint * kret) {
+
+ csgnbt_(kout,kin,kpos,kret);
+}
diff --git a/gribex/d2ordr.F b/gribex/d2ordr.F
new file mode 100755
index 0000000..dbf2728
--- /dev/null
+++ b/gribex/d2ordr.F
@@ -0,0 +1,1760 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION D2ORDR ( KDATA, KLENP, KSEC1, KSEC2, KSEC3,
+ X KSEC4, KGRIB, KLENG, KNSPT, KBITS,
+ X HOPER, KLEN4, KNIL, PREF , PSCALE,
+ X KBMAP, KVALS, KDEBUG )
+C
+C---->
+C**** D2ORDR
+C
+C Purpose.
+C --------
+C
+C Decode GRIB section 4 for complex packing of grid-point
+C values ("second-order packing").
+C
+C
+C** Interface.
+C ----------
+C
+C KRET = D2ORDR ( KDATA, KLENP, KSEC1, KSEC2, KSEC3, KSEC4,
+C X KGRIB, KLENG, KNSPT, KBITS, HOPER, KLEN4,
+C X KNIL, PREF, PSCALE, KBMAP, KVALS, KDEBUG )
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KLENP - Length of array KDATA.
+C KSEC1 - Array of GRIB section 1 integer descriptors.
+C KSEC2 - Array of GRIB section 2 integer descriptors.
+C KSEC3 - Array of GRIB section 3 integer descriptors.
+C KSEC4 - Array of GRIB section 4 integer descriptors.
+C (preset to zero, and already decoded for (3:6)
+C KGRIB - GRIB product array.
+C KLENG - Length of GRIB product array.
+C KNSPT - Bit pointer for next value in GRIB product.
+C KBITS - Number of bits per computer word.
+C HOPER - Requested function:
+C 'D' or 'R' to decode the whole field,
+C 'X' to decode only a few gridpoints (as described
+C in KSEC4(34:42),
+C 'J' to decode only section 4 descriptors.
+C KLEN4 - Length (octets) of section 4.
+C KNIL - Unused bit count at end of section 4.
+C KBMAP - Bit pointer for start of explicit primary bit-map
+C (if any).
+C KVALS - Number of bits in primary bit-map.
+C KDEBUG - >0 for some debug printout.
+C
+C
+C Output Parameters.
+C -----------------
+C
+C KDATA - Array of normalized values.
+C KSEC4 - Array of GRIB section 4 values (completed).
+C KGRIB - Array containing GRIB product.
+C KNSPT - Bit pointer for next value in GRIB product (updated).
+C PREF - Reference value of field.
+C PSCALE - Scale factor (ready to use) of field.
+C
+C
+C Method.
+C -------
+C
+C Follows WMO Manual of Codes, and also DSECT4 structure.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT - Extract bits from GRIB product.
+C DECFP2 - Decode from IBM floating point format.
+C PRTBIN - Print binary value in character format.
+C C2BITW - Computes bit width of a positive integer value.
+C DSGNBT - Decodes an integer value and its sign bit.
+C MAXMNI - Computes extrema of integer array.
+C D2ROSD - Rebuild original values from spatial differencing.
+C REVERO - Reverse order of values in even rank rows.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C On entry, KNSPT points to the first bit of section 4
+C in the GRIB product.
+C On exit, KNSPT points to the first unused bit of section 4,
+C (or to the first bit of section 5, if unused bit count
+C is zero) in the GRIB product.
+C
+C
+C Author.
+C -------
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C
+C
+C Modifications.
+C _____________
+C
+C J. Clochard, April 1998.
+C Update comments, and add more consistency with C2ORDR source code.
+C Inhibit REVERO call for function 'X'.
+C Introduce spatial differencing.
+C
+C J. Clochard, September 1998.
+C Optimize management of primary bit-map in row by row packing case.
+C Fixes behaviour for HOPER='J' (KDATA must not be used)
+C and HOPER='X' (KDATA minimum length is KSEC4(34), not full-length.
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JP15BIT, JP16SET, JPWS1O, JPXMAX, JPXPWR, JPWS2O
+C
+ PARAMETER ( JP15BIT= 2**15 )
+C `---> 32768 = 8000(hex)
+ PARAMETER ( JP16SET= 2**16-1 )
+C `---> 65535 = FFFF(hex)
+C JPWS1O ===> Size of group work arrays.
+C JPXMAX ===> Maximum number of points for 'X' function.
+C JPXPWR ===> " " " bits number per value/descriptor.
+C JPWS2O ===> Size of work array IWORK2
+C (must be strictly bigger than JPWS1O).
+C
+C IWORK2 array is used to unpack:
+C -group sizes, in case of general extended packing
+C (JPWS1O last values);
+C -secondary bit-map, if any;
+C -primary bit-map, in case of row by row packing.
+C
+C These cases are exclusive.
+C
+#ifdef JBPW_64
+ PARAMETER ( JPWS1O= 5000, JPWS2O= 20000, JPXMAX= 4, JPXPWR= 47 )
+#else
+ PARAMETER ( JPWS1O= 5000, JPWS2O= 20000, JPXMAX= 4, JPXPWR= 31 )
+#endif
+C
+C Subroutine arguments
+C
+ INTEGER KLENP, KLENG, KNSPT, KBITS, KLEN4, KNIL, KBMAP, KVALS
+ INTEGER KDEBUG
+ INTEGER KDATA (KLENP), KSEC1 (*), KSEC2 (*), KSEC4 (*), KGRIB (*)
+ INTEGER KSEC3 (*)
+C
+ CHARACTER HOPER * (*)
+C
+ REAL PREF, PSCALE
+C
+C Local variables.
+C
+ INTEGER IRET, IRETA, IRETB, IEXP, IMANT, IFLAGX, IAUXIL, INDKS4
+ INTEGER IFIROV, ISECOV, ISCALE, IPTRSO, ILEN, INROWS, J, IRETFN
+ INTEGER IPTRFO, IWIDTH, IPTRBM, ILAUXS, IPTRB0, ILNGTH, IRANG
+ INTEGER IBITGW, IAUXIS, INBSEQ, JSEQ, IGROFF, IGRNBR, JGROUP
+ INTEGER IREFLN, ICOUNT, IMAXVN, INPEXT, INCR, IEXTOR, IVALS
+ INTEGER ISKIP, JEXT, IEXT, ICNEXT, INSPTA, IPTRGW, INVALS, ICOUNG
+ INTEGER INDROW, INDCOL, IVALSC, IPTRFN, IPTRSN, IVALK4, IREFER
+ INTEGER IPRWID, ICOUNS, ILNGTS, INDEXX, INDEXY, JROW, ISEQ
+#ifdef ebug2o
+ INTEGER IMAXVC
+#endif
+ INTEGER IBITGS, IPTRGS, IORDER, IWIDSD, IBIAS
+#ifndef wmogrp2o
+ INTEGER IEXTRA
+#endif
+C
+ INTEGER IWIDGR (JPWS1O), IWORK2 (JPWS2O), IFIRST (JPWS1O)
+ INTEGER IRGEXT (JPXMAX+1), INDXOR (JPXMAX), ILENGR (JPWS1O)
+ INTEGER IPOWER (0:JPXPWR)
+ INTEGER IWORK (3)
+C
+ CHARACTER YOPER*1
+C
+ LOGICAL LROW, LQUASI, LCTWID, LSECBI, LPRIBI, LDEBUG, L1CALL
+ LOGICAL LGENXT, LBOUST, LPRCLN, LVECTD
+C
+ INTEGER REVERO, D2ROSD
+ EXTERNAL REVERO, D2ROSD
+ INTEGER C2BITW
+ EXTERNAL C2BITW
+C
+ SAVE L1CALL, IPOWER
+C
+ DATA L1CALL / .TRUE. /
+C
+C -----------------------------------------------------------------
+C* Section 1 . Decode octets 5 to 13.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IRETFN = 0
+ YOPER='D'
+ INSPTA=KNSPT
+ LDEBUG=KDEBUG.GE.1
+C
+ IF (L1CALL) THEN
+C
+ DO 111 J=0,JPXPWR-1
+ IPOWER(J)=2**J-1
+ 111 CONTINUE
+#ifdef JBPW_64
+ IPOWER(JPXPWR)=140737488355327
+#else
+ IPOWER(JPXPWR)=2147483647
+#endif
+C
+ L1CALL=.FALSE.
+C
+ ENDIF
+C
+#ifndef ebug2o
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9100) HOPER(:1),KNSPT
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ KNSPT=KNSPT+4*8
+C
+C* Octets 5 - 6 : Scale factor.
+C One 16 bit field.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,ISCALE,1,KBITS, 16,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17110
+ WRITE(GRPRSM,FMT=9001) 'scale factor'
+ GO TO 900
+ ENDIF
+C
+C Make negative if sign bit set
+ IF ( ISCALE .GT. JP15BIT ) THEN
+ ISCALE = ISCALE - JP15BIT
+ ISCALE = -ISCALE
+ ENDIF
+ PSCALE = 2.0**ISCALE
+#ifdef ebug2o
+ WRITE(GRPRSM,FMT='('' D2ORDR - Binary scale factor ='',
+ X I20,TR1,F30.20,''.'')') ISCALE,PSCALE
+#endif
+C
+C* Octets 7 - 10 : Reference value.
+C One 8 bit and one 24 bit field.
+C
+C Extract reference value exponent and mantissa.
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IEXP,1,KBITS, 8,YOPER,IRETA)
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IMANT,1,KBITS, 24,YOPER,IRETB)
+ IRET = IRETA + IRETB
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17120
+ WRITE(GRPRSM,FMT=9001) 'reference value'
+ GO TO 900
+ ENDIF
+C
+C Decode the reference value
+ CALL DECFP2 (PREF,IEXP,IMANT)
+C
+C* Octet 11 : Number of bits containing each first-order value.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC4(2),1,KBITS, 8,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17130
+ WRITE(GRPRSM,FMT=9001) 'bit number of first-order values'
+ GO TO 900
+ ELSEIF (KSEC4(2).GT.JPXPWR) THEN
+ IRETFN = 17131
+ WRITE(GRPRSM,FMT=9002) 'Bit number (of first-order values)',
+ X JPXPWR
+ GO TO 900
+#ifdef ebug2o
+ ELSE
+#else
+ ELSEIF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9135) KSEC4(2)
+ ENDIF
+C
+C Octets 12 - 13: Octet number of the start of first-order packed
+C data.
+C One 16-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IPTRFO,1,KBITS,16,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17140
+ WRITE(GRPRSM,FMT=9001) 'pointer to first-order packed data'
+ GO TO 900
+#ifdef ebug2o
+ ELSE
+#else
+ ELSEIF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9150) PREF, IPTRFO, KNSPT
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 2 . Decode octets 14 to 21.
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Octet 14: Extended flags.
+C One 8-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IFLAGX,1,KBITS, 8,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17210
+ WRITE(GRPRSM,FMT=9001) 'extended flags'
+ GO TO 900
+#ifdef ebug2o
+ ELSE
+#else
+ ELSEIF (LDEBUG) THEN
+#endif
+ CALL PRTBIN (IFLAGX,8,IAUXIL,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IAUXIL=IFLAGX
+ ENDIF
+C
+ WRITE(GRPRSM,FMT=9210) IAUXIL, KNSPT
+ ENDIF
+C
+C R------- only bit 1 is reserved.
+C -0------ single datum at each grid point.
+C -1------ matrix of values at each grid point.
+C --0----- no secondary bit map.
+C --1----- secondary bit map present.
+C ---0---- second order values have constant width.
+C ---1---- second order values have different widths.
+C ----0--- no general extended second order packing.
+C ----1--- general extended second order packing used.
+C -----0-- standard field ordering in section 4.
+C -----1-- boustrophedonic ordering in section 4.
+C ------00 no spatial differencing used.
+C ------01 1st-order spatial differencing used.
+C ------10 2nd-order " " " .
+C ------11 3rd-order " " " .
+C
+ IF (IFLAGX.GE.128) THEN
+ IRETFN = 17220
+ WRITE(GRPRSM,FMT=9220)
+ GO TO 900
+ ENDIF
+C
+ IAUXIL = 64
+ INDKS4 = 6
+C
+ IVALK4 = 8
+C
+ DO 201 J = 2, IVALK4
+C
+ IF (J.EQ.5) THEN
+ INDKS4 = INDKS4 + 1
+ ENDIF
+C
+ IF (IFLAGX.GE.IAUXIL) THEN
+ KSEC4(INDKS4+J) = IAUXIL
+ IFLAGX = IFLAGX - IAUXIL
+ ENDIF
+C
+ IAUXIL=IAUXIL/2
+ 201 CONTINUE
+C
+#ifndef ebug2o
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9225) (KSEC4(J),J=3,10)
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ IF (IFLAGX.NE.0) THEN
+ IRETFN = 17230
+ WRITE(GRPRSM,FMT=9230)
+ GO TO 900
+ ELSEIF (KSEC4(8).NE.0) THEN
+ IRETFN = 17240
+ WRITE(GRPRSM,FMT=9240)
+ GO TO 900
+ ENDIF
+C
+ LPRIBI=MOD (KSEC1(5),128).GE.64
+ LSECBI=KSEC4(9).NE.0
+ LROW=.NOT.LSECBI.AND.KSEC4(12).EQ.0
+ LGENXT=.NOT.LSECBI.AND.KSEC4(12).NE.0
+ LBOUST=KSEC4(13).NE.0
+ IORDER=KSEC4(14)+KSEC4(15)
+C
+ IF (IORDER.NE.0) THEN
+C
+ IF (HOPER.EQ.'X') THEN
+ IRETFN = 17244
+ WRITE(GRPRSM,FMT=9244) HOPER(:1)
+ GO TO 900
+ ELSEIF (.NOT.LGENXT) THEN
+ IRETFN = 17245
+ WRITE(GRPRSM,FMT=9245)
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ LQUASI=KSEC2(17).EQ.1
+ LCTWID=KSEC4(10).EQ.0
+C
+C Octets 15 - 20: Octet number of the start of second-order packed
+C data, Number of first-order packed data,
+C Number of second-order packed data.
+C Three 16-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC4(17),3,KBITS,16,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17250
+ WRITE(GRPRSM,FMT=9001) 'standard second-order descriptors'
+ GO TO 900
+ ENDIF
+C
+ IPTRSO=KSEC4(17)
+ IFIROV=KSEC4(18)
+ ISECOV=KSEC4(19)
+C
+#ifndef wmogrp2o
+C Octet 21: Reserved by WMO, so should be zero in standard case.
+C Could be used for extra bits of group number.
+C One 8-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IEXTRA,1,KBITS, 8,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17255
+ WRITE(GRPRSM,FMT=9001) '21st octet of section 4'
+ GO TO 900
+ ELSEIF (IEXTRA.NE.0) THEN
+ IFIROV=IFIROV+(JP16SET+1)*IEXTRA
+ CALL PRTBIN (IEXTRA,8,IAUXIL,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IAUXIL=IEXTRA
+ ENDIF
+C
+ WRITE(GRPRSM,FMT=9255) IAUXIL, IEXTRA, IFIROV
+ ENDIF
+C
+ KSEC4(18)=IFIROV
+C
+#else
+C Octet 21: Reserved by WMO.
+C One 8-bit field. Skipped.
+C
+ KNSPT = KNSPT + 8
+C
+#endif
+ IF (KSEC1(5).GE.128) THEN
+C
+C Cross checks between descriptors decoded above,
+C and section 2 descriptors previously decoded.
+C
+ IF (MOD (KSEC2(11),64).LT.32) THEN
+ INROWS=KSEC2(3)
+ ELSE
+ INROWS=KSEC2(2)
+ ENDIF
+C
+ IF (LROW.AND.((LPRIBI.AND.INROWS.LT.IFIROV).OR.
+ X (.NOT.LPRIBI.AND.INROWS.NE.IFIROV))) THEN
+ IRETFN = 17260
+ WRITE(GRPRSM,FMT=9260)
+ GO TO 900
+ ELSEIF (LQUASI) THEN
+ IREFLN=22
+ ILEN=0
+C
+ DO 211 J=1,INROWS
+ ILEN=ILEN+KSEC2(IREFLN+J)
+ 211 CONTINUE
+C
+ ELSE
+ ILEN=KSEC2(2)*KSEC2(3)
+ ILNGTH=ILEN/INROWS
+ ENDIF
+C
+ IF (LPRIBI.AND.ISECOV.GT.ILEN.AND.HOPER.NE.'J') THEN
+ IRETFN = 17265
+ WRITE(GRPRSM,FMT=9270) 'too big'
+ GO TO 900
+ ELSEIF (.NOT.LPRIBI) THEN
+C
+ IF (ILEN.LE.JP16SET.AND.(IORDER+ISECOV).NE.ILEN) THEN
+ IRETFN = 17270
+ WRITE(GRPRSM,FMT=9270) 'from section 2'
+ GO TO 900
+ ELSEIF (ILEN.GT.JP16SET) THEN
+C
+C Two octets not wide enough for ISECOV - adjust.
+C
+ ISECOV=ILEN-IORDER
+ KSEC4(19)=ISECOV
+ ENDIF
+C
+ ELSEIF (KVALS.NE.ILEN) THEN
+ IRETFN = 17275
+ WRITE(GRPRSM,FMT=9275)
+ GO TO 900
+ ENDIF
+C
+ ELSE
+C
+C No section 2 in the present message.
+C
+ IF (LROW) THEN
+ IRETFN = 17277
+ WRITE(GRPRSM,FMT=9277) 'Row by row packing'
+ GO TO 900
+ ELSEIF (HOPER.EQ.'X') THEN
+ IRETFN = 17278
+ WRITE(GRPRSM,FMT=9277) 'HOPER=''X'' function'
+ GO TO 900
+ ELSEIF (LBOUST) THEN
+ IRETFN = 17279
+ WRITE(GRPRSM,FMT=9277) 'Boustrophedonic ordering'
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ IF (LPRIBI) THEN
+C
+ IF (KSEC3(1).EQ.0) THEN
+C
+C Explicit primary bit-map included.
+C Computation of effective number of points.
+C
+ INBSEQ=1+(KVALS-1)/JPWS2O
+ INVALS=0
+ ISEQ=0
+C
+ IF (LROW.AND.HOPER.NE.'J') THEN
+C
+C In row by row case, it is also necessary for decoding field
+C values to compute real length of rows. Do it now, as far as
+C permitted through ILENGR work array size.
+C
+ IAUXIS=0
+ ILAUXS=MIN (JPWS2O,KVALS)
+ IPTRBM=KBMAP
+ ISEQ=1
+ CALL INXBIT(KGRIB,KLENG,IPTRBM,IWORK2,ILAUXS,KBITS,1,YOPER,
+ X IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17280
+ WRITE(GRPRSM,FMT=9001) 'primary bit-map, row by row case'
+ GO TO 900
+ ENDIF
+C
+ DO 223 JROW=1,MIN (INROWS,JPWS1O)
+C
+C Full length of row (unmasked).
+C
+ IF (LQUASI) THEN
+ ILNGTH=KSEC2(IREFLN+JROW)
+ ELSE
+ ILNGTH=ILEN/INROWS
+ ENDIF
+C
+ IVALS=ILNGTH
+ ILNGTH=0
+ IVALSC=IVALS
+C
+ 221 CONTINUE
+C
+ DO 222 J=1,MIN (IVALSC,ILAUXS-IAUXIS)
+ ILNGTH=ILNGTH+IWORK2(IAUXIS+J)
+ 222 CONTINUE
+C
+ IF (IVALSC.LE.ILAUXS-IAUXIS) THEN
+C
+ IAUXIS=IAUXIS+IVALSC
+C
+ ELSEIF (IPTRBM.LT.KBMAP+KVALS) THEN
+C
+ IVALSC=IVALSC-(ILAUXS-IAUXIS)
+ ILAUXS=MIN(KBMAP+KVALS-IPTRBM,JPWS2O)
+ IAUXIS=0
+ ISEQ=ISEQ+1
+ CALL INXBIT(KGRIB,KLENG,IPTRBM,IWORK2,ILAUXS,KBITS,1,
+ X YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17280
+ WRITE(GRPRSM,FMT=9001)
+ X 'primary bit-map, row by row case'
+ GO TO 900
+ ENDIF
+C
+ GOTO 221
+C
+ ELSE
+C
+ IRETFN = 17560
+ WRITE(GRPRSM,FMT=9560)
+ GO TO 900
+C
+ ENDIF
+C
+ ILENGR(JROW)=ILNGTH
+ INVALS=INVALS+ILNGTH
+C
+ 223 CONTINUE
+C
+C End-up current sequence (active only if bit-map has not
+C been fully processed)...
+C
+ DO 224 J=IAUXIS+1,ILAUXS
+ INVALS=INVALS+IWORK2(J)
+ 224 CONTINUE
+C
+ IAUXIL=(ISEQ-1)*JPWS2O+IAUXIS
+C
+ ENDIF
+C
+C Staightforward computing.
+C
+ DO 228 JSEQ=ISEQ+1,INBSEQ
+ IAUXIS=(JSEQ-1)*JPWS2O
+ ILAUXS=MIN (JPWS2O,KVALS-IAUXIS)
+ IPTRBM=KBMAP+IAUXIS
+ CALL INXBIT(KGRIB,KLENG,IPTRBM,IWORK2,ILAUXS,KBITS,1,YOPER,
+ X IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17280
+ WRITE(GRPRSM,FMT=9001) 'primary bit-map'
+ GO TO 900
+ ENDIF
+C
+ DO 227 J=1,ILAUXS
+ INVALS=INVALS+IWORK2(J)
+ 227 CONTINUE
+C
+ 228 CONTINUE
+C
+ IF (LROW.AND.HOPER.NE.'J') THEN
+C
+ IF (INROWS.GT.JPWS1O) THEN
+C
+C ... it is necessary to (re)read primary bit-map, adjusting
+C pointer to start of (JPWS1O+1)th row.
+C
+ IAUXIS=0
+ ILAUXS=MIN (JPWS2O,KVALS-IAUXIL)
+ IPTRBM=KBMAP+IAUXIL
+ CALL INXBIT(KGRIB,KLENG,IPTRBM,IWORK2,ILAUXS,KBITS,1,
+ X YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17280
+ WRITE(GRPRSM,FMT=9001)
+ X 'primary bit-map, row by row case'
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ ENDIF
+C
+ IF (INVALS.GT.JP16SET) THEN
+C
+C Two octets might be not wide enough for ISECOV. Adjust.
+C
+ ISECOV=INVALS-IORDER
+ ENDIF
+C
+ ELSEIF (LROW) THEN
+C
+ IRETFN = 17281
+ WRITE(GRPRSM,FMT=9281) 'Row by row'
+ GO TO 900
+C
+ ELSEIF (LBOUST) THEN
+C
+ IRETFN = 17282
+ WRITE(GRPRSM,FMT=9281) 'Boustrophedonic ordering'
+ GO TO 900
+C
+ ENDIF
+C
+C WARNING:
+C -------
+C Whenever an implicit primary bit-map is included, it is then
+C assumed that ISECOV contains the right number of grid-points
+C really included in section 4. This is valid only if this
+C effective number of points is lower than (or equal to) JP16SET.
+
+ ENDIF
+C
+ IF (IORDER+ISECOV.GT.KLENP.AND.HOPER.NE.'J'.AND.HOPER.NE.'X') THEN
+ IRETFN = 17290
+ WRITE(GRPRSM,FMT=9290) IORDER+ISECOV,KLENP
+ GO TO 900
+ ELSEIF (HOPER.EQ.'X'.AND.KLENP.LE.IORDER) THEN
+ IRETFN = 17291
+ WRITE(GRPRSM,FMT=9291) IORDER+1
+ GO TO 900
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 3 . Decode last octet(s) (22...) before loop on groups.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF (KSEC4(12).NE.0) THEN
+C
+C General extended second-order packing used.
+C
+ IF (LSECBI) THEN
+ IRETFN = 17310
+ WRITE(GRPRSM,FMT=9310) 'no secondary bit-map'
+ GO TO 900
+ ELSEIF (LCTWID) THEN
+ IRETFN = 17320
+ WRITE(GRPRSM,FMT=9310) 'variable group widths'
+ GO TO 900
+ ENDIF
+C
+C Octets 22 - 23: Width of widths, Width of lengths.
+C Two 8-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IWORK,2,KBITS,8,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17330
+ WRITE(GRPRSM,FMT=9001) 'general extended descriptors, widths'
+ GO TO 900
+ ENDIF
+C
+ IBITGW=IWORK(1)
+ IBITGS=IWORK(2)
+C
+ IF (MAX (IBITGW,IBITGS).GT.JPXPWR) THEN
+ IRETFN = 17340
+ WRITE(GRPRSM,FMT=9002)
+ X 'general extended width of (group and/or size)',
+ X JPXPWR
+ GO TO 900
+ ENDIF
+C
+ KSEC4(11)=IBITGS
+C
+C Octets 24-25: Octet number of the start of group sizes (lengths).
+C One 16-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IPTRGS,1,KBITS,16,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17345
+ WRITE(GRPRSM,FMT=9001) 'general extended group size pointer'
+ GO TO 900
+ ENDIF
+C
+ IPTRSN=1+(8+(KNSPT-INSPTA)+IFIROV*IBITGW-1)/8
+C
+ IF (IPTRSN.GT.JP16SET) THEN
+C
+C Two octets not wide enough for IPTRGS - adjust.
+C
+ IPTRGS=IPTRSN
+ ENDIF
+C
+ IF (IORDER.NE.0.AND.HOPER.NE.'J') THEN
+C
+C Octet 26: Width of spatial differencing specific descriptors.
+C One 8-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IWIDSD,1,KBITS,8,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17346
+ WRITE(GRPRSM,FMT=9001)
+ X 'Width of spatial differencing descriptors'
+ GO TO 900
+ ELSEIF (IWIDSD.NE.0) THEN
+C
+C Octet 27-onwards: first IORDER original values and diff. bias.
+C (IORDER+1) fields of IWIDSD bits.
+C
+ IAUXIL=IORDER+1
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KDATA,IAUXIL,KBITS,IWIDSD,
+ X YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17347
+ WRITE(GRPRSM,FMT=9001)
+ X 'First field value(s) (spatial differencing case)'
+ GO TO 900
+ ENDIF
+C
+C Decode bias and its sign.
+C
+ CALL DSGNBT(IBIAS,KDATA(IAUXIL),IWIDSD,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17348
+ WRITE(GRPRSM,FMT=9348) IRET
+ GO TO 900
+ ENDIF
+C
+C Adjust pointer to next octet boundary.
+C
+ KNSPT=8*((8+KNSPT-1)/8)
+C
+ ELSE
+C
+C Spatial differencing descriptors are all zero.
+C
+ DO 311 J=1,IORDER
+ KDATA(J)=0
+ 311 CONTINUE
+C
+ IBIAS=0
+C
+ ENDIF
+C
+ ENDIF
+C
+ ELSE
+C
+ IBITGW=8
+C
+ IF (LCTWID) THEN
+C
+C Octet 22: Single value for width of second-order values.
+C One 8-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IWIDTH,1,KBITS,8,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17350
+ WRITE(GRPRSM,FMT=9001) 'constant width of 2nd-order values'
+ GO TO 900
+ ELSEIF (IWIDTH.GT.JPXPWR) THEN
+ IRETFN = 17351
+ WRITE(GRPRSM,FMT=9002) 'Constant width', JPXPWR
+ GO TO 900
+ ENDIF
+C
+ KSEC4(11)=IWIDTH
+C
+ ENDIF
+C
+ IF (LSECBI) THEN
+C
+C Secondary bit-map present. Initialize pointer, and decode
+C start of secondary bit-map (if field decoding is requested).
+C
+ IF (LCTWID) THEN
+ IPTRBM=23
+ ELSE
+ IPTRBM=22+IFIROV
+ ENDIF
+C
+ IPTRBM=(IPTRBM-1)*8+INSPTA
+ IPTRB0=IPTRBM
+C
+ IF (HOPER.NE.'J') THEN
+C
+ ILAUXS=MIN(ISECOV,JPWS2O)
+ IAUXIS=1
+ CALL INXBIT(KGRIB,KLENG,IPTRBM,IWORK2,ILAUXS,KBITS,1,YOPER,
+ X IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17360
+ WRITE(GRPRSM,FMT=9001) 'start of secondary bit-map'
+ GO TO 900
+ ELSEIF (IWORK2(1).NE.1) THEN
+ IRETFN = 17365
+ WRITE(GRPRSM,FMT=9365)
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ ENDIF
+C
+ ENDIF
+C
+C Compute minimum values for pointers. If it leads to value(s)
+C not fitting in 2 octets, then assume these are the right
+C value(s) to use.
+C
+ IPTRGW=KNSPT
+ IPTRFN=1+(8+IPTRGW-INSPTA-1)/8
+C
+ IF (LCTWID) THEN
+ IPTRFN=IPTRFN+(8+ISECOV-1)/8
+ ELSEIF (LROW) THEN
+ IPTRFN=IPTRFN+(8+IFIROV*IBITGW-1)/8
+ ELSEIF (LGENXT) THEN
+ IPTRFN=IPTRFN+(8+IFIROV*IBITGW-1)/8+(8+IFIROV*IBITGS-1)/8
+ ELSE
+ IPTRFN=IPTRFN+(8+IFIROV*IBITGW-1)/8+(8+ISECOV-1)/8
+ ENDIF
+C
+ IF (IPTRFN.GT.JP16SET) THEN
+ IPTRFO=IPTRFN
+ ENDIF
+C
+ KSEC4(16)=IPTRFO
+ IPTRSN=IPTRFO+(8+IFIROV*KSEC4(2)-1)/8
+C
+ IF (IPTRSN.GT.JP16SET) THEN
+ IPTRSO=IPTRSN
+ KSEC4(17)=IPTRSO
+ ENDIF
+C
+#ifndef ebug2o
+ IF (LDEBUG) THEN
+#endif
+C
+ IF (LROW) THEN
+ WRITE(GRPRSM,FMT=9381) 'row by row'
+ ELSEIF (LCTWID) THEN
+ WRITE(GRPRSM,FMT=9382) KSEC4(11)
+ ELSEIF (LGENXT) THEN
+ WRITE(GRPRSM,FMT=9381) 'general extended'
+ ELSE
+ WRITE(GRPRSM,FMT=9381) 'WMO general 2nd-order'
+ ENDIF
+C
+ IF (LBOUST) THEN
+ WRITE(GRPRSM,FMT=9383)
+ ENDIF
+C
+ IF (IORDER.NE.0) THEN
+ WRITE(GRPRSM,FMT=9384) IORDER, IBIAS
+ ENDIF
+C
+ WRITE(GRPRSM,FMT=9385) IFIROV, ISECOV, IPTRFO, IPTRSO
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ KSEC4(20)=IBITGW
+ IPTRFO=(IPTRFO-1)*8+INSPTA
+ IPTRSO=(IPTRSO-1)*8+INSPTA
+C
+C Cross checks betweens pointers.
+C
+ IF (LGENXT) THEN
+C
+ IPTRGS=(IPTRGS-1)*8+INSPTA
+C
+ IF (IPTRGW+IFIROV*IBITGW.GT.IPTRGS) THEN
+ IRETFN = 17391
+ WRITE(GRPRSM,FMT=9391)
+ GO TO 900
+ ELSEIF (IPTRGS+IFIROV*IBITGS.GT.IPTRFO) THEN
+ IRETFN = 17392
+ WRITE(GRPRSM,FMT=9393)
+ X 'general extended group size/1st-order values'
+ GO TO 900
+ ENDIF
+C
+ ELSEIF (LSECBI) THEN
+C
+ IF (IPTRB0+ISECOV.GT.IPTRFO) THEN
+ IRETFN = 17393
+ WRITE(GRPRSM,FMT=9393) '2ndary bit-map/1st-order values'
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ IF (IPTRFO+IFIROV*KSEC4(2).GT.IPTRSO) THEN
+ IRETFN = 17394
+ WRITE(GRPRSM,FMT=9393) 'First-order/Second-order'
+ GO TO 900
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 4 . Additional preprocessing for function 'X'.
+C -----------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ IF (HOPER.EQ.'X') THEN
+C
+C First, perform some checks.
+C
+ INDEXX=34
+ INDEXY=42
+C
+#ifndef ebug2o
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9401) INDEXX, INDEXY,
+ X (KSEC4(J),J=INDEXX,INDEXY)
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ INPEXT=KSEC4(INDEXX)
+C
+ IF (LPRIBI) THEN
+ IRETFN = 17410
+ WRITE(GRPRSM,FMT=9410) 'not valid with a (primary) bit-map'
+ GO TO 900
+ ELSEIF (KSEC2(1).GE.40.OR.
+ X (MOD(KSEC2(1),10).NE.0.AND.MOD(KSEC2(1),10).NE.4)) THEN
+ IRETFN = 17411
+ WRITE(GRPRSM,FMT=9410)
+ X 'valid only with lat/long or gaussian field'
+ GO TO 900
+ ELSEIF (INPEXT.LT.1.OR.INPEXT.GT.JPXMAX) THEN
+ IRETFN = 17412
+ WRITE(GRPRSM,FMT=9412) JPXMAX,' points.'
+ GO TO 900
+ ELSEIF (INPEXT.GT.KLENP) THEN
+ IRETFN = 17413
+ WRITE(GRPRSM,FMT=9413) INPEXT
+ GO TO 900
+ ENDIF
+C
+C Take into account third bit of scanning modes to know
+C which dimension is latitude.
+C
+C INCR=0 means that longitude is the most rapidly varying.
+C
+ INCR=MOD (KSEC2(11),64)/32
+C
+C Now compute 1-dimensional "addresses" in whole field.
+C
+ DO 422 JEXT=1,INPEXT
+ INDROW=KSEC4(INDEXX+2*JEXT-1+INCR)
+ INDCOL=KSEC4(INDEXX+2*JEXT -INCR)
+C
+ IF (INDROW.LT.1.OR.INDROW.GT.INROWS) THEN
+ IRETFN = 17421
+ WRITE(GRPRSM,FMT=9421) JEXT, INCR+1, INROWS
+ GO TO 900
+ ELSEIF(LQUASI) THEN
+ ISKIP=0
+C
+ DO 421 J=1,INDROW-1
+ ISKIP=ISKIP+KSEC2(IREFLN+J)
+ 421 CONTINUE
+C
+ ILNGTH=KSEC2(IREFLN+INDROW)
+C
+ ELSE
+ ISKIP=(INDROW-1)*ILNGTH
+ ENDIF
+C
+ IF (INDCOL.LT.1.OR.INDCOL.GT.ILNGTH) THEN
+ IRETFN = 17422
+ WRITE(GRPRSM,FMT=9421) JEXT, 2-INCR, ILNGTH
+ GO TO 900
+ ENDIF
+C
+#ifndef ebug2o
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9422) JEXT, INDROW, INDCOL, ISKIP, ILNGTH
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ IF (LBOUST.AND.MOD(INDROW,2).EQ.0) THEN
+ INDCOL=ILNGTH+1-INDCOL
+ ENDIF
+C
+ IRGEXT(JEXT)=ISKIP+INDCOL
+ INDXOR(JEXT)=JEXT
+ 422 CONTINUE
+C
+C Finally, sort "addresses" in ascending order.
+C
+ DO 432 JEXT=1,INPEXT-1
+C
+ DO 431 J=JEXT+1,INPEXT
+C
+ IF (IRGEXT(J).LT.IRGEXT(JEXT)) THEN
+ IAUXIL=IRGEXT(J)
+ IRGEXT(J)=IRGEXT(JEXT)
+ IRGEXT(JEXT)=IAUXIL
+ IAUXIL=INDXOR(J)
+ INDXOR(J)=INDXOR(JEXT)
+ INDXOR(JEXT)=IAUXIL
+ ENDIF
+C
+ 431 CONTINUE
+C
+ 432 CONTINUE
+C
+ IRGEXT(INPEXT+1)=0
+#ifndef ebug2o
+C
+ IF (LDEBUG) THEN
+#endif
+ PRINT *,' D2ORDR: IRGEXT = ',IRGEXT,', INDXOR = ',INDXOR,'.'
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ ELSE
+ INPEXT=0
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 5 . Decode values, group by group.
+C -----------------------------------------------------------------
+C
+ 500 CONTINUE
+C
+C Finished if function 'J' is requested.
+C
+ IF (HOPER.EQ.'J') THEN
+ KSEC4(1)=IORDER+ISECOV
+ GO TO 900
+ ENDIF
+C
+ ICOUNT=IORDER
+ ICOUNS=IORDER
+ ICOUNG=IORDER
+ IEXT=1
+ INBSEQ=1+(IFIROV-1)/JPWS1O
+C
+ IF (KSEC4(2).EQ.0) THEN
+C
+C In this case, no first-order values are provided: they are
+C all equal to 0 (group references equal to field reference).
+C
+ DO 501 J=1,MIN (IFIROV,JPWS1O)
+ IFIRST(J)=0
+ 501 CONTINUE
+C
+ ENDIF
+C
+ IF (LCTWID.AND.HOPER.NE.'X') THEN
+C
+C Constant width packing. Second-order values will be
+C decoded once per sequence.
+C
+ IPRWID=KSEC4(11)
+C
+ DO 502 J=1,MIN (IFIROV,JPWS1O)
+ IWIDGR(J)=IPRWID
+ 502 CONTINUE
+C
+ ENDIF
+C
+C Groups treated as sequences, as large as possible
+C with respect to group work arrays size (JPWS1O).
+C
+ DO 591 JSEQ=1,INBSEQ
+C
+ IGROFF=(JSEQ-1)*JPWS1O
+ IGRNBR=MIN (JPWS1O,IFIROV-IGROFF)
+C
+ IF (LGENXT) THEN
+ CALL INXBIT(KGRIB,KLENG,IPTRGS,IWORK2,IGRNBR,KBITS,IBITGS,YOPER,
+ X IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17510
+ WRITE(GRPRSM,FMT=9510) 'sizes', IGROFF+1, IGROFF+IGRNBR
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ IF (.NOT.LCTWID) THEN
+ CALL INXBIT(KGRIB,KLENG,IPTRGW,IWIDGR,IGRNBR,KBITS,IBITGW,YOPER,
+ X IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17520
+ WRITE(GRPRSM,FMT=9510) 'widths', IGROFF+1, IGROFF+IGRNBR
+ GO TO 900
+ ENDIF
+C
+ IPRWID=IWIDGR(1)
+C
+ ENDIF
+C
+ IF (KSEC4(2).NE.0) THEN
+C
+ CALL INXBIT(KGRIB,KLENG,IPTRFO,IFIRST,IGRNBR,KBITS,KSEC4(2),
+ X YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17530
+ WRITE(GRPRSM,FMT=9510) '1st-order values', IGROFF+1,
+ X IGROFF+IGRNBR
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ ILNGTS=0
+C
+C Loop over groups in a given sequence.
+C
+ DO 551 JGROUP=1,IGRNBR
+C
+C Define length of current group: ILNGTH.
+C
+ IF (LGENXT) THEN
+ ILNGTH=IWORK2(JGROUP)
+ ELSEIF (LSECBI) THEN
+C
+ ILNGTH=0
+C
+ 520 CONTINUE
+C
+ DO 521 J=IAUXIS+1,ILAUXS
+C
+ IF (IWORK2(J).EQ.1) THEN
+ IRANG=J
+ GOTO 522
+ ENDIF
+C
+ 521 CONTINUE
+C
+ ILNGTH=ILNGTH+ILAUXS-IAUXIS
+C
+ IF (IPTRBM.LT.IPTRB0+ISECOV) THEN
+ ILAUXS=MIN(IPTRB0+ISECOV-IPTRBM,JPWS2O)
+ IAUXIS=0
+ CALL INXBIT(KGRIB,KLENG,IPTRBM,IWORK2,ILAUXS,KBITS,1,YOPER,
+ X IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17540
+ WRITE(GRPRSM,FMT=9001) 'secondary bit-map'
+ GO TO 900
+ ENDIF
+C
+ GOTO 520
+ ELSE
+C
+C It was the last group.
+C
+ ILNGTH=ILNGTH+1
+ GOTO 523
+ ENDIF
+C
+ 522 CONTINUE
+C
+ ILNGTH=ILNGTH+IRANG-IAUXIS
+ IAUXIS=IRANG
+C
+ 523 CONTINUE
+C
+ ELSE
+C
+C ... that's row by row packing...
+C
+C (re)definition of row length.
+C
+ IF (LQUASI) THEN
+ IREFLN=IREFLN+1
+ ILNGTH=KSEC2(IREFLN)
+ ELSE
+ ILNGTH=ILEN/INROWS
+ ENDIF
+C
+ IF (LPRIBI) THEN
+C
+C Row by row packing, but an explicit bit-map is included.
+C The number of values in current row has to be known.
+C
+ IVALS=ILNGTH
+C
+ IF (JSEQ.EQ.1) THEN
+C
+C Rows of first sequence has been pre-computed in Section 2.
+C
+ ILNGTH=ILENGR(JGROUP)
+C
+ ELSE
+C
+ ILNGTH=0
+ IVALSC=IVALS
+C
+ 530 CONTINUE
+C
+ DO 531 J=1,MIN (IVALSC,ILAUXS-IAUXIS)
+ ILNGTH=ILNGTH+IWORK2(IAUXIS+J)
+ 531 CONTINUE
+C
+ IF (IVALSC.LE.ILAUXS-IAUXIS) THEN
+C
+ IAUXIS=IAUXIS+IVALSC
+C
+ ELSEIF (IPTRBM.LT.KBMAP+KVALS) THEN
+C
+ IVALSC=IVALSC-(ILAUXS-IAUXIS)
+ ILAUXS=MIN(KBMAP+KVALS-IPTRBM,JPWS2O)
+ IAUXIS=0
+#ifndef ebug2o
+C
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9540) IGROFF+JGROUP, IPTRBM, ILAUXS
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ CALL INXBIT(KGRIB,KLENG,IPTRBM,IWORK2,ILAUXS,KBITS,1,
+ X YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17550
+ WRITE(GRPRSM,FMT=9001)
+ X 'primary bit-map in row by row case'
+ GO TO 900
+ ENDIF
+C
+ GOTO 530
+C
+ ELSE
+C
+ IRETFN = 17560
+ WRITE(GRPRSM,FMT=9560)
+ GO TO 900
+C
+ ENDIF
+C
+ ENDIF
+C
+#ifndef ebug2o
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9565) IGROFF+JGROUP, ILNGTH, IVALS
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ ENDIF
+C
+ ENDIF
+C
+ ICNEXT=ICOUNT+ILNGTH
+C
+ IF (ICNEXT.GT.(IORDER+ISECOV)) THEN
+ IRETFN = 17570
+ WRITE(GRPRSM,FMT=9570) ICNEXT, ISECOV
+ GO TO 900
+ ENDIF
+C
+ ILENGR(JGROUP)=ILNGTH
+C
+C Go to next group if no point is included in current group.
+C (may only occur for masked field in row by row case)
+C
+ IF (ILNGTH.EQ.0) THEN
+ IWIDGR(JGROUP)=0
+ IFIRST(JGROUP)=0
+ GOTO 551
+ ENDIF
+C
+C If necessary, (re)define width of current group: IWIDTH.
+C
+ IWIDTH=IWIDGR(JGROUP)
+C
+ 540 CONTINUE
+C
+C All characteristics of current group are known, so proceed
+C with second-order data.
+C
+C Except for 'X' function, neighbour groups of same width are
+C "unpacked" together, at least once per sequence.
+C
+ IF (HOPER.NE.'X') THEN
+C
+C All values of current group will have to be processed.
+C
+ IF (IWIDTH.NE.IPRWID) THEN
+C
+C Current group may not be unpacked together with previous one(s).
+C
+#ifdef ebug2o
+ PRINT *,'d2ordr - groups..',IGROFF+JGROUP-1,
+ X ' IPTRSO/IPRWID/ICOUNS/ILNGTS= ',
+ X IPTRSO, IPRWID, ICOUNS, ILNGTS
+#endif
+C
+ IF (IPRWID.NE.0.AND.ILNGTS.NE.0) THEN
+C
+C Effective decoding of second-order values, for previous group(s).
+C
+ CALL INXBIT(KGRIB,KLENG,IPTRSO,KDATA(ICOUNS+1),
+ X ILNGTS,KBITS,IPRWID,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17580
+ WRITE(GRPRSM,FMT=9580) 'groups..', IGROFF+JGROUP-1
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ ICOUNS=ICOUNT
+ ILNGTS=0
+ IPRWID=IWIDTH
+C
+ ENDIF
+C
+ ILNGTS=ILNGTS+ILNGTH
+C
+ ELSEIF (IRGEXT(IEXT).GT.ICOUNT.AND.IRGEXT(IEXT).LE.ICNEXT) THEN
+C
+C Function 'X' - Compute only a single "full" normalized value.
+C
+ IEXTOR=INDXOR(IEXT)
+C
+ IF (IWIDTH.NE.0) THEN
+ IAUXIL=IPTRSO+(IRGEXT(IEXT)-ICOUNT-1)*IWIDTH
+ CALL INXBIT(KGRIB,KLENG,IAUXIL,KDATA(IEXTOR),1,KBITS,
+ X IWIDTH,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17580
+ WRITE(GRPRSM,FMT=9580) 'group', IGROFF+JGROUP
+ GO TO 900
+ ENDIF
+C
+ KDATA(IEXTOR)=IFIRST(JGROUP)+KDATA(IEXTOR)
+ ELSE
+ KDATA(IEXTOR)=IFIRST(JGROUP)
+ ENDIF
+C
+ IEXT=IEXT+1
+#ifndef ebug2o
+C
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9585) IEXT, INPEXT
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+C Loop back, to allow for extraction of other point(s)
+C within the current group.
+C
+ GOTO 540
+C
+ ELSE
+C
+C Function 'X', but group contains no requested grid-point.
+C Pointer adjusted for next group.
+C
+ IPTRSO=IPTRSO+ILNGTH*IWIDTH
+C
+ ENDIF
+C
+ ICOUNT=ICNEXT
+C
+ 551 CONTINUE
+C
+ IF (HOPER.NE.'X') THEN
+C
+#ifdef ebug2o
+ PRINT *,'d2ordr - groups..',IGROFF+IGRNBR,
+ X ' IPTRSO/IPRWID/ICOUNS/ILNGTS= ',
+ X IPTRSO, IPRWID, ICOUNS, ILNGTS
+C
+#endif
+ IF (IPRWID.NE.0.AND.ILNGTS.NE.0) THEN
+C
+C Effective decoding of second-order values, for last group(s)
+C of the current sequence.
+C
+C In case of constant width packing it means all groups
+C of the current sequence.
+C
+ CALL INXBIT(KGRIB,KLENG,IPTRSO,KDATA(ICOUNS+1),
+ X ILNGTS,KBITS,IPRWID,YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 17580
+ WRITE(GRPRSM,FMT=9580) 'groups..', IGROFF+IGRNBR
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ ICOUNS=ICOUNT
+C
+C Add first-order values to rebuild original normalized values.
+C
+ DO 563 JGROUP=1,IGRNBR
+C
+#ifdef ebug2o
+ IMAXVC=0
+#endif
+ IREFER=IFIRST(JGROUP)
+ ILNGTH=ILENGR(JGROUP)
+ IWIDTH=IWIDGR(JGROUP)
+C
+ IF (IWIDTH.NE.0) THEN
+C
+ DO 561 J=1,ILNGTH
+#ifdef ebug2o
+ IMAXVC=MAX(IMAXVC,KDATA(ICOUNG+J))
+#endif
+ KDATA(ICOUNG+J)=IREFER+KDATA(ICOUNG+J)
+ 561 CONTINUE
+C
+ ELSE
+C
+C Group with a constant value: no second order value included.
+C
+ DO 562 J=1,ILNGTH
+ KDATA(ICOUNG+J)=IREFER
+ 562 CONTINUE
+C
+ ENDIF
+C
+ ICOUNG=ICOUNG+ILNGTH
+#ifdef ebug2o
+ PRINT *,'d2ordr - group ',IGROFF+JGROUP,ICOUNG,ILNGTH,IWIDTH,
+ X IREFER,IMAXVC
+#endif
+C
+ 563 CONTINUE
+C
+ ENDIF
+C
+ 591 CONTINUE
+C
+C -----------------------------------------------------------------
+C* Section 6 . Last computations.
+C -----------------------------------------------------------------
+C
+ 600 CONTINUE
+C
+C From this point and for the remaining part of the routine,
+C ISECOV is the total number of grid-points.
+C
+ ISECOV=IORDER+ISECOV
+C
+ IF (IORDER.NE.0) THEN
+C
+C Rebuild original field values from spatial differences.
+C
+#if (defined CRAY) || (defined FUJITSU)
+ LVECTD=.TRUE.
+#else
+ LVECTD=.FALSE.
+#endif
+C
+ IRETFN = D2ROSD ( KDATA, ISECOV, IORDER, IPOWER, JPXPWR,
+ X IBIAS, LVECTD, LDEBUG )
+C
+ IF (IRETFN.NE.0) THEN
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+ IF (HOPER.NE.'X') THEN
+C
+C Recompute original bit number for the whole field.
+C
+ CALL MAXMNI (KDATA,ISECOV,IMAXVN,IAUXIL)
+C
+ KSEC4(2) = C2BITW ( IMAXVN, JPXPWR, IPOWER, JPXPWR )
+C
+#ifndef ebug2o
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9601) KSEC4(2)
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ IF (ICOUNT.NE.ISECOV) THEN
+ IRETFN = 17610
+ WRITE(GRPRSM,FMT=9610) ICOUNT, ISECOV
+ GO TO 900
+ ELSE
+ KSEC4(1)=ISECOV
+ ENDIF
+C
+ ELSE
+ KSEC4(1)=MIN(IEXT,JPXMAX)
+ ENDIF
+C
+#ifndef ebug2o
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9602) KSEC4(1)
+#ifndef ebug2o
+ ENDIF
+C
+#endif
+ KNSPT=INSPTA+KLEN4*8-KNIL
+C
+ IF (IPTRSO.NE.KNSPT) THEN
+ IRETFN = 17620
+ WRITE(GRPRSM,FMT=9620) IPTRSO, KNSPT
+ GO TO 900
+ ENDIF
+C
+ IF (LBOUST.AND.HOPER.NE.'X') THEN
+C
+C Reverse ordering within even rank rows.
+C
+ LPRCLN=.FALSE.
+C
+ IRETFN = REVERO ( KDATA, KLENP, KSEC2, KGRIB, KLENG,
+ X KBITS, KBMAP, KVALS, LPRIBI, LQUASI,
+ X INROWS, ISECOV, IFIRST, JPWS2O, LDEBUG,
+ X LPRCLN, IWORK2 )
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ D2ORDR = IRETFN
+#ifndef ebug2o
+C
+ IF (LDEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9900) IRETFN, HOPER(:1), KNSPT
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ RETURN
+C
+ 9001 FORMAT (' D2ORDR: Problem extracting ',A,'.')
+C
+ 9002 FORMAT (' D2ORDR: ',A,' above',I3,'.')
+C
+ 9100 FORMAT (' D2ORDR: Function start, HOPER = ',A,', KNSPT =',I10,
+ X '.')
+ 9135 FORMAT (' D2ORDR: Decoded number of bits (for 1st-order values)',
+ X ' =',I3,'.')
+ 9150 FORMAT (' D2ORDR: PREF =',F30.20,', decoded IPTRFO =',I6,'.',/,
+ X ' D2ORDR: KNSPT at end of "Section 1" =',I10,'.')
+ 9210 FORMAT (' D2ORDR: Extended flags =',I9.8,', KNSPT =',I10,'.')
+ 9220 FORMAT (' D2ORDR: First extended flag (reserved) set.')
+ 9225 FORMAT (' D2ORDR: KSEC4(3:10) =',I4,3I3,I2,3I3,'.')
+ 9230 FORMAT (' D2ORDR: Last extended flag(s) (reserved) set.')
+ 9240 FORMAT (' D2ORDR: Matrix of values invalid here.')
+ 9244 FORMAT (' D2ORDR: Function HOPER = "',A1,
+ X '" not supported for spatial differencing.')
+ 9245 FORMAT (' D2ORDR: Spatial differencing implies general',
+ X ' extended 2nd-order packing.')
+#ifndef wmogrp2o
+ 9255 FORMAT (' D2ORDR: 21st octet of section 4 not zero:',I9.8,
+ X '=>',I3,'.',/,TR10,
+ X 'interpreted as extra bits for group number:',I8,'.')
+#endif
+ 9260 FORMAT (' D2ORDR: Row by row packing: row/group numbers',
+ X ' not consistent.')
+ 9270 FORMAT (' D2ORDR: Number of second-order values ',A,'.')
+ 9275 FORMAT (' D2ORDR: (Primary bit-map size/section 2 contents)',
+ X ' mismatch.')
+ 9277 FORMAT (' D2ORDR: ',A,' only supported with a section 2.')
+ 9281 FORMAT (' D2ORDR: ',A,
+ S '/Implicit primary bit-map: not supported.')
+ 9290 FORMAT (' D2ORDR: Grid-point number exceeds KDATA size:',I9,
+ X ' >',I9,'.')
+ 9291 FORMAT (' D2ORDR: Function ''X'' - KDATA size must be at least',
+ X I2,' for actual spatial differencing).')
+C
+ 9310 FORMAT (' D2ORDR: General extended packing implies ',A,'.')
+ 9348 FORMAT (
+ X' D2ORDR: Bias sign management problem, DSGNBT return is',I5,'.')
+ 9365 FORMAT (' D2ORDR: First bit of secondary bit-map is not set.')
+ 9381 FORMAT (' D2ORDR: Packing method is ',A,'.')
+ 9382 FORMAT (' D2ORDR: Packing method is constant width, on',I3,
+ X ' bits.')
+ 9383 FORMAT (' D2ORDR: Boustrophedonic ordering used.')
+ 9384 FORMAT (' D2ORDR: Spatial differencing used, order is',I2,
+ X ', bias =',I9,'.')
+ 9385 FORMAT (' D2ORDR: IFIROV, ISECOV, IPTRFO, IPTRSO =',2I8,2I10,
+ X '.')
+ 9391 FORMAT (
+ X ' D2ORDR: Bad pointer to general extended group size info.')
+ 9393 FORMAT (' D2ORDR: (',A,')',' pointers mismatch.')
+C
+ 9401 FORMAT (' D2ORDR: ''X'' Function - KSEC4(',I2,':',I2,') = ',I3,
+ X 8I6,'.')
+ 9410 FORMAT (' D2ORDR: Function ''X'' ',A,'.')
+ 9412 FORMAT (' D2ORDR: Function ''X'' valid only for 1 to',I3,
+ X ' points.')
+ 9413 FORMAT (' D2ORDR: Function ''X'' - KDATA size insufficient for',
+ X I2,' points requested.')
+ 9421 FORMAT (' D2ORDR: Function ''X'', Point',I6,',',I2,
+ X '-index not in range [1-',I6,'].')
+ 9422 FORMAT (' D2ORDR: JEXT, INDROW, INDCOL, ISKIP, ILNGTH =',
+ X I3,2I6,I8,I6,'.')
+C
+ 9510 FORMAT (' D2ORDR: ',A,', groups',I6,'..',I6.6,'.')
+ 9540 FORMAT (' D2ORDR: mask, row',I6,', bit-map pointer =',I10,
+ X ', size requested=',I8,'.')
+ 9560 FORMAT (' D2ORDR: Pointers problem for primary bit-map,',
+ X ' row by row case.')
+ 9565 FORMAT (' D2ORDR: mask, row',I6,', length =',I6,' out of',I6,'.')
+ 9570 FORMAT (' D2ORDR: Grid-point number overflow:',I8,' >',I8,'.')
+ 9580 FORMAT (' D2ORDR: second-order values, ',A,I8,'.')
+ 9585 FORMAT (' D2ORDR: IEXT =',I3,', INPEXT =',I3,'.')
+C
+ 9601 FORMAT (
+ X ' D2ORDR: Original number of bits -returned in KSEC4(2)-) =',
+ X I3,'.')
+ 9602 FORMAT (' D2ORDR: Values decoded -returned in KSEC4(1)- =',
+ X I8,'.')
+ 9610 FORMAT (' D2ORDR: Mismatch: sum of group lengths =',I8,
+ X ', expected =',I8,'.')
+ 9620 FORMAT (' D2ORDR: Final bit pointer is',I10,', expected =',I10,
+ X '.')
+C
+ 9900 FORMAT (' D2ORDR: Function return code =',I6,', HOPER = ',A,
+ X ', KNSPT =',I10,'.')
+C
+ END
diff --git a/gribex/d2rosd.F b/gribex/d2rosd.F
new file mode 100755
index 0000000..1bcab01
--- /dev/null
+++ b/gribex/d2rosd.F
@@ -0,0 +1,330 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION D2ROSD ( KDATA, KLEN, KORDER, KPOWER, KMXPWR,
+ X KBIAS, OVECTA, ODEBUG )
+C
+C---->
+C**** D2ROSD
+C
+C Purpose.
+C --------
+C
+C Rebuild Original field from Spatial Differences, when using
+C non-local features of GRIB second-order extended packing.
+C
+C** Interface.
+C ----------
+C
+C IRET = D2ROSD ( KDATA, KLEN, KPOWER, KMXPWR, OVECTA, ODEBUG )
+C
+C Function result value is zero, except for non-valid order.
+C
+C Input Parameters.
+C -----------------
+C
+C KDATA - Array of normalized values.
+C KLEN - Exact number of grid-points to handle.
+C KPOWER - Auxilary array, containing precomputed powers of 2-1.
+C KMXPWR - Maximum number of bits allowed.
+C KBIAS - BIAS of spatial differences.
+C OVECTA - True if vectorizing algorithm has to be used.
+C ODEBUG - True for some debug printout.
+C
+C
+C Output Parameters (effective only if function value is non zero).
+C ------------------
+C
+C KDATA - Array of normalized values (transformed).
+C
+C
+C Method.
+C -------
+C
+C For vector systems, an external loop on order of spatial
+C differencing is made, and inner recursive sum is made by a
+C or by a vectorizing algorithm (that implies an overhead of
+C LOG2(KLEN) in operations and memory accesses).
+C
+C For scalar systems, a single scan is performed, with contents
+C specific for each order.
+C
+C
+C Externals.
+C ----------
+C
+C C2BITW - Computes bit width of a positive integer value.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C J. Clochard, Meteo France, for ECMWF - April 1998.
+C
+C
+C Modifications.
+C _____________
+C
+C J. Clochard, September 1998.
+C Optimisation for scalar systems (memory access reduced).
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JPORDR
+C
+C Maximum order of spatial differencing allowed.
+C
+ PARAMETER ( JPORDR=3 )
+C
+C Subroutine arguments
+C
+ INTEGER KLEN, KMXPWR, KBIAS, KORDER
+ INTEGER KDATA (KLEN), KPOWER (0:KMXPWR)
+C
+ LOGICAL OVECTA, ODEBUG
+C
+C Local variables.
+C
+ INTEGER IOFF, J, J2, JORDER, ILOG2N, IORIGI, ILEN, IRETFN, I1DIFF
+ INTEGER I2DIFF
+C
+ INTEGER C2BITW
+ EXTERNAL C2BITW
+C
+C -----------------------------------------------------------------
+C* Section 1 . Performs initial checks.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9100) KLEN, KORDER, KBIAS
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ IF (KORDER.LE.0.OR.KORDER.GT.JPORDR) THEN
+ IRETFN = 23110
+ WRITE(GRPRSM,FMT=9110) KORDER, JPORDR
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 2 . Preprocessing of first values of field.
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF (OVECTA) THEN
+C
+C For higher orders, and due to iterative outer loop on order,
+C it is necessary that the 2nd value contains the first 1st-order
+C difference (between the 2 first values), and so on.
+C
+ DO 202 JORDER = 2, KORDER
+C
+#ifdef CRAY
+CDIR$ NOVECTOR
+#endif
+#ifdef FUJITSU
+!OCL SCALAR
+#endif
+ DO 201 J = KORDER, JORDER, -1
+C
+ KDATA(J)=KDATA(J)-KDATA(J-1)
+C
+ 201 CONTINUE
+#ifdef CRAY
+CDIR$ VECTOR
+#endif
+#ifdef FUJITSU
+!OCL VECTOR
+#endif
+C
+ 202 CONTINUE
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 3 . Rebuild original field integer values.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF (OVECTA) THEN
+C
+C Vectorizable algorithm.
+C ----------------------
+C
+ DO 315 JORDER = KORDER, 1, -1
+C
+ ILEN=KLEN-JORDER
+ ILOG2N=C2BITW ( ILEN-1, KMXPWR, KPOWER, KMXPWR )
+C
+ IF (JORDER.EQ.KORDER) THEN
+C
+C Bias is added at first scan.
+C
+ DO 312 J2 = 1, ILOG2N
+C
+ IOFF=KPOWER(J2-1)+1
+C
+#ifdef CRAY
+CDIR$ IVDEP
+#endif
+#ifdef FUJITSU
+!OCL NOVREC
+#endif
+ DO 311 J = KLEN, IOFF+JORDER, -1
+C
+ KDATA(J)=KDATA(J)+(KDATA(J-IOFF)+KBIAS)
+C
+ 311 CONTINUE
+C
+ 312 CONTINUE
+C
+ ELSE
+C
+ DO 314 J2 = 1, ILOG2N
+C
+ IOFF=KPOWER(J2-1)+1
+C
+#ifdef CRAY
+CDIR$ IVDEP
+#endif
+#ifdef FUJITSU
+!OCL NOVREC
+#endif
+ DO 313 J = KLEN, IOFF+JORDER, -1
+C
+ KDATA(J)=KDATA(J)+KDATA(J-IOFF)
+C
+ 313 CONTINUE
+C
+ 314 CONTINUE
+C
+ ENDIF
+C
+ 315 CONTINUE
+C
+ ELSE
+C
+C Recurrent (scalar) algorithm.
+C ----------------------------
+C
+C Only one scan, with specific code for each order.
+C
+C Initialize recursion.
+C
+ IORIGI=KDATA(KORDER)
+C
+ IF (KORDER.EQ.1) THEN
+C
+ DO 321 J = 2, KLEN
+C
+ IORIGI=IORIGI+(KDATA(J)+KBIAS)
+ KDATA(J)=IORIGI
+C
+ 321 CONTINUE
+C
+ ELSEIF (KORDER.EQ.2) THEN
+C
+ I1DIFF=KDATA(2)-KDATA(1)
+C
+ DO 322 J = 3, KLEN
+C
+ I1DIFF=I1DIFF+(KDATA(J)+KBIAS)
+ IORIGI=IORIGI+I1DIFF
+ KDATA(J)=IORIGI
+C
+ 322 CONTINUE
+C
+ ELSE
+C
+ I1DIFF=KDATA(3)-KDATA(2)
+ I2DIFF=I1DIFF-(KDATA(2)-KDATA(1))
+C
+ DO 323 J = 4, KLEN
+C
+ I2DIFF=I2DIFF+(KDATA(J)+KBIAS)
+ I1DIFF=I1DIFF+I2DIFF
+ IORIGI=IORIGI+I1DIFF
+ KDATA(J)=IORIGI
+C
+ 323 CONTINUE
+C
+ ENDIF
+C
+#ifdef ebug2o
+ ILEN=MIN (KLEN,10)
+ PRINT *,'d2rosd - JORDER=',JORDER,',KDATA(1:',ILEN,')=',
+ S (KDATA(J),J=1,ILEN)
+C
+#endif
+ ENDIF
+C
+ IRETFN=0
+C
+C -----------------------------------------------------------------
+C* Section 9 . Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ D2ROSD = IRETFN
+C
+#ifndef ebug2o
+C
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9900) IRETFN
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ RETURN
+C
+ 9100 FORMAT (' D2ROSD: Function start, KLEN =',I8,', KORDER =',I2,
+ X ', KBIAS=',I9,'.')
+C
+ 9110 FORMAT (' D2ROSD: Order requested:',I5,', out of [1,',I1,'].')
+C
+ 9312 FORMAT (' D2ROSD: Range diagnostic is ',A,
+ X ' of spatial differences, order',I2,'.')
+ 9331 FORMAT (' D2ROSD: Selected order:',I2,', range diagnostics:',
+ X 4I8,'.')
+C
+ 9900 FORMAT (' D2ROSD: Function return code =',I6,'.')
+C
+ END
diff --git a/gribex/decext.F b/gribex/decext.F
new file mode 100755
index 0000000..fb26fe3
--- /dev/null
+++ b/gribex/decext.F
@@ -0,0 +1,464 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE DECEXT (KBIT,PDATA,KDATA,KGRIB,KLENB,KI,KJ,KERR)
+C
+C---->
+C***** DECEXT - Extract values from GRIB coded data.
+C
+C Purpose.
+C --------
+C
+C Return unpacked values for a series of grid points from an
+C array of packed grib data, without unpacking all values.
+C
+C** Interface.
+C ----------
+C
+C CALL DECEXT (KBIT,PDATA,KDATA,KGRIB,KLENB,KI,KJ,KERR)
+C
+C INTEGER K.
+C REAL P.
+C LOGICAL O.
+C CHARACTER H.
+C
+C Input parameters.
+C -----------------
+C
+C KBIT - Number of bits in computer word
+C
+C PDATA - Array to receive unpacked values.
+C
+C KDATA - Size of array PDATA (number of grid points
+C required).
+C
+C KGRIB - Integer array containing data in grib code.
+C
+C KLENB - Length of array KGRIB (in words).
+C
+C KI - I indices of required grid points.
+C (dimensioned KDATA).
+C
+C KJ - J indices of required grid points.
+C (dimensioned KDATA).
+C
+C
+C Output parameters.
+C ------------------
+C
+C PDATA(N) - Value of grid point KI(N),KJ(N)
+C
+C KERR - 0 if no error.
+C -1 If not grid point field.
+C -2 If error in routine OFFSET.
+C
+C Method.
+C -------
+C
+C The self defining fields of section 0 - 3 of the GRIB code
+C are used to step down to the data part of section 4. The
+C reference value and scale factor are extracted and converted
+C The packed increments for the required
+C grid points are extracted and the values calculated.
+C
+C Externals.
+C ----------
+C
+C GBYTE
+C GBYTES
+C DECFP
+C OFFSET
+C
+C Reference.
+C ----------
+C
+C MARS User Guide for details of GRIB code and fields.
+C
+C Comments.
+C ---------
+C
+C Subroutine contains section 0 - 2 , and section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 09/05/88
+C
+C Modifications.
+C --------------
+C
+C None
+C
+C ------------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C* SECTION 0 . DEFINITION OF VARIABLES.
+C ------------------------------------------------------------------
+C
+ IMPLICIT LOGICAL ( L , O , G )
+ IMPLICIT CHARACTER*8 ( C , H , Y )
+ IMPLICIT INTEGER ( I , J , K , M , N)
+C
+ DIMENSION KGRIB(KLENB)
+ DIMENSION PDATA(KDATA)
+ DIMENSION KI(KDATA)
+ DIMENSION KJ(KDATA)
+ DIMENSION IB1PAR(18)
+ DIMENSION IB2PAR(12)
+ DIMENSION IBLOCK(24)
+C
+ EQUIVALENCE (ZGRIB,JGRIB)
+C
+C SET MAXIMUM NUMBER OF BITS PER DATA FIELD.
+C
+ DATA IMAX /60/
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 1 . SKIP DOWN THROUGH GRIB SECTION TO GET TO DATA SECTION.
+C ------------------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+C BLOCK 0 - INDICATOR BLOCK.
+C
+C SKIP 4 OCTETS CONTAINING ASCII G R I B .
+C
+ IWORD = 1
+ IOFF = 0
+ IBYTE = 8
+ IVAL = 4
+C
+ CALL OFFSET (IOFF,IVAL,IWORD,IBYTE,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+C
+C BLOCK 1 - PRODUCT DEFINITION BLOCK.
+C
+C EXTRACT FIRST 4 OCTETS OF BLOCK 1.
+C
+ IVAL = 4
+C
+ CALL GBYTES (KGRIB(IWORD),IBLOCK(1),IOFF,IBYTE,0,IVAL)
+ CALL OFFSET (IOFF,IVAL,IWORD,IBYTE,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+C
+C IF THESE OCTETS DO NOT CONTAIN 0, 0, 24 AND 0 RESPECTIVELY
+C THEN THE DATA IS IN THE OLD VERSION OF THE CODE.
+C
+ IF (IBLOCK(1).EQ.0.AND.IBLOCK(2).EQ.0.AND.IBLOCK(3).EQ.24.
+ C AND.IBLOCK(4).EQ.0)
+ C THEN
+ ISNEW = 1
+ IVAL = 20
+ ELSE
+ ISNEW = 0
+ IVAL = 16
+ ENDIF
+C
+C EXTRACT NEXT 16 OR 20 OCTETS OF BLOCK 1 - NUMBER DEPENDS
+C ON VERSION OF CODE.
+C
+ CALL GBYTES (KGRIB(IWORD),IBLOCK(5),IOFF,IBYTE,0,IVAL)
+ CALL OFFSET (IOFF,IVAL,IWORD,IBYTE,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+C
+C TRANSFER PRODUCT DEFINITION INFORMATION.
+C
+ DO 1100 J1100=1,17
+ IB1PAR(J1100) = IBLOCK(J1100+4*ISNEW)
+ 1100 CONTINUE
+C
+C BLOCK 2 - GRID DESCRIPTION BLOCK.
+C
+C CHECK FLAG INDICATING IF BLOCK 2 IS INCLUDED IN CODE.
+C
+C INC IS SET TO 1 , IF BLOCK 2 IS INCLUDED.
+C
+ INC = 0
+C
+C
+ IF (ISNEW.EQ.0)
+ C THEN
+C OLD VERSION OF CODE
+C
+C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE
+C
+C NONE 00000000 0
+C 2 00000001 1
+C 3 00000010 2
+C 2 AND 3 00000011 3
+C
+ IF (IB1PAR(4).EQ.1.OR.IB1PAR(4).EQ.3) INC = 1
+ ELSE
+C NEW VERSION
+C
+C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE
+C
+C NONE 00000000 0
+C 2 10000000 128
+C 3 01000000 64
+C 2 AND 3 11000000 192
+C
+ IF (IB1PAR(4).EQ.128.OR.IB1PAR(4).EQ.192) INC = 1
+ ENDIF
+C
+ IF (INC.EQ.1)
+ C THEN
+C
+C
+C LENGTH OF GRID DESCRIPTION BLOCK.
+C
+ CALL GBYTE (KGRIB(IWORD),IBLK2,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+C
+ ILENV = (IBLK2 - 32) / 4
+C
+C NUMBER OF UNUSED BITS AND RESERVED BYTE SKIPPED.
+C
+ CALL OFFSET (IOFF,2,IWORD,8,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+C
+C DATA REPRESENTATION TYPE.
+C
+ CALL GBYTE (KGRIB(IWORD),IB2PAR(1),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+C
+C CHECK FOR GAUSSIAN OR LAT/LONG GRID.
+C
+ IF (IB2PAR(1).NE.0.AND.IB2PAR(1).NE.4)
+ C THEN
+ KERR = -1
+ GO TO 9000
+ ENDIF
+C
+C NUMBER OF LATITUDE AND LONGITUDE POINTS.
+C
+ CALL GBYTES (KGRIB(IWORD),IB2PAR(2),IOFF,16,0,2)
+ CALL OFFSET (IOFF,2,IWORD,16,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+C
+C LAT/LONG OF ORIGIN SKIPPED.
+C
+ CALL OFFSET (IOFF,2,IWORD,24,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+C
+C RESOLUTION FLAG SKIPPED.
+C
+ CALL OFFSET (IOFF,1,IWORD,8,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+C
+C LAT/LONG OF EXTREME POINT SKIPPED.
+C
+ CALL OFFSET (IOFF,2,IWORD,24,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+C
+C DIRECTION INCREMENTS/ NO. OF LATITUDE LINES SKIPPED.
+C
+ CALL OFFSET (IOFF,2,IWORD,16,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+C
+C SCANNING MODE FLAG SKIPPED.
+C
+ CALL OFFSET (IOFF,1,IWORD,8,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+C
+C 4 RESERVED OCTETS SKIPPED.
+C
+ CALL OFFSET (IOFF,4,IWORD,8,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+C
+ ENDIF
+C
+C
+C
+C
+C BLOCK 3 - BIT MAP BLOCK.
+C
+C INC IS SET TO 1 , IF BLOCK 3 IS INCLUDED.
+C
+ INC = 0
+C
+C
+ IF (ISNEW.EQ.0)
+ C THEN
+C OLD VERSION OF CODE
+C
+C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE
+C
+C NONE 00000000 0
+C 2 00000001 1
+C 3 00000010 2
+C 2 AND 3 00000011 3
+C
+ IF (IB1PAR(4).EQ.2.OR.IB1PAR(4).EQ.3) INC = 1
+ ELSE
+C NEW VERSION
+C
+C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE
+C
+C NONE 00000000 0
+C 2 10000000 128
+C 3 01000000 64
+C 2 AND 3 11000000 192
+C
+ IF (IB1PAR(4).EQ.64.OR.IB1PAR(4).EQ.192) INC = 1
+ ENDIF
+C
+ IF (INC.EQ.1)
+ C THEN
+ CALL GBYTE (KGRIB(IWORD),IBLK3,IOFF,24)
+ CALL OFFSET (IOFF,IBLK3,IWORD,8,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 2. EXTRACT PACKED INCREMENTS AND CALCULATE VALUES.
+C ------------------------------------------------------------------
+C
+ 2000 CONTINUE
+C
+C BLOCK 4 - BINARY DATA BLOCK.
+C SKIP LENGTH OF BINARY DATA BLOCK.
+C
+ CALL OFFSET (IOFF,1,IWORD,24,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+C
+C
+C 4 BIT FLAG / 4 BIT COUNT OF UNUSED BITS AT END OF BLOCK OCTET.
+C
+ CALL OFFSET (IOFF,1,IWORD,8,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+C
+C
+C GET SCALE FACTOR
+C
+ CALL GBYTE (KGRIB(IWORD),JSCALE,IOFF,16)
+ CALL OFFSET (IOFF,1,IWORD,16,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+C
+ ISCALE = JSCALE
+ IF (JSCALE.GE.32768)
+ C THEN
+ ISCALE = ISCALE - 32768
+ ISCALE = - ISCALE
+ ENDIF
+C
+C
+C
+C
+C GET REFERENCE VALUE (FMIN) IN GRIB FORMAT (IEXP,IMANT)
+C
+C
+ CALL GBYTE (KGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+ CALL GBYTE (KGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+C
+C
+C CHECK FOR MISSING DATA INDICATORS.
+C
+ IMISS = 0
+ IF (JSCALE.EQ.65535.AND.IEXP.EQ.255.AND.IMANT.EQ.16777215)
+ C IMISS = 1
+C
+C CONVERT REFERENCE VALUE AND SCALE FACTOR.
+C
+ IF (IMISS.EQ.0)
+ C THEN
+ CALL DECFP (FMIN,IEXP,IMANT)
+ ZSCALE = 2.**ISCALE
+ ENDIF
+C
+C
+C
+C
+C GET NUMBER OF BITS IN EACH DATA VALUE.
+C
+ CALL GBYTE (KGRIB(IWORD),IBITS,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+C
+C
+C CHECK NUMBER OF BITS PER DATA FIELD.
+C
+ IF (IBITS.GT.KBIT.OR.IBITS.GT.IMAX)
+ C THEN
+ KERR = -1
+ WRITE (*,9001) IBITS,KBIT,IMAX
+ GO TO 9000
+ ENDIF
+C
+C
+C
+C
+C DECODE DATA VALUES TO FLOATING POINT.
+C
+ IPW = IWORD
+ IPB = IOFF
+C
+ DO 2100 J2100 = 1,KDATA
+ IWORD = IPW
+ IOFF = IPB
+ ILENF = (KI(J2100)-1) * IB2PAR(2) + KJ(J2100) - 1
+ CALL OFFSET (IOFF,ILENF,IWORD,IBITS,KBIT,KLENB,KERR)
+ IF (KERR.NE.0) GO TO 9000
+ CALL GBYTE (KGRIB(IWORD),IDATA,IOFF,IBITS)
+ PDATA(J2100) = FMIN + IDATA * ZSCALE
+ 2100 CONTINUE
+C
+ IF (IMISS.EQ.0) GO TO 9000
+C
+ DO 2200 J2200 = 1,KDATA
+ PDATA(J2200) = 0.0
+ 2200 CONTINUE
+C
+C
+C
+C* SECTION 9. FORMAT STATEMENTS. RETURN.
+C ------------------------------------------------------------------
+C
+ 9000 CONTINUE
+C
+ 9001 FORMAT (1H ,'NUMBER OF BITS PER DATA VALUE, ',I3,
+ C 'EXCEEDS WORD LENGTH, ',I3,' OR MAXIMUM ',
+ C ' PERMITTED VALUE, ',I3)
+ RETURN
+C
+ END
diff --git a/gribex/decfp.F b/gribex/decfp.F
new file mode 100755
index 0000000..230274e
--- /dev/null
+++ b/gribex/decfp.F
@@ -0,0 +1,59 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE DECFP (FVAL,IEXP,IMANT)
+C---->
+C
+C*
+C* NAME : DECFP
+C*
+C* FUNCTION : DECODE GRIB CODE REPRESENTATION TO
+C* FLOATING POINT NUMBER.
+C*
+C* INPUT : IEXP - 8 BIT SIGNED EXPONENT
+C* IMANT - 24 BIT MANTISSA
+C*
+C* OUTPUT : FVAL - FLOATING POINT NUMBER
+C* IEXP - UNCHANGED
+C* IMANT - UNCHANGED
+C*
+C* JOHN HENNESSY , ECMWF , 15TH APRIL 1985
+C*
+C ---------------------------------------------------------------
+C----<
+C
+C
+ IF (IEXP.EQ.128.AND.IMANT.EQ.0)
+ C THEN
+ FVAL = 0.0
+ RETURN
+ ENDIF
+C
+C
+C
+C SIGN OF VALUE
+C
+ JEXP = IEXP
+ ISIGN = 1
+C
+ IF (JEXP.GE.128)
+ C THEN
+ JEXP = JEXP - 128
+ ISIGN = -1
+ END IF
+C
+C DECODE VALUE.
+C
+ FVAL = ISIGN*2.**(-24)*IMANT*16.**(JEXP-64)
+C
+C
+ RETURN
+ END
diff --git a/gribex/decfp2.F b/gribex/decfp2.F
new file mode 100755
index 0000000..6ce07e2
--- /dev/null
+++ b/gribex/decfp2.F
@@ -0,0 +1,177 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE DECFP2 (PVAL,KEXP,KMANT)
+C
+C---->
+C**** DECFP2 - GRIB representation to floating point representation.
+C
+C Purpose.
+C --------
+C
+C Convert GRIB representation of a floating point
+C number to machine representation.
+C
+C** Interface.
+C ----------
+C
+C CALL DECFP2 (PVAL,KEXP,KMANT)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KEXP - 8 Bit signed exponent.
+C
+C KMANT - 24 Bit mantissa.
+C
+C Output Parameters.
+C -----------------
+C
+C PVAL - Floating point number represented
+C by KEXP and KMANT.
+C
+C
+C Method.
+C -------
+C
+C Floating point number represented as 8 bit exponent
+C and 24 bit mantissa in integer values converted to
+C machine floating point format.
+C
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes re GRIB representation.
+C
+C
+C Comments.
+C ---------
+C
+C Rewritten from DECFP, to conform to programming standards.
+C Sign bit on 0 value now ignored, if present.
+C If using 32 bit reals, check power of 16 is not so small as to
+C cause overflows (underflows!); this causes warning to be given
+C on Fujitsus.
+C
+C
+C Author.
+C -------
+C
+C John Hennessy ECMWF 18.06.91
+C
+C
+C Modifications.
+C --------------
+C
+C J.D.Chambers ECMWF 1 Aug 1996
+C Add check power that power of 16 is not so small as to cause
+C overflows.
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0 . Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+#include "grbcom.h"
+C
+C Subroutine arguments
+C
+ REAL PVAL
+ INTEGER KEXP, KMANT
+C
+C Local variables.
+C
+ INTEGER IEXP, ISIGN
+ LOGICAL LDEBUG
+C
+C -----------------------------------------------------------------
+C* Section 1 . Convert value of 0.0. Ignore sign bit.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ LDEBUG = (NDBG.GT.1)
+C
+ IF( LDEBUG )
+ X WRITE(GRPRSM,*) 'DECFP2: KEXP = ',KEXP,'. KMANT = ',KMANT
+C
+Cjdc IF ( (KEXP.EQ.128.OR.KEXP.EQ.0).AND.KMANT.EQ.0) THEN
+ IF( ((KEXP.EQ.128).OR.
+ X (KEXP.EQ.0) .OR.
+ X (KEXP.EQ.255) )) THEN
+ PVAL = 0.0
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 2 . Convert other values.
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Sign of value.
+C
+ IEXP = KEXP
+ ISIGN = 1
+C
+C Set sign of exponent
+C
+ IF (IEXP.GE.128) THEN
+ IEXP = IEXP - 128
+ ISIGN = -1
+ END IF
+C
+C Decode value.
+C
+#if (defined REAL_8) || (defined CRAY)
+ PVAL = ISIGN*2.**(-24)*KMANT*16.**(IEXP-64)
+C ---------
+C `---> this matchs/compensates for (IEXP-70)
+C in confp3.F (instead of (IEXP-64))
+#else
+C If using 32 bit reals, check power of 16 is not so small as to
+C cause overflows (underflows!); this causes warning to be given
+C on Fujitsus.
+C
+ IF(IEXP.GT.32) THEN
+ PVAL = ISIGN*2.**(-24)*KMANT*16.**(IEXP-64)
+ ELSE
+ PVAL = 0.0
+ ENDIF
+#endif
+ IF( LDEBUG ) THEN
+ WRITE(GRPRSM,*) 'DECFP2: Values used for final calculation'
+ WRITE(GRPRSM,*)
+ X 'DECFP2: IEXP=',IEXP,'.ISIGN=',ISIGN,'.KMANT=',KMANT
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( LDEBUG ) WRITE(GRPRSM,*) 'DECFP2: Returned value = ', PVAL
+C
+ RETURN
+ END
diff --git a/gribex/decogb.F b/gribex/decogb.F
new file mode 100755
index 0000000..75841e1
--- /dev/null
+++ b/gribex/decogb.F
@@ -0,0 +1,390 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE DECOGB (FPDATA,ILENF,IBITS,NBIT,IB1PAR,
+ C IB2PAR,FVERT,ILENV,IGRIB,ILENG,IWORD,
+ C JLENV,JLENF,IERR)
+C
+C---->
+C**** DECOGB - Interface using GRIBEX to decode GRIB format data.
+C
+C Purpose.
+C --------
+C
+C Provides a compatible interface between the old (DECOGB)
+C and new (GRIBEX) GRIB decoding software.
+C
+C GRIB Code Edition Number 0 has been in use at ECMWF since
+C the end of 1985. GRIB Code Edition Number 1 came into use
+C with the introduction of the T213 model, which uses a
+C quasi-regular Gaussian grid for surface fields.
+C
+C This interface decodes GRIB Code Edition Number 1 in
+C Edition 0 format and converts the quasi-regular Gaussian
+C grid to a regular grid. When this conversion is done, no
+C West/East increment is included in IB2PAR(9). The increment
+C must be calculated ie ZEWINC = 360.0 / IB2PAR(2). For
+C Gaussian N160 data the increment is .5625 and this
+C cannot be accurately represented in the required units
+C of millidegrees for IB2PAR(9).
+C
+C** Interface.
+C ---------
+C
+C CALL DECOGB (FPDATA,ILENF,IBITS,NBIT,IB1PAR,
+C C IB2PAR,FVERT,ILENV,IGRIB,ILENG,IWORD,
+C C JLENV,JLENF,IERR)
+C
+C Input Parameters.
+C -----------------
+C
+C NBIT - Number of bits in computer word
+C
+C IGRIB - Integer array containing data in grib code.
+C ILENG - Length of array IGRIB.
+C
+C FVERT - Real array to receive vertical coordinate
+C parameters.
+C ILENV - Length of array FVERT.
+C
+C FPDATA - Real array to receive decoded data values.
+C ILENF - Length of array FPDATA.
+C
+C !!!!! If this is 1 only
+C the product and grid definition sections
+C are decoded. !!!!!
+C
+C IB1PAR - Integer array (dimension 18) to receive
+C product definition information.
+C
+C IB2PAR - Integer array (dimension 11) to receive grid
+C definition information.
+C
+C Output Parameters.
+C -----------------
+C
+C Parameters from section 1 , product definition section
+C ------------------------------------------------------
+C
+C IB1PAR - Integer array (dimension 18) of product
+C definition information.
+C
+C Word Contents
+C ---- --------
+C 1 Originating centre identifier.
+C 2 Model identification.
+C 3 Grid definition.
+C 4 Flag ( Code Table 1)
+C 5 Parameter identifier ( Code Table 2 ).
+C 6 Type of level (Code Table 3).
+C 7-8 Value(s) of levels (Code Table 3).
+C 9 Year of data
+C 10 Month of data
+C 11 Day of data
+C 12 Hour of data
+C 13 Minute of data
+C 14 Time unit (Code Table 4).
+C 15 Time range one
+C 16 Time range two
+C 17 Time range flag (Code Table 5).
+C 18 Number averaged.
+C
+C Value(s) of level can occupy 2 words.
+C For a layer the first word defines the top
+C and the second the bottom of the layer.
+C For a single level, only the first word is
+C used.
+C
+C Parameters from section 2 , grid definition section.
+C -----------------------------------------------
+C
+C IB2PAR - Integer array (dimension 11) containing grid
+C definition information.
+C Use varies with data representation type.
+C
+C Word Latitude/longitude grid
+C ---- -----------------------
+C 1 Data representation type (Code Table 6).
+C 2 Number of points along a latitude
+C 3 Number of points along a meridian.
+C 4 Latitude of origin (South is negative).
+C 5 Longitude of origin (West is negative).
+C 6 Resolution flag. (Code Table 7)
+C 7 Latitude of extreme point (South negative).
+C 8 Longitude of extreme point (West negative).
+C 9 West/East increment
+C 10 North/South increment
+C 11 Scanning mode flags (Code Table 8)
+C
+C Word Gaussian grid
+C ---- -------------
+C 1-9 As for latitude/longitude grid.
+C 10 The number of latitude lines between a pole
+C and the equator.
+C 11 Scanning mode flags (Code Table 8)
+C
+C Word Spherical harmonics
+C ---- -------------------
+C 1 Data representation type (Code Table 6)
+C 2 J - pentagonal resolution parameter
+C 3 K - pentagonal resolution parameter
+C 4 M - pentagonal resolution parameter
+C 5 Representation type (Code Table 9)
+C 6 Representation mode (Code Table 10)
+C 7-11 not used
+C
+C
+C Use for other data representation types is
+C
+C FVERT - Real array of vertical coordinate parameters
+C JLENV - Number of values in this array.
+C
+C Used for hybrid levels only.
+C
+C Parameters from section 3 , bit-map definition section
+C --------------------------------------------------
+C
+C Not handled by this routine.
+C
+C Parameters from section 4 , binary data section.
+C -------------------------------------------
+C
+C FPDATA - Array of floating point values.
+C JLENF - Number of values in this array.
+C JLENF is negative if missing data coded
+C
+C IBITS - Number of bits for coded data values.
+C
+C IWORD - Number of words decoded.
+C
+C IERR - Error indicator.
+C
+C 0, No error.
+C
+C -5, Bit-map not yet catered for.
+C
+C -6, Vertical coordinate parameter array
+C too small.
+C
+C Other error codes as for GRIBEX.
+C
+C Method.
+C -------
+C
+C Subroutine GRIBEX, which can decode all editions of the
+C GRIB code, is called for the actual decoding. Sections
+C 1 and 2 information is then put in Edition Number 0
+C format, and any quasi-regular Gaussian grid transformed
+C into a regular grid.
+C
+C Externals.
+C ----------
+C
+C GRIBEX
+C QU2REG
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes for GRIB code definition.
+C
+C Comments.
+C ---------
+C
+C Parameter names do not conform to current programming
+C conventions, but are the same as in the old DECOGB routine.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18.06.91
+C
+C Modifications.
+C -------------
+C
+C J. Hennessy ECMWF 19.06.91
+C Fix to accommodate analysis section's incorrect
+C use of old DECOGB.
+C
+C J. Hennessy ECMWF 26.06.91
+C Check on size of vertical coordinate parameters array
+C added. T213 model has 12 extra levels.
+C
+C -----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ DIMENSION ISEC0(2)
+ DIMENSION ISEC1(32)
+ DIMENSION ISEC2(512)
+ DIMENSION ISEC3(2)
+ DIMENSION ISEC4(64)
+C
+ DIMENSION ZSEC2(128)
+ DIMENSION ZSEC3(2)
+C
+ CHARACTER*1 YOPER
+C
+ DIMENSION FPDATA(*)
+ DIMENSION FVERT(*)
+ DIMENSION IGRIB(*)
+ DIMENSION IB1PAR(18)
+ DIMENSION IB2PAR(11)
+C
+C -----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1. Decode data and convert to Edition 0 format.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IERR = 0
+C
+C Decode sections 1 and 2 or all sections, as required.
+C
+ YOPER = 'Z'
+C
+C Fix for incorrect usage of old DECOGB by analysis section, who
+C have always called DECOGB with ILENF equal to 0, when they
+C should have used 1. They got away with it with the old DECOGB
+C because sections 1 and 2 were decoded before the error in the
+C parameter was discovered, and they never checked the return code.
+C
+ IF (ILENF.EQ.0) ILENF = 1
+C
+ IF (ILENF.EQ.1) YOPER = 'I'
+ IERX = 1
+ CALL GRIBEX (ISEC0,ISEC1,ISEC2,ZSEC2,ISEC3,ZSEC3,ISEC4,
+ C FPDATA,ILENF,IGRIB,ILENG,IWORD,YOPER,IERX)
+C
+ IERR = IERX
+C
+C Bit map not catered for by DECOGB arguments.
+C
+ IF (IERR.EQ.-5) WRITE (*,9001)
+C
+C Error encountered.
+C
+ IF (IERR.GT.0) GO TO 900
+C
+C Transfer information to DECOGB arguments.
+C
+ JLENF = ISEC4(1)
+ IBITS = ISEC4(2)
+ JLENV = ISEC2(12)
+C
+C Section 1.
+C
+ DO 110 J110 = 1,18
+ IB1PAR(J110) = ISEC1(J110+1)
+ 110 CONTINUE
+C
+C Section 2.
+C
+ DO 111 J111 = 1,11
+ IB2PAR(J111) = ISEC2(J111)
+ 111 CONTINUE
+C
+C Go to section 9, if pseudo-GRIB data.
+C
+ IF (IB1PAR(5).EQ.127.OR.IB1PAR(5).EQ.128)
+ C THEN
+ WRITE (*,9002) IB1PAR(5)
+ GO TO 900
+ ENDIF
+C
+C Check size of vertical coordinate parameter array.
+C
+ IF (JLENV.GT.ILENV)
+ C THEN
+ IERR = -6
+ WRITE (*,9003) JLENV , ILENV
+ GO TO 900
+ ENDIF
+C
+C Vertical coordinate parameters, if any,
+C
+ DO 112 J112 = 1,JLENV
+ FVERT(J112) = ZSEC2(J112+10)
+ 112 CONTINUE
+C
+C Go to section 9, if decoding of sections 1 and 2 only.
+C
+ IF (YOPER.EQ.'I')
+ C THEN
+ IF (ISEC2(1).NE.4) GO TO 900
+ IF (ISEC2(17).EQ.1) IB2PAR(2) = 4 * ISEC2(10)
+ GO TO 900
+ ENDIF
+C
+C If quasi-regular Gaussian grid, convert to regular and
+C adjust section 1 and 2 information accordingly.
+C
+ IF (ISEC2(1).NE.4) GO TO 900
+C
+ IF (ISEC2(17).EQ.1)
+ C THEN
+ INOLAT = ISEC2(10) * 2
+ INOLNG = ISEC2(10) * 4
+ CALL QU2REG (FPDATA,ISEC2(23),INOLAT,INOLNG,1)
+ JLENF = INOLAT * INOLNG
+ IB2PAR(2) = 4 * ISEC2(10)
+ ENDIF
+C
+C -----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9. Return to calling routine. Format statements.
+C -----------------------------------------------------------------
+
+C
+ 900 CONTINUE
+C
+ 9001 FORMAT (1H ,'DECOGB : Bit map not catered for.')
+C
+ 9002 FORMAT (1H ,'DECOGB : Pseudo-GRIB field number ',I3)
+C
+ 9003 FORMAT (1H ,'DECOGB : ',I3,' vertical coordinate parameters, ',
+ C 'but array size is only ',I3,'.')
+C
+ RETURN
+C
+ END
diff --git a/gribex/decogc.F b/gribex/decogc.F
new file mode 100755
index 0000000..4246c51
--- /dev/null
+++ b/gribex/decogc.F
@@ -0,0 +1,912 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE DECOGC (FPDATA,ILENF,IBITS,NBIT,IB1PAR,IB2PAR,
+ C IB3PAR,FVERT,ILENV,IGRIB,ILENG,IWORD,
+ C JLENV,JLENF,IBVAL,IBLEN,IBMAP,IERR)
+C
+C
+C
+C---->
+C*
+C* NAME : DECOGC
+C*
+C* FUNCTION : DECODE WMO GRIB CODED DATA.
+C*
+C* INPUT : NBIT - NUMBER OF BITS IN COMPUTER WORD
+C*
+C* IGRIB - INTEGER ARRAY CONTAINING DATA IN GRIB CODE.
+C* ILENG - LENGTH OF ARRAY IGRIB.
+C*
+C* FVERT - REAL ARRAY TO RECEIVE VERTICAL COORDINATE
+C* PARAMETERS.
+C* ILENV - LENGTH OF ARRAY FVERT.
+C*
+C* FPDATA - REAL ARRAY TO RECEIVE DECODED DATA VALUES.
+C* ILENF - LENGTH OF ARRAY FPDATA.
+C*
+C* ***** IF THIS IS 1 ONLY
+C* THE PRODUCT AND GRID DEFINITION BLOCKS
+C* ARE DECODED. *****
+C*
+C* IB1PAR - INTEGER ARRAY (DIMENSION 18) TO RECEIVE
+C* PRODUCT DEFINITION INFORMATION.
+C*
+C* IB2PAR - INTEGER ARRAY (DIMENSION 11) TO RECEIVE GRID
+C* DEFINITION INFORMATION.
+C*
+C* OUTPUT : PARAMETERS FROM BLOCK 1 , PRODUCT DEFINITION BLOCK.
+C* --------------------------------------------------
+C* IB1PAR - INTEGER ARRAY (DIMENSION 18) OF PRODUCT
+C* DEFINITION INFORMATION.
+C*
+C* WORD CONTENTS
+C* ---- --------
+C* 1 ORIGINATING CENTRE IDENTIFIER.
+C* 2 MODEL IDENTIFICATION.
+C* 3 GRID DEFINITION.
+C* 4 FLAG ( CODE TABLE 1)
+C* 5 PARAMETER IDENTIFIER ( CODE TABLE 2 ).
+C* 6 TYPE OF LEVEL (CODE TABLE 3).
+C* 7-8 VALUE(S) OF LEVELS (CODE TABLE 3).
+C* 9 YEAR OF DATA
+C* 10 MONTH OF DATA
+C* 11 DAY OF DATA
+C* 12 HOUR OF DATA
+C* 13 MINUTE OF DATA
+C* 14 TIME UNIT (CODE TABLE 4).
+C* 15 TIME RANGE ONE
+C* 16 TIME RANGE TWO
+C* 17 TIME RANGE FLAG (CODE TABLE 5).
+C* 18 NUMBER AVERAGED.
+C*
+C* VALUE(S) OF LEVEL CAN OCCUPY 2 WORDS..
+C* FOR A LAYER THE FIRST WORD DEFINES THE TOP
+C* AND THE SECOND THE BOTTOM OF THE LAYER.
+C* FOR A SINGLE LEVEL, ONLY THE FIRST WORD IS
+C* USED.
+C*
+C* PARAMETERS FROM BLOCK 2 , GRID DEFINITION BLOCK.
+C* -----------------------------------------------
+C* IB2PAR - INTEGER ARRAY (DIMENSION 11) CONTAINING GRID
+C* DEFINITION INFORMATION.
+C* USE VARIES WITH DATA REPRESENTATION TYPE.
+C*
+C* WORD LAT/LONG GRID
+C* ---- -------------
+C* 1 DATA REPRESENTATION TYPE (CODE TABLE 6).
+C* 2 NO. OF POINTS ALONG A LATITUDE
+C* 3 NO. OF POINTS ALONG A MERIDIAN.
+C* 4 LATITUDE OF ORIGIN (SOUTH - IVE).
+C* 5 LONGITUDE OF ORIGIN (WEST - IVE).
+C* 6 RESOLUTION FLAG. (CODE TABLE 7)
+C* 7 LATITUDE OF EXTREME POINT (SOUTH - IVE).
+C* 8 LONGITUDE OF EXTREME POINT (WEST - IVE).
+C* 9 LATITUDE INCREMENT
+C* 10 LONGITUDE INCREMENT
+C* 11 SCANNING MODE FLAGS (CODE TABLE 8)
+C*
+C* WORD GAUSSIAN GRID
+C* ---- -------------
+C* 1-9 AS FOR LAT/LONGITUDE GRID.
+C* 10 THE NUMBER OF LATITUDE LINES BETWEEN A POLE
+C* AND THE EQUATOR.
+C* 11 SCANNING MODE FLAGS (CODE TABLE 8)
+C*
+C* WORD SPHERICAL HARMONICS
+C* ---- -------------------
+C* 1 DATA REPRESENTATION TYPE (CODE TABLE 6)
+C* 2 J - PENTAGONAL RESOLUTION PARAMETER
+C* 3 K - PENTAGONAL RESOLUTION PARAMETER
+C* 4 M - PENTAGONAL RESOLUTION PARAMETER
+C* 5 REPRESENTATION TYPE (CODE TABLE 9)
+C* 6 REPRESENTATION MODE (CODE TABLE 10)
+C* 7-11 NOT USED
+C*
+C*
+C* USE FOR OTHER DATA REPRESENTATION TYPES IS
+C*
+C* FVERT - REAL ARRAY OF VERTICAL COORDINATE PARAMETERS
+C* JLENV - NUMBER OF VALUES IN THIS ARRAY.
+C*
+C* USED FOR HYBRID LEVELS ONLY.
+C*
+C* PARAMETERS FROM BLOCK 3 , BIT-MAP DEFINITION BLOCK.
+C* --------------------------------------------------
+C*
+C* IBMAP - ARRAY (DIMENSION IBLEN) CONTAINING BIT MA
+C* IBLEN - NUMBER OF WORDS IN ARRAY IBMAP.
+C* IBVAL - NUMBER OF VALUES ON THIS ARRAY.
+C* IB3PAR(1) - CATALOG NUMBER OF BIT-MAP.
+C*
+C*
+C* PARAMETERS FROM BLOCK 4 , BINARY DATA BLOCK.
+C* -------------------------------------------
+C* FPDATA - ARRAY OF FLOATING POINT VALUES.
+C* JLENF - NUMBER OF VALUES IN THIS ARRAY.
+C* JLENF IS NEGATIVE IF MISSING DATA CODED
+C*
+C* IBITS - NUMBER OF BITS FOR CODED DATA VALUES.
+C*
+C* IWORD - NUMBER OF WORDS DECODED.
+C*
+C* IERR - ERROR INDICATOR.
+C*
+C* 0, NO ERROR.
+C*
+C* -1, NUMBER OF BITS PER DATA VALUE EXCEEDS
+C* WORD LENGTH, OR MAXIMUM ALLOWED.
+C* -2, INPUT ARRAY HOLDS FEWER CODED VALUES
+C* THAN EXPECTED.
+C* -3, OUTPUT ARRAY TOO SMALL TO HOLD DECODED
+C* DATA VALUES.
+C* -4, CURRENTLY UNDEFINED OPTION SELECTED.
+C*
+C* 1, NO BLOCK 5 FOUND.
+C*
+C* GENERAL : DECOGC CALLS GBYTE
+C* GBYTES
+C* OFFSET
+C* DECFP
+C* SBYTE
+C*
+C*
+C ---------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+ DIMENSION FPDATA(ILENF),FVERT(ILENV)
+ DIMENSION IBLOCK(24),IGRIB(ILENG)
+ DIMENSION IB1PAR(18),IB2PAR(11),IB3PAR(2),ILAT(2)
+C
+ DIMENSION IBMAP(IBLEN)
+C
+ EQUIVALENCE (ZGRIB,JGRIB)
+C
+C SET MAXIMUM NUMBER OF BITS PER DATA FIELD.
+C
+ DATA IMAX /64/
+C
+ IERR = 0
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 0 - INDICATOR BLOCK.
+C*
+C********************************************************************
+C
+C
+C EXTRACT 4 OCTETS CONTAINING ASCII G R I B .
+C
+ IWORD = 1
+ IOFF = 0
+ IBYTE = 8
+ NVAL = 4
+C
+ CALL GBYTES (IGRIB(1),IBLOCK(1),0,IBYTE,0,NVAL)
+ CALL OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 1 - PRODUCT DEFINITION BLOCK.
+C*
+C********************************************************************
+C
+C
+C EXTRACT FIRST 4 OCTETS OF BLOCK 1.
+C
+ NVAL = 4
+C
+ CALL GBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,IBYTE,0,NVAL)
+ CALL OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C IF THESE OCTETS DO NOT CONTAIN 0, 0, 24 AND 0 RESPECTIVELY
+C THEN THE DATA IS IN THE OLD VERSION OF THE CODE.
+C
+ IF (IBLOCK(1).EQ.0.AND.IBLOCK(2).EQ.0.AND.IBLOCK(3).EQ.24.
+ C AND.IBLOCK(4).EQ.0)
+ C THEN
+ ISNEW = 1
+ NVAL = 20
+ ELSE
+ ISNEW = 0
+ NVAL = 16
+ ENDIF
+C
+C EXTRACT NEXT 16 OR 20 OCTETS OF BLOCK 1 - NUMBER DEPENDS
+C ON VERSION OF CODE.
+C
+ CALL GBYTES (IGRIB(IWORD),IBLOCK(5),IOFF,IBYTE,0,NVAL)
+ CALL OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C TRANSFER PRODUCT DEFINITION INFORMATION TO OUTPUT ARRAY.
+C EXCEPT FOR NUMBER AVERAGED.
+C
+ DO 100 I=1,17
+ IB1PAR(I) = IBLOCK(I+4*ISNEW)
+ 100 CONTINUE
+C
+C
+C
+C
+C NUMBER AVERAGED OCCUPIES 2 OCTETS.
+C
+ IB1PAR(18) = IBLOCK(18+4*ISNEW) * 256 + IBLOCK(19+4*ISNEW)
+C
+C
+C
+C
+C
+C***
+C* DESCRIPTION OF LEVEL OR LAYER ( CODE TABLE 3 ).
+C***
+C
+C CERTAIN LEVEL TYPES REQUIRE THAT THE DESCRIPTION OCCUPY
+C BOTH 8 BIT FIELDS. PUT SINGLE VALUE IN FIRST LEVEL WORD.
+C
+ KTEMP = 32 + (ISNEW*224)
+ IF (IB1PAR(6).EQ.100.OR.IB1PAR(6).EQ.103.OR.IB1PAR(6).EQ.105.
+ C OR.IB1PAR(6).EQ.107.OR.IB1PAR(6).EQ.109)
+ C THEN
+ IB1PAR(7) = IB1PAR(7) * KTEMP + IB1PAR(8)
+ IB1PAR(8) = 0
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* TIME RANGE.
+C***
+C
+C ONE TIME RANGE CAN OCCUPY TWO OCTETS.
+C
+ IF (IB1PAR(17).EQ.10)
+ C THEN
+ IB1PAR(15) = IB1PAR(15) * KTEMP + IB1PAR(16)
+ IB1PAR(16) = 0
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 2 - GRID DESCRIPTION BLOCK.
+C*
+C********************************************************************
+C
+C***
+C* CHECK FLAG INDICATING IF BLOCK 2 IS INCLUDED IN CODE.
+C***
+C
+C INC IS SET TO 1 , IF BLOCK 2 IS INCLUDED.
+C
+ INC = 0
+C
+C
+ IF (ISNEW.EQ.0)
+ C THEN
+C OLD VERSION OF CODE
+C
+C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE
+C
+C NONE 00000000 0
+C 2 00000001 1
+C 3 00000010 2
+C 2 AND 3 00000011 3
+C
+ IF (IB1PAR(4).EQ.1.OR.IB1PAR(4).EQ.3) INC = 1
+ ELSE
+C NEW VERSION
+C
+C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE
+C
+C NONE 00000000 0
+C 2 10000000 128
+C 3 01000000 64
+C 2 AND 3 11000000 192
+C
+ IF (IB1PAR(4).EQ.128.OR.IB1PAR(4).EQ.192) INC = 1
+ ENDIF
+C
+ IF (INC.EQ.1)
+ C THEN
+C
+C
+C***
+C* LENGTH OF GRID DESCRIPTION BLOCK.
+C***
+C
+ CALL GBYTE (IGRIB(IWORD),LBLK,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C LENGTH IS 32 OCTETS FOR LAT/LONG, GAUSSIAN AND SPHERICAL
+C HARMONICS . FOR ANY DATA ON HYBRID LEVELS THE
+C VERTICAL COORDINATES ARE ADDED.
+C GET NUMBER OF VERTICAL COORDINATE PARAMETERS, IF ANY.
+C
+ JLENV = (LBLK - 32) / 4
+ IF(ILENV.LT.JLENV)
+ C THEN
+ IERR = -3
+ WRITE (*,9001) JLENV,ILENV
+ 9001 FORMAT (1H ,'NUMBER OF VERTICAL COORDINATES - ',I4,
+ C ', ARRAY SIZE IS - ',I4)
+ RETURN
+ ENDIF
+C
+C
+C***
+C* NUMBER OF UNUSED BITS AT END OF BLOCK.
+C***
+C
+ CALL GBYTE (IGRIB(IWORD),LNIL,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C***
+C* NEXT OCTET IS RESERVED.
+C***
+C
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C***
+C* DATA REPRESENTATION TYPE.
+C***
+C
+ CALL GBYTE (IGRIB(IWORD),IB2PAR(1),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C LAT/LONGITUDE GRID, GAUSSIAN GRID AND SPHERICAL HARMONICS
+C ARE THE ONLY DATA REPRESENTATIONS HANDLED.
+C
+ IF (IB2PAR(1).NE.0.AND.IB2PAR(1).NE.4.AND.IB2PAR(1).NE.50)
+ C THEN
+ WRITE (*,*)'GRID DESCRIPTION BLOCK NOT YET DEFINED'
+ IERR = -4
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C***
+C* LAT/LONG OR GAUSSIAN GRID.
+C***
+C
+ IF (IB2PAR(1).EQ.0.OR.IB2PAR(1).EQ.4)
+ C THEN
+C
+C NUMBER OF LAT/LONG POINTS.
+C
+ CALL GBYTES (IGRIB(IWORD),IB2PAR(2),IOFF,16,0,2)
+ CALL OFFSET (IOFF,2,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C LAT/LONG OF ORIGIN.
+C
+ CALL GBYTES (IGRIB(IWORD),ILAT(1),IOFF,24,0,2)
+ CALL OFFSET (IOFF,2,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C IF SIGN BIT SET TO 1 , VALUES ARE NEGATIVE.
+C
+ DO 200 I=1,2
+ IB2PAR(I+3) = ILAT(I)
+ IF (ILAT(I).GT.8388608)
+ C THEN
+ IB2PAR(I+3) = IB2PAR(I+3) - 8388608
+ IB2PAR(I+3) = - IB2PAR(I+3)
+ ENDIF
+ 200 CONTINUE
+C
+C
+C RESOLUTION FLAG.
+C
+ CALL GBYTE (IGRIB(IWORD),IB2PAR(6),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C LAT/LONG OF EXTREME POINTS.
+C
+ CALL GBYTES (IGRIB(IWORD),ILAT(1),IOFF,24,0,2)
+ CALL OFFSET (IOFF,2,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C IF SIGN BIT SET TO 1 , VALUES ARE NEGATIVE.
+C
+ DO 300 I=1,2
+ IB2PAR(I+6) = ILAT(I)
+ IF (ILAT(I).GT.8388608)
+ C THEN
+ IB2PAR(I+6) = IB2PAR(I+6) - 8388608
+ IB2PAR(I+6) = - IB2PAR(I+6)
+ ENDIF
+ 300 CONTINUE
+C
+C DIRECTION INCREMENTS / NUMBER OF LATITUDE LINES.
+C
+ CALL GBYTES (IGRIB(IWORD),IB2PAR(9),IOFF,16,0,2)
+ CALL OFFSET (IOFF,2,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C SCANNING MODE FLAGS.
+C
+ CALL GBYTE (IGRIB(IWORD),IB2PAR(11),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C 4 RESERVED OCTETS.
+C
+ CALL OFFSET (IOFF,4,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* SPHERICAL HARMONIC DATA.
+C***
+C
+ IF (IB2PAR(1).EQ.50)
+ C THEN
+C
+C PENTAGONAL RESOLUTION PARAMETERS.
+C
+ CALL GBYTES (IGRIB(IWORD),IB2PAR(2),IOFF,16,0,3)
+ CALL OFFSET (IOFF,3,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C REPRESENTATION TYPE AND MODE.
+C
+ CALL GBYTES (IGRIB(IWORD),IB2PAR(5),IOFF,8,0,2)
+ CALL OFFSET (IOFF,2,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C 18 RESERVED OCTETS.
+C
+ CALL OFFSET (IOFF,18,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ ENDIF
+C
+C
+C
+C
+C***
+C* VERTICAL COORDINATE PARAMETERS FOR HYBRID LEVELS.
+C***
+C
+ IF (JLENV.NE.0)
+ C THEN
+ DO 400 I=1,JLENV
+ CALL GBYTE (IGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL GBYTE (IGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL DECFP (FVERT(I),IEXP,IMANT)
+ 400 CONTINUE
+ ENDIF
+C
+ ENDIF
+C
+C
+C RETURN IF ONLY PRODUCT AND GRID DEFINITION BLOCKS REQUIRED.
+C
+ IF (ILENF.EQ.1) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 3 - BIT MAP BLOCK.
+C*
+C********************************************************************
+C
+C INC IS SET TO 1 , IF BLOCK 3 IS INCLUDED.
+C
+ INC = 0
+C
+C
+ IF (ISNEW.EQ.0)
+ C THEN
+C OLD VERSION OF CODE
+C
+C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE
+C
+C NONE 00000000 0
+C 2 00000001 1
+C 3 00000010 2
+C 2 AND 3 00000011 3
+C
+ IF (IB1PAR(4).EQ.2.OR.IB1PAR(4).EQ.3) INC = 1
+ ELSE
+C NEW VERSION
+C
+C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE
+C
+C NONE 00000000 0
+C 2 10000000 128
+C 3 01000000 64
+C 2 AND 3 11000000 192
+C
+ IF (IB1PAR(4).EQ.64.OR.IB1PAR(4).EQ.192) INC = 1
+ ENDIF
+C
+ IF (INC.EQ.1)
+ C THEN
+C
+C
+C* GET LENGTH OF THE BIT MAP BLOCK
+C
+C
+ CALL GBYTE (IGRIB(IWORD),IB3LEN,IOFF,24)
+ CALL OFFSET(IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF( IERR.NE.0 ) RETURN
+C
+C
+C* GET NUMBER OF UNUSED BITS AT THE END OF THE BLOCK 3.
+C
+C
+ CALL GBYTE(IGRIB(IWORD),INUB,IOFF,8)
+ CALL OFFSET(IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF( IERR.NE.0 ) RETURN
+C
+C* CHECK IF BIT MAP FOLLOWS
+C
+ CALL GBYTE (IGRIB(IWORD),IBMF,IOFF,16)
+ CALL OFFSET(IOFF,1,IWORD,16,NBIT,ILENG,IERR)
+ IF( IERR.NE.0 ) RETURN
+C
+ IB3PAR(1)=IBMF
+C
+ IF( IBMF.EQ.0 )
+ 1 THEN
+ IBVAL=(IB3LEN-6)*8-INUB
+ IWORDA=1
+ IOFFA=0
+ IBM6=IB3LEN-6
+C
+ DO 450 J=1,IBM6
+C
+ CALL GBYTE(IGRIB(IWORD),IO,IOFF,8)
+ CALL OFFSET(IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF(IERR.NE.0) RETURN
+C
+ CALL SBYTE(IBMAP(IWORDA),IO,IOFFA,8)
+ CALL OFFSET(IOFFA,1,IWORDA,8,NBIT,IBLEN,IERR)
+C
+ 450 CONTINUE
+C
+ ENDIF
+C
+C
+C
+ END IF
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 4 - BINARY DATA BLOCK.
+C*
+C********************************************************************
+C
+C
+C
+C***
+C* GET LENGTH OF BINARY DATA BLOCK.
+C***
+C
+C
+ IPW = IWORD
+ IPB = IOFF
+C
+ CALL GBYTE (IGRIB(IWORD),LBIN,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C***
+C* 4 BIT FLAG / 4 BIT COUNT OF UNUSED BITS AT END OF BLOCK OCTET.
+C***
+C
+ CALL GBYTE (IGRIB(IWORD),IFLAG,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ IF (ISNEW.EQ.0)
+ C THEN
+C OLD VERSION OF CODE
+C
+C 0000---- GRID POINT
+C 0001---- SPHERICAL HARMONICS
+C
+ IREP = IFLAG / 16
+ LNIL = IFLAG - IREP * 16
+C
+ ELSE
+C NEW VERSION OF CODE
+C
+C 0000---- GRID POINT
+C 1000---- SPHERICAL HARMONICS
+C
+ IREP = IFLAG / 128
+ LNIL = IFLAG - IREP * 128
+C
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* GET SCALE FACTOR
+C***
+C
+ CALL GBYTE (IGRIB(IWORD),JSCALE,IOFF,16)
+ CALL OFFSET (IOFF,1,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ ISCALE = JSCALE
+ IF (JSCALE.GE.32768)
+ C THEN
+ ISCALE = ISCALE - 32768
+ ISCALE = - ISCALE
+ ENDIF
+C
+C
+C
+C
+C***
+C* GET REFERENCE VALUE (FMIN) IN GRIB FORMAT (IEXP,IMANT)
+C***
+C
+C
+ CALL GBYTE (IGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL GBYTE (IGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C CHECK FOR MISSING DATA INDICATORS.
+C
+ IMISS = 0
+ IF (JSCALE.EQ.65535.AND.IEXP.EQ.255.AND.IMANT.EQ.16777215)
+ C IMISS = 1
+C
+C CONVERT REFERENCE VALUE AND SCALE FACTOR.
+C
+ IF (IMISS.EQ.0)
+ C THEN
+ CALL DECFP (FMIN,IEXP,IMANT)
+ ZSCALE = 2.**ISCALE
+ ENDIF
+C
+C
+C
+C
+C***
+C* GET NUMBER OF BITS IN EACH DATA VALUE.
+C***
+C
+ CALL GBYTE (IGRIB(IWORD),IBITS,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C CHECK NUMBER OF BITS PER DATA FIELD.
+C
+ IF (IBITS.GT.NBIT.OR.IBITS.GT.IMAX)
+ C THEN
+ IERR = -1
+ WRITE (*,9002) IBITS,NBIT,IMAX
+ 9002 FORMAT (1H ,'NUMBER OF BITS PER DATA VALUE, ',I3,
+ C 'EXCEEDS WORD LENGTH, ',I3,' OR MAXIMUM ',
+ C ' PERMITTED VALUE, ',I3)
+ RETURN
+ ENDIF
+C
+C***
+C* IF DATA IS IN SPHERICAL HARMONIC FORM, NEXT 4 OCTETS
+C* CONTAIN THE REAL (0,0) COEFFICIENT.
+C***
+C
+ IF (IREP.EQ.1)
+ C THEN
+C
+C GET REAL (0,0) COEFFICIENT IN GRIB FORMAT AND
+C CONVERT TO FLOATING POINT.
+C
+ CALL GBYTE (IGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL GBYTE (IGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ IF (IMISS.EQ.1)
+ C THEN
+ FPDATA(1) = 0.0
+ ELSE
+ CALL DECFP (FPDATA(1),IEXP,IMANT)
+ ENDIF
+ ENDIF
+C
+C
+C
+C
+C*****
+C* DECODE DATA VALUES TO FLOATING POINT AND STORE IN FPDATA.
+C*****
+C
+C FIRST CALCULATE THE NUMBER OF DATA VALUES.
+C
+ JLENF = LBIN - 11 - IREP * 4
+ JLENF = (JLENF * 8 - LNIL) / IBITS
+C
+C CHECK LENGTH OF OUTPUT ARRAY.
+C
+ IF (JLENF+IREP.GT.ILENF)
+ C THEN
+ IERR = -3
+ WRITE (*,9003) JLENF,ILENF
+ 9003 FORMAT (1H ,'NUMBER OF VALUES TO BE DECODED IS - ',I7,
+ C ', ARRAY SIZE - ',I7)
+ RETURN
+ ENDIF
+C
+ CALL GBYTES (IGRIB(IWORD),FPDATA(IREP+1),IOFF,IBITS,0,JLENF)
+ CALL OFFSET (IOFF,JLENF,IWORD,IBITS,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ DO 500 I= IREP+1,IREP+JLENF
+ IF (IMISS.EQ.1)
+ C THEN
+ FPDATA(1) = 0.0
+ ELSE
+ ZGRIB = FPDATA (I)
+ FPDATA(I) = FMIN + JGRIB * ZSCALE
+ ENDIF
+ 500 CONTINUE
+C
+C INCLUDE (0,0) COEFFICIENT IN COUNT, IF SPHERICAL HARMONIC DATA.
+C
+ JLENF = IREP + JLENF
+C
+C
+C
+C
+C***
+C* SKIP ANY ZERO FILL AT END OF DATA BLOCK.
+C***
+C
+ L = (IWORD-IPW) * NBIT + IOFF -IPB
+ L = LBIN * 8 - L
+ IF (L.NE.0)
+ C THEN
+ CALL OFFSET (IOFF,1,IWORD,L,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ ENDIF
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 5 - END BLOCK.
+C*
+C********************************************************************
+C
+C CHECK 7 7 7 7 AT END OF CODED DATA.
+C
+C
+ CALL GBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,8,0,4)
+C
+C 55 IS THE VALUE OF ASCII CHARACTER '7'
+C
+ DO 600 I=1,4
+ IF (IBLOCK(I).NE.55) IERR = 1
+ 600 CONTINUE
+C
+ IF (IERR.EQ.1) WRITE (*,*) ' NO 7777 GROUP FOUND '
+C
+C
+C
+C SET NUMBER OF VALUES NEGATIVE, IF MISSING DATA VALUES.
+C
+ IF (IMISS.EQ.1) JLENF = - JLENF
+C
+ RETURN
+ END
diff --git a/gribex/decogd.F b/gribex/decogd.F
new file mode 100755
index 0000000..e612379
--- /dev/null
+++ b/gribex/decogd.F
@@ -0,0 +1,971 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE DECOGD (FPDATA,ILENF,IBITS,NBIT,IB1PAR,IB2PAR,
+ C IB3PAR,FVERT,ILENV,IGRIB,ILENG,IWORD,
+ C JLENV,JLENF,RMISS,IERR)
+C
+C---->
+C* NAME : DECOGD
+C*
+C* FUNCTION : DECODE WMO GRIB CODED DATA.
+C*
+C* INPUT : NBIT - NUMBER OF BITS IN COMPUTER WORD
+C*
+C* IGRIB - INTEGER ARRAY CONTAINING DATA IN GRIB CODE.
+C* ILENG - LENGTH OF ARRAY IGRIB.
+C*
+C* FVERT - REAL ARRAY TO RECEIVE VERTICAL COORDINATE
+C* PARAMETERS.
+C* ILENV - LENGTH OF ARRAY FVERT.
+C*
+C* FPDATA - REAL ARRAY TO RECEIVE DECODED DATA VALUES.
+C* ILENF - LENGTH OF ARRAY FPDATA.
+C*
+C* ***** IF THIS IS 1 ONLY
+C* THE PRODUCT AND GRID DEFINITION BLOCKS
+C* ARE DECODED. *****
+C*
+C* IB1PAR - INTEGER ARRAY (DIMENSION 18) TO RECEIVE
+C* PRODUCT DEFINITION INFORMATION.
+C*
+C* IB2PAR - INTEGER ARRAY (DIMENSION 11) TO RECEIVE GRID
+C* DEFINITION INFORMATION.
+C*
+C* OUTPUT : PARAMETERS FROM BLOCK 1 , PRODUCT DEFINITION BLOCK.
+C* --------------------------------------------------
+C* IB1PAR - INTEGER ARRAY (DIMENSION 18) OF PRODUCT
+C* DEFINITION INFORMATION.
+C*
+C* WORD CONTENTS
+C* ---- --------
+C* 1 ORIGINATING CENTRE IDENTIFIER.
+C* 2 MODEL IDENTIFICATION.
+C* 3 GRID DEFINITION.
+C* 4 FLAG ( CODE TABLE 1)
+C* 5 PARAMETER IDENTIFIER ( CODE TABLE 2 ).
+C* 6 TYPE OF LEVEL (CODE TABLE 3).
+C* 7-8 VALUE(S) OF LEVELS (CODE TABLE 3).
+C* 9 YEAR OF DATA
+C* 10 MONTH OF DATA
+C* 11 DAY OF DATA
+C* 12 HOUR OF DATA
+C* 13 MINUTE OF DATA
+C* 14 TIME UNIT (CODE TABLE 4).
+C* 15 TIME RANGE ONE
+C* 16 TIME RANGE TWO
+C* 17 TIME RANGE FLAG (CODE TABLE 5).
+C* 18 NUMBER AVERAGED.
+C*
+C* VALUE(S) OF LEVEL CAN OCCUPY 2 WORDS..
+C* FOR A LAYER THE FIRST WORD DEFINES THE TOP
+C* AND THE SECOND THE BOTTOM OF THE LAYER.
+C* FOR A SINGLE LEVEL, ONLY THE FIRST WORD IS
+C* USED.
+C*
+C* PARAMETERS FROM BLOCK 2 , GRID DEFINITION BLOCK.
+C* -----------------------------------------------
+C* IB2PAR - INTEGER ARRAY (DIMENSION 11) CONTAINING GRID
+C* DEFINITION INFORMATION.
+C* USE VARIES WITH DATA REPRESENTATION TYPE.
+C*
+C* WORD LAT/LONG GRID
+C* ---- -------------
+C* 1 DATA REPRESENTATION TYPE (CODE TABLE 6).
+C* 2 NO. OF POINTS ALONG A LATITUDE
+C* 3 NO. OF POINTS ALONG A MERIDIAN.
+C* 4 LATITUDE OF ORIGIN (SOUTH - IVE).
+C* 5 LONGITUDE OF ORIGIN (WEST - IVE).
+C* 6 RESOLUTION FLAG. (CODE TABLE 7)
+C* 7 LATITUDE OF EXTREME POINT (SOUTH - IVE).
+C* 8 LONGITUDE OF EXTREME POINT (WEST - IVE).
+C* 9 LATITUDE INCREMENT
+C* 10 LONGITUDE INCREMENT
+C* 11 SCANNING MODE FLAGS (CODE TABLE 8)
+C*
+C* WORD GAUSSIAN GRID
+C* ---- -------------
+C* 1-9 AS FOR LAT/LONGITUDE GRID.
+C* 10 THE NUMBER OF LATITUDE LINES BETWEEN A POLE
+C* AND THE EQUATOR.
+C* 11 SCANNING MODE FLAGS (CODE TABLE 8)
+C*
+C* WORD SPHERICAL HARMONICS
+C* ---- -------------------
+C* 1 DATA REPRESENTATION TYPE (CODE TABLE 6)
+C* 2 J - PENTAGONAL RESOLUTION PARAMETER
+C* 3 K - PENTAGONAL RESOLUTION PARAMETER
+C* 4 M - PENTAGONAL RESOLUTION PARAMETER
+C* 5 REPRESENTATION TYPE (CODE TABLE 9)
+C* 6 REPRESENTATION MODE (CODE TABLE 10)
+C* 7-11 NOT USED
+C*
+C*
+C* USE FOR OTHER DATA REPRESENTATION TYPES IS
+C*
+C* FVERT - REAL ARRAY OF VERTICAL COORDINATE PARAMETERS
+C* JLENV - NUMBER OF VALUES IN THIS ARRAY.
+C*
+C* USED FOR HYBRID LEVELS ONLY.
+C*
+C* PARAMETERS FROM BLOCK 3 , BIT-MAP DEFINITION BLOCK.
+C* --------------------------------------------------
+C*
+C* IBMAP - ARRAY (DIMENSION IBLEN) CONTAINING BIT MA
+C* IBLEN - NUMBER OF WORDS IN ARRAY IBMAP.
+C* IBVAL - NUMBER OF VALUES ON THIS ARRAY.
+C* IERR - ERROR INDICATOR
+C* -5, MISSING PREDEFINED BIT MAP.
+C*
+C*
+C* PARAMETERS FROM BLOCK 4 , BINARY DATA BLOCK.
+C* -------------------------------------------
+C* FPDATA - ARRAY OF FLOATING POINT VALUES.
+C* JLENF - NUMBER OF VALUES IN THIS ARRAY.
+C* JLENF IS NEGATIVE IF MISSING DATA CODED
+C*
+C* IBITS - NUMBER OF BITS FOR CODED DATA VALUES.
+C*
+C* IWORD - NUMBER OF WORDS DECODED.
+C*
+C* IERR - ERROR INDICATOR.
+C*
+C* 0, NO ERROR.
+C*
+C* -1, NUMBER OF BITS PER DATA VALUE EXCEEDS
+C* WORD LENGTH, OR MAXIMUM ALLOWED.
+C* -2, INPUT ARRAY HOLDS FEWER CODED VALUES
+C* THAN EXPECTED.
+C* -3, OUTPUT ARRAY TOO SMALL TO HOLD DECODED
+C* DATA VALUES.
+C* -4, CURRENTLY UNDEFINED OPTION SELECTED.
+C*
+C* 1, NO BLOCK 5 FOUND.
+C*
+C* GENERAL : DECOGD CALLS GBYTE
+C* GBYTES
+C* OFFSET
+C* DECFP
+C* SBYTE
+C*
+C* Modifications
+C* -------------
+C
+C940309 J.D.Chambers ECMWF 09:03:94
+C940309 Maximum size for bitmap array increased to 132000
+C940309 to allow for products 0.5 * 0.5 degrees, whole
+C940309 hemisphere (N or S).
+C*
+C ---------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+ DIMENSION FPDATA(ILENF),FVERT(ILENV)
+ DIMENSION IBLOCK(24),IGRIB(ILENG)
+ DIMENSION IB1PAR(18),IB2PAR(11),IB3PAR(2),ILAT(2)
+C
+C940309 INTEGER*4 IBMAP(41472)
+ INTEGER*4 IBMAP(132000)
+C940309 DIMENSION FPDATAG(41472)
+ DIMENSION FPDATAG(132000)
+ CHARACTER*20 BITMAP
+ CHARACTER YCHAR
+C
+ EQUIVALENCE (ZGRIB,JGRIB)
+C
+C SET MAXIMUM NUMBER OF BITS PER DATA FIELD.
+C
+ DATA IMAX /32/
+C
+ IERR = 0
+C
+ RMISS=1.7E38
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 0 - INDICATOR BLOCK.
+C*
+C********************************************************************
+C
+C
+C EXTRACT 4 OCTETS CONTAINING ASCII G R I B .
+C
+ IWORD = 1
+ IOFF = 0
+ IBYTE = 8
+ NVAL = 4
+C
+ CALL GBYTES (IGRIB(1),IBLOCK(1),0,IBYTE,0,NVAL)
+ CALL OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 1 - PRODUCT DEFINITION BLOCK.
+C*
+C********************************************************************
+C
+C
+C EXTRACT FIRST 4 OCTETS OF BLOCK 1.
+C
+ NVAL = 4
+C
+ CALL GBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,IBYTE,0,NVAL)
+ CALL OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C IF THESE OCTETS DO NOT CONTAIN 0, 0, 24 AND 0 RESPECTIVELY
+C THEN THE DATA IS IN THE OLD VERSION OF THE CODE.
+C
+ IF (IBLOCK(1).EQ.0.AND.IBLOCK(2).EQ.0.AND.IBLOCK(3).EQ.24.
+ C AND.IBLOCK(4).EQ.0)
+ C THEN
+ ISNEW = 1
+ NVAL = 20
+ ELSE
+ ISNEW = 0
+ NVAL = 16
+ ENDIF
+C
+C EXTRACT NEXT 16 OR 20 OCTETS OF BLOCK 1 - NUMBER DEPENDS
+C ON VERSION OF CODE.
+C
+ CALL GBYTES (IGRIB(IWORD),IBLOCK(5),IOFF,IBYTE,0,NVAL)
+ CALL OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C TRANSFER PRODUCT DEFINITION INFORMATION TO OUTPUT ARRAY.
+C EXCEPT FOR NUMBER AVERAGED.
+C
+ DO 100 I=1,17
+ IB1PAR(I) = IBLOCK(I+4*ISNEW)
+ 100 CONTINUE
+C
+C
+C
+C
+C NUMBER AVERAGED OCCUPIES 2 OCTETS.
+C
+ IB1PAR(18) = IBLOCK(18+4*ISNEW) * 256 + IBLOCK(19+4*ISNEW)
+C
+C
+C
+C
+C
+C***
+C* DESCRIPTION OF LEVEL OR LAYER ( CODE TABLE 3 ).
+C***
+C
+C CERTAIN LEVEL TYPES REQUIRE THAT THE DESCRIPTION OCCUPY
+C BOTH 8 BIT FIELDS. PUT SINGLE VALUE IN FIRST LEVEL WORD.
+C
+ KTEMP = 32 + (ISNEW*224)
+ IF (IB1PAR(6).EQ.100.OR.IB1PAR(6).EQ.103.OR.IB1PAR(6).EQ.105.
+ C OR.IB1PAR(6).EQ.107.OR.IB1PAR(6).EQ.109)
+ C THEN
+ IB1PAR(7) = IB1PAR(7) * KTEMP + IB1PAR(8)
+ IB1PAR(8) = 0
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* TIME RANGE.
+C***
+C
+C ONE TIME RANGE CAN OCCUPY TWO OCTETS.
+C
+ IF (IB1PAR(17).EQ.10)
+ C THEN
+ IB1PAR(15) = IB1PAR(15) * KTEMP + IB1PAR(16)
+ IB1PAR(16) = 0
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 2 - GRID DESCRIPTION BLOCK.
+C*
+C********************************************************************
+C
+C***
+C* CHECK FLAG INDICATING IF BLOCK 2 IS INCLUDED IN CODE.
+C***
+C
+C INC IS SET TO 1 , IF BLOCK 2 IS INCLUDED.
+C
+ INC = 0
+C
+C
+ IF (ISNEW.EQ.0)
+ C THEN
+C OLD VERSION OF CODE
+C
+C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE
+C
+C NONE 00000000 0
+C 2 00000001 1
+C 3 00000010 2
+C 2 AND 3 00000011 3
+C
+ IF (IB1PAR(4).EQ.1.OR.IB1PAR(4).EQ.3) INC = 1
+ ELSE
+C NEW VERSION
+C
+C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE
+C
+C NONE 00000000 0
+C 2 10000000 128
+C 3 01000000 64
+C 2 AND 3 11000000 192
+C
+ IF (IB1PAR(4).EQ.128.OR.IB1PAR(4).EQ.192) INC = 1
+ ENDIF
+C
+ IF (INC.EQ.1)
+ C THEN
+C
+C
+C***
+C* LENGTH OF GRID DESCRIPTION BLOCK.
+C***
+C
+ CALL GBYTE (IGRIB(IWORD),LBLK,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C LENGTH IS 32 OCTETS FOR LAT/LONG, GAUSSIAN AND SPHERICAL
+C HARMONICS . FOR ANY DATA ON HYBRID LEVELS THE
+C VERTICAL COORDINATES ARE ADDED.
+C GET NUMBER OF VERTICAL COORDINATE PARAMETERS, IF ANY.
+C
+ JLENV = (LBLK - 32) / 4
+ IF(ILENV.LT.JLENV)
+ C THEN
+ IERR = -3
+ WRITE (*,9001) JLENV,ILENV
+ 9001 FORMAT (1H ,'NUMBER OF VERTICAL COORDINATES - ',I4,
+ C ', ARRAY SIZE IS - ',I4)
+ RETURN
+ ENDIF
+C
+C
+C***
+C* NUMBER OF UNUSED BITS AT END OF BLOCK.
+C***
+C
+ CALL GBYTE (IGRIB(IWORD),LNIL,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C***
+C* NEXT OCTET IS RESERVED.
+C***
+C
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C***
+C* DATA REPRESENTATION TYPE.
+C***
+C
+ CALL GBYTE (IGRIB(IWORD),IB2PAR(1),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C LAT/LONGITUDE GRID, GAUSSIAN GRID AND SPHERICAL HARMONICS
+C ARE THE ONLY DATA REPRESENTATIONS HANDLED.
+C
+ IF (IB2PAR(1).NE.0.AND.IB2PAR(1).NE.4.AND.IB2PAR(1).NE.50)
+ C THEN
+ WRITE (*,*)'GRID DESCRIPTION BLOCK NOT YET DEFINED'
+ IERR = -4
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C***
+C* LAT/LONG OR GAUSSIAN GRID.
+C***
+C
+ IF (IB2PAR(1).EQ.0.OR.IB2PAR(1).EQ.4)
+ C THEN
+C
+C NUMBER OF LAT/LONG POINTS.
+C
+ CALL GBYTES (IGRIB(IWORD),IB2PAR(2),IOFF,16,0,2)
+ CALL OFFSET (IOFF,2,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C LAT/LONG OF ORIGIN.
+C
+ CALL GBYTES (IGRIB(IWORD),ILAT(1),IOFF,24,0,2)
+ CALL OFFSET (IOFF,2,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C IF SIGN BIT SET TO 1 , VALUES ARE NEGATIVE.
+C
+ DO 200 I=1,2
+ IB2PAR(I+3) = ILAT(I)
+ IF (ILAT(I).GT.8388608)
+ C THEN
+ IB2PAR(I+3) = IB2PAR(I+3) - 8388608
+ IB2PAR(I+3) = - IB2PAR(I+3)
+ ENDIF
+ 200 CONTINUE
+C
+C
+C RESOLUTION FLAG.
+C
+ CALL GBYTE (IGRIB(IWORD),IB2PAR(6),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C LAT/LONG OF EXTREME POINTS.
+C
+ CALL GBYTES (IGRIB(IWORD),ILAT(1),IOFF,24,0,2)
+ CALL OFFSET (IOFF,2,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C IF SIGN BIT SET TO 1 , VALUES ARE NEGATIVE.
+C
+ DO 300 I=1,2
+ IB2PAR(I+6) = ILAT(I)
+ IF (ILAT(I).GT.8388608)
+ C THEN
+ IB2PAR(I+6) = IB2PAR(I+6) - 8388608
+ IB2PAR(I+6) = - IB2PAR(I+6)
+ ENDIF
+ 300 CONTINUE
+C
+C DIRECTION INCREMENTS / NUMBER OF LATITUDE LINES.
+C
+ CALL GBYTES (IGRIB(IWORD),IB2PAR(9),IOFF,16,0,2)
+ CALL OFFSET (IOFF,2,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C SCANNING MODE FLAGS.
+C
+ CALL GBYTE (IGRIB(IWORD),IB2PAR(11),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C 4 RESERVED OCTETS.
+C
+ CALL OFFSET (IOFF,4,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* SPHERICAL HARMONIC DATA.
+C***
+C
+ IF (IB2PAR(1).EQ.50)
+ C THEN
+C
+C PENTAGONAL RESOLUTION PARAMETERS.
+C
+ CALL GBYTES (IGRIB(IWORD),IB2PAR(2),IOFF,16,0,3)
+ CALL OFFSET (IOFF,3,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C REPRESENTATION TYPE AND MODE.
+C
+ CALL GBYTES (IGRIB(IWORD),IB2PAR(5),IOFF,8,0,2)
+ CALL OFFSET (IOFF,2,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C 18 RESERVED OCTETS.
+C
+ CALL OFFSET (IOFF,18,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ ENDIF
+C
+C
+C
+C
+C***
+C* VERTICAL COORDINATE PARAMETERS FOR HYBRID LEVELS.
+C***
+C
+ IF (JLENV.NE.0)
+ C THEN
+ DO 400 I=1,JLENV
+ CALL GBYTE (IGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL GBYTE (IGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL DECFP (FVERT(I),IEXP,IMANT)
+ 400 CONTINUE
+ ENDIF
+C
+ ENDIF
+C
+C
+C RETURN IF ONLY PRODUCT AND GRID DEFINITION BLOCKS REQUIRED.
+C
+ IF (ILENF.EQ.1) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 3 - BIT MAP BLOCK.
+C*
+C********************************************************************
+C
+C INC IS SET TO 1 , IF BLOCK 3 IS INCLUDED.
+C
+ INC = 0
+C
+C
+ IF (ISNEW.EQ.0)
+ C THEN
+C OLD VERSION OF CODE
+C
+C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE
+C
+C NONE 00000000 0
+C 2 00000001 1
+C 3 00000010 2
+C 2 AND 3 00000011 3
+C
+ IF (IB1PAR(4).EQ.2.OR.IB1PAR(4).EQ.3) INC = 1
+ ELSE
+C NEW VERSION
+C
+C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE
+C
+C NONE 00000000 0
+C 2 10000000 128
+C 3 01000000 64
+C 2 AND 3 11000000 192
+C
+ IF (IB1PAR(4).EQ.64.OR.IB1PAR(4).EQ.192) INC = 1
+ ENDIF
+C
+ IF (INC.EQ.1)
+ C THEN
+C
+C
+C* GET LENGTH OF THE BIT MAP BLOCK
+C
+C
+ CALL GBYTE (IGRIB(IWORD),IB3LEN,IOFF,24)
+ CALL OFFSET(IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF( IERR.NE.0 ) RETURN
+C
+C
+C* GET NUMBER OF UNUSED BITS AT THE END OF THE BLOCK 3.
+C
+C
+ CALL GBYTE(IGRIB(IWORD),INUB,IOFF,8)
+ CALL OFFSET(IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF( IERR.NE.0 ) RETURN
+C
+C* CHECK IF BIT MAP FOLLOWS
+C
+ CALL GBYTE (IGRIB(IWORD),IBMF,IOFF,16)
+ CALL OFFSET(IOFF,1,IWORD,16,NBIT,ILENG,IERR)
+ IF( IERR.NE.0 ) RETURN
+C
+ IB3PAR(1)=IBMF
+C
+ IF( IBMF.EQ.0 )
+ 1 THEN
+ IBVAL=(IB3LEN-6)*8-INUB
+C
+C940309 IF(IBVAL.GT.41472) THEN
+ IF(IBVAL.GT.132000) THEN
+ IERR=-3
+ WRITE(*,8888) IBVAL
+ 8888 FORMAT(1H ,'BIT MAP ARRAY TOO SMALL - IBVAL =',I12)
+ RETURN
+ END IF
+
+ DO 450 J=1,IBVAL
+C
+ CALL GBYTE(IGRIB(IWORD),IBMAP(J),IOFF,1)
+ CALL OFFSET(IOFF,1,IWORD,1,NBIT,ILENG,IERR)
+ IF(IERR.NE.0) RETURN
+C
+ 450 CONTINUE
+C
+ CALL OFFSET(IOFF,1,IWORD,INUB,NBIT,ILENG,IERR)
+C
+ ELSE
+C
+C* GET PREDEFINED BIT MAP
+C
+ WRITE(YCHAR,'(I5)') IBMF
+C
+ BITMAP='BIT_MAP_'//YCHAR//'.DAT'
+C
+ OPEN(UNIT=10,IOSTAT=IOS,ERR=455,FILE=BITMAP,
+ 1 FORM='UNFORMATTED',STATUS='OLD')
+C
+ READ(10) IBVAL,IBLEN,(IBMAP(I),I=1,IBLEN)
+C
+ CLOSE(10)
+C
+ GO TO 460
+C
+ 455 CONTINUE
+C
+ IERR=-5
+ WRITE(*,9906) IOS
+ 9906 FORMAT(1H ,'ERROR ON UNIT 10, ERROR NO. ',I6)
+ RETURN
+C
+ 460 CONTINUE
+C
+ ENDIF
+C
+C
+ END IF
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 4 - BINARY DATA BLOCK.
+C*
+C********************************************************************
+C
+C
+C
+C***
+C* GET LENGTH OF BINARY DATA BLOCK.
+C***
+C
+C
+ IPW = IWORD
+ IPB = IOFF
+C
+ CALL GBYTE (IGRIB(IWORD),LBIN,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C***
+C* 4 BIT FLAG / 4 BIT COUNT OF UNUSED BITS AT END OF BLOCK OCTET.
+C***
+C
+ CALL GBYTE (IGRIB(IWORD),IFLAG,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ IF (ISNEW.EQ.0)
+ C THEN
+C OLD VERSION OF CODE
+C
+C 0000---- GRID POINT
+C 0001---- SPHERICAL HARMONICS
+C
+ IREP = IFLAG / 16
+ LNIL = IFLAG - IREP * 16
+C
+ ELSE
+C NEW VERSION OF CODE
+C
+C 0000---- GRID POINT
+C 1000---- SPHERICAL HARMONICS
+C
+ IREP = IFLAG / 128
+ LNIL = IFLAG - IREP * 128
+C
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* GET SCALE FACTOR
+C***
+C
+ CALL GBYTE (IGRIB(IWORD),JSCALE,IOFF,16)
+ CALL OFFSET (IOFF,1,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ ISCALE = JSCALE
+ IF (JSCALE.GE.32768)
+ C THEN
+ ISCALE = ISCALE - 32768
+ ISCALE = - ISCALE
+ ENDIF
+C
+C
+C
+C
+C***
+C* GET REFERENCE VALUE (FMIN) IN GRIB FORMAT (IEXP,IMANT)
+C***
+C
+C
+ CALL GBYTE (IGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL GBYTE (IGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C CHECK FOR MISSING DATA INDICATORS.
+C
+ IMISS = 0
+ IF (JSCALE.EQ.65535.AND.IEXP.EQ.255.AND.IMANT.EQ.16777215)
+ C IMISS = 1
+C
+C CONVERT REFERENCE VALUE AND SCALE FACTOR.
+C
+ IF (IMISS.EQ.0)
+ C THEN
+ CALL DECFP (FMIN,IEXP,IMANT)
+ ZSCALE = 2.**ISCALE
+ ENDIF
+C
+C
+C
+C
+C***
+C* GET NUMBER OF BITS IN EACH DATA VALUE.
+C***
+C
+ CALL GBYTE (IGRIB(IWORD),IBITS,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C CHECK NUMBER OF BITS PER DATA FIELD.
+C
+ IF (IBITS.GT.NBIT.OR.IBITS.GT.IMAX)
+ C THEN
+ IERR = -1
+ WRITE (*,9002) IBITS,NBIT,IMAX
+ 9002 FORMAT (1H ,'NUMBER OF BITS PER DATA VALUE, ',I3,
+ C 'EXCEEDS WORD LENGTH, ',I3,' OR MAXIMUM ',
+ C ' PERMITTED VALUE, ',I3)
+ RETURN
+ ENDIF
+C
+C***
+C* IF DATA IS IN SPHERICAL HARMONIC FORM, NEXT 4 OCTETS
+C* CONTAIN THE REAL (0,0) COEFFICIENT.
+C***
+C
+ IF (IREP.EQ.1)
+ C THEN
+C
+C GET REAL (0,0) COEFFICIENT IN GRIB FORMAT AND
+C CONVERT TO FLOATING POINT.
+C
+ CALL GBYTE (IGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL GBYTE (IGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ IF (IMISS.EQ.1)
+ C THEN
+ FPDATA(1) = 0.0
+ ELSE
+ CALL DECFP (FPDATA(1),IEXP,IMANT)
+ ENDIF
+ ENDIF
+C
+C
+C
+C
+C*****
+C* DECODE DATA VALUES TO FLOATING POINT AND STORE IN FPDATA.
+C*****
+C
+C FIRST CALCULATE THE NUMBER OF DATA VALUES.
+C
+ JLENF = LBIN - 11 - IREP * 4
+ JLENF = (JLENF * 8 - LNIL) / IBITS
+C
+C CHECK LENGTH OF OUTPUT ARRAY.
+C
+ IF (JLENF+IREP.GT.ILENF)
+ C THEN
+ IERR = -3
+ WRITE (*,9003) JLENF,ILENF
+ 9003 FORMAT (1H ,'NUMBER OF VALUES TO BE DECODED IS - ',I7,
+ C ', ARRAY SIZE - ',I7)
+ RETURN
+ ENDIF
+C
+ CALL GBYTES (IGRIB(IWORD),FPDATA(IREP+1),IOFF,IBITS,0,JLENF)
+ CALL OFFSET (IOFF,JLENF,IWORD,IBITS,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ DO 500 I= IREP+1,IREP+JLENF
+ IF (IMISS.EQ.1)
+ C THEN
+ FPDATA(1) = 0.0
+ ELSE
+ ZGRIB = FPDATA (I)
+ FPDATA(I) = FMIN + JGRIB * ZSCALE
+ ENDIF
+ 500 CONTINUE
+C
+C INCLUDE (0,0) COEFFICIENT IN COUNT, IF SPHERICAL HARMONIC DATA.
+C
+ JLENF = IREP + JLENF
+C
+C
+C
+C
+C***
+C* SKIP ANY ZERO FILL AT END OF DATA BLOCK.
+C***
+C
+ L = (IWORD-IPW) * NBIT + IOFF -IPB
+ L = LBIN * 8 - L
+ IF (L.NE.0)
+ C THEN
+ CALL OFFSET (IOFF,1,IWORD,L,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ ENDIF
+C
+C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C* IF BIT MAP PRESENT FILL MISSING VALUES BY RMISS.
+C
+ IF(IB1PAR(4).EQ.64.OR.IB1PAR(4).EQ.192) THEN
+C
+ JI=0
+ DO 647 J=1,IBVAL
+ IF(IBMAP(J).EQ.0) THEN
+ FPDATAG(J)=RMISS
+ ELSE
+ JI=JI+1
+ FPDATAG(J)=FPDATA(JI)
+ END IF
+ 647 CONTINUE
+C
+ JLENF = IBVAL
+ DO 649 I=1,JLENF
+ FPDATA(I)=FPDATAG(I)
+ 649 CONTINUE
+C
+ END IF
+C
+C********************************************************************
+C*
+C* BLOCK 5 - END BLOCK.
+C*
+C********************************************************************
+C
+C CHECK 7 7 7 7 AT END OF CODED DATA.
+C
+C
+ CALL GBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,8,0,4)
+C
+C 55 IS THE VALUE OF ASCII CHARACTER '7'
+C
+ DO 600 I=1,4
+ IF (IBLOCK(I).NE.55) IERR = 1
+ 600 CONTINUE
+C
+ IF (IERR.EQ.1) WRITE (*,*) ' NO 7777 GROUP FOUND '
+C
+C
+C
+C SET NUMBER OF VALUES NEGATIVE, IF MISSING DATA VALUES.
+C
+ IF (IMISS.EQ.1) JLENF = - JLENF
+C
+ RETURN
+ END
diff --git a/gribex/decogr.F b/gribex/decogr.F
new file mode 100755
index 0000000..955cca1
--- /dev/null
+++ b/gribex/decogr.F
@@ -0,0 +1,720 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE DECOGR (FPDATA,ILENF,IBITS,NBIT,IB1PAR,
+ C IB2PAR,FVERT,ILENV,IGRIB,ILENG,IWORD,
+ C JLENV,JLENF,IERR)
+C
+C
+C---->
+C*
+C* NAME : DECOGR
+C*
+C* FUNCTION : DECODE WMO GRIB CODED DATA.
+C*
+C* INPUT : NBIT - NUMBER OF BITS IN COMPUTER WORD
+C*
+C* IGRIB - INTEGER ARRAY CONTAINING DATA IN GRIB CODE.
+C* ILENG - LENGTH OF ARRAY IGRIB.
+C*
+C* FVERT - REAL ARRAY TO RECEIVE VERTICAL COORDINATE
+C* PARAMETERS.
+C* ILENV - LENGTH OF ARRAY FVERT.
+C*
+C* FPDATA - REAL ARRAY TO RECEIVE DECODED DATA VALUES.
+C* ILENF - LENGTH OF ARRAY FPDATA
+C*
+C* IB1PAR - INTEGER ARRAY (DIMENSION 17) TO RECEIVE
+C* PRODUCT DEFINITION INFORMATION.
+C*
+C* IB2PAR - INTEGER ARRAY (DIMENSION 11) TO RECEIVE GRID
+C* DEFINITION INFORMATION.
+C*
+C* OUTPUT : PARAMETERS FROM BLOCK 1 , PRODUCT DEFINITION BLOCK.
+C* --------------------------------------------------
+C* IB1PAR - INTEGER ARRAY (DIMENSION 17) OF PRODUCT
+C* DEFINITION INFORMATION.
+C*
+C* WORD CONTENTS
+C* ---- --------
+C* 1 ORIGINATING CENTRE IDENTIFIER.
+C* 2 MODEL IDENTIFICATION.
+C* 3 GRID DEFINITION.
+C* 4 FLAG ( CODE TABLE 1)
+C* 5 PARAMETER IDENTIFIER ( CODE TABLE 2 ).
+C* 6 TYPE OF LEVEL (CODE TABLE 3).
+C* 7-8 VALUE(S) OF LEVELS (CODE TABLE 3).
+C* 9 YEAR OF DATA
+C* 10 MONTH OF DATA
+C* 11 DAY OF DATA
+C* 12 HOUR OF DATA
+C* 13 MINUTE OF DATA
+C* 14 TIME UNIT (CODE TABLE 4).
+C* 15 TIME RANGE ONE
+C* 16 TIME RANGE TWO
+C* 17 TIME RANGE FLAG (CODE TABLE 5).
+C*
+C* VALUE(S) OF LEVEL CAN OCCUPY 2 WORDS..
+C* FOR A LAYER THE FIRST WORD DEFINES THE TOP
+C* AND THE SECOND THE BOTTOM OF THE LAYER.
+C* FOR A SINGLE LEVEL, ONLY THE FIRST WORD IS
+C* USED.
+C*
+C* PARAMETERS FROM BLOCK 2 , GRID DEFINITION BLOCK.
+C* -----------------------------------------------
+C* IB2PAR - INTEGER ARRAY (DIMENSION 11) CONTAINING GRID
+C* DEFINITION INFORMATION.
+C* USE VARIES WITH DATA REPRESENTATION TYPE.
+C*
+C* WORD LAT/LONG GRID
+C* ---- -------------
+C* 1 DATA REPRESENTATION TYPE (CODE TABLE 6).
+C* 2 NO. OF POINTS ALONG A LATITUDE
+C* 3 NO. OF POINTS ALONG A MERIDIAN.
+C* 4 LATITUDE OF ORIGIN (SOUTH - IVE).
+C* 5 LONGITUDE OF ORIGIN (WEST - IVE).
+C* 6 EXTREME POINT/INCREMENTS FLAG.(CODE TABLE 7)
+C* 7 LATITUDE OF EXTREME POINT (SOUTH - IVE).
+C* 8 LONGITUDE OF EXTREME POINT (WEST - IVE).
+C* 9 LATITUDE INCREMENT
+C* 10 LONGITUDE INCREMENT
+C* 11 SCANNING MODE (CODE TABLE 8)
+C*
+C* WORD GAUSSIAN GRID
+C* ---- -------------
+C* 1-9 AS FOR LAT/LONGITUDE GRID.
+C* 10 THE NUMBER OF LATITUDE LINES BETWEEN A POLE
+C* AND THE EQUATOR.
+C* 11 SCANNING MODE (CODE TABLE 8)
+C*
+C* WORD SPHERICAL HARMONICS
+C* ---- -------------------
+C* 1 DATA REPRESENTATION TYPE (CODE TABLE 6)
+C* 2 J - PENTAGONAL RESOLUTION PARAMETER
+C* 3 K - PENTAGONAL RESOLUTION PARAMETER
+C* 4 M - PENTAGONAL RESOLUTION PARAMETER
+C* 5 REPRESENTATION TYPE (CODE TABLE 9)
+C* 6 REPRESENTATION MODE (CODE TABLE 10)
+C* 7-11 NOT USED
+C*
+C*
+C* USE FOR OTHER DATA REPRESENTATION TYPES IS
+C*
+C* FVERT - REAL ARRAY OF VERTICAL COORDINATE PARAMETERS
+C* JLENV - NUMBER OF VALUES IN THIS ARRAY.
+C*
+C* USED FOR HYBRID LEVELS ONLY.
+C*
+C* PARAMETERS FROM BLOCK 3 , BIT-MAP DEFINITION BLOCK.
+C* --------------------------------------------------
+C*
+C* TO BE DEFINED LATER.
+C*
+C* PARAMETERS FROM BLOCK 4 , BINARY DATA BLOCK.
+C* -------------------------------------------
+C* FPDATA - ARRAY OF FLOATING POINT VALUES.
+C* JLENF - NUMBER OF VALUES IN THIS ARRAY.
+C* JLENF IS NEGATIVE IF MISSING DATA CODED
+C*
+C* IBITS - NUMBER OF BITS FOR CODED DATA VALUES.
+C*
+C* IERR - ERROR INDICATOR.
+C*
+C* 0, NO ERROR.
+C*
+C* -1, NUMBER OF BITS PER DATA VALUE EXCEEDS
+C* WORD LENGTH, OR MAXIMUM ALLOWED.
+C* -2, INPUT ARRAY HOLDS FEWER CODED VALUES
+C* THAN EXPECTED.
+C* -3, OUTPUT ARRAY TOO SMALL TO HOLD DECODED
+C* DATA VALUES.
+C* -4, CURRENTLY UNDEFINED OPTION SELECTED.
+C*
+C* 1, NO BLOCK 5 FOUND.
+C*
+C* JOHN HENNESSY , ECMWF , 15TH APRIL 1985
+C*
+C*
+C ---------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+ DIMENSION FPDATA(ILENF),FVERT(ILENV)
+ DIMENSION IBLOCK(24),IGRIB(ILENG)
+ DIMENSION IB1PAR(17),IB2PAR(11),ILAT(2)
+C
+ EQUIVALENCE (ZGRIB,JGRIB)
+C
+C SET MAXIMUM NUMBER OF BITS PER DATA FIELD.
+C
+ DATA IMAX /60/
+C
+ IERR = 0
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 1 - PRODUCT DEFINITION BLOCK.
+C*
+C********************************************************************
+C
+C
+C EXTRACT OCTETS OF BLOCK 1.
+C
+ IWORD = 1
+ IOFF = 0
+ IBYTE = 8
+ NVAL = 24
+C
+ CALL GBYTES (IGRIB(1),IBLOCK(1),0,IBYTE,0,NVAL)
+ CALL OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C TRANSFER PRODUCT DEFINITION INFORMATION TO OUTPUT ARRAY.
+C
+ DO 100 I=1,17
+ IB1PAR(I) = IBLOCK(I+4)
+ 100 CONTINUE
+C
+C
+C
+C
+C
+C***
+C* DESCRIPTION OF LEVEL OR LAYER ( CODE TABLE 3 ).
+C***
+C
+C CERTAIN LEVEL TYPES REQUIRE THAT THE DESCRIPTION OCCUPY
+C BOTH 8 BIT FIELDS. PUT SINGLE VALUE IN FIRST LEVEL WORD.
+C
+ IF (IB1PAR(6).EQ.100.OR.IB1PAR(6).EQ.103.OR.IB1PAR(6).EQ.105.
+ C OR.IB1PAR(6).EQ.107.OR.IB1PAR(6).EQ.109)
+ C THEN
+ IB1PAR(7) = IB1PAR(7) * 32 + IB1PAR(8)
+ IB1PAR(8) = 0
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* TIME RANGE.
+C***
+C
+C ONE TIME RANGE CAN OCCUPY TWO OCTETS.
+C
+ IF (IB1PAR(17).EQ.10)
+ C THEN
+ IB1PAR(15) = IB1PAR(15) * 32 + IB1PAR(16)
+ IB1PAR(16) = 0
+ ENDIF
+C
+C***
+C* RESERVED ELEMENTS.
+C***
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 2 - GRID DESCRIPTION BLOCK.
+C*
+C********************************************************************
+C
+C***
+C* CHECK IF BLOCK 2 IS INCLUDED IN CODE.
+C***
+C
+ IF (IB1PAR(4).EQ.1.OR.IB1PAR(4).EQ.3)
+ C THEN
+C
+C
+C***
+C* LENGTH OF GRID DESCRIPTION BLOCK.
+C***
+C
+ CALL GBYTE (IGRIB(IWORD),LBLK,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C LENGTH IS 32 OCTETS FOR LAT/LONG, GAUSSIAN AND SPHERICAL
+C HARMONICS . FOR ANY DATA ON HYBRID LEVELS THE
+C VERTICAL COORDINATES ARE ADDED.
+C GET NUMBER OF VERTICAL COORDINATE PARAMETERS, IF ANY.
+C
+ JLENV = (LBLK - 32) / 4
+ IF(ILENV.LT.JLENV)
+ C THEN
+ IERR = -3
+ WRITE (*,9001) JLENV,ILENV
+ 9001 FORMAT (1H ,'NUMBER OF VERTICAL COORDINATES - ',I4,
+ C ', ARRAY SIZE IS - ',I4)
+ RETURN
+ ENDIF
+C
+C
+C***
+C* NUMBER OF UNUSED BITS AT END OF BLOCK.
+C***
+C
+ CALL GBYTE (IGRIB(IWORD),LNIL,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C***
+C* NEXT OCTET IS RESERVED.
+C***
+C
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C***
+C* DATA REPRESENTATION TYPE.
+C***
+C
+ CALL GBYTE (IGRIB(IWORD),IB2PAR(1),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C LAT/LONGITUDE GRID, GAUSSIAN GRID AND SPHERICAL HARMONICS
+C ARE THE ONLY DATA REPRESENTATIONS HANDLED.
+C
+ IF (IB2PAR(1).NE.0.AND.IB2PAR(1).NE.4.AND.IB2PAR(1).NE.50)
+ C THEN
+ WRITE (*,*)'GRID DESCRIPTION BLOCK NOT YET DEFINED'
+ IERR = -4
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C***
+C* LAT/LONG OR GAUSSIAN GRID.
+C***
+C
+ IF (IB2PAR(1).EQ.0.OR.IB2PAR(1).EQ.4)
+ C THEN
+C
+C NUMBER OF LAT/LONG POINTS.
+C
+ CALL GBYTES (IGRIB(IWORD),IB2PAR(2),IOFF,16,0,2)
+ CALL OFFSET (IOFF,2,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C LAT/LONG OF ORIGIN.
+C
+ CALL GBYTES (IGRIB(IWORD),ILAT(1),IOFF,24,0,2)
+ CALL OFFSET (IOFF,2,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C IF SIGN BIT SET TO 1 , VALUES ARE NEGATIVE.
+C
+ DO 200 I=1,2
+ IB2PAR(I+3) = ILAT(I)
+ IF (ILAT(I).GT.8388608)
+ C THEN
+ IB2PAR(I+3) = IB2PAR(I+3) - 8388608
+ IB2PAR(I+3) = - IB2PAR(I+3)
+ ENDIF
+ 200 CONTINUE
+C
+C
+C EXTREME POINT / INCREMENT FLAG.
+C
+ CALL GBYTE (IGRIB(IWORD),IB2PAR(6),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C LAT/LONG OF EXTREME POINTS.
+C
+ CALL GBYTES (IGRIB(IWORD),ILAT(1),IOFF,24,0,2)
+ CALL OFFSET (IOFF,2,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C IF SIGN BIT SET TO 1 , VALUES ARE NEGATIVE.
+C
+ DO 300 I=1,2
+ IB2PAR(I+6) = ILAT(I)
+ IF (ILAT(I).GT.8388608)
+ C THEN
+ IB2PAR(I+6) = IB2PAR(I+6) - 8388608
+ IB2PAR(I+6) = - IB2PAR(I+6)
+ ENDIF
+ 300 CONTINUE
+C
+C DIRECTION INCREMENTS / NUMBER OF LATITUDE LINES.
+C
+ CALL GBYTES (IGRIB(IWORD),IB2PAR(9),IOFF,16,0,2)
+ CALL OFFSET (IOFF,2,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C SCANNING MODE.
+C
+ CALL GBYTE (IGRIB(IWORD),IB2PAR(11),IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C 4 RESERVED OCTETS.
+C
+ CALL OFFSET (IOFF,4,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* SPHERICAL HARMONIC DATA.
+C***
+C
+ IF (IB2PAR(1).EQ.50)
+ C THEN
+C
+C PENTAGONAL RESOLUTION PARAMETERS.
+C
+ CALL GBYTES (IGRIB(IWORD),IB2PAR(2),IOFF,16,0,3)
+ CALL OFFSET (IOFF,3,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C REPRESENTATION TYPE AND MODE.
+C
+ CALL GBYTES (IGRIB(IWORD),IB2PAR(5),IOFF,8,0,2)
+ CALL OFFSET (IOFF,2,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C 18 RESERVED OCTETS.
+C
+ CALL OFFSET (IOFF,18,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ ENDIF
+C
+C
+C
+C
+C***
+C* VERTICAL COORDINATE PARAMETERS FOR HYBRID LEVELS.
+C***
+C
+ IF (JLENV.NE.0)
+ C THEN
+ DO 400 I=1,JLENV
+ CALL GBYTE (IGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL GBYTE (IGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL DECFP (FVERT(I),IEXP,IMANT)
+ 400 CONTINUE
+ ENDIF
+C
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 3 - BIT MAP BLOCK.
+C*
+C********************************************************************
+C
+ IF (IB1PAR(4).EQ.2.OR.IB1PAR(4).EQ.3)
+ C THEN
+ WRITE (*,*)'BIT MAP BLOCK NOT YET DEFINED'
+ IERR = -4
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 4 - BINARY DATA BLOCK.
+C*
+C********************************************************************
+C
+C
+C
+C***
+C* GET LENGTH OF BINARY DATA BLOCK.
+C***
+C
+C
+ IPW = IWORD
+ IPB = IOFF
+C
+ CALL GBYTE (IGRIB(IWORD),LBIN,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C***
+C* 4 BIT FLAG / 4 BIT COUNT OF UNUSED BITS AT END OF BLOCK OCTET.
+C***
+C
+ CALL GBYTE (IGRIB(IWORD),IFLAG,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ IREP = IFLAG / 16
+ LNIL = IFLAG - IREP * 16
+C
+C
+C
+C
+C
+C
+C
+C***
+C* GET SCALE FACTOR
+C***
+C
+ CALL GBYTE (IGRIB(IWORD),JSCALE,IOFF,16)
+ CALL OFFSET (IOFF,1,IWORD,16,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ ISCALE = JSCALE
+ IF (JSCALE.GE.32768)
+ C THEN
+ ISCALE = ISCALE - 32768
+ ISCALE = - ISCALE
+ ENDIF
+C
+C
+C
+C
+C***
+C* GET REFERENCE VALUE (FMIN) IN GRIB FORMAT (IEXP,IMANT)
+C***
+C
+C
+ CALL GBYTE (IGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL GBYTE (IGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C CHECK FOR MISSING DATA INDICATORS.
+C
+ IMISS = 0
+ IF (JSCALE.EQ.65535.AND.IEXP.EQ.255.AND.IMANT.EQ.16777215)
+ C IMISS = 1
+C
+C CONVERT REFERENCE VALUE AND SCALE FACTOR.
+C
+ IF (IMISS.EQ.0)
+ C THEN
+ CALL DECFP (FMIN,IEXP,IMANT)
+ ZSCALE = 2.**ISCALE
+ ENDIF
+C
+C
+C
+C
+C***
+C* GET NUMBER OF BITS IN EACH DATA VALUE.
+C***
+C
+ CALL GBYTE (IGRIB(IWORD),IBITS,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C CHECK NUMBER OF BITS PER DATA FIELD.
+C
+ IF (IBITS.GT.NBIT.OR.IBITS.GT.IMAX)
+ C THEN
+ IERR = -1
+ WRITE (*,9002) IBITS,NBIT,IMAX
+ 9002 FORMAT (1H ,'NUMBER OF BITS PER DATA VALUE, ',I3,
+ C 'EXCEEDS WORD LENGTH, ',I3,' OR MAXIMUM ',
+ C ' PERMITTED VALUE, ',I3)
+ RETURN
+ ENDIF
+C
+C***
+C* IF DATA IS IN SPHERICAL HARMONIC FORM, NEXT 4 OCTETS
+C* CONTAIN THE REAL (0,0) COEFFICIENT.
+C***
+C
+ IF (IREP.EQ.1)
+ C THEN
+C
+C GET REAL (0,0) COEFFICIENT IN GRIB FORMAT AND
+C CONVERT TO FLOATING POINT.
+C
+ CALL GBYTE (IGRIB(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL GBYTE (IGRIB(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ IF (IMISS.EQ.1)
+ C THEN
+ FPDATA(1) = 0.0
+ ELSE
+ CALL DECFP (FPDATA(1),IEXP,IMANT)
+ ENDIF
+ ENDIF
+C
+C
+C
+C
+C*****
+C* DECODE DATA VALUES TO FLOATING POINT AND STORE IN FPDATA.
+C*****
+C
+C FIRST CALCULATE THE NUMBER OF DATA VALUES.
+C
+ JLENF = LBIN - 11 - IREP * 4
+ JLENF = (JLENF * 8 - LNIL) / IBITS
+C
+C CHECK LENGTH OF OUTPUT ARRAY.
+C
+ IF (JLENF+IREP.GT.ILENF)
+ C THEN
+ IERR = -3
+ WRITE (*,9003) JLENF,ILENF
+ 9003 FORMAT (1H ,'NUMBER OF VALUES TO BE DECODED IS - ',I7,
+ C ', ARRAY SIZE - ',I7)
+ RETURN
+ ENDIF
+C
+ CALL GBYTES (IGRIB(IWORD),FPDATA(IREP+1),IOFF,IBITS,0,JLENF)
+ CALL OFFSET (IOFF,JLENF,IWORD,IBITS,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ DO 500 I= IREP+1,IREP+JLENF
+ IF (IMISS.EQ.1)
+ C THEN
+ FPDATA(1) = 0.0
+ ELSE
+ ZGRIB = FPDATA (I)
+ FPDATA(I) = FMIN + JGRIB * ZSCALE
+ ENDIF
+ 500 CONTINUE
+C
+C INCLUDE (0,0) COEFFICIENT IN COUNT, IF SPHERICAL HARMONIC DATA.
+C
+ JLENF = IREP + JLENF
+C
+C
+C
+C
+C***
+C* SKIP ANY ZERO FILL AT END OF DATA BLOCK.
+C***
+C
+ L = (IWORD-IPW) * NBIT + IOFF -IPB
+ L = LBIN * 8 - L
+ IF (L.NE.0)
+ C THEN
+ CALL OFFSET (IOFF,1,IWORD,L,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ ENDIF
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 5 - END BLOCK.
+C*
+C********************************************************************
+C
+C CHECK 7 7 7 7 AT END OF CODED DATA.
+C
+ IBLOCK(1) = 55
+ IBLOCK(2) = 55
+ IBLOCK(3) = 55
+ IBLOCK(4) = 55
+C
+ CALL GBYTES (IGRIB(IWORD),IBLOCK(1),IOFF,8,0,4)
+C
+ DO 600 I=1,4
+ IF (IBLOCK(I).NE.55) IERR = 1
+ 600 CONTINUE
+C
+ IF (IERR.EQ.1) WRITE (*,*) ' NO 7777 GROUP FOUND '
+C
+C
+C
+C SET NUMBER OF VALUES NEGATIVE, IF MISSING DATA VALUES.
+C
+ IF (IMISS.EQ.1) JLENF = - JLENF
+C
+ RETURN
+ END
diff --git a/gribex/decops.F b/gribex/decops.F
new file mode 100755
index 0000000..adcb8b7
--- /dev/null
+++ b/gribex/decops.F
@@ -0,0 +1,897 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE DECOPS (NAME,CHDATA,ILENCH,FPDATA,ILENFP,INDATA,ILENIN,
+ C NBYTE,LGDATA,ILENLG,IB1PAR,IPSCOD,ILENPS,
+ C JLENCH,JLENFP,JLENIN,JLENLG,IRSERV,NBIT,IWORD,
+ C IERR )
+C
+C---->
+C*
+C* NAME : DECOPS
+C*
+C* FUNCTION : DECODE PSEUDO-GRIB CODED DATA.
+C*
+C* INPUT : NBIT - NUMBER OF BITS IN COMPUTER WORD
+C*
+C* IPSCOD - INTEGER ARRAY OF DATA IN PSEUDO-GRIB CODE.
+C* ILENPS - LENGTH OF ARRAY IPSCOD.
+C*
+C* CHDATA - CHARACTER VARIABLE TO RECEIVE DECODED
+C* CHARACTER DATA.
+C* ILENCH - LENGTH OF THIS VARIABLE
+C*
+C* FPDATA - REAL ARRAY TO RECEIVE DECODED F.P. VALUES.
+C* ILENFP - LENGTH OF THIS ARRAY.
+C*
+C* INDATA - INTEGER ARRAY TO RECEIVE DECODED INTEGERS
+C* ILENIN - LENGTH OF THIS ARRAY.
+C*
+C* LGDATA - LOGICAL ARRAY TO RECEIVE DECODED LOGICALS
+C* ILENLG - LENGTH OF THIS ARRAY.
+C*
+C* IF ANY LENGTH (ILENCH,-FP,-IN,-LG) IS SET
+C* TO 1, ONLY BLOCK 0 AND BLOCK 1 ARE DECODED.
+C*
+C* IB1PAR - INTEGER ARRAY (DIMENSION 18) TO RECEIVE
+C* DATA DEFINITION INFORMATION.
+C*
+C*
+C* OUTPUT : PARAMETER FROM BLOCK 0
+C* ----------------------
+C*
+C* NAME - CHARACTER VARIABLE, 4 LETTERS OF CODE NAME.
+C*
+C*
+C* PARAMETERS FROM BLOCK 1 , PRODUCT DEFINITION BLOCK.
+C* --------------------------------------------------
+C*
+C* IB1PAR - INTEGER ARRAY (DIMENSION 18) OF DATA
+C* DEFINITION INFORMATION.
+C*
+C* WORD CONTENTS
+C* ---- --------
+C* 1 ORIGINATING CENTRE IDENTIFIER.
+C* 2 MODEL IDENTIFICATION.
+C* 3 GRID DEFINITION.
+C* 4 FLAG ( CODE TABLE 1)
+C* 5 PARAMETER IDENTIFIER ( CODE TABLE 2 ).
+C* 6 TYPE OF LEVEL (CODE TABLE 3).
+C* 7-8 VALUE(S) OF LEVELS (CODE TABLE 3).
+C* 9 YEAR OF DATA
+C* 10 MONTH OF DATA
+C* 11 DAY OF DATA
+C* 12 HOUR OF DATA
+C* 13 MINUTE OF DATA
+C* 14 TIME UNIT (CODE TABLE 4).
+C* 15 TIME RANGE ONE
+C* 16 TIME RANGE TWO
+C* 17 TIME RANGE FLAG (CODE TABLE 5).
+C* 18 NUMBER AVERAGED.
+C*
+C* VALUE(S) OF LEVEL CAN OCCUPY 2 WORDS..
+C* FOR A LAYER THE FIRST WORD DEFINES THE TOP
+C* AND THE SECOND THE BOTTOM OF THE LAYER.
+C* FOR A SINGLE LEVEL, ONLY THE FIRST WORD IS
+C* USED.
+C*
+C*
+C*
+C* PARAMETERS FROM BLOCK 4 , BINARY DATA BLOCK.
+C* -------------------------------------------
+C*
+C* CHDATA - UNPACKED CHARACTER DATA
+C* JLENCH - NUMBER OF CHARACTERS. NEGATIVE IF
+C* MISSING DATA CODED.
+C*
+C* FPDATA - ARRAY OF FLOATING POINT VALUES.
+C* JLENFP - NUMBER OF VALUES IN THIS ARRAY.
+C* JLENFP IS NEGATIVE IF MISSING DATA CODED
+C*
+C* INDATA - ARRAY OF INTEGER VALUES.
+C* JLENIN - NUMBER OF VALUES IN THIS ARRAY.
+C* JLENIN IS NEGATIVE IF MISSING DATA CODED
+C*
+C* LGDATA - ARRAY OF LOGICAL VALUES.
+C* JLENLG - NUMBER OF VALUES IN THIS ARRAY.
+C* JLENLG IS NEGATIVE IF MISSING DATA CODED
+C*
+C* NBYTE - NUMBER OF BYTES FOR INTEGER VALUES.
+C*
+C* IRSERV - NUMBER OF BYTES IN DATA BLOCK RESERVED
+C* FOR FUTURE USE.
+C*
+C*
+C* OTHER PARAMETERS.
+C* ----------------
+C*
+C* IWORD - NUMBER OF WORDS DECODED.
+C*
+C* IERR - ERROR INDICATOR.
+C*
+C* 0, NO ERROR.
+C*
+C* -2, INPUT ARRAY HOLDS FEWER CODED VALUES
+C* THAN EXPECTED.
+C* -3, OUTPUT ARRAY/VARIABLE TOO SMALL TO HOLD
+C* DECODED DATA VALUES.
+C* -4, CURRENTLY UNDEFINED OPTION SELECTED.
+C*
+C* 1, NO BLOCK 5 FOUND.
+C*
+C* GENERAL : DECOPS CALLS GBYTE
+C* GBYTES
+C* OFFSET
+C* DECFP
+C*
+C* AUTHOR : J.HENNESSY 23.01.86
+C*
+C* MODIFIED : J.HENNESSY 06.06.86
+C* " 21.08.86
+C*
+C* J.Hennessy 17.09.90
+C* Lower case letters as well as the characters
+C* _ - . , added.
+C*
+C ---------------------------------------------------------------
+C---->
+C
+C
+ PARAMETER (NCHAR=67)
+C
+C
+ LOGICAL LGDATA
+ CHARACTER*4 NAME
+ CHARACTER*1 CHAR
+ CHARACTER*(*) CHDATA
+C
+C
+C
+ DIMENSION FPDATA(*),INDATA(*),LGDATA(*)
+ DIMENSION IPSCOD(ILENPS),IBLOCK(24),IB1PAR(18)
+ DIMENSION IASCII(NCHAR)
+ DIMENSION CHAR(NCHAR)
+C
+C
+ DATA IASCII /65 ,66 ,67 ,68 ,69 ,70 ,71 ,72 ,73 ,74 ,75 ,76 ,77 ,
+ C 78 ,79 ,80 ,81 ,82 ,83 ,84 ,85 ,86 ,87 ,88 ,89 ,90 ,
+ C 48 ,49 ,50 ,51 ,52 ,53 ,54 ,55 ,56 ,57 ,32 ,
+ C 97 ,98 ,99 ,100,101,102,103,104,105,106,107,108,109,
+ C 110,111,112,113,114,115,116,117,118,119,120,121,122,
+ C 95 ,46 ,44 , 45 /
+C
+ DATA CHAR /'A','B','C','D','E','F','G','H','I','J','K','L','M',
+ C 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
+ C '0','1','2','3','4','5','6','7','8','9',' ',
+ C 'a','b','c','d','e','f','g','h','i','j','k','l','m',
+ C 'n','o','p','q','r','s','t','u','v','w','x','y','z',
+ C '_','.',',','-' /
+C
+C
+C
+C
+C
+C
+ IERR = 0
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 0 - INDICATOR BLOCK.
+C*
+C********************************************************************
+C
+C
+C EXTRACT 4 OCTETS CONTAINING ASCII NAME.
+C
+ IWORD = 1
+ IOFF = 0
+ IBYTE = 8
+ NVAL = 4
+C
+ CALL GBYTES (IPSCOD(1),IBLOCK(1),0,IBYTE,0,NVAL)
+ CALL OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ DO 100 I=1,36
+ IF (IBLOCK(1).EQ.IASCII(I)) NAME(1:1) = CHAR(I)
+ IF (IBLOCK(2).EQ.IASCII(I)) NAME(2:2) = CHAR(I)
+ IF (IBLOCK(3).EQ.IASCII(I)) NAME(3:3) = CHAR(I)
+ IF (IBLOCK(4).EQ.IASCII(I)) NAME(4:4) = CHAR(I)
+ 100 CONTINUE
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 1 - PRODUCT DEFINITION BLOCK.
+C*
+C********************************************************************
+C
+C
+C EXTRACT FIRST 4 OCTETS OF BLOCK 1.
+C
+ NVAL = 4
+C
+ CALL GBYTES (IPSCOD(IWORD),IBLOCK(1),IOFF,IBYTE,0,NVAL)
+ CALL OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C IF THESE OCTETS DO NOT CONTAIN 0, 0, 24 AND 0 RESPECTIVELY
+C THEN THE DATA IS IN THE OLD VERSION OF THE CODE.
+C
+ IF (IBLOCK(1).EQ.0.AND.IBLOCK(2).EQ.0.AND.IBLOCK(3).EQ.24.
+ C AND.IBLOCK(4).EQ.0)
+ C THEN
+ ISNEW = 1
+ NVAL = 20
+ ELSE
+ ISNEW = 0
+ NVAL = 16
+ ENDIF
+C
+C EXTRACT NEXT 16 OR 20 OCTETS OF BLOCK 1 - NUMBER DEPENDS
+C ON VERSION OF CODE.
+C
+ CALL GBYTES (IPSCOD(IWORD),IBLOCK(5),IOFF,IBYTE,0,NVAL)
+ CALL OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C TRANSFER PRODUCT DEFINITION INFORMATION TO OUTPUT ARRAY.
+C EXCEPT FOR NUMBER AVERAGED.
+C
+ DO 200 I=1,17
+ IB1PAR(I) = IBLOCK(I+4*ISNEW)
+ 200 CONTINUE
+C
+C
+ WRITE(*,*) ' '
+ WRITE(*,*) ' ******************************************'
+ WRITE(*,*) ' ******************************************'
+ WRITE(*,*) ' ** **'
+ WRITE(*,*) ' ** DECOPS is not Year-2000 compliant; **'
+ WRITE(*,*) ' ** dates are returned as 2 digits. **'
+ WRITE(*,*) ' ** **'
+ WRITE(*,*) ' ** Please switch to using DECOPS2 which **'
+ WRITE(*,*) ' ** returns dates as 4 digits in the **'
+ WRITE(*,*) ' ** range 1900 upwards. **'
+ WRITE(*,*) ' ** **'
+ WRITE(*,*) ' ** DECOPS will be set to abort after **'
+ WRITE(*,*) ' ** January 1999. **'
+ WRITE(*,*) ' ** **'
+ WRITE(*,*) ' ******************************************'
+ WRITE(*,*) ' ******************************************'
+ WRITE(*,*) ' '
+C
+C
+C NUMBER AVERAGED OCCUPIES 2 OCTETS.
+C
+ IB1PAR(18) = IBLOCK(18+4*ISNEW) * 256 + IBLOCK(19+4*ISNEW)
+C
+C
+C
+C
+C
+C***
+C* DESCRIPTION OF LEVEL OR LAYER ( CODE TABLE 3 ).
+C***
+C
+C CERTAIN LEVEL TYPES REQUIRE THAT THE DESCRIPTION OCCUPY
+C BOTH 8 BIT FIELDS. PUT SINGLE VALUE IN FIRST LEVEL WORD.
+C
+ KTEMP = 32 + (ISNEW*224)
+ IF ((IB1PAR(6).EQ. 20).OR.
+ X (IB1PAR(6).EQ.100).OR.
+ X (IB1PAR(6).EQ.103).OR.
+ X (IB1PAR(6).EQ.105).OR.
+ X (IB1PAR(6).EQ.107).OR.
+ X (IB1PAR(6).EQ.109).OR.
+ X (IB1PAR(6).EQ.111).OR.
+ X (IB1PAR(6).EQ.113).OR.
+ X (IB1PAR(6).EQ.115).OR.
+ X (IB1PAR(6).EQ.117).OR.
+ X (IB1PAR(6).EQ.125).OR.
+ X (IB1PAR(6).EQ.160) ) THEN
+ IB1PAR(7) = IB1PAR(7) * KTEMP + IB1PAR(8)
+ IB1PAR(8) = 0
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* TIME RANGE.
+C***
+C
+C ONE TIME RANGE CAN OCCUPY TWO OCTETS.
+C
+ IF (IB1PAR(17).EQ.10)
+ C THEN
+ IB1PAR(15) = IB1PAR(15) * KTEMP + IB1PAR(16)
+ IB1PAR(16) = 0
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* CHECK IF DECODING OF ONLY BLOCKS 0 AND 1 HAS BEEN REQUESTED.
+C***
+C
+ IF (ILENFP.EQ.1.OR.ILENIN.EQ.1.OR.ILENLG.EQ.1) RETURN
+ IF (ILENCH.EQ.1) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 4 - BINARY DATA BLOCK.
+C*
+C********************************************************************
+C
+C
+C
+C***
+C* GET LENGTH OF BINARY DATA BLOCK.
+C***
+C
+C
+ IPW = IWORD
+ IPB = IOFF
+C
+ CALL GBYTE (IPSCOD(IWORD),LBIN,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTET 4 IS RESERVED.
+C* (IT IS USED IN OLDER VERSIONS OF BUDGET VALUE RECORDS AND
+C* IT GIVES THE STARTING OCTET ADDRESS OF LOGICAL VALUES, A
+C* FIXED VALUE OF 34 OR 38)
+C***
+C
+ CALL GBYTE (IPSCOD(IWORD),ISTLG,IOFF,8)
+ IOLDBV = 0
+ IF (ISTLG.EQ.34.OR.ISTLG.EQ.38) IOLDBV = 1
+C
+C
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTET 5 - MISSING DATA FLAG. (IN OLDER VERSIONS OF BUDGET VALUE
+C* RECORD IT GIVES STARTING OCTET ADDRESS OF INTEGER VALUES)
+C***
+C
+ CALL GBYTE (IPSCOD(IWORD),IMISS,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ IF (IOLDBV.EQ.1)
+ C THEN
+ ISTIN = IMISS
+ IMISS = 0
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTETS 6-7 IN OLDER VERSIONS OF BUDGET VALUE RECORDS GIVE
+C* STARTING BYTE ADDRESS OF FLOATING POINT VALUES SECTION.
+C* OCTETS 8-9 GIVING THE LENGTH OF THE FLOATING POINT DATA
+C* SECTION IN OCTETS.
+C***
+C
+ IF (IOLDBV.EQ.1)
+ C THEN
+ CALL GBYTE (IPSCOD(IWORD),ISTFP,IOFF,16)
+ CALL OFFSET (IOFF,1,IWORD,16,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ CALL GBYTE (IPSCOD(IWORD),LENFP,IOFF,16)
+ CALL OFFSET (IOFF,1,IWORD,16,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C NUMBER OF FLOATING POINT VALUES.
+C 4 BYTES PER FLOATING POINT NUMBER.
+C
+ JLENFP = LENFP / 4
+C
+C NUMBER OF LOGICAL VALUES.
+C
+ JLENLG = ISTIN - ISTLG
+C
+C NUMBER OF INTEGER VALUES.
+C 2 OCTETS PER INTEGER.
+C
+ NBYTE = 2
+ IBITS = NBYTE * 8
+ JLENIN = ( ISTFP - ISTIN ) / NBYTE
+C
+C NO CHARACTER DATA IN OLD FORMAT.
+C
+ JLENCH = 0
+C
+C CHECK NUMBERS OF DATA ITEMS AGAINST DIMENSIONS
+C OF TARGET ARRAYS.
+C
+ IF (JLENFP.GT.ILENFP)
+ C THEN
+ IERR = -3
+ WRITE (*,9001) JLENFP
+ ENDIF
+C
+ IF (JLENLG.GT.ILENLG)
+ C THEN
+ IERR = -3
+ WRITE (*,9002) JLENLG
+ ENDIF
+C
+ IF (JLENIN.GT.ILENIN)
+ C THEN
+ IERR = -3
+ WRITE (*,9003) JLENIN
+ ENDIF
+C
+ IF (IERR.NE.0) RETURN
+C
+C NOW WE GO AROUND THE HOUSES AS THIS OLD DATA
+C HAS THE DIFFERENT DATA TYPES STORED IN A DIFFERENT
+C ORDER.
+C
+C LOGICAL VARIABLES FIRST.
+C
+ GO TO 450
+C
+ ENDIF
+C
+C
+C
+C
+C
+C
+C***
+C* OCTET 6 - NUMBER OF BYTES PER INTEGER.
+C***
+C
+ CALL GBYTE (IPSCOD(IWORD),NBYTE,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ IBITS = NBYTE * 8
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTETS 7-8 ARE RESERVED.
+C***
+C
+ CALL OFFSET (IOFF,2,IWORD,8,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTETS 9-11 - NUMBER OF CHARACTERS IN CHARACTER SECTION.
+C***
+C
+ CALL GBYTE (IPSCOD(IWORD),JLENCH,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ IF (JLENCH.GT.ILENCH)
+ C THEN
+ IERR = -3
+ WRITE (*,9004) JLENCH
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTETS 12-14 , NUMBER OF FLOATING POINT VALUES.
+C***
+C
+ CALL GBYTE (IPSCOD(IWORD),JLENFP,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ IF (JLENFP.GT.ILENFP)
+ C THEN
+ IERR = -3
+ WRITE (*,9001) JLENFP
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTETS 15-17 , NUMBER OF INTEGER VALUES.
+C***
+C
+ CALL GBYTE (IPSCOD(IWORD),JLENIN,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ IF (JLENIN.GT.ILENIN)
+ C THEN
+ IERR = -3
+ WRITE (*,9003) JLENIN
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTETS 18-20 , NUMBER OF LOGICALS.
+C***
+C
+ CALL GBYTE (IPSCOD(IWORD),JLENLG,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ IF (JLENLG.GT.ILENLG)
+ C THEN
+ IERR = -3
+ WRITE (*,9002) JLENLG
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTETS 21-23 , NUMBER OF RESERVED OCTETS.
+C***
+C
+ CALL GBYTE (IPSCOD(IWORD),IRSERV,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTETS 24-32 ARE RESERVED
+C***
+C
+ CALL OFFSET (IOFF,9,IWORD,8,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTET 33- ,GET FLOATING POINT NUMBERS AND CONVERT.
+C***
+C
+ 250 CONTINUE
+C
+ IF (JLENFP.NE.0)
+ C THEN
+C
+ DO 300 I=1,JLENFP
+ CALL GBYTE (IPSCOD(IWORD),IEXP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL GBYTE (IPSCOD(IWORD),IMANT,IOFF,24)
+ CALL OFFSET (IOFF,1,IWORD,24,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL DECFP (FPDATA(I),IEXP,IMANT)
+ 300 CONTINUE
+C
+ ENDIF
+C
+C NO CHARACTER DATA IN OLD BUDGET VALUE RECORDS.
+C
+ IF (IOLDBV.EQ.1) GO TO 550
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* GET INTEGER VALUES.
+C***
+C
+ 350 CONTINUE
+C
+ IF (JLENIN.NE.0)
+ C THEN
+C
+C SET UP MASK FOR NEGATIVE NUMBERS
+C
+ NEGSIN = 2 ** (IBITS-1)
+C
+C MAXIMUM SIZE INTEGER IN GIVEN FIELD WIDTH.
+C
+ MAXINT = NEGSIN - 1
+C
+ DO 400 I=1,JLENIN
+ CALL GBYTE (IPSCOD(IWORD),KTEMP,IOFF,IBITS)
+ CALL OFFSET (IOFF,1,IWORD,IBITS,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C HANDLE NEGATIVE NUMBERS
+C
+ IF (KTEMP.GT.MAXINT)
+ C THEN
+ KTEMP = KTEMP - NEGSIN
+ KTEMP = - KTEMP
+ ENDIF
+C
+ INDATA(I) = KTEMP
+ 400 CONTINUE
+C
+ ENDIF
+C
+C
+C FOR OLDER BUDGET VALUES OUR LAST STOP IS FOR FLOATING POINT
+C VALUES.
+C
+ IF (IOLDBV.EQ.1) GO TO 250
+C
+C
+C
+C***
+C* GET LOGICALS AND CONVERT.
+C***
+C
+ 450 CONTINUE
+C
+ IF (JLENLG.NE.0)
+ C THEN
+C
+ DO 500 I=1,JLENLG
+ CALL GBYTE (IPSCOD(IWORD),KTEMP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ LGDATA(I) = .FALSE.
+ IF (KTEMP.EQ.1) LGDATA(I) = .TRUE.
+ 500 CONTINUE
+C
+ ENDIF
+C
+C
+C FOR OLD BUDGET VALUE VERSION WE JUMP AGAIN.
+C NEXT STOP ON TOUR IS FOR INTEGER VALUES.
+C
+ IF (IOLDBV.EQ.1) GO TO 350
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* GET CHARACTER DATA.
+C***
+C
+ IF (JLENCH.NE.0)
+ C THEN
+ DO 530 I=1,JLENCH
+ CALL GBYTE (IPSCOD(IWORD),KTEMP,IOFF,8)
+ CALL OFFSET (IOFF,1,IWORD,8,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+ DO 525 J=1,NCHAR
+ IF (KTEMP.EQ.IASCII(J))
+ C THEN
+ CHDATA(I:I) = CHAR(J)
+ GO TO 530
+ ENDIF
+ 525 CONTINUE
+ IERR = -6
+ WRITE (*,9016)
+ 9016 FORMAT (1H ,'DECOPS : Character data contains other ',
+ C 'than _ - . , letters, figures or spaces.')
+ RETURN
+ 530 CONTINUE
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C***
+C* RESERVED BYTES IN DATA BLOCK.
+C***
+C
+ CALL OFFSET (IOFF,IRSERV,IWORD,8,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* SKIP ANY ZERO FILL AT END OF DATA BLOCK.
+C***
+C
+ 550 CONTINUE
+C
+ L = (IWORD-IPW) * NBIT + IOFF -IPB
+ L = LBIN * 8 - L
+ IF (L.NE.0)
+ C THEN
+ CALL OFFSET (IOFF,1,IWORD,L,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+ ENDIF
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 5 - END BLOCK.
+C*
+C********************************************************************
+C
+C CHECK 7 7 7 7 AT END OF CODED DATA.
+C
+C
+ CALL GBYTES (IPSCOD(IWORD),IBLOCK(1),IOFF,8,0,4)
+C
+C 55 IS THE VALUE OF ASCII CHARACTER '7'
+C
+ DO 600 I=1,4
+ IF (IBLOCK(I).NE.55) IERR = 1
+ 600 CONTINUE
+C
+ IF (IERR.EQ.1) WRITE (*,*) ' NO 7777 GROUP FOUND '
+C
+C
+C
+C SET NUMBER OF VALUES NEGATIVE, IF MISSING DATA VALUES.
+C
+ IF (IMISS.GE.8)
+ C THEN
+ JLENCH = -JLENCH
+ IMISS = IMISS - 8
+ ENDIF
+C
+ IF (IMISS.GE.4)
+ C THEN
+ JLENFP = -JLENFP
+ IMISS = IMISS - 4
+ ENDIF
+C
+ IF (IMISS.GE.2)
+ C THEN
+ JLENIN = -JLENIN
+ IMISS = IMISS - 2
+ ENDIF
+C
+ IF (IMISS.EQ.1) JLENLG = -JLENLG
+C
+C
+ RETURN
+C
+ 9001 FORMAT (1H ,'DECOPS : Target real array must be at least ',
+ C I10,' words long.')
+C
+ 9002 FORMAT (1H ,'DECOPS : Target logical array must be at least ',
+ C I10,' words long.')
+C
+ 9003 FORMAT (1H ,'DECOPS : Target integer array must be at least ',
+ C I10,' words long.')
+C
+ 9004 FORMAT (1H ,'DECOPS : Target character string must be at least ',
+ C I10,' characters long.')
+C
+C
+ END
diff --git a/gribex/decops2.F b/gribex/decops2.F
new file mode 100755
index 0000000..1e43aec
--- /dev/null
+++ b/gribex/decops2.F
@@ -0,0 +1,891 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE DECOPS2(NAME,CHDATA,ILENCH,FPDATA,ILENFP,INDATA,ILENIN,
+ C NBYTE,LGDATA,ILENLG,IB1PAR,IPSCOD,ILENPS,
+ C JLENCH,JLENFP,JLENIN,JLENLG,IRSERV,NBIT,IWORD,
+ C IERR )
+C
+C---->
+C*
+C* NAME : DECOPS2
+C*
+C* FUNCTION : DECODE PSEUDO-GRIB CODED DATA.
+C*
+C* INPUT : NBIT - NUMBER OF BITS IN COMPUTER WORD
+C*
+C* IPSCOD - INTEGER ARRAY OF DATA IN PSEUDO-GRIB CODE.
+C* ILENPS - LENGTH OF ARRAY IPSCOD.
+C*
+C* CHDATA - CHARACTER VARIABLE TO RECEIVE DECODED
+C* CHARACTER DATA.
+C* ILENCH - LENGTH OF THIS VARIABLE
+C*
+C* FPDATA - REAL ARRAY TO RECEIVE DECODED F.P. VALUES.
+C* ILENFP - LENGTH OF THIS ARRAY.
+C*
+C* INDATA - INTEGER ARRAY TO RECEIVE DECODED INTEGERS
+C* ILENIN - LENGTH OF THIS ARRAY.
+C*
+C* LGDATA - LOGICAL ARRAY TO RECEIVE DECODED LOGICALS
+C* ILENLG - LENGTH OF THIS ARRAY.
+C*
+C* IF ANY LENGTH (ILENCH,-FP,-IN,-LG) IS SET
+C* TO 1, ONLY BLOCK 0 AND BLOCK 1 ARE DECODED.
+C*
+C* IB1PAR - INTEGER ARRAY (DIMENSION 18) TO RECEIVE
+C* DATA DEFINITION INFORMATION.
+C*
+C*
+C* OUTPUT : PARAMETER FROM BLOCK 0
+C* ----------------------
+C*
+C* NAME - CHARACTER VARIABLE, 4 LETTERS OF CODE NAME.
+C*
+C*
+C* PARAMETERS FROM BLOCK 1 , PRODUCT DEFINITION BLOCK.
+C* --------------------------------------------------
+C*
+C* IB1PAR - INTEGER ARRAY (DIMENSION 18) OF DATA
+C* DEFINITION INFORMATION.
+C*
+C* WORD CONTENTS
+C* ---- --------
+C* 1 ORIGINATING CENTRE IDENTIFIER.
+C* 2 MODEL IDENTIFICATION.
+C* 3 GRID DEFINITION.
+C* 4 FLAG ( CODE TABLE 1)
+C* 5 PARAMETER IDENTIFIER ( CODE TABLE 2 ).
+C* 6 TYPE OF LEVEL (CODE TABLE 3).
+C* 7-8 VALUE(S) OF LEVELS (CODE TABLE 3).
+C* 9 YEAR OF DATA
+C* 10 MONTH OF DATA
+C* 11 DAY OF DATA
+C* 12 HOUR OF DATA
+C* 13 MINUTE OF DATA
+C* 14 TIME UNIT (CODE TABLE 4).
+C* 15 TIME RANGE ONE
+C* 16 TIME RANGE TWO
+C* 17 TIME RANGE FLAG (CODE TABLE 5).
+C* 18 NUMBER AVERAGED.
+C*
+C* VALUE(S) OF LEVEL CAN OCCUPY 2 WORDS..
+C* FOR A LAYER THE FIRST WORD DEFINES THE TOP
+C* AND THE SECOND THE BOTTOM OF THE LAYER.
+C* FOR A SINGLE LEVEL, ONLY THE FIRST WORD IS
+C* USED.
+C*
+C*
+C*
+C* PARAMETERS FROM BLOCK 4 , BINARY DATA BLOCK.
+C* -------------------------------------------
+C*
+C* CHDATA - UNPACKED CHARACTER DATA
+C* JLENCH - NUMBER OF CHARACTERS. NEGATIVE IF
+C* MISSING DATA CODED.
+C*
+C* FPDATA - ARRAY OF FLOATING POINT VALUES.
+C* JLENFP - NUMBER OF VALUES IN THIS ARRAY.
+C* JLENFP IS NEGATIVE IF MISSING DATA CODED
+C*
+C* INDATA - ARRAY OF INTEGER VALUES.
+C* JLENIN - NUMBER OF VALUES IN THIS ARRAY.
+C* JLENIN IS NEGATIVE IF MISSING DATA CODED
+C*
+C* LGDATA - ARRAY OF LOGICAL VALUES.
+C* JLENLG - NUMBER OF VALUES IN THIS ARRAY.
+C* JLENLG IS NEGATIVE IF MISSING DATA CODED
+C*
+C* NBYTE - NUMBER OF BYTES FOR INTEGER VALUES.
+C*
+C* IRSERV - NUMBER OF BYTES IN DATA BLOCK RESERVED
+C* FOR FUTURE USE.
+C*
+C*
+C* OTHER PARAMETERS.
+C* ----------------
+C*
+C* IWORD - NUMBER OF WORDS DECODED.
+C*
+C* IERR - ERROR INDICATOR.
+C*
+C* 0, NO ERROR.
+C*
+C* -2, INPUT ARRAY HOLDS FEWER CODED VALUES
+C* THAN EXPECTED.
+C* -3, OUTPUT ARRAY/VARIABLE TOO SMALL TO HOLD
+C* DECODED DATA VALUES.
+C* -4, CURRENTLY UNDEFINED OPTION SELECTED.
+C*
+C* 1, NO BLOCK 5 FOUND.
+C*
+C* GENERAL : DECOPS2 CALLS GBYTE
+C* GBYTES
+C* OFFSET2
+C* DECFP
+C*
+C* AUTHOR : J.HENNESSY 23.01.86
+C*
+C* MODIFIED : J.HENNESSY 06.06.86
+C* " 21.08.86
+C*
+C* J.Hennessy 17.09.90
+C* Lower case letters as well as the characters
+C* _ - . , added.
+C*
+C* J.D.Chambers September 2001
+C* Change calls to OFFSET2 from OFFSET
+C*
+C ---------------------------------------------------------------
+C----<
+C
+#include "grprs.h"
+C
+C
+ PARAMETER (NCHAR=67)
+C
+C
+ LOGICAL LGDATA
+ CHARACTER*4 NAME
+ CHARACTER*1 CHAR
+ CHARACTER*(*) CHDATA
+C
+C
+C
+ DIMENSION FPDATA(*),INDATA(*),LGDATA(*)
+ DIMENSION IPSCOD(ILENPS),IBLOCK(24),IB1PAR(18)
+ DIMENSION IASCII(NCHAR)
+ DIMENSION CHAR(NCHAR)
+C
+C
+ DATA IASCII /65 ,66 ,67 ,68 ,69 ,70 ,71 ,72 ,73 ,74 ,75 ,76 ,77 ,
+ C 78 ,79 ,80 ,81 ,82 ,83 ,84 ,85 ,86 ,87 ,88 ,89 ,90 ,
+ C 48 ,49 ,50 ,51 ,52 ,53 ,54 ,55 ,56 ,57 ,32 ,
+ C 97 ,98 ,99 ,100,101,102,103,104,105,106,107,108,109,
+ C 110,111,112,113,114,115,116,117,118,119,120,121,122,
+ C 95 ,46 ,44 , 45 /
+C
+ DATA CHAR /'A','B','C','D','E','F','G','H','I','J','K','L','M',
+ C 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
+ C '0','1','2','3','4','5','6','7','8','9',' ',
+ C 'a','b','c','d','e','f','g','h','i','j','k','l','m',
+ C 'n','o','p','q','r','s','t','u','v','w','x','y','z',
+ C '_','.',',','-' /
+C
+C
+C
+C
+C
+C
+ IERR = 0
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 0 - INDICATOR BLOCK.
+C*
+C********************************************************************
+C
+C
+C EXTRACT 4 OCTETS CONTAINING ASCII NAME.
+C
+ IWORD = 1
+ IOFF = 0
+ IBYTE = 8
+ NVAL = 4
+C
+ CALL GBYTES (IPSCOD(1),IBLOCK(1),0,IBYTE,0,NVAL)
+ CALL OFFSET2 (IOFF,32,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ DO 100 I=1,36
+ IF (IBLOCK(1).EQ.IASCII(I)) NAME(1:1) = CHAR(I)
+ IF (IBLOCK(2).EQ.IASCII(I)) NAME(2:2) = CHAR(I)
+ IF (IBLOCK(3).EQ.IASCII(I)) NAME(3:3) = CHAR(I)
+ IF (IBLOCK(4).EQ.IASCII(I)) NAME(4:4) = CHAR(I)
+ 100 CONTINUE
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 1 - PRODUCT DEFINITION BLOCK.
+C*
+C********************************************************************
+C
+C
+C EXTRACT FIRST 4 OCTETS OF BLOCK 1.
+C
+ NVAL = 4
+C
+ CALL GBYTES (IPSCOD(IWORD),IBLOCK(1),IOFF,IBYTE,0,NVAL)
+ CALL OFFSET2 (IOFF,32,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C IF THESE OCTETS DO NOT CONTAIN 0, 0, 24 AND 0 RESPECTIVELY
+C THEN THE DATA IS IN THE OLD VERSION OF THE CODE.
+C
+ IF (IBLOCK(1).EQ.0.AND.IBLOCK(2).EQ.0.AND.IBLOCK(3).EQ.24.
+ C AND.IBLOCK(4).EQ.0)
+ C THEN
+ ISNEW = 1
+ NVAL = 20
+ ELSE
+ ISNEW = 0
+ NVAL = 16
+ ENDIF
+C
+C EXTRACT NEXT 16 OR 20 OCTETS OF BLOCK 1 - NUMBER DEPENDS
+C ON VERSION OF CODE.
+C
+ CALL GBYTES (IPSCOD(IWORD),IBLOCK(5),IOFF,IBYTE,0,NVAL)
+ CALL OFFSET2 (IOFF,NVAL*IBYTE,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C TRANSFER PRODUCT DEFINITION INFORMATION TO OUTPUT ARRAY.
+C EXCEPT FOR NUMBER AVERAGED.
+C
+ DO 200 I=1,17
+ IB1PAR(I) = IBLOCK(I+4*ISNEW)
+ 200 CONTINUE
+C
+C Fixup the date, allowing year in YYYY format
+C
+ IB1PAR(9) = IBLOCK(13) + 1900
+C
+C
+C NUMBER AVERAGED OCCUPIES 2 OCTETS.
+C
+ IB1PAR(18) = IBLOCK(18+4*ISNEW) * 256 + IBLOCK(19+4*ISNEW)
+C
+C
+C
+C
+C
+C***
+C* DESCRIPTION OF LEVEL OR LAYER ( CODE TABLE 3 ).
+C***
+C
+C CERTAIN LEVEL TYPES REQUIRE THAT THE DESCRIPTION OCCUPY
+C BOTH 8 BIT FIELDS. PUT SINGLE VALUE IN FIRST LEVEL WORD.
+C
+ KTEMP = 32 + (ISNEW*224)
+ IF ((IB1PAR(6).EQ. 20).OR.
+ X (IB1PAR(6).EQ.100).OR.
+ X (IB1PAR(6).EQ.103).OR.
+ X (IB1PAR(6).EQ.105).OR.
+ X (IB1PAR(6).EQ.107).OR.
+ X (IB1PAR(6).EQ.109).OR.
+ X (IB1PAR(6).EQ.111).OR.
+ X (IB1PAR(6).EQ.113).OR.
+ X (IB1PAR(6).EQ.115).OR.
+ X (IB1PAR(6).EQ.117).OR.
+ X (IB1PAR(6).EQ.125).OR.
+ X (IB1PAR(6).EQ.160) ) THEN
+ IB1PAR(7) = IB1PAR(7) * KTEMP + IB1PAR(8)
+ IB1PAR(8) = 0
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* TIME RANGE.
+C***
+C
+C ONE TIME RANGE CAN OCCUPY TWO OCTETS.
+C
+ IF (IB1PAR(17).EQ.10)
+ C THEN
+ IB1PAR(15) = IB1PAR(15) * KTEMP + IB1PAR(16)
+ IB1PAR(16) = 0
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* CHECK IF DECODING OF ONLY BLOCKS 0 AND 1 HAS BEEN REQUESTED.
+C***
+C
+ IF (ILENFP.EQ.1.OR.ILENIN.EQ.1.OR.ILENLG.EQ.1) RETURN
+ IF (ILENCH.EQ.1) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 4 - BINARY DATA BLOCK.
+C*
+C********************************************************************
+C
+C
+C
+C***
+C* GET LENGTH OF BINARY DATA BLOCK.
+C***
+C
+C
+ IPW = IWORD
+ IPB = IOFF
+C
+ CALL GBYTE (IPSCOD(IWORD),LBIN,IOFF,24)
+ CALL OFFSET2 (IOFF,24,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTET 4 IS RESERVED.
+C* (IT IS USED IN OLDER VERSIONS OF BUDGET VALUE RECORDS AND
+C* IT GIVES THE STARTING OCTET ADDRESS OF LOGICAL VALUES, A
+C* FIXED VALUE OF 34 OR 38)
+C***
+C
+ CALL GBYTE (IPSCOD(IWORD),ISTLG,IOFF,8)
+ IOLDBV = 0
+ IF (ISTLG.EQ.34.OR.ISTLG.EQ.38) IOLDBV = 1
+C
+C
+ CALL OFFSET2 (IOFF,8,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTET 5 - MISSING DATA FLAG. (IN OLDER VERSIONS OF BUDGET VALUE
+C* RECORD IT GIVES STARTING OCTET ADDRESS OF INTEGER VALUES)
+C***
+C
+ CALL GBYTE (IPSCOD(IWORD),IMISS,IOFF,8)
+ CALL OFFSET2 (IOFF,8,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ IF (IOLDBV.EQ.1)
+ C THEN
+ ISTIN = IMISS
+ IMISS = 0
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTETS 6-7 IN OLDER VERSIONS OF BUDGET VALUE RECORDS GIVE
+C* STARTING BYTE ADDRESS OF FLOATING POINT VALUES SECTION.
+C* OCTETS 8-9 GIVING THE LENGTH OF THE FLOATING POINT DATA
+C* SECTION IN OCTETS.
+C***
+C
+ IF (IOLDBV.EQ.1)
+ C THEN
+ CALL GBYTE (IPSCOD(IWORD),ISTFP,IOFF,16)
+ CALL OFFSET2 (IOFF,16,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ CALL GBYTE (IPSCOD(IWORD),LENFP,IOFF,16)
+ CALL OFFSET2 (IOFF,16,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C NUMBER OF FLOATING POINT VALUES.
+C 4 BYTES PER FLOATING POINT NUMBER.
+C
+ JLENFP = LENFP / 4
+C
+C NUMBER OF LOGICAL VALUES.
+C
+ JLENLG = ISTIN - ISTLG
+C
+C NUMBER OF INTEGER VALUES.
+C 2 OCTETS PER INTEGER.
+C
+ NBYTE = 2
+ IBITS = NBYTE * 8
+ JLENIN = ( ISTFP - ISTIN ) / NBYTE
+C
+C NO CHARACTER DATA IN OLD FORMAT.
+C
+ JLENCH = 0
+C
+C CHECK NUMBERS OF DATA ITEMS AGAINST DIMENSIONS
+C OF TARGET ARRAYS.
+C
+ IF (JLENFP.GT.ILENFP)
+ C THEN
+ IERR = -3
+ WRITE(GRPRSM,9001) JLENFP
+ ENDIF
+C
+ IF (JLENLG.GT.ILENLG)
+ C THEN
+ IERR = -3
+ WRITE(GRPRSM,9002) JLENLG
+ ENDIF
+C
+ IF (JLENIN.GT.ILENIN)
+ C THEN
+ IERR = -3
+ WRITE(GRPRSM,9003) JLENIN
+ ENDIF
+C
+ IF (IERR.NE.0) RETURN
+C
+C NOW WE GO AROUND THE HOUSES AS THIS OLD DATA
+C HAS THE DIFFERENT DATA TYPES STORED IN A DIFFERENT
+C ORDER.
+C
+C LOGICAL VARIABLES FIRST.
+C
+ GO TO 450
+C
+ ENDIF
+C
+C
+C
+C
+C
+C
+C***
+C* OCTET 6 - NUMBER OF BYTES PER INTEGER.
+C***
+C
+ CALL GBYTE (IPSCOD(IWORD),NBYTE,IOFF,8)
+ CALL OFFSET2 (IOFF,8,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ IBITS = NBYTE * 8
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTETS 7-8 ARE RESERVED.
+C***
+C
+ CALL OFFSET2 (IOFF,16,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTETS 9-11 - NUMBER OF CHARACTERS IN CHARACTER SECTION.
+C***
+C
+ CALL GBYTE (IPSCOD(IWORD),JLENCH,IOFF,24)
+ CALL OFFSET2 (IOFF,24,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ IF (JLENCH.GT.ILENCH)
+ C THEN
+ IERR = -3
+ WRITE(GRPRSM,9004) JLENCH
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTETS 12-14 , NUMBER OF FLOATING POINT VALUES.
+C***
+C
+ CALL GBYTE (IPSCOD(IWORD),JLENFP,IOFF,24)
+ CALL OFFSET2 (IOFF,24,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ IF (JLENFP.GT.ILENFP)
+ C THEN
+ IERR = -3
+ WRITE(GRPRSM,9001) JLENFP
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTETS 15-17 , NUMBER OF INTEGER VALUES.
+C***
+C
+ CALL GBYTE (IPSCOD(IWORD),JLENIN,IOFF,24)
+ CALL OFFSET2 (IOFF,24,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ IF (JLENIN.GT.ILENIN)
+ C THEN
+ IERR = -3
+ WRITE(GRPRSM,9003) JLENIN
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTETS 18-20 , NUMBER OF LOGICALS.
+C***
+C
+ CALL GBYTE (IPSCOD(IWORD),JLENLG,IOFF,24)
+ CALL OFFSET2 (IOFF,24,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ IF (JLENLG.GT.ILENLG)
+ C THEN
+ IERR = -3
+ WRITE(GRPRSM,9002) JLENLG
+ RETURN
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTETS 21-23 , NUMBER OF RESERVED OCTETS.
+C***
+C
+ CALL GBYTE (IPSCOD(IWORD),IRSERV,IOFF,24)
+ CALL OFFSET2 (IOFF,24,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTETS 24-32 ARE RESERVED
+C***
+C
+ CALL OFFSET2 (IOFF,72,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C***
+C* OCTET 33- ,GET FLOATING POINT NUMBERS AND CONVERT.
+C***
+C
+ 250 CONTINUE
+C
+ IF (JLENFP.NE.0)
+ C THEN
+C
+ DO 300 I=1,JLENFP
+ CALL GBYTE (IPSCOD(IWORD),IEXP,IOFF,8)
+ CALL OFFSET2 (IOFF,8,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL GBYTE (IPSCOD(IWORD),IMANT,IOFF,24)
+ CALL OFFSET2 (IOFF,24,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+ CALL DECFP (FPDATA(I),IEXP,IMANT)
+ 300 CONTINUE
+C
+ ENDIF
+C
+C NO CHARACTER DATA IN OLD BUDGET VALUE RECORDS.
+C
+ IF (IOLDBV.EQ.1) GO TO 550
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* GET INTEGER VALUES.
+C***
+C
+ 350 CONTINUE
+C
+ IF (JLENIN.NE.0)
+ C THEN
+C
+C SET UP MASK FOR NEGATIVE NUMBERS
+C
+ NEGSIN = 2 ** (IBITS-1)
+C
+C MAXIMUM SIZE INTEGER IN GIVEN FIELD WIDTH.
+C
+ MAXINT = NEGSIN - 1
+C
+ DO 400 I=1,JLENIN
+ CALL GBYTE (IPSCOD(IWORD),KTEMP,IOFF,IBITS)
+ CALL OFFSET2 (IOFF,IBITS,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C HANDLE NEGATIVE NUMBERS
+C
+ IF (KTEMP.GT.MAXINT)
+ C THEN
+ KTEMP = KTEMP - NEGSIN
+ KTEMP = - KTEMP
+ ENDIF
+ IF (KTEMP.LT.0) THEN
+ KTEMP=KTEMP+MAXINT
+ KTEMP=-(KTEMP+1)
+ ENDIF
+C
+ INDATA(I) = KTEMP
+ 400 CONTINUE
+C
+ ENDIF
+C
+C
+C FOR OLDER BUDGET VALUES OUR LAST STOP IS FOR FLOATING POINT
+C VALUES.
+C
+ IF (IOLDBV.EQ.1) GO TO 250
+C
+C
+C
+C***
+C* GET LOGICALS AND CONVERT.
+C***
+C
+ 450 CONTINUE
+C
+ IF (JLENLG.NE.0)
+ C THEN
+C
+ DO 500 I=1,JLENLG
+ CALL GBYTE (IPSCOD(IWORD),KTEMP,IOFF,8)
+ CALL OFFSET2 (IOFF,8,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+ LGDATA(I) = .FALSE.
+ IF (KTEMP.EQ.1) LGDATA(I) = .TRUE.
+ 500 CONTINUE
+C
+ ENDIF
+C
+C
+C FOR OLD BUDGET VALUE VERSION WE JUMP AGAIN.
+C NEXT STOP ON TOUR IS FOR INTEGER VALUES.
+C
+ IF (IOLDBV.EQ.1) GO TO 350
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* GET CHARACTER DATA.
+C***
+C
+ IF (JLENCH.NE.0)
+ C THEN
+ DO 530 I=1,JLENCH
+ CALL GBYTE (IPSCOD(IWORD),KTEMP,IOFF,8)
+ CALL OFFSET2 (IOFF,8,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+ DO 525 J=1,NCHAR
+ IF (KTEMP.EQ.IASCII(J))
+ C THEN
+ CHDATA(I:I) = CHAR(J)
+ GO TO 530
+ ENDIF
+ 525 CONTINUE
+ IERR = -6
+ WRITE(GRPRSM,9016)
+ 9016 FORMAT (1H ,'DECOPS2: Character data contains other ',
+ C 'than _ - . , letters, figures or spaces.')
+ RETURN
+ 530 CONTINUE
+ ENDIF
+C
+C
+C
+C
+C
+C
+C
+C***
+C* RESERVED BYTES IN DATA BLOCK.
+C***
+C
+ CALL OFFSET2 (IOFF,IRSERV*8,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C***
+C* SKIP ANY ZERO FILL AT END OF DATA BLOCK.
+C***
+C
+ 550 CONTINUE
+C
+ L = (IWORD-IPW) * NBIT + IOFF -IPB
+ L = LBIN * 8 - L
+ IF (L.NE.0)
+ C THEN
+ CALL OFFSET2 (IOFF,L,IWORD,NBIT,ILENPS,IERR)
+ IF (IERR.NE.0) RETURN
+ ENDIF
+C
+C
+C
+C
+C********************************************************************
+C*
+C* BLOCK 5 - END BLOCK.
+C*
+C********************************************************************
+C
+C CHECK 7 7 7 7 AT END OF CODED DATA.
+C
+C
+ CALL GBYTES (IPSCOD(IWORD),IBLOCK(1),IOFF,8,0,4)
+C
+C 55 IS THE VALUE OF ASCII CHARACTER '7'
+C
+ DO 600 I=1,4
+ IF (IBLOCK(I).NE.55) IERR = 1
+ 600 CONTINUE
+C
+ IF (IERR.EQ.1) WRITE(GRPRSM,*) ' NO 7777 GROUP FOUND '
+C
+C
+C
+C SET NUMBER OF VALUES NEGATIVE, IF MISSING DATA VALUES.
+C
+ IF (IMISS.GE.8)
+ C THEN
+ JLENCH = -JLENCH
+ IMISS = IMISS - 8
+ ENDIF
+C
+ IF (IMISS.GE.4)
+ C THEN
+ JLENFP = -JLENFP
+ IMISS = IMISS - 4
+ ENDIF
+C
+ IF (IMISS.GE.2)
+ C THEN
+ JLENIN = -JLENIN
+ IMISS = IMISS - 2
+ ENDIF
+C
+ IF (IMISS.EQ.1) JLENLG = -JLENLG
+C
+C
+ RETURN
+C
+ 9001 FORMAT (1H ,'DECOPS2: Target real array must be at least ',
+ C I10,' words long.')
+C
+ 9002 FORMAT (1H ,'DECOPS2: Target logical array must be at least ',
+ C I10,' words long.')
+C
+ 9003 FORMAT (1H ,'DECOPS2: Target integer array must be at least ',
+ C I10,' words long.')
+C
+ 9004 FORMAT (1H ,'DECOPS2: Target character string must be at least ',
+ C I10,' characters long.')
+C
+C
+ END
diff --git a/gribex/delsp.F b/gribex/delsp.F
new file mode 100755
index 0000000..ce81692
--- /dev/null
+++ b/gribex/delsp.F
@@ -0,0 +1,306 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE DELSP (HCHAR)
+C
+C---->
+C**** DELSP - Delete spaces around valid MARS directive separators.
+C
+C Purpose.
+C --------
+C
+C Removes any spaces before and after any characters
+C encountered in input string, which are valid separators
+C in a MARS command line. These are / , = " .
+C Any spaces between minus sign and number are also removed.
+C
+C** Interface.
+C ----------
+C
+C CALL DELSP (HCHAR)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input parameters.
+C -----------------
+C
+C HCHAR - Character string to be modified.
+C
+C Output parameters.
+C ------------------
+C
+C HCHAR - Modified character string.
+C
+C Method.
+C -------
+C
+C Uses index function to locate any spaces to be
+C removed.
+C
+C Externals.
+C ----------
+C
+C RTB
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C Program contains sections 0 to 2 and section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 01.09:86.
+C
+C Modifications
+C --------------
+C
+C J. Hennessy ECMWF 30.03.87
+C Prevent looping when string ends with a separator.
+C
+C J. Hennessy ECMWF 18.07.91
+C Other separators added.
+C
+C ----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+ CHARACTER*(*) HCHAR
+C
+ INTEGER I
+ INTEGER IEND
+ INTEGER RTB
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Remove any spaces before separators.
+C ----------------------------------------------------------------
+C
+c-- WRITE (*,9000)
+c-- WRITE (*,9002) HCHAR
+C
+ 100 CONTINUE
+C
+ I = INDEX (HCHAR(1:),' /')
+C
+ IF (I.NE.0)
+ C THEN
+ HCHAR(I:) = HCHAR(I+1:)
+ GO TO 100
+ ENDIF
+C
+ 110 CONTINUE
+C
+ I = INDEX (HCHAR(1:),' ,')
+C
+ IF (I.NE.0)
+ C THEN
+ HCHAR(I:) = HCHAR(I+1:)
+ GO TO 110
+ ENDIF
+C
+ 120 CONTINUE
+C
+ I = INDEX (HCHAR(1:),' =')
+C
+ IF (I.NE.0)
+ C THEN
+ HCHAR(I:) = HCHAR(I+1:)
+ GO TO 120
+ ENDIF
+C
+ 130 CONTINUE
+C
+ I = INDEX (HCHAR(1:),' "')
+C
+ IF (I.NE.0)
+ C THEN
+ HCHAR(I:) = HCHAR(I+1:)
+ GO TO 130
+ ENDIF
+C
+ 140 CONTINUE
+C
+ I = INDEX (HCHAR(1:),' .')
+C
+ IF (I.NE.0)
+ C THEN
+ HCHAR(I:) = HCHAR(I+1:)
+ GO TO 140
+ ENDIF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Remove any spaces after separators.
+C ----------------------------------------------------------------
+C
+ iend = rtb (hchar)
+ 200 CONTINUE
+C
+ I = INDEX (HCHAR(1:),'/ ')
+C
+C* Go to section 9 if string ends '/ '.
+C
+c++ IEND = RTB (HCHAR)
+ IF (IEND.EQ.I) GO TO 210
+C
+ IF (I.NE.0)
+ C THEN
+ HCHAR(I+1:) = HCHAR(I+2:)
+ iend = iend - 1
+ GO TO 200
+ ENDIF
+C
+ 210 CONTINUE
+C
+ I = INDEX (HCHAR(1:),', ')
+C
+C* Go to section 9 if string ends ', '.
+C
+ IEND = RTB (HCHAR)
+ IF (IEND.EQ.I) GO TO 220
+C
+ IF (I.NE.0)
+ C THEN
+ HCHAR(I+1:) = HCHAR(I+2:)
+ GO TO 210
+ ENDIF
+C
+ 220 CONTINUE
+C
+ I = INDEX (HCHAR(1:),'= ')
+C
+C* Go to section 9 if string ends '= '.
+C
+ IEND = RTB (HCHAR)
+ IF (IEND.EQ.I) GO TO 230
+C
+ IF (I.NE.0)
+ C THEN
+ HCHAR(I+1:) = HCHAR(I+2:)
+ GO TO 220
+ ENDIF
+C
+ 230 CONTINUE
+C
+ I = INDEX (HCHAR(1:),'" ')
+C
+C* Go to section 9 if string ends '" '.
+C
+ IEND = RTB (HCHAR)
+ IF (IEND.EQ.I) GO TO 240
+C
+ IF (I.NE.0)
+ C THEN
+ HCHAR(I+1:) = HCHAR(I+2:)
+ GO TO 230
+ ENDIF
+C
+ 240 CONTINUE
+C
+ I = INDEX (HCHAR(1:),'. ')
+C
+C* Go to section 9 if string ends '. '.
+C
+ IEND = RTB (HCHAR)
+ IF (IEND.EQ.I) GO TO 250
+C
+ IF (I.NE.0)
+ C THEN
+ HCHAR(I+1:) = HCHAR(I+2:)
+ GO TO 240
+ ENDIF
+C
+ 250 CONTINUE
+C
+ I = INDEX (HCHAR(1:),'- ')
+C
+C* Go to section 9 if string ends '- '.
+C
+ IEND = RTB (HCHAR)
+ IF (IEND.EQ.I) GO TO 260
+C
+ IF (I.NE.0)
+ C THEN
+ HCHAR(I+1:) = HCHAR(I+2:)
+ GO TO 250
+ ENDIF
+C
+ 260 CONTINUE
+C
+c-- WRITE (*,9001)
+c-- WRITE (*,9002) HCHAR
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ 9000 FORMAT (1H ,'DELSP : Input string :-')
+C
+ 9001 FORMAT (1H ,'DELSP : Output string :-')
+C
+ 9002 FORMAT (1H ,A)
+C
+ END
diff --git a/gribex/dggsec2.F b/gribex/dggsec2.F
new file mode 100755
index 0000000..90c6c10
--- /dev/null
+++ b/gribex/dggsec2.F
@@ -0,0 +1,272 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION DGGSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS,
+ X IMISNG)
+C
+C---->
+C**** DGGSEC2P
+C
+C PURPOSE
+C _______
+C
+C Decodes GRIB section 2 values for gaussian grid fields..
+C
+C INTERFACE
+C _________
+C
+C IRET = DGGSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS,IMISNG)
+C
+C Input parameters
+C ________________
+C
+C KGRIB - GRIB product unpacked so far (upto octet 6).
+C KLENG - Length of KGRIB.
+C INSPT - Bit position of GRIB product unpacked so far.
+C KSEC0 - GRIB section 0 description.
+C KSEC2 - GRIB section 2 description.
+C IBITS - Number of bits per element in KGRIB.
+C IMISNG - Missing data value to be used.
+C
+C
+C Output parameters
+C ________________
+C
+C KSEC2 - Updated GRIB section 2 description.
+C INSPT - Updated bit position of GRIB product built so far.
+C IRET - Function return status code, 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Unpacks values given in KGRIB into KSEC2 and updates bit
+C pointer INSPT.
+C
+C Externals
+C _________
+C
+C DSGNBT - Get the sign bit and adjust value to +/-.
+C INXBIT - Insert bit data.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF February 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JP16SET
+ PARAMETER ( JP16SET = 2**16 - 1 )
+C ^---> 65535 = FFFF(hex)
+C
+C Function arguments
+C
+ INTEGER KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS,IMISNG
+ DIMENSION KGRIB(*),KSEC0(*),KSEC2(*)
+C
+C Local variables
+C
+ INTEGER ILALO(2), IRET, IRESOL
+C
+C _______________________________________________________
+C
+C Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ DGGSEC2 = 0
+C
+C _______________________________________________________
+C
+C Section 2. Unpack section 2 octets.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Octets 7 - 8 : Ni - number of points along a parallel.
+C Octets 9 - 10 : Nj - number of points along a meridian.
+C Two 16 bit fields.
+C
+C For quasi-regular grids Ni is set to all 1 bits, as
+C the number of points is different on different parallels.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(2),2,IBITS, 16,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DGGSEC2 = IRET
+ WRITE(GRPRSM,*) 'DGGSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'DGGSEC2: number of pts along parallel or meridian.'
+ WRITE(GRPRSM,*) 'DGGSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Change 1 bits to missing data value.
+C
+ IF( KSEC2(2).EQ.JP16SET ) KSEC2(2) = IMISNG
+C
+C Octets 11 - 13 : La1 - latitude of first grid point.
+C Octets 14 - 16 : Lo1 - longitude of first grid point.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DGGSEC2 = IRET
+ WRITE(GRPRSM,*) 'DGGSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'DGGSEC2: latitude or longitude of first grid pt.'
+ WRITE(GRPRSM,*) 'DGGSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+ CALL DSGNBT( KSEC2(4), ILALO(1), 24, IRET)
+ CALL DSGNBT( KSEC2(5), ILALO(2), 24, IRET)
+C
+C Octet 17 : Resolution and components flag.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IRESOL,1,IBITS, 8,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DGGSEC2 = IRET
+ WRITE(GRPRSM,*) 'DGGSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'DGGSEC2: components flag.'
+ WRITE(GRPRSM,*) 'DGGSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C All flag fields are already set to 0, so
+C
+ IF( IRESOL.EQ.0 ) GOTO 210
+C
+C Fix up for flag which was different in Experimental edition.
+ IF( KSEC0(2).EQ.-1.AND.(IRESOL.EQ.1.OR.IRESOL.EQ.3))
+ X IRESOL = 128
+C
+C Set Resolution flag.
+ IF( IRESOL.GE.128) THEN
+ KSEC2(6) = 128
+ IRESOL = IRESOL - 128
+ ENDIF
+C
+C Set earth flag.
+ IF( IRESOL.GE.64) THEN
+ KSEC2(18) = 64
+ IRESOL = IRESOL - 64
+ ENDIF
+C
+ 210 CONTINUE
+C
+C Set components flag.
+C
+ KSEC2(19) = IRESOL
+C
+C Octets 18 - 20 : La2 - latitude of last grid point.
+C Octets 21 - 23 : Lo2 - longitude of last grid point.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DGGSEC2 = IRET
+ WRITE(GRPRSM,*) 'DGGSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'DGGSEC2: latitude or longitude of last grid point.'
+ WRITE(GRPRSM,*) 'DGGSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+ CALL DSGNBT( KSEC2(7), ILALO(1), 24, IRET)
+ CALL DSGNBT( KSEC2(8), ILALO(2), 24, IRET)
+C
+C
+C Octets 24 - 25 : Di - i direction increment.
+C One 16 bit field.
+C
+C For quasi-regular grids all Di bits are set to 1, as
+C the increment is different on different parallels.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(9),1,IBITS, 16,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DGGSEC2 = IRET
+ WRITE(GRPRSM,*) 'DGGSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'DGGSEC2: i direction increment.'
+ WRITE(GRPRSM,*) 'DGGSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Change 1 bits to missing data value.
+C
+ IF( KSEC2(9).EQ.JP16SET) KSEC2(9) = IMISNG
+C
+C Octets 26 - 27 : N- number of parallels between a Pole
+C and the Equator.
+C One 16 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(10),1,IBITS, 16,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DGGSEC2 = IRET
+ WRITE(GRPRSM,*) 'DGGSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'DGGSEC2: no. of parallels between pole and Equator'
+ WRITE(GRPRSM,*) 'DGGSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octet 28 : Scanning mode flags.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(11),1,IBITS, 8,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DGGSEC2 = IRET
+ WRITE(GRPRSM,*) 'DGGSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'DGGSEC2: scanning mode flags.'
+ WRITE(GRPRSM,*) 'DGGSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Fix-up for flag which was different in Experimental Edition.
+C
+ IF( KSEC0(2).EQ.-1.AND.KSEC2(11).EQ.1) KSEC2(11) = 0
+C
+C Octets 29 - 32 : Reserved.
+C Two 16 bit fields.
+C
+C Skip the 4 octets
+C
+ INSPT = INSPT + 32
+C
+C _______________________________________________________
+C
+C Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/gribex/dlasec2.F b/gribex/dlasec2.F
new file mode 100755
index 0000000..9d8e20b
--- /dev/null
+++ b/gribex/dlasec2.F
@@ -0,0 +1,284 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION DLASEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS)
+C
+C---->
+C**** DLASEC2P
+C
+C PURPOSE
+C _______
+C
+C Decodes GRIB section 2 values for lambert conformal fields.
+C
+C INTERFACE
+C _________
+C
+C IRET = DLASEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS)
+C
+C Input parameters
+C ________________
+C
+C KGRIB - GRIB product unpacked so far (upto octet 6).
+C KLENG - Length of KGRIB.
+C INSPT - Bit position of GRIB product unpacked so far.
+C KSEC0 - GRIB section 0 description.
+C KSEC2 - GRIB section 2 description.
+C IBITS - Number of bits per element in KGRIB.
+C
+C
+C Output parameters
+C ________________
+C
+C KSEC2 - Updated GRIB section 2 description.
+C INSPT - Updated bit position of GRIB product built so far.
+C IRET - Function return status code, 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Unpacks values given in KGRIB into KSEC2 and updates bit
+C pointer INSPT.
+C
+C Externals
+C _________
+C
+C DSGNBT - Get the sign bit and adjust value to +/-.
+C INXBIT - Insert bit data.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF February 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Function arguments
+C
+ INTEGER KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS
+ DIMENSION KGRIB(*),KSEC0(*),KSEC2(*)
+C
+C Local variables
+C
+ INTEGER ILALO(2), IRET, IRESOL
+C
+C _______________________________________________________
+C
+C Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ DLASEC2 = 0
+C
+C _______________________________________________________
+C
+C Section 2. Unpack section 2 octets.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Octets 7 - 8 : Ni - number of points along X-axis.
+C Octets 9 - 10 : Nj - number of points along Y-axis.
+C Two 16 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(2),2,IBITS, 16,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DLASEC2 = 1
+ WRITE(GRPRSM,*) 'GRIBEX: Error extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: number of points along X or Y axis.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 11 - 13 : La1 - latitude of first grid point.
+C Octets 14 - 16 : Lo1 - longitude of first grid point.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DLASEC2 = 1
+ WRITE(GRPRSM,*) 'GRIBEX: Error extracting'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: latitude or longitude of first grid pt.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C If sign bit is 1, value is negative.
+C
+ CALL DSGNBT( KSEC2(4), ILALO(1), 24, IRET)
+ CALL DSGNBT( KSEC2(5), ILALO(2), 24, IRET)
+C
+C Octet 17 : Resolution and components flag.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IRESOL,1,IBITS, 8,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DLASEC2 = 1
+ WRITE(GRPRSM,*) 'GRIBEX: Error extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: components flag.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C If all flag fields are already set to 0, bypass.
+C
+ IF( IRESOL.EQ.0 ) GOTO 515
+C
+C Resolution flag is not applicable.
+C
+ IF( IRESOL.GE.128) THEN
+ KSEC2(6) = 128
+ IRESOL = IRESOL - 128
+ ENDIF
+C
+C Set earth flag.
+C
+ IF( IRESOL.GE.64) THEN
+ KSEC2(18) = 64
+ IRESOL = IRESOL - 64
+ ENDIF
+C
+C Set components flag.
+C
+ KSEC2(19) = IRESOL
+C
+ 515 CONTINUE
+C
+C Octets 18 - 20 : LoV - orientation of the grid.
+C One 24 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),1,IBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DLASEC2 = 1
+ WRITE(GRPRSM,*) 'GRIBEX: Error extracting'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: latitude or longitude of last grid point.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C If sign bit is 1, value is negative.
+C
+ CALL DSGNBT( KSEC2(7), ILALO(1), 24, IRET)
+C
+C Octets 21 - 23 : Dx - X direction grid length.
+C Octets 24 - 26 : Dy - Y direction grid length.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(9),2,IBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DLASEC2 = 1
+ WRITE(GRPRSM,*) 'GRIBEX: Error extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: X or Y axis grid length.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octet 27 : Projection centre flag.
+C One 8-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(13),1,IBITS, 8,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DLASEC2 = 1
+ WRITE(GRPRSM,*) 'GRIBEX: Error extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: Projection centre flag.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octet 28 : Scanning mode flags.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(11),1,IBITS, 8,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DLASEC2 = 1
+ WRITE(GRPRSM,*) 'GRIBEX: Error extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: scanning mode flags.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Fix-up for flag which was different in Experimental
+C Edition.
+C
+ IF( KSEC0(2).EQ.-1.AND.KSEC2(11).EQ.1) KSEC2(11) = 0
+C
+C Octets 29 - 31 : Latin 1.
+C Octets 32 - 34 : Latin 2.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DLASEC2 = 1
+ WRITE(GRPRSM,*) 'GRIBEX: Error extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: Latin1 or Latin2 of secants points.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C If sign bit is 1, value is negative.
+C
+ CALL DSGNBT( KSEC2(14), ILALO(1), 24, IRET)
+ CALL DSGNBT( KSEC2(15), ILALO(2), 24, IRET)
+C
+C Octets 35 - 37 : Latitude of the southern pole.
+C Octets 38 - 40 : Longitude of the southern pole.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DLASEC2 = 1
+ WRITE(GRPRSM,*) 'GRIBEX: Error extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: latitude/longitude of southern pole.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C If sign bit is 1, value is negative.
+C
+ CALL DSGNBT( KSEC2(20), ILALO(1), 24, IRET)
+ CALL DSGNBT( KSEC2(21), ILALO(2), 24, IRET)
+C
+C Octets 41 - 42 : Reserved.
+C One 16 bit fields.
+C
+C Update bit pointer.
+C
+ INSPT = INSPT + 16
+C
+C _______________________________________________________
+C
+C Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/gribex/dllsec2.F b/gribex/dllsec2.F
new file mode 100755
index 0000000..c516b15
--- /dev/null
+++ b/gribex/dllsec2.F
@@ -0,0 +1,275 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION DLLSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS,
+ X IMISNG)
+C
+C---->
+C**** DLLSEC2P
+C
+C PURPOSE
+C _______
+C
+C Decodes GRIB section 2 values for lat/long grid fields.
+C
+C INTERFACE
+C _________
+C
+C IRET = DLLSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS,IMISNG)
+C
+C Input parameters
+C ________________
+C
+C KGRIB - GRIB product unpacked so far (upto octet 6).
+C KLENG - Length of KGRIB.
+C INSPT - Bit position of GRIB product unpacked so far.
+C KSEC0 - GRIB section 0 description.
+C KSEC2 - GRIB section 2 description.
+C IBITS - Number of bits per element in KGRIB.
+C IMISNG - Missing data value to be used.
+C
+C
+C Output parameters
+C ________________
+C
+C KSEC2 - Updated GRIB section 2 description.
+C INSPT - Updated bit position of GRIB product built so far.
+C IRET - Function return status code, 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Unpacks values given in KGRIB into KSEC2 and updates bit
+C pointer INSPT.
+C
+C Externals
+C _________
+C
+C DSGNBT - Get the sign bit and adjust value to +/-.
+C INXBIT - Insert bit data.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF February 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JP16SET
+ PARAMETER ( JP16SET = 2**16 - 1 )
+C ^---> 65535 = FFFF(hex)
+C
+C Function arguments
+C
+ INTEGER KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS,IMISNG
+ DIMENSION KGRIB(*),KSEC0(*),KSEC2(*)
+C
+C Local variables
+C
+ INTEGER ILALO(2), IRET, IRESOL
+C
+C _______________________________________________________
+C
+C Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ DLLSEC2 = 0
+C
+C _______________________________________________________
+C
+C Section 2. Unpack section 2 octets.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Octets 7 - 8 : Ni - number of points along a parallel.
+C Octets 9 - 10 : Nj - number of points along a meridian.
+C Two 16 bit fields.
+C
+C WARNING!!
+C For quasi-regular grids, it is here assumed that Ni is variable,
+C i.e. that the number of points along a parallel is variable but
+C that the number of points along a meridian is fixed.
+C
+C For quasi-regular grids Ni is set to all 1 bits, as
+C the number of points is different on different parallels.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(2),2,IBITS, 16,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DLLSEC2 = 1
+ WRITE(GRPRSM,*) 'DLLSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'DLLSEC2: number of pts along parallel or meridian.'
+ WRITE(GRPRSM,*) 'DLLSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 11 - 13 : La1 - latitude of first grid point.
+C Octets 14 - 16 : Lo1 - longitude of first grid point.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DLLSEC2 = 1
+ WRITE(GRPRSM,*) 'DLLSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'DLLSEC2: latitude or longitude of first grid pt.'
+ WRITE(GRPRSM,*) 'DLLSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+ CALL DSGNBT( KSEC2(4), ILALO(1), 24, IRET)
+ CALL DSGNBT( KSEC2(5), ILALO(2), 24, IRET)
+C
+C Octet 17 : Resolution and components flag.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IRESOL,1,IBITS, 8,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DLLSEC2 = 1
+ WRITE(GRPRSM,*) 'DLLSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'DLLSEC2: components flag.'
+ WRITE(GRPRSM,*) 'DLLSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C All flag fields are already set to 0, so
+C
+ IF( IRESOL.EQ.0 ) GOTO 211
+C
+C Fix up for flag which was different in Experimental edition.
+C
+ IF( KSEC0(2).EQ.-1.AND.(IRESOL.EQ.1.OR.IRESOL.EQ.3)) IRESOL = 128
+C
+C Set Resolution flag.
+C
+ IF( IRESOL.GE.128) THEN
+ KSEC2(6) = 128
+ IRESOL = IRESOL - 128
+ ENDIF
+C
+C Set earth flag.
+C
+ IF( IRESOL.GE.64) THEN
+ KSEC2(18) = 64
+ IRESOL = IRESOL - 64
+ ENDIF
+C
+C Set components flag.
+C
+ KSEC2(19) = IRESOL
+C
+ 211 CONTINUE
+C
+C Octets 18 - 20 : La2 - latitude of last grid point.
+C Octets 21 - 23 : Lo2 - longitude of last grid point.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DLLSEC2 = 1
+ WRITE(GRPRSM,*) 'DLLSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'DLLSEC2: latitude or longitude of last grid point.'
+ WRITE(GRPRSM,*) 'DLLSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+ CALL DSGNBT( KSEC2(7), ILALO(1), 24, IRET)
+ CALL DSGNBT( KSEC2(8), ILALO(2), 24, IRET)
+C
+C Octets 24 - 25 : Di - i direction increment.
+C One 16 bit field.
+C
+C For quasi-regular grids all Di bits are set to 1, as
+C the increment is different on different parallels.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(9),1,IBITS, 16,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DLLSEC2 = 1
+ WRITE(GRPRSM,*) 'DLLSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'DLLSEC2: i direction increment.'
+ WRITE(GRPRSM,*) 'DLLSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Change 1 bits to missing data value.
+C
+ IF( KSEC2(9).EQ.JP16SET) KSEC2(9) = IMISNG
+C
+C
+C Octets 26 - 27 : Dj - j direction increment.
+C One 16 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(10),1,IBITS, 16,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DLLSEC2 = 1
+ WRITE(GRPRSM,*) 'DLLSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'DLLSEC2: j direction increment.'
+ WRITE(GRPRSM,*) 'DLLSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Change 1 bits to missing data value.
+C
+ IF( KSEC2(10).EQ.JP16SET) KSEC2(10) = IMISNG
+C
+C Octet 28 : Scanning mode flags.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(11),1,IBITS, 8,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DLLSEC2 = 1
+ WRITE(GRPRSM,*) 'DLLSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'DLLSEC2: scanning mode flags.'
+ WRITE(GRPRSM,*) 'DLLSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Fix-up for flag which was different in Experimental Edition.
+ IF( KSEC0(2).EQ.-1.AND.KSEC2(11).EQ.1) KSEC2(11) = 0
+C
+C Octets 29 - 32 : Reserved.
+C Two 16 bit fields.
+C
+C Update bit pointer.
+ INSPT = INSPT + 32
+C
+C _______________________________________________________
+C
+C Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/gribex/dmesec2.F b/gribex/dmesec2.F
new file mode 100755
index 0000000..8f8682b
--- /dev/null
+++ b/gribex/dmesec2.F
@@ -0,0 +1,311 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION DMESEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,KBITS,
+ X KMISNG)
+C
+C---->
+C**** DMESEC2
+C
+C PURPOSE
+C _______
+C
+C Decodes GRIB section 2 values for Mercator grid fields.
+C
+C INTERFACE
+C _________
+C
+C IRET = DMESEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,KBITS,KMISNG)
+C
+C Input parameters
+C ________________
+C
+C KGRIB - GRIB product unpacked so far (upto octet 6).
+C KLENG - Length of KGRIB.
+C INSPT - Bit position of GRIB product unpacked so far.
+C KSEC0 - GRIB section 0 description.
+C KSEC2 - GRIB section 2 description.
+C KBITS - Number of bits per element in KGRIB.
+C KMISNG - Missing data value to be used.
+C
+C
+C Output parameters
+C ________________
+C
+C KSEC2 - Updated GRIB section 2 description.
+C INSPT - Updated bit position of GRIB product built so far.
+C IRET - Function return status code, 0 = OK
+C
+C Common block usage
+C __________________
+C
+C /GRPRSCM/ for GRPRSM variable.
+C
+C Method
+C ______
+C
+C Unpacks values given in KGRIB into KSEC2 and updates bit
+C pointer INSPT.
+C
+C Externals
+C _________
+C
+C DSGNBT - Get the sign bit and adjust value to +/-.
+C INXBIT - Extract bit data.
+C
+C
+C AUTHOR
+C ______
+C
+C J. Clochard, Meteo France, for ECMWF - October 2000.
+C (derived from DLLSEC2)
+C
+C MODIFICATIONS
+C _____________
+C
+C J. Clochard, June 2008.
+C Use of GRPRSM instead of standard output in error/debug printouts.
+C Doctorize all dummy-arguments (K for integers, O for logicals).
+C
+C----<
+C _______________________________________________________
+C
+C Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+C Parameters
+C
+ INTEGER JP16SET, JP24SET
+ PARAMETER ( JP16SET = 2**16 - 1 )
+C ^---> 65535 = FFFF(hex)
+ PARAMETER ( JP24SET = 2**24 - 1 )
+C ^---> 16777215 = FFFFFF(hex)
+C Function arguments
+C
+ INTEGER KGRIB,KLENG,INSPT,KSEC0,KSEC2,KBITS,KMISNG
+ DIMENSION KGRIB(*),KSEC0(*),KSEC2(*)
+C
+C Global variables
+C
+#include "grprs.h"
+C
+C Local variables
+C
+ INTEGER ILALO(2), IRET, IRESOL
+C
+C _______________________________________________________
+C
+C Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ DMESEC2 = 0
+C
+C _______________________________________________________
+C
+C Section 2. Unpack section 2 octets.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Octets 7 - 8 : Ni - number of points along a parallel.
+C Octets 9 - 10 : Nj - number of points along a meridian.
+C Two 16 bit fields.
+C
+C WARNING!!
+C For quasi-regular grids, it is here assumed that Ni is variable,
+C i.e. that the number of points along a parallel is variable but
+C that the number of points along a meridian is fixed.
+C
+C For quasi-regular grids Ni is set to all 1 bits, as
+C the number of points is different on different parallels.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(2),2,KBITS, 16,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DMESEC2 = 1
+ WRITE(GRPRSM,*) 'DMESEC2: Error extracting number of pts '
+ WRITE(GRPRSM,*) 'DMESEC2: along parallel or meridian.'
+ WRITE(GRPRSM,*) 'DMESEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 11 - 13 : La1 - latitude of first grid point.
+C Octets 14 - 16 : Lo1 - longitude of first grid point.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO,2,KBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DMESEC2 = 1
+ WRITE(GRPRSM,*) 'DMESEC2: Error extracting'
+ WRITE(GRPRSM,*)
+ X 'DMESEC2: latitude or longitude of first grid pt.'
+ WRITE(GRPRSM,*) 'DMESEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+ CALL DSGNBT( KSEC2(4), ILALO(1), 24, IRET)
+ CALL DSGNBT( KSEC2(5), ILALO(2), 24, IRET)
+C
+C Octet 17 : Resolution and components flag.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IRESOL,1,KBITS, 8,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DMESEC2 = 1
+ WRITE(GRPRSM,*) 'DMESEC2: Error extracting'
+ WRITE(GRPRSM,*) 'DMESEC2: resolution and components flag.'
+ WRITE(GRPRSM,*) 'DMESEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C All flag fields are already set to 0, so
+C
+ IF( IRESOL.EQ.0 ) GOTO 211
+C
+C Fix up for flag which was different in Experimental edition.
+C
+ IF( KSEC0(2).EQ.-1.AND.(IRESOL.EQ.1.OR.IRESOL.EQ.3)) IRESOL = 128
+C
+C Set Resolution flag.
+C
+ IF( IRESOL.GE.128) THEN
+ KSEC2(6) = 128
+ IRESOL = IRESOL - 128
+ ENDIF
+C
+C Set earth flag.
+C
+ IF( IRESOL.GE.64) THEN
+ KSEC2(18) = 64
+ IRESOL = IRESOL - 64
+ ENDIF
+C
+C Set components flag.
+C
+ KSEC2(19) = IRESOL
+C
+ 211 CONTINUE
+C
+C Octets 18 - 20 : La2 - latitude of last grid point.
+C Octets 21 - 23 : Lo2 - longitude of last grid point.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO,2,KBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DMESEC2 = 1
+ WRITE(GRPRSM,*) 'DMESEC2: Error extracting'
+ WRITE(GRPRSM,*)
+ X 'DMESEC2: latitude or longitude of last grid point.'
+ WRITE(GRPRSM,*) 'DMESEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+ CALL DSGNBT( KSEC2(7), ILALO(1), 24, IRET)
+ CALL DSGNBT( KSEC2(8), ILALO(2), 24, IRET)
+C
+C Octets 24 - 26 : Latin - latitude(s) at which the Mercator
+C projection cylinder intersects the Earth.
+C One 24 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO,1,KBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DMESEC2 = 1
+ WRITE(GRPRSM,*) 'DMESEC2: Error extracting'
+ WRITE(GRPRSM,*) 'DMESEC2: latitude of intersection.'
+ WRITE(GRPRSM,*) 'DMESEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+ IF( ILALO(1).EQ.JP24SET) THEN
+C
+C Change 1 bits to missing data value.
+ KSEC2(9) = KMISNG
+ ELSE
+C
+C Take into account sign bit if any.
+ CALL DSGNBT( KSEC2(9), ILALO(1), 24, IRET)
+ ENDIF
+C
+C Octet 27 : Reserved. Set to zero.
+C One 8 bit field.
+C
+ KSEC2(10) = 0
+C
+C Update bit pointer.
+ INSPT = INSPT + 8
+C
+C Octet 28 : Scanning mode flags.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(11),1,KBITS, 8,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DMESEC2 = 1
+ WRITE(GRPRSM,*) 'DMESEC2: Error extracting'
+ WRITE(GRPRSM,*) 'DMESEC2: scanning mode flags.'
+ WRITE(GRPRSM,*) 'DMESEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Fix-up for flag which was different in Experimental Edition.
+ IF( KSEC0(2).EQ.-1.AND.KSEC2(11).EQ.1) KSEC2(11) = 0
+C
+C Octets 29 - 31 : Di - i direction increment.
+C One 24 bit field.
+C
+C For quasi-regular grids all Di bits are set to 1, as
+C the increment is different on different parallels.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(13),1,KBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DMESEC2 = 1
+ WRITE(GRPRSM,*) 'DMESEC2: Error extracting'
+ WRITE(GRPRSM,*) 'DMESEC2: i direction increment.'
+ WRITE(GRPRSM,*) 'DMESEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Change 1 bits to missing data value.
+C
+ IF( KSEC2(13).EQ.JP24SET) KSEC2(13) = KMISNG
+C
+C
+C Octets 32 - 34 : Dj - j direction increment.
+C One 24 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(14),1,KBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DMESEC2 = 1
+ WRITE(GRPRSM,*) 'DMESEC2: Error extracting'
+ WRITE(GRPRSM,*) 'DMESEC2: j direction increment.'
+ WRITE(GRPRSM,*) 'DMESEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Change 1 bits to missing data value.
+C
+ IF( KSEC2(14).EQ.JP24SET) KSEC2(14) = KMISNG
+C
+C Octets 35 - 42 : Reserved.
+C Four 16 bit fields.
+C
+C Update bit pointer.
+ INSPT = INSPT + 64
+C
+C _______________________________________________________
+C
+C Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/gribex/docsec2.F b/gribex/docsec2.F
new file mode 100755
index 0000000..5f44ea1
--- /dev/null
+++ b/gribex/docsec2.F
@@ -0,0 +1,157 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION DOCSEC2(KGRIB,KLENG,INSPT,KSEC2,IBITS)
+C
+C---->
+C**** DOCSEC2P
+C
+C PURPOSE
+C _______
+C
+C Decodes GRIB section 2 values for ECMWF ocean fields.
+C
+C INTERFACE
+C _________
+C
+C IRET = DOCSEC2(KGRIB,KLENG,INSPT,KSEC2,IBITS)
+C
+C Input parameters
+C ________________
+C
+C KGRIB - GRIB product unpacked so far (upto octet 6).
+C KLENG - Length of KGRIB.
+C INSPT - Bit position of GRIB product unpacked so far.
+C KSEC2 - GRIB section 2 description.
+C IBITS - Number of bits per element in KGRIB.
+C
+C
+C Output parameters
+C ________________
+C
+C KSEC2 - Updated GRIB section 2 description.
+C INSPT - Updated bit position of GRIB product built so far.
+C IRET - Function return status code, 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Unpacks values given in KGRIB into KSEC2 and updates bit
+C pointer INSPT.
+C
+#include "eocsec2.h"
+C
+C Externals
+C _________
+C
+C DSGNBT - Get the sign bit and adjust value to +/-.
+C INXBIT - Insert bit data.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF February 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JP16SET
+ PARAMETER ( JP16SET = 2**16 - 1 )
+C ^---> 65535 = FFFF(hex)
+C
+C Function arguments
+C
+ INTEGER KGRIB,KLENG,INSPT,KSEC2,IBITS
+ DIMENSION KGRIB(*),KSEC2(*)
+C
+C Local variables
+C
+ INTEGER IRET
+C
+C _______________________________________________________
+C
+C Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ DOCSEC2 = 0
+C
+C _______________________________________________________
+C
+C Section 2. Unpack section 2 octets.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Octets 7 - 8 : Ni - number of points along a parallel.
+C Octets 9 - 10 : Nj - number of points along a meridian.
+C Two 16 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(2),2,IBITS, 16,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DOCSEC2 = 1
+ WRITE(GRPRSM,*) 'DOCSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'DOCSEC2: number of pts along first or second axis.'
+ WRITE(GRPRSM,*) 'DOCSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octets 11 - 27 : Reserved.
+C
+C Move pointer past reserved octets.
+ INSPT = INSPT + 8*17
+C
+C Octet 28 : Scanning mode flags.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(11),1,IBITS, 8,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DOCSEC2 = 1
+ WRITE(GRPRSM,*) 'DOCSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'DOCSEC2: scanning mode flags.'
+ WRITE(GRPRSM,*) 'DOCSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octets 29 - 32 : Reserved.
+C
+C Move pointer past reserved octets.
+ INSPT = INSPT + 8*4
+C
+C _______________________________________________________
+C
+C Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/gribex/dpssec2.F b/gribex/dpssec2.F
new file mode 100755
index 0000000..17f4cce
--- /dev/null
+++ b/gribex/dpssec2.F
@@ -0,0 +1,261 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION DPSSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS)
+C
+C---->
+C**** DPSSEC2P
+C
+C PURPOSE
+C _______
+C
+C Decodes GRIB section 2 values for polar stereographic fields.
+C
+C INTERFACE
+C _________
+C
+C IRET = DPSSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS)
+C
+C Input parameters
+C ________________
+C
+C KGRIB - GRIB product unpacked so far (upto octet 6).
+C KLENG - Length of KGRIB.
+C INSPT - Bit position of GRIB product unpacked so far.
+C KSEC0 - GRIB section 0 description.
+C KSEC2 - GRIB section 2 description.
+C IBITS - Number of bits per element in KGRIB.
+C
+C
+C Output parameters
+C ________________
+C
+C KSEC2 - Updated GRIB section 2 description.
+C INSPT - Updated bit position of GRIB product built so far.
+C IRET - Function return status code, 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Unpacks values given in KGRIB into KSEC2 and updates bit
+C pointer INSPT.
+C
+C Externals
+C _________
+C
+C DSGNBT - Get the sign bit and adjust value to +/-.
+C INXBIT - Insert bit data.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF March 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Function arguments
+C
+ INTEGER KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS
+ DIMENSION KGRIB(*),KSEC0(*),KSEC2(*)
+C
+C Local variables
+C
+ INTEGER ILALO(2), IRET, IRESOL
+C
+C _______________________________________________________
+C
+C Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ DPSSEC2 = 0
+C
+C _______________________________________________________
+C
+C Section 2. Unpack section 2 octets.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Octets 7 - 8 : Ni - number of points along X-axis.
+C Octets 9 - 10 : Nj - number of points along Y-axis.
+C Two 16 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(2),2,IBITS, 16,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DPSSEC2 = 1
+ WRITE(GRPRSM,*) 'DPSSEC2: Error extracting'
+ WRITE(GRPRSM,*) 'DPSSEC2: number of points along X or Y axis.'
+ WRITE(GRPRSM,*) 'DPSSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 11 - 13 : La1 - latitude of first grid point.
+C Octets 14 - 16 : Lo1 - longitude of first grid point.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DPSSEC2 = 1
+ WRITE(GRPRSM,*) 'DPSSEC2: Error extracting'
+ WRITE(GRPRSM,*)
+ X 'DPSSEC2: latitude or longitude of first grid pt.'
+ WRITE(GRPRSM,*) 'DPSSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C If sign bit is 1, value is negative.
+C
+ CALL DSGNBT( KSEC2(4), ILALO(1), 24, IRET)
+ CALL DSGNBT( KSEC2(5), ILALO(2), 24, IRET)
+C
+C Octet 17 : Resolution and components flag.
+C One 8 bit field.
+C
+C Resolution flag ( KSEC2(6) ) is not applicable.
+C
+ KSEC2(6) = 0
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IRESOL,1,IBITS, 8,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DPSSEC2 = 1
+ WRITE(GRPRSM,*) 'DPSSEC2: Error extracting'
+ WRITE(GRPRSM,*) 'DPSSEC2: components flag.'
+ WRITE(GRPRSM,*) 'DPSSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C All flag fields are already set to 0, so
+C
+ IF( IRESOL.EQ.0 ) GOTO 213
+C
+C Fix up for flag which was different in Experimental edition.
+C
+ IF( KSEC0(2).EQ.-1.AND.(IRESOL.EQ.1.OR.IRESOL.EQ.3)) IRESOL = 128
+C
+C Resolution flag is not applicable.
+C
+ IF( IRESOL.GE.128 ) IRESOL = IRESOL - 128
+C
+C Set earth flag.
+C
+ IF( IRESOL.GE.64 ) THEN
+ KSEC2(18) = 64
+ IRESOL = IRESOL - 64
+ ENDIF
+C
+C Set components flag.
+C
+ KSEC2(19) = IRESOL
+C
+ 213 CONTINUE
+C
+C CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(6),1,IBITS, 8,'D',IRET)
+C IF( IRET.NE.0 ) THEN
+C DPSSEC2 = 1
+C WRITE(GRPRSM,*) 'DPSSEC2: Error extracting'
+C WRITE(GRPRSM,*) 'DPSSEC2: components flag.'
+C WRITE(GRPRSM,*) 'DPSSEC2: Return code = ', IRET
+C GOTO 900
+C ENDIF
+C
+C Octets 18 - 20 : LoV - orientation of the grid.
+C One 24 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),1,IBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DPSSEC2 = 1
+ WRITE(GRPRSM,*) 'DPSSEC2: Error extracting'
+ WRITE(GRPRSM,*)
+ X 'DPSSEC2: latitude or longitude of last grid point.'
+ WRITE(GRPRSM,*) 'DPSSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C If sign bit is 1, value is negative.
+C
+ CALL DSGNBT( KSEC2(7), ILALO(1), 24, IRET)
+C
+C Octets 21 - 23 : Dx - X direction grid length.
+C Octets 24 - 26 : Dy - Y direction grid length.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(9),2,IBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DPSSEC2 = 1
+ WRITE(GRPRSM,*) 'DPSSEC2: Error extracting'
+ WRITE(GRPRSM,*) 'DPSSEC2: X or Y axis grid length.'
+ WRITE(GRPRSM,*) 'DPSSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octet 27 : Projection centre flag.
+C One 8-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(13),1,IBITS, 8,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DPSSEC2 = 1
+ WRITE(GRPRSM,*) 'DPSSEC2: Error extracting'
+ WRITE(GRPRSM,*) 'DPSSEC2: Projection centre flag.'
+ WRITE(GRPRSM,*) 'DPSSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octet 28 : Scanning mode flags.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(11),1,IBITS, 8,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DPSSEC2 = 1
+ WRITE(GRPRSM,*) 'DPSSEC2: Error extracting'
+ WRITE(GRPRSM,*) 'DPSSEC2: scanning mode flags.'
+ WRITE(GRPRSM,*) 'DPSSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Fix-up for flag which was different in Experimental Edition.
+C
+ IF( KSEC0(2).EQ.-1.AND.KSEC2(11).EQ.1) KSEC2(11) = 0
+C
+C Octets 29 - 32 : Reserved.
+C Two 16 bit fields.
+C
+C Update bit pointer.
+C
+ INSPT = INSPT + 32
+C
+C _______________________________________________________
+C
+C Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/gribex/dsect4.F b/gribex/dsect4.F
new file mode 100755
index 0000000..a001625
--- /dev/null
+++ b/gribex/dsect4.F
@@ -0,0 +1,394 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION DSECT4( PDATA, KTRUNC, KSEC1, KSEC4,
+ X KGRIB, KLENG, KNSPT, KBITS, KPACK)
+C
+C---->
+C**** DSECT4
+C
+C Purpose.
+C --------
+C
+C Decode GRIB section 4 for complex packing of spherical harmonics.
+C
+C
+C** Interface.
+C ----------
+C
+C KRET = DSECT4( PDATA, KTRUNC, KSEC1, KSEC4,
+C X KGRIB, KLENG, KNSPT, KBITS, KPACK)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C PDATA - Array of floating point values.
+C KTRUNC - Truncation of the spherical harmonic coefficients.
+C KLENG - Length of GRIB product array
+C KNSPT - Bit pointer for next value in GRIB product
+C KBITS - Number of bits per computer word.
+C KPACK - Number of bits per packed value.
+C
+C
+C Output Parameters.
+C -----------------
+C
+C KSEC1 - Array of GRIB section 1 values
+C KSEC4 - Array of GRIB section 4 values
+C KGRIB - Array containing GRIB product.
+C KNSPT - Bit pointer for next value in GRIB product(updated)
+C
+C
+C Method.
+C -------
+C
+C <subset>|
+C
+C Given numbers: cccccccc|cccccc
+C cccccc|cccccc
+C cccc|cccccc
+C cc|cccccc
+C |cccccc
+C cccc
+C cc
+C
+C
+C Externals.
+C ----------
+C
+C GSCALE - Apply power scaling to values to be packed.
+C UNPKCF - Unpack unscaled coefficients from GRIB product.
+C UNCMPCK - Re-scatter the values being unpacked into array.
+C INXBIT - Extract bits from GRIB product.
+C DECFP2 - Decode from IBM floating point format.
+C JMALLOC - Routine to acquire memory
+C JFREE - Routine to release memory
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C On entry, KNSPT points to the first bit of section 4 in the GRIB
+C product.
+C On exit, KNSPT points to the first bit of section 5 in the GRIB
+C product.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 06:05:94
+C
+C
+C Modifications.
+C _____________
+C
+C J.D.Chambers ECMWF 13.09.95
+C Put in check for 32-bit packing.
+C (Removed May 1996)
+C
+C J.Clochard, Meteo France, for ECMWF - January 1998.
+C FLOAT function replaced by REAL.
+C Fix comments.
+C Use of external JFREE instead of FREE.
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+C Parameters
+ INTEGER JP15BIT, JP87SET, JPBYTES
+#ifdef REAL_8
+ PARAMETER (JPBYTES = 8)
+#else
+ PARAMETER (JPBYTES = 4)
+#endif
+ PARAMETER ( JP15BIT= 2**15 )
+C `---> 32768 = 8000(hex)
+ PARAMETER ( JP87SET= 192 )
+C `---> = C0(hex)
+C
+C Subroutine arguments
+C
+ INTEGER KTRUNC, KSEC1, KSEC4, KGRIB, KLENG, KNSPT, KBITS, KPACK
+ REAL PDATA
+ DIMENSION PDATA(*), KGRIB(*), KSEC1(*), KSEC4(*)
+C
+C Local variables.
+C
+ INTEGER J110, J310, IPOWER, ISUBSET
+ INTEGER IVAL, IRET, IRETA, IRETB, IEXP, IMANT
+ INTEGER INSPTA, ILEN, ISCALE
+ INTEGER ILEN4, IFLAG, ISIZE
+C
+#ifdef POINTER_64
+ INTEGER*8 IPIVAL
+#endif
+ POINTER (IPIVAL, IVAL)
+ DIMENSION IVAL(1)
+ SAVE IPIVAL, ISIZE
+C
+ REAL ZREF, ZSCALE
+C
+C Externals
+C
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+ INTEGER UNPKCF, GSCALE
+ EXTERNAL UNPKCF, GSCALE, JMALLOC
+C
+ DATA ISIZE/0/
+C
+C -----------------------------------------------------------------
+C* Section 1 . Decode octets 1 to 11.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ DSECT4 = 0
+C
+C Allocate memory (first time only)
+ IF( ISIZE.LT.((KTRUNC+1)*(KTRUNC+2)*JPBYTES) ) THEN
+ IF( ISIZE.NE.0 ) CALL JFREE(IPIVAL)
+ ISIZE = (KTRUNC+1)*(KTRUNC+2)*JPBYTES
+ IPIVAL = JMALLOC(ISIZE)
+#ifdef hpR64
+ IPIVAL = IPIVAL/(1024*1024*1024*4)
+#endif
+ IF( IPIVAL.EQ.0 ) THEN
+ WRITE(*,*) 'DSECT4: Memory allocation failed.'
+ WRITE(*,*) 'DSECT4: Number of bytes required = ', ISIZE
+ DSECT4 = 16123
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C Preserve bit position of start of section 4.
+ INSPTA = KNSPT
+C
+C Fill in the number of values unpacked
+ KSEC4(1) = (KTRUNC+1)*(KTRUNC+2)
+C
+C Octets 1 - 3: Length of section.
+C One 24-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ILEN4,1,KBITS,24,'D',IRET)
+ IF (IRET.NE.0) THEN
+ DSECT4 = 16110
+ WRITE(*,*) 'DSECT4: Problem unpacking length of section.'
+ GO TO 900
+ ENDIF
+C
+C Octet 4:
+C One 4-bit field -> flag, spherical harmonics/complex/float point
+C One 4-bit field -> number of unused bits at end of section 4.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IFLAG,1,KBITS,8,'D',IRET)
+ IF (IRET.NE.0) THEN
+ DSECT4 = 16111
+ WRITE(*,*) 'DSECT4: Problem unpacking flag byte.'
+ GO TO 900
+ ENDIF
+C
+C Check the flag
+ IF ( (IFLAG/16) .NE. 12 ) THEN
+ DSECT4 = 16112
+ WRITE(*,*) 'DSECT4: Flag wrong = ', IFLAG
+ GO TO 900
+ ELSE
+ KSEC4(3) = 128
+ KSEC4(4) = 64
+ DO 110 J110 = 5, 33
+ KSEC4(J110) = 0
+ 110 CONTINUE
+ ENDIF
+C
+C* Octets 5 - 6 : Scale factor.
+C One 16 bit field.
+C
+C Adjust bit pointer over first 4 octets and insert scale factor.
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ISCALE,1,KBITS, 16,'D',IRET)
+ IF (IRET.NE.0) THEN
+ DSECT4 = 16113
+ WRITE(*,*) 'DSECT4: Problem unpacking scale factor.'
+ GO TO 900
+ ENDIF
+C
+C Make negative if sign bit set
+ IF ( ISCALE .GT. JP15BIT ) THEN
+ ISCALE = ISCALE - JP15BIT
+ ISCALE = -ISCALE
+ ENDIF
+ ZSCALE = 2.0**ISCALE
+C
+C* Octets 7 - 10 : Reference value.
+C One 8 bit and one 24 bit field.
+C
+C Extract reference value exponent and mantissa.
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IEXP,1,KBITS, 8,'D',IRETA)
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IMANT,1,KBITS, 24,'D',IRETB)
+ IRET = IRETA + IRETB
+ IF (IRET.NE.0) THEN
+ DSECT4 = 16114
+ WRITE(*,*) 'DSECT4: Problem unpacking reference value.'
+ GO TO 900
+ ENDIF
+C
+C Decode the reference value
+ CALL DECFP2 (ZREF,IEXP,IMANT)
+C
+C* Octet 11 : Number of bits containing each packed value.
+C One 8 bit field.
+C
+C Extract number of bits for each packed value.
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC4(2),1,KBITS, 8,'D',IRET)
+ IF (IRET.NE.0) THEN
+ DSECT4 = 16115
+ WRITE(*,*) 'DSECT4: Problem unpacking number of bits/value.'
+ GO TO 900
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 2 . Decode octets 12 to 18.
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Octets 12 - 13: Octet number of the start of packed data
+C One 16-bit field.
+C
+C Extract octet number of the start of packed data.
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC4(16),1,KBITS,16,'D',IRET)
+ IF (IRET.NE.0) THEN
+ DSECT4 = 16116
+ WRITE(*,*) 'DSECT4: Problem unpacking start of packed data.'
+ GO TO 900
+ ENDIF
+C
+C Octets 14 - 15: Scaling factor; power of Laplacian operator
+C applied to field before packing.
+C One 16-bit field.
+C
+C Extract scaling power.
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IPOWER,1,KBITS,16,'D',IRET)
+ IF (IRET.NE.0) THEN
+ DSECT4 = 16117
+ WRITE(*,*) 'DSECT4: Problem unpacking scaling power.'
+ GO TO 900
+ ENDIF
+C
+C Set value negative if sign bit set.
+ IF (IPOWER.GT.JP15BIT) THEN
+ IPOWER = IPOWER - JP15BIT
+ IPOWER = -IPOWER
+ ENDIF
+ KSEC4(17) = IPOWER
+C
+C Octets 16 - 18: Pentagonal resolution parameters J,K,M
+C specifying truncation of subset of data
+C represented unpacked.
+C Three 8-bit fields.
+C
+C Extract pentagonal resolution parameters.
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC4(18),3,KBITS, 8,'D',IRET)
+ IF (IRET.NE.0) THEN
+ DSECT4 = 16118
+ WRITE(*,*)
+ X 'DSECT4: Problem unpacking pentagonal resolution params.'
+ GO TO 900
+ ENDIF
+ ISUBSET = KSEC4(18)
+ IF ( ISUBSET .GT. KTRUNC ) THEN
+ WRITE(*,*) 'DSECT4: Invalid subset truncation given'
+ WRITE(*,*) 'DSECT4: ISUBSET, KTRUNC =', ISUBSET, KTRUNC
+ DSECT4 = 16122
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 3. Extract and scale binary values from GRIB product.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C Adjust bit pointer to end of stored subset of coefficients and
+C extract binary values from GRIB product -> updates bit pointer.
+ KNSPT = 8*KSEC4(16)
+ ILEN = (KTRUNC+1)*(KTRUNC+2) - (ISUBSET+1)*(ISUBSET+2)
+ CALL INXBIT (KGRIB,KLENG,KNSPT,IVAL,ILEN, KBITS,KPACK, 'D',IRET)
+ IF ( IRET .NE. 0 ) THEN
+ WRITE(*,*) 'DSECT4: Problem unpacking bits'
+ DSECT4 = 16119
+ GOTO 900
+ ENDIF
+C
+ DO 310 J310 = 1 , ILEN
+ PDATA(J310) = ( REAL(IVAL(J310)) * ZSCALE ) + ZREF
+ 310 CONTINUE
+C
+C Move the coefficients to their correct (scattered) in the array.
+ CALL UNCMPCK( PDATA, KTRUNC, ISUBSET)
+C
+C
+C -----------------------------------------------------------------
+C* Section 4 . Unpack the subset of coefficients (stored IBM style).
+C -----------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+C Adjust pointer to avoid first 18 octets.
+ KNSPT = INSPTA + 18*8
+C
+C Move back into original locations in the array and convert from
+C IBM format.
+ IRET = UNPKCF( PDATA,KTRUNC,ISUBSET,KGRIB,KLENG,KNSPT,KBITS)
+ IF ( IRET .NE. 0 ) THEN
+ WRITE(*,*) 'DSECT4: Problem unpacking subset of coeffs.'
+ DSECT4 = 16120
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 5 . Apply power scaling to field.
+C -----------------------------------------------------------------
+C
+ 500 CONTINUE
+C
+ IRET = GSCALE( PDATA, KTRUNC, ISUBSET, IPOWER, 'O')
+ IF ( IRET .NE. 0 ) THEN
+ WRITE(*,*) 'DSECT4: Problem applying power scaling'
+ DSECT4 = 16121
+ GOTO 900
+ ENDIF
+C
+C Set bit pointer on 7777 group - section 5
+ KNSPT = INSPTA + 8*ILEN4
+C
+C -----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/dsect4a.F b/gribex/dsect4a.F
new file mode 100755
index 0000000..b5de645
--- /dev/null
+++ b/gribex/dsect4a.F
@@ -0,0 +1,533 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+#if (defined IBM_POWER4)
+ at PROCESS ALIAS(NOPTEOVRLP)
+#endif
+ INTEGER FUNCTION DSECT4A( PDATA, KTRUNC, KSEC0, KSEC1, KSEC4,
+ X KGRIB, KLENG, KNSPT, KBITS, KPACK)
+C
+C---->
+C**** DSECT4A
+C
+C Purpose.
+C --------
+C
+C Decode GRIB section 4 for complex packing of spherical harmonics.
+C
+C
+C** Interface.
+C ----------
+C
+C KRET = DSECT4A( PDATA, KTRUNC, KSEC0, KSEC1, KSEC4,
+C X KGRIB, KLENG, KNSPT, KBITS, KPACK)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C PDATA - Array of floating point values.
+C KTRUNC - Truncation of the spherical harmonic coefficients.
+C KSEC0 - Array of GRIB section 0 values
+C KLENG - Length of GRIB product array
+C KNSPT - Bit pointer for next value in GRIB product
+C KBITS - Number of bits per computer word.
+C
+C
+C Output Parameters.
+C -----------------
+C
+C KSEC1 - Array of GRIB section 1 values
+C KSEC4 - Array of GRIB section 4 values
+C KGRIB - Array containing GRIB product.
+C KNSPT - Bit pointer for next value in GRIB product(updated)
+C KPACK - Number of bits per packed value.
+C
+C
+C Method.
+C -------
+C
+C <subset>|
+C
+C Given numbers: cccccccc|cccccc
+C cccccc|cccccc
+C cccc|cccccc
+C cc|cccccc
+C |cccccc
+C cccc
+C cc
+C
+C
+C Externals.
+C ----------
+C
+C GSCALE - Apply power scaling to values to be packed.
+C UNPKCF - Unpack unscaled coefficients from GRIB product.
+C UNCMPCK - Re-scatter the values being unpacked into array.
+C INXBIT - Extract bits from GRIB product.
+C DECFP2 - Decode from IBM floating point format.
+C JMALLOC - Routine to acquire memory
+C JFREE - Routine to release memory
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C On entry, KNSPT points to the first bit of section 4 in the GRIB
+C product.
+C On exit, KNSPT points to the first bit of section 5 in the GRIB
+C product.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 06:05:94
+C
+C
+C Modifications.
+C _____________
+C
+C J.D.Chambers ECMWF 13.09.95
+C Put in check for 32-bit packing.
+C (Removed May 1996)
+C
+C J.Clochard, Meteo France, for ECMWF - January 1998.
+C FLOAT function replaced by REAL.
+C Fix comments.
+C Use of external JFREE instead of FREE.
+C
+C J.Clochard, Meteo France, for ECMWF - September 1998.
+C Fix KNSPT position at end of routine.
+C Enable processing of GRIB edition 0 data.
+C Dummy-argument KSEC0 added.
+C KPACK changed as output argument.
+C
+C P.J.Towers ECMWF
+C Optimised for IBM Power4
+C -added @PROCESS ALIAS(NOPTEOVRLP) directive
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+ INTEGER JP15BIT, JP87SET, JPBYTES
+#ifdef REAL_8
+ PARAMETER (JPBYTES = 8)
+#else
+ PARAMETER (JPBYTES = 4)
+#endif
+ PARAMETER ( JP15BIT= 2**15 )
+C `---> 32768 = 8000(hex)
+ PARAMETER ( JP87SET= 192 )
+C `---> = C0(hex)
+C
+C Subroutine arguments
+C
+ INTEGER KTRUNC, KSEC1, KSEC4, KGRIB, KLENG, KNSPT, KBITS, KPACK
+ INTEGER KSEC0
+ REAL PDATA
+ DIMENSION PDATA(*), KGRIB(*), KSEC0(*), KSEC1(*), KSEC4(*)
+C
+C Local variables.
+C
+ INTEGER J110, NREST, NLOOPS, ILOOP, LOOP, IPOWER, ISUBSET
+ INTEGER IRET, IRETA, IRETB, IEXP, IMANT
+ INTEGER INSPTA, ILEN, ISCALE
+ INTEGER ILEN4, IFLAG, ISIZE, IAUXIL, IOFF, ITEMP, J, INIL
+C
+ CHARACTER *1 YFUNC
+C
+#ifndef USE_NO_POINTERS
+#ifdef POINTER_64
+ INTEGER*8 IPIVAL
+#endif
+ POINTER (IPIVAL, IVAL)
+ INTEGER IVAL(1)
+ SAVE IPIVAL, ISIZE
+#else
+ INTEGER IVAL(1000)
+#endif
+C
+ REAL ZREF, ZSCALE
+C
+C Externals
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+ INTEGER UNPKCF, GSCALE
+ EXTERNAL UNPKCF, GSCALE, JMALLOC
+C
+ DATA ISIZE/0/
+C
+C -----------------------------------------------------------------
+C* Section 1 . Decode octets 1 to 11.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ DSECT4A = 0
+ YFUNC='D'
+C
+ IF( KSEC0(2).GE.1 ) THEN
+ IAUXIL=2
+ ELSE
+ IAUXIL=1
+ ENDIF
+C
+ ITEMP = (KTRUNC+1)*(KTRUNC+IAUXIL)
+#ifndef USE_NO_POINTERS
+C
+C Allocate memory (first time only)
+ IF( ISIZE.LT.(MAX(ITEMP,4*(KTRUNC+1))*JPBYTES) ) THEN
+ IF( ISIZE.NE.0 ) CALL JFREE(IPIVAL)
+ ISIZE = (KTRUNC+1)*(KTRUNC+IAUXIL)*JPBYTES
+ IPIVAL = JMALLOC(ISIZE)
+#ifdef hpR64
+ IPIVAL = IPIVAL/(1024*1024*1024*4)
+#endif
+ IF( IPIVAL.EQ.0 ) THEN
+ WRITE(GRPRSM,*) 'DSECT4A: Memory allocation failed.'
+ WRITE(GRPRSM,*) 'DSECT4A: Number of bytes required = ', ISIZE
+ DSECT4A = 16123
+ GOTO 900
+ ENDIF
+ ENDIF
+#endif
+C
+C Preserve bit position of start of section 4.
+ INSPTA = KNSPT
+C
+C Fill in the number of values unpacked
+ KSEC4(1) = ITEMP
+C
+C Octets 1 - 3: Length of section.
+C One 24-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ILEN4,1,KBITS,24,YFUNC,IRET)
+ IF( IRET.NE.0 ) THEN
+ DSECT4A = 16110
+ WRITE(GRPRSM,*) 'DSECT4A: Problem unpacking length of section.'
+ GO TO 900
+ ENDIF
+C
+C Octet 4:
+C One 4-bit field -> flag, spherical harmonics/complex/float point
+C One 4-bit field -> number of unused bits at end of section 4.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IFLAG,1,KBITS,8,YFUNC,IRET)
+ IF( IRET.NE.0 ) THEN
+ DSECT4A = 16111
+ WRITE(GRPRSM,*) 'DSECT4A: Problem unpacking flag byte.'
+ GO TO 900
+ ENDIF
+C
+C Check the flag
+ IF( ( KSEC0(2) .GE. 1 .AND. (IFLAG/16) .NE. 12 ) .OR.
+ X ( KSEC0(2) .LT. 1 .AND. (IFLAG/64) .NE. 3 ) ) THEN
+ DSECT4A = 16112
+ WRITE(GRPRSM,*) 'DSECT4A: Flag wrong = ', IFLAG
+ GO TO 900
+ ELSE
+ KSEC4(3) = 128
+ KSEC4(4) = 64
+ INIL = MOD(IFLAG,16)
+ DO 110 J110 = 5, 33
+ KSEC4(J110) = 0
+ 110 CONTINUE
+ ENDIF
+C
+C* Octets 5 - 6 : Scale factor.
+CIAU One 16 bit field.
+C
+C Adjust bit pointer over first 4 octets and insert scale factor.
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ISCALE,1,KBITS, 16,YFUNC,IRET)
+ IF( IRET.NE.0) THEN
+ DSECT4A = 16113
+ WRITE(GRPRSM,*) 'DSECT4A: Problem unpacking scale factor.'
+ GO TO 900
+ ENDIF
+C
+C Make negative if sign bit set
+C
+ IF( ISCALE .GT. JP15BIT ) THEN
+ ISCALE = ISCALE - JP15BIT
+ ISCALE = -ISCALE
+ ENDIF
+ ZSCALE = 2.0**ISCALE
+C
+C* Octets 7 - 10 : Reference value.
+C One 8 bit and one 24 bit field.
+C
+C Extract reference value exponent and mantissa.
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IEXP,1,KBITS, 8,YFUNC,IRETA)
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IMANT,1,KBITS, 24,YFUNC,IRETB)
+ IRET = IRETA + IRETB
+ IF( IRET.NE.0 ) THEN
+ DSECT4A = 16114
+ WRITE(GRPRSM,*) 'DSECT4A: Problem unpacking reference value.'
+ GO TO 900
+ ENDIF
+C
+C Decode the reference value
+C
+ CALL DECFP2 (ZREF,IEXP,IMANT)
+C
+C* Octet 11 : Number of bits containing each packed value.
+C One 8 bit field.
+C
+C Extract number of bits for each packed value.
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC4(2),1,KBITS, 8,YFUNC,IRET)
+ IF( IRET.NE.0 ) THEN
+ DSECT4A = 16115
+ WRITE(GRPRSM,*)
+ X 'DSECT4A: Problem unpacking number of bits/value.'
+ GO TO 900
+ ENDIF
+C
+ KPACK=KSEC4(2)
+C
+C -----------------------------------------------------------------
+C* Section 2 . Decode octets 12 to 18.
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Octets 12 - 13: Octet number of the start of packed data
+C One 16-bit field.
+C
+C Extract octet number of the start of packed data.
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC4(16),1,KBITS,16,YFUNC,IRET)
+ IF( IRET.NE.0 ) THEN
+ DSECT4A = 16116
+ WRITE(GRPRSM,*)
+ X 'DSECT4A: Problem unpacking start of packed data.'
+ GO TO 900
+ ENDIF
+C
+C Octets 14 - 15: Scaling factor; power of Laplacian operator
+C applied to field before packing.
+C One 16-bit field.
+C
+C Extract scaling power.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IPOWER,1,KBITS,16,YFUNC,IRET)
+ IF( IRET.NE.0 ) THEN
+ DSECT4A = 16117
+ WRITE(GRPRSM,*) 'DSECT4A: Problem unpacking scaling power.'
+ GO TO 900
+ ENDIF
+C
+C Set value negative if sign bit set.
+C
+ IF( IPOWER.GT.JP15BIT ) THEN
+ IPOWER = IPOWER - JP15BIT
+ IPOWER = -IPOWER
+ ENDIF
+C
+C Octets 16 - 18: Pentagonal resolution parameters J,K,M
+C specifying truncation of subset of data
+C represented unpacked.
+C Three 8-bit fields.
+C
+C Extract pentagonal resolution parameters.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC4(18),3,KBITS, 8,YFUNC,IRET)
+ IF( IRET.NE.0 ) THEN
+ DSECT4A = 16118
+ WRITE(GRPRSM,*)
+ X 'DSECT4A: Problem unpacking pentagonal resolution params.'
+ GO TO 900
+ ENDIF
+ ISUBSET = KSEC4(18)
+ IF( ISUBSET .GT. KTRUNC ) THEN
+ WRITE(GRPRSM,*) 'DSECT4A: Invalid subset truncation given'
+ WRITE(GRPRSM,*) 'DSECT4A: ISUBSET, KTRUNC =', ISUBSET, KTRUNC
+ DSECT4A = 16122
+ GOTO 900
+ ENDIF
+C
+ IF( KSEC0(2).GE.1 ) THEN
+ KSEC4(17) = IPOWER
+ IOFF=0
+ ELSE
+C
+C In edition 0, power was an unscaled integer, byte "offset" used
+C to be a pointer relative to start of section 4, content/ordering
+C also used to be different.
+C
+ KSEC4(17) = 1000 * IPOWER
+ KSEC4(16) = INSPTA/8 + KSEC4(16) - 1
+ IOFF=(ISUBSET+1)**2
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 3. Extract and scale binary values from GRIB product.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C Adjust bit pointer to end of stored subset of coefficients and
+C extract binary values from GRIB product -> updates bit pointer.
+C
+ KNSPT = 8*KSEC4(16)
+ ILEN = KSEC4(1) - (ISUBSET+1)*(ISUBSET+IAUXIL)
+C
+#ifndef USE_NO_POINTERS
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IVAL,ILEN, KBITS,KPACK,YFUNC,IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(GRPRSM,*) 'DSECT4A: Problem unpacking bits'
+ DSECT4A = 16119
+ GOTO 900
+ ENDIF
+C Check that length in the file is consistent with the position of pointer
+C this might not happen for very large grib products (KLENG.ge.2097140)
+C Here we cannot multiply the length because the most significant bit(negative values)
+C is used to signify the lack of data - if not we update ILEN4
+
+ IF (KSEC0(1).GT.8388607) THEN
+ IF (((KNSPT-INSPTA+INIL)/8).ne.ILEN4) THEN
+ ILEN4=((KNSPT-INSPTA+INIL)/8)
+ ENDIF
+ ENDIF
+C
+ DO LOOP = 1, ILEN
+ PDATA(IOFF+LOOP) = ( REAL(IVAL(LOOP)) * ZSCALE ) + ZREF
+ ENDDO
+#else
+ NLOOPS = ILEN / 1000
+ NREST = ILEN - (NLOOPS)*1000
+ KNSPT = 8*KSEC4(16)
+C
+ DO ILOOP = 1, NLOOPS
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IVAL,1000,KBITS,KPACK,YFUNC,IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(GRPRSM,*) 'DSECT4A: Problem unpacking bits'
+ DSECT4A = 16119
+ GOTO 900
+ ENDIF
+C
+ DO LOOP = 1, 1000
+ PDATA(IOFF+(ILOOP-1)*1000+LOOP) =
+ X (REAL(IVAL(LOOP))* ZSCALE)+ZREF
+ ENDDO
+ ENDDO
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IVAL,NREST,KBITS,KPACK,YFUNC,IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(GRPRSM,*) 'DSECT4A: Problem unpacking bits'
+ DSECT4A = 16119
+ GOTO 900
+ ENDIF
+C
+ DO LOOP = 1, NREST
+ PDATA(IOFF+NLOOPS*1000+LOOP) = (REAL(IVAL(LOOP))* ZSCALE)+ZREF
+ ENDDO
+#endif
+C
+ IF( KSEC0(2).GE.1 ) THEN
+C
+C Move the coefficients to their correct (scattered) in the array.
+C
+ CALL UNCMPCK( PDATA, KTRUNC, ISUBSET)
+ ENDIF
+C
+C
+C -----------------------------------------------------------------
+C* Section 4 . Unpack the subset of coefficients (stored IBM style).
+C -----------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+C Adjust pointer to avoid first 18 octets.
+C
+ KNSPT = INSPTA + 18*8
+C
+ IF( KSEC0(2).GE.1 ) THEN
+C
+C Move back into original locations in the array and convert from
+C IBM format.
+C
+ IRET = UNPKCF( PDATA,KTRUNC,ISUBSET,KGRIB,KLENG,KNSPT,KBITS)
+ IF( IRET .NE. 0 ) THEN
+ WRITE(GRPRSM,*) 'DSECT4A: Problem unpacking subset of coeffs.'
+ DSECT4A = 16120
+ GOTO 900
+ ENDIF
+C
+ ELSE
+C
+C Direct conversion from IBM format.
+C
+C* Calculate word pointer and offset, and get all exponents and
+C all mantissae (split in 3 parts).
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IVAL,IOFF*4,KBITS, 8,YFUNC,IRET)
+ IF( IRET .NE. 0 ) THEN
+ WRITE(GRPRSM,*)
+ X 'DSECT4A: Problem extracting subset of coeffs.'
+ DSECT4A = 16120
+ GOTO 900
+ ENDIF
+C
+ DO 401 J = 1, IOFF
+C
+ IEXP = IVAL(4*J-3)
+ IMANT = IVAL(4*J) + 256 * ( IVAL(4*J-1) + 256 * IVAL(4*J-2) )
+ CALL DECFP2(PDATA(J),IEXP,IMANT)
+C
+ 401 CONTINUE
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 5 . Apply power scaling to field.
+C -----------------------------------------------------------------
+C
+ 500 CONTINUE
+C
+ IF( KSEC0(2).GE.1 ) THEN
+C
+ IRET = GSCALE( PDATA, KTRUNC, ISUBSET, IPOWER, 'O')
+ IF( IRET .NE. 0 ) THEN
+ WRITE(GRPRSM,*) 'DSECT4A: Problem applying power scaling'
+ DSECT4A = 16121
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+C Set bit pointer to last useful of section 4, before padding
+C if any (for consistency with GRIBEX).
+C
+ KNSPT = INSPTA + 8*ILEN4 - INIL
+C
+C -----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/dsgnbt.F b/gribex/dsgnbt.F
new file mode 100755
index 0000000..12c3611
--- /dev/null
+++ b/gribex/dsgnbt.F
@@ -0,0 +1,65 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE DSGNBT( KOUT, KIN, KPOS, KRET)
+C---->
+C
+C Get the sign bit in position KPOS of word KIN, and
+C set value of KOUT from the rest of bits (KPOS-1) ->
+C with the correct sign.
+C
+C On return, KRET = 0 if all OK.
+C
+C----<
+ IMPLICIT NONE
+ INTEGER KOUT, KIN, KPOS, KRET
+
+ INTEGER JPBITS
+#ifdef INTEGER_8
+ PARAMETER ( JPBITS = 64 )
+#else
+ PARAMETER ( JPBITS = 32 )
+#endif
+ INTEGER ISBIT, INSPT, IRETA, IRETB
+#if defined (VAX) || defined (__alpha)
+ INTEGER ITEMP, IMASK1,IMASK2
+#endif
+C
+#if defined (VAX) || defined (__alpha)
+C
+C VAX bit handling using VAX specific intrinsics
+ ITEMP = 1
+ IMASK1 = JISHFT( ITEMP, (KPOS-1))
+ ITEMP = -1
+ ITEMP = JISHFT( ITEMP, (KPOS-1) )
+ IMASK2 = JNOT( ITEMP )
+ ISBIT = JIAND( KIN, IMASK1)
+ KOUT = JIAND( KIN, IMASK2)
+#else
+C
+C Bit handling using INXBIT
+ INSPT = 0
+ CALL INXBIT( KIN, 1, INSPT, ISBIT, 1, JPBITS,
+ X (JPBITS-KPOS+1), 'D', IRETA)
+ CALL INXBIT( KIN, 1, INSPT, KOUT, 1, JPBITS,
+ X (KPOS-1), 'D', IRETB)
+ KRET = IRETA+IRETB
+ IF ( KRET .NE. 0 ) THEN
+ WRITE(*,*) ' DSGNBT - Problem unpacking bits in value'
+ GOTO 900
+ ENDIF
+#endif
+
+ IF ( ISBIT .NE. 0 ) KOUT = -KOUT
+
+ 900 CONTINUE
+
+ RETURN
+ END
diff --git a/gribex/dsgnbt.c b/gribex/dsgnbt.c
new file mode 100755
index 0000000..8a20637
--- /dev/null
+++ b/gribex/dsgnbt.c
@@ -0,0 +1,41 @@
+/**
+* Copyright 1981-2012 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 "fortint.h"
+
+void dsgnbt_(
+ fortint * kout,
+ fortint * kin,
+ fortint * kpos,
+ fortint * kret) {
+
+fortint value = *kin;
+unsigned fortint sign = value & (1 << ((*kpos)-1));
+unsigned fortint mask = ~(-1 << ((*kpos)-1));
+fortint new = value & mask;
+
+ if( sign )
+ *kout = -new;
+ else
+ *kout = new;
+
+ *kret = 0;
+ return;
+}
+
+void dsgnbt(
+ fortint * kout,
+ fortint * kin,
+ fortint * kpos,
+ fortint * kret) {
+
+ dsgnbt_(kout,kin,kpos,kret);
+}
diff --git a/gribex/dshsec2.F b/gribex/dshsec2.F
new file mode 100755
index 0000000..85b57a2
--- /dev/null
+++ b/gribex/dshsec2.F
@@ -0,0 +1,154 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION DSHSEC2(KGRIB,KLENG,INSPT,KSEC2,IBITS)
+C
+C---->
+C**** DSHSEC2P
+C
+C PURPOSE
+C _______
+C
+C Decodes GRIB section 2 values for spherical harmonic fields.
+C
+C INTERFACE
+C _________
+C
+C IRET = DSHSEC2(KGRIB,KLENG,INSPT,KSEC2,IBITS)
+C
+C Input parameters
+C ________________
+C
+C KGRIB - GRIB product unpacked so far (upto octet 6).
+C KLENG - Length of KGRIB.
+C INSPT - Bit position of GRIB product unpacked so far.
+C KSEC2 - GRIB section 2 description.
+C IBITS - Number of bits per element in KGRIB.
+C
+C
+C Output parameters
+C ________________
+C
+C KSEC2 - Updated GRIB section 2 description.
+C INSPT - Updated bit position of GRIB product built so far.
+C IRET - Function return status code, 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Unpacks values given in KGRIB into KSEC2 and updates bit
+C pointer INSPT.
+C
+C Externals
+C _________
+C
+C DSGNBT - Get the sign bit and adjust value to +/-.
+C INXBIT - Insert bit data.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF February 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JP16SET
+ PARAMETER ( JP16SET = 2**16 - 1 )
+C ^---> 65535 = FFFF(hex)
+C
+C Function arguments
+C
+ INTEGER KGRIB,KLENG,INSPT,KSEC2,IBITS
+ DIMENSION KGRIB(*),KSEC2(*)
+C
+C Local variables
+C
+ INTEGER IRET
+C
+C _______________________________________________________
+C
+C Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ DSHSEC2 = 0
+C
+C _______________________________________________________
+C
+C Section 2. Unpack section 2 octets.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Octets 7 - 8 : J pentagonal resolution parameter.
+C Octets 9 - 10 : K pentagonal resolution parameter.
+C Octets 11 - 12 : M pentagonal resolution parameter.
+C Three 16 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(2),3,IBITS, 16,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DSHSEC2 = 1
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: J,K,M pentagonal resolution parameters.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octet 13 : Representation type.
+C Octet 14 : Representation mode.
+C Two 8 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(5),2,IBITS, 8,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DSHSEC2 = 1
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: representation type or mode.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C
+C Octets 15 - 32 : Reserved.
+C Nine 16 bit fields.
+C
+C Move pointer past reserved octets.
+ INSPT = INSPT + 144
+C
+C _______________________________________________________
+C
+C Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/gribex/dsvsec2.F b/gribex/dsvsec2.F
new file mode 100755
index 0000000..6c6956c
--- /dev/null
+++ b/gribex/dsvsec2.F
@@ -0,0 +1,263 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION DSVSEC2(KGRIB,KLENG,INSPT,KSEC2,IBITS,ILEN2)
+C
+C---->
+C**** DSVSEC2P
+C
+C PURPOSE
+C _______
+C
+C Decodes GRIB section 2 values for space view fields.
+C
+C INTERFACE
+C _________
+C
+C IRET = DSVSEC2(KGRIB,KLENG,INSPT,KSEC2,IBITS)
+C
+C Input parameters
+C ________________
+C
+C KGRIB - GRIB product unpacked so far (upto octet 6).
+C KLENG - Length of KGRIB.
+C INSPT - Bit position of GRIB product unpacked so far.
+C KSEC2 - GRIB section 2 description.
+C IBITS - Number of bits per element in KGRIB.
+C ILEN2 - Length in bytes of section 2
+C
+C
+C Output parameters
+C ________________
+C
+C KSEC2 - Updated GRIB section 2 description.
+C INSPT - Updated bit position of GRIB product built so far.
+C IRET - Function return status code, 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Unpacks values given in KGRIB into KSEC2 and updates bit
+C pointer INSPT.
+C
+C Externals
+C _________
+C
+C DSGNBT - Get the sign bit and adjust value to +/-.
+C INXBIT - Insert bit data.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF February 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JP16SET
+ PARAMETER ( JP16SET = 2**16 - 1 )
+C ^---> 65535 = FFFF(hex)
+C
+C Function arguments
+C
+ INTEGER KGRIB,KLENG,INSPT,KSEC2,IBITS,ILEN2
+ DIMENSION KGRIB(*),KSEC2(*)
+C
+C Local variables
+C
+ INTEGER ILALO(2), IRET, IRESOL
+C
+C _______________________________________________________
+C
+C Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ DSVSEC2 = 0
+C
+C _______________________________________________________
+C
+C Section 2. Unpack section 2 octets.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Octets 7 - 8 : Nx - number of points along X-axis.
+C Octets 9 - 10 : Ny - number of points along Y-axis.
+C Two 16 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(2),2,IBITS, 16,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DSVSEC2 = 1
+ WRITE(GRPRSM,*) 'DSVSEC2: Error extracting'
+ WRITE(GRPRSM,*) 'DSVSEC2: number of points along X or Y axis.'
+ WRITE(GRPRSM,*) 'DSVSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octets 11 - 13 : Lap - latitude of sub-satellite point.
+C Octets 14 - 16 : Lop - longitude of sub-satellite point.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DSVSEC2 = 1
+ WRITE(GRPRSM,*) 'DSVSEC2: Error extracting'
+ WRITE(GRPRSM,*)
+ X 'DSVSEC2: latitude/longitude of sub-satellite pt.'
+ WRITE(GRPRSM,*) 'DSVSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C If sign bit is 1, value is negative.
+C
+ CALL DSGNBT( KSEC2(4), ILALO(1), 24, IRET)
+ CALL DSGNBT( KSEC2(5), ILALO(2), 24, IRET)
+C
+C Octet 17 : Resolution and components flag.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IRESOL,1,IBITS, 8,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DSVSEC2 = 1
+ WRITE(GRPRSM,*) 'DSVSEC2: Error extracting'
+ WRITE(GRPRSM,*) 'DSVSEC2: components flag.'
+ WRITE(GRPRSM,*) 'DSVSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C All flag fields are already set to 0, so
+C
+ IF( IRESOL.EQ.0 ) GO TO 214
+C
+C Resolution flag is not applicable.
+C
+ IF( IRESOL.GE.128) IRESOL = IRESOL - 128
+C
+C Set earth flag.
+C
+ IF( IRESOL.GE.64) THEN
+ KSEC2(18) = 64
+ IRESOL = IRESOL - 64
+ ENDIF
+C
+C Set components flag.
+C
+ KSEC2(19) = IRESOL
+C
+ 214 CONTINUE
+C
+C Octets 18 - 20 : dx Apparent diameter of earth in grid
+C lengths in x direction.
+C Octets 21 - 23 : dy Apparent diameter of earth in grid
+C lengths in y direction.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(7),2,IBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DSVSEC2 = 1
+ WRITE(GRPRSM,*) 'DSVSEC2: Error extracting'
+ WRITE(GRPRSM,*) 'DSVSEC2: number of points along X or Y axis.'
+ WRITE(GRPRSM,*) 'DSVSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octets 24 - 25 : Xp X-coordinate of sub-satellite point.
+C Octets 26 - 27 : Yp Y-coordinate of sub-satellite point.
+C Two 16 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(9),2,IBITS, 16,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DSVSEC2 = 1
+ WRITE(GRPRSM,*) 'DSVSEC2: Error extracting'
+ WRITE(GRPRSM,*)
+ X 'DSVSEC2: X or Y coordinate of sub-satellite point.'
+ WRITE(GRPRSM,*) 'DSVSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octet 28 : Scanning mode flags.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(11),1,IBITS, 8,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DSVSEC2 = 1
+ WRITE(GRPRSM,*) 'DSVSEC2: Error extracting'
+ WRITE(GRPRSM,*) 'DSVSEC2: scanning mode flags.'
+ WRITE(GRPRSM,*) 'DSVSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octets 29 - 31 : The orientation of the grid.
+C Octets 32 - 34 : nr the altitude of the camera.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(13),2,IBITS, 24,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DSVSEC2 = 1
+ WRITE(GRPRSM,*) 'DSVSEC2: Error extracting'
+ WRITE(GRPRSM,*)
+ X 'DSVSEC2: orientation of the grid or camera angle.'
+ WRITE(GRPRSM,*) 'DSVSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octets 35 - 36 : Xo - X coordinate of origin of sector
+C image.
+C Octets 37 - 38 : Yo - Y coordinate of origin of sector
+C image.
+C Two 16 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(15),2,IBITS, 16,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ DSVSEC2 = 1
+ WRITE(GRPRSM,*) 'DSVSEC2: Error extracting'
+ WRITE(GRPRSM,*)
+ X 'DSVSEC2: X or Y coordinates of origin of sector.'
+ WRITE(GRPRSM,*) 'DSVSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octets 39 - 40 : Reserved (ECMWF).
+C Octets 39 - 44 : Reserved (GRIB specification).
+C
+C Update bit pointer.
+C
+ INSPT = INSPT + (ILEN2 - 38) * 8
+C
+C _______________________________________________________
+C
+C Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/gribex/dswmrs.F b/gribex/dswmrs.F
new file mode 100755
index 0000000..141d1cf
--- /dev/null
+++ b/gribex/dswmrs.F
@@ -0,0 +1,246 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE DSWMRS(IBLOSW,LOGISW,ILLGTH,INSOUT,IILGTH,RESOUT,
+ S IRLGTH,MGRIBS,ILENSW,IBITMC,LPRINTS)
+C
+C---->
+C**** *DSWMRS* - ROUTINE TO DECODE A MARS MODEL SWITCH.
+C
+C G.K.SAKELLARIDES ECMWF 17/05/85.
+C THE STRUCTURE IS SIMILAR TO J.HENNESSY'S SUBROUTINE *DECOGR*
+C
+C PURPOSE.
+C --------
+C
+C TO DECODE A MODEL SWITCH MARS RECORD FROM MARS PACKED
+C SWITCH RECORD AS WELL AS TO PRINT THE DECOTED RECORD
+C IN CASE LPRINTS=.TRUE.
+C
+C** INTERFACE.
+C ----------
+C
+C *CALL* *DSWMRS(IBLOSW,LOGISW,ILLGTH,INSOUT,IILGTH,RESOUT,
+C IRLGTH,MGRIBS,ILENSW,IBITMC)*
+C WHERE:
+C INPUT PARAMETERS
+C 1.*MGRIBS* ARRAY CONTAINING THE PACKED MARS MODEL SWITCH
+C 2.*ILENSW* THE LENGTH OF THE ARRAY MGRIBS (750 CRAY WORD)
+C 3.*IBITMC* NUMBER OF BITS PER COMPUTER WORD.
+C 4.*LPRINTS* .TRUE. IF AN OUTPUT OF THE DECOTED MARS
+C MODEL SWITCH RECORD IS REQUIRED.
+C OUTPUT PARAMETERS
+C 1.*IBLOSW* INTEGER ARRAY OF LENGTH 29 CONTAINING
+C THE FOLLOWING INFORMATIONS OF BLOCK1.
+C 1.1 G
+C 1.2 R
+C 1.3 I
+C 1.4 B
+C 1.5 IDENTIFICATION OF CENTRE)
+C 1.6 MODEL IDENTIFICATION
+C 1.7 GRID DEFINITION
+C 1.8 FLAG (CODE TABLE 1)
+C 1.9 PARAM. INTICATING THE MARS MODEL SWITCH REC.
+C 1.10 TYPE OF LEVEL (CODE TABLE 3)
+C 1.11 VALUE 1 OF LEVEL (CODE TABLE 3)
+C 1.12 VALUE 2 OF LEVEL (CODE TABLE 3)
+C 1.13 YEAR OF INITIAL DATA
+C 1.14 MONTH OF INITIAL DATA
+C 1.15 DAY OF INITIAL DATA
+C 1.16 HOUR OF INITIAL DATA
+C 1.17 MINUTE OF INITIAL DATA
+C 1.18 TIME UNIT (CODE TABLE 4)
+C 1.19 TIME RANGE 1
+C 1.20 TIME RANGE 2
+C 1.21 TIME RANGE FLAG (CODE TABLE 5)
+C 1.22-24 RESERVED
+C 1.26 STARTING ADDRESS OF LOGICAL SECTION(OCTET)
+C 1.27 STARTING ADDRESS OF INTEGER SECTION(OCTET)
+C 1.28 STARTING ADDRESS OF REAL SECTION(OCTET)
+C 1.29 LENGTH OF REAL SECTION(OCTET)
+C 2.*LOGISW* INTEGER ARRAY OF SUFFICIENT LENGTH WHICH
+C CONTAINS THE LOGICALS.
+C 3.*ILLGTH* ACTUAL LENGTH OF LOGICALS
+C 4.*INSOUT* INTEGER ARRAY OF SUFFICIENT LENGTH WHICH
+C CONTAINS THE INTEGERS
+C 5.*IILGTH* ACTUAL LENGTH OF INTEGER
+C 6.*RESOUT* REAL ARRAY OF SUFFICIENT LENGTH WHICH
+C CONTAINS THE REALS
+C 7.*IRLGTH* ACTUAL LENGTH OF REALS
+C
+C EXTERNALS.
+C ----------
+C
+C *GBYTES* EXTRACT BIT FIELD
+C *GBYTE * EXTRACT BIT FIELD
+C *OFFSET* CALCULATES THE WORD AND BIT OFFSET OF THE START
+C OF THE NEXT BIT FIELD.
+C *DECFP* DECODE GRIB CODE REPRESENTATION TO FLOATING POINT
+C NUMBER.
+C
+C----<
+C
+ DIMENSION IBLOSW(*),INSOUT(*),RESOUT(*),MGRIBS(ILENSW)
+ DIMENSION ILSOUT(500)
+ DIMENSION IAA(4)
+ LOGICAL LOGISW(*),LPRINTS
+C
+C* 1. SET LOCAL VARIABLES
+C
+ 100 CONTINUE
+ IERR=0
+ ILMGRIB=ILENSW
+ IBITCR=IBITMC
+C
+C* 1.5 VARIABLES OF BLOCK 1
+C
+ IWORD=1
+ IBYTE=8
+ IVAL=24
+ IOFF=0
+ CALL GBYTES(MGRIBS(IWORD),IBLOSW(1),IOFF,IBYTE,0,IVAL)
+ CALL OFFSET(IOFF,IVAL,IWORD,IBYTE,IBITCR,ILMGRIB,IERR)
+ IF (IERR.NE.0) GO TO 900
+C
+C* LENTHG OF DATA BLOCK(OCTET)
+ CALL GBYTE(MGRIBS(IWORD),IBLOSW(25),IOFF,24)
+ CALL OFFSET(IOFF,1,IWORD,24,IBITCR,ILMGRIB,IERR)
+ IF (IERR.NE.0)GO TO 900
+C
+C* STARTING ADDRESS OF LOGICAL AND INTEGER SECTION
+ IBYTE=8
+ IVAL=2
+ CALL GBYTES(MGRIBS(IWORD),IBLOSW(26),IOFF,IBYTE,0,IVAL)
+ CALL OFFSET(IOFF,IVAL,IWORD,IBYTE,IBITCR,ILMGRIB,IERR)
+ IF (IERR.NE.0)GO TO 900
+C* STARTING ADDRESS OF REAL SECTION
+ CALL GBYTE(MGRIBS(IWORD),IBLOSW(28),IOFF,16)
+ CALL OFFSET(IOFF,1,IWORD,16,IBITCR,ILMGRIB,IERR)
+ IF (IERR.NE.0)GO TO 900
+C* LENGTH OF REAL SECTION
+ CALL GBYTE(MGRIBS(IWORD),IBLOSW(29),IOFF,16)
+ CALL OFFSET(IOFF,1,IWORD,16,IBITCR,ILMGRIB,IERR)
+ IF (IERR.NE.0)GO TO 900
+C
+C* 3. BLOCK 4 DATA
+C ----
+C
+ 300 CONTINUE
+C
+C* 3.1 LOGICALS
+C DECODE LOGICALS FROM MARS FORMAT
+C
+ 310 CONTINUE
+C* FINDS LENGTH OF LOGICALS
+ ILLGTH=IBLOSW(27)-IBLOSW(26)
+ IBYTE=8
+ IVAL=ILLGTH
+ CALL GBYTES(MGRIBS(IWORD),ILSOUT(1),IOFF,IBYTE,0,IVAL)
+ CALL OFFSET(IOFF,IVAL,IWORD,IBYTE,IBITCR,ILMGRIB,IERR)
+ IF (IERR.NE.0) GO TO 900
+ DO 314 I=1,ILLGTH
+C-- LOGISW(I)=SHIFTL(ILSOUT(I),63)
+ IF (ILSOUT(I).EQ.1) LOGISW(I) = .TRUE.
+C--
+ 314 CONTINUE
+C
+C* 3.2 INTEGERS
+C
+C* LENGTH OF INTEGERS
+ IILGTH=(IBLOSW(28)-IBLOSW(27))/2
+ IBYTE=16
+ IVAL=IILGTH
+ CALL GBYTES(MGRIBS(IWORD),INSOUT(1),IOFF,IBYTE,0,IVAL)
+ CALL OFFSET(IOFF,IVAL,IWORD,IBYTE,IBITCR,ILMGRIB,IERR)
+ IF (IERR.NE.0)GO TO 900
+C* 3.3 REALS
+C
+C* LENGTH OF REAL SECTION
+ IRLGTH=IBLOSW(29)/4
+ DO 335 J=1,IRLGTH
+ CALL GBYTE(MGRIBS(IWORD),IEXP,IOFF,8)
+ CALL OFFSET(IOFF,1,IWORD,8,IBITCR,ILMGRIB,IERR)
+ IF (IERR.NE.0)GO TO 900
+ CALL GBYTE(MGRIBS(IWORD),IMANT,IOFF,24)
+ CALL OFFSET(IOFF,1,IWORD,24,IBITCR,ILMGRIB,IERR)
+ IF (IERR.NE.0)GO TO 900
+ CALL DECFP(RESOUT(J),IEXP,IMANT)
+ 335 CONTINUE
+C
+C
+C* 3.4 UNUSED WORDS
+C
+ 340 CONTINUE
+C* USED OCTET
+ IUSED=33+ILLGTH+IILGTH*2+IRLGTH*4
+C* UNUSED OCTET
+ IUNUSE=ILENSW*8-4-IUSED
+ DO 345 J=1,IUNUSE
+ CALL GBYTE(MGRIBS(IWORD),IEEE,IOFF,8)
+ CALL OFFSET(IOFF,1,IWORD,8,IBITCR,ILMGRIB,IERR)
+ IF (IERR.NE.0)GO TO 900
+ 345 CONTINUE
+C
+C* 3.5 CORECT LENGTH OF INTEGER SECTION
+C
+ 350 CONTINUE
+ INGL=INSOUT(6)
+ INLEV=INSOUT(6+INGL+1)
+ J1A=1
+ J1T=6
+ J2A=J1T+1
+ J2T=J2A+INGL-1
+ J3A=J2T+1
+ J3T=J3A+14-1
+ J4A=J3T+1
+ J4T=J4A+INGL-1
+ J5A=J4T+1
+ J5T=J5A+INGL-1
+ J6A=J5T+1
+ J6T=J6A+10-1
+ J7A=J6T+1
+ J7T=J7A+INLEV-1
+ J8A=J7T+1
+ J8T=J8A+INLEV-1
+ J9A=J8T+1
+ J9T=J9A+INLEV-1
+ IILGTH=J9T
+C
+C* 4. BLOCK 5
+C
+ 400 CONTINUE
+ CALL GBYTES(MGRIBS(IWORD),IAA(1),IOFF,8,0,4)
+C
+C
+C* 5. OUTPUT
+C
+ 500 CONTINUE
+ IF (LPRINTS) THEN
+C
+ CALL ANALSW(IBLOSW,LOGISW,ILLGTH,INSOUT,IILGTH,
+ S RESOUT,IRLGTH)
+C
+ ENDIF
+C
+C* 6. RETURN
+C
+ 600 CONTINUE
+ RETURN
+C
+C* 9. ERROR HANDLING
+C
+ 900 CONTINUE
+ WRITE(*,9901)
+ WRITE(*,'(A)') 'ERROR IN OFFSET'
+ CALL ENDRUN
+ STOP
+ 9901 FORMAT('ERROR IN SUBROUTINE DSWMRS')
+ END
diff --git a/gribex/ecdef1.F b/gribex/ecdef1.F
new file mode 100755
index 0000000..9eca069
--- /dev/null
+++ b/gribex/ecdef1.F
@@ -0,0 +1,246 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF1( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS,
+ X KPR, KRET)
+C
+C---->
+C**** ECDEF1
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 1.
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF1( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KLENG - Length (words) of KGRIB.
+C
+C KNSPT - Bit number after which insertion/extraction starts.
+C
+C KBITS - Number of bits in computer word.
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C
+C KGRIB - Array containing Grib coded data.(Updated)
+C
+C KNSPT - Number of bit after last one inserted/extracted.(Updated)
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 1.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT
+C ABORTX
+C CSGNBT
+C DSGNBT
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+C Adapted from ECLOC1.F - simplified to handle just definition 1.
+#include "ecdef1.h"
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 18th January 1995
+C
+C
+C Modifications.
+C --------------
+C
+C J.D.Chambers ECMWF 2nd February 1995
+C Add ensemble mean/standard deviation usage of definition 1.
+C
+C J.D.Chambers ECMWF Jan 2000
+C Allow single 2-byte ensemble number for stream 1090 (ECMWF
+C ensemble seasonal forecasts)
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0 . Definition of variables. Data statements.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+ INTEGER IRET, IZERO
+C
+ LOGICAL LENCODE
+C
+C -----------------------------------------------------------------|
+C* Section 1 . Set initial values.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = ( HFUNC .EQ. 'C' )
+C
+C -----------------------------------------------------------------|
+C* Section 2 . Handle definition 1.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( KSEC1(40).EQ.1090 ) THEN
+C
+C If seasonal forecast data ...
+C
+C Octet 50-51 : Forecast number.
+C One 16 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),1,KBITS,16,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+ IF( .NOT. LENCODE ) KSEC1(43) = 0
+C
+ ELSE IF (KSEC1(39).EQ.10.OR.
+ X KSEC1(39).EQ.11.OR.
+ X KSEC1(39).EQ.17.OR.
+ X KSEC1(39).EQ.18.OR.
+ X KSEC1(39).EQ.23) THEN
+C
+C If type =
+C 10 = Control forecast
+C 11 = Perturbed forecast
+C 17 = Ensemble means
+C 18 = Ensemble standard deviations
+C 23 = Empirical distribution
+C
+C Octet 50 : Forecast number.
+C Octet 51 : Total number of Forecasts.
+C Two 8 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),2,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+ ELSE
+C
+C Octet 50-51 : Reserved.
+C Should be 0 !!
+C
+ IF ( LENCODE ) THEN
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,16,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ ELSE
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),2,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ ENDIF
+ ENDIF
+C
+C Octet 52 : Reserved.
+C Set to 0.
+C
+ IF ( LENCODE ) THEN
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ ELSE
+ KNSPT = KNSPT + 8
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9 . Abort/return to calling routine. Format statements.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) THEN
+ WRITE(GRPRSM,*) 'ECDEF1 : Section 9.'
+ WRITE(GRPRSM,*) ' Output values set -'
+ WRITE(GRPRSM,9003) KNSPT
+ ENDIF
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF (IRET.EQ.0.AND.KRET.NE.0) THEN
+ CALL ABORTX ('ECDEF1')
+ ELSE
+ RETURN
+ ENDIF
+C
+ 9003 FORMAT (1H ,' KNSPT = ',I12)
+C
+ 9004 FORMAT (' ECDEF1: Error reported by routine INXBIT.')
+C
+ END
diff --git a/gribex/ecdef1.h b/gribex/ecdef1.h
new file mode 100755
index 0000000..0f0aaaf
--- /dev/null
+++ b/gribex/ecdef1.h
@@ -0,0 +1,102 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 1.
+C Ensemble forecast data.
+C ----------------------------------
+C
+C
+C 38 Class : 1 = Operations
+C 2 = Research
+C
+C 39 Type : 1 = First Guess
+C 2 = Analysis
+C 3 = Initialised analysis
+C 4 = OI analysis
+C 5 = 3 D variational analysis
+C 6 = 4 D variational analysis
+C 7 = 3 D variational gradients
+C 8 = 4 D variational gradients
+C 9 = Forecast
+C 10 = Control forecast
+C 11 = Perturbed forecast
+C 12 = Errors in first guess
+C 13 = Errors in analysis
+C 14 = Cluster means
+C 15 = Cluster standard deviations.
+C 20 = Climatology
+C 30 = Observations
+C 31 = Quality control
+C 32 = Difference statistics
+C 40 = Image data
+C
+C 40 Stream : 1-1022 = Satellite data stream is the
+C satellite number as per BUFR
+C code table 0 01 007.
+C 50 = Meteosat 3
+C 51 = Meteosat 4
+C 52 = Meteosat 5
+C 53 = Meteosat 6
+C 201 = NOAA 9
+C 250 = GOES 6
+C 251 = GOES 7
+C 1025 = Daily archive
+C 1035 = Ensemble forecasts
+C 1036 = Sensitivities
+C 1041 = TOGA
+C 1042 = Chernobyl
+C 1043 = Monthly means of daily archive
+C 1044 = Supplementary data
+C 1045 = Wave
+C 1046 = Ocean
+C 1047 = FGGE
+C 1050 = Bracknell (daily)
+C 1051 = Washington (daily)
+C 1052 = Offenbach (daily)
+C 1053 = Paris (daily)
+C 1054 = Tokyo (daily)
+C 1055 = Montreal (daily)
+C 1056 = Melbourne (daily)
+C 1060 = Test
+C 1070 = Monthly standard deviation and covariance
+C 1071 = Monthly means of daily means
+C 1080 = Wave monthly means of daily archive
+C 1081 = Wave EPS
+C 1090 = ECMWF ensemble seasonal forecasts
+C 2231 = Meteo France climate centre
+C 2232 = MPI climate centre
+C 2233 = UKMO climate centre
+C 2240 = ECMWF seasonal forecast
+C 2241 = Meteo France seasonal forecast
+C 2242 = EDF seasonal forecast
+C 2243 = UKMO seasonal forecast
+C
+C 41 Expver : Version number/experiment identifier.
+C ( 4 Ascii characters, right justified)
+C
+C 42 Number : Ensemble forecast number.
+C Control forecast is number 0,
+C perturbed forecasts 1-nn.
+C
+C Set to 0 if not ensemble forecast.
+C
+C 43 Total : Total number of forecasts in ensemble.
+C This number includes the control
+C forecast.
+C
+C Set to 0 if not ensemble forecast.
+C Set to 0 if seasonal (ocean) data
+C Set to 33 if ensemble mean/standard
+C deviation.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef10.F b/gribex/ecdef10.F
new file mode 100755
index 0000000..4f7d1a0
--- /dev/null
+++ b/gribex/ecdef10.F
@@ -0,0 +1,307 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF10( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS,
+ X KPLEN, KPR, KRET)
+C
+C---->
+C**** ECDEF10
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 10.
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF10( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KLENG - Length (words) of KGRIB.
+C
+C KNSPT - Bit number after which insertion/extraction starts.
+C
+C KBITS - Number of bits in computer word.
+C
+C KPLEN - Pointer to field containing length of Section 1
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C
+C KGRIB - Array containing Grib coded data.(Updated)
+C
+C KNSPT - Number of bit after last one inserted/extracted.
+C (Updated)
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 10.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT - insert/extract bits
+C ABORTX - abort the program
+C CSGNBT - code a signed value
+C DSGNBT - decode a signed value
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+#include "ecdef10.h"
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF February 1998
+C
+C
+C Modifications.
+C --------------
+C
+C None
+C
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPLEN, KPR, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+C
+ INTEGER IRET, LENS1, N, INSPT
+ INTEGER ILALO
+ DIMENSION ILALO(4)
+C
+ LOGICAL LENCODE, LDECODE
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = ( HFUNC .EQ. 'C' )
+ LDECODE = .NOT. LENCODE
+C
+C ------------------------------------------------------------------
+C* Section 2 . Handle tube.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Octet 50: Tube number
+C Octet 51: Total number of tubes
+C Octet 52: Central cluster definition
+C Octet 53: Indicator of parameter considered
+C Octet 54: Indicator of type of level
+C Five 8-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),5,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF10: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, elements 42 - 46.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 50 - 54.'
+ ENDIF
+ ENDIF
+C
+C Octets 55-57: Northern latitude of the domain of tubing
+C Octets 58-60: Western longitude of the domain of tubing
+C Octets 61-63: Southern latitude of the domain of tubing
+C Octets 64-66: Eastern longitude of the domain of tubing
+C Four 24-bit fields.
+C
+C When coding values, set sign bit to 1, if value is negative.
+C
+ IF ( LENCODE ) THEN
+ CALL CSGNBT( ILALO(1), KSEC1(47), 24, KRET)
+ CALL CSGNBT( ILALO(2), KSEC1(48), 24, KRET)
+ CALL CSGNBT( ILALO(3), KSEC1(49), 24, KRET)
+ CALL CSGNBT( ILALO(4), KSEC1(50), 24, KRET)
+ ENDIF
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ILALO(1),4,KBITS,24,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF10: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, elements 47 - 50.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 55 - 66.'
+ ENDIF
+ ENDIF
+C
+C When decoding values, if sign bit is 1, value is
+C negative.
+C
+ IF ( LDECODE ) THEN
+ CALL DSGNBT( KSEC1(47), ILALO(1), 24, KRET)
+ CALL DSGNBT( KSEC1(48), ILALO(2), 24, KRET)
+ CALL DSGNBT( KSEC1(49), ILALO(3), 24, KRET)
+ CALL DSGNBT( KSEC1(50), ILALO(4), 24, KRET)
+ ENDIF
+C
+C Octet 67: Number of tube to which operational forecast belongs
+C Octet 68: Number of tube to which control forecast belongs
+C Two 8-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(51),2,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF10: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, elements 51 - 52.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 67 - 68.'
+ ENDIF
+ ENDIF
+C
+C Octets 69-70: Height/pressure of level considered
+C Octets 71-72: Reference step considered
+C Octets 73-74: Radius of central cluster
+C Octets 75-76: Ensemble standard deviation
+C Octets 77-78: Distance of the tube extreme to the ensemble mean
+C Five 16-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(53),5,KBITS,16,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF10: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, elements 53 - 57.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 69 - 78.'
+ ENDIF
+ ENDIF
+C
+C Octet 79: Number of forecasts belonging to the tube
+C One 8-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(58),1,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF10: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, element 58.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octet 79.'
+ ENDIF
+ ENDIF
+C
+C* The number of forecasts belonging to a cluster may vary,
+C but section 1 is kept a fixed length.
+C
+ INSPT = KNSPT + 255*8
+C
+C Octets 80-(79+N): List of N ensemble forecast numbers
+C N 8-bit fields.
+C
+ N = KSEC1(58)
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(59),N,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF10: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*)
+ X ' encoding section 1, element 59 onwards.'
+ ELSE
+ WRITE(GRPRSM,*)
+ X ' decoding section 1, octet 80 onwards.'
+ ENDIF
+ ENDIF
+C
+ KNSPT = INSPT
+C
+C On encoding, record the length of section 1.
+C
+ IF( LENCODE ) THEN
+ LENS1 = 79 + 255
+ CALL INXBIT(KGRIB,KLENG,KPLEN,LENS1, 1,KBITS,24,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF10: Error reported by routine INXBIT:'
+ WRITE(GRPRSM,*) ' encoding length of section 1.'
+ ENDIF
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 9 . Abort/return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) THEN
+ WRITE(GRPRSM,*) 'ECDEF10: Section 9.'
+ WRITE(GRPRSM,*) ' Output values set, KNSPT = ', KNSPT
+ ENDIF
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF (IRET.EQ.0.AND.KRET.NE.0) THEN
+ CALL ABORTX ('ECDEF10')
+ ELSE
+ RETURN
+ ENDIF
+C
+ END
diff --git a/gribex/ecdef10.h b/gribex/ecdef10.h
new file mode 100755
index 0000000..cfe8833
--- /dev/null
+++ b/gribex/ecdef10.h
@@ -0,0 +1,102 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 10.
+C EPS tubes
+C ---------
+C
+C Octet KSEC1(n)
+C ----- --------
+C
+C 41 37 ECMWF local GRIB use definition identifier:
+C 10 = EPS tubes
+C
+C 42 38 Class
+C 1 = Operations
+C 2 = Research
+C
+C 43 39 Type
+C 24 = Tubes
+C
+C 44-45 40 Stream
+C 1035 = Ensemble forecasts
+C
+C 46-49 41 Version number/experiment identifier.
+C (four ASCII characters, right justified)
+C
+C 50 42 Tube number (0=central cluster)
+C
+C 51 43 Total number of tubes (excluding central cluster)
+C
+C 52 44 Central cluster definition
+C 1: radius = % of total variance
+C 2: radius = predefined value
+C
+C 53 45 Indicator of parameter considered
+C (see code table 2 in section 1)
+C
+C 54 46 Indicator of type of level considered
+C (see WMO code table 3)
+C
+C 55-57 47 Northern latitude of the domain of tubing
+C
+C 58-60 48 Western longitude of the domain of tubing
+C
+C 61-63 49 Southern latitude of the domain of tubing
+C
+C 64-66 50 Eastern longitude of the domain of tubing
+C
+C 67 51 Number of tube to which the operational
+C forecast belongs(*)
+C 0 = central cluster,
+C 254 = does not belong to any tube
+C
+C 68 52 Number of tube to which the control
+C forecast belongs(*)
+C 0 = central cluster,
+C 254 = does not belong to any tube
+C
+C 69-70 53 Height/pressure of level considered
+C (see WMO code table 3)
+C
+C 71-72 54 Reference step considered
+C (same units of time as forecast timesteps)
+C
+C 73-74 55 Radius of central cluster
+C (in units of parameter defined in element 45)
+C
+C 75-76 56 Ensemble standard deviation
+C (in units of parameter defined in element 45)
+C
+C 77-78 57 Distance of the tube extreme to the ensemble mean
+C (in units of parameter defined in element 45). Not
+C applicable if this is the central cluster, in which
+C case the value is set = 65535, ie a missing value.
+C
+C 79 58 Number of forecasts belonging to the tube
+C or central cluster, including the control
+C forecast (N)
+C
+C 80-(79+N) 59-(58+N) List of N ensemble forecast numbers (**)
+C Order is important, first on the list is
+C the tube extreme
+C
+C Notes:
+C * a forecast may belong to several tubes. In this case, the
+C forecast is associated with the tube whose extreme is closest.
+C
+C ** by order of decreasing distance to the ensemble mean.
+C
+C
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef11.F b/gribex/ecdef11.F
new file mode 100755
index 0000000..f4b5c72
--- /dev/null
+++ b/gribex/ecdef11.F
@@ -0,0 +1,250 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF11( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS,
+ X KPR, KRET)
+C
+C---->
+C**** ECDEF11
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 11.
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF11( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KLENG - Length (words) of KGRIB.
+C
+C KNSPT - Bit number after which insertion/extraction starts.
+C
+C KBITS - Number of bits in computer word.
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C
+C KGRIB - Array containing Grib coded data.(Updated)
+C
+C KNSPT - Number of bit after last one inserted/extracted.
+C (Updated)
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 11.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT - insert/extract bits
+C ABORTX - abort the program
+C CSGNBT - code a signed value
+C DSGNBT - decode a signed value
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+#include "ecdef11.h"
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF February 1998
+C
+C
+C Modifications.
+C --------------
+C
+C None
+C
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+C
+ INTEGER IRET, IZERO, JLOOP
+C
+ LOGICAL LENCODE, LDECODE
+C
+ DATA IZERO/0/
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = ( HFUNC .EQ. 'C' )
+ LDECODE = .NOT. LENCODE
+C
+C ------------------------------------------------------------------
+C* Section 2 . Handle data for analysis which used the supplementary
+C data
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Octet 50: Class of analysis
+C Octet 51: Type of analysis
+C Two 8-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),2,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF11: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, elements 42 - 43.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 50 - 51.'
+ ENDIF
+ ENDIF
+C
+C Octets 52-53: Stream of analysis
+C One 16-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(44),1,KBITS,16,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF11: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, element 44.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 52 - 53.'
+ ENDIF
+ ENDIF
+C
+C Octets 54-57: Version number/experiment identifier of analysis
+C One 32-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(45),1,KBITS,32,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF11: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, element 45.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 54 - 57.'
+ ENDIF
+ ENDIF
+C
+C Octet 58: Year of analysis
+C Octet 59: Month of analysis
+C Octet 60: Day of analysis
+C Octet 61: Hour of analysis
+C Octet 62: Minute of analysis
+C Octet 63: Century of analysis
+C Octet 64: Originating centre of analysis
+C Octet 65: Sub-centre of analysis
+C Eight 8-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(46),8,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF11: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, elements 46 - 53.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 58 - 65.'
+ ENDIF
+ ENDIF
+C
+C Octets 66-72: Spare - set to zero.
+C Seven 8-bit fields.
+C
+ IF( LENCODE ) THEN
+ DO 210 JLOOP = 1, 7
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF11: Error reported by routine INXBIT:'
+ WRITE(GRPRSM,*)
+ X ' encoding section 1, octets 66 - 72.'
+ ENDIF
+ 210 CONTINUE
+ ELSE
+ KNSPT = KNSPT + (7*8)
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 9 . Abort/return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) THEN
+ WRITE(GRPRSM,*) 'ECDEF11: Section 9.'
+ WRITE(GRPRSM,*) ' Output values set, KNSPT = ', KNSPT
+ ENDIF
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF (IRET.EQ.0.AND.KRET.NE.0) THEN
+ CALL ABORTX ('ECDEF11')
+ ELSE
+ RETURN
+ ENDIF
+C
+ END
diff --git a/gribex/ecdef11.h b/gribex/ecdef11.h
new file mode 100755
index 0000000..1324d89
--- /dev/null
+++ b/gribex/ecdef11.h
@@ -0,0 +1,63 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 11.
+C Supplementary data used by the analysis
+C ---------------------------------------
+C
+C Octet KSEC1(n)
+C ----- --------
+C
+C 41 37 ECMWF local GRIB use definition identifier:
+C 11 = Supplementary data used by the analysis
+C
+C 42 38 Class
+C
+C 43 39 Type
+C
+C 44-45 40 Stream
+C
+C 46-49 41 Version number/experiment identifier.
+C (four ASCII characters, right justified)
+C
+C Followed by details of the analysis which used the supplementary data:
+C
+C 50 42 Class of analysis
+C
+C 51 43 Type of analysis
+C
+C 52-53 44 Stream of analysis
+C
+C 54-57 45 Version number/experiment identifier of analysis
+C (four ASCII characters, right justified)
+C
+C 58 46 Year of analysis (YY)
+C
+C 59 47 Month of analysis (MM)
+C
+C 60 48 Day of analysis (DD)
+C
+C 61 49 Hour of analysis (HH)
+C
+C 62 50 Minute of analysis (MM)
+C
+C 63 51 Century of analysis
+C
+C 64 52 Originating centre of analysis
+C
+C 65 53 Sub-centre of analysis
+C
+C 66-72 - Spare (set to zero)
+C
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef12.F b/gribex/ecdef12.F
new file mode 100755
index 0000000..c7948b2
--- /dev/null
+++ b/gribex/ecdef12.F
@@ -0,0 +1,297 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF12( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS,
+ X KPR, KRET)
+C
+C---->
+C**** ECDEF12
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 12.
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF12( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KLENG - Length (words) of KGRIB.
+C
+C KNSPT - Bit number after which insertion/extraction starts.
+C
+C KBITS - Number of bits in computer word.
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C
+C KGRIB - Array containing Grib coded data.(Updated)
+C
+C KNSPT - Number of bit after last one inserted/extracted.
+C (Updated)
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 10.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT - insert/extract bits
+C ABORTX - abort the program
+C CSGNBT - code a signed value
+C DSGNBT - decode a signed value
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+#include "ecdef12.h"
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF November 1998
+C
+C
+C Modifications.
+C --------------
+C
+C None
+C
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+C
+ INTEGER IRET, LOOP
+C
+ LOGICAL LENCODE, LDECODE
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = ( HFUNC.EQ.'C' )
+ LDECODE = .NOT.LENCODE
+C
+C ------------------------------------------------------------------
+C* Section 2 . Handle data for analysis which used the SST
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Octet 50-53: Start date of the period (YYYYMMDD)
+C One 32-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),1,KBITS,32,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF12: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, element 42.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 50 - 53.'
+ ENDIF
+ ENDIF
+C
+C Octets 54-55: Start time of the period (HHMM)
+C One 16-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(43),1,KBITS,16,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF12: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, element 43.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 54 - 55.'
+ ENDIF
+ ENDIF
+C
+C Octet 56-59: Finish date of the period (YYYYMMDD)
+C One 32-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(44),1,KBITS,32,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF12: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, element 44.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 56 - 59.'
+ ENDIF
+ ENDIF
+C
+C Octets 60-61: Finish time of the period (HHMM)
+C One 16-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(45),1,KBITS,16,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF12: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, element 45.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 60 - 61.'
+ ENDIF
+ ENDIF
+C
+C Octet 62-65: Verifying date of the period (YYYYMMDD)
+C One 32-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(46),1,KBITS,32,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF12: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, element 46.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 62 - 65.'
+ ENDIF
+ ENDIF
+C
+C Octets 66-67: Verifying time of the period (HHMM)
+C One 16-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(47),1,KBITS,16,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF12: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, element 47.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 66 - 67.'
+ ENDIF
+ ENDIF
+C
+C Octet 68: Code showing method of meaning, averaging, etc
+C One 8-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(48),1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF12: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, element 48.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octet 68.'
+ ENDIF
+ ENDIF
+C
+C Octet 69-70: No (N) of different time intervals used to build data
+C One 16-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(49),1,KBITS,16,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF12: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, element 49.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 69 - 70.'
+ ENDIF
+ ENDIF
+C
+C Octets 71-70+(N*4): List of time intervals used
+C N 32-bit fields.
+C
+ DO LOOP = 1, KSEC1(49)
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(49+LOOP),1,KBITS,32,
+ X HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF12: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*)
+ X ' encoding section 1, elements 50 onwards.'
+ ELSE
+ WRITE(GRPRSM,*)
+ X ' decoding section 1, octets 71 onwards.'
+ ENDIF
+ ENDIF
+ ENDDO
+C
+C ------------------------------------------------------------------
+C* Section 9 . Abort/return to calling routine.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) THEN
+ WRITE(GRPRSM,*) 'ECDEF12: Section 9.'
+ WRITE(GRPRSM,*) ' Output values set, KNSPT = ', KNSPT
+ ENDIF
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF( (IRET.EQ.0).AND.(KRET.NE.0) ) THEN
+ CALL ABORTX('ECDEF12')
+ ELSE
+ RETURN
+ ENDIF
+C
+ END
diff --git a/gribex/ecdef12.h b/gribex/ecdef12.h
new file mode 100755
index 0000000..733d080
--- /dev/null
+++ b/gribex/ecdef12.h
@@ -0,0 +1,123 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 12.
+C
+C Mean, average, etc.
+C -------------------
+C
+C Octet KSEC1(n)
+C ----- --------
+C
+C 1-3 Length of section 1 in octets (=70)
+C
+C 4 1 Version number of code table 2
+C
+C 5 2 Identification of originating centre
+C (98 = ECMWF)
+C
+C 6 3 Generating process identification number
+C
+C 7 4 Grid definition
+C
+C 8 5 Flag indicating whether sections 2/3 are present
+C
+C 9 6 Parameter indicator
+C
+C 10 7 Level indicator
+C
+C 11 8 Height/pressure level
+C
+C 12 9 Height/pressure level
+C
+C 13 10 Start date - Year (YY)
+C
+C 14 11 Start date - Month (MM)
+C
+C 15 12 Start date - Day (DD)
+C
+C 16 13 Start date - Hour (HH)
+C
+C 17 14 Start date - Minute (MM)
+C
+C 18 15 Time unit indicator (see WMO code table 4)
+C
+C 19 16 Time period P1
+C
+C 20 17 Time period P2
+C
+C 21 18 Time range indicator (see WMO code table 5)
+C
+C 22-23 19 Number included in the mean, average, etc.
+C
+C 24 20 Number missing from mean, average, etc.
+C
+C 25 21 Century of start date
+C
+C 26 22 Sub-centre identifier
+C
+C 27-28 23 Decimal scale factor
+C
+C 24 Flag to indicate ECMWF local usage follows
+C in section 1
+C
+C 29-40 25-36 Zero
+C
+C 41 37 ECMWF local GRIB use definition identifier:
+C 12 = Mean, average, etc.
+C
+C 42 38 Class
+C
+C 43 39 Type
+C
+C 44-45 40 Stream
+C
+C 46-49 41 Version number/experiment identifier.
+C (four ASCII characters, right justified)
+C
+C Description of the time period over which the mean/average/etc was
+C constructed:
+C
+C 50-53 42 Start date of the period (YYYYMMDD)
+C
+C 54-55 43 Start time of the period (HHMM)
+C
+C 56-59 44 Finish date of the period (YYYYMMDD)
+C
+C 60-61 45 Finish time of the period (HHMM)
+C
+C 62-65 46 Verifying date of the period (YYYYMMDD)
+C
+C 66-67 47 Verifying time of the period (HHMM)
+C
+C 68 48 Code showing method of meaning, averaging, etc:
+C 1 = by step of integration
+C 2 = by postprocessing step
+C 3 = monthly means of instantaneous values
+C 4 = monthly means of daily means
+C 5 = monthly means of forecast accumulations
+C :
+C 255 = not used
+C
+C 69-70 49 Number (N) of different time intervals used to
+C build data.
+C N = 1 if a constant interval has been used.
+C Otherwise all intervals must be given in the
+C following list.
+C
+C 71- 50- List of time intervals used (in order) in time
+C 70+(N*4) 49+N units defined in octet 18
+C
+C
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef13.F b/gribex/ecdef13.F
new file mode 100755
index 0000000..e933b3d
--- /dev/null
+++ b/gribex/ecdef13.F
@@ -0,0 +1,344 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF13( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS,
+ X KPLEN, KPR, KRET)
+C
+C---->
+C**** ECDEF13
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 13.
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF13( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KLENG - Length (words) of KGRIB.
+C
+C KNSPT - Bit number after which insertion/extraction starts.
+C
+C KBITS - Number of bits in computer word.
+C
+C KPLEN - Pointer to field containing length of Section 1
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C
+C KGRIB - Array containing Grib coded data.(Updated)
+C
+C KNSPT - Number of bit after last one inserted/extracted.
+C (Updated)
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 13.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT - insert/extract bits
+C ABORTX - abort the program
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+#include "ecdef13.h"
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF April 1998
+C
+C
+C Modifications.
+C --------------
+C
+C Add system and method numbers
+C J.D.Chambers ECMWF May 2000
+C
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPLEN, KPR, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+C
+ INTEGER IRET, IZERO, JLOP, LENS1, ND, NF, IFLAG
+C
+ LOGICAL LENCODE, LDECODE
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = ( HFUNC .EQ. 'C' )
+ LDECODE = .NOT. LENCODE
+C
+C ------------------------------------------------------------------
+C* Section 2 . Handle tube.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Octet 50: As for MARS labelling (zero or ensemble forecast number)
+C Octet 51: As for MARS labelling (zero or total no. in ensembles)
+C Octet 52: Direction number
+C Octet 53: Frequency number
+C Octet 54: Total number of directions (Nd)
+C Octet 55: Total number of frequencies (Nf)
+C Six 8-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),6,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF13: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, elements 42 - 47.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 50 - 55.'
+ ENDIF
+ ENDIF
+C
+ ND = KSEC1(46)
+ NF = KSEC1(47)
+C
+C Octets 56-59: Integer scaling factor applied to directions
+C Octets 60-63: Integer scaling factor applied to frequencies
+C Two 32-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(48),2,KBITS,32,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF13: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, elements 48 - 49.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 56 - 63.'
+ ENDIF
+ ENDIF
+C
+C Octet 64: Flag to indicate whether or not system
+C and method number are present.
+C 0 = not present (old style product)
+C 1 = present
+C
+ IFLAG = 1
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IFLAG,1,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF13: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, system/method flag'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octet 64'
+ ENDIF
+ ENDIF
+C
+C If the flag is set (new style product)
+C
+ IF( IFLAG.EQ.1 ) THEN
+C
+C Octets 65-66: System number
+C One 16-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(50+ND+NF),
+ X 1,KBITS,16,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF13: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, system number'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 65 - 66'
+ ENDIF
+ ENDIF
+C
+C Octets 67-68: Method number
+C One 16-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(51+ND+NF),
+ X 1,KBITS,16,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF13: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, method number'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 67 - 68'
+ ENDIF
+ ENDIF
+C
+ ELSE
+C
+C (Old style)
+C Octets 65-68: Spare (set to zero)
+C Four 8-bit fields.
+C
+ IF( LENCODE ) THEN
+ DO JLOP = 65, 68
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*)
+ X 'ECDEF13: Error reported by routine INXBIT:'
+ WRITE(GRPRSM,*)
+ X ' encoding section 1, octets 69 - 100.'
+ ENDIF
+ ENDDO
+ ELSE
+ KNSPT = KNSPT + 4*8
+ ENDIF
+ ENDIF
+C
+C Octets 69-100: Spare (set to zero)
+C Thirty-32 8-bit fields.
+C
+ IF( LENCODE ) THEN
+ DO 210 JLOP = 69, 100
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF13: Error reported by routine INXBIT:'
+ WRITE(GRPRSM,*) ' encoding section 1, octets 69 - 100.'
+ ENDIF
+ 210 CONTINUE
+ ELSE
+ KNSPT = KNSPT + 32*8
+ ENDIF
+C
+C Octet 101 onwards: List of Nd scaled directions
+C Nd 32-bit fields.
+C
+ DO 220 JLOP = 50, (49+ND)
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(JLOP),1,KBITS,32,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF13: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*)
+ X ' encoding section 1, elements 50 onwards'
+ ELSE
+ WRITE(GRPRSM,*)
+ X ' decoding section 1, octets 101 onwards.'
+ ENDIF
+ ENDIF
+ 220 CONTINUE
+C
+C Octets 101+Nd*4 onwards: List of Nf scaled frequencies
+C Nf 32-bit fields.
+C
+ DO 230 JLOP = (50+ND), (49+ND+NF)
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(JLOP),1,KBITS,32,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF13: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*)
+ X ' encoding section 1, element (50+Nd) etc.'
+ ELSE
+ WRITE(GRPRSM,*)
+ X ' decoding section 1, octets (101+Nd*4)->'
+ ENDIF
+ ENDIF
+ 230 CONTINUE
+C
+C
+C On encoding, record the length of section 1.
+C
+ IF( LENCODE ) THEN
+ LENS1 = 100 + (ND*4) + (NF*4)
+ CALL INXBIT(KGRIB,KLENG,KPLEN,LENS1, 1,KBITS,24,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF13: Error reported by routine INXBIT:'
+ WRITE(GRPRSM,*) ' encoding length of section 1.'
+ ENDIF
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 9 . Abort/return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) THEN
+ WRITE(GRPRSM,*) 'ECDEF13: Section 9.'
+ WRITE(GRPRSM,*) ' Output values set, KNSPT = ', KNSPT
+ ENDIF
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF (IRET.EQ.0.AND.KRET.NE.0) THEN
+ CALL ABORTX ('ECDEF13')
+ ELSE
+ RETURN
+ ENDIF
+C
+ END
diff --git a/gribex/ecdef13.h b/gribex/ecdef13.h
new file mode 100755
index 0000000..2c3e4c2
--- /dev/null
+++ b/gribex/ecdef13.h
@@ -0,0 +1,88 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 13.
+C Wave 2D spectra direction and frequency
+C ---------------------------------------
+C
+C Octet KSEC1(n)
+C ----- --------
+C
+C 41 37 ECMWF local GRIB use definition identifier:
+C 13 = Wave 2D spectra direction and frequency
+C
+C 42 38 Class
+C 1 = Operations
+C 2 = Research
+C
+C 43 39 Type
+C
+C 44->45 40 Stream
+C 1045 = Wave
+C
+C 46->49 41 Version number/experiment identifier.
+C (four ASCII characters, right justified)
+C
+C 50 42 As for MARS labelling
+C (eg set to zero, or
+C ensemble forecast number if appropriate)
+C
+C 51 43 As for MARS labelling
+C (eg set to zero, or
+C total number in ensembles if appropriate)
+C
+C 52 44 Direction number
+C
+C 53 45 Frequency number
+C
+C 54 46 Total number of directions (Nd)
+C
+C 55 47 Total number of frequencies (Nf)
+C
+C 56->59 48 Integer scaling factor applied to directions
+C in following list of direction definitions
+C (4-byte integer)
+C
+C 60->63 49 Integer scaling factor applied to frequencies
+C in following list of frequency definitions
+C (4-byte integer)
+C
+C 64 - Flag to show whether or not system and method
+C number are present:
+C 0 = not present (old style product)
+C 1 = present
+C
+C 65->66 (50+Nd+Nf) System number: the "scientific version" number.
+C 0 = RD experiment
+C 1 -> 65534 = operational version number
+C 65535 = missing
+C
+C 67->68 (51+Nd+Nf) Method number: distinguishes scientifically
+C different forecast ensembles (eg different
+C calibration/bias correction)
+C 0 = control integration
+C (ie without data assimilation)
+C 1 -> 65534 = operational version number
+C 65535 = missing
+C
+C 69->100 Spare (set to zero)
+C
+C 101-> 50-> List of Nd scaled directions
+C (100+Nd*4) (49+Nd) (4-byte integers)
+C
+C (101+Nd*4)-> (50+Nd)-> List of Nf scaled frequencies
+C (100+Nd*4+Nf*4) (49+Nd+Nf) (4-byte integers)
+C
+C
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef14.F b/gribex/ecdef14.F
new file mode 100755
index 0000000..c614a3c
--- /dev/null
+++ b/gribex/ecdef14.F
@@ -0,0 +1,277 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF14( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS,
+ X KPLEN, KPR, KRET)
+C
+C---->
+C**** ECDEF14
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 14.
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF14( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KLENG - Length (words) of KGRIB.
+C
+C KNSPT - Bit number after which insertion/extraction starts.
+C
+C KBITS - Number of bits in computer word.
+C
+C KPLEN - Pointer to field containing length of Section 1
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C
+C KGRIB - Array containing Grib coded data.(Updated)
+C
+C KNSPT - Number of bit after last one inserted/extracted.
+C (Updated)
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 14.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT - insert/extract bits
+C ABORTX - abort the program
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+#include "ecdef14.h"
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF August 1998
+C
+C
+C Modifications.
+C --------------
+C
+C None
+C
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPLEN, KPR, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+C
+ INTEGER IRET, IZERO, JLOP, LENS1, NF, NLEFT
+C
+ LOGICAL LENCODE, LDECODE
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = ( HFUNC.EQ.'C' )
+ LDECODE = .NOT. LENCODE
+C
+C ------------------------------------------------------------------
+C* Section 2 . Handle brightness temperature
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Octet 50: As for MARS labelling (zero or ensemble forecast number)
+C Octet 51: As for MARS labelling (zero or total no. in ensembles)
+C Octet 52: Channel number
+C Three 8-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),3,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF14: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, elements 42 - 44.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 50 - 52.'
+ ENDIF
+ ENDIF
+C
+C Octets 53-56: Integer scaling factor applied to frequencies
+C One 32-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(45),1,KBITS,32,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF14: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, element 45.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 53 - 56.'
+ ENDIF
+ ENDIF
+C
+C Octet 57: Total number of frequencies (Nf)
+C One 8-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(46),1,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF14: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, element 46.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 57.'
+ ENDIF
+ ENDIF
+C
+C Octets 58-60: Spare (set to zero)
+C Three 8-bit fields.
+C
+ IF( LENCODE ) THEN
+ DO 210 JLOP = 58, 60
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF14: Error reported by routine INXBIT:'
+ WRITE(GRPRSM,*) ' encoding section 1, octets 58 - 60.'
+ ENDIF
+ 210 CONTINUE
+ ELSE
+ KNSPT = KNSPT + 3*8
+ ENDIF
+C
+C Octet 61 onwards: List of Nf scaled directions
+C Nf 32-bit fields.
+C
+ NF = KSEC1(46)
+ DO 220 JLOP = 47, (46+NF)
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(JLOP),1,KBITS,32,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF14: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*)
+ X ' encoding section 1, elements 47 onwards'
+ ELSE
+ WRITE(GRPRSM,*)
+ X ' decoding section 1, octets 61 onwards.'
+ ENDIF
+ ENDIF
+ 220 CONTINUE
+C
+C Octets at end of header:Spare - set to zero.
+C (255-NF) 32-bit fields.
+C
+ NLEFT = 255 - NF
+ IF( LENCODE ) THEN
+ DO 230 JLOP = 1, NLEFT
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,32,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF11: Error reported by routine INXBIT:'
+ WRITE(GRPRSM,*)
+ X ' encoding section 1, spare octets at end.'
+ ENDIF
+ 230 CONTINUE
+ ELSE
+ KNSPT = KNSPT + (NLEFT*32)
+ ENDIF
+C
+C On encoding, record the length of section 1.
+C
+ IF( LENCODE ) THEN
+ LENS1 = 1080
+ CALL INXBIT(KGRIB,KLENG,KPLEN,LENS1, 1,KBITS,24,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF14: Error reported by routine INXBIT:'
+ WRITE(GRPRSM,*) ' encoding length of section 1.'
+ ENDIF
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 9 . Abort/return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) THEN
+ WRITE(GRPRSM,*) 'ECDEF14: Section 9.'
+ WRITE(GRPRSM,*) ' Output values set, KNSPT = ', KNSPT
+ ENDIF
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF (IRET.EQ.0.AND.KRET.NE.0) THEN
+ CALL ABORTX ('ECDEF14')
+ ELSE
+ RETURN
+ ENDIF
+C
+ END
diff --git a/gribex/ecdef14.h b/gribex/ecdef14.h
new file mode 100755
index 0000000..f0729eb
--- /dev/null
+++ b/gribex/ecdef14.h
@@ -0,0 +1,63 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 14.
+C Brightness temperature.
+C -----------------------
+C
+C Octet KSEC1(n)
+C ----- --------
+C
+C 41 37 ECMWF local GRIB use definition identifier:
+C 14 = Brightness temperature.
+C
+C 42 38 Class
+C 1 = Operations
+C 2 = Research
+C
+C 43 39 Type
+C 12 = estimate of forecast accuracy (ef)
+C 13 = estimate of analysis accuracy (ea)
+C
+C 44->45 40 Stream
+C 1025 = daily archive
+C
+C 46->49 41 Version number/experiment identifier.
+C (four ASCII characters, right justified)
+C
+C 50 42 As for MARS labelling
+C (eg set to zero, or
+C ensemble forecast number if appropriate)
+C
+C 51 43 As for MARS labelling
+C (eg set to zero, or
+C total number in ensembles if appropriate)
+C
+C 52 44 Channel number
+C
+C 53->56 45 Integer scaling factor applied to frequencies
+C in following list of frequency definitions
+C (4-byte integer)
+C
+C 57 46 Total number of frequencies (Nf)
+C
+C 58-60 Spare (set to zero)
+C
+C 61-> 47-> List of Nf scaled frequencies
+C 60+Nf*4 46+Nf (4-byte integers)
+C
+C 61+Nf*4-> Spare (set to zero)
+C 1080
+C
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef15.F b/gribex/ecdef15.F
new file mode 100755
index 0000000..4ad9a1c
--- /dev/null
+++ b/gribex/ecdef15.F
@@ -0,0 +1,207 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF15(HFUNC,KSEC1,KGRIB,KLENG,KNSPT,KBITS,KPR,KRET)
+C
+C---->
+C**** ECDEF15
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 15.
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF15(HFUNC,KSEC1,KGRIB,KLENG,KNSPT,KBITS,KPR,KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KLENG - Length (words) of KGRIB.
+C
+C KNSPT - Bit number after which insertion/extraction starts.
+C
+C KBITS - Number of bits in computer word.
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C
+C KGRIB - Array containing Grib coded data.(Updated)
+C
+C KNSPT - Number of bit after last one inserted/extracted.(Updated)
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 15.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT
+C ABORTX
+C CSGNBT
+C DSGNBT
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+C Adapted from ECLOC15.F - simplified to handle just definition 15.
+C
+#include "ecdef15.h"
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF February 2000
+C
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0 . Definition of variables. Data statements.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+C
+ INTEGER IRET, IZERO, LOOP
+ LOGICAL LENCODE
+C
+C -----------------------------------------------------------------|
+C* Section 1 . Set initial values.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = ( HFUNC.EQ.'C' )
+C
+C -----------------------------------------------------------------|
+C* Section 2 . Handle definition 15.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Octet 50-51 : Ensemble member number.
+C One 16 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),1,KBITS,16,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ GOTO 990
+ ENDIF
+C
+ IF( .NOT. LENCODE ) KSEC1(43) = 0
+C
+C Octet 52-53 : System number.
+C One 16 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(44),1,KBITS,16,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ GOTO 990
+ ENDIF
+C
+C Octet 54-55 : Method number.
+C One 16 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(45),1,KBITS,16,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ GOTO 990
+ ENDIF
+C
+C Octet 56-60 : Spare
+C Five 8 bit fields.
+C
+ IZERO = 0
+ IF( LENCODE ) THEN
+ DO LOOP = 1, 5
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ GOTO 990
+ ENDIF
+ ENDDO
+ ELSE
+ KNSPT = KNSPT + 40
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9 . Abort/return to calling routine. Format statements.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) WRITE(GRPRSM,*) 'ECDEF15: Output: KNSPT = ', KNSPT
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF( (IRET.EQ.0).AND.(KRET.NE.0) ) CALL ABORTX ('ECDEF15')
+C
+ RETURN
+C
+ 990 CONTINUE
+ WRITE(GRPRSM,*) 'ECDEF15: Error reported by routine INXBIT.'
+ RETURN
+C
+ END
diff --git a/gribex/ecdef15.h b/gribex/ecdef15.h
new file mode 100755
index 0000000..47522de
--- /dev/null
+++ b/gribex/ecdef15.h
@@ -0,0 +1,70 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 15.
+C
+C Seasonal forecast atmosphere data.
+C ----------------------------------
+C
+C
+C 38 Class : 1 = Operations
+C 2 = Research
+C
+C 39 Type : 1 = First Guess
+C 2 = Analysis
+C 3 = Initialised analysis
+C 4 = OI analysis
+C 5 = 3 D variational analysis
+C 6 = 4 D variational analysis
+C 7 = 3 D variational gradients
+C 8 = 4 D variational gradients
+C 9 = Forecast
+C 10 = Control forecast
+C 11 = Perturbed forecast
+C 12 = Errors in first guess
+C 13 = Errors in analysis
+C 14 = Cluster means
+C 15 = Cluster standard deviations.
+C 20 = Climatology
+C 30 = Observations
+C 31 = Quality control
+C 32 = Difference statistics
+C 40 = Image data
+C
+C 40 Stream : 1090 = ECMWF seasonal forecasts
+C
+C 41 Expver : Version number/experiment identifier.
+C ( 4 Ascii characters, right justified)
+C
+C 42 Number : Ensemble member number.
+C Control forecast is number 0,
+C perturbed forecasts 1-nn.
+C
+C 43 Zero
+C
+C 44 System number: the "scientific version" number.
+C
+C 0 = RD experiment
+C 1 - 65534 = operational version number
+C 65535 = missing
+C
+C 45 Method number: distinguishes scientifically different
+C forecast ensembles (eg different
+C calibration/bias correction)
+C
+C 0 = control integration (ie without data assimilation)
+C 1 - 65534 = operational version number
+C 65535 = missing
+C
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef16.F b/gribex/ecdef16.F
new file mode 100755
index 0000000..435b225
--- /dev/null
+++ b/gribex/ecdef16.F
@@ -0,0 +1,225 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF16(HFUNC,KSEC1,KGRIB,KLENG,KNSPT,KBITS,KPR,KRET)
+C
+C---->
+C**** ECDEF16
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 16.
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF16(HFUNC,KSEC1,KGRIB,KLENG,KNSPT,KBITS,KPR,KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KLENG - Length (words) of KGRIB.
+C
+C KNSPT - Bit number after which insertion/extraction starts.
+C
+C KBITS - Number of bits in computer word.
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C
+C KGRIB - Array containing Grib coded data.(Updated)
+C
+C KNSPT - Number of bit after last one inserted/extracted.(Updated)
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 16.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT
+C ABORTX
+C CSGNBT
+C DSGNBT
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+C None.
+C
+#include "ecdef16.h"
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF February 2000
+C
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0 . Definition of variables. Data statements.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+C
+ INTEGER IRET, IZERO, LOOP
+ LOGICAL LENCODE
+C
+C -----------------------------------------------------------------|
+C* Section 1 . Set initial values.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = ( HFUNC.EQ.'C' )
+C
+C -----------------------------------------------------------------|
+C* Section 2 . Handle definition 16.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Octet 50-51 : Ensemble member number.
+C One 16-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),1,KBITS,16,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ GOTO 990
+ ENDIF
+C
+ IF( .NOT. LENCODE ) KSEC1(43) = 0
+C
+C Octet 52-53 : System number.
+C One 16-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(44),1,KBITS,16,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ GOTO 990
+ ENDIF
+C
+C Octet 54-55 : Method number.
+C One 16-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(45),1,KBITS,16,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ GOTO 990
+ ENDIF
+C
+C Octet 56-59 : Verifying month (in format YYYYMM).
+C One 32-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(46),1,KBITS,32,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ GOTO 990
+ ENDIF
+C
+C Octet 60 : Averaging period (eg 6-hour, 24-hour).
+C One 8-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(47),1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ GOTO 990
+ ENDIF
+C
+C Octet 61-80 : Spare
+C Twenty 8-bit fields.
+C
+ IZERO = 0
+ IF( LENCODE ) THEN
+ DO LOOP = 1, 20
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ GOTO 990
+ ENDIF
+ ENDDO
+ ELSE
+ KNSPT = KNSPT + 20*8
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9 . Abort/return to calling routine. Format statements.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) WRITE(GRPRSM,*) 'ECDEF16: Output: KNSPT = ', KNSPT
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF( (IRET.EQ.0).AND.(KRET.NE.0) ) CALL ABORTX ('ECDEF16')
+C
+ RETURN
+C
+ 990 CONTINUE
+ WRITE(GRPRSM,*) 'ECDEF16: Error reported by routine INXBIT.'
+ RETURN
+C
+ END
diff --git a/gribex/ecdef16.h b/gribex/ecdef16.h
new file mode 100755
index 0000000..44747cf
--- /dev/null
+++ b/gribex/ecdef16.h
@@ -0,0 +1,66 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 16.
+C
+C Seasonal forecast monthly mean data.
+C ------------------------------------
+C
+C Octet KSEC1(n)
+C ----- --------
+C
+C 41 37 16 = ECMWF seasonal forecast monthly mean data
+C
+C 42 38 Class : 1 = Operations
+C 2 = Research
+C
+C 43 39 Type : 80 = Forecast seasonal mean
+C 81 = Forecast seasonal maximum
+C 82 = Forecast seasonal minimum
+C 83 = Forecast seasonal standard
+C deviation
+C
+C 44-45 40 Stream : 1091 = ECMWF seasonal forecast
+C monthly means
+C
+C 46-49 41 Expver : Version number/experiment identifier
+C (4 Ascii characters, right justified)
+C
+C 50-51 42 Number : Ensemble member number.
+C Control forecast is number 0,
+C perturbed forecasts 1-nn.
+C
+C 43 Zero (for compatibity with ensemble numering)
+C
+C 52-53 44 System number: the "scientific version" number.
+C 0 = RD experiment
+C 1 - 65534 = operational version number
+C 65535 = missing
+C
+C 54-55 45 Method number:
+C distinguishes scientifically different
+C forecast ensembles
+C (eg different calibration/bias correction)
+C 0 = control integration (without data
+C assimilation)
+C 1 - 65534 = operational version number
+C 65535 = missing
+C
+C 56-59 46 Verifying month (in format YYYYMM)
+C
+C 60 47 Averaging period (eg 6-hour, 24-hour)
+C
+C 61-80 Spare (set to zero)
+C
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef17.F b/gribex/ecdef17.F
new file mode 100755
index 0000000..b0fd8d7
--- /dev/null
+++ b/gribex/ecdef17.F
@@ -0,0 +1,288 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF17(HFUNC,KSEC1,KGRIB,KLENG,KNSPT,KBITS,KRET)
+C
+C---->
+C**** ECDEF17
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 17.
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF17(HFUNC,KSEC1,KGRIB,KLENG,KNSPT,KBITS,KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C KSEC1 - Array containing Grib Section 1 data.
+C KGRIB - Array containing Grib coded data.
+C KLENG - Length (words) of KGRIB.
+C KNSPT - Bit number after which insertion/extraction starts.
+C KBITS - Number of bits in computer word.
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C KGRIB - Array containing Grib coded data.(Updated)
+C KNSPT - Number of bit after last one inserted/extracted.(Updated)
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 17.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT
+C ABORTX
+C CSGNBT
+C DSGNBT
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+C Adapted from ecdef6.F
+C
+#include "ecdef17.h"
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF May 2000
+C
+C
+C Modifications.
+C --------------
+C
+C Set space used for the list of SEA-ICE dates to a multiple of
+C JPPAD to stabilise the length of section 1 of the GRIB header.
+C (Usually the number of dates will be less than 10).
+C
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JPPAD
+ PARAMETER( JPPAD = 10 )
+C
+C Subroutine arguments
+C
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+C
+ INTEGER IRET, IZERO, ILOOP, LENS1, INDATE, INSPT, NSEAICE, NEXTRA
+ INTEGER IPLEN
+C
+ LOGICAL LENCODE
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = ( HFUNC.EQ.'C' )
+ INSPT = KNSPT
+C
+C Set bit pointer to start of GRIB section 1
+C
+ IPLEN = 8*8
+C
+C ------------------------------------------------------------------
+C* Section 2 . Handle definition 6.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Octet 50-51 :Reserved.
+C Should be 0 !!
+C
+ IF ( LENCODE ) THEN
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO, 1,KBITS, 16,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ ELSE
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),2,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ ENDIF
+C
+C Octet 52-54 : YYMMDD date of the SST field used.
+C
+ IF( LENCODE) THEN
+ INDATE = KSEC1(44)
+ IF( INDATE.GT.19000000 ) INDATE = INDATE - 19000000
+ ENDIF
+ CALL INXBIT(KGRIB,KLENG,KNSPT,INDATE,1,KBITS,24,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ IF( .NOT. LENCODE) THEN
+ IF( (INDATE.LT.19000000).AND.(INDATE.GT.100) )
+ X INDATE = INDATE + 19000000
+ KSEC1(44) = INDATE
+ ENDIF
+C
+C Octet 55 : Type of SST field used.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(45), 1,KBITS, 8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+C Octet 56 : Count of ICE fields used (n, say).
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(46), 1,KBITS, 8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+C Octet 57->54+(n*4) : YYMMDD dates and satellite numbers of the
+C ICE fields used.
+C
+ NSEAICE = KSEC1(46)
+ DO ILOOP = 1, NSEAICE
+C
+C YYMMDD date.
+C
+ IF( LENCODE) THEN
+ INDATE = KSEC1(45+(ILOOP*2))
+ IF( INDATE.GT.19000000 ) INDATE = INDATE - 19000000
+ ENDIF
+ CALL INXBIT(KGRIB,KLENG,KNSPT,INDATE,1,KBITS,24,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ IF( .NOT. LENCODE) THEN
+ IF( (INDATE.LT.19000000).AND.(INDATE.GT.100) )
+ X INDATE = INDATE + 19000000
+ KSEC1(45+(ILOOP*2)) = INDATE
+ ENDIF
+C
+C Satellite number (ICE data).
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(46+(ILOOP*2)),
+ X 1,KBITS, 8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+ ENDDO
+C
+C ------------------------------------------------------------------
+C* Section 3 . Handle padding of the ICE field slots.
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C If the number of ICE fields used is not a multiple of JPPAD,
+C pad the ICE field slots upto a multiple of JPPAD.
+C
+ NEXTRA = JPPAD - MOD(NSEAICE,JPPAD)
+ NSEAICE = NSEAICE + NEXTRA
+ IF( LENCODE ) THEN
+ DO ILOOP = 1, NEXTRA
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,32,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ ENDDO
+C
+C If encoding, set length of section 1.
+C
+ LENS1 = 56 + NSEAICE*4
+ CALL INXBIT(KGRIB,KLENG,IPLEN,LENS1, 1,KBITS,24,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+ ELSE
+C
+C If decoding, use length of section 1 to step KNSPT pointer
+C past section 1, past any padding slots if any.
+C
+ CALL INXBIT(KGRIB,KLENG,IPLEN,LENS1, 1,KBITS,24,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ KNSPT = INSPT - (49*8) + LENS1*8
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 9 . Abort/return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF( (IRET.EQ.0).AND.(KRET.NE.0) ) THEN
+ CALL ABORTX ('ECDEF17')
+ ELSE
+ RETURN
+ ENDIF
+C
+ 9004 FORMAT (' ECDEF17: Error reported by routine INXBIT.')
+C
+ END
diff --git a/gribex/ecdef17.h b/gribex/ecdef17.h
new file mode 100755
index 0000000..1ce4bff
--- /dev/null
+++ b/gribex/ecdef17.h
@@ -0,0 +1,86 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 17.
+C Surface temperature or sea-ice data.
+C ------------------------------------
+C
+C GRIB code
+C KSEC1(NN) section 1
+C octet(s)
+C --------- ---------
+C
+C 37 41 ECMWF local GRIB use definition identifier
+C = 17
+C = surface temperature fields made from SST and
+C SSMI data with first-guess values inserted on
+C land points.
+C
+C 38 42 Class : 1 = Operations
+C
+C 39 43 Type : 2 = Analysis
+C
+C 40 44-45 Stream : 1025 = Daily archive
+C
+C 41 46-49 Expver : Version number/experiment identifier.
+C (4 Ascii characters, right justified)
+C
+C 42 50 Zero, for compatibility with MARS labelling.
+C
+C 43 51 Zero, for compatibility with MARS labelling.
+C
+C 44 52-54 Date of SST field used; YYYYMMDD.
+C (Stored in 3 bytes as YYYYMMDD-19000000.
+C Zero = date not given.)
+C
+C 45 55 Type of SST field used:
+C 0 = climatology
+C 1 = 1/1 degree sst data
+C 2 = 2/2 degree sst data
+C
+C 46 56 Count of ICE fields used (n, say).
+C (NB. n maybe 0).
+C
+C 47 57-59 Date of first ICE field used; YYYYMMDD.
+C (Stored in 3 bytes as YYYYMMDD-19000000.
+C Zero = date not given.)
+C
+C 48 60 First day satellite number (ICE data)
+C
+C 49 61-63 Date of second ICE field used ; YYYYMMDD.
+C (Stored in 3 bytes as YYYYMMDD-19000000.
+C Zero = date not given.)
+C
+C 50 64 Second day satellite number (ICE data)
+C
+C 51 65-67 Date of third ICE field used ; YYYYMMDD.
+C (Stored in 3 bytes as YYYYMMDD-19000000.
+C Zero = date not given.)
+C
+C 52 68 Third day satellite number (ICE data)
+C
+C
+C ...
+C
+C 45+(n*2) 53+(n*4) Date of nth field used; YYYYMMDD.
+C ->55+(n*4) (Stored in 3 bytes as YYYYMMDD-19000000.
+C Zero = date not given.)
+C
+C 46+(n*2) 56+(n*4) Nth day satellite number (ICE data)
+C
+C Slots for dates are allocated 10 at a time, so some slots may be
+C empty (ie zero). Empty slots are not includedd in the count N.
+C
+C
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef18.F b/gribex/ecdef18.F
new file mode 100755
index 0000000..8eaab60
--- /dev/null
+++ b/gribex/ecdef18.F
@@ -0,0 +1,255 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF18(HFUNC,KSEC1,KGRIB,KLENG,KNSPT,KBITS,KRET)
+C
+C---->
+C**** ECDEF18
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 18.
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF18(HFUNC,KSEC1,KGRIB,KLENG,KNSPT,KBITS,KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KLENG - Length (words) of KGRIB.
+C
+C KNSPT - Bit number after which insertion/extraction starts.
+C
+C KBITS - Number of bits in computer word.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C
+C KGRIB - Array containing Grib coded data.(Updated)
+C
+C KNSPT - Number of bit after last one inserted/extracted.(Updated)
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 18.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT - Insert/extract bits to/from bit stream.
+C ABORTX - Abort processing.
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+#include "ecdef18.h"
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF February 2001
+C
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0 . Definition of variables. Data statements.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+C
+ INTEGER IRET, IZERO, NUMBER, INUM, ILOOP, LOOP
+ CHARACTER*4 HBLANK
+C
+ LOGICAL LENCODE
+C
+C -----------------------------------------------------------------|
+C* Section 1 . Set initial values.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = HFUNC.EQ.'C'
+C
+C -----------------------------------------------------------------|
+C* Section 2 . Handle definition 1.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Octet 50 : Ensemble forecast number
+C Octet 51 : Total number of Forecasts.
+C Octet 52 : Data origin
+C Three 8-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),3,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF18: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, octets 50 to 52.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 50 to 52.'
+ ENDIF
+ ENDIF
+C
+C Octets 53 - 56 : Model identifier of forecast used
+C 4 Ascii characters, right justified
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(45),1,KBITS,32,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF18: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, octets 53 to 56.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 53 to 56.'
+ ENDIF
+ ENDIF
+C
+C Octet 57 : Consensus count
+C One 8-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(46),1,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF18: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, octet 57.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octet 57.'
+ ENDIF
+ ENDIF
+C
+C Octets 58 to 60 : Spare (set to zero)
+C
+ DO LOOP = 1, 3
+ IF ( LENCODE ) THEN
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF18: Error reported by routine INXBIT:'
+ WRITE(GRPRSM,*)
+ X ' encoding section 1, octets 58 to 60.'
+ ENDIF
+ ELSE
+ KNSPT = KNSPT + 8
+ ENDIF
+ ENDDO
+C
+C Octets 61 to 120 : List of WMO centre identifiers for analyses used
+C Upto fifteen fields. ( Each 4 Ascii characters, right justified)
+C
+ NUMBER = KSEC1(46)
+ DO LOOP = 1, NUMBER
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(46+LOOP),1,
+ X KBITS,32,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF18: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*)
+ X ' encoding section 1, list of WMO ids.'
+ ELSE
+ WRITE(GRPRSM,*)
+ X ' decoding section 1, list of WMO ids.'
+ ENDIF
+ ENDIF
+ ENDDO
+C
+C Handle unused entries (set to blanks)
+C
+ DO LOOP = NUMBER+1, 15
+ HBLANK = ' '
+ IF ( LENCODE ) THEN
+ CALL INXBIT(KGRIB,KLENG,KNSPT,HBLANK,1,KBITS,32,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF18: Error reported by routine INXBIT:'
+ WRITE(GRPRSM,*) ' encoding section 1, unused list.'
+ ENDIF
+ ELSE
+ KSEC1(46+LOOP) = 0
+ DO ILOOP = 1, 4
+ KSEC1(46+LOOP) = KSEC1(46+LOOP)*256 +
+ X ICHAR(HBLANK(ILOOP:ILOOP))
+ ENDDO
+ KNSPT = KNSPT + 32
+ ENDIF
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 9 . Abort/return to calling routine. Format statements.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF (IRET.EQ.0.AND.KRET.NE.0) THEN
+ CALL ABORTX ('ECDEF18')
+ ELSE
+ RETURN
+ ENDIF
+C
+ END
diff --git a/gribex/ecdef18.h b/gribex/ecdef18.h
new file mode 100755
index 0000000..2c92cdb
--- /dev/null
+++ b/gribex/ecdef18.h
@@ -0,0 +1,69 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 18.
+C
+C Multi-analysis ensemble data.
+C -----------------------------
+C
+C KSEC1
+C element
+C -------
+C
+C 37 ECMWF local GRIB use definition identifier
+C 18 = Multi-analysis ensemble data
+C
+C 38 Class : 1 = Operations
+C 2 = Research
+C
+C 39 Type : 2 = Analysis
+C 9 = Forecast
+C 10 = Control forecast
+C
+C 40 Stream : 1037 = multi-analysis ensemble data (MAED)
+C 1083 = multi-analysis wave data (MAWV)
+C
+C 41 Expver : Version number/experiment identifier.
+C ( 4 Ascii characters, right justified)
+C
+C 42 Number : Ensemble forecast number:
+C = 0 for a control forecast.
+C Not used for analysis (set to zero).
+C
+C 43 Total : Total number of forecasts in ensemble.
+C (Set to 1 for analysis).
+C
+C 44 Data origin :
+C = WMO identifier of centre providing the analysis
+C = 255 for a consensus product
+C
+C 45 Model : four-character identifier of forecast used
+C = "ECMF" for ECMWF IFS
+C = WMO centre CCCC identifier otherwise
+C ( 4 Ascii characters, right justified)
+C
+C 46 Consensus count : indicates the composition of the starting
+C analysis for a product (analysis, forecast, ..)
+C = 0 for a product from one centre
+C (ie not a consensus product)
+C = n for a consensus product, where n is the number of
+C analyses used in the consensus analysis.
+C (nb. This allows the case n = 1.)
+C
+C 47 - 61 List : WMO centre CCCC identifiers for the analyses used,
+C eg "KWBC". ( 4 Ascii characters, right justified)
+C Unused list entries are set to four blanks.
+C
+C
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef19.F b/gribex/ecdef19.F
new file mode 100755
index 0000000..2822af3
--- /dev/null
+++ b/gribex/ecdef19.F
@@ -0,0 +1,264 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF19(HFUNC,KSEC1,KGRIB,KLENG,KNSPT,KBITS,KRET)
+C
+C---->
+C**** ECDEF19
+C
+C Purpose.
+C --------
+C GRIB coding/decoding of ECMWF local use definition 19.
+C
+C Interface.
+C ----------
+C CALL ECDEF19(HFUNC,KSEC1,KGRIB,KLENG,KNSPT,KBITS,KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C KSEC1 - Array containing Grib Section 1 data.
+C KGRIB - Array containing Grib coded data.
+C KLENG - Length (words) of KGRIB.
+C KNSPT - Bit number after which insertion/extraction starts.
+C KBITS - Number of bits in computer word.
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C KGRIB - Array containing Grib coded data.(Updated)
+C KNSPT - Number of bit after last one inserted/extracted.(Updated)
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C
+C Method.
+C -------
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 19.
+C
+C
+C Externals.
+C ----------
+C INXBIT
+C ABORTX
+C
+C
+C Reference.
+C ----------
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C None
+C
+C
+#include "ecdef19.h"
+C
+C Author.
+C -------
+C J.D.Chambers ECMWF October 2002
+C
+C
+C Modifications.
+C --------------
+C None
+C
+C
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Subroutine arguments
+C
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+C
+ INTEGER IRET, IZERO, LENS1, INSPT, NCLIMON, NEXT
+ INTEGER IPLEN, ILOOPO, ILOOPI, IFULL
+C
+ LOGICAL LENCODE
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = ( HFUNC.EQ.'C' )
+ INSPT = KNSPT
+C
+C Set bit pointer to start of GRIB section 1
+C
+ IPLEN = 8*8
+C
+C ------------------------------------------------------------------
+C* Section 2 . Handle fixed part of definition 19.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Octet 50 : Zero, for compatibility with MARS labelling
+C
+ IF ( LENCODE ) THEN
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ ELSE
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ ENDIF
+C
+C Octet 51 : Ensemble size
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(43),1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+C Octet 52 : Power of 10 used to scale climate weight = F, say
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(44),1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+C Octets 53-56 : Climate weight * 10**F, stored as an integer
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(45),1,KBITS,32,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 3 . Handle climate month descriptions
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C Octets 57-59 : First month used to build climate month 1, YYYYMM
+C Octets 60-62 : Last month used to build climate month 1, YYYYMM
+C Octets 63-65 : First month used to build climate month 2, YYYYMM
+C Octets 66-68 : Last month used to build climate month 2, YYYYMM
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(46),1,KBITS,24,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(47),1,KBITS,24,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(48),1,KBITS,24,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(49),1,KBITS,24,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+C Handle padding for unused bytes
+C
+ IF( LENCODE ) THEN
+ DO ILOOPO = 69, 80
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ ENDDO
+C
+ ELSE
+ KNSPT = KNSPT + 8*12
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 4 . Handle length of section 1
+C ------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ LENS1 = 80
+C
+ IF( LENCODE ) THEN
+ CALL INXBIT(KGRIB,KLENG,IPLEN,LENS1,1,KBITS,24,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+ ELSE
+C
+C If decoding, use length of section 1 to step KNSPT pointer
+C past section 1, past any padding slots if any.
+C
+ CALL INXBIT(KGRIB,KLENG,IPLEN,LENS1,1,KBITS,24,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ KNSPT = 8*8 + LENS1*8
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 9 . Abort/return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF( (IRET.EQ.0).AND.(KRET.NE.0) ) THEN
+ CALL ABORTX ('ECDEF19')
+ ELSE
+ RETURN
+ ENDIF
+C
+ 9004 FORMAT (' ECDEF19: Error reported by routine INXBIT.')
+C
+ END
diff --git a/gribex/ecdef19.h b/gribex/ecdef19.h
new file mode 100755
index 0000000..715b737
--- /dev/null
+++ b/gribex/ecdef19.h
@@ -0,0 +1,57 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 19.
+C EFI - Extreme forecast index
+C ------------------------------------
+C
+C GRIB code
+C KSEC1(NN) section 1
+C octet(s)
+C --------- ---------
+C
+C 37 41 ECMWF local GRIB use definition identifier
+C = 19 = EFI, extreme forecast index
+C
+C 38 42 Class: 1 = Operations
+C
+C 39 43 Type : 27 = extreme forecast index
+C 28 = extreme forecast index control
+C
+C 40 44-45 Stream: 1035 = Ensemble Forecast
+C
+C 41 46-49 Expver: Version number/experiment identifier.
+C (4 Ascii characters, right justified)
+C
+C 42 50 Zero, for compatibility with MARS labelling.
+C
+C 43 51 Ensemble size (0 - 255)
+C
+C 44 52 Power of 10 used to scale climate weight = F, say.
+C
+C 45 53-56 Weight * 10**F applied to climate month 1,
+C stored as an integer
+C
+C 46 57-59 First month used to build climate month 1, YYYYMM
+C
+C 47 60-62 Last month used to build climate month 1, YYYYMM
+C
+C 48 63-65 First month used to build climate month 2, YYYYMM
+C
+C 49 66-68 Last month used to build climate month 2, YYYYMM
+C
+C - 69-80 Set to zero.
+C
+C
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef2.F b/gribex/ecdef2.F
new file mode 100755
index 0000000..ab7ac65
--- /dev/null
+++ b/gribex/ecdef2.F
@@ -0,0 +1,299 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF2( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS,
+ X KPR, KRET)
+C
+C---->
+C**** ECDEF2
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 2.
+C (Extensions for clusters).
+C
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF2( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KLENG - Length (words) of KGRIB.
+C
+C KNSPT - Bit number after which insertion/extraction starts.
+C
+C KBITS - Number of bits in computer word.
+C
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C
+C KGRIB - Array containing Grib coded data.(Updated)
+C
+C KNSPT - Number of bit after last one inserted/extracted.(Updated)
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 2.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT
+C ABORTX
+C CSGNBT
+C DSGNBT
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+C Adapted from ECLOC1.F - simplified to handle just definition 2.
+#include "ecdef2.h"
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 18th January 1995
+C
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+ INTEGER IRET, IZERO, INSPT
+C
+ INTEGER ILALO
+ DIMENSION ILALO(8)
+C
+ LOGICAL LENCODE, LDECODE
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = ( HFUNC .EQ. 'C' )
+ LDECODE = .NOT. LENCODE
+C
+C ------------------------------------------------------------------
+C* Section 2 . Extensions for clusters (definition 2).
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF( KPR.GE.1 ) WRITE(GRPRSM,*) 'ECDEF2 : Section 2.'
+C
+C* Octet 50 : Cluster number.
+C Octet 51 : Total number of clusters.
+C Two 8 bit fields.
+C
+C Insert/extract fields.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,KSEC1(42),2,KBITS, 8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+C
+C* Octet 52 : Reserved
+C Set to 0.
+C
+ IF ( LENCODE ) THEN
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT, IZERO,1,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ ELSE
+ KNSPT = KNSPT + 8
+ ENDIF
+C
+C* Octet 53 : Clustering method.
+C One 8 bit field.
+C
+C Insert/extract field.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,KSEC1(44),1,KBITS, 8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+C
+C* Octets 54-55 : Start timestep when clustering.
+C Octets 56-57 : End timestep when clustering.
+C Two 16 bit fields.
+C
+C Insert/extract fields.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,KSEC1(45),2,KBITS, 16,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+C
+C* Octets 58-60 : Northern latitude of domain of clustering
+C Octets 61-63 : Western longitude of domain of clustering
+C Octets 64-66 : Southern latitude of domain of clustering
+C Octets 67-69 : Eastern longitude of domain of clustering
+C Four 24 bit fields.
+C
+C When coding values, set sign bit to 1, if value is negative.
+C
+ IF ( LENCODE ) THEN
+ CALL CSGNBT( ILALO(1), KSEC1(47), 24, KRET)
+ CALL CSGNBT( ILALO(2), KSEC1(48), 24, KRET)
+ CALL CSGNBT( ILALO(3), KSEC1(49), 24, KRET)
+ CALL CSGNBT( ILALO(4), KSEC1(50), 24, KRET)
+ ENDIF
+C
+C Insert/extract fields.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,ILALO(1),4,KBITS, 24,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+C
+C When decoding values, if sign bit is 1, value is
+C negative.
+C
+ IF ( LDECODE ) THEN
+ CALL DSGNBT( KSEC1(47), ILALO(1), 24, KRET)
+ CALL DSGNBT( KSEC1(48), ILALO(2), 24, KRET)
+ CALL DSGNBT( KSEC1(49), ILALO(3), 24, KRET)
+ CALL DSGNBT( KSEC1(50), ILALO(4), 24, KRET)
+ ENDIF
+C
+C* Octet 70 : Number of cluster to which operational forecast
+C belongs.
+C Octet 71 : Number of cluster to which control forecast
+C belongs.
+C Octet 72 : Number of forecasts belonging to the cluster.
+C Three 8 bit fields.
+C
+C Insert/extract fields.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,KSEC1(51),3,KBITS, 8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+C
+C* The number of forecasts belonging to a cluster may vary,
+C but section 1 is kept a fixed length.
+C
+ INSPT = KNSPT + 2048
+C
+C* Octets 73-328 : List of N ensemble forecast numbers.
+C KSEC1(53) 8 bit fields.
+C
+C Insert/extract fields.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,KSEC1(54),KSEC1(53),KBITS,
+ X 8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+C
+ KNSPT = INSPT
+C
+ GOTO 900
+C
+C ------------------------------------------------------------------
+C* Section 9 . Abort/return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) THEN
+ WRITE(GRPRSM,*) 'ECDEF2 : Section 9.'
+ WRITE(GRPRSM,*) ' Output values set -'
+ WRITE(GRPRSM,9003) KNSPT
+ ENDIF
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF (IRET.EQ.0.AND.KRET.NE.0) THEN
+ CALL ABORTX ('ECDEF2')
+ ELSE
+ RETURN
+ ENDIF
+C
+ 9003 FORMAT (1H ,' KNSPT = ',I12)
+C
+ 9004 FORMAT (' ECDEF2: Error reported by routine INXBIT.')
+C
+ END
diff --git a/gribex/ecdef2.h b/gribex/ecdef2.h
new file mode 100755
index 0000000..3913701
--- /dev/null
+++ b/gribex/ecdef2.h
@@ -0,0 +1,53 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 2.
+C Cluster means and standard deviations.
+C ----------------------------------
+C
+C Words 38-41 as for definition 1.
+C
+C 42 Number : Cluster number.
+C
+C 43 Total : Total number of clusters.
+C
+C 44 Clustering method :-
+C 1 - Maximum linkage method
+C 2 - Mixed method
+C 3 - Small linkage method
+C
+C 45 Start time step considered when clustering
+C (Same units of time as forecast timesteps)
+C
+C 46 End time step considered when clustering
+C (Same units of time as forecast timesteps)
+C
+C 47 Northern latitude of domain of clustering
+C 48 Western longitude of domain of clustering
+C 49 Southern latitude of domain of clustering
+C 50 Eastern longitude of domain of clustering
+C (See Notes 1-4 below)
+C
+C 51 : Number of cluster to which operational
+C forecast belongs.
+C
+C 52 : Number of cluster to which control
+C forecast belongs.
+C
+C 53 N : Number of forecasts belonging to
+C the cluster , including the
+C control forecast.
+C
+C 54-53+N : List of N ensemble forecast numbers.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef21.h b/gribex/ecdef21.h
new file mode 100755
index 0000000..f953acb
--- /dev/null
+++ b/gribex/ecdef21.h
@@ -0,0 +1,114 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 21.
+C Sensitive area predictions
+C -----------------------------------
+C
+C Octet KSEC1(n)
+C ----- --------
+C
+C 42 38 Class
+C
+C 43 39 Type
+C
+C 44-45 40 Stream
+C
+C 46-49 41 Expver
+C
+C 50-51 42 Forecast number or singular vector number. Zero for
+C analysis.
+C
+C
+C If type = 60 (perturbed analysis):
+C
+C 52-93 43-57 Set to zero.
+C
+C
+C For other types, the area definition (octets 58 to 77) should always be
+C coded. Other octets from 53 to 93 may be coded as zeroes.
+C
+C Allowed ranges are [-90,90] for latitudes and [0,360] for longitudes.
+C
+C
+C 52-53 43 Number of iterations.
+C
+C 54-55 44 Number of singular vectors computed.
+C
+C 56 45 Norm used at initial time.
+C
+C 57 46 Norm used at final time.
+C
+C 58-61 47 Multiplication factor to convert latitude/longitude
+C and accuracy from real to integer.
+C
+C 62-65 48 Latitude in degrees of north-west corner of forecast
+C verification area multiplied by KSEC1(47).
+C
+C 66-69 49 Longitude in degrees of north-west corner of forecast
+C verification area multiplied by KSEC1(47).
+C
+C 70-73 50 Latitude in degrees of south-east corner of forecast
+C verification area multiplied by KSEC1(47).
+C
+C 74-77 51 Longitude in degrees of south-east corner of forecast
+C verification area multiplied by KSEC1(47).
+C
+C 78-81 52 Accuracy multiplied by KSEC1(47).
+C
+C 82-83 53 Number of singular vectors evolved.
+C
+C 84-91 54-55 Ritz numbers.
+C Given ritz, then:
+C KSEC1(54) = NINT( LOG10(RITZ)-5 )
+C KSEC1(55) = NINT( RITZ/ EXP(LOG(10.0)*KSEC1(54) ) )
+C Thus:
+C RITZ = KSEC1(55)*EXP( LOG(10.0)*KSEC1(54) )
+C
+C 92 56 For all types, this is the period in hours between
+C the time when the targeted observations are taken
+C (the reference time in KSEC1(10:14)) and the forecast
+C verification time.
+C For singular vectors, this is the optimisation time.
+C
+C 93 57 Forecast lead time (hours)
+C For all types, this is the lead time of forecast(s)
+C on which sensitive area prediction is based. The lead
+C time is the time from the initialization of the
+C forecast to the reference time in KSEC1(10:14).
+C
+C 94 58 WMO identifier of the centre from which the data
+C originated
+C
+C 95-96 59 Method number
+C
+C 97-98 60 Total number of forecasts in ensemble (or zero if
+C not appropriate).
+C
+C 99 61 Shape of verification region:
+C 0: lat-lon box as given by KSEC1(48-51)
+C 1: circular region with centre at
+C latitude = 0.5*(KSEC1(48)+KSEC1(50))/KSEC1(47) (deg)
+C longitude = 0.5*(KSEC1(49)+KSEC1(51))/KSEC1(47) (deg)
+C and with
+C radius = 0.5*(KSEC1(48)-KSEC1(50))/(KSEC1(47)*111.199)
+C = great-circle distance in km
+C
+C This is the largest circle fitting in a lat-lon box
+C defined by KSEC1(48-51).
+
+C
+C 100 Reserved. Set to zero.
+C
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef3.F b/gribex/ecdef3.F
new file mode 100755
index 0000000..0390112
--- /dev/null
+++ b/gribex/ecdef3.F
@@ -0,0 +1,195 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF3( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS,
+ X KPR, KRET)
+C
+C---->
+C**** ECDEF3
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 3.
+C (Satellite image data).
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF3( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KLENG - Length (words) of KGRIB.
+C
+C KNSPT - Bit number after which insertion/extraction starts.
+C
+C KBITS - Number of bits in computer word.
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C
+C KGRIB - Array containing Grib coded data.(Updated)
+C
+C KNSPT - Number of bit after last one inserted/extracted.(Updated)
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 3.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT
+C ABORTX
+C CSGNBT
+C DSGNBT
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+C Adapted from ECLOC1.F - simplified to handle just definition 3.
+#include "ecdef3.h"
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 18th January 1995
+C
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+ INTEGER IRET, IZERO
+C
+ LOGICAL LENCODE
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = ( HFUNC .EQ. 'C' )
+C
+C ------------------------------------------------------------------
+C* Section 2 . Satellite image data, definition 3.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Octet 50 : band number.
+C Octet 51 : function code.
+C Two 8 bit fields.
+C
+C Insert/extract fields.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,KSEC1(42),2,KBITS, 8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+C Octet 52 : Reserved.
+C Set to 0.
+C
+ IF ( LENCODE ) THEN
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ ELSE
+ KNSPT = KNSPT + 8
+ ENDIF
+C
+C
+C ------------------------------------------------------------------
+C* Section 9 . Abort/return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) THEN
+ WRITE(GRPRSM,*) 'ECDEF3 : Section 9.'
+ WRITE(GRPRSM,*) ' Output values set -'
+ WRITE(GRPRSM,9003) KNSPT
+ ENDIF
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF (IRET.EQ.0.AND.KRET.NE.0) THEN
+ CALL ABORTX ('ECDEF3')
+ ELSE
+ RETURN
+ ENDIF
+C
+ 9003 FORMAT (1H ,' KNSPT = ',I12)
+C
+ 9004 FORMAT (' ECDEF3: Error reported by routine INXBIT.')
+C
+ END
diff --git a/gribex/ecdef3.h b/gribex/ecdef3.h
new file mode 100755
index 0000000..b693c64
--- /dev/null
+++ b/gribex/ecdef3.h
@@ -0,0 +1,32 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 3.
+C Satellite image data.
+C ---------------------------------
+C
+C Words 38-41 as for definition 1.
+C
+C 42 Band : 0 = first infrared band
+C 1 = second infrared band
+C 10 = first visible band
+C 20 = water vapour
+C 100+i = ith spectral band
+C
+C 43 Function code : Interpretation of pixel value.
+C 0 = value is pixel value
+C 1 = value is temperatures in degrees K,
+C and is 145 + pixel value.
+C 255 = translation table follows
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef4.F b/gribex/ecdef4.F
new file mode 100755
index 0000000..c88e8c4
--- /dev/null
+++ b/gribex/ecdef4.F
@@ -0,0 +1,492 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF4( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS,
+ X KPLEN, KPR, KRET)
+C
+C---->
+C**** ECDEF4
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use of definition 4.
+C (Ocean extensions).
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF4( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPLEN, KPR, KRET)
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KLENG - Length (words) of KGRIB.
+C
+C KNSPT - Bit number after which insertion/extraction starts.
+C
+C KBITS - Number of bits in computer word.
+C
+C KPLEN - Pointer to field containing length of Section 1.
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C
+C KGRIB - Array containing Grib coded data.(Updated)
+C
+C KNSPT - Number of bit after last one inserted/extracted.(Updated)
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 4.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT
+C ABORTX
+C CSGNBT
+C DSGNBT
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+C Adapted from ECLOC1.F - simplified to handle just definition 4.
+#include "ecdef4.h"
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 18th January 1995
+C
+C Modifications.
+C --------------
+C
+C J.D.Chambers ECMWF Jan 2000
+C Allow single 2-byte ensemble number for stream 1090 (ECMWF
+C ensemble seasonal forecasts)
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0 . Definition of variables. Data statements.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPLEN, KPR, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+C
+ INTEGER IRET, IZERO, ILENS1, INUM, LOOP, IP1, N
+ INTEGER ILALO
+ DIMENSION ILALO(8)
+ LOGICAL LENCODE, LDECODE
+C
+C -----------------------------------------------------------------|
+C* Section 1 . Set initial values.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = ( HFUNC.EQ.'C' )
+ LDECODE = .NOT. LENCODE
+C
+C -----------------------------------------------------------------|
+C* Section 2 . Ocean extensions, definition 4.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( KSEC1(40).EQ.1090 ) THEN
+C
+C If seasonal forecast data ...
+C
+C Octet 50-51 : Forecast number.
+C One 16 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),1,KBITS,16,HFUNC,KRET)
+ IF (KRET.NE.0) GOTO 910
+C
+ IF( LDECODE ) KSEC1(43) = 0
+C
+ ELSE
+C
+C Octet 50 : Ensemble forecast number
+C Octet 51 : Total number of forecasts in ensemble
+C Two 8-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),2,KBITS, 8,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+C
+ ENDIF
+C
+C Octet 52 : Flag showing existence of a post-auxiliary array
+C One 8-bit field.
+C
+ IF( LENCODE ) IP1 = 1
+ CALL INXBIT(KGRIB,KLENG,KNSPT, IP1,1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+C
+C -----------------------------------------------------------------|
+C* Section 3 . Coordinate structure definition.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Octet 53 : Fundamental spatial reference system (Planet flag)
+C Octet 54 : Fundamental time reference
+C Octet 55 : Space unit flag (applies only if lengths NOT
+C otherwise labelled)
+C Octet 56 : Vertical coordinate definition (z)
+C Octet 57 : Horizontal coordinate definition (x,y)
+C Octet 58 : Time unit flag
+C Octet 59 : Time coordinate definition (t)
+C Seven 8-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(44),7,KBITS, 8,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+C
+C -----------------------------------------------------------------|
+C* Section 4 . Mixed coordinates.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C* Position definition.
+C Octet 60 : Mixed coordinate field flag
+C Octet 61 : Coordinate 1 flag (usually time)
+C Octet 62 : Averaging flag
+C Three 8-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(51),3,KBITS, 8,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+C
+C Octets 63 - 66 : Position of level 1
+C Octets 67 - 70 : Position of level 2
+C Two 32-bit fields.
+C
+C When coding data, set sign bit to 1, if value is negative.
+C
+ IF( LENCODE ) THEN
+ CALL CSGNBT( ILALO(1), KSEC1(54), 32, KRET)
+ CALL CSGNBT( ILALO(2), KSEC1(55), 32, KRET)
+ ENDIF
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ILALO(1),2,KBITS, 32,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+C
+C When decoding data, if sign bit is 1, value is negative.
+C
+ IF( LDECODE ) THEN
+ CALL DSGNBT( KSEC1(54), ILALO(1), 32, KRET)
+ CALL DSGNBT( KSEC1(55), ILALO(2), 32, KRET)
+ ENDIF
+C
+C Octet 71 : Coordinate 2 flag (usually z-coordinate)
+C Octet 72 : Averaging flag
+C Two 8-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(56),2,KBITS, 8,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+C
+C Octets 73 - 76 : Position of level 1
+C Octets 77 - 80 : Position of level 2
+C Two 32-bit fields.
+C
+C When coding data, set sign bit to 1, if value is negative.
+C
+ IF( LENCODE ) THEN
+ CALL CSGNBT( ILALO(1), KSEC1(58), 32, KRET)
+ CALL CSGNBT( ILALO(2), KSEC1(59), 32, KRET)
+ ENDIF
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ILALO(1),2,KBITS, 32,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+C
+C When decoding data, if sign bit is 1, value is negative.
+C
+ IF( LDECODE ) THEN
+ CALL DSGNBT( KSEC1(58), ILALO(1), 32, KRET)
+ CALL DSGNBT( KSEC1(59), ILALO(2), 32, KRET)
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 5 . Grid definition.
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+C Octets 81 : Coordinate 3 flag (x-axis, usually longitude)
+C Octets 82 : Coordinate 4 flag (y-axis, usually latitude)
+C Two 8-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(60),2,KBITS, 8,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+C
+C Octets 83 - 86 : Coordinate 4 of first grid point
+C Octets 87 - 90 : Coordinate 3 of first grid point
+C Octets 91 - 94 : Coordinate 4 of last grid point
+C Octets 95 - 98 : Coordinate 3 of last grid point
+C Octets 99 - 102 : i-increment
+C Octets 103 - 106 : j-increment
+C Six 32-bit fields.
+C
+C When coding data, set sign bit to 1, if value is negative.
+C
+ IF( LENCODE ) THEN
+ CALL CSGNBT( ILALO(1), KSEC1(62), 32, KRET)
+ CALL CSGNBT( ILALO(2), KSEC1(63), 32, KRET)
+ CALL CSGNBT( ILALO(3), KSEC1(64), 32, KRET)
+ CALL CSGNBT( ILALO(4), KSEC1(65), 32, KRET)
+ CALL CSGNBT( ILALO(5), KSEC1(66), 32, KRET)
+ CALL CSGNBT( ILALO(6), KSEC1(67), 32, KRET)
+ ENDIF
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ILALO(1),6,KBITS, 32,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+C
+C When decoding data, if sign bit is 1, value is negative.
+C
+ IF( LDECODE ) THEN
+ CALL DSGNBT( KSEC1(62), ILALO(1), 32, KRET)
+ CALL DSGNBT( KSEC1(63), ILALO(2), 32, KRET)
+ CALL DSGNBT( KSEC1(64), ILALO(3), 32, KRET)
+ CALL DSGNBT( KSEC1(65), ILALO(4), 32, KRET)
+ CALL DSGNBT( KSEC1(66), ILALO(5), 32, KRET)
+ CALL DSGNBT( KSEC1(67), ILALO(6), 32, KRET)
+ ENDIF
+C
+C
+C Octet 107 : Flag for irregular grid coordinate list
+C Octet 108 : Flag for normal or staggered grid
+C Two 8-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(68),2,KBITS, 8,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+C
+C -----------------------------------------------------------------|
+C* Section 6 . Auxiliary information.
+C -----------------------------------------------------------------|
+C
+ 600 CONTINUE
+C
+C Octet 109 : Flag for any further information
+C One 8-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(70),1,KBITS, 8,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+C
+C* Auxiliary information.
+C
+C Octet 110 : Number of entries in horizontal coordinate
+C definition supplement.
+C One 8-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(71),1,KBITS, 8,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+C
+C Octets 111 - 112 : Number of entries in mixed coordinate
+C definition.
+C Octets 113 - 114 : Number of entries in grid coordinate list
+C Octets 115 - 116 : Number of entries in auxiliary array
+C Three 16-bit fields .
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(72),3,KBITS, 16,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+C
+C At this point length of Section 1 of Grib code is 116 octets.
+C
+ ILENS1 = 116
+ INUM = 75
+C
+C -----------------------------------------------------------------|
+C* Section 7 . (Optional) Supplements.
+C -----------------------------------------------------------------|
+C
+ 700 CONTINUE
+C
+C Horizontal coordinate supplement.
+C
+ DO LOOP = 1, KSEC1(71)
+C
+C KSEC1(71) 32-bit fields.
+C
+C When coding values, set sign bit to 1, if value is negative.
+C
+ IF( LENCODE ) CALL CSGNBT( ILALO(1), KSEC1(INUM), 32, KRET)
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ILALO(1),1,KBITS,32, HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+C
+C When decoding values, if sign bit is 1, value is negative.
+C
+ IF( LDECODE ) CALL DSGNBT( KSEC1(INUM), ILALO(1), 32, KRET)
+ ILENS1 = ILENS1 + 4
+ INUM = INUM + 1
+C
+ ENDDO
+C
+C Mixed coordinate definition.
+C
+ DO LOOP = 1, KSEC1(72)
+C
+C KSEC1(72) 32-bit fields.
+C
+C When coding values, set sign bit to 1, if value is negative.
+C
+ IF( LENCODE ) CALL CSGNBT( ILALO(1), KSEC1(INUM), 32, KRET)
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ILALO(1),1,KBITS, 32,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+C
+C When decoding values, if sign bit is 1, value is negative.
+C
+ IF( LDECODE ) CALL DSGNBT( KSEC1(INUM), ILALO(1), 32, KRET)
+ ILENS1 = ILENS1 + 4
+ INUM = INUM + 1
+C
+ ENDDO
+C
+C Grid coordinate list.
+C
+ DO LOOP = 1, KSEC1(73)
+C
+C KSEC1(73) 32-bit fields.
+C
+C When coding values, set sign bit to 1, if value is negative.
+C
+ IF( LENCODE ) CALL CSGNBT( ILALO(1), KSEC1(INUM), 32, KRET)
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ILALO(1),1,KBITS, 32,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+C
+C When decoding values, if sign bit is 1, value is negative.
+C
+ IF( LDECODE ) CALL DSGNBT( KSEC1(INUM), ILALO(1), 32, KRET)
+ ILENS1 = ILENS1 + 4
+ INUM = INUM + 1
+C
+ ENDDO
+C
+C Auxiliary array.
+C
+ IF( KSEC1(74).NE.0 ) THEN
+C
+C KSEC1(74) 32-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(INUM),KSEC1(74),KBITS,
+ X 32,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+ ILENS1 = ILENS1 + 4 * KSEC1(74)
+ INUM = INUM + KSEC1(74)
+ ENDIF
+C
+C Post-auxiliary array.
+C
+ IF( IP1.EQ.1 ) THEN
+C
+C Integer count, N say, followed by (N-1) 32-bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(INUM),1,KBITS,
+ X 32,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+ N = KSEC1(INUM)
+ IF( N.GT.1 ) THEN
+ INUM = INUM + 1
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(INUM),(N-1),KBITS,
+ X 32,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+ ILENS1 = ILENS1 + 4 * N
+ INUM = INUM + N - 1
+ ELSE
+ KSEC1(INUM) = 0
+ ILENS1 = ILENS1 + 4
+ KNSPT = KNSPT + 32
+ ENDIF
+ ELSE
+ KSEC1(INUM) = 0
+ ENDIF
+C
+C* Insert length of section 1, if coding data.
+C One 24-bit field.
+C
+ IF( LENCODE ) THEN
+ CALL INXBIT(KGRIB,KLENG,KPLEN,ILENS1,1,KBITS, 24,HFUNC,KRET)
+ IF( KRET.NE.0 ) GOTO 910
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9 . Abort/return to calling routine.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 )
+ X WRITE(GRPRSM,*) 'ECDEF4: Section 9. On output, KNSPT = ',KNSPT
+C
+ RETURN
+C
+ 910 CONTINUE
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF4: Error reported by routine INXBIT.'
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF( IRET.EQ.0.AND.KRET.NE.0 ) THEN
+ CALL ABORTX ('ECDEF4')
+ ELSE
+ RETURN
+ ENDIF
+C
+ END
diff --git a/gribex/ecdef4.h b/gribex/ecdef4.h
new file mode 100755
index 0000000..853e478
--- /dev/null
+++ b/gribex/ecdef4.h
@@ -0,0 +1,271 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 4.
+C Ocean model data.
+C ----------------------------------
+C
+C For use in storing ocean model data within the GRIB framework.
+C T.Stockdale, 17 May 1993
+C
+C Numbers given are words of KSEC1
+C
+C
+C Standard ECMWF supplementary data (as per local use definition 1)
+C for words 38-41 ie
+C
+C 38 Class (ops/research)
+C 39 Type (analysis/forecast/etc)
+C 40 Stream
+C 41 Expver (expt identifier)
+C
+C 42 Ensemble forecast number
+C 43 Total number of forecasts in ensemble
+C
+C If stream = 1090 (ECMWF ensemble seasonal forecasts),
+C 42 Ensemble forecast number
+C 43 0
+C
+C Data specific to ocean model requirements
+C
+C ** A separate version of code table 2 is used for ocean data
+C ECMWF local Code Table 2, Version Number 150 for FM92-VIII
+C
+C ** Note that all coordinates in this local use GRIB definition are
+C given as 4-byte integers in the following units:
+C
+C Latitudes/longitudes: microdegrees
+C Distance (general): metres (default: can be changed)
+C Time: seconds (default: can be changed)
+C
+C Depth below sea level: millimetres (positive downwards)
+C Isopycnic level: (potential density - 1000)*1.0E6
+C
+C ** Permitted range of values is -2.147E9 < i < 2.147E9 approx.
+C
+C ** At several points in the definition, there is a potential need
+C for a variable amount of supplementary data. This is indicated
+C with '(+INFO)', and in such cases a supplementary data block is
+C specified at the end of the local use section.
+C
+C
+C 1. Coordinate structure definition
+C
+C The physical meaning of the (x,y,z,t) coordinate system is
+C defined here.
+C
+C 44 Fundamental spatial reference system (Planet flag)
+C 0 = Earth (centre/north pole/Greenwich)
+C 200 = Geocentric RA/dec
+C 201 = Heliocentric coordinates
+C 255 = Unspecified
+C
+C 45 Fundamental time reference
+C 0 = Reference time given in standard GRIB header
+C (use for forecasts to indicate start of prediction)
+C 1 = C.E. (ie 0 AD)
+C 2 = Julian Day number = 0.0
+C 100 = Zero at start of arbitrary expt
+C 255 = Unspecified
+C
+C 46 Space unit flag (applies only if lengths NOT otherwise
+C labelled)
+C 0 = metres
+C i<128 = 10**i metres
+C i>128 = 10**(i-256) metres
+C
+C 47 Vertical coordinate definition (z)
+C 0 = z above origin
+C 1 = R from origin
+C 2 = h above mean sea level geopotential
+C 3 = h above ground surface
+C 160 = geopotential depth below mean sea level (mm)
+C 161 = ocean isopycnic surface (pot. dens.: see above)
+C
+C 48 Horizontal coordinate definition (x,y)
+C 0 = latitude/longitude (microdegrees)
+C 1 = cartesian (fundamental origin)
+C 2 = cartesian (shifted,rotated origin) (+INFO)
+C 3 = regular gaussian grid (microdegrees) (+INFO)
+C 4 = polar stereographic (+INFO)
+C 5 = spherical harmonic coefficients (integers) (+INFO)
+C
+C 49 Time unit flag
+C 0 = seconds
+C 1 = minutes
+C 2 = hours
+C 3 = days
+C 4 = years
+C 5<i<128 = 10**(i-4) years
+C i>128 = 10**(i-256) seconds
+C
+C 50 Time coordinate definition (t)
+C 0 = real earth time (UTC)
+C 1 = ideal earth time (360 * 86400s days per year)
+C
+C 2. Position definition
+C
+C A 2-dimensional field located in 4-dimensional space-time needs
+C 2 coordinates to define where the field is located, and 2
+C coordinates internal to the field. The locating coordinates are
+C specified first. Each coordinate is identified according to the
+C following table, and should be in this order where possible:
+C
+C 1 t
+C 2 z
+C 3 x
+C 4 y
+C
+C It is possible to specify mixed coordinates, to allow sections
+C at angles to the coordinate system.
+C
+C 51 Mixed coordinate field flag
+C 0 = No mixed coordinates
+C 1 = x,y coordinates mixed (+INFO)
+C 2 = x,z coordinates mixed (+INFO)
+C 3 = y,z coordinates mixed (+INFO)
+C 4 = x,t coordinates mixed (+INFO)
+C 5 = y,t coordinates mixed (+INFO)
+C 6 = z,t coordinates mixed (+INFO)
+C
+C
+C Now define the location of the 2-dimensional field:
+C
+C 52 Coordinate 1 flag (usually time)
+C 53 Averaging flag
+C 0 = no averaging (data on/at level 1)
+C 1 = inclusive average between level 1 and 2
+C 2 = exclusive average between level 1 and 2
+C 54 Position of level 1 (4 byte integer)
+C 55 Position of level 2 (4 byte integer) (or zero if not used)
+C
+C 56 Coordinate 2 flag (usually z-coordinate)
+C 57 Averaging flag
+C 0 = no averaging (data on/at level 1)
+C 1 = inclusive average between level 1 and 2
+C 2 = exclusive average between level 1 and 2
+C 58 Position of level 1 (4 byte integer)
+C 59 Position of level 2 (4 byte integer) (or zero if not used)
+C
+C An inclusive average discards land points when calculating the
+C average, and will produce a value where there is at least one
+C valid ocean point. An exclusive average will only produce a
+C value if all of the points being averaged are valid.
+C
+C
+C 3. Grid definition
+C
+C 60 Coordinate 3 flag (x-axis, usually longitude)
+C 61 Coordinate 4 flag (y-axis, usually latitude)
+C
+C 62 Coordinate 4 of first grid point (4-byte integer)
+C 63 Coordinate 3 of first grid point (4-byte integer)
+C 64 Coordinate 4 of last grid point (4-byte integer)
+C 65 Coordinate 3 of last grid point (4-byte integer)
+C 66 i-increment (also stored as a 4-byte integer)
+C 67 j-increment (also stored as a 4-byte integer)
+C
+C
+C 68 Flag for irregular grid coordinate list
+C 0 = none
+C 1 = x-axis values (typically longitude)
+C 2 = y-axis values (typically latitude)
+C 3 = First x-axis, then y-axis values given
+C 69 Flag for normal or staggered grid
+C 0 = normal grid (all rows have same x-coordinate system)
+C 1 = staggered grid (odd and even rows have different
+C x-coordinate systems, eg Arakawa E grid)
+C
+C 4. Further information
+C
+C 70 Flag for any further information
+C 0 = none
+C 1 = auxiliary array contains x-axis topographic
+C depths/heights
+C
+C 5. Auxiliary information
+C
+C 71 Number of entries in horizontal coordinate definition
+C supplement (1 byte only)
+C 72 Number of entries in mixed coordinate definition (2 bytes)
+C 73 Number of entries in grid coordinate list (2 bytes)
+C 74 Number of entries in auxiliary array (2 bytes)
+C
+C [ 64 bytes fixed ]
+C
+C A. Horizontal coordinate supplement (4-byte integers)
+C
+C A1-nn Not yet defined
+C
+C B. Mixed coordinate definition (4-byte integers)
+C
+C [ For the linear case, assume a transformation of the form
+C x' = alpha * (x - x0) + (1-alpha) * (y - y0) ]
+C
+C B1 Flag for regularity of x-y coordinate mixing
+C 0 = Mixing is regular and linear
+C 1 = Mixing is irregular, code given
+C For regular, linear mixing:
+C B2 Alpha (*1E9)
+C B3 X0
+C B4 Y0
+C Irregular mixing with code given:
+C B2 )
+C B3 ) Locally defined codes to define section
+C B4 )
+C
+C C. Grid coordinate list (4-byte integers)
+C
+C C1-nn Coordinates of irregular x and y-axes. The x-axis is
+C given first, then the second x-axis (if staggered grid),
+C and then the y-axis. If the x-axis is regular but
+C staggered, then the longitude of the first point of the
+C second row should be specified as the first entry of this
+C list.
+C
+C D. Auxiliary array (4-byte integers)
+C
+C D1-nn Auxiliary array values
+C
+C E. Post-auxiliary array (4-byte integers)
+C
+C P0-n Post-auxiliary array values
+C
+C P0 - Count of items in post-auxiliary array
+C ( = n+1, including the count)
+C P1 - First item.
+C P2 - Second item.
+C " - "
+C Pn - nth item.
+C
+C
+C Comments on the setting of other GRIB parameters:
+C
+C The time and time-range data should be set properly in the main
+C section, if possible.
+C
+C The indicator of type of level should be set to 160 (depth below
+C sea level) for all oceanographic data. The depth in metres
+C should be set to the appropriate value if the field is a
+C horizontal section, and to zero in all other cases.
+C
+C It is assumed that the grid description section of the GRIB code
+C is set for a latitude/longitude grid, with correct values for
+C the number of points along parallels/meridians and the
+C coordinates of the first and last data points in millidegrees
+C (or the appropriate units from this section, divided by 1000).
+C The coordinate increments should be given to the extent that
+C the field is regular.
+C
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef5.F b/gribex/ecdef5.F
new file mode 100755
index 0000000..99ff908
--- /dev/null
+++ b/gribex/ecdef5.F
@@ -0,0 +1,320 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF5( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS,
+ X KPR, KRET)
+C
+C---->
+C**** ECDEF5
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 5.
+C (Extensions for forecast probabilities).
+C
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF5( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KLENG - Length (words) of KGRIB.
+C
+C KNSPT - Bit number after which insertion/extraction starts.
+C
+C KBITS - Number of bits in computer word.
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C
+C KGRIB - Array containing Grib coded data.(Updated)
+C
+C KNSPT - Number of bit after last one inserted/extracted.(Updated)
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 1.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT
+C ABORTX
+C CSGNBT
+C DSGNBT
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+C Adapted from ECLOC1.F - simplified to handle just definition 5.
+#include "ecdef5.h"
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 18th January 1995
+C
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+ INTEGER IRET, IZERO, I16BIT
+C
+ INTEGER ILALO
+ DIMENSION ILALO(8)
+C
+ LOGICAL LENCODE, LDECODE
+C
+C 16-bits set to 1
+ DATA I16BIT/ 65535 /
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = ( HFUNC .EQ. 'C' )
+ LDECODE = .NOT. LENCODE
+C
+C ------------------------------------------------------------------
+C* Section 2 . Extensions Forecast probabilities (definition 5).
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C* Octet 50 : Forecast probability number
+C One 8 bit field.
+C
+C Insert/extract field.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,KSEC1(42),1,KBITS, 8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+C
+C* Octet 51 : Total number of forecast probabilities
+C One 8 bit field.
+C
+C Insert/extract field.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,KSEC1(43),1,KBITS, 8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+C
+C* Octet 52 : Threshold units decimal scale factor.
+C One 8 bit field.
+C
+C When coding data, set sign bit to 1 if value is negative:
+ IF ( LENCODE ) CALL CSGNBT( ILALO(1), KSEC1(44), 8, KRET)
+C
+C Insert/extract field.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,ILALO(1),1,KBITS, 8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+C
+C When decoding, use sign bit ( = 1 if value is negative)
+ IF ( LDECODE ) CALL DSGNBT( KSEC1(44), ILALO(1), 8, KRET)
+C
+C Octet 53 : Threshold indicator.
+C One 8 bit field.
+C
+C Insert/extract field.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,KSEC1(45),1,KBITS, 8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+C
+C
+C* Octet 54-55 : Lower threshold.
+C One 16 bit field.
+C
+C Check if lower threshold is present ..
+ IF ( KSEC1(45) .NE. 2 ) THEN
+C
+C When coding data, set sign bit to 1 if value is negative:
+ IF ( LENCODE ) CALL CSGNBT( ILALO(1), KSEC1(46), 16, KRET)
+C
+C Insert/extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ILALO(1),1,KBITS,16,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+C
+C When decoding, use sign bit ( = 1 if value is negative)
+ IF ( LDECODE ) CALL DSGNBT( KSEC1(46), ILALO(1), 16, KRET)
+C
+C .. if not present, set value to 16 bits all set to 1
+ ELSE
+ IF ( LENCODE ) THEN
+ I16BIT = 65535
+ CALL INXBIT(KGRIB,KLENG,KNSPT,I16BIT,1,KBITS,16,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+ ELSE
+ I16BIT = 65535
+ KSEC1(46) = I16BIT
+ KNSPT = KNSPT + 16
+ ENDIF
+ ENDIF
+C
+C Octet 56-57 : Upper threshold.
+C One 16 bit field.
+C
+C Check if upper threshold is present ..
+ IF ( KSEC1(45) .NE. 1 ) THEN
+C
+C When coding data, set sign bit to 1 if value is negative:
+ IF ( LENCODE ) CALL CSGNBT( ILALO(1), KSEC1(47), 16, KRET)
+C
+C Insert/extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ILALO(1),1,KBITS,16,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+C
+C When decoding, use sign bit ( = 1 if value is negative)
+ IF ( LDECODE ) CALL DSGNBT( KSEC1(47), ILALO(1), 16, KRET)
+C
+ ELSE
+ IF ( LENCODE ) THEN
+ I16BIT = 65535
+ CALL INXBIT(KGRIB,KLENG,KNSPT,I16BIT,1,KBITS,16,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+ ELSE
+ I16BIT = 65535
+ KSEC1(47) = I16BIT
+ KNSPT = KNSPT + 16
+ ENDIF
+ ENDIF
+C
+C
+C Octet 58 : Reserved - set to zero.
+C One 8 bit field.
+C
+C Insert/extract field.
+ IZERO = 0
+ CALL INXBIT (KGRIB,KLENG,KNSPT, IZERO ,1,KBITS, 8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 9 . Abort/return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) THEN
+ WRITE(GRPRSM,*) 'ECDEF5 : Section 9.'
+ WRITE(GRPRSM,*) ' Output values set -'
+ WRITE(GRPRSM,9003) KNSPT
+ ENDIF
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF (IRET.EQ.0.AND.KRET.NE.0) THEN
+ CALL ABORTX ('ECDEF5')
+ ELSE
+ RETURN
+ ENDIF
+C
+ 9003 FORMAT (1H ,' KNSPT = ',I12)
+C
+ 9004 FORMAT (' ECDEF5: Error reported by routine INXBIT.')
+C
+ END
diff --git a/gribex/ecdef5.h b/gribex/ecdef5.h
new file mode 100755
index 0000000..5d50976
--- /dev/null
+++ b/gribex/ecdef5.h
@@ -0,0 +1,41 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 5.
+C Forecast probability data.
+C ----------------------------------
+C
+C
+C Words 38-41 as for definition 1.
+C Word 39 = 16 to indicate forecast probabilities.
+C
+C 42 Forecast probability number
+C
+C 43 Total number of forecast probabilities
+C
+C 44 Threshold units decimal scale factor:
+C +/- power of 10 (or zero)
+C top bit = 1 for negative values
+C
+C 45 Threshold indicator:
+C 1 = only lower threshold present
+C 2 = only upper threshold present
+C 3 = both upper and lower thresholds
+C present
+C
+C 46 Lower threshold value
+C
+C 47 Upper threshold value
+C
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef50.F b/gribex/ecdef50.F
new file mode 100755
index 0000000..1b4ee16
--- /dev/null
+++ b/gribex/ecdef50.F
@@ -0,0 +1,230 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF50(HFUNC,KSEC1,KGRIB,KLENG,KNSPT,KBITS,KRET)
+C
+C---->
+C**** ECDEF50
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 50.
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF50(HFUNC,KSEC1,KGRIB,KLENG,KNSPT,KBITS,KRET)
+C
+C
+C Input
+C -----
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C KSEC1 - Array containing Grib Section 1 data.
+C KGRIB - Array containing Grib coded data.
+C KLENG - Length (words) of KGRIB.
+C KNSPT - Bit number after which insertion/extraction starts.
+C KBITS - Number of bits in computer word.
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output
+C ------
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C KGRIB - Array containing Grib coded data.(Updated)
+C KNSPT - Number of bit after last one inserted/extracted.
+C (Updated)
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C
+C Method.
+C -------
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 50.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT - insert/extract bits
+C ABORTX - abort the program
+C CSGNBT - code a signed value
+C DSGNBT - decode a signed value
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+#include "ecdef50.h"
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF December 2001
+C
+C
+C Modifications.
+C --------------
+C
+C None
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0 . Definition of variables. Data statements.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+C
+ INTEGER IRET, IZERO, JLOOP, ITEMP, IRETA
+C
+ LOGICAL LENCODE, LDECODE
+C
+C -----------------------------------------------------------------|
+C* Section 1 . Set initial values.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = ( HFUNC.EQ.'C' )
+ LDECODE = .NOT. LENCODE
+C
+C -----------------------------------------------------------------|
+C* Section 2 . Handle the local extension
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Octet 50 : Number
+C Octet 51 : Total
+C Octet 52 : Model identifier
+C Three 8 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),3,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(*,*) 'ECDEF50: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(*,*) ' encoding section 1, elements 42 - 44.'
+ ELSE
+ WRITE(*,*) ' decoding section 1, octets 50 - 52.'
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C Octets 53-56: Latitude of North-west corner of area
+C Octets 57-60: Longitude of North-west corner of area
+C Octets 61-64: Latitude of South-east corner of area
+C Octets 65-68: Longitude of South-east corner of area
+C Four 32 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(45),4,KBITS,32,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(*,*) 'ECDEF50: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(*,*) ' encoding section 1, elements 45 - 48.'
+ ELSE
+ WRITE(*,*) ' decoding section 1, octets 53 - 68.'
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C Octets 69-116 : Reserved for ECMWF additions.
+C Octet 69 : Original parameter number
+C Octet 70 : Original parameter table number
+C Octets 71-116 : Reserved for ECMWF additions.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(49),2,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(*,*) 'ECDEF50: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(*,*) ' encoding section 1, elements 49 - 50.'
+ ELSE
+ WRITE(*,*) ' decoding section 1, octets 69 - 70.'
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+ IF( LENCODE ) THEN
+ DO JLOOP = 71, 116
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(*,*) 'ECDEF50: Error reported by routine INXBIT:'
+ WRITE(*,*) ' encoding section 1, octets 71 - 116'
+ GOTO 900
+ ENDIF
+ ENDDO
+ ELSE
+ DO JLOOP = 51, 60
+ KSEC1(JLOOP) = 0
+ ENDDO
+ KNSPT = KNSPT + 46*8
+ ENDIF
+C
+C Octets 117-300 : Optional data.
+C Forty-six 32 bit fields.
+C
+ DO JLOOP = 61, 106
+ CALL INXBIT(
+ X KGRIB,KLENG,KNSPT,KSEC1(JLOOP),1,KBITS,32,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(*,*) 'ECDEF50: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(*,*) ' encoding section 1, elements 61 - 106.'
+ ELSE
+ WRITE(*,*) ' decoding section 1, octets 117 - 300.'
+ ENDIF
+ GOTO 900
+ ENDIF
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 9 . Abort/return to calling routine. Format statements.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF( (IRET.EQ.0).AND.(KRET.NE.0) ) THEN
+ CALL ABORTX('ECDEF50')
+ ELSE
+ RETURN
+ ENDIF
+C
+ END
diff --git a/gribex/ecdef50.h b/gribex/ecdef50.h
new file mode 100755
index 0000000..a84f3a7
--- /dev/null
+++ b/gribex/ecdef50.h
@@ -0,0 +1,76 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 50.
+C Member State data.
+C ------------------
+C
+C Octet KSEC1(n)
+C ----- --------
+C
+C 5 2 Originating centre (WMO identifier)
+C
+C 26 22 Sub-centre identifier (= 98)
+C
+C ** 24 Flag field to indicate local use in Section 1 (= 1)
+C
+C 41 37 ECMWF local GRIB use definition identifier (= 50)
+C
+C 42 38 Class
+C
+C 43 39 Type
+C
+C 44-45 40 Stream
+C
+C 46-49 41 Version number/experiment identifier.
+C (4 Ascii characters, right justified)
+C
+C 50 42 Number : Ensemble forecast number.
+C Control forecast is number 0,
+C perturbed forecasts 1-nn.
+C Set to 0 if not ensemble forecast.
+C
+C 51 43 Total : Total number of forecasts in ensemble.
+C This number includes the control forecast.
+C Set to 0 if not ensemble forecast.
+C
+C 52 44 Model identifier (in range 1 - 255)
+C
+C 53-56 45 Latitude of North-west corner of area (degrees*10^6)
+C
+C 57-60 46 Longitude of North-west corner of area (degrees*10^6)
+C
+C 61-64 47 Latitude of South-east corner of area (degrees*10^6)
+C
+C 65-68 48 Longitude of South-east corner of area (degrees*10^6)
+C
+C -----------------------------------------------------------------|
+C
+C 69-116 49-60 Reserved for ECMWF additions.
+C
+C 69 49 Original parameter number
+C
+C 70 50 Original parameter table number
+C
+C 71-116 51-60 Set to zero
+C
+C -----------------------------------------------------------------|
+C
+C 117-300 61-106 Optional data.
+C
+C -----------------------------------------------------------------|
+C
+C ** Not stored in GRIB message.
+C
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef6.F b/gribex/ecdef6.F
new file mode 100755
index 0000000..839f36f
--- /dev/null
+++ b/gribex/ecdef6.F
@@ -0,0 +1,263 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF6( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS,
+ X KPLEN, KPR, KRET)
+C
+C---->
+C**** ECDEF6
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 1.
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF6( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPLEN,
+C X KPR, KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KLENG - Length (words) of KGRIB.
+C
+C KNSPT - Bit number after which insertion/extraction starts.
+C
+C KBITS - Number of bits in computer word.
+C
+C KPLEN - Pointer to field containing length of Section 1.
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C
+C KGRIB - Array containing Grib coded data.(Updated)
+C
+C KNSPT - Number of bit after last one inserted/extracted.(Updated)
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 1.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT
+C ABORTX
+C CSGNBT
+C DSGNBT
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+C Adapted from ECLOC1.F - simplified to handle just definition 1.
+#include "ecdef6.h"
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 27th February 1996
+C
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPLEN, KPR, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+ INTEGER IRET, IZERO, ILOOP, LENS1, INDATE
+C
+ LOGICAL LENCODE
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = ( HFUNC .EQ. 'C' )
+C
+C ------------------------------------------------------------------
+C* Section 2 . Handle definition 1.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Octet 50-51 :Reserved.
+C Should be 0 !!
+C
+ IF ( LENCODE ) THEN
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO, 1,KBITS, 16,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ ELSE
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),2,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ ENDIF
+C
+C Octet 52-54 : YYMMDD date of the SST field used.
+C
+ IF( LENCODE) THEN
+ INDATE = KSEC1(44)
+ IF( INDATE.GT.19000000 ) INDATE = INDATE - 19000000
+ ENDIF
+ CALL INXBIT(KGRIB,KLENG,KNSPT,INDATE,1,KBITS,24,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ IF( .NOT. LENCODE) THEN
+ IF( (INDATE.LT.19000000).AND.(INDATE.GT.100) )
+ X INDATE = INDATE + 19000000
+ KSEC1(44) = INDATE
+ ENDIF
+C
+C Octet 55 : Type of SST field used.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(45), 1,KBITS, 8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+C Octet 56 : Count of ICE fields used (n, say).
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(46), 1,KBITS, 8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+C Octet 57->54+(n*4) : YYMMDD dates and satellite numbers of the
+C ICE fields used.
+C
+ DO 210 ILOOP = 1, KSEC1(46)
+C
+C YYMMDD date.
+ IF( LENCODE) THEN
+ INDATE = KSEC1(45+(ILOOP*2))
+ IF( INDATE.GT.19000000 ) INDATE = INDATE - 19000000
+ ENDIF
+ CALL INXBIT(KGRIB,KLENG,KNSPT,INDATE,1,KBITS,24,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ IF( .NOT. LENCODE) THEN
+ IF( (INDATE.LT.19000000).AND.(INDATE.GT.100) )
+ X INDATE = INDATE + 19000000
+ KSEC1(45+(ILOOP*2)) = INDATE
+ ENDIF
+C
+C Satellite number (ICE data).
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(46+(ILOOP*2)),
+ X 1,KBITS, 8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+ 210 CONTINUE
+C
+C On encoding, adjust length of section 1.
+ IF( LENCODE ) THEN
+ LENS1 = 56 + KSEC1(46)*4
+ CALL INXBIT(KGRIB,KLENG,KPLEN,LENS1, 1,KBITS,24,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 9 . Abort/return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) THEN
+ WRITE(GRPRSM,*) 'ECDEF6 : Section 9.'
+ WRITE(GRPRSM,*) ' Output values set -'
+ WRITE(GRPRSM,*) ' KNSPT = ', KNSPT
+ ENDIF
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF (IRET.EQ.0.AND.KRET.NE.0) THEN
+ CALL ABORTX ('ECDEF6')
+ ELSE
+ RETURN
+ ENDIF
+C
+C
+ 9004 FORMAT (' ECDEF6: Error reported by routine INXBIT.')
+C
+ END
diff --git a/gribex/ecdef6.h b/gribex/ecdef6.h
new file mode 100755
index 0000000..91edd76
--- /dev/null
+++ b/gribex/ecdef6.h
@@ -0,0 +1,83 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 6.
+C Surface temperature data.
+C ----------------------------------
+C
+C GRIB code
+C KSEC1(NN) section 1
+C octet(s)
+C --------- ---------
+C
+C 37 41 ECMWF local GRIB use definition identifier
+C = 6
+C = surface temperature fields made from SST and
+C SSMI data with first-guess values inserted on
+C land points.
+C
+C 38 42 Class : 1 = Operations
+C
+C 39 43 Type : 2 = Analysis
+C
+C 40 44-45 Stream : 1025 = Daily archive
+C
+C 41 46-49 Expver : Version number/experiment identifier.
+C (4 Ascii characters, right justified)
+C
+C 42 50 Zero, for compatibility with MARS labelling.
+C
+C 43 51 Zero, for compatibility with MARS labelling.
+C
+C 44 52-54 Date of SST field used; YYYYMMDD.
+C (Stored in 3 bytes as YYYYMMDD-19000000.
+C Zero = date not given.)
+C
+C 45 55 Type of SST field used:
+C 0 = climatology
+C 1 = 1/1 degree sst data
+C 2 = 2/2 degree sst data
+C
+C 46 56 Count of ICE fields used (n, say).
+C (NB. n maybe 0).
+C
+C 47 57-59 Date of first ICE field used; YYYYMMDD.
+C (Stored in 3 bytes as YYYYMMDD-19000000.
+C Zero = date not given.)
+C
+C 48 60 First day satellite number (ICE data)
+C
+C 49 61-63 Date of second ICE field used ; YYYYMMDD.
+C (Stored in 3 bytes as YYYYMMDD-19000000.
+C Zero = date not given.)
+C
+C 50 64 Second day satellite number (ICE data)
+C
+C 51 65-67 Date of third ICE field used ; YYYYMMDD.
+C (Stored in 3 bytes as YYYYMMDD-19000000.
+C Zero = date not given.)
+C
+C 52 68 Third day satellite number (ICE data)
+C
+C
+C ...
+C
+C 45+(n*2) 53+(n*4) Date of nth field used; YYYYMMDD.
+C ->55+(n*4) (Stored in 3 bytes as YYYYMMDD-19000000.
+C Zero = date not given.)
+C
+C 46+(n*2) 56+(n*4) Nth day satellite number (ICE data)
+C
+C
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef7.F b/gribex/ecdef7.F
new file mode 100755
index 0000000..7b8f7df
--- /dev/null
+++ b/gribex/ecdef7.F
@@ -0,0 +1,238 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF7( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS,
+ X KPR, KRET)
+C
+C---->
+C**** ECDEF7
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 7.
+C (Extensions for sensitivity gradients/trajectory forecast).
+C
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF7( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KLENG - Length (words) of KGRIB.
+C
+C KNSPT - Bit number after which insertion or
+C extraction starts.
+C
+C KBITS - Number of bits in computer word.
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C
+C KGRIB - Array containing Grib coded data.(Updated)
+C
+C KNSPT - Number of bit after last one inserted/extracted.(Updated)
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 7.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT
+C ABORTX
+C CSGNBT
+C DSGNBT
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+C Adapted from ECLOC1.F - simplified to handle just definition 7.
+#include "ecdef7.h"
+C
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 18th January 1995
+C
+C
+C Modifications.
+C --------------
+C
+C J.D.Chambers ECMWF 14th February 1995
+C Modify comments (see ecdef.h also) for inclusion of Sensitivity
+C forecast.
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+ CHARACTER*(*) HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+ INTEGER IRET, IDUM
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+C
+C ------------------------------------------------------------------
+C* Section 2 . Extensions sensitivity gradients/trajectory forecast/
+C sensitivity forecasts.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C* Octet 50 : Forecast indicator or iteration number
+C One 8 bit field.
+C
+C Insert/extract field.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,KSEC1(42),1,KBITS, 8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+C
+C* Octet 51 : Total number of diagnostics(trajectory forecast), or
+C Number of iterations in diagnostic minimisation
+C (sensitivity forecast), or
+C = 0 for trajectory forecasts.
+C One 8 bit field.
+C
+C Insert/extract field.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,KSEC1(43),1,KBITS, 8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+C
+C* Octet 52 : Domain.
+C 0 = Global
+C 1 = Europe
+C 2 = Northern Hemsphere
+C 3 = Southern Hemsphere
+C One 8 bit field.
+C
+C Insert/extract fields.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,KSEC1(44),1,KBITS, 8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+C
+C* Octet 53 : Diagnostic number
+C One 8 bit field.
+C
+C Insert/extract field.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,KSEC1(45),1,KBITS, 8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+C
+C* Octet 54 : Dummy, set to zero.
+C One 8 bit field.
+C
+C Insert/extract field.
+C
+ IDUM = 0
+ CALL INXBIT (KGRIB,KLENG,KNSPT,IDUM,1,KBITS, 8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ GO TO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 9 . Abort/return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) THEN
+ WRITE(GRPRSM,*) 'ECDEF7 : Section 9.'
+ WRITE(GRPRSM,*) ' Output values set -'
+ WRITE(GRPRSM,9003) KNSPT
+ ENDIF
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF (IRET.EQ.0.AND.KRET.NE.0) THEN
+ CALL ABORTX ('ECDEF7')
+ ELSE
+ RETURN
+ ENDIF
+C
+ 9003 FORMAT (1H ,' KNSPT = ',I12)
+C
+ 9004 FORMAT (' ECDEF7: Error reported by routine INXBIT.')
+C
+ END
diff --git a/gribex/ecdef7.h b/gribex/ecdef7.h
new file mode 100755
index 0000000..fa60b6f
--- /dev/null
+++ b/gribex/ecdef7.h
@@ -0,0 +1,55 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 7.
+C
+C Sensitivity gradient/Trajectory
+C forecast and Sensitivity forecast data.
+C ---------------------------------------
+C
+C
+C Word
+C ----
+C 38 as for definition 1.
+C
+C 39 Type :
+C 50 = Sensitivity gradient
+C 51 = Trajectory forecast
+C 52 = Sensitivity forecast
+C
+C 40 Stream :
+C 1036 = Sensitivity forecasts
+C
+C 41 as for definition 1.
+C
+C 42 Forecast number or diagnostic number:
+C = 0 for trajectory forecast(type 51).
+C = 0 for control sensitivity forecast(type 52).
+C = 1 J1 diagnostic(type 50).
+C = 2 J2 diagnostic(type 50).
+C = 3 J3 diagnostic(type 50).
+C = 4 J4 diagnostic(type 50).
+C = 5 J5 diagnostic(type 50).
+C
+C 43 Total number of diagnostics(type 50).
+C 0 for trajectory forecasts(type 51).
+C Number of interations in diagnostic
+C minimisation(type 52).
+C
+C 44 Domain
+C = 0 for Global
+C = 1 for Europe
+C = 2 for Northern Hemisphere
+C = 3 for Southern Hemisphere
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef8.F b/gribex/ecdef8.F
new file mode 100755
index 0000000..598a64d
--- /dev/null
+++ b/gribex/ecdef8.F
@@ -0,0 +1,178 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF8( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS,
+ X KPR, KRET)
+C
+C---->
+C**** ECDEF8
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 8.
+C (ECMWF re-analysis data)
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF8( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KLENG - Length (words) of KGRIB.
+C
+C KNSPT - Bit number after which insertion/extraction starts.
+C
+C KBITS - Number of bits in computer word.
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C
+C KGRIB - Array containing Grib coded data.(Updated)
+C
+C KNSPT - Number of bit after last one inserted/extracted.(Updated)
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 8.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT
+C ABORTX
+C CSGNBT
+C DSGNBT
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+C Adapted from ECLOC1.F - simplified to handle just definition 8.
+#include "ecdef8.h"
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 18th January 1995
+C
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+ INTEGER IRET
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+C
+C ------------------------------------------------------------------
+C* Section 2 . Handle ECMWF re-analysis data, definition 8.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C
+C Octet 50-62 : Unsigned integers in range (0-255)
+C Thirteen 8 bit fields.
+C
+C Insert/extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),13,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,9004)
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 9 . Abort/return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) THEN
+ WRITE(GRPRSM,*) 'ECDEF8 : Section 9.'
+ WRITE(GRPRSM,*) ' Output values set -'
+ WRITE(GRPRSM,9003) KNSPT
+ ENDIF
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF (IRET.EQ.0.AND.KRET.NE.0) THEN
+ CALL ABORTX ('ECDEF8')
+ ELSE
+ RETURN
+ ENDIF
+C
+ 9003 FORMAT (1H ,' KNSPT = ',I12)
+C
+ 9004 FORMAT (' ECDEF8: Error reported by routine INXBIT.')
+C
+ END
diff --git a/gribex/ecdef8.h b/gribex/ecdef8.h
new file mode 100755
index 0000000..403d34f
--- /dev/null
+++ b/gribex/ecdef8.h
@@ -0,0 +1,32 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 8.
+C
+C ECMWF re-analysis data
+C ----------------------
+C
+C
+C Word
+C ----
+C 38 as for definition 1.
+C
+C 39 Type.
+C
+C 40 Stream.
+C
+C 41 as for definition 1.
+C
+C 42-54 Unsigned integers in range (0-255)
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdef9.F b/gribex/ecdef9.F
new file mode 100755
index 0000000..90f889d
--- /dev/null
+++ b/gribex/ecdef9.F
@@ -0,0 +1,345 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDEF9( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS,
+ X KPR, KRET)
+C
+C---->
+C**** ECDEF9
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 9.
+C
+C** Interface.
+C ----------
+C
+C CALL ECDEF9( HFUNC, KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KLENG - Length (words) of KGRIB.
+C
+C KNSPT - Bit number after which insertion/extraction starts.
+C
+C KBITS - Number of bits in computer word.
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C
+C KGRIB - Array containing Grib coded data.(Updated)
+C
+C KNSPT - Number of bit after last one inserted/extracted.
+C (Updated)
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 9.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT - insert/extract bits
+C ABORTX - abort the program
+C CSGNBT - code a signed value
+C DSGNBT - decode a signed value
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+#include "ecdef9.h"
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF June 1996
+C
+C
+C Modifications.
+C --------------
+C
+C None
+C
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPR, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+ INTEGER IRET, IZERO, JLOOP, ITEMP, IRETA
+C
+ LOGICAL LENCODE, LDECODE
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = ( HFUNC .EQ. 'C' )
+ LDECODE = .NOT. LENCODE
+C
+C ------------------------------------------------------------------
+C* Section 2 . Handle singular vector.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF( KSEC1(39).EQ.62 ) THEN
+C
+C Octets 50-51 : Singular vector number.
+C Octets 52-53 : Number of iterations.
+C Octets 54-55 : Number of singular vectors computed.
+C Three 16 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),3,KBITS,16,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF9: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*)
+ X ' encoding section 1, elements 42 - 44.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 50 - 55.'
+ ENDIF
+ ENDIF
+C
+C Octet 56 : Norm used at initial time.
+C Octet 57 : Norm used at final time.
+C Two 8 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(45),2,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF9: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*)
+ X ' encoding section 1, elements 45 - 46.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 56 - 57.'
+ ENDIF
+ ENDIF
+C
+C Octets 58-61 : Multiplication factor.
+C One 32 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(47),1,KBITS,32,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF9: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, element 47.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 58 - 61.'
+ ENDIF
+ ENDIF
+C
+C Octets 62-65 : Latitude of north-west corner of LPO area.
+C Octets 66-69 : Longitude of north-west corner of LPO area.
+C Octets 70-73 : Latitude of south-east corner of LPO area.
+C Octets 74-77 : Longitude of south-east corner of LPO area.
+C Four signed 32 bit fields.
+C
+ DO 210 JLOOP = 48, 51
+ IF ( LENCODE ) CALL CSGNBT( ITEMP, KSEC1(JLOOP), 32, IRETA)
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ITEMP,1,KBITS,32,HFUNC,KRET)
+ IF ( LDECODE ) CALL DSGNBT( KSEC1(JLOOP), ITEMP, 32, IRETA)
+ IF ( (IRETA.NE.0) .OR. (KRET.NE.0) ) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF9: Error reported by routine INXBIT:'
+ WRITE(GRPRSM,*)
+ X 'encoding/decoding section 1, element ', JLOOP
+ ENDIF
+ 210 CONTINUE
+C
+C Octets 78-81 : Accuracy.
+C One 32 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(52),1,KBITS,32,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF9: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, element 52.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 78 - 81.'
+ ENDIF
+ ENDIF
+C
+C Octets 82-83 : Number of singular vectors evolved.
+C One 16 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(53),1,KBITS,16,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF9: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, element 53.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 82 - 83.'
+ ENDIF
+ ENDIF
+C
+C Octets 84-87 : Ritz number.
+C Octets 88-91 : Ritz number.
+C Two signed 32 bit fields.
+C
+ DO 220 JLOOP = 54, 55
+ IF ( LENCODE ) CALL CSGNBT( ITEMP, KSEC1(JLOOP), 32, IRETA)
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ITEMP,1,KBITS,32,HFUNC,KRET)
+ IF ( LDECODE ) CALL DSGNBT( KSEC1(JLOOP), ITEMP, 32, IRETA)
+ IF ( (IRETA.NE.0) .OR. (KRET.NE.0) ) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF9: Error reported by routine INXBIT:'
+ WRITE(GRPRSM,*)
+ X 'encoding/decoding section 1, element ', JLOOP
+ ENDIF
+ 220 CONTINUE
+C
+C Octet 92 : Reserved.
+C Set to 0.
+C
+ IF ( LENCODE ) THEN
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF9: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*)
+ X ' encoding section 1, reserved element.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 92.'
+ ENDIF
+ ENDIF
+ ELSE
+ KNSPT = KNSPT + 8
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 3 . Handle perturbation analysis or perturbation.
+C ------------------------------------------------------------------
+C
+ ELSE
+C
+ 300 CONTINUE
+C
+C Octets 50-51 : Perturbation analysis or perturbation number.
+C One 16 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(42),1,KBITS,16,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*) 'ECDEF9: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(GRPRSM,*) ' encoding section 1, element 42.'
+ ELSE
+ WRITE(GRPRSM,*) ' decoding section 1, octets 50 - 51.'
+ ENDIF
+ ENDIF
+C
+ IF ( LENCODE ) THEN
+C
+C Octets 52-92 set to zero
+ DO 310 JLOOP = 52,92
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ KRET = 2
+ WRITE(GRPRSM,*)
+ X 'ECDEF9: Error reported by routine INXBIT:'
+ WRITE(GRPRSM,*)
+ X ' encoding section 1, element ',JLOOP
+ ENDIF
+ 310 CONTINUE
+C
+ ELSE
+C
+C KSEC1(43-55) set to zero.
+ DO 320 JLOOP = 43, 55
+ KSEC1(JLOOP) = 0
+ 320 CONTINUE
+ KNSPT = KNSPT + 328
+ KRET = 0
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 9 . Abort/return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ ENDIF
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) THEN
+ WRITE(GRPRSM,*) 'ECDEF9: Section 9.'
+ WRITE(GRPRSM,*) ' Output values set, KNSPT = ', KNSPT
+ ENDIF
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF (IRET.EQ.0.AND.KRET.NE.0) THEN
+ CALL ABORTX ('ECDEF9')
+ ELSE
+ RETURN
+ ENDIF
+C
+C
+ END
diff --git a/gribex/ecdef9.h b/gribex/ecdef9.h
new file mode 100755
index 0000000..7c3b2a5
--- /dev/null
+++ b/gribex/ecdef9.h
@@ -0,0 +1,80 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 9.
+C Singular vectors and ensemble perturbations.
+C ---------------------------------------------
+C
+C Octet KSEC1(n)
+C ----- --------
+C
+C 42 38 Class : 1 = Operations
+C 2 = Research
+C
+C 43 39 Type : 60 = Perturbed analysis
+C 62 = Singular vector
+C 63 = Adjoint singular vector
+C
+C 44-45 40 Stream : 1035 = Ensemble forecasts
+C
+C 46-49 41 Expver : Version number/experiment identifier.
+C ( 4 Ascii characters, right justified)
+C
+C 50-51 42 If type 60, perturbed ensemble forecast number.
+C If type 62 or 63, singular vector number.
+C
+C
+C If type = 60:
+C
+C 52-92 43-55 Set to zero.
+C
+C
+C If type = 62 or 63:
+C
+C 52-53 43 Number of iterations.
+C
+C 54-55 44 Number of singular vectors computed.
+C
+C 56 45 Norm used at initial time.
+C
+C 57 46 Norm used at final time.
+C
+C 58-61 47 Multiplication factor to convert latitude/longitude
+C and accuracy from real to integer.
+C
+C 62-65 48 Latitude in degrees of north-west corner of LPO area
+C multiplied by KSEC1(47).
+C
+C 66-69 49 Longitude in degrees of north-west corner of LPO area
+C multiplied by KSEC1(47).
+C
+C 70-73 50 Latitude in degrees of south-east corner of LPO area
+C multiplied by KSEC1(47).
+C
+C 74-77 51 Longitude in degrees of south-east corner of LPO area
+C multiplied by KSEC1(47).
+C
+C 78-81 52 Accuracy multiplied by KSEC1(47).
+C
+C 82-83 53 Number of singular vectors evolved.
+C
+C 84-91 54-55 Ritz numbers.
+C Given ritz, then:
+C KSEC1(54) = NINT( LOG10(RITZ)-5 )
+C KSEC1(55) = NINT( RITZ/ EXP(LOG(10.0)*KSEC1(54) ) )
+C Thus:
+C RITZ = KSEC1(55)*EXP( LOG(10.0)*KSEC1(54) )
+C
+C 92 Reserved. Set to zero.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdf190.h b/gribex/ecdf190.h
new file mode 100755
index 0000000..90dc13d
--- /dev/null
+++ b/gribex/ecdf190.h
@@ -0,0 +1,65 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 190.
+C Multiple ECMWF local definitions
+C --------------------------------
+C
+C Octet KSEC1(n)
+C ----- --------
+C
+C 41 37 ECMWF local GRIB use definition identifier (= 190)
+C
+C 42 38 Class
+C
+C 43 39 Type
+C
+C 44-45 40 Stream
+C
+C 46-49 41 Version number/experiment identifier.
+C (4 Ascii characters, right justified)
+C
+C 50-51 42-43 Set to zero (For compatibility with other
+C ECMWF local definitions)
+C
+C 52 44 Number of ECMWF local definitions (N, say)
+C
+C 53 45 First ECMWF local definition number
+C
+C 54-55 46 Number of bytes in first ECMWF local definition
+C
+C 56 47 Second ECMWF local definition number
+C
+C 57-58 48 Number of bytes in second ECMWF local definition
+C
+C ... ...
+C
+C 50+N*3 43+N*2 Nth ECMWF local definition number
+C
+C 51+N*3-52+N*3 44+N*2 Number of bytes in Nth ECMWF local definition
+C
+C
+C N ECMWF local definitions follow:
+C
+C 53+N*3... 45+N*2 Stream of ECMWF local definition bytes previously
+C encoded/decoded via function calls.
+C
+C The ECMWF local definitions are the locally defined extensions from
+C byte 41 onwards.
+C
+C If definition 190 appears in the list of ECMWF local, the stream of
+C ECMWF local definition bytes will include its own stream of ECMWF
+C local definition bytes.
+C
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecdf191.F b/gribex/ecdf191.F
new file mode 100755
index 0000000..1d75769
--- /dev/null
+++ b/gribex/ecdf191.F
@@ -0,0 +1,362 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECDF191(HFUNC,KSEC1,KGRIB,KLENG,KNSPT,KBITS,KPLEN,KRET)
+C
+C---->
+C**** ECDF191
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use definition 191.
+C
+C** Interface.
+C ----------
+C
+C CALL ECDF191(HFUNC,KSEC1,KGRIB,KLENG,KNSPT,KBITS,KRET)
+C
+C
+C Input
+C -----
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C KSEC1 - Array containing Grib Section 1 data.
+C KGRIB - Array containing Grib coded data.
+C KLENG - Length (words) of KGRIB.
+C KNSPT - Bit number after which insertion/extraction starts.
+C KBITS - Number of bits in computer word.
+C KPLEN - Pointer to field containing length of Section 1.
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output
+C ------
+C KSEC1 - Array containing Grib Section 1 data.(Updated)
+C KGRIB - Array containing Grib coded data.(Updated)
+C KNSPT - Number of bit after last one inserted/extracted.
+C (Updated)
+C KRET - Return code.
+C 0 , No error encountered.
+C 2 , Error reported by routine INXBIT.
+C
+C
+C Method.
+C -------
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code, definition 191.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT - insert/extract bits
+C ABORTX - abort the program
+C CSGNBT - code a signed value
+C DSGNBT - decode a signed value
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+#include "ecdf191.h"
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF December 2001
+C
+C
+C Modifications.
+C --------------
+C
+C None
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0 . Definition of variables. Data statements.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+C Parameter(s)
+C
+ INTEGER JPBYTES
+C `-----> Number of bytes in an INTEGER
+#ifdef INTEGER_8
+ PARAMETER( JPBYTES = 8)
+#else
+ PARAMETER( JPBYTES = 4)
+#endif
+C
+C Subroutine arguments
+C
+ CHARACTER*1 HFUNC
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPLEN, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+C
+ INTEGER IRET, IZERO, JLOOP, N, M, ILENS1, N_KNSPT, ICOUNT, IBITS
+C
+ LOGICAL LENCODE, LDECODE
+C
+C -----------------------------------------------------------------|
+C* Section 1 . Set initial values.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IRET = KRET
+ LENCODE = ( HFUNC.EQ.'C' )
+ LDECODE = .NOT. LENCODE
+C
+ N_KNSPT = KNSPT
+C
+C -----------------------------------------------------------------|
+C* Section 2 . Handle the local extension
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Octet 50 : Zero
+C Octet 51 : Zero
+C Two 8 bit fields.
+C
+ IF( LENCODE ) THEN
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(*,*) 'ECDF191: Error reported by routine INXBIT:'
+ WRITE(*,*) ' encoding section 1, octet 50'
+ GOTO 900
+ ENDIF
+ ELSE
+ KSEC1(42) = 0
+ KNSPT = KNSPT + 8
+ ENDIF
+C
+ IF( LENCODE ) THEN
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(*,*) 'ECDF191: Error reported by routine INXBIT:'
+ WRITE(*,*) ' encoding section 1, octet 51'
+ GOTO 900
+ ENDIF
+ ELSE
+ KSEC1(43) = 0
+ KNSPT = KNSPT + 8
+ ENDIF
+C
+C Octet 52 : Format version major number
+C Octet 53 : Format version minor number
+C Two 8 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(44),1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(*,*) 'ECDF191: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(*,*) ' encoding section 1, element 44.'
+ ELSE
+ WRITE(*,*) ' decoding section 1, octet 52.'
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(45),1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(*,*) 'ECDF191: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(*,*) ' encoding section 1, element 45.'
+ ELSE
+ WRITE(*,*) ' decoding section 1, octet 53.'
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C Octet 54 : Original sub-centre identifier
+C One 8 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(46),1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(*,*) 'ECDF191: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(*,*) ' encoding section 1, element 46.'
+ ELSE
+ WRITE(*,*) ' decoding section 1, octet 54.'
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C Octet 55-58 : Padding, set to zero
+C Four 8 bit fields.
+C
+ IF( LENCODE ) THEN
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(*,*) 'ECDF191: Error reported by routine INXBIT:'
+ WRITE(*,*) ' encoding section 1, octet 55'
+ GOTO 900
+ ENDIF
+ ELSE
+ KSEC1(47) = 0
+ KNSPT = KNSPT + 8
+ ENDIF
+C
+ IF( LENCODE ) THEN
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(*,*) 'ECDF191: Error reported by routine INXBIT:'
+ WRITE(*,*) ' encoding section 1, octet 56'
+ GOTO 900
+ ENDIF
+ ELSE
+ KSEC1(48) = 0
+ KNSPT = KNSPT + 8
+ ENDIF
+C
+ IF( LENCODE ) THEN
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(*,*) 'ECDF191: Error reported by routine INXBIT:'
+ WRITE(*,*) ' encoding section 1, octet 57'
+ GOTO 900
+ ENDIF
+ ELSE
+ KSEC1(49) = 0
+ KNSPT = KNSPT + 8
+ ENDIF
+C
+ IF( LENCODE ) THEN
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(*,*) 'ECDF191: Error reported by routine INXBIT:'
+ WRITE(*,*) ' encoding section 1, octet 58'
+ GOTO 900
+ ENDIF
+ ELSE
+ KSEC1(50) = 0
+ KNSPT = KNSPT + 8
+ ENDIF
+C
+C Octets 59-60: Number of bytes of free format data descriptor
+C One 16 bit field
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(51),1,KBITS,16,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(*,*) 'ECDF191: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(*,*) ' encoding section 1, element 51.'
+ ELSE
+ WRITE(*,*) ' decoding section 1, octets 59 - 60.'
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C Octets 61-(60+N) : Data bytes
+C N values; 8 bit values packed in integer array element
+C
+ N = KSEC1(51)
+ ICOUNT = (N+JPBYTES-1)/JPBYTES
+ IBITS = JPBYTES*8
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC1(52),
+ X ICOUNT,KBITS,IBITS,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(*,*) 'ECDF191: Error reported by routine INXBIT:'
+ IF( LENCODE ) THEN
+ WRITE(*,*) ' encoding section 1, elements 52 - (51+N/4).'
+ ELSE
+ WRITE(*,*) ' decoding section 1, octets 61 - (60+N).'
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C Octets (60+N) onwards: Padded with zeroes
+C The section will be padded with zeroes to make the overall length
+C of the section = 60 + 80*M for some M > 0.
+C
+ M = 60+(((ICOUNT*JPBYTES)+79)/80)*80
+C
+ DO JLOOP = (60+ICOUNT*JPBYTES+1), M
+ IF( LENCODE ) THEN
+ IZERO = 0
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IZERO,1,KBITS,8,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(*,*) 'ECDF191: Error reported by routine INXBIT:'
+ WRITE(*,*) ' encoding section 1, octets (56+N) onwards'
+ GOTO 900
+ ENDIF
+ ELSE
+ KNSPT = KNSPT + 8
+ ENDIF
+ ENDDO
+C
+C Calculate section 1 total length using original and final bit
+C positions. NB packing started at octet 50.
+C
+ ILENS1 = 49 + (KNSPT - N_KNSPT)/8
+C
+C* Insert length of section 1, if coding data.
+C One 24-bit field.
+C
+ IF( LENCODE ) THEN
+ CALL INXBIT(KGRIB,KLENG,KPLEN,ILENS1,1,KBITS, 24,HFUNC,KRET)
+ IF( KRET.NE.0 ) THEN
+ KRET = 2
+ WRITE(*,*) 'ECDF191: Error reported by routine INXBIT:'
+ WRITE(*,*) ' encoding length of section 1'
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9 . Abort/return to calling routine. Format statements.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF( (IRET.EQ.0).AND.(KRET.NE.0) ) THEN
+ CALL ABORTX('ECDF191')
+ ELSE
+ RETURN
+ ENDIF
+C
+ END
diff --git a/gribex/ecdf191.h b/gribex/ecdf191.h
new file mode 100755
index 0000000..88f610d
--- /dev/null
+++ b/gribex/ecdf191.h
@@ -0,0 +1,65 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C ECMWF local GRIB use definition 191.
+C Free format data descriptor.
+C ----------------------------
+C
+C Octet KSEC1(n)
+C ----- --------
+C
+C 5 2 Originating centre (WMO identifier)
+C
+C 26 22 Sub-centre identifier (= 98)
+C
+C ** 24 Flag field to indicate local use in Section 1 (= 1)
+C
+C 41 37 ECMWF local GRIB use definition identifier (= 191)
+C
+C 42 38 Class
+C
+C 43 39 Type
+C
+C 44-45 40 Stream
+C
+C 46-49 41 Version number/experiment identifier.
+C (4 Ascii characters, right justified)
+C
+C 50-51 42-43 Set to zero (For compatibility with other
+C ECMWF local definitions)
+C
+C 52 44 Format version major number
+C
+C 53 45 Format version minor number
+C
+C 54 46 Original sub-centre identifier
+C
+C 55-58 (47-50) Set to zero
+C
+C 59-60 51 Number of bytes of free format data descriptor
+C (N, say)
+C
+C 61-(60+N) 52-(51+N/J) Data descriptor bytes packed in integer array
+C elements
+C (J = the number of bytes in an INTEGER = 4 or 8)
+C
+C
+C The section will be padded with zeroes to make the overall length
+C of the section = 60 + 80*M for some M > 0.
+C
+C -----------------------------------------------------------------|
+C
+C ** Not stored in GRIB message.
+C
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
diff --git a/gribex/ecloc1.F b/gribex/ecloc1.F
new file mode 100755
index 0000000..a838a7a
--- /dev/null
+++ b/gribex/ecloc1.F
@@ -0,0 +1,224 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ECLOC1(HFUNC,KSEC1,KGRIB,KNSPT,KBITS,KRET)
+C
+C---->
+C**** ECLOC1
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of ECMWF local use of Section 1.
+C
+C** Interface.
+C ----------
+C
+C CALL ECLOC1(HFUNC,KSEC1,KGRIB,KNSPT,KBITS,KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C HFUNC - Requested function.
+C 'C' to code data.
+C 'D' to decode data.
+C KSEC1 - Array containing Grib Section 1 data.
+C KGRIB - Array containing Grib coded data.
+C KNSPT - Bit number after which insertion or
+C extraction starts.
+C KBITS - Number of bits in computer word.
+C
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KNSPT - Number of bit after last one inserted or
+C extracted.
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Invalid local use definition.
+C 2 , Error reported by routine INXBIT.
+C 3 , 3d or 4d analysis not implemented.
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with ECMWF usage of
+C local part of section 1 of Grib code.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT - insert/extract bit data
+C ABORTX - abort program
+C CSGNBT - encode sign bit
+C DSGNBT - decode sign bit
+C ELDEFS - encode ECMWF section 1, local usage definitions
+C DLDEFS - decode ECMWF section 1, local usage definitions
+#ifdef LITTLE_ENDIAN
+C SWAP4 - swap order of characters in the experiment version
+#endif
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 03:11:92.
+C
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 21:05:93.
+C Additional parameter KPLEN added. Local usage definitions
+C 3 and 4 added.
+C
+C J.D.Chambers ECMWF 18:10:93.
+C Local usage definition 5 added.
+C
+C J.D.Chambers ECMWF 12.05.94
+C ECMWF local usage definition 7 added.
+C (Sensitivity gradient/Trajectory forecast data).
+C Change to use CSGNBT and DSGNBT to code and decode sign bits
+C
+C J.D.Chambers ECMWF 02.06.94
+C Fix handling of local use section 1 for MARS labelling
+C
+C J.D.Chambers ECMWF 11.11.94
+C Fix overwrite of constant zero
+C
+C J.D.Chambers ECMWF 18.01.95
+C Use subroutine calls (ECDEF1, ... ) to handle ECMWF
+C section 1 local usage definitions.
+C
+C J.D.Chambers ECMWF September 2004
+C Use ELDEFS and DLDEFS to handle ECMWF
+C section 1 local usage definitions.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0 . Definition of variables. Data statements.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "grbcom.h"
+#include "grprs.h"
+C
+C Subroutine arguments
+C
+ CHARACTER*(*) HFUNC
+ INTEGER KSEC1, KGRIB, KNSPT, KBITS, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Parameter(s)
+C
+ INTEGER JPBITS
+#ifdef INTEGER_8
+ PARAMETER ( JPBITS = 64 )
+#else
+ PARAMETER ( JPBITS = 32 )
+#endif
+C
+C Local variables
+C
+ INTEGER ILEN, LOOP, ITEMP(1000), NUMBYTS, NUMVALS, IOFFSET
+ INTEGER NUMBER
+C
+ LOGICAL LENCODE, LDEBUG
+C
+C Function(s)
+C
+ INTEGER LDEFNUM
+C
+C -----------------------------------------------------------------|
+C* Section 1 . Set initial values.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ LDEBUG = (NDBG.GE.1)
+C
+ IF( LDEBUG ) THEN
+ WRITE(GRPRSM,*) 'ECLOC1: Section 1.'
+ WRITE(GRPRSM,*) ' Input values used -'
+ WRITE(GRPRSM,*) ' HFUNC = ', HFUNC
+ WRITE(GRPRSM,*) ' KNSPT = ', KNSPT
+ ENDIF
+C
+C Reset return code to 0.
+C
+ KRET = 0
+C
+ LENCODE = ( HFUNC(1:1).EQ.'C' )
+C
+C -----------------------------------------------------------------|
+C* Section 2 . Check input parameters.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( LDEBUG ) WRITE(GRPRSM,*) 'ECLOC1: Section 2.'
+C
+ IOFFSET = 1 + (KNSPT / KBITS)
+C
+C KWBC non-ensemble products have:
+C ksec1( 2) = 7 (originating centre = KWBC)
+C ksec1(22) = 98 (subcentre = ECMWF)
+C For these, an ECMWF local definition applies.
+C
+ IF( LENCODE ) THEN
+ NUMBER = KSEC1(2)*1000000 + KSEC1(22)*1000 + KSEC1(37)
+ CALL ELDEFS(NUMBER,KSEC1(37),KGRIB(IOFFSET),NUMVALS,NUMBYTS)
+ IF( NUMBYTS.LE.0 ) THEN
+ KRET = 1
+ GOTO 900
+ ENDIF
+ NUMBYTS = NUMBYTS + 40
+ CALL ISEC1L(KGRIB,NUMBYTS)
+ NUMBYTS = NUMBYTS - 40
+ ELSE
+ NUMBER = LDEFNUM(KSEC1(2),KSEC1(22),KGRIB(IOFFSET))
+ CALL DLDEFS(NUMBER,KGRIB(IOFFSET),KSEC1(37),NUMVALS,NUMBYTS)
+ IF( NUMBYTS.LE.0 ) THEN
+ KRET = 1
+ GOTO 900
+ ENDIF
+ ENDIF
+ KNSPT = KNSPT + (NUMBYTS*8)
+C
+C -----------------------------------------------------------------|
+C* Section 9 . Abort/return to calling routine. Format statements.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/eggsec2.F b/gribex/eggsec2.F
new file mode 100755
index 0000000..f225865
--- /dev/null
+++ b/gribex/eggsec2.F
@@ -0,0 +1,254 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION EGGSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS,
+ X LQUASI)
+C
+C---->
+C**** EGGSEC2P
+C
+C PURPOSE
+C _______
+C
+C Encodes GRIB section 2 values for gaussian grid fields..
+C
+C INTERFACE
+C _________
+C
+C IRET = EGGSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS,LQUASI))
+C
+C Input parameters
+C ________________
+C
+C KGRIB - GRIB product built so far (upto octet 6).
+C KLENG - Length of KGRIB.
+C INSPT - Bit position of GRIB product built so far.
+C KSEC0 - GRIB section 0 description.
+C KSEC2 - GRIB section 2 description.
+C IBITS - Number of bits per element in KGRIB.
+C LQUASI - .TRUE. if gaussian grid is quasi-regular (reduced).
+C
+C
+C Output parameters
+C ________________
+C
+C KGRIB - Updated GRIB product to end of section 2.
+C INSPT - Updated bit position of GRIB product built so far.
+C IRET - Function return status code, 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Packs values given in KSEC2 into KGRIB and updates bit
+C pointer INSPT.
+C
+C Externals
+C _________
+C
+C CSGNBT - Set the sign bit.
+C INXBIT - Insert bit data.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF February 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JP16SET
+ PARAMETER ( JP16SET = 2**16 - 1 )
+C ^---> 65535 = FFFF(hex)
+C
+C Function arguments
+C
+ INTEGER KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS
+ DIMENSION KGRIB(*),KSEC0(*),KSEC2(*)
+ LOGICAL LQUASI
+C
+C Local variables
+C
+ INTEGER ILALO(2), IRET, IRETA, IRETB, IRESOL
+C
+C _______________________________________________________
+C
+C Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ EGGSEC2 = 0
+C
+C _______________________________________________________
+C
+C Section 2. Pack section 2 octets.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Octets 7 - 8 : Ni - number of points along a parallel.
+C Octets 9 - 10 : Nj - number of points along a meridian.
+C Two 16 bit fields.
+C
+C For quasi-regular grids Ni is set to all 1 bits, as
+C the number of points is different on different parallels.
+C
+ IF( LQUASI ) KSEC2(2) = JP16SET
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(2),2,IBITS, 16,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EGGSEC2 = 1
+ WRITE(GRPRSM,*) 'EGGSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'EGGSEC2: number of pts along parallel or meridian.'
+ WRITE(GRPRSM,*) 'EGGSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 11 - 13 : La1 - latitude of first grid point.
+C Octets 14 - 16 : Lo1 - longitude of first grid point.
+C Two 24 bit fields.
+C
+ CALL CSGNBT( ILALO(1), KSEC2(4), 24, IRET)
+ CALL CSGNBT( ILALO(2), KSEC2(5), 24, IRET)
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EGGSEC2 = 1
+ WRITE(GRPRSM,*) 'EGGSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'EGGSEC2: latitude or longitude of first grid pt.'
+ WRITE(GRPRSM,*) 'EGGSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octet 17 : Resolution and components flag.
+C One 8 bit field.
+C
+ IRESOL = KSEC2(6)+KSEC2(18)+KSEC2(19)
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IRESOL,1,IBITS, 8,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EGGSEC2 = 1
+ WRITE(GRPRSM,*) 'EGGSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'EGGSEC2: components flag.'
+ WRITE(GRPRSM,*) 'EGGSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 18 - 20 : La2 - latitude of last grid point.
+C Octets 21 - 23 : Lo2 - longitude of last grid point.
+C Two 24 bit fields.
+C
+ CALL CSGNBT( ILALO(1), KSEC2(7), 24, IRET)
+ CALL CSGNBT( ILALO(2), KSEC2(8), 24, IRET)
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EGGSEC2 = 1
+ WRITE(GRPRSM,*) 'EGGSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'EGGSEC2: latitude or longitude of last grid point.'
+ WRITE(GRPRSM,*) 'EGGSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 24 - 25 : Di - i direction increment.
+C One 16 bit field.
+C
+C For quasi-regular grids all Di bits are set to 1, as
+C the increment is different on different parallels.
+C
+ IF( LQUASI ) KSEC2(9) = JP16SET
+C
+C If increments not given, set all bits to 1.
+C
+ IF( KSEC2(6).EQ.0 ) KSEC2(9) = JP16SET
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(9),1,IBITS, 16,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EGGSEC2 = 1
+ WRITE(GRPRSM,*) 'EGGSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'EGGSEC2: i direction increment.'
+ WRITE(GRPRSM,*) 'EGGSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 26 - 27 : N- number of parallels between a Pole
+C and the Equator.
+C One 16 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(10),1,IBITS, 16,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EGGSEC2 = 1
+ WRITE(GRPRSM,*) 'EGGSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'EGGSEC2: no. of parallels between pole and Equator'
+ WRITE(GRPRSM,*) 'EGGSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octet 28 : Scanning mode flags.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(11),1,IBITS, 8,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EGGSEC2 = 1
+ WRITE(GRPRSM,*) 'EGGSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'EGGSEC2: scanning mode flags.'
+ WRITE(GRPRSM,*) 'EGGSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Fix-up for flag which was different in Experimental Edition.
+C
+ IF( KSEC0(2).EQ.-1.AND.KSEC2(11).EQ.1) KSEC2(11) = 0
+C
+C Octets 29 - 32 : Reserved.
+C Two 16 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT, 0, 1,IBITS, 16,'C',IRETA)
+ CALL INXBIT(KGRIB,KLENG,INSPT, 0, 1,IBITS, 16,'C',IRETB)
+ IRET = IRETA + IRETB
+ IF( IRET.NE.0 ) THEN
+ IRET = 810
+ WRITE(GRPRSM,*) 'EGGSEC2: Error inserting dummy zero.'
+ WRITE(GRPRSM,*) 'EGGSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C _______________________________________________________
+C
+C Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/gribex/elasec2.F b/gribex/elasec2.F
new file mode 100755
index 0000000..7269b3b
--- /dev/null
+++ b/gribex/elasec2.F
@@ -0,0 +1,264 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION ELASEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS)
+C
+C---->
+C**** ELASEC2P
+C
+C PURPOSE
+C _______
+C
+C Encodes GRIB section 2 values for lambert conformal fields.
+C
+C INTERFACE
+C _________
+C
+C IRET = ELASEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS)
+C
+C Input parameters
+C ________________
+C
+C KGRIB - GRIB product built so far (upto octet 6).
+C KLENG - Length of KGRIB.
+C INSPT - Bit position of GRIB product built so far.
+C KSEC0 - GRIB section 0 description.
+C KSEC2 - GRIB section 2 description.
+C IBITS - Number of bits per element in KGRIB.
+C
+C
+C Output parameters
+C ________________
+C
+C KGRIB - Updated GRIB product to end of section 2.
+C INSPT - Updated bit position of GRIB product built so far.
+C IRET - Function return status code, 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Packs values given in KSEC2 into KGRIB and updates bit
+C pointer INSPT.
+C
+C Externals
+C _________
+C
+C CSGNBT - Set the sign bit.
+C INXBIT - Insert bit data.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF February 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Function arguments
+C
+ INTEGER KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS
+ DIMENSION KGRIB(*),KSEC0(*),KSEC2(*)
+C
+C Local variables
+C
+ INTEGER ILALO(2), IRET, IRESOL
+C
+C _______________________________________________________
+C
+C Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ ELASEC2 = 0
+C
+C _______________________________________________________
+C
+C Section 2. Pack section 2 octets.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Octets 7 - 8 : Ni - number of points along X-axis.
+C Octets 9 - 10 : Nj - number of points along Y-axis.
+C Two 16 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(2),2,IBITS, 16,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ELASEC2 = 1
+ WRITE(GRPRSM,*) 'ELASEC2 Error inserting'
+ WRITE(GRPRSM,*) 'ELASEC2 number of points along X or Y axis.'
+ WRITE(GRPRSM,*) 'ELASEC2 Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 11 - 13 : La1 - latitude of first grid point.
+C Octets 14 - 16 : Lo1 - longitude of first grid point.
+C Two 24 bit fields.
+C
+C Set sign bit to 1, if value is negative.
+C
+ CALL CSGNBT( ILALO(1), KSEC2(4), 24, IRET)
+ CALL CSGNBT( ILALO(2), KSEC2(5), 24, IRET)
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ELASEC2 = 1
+ WRITE(GRPRSM,*) 'ELASEC2 Error inserting'
+ WRITE(GRPRSM,*)
+ X 'ELASEC2 latitude or longitude of first grid pt.'
+ WRITE(GRPRSM,*) 'ELASEC2 Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octet 17 : Resolution and components flag.
+C One 8 bit field.
+C
+C Resolution flag ( KSEC2(6) ) is not applicable.
+C
+ IRESOL = KSEC2(18)+KSEC2(19)+KSEC2(6)
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IRESOL,1,IBITS, 8,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ELASEC2 = 1
+ WRITE(GRPRSM,*) 'ELASEC2 Error inserting'
+ WRITE(GRPRSM,*) 'ELASEC2 components flag.'
+ WRITE(GRPRSM,*) 'ELASEC2 Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 18 - 20 : LoV - orientation of the grid.
+C One 24 bit field.
+C
+C Set sign bit to 1, if value is negative.
+C
+ CALL CSGNBT( ILALO(1), KSEC2(7), 24, IRET)
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),1,IBITS, 24,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ELASEC2 = 1
+ WRITE(GRPRSM,*) 'ELASEC2 Error inserting'
+ WRITE(GRPRSM,*)
+ X 'ELASEC2 latitude or longitude of last grid point.'
+ WRITE(GRPRSM,*) 'ELASEC2 Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 21 - 23 : Dx - X direction grid length.
+C Octets 24 - 26 : Dy - Y direction grid length.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(9),2,IBITS, 24,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ELASEC2 = 1
+ WRITE(GRPRSM,*) 'ELASEC2 Error inserting'
+ WRITE(GRPRSM,*) 'ELASEC2 X or Y axis grid length.'
+ WRITE(GRPRSM,*) 'ELASEC2 Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octet 27 : Projection centre flag.
+C One 8-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(13),1,IBITS, 8,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ELASEC2 = 1
+ WRITE(GRPRSM,*) 'ELASEC2 Error inserting'
+ WRITE(GRPRSM,*) 'ELASEC2 Projection centre flag.'
+ WRITE(GRPRSM,*) 'ELASEC2 Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octet 28 : Scanning mode flags.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(11),1,IBITS, 8,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ELASEC2 = 1
+ WRITE(GRPRSM,*) 'ELASEC2 Error inserting'
+ WRITE(GRPRSM,*) 'ELASEC2 scanning mode flags.'
+ WRITE(GRPRSM,*) 'ELASEC2 Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Fix-up for flag which was different in Experimental Edition.
+C
+ IF( KSEC0(2).EQ.-1.AND.KSEC2(11).EQ.1) KSEC2(11) = 0
+C
+C Octets 29 - 31 : Latin 1.
+C Octets 32 - 34 : Latin 2.
+C Two 24 bit fields.
+C
+C Set sign bit to 1, if value is negative.
+C
+ CALL CSGNBT( ILALO(1), KSEC2(14), 24, IRET)
+ CALL CSGNBT( ILALO(2), KSEC2(15), 24, IRET)
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ELASEC2 = 1
+ WRITE(GRPRSM,*) 'ELASEC2 Error inserting'
+ WRITE(GRPRSM,*) 'ELASEC2 Latin1 or Latin2 of secants points.'
+ WRITE(GRPRSM,*) 'ELASEC2 Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 35 - 37 : Latitude of the southern pole.
+C Octets 38 - 40 : Longitude of the southern pole.
+C Two 24 bit fields.
+C
+C Set sign bit to 1, if value is negative.
+C
+ CALL CSGNBT( ILALO(1), KSEC2(20), 24, IRET)
+ CALL CSGNBT( ILALO(2), KSEC2(21), 24, IRET)
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ELASEC2 = 1
+ WRITE(GRPRSM,*) 'ELASEC2 Error inserting'
+ WRITE(GRPRSM,*) 'ELASEC2 latitude/longitude of southern pole.'
+ WRITE(GRPRSM,*) 'ELASEC2 Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 41 - 42 : Reserved.
+C One 16 bit fields.
+C
+C All bits already set to 0.
+C Update bit pointer.
+C
+ INSPT = INSPT + 16
+C
+C _______________________________________________________
+C
+C Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/gribex/ellsec2.F b/gribex/ellsec2.F
new file mode 100755
index 0000000..ff28e20
--- /dev/null
+++ b/gribex/ellsec2.F
@@ -0,0 +1,271 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION ELLSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS,
+ X LQUASI)
+C
+C---->
+C**** ELLSEC2P
+C
+C PURPOSE
+C _______
+C
+C Encodes GRIB section 2 values for lat/long grid fields.
+C
+C INTERFACE
+C _________
+C
+C IRET = ELLSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS,LQUASI))
+C
+C Input parameters
+C ________________
+C
+C KGRIB - GRIB product built so far (upto octet 6).
+C KLENG - Length of KGRIB.
+C INSPT - Bit position of GRIB product built so far.
+C KSEC0 - GRIB section 0 description.
+C KSEC2 - GRIB section 2 description.
+C IBITS - Number of bits per element in KGRIB.
+C LQUASI - .TRUE. if gaussian grid is quasi-regular (reduced).
+C
+C
+C Output parameters
+C ________________
+C
+C KGRIB - Updated GRIB product to end of section 2.
+C INSPT - Updated bit position of GRIB product built so far.
+C IRET - Function return status code, 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Packs values given in KSEC2 into KGRIB and updates bit
+C pointer INSPT.
+C
+C Externals
+C _________
+C
+C CSGNBT - Set the sign bit.
+C INXBIT - Insert bit data.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF February 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JP16SET
+ PARAMETER ( JP16SET = 2**16 - 1 )
+C ^---> 65535 = FFFF(hex)
+C
+C Function arguments
+C
+ INTEGER KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS
+ DIMENSION KGRIB(*),KSEC0(*),KSEC2(*)
+ LOGICAL LQUASI
+C
+C Local variables
+C
+ INTEGER ILALO(2), IRET, IRESOL
+C
+C _______________________________________________________
+C
+C Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ ELLSEC2 = 0
+C
+C _______________________________________________________
+C
+C Section 2. Pack section 2 octets.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Octets 7 - 8 : Ni - number of points along a parallel.
+C Octets 9 - 10 : Nj - number of points along a meridian.
+C Two 16 bit fields.
+C
+C WARNING!!
+C For quasi-regular grids, it is here assumed that Ni is variable,
+C i.e. that the number of points along a parallel is variable but
+C that the number of points along a meridian is fixed.
+C
+C For quasi-regular grids Ni is set to all 1 bits, as
+C the number of points is different on different parallels.
+C
+C Set to all 1 bits.
+C
+ IF( LQUASI ) KSEC2(2) = JP16SET
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(2),2,IBITS, 16,'C',IRET)
+ IF( IRET.NE.0) THEN
+ ELLSEC2 = 1
+ WRITE(GRPRSM,*) 'ELLSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'ELLSEC2: number of pts along parallel or meridian.'
+ WRITE(GRPRSM,*) 'ELLSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octets 11 - 13 : La1 - latitude of first grid point.
+C Octets 14 - 16 : Lo1 - longitude of first grid point.
+C Two 24 bit fields.
+C
+C Set sign bit to 1, if value is negative.
+C
+ CALL CSGNBT( ILALO(1), KSEC2(4), 24, IRET)
+ CALL CSGNBT( ILALO(2), KSEC2(5), 24, IRET)
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,'C',IRET)
+ IF( IRET.NE.0) THEN
+ ELLSEC2 = 1
+ WRITE(GRPRSM,*) 'ELLSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'ELLSEC2: latitude or longitude of first grid pt.'
+ WRITE(GRPRSM,*) 'ELLSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octet 17 : Resolution and components flag.
+C One 8 bit field.
+C
+ IRESOL = KSEC2(6)+KSEC2(18)+KSEC2(19)
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IRESOL,1,IBITS, 8,'C',IRET)
+ IF( IRET.NE.0) THEN
+ ELLSEC2 = 1
+ WRITE(GRPRSM,*) 'ELLSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'ELLSEC2: components flag.'
+ WRITE(GRPRSM,*) 'ELLSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octets 18 - 20 : La2 - latitude of last grid point.
+C Octets 21 - 23 : Lo2 - longitude of last grid point.
+C Two 24 bit fields.
+C
+C Set sign bit to 1, if value is negative.
+C
+ CALL CSGNBT( ILALO(1), KSEC2(7), 24, IRET)
+ CALL CSGNBT( ILALO(2), KSEC2(8), 24, IRET)
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,'C',IRET)
+ IF( IRET.NE.0) THEN
+ ELLSEC2 = 1
+ WRITE(GRPRSM,*) 'ELLSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'ELLSEC2: latitude or longitude of last grid point.'
+ WRITE(GRPRSM,*) 'ELLSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octets 24 - 25 : Di - i direction increment.
+C One 16 bit field.
+C
+C For quasi-regular grids all Di bits are set to 1, as
+C the increment is different on different parallels.
+C
+C If field not given, set to all bits to 1.
+C
+Ce Set to all 1 bits.
+ IF( LQUASI) KSEC2(9) = JP16SET
+Ce
+Ce If increments not given, set all bits to 1.
+ IF( KSEC2(6).EQ.0) KSEC2(9) = JP16SET
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(9),1,IBITS, 16,'C',IRET)
+ IF( IRET.NE.0) THEN
+ ELLSEC2 = 1
+ WRITE(GRPRSM,*) 'ELLSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'ELLSEC2: i direction increment.'
+ WRITE(GRPRSM,*) 'ELLSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octets 26 - 27 : Dj - j direction increment.
+C One 16 bit field.
+C
+C If field not given, set to all bits to 1.
+C
+ IF( KSEC2(6).EQ.0) KSEC2(10) = JP16SET
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(10),1,IBITS, 16,'C',IRET)
+ IF( IRET.NE.0) THEN
+ ELLSEC2 = 1
+ WRITE(GRPRSM,*) 'ELLSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'ELLSEC2: j direction increment.'
+ WRITE(GRPRSM,*) 'ELLSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octet 28 : Scanning mode flags.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(11),1,IBITS, 8,'C',IRET)
+ IF( IRET.NE.0) THEN
+ ELLSEC2 = 1
+ WRITE(GRPRSM,*) 'ELLSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'ELLSEC2: scanning mode flags.'
+ WRITE(GRPRSM,*) 'ELLSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Fix-up for flag which was different in Experimental Edition.
+C
+ IF( KSEC0(2).EQ.-1.AND.KSEC2(11).EQ.1) KSEC2(11) = 0
+C
+C Octets 29 - 32 : Reserved.
+C Two 16 bit fields.
+C
+Ce Set bits to 0.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT, 0, 1,IBITS, 32,'C',IRET)
+ IF( IRET.NE.0) THEN
+ ELLSEC2 = 1
+ WRITE(GRPRSM,*) 'ELLSEC2: Error inserting dummy zero.'
+ WRITE(GRPRSM,*) 'ELLSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C _______________________________________________________
+C
+C Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/gribex/emesec2.F b/gribex/emesec2.F
new file mode 100755
index 0000000..d8df76f
--- /dev/null
+++ b/gribex/emesec2.F
@@ -0,0 +1,314 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION EMESEC2(KGRIB,KLENG,KNSPT,KSEC0,KSEC2,KBITS,
+ X OQUASI)
+C
+C---->
+C**** EMESEC2
+C
+C PURPOSE
+C _______
+C
+C Encodes GRIB section 2 values for lat/long grid fields.
+C
+C INTERFACE
+C _________
+C
+C IRET = EMESEC2(KGRIB,KLENG,KNSPT,KSEC0,KSEC2,KBITS,OQUASI)
+C
+C Input parameters
+C ________________
+C
+C KGRIB - GRIB product built so far (upto octet 6).
+C KLENG - Length of KGRIB.
+C KNSPT - Bit position of GRIB product built so far.
+C KSEC0 - GRIB section 0 description.
+C KSEC2 - GRIB section 2 description.
+C KBITS - Number of bits per element in KGRIB.
+C OQUASI - .TRUE. if gaussian grid is quasi-regular (reduced).
+C
+C
+C Output parameters
+C ________________
+C
+C KGRIB - Updated GRIB product to end of section 2.
+C KNSPT - Updated bit position of GRIB product built so far.
+C IRET - Function return status code, 0 = OK
+C
+C Common block usage
+C __________________
+C
+C /GRPRSCM/ for GRPRSM variable.
+C
+C Method
+C ______
+C
+C Packs values given in KSEC2 into KGRIB and updates bit
+C pointer KNSPT.
+C
+C Externals
+C _________
+C
+C CSGNBT - Set the sign bit.
+C INXBIT - Insert bit data.
+C
+C
+C AUTHOR
+C ______
+C
+C J. Clochard, Meteo France, for ECMWF - October 2000.
+C (derived from ELLSEC2)
+C
+C MODIFICATIONS
+C _____________
+C
+C J. Clochard, June 2008.
+C Use of GRPRSM instead of standard output in error/debug printouts.
+C Doctorize all dummy-arguments (K for integers, O for logicals).
+C Return-code set to 810 for errors on final padding.
+C Do not enforce Di/j increments to missing values when resolution
+C flag is off.
+C----<
+C _______________________________________________________
+C
+C Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+C Parameters
+C
+ INTEGER JP16SET, JP24SET
+ PARAMETER ( JP16SET = 2**16 - 1 )
+C ^---> 65535 = FFFF(hex)
+ PARAMETER ( JP24SET = 2**24 - 1 )
+C ^---> 16777215 = FFFFFF(hex)
+C Function arguments
+C
+ INTEGER KGRIB,KLENG,KNSPT,KSEC0,KSEC2,KBITS, JLOOP
+ DIMENSION KGRIB(*),KSEC0(*),KSEC2(*)
+ LOGICAL OQUASI
+C
+C Global variables
+C
+#include "grprs.h"
+C
+C Local variables
+C
+ INTEGER ILALO(2), IRET, IRESOL, IZERO
+ SAVE IZERO
+ DATA IZERO /0/
+C
+C _______________________________________________________
+C
+C Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ EMESEC2 = 0
+C
+C _______________________________________________________
+C
+C Section 2. Pack section 2 octets.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Octets 7 - 8 : Ni - number of points along a parallel.
+C Octets 9 - 10 : Nj - number of points along a meridian.
+C Two 16 bit fields.
+C
+C WARNING!!
+C For quasi-regular grids, it is here assumed that Ni is variable,
+C i.e. that the number of points along a parallel is variable but
+C that the number of points along a meridian is fixed.
+C
+C For quasi-regular grids Ni is set to all 1 bits, as
+C the number of points is different on different parallels.
+C
+C Set to all 1 bits.
+C
+ IF( OQUASI ) KSEC2(2) = JP16SET
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC2(2),2,KBITS, 16,'C',IRET)
+ IF( IRET.NE.0) THEN
+ EMESEC2 = 1
+ WRITE(GRPRSM,*) 'EMESEC2: Error inserting number of pts'
+ WRITE(GRPRSM,*) 'EMESEC2: along parallel or meridian.'
+ WRITE(GRPRSM,*) 'EMESEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octets 11 - 13 : La1 - latitude of first grid point.
+C Octets 14 - 16 : Lo1 - longitude of first grid point.
+C Two 24 bit fields.
+C
+C Set sign bit to 1, if value is negative.
+C
+ CALL CSGNBT( ILALO(1), KSEC2(4), 24, IRET)
+ CALL CSGNBT( ILALO(2), KSEC2(5), 24, IRET)
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ILALO,2,KBITS, 24,'C',IRET)
+ IF( IRET.NE.0) THEN
+ EMESEC2 = 1
+ WRITE(GRPRSM,*) 'EMESEC2: Error inserting'
+ WRITE(GRPRSM,*)
+ X 'EMESEC2: latitude or longitude of first grid pt.'
+ WRITE(GRPRSM,*) 'EMESEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octet 17 : Resolution and components flag.
+C One 8 bit field.
+C
+ IRESOL = KSEC2(6)+KSEC2(18)+KSEC2(19)
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,IRESOL,1,KBITS, 8,'C',IRET)
+ IF( IRET.NE.0) THEN
+ EMESEC2 = 1
+ WRITE(GRPRSM,*) 'EMESEC2: Error inserting'
+ WRITE(GRPRSM,*) 'EMESEC2: components flag.'
+ WRITE(GRPRSM,*) 'EMESEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octets 18 - 20 : La2 - latitude of last grid point.
+C Octets 21 - 23 : Lo2 - longitude of last grid point.
+C Two 24 bit fields.
+C
+C Set sign bit to 1, if value is negative.
+C
+ CALL CSGNBT( ILALO(1), KSEC2(7), 24, IRET)
+ CALL CSGNBT( ILALO(2), KSEC2(8), 24, IRET)
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ILALO,2,KBITS, 24,'C',IRET)
+ IF( IRET.NE.0) THEN
+ EMESEC2 = 1
+ WRITE(GRPRSM,*) 'EMESEC2: Error inserting'
+ WRITE(GRPRSM,*) 'EMESEC2: latitude/longitude of last grid point'
+ WRITE(GRPRSM,*) 'EMESEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octets 24 - 26 : Latin - latitude(s) at which the Mercator
+C projection cylinder intersects the Earth.
+C One 24 bit field.
+C
+C Set sign bit to 1, if value is negative.
+C
+ CALL CSGNBT( ILALO(1), KSEC2(9), 24, IRET)
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,ILALO,1,KBITS, 24,'C',IRET)
+ IF( IRET.NE.0) THEN
+ EMESEC2 = 1
+ WRITE(GRPRSM,*) 'EMESEC2: Error inserting'
+ WRITE(GRPRSM,*) 'EMESEC2: latitude of intersection.'
+ WRITE(GRPRSM,*) 'EMESEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octet 27 : Reserved. Set to zero.
+C One 8 bit field.
+C
+Ce Set bits to 0.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT, IZERO, 1,KBITS, 8,'C',IRET)
+ IF( IRET.NE.0) THEN
+ EMESEC2 = 1
+ WRITE(GRPRSM,*) 'EMESEC2: Error inserting dummy zero.'
+ WRITE(GRPRSM,*) 'EMESEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octet 28 : Scanning mode flags.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC2(11),1,KBITS, 8,'C',IRET)
+ IF( IRET.NE.0) THEN
+ EMESEC2 = 1
+ WRITE(GRPRSM,*) 'EMESEC2: Error inserting'
+ WRITE(GRPRSM,*) 'EMESEC2: scanning mode flags.'
+ WRITE(GRPRSM,*) 'EMESEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Fix-up for flag which was different in Experimental Edition.
+C
+ IF( KSEC0(2).EQ.-1.AND.KSEC2(11).EQ.1) KSEC2(11) = 0
+C
+C Octets 29 - 31 : Di - i direction increment.
+C One 24 bit field.
+C
+C For quasi-regular grids all Di bits are set to 1, as
+C the increment is different on different parallels.
+C
+C If field not given, set to all bits to 1.
+C
+Ce Set to all 1 bits.
+ IF( OQUASI) KSEC2(13) = JP24SET
+Ce
+Ce If increments not given, set all bits to 1.
+Ce IF( KSEC2(6).EQ.0) KSEC2(13) = JP24SET
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC2(13),1,KBITS, 24,'C',IRET)
+ IF( IRET.NE.0) THEN
+ EMESEC2 = 1
+ WRITE(GRPRSM,*) 'EMESEC2: Error inserting'
+ WRITE(GRPRSM,*) 'EMESEC2: i direction increment.'
+ WRITE(GRPRSM,*) 'EMESEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octets 32 - 34 : Dj - j direction increment.
+C One 24 bit field.
+C
+C If field not given, set to all bits to 1.
+C
+C IF( KSEC2(6).EQ.0) KSEC2(14) = JP24SET
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT,KSEC2(14),1,KBITS, 24,'C',IRET)
+ IF( IRET.NE.0) THEN
+ EMESEC2 = 1
+ WRITE(GRPRSM,*) 'EMESEC2: Error inserting'
+ WRITE(GRPRSM,*) 'EMESEC2: j direction increment.'
+ WRITE(GRPRSM,*) 'EMESEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octets 35 - 42 : Reserved.
+C Eight 8 bit fields.
+C
+Ce Set bits to 0.
+C
+ DO 221 JLOOP = 1, 8
+C
+ CALL INXBIT(KGRIB,KLENG,KNSPT, IZERO, 1,KBITS, 8,'C',IRET)
+ IF( IRET.NE.0) THEN
+ IRET = 810
+ EMESEC2 = IRET
+ WRITE(GRPRSM,*) 'EMESEC2: Error inserting dummy zero.'
+ WRITE(GRPRSM,*) 'EMESEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+ 221 CONTINUE
+C
+C _______________________________________________________
+C
+C Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/gribex/emoscyc.F b/gribex/emoscyc.F
new file mode 100755
index 0000000..5a6c80a
--- /dev/null
+++ b/gribex/emoscyc.F
@@ -0,0 +1,154 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION EMOSCYC(KONOFF,KCYCLES)
+C
+C---->
+C**** EMOSCYC
+C
+C Purpose
+C -------
+C
+C Returns current EMOS_CYCLE version number.
+C
+C
+C Interface
+C ---------
+C
+C INUM = EMOSCYC(KONOFF,KCYCLES)
+C
+C Input
+C -----
+C
+C KONOFF - switch for displayed message
+C = 0 if display is required on the first call
+C = non-zero if display is not required
+C
+C
+C Output
+C ------
+C
+C Returns a 6-digit version number, aaabbc, where:
+C aaa = 3-digit major number
+C bb = 2-digit minor number
+C c = 1-digit spare number (normally 0)
+C
+C KCYCLES(1) = INTP_CYCLE number
+C KCYCLES(2) = BUFR_CYCLE number
+C KCYCLES(3) = GRIB_CYCLE number
+C KCYCLES(4) = PBIO_CYCLE number
+C
+C
+C Method
+C ------
+C
+C Reads a 6-digit version number from the environment variable
+C EMOS_CYCLE. If this does not give a 6-digit number, an internal
+C hard-coded default value is used.
+C
+C On the first call, the function (optionally) displays a message:
+C
+C **************************************
+C * EMOS_CYCLE version number = nnnnnn *
+C * INTP_CYCLE = iiiiii
+C * BUFR_CYCLE = bbbbbb
+C * GRIB_CYCLE = gggggg
+C * PBIO_CYCLE = pppppp
+C **************************************
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF May 1998
+C
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0. Variables.
+C ------------------------------------------------------------------
+C
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Function arguments
+C
+ INTEGER KONOFF, KCYCLES(4)
+C
+C Local variables
+C
+ INTEGER INUMBER, ICOUNT, IOFFSET
+ SAVE INUMBER, ICOUNT
+ CHARACTER*38 CMESS
+ CHARACTER*20 YNUMBER
+C
+C Externals
+C
+ INTEGER INTPNUM, BUFRNUM, GRIBNUM, PBIONUM
+C
+ DATA INUMBER/100000/, ICOUNT/0/
+ DATA CMESS/'* EMOS_CYCLE version number = ****** *'/
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF( ICOUNT.EQ.0 ) THEN
+C
+C See if the environment variable has an override value
+C
+ CALL GETENV( 'EMOS_CYCLE', YNUMBER)
+ IOFFSET = INDEX( YNUMBER, ' ')
+ IF( IOFFSET.EQ.7 ) THEN
+ READ(YNUMBER,'(I6.6)') INUMBER
+ ENDIF
+C
+ KCYCLES(1) = INTPNUM(1)
+ KCYCLES(2) = BUFRNUM(1)
+ KCYCLES(3) = GRIBNUM(1)
+ KCYCLES(4) = PBIONUM(1)
+C
+C First time through, display the message if required
+C
+ IF( KONOFF.EQ.0 ) THEN
+ WRITE(CMESS(31:36),'(I6.6)') INUMBER
+ WRITE(GRPRSM,*) '**************************************'
+ WRITE(GRPRSM,*) CMESS
+ CMESS(3:6) = 'INTP'
+ WRITE(CMESS(31:36),'(I6.6)') KCYCLES(1)
+ WRITE(GRPRSM,*) CMESS
+ CMESS(3:6) = 'BUFR'
+ WRITE(CMESS(31:36),'(I6.6)') KCYCLES(2)
+ WRITE(GRPRSM,*) CMESS
+ CMESS(3:6) = 'GRIB'
+ WRITE(CMESS(31:36),'(I6.6)') KCYCLES(3)
+ WRITE(GRPRSM,*) CMESS
+ CMESS(3:6) = 'PBIO'
+ WRITE(CMESS(31:36),'(I6.6)') KCYCLES(4)
+ WRITE(GRPRSM,*) CMESS
+ WRITE(GRPRSM,*) '**************************************'
+ ENDIF
+ ICOUNT = 1
+ ENDIF
+C
+ EMOSCYC = INUMBER
+C
+ RETURN
+ END
diff --git a/gribex/emoslibVersion.c b/gribex/emoslibVersion.c
new file mode 100755
index 0000000..77bed79
--- /dev/null
+++ b/gribex/emoslibVersion.c
@@ -0,0 +1,15 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+/*
+// Creates a global variable which is visible using 'nm'.
+*/
+extern char * LIBEMOS_000200 = "LIBEMOS_000200";
diff --git a/gribex/eocsec2.F b/gribex/eocsec2.F
new file mode 100755
index 0000000..81234ff
--- /dev/null
+++ b/gribex/eocsec2.F
@@ -0,0 +1,176 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION EOCSEC2(KGRIB,KLENG,INSPT,KSEC2,IBITS)
+C
+C---->
+C**** EOCSEC2P
+C
+C PURPOSE
+C _______
+C
+C Encodes GRIB section 2 values for ECMWF ocean fields.
+C
+C INTERFACE
+C _________
+C
+C IRET = EOCSEC2(KGRIB,KLENG,INSPT,KSEC2,IBITS)
+C
+C Input parameters
+C ________________
+C
+C KGRIB - GRIB product built so far (upto octet 6).
+C KLENG - Length of KGRIB.
+C INSPT - Bit position of GRIB product built so far.
+C KSEC2 - GRIB section 2 description.
+C IBITS - Number of bits per element in KGRIB.
+C
+C
+C Output parameters
+C ________________
+C
+C KGRIB - Updated GRIB product to end of section 2.
+C INSPT - Updated bit position of GRIB product built so far.
+C IRET - Function return status code, 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Packs values given in KSEC2 into KGRIB and updates bit
+C pointer INSPT.
+C
+#include "eocsec2.h"
+C
+C Externals
+C _________
+C
+C CSGNBT - Set the sign bit.
+C INXBIT - Insert bit data.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF February 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JP16SET
+ PARAMETER ( JP16SET = 2**16 - 1 )
+C ^---> 65535 = FFFF(hex)
+C
+C Function arguments
+C
+ INTEGER KGRIB,KLENG,INSPT,KSEC2,IBITS
+ DIMENSION KGRIB(*),KSEC2(*)
+C
+C Local variables
+C
+ INTEGER IRET, ILOOP
+C
+C _______________________________________________________
+C
+C Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ EOCSEC2 = 0
+C
+C _______________________________________________________
+C
+C Section 2. Pack section 2 octets.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C
+C Octets 7 - 8 : Ni - number of points along a parallel.
+C Octets 9 - 10 : Nj - number of points along a meridian.
+C Two 16 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(2),2,IBITS, 16,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EOCSEC2 = 1
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: number of pts along first or second axis.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octets 11 - 27 : Reserved.
+C
+C Fill reserved octets with 0.
+C
+ DO ILOOP = 1,17
+ CALL INXBIT(KGRIB,KLENG,INSPT, 0, 1,IBITS, 8,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EOCSEC2 = 1
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting dummy zero.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', IRET
+ GO TO 900
+ ENDIF
+ ENDDO
+C
+C Octet 28 : Scanning mode flags.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(11),1,IBITS, 8,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EOCSEC2 = 1
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: scanning mode flags.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octets 29 - 32 : Reserved.
+C
+C Fill reserved octets with 0.
+C
+ DO ILOOP = 1,4
+ CALL INXBIT(KGRIB,KLENG,INSPT, 0, 1,IBITS, 8,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EOCSEC2 = 1
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting dummy zero.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', IRET
+ GO TO 900
+ ENDIF
+ ENDDO
+C
+C _______________________________________________________
+C
+C Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/gribex/eocsec2.h b/gribex/eocsec2.h
new file mode 100755
index 0000000..35400ff
--- /dev/null
+++ b/gribex/eocsec2.h
@@ -0,0 +1,42 @@
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C
+C ECMWF ocean data GRIB section 2
+C -------------------------------
+C
+C Octet KSEC2(n)
+C ----- --------
+C
+C 1-3 - Length of section
+C
+C 4 - Not used: set to zero
+C
+C 5 - 255 (all bits set to 1)
+C
+C 6 1 Data representation type = 192 = ECMWF ocean grid
+C
+C 7-8 2 Ni - number of points along the first axis
+C (32767 = not used)
+C
+C 9-10 3 Nj - number of points along the second axis
+C (32767 = not used)
+C
+C 11-27 - Not used: set to zero
+C
+C - 4-10 Reserved. Set to 0.
+C
+C 28 11 Scanning mode flags (see WMO code table 8)
+C
+C 29-32 - Not used: set to zero
+C
+C - 12-22 Reserved. Set to 0.
+C
+C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
diff --git a/gribex/epssec2.F b/gribex/epssec2.F
new file mode 100755
index 0000000..3d07fc0
--- /dev/null
+++ b/gribex/epssec2.F
@@ -0,0 +1,246 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION EPSSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS)
+C
+C---->
+C**** EPSSEC2P
+C
+C PURPOSE
+C _______
+C
+C Encodes GRIB section 2 values for polar stereographic fields.
+C
+C INTERFACE
+C _________
+C
+C IRET = EPSSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS)
+C
+C Input parameters
+C ________________
+C
+C KGRIB - GRIB product built so far (upto octet 6).
+C KLENG - Length of KGRIB.
+C INSPT - Bit position of GRIB product built so far.
+C KSEC0 - GRIB section 0 description.
+C KSEC2 - GRIB section 2 description.
+C IBITS - Number of bits per element in KGRIB.
+C
+C
+C Output parameters
+C ________________
+C
+C KGRIB - Updated GRIB product to end of section 2.
+C INSPT - Updated bit position of GRIB product built so far.
+C IRET - Function return status code, 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Packs values given in KSEC2 into KGRIB and updates bit
+C pointer INSPT.
+C
+C Externals
+C _________
+C
+C CSGNBT - Set the sign bit.
+C INXBIT - Insert bit data.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF February 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JP16SET
+ PARAMETER ( JP16SET = 2**16 - 1 )
+C ^---> 65535 = FFFF(hex)
+C
+C Function arguments
+C
+ INTEGER KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS
+ DIMENSION KGRIB(*),KSEC0(*),KSEC2(*)
+C
+C Local variables
+C
+ INTEGER ILALO(2), IRET, IRESOL
+C
+C _______________________________________________________
+C
+C Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ EPSSEC2 = 0
+C
+C _______________________________________________________
+C
+C Section 2. Pack section 2 octets.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Octets 7 - 8 : Ni - number of points along X-axis.
+C Octets 9 - 10 : Nj - number of points along Y-axis.
+C Two 16 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(2),2,IBITS, 16,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EPSSEC2 = 1
+ WRITE(GRPRSM,*) 'EPSSEC2: Error inserting'
+ WRITE(GRPRSM,*) 'EPSSEC2: number of points along X or Y axis.'
+ WRITE(GRPRSM,*) 'EPSSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 11 - 13 : La1 - latitude of first grid point.
+C Octets 14 - 16 : Lo1 - longitude of first grid point.
+C Two 24 bit fields.
+C
+ CALL CSGNBT( ILALO(1), KSEC2(4), 24, IRET)
+ CALL CSGNBT( ILALO(2), KSEC2(5), 24, IRET)
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EPSSEC2 = 1
+ WRITE(GRPRSM,*) 'EPSSEC2: Error inserting'
+ WRITE(GRPRSM,*)
+ X 'EPSSEC2: latitude or longitude of first grid pt.'
+ WRITE(GRPRSM,*) 'EPSSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octet 17 : Resolution and components flag.
+C One 8 bit field.
+C
+C Resolution flag ( KSEC2(6) ) is not applicable.
+C
+ KSEC2(6) = 0
+ IRESOL = KSEC2(18)+KSEC2(19)
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IRESOL,1,IBITS, 8,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EPSSEC2 = 1
+ WRITE(GRPRSM,*) 'EPSSEC2: Error inserting'
+ WRITE(GRPRSM,*) 'EPSSEC2: components flag.'
+ WRITE(GRPRSM,*) 'EPSSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(6),1,IBITS, 8,'C',IRET)
+C IF( IRET.NE.0 ) THEN
+C EPSSEC2 = 1
+C WRITE(GRPRSM,*) 'EPSSEC2: Error inserting'
+C WRITE(GRPRSM,*) 'EPSSEC2: components flag.'
+C WRITE(GRPRSM,*) 'EPSSEC2: Return code = ', IRET
+C GOTO 900
+C ENDIF
+C
+C Octets 18 - 20 : LoV - orientation of the grid.
+C One 24 bit field.
+C
+C Set sign bit to 1 if value is negative.
+C
+ CALL CSGNBT( ILALO(1), KSEC2(7), 24, IRET)
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),1,IBITS, 24,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EPSSEC2 = 1
+ WRITE(GRPRSM,*) 'EPSSEC2: Error inserting'
+ WRITE(GRPRSM,*)
+ X 'EPSSEC2: latitude or longitude of last grid point.'
+ WRITE(GRPRSM,*) 'EPSSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 21 - 23 : Dx - X direction grid length.
+C Octets 24 - 26 : Dy - Y direction grid length.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(9),2,IBITS, 24,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EPSSEC2 = 1
+ WRITE(GRPRSM,*) 'EPSSEC2: Error inserting'
+ WRITE(GRPRSM,*) 'EPSSEC2: X or Y axis grid length.'
+ WRITE(GRPRSM,*) 'EPSSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octet 27 : Projection centre flag.
+C One 8-bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(13),1,IBITS, 8,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EPSSEC2 = 1
+ WRITE(GRPRSM,*) 'EPSSEC2: Error inserting'
+ WRITE(GRPRSM,*) 'EPSSEC2: Projection centre flag.'
+ WRITE(GRPRSM,*) 'EPSSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octet 28 : Scanning mode flags.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(11),1,IBITS, 8,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EPSSEC2 = 1
+ WRITE(GRPRSM,*) 'EPSSEC2: Error inserting'
+ WRITE(GRPRSM,*) 'EPSSEC2: scanning mode flags.'
+ WRITE(GRPRSM,*) 'EPSSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Fix-up for flag which was different in Experimental Edition.
+ IF( KSEC0(2).EQ.-1.AND.KSEC2(11).EQ.1) KSEC2(11) = 0
+C
+C Octets 29 - 32 : Reserved.
+C Two 16 bit fields.
+C
+C Set bits to 0.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT, 0, 1,IBITS, 32,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ EPSSEC2 = 1
+ WRITE(GRPRSM,*) 'EPSSEC2: Error inserting dummy zero.'
+ WRITE(GRPRSM,*) 'EPSSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C _______________________________________________________
+C
+C Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/gribex/eshsec2.F b/gribex/eshsec2.F
new file mode 100755
index 0000000..59fb62a
--- /dev/null
+++ b/gribex/eshsec2.F
@@ -0,0 +1,164 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION ESHSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS)
+C
+C---->
+C**** ESHSEC2P
+C
+C PURPOSE
+C _______
+C
+C Encodes GRIB section 2 values for spherical harmonic fields.
+C
+C INTERFACE
+C _________
+C
+C IRET = ESHSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS)
+C
+C Input parameters
+C ________________
+C
+C KGRIB - GRIB product built so far (upto octet 6).
+C KLENG - Length of KGRIB.
+C INSPT - Bit position of GRIB product built so far.
+C KSEC0 - GRIB section 0 description.
+C KSEC2 - GRIB section 2 description.
+C IBITS - Number of bits per element in KGRIB.
+C
+C
+C Output parameters
+C ________________
+C
+C KGRIB - Updated GRIB product to end of section 2.
+C INSPT - Updated bit position of GRIB product built so far.
+C IRET - Function return status code, 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Packs values given in KSEC2 into KGRIB and updates bit
+C pointer INSPT.
+C
+C Externals
+C _________
+C
+C CSGNBT - Set the sign bit.
+C INXBIT - Insert bit data.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF February 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JP16SET
+ PARAMETER ( JP16SET = 2**16 - 1 )
+C ^---> 65535 = FFFF(hex)
+C
+C Function arguments
+C
+ INTEGER KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS
+ DIMENSION KGRIB(*),KSEC0(*),KSEC2(*)
+C
+C Local variables
+C
+ INTEGER IRET, ILOOP
+C
+C _______________________________________________________
+C
+C Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ ESHSEC2 = 0
+C
+C _______________________________________________________
+C
+C Section 2. Pack section 2 octets.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Octets 7 - 8 : J pentagonal resolution parameter.
+C Octets 9 - 10 : K pentagonal resolution parameter.
+C Octets 11 - 12 : M pentagonal resolution parameter.
+C Three 16 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(2),3,IBITS, 16,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ESHSEC2 = 1
+ WRITE(GRPRSM,*) 'ESHSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'ESHSEC2: J,K,M pentagonal resolution parameters.'
+ WRITE(GRPRSM,*) 'ESHSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C Octet 13 : Representation type.
+C Octet 14 : Representation mode.
+C Two 8 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(5),2,IBITS, 8,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ESHSEC2 = 1
+ WRITE(GRPRSM,*) 'ESHSEC2: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'ESHSEC2: representation type or mode.'
+ WRITE(GRPRSM,*) 'ESHSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+C
+C
+C Octets 15 - 32 : Reserved.
+C Nine 16 bit fields.
+C
+C Fill reserved octets with 0.
+C
+ DO ILOOP = 1,9
+ CALL INXBIT(KGRIB,KLENG,INSPT, 0, 1,IBITS, 16,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ESHSEC2 = 1
+ WRITE(GRPRSM,*) 'ESHSEC2: Error inserting dummy zero.'
+ WRITE(GRPRSM,*) 'ESHSEC2: Return code = ', IRET
+ GO TO 900
+ ENDIF
+ ENDDO
+C
+C _______________________________________________________
+C
+C Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/gribex/esvsec2.F b/gribex/esvsec2.F
new file mode 100755
index 0000000..a7e7429
--- /dev/null
+++ b/gribex/esvsec2.F
@@ -0,0 +1,251 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION ESVSEC2(KGRIB,KLENG,INSPT,KSEC2,IBITS,ILEN2)
+C
+C---->
+C**** ESVSEC2
+C
+C PURPOSE
+C _______
+C
+C Encodes GRIB section 2 values for space view perspective or
+C orthographic grid fields.
+C
+C INTERFACE
+C _________
+C
+C IRET = ESVSEC2(KGRIB,KLENG,INSPT,KSEC2,IBITS)
+C
+C Input parameters
+C ________________
+C
+C KGRIB - GRIB product built so far (upto octet 6).
+C KLENG - Length of KGRIB.
+C INSPT - Bit position of GRIB product built so far.
+C KSEC2 - GRIB section 2 description.
+C IBITS - Number of bits per element in KGRIB.
+C ILEN2 - Length in bytes of section 2
+C
+C
+C Output parameters
+C ________________
+C
+C KGRIB - Updated GRIB product to end of section 2.
+C INSPT - Updated bit position of GRIB product built so far.
+C IRET - Function return status code, 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Packs values given in KSEC2 into KGRIB and updates bit
+C pointer INSPT.
+C
+C Externals
+C _________
+C
+C CSGNBT - Set the sign bit.
+C INXBIT - Insert bit data.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF February 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+C
+C Function arguments
+C
+ INTEGER KGRIB,KLENG,INSPT,KSEC2,IBITS,ILEN2
+ DIMENSION KGRIB(*),KSEC2(*)
+C
+C Local variables
+C
+ INTEGER ILALO(2), IRET, IRESOL, IZERO, LOOP
+ DATA IZERO/0/
+C
+C _______________________________________________________
+C
+C Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ ESVSEC2 = 0
+C
+C _______________________________________________________
+C
+C Section 2. Pack section 2 octets.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Octets 7 - 8 : Nx - number of points along X-axis.
+C Octets 9 - 10 : Ny - number of points along Y-axis.
+C Two 16 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(2),2,IBITS, 16,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ESVSEC2 = 1
+ WRITE(GRPRSM,*) 'ESVSEC2: Error inserting'
+ WRITE(GRPRSM,*) 'ESVSEC2: number of points along X or Y axis.'
+ WRITE(GRPRSM,*) 'ESVSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 11 - 13 : Lap - latitude of sub-satellite point.
+C Octets 14 - 16 : Lop - longitude of sub-satellite point.
+C Two 24 bit fields.
+C
+C Set sign bit to 1, if value is negative.
+C
+ CALL CSGNBT( ILALO(1), KSEC2(4), 24, IRET)
+ CALL CSGNBT( ILALO(2), KSEC2(5), 24, IRET)
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ESVSEC2 = 1
+ WRITE(GRPRSM,*) 'ESVSEC2: Error inserting'
+ WRITE(GRPRSM,*)
+ X 'ESVSEC2: latitude/longitude of sub-satellite pt.'
+ WRITE(GRPRSM,*) 'ESVSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octet 17 : Resolution and components flag.
+C One 8 bit field.
+C
+C Resolution flag ( KSEC2(6) ) is not applicable.
+C
+ IRESOL = KSEC2(18)+KSEC2(19)
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IRESOL,1,IBITS, 8,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ESVSEC2 = 1
+ WRITE(GRPRSM,*) 'ESVSEC2: Error inserting'
+ WRITE(GRPRSM,*) 'ESVSEC2: components flag.'
+ WRITE(GRPRSM,*) 'ESVSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 18 - 20 : dx Apparent diameter of earth in grid
+C lengths in x direction.
+C Octets 21 - 23 : dy Apparent diameter of earth in grid
+C lengths in y direction.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(7),2,IBITS, 24,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ESVSEC2 = 1
+ WRITE(GRPRSM,*) 'ESVSEC2: Error inserting'
+ WRITE(GRPRSM,*) 'ESVSEC2: number of points along X or Y axis.'
+ WRITE(GRPRSM,*) 'ESVSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 24 - 25 : Xp X-coordinate of sub-satellite point.
+C Octets 26 - 27 : Yp Y-coordinate of sub-satellite point.
+C Two 16 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(9),2,IBITS, 16,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ESVSEC2 = 1
+ WRITE(GRPRSM,*) 'ESVSEC2: Error inserting'
+ WRITE(GRPRSM,*)
+ X 'ESVSEC2: X or Y coordinate of sub-satellite point.'
+ WRITE(GRPRSM,*) 'ESVSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octet 28 : Scanning mode flags.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(11),1,IBITS, 8,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ESVSEC2 = 1
+ WRITE(GRPRSM,*) 'ESVSEC2: Error inserting'
+ WRITE(GRPRSM,*) 'ESVSEC2: scanning mode flags.'
+ WRITE(GRPRSM,*) 'ESVSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 29 - 31 : The orientation of the grid.
+C Octets 32 - 34 : nr the altitude of the camera.
+C Two 24 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(13),2,IBITS, 24,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ESVSEC2 = 1
+ WRITE(GRPRSM,*) 'ESVSEC2: Error inserting'
+ WRITE(GRPRSM,*)
+ X 'ESVSEC2: orientation of the grid or camera angle.'
+ WRITE(GRPRSM,*) 'ESVSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 35 - 36 : Xo - X coordinate of origin of sector image.
+C Octets 37 - 38 : Yo - Y coordinate of origin of sector image.
+C Two 16 bit fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(15),2,IBITS, 16,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ ESVSEC2 = 1
+ WRITE(GRPRSM,*) 'ESVSEC2: Error inserting'
+ WRITE(GRPRSM,*)
+ X 'ESVSEC2: X or Y coordinates of origin of sector.'
+ WRITE(GRPRSM,*) 'ESVSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+C
+C Octets 39 - 40 : Reserved (ECMWF).
+C Octets 39 - 44 : Reserved (GRIB specification).
+C
+C Fill reserved octets with 0.
+C
+ DO LOOP = 1, (ILEN2 - 38)
+ CALL INXBIT(KGRIB,KLENG,INSPT, IZERO, 1,IBITS, 8,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ IRET = 810
+ WRITE(GRPRSM,*) 'ESVSEC2: Error inserting dummy zero.'
+ WRITE(GRPRSM,*) 'ESVSEC2: Return code = ', IRET
+ GOTO 900
+ ENDIF
+ ENDDO
+C
+C _______________________________________________________
+C
+C Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/gribex/exscal.F b/gribex/exscal.F
new file mode 100755
index 0000000..f6578f6
--- /dev/null
+++ b/gribex/exscal.F
@@ -0,0 +1,140 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE EXSCAL (PDATA,KDATA,KLEN,PREF,PSCALE,LALLPOS)
+C
+C---->
+C**** EXSCAL - Vectorise calculation of values.
+C
+C Purpose.
+C --------
+C
+C Vectorise calculation of values.
+C
+C** Interface.
+C ----------
+C
+C CALL EXSCAL (PDATA,KDATA,KLEN,PREF,PSCALE,LALLPOS)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KDATA - Array of integer increments
+C KLEN - Number of values to be converted.
+C PREF - Reference value.
+C PSCALE - Scale factor.
+C LALLPOS - .TRUE. if all packed value occupies full (integer)
+C word, eg 32 bits on a 32-bit integer machine.
+C
+C Output Parameters.
+C -----------------
+C
+C PDATA - Array of floating point values.
+C
+C Method.
+C -------
+C
+C The reference value is added to each increment,
+C and the result is then multiplied by the scale factor.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes re GRIB representation.
+C
+C Comments.
+C --------
+C
+C PDATA and KDATA are really the same array. This routine
+C is just a device to force vectorisation on the Cray,
+C without the necessity of using another array.
+C
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 25.06.91
+C
+C
+C Modifications.
+C _____________
+C
+C J.D.Chambers ECMWF 06.09.95
+C Reverse processing in loop to run from last to first in
+C case reals are larger than integers.
+C
+C J.D.Chambers ECMWF 16.05.96
+C Handle case when packed value occupies full word.
+C
+C----<
+C -----------------------------------------------------------------
+C Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+ INTEGER KDATA
+ INTEGER KLEN
+ INTEGER LOOP
+ REAL PDATA
+ REAL PREF
+ REAL PSCALE
+ LOGICAL LALLPOS
+ DIMENSION PDATA(KLEN)
+ DIMENSION KDATA(KLEN)
+C
+ REAL*8 BIG, RTEMP
+ DATA BIG /4294967296.0/
+C
+C -----------------------------------------------------------------
+C* Section 1 . Calculation of values.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+#ifdef CRAY
+C
+ DO 110 LOOP = KLEN, 1, -1
+ PDATA(LOOP) = PREF + KDATA(LOOP)*PSCALE
+ 110 CONTINUE
+#else
+C
+ IF( .NOT. LALLPOS ) THEN
+ DO 110 LOOP = KLEN, 1, -1
+ PDATA(LOOP) = PREF + KDATA(LOOP)*PSCALE
+ 110 CONTINUE
+C
+C Packed values use all bits in integer word, ie sign bit is
+C really a data bit.
+ ELSE
+ DO 120 LOOP = KLEN, 1, -1
+ IF( KDATA(LOOP) .GE. 0 ) THEN
+ PDATA(LOOP) = PREF + KDATA(LOOP)*PSCALE
+ ELSE
+ RTEMP = BIG + DBLE(KDATA(LOOP))
+ PDATA(LOOP) = PREF + RTEMP*PSCALE
+ ENDIF
+ 120 CONTINUE
+ ENDIF
+#endif
+C
+C -----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/gribex/extmap.F b/gribex/extmap.F
new file mode 100755
index 0000000..1043e5e
--- /dev/null
+++ b/gribex/extmap.F
@@ -0,0 +1,464 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE EXTMAP (KGRIB,KLENG,KMAP1,KMAP2,KVALS,PSEC4,KSIZE,
+ X KBITS,KSBMAP,PMISS,KNUM,KPR,KRET,KNOMIS)
+C
+C---->
+C**** EXTMAP - Extraction of bit maps for routine GRIBEX.
+C
+C Purpose.
+C --------
+C
+C Extracts bit-maps (primary and secondary,if present)
+C from an array of GRIB coded data and inserts the
+C missing data value indicator in appropriate places in
+C the array of already unpacked data values.
+C
+C** Interface.
+C ----------
+C
+C CALL EXTMAP (KGRIB,KLENG,KMAP1,KMAP2,KVALS,PSEC4,KSIZE,KBITS,
+C X KSBMAP,PMISS,KNUM,KPR,KRET,KNOMIS)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KGRIB - Array from which data is being unpacked
+C from GRIB code.
+C
+C KLENG - Length of this array.
+C
+C KMAP1 - Bit-pointer to start of primary bit-map
+C (Section 3 bitmap) in array KGRIB.
+C
+C KMAP2 - Bit-pointer to start of secondary bitmap
+C (Section 4 bitmap) in array KGRIB.
+C Negative value if no secondary bit maps.
+C
+C KVALS - Number of unpacked values in PSEC4 on entry
+C
+C PSEC4 - Array of data values unpacked from GRIB code.
+C
+C KSIZE - Number of bits in the primary bit map.
+C
+C KBITS - Number of bits in computer word.
+C
+C PMISS - Value to be used to indicate missing data
+C in array PSEC4.
+C
+C KNUM - Number of values at each grid point. This
+C is normally 1 except when a matrix of value
+C is represented.
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C Output Parameters.
+C ------------------
+C
+C KSBMAP - Bit-map flag.
+C -2 , All bits in the bit-map set to 1.
+C There is no missing data.
+C -4 , Some points have no data. User
+C supplied value for missing data
+C indicator in appropriate places in
+C the array PSEC4.
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Error in routine INXBIT.
+C 4 , Number of values at each grid point (KNUM)
+C is greater than allowed (JPWORK).
+C
+C KNOMIS - Number of non-missing values in PSEC4 entry.
+C
+C
+C Method.
+C -------
+C
+C The bit-map contains 1 where valid data exists and 0
+C where data is missing. The corresponding data array
+C contains valid data and the missing data indicator value.
+C
+C Externals.
+C ----------
+C
+C INXBIT - Extract values from bit-stream
+C
+C Reference.
+C ----------
+C
+C See routine GRIBEX.
+C
+C Comments.
+C ---------
+C
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 10:07:92
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 29:10:92
+C Maximum sizes increased to allow for packing of
+C 2D spectra.
+C Number of data values 120*61*12*25
+C
+C J.D.Chambers ECMWF 09:03:94
+C Maximum size for bitmap array increased to 132000
+C to allow for products 0.5 * 0.5 degrees, whole
+C hemisphere (N or S).
+C
+C J.D.Chambers ECMWF 18:04:94
+C Fix setting of missing values according to bitmap
+C
+C J.D.Chambers ECMWF 19:07:94
+C Maximum size for bitmap array increased to 140000
+C for reduced gaussian n160.
+C
+C J.D.Chambers ECMWF 23.05.95
+C Use dynamic allocation for secondary bitmap
+C Process primary bitmap in small pieces. Use PSEC4
+C for expanding data using bitmaps.
+C
+C J.D.Chambers ECMWF 24.10.96
+C Use fixed allocation for secondary bitmap
+C Process primary bitmap in small pieces. Use PSEC4
+C
+C J. Clochard, METEO FRANCE, for ECMWF - January 1998.
+C Dummy-argument KNOMIS added.
+C Strips size (JPWORK) enlarged to 10000.
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JPWORK
+ PARAMETER (JPWORK=10000)
+C
+C Subroutine arguments
+C
+ INTEGER KBITS, KGRIB, KLENG, KMAP1, KMAP2, KNUM, KVALS, KNOMIS
+ DIMENSION KGRIB(*)
+ INTEGER KPR, KRET, KSBMAP, KSIZE
+ REAL PMISS, PSEC4
+ DIMENSION PSEC4(*)
+C
+C Local variables
+C
+ INTEGER ICURR, IPT, LENGTH
+ INTEGER JLOOP, JLOOPI, NEXT, IMANY, NABITS, NBITS, NVALS, MYMAP1
+ LOGICAL LMOPT
+C
+ INTEGER IMAP1
+ DIMENSION IMAP1(JPWORK)
+C
+C Work array.
+C
+ INTEGER IMAP2
+ DIMENSION IMAP2(JPWORK)
+C
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF( KPR.GE.1 ) THEN
+ WRITE(GRPRSM,*) 'EXTMAP: Section 1.'
+ WRITE(GRPRSM,*) 'EXTMAP: Input values used -'
+ WRITE(GRPRSM,*) 'EXTMAP: KSIZE,KNUM = ', KSIZE,KNUM
+ WRITE(GRPRSM,*) 'EXTMAP: KLENG,KMAP1,KMAP2,KBITS, PMISS = '
+ WRITE(GRPRSM,*) KLENG,KMAP1,KMAP2,KBITS, PMISS
+ WRITE(GRPRSM,*) 'EXTMAP: KVALS = ', KVALS
+ ENDIF
+C
+C Reset return code to 0.
+C
+ KRET = 0
+ KNOMIS = 0
+ NBITS = 0
+ NABITS = 0
+ LENGTH = KNUM
+C
+C Check there is enough space for unpacking secondary bitmap
+C
+ IF( LENGTH.GT.JPWORK ) THEN
+ WRITE(GRPRSM,*) 'EXTMAP: Number of values at each grid point'
+ WRITE(GRPRSM,*)
+ X 'EXTMAP: (KNUM) is greater than allowed (JPWORK).'
+ KRET = 4
+ GOTO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 2 . Handle 'M' option case
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C If the original field has been packed with the 'M' option,
+C have to find out how many true values there are in the field.
+C
+ LENGTH = KSIZE * KNUM
+ LMOPT = (KVALS.EQ.LENGTH)
+C
+ IF( LMOPT ) THEN
+C
+C Count the number of bits in the primary bitmap
+C
+ NEXT = 0
+ NVALS = 0
+ MYMAP1 = KMAP1
+C
+ 210 CONTINUE
+C
+C Unpack the primary bitmap in strips of JPWORK values
+C
+ NEXT = NEXT + JPWORK
+ IMANY = JPWORK
+C
+C Check whether end of primary bitmap reached.
+C Adjust if less than JPWORK values left to process
+C
+ IF( NEXT.GT.KSIZE ) IMANY = KSIZE + JPWORK - NEXT
+C
+C Unpack next strip of primary bitmap values.
+C
+ CALL INXBIT(KGRIB,KLENG,MYMAP1,IMAP1,IMANY,KBITS,1,'D',KRET)
+ IF( KRET.NE.0 ) THEN
+ WRITE(GRPRSM,*) 'EXTMAP: Error reported by routine INXBIT.'
+ KRET = 1
+ GO TO 900
+ ENDIF
+C
+C Work through the strip of primary bitmap values counting points
+C which are not missing.
+C
+ DO 220 JLOOP = 1,IMANY
+ IF( IMAP1(JLOOP).EQ.1 ) NVALS = NVALS + 1
+ 220 CONTINUE
+C
+C Loop back if more strips of primary bitmap to process
+C
+ IF( NEXT.LT.KSIZE ) GOTO 210
+C
+ ELSE
+C
+ NVALS = KVALS
+C
+ ENDIF
+C
+ IF( KPR.GE.1 ) THEN
+ WRITE(GRPRSM,*) 'EXTMAP: NVALS = ', NVALS
+ WRITE(GRPRSM,*) 'EXTMAP: KVALS = ', KVALS
+ WRITE(GRPRSM,*) 'EXTMAP: LENGTH = ', LENGTH
+ ENDIF
+C
+C Move input field to far end of input array
+C
+ IF( NVALS.LT.LENGTH ) THEN
+ ICURR = NVALS+1
+!OCL NOVREC
+ DO 230 JLOOP = LENGTH, LENGTH - NVALS + 1, -1
+ ICURR = ICURR - 1
+ PSEC4(JLOOP) = PSEC4(ICURR)
+ 230 CONTINUE
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 3 . Decoding of bit-map and data.
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF( KPR.GE.1 ) WRITE(GRPRSM,*) 'EXTMAP: Section 3.'
+C
+C* Set unoccupied values in array to missing data indicator.
+C
+ ICURR = LENGTH - NVALS
+ DO 310 JLOOP = 1, ICURR
+ PSEC4(JLOOP) = PMISS
+ 310 CONTINUE
+C
+C* Copy data to output array or insert missing data value
+C in accordance with the bit map values.
+C
+ ICURR = LENGTH - NVALS
+ IPT = 1
+ NEXT = 0
+C
+ 320 CONTINUE
+C
+C The primary bitmap is unpacked and used in strips of JPWORK values
+C
+ NEXT = NEXT + JPWORK
+ IMANY = JPWORK
+C
+C Check whether end of primary bitmap reached.
+C Adjust if less than JPWORK values left to process
+C
+ IF( NEXT.GT.KSIZE ) IMANY = KSIZE + JPWORK - NEXT
+C
+C Unpack next strip of primary bitmap values.
+C
+ CALL INXBIT(KGRIB,KLENG,KMAP1,IMAP1,IMANY,KBITS,1,'D',KRET)
+ IF( KRET.NE.0 ) THEN
+ WRITE(GRPRSM,*) 'EXTMAP: Error reported by routine INXBIT.'
+ KRET = 1
+ GO TO 900
+ ENDIF
+C
+C Work through the strip of primary bitmap values.
+C
+ IF(KMAP2.LE.0.AND.KNUM.EQ.1) THEN
+ IMAP2(1) = 1
+!OCL NOVREC
+ DO 325 JLOOP = 1,IMANY
+ IF( IMAP1(JLOOP).EQ.1 ) THEN
+ ICURR = ICURR + 1
+ PSEC4(IPT) = PSEC4(ICURR)
+ NABITS = NABITS + 1
+ ELSE
+ PSEC4(IPT) = PMISS
+ NBITS = NBITS + 1
+ ENDIF
+ IPT = IPT + 1
+ 325 CONTINUE
+C
+ ELSE
+C
+ DO 380 JLOOP = 1,IMANY
+C
+C If primary bitmap indicates there are values at the point ..
+C
+ IF( IMAP1(JLOOP).EQ.1 ) THEN
+C
+C .. read secondary bitmap, if any.
+C
+ IF( KMAP2.GT.0 ) THEN
+ CALL INXBIT(KGRIB,KLENG,KMAP2,IMAP2,KNUM,KBITS,1,'D',KRET)
+ IF( KRET.NE.0 ) THEN
+ WRITE(GRPRSM,*)
+ X 'EXTMAP: Error reported by routine INXBIT.'
+ KRET = 1
+ GO TO 900
+ ENDIF
+C
+ ELSE
+C
+C* If no secondary bitmaps present, set up dummy secondary
+C bitmap to indicate no missing data values.
+C
+ IF( KNUM.EQ.1 ) THEN
+ IMAP2(1) = 1
+ ICURR = ICURR + 1
+ PSEC4(IPT) = PSEC4(ICURR)
+ IPT = IPT + 1
+ NABITS = NABITS + 1
+ ELSE
+ DO 330 JLOOPI = 1,KNUM
+ IMAP2(JLOOPI) = 1
+ 330 CONTINUE
+ ENDIF
+C
+ ENDIF
+C
+C Use the bitmap to put in data value or missing data indicator.
+C
+ IF( KNUM.GT.1 ) THEN
+ DO 340 JLOOPI = 1,KNUM
+ IF( IMAP2(JLOOPI).EQ.1 ) NABITS = NABITS + 1
+ 340 CONTINUE
+C
+ DO 350 JLOOPI = 1,KNUM
+ IF( IMAP2(JLOOPI).NE.1 ) NBITS = NBITS + 1
+ 350 CONTINUE
+C
+ DO 360 JLOOPI = 1,KNUM
+ IF( IMAP2(JLOOPI).EQ.1 ) THEN
+ ICURR = ICURR + 1
+ PSEC4(IPT+JLOOPI-1) = PSEC4(ICURR)
+ ELSE
+ PSEC4(IPT+JLOOPI-1) = PMISS
+ ENDIF
+ 360 CONTINUE
+ IPT = IPT + KNUM
+C
+ ENDIF
+C
+C If primary bitmap indicates there are no values at the point ..
+C
+ ELSE
+ IF( KNUM.EQ.1 ) THEN
+ PSEC4(IPT) = PMISS
+ ELSE
+ DO 370 JLOOPI = 1,KNUM
+ PSEC4(IPT+JLOOPI-1) = PMISS
+ 370 CONTINUE
+ ENDIF
+ IPT = IPT + KNUM
+ NBITS = NBITS + KNUM
+ ENDIF
+C
+ 380 CONTINUE
+C
+ ENDIF
+C
+C Loop back if more strips of primary bitmap to process
+C
+ IF( NEXT.LT.KSIZE ) GOTO 320
+C
+C* Set bit-map flag.
+C
+ IF( NBITS.GT.0 ) THEN
+ KSBMAP = -4
+ ELSE
+ KSBMAP = -2
+ ENDIF
+C
+C* Return effective number of non-missing values.
+C
+ KNOMIS=NVALS
+C
+C ------------------------------------------------------------------
+C* Section 9 . Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) THEN
+ WRITE(GRPRSM,*) 'EXTMAP: Section 9.'
+ WRITE(GRPRSM,*) 'EXTMAP: NBITS = ', NBITS
+ WRITE(GRPRSM,*) 'EXTMAP: NABITS = ', NABITS
+ WRITE(GRPRSM,*) 'EXTMAP: NVALS = ', NVALS
+ WRITE(GRPRSM,*) 'EXTMAP: Output values set -'
+ WRITE(GRPRSM,*) 'EXTMAP: KNOMIS = ', KNOMIS
+ WRITE(GRPRSM,*) 'EXTMAP: KSIZE = ', KSIZE
+ WRITE(GRPRSM,*) 'EXTMAP: KSBMAP = ', KSBMAP
+ ENDIF
+C
+ RETURN
+ END
diff --git a/gribex/findLocalDefinitionFile.c b/gribex/findLocalDefinitionFile.c
new file mode 100755
index 0000000..74d3dff
--- /dev/null
+++ b/gribex/findLocalDefinitionFile.c
@@ -0,0 +1,111 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include "fortint.h"
+
+#ifdef TABLE_PATH
+#define USER 1
+#else
+#define USER 0
+#define TABLE_PATH "/home/ma/emos/tables/gribex"
+#endif
+
+
+char* findLocalDefinitionFile(fortint);
+
+int fileExists(char* fileName) {
+struct stat buf;
+int status;
+
+ status = stat(fileName,&buf);
+ if( (status == 0) && S_ISREG(buf.st_mode) ) return 1;
+
+ return 0;
+}
+
+char* findLocalDefinitionFile(fortint definitionNumber) {
+char * directoryPath;
+char * directoryName;
+static char fullFileName[256];
+char fileName[] = "localDefinitionTemplate_ccc_sss_nnn";
+char defaultDirectory[] = "/home/ma/emos/tables/gribex";
+char * endString;
+char * startString;
+fortint n;
+int DefinitionNumber = (int) definitionNumber;
+int centre = DefinitionNumber/1000000;
+int subcentre = (DefinitionNumber/1000)%1000;
+int number = DefinitionNumber%1000;
+int defaultDirectoryChosen = 0;
+
+ sprintf((fileName+24),"%03d",centre);
+ sprintf((fileName+27),"_%03d",subcentre);
+ sprintf((fileName+31),"_%03d",number);
+ directoryPath = (char*) getenv("LOCAL_DEFINITION_TEMPLATES");
+ if( directoryPath == NULL ) {
+ defaultDirectoryChosen = 1;
+ if(USER){
+ char temp[256] = TABLE_PATH;
+ strcat(temp,"/gribtemplates");
+ directoryPath = temp;
+ }
+ else
+ directoryPath = TABLE_PATH;
+ }
+/*
+// The directoryPath can have a list of directories separated by ':'.
+// Check each possible directory to find a suitable file.
+*/
+
+ startString = directoryPath;
+
+ while( (endString = strchr(startString,':')) != NULL ) {
+ n = (int) (endString - startString);
+
+ strncpy(fullFileName,startString,n);
+ fullFileName[n] = '/';
+ strcpy(&fullFileName[n+1],fileName);
+
+ if( fileExists(fullFileName) ) return fullFileName;
+ startString += (n+1);
+ }
+ if( startString != directoryPath )
+ n = strlen(directoryPath) - (int) (startString - directoryPath);
+ else
+ n = strlen(directoryPath);
+
+ strncpy(fullFileName,startString,n);
+ fullFileName[n] = '/';
+ strcpy(&fullFileName[n+1],fileName);
+
+ if( fileExists(fullFileName) )
+ return fullFileName;
+ else {
+ /*try with the center = ECMWF and subcenter = 0
+ printf("didnt found file name = %s\n", fullFileName);*/
+ sprintf((fileName+24),"%03d",subcentre);
+ sprintf((fileName+27),"_%03d",0);
+ sprintf((fileName+31),"_%03d",number);
+ n = strlen(directoryPath);
+ strncpy(fullFileName,directoryPath,n);
+ fullFileName[n] = '/';
+ strcpy(&fullFileName[n+1],fileName);
+ if( fileExists(fullFileName) ) return fullFileName;
+ return NULL;
+ }
+}
diff --git a/gribex/fortint.h b/gribex/fortint.h
new file mode 100755
index 0000000..e517d43
--- /dev/null
+++ b/gribex/fortint.h
@@ -0,0 +1,35 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef FORTINT_H
+#define FORTINT_H
+
+#ifdef INTEGER_IS_INT
+#define fortint int
+#define JPointer int *
+#else
+#if defined hpR64 || defined hpiaR64
+#define fortint long long
+#define JPointer long long *
+#else
+#define fortint long
+#define JPointer long *
+#endif
+#endif
+
+#ifdef REAL_8
+#define fortreal double
+#else
+#define fortreal float
+#endif
+
+#define fortdouble double
+
+#endif /* End of FORTINT_H */
diff --git a/gribex/fortranInterface.c b/gribex/fortranInterface.c
new file mode 100755
index 0000000..cb95af0
--- /dev/null
+++ b/gribex/fortranInterface.c
@@ -0,0 +1,524 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "handleLocalDefinitions.h"
+#include "fortint.h"
+#include "grib_int_t.h"
+
+typedef struct knownActions {
+int count;
+int * numbers;
+action ** actions;
+} knownActions;
+
+knownActions known = {0,NULL,NULL};
+
+int definitionIsDefined(struct knownActions * known, fortint number) {
+int loop;
+grib_int_t Number = (grib_int_t) number;
+
+ for( loop = 0; loop < known->count; loop++ ) {
+ if( known->numbers[loop] == (int)number ) return loop;
+ }
+
+ known->count++;
+
+ known->numbers = (int*) realloc(known->numbers,known->count*sizeof(int));
+ if( known->numbers == NULL ) return -1;
+
+ known->actions = (action**) realloc(known->actions,
+ known->count*sizeof(action*));
+ if( known->actions == NULL ) return -1;
+
+ known->numbers[known->count-1] = (int) number;
+ known->actions[known->count-1] = createLocalDefinitionHandler(Number);
+ if( known->actions[known->count-1] == NULL ) return -1;
+
+ return (known->count-1);
+}
+
+void decodeLocalDefinition(
+ fortint localDefinitionNumber,
+ fortint* packedValues,
+ fortint* unpackedValues,
+ fortint* numberOfUnpackedIntegers,
+ fortint* numberOfPackedBytes) {
+int listPosition, loop;
+unsigned char* packedValuesBytes = (unsigned char*) packedValues;
+grib_int_t UnpackedValues[1024];
+grib_int_t NumberOfUnpackedIntegers;
+grib_int_t NumberOfPackedBytes;
+
+ listPosition = definitionIsDefined(&known,localDefinitionNumber);
+ if( listPosition == -1 ) {
+ *numberOfPackedBytes = 0;
+ return;
+ }
+
+ decodeLocalDefinitionValues(known.actions[listPosition],
+ packedValuesBytes,UnpackedValues,
+ &NumberOfUnpackedIntegers,
+ &NumberOfPackedBytes);
+ *numberOfUnpackedIntegers = NumberOfUnpackedIntegers;
+ *numberOfPackedBytes = NumberOfPackedBytes;
+ for( loop = 0; loop < NumberOfUnpackedIntegers; loop++ )
+ *(unpackedValues+loop) = (fortint) UnpackedValues[loop];
+
+ return;
+}
+
+void dldefs(
+ fortint* localDefinitionNumber,
+ fortint* packedValues,
+ fortint* unpackedValues,
+ fortint* numberOfUnpackedIntegers,
+ fortint* numberOfPackedBytes) {
+
+ decodeLocalDefinition(*localDefinitionNumber,packedValues,unpackedValues,
+ numberOfUnpackedIntegers,numberOfPackedBytes);
+ return;
+}
+
+fortint dldefs_(
+ fortint* localDefinitionNumber,
+ fortint* packedValues,
+ fortint* unpackedValues,
+ fortint* numberOfUnpackedIntegers,
+ fortint* numberOfPackedBytes) {
+
+ decodeLocalDefinition(*localDefinitionNumber,packedValues,unpackedValues,
+ numberOfUnpackedIntegers,numberOfPackedBytes);
+ return;
+}
+
+void encodeLocalDefinition(
+ fortint localDefinitionNumber,
+ fortint* unpackedValues,
+ fortint* packedValues,
+ fortint* numberOfUnpackedIntegers,
+ fortint* numberOfPackedBytes) {
+int listPosition, loop;
+unsigned char* packedValuesBytes = (unsigned char*) packedValues;
+grib_int_t UnpackedValues[1024];
+grib_int_t NumberOfUnpackedIntegers;
+grib_int_t NumberOfPackedBytes;
+
+ listPosition = definitionIsDefined(&known,localDefinitionNumber);
+ if( listPosition == -1 ) {
+ *numberOfPackedBytes = 0;
+ return;
+ }
+
+ for( loop = 0; loop < 1024; loop++ )
+ UnpackedValues[loop] = (grib_int_t) *(unpackedValues+loop);
+
+ encodeLocalDefinitionValues(known.actions[listPosition],
+ UnpackedValues,packedValuesBytes,
+ &NumberOfUnpackedIntegers,
+ &NumberOfPackedBytes);
+ *numberOfUnpackedIntegers = NumberOfUnpackedIntegers;
+ *numberOfPackedBytes = NumberOfPackedBytes;
+
+ return;
+}
+
+fortint eldefs(
+ fortint* localDefinitionNumber,
+ fortint* unpackedValues,
+ fortint* packedValues,
+ fortint* numberOfUnpackedIntegers,
+ fortint* numberOfPackedBytes) {
+
+ encodeLocalDefinition(*localDefinitionNumber,unpackedValues,packedValues,
+ numberOfUnpackedIntegers,numberOfPackedBytes);
+}
+
+fortint eldefs_(
+ fortint* localDefinitionNumber,
+ fortint* unpackedValues,
+ fortint* packedValues,
+ fortint* numberOfUnpackedIntegers,
+ fortint* numberOfPackedBytes) {
+
+ encodeLocalDefinition(*localDefinitionNumber,unpackedValues,packedValues,
+ numberOfUnpackedIntegers,numberOfPackedBytes);
+}
+
+void insertSection1Length(fortint* section1, fortint* length) {
+unsigned char* psection1 = (unsigned char*) section1;
+unsigned char section1Length[3] = {'\0','\0','\0'};
+fortint Length = *length;
+
+ section1Length[0] = (Length & 0xff0000) >> 16;
+ section1Length[1] = (Length & 0xff00) >> 8;
+ section1Length[2] = (Length & 0xff);
+ memcpy((psection1+8),section1Length,3);
+ return;
+}
+
+void isec1l_(fortint* section1, fortint* length) {
+ insertSection1Length(section1,length);
+ return;
+}
+
+void isec1l(fortint* section1, fortint* length) {
+ insertSection1Length(section1,length);
+ return;
+}
+
+fortint ldefnum(fortint* centre, fortint* subcentre, fortint* number) {
+int shift = (sizeof(fortint)-1)*8;
+#ifdef LITTLE_ENDIAN
+ return ((*centre*1000000) + (*subcentre*1000) + (*number & 0xff));
+#else
+ return ((*centre*1000000) + (*subcentre*1000) + ((*number>>shift) & 0xff));
+#endif
+}
+
+fortint ldefnum_(fortint* centre, fortint* subcentre, fortint* number) {
+ return ldefnum(centre,subcentre,number);
+}
+
+void loadPrintLine(
+ char* printLine,
+ int printLineLength,
+ char* contents,
+ char* code,
+ fortint* ksec1Value) {
+int loop, printLength;
+char value[9];
+char p;
+fortint number;
+
+ for( loop = 0; loop < printLineLength; loop++) printLine[loop] = ' ';
+ printLength = strlen(contents);
+ if( printLength > (printLineLength-10) ) printLength = (printLineLength-10);
+ strncpy((printLine+1),contents,printLength);
+
+ if( EQUAL(code,"A4") ) {
+ memcpy(value,ksec1Value,4);
+ value[4] = '\0';
+ sprintf((printLine+37)," %s",value);
+ }
+ else if( EQUAL(code,"A8") ) {
+ memcpy(value,ksec1Value,8);
+ value[8] = '\0';
+ sprintf((printLine+37)," %s",value);
+ } else if( EQUAL(code,"BYTES") ){
+ sprintf(value,"%0x",*ksec1Value,8);
+ if( strlen(value) < 8 ) {
+ int missing = 8 - strlen(value);
+ for( loop = 7; loop >= missing; loop-- ) value[loop] = value[loop-missing];
+ for( loop = 0; loop < missing; loop++ ) value[loop] = '0';
+ }
+#ifdef LITTLE_ENDIAN
+ p = value[0];
+ value[0] = value[6];
+ value[6] = p;
+ p = value[1];
+ value[1] = value[7];
+ value[7] = p;
+ p = value[2];
+ value[2] = value[4];
+ value[4] = p;
+ p = value[3];
+ value[3] = value[5];
+ value[5] = p;
+#endif
+ value[8] = '\0';
+ sprintf((printLine+37)," %s",value);
+ }
+
+ else
+ sprintf((printLine+37)," %9d",*ksec1Value);
+
+ return;
+}
+
+action* createLocalDefinition(action*,grib_int_t);
+
+void displayUnpackedSection1Values(
+ fortint fileNumber,
+ fortint* unpackedSection1Values) {
+FILE * out;
+char fileName[] = "fort.nn";
+fortint localDefinitionNumber, listPosition;
+action* a;
+int Local = 0;
+int valueToPrint = 41;
+int expverFound = 0;
+int printLength, loop, printableValue = 0, numberOfPrintLines;
+int loopCount, listCount, padCount, byteCount;
+int localDefinitionLengthOffset;
+grib_int_t first = 1, firstLocal = 1;
+char* loopName, *byteName;
+grib_int_t previousDefinitionLengthOffset = 0;
+grib_int_t previousDefinitionLength = 0;
+#define LINELENGTH 46
+char printLine[LINELENGTH] = " ";
+
+ if( (fileNumber < 1) || (fileNumber > 99) ) return;
+
+ if( fileNumber == 6 ) {
+ out = stdout;
+ setbuf(out,NULL);
+ }
+ else {
+ if( fileNumber < 10 )
+ sprintf((fileName+5),"%1d",fileNumber);
+ else
+ sprintf((fileName+5),"%2d",fileNumber);
+ out = fopen(fileName,"w");
+ }
+ if( out == NULL ) return;
+
+ localDefinitionNumber = unpackedSection1Values[1]*1000000 +
+ unpackedSection1Values[21]*1000 +
+ unpackedSection1Values[36];
+ listPosition = definitionIsDefined(&known,localDefinitionNumber);
+ if( listPosition == -1 )
+ return;
+ else
+ a = known.actions[listPosition];
+
+ while(a) {
+ if( expverFound ) {
+/*
+// Abandon printing on following:
+*/
+ if( EQUAL((a->code),"IF_EQ") ||
+ EQUAL((a->code),"IF_NEQ") ||
+ EQUAL((a->code),"ENDIF") ||
+ EQUAL((a->code),"PADTO") ||
+ EQUAL((a->code),"SP_TO") ||
+ EQUAL((a->code),"PADMULT") ) return;
+/*
+// Avoid straightforward printing of following:
+*/
+ printableValue = ( NEQUAL((a->ksec1),"n/a") &&
+ NEQUAL((a->code),"PAD") &&
+ NEQUAL((a->code),"LP_I") &&
+ NEQUAL((a->code),"LIST") &&
+ NEQUAL((a->code),"BYTES") &&
+ NEQUAL((a->code),"F1") );
+ if( printableValue ) {
+ loadPrintLine(printLine,LINELENGTH,
+ (char*)(a->description),(char*)(a->code),
+ &unpackedSection1Values[valueToPrint]);
+ fprintf(out,"%s\n",printLine);
+ }
+/*
+// Print loops:
+*/
+ if( EQUAL((a->code),"LP_I") ){
+ loopCount = a->reference->value;
+ loopName = strdup(a->description);
+ for( loop = 0; loop < loopCount; loop++ ) {
+ loadPrintLine(printLine,LINELENGTH,
+ loopName,(char*)(a->code),
+ &unpackedSection1Values[valueToPrint]);
+ fprintf(out,"%s\n",printLine);
+ valueToPrint++;
+ }
+ free(loopName);
+ }
+/*
+// Print bytes:
+*/
+ if( EQUAL((a->code),"BYTES") ) {
+ byteCount = a->reference->value;
+ byteName = strdup(a->description);
+ for( loop = 0; loop < byteCount/4; loop++ ) {
+ loadPrintLine(printLine,LINELENGTH,
+ byteName,"BYTES",
+ &unpackedSection1Values[valueToPrint]);
+ fprintf(out,"%s\n",printLine);
+ valueToPrint++;
+ }
+ free(byteName);
+ }
+/*
+// Skip padding and only move the count if ksec1 is affected:
+*/
+ if( EQUAL((a->code),"PAD") ) {
+ if( (! stringIsNotANumber(a->count)) && NEQUAL((a->ksec1),"n/a") ) {
+ padCount = atoi(a->count);
+ valueToPrint += padCount;
+ }
+ }
+/*
+// Print lists:
+*/
+ if( EQUAL((a->code),"LIST") ) {
+ char** listName = NULL;
+ char** listCode = NULL;
+ action* listPointer = a->next;
+ int separateItems = 0, nextItem = 0;
+ int inLocal = 0;
+
+ listCount = a->reference->value;
+ listName = (char**) malloc(sizeof(char*));
+
+ while( NEQUAL((listPointer->code),"ENDLIST") ) {
+ static grib_int_t localCount = 0;
+ if( NEQUAL(listPointer->code,"LOCAL") &&
+ (!inLocal) &&
+ (localCount <= 1) ) {
+ separateItems++;
+ listName = (char**) realloc(listName,separateItems*sizeof(char*));
+ listName[separateItems-1] = strdup(listPointer->description);
+ listCode = (char**) realloc(listCode,separateItems*sizeof(char*));
+ listCode[separateItems-1] = strdup(listPointer->code);
+ listPointer = listPointer->next;
+ localDefinitionLengthOffset = separateItems - 1;
+ }
+ else {
+/*
+// Special handling for definition 192 (LOCAL within a LIST):
+//
+// numberOfLocalDefinitions 52 I1 44 -
+// listOfLocalDefinitions - LIST - numberOfLocalDefinitions
+// localDefinitionLength - I2 - -
+// localDefinition - LOCAL - -
+// endListOfLocalDefinitions - ENDLIST - listOfLocalDefinitions
+*/
+ action* local, * a;
+ action next;
+ grib_int_t lengthOffset;
+ static grib_int_t length;
+ grib_int_t localDefinitionNumber;
+
+ inLocal = 1;
+
+ if( first ) {
+ first = 0;
+ lengthOffset = valueToPrint;
+ localCount = listCount;
+ }
+ else {
+ lengthOffset =
+ previousDefinitionLengthOffset + previousDefinitionLength + 1;
+ }
+ length = unpackedSection1Values[lengthOffset];
+ previousDefinitionLengthOffset = lengthOffset;
+ previousDefinitionLength = length;
+
+ if( !firstLocal ) {
+ separateItems++;
+ listName = (char**) realloc(listName,separateItems*sizeof(char*));
+ listName[separateItems-1] =
+ strdup(listName[localDefinitionLengthOffset]);
+ listCode = (char**) realloc(listCode,separateItems*sizeof(char*));
+ listCode[separateItems-1] =
+ strdup(listCode[localDefinitionLengthOffset]);
+ }
+ else
+ firstLocal = 0;
+/*
+// Setup ccc = 98, sss = 000, nnn = number
+*/
+ localDefinitionNumber = 98000000 +
+ unpackedSection1Values[lengthOffset+1];
+
+ a = listPointer;
+ Local = 1;
+ local = createLocalDefinition(a,localDefinitionNumber);
+ local = local->next;
+
+ while( local ) {
+ if( NEQUAL(local->ksec1,"n/a") ) {
+ separateItems++;
+ listName = (char**) realloc(listName,separateItems*sizeof(char*));
+ listName[separateItems-1] = strdup(local->description);
+ listCode = (char**) realloc(listCode,separateItems*sizeof(char*));
+ listCode[separateItems-1] = strdup(local->code);
+ }
+ else {
+/*
+// previousDefinitionLengthOffset++;
+*/
+ }
+ local = local->next;
+ }
+ localCount--;
+ if( localCount == 0 ) {
+ inLocal = 0;
+ break;
+ }
+ }
+ }
+
+ if( Local )
+ numberOfPrintLines = separateItems;
+ else
+ numberOfPrintLines = listCount * separateItems;
+
+ nextItem = 0;
+ for( loop = 0; loop < numberOfPrintLines; loop++ ) {
+ loadPrintLine(printLine,LINELENGTH,
+ listName[nextItem],listCode[nextItem],
+ &unpackedSection1Values[valueToPrint]);
+ fprintf(out,"%s\n",printLine);
+ valueToPrint++;
+ if(EQUAL(listCode[nextItem],"A8"))
+ valueToPrint++;
+ nextItem++;
+ if( nextItem == separateItems ) nextItem = 0;
+ }
+ for( loop = 0; loop < separateItems; loop++ ) {
+ free(listName[loop]);
+ free(listCode[loop]);
+ }
+ free(listName);
+ free(listCode);
+/*
+// Skip to ENDLIST (which will not be displayed)
+// Return if a LIST of LOCAL definitions (definition 192).
+*/
+ a = listPointer;
+ if( Local ) {
+ first = 1;
+ firstLocal = 1;
+/*
+ previousDefinitionLengthOffset = 0;
+ previousDefinitionLength = 0;
+*/
+ Local = 0;
+ if( fileNumber != 6 ) fclose(out);
+ return;
+ }
+ }
+ }
+
+ if( EQUAL("experimentVersionNumber",a->description) ) expverFound = 1;
+ if( printableValue ) valueToPrint++;
+ if( printableValue && EQUAL((a->code),"A8") ) valueToPrint++;
+ a = a->next;
+ }
+
+ if( fileNumber != 6 ) fclose(out);
+
+ return;
+}
+
+void ldefprt(fortint* fileNumber, fortint* unpackedSection1Values) {
+ displayUnpackedSection1Values(*fileNumber,unpackedSection1Values);
+ return;
+}
+
+void ldefprt_(fortint* fileNumber, fortint* unpackedSection1Values) {
+ displayUnpackedSection1Values(*fileNumber,unpackedSection1Values);
+ return;
+}
diff --git a/gribex/fortvalues.h b/gribex/fortvalues.h
new file mode 100755
index 0000000..6d8b6d1
--- /dev/null
+++ b/gribex/fortvalues.h
@@ -0,0 +1,21 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef FORTVALUES_H
+#define FORTVALUES_H
+
+#include "fortint.h"
+
+#define BYTE 0xFF & (fortint)
+
+void mvbytes(char *, fortint * , int );
+void rtbytes(fortint *, char * , int );
+
+#endif /* End of FORTVALUES_H */
diff --git a/gribex/ftn1cr.F b/gribex/ftn1cr.F
new file mode 100755
index 0000000..1d016bc
--- /dev/null
+++ b/gribex/ftn1cr.F
@@ -0,0 +1,192 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE FTN1CR ( KNUM , KPR ,KRET )
+C
+C---->
+C**** FTN1CR
+C
+C PURPOSE.
+C --------
+C
+C GIVES FORTRAN UNIT NUMBER NOT CURRENTLY IN USE.
+C
+C** INTERFACE.
+C ----------
+C
+C CALL FTN1CR ( KNUM , KPR ,KRET )
+C
+C INTEGER K.
+C REAL P.
+C LOGICAL O.
+C CHARACTER H.
+C
+C INPUT PARAMETERS.
+C -----------------
+C
+C KPR - DEBUG PRINT SWITCH.
+C 0 , NO PRINTOUT.
+C 1 , DEBUG PRINTOUT.
+C
+C OUTPUT PARAMETERS.
+C ------------------
+C
+C KNUM - FREE FORTRAN UNIT NUMBER.
+C KRET - ERROR RETURN CODE.
+C 0 , NO ERROR ENCOUNTERED.
+C 1 , NO UNIT NUMBER FREE.
+C
+C METHOD.
+C -------
+C
+C INQUIRE STATEMENT ON CRAY ALIAS USED.
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C COMMENTS.
+C ---------
+C
+C ROUTINE CONTAINS SECTIONS 0 , 2 AND SECTION 9.
+C
+C AUTHOR.
+C -------
+C
+C J. HENNESSY ECMWF 12.07.89.
+C
+C MODIFICATIONS
+C --------------
+C
+C NONE.
+C
+C----<
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 0 . DEFINITION OF VARIABLES.
+C ----------------------------------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 1 . SET INITIAL VALUES.
+C ----------------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'FTN1CR : SECTION 1.'
+C
+ KRET = 0
+C
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 2 . INQUIRE FOR FREE UNIT.
+C ----------------------------------------------------------------
+C
+ 2000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'FTN1CR : SECTION 2.'
+C
+ DO 2010 J2010 = 99,1,-1
+ IF (J2010.EQ.5) GO TO 2010
+ IF (J2010.EQ.6) GO TO 2010
+ WRITE (YALIAS,'(A,I2.2)') 'FT',J2010
+ INQUIRE (FILE=YALIAS,EXIST=LEX)
+ IF (LEX) GO TO 2010
+ KNUM = J2010
+ GO TO 2050
+ 2010 CONTINUE
+C
+C NO FREE UNIT FOUND.
+C
+ KRET = 1
+C
+ WRITE (*,9001)
+C
+ 2050 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,9002) KNUM
+C
+ GO TO 9000
+C
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 9 . RETURN TO CALLING ROUTINE. FORMAT STATEMENTS.
+C ------------------------------------------------------------------
+C
+ 9000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'FTN1CR : SECTION 9.'
+C
+C
+ RETURN
+C
+C
+ 9001 FORMAT (1H ,'FTN1CR : NO FORTRAN UNIT AVAILABLE.')
+C
+ 9002 FORMAT (1H ,'FTN1CR : FORTRAN UNIT ALLOCATED = ',I3)
+C
+C
+C ------------------------------------------------------------------
+C
+C
+ END
diff --git a/gribex/gbitmap.F b/gribex/gbitmap.F
new file mode 100755
index 0000000..9debbb2
--- /dev/null
+++ b/gribex/gbitmap.F
@@ -0,0 +1,258 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+#ifndef USE_NO_POINTERS
+ INTEGER FUNCTION GBITMAP(KNUM, KVALS, KNONMIS, KBTPTR, KBYTE)
+C
+C---->
+C**** GBITMAP - Read bitmap from a file
+C
+C Purpose.
+C --------
+C
+C Reads a bitmap from a file.
+C
+C** Interface.
+C ----------
+C
+C IRET = GBITMAP(KNUM, KVALS, KNONMIS, KBTPTR, KBYTE)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KNUM - The predetermined bitmap number (in range 0 to 999)
+C KBYTE - Number of bits in an INTEGER.
+C
+C Output Parameters.
+C ------------------
+C
+C KVALS - The number of bits in the bitmap
+C KNONMIS - The number of non-missing points in the bitmap
+C KBTPTR - Pointer to the start of the bitmap
+C
+C Returns zero if all OK (otherwise an error).
+C
+C
+C Method.
+C -------
+C
+C Opens a file containing the bitmap, allocates memory for the
+C bitmap, reads the bitmap into memory, and closes the file.
+C
+C If the bitmap number is the same as in the previous call,
+C the open/allocate/read sequence is skipped.
+C
+C The file pathname may be given by the environment variable
+C LOCAL_BITMAP_PATH, otherwise a hardcoded default pathname is used.
+C
+C
+C Externals.
+C ----------
+C
+C PBOPEN - Opens the binary bitmap file
+C PBREAD - Reads the binary bitmap file
+C PBCLOSE - Closes the binary bitmap file
+C INXBIT - Extract values from bit-stream
+C JMALLOC - Routine to acquire memory
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C ---------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF Oct 1996
+C
+C
+C Modifications.
+C --------------
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C J.Clochard, Meteo France, for ECMWF - January 1998.
+C Use JMALLOC for all systems.
+C
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+#include "grbcom.h"
+C
+C Function arguments
+C
+ INTEGER KNUM, KVALS, KNONMIS, KBYTE
+#ifdef POINTER_64
+ INTEGER*8 KBTPTR
+#else
+ INTEGER*4 KBTPTR
+#endif
+C
+C Local variables
+C
+ INTEGER IRET
+C
+C Predetermined bitmask variables
+C
+ CHARACTER*256 HBTMASK
+ INTEGER IBTMAP,IBTMASK,IBTSIZE,IBTSIZP,IBTOPEN,IBTVALS,NONMISS
+ INTEGER IOFFSET
+#ifdef POINTER_64
+ INTEGER*8 IBTPTR
+#endif
+ POINTER (IBTPTR,IBTMAP)
+ DIMENSION IBTMAP(1)
+ SAVE IBTPTR, IBTSIZP, IBTOPEN, IBTVALS, NONMISS
+C
+C External functions
+C
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+ EXTERNAL JMALLOC
+C
+ DATA IBTSIZP/0/
+ DATA IBTOPEN/0/
+C
+C ----------------------------------------------------------------
+C Section 1 . Initialise.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Clear return values
+ KVALS = 0
+ KNONMIS = 0
+ KBTPTR = 0
+C
+C Check the bitmap number is valid
+ IF( (KNUM.LT.0) .OR. (KNUM.GT.999) ) THEN
+ WRITE(GRPRSM,*) 'GBITMAP: Invalid bitmap number given = ', KNUM
+ GBITMAP = 727
+ GOTO 900
+ ENDIF
+C
+C ----------------------------------------------------------------
+C Section 2 . Open the bitmask file if first time.
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF( IBTOPEN.NE.KNUM ) THEN
+C
+C Build filename
+ HBTMASK = ELBPATH
+ IOFFSET = INDEX( HBTMASK, ' ')
+ WRITE(HBTMASK(IOFFSET:IOFFSET+10),'(A8,I3.3)')
+ X 'bitmask_', KNUM
+ IOFFSET = INDEX( HBTMASK, ' ')
+C
+C Open the file
+ CALL PBOPEN(IBTMASK,HBTMASK(1:IOFFSET-1),'r',IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(GRPRSM,*) 'GBITMAP: Open predetermined bitmap failed'
+ GBITMAP = 728
+ GOTO 900
+ ENDIF
+C
+C Read file size (number of bits)
+ CALL PBREAD(IBTMASK,IBTSIZE,KBYTE,IRET)
+ IF( IRET.NE.KBYTE ) THEN
+ WRITE(GRPRSM,*) 'GBITMAP: Problem getting bitmap size'
+ GBITMAP = 729
+ GOTO 900
+ ENDIF
+C
+C Get memory to read bitmask unless sufficient previously
+C allocated
+ IBTVALS = IBTSIZE
+ IBTSIZE = (IBTSIZE+8-1)/8
+C
+C Check whether this bitmap is bigger than the previous
+C bitmap (if any)
+ IF( IBTSIZE.GT.IBTSIZP ) THEN
+C
+C Return previously allocated memory (if any)
+ IF( IBTSIZP.NE.0 ) CALL JFREE(IBTPTR)
+C
+C Get memory
+ IBTPTR = JMALLOC(IBTSIZE)
+#ifdef hpR64
+ IBTPTR = IBTPTR/(1024*1024*1024*4)
+#endif
+ IF( IBTPTR.EQ.0 ) THEN
+ WRITE(GRPRSM,*) 'GBITMAP: Problem getting memory for bitmap'
+ GBITMAP = 730
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C Read number of non-missing points
+ CALL PBREAD(IBTMASK,NONMISS,KBYTE,IRET)
+ IF( IRET.NE.KBYTE ) THEN
+ WRITE(GRPRSM,*)
+ X 'GBITMAP: Problem getting no. non-missing points'
+ GBITMAP = 731
+ GOTO 900
+ ENDIF
+C
+C Read the bitmap
+ CALL PBREAD(IBTMASK,IBTMAP,IBTSIZE,IRET)
+ IF( IRET.NE.IBTSIZE ) THEN
+ WRITE(GRPRSM,*) 'GBITMAP: Problem reading bitmap'
+ GBITMAP = 732
+ GOTO 900
+ ENDIF
+C
+C Close the bitmap file
+ CALL PBCLOSE(IBTMASK,IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(GRPRSM,*) 'GBITMAP: Problem closing bitmap file'
+ GBITMAP = 733
+ GOTO 900
+ ENDIF
+C
+ IBTOPEN = KNUM
+C
+ ENDIF
+C
+C Setup return values
+ KVALS = IBTVALS
+ KNONMIS = NONMISS
+ KBTPTR = IBTPTR
+ GBITMAP = 0
+C
+C ----------------------------------------------------------------
+C Section 9 . Closedown.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
+#endif
diff --git a/gribex/gbyte.F b/gribex/gbyte.F
new file mode 100755
index 0000000..2941ac1
--- /dev/null
+++ b/gribex/gbyte.F
@@ -0,0 +1,67 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GBYTE (SOURCE,DEST,IOFSET,IBYTSZ)
+C
+C---->
+C**** GBYTE - Extract a single bit field. Cray routine.
+C
+C* FUNCTION: GET A SINGLE BIT FIELD FROM SOURCE INTO DEST
+C*
+C* INPUT : SOURCE(1)= WORD CONTAINING START OF BIT FIELD
+C* DEST = TARGET WORD
+C* IOFSET = OFFSET IN BITS FOR START OF THE FIELD
+C* IBYTSZ = LENGTH OF FIELD IN BITS
+C*
+C* OUTPUT : SOURCE,IOFSET,IBYTSZ UNCHANGED
+C* DEST CONTAINS FIELD RIGHT JUSTIFIED
+C*
+C* AUTHOR : M.MIQUEU 08/1981 (REWRITTEN FROM J.MARTELLET'S)
+C*
+C----<
+ PARAMETER(NBPW=64)
+ INTEGER SOURCE(1),DEST
+ INTEGER SH1
+ SH1=IOFSET+IBYTSZ-NBPW
+
+ IF(SH1.GT.0) GO TO 2
+
+
+C BYTES DO NOT SPAN WORDS
+
+
+ SH1=NBPW+SH1
+
+
+ DEST=AND(
+ 1 SHIFT(SOURCE(1),SH1),
+ 2 SHIFT(MASK(IBYTSZ),IBYTSZ)
+ 3 )
+
+ RETURN
+
+C BYTE SPANS WORDS
+
+2 CONTINUE
+
+
+ DEST=OR(
+ 1 SHIFT(
+ 2 AND(SOURCE(1),COMPL(MASK(IOFSET)))
+ 3 ,SH1),
+ 4 SHIFT(
+ 5 AND(SOURCE(2),MASK(SH1))
+ 6 ,SH1)
+ 7 )
+
+
+
+ RETURN
+ END
diff --git a/gribex/gbytes.F b/gribex/gbytes.F
new file mode 100755
index 0000000..3dff884
--- /dev/null
+++ b/gribex/gbytes.F
@@ -0,0 +1,76 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GBYTES (S,D,ISKIP1,IBSIZ,ISKIP2,NBYTES,KWOFF)
+C
+C---->
+C**** GBYTES - Extract a number of bit fields. Cray routine.
+C
+C S CONTAINS A BIT STRING OF INDEFINITE LENGTH. GBYTES WILL
+C EXTRACT NBYTES BITSTRINGS, IBSIZ BITS LONG, AND STORE THEM
+C RIGHT JUSTIFIED 0 FILL, INTO SUCCESSIVE WORDS OF D. THE
+C SUCCESSIVE BITSTRINGS START AT BIT POSITIONS
+C ISKIP1+1+(IBYTE-1)*(IBSIZ+ISKIP2)
+C IN THE BIT STRING S. I.E. SKIP ISKIP1 BITS AT THE START,
+C AND ISKIP2 BITS BETWEEN THE EXTRACTED STRINGS.
+C BIT ISKP+1 IN A STRING IS FOUND IN WORD IS=1+ISKIP/NBPW IN S,
+C WHERE NBPW IS THE NUMBER OF BITS PER WORD. THE STARTING BIT
+C IS FOUND BY SKIPPING MOD(ISKP,NBPW) BITS IN THAT WORD.
+C KWOFF IS AN OPTIONAL 7TH PARAMETER, WHICH DEFAULTS TO 0
+C IF PRESENT KWOFF BITS ARE TOTALLY IGNORED AT THE START OF A WORD
+C THUS IF A PACKED CYBER BIT STRING IS TRANSFERRED TO THE
+C CRAY, WITH EACH 60 BIT CYBER WORD PLACED AT THE RIGHT END OF
+C A 64 BIT CRAY WORD, A BYTE SEQUENCE WHICH WAS ORIGINALLY
+C LOCATED WITH START POINTS IN ARITHMETIC PROGRESSION ON THE
+C CYBER, WILL NO LONGER HAVE THIS PROPERTY ON THE CRAY. BY
+C USING THE ROUTINE WITH KWOFF=4, THE ELEMENTS OF THE BYTE
+C SEQUENCE CAN BE EXTRACTED ON THE CRAY, USING THE SAME SKIPS
+C AS WERE USED ON THE CYBER.
+C
+C----<
+ PARAMETER(NBPW=64)
+ DIMENSION S(2) , D(NBYTES)
+ INTEGER SH1
+ IGNORE = 0
+#ifdef CRAY
+ IF(NUMARG().GT.6) IGNORE = KWOFF
+#else
+ IF(NUMARG(DUMMY).GT.6) IGNORE = KWOFF
+#endif
+ IS=1+ISKIP1/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP1,NBPW-IGNORE) + IGNORE
+ ISTEP = ISKIP2+IBSIZ
+ DO 75 IBYTE = 1 , NBYTES
+C WITH THE STARTING WORD AND BIT POSITION DETERMINED, THE
+C DESIRED EXTRACTION CAN BE DONE BY
+C*** CALL GBYTE(S(IS),D(IBYTE),ISKIP,IBSIZ)
+C BUT SINCE THE CODE IS SHORT IT IS INSERTED IN-LINE.
+ SH1 = ISKIP+IBSIZ
+ IF(SH1.GT.NBPW) GO TO 50
+C BYTE COMES FROM 1 WORD OF S
+ D(IBYTE) = AND( SHIFT(S(IS),SH1),SHIFT(MASK(IBSIZ),IBSIZ))
+ GO TO 65
+ 50 CONTINUE
+ SH1 =SH1-NBPW
+C BYTE COMES FROM 2 WORDS OF S.
+ D(IBYTE) = OR(SHIFT(AND(S(IS),COMPL(MASK(ISKIP))),SH1)
+ 1 ,
+ 2 SHIFT(AND(SHIFT(S(IS+1),IGNORE),MASK(SH1)),SH1)
+ 3 )
+ 65 CONTINUE
+C UPDATE STARTING WORD AND BIT POSITION
+ ISKIP = ISKIP+ISTEP
+ IF(ISKIP.LT.NBPW) GO TO 75
+ ISKIP =ISKIP-NBPW
+ IS = IS+1+ISKIP/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP,NBPW-IGNORE) + IGNORE
+ 75 CONTINUE
+ RETURN
+ END
diff --git a/gribex/gdecode.c b/gribex/gdecode.c
new file mode 100755
index 0000000..296112d
--- /dev/null
+++ b/gribex/gdecode.c
@@ -0,0 +1,1512 @@
+/**
+* Copyright 1981-2012 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 "gdecode.h"
+
+#define GRIB 0x47524942
+#define BIT1 0x80
+#define BIT2 0x40
+
+#define DEBUGOFF 1
+#define DEBUG1 (debugSet > DEBUGOFF )
+#define DEBUG2 (debugSet > (DEBUGOFF + 1) )
+static char * debugLevel;
+static int debugSet = 0;
+
+
+fortint findSectionOffsets(
+ unsigned char * buffer,
+ fortint* is0,
+ fortint* is1,
+ fortint* is2,
+ fortint* is3,
+ fortint* is4,
+ fortint* iedition) {
+long section0Offset, section1Offset, section2Offset;
+long section3Offset, section4Offset, edition;
+int large = 0;
+int found = 0;
+int code = 0;
+unsigned char p, edit_num, flag23;
+int section0Length = 8, section1Length, section2Length, section3Length,
+ section4Length;
+long total;
+unsigned char * q = buffer;
+
+/*
+// Read bytes until "GRIB" found
+*/
+ do {
+ code = ( (code << 8) | ((*q++)<<0) ) & 0xFFFFFFFF;
+ if (code == GRIB ) found = 1;
+ } while ( ! found );
+ section0Offset = (long) (q - buffer - 4);
+/*
+// Find out which edition of GRIB is present (default is 1)
+*/
+ edition = 1;
+ section1Offset = section0Offset + 8;
+ if( (*(buffer+21-section0Offset) == '\0') &&
+ (*(buffer+22-section0Offset) == '\0') ) {
+/*
+// GRIB edition -1
+*/
+ edition = -1;
+ section1Offset = section0Offset;
+ section1Length = 20;
+ section0Length = 4;
+ }
+ else {
+ total = THREEBYTEINT(q); q += 3;
+ if( total == 24 ) {
+/*
+// Check for edition number
+*/
+ if( ONEBYTEINT(q) != 0) return 1;
+/*
+// GRIB edition 0
+*/
+ q++;
+ edition = 0;
+ section1Length = 24;
+ section1Offset = section0Offset + 4;
+ section0Length = 4;
+ }
+/*
+// See if it is an extra large (wave) product
+*/
+ if( total > 0x800000 ) {
+ total = (total&0x7fffff) * 120;
+ large = 1;
+ }
+ }
+
+ if( edition == 1 ) {
+/*
+// Read length of section 1
+*/
+ q++;
+ section1Length = THREEBYTEINT(q); q += 3;
+ section1Offset = section0Offset + section0Length;
+ }
+/*
+// Now figure out if sections 2/3 are present
+*/
+ q += 4;
+ flag23 = *q++;
+ section2Length = flag23 & BIT1;
+ section3Length = flag23 & BIT2;
+/*
+// Advance to end of section 1
+*/
+ q = buffer + section1Offset + section1Length;
+/*
+// Read section 2 length if it is present
+*/
+ if( section2Length ) {
+ section2Offset = (fortint) (q - buffer);
+ section2Length = THREEBYTEINT(q); q+= 3;
+ q = buffer + section2Offset + section2Length;
+ }
+ else {
+ section2Length = 0;
+ section2Offset = 0;
+ }
+/*
+// Read section 3 length if it is present
+*/
+ if( section3Length ) {
+ section3Offset = (fortint) (q - buffer);
+ section3Length = THREEBYTEINT(q); q+= 3;
+ q = buffer + section3Offset + section3Length;
+ }
+ else {
+ section3Length = 0;
+ section3Offset = 0;
+ }
+/*
+// Read section 4 length
+*/
+ section4Offset = (fortint) (q - buffer);
+ section4Length = THREEBYTEINT(q); q+= 3;
+ if( large ){
+ total = total + section4Length;
+ section4Length = total - section4Offset;
+ }
+/*
+// Advance to end of section 4
+*/
+ q = buffer + section4Offset + section4Length;
+/*
+// Check section 5, ie 7777 group is in the expected place
+*/
+ if( FOURBYTEINT(q) != 0x37373737 ) {
+ if(!large) {
+ printf("7777 group not found\n");
+ return 15;
+ }
+ }
+/*
+// Success!
+*/
+ *is0 = (fortint) section0Offset;
+ *is1 = (fortint) section1Offset;
+ *is2 = (fortint) section2Offset;
+ *is3 = (fortint) section3Offset;
+ *is4 = (fortint) section4Offset;
+ *iedition = (fortint) edition;
+
+ return 0;
+}
+
+fortint prepareGrib( gribProduct ** grib, unsigned char * buffer) {
+fortint is0, is1, is2, is3, is4, iedition;
+long status;
+unsigned char * p;
+gribProduct * gp;
+
+ if( *grib == NULL ) {
+ gp = (gribProduct *) allocateMemory(sizeof(gribProduct));
+ *grib = gp;
+ }
+ else
+ gp = *grib;
+
+ status = findSectionOffsets(buffer,&is0,&is1,&is2,&is3,&is4,&iedition);
+ if( status ) {
+ printf("prepareGrib: Problem finding GRIB section offsets\n");
+ return (fortint) 1;
+ }
+
+ if( iedition != 1 ) {
+ printf("prepareGrib: Only GRIB edition 1 allowed.\n");
+ return (fortint) 1;
+ }
+
+ p = (unsigned char *) (buffer + is0);
+ gp->g0 = (gribSection0 *) p;
+
+ p = (unsigned char *) (buffer + is1);
+ gp->g1 = (gribSection1 *) p;
+
+ if( is2 == 0 )
+ gp->g2 = NULL;
+ else {
+ p = (unsigned char *) (buffer + is2);
+ gp->g2 = (gribSection2 *) p;
+ }
+
+ if( is3 == 0 )
+ p = NULL;
+ else {
+ p = (unsigned char *) (buffer + is3);
+ gp->g3 = (gribSection3 *) p;
+ }
+
+ p = (unsigned char *) (buffer + is4);
+ gp->g4 = (gribSection4 *) p;
+
+ return (fortint) 0;
+}
+
+fortint convertGRIBFloatToIEEE(unsigned char * valuePointer) {
+fortint temp;
+fortint sign, exponent, mantissa, newmantissa, newexponent;
+/*
+// The GRIB float format is defined in WMO manual on codes for
+// FM 92 GRIB, 92.6.4:
+// R = (-1)^sign * 2^(-24) * mantissa * 16^(exponent-64)
+*/
+
+ temp = FOURBYTEINT(valuePointer);
+ if( temp == 0 )
+ return (fortint) 0;
+ else {
+ sign = temp & 0x80000000;
+ exponent = (((temp & 0x7f000000)>>24) - 64);
+ mantissa = (temp & 0xffffff);
+ newmantissa = mantissa<<8;
+ newexponent = exponent*4-1;
+ while( !(newmantissa & 0x80000000) ) {
+ newexponent--;
+ newmantissa <<= 1;
+ }
+ newexponent += 127;
+ return (fortint) (sign | (newexponent<<23) | ((newmantissa>>8)&0x7fffff) );
+ }
+}
+
+fortdouble realValue(unsigned char * value) {
+float realNumber;
+fortint realNumberBits;
+
+ realNumberBits = convertGRIBFloatToIEEE(value);
+ memcpy((char *)&realNumber,(char *)&realNumberBits,4);
+ return (fortdouble) realNumber;
+}
+
+fortdouble referenceValue(gribProduct * grib) {
+ return realValue(grib->g4->referenceValue);
+}
+
+fortdouble RGREFVL(gribProduct ** grib) {
+ return referenceValue( (*grib) );
+}
+
+fortint IGBTSPV(gribProduct ** grib) {
+ return g4_bits( (*grib) );
+}
+
+fortdouble RGDSCAL(gribProduct ** grib) {
+fortint value = g4_scale( (*grib) );
+double two = 2.0;
+fortdouble scale;
+/*
+// High order bit set => negative value
+*/
+ if( value & 0x8000 ) value = - (value & 0x7fff);
+ if( value == 0 )
+ scale = 1.0;
+ else
+ scale = pow(two,(double)value);
+ return scale;
+}
+
+fortint IGUNUSD(gribProduct ** grib) {
+ return (g4_flag( (*grib) ) & 0xf);
+}
+
+fortint GDECODE(gribProduct ** grib, unsigned char * buffer) {
+fortint status;
+/*
+// See if DEBUG switched on.
+*/
+ if( ! debugSet ) {
+ debugLevel = getenv("GDECODE_DEBUG");
+ if( debugLevel == NULL )
+ debugSet = DEBUGOFF; /* off */
+ else {
+ int loop;
+ for( loop = 0; loop < strlen(debugLevel) ; loop++ ) {
+ if( ! isdigit(debugLevel[loop]) ) {
+ printf("Invalid number string in GDECODE_DEBUG: %s\n", debugLevel);
+ printf("GDECODE_DEBUG must comprise only digits [0-9].\n");
+ debugSet = DEBUGOFF;
+ }
+ }
+ debugSet = DEBUGOFF + atol( debugLevel );
+ }
+ if( DEBUG1 ) printf("GDECODE: GDECODE_DEBUG switched on, level = %s\n",
+ debugLevel);
+ }
+
+ status = prepareGrib( grib, buffer);
+
+ if( DEBUG1 )
+ if( status )
+ printf("GDECODE: prepareGrib failed.\n");
+ else
+ printf("GDECODE: prepareGrib ran OK\n");
+
+ return status;
+}
+
+fortint IGLNGTH(gribProduct ** grib) {
+ return g0_length( (*grib) );
+}
+
+fortint IGDATE(gribProduct ** grib) {
+fortint date;
+gribProduct * g = *grib;
+
+ if( (g1_century(g) == 255) || (g1_year(g) == 255) || (g1_day(g) == 255) )
+ return (fortint) g1_month(g);
+
+ date = (g1_century(g)-1)*1000000 +
+ g1_year(g)*10000 +
+ g1_month(g)*100 +
+ g1_day(g);
+
+ return date;
+}
+
+fortint IGTIME(gribProduct ** grib) {
+fortint time;
+gribProduct * g = *grib;
+
+ if( (g1_hour(g) == 255) || (g1_minute(g) == 255) ) return (fortint) -1;
+
+ time = g1_hour(g)*100 +
+ g1_minute(g);
+
+ return time;
+}
+
+fortint IGSTEP(gribProduct ** grib) {
+fortint timeunit, timerange, step;
+gribProduct * g = *grib;
+
+ switch( (int) g1_timeunit(g) ) {
+
+ case 2:
+ timeunit = 24;
+ break;
+
+ case 10:
+ timeunit = 3;
+ break;
+
+ case 11:
+ timeunit = 6;
+ break;
+
+ case 12:
+ timeunit = 12;
+ break;
+
+ default:
+ timeunit = 1;
+ break;
+ }
+
+ switch( (int) g1_timerange(g) ) {
+
+ case 0:
+ case 1:
+ case 113:
+ case 114:
+ case 115:
+ case 116:
+ case 117:
+ case 118:
+ case 123:
+ case 124:
+ step = g1_P1(g);
+ break;
+
+ case 10:
+ step = (g1_P1(g)<<8) | (g1_P2(g)<<0);
+ break;
+
+ default:
+ step = g1_P2(g);
+ break;
+ }
+
+ step *= timeunit;
+
+ return step;
+}
+
+fortint IGSTEP1(gribProduct ** grib) {
+ return g1_P1( (*grib) );
+}
+
+fortint IGSTEP2(gribProduct ** grib) {
+ return g1_P2( (*grib) );
+}
+
+fortint IGTABLE(gribProduct ** grib) {
+ return g1_table( (*grib) );
+}
+
+fortint IGCENTR(gribProduct ** grib) {
+ return g1_centre( (*grib) );
+}
+
+fortint IGPARAM(gribProduct ** grib) {
+ return g1_parameter( (*grib) );
+}
+
+fortint IGLEVEL(gribProduct ** grib) {
+fortint level;
+gribProduct * g = *grib;
+
+ switch( (int) g1_typeOfLevel(g) ) {
+
+ case 20:
+ case 100:
+ case 103:
+ case 105:
+ case 107:
+ case 109:
+ case 111:
+ case 113:
+ case 115:
+ case 117:
+ case 119:
+ case 125:
+ case 127:
+ case 160:
+ case 210:
+ level = (g1_level1(g)<<8) | (g1_level2(g)<<0);
+ break;
+
+ case 101:
+ case 104:
+ case 106:
+ case 108:
+ case 110:
+ case 112:
+ case 114:
+ case 116:
+ case 120:
+ case 121:
+ case 128:
+ case 141:
+ level = g1_level1(g)*1000 + g1_level2(g);
+ break;
+
+ default:
+ level = 0;
+ break;
+ }
+
+ return level;
+}
+
+fortint IGLEVL1(gribProduct ** grib) {
+gribProduct * g = *grib;
+
+ switch( (int) g1_typeOfLevel(g) ) {
+
+ case 101:
+ case 104:
+ case 106:
+ case 108:
+ case 110:
+ case 112:
+ case 114:
+ case 116:
+ case 120:
+ case 121:
+ case 128:
+ case 141:
+ return g1_level1(g);
+
+ default:
+ return IGLEVEL(grib);
+ }
+}
+
+fortint IGLEVL2(gribProduct ** grib) {
+gribProduct * g = *grib;
+
+ switch( (int) g1_typeOfLevel(g) ) {
+
+ case 101:
+ case 104:
+ case 106:
+ case 108:
+ case 110:
+ case 112:
+ case 114:
+ case 116:
+ case 120:
+ case 121:
+ case 128:
+ case 141:
+ return g1_level2(g);
+
+ default:
+ return IGLEVEL(grib);
+ }
+}
+
+fortint IGDEFIN(gribProduct ** grib) {
+ if( ecmwfLocalDefinitionPresent((*grib)) )
+ return g1_definition( (*grib) );
+
+ if( centreUsingECMWFLocalDefinition((*grib)) )
+ return g1_definition( (*grib) );
+ else {
+ if( DEBUG1 ) printf("IGDEFIN: no ECMWF local definition found\n");
+ return (fortint) -999999;
+ }
+}
+
+fortint IGCLASS(gribProduct ** grib) {
+ if( ecmwfLocalDefinitionPresent((*grib)) )
+ return g1_class( (*grib) );
+
+ if( centreUsingECMWFLocalDefinition((*grib)) )
+ return g1_class( (*grib) );
+ else {
+ if( DEBUG1 ) printf("GCLASS: no ECMWF class found\n");
+ return (fortint) -999999;
+ }
+}
+
+fortint IGTYPE(gribProduct ** grib) {
+ if( ecmwfLocalDefinitionPresent((*grib)) )
+ return g1_type( (*grib) );
+
+ if( centreUsingECMWFLocalDefinition((*grib)) )
+ return g1_type( (*grib) );
+ else {
+ if( DEBUG1 ) printf("IGTYPE: no ECMWF type found\n");
+ return (fortint) -999999;
+ }
+}
+
+fortint IGSTREM(gribProduct ** grib) {
+ if( ecmwfLocalDefinitionPresent((*grib)) )
+ return g1_stream( (*grib) );
+
+ if( centreUsingECMWFLocalDefinition((*grib)) )
+ return g1_stream( (*grib) );
+ else {
+ if( DEBUG1 ) printf("IGSTREM: no ECMWF stream found\n");
+ return (fortint) -999999;
+ }
+}
+
+fortint IGEXPVR(gribProduct ** grib) {
+ if( ecmwfLocalDefinitionPresent((*grib)) )
+ return g1_expver( (*grib) );
+
+ if( centreUsingECMWFLocalDefinition((*grib)) )
+ return g1_expver( (*grib) );
+ else {
+ if( DEBUG1 ) printf("IGEXPVR: no ECMWF experiment version found\n");
+ return (fortint) -999999;
+ }
+}
+
+fortint IGREPRS(gribProduct ** grib) {
+ return g2_datatype( (*grib) );
+}
+
+fortint IGNUMPV(gribProduct ** grib) {
+ return g2_NV( (*grib) );
+}
+
+fortint GPV(gribProduct ** grib, fortdouble * list, fortint * sizeList ) {
+gribProduct * g = *grib;
+fortdouble * l = list;
+int loop, numberOfVerticalCoordinates;
+unsigned char * value;
+
+ if( !(numberOfVerticalCoordinates = g2_NV(g)) ) return (fortint) 0;
+
+ if( numberOfVerticalCoordinates > *sizeList ) return (fortint) -1;
+
+ value = (unsigned char *)(g->g2) + g2_PV_PL(g) - 1;
+
+ for( loop = 0; loop < numberOfVerticalCoordinates; loop++ ) {
+ *(l+loop) = realValue(value);
+ value += 4;
+ }
+ return (fortint) numberOfVerticalCoordinates;
+}
+
+fortint GPL(gribProduct ** grib, fortint * list, fortint * sizeList ) {
+gribProduct * g = *grib;
+fortint * l = list;
+int loop, numberOfVerticalCoordinates, numberOfRows;
+unsigned char * value;
+
+ numberOfRows = g2_nj(g);
+ if( numberOfRows > *sizeList ) return (fortint) -1;
+
+ numberOfVerticalCoordinates = g2_NV(g);
+
+ value = (unsigned char *)(g->g2) + g2_PV_PL(g) +
+ numberOfVerticalCoordinates*4 - 1;
+
+ for( loop = 0; loop < numberOfRows; loop++ ) {
+ *(l+loop) = TWOBYTEINT(value);
+ value += 2;
+ }
+ return (fortint) numberOfRows;
+}
+
+fortint IGNI(gribProduct ** grib) {
+ if( generalLatLonGrid( (*grib) ) )
+ if( g2_ni( (*grib) ) == 65535 )
+ return (fortint) -1;
+ else
+ return g2_ni( (*grib) );
+ else {
+ if( DEBUG1 ) printf("IGNI: not a lat/long grid\n");
+ return (fortint) -999999;
+ }
+}
+
+fortint IGNJ(gribProduct ** grib) {
+ if( generalLatLonGrid( (*grib) ) )
+ if( g2_nj( (*grib) ) == 65535 )
+ return (fortint) -1;
+ else
+ return g2_nj( (*grib) );
+ else {
+ if( DEBUG1 ) printf("IGNJ: not a lat/long grid\n");
+ return (fortint) -999999;
+ }
+}
+
+fortdouble RGNWLAT(gribProduct ** grib) {
+fortint value;
+ if( generalLatLonGrid( (*grib) ) ) {
+ value = g2_firstLat( (*grib) );
+ if( value & 0x800000 ) value = - (value & 0x7fffff);;
+ return ((fortdouble) value)/1000.0;
+ }
+ else {
+ if( DEBUG1 ) printf("RGNWLAT: not a lat/long grid\n");
+ return (fortdouble) -999999.0;
+ }
+}
+
+fortdouble RGNWLON(gribProduct ** grib) {
+fortint value;
+ if( generalLatLonGrid( (*grib) ) ) {
+ value = g2_firstLon( (*grib) );
+ if( value & 0x800000 ) value = - (value & 0x7fffff);;
+ return ((fortdouble) value)/1000.0;
+ }
+ else {
+ if( DEBUG1 ) printf("RGNWLON: not a lat/long grid\n");
+ return (fortdouble) -999999.0;
+ }
+}
+
+fortdouble RGSELAT(gribProduct ** grib) {
+fortint value;
+ if( generalLatLonGrid( (*grib) ) ) {
+ value = g2_lastLat( (*grib) );
+ if( value & 0x800000 ) value = - (value & 0x7fffff);;
+ return ((fortdouble) value)/1000.0;
+ }
+ else {
+ if( DEBUG1 ) printf("RGSELAT: not a lat/long grid\n");
+ return (fortdouble) -999999.0;
+ }
+}
+
+fortdouble RGSELON(gribProduct ** grib) {
+fortint value;
+ if( generalLatLonGrid( (*grib) ) ) {
+ value = g2_lastLon( (*grib) );
+ if( value & 0x800000 ) value = - (value & 0x7fffff);;
+ return ((fortdouble) value)/1000.0;
+ }
+ else {
+ if( DEBUG1 ) printf("RGSELON: not a lat/long grid\n");
+ return (fortdouble) -999999.0;
+ }
+}
+
+fortint IGRESCO(gribProduct ** grib) {
+ if( generalLatLonGrid( (*grib) ) )
+ return g2_resAndComp( (*grib) );
+ else {
+ if( DEBUG1 ) printf("IGRESCO: not a lat/long grid\n");
+ return (fortint) -999999;
+ }
+}
+
+fortdouble RGDI(gribProduct ** grib) {
+fortint value;
+ if( generalLatLonGrid( (*grib) ) ) {
+ value = g2_di( (*grib) );
+ if( value == 65535 )
+ return (fortdouble) -1;
+ else
+ return ((fortdouble) value )/1000.0;
+ }
+ else {
+ if( DEBUG1 ) printf("RGDI: not a lat/long grid\n");
+ return (fortdouble) -999999.0;
+ }
+}
+
+fortdouble RGDJ(gribProduct ** grib) {
+fortint value;
+ if( generalLatLonGrid( (*grib) ) ) {
+ value = g2_dj( (*grib) );
+ if( value == 65535 )
+ return (fortdouble) -1;
+ else
+ return ((fortdouble) value )/1000.0;
+ }
+ else {
+ if( DEBUG1 ) printf("RGDJ: not a lat/long grid\n");
+ return (fortdouble) -999999.0;
+ }
+}
+
+fortint IGGAUSS(gribProduct ** grib) {
+ if( anyGaussianGrid( (*grib) ) )
+ return g2_gaussNumber( (*grib) );
+ else {
+ if( DEBUG1 ) printf("IGGAUSS: not a gaussian grid\n");
+ return (fortint) -999999;
+ }
+}
+
+fortint IGSCANM(gribProduct ** grib) {
+ if( generalLatLonGrid( (*grib) ) )
+ return g2_scan( (*grib) );
+ else {
+ if( DEBUG1 ) printf("IGSCANM: not a lat/long grid\n");
+ return (fortint) -999999;
+ }
+}
+
+fortint IGJ(gribProduct ** grib) {
+ if( anySpectralField( (*grib) ) )
+ return g2_J( (*grib) );
+ else {
+ if( DEBUG1 ) printf("IGJ: not a spectral field\n");
+ return (fortint) -999999;
+ }
+}
+
+fortint IGK(gribProduct ** grib) {
+ if( anySpectralField( (*grib) ) )
+ return g2_K( (*grib) );
+ else {
+ if( DEBUG1 ) printf("IGK: not a spectral field\n");
+ return (fortint) -999999;
+ }
+}
+
+fortint IGM(gribProduct ** grib) {
+ if( anySpectralField( (*grib) ) )
+ return g2_M( (*grib) );
+ else {
+ if( DEBUG1 ) printf("IGM: not a spectral field\n");
+ return (fortint) -999999;
+ }
+}
+
+fortint IGREPMO(gribProduct ** grib) {
+ if( anySpectralField( (*grib) ) )
+ return g2_repmode( (*grib) );
+ else {
+ if( DEBUG1 ) printf("IGREPMO: not a spectral field\n");
+ return (fortint) -999999;
+ }
+}
+
+fortdouble RGIP(gribProduct ** grib) {
+ if( anySpectralField( (*grib) ) )
+ return ((fortdouble) g4_ip( (*grib) )/1000.0);
+ else {
+ if( DEBUG1 ) printf("RGIP: not a spectral field\n");
+ return (fortint) -999999;
+ }
+}
+
+fortint IGTJ(gribProduct ** grib) {
+ if( anySpectralField( (*grib) ) )
+ return g4_j( (*grib) );
+ else {
+ if( DEBUG1 ) printf("IGTJ: not a spectral field\n");
+ return (fortint) -999999;
+ }
+}
+
+fortint IGTK(gribProduct ** grib) {
+ if( anySpectralField( (*grib) ) )
+ return g4_k( (*grib) );
+ else {
+ if( DEBUG1 ) printf("IGTK: not a spectral field\n");
+ return (fortint) -999999;
+ }
+}
+
+fortint IGTM(gribProduct ** grib) {
+ if( anySpectralField( (*grib) ) )
+ return g4_m( (*grib) );
+ else {
+ if( DEBUG1 ) printf("IGTM: not a spectral field\n");
+ return (fortint) -999999;
+ }
+}
+
+fortdouble RGLATRP(gribProduct ** grib) {
+fortint value;
+ if( generalRotatedGrid( (*grib) ) ) {
+ value = g2_latSouthPole( (*grib) );
+ if( value & 0x800000 ) value = - (value & 0x7fffff);;
+ return ((fortdouble) value)/1000.0;
+ }
+ else {
+ if( DEBUG1 ) printf("RGLATRP: not a rotated grid\n");
+ return (fortint) -999999;
+ }
+}
+
+fortdouble RGLONRP(gribProduct ** grib) {
+fortint value;
+ if( generalRotatedGrid( (*grib) ) ) {
+ value = g2_lonSouthPole( (*grib) );
+ if( value & 0x800000 ) value = - (value & 0x7fffff);;
+ return ((fortdouble) value)/1000.0;
+ }
+ else {
+ if( DEBUG1 ) printf("RGLONRP: not a rotated grid\n");
+ return (fortint) -999999;
+ }
+}
+
+fortdouble RGROTAT(gribProduct ** grib) {
+unsigned char * rotation;
+ if( generalRotatedGrid( (*grib) ) ) {
+ rotation = ((*grib)->g2)->grid.latlon.angleOfRotationOrStretchingFactor;
+ return realValue(rotation);
+ }
+ else {
+ if( DEBUG1 ) printf("RGROTAT: not a rotated grid\n");
+ return (fortint) -999999;
+ }
+}
+
+fortdouble RGLATSP(gribProduct ** grib) {
+fortint value;
+ if( generalStretchedAndRotatedGrid( (*grib) ) ) {
+ value = g2_latStretching( (*grib) );
+ if( value & 0x800000 ) value = - (value & 0x7fffff);;
+ return ((fortdouble) value)/1000.0;
+ }
+ else {
+ if( generalStretchedGrid( (*grib) ) ) {
+ value = g2_latSouthPole( (*grib) );
+ if( value & 0x800000 ) value = - (value & 0x7fffff);;
+ return ((fortdouble) value)/1000.0;
+ }
+ else {
+ if( DEBUG1 ) printf("RGLATSP: not a stretched/rotated grid\n");
+ return (fortint) -999999;
+ }
+ }
+}
+
+fortdouble RGLONSP(gribProduct ** grib) {
+fortint value;
+ if( generalStretchedAndRotatedGrid( (*grib) ) ) {
+ value = g2_lonStretching( (*grib) );
+ if( value & 0x800000 ) value = - (value & 0x7fffff);;
+ return ((fortdouble) value)/1000.0;
+ }
+ else {
+ if( generalStretchedGrid( (*grib) ) ) {
+ value = g2_lonSouthPole( (*grib) );
+ if( value & 0x800000 ) value = - (value & 0x7fffff);;
+ return ((fortdouble) value)/1000.0;
+ }
+ else {
+ if( DEBUG1 ) printf("RGLONSP: not a stretched/rotated grid\n");
+ return (fortint) -999999;
+ }
+ }
+}
+
+fortdouble RGSFACT(gribProduct ** grib) {
+unsigned char * factor;
+ if( generalStretchedAndRotatedGrid( (*grib) ) ) {
+ factor = ((*grib)->g2)->grid.latlon.stretchingFactor;
+ return realValue(factor);
+ }
+ else
+ if( generalStretchedGrid( (*grib) ) ) {
+ factor = ((*grib)->g2)->grid.latlon.angleOfRotationOrStretchingFactor;
+ return realValue(factor);
+ }
+ else {
+ if( DEBUG1 ) printf("RGSFACT: not a stretched/rotated grid\n");
+ return (fortint) -999999;
+ }
+}
+
+fortint IGLEVTY(gribProduct ** grib) {
+ if( DEBUG2) printf("IGLEVTY\n");
+ return (fortint) g1_typeOfLevel((*grib));
+}
+
+fortdouble RGLEVTY(gribProduct ** grib) {
+ if( DEBUG2) printf("RGLEVTY\n");
+ return (fortdouble) IGLEVTY(grib);
+}
+
+fortint IGTUNIT(gribProduct ** grib) {
+ if( DEBUG2) printf("IGTUNIT\n");
+ return (fortint) g1_timeunit((*grib));
+}
+
+fortdouble RGTUNIT(gribProduct ** grib) {
+ if( DEBUG2) printf("RGTUNIT\n");
+ return (fortdouble) IGTUNIT(grib);
+}
+
+fortint IGTRIND(gribProduct ** grib) {
+ if( DEBUG2) printf("IGTRIND\n");
+ return (fortint) g1_timerange((*grib));
+}
+
+fortdouble RGTRIND(gribProduct ** grib) {
+ if( DEBUG2) printf("RGTRIND\n");
+ return (fortdouble) IGTRIND(grib);
+}
+
+fortint IGNUMAV(gribProduct ** grib) {
+ if( DEBUG2) printf("IGNUMAV\n");
+ return (fortint) g1_number((*grib));
+}
+
+fortdouble RGNUMAV(gribProduct ** grib) {
+ if( DEBUG2) printf("RGNUMAV\n");
+ return (fortdouble) IGNUMAV(grib);
+}
+
+fortint IGNUMMS(gribProduct ** grib) {
+ if( DEBUG2) printf("IGNUMMS\n");
+ return (fortint) g1_missing((*grib));
+}
+
+fortdouble RGNUMMS(gribProduct ** grib) {
+ if( DEBUG2) printf("RGNUMMS\n");
+ return (fortdouble) IGNUMMS(grib);
+}
+
+fortint IGSUBID(gribProduct ** grib) {
+ if( DEBUG2) printf("IGSUBID\n");
+ return (fortint) g1_subcentre((*grib));
+}
+
+fortdouble RGSUBID(gribProduct ** grib) {
+ if( DEBUG2) printf("RGSUBID\n");
+ return (fortdouble) IGSUBID(grib);
+}
+
+fortint IGUDECF(gribProduct ** grib) {
+fortint scale;
+
+ if( DEBUG2) printf("IGUDECF\n");
+
+ scale = g1_scale((*grib));
+ if( scale & 0x8000 ) scale = - (scale & 0x7fff);
+ return scale;
+}
+
+fortdouble RGUDECF(gribProduct ** grib) {
+ if( DEBUG2) printf("RGUDECF\n");
+ return (fortdouble) IGUDECF(grib);
+}
+
+fortint IGDUMMY(gribProduct ** grib) {
+ if( DEBUG2) printf("IGDUMMY\n");
+ return 0;
+}
+
+fortdouble RGDUMMY(gribProduct ** grib) {
+ if( DEBUG2) printf("RGDUMMY\n");
+ return 0;
+}
+
+fortint numberOfValuesInSection4(gribProduct * grib) {
+fortint loop, total = 0, count = 0;
+unsigned char * value;
+
+ if( generalLatLonGrid(grib) )
+ if( directionIncrementsGiven(grib) )
+ return g2_ni(grib)*g2_nj(grib);
+ else {
+ value = (unsigned char *) (grib->g2) + 4*g2_NV(grib) + g2_PV_PL(grib) - 1;
+ for( loop = 0; loop < g2_nj(grib); loop++ ) {
+ total += TWOBYTEINT(value);
+ value += 2;
+ }
+ return total;
+ }
+ else if( anySpectralField(grib) )
+ return (g2_J(grib)+1)*(g2_J(grib)+2);
+
+ return 0;
+}
+
+fortint g4_offset(gribProduct * grib) {
+int flag = g4_flag(grib);
+
+ if(gridPoint(grib) &&
+ simplePacking(grib) &&
+ floatingPoint(grib) &&
+ noAdditionalFlags(grib)) return 12;
+
+ if((!gridPoint(grib)))
+ if(simplePacking(grib)) return 12;
+ else
+ return 19;
+
+ return 12;
+}
+
+fortint IGNVALU(gribProduct ** grib) {
+ return numberOfValuesInSection4( (*grib) );
+}
+
+fortint GVALUES(
+ gribProduct ** grib,
+ fortdouble * array,
+ fortint * arraySize,
+ fortint * notMissing,
+ fortdouble * userSuppliedMissingValue ) {
+gribProduct * g = *grib;
+fortdouble * arr = array;
+fortint outerLoop, innerLoop, loop, numberOfValues, numberNotMissing;
+unsigned char * value, * bitStart;
+fortdouble IP;
+double * powerFactor;
+fortdouble scale, minimum, missingValue;
+fortint packedBits,nextValueFirstBit,bitsPerValue;
+fortint subsetTruncation, fieldTruncation;
+unsigned char * nextUnpacked, * nextPacked;
+unsigned char * primaryBitmap;
+unsigned char * secondaryBitmap;
+unsigned char * listOfWidths;
+unsigned char * firstOrderPackedValues;
+unsigned char * secondOrderPackedValues;
+fortint primaryBit, secondaryBit;
+fortint firstOrderValue, secondOrderValue, width;
+fortint nextFirstOrderValue = 0;
+fortint nextSecondOrderValue = 0;
+fortint nextWidth = 0;
+fortint nextPrimaryBit = 0;
+fortint nextSecondaryBit = 0;
+fortint firstOrderPackedValueSize = g4_bits(g);
+fortint one = 1, eight = 8;
+fortint primaryBitmapped = primaryBitmapPresent(g);
+
+ if( !(numberOfValues = numberOfValuesInSection4(g)) ) {
+ if( DEBUG1 ) printf("GVALUES: no values found in GRIB.\n");
+ return (fortint) 0;
+ }
+
+ if( numberOfValues > *arraySize ) {
+ if( DEBUG1 ) printf("GVALUES: user array too small for field values.\n");
+ return (fortint) -1;
+ }
+
+ minimum = referenceValue(g),
+ missingValue = *userSuppliedMissingValue;
+
+ scale = (fortdouble) RGDSCAL(grib);
+ value = (unsigned char *)(g->g4) + g4_offset(g) - 1;
+ bitsPerValue = g4_bits(g);
+ nextValueFirstBit = 0;
+
+ if( anySpectralField(g) ) {
+ numberNotMissing = numberOfValues;
+/*
+// Spectral simple packing
+*/
+ if( simplePacking(g) ) {
+ GBYTE(value,&packedBits,&nextValueFirstBit,&bitsPerValue);
+ *arr = realValue(value);
+ value += 4;
+ for( loop = 1; loop < numberOfValues; loop++ ) {
+ GBYTE(value,&packedBits,&nextValueFirstBit,&bitsPerValue);
+ nextValueFirstBit += bitsPerValue;
+ *(arr+loop) = minimum + ((fortdouble) packedBits) * scale;
+ }
+ }
+/*
+// Spectral complex packing
+*/
+ else {
+ fieldTruncation = g2_J(g)+1;
+ subsetTruncation = g4_j(g)+1;
+ nextUnpacked = value;
+ nextPacked = value + (subsetTruncation*(subsetTruncation+1))*4;
+ loop = 0;
+ for( outerLoop = 0; outerLoop < fieldTruncation; outerLoop++ ) {
+ if(outerLoop < subsetTruncation) {
+ for(innerLoop=outerLoop;innerLoop<fieldTruncation;innerLoop++) {
+ if(innerLoop < subsetTruncation) {
+ *(arr+loop) = realValue(nextUnpacked);
+ loop++;
+ nextUnpacked += 4;
+ *(arr+loop) = realValue(nextUnpacked);
+ loop++;
+ nextUnpacked += 4;
+ }
+ else {
+ GBYTE(nextPacked,&packedBits,&nextValueFirstBit,&bitsPerValue);
+ nextValueFirstBit += bitsPerValue;
+ *(arr+loop) = minimum + ((fortdouble) packedBits) * scale;
+ loop++;
+ GBYTE(nextPacked,&packedBits,&nextValueFirstBit,&bitsPerValue);
+ nextValueFirstBit += bitsPerValue;
+ *(arr+loop) = minimum + ((fortdouble) packedBits) * scale;
+ loop++;
+ }
+ }
+ }
+ else {
+ for(innerLoop=outerLoop;innerLoop<fieldTruncation;innerLoop++){
+ GBYTE(nextPacked,&packedBits,&nextValueFirstBit,&bitsPerValue);
+ nextValueFirstBit += bitsPerValue;
+ *(arr+loop) = minimum + ((fortdouble) packedBits) * scale;
+ loop++;
+ GBYTE(nextPacked,&packedBits,&nextValueFirstBit,&bitsPerValue);
+ nextValueFirstBit += bitsPerValue;
+ *(arr+loop) = minimum + ((fortdouble) packedBits) * scale;
+ loop++;
+ }
+ }
+ }
+/*
+// NB. ECMWF bug misses storing unpacked one value in each line of subset
+*/
+ IP = RGIP(grib);
+ powerFactor = (double *) allocateMemory(fieldTruncation*sizeof(double));
+ powerFactor[0] = 1.0;
+ for( loop = 1; loop < fieldTruncation; loop++ ) {
+ *(powerFactor+loop) =
+ (double) 1.0/pow((double)((loop+1)*(loop+2)),(double)IP);
+ }
+
+ loop = 0;
+ for( outerLoop = 0; outerLoop < (subsetTruncation-1); outerLoop++ ) {
+ for( innerLoop = outerLoop; innerLoop < fieldTruncation; innerLoop++ ) {
+ if( innerLoop >= (subsetTruncation-1) ) {
+ *(arr+loop) *= powerFactor[innerLoop-1];
+ *(arr+loop+1) *= powerFactor[innerLoop-1];
+ }
+ loop += 2;
+ }
+ }
+ for(outerLoop=(subsetTruncation-1);outerLoop<fieldTruncation;outerLoop++){
+ for( innerLoop = outerLoop; innerLoop < fieldTruncation; innerLoop++ ) {
+ *(arr+loop) *= powerFactor[innerLoop-1];
+ *(arr+loop+1) *= powerFactor[innerLoop-1];
+ loop += 2;
+ }
+ }
+ freeMemory(powerFactor);
+ }
+ }
+/*
+// Grid-point simple packing
+*/
+ else {
+ if( simplePacking(g) ) {
+ primaryBit = 1;
+ numberNotMissing = 0;
+
+ if( primaryBitmapped ) primaryBitmap = (unsigned char*)(g->g3) + 6;
+
+ for( loop = 0; loop < numberOfValues; loop++ ) {
+
+ if( primaryBitmapped ) {
+ primaryBit = getSingleMapBit(primaryBitmap,nextPrimaryBit);
+ nextPrimaryBit++;
+ }
+
+ if( primaryBit ) {
+ GBYTE(value,&packedBits,&nextValueFirstBit,&bitsPerValue);
+ *(arr+loop) = minimum + ((fortdouble) packedBits) * scale;
+ nextValueFirstBit += bitsPerValue;
+ numberNotMissing++;
+ }
+ else
+ *(arr+loop) = missingValue;
+ }
+ }
+/*
+// Grid-point second-order packing
+*/
+ else {
+ listOfWidths = (unsigned char *)(g->g4) + g4_offset(g) + 10 - 1;
+ GBYTE(listOfWidths,&width,&nextWidth,&eight);
+
+ firstOrderPackedValues = (unsigned char *)(g->g4) + g4_n1(g) - 1;
+ secondOrderPackedValues = (unsigned char *)(g->g4) + g4_n2(g) - 1;
+
+ numberNotMissing = 0;
+
+ if( primaryBitmapped ) primaryBitmap = (unsigned char*)(g->g3) + 6;
+
+ if( secondaryBitmapPresent(g) ) {
+ if( differentWidths(g) )
+ secondaryBitmap = (unsigned char *) listOfWidths + g4_p1(g);
+ else
+ secondaryBitmap = (unsigned char *) listOfWidths + 1;
+ }
+
+ for( loop = 0; loop < numberOfValues; loop++ ) {
+
+ if( primaryBitmapped ) {
+ primaryBit = getSingleMapBit(primaryBitmap,nextPrimaryBit);
+ nextPrimaryBit++;
+ }
+ else
+ primaryBit = 1;
+
+ if( primaryBit ) {
+ if( secondaryBitmapPresent(g) ) {
+ secondaryBit = getSingleMapBit(secondaryBitmap,nextSecondaryBit);
+ nextSecondaryBit++;
+ }
+ else
+ secondaryBit = MULTIPLE(loop,g2_ni(g)) ;
+
+ if( secondaryBit ) {
+ GBYTE(firstOrderPackedValues,&firstOrderValue,
+ &nextFirstOrderValue,&firstOrderPackedValueSize);
+ nextFirstOrderValue += firstOrderPackedValueSize;
+
+ if( differentWidths(g) ) {
+ GBYTE(listOfWidths,&width,&nextWidth,&eight);
+ nextWidth += 8;
+ }
+ }
+
+ if( width ) {
+ GBYTE(secondOrderPackedValues,&secondOrderValue,
+ &nextSecondOrderValue,&width);
+ nextSecondOrderValue += width;
+ }
+ else
+ secondOrderValue = 0;
+
+ *(arr+loop) = minimum +
+ ((fortdouble)(firstOrderValue+secondOrderValue))*scale;
+ numberNotMissing++;
+ }
+ else
+ *(arr+loop) = missingValue;
+ }
+ }
+ }
+
+ *notMissing = numberNotMissing;
+ if( DEBUG1 ) printf("GVALUES: number of field values = %d\n",numberOfValues);
+ return (fortint) numberOfValues;
+}
+
+void GVEND(gribProduct ** grib) {
+gribProduct * g;
+
+ g = *grib;
+
+ if( g->currentPoint.latitude != NULL ) {
+ freeMemory(g->currentPoint.latitude);
+ g->currentPoint.latitude = NULL;
+ }
+
+ if( g->currentPoint.longitudeIncrement != NULL ) {
+ freeMemory(g->currentPoint.longitudeIncrement);
+ g->currentPoint.longitudeIncrement = NULL;
+ }
+
+ if( g->expandedValues != NULL ) {
+ freeMemory(g->expandedValues);
+ g->expandedValues = NULL;
+ }
+
+ if( g->latitudeOffsets != NULL ) {
+ freeMemory(g->latitudeOffsets);
+ g->latitudeOffsets = NULL;
+ }
+
+ return;
+}
+
+fortint setupIrregularLongitudeIncrements(gribProduct ** grib, fortint nj) {
+gribProduct * g = *grib;
+fortint * numberOfPointsPerLatitude;
+fortint nrows, loop, count;
+
+ g->latitudeOffsets = (fortint *) allocateMemory((nj+1)*sizeof(fortint));
+ numberOfPointsPerLatitude = (fortint *) allocateMemory(nj*sizeof(fortint));
+ nrows = GPL(grib,numberOfPointsPerLatitude,&nj);
+ if( nrows != nj ) return (fortint) -4;
+
+ g->latitudeOffsets[0] = 0;
+ for( loop = 0; loop < nj; loop++ ) {
+ count = numberOfPointsPerLatitude[loop];
+ g->latitudeOffsets[loop+1] = g->latitudeOffsets[loop] + count;
+ if( count != 0 )
+ g->currentPoint.longitudeIncrement[loop] =
+ 360.0 / (fortdouble) numberOfPointsPerLatitude[loop];
+ else
+ g->currentPoint.longitudeIncrement[loop] = 0.0;
+ }
+ freeMemory(numberOfPointsPerLatitude);
+
+ return (fortint) 0;
+}
+
+fortint GVINIT(gribProduct ** grib, fortdouble * missingValue) {
+gribProduct * g;
+fortint regular, ni, nj, loop, status;
+fortdouble latitudeStep, longitudeStep, north;
+
+ if( grib == NULL) {
+ if( DEBUG1 ) printf("GVINIT: grib empty. Was GDECODE called?\n");
+ return (fortint) -1;
+ }
+ g = *grib;
+/*
+// Only gaussian or lat/lon grid point fields can be handled
+*/
+ if( !generalLatLonGrid(g) ) {
+ if( DEBUG1 )
+ printf("GVINIT: only gaussian or lat/lon grid point fields handled\n");
+ return (fortint) -2;
+ }
+
+ g->numberOfValues = numberOfValuesInSection4(g);
+ g->value = (unsigned char *)(g->g4) + g4_offset(g) - 1;
+ g->bitStart = (unsigned char *)(g->g3) + 6;
+ g->bitsPerValue = g4_bits(g);
+ g->bitmapped = primaryBitmapPresent(g);
+ g->nextValueFirstBit = 0;
+ g->nextBit = 0;
+ g->scale = (fortdouble) RGDSCAL(grib);
+ g->minimum = referenceValue(g);
+ g->missingValue = *missingValue;
+
+ ni = g2_ni(g);
+ nj = g2_nj(g);
+ g->currentPoint.latitude = (fortdouble *) allocateMemory(nj*sizeof(fortdouble));
+
+ g->currentPoint.longitudeIncrement = (fortdouble *) allocateMemory(nj*sizeof(fortdouble));
+
+ regular = directionIncrementsGiven(g);
+
+ if( anyLatLonGrid(g) ) {
+ north = RGNWLAT(grib);
+ latitudeStep = RGDJ(grib);
+ longitudeStep = RGDI(grib);
+ for( loop = 0; loop < nj; loop++ )
+ g->currentPoint.latitude[loop] = north - (latitudeStep * (fortdouble) loop);
+ }
+ else {
+ fortint zero = 0, minusOne = -1;
+ status = IGGLAT(&nj,g->currentPoint.latitude,&zero,&minusOne);
+ if( status != 0 ) return (fortint) -5;
+ longitudeStep = 360.0 / (fortdouble) (2*nj);
+ }
+
+ if( regular )
+ for( loop = 0; loop < nj; loop++ )
+ g->currentPoint.longitudeIncrement[loop] = longitudeStep;
+ else
+ setupIrregularLongitudeIncrements(grib, nj);
+
+ if( ! simplePacking(g) ) {
+ fortint notMissing;
+ fortint numberOfValues = g->numberOfValues;
+
+ g->expandedValues = (fortdouble *) allocateMemory(numberOfValues*sizeof(fortdouble));
+
+ status =
+ GVALUES(grib,g->expandedValues,&numberOfValues,¬Missing,missingValue);
+ if( status != numberOfValues ) return (fortint) -6;
+ }
+
+ return (fortint) (g->currentPointIndex = 1);
+}
+
+fortint GVECTOR(
+ gribProduct ** grib,
+ fortdouble * latitude,
+ fortdouble * longitude,
+ fortdouble * pointValue) {
+gribProduct * g;
+fortint loop, bit, packedBits, current, ni, nj, one = 1;
+fortint regular, latitudeIndex, longitudeIndex, currentLatitude;
+
+ if( grib == NULL) {
+ if( DEBUG1 ) printf("GVECTOR: grib empty. Was GDECODE called?\n");
+ return (fortint) -1;
+ }
+
+ g = *grib;
+ current = ((g->currentPointIndex)++ - 1);
+ if( current >= g->numberOfValues ) {
+ if( DEBUG1 ) printf("GVECTOR: all field values already supplied\n");
+ return (fortint) -2;
+ }
+
+ regular = directionIncrementsGiven(g);
+
+ if( regular) {
+ ni = g2_ni(g);
+ nj = g2_nj(g);
+
+ latitudeIndex = current/ni;
+ longitudeIndex = current - ((current/ni)*ni);
+ *latitude = g->currentPoint.latitude[latitudeIndex];
+ *longitude = g->currentPoint.longitudeIncrement[latitudeIndex]*longitudeIndex;
+ }
+ else {
+ currentLatitude = -1;
+ while( current >= g->latitudeOffsets[++currentLatitude]);
+ latitudeIndex = currentLatitude - 1;
+ longitudeIndex = current - g->latitudeOffsets[latitudeIndex];
+ *latitude = g->currentPoint.latitude[latitudeIndex];
+ *longitude = g->currentPoint.longitudeIncrement[latitudeIndex]*longitudeIndex;
+ }
+
+ if( ! simplePacking(g) ) {
+ *pointValue = *(g->expandedValues + current);
+ }
+ else {
+ bit = 1;
+ if( g->bitmapped ) {
+ bit = getSingleMapBit(g->bitStart,g->nextBit);
+ g->nextBit++;
+ }
+
+ if( bit ) {
+ GBYTE(g->value,&packedBits,&(g->nextValueFirstBit),&(g->bitsPerValue));
+ g->nextValueFirstBit += g->bitsPerValue;
+ *pointValue = g->minimum + ((fortdouble) packedBits) * g->scale;
+ }
+ else
+ *pointValue = g->missingValue;
+ }
+
+ return (current+1);
+}
+
+fortint getSingleMapBit(unsigned char * map, fortint bitNumber) {
+fortint byteOffset = (bitNumber>>3);
+fortint bitOffset = bitNumber - (byteOffset<<3);
+
+ return (fortint) ((map[byteOffset]>>(7-bitOffset))&0x1);
+}
+
+void * allocateMemory(size_t size) {
+void * memoryPointer = (void *) malloc(size);
+
+ if( DEBUG2 ) printf("allocateMemory: allocated %d memory bytes\n",size);
+ if( memoryPointer == NULL ) {
+ printf("allocateMemory: requested number of bytes = %d\n", size);
+ perror("allocateMemory: memory allocation failed");
+ exit(1);
+ }
+ if( DEBUG2 )
+ printf("allocateMemory: allocated memory pointer = %0x\n", memoryPointer);
+ return memoryPointer;
+}
+
+void freeMemory(void * memoryPointer) {
+ if( DEBUG2 )
+ printf("freeMemory: freeing memory pointer = %0x\n", memoryPointer);
+ if( memoryPointer != NULL ) free(memoryPointer);
+ return;
+}
diff --git a/gribex/gdecode.h b/gribex/gdecode.h
new file mode 100755
index 0000000..82ff296
--- /dev/null
+++ b/gribex/gdecode.h
@@ -0,0 +1,424 @@
+#ifndef GDECODE_H
+#define GDECODE_H
+#include <stdio.h>
+#include <stdlib.h>
+#include "fortint.h"
+#include <string.h>
+#include <ctype.h>
+
+#include "gdecodeStruct.h"
+
+#include "sencode1.h"
+
+#ifdef FORTRAN_NO_UNDERSCORE
+#define IGGLAT igglat
+#define GBYTE gbyte
+#define GDECODE gdecode
+#define IGLNGTH iglngth
+#define IGTABLE igtable
+#define IGCENTR igcentr
+#define IGPARAM igparam
+#define IGLEVEL iglevel
+#define IGLEVL1 iglevl1
+#define IGLEVL2 iglevl2
+#define IGDATE igdate
+#define IGTIME igtime
+#define IGSTEP igstep
+#define IGSTEP1 igstep1
+#define IGSTEP2 igstep2
+#define IGDEFIN igdefin
+#define IGCLASS igclass
+#define IGTYPE igtype
+#define IGSTREM igstrem
+#define IGEXPVR igexpvr
+#define IGNUMPV ignumpv
+#define GPV gpv
+#define GPL gpl
+#define IGREPRS igreprs
+#define IGNI igni
+#define IGNJ ignj
+#define RGNWLAT rgnwlat
+#define RGNWLON rgnwlon
+#define IGRESCO igresco
+#define RGSELAT rgselat
+#define RGSELON rgselon
+#define RGDI rgdi
+#define RGDJ rgdj
+#define IGGAUSS iggauss
+#define IGSCANM igscanm
+#define IGJ igj
+#define IGK igk
+#define IGM igm
+#define IGREPMO igrepmo
+#define RGIP rgip
+#define IGTJ igtj
+#define IGTK igtk
+#define IGTM igtm
+#define RGLATRP rglatrp
+#define RGLONRP rglonrp
+#define RGROTAT rgrotat
+#define RGLATSP rglatsp
+#define RGLONSP rglonsp
+#define RGSFACT rgsfact
+#define RGREFVL rgrefvl
+#define IGBTSPV igbtspv
+#define RGDSCAL rgdscal
+#define IGUNUSD igunusd
+#define IGNVALU ignvalu
+#define GVALUES gvalues
+#define GVINIT gvinit
+#define GVECTOR gvector
+#define GVEND gvend
+#define IGLEVTY iglevty
+#define RGLEVTY rglevty
+#define IGNUMAV ignumav
+#define RGNUMAV rgnumav
+#define IGNUMMS ignumms
+#define RGNUMMS rgnumms
+#define IGSUBID igsubid
+#define RGSUBID rgsubid
+#else
+#define IGGLAT igglat_
+#define GBYTE gbyte_
+#define GDECODE gdecode_
+#define IGLNGTH iglngth_
+#define IGTABLE igtable_
+#define IGCENTR igcentr_
+#define IGPARAM igparam_
+#define IGLEVEL iglevel
+#define IGLEVL1 iglevl1
+#define IGLEVL2 iglevl2
+#define IGDATE igdate_
+#define IGTIME igtime_
+#define IGSTEP igstep_
+#define IGSTEP1 igstep1_
+#define IGSTEP2 igstep2_
+#define IGDEFIN igdefin_
+#define IGCLASS igclass_
+#define IGTYPE igtype_
+#define IGSTREM igstrem_
+#define IGEXPVR igexpvr_
+#define IGNUMPV ignumpv_
+#define GPV gpv_
+#define GPL gpl_
+#define IGREPRS igreprs_
+#define IGNI igni_
+#define IGNJ ignj_
+#define RGNWLAT rgnwlat_
+#define RGNWLON rgnwlon_
+#define IGRESCO igresco_
+#define RGSELAT rgselat_
+#define RGSELON rgselon_
+#define RGDI rgdi_
+#define RGDJ rgdj_
+#define IGGAUSS iggauss_
+#define IGSCANM igscanm_
+#define IGJ igj_
+#define IGK igk_
+#define IGM igm_
+#define IGREPMO igrepmo_
+#define RGIP rgip_
+#define IGTJ igtj_
+#define IGTK igtk_
+#define IGTM igtm_
+#define RGLATRP rglatrp_
+#define RGLONRP rglonrp_
+#define RGROTAT rgrotat_
+#define RGLATSP rglatsp_
+#define RGLONSP rglonsp_
+#define RGSFACT rgsfact_
+#define RGREFVL rgrefvl_
+#define IGBTSPV igbtspv_
+#define RGDSCAL rgdscal_
+#define IGUNUSD igunusd_
+#define IGNVALU ignvalu_
+#define GVALUES gvalues_
+#define GVINIT gvinit_
+#define GVECTOR gvector_
+#define GVEND gvend_
+#define IGLEVTY iglevty_
+#define RGLEVTY rglevty_
+#define IGNUMAV ignumav_
+#define RGNUMAV rgnumav_
+#define IGNUMMS ignumms_
+#define RGNUMMS rgnumms_
+#define IGSUBID igsubid_
+#define RGSUBID rgsubid_
+#endif
+
+#define MOVE1BYTE(p,n) ( *(p) = ((*(n)>> 0) & 0xFF) )
+#define MOVE2BYTES(p,n) ( *(p) = ((*(n)>> 8) & 0xFF) ) , \
+ ( *((p)+1) = ((*(n)>> 0) & 0xFF) )
+#define MOVE3BYTES(p,n) ( *(p) = ((*(n)>>16) & 0xFF) ) , \
+ ( *((p)+1) = ((*(n)>> 8) & 0xFF) ) , \
+ ( *((p)+2) = ((*(n)>> 0) & 0xFF) )
+#define MOVE4BYTES(p,n) ( *(p) = ((*(n)>>24) & 0xFF) ) , \
+ ( *((p)+1) = ((*(n)>>16) & 0xFF) ) , \
+ ( *((p)+2) = ((*(n)>> 8) & 0xFF) ) , \
+ ( *((p)+3) = ((*(n)>> 0) & 0xFF) )
+
+#define MOD(a,b) ((a) - ((a)/(b))*(b))
+#define MULTIPLE(a,b) ( MOD(a,b) == 0 )
+
+#define ONEBYTEINT(a) (fortint) ( *(a) )
+#define TWOBYTEINT(a) (fortint) ( (*(a))<<8 | (*((a)+1))<<0 )
+#define THREEBYTEINT(a) (fortint) (TWOBYTEINT((a))<<8 | (*((a)+2))<<0 )
+#define FOURBYTEINT(a) (fortint) (THREEBYTEINT((a))<<8 | (*((a)+3))<<0 )
+/*
+// Section 0
+*/
+#define g0_length(a) THREEBYTEINT((a->g0)->totalGRIBlength)
+#define g0_edition(a) ONEBYTEINT((a->g0)->editionNumber)
+/*
+// Section 1
+*/
+#define g1_length(a) THREEBYTEINT((a->g1)->sectionLength)
+#define g1_table(a) ONEBYTEINT((a->g1)->tableVersionNumber)
+#define g1_centre(a) ONEBYTEINT((a->g1)->originatingCentre)
+#define g1_process(a) ONEBYTEINT((a->g1)->generatingProcessId)
+#define g1_grid(a) ONEBYTEINT((a->g1)->gridDefinition)
+#define g1_flag(a) ONEBYTEINT((a->g1)->section2and3PresentFlag)
+#define g1_parameter(a) ONEBYTEINT((a->g1)->parameter)
+#define g1_typeOfLevel(a) ONEBYTEINT((a->g1)->typeOfLevel)
+#define g1_level1(a) ONEBYTEINT((a->g1)->level1)
+#define g1_level2(a) ONEBYTEINT((a->g1)->level2)
+#define g1_year(a) ONEBYTEINT((a->g1)->year)
+#define g1_month(a) ONEBYTEINT((a->g1)->month)
+#define g1_day(a) ONEBYTEINT((a->g1)->day)
+#define g1_hour(a) ONEBYTEINT((a->g1)->hour)
+#define g1_minute(a) ONEBYTEINT((a->g1)->minute)
+#define g1_timeunit(a) ONEBYTEINT((a->g1)->unitOfTimeRange)
+#define g1_P1(a) ONEBYTEINT((a->g1)->P1)
+#define g1_P2(a) ONEBYTEINT((a->g1)->P2)
+#define g1_timerange(a) ONEBYTEINT((a->g1)->timeRangeIndicator)
+#define g1_number(a) TWOBYTEINT((a->g1)->numberInAverage)
+#define g1_missing(a) ONEBYTEINT((a->g1)->numberMissing)
+#define g1_century(a) ONEBYTEINT((a->g1)->century)
+#define g1_subcentre(a) ONEBYTEINT((a->g1)->subCentreId)
+#define g1_scale(a) TWOBYTEINT((a->g1)->unitsDecimalScaleFactor)
+#define g1_definition(a) ONEBYTEINT((a->g1)->local.mars.definition)
+#define g1_class(a) ONEBYTEINT((a->g1)->local.mars.ecmwfClass)
+#define g1_type(a) ONEBYTEINT((a->g1)->local.mars.type)
+#define g1_stream(a) TWOBYTEINT((a->g1)->local.mars.stream)
+#define g1_expver(a) FOURBYTEINT((a->g1)->local.mars.experimentVersionNumber)
+
+#define centreUsingECMWFLocalDefinition(a) \
+ ((g1_subcentre(a)==98)&&(g1_length(a)>=40))
+
+#define ecmwfLocalDefinitionPresent(a) ((g1_centre(a)==98)&&(g1_length(a)>=40))
+
+#define ecmwfLocalDefinition1Present(a) \
+ ( ecmwfLocalDefinitionPresent(a) && (g1_definition(a)==1) )
+#define ecmwfLocalDefinition2Present(a) \
+ ( ecmwfLocalDefinitionPresent(a) && (g1_definition(a)==2) )
+
+#define g1_1_number(a) ONEBYTEINT((a->g1)->local.contents.def1.number)
+#define g1_1_total(a) ONEBYTEINT((a->g1)->local.contents.def1.total)
+
+#define g1_2_number(a) ONEBYTEINT((a->g1)->local.contents.def2.number)
+#define g1_2_total(a) ONEBYTEINT((a->g1)->local.contents.def2.total)
+#define g1_2_method(a) ONEBYTEINT((a->g1)->local.contents.def2.method)
+#define g1_2_start(a) TWOBYTEINT((a->g1)->local.contents.def2.startTimestep)
+#define g1_2_end(a) TWOBYTEINT((a->g1)->local.contents.def2.endTimestep)
+#define g1_2_control(a) ONEBYTEINT((a->g1)->local.contents.def2.controlForecastCluster)
+#define g1_2_operational(a) ONEBYTEINT((a->g1)->local.contents.def2.operationalForecastCluster)
+#define g1_2_count(a) ONEBYTEINT((a->g1)->local.contents.def2.numberInCluster)
+#define g1_2_domainN(a) THREEBYTEINT((a->g1)->local.contents.def2.domainNorthLatitude)
+#define g1_2_domainW(a) THREEBYTEINT((a->g1)->local.contents.def2.domainWestLongitude)
+#define g1_2_domainS(a) THREEBYTEINT((a->g1)->local.contents.def2.domainSouthLatitude)
+#define g1_2_domainE(a) THREEBYTEINT((a->g1)->local.contents.def2.domainEastLongitude)
+/*
+// Section 2
+*/
+#define g2_length(a) THREEBYTEINT((a->g2)->sectionLength)
+#define g2_NV(a) ONEBYTEINT((a->g2)->NV)
+#define g2_PV_PL(a) ONEBYTEINT((a->g2)->PV_PL)
+#define g2_datatype(a) ONEBYTEINT((a->g2)->dataRepresentationType)
+#define g2_ni(a) TWOBYTEINT((a->g2)->grid.latlon.numberOfPointsAlongParallel)
+#define g2_nj(a) TWOBYTEINT((a->g2)->grid.latlon.numberOfPointsAlongMeridian)
+#define g2_firstLat(a) THREEBYTEINT((a->g2)->grid.latlon.latitudeOfFirstPoint)
+#define g2_firstLon(a) THREEBYTEINT((a->g2)->grid.latlon.longitudeOfFirstPoint)
+#define g2_lastLat(a) THREEBYTEINT((a->g2)->grid.latlon.latitudeOfLastPoint)
+#define g2_lastLon(a) THREEBYTEINT((a->g2)->grid.latlon.longitudeOfLastPoint)
+#define g2_resAndComp(a) ONEBYTEINT((a->g2)->grid.latlon.resolutionAndComponentsFlag)
+#define g2_scan(a) ONEBYTEINT((a->g2)->grid.latlon.scanningMode)
+#define g2_di(a) TWOBYTEINT((a->g2)->grid.latlon.iDirectionIncrement)
+#define g2_dj(a) TWOBYTEINT((a->g2)->grid.latlon.jDirectionIncrement)
+#define g2_gaussNumber(a) TWOBYTEINT((a->g2)->grid.gaussian.numberOfParallelsBetweenPoleAndEquator)
+#define g2_latSouthPole(a) THREEBYTEINT((a->g2)->grid.latlon.latitudeOfSouthPole)
+#define g2_lonSouthPole(a) THREEBYTEINT((a->g2)->grid.latlon.longitudeOfSouthPole)
+#define g2_rotOrStretch(a) FOURBYTEINT((a->g2)->grid.latlon.angleOfRotationOrStretchingFactor)
+#define g2_latStretching(a) THREEBYTEINT((a->g2)->grid.latlon.latitudeOfPoleOfStretching)
+#define g2_lonStretching(a) THREEBYTEINT((a->g2)->grid.latlon.longitudeOfPoleOfStretching)
+#define g2_stretchingFactor(a) FOURBYTEINT((a->g2)->grid.latlon.stretchingFactor)
+#define g2_J(a) TWOBYTEINT((a->g2)->grid.spectral.J)
+#define g2_K(a) TWOBYTEINT((a->g2)->grid.spectral.K)
+#define g2_M(a) TWOBYTEINT((a->g2)->grid.spectral.M)
+#define g2_repmode(a) ONEBYTEINT((a->g2)->grid.spectral.representationMode)
+
+#define basicSpectralField(a) (g2_datatype(a)==50)
+#define rotatedSpectralField(a) (g2_datatype(a)==60)
+#define stretchedSpectralField(a) (g2_datatype(a)==70)
+#define rotatedAndStretchedSpectralField(a) (g2_datatype(a)==80)
+#define anySpectralField(a) (basicSpectralField(a)||\
+ rotatedSpectralField(a)||\
+ stretchedSpectralField(a)||\
+ rotatedAndStretchedSpectralField(a))
+
+#define basicGaussianGrid(a) (g2_datatype(a)== 4)
+#define rotatedGaussianGrid(a) (g2_datatype(a)==14)
+#define stretchedGaussianGrid(a) (g2_datatype(a)==24)
+#define rotatedAndStretchedGaussianGrid(a) (g2_datatype(a)==34)
+#define anyGaussianGrid(a) (basicGaussianGrid(a)||\
+ rotatedGaussianGrid(a)||\
+ stretchedGaussianGrid(a)||\
+ rotatedAndStretchedGaussianGrid(a))
+
+#define basicLatLonGrid(a) (g2_datatype(a)== 0)
+#define rotatedLatLonGrid(a) (g2_datatype(a)==10)
+#define stretchedLatLonGrid(a) (g2_datatype(a)==20)
+#define rotatedAndStretchedLatLonGrid(a) (g2_datatype(a)==30)
+#define anyLatLonGrid(a) (basicLatLonGrid(a)||\
+ rotatedLatLonGrid(a)||\
+ stretchedLatLonGrid(a)||\
+ rotatedAndStretchedLatLonGrid(a))
+
+#define generalLatLonGrid(a) (anyGaussianGrid(a)||anyLatLonGrid(a))
+#define generalRotatedGrid(a) (rotatedLatLonGrid(a)||\
+ rotatedAndStretchedLatLonGrid(a)||\
+ rotatedGaussianGrid(a)||\
+ rotatedAndStretchedGaussianGrid(a)||\
+ rotatedSpectralField(a)||\
+ rotatedAndStretchedSpectralField(a))
+#define generalStretchedGrid(a) (stretchedLatLonGrid(a)||\
+ rotatedAndStretchedLatLonGrid(a)||\
+ stretchedGaussianGrid(a)||\
+ rotatedAndStretchedSpectralField(a)||\
+ stretchedSpectralField(a)||\
+ rotatedAndStretchedGaussianGrid(a))
+#define generalStretchedAndRotatedGrid(a) (rotatedAndStretchedLatLonGrid(a)||\
+ rotatedAndStretchedGaussianGrid(a))
+#define directionIncrementsGiven(a) ((g2_resAndComp(a)&0x80)&&(g2_di(a)!=0xffff))
+/*
+// Section 3
+*/
+#define g3_length(a) THREEBYTEINT((a->g3)->sectionLength)
+#define g3_table(a) ONEEBYTEINT((a->g3)->tableReference)
+#define primaryBitmapPresent(a) ( g1_flag(a) & 0x40 )
+/*
+// Section 4
+*/
+#define g4_length(a) THREEBYTEINT((a->g4)->sectionLength)
+#define g4_flag(a) ONEBYTEINT((a->g4)->flag)
+#define g4_scale(a) TWOBYTEINT((a->g4)->scaleFactor)
+#define g4_reference(a) FOURBYTEINT((a->g4)->referenceValue)
+#define g4_bits(a) ONEBYTEINT((a->g4)->numberOfBitsPerValue)
+#define g4_n(a) TWOBYTEINT((a->g4)->data.complexSpectral.N)
+#define g4_ip(a) TWOBYTEINT((a->g4)->data.complexSpectral.IP)
+#define g4_j(a) ONEBYTEINT((a->g4)->data.complexSpectral.J)
+#define g4_k(a) ONEBYTEINT((a->g4)->data.complexSpectral.K)
+#define g4_m(a) ONEBYTEINT((a->g4)->data.complexSpectral.M)
+#define g4_n1(a) TWOBYTEINT((a->g4)->data.complexGrid.n1)
+#define g4_extendedFlags(a) ONEBYTEINT((a->g4)->data.complexGrid.extendedFlags)
+#define g4_n2(a) TWOBYTEINT((a->g4)->data.complexGrid.n2)
+#define g4_p1(a) TWOBYTEINT((a->g4)->data.complexGrid.p1)
+#define g4_p2(a) TWOBYTEINT((a->g4)->data.complexGrid.p2)
+
+#define gridPoint(a) ( (g4_flag(a)&0x80) == 0 )
+#define simplePacking(a) ( (g4_flag(a)&0x40) == 0 )
+#define floatingPoint(a) ( (g4_flag(a)&0x20) == 0 )
+#define noAdditionalFlags(a) ( (g4_flag(a)&0x10) == 0 )
+#define matrixAtGridPoint(a) (g4_extendedFlags(a)&0x40)
+#define secondaryBitmapPresent(a) (g4_extendedFlags(a)&0x20)
+#define differentWidths(a) (g4_extendedFlags(a)&0x10)
+#define generalExtendedSecondOrder(a) (g4_extendedFlags(a)&0x08)
+#define boustrophedonicOrdering(a) (g4_extendedFlags(a)&0x04)
+#define firstOrderSpatialDifferencing(a) ( (g4_extendedFlags(a)&0x03) == 1 )
+#define secondOrderSpatialDifferencing(a) ( (g4_extendedFlags(a)&0x03) == 2 )
+#define thirdOrderSpatialDifferencing(a) ( (g4_extendedFlags(a)&0x03) == 3 )
+
+#define anyComplexPackedSpectralField(a) \
+ (anySpectralField(a) && !simplePacking(a))
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+// Function prototypes
+*/
+void GBYTE(void*,void*,fortint*,fortint*);
+fortint IGGLAT(fortint*,fortdouble*,fortint*,fortint*);
+double pow(double,double);
+void *memcpy(void*,const void*,size_t);
+
+fortint findSectionOffsets(unsigned char*,fortint*,fortint*,fortint*,fortint*,fortint*,fortint*);
+fortint prepareGrib(gribProduct**,unsigned char*);
+fortint convertGRIBFloatToIEEE(unsigned char*);
+fortdouble realValue(unsigned char*);
+fortdouble referenceValue(gribProduct*);
+fortdouble RGREFVL(gribProduct**);
+fortint IGBTSPV(gribProduct**);
+fortdouble RGDSCAL(gribProduct**);
+fortint IGUNUSD(gribProduct**);
+fortint GDECODE(gribProduct**,unsigned char*);
+fortint IGLNGTH(gribProduct**);
+fortint IGDATE(gribProduct**);
+fortint IGTIME(gribProduct**);
+fortint GSTEP(gribProduct**);
+fortint IGTABLE(gribProduct**);
+fortint IGCENTR(gribProduct**);
+fortint IGPARAM(gribProduct**);
+fortint IGLEVEL(gribProduct**);
+fortint IGLEVL1(gribProduct**);
+fortint IGLEVL2(gribProduct**);
+fortint IGDEFIN(gribProduct**);
+fortint IGCLASS(gribProduct**);
+fortint IGTYPE(gribProduct**);
+fortint IGSTREM(gribProduct**);
+fortint IGEXPVR(gribProduct**);
+fortint IGREPRS(gribProduct**);
+fortint IGNUMPV(gribProduct**);
+fortint GPV(gribProduct**,fortdouble*,fortint*);
+fortint GPL(gribProduct**,fortint*,fortint*);
+fortint IGNI(gribProduct**);
+fortint IGNJ(gribProduct**);
+fortdouble RGNWLAT(gribProduct**);
+fortdouble RGNWLON(gribProduct**);
+fortdouble RGSELAT(gribProduct**);
+fortdouble RGSELON(gribProduct**);
+fortint IGRESCO(gribProduct**);
+fortdouble RGDI(gribProduct**);
+fortdouble RGDJ(gribProduct**);
+fortint IGGAUSS(gribProduct**);
+fortint IGSCANM(gribProduct**);
+fortint IGJ(gribProduct**);
+fortint IGK(gribProduct**);
+fortint IGM(gribProduct**);
+fortint IGREPMO(gribProduct**);
+fortdouble RGIP(gribProduct**);
+fortint IGTJ(gribProduct**);
+fortint IGTK(gribProduct**);
+fortint IGTM(gribProduct**);
+fortdouble RGLATRP(gribProduct**);
+fortdouble RGLONRP(gribProduct**);
+fortdouble RGROTAT(gribProduct**);
+fortdouble RGLATSP(gribProduct**);
+fortdouble RGLONSP(gribProduct**);
+fortdouble RGSFACT(gribProduct**);
+fortint numberOfValuesInSection4(gribProduct*);
+fortint g4_offset(gribProduct*);
+fortint IGNVALU(gribProduct**);
+fortint GVALUES( gribProduct**,fortdouble*,fortint*,fortint*,fortdouble*);
+void GVEND(gribProduct**);
+fortint setupIrregularLongitudeIncrements(gribProduct**,fortint);
+fortint GVINIT(gribProduct**,fortdouble*);
+fortint GVECTOR( gribProduct**,fortdouble*,fortdouble*,fortdouble*);
+fortint getSingleMapBit(unsigned char*,fortint);
+void * allocateMemory(size_t);
+void freeMemory(void*);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* End of GDECODE_H */
diff --git a/gribex/gdecode1.c b/gribex/gdecode1.c
new file mode 100755
index 0000000..d4179d1
--- /dev/null
+++ b/gribex/gdecode1.c
@@ -0,0 +1,36 @@
+/**
+* Copyright 1981-2012 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 "gdecode.h"
+#include "gdecode1.h"
+
+fortint IG1NUMB(gribProduct ** grib) {
+ if( ecmwfLocalDefinition1Present((*grib)) )
+ return g1_1_number( (*grib) );
+ else
+ return -999999;
+}
+
+fortdouble RG1NUMB(gribProduct ** grib) {
+ return (fortdouble) IG1NUMB(grib);
+}
+
+fortint IG1TOTL(gribProduct ** grib) {
+ if( ecmwfLocalDefinition1Present((*grib)) )
+ return g1_1_total( (*grib) );
+ else
+ return -999999;
+}
+
+fortdouble RG1TOTL(gribProduct ** grib) {
+ return (fortdouble) IG1TOTL(grib);
+}
+
diff --git a/gribex/gdecode1.h b/gribex/gdecode1.h
new file mode 100755
index 0000000..97ad156
--- /dev/null
+++ b/gribex/gdecode1.h
@@ -0,0 +1,31 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef GDECODE1_H
+#define GDECODE1_H
+
+#ifdef FORTRAN_NO_UNDERSCORE
+#define IG1NUMB ig1numb
+#define RG1NUMB rg1numb
+#define IG1TOTL ig1totl
+#define RG1TOTL rg1totl
+#else
+#define IG1NUMB ig1numb_
+#define RG1NUMB rg1numb_
+#define IG1TOTL ig1totl_
+#define RG1TOTL rg1totl_
+#endif
+
+fortint IG1NUMB(gribProduct **);
+fortdouble RG1NUMB(gribProduct **);
+fortint IG1TOTL(gribProduct **);
+fortdouble RG1TOTL(gribProduct **);
+
+#endif /* end of GDECODE1_H */
diff --git a/gribex/gdecode2.c b/gribex/gdecode2.c
new file mode 100755
index 0000000..4654f52
--- /dev/null
+++ b/gribex/gdecode2.c
@@ -0,0 +1,197 @@
+/**
+* Copyright 1981-2012 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 "gdecode.h"
+#include "gdecode2.h"
+
+fortint IG2NUMB(gribProduct ** grib) {
+ if( ecmwfLocalDefinition2Present((*grib)) )
+ return g1_2_number( (*grib) );
+ else
+ return -999999;
+}
+
+fortdouble RG2NUMB(gribProduct ** grib) {
+ return (fortdouble) IG2NUMB(grib);
+}
+
+fortint IG2TOTL(gribProduct ** grib) {
+ if( ecmwfLocalDefinition2Present((*grib)) )
+ return g1_2_total( (*grib) );
+ else
+ return -999999;
+}
+
+fortdouble RG2TOTL(gribProduct ** grib) {
+ return (fortdouble) IG2TOTL(grib);
+}
+
+fortint IG2METH(gribProduct ** grib) {
+ if( ecmwfLocalDefinition2Present((*grib)) )
+ return g1_2_method( (*grib) );
+ else
+ return -999999;
+}
+
+fortdouble RG2METH(gribProduct ** grib) {
+ return (fortdouble) IG2METH(grib);
+}
+
+fortint IG2CFCL(gribProduct ** grib) {
+ if( ecmwfLocalDefinition2Present((*grib)) )
+ return g1_2_control( (*grib) );
+ else
+ return -999999;
+}
+
+fortdouble RG2CFCL(gribProduct ** grib) {
+ return (fortdouble) IG2CFCL(grib);
+}
+
+fortint IG2ELON(gribProduct ** grib) {
+fortint value;
+ if( ecmwfLocalDefinition2Present((*grib)) ) {
+ value = g1_2_domainE( (*grib) );
+ if( value & 0x800000 ) value = - (value & 0x7fffff);
+ return value;
+ }
+ else
+ return -999999;
+}
+
+fortdouble RG2ELON(gribProduct ** grib) {
+fortdouble value = (fortdouble) IG2ELON(grib);
+ if( value != -999999.0 )
+ return (value/1000.0);
+ else
+ return value;
+}
+
+fortint IG2NLAT(gribProduct ** grib) {
+fortint value;
+ if( ecmwfLocalDefinition2Present((*grib)) ) {
+ value = g1_2_domainN( (*grib) );
+ if( value & 0x800000 ) value = - (value & 0x7fffff);
+ return value;
+ }
+ else
+ return -999999;
+}
+
+fortdouble RG2NLAT(gribProduct ** grib) {
+fortdouble value = (fortdouble) IG2NLAT(grib);
+ if( value != -999999.0 )
+ return (value/1000.0);
+ else
+ return value;
+}
+
+fortint IG2SLAT(gribProduct ** grib) {
+fortint value;
+ if( ecmwfLocalDefinition2Present((*grib)) ) {
+ value = g1_2_domainS( (*grib) );
+ if( value & 0x800000 ) value = - (value & 0x7fffff);
+ return value;
+ }
+ else
+ return -999999;
+}
+
+fortdouble RG2SLAT(gribProduct ** grib) {
+fortdouble value = (fortdouble) IG2SLAT(grib);
+ if( value != -999999.0 )
+ return (value/1000.0);
+ else
+ return value;
+}
+
+fortint IG2WLON(gribProduct ** grib) {
+fortint value;
+ if( ecmwfLocalDefinition2Present((*grib)) ) {
+ value = g1_2_domainW( (*grib) );
+ if( value & 0x800000 ) value = - (value & 0x7fffff);
+ return value;
+ }
+ else
+ return -999999;
+}
+
+fortdouble RG2WLON(gribProduct ** grib) {
+fortdouble value = (fortdouble) IG2WLON(grib);
+ if( value != -999999.0 )
+ return (value/1000.0);
+ else
+ return value;
+}
+
+fortint IG2END(gribProduct ** grib) {
+ if( ecmwfLocalDefinition2Present((*grib)) )
+ return g1_2_end( (*grib) );
+ else
+ return -999999;
+}
+
+fortdouble RG2END(gribProduct ** grib) {
+ return (fortdouble) IG2END(grib);
+}
+
+fortint IG2NUCL(gribProduct ** grib) {
+ if( ecmwfLocalDefinition2Present((*grib)) )
+ return g1_2_count( (*grib) );
+ else
+ return -999999;
+}
+
+fortdouble RG2NUCL(gribProduct ** grib) {
+ return (fortdouble) IG2NUCL(grib);
+}
+
+fortint IG2OPCL(gribProduct ** grib) {
+ if( ecmwfLocalDefinition2Present((*grib)) )
+ return g1_2_operational( (*grib) );
+ else
+ return -999999;
+}
+
+fortdouble RG2OPCL(gribProduct ** grib) {
+ return (fortdouble) IG2OPCL(grib);
+}
+
+fortint IG2STAR(gribProduct ** grib) {
+ if( ecmwfLocalDefinition2Present((*grib)) )
+ return g1_2_start( (*grib) );
+ else
+ return -999999;
+}
+
+fortdouble RG2STAR(gribProduct ** grib) {
+ return (fortdouble) IG2STAR(grib);
+}
+
+fortint IG2LIST(gribProduct ** grib, fortint * array, fortint * size) {
+gribProduct * g = *grib;
+fortint loop, listLength;
+unsigned char * p;
+
+ if( !ecmwfLocalDefinition2Present(g) ) return -1;
+
+ listLength = g1_2_count(g);
+ if( listLength > *size ) return -1;
+
+ p = (unsigned char *) ((g->g1)->local.contents.def2.forecastNumberList);
+ for( loop = 0; loop < listLength; loop++ ) {
+ *(array+loop) = ONEBYTEINT(p);
+ p++;
+ }
+
+ return listLength;
+
+}
diff --git a/gribex/gdecode2.h b/gribex/gdecode2.h
new file mode 100755
index 0000000..7ab4af2
--- /dev/null
+++ b/gribex/gdecode2.h
@@ -0,0 +1,93 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef GDECODE2_H
+#define GDECODE2_H
+
+#ifdef FORTRAN_NO_UNDERSCORE
+#define IG2NUMB ig2numb
+#define RG2NUMB rg2numb
+#define IG2TOTL ig2totl
+#define RG2TOTL rg2totl
+#define IG2METH ig2meth
+#define RG2METH rg2meth
+#define IG2CFCL ig2cfcl
+#define RG2CFCL rg2cfcl
+#define IG2ELON ig2elon
+#define RG2ELON rg2elon
+#define IG2NLAT ig2nlat
+#define RG2NLAT rg2nlat
+#define IG2SLAT ig2slat
+#define RG2SLAT rg2slat
+#define IG2WLON ig2wlon
+#define RG2WLON rg2wlon
+#define IG2END ig2end
+#define RG2END rg2end
+#define IG2NUCL ig2nucl
+#define RG2NUCL rg2nucl
+#define IG2OPCL ig2opcl
+#define RG2OPCL rg2opcl
+#define IG2STAR ig2star
+#define RG2STAR rg2star
+#define IG2LIST ig2list
+#else
+#define IG2NUMB ig2numb_
+#define RG2NUMB rg2numb_
+#define IG2TOTL ig2totl_
+#define RG2TOTL rg2totl_
+#define IG2METH ig2meth_
+#define RG2METH rg2meth_
+#define IG2CFCL ig2cfcl_
+#define RG2CFCL rg2cfcl_
+#define IG2ELON ig2elon_
+#define RG2ELON rg2elon_
+#define IG2NLAT ig2nlat_
+#define RG2NLAT rg2nlat_
+#define IG2SLAT ig2slat_
+#define RG2SLAT rg2slat_
+#define IG2WLON ig2wlon_
+#define RG2WLON rg2wlon_
+#define IG2END ig2end_
+#define RG2END rg2end_
+#define IG2NUCL ig2nucl_
+#define RG2NUCL rg2nucl_
+#define IG2OPCL ig2opcl_
+#define RG2OPCL rg2opcl_
+#define IG2STAR ig2star_
+#define RG2STAR rg2star_
+#define IG2LIST ig2list_
+#endif
+
+fortint IG2NUMB(gribProduct **);
+fortdouble RG2NUMB(gribProduct **);
+fortint IG2TOTL(gribProduct **);
+fortdouble RG2TOTL(gribProduct **);
+fortint IG2METH(gribProduct **);
+fortdouble RG2METH(gribProduct **);
+fortint IG2CFCL(gribProduct **);
+fortdouble RG2CFCL(gribProduct **);
+fortint IG2ELON(gribProduct **);
+fortdouble RG2ELON(gribProduct **);
+fortint IG2NLAT(gribProduct **);
+fortdouble RG2NLAT(gribProduct **);
+fortint IG2SLAT(gribProduct **);
+fortdouble RG2SLAT(gribProduct **);
+fortint IG2WLON(gribProduct **);
+fortdouble RG2WLON(gribProduct **);
+fortint IG2END(gribProduct **);
+fortdouble RG2END(gribProduct **);
+fortint IG2NUCL(gribProduct **);
+fortdouble RG2NUCL(gribProduct **);
+fortint IG2OPCL(gribProduct **);
+fortdouble RG2OPCL(gribProduct **);
+fortint IG2STAR(gribProduct **);
+fortdouble RG2STAR(gribProduct **);
+
+#endif /* end of GDECODE2_H */
diff --git a/gribex/gdecodeStruct.h b/gribex/gdecodeStruct.h
new file mode 100755
index 0000000..569ade8
--- /dev/null
+++ b/gribex/gdecodeStruct.h
@@ -0,0 +1,366 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef GDECODESTRUCT_H
+#define GDECODESTRUCT_H
+
+typedef struct gribSection0 {
+unsigned char GRIB[4];
+unsigned char totalGRIBlength[3];
+unsigned char editionNumber[1];
+} gribSection0;
+
+typedef struct ECMWFdefinition1 {
+unsigned char number[1];
+unsigned char total[1];
+unsigned char spare[1];
+} ECMWFdefinition1;
+
+typedef struct ECMWFdefinition2 {
+unsigned char number[1];
+unsigned char total[1];
+unsigned char spare[1];
+unsigned char method[1];
+unsigned char startTimestep[2];
+unsigned char endTimestep[2];
+unsigned char domainNorthLatitude[3];
+unsigned char domainWestLongitude[3];
+unsigned char domainSouthLatitude[3];
+unsigned char domainEastLongitude[3];
+unsigned char operationalForecastCluster[1];
+unsigned char controlForecastCluster[1];
+unsigned char numberInCluster[1];
+unsigned char forecastNumberList[256];
+} ECMWFdefinition2;
+
+typedef struct ECMWFdefinition3 {
+unsigned char band[1];
+unsigned char functionCode[1];
+unsigned char spare[1];
+} ECMWFdefinition3;
+
+typedef struct ECMWFdefinition5 {
+unsigned char number[1];
+unsigned char total[1];
+unsigned char unitsDecimalScaleFactor[1];
+unsigned char thresholdIndicator[1];
+unsigned char lowerThreshold[2];
+unsigned char upperThreshold[2];
+unsigned char spare[1];
+} ECMWFdefinition5;
+
+typedef struct ICEField {
+unsigned char date[3];
+unsigned char satelliteNumber[1];
+} ICEField;
+
+typedef struct ECMWFdefinition6 {
+unsigned char zero[2];
+unsigned char SSTFieldDate[3];
+unsigned char typeOfSSTField[1];
+unsigned char countOfICEFields[1];
+unsigned char lowerThreshold[2];
+unsigned char upperThreshold[2];
+ICEField ICEFieldList[20];
+} ECMWFdefinition6;
+
+typedef struct ECMWFdefinition7 {
+unsigned char number[1];
+unsigned char totalNumberOfDiagnostics[1];
+unsigned char domain[1];
+unsigned char diagnosticNumber[1];
+unsigned char spare[1];
+} ECMWFdefinition7;
+
+typedef struct ECMWFdefinition8 {
+unsigned char interval[1];
+unsigned char unsignedIntegers[12];
+} ECMWFdefinition8;
+
+typedef struct ECMWFdefinition9 {
+unsigned char number[2];
+unsigned char numberOfIterations[2];
+unsigned char numberOfSingularVectorsComputed[2];
+unsigned char initialNorm[1];
+unsigned char finalNorm[1];
+unsigned char multiplicationFactor[4];
+unsigned char northWestLatitude[4];
+unsigned char northWestLongitude[4];
+unsigned char southEastLatitude[4];
+unsigned char southEastLongitude[4];
+unsigned char accuracy[4];
+unsigned char numberOfSingularVectorsEvolved[2];
+unsigned char ritzNumber1[4];
+unsigned char ritzNumber2[4];
+unsigned char spare[1];
+} ECMWFdefinition9;
+
+typedef struct ECMWFdefinition10 {
+unsigned char number[1];
+unsigned char total[1];
+unsigned char centralClusterDefinition[1];
+unsigned char parameter[1];
+unsigned char levelType[1];
+unsigned char domainNorth[3];
+unsigned char domainWest[3];
+unsigned char domainSouth[3];
+unsigned char domainEast[3];
+unsigned char operationalForcastTubeNumber[1];
+unsigned char controlForcastTubeNumber[1];
+unsigned char level[2];
+unsigned char referenceStep[2];
+unsigned char radiusOfCentralCluster[2];
+unsigned char ensembleStandardDeviation[2];
+unsigned char distanceOfExtremeToMean[2];
+unsigned char numberOfForecastsInTube[1];
+unsigned char ensembleForecastList[255];
+} ECMWFdefinition10;
+
+typedef struct ECMWFdefinition11 {
+unsigned char analysisClass[1];
+unsigned char analysisType[1];
+unsigned char analysisStream[2];
+unsigned char analysisExpver[4];
+unsigned char analysisYear[1];
+unsigned char analysisMonth[1];
+unsigned char analysisDay[1];
+unsigned char analysisHour[1];
+unsigned char analysisMinute[1];
+unsigned char analysisCentury[1];
+unsigned char analysisOriginatingCentre[1];
+unsigned char analysisSubCentre[1];
+unsigned char spare[7];
+} ECMWFdefinition11;
+
+typedef struct ECMWFdefinition20 {
+unsigned char iteration[1];
+unsigned char total[1];
+unsigned char spare[1];
+} ECMWFdefinition20;
+
+typedef union localContent {
+ECMWFdefinition1 def1;
+ECMWFdefinition2 def2;
+ECMWFdefinition3 def3;
+ECMWFdefinition5 def5;
+ECMWFdefinition6 def6;
+ECMWFdefinition7 def7;
+ECMWFdefinition8 def8;
+ECMWFdefinition9 def9;
+ECMWFdefinition10 def10;
+ECMWFdefinition11 def11;
+ECMWFdefinition20 def20;
+} localContent;
+
+typedef struct marsHeader {
+unsigned char definition[1];
+unsigned char ecmwfClass[1];
+unsigned char type[1];
+unsigned char stream[2];
+unsigned char experimentVersionNumber[4];
+} marsHeader;
+
+typedef struct localDefinition {
+marsHeader mars;
+localContent contents;
+} localDefinition;
+
+typedef struct gribSection1 {
+unsigned char sectionLength[3];
+unsigned char tableVersionNumber[1];
+unsigned char originatingCentre[1];
+unsigned char generatingProcessId[1];
+unsigned char gridDefinition[1];
+unsigned char section2and3PresentFlag[1];
+unsigned char parameter[1];
+unsigned char typeOfLevel[1];
+unsigned char level1[1];
+unsigned char level2[1];
+unsigned char year[1];
+unsigned char month[1];
+unsigned char day[1];
+unsigned char hour[1];
+unsigned char minute[1];
+unsigned char unitOfTimeRange[1];
+unsigned char P1[1];
+unsigned char P2[1];
+unsigned char timeRangeIndicator[1];
+unsigned char numberInAverage[2];
+unsigned char numberMissing[1];
+unsigned char century[1];
+unsigned char subCentreId[1];
+unsigned char unitsDecimalScaleFactor[2];
+unsigned char reserved[12];
+localDefinition local;
+} gribSection1;
+
+typedef struct latitudeLongitudeGrid {
+unsigned char numberOfPointsAlongParallel[2];
+unsigned char numberOfPointsAlongMeridian[2];
+unsigned char latitudeOfFirstPoint[3];
+unsigned char longitudeOfFirstPoint[3];
+unsigned char resolutionAndComponentsFlag[1];
+unsigned char latitudeOfLastPoint[3];
+unsigned char longitudeOfLastPoint[3];
+unsigned char iDirectionIncrement[2];
+unsigned char jDirectionIncrement[2];
+unsigned char scanningMode[1];
+unsigned char setToZero[4];
+unsigned char latitudeOfSouthPole[3];
+unsigned char longitudeOfSouthPole[3];
+unsigned char angleOfRotationOrStretchingFactor[4];
+unsigned char latitudeOfPoleOfStretching[3];
+unsigned char longitudeOfPoleOfStretching[3];
+unsigned char stretchingFactor[4];
+} latitudeLongitudeGrid;
+
+typedef struct gaussianGrid {
+unsigned char numberOfPointsAlongParallel[2];
+unsigned char numberOfPointsAlongMeridian[2];
+unsigned char latitudeOfFirstPoint[3];
+unsigned char longitudeOfFirstPoint[3];
+unsigned char resolutionAndComponentsFlag[1];
+unsigned char latitudeOfLastPoint[3];
+unsigned char longitudeOfLastPoint[3];
+unsigned char iDirectionIncrement[2];
+unsigned char numberOfParallelsBetweenPoleAndEquator[2];
+unsigned char scanningMode[1];
+unsigned char setToZero[4];
+unsigned char latitudeOfSouthPole[3];
+unsigned char longitudeOfSouthPole[3];
+unsigned char angleOfRotationOrStretchingFactor[4];
+unsigned char latitudeOfPoleOfStretching[3];
+unsigned char longitudeOfPoleOfStretching[3];
+unsigned char stretchingFactor[4];
+} gaussianGrid;
+
+
+typedef struct sphericalHarmonicCoefficients {
+unsigned char J[2];
+unsigned char K[2];
+unsigned char M[2];
+unsigned char representationType[1];
+unsigned char representationMode[1];
+unsigned char setToZero[18];
+unsigned char latitudeOfSouthPole[3];
+unsigned char longitudeOfSouthPole[3];
+unsigned char angleOfRotationOrStretchingFactor[4];
+unsigned char latitudeOfPoleOfStretching[3];
+unsigned char longitudeOfPoleOfStretching[3];
+unsigned char stretchingFactor[4];
+} sphericalHarmonicCoefficients;
+
+typedef union gridDefinition {
+latitudeLongitudeGrid latlon;
+gaussianGrid gaussian;
+sphericalHarmonicCoefficients spectral;
+} gridDefinition;
+
+typedef struct gribSection2 {
+unsigned char sectionLength[3];
+unsigned char NV[1];
+unsigned char PV_PL[1];
+unsigned char dataRepresentationType[1];
+gridDefinition grid;
+} gribSection2;
+
+typedef struct gribSection3 {
+unsigned char sectionLength[3];
+unsigned char numberOfUnusedBits[1];
+unsigned char tableReference[2];
+unsigned char bitmap;
+} gribSection3;
+
+typedef struct simplePackingGridPoint {
+unsigned char dataBits;
+} simplePackingGridPoint;
+
+typedef struct secondOrderPackingGridPoint {
+unsigned char n1[2];
+unsigned char extendedFlags[1];
+unsigned char n2[2];
+unsigned char p1[2];
+unsigned char p2[2];
+unsigned char reserved[1];
+unsigned char dataBits;
+} secondOrderPackingGridPoint;
+
+typedef struct simplePackingSpectral {
+unsigned char realPartOf0_0Coefficient[4];
+unsigned char dataBits;
+} simplePackingSpectral;
+
+typedef struct complexPackingSpectral {
+unsigned char N[2];
+unsigned char IP[2];
+unsigned char J[1];
+unsigned char K[1];
+unsigned char M[1];
+unsigned char dataBits;
+} complexPackingSpectral;
+
+typedef union binaryData {
+simplePackingGridPoint simpleGrid;
+secondOrderPackingGridPoint complexGrid;
+simplePackingSpectral simpleSpectral;
+complexPackingSpectral complexSpectral;
+} binaryData;
+
+typedef struct gribSection4 {
+unsigned char sectionLength[3];
+unsigned char flag[1];
+unsigned char scaleFactor[2];
+unsigned char referenceValue[4];
+unsigned char numberOfBitsPerValue[1];
+binaryData data;
+} gribSection4;
+
+typedef struct gribSection5 {
+unsigned char end7777[4];
+} gribSection5;
+
+typedef struct latLongValueVector {
+fortdouble * latitude;
+fortdouble * longitudeIncrement;
+fortdouble * gridPointValue;
+} latLongValueVector;
+
+typedef struct gribProduct {
+gribSection0 * g0;
+gribSection1 * g1;
+gribSection2 * g2;
+gribSection3 * g3;
+gribSection4 * g4;
+gribSection5 * g5;
+fortint currentPointIndex;
+fortint numberOfValues;
+unsigned char * value;
+unsigned char * bitStart;
+fortint bitsPerValue;
+fortint bitmapped;
+fortint nextValueFirstBit;
+fortint nextBit;
+fortint northSet;
+fortint southSet;
+fortint westSet;
+fortint eastSet;
+fortint northSouthIncrementSet;
+fortint westEastIncrementSet;
+fortint northSouthNumberOfPointsSet;
+fortint westEastNumberOfPointsSet;
+fortdouble scale;
+fortdouble minimum;
+fortdouble missingValue;
+fortint * latitudeOffsets;
+fortdouble * expandedValues;
+latLongValueVector currentPoint;
+} gribProduct;
+
+#endif /* End of GDECODESTRUCT_H */
diff --git a/gribex/genbin.F b/gribex/genbin.F
new file mode 100755
index 0000000..07cffd0
--- /dev/null
+++ b/gribex/genbin.F
@@ -0,0 +1,63 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE GENBIN (IN,NBIT,OUT,ERR)
+C
+C---->
+C**********************************************************************
+C*
+C* NAME : GENBIN
+C*
+C* FUNCTION : PRODUCES A BINARY NUMBER WITH ONES AND ZEROES
+C* CORRESPONDING TO THE ONES AND ZEROES OF THE INPUT
+C* DECIMAL NUMBER.
+C* EG INPUT NUMBER 1010 DECIMAL , OUTPUT 1010 BINARY.
+C*
+C* INPUT : IN - INTEGER VARIABLE CONTAINING DECIMAL NUMBER.
+C* NBIT - NUMBER OF DIGITS TO BE USED.
+C*
+C* OUTPUT : OUT - INTEGER VARIABLE CONTAINING BINARY VALUE
+C* WITH ONES AND ZEROES CORRESPONDING TO THOSE OF
+C* THE INPUT DECIMAL NUMBER.
+C*
+C* ERR - 0 IF NO ERROR, 1 IF INVALID NUMBER OF BITS.
+C*
+C* JOHN HENNESSY ECMWF, OCTOBER 1985
+C*
+C**********************************************************************
+C----<
+C
+ IMPLICIT INTEGER (A-Z)
+C
+ OUT = 0
+ INN = IN
+C
+C CHECK SIZE OF INTEGER
+C
+ IF (NBIT.LT.0.OR.NBIT.GT.15)
+ C THEN
+ ERR = 1
+ RETURN
+ ELSE
+ ERR = 0
+ ENDIF
+C
+ DO 100 I=1,NBIT
+ TEMP = INN / 10
+ DIFF = INN - (TEMP*10)
+ K = I - 1
+ MASC = 2**K
+ IF (DIFF.NE.0) OUT = OR(OUT,MASC)
+ INN = TEMP
+ 100 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/gendir.F b/gribex/gendir.F
new file mode 100755
index 0000000..fc1cb22
--- /dev/null
+++ b/gribex/gendir.F
@@ -0,0 +1,215 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE GENDIR (HPARAM,KARRAY,KLEN,HLINE,KIN,KOUT,HLAST,KRET)
+C
+C---->
+C**** GENDIR - Generate directive lines for MARS.
+C
+C Purpose.
+C --------
+C
+C Creates mars directive line(s) in character format
+C from list of integers.
+C
+C** Interface.
+C ----------
+C
+C CALL GENDIR (HPARAM,KARRAY,KLEN,HLINE,KIN,KOUT,HLAST,KRET)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input parameters.
+C -----------------
+C
+C HPARAM - MARS parameter being used.
+C KARRAY - Array of required values.
+C KLEN - Number of values.
+C HLINE - Array of 80 character variables.
+C KIN - Dimension of array HLINE.
+C HLAST - Terminating character for directive line(s)
+C KRET - Abort/no abort when error found.
+C 0 , abort if error found.
+C Non-zero , no abort on error.
+C
+C Output parameters.
+C ------------------
+C
+C LINE - MARS directive line(s)
+C KOUT - Number of lines generated.
+C KRET - Error return code.
+C 0 , No error encountered.
+C 1 , Output character array too small.
+C
+C Method.
+C -------
+C
+C Integers converted to characters and packed to remove
+C spaces. Lines are broken at / character for MARS input.
+C
+C Externals.
+C ----------
+C
+C RTB
+C REMSP
+C
+C Reference.
+C ----------
+C
+C MARS User Guide for directive description.
+C
+C Comments.
+C ---------
+C
+C See also GENINT which performs the reverse function.
+C Program contains sections 0 to 2 and section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 16:10:86.
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 10:07:91.
+C Print of error message added.
+C
+C ----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+ INTEGER RTB
+C
+C
+ CHARACTER*80 HLINE
+ CHARACTER*10 YTEMP
+ CHARACTER*(*) HPARAM
+ CHARACTER*1 HLAST
+C
+ DIMENSION KARRAY(*)
+ DIMENSION HLINE(KIN)
+C
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Set initial values.
+C ----------------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+ IRET = KRET
+ KRET = 0
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Convert integer data to required character format.
+C ----------------------------------------------------------------
+C
+ 2000 CONTINUE
+C
+ KOUT = 1
+ HLINE(KOUT)(1:) = HPARAM(1:)
+ ILEN = RTB (HLINE(KOUT))
+ ICHAR = ILEN + 1
+ HLINE(KOUT)(ICHAR:ICHAR) = '='
+ ICHAR = ICHAR + 1
+C
+ DO 2010 I=1,KLEN
+ WRITE (YTEMP(1:10),'(I10)') KARRAY(I)
+ CALL REMSP (YTEMP)
+ ILEN = RTB (YTEMP)
+ ILAST = ILEN + ICHAR
+ IF (ILAST.GT.80)
+ C THEN
+ ICHAR = 1
+ KOUT = KOUT + 1
+ IF (KOUT.GT.KIN)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) KIN , KOUT
+ GO TO 9000
+ ENDIF
+ ENDIF
+ HLINE(KOUT)(ICHAR:) = YTEMP(1:ILEN)
+ ICHAR = ICHAR + ILEN
+ HLINE(KOUT)(ICHAR:) = '/'
+ ICHAR = ICHAR + 1
+ 2010 CONTINUE
+C
+ ILEN = RTB (HLINE(KOUT))
+ HLINE(KOUT)(ILEN:ILEN) = HLAST
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine or abort.
+C ------------------------------------------------------------------
+C
+ 9000 CONTINUE
+C
+ 9001 FORMAT (1H ,'GENDIR : Character array is dimensioned ',I3,
+ C ' but should be at least ',I3,'.')
+C
+ IF (KRET.NE.0.AND.IRET.EQ.0) CALL ABORT
+C
+ RETURN
+C
+ END
diff --git a/gribex/gengrib.F b/gribex/gengrib.F
new file mode 100755
index 0000000..a094dbd
--- /dev/null
+++ b/gribex/gengrib.F
@@ -0,0 +1,246 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GENGRIB( VALUES, LAT, LONG, NBITS, GRIB, GRIBSIZE)
+C
+C---->
+C**** GENGRIB
+C
+C Purpose.
+C --------
+C
+C Creates a generic GRIB field product.
+C
+C
+C** Interface.
+C ----------
+C
+C CALL GENGRIB( VALUES, LAT, LONG, NBITS, GRIB, GRIBSIZE)
+C
+C
+C Input
+C -----
+C
+C VALUES - array of real numbers
+C LAT - first dimension of the array
+C (e.g. number of points along a meridian )
+C LONG - second dimension of the array
+C (e.g. number of points along a parallel )
+C NBITS - number of bits to use for each packed value
+C If NBITS = 0, a value is calculated for the given
+C field.
+C GRIBSIZE - size in bytes of output array GRIB
+C
+C
+C Output
+C ------
+C
+C GRIB - packed GRIB record
+C
+C
+C Method.
+C -------
+C
+C Packs the matrix of real values as a 500 hPa geopotential first
+C guess field for 94/1/1 1200.
+C
+C
+C Externals.
+C ----------
+C
+C GRIBEX
+C CNBITS
+C
+C
+C Reference.
+C ----------
+C
+C Binary data representation - FM 92 GRIB, ECMWF, May 1992
+C
+C
+C Comments.
+C ---------
+C
+C If number of bits for packing is not supplied by caller, calculate
+C the number of bits needed to code the range of field values.
+C Apply (arbitrary) lower limit unless the number of bits is 1 (for
+C bit fields for example) when the value is left as 1.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 28.07.94
+C
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+C Parameters
+ INTEGER JPLOW
+ PARAMETER ( JPLOW = 16 )
+C
+C Arguments
+ INTEGER LAT,LONG
+ REAL VALUES( LAT, LONG)
+ INTEGER GRIB(*), GRIBSIZE
+ INTEGER NBITS
+C
+C Local variables
+ INTEGER KSEC0(2), KSEC1(43), KSEC2(23), KSEC3(2), KSEC4(33)
+ REAL PSEC2(10), PSEC3(2)
+ INTEGER LOOP, KLENG, KLENP, KWORD, KRET
+C
+ INTEGER CNBITS
+C
+C ----------------------------------------------------------------
+C* Section 1 . Setup section 1.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ KSEC1( 1) = 128
+ KSEC1( 2) = 98
+ KSEC1( 3) = 255
+ KSEC1( 4) = 255
+ KSEC1( 5) = 128
+ KSEC1( 6) = 129
+ KSEC1( 7) = 100
+ KSEC1( 8) = 500
+ KSEC1( 9) = 0
+ KSEC1(10) = 94
+ KSEC1(11) = 1
+ KSEC1(12) = 1
+ KSEC1(13) = 12
+ KSEC1(14) = 0
+ KSEC1(15) = 1
+ KSEC1(16) = 0
+ KSEC1(17) = 0
+ KSEC1(18) = 0
+ KSEC1(19) = 0
+ KSEC1(20) = 0
+ KSEC1(21) = 20
+ DO 110 LOOP = 22, 36
+ KSEC1(LOOP) = 0
+ 110 CONTINUE
+ KSEC1(24) = 1
+ KSEC1(37) = 1
+ KSEC1(38) = 1
+ KSEC1(39) = 1
+ KSEC1(40) = 1060
+ KSEC1(41) = 1413829460
+ KSEC1(42) = 0
+ KSEC1(43) = 0
+C
+C ----------------------------------------------------------------
+C* Section 2 . Setup section 2.
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ KSEC2( 1) = 0
+ KSEC2( 2) = LONG
+ KSEC2( 3) = LAT
+ KSEC2( 4) = 90000
+ KSEC2( 5) = 0
+ KSEC2( 6) = 128
+ KSEC2( 7) = -90000
+ KSEC2( 8) = 360000 - (360000/LONG)
+ KSEC2( 9) = (360000/LONG)
+ KSEC2(10) = (180000/(LAT-1))
+ KSEC2(11) = 0
+ KSEC2(12) = 0
+ KSEC2(13) = 0
+ KSEC2(14) = 0
+ KSEC2(15) = 0
+ KSEC2(16) = 0
+ KSEC2(17) = 0
+ KSEC2(18) = 0
+ KSEC2(19) = 0
+ KSEC2(20) = 0
+ KSEC2(21) = 0
+ KSEC2(22) = 0
+ KSEC2(23) = LONG
+ DO 210 LOOP =1, 10
+ PSEC2(LOOP) = 0.0
+ 210 CONTINUE
+C
+C ----------------------------------------------------------------
+C* Section 3 . Setup section 3.
+C ----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ KSEC3( 1) = 0
+ KSEC3( 2) = -1000000
+ PSEC3( 1) = 0
+ PSEC3( 2) = -1000000.0
+C
+C ----------------------------------------------------------------
+C* Section 4 . Setup section 4.
+C ----------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ KSEC4( 1) = LAT*LONG
+C
+ IF ( NBITS .LE. 0 ) THEN
+C
+C If number of bits for packing not supplied by caller, calculate
+C the number of bits needed to code the range of field values.
+ KSEC4( 2) = CNBITS( VALUES, LAT, LONG )
+C
+C Apply (arbitrary) lower limit.
+ IF ( (KSEC4( 2) .LT. JPLOW) .AND.
+ X (KSEC4( 2) .NE. 1) ) KSEC4( 2) = JPLOW
+ ELSE
+ KSEC4( 2) = NBITS
+ ENDIF
+ DO 410 LOOP = 3, 33
+ KSEC4(LOOP) = 0
+ 410 CONTINUE
+C
+C ----------------------------------------------------------------
+C* Section 5 . Pack the field.
+C ----------------------------------------------------------------
+C
+ 500 CONTINUE
+C
+#ifdef CRAY
+ KLENG = GRIBSIZE/8
+#else
+ KLENG = GRIBSIZE/4
+#endif
+ KLENP = LAT*LONG
+C
+Cjdc CALL GRSVCK(0)
+Cjdc CALL GRSDBG(1)
+C
+ CALL GRIBEX( KSEC0, KSEC1, KSEC2, PSEC2, KSEC3, PSEC3, KSEC4,
+ X VALUES, KLENP, GRIB, KLENG, KWORD, 'C', KRET)
+C
+C ----------------------------------------------------------------
+C* Section 9 . End.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/getValues.c b/gribex/getValues.c
new file mode 100755
index 0000000..dded380
--- /dev/null
+++ b/gribex/getValues.c
@@ -0,0 +1,391 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <string.h>
+#include "getValues.h"
+
+#ifdef FORTRAN_NO_UNDERSCORE
+#define GETINT getint
+#define GETREAL getreal
+#else
+#define GETINT getint_
+#define GETREAL getreal_
+#endif
+
+fortint getIntegerValue(
+ gribProduct** grib,
+ unsigned char* request ){
+
+ return GETINT(grib,request,strlen(request));
+}
+
+void copyName(
+ unsigned char* copy,
+ unsigned char* original,
+ int copyLength,
+ int originalLength) {
+int length;
+char *p;
+
+ length = (originalLength>copyLength)?copyLength:originalLength;
+ memcpy(copy,original,length);
+ copy[length] = '\0';
+
+ p = copy + length - 1;
+ while( *p == ' ' ) *(p--) = '\0';
+
+ return;
+}
+
+fortint GETINT(
+ gribProduct** grib,
+ unsigned char* request,
+ long requestLength ) {
+int index;
+int listLength = sizeof(despatchInteger)/sizeof(despatchI);
+unsigned char Request[80];
+
+ copyName(Request,request,(int)sizeof(Request),(int)requestLength);
+
+ index = binaryChopI(despatchInteger,listLength,Request);
+ if( index < 0 )
+ return -999999;
+ else {
+ return despatchInteger[index].get(grib);
+ }
+}
+
+fortdouble getRealValue(
+ gribProduct** grib,
+ unsigned char* request ) {
+
+ return GETREAL(grib,request,strlen(request));
+}
+
+fortdouble GETREAL(
+ gribProduct** grib,
+ unsigned char* request,
+ long requestLength ) {
+int index;
+int listLength = sizeof(despatchReal)/sizeof(despatchR);
+char Request[80];
+
+ copyName(Request,request,(int)sizeof(Request),(int)requestLength);
+
+ index = binaryChopR(despatchReal,listLength,Request);
+ if( index < 0 )
+ return -999999.0;
+ else {
+ return despatchReal[index].get(grib);
+ }
+}
+
+fortint IGNWLAT(gribProduct** grib) {
+fortdouble value = GNWLAT(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGNWLON(gribProduct** grib) {
+fortdouble value = GNWLON(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGSELAT(gribProduct** grib) {
+fortdouble value = GSELAT(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGSELON(gribProduct** grib) {
+fortdouble value = GSELON(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGDI(gribProduct** grib) {
+fortdouble value = GDI(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGDJ(gribProduct** grib) {
+fortdouble value = GDJ(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGIP(gribProduct** grib) {
+fortdouble value = GIP(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGLATRPL(gribProduct** grib) {
+fortdouble value = GLATRPL(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGLONRPL(gribProduct** grib) {
+fortdouble value = GLONRPL(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGROTATN(gribProduct** grib) {
+fortdouble value = GROTATN(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGLATSPL(gribProduct** grib) {
+fortdouble value = GLATSPL(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGLONSPL(gribProduct** grib) {
+fortdouble value = GLONSPL(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGSFACTR(gribProduct** grib) {
+fortdouble value = GSFACTR(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGREFVAL(gribProduct** grib) {
+ return (fortint)(1000000.0 * GREFVAL(grib));
+}
+
+fortint IGDSCALE(gribProduct** grib) {
+ return (fortint)(1000000.0 * GDSCALE(grib));
+}
+
+fortdouble RGLENGTH(gribProduct** grib) {
+ return (fortdouble) GLENGTH(grib);
+}
+
+fortdouble RGTABLE(gribProduct** grib) {
+ return (fortdouble) GTABLE(grib);
+}
+
+fortdouble RGCENTRE(gribProduct** grib) {
+ return (fortdouble) GCENTRE(grib);
+}
+
+fortdouble RGPARAM(gribProduct** grib) {
+ return (fortdouble) GPARAM(grib);
+}
+
+fortdouble RGLEVEL(gribProduct** grib) {
+ return (fortdouble) GLEVEL(grib);
+}
+
+fortdouble RGLEVEL1(gribProduct** grib) {
+ return (fortdouble) GLEVEL1(grib);
+}
+
+fortdouble RGLEVEL2(gribProduct** grib) {
+ return (fortdouble) GLEVEL2(grib);
+}
+
+fortdouble RGDATE(gribProduct** grib) {
+ return (fortdouble) GDATE(grib);
+}
+
+fortdouble RGTIME(gribProduct** grib) {
+ return (fortdouble) GTIME(grib);
+}
+
+fortdouble RGSTEP(gribProduct** grib) {
+ return (fortdouble) GSTEP(grib);
+}
+
+fortdouble RGDEFIN(gribProduct** grib) {
+ return (fortdouble) GDEFIN(grib);
+}
+
+fortdouble RGCLASS(gribProduct** grib) {
+ return (fortdouble) GCLASS(grib);
+}
+
+fortdouble RGTYPE(gribProduct** grib) {
+ return (fortdouble) GTYPE(grib);
+}
+
+fortdouble RGSTREAM(gribProduct** grib) {
+ return (fortdouble) GSTREAM(grib);
+}
+
+fortdouble RGEXPVER(gribProduct** grib) {
+ return (fortdouble) GEXPVER(grib);
+}
+
+fortdouble RGNUMPV(gribProduct** grib) {
+ return (fortdouble) GNUMPV(grib);
+}
+
+fortdouble RGREPRES(gribProduct** grib) {
+ return (fortdouble) GREPRES(grib);
+}
+
+fortdouble RGNI(gribProduct** grib) {
+ return (fortdouble) GNI(grib);
+}
+
+fortdouble RGNJ(gribProduct** grib) {
+ return (fortdouble) GNJ(grib);
+}
+
+fortdouble RGRESCOM(gribProduct** grib) {
+ return (fortdouble) GRESCOM(grib);
+}
+
+fortdouble RGNUMBER(gribProduct** grib) {
+ return (fortdouble) GNUMBER(grib);
+}
+
+fortdouble RGSCAN(gribProduct** grib) {
+ return (fortdouble) GSCAN(grib);
+}
+
+fortdouble RGJ(gribProduct** grib) {
+ return (fortdouble) GJ(grib);
+}
+
+fortdouble RGK(gribProduct** grib) {
+ return (fortdouble) GK(grib);
+}
+
+fortdouble RGM(gribProduct** grib) {
+ return (fortdouble) GM(grib);
+}
+
+fortdouble RGREPMOD(gribProduct** grib) {
+ return (fortdouble) GREPMOD(grib);
+}
+
+fortdouble RGTJ(gribProduct** grib) {
+ return (fortdouble) GTJ(grib);
+}
+
+fortdouble RGTK(gribProduct** grib) {
+ return (fortdouble) GTK(grib);
+}
+
+fortdouble RGTM(gribProduct** grib) {
+ return (fortdouble) GTM(grib);
+}
+
+fortdouble RGBITSPV(gribProduct** grib) {
+ return (fortdouble) GBITSPV(grib);
+}
+
+fortdouble RGUNUSED(gribProduct** grib) {
+ return (fortdouble) GUNUSED(grib);
+}
+
+fortdouble RGNVALUE(gribProduct** grib) {
+ return (fortdouble) GNVALUE(grib);
+}
+
+int binaryChopI(despatchI * list, int listLength, unsigned char * test) {
+int current, oldCurrent = -1;
+int direction, startRange = 0, endRange = listLength;
+
+ do {
+ current = (startRange + endRange)/2;
+
+ if( current == oldCurrent) break;
+
+ direction = strcmp(test,(*(list+current)).name);
+
+ if( direction == 0 ) return current;
+
+ if( direction < 0 )
+ endRange = current;
+ else
+ startRange = current;
+
+ oldCurrent = current;
+ } while( startRange <= endRange );
+
+ return -1;
+}
+
+int binaryChopR(despatchR * list, int listLength, unsigned char * test) {
+int current, oldCurrent = -1;
+int direction, startRange = 0, endRange = listLength;
+
+ do {
+ current = (startRange + endRange)/2;
+
+ if( current == oldCurrent) break;
+
+ direction = strcmp(test,(*(list+current)).name);
+
+ if( direction == 0 ) return current;
+
+ if( direction < 0 )
+ endRange = current;
+ else
+ startRange = current;
+
+ oldCurrent = current;
+ } while( startRange <= endRange );
+
+ return -1;
+}
diff --git a/gribex/getValues.h b/gribex/getValues.h
new file mode 100755
index 0000000..438f688
--- /dev/null
+++ b/gribex/getValues.h
@@ -0,0 +1,184 @@
+#ifndef GETVALUES_H
+#define GETVALUES_H
+
+#include "gdecode.h"
+
+#ifdef FORTRAN_NO_UNDERSCORE
+#define GETINT getint
+#define GETREAL getreal
+#else
+#define GETINT getint_
+#define GETREAL getreal_
+#endif
+
+fortint getIntegerValue(gribProduct**,unsigned char*);
+fortdouble getRealValue(gribProduct**,unsigned char*);
+fortint GETINT(gribProduct**,unsigned char*,long);
+fortdouble GETREAL(gribProduct**,unsigned char*,long);
+
+fortint IGNWLAT(gribProduct**);
+fortint IGNWLON(gribProduct**);
+fortint IGSELAT(gribProduct**);
+fortint IGSELON(gribProduct**);
+fortint IGDI(gribProduct**);
+fortint IGDJ(gribProduct**);
+fortint IGIP(gribProduct**);
+fortint IGLATRPL(gribProduct**);
+fortint IGLONRPL(gribProduct**);
+fortint IGROTATN(gribProduct**);
+fortint IGLATSPL(gribProduct**);
+fortint IGLONSPL(gribProduct**);
+fortint IGSFACTR(gribProduct**);
+fortint IGREFVAL(gribProduct**);
+fortint IGDSCALE(gribProduct**);
+
+fortdouble RGLENGTH(gribProduct**);
+fortdouble RGTABLE(gribProduct**);
+fortdouble RGCENTRE(gribProduct**);
+fortdouble RGPARAM(gribProduct**);
+fortdouble RGLEVEL(gribProduct**);
+fortdouble RGLEVEL1(gribProduct**);
+fortdouble RGLEVEL2(gribProduct**);
+fortdouble RGDATE(gribProduct**);
+fortdouble RGTIME(gribProduct**);
+fortdouble RGSTEP(gribProduct**);
+fortdouble RGDEFIN(gribProduct**);
+fortdouble RGCLASS(gribProduct**);
+fortdouble RGTYPE(gribProduct**);
+fortdouble RGSTREAM(gribProduct**);
+fortdouble RGEXPVER(gribProduct**);
+fortdouble RGNUMPV(gribProduct**);
+fortdouble RGREPRES(gribProduct**);
+fortdouble RGNI(gribProduct**);
+fortdouble RGNJ(gribProduct**);
+fortdouble RGRESCOM(gribProduct**);
+fortdouble RGNUMBER(gribProduct**);
+fortdouble RGSCAN(gribProduct**);
+fortdouble RGJ(gribProduct**);
+fortdouble RGK(gribProduct**);
+fortdouble RGM(gribProduct**);
+fortdouble RGREPMOD(gribProduct**);
+fortdouble RGTJ(gribProduct**);
+fortdouble RGTK(gribProduct**);
+fortdouble RGTM(gribProduct**);
+fortdouble RGBITSPV(gribProduct**);
+fortdouble RGUNUSED(gribProduct**);
+fortdouble RGNVALUE(gribProduct**);
+
+typedef fortint (*geti) (gribProduct **);
+typedef fortdouble (*getf) (gribProduct **);
+
+typedef struct {
+ unsigned char * name;
+ geti get;
+} despatchI;
+
+typedef struct {
+ unsigned char * name;
+ getf get;
+} despatchR;
+
+despatchI despatchInteger[] = {
+ "angleOfRotation",IGROTATN,
+ "bottomLayer",GLEVEL2,
+ "codeTable",GTABLE,
+ "complexPackingScalingFactor",IGIP,
+ "dataRepresentationType",GREPRES,
+ "date",GDATE,
+ "ecmwfClass",GCLASS,
+ "ecmwfExperimentVersionNumber",GEXPVER,
+ "ecmwfLocalDefinitionNumber",GDEFIN,
+ "ecmwfStream",GSTREAM,
+ "ecmwfType",GTYPE,
+ "gribLength",GLENGTH,
+ "iDirectionIncrement",IGDI,
+ "jDirectionIncrement",IGDJ,
+ "jPentagonalResolution",GJ,
+ "kPentagonalResolution",GK,
+ "latitudeOfThePoleOfStretching",IGLATSPL,
+ "latitudeOfTheSouthernPoleOfRotation",IGLATRPL,
+ "longitudeOfThePoleOfStretching",IGLONSPL,
+ "longitudeOfTheSouthernPoleOfRotation",IGLONRPL,
+ "mPentagonalResolution",GM,
+ "northWestLatitude",IGNWLAT,
+ "northWestLongitude",IGNWLON,
+ "numberOfBitsPerPackedValue",GBITSPV,
+ "numberOfFieldValues",GNVALUE,
+ "numberOfParallelsBetweenPoleAndEquator",GNUMBER,
+ "numberOfPointsAlongMeridian",GNJ,
+ "numberOfPointsAlongParallel",GNI,
+ "numberOfUnusedBitsAtEndOfSection4",GUNUSED,
+ "numberOfVerticalCoordinateParameters",GNUMPV,
+ "originatingCentre",GCENTRE,
+ "parameter", GPARAM,
+ "pressureLevel",GLEVEL,
+ "referenceValue",IGREFVAL,
+ "representationMode",GREPMOD,
+ "resolutionAndComponentsFlag",GRESCOM,
+ "scaleFactorUsedToPackFieldValues",IGDSCALE,
+ "scanningModeFlag",GSCAN,
+ "southEastLatitude",IGSELAT,
+ "southEastLongitude",IGSELON,
+ "stretchingFactor",IGSFACTR,
+ "subsetJPentagonalResolution",GTJ,
+ "subsetKPentagonalResolution",GTK,
+ "subsetMPentagonalResolution",GTM,
+ "time",GTIME,
+ "timestep",GSTEP,
+ "topLayer",GLEVEL1
+};
+
+despatchR despatchReal[] = {
+ "angleOfRotation",GROTATN,
+ "bottomLayer",RGLEVEL2,
+ "codeTable",RGTABLE,
+ "complexPackingScalingFactor",GIP,
+ "dataRepresentationType",RGREPRES,
+ "date",RGDATE,
+ "ecmwfClass",RGCLASS,
+ "ecmwfExperimentVersionNumber",RGEXPVER,
+ "ecmwfLocalDefinitionNumber",RGDEFIN,
+ "ecmwfStream",RGSTREAM,
+ "ecmwfType",RGTYPE,
+ "gribLength",RGLENGTH,
+ "iDirectionIncrement",GDI,
+ "jDirectionIncrement",GDJ,
+ "jPentagonalResolution",RGJ,
+ "kPentagonalResolution",RGK,
+ "latitudeOfThePoleOfStretching",GLATSPL,
+ "latitudeOfTheSouthernPoleOfRotation",GLATRPL,
+ "longitudeOfThePoleOfStretching",GLONSPL,
+ "longitudeOfTheSouthernPoleOfRotation",GLONRPL,
+ "mPentagonalResolution",RGM,
+ "northWestLatitude",GNWLAT,
+ "northWestLongitude",GNWLON,
+ "numberOfBitsPerPackedValue",RGBITSPV,
+ "numberOfFieldValues",RGNVALUE,
+ "numberOfParallelsBetweenPoleAndEquator",RGNUMBER,
+ "numberOfPointsAlongMeridian",RGNJ,
+ "numberOfPointsAlongParallel",RGNI,
+ "numberOfUnusedBitsAtEndOfSection4",RGUNUSED,
+ "numberOfVerticalCoordinateParameters",RGNUMPV,
+ "originatingCentre",RGCENTRE,
+ "parameter",RGPARAM,
+ "pressureLevel",RGLEVEL,
+ "referenceValue",GREFVAL,
+ "representationMode",RGREPMOD,
+ "resolutionAndComponentsFlag",RGRESCOM,
+ "scaleFactorUsedToPackFieldValues",GDSCALE,
+ "scanningModeFlag",RGSCAN,
+ "southEastLatitude",GSELAT,
+ "southEastLongitude",GSELON,
+ "stretchingFactor",GSFACTR,
+ "subsetJPentagonalResolution",RGTJ,
+ "subsetKPentagonalResolution",RGTK,
+ "subsetMPentagonalResolution",RGTM,
+ "time",RGTIME,
+ "timestep",RGSTEP,
+ "topLayer",RGLEVEL1
+};
+
+int binaryChopI(despatchI * list, int listLength, unsigned char * test);
+int binaryChopR(despatchR * list, int listLength, unsigned char * test);
+
+#endif /* End of GETVALUES_H */
diff --git a/gribex/getchd.F b/gribex/getchd.F
new file mode 100755
index 0000000..61e0d2d
--- /dev/null
+++ b/gribex/getchd.F
@@ -0,0 +1,202 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE GETCHD (KLCHD,HCHD,KLENG,KARRAY,KPR,KRET)
+C
+C---->
+C ----------------------------------------------------------------
+C
+C****
+C
+C PURPOSE.
+C --------
+C
+C GET CHARACTER DATA FROM UNPACKED GRIB OR
+C PSEUDO-GRIB RECORDS, RETRIEVED FROM MARS.
+C
+C** INTERFACE.
+C ----------
+C
+C CALL GETCHD (KLCHD,HCHD,KLENG,KARRAY,KPR,KRET)
+C
+C INTEGER K.
+C REAL P.
+C LOGICAL O.
+C CHARACTER H.
+C
+C INPUT PARAMETERS.
+C -----------------
+C
+C HCHD - STRING TO RECEIVE CHARACTER DATA.
+C KLENG - LENGTH OF THIS STRING.
+C KARRAY - ARRAY CONTAINING UNPACKED RECORD.
+C KPR - DEBUG PRINT SWITCH.
+C 0 , NO PRINTOUT.
+C 1 , DEBUG PRINTOUT.
+C
+C KRET - ABORT/NO ABORT WHEN ERROR FOUND.
+C 0 , ABORT IF ERROR FOUND.
+C NON-ZERO , NO ABORT IF ERROR FOUND.
+C
+C OUTPUT PARAMETERS.
+C ------------------
+C
+C HCHD - STRING OF CHARACTER DATA.
+C KLCHD - NUMBER OF CHARACTERS IN THIS STRING.
+C KRET - ERROR RETURN CODE.
+C 0 , NO ERROR ENCOUNTERED.
+C 1 , TARGET STRING TOO SHORT.
+C
+C METHOD.
+C -------
+C
+C UNPACKED DATA IS IN SELF DEFINING RECORDS. THE REQUIRED
+C VALUES ARE LOCATED AND EXTRACTED.
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C SEE MARS FORMAT DOCUMENTATION RE GRIB, PSEUDO-GRIB AND
+C UNPACKED FORMATS.
+C
+C COMMENTS.
+C ---------
+C
+C PROGRAM CONTAINS SECTIONS 0 TO 2 AND SECTION 9.
+C
+C AUTHOR.
+C -------
+C
+C J. HENNESSY ECMWF 18:06:86.
+C
+C MODIFICATIONS
+C --------------
+C NONE.
+C
+C ---------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 0 . DEFINITION OF VARIABLES.
+C ------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+ DIMENSION KARRAY(*)
+C
+ CHARACTER*(*) HCHD
+C
+C
+C ---------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 1 . SET INITIAL VALUES. CHECK INPUT PARAMETERS.
+C -------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETCHD : SECTION 1.'
+C
+ IRET = KRET
+ KRET = 0
+C
+C --------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 2 . EXTRACT VALUES . PRINT IF REQUIRED.
+C -----------------------------------------------
+C
+ 2000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETCHD : SECTION 2.'
+C
+ ILIB1 = KARRAY(2)
+ ILIB2 = KARRAY(2+ILIB1+1)
+ ILFB2 = KARRAY(2+ILIB1+1+ILIB2+1)
+ ILIB3 = KARRAY(2+ILIB1+1+ILIB2+1+ILFB2+1)
+ KLCHD = KARRAY(2+ILIB1+1+ILIB2+1+ILFB2+1+ILIB3+1)
+C
+ IF (KLENG.LT.KLCHD)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) KRET , KLCHD
+ GO TO 9000
+ ENDIF
+C
+ DO 2010 J=1,KLCHD
+ IVAL = KARRAY(J+2+ILIB1+1+ILIB2+1+ILFB2+1+ILIB3+1)
+ READ (IVAL,'(A1)') HCHD(J:J)
+ 2010 CONTINUE
+C
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 9 . RETURN TO CALLING ROUTINE OR ABORT. FORMAT STATEMENTS.
+C ------------------------------------------------------------------
+C
+ 9000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETCHD : SECTION 9.'
+C
+ IF (KRET.NE.0.AND.IRET.EQ.0) CALL ABORT
+C
+ RETURN
+C
+C
+ 9001 FORMAT (1H ,'GETCHD : ERROR CODE = ',I3,'. TARGET STRING MUST BE',
+ C ' AT LEAST ',I5,' CHARACTERS LONG.')
+C
+C ------------------------------------------------------------------
+C
+C
+ END
diff --git a/gribex/getfb2.F b/gribex/getfb2.F
new file mode 100755
index 0000000..ed78edf
--- /dev/null
+++ b/gribex/getfb2.F
@@ -0,0 +1,203 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE GETFB2 (KLFB2,PFB2,KLENG,KARRAY,KPR,KRET)
+C
+C---->
+C**** GETFB2 - Extract real values from section 2 of GRIB code.
+C
+C Purpose.
+C --------
+C
+C Get real values from section 2 of unpacked GRIB or
+C Pseudo-grib records, retrieved from MARS.
+C
+C** Interface.
+C ----------
+C
+C CALL GETFB2 (KLFB2,PFB2,KLENG,KARRAY,KPR,KRET)
+C
+C INTEGER K.
+C REAL P.
+C LOGICAL O.
+C CHARACTER H.
+C
+C Input parameters.
+C -----------------
+C
+C PFB2 - Array to receive section 2 values.
+C KLENG - Length of this array.
+C KARRAY - Array containing unpacked record.
+C KPR - Debug print switch.
+C 0 , No printout.
+C 1 , Debug printout.
+C 2 , Print values extracted.
+C
+C KRET - Abort/no abort when error found.
+C 0 , abort if error found.
+C Non-zero , no abort if error found.
+C
+C Output parameters.
+C ------------------
+C
+C PFB2 - Array containing values from section 2.
+C KLFB2 - Number of values in this array.
+C KRET - Error return code.
+C 0 , No error encountered.
+C 1 , Target array too small.
+C
+C Method.
+C -------
+C
+C Unpacked data is in self defining records. The required
+C values are located and extracted.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C See MARS format documentation re GRIB, Pseudo-grib and
+C unpacked formats.
+C
+C Comments.
+C ---------
+C
+C Subroutine contains sections 0 to 2 and section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18:06:86.
+C
+C Modifications
+C --------------
+C
+C None.
+C
+C ---------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 0 . DEFINITION OF VARIABLES.
+C ------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+ DIMENSION KARRAY(*)
+ DIMENSION PFB2(KLENG)
+C
+ EQUIVALENCE (IVAL,ZVAL)
+C
+C ---------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 1 . SET INITIAL VALUES. CHECK INPUT PARAMETERS.
+C -------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETFB2 : SECTION 1.'
+C
+ IRET = KRET
+ KRET = 0
+C
+C --------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 2 . EXTRACT VALUES . PRINT IF REQUIRED.
+C -----------------------------------------------
+C
+ 2000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETFB2 : SECTION 2.'
+C
+ ILIB1 = KARRAY(2)
+ ILIB2 = KARRAY(2+ILIB1+1)
+ KLFB2 = KARRAY(2+ILIB1+1+ILIB2+1)
+C
+ IF (KLENG.LT.KLFB2)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) KRET , KLFB2
+ GO TO 9000
+ ENDIF
+C
+ DO 2010 J=1,KLFB2
+ IVAL = KARRAY(J+2+ILIB1+1+ILIB2+1)
+ PFB2(J) = ZVAL
+ IF (KPR.GT.0) WRITE (*,9501) ZVAL
+ 2010 CONTINUE
+C
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 9 . RETURN TO CALLING ROUTINE OR ABORT. FORMAT STATEMENTS.
+C ------------------------------------------------------------------
+C
+ 9000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETFB2 : SECTION 9.'
+C
+ IF (KRET.NE.0.AND.IRET.EQ.0) CALL ABORT
+C
+ RETURN
+C
+C
+ 9001 FORMAT (1H ,'GETFB2 : ERROR CODE = ',I3,'. TARGET ARRAY MUST BE ',
+ C ' AT LEAST ',I5,' WORDS LONG.')
+C
+ 9501 FORMAT (1H ,F30.8)
+C
+C ------------------------------------------------------------------
+C
+C
+ END
diff --git a/gribex/getfpd.F b/gribex/getfpd.F
new file mode 100755
index 0000000..6ad5c8f
--- /dev/null
+++ b/gribex/getfpd.F
@@ -0,0 +1,205 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE GETFPD (KFPD,PFPD,KLEN,KARAY,KPR,KRET)
+C
+C---->
+C**** GETFPD - Extract data from unpacked GRIB record.
+C
+C Purpose.
+C --------
+C
+C Get floating point data from record of unpacked GRIB
+C or Pseudo-grib data.
+C
+C** Interface.
+C ----------
+C
+C CALL GETFPD (KFPD,PFPD,KLEN,KARAY,KPR,KRET)
+C
+C INTEGER K.
+C REAL P.
+C LOGICAL O.
+C CHARACTER H.
+C
+C Input parameters.
+C -----------------
+C
+C PFPD - Array to receive floating point data.
+C KLEN - Length of this array.
+C KARAY - Array containing unpacked record.
+C
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C 1 , Debug printout.
+C
+C KRET - Abort/no abort when error found.
+C 0 , Abort if error found.
+C Non-zero , no abort on error.
+C
+C Output parameters.
+C ------------------
+C
+C KRET - Error return code.
+C 0 , No error encountered.
+C 1 , Target array too small.
+C
+C PFPD - Floating point data.
+C KFPD - Number of values in this array.
+C
+C Method.
+C -------
+C
+C Unpacked data is in self-defining records. The required
+C values are located and extracted.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C See MARS format documentation re GRIB, Pseudo-grib and
+C unpacked record formats.
+C
+C Comments.
+C ---------
+C
+C Routine contains sections 0 to 2 and section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18:06:86.
+C
+C Modifications
+C --------------
+C
+C None.
+C
+C ----------------------------------------------------------------
+C---->
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 0 . DEFINITION OF VARIABLES.
+C ----------------------------------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+ DIMENSION KARAY(*)
+ DIMENSION PFPD(KLEN)
+C
+ EQUIVALENCE (IVAL,ZVAL)
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 1 . SET INITIAL VALUES. CHECK INPUT PARAMETERS.
+C ----------------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETFPD : SECTION 1.'
+C
+ IRET = KRET
+ KRET = 0
+C
+C
+C* GO TO SECTION 9 , IF ERROR IN PARAMETERS.
+C
+ IF (KRET.NE.0) GO TO 9000
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 2 . LOCATE AND EXTRACT VALUES.
+C ----------------------------------------------------------------
+C
+ 2000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETFPD : SECTION 2.'
+C
+ ILB1 = KARAY(2)
+ ILB2 = KARAY(2+ILB1+1)
+ ILF2 = KARAY(2+ILB1+1+ILB2+1)
+ ILB3 = KARAY(2+ILB1+1+ILB2+1+ILF2+1)
+ ILCD = KARAY(2+ILB1+1+ILB2+1+ILF2+1+ILB3+1)
+ KFPD = KARAY(2+ILB1+1+ILB2+1+ILF2+1+ILB3+1+ILCD+1)
+C
+ IF (KLEN.LT.KFPD)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) KRET , KFPD
+ GO TO 9000
+ ENDIF
+C
+ DO 2010 J=1,KFPD
+ IVAL = KARAY(J+2+ILB1+1+ILB2+1+ILF2+1+ILB3+1+ILCD+1)
+ PFPD(J) = ZVAL
+ 2010 CONTINUE
+C
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 9 . RETURN TO CALLING ROUTINE OR ABORT. FORMAT STATEMENTS.
+C ------------------------------------------------------------------
+C
+ 9000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETFPD : SECTION 9.'
+C
+ IF (KRET.NE.0.AND.IRET.EQ.0) CALL ABORT
+C
+ RETURN
+C
+C
+ 9001 FORMAT (1H ,'GETFPD : ERROR CODE = ',I3,'. TARGET ARRAY MUST ',
+ C 'BE AT LEAST ',I5,' WORDS LONG.')
+C
+C
+C ---------------------------------------------------------------
+C
+C
+ END
+C
diff --git a/gribex/getib1.F b/gribex/getib1.F
new file mode 100755
index 0000000..37c72af
--- /dev/null
+++ b/gribex/getib1.F
@@ -0,0 +1,194 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE GETIB1 (KLIB1,KIB1,KLENG,KARRAY,KPR,KRET)
+C
+C---->
+C**** GETIB1 - Get values from section 1 of GRIB code.
+C
+C Purpose.
+C --------
+C
+C Get integer values from section 1 of unpacked GRIB or
+C pseudo-GRIB records, retrieved from MARS.
+C
+C** Interface.
+C ----------
+C
+C CALL GETIB1 (KLIB1,KIB1,KLENG,KARRAY,KPR,KRET)
+C
+C INTEGER K.
+C REAL P.
+C LOGICAL O.
+C CHARACTER H.
+C
+C Input parameters.
+C -----------------
+C
+C KIB1 - Array to receive section 1 values.
+C KLENG - Length of this array.
+C KARRAY - Array containing unpacked record.
+C KPR - Debug print switch.
+C 0 , No printout.
+C 1 , Debug printout.
+C 2 , Print section 1 values.
+C
+C KRET - Abort/no abort when error found.
+C 0 , Abort if error found.
+C Non-zero , no abort when error found.
+C
+C Output parameters.
+C ------------------
+C
+C KIB1 - Array containing values from section 1.
+C KLIB1 - Number of values in this array.
+C KRET - Error return code.
+C 0 , No error encountered.
+C 1 , Target array too small.
+C
+C Method.
+C -------
+C
+C Unpacked data is in self defining records. The required
+C values are located and extracted.
+C
+C Externals.
+C ----------
+C
+C PRTBK1
+C
+C Reference.
+C ----------
+C
+C See MARS format documentation re GRIB, pseudo-GRIB and
+C unpacked formats.
+C
+C Comments.
+C ---------
+C
+C Program contains sections 0 to 2 and section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18:06:86.
+C
+C Modifications
+C --------------
+C
+C None.
+C
+C ---------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+ DIMENSION KARRAY(*)
+ DIMENSION KIB1(KLENG)
+C
+C ---------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Set initial values. Check input parameters.
+C -------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETIB1 : Section 1.'
+C
+ IRET = KRET
+ KRET = 0
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Extract values . Print if required.
+C -----------------------------------------------
+C
+ 2000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETIB1 : Section 2.'
+C
+ KLIB1 = KARRAY(2)
+C
+ IF (KLENG.LT.KLIB1)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) KRET , KLIB1
+ GO TO 9000
+ ENDIF
+C
+ DO 2010 J=1,KLIB1
+ KIB1(J) = KARRAY(J+2)
+ 2010 CONTINUE
+C
+ IF (KPR.GT.0) CALL PRTBK1(KIB1)
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine or abort. Format statements.
+C ------------------------------------------------------------------
+C
+ 9000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETIB1 : Section 9.'
+C
+ IF (KRET.NE.0.AND.IRET.EQ.0) CALL ABORT
+C
+ RETURN
+C
+C
+ 9001 FORMAT (1H ,'GETIB1 : Error code = ',I3,'. Target array must be ',
+ C ' at least ',I5,' words long.')
+C
+C ------------------------------------------------------------------
+C
+C
+ END
diff --git a/gribex/getib2.F b/gribex/getib2.F
new file mode 100755
index 0000000..833c2bc
--- /dev/null
+++ b/gribex/getib2.F
@@ -0,0 +1,197 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE GETIB2 (KLIB2,KIB2,KLENG,KARRAY,KPR,KRET)
+C
+C---->
+C**** GETIB2 - Extract integer values from section 2 of GRIB record.
+C
+C Purpose.
+C --------
+C
+C Get integer values from section 2 of unpacked GRIB or
+C Pseudo-grib records, retrieved from MARS.
+C
+C** Interface.
+C ----------
+C
+C CALL GETIB2 (KLIB2,KIB2,KLENG,KARRAY,KPR,KRET)
+C
+C INTEGER K.
+C REAL P.
+C LOGICAL O.
+C CHARACTER H.
+C
+C Input parameters.
+C -----------------
+C
+C KIB2 - Array to receive section 2 values.
+C KLENG - Length of this array.
+C KARRAY - Array containing unpacked record.
+C KPR - Debug print switch.
+C 0 , No printout.
+C 1 , Debug printout.
+C 2 , Print section 2 values.
+C
+C KRET - Abort/no abort when error found.
+C 0 , Abort if error found.
+C Non-zero , no abort if error found.
+C
+C Output parameters.
+C ------------------
+C
+C KIB2 - Array containing values from section 2.
+C KLIB2 - Number of values in this array.
+C KRET - Error return code.
+C 0 , No error encountered.
+C 1 , Target array too small.
+C
+C Method.
+C -------
+C
+C Unpacked data is in self defining records. The required
+C values are located and extracted.
+C
+C Externals.
+C ----------
+C
+C PRTBK2
+C
+C Reference.
+C ----------
+C
+C See MARS format documentation re GRIB, Pseudo-grib and
+C unpacked formats.
+C
+C Comments.
+C ---------
+C
+C Routine contains sections 0 to 2 and section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18:06:86.
+C
+C Modifications
+C --------------
+C
+C None.
+C
+C ---------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 0 . DEFINITION OF VARIABLES.
+C ------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+ DIMENSION KARRAY(*)
+ DIMENSION KIB2(KLENG)
+C
+C ---------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 1 . SET INITIAL VALUES. CHECK INPUT PARAMETERS.
+C -------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETIB2 : SECTION 1.'
+C
+ IRET = KRET
+ KRET = 0
+C
+C --------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 2 . EXTRACT VALUES . PRINT IF REQUIRED.
+C -----------------------------------------------
+C
+ 2000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETIB2 : SECTION 2.'
+C
+ ILIB1 = KARRAY(2)
+ KLIB2 = KARRAY(2+ILIB1+1)
+C
+ IF (KLENG.LT.KLIB2)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) KRET , KLIB2
+ GO TO 9000
+ ENDIF
+C
+ DO 2010 J=1,KLIB2
+ KIB2(J) = KARRAY(J+2+ILIB1+1)
+ 2010 CONTINUE
+C
+ IF (KPR.GT.0) CALL PRTBK2(KIB2)
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 9 . RETURN TO CALLING ROUTINE OR ABORT. FORMAT STATEMENTS.
+C ------------------------------------------------------------------
+C
+ 9000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETIB2 : SECTION 9.'
+C
+ IF (KRET.NE.0.AND.IRET.EQ.0) CALL ABORT
+C
+ RETURN
+C
+C
+ 9001 FORMAT (1H ,'GETIB2 : ERROR CODE = ',I3,'. TARGET ARRAY MUST BE ',
+ C ' AT LEAST ',I5,' WORDS LONG.')
+C
+C ------------------------------------------------------------------
+C
+C
+ END
diff --git a/gribex/getib3.F b/gribex/getib3.F
new file mode 100755
index 0000000..2434697
--- /dev/null
+++ b/gribex/getib3.F
@@ -0,0 +1,199 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE GETIB3 (KLIB3,KIB3,KLENG,KARRAY,KPR,KRET)
+C
+C---->
+C ----------------------------------------------------------------
+C
+C****
+C
+C PURPOSE.
+C --------
+C
+C GET BINARY VALUES FROM BLOCK 3 OF UNPACKED GRIB OR
+C PSEUDO-GRIB RECORDS, RETRIEVED FROM MARS.
+C
+C** INTERFACE.
+C ----------
+C
+C CALL GETIB3 (KLIB3,KIB3,KLENG,KARRAY,KPR,KRET)
+C
+C INTEGER K.
+C REAL P.
+C LOGICAL O.
+C CHARACTER H.
+C
+C INPUT PARAMETERS.
+C -----------------
+C
+C KIB3 - ARRAY TO RECEIVE BLOCK 3 VALUES.
+C KLENG - LENGTH OF THIS ARRAY.
+C KARRAY - ARRAY CONTAINING UNPACKED RECORD.
+C KPR - DEBUG PRINT SWITCH.
+C 0 , NO PRINTOUT.
+C 1 , DEBUG PRINTOUT.
+C
+C KRET - ABORT/NO ABORT WHEN ERROR FOUND.
+C 0 , ABORT IF ERROR FOUND.
+C NON-ZERO , NO ABORT IF ERROR FOUND.
+C
+C OUTPUT PARAMETERS.
+C ------------------
+C
+C KIB3 - ARRAY CONTAINING VALUES FROM BLOCK 3.
+C KLIB3 - NUMBER OF WORDS FILLED IN THIS ARRAY.
+C KRET - ERROR RETURN CODE.
+C 0 , NO ERROR ENCOUNTERED.
+C 1 , TARGET ARRAY TOO SMALL.
+C
+C METHOD.
+C -------
+C
+C UNPACKED DATA IS IN SELF DEFINING RECORDS. THE REQUIRED
+C VALUES ARE LOCATED AND EXTRACTED.
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C SEE MARS FORMAT DOCUMENTATION RE GRIB, PSEUDO-GRIB AND
+C UNPACKED FORMATS.
+C
+C COMMENTS.
+C ---------
+C
+C PROGRAM CONTAINS SECTIONS 0 TO 2 AND SECTION 9.
+C
+C AUTHOR.
+C -------
+C
+C J. HENNESSY ECMWF 18:06:86.
+C
+C MODIFICATIONS
+C --------------
+C NONE.
+C
+C ---------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 0 . DEFINITION OF VARIABLES.
+C ------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+ DIMENSION KARRAY(*)
+ DIMENSION KIB3(KLENG)
+C
+C
+C ---------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 1 . SET INITIAL VALUES. CHECK INPUT PARAMETERS.
+C -------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETIB3 : SECTION 1.'
+C
+ IRET = KRET
+ KRET = 0
+C
+C --------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 2 . EXTRACT VALUES . PRINT IF REQUIRED.
+C -----------------------------------------------
+C
+ 2000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETIB3 : SECTION 2.'
+C
+ ILIB1 = KARRAY(2)
+ ILIB2 = KARRAY(2+ILIB1+1)
+ ILFB2 = KARRAY(2+ILIB1+1+ILIB2+1)
+ KLIB3 = KARRAY(2+ILIB1+1+ILIB2+1+ILFB2+1)
+C
+ IF (KLENG.LT.KLIB3)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) KRET , KLIB3
+ GO TO 9000
+ ENDIF
+C
+ DO 2010 J=1,KLIB3
+ KIB3(J) = KARRAY(J+2+ILIB1+1+ILIB2+1+ILFB2+1)
+ 2010 CONTINUE
+C
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 9 . RETURN TO CALLING ROUTINE OR ABORT. FORMAT STATEMENTS.
+C ------------------------------------------------------------------
+C
+ 9000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETIB3 : SECTION 9.'
+C
+ IF (KRET.NE.0.AND.IRET.EQ.0) CALL ABORT
+C
+ RETURN
+C
+C
+ 9001 FORMAT (1H ,'GETIB3 : ERROR CODE = ',I3,'. TARGET ARRAY MUST BE ',
+ C ' AT LEAST ',I5,' WORDS LONG.')
+C
+C ------------------------------------------------------------------
+C
+C
+ END
diff --git a/gribex/getind.F b/gribex/getind.F
new file mode 100755
index 0000000..2963545
--- /dev/null
+++ b/gribex/getind.F
@@ -0,0 +1,201 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE GETIND (KLND,KIND,KLEN,KARAY,KPR,KRET)
+C
+C---->
+C ----------------------------------------------------------------
+C
+C****
+C
+C PURPOSE.
+C --------
+C
+C GET INTEGER DATA FROM RECORD OF UNPACKED GRIB
+C OR PSEUDO-GRIB DATA.
+C
+C** INTERFACE.
+C ----------
+C
+C CALL GETIND (KLND,KIND,KLEN,KARAY,KPR,KRET)
+C
+C INTEGER K.
+C REAL P.
+C LOGICAL O.
+C CHARACTER H.
+C
+C INPUT PARAMETERS.
+C -----------------
+C
+C KIND - ARRAY TO RECEIVE INTEGER DATA.
+C KLEN - LENGTH OF THIS ARRAY.
+C KARAY - ARRAY CONTAINING UNPACKED RECORD.
+C KPR - DEBUG PRINT SWITCH.
+C 0 , NO PRINTOUT.
+C 1 , DEBUG PRINTOUT.
+C
+C KRET - ABORT/NO ABORT WHEN ERROR FOUND.
+C 0 , ABORT IF ERROR FOUND.
+C NON-ZERO , NO ABORT ON ERROR.
+C
+C OUTPUT PARAMETERS.
+C ------------------
+C
+C KRET - ERROR RETURN CODE.
+C 0 , NO ERROR ENCOUNTERED.
+C 1 , TARGET ARRAY TOO SMALL.
+C KIND - INTEGER DATA.
+C KLND - NUMBER OF VALUES IN THIS ARRAY.
+C
+C METHOD.
+C -------
+C
+C UNPACKED DATA IS IN SELF-DEFINING RECORDS. THE REQUIRED
+C VALUES ARE LOCATED AND EXTRACTED.
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C SEE MARS FORMAT DOCUMENTATION RE GRIB, PSEUDO-GRIB AND
+C UNPACKED RECORD FORMATS.
+C
+C COMMENTS.
+C ---------
+C
+C PROGRAM CONTAINS SECTIONS 0 TO 2 AND SECTION 9.
+C
+C AUTHOR.
+C -------
+C
+C J. HENNESSY ECMWF 18:06:86.
+C
+C MODIFICATIONS
+C --------------
+C NONE.
+C
+C ----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 0 . DEFINITION OF VARIABLES.
+C ------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+ DIMENSION KARAY(*)
+ DIMENSION KIND(KLEN)
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 1 . SET INITIAL VALUES. CHECK INPUT PARAMETERS.
+C -------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETIND : SECTION 1.'
+C
+ IRET = KRET
+ KRET = 0
+C
+C
+C* GO TO SECTION 9 , IF ERROR IN PARAMETERS.
+C
+ IF (KRET.NE.0) GO TO 9000
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 2 . LOCATE AND EXTRACT VALUES.
+C --------------------------------------
+C
+ 2000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETIND : SECTION 2.'
+C
+ ILB1 = KARAY(2)
+ ILB2 = KARAY(2+ILB1+1)
+ ILF2 = KARAY(2+ILB1+1+ILB2+1)
+ ILB3 = KARAY(2+ILB1+1+ILB2+1+ILF2+1)
+ ILCD = KARAY(2+ILB1+1+ILB2+1+ILF2+1+ILB3+1)
+ ILFD = KARAY(2+ILB1+1+ILB2+1+ILF2+1+ILB3+1+ILCD+1)
+ KLND = KARAY(2+ILB1+1+ILB2+1+ILF2+1+ILB3+1+ILCD+1+ILFD+1)
+C
+ IF (KLEN.LT.KLND)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) KRET , KLND
+ GO TO 9000
+ ENDIF
+C
+ DO 2010 J=1,KLND
+ KIND(J) = KARAY(J+2+ILB1+1+ILB2+1+ILF2+1+ILB3+1+ILCD+1+ILFD+1)
+ 2010 CONTINUE
+C
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 9 . RETURN TO CALLING ROUTINE OR ABORT. FORMAT STATEMENTS.
+C ------------------------------------------------------------------
+C
+ 9000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETIND : SECTION 9.'
+C
+ IF (KRET.NE.0.AND.IRET.EQ.0) CALL ABORT
+C
+ RETURN
+C
+C
+ 9001 FORMAT (1H ,'GETIND : ERROR CODE = ',I3,'. TARGET ARRAY MUST ',
+ C 'BE AT LEAST ',I5,' WORDS LONG.')
+C
+C
+C ---------------------------------------------------------------
+C
+C
+ END
+C
diff --git a/gribex/getlgd.F b/gribex/getlgd.F
new file mode 100755
index 0000000..9e72b0f
--- /dev/null
+++ b/gribex/getlgd.F
@@ -0,0 +1,205 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE GETLGD (KLGD,OLND,KLEN,KARAY,KPR,KRET)
+C
+C---->
+C ----------------------------------------------------------------
+C
+C****
+C
+C PURPOSE.
+C --------
+C
+C GET LOGICAL DATA FROM RECORD OF UNPACKED GRIB
+C OR PSEUDO-GRIB DATA.
+C
+C** INTERFACE.
+C ----------
+C
+C CALL GETLGD (KLGD,OLND,KLEN,KARAY,KPR,KRET)
+C
+C INTEGER K.
+C REAL P.
+C LOGICAL O.
+C CHARACTER H.
+C
+C INPUT PARAMETERS.
+C -----------------
+C
+C OLND - ARRAY TO RECEIVE LOGICAL DATA.
+C KLEN - LENGTH OF THIS ARRAY.
+C KARAY - ARRAY CONTAINING UNPACKED RECORD.
+C KPR - DEBUG PRINT SWITCH.
+C 0 , NO PRINTOUT.
+C 1 , DEBUG PRINTOUT.
+C
+C KRET - ABORT/NO ABORT WHEN ERROR FOUND.
+C 0 , ABORT IF ERROR FOUND.
+C NON-ZERO , NO ABORT ON ERROR.
+C
+C OUTPUT PARAMETERS.
+C ------------------
+C
+C KRET - ERROR RETURN CODE.
+C 0 , NO ERROR ENCOUNTERED.
+C 1 , TARGET ARRAY TOO SMALL.
+C OLND - LOGICAL DATA.
+C KLGD - NUMBER OF VALUES IN THIS ARRAY.
+C
+C METHOD.
+C -------
+C
+C UNPACKED DATA IS IN SELF-DEFINING RECORDS. THE REQUIRED
+C VALUES ARE LOCATED AND EXTRACTED.
+C
+C EXTERNALS.
+C ----------
+C
+C NONE.
+C
+C REFERENCE.
+C ----------
+C
+C SEE MARS FORMAT DOCUMENTATION RE GRIB, PSEUDO-GRIB AND
+C UNPACKED RECORD FORMATS.
+C
+C COMMENTS.
+C ---------
+C
+C PROGRAM CONTAINS SECTIONS 0 TO 2 AND SECTION 9.
+C
+C AUTHOR.
+C -------
+C
+C J. HENNESSY ECMWF 18:06:86.
+C
+C MODIFICATIONS
+C --------------
+C NONE.
+C
+C ----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 0 . DEFINITION OF VARIABLES.
+C ------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+ DIMENSION KARAY(*)
+ DIMENSION OLND(KLEN)
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 1 . SET INITIAL VALUES. CHECK INPUT PARAMETERS.
+C -------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETLGD : SECTION 1.'
+C
+ IRET = KRET
+ KRET = 0
+C
+C
+C* GO TO SECTION 9 , IF ERROR IN PARAMETERS.
+C
+ IF (KRET.NE.0) GO TO 9000
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 2 . LOCATE AND EXTRACT VALUES.
+C --------------------------------------
+C
+ 2000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETLGD : SECTION 2.'
+C
+ ILB1 = KARAY(2)
+ ILB2 = KARAY(2+ILB1+1)
+ ILF2 = KARAY(2+ILB1+1+ILB2+1)
+ ILB3 = KARAY(2+ILB1+1+ILB2+1+ILF2+1)
+ ILCD = KARAY(2+ILB1+1+ILB2+1+ILF2+1+ILB3+1)
+ ILFD = KARAY(2+ILB1+1+ILB2+1+ILF2+1+ILB3+1+ILCD+1)
+ ILID = KARAY(2+ILB1+1+ILB2+1+ILF2+1+ILB3+1+ILCD+1+ILFD+1)
+ KLGD = KARAY(2+ILB1+1+ILB2+1+ILF2+1+ILB3+1+ILCD+1+ILFD+1+ILID+1)
+C
+ IF (KLEN.LT.KLGD)
+ C THEN
+ KRET = 1
+ WRITE (*,9001) KRET , KLGD
+ GO TO 9000
+ ENDIF
+C
+ DO 2010 J=1,KLGD
+ IVAL = KARAY(J+2+ILB1+1+ILB2+1+ILF2+1+ILB3+1+ILCD+1+ILFD+1
+ C +KLGD+1)
+ OLND(J) = .FALSE.
+ IF (IVAL.EQ.1) OLND(J) = .TRUE.
+ 2010 CONTINUE
+C
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 9 . RETURN TO CALLING ROUTINE OR ABORT. FORMAT STATEMENTS.
+C ------------------------------------------------------------------
+C
+ 9000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'GETLGD : SECTION 9.'
+C
+ IF (KRET.NE.0.AND.IRET.EQ.0) CALL ABORT
+C
+ RETURN
+C
+C
+ 9001 FORMAT (1H ,'GETLGD : ERROR CODE = ',I3,'. TARGET ARRAY MUST ',
+ C 'BE AT LEAST ',I5,' WORDS LONG.')
+C
+C
+C ---------------------------------------------------------------
+C
+C
+ END
+C
diff --git a/gribex/getsetValues.c b/gribex/getsetValues.c
new file mode 100755
index 0000000..6691739
--- /dev/null
+++ b/gribex/getsetValues.c
@@ -0,0 +1,449 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <string.h>
+
+#include "getsetValues.h"
+
+void copyNameLoc(
+ unsigned char* copy,
+ unsigned char* original,
+ int copyLength,
+ int originalLength) {
+int length;
+unsigned char *p;
+
+ length = (originalLength>copyLength)?copyLength:originalLength;
+ memcpy(copy,original,length);
+ copy[length] = '\0';
+
+ p = copy + length - 1;
+ while( *p == ' ' ) *(p--) = '\0';
+
+ return;
+}
+
+fortint GETINT(
+ gribProduct** grib,
+ unsigned char* request,
+ long requestLength ) {
+int index;
+int listLength = sizeof(despatchInteger)/sizeof(despatchI);
+unsigned char Request[80];
+
+ copyNameLoc(Request,request,(int)sizeof(Request),(int)requestLength);
+
+ index = binaryChopI(despatchInteger,listLength,Request);
+ if( index < 0 )
+ return -999999;
+ else {
+ return despatchInteger[index].get(grib);
+ }
+}
+
+fortint getIntegerValue(
+ gribProduct** grib,
+ unsigned char* request ){
+
+ return GETINT(grib,request,(long)strlen((char*)request));
+}
+
+fortdouble GETREAL(
+ gribProduct** grib,
+ unsigned char* request,
+ long requestLength ) {
+int index;
+int listLength = sizeof(despatchReal)/sizeof(despatchR);
+unsigned char Request[80];
+
+ copyNameLoc(Request,request,(int)sizeof(Request),(int)requestLength);
+
+ index = binaryChopR(despatchReal,listLength,Request);
+ if( index < 0 )
+ return -999999.0;
+ else {
+ return despatchReal[index].get(grib);
+ }
+}
+
+fortdouble getRealValue(
+ gribProduct** grib,
+ unsigned char* request ) {
+
+ return GETREAL(grib,request,(long)strlen((char*)request));
+}
+
+fortint IGNWLAT(gribProduct** grib) {
+fortdouble value = RGNWLAT(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGNWLON(gribProduct** grib) {
+fortdouble value = RGNWLON(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGSELAT(gribProduct** grib) {
+fortdouble value = RGSELAT(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGSELON(gribProduct** grib) {
+fortdouble value = RGSELON(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGDI(gribProduct** grib) {
+fortdouble value = RGDI(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGDJ(gribProduct** grib) {
+fortdouble value = RGDJ(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGIP(gribProduct** grib) {
+fortdouble value = RGIP(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGLATRP(gribProduct** grib) {
+fortdouble value = RGLATRP(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGLONRP(gribProduct** grib) {
+fortdouble value = RGLONRP(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGROTAT(gribProduct** grib) {
+fortdouble value = RGROTAT(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGLATSP(gribProduct** grib) {
+fortdouble value = RGLATSP(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGLONSP(gribProduct** grib) {
+fortdouble value = RGLONSP(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGSFACT(gribProduct** grib) {
+fortdouble value = RGSFACT(grib);
+
+ if( value != -999999.0 )
+ return (fortint)(1000000.0 * value);
+ else
+ return -999999;
+}
+
+fortint IGREFVL(gribProduct** grib) {
+ return (fortint)(1000000.0 * RGREFVL(grib));
+}
+
+fortint IGDSCAL(gribProduct** grib) {
+ return (fortint)(1000000.0 * RGDSCAL(grib));
+}
+
+fortdouble RGLNGTH(gribProduct** grib) {
+ return (fortdouble) IGLNGTH(grib);
+}
+
+fortdouble RGTABLE(gribProduct** grib) {
+ return (fortdouble) IGTABLE(grib);
+}
+
+fortdouble RGCENTR(gribProduct** grib) {
+ return (fortdouble) IGCENTR(grib);
+}
+
+fortdouble RGPARAM(gribProduct** grib) {
+ return (fortdouble) IGPARAM(grib);
+}
+
+fortdouble RGLEVEL(gribProduct** grib) {
+ return (fortdouble) IGLEVEL(grib);
+}
+
+fortdouble RGLEVL1(gribProduct** grib) {
+ return (fortdouble) IGLEVL1(grib);
+}
+
+fortdouble RGLEVL2(gribProduct** grib) {
+ return (fortdouble) IGLEVL2(grib);
+}
+
+fortdouble RGDATE(gribProduct** grib) {
+ return (fortdouble) IGDATE(grib);
+}
+
+fortdouble RGTIME(gribProduct** grib) {
+ return (fortdouble) IGTIME(grib);
+}
+
+fortdouble RGSTEP(gribProduct** grib) {
+ return (fortdouble) IGSTEP(grib);
+}
+
+fortdouble RGSTEP1(gribProduct ** grib) {
+ return (fortdouble) IGSTEP1(grib);
+}
+
+fortdouble RGSTEP2(gribProduct ** grib) {
+ return (fortdouble) IGSTEP2(grib);
+}
+
+fortdouble RGDEFIN(gribProduct** grib) {
+ return (fortdouble) IGDEFIN(grib);
+}
+
+fortdouble RGCLASS(gribProduct** grib) {
+ return (fortdouble) IGCLASS(grib);
+}
+
+fortdouble RGTYPE(gribProduct** grib) {
+ return (fortdouble) IGTYPE(grib);
+}
+
+fortdouble RGSTREM(gribProduct** grib) {
+ return (fortdouble) IGSTREM(grib);
+}
+
+fortdouble RGEXPVR(gribProduct** grib) {
+ return (fortdouble) IGEXPVR(grib);
+}
+
+fortdouble RGNUMPV(gribProduct** grib) {
+ return (fortdouble) IGNUMPV(grib);
+}
+
+fortdouble RGREPRS(gribProduct** grib) {
+ return (fortdouble) IGREPRS(grib);
+}
+
+fortdouble RGNI(gribProduct** grib) {
+ return (fortdouble) IGNI(grib);
+}
+
+fortdouble RGNJ(gribProduct** grib) {
+ return (fortdouble) IGNJ(grib);
+}
+
+fortdouble RGRESCO(gribProduct** grib) {
+ return (fortdouble) IGRESCO(grib);
+}
+
+fortdouble RGGAUSS(gribProduct** grib) {
+ return (fortdouble) IGGAUSS(grib);
+}
+
+fortdouble RGSCANM(gribProduct** grib) {
+ return (fortdouble) IGSCANM(grib);
+}
+
+fortdouble RGJ(gribProduct** grib) {
+ return (fortdouble) IGJ(grib);
+}
+
+fortdouble RGK(gribProduct** grib) {
+ return (fortdouble) IGK(grib);
+}
+
+fortdouble RGM(gribProduct** grib) {
+ return (fortdouble) IGM(grib);
+}
+
+fortdouble RGREPMO(gribProduct** grib) {
+ return (fortdouble) IGREPMO(grib);
+}
+
+fortdouble RGTJ(gribProduct** grib) {
+ return (fortdouble) IGTJ(grib);
+}
+
+fortdouble RGTK(gribProduct** grib) {
+ return (fortdouble) IGTK(grib);
+}
+
+fortdouble RGTM(gribProduct** grib) {
+ return (fortdouble) IGTM(grib);
+}
+
+fortdouble RGBTSPV(gribProduct** grib) {
+ return (fortdouble) IGBTSPV(grib);
+}
+
+fortdouble RGUNUSD(gribProduct** grib) {
+ return (fortdouble) IGUNUSD(grib);
+}
+
+fortdouble RGNVALU(gribProduct** grib) {
+ return (fortdouble) IGNVALU(grib);
+}
+
+int binaryChopI(despatchI * list, int listLength, unsigned char * test) {
+int current, oldCurrent = -1;
+int direction, startRange = 0, endRange = listLength;
+
+ do {
+ current = (startRange + endRange)/2;
+
+ if( current == oldCurrent) break;
+
+ direction = strcmp((char*)test,(char*)(*(list+current)).name);
+
+ if( direction == 0 ) return current;
+
+ if( direction < 0 )
+ endRange = current;
+ else
+ startRange = current;
+
+ oldCurrent = current;
+ } while( startRange <= endRange );
+
+ return -1;
+}
+
+int binaryChopR(despatchR * list, int listLength, unsigned char * test) {
+int current, oldCurrent = -1;
+int direction, startRange = 0, endRange = listLength;
+
+ do {
+ current = (startRange + endRange)/2;
+
+ if( current == oldCurrent) break;
+
+ direction = strcmp((char*)test,(char*)(*(list+current)).name);
+
+ if( direction == 0 ) return current;
+
+ if( direction < 0 )
+ endRange = current;
+ else
+ startRange = current;
+
+ oldCurrent = current;
+ } while( startRange <= endRange );
+
+ return -1;
+}
+
+fortint setIntegerValue(
+ gribProduct** grib,
+ unsigned char* request,
+ fortint * value )
+{
+ return SETINT(grib,request,value,(long)strlen((char*)request));
+}
+
+fortint SETINT(
+ gribProduct** grib,
+ unsigned char* request,
+ fortint * value,
+ long requestLength )
+{
+int index;
+int listLength = sizeof(despatchInteger)/sizeof(despatchI);
+unsigned char Request[80];
+
+ copyNameLoc(Request,request,(int)sizeof(Request),(int)requestLength);
+
+ index = binaryChopI(despatchInteger,listLength,Request);
+ if( index < 0 )
+ return -999999;
+ else {
+ despatchInteger[index].set(grib,value);
+ return 0;
+ }
+}
+
+fortint setRealValue(
+ gribProduct** grib,
+ unsigned char* request,
+ fortdouble * value ) {
+
+ return SETREAL(grib,request,value,strlen((char*)request));
+}
+
+fortint SETREAL(
+ gribProduct** grib,
+ unsigned char* request,
+ fortdouble * value,
+ long requestLength ) {
+int index;
+int listLength = sizeof(despatchReal)/sizeof(despatchR);
+unsigned char Request[80];
+
+ copyNameLoc(Request,request,(int)sizeof(Request),(int)requestLength);
+
+ index = binaryChopR(despatchReal,listLength,Request);
+ if( index < 0 )
+ return -999999.0;
+ else {
+ despatchReal[index].set(grib,value);
+ return 0;
+ }
+}
diff --git a/gribex/getsetValues.h b/gribex/getsetValues.h
new file mode 100755
index 0000000..f8d797d
--- /dev/null
+++ b/gribex/getsetValues.h
@@ -0,0 +1,389 @@
+#ifndef GETVALUES_H
+#define GETVALUES_H
+
+#include "gdecode.h"
+#include "gdecode1.h"
+#include "gdecode2.h"
+
+#include "sencode.h"
+#include "sencode1.h"
+#include "sencode2.h"
+
+#ifdef FORTRAN_NO_UNDERSCORE
+#define GETINT getint
+#define GETREAL getreal
+#define SETINT setint
+#define SETREAL setreal
+#else
+#define GETINT getint_
+#define GETREAL getreal_
+#define SETINT setint_
+#define SETREAL setreal_
+#endif
+
+fortint getIntegerValue(gribProduct**,unsigned char*);
+fortdouble getRealValue(gribProduct**,unsigned char*);
+fortint GETINT(gribProduct**,unsigned char*,long);
+fortdouble GETREAL(gribProduct**,unsigned char*,long);
+
+fortint setIntegerValue(gribProduct**,unsigned char*,fortint*);
+fortint setRealValue(gribProduct**,unsigned char*,fortdouble*);
+fortint SETINT(gribProduct**,unsigned char*,fortint*,long);
+fortint SETREAL(gribProduct**,unsigned char*,fortdouble*,long);
+
+fortint IGNWLAT(gribProduct**);
+fortint IGNWLON(gribProduct**);
+fortint IGSELAT(gribProduct**);
+fortint IGSELON(gribProduct**);
+fortint IGDI(gribProduct**);
+fortint IGDJ(gribProduct**);
+fortint IGIP(gribProduct**);
+fortint IGLATRP(gribProduct**);
+fortint IGLONRP(gribProduct**);
+fortint IGROTAT(gribProduct**);
+fortint IGLATSP(gribProduct**);
+fortint IGLONSP(gribProduct**);
+fortint IGSFACT(gribProduct**);
+fortint IGREFVL(gribProduct**);
+fortint IGDSCAL(gribProduct**);
+fortint IGLEVTY(gribProduct**);
+fortint IGTUNIT(gribProduct**);
+fortint IGTRIND(gribProduct**);
+fortint IGSTEP(gribProduct**);
+fortint IGSTEP1(gribProduct**);
+fortint IGSTEP2(gribProduct**);
+fortint IGNUMAV(gribProduct**);
+fortint IGNUMMS(gribProduct**);
+fortint IGSUBID(gribProduct**);
+fortint IGUDECF(gribProduct**);
+fortint IGTYPE(gribProduct**);
+fortint IGCLASS(gribProduct**);
+fortint IGSTREM(gribProduct**);
+fortint IGEXPVR(gribProduct**);
+fortint IGDEFIN(gribProduct**);
+fortint IGDUMMY(gribProduct**);
+
+fortdouble RGLNGTH(gribProduct**);
+fortdouble RGTABLE(gribProduct**);
+fortdouble RGCENTR(gribProduct**);
+fortdouble RGPARAM(gribProduct**);
+fortdouble RGLEVEL(gribProduct**);
+fortdouble RGLEVL1(gribProduct**);
+fortdouble RGLEVL2(gribProduct**);
+fortdouble RGDATE(gribProduct**);
+fortdouble RGTIME(gribProduct**);
+fortdouble RGSTEP(gribProduct**);
+fortdouble RGSTEP1(gribProduct**);
+fortdouble RGSTEP2(gribProduct**);
+fortdouble RGCLASS(gribProduct**);
+fortdouble RGTYPE(gribProduct**);
+fortdouble RGSTREM(gribProduct**);
+fortdouble RGEXPVR(gribProduct**);
+fortdouble RGNUMPV(gribProduct**);
+fortdouble RGREPRS(gribProduct**);
+fortdouble RGNI(gribProduct**);
+fortdouble RGNJ(gribProduct**);
+fortdouble RGRESCO(gribProduct**);
+fortdouble RGGAUSS(gribProduct**);
+fortdouble RGSCANM(gribProduct**);
+fortdouble RGJ(gribProduct**);
+fortdouble RGK(gribProduct**);
+fortdouble RGM(gribProduct**);
+fortdouble RGREPMO(gribProduct**);
+fortdouble RGTJ(gribProduct**);
+fortdouble RGTK(gribProduct**);
+fortdouble RGTM(gribProduct**);
+fortdouble RGBTSPV(gribProduct**);
+fortdouble RGUNUSD(gribProduct**);
+fortdouble RGNVALU(gribProduct**);
+fortdouble RGLEVTY(gribProduct**);
+fortdouble RGTUNIT(gribProduct**);
+fortdouble RGTRIND(gribProduct**);
+fortdouble RGNUMAV(gribProduct**);
+fortdouble RGNUMMS(gribProduct**);
+fortdouble RGSUBID(gribProduct**);
+fortdouble RGUDECF(gribProduct**);
+fortdouble RGTYPE(gribProduct**);
+fortdouble RGDEFIN(gribProduct**);
+fortdouble RGDUMMY(gribProduct**);
+
+fortint ISDUMMY(gribProduct **, fortint *);
+fortint RSDUMMY(gribProduct **, fortdouble *);
+fortint RSDATE(gribProduct **, fortdouble *);
+fortint ISDATE(gribProduct **, fortint *);
+fortint RSTIME(gribProduct **, fortdouble *);
+fortint ISTIME(gribProduct **, fortint *);
+fortint RSTABLE(gribProduct **, fortdouble *);
+fortint ISTABLE(gribProduct **, fortint *);
+fortint RSCENTR(gribProduct **, fortdouble *);
+fortint ISCENTR(gribProduct **, fortint *);
+fortint RSPARAM(gribProduct **, fortdouble *);
+fortint ISPARAM(gribProduct **, fortint *);
+fortint RSLEVTY(gribProduct **, fortdouble *);
+fortint ISLEVTY(gribProduct **, fortint *);
+fortint RSLEVEL(gribProduct **, fortdouble *);
+fortint ISLEVEL(gribProduct **, fortint *);
+fortint RSLEVEL(gribProduct **, fortdouble *);
+fortint ISLEVEL(gribProduct **, fortint *);
+fortint RSTUNIT(gribProduct **, fortdouble *);
+fortint ISTUNIT(gribProduct **, fortint *);
+fortint RSTRIND(gribProduct **, fortdouble *);
+fortint ISTRIND(gribProduct **, fortint *);
+fortint RSSTEP(gribProduct **, fortdouble *);
+fortint ISSTEP(gribProduct **, fortint *);
+fortint RSSTEP1(gribProduct **, fortdouble *);
+fortint ISSTEP1(gribProduct **, fortint *);
+fortint RSSTEP2(gribProduct **, fortdouble *);
+fortint ISSTEP2(gribProduct **, fortint *);
+fortint RSNUMAV(gribProduct **, fortdouble *);
+fortint ISNUMAV(gribProduct **, fortint *);
+fortint RSNUMMS(gribProduct **, fortdouble *);
+fortint ISNUMMS(gribProduct **, fortint *);
+fortint RSSUBID(gribProduct **, fortdouble *);
+fortint ISSUBID(gribProduct **, fortint *);
+fortint RSUDECF(gribProduct **, fortdouble *);
+fortint ISUDECF(gribProduct **, fortint *);
+fortint RSTYPE(gribProduct **, fortdouble *);
+fortint ISTYPE(gribProduct **, fortint *);
+fortint RSCLASS(gribProduct **, fortdouble *);
+fortint ISCLASS(gribProduct **, fortint *);
+fortint RSSTREM(gribProduct **, fortdouble *);
+fortint ISSTREM(gribProduct **, fortint *);
+fortint RSEXPVR(gribProduct **, fortdouble *);
+fortint ISEXPVR(gribProduct **, fortint *);
+fortint RSDEFIN(gribProduct **, fortdouble *);
+fortint ISDEFIN(gribProduct **, fortint *);
+fortint RSBTSPV(gribProduct **, fortdouble *);
+fortint ISBTSPV(gribProduct **, fortint *);
+fortint RSREPRS(gribProduct **, fortdouble *);
+fortint ISREPRS(gribProduct **, fortint *);
+fortint RSNWLAT(gribProduct **, fortdouble *);
+fortint ISNWLAT(gribProduct **, fortint *);
+fortint RSNWLON(gribProduct **, fortdouble *);
+fortint ISNWLON(gribProduct **, fortint *);
+fortint RSSELAT(gribProduct **, fortdouble *);
+fortint ISSELAT(gribProduct **, fortint *);
+fortint RSSELON(gribProduct **, fortdouble *);
+fortint ISSELON(gribProduct **, fortint *);
+fortint RSDIJ(gribProduct **, fortdouble *);
+fortint ISDIJ(gribProduct **, fortint *);
+fortint RSDI(gribProduct **, fortdouble *);
+fortint ISDI(gribProduct **, fortint *);
+fortint RSDJ(gribProduct **, fortdouble *);
+fortint ISDJ(gribProduct **, fortint *);
+fortint RSNI(gribProduct **, fortdouble *);
+fortint ISNI(gribProduct **, fortint *);
+fortint RSNJ(gribProduct **, fortdouble *);
+fortint ISNJ(gribProduct **, fortint *);
+fortint RSJ(gribProduct **, fortdouble *);
+fortint ISJ(gribProduct **, fortint *);
+fortint RSK(gribProduct **, fortdouble *);
+fortint ISK(gribProduct **, fortint *);
+fortint RSM(gribProduct **, fortdouble *);
+fortint ISM(gribProduct **, fortint *);
+fortint RSJKM(gribProduct **, fortdouble *);
+fortint ISJKM(gribProduct **, fortint *);
+fortint RSTJ(gribProduct **, fortdouble *);
+fortint ISTJ(gribProduct **, fortint *);
+fortint RSTK(gribProduct **, fortdouble *);
+fortint ISTK(gribProduct **, fortint *);
+fortint RSTM(gribProduct **, fortdouble *);
+fortint ISTM(gribProduct **, fortint *);
+fortint RSTJKM(gribProduct **, fortdouble *);
+fortint ISTJKM(gribProduct **, fortint *);
+fortint RSLATRP(gribProduct **, fortdouble *);
+fortint ISLATRP(gribProduct **, fortint *);
+fortint RSLONRP(gribProduct **, fortdouble *);
+fortint ISLONRP(gribProduct **, fortint *);
+fortint RSROTAT(gribProduct **, fortdouble *);
+fortint ISROTAT(gribProduct **, fortint *);
+fortint RSLATSP(gribProduct **, fortdouble *);
+fortint ISLATSP(gribProduct **, fortint *);
+fortint RSLONSP(gribProduct **, fortdouble *);
+fortint ISLONSP(gribProduct **, fortint *);
+fortint RSSFACT(gribProduct **, fortdouble *);
+fortint ISSFACT(gribProduct **, fortint *);
+fortint RSSETQG(gribProduct **, fortdouble *);
+fortint ISSETQG(gribProduct **, fortint *);
+fortint RSSETRG(gribProduct **, fortdouble *);
+fortint ISSETRG(gribProduct **, fortint *);
+
+fortint SPV(gribProduct **, fortdouble *, fortint *);
+
+typedef fortint (*geti) (gribProduct **);
+typedef fortdouble (*getf) (gribProduct **);
+typedef fortint (*seti) (gribProduct **, fortint *);
+typedef fortint (*setf) (gribProduct **, fortdouble *);
+
+typedef struct {
+ const char * name;
+ geti get;
+ seti set;
+} despatchI;
+
+typedef struct {
+ const char * name;
+ getf get;
+ setf set;
+} despatchR;
+
+despatchI despatchInteger[] = {
+ "angleOfRotation",IGROTAT,ISROTAT,
+ "bottomLayer",IGLEVL2,ISDUMMY,
+ "codeTable",IGTABLE,ISTABLE,
+ "complexPackingScalingFactor",IGIP,ISDUMMY,
+ "dataRepresentationType",IGREPRS,ISREPRS,
+ "date",IGDATE,ISDATE,
+ "definition1Number",IG1NUMB,IS1NUMB,
+ "definition1Total",IG1TOTL,IS1TOTL,
+ "definition2ControlForecastCluster",IG2CFCL,IS2CFCL,
+ "definition2DomainEast",IG2ELON,IS2ELON,
+ "definition2DomainNorth",IG2NLAT,IS2NLAT,
+ "definition2DomainSouth",IG2SLAT,IS2SLAT,
+ "definition2DomainWest",IG2WLON,IS2WLON,
+ "definition2EndStep",IG2END,IS2END,
+ "definition2Method",IG2METH,IS2METH,
+ "definition2Number",IG2NUMB,IS2NUMB,
+ "definition2NumberInCluster",IG2NUCL,IS2NUCL,
+ "definition2OperationalForecastCluster",IG2OPCL,IS2OPCL,
+ "definition2StartStep",IG2STAR,IS2STAR,
+ "definition2Total",IG2TOTL,IS2TOTL,
+ "ecmwfClass",IGCLASS,ISCLASS,
+ "ecmwfExperimentVersionNumber",IGEXPVR,ISEXPVR,
+ "ecmwfLocalDefinitionNumber",IGDEFIN,ISDEFIN,
+ "ecmwfStream",IGSTREM,ISSTREM,
+ "ecmwfType",IGTYPE,ISTYPE,
+ "gribLength",IGLNGTH,ISDUMMY,
+ "iAndjHaveTheSameIncrement",IGDUMMY,ISDIJ,
+ "iDirectionIncrement",IGDI,ISDI,
+ "jDirectionIncrement",IGDJ,ISDJ,
+ "jPentagonalResolution",IGJ,ISJ,
+ "jkmHaveSamePentagonalResolution",IGDUMMY,ISJKM,
+ "kPentagonalResolution",IGK,ISK,
+ "latitudeOfThePoleOfStretching",IGLATSP,ISLATSP,
+ "latitudeOfTheSouthernPoleOfRotation",IGLATRP,ISLATRP,
+ "longitudeOfThePoleOfStretching",IGLONSP,ISLONSP,
+ "longitudeOfTheSouthernPoleOfRotation",IGLONRP,ISLONRP,
+ "mPentagonalResolution",IGM,ISM,
+ "northWestLatitude",IGNWLAT,ISNWLAT,
+ "northWestLongitude",IGNWLON,ISNWLON,
+ "numberOfBitsPerPackedValue",IGBTSPV,ISBTSPV,
+ "numberOfFieldValues",IGNVALU,ISDUMMY,
+ "numberOfParallelsBetweenPoleAndEquator",IGGAUSS,ISDUMMY,
+ "numberOfPointsAlongMeridian",IGNJ,ISNJ,
+ "numberOfPointsAlongParallel",IGNI,ISNI,
+ "numberOfProductsInAverage",IGNUMAV,ISNUMAV,
+ "numberOfProductsMissingFromAverage",IGNUMMS,ISNUMMS,
+ "numberOfUnusedBitsAtEndOfSection4",IGUNUSD,ISDUMMY,
+ "numberOfVerticalCoordinateParameters",IGNUMPV,ISDUMMY,
+ "originatingCentre",IGCENTR,ISCENTR,
+ "parameter",IGPARAM,ISPARAM,
+ "pressureLevel",IGLEVEL,ISLEVEL,
+ "referenceValue",IGREFVL,ISDUMMY,
+ "representationMode",IGREPMO,ISDUMMY,
+ "resolutionAndComponentsFlag",IGRESCO,ISDUMMY,
+ "scaleFactorUsedToPackFieldValues",IGDSCAL,ISDUMMY,
+ "scanningModeFlag",IGSCANM,ISDUMMY,
+ "setReducedGaussianGridNumber",IGDUMMY,ISSETQG,
+ "setRegularGaussianGridNumber",IGDUMMY,ISSETRG,
+ "southEastLatitude",IGSELAT,ISSELAT,
+ "southEastLongitude",IGSELON,ISSELON,
+ "stretchingFactor",IGSFACT,ISSFACT,
+ "subcentreIdentifier",IGSUBID,ISSUBID,
+ "subsetJKMHaveSamePentagonalResolution",IGDUMMY,ISTJKM,
+ "subsetJPentagonalResolution",IGTJ,ISTJ,
+ "subsetKPentagonalResolution",IGTK,ISTK,
+ "subsetMPentagonalResolution",IGTM,ISTM,
+ "time",IGTIME,ISTIME,
+ "timeRangeIndicator",IGTRIND,ISTRIND,
+ "timeStep",IGSTEP,ISSTEP,
+ "timeStepP1",IGSTEP1,ISSTEP1,
+ "timeStepP2",IGSTEP2,ISSTEP2,
+ "timeUnit",IGTUNIT,ISTUNIT,
+ "topLayer",IGLEVL1,ISDUMMY,
+ "typeOfLevel",IGLEVTY,ISLEVTY,
+ "unitsDecimalScaleFactor",IGUDECF,ISUDECF
+};
+
+despatchR despatchReal[] = {
+ "angleOfRotation",RGROTAT,RSROTAT,
+ "bottomLayer",RGLEVL2,RSDUMMY,
+ "codeTable",RGTABLE,RSTABLE,
+ "complexPackingScalingFactor",RGIP,RSDUMMY,
+ "dataRepresentationType",RGREPRS,RSREPRS,
+ "date",RGDATE,RSDATE,
+ "definition1Number",RG1NUMB,RS1NUMB,
+ "definition1Total",RG1TOTL,RS1TOTL,
+ "definition2ControlForecastCluster",RG2CFCL,RS2CFCL,
+ "definition2DomainEast",RG2ELON,RS2ELON,
+ "definition2DomainNorth",RG2NLAT,RS2NLAT,
+ "definition2DomainSouth",RG2SLAT,RS2SLAT,
+ "definition2DomainWest",RG2WLON,RS2WLON,
+ "definition2EndStep",RG2END,RS2END,
+ "definition2Method",RG2METH,RS2METH,
+ "definition2Number",RG2NUMB,RS2NUMB,
+ "definition2NumberInCluster",RG2NUCL,RS2NUCL,
+ "definition2OperationalForecastCluster",RG2OPCL,RS2OPCL,
+ "definition2StartStep",RG2STAR,RS2STAR,
+ "definition2Total",RG2TOTL,RS2TOTL,
+ "ecmwfClass",RGCLASS,RSCLASS,
+ "ecmwfExperimentVersionNumber",RGEXPVR,RSEXPVR,
+ "ecmwfLocalDefinitionNumber",RGDEFIN,RSDEFIN,
+ "ecmwfStream",RGSTREM,RSSTREM,
+ "ecmwfType",RGTYPE,RSTYPE,
+ "gribLength",RGLNGTH,RSDUMMY,
+ "iAndjHaveTheSameIncrement",RGDUMMY,RSDIJ,
+ "iDirectionIncrement",RGDI,RSDI,
+ "jDirectionIncrement",RGDJ,RSDJ,
+ "jPentagonalResolution",RGJ,RSJ,
+ "jkmHaveSamePentagonalResolution",RGDUMMY,RSJKM,
+ "kPentagonalResolution",RGK,RSK,
+ "latitudeOfThePoleOfStretching",RGLATSP,RSLATSP,
+ "latitudeOfTheSouthernPoleOfRotation",RGLATRP,RSLATRP,
+ "longitudeOfThePoleOfStretching",RGLONSP,RSLONSP,
+ "longitudeOfTheSouthernPoleOfRotation",RGLONRP,RSLONRP,
+ "mPentagonalResolution",RGM,RSM,
+ "northWestLatitude",RGNWLAT,RSNWLAT,
+ "northWestLongitude",RGNWLON,RSNWLON,
+ "numberOfBitsPerPackedValue",RGBTSPV,RSBTSPV,
+ "numberOfFieldValues",RGNVALU,RSDUMMY,
+ "numberOfParallelsBetweenPoleAndEquator",RGGAUSS,RSDUMMY,
+ "numberOfPointsAlongMeridian",RGNJ,RSNJ,
+ "numberOfPointsAlongParallel",RGNI,RSNI,
+ "numberOfProductsInAverage",RGNUMAV,RSNUMAV,
+ "numberOfProductsMissingFromAverage",RGNUMMS,RSNUMMS,
+ "numberOfUnusedBitsAtEndOfSection4",RGUNUSD,RSDUMMY,
+ "numberOfVerticalCoordinateParameters",RGNUMPV,RSDUMMY,
+ "originatingCentre",RGCENTR,RSCENTR,
+ "parameter",RGPARAM,RSPARAM,
+ "pressureLevel",RGLEVEL,RSLEVEL,
+ "referenceValue",RGREFVL,RSDUMMY,
+ "representationMode",RGREPMO,RSDUMMY,
+ "resolutionAndComponentsFlag",RGRESCO,RSDUMMY,
+ "scaleFactorUsedToPackFieldValues",RGDSCAL,RSDUMMY,
+ "scanningModeFlag",RGSCANM,RSDUMMY,
+ "setReducedGaussianGridNumber",RGDUMMY,RSSETQG,
+ "setRegularGaussianGridNumber",RGDUMMY,RSSETRG,
+ "southEastLatitude",RGSELAT,RSSELAT,
+ "southEastLongitude",RGSELON,RSSELON,
+ "stretchingFactor",RGSFACT,RSSFACT,
+ "subcentreIdentifier",RGSUBID,RSSUBID,
+ "subsetJKMHaveSamePentagonalResolution",RGDUMMY,RSTJKM,
+ "subsetJPentagonalResolution",RGTJ,RSTJ,
+ "subsetKPentagonalResolution",RGTK,RSTK,
+ "subsetMPentagonalResolution",RGTM,RSTM,
+ "time",RGTIME,RSTIME,
+ "timeRangeIndicator",RGTRIND,RSTRIND,
+ "timeStep",RGSTEP,RSSTEP,
+ "timeStepP1",RGSTEP1,RSSTEP1,
+ "timeStepP2",RGSTEP2,RSSTEP2,
+ "timeUnit",RGTUNIT,RSTUNIT,
+ "topLayer",RGLEVL1,RSDUMMY,
+ "typeOfLevel",RGLEVTY,RSLEVTY,
+ "unitsDecimalScaleFactor",RGUDECF,RSUDECF
+};
+
+int binaryChopI(despatchI * list, int listLength, unsigned char * test);
+int binaryChopR(despatchR * list, int listLength, unsigned char * test);
+
+#endif /* End of GETVALUES_H */
diff --git a/gribex/getsys.F b/gribex/getsys.F
new file mode 100755
index 0000000..097a982
--- /dev/null
+++ b/gribex/getsys.F
@@ -0,0 +1,170 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GETSYS (HSYS)
+ IMPLICIT LOGICAL ( L , O , G )
+ IMPLICIT CHARACTER*8 ( C , H , Y )
+ IMPLICIT INTEGER ( I , J , K , M , N )
+C
+C---->
+C* MARS common areas containing job environment information,
+C parameter settings etc.
+C
+C NFTNOS - 12 Fortran unit numbers used by MARS.
+C NFTNOS(1) is MARSLOG file. Cracked MARS directives.
+C NFTNOS(2) is MARSPAR file. MARS directives in
+C network transmission format.
+C NFTNOS(5) is unit 5 , standard input.
+C NFTNOS(6) is unit 6 , standard output.
+C NFTNOS(7) is MARSDEF or MARSDEFNEXT, language
+C definition, operational or test.
+C Set by routine JENVXX.
+C NUMREQ - Total number of requests.
+C NUMFIL - Numbers of different files to be accessed.
+C NUMFIL(1) , Total number of files to accessed.
+C NUMFIL(2) , Number of IBM disk files to accessed.
+C NUMFIL(3) , Number of IBM MSS files to be accessed.
+C NUMFIL(4) , Number of IBM tape files to be accessed.
+C NUMFIL(5) , Number of worker machine files to accessed.
+C NCNDAY - Century day.
+C Set by routine JENVXX.
+C NJMODE - Mode in which MARS job is running.
+C -1, Quit issued.
+C 0 , Checkout directives only.
+C 1 , Connected mode (normal mode retains connection
+C with IBM at all times).
+C 2 , Disconnected mode (send requests to IBM and
+C terminate).
+C Not yet implemented.
+C NJOBSQ - Unique number identifying job or process.
+C Set by routine JENVXX.
+C NUMBIT - Number of bits in computer word.
+C Set by routine JENVXX.
+C NDBUGS - Debug print switch for IBM.
+C 0 , No debug printout. .
+C 8 , Debug print on IBM.
+C Set by routine JENVXX.
+C NDBUGL - Debug level indicator for worker machine.
+C 0 , No debug print.
+C 4 , Trace through subroutine sections and
+C values of parameters on entry as well as
+C other print statements used when actually
+C debugging.
+C Set by routine JENVXX.
+C NJBCAT - Category assigned to job by MARS.
+C 0 , Archive request.
+C 1 , Manage request.
+C 2 , Checkout request.
+C 3 , Costonly request.
+C 4 , Retrieval from online Operational database on the
+C worker machine.
+C 5 , Retrieve guaranteed online (on IBM ) data.
+C 6 , Retrieve online (on IBM ) data.
+C Not yet implemented. Treated as category 7.
+C 7 , Retrieve off-line (on IBM ) data.
+C 8 , Retrieval of research department data from
+C online Research database on worker machine.
+C NPRITY - Priority assigned to job by MARS.
+C 1 , High.
+C 2 , Normal.
+C 3 , Low.
+C NIAORB - 0 , Current job is an active mode job.
+C 1 , Current job is in interactive edit mode.
+C Set by routine JENVXX.
+C
+C----<
+ INTEGER NFTNOS
+ INTEGER NCNDAY
+ INTEGER NJMODE
+ INTEGER NJOBSQ
+ INTEGER NUMBIT
+ INTEGER NDBUGS
+ INTEGER NDBUGL
+ INTEGER NJBCAT
+ INTEGER NPRITY
+ INTEGER NIAORB
+ INTEGER NFLTYP
+ INTEGER NUMFIL
+ INTEGER NUMREQ
+C
+ DIMENSION NFTNOS(12)
+ DIMENSION NUMFIL(5)
+C
+ COMMON /INTGCOM/ NFTNOS , NCNDAY , NJMODE , NJOBSQ , NUMBIT ,
+ C NDBUGS , NDBUGL , NJBCAT , NPRITY , NIAORB ,
+ C NFLTYP , NUMFIL , NUMREQ
+C
+C COPSYS - Name of computer operating system.
+C UNICOS
+C COS
+C NOS/VE
+C VMS
+C MVS/XA
+C Set by routine calling MARSXX.
+C CWMACH - Name of machine on which MARS is running.
+C CRAY
+C CYBER
+C VAX
+C IBM
+C Set by routine JENVXX.
+C CCDATE - Date at start of job in yymmdd format.
+C Set by routine JENVXX.
+C CCTIME - Time at start of job in hhmmss format.
+C Set by routine JENVXX.
+C CJNAME - Name of job or process.
+C Set by routine JENVXX.
+C CACCNT - Account under which job is running.
+C CWMARS - Connect to test or operational MARS/IBM.
+C MATS , Test version.
+C MARS , Operational version.
+C Set by routine JENVXX.
+C CWLANG - Use test or operational version of MARS language.
+C MARSDEF - Operational version.
+C MATSDEF - Test version.
+C Set by routine JENVCO for COS version.
+C CWLAPA - Use test or operational version of MARS language.
+C .../.../marsdef - Operational version.
+C .../.../matsdef - Test version.
+C Set by routine JENVUN for UNICOS version.
+C CWTMDR - Temporary file directory.
+C Set by JENVUN.
+C CWUSER - User name.
+C Set by JENVUN.
+C CUSFDB - FDB Usage indicator.
+C NEVER , Never attempt to access FDB.
+C ALWAYS, Always attempt to access FDB.
+C DEFAULT, Analyse request before deciding usage.
+C Set by JENVUN.
+C CWEDNO - GRIB Code Edition indicator.
+C OFF , use current edition.
+C ON , use edition 0.
+C
+ CHARACTER*8 COPSYS
+ CHARACTER*8 CWMACH
+ CHARACTER*3 CWUSER
+ CHARACTER*6 CCDATE
+ CHARACTER*6 CCTIME
+ CHARACTER*4 CWMARS
+ CHARACTER*7 CWLANG
+ CHARACTER*7 CUSFDB
+ CHARACTER*48 CWLAPA
+ CHARACTER*48 CWTMDR
+ CHARACTER*16 CJNAME
+ CHARACTER*16 CACCNT
+ CHARACTER*3 CWEDNO
+C
+ COMMON /CHARCOM/ COPSYS , CWMACH , CCDATE , CCTIME , CJNAME ,
+ C CACCNT , CWMARS , CWLANG , CWLAPA , CWTMDR ,
+ C CWUSER , CUSFDB , CWEDNO
+C
+ CHARACTER*6 HSYS
+ HSYS = COPSYS
+ RETURN
+ END
diff --git a/gribex/getusr.F b/gribex/getusr.F
new file mode 100755
index 0000000..a7cd020
--- /dev/null
+++ b/gribex/getusr.F
@@ -0,0 +1,170 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GETUSR (HNAM)
+ IMPLICIT LOGICAL ( L , O , G )
+ IMPLICIT CHARACTER*8 ( C , H , Y )
+ IMPLICIT INTEGER ( I , J , K , M , N )
+C---->
+C
+C* MARS common areas containing job environment information,
+C parameter settings etc.
+C
+C NFTNOS - 12 Fortran unit numbers used by MARS.
+C NFTNOS(1) is MARSLOG file. Cracked MARS directives.
+C NFTNOS(2) is MARSPAR file. MARS directives in
+C network transmission format.
+C NFTNOS(5) is unit 5 , standard input.
+C NFTNOS(6) is unit 6 , standard output.
+C NFTNOS(7) is MARSDEF or MARSDEFNEXT, language
+C definition, operational or test.
+C Set by routine JENVXX.
+C NUMREQ - Total number of requests.
+C NUMFIL - Numbers of different files to be accessed.
+C NUMFIL(1) , Total number of files to accessed.
+C NUMFIL(2) , Number of IBM disk files to accessed.
+C NUMFIL(3) , Number of IBM MSS files to be accessed.
+C NUMFIL(4) , Number of IBM tape files to be accessed.
+C NUMFIL(5) , Number of worker machine files to accessed.
+C NCNDAY - Century day.
+C Set by routine JENVXX.
+C NJMODE - Mode in which MARS job is running.
+C -1, Quit issued.
+C 0 , Checkout directives only.
+C 1 , Connected mode (normal mode retains connection
+C with IBM at all times).
+C 2 , Disconnected mode (send requests to IBM and
+C terminate).
+C Not yet implemented.
+C NJOBSQ - Unique number identifying job or process.
+C Set by routine JENVXX.
+C NUMBIT - Number of bits in computer word.
+C Set by routine JENVXX.
+C NDBUGS - Debug print switch for IBM.
+C 0 , No debug printout. .
+C 8 , Debug print on IBM.
+C Set by routine JENVXX.
+C NDBUGL - Debug level indicator for worker machine.
+C 0 , No debug print.
+C 4 , Trace through subroutine sections and
+C values of parameters on entry as well as
+C other print statements used when actually
+C debugging.
+C Set by routine JENVXX.
+C NJBCAT - Category assigned to job by MARS.
+C 0 , Archive request.
+C 1 , Manage request.
+C 2 , Checkout request.
+C 3 , Costonly request.
+C 4 , Retrieval from online Operational database on the
+C worker machine.
+C 5 , Retrieve guaranteed online (on IBM ) data.
+C 6 , Retrieve online (on IBM ) data.
+C Not yet implemented. Treated as category 7.
+C 7 , Retrieve off-line (on IBM ) data.
+C 8 , Retrieval of research department data from
+C online Research database on worker machine.
+C NPRITY - Priority assigned to job by MARS.
+C 1 , High.
+C 2 , Normal.
+C 3 , Low.
+C NIAORB - 0 , Current job is an active mode job.
+C 1 , Current job is in interactive edit mode.
+C Set by routine JENVXX.
+C
+C---->
+ INTEGER NFTNOS
+ INTEGER NCNDAY
+ INTEGER NJMODE
+ INTEGER NJOBSQ
+ INTEGER NUMBIT
+ INTEGER NDBUGS
+ INTEGER NDBUGL
+ INTEGER NJBCAT
+ INTEGER NPRITY
+ INTEGER NIAORB
+ INTEGER NFLTYP
+ INTEGER NUMFIL
+ INTEGER NUMREQ
+C
+ DIMENSION NFTNOS(12)
+ DIMENSION NUMFIL(5)
+C
+ COMMON /INTGCOM/ NFTNOS , NCNDAY , NJMODE , NJOBSQ , NUMBIT ,
+ C NDBUGS , NDBUGL , NJBCAT , NPRITY , NIAORB ,
+ C NFLTYP , NUMFIL , NUMREQ
+C
+C COPSYS - Name of computer operating system.
+C UNICOS
+C COS
+C NOS/VE
+C VMS
+C MVS/XA
+C Set by routine calling MARSXX.
+C CWMACH - Name of machine on which MARS is running.
+C CRAY
+C CYBER
+C VAX
+C IBM
+C Set by routine JENVXX.
+C CCDATE - Date at start of job in yymmdd format.
+C Set by routine JENVXX.
+C CCTIME - Time at start of job in hhmmss format.
+C Set by routine JENVXX.
+C CJNAME - Name of job or process.
+C Set by routine JENVXX.
+C CACCNT - Account under which job is running.
+C CWMARS - Connect to test or operational MARS/IBM.
+C MATS , Test version.
+C MARS , Operational version.
+C Set by routine JENVXX.
+C CWLANG - Use test or operational version of MARS language.
+C MARSDEF - Operational version.
+C MATSDEF - Test version.
+C Set by routine JENVCO for COS version.
+C CWLAPA - Use test or operational version of MARS language.
+C .../.../marsdef - Operational version.
+C .../.../matsdef - Test version.
+C Set by routine JENVUN for UNICOS version.
+C CWTMDR - Temporary file directory.
+C Set by JENVUN.
+C CWUSER - User name.
+C Set by JENVUN.
+C CUSFDB - FDB Usage indicator.
+C NEVER , Never attempt to access FDB.
+C ALWAYS, Always attempt to access FDB.
+C DEFAULT, Analyse request before deciding usage.
+C Set by JENVUN.
+C CWEDNO - GRIB Code Edition indicator.
+C OFF , use current edition.
+C ON , use edition 0.
+C
+ CHARACTER*8 COPSYS
+ CHARACTER*8 CWMACH
+ CHARACTER*3 CWUSER
+ CHARACTER*6 CCDATE
+ CHARACTER*6 CCTIME
+ CHARACTER*4 CWMARS
+ CHARACTER*7 CWLANG
+ CHARACTER*7 CUSFDB
+ CHARACTER*48 CWLAPA
+ CHARACTER*48 CWTMDR
+ CHARACTER*16 CJNAME
+ CHARACTER*16 CACCNT
+ CHARACTER*3 CWEDNO
+C
+ COMMON /CHARCOM/ COPSYS , CWMACH , CCDATE , CCTIME , CJNAME ,
+ C CACCNT , CWMARS , CWLANG , CWLAPA , CWTMDR ,
+ C CWUSER , CUSFDB , CWEDNO
+C
+ CHARACTER*3 HNAM
+ HNAM = CWUSER
+ RETURN
+ END
diff --git a/gribex/grbcom.h b/gribex/grbcom.h
new file mode 100755
index 0000000..e25641e
--- /dev/null
+++ b/gribex/grbcom.h
@@ -0,0 +1,38 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C Common blocks holding default or user supplied values.
+C
+C
+C REALs
+C
+#ifdef REAL_8
+ REAL*8 FREF, FMAX
+#else
+ REAL*4 FREF, FMAX
+#endif
+ COMMON /GRBCOMR/
+ X FREF, FMAX
+C
+C INTEGERs
+C
+ INTEGER NFREF, NFMAX, NRND, NDBG, NVCK, NONOFF, NOABORT
+ INTEGER NUM2OK, NSUBCE, NEMOSLB, NEMOSET, N13FLAG,DUMPDATA
+ COMMON /GRBCOMI/
+ X NFREF, NFMAX, NRND, NDBG, NVCK, NONOFF, NOABORT, NUM2OK
+ X ,NSUBCE, NEMOSLB, NEMOSET, N13FLAG,DUMPDATA
+C
+ INTEGER NEXT2O, NLOC2O
+ COMMON /GRBCXT/ NEXT2O, NLOC2O
+C
+C CHARACTERs
+C
+ CHARACTER*256 ELTPATH, ELBPATH,DUMPPATH
+ COMMON /GRBELTP/ ELTPATH, ELBPATH,DUMPPATH
diff --git a/gribex/grchk1.F b/gribex/grchk1.F
new file mode 100755
index 0000000..8501ba4
--- /dev/null
+++ b/gribex/grchk1.F
@@ -0,0 +1,950 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRCHK1(KSEC1,KRET)
+C
+C---->
+C**** GRCHK1 - Check parameters for Section 1 of GRIB code.
+C
+C Purpose.
+C --------
+C
+C Check parameters for Section 1 of GRIB code against
+C valid values for GRIB Code Edition 1.
+C
+C** Interface.
+C ----------
+C
+C CALL GRCHK1(KSEC1,KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KSEC1 - Array containing parameters for section
+C 1 of GRIB code.
+C
+C Output Parameters.
+C ------------------
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Error in GRIB code parameter.
+C
+C Method.
+C -------
+C
+C Values checked against current code/flag tables
+C and against maximum or minimum permitted values.
+C They are also checked against the current status
+C of the implementation of GRIBEX and ECMWF usage.
+C
+C Externals.
+C ----------
+C
+C KWCHK1 - Check Washington ensemble products local usage.
+C CHKTAB2 - Checks whether parameter appears in know code tables 2
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes for GRIB code.
+C
+C Comments.
+C ---------
+C
+C None.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 30.08.91
+C Checks for bit-map present removed.
+C Check for negative value for century removed.
+C
+C J. Hennessy ECMWF 02.12.91
+C Changes to Table 2 and Parameter number checks.
+C
+C J. Hennessy ECMWF 22.07.92
+C Missing data value (255) allowed for originating centre
+C and parameter number.
+C Additional checks for experimental space view
+C perspective added.
+C
+C J. Hennessy ECMWF 09.11.92
+C Checks for ECMWF local use 1 and 2 added.
+C
+C J. Hennessy ECMWF 24.05.93
+C Checks for ECMWF local use 3 and 4 added.
+C
+C J. Hennessy ECMWF 08.06.93
+C Meteosat 3 and Goes 6 added.
+C
+C J.D.Chambers ECMWF 20.10.93
+C Checks for ECMWF local use 5 added.
+C
+C J.D.Chambers ECMWF 07.02.94
+C Add satellite streams 52,53 and satellite ids 121, 122
+C
+C J.D.Chambers ECMWF 10.05.94
+C Fix test of KSEC1(43) - total forecast number can be 0
+C
+C J.D.Chambers ECMWF 12.05.94
+C Checks for ECMWF local use 7 added.
+C
+C J.D.Chambers ECMWF 09.06.94
+C Allow missing data indicator(255) for date/time/...
+C
+C J.D.Chambers ECMWF 17.06.94
+C Add CLASS = 3 for ERA.
+C
+C J.D.Chambers ECMWF 19.09.94
+C Allow single field in an average.
+C Remove restriction that number of fields missing from an
+C average should be less than the number in the average.
+C
+C J.D.Chambers ECMWF 23.11.94
+C Only check for reserved fields if ECMWF local usage 1.
+C
+C J.D.Chambers ECMWF 02.02.95
+C Allow types 17 and 18 (ensemble mean/standard deviations).
+C
+C J.D.Chambers ECMWF 14.02.95
+C Allow type 52 (sensitivity forecast)
+C
+C J.D.Chambers ECMWF 28.03.95
+C Allow parameters 127 & 128 in code table 2, ECMWF table 128
+C
+C J.D.Chambers ECMWF 09.10.95
+C Check Washington ensemble products local usage.
+C
+C J.D.Chambers ECMWF 27.02.96
+C Allow for ECMWF local use definition 6.
+C
+C J.D.Chambers ECMWF 04.11.96
+C Add CLASS = 4, TYPE = 21, STREAM = 2231/2232/2233 for ECSN.
+C
+C J.D.Chambers ECMWF 08.01.98
+C Add TYPE = 22 (climate simulation, 360 day year) for ECSN.
+C
+C J.D.Chambers ECMWF 13.02.98
+C Add EPS tubes and SSTs.
+C
+C J.D.Chambers ECMWF April 1998
+C Add wave 2D spectra directions and frequencies
+C
+C J.D.Chambers ECMWF April 1998
+C Update WMO valid table entries.
+C
+C J. Clochard, Meteo France, for ECMWF - June 1999.
+C Adapt CHKTAB2 to new calling syntax.
+C
+C J.D.Chambers ECMWF April 2000
+C Add CLASS = 6 for DEMETER.
+C Add CLASS = 7 for PROVOST.
+C
+C J.D.Chambers ECMWF October 2002
+C Add TYPE = 27 for extreme forecast index
+C TYPE = 28 for extreme forecast index control
+C
+C J.D.Chambers ECMWF March 2003
+C Add TYPE = 33 for 4D variational increments
+C
+C J.D.Chambers ECMWF April 2003
+C Add CLASS = 8 for ELDAS
+C Add TYPE = 34 for gridded observations
+C Add TYPE = 90-99 for Mars development
+C Add STREAM = 1061-1069 for Mars development
+C Add STREAM = 1100 and 1101 for ELDAS
+C
+C J.D.Chambers ECMWF April 2003
+C Add type 64 - signal variance
+C
+C J.D.Chambers ECMWF February 2004
+C Add monthly forecast streams, 1200 - 1211
+C
+C J.D.Chambers ECMWF February 2004
+C Add monthly forecast streams, 1220 - 1224
+C
+C J.D.Chambers ECMWF March 2004
+C Add Delayed CutOff streams, 1028 and 1029
+C
+C J.D.Chambers ECMWF September 2004
+C Add local definition 24
+C
+C J.D.Chambers ECMWF November 2004
+C Add local definition 25
+C
+C J.D.Chambers ECMWF January 2005
+C Add streams 1039 and 1084
+C
+C S.Curic ECMWF March 2005
+C Add STREAM = 1024 Daily archive hindcast
+C STREAM = 1034 Ensemble forecast overlap
+C STREAM = 1039 Ensemble forecast hindcasts (changed name)
+C STREAM = 1084 Ensemble wave hindcast (changed name)
+C STREAM = 1085 Wave hindcast
+C STREAM = 1086 Wave ensemble forecast overlap
+C STREAM = 1087
+C Add TYPE = 29 Probability Boundaries
+C TYPE = 36 Probability Distribution
+C TYPE = 37 Cluster information
+C Add CLASS = 10 Cosmo leps
+C CLASS = 11 Ensembles
+C
+C S.Curic ECMWF March 2005
+C Add type of level 211 Ocean wave data (ECMWF extention)
+C 212 Wave spectra
+C
+C S.Curic ECMWF July 2005
+C Add STREAM = 1075 Monthly means of Daily forecast accumulations
+C Add Time range indicator = 120 Average of N Forecast. Each product
+C is an accumulation from forecast lenght P1 to forecast
+C lenght P2, with reference times at intervals P2-P1
+C S.Curic ECMWF September 2005
+C 211 level type has been replaced with 209 because 211 is
+C in use by NCEP
+C Add CLASS = 12 TIGGE
+C
+C S.Curic ECMWF January 2006
+C Add CLASS = 14 ERA Interim
+C
+C M.Fuentes ECMWF February 2006
+C Add TYPE = 65 CV (Cal/Val)
+C
+C S.Curic ECMWF March 2006
+C Add STREAM = 1030 Ensemble Data Assimilation
+C STREAM = 1076 Monthly Means Daily climatology
+C STREAM = 1088 Ensemble Wave Data Assimilation
+C STREAM = 1089 Daily climatology wave
+C
+C S.Curic ECMWF April 2006
+C Add STREAM = 1230 Multi-model Multi-annual Forecast
+C STREAM = 1231 Multi-model Multi-annual Forecast means
+C STREAM = 1232 Multi-model Multi-annual Forecast wave
+C STREAM = 1233 Multi-model Multi-annual Forecast wave means
+C
+C S.Curic ECMWF January 2007
+C Add Satellite identifiers 56, 171
+C
+C S.Curic ECMWF February 2007
+C STREAM = 1032 efho Ensemble Forecast Hindcast Overlap
+C STREAM = 1033 enfh Ensemble Forecast Hindcasts
+C STREAM = 1078 ewho Ensemble Forecast Wave Hindcast Overlap
+C STREAM = 1079 enwh Ensemble Forecast Wave Hindcasts
+C
+C S.Curic ECMWF February 2007
+C Add CLASS = 15 SREPS Short-Range Ensemble Prediction System
+C
+C S.Curic ECMWF July 2007
+C Add TYPE = 38 Unassigned
+C TYPE = 39 Unassigned
+C
+C M.Fuentes ECMWF July 2007
+C Add STREAM = 1040 efhm Ensemble Forecast Hindcast Means
+C
+C S.Curic ECMWF July 2007
+C Add CLASS = 16 dt (Data Targeting System)
+C
+C S.Curic ECMWF July 2008
+C Add TYPE = 32 Climate Distribution (CD)
+C TYPE = 38 Shift Of Tails (SOT)
+C Add STREAM = 1077 Wave Ensemble forecast Hindcast Stat (WEHS)
+C
+C S.Curic ECMWF September 2008
+C Add STREAM = 1240 Eurosip
+C Add STREAM = 1241 EUROSIP Hindcast Monthly Means
+C
+C S.Curic ECMWF January 2010
+C Add CLASS = 19 MACC Monitoring Atmos. Composition and Climate
+C
+C S.Curic ECMWF January 2010
+C Add CLASS = 20 PE Permanent experiments
+C
+C
+C S.Curic ECMWF September 2010
+C Add TYPE = 45 Cluster representative CR
+C
+C S.Curic ECMWF November 2010
+C Add satellite streams 172,257
+C
+C
+C S.Curic ECMWF December 2010
+C Add stream 1022 fsob forecast sensitivity to observations
+C Add stream 1023 fsow forecast sensitivity to observations wave
+C Add type 47 taem time average ensemble mean
+C Add type 48 taes time average ensemble standard deviation
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0 . Definition of variables. Data statements.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Subroutine arguments
+C
+ INTEGER KRET, KSEC1
+ DIMENSION KSEC1(*)
+C
+C Parameters
+C
+ INTEGER JPAVAC, JPTYP, JPSTR, JP1, JP3, JP4, JP5, JPIDSAT
+ PARAMETER (JPAVAC=9)
+ PARAMETER (JP1=4)
+ PARAMETER (JP3=40)
+ PARAMETER (JP4=12)
+ PARAMETER (JP5=17)
+ PARAMETER (JPTYP=71)
+ PARAMETER (JPSTR=126)
+ PARAMETER (JPIDSAT = 28)
+C
+C Local variables
+C
+ LOGICAL LECMWF, LKWBC
+C
+ INTEGER LOOP, NRET, IDSATEL, NUMBER
+ INTEGER IAC, IAVAC, IRET, ISTRE, ITAB1
+ INTEGER ITAB3, ITAB4, ITAB5, ITEMP, ITYPE
+C
+ DIMENSION IDSATEL(JPIDSAT)
+ DIMENSION ITAB1(JP1)
+ DIMENSION ITAB3(JP3)
+ DIMENSION ITAB4(JP4)
+ DIMENSION ITAB5(JP5)
+ DIMENSION IAVAC(JPAVAC)
+ DIMENSION ITYPE(JPTYP)
+ DIMENSION ISTRE(JPSTR)
+C
+ CHARACTER*121 HFIRST, HSECOND, HTHIRD, HFOURTH
+C
+ SAVE ITAB1, ITAB3, ITAB4, ITAB5, IAVAC
+ SAVE ITYPE, ISTRE, IDSATEL
+C
+C Externals
+C
+ INTEGER CHKTAB2
+ EXTERNAL CHKTAB2
+C
+C Valid values given in Code Table 1.
+C
+ DATA ITAB1 /0,128,64,192/
+C
+C Valid values given in Code Table 3.
+C
+ DATA ITAB3 /1,2,3,4,5,6,7,8,9,20,
+ X 100,101,102,103,104,105,106,107,108,109,
+ X 110,111,112,113,114,115,116,117,119,
+ X 120,121,125,128,141,160,200,201,209,210,212/
+C
+C Valid values given in Code Table 4.
+C
+ DATA ITAB4 /0,1,2,3,4,5,6,7,10,11,12,
+ X 254/
+C
+C Valid values given in Code Table 5.
+C
+ DATA ITAB5 /0,1,2,3,4,5,
+ X 10,
+ X 113,114,115,116,117,118,119,
+ X 120,123,124/
+C
+C Valid values given in Code Table 5, for averages and
+C accumulations.
+C
+ DATA IAVAC /113,114,115,116,117,118,119,
+ X 123,124/
+C
+C Valid values for type.
+C
+
+ DATA ITYPE / 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ X 10,11,12,13,14,15,16,17,18,19,
+ X 20,21,22,23,24,25,26,27,28,29,
+ X 30,31,32,33,34,35,36,37,38,39,
+ X 40,41,42,45,47,48,
+ X 50,51,52,
+ X 60,61,62,63,64,65,
+ X 70,71,72,
+ X 80,81,82,83,
+ X 90,91,92,93,94,95,96,97,98,99/
+C
+C Valid values for stream.
+C
+ DATA ISTRE /
+ X 50, 51, 52, 53, 54, 55,
+ X 119, 120, 121, 122, 130, 140,
+ X 150, 151, 152, 201, 250, 251, 252, 253, 254, 255, 256,
+ X 1022,1023,
+ X 1024,1025,1026,1027,1028,1029,1030,1032,1033,
+ X 1034,1035,1036,1037,1038,1039,
+ X 1040,1041,1042,1043,1044,1045,1046,1047,
+ X 1050,1051,1052,1053,1054,1055,1056,
+ X 1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,
+ X 1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,
+ X 1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,
+ X 1090,1091,1092,1093,1094,1095,1096,1097,
+ X 1100,1101,1110,
+ X 1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,
+ X 1210,1211,
+ X 1220,1221,1222,1223,1224,
+ X 1230,1231,1232,1233,
+ X 1240,1241,
+ X 2231,2232,2233,
+ X 2240,2241,2242,2243/
+C
+C
+C Valid values for satellite identifiers
+C
+ DATA IDSATEL/
+ X 50, 51, 52, 53, 54, 55, 56,119, 120, 121, 122, 130, 140,
+ X 150, 151, 152, 171, 172, 199, 201, 250, 251, 252, 253,
+ X 254, 255, 256, 257/
+C
+C -----------------------------------------------------------------|
+C* Section 1 . Set initial values.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+C Reset return code.
+ KRET = 0
+C
+C -----------------------------------------------------------------|
+C* Section 2 . Check values against code tables and extreme values.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C* Check Parameter Table version number.
+C
+ IF( (KSEC1(1).LT.1).OR.(KSEC1(1).GT.254) ) THEN
+ WRITE(GRPRSM,9001) KSEC1(1)
+ KRET = 1
+ ENDIF
+C
+C* Check Identification of centre. Code Table 0.
+C Currently only values 1 to 98 inclusive are used.
+C Missing value indicator (255) is allowed.
+C
+ IF( (KSEC1(2).LT.0).OR.(KSEC1(2).GT.255) ) THEN
+ WRITE(GRPRSM,9002) KSEC1(2)
+ KRET = 1
+ ENDIF
+C
+ LECMWF = ( KSEC1(2).EQ.98 ).OR.
+ X ( (KSEC1(2).EQ.80).AND.
+ X (KSEC1(24).EQ.1).AND.
+ X (KSEC1(37).EQ.50) )
+ LKWBC = ( (KSEC1(2).EQ.7) .AND. (KSEC1(22).NE.98) )
+C
+C* Check Generating process identification number.
+C
+ IF( (KSEC1(3).LT.1).OR.(KSEC1(3).GT.255) ) THEN
+ WRITE(GRPRSM,9003) KSEC1(3)
+ KRET = 1
+ ENDIF
+C
+C* Check Grid definition.
+C
+ IF( (KSEC1(4).LT.1).OR.(KSEC1(4).GT.255) ) THEN
+ WRITE(GRPRSM,9004) KSEC1(4)
+ KRET = 1
+ ENDIF
+C
+C* Check Flag. Code Table 1.
+C
+ DO LOOP = 1, JP1
+ IF( KSEC1(5).EQ.ITAB1(LOOP) ) GOTO 215
+ ENDDO
+C
+ WRITE(GRPRSM,9005) KSEC1(5)
+ KRET = 1
+C
+ 215 CONTINUE
+C
+C* Cross check that, if uncatalogued grid is specified, Section
+C 2, Grid description section, is included.
+C
+ IF( (KSEC1(4).EQ.255).AND.
+ X ( (KSEC1(5).EQ.0).OR.(KSEC1(5).EQ.64) ) ) THEN
+ KRET = 1
+ WRITE(GRPRSM,9014)
+ ENDIF
+C
+C* Check Parameter indicator. Code Table 2.
+C
+ IF( (KSEC1(6).LT.1).OR.(KSEC1(6).GT.255) ) THEN
+ WRITE(GRPRSM,9006) KSEC1(6)
+ KRET = 1
+ ENDIF
+C
+C* Check ECMWF Parameter Table Number and Parameter Indicators.
+C
+ IF( LECMWF ) THEN
+C
+ IRET = CHKTAB2(KSEC1,HFIRST,HSECOND,HTHIRD,HFOURTH)
+C
+ IF( IRET.EQ.20001 ) THEN
+C
+ IF( MIN( KSEC1(1),KSEC1(6)) .LE. 127 ) THEN
+ WRITE(GRPRSM,*)
+ X 'GRCHK1: WMO code table 2 version ', KSEC1(1)
+ ELSEIF (LECMWF) THEN
+ WRITE(GRPRSM,*)
+ X 'GRCHK1: ECMWF local table 2 version ', KSEC1(1)
+ ELSE
+ WRITE(GRPRSM,*)
+ X 'GRCHK1: originating centre local table 2 version ', KSEC1(1)
+ ENDIF
+C
+ WRITE(GRPRSM,*)
+ X ' does not contain parameter ', KSEC1(6)
+C
+ ENDIF
+C
+ ENDIF
+C
+C* Check International Table useage.
+C
+ IF( (KSEC1(1).LT.127).AND.(KSEC1(6).GT.127) ) THEN
+ WRITE(GRPRSM,9024) KSEC1(6) , KSEC1(1)
+ ENDIF
+C
+C* Check Indicator of type of level. Code Table 3.
+C Experimental space view uses this field as satellite
+C identification.
+C
+ IF( (KSEC1(6).EQ.127).AND.(KSEC1(1).EQ.1) ) THEN
+C
+C Satellite identification.
+C
+ NRET = 1
+ DO LOOP = 1, JPIDSAT
+ IF( KSEC1(7).EQ.IDSATEL(LOOP) ) NRET = 0
+ ENDDO
+C
+ IF( NRET.EQ.1 ) THEN
+ WRITE(GRPRSM,*)
+ X 'GRCHK1: Invalid satellite identifier: ',KSEC1(7)
+ KRET = 1
+ ENDIF
+
+ ELSE
+C
+ IRET = 0
+C
+C Type of level.
+C
+ DO LOOP = 1, JP3
+ IF( KSEC1(7).EQ.ITAB3(LOOP) ) GOTO 225
+ ENDDO
+C
+ IRET = 1
+C
+ 225 CONTINUE
+C
+C ECMWF uses 200 for pseudo-levels.
+C
+ IF( (KSEC1(7).EQ.200).AND.LECMWF ) IRET = 0
+ IF( IRET.EQ.1 ) THEN
+ WRITE(GRPRSM,9015) KSEC1(7)
+ KRET = 1
+ ENDIF
+C
+
+C
+ ENDIF
+C
+C For certain level types no description is necessary and
+C those fields should be 0.
+C
+ IF( (KSEC1(7).LT.8).OR.(KSEC1(7).EQ.102) ) THEN
+ ITEMP = KSEC1(8) + KSEC1(9)
+ IF( ITEMP.NE.0 ) THEN
+ KRET = 1
+ WRITE(GRPRSM,9023) KSEC1(7) , KSEC1(8) , KSEC1(9)
+ ENDIF
+ ENDIF
+C
+C* Check Year of century.
+C
+C
+ IF( (KSEC1(10).LT.0).OR.(KSEC1(10).GT.100) ) THEN
+ IF( KSEC1(10).NE.255 ) THEN
+ WRITE(GRPRSM,9008) KSEC1(10)
+ KRET = 1
+ ENDIF
+ ENDIF
+C
+C* Month check.
+C
+ IF( (KSEC1(11).LT.1).OR.(KSEC1(11).GT.12) ) THEN
+ IF( KSEC1(10).NE.255 ) THEN
+ WRITE(GRPRSM,9009) KSEC1(11)
+ KRET = 1
+ ENDIF
+ ENDIF
+C
+C* Day check.
+C
+ IF( (KSEC1(12).LT.1).OR.(KSEC1(12).GT.31) ) THEN
+ IF( KSEC1(10).NE.255 ) THEN
+ WRITE(GRPRSM,9010) KSEC1(12)
+ KRET = 1
+ ENDIF
+ ENDIF
+C
+C* Hour check.
+C
+ IF( (KSEC1(13).LT.0).OR.(KSEC1(13).GT.23) ) THEN
+ IF( KSEC1(10).NE.255 ) THEN
+ WRITE(GRPRSM,9011) KSEC1(13)
+ KRET = 1
+ ENDIF
+ ENDIF
+C
+C* Minute check.
+C
+ IF( (KSEC1(14).LT.0).OR.(KSEC1(14).GT.59) ) THEN
+ IF( KSEC1(10).NE.255 ) THEN
+ WRITE(GRPRSM,9012) KSEC1(14)
+ KRET = 1
+ ENDIF
+ ENDIF
+C
+C* Indicator of unit of time check. Code Table 4.
+C
+ DO LOOP = 1, JP4
+ IF( KSEC1(15).EQ.ITAB4(LOOP) ) GOTO 245
+ ENDDO
+C
+ WRITE(GRPRSM,9013) KSEC1(15)
+ KRET = 1
+C
+ 245 CONTINUE
+C
+C* Time range indicator check. Code Table 5.
+C
+ DO LOOP = 1, JP5
+ IF( KSEC1(18).EQ.ITAB5(LOOP) ) GOTO 255
+ ENDDO
+C
+ WRITE(GRPRSM,9019) KSEC1(18)
+ KRET = 1
+C
+ 255 CONTINUE
+C
+C* Cross check Time range indicator and Number averaged or
+C accumulated.
+C
+ IAC = 0
+ DO LOOP = 1, JPAVAC
+ IF( KSEC1(18).EQ.IAVAC(LOOP) ) IAC = 1
+ ENDDO
+C
+C If average or accumulation, check for valid numbers
+C of included and missing values.
+C
+ IF( IAC.EQ.1. ) THEN
+ IF( KSEC1(19).LT.1 ) THEN
+ WRITE(GRPRSM,9016) KSEC1(18) , KSEC1(19)
+Cjdc KRET = 1
+ ENDIF
+ IF( KSEC1(20).LT.0 ) THEN
+ WRITE(GRPRSM,9020) KSEC1(18) , KSEC1(20)
+Cjdc KRET = 1
+ ENDIF
+ ENDIF
+C
+C* Century check.
+C
+C ECMWF data starts in 20th century.
+C commented to allow work Simona
+C
+cs IF( (KSEC1(21).LT.20).AND.LECMWF ) THEN
+cs WRITE(GRPRSM,9021) KSEC1(21)
+cs KRET = 1
+cs ENDIF
+C
+C* Decimal scale factor check.
+C
+C At ECMWF the scale factor is always 0.
+C
+Cjdc IF( (KSEC1(23).NE.0).AND.LECMWF ) THEN
+Cjdc WRITE(GRPRSM,9022) KSEC1(23)
+Cjdc KRET = 1
+Cjdc ENDIF
+C
+C* Flag field, indicating local ECMWF usage.
+C
+ IF( (KSEC1(24).NE.0).AND.(KSEC1(24).NE.1) ) THEN
+ WRITE(GRPRSM,9025)
+ KRET = 1
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3 . Check validity of values for ECMWF local use.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( (KSEC1(24).EQ.1).AND.LECMWF ) THEN
+C
+C* Check reserved fields are zero.
+C
+ DO LOOP = 25, 36
+ IF( KSEC1(LOOP).NE.0 ) WRITE(GRPRSM,9026)
+ ENDDO
+C
+C Check local definition number.
+C
+ IF( (KSEC1(37).LT.1).OR.(KSEC1(37).GT.254) ) THEN
+ KRET = 1
+ WRITE(GRPRSM,9101) KSEC1(37)
+ ENDIF
+C
+C Check Class.
+C 1 = operations
+C 2 = research
+C 3 = ECMWF re-analysis
+C 4 = European Climate Support Network (ECSN).
+C 5 = ERA 40 (ECMWF 40-year re-analysis)
+C 6 = DEMETER
+C 7 = PROVOST
+C 8 = ELDAS
+C 9 = TOST
+C 10 = COSMO
+C 11 = Ensembles
+C 12 = TIGGE
+C 14 = ERA Interim
+C 15 = SREPS
+C 16 = dt (Data Targeting System)
+C 17 = la LACE ALADIN
+C 18 = yt YOTC
+C 19 = MACC
+C 99 = ECMWF testing
+C
+C 1-120 = Member State
+C 121 = Generic Member State
+C
+ IF( (KSEC1(38).LT.1).OR.
+ X ((KSEC1(38).GT.20).AND.
+ X (KSEC1(38).LT.99).OR.(KSEC1(38).GT.121)) ) THEN
+ KRET = 1
+ WRITE(GRPRSM,9102) KSEC1(38)
+ ENDIF
+C
+C Check Type.
+C
+ DO LOOP = 1, JPTYP
+ IF( KSEC1(39).EQ.ITYPE(LOOP) ) GOTO 325
+ ENDDO
+C
+ WRITE(GRPRSM,9103 ) KSEC1(39)
+ KRET = 1
+C
+ 325 CONTINUE
+C
+C Check Stream.
+C
+ DO LOOP = 1, JPSTR
+ IF( KSEC1(40).EQ.ISTRE(LOOP) ) GOTO 335
+ ENDDO
+C
+ WRITE(GRPRSM,9104) KSEC1(40)
+ KRET = 1
+C
+ 335 CONTINUE
+C
+C No check on the ASCII Version Number.
+C
+C
+C Check ECMWF local definition 1.
+C (MARS labelling or ensemble forecast data)
+C
+ IF( KSEC1(37).EQ.1 ) THEN
+C
+C Check ensemble forecast number and total forecasts number.
+C (ECMWF ensemble seasonal forecasts, stream 1090, uses
+C 2-byte ensemble forecast number)
+C
+ IF( KSEC1(40).NE.1090 ) THEN
+C
+ IF( (KSEC1(42).LT.0).OR.(KSEC1(42).GT.255) ) THEN
+ KRET = 1
+ WRITE(GRPRSM,9105) KSEC1(42)
+ ENDIF
+C
+ IF( (KSEC1(43).LT.0).OR.(KSEC1(43).GT.255) ) THEN
+ KRET = 1
+ WRITE(GRPRSM,9106) KSEC1(43)
+ ENDIF
+C
+ ELSE
+C
+ IF( (KSEC1(42).LT.0).OR.(KSEC1(42).GT.65535) ) THEN
+ KRET = 1
+ WRITE(GRPRSM,9105) KSEC1(42)
+ ENDIF
+C
+ ENDIF
+C
+ ENDIF
+C
+C Check ECMWF local definition 2.
+C (Cluster means and standard deviations)
+C
+ IF( KSEC1(37).EQ.2 ) THEN
+C
+C Check cluster number.
+C
+ IF( (KSEC1(42).LT.1).OR.(KSEC1(42).GT.255) ) THEN
+ KRET = 1
+ WRITE(GRPRSM,9107)
+ ENDIF
+C
+C Check total number of clusters.
+C
+ IF( (KSEC1(43).LT.1).OR.(KSEC1(43).GT.255) ) THEN
+ KRET = 1
+ WRITE(GRPRSM,9108)
+ ENDIF
+C
+C Check clustering method.
+C
+ IF( (KSEC1(44).LT.1).OR.(KSEC1(44).GT.3) ) THEN
+ KRET = 1
+ WRITE(GRPRSM,9109)
+ ENDIF
+C
+ ENDIF
+C
+C Check ECMWF local definition 6.
+C (Surface temperatures)
+C
+ IF( KSEC1(37).EQ.6 ) THEN
+C
+C Check type for SST field.
+C
+ IF( (KSEC1(45).LT.0).OR.(KSEC1(45).GT.2) ) THEN
+ KRET = 1
+ WRITE(GRPRSM,*)
+ X 'GRCHK1: Invalid type for SST field = ',KSEC1(45)
+ ENDIF
+C
+C Check count of ICE fields used.
+C
+ IF( KSEC1(46).LT.0 ) THEN
+ KRET = 1
+ WRITE(GRPRSM,*)
+ X 'GRCHK1: Invalid count of ICE fields used = ',KSEC1(46)
+ ENDIF
+C
+ ENDIF
+C
+ ENDIF
+C
+C Check ECMWF local definition 18.
+C (Multi-analysis ensemble data)
+C
+ IF( KSEC1(37).EQ.18 ) THEN
+C
+C Check list of WMO centre identifiers
+C
+ NUMBER = KSEC1(46)
+ IF( NUMBER.LT.0 ) THEN
+ KRET = 1
+ WRITE(GRPRSM,*)
+ X 'GRCHK1: WMO id list count invalid = ',NUMBER
+ ENDIF
+C
+ IF( NUMBER.GT.15 ) THEN
+ KRET = 1
+ WRITE(GRPRSM,*)
+ X 'GRCHK1: WMO id list count greater than 15 = ',NUMBER
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4 . Check validity of values for Washington ensemble
+C products local usage.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+Cjdc IF( (KSEC1(24).EQ.1).AND.LKWBC ) CALL KWCHK1(KSEC1,KRET)
+C
+C -----------------------------------------------------------------|
+C* Section 9 . Return to calling routine. Format statements.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ 9001 FORMAT (1H ,'GRCHK1: Invalid Parameter Table version number - ',
+ C I5)
+ 9002 FORMAT (1H ,'GRCHK1: Invalid Identification of Centre - ',I5)
+ 9003 FORMAT (1H ,'GRCHK1: Invalid Generating Process - ',I5)
+ 9004 FORMAT (1H ,'GRCHK1: Invalid Grid Definition - ',I5)
+ 9005 FORMAT (1H ,'GRCHK1: Invalid flag field - ',I5,' decimal.')
+ 9006 FORMAT (1H ,'GRCHK1: Invalid Indicator of parameter - ',I5)
+ 9008 FORMAT (1H ,'GRCHK1: Invalid year of century - ',I5)
+ 9009 FORMAT (1H ,'GRCHK1: Invalid month - ',I5)
+ 9010 FORMAT (1H ,'GRCHK1: Invalid day - ',I5)
+ 9011 FORMAT (1H ,'GRCHK1: Invalid hour - ',I5)
+ 9012 FORMAT (1H ,'GRCHK1: Invalid minute - ',I5)
+ 9013 FORMAT (1H ,'GRCHK1: Invalid Indicator of unit of time - ',I5)
+ 9014 FORMAT (1H ,'GRCHK1: Uncatalogued grid and no Section 2.')
+ 9015 FORMAT (1H ,'GRCHK1: Invalid indicator of type of level - ',I5)
+ 9016 FORMAT (1H ,'GRCHK1: Inconsistent Time Range Indicator',
+ C ' - ',I5,' and number included in averages - ',I5)
+ 9019 FORMAT (1H ,'GRCHK1: Invalid Time Range Indicator - ',I5)
+ 9020 FORMAT (1H ,'GRCHK1: Inconsistent Time Range Indicator',
+ C ' - ',I5,' and number missing from averages - ',I5)
+ 9021 FORMAT (1H ,'GRCHK1: Invalid century of reference time - ',I5)
+ 9022 FORMAT (1H ,'GRCHK1: Invalid decimal scale factor - ',I5)
+ 9023 FORMAT (1H ,'GRCHK1: For level type ',I3,' descriptions are',
+ C 'invalid - ',I5,3X,I5)
+ 9024 FORMAT (1H ,'GRCHK1: ** WARNING ** Parameter number ',I3,' is',
+ C ' not defined in International Table number ',I3,'.')
+ 9025 FORMAT (1H ,'GRCHK1: Local use flag KSEC1(24) should be',
+ C ' 0 or 1.')
+ 9026 FORMAT (1H ,'GRCHK1: Reserved fields KSEC1(25->36) should be 0 ',
+ C 'to avoid problems with future releases.')
+C
+ 9101 FORMAT (1H ,'GRCHK1: Invalid local use definition: ',I8)
+C
+ 9102 FORMAT (1H ,'GRCHK1: Invalid class - ',I5)
+C
+ 9103 FORMAT (1H ,'GRCHK1: Invalid type - ',I5)
+C
+ 9104 FORMAT (1H ,'GRCHK1: Invalid stream - ',I5)
+C
+ 9105 FORMAT (1H ,'GRCHK1: Invalid ensemble forecast number - ',I5)
+C
+ 9106 FORMAT (1H ,'GRCHK1: Invalid total number of forecasts - ',I5)
+C
+ 9107 FORMAT (1H ,'GRCHK1: Invalid cluster number - ',I5)
+C
+ 9108 FORMAT (1H ,'GRCHK1: Invalid total number of clusters - ',I5)
+C
+ 9109 FORMAT (1H ,'GRCHK1: Invalid clustering method - ',I5)
+C
+ END
diff --git a/gribex/grchk2.F b/gribex/grchk2.F
new file mode 100755
index 0000000..f3d4d3a
--- /dev/null
+++ b/gribex/grchk2.F
@@ -0,0 +1,658 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRCHK2 (KSEC1,KSEC2,PSEC2,KRET)
+C
+C---->
+C**** GRCHK2 - Check parameters for Section 2 of GRIB Code.
+C
+C Purpose.
+C --------
+C
+C Check parameters for Section 2 of GRIB code against
+C valid values for GRIB Edition 1.
+C
+C** Interface.
+C ----------
+C
+C CALL GRCHK2 (KSEC1,KSEC2,PSEC2,KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KSEC1 - Array containing integer parameters for
+C section 1 of GRIB code.
+C
+C KSEC2 - Array containing integer parameters for
+C section 2 of GRIB code.
+C
+C PSEC2 - Array containing real parameters for
+C section 2 of GRIB code.
+C
+C Output Parameters.
+C ------------------
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Error in GRIB Code parameter.
+C
+C Method.
+C -------
+C
+C Values checked against current code/flag tables
+C and against maximum or minimum permitted values.
+C They are also checked against the current status
+C of the implementation of GRIBEX and ECMWF usage.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes for GRIB Code.
+C
+C Comments.
+C ---------
+C
+C None.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 30.08.91
+C Polar stereographic representation type allowed.
+C
+C J. Hennessy ECMWF 01.10.91
+C Space view or orthographic representation allowed.
+C Additional parameters KSEC1 and PSEC2 added.
+C
+C J.D.Chambers ECMWF 27.04.94
+C Allow complex packing for spherical harmonics
+C
+C J.D.Chambers ECMWF 03.04.95
+C Allow Lambert conformal.
+C
+C J.D.Chambers ECMWF July 2004
+C Allow Mercator
+C
+C----<
+C ----------------------------------------------------------------
+C Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JP6, JP6X, JP8
+ PARAMETER (JP6=23)
+ PARAMETER (JP6X=17)
+ PARAMETER (JP8=8)
+C
+C Subroutine arguments
+C
+ INTEGER KSEC1, KSEC2, KRET
+ DIMENSION KSEC1(*)
+ DIMENSION KSEC2(*)
+ REAL PSEC2
+ DIMENSION PSEC2(*)
+C
+C Local variables
+C
+ LOGICAL LQUASI
+ INTEGER LOOP
+C
+ INTEGER ITAB6, ITAB6X, ITAB8
+ DIMENSION ITAB6(JP6)
+ DIMENSION ITAB6X(JP6X)
+ DIMENSION ITAB8(JP8)
+C
+C Valid values given in Code Table 6.
+C
+ DATA ITAB6 / 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ X 10, 13, 14,
+ X 20, 24, 30, 34, 50, 60, 70, 80, 90,
+ X 192 /
+C
+C Code Table 6 values currently supported by GRIBEX.
+C
+ DATA ITAB6X /0,1,3,4,5,10,14,20,24,30,34,50,60,70,80,90,192/
+C
+C Valid values given in Code Table 8.
+C
+ DATA ITAB8 /0,128,64,192,32,160,96,224/
+C
+C ----------------------------------------------------------------
+C Section 1 . Set initial values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Reset return code.
+ KRET = 0
+C
+C ----------------------------------------------------------------
+C Section 2 . Check values against code tables and extreme values.
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Number of vertical coordinate parameters.
+C
+ IF (KSEC2(12).LT.0.OR.KSEC2(12).GT.255) THEN
+ KRET = 1
+ WRITE(GRPRSM,9019) KSEC2(12)
+ ENDIF
+C
+C Check Data Representation Type.
+C
+ DO LOOP = 1,JP6
+ IF (KSEC2(1).EQ.ITAB6(LOOP)) GO TO 202
+ ENDDO
+C
+ KRET = 1
+ WRITE(GRPRSM,9001) KSEC2(1)
+C
+ 202 CONTINUE
+C
+C Check Data Representation Type currently supported.
+C
+ DO LOOP = 1,JP6X
+ IF (KSEC2(1).EQ.ITAB6X(LOOP)) GO TO 204
+ ENDDO
+C
+ KRET = 1
+ WRITE(GRPRSM,9002) KSEC2(1)
+ GO TO 900
+C
+ 204 CONTINUE
+C
+C Earth flag.
+C
+ IF (KSEC2(18).NE.0.AND.KSEC2(18).NE.64) THEN
+ KRET = 1
+ WRITE(GRPRSM,9005) KSEC2(18)
+ ENDIF
+C
+C Check ECMWF usage.(0 except for space view perspective)
+C
+ IF (KSEC2(18).NE.0.AND.KSEC1(2).EQ.98.AND.KSEC2(1).NE.90) THEN
+ KRET = 1
+ WRITE(GRPRSM,9007)
+ ENDIF
+C
+C Components flag.
+C
+ IF (KSEC2(19).NE.0.AND.KSEC2(19).NE.8) THEN
+ KRET = 1
+ WRITE(GRPRSM,9006) KSEC2(19)
+ ENDIF
+C
+C Check ECMWF usage.
+C
+ IF(KSEC2(19).NE.0.AND.KSEC2(19).NE.8.AND.KSEC1(2).EQ.98) THEN
+ KRET = 1
+ WRITE(GRPRSM,9008)
+ ENDIF
+C
+ LQUASI = (KSEC2(17) .EQ. 1)
+C
+C ----------------------------------------------------------------
+C Section 3. Checks on latitude/longitude grids.
+C ----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF ( KSEC2(1).EQ.0 .OR. KSEC2(1).EQ.10 .OR.
+ X KSEC2(1).EQ.20 .OR. KSEC2(1).EQ.30 ) THEN
+C
+C Number of points along a parallel.
+C
+ IF ( KSEC2(2).LT.1. OR. KSEC2(2).GT.65535 ) THEN
+ IF ( .NOT. LQUASI ) THEN
+ KRET = 1
+ WRITE(GRPRSM,9022) KSEC2(2)
+ ENDIF
+ ENDIF
+C
+C Number of points along a meridian.
+C
+ IF ( KSEC2(3).LT.1 .OR. KSEC2(3).GT.65535 ) THEN
+ IF ( .NOT. LQUASI ) THEN
+ KRET = 1
+ WRITE(GRPRSM,9023) KSEC2(3)
+ ENDIF
+ ENDIF
+C
+C Latitude of first grid point.
+C
+ IF (KSEC2(4).LT.-90000.OR.KSEC2(4).GT.90000) THEN
+ KRET = 1
+ WRITE(GRPRSM,9015) KSEC2(4)
+ ENDIF
+C
+C Longitude of first grid point.
+C
+ IF (KSEC2(5).LT.-360000.OR.KSEC2(5).GT.360000) THEN
+ KRET = 1
+ WRITE(GRPRSM,9016) KSEC2(5)
+ ENDIF
+C
+C Resolution flag.
+C
+ IF (KSEC2(6).NE.0.AND.KSEC2(6).NE.128) THEN
+ KRET = 1
+ WRITE(GRPRSM,9003) KSEC2(6)
+ ENDIF
+C
+C Latitude of last grid point.
+C
+ IF (KSEC2(7).LT.-90000.OR.KSEC2(7).GT.90000) THEN
+ KRET = 1
+ WRITE(GRPRSM,9020) KSEC2(7)
+ ENDIF
+C
+C Longitude of last grid point.
+C
+ IF (KSEC2(8).LT.-360000.OR.KSEC2(8).GT.360000) THEN
+ KRET = 1
+ WRITE(GRPRSM,9021) KSEC2(8)
+ ENDIF
+C
+C Direction increments, if included.
+C
+ IF (KSEC2(6).EQ.128) THEN
+ IF (KSEC2(9).LT.1.OR.KSEC2(9).GT.65535) THEN
+ IF( .NOT. LQUASI ) THEN
+ KRET = 1
+ WRITE(GRPRSM,9024) KSEC2(9)
+ ENDIF
+ ENDIF
+C
+ IF (KSEC2(10).LT.1.OR.KSEC2(10).GT.65535) THEN
+ IF( .NOT. LQUASI ) THEN
+ KRET = 1
+ WRITE(GRPRSM,9025) KSEC2(10)
+ ENDIF
+ ENDIF
+ ENDIF
+C
+C Scanning mode flag.
+C
+ DO LOOP = 1, JP8
+ IF (KSEC2(11).EQ.ITAB8(LOOP)) GO TO 302
+ ENDDO
+C
+ KRET = 1
+ WRITE(GRPRSM,9004) KSEC2(11)
+C
+ 302 CONTINUE
+C
+C Regular / Quasi-regular grid check.
+C
+ IF (KSEC2(17).NE.0.AND.KSEC2(17).NE.1) THEN
+ KRET = 1
+ WRITE(GRPRSM,9009) KSEC2(17)
+ ENDIF
+C
+ GO TO 900
+ ENDIF
+C
+C ----------------------------------------------------------------
+C Section 4. Checks on Gaussian grids.
+C ----------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ IF ( KSEC2(1).EQ.4 .OR. KSEC2(1).EQ.14 .OR.
+ X KSEC2(1).EQ.24 .OR. KSEC2(1).EQ.34) THEN
+C
+C Latitude of first grid point.
+C
+ IF (KSEC2(4).LT.-90000.OR.KSEC2(4).GT.90000) THEN
+ KRET = 1
+ WRITE(GRPRSM,9015) KSEC2(4)
+ ENDIF
+C
+C Longitude of first grid point.
+C
+ IF (KSEC2(5).LT.-360000.OR.KSEC2(5).GT.360000) THEN
+ KRET = 1
+ WRITE(GRPRSM,9016) KSEC2(5)
+ ENDIF
+C
+C Latitude of last grid point.
+C
+ IF (KSEC2(7).LT.-90000.OR.KSEC2(7).GT.90000) THEN
+ KRET = 1
+ WRITE(GRPRSM,9020) KSEC2(7)
+ ENDIF
+C
+C Longitude of last grid point.
+C
+ IF (KSEC2(8).LT.-360000.OR.KSEC2(8).GT.360000) THEN
+ KRET = 1
+ WRITE(GRPRSM,9021) KSEC2(8)
+ ENDIF
+C
+C i-direction increment, if included.
+C
+ IF (KSEC2(6).EQ.128) THEN
+ IF (KSEC2(9).LT.1.OR.KSEC2(9).GT.65535) THEN
+ KRET = 1
+ WRITE(GRPRSM,9024) KSEC2(9)
+ ENDIF
+ ENDIF
+C
+C Number of parallels beween pole and equator.
+C
+ IF (KSEC2(10).LT.1.OR.KSEC2(10).GT.65535) THEN
+ KRET = 1
+ WRITE(GRPRSM,9026) KSEC2(10)
+ ENDIF
+C
+C Increment flag.
+C
+ IF (KSEC2(6).NE.0.AND.KSEC2(6).NE.128) THEN
+ KRET = 1
+ WRITE(GRPRSM,9003) KSEC2(6)
+ ENDIF
+C
+C Scanning mode flag.
+C
+ DO LOOP = 1, JP8
+ IF (KSEC2(11).EQ.ITAB8(LOOP)) GO TO 402
+ ENDDO
+C
+ KRET = 1
+ WRITE(GRPRSM,9004) KSEC2(11)
+C
+ 402 CONTINUE
+C
+C Regular / Quasi-regular grid check.
+C
+ IF (KSEC2(17).NE.0.AND.KSEC2(17).NE.1) THEN
+ KRET = 1
+ WRITE(GRPRSM,9009) KSEC2(17)
+ ENDIF
+C
+C Cross-check increments flag and quasi-regular indicator.
+C
+ IF ( LQUASI .AND.KSEC2(6).EQ.128) THEN
+ KRET = 1
+ WRITE(GRPRSM,9011)
+ ENDIF
+C
+ GO TO 900
+ ENDIF
+C
+C ----------------------------------------------------------------
+C Section 5. Checks on Polar Stereographic data.
+C
+C ----------------------------------------------------------------
+C
+ 500 CONTINUE
+C
+ IF (KSEC2(1).EQ.5) THEN
+C
+C Number of points along X-axis.
+C
+ IF (KSEC2(2).LT.1.OR.KSEC2(2).GT.65535) THEN
+ KRET = 1
+ WRITE(GRPRSM,9027) KSEC2(2)
+ ENDIF
+C
+C Number of points along Y-axis.
+C
+ IF (KSEC2(3).LT.1.OR.KSEC2(3).GT.65535) THEN
+ KRET = 1
+ WRITE(GRPRSM,9028) KSEC2(3)
+ ENDIF
+C
+C Latitude of first grid point.
+C
+ IF (KSEC2(4).LT.-90000.OR.KSEC2(4).GT.90000) THEN
+ KRET = 1
+ WRITE(GRPRSM,9015) KSEC2(4)
+ ENDIF
+C
+C Longitude of first grid point.
+C
+ IF (KSEC2(5).LT.-360000.OR.KSEC2(5).GT.360000) THEN
+ KRET = 1
+ WRITE(GRPRSM,9016) KSEC2(5)
+ ENDIF
+C
+C Orientation of the grid.
+C
+ IF (KSEC2(7).LT.-360000.OR.KSEC2(7).GT.360000) THEN
+ KRET = 1
+ WRITE(GRPRSM,9017) KSEC2(7)
+ ENDIF
+C
+C Grid lengths.
+C
+ IF (KSEC2(9).LT.1.OR.KSEC2(9).GT.16777215) THEN
+ KRET = 1
+ WRITE(GRPRSM,9029) KSEC2(9)
+ ENDIF
+C
+ IF (KSEC2(10).LT.1.OR.KSEC2(10).GT.16777215) THEN
+ KRET = 1
+ WRITE(GRPRSM,9030) KSEC2(10)
+ ENDIF
+C
+C Projection centre.
+C
+C The use of 1 by the Polar Stereographic projection in this
+C octet is inconsistent with Lambert conformal et al
+C representation where bit 1 is set 1 to indicate North pole.
+C
+ IF (KSEC2(13).NE.0.AND.KSEC2(13).NE.1) THEN
+ KRET = 1
+ WRITE(GRPRSM,9018) KSEC2(13)
+ ENDIF
+C
+ GO TO 900
+ ENDIF
+C
+C ----------------------------------------------------------------
+C Section 6. Checks on spherical harmonic data.
+C ----------------------------------------------------------------
+C
+ 600 CONTINUE
+C
+ IF ( KSEC2(1).EQ.50 .OR. KSEC2(1).EQ.60 .OR.
+ X KSEC2(1).EQ.70 .OR. KSEC2(1).EQ.80 ) THEN
+C
+C Spectral data representation type.
+C
+ IF (KSEC2(5).NE.1) THEN
+ KRET = 1
+ WRITE(GRPRSM,9012) KSEC2(5)
+ ENDIF
+C
+C Spectral data representation mode.
+C
+ IF (KSEC2(6).NE.1.AND.KSEC2(6).NE.2) THEN
+ KRET = 1
+ WRITE(GRPRSM,9013) KSEC2(6)
+ ENDIF
+C
+ GO TO 900
+ ENDIF
+C
+C ----------------------------------------------------------------
+C Section 7 . Checks on space view perspective.
+C ----------------------------------------------------------------
+C
+ 700 CONTINUE
+C
+ IF (KSEC2(1).EQ.90) THEN
+ GO TO 900
+ ENDIF
+C
+C ----------------------------------------------------------------
+C Section 8. Checks on Lambert conformal data.
+C ----------------------------------------------------------------
+C
+ 800 CONTINUE
+C
+ IF (KSEC2(1).EQ.3) THEN
+C
+C Number of points along X-axis.
+C
+ IF (KSEC2(2).LT.1.OR.KSEC2(2).GT.65535) THEN
+ KRET = 1
+ WRITE(GRPRSM,9027) KSEC2(2)
+ ENDIF
+C
+C Number of points along Y-axis.
+C
+ IF (KSEC2(3).LT.1.OR.KSEC2(3).GT.65535) THEN
+ KRET = 1
+ WRITE(GRPRSM,9028) KSEC2(3)
+ ENDIF
+C
+C Latitude of first grid point.
+C
+ IF (KSEC2(4).LT.-90000.OR.KSEC2(4).GT.90000) THEN
+ KRET = 1
+ WRITE(GRPRSM,9015) KSEC2(4)
+ ENDIF
+C
+C
+C Longitude of first grid point.
+C
+ IF (KSEC2(5).LT.-360000.OR.KSEC2(5).GT.360000) THEN
+ KRET = 1
+ WRITE(GRPRSM,9016) KSEC2(5)
+ ENDIF
+C
+C Orientation of the grid.
+C
+ IF (KSEC2(7).LT.-360000.OR.KSEC2(7).GT.360000) THEN
+ KRET = 1
+ WRITE(GRPRSM,9017) KSEC2(7)
+ ENDIF
+C
+C Grid lengths.
+C
+ IF (KSEC2(9).LT.1.OR.KSEC2(9).GT.16777215) THEN
+ KRET = 1
+ WRITE(GRPRSM,9029) KSEC2(9)
+ ENDIF
+C
+ IF (KSEC2(10).LT.1.OR.KSEC2(10).GT.16777215) THEN
+ KRET = 1
+ WRITE(GRPRSM,9030) KSEC2(10)
+ ENDIF
+C
+C Projection centre.
+C
+ IF (KSEC2(13).NE.0.AND.KSEC2(13).NE.64.AND.KSEC2(13).NE.
+ X 128.AND.KSEC2(13).NE.192) THEN
+ KRET = 1
+ WRITE(GRPRSM,9018) KSEC2(13)
+ ENDIF
+C
+C Latitude Latin 1.
+C
+ IF (KSEC2(14).LT.-90000.OR.KSEC2(14).GT.90000) THEN
+ KRET = 1
+ WRITE(GRPRSM,9015) KSEC2(14)
+ ENDIF
+C
+C Latitude Latin 2.
+C
+ IF (KSEC2(15).LT.-90000.OR.KSEC2(15).GT.90000) THEN
+ KRET = 1
+ WRITE(GRPRSM,9015) KSEC2(15)
+ ENDIF
+C
+C Latitude of southern pole.
+C
+ IF (KSEC2(20).LT.-90000.OR.KSEC2(20).GT.90000) THEN
+ KRET = 1
+ WRITE(GRPRSM,9015) KSEC2(20)
+ ENDIF
+C
+C Longitude of southern pole.
+C
+ IF (KSEC2(21).LT.-360000.OR.KSEC2(21).GT.360000) THEN
+ KRET = 1
+ WRITE(GRPRSM,9016) KSEC2(21)
+ ENDIF
+C
+ GO TO 900
+ ENDIF
+C
+C ----------------------------------------------------------------
+C Section 9 . Return to calling routine. Format statements.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ 9001 FORMAT (1H ,'GRCHK2 : Invalid data representation type - ',I3)
+ 9002 FORMAT (1H ,'GRCHK2 : Unsupported data representation type - ',I3)
+ 9003 FORMAT (1H ,'GRCHK2 : Invalid increments flag - ',I3)
+ 9004 FORMAT (1H ,'GRCHK2 : Invalid scanning mode flag - ',I3)
+ 9005 FORMAT (1H ,'GRCHK2 : Invalid earth flag - ',I3)
+ 9006 FORMAT (1H ,'GRCHK2 : Invalid components flag - ',I3)
+ 9007 FORMAT (1H ,'GRCHK2 : Earth flag - ECMWF usage is 0.')
+ 9008 FORMAT (1H ,'GRCHK2 : Components flag - ECMWF usage is 0.')
+ 9009 FORMAT (1H ,'GRCHK2 : Invalid quasi / regular indicator - ',I3)
+ 9011 FORMAT (1H ,'GRCHK2 : Quasi-regular Gaussian grid cannot have',
+ C ' direction increments included.')
+ 9012 FORMAT (1H ,'GRCHK2 : Invalid spectral representation type - ',I3)
+ 9013 FORMAT (1H ,'GRCHK2 : Invalid spectral representation mode - ',I3)
+ 9014 FORMAT (1H ,'GRCHK2 : Complex spectral representation mode ',
+ C 'not catered for.')
+ 9015 FORMAT (1H ,'GRCHK2 : Invalid latitude of first grid point - ',
+ C I10)
+ 9016 FORMAT (1H ,'GRCHK2 : Invalid longitude of first grid point - ',
+ C I10)
+ 9017 FORMAT (1H ,'GRCHK2 : Invalid orientation of the grid - ',
+ C I10)
+ 9018 FORMAT (1H ,'GRCHK2 : Invalid projection centre flag - ',I3)
+ 9019 FORMAT (1H ,'GRCHK2 : Invalid number of vertical coordinate ',
+ C 'parameters - ',I8)
+ 9020 FORMAT (1H ,'GRCHK2 : Invalid latitude of last grid point - ',
+ C I10)
+ 9021 FORMAT (1H ,'GRCHK2 : Invalid longitude of last grid point - ',
+ C I10)
+ 9022 FORMAT (1H ,'GRCHK2 : Invalid number of points along a parallel',
+ C ' - ', I10)
+ 9023 FORMAT (1H ,'GRCHK2 : Invalid number of points along a meridian',
+ C ' - ', I10)
+ 9024 FORMAT (1H ,'GRCHK2 : Invalid i-direction increment - ',I10)
+ 9025 FORMAT (1H ,'GRCHK2 : Invalid j-direction increment - ',I10)
+ 9026 FORMAT (1H ,'GRCHK2 : Invalid number of parallels - ',I10)
+ 9027 FORMAT (1H ,'GRCHK2 : Invalid number of points along X-axis',
+ C ' - ', I10)
+ 9028 FORMAT (1H ,'GRCHK2 : Invalid number of points along Y-axis',
+ C ' - ', I10)
+ 9029 FORMAT (1H ,'GRCHK2 : Invalid X-direction grid length - ',I10)
+ 9030 FORMAT (1H ,'GRCHK2 : Invalid Y-direction grid length - ',I10)
+C
+ RETURN
+C
+ END
diff --git a/gribex/grchk3.F b/gribex/grchk3.F
new file mode 100755
index 0000000..aba1487
--- /dev/null
+++ b/gribex/grchk3.F
@@ -0,0 +1,201 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE GRCHK3 (KSEC1,KSEC3,PSEC3,KRET)
+C
+C---->
+C**** GRCHK3 - Check parameters for Section 3 of GRIB Code.
+C
+C Purpose.
+C --------
+C
+C Check parameters for Section 3 of GRIB code against
+C valid values for GRIB Edition 1.
+C
+C** Interface.
+C ----------
+C
+C CALL GRCHK3 (KSEC1,KSEC3,PSEC3,KRET)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KSEC1 - Array containing integer parameters for
+C section 1 of GRIB code.
+C
+C KSEC3 - Array containing integer parameters for
+C section 3 of GRIB code.
+C
+C PSEC3 - Array containing real parameters for
+C section 3 of GRIB code.
+C
+C Output Parameters.
+C ------------------
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Error in GRIB Code parameter.
+C
+C Method.
+C -------
+C
+C Values checked against current code/flag tables
+C and against maximum or minimum permitted values.
+C They are also checked against the current status
+C of the implementation of GRIBEX and ECMWF usage.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes for GRIB Code.
+C
+C Comments.
+C ---------
+C
+C Routine contains Sections 0 to 5 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 16.09.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 01.10.91
+C Additional parameter KSEC1 and PSEC3 added.
+C
+C ----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+ INTEGER KRET
+ INTEGER KSEC1
+ INTEGER KSEC3
+C
+ REAL PSEC3
+C
+ DIMENSION KSEC1(*)
+ DIMENSION KSEC3(*)
+C
+ DIMENSION PSEC3(*)
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Set initial values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Reset return code.
+C
+ KRET = 0
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Check values.
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C* Check bit-map table reference field.
+C
+ IF (KSEC3(1).LT.0.OR.KSEC3(1).GT.65535)
+ C THEN
+ KRET = 1
+ WRITE(GRPRSM,9001) KSEC3(1)
+ ENDIF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ 9001 FORMAT (1H ,'GRCHK3 : Invalid bit-map table reference - ',I9)
+C
+ RETURN
+ END
diff --git a/gribex/grchk4.F b/gribex/grchk4.F
new file mode 100755
index 0000000..6463839
--- /dev/null
+++ b/gribex/grchk4.F
@@ -0,0 +1,246 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRCHK4 (KSEC1,KSEC4,PSEC4,KRET)
+C
+C---->
+C**** GRCHK4 - Check parameters for Section 4 of GRIB Code.
+C
+C Purpose.
+C --------
+C
+C Check parameters for Section 4 of GRIB code against
+C valid values for GRIB Edition 1.
+C
+C** Interface.
+C ----------
+C
+C CALL GRCHK4 (KSEC1,KSEC4,PSEC4,KRET)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KSEC1 - Array containing integer parameters for
+C section 1 of GRIB code.
+C
+C KSEC4 - Array containing integer parameters for
+C section 4 of GRIB code.
+C
+C PSEC4 - Array containing real parameters for
+C section 4 of GRIB code.
+C
+C Output Parameters.
+C ------------------
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Error in GRIB Code parameter.
+C
+C Method.
+C -------
+C
+C Values checked against current code/flag tables
+C and against maximum or minimum permitted values.
+C They are also checked against the current status
+C of the implementation of GRIBEX.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes for GRIB Code.
+C
+C Comments.
+C ---------
+C
+C Routine contains Sections 0 to 2 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 01.10.91
+C Additional parameters KSEC1 and PSEC4 added.
+C
+C J. Hennessy ECMWF 17.07.92
+C Additional flag and matrix of values checks added.
+C
+C J.D.Chambers ECMWF 27.04.94
+C Allow complex packing for spherical harmonics
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C Take into account second-order packing for grid-point data.
+C Revised printouts.
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+ INTEGER KRET
+ INTEGER KSEC1
+ INTEGER KSEC4
+C
+ REAL PSEC4
+C
+ DIMENSION KSEC1(*)
+ DIMENSION KSEC4(*)
+C
+ DIMENSION PSEC4(*)
+C
+C ----------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Reset return code.
+ KRET = 0
+C
+C ----------------------------------------------------------------
+C* Section 2 . Check values against code tables and extreme values.
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C* Check number of values to be encoded.
+ IF (KSEC4(1).EQ.0) THEN
+ KRET = 1
+ WRITE(GRPRSM,*)
+ X 'GRCHK4: Invalid number of data values to be encoded'
+ X , KSEC4(1)
+ ENDIF
+C
+C* Check number of bits per data value.
+ IF (KSEC4(2).LT.1.OR.KSEC4(2).GT.32) THEN
+ KRET = 1
+ WRITE(GRPRSM,*)
+ X 'GRCHK4: Invalid number of bits for packed data values'
+ X , KSEC4(2)
+ ENDIF
+C
+C* Check on type of data (grid or spherical harmonics).
+ IF ( KSEC4(3).NE.0 .AND. KSEC4(3).NE.128 ) THEN
+ WRITE(GRPRSM,*) 'GRCHK4: Invalid type of data', KSEC4(3)
+ ENDIF
+C
+C* Check type of packing.
+ IF ( KSEC4(4).NE.0 .AND. KSEC4(4).NE.64 ) THEN
+ KRET = 1
+ WRITE(GRPRSM,*) 'GRCHK4: Invalid type of packing', KSEC4(4)
+ ENDIF
+C
+C* Check data representation.
+ IF (KSEC4(5).NE.0.AND.KSEC4(5).NE.32) THEN
+ KRET = 1
+ WRITE(GRPRSM,*) 'GRCHK4: Invalid data representation', KSEC4(5)
+ ENDIF
+C
+C* Check additional flag field.
+ IF (KSEC4(6).NE.0.AND.KSEC4(6).NE.16) THEN
+ KRET = 1
+ WRITE(GRPRSM,*)
+ X 'GRCHK4: Invalid additional flag field', KSEC4(6)
+ ENDIF
+C
+C* Check reserved field.
+ IF (KSEC4(7).NE.0) THEN
+ WRITE(GRPRSM,*)
+ X 'GRCHK4: Reserved field not 0. May cause trouble'
+ WRITE(GRPRSM,*) 'GRCHK4: in future releases of GRIBEX.'
+ ENDIF
+C
+C* Check number of values indicator.
+ IF (KSEC4(8).NE.0.AND.KSEC4(8).NE.64) THEN
+ KRET = 1
+ WRITE(GRPRSM,*) 'GRCHK4: Invalid number of fields indicator'
+ X , KSEC4(8)
+ ENDIF
+C
+C* Check secondary bit maps indicator.
+ IF (KSEC4(9).NE.0.AND.KSEC4(9).NE.32) THEN
+ KRET = 1
+ WRITE(GRPRSM,*) 'GRCHK4: Invalid secondary bit map indicator'
+ X , KSEC4(9)
+ ENDIF
+C
+C* Check value widths indicator.
+ IF (KSEC4(6).EQ.16.AND.KSEC4(10).NE.0.AND.KSEC4(10).NE.16) THEN
+ KRET = 1
+ WRITE(GRPRSM,*) 'GRCHK4: Invalid value widths', KSEC4(10)
+ ENDIF
+C
+C* Tests specific to second-order packing.
+C
+ IF (KSEC4(3).EQ.0.AND.KSEC4(4).EQ.64) THEN
+C
+C* Check constant width.
+ IF (KSEC4(10).EQ.0.AND.(ABS(KSEC4(11)).GE.KSEC4(2))) THEN
+ KRET = 1
+ WRITE(GRPRSM,9011) KSEC4(11), KSEC4(2)-1
+ ENDIF
+C
+C* Check general extended 2nd-order packing indicator.
+ IF (KSEC4(12).NE.0.AND.KSEC4(12).NE.8) THEN
+ KRET = 1
+ WRITE(GRPRSM,*)
+ X 'GRCHK4: Invalid general extended 2n-order packing indicator'
+ X , KSEC4(12)
+ ENDIF
+C
+C* Check boustrophedonic ordering indicator.
+ IF (KSEC4(13).NE.0.AND.KSEC4(13).NE.4) THEN
+ KRET = 1
+ WRITE(GRPRSM,*)
+ X 'GRCHK4: Invalid boustrophedonic ordering indicator'
+ X , KSEC4(13)
+ ENDIF
+C
+C* Check spatial differencing indicator.
+ IF (KSEC4(14).NE.0.AND.KSEC4(14).NE.2) THEN
+ KRET = 1
+ WRITE(GRPRSM,*)
+ X 'GRCHK4: Invalid spatial differencing indicator'
+ X , KSEC4(14)
+ ENDIF
+C
+ ENDIF
+C
+C ----------------------------------------------------------------
+C* Section 9 . Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ 9011 FORMAT (TR1,'GRCHK4 : Second-order packing with constant width ',
+ C 'option:',/,TR10,'Constant width value',I3,
+ C ' not in range [-/+',I2,'(=KSEC4(2)-1)].')
+C
+ RETURN
+C
+ END
diff --git a/gribex/grib_int_t.h b/gribex/grib_int_t.h
new file mode 100755
index 0000000..d433fc5
--- /dev/null
+++ b/gribex/grib_int_t.h
@@ -0,0 +1,27 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef GRIB_INT_T_H
+#define GRIB_INT_T_H
+
+#ifdef INTEGER_IS_INT
+typedef int grib_int_t;
+#else
+typedef long grib_int_t;
+#endif
+typedef long * JPointer;
+typedef long long grib_int_64_t;
+
+typedef double grib_real_t;
+
+typedef unsigned char grib_octet_t;
+typedef const char grib_string_t;
+
+#endif /* End of GRIB_INT_T_H */
diff --git a/gribex/gribex.F b/gribex/gribex.F
new file mode 100755
index 0000000..192b40a
--- /dev/null
+++ b/gribex/gribex.F
@@ -0,0 +1,5086 @@
+ SUBROUTINE GRIBEX (KSEC0,KSEC1,KSEC2,PSEC2,KSEC3,PSEC3,KSEC4,
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ C PSEC4,KLENP,KGRIB,KLENG,KWORD,HOPER,KRET)
+C---->
+#include "gribex.h"
+C----<
+C -----------------------------------------------------------------|
+C* Section 0 . Definition of variables. Data statements.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Subroutine arguments
+C
+ INTEGER KSEC0,KSEC1,KSEC2,KSEC3,KSEC4,KGRIB
+ DIMENSION KGRIB(*), KSEC0(*), KSEC1(*)
+ DIMENSION KSEC2(*), KSEC3(*), KSEC4(*)
+ INTEGER KLENP,KLENG,KWORD, KRET
+ REAL PSEC2, PSEC3, PSEC4
+ DIMENSION PSEC2(*), PSEC3(*), PSEC4(*)
+ CHARACTER*(*) HOPER
+C
+C Local variables
+C
+ INTEGER N, NP, NINC
+ REAL JPEPSLN
+ PARAMETER (JPEPSLN=1E-12)
+C `-----> tolerance used to check equality
+C of floating point numbers - needed
+C on some platforms (eg vpp700, linux)
+ CHARACTER*1 YFUNC, YTEMP
+ INTEGER IJDC, JLOOP, JLOOPO, ISTATUS, ISECLEN
+ INTEGER IDUMP
+#ifdef REAL_BIGGER_THAN_INTEGER
+ INTEGER IINDEX, ILOOPS, NREM, JPNSEC4, ILNGTH
+ PARAMETER (JPNSEC4=12800)
+ INTEGER*4 NSEC4
+ DIMENSION NSEC4(JPNSEC4)
+ REAL*4 XSEC4
+ DIMENSION XSEC4(JPNSEC4)
+ EQUIVALENCE (NSEC4(1), XSEC4(1))
+ INTEGER*8 IJDCXX
+ REAL*8 RJDCXX
+#else
+ INTEGER IJDCXX
+ REAL RJDCXX
+#endif
+ EQUIVALENCE (IJDCXX, RJDCXX)
+ INTEGER I,IBLEN,IBITS,IBMAP,IBMAP2,IBYTEX,ICOUNT,NBYTE
+ INTEGER IEXP, IFLAG, IFLAGX, IFPT, IL
+ INTEGER ILEN, ILENF, ILEN1, ILEN2, ILEN3, ILEN4
+ INTEGER IMANT, IMISNG, IMISS, IMODAY, INC
+ INTEGER INIL, INITAL, INOLAT, INOLNG, INSPT, INUB
+ INTEGER INUM, IOFF, IPL, IPLEN, IPSEUD
+ INTEGER IPVPL, IRESOL, ISBMAP, NONMISS
+ INTEGER ISCALE, ISINT, ISKALE
+ INTEGER ISKIP, ITEMP, ITRND, IVALS, IP7777
+ INTEGER IEAST, IWEST, ILOEXT, INROWS
+C
+ INTEGER JPEDNO, JPLEN1
+ INTEGER KRETA, KRETB
+ INTEGER ITRUNC, ISUBSET, IS3BYTE
+ INTEGER NBPV
+ REAL RANGE
+C
+C Wave coordinate information held in KSEC4 are 32-bit REALs,
+C so REAL*4 ZREAL4 must be used for encoding/decoding.
+C
+ REAL*4 ZREAL4
+ REAL ZMAXV, ZMAX, ZMIN, ZMISNG, ZMSVAL, ZREAL, ZREF, ZVAL
+#if defined(CRAY) || defined(CYBER) ||((defined IBM)&&(!defined rs6000))
+ REAL ZS, ZAUXIL
+#else
+ DOUBLE PRECISION ZS, ZAUXIL
+#endif
+ REAL ZSCALE
+C
+ LOGICAL LENCODE, LDECODE, LPDEBUG
+ LOGICAL LGRDPT, LSPHERC, LCOMPLX
+ LOGICAL LECMWF, LECLOC, LKWBCE, LSST11
+ LOGICAL LLARGE
+ LOGICAL LQUASI, LSECT2, LSECT3, LPERIO
+ LOGICAL L_IORJ
+ LOGICAL LALLPOS
+ LOGICAL LVEGGY
+ LOGICAL LSATIMG
+ INTEGER NITABLE, NICENTRE, NIPARAM
+C
+C Externals
+C
+ INTEGER EGGSEC2, DGGSEC2, ELLSEC2, DLLSEC2, ESHSEC2, DSHSEC2
+ INTEGER EOCSEC2, DOCSEC2, ESVSEC2, DSVSEC2, EMESEC2, DMESEC2
+ INTEGER CSECT4, DSECT4A, GBITMAP, D2ORDR, C2ORDR, REF2GRB
+ INTEGER ONEBITS, D13FLAG
+C#ifdef GRIB2
+C INTEGER G2ENCOD
+C EXTERNAL G2ENCOD
+C#endif
+ EXTERNAL CSECT4, DSECT4A, GBITMAP, D2ORDR, C2ORDR, REF2GRB
+ EXTERNAL EGGSEC2, DGGSEC2, ELLSEC2, DLLSEC2, ESHSEC2, DSHSEC2
+ EXTERNAL EOCSEC2, DOCSEC2, ESVSEC2, DSVSEC2, EMESEC2, DMESEC2
+ EXTERNAL ONEBITS, D13FLAG
+C
+C GRIB code version number used in coding data.
+C
+ PARAMETER (JPEDNO=1)
+C
+C GRIBEX version number
+C
+ INTEGER IGRIBEX
+ CHARACTER*6 YGRIBEX
+C
+C Length (in octets) used for Section 1, when coding data.
+C
+ PARAMETER (JPLEN1=28)
+C
+ INTEGER IPARM, ILALO, IGRIB, I7777
+ DIMENSION IPARM(4), ILALO(2), IGRIB(4), I7777(4)
+C
+ INTEGER JP24SET, JP23SET, JP16SET, JP8SET
+ PARAMETER ( JP24SET = 2**24 - 1 )
+C ^---> 16777215 = FFFFFF(hex)
+ PARAMETER ( JP23SET = 2**23 - 1 )
+C ^---> 8388607 = 7FFFFF(hex)
+ PARAMETER ( JP16SET = 2**16 - 1 )
+C ^---> 65535 = FFFF(hex)
+ PARAMETER ( JP8SET = 2**8 - 1 )
+C ^---> 255 = FF(hex)
+C
+C Predetermined bitmask variables
+C
+#ifndef USE_NO_POINTERS
+ INTEGER IBTMAP, IBTVALS
+#ifdef POINTER_64
+ INTEGER*8 IBTPTR
+#endif
+ POINTER (IBTPTR,IBTMAP)
+ DIMENSION IBTMAP(1)
+#endif
+C
+#include "grbcom.h"
+C
+C Missing data indicator for integer and real values in GRIB code
+C header fields.
+C
+ EQUIVALENCE (IMISNG,ZMISNG)
+C
+ EQUIVALENCE (ZREAL4,ISINT)
+C
+ SAVE INITAL, IBITS, IMISNG, NBYTE
+C
+C Characters GRIB and 7777 in Ascii for use in Sections 0 and 5
+C of GRIB code.
+C
+ DATA IGRIB /71,82,73,66/
+ DATA I7777 /55,55,55,55/
+ DATA YGRIBEX/'13.040'/, IGRIBEX/13040/
+C
+C Initialise local variables
+C
+ DATA YFUNC/' '/,YTEMP/' '/
+ DATA IJDC/0/,JLOOP/0/,JLOOPO/0/
+#ifdef REAL_BIGGER_THAN_INTEGER
+ DATA IINDEX/0/,ILOOPS/0/,NREM/0/,ILNGTH/0/
+#endif
+ DATA IJDCXX/0/,I/0/,IBLEN/0/,IBITS/0/,IBMAP/0/,IBMAP2/0/
+ DATA IBYTEX/0/,ICOUNT/0/,NBYTE/0/
+ DATA IEXP/0/,IFLAG/0/,IFLAGX/0/,IFPT/0/,IL/0/
+ DATA ILEN/0/,ILENF/0/,ILEN1/0/,ILEN2/0/,ILEN3/0/,ILEN4/0/
+ DATA IMANT/0/,IMISNG/0/,IMISS/0/,IMODAY/0/,INC/0/
+ DATA INIL/0/,INITAL/0/,INOLAT/0/,INOLNG/0/,INSPT/0/,INUB/0/
+ DATA INUM/0/,IOFF/0/,IPL/0/,IPLEN/0/,IPSEUD/0/
+ DATA IPVPL/0/,IRESOL/0/,ISBMAP/0/,NONMISS/0/
+ DATA ISCALE/0/,ISINT/0/,ISKALE/0/
+ DATA ISKIP/0/,ITEMP/0/,ITRND/0/,IVALS/0/,IP7777/0/
+ DATA IEAST/0/,IWEST/0/,ILOEXT/0/,INROWS/0/
+C
+ DATA KRETA/0/,KRETB/0/,ITRUNC/0/,ISUBSET/0/
+C
+ DATA ZMAXV/0.0/,ZMAX/0.0/,ZMIN/0.0/,ZMSVAL/0.0/
+ DATA ZREF/0.0/,ZVAL/0.0/,ZS/0.0/,ZAUXIL/0.0/,ZSCALE/0.0/
+C
+ DATA LENCODE/.FALSE./,LDECODE/.FALSE./,LPDEBUG/.FALSE./
+ DATA LGRDPT/.FALSE./,LSPHERC/.FALSE./,LCOMPLX/.FALSE./
+ DATA LECMWF/.FALSE./,LECLOC/.FALSE./,LKWBCE/.FALSE./
+ DATA LSST11/.FALSE./,LLARGE/.FALSE./,LQUASI/.FALSE./
+ DATA LSECT2/.FALSE./,LSECT3/.FALSE./,LPERIO/.FALSE./
+ DATA L_IORJ/.FALSE./,LALLPOS/.FALSE./
+C
+C -----------------------------------------------------------------|
+C* Section 1 . Set initial values.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+C Handle 'V' option - display version number
+C
+ IF( HOPER(1:1).EQ.'V' ) THEN
+ WRITE(GRPRSM,*) 'GRIBEX: Version is ',YGRIBEX
+ KRET = IGRIBEX
+ RETURN
+ ENDIF
+C
+C Clear definition 13 flag
+C
+ N13FLAG = -1
+C
+C Clear flag indicating GRIB product longer than 2**23-1 bytes long.
+ LLARGE = .FALSE.
+C
+C Initialise flag indicating 'quasi-regular grid'
+ LQUASI = .FALSE.
+C
+C* Set number of bits per computer word,missing data indicator and
+C the number of bytes per computer word first time through.
+C Try to set default values for parameters in common area,
+C if not already set by user via calls to the GRS--- routines.
+C
+ IF( INITAL.EQ.0) THEN
+ CALL SETPAR (IBITS,IMISNG,NDBG)
+ NBYTE = IBITS/8
+ INITAL = 1
+ CALL GRSDEF
+ ENDIF
+C
+ IMISS = 0
+C
+C
+C Set encoding/decoding flags initially dependent on 'L' option,
+C since this option skips round most processing.
+ LENCODE = ( HOPER(1:1) .NE. 'L' )
+ LDECODE = ( HOPER(1:1) .EQ. 'L' )
+C
+ LPDEBUG = ( NDBG.GE.1 )
+C
+ IF( LPDEBUG ) THEN
+ WRITE(GRPRSM,*) 'GRIBEX: Version is ',YGRIBEX
+ WRITE(GRPRSM,*) 'GRIBEX: Section 1. Input values used -'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Length of GRIB array (KLENG) = ',KLENG
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Length of data array (KLENP) = ',KLENP
+ WRITE(GRPRSM,*) 'GRIBEX: Operation code = ', HOPER
+Ce
+Ce Extra printout if encoding
+Ce
+ IF( HOPER.EQ.'C'.OR.HOPER.EQ.'M'.OR.HOPER.EQ.'K') THEN
+ KSEC0(2) = JPEDNO
+ CALL GRPRS1(KSEC0,KSEC1)
+Ce
+ LSECT2 = KSEC1(5).GE.128
+ LSECT3 = MOD(KSEC1(5),128).GE.64
+Ce
+Ce Print section 2 if present.
+Ce
+ IF( LSECT2 ) CALL GRPRS2(KSEC0,KSEC2,PSEC2)
+Ce
+Ce Print section 3 if present.
+Ce
+ IF( LSECT3 ) CALL GRPRS3(KSEC0,KSEC3,PSEC3)
+Ce
+Ce Print section 4.
+Ce
+ CALL GRPRS4(KSEC0,KSEC4,PSEC4)
+Ce
+Ce Special print for 2D spectra wave field real values in
+Ce section 4
+Ce
+ IF( (KSEC1(1).EQ.140) .AND.
+ X (KSEC1(2).EQ. 98) .AND.
+ X (KSEC1(24).EQ. 1) .AND.
+ X ( (KSEC1(40).EQ.1045).OR.(KSEC1(40).EQ.1081) ) .AND.
+ X ( (KSEC1(6) .EQ. 250).OR.(KSEC1(6) .EQ. 251) ) )
+ X CALL GRPRS4W(KSEC4)
+ ENDIF
+ ENDIF
+C
+C Reset return code to 0, retaining input value to decide
+C on abort / no abort, if error encountered later.
+C
+ NOABORT = KRET
+ KRET = 0
+C
+C IPSEUD is used to indicate pseudo-GRIB data encountered,
+C when decoding.
+C ISBMAP is the bit-map section flag and indicates what decoding
+C has been done on bit-maps and data.
+C See informative return codes for KRET when decoding.
+C
+ IPSEUD = 0
+ ISBMAP = 0
+C
+C Reset bit-pointer to 0.
+C
+ INSPT = 0
+C
+C -----------------------------------------------------------------|
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Check input parameters.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Section 2. Check input parameters.'
+C
+C* Check that valid function has been requested.
+C
+ YFUNC = HOPER
+#ifdef USE_NO_POINTERS
+ IF( YFUNC.EQ.'R' ) THEN
+ KRET = 201
+ WRITE(GRPRSM,*) 'GRIBEX: Invalid function requested - ',HOPER
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+#endif
+ L_IORJ = (HOPER.EQ.'I').OR.(HOPER.EQ.'J')
+ IF( YFUNC.NE.'C'.AND.YFUNC.NE.'D'.AND.(.NOT.L_IORJ).AND.
+ X YFUNC.NE.'L'.AND.YFUNC.NE.'R'.AND.YFUNC.NE.'S'.AND.
+ X YFUNC.NE.'X'.AND.YFUNC.NE.'Z'.AND.YFUNC.NE.'M'.AND.
+ X YFUNC.NE.'G'.AND.YFUNC.NE.'A'.AND.YFUNC.NE.'B'.AND.
+ X YFUNC.NE.'K') THEN
+ KRET = 201
+ WRITE(GRPRSM,*) 'GRIBEX: Invalid function requested - ',HOPER
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C Function 'A' encodes 8-bit data.
+ IF( HOPER.EQ.'A') YFUNC = 'C'
+C
+C Function 'B' decodes 8-bit data.
+ IF( HOPER.EQ.'B') YFUNC = 'D'
+C
+C* Function 'L' returns the length of the GRIB message and
+C GRIB Edition number only, so no array initialisation is
+C necessary.
+C
+ IF( YFUNC.EQ.'L') GO TO 300
+C
+C* Function 'M' is for coding data, and if a bit map is encountered
+C GRIB messages are made a fixed length. HOPER is passed to the
+C bit-map handling routine.
+C
+ IF( HOPER.EQ.'M') YFUNC = 'C'
+C
+C* Function 'K' is the same as 'C', but for grid-point fields,
+C an "aggressive packing" is performed: all user-allowed strategies
+C for second-order packing are attempted, in order to make the
+C shortest GRIB message.
+C
+ IF( HOPER.EQ.'K') YFUNC = 'C'
+C
+C* Function 'I' is for decoding of sections 0, 1 and 2
+C of GRIB code only. Value of HOPER is checked at the start of
+C decoding section 3.
+C* Function 'J' is for decoding of sections 0, 1, 2, 3 and 4.
+C
+ IF( L_IORJ) YFUNC = 'D'
+C
+C* Function 'R' is the same as 'D', but if a quasi-regular
+C Gaussian is encountered, it is converted to a regular one.
+C Value of HOPER is checked near end of section 8.
+C
+ IF( HOPER.EQ.'R') YFUNC = 'D'
+C
+C* Function 'S' is the same as 'D', but if analysis data in
+C GRIB Experimental Edition is encountered, the time range
+C indicator flag is set to indicate initialised analysis.
+C Value of HOPER is checked when time range indicator has
+C been extracted.
+C
+ IF( HOPER.EQ.'S') YFUNC = 'D'
+C
+C* Function 'X' is the same as 'D', but only the data
+C at the requested points is unpacked.
+C Value of HOPER is checked prior to unpacking data values.
+C
+ IF( HOPER.EQ.'X') YFUNC = 'D'
+C
+C* Function 'G' is the same as 'D', but only the reference
+C value and scale factor are unpacked. A pointer to packed data
+C is returned.
+C Value of HOPER is checked prior to unpacking data values.
+C
+ IF( HOPER.EQ.'G') YFUNC = 'D'
+C
+C* Function 'Z' is for decoding only the information which could
+C be handled by the the old decoding routine DECOGB (eg no bit
+C maps) and is used by the new DECOGB interface.
+C
+ IF( HOPER.EQ.'Z') YFUNC = 'D'
+C
+ LENCODE = ( YFUNC.EQ.'C' )
+ LDECODE = ( YFUNC.EQ.'D' )
+Cd
+Cd Set up the definition 13 flag variable
+Cd
+ IF( LDECODE ) N13FLAG = D13FLAG(KGRIB)
+C
+C* Preset some arrays to 0.
+C
+ IF( LENCODE ) THEN
+Ce
+Ce Check number of bits per data field fits size of computer word.
+Ce
+ IF( IBITS.LT.KSEC4(2)) THEN
+ KRET = 202
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Number of bits per data value = ',KSEC4(2)
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: This exceeds word length which = ',IBITS
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Ce
+Ce Check number of bits is not zero or negative
+Ce
+ IF( KSEC4(2) .LT. 0 ) THEN
+ KRET = 204
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Number of bits per data value = ',KSEC4(2)
+ WRITE(GRPRSM,*) 'GRIBEX: This must be positive.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GOTO 900
+ ELSEIF( KSEC4(2) .EQ. 0 ) THEN
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Number of bits per data value = ',KSEC4(2)
+ KSEC4(2) = 8
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: This must be positive - enforced to ',
+ X KSEC4(2)
+ ENDIF
+Ce
+Ce Check if number of bits per packed value = number of bits per
+Ce computer word.
+Ce
+ LALLPOS = KSEC4(2) .EQ. IBITS
+Ce
+Ce If entire field is missing, check that all data values are zero.
+Ce
+ IF( KSEC4(1).LT.0) THEN
+ IMISS = 1
+ ILENF = - KSEC4(1)
+ DO 210 JLOOP = 1 , ILENF
+ IF( PSEC4(JLOOP).NE.0.0) THEN
+ KRET = 203
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Non-zero value in missing data field.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ 210 CONTINUE
+ ELSE
+ IMISS = 0
+ ILENF = KSEC4(1)
+ ENDIF
+Ce
+Ce If input data is integer, change it to real.
+Ce
+ IF( ( KSEC4(5).EQ.32 ).AND.( HOPER.NE.'A' ) )
+ X CALL RORINT(PSEC4,PSEC4,ILENF,'R')
+Ce
+ DO 215 JLOOP = 21,24
+ KSEC4(JLOOP) = 0
+ 215 CONTINUE
+Ce
+ ELSE
+Cd
+Cd Preset arrays to receive section header information to 0.
+Cd Routine GSBITE resets data array to 0.
+Cd
+ DO 220 JLOOP = 1,25
+ KSEC1(JLOOP) = 0
+ 220 CONTINUE
+Cd
+ DO 230 JLOOP = 1,22
+ KSEC2(JLOOP) = 0
+ 230 CONTINUE
+Cd
+ DO 240 JLOOP = 1,33
+ KSEC4(JLOOP) = 0
+ 240 CONTINUE
+Cd
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 3 . Indicator Section (Section 0) of GRIB code.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C#ifdef GRIB2
+C IF( LENCODE.AND.(KSEC0(2).EQ.2) ) THEN
+C IF( LPDEBUG ) WRITE(GRPRSM,*) 'GRIBEX: Section 3. Handle GRIB2'
+C KRET = G2ENCOD(KSEC0,KSEC1,KSEC2,KSEC3,KSEC4,
+C X PSEC2,PSEC3,PSEC4,PSEC3(2))
+C RETURN
+C ENDIF
+C#endif
+C
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Section 3. Handle GRIB Indicator Section (Section 0)'
+C
+C* Octets 1 - 4 : The letters G R I B.
+C Four 8 bit fields.
+C
+ IF( LENCODE ) THEN
+Ce
+Ce Insert the letters G R I B.
+Ce
+ CALL INXBIT(KGRIB,KLENG,INSPT,IGRIB(1),4,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 301
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting letters GRIB'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ ELSE
+Cd
+Cd When decoding data, check letters -> GRIB, BUDG or TIDE.
+Cd
+ CALL INXBIT(KGRIB,KLENG,INSPT,IPARM(1),4,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 301
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting letters GRIB'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cd
+Cd Check that 'GRIB' is found where expected.
+Cd
+ IF( IPARM(1).EQ.71.AND.IPARM(2).EQ.82.AND.
+ X IPARM(3).EQ.73.AND.IPARM(4).EQ.66) GO TO 310
+Cd
+Cd ECMWF pseudo-grib data uses 'BUDG' and 'TIDE'.
+Cd
+ IF( IPARM(1).EQ.66.AND.IPARM(2).EQ.85.AND.
+ X IPARM(3).EQ.68.AND.IPARM(4).EQ.71) GO TO 310
+Cd
+ IF( IPARM(1).EQ.84.AND.IPARM(2).EQ.73.AND.
+ X IPARM(3).EQ.68.AND.IPARM(4).EQ.69) GO TO 310
+Cd
+Cd Data is not GRIB or pseudo-grib.
+Cd
+ KRET = 305
+ WRITE(GRPRSM,*) 'GRIBEX: Input data is not GRIB or pseudo-grib.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+Cd
+ ENDIF
+C
+ 310 CONTINUE
+C
+C* Octets 5 - 7 : Length of message.
+C One 24 bit field.
+C
+ IF( LENCODE ) THEN
+Ce
+Ce When coding data, skip field. Length is inserted
+Ce later, when known.
+Ce Update bit-pointer.
+Ce
+ INSPT = INSPT + 24
+ ELSE
+Cd
+Cd Extract field.
+Cd
+ CALL INXBIT(KGRIB,KLENG,INSPT,ITEMP,1,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 302
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error extracting length of GRIB message.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cd
+Cd When decoding, use most-significant bit as a sign bit.
+Cd
+ IF( LDECODE ) CALL DSGNBT( KSEC0(1), ITEMP, 24, KRET)
+Cd
+Cd If count is negative, have to rescale by factor of -120.
+Cd This is a fixup to get round the restriction on product lengths
+Cd due to the count being only 24 bits. It is only possible because
+Cd the (default) rounding for GRIB products is 120 bytes.
+Cd
+ IF( KSEC0(1).LT.0 ) THEN
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Special case, negative length multiplied by -120'
+ LLARGE = .TRUE.
+ KSEC0(1) = KSEC0(1) * (-120)
+ ENDIF
+ ENDIF
+C
+C* Octet 8 : GRIB Edition Number.
+C One 8 bit field.
+C
+ IF( LENCODE ) THEN
+Ce
+Ce Set value, if coding data.
+Ce
+ KSEC0(2) = JPEDNO
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC0(2),1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 303
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting GRIB Edition Number.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Ce
+ ELSE
+Cd
+Cd Extract field.
+Cd
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC0(2),1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 303
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting GRIB Edition Number.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cd
+Cd When decoding or calculating length, previous editions
+Cd of the GRIB code must be taken into account.
+Cd
+Cd In the table below, covering sections 0 and 1 of the GRIB
+Cd code, octet numbering is from the beginning of the GRIB
+Cd message;
+Cd * indicates that the value is not available in the code edition;
+Cd R indicates reserved, should be set to 0;
+Cd Experimental edition is considered as edition -1.
+Cd
+Cd GRIB code edition -1 has fixed length of 20 octets for
+Cd section 1, the length not included in the message.
+Cd GRIB code edition 0 has fixed length of 24 octets for
+Cd section 1, the length being included in the message.
+Cd GRIB code edition 1 can have different lengths for section
+Cd 1, the minimum being 28 octets, length being included in
+Cd the message.
+Cd
+Cd Octet numbers for code
+Cd editions
+Cd
+Cd Contents. -1 0 1
+Cd --------- ----------------------
+Cd Letters GRIB 1-4 1-4 1-4
+Cd Total length of GRIB message. * * 5-7
+Cd GRIB code edition number * * 8
+Cd Length of Section 1. * 5-7 9-11
+Cd Reserved octet (R). * 8(R) *
+Cd Version no. of Code Table 2. * * 12
+Cd Identification of centre. 5 9 13
+Cd Generating process. 6 10 14
+Cd Grid definition . 7 11 15
+Cd Flag (Code Table 1). 8 12 16
+Cd Indicator of parameter. 9 13 17
+Cd Indicator of type of level. 10 14 18
+Cd Height, pressure etc of levels. 11-12 15-16 19-20
+Cd Year of century. 13 17 21
+Cd Month. 14 18 22
+Cd Day. 15 19 23
+Cd Hour. 16 20 24
+Cd Minute. 17 21 25
+Cd Indicator of unit of time. 18 22 26
+Cd P1 - Period of time. 19 23 27
+Cd P2 - Period of time 20(R) 24 28
+Cd or reserved octet (R).
+Cd Time range indicator. 21(R) 25 29
+Cd or reserved octet (R).
+Cd Number included in average. 22-23(R) 26-27 30-31
+Cd or reserved octet (R).
+Cd Number missing from average. 24(R) 28(R) 32
+Cd or reserved octet (R).
+Cd Century of data. * * 33
+Cd Designates sub-centre if not 0. * * 34
+Cd Decimal scale factor. * * 35-36
+Cd Reserved. Set to 0. * * 37-48
+Cd (Need not be present)
+Cd For originating centre use only. * * 49-nn
+Cd (Need not be present)
+Cd
+Cd Identify which GRIB code edition is being decoded.
+Cd
+Cd In GRIB edition 1, the edition number is in octet 8.
+Cd In GRIB edition 0, octet 8 is reserved and set to 0.
+Cd In GRIB edition -1, octet 8 is a flag field and can have a
+Cd a valid value of 0, 1, 2 or 3.
+Cd
+Cd However, GRIB edition number 0 has a fixed
+Cd length of 24, included in the message, for section 1, so
+Cd if the value extracted from octets 5-7 is 24 and that from
+Cd octet 8 is 0, it is safe to assume edition 0 of the code.
+Cd
+ IF( KSEC0(1).EQ.24.AND.KSEC0(2).EQ.0) THEN
+Cd
+Cd Set bit-pointer back by 32 bits (4 octets).
+ INSPT = INSPT - 32
+Cd
+Cd Set length of GRIB message to missing data value.
+ KSEC0(1) = IMISNG
+Cd
+ GO TO 400
+ ENDIF
+Cd
+Cd In GRIB Edition -1, octets 22 and 23 are reserved and set
+Cd to 0. These octets in Edition 1 are the month and the day,
+Cd and must be non-zero.
+Cd
+ ITEMP = 168
+ CALL INXBIT(KGRIB,KLENG,ITEMP,IMODAY,1,IBITS, 16,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 304
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error extracting octets 22 and 23 for'
+ WRITE(GRPRSM,*) 'GRIBEX: Experimental Edition check.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cd
+ IF( IMODAY.EQ.0) THEN
+Cd
+Cd Set bit-pointer back by 32 bits (4 octets).
+ INSPT = INSPT - 32
+Cd
+ KSEC0(2) = -1
+Cd
+Cd Set length of GRIB message to missing data value.
+Cd
+ KSEC0(1) = IMISNG
+Cd
+Cd Set length of section 1 of GRIB code to 20 octets.
+Cd
+ ILEN1 = 20
+Cd
+Cd Skip next 4 octets, as they do not exist in
+Cd the Experimental Edition of the code. ie
+Cd length of Section and Table 2 Version Number.
+Cd
+ GO TO 401
+ ENDIF
+Cd
+ ENDIF
+C
+C* If Grib Edition 1 and only length is required, go to section 9.
+C
+ IF( YFUNC.EQ.'L') GO TO 900
+C
+C -----------------------------------------------------------------|
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 4 . Product Definition Section (Section 1) of GRIB code.
+C -----------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Section 4. Handle Product Definition (Section 1)'
+C
+C* Check consistency of values given, with GRIB code, if required.
+C
+ IF( NVCK.EQ.1.AND. LENCODE ) THEN
+ CALL GRCHK1(KSEC1,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 499
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error found when checking values for'
+ WRITE(GRPRSM,*) 'GRIBEX: Section 1 against valid GRIB values.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ ENDIF
+C
+C* Octets 1 - 3 : Length of Section.
+C One 24 bit field.
+C
+ IF( LENCODE ) THEN
+Ce
+Ce Set value, if coding data.
+ ILEN1 = JPLEN1
+Ce
+Ce Extra octets if ECMWF local definition usage in section 1.
+Ce
+ LECMWF = (KSEC1(2) .EQ.98)
+ LECLOC = (KSEC1(2) .EQ.98) .OR.
+ X (KSEC1(22).EQ.98)
+ LSST11 = (KSEC1( 6).EQ.139) .AND.
+ X (KSEC1( 7).EQ. 1) .AND.
+ X (KSEC1(22).EQ. 98)
+ LKWBCE = (KSEC1( 2).EQ. 7) .AND.
+ X (KSEC1(22).NE. 98)
+Ce
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Local extension in use for...'
+ IF( LPDEBUG.AND.LECLOC ) WRITE(GRPRSM,*)
+ X 'GRIBEX: ECMWF data'
+ IF( LPDEBUG.AND.LKWBCE ) WRITE(GRPRSM,*)
+ X 'GRIBEX: KWBC ensemble data'
+ IF( LPDEBUG.AND.LSST11 ) WRITE(GRPRSM,*) 'GRIBEX: SST data'
+Ce
+ ENDIF
+C
+C Insert / extract field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILEN1,1,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 401
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting length of Section 1.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* Octet 4 : Version Number of Table 2.
+C One 8 bit field.
+C
+C Insert / extract field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC1(1),1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 402
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting Param Table Version No.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+ 401 CONTINUE
+C
+C* Check Edition number.
+C
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: GRIB Edition Number = ',KSEC0(2)
+ IF( KSEC0(2).GT.1) THEN
+ KRET = 413
+ WRITE(GRPRSM,*) 'GRIBEX: Grib Edition not catered for.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* Print length of Section 1, if required.
+C
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Length of Section 1 of GRIB = ',ILEN1,' octets.'
+C
+C* Octet 5 : Identification of centre.
+C Octet 6 : Generating process identification.
+C Octet 7 : Grid definition.
+C Octet 8 : Flag.
+C Octet 9 : Indicator of parameter.
+C Octet 10 : Indicator of type of level.
+C (or satellite identifier)
+C Satellite useage as defined by INPE/CPTEC
+C and used by ECMWF, pending final definition
+C by WMO.
+C Six 8 bit fields.
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC1(2),6,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 403
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting six fields from'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Identification of Centre to Indicator of'
+ WRITE(GRPRSM,*) 'GRIBEX: type of level.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C If decoding, fix-up for Experimental Edition and Edition 0
+C of GRIB code.
+C
+ IF( .NOT. LENCODE ) THEN
+Cd
+Cd Set logical flag for ECMWF data
+Cd
+ LECMWF = (KSEC1(2).EQ.98)
+Cd
+Cd In GRIB Experimental Edition and Edition 0
+Cd the International Table Version Number in use was 0.
+Cd ECMWF has always used its own local table. It is the same
+Cd for Experimental Edition, Edition 0 and Edition 1 and is
+Cd local table number 128.
+Cd
+ IF( KSEC0(2).LT.1) THEN
+ IF( LECMWF ) THEN
+Cd
+Cd ECMWF data. Local table number.
+ KSEC1(1) = 128
+ ELSE
+Cd
+Cd International table number.
+Cd KSEC1(1) = 0 is already preset.
+ ENDIF
+ ENDIF
+Cd
+Cd Fix-up for flag field, which was different in Experimental
+Cd Edition.
+Cd
+Cd Experimental Editions 0 and 1
+Cd Edition
+Cd
+Cd Sections Binary Decimal Binary Decimal
+Cd included value value value value
+Cd
+Cd none 00000000 0 00000000 0
+Cd 2 00000001 1 10000000 128
+Cd 3 00000010 2 01000000 64
+Cd 2 and 3 00000011 3 11000000 192
+Cd
+ IF( KSEC0(2).EQ.-1) THEN
+ IF( KSEC1(5).EQ.1) KSEC1(5) = 128
+ IF( KSEC1(5).EQ.2) KSEC1(5) = 64
+ IF( KSEC1(5).EQ.3) KSEC1(5) = 192
+ ENDIF
+ ENDIF
+ LSECT2 = KSEC1(5).GE.128
+ LSECT3 = MOD(KSEC1(5),128).GE.64
+C
+C* Once the flag field has been extracted, no further fields
+C from section 1 of the GRIB code are required, when length
+C of GRIB or pseudo-Grib message only is required.
+C
+ IF( YFUNC.EQ.'L') THEN
+C
+C Length of section 0 + section 1 is 28 octets (224 bits)
+C for GRIB Edition 0 and 24 octets (192 bits) for
+C Experimental edition.
+C Set bit-pointer and jump to extraction of length of section 3.
+C
+ INSPT = 224
+ IF( KSEC0(2).EQ.-1) INSPT = 192
+ GO TO 500
+ ENDIF
+C
+C* Octets 11 - 12 : Height, pressure etc of levels or
+C satellite spectral band.
+C Satellite useage as defined by INPE/CPTEC
+C and used by ECMWF, pending final definition
+C by WMO.
+C One 16 bit field or two 8 bit fields.
+C
+C Satellite image if WMO table and parameter 127
+C
+ LSATIMG = ((KSEC1(1).LT.128).AND.(KSEC1(6).EQ.127))
+C
+C For certain level types, no description is necessary, so when
+C decoding the fields are set to 0 regardless of bit string content.
+C
+ IF( (.NOT.LENCODE).AND.
+ X (.NOT.LSATIMG).AND.
+ X ( ((KSEC1(7).LT.100).AND.(KSEC1(7).NE.20)).OR.
+ X (KSEC1(7).EQ.102) .OR.
+ X (KSEC1(7).EQ.200) .OR.
+ X (KSEC1(7).EQ.201) ) ) THEN
+Cd
+Cd Update bit-pointer and skip extraction.
+ KSEC1(8) = 0
+ KSEC1(9) = 0
+ INSPT = INSPT + 16
+ GO TO 402
+ ENDIF
+C
+C Certain level types require that the description occupies
+C both octets.
+C Satellite Spectral band occupies both octets.
+C Satellite useage as defined by INPE/CPTEC
+C and used by ECMWF, pending final definition by WMO.
+C Image data uses 2 octets.
+C
+ IF( (KSEC1(7).NE. 20).AND.
+ X (KSEC1(7).NE.100).AND.
+ X (KSEC1(7).NE.103).AND.
+ X (KSEC1(7).NE.105).AND.
+ X (KSEC1(7).NE.107).AND.
+ X (KSEC1(7).NE.109).AND.
+ X (KSEC1(7).NE.111).AND.
+ X (KSEC1(7).NE.113).AND.
+ X (KSEC1(7).NE.115).AND.
+ X (KSEC1(7).NE.117).AND.
+ X (KSEC1(7).NE.125).AND.
+ X (KSEC1(7).NE.127).AND.
+ X (KSEC1(7).NE.160).AND.
+ X (KSEC1(7).NE.210).AND.
+ X (.NOT.LSATIMG) ) THEN
+C
+C Two 8 bit fields.
+ INUM = 2
+ IBLEN = 8
+ ELSE
+C
+C One 16 bit field.
+ INUM = 1
+ IBLEN = 16
+ KSEC1(9) = 0
+ ENDIF
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC1(8),INUM,IBITS,
+ X IBLEN,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 404
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting Height,'
+ WRITE(GRPRSM,*) 'GRIBEX: pressure, etc of levels.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* Fix-up for ECMWF upper-air data incorrectly coded in Experimental
+C Edition.
+C
+ IF( KSEC0(2).EQ.-1.AND. LECMWF ) THEN
+ ITEMP = INSPT - 16
+ INUM = 2
+ IBLEN = 8
+ CALL INXBIT(KGRIB,KLENG,ITEMP,KSEC1(8),INUM,IBITS,
+ X IBLEN,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 404
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting Height,'
+ WRITE(GRPRSM,*) 'GRIBEX: pressure, etc of levels.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ KSEC1(8) = KSEC1(8) * 32 + KSEC1(9)
+ KSEC1(9) = 0
+ ENDIF
+C
+ 402 CONTINUE
+C
+C* Octet 13 : Year of century.
+C Octet 14 : Month.
+C Octet 15 : Day.
+C Octet 16 : Hour.
+C Octet 17 : Minute.
+C Octet 18 : Indicator of unit of time range..
+C Six 8 bit fields.
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC1(10),6,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 405
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting six fields from'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Year of century to Indicator of unit of'
+ WRITE(GRPRSM,*) 'GRIBEX: time range.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* Fix-up for unit of time, which was different in Experimental
+C Edition.
+C
+C
+C Experimental Editions 0 and 1
+C Edition
+C
+C Meaning Decimal Decimal
+C value value
+C
+C Minute 0 or 30 0
+C Hour 1 or 40 1
+C Day 2 or 50 2
+C Month 3 or 60 3
+C Year 4 or 70 4
+C Decade 5 or 80 5
+C Normal 6 6
+C Century 7 or 90 7
+C Second - 254
+C
+ IF( KSEC0(2).EQ.-1) THEN
+ IF( KSEC1(15).EQ.90) KSEC1(15) = 7
+ IF( KSEC1(15).GT.10) KSEC1(15) = (KSEC1(15) / 10) - 3
+ ENDIF
+C
+C* Octets 19 - 20 : Period of time.
+C One 16 bit field or two 8 bit fields.
+C
+ IF( LENCODE .AND.KSEC1(18).EQ.10) THEN
+Ce
+Ce One 16 bit field.
+ INUM = 1
+ IBLEN = 16
+ ELSE
+Ce
+Ce Two 8 bit fields.
+ INUM = 2
+ IBLEN = 8
+ ENDIF
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC1(16),INUM,IBITS,
+ X IBLEN,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 406
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting Period of time.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* Octet 21 : Time range indicator.
+C One 8 bit field.
+C
+C Insert / extract field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC1(18),1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 407
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting time range indicator.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* When decoding, period of time field and time range
+C indicator may need modification.
+C
+ IF( .NOT. LENCODE ) THEN
+Cd
+Cd When decoding, length of period of time field is known
+Cd only at this time. If a 16 bit field is indicated, put
+Cd the two extracted 8-bit fields together.
+Cd
+ IF( KSEC1(18).EQ.10) THEN
+Cd
+Cd One 16 bit field.
+ KSEC1(16) = KSEC1(16) * 256 + KSEC1(17)
+ KSEC1(17) = 0
+ ENDIF
+Cd
+Cd If data is known to be initialised analysis and GRIB is
+Cd Experimental Edition, set time range indicator flag.
+Cd
+ IF( KSEC1(16).EQ.0.AND.HOPER.EQ.'S'.AND.KSEC0(2).EQ.-1)
+ X KSEC1(18) = 1
+Cd
+ ENDIF
+C
+C* Octet 22 - 23 : Number averaged.
+C One 16 bit field.
+C
+C Insert / extract field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC1(19),1,IBITS, 16,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 408
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting number averaged.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* Octet 24 : Number missing from averages etc.
+C One 8 bit field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC1(20),1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 409
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting number missing'
+ WRITE(GRPRSM,*) 'GRIBEX: from averages etc.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* This is the end of Section 1 if Edition 0 or -1 of GRIB code.
+C Set other fields to be compatible with Edition 1, where possible.
+C
+ IF( KSEC0(2).LT.1) THEN
+C
+C Century of data.
+C
+C All ECMWF data in Edition 0 or -1 is 20th century.
+C Otherwise set century to missing data value.
+C
+ IF( LECMWF ) THEN
+ KSEC1(21) = 20
+ ELSE
+ KSEC1(21) = IMISNG
+ ENDIF
+C
+C Reserved field and decimal scale factor field (which
+C was always 0).
+C
+C KSEC1(22) and KSEC1(23) set to 0.
+C
+ KSEC1(22) = 0
+ KSEC1(23) = 0
+ GO TO 499
+ ENDIF
+C
+C* Octet 25 : Century of data.
+C One 8 bit field.
+C
+C Insert / extract field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC1(21),1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 410
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting century of data'
+ WRITE(GRPRSM,*) 'GRIBEX: or reserved field.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* Octet 26 : Sub-centre.
+C ( Now used at ECMWF/Washington to designate a sub-centre
+C = 2 for NMC ensemble products(decoding only).
+C = 98 for EPS products from Washington with ECMWF extensions.
+C = 231 Meteo France Climate Centre (ECSN)
+C = 232 MPI Climate Centre (ECSN)
+C = 233 UKMO Climate Centre (ECSN)
+C = 240 for ECMWF seasonal forecast centre (PROVOST).
+C = 241 for Meteo France seasonal forecast centre (PROVOST).
+C = 242 for EDF seasonal forecast centre (PROVOST).
+C = 243 for UKMO seasonal forecast centre (PROVOST).
+C = 0 otherwise. )
+C
+C One 8 bit field.
+C
+ IF( LENCODE ) THEN
+Ce
+Ce When coding ECMWF data, sub-centre is set to 0 unless a
+Ce designated sub-centre or explicitly enabled by previous user
+Ce call to GRSUBC.
+Ce
+ IF( .NOT.LECMWF .OR. NSUBCE.EQ.1 ) THEN
+ ITEMP = KSEC1(22)
+Ce
+ ELSE IF( (KSEC1(22).EQ. 98) .OR.
+ X (KSEC1(22).EQ.231) .OR.
+ X (KSEC1(22).EQ.232) .OR.
+ X (KSEC1(22).EQ.233) .OR.
+ X (KSEC1(22).EQ.240) .OR.
+ X (KSEC1(22).EQ.241) .OR.
+ X (KSEC1(22).EQ.242) .OR.
+ X (KSEC1(22).EQ.243) )THEN
+ ITEMP = KSEC1(22)
+Ce
+ ELSE
+ ITEMP = 0
+ ENDIF
+ ENDIF
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT, ITEMP, 1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 810
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting dummy zero.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+Cd
+ IF( LDECODE ) THEN
+Cd
+Cd When decoding, KSEC1(22) is set to message content.
+Cd
+ KSEC1(22) = ITEMP
+Cd
+Cd Set flags for known special local extensions to section 1:
+Cd ECMWF data
+Cd Washington SST data
+Cd Washington ensemble data
+Cd
+ LECLOC = (KSEC1(2).EQ.98) .OR.
+ X (KSEC1(22).EQ.98)
+ LSST11 = (KSEC1( 6).EQ.139) .AND.
+ X (KSEC1( 7).EQ. 1) .AND.
+ X (KSEC1(22).EQ. 98)
+ LKWBCE = (KSEC1( 2).EQ. 7) .AND.
+ X (KSEC1(22).NE. 98)
+Cd
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Local extension in use for...'
+ IF( LPDEBUG.AND.LECLOC ) WRITE(GRPRSM,*) 'GRIBEX: ECMWF data'
+ IF( LPDEBUG.AND.LKWBCE ) WRITE(GRPRSM,*)
+ X 'GRIBEX: KWBC ensemble data'
+ IF( LPDEBUG.AND.LSST11 ) WRITE(GRPRSM,*) 'GRIBEX: SST data'
+Cd
+ ENDIF
+C
+C* Octets 27 - 28 : Units decimal scale factor.
+C One 16 bit field.
+C
+C When coding, set sign bit if value is negative.
+C
+ IF( LENCODE ) CALL CSGNBT( ITEMP, KSEC1(23), 16, KRET)
+C
+C Insert / extract field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ITEMP,1,IBITS, 16,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 411
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting units decimal'
+ WRITE(GRPRSM,*) 'GRIBEX: scale factor.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C When decoding, set sign bit if value is negative.
+C
+ IF( LDECODE ) CALL DSGNBT( KSEC1(23), ITEMP, 16, KRET)
+C
+ IF( LENCODE ) THEN
+Ce
+Ce When coding data, the reserved octets 29-40 need not
+Ce be present and are not included, unless ECMWF local
+Ce use of octets 41 onwards is indicated.
+Ce
+ IF( KSEC1(24).EQ.1.AND.((LECLOC.OR.LSST11).OR.LKWBCE)) THEN
+Ce
+Ce Fill reserved octets with 0.
+Ce
+ DO 410 JLOOP = 29,40
+ CALL INXBIT(KGRIB,KLENG,INSPT, 0, 1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 810
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting dummy zero.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ 410 CONTINUE
+Ce
+Ce Have to set sectionLength for KWBC ensemble products to
+Ce force proper encoding
+Ce
+ IF( LKWBCE ) THEN
+ IF( KSEC1(42).NE.0) THEN
+ IF( KSEC1(46).NE.0) THEN
+#ifdef linux
+ ISECLEN = (256 + 86)*256*256
+ ELSE
+ ISECLEN = (256 + 60)*256*256
+ ENDIF
+#else
+ ISECLEN = 86*256 + 1
+ ELSE
+ ISECLEN = 60*256 + 1
+ ENDIF
+#endif
+ ENDIF
+ KGRIB(3) = ISECLEN
+ ENDIF
+Ce
+Ce Insert local ECMWF data.
+ KRET = NOABORT
+ CALL ECLOC1(YFUNC,KSEC1,KGRIB,INSPT,IBITS,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 412
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting ECMWF local'
+ WRITE(GRPRSM,*) 'GRIBEX: data.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Ce
+ ENDIF
+Ce
+ ELSE
+Cd
+Cd When decoding data the reserved octets are skipped.
+Cd If local use is not ECMWF usage or Washington ensemble usage,
+Cd the local use octets are also skipped.
+Cd Presence is indicated by length of section > 28 octets.
+Cd
+ IF( ILEN1.GT.28.AND. (LECLOC.OR.LKWBCE.OR.LSST11) ) THEN
+Cd
+Cd Set decoded values as zero and move pointer past
+Cd reserved octets.
+Cd
+ DO 420 JLOOP = 25,36
+ KSEC1(JLOOP) = 0
+ 420 CONTINUE
+ INSPT = INSPT + 96
+Cd
+Cd Set flag to indicate local use.
+ KSEC1(24) = 1
+Cd
+Cd Extract local ECMWF data.
+Cd .. or Washington ensemble data.
+Cd
+ KRET = NOABORT
+ IF( (LECLOC.OR.LSST11).OR.LKWBCE )
+ X CALL ECLOC1(YFUNC,KSEC1,KGRIB,INSPT,IBITS,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 412
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting ECMWF or'
+ WRITE(GRPRSM,*) 'GRIBEX: Washington local data.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cd
+ ELSE
+ IF( ILEN1.GT.28) INSPT = INSPT + (ILEN1-28) * 8
+ ENDIF
+Cd
+ ENDIF
+C
+ 499 CONTINUE
+C
+C* Check for ECMWF pseudo-grib data. This saves calling GRIBEX
+C with function 'I' to check if the data is GRIB data, and another
+C call with function 'D' when GRIB data is found.
+C
+ IF( (.NOT.LENCODE).AND.(KSEC1(6).EQ.127.OR.KSEC1(6).EQ.128)) THEN
+ IF( KSEC1(1).EQ.128.AND. LECMWF ) THEN
+Cd
+ IPSEUD = -6
+Cd
+Cd Change function to 'L' so that section 0 is fully decoded.
+ YFUNC = 'L'
+ GO TO 500
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 5 . Grid Description Section (Section 2) of GRIB code.
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Section 5. Handle Grid Description Section (Section 2)'
+C
+ IF( .NOT.LSECT2 ) THEN
+C
+ IF( LDECODE ) THEN
+Cd
+Cd If decoding data, set section 2 values to missing data indicator
+Cd
+ DO 505 JLOOP=1,22
+ KSEC2(JLOOP) = IMISNG
+ 505 CONTINUE
+ ENDIF
+Cd
+Cd Go to section 6, if no grid description included.
+Cd
+ GO TO 600
+ ENDIF
+C
+C* Check consistency of values given, with GRIB code, if required.
+C
+ IF( NVCK.EQ.1.AND. LENCODE ) THEN
+ CALL GRCHK2 (KSEC1,KSEC2,PSEC2,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 599
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error found when checking values for'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Section 2 against valid GRIB values.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ ENDIF
+C
+C* Octets 1 - 3 : Length of section.
+C One 24 bit field.
+C
+C Calculate length of section, if coding data.
+C
+ IF( LENCODE ) THEN
+Ce
+Ce Length is normally 32 + stretched and/or rotated
+Ce parameters + vertical coordinate parameters + list of
+Ce numbers of points.
+Ce (Lambert conformal and Mercator are 42 octets in length,
+Ce while Space view is 40 for ECMWF (44 in GRIB specification)
+Ce
+Ce Ordinary Grid.
+Ce
+ INC = 0
+Ce
+Ce Space view perspective.
+Ce
+ IF( KSEC2(1).EQ.90) INC = 12
+Ce
+Ce Lambert or Mercator +10.
+Ce
+ IF( KSEC2(1).EQ.3.OR.KSEC2(1).EQ.1) INC = 10
+Ce
+Ce
+Ce Rotated grid.
+Ce (Gaussian, Latitude/longitude or Spherical Harmonics)
+Ce
+ IF( KSEC2(1).EQ.10.OR.KSEC2(1).EQ.14.OR.KSEC2(1).EQ.60) INC = 10
+Ce
+Ce Stretched grid.
+Ce (Gaussian, Latitude/longitude or Spherical Harmonics)
+Ce
+ IF( KSEC2(1).EQ.20.OR.KSEC2(1).EQ.24.OR.KSEC2(1).EQ.70) INC = 10
+Ce
+Ce Stretched and rotated grid.
+Ce (Gaussian, Latitude/longitude or Spherical Harmonics)
+Ce
+ IF( KSEC2(1).EQ.30.OR.KSEC2(1).EQ.34.OR.KSEC2(1).EQ.80) INC = 20
+Ce
+Ce Calculate data offset allowing for quasi-regular grid
+Ce (Polar sterographic cannot be a quasi-regular grid)
+Ce
+ LQUASI = ( KSEC2(17).EQ.1 ) .AND. (KSEC2(1).NE.5)
+ IF( LQUASI ) THEN
+ ILEN2 = 32 + INC + (KSEC2(12)*4) + 2*KSEC2(3)
+ ELSE
+ ILEN2 = 32 + INC + (KSEC2(12)*4)
+ ENDIF
+Ce
+ ENDIF
+C
+C Insert / extract field.
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILEN2,1,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 501
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: length of Section 2.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* Print length of Section 2, if required.
+C
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Length of Section 2 of GRIB = ',ILEN2,' octets.'
+C
+C* If only length is required, update bit-pointer and jump
+C to extraction of length of section 3.
+C
+ IF( YFUNC.EQ.'L') THEN
+ INSPT = INSPT -24 + ILEN2 * 8
+ GO TO 600
+ ENDIF
+C
+C* Octet 4 : NV - number of vertical coordinate parameters.
+C One 8 bit field.
+C
+C Insert / extract field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(12),1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 502
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: number of Vertical coordinate parameters.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* Fixup for Editions -1 and 0 of GRIB code, where number
+C of Vertical Coordinate Parameters must be calculated,
+C as this octet contained the number of unused bits at the
+C end of the section, which by definition of the section
+C always had to be 0.
+C
+ IF( KSEC0(2).LT.1) THEN
+ KSEC2(12) = ( ILEN2 - 32 ) / 4
+ ENDIF
+C
+C* Octet 5 : PV - location of list of vertical coordinate parameters,
+C if any,
+C or
+C PL - location of list of numbers of points, if no PV,
+C or
+C 255 - no PV or PL.
+C One 8 bit field.
+C
+ IF( LENCODE ) THEN
+Ce
+Ce Set value, if coding data.
+Ce
+Ce Neither present is default.
+ IPVPL = 255
+Ce
+Ce Vertical coordinate parameters present.
+ IF( KSEC2(12).NE.0) IPVPL = 32 + INC + 1
+Ce
+Ce List of number of points present, if no vertical
+Ce coordinate parameters present and if quasi-regular grid.
+Ce
+ IF( LQUASI.AND.KSEC2(12).EQ.0) IPVPL = 32 + INC + 1
+Ce
+Ce Insert field.
+Ce
+ CALL INXBIT(KGRIB,KLENG,INSPT,IPVPL,1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 503
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: location of List of vertical coordinate'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: parameters or List of numbers of points.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Ce
+ ELSE
+Cd
+Cd If decoding data. Extract field.
+Cd
+ CALL INXBIT(KGRIB,KLENG,INSPT,IPVPL,1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 503
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: location of List of vertical coordinate'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: parameters or List of numbers of points.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cd
+Cd Experimental space view perspective data received
+Cd at ECMWF has all 0 bits.
+Cd 0 is illegal for all data types, so change it.
+Cd
+ IF( IPVPL.EQ.0) IPVPL = 255
+Cd
+Cd Neither present, so set regular grid indicator.
+Cd
+ IF( IPVPL.EQ.255) THEN
+ KSEC2(17) = 0
+ LQUASI = .FALSE.
+ ENDIF
+Cd
+Cd Vertical coordinate parameters present.
+Cd If the length of section is greater than the
+Cd end of the vertical coordinate parameters, then
+Cd there is a list of numbers of points following, so
+Cd set quasi-regular grid indicator.
+Cd
+ IF( KSEC2(12).NE.0) THEN
+ IPL = 4 * KSEC2(12) + IPVPL - 1
+ IF( IPL.LT.ILEN2) THEN
+ KSEC2(17) = 1
+ LQUASI = .TRUE.
+ ENDIF
+ ENDIF
+Cd
+Cd
+Cd List of number of points present, no vertical
+Cd coordinate parameters present, so set quasi-regular
+Cd grid indicator.
+Cd
+ IF( KSEC2(12).EQ.0.AND.IPVPL.NE.255) THEN
+ KSEC2(17) = 1
+ LQUASI = .TRUE.
+ ENDIF
+Cd
+Cd Fixup for Editions -1 and 0 of GRIB code, where
+Cd all grids were regular.
+Cd
+ IF( KSEC0(2).LT.1) THEN
+ KSEC2(17) = 0
+ LQUASI = .FALSE.
+ ENDIF
+Cd
+ ENDIF
+C
+C* Octet 6 : Data representation type.
+C One 8 bit field.
+C
+C Insert / extract field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(1),1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 504
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: data representation type.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+ LSPHERC = .FALSE.
+ LGRDPT = .TRUE.
+C
+C****
+C Gaussian grid definition.
+C****
+C
+ IF( KSEC2(1).EQ.4. .OR.
+ X KSEC2(1).EQ.14 .OR.
+ X KSEC2(1).EQ.24 .OR.
+ X KSEC2(1).EQ.34 ) THEN
+C
+ IF( LENCODE ) THEN
+ KRET = EGGSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS,LQUASI)
+ IF( KRET.NE.0 ) THEN
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error encoding gaussian grid section 2'
+ KRET = 540
+ GOTO 900
+ ENDIF
+ ELSE
+ KRET = DGGSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS,IMISNG)
+ IF( KRET.NE.0 ) THEN
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error decoding gaussian grid section 2'
+ KRET = 541
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+ GO TO 520
+ ENDIF
+C
+C****
+C Latitude/longitude grid definition,
+C Equidistant Cylindrical or Plate Carree.
+C****
+C
+ IF( KSEC2(1).EQ.0 .OR.
+ X KSEC2(1).EQ.10 .OR.
+ X KSEC2(1).EQ.20 .OR.
+ X KSEC2(1).EQ.30 ) THEN
+C
+ IF( LENCODE ) THEN
+ KRET = ELLSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS,LQUASI)
+ IF( KRET.NE.0 ) THEN
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error encoding lat/long grid section 2'
+ KRET = 542
+ GOTO 900
+ ENDIF
+ ELSE
+ KRET = DLLSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS,IMISNG)
+ IF( KRET.NE.0 ) THEN
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error decoding lat/long grid section 2'
+ KRET = 543
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+ GO TO 520
+ ENDIF
+C
+C****
+C Spherical Harmonic format.
+C****
+C
+ IF( KSEC2(1).EQ.50 .OR.
+ X KSEC2(1).EQ.60 .OR.
+ X KSEC2(1).EQ.70 .OR.
+ X KSEC2(1).EQ.80 ) THEN
+C
+ LSPHERC = .TRUE.
+ LGRDPT = .FALSE.
+C
+ IF( LENCODE ) THEN
+ KRET = ESHSEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS)
+ IF( KRET.NE.0 ) THEN
+ WRITE(GRPRSM,*) 'GRIBEX: Error encoding spectral section 2'
+ KRET = 544
+ GOTO 900
+ ENDIF
+ ELSE
+ KRET = DSHSEC2(KGRIB,KLENG,INSPT,KSEC2,IBITS)
+ IF( KRET.NE.0 ) THEN
+ WRITE(GRPRSM,*) 'GRIBEX: Error decoding spectral section 2'
+ KRET = 545
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+ ITRUNC = KSEC2(2)
+C
+ GOTO 520
+ ENDIF
+C
+C****
+C* Polar Stereographic.
+C****
+C
+ IF( KSEC2(1).EQ.5) THEN
+C
+C* Octets 7 - 8 : Ni - number of points along X-axis.
+C Octets 9 - 10 : Nj - number of points along Y-axis.
+C Two 16 bit fields.
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(2),2,IBITS, 16,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 523
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: number of points along X or Y axis.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* Octets 11 - 13 : La1 - latitude of first grid point.
+C Octets 14 - 16 : Lo1 - longitude of first grid point.
+C Two 24 bit fields.
+C
+C When coding data, set sign bit to 1, if value is negative.
+C
+ IF( LENCODE ) THEN
+ CALL CSGNBT( ILALO(1), KSEC2(4), 24, KRET)
+ CALL CSGNBT( ILALO(2), KSEC2(5), 24, KRET)
+ ENDIF
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 506
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: latitude or longitude of first grid pt.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C When decoding data, if sign bit is 1, value is negative.
+C
+ IF( LDECODE ) THEN
+ CALL DSGNBT( KSEC2(4), ILALO(1), 24, KRET)
+ CALL DSGNBT( KSEC2(5), ILALO(2), 24, KRET)
+ ENDIF
+C
+C* Octet 17 : Resolution and components flag.
+C One 8 bit field.
+C
+C Resolution flag ( KSEC2(6) ) is not applicable.
+C
+ KSEC2(6) = 0
+ IF( LENCODE ) IRESOL = KSEC2(18)+KSEC2(19)
+C
+C Insert / extract field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IRESOL,1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 507
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: components flag.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+ IF( LDECODE ) THEN
+Cd
+Cd All flag fields are already set to 0, so
+ IF( IRESOL.EQ.0) GO TO 513
+Cd
+Cd Fix up for flag which was different in Experimental edition.
+Cd
+ IF( KSEC0(2).EQ.-1.AND.(IRESOL.EQ.1.OR.IRESOL.EQ.3))
+ X IRESOL = 128
+Cd
+Cd Resolution flag is not applicable.
+ IF( IRESOL.GE.128) IRESOL = IRESOL - 128
+Cd
+Cd Set earth flag.
+ IF( IRESOL.GE.64) THEN
+ KSEC2(18) = 64
+ IRESOL = IRESOL - 64
+ ENDIF
+Cd
+Cd Set components flag.
+ KSEC2(19) = IRESOL
+Cd
+ ENDIF
+C
+ 513 CONTINUE
+C
+C Insert / extract field.
+C
+C CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(6),1,IBITS, 8,YFUNC,KRET)
+C IF( KRET.NE.0) THEN
+C KRET = 507
+C WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+C WRITE(GRPRSM,*) 'GRIBEX: components flag.'
+C WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+C GO TO 900
+C ENDIF
+C
+C* Octets 18 - 20 : LoV - orientation of the grid.
+C One 24 bit field.
+C
+C When coding data, set sign bit to 1, if value is negative.
+C
+ IF( LENCODE ) CALL CSGNBT( ILALO(1), KSEC2(7), 24, KRET)
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),1,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 508
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: latitude or longitude of last grid point.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C When decoding data, if sign bit is 1, value is negative.
+C
+ IF( LDECODE ) CALL DSGNBT( KSEC2(7), ILALO(1), 24, KRET)
+C
+C* Octets 21 - 23 : Dx - X direction grid length.
+C* Octets 24 - 26 : Dy - Y direction grid length.
+C Two 24 bit fields.
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(9),2,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 524
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: X or Y axis grid length.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* Octet 27 : Projection centre flag.
+C One 8-bit field.
+C
+C Insert / extract field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(13),1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 525
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: Projection centre flag.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* Octet 28 : Scanning mode flags.
+C One 8 bit field.
+C
+C Insert / extract field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(11),1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 511
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: scanning mode flags.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C Fix-up for flag which was different in Experimental Edition.
+ IF( KSEC0(2).EQ.-1.AND.KSEC2(11).EQ.1) KSEC2(11) = 0
+C
+C* Octets 29 - 32 : Reserved.
+C Two 16 bit fields.
+C
+C If insertion, set bits to 0.
+ IF( LENCODE ) THEN
+ CALL INXBIT(KGRIB,KLENG,INSPT, 0, 1,IBITS, 32,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 810
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting dummy zero.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ ELSE
+Cd
+Cd If extraction, only update bit pointer.
+ INSPT = INSPT + 32
+ ENDIF
+C
+ GO TO 520
+ ENDIF
+C
+C****
+C* Space view perspective or orthographic.
+C****
+C
+ IF( KSEC2(1).EQ.90) THEN
+C
+ IF( LENCODE ) THEN
+ KRET = ESVSEC2(KGRIB,KLENG,INSPT,KSEC2,IBITS,ILEN2)
+ IF( KRET.NE.0 ) THEN
+ WRITE(GRPRSM,*) 'GRIBEX: Error encoding spectral section 2'
+ KRET = 546
+ GOTO 900
+ ENDIF
+ ELSE
+ KRET = DSVSEC2(KGRIB,KLENG,INSPT,KSEC2,IBITS,ILEN2)
+ IF( KRET.NE.0 ) THEN
+ WRITE(GRPRSM,*) 'GRIBEX: Error decoding spectral section 2'
+ KRET = 547
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C
+ GO TO 520
+C
+ ENDIF
+C
+C****
+C* Mercator
+C****
+C
+ IF( KSEC2(1).EQ.1) THEN
+C
+ IF( LENCODE ) THEN
+ KRET = EMESEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS,LQUASI)
+ IF( KRET.NE.0 ) THEN
+ WRITE(GRPRSM,*) 'GRIBEX: Error encoding Mercator section 2'
+ KRET = 546
+ GOTO 900
+ ENDIF
+ ELSE
+ KRET = DMESEC2(KGRIB,KLENG,INSPT,KSEC0,KSEC2,IBITS,IMISNG)
+ IF( KRET.NE.0 ) THEN
+ WRITE(GRPRSM,*) 'GRIBEX: Error decoding Mercator section 2'
+ KRET = 547
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C
+ GO TO 520
+C
+ ENDIF
+C
+C****
+C* Lambert Conformal.
+C****
+C
+ IF( KSEC2(1).EQ.3) THEN
+C
+C* Octets 7 - 8 : Ni - number of points along X-axis.
+C Octets 9 - 10 : Nj - number of points along Y-axis.
+C Two 16 bit fields.
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(2),2,IBITS, 16,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 523
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: number of points along X or Y axis.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* Octets 11 - 13 : La1 - latitude of first grid point.
+C Octets 14 - 16 : Lo1 - longitude of first grid point.
+C Two 24 bit fields.
+C
+Ce When coding data, set sign bit to 1, if value is negative.
+Ce
+ IF( LENCODE ) THEN
+ CALL CSGNBT( ILALO(1), KSEC2(4), 24, KRET)
+ CALL CSGNBT( ILALO(2), KSEC2(5), 24, KRET)
+ ENDIF
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 506
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: latitude or longitude of first grid pt.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+Cd When decoding data, if sign bit is 1, value is negative.
+Cd
+ IF( LDECODE ) THEN
+ CALL DSGNBT( KSEC2(4), ILALO(1), 24, KRET)
+ CALL DSGNBT( KSEC2(5), ILALO(2), 24, KRET)
+ ENDIF
+C
+C* Octet 17 : Resolution and components flag.
+C One 8 bit field.
+C
+C Resolution flag ( KSEC2(6) ) is not applicable.
+C
+ IF( LENCODE ) IRESOL = KSEC2(18)+KSEC2(19)+KSEC2(6)
+C
+C Insert / extract field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IRESOL,1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 507
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: components flag.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+ IF( LDECODE ) THEN
+Cd
+Cd If all flag fields are already set to 0, bypass.
+Cd
+ IF( IRESOL.EQ.0) GO TO 515
+Cd
+Cd Resolution flag is not applicable.
+Cd
+ IF( IRESOL.GE.128) THEN
+ KSEC2(6) = 128
+ IRESOL = IRESOL - 128
+ ENDIF
+Cd
+Cd Set earth flag.
+Cd
+ IF( IRESOL.GE.64) THEN
+ KSEC2(18) = 64
+ IRESOL = IRESOL - 64
+ ENDIF
+Cd
+Cd Set components flag.
+Cd
+ KSEC2(19) = IRESOL
+Cd
+ ENDIF
+C
+ 515 CONTINUE
+C
+C Insert / extract field.
+C
+C* Octets 18 - 20 : LoV - orientation of the grid.
+C One 24 bit field.
+C
+Ce When coding data, set sign bit to 1, if value is negative.
+Ce
+ IF( LENCODE ) CALL CSGNBT( ILALO(1), KSEC2(7), 24, KRET)
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),1,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 508
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: latitude or longitude of last grid point.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+Cd When decoding data, if sign bit is 1, value is negative.
+Cd
+ IF( LDECODE ) CALL DSGNBT( KSEC2(7), ILALO(1), 24, KRET)
+C
+C* Octets 21 - 23 : Dx - X direction grid length.
+C* Octets 24 - 26 : Dy - Y direction grid length.
+C Two 24 bit fields.
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(9),2,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 524
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: X or Y axis grid length.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* Octet 27 : Projection centre flag.
+C One 8-bit field.
+C
+C Insert / extract field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(13),1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 525
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: Projection centre flag.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* Octet 28 : Scanning mode flags.
+C One 8 bit field.
+C
+C Insert / extract field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(11),1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 511
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: scanning mode flags.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C Fix-up for flag which was different in Experimental
+C Edition.
+C
+ IF( KSEC0(2).EQ.-1.AND.KSEC2(11).EQ.1) KSEC2(11) = 0
+C
+C* Octets 29 - 31 : Latin 1.
+C* Octets 32 - 34 : Latin 2.
+C Two 24 bit fields.
+C
+Ce When coding data, set sign bit to 1, if value is negative.
+Ce
+ IF( LENCODE ) THEN
+ CALL CSGNBT( ILALO(1), KSEC2(14), 24, KRET)
+ CALL CSGNBT( ILALO(2), KSEC2(15), 24, KRET)
+ ENDIF
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 531
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Latin1 or Latin2 of secants points.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+Cd When decoding data, if sign bit is 1, value is negative.
+C
+ IF( LDECODE ) THEN
+ CALL DSGNBT( KSEC2(14), ILALO(1), 24, KRET)
+ CALL DSGNBT( KSEC2(15), ILALO(2), 24, KRET)
+ ENDIF
+C
+C* Octets 35 - 37 : Latitude of the southern pole.
+C* Octets 38 - 40 : Longitude of the southern pole.
+C Two 24 bit fields.
+C
+Ce When coding data, set sign bit to 1, if value is negative.
+Ce
+ IF( LENCODE ) THEN
+ CALL CSGNBT( ILALO(1), KSEC2(20), 24, KRET)
+ CALL CSGNBT( ILALO(2), KSEC2(21), 24, KRET)
+ ENDIF
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 532
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: latitude/longitude of southern pole.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+Cd When decoding data, if sign bit is 1, value is negative.
+Cd
+ IF( LDECODE ) THEN
+ CALL DSGNBT( KSEC2(20), ILALO(1), 24, KRET)
+ CALL DSGNBT( KSEC2(21), ILALO(2), 24, KRET)
+ ENDIF
+C
+C* Octets 41 - 42 : Reserved.
+C One 16 bit fields.
+C
+ IF( LENCODE ) THEN
+C
+Ce All bits already set to 0.
+Ce No insertion, only update bit pointer.
+Ce
+ INSPT = INSPT + 16
+Ce
+ ELSE
+Cd
+Cd No extraction, only update bit pointer.
+Cd
+ INSPT = INSPT + 16
+Cd
+ ENDIF
+C
+ GO TO 520
+ ENDIF
+C
+C
+C****
+C Ocean grid definition.
+C****
+C
+ IF( KSEC2(1).EQ.192 ) THEN
+C
+ IF( LENCODE ) THEN
+ KRET = EOCSEC2(KGRIB,KLENG,INSPT,KSEC2,IBITS)
+ IF( KRET.NE.0 ) THEN
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error encoding ECMWF ocean section 2'
+ KRET = 546
+ GOTO 900
+ ENDIF
+ ELSE
+ KRET = DOCSEC2(KGRIB,KLENG,INSPT,KSEC2,IBITS)
+ IF( KRET.NE.0 ) THEN
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error decoding ECMWF ocean section 2'
+ KRET = 547
+ GOTO 900
+ ENDIF
+ ENDIF
+ GOTO 520
+C
+ ENDIF
+C
+C****
+C* Other representation types not yet catered for.
+C****
+C
+ KRET = 598
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Representation type not catered for:',KSEC2(1)
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+C
+C* Rotation parameters for rotated or stretched and rotated grids.
+C (Gaussian, Latitude/longitude or Spherical Harmonics)
+C
+ 520 CONTINUE
+C
+ IF( KSEC2(1).EQ.10.OR.KSEC2(1).EQ.30.OR.
+ X KSEC2(1).EQ.14.OR.KSEC2(1).EQ.34.OR.
+ X KSEC2(1).EQ.60.OR.KSEC2(1).EQ.80) THEN
+C
+C* Octets 33 - 35 : Latitude of the southern pole.
+C Octets 36 - 38 : Longitude of the southern pole.
+C Two 24 bit fields.
+C
+C When coding data, set sign bit to 1, if value is negative.
+C
+ IF( LENCODE ) THEN
+ CALL CSGNBT( ILALO(1), KSEC2(13), 24, KRET)
+ CALL CSGNBT( ILALO(2), KSEC2(14), 24, KRET)
+ ENDIF
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 517
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: latitude or longitude of southern pole.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C When decoding data, if sign bit is 1, value is negative.
+C
+ IF( LDECODE ) THEN
+ CALL DSGNBT( KSEC2(13), ILALO(1), 24, KRET)
+ CALL DSGNBT( KSEC2(14), ILALO(2), 24, KRET)
+ ENDIF
+C
+C* Octets 39 - 42 : Angle of rotation.
+C One 8 bit and one 24 bit field.
+C
+ IF( LENCODE ) THEN
+Ce
+Ce Convert floating point to GRIB representation.
+ ITRND = 1
+ CALL CONFP3 (PSEC2(1),IEXP,IMANT,IBITS,ITRND)
+ ENDIF
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IEXP,1,IBITS, 8,YFUNC,KRETA)
+ CALL INXBIT(KGRIB,KLENG,INSPT,IMANT,1,IBITS, 24,YFUNC,KRETB)
+ KRET = KRET + KRETB
+ IF( KRET.NE.0) THEN
+ KRET = 518
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: angle of rotation.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+ IF( LDECODE ) THEN
+Cd
+Cd Convert GRIB representation to floating point.
+ CALL DECFP2 (PSEC2(1),IEXP,IMANT)
+Cd
+ ENDIF
+ ENDIF
+C
+C* Stretching parameters for stretched grids.
+C (Gaussian, Latitude/longitude or Spherical Harmonics)
+C
+ IF( KSEC2(1).EQ.20.OR.KSEC2(1).EQ.24.OR.KSEC2(1).EQ.70) THEN
+C
+C* Octets 33 - 35 : Latitude of pole of stretching.
+C Octets 36 - 38 : Longitude of pole of stretching.
+C Two 24 bit fields.
+C
+C When coding data, set sign bit to 1, if value is negative.
+C
+ IF( LENCODE ) THEN
+ CALL CSGNBT( ILALO(1), KSEC2(15), 24, KRET)
+ CALL CSGNBT( ILALO(2), KSEC2(16), 24, KRET)
+ ENDIF
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 519
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: latitude/longitude of pole of stretching.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C When decoding data, if sign bit is 1, value is negative.
+C
+ IF( LDECODE ) THEN
+ CALL DSGNBT( KSEC2(15), ILALO(1), 24, KRET)
+ CALL DSGNBT( KSEC2(16), ILALO(2), 24, KRET)
+ ENDIF
+C
+C* Octets 39 - 42 : Stretching factor.
+C One 8 bit and one 24 bit field.
+C
+C Convert floating point to GRIB representation.
+ ITRND = 1
+ IF( LENCODE ) CALL CONFP3 (PSEC2(2),IEXP,IMANT,IBITS,ITRND)
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IEXP,1,IBITS, 8,YFUNC,KRETA)
+ CALL INXBIT(KGRIB,KLENG,INSPT,IMANT,1,IBITS, 24,YFUNC,KRETB)
+ KRET = KRETA + KRETB
+ IF( KRET.NE.0) THEN
+ KRET = 520
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: stretching factor.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C Convert GRIB representation to floating point.
+ IF( LDECODE ) CALL DECFP2 (PSEC2(2),IEXP,IMANT)
+C
+ ENDIF
+C
+C* Stretching parameters for stretched and rotated grids.
+C (Gaussian, Latitude/longitude or Spherical Harmonics)
+C
+ IF( KSEC2(1).EQ.30.OR.KSEC2(1).EQ.34.OR.KSEC2(1).EQ.80) THEN
+C
+C* Octets 43 - 45 : Latitude of pole of stretching.
+C Octets 46 - 48 : Longitude of pole of stretching.
+C Two 24 bit fields.
+C
+C When coding data, set sign bit to 1, if value is negative.
+C
+ IF( LENCODE ) THEN
+ CALL CSGNBT( ILALO(1), KSEC2(15), 24, KRET)
+ CALL CSGNBT( ILALO(2), KSEC2(16), 24, KRET)
+ ENDIF
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILALO(1),2,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 519
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: latitude/longitude of pole of stretching.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C When decoding data, if sign bit is 1, value is negative.
+C
+ IF( LDECODE ) THEN
+ CALL DSGNBT( KSEC2(15), ILALO(1), 24, KRET)
+ CALL DSGNBT( KSEC2(16), ILALO(2), 24, KRET)
+ ENDIF
+C
+C* Octets 49 - 52 : Stretching factor.
+C One 8 bit and one 24 bit field.
+C
+C Convert floating point to GRIB representation.
+ ITRND = 1
+ IF( LENCODE ) CALL CONFP3 (PSEC2(2),IEXP,IMANT,IBITS,ITRND)
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IEXP,1,IBITS, 8,YFUNC,KRETA)
+ CALL INXBIT(KGRIB,KLENG,INSPT,IMANT,1,IBITS, 24,YFUNC,KRETB)
+ KRET = KRETA + KRETB
+ IF( KRET.NE.0) THEN
+ KRET = 520
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: stretching factor.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C Convert GRIB representation to floating point.
+C
+ IF( LDECODE ) CALL DECFP2 (PSEC2(2),IEXP,IMANT)
+C
+ ENDIF
+C
+C* Vertical coordinate parameters, if any.
+C
+ IF( KSEC2(12).NE.0) THEN
+ ITRND = 1
+ DO 530 JLOOP = 1 , KSEC2(12)
+C
+C One 8 bit and one 24 bit field.
+C
+Ce Convert floating point to GRIB representation.
+ IF( LENCODE )
+ X CALL CONFP3 (PSEC2(JLOOP+10),IEXP,IMANT, IBITS,ITRND)
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IEXP,1,IBITS, 8,YFUNC,KRETA)
+ CALL INXBIT(KGRIB,KLENG,INSPT,IMANT,1,IBITS, 24,YFUNC,KRETB)
+ KRET = KRETA + KRETB
+ IF( KRET.NE.0) THEN
+ KRET = 521
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: vertical coordinate parameters.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+Cd Convert GRIB representation to floating point.
+ IF( LDECODE ) CALL DECFP2 (PSEC2(JLOOP+10),IEXP,IMANT)
+C
+ 530 CONTINUE
+ ENDIF
+C
+C* List of number of points, if any.
+C Number of 16 bit fields.
+C
+ IF( LQUASI) THEN
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC2(23),KSEC2(3),IBITS,
+ X 16,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 522
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting'
+ WRITE(GRPRSM,*) 'GRIBEX: list of numbers of points.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 6 . Bit Map Section (section 3) of GRIB code.
+C -----------------------------------------------------------------|
+C
+ 600 CONTINUE
+C
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Section 6. Handle Bit Map Section (Section 3)'
+C
+C* Go to section 9, if decoding of identification sections only and
+C GRIB Code Edition is higher than 0. If Edition is lower the
+C length of the GRIB message needs to be calculated, so change
+C function to 'L' to complete decoding of section 0.
+C Number of data values decoded ( KSEC4(1) ) already set to 0.
+C
+ IF( HOPER(1:1).EQ.'I') THEN
+ IF( KSEC0(2).GT.0) THEN
+ GO TO 900
+ ELSE
+ YFUNC = 'L'
+ ENDIF
+ ENDIF
+C
+C* Set integer or real missing data value.
+C
+ IF( KSEC4(5) .EQ. 0 ) THEN
+ ZMSVAL = PSEC3(2)
+ ELSE
+ ZMSVAL = REAL(KSEC3(2))
+ ENDIF
+C
+C* Go to section 7, if no bit map required.
+C
+ IF( .NOT.LSECT3 ) GO TO 700
+C
+C* Set bit-map flag and attempt no decoding of bit-map, if
+C routine has been called by the DECOGB interface routine,
+C which is provided for upward compatibility with old software.
+C
+ IF( HOPER.EQ.'Z') THEN
+ ISBMAP = -5
+ WRITE(GRPRSM,*) 'GRIBEX: Bit-map found. No data decoded.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', ISBMAP
+ GO TO 900
+ ENDIF
+C
+C* Check consistency of values given, with GRIB code, if required.
+C
+ IF( NVCK.EQ.1.AND. LENCODE ) THEN
+ CALL GRCHK3 (KSEC1,KSEC3,PSEC3,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 699
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error found checking values for section 3'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ ENDIF
+C
+C* When coding data, calculate the length of section and number
+C of unused bits.
+C
+ IF( LENCODE ) THEN
+Ce
+ IF( KSEC3(1).NE.0) THEN
+Ce
+Ce Predetermined bit-map table included.
+Ce Length of section is 6 octets, number of unused bits is 0.
+ ILEN3 = 6
+ INUB = 0
+Cjdc KRET = GBITMAP(KSEC3(1), IBTVALS, NONMISS, IBTPTR, NBYTE)
+Cjdc IVALS = NONMISS
+Ce
+ ELSE
+Ce
+Ce Bit-map included in section 3.
+Ce Length of section = 6 octets of header + length of
+Ce bit-map, rounded to a multiple of 2 octets.
+Ce
+Ce Set IVALS to the number of bits in the bit-map.
+ IF( KSEC4(8).EQ.0) THEN
+Ce
+Ce Each bit in the bit-map represents a single value.
+ IVALS = ILENF
+ ELSE
+Ce
+Ce Each bit in the bit-map represents a matrix of values.
+ IVALS = ILENF / (KSEC4(50)*KSEC4(51))
+ ENDIF
+Ce
+ ITEMP = 48 + IVALS
+ ILEN3 = ( ITEMP + 15 ) / 16
+ ILEN3 = ILEN3 * 2
+Ce
+Ce Number of unused bits.
+ INUB = ILEN3 * 8 - ITEMP
+Ce
+ ENDIF
+Ce
+ ENDIF
+C
+C* Octets 1 - 3 : Length of section.
+C One 24 bit field.
+C
+C Insert/extract field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILEN3,1,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 601
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting section 3 length'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* Print length of Section 3, if required.
+C
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Length of Section 3 of GRIB = ',ILEN3,' octets.'
+C
+C If only length is required, update bit-pointer and jump
+C to extraction of length of section 4.
+C
+ IF( YFUNC.EQ.'L') THEN
+ INSPT = INSPT -24 + ILEN3 * 8
+ GO TO 700
+ ENDIF
+C
+C* Octet 4 : Number of unused bits at end of section.
+C One 8 bit field.
+C
+C Insert/extract field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,INUB,1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 602
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting number'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: unused bits at the end of Section 3.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* Octets 5-6 : Bit-map table reference.
+C One 16 bit field.
+C
+C Insert/extract field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC3(1),1,IBITS, 16,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 603
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting bit-map reference table'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C* Set integer or real missing data value.
+C
+ IF( KSEC4(5) .EQ. 0 ) THEN
+ ZMSVAL = PSEC3(2)
+ ELSE
+ ZMSVAL = REAL(KSEC3(2))
+ ENDIF
+C
+C* Finished if a predetermined bit-map table is given.
+C
+ IF( KSEC3(1).NE.0) GO TO 700
+C
+C* Bit-map definition included.
+C
+ IF( LENCODE ) THEN
+Ce
+Ce Insert primary bit-map. Set function for fixed length
+Ce messages if required.
+Ce
+ YTEMP = YFUNC
+ IF( HOPER.EQ.'M') YTEMP = 'M'
+Ce
+ IF( KSEC4(8).EQ.64) THEN
+Ce
+Ce Matrix of values at a point.
+ ITEMP = KSEC4(50) * KSEC4(51)
+ ELSE
+Ce
+Ce Single value at each point.
+ ITEMP = 1
+ ENDIF
+Ce
+Ce Retain pointer to bit-map location.
+Ce
+ IBMAP = INSPT
+Ce
+ CALL INSMP1 (KGRIB,KLENG,INSPT,KSEC4(9),PSEC4,
+ X ILENF,IBITS,ZMSVAL,YTEMP,ITEMP,NDBG,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 604
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting primary bit map.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Ce
+Ce Number of data values remaining to be handled
+Ce is now in ILENF, which is used when finding maximum and
+Ce minimum values etc. When a matrix of values is present
+Ce PSEC4 may still contain missing data indicators for each
+Ce matrix.
+Ce
+Ce Effective number of points will be returned in KSEC4(21).
+Ce
+ NONMISS = ILENF
+Ce
+Ce Unused bits at end of section.
+Ce These bits are already set to 0, so update bit-pointer only.
+Ce
+ INSPT = INSPT + INUB
+Ce
+ ELSE
+Cd
+Cd Retain pointer to bit-map location.
+Cd
+ IBMAP = INSPT
+Cd
+Cd IVALS is the number of bits in the bit-map. It is the same
+Cd as the number of data values (including missing data
+Cd values to be decoded) when each point represents a single
+Cd data value. When each bit in the bit-map represents a
+Cd matrix of values, it is the number of matrices.
+Cd
+ IVALS = (ILEN3 - 6) * 8 - INUB
+Cd
+Cd Update bit-pointer to start of section 4 of Grib message.
+ INSPT = INSPT - 48 + ILEN3 * 8
+Cd
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 7 . Binary Data Section (section 4) of GRIB code.
+C -----------------------------------------------------------------|
+C
+ 700 CONTINUE
+C
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Section 7. Handle Binary Data Section (Section 4)'
+C
+C* Check consistency of values given, with GRIB code, if required.
+C
+ IF( NVCK.EQ.1.AND. LENCODE ) THEN
+ CALL GRCHK4 (KSEC1,KSEC4,PSEC4,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 799
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error found when checking values for section 4'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ ENDIF
+C
+C* Retain value of the pointer to the first bit in Section 4.
+C When coding data, this is needed later to insert the length
+C of Section 4 and the number of unused bits.
+C When decoding data, this is used later to calculate the
+C number of packed data values which have to be decoded.
+C
+ IPLEN = INSPT
+C
+C* Octets 1 - 3 : Length of section.
+C One 24 bit field.
+C
+ IF( LENCODE ) THEN
+Ce
+Ce Increment pointer.
+ INSPT = INSPT + 24
+ ELSE
+Cd
+Cd Extract field.
+Cd
+ CALL INXBIT(KGRIB,KLENG,INSPT,ILEN4,1,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 701
+ WRITE(GRPRSM,*) 'GRIBEX: Error extracting section 4 length'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cd
+Cd If a very large product, the section 4 length field holds
+Cd the number of bytes in the product after section 4 upto
+Cd the end of the padding bytes.
+Cd This is a fixup to get round the restriction on product lengths
+Cd due to the count being only 24 bits. It is only possible because
+Cd the (default) rounding for GRIB products is 120 bytes.
+Cd
+
+Cljbf in case of big fields, revert the
+Cljbf workaround in decoding in case we realize it
+Cljbf is not paked using the *120 trick
+Cljbf
+
+ IF( LLARGE .AND. ILEN4.GT.120) THEN
+ KSEC0(1) = KSEC0(1) / 120
+ KSEC0(1) = KSEC0(1) * 2
+ LLARGE = .FALSE.
+ ENDIF
+
+ IF( LLARGE ) ILEN4 = KSEC0(1) - (INSPT/8) - ILEN4 + 3
+Cd
+Cd Print length of Section 4, if required.
+Cd
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Length of Section 4 of GRIB = ',ILEN4,' octets.'
+Cd
+Cd Set length if required, by updating bit-pointer and
+Cd adding length of section 5 (32 bits). Length in bytes.
+Cd Finished if length only required, so go to section 9.
+Cd
+ IF( YFUNC.EQ.'L'.OR.HOPER.EQ.'X') THEN
+ KSEC0(1) = (INSPT - 24 + ILEN4 * 8 + 32) / 8
+ IF( YFUNC.EQ.'L') GO TO 900
+ ENDIF
+Cd
+ ENDIF
+C
+C* Octet 4 : 4 bit flag field and 4 bit unused bit count field.
+C One 8 bit field for insertion/extraction purposes.
+C
+ IF( LENCODE ) THEN
+Ce
+Ce Type of data (spherical harmonic coefficients or grid
+Ce point) is taken from KSEC4(3) only if no Section 2 is
+Ce included.(This allows for data coded without Section 2).
+Ce
+ IF( LSECT2 ) THEN
+Ce
+Ce If section 2 is present, it says if data is spherical harmonic
+Ce
+ IF( LSPHERC ) THEN
+ KSEC4(3) = 128
+ ELSE
+ KSEC4(3) = 0
+ ENDIF
+Ce
+ ELSE
+Ce
+Ce Section 4 says if it's spherical harmonic data..
+Ce
+ LSPHERC = ( KSEC4(3) .EQ. 128 )
+ LGRDPT = .NOT.LSPHERC
+ ENDIF
+Ce
+Ce When coding data, field is inserted later, when
+Ce number of unused bits is known and added to it.
+Ce
+Ce Increment pointer.
+ INSPT = INSPT + 8
+Ce
+ ELSE
+Cd
+Cd Decoding -> extract field.
+Cd
+ CALL INXBIT(KGRIB,KLENG,INSPT,IFLAG,1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 706
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error extracting section 4 flag field.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cd
+Cd All flags already preset to 0.
+Cd
+ IF( KSEC0(2).EQ.-1) THEN
+Cd
+Cd In the Experimental Edition flag field was
+Cd 0000 for grid point data.
+Cd 0001 for spherical harmonic data.
+Cd
+ ITEMP = IFLAG / 16
+ INIL = IFLAG - ITEMP * 16
+ IF( ITEMP.NE.0) KSEC4(3) = 128
+ GO TO 710
+ ENDIF
+Cd
+ IF( KSEC0(2).EQ.0) THEN
+Cd
+Cd In Edition 0 flag field only 2 first bits had significance.
+Cd
+Cd 0- for grid point data.
+Cd 1- for spherical harmonic data.
+Cd -0 for simple packing.
+Cd -1 for complex packing (only supported for spectral data).
+Cd
+ IF( IFLAG.GE.128) THEN
+ KSEC4(3) = 128
+ IFLAG = IFLAG - 128
+ ENDIF
+Cd
+ IF( IFLAG.GE.64) THEN
+ KSEC4(4) = 64
+ IFLAG = IFLAG - 64
+ ENDIF
+Cd
+ INIL = IFLAG
+ ELSEIF( KSEC0(2).EQ.1) THEN
+Cd
+Cd In Edition 1 flag field all 4 bits have significance.
+Cd
+Cd 0--- for grid point data.
+Cd 1--- for spherical harmonic data.
+Cd -0-- for simple packing.
+Cd -1-- for complex or second order packing.
+Cd --0- for floating point values.
+Cd --1- for integer values.
+Cd ---0 for no additional flags at Octet 14.
+Cd ---1 for additional flags at Octet 14.
+Cd
+ IF( IFLAG.GE.128) THEN
+ KSEC4(3) = 128
+ IFLAG = IFLAG - 128
+ ENDIF
+Cd
+ IF( IFLAG.GE.64) THEN
+ KSEC4(4) = 64
+ IFLAG = IFLAG - 64
+ ENDIF
+Cd
+ IF( IFLAG.GE.32) THEN
+ KSEC4(5) = 32
+ IFLAG = IFLAG - 32
+ ENDIF
+Cd
+ IF( IFLAG.GE.16) THEN
+ KSEC4(6) = 16
+ IFLAG = IFLAG - 16
+ ENDIF
+Cd
+ INIL = IFLAG
+ ENDIF
+Cd
+ 710 CONTINUE
+Cd
+Cd Type of data (spherical harmonic coefficients or grid
+Cd point) is taken from KSEC4(3) only if no Section 2 is
+Cd included.(This allows for data coded without Section 2).
+Cd
+ IF( .NOT.LSECT2 ) THEN
+ LSPHERC = ( KSEC4(3) .EQ. 128 )
+ LGRDPT = .NOT.LSPHERC
+ ELSEIF( LSPHERC ) THEN
+ KSEC4(3) = 128
+ ELSE
+ KSEC4(3) = 0
+ ENDIF
+Cd
+Cd Print number of unused bits, if required.
+Cd
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Number of unused bits is ',INIL,'.'
+Cd
+ ENDIF
+C
+C* Complex packing supported for spherical harmonics.
+ LCOMPLX = (LSPHERC .AND. ( KSEC4(4).EQ.64 ) ) .OR.
+ X (LSPHERC .AND. LSECT2 .AND. ( KSEC2(6).EQ.2 ) )
+C
+C Check input specification is consistent
+ IF( LCOMPLX .AND. LSECT2 ) THEN
+ IF( ( KSEC4(4).NE.64 ) .AND. ( KSEC2(6).EQ.2 ) ) THEN
+ WRITE(GRPRSM,*) ' COMPLEX mismatch. KSEC4(4) = ', KSEC4(4)
+ WRITE(GRPRSM,*) ' COMPLEX mismatch. KSEC2(6) = ', KSEC2(6)
+ KRET = 807
+ GOTO 900
+ ELSEIF( ( KSEC4(4).EQ.64 ) .AND. ( KSEC2(6).NE.2 ) ) THEN
+
+ WRITE(GRPRSM,*) ' COMPLEX mismatch. KSEC4(4) = ', KSEC4(4)
+ WRITE(GRPRSM,*) ' COMPLEX mismatch. KSEC2(6) = ', KSEC2(6)
+ KRET = 807
+ GOTO 900
+ ENDIF
+ ELSEIF( LCOMPLX ) THEN
+C
+C Truncation of full spectrum, which is supposed triangular,
+C has to be diagnosed. Define also sub-set truncation.
+C
+ IF (LENCODE) THEN
+Ce
+ ISUBSET = KSEC4(18)
+Ce
+Ce When encoding, use the total number of data.
+Ce
+ ITEMP = KSEC4(1)
+ ITRUNC= ( NINT ( SQRT ( REAL ( 4 * ITEMP + 1 ) ) ) - 3 ) / 2
+Ce
+ ELSE
+Cd
+Cd When decoding, use section 4 descriptors.
+Cd
+ INSPT=INSPT+6*8
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC4(2),1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 709
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting number of'
+ WRITE(GRPRSM,*) 'GRIBEX: bits per data value'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cd
+ CALL INXBIT(KGRIB,KLENG,INSPT,ITEMP,1,IBITS,16,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 796
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error extracting pointer to packed data.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cd
+ INSPT=INSPT+16
+ CALL INXBIT(KGRIB,KLENG,INSPT,ISUBSET,1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 797
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error extracting sub-set truncation.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cd
+ IF (KSEC0(2).GE.1) THEN
+ ITEMP = ILEN4 * 8 - INIL + (ITEMP-IPLEN/8) * 8
+ ITEMP = ( ITEMP - 32 * ( ISUBSET + 1 ) * (ISUBSET + 2 ) )
+ X / KSEC4(2)
+ ITRUNC= ( NINT ( SQRT ( REAL ( 4 * ITEMP + 1 ) ) ) - 3 ) / 2
+ ELSE
+ ITEMP = ILEN4 * 8 - INIL + (ITEMP-1) * 8
+ ITEMP = ( ITEMP - 32 * ( ISUBSET + 1 ) ** 2 ) / KSEC4(2)
+ ITRUNC= NINT ( SQRT ( REAL ( ITEMP ) ) ) - 1
+ ENDIF
+Cd
+ ENDIF
+C
+ IF( LPDEBUG) WRITE(GRPRSM,*)
+ X 'GRIBEX: diagnosed truncation of full spectrum is ', ITRUNC
+C
+ ELSE
+ ISUBSET = 0
+ ENDIF
+C
+C *******************************************
+C
+C Handle complex packing of section 4.
+C (Avoid decoding of section 4 if 'I' or 'J' option)
+C
+ IF( LCOMPLX.AND.(.NOT.L_IORJ) ) THEN
+C
+C Adjust bit pointer to start of section
+ INSPT = IPLEN
+C
+ IF( LENCODE) THEN
+C
+C Encoding ...
+ KRET = CSECT4( PSEC4, ITRUNC, KSEC1, KSEC4,
+ X KGRIB, KLENG, INSPT, IBITS, KSEC4(2))
+ ELSE
+C
+C Decoding ...
+ KRET = DSECT4A( PSEC4, ITRUNC, KSEC0, KSEC1, KSEC4,
+ X KGRIB, KLENG, INSPT, IBITS, KSEC4(2))
+C
+C Special case when no.bits per packed value = no.bits per word
+ IF( KRET .EQ. 16123 ) KRET = 205
+ ENDIF
+C
+C Give up if error reported.
+ IF( KRET .NE. 0 ) GOTO 900
+C
+C Got to deal with section 5 if OK.
+ GOTO 799
+ ENDIF
+C
+C *******************************************
+C
+C Complex packing ("Second order packing") for grid point.
+C
+ IF( LGRDPT .AND. (KSEC4(4).NE.0.OR.HOPER.EQ.'K') ) THEN
+C
+ IF( LENCODE .AND. KSEC4(6).EQ.0 ) THEN
+ KRET = 703
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Second-order packing implies additional flags'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ELSEIF( HOPER.EQ.'G'.OR.HOPER.EQ.'A'.OR.HOPER.EQ.'B' ) THEN
+ KRET = 704
+ WRITE(GRPRSM,*) 'GRIBEX: Function ',HOPER,' invalid for'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: second-order packed field (grid-point).'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+C
+ ELSEIF( LDECODE ) THEN
+Cd
+Cd Decoding ...
+Cd
+ INSPT=IPLEN
+ KRET = D2ORDR( PSEC4, KLENP, KSEC1, KSEC2, KSEC3, KSEC4,
+ X KGRIB, KLENG, INSPT, IBITS, HOPER, ILEN4,
+ X INIL, ZREF, ZSCALE, IBMAP, IVALS, NDBG )
+Cd
+Cd Give up if error reported.
+ IF( KRET .NE. 0 ) GOTO 900
+Cd
+Cd At this stage, PSEC4 contains normalized INTEGER values.
+Cd
+ IFPT=0
+ ILEN=KSEC4(1)
+Cd
+ IF( L_IORJ ) THEN
+ KSEC4(34)=INSPT
+Cd
+Cjdc IF( HOPER.EQ.'J' ) GOTO 815
+ GOTO 900
+ ELSE
+ GOTO 796
+ ENDIF
+C
+ ENDIF
+C
+C Encoding is performed later, once the normalization of
+C field values into normalized integer values is performed.
+C
+ ENDIF
+C
+C* Set IFPT to the number of data values stored in floating point
+C rather than packed format.
+C For simple packing of data in spherical harmonic
+C format the first word contains the real (0,0) coefficient,
+C which is treated separately. IFPT is 1 for spherical
+C harmonics, 0 for other data.
+C
+ IF( LGRDPT ) THEN
+ IFPT = 0
+ ELSE
+ IFPT = 1
+ ENDIF
+C
+C* Octets 5 - 6 : Scale factor.
+C One 16 bit field.
+C
+C Calculate scale factor, if coding data.
+C
+ IF( LENCODE ) THEN
+Ce
+Ce Change units of data values , if required.
+Ce
+ IF( KSEC1(23).NE.0) THEN
+ DO 720 JLOOP = 1 , ILENF
+ PSEC4(JLOOP) = PSEC4(JLOOP)*(10.0**KSEC1(23))
+ 720 CONTINUE
+ ENDIF
+Ce
+Ce Find maximum and minimum values in data array, ignoring
+Ce any missing-data values, if secondary bit-maps are
+Ce indicated. Values not being packed are skipped.
+Ce
+ ILEN = ILENF - IFPT
+Ce
+ IF( KSEC4(8).EQ.64.AND.KSEC4(9).EQ.32) THEN
+Ce
+Ce Secondary bit maps present.
+Ce
+ CALL MAXMN2 (PSEC4(IFPT+1),ILEN,ZMSVAL,ZMAX,ZMIN)
+Ce
+ ELSE
+Ce
+Ce No secondary bit maps present.
+Ce
+ IF( HOPER.NE.'A' ) CALL MAXMIN(PSEC4(IFPT+1),ILEN,ZMAX,ZMIN)
+Ce
+ ENDIF
+Ce
+ IF( LPDEBUG ) THEN
+ WRITE(GRPRSM,*) 'GRIBEX: Maximum value calculated = ', ZMAX
+ WRITE(GRPRSM,*) 'GRIBEX: Minimum value calculated = ', ZMIN
+ ENDIF
+Ce
+Ce Calculate and pack scale factor.
+Ce
+Ce If user has supplied a reference value, use it.
+ IF( NFREF.EQ.1) THEN
+ ZREF = FREF
+Ce
+Ce If integer data being packed, ensure that
+Ce reference value represents an integer.
+ IF( KSEC4(5) .EQ. 32 ) THEN
+#ifdef VAX
+ ITEMP = JNINT(ZREF)
+#else
+ ITEMP = NINT(ZREF)
+#endif
+ ZREF = REAL(ITEMP)
+ ENDIF
+Ce
+Ce Use user-supplied value unless it exceeds the minimum value.
+Ce Otherwise use the minimum value.
+Ce
+ IF( ZREF.GT.ZMIN) THEN
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: User supplied reference value ',ZREF
+ WRITE(GRPRSM,*) 'GRIBEX: exceeds minimum value ',ZMIN
+ WRITE(GRPRSM,*) 'GRIBEX: Minimum value used instead.'
+ ZREF = ZMIN
+ ENDIF
+Ce
+ ELSE
+ ZREF = ZMIN
+ ENDIF
+Ce
+Ce If user has supplied a maximum value, use it.
+Ce
+ IF( NFMAX.EQ.1) THEN
+ ZMAXV = FMAX
+Ce
+Ce If integer data being packed, ensure that
+Ce maximum value represents an integer.
+ IF( KSEC4(5) .EQ. 32 ) THEN
+#ifdef VAX
+ ITEMP = JNINT(ZMAXV)
+#else
+ ITEMP = NINT(ZMAXV)
+#endif
+ ZMAXV = REAL(ITEMP)
+ ENDIF
+Ce
+Ce Use user-supplied value unless it is less than the maximum
+Ce value. Otherwise use the maximum value.
+Ce
+ IF( ZMAXV.LT.ZMAX) THEN
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: User supplied maximum value ',ZMAXV
+ WRITE(GRPRSM,*) 'GRIBEX: is less than maximum value ',ZMAX
+ WRITE(GRPRSM,*) 'GRIBEX: Maximum value used instead.'
+ ZMAXV = ZMAX
+ ENDIF
+Ce
+ ELSE
+ ZMAXV = ZMAX
+ ENDIF
+Ce
+ IF( LPDEBUG ) THEN
+ WRITE(GRPRSM,*) 'GRIBEX: Maximum value used = ', ZMAXV
+ WRITE(GRPRSM,*) 'GRIBEX: Minimum value used = ', ZREF
+ ENDIF
+Ce
+ IF( (HOPER .EQ. 'A') .OR. (HOPER .EQ. 'B') ) THEN
+ ZREF = 0.0
+ ZS = 0.0
+ ISCALE = 0
+ ZSCALE = 1.0
+ ELSE
+Ce
+Ce Before using reference value, convert floating point to GRIB
+Ce representation and come back with (possibly) adjusted value.
+Ce
+ ISTATUS = REF2GRB(ZREF, IEXP, IMANT, IBITS)
+ IF( ISTATUS.NE.0 ) THEN
+ WRITE(GRPRSM,*) 'GRIBEX: REF2GRB reference value problem'
+ WRITE(GRPRSM,*) 'GRIBEX: for parameter ', KSEC1(6)
+ WRITE(GRPRSM,*) 'GRIBEX: level type ', KSEC1(7)
+ WRITE(GRPRSM,*) 'GRIBEX: level ', KSEC1(8), KSEC1(9)
+ ENDIF
+
+Ce
+Ce If KSEC4(2) is less than (IBITS-1), then IS is taken as the
+Ce largest integer that enables the following formula :
+Ce
+Ce 0 <= (ZMAXV-ZREF) / (2**IS) < 2**KSEC4(2)-0.5
+Ce
+Ce (NINT of the ratio above is a positive integer that fits in
+Ce KSEC4(2) bits) ; this is equivalent to
+Ce
+Ce 2**(IS-1) <= (ZMAXV-ZREF) / (2**KSEC4(2)-0.5) < 2**IS
+Ce or :
+Ce 2**IS <= (ZMAXV-ZREF) / (2**(KSEC4(2)+1)-1) < 2**(IS+1)
+Ce
+Ce Otherwise, the 0.5 is replaced by 1. to avoid any problem
+Ce with the numerical representation of a signed integer .
+Ce
+Cjdc IF( LALLPOS) THEN
+Cjdc ZAUXIL = 1.
+Cjdc ZS = (ZMAXV-ZREF) / (2.**REAL(KSEC4(2))-1.)
+Cjdc ELSEIF( KSEC4(2).EQ.(IBITS-1) ) THEN
+Cjdc ZAUXIL = 1.
+Cjdc ZS = (ZMAXV-ZREF) / REAL(2**KSEC4(2)-1)
+Cjdc ELSE
+Cjdc ZAUXIL = 2.
+Cjdc ZS = (ZMAXV-ZREF) / REAL(2**(KSEC4(2)+1)-1)
+Cjdc ENDIF
+Ce
+#ifdef CRAY
+Cjdc IF( ZS.NE.0.0) ZS = ALOG(ZS) / ALOG(2.) + ZAUXIL
+#else
+Cjdc IF( ZS.NE.0.0) ZS = LOG(ZS) / LOG(2.) + ZAUXIL
+#endif
+Cjdc ISCALE = MIN (INT(ZS),INT(ZS+SIGN(1.,ZS)))
+Cjdc
+C
+C Adjust number of bits per value if full integer length to
+C avoid hitting most significant bit (sign bit).
+C
+ NBPV = KSEC4(2)
+ IF( NBPV.EQ.IBITS ) NBPV = NBPV - 1
+
+C
+C Adjust the minumum value to be the scale factor in case the
+C scale factor coded cannot represent the minimun value (loss of precision)
+C This should be done before computing the range of the scale factor, as the
+C unpacking will be done
+C Using the reference value coded
+
+
+ IF(ZMIN.NE.ZREF) THEN
+ IF( LPDEBUG ) THEN
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Minimum value rectified from ', ZMIN, ' to ', ZREF,
+ X 'to match reference value precision'
+ ENDIF
+ ENDIF
+
+C
+C Calculate the binary scaling factor to spread the range of
+C values over the number of bits per value.
+C Limit scaling to 2**-126 to 2**127 (using IEEE 32-bit floats
+C as a guideline).
+C
+ ZS = 1.0
+ RANGE = (ZMAX-ZREF)
+
+ IF( ABS(ZMAX-ZMIN).LT.JPEPSLN ) THEN
+ ISCALE = 0
+ ELSE IF( ABS(RANGE-1.0).LT.JPEPSLN ) THEN
+ ISCALE = 1 - NBPV
+ ELSE IF( RANGE.GT.1.0 ) THEN
+ DO JLOOP = 1, 127
+ ZS = 2.0 * ZS
+ IF( ZS.GT.(RANGE+JPEPSLN) ) THEN
+ ISCALE = JLOOP - NBPV
+ GOTO 727
+ ENDIF
+ ENDDO
+ WRITE(GRPRSM,*)
+C
+ X 'GRIBEX: Problem calculating binary scale value for encode'
+ KRET = 707
+ GOTO 900
+C
+ 727 CONTINUE
+ ELSE
+ DO JLOOP = 1, 126
+ ZS = ZS / 2.0
+ IF( ZS.LT.(RANGE-JPEPSLN) ) THEN
+ ISCALE = 1 - JLOOP - NBPV
+ GOTO 728
+ ENDIF
+ ENDDO
+C
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Problem calculating binary scale value for encode'
+ KRET = 707
+ GOTO 900
+ 728 CONTINUE
+ ENDIF
+C
+#if (defined VAX) || (defined rs6000) || defined (__alpha) || defined hpR64
+Cjdc ISCALE = MIN (INT(ZS),INT(ZS+DSIGN(1.0D0,ZS)))
+#else
+Cjdc ISCALE = MIN (INT(ZS),INT(ZS+SIGN(1.,ZS)))
+#endif
+Ce
+Ce Limit scale factor to head off problems of 'rogue' fields
+Ce which are flat except for one pimple value
+Ce (Is this still needed?)
+Ce
+ IF( ISCALE.LT.-99 ) THEN
+ WRITE(GRPRSM,*)
+ X ' GRIBEX: scaling factor changed from ', ISCALE
+ WRITE(GRPRSM,*)
+ X ' GRIBEX: to ', -99
+ ISCALE = -99
+ ENDIF
+ IF( ISCALE.GT.99 ) THEN
+ WRITE(GRPRSM,*)
+ X ' GRIBEX: scaling factor changed from ', ISCALE
+ WRITE(GRPRSM,*)
+ X ' GRIBEX: to ', 99
+ ISCALE = 99
+ ENDIF
+Ce
+ ZSCALE = 2.**ISCALE
+ IF( LPDEBUG ) THEN
+ WRITE(GRPRSM,*) 'GRIBEX: Encoding ZMAX = ', ZMAX
+ WRITE(GRPRSM,*) 'GRIBEX: Encoding ZREF = ', ZREF
+ WRITE(GRPRSM,*) 'GRIBEX: Encoding RANGE = ', RANGE
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Encoding scaling value = ', ZSCALE
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Encoding scaling value = 2 to power ',
+ X ISCALE
+ ENDIF
+Ce
+Ce Set sign bit.
+Ce
+ ITEMP = ISCALE
+ CALL CSGNBT( ISCALE, ITEMP, 16, KRET)
+ ENDIF
+Ce
+Ce Scale factor has all bits set to 1 for missing fields.
+Ce (ECMWF convention only).
+Ce
+ IF( IMISS.EQ.1) ISCALE = JP16SET
+Ce
+ ENDIF
+C
+C Insert / extract field.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,ISCALE,1,IBITS, 16,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 707
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting scale factor.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cd
+Cd If decoding, set scale factor.
+Cd
+ IF( LDECODE ) THEN
+ ISKALE = ISCALE
+ CALL DSGNBT( ISCALE, ISKALE, 16, KRET)
+Cd
+Cd Limit scale factor to head off problems of 'rogue' fields
+Cd which are flat except for one pimple value
+ IF( ISCALE .LT. -99 ) THEN
+ WRITE(GRPRSM,*)
+ X ' GRIBEX: scaling factor changed from ', ISCALE
+ WRITE(GRPRSM,*)
+ X ' GRIBEX: to ', -99
+ ISCALE = -99
+ ENDIF
+ IF( ISCALE .GT. 99 ) THEN
+ WRITE(GRPRSM,*)
+ X ' GRIBEX: scaling factor changed from ', ISCALE
+ WRITE(GRPRSM,*)
+ X ' GRIBEX: to ', 99
+ ISCALE = 99
+ ENDIF
+Cd
+ ZSCALE = 2.**ISCALE
+C
+ IF( LPDEBUG ) THEN
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Decoding scaling value = ', ZSCALE
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Decoding scaling value = 2 to power ',
+ X ISCALE
+ ENDIF
+ ENDIF
+C
+C* Octets 7 - 10 : Reference value.
+C One 8 bit and one 24 bit field.
+C
+ IF( LENCODE ) THEN
+Ce
+ IF( IMISS.EQ.1) THEN
+Ce
+Ce For missing, these data fields are set to all 1 bits.
+ IEXP = JP8SET
+ IMANT = JP24SET
+ ENDIF
+Ce
+ ENDIF
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IEXP,1,IBITS, 8,YFUNC,KRETA)
+ CALL INXBIT(KGRIB,KLENG,INSPT,IMANT,1,IBITS, 24,YFUNC,KRETB)
+ KRET = KRETA + KRETB
+ IF( KRET.NE.0) THEN
+ KRET = 708
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting reference value'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C Conversion from GRIB format, if decoding.
+C
+ IF( LDECODE ) THEN
+Cd
+Cd Set IMISS to 1 if entire field is missing, i.e. scale
+Cd factor, exponent and mantissa with all bits set to 1.
+Cd
+ IMISS = 0
+ IF( ISKALE.EQ.JP16SET.AND.IEXP.EQ.JP8SET.AND.IMANT.EQ.JP24SET)
+ X IMISS = 1
+Cd
+Cd Convert GRIB representation to floating point.
+Cd
+ IF( IMISS.EQ.0) THEN
+Cd
+Cd Field is present.
+ CALL DECFP2 (ZREF,IEXP,IMANT)
+ ELSE
+Cd
+Cd Field is missing. Print warning message and
+Cd field identification sections of Grib code,
+Cd forcing field data values to 0.
+Cd
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Following field is missing ***********'
+ CALL GRPRS1 (KSEC0,KSEC1)
+ ZREF = 0
+ ZSCALE = 0
+ ENDIF
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Decoded reference value = ',ZREF
+ ENDIF
+Cd
+C* Octet 11 : Number of bits containing each packed value.
+C One 8 bit field.
+C
+C Insert / extract field.
+C
+ IF( .NOT.LGRDPT.OR.KSEC4(4).EQ.0) THEN
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC4(2),1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 709
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting number of'
+ WRITE(GRPRSM,*) 'GRIBEX: bits per data value'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+ ELSE
+C
+C In second-order packing case, this number may differ from
+C the value specified for normalization process (KSEC4(2)).
+C Field is inserted later, within function C2ORDR or related
+C C2* sub-functions.
+C
+ INSPT=INSPT+8
+C
+ ENDIF
+C
+ IF( LDECODE ) THEN
+Cd
+Cd Check if number of bits per packed value = number of bits per
+Cd computer word.
+Cd
+ LALLPOS = KSEC4(2) .EQ. IBITS
+Cd
+ ENDIF
+C
+C* Octets 12 et sequentia can contain further header
+C information, depending on data representation type.
+C
+C
+C* For grid point data, simple packing, single value at each
+C grid point there is no further header information and
+C packed data begins in octet 12.
+C
+C* For grid point data, simple packing, with a matrix of
+C values at each grid point further information is added.
+C
+ IF( LGRDPT .AND.KSEC4(6).EQ.16.AND.KSEC4(4).EQ.0) THEN
+C
+C Octets 12 - 13. N - octet number at which packed
+C data begins.
+C One 16 bit field.
+C
+C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C ! !
+C ! This is the WMO definition, but it is entirely !
+C ! inadequate when secondary bit maps are present !
+C ! eg 3x3 global grid with a matrix of values !
+C ! 12x26 at each point. This gives a bit map with !
+C ! a length of 285480 octets which cannot be given!
+C ! in 16 bits. !
+C ! !
+C ! ECMWF uses the following definition for its !
+C ! wave model data. !
+C ! N - Number of secondary bit maps !
+C ! (ie the number of points which are 'not !
+C ! missing'). !
+C ! This definition will accommodate a 1x1 !
+C ! degree global grid. !
+C ! !
+C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+ IF( LENCODE ) THEN
+Ce
+Ce Octet number = 25 + NC1 + NC2
+Ce
+ IBYTEX = 25 + KSEC4(53) + KSEC4(55)
+Ce
+Ce Add in length of bit-maps, if present.
+Ce Length in bits is the number of values
+Ce remaining to be packed rounded
+Ce up to a number of octets.
+Ce
+ IF( KSEC4(9).EQ.32) IBYTEX = IBYTEX + (ILENF+7) / 8
+Ce
+Ce ECMWF wave model usage.
+Ce ECMWF is centre number 98, and local code table
+Ce 2 used for wave models is 140.
+Ce
+ IF( LECLOC .AND.KSEC1(1).EQ.140) THEN
+ IBYTEX = ILENF / (KSEC4(50) * KSEC4(51))
+ ENDIF
+ ENDIF
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IBYTEX,1,IBITS, 16,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 720
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting octet number'
+ WRITE(GRPRSM,*) 'GRIBEX: at which packed data begins'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C Special fix to handle overflow of this 16-bit field when
+C a large wave field is being decoded
+C
+ IF( LLARGE .AND. (IBYTEX.LT.2000) ) IBYTEX = IBYTEX + 65536
+C
+C Octet 14. Extended flags.
+C One 8 bit field.
+C
+ IF( LENCODE ) IFLAGX = KSEC4(8) + KSEC4(9) + KSEC4(10)
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IFLAGX,1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 721
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting extended flag field'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+ IF( LDECODE ) THEN
+Cd
+Cd In Edition 1 only 3 bits are used.
+Cd
+Cd -0------ for single datum at each grid point.
+Cd -1------ for matrix of values at each point.
+Cd --0----- for no secondary bit-maps.
+Cd --1----- for secondary bit-maps present.
+Cd ---0---- for second order values constant width.
+Cd ---1---- for second order values different widths.
+Cd
+ IF( IFLAGX.GE.64) THEN
+ KSEC4(8) = 64
+ IFLAGX = IFLAGX - 64
+ ENDIF
+Cd
+ IF( IFLAGX.GE.32) THEN
+ KSEC4(9) = 32
+ IFLAGX = IFLAGX - 32
+ ENDIF
+Cd
+ IF( IFLAGX.GE.16) THEN
+ KSEC4(10) = 16
+ IFLAGX = IFLAGX - 16
+ ENDIF
+ ENDIF
+C
+C Octets 15 - 16. NR - first dimension (rows) of
+C each matrix.
+C Octets 17 - 18. NC - second dimension (columns) of
+C each matrix.
+C Two 16 bit fields.
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC4(50),2,IBITS, 16,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 722
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting/extracting first or'
+ WRITE(GRPRSM,*) 'GRIBEX: second dimension of matrix'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C Octet 19. First dimension coordinate values
+C definition.
+C Octet 20. NC1 - Number of coefficients or values
+C used to specify first dimension coordinate function.
+C Octet 21. Second dimension coordinate values
+C definition.
+C Octet 22. NC2 - Number of coefficients or values
+C used to specify second dimension coordinate function.
+C Octet 23. First dimension physical significance.
+C Octet 24. Second dimension physical significance.
+C Six 8 bit fields.
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC4(52),6,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 723
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting six fields'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: from 1st dimension coordinate value on'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C Octets 25 - (24+NC1).
+C Coefficients to define first dimension coordinate
+C values in functional form, or the explicit
+C coordinate values.
+C Octets (25+NC1) - (24+NC1+NC2).
+C Coefficients to define second dimension coordinate
+C values in functional form, or the explicit
+C coordinate values.
+C (NC1+NC2) 8 bit fields.
+C
+C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C ! !
+C ! This is the WMO definition, but it is very !
+C ! limited and can only accommodate small integer !
+C ! fields values. !
+C ! !
+C ! ECMWF needs to use floating point numbers and !
+C ! for the wave models the definition is NC1+NC2 !
+C ! (8 bit and 24 bit) fields.
+C ! !
+C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+ ITEMP = KSEC4(53) + KSEC4(55)
+C
+C ECMWF wave model usage.
+C ECMWF is centre number 98, and local code table
+C 2 used for wave models is 140.
+C
+ IF( LECLOC .AND.KSEC1(1).EQ.140) THEN
+ ITRND = 1
+ DO 730 JLOOP=1,ITEMP
+C
+C One 8 bit and one 24 bit field.
+C
+ IF( LENCODE ) THEN
+Ce
+Ce Convert floating point to GRIB representation.
+ ISINT = KSEC4(JLOOP+59)
+ ZREAL = ZREAL4
+ CALL CONFP3 (ZREAL,IEXP,IMANT, IBITS,ITRND)
+ ENDIF
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IEXP,1,IBITS, 8,YFUNC,KRETA)
+ CALL INXBIT(KGRIB,KLENG,INSPT,IMANT,1,IBITS,24,YFUNC,KRETB)
+ KRET = KRETA + KRETB
+ IF( KRET.NE.0) THEN
+ KRET = 724
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting first or'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: second dimension coefficients'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+ IF( LDECODE ) THEN
+Cd
+Cd Convert GRIB representation to floating point.
+ CALL DECFP2 (ZREAL,IEXP,IMANT)
+ ZREAL4 = ZREAL
+ KSEC4(JLOOP+59) = ISINT
+ ENDIF
+C
+ 730 CONTINUE
+ ELSE
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,KSEC4(57),ITEMP,
+ X IBITS,8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 724
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting first or'
+ WRITE(GRPRSM,*) 'GRIBEX: second dimension coefficients'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ ENDIF
+C
+C Matrix bit-maps may follow.
+C
+ IF( KSEC4(9).EQ.32) THEN
+ ITEMP = KSEC4(50) * KSEC4(51)
+ IF( LENCODE ) THEN
+ CALL INSMP2 (KGRIB,KLENG,INSPT,PSEC4,
+ X ILENF,IBITS,ZMSVAL,YFUNC,
+ X ITEMP,NDBG,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 725
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting secondary bit-map'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ ILEN = ILENF
+ ELSE
+Cd
+Cd Retain pointer to bit-map location.
+ IBMAP2 = INSPT
+Cd
+Cd Set pointer to start of packed data.
+Cd
+ IF( LECLOC .AND.KSEC1(1).EQ.140) THEN
+ ITEMP = KSEC4(50)*KSEC4(51)*IBYTEX
+ ITEMP = (ITEMP+7) / 8
+ INSPT = INSPT + ITEMP * 8
+ ELSE
+ INSPT = INSPT + (IBYTEX-25-KSEC4(53) -KSEC4(55)) * 8
+ ENDIF
+C
+ ENDIF
+ ENDIF
+C
+ ENDIF
+C
+C* For spherical harmonic data (simple packing), real (0,0)
+C coefficient is in floating point representation in
+C octets 12-15.
+C One 8 bit and one 24 bit field.
+C
+ IF( LSPHERC ) THEN
+C
+C Convert floating point to GRIB representation.
+ ITRND = 1
+ IF( LENCODE ) CALL CONFP3 (PSEC4(1),IEXP,IMANT,IBITS,ITRND)
+C
+C Insert / extract fields.
+C
+ CALL INXBIT(KGRIB,KLENG,INSPT,IEXP,1,IBITS, 8,YFUNC,KRETA)
+ CALL INXBIT(KGRIB,KLENG,INSPT,IMANT,1,IBITS, 24,YFUNC,KRETB)
+ KRET = KRETA + KRETB
+ IF( KRET.NE.0) THEN
+ KRET = 711
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting real coefficient'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+ IF( LDECODE .AND. (.NOT. L_IORJ) ) THEN
+Cd
+Cd Convert GRIB representation to floating point.
+Cd
+ IF( IMISS.EQ.1) THEN
+ PSEC4(1) = 0.0
+ ELSE
+ CALL DECFP2 (PSEC4(1),IEXP,IMANT)
+ ENDIF
+ ENDIF
+ ENDIF
+C
+C* Octet N onwards - Packed data.
+C
+C If decoding , calculate number of data values, unless
+C number has been given by user for 'X' function.
+C
+ IF( LDECODE ) THEN
+ IF( HOPER.EQ.'X') THEN
+ ILEN = KSEC4(34)
+Cdx
+Cdx Otherwise, use the byte counts
+ ELSEIF( KSEC4(2).NE.0) THEN
+ ILEN = (IPLEN+(ILEN4*8)-INSPT-INIL)/KSEC4(2)
+Cd
+Cd If explicitly constant field, use section 2 information
+Cd
+ ELSEIF( .NOT.LSECT2 ) THEN
+ KRET = 726
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Constant (0-bit) field without section 2'
+ WRITE(GRPRSM,*) 'GRIBEX: not supported'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ELSEIF( LSPHERC ) THEN
+ KRET = 727
+ WRITE(GRPRSM,*) 'GRIBEX: Constant (0-bit) spectral field'
+ WRITE(GRPRSM,*) 'GRIBEX: not supported'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ELSEIF( HOPER.EQ.'G'.OR.HOPER.EQ.'B') THEN
+ KRET = 728
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Constant (0-bit) field: function ',HOPER(:1)
+ WRITE(GRPRSM,*) 'not supported'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ELSEIF( LQUASI ) THEN
+Cd
+ IF( MOD(KSEC2(11),64).LT.32) THEN
+ INROWS=KSEC2(3)
+ ELSE
+ INROWS=KSEC2(2)
+ ENDIF
+Cd
+ ILEN=0
+Cd
+ DO 740 JLOOP = 1 , INROWS
+ ILEN=ILEN+KSEC2(22+JLOOP)
+ 740 CONTINUE
+Cd
+ ELSE
+ ILEN=KSEC2(2)*KSEC2(3)
+ ENDIF
+Cd
+Cd Total number of values = packed + unpacked.
+Cd
+ IF( HOPER .EQ. 'B' ) THEN
+ KSEC4(1) = (ILEN+NBYTE-1)/NBYTE
+ KSEC4(21) = ILEN
+Cd
+ ELSE
+ KSEC4(1) = ILEN + IFPT
+ ENDIF
+Cd
+Cd Check length of output array.
+Cd
+ IF( (KSEC4(1).GT.KLENP) .AND.
+ X (HOPER.NE.'G') .AND.
+ X (HOPER.NE.'J') ) THEN
+ KRET = 710
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Output array too small. Length = ',KLENP
+ WRITE(GRPRSM,*) 'GRIBEX: Number of values = ', KSEC4(1)
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cd
+ IF( KSEC4(2).EQ.0) THEN
+C
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Explicitly constant field (0-bit).'
+C
+C Explicitly constant field, filled directly.
+C
+ IF( HOPER.NE.'J') THEN
+C
+ IF( KSEC1(23).EQ.0) THEN
+ ZVAL = ZREF
+ ELSE
+ ZVAL = ZREF / 10.**KSEC1(23)
+ ENDIF
+C
+ DO 750 JLOOP = 1 , ILEN
+ PSEC4(IFPT+JLOOP) = ZVAL
+ 750 CONTINUE
+C
+ ENDIF
+C
+Cx Option 'X', only a few points extracted.
+Cx
+ IF( HOPER.EQ.'X') THEN
+Cx
+Cx Convert to integer if original data was integer.
+Cx
+ IF( KSEC4(5).EQ.32 ) CALL RORINT(PSEC4,PSEC4,KSEC4(1),'I')
+ GO TO 900
+Cx
+ ENDIF
+C
+ GOTO 800
+C
+ ENDIF
+C
+ ENDIF
+C
+C
+C* Scale and store, or extract and scale data values.
+C
+C Only a few points to be unpacked.
+C
+ IF( HOPER.EQ.'X') THEN
+Cx
+Cx Check that a section 2 is present.
+Cx
+ IF( .NOT.LSECT2 ) THEN
+ KRET = 798
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Function is X but no section 2 included'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cx
+Cx Check that no bit-map is included.
+Cx
+ IF( LSECT3 ) THEN
+ KRET = 717
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Function is X and a bit-map is included'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cx
+Cx Check that field is Gaussian or latitude/longitude grid.
+Cx
+ IF( KSEC2(1).NE.0.AND.KSEC2(1).NE.4.AND.
+ X KSEC2(1).NE.10.AND.KSEC2(1).NE.14.AND.
+ X KSEC2(1).NE.20.AND.KSEC2(1).NE.24.AND.
+ X KSEC2(1).NE.30.AND.KSEC2(1).NE.34) THEN
+ KRET = 716
+ WRITE(GRPRSM,*) 'GRIBEX: Function is X and field is not'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Gaussian or Latitude/longitude field'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cx
+Cx Check that scanning mode is West to East and North to South.
+Cx
+ IF( KSEC2(11).NE.0) THEN
+ KRET = 715
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Function is X and scanning mode is not'
+ WRITE(GRPRSM,*) 'GRIBEX: North to South and West to East'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cx
+Cx Check that number of points required does not exceed
+Cx maximum or minimum allowed.
+Cx
+ IF( KSEC4(34).GT.4.OR.KSEC4(34).LT.1) THEN
+ KRET = 714
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Invalid no. of values for function X = ',KSEC4(34)
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cx
+ ITEMP = 1
+Cx
+Cx Take into account decimal scaling factor, if any.
+Cx
+ IF( KSEC1(23).NE.0) THEN
+ ZREF = ZREF / 10.**KSEC1(23)
+ ZSCALE = ZSCALE / 10.**KSEC1(23)
+ ENDIF
+Cx
+Cx Skip down latitude rows.
+ DO 770 JLOOPO = 1,KSEC4(34)
+Cx
+Cx Regular grid.
+ IF( .NOT. LQUASI) THEN
+ ISKIP = (KSEC4(34+ITEMP)-1) * KSEC2(2)
+Cx
+Cx Quasi-regular grid.
+ ELSE
+ ISKIP = 0
+ DO 760 JLOOP = 1,KSEC4(34+ITEMP) - 1
+ ISKIP = ISKIP + KSEC2(22+JLOOP)
+ 760 CONTINUE
+ ENDIF
+Cx
+Cx Skip any points not required on this latitude row.
+ ISKIP = ISKIP + KSEC4(34+ITEMP+1) - 1
+Cx
+Cx Calculate number of bits in these values and add
+Cx to current value of bit-pointer.
+ ISKIP = ISKIP * KSEC4(2) + INSPT
+Cx
+Cx Extract value from 1 point.
+ CALL INXBIT(KGRIB,KLENG,ISKIP,IJDC,1,
+ X IBITS,KSEC4(2),YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 712
+ WRITE(GRPRSM,*) 'GRIBEX: Error extracting data values'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ IJDCXX = IJDC
+Cx
+ IF( KSEC4(5).EQ.32 ) THEN
+Cx
+Cx Integer values
+Cx
+#if (defined REAL_BIGGER_THAN_INTEGER)
+ PSEC4(JLOOPO) = ZREF + DBLE(IJDCXX)*ZSCALE
+#else
+ PSEC4(JLOOPO) = ZREF + IJDCXX*ZSCALE
+#endif
+ IJDCXX = PSEC4(JLOOPO)
+ PSEC4(JLOOPO) = RJDCXX
+Cx
+ ELSE
+Cx
+Cx Real values
+Cx
+#if (defined REAL_BIGGER_THAN_INTEGER)
+ PSEC4(JLOOPO) = ZREF + DBLE(IJDCXX)*ZSCALE
+#else
+ PSEC4(JLOOPO) = ZREF + IJDCXX*ZSCALE
+#endif
+ ENDIF
+ ITEMP = ITEMP + 2
+ 770 CONTINUE
+Cx
+ GOTO 900
+ ENDIF
+C
+C*******************************************************************
+C All data to be unpacked or packed.
+C*******************************************************************
+C
+C Scale the fields using the reference value and scaling factor
+C
+ IF( LENCODE .AND. (HOPER .NE. 'A') )
+ X CALL INSCAL(PSEC4(IFPT+1),PSEC4(IFPT+1),ILEN,ZREF,ZSCALE,NBPV)
+C
+C Insert / extract fields, unless special 'G' operation or
+C if 'J' option in effect.
+C
+ IF( LENCODE.AND.LGRDPT.AND.(KSEC4(4).NE.0.OR.HOPER.EQ.'K')) THEN
+Ce
+Ce*******************************************
+Ce
+Ce Complex packing ("second-order packing") for grid-point.
+Ce
+ INSPT=INSPT-11*8
+ KRET = C2ORDR( PSEC4, KLENP, KSEC1, KSEC2, KSEC3, KSEC4,
+ X KGRIB, KLENG, INSPT, IBITS, HOPER, IBMAP,
+ X IVALS, ZREF, ZMAX, ILEN, NDBG )
+Ce
+Ce Give up if error reported.
+ IF( KRET .NE. 0 ) GOTO 900
+Ce
+C
+ ELSEIF( (HOPER.NE.'G') .AND. (.NOT.L_IORJ) ) THEN
+Cd
+#ifdef REAL_BIGGER_THAN_INTEGER
+ IF( LDECODE .AND. (HOPER.NE.'B') ) THEN
+Cd
+Cd Split the values into groups of length 'JPNSEC4' (maximum)
+Cd
+ ILOOPS = 1+(ILEN-1)/JPNSEC4
+ IINDEX = IFPT
+Cd
+ DO 785 JLOOPO = 1, ILOOPS
+ ILNGTH = MIN(JPNSEC4,ILEN-(JLOOPO-1)*JPNSEC4)
+ CALL INXBIT(KGRIB,KLENG,INSPT,NSEC4,ILNGTH,
+ X IBITS,KSEC4(2),YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 712
+ WRITE(GRPRSM,*) 'GRIBEX: Error extracting data values'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ DO 780 JLOOP = 1, ILNGTH
+ PSEC4(IINDEX + JLOOP) = ZREF + NSEC4(JLOOP)*ZSCALE
+ 780 CONTINUE
+ IINDEX = IINDEX + ILNGTH
+ 785 CONTINUE
+Cd
+Cd Change units of data values, if required.
+Cd
+ IF( KSEC1(23).NE.0) THEN
+ DO 790 JLOOP = 1 , KSEC4(1)
+ PSEC4(JLOOP) = PSEC4(JLOOP)/10.0**KSEC1(23)
+ 790 CONTINUE
+ ENDIF
+ GOTO 799
+ ENDIF
+Cb
+Cb Handle data for option 'B'
+Cb
+ IF( HOPER.EQ.'B' ) THEN
+Cb
+ ILOOPS = 1+(ILEN/NBYTE-1)/JPNSEC4
+ IINDEX = IFPT
+Cb
+ DO 794 JLOOPO = 1, ILOOPS
+ ILNGTH = MIN(JPNSEC4,ILEN-(JLOOPO-1)*JPNSEC4)
+ CALL INXBIT(KGRIB,KLENG,INSPT,NSEC4,ILNGTH,
+ X IBITS,KSEC4(2),YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 712
+ WRITE(GRPRSM,*) 'GRIBEX: Error extracting data values'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cb
+ DO 792 JLOOP = 1, ILNGTH
+ PSEC4(IINDEX + JLOOP) = XSEC4(JLOOP)
+ 792 CONTINUE
+Cb
+ IINDEX = IINDEX + ILNGTH
+ 794 CONTINUE
+Cb
+ GOTO 799
+Cb
+ ENDIF
+#endif
+C
+ IF( (HOPER.NE.'A') .AND. (HOPER.NE.'B') ) THEN
+ CALL INXBIT( KGRIB,KLENG,INSPT,PSEC4(IFPT+1),ILEN,
+ X IBITS,KSEC4(2),YFUNC,KRET)
+ ELSE
+ CALL INXBIT( KGRIB,KLENG,INSPT,PSEC4(IFPT+1),ILEN/NBYTE,
+ X IBITS,IBITS,YFUNC,KRET)
+ ENDIF
+ IF( KRET.NE.0) THEN
+ KRET = 712
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting data values'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+ ELSE
+C
+Cgj Option 'G' or 'J' in effect.
+Cgj
+ KSEC4(34) = INSPT
+C
+ IF( .NOT. L_IORJ ) THEN
+Cg
+Cg Option 'G' ...
+Cg
+Cg Return reference value, binary scale factor and
+Cg bit pointer to start of packed data.
+C
+ PSEC4(1) = ZREF
+ PSEC4(2) = ZSCALE
+ ENDIF
+Cj
+ IF( HOPER.EQ.'J' ) GOTO 815
+Cj
+ GO TO 900
+Cd
+ ENDIF
+C
+ 796 CONTINUE
+C
+ IF( LDECODE .AND. (HOPER .NE. 'B') ) THEN
+Cd
+ CALL EXSCAL(PSEC4(IFPT+1),PSEC4(IFPT+1),ILEN,ZREF,ZSCALE,LALLPOS)
+Cd
+Cd Change units of data values, if required.
+Cd
+ IF( KSEC1(23).NE.0) THEN
+ DO 798 JLOOP = 1 , KSEC4(1)
+ PSEC4(JLOOP) = PSEC4(JLOOP)/10.0**KSEC1(23)
+ 798 CONTINUE
+ ENDIF
+Cd
+ ENDIF
+C
+ 799 CONTINUE
+C
+C* Enter length of binary data section, ensuring that the
+C length is an even number of octets, padding with binary
+C zeroes as required.
+C One 24 bit field.
+C
+ IF( YFUNC.NE.'C') GO TO 800
+Ce
+Ce Length of section 4, in bits.
+Ce
+ ILEN4 = INSPT - IPLEN
+ IL = ILEN4 / 16
+ IL = ILEN4 - ( IL * 16 )
+ INIL = 0
+ IF( IL.NE.0) THEN
+ INIL = 16 - IL
+Ce
+Ce Insert padding zeroes at end of section 4
+Ce
+ ITEMP = 0
+ CALL INXBIT(KGRIB,KLENG,INSPT,ITEMP,1,IBITS,INIL,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 734
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting padding zeroes at end of section 4'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ',KRET
+ GO TO 900
+ ENDIF
+ ILEN4 = ILEN4 + INIL
+ ENDIF
+Ce
+ ILEN4 = ILEN4 / 8
+Ce
+Ce Because of the restriction on product lengths to 3 octets,
+Ce if a very large product, the section 4 length field holds
+Ce the number of bytes in the product after section 4 upto
+Ce the end of the padding bytes.
+Ce This is only feasible because the (default) rounding for
+Ce GRIB products is 120 bytes.
+Ce In this case, delay encoding the value until section 5 has
+Ce been encoded.
+Ce
+ IF( ILEN4.GE.JP23SET ) THEN
+ LLARGE = .TRUE.
+ IPLEN = IPLEN + 24
+ ELSE
+Ce
+Ce Insert field.
+ CALL INXBIT(KGRIB,KLENG,IPLEN,ILEN4,1,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 701
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting section 4 length'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ ENDIF
+Ce
+Ce Enter flag / unused bits field.
+Ce One 8 bit field.
+Ce Two 4 bit fields.
+Ce
+ IFLAG = KSEC4(3) + KSEC4(4) + KSEC4(5) + KSEC4(6)
+ IFLAG = IFLAG + INIL
+Ce
+Ce Print number of unused bits, if required.
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Number of unused bits is ',INIL,'.'
+Ce
+Ce Insert field.
+ CALL INXBIT(KGRIB,KLENG,IPLEN,IFLAG,1,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 713
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting/extracting flag and unused bit field'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 8 . Code/decode End Section (Section 5) of GRIB code.
+C -----------------------------------------------------------------|
+C
+ 800 CONTINUE
+C
+ IF( LPDEBUG ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Section 8. Handle End Section (Section 5)'
+C
+C* Ascii 7 7 7 7 at end of coded data.
+C Four 8 bit fields.
+C
+ IF( LENCODE ) THEN
+Ce
+Ce Insert field.
+ IP7777 = INSPT
+ CALL INXBIT(KGRIB,KLENG,INSPT,I7777(1),4,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 801
+ WRITE(GRPRSM,*) 'GRIBEX: Error inserting 7777 group'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ',KRET
+ GO TO 900
+ ENDIF
+Ce
+Ce Length of GRIB message.
+ KSEC0(1) = INSPT / 8
+ ITEMP = KSEC0(1)
+Ce
+Ce Because of the restriction on product lengths to 3 octets, if
+Ce more than 24 bits is needed, rescale by a factor of -120 to give
+Ce a (smaller) negative count. It is only possible because
+Ce the (default) rounding for GRIB products is 120 bytes.
+Ce
+ IF( ITEMP.GE.JP23SET ) THEN
+ LLARGE = .TRUE.
+ ELSE
+Ce
+Ce When encoding, use most-significant bit as a sign bit.
+Ce
+ CALL CSGNBT( KSEC0(1), ITEMP, 24, KRET)
+Ce
+Ce Insert field.
+ ITEMP = 32
+ CALL INXBIT(KGRIB,KLENG,ITEMP,KSEC0(1),1,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 802
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting length of GRIB message'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ ENDIF
+Ce
+Cjdc ELSE
+ ENDIF
+Cj
+Cj 'J' option jumps here for possible bitmap adjustment
+Cj to number of values in field section 4.
+Cj
+ 815 CONTINUE
+C
+ IF( LDECODE ) THEN
+Cj
+ IF( L_IORJ ) GOTO 816
+Cj
+Cd Skip padding.
+ INSPT = INSPT + INIL
+Cd
+ CALL INXBIT(KGRIB,KLENG,INSPT,IPARM(1),4,IBITS, 8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 801
+ WRITE(GRPRSM,*) 'GRIBEX: Error extracting 7777 group'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ',KRET
+ GO TO 900
+ ENDIF
+Cd Check that length is consistent with the number of the header file
+Cd this will not happen for very large grib products with the *120 nightmare fix
+Cd in this *120 case the KSEC0(1) is updated with the value of the pointer/8
+ IF( LLARGE) THEN
+ IF( KSEC0(1).NE.INSPT/8) THEN
+ IF( LPDEBUG ) THEN
+ WRITE(GRPRSM,*) 'GRIBEX: Large product found', KSEC0(1)
+ ENDIF
+ KSEC0(1) = INSPT/8
+ IF( LPDEBUG ) THEN
+ WRITE(GRPRSM,*) 'GRIBEX: KSEC0(1) updated to = ', KSEC0(1)
+ ENDIF
+ ENDIF
+ ENDIF
+Cd
+Cd Check that 7777 group is found where expected.
+ ICOUNT = 0
+ DO 810 JLOOP = 1 , 4
+ IF( IPARM(JLOOP).NE.55) ICOUNT = ICOUNT + 1
+ 810 CONTINUE
+ IF( ICOUNT.NE.0) THEN
+ KRET = 805
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: End of message 7777 group not found.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Cd
+Cd Final handling when bit-maps included.
+Cd
+ 816 CONTINUE
+Cd
+ IF( LSECT3 ) THEN
+Cd
+Cd Bit-map included in GRIB message.
+ IF( KSEC3(1).EQ.0) THEN
+Cd
+ IF( KSEC4(8).EQ.0.OR.KSEC4(9).EQ.0) THEN
+Cd
+Cd Single value at each point.
+Cd
+ ITEMP = 1
+Cd
+Cd Pointer IBMAP2 is set negative if there
+Cd are no matrix bit-maps.
+Cd
+ IBMAP2 = -1
+ ITEMP = 1
+ ELSE
+Cd
+Cd Matrix of values at a point.
+Cd
+ ITEMP = KSEC4(50) * KSEC4(51)
+ ENDIF
+Cd
+ IF( .NOT.L_IORJ ) THEN
+Cd
+Cd Check user array is big enough before using bitmap to
+Cd fill missing data values (not relevant for 'J' option)
+Cd
+ IF( KLENP .LT. (IVALS*ITEMP) ) THEN
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Output array is not big enough to'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: allow expansion using bitmaps'
+ KRET = 729
+ GOTO 900
+ ENDIF
+Cd
+Cd Expand using bitmaps
+Cd
+ CALL EXTMAP(KGRIB,KLENG,IBMAP,IBMAP2,KSEC4(1),PSEC4,IVALS,
+ X IBITS,ISBMAP,ZMSVAL,ITEMP,NDBG,KRET,NONMISS)
+ IF( KRET.NE.0) THEN
+ KRET = 806
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error extracting primary/secondary bit map.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ KSEC4(1) = IVALS*ITEMP
+Cj
+ ELSE IF( HOPER.EQ.'J' ) THEN
+Cj
+Cj Cannot handle secondary bitmaps for 'J' option counting
+Cj
+ IF( IBMAP2.NE.-1 ) THEN
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Cannot handle 2ndary bitmaps for J option'
+ KRET = 811
+ GOTO 900
+Cj
+ ELSE
+Cj
+Cj Count bits in primary bitmap only ('J' option)
+Cj
+ IS3BYTE = (IBMAP/8 - 6)
+ NONMISS = ONEBITS(KGRIB,IS3BYTE)
+ KSEC4(21) = NONMISS
+ KSEC4(1) = IVALS
+ ENDIF
+ ENDIF
+Cd
+ ELSE
+#ifdef USE_NO_POINTERS
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: predetermined bit-map reference not handled'
+ KRET = 735
+ GOTO 900
+#else
+Cd
+Cd Predetermined bit-map reference only.
+Cd (Secondary bitmaps not handled in this case).
+Cd
+ IBMAP2 = -1
+Cd
+Cd Single value at each point.
+Cd
+ ITEMP = 1
+Cd
+Cd Get the bitmask
+Cd
+ KRET = GBITMAP(KSEC3(1), IBTVALS, NONMISS, IBTPTR, NBYTE)
+ IF( KRET.NE.0 ) THEN
+ WRITE(GRPRSM,*) 'GRIBEX: Problem getting bitmap'
+ GOTO 900
+ ENDIF
+Cd
+Cd Expand using bitmap
+Cd
+ IBMAP = 0
+Cd
+Cd Set integer or real missing data value.
+Cd
+ IF( KSEC4(5) .EQ. 0 ) THEN
+ ZMSVAL = PSEC3(2)
+ ELSE
+ ZMSVAL = REAL(KSEC3(2))
+ ENDIF
+ CALL EXTMAP(IBTMAP, KLENG, IBMAP, IBMAP2, KSEC4(1), PSEC4,
+ X IBTVALS,IBITS, ISBMAP,ZMSVAL, ITEMP, NDBG, KRET,
+ X NONMISS)
+ IF( KRET.NE.0) THEN
+ KRET = 806
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error extracting primary or secondary bit map.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ KSEC4(1) = IBTVALS*ITEMP
+Cd
+#endif
+ ENDIF
+ ENDIF
+Cd
+#ifndef USE_NO_POINTERS
+Cd
+Cd If required, convert quasi-regular grid to regular.
+Cd
+ IF( HOPER.EQ.'R'.AND.LQUASI) THEN
+Cr
+Cr Quasi-regular gaussian ..
+Cr
+ IF( (KSEC2(1).EQ. 4).OR.
+ X (KSEC2(1).EQ.14).OR.
+ X (KSEC2(1).EQ.24).OR.
+ X (KSEC2(1).EQ.34) ) THEN
+Cr
+Cr Gaussian grid must be global
+Cr
+ INOLAT = KSEC2(10) * 2
+Cr
+ IF( KSEC2(3).NE.INOLAT ) THEN
+ KRET = 808
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error converting quasi-regular gaussian grid'
+ WRITE(GRPRSM,*) 'GRIBEX: to regular. Grid must be global.'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ',KRET
+ GO TO 900
+ ENDIF
+Cr
+ INOLNG = INOLAT * 2
+ KSEC2(9) = NINT(360000.0/REAL(INOLNG))
+ LPERIO = .TRUE.
+C
+C Some ECMWF 'vegetation' parameters have to be interpolated
+C using 'nearest neighbour' processing
+C
+ NITABLE = KSEC1(1)
+ NICENTRE = KSEC1(2)
+ NIPARAM = KSEC1(6)
+ LVEGGY = (NITABLE.EQ.128).AND.
+ X (NICENTRE.EQ.98).AND.
+ X ((NIPARAM.EQ.27).OR.
+ X (NIPARAM.EQ.28).OR.
+ X (NIPARAM.EQ.29).OR.
+ X (NIPARAM.EQ.30))
+ IF( LPDEBUG ) THEN
+ IF( LVEGGY ) WRITE(GRPRSM,*)
+ X 'GRIBEX: Nearest neighbour processing used for R option'
+ ENDIF
+ CALL QU2REG3(PSEC4,KSEC2(23),INOLAT,INOLNG,1,ZMSVAL,KRET,
+ X LSECT3,LPERIO,LVEGGY)
+ IF( KRET .NE. 0 ) THEN
+ KRET = 808
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error converting quasi-regular gaussian grid'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: to regular. Return code = ',KRET
+ GO TO 900
+ ENDIF
+Cr
+Cr Quasi-regular latitude-longitude ..
+Cr
+ ELSE IF( (KSEC2(1).EQ. 0).OR.
+ X (KSEC2(1).EQ.10).OR.
+ X (KSEC2(1).EQ.20).OR.
+ X (KSEC2(1).EQ.30) ) THEN
+ INOLAT = IABS(KSEC2(4) - KSEC2(7))
+ IEAST = KSEC2(5)
+Cr
+Cr Special case: symmetrical about equator, no equator
+Cr Have to calculate extreme longitude
+Cr (Fixup for reduced lat/long grids reporting last point
+Cr correctly)
+Cr
+ IF((MOD(KSEC2(3),2).EQ.0).AND.(KSEC2(4).EQ.(-KSEC2(7))))THEN
+ N = KSEC2(3)/2
+ NP = KSEC2(22+N)
+ NINC = 360000/NP
+ KSEC2(8) = IEAST + NINC*(NP-1)
+ KSEC2(9) = NINC
+ ENDIF
+ IWEST = KSEC2(8)
+ IF( IWEST .LT. IEAST ) IWEST = IWEST + 360000
+ INOLNG = IABS(IWEST - IEAST)
+Cr
+Cr Allow for missing Di or Dj increment.
+Cr
+ IF( KSEC2(9) .EQ. IMISNG ) THEN
+ INOLAT = 1 + INOLAT/ KSEC2(10)
+ INOLNG = 1 + INOLNG/ KSEC2(10)
+ KSEC2(9) = KSEC2(10)
+ ELSE
+ INOLAT = 1 + INOLAT/ KSEC2(9)
+ INOLNG = 1 + INOLNG/ KSEC2(9)
+ KSEC2(10) = KSEC2(9)
+ ENDIF
+Cr
+Cr Check if input domain is periodic.
+Cr
+ ILOEXT = KSEC2(8)+(1-2*(KSEC2(11)/128))*KSEC2(9)
+ LPERIO = MOD( IABS(ILOEXT-KSEC2(5) ), 360000) .EQ. 0
+ CALL QU2REG3(PSEC4,KSEC2(23),INOLAT,INOLNG,1,ZMSVAL,KRET,
+ X LSECT3,LPERIO,LVEGGY)
+ IF( KRET .NE. 0 ) THEN
+ KRET = 808
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error converting quasi-regular gaussian grid'
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: to regular. Return code = ',KRET
+ GO TO 900
+ ENDIF
+Cr
+ ENDIF
+Cr
+ KSEC4(1) = INOLAT * INOLNG
+ KSEC2(2) = INOLNG
+ KSEC2(3) = INOLAT
+ KSEC2(6) = 128
+ KSEC2(17) = 0
+ LQUASI = .FALSE.
+ ENDIF
+#endif
+Cj
+ IF( HOPER.EQ.'J' ) GOTO 900
+Cj
+Cd
+Cd Convert to integer if original data was integer.
+Cd
+ IF( ( KSEC4(5) .EQ. 32 ) .AND. (HOPER.NE.'B') )
+ X CALL RORINT(PSEC4,PSEC4,KSEC4(1),'I')
+Cd
+Cd Set number of values decoded negative, if missing data.
+Cd
+ IF( IMISS.EQ.1) KSEC4(1) = - KSEC4(1)
+Cd
+Cd If GRIB Edition number is -1 or 0, set GRIB message
+Cd length for return to user.
+Cd
+ IF( KSEC0(2).EQ.-1.OR.KSEC0(2).EQ.0) KSEC0(1) = INSPT / 8
+Cd
+ GO TO 900
+Cd
+ ENDIF
+C
+C* Set unused part of last word to binary zeroes.
+C
+ KWORD = INSPT / IBITS
+ ITEMP = KWORD * IBITS
+ IOFF = INSPT - ITEMP
+ IF( IOFF.NE.0) THEN
+ CALL INXBIT(KGRIB,KLENG,INSPT,0,1,IBITS,(IBITS-IOFF),YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 809
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error padding unused part of GRIB to zero'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ KWORD = KWORD + 1
+ ENDIF
+C
+C* Round length to a multiple of 120 octets, if required,
+C Set any additional words to 0.
+C
+ IF( (NRND.EQ.1).OR.LLARGE ) THEN
+ I = INSPT / 960
+ I = I * 960
+ I = INSPT - I
+ IF( I.NE.0) THEN
+ I = (960 - I)
+ ITEMP = MOD(I,8)
+ CALL INXBIT(KGRIB,KLENG,INSPT,0,1,IBITS,ITEMP,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 810
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error padding GRIB to multiple of 120'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ ITEMP = I/8
+ DO 820 JLOOP = 1, ITEMP
+ CALL INXBIT(KGRIB,KLENG,INSPT,0,1,IBITS,8,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 810
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error padding GRIB to multiple of 120'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ 820 CONTINUE
+ I = I / IBITS
+ ENDIF
+ KWORD = KWORD + I
+ ENDIF
+Ce
+ IF( LLARGE.AND.LENCODE ) THEN
+Ce
+Ce Because of the restriction on product lengths to 3 octets, if
+Ce more than 24 bits is needed, rescale by a factor of -120 to give
+Ce a (smaller) negative count. It is only possible because
+Ce the (default) rounding for GRIB products is 120 bytes.
+Ce
+ ITEMP = (KWORD*(IBITS/8)) / (-120)
+Ce
+Ce When encoding, use most-significant bit as a sign bit.
+Ce
+ CALL CSGNBT( KSEC0(1), ITEMP, 24, KRET)
+Ce
+Ce Insert product length field.
+ ITEMP = 32
+ CALL INXBIT(KGRIB,KLENG,ITEMP,KSEC0(1),1,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 802
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting length of GRIB message'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+Ce
+Ce If encoding a very large product, the section 4 length field
+Ce holds the number of bytes in the product after section 4 upto
+Ce the end of the padding bytes. In this case, the setting
+Ce of this field has been postponed upto this point.
+Ce
+ IPLEN = IPLEN - 32
+ ILEN4 = KWORD*(IBITS/8) - (IP7777/8)
+Ce
+Ce Insert section 4 length.
+ CALL INXBIT(KGRIB,KLENG,IPLEN,ILEN4,1,IBITS, 24,YFUNC,KRET)
+ IF( KRET.NE.0) THEN
+ KRET = 802
+ WRITE(GRPRSM,*)
+ X 'GRIBEX: Error inserting length of GRIB section 4'
+ WRITE(GRPRSM,*) 'GRIBEX: Return code = ', KRET
+ GO TO 900
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Abort/return to calling routine.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( LPDEBUG ) THEN
+ WRITE(GRPRSM,*) 'GRIBEX: Section 9.'
+ WRITE(GRPRSM,*) 'GRIBEX: Output values set -'
+ IF( LDECODE ) THEN
+ CALL GRPRS0(KSEC0)
+ CALL GRPRS1(KSEC0,KSEC1)
+Cd
+Cd Print section 2 if present.
+Cd
+ IF( LSECT2 ) CALL GRPRS2(KSEC0,KSEC2,PSEC2)
+Cd
+Cd Print section 3 if present.
+Cd
+ IF( LSECT3 ) CALL GRPRS3(KSEC0,KSEC3,PSEC3)
+Cd
+ CALL GRPRS4(KSEC0,KSEC4,PSEC4)
+Cd
+Cd Special print for 2D spectra wave field real values in
+Cd section 4
+Cd
+ IF( (KSEC1(1).EQ.140) .AND.
+ X (KSEC1(2).EQ. 98) .AND.
+ X (KSEC1(24).EQ. 1) .AND.
+ X ( (KSEC1(40).EQ.1045).OR.(KSEC1(40).EQ.1081) ) .AND.
+ X ( (KSEC1(6) .EQ. 250).OR.(KSEC1(6) .EQ. 251) ) )
+ X CALL GRPRS4W(KSEC4)
+ ENDIF
+ ENDIF
+C
+C Effective number of points in masked field returned in KSEC4(21).
+C Bit-map pointer within masked field returned in KSEC4(22).
+C
+ IF( LSECT3 ) THEN
+ KSEC4(21) = NONMISS
+ KSEC4(22) = IBMAP
+ ENDIF
+C
+C Length of section 4 (octets) in KSEC4(23).
+C Unused bit count returned in KSEC4(24).
+C
+ KSEC4(23) = ILEN4
+ KSEC4(24) = INIL
+C
+C* If no error has been encountered, set return code to informative
+C value, if required.
+C
+C Set pseudo-GRIB data encountered.
+C
+ IF( KRET.EQ.0.AND.IPSEUD.NE.0) KRET = IPSEUD
+C
+C Set data with bit-map encountered (unless 'J' option in use).
+C
+ IF( (KRET.EQ.0.AND.ISBMAP.NE.0).AND.(HOPER.NE.'J')) KRET = ISBMAP
+C
+C Dumping data values on a file if an error occurs and the environment
+C variable GRIBEX_DUMP_DATA_ON_ERROR is set
+ IF (( HOPER.EQ.'C'.OR.HOPER.EQ.'M'.OR.HOPER.EQ.'K')
+ x .AND.DUMPDATA.NE.0) THEN
+ OPEN(IDUMP,FILE=DUMPPATH,FORM='FORMATTED',STATUS='UNKNOWN')
+ do jloop=1,klenp
+ write(IDUMP,'(E20.10)') PSEC4(jloop)
+ enddo
+ close(IDUMP)
+ ENDIF
+C
+C* Abort if an error has been encountered and user has requested
+C an abort. Informative values are negative and do not cause an
+C abort.
+C
+ IF( (NOABORT.EQ.0) .AND. (KRET.GT.0) ) THEN
+C
+C Try to print some useful information before aborting
+C
+ WRITE(GRPRSM,*) 'GRIBEX: ********************************'
+ WRITE(GRPRSM,*) 'GRIBEX: Version is ',YGRIBEX
+ WRITE(GRPRSM,*) 'GRIBEX: KLENP = ', KLENP
+ WRITE(GRPRSM,*) 'GRIBEX: KLENG = ', KLENG
+ WRITE(GRPRSM,*) 'GRIBEX: HOPER = ', HOPER
+ WRITE(GRPRSM,*) 'GRIBEX: ********************************'
+ DO 910 JLOOP = 1, 43
+ WRITE(GRPRSM,*) 'GRIBEX: KSEC1(',JLOOP,') = ', KSEC1(JLOOP)
+ 910 CONTINUE
+ WRITE(GRPRSM,*) 'GRIBEX: ********************************'
+ DO 920 JLOOP = 1, 22
+ WRITE(GRPRSM,*) 'GRIBEX: KSEC2(',JLOOP,') = ', KSEC2(JLOOP)
+ 920 CONTINUE
+ WRITE(GRPRSM,*) 'GRIBEX: ********************************'
+ DO 930 JLOOP = 1, 10
+ WRITE(GRPRSM,*) 'GRIBEX: PSEC2(',JLOOP,') = ', PSEC2(JLOOP)
+ 930 CONTINUE
+ WRITE(GRPRSM,*) 'GRIBEX: ********************************'
+ DO 940 JLOOP = 1, 2
+ WRITE(GRPRSM,*) 'GRIBEX: KSEC3(',JLOOP,') = ', KSEC3(JLOOP)
+ 940 CONTINUE
+ WRITE(GRPRSM,*) 'GRIBEX: ********************************'
+ DO 950 JLOOP = 1, 2
+ WRITE(GRPRSM,*) 'GRIBEX: PSEC3(',JLOOP,') = ', PSEC3(JLOOP)
+ 950 CONTINUE
+ WRITE(GRPRSM,*) 'GRIBEX: ********************************'
+ DO 960 JLOOP = 1, 20
+ WRITE(GRPRSM,*) 'GRIBEX: KSEC4(',JLOOP,') = ', KSEC4(JLOOP)
+ 960 CONTINUE
+ WRITE(GRPRSM,*) 'GRIBEX: ********************************'
+ DO 970 JLOOP = 1, 20
+ WRITE(GRPRSM,*) 'GRIBEX: PSEC4(',JLOOP,') = ', PSEC4(JLOOP)
+ 970 CONTINUE
+ WRITE(GRPRSM,*) 'GRIBEX: ********************************'
+ CALL ABORTX ('GRIBEX')
+ ELSE
+ RETURN
+ ENDIF
+C
+ END
+
+
diff --git a/gribex/gribex.h b/gribex/gribex.h
new file mode 100755
index 0000000..b06d5da
--- /dev/null
+++ b/gribex/gribex.h
@@ -0,0 +1,1527 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C**** GRIBEX - Coding and decoding of GRIB format data.
+C
+C Purpose.
+C --------
+C
+C 1) Code data in FM-92 GRIB code, Edition 1.
+C 2) Decode data from FM-92 GRIB code.
+C 3) Decode only identification sections of GRIB
+C coded data ie Sections 0, 1 and 2.
+C 4) Return length of GRIB message, in bytes, and GRIB
+C Edition number only.
+C
+C A number of options exist when coding or decoding -
+C see values allowed for requested function, HOPER, below.
+C
+C Decoding functions work on Experimental Edition,
+C Edition 0 and Edition 1 of GRIB code. Decoded values
+C for Sections 0 to 2 are always in Edition 1 format.
+C
+C** Interface.
+C ----------
+C
+C CALL GRIBEX (KSEC0,KSEC1,KSEC2,PSEC2,KSEC3,PSEC3,KSEC4,
+C X PSEC4,KLENP,KGRIB,KLENG,KWORD,HOPER,KRET)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters for all functions.
+C -----------------------------------
+C
+C HOPER - Requested function.
+C
+C
+C 'A' To encode 8-bit data into GRIB code
+C
+C 'B' To decode 8-bit data from GRIB code
+C
+C
+C 'C' To code data in GRIB code, with or
+C without bit-maps.
+C
+C 'D' To decode data from GRIB code. If
+C ECMWF pseudo-Grib data is encountered,
+C only sections 0 and 1 are decoded and
+C the return code is set to -6.
+C
+C 'G' Special decoding for graphics purposes.
+C Reference value returned in PSEC4(1)
+C Binary scale factor returned in PSEC4(2
+C Bit pointer to data increments in
+C KSEC4(34).
+C
+C 'I' To decode only identification
+C sections 0, 1 and 2 of GRIB or
+C pseudo-Grib data.
+C
+C 'J' To decode only identification
+C sections 0, 1, 3 and 4 of GRIB.
+C
+C 'K' Special "aggressive" coding: try all
+C the relevant methods of packing,
+C especially second-order packing,
+C in order to get the shortest
+C GRIB message. Effective only for
+C grid-point fields. No feedback in
+C KSEC4 descriptors, to preserve the
+C "read-only" status of this array.
+C
+C 'L' Return length of GRIB message, in
+C bytes, and GRIB Edition number only.
+C Length does not include any bytes
+C added to round message length to a
+C multiple of 120 bytes. Works also for
+C pseudo-Grib data.
+C
+C 'M' To code data in GRIB code and, if a
+C bit-map is encountered, make GRIB
+C message full length ie the same length
+C as if all data values were given.
+C
+C 'R' To decode data from GRIB code, and if
+C a quasi-regular Gaussian grid or a
+C quasi-regular latitude-longitude grid
+C is encountered, convert it to regular.
+C
+C 'S' To decode initialised analysis data
+C from GRIB code, and if data is in the
+C Experimental Edition of GRIB, set the
+C Time Range Indicator flag. In the
+C Experimental Edition there was no
+C distinction between initialised and
+C uninitialised analyses.
+C
+C 'X' To extract data values for up to 4
+C points from a GRIB coded Gaussian or
+C Latitude/longitude field, without
+C unpacking the data at other points.
+C See words 34 to 42 of KSEC4 below.
+C
+C 'Z' To decode data from GRIB code.
+C If a bit-map is encountered,
+C only sections 0,1 and 2 are decoded and
+C the return code is set to -5.
+C
+C KLENP - Length of array PSEC4.
+C
+C KLENG - Length of array KGRIB.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Negative return codes are
+C informative and do not cause
+C an abort.
+C Non- zero , Return to calling routine
+C even if error encountered.
+C
+C
+C
+C
+C
+C Input parameters for coding function.
+C Output Parameters for decoding functions.
+C -----------------------------------------
+C
+C KSEC1 - Integer parameters of Section 1 (Product
+C Definition Section) of GRIB code.
+C Integer array of at least 25 words.
+C
+C If Section 1 of the GRIB code contains
+C data for ECMWF local use, KSEC1 should
+C be sized accordingly eg 53 + N , where
+C N is the number of ensemble forecasts.
+C
+C Word Contents.
+C ---- ---------
+C 1 Version number of Code Table 2.
+C 2 Identification of centre (Code Table 0).
+C 3 Generating process identification number
+C ( allocated by originating centre ).
+C 4 Grid definition (NNN - Catalogue number
+C of grid used by originating centre. See
+C Volume B of publication WMO - No.9).
+C 5 Flag indication relative to Section 2
+C (Grid Description Section) and Section
+C 3 (Bit Map Section). Code Table 1.
+C Valid values are :-
+C
+C Decimal
+C value Meaning
+C ----- -------
+C 0 Sections 2 and 3 omitted.
+C 128 Section 2 included, Section 3
+C omitted.
+C 64 Section 2 omitted, Section 3
+C included.
+C 192 Sections 2 and 3 included.
+C
+C 6 Indicator of parameter (Code Table 2).
+C 7 Indicator of type of level (Code Table 3).
+C (or satellite identifier)
+C Satellite useage as defined by INPE/CPTEC
+C and used by ECMWF, pending final definition
+C by WMO.
+C 8 Height, pressure etc of level (Code Table 3).
+C Single level or top of layer.
+C (or satellite spectral band)
+C Satellite useage as defined by INPE/CPTEC
+C and used by ECMWF, pending final definition
+C by WMO.
+C 9 Height, pressure etc of level (Code Table 3).
+C Bottom of layer, if word 6 indicates a layer.
+C 10 Year of century }
+C 11 Month } Reference time of data -
+C 12 Day } Date and time of start of
+C 13 Hour } averaging or accumulation
+C 14 Minute } period.
+C 15 Indicator of unit of time (Code Table 4).
+C 16 P1 - Period of time (number of time units)
+C (0 for analyses or initialised analyses).
+C 17 P2 - Period of time (number of time units);
+C or time interval between successive
+C analyses, initialised analyses or forecasts
+C undergoing averaging or accumulation;
+C otherwise set to zero.
+C 18 Time range indicator (Code Table 5).
+C 19 Number included in average, when time range
+C indicator indicates an average or
+C accumulation; otherwise set to zero.
+C 20 Number missing from average, when time range
+C indicator indicates an average or
+C accumulation; otherwise set to zero.
+C 21 Century of reference time of data.
+C 22 Identification of sub-centre(Code Table C-1).
+C 23 Decimal scale factor.
+C 24 Flag field to indicate local use in
+C Section 1.
+C 0 - No local use of section 1.
+C 1 - Local use of section 1.
+C 25-36 Reserved for WMO reserved fields. Set to 0.
+C 37 ECMWF local usage identifier.This is a number
+C which indicates the contents of words 38-nn.
+C
+C 1 - ECMWF local GRIB use definition 1.
+C Ensemble forecast data.
+C 2 - ECMWF local GRIB use definition 2.
+C Cluster means and standard deviations.
+C 3 - ECMWF local GRIB use definition 3.
+C Satellite image data.
+C 4 - ECMWF local GRIB use definition 4.
+C Ocean model data.
+C 5 - ECMWF local GRIB use definition 5.
+C Forecast probability data.
+C 6 - ECMWF local GRIB use definition 6.
+C Surface temperature data.
+C 7 - ECMWF local GRIB use definition 7.
+C Sensitivity gradient/Trajectory
+C forecast and Sensitivity forecast data.
+C 8 - ECMWF local GRIB use definition 8.
+C ECMWF re-analysis data.
+C 9 - ECMWF local GRIB use definition 9.
+C Singular vectors and ensemble perturbations.
+C
+C
+#include "ecdef1.h"
+#include "ecdef2.h"
+#include "ecdef3.h"
+#include "ecdef4.h"
+#include "ecdef5.h"
+#include "ecdef6.h"
+#include "ecdef7.h"
+#include "ecdef8.h"
+#include "ecdef9.h"
+#include "ecdef10.h"
+#include "ecdef11.h"
+#include "ecdef12.h"
+#include "ecdef13.h"
+#include "ecdef14.h"
+C
+C
+C
+C
+C
+C KSEC2 - Integer parameters of Section 2 (Grid
+C Description Section) of GRIB code.
+C Integer array of at least 22 + n words,
+C where n is the number of parallels or
+C meridians in a quasi-regular (reduced)
+C Gaussian or latitude/longitude grid.
+C
+C Notes:- 1) Latitudes, longitudes are in
+C millidegrees.
+C 2) Latitude values in the range 0-90000.
+C 3) Longitude values in the range 0-360000.
+C 4) Southern latitudes and western
+C longitudes are negative.
+C
+C Word Contents for latitude/longitude grids or
+C equidistant cylindrical or Plate Carree.
+C ---- ----------------------------------------
+C 1 Data representation type (Code Table 6).
+C 2 Ni - Number of points along a parallel.
+C 3 Nj - Number of points along a meridian.
+C 4 La1 - Latitude of first grid point.
+C 5 Lo1 - Longitude of first grid point.
+C 6 Resolution flag.
+C Valid values are :-
+C
+C Decimal
+C value Meaning
+C ----- -------
+C 0 Direction increments not given.
+C Used for quasi-regular grids, but
+C can also be used for regular grids.
+C 128 Direction increments given.
+C Grids must be regular.
+C
+C 7 La2 - Latitude of last grid point.
+C 8 Lo2 - Longitude of last grid point.
+C 9 Di - i direction increment.
+C 10 Dj - j direction increment.
+C 11 Scanning mode flags (Code Table 8).
+C 12 Number of vertical coordinate parameters.
+C 13 Latitude of the southern pole of rotation.
+C 14 Longitude of the southern pole of rotation.
+C 15 Latitude of the the pole of stretching.
+C 16 Longitude of the the pole of stretching.
+C 17 0 , Regular grid.
+C 1 , Quasi-regular (reduced) grid.
+C
+C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C !
+C ! At the moment quasi-regular latitude/
+C ! longitude grids are not properly defined.
+C ! The Resolution flag field indicates both
+C ! direction increments are given or not.
+C ! One increment needs to be given. Grids
+C ! can be irregular in one direction only.
+C !
+C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C 18 Earth flag.
+C Valid values are :-
+C
+C Decimal
+C value Meaning
+C ----- -------
+C 0 Earth assumed spherical with
+C radius of 6367.47 km.
+C 64 Earth assumed oblate spheroidal
+C with size as determined by IAU in
+C 1965 :
+C (6378.160km,6356.775km,f=1/297.0)
+C
+C 19 Components flag.
+C Valid values are :-
+C
+C Decimal
+C value Meaning
+C ----- -------
+C 0 Resolved u and v components of
+C vector quantities relative to
+C easterly and northerly directions.
+C
+C 8 Resolved u and v components of
+C vector quantities relative to the
+C defined grid in the direction of
+C increasing x and y (or i and j)
+C coordinates respectively.
+C
+C 20-22 Reserved. Set to 0.
+C 23-nn Number of points along each parallel
+C in a Quasi-regular grid. Number of parallels
+C is given by Nj above.
+C or
+C Number of points along each meridian
+C in a Quasi-regular grid. Number of meridians
+C is given by Ni above.
+C
+C Scanning mode flags (Code Table 8) indicate
+C whether points are consecutive on a meridian
+C or a parallel.
+C
+C Notes:- 1) Increments are in millidegrees.
+C
+C
+C
+C
+C
+C Word Contents for Gaussian grids .
+C ---- ---------------------------------------
+C 1 Data representation type (Code Table 6).
+C 2 Ni - Number of points along a parallel.
+C Cannot be used for quasi-regular grids.
+C 3 Nj - Number of points along a meridian.
+C 4 La1 - Latitude of first grid point.
+C 5 Lo1 - Longitude of first grid point.
+C 6 Resolution flag.
+C Valid values are :-
+C
+C Decimal
+C value Meaning
+C ----- -------
+C 0 Direction increments not given.
+C Used for quasi-regular grids, but
+C can also be used for regular grids.
+C 128 Direction increments given.
+C Grids must be regular.
+C
+C 7 La2 - Latitude of last grid point.
+C 8 Lo2 - Longitude of last grid point.
+C 9 Di - i direction increment.
+C Cannot be used for quasi-regular grids.
+C 10 N - Number of parallels between a Pole and
+C the Equator.
+C 11 Scanning mode flags (Code Table 8).
+C 12 Number of vertical coordinate parameters.
+C 13 Latitude of the southern pole of rotation.
+C 14 Longitude of the southern pole of rotation.
+C 15 Latitude of the the pole of stretching.
+C 16 Longitude of the the pole of stretching.
+C 17 0 , Regular grid.
+C 1 , Quasi-regular (reduced) grid.
+C 18 Earth flag.
+C Valid values are :-
+C
+C Decimal
+C value Meaning
+C ----- -------
+C 0 Earth assumed spherical with
+C radius of 6367.47 km.
+C 64 Earth assumed oblate spheroidal
+C with size as determined by IAU in
+C 1965 :
+C (6378.160km,6356.775km,f=1/297.0)
+C
+C 19 Components flag.
+C Valid values are :-
+C
+C Decimal
+C value Meaning
+C ----- -------
+C 0 Resolved u and v components of
+C vector quantities relative to
+C easterly and northerly directions.
+C
+C 8 Resolved u and v components of
+C vector quantities relative to the
+C defined grid in the direction of
+C increasing x and y (or i and j)
+C coordinates respectively.
+C
+C 20-22 Reserved. Set to 0.
+C 23-nn Number of points along each parallel
+C in a Quasi-regular grid. Number of parallels
+C is given by Nj above.
+C
+C Notes:- 1) Increments are in millidegrees.
+C
+C
+C
+C
+C
+C Word Contents for Spherical Harmonic Coefficients.
+C ---- --------------------------------------------
+C 1 Data representation type (Code Table 6).
+C 2 J - Pentagonal resolution parameter.
+C 3 K - Pentagonal resolution parameter.
+C 4 M - Pentagonal resolution parameter.
+C 5 Representation type ( Code Table 9 ).
+C 6 Representation mode ( Code Table 10 ).
+C 7-11 Reserved. Set to 0.
+C 12 Number of vertical coordinate parameters.
+C 13 Latitude of the southern pole of rotation.
+C 14 Longitude of the southern pole of rotation.
+C 15 Latitude of the the pole of stretching.
+C 16 Longitude of the the pole of stretching.
+C 17-22 Reserved. Set to 0.
+C
+C
+C
+C
+C
+C Word Contents for Polar Stereographic.
+C ---- --------------------------------------------
+C 1 Data representation type (Code Table 6).
+C 2 Nx - Number of points along X-axis.
+C 3 Ny - Number of points along Y-axis.
+C 4 La1 - Latitude of first grid point.
+C 5 Lo1 - Longitude of first grid point.
+C 6 Reserved. Set to 0. Resolution flag is
+C not applicable to Polar stereographic.
+C 7 LoV - Orientation of the grid ie the
+C longitude of the meridian which is parallel
+C to the Y-axis along which latitude increases
+C as the Y-coordinate increases.
+C 8 Reserved. Set to 0.
+C 9 Dx - X-direction grid length.
+C 10 Dy - Y-direction grid length.
+C 11 Scanning mode flag (Code Table 8).
+C 12 Number of vertical coordinate parameters.
+C 13 Projection centre flag.
+C 0 , North pole is on projection plane.
+C 1 , South pole is on projection plane. ??????
+C 128 , South pole is on projection plane. ????
+C 14-16 Reserved. Set to 0.
+C 17 0 , Regular grid.
+C 1 , Quasi-regular (reduced) grid.
+C 18 Earth flag.
+C Valid values are :-
+C
+C Decimal
+C value Meaning
+C ----- -------
+C 0 Earth assumed spherical with
+C radius of 6367.47 km.
+C 64 Earth assumed oblate spheroidal
+C with size as determined by IAU in
+C 1965 :
+C (6378.160km,6356.775km,f=1/297.0)
+C
+C 19 Components flag.
+C Valid values are :-
+C
+C Decimal
+C value Meaning
+C ----- -------
+C 0 Resolved u and v components of
+C vector quantities relative to
+C easterly and northerly directions.
+C
+C 8 Resolved u and v components of
+C vector quantities relative to the
+C defined grid in the direction of
+C increasing x and y (or i and j)
+C coordinates respectively.
+C 20-22 Reserved. Set to 0.
+C
+C
+C Notes 1) Grid lengths are in metres, at the 60-
+C degree parallel nearest to the pole on
+C the projection plane.
+C
+C
+C
+C
+C
+C Word Contents for Mercator.
+C ---- ---------------------------------------
+C 1 Data representation type (Code Table 6).
+C 2 Ni - Number of points along a parallel.
+C 3 Nj - Number of points along a meridian.
+C 4 La1 - Latitude of first grid point.
+C 5 Lo1 - Longitude of first grid point.
+C 6 Resolution flag.
+C Valid values are :-
+C
+C Decimal
+C value Meaning
+C ----- -------
+C 0 Direction increments not given.
+C 128 Direction increments given.
+C
+C 7 La2 - Latitude of last grid point.
+C 8 Lo2 - Longitude of last grid point.
+C 9 Latin - latitude at which the Mercator
+C projection cylinder intersects the earth.
+C 10 Reserved. set to 0.
+C 11 Scanning mode flags (Code Table 8).
+C 12 Number of vertical coordinate parameters.
+C 13 Di - i direction grid length.
+C 14 Dj - j direction grid length.
+C 15-16 Reserved. Set to 0.
+C 17 0 , Regular grid.
+C 1 , Quasi-regular (reduced) grid.
+C 18 Earth flag.
+C Valid values are :-
+C
+C Decimal
+C value Meaning
+C ----- -------
+C 0 Earth assumed spherical with
+C radius of 6367.47 km.
+C 64 Earth assumed oblate spheroidal
+C with size as determined by IAU in
+C 1965 :
+C (6378.160km,6356.775km,f=1/297.0)
+C
+C 19 Components flag.
+C Valid values are :-
+C
+C Decimal
+C value Meaning
+C ----- -------
+C 0 Resolved u and v components of
+C vector quantities relative to
+C easterly and northerly directions.
+C
+C 8 Resolved u and v components of
+C vector quantities relative to the
+C defined grid in the direction of
+C increasing x and y (or i and j)
+C coordinates respectively.
+C
+C 20-22 Reserved. Set to 0.
+C
+C Notes 1) Grid lengths are in units of metres,
+C at the parallel specified by Latin.
+C
+C
+C
+C
+C
+C Word Contents for Lambert conformal, secant or
+C tangent, conical or bi-polar (normal or
+C oblique) or
+C Albers equal-area, secant or tangent,
+C conical or bi-polar (normal or oblique).
+C ---- --------------------------------------------
+C 1 Data representation type (Code Table 6).
+C 2 Nx - Number of points along X-axis.
+C 3 Ny - Number of points along Y-axis.
+C 4 La1 - Latitude of first grid point.
+C 5 Lo1 - Longitude of first grid point.
+C 6 Resolution flag.
+C Valid values are :-
+C
+C Decimal
+C value Meaning
+C ----- -------
+C 0 Direction increments not given.
+C 128 Direction increments given.
+C
+C 7 LoV - Orientation of the grid ie the East
+C longitude of the meridian which is parallel
+C to the Y-axis along which latitude increases
+C as the Y-coordinate increases.
+C 8 Reserved. Set to 0.
+C 9 Dx - X-direction grid length.
+C 10 Dy - Y-direction grid length.
+C 11 Scanning mode flag (Code Table 8).
+C 12 Number of vertical coordinate parameters.
+C 13 Projection centre flag.
+C 0 , North pole is on projection plane.
+C Only one projection centre is used.
+C 128 , South pole is on projection plane.
+C Only one projection centre is used.
+C 64 , North pole is on projection plane.
+C Projection is bi-polar and symmetric.
+C 192 , South pole is on projection plane.
+C Projection is bi-polar and symmetric.
+C 14 Latin 1 - First latitude from the pole at
+C which the secant cone cuts the sphere.
+C 15 Latin 2 - Second latitude from the pole at
+C which the secant cone cuts the sphere.
+C 16 Reserved. Set to 0.
+C 17 0 , Regular grid.
+C 1 , Quasi-regular (reduced) grid.
+C 18 Earth flag.
+C Valid values are :-
+C
+C Decimal
+C value Meaning
+C ----- -------
+C 0 Earth assumed spherical with
+C radius of 6367.47 km.
+C 64 Earth assumed oblate spheroidal
+C with size as determined by IAU in
+C 1965 :
+C (6378.160km,6356.775km,f=1/297.0)
+C
+C 19 Components flag.
+C Valid values are :-
+C
+C Decimal
+C value Meaning
+C ----- -------
+C 0 Resolved u and v components of
+C vector quantities relative to
+C easterly and northerly directions.
+C
+C 8 Resolved u and v components of
+C vector quantities relative to the
+C defined grid in the direction of
+C increasing x and y (or i and j)
+C coordinates respectively.
+C
+C 20 Latitude of the southern pole.
+C 21 Longitude of the southern pole.
+C 22 Reserved. Set to 0.
+C
+C Notes 1) Grid lengths are in metres, at the 60-
+C degree parallel nearest to the pole on
+C the projection plane.
+C
+C
+C
+C
+C
+C Word Contents for Space view perspective
+C or orthographic.
+C ---- ---------------------------------------
+C 1 Data representation type (Code Table 6).
+C 2 Nx - Number of points along x-axis.
+C 3 Ny - Number of points along y-axis.
+C 4 Lap - Latitude of sub-satellite point.
+C 5 Lop - Longitude of sub-satellite point.
+C 6 Resolution flag.
+C Valid values are :-
+C
+C Decimal
+C value Meaning
+C ----- -------
+C 0 Direction increments not given.
+C 128 Direction increments given.
+C
+C 7 dx - Apparent diameter of the earth in
+C grid lengths in the x direction.
+C 8 dy - Apparent diameter of the earth in
+C grid lengths in the y direction.
+C 9 Xp X-coordinate of sub-satellite point
+C 10 Yp Y-coordinate of sub-satellite point
+C 11 Scanning mode flag (Code Table 8).
+C 12 Number of vertical coordinate parameters.
+C 13 The orientation of the grid.
+C 14 nr - the altitude of the camera from the
+C earth's centre.
+C For orthographic view from infinite
+C distance 16777215.
+C 15 Xo - X coordinate of origin of sector
+C image.
+C 16 Yo - Y coordinate of origin of sector
+C image.
+C 17 0 , Regular grid.
+C 1 , Quasi-regular (reduced) grid.
+C 18 Earth flag.
+C Valid values are :-
+C
+C Decimal
+C value Meaning
+C ----- -------
+C 0 Earth assumed spherical with
+C radius of 6367.47 km.
+C 64 Earth assumed oblate spheroidal
+C with size as determined by IAU in
+C 1965 :
+C (6378.160km,6356.775km,f=1/297.0)
+C
+C 19 Components flag.
+C Valid values are :-
+C
+C Decimal
+C value Meaning
+C ----- -------
+C 0 Resolved u and v components of
+C vector quantities relative to
+C easterly and northerly directions.
+C
+C 8 Resolved u and v components of
+C vector quantities relative to the
+C defined grid in the direction of
+C increasing x and y (or i and j)
+C coordinates respectively.
+C
+C 20-22 Reserved. Set to 0.
+C
+C
+C
+C
+C
+C PSEC2 - Real parameters for Section 2 (Grid
+C Definition Section) of GRIB Code.
+C Real array of at least 10 + nn words, where
+C nn is the number of vertical coordinate
+C parameters.
+C
+C Word Contents.
+C ---- --------------------------------------------
+C 1 Angle of rotation.
+C 2 Stretching factor.
+C 3-10 Reserved. Set to 0.
+C 11-nn Vertical coordinate parameters.
+C Number given in KSEC2(12)
+C
+C
+C
+C
+C
+C KSEC3 - Integer parameters for Section 3 (Bit Map
+C Section) of GRIB code.
+C Integer array of at least 2 words.
+C
+C Word Contents.
+C ---- --------------------------------------------
+C 1 0 , Bit map included in the GRIB message.
+C Binary data array (PSEC4) contains the
+C missing data indicator at the points
+C where no data is given.
+C Non-zero, Number of predetermined bit-map.
+C Bit map is not included in the message.
+C Binary data array contains only valid
+C data values.
+C
+C 2 The value used to indicate missing data in
+C an integer binary data array is indicated
+C here.
+C This value is user supplied for both
+C coding and decoding, and redefined at each
+C call.
+C
+C On ouput, whenever a masked field is found,
+C the effective number of non-missing values
+C is returned.
+C
+C
+C
+C
+C PSEC3 - Real parameters for Section 3 (Bit Map
+C Section) of GRIB code.
+C Real array of at least 2 words.
+C
+C Word Contents.
+C ---- --------------------------------------------
+C 1 Not used.
+C
+C 2 The value used to indicate missing data in
+C a real binary data array is indicated here.
+C This value is user supplied for both
+C coding and decoding.
+C
+C
+C
+C
+C
+C KSEC4 - Integer parameters for Section 4 (Binary
+C Data Section) of GRIB code.
+C Integer array of at least 42 words.
+C
+C Word Contents.
+C ---- --------------------------------------------
+C 1 Number of data values in array PSEC4 to be
+C packed in GRIB code or which have been
+C unpacked from GRIB code. Where a bit-map
+C is used this number includes the number of
+C mising data values.
+C
+C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C ! !
+C ! If this number is NEGATIVE, it indicates !
+C ! ENTIRE FIELD IS MISSING. All values in PSEC4 !
+C ! are 0. This is an ECMWF convention - coded !
+C ! data has scale factor, exponent and mantissa !
+C ! of reference value with all bits set to 1. !
+C ! !
+C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C 2 Number of bits used for each packed value.
+C 3 Type of data. Used only if Section 2 is
+C not included when coding data.
+C 0 - Grid point data.
+C 128 - Spherical harmonic coefficients.
+C 4 Type of packing.
+C 0 - Simple packing.
+C 64 - Complex or second order packing.
+C 5 Data representation.
+C 0 - Floating point data.
+C 32 - Integer data.
+C 6 Additional flags indicator.
+C 0 - No additional flags.
+C 16 - additional flags.
+C 7 Reserved. Set to 0.
+C 8 Number of values indicator.
+C 0 - Single datum at each grid point.
+C 64 - Matrix of values at each grid point.
+C 9 Secondary bit maps indicator.
+C 0 - No secondary bit maps.
+C 32 - Secondary bit maps present.
+C 10 Values width indicator.
+C 0 - Second order values constant width.
+C 16 - Second order values different widths.
+C 11 Number of bits for second order values,
+C when of constant width.
+C
+C If not zero, words 12 to 15 indicate specific use of
+C 2nd-order packing methods which are extensions
+C to current WMO standard for GRIB edition 1.
+C
+C 12 General extended 2nd-order packing indicator.
+C 0 - Method not used.
+C 8 - Method in use.
+C 13 Boustrophedonic ordering indicator.
+C 0 - Sub-method not used.
+C 4 - Sub-method in use.
+C 14 Spatial differencing 1st indicator.
+C 0 - Sub-method used at order KSEC4(15) if equal to 1.
+C 2 - Sub-method used, at order 2+KSEC4(15).
+C 15 Spatial differencing 2nd indicator.
+C 0 - Sub-method used at order KSEC4(14) if equal to 2.
+C 1 - Sub-method used, at order KSEC4(14)+1.
+C
+C Spatial differencing feature is used at order
+C KSEC4(14)+KSEC4(15), provided this sum is not 0, and the
+C valid entries mentioned above are used.
+C
+C Contents of words 16-20 for simple packing cases :
+C
+C 16-20 Set to 0.
+C
+C Contents of words 16-20 for complex packing of spectral data :
+C
+C 16 Pointer to the start of packed data values.
+C 17 Scaling factor P, stored as the integer value P*1000
+C (in the range -10000 to +10000) for GRIB edition 1.
+C (and as P for GRIB edition 0 decoding)
+C 18 Pentagonal resolution parameter J for data subset
+C stored as 32-bit floating-point values.
+C 19 Pentagonal resolution parameter K for data subset.
+C 20 Pentagonal resolution parameter M for data subset.
+C
+C Contents of words 16-20 for complex packing of grid-point data
+C (second-order packing) :
+C
+C 16 Pointer (relative to section 4) to first-order values.
+C 17 Pointer (relative to section 4) to 2nd-order values.
+C 18 Number of first-order values.
+C 19 Number of second-order values.
+C 20 Group width (8 bits in standard cases).
+C
+C Words 21 to 24 are supplied back both for decoding and encoding
+C functions.
+C
+C 21 Number of non-missing points if masked field .
+C (set to 0 otherwise)
+C 22 Bit-map pointer to explicit bit-map if any.
+C (set to 0 otherwise)
+C 23 Full length of section 4 (octets).
+C 24 Unused bit count at end of section 4.
+C
+C 25-33 Reserved. Set to 0.
+C
+C Words 34 to 42 are used only for the 'X'
+C function. Scanning mode must be from West
+C to East and from North to South.
+C 34 Number of points (maximum 4) from which
+C data is to be unpacked.
+C 35 Number of latitude row of first value.
+C 36 Number of longitude point of first value.
+C 37 Number of latitude row of second value.
+C 38 Number of longitude point of second value.
+C 39 Number of latitude row of third value.
+C 40 Number of longitude point of third value.
+C 41 Number of latitude row of fourth value.
+C 42 Number of longitude point of fourth value.
+C
+C For grid point packing, with a matrix of
+C values at each grid point, words 50 to
+C 50+NC1+NC2 are used as follows.
+C 50 First dimension (rows) of each matrix.
+C 51 Second dimension (columns) of each matrix.
+C 52 First dimension coordinate values definition
+C See Code Table 12.
+C 53 NC1- Number of coefficients or values used to
+C specify first dimension coordinate function.
+C 54 Second dimension coordinate values definition
+C See Code Table 12.
+C 55 NC2- Number of coefficients or values used to
+C specify second dimension coordinate function.
+C 56 First dimension physical significance. See
+C Code Table 13.
+C 57 Second dimension physical significance. See
+C Code Table 13.
+C 58 - 59 Reserved. Set to 0.
+C
+C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C ! !
+C ! In the WMO specification the following !
+C ! fields are integer values. ECMWF uses !
+C ! floating point values for the wave models !
+C ! so these fields contain real values on !
+C ! both input and output.
+C ! !
+C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C 60 - (59+NC1) Coefficients to define first dimension
+C coordinate values in functional form, or the
+C the explicit coordinate values.
+C (60+NC1)-(59+NC1+NC2) Coefficients to define second dimension
+C coordinate values in functional form, or the
+C the explicit coordinate values.
+C
+C
+C
+C
+C
+C PSEC4 - Array of data values to be packed in GRIB
+C code or which have been unpacked. Where a
+C bit-map is included in the GRIB message
+C this array contains missing data indicator
+C ( value supplied by the user in PSEC3(2)
+C or KSEC3(2) ) at the appropriate places.
+C
+C Although declared as real in GRIBEX this
+C can be an array of integer data. The value
+C in KSEC4(5) indicates whether data is in
+C integer or floating point format.
+C
+C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C ! !
+C ! When CODING data, PSEC4 is OVERWRITTEN. !
+C ! !
+C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C
+C Output parameters for coding function.
+C Input Parameters for decoding functions.
+C -----------------------------------------
+C
+C KGRIB - Array containing GRIB coded data.
+C
+C KWORD - Number of words of KGRIB occupied by
+C coded data. Output parameter for coding
+C function only. Not required as input
+C for decoding.
+C
+C Output Parameters for all functions.
+C -----------------------------------
+C
+C KSEC0 - Word 1 contains number of octets in
+C GRIB message (not including padding to
+C a word boundary or rounding to a multiple
+C of 120 octets).
+C - Word 2 contains GRIB edition number.
+C
+C KRET - Return code.
+C
+C Informative codes for decoding functions.
+C
+C -2 , Bit-map encountered with all bits
+C set to 1. Array PSEC4 contains all
+C real data values.
+C -3 , Predetermined bit-map encountered.
+C Data has not been fully decoded ie
+C array PSEC4 contains only real data
+C values. The user must use this data
+C in conjunction with the defined
+C bit-map.
+C -4 , Bit-map encountered. The data has
+C been fully decoded ie array PSEC4
+C contains real values and missing
+C data indicators where appropriate.
+C -5 , Bit-map encountered. The data has
+C not been decoded. This return code
+C is set only by the 'Z' function.
+C -6 , ECMWF pseudo-grib data encountered.
+C
+C Error codes.
+C
+C 0 , No error encountered.
+C 201 , Invalid function requested.
+C 202 , Number of bits per data value exceeds
+C word length.
+C 203 , Missing data indicated and data field
+C contains non-zero values.
+C 204 , Number of bits for coding value is zero
+C or negative.
+C 301 , Error in inserting/extracting
+C letters GRIB.
+C 302 , Error extracting length of GRIB
+C message.
+C 303 , Error inserting/extracting GRIB
+C Edition Number.
+C 304 , Error extracting octets 22 and 23
+C Experimental Edition check.
+C 305 , Input data is not GRIB or pseudo-
+C grib.
+C 401 , Error inserting/extracting length of
+C Section 1.
+C 402 , Error inserting/extracting Parameter
+C Version Number.
+C 403 , Error inserting/extracting six fields
+C from Identification of Centre to
+C Indicator of type of level.
+C 404 , Error inserting/extracting Height,
+C pressure, etc of levels.
+C 405 , Error inserting/extracting six fields
+C from Year of century to Indicator
+C of unit of time range.
+C 406 , Error inserting/extracting Period of
+C time.
+C 407 , Error inserting/extracting time range
+C indicator.
+C 408 , Error inserting/extracting number
+C averaged.
+C 409 , Error inserting/extracting number
+C missing from averages etc.
+C 410 , Error inserting/extracting century of
+C data or reserved field.
+C 411 , Error inserting/extracting units
+C decimal scale factor.
+C 412 , Error inserting/extracting ECMWF
+C local data.
+C 413 , Grib Edition not catered for.
+C 414 , Error inserting/extracting sub-centre.
+C 499 , Error found when checking values for
+C Section 1 against valid GRIB values.
+C
+C 501 , Error inserting/extracting length of
+C Section 2.
+C 502 , Error inserting/extracting number of
+C Vertical coordinate parameters.
+C 503 , Error inserting/extracting location
+C of List of vertical coordinate
+C parameters or List of numbers of
+C points.
+C 504 , Error inserting/extracting data
+C representation type.
+C 505 , Error inserting/extracting number of
+C points along a parallel or meridian.
+C 506 , Error inserting/extracting latitude
+C or longitude of first grid point.
+C 507 , Error inserting/extracting components
+C flag.
+C 508 , Error inserting/extracting latitude
+C or longitude of last grid point.
+C 509 , Error inserting/extracting i
+C direction increment.
+C 510 , Error inserting/extracting number of
+C parallels between pole and Equator.
+C 511 , Error inserting/extracting scanning
+C mode flags.
+C 513 , Error inserting/extracting j
+C direction increment.
+C 514 , Error inserting/extracting J,K,M
+C pentagonal resolution parameters.
+C 515 , Error inserting/extracting
+C representation type or mode.
+C 517 , Error inserting/extracting latitude
+C or longitude of southern pole.
+C 518 , Error inserting/extracting angle
+C of rotation.
+C 519 , Error inserting/extracting latitude
+C or of pole of stretching.
+C 520 , Error inserting/extracting
+C stretching factor.
+C 521 , Error inserting/extracting
+C vertical coordinate parameters.
+C 522 , Error inserting/extracting list of
+C numbers of points.
+C 523 , Error inserting/extracting number of
+C points along X or Y axis.
+C 524 , Error inserting/extracting X or Y
+C axis grid lengths.
+C 525 , Error inserting/extracting Projection
+C centre flag.
+C 526 , Error inserting/extracting latitude
+C or longitude of sub-satellite point.
+C 527 , Error inserting/extracting diameter
+C of the earth in x or y direction.
+C 528 , Error inserting/extracting X or Y
+C coordinate of sub-satellite point.
+C 529 , Error inserting/extracting orientatio
+C of the grid or camera angle.
+C 530 , Error inserting/extracting X or Y
+C coordinates of origin of sector.
+C 598 , Representation type not catered for.
+C 599 , Error found when checking values for
+C Section 2 against valid GRIB values.
+C 601 , Error inserting/extracting length of
+C Section 3.
+C 602 , Error inserting/extracting number of
+C unused bits at end of section 3.
+C 603 , Error inserting/extracting bit-map
+C reference table.
+C 604 , Error inserting/extracting primary
+C Bit-map.
+C 605 , Cannot convert Quasi-regular
+C Gaussian grid with a bit-map.
+C 699 , Error found when checking values for
+C Section 3 against valid GRIB values.
+C 701 , Error inserting/extracting length of
+C Section 4.
+C 703 , Second-order packing implies
+C additional flags.
+C 704 , Functions 'A','B','G' invalid with
+C second-order packing.
+C 705 , Only simple packing catered for.
+C 706 , Error in extracting section 4 flag
+C field.
+C 707 , Error inserting/extracting scale
+C factor.
+C 708 , Error inserting/extracting reference
+C value.
+C 709 , Error inserting/extracting number of
+C bits per data value.
+C 710 , Output array too small.
+C 711 , Error inserting/extracting real
+C coefficient.
+C 712 , Error inserting/extracting data
+C values.
+C 713 , Error inserting/extracting flag
+C and unused bit field.
+C 714 , Function is 'X' and number of
+C values is illegal.
+C 715 , Function is 'X' and scanning mode is
+C not North to South and West to East.
+C 716 , Function is 'X' and field is not
+C Gaussian or Latitude/longitude grid.
+C 717 , Function is 'X' and a bit-map is
+C included.
+C 720 , Error inserting/extracting octet
+C number at which packed data begins.
+C 721 , Error inserting/extracting extended
+C extended flag field.
+C 722 , Error inserting/extracting first or
+C second dimension of matrix.
+C 723 , Error inserting/extracting six fields
+C from first dimension coordinate value
+C onwards.
+C 724 , Error inserting/ectracting first or
+C second dimension coefficients.
+C 725 , Error inserting secondary bit-maps.
+C 726 , Explicitly constant field not
+C supported without a section 2.
+C 727 , Explicitly constant field not
+C supported for spectral field.
+C 728 , Functions 'G' or 'B' not supported
+C for an explicitly constant field.
+C 798 , Function is 'X' and no section 2 is
+C included.
+C 799 , Error found when checking values for
+C Section 4 against valid GRIB values.
+C 801 , Error inserting/extracting 7777 group
+C 802 , Error inserting/extracting length of
+C GRIB message.
+C 805 , End of message 7777 group not found.
+C 806 , Error in extracting primary or
+C secondary bit maps.
+C 808 , Error converting quasi-regular
+C gaussian grid to regular.
+C 810 , Error inserting dummy zero.
+C
+C
+C Method.
+C -------
+C
+C Input data packed in GRIB code in accordance with
+C parameters given or set by user or fully or partially
+C unpacked, depending on function used.
+C
+C Externals.
+C ----------
+C
+C ABORTX
+C C2ORDR
+C CONFP3
+C CSECT4
+C CSGNBT
+C D2ORDR
+C DECFP2
+C DSECT4
+C DSGNBT
+C ECLOC1
+C EXSCAL
+C EXTMAP
+C GBITMAP
+C GRCHK1
+C GRCHK2
+C GRCHK3
+C GRCHK4
+C GRPRS0
+C GRPRS1
+C GRPRS2
+C GRPRS3
+C GRPRS4
+C INSCAL
+C INSMP1
+C INSMP2
+C INXBIT
+C MAXMIN
+C MAXMN2
+C QU2REG2
+C RORINT
+C SETPAR
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes for GRIB definition.
+C WMO Publication No. 9, Volume B, for grid catalogue numbers.
+C
+C Comments.
+C ---------
+C
+C All machine dependent code is in 3 low level routines.
+C Versions of these exist for the VAX, CYBER, IBM
+C and SUN workstation, as well as the CRAY.
+C INXBIT - contains calls to the routines GBYTE(S)
+C and SBYTE(S) or their equivalents.
+C SETPAR - to set number of bits in the computer word
+C and largest negative number.
+C ABORTX - to terminate execution of the job.
+C
+C This routine codes/decodes:
+C - regular and quasi-regular latitude/longitude grids,
+C - regular and quasi-regular gaussian grids,
+C - spherical harmonics,
+C - space view perspective or orthographic fields,
+C - polar stereographic data,
+C - lambert conformal grids.
+C Grids may be rotated, stretched, or rotated and stretched.
+C They may have primary and secondary bit-maps.
+C Only simple packing of integer data is allowed, but
+C real data may use simple or complex packing.
+C Matrices of values at grid points are supported and the
+C additional flag field is allowed.
+C
+C Apart from the values which can be passed to this
+C routine, other values are held in a common area and
+C are used by default, unless changed by calls to the
+C appropriate routines before calling GRIBEX. The
+C following defaults are used. They have been selected
+C to facilitate the most frequent usage at ECMWF and
+C to ease the transition to the next version of the
+C GRIB code.
+C
+C 1) By default debug printout is switched off.
+C CALL GRSDBG (I) where
+C I = Non-zero to switch on debug printout.
+C 0, to switch off debug printout.
+C
+C 2) By default the reference value used is the minimum
+C of the data values supplied.
+C CALL GRSREF (ZREF) to change the value, where ZREF
+C is real and the required value.
+C
+C 3) By default GRIB messages are rounded to a
+C multiple of 120 octets.
+C CALL GRSRND (I) where
+C I = 0, to switch off rounding.
+C Non-zero to switch on rounding.
+C
+C 4) By default, the values given are checked for
+C consistency with GRIB code values as currently
+C defined, when coding data. Data values are never
+C checked.
+C CALL GRSVCK (I) where
+C I = 0, to switch off checking.
+C Non-zero to switch on checking.
+C
+C
+C 5) By default P factor calculation switch is switched
+C off, i.e. the user supplies the P factor for complex
+C packing.
+C CALL GRSMKP (I) where
+C I = 0 , user supplies the P factor
+C = Non-zero , GRIBEX calculates the P
+C factor.
+C
+C
+C Ancillary print routines are available for the
+C various sections of the GRIB code.
+C
+C CALL GRPRS0 (KSEC0) To print section 0.
+C
+C CALL GRPRS1 (KSEC0,KSEC1) To print section 1.
+C
+C CALL GRPRS2 (KSEC0,KSEC2,PSEC2) To print section 2.
+C
+C CALL GRPRS3 (KSEC0,KSEC3,PSEC3) To print section 3.
+C
+C CALL GRPRS4 (KSEC0,KSEC4,PSEC4) To print section 4.
+C
+C Routine contains Sections 0 to 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 25.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 09.07.91
+C Functions 'R' and 'L' added.
+C Release 1 of software.
+C
+C J. Hennessy ECMWF 14.08.91
+C Functions 'S' and 'X' added.
+C
+C J. Hennessy ECMWF 23.08.91
+C Bit-map handling added.
+C
+C J. Hennessy ECMWF 04.09.91
+C Polar stereographic representation added.
+C Flag bit handling modified. Various bugs fixed.
+C
+C J. Hennessy ECMWF 11.09.91
+C Function 'M' added.
+C
+C J. Hennessy ECMWF 24.09.91
+C Space view perspective representation added.
+C
+C J. Hennessy ECMWF 01.10.91
+C Integer data handling added. Length of GRIB message
+C for Experimental Edition and Edition 0 included
+C when function 'I' is used.
+C
+C J. Hennessy ECMWF 25.10.91
+C When decoding data with bit-maps, include the number of
+C missing data values in the number of values decoded.
+C Release 2 of software.
+C
+C J. Hennessy ECMWF 30.10.91
+C Check for ECMWF pseudo-grib data made specific for
+C parameter numbers 127 and 128.
+C Bug in 'X' function fixed.
+C
+C J. Hennessy ECMWF 22.11.91
+C A number of machine dependent features removed.
+C Bug fixed in Polar Stereographic representation.
+C Release 3 of software.
+C
+C J. Hennessy ECMWF 23.01.92
+C Handling of missing fields modified.
+C Print of sections 2 and 3 suppressed, if not used.
+C
+C J. Hennessy ECMWF 21.07.92
+C Consistency checks moved from end to start of sections.
+C Secondary bit-maps and matrix of values at each grid
+C point and additional flag field added.
+C X and Y coordinates of origin of sector image added
+C to space view perspective representation.
+C Release 4 of software.
+C
+C J. Hennessy ECMWF 24.09.92
+C Bugfix. KSEC4(3) set to 0 before checking type of data.
+C
+C J. Hennessy ECMWF 12.10.92
+C Check for 'GRIB` added when decoding data.
+C Return correct error code, if 7777 group not found and
+C GRIB message contains bit-maps.
+C
+C J. Hennessy ECMWF 06.11.92
+C ECMWF use of part of Section 1 reserved for local use.
+C Release 5 of software.
+C
+C J. Hennessy ECMWF 25.02.93
+C Check on valid Grib Edition number added.
+C
+C J. Hennessy ECMWF 19.05.93
+C ECMWF local uses 3 and 4 added.
+C Function 'G' added.
+C Release 6 of software. (NEXT VERSION on Cray and IBM only)
+C
+C J.D.Chambers ECMWF 18.10.93
+C ECMWF local use 5. (Forecast probabilities).
+C
+C J.D.Chambers ECMWF 09.03.94
+C Add check that given number of bits for packing is positive
+C
+C J.D.Chambers ECMWF 15.04.94
+C Add options 'A' and 'B' for handling 8-bit data.
+C
+C J.D.Chambers ECMWF 09.04.04
+C Add complex packing for spherical harmonics.
+C
+C J.D.Chambers ECMWF 21.06.94
+C Set encode/decode flag allowing for possible use of 'L' option
+C
+C J.D.Chambers ECMWF 07.07.94
+C Put zeroes in all reserved fields (don't assume arrays have
+C been zeroed).
+C Use csgnbt and dsgnbt to code/decode sign bits.
+C
+C J.D.Chambers ECMWF 13.07.94
+C Replace call to QU2REG by call to QU2REG2 to allow linear
+C interpolation of fields with missing data values.
+C
+C J.D.Chambers ECMWF 06.09.94
+C Add user option to supply the P factor for complex packing
+C This is switched on/off by a user call to GRSMKP.
+C
+C J.D.Chambers ECMWF 11.11.94
+C Fix type of ZS for NOS/VE and assign of LENCODE/LDECODE
+C for 'L' option
+C
+C J.D.Chambers ECMWF 21.11.94
+C Use JNINT on VAX
+C
+C J.D.Chambers ECMWF 19.01.95
+C Allow for section 1 local use definition 8 (ERA)
+C
+C J.D.Chambers ECMWF 21.02.95
+C Allow for quasi-regular lat/long grids (c.f.Washington SSTs)
+C
+C J.D.Chambers ECMWF 22.02.95
+C Changes for sensitivity forecast.
+C
+C J.D.Chambers ECMWF 23.05.95
+C Add check that output array is big enough for filling with
+C missing data values.
+C Add return warning (-7) when all data values are missing.
+C
+C J.D.Chambers ECMWF 29.06.95
+C Allow for global product with wraparound, eg last longitude
+C repeats first in composite Washington SSTs.
+C
+C J.D.Chambers ECMWF 29.06.95
+C Allow Lambert conformal.
+C
+C J.D.Chambers ECMWF 30.06.95
+C Remove return warning (-7) when all data values are missing.
+C
+C J.D.Chambers ECMWF 13.09.95
+C Fail decoding if number of bits per packed value = number
+C of bits per computer word (error 205).
+C
+C J.D.Chambers ECMWF 09.10.95
+C Add decoding of Washington ensemble products local usage.
+C
+C J.D.Chambers ECMWF 11.01.96
+C Use section 1 octet 26 for designated sub-centres:
+C = 98 for EPS products from Washington with
+C ECMWF extensions.
+C = 240 for ECMWF seasonal forecast centre.
+C = 241 for Meteo France.
+C = 242 for EDF.
+C = 243 for UKMO.
+C = 0 otherwise.
+C
+C J.D.Chambers ECMWF 09.02.96
+C Add 'J' decoding option.
+C
+C J.D.Chambers ECMWF 24.10.96
+C Add handling of predetermined bitmap
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C Add coding and decoding of second-order packed grid-point data.
+C Function 'K' added.
+C Enables decoding of explicitly constant fields (0-bit number)
+C for grid-point fields encoded with a section 2.
+C Update table 3 for level/layer management.
+C KSEC1(22) enforced only when coding ECMWF data.
+C For 'R' option, secure when no primary bit-map,
+C and take into account periodicity (or not) of input grid.
+C Default setting of global variables through GRSDEF routine.
+C For masked fields, effective number of points returned
+C in KSEC3(2).
+C
+C J. Clochard, Meteo France, for ECMWF - September 1998.
+C Enable decoding of complex packing spectral data in GRIB edition 0
+C and/or without section 2.
+C KSEC0 added in DSECT4 calling syntax.
diff --git a/gribex/gribin.F b/gribex/gribin.F
new file mode 100755
index 0000000..005aa85
--- /dev/null
+++ b/gribex/gribin.F
@@ -0,0 +1,49 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ subroutine gribin(kunit,karray,kinlen,koutlen,keof,kret)
+C---->
+C
+C This subroutine mimics the behaviour of the original GRIBIN
+C but makes a call to PBGRIB to retrieve GRIB products. Because
+C MAGICS calls GRIBIN with an invalid buffer size, this mimic
+C version has to call PBGRIB with a phoney buffer size - dumlen,
+C currently 1000000. In effect this subverts the check that the
+C buffer is big enough for the retrieved product!!!
+C
+C----<
+ integer icalls
+ integer dumlen
+ save icalls, dumlen
+ data icalls/0/
+ data dumlen/1000000/
+C
+C First time through, print a warning message
+ if (icalls .eq. 0) then
+ icalls = icalls + 1
+ write(*,*) ' *********************************************'
+ write(*,*) ' *********************************************'
+ write(*,*) ' You are using an obsolete subroutine (GRIBIN)'
+ write(*,*) ' for retrieving GRIB products.'
+ write(*,*) ' There is NO check your buffer is big enough.'
+ write(*,*) ' Please change to using PBGRIB.'
+ write(*,*) ' *********************************************'
+ write(*,*) ' *********************************************'
+ endif
+C
+C Note the use of dumlen (not kinlen) in the following call ...
+ call pbgrib(kunit,karray,DUMLEN,koutlen,kret)
+ if ( kret .eq. -3) then
+ write(*,*) ' Buffer not big enough for GRIB product'
+ kret = -5
+ endif
+C
+ return
+ end
diff --git a/gribex/gribnum.F b/gribex/gribnum.F
new file mode 100755
index 0000000..26305af
--- /dev/null
+++ b/gribex/gribnum.F
@@ -0,0 +1,124 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION GRIBNUM(KONOFF)
+C
+C---->
+C**** GRIBNUM
+C
+C Purpose
+C -------
+C
+C Returns current GRIB_CYCLE version number.
+C
+C
+C Interface
+C ---------
+C
+C INUM = GRIBNUM(KONOFF)
+C
+C Input
+C -----
+C
+C KONOFF - switch for displayed message
+C = 0 if display is required on the first call
+C = non-zero if display is not required
+C
+C
+C Output
+C ------
+C
+C Returns a 6-digit version number, aaabbc, where:
+C aaa = 3-digit major number
+C bb = 2-digit minor number
+C c = 1-digit spare number (normally 0)
+C
+C
+C Method
+C ------
+C
+C Reads a 6-digit version number from the environment variable
+C GRIB_CYCLE. If this does not give a 6-digit number, an internal
+C hard-coded default value is used.
+C
+C On the first call, the function (optionally) displays a message:
+C
+C **************************************
+C * GRIB_CYCLE version number = aaabbc *
+C **************************************
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF May 1998
+C
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0. Variables.
+C ------------------------------------------------------------------
+C
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Function arguments
+C
+ INTEGER KONOFF
+C
+C Local variables
+C
+ INTEGER INUMBER, ICOUNT, IOFFSET
+ SAVE INUMBER, ICOUNT
+ CHARACTER*38 CMESS
+ CHARACTER*20 YNUMBER
+C
+ DATA INUMBER/000010/, ICOUNT/0/
+ DATA CMESS/'* GRIB_CYCLE version number = ****** *'/
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF( ICOUNT.EQ.0 ) THEN
+C
+C See if the environment variable has an override value
+C
+ CALL GETENV( 'GRIB_CYCLE', YNUMBER)
+ IOFFSET = INDEX( YNUMBER, ' ')
+ IF( IOFFSET.EQ.7 ) THEN
+ READ(YNUMBER,'(I6.6)') INUMBER
+ ENDIF
+C
+C First time through, display the message if required
+C
+ IF( KONOFF.EQ.0 ) THEN
+ WRITE(CMESS(31:36),'(I6.6)') INUMBER
+ WRITE(GRPRSM,*) '**************************************'
+ WRITE(GRPRSM,*) CMESS
+ WRITE(GRPRSM,*) '**************************************'
+ ENDIF
+ ICOUNT = 1
+ ENDIF
+C
+ GRIBNUM = INUMBER
+C
+ RETURN
+ END
diff --git a/gribex/groutpt.F b/gribex/groutpt.F
new file mode 100755
index 0000000..6c33271
--- /dev/null
+++ b/gribex/groutpt.F
@@ -0,0 +1,112 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GROUTPT()
+C
+C---->
+C**** GROUTPT
+C
+C Purpose.
+C --------
+C Changes diagnostic output stream if defined by environment variable.
+C
+C** Interface.
+C ----------
+C CALL GROUTPT()
+C
+C
+C Input Parameters.
+C -----------------
+C None.
+C
+C
+C Output Parameters.
+C ------------------
+C None.
+C
+C
+C Method.
+C -------
+C Checks environment variable GRPRS_STREAM for output stream number
+C for printing (default is 6)
+C
+C
+C Externals.
+C ----------
+C Common block GRPRSCM.
+C
+C
+C Reference.
+C ----------
+C None.
+C
+C
+C Comments.
+C ---------
+C None.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF June 2002
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C
+C Local variables
+C
+ INTEGER IOFFSET
+ CHARACTER*10 YNUMBER
+C
+C -----------------------------------------------------------------|
+C* Section 1 .
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+C See if output stream needs changing
+C
+ CALL GETENV('GRPRS_STREAM', YNUMBER)
+ IOFFSET = INDEX( YNUMBER, ' ')
+ IF( IOFFSET.GT.1 ) THEN
+ IF( IOFFSET.EQ.2 ) THEN
+ READ(YNUMBER,'(I1.1)') GRPRSM
+ ELSE IF( IOFFSET.EQ.3 ) THEN
+ READ(YNUMBER,'(I2.2)') GRPRSM
+ ELSE
+ WRITE(GRPRSM,*)
+ X 'GROUTPT: Invalid value for GRPRS_STREAM: ' // YNUMBER
+ GRPRSM = 6
+ ENDIF
+ ELSE
+ GRPRSM = 6
+ ENDIF
+C
+ IF( GRPRSM.LT.1 ) THEN
+ WRITE(*,*) 'GROUTPT: Invalid number for GRPRS_STREAM: ', GRPRSM
+ GRPRSM = 6
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9 . Format statements. Return to calling routine.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/grpr190.c b/gribex/grpr190.c
new file mode 100755
index 0000000..b6164cd
--- /dev/null
+++ b/gribex/grpr190.c
@@ -0,0 +1,76 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include <memory.h>
+
+#include "fortint.h"
+
+#ifdef FORTRAN_NO_UNDERSCORE
+#define GRPRS1B grprs1b
+#else
+#define GRPRS1B grprs1b_
+#endif
+
+void GRPRS1B(fortint*);
+fortint dldefs_(fortint*,fortint*,fortint*,fortint*,fortint*);
+fortint d_def_x(fortint*,fortint*,unsigned char*);
+
+void grpr190(fortint* ksec1) {
+/*
+// Decodes the local definition bytes for the multiple local definitions
+// in definition 190 and displays them via calls to Fortran routine GRPRS1B.
+*/
+unsigned char* bytes;
+fortint numberOfDefinitions = ksec1[43];
+unsigned char* startByte = (unsigned char*) &ksec1[44+2*ksec1[43]];
+fortint numberOfBytes = ksec1[45];
+fortint offset = 36*sizeof(fortint);
+fortint definitionNumber = ksec1[44];
+fortint loop, status, numberOfUnpackedIntegers, numberOfPackedBytes;
+static int first = 1;
+fortint* pBytes;
+
+ if( first ) {
+ setbuf(stdout,NULL);
+ first = 0;
+ }
+
+ for( loop = 0; loop < numberOfDefinitions; loop++ ) {
+ bytes = (unsigned char*) malloc(numberOfBytes*sizeof(fortint)+offset);
+/*
+// Decode the bytes into INTEGERS
+*/
+/*
+// Code for libemos version 000264 ..
+//
+// status = dldefs(&definitionNumber,startByte,(bytes+offset),
+// &numberOfUnpackedIntegers,&numberOfPackedBytes);
+*/
+ pBytes = (fortint*) (bytes+offset);
+ status = d_def_x(&definitionNumber,pBytes,startByte);
+/*
+// Display the values.
+*/
+ printf("\n ECMWF local definition number = %d\n",definitionNumber);
+ GRPRS1B((fortint*)bytes);
+
+ free(bytes);
+ startByte += numberOfBytes;
+ numberOfBytes = ksec1[47+loop*2];
+ definitionNumber = ksec1[46+loop*2];
+ }
+
+ return;
+}
+
+void grpr190_(fortint* ksec1) { grpr190(ksec1); return; }
diff --git a/gribex/grprs.h b/gribex/grprs.h
new file mode 100755
index 0000000..dc4e010
--- /dev/null
+++ b/gribex/grprs.h
@@ -0,0 +1,16 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C Common blocks holding default or user supplied values for printing.
+C
+ LOGICAL GRPRSET
+ INTEGER GRPRSM
+C
+ COMMON /GRPRSCM/ GRPRSM, GRPRSET
diff --git a/gribex/grprs0.F b/gribex/grprs0.F
new file mode 100755
index 0000000..b0d2226
--- /dev/null
+++ b/gribex/grprs0.F
@@ -0,0 +1,114 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRPRS0(KSEC0)
+C
+C---->
+C**** GRPRS0 - Print information from Section 0 of GRIB code.
+C
+C Purpose.
+C --------
+C
+C Print the information in the Indicator
+C Section (Section 0) of decoded GRIB data.
+C
+C** Interface.
+C ----------
+C
+C CALL GRPRS0(KSEC0)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KSEC0 - Array of decoded parameters from Section 0.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C Fields are printed as integers.
+C
+C Externals.
+C ----------
+C
+C Common block GRPRSCM.
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes re GRIB Code.
+C See also routine GRIBEX.
+C
+C Comments.
+C ---------
+C
+C Checks environment variable GRPRS_STREAM for output stream number
+C for printing (default is 6)
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 30.08.91
+C Changes to some comments only.
+C
+C J.D.Chambers ECMWF June 2002
+C Add option to set output stream number using environment variable
+C GRPRS_STREAM
+C
+C -----------------------------------------------------------------|
+C----<
+C
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+ INTEGER KSEC0(*)
+C
+C -----------------------------------------------------------------|
+C* Section 1 . Print required information.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ WRITE(GRPRSM,9000)
+ WRITE(GRPRSM,9001)
+ WRITE(GRPRSM,9002)
+ WRITE(GRPRSM,9003) KSEC0(1)
+ WRITE(GRPRSM,9004) KSEC0(2)
+C
+C -----------------------------------------------------------------|
+C* Section 9 . Format statements. Return to calling routine.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ 9000 FORMAT(1H )
+ 9001 FORMAT(1H ,'Section 0 - Indicator Section. ')
+ 9002 FORMAT(1H ,'-------------------------------------')
+ 9003 FORMAT(1H ,'Length of GRIB message (octets). ',I9)
+ 9004 FORMAT(1H ,'GRIB Edition Number. ',I9)
+C
+ RETURN
+C
+ END
diff --git a/gribex/grprs1.F b/gribex/grprs1.F
new file mode 100755
index 0000000..ecec22f
--- /dev/null
+++ b/gribex/grprs1.F
@@ -0,0 +1,1466 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRPRS1(KSEC0,KSEC1)
+C
+C---->
+C**** GRPRS1
+C
+C Purpose.
+C --------
+C
+C Print the information in the Product Definition
+C Section (Section 1) of decoded GRIB data.
+C
+C** Interface.
+C ----------
+C
+C CALL GRPRS1(KSEC0,KSEC1)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KSEC0 - Array of decoded parameters from Section 0.
+C KSEC1 - Array of decoded parameters from Section 1.
+C
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C
+C Method.
+C -------
+C
+C Flag fields are printed in binary representation.
+C Other fields as integers.
+C Fields printed depend on GRIB Edition.
+C
+C
+C Externals.
+C ----------
+C
+C PRTBIN - Print binary value in character format.
+C KWPRS1 - Print Washington ensemble products.
+C CHKTAB2 - Looks up a parameter in a given ECMWF local table 2.
+C
+C Common block GRPRSCM.
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes re GRIB Code.
+C See also routine GRIBEX.
+C
+C
+C Comments.
+C ---------
+C
+C When decoding data from Experimental Edition or Edition 0,
+C routine GRIBEX adds the additional fields available in
+C Edition 1.
+C
+C Checks environment variable GRPRS_STREAM for output stream number
+C for printing (default is 6)
+C
+C
+C Author.
+C -------
+C J. Hennessy ECMWF 18.06.91
+C
+C
+C Modifications.
+C --------------
+C J. Hennessy ECMWF 30.08.91
+C Different print for GRIB Editions up to Edition 1
+C removed.
+C
+C J. Hennessy ECMWF 07.01.92
+C Different print for GRIB Editions up to Edition 1
+C added for centres other than ECMWF.
+C
+C J. Hennessy ECMWF 27.07.92
+C Print added for satellite identifiers.
+C
+C J. Hennessy ECMWF 03.11.92
+C Print of local ECMWF use 1 of section 1 added.
+C
+C J. Hennessy ECMWF 03.12.92
+C Version number changed to character print.
+C
+C J. Hennessy ECMWF 20.05.93
+C Print of local ECMWF use 2,3 and 4 of section 1 added.
+C
+C J.D.Chambers ECMWF 18.10.93
+C Print of local ECMWF use 5 of section 1 added.
+C
+C J.D.Chambers ECMWF 10.05.94
+C Fix print of version number
+C
+C J.D.Chambers ECMWF 02.06.94
+C Fix print of total number of forecasts and forecast number
+C for MARS labelling
+C
+C J.D.Chambers ECMWF 19.01.95
+C Allow printing of ECMWF local use definition 8.
+C
+C J.D.Chambers ECMWF 14.02.95
+C Modify printing of ECMWF local use definition 7.
+C
+C J.D.Chambers ECMWF 09.10.95
+C Add handling of Washington ensemble products.
+C
+C J.D.Chambers ECMWF 27.02.96
+C Allow for ECMWF local use definition 6.
+C
+C J.D.Chambers ECMWF 13.02.98
+C Allow for ECMWF local use definition 10 (EPS tubes).
+C
+C J.D.Chambers ECMWF 16.02.98
+C Allow for ECMWF local use definition 11 (Supplementary data
+C used by analysis).
+C
+C J.D.Chambers ECMWF April 1998
+C Allow for ECMWF local use definition 13
+C
+C J.D.Chambers ECMWF November 1998
+C Allow for ECMWF local use definition 12
+C
+C J. Clochard, Meteo France, for ECMWF - June 1999.
+C Replace LOCAL2K call by CHKTAB2 call.
+C
+C J.D.Chambers ECMWF June 2002
+C Add option to set output stream number using environment variable
+C GRPRS_STREAM
+C
+C J.D.Chambers ECMWF October 2002
+C Allow for ECMWF local use definition 19
+C
+C J.D.Chambers ECMWF March 2003
+C Allow for ECMWF local use definition 20
+C
+C J.D.Chambers ECMWF March 2003
+C Allow for ECMWF local use definition 21
+C
+C J.D.Chambers ECMWF February 2004
+C Allow for ECMWF local use definition 22 and 23
+C
+C J.D.Chambers ECMWF September 2004
+C Allow for ECMWF local use definition 24
+C
+C J.D.Chambers ECMWF November 2004
+C Allow for ECMWF local use definition 25
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+#include "grbcom.h"
+C
+C Parameter(s)
+C
+ INTEGER JPBYTES
+#ifdef INTEGER_8
+ PARAMETER (JPBYTES = 8)
+#else
+ PARAMETER (JPBYTES = 4)
+#endif
+C
+C Subroutine arguments
+C
+ INTEGER KSEC0(*)
+ INTEGER KSEC1(*)
+C
+C Local variables
+C
+ INTEGER IPREV, ICURR, ICOUNT, IOFFSET, IOFF2, IOFF3
+ INTEGER IBIT, IERR, IOUT, IYEAR, NBYTES
+ INTEGER JLOOP, JILOOP
+ REAL VALUE
+C
+ CHARACTER*8 HVERSION
+ CHARACTER*121 HFIRST, HSECOND, HTHIRD, HFOURTH
+C
+C Externals
+C
+ INTEGER CHKTAB2
+ EXTERNAL CHKTAB2
+C
+C -----------------------------------------------------------------|
+C* Section 1 . Print required information.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ WRITE(GRPRSM,9000)
+ WRITE(GRPRSM,9001)
+ WRITE(GRPRSM,9002)
+C
+ WRITE(GRPRSM,9100) KSEC1(1)
+ WRITE(GRPRSM,9101) KSEC1(2)
+ WRITE(GRPRSM,9102) KSEC1(3)
+ WRITE(GRPRSM,9103) KSEC1(4)
+ IBIT = 8
+ CALL PRTBIN (KSEC1(5),IBIT,IOUT,IERR)
+ WRITE(GRPRSM,9104) IOUT
+ WRITE(GRPRSM,9105) KSEC1(6)
+ IERR = CHKTAB2(KSEC1,HFIRST,HSECOND,HTHIRD,HFOURTH)
+ IF( IERR .EQ. 0 ) THEN
+ IOFF2 = 121
+ DO JLOOP = 121, 1, -1
+ IF( HSECOND(JLOOP:JLOOP).NE.' ' ) THEN
+ IOFF2 = JLOOP
+ GOTO 110
+ ENDIF
+ ENDDO
+ GOTO 130
+ 110 CONTINUE
+ IOFF3 = 121
+ DO JLOOP = 121, 1, -1
+ IF( HTHIRD(JLOOP:JLOOP).NE.' ' ) THEN
+ IOFF3 = JLOOP
+ GOTO 120
+ ENDIF
+ ENDDO
+ GOTO 130
+ 120 CONTINUE
+ WRITE(GRPRSM,*)'('//HSECOND(1:IOFF2)//': '//HTHIRD(1:IOFF3)//')'
+C
+ 130 CONTINUE
+ ENDIF
+C
+ IF (KSEC1(6).NE.127) THEN
+ WRITE(GRPRSM,9106) KSEC1(7)
+ WRITE(GRPRSM,9107) KSEC1(8)
+ WRITE(GRPRSM,9108) KSEC1(9)
+ ELSE
+ WRITE(GRPRSM,9206) KSEC1(7)
+ WRITE(GRPRSM,9207) KSEC1(8)
+ ENDIF
+C
+ IYEAR = KSEC1(10)
+ IF( IYEAR.NE.255 ) THEN
+ IYEAR = ((KSEC1(21)-1)*100 + KSEC1(10))
+ WRITE(GRPRSM,9109) KSEC1(10), IYEAR
+ ELSE
+ WRITE(GRPRSM,*) 'Year of reference time of data (=MISSING) 255'
+ ENDIF
+ WRITE(GRPRSM,9110) KSEC1(11)
+ WRITE(GRPRSM,9111) KSEC1(12)
+ WRITE(GRPRSM,9112) KSEC1(13)
+ WRITE(GRPRSM,9113) KSEC1(14)
+ WRITE(GRPRSM,9114) KSEC1(15)
+ WRITE(GRPRSM,9115) KSEC1(16)
+ WRITE(GRPRSM,9116) KSEC1(17)
+ WRITE(GRPRSM,9117) KSEC1(18)
+ WRITE(GRPRSM,9118) KSEC1(19)
+ WRITE(GRPRSM,9119) KSEC1(20)
+C
+C All ECMWF data in GRIB Editions before Edition 1 is decoded
+C as 20th century data. Other centres are decoded as missing.
+C
+ IF (KSEC0(2).LT.1.AND.KSEC1(2).NE.98) THEN
+ WRITE(GRPRSM,9122)
+ ELSE
+ WRITE(GRPRSM,9120) KSEC1(21)
+ ENDIF
+C
+C Print sub-centre
+ WRITE(GRPRSM,9123) KSEC1(22)
+C
+C Decimal scale factor
+ WRITE(GRPRSM,9121) KSEC1(23)
+C
+C -----------------------------------------------------------------|
+C* Section 2 . Print local ECMWF information.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Regular MARS labelling, or reformatted Washington EPS products.
+C
+ IF ((KSEC1(2).EQ.98.AND.KSEC1(24).EQ.1) .OR.
+ X (KSEC1(22).EQ.98.AND.KSEC1(24).EQ.1) .OR.
+ X (KSEC1(2).EQ. 7.AND.KSEC1(22).EQ.98)) THEN
+C
+C Parameters common to all definitions.
+C
+ WRITE(GRPRSM,9301) KSEC1(37)
+ IF(KSEC1(37).EQ.1)
+ X WRITE(GRPRSM,*) '(Mars labelling or ensemble forecast)'
+ IF(KSEC1(37).EQ.2)
+ X WRITE(GRPRSM,*) '(Cluster means and standard deviations)'
+ IF(KSEC1(37).EQ.3)
+ X WRITE(GRPRSM,*) '(Satellite image data)'
+ IF(KSEC1(37).EQ.4)
+ X WRITE(GRPRSM,*) '(Ocean model data)'
+ IF(KSEC1(37).EQ.5)
+ X WRITE(GRPRSM,*) '(Forecast probability data)'
+ IF(KSEC1(37).EQ.6)
+ X WRITE(GRPRSM,*) '(Surface temperature data)'
+ IF(KSEC1(37).EQ.7)
+ X WRITE(GRPRSM,*) '(Sensitivity data)'
+ IF(KSEC1(37).EQ.8)
+ X WRITE(GRPRSM,*) '(ECMWF re-analysis data)'
+ IF(KSEC1(37).EQ.9)
+ X WRITE(GRPRSM,*) '(Singular vectors / ensemble perturbations)'
+ IF(KSEC1(37).EQ.10)
+ X WRITE(GRPRSM,*) '(EPS tubes)'
+ IF(KSEC1(37).EQ.11)
+ X WRITE(GRPRSM,*) '(Supplementary data used by analysis)'
+ IF(KSEC1(37).EQ.13)
+ X WRITE(GRPRSM,*) '(Wave 2D spectra direction and frequency)'
+ IF(KSEC1(37).EQ.14)
+ X WRITE(GRPRSM,*) '(Brightness temperature)'
+ IF(KSEC1(37).EQ.15)
+ X WRITE(GRPRSM,*) '(Ocean ensemble seasonal forecast)'
+ IF(KSEC1(37).EQ.16)
+ X WRITE(GRPRSM,*) '(Seasonal fc monthly mean atmosphere data)'
+ IF(KSEC1(37).EQ.17)
+ X WRITE(GRPRSM,*) '(Sst or sea-ice used by analysis)'
+ IF(KSEC1(37).EQ.18)
+ X WRITE(GRPRSM,*) '(Multi-analysis ensemble data)'
+ IF(KSEC1(37).EQ.19)
+ X WRITE(GRPRSM,*) '(Extreme forecast index data)'
+ IF(KSEC1(37).EQ.20)
+ X WRITE(GRPRSM,*) '(4D variational increments)'
+ IF(KSEC1(37).EQ.21)
+ X WRITE(GRPRSM,*) '(Sensitive area predictions)'
+ IF(KSEC1(37).EQ.23)
+ X WRITE(GRPRSM,*)
+ X '(Coupled atmospheric, wave & ocean means (+ hindcast support))'
+ IF(KSEC1(37).EQ.24)
+ X WRITE(GRPRSM,*) '(Satellite image simulation)'
+ IF(KSEC1(37).EQ.25)
+ X WRITE(GRPRSM,*) '(4DVar model errors)'
+ IF(KSEC1(37).EQ.50)
+ X WRITE(GRPRSM,*) '(Member State data)'
+ IF(KSEC1(37).EQ.190)
+ X WRITE(GRPRSM,*) '(Multiple ECMWF local definitions)'
+ IF(KSEC1(37).EQ.191)
+ X WRITE(GRPRSM,*) '(Free format data descriptor)'
+C
+ WRITE(GRPRSM,9302) KSEC1(38)
+ WRITE(GRPRSM,9303) KSEC1(39)
+ WRITE(GRPRSM,9304) KSEC1(40)
+ WRITE(HVERSION, '(A8)' ) KSEC1(41)
+ WRITE(GRPRSM,9305)
+ X HVERSION(5:5),
+ X HVERSION(6:6),
+ X HVERSION(7:7),
+ X HVERSION(8:8)
+C
+C ECMWF Local definition 1.
+C (MARS labelling or ensemble forecast data)
+C
+ IF (KSEC1(37).EQ.1) THEN
+ WRITE(GRPRSM,9310) KSEC1(42)
+ IF( KSEC1(40).NE.1090 ) WRITE(GRPRSM,9311) KSEC1(43)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 2.
+C (Cluster means and standard deviations)
+C
+ IF (KSEC1(37).EQ.2) THEN
+ WRITE(GRPRSM,9312) KSEC1(42)
+ WRITE(GRPRSM,9313) KSEC1(43)
+ WRITE(GRPRSM,9314) KSEC1(44)
+ WRITE(GRPRSM,9315) KSEC1(45)
+ WRITE(GRPRSM,9316) KSEC1(46)
+ WRITE(GRPRSM,9317) KSEC1(47)
+ WRITE(GRPRSM,9318) KSEC1(48)
+ WRITE(GRPRSM,9319) KSEC1(49)
+ WRITE(GRPRSM,9320) KSEC1(50)
+ WRITE(GRPRSM,9321) KSEC1(51)
+ WRITE(GRPRSM,9324) KSEC1(52)
+ WRITE(GRPRSM,9322) KSEC1(53)
+ DO 210 JLOOP = 1,KSEC1(53)
+ WRITE(GRPRSM,9323) KSEC1(JLOOP+53)
+ 210 CONTINUE
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 3.
+C (Satellite image data)
+C
+ IF (KSEC1(37).EQ.3) THEN
+ WRITE(GRPRSM,9306) KSEC1(42)
+ WRITE(GRPRSM,9307) KSEC1(43)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 4.
+C (Ocean model data)
+C
+ IF (KSEC1(37).EQ.4) THEN
+ WRITE(GRPRSM,9310) KSEC1(42)
+ IF( KSEC1(40).NE.1090 ) WRITE(GRPRSM,9311) KSEC1(43)
+ WRITE(GRPRSM,9401) KSEC1(44)
+ WRITE(GRPRSM,9402) KSEC1(45)
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Coordinate structure definition.'
+ WRITE(GRPRSM,*) '--------------------------------'
+ WRITE(GRPRSM,9403) KSEC1(46)
+ WRITE(GRPRSM,9404) KSEC1(47)
+ WRITE(GRPRSM,9405) KSEC1(48)
+ WRITE(GRPRSM,9406) KSEC1(49)
+ WRITE(GRPRSM,9407) KSEC1(50)
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Position definition.'
+ WRITE(GRPRSM,*) '--------------------'
+ WRITE(GRPRSM,9411) KSEC1(51)
+ WRITE(GRPRSM,9412) KSEC1(52)
+ WRITE(GRPRSM,9413) KSEC1(53)
+ WRITE(GRPRSM,9414) KSEC1(54)
+ WRITE(GRPRSM,9415) KSEC1(55)
+ WRITE(GRPRSM,9416) KSEC1(56)
+ WRITE(GRPRSM,9413) KSEC1(57)
+ WRITE(GRPRSM,9414) KSEC1(58)
+ WRITE(GRPRSM,9415) KSEC1(59)
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Grid Definition.'
+ WRITE(GRPRSM,*) '----------------'
+ WRITE(GRPRSM,9421) KSEC1(60)
+ WRITE(GRPRSM,9422) KSEC1(61)
+ WRITE(GRPRSM,9423) KSEC1(62)
+ WRITE(GRPRSM,9424) KSEC1(63)
+ WRITE(GRPRSM,9425) KSEC1(64)
+ WRITE(GRPRSM,9426) KSEC1(65)
+ WRITE(GRPRSM,9427) KSEC1(66)
+ WRITE(GRPRSM,9428) KSEC1(67)
+ WRITE(GRPRSM,9429) KSEC1(68)
+ WRITE(GRPRSM,9430) KSEC1(69)
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Further information.'
+ WRITE(GRPRSM,*) '--------------------'
+ WRITE(GRPRSM,9441) KSEC1(70)
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Auxiliary information.'
+ WRITE(GRPRSM,*) '----------------------'
+ WRITE(GRPRSM,9451) KSEC1(71)
+ WRITE(GRPRSM,9452) KSEC1(72)
+ WRITE(GRPRSM,9453) KSEC1(73)
+ WRITE(GRPRSM,9454) KSEC1(74)
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Horizontal coordinate supplement.'
+ WRITE(GRPRSM,*) '---------------------------------'
+ IF( KSEC1(71).EQ.0 ) THEN
+ WRITE(GRPRSM,*) '(None).'
+ ELSE
+ WRITE(GRPRSM,*) 'Number of items = ', KSEC1(71)
+ DO JLOOP = 1,KSEC1(71)
+ WRITE(GRPRSM,9461) KSEC1(74+JLOOP)
+ ENDDO
+ ENDIF
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Mixed coordinate definition.'
+ WRITE(GRPRSM,*) '----------------------------'
+ IF( KSEC1(72).EQ.0 ) THEN
+ WRITE(GRPRSM,*) '(None).'
+ ELSE
+ WRITE(GRPRSM,*) 'Number of items = ', KSEC1(72)
+ IOFFSET = 74 + KSEC1(71)
+ DO JLOOP = 1,KSEC1(72)
+ WRITE(GRPRSM,9461) KSEC1(IOFFSET+JLOOP)
+ ENDDO
+ ENDIF
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Grid coordinate list.'
+ WRITE(GRPRSM,*) '---------------------'
+ IF( KSEC1(73).EQ.0 ) THEN
+ WRITE(GRPRSM,*) '(None).'
+ ELSE
+ WRITE(GRPRSM,*) 'Number of items = ', KSEC1(73)
+ IOFFSET = 74 + KSEC1(71) + KSEC1(72)
+ DO JLOOP = 1,KSEC1(73)
+ WRITE(GRPRSM,9461) KSEC1(IOFFSET+JLOOP)
+ ENDDO
+ ENDIF
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Auxiliary array.'
+ WRITE(GRPRSM,*) '----------------'
+ IF( KSEC1(74).EQ.0 ) THEN
+ WRITE(GRPRSM,*) '(None).'
+ ELSE
+ WRITE(GRPRSM,*) 'Number of items = ', KSEC1(74)
+ IOFFSET = 74 + KSEC1(71) + KSEC1(72) + KSEC1(73)
+ DO JLOOP = 1,KSEC1(74)
+ WRITE(GRPRSM,9461) KSEC1(IOFFSET+JLOOP)
+ ENDDO
+ ENDIF
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Post-auxiliary array.'
+ WRITE(GRPRSM,*) '---------------------'
+ IOFFSET = 74 + KSEC1(71) + KSEC1(72) + KSEC1(73) + KSEC1(74)
+ IF( KSEC1(IOFFSET+1).EQ.0 ) THEN
+ WRITE(GRPRSM,*) '(None).'
+ ELSE
+ WRITE(GRPRSM,*) 'Number of items = ', KSEC1(IOFFSET+1)
+ DO JLOOP = 2, 4
+ WRITE(GRPRSM,9461) KSEC1(IOFFSET+JLOOP)
+ ENDDO
+ IF( KSEC1(IOFFSET+1).GT.4 ) THEN
+ WRITE(GRPRSM,9462) KSEC1(IOFFSET+5)
+ IF( KSEC1(IOFFSET+6).NE.0 ) THEN
+ WRITE(GRPRSM,9463) KSEC1(IOFFSET+6)
+ WRITE(GRPRSM,9464) KSEC1(IOFFSET+7)
+ ENDIF
+ ENDIF
+ ENDIF
+C
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 5.
+C (Forecast probability data)
+C
+ IF (KSEC1(37).EQ.5) THEN
+ WRITE(GRPRSM,9500) KSEC1(42)
+ WRITE(GRPRSM,9501) KSEC1(43)
+ WRITE(GRPRSM,9502) KSEC1(44)
+ WRITE(GRPRSM,9503) KSEC1(45)
+ IF ( KSEC1(45) .NE. 2 ) WRITE(GRPRSM,9504) KSEC1(46)
+ IF ( KSEC1(45) .NE. 1 ) WRITE(GRPRSM,9505) KSEC1(47)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 6.
+C (Surface temperature data)
+C
+ IF (KSEC1(37).EQ.6) THEN
+C
+ IYEAR = KSEC1(44)
+ IF( IYEAR.GT.100 ) THEN
+ IF( IYEAR.LT.19000000 ) IYEAR = IYEAR + 19000000
+ WRITE(GRPRSM,9601) IYEAR
+ ELSE
+ WRITE(GRPRSM,*)
+ X 'Date of SST field used Not given'
+ ENDIF
+ IF(KSEC1(45).EQ.0) WRITE(GRPRSM,9602) KSEC1(45)
+ IF(KSEC1(45).EQ.1) WRITE(GRPRSM,9603) KSEC1(45)
+ IF(KSEC1(45).EQ.2) WRITE(GRPRSM,9604) KSEC1(45)
+C
+ WRITE(GRPRSM,9605) KSEC1(46)
+C
+ DO 260 JLOOP = 1, KSEC1(46)
+ IYEAR = KSEC1(45+(JLOOP*2))
+ IF( IYEAR.GT.100 ) THEN
+ IF( IYEAR.LT.19000000 ) IYEAR = IYEAR + 19000000
+ WRITE(GRPRSM,9606) JLOOP, IYEAR
+ WRITE(GRPRSM,9607) JLOOP, KSEC1(46+(JLOOP*2))
+ ELSE
+ WRITE(GRPRSM,*)
+ X 'Date of SST field used Not given'
+ ENDIF
+C
+ 260 CONTINUE
+C
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 7.
+C (Sensitivity data)
+C
+ IF (KSEC1(37).EQ.7) THEN
+ IF ( KSEC1(39) .EQ. 51 ) WRITE(GRPRSM,9700) KSEC1(42)
+ IF ( KSEC1(39) .NE. 51 ) WRITE(GRPRSM,9701) KSEC1(42)
+ IF ( KSEC1(39) .NE. 52 ) WRITE(GRPRSM,9702) KSEC1(43)
+ IF ( KSEC1(39) .EQ. 52 ) WRITE(GRPRSM,9703) KSEC1(43)
+ WRITE(GRPRSM,9704) KSEC1(44)
+ WRITE(GRPRSM,9705) KSEC1(45)
+ GOTO 900
+ ENDIF
+C
+C
+C ECMWF Local definition 8.
+C (ECMWF re-analysis data)
+C
+ IF (KSEC1(37).EQ.8) THEN
+ IF( (KSEC1(40).EQ.1043).OR.
+ X (KSEC1(40).EQ.1070).OR.
+ X (KSEC1(40).EQ.1071) ) THEN
+ WRITE(GRPRSM,9801) KSEC1(42)
+ DO JLOOP = 43, 54
+ JILOOP = JLOOP + 8
+ WRITE(GRPRSM,9800) JILOOP, KSEC1(JLOOP)
+ ENDDO
+ ELSE
+ DO JLOOP = 42, 54
+ JILOOP = JLOOP + 8
+ WRITE(GRPRSM,9800) JILOOP, KSEC1(JLOOP)
+ ENDDO
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+ IF (KSEC1(39).GT.4.AND.KSEC1(39).LT.9) THEN
+ WRITE(GRPRSM,9308) KSEC1(42)
+ WRITE(GRPRSM,9309) KSEC1(43)
+ ENDIF
+C
+C
+C ECMWF Local definition 9.
+C (Singular vectors and ensemble perturbations)
+C
+ IF (KSEC1(37).EQ.9) THEN
+ IF(KSEC1(39).EQ.60)
+ X WRITE(GRPRSM,9960) KSEC1(42)
+ IF(KSEC1(39).EQ.61)
+ X WRITE(GRPRSM,9961) KSEC1(42)
+ IF(KSEC1(39).EQ.62)
+ X WRITE(GRPRSM,9962) KSEC1(42)
+ IF(KSEC1(39).EQ.62) THEN
+ WRITE(GRPRSM,9943) KSEC1(43)
+ WRITE(GRPRSM,9944) KSEC1(44)
+ WRITE(GRPRSM,9945) KSEC1(45)
+ WRITE(GRPRSM,9946) KSEC1(46)
+ WRITE(GRPRSM,9947) KSEC1(47)
+ WRITE(GRPRSM,9948) KSEC1(48)
+ WRITE(GRPRSM,9949) KSEC1(49)
+ WRITE(GRPRSM,9950) KSEC1(50)
+ WRITE(GRPRSM,9951) KSEC1(51)
+ WRITE(GRPRSM,9952) KSEC1(52)
+ WRITE(GRPRSM,9953) KSEC1(53)
+ WRITE(GRPRSM,9954) KSEC1(54)
+ WRITE(GRPRSM,9955) KSEC1(55)
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C
+C ECMWF Local definition 10.
+C (EPS tubes)
+C
+ IF (KSEC1(37).EQ.10) THEN
+ WRITE(GRPRSM,1001) KSEC1(42)
+ WRITE(GRPRSM,1002) KSEC1(43)
+ WRITE(GRPRSM,1003) KSEC1(44)
+ WRITE(GRPRSM,1004) KSEC1(45)
+ WRITE(GRPRSM,1005) KSEC1(46)
+ WRITE(GRPRSM,1006) KSEC1(47)
+ WRITE(GRPRSM,1007) KSEC1(48)
+ WRITE(GRPRSM,1008) KSEC1(49)
+ WRITE(GRPRSM,1009) KSEC1(50)
+ WRITE(GRPRSM,1010) KSEC1(51)
+ WRITE(GRPRSM,1011) KSEC1(52)
+ WRITE(GRPRSM,1012) KSEC1(53)
+ WRITE(GRPRSM,1013) KSEC1(54)
+ WRITE(GRPRSM,1014) KSEC1(55)
+ WRITE(GRPRSM,1015) KSEC1(56)
+ WRITE(GRPRSM,1016) KSEC1(57)
+ WRITE(GRPRSM,1017) KSEC1(58)
+C
+ WRITE(GRPRSM,1018)
+ DO 280 JLOOP = 1, KSEC1(58)
+ WRITE(GRPRSM,1019) KSEC1(58+JLOOP)
+ 280 CONTINUE
+ GOTO 900
+ ENDIF
+C
+C
+C ECMWF Local definition 11.
+C (Supplementary data used by the analysis)
+C
+ IF (KSEC1(37).EQ.11) THEN
+ WRITE(GRPRSM,1101)
+ WRITE(GRPRSM,1103) KSEC1(42)
+ WRITE(GRPRSM,1104) KSEC1(43)
+ WRITE(GRPRSM,1105) KSEC1(44)
+ WRITE(HVERSION, '(A8)' ) KSEC1(45)
+ WRITE(GRPRSM,1106)
+ X HVERSION(5:5),
+ X HVERSION(6:6),
+ X HVERSION(7:7),
+ X HVERSION(8:8)
+ IYEAR = KSEC1(46)
+ IF( IYEAR.GT.40 ) THEN
+ IYEAR = IYEAR + 1900
+ ELSE
+ IYEAR = IYEAR + 2000
+ ENDIF
+ WRITE(GRPRSM,1107) KSEC1(46), IYEAR
+ WRITE(GRPRSM,1108) KSEC1(47)
+ WRITE(GRPRSM,1109) KSEC1(48)
+ WRITE(GRPRSM,1110) KSEC1(49)
+ WRITE(GRPRSM,1111) KSEC1(50)
+ WRITE(GRPRSM,1112) KSEC1(51)
+ WRITE(GRPRSM,1113) KSEC1(52)
+ WRITE(GRPRSM,1114) KSEC1(53)
+ GOTO 900
+ ENDIF
+C
+C
+C ECMWF Local definition 12.
+C
+ IF (KSEC1(37).EQ.12) THEN
+ WRITE(GRPRSM,1201)
+ WRITE(GRPRSM,1203) KSEC1(42)
+ WRITE(GRPRSM,1204) KSEC1(43)
+ WRITE(GRPRSM,1205) KSEC1(44)
+ WRITE(GRPRSM,1206) KSEC1(45)
+ WRITE(GRPRSM,1207) KSEC1(46)
+ WRITE(GRPRSM,1208) KSEC1(47)
+ WRITE(GRPRSM,1209) KSEC1(48)
+ WRITE(GRPRSM,1210) KSEC1(49)
+ WRITE(GRPRSM,1211)
+ IPREV = KSEC1(50)
+ ICURR = 0
+ ICOUNT = 0
+ DO JLOOP = 1, KSEC1(49)
+ ICURR = KSEC1(49+JLOOP)
+ IF( ICURR.NE.IPREV ) THEN
+ IF( ICOUNT.EQ.1 ) WRITE(GRPRSM,1212) IPREV
+ IF( ICOUNT.EQ.2 ) WRITE(GRPRSM,1213) IPREV
+ IF( ICOUNT.GT.2 ) WRITE(GRPRSM,1214) IPREV, ICOUNT
+ IPREV = ICURR
+ ICOUNT = 1
+ ELSE
+ ICOUNT = ICOUNT + 1
+ ENDIF
+ ENDDO
+ IF( ICOUNT.EQ.1 ) WRITE(GRPRSM,1212) IPREV
+ IF( ICOUNT.EQ.2 ) WRITE(GRPRSM,1213) IPREV
+ IF( ICOUNT.GT.2 ) WRITE(GRPRSM,1214) IPREV, ICOUNT
+ GOTO 900
+ ENDIF
+C
+C
+C ECMWF Local definition 13.
+C (Wave 2D spectra direction and frequency)
+C
+ IF (KSEC1(37).EQ.13) THEN
+ WRITE(GRPRSM,1301) KSEC1(44)
+ WRITE(GRPRSM,1302) KSEC1(45)
+ WRITE(GRPRSM,1303) KSEC1(46)
+ WRITE(GRPRSM,1304) KSEC1(47)
+ WRITE(GRPRSM,1305) KSEC1(48)
+ WRITE(GRPRSM,1306) KSEC1(49)
+ WRITE(GRPRSM,1307)
+ DO 290 JLOOP = 1, KSEC1(46)
+ VALUE = REAL(KSEC1(49+JLOOP))/REAL(KSEC1(48))
+ IF( KSEC1(44).EQ.JLOOP ) THEN
+ WRITE(GRPRSM,1308) JLOOP, VALUE
+ ELSE
+ WRITE(GRPRSM,1309) JLOOP, VALUE
+ ENDIF
+ 290 CONTINUE
+ WRITE(GRPRSM,1310)
+ DO 295 JLOOP = 1, KSEC1(47)
+ VALUE = REAL(KSEC1(49+KSEC1(46)+JLOOP))/REAL(KSEC1(49))
+ IF( KSEC1(45).EQ.JLOOP ) THEN
+ WRITE(GRPRSM,1308) JLOOP, VALUE
+ ELSE
+ WRITE(GRPRSM,1309) JLOOP, VALUE
+ ENDIF
+ 295 CONTINUE
+C
+ IF( N13FLAG.GT.0 ) THEN
+ WRITE(GRPRSM,1311) KSEC1(50+KSEC1(46)+KSEC1(47))
+ WRITE(GRPRSM,1312) KSEC1(51+KSEC1(46)+KSEC1(47))
+ IF( N13FLAG.GT.1 ) THEN
+ WRITE(GRPRSM,1313) KSEC1(52+KSEC1(46)+KSEC1(47))
+ WRITE(GRPRSM,1314) KSEC1(53+KSEC1(46)+KSEC1(47))
+ WRITE(GRPRSM,1315) KSEC1(54+KSEC1(46)+KSEC1(47))
+ IF( N13FLAG.GT.2 ) THEN
+ WRITE(GRPRSM,1316) KSEC1(55+KSEC1(46)+KSEC1(47))
+ WRITE(GRPRSM,1317) KSEC1(56+KSEC1(46)+KSEC1(47))
+ WRITE(GRPRSM,1318) KSEC1(57+KSEC1(46)+KSEC1(47))
+ WRITE(GRPRSM,1319) KSEC1(58+KSEC1(46)+KSEC1(47))
+ ENDIF
+ ENDIF
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 14.
+C (Brightness temperature)
+C
+ IF (KSEC1(37).EQ.14) THEN
+ WRITE(GRPRSM,1401) KSEC1(44)
+ WRITE(GRPRSM,1402) KSEC1(45)
+ WRITE(GRPRSM,1403) KSEC1(46)
+ WRITE(GRPRSM,1404)
+ DO 296 JLOOP = 1, KSEC1(46)
+ VALUE = REAL(KSEC1(46+JLOOP))/REAL(KSEC1(45))
+ IF( KSEC1(44).EQ.JLOOP ) THEN
+ WRITE(GRPRSM,1405) JLOOP, VALUE
+ ELSE
+ WRITE(GRPRSM,1406) JLOOP, VALUE
+ ENDIF
+ 296 CONTINUE
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 15.
+C (Ocean ensemble seasonal forecast)
+C
+ IF (KSEC1(37).EQ.15) THEN
+ WRITE(GRPRSM,1501) KSEC1(42)
+ WRITE(GRPRSM,1504) KSEC1(43)
+ WRITE(GRPRSM,1502) KSEC1(44)
+ WRITE(GRPRSM,1503) KSEC1(45)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 16.
+C (Seasonal forecast monthly mean atmosphere data)
+C
+ IF (KSEC1(37).EQ.16) THEN
+ WRITE(GRPRSM,1501) KSEC1(42)
+ WRITE(GRPRSM,1502) KSEC1(44)
+ WRITE(GRPRSM,1503) KSEC1(45)
+ WRITE(GRPRSM,1601) KSEC1(46)
+ WRITE(GRPRSM,1602) KSEC1(47)
+ WRITE(GRPRSM,1603) KSEC1(48)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 17.
+C (Sst or sea-ice used by analysis)
+C
+ IF (KSEC1(37).EQ.17) THEN
+C
+ IYEAR = KSEC1(44)
+ IF( IYEAR.GT.100 ) THEN
+ IF( IYEAR.LT.19000000 ) IYEAR = IYEAR + 19000000
+ WRITE(GRPRSM,1701) IYEAR
+ ELSE
+ WRITE(GRPRSM,*)
+ X 'Date of sst/ice field used Not given'
+ ENDIF
+ IF(KSEC1(45).EQ.0) WRITE(GRPRSM,1702) KSEC1(45)
+ IF(KSEC1(45).EQ.1) WRITE(GRPRSM,1703) KSEC1(45)
+ IF(KSEC1(45).EQ.2) WRITE(GRPRSM,1704) KSEC1(45)
+C
+ WRITE(GRPRSM,1705) KSEC1(46)
+C
+ DO JLOOP = 1, KSEC1(46)
+ IYEAR = KSEC1(45+(JLOOP*2))
+ IF( IYEAR.GT.100 ) THEN
+ IF( IYEAR.LT.19000000 ) IYEAR = IYEAR + 19000000
+ WRITE(GRPRSM,1706) JLOOP, IYEAR
+ WRITE(GRPRSM,1707) JLOOP, KSEC1(46+(JLOOP*2))
+ ELSE
+ WRITE(GRPRSM,*)
+ X 'Date of sst/ice field used Not given'
+ ENDIF
+C
+ ENDDO
+ GOTO 900
+C
+ ENDIF
+C
+C ECMWF Local definition 18.
+C (Multi-analysis ensemble data)
+C
+ IF (KSEC1(37).EQ.18) THEN
+ WRITE(GRPRSM,1801) KSEC1(42)
+ WRITE(GRPRSM,1802) KSEC1(43)
+ WRITE(GRPRSM,1803) KSEC1(44)
+ WRITE(HVERSION, '(A8)' ) KSEC1(45)
+ WRITE(GRPRSM,1804)
+ X HVERSION(5:5),
+ X HVERSION(6:6),
+ X HVERSION(7:7),
+ X HVERSION(8:8)
+ WRITE(GRPRSM,1805) KSEC1(46)
+ WRITE(GRPRSM,*) ' WMO centre analyses used:'
+ WRITE(GRPRSM,*) ' ------------------------'
+ DO JLOOP = 1, KSEC1(46)
+ WRITE(HVERSION, '(A8)' ) KSEC1(46+JLOOP)
+ WRITE(GRPRSM,1806)
+ X HVERSION(5:5),
+ X HVERSION(6:6),
+ X HVERSION(7:7),
+ X HVERSION(8:8)
+ ENDDO
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 19.
+C (Extreme forecast index)
+C
+ IF (KSEC1(37).EQ.19) THEN
+ WRITE(GRPRSM,1901) KSEC1(42)
+ WRITE(GRPRSM,1902) KSEC1(43)
+ WRITE(GRPRSM,1903) KSEC1(44)
+ WRITE(GRPRSM,1904) KSEC1(45)
+ WRITE(GRPRSM,1905) KSEC1(46)
+ WRITE(GRPRSM,1906) KSEC1(47)
+ WRITE(GRPRSM,1907) KSEC1(48)
+ WRITE(GRPRSM,1908) KSEC1(49)
+ WRITE(GRPRSM,1909) KSEC1(50)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 20.
+C (4D variational increments)
+C
+ IF (KSEC1(37).EQ.20) THEN
+ WRITE(GRPRSM,2001) KSEC1(42)
+ WRITE(GRPRSM,2002) KSEC1(43)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 21.
+C (Sensitive area predictions)
+C
+ IF (KSEC1(37).EQ.21) THEN
+ WRITE(GRPRSM,2101) KSEC1(42)
+ WRITE(GRPRSM,2102) KSEC1(43)
+ WRITE(GRPRSM,2103) KSEC1(44)
+ WRITE(GRPRSM,2104) KSEC1(45)
+ WRITE(GRPRSM,2105) KSEC1(46)
+ WRITE(GRPRSM,2106) KSEC1(47)
+ WRITE(GRPRSM,2107) KSEC1(48)
+ WRITE(GRPRSM,2108) KSEC1(49)
+ WRITE(GRPRSM,2109) KSEC1(50)
+ WRITE(GRPRSM,2110) KSEC1(51)
+ WRITE(GRPRSM,2111) KSEC1(52)
+ WRITE(GRPRSM,2112) KSEC1(53)
+ WRITE(GRPRSM,2113) KSEC1(54)
+ WRITE(GRPRSM,2114) KSEC1(55)
+ WRITE(GRPRSM,2115) KSEC1(56)
+ WRITE(GRPRSM,2116) KSEC1(57)
+ WRITE(HVERSION, '(A8)' ) KSEC1(58)
+#ifdef LITTLE_ENDIAN
+ WRITE(GRPRSM,2117) HVERSION(5:5)
+#else
+ WRITE(GRPRSM,2117) HVERSION(8:8)
+#endif
+ WRITE(GRPRSM,2118) KSEC1(59)
+ WRITE(GRPRSM,2119) KSEC1(60)
+ WRITE(GRPRSM,2120) KSEC1(61)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 22.
+C (Couple atmospheric, wave and ocean models)
+C
+ IF (KSEC1(37).EQ.22) THEN
+ WRITE(GRPRSM,1501) KSEC1(42)
+ WRITE(GRPRSM,1504) KSEC1(43)
+ WRITE(GRPRSM,1502) KSEC1(44)
+ WRITE(GRPRSM,1503) KSEC1(45)
+ WRITE(GRPRSM,2201) KSEC1(46)
+ WRITE(GRPRSM,2202) KSEC1(47)
+ WRITE(GRPRSM,2203) KSEC1(48)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 23.
+C (Couple atmospheric, wave and ocean means)
+C
+ IF (KSEC1(37).EQ.23) THEN
+ WRITE(GRPRSM,1501) KSEC1(42)
+ WRITE(GRPRSM,1504) KSEC1(43)
+ WRITE(GRPRSM,1502) KSEC1(44)
+ WRITE(GRPRSM,1503) KSEC1(45)
+ WRITE(GRPRSM,1601) KSEC1(46)
+ WRITE(GRPRSM,1602) KSEC1(47)
+ WRITE(GRPRSM,1603) KSEC1(48)
+ WRITE(GRPRSM,2201) KSEC1(49)
+ WRITE(GRPRSM,2202) KSEC1(50)
+ WRITE(GRPRSM,2203) KSEC1(51)
+ WRITE(GRPRSM,9502) KSEC1(52)
+ WRITE(GRPRSM,9503) KSEC1(53)
+ IF ( KSEC1(53) .NE. 2 ) WRITE(GRPRSM,9504) KSEC1(54)
+ IF ( KSEC1(53) .NE. 1 ) WRITE(GRPRSM,9505) KSEC1(55)
+C
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 24.
+C (Couple atmospheric, wave and ocean means)
+C
+ IF (KSEC1(37).EQ.24) THEN
+ WRITE(GRPRSM,2401) KSEC1(42)
+ WRITE(GRPRSM,2402) KSEC1(43)
+ WRITE(GRPRSM,2403) KSEC1(44)
+ WRITE(GRPRSM,2404) KSEC1(45)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 25.
+C (Couple atmospheric, wave and ocean means)
+C
+ IF (KSEC1(37).EQ.25) THEN
+ WRITE(GRPRSM,2501) KSEC1(42)
+ WRITE(GRPRSM,2502) KSEC1(43)
+ WRITE(GRPRSM,2503) KSEC1(44)
+ ENDIF
+C
+C ECMWF Local definition 50.
+C (Member State data)
+C
+ IF (KSEC1(37).EQ.50) THEN
+ WRITE(GRPRSM,5001) KSEC1(42)
+ WRITE(GRPRSM,5002) KSEC1(43)
+ WRITE(GRPRSM,5003) KSEC1(44)
+ WRITE(GRPRSM,5004) KSEC1(45)
+ WRITE(GRPRSM,5005) KSEC1(46)
+ WRITE(GRPRSM,5006) KSEC1(47)
+ WRITE(GRPRSM,5007) KSEC1(48)
+ WRITE(GRPRSM,*) ' ECMWF additions'
+ WRITE(GRPRSM,*) ' ---------------'
+ WRITE(GRPRSM,5008) KSEC1(49)
+ WRITE(GRPRSM,5009) KSEC1(50)
+ WRITE(GRPRSM,5010) (KSEC1(JLOOP),JLOOP=51,60)
+ WRITE(GRPRSM,*) ' Optional data'
+ WRITE(GRPRSM,*) ' -------------'
+ WRITE(GRPRSM,5010) (KSEC1(JLOOP),JLOOP=61,106)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 190.
+C (Multiple ECMWF local definitions)
+C
+ IF (KSEC1(37).EQ.190) THEN
+ WRITE(GRPRSM,19001) KSEC1(44)
+ NBYTES = 0
+ DO JLOOP = 1, KSEC1(44)
+ WRITE(GRPRSM,19002) KSEC1(43+JLOOP*2)
+ WRITE(GRPRSM,19003) KSEC1(44+JLOOP*2)
+ NBYTES = NBYTES + KSEC1(44+2*JLOOP) + 8
+ ENDDO
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) ' Internal local definitions:'
+ WRITE(GRPRSM,*) ' ---------------------------'
+ CALL GRPR190(KSEC1)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 191.
+C (Free format data descriptor)
+C
+ IF (KSEC1(37).EQ.191) THEN
+ WRITE(GRPRSM,19101) KSEC1(44)
+ WRITE(GRPRSM,19102) KSEC1(45)
+ WRITE(GRPRSM,19103) KSEC1(46)
+ WRITE(GRPRSM,19108) KSEC1(51)
+ WRITE(GRPRSM,*) ' Data descriptor bytes'
+ WRITE(GRPRSM,*) ' ---------------------'
+ DO JLOOP = 52, (51+(KSEC1(51)+JPBYTES-1)/JPBYTES)
+ WRITE(GRPRSM,19109) KSEC1(JLOOP)
+ ENDDO
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition not in above selection
+C (eg defined using templates)
+C
+ IF( NDBG.EQ.0 ) CALL LDEFPRT(GRPRSM,KSEC1)
+ GOTO 900
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3 . Print Washington ensemble product information.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Washington EPS products (but not reformatted Washington EPS
+C products.
+ IF ((KSEC1(2).EQ.7.AND.KSEC1(24).EQ.1).AND.
+ X (.NOT.KSEC1(22).EQ.98) ) THEN
+ CALL KWPRS1 (KSEC0,KSEC1)
+ ENDIF
+C
+C
+C -----------------------------------------------------------------|
+C* Section 9 . Format statements. Return to calling routine.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ 9000 FORMAT(' ')
+ 9001 FORMAT(' Section 1 - Product Definition Section.')
+ 9002 FORMAT(' ---------------------------------------')
+ 9100 FORMAT(' Code Table 2 Version Number. ',I9)
+ 9101 FORMAT(' Originating centre identifier. ',I9)
+ 9102 FORMAT(' Model identification. ',I9)
+ 9103 FORMAT(' Grid definition. ',I9)
+ 9104 FORMAT(' Flag (Code Table 1) ',I8.8)
+ 9105 FORMAT(' Parameter identifier (Code Table 2). ',I9)
+ 9106 FORMAT(' Type of level (Code Table 3). ',I9)
+ 9107 FORMAT(' Value 1 of level (Code Table 3). ',I9)
+ 9108 FORMAT(' Value 2 of level (Code Table 3). ',I9)
+ 9109 FORMAT(' Year of reference time of data. ',I9,' (',I4,')' )
+ 9110 FORMAT(' Month of reference time of data. ',I9)
+ 9111 FORMAT(' Day of reference time of data. ',I9)
+ 9112 FORMAT(' Hour of reference time of data. ',I9)
+ 9113 FORMAT(' Minute of reference time of data. ',I9)
+ 9114 FORMAT(' Time unit (Code Table 4). ',I9)
+ 9115 FORMAT(' Time range one. ',I9)
+ 9116 FORMAT(' Time range two. ',I9)
+ 9117 FORMAT(' Time range indicator (Code Table 5) ',I9)
+ 9118 FORMAT(' Number averaged. ',I9)
+ 9119 FORMAT(' Number missing from average. ',I9)
+ 9120 FORMAT(' Century of reference time of data. ',I9)
+ 9121 FORMAT(' Units decimal scaling factor. ',I9)
+ 9122 FORMAT(' Century of reference time of data. Not given')
+ 9123 FORMAT(' Sub-centre identifier. ',I9)
+ 9206 FORMAT(' Satellite identifier. ',I9)
+ 9207 FORMAT(' Spectral band. ',I9)
+C
+ 9301 FORMAT(' ECMWF local usage identifier. ',I9)
+ 9302 FORMAT(' Class. ',I9)
+ 9303 FORMAT(' Type. ',I9)
+ 9304 FORMAT(' Stream. ',I9)
+ 9305 FORMAT(' Version number or Experiment identifier. ',A1,A1,A1,A1)
+ 9306 FORMAT(' Satellite spectral band. ',I9)
+ 9307 FORMAT(' Function code. ',I9)
+ 9308 FORMAT(' Simulation number. ',I9)
+ 9309 FORMAT(' Total number of simulations. ',I9)
+ 9310 FORMAT(' Forecast number. ',I9)
+ 9311 FORMAT(' Total number of forecasts. ',I9)
+ 9312 FORMAT(' Cluster number. ',I9)
+ 9313 FORMAT(' Total number of clusters. ',I9)
+ 9314 FORMAT(' Clustering method. ',I9)
+ 9315 FORMAT(' Start time step when clustering. ',I9)
+ 9316 FORMAT(' End time step when clustering. ',I9)
+ 9317 FORMAT(' Northern latitude of domain. ',I9)
+ 9318 FORMAT(' Western longitude of domain. ',I9)
+ 9319 FORMAT(' Southern latitude of domain. ',I9)
+ 9320 FORMAT(' Eastern longitude of domain. ',I9)
+ 9321 FORMAT(' Operational forecast in cluster ',I9)
+ 9322 FORMAT(' Number of forecasts in cluster. ',I9)
+ 9323 FORMAT(' Forecast number ',I9)
+ 9324 FORMAT(' Control forecast in cluster ',I9)
+C
+C ECMWF Local definition 4.
+C
+ 9401 FORMAT(' System number. ',I9)
+ 9402 FORMAT(' Method number. ',I9)
+ 9403 FORMAT(' Space unit flag. ',I9)
+ 9404 FORMAT(' Vertical coordinate definition. ',I9)
+ 9405 FORMAT(' Horizontal coordinate definition. ',I9)
+ 9406 FORMAT(' Time unit flag. ',I9)
+ 9407 FORMAT(' Time coordinate definition. ',I9)
+ 9408 FORMAT(' Method used for analysis or forecast.',I9)
+C
+ 9411 FORMAT(' Mixed coordinate field flag. ',I9)
+ 9412 FORMAT(' Coordinate 1 flag. ',I9)
+ 9413 FORMAT(' Averaging flag. ',I9)
+ 9414 FORMAT(' Position of level 1. ',I9)
+ 9415 FORMAT(' Position of level 2. ',I9)
+ 9416 FORMAT(' Coordinate 2 flag. ',I9)
+C
+ 9421 FORMAT(' Coordinate 3 flag (x-axis) ',I9)
+ 9422 FORMAT(' Coordinate 4 flag (y-axis) ',I9)
+ 9423 FORMAT(' Coordinate 4 of first grid point. ',I10)
+ 9424 FORMAT(' Coordinate 3 of first grid point. ',I10)
+ 9425 FORMAT(' Coordinate 4 of last grid point. ',I10)
+ 9426 FORMAT(' Coordinate 3 of last grid point. ',I10)
+ 9427 FORMAT(' i - increment. ',I9)
+ 9428 FORMAT(' j - increment. ',I9)
+ 9429 FORMAT(' Flag for irregular grid coordinates. ',I9)
+ 9430 FORMAT(' Flag for normal or staggered grids. ',I9)
+C
+ 9441 FORMAT(' Further information flag. ',I9)
+C
+ 9451 FORMAT(' No. entries in horizontal coordinate ',I9)
+ 9452 FORMAT(' No. entries in mixed coordinate defn.',I9)
+ 9453 FORMAT(' No. entries in grid coordinate list. ',I9)
+ 9454 FORMAT(' No. entries in auxiliary array. ',I9)
+C
+ 9461 FORMAT(' ',I12)
+ 9462 FORMAT(' Reference date ',I9)
+ 9463 FORMAT(' Climate date - from ',I9)
+ 9464 FORMAT(' Climate date - to ',I9)
+C
+C ECMWF Local definition 5.
+C
+ 9500 FORMAT(' Forecast probability number ',I9)
+ 9501 FORMAT(' Total number of forecast probabilities ',I7)
+ 9502 FORMAT(' Threshold units decimal scale factor ',I9)
+ 9503 FORMAT(' Threshold indicator(1=lower,2=upper,3=both) ',I2)
+ 9504 FORMAT(' Lower threshold value ',I9)
+ 9505 FORMAT(' Upper threshold value ',I9)
+C
+C ECMWF Local definition 6.
+C
+ 9601 FORMAT(' Date of SST field used ',I9)
+ 9602 FORMAT(' Type of SST field (= climatology) ',I9)
+ 9603 FORMAT(' Type of SST field (= 1/1 degree) ',I9)
+ 9604 FORMAT(' Type of SST field (= 2/2 degree) ',I9)
+ 9605 FORMAT(' Number of ICE fields used: ',I9)
+ 9606 FORMAT(' Date of ICE field',I3,' ',I9)
+ 9607 FORMAT(' Satellite number (ICE field',I3,') ',I9)
+C
+C ECMWF Local definition 7.
+C
+ 9700 FORMAT(' Forecast number ',I9)
+ 9701 FORMAT(' Iteration number ',I9)
+ 9702 FORMAT(' Total number of diagnostics ',I9)
+ 9703 FORMAT(' No.interations in diag. minimisation ',I9)
+ 9704 FORMAT(' Domain(0=Global,1=Europe,2=N.Hem.,3=S.Hem.) ',I2)
+ 9705 FORMAT(' Diagnostic number ',I9)
+C
+C ECMWF Local definition 8.
+C
+ 9800 FORMAT(' ERA section 1 octet ',I2,'. ',I9)
+ 9801 FORMAT(' Interval between reference times ',I9)
+C
+C ECMWF Local definition 9.
+C
+ 9943 FORMAT(' Number of iterations ',I9)
+ 9944 FORMAT(' Number of singular vectors computed ',I9)
+ 9945 FORMAT(' Norm used at initial time ',I9)
+ 9946 FORMAT(' Norm used at final time ',I9)
+ 9947 FORMAT(' Multiplication factor ',I9)
+ 9948 FORMAT(' Latitude of north-west corner ',I9)
+ 9949 FORMAT(' Longitude of north-west corner ',I9)
+ 9950 FORMAT(' Latitude of south-east corner ',I9)
+ 9951 FORMAT(' Longitude of south-east corner ',I9)
+ 9952 FORMAT(' Accuracy ',I9)
+ 9953 FORMAT(' Number of singular vectors evolved ',I9)
+ 9954 FORMAT(' Ritz number one ',I9)
+ 9955 FORMAT(' Ritz number two ',I9)
+ 9960 FORMAT(' Perturbed ensemble forecast number ',I9)
+ 9961 FORMAT(' Initial state perturbation number ',I9)
+ 9962 FORMAT(' Singular vector number ',I9)
+C
+C ECMWF Local definition 10.
+C
+ 1001 FORMAT(' Tube number ',I9)
+ 1002 FORMAT(' Total number of tubes ',I9)
+ 1003 FORMAT(' Central cluster definition ',I9)
+ 1004 FORMAT(' Parameter ',I9)
+ 1005 FORMAT(' Type of level ',I9)
+ 1006 FORMAT(' Northern latitude of domain of tubing',I9)
+ 1007 FORMAT(' Western longitude of domain of tubing',I9)
+ 1008 FORMAT(' Southern latitude of domain of tubing',I9)
+ 1009 FORMAT(' Eastern longitude of domain of tubing',I9)
+ 1010 FORMAT(' Tube number of operational forecast ',I9)
+ 1011 FORMAT(' Tube number of control forecast ',I9)
+ 1012 FORMAT(' Height/pressure of level ',I9)
+ 1013 FORMAT(' Reference step ',I9)
+ 1014 FORMAT(' Radius of central cluster ',I9)
+ 1015 FORMAT(' Ensemble standard deviation ',I9)
+ 1016 FORMAT(' Dist.of tube extreme to ensemble mean',I9)
+ 1017 FORMAT(' Number of forecasts in the tube ',I9)
+ 1018 FORMAT(' List of ensemble forecast numbers:')
+ 1019 FORMAT(' ',I9)
+C
+C ECMWF Local definition 11.
+C
+ 1101 FORMAT(' Details of analysis which used the supplementary data:')
+ 1103 FORMAT(' Class ',I9)
+ 1104 FORMAT(' Type ',I9)
+ 1105 FORMAT(' Stream ',I9)
+ 1106 FORMAT(' Version number/experiment identifier: ',A1,A1,A1,A1)
+ 1107 FORMAT(' Year ',I9,' (',I4,')')
+ 1108 FORMAT(' Month ',I9)
+ 1109 FORMAT(' Day ',I9)
+ 1110 FORMAT(' Hour ',I9)
+ 1111 FORMAT(' Minute ',I9)
+ 1112 FORMAT(' Century ',I9)
+ 1113 FORMAT(' Originating centre ',I9)
+ 1114 FORMAT(' Sub-centre ',I9)
+C
+C ECMWF Local definition 12.
+C
+ 1201 FORMAT(' (Mean, average, etc)')
+ 1203 FORMAT(' Start date of the period ', I8)
+ 1204 FORMAT(' Start time of the period ', I4.4)
+ 1205 FORMAT(' Finish date of the period ', I8)
+ 1206 FORMAT(' Finish time of the period ', I4.4)
+ 1207 FORMAT(' Verifying date of the period ', I8)
+ 1208 FORMAT(' Verifying time of the period ', I4.4)
+ 1209 FORMAT(' Code showing method ', I8)
+ 1210 FORMAT(' Number of different time intervals used ', I5)
+ 1211 FORMAT(' List of different time intervals used:')
+ 1212 FORMAT(' - interval ',I5.4, ' used once')
+ 1213 FORMAT(' - interval ',I5.4, ' used twice')
+ 1214 FORMAT(' - interval ',I5.4, ' used ', I5, ' times')
+
+C
+C ECMWF Local definition 13.
+C
+ 1301 FORMAT(' Direction number ',I9)
+ 1302 FORMAT(' Frequency number ',I9)
+ 1303 FORMAT(' Total number of directions ',I9)
+ 1304 FORMAT(' Total number of frequencies ',I9)
+ 1305 FORMAT(' Scale factor applied to directions ',I9)
+ 1306 FORMAT(' Scale factor applied to frequencies ',I9)
+ 1307 FORMAT(' List of directions:')
+ 1308 FORMAT(' ', I2.2,':', F15.7, ' <-- this field value')
+ 1309 FORMAT(' ', I2.2,':', F15.7)
+ 1310 FORMAT(' List of frequencies:')
+ 1311 FORMAT(' System number (65535 = missing) ',I9)
+ 1312 FORMAT(' Method number (65535 = missing) ',I9)
+ 1313 FORMAT(' Reference date ',I9)
+ 1314 FORMAT(' Climate date (from) ',I9)
+ 1315 FORMAT(' Climate date (to) ',I9)
+ 1316 FORMAT(' Leg base Date ',I9)
+ 1317 FORMAT(' Leg base Time ',I9)
+ 1318 FORMAT(' Leg base Number ',I9)
+ 1319 FORMAT(' Ocean Atmosphere Coupling flag ',I9)
+C
+C ECMWF Local definition 14.
+C
+ 1401 FORMAT(' Channel number ',I9)
+ 1402 FORMAT(' Scale factor applied to frequencies ',I9)
+ 1403 FORMAT(' Total number of frequencies ',I9)
+ 1404 FORMAT(' List of frequencies:')
+ 1405 FORMAT(' ', I3,':', F15.9, ' <-- this channel')
+ 1406 FORMAT(' ', I3,':', F15.9)
+C
+C ECMWF Local definition 15.
+C
+ 1501 FORMAT(' Ensemble member number ',I9)
+ 1502 FORMAT(' System number ',I9)
+ 1503 FORMAT(' Method number ',I9)
+ 1504 FORMAT(' Total number of ensembles ',I9)
+C
+C ECMWF Local definition 16.
+C
+ 1601 FORMAT(' Verifying month ',I9)
+ 1602 FORMAT(' Averaging period ',I9)
+ 1603 FORMAT(' Forecast month (0 = not present) ',I9)
+C
+C ECMWF Local definition 17.
+C
+ 1701 FORMAT(' Date of sst/ice field used ',I9)
+ 1702 FORMAT(' Type of sst/ice field (= climatology)',I9)
+ 1703 FORMAT(' Type of sst/ice field (= 1/1 degree) ',I9)
+ 1704 FORMAT(' Type of sst/ice field (= 2/2 degree) ',I9)
+ 1705 FORMAT(' Number of ICE fields used: ',I9)
+ 1706 FORMAT(' Date of ICE field',I3,' ',I9)
+ 1707 FORMAT(' Satellite number (ICE field',I3,') ',I9)
+C
+C ECMWF Local definition 18.
+C
+ 1801 FORMAT(' Ensemble forecast number ',I9)
+ 1802 FORMAT(' Number of forecasts in ensemble ',I9)
+ 1803 FORMAT(' Data origin ',I9)
+ 1804 FORMAT(' Model identifier of forecast used ',A1,A1,A1,A1)
+ 1805 FORMAT(' Number of analyses in start analysis ',I9)
+ 1806 FORMAT(' ',A1,A1,A1,A1)
+C
+C ECMWF Local definition 19.
+C
+ 1901 FORMAT(' Zero, for Mars compatibility ',I9)
+ 1902 FORMAT(' Ensemble size ',I9)
+ 1903 FORMAT(' Power of 10 used to scale weight (F) ',I9)
+ 1904 FORMAT(' Weight*10**F applied to climate month 1',I7)
+ 1905 FORMAT(' First month used for climate month 1 ',I9)
+ 1906 FORMAT(' Last month used for climate month 1 ',I9)
+ 1907 FORMAT(' First month used for climate month 2 ',I9)
+ 1908 FORMAT(' Last month used for climate month 2 ',I9)
+ 1909 FORMAT(' EFI order ',I9)
+C
+C ECMWF Local definition 20.
+C
+ 2001 FORMAT(' Iteration ',I9)
+ 2002 FORMAT(' Total number of iterations ',I9)
+C
+C ECMWF Local definition 21.
+C
+ 2101 FORMAT(' Forecast/sing.vector/flight number ',I9)
+ 2102 FORMAT(' Number of iterations ',I9)
+ 2103 FORMAT(' Number of singular vectors computed ',I9)
+ 2104 FORMAT(' Norm used at initial time ',I9)
+ 2105 FORMAT(' Norm used at final time ',I9)
+ 2106 FORMAT(' Lat-lon multiplication factor ',I9)
+ 2107 FORMAT(' Area north-west latitude ',I9)
+ 2108 FORMAT(' Area north-west longitude ',I9)
+ 2109 FORMAT(' Area south-east latitude ',I9)
+ 2110 FORMAT(' Area south-east longitude ',I9)
+ 2111 FORMAT(' Accuracy ',I9)
+ 2112 FORMAT(' Number of singular vectors evolved ',I9)
+ 2113 FORMAT(' Ritz number 1 ',I9)
+ 2114 FORMAT(' Ritz number 2 ',I9)
+ 2115 FORMAT(' Observation offset period ',I9)
+ 2116 FORMAT(' Forecast lead time ',I9)
+ 2117 FORMAT(' Domain ',A1)
+ 2118 FORMAT(' Method number ',I9)
+ 2119 FORMAT(' Total forecasts in ensemble ',I9)
+ 2120 FORMAT(' Shape of verification region (flag) ',I9)
+C
+C ECMWF Local definition 22 and 23.
+C
+ 2201 FORMAT(' Reference date ',I9)
+ 2202 FORMAT(' Climate date (from) ',I9)
+ 2203 FORMAT(' Climate date (to) ',I9)
+C
+C ECMWF Local definition 24
+C
+ 2401 FORMAT(' Satellite identifier (WMO table C-5)',I9)
+ 2402 FORMAT(' Instrument identifier (WMO table C-8)',I9)
+ 2403 FORMAT(' Channel number ',I9)
+ 2404 FORMAT(' Function code ',I9)
+C
+C ECMWF Local definition 25
+C
+ 2501 FORMAT(' Component index ',I9)
+ 2502 FORMAT(' Number of components ',I9)
+ 2503 FORMAT(' Model error type ',I9)
+C
+C ECMWF Local definition 50.
+C
+ 5001 FORMAT(' Number ',I9)
+ 5002 FORMAT(' Total ',I9)
+ 5003 FORMAT(' Model identifier ',I9)
+ 5004 FORMAT(' Latitude of NW corner (degrees*10^6) ',I9)
+ 5005 FORMAT(' Longitude of NW corner(degrees*10^6) ',I9)
+ 5006 FORMAT(' Latitude of SE corner (degrees*10^6) ',I9)
+ 5007 FORMAT(' Longitude of SE corner(degrees*10^6) ',I9)
+ 5008 FORMAT(' Original parameter number ',I9)
+ 5009 FORMAT(' Original parameter table number ',I9)
+ 5010 FORMAT(10(1X,Z8.8))
+C
+C ECMWF Local definition 190.
+C
+19001 FORMAT(' Number of ECMWF local definitions ',I9)
+19002 FORMAT(' ECMWF local definition number ',I9)
+19003 FORMAT(' Number of bytes in local definition ',I9)
+#ifdef INTEGER_8
+19004 FORMAT(3X,Z16.16)
+#else
+19004 FORMAT(3X,Z8.8)
+#endif
+C
+C ECMWF Local definition 191.
+C
+19101 FORMAT(' Format version major number ',I9)
+19102 FORMAT(' Format version minor number ',I9)
+19103 FORMAT(' Original sub-centre identifier ',I9)
+19108 FORMAT(' Number of bytes of data descriptor ',I9)
+#ifdef INTEGER_8
+19109 FORMAT(3X,Z16.16)
+#else
+19109 FORMAT(3X,Z8.8)
+#endif
+C
+ END
diff --git a/gribex/grprs1b.F b/gribex/grprs1b.F
new file mode 100755
index 0000000..6abb71b
--- /dev/null
+++ b/gribex/grprs1b.F
@@ -0,0 +1,1268 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRPRS1B(KSEC1)
+C
+C---->
+C**** GRPRS1B
+C
+C Purpose.
+C --------
+C
+C Print the information in the Product Definition
+C Section (Section 1) of decoded GRIB data.
+C
+C** Interface.
+C ----------
+C
+C CALL GRPRS1B(KSEC1)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KSEC1 - Array of decoded parameters from Section 1.
+C
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C
+C Method.
+C -------
+C
+C Flag fields are printed in binary representation.
+C Other fields as integers.
+C Fields printed depend on GRIB Edition.
+C
+C This is a simplified version of grprs1.F called by grprs1.c
+C to display local definitions stored internally in ECMWF local
+C defienition 190.
+C
+C
+C Externals.
+C ----------
+C
+C PRTBIN - Print binary value in character format.
+C CHKTAB2 - Looks up a parameter in a given ECMWF local table 2.
+C
+C Common block GRPRSCM.
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes re GRIB Code.
+C See also routine GRIBEX.
+C
+C
+C Comments.
+C ---------
+C
+C When decoding data from Experimental Edition or Edition 0,
+C routine GRIBEX adds the additional fields available in
+C Edition 1.
+C
+C Checks environment variable GRPRS_STREAM for output stream number
+C for printing (default is 6)
+C
+C
+C Author.
+C -------
+C J.D.Chambers ECMWF November 2004
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+#include "grbcom.h"
+C
+C Parameter(s)
+C
+ INTEGER JPBYTES
+#ifdef INTEGER_8
+ PARAMETER (JPBYTES = 8)
+#else
+ PARAMETER (JPBYTES = 4)
+#endif
+C
+C Subroutine arguments
+C
+ INTEGER KSEC1(*)
+C
+C Local variables
+C
+ INTEGER IPREV, ICURR, ICOUNT, IOFFSET, IOFF2, IOFF3
+ INTEGER IBIT, IERR, IOUT, IYEAR, NBYTES, LEN
+ INTEGER JLOOP, JILOOP
+ REAL VALUE
+C
+ CHARACTER*8 HVERSION
+ CHARACTER*121 HFIRST, HSECOND, HTHIRD, HFOURTH
+C
+C Externals
+C
+ INTEGER CHKTAB2
+ EXTERNAL CHKTAB2
+C
+C -----------------------------------------------------------------|
+C* Section 1 . Print required information.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IF(KSEC1(37).EQ.1)
+ X WRITE(GRPRSM,*) '(Mars labelling or ensemble forecast)'
+ IF(KSEC1(37).EQ.2)
+ X WRITE(GRPRSM,*) '(Cluster means and standard deviations)'
+ IF(KSEC1(37).EQ.3)
+ X WRITE(GRPRSM,*) '(Satellite image data)'
+ IF(KSEC1(37).EQ.4)
+ X WRITE(GRPRSM,*) '(Ocean model data)'
+ IF(KSEC1(37).EQ.5)
+ X WRITE(GRPRSM,*) '(Forecast probability data)'
+ IF(KSEC1(37).EQ.6)
+ X WRITE(GRPRSM,*) '(Surface temperature data)'
+ IF(KSEC1(37).EQ.7)
+ X WRITE(GRPRSM,*) '(Sensitivity data)'
+ IF(KSEC1(37).EQ.8)
+ X WRITE(GRPRSM,*) '(ECMWF re-analysis data)'
+ IF(KSEC1(37).EQ.9)
+ X WRITE(GRPRSM,*) '(Singular vectors / ensemble perturbations)'
+ IF(KSEC1(37).EQ.10)
+ X WRITE(GRPRSM,*) '(EPS tubes)'
+ IF(KSEC1(37).EQ.11)
+ X WRITE(GRPRSM,*) '(Supplementary data used by analysis)'
+ IF(KSEC1(37).EQ.13)
+ X WRITE(GRPRSM,*) '(Wave 2D spectra direction and frequency)'
+ IF(KSEC1(37).EQ.14)
+ X WRITE(GRPRSM,*) '(Brightness temperature)'
+ IF(KSEC1(37).EQ.15)
+ X WRITE(GRPRSM,*) '(Ocean ensemble seasonal forecast)'
+ IF(KSEC1(37).EQ.16)
+ X WRITE(GRPRSM,*) '(Seasonal fc monthly mean atmosphere data)'
+ IF(KSEC1(37).EQ.17)
+ X WRITE(GRPRSM,*) '(Sst or sea-ice used by analysis)'
+ IF(KSEC1(37).EQ.18)
+ X WRITE(GRPRSM,*) '(Multi-analysis ensemble data)'
+ IF(KSEC1(37).EQ.19)
+ X WRITE(GRPRSM,*) '(Extreme forecast index data)'
+ IF(KSEC1(37).EQ.20)
+ X WRITE(GRPRSM,*) '(4D variational increments)'
+ IF(KSEC1(37).EQ.21)
+ X WRITE(GRPRSM,*) '(Sensitive area predictions)'
+ IF(KSEC1(37).EQ.23)
+ X WRITE(GRPRSM,*)
+ X '(Coupled atmospheric, wave & ocean means (+ hindcast support))'
+ IF(KSEC1(37).EQ.24)
+ X WRITE(GRPRSM,*) '(Satellite image simulation)'
+ IF(KSEC1(37).EQ.25)
+ X WRITE(GRPRSM,*) '(4DVar model errors)'
+ IF(KSEC1(37).EQ.50)
+ X WRITE(GRPRSM,*) '(Member State data)'
+ IF(KSEC1(37).EQ.190)
+ X WRITE(GRPRSM,*) '(Multiple ECMWF local definitions)'
+ IF(KSEC1(37).EQ.191)
+ X WRITE(GRPRSM,*) '(Free format data descriptor)'
+C
+ WRITE(GRPRSM,9302) KSEC1(38)
+ WRITE(GRPRSM,9303) KSEC1(39)
+ WRITE(GRPRSM,9304) KSEC1(40)
+ WRITE(HVERSION, '(A8)' ) KSEC1(41)
+ WRITE(GRPRSM,9305)
+ X HVERSION(5:5),
+ X HVERSION(6:6),
+ X HVERSION(7:7),
+ X HVERSION(8:8)
+C
+C ECMWF Local definition 1.
+C (MARS labelling or ensemble forecast data)
+C
+ IF (KSEC1(37).EQ.1) THEN
+ WRITE(GRPRSM,9310) KSEC1(42)
+ IF( KSEC1(40).NE.1090 ) WRITE(GRPRSM,9311) KSEC1(43)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 2.
+C (Cluster means and standard deviations)
+C
+ IF (KSEC1(37).EQ.2) THEN
+ WRITE(GRPRSM,9312) KSEC1(42)
+ WRITE(GRPRSM,9313) KSEC1(43)
+ WRITE(GRPRSM,9314) KSEC1(44)
+ WRITE(GRPRSM,9315) KSEC1(45)
+ WRITE(GRPRSM,9316) KSEC1(46)
+ WRITE(GRPRSM,9317) KSEC1(47)
+ WRITE(GRPRSM,9318) KSEC1(48)
+ WRITE(GRPRSM,9319) KSEC1(49)
+ WRITE(GRPRSM,9320) KSEC1(50)
+ WRITE(GRPRSM,9321) KSEC1(51)
+ WRITE(GRPRSM,9324) KSEC1(52)
+ WRITE(GRPRSM,9322) KSEC1(53)
+ DO 210 JLOOP = 1,KSEC1(53)
+ WRITE(GRPRSM,9323) KSEC1(JLOOP+53)
+ 210 CONTINUE
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 3.
+C (Satellite image data)
+C
+ IF (KSEC1(37).EQ.3) THEN
+ WRITE(GRPRSM,9306) KSEC1(42)
+ WRITE(GRPRSM,9307) KSEC1(43)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 4.
+C (Ocean model data)
+C
+ IF (KSEC1(37).EQ.4) THEN
+ WRITE(GRPRSM,9310) KSEC1(42)
+ IF( KSEC1(40).NE.1090 ) WRITE(GRPRSM,9311) KSEC1(43)
+ WRITE(GRPRSM,9401) KSEC1(44)
+ WRITE(GRPRSM,9402) KSEC1(45)
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Coordinate structure definition.'
+ WRITE(GRPRSM,*) '--------------------------------'
+ WRITE(GRPRSM,9403) KSEC1(46)
+ WRITE(GRPRSM,9404) KSEC1(47)
+ WRITE(GRPRSM,9405) KSEC1(48)
+ WRITE(GRPRSM,9406) KSEC1(49)
+ WRITE(GRPRSM,9407) KSEC1(50)
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Position definition.'
+ WRITE(GRPRSM,*) '--------------------'
+ WRITE(GRPRSM,9411) KSEC1(51)
+ WRITE(GRPRSM,9412) KSEC1(52)
+ WRITE(GRPRSM,9413) KSEC1(53)
+ WRITE(GRPRSM,9414) KSEC1(54)
+ WRITE(GRPRSM,9415) KSEC1(55)
+ WRITE(GRPRSM,9416) KSEC1(56)
+ WRITE(GRPRSM,9413) KSEC1(57)
+ WRITE(GRPRSM,9414) KSEC1(58)
+ WRITE(GRPRSM,9415) KSEC1(59)
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Grid Definition.'
+ WRITE(GRPRSM,*) '----------------'
+ WRITE(GRPRSM,9421) KSEC1(60)
+ WRITE(GRPRSM,9422) KSEC1(61)
+ WRITE(GRPRSM,9423) KSEC1(62)
+ WRITE(GRPRSM,9424) KSEC1(63)
+ WRITE(GRPRSM,9425) KSEC1(64)
+ WRITE(GRPRSM,9426) KSEC1(65)
+ WRITE(GRPRSM,9427) KSEC1(66)
+ WRITE(GRPRSM,9428) KSEC1(67)
+ WRITE(GRPRSM,9429) KSEC1(68)
+ WRITE(GRPRSM,9430) KSEC1(69)
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Further information.'
+ WRITE(GRPRSM,*) '--------------------'
+ WRITE(GRPRSM,9441) KSEC1(70)
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Auxiliary information.'
+ WRITE(GRPRSM,*) '----------------------'
+ WRITE(GRPRSM,9451) KSEC1(71)
+ WRITE(GRPRSM,9452) KSEC1(72)
+ WRITE(GRPRSM,9453) KSEC1(73)
+ WRITE(GRPRSM,9454) KSEC1(74)
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Horizontal coordinate supplement.'
+ WRITE(GRPRSM,*) '---------------------------------'
+ IF( KSEC1(71).EQ.0 ) THEN
+ WRITE(GRPRSM,*) '(None).'
+ ELSE
+ WRITE(GRPRSM,*) 'Number of items = ', KSEC1(71)
+ DO JLOOP = 1,KSEC1(71)
+ WRITE(GRPRSM,9461) KSEC1(74+JLOOP)
+ ENDDO
+ ENDIF
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Mixed coordinate definition.'
+ WRITE(GRPRSM,*) '----------------------------'
+ IF( KSEC1(72).EQ.0 ) THEN
+ WRITE(GRPRSM,*) '(None).'
+ ELSE
+ WRITE(GRPRSM,*) 'Number of items = ', KSEC1(72)
+ IOFFSET = 74 + KSEC1(71)
+ DO JLOOP = 1,KSEC1(72)
+ WRITE(GRPRSM,9461) KSEC1(IOFFSET+JLOOP)
+ ENDDO
+ ENDIF
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Grid coordinate list.'
+ WRITE(GRPRSM,*) '---------------------'
+ IF( KSEC1(73).EQ.0 ) THEN
+ WRITE(GRPRSM,*) '(None).'
+ ELSE
+ WRITE(GRPRSM,*) 'Number of items = ', KSEC1(73)
+ IOFFSET = 74 + KSEC1(71) + KSEC1(72)
+ DO JLOOP = 1,KSEC1(73)
+ WRITE(GRPRSM,9461) KSEC1(IOFFSET+JLOOP)
+ ENDDO
+ ENDIF
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Auxiliary array.'
+ WRITE(GRPRSM,*) '----------------'
+ IF( KSEC1(74).EQ.0 ) THEN
+ WRITE(GRPRSM,*) '(None).'
+ ELSE
+ WRITE(GRPRSM,*) 'Number of items = ', KSEC1(74)
+ IOFFSET = 74 + KSEC1(71) + KSEC1(72) + KSEC1(73)
+ DO JLOOP = 1,KSEC1(74)
+ WRITE(GRPRSM,9461) KSEC1(IOFFSET+JLOOP)
+ ENDDO
+ ENDIF
+C
+ WRITE(GRPRSM,*) ' '
+ WRITE(GRPRSM,*) 'Post-auxiliary array.'
+ WRITE(GRPRSM,*) '---------------------'
+ IOFFSET = 74 + KSEC1(71) + KSEC1(72) + KSEC1(73) + KSEC1(74)
+ IF( KSEC1(IOFFSET+1).EQ.0 ) THEN
+ WRITE(GRPRSM,*) '(None).'
+ ELSE
+ WRITE(GRPRSM,*) 'Number of items = ', KSEC1(IOFFSET+1)
+ DO JLOOP = 2, 4
+ WRITE(GRPRSM,9461) KSEC1(IOFFSET+JLOOP)
+ ENDDO
+ IF( KSEC1(IOFFSET+1).GT.4 ) THEN
+ WRITE(GRPRSM,9462) KSEC1(IOFFSET+5)
+ IF( KSEC1(IOFFSET+6).NE.0 ) THEN
+ WRITE(GRPRSM,9463) KSEC1(IOFFSET+6)
+ WRITE(GRPRSM,9464) KSEC1(IOFFSET+7)
+ ENDIF
+ ENDIF
+ ENDIF
+C
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 5.
+C (Forecast probability data)
+C
+ IF (KSEC1(37).EQ.5) THEN
+ WRITE(GRPRSM,9500) KSEC1(42)
+ WRITE(GRPRSM,9501) KSEC1(43)
+ WRITE(GRPRSM,9502) KSEC1(44)
+ WRITE(GRPRSM,9503) KSEC1(45)
+ IF ( KSEC1(45) .NE. 2 ) WRITE(GRPRSM,9504) KSEC1(46)
+ IF ( KSEC1(45) .NE. 1 ) WRITE(GRPRSM,9505) KSEC1(47)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 6.
+C (Surface temperature data)
+C
+ IF (KSEC1(37).EQ.6) THEN
+C
+ IYEAR = KSEC1(44)
+ IF( IYEAR.GT.100 ) THEN
+ IF( IYEAR.LT.19000000 ) IYEAR = IYEAR + 19000000
+ WRITE(GRPRSM,9601) IYEAR
+ ELSE
+ WRITE(GRPRSM,*)
+ X 'Date of SST field used Not given'
+ ENDIF
+ IF(KSEC1(45).EQ.0) WRITE(GRPRSM,9602) KSEC1(45)
+ IF(KSEC1(45).EQ.1) WRITE(GRPRSM,9603) KSEC1(45)
+ IF(KSEC1(45).EQ.2) WRITE(GRPRSM,9604) KSEC1(45)
+C
+ WRITE(GRPRSM,9605) KSEC1(46)
+C
+ DO 260 JLOOP = 1, KSEC1(46)
+ IYEAR = KSEC1(45+(JLOOP*2))
+ IF( IYEAR.GT.100 ) THEN
+ IF( IYEAR.LT.19000000 ) IYEAR = IYEAR + 19000000
+ WRITE(GRPRSM,9606) JLOOP, IYEAR
+ WRITE(GRPRSM,9607) JLOOP, KSEC1(46+(JLOOP*2))
+ ELSE
+ WRITE(GRPRSM,*)
+ X 'Date of SST field used Not given'
+ ENDIF
+C
+ 260 CONTINUE
+C
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 7.
+C (Sensitivity data)
+C
+ IF (KSEC1(37).EQ.7) THEN
+ IF ( KSEC1(39) .EQ. 51 ) WRITE(GRPRSM,9700) KSEC1(42)
+ IF ( KSEC1(39) .NE. 51 ) WRITE(GRPRSM,9701) KSEC1(42)
+ IF ( KSEC1(39) .NE. 52 ) WRITE(GRPRSM,9702) KSEC1(43)
+ IF ( KSEC1(39) .EQ. 52 ) WRITE(GRPRSM,9703) KSEC1(43)
+ WRITE(GRPRSM,9704) KSEC1(44)
+ WRITE(GRPRSM,9705) KSEC1(45)
+ GOTO 900
+ ENDIF
+C
+C
+C ECMWF Local definition 8.
+C (ECMWF re-analysis data)
+C
+ IF (KSEC1(37).EQ.8) THEN
+ IF( (KSEC1(40).EQ.1043).OR.
+ X (KSEC1(40).EQ.1070).OR.
+ X (KSEC1(40).EQ.1071) ) THEN
+ WRITE(GRPRSM,9801) KSEC1(42)
+ DO JLOOP = 43, 54
+ JILOOP = JLOOP + 8
+ WRITE(GRPRSM,9800) JILOOP, KSEC1(JLOOP)
+ ENDDO
+ ELSE
+ DO JLOOP = 42, 54
+ JILOOP = JLOOP + 8
+ WRITE(GRPRSM,9800) JILOOP, KSEC1(JLOOP)
+ ENDDO
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+ IF (KSEC1(39).GT.4.AND.KSEC1(39).LT.9) THEN
+ WRITE(GRPRSM,9308) KSEC1(42)
+ WRITE(GRPRSM,9309) KSEC1(43)
+ ENDIF
+C
+C
+C ECMWF Local definition 9.
+C (Singular vectors and ensemble perturbations)
+C
+ IF (KSEC1(37).EQ.9) THEN
+ IF(KSEC1(39).EQ.60)
+ X WRITE(GRPRSM,9960) KSEC1(42)
+ IF(KSEC1(39).EQ.61)
+ X WRITE(GRPRSM,9961) KSEC1(42)
+ IF(KSEC1(39).EQ.62)
+ X WRITE(GRPRSM,9962) KSEC1(42)
+ IF(KSEC1(39).EQ.62) THEN
+ WRITE(GRPRSM,9943) KSEC1(43)
+ WRITE(GRPRSM,9944) KSEC1(44)
+ WRITE(GRPRSM,9945) KSEC1(45)
+ WRITE(GRPRSM,9946) KSEC1(46)
+ WRITE(GRPRSM,9947) KSEC1(47)
+ WRITE(GRPRSM,9948) KSEC1(48)
+ WRITE(GRPRSM,9949) KSEC1(49)
+ WRITE(GRPRSM,9950) KSEC1(50)
+ WRITE(GRPRSM,9951) KSEC1(51)
+ WRITE(GRPRSM,9952) KSEC1(52)
+ WRITE(GRPRSM,9953) KSEC1(53)
+ WRITE(GRPRSM,9954) KSEC1(54)
+ WRITE(GRPRSM,9955) KSEC1(55)
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C
+C ECMWF Local definition 10.
+C (EPS tubes)
+C
+ IF (KSEC1(37).EQ.10) THEN
+ WRITE(GRPRSM,1001) KSEC1(42)
+ WRITE(GRPRSM,1002) KSEC1(43)
+ WRITE(GRPRSM,1003) KSEC1(44)
+ WRITE(GRPRSM,1004) KSEC1(45)
+ WRITE(GRPRSM,1005) KSEC1(46)
+ WRITE(GRPRSM,1006) KSEC1(47)
+ WRITE(GRPRSM,1007) KSEC1(48)
+ WRITE(GRPRSM,1008) KSEC1(49)
+ WRITE(GRPRSM,1009) KSEC1(50)
+ WRITE(GRPRSM,1010) KSEC1(51)
+ WRITE(GRPRSM,1011) KSEC1(52)
+ WRITE(GRPRSM,1012) KSEC1(53)
+ WRITE(GRPRSM,1013) KSEC1(54)
+ WRITE(GRPRSM,1014) KSEC1(55)
+ WRITE(GRPRSM,1015) KSEC1(56)
+ WRITE(GRPRSM,1016) KSEC1(57)
+ WRITE(GRPRSM,1017) KSEC1(58)
+C
+ WRITE(GRPRSM,1018)
+ DO 280 JLOOP = 1, KSEC1(58)
+ WRITE(GRPRSM,1019) KSEC1(58+JLOOP)
+ 280 CONTINUE
+ GOTO 900
+ ENDIF
+C
+C
+C ECMWF Local definition 11.
+C (Supplementary data used by the analysis)
+C
+ IF (KSEC1(37).EQ.11) THEN
+ WRITE(GRPRSM,1101)
+ WRITE(GRPRSM,1103) KSEC1(42)
+ WRITE(GRPRSM,1104) KSEC1(43)
+ WRITE(GRPRSM,1105) KSEC1(44)
+ WRITE(HVERSION, '(A8)' ) KSEC1(45)
+ WRITE(GRPRSM,1106)
+#ifdef LITTLE_ENDIAN
+ X HVERSION(8:8),
+ X HVERSION(7:7),
+ X HVERSION(6:6),
+ X HVERSION(5:5)
+#else
+ X HVERSION(5:5),
+ X HVERSION(6:6),
+ X HVERSION(7:7),
+ X HVERSION(8:8)
+#endif
+ IYEAR = KSEC1(46)
+ IF( IYEAR.GT.40 ) THEN
+ IYEAR = IYEAR + 1900
+ ELSE
+ IYEAR = IYEAR + 2000
+ ENDIF
+ WRITE(GRPRSM,1107) KSEC1(46), IYEAR
+ WRITE(GRPRSM,1108) KSEC1(47)
+ WRITE(GRPRSM,1109) KSEC1(48)
+ WRITE(GRPRSM,1110) KSEC1(49)
+ WRITE(GRPRSM,1111) KSEC1(50)
+ WRITE(GRPRSM,1112) KSEC1(51)
+ WRITE(GRPRSM,1113) KSEC1(52)
+ WRITE(GRPRSM,1114) KSEC1(53)
+ GOTO 900
+ ENDIF
+C
+C
+C ECMWF Local definition 12.
+C
+ IF (KSEC1(37).EQ.12) THEN
+ WRITE(GRPRSM,1201)
+ WRITE(GRPRSM,1203) KSEC1(42)
+ WRITE(GRPRSM,1204) KSEC1(43)
+ WRITE(GRPRSM,1205) KSEC1(44)
+ WRITE(GRPRSM,1206) KSEC1(45)
+ WRITE(GRPRSM,1207) KSEC1(46)
+ WRITE(GRPRSM,1208) KSEC1(47)
+ WRITE(GRPRSM,1209) KSEC1(48)
+ WRITE(GRPRSM,1210) KSEC1(49)
+ WRITE(GRPRSM,1211)
+ IPREV = KSEC1(50)
+ ICURR = 0
+ ICOUNT = 0
+ DO JLOOP = 1, KSEC1(49)
+ ICURR = KSEC1(49+JLOOP)
+ IF( ICURR.NE.IPREV ) THEN
+ IF( ICOUNT.EQ.1 ) WRITE(GRPRSM,1212) IPREV
+ IF( ICOUNT.EQ.2 ) WRITE(GRPRSM,1213) IPREV
+ IF( ICOUNT.GT.2 ) WRITE(GRPRSM,1214) IPREV, ICOUNT
+ IPREV = ICURR
+ ICOUNT = 1
+ ELSE
+ ICOUNT = ICOUNT + 1
+ ENDIF
+ ENDDO
+ IF( ICOUNT.EQ.1 ) WRITE(GRPRSM,1212) IPREV
+ IF( ICOUNT.EQ.2 ) WRITE(GRPRSM,1213) IPREV
+ IF( ICOUNT.GT.2 ) WRITE(GRPRSM,1214) IPREV, ICOUNT
+ GOTO 900
+ ENDIF
+C
+C
+C ECMWF Local definition 13.
+C (Wave 2D spectra direction and frequency)
+C
+ IF (KSEC1(37).EQ.13) THEN
+ WRITE(GRPRSM,1301) KSEC1(44)
+ WRITE(GRPRSM,1302) KSEC1(45)
+ WRITE(GRPRSM,1303) KSEC1(46)
+ WRITE(GRPRSM,1304) KSEC1(47)
+ WRITE(GRPRSM,1305) KSEC1(48)
+ WRITE(GRPRSM,1306) KSEC1(49)
+ WRITE(GRPRSM,1307)
+ DO 290 JLOOP = 1, KSEC1(46)
+ VALUE = REAL(KSEC1(49+JLOOP))/REAL(KSEC1(48))
+ IF( KSEC1(44).EQ.JLOOP ) THEN
+ WRITE(GRPRSM,1308) JLOOP, VALUE
+ ELSE
+ WRITE(GRPRSM,1309) JLOOP, VALUE
+ ENDIF
+ 290 CONTINUE
+ WRITE(GRPRSM,1310)
+ DO 295 JLOOP = 1, KSEC1(47)
+ VALUE = REAL(KSEC1(49+KSEC1(46)+JLOOP))/REAL(KSEC1(49))
+ IF( KSEC1(45).EQ.JLOOP ) THEN
+ WRITE(GRPRSM,1308) JLOOP, VALUE
+ ELSE
+ WRITE(GRPRSM,1309) JLOOP, VALUE
+ ENDIF
+ 295 CONTINUE
+C
+ IF( N13FLAG.GT.0 ) THEN
+ WRITE(GRPRSM,1311) KSEC1(50+KSEC1(46)+KSEC1(47))
+ WRITE(GRPRSM,1312) KSEC1(51+KSEC1(46)+KSEC1(47))
+ IF( N13FLAG.GT.1 ) THEN
+ WRITE(GRPRSM,1313) KSEC1(52+KSEC1(46)+KSEC1(47))
+ WRITE(GRPRSM,1314) KSEC1(53+KSEC1(46)+KSEC1(47))
+ WRITE(GRPRSM,1315) KSEC1(54+KSEC1(46)+KSEC1(47))
+ ENDIF
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 14.
+C (Brightness temperature)
+C
+ IF (KSEC1(37).EQ.14) THEN
+ WRITE(GRPRSM,1401) KSEC1(44)
+ WRITE(GRPRSM,1402) KSEC1(45)
+ WRITE(GRPRSM,1403) KSEC1(46)
+ WRITE(GRPRSM,1404)
+ DO 296 JLOOP = 1, KSEC1(46)
+ VALUE = REAL(KSEC1(46+JLOOP))/REAL(KSEC1(45))
+ IF( KSEC1(44).EQ.JLOOP ) THEN
+ WRITE(GRPRSM,1405) JLOOP, VALUE
+ ELSE
+ WRITE(GRPRSM,1406) JLOOP, VALUE
+ ENDIF
+ 296 CONTINUE
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 15.
+C (Ocean ensemble seasonal forecast)
+C
+ IF (KSEC1(37).EQ.15) THEN
+ WRITE(GRPRSM,1501) KSEC1(42)
+ WRITE(GRPRSM,1504) KSEC1(43)
+ WRITE(GRPRSM,1502) KSEC1(44)
+ WRITE(GRPRSM,1503) KSEC1(45)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 16.
+C (Seasonal forecast monthly mean atmosphere data)
+C
+ IF (KSEC1(37).EQ.16) THEN
+ WRITE(GRPRSM,1501) KSEC1(42)
+ WRITE(GRPRSM,1502) KSEC1(44)
+ WRITE(GRPRSM,1503) KSEC1(45)
+ WRITE(GRPRSM,1601) KSEC1(46)
+ WRITE(GRPRSM,1602) KSEC1(47)
+ WRITE(GRPRSM,1603) KSEC1(48)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 17.
+C (Sst or sea-ice used by analysis)
+C
+ IF (KSEC1(37).EQ.17) THEN
+C
+ IYEAR = KSEC1(44)
+ IF( IYEAR.GT.100 ) THEN
+ IF( IYEAR.LT.19000000 ) IYEAR = IYEAR + 19000000
+ WRITE(GRPRSM,1701) IYEAR
+ ELSE
+ WRITE(GRPRSM,*)
+ X 'Date of sst/ice field used Not given'
+ ENDIF
+ IF(KSEC1(45).EQ.0) WRITE(GRPRSM,1702) KSEC1(45)
+ IF(KSEC1(45).EQ.1) WRITE(GRPRSM,1703) KSEC1(45)
+ IF(KSEC1(45).EQ.2) WRITE(GRPRSM,1704) KSEC1(45)
+C
+ WRITE(GRPRSM,1705) KSEC1(46)
+C
+ DO JLOOP = 1, KSEC1(46)
+ IYEAR = KSEC1(45+(JLOOP*2))
+ IF( IYEAR.GT.100 ) THEN
+ IF( IYEAR.LT.19000000 ) IYEAR = IYEAR + 19000000
+ WRITE(GRPRSM,1706) JLOOP, IYEAR
+ WRITE(GRPRSM,1707) JLOOP, KSEC1(46+(JLOOP*2))
+ ELSE
+ WRITE(GRPRSM,*)
+ X 'Date of sst/ice field used Not given'
+ ENDIF
+C
+ ENDDO
+ GOTO 900
+C
+ ENDIF
+C
+C ECMWF Local definition 18.
+C (Multi-analysis ensemble data)
+C
+ IF (KSEC1(37).EQ.18) THEN
+ WRITE(GRPRSM,1801) KSEC1(42)
+ WRITE(GRPRSM,1802) KSEC1(43)
+ WRITE(GRPRSM,1803) KSEC1(44)
+ WRITE(HVERSION, '(A8)' ) KSEC1(45)
+ WRITE(GRPRSM,1804)
+#ifdef LITTLE_ENDIAN
+ X HVERSION(8:8),
+ X HVERSION(7:7),
+ X HVERSION(6:6),
+ X HVERSION(5:5)
+#else
+ X HVERSION(5:5),
+ X HVERSION(6:6),
+ X HVERSION(7:7),
+ X HVERSION(8:8)
+#endif
+ WRITE(GRPRSM,1805) KSEC1(46)
+ WRITE(GRPRSM,*) ' WMO centre analyses used:'
+ WRITE(GRPRSM,*) ' ------------------------'
+ DO JLOOP = 1, KSEC1(46)
+ WRITE(HVERSION, '(A8)' ) KSEC1(46+JLOOP)
+ WRITE(GRPRSM,1806)
+#ifdef LITTLE_ENDIAN
+ X HVERSION(8:8),
+ X HVERSION(7:7),
+ X HVERSION(6:6),
+ X HVERSION(5:5)
+#else
+ X HVERSION(5:5),
+ X HVERSION(6:6),
+ X HVERSION(7:7),
+ X HVERSION(8:8)
+#endif
+ ENDDO
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 19.
+C (Extreme forecast index)
+C
+ IF (KSEC1(37).EQ.19) THEN
+ WRITE(GRPRSM,1901) KSEC1(42)
+ WRITE(GRPRSM,1902) KSEC1(43)
+ WRITE(GRPRSM,1903) KSEC1(44)
+ WRITE(GRPRSM,1904) KSEC1(45)
+ WRITE(GRPRSM,1905) KSEC1(46)
+ WRITE(GRPRSM,1906) KSEC1(47)
+ WRITE(GRPRSM,1907) KSEC1(48)
+ WRITE(GRPRSM,1908) KSEC1(49)
+ WRITE(GRPRSM,1909) KSEC1(50)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 20.
+C (4D variational increments)
+C
+ IF (KSEC1(37).EQ.20) THEN
+ WRITE(GRPRSM,2001) KSEC1(42)
+ WRITE(GRPRSM,2002) KSEC1(43)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 21.
+C (Sensitive area predictions)
+C
+ IF (KSEC1(37).EQ.21) THEN
+ WRITE(GRPRSM,2101) KSEC1(42)
+ WRITE(GRPRSM,2102) KSEC1(43)
+ WRITE(GRPRSM,2103) KSEC1(44)
+ WRITE(GRPRSM,2104) KSEC1(45)
+ WRITE(GRPRSM,2105) KSEC1(46)
+ WRITE(GRPRSM,2106) KSEC1(47)
+ WRITE(GRPRSM,2107) KSEC1(48)
+ WRITE(GRPRSM,2108) KSEC1(49)
+ WRITE(GRPRSM,2109) KSEC1(50)
+ WRITE(GRPRSM,2110) KSEC1(51)
+ WRITE(GRPRSM,2111) KSEC1(52)
+ WRITE(GRPRSM,2112) KSEC1(53)
+ WRITE(GRPRSM,2113) KSEC1(54)
+ WRITE(GRPRSM,2114) KSEC1(55)
+ WRITE(GRPRSM,2115) KSEC1(56)
+ WRITE(GRPRSM,2116) KSEC1(57)
+ WRITE(HVERSION, '(A8)' ) KSEC1(58)
+#ifdef LITTLE_ENDIAN
+ WRITE(GRPRSM,2117) HVERSION(5:5)
+#else
+ WRITE(GRPRSM,2117) HVERSION(8:8)
+#endif
+ WRITE(GRPRSM,2118) KSEC1(59)
+ WRITE(GRPRSM,2119) KSEC1(60)
+ WRITE(GRPRSM,2120) KSEC1(61)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 22.
+C (Couple atmospheric, wave and ocean models)
+C
+ IF (KSEC1(37).EQ.22) THEN
+ WRITE(GRPRSM,1501) KSEC1(42)
+ WRITE(GRPRSM,1504) KSEC1(43)
+ WRITE(GRPRSM,1502) KSEC1(44)
+ WRITE(GRPRSM,1503) KSEC1(45)
+ WRITE(GRPRSM,2201) KSEC1(46)
+ WRITE(GRPRSM,2202) KSEC1(47)
+ WRITE(GRPRSM,2203) KSEC1(48)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 23.
+C (Couple atmospheric, wave and ocean means)
+C
+ IF (KSEC1(37).EQ.23) THEN
+ WRITE(GRPRSM,1501) KSEC1(42)
+ WRITE(GRPRSM,1504) KSEC1(43)
+ WRITE(GRPRSM,1502) KSEC1(44)
+ WRITE(GRPRSM,1503) KSEC1(45)
+ WRITE(GRPRSM,1601) KSEC1(46)
+ WRITE(GRPRSM,1602) KSEC1(47)
+ WRITE(GRPRSM,1603) KSEC1(48)
+ WRITE(GRPRSM,2201) KSEC1(49)
+ WRITE(GRPRSM,2202) KSEC1(50)
+ WRITE(GRPRSM,2203) KSEC1(51)
+ WRITE(GRPRSM,9502) KSEC1(52)
+ WRITE(GRPRSM,9503) KSEC1(53)
+ IF ( KSEC1(53) .NE. 2 ) WRITE(GRPRSM,9504) KSEC1(54)
+ IF ( KSEC1(53) .NE. 1 ) WRITE(GRPRSM,9505) KSEC1(55)
+C
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 24.
+C (Couple atmospheric, wave and ocean means)
+C
+ IF (KSEC1(37).EQ.24) THEN
+ WRITE(GRPRSM,2401) KSEC1(42)
+ WRITE(GRPRSM,2402) KSEC1(43)
+ WRITE(GRPRSM,2403) KSEC1(44)
+ WRITE(GRPRSM,2404) KSEC1(45)
+ GOTO 900
+C
+C ECMWF Local definition 25.
+C (Couple atmospheric, wave and ocean means)
+C
+ IF (KSEC1(37).EQ.25) THEN
+ WRITE(GRPRSM,2501) KSEC1(42)
+ WRITE(GRPRSM,2502) KSEC1(43)
+ WRITE(GRPRSM,2503) KSEC1(44)
+ ENDIF
+C
+ ENDIF
+C
+C ECMWF Local definition 50.
+C (Member State data)
+C
+ IF (KSEC1(37).EQ.50) THEN
+ WRITE(GRPRSM,5001) KSEC1(42)
+ WRITE(GRPRSM,5002) KSEC1(43)
+ WRITE(GRPRSM,5003) KSEC1(44)
+ WRITE(GRPRSM,5004) KSEC1(45)
+ WRITE(GRPRSM,5005) KSEC1(46)
+ WRITE(GRPRSM,5006) KSEC1(47)
+ WRITE(GRPRSM,5007) KSEC1(48)
+ WRITE(GRPRSM,*) ' ECMWF additions'
+ WRITE(GRPRSM,*) ' ---------------'
+ WRITE(GRPRSM,5008) KSEC1(49)
+ WRITE(GRPRSM,5009) KSEC1(50)
+ WRITE(GRPRSM,5010) (KSEC1(JLOOP),JLOOP=51,60)
+ WRITE(GRPRSM,*) ' Optional data'
+ WRITE(GRPRSM,*) ' -------------'
+ WRITE(GRPRSM,5010) (KSEC1(JLOOP),JLOOP=61,106)
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition 191.
+C (Free format data descriptor)
+C
+ IF (KSEC1(37).EQ.191) THEN
+ WRITE(GRPRSM,19101) KSEC1(44)
+ WRITE(GRPRSM,19102) KSEC1(45)
+ WRITE(GRPRSM,19103) KSEC1(46)
+ WRITE(GRPRSM,19108) KSEC1(51)
+ WRITE(GRPRSM,*) ' Data descriptor bytes'
+ WRITE(GRPRSM,*) ' ---------------------'
+ DO JLOOP = 52, (51+(KSEC1(51)+JPBYTES-1)/JPBYTES)
+ WRITE(GRPRSM,19109) KSEC1(JLOOP)
+ ENDDO
+ GOTO 900
+ ENDIF
+C
+C ECMWF Local definition not in above selection
+C (eg defined using templates)
+C
+Cjdc CALL LDEFPRT(GRPRSM,KSEC1)
+C
+C -----------------------------------------------------------------|
+C* Section 9 . Format statements. Return to calling routine.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ 9000 FORMAT(' ')
+ 9001 FORMAT(' Section 1 - Product Definition Section.')
+ 9002 FORMAT(' ---------------------------------------')
+ 9100 FORMAT(' Code Table 2 Version Number. ',I9)
+ 9101 FORMAT(' Originating centre identifier. ',I9)
+ 9102 FORMAT(' Model identification. ',I9)
+ 9103 FORMAT(' Grid definition. ',I9)
+ 9104 FORMAT(' Flag (Code Table 1) ',I8.8)
+ 9105 FORMAT(' Parameter identifier (Code Table 2). ',I9)
+ 9106 FORMAT(' Type of level (Code Table 3). ',I9)
+ 9107 FORMAT(' Value 1 of level (Code Table 3). ',I9)
+ 9108 FORMAT(' Value 2 of level (Code Table 3). ',I9)
+ 9109 FORMAT(' Year of reference time of data. ',I9,' (',I4,')' )
+ 9110 FORMAT(' Month of reference time of data. ',I9)
+ 9111 FORMAT(' Day of reference time of data. ',I9)
+ 9112 FORMAT(' Hour of reference time of data. ',I9)
+ 9113 FORMAT(' Minute of reference time of data. ',I9)
+ 9114 FORMAT(' Time unit (Code Table 4). ',I9)
+ 9115 FORMAT(' Time range one. ',I9)
+ 9116 FORMAT(' Time range two. ',I9)
+ 9117 FORMAT(' Time range indicator (Code Table 5) ',I9)
+ 9118 FORMAT(' Number averaged. ',I9)
+ 9119 FORMAT(' Number missing from average. ',I9)
+ 9120 FORMAT(' Century of reference time of data. ',I9)
+ 9121 FORMAT(' Units decimal scaling factor. ',I9)
+ 9122 FORMAT(' Century of reference time of data. Not given')
+ 9123 FORMAT(' Sub-centre identifier. ',I9)
+ 9206 FORMAT(' Satellite identifier. ',I9)
+ 9207 FORMAT(' Spectral band. ',I9)
+C
+ 9301 FORMAT(' ECMWF local usage identifier. ',I9)
+ 9302 FORMAT(' Class. ',I9)
+ 9303 FORMAT(' Type. ',I9)
+ 9304 FORMAT(' Stream. ',I9)
+ 9305 FORMAT(' Version number or Experiment identifier. ',A1,A1,A1,A1)
+ 9306 FORMAT(' Satellite spectral band. ',I9)
+ 9307 FORMAT(' Function code. ',I9)
+ 9308 FORMAT(' Simulation number. ',I9)
+ 9309 FORMAT(' Total number of simulations. ',I9)
+ 9310 FORMAT(' Forecast number. ',I9)
+ 9311 FORMAT(' Total number of forecasts. ',I9)
+ 9312 FORMAT(' Cluster number. ',I9)
+ 9313 FORMAT(' Total number of clusters. ',I9)
+ 9314 FORMAT(' Clustering method. ',I9)
+ 9315 FORMAT(' Start time step when clustering. ',I9)
+ 9316 FORMAT(' End time step when clustering. ',I9)
+ 9317 FORMAT(' Northern latitude of domain. ',I9)
+ 9318 FORMAT(' Western longitude of domain. ',I9)
+ 9319 FORMAT(' Southern latitude of domain. ',I9)
+ 9320 FORMAT(' Eastern longitude of domain. ',I9)
+ 9321 FORMAT(' Operational forecast in cluster ',I9)
+ 9322 FORMAT(' Number of forecasts in cluster. ',I9)
+ 9323 FORMAT(' Forecast number ',I9)
+ 9324 FORMAT(' Control forecast in cluster ',I9)
+C
+C ECMWF Local definition 4.
+C
+ 9401 FORMAT(' System number. ',I9)
+ 9402 FORMAT(' Method number. ',I9)
+ 9403 FORMAT(' Space unit flag. ',I9)
+ 9404 FORMAT(' Vertical coordinate definition. ',I9)
+ 9405 FORMAT(' Horizontal coordinate definition. ',I9)
+ 9406 FORMAT(' Time unit flag. ',I9)
+ 9407 FORMAT(' Time coordinate definition. ',I9)
+ 9408 FORMAT(' Method used for analysis or forecast.',I9)
+C
+ 9411 FORMAT(' Mixed coordinate field flag. ',I9)
+ 9412 FORMAT(' Coordinate 1 flag. ',I9)
+ 9413 FORMAT(' Averaging flag. ',I9)
+ 9414 FORMAT(' Position of level 1. ',I9)
+ 9415 FORMAT(' Position of level 2. ',I9)
+ 9416 FORMAT(' Coordinate 2 flag. ',I9)
+C
+ 9421 FORMAT(' Coordinate 3 flag (x-axis) ',I9)
+ 9422 FORMAT(' Coordinate 4 flag (y-axis) ',I9)
+ 9423 FORMAT(' Coordinate 4 of first grid point. ',I10)
+ 9424 FORMAT(' Coordinate 3 of first grid point. ',I10)
+ 9425 FORMAT(' Coordinate 4 of last grid point. ',I10)
+ 9426 FORMAT(' Coordinate 3 of last grid point. ',I10)
+ 9427 FORMAT(' i - increment. ',I9)
+ 9428 FORMAT(' j - increment. ',I9)
+ 9429 FORMAT(' Flag for irregular grid coordinates. ',I9)
+ 9430 FORMAT(' Flag for normal or staggered grids. ',I9)
+C
+ 9441 FORMAT(' Further information flag. ',I9)
+C
+ 9451 FORMAT(' No. entries in horizontal coordinate ',I9)
+ 9452 FORMAT(' No. entries in mixed coordinate defn.',I9)
+ 9453 FORMAT(' No. entries in grid coordinate list. ',I9)
+ 9454 FORMAT(' No. entries in auxiliary array. ',I9)
+C
+ 9461 FORMAT(' ',I12)
+ 9462 FORMAT(' Reference date ',I9)
+ 9463 FORMAT(' Climate date - from ',I9)
+ 9464 FORMAT(' Climate date - to ',I9)
+C
+C ECMWF Local definition 5.
+C
+ 9500 FORMAT(' Forecast probability number ',I9)
+ 9501 FORMAT(' Total number of forecast probabilities ',I7)
+ 9502 FORMAT(' Threshold units decimal scale factor ',I9)
+ 9503 FORMAT(' Threshold indicator(1=lower,2=upper,3=both) ',I2)
+ 9504 FORMAT(' Lower threshold value ',I9)
+ 9505 FORMAT(' Upper threshold value ',I9)
+C
+C ECMWF Local definition 6.
+C
+ 9601 FORMAT(' Date of SST field used ',I9)
+ 9602 FORMAT(' Type of SST field (= climatology) ',I9)
+ 9603 FORMAT(' Type of SST field (= 1/1 degree) ',I9)
+ 9604 FORMAT(' Type of SST field (= 2/2 degree) ',I9)
+ 9605 FORMAT(' Number of ICE fields used: ',I9)
+ 9606 FORMAT(' Date of ICE field',I3,' ',I9)
+ 9607 FORMAT(' Satellite number (ICE field',I3,') ',I9)
+C
+C ECMWF Local definition 7.
+C
+ 9700 FORMAT(' Forecast number ',I9)
+ 9701 FORMAT(' Iteration number ',I9)
+ 9702 FORMAT(' Total number of diagnostics ',I9)
+ 9703 FORMAT(' No.interations in diag. minimisation ',I9)
+ 9704 FORMAT(' Domain(0=Global,1=Europe,2=N.Hem.,3=S.Hem.) ',I2)
+ 9705 FORMAT(' Diagnostic number ',I9)
+C
+C ECMWF Local definition 8.
+C
+ 9800 FORMAT(' ERA section 1 octet ',I2,'. ',I9)
+ 9801 FORMAT(' Interval between reference times ',I9)
+C
+C ECMWF Local definition 9.
+C
+ 9943 FORMAT(' Number of iterations ',I9)
+ 9944 FORMAT(' Number of singular vectors computed ',I9)
+ 9945 FORMAT(' Norm used at initial time ',I9)
+ 9946 FORMAT(' Norm used at final time ',I9)
+ 9947 FORMAT(' Multiplication factor ',I9)
+ 9948 FORMAT(' Latitude of north-west corner ',I9)
+ 9949 FORMAT(' Longitude of north-west corner ',I9)
+ 9950 FORMAT(' Latitude of south-east corner ',I9)
+ 9951 FORMAT(' Longitude of south-east corner ',I9)
+ 9952 FORMAT(' Accuracy ',I9)
+ 9953 FORMAT(' Number of singular vectors evolved ',I9)
+ 9954 FORMAT(' Ritz number one ',I9)
+ 9955 FORMAT(' Ritz number two ',I9)
+ 9960 FORMAT(' Perturbed ensemble forecast number ',I9)
+ 9961 FORMAT(' Initial state perturbation number ',I9)
+ 9962 FORMAT(' Singular vector number ',I9)
+C
+C ECMWF Local definition 10.
+C
+ 1001 FORMAT(' Tube number ',I9)
+ 1002 FORMAT(' Total number of tubes ',I9)
+ 1003 FORMAT(' Central cluster definition ',I9)
+ 1004 FORMAT(' Parameter ',I9)
+ 1005 FORMAT(' Type of level ',I9)
+ 1006 FORMAT(' Northern latitude of domain of tubing',I9)
+ 1007 FORMAT(' Western longitude of domain of tubing',I9)
+ 1008 FORMAT(' Southern latitude of domain of tubing',I9)
+ 1009 FORMAT(' Eastern longitude of domain of tubing',I9)
+ 1010 FORMAT(' Tube number of operational forecast ',I9)
+ 1011 FORMAT(' Tube number of control forecast ',I9)
+ 1012 FORMAT(' Height/pressure of level ',I9)
+ 1013 FORMAT(' Reference step ',I9)
+ 1014 FORMAT(' Radius of central cluster ',I9)
+ 1015 FORMAT(' Ensemble standard deviation ',I9)
+ 1016 FORMAT(' Dist.of tube extreme to ensemble mean',I9)
+ 1017 FORMAT(' Number of forecasts in the tube ',I9)
+ 1018 FORMAT(' List of ensemble forecast numbers:')
+ 1019 FORMAT(' ',I9)
+C
+C ECMWF Local definition 11.
+C
+ 1101 FORMAT(' Details of analysis which used the supplementary data:')
+ 1103 FORMAT(' Class ',I9)
+ 1104 FORMAT(' Type ',I9)
+ 1105 FORMAT(' Stream ',I9)
+ 1106 FORMAT(' Version number/experiment identifier: ',A1,A1,A1,A1)
+ 1107 FORMAT(' Year ',I9,' (',I4,')')
+ 1108 FORMAT(' Month ',I9)
+ 1109 FORMAT(' Day ',I9)
+ 1110 FORMAT(' Hour ',I9)
+ 1111 FORMAT(' Minute ',I9)
+ 1112 FORMAT(' Century ',I9)
+ 1113 FORMAT(' Originating centre ',I9)
+ 1114 FORMAT(' Sub-centre ',I9)
+C
+C ECMWF Local definition 12.
+C
+ 1201 FORMAT(' (Mean, average, etc)')
+ 1203 FORMAT(' Start date of the period ', I8)
+ 1204 FORMAT(' Start time of the period ', I4.4)
+ 1205 FORMAT(' Finish date of the period ', I8)
+ 1206 FORMAT(' Finish time of the period ', I4.4)
+ 1207 FORMAT(' Verifying date of the period ', I8)
+ 1208 FORMAT(' Verifying time of the period ', I4.4)
+ 1209 FORMAT(' Code showing method ', I8)
+ 1210 FORMAT(' Number of different time intervals used ', I5)
+ 1211 FORMAT(' List of different time intervals used:')
+ 1212 FORMAT(' - interval ',I5.4, ' used once')
+ 1213 FORMAT(' - interval ',I5.4, ' used twice')
+ 1214 FORMAT(' - interval ',I5.4, ' used ', I5, ' times')
+
+C
+C ECMWF Local definition 13.
+C
+ 1301 FORMAT(' Direction number ',I9)
+ 1302 FORMAT(' Frequency number ',I9)
+ 1303 FORMAT(' Total number of directions ',I9)
+ 1304 FORMAT(' Total number of frequencies ',I9)
+ 1305 FORMAT(' Scale factor applied to directions ',I9)
+ 1306 FORMAT(' Scale factor applied to frequencies ',I9)
+ 1307 FORMAT(' List of directions:')
+ 1308 FORMAT(' ', I2.2,':', F15.7, ' <-- this field value')
+ 1309 FORMAT(' ', I2.2,':', F15.7)
+ 1310 FORMAT(' List of frequencies:')
+ 1311 FORMAT(' System number (65535 = missing) ',I9)
+ 1312 FORMAT(' Method number (65535 = missing) ',I9)
+ 1313 FORMAT(' Reference date ',I9)
+ 1314 FORMAT(' Climate date (from) ',I9)
+ 1315 FORMAT(' Climate date (to) ',I9)
+C
+C ECMWF Local definition 14.
+C
+ 1401 FORMAT(' Channel number ',I9)
+ 1402 FORMAT(' Scale factor applied to frequencies ',I9)
+ 1403 FORMAT(' Total number of frequencies ',I9)
+ 1404 FORMAT(' List of frequencies:')
+ 1405 FORMAT(' ', I3,':', F15.9, ' <-- this channel')
+ 1406 FORMAT(' ', I3,':', F15.9)
+C
+C ECMWF Local definition 15.
+C
+ 1501 FORMAT(' Ensemble member number ',I9)
+ 1502 FORMAT(' System number ',I9)
+ 1503 FORMAT(' Method number ',I9)
+ 1504 FORMAT(' Total number of ensembles ',I9)
+C
+C ECMWF Local definition 16.
+C
+ 1601 FORMAT(' Verifying month ',I9)
+ 1602 FORMAT(' Averaging period ',I9)
+ 1603 FORMAT(' Forecast month (0 = not present) ',I9)
+C
+C ECMWF Local definition 17.
+C
+ 1701 FORMAT(' Date of sst/ice field used ',I9)
+ 1702 FORMAT(' Type of sst/ice field (= climatology)',I9)
+ 1703 FORMAT(' Type of sst/ice field (= 1/1 degree) ',I9)
+ 1704 FORMAT(' Type of sst/ice field (= 2/2 degree) ',I9)
+ 1705 FORMAT(' Number of ICE fields used: ',I9)
+ 1706 FORMAT(' Date of ICE field',I3,' ',I9)
+ 1707 FORMAT(' Satellite number (ICE field',I3,') ',I9)
+C
+C ECMWF Local definition 18.
+C
+ 1801 FORMAT(' Ensemble forecast number ',I9)
+ 1802 FORMAT(' Number of forecasts in ensemble ',I9)
+ 1803 FORMAT(' Data origin ',I9)
+ 1804 FORMAT(' Model identifier of forecast used ',A1,A1,A1,A1)
+ 1805 FORMAT(' Number of analyses in start analysis ',I9)
+ 1806 FORMAT(' ',A1,A1,A1,A1)
+C
+C ECMWF Local definition 19.
+C
+ 1901 FORMAT(' Zero, for Mars compatibility ',I9)
+ 1902 FORMAT(' Ensemble size ',I9)
+ 1903 FORMAT(' Power of 10 used to scale weight (F) ',I9)
+ 1904 FORMAT(' Weight*10**F applied to climate month 1',I7)
+ 1905 FORMAT(' First month used for climate month 1 ',I9)
+ 1906 FORMAT(' Last month used for climate month 1 ',I9)
+ 1907 FORMAT(' First month used for climate month 2 ',I9)
+ 1908 FORMAT(' Last month used for climate month 2 ',I9)
+ 1909 FORMAT(' EFI order ',I9)
+C
+C ECMWF Local definition 20.
+C
+ 2001 FORMAT(' Iteration ',I9)
+ 2002 FORMAT(' Total number of iterations ',I9)
+C
+C ECMWF Local definition 21.
+C
+ 2101 FORMAT(' Forecast/sing.vector/flight number ',I9)
+ 2102 FORMAT(' Number of iterations ',I9)
+ 2103 FORMAT(' Number of singular vectors computed ',I9)
+ 2104 FORMAT(' Norm used at initial time ',I9)
+ 2105 FORMAT(' Norm used at final time ',I9)
+ 2106 FORMAT(' Lat-lon multiplication factor ',I9)
+ 2107 FORMAT(' Area north-west latitude ',I9)
+ 2108 FORMAT(' Area north-west longitude ',I9)
+ 2109 FORMAT(' Area south-east latitude ',I9)
+ 2110 FORMAT(' Area south-east longitude ',I9)
+ 2111 FORMAT(' Accuracy ',I9)
+ 2112 FORMAT(' Number of singular vectors evolved ',I9)
+ 2113 FORMAT(' Ritz number 1 ',I9)
+ 2114 FORMAT(' Ritz number 2 ',I9)
+ 2115 FORMAT(' Observation offset period ',I9)
+ 2116 FORMAT(' Forecast lead time ',I9)
+ 2117 FORMAT(' Domain ',A1)
+ 2118 FORMAT(' Method number ',I9)
+ 2119 FORMAT(' Total forecasts in ensemble ',I9)
+ 2120 FORMAT(' Shape of verification region (flag) ',I9)
+C
+C ECMWF Local definition 22 and 23.
+C
+ 2201 FORMAT(' Reference date ',I9)
+ 2202 FORMAT(' Climate date (from) ',I9)
+ 2203 FORMAT(' Climate date (to) ',I9)
+C
+C ECMWF Local definition 24
+C
+ 2401 FORMAT(' Satellite identifier (WMO table C-5)',I9)
+ 2402 FORMAT(' Instrument identifier (WMO table C-8)',I9)
+ 2403 FORMAT(' Channel number ',I9)
+ 2404 FORMAT(' Function code ',I9)
+C
+C ECMWF Local definition 25
+C
+ 2501 FORMAT(' Component index ',I9)
+ 2502 FORMAT(' Number of components ',I9)
+ 2503 FORMAT(' Model error type ',I9)
+C
+C ECMWF Local definition 50.
+C
+ 5001 FORMAT(' Number ',I9)
+ 5002 FORMAT(' Total ',I9)
+ 5003 FORMAT(' Model identifier ',I9)
+ 5004 FORMAT(' Latitude of NW corner (degrees*10^6) ',I9)
+ 5005 FORMAT(' Longitude of NW corner(degrees*10^6) ',I9)
+ 5006 FORMAT(' Latitude of SE corner (degrees*10^6) ',I9)
+ 5007 FORMAT(' Longitude of SE corner(degrees*10^6) ',I9)
+ 5008 FORMAT(' Original parameter number ',I9)
+ 5009 FORMAT(' Original parameter table number ',I9)
+ 5010 FORMAT(10(1X,Z8.8))
+C
+C ECMWF Local definition 190.
+C
+19001 FORMAT(' Number of ECMWF local definitions ',I9)
+19002 FORMAT(' ECMWF local definition number ',I9)
+19003 FORMAT(' Number of bytes in local definition ',I9)
+#ifdef INTEGER_8
+19004 FORMAT(3X,Z16.16)
+#else
+19004 FORMAT(3X,Z8.8)
+#endif
+C
+C ECMWF Local definition 191.
+C
+19101 FORMAT(' Format version major number ',I9)
+19102 FORMAT(' Format version minor number ',I9)
+19103 FORMAT(' Original sub-centre identifier ',I9)
+19108 FORMAT(' Number of bytes of data descriptor ',I9)
+#ifdef INTEGER_8
+19109 FORMAT(3X,Z16.16)
+#else
+19109 FORMAT(3X,Z8.8)
+#endif
+C
+ END
diff --git a/gribex/grprs2.F b/gribex/grprs2.F
new file mode 100755
index 0000000..38abb8e
--- /dev/null
+++ b/gribex/grprs2.F
@@ -0,0 +1,546 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRPRS2 (KSEC0,KSEC2,PSEC2)
+C
+C---->
+C**** GRPRS2 - Print information from Section 2 of GRIB code.
+C
+C Purpose.
+C --------
+C
+C Print the information in the Grid Description
+C Section (Section 2) of decoded GRIB data.
+C
+C** Interface.
+C ----------
+C
+C CALL GRPRS2 (KSEC0,KSEC2,PSEC2)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KSEC0 - Array of decoded integers from Section 0.
+C
+C KSEC2 - Array of decoded integers from Section 2.
+C
+C PSEC2 - Array of decoded reals from Section 2.
+C
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C
+C Method.
+C -------
+C
+C Flag fields are printed in binary representation
+C Other fields as integers or reals, as appropriate.
+C Fields printed depend on GRIB Edition.
+C
+C
+C Externals.
+C ----------
+C
+C PRTBIN - Print binary representation of value.
+C PTQUASI - Print quasi-grid data.
+C
+C Common block GRPRSCM.
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes re GRIB Code.
+C
+C
+C Comments.
+C ---------
+C
+C Only data representation types catered for are Gaussian
+C grid, latitude/longitude grid, Spherical Harmonics,
+C Polar stereographic and Space view perspective.
+C
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18.06.91
+C
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 02.09.91
+C Polar stereographic print added.
+C
+C J. Hennessy ECMWF 25.09.91
+C Space view perspective print added.
+C
+C J.D.Chambers ECMWF 21.02.95
+C Quasi-regular lat/long grids added.
+C
+C J.D.Chambers ECMWF 03.04.95
+C Allow Lambert conformal.
+C
+C J.D.Chambers ECMWF June 2002
+C Add option to set output stream number using environment variable
+C GRPRS_STREAM
+C
+C J.D.Chambers ECMWF July 2004
+C Allow Mercator
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Subroutine arguments
+C
+ INTEGER KSEC0,KSEC2
+ DIMENSION KSEC0(*)
+ DIMENSION KSEC2(*)
+ REAL PSEC2
+ DIMENSION PSEC2(*)
+C
+C Local variables
+C
+ INTEGER I, IBIT, IEDIT, IERR, IOUT, IRESOL
+C
+C
+C -----------------------------------------------------------------|
+C* Section 1 . Print GRIB Edition number.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IEDIT = KSEC0(2)
+ WRITE(GRPRSM,9000)
+ WRITE(GRPRSM,9001)
+ WRITE(GRPRSM,9002)
+C
+C -----------------------------------------------------------------|
+C* Section 2 . Print spherical harmonic data.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF (KSEC2(1).EQ.50 .OR. KSEC2(1).EQ.60 .OR.
+ X KSEC2(1).EQ.70 .OR. KSEC2(1).EQ.80) THEN
+ WRITE(GRPRSM,9111) KSEC2(1)
+ WRITE(GRPRSM,9102) KSEC2(2)
+ WRITE(GRPRSM,9103) KSEC2(3)
+ WRITE(GRPRSM,9104) KSEC2(4)
+ WRITE(GRPRSM,9105) KSEC2(5)
+ WRITE(GRPRSM,9106) KSEC2(6)
+ DO I = 7, 11
+ WRITE(GRPRSM,9107) KSEC2(I)
+ ENDDO
+ WRITE(GRPRSM,9212) KSEC2(12)
+ GO TO 800
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3 . Print Gaussian grid data.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF (KSEC2(1).EQ.4 .OR. KSEC2(1).EQ.14 .OR.
+ X KSEC2(1).EQ.24 .OR. KSEC2(1).EQ.34) THEN
+ WRITE(GRPRSM,9200)
+ WRITE(GRPRSM,9112) KSEC2(1)
+C
+C Quasi-regular grids introduced in Edition 1.
+C
+ IF (KSEC2(17).EQ.0.OR.IEDIT.LT.1) THEN
+ WRITE(GRPRSM,9201) KSEC2(2)
+ ELSE
+ CALL PTQUASI(KSEC2)
+ ENDIF
+ WRITE(GRPRSM,9202) KSEC2(3)
+ WRITE(GRPRSM,9203) KSEC2(4)
+ WRITE(GRPRSM,9204) KSEC2(5)
+ IBIT = 8
+ IRESOL = KSEC2(6) + KSEC2(18) + KSEC2(19)
+ CALL PRTBIN (IRESOL,IBIT,IOUT,IERR)
+ WRITE(GRPRSM,9205) IOUT
+ WRITE(GRPRSM,9206) KSEC2(7)
+ WRITE(GRPRSM,9207) KSEC2(8)
+C
+C Print increment if given.
+C
+ IF (KSEC2(6).EQ.128) THEN
+ WRITE(GRPRSM,9208) KSEC2(9)
+ ELSE
+ WRITE(GRPRSM,9236)
+ ENDIF
+ WRITE(GRPRSM,9210) KSEC2(10)
+ IBIT = 8
+ CALL PRTBIN (KSEC2(11),IBIT,IOUT,IERR)
+ WRITE(GRPRSM,9211) IOUT
+ WRITE(GRPRSM,9212) KSEC2(12)
+ GO TO 800
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4 . Print Latitude / longitude grid data.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ IF (KSEC2(1).EQ.0 .OR. KSEC2(1).EQ.10 .OR.
+ X KSEC2(1).EQ.20 .OR. KSEC2(1).EQ.30) THEN
+ WRITE(GRPRSM,9200)
+ WRITE(GRPRSM,9113) KSEC2(1)
+C
+C Quasi-regular lat/long grids also possible.
+C
+ IF (KSEC2(17).EQ.0) THEN
+ WRITE(GRPRSM,9201) KSEC2(2)
+ ELSE
+ CALL PTQUASI(KSEC2)
+ ENDIF
+ WRITE(GRPRSM,9202) KSEC2(3)
+ WRITE(GRPRSM,9203) KSEC2(4)
+ WRITE(GRPRSM,9204) KSEC2(5)
+ IBIT = 8
+ IRESOL = KSEC2(6) + KSEC2(18) + KSEC2(19)
+ CALL PRTBIN (IRESOL,IBIT,IOUT,IERR)
+ WRITE(GRPRSM,9205) IOUT
+ WRITE(GRPRSM,9206) KSEC2(7)
+ WRITE(GRPRSM,9207) KSEC2(8)
+C
+C Print increment if given.
+C
+ IF ( KSEC2(9) .LT. 0) THEN
+ WRITE(GRPRSM,9236)
+ ELSE
+ WRITE(GRPRSM,9208) KSEC2(9)
+ ENDIF
+ IF ( KSEC2(10) .LT. 0) THEN
+ WRITE(GRPRSM,9237)
+ ELSE
+ WRITE(GRPRSM,9209) KSEC2(10)
+ ENDIF
+ IBIT = 8
+ CALL PRTBIN (KSEC2(11),IBIT,IOUT,IERR)
+ WRITE(GRPRSM,9211) IOUT
+ WRITE(GRPRSM,9212) KSEC2(12)
+ GO TO 800
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 5 . Print polar stereographic data.
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+ IF (KSEC2(1).EQ.5) THEN
+ WRITE(GRPRSM,9200)
+ WRITE(GRPRSM,9114) KSEC2(1)
+ WRITE(GRPRSM,9301) KSEC2(2)
+ WRITE(GRPRSM,9302) KSEC2(3)
+ WRITE(GRPRSM,9203) KSEC2(4)
+ WRITE(GRPRSM,9204) KSEC2(5)
+ IBIT = 8
+ IRESOL = KSEC2(18) + KSEC2(19)
+ CALL PRTBIN (IRESOL,IBIT,IOUT,IERR)
+ WRITE(GRPRSM,9205) IOUT
+ WRITE(GRPRSM,9303) KSEC2(7)
+ WRITE(GRPRSM,9304) KSEC2(9)
+ WRITE(GRPRSM,9305) KSEC2(10)
+ IBIT = 8
+ CALL PRTBIN (KSEC2(11),IBIT,IOUT,IERR)
+ WRITE(GRPRSM,9211) IOUT
+ WRITE(GRPRSM,9212) KSEC2(12)
+ WRITE(GRPRSM,9306) KSEC2(13)
+ GO TO 800
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 6 . Print Lambert conformal data.
+C -----------------------------------------------------------------|
+C
+ 600 CONTINUE
+C
+ IF (KSEC2(1).EQ.3) THEN
+C
+ WRITE(GRPRSM,9200)
+ WRITE(GRPRSM,9115) KSEC2(1)
+ WRITE(GRPRSM,9301) KSEC2(2)
+ WRITE(GRPRSM,9302) KSEC2(3)
+ WRITE(GRPRSM,9203) KSEC2(4)
+ WRITE(GRPRSM,9204) KSEC2(5)
+ IBIT = 8
+ IRESOL = KSEC2(18) + KSEC2(19) + KSEC2(6)
+ CALL PRTBIN (IRESOL,IBIT,IOUT,IERR)
+ WRITE(GRPRSM,9205) IOUT
+ WRITE(GRPRSM,9303) KSEC2(7)
+ WRITE(GRPRSM,9304) KSEC2(9)
+ WRITE(GRPRSM,9305) KSEC2(10)
+ IBIT = 8
+ CALL PRTBIN (KSEC2(11),IBIT,IOUT,IERR)
+ WRITE(GRPRSM,9211) IOUT
+ WRITE(GRPRSM,9212) KSEC2(12)
+ WRITE(GRPRSM,9306) KSEC2(13)
+ WRITE(GRPRSM,9214) KSEC2(14)
+ WRITE(GRPRSM,9215) KSEC2(15)
+ WRITE(GRPRSM,9216) KSEC2(20)
+ WRITE(GRPRSM,9217) KSEC2(21)
+ GO TO 800
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 7 . Print space view perspective or orthographic data.
+C -----------------------------------------------------------------|
+C
+ 700 CONTINUE
+C
+ IF (KSEC2(1).EQ.90) THEN
+ WRITE(GRPRSM,9200)
+ WRITE(GRPRSM,9116) KSEC2(1)
+ WRITE(GRPRSM,9301) KSEC2(2)
+ WRITE(GRPRSM,9302) KSEC2(3)
+ WRITE(GRPRSM,9310) KSEC2(4)
+ WRITE(GRPRSM,9311) KSEC2(5)
+ IBIT = 8
+ IRESOL = KSEC2(18) + KSEC2(19)
+ WRITE(GRPRSM,9312) KSEC2(7)
+ WRITE(GRPRSM,9313) KSEC2(8)
+ WRITE(GRPRSM,9314) KSEC2(9)
+ WRITE(GRPRSM,9315) KSEC2(10)
+ IBIT = 8
+ CALL PRTBIN (KSEC2(11),IBIT,IOUT,IERR)
+ WRITE(GRPRSM,9211) IOUT
+ WRITE(GRPRSM,9212) KSEC2(12)
+ WRITE(GRPRSM,9303) KSEC2(13)
+ WRITE(GRPRSM,9316) KSEC2(14)
+ WRITE(GRPRSM,9317) KSEC2(15)
+ WRITE(GRPRSM,9318) KSEC2(16)
+ WRITE(GRPRSM,9319) KSEC2(18)
+ WRITE(GRPRSM,9320) KSEC2(19)
+ GO TO 800
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 7.5 . Print ocean data
+C -----------------------------------------------------------------|
+C
+ 750 CONTINUE
+C
+ IF( KSEC2(1).EQ.192 ) THEN
+ WRITE(GRPRSM,9117) KSEC2(1)
+ IF( KSEC2(2).EQ. 32767 ) THEN
+ WRITE(GRPRSM,9501) KSEC2(2)
+ ELSE
+ WRITE(GRPRSM,9502) KSEC2(2)
+ ENDIF
+C
+ IF( KSEC2(3).EQ. 32767 ) THEN
+ WRITE(GRPRSM,9503) KSEC2(3)
+ ELSE
+ WRITE(GRPRSM,9504) KSEC2(3)
+ ENDIF
+C
+ IBIT = 8
+ CALL PRTBIN (KSEC2(11),IBIT,IOUT,IERR)
+ WRITE(GRPRSM,9211) IOUT
+ GO TO 800
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 7.6 . Print mercator data
+C -----------------------------------------------------------------|
+C
+ 760 CONTINUE
+C
+ IF (KSEC2(1).EQ.1) THEN
+ WRITE(GRPRSM,9200)
+ WRITE(GRPRSM,9118) KSEC2(1)
+ WRITE(GRPRSM,9201) KSEC2(2)
+ WRITE(GRPRSM,9202) KSEC2(3)
+ WRITE(GRPRSM,9203) KSEC2(4)
+ WRITE(GRPRSM,9204) KSEC2(5)
+ IBIT = 8
+ IRESOL = KSEC2(6) + KSEC2(18) + KSEC2(19)
+ CALL PRTBIN (IRESOL,IBIT,IOUT,IERR)
+ WRITE(GRPRSM,9205) IOUT
+ WRITE(GRPRSM,9206) KSEC2(7)
+ WRITE(GRPRSM,9207) KSEC2(8)
+ WRITE(GRPRSM,9218) KSEC2(9)
+ WRITE(GRPRSM,9208) KSEC2(13)
+ WRITE(GRPRSM,9209) KSEC2(14)
+ IBIT = 8
+ CALL PRTBIN (KSEC2(11),IBIT,IOUT,IERR)
+ WRITE(GRPRSM,9211) IOUT
+ WRITE(GRPRSM,9212) KSEC2(12)
+ GO TO 800
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Drop through to here => representation type not catered for.
+C -----------------------------------------------------------------|
+C
+ WRITE(GRPRSM,*)
+ X 'GRPRS2 :Data representation type not catered for -', KSEC2(1)
+C
+ GO TO 900
+C
+C -----------------------------------------------------------------|
+C* Section 8 . Print vertical coordinate parameters,
+C rotated grid information,
+C stretched grid information, if any.
+C -----------------------------------------------------------------|
+C
+ 800 CONTINUE
+C
+C Vertical coordinate parameters ...
+C
+ IF (KSEC2(12).NE.0) THEN
+ WRITE(GRPRSM,9000)
+ WRITE(GRPRSM,9400)
+ WRITE(GRPRSM,9401)
+ DO I = 11, (KSEC2(12)+10)
+ WRITE(GRPRSM,9402) PSEC2(I)
+ ENDDO
+ ENDIF
+C
+C Rotated and stretched grids introduced in Edition 1.
+C
+ IF (IEDIT.LT.1) GO TO 900
+C
+C* Rotated grid information ...
+C
+ IF (KSEC2(1).EQ.10 .OR. KSEC2(1).EQ.30 .OR.
+ X KSEC2(1).EQ.14 .OR. KSEC2(1).EQ.34 .OR.
+ X KSEC2(1).EQ.60 .OR. KSEC2(1).EQ.80 .OR.
+ X KSEC2(1).EQ.30) THEN
+ WRITE(GRPRSM,9000)
+ WRITE(GRPRSM,9220) KSEC2(13)
+ WRITE(GRPRSM,9221) KSEC2(14)
+ WRITE(GRPRSM,9222) PSEC2(1)
+ ENDIF
+C
+C* Stretched grid information ...
+C
+ IF (KSEC2(1).EQ.20 .OR. KSEC2(1).EQ.30 .OR.
+ X KSEC2(1).EQ.24 .OR. KSEC2(1).EQ.34 .OR.
+ X KSEC2(1).EQ.70 .OR. KSEC2(1).EQ.80) THEN
+ WRITE(GRPRSM,9000)
+ WRITE(GRPRSM,9230) KSEC2(15)
+ WRITE(GRPRSM,9231) KSEC2(16)
+ WRITE(GRPRSM,9232) PSEC2(2)
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9 . Format statements. Return to calling routine.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ 9000 FORMAT (1H )
+ 9001 FORMAT (1H ,'Section 2 - Grid Description Section.')
+ 9002 FORMAT (1H ,'-------------------------------------')
+ 9102 FORMAT (1H ,'J - Pentagonal resolution parameter. ',I9)
+ 9103 FORMAT (1H ,'K - Pentagonal resolution parameter. ',I9)
+ 9104 FORMAT (1H ,'M - Pentagonal resolution parameter. ',I9)
+ 9105 FORMAT (1H ,'Representation type (Table 9) ',I9)
+ 9106 FORMAT (1H ,'Representation mode (Table 10). ',I9)
+ 9107 FORMAT (1H ,'Not used. ',I9)
+ 9111 FORMAT (1H ,'Data represent type = spectral (Table 6) ',I9)
+ 9112 FORMAT (1H ,'Data represent type = gaussian (Table 6) ',I9)
+ 9113 FORMAT (1H ,'Data represent type = lat/long (Table 6) ',I9)
+ 9114 FORMAT (1H ,'Data represent type = polar stereo (Table 6) ',I9)
+ 9115 FORMAT (1H ,'Data represent type = Lambert (Table 6) ',I9)
+ 9116 FORMAT (1H ,'Data represent type = space/ortho (Table 6) ',I9)
+ 9117 FORMAT (1H ,'Data represent type = ECMWF ocean (Table 6) ',I9)
+ 9118 FORMAT (1H ,'Data represent type = Mercator (Table 6) ',I9)
+C
+ 9200 FORMAT (1H ,'(Southern latitudes and Western longitudes',
+ C ' are negative.)')
+ 9201 FORMAT (1H ,'Number of points along a parallel. ',I9)
+ 9202 FORMAT (1H ,'Number of points along a meridian. ',I9)
+ 9203 FORMAT (1H ,'Latitude of first grid point. ',I9)
+ 9204 FORMAT (1H ,'Longitude of first grid point. ',I9)
+ 9205 FORMAT (1H ,'Resolution and components flag. ',I8.8)
+ 9206 FORMAT (1H ,'Latitude of last grid point. ',I9)
+ 9207 FORMAT (1H ,'Longitude of last grid point. ',I9)
+ 9208 FORMAT (1H ,'i direction (East-West) increment. ',I9)
+ 9209 FORMAT (1H ,'j direction (North-South) increment. ',I9)
+ 9210 FORMAT (1H ,'Number of parallels between pole and equator.',I9)
+ 9211 FORMAT (1H ,'Scanning mode flags (Code Table 8) ',I8.8)
+ 9212 FORMAT (1H ,'Number of vertical coordinate parameters. ',I9)
+C
+ 9214 FORMAT (1H ,'Latitude intersection 1 - Latin 1 -. ',I9)
+ 9215 FORMAT (1H ,'Latitude intersection 2 - Latin 2 -. ',I9)
+ 9216 FORMAT (1H ,'Latitude of Southern Pole. ',I9)
+ 9217 FORMAT (1H ,'Longitude of Southern Pole. ',I9)
+ 9218 FORMAT (1H ,'Latitude projection intersects Earth(Latin) ',I9)
+C
+ 9220 FORMAT (1H ,'Latitude of southern pole of rotation. ',I9)
+ 9221 FORMAT (1H ,'Longitude of southern pole of rotation. ',I9)
+ 9222 FORMAT (1H ,'Angle of rotation. ',F20.10)
+C
+ 9230 FORMAT (1H ,'Latitude of pole of stretching. ',I9)
+ 9231 FORMAT (1H ,'Longitude of pole of stretching. ',I9)
+ 9232 FORMAT (1H ,'Stretching factor. ',F20.10)
+ 9233 FORMAT (1H ,'Number of points along a parallel varies.')
+ 9235 FORMAT (1H , I5,16X,A10)
+ 9236 FORMAT (1H ,'i direction (East-West) increment',
+ X ' Not given')
+ 9237 FORMAT (1H ,'j direction (North-South) increment',
+ X ' Not given')
+C
+ 9301 FORMAT (1H ,'Number of points along X axis. ',I9)
+ 9302 FORMAT (1H ,'Number of points along Y axis. ',I9)
+ 9303 FORMAT (1H ,'Orientation of the grid. ',I9)
+ 9304 FORMAT (1H ,'X direction increment. ',I9)
+ 9305 FORMAT (1H ,'Y direction increment. ',I9)
+ 9306 FORMAT (1H ,'Projection centre flag. ',I9)
+C
+ 9310 FORMAT (1H ,'Latitude of sub-satellite point. ',I9)
+ 9311 FORMAT (1H ,'Longitude of sub-satellite point. ',I9)
+ 9312 FORMAT (1H ,'Diameter of the earth in x direction. ',I9)
+ 9313 FORMAT (1H ,'Diameter of the earth in y direction. ',I9)
+ 9314 FORMAT (1H ,'X coordinate of sub-satellite point. ',I9)
+ 9315 FORMAT (1H ,'Y coordinate of sub-satellite point. ',I9)
+ 9316 FORMAT (1H ,'Altitude of the camera. ',I9)
+ 9317 FORMAT (1H ,'Y coordinate of origin of sector image. ',I9)
+ 9318 FORMAT (1H ,'X coordinate of origin of sector image. ',I9)
+ 9319 FORMAT (1H ,'Earth flag ',I9)
+ 9320 FORMAT (1H ,'Components flag ',I9)
+C
+ 9400 FORMAT (1H ,'Vertical Coordinate Parameters.')
+ 9401 FORMAT (1H ,'-------------------------------')
+ 9402 FORMAT (4X,F20.12,4X,F20.12)
+C
+ 9501 FORMAT(' Number of points along the first axis. Not used')
+ 9502 FORMAT (' Number of points along the first axis. ',I9)
+ 9503 FORMAT(' Number of points along the second axis. Not used')
+ 9504 FORMAT (' Number of points along the second axis. ',I9)
+C
+ END
diff --git a/gribex/grprs3.F b/gribex/grprs3.F
new file mode 100755
index 0000000..c105dba
--- /dev/null
+++ b/gribex/grprs3.F
@@ -0,0 +1,130 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRPRS3 (KSEC0,KSEC3,PSEC3)
+C
+C---->
+C**** GRPRS3 - Print information from Section 3 of GRIB code.
+C
+C Purpose.
+C --------
+C
+C Print the information in the Bit-map section
+C Section (Section 3) of decoded GRIB data.
+C
+C** Interface.
+C ----------
+C
+C CALL GRPRS3 (KSEC0,KSEC3,PSEC3)
+C
+C Input Parameters.
+C -----------------
+C
+C KSEC0 - Array of decoded integers from Section 0.
+C KSEC3 - Array of decoded integers from Section 3.
+C
+C PSEC3 - Array of decoded reals from Section 3.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C Fields printed as integers or reals.
+C
+C Externals.
+C ----------
+C
+C Common block GRPRSCM.
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes re GRIB Code.
+C See also routine GRIBEX.
+C
+C Comments.
+C ---------
+C
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 11.09.91
+C
+C Modifications.
+C --------------
+C
+C J.D.Chambers ECMWF 20.07.94
+C Change format for printing missing data indicator to
+C allow largest negative (32-bit) number
+C
+C J.D.Chambers ECMWF 14.06.95
+C Change format for printing missing data indicator to
+C allow for MAGICS value (-1.5E+21)
+C
+C J.D.Chambers ECMWF June 2002
+C Add option to set output stream number using environment variable
+C GRPRS_STREAM
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+ INTEGER KSEC0(*)
+ INTEGER KSEC3(*)
+ REAL PSEC3(*)
+C
+C -----------------------------------------------------------------|
+C* Section 1 . Print required information.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ WRITE(GRPRSM,9000)
+ WRITE(GRPRSM,9001)
+ WRITE(GRPRSM,9002)
+C
+ IF( KSEC3(1).NE.0 ) THEN
+ WRITE(GRPRSM,9003) KSEC3(1)
+ ELSE
+ WRITE(GRPRSM,9004)
+ ENDIF
+ WRITE(GRPRSM,9005) KSEC3(2)
+C
+ WRITE(GRPRSM,*)
+ X 'Missing data value for real data. ', PSEC3(2)
+C
+C -----------------------------------------------------------------|
+C* Section 9 . Format statements. Return to calling routine.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ 9000 FORMAT (1H )
+ 9001 FORMAT (1H ,'Section 3 - Bit-map Section.')
+ 9002 FORMAT (1H ,'-------------------------------------')
+ 9003 FORMAT (1H ,'Predetermined bit-map number. ',I9)
+ 9004 FORMAT (1H ,'No predetermined bit-map.')
+ 9005 FORMAT (1H ,'Missing data value for integer data. ',I14)
+ 9006 FORMAT (1H ,'Missing data value for real data. ',F20.6)
+C
+ RETURN
+C
+ END
diff --git a/gribex/grprs4.F b/gribex/grprs4.F
new file mode 100755
index 0000000..26f5014
--- /dev/null
+++ b/gribex/grprs4.F
@@ -0,0 +1,247 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRPRS4 (KSEC0,KSEC4,PSEC4)
+C
+C---->
+C**** GRPRS4 - Print information from Section 4 of GRIB code.
+C
+C Purpose.
+C --------
+C
+C Print the information in the Binary data section
+C Section (Section 4) of decoded GRIB data.
+C
+C** Interface.
+C ----------
+C
+C CALL GRPRS4 (KSEC0,KSEC4,PSEC4)
+C
+C
+C Input Parameters.
+C -----------------
+C KSEC0 - Array of decoded integers from Section 0.
+C KSEC4 - Array of decoded integers from Section 4.
+C PSEC4 - Array of decoded reals from Section 4.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C Fields printed as integers or reals.
+C
+C Externals.
+C ----------
+C
+C SETPAR
+C INXBIT.
+C
+C Common block GRPRSCM.
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes re GRIB Code.
+C See also routine GRIBEX.
+C
+C Comments.
+C ---------
+C
+C Checks environment variable GRPRS_STREAM for output stream number
+C for printing (default is 6)
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 11.09.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 21.07.92
+C
+C J.D.Chambers ECMWF 20.10.93
+C Distinguish between real and integer values
+C in print of gridpoint values
+C
+C J.D.Chambers ECMWF 09.05.94
+C Print complex packing information
+C
+C J.D.Chambers ECMWF 14.06.95
+C Change format for printing missing data indicator to
+C allow for MAGICS value (-1.5E+21)
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C Take into account second-order packing for grid-point data.
+C
+C J.D.Chambers ECMWF June 2002
+C Add option to set output stream number using environment variable
+C GRPRS_STREAM
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+ INTEGER KSEC0(*)
+ INTEGER KSEC4(*)
+ REAL PSEC4(*)
+C
+ INTEGER INUM, J210, J212, IVALUE, IBIT, IDUM, INSPT, IRET
+C
+C -----------------------------------------------------------------|
+C* Section 1 . Print integer information from KSEC4.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ WRITE(GRPRSM,9000)
+ WRITE(GRPRSM,9001)
+ WRITE(GRPRSM,9002)
+C
+ WRITE(GRPRSM,9003) KSEC4(1)
+ WRITE(GRPRSM,9004) KSEC4(2)
+ WRITE(GRPRSM,9005) KSEC4(3)
+ WRITE(GRPRSM,9006) KSEC4(4)
+ WRITE(GRPRSM,9007) KSEC4(5)
+ WRITE(GRPRSM,9008) KSEC4(6)
+ WRITE(GRPRSM,9009) KSEC4(7)
+ WRITE(GRPRSM,9010) KSEC4(8)
+ WRITE(GRPRSM,9011) KSEC4(9)
+ WRITE(GRPRSM,9012) KSEC4(10)
+C If complex packing ..
+ IF ( KSEC4(4).EQ.64 ) THEN
+C
+ IF ( KSEC4(3).EQ.128 ) THEN
+ WRITE(GRPRSM,9116) KSEC4(16)
+ WRITE(GRPRSM,9117) KSEC4(17)
+ WRITE(GRPRSM,9118) KSEC4(18)
+ WRITE(GRPRSM,9119) KSEC4(19)
+ WRITE(GRPRSM,9120) KSEC4(20)
+ ELSE
+ WRITE(GRPRSM,9013) KSEC4(11)
+ WRITE(GRPRSM,9014) KSEC4(12)
+ WRITE(GRPRSM,9015) KSEC4(13)
+ WRITE(GRPRSM,9016) KSEC4(14)+KSEC4(15)
+ ENDIF
+C
+ ENDIF
+C
+C Number of non-missing values
+C
+ IF ( KSEC4(21).NE.0 ) WRITE(GRPRSM,9017) KSEC4(21)
+C
+C Information on matrix of values , if present.
+C
+ IF (KSEC4(8).EQ.64)
+ C THEN
+ WRITE(GRPRSM,9020) KSEC4(50)
+ WRITE(GRPRSM,9021) KSEC4(51)
+ WRITE(GRPRSM,9022) KSEC4(52)
+ WRITE(GRPRSM,9023)
+ WRITE(GRPRSM,9024) KSEC4(53)
+ WRITE(GRPRSM,9025) KSEC4(54)
+ WRITE(GRPRSM,9023)
+ WRITE(GRPRSM,9026) KSEC4(55)
+ WRITE(GRPRSM,9027) KSEC4(56)
+ WRITE(GRPRSM,9028) KSEC4(57)
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Print values from PSEC4.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ WRITE(GRPRSM,9000)
+C
+ INUM = KSEC4(1)
+ IF (INUM.LT.0) INUM = - INUM
+ IF (INUM.GT.20) INUM = 20
+C
+C Print first INUM values.
+C
+ WRITE(GRPRSM,9031) INUM
+C
+ IF ( KSEC4(5) .EQ. 0 ) THEN
+C
+C Print real values ...
+ DO 210 J210=1,INUM
+ WRITE(GRPRSM,9034) PSEC4(J210)
+ 210 CONTINUE
+C
+ ELSE
+C
+C Print integer values ...
+ CALL SETPAR(IBIT,IDUM,IDUM)
+ DO 212 J212=1,INUM
+ INSPT = 0
+ CALL INXBIT(IVALUE,1,INSPT,PSEC4(J212),1,IBIT,IBIT,'C',IRET)
+ WRITE(GRPRSM,9033) IVALUE
+ 212 CONTINUE
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9 . Format statements. Return to calling routine.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ 9000 FORMAT(' ')
+ 9001 FORMAT(' Section 4 - Binary Data Section.')
+ 9002 FORMAT(' -------------------------------------')
+ 9003 FORMAT(' Number of data values coded/decoded. ',I9)
+ 9004 FORMAT(' Number of bits per data value. ',I9)
+ 9005 FORMAT(' Type of data (0=grid pt, 128=spectral).',I9)
+ 9006 FORMAT(' Type of packing (0=simple, 64=complex). ',I9)
+ 9007 FORMAT(' Type of data (0=float, 32=integer). ',I9)
+ 9008 FORMAT(' Additional flags (0=none, 16=present). ',I9)
+ 9009 FORMAT(' Reserved. ',I9)
+ 9010 FORMAT(' Number of values (0=single, 64=matrix). ',I9)
+ 9011 FORMAT(' Secondary bit-maps (0=none, 32=present). ',I9)
+ 9012 FORMAT(' Values width (0=constant, 16=variable).',I9)
+ 9013 FORMAT(' Bits number of 2nd order values (none=>0).',I9)
+ 9014 FORMAT(' General extend. 2-order packing (0=no,8=yes).',I9)
+ 9015 FORMAT(' Boustrophedonic ordering (0=no,4=yes).',I9)
+ 9016 FORMAT(' Spatial differencing order (0=none).',I9)
+ 9017 FORMAT(' Number of non-missing values ',I9)
+ 9120 FORMAT(' Pentagonal resolution parameter M for subset.',I9)
+ 9020 FORMAT(' First dimension (rows) of each matrix. ',I9)
+ 9021 FORMAT(' Second dimension (columns) of each matrix. ',I9)
+ 9022 FORMAT(' First dimension coordinate values definition.',I9)
+ 9023 FORMAT(' (Code Table 12)')
+ 9024 FORMAT(' NC1 - Number of coefficients for 1st dimension.',I7)
+ 9025 FORMAT(' Second dimension coordinate values definition.',I8)
+ 9026 FORMAT(' NC2 - Number of coefficients for 2nd dimension.',I7)
+ 9027 FORMAT(' 1st dimension physical signifance (Table 13). ',I8)
+ 9028 FORMAT(' 2nd dimension physical signifance (Table 13). ',I8)
+ 9031 FORMAT(' First ',I4,' data values.')
+ 9032 FORMAT(' ',F30.15)
+C
+C931020
+ 9033 FORMAT(' ',I15)
+ 9034 FORMAT(' ',G20.8)
+C
+C940509
+ 9116 FORMAT(' Byte offset of start of packed data (N). ',I9)
+ 9117 FORMAT(' Power (P * 1000). ',I9)
+ 9118 FORMAT(' Pentagonal resolution parameter J for subset.',I9)
+ 9119 FORMAT(' Pentagonal resolution parameter K for subset.',I9)
+ RETURN
+C
+ END
diff --git a/gribex/grprs4w.F b/gribex/grprs4w.F
new file mode 100755
index 0000000..e650bf0
--- /dev/null
+++ b/gribex/grprs4w.F
@@ -0,0 +1,121 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRPRS4W(KSEC4)
+C
+C---->
+C**** GRPRS4W
+C
+C Purpose.
+C --------
+C
+C Print the wave coordinate information in the Binary data
+C section Section (Section 4) of decoded GRIB data.
+C
+C** Interface.
+C ----------
+C
+C CALL GRPRS4W(KSEC4)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KSEC4 - Array of decoded integers from Section 4.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C Fields printed as reals.
+C
+C Externals.
+C ----------
+C
+C SETPAR
+C INXBIT.
+C
+C Common block GRPRSCM.
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes re GRIB Code.
+C See also routine GRIBEX.
+C
+C Comments.
+C ---------
+C
+C Wave coordinate information held in KSEC4 are 32-bit REALs,
+C hence the PTEMP and NTEMP used for printing are 4-byte variables.
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 28.10.97
+C Add printout for ECMWF wave 2Dsp first and second dimension
+C coordinate values
+C
+C J.D.Chambers ECMWF June 2002
+C Add option to set output stream number using environment variable
+C GRPRS_STREAM
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Subroutine arguments
+ INTEGER KSEC4
+ DIMENSION KSEC4(*)
+C
+C Local variables
+C
+ INTEGER JLOOP
+ REAL*4 PTEMP(100)
+ INTEGER*4 NTEMP(100)
+ EQUIVALENCE ( PTEMP(1),NTEMP(1) )
+C
+C -----------------------------------------------------------------|
+C* Section 1 . Print integer information from KSEC4.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ WRITE(GRPRSM,*)
+ X 'Coefficients defining first dimension coordinates:'
+ DO 110 JLOOP = 1, KSEC4(53)
+ NTEMP(JLOOP) = KSEC4(59 + JLOOP)
+ WRITE(GRPRSM,'(F20.10)') PTEMP(JLOOP)
+ 110 CONTINUE
+C
+ WRITE(GRPRSM,*)
+ X 'Coefficients defining second dimension coordinates:'
+ DO 120 JLOOP = 1, KSEC4(55)
+ NTEMP(JLOOP) = KSEC4(59 + KSEC4(53) + JLOOP)
+ WRITE(GRPRSM,'(F20.10)') PTEMP(JLOOP)
+ 120 CONTINUE
+C
+C -----------------------------------------------------------------|
+C Section 9. Return to calling routine.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/grsdbg.F b/gribex/grsdbg.F
new file mode 100755
index 0000000..c7fd88f
--- /dev/null
+++ b/gribex/grsdbg.F
@@ -0,0 +1,132 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRSDBG (KDBG)
+C
+C---->
+C**** GRSDBG - Debug print switch setting for routine GRIBEX.
+C
+C Purpose.
+C --------
+C
+C Switch debug printout on or off for routine GRIBEX.
+C
+C** Interface.
+C ----------
+C
+C CALL GRSDBG (KDBG)
+C
+C Input Parameters.
+C -----------------
+C
+C KDGB - Debug print switch.
+C 0 , No printout.
+C Non-zero , Debug printout.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C The variable NDBG is set in the common area. All other
+C parameters are also set to default values, if they have
+C not already been set by the user.
+C
+C Externals.
+C ----------
+C
+C GRSDEF - Default setting of global variables.
+C
+C Reference.
+C ----------
+C
+C See subroutine GRIBEX.
+C
+C Comments.
+C ---------
+C
+C None
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 25.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 25.06.91
+C Changes to some comments only.
+C
+C J. Hennessy ECMWF 14.11.91
+C Common areas changed.
+C
+C J. Hennessy ECMWF 07.01.92
+C Input parameter returned unchanged.
+C
+C J.D.Chambers ECMWF 13.09.94
+C Add NONOFF and NOABORT, use grbcom.h
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C Use GRSDEF routine for default setting.
+C
+C J. Clochard, Meteo France, for ECMWF - June 1999.
+C Use a static variable to determine if initialisation of
+C default values has already been done for common area
+C variables.
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grbcom.h"
+C
+ INTEGER KDBG
+C
+ LOGICAL LFIRST
+ SAVE LFIRST
+C
+ DATA LFIRST / .TRUE. /
+C
+C ----------------------------------------------------------------
+C* Section 1 . Set values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (LFIRST) THEN
+C
+C Common area variables may have not been set, so start by
+C trying to set default values.
+C
+ CALL GRSDEF
+ LFIRST=.FALSE.
+C
+ ENDIF
+C
+C Set debug print to required value.
+C
+ NDBG = KDBG
+C
+C ----------------------------------------------------------------
+C* Section 9 . Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/gribex/grsdef.F b/gribex/grsdef.F
new file mode 100755
index 0000000..622282f
--- /dev/null
+++ b/gribex/grsdef.F
@@ -0,0 +1,309 @@
+ SUBROUTINE GRSDEF
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C
+C---->
+C**** GRSDEF
+C
+C Purpose.
+C --------
+C Sets initial values for common area variables and environment
+C variables for the GRIBEX package, if not already done.
+C
+C
+C Interface.
+C ----------
+C CALL GRSDEF
+C
+C
+C Input Parameters.
+C -----------------
+C None.
+C
+C
+C Output Parameters.
+C ------------------
+C None.
+C
+C
+C Method.
+C -------
+C Self-explanatory.
+C
+C
+C Externals.
+C ----------
+C EMOSNUM - Returns current EMOSLIB version number
+C
+C
+C Reference.
+C ----------
+C See subroutine GRIBEX.
+C
+C
+C Comments.
+C ---------
+C None
+C
+C
+C Author.
+C -------
+C J. Clochard, Meteo France, for ECMWF - March 1998.
+C
+C
+C Modifications.
+C --------------
+C J. Clochard, Meteo France, for ECMWF - June 1999.
+C Add variable NSUBCE.
+C Use a static variable to determine if initialisation has already
+C been done. NUSER removed .
+C Reverse defaults for NEXT2O and NLOC2O, for consistency with
+C version 13.023 of software .
+C
+C J.D.Chambers ECMWF September 2002
+C Read environment variables first time through.
+C
+C E. Fucile ECMWF October 2008
+C added environment variable GRIBEX_DUMP_DATA_ON_ERROR
+C to dump data files in a file when an error occurs
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+#include "grbcom.h"
+C
+C Local variables
+C
+ INTEGER IOFFSET
+ CHARACTER*10 HNDBG, HNVCK, YNUMBER
+ CHARACTER*256 HDEFAULT, HBTDEFT
+ LOGICAL LFIRST
+ SAVE LFIRST
+C
+#ifdef TABLE_PATH
+ DATA HDEFAULT / TABLE_PATH /
+#else
+ DATA HDEFAULT / '' /
+#endif
+
+#ifdef __uxp__
+ DATA HBTDEFT /'/vpp700/mrfs/postproc/'/
+#else
+ DATA HBTDEFT /'/home/ma/emos/tables/'/
+#endif
+C
+ DATA LFIRST / .TRUE. /
+C
+C External(s)
+C
+ INTEGER EMOSNUM
+C
+C ----------------------------------------------------------------
+C* Section 1 . Set values, conditionally.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF( .NOT. LFIRST) GOTO 900
+C
+C Mark common area values set.
+ LFIRST = .FALSE.
+C
+C Common area variables have not been set. Set them.
+C
+C User supplied reference value.
+ FREF = 0.0
+C
+C Reference value supplied by user flag. Set to off.
+ NFREF = 0
+C
+C User supplied maximum value.
+ FMAX = 0.0
+C
+C Maximum value supplied by user flag. Set to off.
+ NFMAX = 0
+C
+C Set rounding to 120 bytes on.
+ NRND = 1
+C
+C Set P factor switch to default, user supplies the P factor.
+ NONOFF = 0
+C
+C Set abort flag to NO abort
+ NOABORT = 1
+C
+C Exhaustive use of all possible second-order packing methods
+C for HOPER='K'. Set to off.
+ NUM2OK = 0
+C
+C Use of extended second-order packing methods for grid-point
+C encoding (HOPER='C' and 'K'). Set to on.
+ NEXT2O = 1
+C
+C Use of non-local second-order packing methods for grid-point
+C encoding (HOPER='C' and 'K'). Set to on.
+ NLOC2O = 1
+C
+C Use of (all valid) sub-centre values for ECMWF fields encoding .
+C encoding. Set to off.
+ NSUBCE = 0
+C
+C ----------------------------------------------------------------
+C* Section 2. Set up values controlled by environment variables
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Set debug print on/off.
+C
+ NDBG = 0
+ CALL GETENV('GRIBEX_DEBUG',HNDBG)
+ IOFFSET = INDEX( HNDBG, ' ')
+ IF( IOFFSET.GT.1 ) THEN
+ IF( HNDBG(1:2).EQ.'ON') THEN
+ NDBG = 1
+ ELSE IF( HNDBG(1:1).EQ.'1') THEN
+ NDBG = 1
+ ELSE IF( HNDBG(1:1).EQ.'2') THEN
+ NDBG = 2
+ ELSE
+ NDBG = 0
+ ENDIF
+ ENDIF
+C
+C Set DUMPDATA to dump data values on error
+C
+ DUMPDATA = 0
+ CALL GETENV('GRIBEX_DUMP_DATA_ON_ERROR',DUMPPATH)
+ IOFFSET = INDEX( DUMPPATH, ' ')
+ IF( IOFFSET.GT.2 ) THEN
+ IF( DUMPPATH(1:3).EQ.'OFF') THEN
+ DUMPDATA=0
+ ELSE
+ DUMPDATA=1
+ ENDIF
+ ENDIF
+
+C
+C Set GRIB value checking on/off.
+C
+ NVCK = 1
+ CALL GETENV('GRIBEX_CHECK',HNVCK)
+ IOFFSET = INDEX( HNVCK, ' ')
+ IF( IOFFSET.GT.2 ) THEN
+ IF( HNVCK(1:3).EQ.'OFF') THEN
+ NVCK = 0
+ ELSE
+ NVCK = 1
+ ENDIF
+ ENDIF
+C
+C See if output stream needs changing
+C
+ CALL GETENV('GRPRS_STREAM', YNUMBER)
+ IOFFSET = INDEX( YNUMBER, ' ')
+ IF( IOFFSET.GT.1 ) THEN
+ IF( IOFFSET.EQ.2 ) THEN
+ READ(YNUMBER,'(I1.1)') GRPRSM
+ ELSE IF( IOFFSET.EQ.3 ) THEN
+ READ(YNUMBER,'(I2.2)') GRPRSM
+ ELSE
+ WRITE(GRPRSM,*)
+ X 'GRSDEF: Invalid value for GRPRS_STREAM: ' // YNUMBER
+ GRPRSM = 6
+ ENDIF
+ ELSE
+ GRPRSM = 6
+ ENDIF
+C
+ IF( GRPRSM.LT.1 ) THEN
+ WRITE(*,*) 'GRSDEF: Invalid number for GRPRS_STREAM: ', GRPRSM
+ GRPRSM = 6
+ ENDIF
+C
+C Set EMOSLIB version number
+C
+ IF( (NEMOSLB.EQ.0).OR.(NEMOSET.EQ.0) ) THEN
+ IF( NDBG.GT.0 ) THEN
+ NEMOSLB = EMOSNUM(0)
+ ELSE
+ NEMOSLB = EMOSNUM(1)
+ ENDIF
+ NEMOSET = 1
+ ENDIF
+C
+C Set pathname for parameter table lookup
+C
+ CALL GETENV( 'ECMWF_LOCAL_TABLE_PATH', ELTPATH)
+ IOFFSET = INDEX( ELTPATH, ' ')
+ IF( IOFFSET.LE.1 ) THEN
+ IOFFSET = INDEX(HDEFAULT,' ') - 1
+ IF(IOFFSET.GT.0) THEN
+ ELTPATH = HDEFAULT(1:IOFFSET)//'/gribtables/'
+ ELSE
+ ELTPATH = '/usr/local/lib/metaps/tables/gribex/'
+c ELTPATH = '/home/ma/emos/tables/gribex/'
+ ENDIF
+ ENDIF
+C
+C Set pathname for bitmask file
+C
+ CALL GETENV( 'LOCAL_BITMAP_PATH', ELBPATH)
+ IOFFSET = INDEX( ELBPATH, ' ')
+ IF(IOFFSET.LE. 1) THEN
+ ELBPATH = HBTDEFT
+ ENDIF
+C
+C Display values if debug is ON
+C
+ IF( NDBG.GT.0 ) THEN
+C
+ WRITE(GRPRSM,*) 'GRSDEF: ***********************************'
+ WRITE(GRPRSM,*) 'GRSDEF: Environment variable settings:'
+C
+ WRITE(GRPRSM,*) 'GRSDEF: GRIBEX_DEBUG is ON'
+C
+ IF( NVCK.GT.0 ) THEN
+ WRITE(GRPRSM,*) 'GRSDEF: GRIBEX_CHECK is ON'
+ ELSE
+ WRITE(GRPRSM,*) 'GRSDEF: GRIBEX_CHECK is OFF'
+ ENDIF
+C
+ WRITE(GRPRSM,*) 'GRSDEF: GRPRS_STREAM is ', GRPRSM
+C
+ WRITE(GRPRSM,9000) NEMOSLB
+C
+ IOFFSET = INDEX( ELTPATH, ' ')
+ WRITE(GRPRSM,*)
+ X 'GRSDEF: ECMWF_LOCAL_TABLE_PATH is ' // ELTPATH(1:IOFFSET)
+C
+ IOFFSET = INDEX( ELBPATH, ' ')
+ WRITE(GRPRSM,*)
+ X 'GRSDEF: LOCAL_BITMAP_PATH is ' // ELBPATH(1:IOFFSET)
+C
+ WRITE(GRPRSM,*) 'GRSDEF: ***********************************'
+ ENDIF
+C
+C ----------------------------------------------------------------
+C* Section 9 . Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ 9000 FORMAT(' GRSDEF: EMOSLIB version number (EMOS_CYCLE) is ',(I6.6))
+C
+ END
+
diff --git a/gribex/grsmax.F b/gribex/grsmax.F
new file mode 100755
index 0000000..71c550a
--- /dev/null
+++ b/gribex/grsmax.F
@@ -0,0 +1,140 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRSMAX (PMAX)
+C
+C---->
+C**** GRSMAX - Set user defined maximum value for routine GRIBEX.
+C
+C Purpose.
+C --------
+C
+C Set user defined maximum value for GRIB code for
+C routine GRIBEX.
+C
+C** Interface.
+C ----------
+C
+C CALL GRSMAX (PMAX)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C PMAX - Maximum value required.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C The flag variable NFMAX is set to indicate that the
+C user has supplied a maximum value and the variable
+C FMAX is set to the required maximum value. These
+C variables are in the common area. All other parameters
+C are also set to default values, if they have not already
+C been set by the user.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C See subroutine GRIBEX.
+C
+C Comments.
+C ---------
+C
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 25.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 28.08.91
+C Changes to some comments only.
+C
+C J. Hennessy ECMWF 14.11.91
+C Changes to common area.
+C
+C J.D.Chambers ECMWF 13.09.94
+C Add NONOFF and NOABORT, use grbcom.h
+C
+C J. Clochard, Meteo France, for ECMWF - March 1998.
+C Use GRSDEF routine for default setting.
+C
+C J. Clochard, Meteo France, for ECMWF - June 1999.
+C Use a static variable to determine if initialisation of
+C default values has already been done for common area
+C variables.
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grbcom.h"
+C
+ REAL PMAX
+C
+ LOGICAL LFIRST
+ SAVE LFIRST
+C
+ DATA LFIRST / .TRUE. /
+C
+C ----------------------------------------------------------------
+C* Section 1 . Set values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (LFIRST) THEN
+C
+C Common area variables may have not been set, so start by
+C trying to set default values.
+C
+ CALL GRSDEF
+ LFIRST=.FALSE.
+C
+ ENDIF
+C
+C Set maximum value to required value.
+C
+ FMAX = PMAX
+C
+C Maximum value supplied by user flag. Set to on.
+C
+ NFMAX = 1
+C
+C ----------------------------------------------------------------
+C* Section 9 . Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/gribex/grsmkp.F b/gribex/grsmkp.F
new file mode 100755
index 0000000..0768bd1
--- /dev/null
+++ b/gribex/grsmkp.F
@@ -0,0 +1,138 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRSMKP(KONOFF)
+C
+C---->
+C**** GRSMKP - P factor calculation switch setting for routine GRIBEX.
+C
+C Purpose.
+C --------
+C
+C P factor calculation switch set on or off for routine GRIBEX.
+C
+C
+C** Interface.
+C ----------
+C
+C CALL GRSMKP (KONOFF)
+C
+C
+C Input Parameter.
+C ----------------
+C
+C KONOFF - P factor calculation switch flag,
+C = 0 , user supplies the P factor (default)
+C = Non-zero , GRIBEX calculates the P factor.
+C
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C
+C Method.
+C -------
+C
+C The variable NONOFF is set in the common area. All other
+C parameters are also set to default values, if they have
+C not already been set by the user.
+C
+C
+C Externals.
+C ----------
+C
+C GRSDEF - Default setting of global variables.
+C
+C
+C Reference.
+C ----------
+C
+C See subroutine GRIBEX.
+C
+C
+C Comments.
+C ---------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 6th Sept 1994
+C
+C
+C Modifications.
+C --------------
+C
+C J.D.Chambers ECMWF 13.09.94
+C Add NONOFF and NOABORT, use grbcom.h
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C Use GRSDEF routine for default setting.
+C
+C J. Clochard, Meteo France, for ECMWF - June 1999.
+C Use a static variable to determine if initialisation of
+C default values has already been done for common area variables.
+C
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grbcom.h"
+C
+C Subroutine arguments.
+ INTEGER KONOFF
+C
+C Local variables.
+ INTEGER IONOFF
+C
+ LOGICAL LFIRST
+ SAVE LFIRST
+C
+ DATA LFIRST / .TRUE. /
+C
+C ----------------------------------------------------------------
+C* Section 1 . Set values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IONOFF = 0
+ IF (KONOFF.NE.0) IONOFF = 1
+C
+ IF (LFIRST) THEN
+C
+C Common area variables may have not been set, so start by
+C trying to set default values.
+C
+ CALL GRSDEF
+ LFIRST=.FALSE.
+C
+ ENDIF
+C
+C Set P factor switch to required value
+C
+ NONOFF = IONOFF
+C
+C ----------------------------------------------------------------
+C* Section 9 . Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/grsmok.F b/gribex/grsmok.F
new file mode 100755
index 0000000..755a80f
--- /dev/null
+++ b/gribex/grsmok.F
@@ -0,0 +1,136 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRSMOK ( KUM2OK )
+C
+C---->
+C**** GRSMOK - controls use of Methods for GRIBEX Option 'K'
+C (2nd-order aggressive packing).
+C
+C Purpose.
+C --------
+C
+C Exhaustive 2nd-order aggressive packing switch set on or off
+C for routine GRIBEX.
+C
+C
+C** Interface.
+C ----------
+C
+C CALL GRSMOK ( KUM2OK )
+C
+C
+C Input Parameter.
+C ----------------
+C
+C KUM2OK - Exhaustive 2nd-order aggressive packing switch flag,
+C = 0 , user supplies the allowed methods (default)
+C = Non-zero , all applicable methods.
+C
+C (Use for HOPER='K' function)
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C
+C Method.
+C -------
+C
+C The variable NUM2OK is set in the common area. All other
+C parameters are also set to default values, if they have
+C not already been set by the user.
+C
+C
+C Externals.
+C ----------
+C
+C GRSDEF - Default setting of global variables.
+C
+C
+C Reference.
+C ----------
+C
+C See subroutine GRIBEX.
+C
+C
+C Comments.
+C ---------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C
+C
+C Modifications.
+C --------------
+C
+C J. Clochard, Meteo France, for ECMWF - June 1999.
+C Use a static variable to determine if initialisation of
+C default values has already been done for common area variables.
+C
+C
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grbcom.h"
+C
+C Subroutine arguments.
+ INTEGER KUM2OK
+C
+C Local variables.
+ INTEGER IUM2OK
+C
+ LOGICAL LFIRST
+ SAVE LFIRST
+C
+ DATA LFIRST / .TRUE. /
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 1 . Set values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IUM2OK = 0
+ IF (KUM2OK.NE.0) IUM2OK = 1
+C
+ IF (LFIRST) THEN
+C
+C Common area variables may have not been set, so start by
+C trying to set default values.
+C
+ CALL GRSDEF
+ LFIRST=.FALSE.
+C
+ ENDIF
+C
+C Set exhaustive 2nd-order aggressive packing switch
+C to required value.
+C
+ NUM2OK = IUM2OK
+C
+C ----------------------------------------------------------------
+C* Section 9 . Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/grsn2o.F b/gribex/grsn2o.F
new file mode 100755
index 0000000..af89fd9
--- /dev/null
+++ b/gribex/grsn2o.F
@@ -0,0 +1,135 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRSN2O ( KNLOCP )
+C
+C---->
+C**** GRSN2O - controls use of Non-local 2nd-Order packing methods
+C for routine GRIBEX.
+C
+C Purpose.
+C --------
+C
+C Non-local 2nd-order methods switch set on or off
+C for routine GRIBEX.
+C
+C
+C** Interface.
+C ----------
+C
+C CALL GRSN2O ( KNLOCP )
+C
+C
+C Input Parameter.
+C ----------------
+C
+C KNLOCP - Non-local 2nd-order methods switch flag,
+C = 0 , not allowed (default)
+C = Non-zero , non-local methods allowed.
+C
+C (Use for grid-point encoding, HOPER='C' and 'K' functions)
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C
+C Method.
+C -------
+C
+C The variable NLOC2O is set in the common area. All other
+C parameters are also set to default values, if they have
+C not already been set by the user.
+C
+C
+C Externals.
+C ----------
+C
+C GRSDEF - Default setting of global variables.
+C
+C
+C Reference.
+C ----------
+C
+C See subroutine GRIBEX.
+C
+C
+C Comments.
+C ---------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C
+C
+C Modifications.
+C --------------
+C
+C J. Clochard, Meteo France, for ECMWF - June 1999.
+C Use a static variable to determine if initialisation of
+C default values has already been done for common area variables.
+C
+C
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grbcom.h"
+C
+C Subroutine arguments.
+ INTEGER KNLOCP
+C
+C Local variables.
+ INTEGER INLOCP
+C
+ LOGICAL LFIRST
+ SAVE LFIRST
+C
+ DATA LFIRST / .TRUE. /
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 1 . Set values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ INLOCP = 0
+ IF (KNLOCP.NE.0) INLOCP = 1
+C
+ IF (LFIRST) THEN
+C
+C Common area variables may have not been set, so start by
+C trying to set default values.
+C
+ CALL GRSDEF
+ LFIRST=.FALSE.
+C
+ ENDIF
+C
+C Set non-local 2nd-order packing switchto required value.
+C
+ NLOC2O = INLOCP
+C
+C ----------------------------------------------------------------
+C* Section 9 . Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/grsref.F b/gribex/grsref.F
new file mode 100755
index 0000000..0617ae4
--- /dev/null
+++ b/gribex/grsref.F
@@ -0,0 +1,144 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRSREF (PREF)
+C
+C---->
+C**** GRSREF - Set user defined reference value for routine GRIBEX.
+C
+C Purpose.
+C --------
+C
+C Set user defined reference value for GRIB code for
+C routine GRIBEX.
+C
+C** Interface.
+C ----------
+C
+C CALL GRSREF (PREF)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C PREF - Reference value required.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C The flag variable NFREF is set to indicate that the
+C user has supplied a reference value and the variable
+C FREF is set to the required reference value. These
+C variables are in the common area. All other parameters
+C are also set to default values, if they have not already
+C been set by the user.
+C
+C Externals.
+C ----------
+C
+C GRSDEF - Default setting of global variables.
+C
+C Reference.
+C ----------
+C
+C See subroutine GRIBEX.
+C
+C Comments.
+C ---------
+C
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 25.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 28.08.91
+C Changes to some comments only.
+C
+C J. Hennessy ECMWF 14.11.91
+C Changes to common area.
+C
+C J.D.Chambers ECMWF 13.09.94
+C Add NONOFF and NOABORT, use grbcom.h
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C Use GRSDEF routine for default setting.
+C
+C J. Clochard, Meteo France, for ECMWF - June 1999.
+C Use a static variable to determine if initialisation of
+C default values has already been done for common area
+C variables.
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grbcom.h"
+C
+ REAL PREF
+C
+ LOGICAL LFIRST
+ SAVE LFIRST
+C
+ DATA LFIRST / .TRUE. /
+C
+C ----------------------------------------------------------------
+C* Section 1 . Set values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C If common area variables have not been set, start by
+C setting default values.
+C
+ IF (LFIRST) THEN
+C
+C Common area variables may have not been set, so start by
+C trying to set default values.
+C
+ CALL GRSDEF
+ LFIRST=.FALSE.
+C
+ ENDIF
+C
+C
+C Set reference value to required value.
+C
+ FREF = PREF
+C
+C Reference value supplied by user flag. Set to on.
+C
+ NFREF = 1
+C
+C ----------------------------------------------------------------
+C* Section 9 . Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/gribex/grsrnd.F b/gribex/grsrnd.F
new file mode 100755
index 0000000..01b22bf
--- /dev/null
+++ b/gribex/grsrnd.F
@@ -0,0 +1,143 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE GRSRND (KRND)
+C
+C---->
+C**** GRSRND - Set GRIB code rounding/no rounding for routine GRIBEX.
+C
+C Purpose.
+C --------
+C
+C Switch GRIB length rounding on/off for routine GRIBEX.
+C
+C** Interface.
+C ----------
+C
+C CALL GRSRND (KRND)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KRND - Value checking switch.
+C 0 , No rounding.
+C Non-zero , Values rounded.
+C
+C Output Parameters.
+C ------------------
+C
+C GRSDEF - Default setting of global variables.
+C
+C Method.
+C -------
+C
+C The variable NRND is set in the common area. All other
+C parameters are also set to default values, if they have
+C not already been set by the user.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C See subroutine GRIBEX.
+C
+C Comments.
+C ---------
+C
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 25.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 28.08.91
+C Changes to some comments only.
+C
+C J. Hennessy ECMWF 14.11.91
+C Changes to common area.
+C
+C J. Hennessy ECMWF 07.01.92
+C Input parameter returned unchanged.
+C
+C J.D.Chambers ECMWF 13.09.94
+C Add NONOFF and NOABORT, use grbcom.h
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C Use GRSDEF routine for default setting.
+C
+C J. Clochard, Meteo France, for ECMWF - June 1999.
+C Use a static variable to determine if initialisation of
+C default values has already been done for common area
+C variables.
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grbcom.h"
+C
+ INTEGER KRND
+C
+ INTEGER IRND
+C
+ LOGICAL LFIRST
+ SAVE LFIRST
+C
+ DATA LFIRST / .TRUE. /
+C
+C ----------------------------------------------------------------
+C* Section 1 . Set values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IRND = 0
+ IF (KRND.NE.0) IRND = 1
+C
+ IF (LFIRST) THEN
+C
+C Common area variables may have not been set, so start by
+C trying to set default values.
+C
+ CALL GRSDEF
+ LFIRST=.FALSE.
+C
+ ENDIF
+C
+C Set rounding to 120 bytes to required value.
+C
+ NRND = IRND
+C
+C ----------------------------------------------------------------
+C* Section 9 . Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/gribex/grsubc.F b/gribex/grsubc.F
new file mode 100755
index 0000000..f181c57
--- /dev/null
+++ b/gribex/grsubc.F
@@ -0,0 +1,133 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRSUBC ( KSUBCE )
+C
+C---->
+C**** GRSUBC - controls use of SUB-Centre number use for ECMWF fields.
+C
+C Purpose.
+C --------
+C
+C Sub-centre use for ECMWF fields encoding switch set on or off
+C for routine GRIBEX.
+C
+C
+C** Interface.
+C ----------
+C
+C CALL GRSUBC ( KSUBCE )
+C
+C
+C Input Parameter.
+C ----------------
+C
+C KSUBCE - Sub-centre use for ECMWF fields encoding switch flag,
+C = 0 , only explicit values allowed (default)
+C = Non-zero , all valid octet values allowed .
+C
+C (Use for encoding type functions)
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C
+C Method.
+C -------
+C
+C The variable NSUBCE is set in the common area. All other
+C parameters are also set to default values, if they have
+C not already been set by the user.
+C
+C
+C Externals.
+C ----------
+C
+C GRSDEF - Default setting of global variables.
+C
+C
+C Reference.
+C ----------
+C
+C See subroutine GRIBEX.
+C
+C
+C Comments.
+C ---------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C J. Clochard, Meteo France, for ECMWF - June 1999.
+C
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grbcom.h"
+C
+C Subroutine arguments.
+ INTEGER KSUBCE
+C
+C Local variables.
+ INTEGER ISUBCE
+C
+ LOGICAL LFIRST
+ SAVE LFIRST
+C
+ DATA LFIRST / .TRUE. /
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 1 . Set values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ ISUBCE = 0
+ IF (KSUBCE.NE.0) ISUBCE = 1
+C
+ IF (LFIRST) THEN
+C
+C Common area variables may have not been set, so start by
+C trying to set default values.
+C
+ CALL GRSDEF
+ LFIRST=.FALSE.
+C
+ ENDIF
+C
+C Set sub-centre use for ECMWF fields encoding switch
+C to required value.
+C
+ NSUBCE = ISUBCE
+C
+C ----------------------------------------------------------------
+C* Section 9 . Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/grsvck.F b/gribex/grsvck.F
new file mode 100755
index 0000000..b8f5aeb
--- /dev/null
+++ b/gribex/grsvck.F
@@ -0,0 +1,142 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRSVCK (KVCK)
+C
+C---->
+C**** GRSVCK - Set GRIB code parameter value check for routine GRIBEX.
+C
+C Purpose.
+C --------
+C
+C Switch parameter value checking on/off for routine GRIBEX.
+C
+C** Interface.
+C ----------
+C
+C CALL GRSVCK (KVCK)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KVCK - Value checking switch.
+C 0 , No checking.
+C Non-zero , Values checked.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C The variable NVCK is set in the common area. All other
+C parameters are also set to default values, if they have
+C not already been set by the user.
+C
+C Externals.
+C ----------
+C
+C GRSDEF - Default setting of global variables.
+C
+C Reference.
+C ----------
+C
+C See subroutine GRIBEX.
+C
+C Comments.
+C ---------
+C
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 25.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 28.08.91
+C Changes to some comments only.
+C
+C J. Hennessy ECMWF 14.11.91
+C Chnages to common area.
+C
+C J. Hennessy ECMWF 30.01.92
+C Input parameter returned unchanged.
+C
+C J.D.Chambers ECMWF 13.09.94
+C Add NONOFF and NOABORT, use grbcom.h
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C Use GRSDEF routine for default setting.
+C
+C J. Clochard, Meteo France, for ECMWF - June 1999.
+C Use a static variable to determine if initialisation of
+C default values has already been done for common area
+C variables.
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grbcom.h"
+C
+ INTEGER KVCK
+C
+ INTEGER IVCK
+C
+ LOGICAL LFIRST
+ SAVE LFIRST
+C
+ DATA LFIRST / .TRUE. /
+C
+C ----------------------------------------------------------------
+C* Section 1 . Set values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IVCK = 0
+ IF (KVCK.NE.0) IVCK = 1
+C
+ IF (LFIRST) THEN
+C
+C Common area variables may have not been set, so start by
+C trying to set default values.
+C
+ CALL GRSDEF
+ LFIRST=.FALSE.
+C
+ ENDIF
+C
+C Set GRIB value checking to required value.
+C
+ NVCK = IVCK
+C
+C ----------------------------------------------------------------
+C* Section 9 . Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/gribex/grsx2o.F b/gribex/grsx2o.F
new file mode 100755
index 0000000..99ca208
--- /dev/null
+++ b/gribex/grsx2o.F
@@ -0,0 +1,136 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GRSX2O ( KEXT2O )
+C
+C---->
+C**** GRSX2O - controls use of eXTended 2nd-Order packing methods
+C for routine GRIBEX.
+C
+C Purpose.
+C --------
+C
+C Extended 2nd-order methods switch set on or off
+C for routine GRIBEX.
+C
+C
+C** Interface.
+C ----------
+C
+C CALL GRSX2O ( KEXT2O )
+C
+C
+C Input Parameter.
+C ----------------
+C
+C KEXT2O - Extended 2nd-order methods switch flag,
+C = 0 , not allowed (default)
+C = Non-zero , extended methods allowed.
+C
+C (Use for grid-point encoding, HOPER='C' and 'K' functions)
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C
+C Method.
+C -------
+C
+C The variable NEXT2O is set in the common area. All other
+C parameters are also set to default values, if they have
+C not already been set by the user.
+C
+C
+C Externals.
+C ----------
+C
+C GRSDEF - Default setting of global variables.
+C
+C
+C Reference.
+C ----------
+C
+C See subroutine GRIBEX.
+C
+C
+C Comments.
+C ---------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C
+C
+C Modifications.
+C --------------
+C
+C J. Clochard, Meteo France, for ECMWF - June 1999.
+C Use a static variable to determine if initialisation of
+C default values has already been done for common area variables.
+C
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grbcom.h"
+C
+C Subroutine arguments.
+ INTEGER KEXT2O
+C
+C Local variables.
+ INTEGER IEXT2O
+C
+ LOGICAL LFIRST
+ SAVE LFIRST
+C
+ DATA LFIRST / .TRUE. /
+C
+C ----------------------------------------------------------------
+C* Section 1 . Set values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IEXT2O = 0
+ IF (KEXT2O.NE.0) IEXT2O = 1
+C
+ IF (LFIRST) THEN
+C
+C Common area variables may have not been set, so start by
+C trying to set default values.
+C
+ CALL GRSDEF
+ LFIRST=.FALSE.
+C
+ ENDIF
+C
+C Set exhaustive 2nd-order aggressive packing switch
+C to required value.
+C
+ NEXT2O = IEXT2O
+C
+C ----------------------------------------------------------------
+C* Section 9 . Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/gsbite.F b/gribex/gsbite.F
new file mode 100755
index 0000000..13aeb05
--- /dev/null
+++ b/gribex/gsbite.F
@@ -0,0 +1,292 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+#if (defined CRAY) || (defined __uxp__ ) || (defined IBM_POWER4) || (defined rs6000) || (defined NECSX) || (defined POWERPC)
+ SUBROUTINE GSBITE (KS,KD,KSKST,KSIZE,KSKBTW,K,KBPW,KMASK,HADIR)
+C
+C---->
+C**** GSBITE - Extraction/insertion of bits from/to bitstream on Cray.
+C
+C Purpose.
+C --------
+C
+C Vectorising extraction/insertion of bits from/to bitstream.
+C
+C** Interface.
+C ----------
+C
+C CALL GSBITE (KS,KD,KSKST,KSIZE,KSKBTW,K,KBPW,KMASK,HADIR)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KS - If HADIR='D', input bit stream, else output bit stream.
+C KD - If HADIR='D', output words, else input words.
+C KSKST - Number of bits skipped at beginning of KS.
+C KSIZE - Number of bits to be extracted to one word of KD.
+C KSKBTW - Number of bits skipped between 2 words to be extracted.
+C K - Number of words to be extracted into KD. If less than
+C or equal to 0 only calculate KBPW and KMASK.
+C KBPW - Number of bits per word in KS,calculated if 0.
+C KMASK - Masks for bit patterns, calculated if KMASK(2) is 0.
+C (KMASK must have dimension KBPW+1)
+C HADIR - Direction of conversion: 'D' for decoding, ie
+C extract words KD(1...K) from bits KS(KSKST+1....)
+C If not 'D', encode, i.e. pack words KD(1....K) into
+C bits KS(KSKST+1.....KSKST+K*(KSIZE+KSKBTW))
+C
+C
+C Output Parameters.
+C ------------------
+C
+C KS,KD - See above.
+C KSKST - Updated to number of bits used, i.e. to
+C KSKST+K*(KSIZE+KSKBTW)
+C KBPW - If 0 on input, number of bits in each word of KS.
+C KMASK - If KMASK(2) was 0 on input, bit pattern masks.
+C (KMASK must have dimension KBPW+1)
+C
+C
+C Method.
+C -------
+C
+C Vector loop is over repeatedly occurring bit patterns.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C ---------
+C
+C This routine is for vector processors only.
+C
+C
+C Author.
+C -------
+C
+C G.J.Cats 08 Dec 87
+C
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 09.09.91
+C Introductory comments changed to conform to standard.
+C
+C J.D.Chambers ECMWF 05.01.95
+C Put in fixes suggested by G.Cats (Dec. 95) for:
+C i) "Number of words to be extracted = 0"
+C ii) Optimise test for encode/decode in loop by using logical.
+C iii) Intialise ISTS before use.
+C
+C J.D.Chambers ECMWF 22.05.96
+C Defines to remove inline functions except on CRAY
+C (The Fujitsu doesn't need them).
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C Use intrinsic functions on CRAY.
+C
+C
+C ------------------------------------------------------------------
+C----<
+C
+ DIMENSION KS(*),KD(*),KMASK(*)
+ CHARACTER*1 HADIR
+ LOGICAL LODECD
+C
+C 1. COMPLETE KBPW AND KMASK, RETURN IF 0 WORDS ARE TO BE EXTRACTED
+C
+ IF(KBPW.EQ.0) THEN
+ IS = KS(1)
+ KS(1) = 1
+ 1101 CONTINUE
+ IF(KS(1).NE.0) THEN
+ KBPW = KBPW + 1
+ KS(1) = ISHFT(KS(1),1)
+ GOTO 1101
+ ENDIF
+ KS(1) = IS
+ ENDIF
+ IF(KMASK(2).EQ.0) THEN
+ KMASK(KBPW+1) = 0
+ DO 1110 J = KBPW,1,-1
+ KMASK(J) = IBSET(KMASK(J+1),KBPW-J)
+ 1110 CONTINUE
+ ENDIF
+ IF(K.LE.0)RETURN
+C
+C 2. PRESET KD TO 0 IF KD IS OUTPUT I.E. WHEN DECODING
+C
+ LODECD = HADIR .EQ. 'D'
+ IF (LODECD) THEN
+ DO 2101 J = 1,K
+ KD(J) = 0
+ 2101 CONTINUE
+ ENDIF
+ IF(KSIZE.LE.0) RETURN
+C
+C 3. CALCULATE SEVERAL PARAMETERS FOR LOOPING (FOR EFFICIENCY, THE
+C CODE OF SECTIONS 3.3 AND 3.4 FOR K=1 IS SEPARATED INTO 3.2)
+C
+C 3.1 NUMBER OF BITS USED PER WORD, INITIAL NR OF SKIPPED BITS
+C
+ ISTEP = KSIZE + KSKBTW
+ ISKWS = KSKST
+C
+C 3.2 VECTOR LOOP LENGTH AND STEP SIZE IN KD IF K=1;KS STEP IRRELVNT
+C
+ IF(K.EQ.1) THEN
+ ILL = 1
+ IBDL = 2
+ ISTD = 1
+ ISTS = 1
+ ELSE
+C
+C 3.3 STEP SIZES IN KS,KD: INVERSE OF LARGEST FACTOR OF ISTEP,KBPW
+C
+ ILCF = KBPW
+ ISHF = ISTEP
+ 331 CONTINUE
+ IF(ILCF.EQ.ISHF) GOTO 332
+ IF(ILCF.EQ.1) GOTO 332
+ IF(ILCF.GT.ISHF) THEN
+ ILCF = ILCF - ISHF
+ ELSE
+ ISHF = ISHF - ILCF
+ ENDIF
+ GOTO 331
+ 332 CONTINUE
+ ISTD = KBPW/ILCF
+ ISTS = ISTEP/ILCF
+C
+C 3.4 VECTOR LOOP LENGTH AND SWITCH-OVER POINT FOR SMALLER LOOP
+C
+ ILL = (K-1)/ISTD + 1
+ IBDL = K - (ILL-1)*ISTD
+ ENDIF
+C
+C 4. LOOP OVER FIRST ISTD WORDS OF KD (TRAILS THE VECTOR LOOP)
+C
+ DO 790 JBD = 1,ISTD
+C
+C 4.1 LAST BIT IN KS TO BE TREATED
+C
+ IENBS = ISKWS + KSIZE
+C
+C 4.2 NR OF WORDS OF KS TO BE SKIPPED, NR OF BITS IN THOSE AND
+C THIS
+C
+ ISKW = ISKWS/KBPW
+ ISTA = ISKW*KBPW
+ ISKB = ISKWS - ISTA
+C
+C 4.3 MASK AND LEFT SHIFT FOR THE REMAINING BITS
+C
+ IMASK = KMASK(ISKB+1)
+ ISH = KSIZE + ISKB
+C
+C 4.4 POSITION OF CURRENT WORD OF KS
+C
+ IBS = ISKW + 1
+C
+C 5. LOOP OVER WORDS OF KS CONTRIBUTING TO ONE WORD OF KD
+C
+ 500 CONTINUE
+C
+C 5.1 UPDATE SHIFT AND LAST BIT IN CURRENT WORD
+C
+ ISH = ISH - KBPW
+ IEND = ISTA + KBPW
+C
+C 5.2 IS LAST BIT OF CURRENT WORD OUTSIDE RANGE TO BE EXTRACTED
+C
+ IF(IEND.GT.IENBS) THEN
+ ISH = IENBS - IEND
+ IMASK = IAND(IMASK,NOT(KMASK(KBPW+ISH+1)))
+ ENDIF
+C
+C 5.3 INITIAL OFFSETS FOR VECTOR ELEMENTS IN VECTOR LOOP
+C
+ IOS = 0
+ IOD = 0
+C
+C 6. VECTOR LOOP IS OVER REPEATEDLY OCCURRING BITPATTERNS/MASKS
+C
+ IF (LODECD) THEN
+Cjdc#ifdef CRAY
+CDIR$ IVDEP
+!cdir nodep
+ DO 611 JI = 1,ILL
+ KD(JBD+IOD) =
+ X IOR(KD(JBD+IOD),ISHFT(IAND(IMASK,KS(IBS+IOS)),ISH))
+ IOD = IOD + ISTD
+ IOS = IOS + ISTS
+ 611 CONTINUE
+Cjdc#else
+!OCL NOVREC
+Cjdc CALL GSDECODE( KS(IBS), KD(JBD), ISTS, ISTD, ILL, IMASK, ISH )
+Cjdc#endif
+ ELSE
+Cjdc#ifdef CRAY
+CDIR$ IVDEP
+!OCL NOVREC
+!cdir nodep
+ DO 612 JI = 1,ILL
+ KS(IBS+IOS) = IOR(
+ X IAND( KS(IBS+IOS), NOT(IMASK)),
+ X IAND(ISHFT(KD(JBD+IOD),-ISH), IMASK ))
+ IOD = IOD + ISTD
+ IOS = IOS + ISTS
+ 612 CONTINUE
+Cjdc#else
+Cjdc CALL GSENCODE( KD(JBD), KS(IBS), ISTD, ISTS, ILL, IMASK, ISH )
+Cjdc#endif
+ ENDIF
+C
+C 7. END LOOPS
+C
+C 7.1 PREPARE FOR END OF LOOP OVER WORDS OF KS WITIHN ONE KD WORD
+C
+ ISTA = ISTA + KBPW
+C
+C 7.2 NEXT WORD OF KD IF EXTRACTION NOT COMPLETED
+C
+ IF(ISTA.LT.IENBS) THEN
+ IMASK = KMASK(1)
+ IBS = IBS + 1
+ GOTO 500
+ ENDIF
+C
+C 7.8 PREPARE FOR END OF LOOP OVER FIRST WORDS OF KD
+C
+ IF(JBD.EQ.IBDL)ILL = ILL - 1
+ ISKWS = ISKWS + ISTEP
+C
+C 7.9 END LOOP OVER FIRST WORDS OF KD
+C
+ 790 CONTINUE
+C
+C 8. FINISHED: UPDATE KSKST AND RETURN
+C
+ KSKST = KSKST + K*ISTEP
+C
+ RETURN
+ END
+#endif
diff --git a/gribex/gscale.F b/gribex/gscale.F
new file mode 100755
index 0000000..4401795
--- /dev/null
+++ b/gribex/gscale.F
@@ -0,0 +1,255 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION GSCALE( PDATA, KTRUNC, KSTART, IPOWER, HOPT)
+C
+C---->
+C**** GSCALE
+C
+C Purpose.
+C --------
+C
+C Pre- or post-scales spherical harmonic coefficents in GRIB scaling
+C and packing.
+C
+C
+C** Interface.
+C ----------
+C
+C IRET = GSCALE(PDATA, KTRUNC, KSTART, IPOWER, HOPT)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C PDATA - Array of floating point values.
+C KTRUNC - Truncation of the spherical harmonic coefficients.
+C KSTART - Number indicating truncation after which to start.
+C IPOWER - Power to use when scaling coefficients(*1000).
+C HOPT - Selects pre- or post scaling
+C = 'I' for pre-scaling
+C = 'O' for post-scaling
+C
+C
+C Output Parameters.
+C -----------------
+C
+C PDATA - Array with values changed.
+C
+C
+C Method.
+C -------
+C
+C <-- n --> (n = 0 to m)
+C
+C <KSTART>|
+C
+C Given numbers: cccccccc|cccccc ^
+C cccccc|cccccc |
+C cccc|cccccc |
+C cc|cccccc m (m = 0 to KTRUNC)
+C |cccccc |
+C cccc |
+C cc v
+C
+C
+C Operates on values : |cccccc
+C |cccccc
+C |cccccc
+C |cccccc
+C |cccccc
+C cccc
+C cc
+C
+C
+C
+C A scale factor is applied to the values. The factor is
+C
+C n(n+1)^^p for pre-scaling
+C 1 / n(n+1)^^p for post-scaling
+C
+C where p = IPOWER/1000.
+C
+C
+C Externals.
+C ----------
+C
+C None
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 20:04:94
+C
+C
+C Modifications.
+C _____________
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C Call to FLOAT replaced by REAL.
+C
+C J.D.Chambers ECMWF July 2000
+C Run loops calculating power factors in SCALAR on VPPs to
+C eliminate differences due to vetorisation.
+C
+C S.Curic ECMWF April 2005
+C Change value of JPMXTRC in order to handle truncation T2047
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JPBYTES, JPMXTRC
+#ifdef REAL_8
+ PARAMETER (JPBYTES = 8)
+#else
+ PARAMETER (JPBYTES = 4)
+#endif
+ PARAMETER (JPMXTRC = 2048)
+C
+C Subroutine arguments
+C
+ INTEGER KTRUNC, KSTART, IPOWER
+ REAL PDATA
+ DIMENSION PDATA(*)
+ CHARACTER*1 HOPT
+C
+C Local variables.
+C
+ INTEGER N, M, INDEX
+ REAL FACTOR, POWER
+ DIMENSION FACTOR(JPMXTRC)
+C
+C Externals
+C
+C -----------------------------------------------------------------|
+C* Section 1 . Check for valid truncation and start values.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ GSCALE = 0
+ IF( (IPOWER.LT.-10000).OR.(IPOWER.GT.10000) ) THEN
+ WRITE(GRPRSM,*) ' GSCALE - Invalid power given = ', IPOWER
+ GSCALE = 16600
+ GOTO 900
+ ENDIF
+C
+ IF( (KTRUNC.LT.0).OR.(KTRUNC.GT.JPMXTRC) ) THEN
+ WRITE(GRPRSM,*) ' GSCALE - cannot handle truncation = ', KTRUNC
+ GSCALE = 16601
+ GOTO 900
+ ENDIF
+C
+ IF( (HOPT.NE.'I').AND.(HOPT.NE.'O') ) THEN
+ WRITE(GRPRSM,*) ' GSCALE - Invalid option given = ', HOPT
+ GSCALE = 16602
+ GOTO 900
+ ENDIF
+C
+ IF( KSTART.GT.KTRUNC ) THEN
+ WRITE(GRPRSM,*) ' GSCALE - Invalid start/truncation given'
+ WRITE(GRPRSM,*) ' GSCALE - KSTART, KTRUNC =', KSTART, KTRUNC
+ GSCALE = 16603
+ GOTO 900
+ ENDIF
+C
+C Setup scaling factors = n(n+1)^^p, for n = 1 to KTRUNC
+C
+ IF( IPOWER.EQ.0 ) GOTO 900
+ POWER = REAL(IPOWER) / 1000.0
+ FACTOR(1) = 1.0
+C
+C 'I' option -> multiply by the factors
+C 'O' option -> divide by the factors
+C
+ IF( HOPT.EQ.'I' ) THEN
+#ifdef FUJITSU
+!OCL SCALAR
+#endif
+ DO N = 1 , KTRUNC
+ IF( IPOWER.NE.1000 ) THEN
+ FACTOR(N+1) = REAL(N * (N+1) )**POWER
+ ELSE
+ FACTOR(N+1) = REAL(N * (N + 1))
+ ENDIF
+ ENDDO
+ ELSE
+#ifdef FUJITSU
+!OCL SCALAR
+#endif
+ DO N = 1 , KTRUNC
+ IF( IPOWER.NE.1000 ) THEN
+ FACTOR(N+1) = 1.0 / REAL(N * (N+1) )**POWER
+ ELSE
+ FACTOR(N+1) = 1.0 / REAL(N * (N + 1))
+ ENDIF
+ ENDDO
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2 . Scale the values.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Handle values 2 at a time (real and imaginary parts)
+C
+ INDEX = -1
+ DO M = 0 , KSTART-1
+ DO N = M , KTRUNC
+ INDEX = INDEX + 2
+ IF( N.GE.KSTART ) THEN
+ PDATA(INDEX) = PDATA(INDEX) * FACTOR(N+1)
+ PDATA(INDEX+1) = PDATA(INDEX+1) * FACTOR(N+1)
+ ENDIF
+ ENDDO
+ ENDDO
+C
+ DO M = KSTART , KTRUNC
+ DO N = M , KTRUNC
+ INDEX = INDEX + 2
+ PDATA(INDEX) = PDATA(INDEX) * FACTOR(N+1)
+ PDATA(INDEX+1) = PDATA(INDEX+1) * FACTOR(N+1)
+ ENDDO
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return to calling routine.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/handleLocalDefinitions.c b/gribex/handleLocalDefinitions.c
new file mode 100755
index 0000000..2a9198f
--- /dev/null
+++ b/gribex/handleLocalDefinitions.c
@@ -0,0 +1,1601 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "handleLocalDefinitions.h"
+#include "grib_int_t.h"
+
+#define FREE_NOT_NULL(a) if((a)!=NULL) free((a))
+
+void releaseAction(action* a) {
+action* current = a;
+action* previous;
+
+ while (current != NULL) {
+ FREE_NOT_NULL((char*)current->description);
+ FREE_NOT_NULL((char*)current->octet);
+ FREE_NOT_NULL((char*)current->code);
+ FREE_NOT_NULL((char*)current->ksec1);
+ FREE_NOT_NULL((char*)current->count);
+ previous = current;
+ current = current->next;
+ FREE_NOT_NULL(previous);
+ }
+
+ return;
+}
+
+void init(
+ action* first,
+ action* a,
+ char* description,
+ char* octet,
+ char* code,
+ char* ksec1,
+ char* count) {
+/*
+// Copies the text fields describing the action
+*/
+ memset(a,0,sizeof(*a));
+ a->description = strdup(description);
+ if( (a->description) == NULL ) {
+ perror("init: strdup failed");
+ exit(1);
+ }
+ a->octet = strdup(octet);
+ if( (a->octet) == NULL ) {
+ perror("init: strdup failed");
+ exit(1);
+ }
+ a->code = strdup(code);
+ if( (a->code) == NULL ) {
+ perror("init: strdup failed");
+ exit(1);
+ }
+ a->ksec1 = strdup(ksec1);
+ if( (a->ksec1) == NULL ) {
+ perror("init: strdup failed");
+ exit(1);
+ }
+ a->count = strdup(count);
+ if( (a->count) == NULL ) {
+ perror("init: strdup failed");
+ exit(1);
+ }
+ return;
+}
+
+action* packNOOP(action* a,buffer *b) { return a->next; }
+
+action* unpackNOOP(action* a,buffer *b) { return a->next; }
+
+grib_int_t stringIsNotANumber(const char * count) {
+grib_int_t loop;
+
+ for( loop = 0; loop < strlen(count); loop++ )
+ if( ! isdigit(*(count+loop)) ) return 1;
+
+ return 0;
+}
+
+/*==========================================================*/
+
+void updateOffsets(action* a,buffer* b,grib_int_t* numberOfValues) {
+/*
+// Updates current values of packed byte offset and unpacked
+// integer value offset and count when the local definition
+// description has a value in the appropriate column.
+*/
+unsigned char* octetValue;
+grib_int_t* ksec1Value;
+
+ if( ! stringIsNotANumber(a->count) )
+ *numberOfValues = atol(a->count);
+
+ if( ! stringIsNotANumber(a->octet) ) {
+ octetValue = (b->startOctets)+atol(a->octet)-OCTETSTART;
+ (b->packed) = octetValue;
+ }
+
+ if( ! stringIsNotANumber(a->ksec1) ) {
+ ksec1Value = (b->startKsec1)+atol(a->ksec1)-KSEC1START;
+ (b->values) = ksec1Value;
+ }
+
+ return;
+}
+
+action* packPADMULT(action* a,buffer *b) {
+/*
+// Pad buffer with zeroes upto a multiple of 'count' bytes
+*/
+grib_int_t count, loop;
+grib_int_t multiple = atol(a->count);
+grib_int_t startOctet = atol(a->octet);
+
+ count = (int)((b->packed)-(b->startOctets)) -(startOctet-OCTETSTART);
+ count = ((count + multiple - 1)/multiple)*multiple - count;
+ if( count == 0 ) count = multiple;
+
+ for( loop = 0; loop < count; loop++ ) *(b->packed)++ = 0;
+
+ b->totalPackedBytes += count;
+ b->packed += count;
+ b->totalUnPackedBytes += count;
+ return a->next;
+}
+
+action* unpackPADMULT(action* a,buffer *b) {
+grib_int_t count, loop;
+grib_int_t multiple = atol(a->count);
+grib_int_t startOctet = atol(a->octet);
+
+ count = (int)((b->packed)-(b->startOctets)) -(startOctet-OCTETSTART);
+ count = ((count + multiple - 1)/multiple)*multiple - count;
+ if( count == 0 ) count = multiple;
+
+ b->totalUnPackedBytes += count;
+ b->packed += count;
+
+ return a->next;
+}
+
+action* packPADFROM(action* a,buffer *b) {
+/*
+// Pad buffer with zeroes upto a multiple of 'count' bytes
+// starting from byte 'octet'
+*/
+grib_int_t count, loop;
+grib_int_t multiple = atol(a->count);
+grib_int_t startByte = atol(a->octet);
+
+ count = (int)((b->packed)-(b->startOctets)+OCTETSTART-1-startByte);
+ count = ((count + multiple - 1)/multiple)*multiple - count;
+
+ for( loop = 0; loop < count; loop++ ) *(b->packed)++ = 0;
+
+ b->totalPackedBytes += count;
+ return a->next;
+}
+
+action* unpackPADFROM(action* a,buffer *b) {
+/*
+// Skip padding in buffer upto a multiple of 'count' bytes
+// starting from byte 'octet'
+*/
+grib_int_t count;
+grib_int_t multiple = atol(a->count);
+grib_int_t startByte = atol(a->octet);
+
+ count = (grib_int_t)((b->packed)-(b->startOctets)) +
+ OCTETSTART - 1 -startByte;
+ while( count > 0 ) {
+ count -= multiple;
+ }
+ count = -count;
+
+ b->totalUnPackedBytes += count;
+ (b->packed) += count;
+
+ return a->next;
+}
+
+action* packUP_TO(action* a,buffer *b, unsigned char character) {
+/*
+// Pad buffer with 'characters's upto given byte
+*/
+grib_int_t count = 0, loop;
+
+ updateOffsets(a,b,&count);
+
+ if( count != 0 ) {
+
+ count = atoi(a->count) - (int)((b->packed)-(b->startOctets)+OCTETSTART-1);
+
+ for( loop = 0; loop < count; loop++ ) *(b->packed)++ = character;
+
+ b->totalPackedBytes += count;
+ }
+ return a->next;
+}
+
+action* packSP_TO(action* a,buffer *b) {
+/*
+// Pad buffer with spaces upto given byte
+*/
+ return packUP_TO(a,b,' ');
+}
+
+action* unpackSP_TO(action* a,buffer *b) {
+grib_int_t count = 0, loop;
+
+ updateOffsets(a,b,&count);
+ b->totalUnPackedBytes = count + 1 - OCTETSTART;
+ b->packed = b->startOctets + count + 1 - OCTETSTART;
+
+ return a->next;
+}
+
+
+
+action* packPADTO(action* a,buffer *b) {
+/*
+// Pad buffer with zeroes upto given byte
+*/
+ return packUP_TO(a,b,'\0');
+}
+
+action* unpackPADTO(action* a,buffer *b) {
+grib_int_t count = 0, loop;
+
+ updateOffsets(a,b,&count);
+ b->totalUnPackedBytes = count + 1 - OCTETSTART;
+ b->packed = b->startOctets + count + 1 - OCTETSTART;
+
+ return a->next;
+}
+
+action* packBYTES(action* a,buffer *b) {
+/*
+// Fill buffer with a string of bytes
+*/
+grib_int_t count, numberOfBytes, numberOfValues;
+
+ if( stringIsNotANumber(a->count) )
+ numberOfBytes = (a->reference->value);
+ else
+ numberOfBytes = atoi(a->count);
+
+ numberOfValues = (numberOfBytes+sizeof(grib_int_t)-1) / sizeof(grib_int_t);
+
+ updateOffsets(a,b,&count);
+
+ memcpy((b->packed),(b->values),numberOfBytes);
+
+ (b->packed) += numberOfBytes;
+ (b->values) += numberOfValues;
+
+ b->totalPackedBytes += numberOfBytes;
+ return a->next;
+}
+
+action* unpackBYTES(action* a,buffer *b) {
+/*
+// Unpack a string of bytes from buffer
+*/
+grib_int_t count, numberOfBytes, numberOfValues;
+
+ if( stringIsNotANumber(a->count) )
+ numberOfBytes = (a->reference->value);
+ else
+ numberOfBytes = atoi(a->count);
+
+ numberOfValues = (numberOfBytes+sizeof(grib_int_t)-1) / sizeof(grib_int_t);
+
+ updateOffsets(a,b,&count);
+
+ memcpy((b->values),(b->packed),numberOfBytes);
+
+ (b->packed) += numberOfBytes;
+ (b->values) += numberOfValues;
+
+ b->totalUnPackedBytes += numberOfBytes;
+ b->totalUnPackedValues += numberOfValues;
+
+ return a->next;
+}
+
+action* packF1(action* a,buffer *b) {
+/*
+// Pack a flag (=1) into buffer
+*/
+grib_int_t count;
+grib_int_t* flag;
+
+ flag = (grib_int_t*) malloc(sizeof(grib_int_t));
+ if( flag == NULL ) {
+ perror("packF1: malloc failed in packF1");
+ exit(1);
+ }
+
+ *flag = atol(a->count);
+ (a->value) = *flag;
+ updateOffsets(a,b,&count);
+
+ MOVE1BYTE((b->packed),flag);
+ (b->packed)++;
+
+ b->totalPackedBytes++;
+ return a->next;
+}
+
+action* packD3(action* a,buffer *b) {
+/*
+// Pack a 3-byte date modified by 19000000 if necessary
+// (see definitions 6 and 17)
+*/
+grib_int_t numberOfValues = 1, loop;
+grib_int_t date;
+
+ updateOffsets(a,b,&numberOfValues);
+/*
+// Save values which may be loop count and/or a running summation in a list
+*/
+ (a->value) = *(b->values);
+/*
+//(a->sum) += *(b->values);
+*/
+
+ for( loop = 0; loop < numberOfValues; loop++ ) {
+ date = *(b->values)++;
+ if( date > 19000000 ) date -= 19000000;
+ MOVE3BYTES((b->packed),&date);
+ (b->packed) += 3;
+ }
+
+ b->totalPackedBytes += numberOfValues*3;
+ return a->next;
+}
+
+action* unpackD3(action* a,buffer *b) {
+/*
+// Unpack a 3-byte date modified by 19000000 if necessary
+// (see definitions 6 and 17)
+*/
+grib_int_t numberOfValues = 1, loop;
+grib_int_t date;
+
+ updateOffsets(a,b,&numberOfValues);
+
+ for( loop = 0; loop < numberOfValues; loop++ ) {
+ date = THREE_BYTE_INT((b->packed));
+ if( (date < 19000000) && (date > 100 ) ) date += 19000000;
+ *(b->values) = date;
+ (b->packed) += 3;
+ b->totalUnPackedBytes += 3;
+ (b->values)++;
+ }
+/*
+// Save value which is a loop count
+*/
+ if( numberOfValues > 1 )
+ (a->value) = numberOfValues;
+ else
+ (a->value) = date;
+ (a->sum) += *(b->values);
+
+ b->totalUnPackedValues += numberOfValues;
+ return a->next;
+}
+
+action* packSn(action* a,buffer *b, grib_int_t n) {
+/*
+// Pack a signed n-byte value
+// Negative values are stored as a positive value with the most significant
+// bit set to 1
+*/
+grib_int_t numberOfValues = 1, loop;
+grib_int_t value;
+
+ updateOffsets(a,b,&numberOfValues);
+
+ for( loop = 0; loop < numberOfValues; loop++ ) {
+ value = *(b->values)++;
+ switch( (int) n ) {
+ case 1:
+ if( value < 0 ) value = - (value & 0x7f);
+ MOVE1BYTE((b->packed),&value);
+ break;
+ case 2:
+ if( value < 0 ) value = - (value & 0x7fff);
+ MOVE2BYTES((b->packed),&value);
+ break;
+ case 3:
+ if( value < 0 ) value = - (value & 0x7fffff);
+ MOVE3BYTES((b->packed),&value);
+ break;
+ case 4:
+ if( value < 0 ) value = - (value & 0x7fffffff);
+ MOVE4BYTES((b->packed),&value);
+ break;
+ default:
+ fprintf(stderr,"packSn: %d not yet handled\n",n);
+ exit(1);
+ }
+ (b->packed) += n;
+ }
+
+ b->totalPackedBytes += numberOfValues*n;
+ return a->next;
+}
+
+action* packS1(action* a,buffer *b) { return packSn(a,b,1); }
+
+action* packS2(action* a,buffer *b) { return packSn(a,b,2); }
+
+action* packS3(action* a,buffer *b) { return packSn(a,b,3); }
+
+action* packS4(action* a,buffer *b) { return packSn(a,b,4); }
+
+
+action* unpackSn(action* a,buffer *b, grib_int_t n) {
+/*
+// Unpack a signed n-byte value
+// Negative values are stored as a positive value with the most significant
+// bit set to 1
+*/
+grib_int_t numberOfValues = 1, loop;
+grib_int_t value;
+
+ updateOffsets(a,b,&numberOfValues);
+
+ for( loop = 0; loop < numberOfValues; loop++ ) {
+ switch( (int) n ) {
+ case 1:
+ value = ONE_BYTE_INT((b->packed));
+ if( value & 0x80 ) value = - (value & 0x7f);
+ *(b->values) = value;
+ break;
+ case 2:
+ value = TWO_BYTE_INT((b->packed));
+ if( value & 0x8000 ) value = - (value & 0x7fff);
+ *(b->values) = value;
+ break;
+ case 3:
+ value = THREE_BYTE_INT((b->packed));
+ if( value & 0x800000 ) value = - (value & 0x7fffff);
+ *(b->values) = value;
+ break;
+ case 4:
+ value = FOUR_BYTE_INT((b->packed));
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *(b->values) = value;
+ break;
+ default:
+ fprintf(stderr,"unpackSn: %d not yet handled\n",n);
+ exit(1);
+ }
+ (b->packed) += n;
+ (b->values)++;
+ }
+ if( numberOfValues > 1 )
+ (a->value) = numberOfValues;
+ else
+ (a->value) = value;
+
+ b->totalUnPackedBytes += numberOfValues * n;
+ b->totalUnPackedValues += numberOfValues;
+
+ return a->next;
+}
+
+action* unpackS1(action* a,buffer *b) { return unpackSn(a,b,1); }
+
+action* unpackS2(action* a,buffer *b) { return unpackSn(a,b,2); }
+
+action* unpackS3(action* a,buffer *b) { return unpackSn(a,b,3); }
+
+action* unpackS4(action* a,buffer *b) { return unpackSn(a,b,4); }
+
+
+action* packIn(action* a,buffer *b, grib_int_t n) {
+/*
+// Pack an n-byte value
+*/
+grib_int_t numberOfValues = 1, loop;
+
+ updateOffsets(a,b,&numberOfValues);
+
+ for( loop = 0; loop < numberOfValues; loop++ ) {
+ switch( (int) n ) {
+ case 1:
+ MOVE1BYTE((b->packed),(b->values));
+ break;
+ case 2:
+ MOVE2BYTES((b->packed),(b->values));
+ break;
+ case 3:
+ MOVE3BYTES((b->packed),(b->values));
+ break;
+ case 4:
+ MOVE4BYTES((b->packed),(b->values));
+ break;
+ default:
+ fprintf(stderr,"packIn: %d not yet handled\n",n);
+ exit(1);
+ }
+ (b->packed) += n;
+ (b->values)++;
+ }
+
+ b->totalPackedBytes += numberOfValues*n;
+ return a->next;
+}
+
+action* packI1(action* a,buffer *b) {
+/*
+// Save values which may be loop count and/or a running summation in a list
+*/
+ (a->value) = *(b->values);
+/*
+//(a->sum) += *(b->values);
+*/
+
+ return packIn(a,b,1);
+}
+
+action* packI2(action* a,buffer *b) {
+/*
+// Save values which may be loop count and/or a running summation in a list
+*/
+ (a->value) = *(b->values);
+/*
+//(a->sum) += *(b->values);
+*/
+
+ return packIn(a,b,2);
+}
+
+action* packI3(action* a,buffer *b) {
+/*
+// Save values which may be loop count and/or a running summation in a list
+*/
+ (a->value) = *(b->values);
+/*
+//(a->sum) += *(b->values);
+*/
+
+ return packIn(a,b,3);
+}
+
+action* packI4(action* a,buffer *b) {
+/*
+// Save values which may be loop count and/or a running summation in a list
+*/
+ (a->value) = *(b->values);
+/*
+//(a->sum) += *(b->values);
+*/
+
+ return packIn(a,b,4);
+}
+
+action* packA4(action* a,buffer *b) {
+/*
+// Pack an 4-byte ASCII value
+//
+// Note: assumes that only one A4 value is being handled (count is -)
+*/
+ memcpy((b->packed),(b->values),4);
+
+ (b->packed) +=4;
+ (b->values)++;
+ b->totalPackedBytes += 4;
+
+ return a->next;
+}
+
+action* packA8(action* a,buffer *b) {
+/*
+// Pack an 8-byte ASCII value
+//
+// Note: assumes that only one A8 value is being handled (count is -)
+*/
+ memcpy((b->packed),(b->values),8);
+
+ (b->packed) +=8;
+ (b->values)++;
+ (b->values)++;
+ b->totalPackedBytes += 8;
+
+ return a->next;
+}
+
+action* packA1(action* a,buffer *b) {
+/*
+// Pack an 1-byte ASCII value
+*/
+ return packIn(a,b,1);
+}
+
+action* packPAD(action* a,buffer *b) {
+/*
+// Pack buffer with zeroes
+*/
+grib_int_t zero = 0, loop, numberOfZeroes = atoi((a->count));
+
+ updateOffsets(a,b,&numberOfZeroes);
+
+ if( NEQUAL(a->octet,"n/a") ) {
+ for( loop = 0; loop < numberOfZeroes; loop++ ) {
+ MOVE1BYTE((b->packed),&zero);
+ (b->packed)++;
+ }
+ b->totalPackedBytes += numberOfZeroes;
+ }
+
+ if( NEQUAL(a->ksec1,"n/a") ) (b->values) += numberOfZeroes;
+
+ return a->next;
+}
+
+action* packLP_In(action* a,buffer *b, grib_int_t n) {
+/*
+// Packs a list of single n-byte values in buffer
+*/
+action* relatedAction;
+grib_int_t count, numberOfValues, loop;
+grib_int_t N = (n < 0) ? -n : n;
+
+ relatedAction = a->reference;
+ if( relatedAction == NULL ) {
+ fprintf(stderr,"packLP_In: relatedAction '%s' not found for '%s'\n",
+ (a->count), (a->description));
+ exit(1);
+ }
+ numberOfValues = (relatedAction->value);
+
+ if((numberOfValues>0)&&( n < 0 )) numberOfValues--;
+
+ updateOffsets(a,b,&count);
+
+ for( loop = 0; loop < numberOfValues; loop++ ) {
+ switch( (int) N ) {
+ case 1:
+ MOVE1BYTE((b->packed),(b->values));
+ break;
+ case 2:
+ MOVE2BYTES((b->packed),(b->values));
+ break;
+ case 3:
+ MOVE3BYTES((b->packed),(b->values));
+ break;
+ case 4:
+ MOVE4BYTES((b->packed),(b->values));
+ break;
+ default:
+ fprintf(stderr,"packLP_In: %d not yet handled\n",N);
+ exit(1);
+ }
+ (b->packed) += N;
+ (b->values)++;
+ }
+
+ b->totalPackedBytes += (numberOfValues*N);
+ return a->next;
+}
+
+action* packLP_I1(action* a,buffer *b) { return packLP_In(a,b,1); }
+
+action* packLP_I2(action* a,buffer *b) { return packLP_In(a,b,2); }
+
+action* packLP_I3(action* a,buffer *b) { return packLP_In(a,b,3); }
+
+action* packLP_I4(action* a,buffer *b) { return packLP_In(a,b,4); }
+
+action* packLP_I4M1(action* a,buffer *b) { return packLP_In(a,b,-4); }
+
+/*=======================================*/
+
+action* packLP_Sn(action* a,buffer *b, grib_int_t n) {
+/*
+// Packs a list of single n-byte values in buffer
+*/
+action* relatedAction;
+grib_int_t count, numberOfValues, loop;
+grib_int_t N = (n < 0) ? -n : n;
+grib_int_t value;
+
+
+ relatedAction = a->reference;
+ if( relatedAction == NULL ) {
+ fprintf(stderr,"packLP_Sn: relatedAction '%s' not found for '%s'\n",
+ (a->count), (a->description));
+ exit(1);
+ }
+ numberOfValues = (relatedAction->value);
+
+ if((numberOfValues>0)&&( n < 0 )) numberOfValues--;
+
+ updateOffsets(a,b,&count);
+
+ for( loop = 0; loop < numberOfValues; loop++ ) {
+ value = *(b->values)++;
+ switch( (int) N ) {
+ case 1:
+ if( value < 0 ) value = - (value & 0x7f);
+ MOVE1BYTE((b->packed),&value);
+ break;
+ case 2:
+ if( value < 0 ) value = - (value & 0x7fff);
+ MOVE2BYTES((b->packed),&value);
+ break;
+ case 3:
+ if( value < 0 ) value = - (value & 0x7fffff);
+ MOVE3BYTES((b->packed),&value);
+ break;
+ case 4:
+ if( value < 0 ) value = - (value & 0x7fffffff);
+ MOVE4BYTES((b->packed),&value);
+ break;
+ default:
+ fprintf(stderr,"packLP_Sn: %d not yet handled\n",N);
+ exit(1);
+ }
+ (b->packed) += N;
+ }
+
+ b->totalPackedBytes += (numberOfValues*N);
+ return a->next;
+}
+
+action* packLP_S1(action* a,buffer *b) { return packLP_Sn(a,b,1); }
+
+action* packLP_S2(action* a,buffer *b) { return packLP_Sn(a,b,2); }
+
+action* packLP_S3(action* a,buffer *b) { return packLP_Sn(a,b,3); }
+
+action* packLP_S4(action* a,buffer *b) { return packLP_Sn(a,b,4); }
+
+
+/*=======================================*/
+
+action* unpackF1(action* a,buffer *b) {
+/*
+// Skips a flag in buffer
+*/
+ (a->value) = *(b->packed);
+ (b->packed)++;
+ b->totalUnPackedBytes++;
+ return a->next;
+}
+
+action* packL3(action* a,buffer *b) {
+/*
+// Does (almost) nothing
+*/
+ return a->next;
+}
+
+action* unpackL3(action* a,buffer *b) {
+/*
+// Unpack a 3-byte value without disturbing the buffer counts
+*/
+ *(b->values) = THREE_BYTE_INT((b->packed));
+ (a->value) = *(b->values);
+
+ return a->next;
+}
+
+action* unpackIn(action* a,buffer *b, grib_int_t n) {
+/*
+// Unpack an n-byte value
+*/
+grib_int_t numberOfValues = 1, loop;
+
+ updateOffsets(a,b,&numberOfValues);
+
+ if((numberOfValues>0)&&( n < 0 )) numberOfValues--;
+
+ for( loop = 0; loop < numberOfValues; loop++ ) {
+ switch( (int) n ) {
+ case 1:
+ *(b->values) = ONE_BYTE_INT((b->packed));
+ break;
+ case 2:
+ *(b->values) = TWO_BYTE_INT((b->packed));
+ break;
+ case 3:
+ *(b->values) = THREE_BYTE_INT((b->packed));
+ break;
+ case 4:
+ *(b->values) = FOUR_BYTE_INT((b->packed));
+ break;
+ default:
+ fprintf(stderr,"unpackIn: %d not yet handled\n",n);
+ exit(1);
+ }
+/*
+// Save value which may be loop count
+*/
+ (a->value) = *(b->values);
+ (a->sum) += *(b->values);
+
+ (b->packed) += n;
+ (b->values)++;
+ }
+
+ b->totalUnPackedBytes += numberOfValues * n;
+ b->totalUnPackedValues += numberOfValues;
+
+ return a->next;
+}
+
+action* unpackI1(action* a,buffer *b) { return unpackIn(a,b,1); }
+
+action* unpackI2(action* a,buffer *b) { return unpackIn(a,b,2); }
+
+action* unpackI3(action* a,buffer *b) { return unpackIn(a,b,3); }
+
+action* unpackI4(action* a,buffer *b) { return unpackIn(a,b,4); }
+
+action* unpackA4(action* a,buffer *b) {
+/*
+// Unpacks a 4-byte ASCII value
+//
+// Note: assumes that only one A4 value is being handled (count is -)
+*/
+
+ memcpy((b->values),(b->packed),4);
+ (a->value) = *(b->values);
+
+ (b->packed) += 4;
+ (b->values)++;
+
+ b->totalUnPackedBytes += 4;
+ b->totalUnPackedValues ++;
+
+ return a->next;
+}
+
+action* unpackA8(action* a,buffer *b) {
+/*
+// Unpacks a 8-byte ASCII value
+//
+// Note: assumes that only one A8 value is being handled (count is -)
+*/
+
+ memcpy((b->values),(b->packed),8);
+ (a->value) = *(b->values);
+
+ (b->packed) += 8;
+ (b->values) ++;
+ (b->values) ++;
+
+ b->totalUnPackedBytes += 8;
+ b->totalUnPackedValues ++;
+ b->totalUnPackedValues ++;
+
+ return a->next;
+}
+
+action* unpackA1(action* a,buffer *b) { return unpackIn(a,b,1); }
+
+
+action* unpackPAD(action* a,buffer *b) {
+/*
+// Unpack zeroes from buffer
+*/
+grib_int_t loop, numberOfZeroes = atoi((a->count)), zero = 0;
+
+ if( NEQUAL(a->octet,"n/a") ) {
+ if( NEQUAL(a->octet,"-") )
+ (b->packed) = (b->startOctets)+atoi(a->octet)-OCTETSTART;
+ (b->packed) += numberOfZeroes;
+ (b->totalUnPackedBytes) += numberOfZeroes;
+ }
+
+ if( NEQUAL(a->ksec1,"n/a") ) {
+ if( NEQUAL(a->ksec1,"-") )
+ (b->values) = (b->startKsec1)+atoi(a->ksec1)-KSEC1START;
+
+ for( loop = 0; loop < numberOfZeroes; loop++ ) *(b->values)++ = 0;
+ b->totalUnPackedValues += numberOfZeroes;
+ }
+ return a->next;
+}
+
+action* unpackLP_In(action* a,buffer *b, grib_int_t n) {
+/*
+// Unpacks a list of single n-byte values from buffer
+*/
+action* relatedAction;
+grib_int_t count, numberOfValues, loop;
+grib_int_t N = (n < 0) ? -n : n;
+
+ updateOffsets(a,b,&count);
+
+ relatedAction = a->reference;
+ if( relatedAction == NULL ) {
+ fprintf(stderr,"unpackLP_In: relatedAction '%s' not found for '%s'\n",
+ (a->count), (a->description));
+ exit(1);
+ }
+ numberOfValues = (relatedAction->value);
+
+ if((numberOfValues>0)&&( n < 0 )) numberOfValues--;
+
+ for( loop = 0; loop < numberOfValues; loop++ ) {
+ switch( (int) N ) {
+ case 1:
+ *(b->values) = ONE_BYTE_INT((b->packed));
+ (b->packed) += 1;
+ b->totalUnPackedBytes += 1;
+ break;
+ case 2:
+ *(b->values) = TWO_BYTE_INT((b->packed));
+ (b->packed) += 2;
+ b->totalUnPackedBytes += 2;
+ break;
+ case 3:
+ *(b->values) = THREE_BYTE_INT((b->packed));
+ (b->packed) += 3;
+ b->totalUnPackedBytes += 3;
+ break;
+ case 4:
+ *(b->values) = FOUR_BYTE_INT((b->packed));
+ (b->packed) += 4;
+ b->totalUnPackedBytes += 4;
+ break;
+ default:
+ fprintf(stderr,"unpackLP_In: %d not yet handled\n",N);
+ exit(1);
+ }
+ (b->values)++;
+ }
+
+ b->totalUnPackedValues += numberOfValues;
+ return a->next;
+}
+
+action* unpackLP_I1(action* a,buffer *b) { return unpackLP_In(a,b,1); }
+
+action* unpackLP_I2(action* a,buffer *b) { return unpackLP_In(a,b,2); }
+
+action* unpackLP_I3(action* a,buffer *b) { return unpackLP_In(a,b,3); }
+
+action* unpackLP_I4(action* a,buffer *b) { return unpackLP_In(a,b,4); }
+
+action* unpackLP_I4M1(action* a,buffer *b) { return unpackLP_In(a,b,-4); }
+
+/*==========================================================*/
+
+action* unpackLP_Sn(action* a,buffer *b, grib_int_t n) {
+/*
+// Unpacks a list of single n-byte values from buffer
+*/
+action* relatedAction;
+grib_int_t count, numberOfValues, loop;
+grib_int_t N = (n < 0) ? -n : n;
+grib_int_t value;
+
+ updateOffsets(a,b,&count);
+
+ relatedAction = a->reference;
+ if( relatedAction == NULL ) {
+ fprintf(stderr,"unpackLP_Sn: relatedAction '%s' not found for '%s'\n",
+ (a->count), (a->description));
+ exit(1);
+ }
+ numberOfValues = (relatedAction->value);
+
+ if((numberOfValues>0)&&( n < 0 )) numberOfValues--;
+
+ for( loop = 0; loop < numberOfValues; loop++ ) {
+
+ switch( (int) N ) {
+ case 1:
+ value = ONE_BYTE_INT((b->packed));
+ if( value & 0x80 ) value = - (value & 0x7f);
+ *(b->values) = value;
+ (b->packed) += 1;
+ b->totalUnPackedBytes += 1;
+ break;
+ case 2:
+ value = TWO_BYTE_INT((b->packed));
+ if( value & 0x8000 ) value = - (value & 0x7fff);
+ *(b->values) = value;
+ (b->packed) += 2;
+ b->totalUnPackedBytes += 2;
+ break;
+ case 3:
+ value = THREE_BYTE_INT((b->packed));
+ if( value & 0x800000 ) value = - (value & 0x7fffff);
+ *(b->values) = value;
+ (b->packed) += 3;
+ b->totalUnPackedBytes += 3;
+ break;
+ case 4:
+ value = FOUR_BYTE_INT((b->packed));
+ if( value & 0x80000000 ) value = - (value & 0x7fffffff);
+ *(b->values) = value;
+ (b->packed) += 4;
+ b->totalUnPackedBytes += 4;
+ break;
+ default:
+ fprintf(stderr,"unpackLP_Sn: %d not yet handled\n",N);
+ exit(1);
+ }
+ (b->values)++;
+ }
+
+ b->totalUnPackedValues += numberOfValues;
+ return a->next;
+}
+
+action* unpackLP_S1(action* a,buffer *b) { return unpackLP_Sn(a,b,1); }
+
+action* unpackLP_S2(action* a,buffer *b) { return unpackLP_Sn(a,b,2); }
+
+action* unpackLP_S3(action* a,buffer *b) { return unpackLP_Sn(a,b,3); }
+
+action* unpackLP_S4(action* a,buffer *b) { return unpackLP_Sn(a,b,4); }
+
+
+/*==========================================================*/
+
+action* packLIST(action* a,buffer *b) {
+/*
+// Packs a list of several values into buffer
+*/
+grib_int_t count = a->reference->value;
+grib_int_t i;
+
+ (a->sum) = 0;
+ for(i = 0; i < count; i++) {
+ encode(a->next,b);
+ }
+
+ return a->end->next;
+}
+
+action* unpackLIST(action* a,buffer *b) {
+/*
+// Unpacks a list of several values from buffer
+*/
+grib_int_t count = a->reference->value;
+grib_int_t i;
+
+ for(i = 0; i < count; i++) {
+ decode(a->next,b);
+ }
+
+ return a->end->next;
+}
+
+/*==========================================================*/
+
+
+void init_reference(
+ action* first,
+ action* a,
+ char* description,
+ char* octet,
+ char* ksec1,
+ char* count)
+{
+/*
+// Finds a reference from a 'count' field to a previous action
+// which stores the count value
+*/
+
+ if( NEQUAL(count,"-") ) {
+ while(first)
+ {
+ if( EQUAL(first->description,count) ) {
+ a->reference = first;
+ return;
+ }
+ first = first->next;
+ }
+ }
+ a->reference = NULL;
+
+}
+
+/*==========================================================*/
+action* packENDLIST(action* a,buffer *b) { return 0; }
+
+action* unpackENDLIST(action* a,buffer *b) { return 0; }
+
+action* packENDIF(action* a,buffer *b) { return 0; }
+
+action* unpackENDIF(action* a,buffer *b) { return 0; }
+
+void initENDLIST(
+ action* first,
+ action* a,
+ char* description,
+ char* octet,
+ char* code,
+ char* ksec1,
+ char* count) {
+/*
+// Finds the start action described in a 'count' field
+*/
+ init(first,a,description,octet,code,ksec1,count);
+
+ while(first) {
+ if( EQUAL(first->description,count) ) {
+ first->end = a;
+ return;
+ }
+ first = first->next;
+ }
+
+ fprintf(stderr,"initENDLIST: Cannot find end loop (%s)",count);
+ exit(1);
+}
+
+void initENDIF(
+ action* first,
+ action* a,
+ char* description,
+ char* octet,
+ char* code,
+ char* ksec1,
+ char* count) {
+/*
+// Finds the start action described in a 'ksec1' field
+*/
+ init(first,a,description,octet,code,ksec1,count);
+
+ while(first) {
+ if( EQUAL(first->description,ksec1) ) {
+ first->end = a;
+ return;
+ }
+ first = first->next;
+ }
+
+ fprintf(stderr,"initENDIF: Cannot find end loop (%s)",ksec1);
+ exit(1);
+}
+
+/*==========================================================*/
+
+int test_eq(grib_int_t a,grib_int_t b) { return a == b; }
+int test_ne(grib_int_t a,grib_int_t b) { return a != b; }
+int test_ge(grib_int_t a,grib_int_t b) { return a >= b; }
+int test_gt(grib_int_t a,grib_int_t b) { return a > b; }
+int test_le(grib_int_t a,grib_int_t b) { return a <= b; }
+int test_lt(grib_int_t a,grib_int_t b) { return a < b; }
+int test_bit(grib_int_t a,grib_int_t b) { return (a & (1 << b)) != 0; }
+
+/*==========================================================*/
+
+action* pack_if(action* a,buffer *b)
+{
+grib_int_t val1 = a->reference->value;
+grib_int_t val2 = atol(a->ksec1);
+
+ if(a->test(val1,val2)) encode(a->next,b);
+
+ return a->end->next;
+}
+
+action* unpack_if(action* a,buffer *b)
+{
+grib_int_t val1 = a->reference->value;
+grib_int_t val2 = atol(a->ksec1);
+
+ if(a->test(val1,val2)) decode(a->next,b);
+
+ return a->end->next;
+}
+
+action* createLocalDefinition(action*,grib_int_t);
+
+action* packLOCAL(action* a,buffer *b)
+{
+grib_int_t localDefinitionNumber;
+grib_int_t length;
+action* local;
+action next;
+grib_int_t* lengthValue = (b->values) - 1;
+grib_octet_t* packedLengthValue = (b->packed) - 2;
+
+/*
+// Setup ccc = 98, sss = 000, nnn = number
+*/
+ localDefinitionNumber = *(b->values);
+ localDefinitionNumber += 98000000;
+
+ local = createLocalDefinition(a,localDefinitionNumber);
+ local = local->next;
+
+ while( local ) {
+ memmove(&next,local,sizeof(action));
+ next.next = NULL;
+ encode(&next,b);
+ local = local->next;
+ }
+
+ length = (b->values) - lengthValue - 1;
+
+ *lengthValue = length;
+ MOVE2BYTES(packedLengthValue,&length);
+
+ return NULL;
+}
+
+action* unpackLOCAL(action* a,buffer *b)
+{
+grib_int_t localDefinitionNumber;
+action* local;
+action next;
+grib_int_t* lengthValue = (b->values) - 1;
+grib_octet_t* packedLengthValue = (b->packed) - 2;
+
+ *lengthValue = TWO_BYTE_INT(packedLengthValue);
+/*
+// Setup ccc = 98, sss = 000, nnn = number
+*/
+ localDefinitionNumber = ONE_BYTE_INT((b->packed));
+ localDefinitionNumber += 98000000;
+
+ local = createLocalDefinition(a,localDefinitionNumber);
+ local = local->next;
+
+ while( local ) {
+ memmove(&next,local,sizeof(action));
+ next.next = NULL;
+ decode(&next,b);
+ local = local->next;
+ }
+
+ return NULL;
+}
+
+
+/*==========================================================*/
+
+static op_code codes[] = {
+ { "IF_EQ", init, pack_if, unpack_if, test_eq },
+ { "IF_NEQ", init, pack_if, unpack_if, test_ne},
+ { "IF_GT", init, pack_if, unpack_if, test_gt},
+ { "ENDIF", initENDIF, packENDIF, unpackENDIF, },
+ { "F1", init, packF1, unpackF1, },
+ { "SP_TO", init, packSP_TO, unpackSP_TO, },
+ { "PAD", init, packPAD, unpackPAD, },
+ { "PADTO", init, packPADTO, unpackPADTO, },
+ { "PADMULT", init, packPADMULT, unpackPADMULT, },
+ { "PADFROM", init, packPADFROM, unpackPADFROM, },
+ { "BYTES", init, packBYTES, unpackBYTES, },
+ { "D3", init, packD3, unpackD3, },
+ { "S1", init, packS1, unpackS1, },
+ { "S2", init, packS2, unpackS2, },
+ { "S3", init, packS3, unpackS3, },
+ { "S4", init, packS4, unpackS4, },
+ { "L3", init, packL3, unpackL3, },
+ { "I1", init, packI1, unpackI1, },
+ { "I2", init, packI2, unpackI2, },
+ { "I3", init, packI3, unpackI3, },
+ { "I4", init, packI4, unpackI4, },
+ { "A4", init, packA4, unpackA4, },
+ { "A8", init, packA8, unpackA8, },
+ { "A1", init, packA1, unpackA1, },
+ { "LOCAL", init, packLOCAL, unpackLOCAL, },
+ { "LP_I1", init, packLP_I1, unpackLP_I1, },
+ { "LP_I2", init, packLP_I2, unpackLP_I2, },
+ { "LP_I3", init, packLP_I3, unpackLP_I3, },
+ { "LP_I4", init, packLP_I4, unpackLP_I4, },
+ { "LP_I4M1", init, packLP_I4M1, unpackLP_I4M1, },
+ { "LP_S1", init, packLP_S1, unpackLP_S1, },
+ { "LP_S2", init, packLP_S2, unpackLP_S2, },
+ { "LP_S3", init, packLP_S3, unpackLP_S3, },
+ { "LP_S4", init, packLP_S4, unpackLP_S4, },
+ { "LIST", init, packLIST, unpackLIST, },
+ { "ENDLIST", initENDLIST, packENDLIST, unpackENDLIST, },
+};
+
+action* createLocalDefinitionHandler(grib_int_t definitionNumber) {
+/*
+// Creates a handler from a text description of a local definition.
+//
+// The file name is localDefinitionTemplate_mmm_nnn for definition nnn
+// of a centre with WMO identifier mmm (eg ECMWF = 098).
+// The directory containing the text definition can be specified
+// by environment variable LOCAL_DEFINITION_TEMPLATES.
+*/
+static char * fullPathName;
+FILE* file;
+char line[1024];
+grib_int_t i;
+action* first = 0;
+action* last = 0;
+int useInternalDefinition = 0, number;
+char* definition;
+char* next = NULL;
+
+ fullPathName = findLocalDefinitionFile(definitionNumber);
+ if( fullPathName == NULL) {
+ useInternalDefinition = 1;
+ number = definitionNumber % 1000;
+
+ switch( (int) number ) {
+
+ default:
+ {
+ int DefinitionNumber = (int) definitionNumber;
+ int centre = DefinitionNumber/1000000;
+ int subcentre = (DefinitionNumber/1000)%1000;
+ int number = DefinitionNumber%1000;
+
+ printf("createLocalDefinitionHandler: no local definition found for:\n");
+
+ printf("createLocalDefinitionHandler: - centre %d\n",centre);
+ printf("createLocalDefinitionHandler: - subcentre %d\n",subcentre);
+ printf("createLocalDefinitionHandler: - definition %d\n",number);
+ return NULL;
+ }
+ }
+ }
+
+ if( ! useInternalDefinition ) {
+ file = fopen(fullPathName,"r");
+ if( file == NULL) {
+ perror("createLocalDefinitionHandler: Error opening template file");
+ return NULL;
+ }
+ }
+
+ do
+ {
+ char description[40];
+ char octet[40];
+ char code[40];
+ char ksec1[40];
+ char count[40];
+ action* a = 0;
+
+
+ if( useInternalDefinition ) {
+ int count;
+
+ next = strchr(definition,'\n');
+ if( next == NULL )
+ strcpy(line,definition);
+ else {
+ count = next - definition;
+ memcpy(line,definition,count);
+ line[count] = '\0';
+ definition += (count+1);
+ }
+ }
+ else {
+ next = fgets(line,sizeof(line)-1,file);
+ if( next == NULL ) continue;
+ }
+
+ if( line[0] == '!') continue;
+
+ sscanf(line,"%s %s %s %s %s",description,octet,code,ksec1,count);
+
+ for(i = 0; i < NUMBER(codes); i++ ) {
+
+ if( EQUAL(code,codes[i].description) ) {
+
+ a = (action*)malloc(sizeof(action));
+ if( a == NULL ) {
+ fprintf(stderr,"createLocalDefinitionHandler: out of memory");
+ exit(1);
+ }
+
+ codes[i].init(first,a,description,octet,code,ksec1,count);
+ a->pack = codes[i].pack;
+ a->unpack = codes[i].unpack;
+ a->test = codes[i].test;
+ a->sum = 0;
+ init_reference(first,a,description,octet,ksec1,count);
+
+ if(!first)
+ first = last = a;
+ else
+ last->next = a;
+
+ last = a;
+ break;
+
+ }
+ }
+
+ if(!a) {
+ fprintf(stderr,"createLocalDefinitionHandler: Invalid opcode(%s)",code);
+ return NULL;
+ }
+
+ } while( next != NULL );
+ if(file) fclose(file);
+ return first;
+
+}
+
+void encode(action* a,buffer* b)
+{
+ while(a) {
+ a = a->pack(a,b);
+ }
+ return;
+}
+
+int encodeLocalDefinitionValues(
+ action* a,
+ grib_int_t* values,
+ unsigned char* packed,
+ grib_int_t * numberOfValues,
+ grib_int_t * numberOfBytes) {
+/*
+// Builds packed bytes in 'buffer' from integer 'values'.
+//
+// Returns the number of bytes packed in buffer.
+*/
+buffer b;
+
+ b.totalPackedBytes = 0;
+ b.totalUnPackedBytes = 0;
+ b.values = values;
+ b.startKsec1 = values;
+ b.packed = packed;
+ b.startOctets = packed;
+ encode(a,&b);
+
+ *numberOfValues = (b.values - b.startKsec1);
+ *numberOfBytes = b.totalPackedBytes;
+ return 0;
+}
+
+void decode(action* a,buffer* b)
+{
+ while(a) {
+ a = a->unpack(a,b);
+ }
+ return;
+}
+
+int decodeLocalDefinitionValues(
+ action* a,
+ unsigned char* packed,
+ grib_int_t* values,
+ grib_int_t * numberOfValues,
+ grib_int_t * numberOfBytes) {
+/*
+// Builds integer 'values' from packed bytes in 'buffer'.
+//
+// Returns the number of values unpacked.
+*/
+buffer b;
+
+ b.totalUnPackedValues = 0;
+ b.totalUnPackedBytes = 0;
+ b.values = values;
+ b.startKsec1 = values;
+ b.packed = packed;
+ b.startOctets = packed;
+ decode(a,&b);
+
+ *numberOfValues = b.totalUnPackedValues;
+ *numberOfBytes = b.totalUnPackedBytes;
+ return 0;
+}
+
+action* createLocalDefinition(action* actionSoFar,grib_int_t definitionNumber) {
+/*
+// Creates a handler from a text description of a local definition.
+//
+// The file name is localDefinitionTemplate_mmm_nnn for definition nnn
+// of a centre with WMO identifier mmm (eg ECMWF = 098).
+// The directory containing the text definition can be specified
+// by environment variable LOCAL_DEFINITION_TEMPLATES.
+*/
+static char * fullPathName;
+FILE* file;
+char line[1024];
+grib_int_t i;
+action* latest = actionSoFar;
+int useInternalDefinition = 0, number;
+char* definition;
+char* next = NULL;
+
+ fullPathName = findLocalDefinitionFile(definitionNumber);
+ if( fullPathName == NULL) {
+ useInternalDefinition = 1;
+ number = definitionNumber % 1000;
+
+ switch( (int) number ) {
+
+ default:
+ {
+ int DefinitionNumber = (int) definitionNumber;
+ int centre = DefinitionNumber/1000000;
+ int subcentre = (DefinitionNumber/1000)%1000;
+ int number = DefinitionNumber%1000;
+
+ printf("createLocalDefinition: no local definition found for:\n");
+
+ printf("createLocalDefinition: - centre %d\n",centre);
+ printf("createLocalDefinition: - subcentre %d\n",subcentre);
+ printf("createLocalDefinition: - definition %d\n",number);
+ exit(1);
+ }
+ }
+ }
+
+ if( ! useInternalDefinition ) {
+ file = fopen(fullPathName,"r");
+ if( file == NULL) {
+ perror("createLocalDefinition: Error opening template file");
+ return NULL;
+ }
+ }
+
+ do
+ {
+ char description[40];
+ char octet[40];
+ char code[40];
+ char ksec1[40];
+ char count[40];
+ action* a = 0;
+
+
+ if( useInternalDefinition ) {
+ int count;
+
+ next = strchr(definition,'\n');
+ if( next == NULL )
+ strcpy(line,definition);
+ else {
+ count = next - definition;
+ memcpy(line,definition,count);
+ line[count] = '\0';
+ definition += (count+1);
+ }
+ }
+ else {
+ next = fgets(line,sizeof(line)-1,file);
+ if( next == NULL ) continue;
+ }
+
+ if( line[0] == '!') continue;
+
+ sscanf(line,"%s %s %s %s %s",description,octet,code,ksec1,count);
+
+ for(i = 0; i < NUMBER(codes); i++ ) {
+
+ if( EQUAL(code,codes[i].description) ) {
+
+ a = (action*)malloc(sizeof(action));
+ if( a == NULL ) {
+ fprintf(stderr,"createLocalDefinition: out of memory");
+ exit(1);
+ }
+ if( NEQUAL(octet,"n/a") ) strcpy(octet,"-");
+ if( NEQUAL(ksec1,"n/a") ) strcpy(ksec1,"-");
+ codes[i].init(actionSoFar,a,description,octet,code,ksec1,count);
+ a->pack = codes[i].pack;
+ a->unpack = codes[i].unpack;
+ a->test = codes[i].test;
+ a->sum = 0;
+ init_reference(actionSoFar,a,description,octet,ksec1,count);
+
+ latest->next = a;
+ latest = a;
+
+ break;
+
+ }
+ }
+
+ if(!a) {
+ fprintf(stderr,"createLocalDefinition: Invalid opcode(%s)",code);
+ return NULL;
+ }
+
+ } while( next != NULL );
+ if(file) fclose(file);
+ return actionSoFar;
+
+}
diff --git a/gribex/handleLocalDefinitions.h b/gribex/handleLocalDefinitions.h
new file mode 100755
index 0000000..2b7726a
--- /dev/null
+++ b/gribex/handleLocalDefinitions.h
@@ -0,0 +1,103 @@
+/**
+* Copyright 1981-2012 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_int_t.h"
+
+#ifndef UNPACK_H
+#define UNPACK_H
+
+#define ONE_BYTE_INT(a) (int) ( *(a) & 0xff )
+#define TWO_BYTE_INT(a) (int) ( ONE_BYTE_INT(a)<<8 | ONE_BYTE_INT(a+1))
+#define THREE_BYTE_INT(a) (int) (TWO_BYTE_INT((a))<<8 | ONE_BYTE_INT(a+2))
+#define FOUR_BYTE_INT(a) (int) (THREE_BYTE_INT((a))<<8 | ONE_BYTE_INT(a+3))
+
+#define MOVE1BYTE(p,n) ( *(p) = ((*(n)>> 0) & 0xFF) )
+#define MOVE2BYTES(p,n) ( *(p) = ((*(n)>> 8) & 0xFF) ) , \
+ ( *((p)+1) = ((*(n)>> 0) & 0xFF) )
+#define MOVE3BYTES(p,n) ( *(p) = ((*(n)>>16) & 0xFF) ) , \
+ ( *((p)+1) = ((*(n)>> 8) & 0xFF) ) , \
+ ( *((p)+2) = ((*(n)>> 0) & 0xFF) )
+#define MOVE4BYTES(p,n) ( *(p) = ((*(n)>>24) & 0xFF) ) , \
+ ( *((p)+1) = ((*(n)>>16) & 0xFF) ) , \
+ ( *((p)+2) = ((*(n)>> 8) & 0xFF) ) , \
+ ( *((p)+3) = ((*(n)>> 0) & 0xFF) )
+
+
+#define NUMBER(x) (sizeof(x)/sizeof(x[0]))
+#define OCTETSTART 41
+#define KSEC1START 37
+
+#define NEQUAL(a,b) (strcmp((a),(b)) != 0)
+#define EQUAL(a,b) (strcmp((a),(b)) == 0)
+
+typedef struct action action;
+
+typedef struct buffer {
+grib_int_t totalPackedBytes;
+grib_int_t totalUnPackedValues;
+grib_int_t totalUnPackedBytes;
+grib_int_t* values;
+grib_int_t* startKsec1;
+grib_octet_t* packed;
+grib_octet_t* startOctets;
+} buffer;
+
+char* findLocalDefinitionFile(grib_int_t);
+
+void encode(action*,buffer*);
+void decode(action*,buffer*);
+
+typedef action* (*pack_proc)(action*,buffer*);
+typedef action* (*unpack_proc)(action*,buffer*);
+typedef int (*test_proc)(grib_int_t,grib_int_t);
+
+struct action {
+ grib_string_t *description;
+ grib_string_t *octet;
+ grib_string_t *code;
+ grib_string_t *ksec1;
+ grib_string_t *count;
+struct action* next;
+pack_proc pack;
+unpack_proc unpack;
+
+grib_int_t value;
+
+test_proc test;
+grib_int_t sum;
+
+struct action* reference;
+struct action* end;
+
+} ;
+
+/*==========================================================*/
+
+typedef void (*init_proc)(action*,action*,char*,char*,char*,char*,char*);
+
+typedef struct op_code {
+ grib_string_t *description;
+ init_proc init;
+ pack_proc pack;
+ unpack_proc unpack;
+ test_proc test;
+} op_code;
+
+/*==========================================================*/
+
+action* createLocalDefinitionHandler(grib_int_t);
+
+int encodeLocalDefinitionValues(action*,grib_int_t*,grib_octet_t*,grib_int_t*,grib_int_t*);
+
+int decodeLocalDefinitionValues(action*,grib_octet_t*,grib_int_t*,grib_int_t*,grib_int_t*);
+
+void releaseAction(action*);
+
+#endif /* End of UNPACK_H */
diff --git a/gribex/inscal.F b/gribex/inscal.F
new file mode 100755
index 0000000..ec12651
--- /dev/null
+++ b/gribex/inscal.F
@@ -0,0 +1,153 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE INSCAL (PDATA,KDATA,KLEN,PREF,PSCALE,NBPV)
+C
+C---->
+C**** INSCAL - Vectorise calculation of increments.
+C
+C Purpose.
+C --------
+C
+C Vectorise calculation of increments.
+C
+C** Interface.
+C ----------
+C
+C CALL INSCAL (PDATA,KDATA,KLEN,PREF,PSCALE,NBPV)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C PDATA - Array of floating point values.
+C KLEN - Number of values to be converted.
+C PREF - Reference value.
+C PSCALE - Scale factor.
+C NBPV - Number of bits per packed value
+C
+C Output Parameters.
+C -----------------
+C
+C KDATA - Array of integer increments
+C
+C Method.
+C -------
+C
+C The reference value is subtracted from each value,
+C and the result is then divided by the scale factor.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes re GRIB representation.
+C
+C Comments.
+C --------
+C
+C PDATA and KDATA are really the same array. This routine
+C is just a device to force vectorisation on the Cray,
+C without the necessity of using another array.
+C
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 25.06.91
+C
+C Modifications.
+C _____________
+C
+C J.D.Chambers ECMWF 21.11.94
+C Use JNINT on VAX
+C
+C J.D.Chambers ECMWF 21.11.94
+C Check number of bits per value is not exceeded
+C
+C P.J.Towers ECMWF 18.07.02
+C Optimised for IBM Power4.
+C -Merged loops
+C -Replaced Nint(x) by Int(x+0.5)
+C -Replaced division by scale by multiplication by reciprocal
+C
+C R. El Khatib / D. Paradis METEO-FRANCE 06.02.08
+C - (No conversion if the value exceeds the number of bits for
+C integers
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+#ifdef CRAY
+ IMPLICIT NONE
+#endif
+#include "grbcom.h"
+#include "grprs.h"
+C
+ INTEGER KDATA(KLEN), NBPV, LOOP, MAXNBPV
+ INTEGER INTEMAX
+C
+ REAL PDATA(KLEN), PREF, PSCALE
+ REAL ZRECIP
+ REAL ZI
+ LOGICAL LPDEBUG
+C
+C -----------------------------------------------------------------
+C* Section 1 . Calculation of increments.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ LPDEBUG = ( NDBG.GE.1 )
+ MAXNBPV = 2**NBPV
+ ZRECIP = 1.0 / PSCALE
+ IF( LPDEBUG ) THEN
+ WRITE(GRPRSM,*) 'INSCAL: MAXNBPV = ', MAXNBPV
+ WRITE(GRPRSM,*) 'INSCAL: PSCALE = ', PSCALE
+ WRITE(GRPRSM,*) 'INSCAL: ZRECIP = ', ZRECIP
+ WRITE(GRPRSM,*) 'INSCAL: PREF = ', PREF
+ WRITE(GRPRSM,*) 'INSCAL: KLEN = ', KLEN
+ ENDIF
+
+#ifdef JBPW_64
+ INTEMAX = 140737488355327
+#else
+ INTEMAX = 2147483647
+#endif
+
+ DO LOOP = 1,KLEN
+#ifdef VAX
+ KDATA(LOOP) = JNINT ( (PDATA(LOOP) - PREF) / PSCALE )
+#else
+ ZI = (PDATA(LOOP) - PREF) * ZRECIP + 0.5
+ IF (ABS(ZI) .GE. INTEMAX) THEN
+ KDATA(LOOP) = MAXNBPV - 1
+ ELSE
+ KDATA(LOOP) = INT ( ZI )
+ ENDIF
+#endif
+ IF( KDATA(LOOP).GE.MAXNBPV ) KDATA(LOOP) = MAXNBPV - 1
+ IF( KDATA(LOOP).LT.0 ) KDATA(LOOP) = 0
+ ENDDO
+C
+C -----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/insmp1.F b/gribex/insmp1.F
new file mode 100755
index 0000000..e6eb28b
--- /dev/null
+++ b/gribex/insmp1.F
@@ -0,0 +1,406 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE INSMP1(KGRIB,KLENG,KMAP1,KSECM,PSEC4,KSIZE,KBITS,
+ X PMISS,HFUNC,KNUM,KPR,KRET)
+C
+C---->
+C**** INSMP1 - Insertion of primary bit map for routine GRIBEX.
+C
+C Purpose.
+C --------
+C
+C Generates a primary bit-map (Section 3 bit-map) and
+C inserts in array of GRIB coded data.
+C
+C** Interface.
+C ----------
+C
+C CALL INSMP1(KGRIB,KLENG,KMAP1,KSECM,PSEC4,KSIZE,KBITS,
+C X PMISS,HFUNC,KNUM,KPR,KRET)
+C
+C Input Parameters.
+C -----------------
+C
+C KGRIB - Array into which data is being packed in GRIB code.
+C
+C KLENG - Length of this array.
+C
+C KMAP1 - Bit-pointer to start of primary bit-map
+C (Section 3 bitmap) in array KGRIB.
+C
+C KSECM - Indicator of use of secondary bitmap
+C (Section 4 bitmap) in array KGRIB.
+C 0 , No secondary bit-map.
+C 32, Secondary bit-map to be added later.
+C
+C PSEC4 - Array of data values to be packed in
+C GRIB code, containing missing data
+C indicator PMISS where appropriate.
+C
+C KSIZE - Number of values, including missing data
+C values, in array PSEC4.
+C
+C KBITS - Number of bits in computer word.
+C
+C PMISS - Value indicating missing data in array PSEC4.
+C
+C HFUNC - 'C' , GRIB data being packed normally.
+C 'M' , GRIB data being packed in fixed length messages
+C
+C KNUM - Number of values at each grid point.
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C Output Parameters.
+C ------------------
+C
+C PSEC4 - Array of data values to be packed in
+C GRIB code. Changes to contents depend
+C on function performed eg
+C
+C Rn = Real data value at point n.
+C M = Missing data indicator.
+C On input PSEC4 is R1 R2 M M M R6
+C
+C Output with function 'C', single value per point:
+C Bit-map is 1 1 0 0 0 1
+C PSEC4 is R1 R2 R6 M M M
+C ^
+C |
+C KSIZE
+C
+C Output with function 'C' , matrix (2x1) of values
+C per point:
+C Bit-map is 1 0 1
+C PSEC4 is R1 R2 M R6 M M M
+C ^
+C |
+C KSIZE
+C
+C Output with function 'M' with no secondary bit-maps,
+C single value:
+C Bit-map is 1 1 0 0 0 1
+C PSEC4 is R1 R2 R6 R1 R1 R1
+C ^
+C |
+C KSIZE
+C
+C Output with function 'M' with secondary bit-maps,
+C (2x1 matrix)
+C Bit-map is 1 1 1
+C PSEC4 is R1 R2 M M M R6
+C ^
+C |
+C KSIZE
+C
+C KSIZE - The number of data values remaining in
+C array PSEC4 to be packed.
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Error in routine INXBIT.
+C
+C Method.
+C -------
+C
+C The bit-map contains 1 where valid data exists and 0
+C where data is missing. The corresponding data array
+C contains valid data and the missing data indicator value.
+C
+C Externals.
+C ----------
+C
+C INXBIT
+C
+C Reference.
+C ----------
+C
+C See routine GRIBEX.
+C
+C Comments.
+C ---------
+C
+C None.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 09:07:92
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 19:10:92
+C Maximum sizes increased to allow for packing of 2D spectra.
+C Number of data values 120*61*12*25
+C
+C J.D.Chambers ECMWF 09:03:94
+C Maximum size for bitmap array increased to 132000
+C to allow for products 0.5 * 0.5 degrees, whole
+C hemisphere (N or S).
+C
+C J.D.Chambers ECMWF 13:07:94
+C Maximum size for bitmap array increased to 140000
+C to allow for N160 products whole globe
+C
+C J.D.Chambers ECMWF 24:05:95
+C Handle bitmap in strips to avoid problem with very large products
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C Strips size (JPWORK) enlarged to 10000.
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JPWORK
+ PARAMETER (JPWORK=10000)
+C
+C Subroutine arguents
+C
+ INTEGER KGRIB, KLENG, KMAP1, KSECM, KSIZE, KBITS, KNUM, KPR, KRET
+ DIMENSION KGRIB(*)
+ REAL PSEC4, PMISS
+ DIMENSION PSEC4(*)
+ CHARACTER*(*) HFUNC
+C
+C Local variables
+C
+ INTEGER IMAP1, IMISS, NEXTIN, NXTOUT, INOBT, IPT
+ DIMENSION IMAP1(JPWORK)
+ INTEGER JLOOP, JLOOPI, NEXT, IMANY
+ REAL VALUE
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) THEN
+ WRITE(GRPRSM,*) 'INSMP1: Section 1.'
+ WRITE(GRPRSM,*) ' Input values used -'
+ WRITE(GRPRSM,*) ' KLENG = ', KLENG
+ WRITE(GRPRSM,*) ' KMAP1 = ', KMAP1
+ WRITE(GRPRSM,*) ' KSECM = ', KSECM
+ WRITE(GRPRSM,*) ' KSIZE = ', KSIZE
+ WRITE(GRPRSM,*) ' KBITS = ', KBITS
+ WRITE(GRPRSM,*) ' PMISS = ', PMISS
+ WRITE(GRPRSM,*) ' HFUNC = ', HFUNC
+ WRITE(GRPRSM,*) ' KNUM = ', KNUM
+ ENDIF
+C
+C Reset return code to 0.
+C
+ KRET = 0
+C
+C Check function requested.
+C
+ IF( (HFUNC.NE.'C') .AND. (HFUNC.NE.'M') ) THEN
+ WRITE(GRPRSM,*) 'INSMP1: Invalid function requested - ', HFUNC
+ KRET = 3
+ GO TO 900
+ ENDIF
+C
+C* Set number of bits in bitmap.
+C
+ INOBT = KSIZE / KNUM
+C
+C ------------------------------------------------------------------
+C* Section 2 . Handle fixed length records with secondary bit-maps.
+C -------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C If fixed length records with secondary bit-maps are required,
+C insert a primary bit-map of all 1 bits and finish.
+C
+ IF( (HFUNC.EQ.'M') .AND. (KSECM.EQ.32) ) THEN
+C
+ IF( KPR.GE.1 ) WRITE(GRPRSM,*) 'INSMP1: Section 2.'
+C
+ DO 210 JLOOP = 1,JPWORK
+ IMAP1(JLOOP) = 1
+ 210 CONTINUE
+C
+ NEXT = 0
+C
+ 215 CONTINUE
+C
+C Pack the primary bitmap in strips of JPWORK values
+C
+ NEXT = NEXT + JPWORK
+ IMANY = JPWORK
+C
+C Check whether end of primary bitmap reached.
+C Adjust if less than JPWORK values left to process
+C
+ IF( NEXT.GT.INOBT ) IMANY = INOBT + JPWORK - NEXT
+C
+C Pack next strip of primary bitmap values.
+C
+ CALL INXBIT(KGRIB,KLENG,KMAP1,IMAP1,IMANY,KBITS,1,'C',KRET)
+ IF( KRET.NE.0 ) THEN
+ WRITE(GRPRSM,9003)
+ KRET = 1
+ GO TO 900
+ ENDIF
+C
+C Loop back if more strips of primary bitmap to process
+C
+ IF( NEXT.LT.INOBT ) GOTO 215
+C
+ GO TO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 3 . Generate the primary bitmap.
+C -------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF( KPR.GE.1 ) WRITE(GRPRSM,*) 'INSMP1: Section 3.'
+C
+ NEXTIN = 0
+ NXTOUT = 0
+C
+ NEXT = 0
+C
+C Pack the primary bitmap in strips of JPWORK values
+C
+ 305 CONTINUE
+C
+ NEXT = NEXT + JPWORK
+ IMANY = JPWORK
+C
+C Check whether the end of primary bitmap has been reached.
+C Adjust if less than JPWORK values left to process.
+C
+ IF( NEXT.GT.INOBT ) IMANY = INOBT + JPWORK - NEXT
+C
+ IF (KPR.GE.1) THEN
+ WRITE(GRPRSM,*) 'INSMP1: NEXT = ', NEXT
+ WRITE(GRPRSM,*) 'INSMP1: IMANY = ', IMANY
+ WRITE(GRPRSM,*) 'INSMP1: INOBT = ', INOBT
+ ENDIF
+C
+C* Reset bit-map to all 0 bits.
+C
+ DO 310 JLOOP = 1, IMANY
+ IMAP1(JLOOP) = 0
+ 310 CONTINUE
+C
+C Set a bit to 1 for every KNUM values which contain at
+C least 1 real data value.
+C
+ IPT = 0
+C
+ IF( KNUM.EQ.1 ) THEN
+!OCL NOVREC
+ DO 320 JLOOP = 1, IMANY
+ IF (PSEC4(NEXTIN+JLOOP).NE.PMISS) THEN
+ IMAP1(IPT+JLOOP) = 1
+ NXTOUT = NXTOUT + 1
+ PSEC4(NXTOUT) = PSEC4(NEXTIN+JLOOP)
+ ENDIF
+ 320 CONTINUE
+C
+ IPT = IPT + IMANY
+ NEXTIN = NEXTIN + IMANY
+C
+ ELSE
+C
+ DO 350 JLOOP = 1, IMANY
+C
+ IMISS = 0
+ DO 330 JLOOPI = 1, KNUM
+ IF (PSEC4(NEXTIN+JLOOPI).EQ.PMISS) IMISS = IMISS + 1
+ 330 CONTINUE
+C
+C If point not completely missing, move data forwards in data
+C array. If no real data value found, the corresponding bit is
+C already 0.
+C
+ IF( IMISS.NE.KNUM ) THEN
+ IMAP1(IPT+JLOOP) = 1
+ DO 340 JLOOPI = 1, KNUM
+ PSEC4(NXTOUT+JLOOPI) = PSEC4(NEXTIN+JLOOPI)
+ 340 CONTINUE
+ NXTOUT = NXTOUT + KNUM
+ ENDIF
+C
+ NEXTIN = NEXTIN + KNUM
+C
+ 350 CONTINUE
+ IPT = IPT + IMANY
+C
+ ENDIF
+C
+C Pack next strip of primary bitmap values in GRIB coded data.
+C
+ CALL INXBIT(KGRIB,KLENG,KMAP1,IMAP1,IMANY,KBITS,1,'C',KRET)
+ IF( KRET.NE.0 ) THEN
+ WRITE(GRPRSM,9003)
+ KRET = 1
+ GO TO 900
+ ENDIF
+C
+C Loop back if more strips of primary bitmap to process
+C
+ IF( NEXT.LT.INOBT ) GOTO 305
+C
+C Is a fixed length message required, even though a bit map is used?
+C
+ IF( HFUNC.EQ.'M' ) THEN
+C
+C The otherwise unused part of the array is set to a genuine data
+C value so that extraction of minimum and maximum values remain
+C correct. Number of data values includes these padding values.
+C
+ VALUE = PSEC4(1)
+ DO 360 JLOOP = NXTOUT+1, KSIZE
+ PSEC4(JLOOP) = VALUE
+ 360 CONTINUE
+C
+ ELSE
+C
+C Return number of points with values (ie excluding points with
+C missing data values).
+C
+ KSIZE = NXTOUT
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 9 . Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) THEN
+ WRITE(GRPRSM,*) 'INSMP1: Section 9.'
+ WRITE(GRPRSM,*) ' Output values set -'
+ WRITE(GRPRSM,*) 'INSMP1: KSIZE = ', KSIZE
+ ENDIF
+ RETURN
+C
+ 9003 FORMAT (1H ,'INSMP1: Error reported by routine INXBIT.')
+C
+ END
diff --git a/gribex/insmp2.F b/gribex/insmp2.F
new file mode 100755
index 0000000..3648c40
--- /dev/null
+++ b/gribex/insmp2.F
@@ -0,0 +1,311 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE INSMP2 (KGRIB,KLENG,KMAP2,PSEC4,KSIZE,KBITS,
+ X PMISS,HFUNC,KNUM,KPR,KRET)
+C
+C---->
+C**** INSMP2 - Insertion of secondary bit maps for routine GRIBEX.
+C
+C Purpose.
+C --------
+C
+C Generates secondary bit-maps (Section 4 bit-maps) and
+C inserts in array of GRIB coded data.
+C
+C** Interface.
+C ----------
+C
+C CALL INSMP2 (KGRIB,KLENG,KMAP2,PSEC4,KSIZE,KBITS,
+C X PMISS,HFUNC,KNUM,KPR,KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KGRIB - Array into which data is being packed in GRIB code.
+C
+C KLENG - Length of this array.
+C
+C KMAP2 - Bit-pointer to start of secondary bit maps
+C (Section 4 bitmaps) in array KGRIB.
+C
+C PSEC4 - Array of data values to be packed in
+C GRIB code, containing missing data
+C indicator PMISS where appropriate.
+C
+C KSIZE - Number of values, including missing data
+C values, in array PSEC4.
+C
+C KBITS - Number of bits in computer word.
+C
+C PMISS - Value indicating missing data in array PSEC4.
+C
+C HFUNC - 'C' , GRIB data packed normally.
+C 'M' , GRIB data being packed in fixed length messages
+C
+C KNUM - Number of values at each grid point.
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C Output Parameters.
+C ------------------
+C
+C KSIZE - The number of data values remaining in
+C array PSEC4 to be packed.
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Error in routine INXBIT.
+#if (!defined VAX)
+C 2 , Memory allocation problem.
+C 3 , Memory deallocation problem.
+#else
+C 4 , (VAX only) Number of values at each grid point
+C (KNUM) is greater than allowed (JPWORK).
+#endif
+C
+C Method.
+C -------
+C
+C The bit-map contains 1 where valid data exists and 0
+C where data is missing. The corresponding data array
+C contains valid data and the missing data indicator value.
+C
+C Externals.
+C ----------
+C
+C INXBIT
+C
+C Reference.
+C ----------
+C
+C See routine GRIBEX.
+C
+C Comments.
+C ---------
+C
+C None.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 09:07:92
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 19:10:92
+C Maximum sizes increased to allow for packing of
+C 2D spectra.
+C Number of data values 120*61*12*25
+C
+C J.D.Chambers ECMWF 09:03:94
+C Maximum size for bitmap array increased to 132000
+C to allow for products 0.5 * 0.5 degrees, whole
+C hemisphere (N or S).
+C
+C J.D.Chambers ECMWF 24:05:95
+C Handle bitmap in strips to avoid problem with very large products
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C J.D.Chambers ECMWF April 1998
+C Remove dynamic allocation of work array
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C Strips size (JPWORK) enlarged to 10000.
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JPWORK
+ PARAMETER (JPWORK=10000)
+C
+C Subroutine arguments
+C
+ INTEGER KBITS, KGRIB, KLENG, KMAP2, KNUM, KPR, KRET, KSIZE
+ DIMENSION KGRIB(*)
+ REAL PMISS, PSEC4
+ DIMENSION PSEC4(*)
+ CHARACTER*(*) HFUNC
+C
+C Local variables
+C
+ INTEGER NEXTIN, NXTOUT, IPT, ITEMP
+ INTEGER JLOOP, JLOOPI
+ INTEGER LENGTH
+ REAL VALUE
+C
+C Work array.
+C
+ INTEGER IMAP2
+ DIMENSION IMAP2(JPWORK)
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF( KPR.GE.1 ) THEN
+ WRITE(GRPRSM,*) 'INSMP2: Section 1.'
+ WRITE(GRPRSM,*) ' Input values used -'
+ WRITE(GRPRSM,*) ' HFUNC = ', HFUNC
+ WRITE(GRPRSM,*) ' KSIZE = ', KSIZE
+ WRITE(GRPRSM,*) ' KNUM = ', KNUM
+ ENDIF
+C
+C Reset return code to
+ KRET = 0
+C
+C ------------------------------------------------------------------
+C* Section 2 . Check input parameters.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF( KPR.GE.1 ) WRITE(GRPRSM,*) 'INSMP2: Section 2.'
+C
+C* Check function requested.
+C
+ IF( (HFUNC.NE.'C').AND.(HFUNC.NE.'M') ) THEN
+ WRITE(GRPRSM,*) 'INSMP2: Invalid function requested - ', HFUNC
+ KRET = 3
+ GO TO 900
+ ENDIF
+C
+ LENGTH = KNUM
+C
+C Check there is enough space for packing secondary bitmap
+C
+ IF( LENGTH.GT.JPWORK ) THEN
+ WRITE(GRPRSM,*) 'INSMP2: Number of values at each grid point'
+ WRITE(GRPRSM,*)
+ X 'INSMP2: (KNUM) is greater than allowed (JPWORK).'
+ KRET = 4
+ GOTO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 3 . Generation of bit-map.
+C -------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF( KPR.GE.1 ) WRITE(GRPRSM,*) 'INSMP2: Section 3.'
+C
+ NEXTIN = 0
+ NXTOUT = 0
+C
+C* Generate the bit-map in accordance with the missing data
+C values.
+C
+ DO 320 JLOOP = 1, KSIZE, KNUM
+ IPT = 0
+C
+ DO 310 JLOOPI = 1, KNUM
+C
+ IF (PSEC4(JLOOPI+NEXTIN).EQ.PMISS) THEN
+C
+C If missing data indicator, set secondary bitmap flag to 0
+C
+ IMAP2(IPT+JLOOPI) = 0
+C
+ ELSE
+C
+C If not missing, set secondary bitmap flag to 1 and
+C move data forwards in data array.
+C
+ IMAP2(IPT+JLOOPI) = 1
+ NXTOUT = NXTOUT + 1
+ PSEC4(NXTOUT) = PSEC4(NEXTIN+JLOOPI)
+ ENDIF
+ 310 CONTINUE
+ IPT = IPT + KNUM
+C
+C* Insert bit-map in GRIB coded data.
+C
+ CALL INXBIT(KGRIB,KLENG,KMAP2,IMAP2,KNUM,KBITS,1,'C',KRET)
+ IF (KRET.NE.0) THEN
+ WRITE(GRPRSM,9003)
+ KRET = 1
+ GO TO 900
+ ENDIF
+C
+ NEXTIN = NEXTIN + KNUM
+C
+ 320 CONTINUE
+C
+C* Bit map must be a multiple of 8 bits.
+C
+ ITEMP = (KMAP2+7) / 8
+ ITEMP = ITEMP * 8
+ IF (ITEMP.NE.KMAP2) THEN
+ IMAP2(1) = 0
+ ITEMP = ITEMP - KMAP2
+ CALL INXBIT(KGRIB,KLENG,KMAP2,IMAP2,1,KBITS,ITEMP,'C',KRET)
+ IF (KRET.NE.0) THEN
+ WRITE(GRPRSM,9003)
+ KRET = 1
+ GO TO 900
+ ENDIF
+ ENDIF
+C
+C Is a fixed length message required, even though a bit map is used?
+C
+ IF (HFUNC.EQ.'M') THEN
+C
+C The otherwise unused part of the array is set to a genuine data
+C value so that extraction of minimum and maximum values remain
+C correct. Number of data values includes these padding values.
+C
+ VALUE = PSEC4(1)
+ DO 330 JLOOP = NXTOUT+1, KSIZE
+ PSEC4(JLOOP) = VALUE
+ 330 CONTINUE
+C
+ ELSE
+C
+C Return number of points with values (ie excluding points with
+C missing data values).
+C
+ KSIZE = NXTOUT
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 9 . Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) THEN
+ WRITE(GRPRSM,*) 'INSMP2: Section 9.'
+ WRITE(GRPRSM,*) ' Output values set -'
+ WRITE(GRPRSM,*) 'INSMP2: KSIZE = ', KSIZE
+ ENDIF
+C
+ RETURN
+C
+ 9003 FORMAT (1H ,'INSMP2: Error reported by routine INXBIT.')
+C
+ END
diff --git a/gribex/inxbit.F b/gribex/inxbit.F
new file mode 100755
index 0000000..76c7998
--- /dev/null
+++ b/gribex/inxbit.F
@@ -0,0 +1,241 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT,
+ C KBLEN,HFUNC,KRET)
+C
+C---->
+C**** INXBIT - Insert/extract bits consecutively in/from a given array
+C
+C Purpose.
+C --------
+C
+C Take rightmost KBLEN bits from KNUM words of KPARM
+C and insert them consecutively in KGRIB, starting at
+C bit after KNSPT or vice versa.
+C
+C** Interface.
+C ----------
+C
+C CALL INXBIT (KGRIB,KLENG,KNSPT,KPARM,KNUM,KBIT, KBLEN,KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KGRIB - Array containing bitstream.
+C KLENG - Length (words) of this array.
+C KNSPT - Bit number after which insertion/extraction starts.
+C KPARM - Array from which bits are taken for
+C insertion in the bitstream or to which
+C bits are extracted from the bitstream.
+C KBIT - Number of bits in computer word.
+C KNUM - Number of bit fields inserted/extracted.
+C KBLEN - Number of bits per bit field.
+C HFUNC - Requested function.
+C 'C' to insert bits in bitstream,
+C 'D' to extract bits from bitstream.
+C
+C Output Parameters.
+C ------------------
+C
+C KNSPT - Bit number of last bit inserted/extracted.
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Insertion/extraction exceeded array boundary.
+C
+C Method.
+C -------
+C
+C Word and offset pointer calculated before calling
+C insertion/extraction routines.
+C
+C Externals.
+C ----------
+C
+C
+C Reference.
+C ----------
+C
+C ECLIB documentation on SBYTES and GBYTES.
+C
+C Comments.
+C ---------
+C
+#if (defined CRAY) || (defined __uxp__ ) || (defined IBM_POWER4)
+C Vectorized Fortran version of routine.
+C This routine contains a call to GSBITE, a vectorising
+C version of GBYTE(S) and SBYTE(S).
+#else
+C Generic version of routine.
+#endif
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 08.11.91
+C Parameter KMACH removed from list of input parameters.
+C
+C J. Hennessy ECMWF 12.10.92
+C Dimension of IMASK changed from 64 to 65.
+C
+C J.D.Chambers ECMWF 21.05.96
+C Defines put in for Fujtsu.
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+ CHARACTER*1 HFUNC
+ INTEGER IND, INUM, IOFF, IWORD
+ INTEGER KBIT, KBLEN, KGRIB, KLENG, KNSPT, KNUM, KPARM, KRET
+ INTEGER J901
+C
+ DIMENSION KGRIB(KLENG)
+ DIMENSION KPARM(*)
+#if (defined CRAY) || (defined __uxp__ ) || (defined IBM_POWER4)
+ INTEGER IMASK
+ DIMENSION IMASK(65)
+C
+C Values in IMASK are set in the first call to routine GSBITE, and
+C are used in subsequent calls.
+C
+ SAVE IMASK
+C
+C Force routine GSBITE to calculate bit-masks first time through.
+C
+ DATA IMASK(2) /0/
+#endif
+C
+C ----------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+#ifdef DEBUG
+ WRITE(GRPRSM,*) 'INXBIT: Input values used -'
+ WRITE(GRPRSM,*) 'KLENG = ', KLENG
+ WRITE(GRPRSM,*) 'KNSPT = ', KNSPT
+ WRITE(GRPRSM,*) 'KBIT = ', KBIT
+ WRITE(GRPRSM,*) 'HFUNC = ', HFUNC
+#endif
+C
+ KRET = 0
+C
+C ----------------------------------------------------------------
+C* Section 2 . Bit insertion/extraction.
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C* Calculate word pointer and offset.
+C
+ IWORD = KNSPT / KBIT
+ IOFF = KNSPT - IWORD * KBIT
+ IWORD = IWORD + 1
+#ifdef DEBUG
+ WRITE(GRPRSM,*) 'INXBIT: Word is ',IWORD,', bit offset is ',IOFF
+#endif
+C
+C Insert/extract bits.
+C
+#if (defined CRAY) || (defined __uxp__ ) || (defined IBM_POWER4)
+ IF (KNUM.GE.8) THEN
+C
+C Vectorising routine GSBITE performs the same
+C functions as SBYTE(S) and GBYTE(S).
+C
+ CALL GSBITE (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM,
+ X KBIT,IMASK,HFUNC)
+ ELSE
+C
+C Scalar faster.
+C
+ IF (HFUNC.EQ.'C') THEN
+ CALL SBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ELSE
+ CALL GBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ENDIF
+ ENDIF
+#elif (defined CYBER)
+ IF (HFUNC.EQ.'C') THEN
+ CALL SBYTES6 (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ELSE
+ CALL GBYTES6 (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ENDIF
+#elif (defined IBM) || (defined VAX)
+ IF (HFUNC.EQ.'C') THEN
+ CALL SBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ELSE
+ CALL GBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ENDIF
+#else
+ IF (HFUNC.EQ.'C') THEN
+ CALL SBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ELSE
+ CALL GBYTES (KGRIB(IWORD),KPARM,IOFF,KBLEN,0,KNUM)
+ ENDIF
+#endif
+C
+C Update pointer.
+C
+ KNSPT = KNSPT + KBLEN * KNUM
+C
+C ----------------------------------------------------------------
+C* Section 3 . Check out of range.
+C -----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IND = KNSPT / KBIT
+ IF (IND.GT.KLENG) THEN
+ KRET = 1
+ WRITE(GRPRSM,*) 'INXBIT : Word ', IND ,
+ X ' is outside array bounds ', KLENG
+ ENDIF
+C
+C ----------------------------------------------------------------
+C* Section 9 . Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+#ifdef DEBUG
+ INUM = KNUM
+ IF( INUM.GT.360 ) THEN
+ INUM = 360
+ WRITE(GRPRSM,*) 'First ', INUM,' values.'
+ ENDIF
+ DO 901 J901=1,INUM
+ IF( HFUNC.EQ.'C' ) THEN
+ WRITE(GRPRSM,*) 'Inserted value = ', KPARM(J901)
+ ELSE
+ WRITE(GRPRSM,'(1H ,Z)') KGRIB(IWORD)
+ WRITE(GRPRSM,*) 'Extracted value = ', KPARM(J901)
+ WRITE(GRPRSM,'(1H ,Z)') KPARM(J901)
+ ENDIF
+ 901 CONTINUE
+ WRITE(GRPRSM,*) ' Output values set -'
+ WRITE(GRPRSM,*) 'KNSPT = ', KNSPT
+#endif
+C
+ RETURN
+ END
diff --git a/gribex/inxmap.F b/gribex/inxmap.F
new file mode 100755
index 0000000..e73e776
--- /dev/null
+++ b/gribex/inxmap.F
@@ -0,0 +1,460 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE INXMAP (KGRIB,KLENG,KMAPT,PSEC4,KSIZE,KBITS,KSBMAP,
+ C PMISS,HFUNC,KPR,KRET)
+C
+C---->
+C**** INXMAP - Bit map handling for routine GRIBEX.
+C
+C Purpose.
+C --------
+C
+C 1) Extract a bit-map from an array of GRIB coded data and
+C insert missing data value in appropriate places in the
+C array of already decoded data values.
+C
+C 2) Generate a bit-map and insert in array of GRIB coded
+C data and remove missing data values from the array of
+C values being encoded in GRIB code.
+C
+C** Interface.
+C ----------
+C
+C CALL INXMAP (KGRIB,KLENG,KMAPT,PSEC4,KSIZE,KBITS,KSBMAP,
+C C PMISS,HFUNC,KPR,KRET)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KGRIB - Array of GRIB data being coded/decoded.
+C
+C KLENG - Length of this array.
+C
+C KMAPT - Bit-pointer to start of bit-map in
+C array KGRIB.
+C
+C PSEC4 - Array of data values decoded or to be
+C coded in GRIB.
+C
+C KSIZE - Size of bit-map ie number of values,
+C including missing data values, in array
+C PSEC4.
+C
+C KBITS - Number of bits in computer word.
+C
+C PMISS - Value indicating missing data in array
+C PSEC4.
+C
+C HFUNC - 'C' , GRIB data being coded.
+C 'M' , GRIB data being coded in fixed length
+C messages.
+C 'D' , GRIB data being decoded.
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C 1 , Debug printout.
+C
+C Output Parameters.
+C ------------------
+C
+C KSBMAP - Bit-map flag.
+C Used only when decoding data.
+C -2 , All bits in the bit-map set to 1.
+C There is no missing data.
+C -4 , Some points have no data. User
+C supplied value for missing data
+C indicator in appropriate places in
+C the array PSEC4.
+C
+C KSIZE - When coding data, the number of real data
+C values in array PSEC4. Not changed when
+C decoding.
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Error in routine INXBIT.
+C 2 , Bit-map size exceeds maximum.
+C 3 , Invalid function requested.
+C
+C Method.
+C -------
+C
+C The bit-map contains 1 where valid data exists and 0
+C where data is missing. The corresponding data array
+C contains valid data and the missing data indicator value.
+C
+C Externals.
+C ----------
+C
+C INXBIT
+C
+C Reference.
+C ----------
+C
+C See routine GRIBEX.
+C
+C Comments.
+C ---------
+C
+C Routine contains Sections 0 to 4 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 09:09:91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 08:11:91
+C Parameter KMACH removed from list of input parameters.
+C Optional abort removed.
+C
+C940309 J.D.Chambers ECMWF 09:03:94
+C940309 Maximum size for bitmap array increased to 132000
+C940309 to allow for products 0.5 * 0.5 degrees, whole
+C940309 hemisphere (N or S).
+C
+C ------------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+ CHARACTER*(*) HFUNC
+ CHARACTER*1 YFUNC
+C
+ INTEGER IMAP
+ INTEGER INEXT
+C
+ INTEGER JPMAP
+C
+ INTEGER J320
+ INTEGER J330
+ INTEGER J420
+ INTEGER J430
+ INTEGER J431
+C
+ INTEGER KBITS
+ INTEGER KGRIB
+ INTEGER KLENG
+ INTEGER KMAPT
+ INTEGER KPR
+ INTEGER KRET
+ INTEGER KSBMAP
+ INTEGER KSIZE
+C
+ REAL PMISS
+ REAL PSEC4
+C
+ REAL ZSEC4
+C
+C* Maximum size of bit-map which can be handled.
+C
+C940309 PARAMETER (JPMAP=41472)
+ PARAMETER (JPMAP=132000)
+C
+ DIMENSION IMAP(JPMAP)
+C
+ DIMENSION PSEC4(*)
+ DIMENSION ZSEC4(JPMAP)
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (KPR.EQ.1)
+ C THEN
+ WRITE(GRPRSM,*) 'INXMAP : Section 1.'
+ WRITE(GRPRSM,*) ' Input values used -'
+ WRITE(GRPRSM,9004) HFUNC
+ WRITE(GRPRSM,9005) KSIZE
+ ENDIF
+C
+C Reset return code to
+C
+ KRET = 0
+C
+ INEXT = 0
+C
+ YFUNC = HFUNC
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Check input parameters.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE(GRPRSM,*) 'INXMAP : Section 2.'
+C
+C* Check that bit-map size does not exceed maximum permitted.
+C
+ IF (JPMAP.LT.KSIZE)
+ C THEN
+ WRITE(GRPRSM,9001) KSIZE , JPMAP
+ KRET = 2
+ GO TO 900
+ ENDIF
+
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 3 . Decoding of bit-map and data.
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE(GRPRSM,*) 'INXMAP : Section 3.'
+C
+ IF (YFUNC.EQ.'D')
+ C THEN
+C
+C* Extract bit-map from GRIB coded data.
+C
+ CALL INXBIT (KGRIB,KLENG,KMAPT,IMAP,KSIZE,KBITS,1,
+ C YFUNC,KRET)
+C
+ IF (KRET.NE.0)
+ C THEN
+ WRITE(GRPRSM,9003)
+ KRET = 1
+ GO TO 900
+ ENDIF
+C
+C* Copy data to temporary array and insert missing data
+C indicator in temporary array, in accordance with the
+C bit map values.
+C
+ DO 320 J320=1,KSIZE
+ IF (IMAP(J320).EQ.0)
+ C THEN
+ ZSEC4(J320) = PMISS
+ ELSE
+ INEXT = INEXT + 1
+ ZSEC4(J320) = PSEC4(INEXT)
+ ENDIF
+ 320 CONTINUE
+C
+C* Set bit-map flag, and if missing data is indicated
+C transfer data to original array.
+C
+ IF (INEXT.NE.KSIZE)
+ C THEN
+ KSBMAP = -4
+ DO 330 J330=1,KSIZE
+ PSEC4(J330) = ZSEC4(J330)
+ 330 CONTINUE
+ ELSE
+ KSBMAP = -2
+ ENDIF
+C
+ GO TO 900
+C
+ ENDIF
+C
+C -------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 4 . Generation of bit-map.
+C -------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE(GRPRSM,*) 'INXMAP : Section 4.'
+C
+ IF (YFUNC.EQ.'C'.OR.YFUNC.EQ.'M')
+ C THEN
+C
+C* Copy data to temporary array and remove missing data
+C indicator in temporary array, generating the bit-map
+C in accordance with the missing data values.
+C
+ DO 420 J420=1,KSIZE
+ IF (PSEC4(J420).EQ.PMISS)
+ C THEN
+ IMAP(J420) = 0
+ ELSE
+ IMAP(J420) = 1
+ INEXT = INEXT + 1
+ ZSEC4(INEXT) = PSEC4(J420)
+ ENDIF
+ 420 CONTINUE
+C
+C* Insert bit-map in GRIB coded data.
+C
+ CALL INXBIT (KGRIB,KLENG,KMAPT,IMAP,KSIZE,KBITS,1,
+ C YFUNC,KRET)
+C
+ IF (KRET.NE.0)
+ C THEN
+ WRITE(GRPRSM,9003)
+ KRET = 1
+ GO TO 900
+ ENDIF
+C
+C* If missing data is indicated transfer data to original
+C array.
+C
+ IF (INEXT.NE.KSIZE)
+ C THEN
+ DO 430 J430=1,INEXT
+ PSEC4(J430) = ZSEC4(J430)
+ 430 CONTINUE
+C
+ IF (YFUNC.EQ.'M')
+ C THEN
+C
+C Fixed length messages required, even though
+C a bit map is used. The otherwise unused part
+C of the array is set to a genuine data value
+C so that extraction of minimum and maximum
+C values remain correct. Number of data values
+C includes these padding values.
+C
+ DO 431 J431=INEXT+1,KSIZE
+ PSEC4(J431) = PSEC4(1)
+ 431 CONTINUE
+ ELSE
+C
+C Return number of real values (excluding
+C missing data values).
+C
+ KSIZE = INEXT
+ ENDIF
+ ENDIF
+C
+ GO TO 900
+C
+ ENDIF
+C
+C* Invalid function requested.
+C
+ WRITE(GRPRSM,9002) YFUNC
+ KRET = 3
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (KPR.EQ.1)
+ C THEN
+ WRITE(GRPRSM,*) 'INXMAP : Section 9.'
+ WRITE(GRPRSM,*) ' Output values set -'
+ WRITE(GRPRSM,9005) KSIZE
+ WRITE(GRPRSM,9006) KSBMAP
+ ENDIF
+C
+ 9001 FORMAT (1H ,'INXMAP : Bit-map size is ',I6,', maximum allowed',
+ C ' is ',I6,'.')
+C
+ 9002 FORMAT (1H ,'INXMAP : Invalid function requested - ',A1)
+C
+ 9003 FORMAT (1H ,'INXMAP : Error reported by routine INXBIT.')
+C
+ 9004 FORMAT (1H ,' HFUNC = ',A1)
+C
+ 9005 FORMAT (1H ,' KSIZE = ',I6)
+C
+ 9006 FORMAT (1H ,' KSBMAP = ',I6)
+C
+ RETURN
+C
+ END
diff --git a/gribex/jabort.c b/gribex/jabort.c
new file mode 100755
index 0000000..86b1c5a
--- /dev/null
+++ b/gribex/jabort.c
@@ -0,0 +1,21 @@
+/**
+* Copyright 1981-2012 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 <stdlib.h>
+
+void jabort(void) {
+ abort();
+}
+
+void jabort_(void)
+{
+ abort();
+}
diff --git a/gribex/jfree.c b/gribex/jfree.c
new file mode 100755
index 0000000..bd8f2fd
--- /dev/null
+++ b/gribex/jfree.c
@@ -0,0 +1,22 @@
+/**
+* Copyright 1981-2012 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 <stdlib.h>
+
+void jfree( int ** n)
+{
+ free(*n);
+}
+
+void jfree_( int ** n)
+{
+ free(*n);
+}
diff --git a/gribex/jmalloc.c b/gribex/jmalloc.c
new file mode 100755
index 0000000..8ceb0cf
--- /dev/null
+++ b/gribex/jmalloc.c
@@ -0,0 +1,84 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+
+#include "fortint.h"
+
+#if (defined hpR64) || (defined hpiaR64) || (defined CRAY) || (defined rs6000)
+#define XALLOC malloc
+#else
+#define XALLOC malloc
+#endif
+
+#if (defined hpR64) || (defined hpiaR64)
+JPointer jmalloc_( fortint * n)
+{
+int number = *n;
+long * alloc;
+JPointer falloc;
+
+ alloc = (long *) XALLOC(number);
+ falloc = (JPointer) alloc;
+ return falloc;
+}
+
+JPointer jmalloc( fortint * n) {
+ return jmalloc_(n);
+}
+#elif (defined __alpha)
+JPointer jmalloc_( int * n)
+{
+static JPointer ret;
+ ret = (JPointer) XALLOC(*n);
+ return ret;
+}
+
+JPointer jmalloc( int * n) {
+ return jmalloc_(n);
+}
+#elif (defined POINTER_64)
+JPointer jmalloc_( JPointer n)
+{
+/*size_t number_of_bytes = (size_t) (*n);*/
+
+/*printf("======= jmalloc_ number of bytes %ld \n", *n);*/
+ return XALLOC(*n);
+}
+
+JPointer jmalloc( int * n) {
+ return jmalloc_(n);
+}
+
+
+#else
+int * jmalloc_( int * n)
+{
+ return (int *) XALLOC(*n);
+}
+
+int * jmalloc( int * n) {
+ return jmalloc_(n);
+}
+#endif
+
+size_t* jmalloc2_( size_t * n)
+{
+/* printf("======= jmalloc2_ number of bytes %ld \n", *n);*/
+
+ return (size_t *)XALLOC(*n);
+}
+
+size_t* jmalloc2( size_t * n)
+{
+ return (size_t *)jmalloc2_(n);
+}
diff --git a/gribex/kwchk1.F b/gribex/kwchk1.F
new file mode 100755
index 0000000..e0a76fd
--- /dev/null
+++ b/gribex/kwchk1.F
@@ -0,0 +1,192 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE KWCHK1(KSEC1,KRET)
+C
+C---->
+C**** KWCHK1
+C
+C Purpose.
+C --------
+C
+C Check parameters for Washington ensemble products Section 1
+C of GRIB code against valid values for GRIB Code Edition 1.
+C
+C** Interface.
+C ----------
+C
+C CALL KWCHK1(KSEC1,KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KSEC1 - Array containing parameters for section
+C 1 of GRIB code.
+C
+C Output Parameters.
+C ------------------
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Error in GRIB code parameter.
+C
+C Method.
+C -------
+C
+C Values checked against Washington ensemble product usage.
+C
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes for GRIB code.
+C
+C
+C Comments.
+C ---------
+C
+C Routine contains Sections 0 to 2 and Section 9.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 09.10.95
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Subroutine arguments
+ INTEGER KSEC1, KRET
+ DIMENSION KSEC1(*)
+C
+C Local variables
+C
+#ifdef CRAY
+ INTEGER MMASK
+#endif
+ INTEGER IVERSN, IV0001, IV0011
+ DATA IV0001/808464433/, IV0011/808464689/
+C
+C IV0001 = right-justified ascii '0001'
+C IV0011 = right-justified ascii '0011'
+C
+C ----------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Reset return code.
+ KRET = 0
+C
+C ----------------------------------------------------------------
+C* Section 2 . Check usage.
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Ensemble forecast data
+ IF(KSEC1(37).NE.1) THEN
+ WRITE(GRPRSM,*)
+ X 'KWCHK1: Invalid Ensemble f/c data flag = ',KSEC1(37)
+ KRET = 1
+ GOTO 900
+ ENDIF
+C
+C Class.
+ IF( KSEC1(38).NE.1 ) THEN
+ WRITE(GRPRSM,*) 'KWCHK1: Invalid class code = ',KSEC1(38)
+ KRET = 1
+ GOTO 900
+ ENDIF
+C
+C Type.
+ IF( (KSEC1(39).NE.10) .AND. (KSEC1(39).NE.11) ) THEN
+ WRITE(GRPRSM,*) 'KWCHK1: Invalid type code = ',KSEC1(39)
+ KRET = 1
+ GOTO 900
+ ENDIF
+C
+C Stream.
+ IF( KSEC1(40).NE.1051 ) THEN
+ WRITE(GRPRSM,*) 'KWCHK1: Invalid stream code = ',KSEC1(40)
+ KRET = 1
+ GOTO 900
+ ENDIF
+C
+C Version number.
+ IVERSN = KSEC1(41)
+#if (!defined rs6000)
+#ifdef CRAY
+C
+C Mask least significant 32 bits for integer comparison
+ MMASK = MASK(96)
+ IVERSN = AND( IVERSN, MMASK)
+#endif
+ IF( (IVERSN.NE.IV0001) .AND. (IVERSN.NE.IV0011) ) THEN
+ WRITE(GRPRSM,*) 'KWCHK1: Invalid version number = ', IVERSN
+ KRET = 1
+ GOTO 900
+ ENDIF
+#endif
+C
+C Number of perturbed forecast.
+ IF( KSEC1(39).EQ.10 ) THEN
+ IF( KSEC1(42).NE.0 ) THEN
+ WRITE(GRPRSM,*)
+ X 'KWCHK1: Invalid control f/c number = ',KSEC1(42)
+ KRET = 1
+ GOTO 900
+ ENDIF
+C
+ ELSE
+ IF( (KSEC1(42).LT.0) .OR. (KSEC1(42).GT.11) ) THEN
+ WRITE(GRPRSM,*)
+ X 'KWCHK1: Invalid perturbed f/c number = ',KSEC1(42)
+ KRET = 1
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C Total number of forecasts in ensemble.
+ IF( (KSEC1(43).LT.0) .OR. (KSEC1(43).GT.11) ) THEN
+ WRITE(GRPRSM,*)
+ X 'KWCHK1: Invalid total f/cs in ensemble = ',KSEC1(43)
+ KRET = 1
+ GOTO 900
+ ENDIF
+C
+C ----------------------------------------------------------------
+C* Section 9 . Return to calling routine. Format statements.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/kwloc1.F b/gribex/kwloc1.F
new file mode 100755
index 0000000..cc2bf9a
--- /dev/null
+++ b/gribex/kwloc1.F
@@ -0,0 +1,271 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE KWLOC1(KSEC1,KGRIB,KLENG,KNSPT,KBITS,KPLEN,KPR,KRET)
+C
+C---->
+C**** KWLOC1
+C
+C Purpose.
+C --------
+C
+C GRIB coding/decoding of Washington ensemble product local use of
+C Section 1.
+C
+C Interface.
+C ----------
+C
+C CALL KWLOC1 (KSEC1,KGRIB,KLENG,KNSPT,KBITS, KPLEN,KPR,KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KLENG - Length (words) of KGRIB.
+C
+C KNSPT - Bit number after which insertion or
+C extraction starts.
+C
+C KBITS - Number of bits in computer word.
+C
+C KPLEN - Pointer to field containing length of Section 1.
+C
+C KPR - Debug print switch.
+C 0 , No printout.
+C >0 , Debug printout.
+C
+C KRET - Response to error indicator.
+C 0 , Abort if error encountered.
+C Non-zero , Return to calling routine
+C even if error encountered.
+C
+C Output Parameters.
+C ------------------
+C
+C KSEC1 - Array containing Grib Section 1 data.
+C
+C KGRIB - Array containing Grib coded data.
+C
+C KNSPT - Number of bit after last one inserted or
+C extracted.
+C
+C KRET - Return code.
+C 0 , No error encountered.
+C 1 , Error reported by routine INXBIT.
+C
+C Method.
+C -------
+C
+C Input data packed/unpacked in accordance with Washington ensemble
+C product usage of local part of section 1 of Grib code.
+C
+C
+C Externals.
+C ----------
+C
+C INXBIT - insert/extract bit data
+C ABORTX - abort program
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual On Codes for Grib Code.
+C
+C
+C Comments.
+C ---------
+C
+C Washington ensemble product usage of local part of section 1 of
+C GRIB:
+C
+C Octet 41 : Identifies the application:
+C 1 Ensemble.
+C
+C Octet 42 : Type:
+C 1 Unperturbed control forecast,
+C 2 Individual negatively perturbed forecast,
+C 3 Individual positively perturbed forecast,
+C 4 Cluster,
+C 5 Whole ensemble.
+C
+C Octet 43 : Identification number:
+C 1 If byte 42=1, identifies high resolution.
+C 2 If byte 42=1, identifies low resolution.
+C 3 Etc.(!?).
+C (1 to 5 for perturbed 00Z forecast.)
+C (1 to 2 for perturbed 12Z forecast.)
+C
+C Octet 44 : Products:
+C 1 Full field (individual forecast)/unweighted mean.
+C 2 Weighted mean.
+C 11 Standard deviation wrt ensemble mean.
+C 12 Standard deviation wrt ensemble mean, normalized.
+C
+C Octet 45 : Spatial smoothing of product (number of highest total
+C wavenumber included):
+C 255 Original resolution retained.
+C
+Cjdc Octet 46 : Dummy. (Not being used!)
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 09.10.95
+C
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C----<
+C ------------------------------------------------------------------
+C Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+ INTEGER KSEC1, KGRIB, KLENG, KNSPT, KBITS, KPLEN, KPR, KRET
+ DIMENSION KGRIB(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+ INTEGER IRET
+ CHARACTER*1 YFUNC
+C
+C ------------------------------------------------------------------
+C Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) THEN
+ WRITE(GRPRSM,*) 'KWLOC1 : Section 1.'
+ WRITE(GRPRSM,*) 'KWLOC1 : On input, KNSPT = ',KNSPT
+ ENDIF
+C
+C Reset return code to 0, retaining input value to decide
+C on abort / no abort, if error encountered later.
+C
+ IRET = KRET
+ KRET = 0
+ YFUNC = 'D'
+C
+C ------------------------------------------------------------------
+C Section 2 . Washington ensemble product local use of Grib
+C Section 1.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) WRITE(GRPRSM,*) 'ECLOC1 : Section 2.'
+C
+C Extract fields.
+C
+C
+C Octet 41 : Identifies the application:
+C 1 Ensemble.
+C One 8 bit field.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,KSEC1(37),1,KBITS, 8,YFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ WRITE(GRPRSM,*) 'KWLOC1: INXBIT error reported = ',KRET
+ KRET = 1
+ GO TO 900
+ ENDIF
+C
+C Octet 42 : Type:
+C 1 Unperturbed control forecast,
+C 2 Individual negatively perturbed forecast,
+C 3 Individual positively perturbed forecast,
+C 4 Cluster,
+C 5 Whole ensemble.
+C One 8 bit field.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,KSEC1(38),1,KBITS, 8,YFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ WRITE(GRPRSM,*) 'KWLOC1: INXBIT error reported = ',KRET
+ KRET = 1
+ GO TO 900
+ ENDIF
+C
+C Octet 43 : Identification number:
+C 1 If byte 42=1, identifies high resolution.
+C 2 If byte 42=1, identifies low resolution.
+C 3 Etc.(!?)
+C One 8 bit field.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,KSEC1(39),1,KBITS, 8,YFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ WRITE(GRPRSM,*) 'KWLOC1: INXBIT error reported = ',KRET
+ KRET = 1
+ GO TO 900
+ ENDIF
+C
+C Octet 44 : Products:
+C 1 Full field (individual forecast)/unweighted mean.
+C 2 Weighted mean.
+C 11 Standard deviation wrt ensemble mean.
+C 11 Standard deviation wrt ensemble mean, normalized.
+C One 8 bit field.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,KSEC1(40),1,KBITS, 8,YFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ WRITE(GRPRSM,*) 'KWLOC1: INXBIT error reported = ',KRET
+ KRET = 1
+ GO TO 900
+ ENDIF
+C
+C Octet 45 : Spatial smoothing of product (number of highest total
+C wavenumber included):
+C 255 Original resolution retained.
+C One 8 bit field.
+C
+ CALL INXBIT (KGRIB,KLENG,KNSPT,KSEC1(41),1,KBITS, 8,YFUNC,KRET)
+ IF (KRET.NE.0) THEN
+ WRITE(GRPRSM,*) 'KWLOC1: INXBIT error reported = ',KRET
+ KRET = 1
+ GO TO 900
+ ENDIF
+C
+C Octet 46 : Dummy.
+C One 8 bit field.
+C
+Cjdc KNSPT = KNSPT + 8
+C
+C ------------------------------------------------------------------
+C Section 9 . Abort/return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) THEN
+ WRITE(GRPRSM,*) 'KWLOC1 : Section 9.'
+ WRITE(GRPRSM,*) 'KWLOC1 : On output, KNSPT = ',KNSPT
+ ENDIF
+C
+C Abort if requested to do so when an error has been encountered.
+C
+ IF ( (IRET.EQ.0) .AND. (KRET.NE.0) ) THEN
+ CALL ABORTX ('KWLOC1')
+ ELSE
+ RETURN
+ ENDIF
+C
+ END
diff --git a/gribex/kwprs1.F b/gribex/kwprs1.F
new file mode 100755
index 0000000..82d3617
--- /dev/null
+++ b/gribex/kwprs1.F
@@ -0,0 +1,375 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE KWPRS1 (KSEC0,KSEC1)
+C
+C---->
+C**** KWPRS1
+C
+C Purpose.
+C --------
+C
+C Print the information in the Product Definition
+C Section (Section 1) of decoded Washington ensemble GRIB data.
+C
+C** Interface.
+C ----------
+C
+C CALL KWPRS1 (KSEC0,KSEC1)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KSEC0 - Array of decoded parameters from Section 0.
+C
+C KSEC1 - Array of decoded parameters from Section 1.
+C
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C
+C Method.
+C -------
+C
+C None.
+C
+C
+C Externals.
+C ----------
+C
+C PRTBIN
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes re GRIB Code.
+C See also routine GRIBEX.
+C http://www.nco.ncep.noaa.gov/pmb/docs/on388/appendixc.html.
+C
+C
+C Comments.
+C ---------
+C
+C
+C Washington ensemble product usage of local part of section 1 of
+C GRIB:
+C
+C KSEC1(37) decoded from Octet 41.
+C Identifies the application:
+C 1 Ensemble.
+C
+C KSEC1(38) decoded from Octet 42.
+C Type:
+C 1 Unperturbed control forecast,
+C 2 Individual negatively perturbed forecast,
+C 3 Individual positively perturbed forecast,
+C 4 Cluster,
+C 5 Whole ensemble.
+C
+C KSEC1(39) decoded from Octet 43.
+C Identification number:
+C 1 If byte 42 = 1, identifies high resolution.
+C 2 If byte 42 = 1, identifies low resolution.
+C 1-5 If byte 42 = 2 or 3, number of a member of a pair
+C of (negative perturbation, positive perturbation)
+C
+C KSEC1(40) decoded from Octet 44.
+C Product identifier:
+C 1 Full field (individual forecast)/unweighted mean.
+C 2 Weighted mean.
+C 11 Standard deviation wrt ensemble mean.
+C 11 Standard deviation wrt ensemble mean, normalized.
+C
+C KSEC1(41) decoded from Octet 45.
+C Spatial smoothing of product (number of highest total
+C wavenumber included):
+C 255 Original resolution retained.
+C
+C Following are used only if needed.
+C
+C Probability Section
+C -------------------
+C
+C KSEC1(42) decoded from Octet 46.
+C Probability product definition.
+C If octet 9 = 191 or 192, defines variable in terms of octet 9 table
+C
+C KSEC1(43) decoded from Octet 47.
+C Probability type
+C 1 = Probability of event below lower limit
+C 2 = Probability of event above upper limit
+C 3 = Probability of event between lower and upper limits
+C
+C KSEC1(44) decoded from Octets 48 - 51
+C Probability lower limit (unit as in octet 9; floating point number)
+C
+C KSEC1(45) decoded from Octets 52 - 55
+C Probability upper limit (unit as in octet 9; floating point number)
+C
+C Octets 56 - 60 are reserved.
+C
+C Following are used only if octet 42 = 4 or 5.
+C
+C Clustering Section
+C ------------------
+C
+C KSEC1(46) decoded from Octet 61.
+C Ensemble size (number of members, including controls)
+C
+C KSEC1(47) decoded from Octet 62.
+C Cluster size (number of members)
+C
+C KSEC1(48) decoded from Octet 63.
+C Number of clusters
+C
+C KSEC1(49) decoded from Octet 64.
+C Clustering Method
+C 1 = AC
+C 2 = RMS
+C
+C KSEC1(50) decoded from Octets 65 - 67
+C Northern latitude of clustering domain (in thousandths of degree)
+C
+C KSEC1(51) decoded from Octets 68 - 70
+C Southern latitude of clustering domain (in thousandths of degree)
+C
+C KSEC1(52) decoded from Octets 71 - 73
+C Eastern longitude of clustering domain (in thousandths of degree)
+C
+C KSEC1(53) decoded from Octets 74 - 76
+C Western longitude of clustering domain (in thousandths of degree)
+C
+C KSEC1(54 - 63) decoded from Octets 77 - 86
+C Cluster Membership (If octet 42 = 4)
+C Indicates in binary (on/off) format, which members of the ensemble
+C belong to the current cluster. Membership table defined by product
+C generators.
+C
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 09.10.95
+C
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+ INTEGER KSEC0
+ INTEGER KSEC1
+ DIMENSION KSEC0(*)
+ DIMENSION KSEC1(*)
+C
+C Local variables
+C
+ INTEGER LOOP
+ INTEGER*4 ILIMIT
+ REAL*4 RLIMIT
+ EQUIVALENCE(ILIMIT,RLIMIT)
+C
+C -----------------------------------------------------------------
+C* Section 1 . Print required information.
+C ----------------------------------------------------------------- C
+ 100 CONTINUE
+C
+C -----------------------------------------------------------------
+C* Section 2 . Print Washington ensemble product information.
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Application Identifier.
+C
+ WRITE(GRPRSM,9000) KSEC1(37)
+C
+C Type.
+C
+ IF(KSEC1(38).GT.5) WRITE(GRPRSM,9100) KSEC1(38)
+ IF(KSEC1(38).EQ.1) WRITE(GRPRSM,9101) KSEC1(38)
+ IF(KSEC1(38).EQ.2) WRITE(GRPRSM,9102) KSEC1(38)
+ IF(KSEC1(38).EQ.3) WRITE(GRPRSM,9103) KSEC1(38)
+ IF(KSEC1(38).EQ.4) WRITE(GRPRSM,9104) KSEC1(38)
+ IF(KSEC1(38).EQ.5) WRITE(GRPRSM,9105) KSEC1(38)
+C
+C Identification number.
+C
+ IF(KSEC1(38).NE.1) THEN
+ WRITE(GRPRSM,9200) KSEC1(39)
+ ELSE
+ IF(KSEC1(39).EQ.1) THEN
+ WRITE(GRPRSM,9201) KSEC1(39)
+ ELSE IF(KSEC1(39).EQ.2) THEN
+ WRITE(GRPRSM,9202) KSEC1(39)
+ ELSE
+ WRITE(GRPRSM,9200) KSEC1(39)
+ ENDIF
+ ENDIF
+C
+C Product.
+C
+ IF(KSEC1(40).EQ.1) THEN
+ WRITE(GRPRSM,9301) KSEC1(40)
+ ELSE IF(KSEC1(40).EQ.2) THEN
+ WRITE(GRPRSM,9302) KSEC1(40)
+ ELSE IF(KSEC1(40).EQ.11) THEN
+ WRITE(GRPRSM,9311) KSEC1(40)
+ ELSE IF(KSEC1(40).EQ.12) THEN
+ WRITE(GRPRSM,9312) KSEC1(40)
+ ELSE
+ WRITE(GRPRSM,9300) KSEC1(40)
+ ENDIF
+C
+C Spatial smoothing of product.
+C
+ IF( KSEC1(41).EQ.255) THEN
+ WRITE(GRPRSM,9400) KSEC1(41)
+ ELSE
+ WRITE(GRPRSM,9401) KSEC1(41)
+ ENDIF
+C
+C Probability Section
+C
+ IF( KSEC1(42).NE.0) THEN
+C
+C Probability type
+C
+ WRITE(GRPRSM,9500) KSEC1(42)
+ IF( KSEC1(43).EQ.1 ) THEN
+ WRITE(GRPRSM,9501) KSEC1(43)
+ ELSE IF( KSEC1(43).EQ.2 ) THEN
+ WRITE(GRPRSM,9502) KSEC1(43)
+ ELSE IF( KSEC1(43).EQ.3 ) THEN
+ WRITE(GRPRSM,9503) KSEC1(43)
+ ELSE
+ WRITE(GRPRSM,9504) KSEC1(43)
+ ENDIF
+C
+C Limits
+C
+ ILIMIT = KSEC1(44)
+ WRITE(GRPRSM,9505) RLIMIT
+C
+ ILIMIT = KSEC1(45)
+ WRITE(GRPRSM,9506) RLIMIT
+ ENDIF
+C
+C Clustering Section
+C
+ IF( KSEC1(46).NE.0) THEN
+C
+C Ensemble size
+C
+ WRITE(GRPRSM,9507) KSEC1(46)
+C
+ IF( KSEC1(47).NE.0 ) THEN
+C
+C Cluster size
+C Number of clusters
+C Clustering Method
+C
+ WRITE(GRPRSM,9508) KSEC1(47)
+ WRITE(GRPRSM,9509) KSEC1(48)
+ WRITE(GRPRSM,9510) KSEC1(49)
+C
+C North/South/East/West limits of clustering domain
+C
+ WRITE(GRPRSM,9511) KSEC1(50)
+ WRITE(GRPRSM,9511) KSEC1(51)
+ WRITE(GRPRSM,9511) KSEC1(52)
+ WRITE(GRPRSM,9511) KSEC1(53)
+C
+C Cluster Membership
+C
+ IF( KSEC1(38).EQ.4 ) THEN
+ WRITE(GRPRSM,9515)
+ WRITE(GRPRSM,9516)
+ DO LOOP = 1, KSEC1(46)
+ IF( KSEC1(53+LOOP).EQ.1 ) THEN
+ WRITE(GRPRSM,9517) LOOP
+ ELSE
+ WRITE(GRPRSM,9518) LOOP
+ ENDIF
+ ENDDO
+ ENDIF
+C
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 9 . Format statements. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ 9000 FORMAT(1H ,'Application Identifier.(1=Ensemble) ',I9)
+C
+ 9100 FORMAT(1H ,'Type: ',I9)
+ 9101 FORMAT(1H ,'Type: Unperturbed control forecast. ',I9)
+ 9102 FORMAT(1H ,'Type: Individual -vely perturbed fc. ',I9)
+ 9103 FORMAT(1H ,'Type: Individual +vely perturbed fc. ',I9)
+ 9104 FORMAT(1H ,'Type: Cluster. ',I9)
+ 9105 FORMAT(1H ,'Type: Whole ensemble. ',I9)
+C
+ 9200 FORMAT(1H ,'Identification number. ',I9)
+ 9201 FORMAT(1H ,'Identification number: (1=high res) ',I9)
+ 9202 FORMAT(1H ,'Identification number: (2=low res) ',I9)
+C
+ 9300 FORMAT(1H ,'Product. ',I9)
+ 9301 FORMAT(1H ,'Full field/unweighted mean. ',I9)
+ 9302 FORMAT(1H ,'Weighted mean. ',I9)
+ 9311 FORMAT(1H ,'Standard deviation wrt ensemble mean.',I9)
+ 9312 FORMAT(1H ,'Stand.dev. wrt ens. mean, normalized.',I9)
+C
+ 9400 FORMAT(1H ,'Original spatial smoothing retained. ',I9)
+ 9401 FORMAT(1H ,'Spatial smoothing of product: ',I9)
+C
+ 9500 FORMAT(1H ,'Probability product definition ',I9)
+ 9501 FORMAT(1H ,'Prob. of event below lower limit ',I9)
+ 9502 FORMAT(1H ,'Prob. of event above upper limit ',I9)
+ 9503 FORMAT(1H ,'Prob. of event between limits ',I9)
+ 9504 FORMAT(1H ,'Unknown probability type ',I9)
+ 9505 FORMAT(1H ,'Probability lower limit ',F15.6)
+ 9506 FORMAT(1H ,'Probability upper limit ',F15.6)
+ 9507 FORMAT(1H ,'Ensemble size (members + controls) ',I9)
+ 9508 FORMAT(1H ,'Cluster size (number of members) ',I9)
+ 9509 FORMAT(1H ,'Number of clusters ',I9)
+ 9510 FORMAT(1H ,'Clustering Method (1 = AC, 2 = RMS) ',I9)
+ 9511 FORMAT(1H ,'Northern latitude of domain (x1000) ',I9)
+ 9512 FORMAT(1H ,'Southern latitude of domain (x1000) ',I9)
+ 9513 FORMAT(1H ,'Eastern longitude of domain (x1000) ',I9)
+ 9514 FORMAT(1H ,'Western longitude of domain (x1000) ',I9)
+ 9515 FORMAT(1H ,'Cluster Membership')
+ 9516 FORMAT(1H ,'------------------')
+ 9517 FORMAT(1H ,'Ensemble member',I3,' in cluster')
+ 9518 FORMAT(1H ,'Ensemble member',I3,' not in cluster')
+C
+ END
diff --git a/gribex/l2u1cr.F b/gribex/l2u1cr.F
new file mode 100755
index 0000000..ed0a796
--- /dev/null
+++ b/gribex/l2u1cr.F
@@ -0,0 +1,141 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE L2U1CR (HSTRNG)
+C
+C---->
+C**** L2U1CR - Convert character string to upper case.
+C
+C Purpose.
+C --------
+C
+C Convert character string to all upper case.
+C
+C** Interface.
+C ----------
+C
+C CALL L2U1CR (HSTRNG)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input parameters.
+C -----------------
+C
+C HSTRNG - String in upper and/or lower case.
+C
+C Output parameters.
+C ------------------
+C
+C HSTRNG - Character string in all upper case.
+C
+C Method.
+C -------
+C
+C Numeric values of each byte examined and altered if in the
+C range of lower case letters.
+C
+C Externals.
+C ----------
+C
+C ICHAR
+C CHAR
+C
+C Reference.
+C ----------
+C
+C Cray Programmer's Library Reference Manual.
+C
+C Comments.
+C ---------
+C
+C Routine contains sections 0 to 1 and section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 07:04:89.
+C
+C Modifications
+C --------------
+C
+C J. Hennessy ECMWF 29.01.90
+C Replace null characters by blanks.
+C
+C ----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+ CHARACTER*(*) HSTRNG
+C
+C ASCII representation of lower case characters a and z.
+C
+ DATA IA /97/
+ DATA IZ /122/
+C
+C ASCII representation of null and blank characters.
+C
+ DATA INULL /0/
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Change any necessary letters.
+C ----------------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+C
+ ILEN = LEN (HSTRNG)
+C
+ DO 1100 J=1,ILEN
+ ICH = ICHAR (HSTRNG(J:J))
+ IF ( (ICH.GE.IA).AND.(ICH.LE.IZ) ) HSTRNG (J:J) = CHAR (ICH-32)
+ IF (ICH.EQ.INULL) HSTRNG (J:J) = CHAR (32)
+ 1100 CONTINUE
+C
+C ---------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 9000 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/ldc1cr.F b/gribex/ldc1cr.F
new file mode 100755
index 0000000..97867ac
--- /dev/null
+++ b/gribex/ldc1cr.F
@@ -0,0 +1,755 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE LDC1CR (HVERB,HOWN,HEXP,HTYP,HCLS,HSTR,HRUT,KPR,KRC)
+C
+C
+C---->
+C**** LDC1CR
+C
+C PURPOSE.
+C --------
+C
+C LIST ALL NODES AND FILES FOR A GIVEN RESEARCH EXPERIMENT.
+C FILES AND NODES UNDER OPERATIONS TEST ROOT-NODE MATST CAN
+C ALSO BE LISTED. OPERATIONAL ARCHIVES CANNOT BE LISTED -
+C THE VOLUME IS FAR TOO GREAT.
+C
+C REMOVE ALL NODES AND FILES FOR A GIVEN RESEARCH EXPERIMENT.
+C FILES AND NODES UNDER OPERATIONS TEST ROOT-NODE MATST CAN
+C ALSO BE REMOVED. OPERATIONAL ARCHIVES CANNOT BE REMOVED.
+C
+C** INTERFACE.
+C ----------
+C
+C CALL LDC1CR (HVERB,HOWN,HEXP,HTYP,HCLS,HSTR,HRUT,KPR,KRC)
+C
+C
+C INTEGER K.
+C REAL P.
+C LOGICAL O.
+C CHARACTER H.
+C
+C INPUT PARAMETERS.
+C -----------------
+C
+C HVERB - ACTION REQUIRED. 'LIST' OR 'REMOVE'
+C
+C HOWN - OWNER'S PASSWORD. 6 CHARACTERS FOR
+C RESEARCH EXPERIMENT, 5 FOR OPERATIONS.
+C
+C HEXP - 4 CHARACTER EXPERIMENT IDENTIFIER.
+C
+C HSTR - ARCHIVE STREAM.
+C FOR RESEARCH.
+C DA - DAILY ARCHIVE.
+C FOR OPERATIONS.
+C DA - DAILY ARCHIVE.
+C CH - CHERNOBYL ARCHIVE.
+C TG - TOGA ARCHIVE.
+C MO - MONTHLY ARCHIVE.
+C
+C HTYP - DATA TYPE.
+C AN - ANALYSIS.
+C IA - INITIALISED ANALYSIS.
+C FG - FIRST GUESS.
+C FC - FORECAST.
+C EA - ERRORS IN ANALYSIS.
+C CL - CLIMATOLOGY.
+C ALL - ALL TYPES.
+C
+C HCLS - OD , OPERATIONS.
+C RD , RESEARCH.
+C
+C HRUT - ROOT NODE TO BE USED.
+C FOR RESEARCH.
+C P , PRODUCTION ROOT MARSR.
+C T , TEST ROOT MATSR.
+C FOR OPERATIONS.
+C P , PRODUCTION ROOT MARST.
+C O , OLD PRODUCTION ROOT MARSO.
+C T , TEST ROOT MATST.
+C
+C KPR - DEBUG PRINT SWITCH.
+C 0 , NO PRINTOUT.
+C 1 , DEBUG PRINTOUT.
+C
+C OUTPUT PARAMETERS.
+C ------------------
+C
+C KRC - ERROR RETURN CODE.
+C 0 - NO ERROR ENCOUNTERED.
+C 1 - EXPERIMENT DOES NOT EXIST
+C 2 - EXPERIMENT IDIDENTIFIER NOT 4 CHARACTERS.
+C 3 - ACTION ATTEMPTED ON OPERATIONAL NODES OR
+C FILES.
+C 4 - ERROR REPORTED BY ECFILE.
+C 5 - OWNER PASSWORD INCORRECT LENGTH.
+C 6 - NO FREE FORTRAN UNIT NUMBERS.
+C
+C
+C METHOD.
+C -------
+C
+C EXPERIMENT IDENTIFIER , DATA TYPE, CLASS AND ROOT ARE USED
+C TO DETERMINE NODES AND FILES, WHICH ARE THEN LISTED.
+C THE LIST IS USED TO DELETE NODES AND FILES IF REQUESTED.
+C
+C EXTERNALS.
+C ----------
+C
+C ECFILE
+C L2U1CR
+C
+C REFERENCE.
+C ----------
+C
+C NONE.
+C
+C COMMENTS.
+C ---------
+C
+C PROGRAM CONTAINS SECTIONS 0 TO 6 AND SECTION 9.
+C
+C
+C AUTHOR.
+C -------
+C
+C J.HENNESSY ECMWF 04:07:89.
+C
+C MODIFICATIONS
+C --------------
+C
+C NONE.
+C
+C ----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 0 . DEFINITION OF VARIABLES. SET INITIAL VALUES.
+C ----------------------------------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+C
+C
+C
+C
+ DIMENSION YPATH(3)
+ DIMENSION YIU(6)
+ DIMENSION IU(6)
+ DIMENSION IREASON(5)
+C
+ CHARACTER*1 YCOMMA,YSTOP
+ CHARACTER*2 YIU
+ CHARACTER*5 YPATHC
+C
+ CHARACTER*8 HVERB
+ CHARACTER*6 HOWN
+ CHARACTER*4 HEXP
+ CHARACTER*2 HSTR
+ CHARACTER*4 HTYP
+ CHARACTER*2 HCLS
+ CHARACTER*1 HRUT
+C
+ CHARACTER*7 YLFNIN
+ CHARACTER*11 YLSTNA
+ CHARACTER*15 YNODE
+ CHARACTER*17 YPATH
+ CHARACTER*80 YLINE1
+ CHARACTER*80 YLINE2
+ CHARACTER*80 YPATH1
+ CHARACTER*80 YPATH2
+C
+ YLSTNA = 'FN=LIST,NA,'
+ YCOMMA = ','
+ YSTOP = '.'
+C
+C DEFAULT VALUES FOR NODES/FILES ARE RESEARCH PRODUCTION NODES AND
+C FILES.
+C
+ YPATHC = 'PATH='
+ YPATH(1) = '/MARSR '
+ YPATH(2) = '/CACHE/MARSR '
+ YPATH(3) = '/MARSBACKUP/MARSR'
+C
+C CHECK IF ACTION REQUIRED ON RESEARCH TEST ROOT.
+C
+ IF (HCLS.EQ.'RD'.AND.HRUT.EQ.'T')
+ C THEN
+ YPATH(1) = '/MATSR '
+ YPATH(2) = '/CACHE/MATSR '
+ YPATH(3) = '/MARSBACKUP/MATSR'
+ ENDIF
+C
+C CHECK IF ACTION REQUIRED ON OPERATIONS TEST ROOT.
+C
+ IF (HCLS.EQ.'OD'.AND.HRUT.EQ.'T')
+ C THEN
+ YPATH(1) = '/MATST '
+ YPATH(2) = '/CACHE/MATST '
+ YPATH(3) = '/MARSBACKUP/MATST'
+ ENDIF
+C
+C CHECK FOR ATTEMPTED ACTION ON OPERATIONS PRODUCTION ROOTS.
+C
+ IF (HCLS.EQ.'OD'.AND.HRUT.NE.'T')
+ C THEN
+ KRC = 3
+ WRITE (*,9100)
+ GO TO 9000
+ ENDIF
+C
+C GET 6 UNUSED FORTRAN UNIT NUMBERS.
+C
+ DO 10 J10 =1,6
+ CALL FTN1CR (IU(J10),KPR,ISERR)
+ IF (ISERR.NE.0)
+ C THEN
+ WRITE (*,9800)
+ KRC = 6
+ GO TO 9000
+ ENDIF
+ WRITE (YIU(J10),'(I2.2)') IU(J10)
+ OPEN (UNIT=IU(J10),STATUS='SCRATCH')
+ 10 CONTINUE
+C
+C
+C
+ JLOOP = 0
+ KRC = 0
+ IFLAG = 0
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 1 . PREPARE LIST COMMAND USING PATHNAME AND GET NODE1.
+C ----------------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'LDC1CR : SECTION 1'
+C
+C* GO TO SECTION 9 IF ERROR IN EXPERIMENT IDENTIFIER .
+C
+ I = INDEX (HEXP,' ')
+ IF (I.NE.0)
+ C THEN
+ KRC = 2
+ WRITE(*,9300) HEXP
+ IFLAG = 1
+ GO TO 9000
+ ENDIF
+C
+C* IF ACTION IS 'REMOVE' CHECK PASSWORD LENGTH.
+C
+ IF (HVERB.EQ.'REMOVE ')
+ C THEN
+ IL = INDEX (HOWN,' ')
+ IF (IL.EQ.6) IL = 5
+ IF (IL.EQ.0) IL = 6
+ IF (IL.EQ.5.AND.HCLS.NE.'OD') KRC = 5
+ IF (IL.EQ.6.AND.HCLS.NE.'RD') KRC = 5
+ IF (KRC.NE.0)
+ C THEN
+ WRITE (*,9400) HOWN
+ GO TO 9000
+ ENDIF
+ ENDIF
+C
+C LOOP ROUTINE FOR EACH TYPE OF PATHNAME
+C
+C IF JLOOP = 1 LOOK FOR NODES BEGINNING WITH /MARSR
+C IF JLOOP = 2 LOOK FOR NODES BEGINNING WITH /CACHE/MARSR
+C IF JLOOP = 3 LOOK FOR NODES BEGINNING WITH /MARSBACKUP/MARSR
+C
+ JLOOP = JLOOP + 1
+ IF (JLOOP.GT.3) GO TO 6000
+C
+C* REWIND ALL FILES AT BEGINNING OF EACH LOOP
+C
+ REWIND IU(1)
+ REWIND IU(2)
+ REWIND IU(3)
+ REWIND IU(4)
+C
+ YLFNIN = 'L=FT' // YIU(1)
+ YLINE1(1:) = ' '
+ YLINE1(1:11) = YLSTNA
+ YLINE1(12:17) = YLFNIN
+ YLINE1(18:18) = YCOMMA
+ YLINE1(19:23) = YPATHC
+ YLINE1(24:) = YPATH(JLOOP)
+C
+ IJ = INDEX(YLINE1,' ')
+ YLINE1(IJ:IJ) = YSTOP
+C
+ IF (KPR.EQ.1) WRITE (*,'(1X,A80)') YLINE1
+C
+ CALL ECFILE (IERR,IREASON,YLINE1)
+C
+C* TRAP CFS RETURN CODES FOR FILE/NODE DOES NOT EXIST.
+C
+ IF (IERR .EQ. 9.
+ C AND.IREASON(1).EQ.1.
+ C AND.IREASON(2).EQ.1.
+ C AND.IREASON(3).EQ.33) GO TO 1000
+C
+C* GO TO SECTION 9 , IF ANY OTHER ERROR REPORTED.
+C
+ IF (IERR.NE.0)
+ C THEN
+C
+ KRC = 4
+ WRITE (*,9500) IERR, IREASON
+ WRITE (*,9600) YLINE1
+ GO TO 9000
+ ENDIF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 2 . ISSUE LIST COMMAND(S) USING PATHNAME/NODE1/EXPID.
+C ---------------------------------------------------------------
+C
+C
+ 2000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'LDC1CR : SECTION 2'
+C
+C CREATE EACH PATHNAME + NODE(S)
+C IF TYPE = ALL THEN LIST ALL TYPES
+C
+ REWIND IU(1)
+C
+ 2100 CONTINUE
+ READ (IU(1),'(A80)',END=6000) YLINE1
+ CALL L2U1CR (YLINE1)
+ IF (YLINE1(19:22).NE.'DESC') GO TO 2100
+C
+C
+ 2200 CONTINUE
+ READ (IU(1),'(A80)',END=6000) YLINE1
+ CALL L2U1CR (YLINE1)
+ IF (YLINE1(19:22).EQ.' ') GO TO 1000
+C
+ IF (HTYP(1:3).EQ.'ALL') GO TO 2220
+ IF (HTYP(1:2).NE.YLINE1(19:20)) GO TO 2200
+C
+ 2220 CONTINUE
+ YNODE = '/' // YLINE1(19:20) // '/' // HEXP
+ IF (JLOOP .EQ. 1) YPATH1 = YPATH(JLOOP)(1:6) // YNODE
+ IF (JLOOP .EQ. 2) YPATH1 = YPATH(JLOOP)(1:12) // YNODE
+ IF (JLOOP .EQ. 3) YPATH1 = YPATH(JLOOP) // YNODE
+C
+C
+ YLFNIN = 'L=FT'//YIU(2)
+ YLINE1(1:11) = YLSTNA
+ YLINE1(12:17) = YLFNIN
+ YLINE1(18:18) = YCOMMA
+ YLINE1(19:23) = YPATHC
+ YLINE1(24:) = YPATH1
+ IJ = INDEX (YLINE1,' ')
+ YLINE1(IJ:IJ) = YSTOP
+ IPTR = IJ
+ IF (KPR.EQ.1) WRITE (*,'(1H ,A80)') YLINE1
+C
+ CALL ECFILE (IERR,IREASON,YLINE1)
+C
+C* TRAP CFS RETURN CODES FOR FILE/NODE DOES NOT EXIST.
+C
+ IF (IERR.EQ.9.
+ C AND.IREASON(1).EQ.1.
+ C AND.IREASON(2).EQ.1.
+ C AND.IREASON(3).EQ.33) GO TO 2200
+C
+C* GO TO SECTION 9 , IF ANY OTHER ERROR REPORTED.
+C
+ IF (IERR.NE.0)
+ C THEN
+ KRC = 4
+ WRITE (*,9500) IERR, IREASON
+ WRITE (*,9600) YLINE1
+ GO TO 9000
+ ENDIF
+C
+C SET FLAG TO INDICATE NODE FOUND FOR GIVEN EXPERIMENT IDENTIFIER.
+C
+ IFLAG = 1
+C
+C -----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 3 . ISSUE LIST COMMAND USING PATHNAME/NODE1/EXPID/NODE2.
+C ------------------------------------------------------------------
+C
+ 3000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'LDC1CR : SECTION 3'
+C
+C CREATE PATHNAME WITH NEXT NODE.
+C
+ REWIND IU(2)
+ 3100 CONTINUE
+ READ (IU(2),'(A80)',END=2200) YLINE1
+ CALL L2U1CR (YLINE1)
+ IF (YLINE1(19:22).NE.'DESC') GO TO 3100
+C
+ IPT1 = 0
+ 3200 CONTINUE
+ READ (IU(2),'(A80)',END=2200) YLINE1
+ CALL L2U1CR (YLINE1)
+ IF (YLINE1(19:22).EQ.' ') GO TO 2200
+ YNODE = '/'//YLINE1(19:22)
+ IJ = INDEX (YPATH1,' ')
+ IF (IPT1.EQ.0) IPT1 = IJ - 1
+ YPATH1 = YPATH1(1:IPT1)//YNODE
+C
+ YLINE1(1:) = ' '
+ YLFNIN = 'L=FT'//YIU(3)
+ YLINE1(1:11) = YLSTNA
+ YLINE1(12:17) = YLFNIN
+ YLINE1(18:18) = YCOMMA
+ YLINE1(19:23) = YPATHC
+ YLINE1(24:) = YPATH1
+ IJ = INDEX (YLINE1,' ')
+ YLINE1(IJ:IJ) = YSTOP
+ IF (KPR.EQ.1) WRITE (*,'(1H ,A80)') YLINE1
+C
+ CALL ECFILE (IERR,IREASON,YLINE1)
+C
+C* TRAP CFS RETURN CODES FOR FILE/NODE DOES NOT EXIST.
+C
+ IF (IERR.EQ.9.
+ C AND.IREASON(1).EQ.1.
+ C AND.IREASON(2).EQ.1.
+ C AND.IREASON(3).EQ.33) GO TO 3200
+C
+C* GO TO SECTION 9 , IF ANY OTHER ERROR REPORTED.
+C
+ IF (IERR.NE.0)
+ C THEN
+ KRC = 4
+ WRITE (*,9500) IERR, IREASON
+ WRITE (*,9600) YLINE1
+ GO TO 9000
+ ENDIF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 4. ISSUE LIST COMMAND PATHNAME/NODE1/EXPID/NODE2/NODE3.
+C ------------------------------------------------------------------
+C
+ 4000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'LDC1CR : SECTION 4'
+C
+ REWIND IU(3)
+C
+ 4200 CONTINUE
+ READ (IU(3),'(A80)',END=3200) YLINE1
+ CALL L2U1CR (YLINE1)
+ IF (YLINE1(19:22).NE.'DESC') GO TO 4200
+C
+ 4300 CONTINUE
+ READ (IU(3),'(A80)',END=3200) YLINE1
+ CALL L2U1CR (YLINE1)
+ IF (YLINE1(19:22).EQ.' ') GO TO 3200
+ YNODE = '/'//YLINE1(19:22)
+ IJ = INDEX (YPATH1,' ')
+ IPTR = IJ - 1
+ YPATH1 = YPATH1(1:IPTR)//YNODE
+ YPATH2 = YPATH1
+ WRITE (*,'(1H1,''CFS PATHNAME -'')')
+ WRITE (*,'(5X,A80)') YPATH1
+C
+C* WRITE PATHNAME TO FILE USED IN DELETING NODES .
+C
+ YLINE2='FN=REMOVE,PW='//HOWN(1:IL)//',NA,PATH='//YPATH2
+ IJ = INDEX (YLINE2,' ')
+ YLINE2(IJ:) = '.'
+ WRITE (IU(6),'(A80)') YLINE2
+C
+C
+ REWIND IU(4)
+ YLINE1(1:) = ' '
+ YLFNIN = 'L=FT'//YIU(4)
+ YLINE1(1:11) = YLSTNA
+ YLINE1(12:17) = YLFNIN
+ YLINE1(18:18) = YCOMMA
+ YLINE1(19:23) = YPATHC
+ YLINE1(24:) = YPATH1
+ IJ = INDEX (YLINE1,' ')
+ YLINE1(IJ:IJ) = YSTOP
+ YPATH1(IPTR+1: ) = ' '
+ IF (KPR.EQ.1) WRITE (*,'(1H ,A80)') YLINE1
+C
+ CALL ECFILE (IERR,IREASON,YLINE1)
+C
+C* TRAP CFS RETURN CODES FOR FILE/NODE DOES NOT EXIST.
+C
+ IF (IERR.EQ.9.
+ C AND.IREASON(1).EQ.1.
+ C AND.IREASON(2).EQ.1.
+ C AND.IREASON(3).EQ.33) GO TO 4300
+C
+C* GO TO SECTION 9 , IF ANY OTHER ERROR REPORTED.
+C
+ IF (IERR.NE.0)
+ C THEN
+ KRC = 4
+ WRITE (*,9500) IERR, IREASON
+ WRITE (*,9600) YLINE1
+ GO TO 9000
+ ENDIF
+C
+C ---------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 5. PRINT OUT CFS FILE NAMES.
+C ---------------------------------------------------------------
+C
+ 5000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'LDC1CR : SECTION 5.'
+C
+ REWIND (IU(4))
+C
+ WRITE (*,'(1H ,''CFS-FILES'')')
+ 5100 CONTINUE
+ READ (IU(4),'(A80)',END=5300) YLINE1
+ CALL L2U1CR (YLINE1)
+ IF (YLINE1(19:22).NE.'DESC') GO TO 5100
+C
+ 5200 CONTINUE
+ READ (IU(4),'(A80)',END=5300) YLINE1
+ CALL L2U1CR (YLINE1)
+ IF (YLINE1(19:22).EQ.' ') GO TO 4300
+ WRITE (*,'(5X,A14)') YLINE1(19:32)
+ YLINE2='FN=DELETE,PW='//HOWN(1:IL)//',NA,PATH='//YPATH2
+ IJ = INDEX (YLINE2,' ')
+ INOD = IJ
+ YLINE2(IJ:) = '/'//YLINE1(19:32)//'.'
+C
+C* WRITE PATHNAME TO FILE USED IN DELETING FILES .
+C
+ WRITE (IU(5),'(A80)') YLINE2
+ GO TO 5200
+ 5300 CONTINUE
+ WRITE (*,*) 'HOW DID I GET HERE'
+ YLINE2 = YLINE2(1:IJ-1)//'.'
+ WRITE (*,'(1H ,A80)') YLINE2
+ GO TO 4300
+C
+C ---------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 6 . DELETE CFS FILES AND REMOVE NODES . IF REQUIRED.
+C ------------------------------------------------------------------
+C
+ 6000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'LDC1CR : SECTION 6.'
+C
+C* GO TO SECTION 9 IF LIST OF NODES AND FILES ONLY.
+C
+ IF (HVERB.EQ.'LIST ') GO TO 9000
+ IERR=0
+C
+C DELETE FILES.
+C
+ REWIND IU(5)
+ 6100 CONTINUE
+ READ (IU(5),'(A80)',END=6200) YLINE2
+C
+ IF (KPR.EQ.1) WRITE (*,'(1H ,A80)') YLINE2
+ CALL ECFILE (IERR,IREASON,YLINE2)
+C
+C* GO TO SECTION 9 , IF ERROR REPORTED.
+C
+ IF (IERR.NE.0)
+ C THEN
+ KRC = 4
+ WRITE (*,9700) IERR, IREASON
+ WRITE (*,9600) YLINE2
+ GO TO 9000
+ ENDIF
+C
+ GO TO 6100
+C
+ 6200 CONTINUE
+C
+C REMOVE NODES.
+C
+ REWIND IU(6)
+ 6300 CONTINUE
+ READ (IU(6),'(A80)',END=6400) YLINE2
+ 6350 CONTINUE
+ IF (KPR.EQ.1) WRITE (*,'(1H ,A80)') YLINE2
+ CALL ECFILE (IERR,IREASON,YLINE2)
+C
+C TRAP RETURN CODES FOR NODE HAS DESCENDANTS. EXPERIMENT
+C IDENTIFIER NODES CAN HAVE SEVERAL DESCENDANTS, AND ARE
+C REMOVED WHEN ALL DESCENDANTS HAVE BEEN REMOVED.
+C
+ IF (IERR.EQ.9.
+ C AND.IREASON(1).EQ.1.
+ C AND.IREASON(2).EQ.104.
+ C AND.IREASON(3).EQ.0) GO TO 6300
+C
+C* GO TO SECTION 9 , IF ERROR REPORTED.
+C
+ IF (IERR.NE.0)
+ C THEN
+ KRC = 4
+ WRITE (*,9700) IERR, IREASON
+ WRITE (*,9600) YLINE2
+ GO TO 9000
+ ENDIF
+C
+C MODIFY COMMAND AS LAST NODE HAS BEEN REMOVED.
+C
+ I = INDEX (YLINE2,'.')
+ DO 6360 J6360 = I,1,-1
+ IF (YLINE2(J6360:J6360).EQ.'/')
+ C THEN
+ YLINE2(J6360:) = '.'
+ GO TO 6370
+ ENDIF
+ 6360 CONTINUE
+C
+ 6370 CONTINUE
+C
+C NODES ARE REMOVED ONLY AS FAR AS THE TYPE NODE EG AN,OR FC.
+C
+ IF (YLINE2(J6360-3:J6360-3).NE.'/') GO TO 6350
+C
+ GO TO 6300
+C
+C
+ 6400 CONTINUE
+C
+C
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* SECTION 9 . RETURN TO CALLING ROUTINE.FORMAT STATEMENTS.
+C ------------------------------------------------------------------
+C
+C
+ 9000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'LDC1CR : SECTION 9.'
+C
+C CLOSE AND RETURN FILES.
+C
+ DO 9010 J9010=1,6
+ CLOSE (UNIT=IU(J9010))
+ 9010 CONTINUE
+C
+C SEE IF THE EXPERIMENT DOES EXIST IN CFS (IE IFLAG =1)
+C
+ IF (IFLAG .EQ. 0)
+ C THEN
+ KRC = 1
+ WRITE (*,9200) HEXP
+ ENDIF
+ RETURN
+C
+C
+ 9100 FORMAT (' LDC1CR : ACTION ATTEMPTED ON OPERATIONAL PRODUCTION',
+ C ' NODES OR FILES.')
+C
+ 9500 FORMAT (' LDC1CR : NODE/FILE LISTING ERROR. FAILURE CODE = ',I3,
+ C ' , REASON CODES = ',3I6,'.')
+C
+ 9600 FORMAT (1H ,A)
+C
+ 9700 FORMAT (' LDC1CR : NODE/FILE REMOVAL ERROR. FAILURE CODE = ',I3,
+C
+ C ' , REASON CODES = ',3I6,'.')
+C
+ 9800 FORMAT (' LDC1CR : NO FREE FORTRAN UNIT NUMBERS.')
+C
+ 9200 FORMAT (' LDC1CR : EXPERIMENT IDENTIFIER OF ',A5,' NOT IN CFS')
+C
+ 9300 FORMAT (' LDC1CR : EXPERIMENT IDENTIFIER NOT 4 CHARACTERS - ',
+ C A)
+ 9400 FORMAT (' LDC1CR : OWNER (PASSWORD) INVALID - ',A)
+C
+C ------------------------------------------------------------------
+C
+C
+ END
diff --git a/gribex/lnbfcr.F b/gribex/lnbfcr.F
new file mode 100755
index 0000000..42cf1f6
--- /dev/null
+++ b/gribex/lnbfcr.F
@@ -0,0 +1,220 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE LNBFCR (KARRAY,KLENB)
+C
+C---->
+C**** LNBFCR - Calculate length of BUFR message on Cray.
+C
+C Purpose.
+C --------
+C
+C Calculate length of BUFR message.
+C
+C** Interface.
+C ----------
+C
+C CALL LNBFCR (KARRAY,KLENB)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input parameters.
+C -----------------
+C
+C KARRAY - Array containing BUFR message.
+C
+C KLENB - 0, abort if error.
+C 1, return to calling routine even if error,
+C unless array limits exceeded.
+C
+C Output parameters.
+C ------------------
+C
+C KLENB - Length of BUFR message in bytes.
+C -1, error in calculating length.
+C
+C Method.
+C -------
+C
+C The length of each BUFR message is calculated
+C from the BUFR header Sections.
+C
+C Externals.
+C ----------
+C
+C UNPACK
+C
+C Reference.
+C ----------
+C
+C WMO BUFR Code Documentation.
+C
+C Comments.
+C ---------
+C
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 20:06:90.
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 18:12:90.
+C Soft fail option added.
+C
+C J. Hennessy ECMWF 04:02:92.
+C Modified to cater for Edition 2 of BUFR code.
+C
+C ----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+ PARAMETER (JPBYT=2056)
+C
+ DIMENSION KARRAY(*)
+ DIMENSION ISCATR(JPBYT)
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Calculate BUFR length.
+C ----------------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+ IABORT = KLENB
+C
+C Unpack first JPBYT bytes of data.
+C
+ CALL UNPACK (KARRAY,8,ISCATR,JPBYT)
+C
+C BUFR Edition 2 or greater has full message length in
+C bytes 5-7. ( Edition number is in byte 8)
+C
+ IF (ISCATR(8).GE.2)
+ C THEN
+ KLENB = SHIFTL(ISCATR(5),16) + SHIFTL(ISCATR(6),8)
+ C + ISCATR(7)
+ GO TO 9000
+ ENDIF
+C
+C Length not in message, so calculate.
+C Count of octets in Section 0.
+C
+ KLENB = 4
+C
+C Count of octets in Section 1.
+C
+ KLENB = KLENB + SHIFTL(ISCATR(5),16) + SHIFTL(ISCATR(6),8)
+ C + ISCATR(7)
+C
+C Check if optional Section 2 is present.
+C
+ IFLAG = ISCATR(12)
+C
+C Check flag value.
+C
+ IF (IFLAG.NE.0.AND.IFLAG.NE.128)
+ C THEN
+ WRITE (*,9002) IFLAG
+ IF (IABORT.EQ.0) CALL ABORT
+ KLENB = -1
+ GO TO 9000
+ ENDIF
+C
+ IF (IFLAG.EQ.128)
+ C KLENB = KLENB + SHIFTL(ISCATR(KLENB+1),16) +
+ C SHIFTL(ISCATR(KLENB+2),8) + ISCATR(KLENB+3)
+C
+C Check on array length.
+C
+ IF (KLENB.GT.JPBYT)
+ C THEN
+ WRITE (*,9001)
+ IF (IABORT.EQ.0) CALL ABORT
+ KLENB = -1
+ GO TO 9000
+ ENDIF
+C
+C Length of Section 3.
+C
+ KLENB = KLENB + SHIFTL(ISCATR(KLENB+1),16) +
+ C SHIFTL(ISCATR(KLENB+2),8) + ISCATR(KLENB+3)
+C
+C Check on array length.
+C
+ IF ((KLENB+3).GT.JPBYT)
+ C THEN
+ WRITE (*,9001)
+ IF (IABORT.EQ.0) CALL ABORT
+ KLENB = -1
+ GO TO 9000
+ ENDIF
+C
+C Length of binary data Section 4.
+C
+ KLENB = KLENB + SHIFTL(ISCATR(KLENB+1),16) +
+ C SHIFTL(ISCATR(KLENB+2),8) + ISCATR(KLENB+3)
+C
+C Length of Section 5.
+C
+ KLENB = KLENB + 4
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine.
+C ------------------------------------------------------------------
+C
+ 9000 CONTINUE
+C
+ 9001 FORMAT (1H ,'LNBFCR : Array ISCATR limits exceeded.')
+C
+ 9002 FORMAT (1H ,'LNBFCR : Error in section 2 flag - ',I4)
+C
+ RETURN
+C
+ END
diff --git a/gribex/lngbcr.F b/gribex/lngbcr.F
new file mode 100755
index 0000000..d058198
--- /dev/null
+++ b/gribex/lngbcr.F
@@ -0,0 +1,309 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE LNGBCR (KARRAY,KLENB)
+C
+C---->
+C**** LNGBCR - Calculate or extract length of GRIB field on Cray.
+C
+C Purpose.
+C --------
+C
+C Calculate or extract length of GRIB field.
+C
+C** Interface.
+C ----------
+C
+C CALL LNGBCR (KARRAY,KLENB)
+C
+C INTEGER K.
+C REAL P.
+C LOGICAL O.
+C CHARACTER H.
+C
+C Input parameters.
+C -----------------
+C
+C KARRAY - Array containing GRIB field.
+C
+C Output parameters.
+C ------------------
+C
+C KLENB - Length of GRIB field in bytes.
+C
+C Method.
+C -------
+C
+C The length of each GRIB encoded field is calculated
+C from the GRIB header Sections for Experimental Edition
+C or Edition 0 of GRIB code. For GRIB Edition 1 the length
+C is extracted from bytes 5-7 of section 0.
+C
+C Externals.
+C ----------
+C
+C UNPACK
+C
+C Reference.
+C ----------
+C
+C WMO GRIB Code Documentation.
+C
+C Research Department Documentation for description of
+C BUDG and TIDE Pseudo-Grib messages.
+C
+C Comments.
+C ---------
+C
+C ECMWF Pseudo-Grib fields (BUDG and TIDE)are handled by this
+C routine.
+C
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 30:04:90.
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 31:05:90.
+C Increase array size to accommodate vertical level
+C co-ordinates of model level data. Add array size check.
+C
+C J. Hennessy ECMWF 13:11:90.
+C Increase array size to accommodate bit maps.
+C
+C J. Hennessy ECMWF 16:05:91.
+C Modified to handle GRIB Edition 1.
+C
+C J. Hennessy ECMWF 23:09:92.
+C Washington SST made fixed length for GRIB Edition 1.
+C
+C ----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+ PARAMETER (JPBYT=5440)
+C
+ DIMENSION KARRAY(*)
+ DIMENSION ISCATR(JPBYT)
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Unpack the data.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Unpack first JPBYT octets of data, 1 octet per word.
+C
+ CALL UNPACK (KARRAY,8,ISCATR,JPBYT)
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Identify GRIB Edition of data.
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C In the Experimental GRIB Edition, octet 8 is a flag field
+C and can have a valid value of 0, 1, 2 or 3.
+C In GRIB Edition 0, octet 8 is reserved and set to 0.
+C In GRIB Edition 1, the edition number is in octet 8.
+C
+C However, Edition 0 of the code has a fixed length of 24 octets,
+C included in the message, for section 1, so if the value
+C contained in octets 5-7 is 24, and that in octet 8 is 0, it
+C is safe to assume Edition 0 of the GRIB code.
+C
+ IF (ISCATR(5).EQ.0.AND.ISCATR(6).EQ.0.AND.ISCATR(7).EQ.24.
+ C AND.ISCATR(8).EQ.0)
+ C THEN
+ ISNEW = 1
+ GO TO 400
+ ENDIF
+C
+C In the Experimental GRIB Edition, octets 23 and 24 are reserved
+C and set to 0. These octets in Edition 1 are the month and the day,
+C and must be non-zero.
+C
+ IF (ISCATR(22).EQ.0.AND.ISCATR(23).EQ.0)
+ C THEN
+ ISNEW = 0
+ GO TO 400
+ ENDIF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 3 . Extract GRIB length from Edition 1 data.
+C ----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C Edition number is 1, so extract length from octets 5-7.
+C
+ KLENB = SHIFTL(ISCATR(5),16) + SHIFTL(ISCATR(6),8) + ISCATR(7)
+ IF (ISCATR(13).EQ.7.AND.ISCATR(17).EQ.139) KLENB = 34920
+ GO TO 900
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 4 . Calculate GRIB length.
+C ----------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+C NMC Washington Sea Surface Temperature analysis is a global
+C field made in ECMWF from 8 component fields received on the GTS
+C and coded in GRIB using ECMWF field code 139. This field
+C contains a bit map and varies in length. For archiving purposes
+C a fixed length was used (34920) bytes. NMC has code figure 7
+C as centre of origin. Experimental Edition of GRIB was never
+C used for this product.
+C
+ IF (ISNEW.EQ.1.AND.ISCATR(9).EQ.7.AND.ISCATR(13).EQ.139)
+ C THEN
+ KLENB = 34920
+ GO TO 900
+ ENDIF
+C
+C Count of octets in Section 0.
+C
+ KLENB = 4
+C
+C Count of octets in Section 1 - code edition dependent.
+C
+ KLENB = KLENB + 20 + (ISNEW*4)
+C
+C Check if optional Section 2 is present.
+C
+ IFLAG = ISCATR(8+4*ISNEW)
+ INC = 0
+ IF (ISNEW.EQ.0)
+ C THEN
+ IF (IFLAG.EQ.1.OR.IFLAG.EQ.3) INC = 1
+ ELSE
+ IF (IFLAG.EQ.128.OR.IFLAG.EQ.192) INC = 1
+ ENDIF
+C
+ IF (INC.EQ.1)
+ C KLENB = KLENB + SHIFTL(ISCATR(KLENB+1),16) +
+ C SHIFTL(ISCATR(KLENB+2),8) + ISCATR(KLENB+3)
+C
+C Check on array length.
+C
+ IF (KLENB.GT.JPBYT)
+ C THEN
+ WRITE (*,9001)
+ CALL ABORT
+ ENDIF
+C
+C Check if optional Section 3 is present.
+C
+ INC = 0
+ IF (ISNEW.EQ.0)
+ C THEN
+ IF (IFLAG.EQ.2.OR.IFLAG.EQ.3) INC = 1
+ ELSE
+ IF (IFLAG.EQ.64.OR.IFLAG.EQ.192) INC = 1
+ ENDIF
+C
+ IF (INC.EQ.1)
+ C KLENB = KLENB + SHIFTL(ISCATR(KLENB+1),16) +
+ C SHIFTL(ISCATR(KLENB+2),8) + ISCATR(KLENB+3)
+C
+C Check on array length.
+C
+ IF ((KLENB+3).GT.JPBYT)
+ C THEN
+ WRITE (*,9001)
+ CALL ABORT
+ ENDIF
+C
+C Length of binary data Section 4.
+C
+ KLENB = KLENB + SHIFTL(ISCATR(KLENB+1),16) +
+ C SHIFTL(ISCATR(KLENB+2),8) + ISCATR(KLENB+3)
+C
+C Length of Section 5.
+C
+ KLENB = KLENB + 4
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ 9001 FORMAT (1H ,'LNGBCR : Array ISCATR limits exceeded.')
+C
+ RETURN
+C
+ END
diff --git a/gribex/local2.F b/gribex/local2.F
new file mode 100755
index 0000000..5ece162
--- /dev/null
+++ b/gribex/local2.F
@@ -0,0 +1,236 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION LOCAL2(KTABLE, KPARAM, KCENTR,
+ X HFIRST, HSECOND, HTHIRD, HFOURTH)
+C
+C---->
+C**** LOCAL2
+C
+C Purpose
+C -------
+C
+C Looks up the description of a parameter in known table 2 versions
+C for WMO code FM 92-X Ext. GRIB.
+C
+C
+C Interface
+C ---------
+C
+C IRET = LOCAL2(KTABLE, KPARAM, KCENTR,
+C HFIRST, HSECOND, HTHIRD, HFOURTH)
+C
+C Input
+C -----
+C
+C KTABLE - Local table 2 version number.
+C KPARAM - Parameter number.
+C KCENTR - Centre number.
+C
+C
+C Output
+C ------
+C
+C HFIRST - First line of descriptor: MARS mnemonic
+C HSECOND - Second line of descriptor: Parameter description
+C HTHIRD - Third line of descriptor: Units for the parameter
+C HFOURTH - Fourth line of descriptor: Description of units
+C
+C Function return value is
+C 0 if no error detected.
+C 20001 if no match found for the parameter number in
+C the given table.
+C 20002 if there is an error opening the file holding
+C the given table.
+C 20003 if there is an error finding an unused fortran unit
+C number for reading the table.
+C
+C
+C Method
+C ------
+C
+C Checks if environment variable ECMWF_LOCAL_TABLE_PATH exists to
+C define the location of the parameter tables.
+C
+C Otherwise, looks for table xxx in:
+C /home/ecmwf/emos_sms/tables/gribex/nnnnnn/local_table_2_version_xxx.
+C where nnnnnn is the current EMOSLIB version.
+C
+C Entry for each parameter in table has the format (without quotes):
+C "......................" Separator
+C "051" Paramter number
+C "MX2T24" MARS mnemonic
+C "Max 2m temp" Parameter description
+C "K" Units for the parameter
+C "During previous 24 hours" Further description
+C
+C There is a termination "......................" line in the file
+C and there may be lines of comment before the first parameter entry.
+C
+C The parameter definition file is kept open between calls.
+C
+C
+C Externals
+C ---------
+C TAB2FIL - Builds code table 2 file name.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Sept 1995
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C J. Clochard, Meteo France, for ECMWF - June 1999.
+C Argument KCENTR added for code tables management.
+C Use TAB2FIL function for file name building.
+C
+C _______________________________________________________
+C----<
+C
+C
+ IMPLICIT NONE
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 20000 )
+C
+C Function arguments
+C
+ INTEGER KPARAM, KTABLE, KCENTR
+ CHARACTER*(*) HFIRST, HSECOND, HTHIRD, HFOURTH
+C
+C Local variables
+C
+ INTEGER IPR, IRET, ISTATUS, IPARAM, ITABLE
+ CHARACTER*256 YFILE, YDUMMY
+C
+ INTEGER NOLDTAB, NUNIT
+ SAVE NOLDTAB, NUNIT
+C
+C External functions
+C
+ INTEGER TAB2FIL
+ EXTERNAL TAB2FIL
+C
+ DATA NOLDTAB/-1/
+C
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ LOCAL2 = 0
+C
+C Put phoney fields in return parameters
+C
+ HFIRST = 'NONE'
+ HSECOND = 'Undefined parameter'
+ HTHIRD = 'Undefined parameter'
+ HFOURTH = 'Undefined parameter'
+C
+C See if a new table is requested.
+C
+ IF( MAX( KTABLE, KPARAM) .LE. 127 ) THEN
+ ITABLE = KTABLE
+ ELSE
+ ITABLE = 1000*KCENTR + KTABLE
+ ENDIF
+C
+ IF( ITABLE.NE.NOLDTAB ) THEN
+ IF( NOLDTAB.NE.-1 ) CLOSE(UNIT=NUNIT)
+ NOLDTAB = ITABLE
+C
+C Find an unused fortran unit number
+C
+ IPR = 0
+ CALL FTN1CR(NUNIT, IPR, IRET)
+ IF( IRET.NE.0 ) THEN
+ LOCAL2 = JPROUTINE + 3
+ RETURN
+ ENDIF
+C
+C Build filename
+C
+ IRET = TAB2FIL( KTABLE, KPARAM, KCENTR, YFILE )
+C
+C Open file
+C
+ OPEN(UNIT=NUNIT, FILE=YFILE, ERR=910, IOSTAT=ISTATUS,
+ X STATUS='OLD',FORM='FORMATTED')
+C
+C Otherwise, use the existing open parameter table file.
+C
+ ELSE
+ REWIND NUNIT
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 2. Search for the parameter in the table.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Skip lines until '......................' separator found
+C
+ 210 CONTINUE
+ READ(NUNIT,'(A)',END=230) YDUMMY
+ IF( YDUMMY(1:22).EQ.'......................') GOTO 225
+ GOTO 210
+C
+C Loop through file
+C
+ 220 CONTINUE
+ READ(NUNIT,'(A)',END=230) YDUMMY
+ 225 CONTINUE
+ READ(NUNIT,'(I3.3)',END=230) IPARAM
+ IF ( IPARAM .EQ. KPARAM ) THEN
+ READ(NUNIT,'(A)',END=230) HFIRST
+ READ(NUNIT,'(A)',END=230) HSECOND
+ READ(NUNIT,'(A)',END=230) HTHIRD
+ READ(NUNIT,'(A)',END=230) HFOURTH
+ LOCAL2 = 0
+ GOTO 900
+ ELSE
+ READ(NUNIT,'(A)',END=230) YDUMMY
+ READ(NUNIT,'(A)',END=230) YDUMMY
+ READ(NUNIT,'(A)',END=230) YDUMMY
+ READ(NUNIT,'(A)',END=230) YDUMMY
+ ENDIF
+ GOTO 220
+C
+C Dropthrough if no match found
+C
+ 230 CONTINUE
+ LOCAL2 = JPROUTINE + 1
+ GOTO 900
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+C Error opening table file
+C
+ 910 CONTINUE
+ LOCAL2 = JPROUTINE + 2
+ RETURN
+C
+C Normal return.
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/local2c.c b/gribex/local2c.c
new file mode 100755
index 0000000..e0af49b
--- /dev/null
+++ b/gribex/local2c.c
@@ -0,0 +1,131 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef CRAY
+#ifdef FORTRAN_NO_UNDERSCORE
+#define LOCAL2C local2c
+#define LOCAL2KC local2kc
+#define EMOSNUM emosnum
+#else
+#define LOCAL2C local2c_
+#define LOCAL2KC local2kc_
+#define EMOSNUM emosnum_
+#endif
+#endif
+
+#ifdef TABLE_PATH
+#define USER 1
+#else
+#define USER 0
+#define TABLE_PATH "/home/ma/emos/tables/gribex/nnnnnn/local_table_2_version_"
+#endif
+
+#define JPROUTINE 20000
+#define BUFFLEN 256
+
+int LOCAL2C(int , int , char * , char * , char * , char * );
+int LOCAL2KC(int * , char * , char * , char * , char * );
+int EMOSNUM(int *);
+
+int LOCAL2KC(int * ksec1,
+ char * hfirst, char * hsecond, char * hthird, char * hfourth)
+{
+ return ( LOCAL2C( ksec1[0], ksec1[5], hfirst, hsecond, hthird, hfourth) );
+}
+
+int LOCAL2C(int ktable, int kparam,
+ char * hfirst, char * hsecond, char * hthird, char * hfourth)
+{
+char yfile[256], * pyfile;
+FILE * in;
+char buffer[BUFFLEN];
+int iparam;
+int nnnnnn, noprint = 1;
+char NNNNNN[7];
+
+ strcpy( hfirst, "NONE");
+ strcpy( hsecond, "Undefined parameter");
+ strcpy( hthird , "Undefined parameter");
+ strcpy( hfourth, "Undefined parameter");
+
+/* Build filename */
+
+ pyfile = getenv("ECMWF_LOCAL_TABLE_PATH");
+
+ if( pyfile == NULL )
+ strcpy( yfile, TABLE_PATH);
+ if(USER)
+ strcat(yfile,"/gribtables");
+ else
+ strcpy( yfile, pyfile);
+
+ nnnnnn = EMOSNUM(&noprint);
+ sprintf(NNNNNN,"%6.6d",nnnnnn);
+ memcpy((yfile+28),NNNNNN,6);
+ sprintf((yfile+strlen(yfile)),"%3.3d",ktable);
+
+/* Open file */
+
+ in = fopen(yfile, "r");
+ if ( in == NULL ) return (JPROUTINE + 2);
+
+/* Loop through file */
+
+ while(1)
+ {
+ fgets(buffer, BUFFLEN-1, in);
+ if (feof(in) ) return (JPROUTINE + 1);
+
+ fgets(buffer, BUFFLEN-1, in);
+ if (feof(in) ) return (JPROUTINE + 1);
+ sscanf(buffer, "%3d", &iparam);
+
+/* Match found in table */
+
+ if( kparam == iparam )
+ {
+ fgets(buffer, BUFFLEN-1, in);
+ if (feof(in) ) return (JPROUTINE + 1);
+ buffer[strlen(buffer)-1] = '\0';
+ strcpy(hfirst,buffer);
+ fgets(buffer, BUFFLEN-1, in);
+ if (feof(in) ) return (JPROUTINE + 1);
+ buffer[strlen(buffer)-1] = '\0';
+ strcpy(hsecond,buffer);
+ fgets(buffer, BUFFLEN-1, in);
+ if (feof(in) ) return (JPROUTINE + 1);
+ buffer[strlen(buffer)-1] = '\0';
+ strcpy(hthird,buffer);
+ fgets(buffer, BUFFLEN-1, in);
+ if (feof(in) ) return (JPROUTINE + 1);
+ buffer[strlen(buffer)-1] = '\0';
+ strcpy(hfourth,buffer);
+ return 0;
+ }
+ else
+ {
+ fgets(buffer, BUFFLEN-1, in);
+ if (feof(in) ) return (JPROUTINE + 1);
+ fgets(buffer, BUFFLEN-1, in);
+ if (feof(in) ) return (JPROUTINE + 1);
+ fgets(buffer, BUFFLEN-1, in);
+ if (feof(in) ) return (JPROUTINE + 1);
+ fgets(buffer, BUFFLEN-1, in);
+ if (feof(in) ) return (JPROUTINE + 1);
+ }
+
+ }
+}
diff --git a/gribex/local2k.F b/gribex/local2k.F
new file mode 100755
index 0000000..3c148d0
--- /dev/null
+++ b/gribex/local2k.F
@@ -0,0 +1,105 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION LOCAL2K(KSEC1, HFIRST, HSECOND, HTHIRD, HFOURTH)
+C
+C---->
+C**** LOCAL2K
+C
+C Purpose
+C -------
+C
+C Looks up the description of a parameter in known table 2 versions
+C for WMO code FM 92-X Ext. GRIB.
+C
+C
+C Interface
+C ---------
+C
+C IRET = LOCAL2K(KSEC1, HFIRST, HSECOND, HTHIRD, HFOURTH)
+C
+C Input
+C -----
+C
+C KSEC1 - Section 1 values for a GRIB product.
+C
+C
+C Output
+C ------
+C
+C HFIRST - First line of descriptor: MARS mnemonic
+C HSECOND - Second line of descriptor: Parameter description
+C HTHIRD - Third line of descriptor: Units for the parameter
+C HFOURTH - Fourth line of descriptor: Description of units
+C
+C Function return value is
+C 0 if no error detected.
+C 20001 if no match found for the parameter number in
+C the given table.
+C 20002 if there is an error opening the file holding
+C the given table.
+C
+C
+C Method
+C ------
+C
+C Calls LOCAL2.
+C
+C
+C Externals
+C ---------
+C LOCAL2 - looks up information in standard tables.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Sept 1995
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C J. Clochard, Meteo France, for ECMWF - June 1999.
+C Argument KCENTR added to LOCAL2 call for code tables management.
+C
+C _______________________________________________________
+C----<
+C
+C
+ IMPLICIT NONE
+C
+C Function arguments
+ INTEGER KSEC1
+ DIMENSION KSEC1(*)
+ CHARACTER*(*) HFIRST, HSECOND, HTHIRD, HFOURTH
+C
+C Externals
+ INTEGER LOCAL2
+C
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ LOCAL2K = LOCAL2(KSEC1(1), KSEC1(6), KSEC1(2),
+ X HFIRST, HSECOND, HTHIRD, HFOURTH)
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+C Normal return.
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/make.dep b/gribex/make.dep
new file mode 100755
index 0000000..d91a74c
--- /dev/null
+++ b/gribex/make.dep
@@ -0,0 +1,36 @@
+#
+# Header file dependencies
+#
+c2ordr.o: grbcom.h
+codeps.o: grbcom.h
+confp3.o: grbcom.h
+csect4.o: grbcom.h
+docsec2.o: eocsec2.h
+ecdef1.o: ecdef1.h
+ecdef10.o: ecdef10.h
+ecdef11.o: ecdef11.h
+ecdef13.o: ecdef13.h
+ecdef2.o: ecdef2.h
+ecdef3.o: ecdef3.h
+ecdef4.o: ecdef4.h
+ecdef5.o: ecdef5.h
+ecdef6.o: ecdef6.h
+ecdef7.o: ecdef7.h
+ecdef8.o: ecdef8.h
+ecdef9.o: ecdef9.h
+eocsec2.o: eocsec2.h
+gribex.o: gribex.h grbcom.h
+grsdbg.o: grbcom.h
+grsdef.o: grbcom.h
+grsmkp.o: grbcom.h
+grsmok.o: grbcom.h
+grsn2o.o: grbcom.h
+grsref.o: grbcom.h
+grsrnd.o: grbcom.h
+grsubc.o: grbcom.h
+grsvck.o: grbcom.h
+grsx2o.o: grbcom.h
+bt_sun_c.o: /usr/include/stdio.h
+cgsloop.o: /usr/include/stdio.h
+jabort.o: /usr/include/stdlib.h
+local2c.o: /usr/include/stdio.h /usr/include/stdlib.h /usr/include/string.h
diff --git a/gribex/maxmin.F b/gribex/maxmin.F
new file mode 100755
index 0000000..6cede76
--- /dev/null
+++ b/gribex/maxmin.F
@@ -0,0 +1,139 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE MAXMIN(PARRAY,KLEN,PMAX,PMIN)
+C
+C---->
+C**** MAXMIN - Get maximum and minimum values.
+C
+C Purpose.
+C --------
+C
+C Get maximum and minimum values from an array of
+C floating point numbers..
+C
+C** Interface.
+C ----------
+C
+C CALL MAXMIN(PARRAY,KLEN,PMAX,PMIN)
+C
+C Input Parameters.
+C -----------------
+C
+C PARRAY - Array of numbers.
+C KLEN - Last word of this array.
+C
+C Output Parameters.
+C ------------------
+C
+C PMAX - Maximum value.
+C PMIN - Minimum value.
+C
+C Method.
+C -------
+C
+C Intrinsic functions MAX and MIN are used.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C None.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18:06:91
+C
+C Modifications.
+C --------------
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C Start loop from index 2.
+C Inhibits use of DMAX1/DMIN1 on CRAY (SMP) systems.
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ INTEGER KLEN
+ REAL PARRAY, PMAX, PMIN, VSMALL
+ DIMENSION PARRAY(KLEN)
+#ifndef __uxp__
+C
+C Parameters
+C
+ REAL JPSMALL
+#ifdef __alpha
+#ifdef REAL_8
+ PARAMETER (JPSMALL = 1E-307)
+#else
+ PARAMETER (JPSMALL = 1E-37)
+#endif
+#else
+ PARAMETER (JPSMALL = 1E-38)
+#endif
+#endif
+C
+C Local variables
+C
+ INTEGER JLOOP
+C
+C ----------------------------------------------------------------
+C* Section 1 . Get maximum and minimum values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Set initial values.
+C
+ PMAX = PARRAY(1)
+ PMIN = PARRAY(1)
+C
+C Extract maximum and minimum values.
+C
+ DO 110 JLOOP = 2 , KLEN
+ PMAX = MAX(PMAX,PARRAY(JLOOP))
+ PMIN = MIN(PMIN,PARRAY(JLOOP))
+ 110 CONTINUE
+C
+C Adjust to an acceptable 'tiny' minimum
+C
+#ifdef __uxp__
+ VSMALL = TINY(PMIN)
+#else
+ VSMALL = JPSMALL
+#endif
+ IF( (PMIN.NE.0.0).AND.(ABS(PMIN).LT.VSMALL) )
+ X PMIN = SIGN(VSMALL,PMIN)
+C
+C ----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/gribex/maxmn2.F b/gribex/maxmn2.F
new file mode 100755
index 0000000..e30b59c
--- /dev/null
+++ b/gribex/maxmn2.F
@@ -0,0 +1,156 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE MAXMN2(PARRAY,KLEN,PMISS,PMAX,PMIN)
+C
+C---->
+C**** MAXMN2 - Get max/minimum values, ignoring missing data value.
+C
+C Purpose.
+C --------
+C
+C Get maximum and minimum values from an array of
+C floating point numbers, ignoring missing data value.
+C
+C** Interface.
+C ----------
+C
+C CALL MAXMN2(PARRAY,KLEN,PMISS,PMAX,PMIN)
+C
+C Input Parameters.
+C -----------------
+C
+C PARRAY - Array of numbers.
+C
+C KLEN - Last word of this array.
+C
+C PMISS - Value indicating missing data in array element.
+C
+C Output Parameters.
+C ------------------
+C
+C PMAX - Maximum value.
+C PMIN - Minimum value.
+C
+C Method.
+C -------
+C
+C Intrinsic functions MAX and MIN are used.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C None.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18:06:91
+C
+C Modifications.
+C --------------
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C Exclude values from first loop in second search loop.
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ INTEGER KLEN
+ REAL PARRAY, PMAX, PMIN, PMISS, VSMALL
+ DIMENSION PARRAY(*)
+#ifndef __uxp__
+C
+C Parameters
+C
+ REAL JPSMALL
+#ifdef __alpha
+#ifdef REAL_8
+ PARAMETER (JPSMALL = 1E-307)
+#else
+ PARAMETER (JPSMALL = 1E-37)
+#endif
+#else
+#ifdef REAL_8
+ PARAMETER (JPSMALL = 1E-308)
+#else
+ PARAMETER (JPSMALL = 1E-38)
+#endif
+#endif
+#endif
+C
+C Local variables
+C
+ INTEGER JLOOP, IOFF
+C
+C ----------------------------------------------------------------
+C* Section 1 . Get maximum and minimum values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Set initial values to first data value which is not
+C a missing data indicator.
+C
+ DO 110 JLOOP = 1 , KLEN
+ IF (PARRAY(JLOOP).NE.PMISS) THEN
+ PMAX = PARRAY(JLOOP)
+ PMIN = PARRAY(JLOOP)
+ IOFF = JLOOP
+ GO TO 120
+ ENDIF
+ 110 CONTINUE
+C
+ 120 CONTINUE
+C
+C Extract maximum and minimum values.
+C
+ DO 130 JLOOP = IOFF+1 , KLEN
+ IF (PARRAY(JLOOP).NE.PMISS) THEN
+ PMAX = MAX(PMAX,PARRAY(JLOOP))
+ PMIN = MIN(PMIN,PARRAY(JLOOP))
+ ENDIF
+ 130 CONTINUE
+C
+C Adjust to an acceptable 'tiny' minimum
+C
+#ifdef __uxp__
+ VSMALL = TINY(PMIN)
+#else
+ VSMALL = JPSMALL
+#endif
+ IF( (PMIN.NE.0.0).AND.(ABS(PMIN).LT.VSMALL) )
+ X PMIN = SIGN(VSMALL,PMIN)
+C
+C ----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/gribex/maxmni.F b/gribex/maxmni.F
new file mode 100755
index 0000000..e9be939
--- /dev/null
+++ b/gribex/maxmni.F
@@ -0,0 +1,110 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE MAXMNI(KARRAY,KLEN,KMAX,KMIN)
+C
+C---->
+C**** MAXMNI - Get maximum and minimum values.
+C
+C Purpose.
+C --------
+C
+C Get maximum and minimum values from an array of integer numbers.
+C
+C** Interface.
+C ----------
+C
+C CALL MAXMNI (KARRAY,KLEN,KMAX,KMIN)
+C
+C Input Parameters.
+C -----------------
+C
+C KARRAY - Array of numbers.
+C KLEN - Last word of this array.
+C
+C Output Parameters.
+C ------------------
+C
+C KMAX - Maximum value.
+C KMIN - Minimum value.
+C
+C Method.
+C -------
+C
+C Intrinsic functions MAX and MIN are used.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ INTEGER KARRAY, KLEN, KMAX, KMIN
+ DIMENSION KARRAY(*)
+C
+C Local variables
+C
+ INTEGER JLOOP
+C
+C ----------------------------------------------------------------
+C* Section 1 . Get maximum and minimum values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Set initial values.
+C
+ KMAX = KARRAY(1)
+ KMIN = KARRAY(1)
+C
+C Extract maximum and minimum values.
+C
+ DO 110 JLOOP = 2 , KLEN
+ KMAX = MAX(KMAX,KARRAY(JLOOP))
+ KMIN = MIN(KMIN,KARRAY(JLOOP))
+ 110 CONTINUE
+C
+C ----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/gribex/modval.F b/gribex/modval.F
new file mode 100755
index 0000000..789378d
--- /dev/null
+++ b/gribex/modval.F
@@ -0,0 +1,54 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE MODVAL (LENIN,LENOUT,MULT)
+C
+C---->
+C* *
+C* NAME : MODVAL *
+C* *
+C* FUNCTION : MAKES ONE VALUE A MULTIPLE OF ANOTHER. *
+C* *
+C* INPUT : LENIN = INPUT VALUE *
+C* MULT = MODULO VALUE *
+C* *
+C* OUTPUT : LENOUT= OUTPUT VALUE *
+C* *
+C* GENERAL : MODVAL CALLS MOD *
+C* ABS *
+C* *
+C* AUTHOR : B.V. GURETZKY V.E. DAY *
+C* *
+C* MODIFIED : J. HENNESSY 25.11.85 *
+C* *
+C* *
+C ---------------------------------------------------------------
+C----<
+C
+ LENG = ABS (MULT)
+ INTER = MOD (ABS(LENIN),LENG)
+C
+ IF (INTER.NE.0)
+ C THEN
+ LENG = LENG - INTER
+ IF (LENIN.LT.0)
+ C THEN
+ LENOUT = LENIN - LENG
+ ELSE
+ LENOUT = LENIN + LENG
+ ENDIF
+ ELSE
+ LENOUT = LENIN
+ ENDIF
+C
+C
+ RETURN
+ END
diff --git a/gribex/mxmncr.F b/gribex/mxmncr.F
new file mode 100755
index 0000000..86640c7
--- /dev/null
+++ b/gribex/mxmncr.F
@@ -0,0 +1,91 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE MXMN(PARR,KLEN,PMAX,PMIN)
+C
+C---->
+C** *SUBROUTINE* *MXMN* - *FIND THE MAXIMUM AND MINIMUM ELEMENTS OF
+C AN ARRAY
+C
+C *JAN *HASELER *ECMWF* 6/10/82
+C
+C PURPOSE
+C -------
+C
+C *FIND THE MAXIMUM AND MINIMUM ELEMENTS OF THE ARRAY *PARR*
+C
+C INTERFACE
+C ---------
+C
+C *CALL* *MXMN(PARR,KLEN,PMAX,PMIN)*
+C
+C WHERE *PARR(KLEN)* = INPUT ARRAY
+C *PMAX* = OUTPUT MAXIMUM ELEMENT OF *PARR*
+C *PMIN* = OUTPUT MINIMUM ELEMENT OF *PARR*
+C
+C *MXMN* IS CALLED FROM SUBROUTINES *OUTSHC,* *OUTSHG,* *OUT2D* AND
+C *OUTDIA*
+C
+C RESULTS
+C -------
+C
+C *THE VALUES *PMAX* AND *PMIN* ARE RETURNED
+C
+C EXTERNALS
+C ---------
+C
+C *ISMAX* - *CAL* FUNCTION TO FIND MAX ARRAY ELEMENT
+C *ISMIN* - *CAL* FUNCTION TO FIND MIN ARRAY ELEMENT
+C
+C ------------------------------------------------------------------
+C----<
+C
+ DIMENSION PARR(KLEN)
+C
+C-----------------------------------------------------------------------
+C*
+C 1. FIND MAX AND MIN
+C ----------------
+C
+ 100 CONTINUE
+C
+C* 1.1 SEARCH THROUGH 4096 ELEMENTS AT A TIME
+ 110 CONTINUE
+ ZMIN=PARR(1)
+ ZMAX=PARR(1)
+ ID=1
+ I1=KLEN/4096
+ I2=KLEN-I1*4096
+C
+ DO 115 J=1,I1
+ IX=ISMAX(4096,PARR(ID),1)+ID-1
+ IN=ISMIN(4096,PARR(ID),1)+ID-1
+ ZMAX=AMAX1(ZMAX,PARR(IX))
+ ZMIN=AMIN1(ZMIN,PARR(IN))
+ ID=ID+4096
+ 115 CONTINUE
+C
+C
+C* 1.2 REMAINING ELEMENTS
+ 120 CONTINUE
+ IF (I2.GT.0) THEN
+ IX=ISMAX(I2,PARR(ID),1)+ID-1
+ IN=ISMIN(I2,PARR(ID),1)+ID-1
+ ZMAX=AMAX1(ZMAX,PARR(IX))
+ ZMIN=AMIN1(ZMIN,PARR(IN))
+ ENDIF
+C
+ PMIN=ZMIN
+ PMAX=ZMAX
+C
+ RETURN
+ END
+
diff --git a/gribex/offset.F b/gribex/offset.F
new file mode 100755
index 0000000..9c4fc36
--- /dev/null
+++ b/gribex/offset.F
@@ -0,0 +1,109 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILEN,IERR)
+C
+C
+C
+C
+C
+C---->
+C*
+C* NAME : OFFSET
+C:
+C* FUNCTION : CALCULATES THE WORD AND BIT OFFSET OF THE START
+C* OF THE NEXT BIT-FIELD IN AN ARRAY OF BINARY
+C* DATA, FOLLOWING THE INSERTION/EXTRACTION OF ONE
+C* OR MORE CONSECUTIVE BIT-FIELDS.
+C*
+C* INPUT : IOFF - BIT OFFSET AT WHICH LAST INSERTION OR
+C* EXTRACTION STARTED.
+C* NVAL - NUMBER OF FIELDS INSERTED OR EXTRACTED IN
+C* LAST OPERATION.
+C* IWORD - WORD NUMBER OF ARRAY AT WHICH LAST OPERATION
+C* STARTED.
+C* IBYTE - LENGTH, IN BITS, OF LAST FIELD(S) INSERTED
+C* OR EXTRACTED.
+C* NBIT - NUMBER OF BITS IN COMPUTER WORD.
+C* ILEN - NUMBER OF WORDS IN ARRAY.
+C*
+C* OUTPUT : IOFF - BIT OFFSET AT WHICH NEXT INSERTION OR
+C* EXTRACTION STARTS.
+C* NVAL - UNCHANGED.
+C* IWORD - WORD NUMBER OF ARRAY AT WHICH NEXT OPERATION
+C* STARTS.
+C* IBYTE - UNCHANGED.
+C* NBIT - UNCHANGED.
+C* ILEN - UNCHANGED.
+C*
+C* IERR - EQUAL 0 IF NO ERROR.
+C* EQUAL -2 IF NEXT OPERATION IS OUTSIDE ARRAY
+C* BOUNDS.
+C*
+C* GENERAL : OFFSET CALLS -----
+C*
+C* AUTHOR : J.HENNESSY 15.4.85
+C*
+C* MODIFIED : J.HENNESSY 28.11.85
+C*
+C
+C ---------------------------------------------------------------
+C----<
+C
+C
+C
+C CLEAR ERROR INDICATOR
+C
+ IERR = 0
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C CALCULATE NEXT WORD AND BIT POSITIONS.
+C
+ IBITL = NVAL * IBYTE
+ INTER = IBITL / NBIT
+ IOFFS = IBITL - INTER * NBIT
+ IWORD = IWORD + INTER
+ IOFF = IOFF + IOFFS
+C
+ IF (IOFF.GE.NBIT)
+ C THEN
+ IWORD = IWORD + 1
+ IOFF = IOFF - NBIT
+ END IF
+C
+C
+C
+C
+C
+C
+C
+C
+C CHECK THAT NEXT WORD TO BE ACCESSED LIES WITHIN THE ARRAY BOUNDS.
+C
+ IF (IWORD.GT.ILEN)
+ C THEN
+ IERR = -2
+ WRITE (*,9001) IWORD,ILEN
+ 9001 FORMAT (1H ,'WORD ',I8,' IS OUTSIDE ARRAY BOUNDS ',I8)
+ ENDIF
+C
+C
+ RETURN
+C
+ END
diff --git a/gribex/offset2.F b/gribex/offset2.F
new file mode 100755
index 0000000..4d8c94c
--- /dev/null
+++ b/gribex/offset2.F
@@ -0,0 +1,119 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE OFFSET2(IOFF,NLAST,IWORD,NBIT,ILEN,IERR)
+C
+C----> OFFSET2
+C
+C Purpose.
+C --------
+C
+C Calculates the word and bit offset of the start of the next
+C bit-field in an array of binary data, following the
+C insertion/extraction of one or more consecutive bit-fields.
+C
+C Interface.
+C ----------
+C
+C CALL OFFSET2(IOFF,NLAST,IWORD,NBIT,ILEN,IERR)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C IOFF - Bit offset at which last insertion or extraction started.
+C NLAST - Number of bits in fields inserted or extracted in
+C previous operation.
+C IWORD - Word number of array at which previous operation started.
+C NBIT - Number of bits in computer word.
+C ILEN - Number of words in array.
+C
+C Output Parameters.
+C -----------------
+C
+C IOFF - Bit offset at which next insertion or extraction starts.
+C IWORD - Word number of array at which next operation starts.
+C
+C IERR - = 0 if no error.
+C = -2 if next operation is outside array bounds.
+
+C
+C
+C Method.
+C -------
+C
+C See below.
+C
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C ---------
+C
+C Rewrite of offset.F to speed processing.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF September 2001
+C
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C
+C ---------------------------------------------------------------
+C----<
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Subroutine arguments
+C
+ INTEGER IOFF,NLAST,IWORD,NBIT,ILEN,IERR
+C
+C Clear error indicator
+C
+ IERR = 0
+C
+C Calculate next word and bit positions.
+C
+ IOFF = IOFF + (NLAST-(NLAST/NBIT)*NBIT)
+C
+ IF( IOFF.GE.NBIT ) THEN
+ IWORD = IWORD + (NLAST/NBIT) + 1
+ IOFF = IOFF - NBIT
+ ELSE
+ IWORD = IWORD + (NLAST/NBIT)
+ ENDIF
+C
+C Check that next word to be accessed lies within the array bounds.
+C
+ IF( IWORD.GT.ILEN ) THEN
+ IERR = -2
+ WRITE(GRPRSM,*) 'Word ',IWORD,' is outside array bounds ',ILEN
+ ENDIF
+C
+ RETURN
+ END
diff --git a/gribex/orefdat.c b/gribex/orefdat.c
new file mode 100755
index 0000000..8543970
--- /dev/null
+++ b/gribex/orefdat.c
@@ -0,0 +1,74 @@
+/**
+* Copyright 1981-2012 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 "fortint.h"
+
+fortint orefdat_(fortint* ksec1) {
+/*
+// Fortran-callable:
+//
+// INTEGER OREFDAT
+// EXTERNAL OREFDAT
+//
+// INDEX = OREFDAT(KSEC1)
+//
+// where KSEC1 contains GRIB section 1 after unpacking by GRIBEX.
+//
+// Returns the index of the reference date in the post-auxiliary array in
+// ECMWF local definition 4 (ocean data).
+//
+// Returns -1 if
+// - local definition 4 is not in use, or
+// - the post-auxiliary array is empty, or
+// - the post-auxiliary array does not contain a reference date.
+*/
+fortint offset;
+
+ if( ksec1[36] != 4 ) return -1;
+
+ offset = 74 + ksec1[70] + ksec1[71] + ksec1[72] + ksec1[73];
+ if( offset == 0 ) return -1;
+
+ if( ksec1[offset] < 5 )
+ return -1;
+ else
+ return (offset+5);
+}
+
+fortint orefdat(fortint* ksec1) {
+ return orefdat_(ksec1);
+}
+
+fortint d13flag(fortint* kgrib) {
+/*
+// Fortran-callable:
+//
+// INTEGER D13FLAG
+// EXTERNAL D13FLAG
+//
+// FLAG = D13FLAG(KGRIB)
+//
+// where KGRIB contains GRIB 1 before unpacking by GRIBEX.
+//
+// Returns the Flag to show inclusions in the header in ECMWF GRIB section
+// 1 local extension 13, or -1 if definition 13 is not present.
+*/
+unsigned char* p = ((unsigned char*) kgrib) + 7;
+
+ if( *(p + 41) == 13 )
+ return (fortint) *(p + 64);
+ else
+ return -1;
+}
+
+fortint d13flag_(fortint* kgrib) {
+ return d13flag(kgrib);
+}
diff --git a/gribex/packcf.F b/gribex/packcf.F
new file mode 100755
index 0000000..7bead8b
--- /dev/null
+++ b/gribex/packcf.F
@@ -0,0 +1,276 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION PACKCF( PARRAY, KTRUNC, KSUBSET, KGRIB, KLENG,
+ X KNSPT, KBITS)
+C
+C---->
+C**** PACKCF
+C
+C Purpose.
+C --------
+C
+C Moves the unscaled values from an array of spherical harmonic
+C coefficients, just the first "KSUBSET" triangle of coefficients.
+C
+C** Interface.
+C ----------
+C
+C IRET = PACKCF(PARRAY,KTRUNC,KSUBSET,KGRIB,KLENG,KNSPT,KBITS)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C PARRAY - Array of spherical harmonic coefficients.
+C KTRUNC - Truncation of the spherical harmonic coefficients.
+C KSUBSET - Number indicating truncation of subset to move.
+C KNSPT - Bit pointer for next free position in KGRIB.
+C
+C
+C Output Parameters.
+C ------------------
+C
+C KGRIB - Array containing generated GRIB product.
+C KLENG - Length of KGRIB
+C KNSPT - Bit pointer for next free position in KGRIB(updated).
+C KBITS - Number of bits per computer word.
+C
+C Returns 0 if OK, otherwise prints an error message and returns
+C an error code.
+C
+C
+C Method.
+C -------
+C <KSUBSET>|
+C
+C Given numbers: cccccccc|cccccc
+C cccccc|cccccc
+C cccc|cccccc
+C cc|cccccc
+C |cccccc
+C cccc
+C cc
+C
+C Converts and moves : cccccccc
+C cccccc
+C cccc
+C cc
+C
+C Externals.
+C ----------
+C
+C CONFP3 - Convert floating point value to storage format
+#if (defined CRAY) || (defined __uxp__ ) || (defined IBM_POWER4)
+C GSBITE - Store bit pattern (Vectorized Fortran).
+#endif
+C SBYTES - Store bit pattern
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C ---------
+C
+C KSUBSET must be less than or equal to KTRUNC.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 13:04:94
+C
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+ INTEGER JPMAXT
+ PARAMETER ( JPMAXT = 2047 + 1 )
+C
+C Subroutine arguments
+C
+ INTEGER KTRUNC, KSUBSET, KNSPT, KGRIB, KLENG, KBITS
+C
+ REAL PARRAY
+ DIMENSION PARRAY(*), KGRIB(KLENG)
+C
+C Local variables.
+ INTEGER JCOL, JROW, INDEX, ILAST, ITRND, IEXP, IMANT, INEXT
+ INTEGER INSPT, INEED, IWORD, IOFF
+ DIMENSION IEXP(JPMAXT*2), IMANT(JPMAXT*2)
+C
+#if (defined CRAY) || (defined __uxp__ ) || (defined IBM_POWER4)
+C
+C Values in IMASK are set in the first call to routine GSBITE, and
+C are used in subsequent calls.
+C
+ INTEGER IMASK
+ DIMENSION IMASK(65)
+ SAVE IMASK
+C
+C Force routine GSBITE to calculate bit-masks first time through.
+ DATA IMASK(2) /0/
+#endif
+C
+C ----------------------------------------------------------------
+C* Section 1 . Check for valid truncation and start values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Check for valid truncation and subset values
+C
+ PACKCF = 0
+ IF ( KSUBSET .GT. KTRUNC ) THEN
+ WRITE(GRPRSM,*) 'PACKCF: Invalid subset/truncation given'
+ WRITE(GRPRSM,*) 'PACKCF: KSUBSET, KTRUNC =', KSUBSET, KTRUNC
+ PACKCF = 16400
+ GOTO 900
+ ENDIF
+C
+C Check that the GRIB area is big enough.
+ INEED = ( KNSPT + (KSUBSET+1)*(KSUBSET+2)*32 ) / KBITS
+ IF (INEED.GT.KLENG) THEN
+ PACKCF = 16401
+ WRITE(GRPRSM,*) 'PACKCF: GRIB area is not big enough.'
+ GOTO 900
+ ENDIF
+C
+C ----------------------------------------------------------------
+C* Section 2. Convert values to IBM format exponent and mantissa.
+C Handle values 2 at a time (real and imaginary parts)
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ ITRND = 1
+ ILAST = KSUBSET+1
+ INDEX = -1
+C
+C Loop through rows in the subset
+ DO 490 JROW = 1 , ILAST
+C
+C Pick up columns in subset
+ INEXT = 0
+ DO 210 JCOL = JROW , KTRUNC+1
+ INDEX = INDEX + 2
+ IF ( ILAST .GE. JCOL ) THEN
+C
+C Convert floating point nos. to GRIB and insert fields.
+C Real part ..
+ INEXT = INEXT + 1
+ CALL CONFP3( PARRAY(INDEX), IEXP(INEXT), IMANT(INEXT),
+ X KBITS, ITRND)
+C
+C Imaginary part ..
+ INEXT = INEXT + 1
+ CALL CONFP3( PARRAY(INDEX+1), IEXP(INEXT), IMANT(INEXT),
+ X KBITS, ITRND)
+ ENDIF
+ 210 CONTINUE
+C
+C ----------------------------------------------------------------
+C* Section 3. Move exponents into bit array.
+C ----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C* Calculate word pointer and offset.
+ INSPT = KNSPT
+ IWORD = INSPT / KBITS
+ IOFF = INSPT - IWORD * KBITS
+ IWORD = IWORD + 1
+C
+#if (defined CRAY) || (defined __uxp__ ) || (defined IBM_POWER4)
+ IF (INEXT.GE.8) THEN
+C
+C Vectorising routine GSBITE.
+ CALL GSBITE( KGRIB(IWORD), IEXP, IOFF, 8, 24, INEXT, KBITS,
+ X IMASK, 'C')
+ ELSE
+C
+C Scalar faster.
+ CALL SBYTES( KGRIB(IWORD), IEXP, IOFF, 8, 24, INEXT)
+ ENDIF
+#elif (defined CYBER)
+ CALL SBYTES6( KGRIB(IWORD), IEXP, IOFF, 8, 24, INEXT)
+#else
+ CALL SBYTES( KGRIB(IWORD), IEXP, IOFF, 8, 24, INEXT)
+#endif
+C
+C ----------------------------------------------------------------
+C* Section 4. Move mantissae into bit array.
+C ----------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+C* Calculate word pointer and offset.
+ INSPT = KNSPT + 8
+ IWORD = INSPT / KBITS
+ IOFF = INSPT - IWORD * KBITS
+ IWORD = IWORD + 1
+C
+#if (defined CRAY) || (defined __uxp__ ) || (defined IBM_POWER4)
+ IF (INEXT.GE.8) THEN
+C
+C Vectorising routine GSBITE.
+ CALL GSBITE( KGRIB(IWORD), IMANT, IOFF, 24, 8, INEXT, KBITS,
+ X IMASK, 'C')
+ ELSE
+C
+C Scalar faster.
+ CALL SBYTES( KGRIB(IWORD), IMANT, IOFF, 24, 8, INEXT)
+ ENDIF
+#elif (defined CYBER)
+ CALL SBYTES6( KGRIB(IWORD), IMANT, IOFF, 24, 8, INEXT)
+#else
+ CALL SBYTES( KGRIB(IWORD), IMANT, IOFF, 24, 8, INEXT)
+#endif
+C
+C Update the bit pointer
+ KNSPT = KNSPT + 32 * INEXT
+C
+ 490 Continue
+C End of loop through rows of the subset
+C
+C
+C ----------------------------------------------------------------
+C* Section 5. Update pointer.
+C ----------------------------------------------------------------
+C
+ 500 CONTINUE
+C
+C ----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/gribex/parval.F b/gribex/parval.F
new file mode 100755
index 0000000..cdd4927
--- /dev/null
+++ b/gribex/parval.F
@@ -0,0 +1,331 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE PARVAL (KCSP,KNSP,HLINE,HPAR,KLPAR,HVAL,KLVAL)
+C
+C---->
+C**** PARVAL - Extract next parameter and value pair.
+C
+C Purpose.
+C --------
+C
+C Get next parameter and value from line.
+C
+C** Interface.
+C ----------
+C
+C CALL PARVAL (KCSP,KNSP,HLINE,HPAR,KLPAR,HVAL,KLVAL)
+C
+C INTEGER K.
+C REAL P.
+C LOGICAL O.
+C CHARACTER H.
+C
+C Input Parameters.
+C -----------------
+C
+C KCSP = Current search start position
+C HLINE = Line being examined
+C
+C Output Parameters.
+C -----------------
+C
+C KNSP = Next search position (for next call)
+C It is set to zero if the last set of
+C PARAMETER=VALUE pairs is found, and
+C to -1 if further parameters and values
+C are to be read from a continuation line.
+C
+C KLPAR = Length of parameter string
+C
+C HPAR = Parameter
+C
+C KLVAL = Length of value string
+C
+C HVAL = Value
+C
+C Method.
+C -------
+C
+C The separators / , = and " are found to identify
+C the parameters and values.
+C
+C Externals.
+C ----------
+C
+C RTB
+C REMSP
+C DELSP
+C REPCHR
+C
+C Reference.
+C ----------
+C
+C MARS User Guide for information on parameters and
+C value pairs.
+C
+C Comments.
+C ---------
+C
+C Routine contains sections 0-4 and section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy 16.04.85
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy 08.04.86
+C
+C " 15.09.86
+C
+C J. Hennessy 03.07.90
+C Character variable HVAL made to agree in length with
+C that in calling routine.
+C
+C J. Hennessy 23.11.90
+C Allow COMMENT values to include commas.
+C
+C J. Hennessy 18.02.91
+C Adjust YLINE length to match HLINE. Allow for / in error
+C at start of list of parameters.
+C
+C J. Hennessy 15.10.92
+C Check on input string length added.
+C
+C----<
+C ---------------------------------------------------------------
+C
+C
+C* Section 0 . Definition of variables.
+C ---------------------------------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+ PARAMETER (JPMAX=960)
+C
+ INTEGER RTB
+C
+ CHARACTER*(*) HLINE
+ CHARACTER*8 HPAR
+ CHARACTER*(*) HVAL
+ CHARACTER*(JPMAX) YLINE
+C
+C ---------------------------------------------------------------
+C
+C
+C* Section 1 . Set initial values.
+C ---------------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+C Check length of input string.
+C
+ ILEN = LEN (HLINE)
+ IF (ILEN.GT.JPMAX)
+ C THEN
+ WRITE (*,9001) ILEN , JPMAX
+ CALL ABORTX ('PARVAL')
+ ENDIF
+C
+C Set parameter and value to 'space' and their lengths to 0.
+C
+ HPAR = ' '
+ HVAL = ' '
+ KLPAR = 0
+ KLVAL = 0
+C
+C
+C
+C* Section 2 . Handle request from HELP facility.
+C ---------------------------------------------------------------
+C
+ 2000 CONTINUE
+C
+C First check if help is being requested by use of ?.
+C
+ IF (HLINE(KCSP:KCSP).EQ.'?')
+ C THEN
+ HPAR = '?'
+ KLPAR = 1
+ KNSP = KCSP + 1
+ GO TO 9000
+ ENDIF
+C
+C* Go to section 9.
+C
+C ---------------------------------------------------------------
+C
+C
+C
+C* Section 3 . Tidy up input format a little.
+C ---------------------------------------------------------------
+C
+ 3000 CONTINUE
+C
+C Change any ' characters to " characters.
+C
+c-- CALL REPCHR (HLINE,'''','"')
+C
+C Remove any spaces before or after / separators.
+C
+c-- CALL DELSP (HLINE)
+C
+C ---------------------------------------------------------------
+C
+C
+C
+C* Section 4 . Extract next parameter and its value.
+C ---------------------------------------------------------------
+C
+ 4000 CONTINUE
+C
+C Look for next '=' and ',' in line. Examine
+C the last character in the line. If this is a ',' a
+C continuation line will follow. Otherwise the last
+C PARAMETER=VALUE pair for the current command has been
+C read.
+C
+ II = INDEX (HLINE(KCSP:),'=')
+ IJ = INDEX (HLINE(KCSP:),',')
+ IK = RTB(HLINE)
+ KNSP = 0
+ IF (HLINE(IK:IK).EQ.',') KNSP = -1
+C
+ IF (II.EQ.0.AND.IJ.EQ.0)
+C
+C* No = or , found. Go to section 9.
+C
+ C THEN
+C
+C Check that no entry with missing = has been made.
+C Set parameter and value to unrecognised string,
+C
+ IF (IK.GT.KCSP)
+ C THEN
+ HPAR = HLINE(KCSP:IK)
+ CALL REMSP (HPAR)
+ IF (HPAR(1:1).NE.' ')
+ C THEN
+ HPAR = HLINE(KCSP:IK)
+ KLPAR = IK - KCSP + 1
+ HVAL = HLINE(KCSP:IK)
+ KLVAL = IK - KCSP + 1
+ KNSP = IK + 1
+ ENDIF
+ ENDIF
+C
+ GO TO 9000
+ ENDIF
+C
+ IF (II.EQ.0.AND.IJ.NE.0)
+C
+C* , found but no = found. Check that no erroneous entry
+C has been made. Go to section 9.
+C
+ C THEN
+C
+C Check that no erroneous entry with missing =
+C exists.
+C
+ HPAR = HLINE(KCSP:KCSP+IJ-2)
+ CALL REMSP (HPAR)
+ IF (HPAR(1:1).NE.' ')
+ C THEN
+ KLPAR = RTB(HPAR)
+ HVAL = HPAR
+ KLVAL = KLPAR
+ KNSP = KCSP + IJ- 1
+ ENDIF
+ GO TO 9000
+ ENDIF
+C
+C Extract parameter entry and its length.
+C
+ KLPAR = II - 1
+ HPAR = HLINE(KCSP:KCSP+KLPAR-1)
+C
+C Remove any leading/trailing spaces.
+C
+ IF (HPAR(1:1).EQ.' ') THEN
+ CALL REMSP(HPAR)
+ KLPAR = RTB (HPAR)
+ ENDIF
+C
+C Find end of value entry. This can be a comma, space or
+C a full stop.
+C If none is found the remaining characters are taken as
+C the value, and treated as the last entry for this command.
+C
+ KCSP = KCSP + II
+C
+C Remove any spaces between = and value.
+C Remove any / put at the start of a list of values.
+C
+ YLINE(1:) = HLINE(KCSP:)
+ IF (YLINE(1:1).EQ.'/') YLINE(1:1) = ' '
+ CALL REMSP (YLINE)
+ HLINE (KCSP:) = YLINE
+C
+ II = INDEX(HLINE(KCSP:),',')
+C
+C If the value is a character string it may contain a ",".
+C Currently only the COMMENT parameter in a CREATE command
+C can validly have an embedded , .
+C
+ CALL L2U1CR (HPAR)
+ IF (HLINE(KCSP:KCSP).EQ.'"'.AND.HPAR(1:7).EQ.'COMMENT')
+ C THEN
+ ISTR = INDEX(HLINE(KCSP+1:),'"')
+ IF (ISTR.GE.II) II = ISTR + 2
+ ENDIF
+C
+C Extract value entry and length
+C
+ IF (II.EQ.0)
+ C THEN
+ II = RTB (HLINE)
+ IF (HLINE(II:II).EQ.'.') II = II - 1
+ KLVAL = II - KCSP + 1
+ ELSE
+ KLVAL = II - 1
+ ENDIF
+C
+C Handle missing value (eg date=, entered) where length is 0.
+C
+ KNSP = KCSP + KLVAL + 1
+C
+ IF (KLVAL.GT.0)
+ C THEN
+ HVAL = HLINE(KCSP:KCSP+KLVAL-1)
+ ELSE
+ HVAL = ' '
+ KLVAL = 1
+ ENDIF
+C
+C ---------------------------------------------------------------
+C
+C
+C
+C* Section 9. Return to calling routine.
+C ---------------------------------------------------------------
+C
+ 9000 CONTINUE
+C
+ 9001 FORMAT (1H ,'PARVAL : String length is ',I3,'. Maximum',
+ C ' allowed is ',I3,'.')
+ RETURN
+C
+ END
diff --git a/gribex/prtbin.F b/gribex/prtbin.F
new file mode 100755
index 0000000..8d98b14
--- /dev/null
+++ b/gribex/prtbin.F
@@ -0,0 +1,196 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE PRTBIN (KIN,KNBIT,KOUT,KERR)
+C
+C---->
+C**** PRTBIN - Binary to decimal conversion.
+C
+C Purpose.
+C --------
+C
+C Produces a decimal number with ones and zeroes
+C corresponding to the ones and zeroes of the input
+C binary number.
+C eg input number 1011 binary, output number 1011 decimal.
+C
+C** Interface.
+C ----------
+C
+C CALL PRTBIN (KIN,KNBIT,KOUT,KERR)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KIN - Integer variable containing binary number.
+C
+C KNBIT - Number of bits in binary number.
+C
+C Output Parameters.
+C -----------------
+C
+C KOUT - Integer variable containing decimal value
+C with ones and zeroes corresponding to those of
+C the input binary number.
+C
+C KERR - 0, If no error.
+C 1, Number of bits in binary number exceeds
+C maximum allowed or is less than 1.
+C
+C Method.
+C -------
+C
+C Odd numbers have a binary representation ending in 1, even
+C numbers end in 0.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C Replaces earlier routine of the same name, which
+C contained non-ANSI code.
+C Routine contains sections 0, 1 and section 9.
+C
+C Author.
+C -------
+C
+C John Hennessy ECMWF 01.10.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ---------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0. Definition of variables. Check on parameters.
+C -----------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+ INTEGER IDEC
+ INTEGER IK
+ INTEGER ITEMP
+C
+ INTEGER J102
+C
+ INTEGER KERR
+ INTEGER KIN
+ INTEGER KNBIT
+ INTEGER KOUT
+C
+C Check length of binary number to ensure decimal number
+C generated will fit in the computer word - in this case will
+C it fit in a Cray 48 bit integer?
+C
+ IF (KNBIT.LT.1.OR.KNBIT.GT.14)
+ C THEN
+ KERR = 1
+ WRITE(GRPRSM,9000) KNBIT
+ GO TO 900
+ ELSE
+ KERR = 0
+ ENDIF
+C
+C -----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1. Generate required number.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ KOUT = 0
+ IK = KIN
+ IDEC = 1
+C
+ DO 102 J102=1,KNBIT
+ ITEMP = IK - ( (IK/2)*2 )
+ KOUT = KOUT + ITEMP * IDEC
+ IK = IK / 2
+ IDEC = IDEC * 10
+ 102 CONTINUE
+C
+C -----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9. Format statements. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ 9000 FORMAT (1H ,'PRTBIN : Error in binary number length - ',I3,
+ C ' bits.')
+C
+ RETURN
+ END
diff --git a/gribex/prtbk1.F b/gribex/prtbk1.F
new file mode 100755
index 0000000..3780f97
--- /dev/null
+++ b/gribex/prtbk1.F
@@ -0,0 +1,86 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE PRTBK1 (IB1PAR)
+C
+C---->
+C
+C NAME : PRTBK1
+C
+C FUNCTION : PRINT THE INFORMATION IN THE PRODUCT DEFINITION
+C BLOCK (BLOCK 1) OF DECODED GRIB DATA.
+C
+C INPUT : IB1PAR - ARRAY OF DECODED PARAMETERS FROM BLOCK 1.
+C
+C OUTPUT : FLAG FIELDS ARE PRINTED IN BINARY REPRESENTATION.
+C OTHER FIELDS AS INTEGERS.
+C
+C JOHN HENNESSY ECMWF OCTOBER 1985
+C
+C Modifications.
+C --------------
+C J. Hennessy ECMWF 23:11:90
+C Printed output changed from all upper-case.
+C
+C ---------------------------------------------------------------
+C----<
+C
+ IMPLICIT INTEGER (A-Z)
+C
+ DIMENSION IB1PAR(*)
+C
+ WRITE (*,'(1H )')
+ WRITE (*,9000)
+ 9000 FORMAT (1H ,'Section 1 - Product definition section.')
+C
+ WRITE (*,'(1H )')
+ WRITE (*,9001) IB1PAR(1)
+ 9001 FORMAT (1H ,'Originating centre identifier. ',I9)
+ WRITE (*,9002) IB1PAR(2)
+ 9002 FORMAT (1H ,'Model identification. ',I9)
+ WRITE (*,9003) IB1PAR(3)
+ 9003 FORMAT (1H ,'Grid definition. ',I9)
+ NBIT = 8
+ CALL PRTBIN (IB1PAR(4),NBIT,OUT,ERR)
+ WRITE (*,9004) OUT
+ 9004 FORMAT (1H ,'Flag (Code Table 1) ',I8.8)
+ WRITE (*,9005) IB1PAR(5)
+ 9005 FORMAT (1H ,'Parameter identifier (Code Table 2). ',I9)
+ WRITE (*,9006) IB1PAR(6)
+ 9006 FORMAT (1H ,'Type of level (Code Table 3). ',I9)
+ WRITE (*,9007) IB1PAR(7)
+ 9007 FORMAT (1H ,'Value 1 of level (Code Table 3). ',I9)
+ WRITE (*,9008) IB1PAR(8)
+ 9008 FORMAT (1H ,'Value 2 of level (Code Table 3). ',I9)
+ WRITE (*,9009) IB1PAR(9)
+ 9009 FORMAT (1H ,'Year of reference time of data. ',I9)
+ WRITE (*,9010) IB1PAR(10)
+ 9010 FORMAT (1H ,'Month of reference time of data. ',I9)
+ WRITE (*,9011) IB1PAR(11)
+ 9011 FORMAT (1H ,'Day of reference time of data. ',I9)
+ WRITE (*,9012) IB1PAR(12)
+ 9012 FORMAT (1H ,'Hour of reference time of data. ',I9)
+ WRITE (*,9013) IB1PAR(13)
+ 9013 FORMAT (1H ,'Minute of reference time of data. ',I9)
+ WRITE (*,9014) IB1PAR(14)
+ 9014 FORMAT (1H ,'Time unit (Code Table 4). ',I9)
+ WRITE (*,9015) IB1PAR(15)
+ 9015 FORMAT (1H ,'Time range one. ',I9)
+ WRITE (*,9016) IB1PAR(16)
+ 9016 FORMAT (1H ,'Time range two. ',I9)
+ WRITE (*,9017) IB1PAR(17)
+ 9017 FORMAT (1H ,'Time range indicator (Code Table 5) ',I9)
+ WRITE (*,9018) IB1PAR(18)
+ 9018 FORMAT (1H ,'Number averaged. ',I9)
+C
+ RETURN
+C
+ END
diff --git a/gribex/prtbk2.F b/gribex/prtbk2.F
new file mode 100755
index 0000000..ba623c9
--- /dev/null
+++ b/gribex/prtbk2.F
@@ -0,0 +1,121 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE PRTBK2 (IB2PAR)
+C
+C---->
+C
+C NAME : PRTBK2
+C
+C FUNCTION : PRINT THE INFORMATION IN THE GRDI DEFINITION
+C BLOCK (BLOCK 2) OF DECODED GRIB DATA.
+C
+C INPUT : IB2PAR - ARRAY OF DECODED PARAMETERS FROM BLOCK 2.
+C
+C OUTPUT : FLAG FIELDS ARE PRINTED IN BINARY REPRESENTATION.
+C OTHER FIELDS AS INTEGERS.
+C
+C JOHN HENNESSY ECMWF OCTOBER 1985
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 23:11:90
+C Output changed from all upper-case.
+C
+C ---------------------------------------------------------------
+C----<
+C
+ IMPLICIT INTEGER (A-Z)
+C
+ DIMENSION IB2PAR(*)
+C
+ WRITE (*,'(1H )')
+ WRITE (*,9000)
+ 9000 FORMAT (1H ,'Section 2 - Grid definition section.')
+C
+ WRITE (*,'(1H )')
+ WRITE (*,9001) IB2PAR(1)
+ 9001 FORMAT (1H ,'Data representation type (Table 6) ',I9)
+C
+C SPHERICAL HARMONIC DATA
+C
+ IF (IB2PAR(1).EQ.50)
+ C THEN
+C
+ WRITE (*,9002) IB2PAR(2)
+ 9002 FORMAT (1H ,'J - Pentagonal resolution parameter. ',I9)
+ WRITE (*,9003) IB2PAR(3)
+ 9003 FORMAT (1H ,'K - Pentagonal resolution parameter. ',I9)
+ WRITE (*,9004) IB2PAR(4)
+ 9004 FORMAT (1H ,'M - Pentagonal resolution parameter. ',I9)
+ WRITE (*,9005) IB2PAR(5)
+ 9005 FORMAT (1H ,'Representation type (Table 9) ',I9)
+ WRITE (*,9006) IB2PAR(6)
+ 9006 FORMAT (1H ,'Representation mode (Table 10). ',I9)
+ WRITE (*,9007) (IB2PAR(I),I=7,11)
+ 9007 FORMAT (1H ,'Not used. ',I9)
+C
+ RETURN
+C
+ ENDIF
+C
+C GAUSSIAN AND REGULAR LATITUDE / LONGITUDE GRIDS.
+C
+ IF (IB2PAR(1).EQ.0.OR.IB2PAR(1).EQ.4)
+ C THEN
+C
+ WRITE (*,9102) IB2PAR(2)
+ 9102 FORMAT (1H ,'No. of points along a latitude. ',I9)
+ WRITE (*,9103) IB2PAR(3)
+ 9103 FORMAT (1H ,'No. of points along a meridian. ',I9)
+ WRITE (*,9104) IB2PAR(4)
+ 9104 FORMAT (1H ,'Latitude of origin. ',I9)
+ WRITE (*,9200)
+ 9200 FORMAT (1H ,'(Southern latitudes are negative.)')
+ WRITE (*,9105) IB2PAR(5)
+ 9105 FORMAT (1H ,'Longitude of origin. ',I9)
+ WRITE (*,9201)
+ 9201 FORMAT (1H ,'(Western longitudes are negative.)')
+ NBIT = 8
+ CALL PRTBIN (IB2PAR(6),NBIT,OUT,ERR)
+ WRITE (*,9106) OUT
+ 9106 FORMAT (1H ,'Resolution flag. ',I8.8)
+ WRITE (*,9107) IB2PAR(7)
+ 9107 FORMAT (1H ,'Latitude of extreme point. ',I9)
+ WRITE (*,9200)
+ WRITE (*,9108) IB2PAR(8)
+ 9108 FORMAT (1H ,'Longitude of extreme point. ',I9)
+ WRITE (*,9201)
+ WRITE (*,9109) IB2PAR(9)
+ 9109 FORMAT (1H ,'East-West increment. ',I9)
+ IF (IB2PAR(1).EQ.0)
+ C THEN
+ WRITE (*,9110) IB2PAR(10)
+ 9110 FORMAT (1H ,'North-South increment. ',
+ C I9)
+ ENDIF
+ IF (IB2PAR(1).EQ.4)
+ C THEN
+ WRITE (*,8110) IB2PAR(10)
+ 8110 FORMAT(1H ,'No. of latitude lines pole / equator.',
+ C I9)
+ ENDIF
+ NBIT = 8
+ CALL PRTBIN (IB2PAR(11),NBIT,OUT,ERR)
+ WRITE (*,9111) OUT
+ 9111 FORMAT (1H ,'Scanning mode flags (Code Table 8) ',I8.8)
+C
+ RETURN
+C
+ ENDIF
+C
+ END
diff --git a/gribex/prtbl1.F b/gribex/prtbl1.F
new file mode 100755
index 0000000..9644a54
--- /dev/null
+++ b/gribex/prtbl1.F
@@ -0,0 +1,72 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE PRTBL1 (IB1PAR)
+C
+C---->
+C**************************************************************
+C*
+C* NAME : PRTBL1
+C*
+C* FUNCTION : PRINT THE INFORMATION IN THE PRODUCT DEFINITION
+C* BLOCK (BLOCK 1) OF DECODED GRIB DATA.
+C*
+C* INPUT : IB1PAR - ARRAY OF DECODED PARAMETERS FROM BLOCK 1.
+C*
+C* JOHN HENNESSY ECMWF 28 MAY 1985
+C*
+C*
+C**************************************************************
+C----<
+C
+ DIMENSION IB1PAR(*)
+C
+ WRITE (*,9000)
+ 9000 FORMAT (1H0,'BLOCK 1 - PRODUCT DEFINITION BLOCK',/)
+C
+ WRITE (*,9001) IB1PAR(1)
+ 9001 FORMAT (1H0,'ORIGINATING CENTRE IDENTIFIER. ',I9)
+ WRITE (*,9002) IB1PAR(2)
+ 9002 FORMAT (1H ,'MODEL IDENTIFICATION. ',I9)
+ WRITE (*,9003) IB1PAR(3)
+ 9003 FORMAT (1H ,'GRID DEFINITION. ',I9)
+ WRITE (*,9004) IB1PAR(4)
+ 9004 FORMAT (1H ,'FLAG (CODE TABLE 1) ',I9)
+ WRITE (*,9005) IB1PAR(5)
+ 9005 FORMAT (1H ,'PARAMETER IDENTIFIER (CODE TABLE 2). ',I9)
+ WRITE (*,9006) IB1PAR(6)
+ 9006 FORMAT (1H ,'TYPE OF LEVEL (CODE TABLE 3). ',I9)
+ WRITE (*,9007) IB1PAR(7)
+ 9007 FORMAT (1H ,'VALUE 1 OF LEVEL (CODE TABLE 3). ',I9)
+ WRITE (*,9008) IB1PAR(8)
+ 9008 FORMAT (1H ,'VALUE 2 OF LEVEL (CODE TABLE 3). ',I9)
+ WRITE (*,9009) IB1PAR(9)
+ 9009 FORMAT (1H ,'YEAR OF DATA. ',I9)
+ WRITE (*,9010) IB1PAR(10)
+ 9010 FORMAT (1H ,'MONTH OF DATA. ',I9)
+ WRITE (*,9011) IB1PAR(11)
+ 9011 FORMAT (1H ,'DAY OF DATA. ',I9)
+ WRITE (*,9012) IB1PAR(12)
+ 9012 FORMAT (1H ,'HOUR OF DATA. ',I9)
+ WRITE (*,9013) IB1PAR(13)
+ 9013 FORMAT (1H ,'MINUTE OF DATA. ',I9)
+ WRITE (*,9014) IB1PAR(14)
+ 9014 FORMAT (1H ,'TIME UNIT (CODE TABLE 4). ',I9)
+ WRITE (*,9015) IB1PAR(15)
+ 9015 FORMAT (1H ,'TIME RANGE ONE. ',I9)
+ WRITE (*,9016) IB1PAR(16)
+ 9016 FORMAT (1H ,'TIME RANGE TWO. ',I9)
+ WRITE (*,9017) IB1PAR(17)
+ 9017 FORMAT (1H ,'TIME RANGE FLAG (CODE TABLE 5). ',I9)
+C
+ RETURN
+C
+ END
diff --git a/gribex/prtbl2.F b/gribex/prtbl2.F
new file mode 100755
index 0000000..7090210
--- /dev/null
+++ b/gribex/prtbl2.F
@@ -0,0 +1,97 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE PRTBL2 (IB2PAR)
+C
+C---->
+C*
+C* NAME : PRTBL2
+C*
+C* FUNCTION : PRINT THE INFORMATION IN THE GRDI DEFINITION
+C* BLOCK (BLOCK 2) OF DECODED GRIB DATA.
+C*
+C* INPUT : IB2PAR - ARRAY OF DECODED PARAMETERS FROM BLOCK 2.
+C*
+C* JOHN HENNESSY ECMWF 28 MAY 1985
+C*
+C*
+C ---------------------------------------------------------------
+C----<
+C
+ DIMENSION IB2PAR(*)
+C
+ WRITE (*,9000)
+ 9000 FORMAT (1H0,'BLOCK 2 - GRID DEFINITION BLOCK',/)
+C
+ WRITE (*,9001) IB2PAR(1)
+ 9001 FORMAT (1H0,'DATA REPRESENTATION TYPE (TABLE 6) ',I9)
+C
+C SPHERICAL HARMONIC DATA
+C
+ IF (IB2PAR(1).EQ.50)
+ C THEN
+C
+ WRITE (*,9002) IB2PAR(2)
+ 9002 FORMAT (1H ,'J - PENTAGONAL RESOLUTION PARAMETER. ',I9)
+ WRITE (*,9003) IB2PAR(3)
+ 9003 FORMAT (1H ,'K - PENTAGONAL RESOLUTION PARAMETER. ',I9)
+ WRITE (*,9004) IB2PAR(4)
+ 9004 FORMAT (1H ,'M - PENTAGONAL RESOLUTION PARAMETER. ',I9)
+ WRITE (*,9005) IB2PAR(5)
+ 9005 FORMAT (1H ,'REPRESENTATION TYPE (TABLE 9) ',I9)
+ WRITE (*,9006) IB2PAR(6)
+ 9006 FORMAT (1H ,'REPRESENTATION MODE (TABLE 10). ',I9)
+C
+ RETURN
+C
+ ENDIF
+C
+C GAUSSIAN AND REGULAR LATITUDE / LONGITUDE GRIDS.
+C
+ IF (IB2PAR(1).EQ.0.OR.IB2PAR(1).EQ.4)
+ C THEN
+C
+ WRITE (*,9102) IB2PAR(2)
+ 9102 FORMAT (1H ,'NO. OF POINTS ALONG A LATITUDE. ',I9)
+ WRITE (*,9103) IB2PAR(3)
+ 9103 FORMAT (1H ,'NO. OF POINTS ALONG A MERIDIAN. ',I9)
+ WRITE (*,9104) IB2PAR(4)
+ 9104 FORMAT (1H ,'LATITUDE OF ORIGIN (SOUTH -IVE) ',I9)
+ WRITE (*,9105) IB2PAR(5)
+ 9105 FORMAT (1H ,'LONGITUDE OF ORIGIN (WEST -IVE) ',I9)
+ WRITE (*,9106) IB2PAR(6)
+ 9106 FORMAT (1H ,'EXTREME POINT / INCREMENTS FLAG. ',I9)
+ WRITE (*,9107) IB2PAR(7)
+ 9107 FORMAT (1H ,'LATITUDE OF EXTREME POINT(SOUTH -IVE)',I9)
+ WRITE (*,9108) IB2PAR(8)
+ 9108 FORMAT (1H ,'LONGITUDE OF EXTREME POINT(WEST -IVE)',I9)
+ WRITE (*,9109) IB2PAR(9)
+ 9109 FORMAT (1H ,'LATITUDE INCREMENT. ',I9)
+ IF (IB2PAR(1).EQ.0)
+ C THEN
+ WRITE (*,9110) IB2PAR(10)
+ 9110 FORMAT(1H ,'LONGITUDE INCREMENT. ',
+ C I9)
+ ENDIF
+ IF (IB2PAR(1).EQ.4)
+ C THEN
+ WRITE (*,8110) IB2PAR(10)
+ 8110 FORMAT(1H ,'NO. OF LATITUDE LINES POLE / EQUATOR.',
+ C I9)
+ ENDIF
+ WRITE (*,9111) IB2PAR(11)
+ 9111 FORMAT (1H ,'SCANNING MODE (CODE TABLE 8). ',I9)
+C
+ RETURN
+C
+ ENDIF
+C
+ END
diff --git a/gribex/ptquasi.F b/gribex/ptquasi.F
new file mode 100755
index 0000000..b864dfa
--- /dev/null
+++ b/gribex/ptquasi.F
@@ -0,0 +1,167 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE PTQUASI (KSEC2)
+C
+C---->
+C**** PTQUASI
+C
+C Purpose.
+C --------
+C
+C Print the qusai-regular information in the Grid Description
+C Section (Section 2) of decoded GRIB data.
+C
+C** Interface.
+C ----------
+C
+C CALL PTQUASI (KSEC2)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KSEC2 - Array of decoded integers from Section 2.
+C
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C
+C Method.
+C -------
+C
+C See below.
+C
+C
+C Externals.
+C ----------
+C
+C PRTBIN
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes re GRIB Code.
+C
+C
+C Comments.
+C ---------
+C
+C Only data representation types catered for are Gaussian
+C grid, latitude/longitude grid, Spherical Harmonics,
+C Polar stereographic and Space view perspective.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 21.02.95
+C
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Subroutine arguments
+ INTEGER KSEC2
+ DIMENSION KSEC2(*)
+C
+C Local variables
+ CHARACTER*12 YOUT
+C
+ INTEGER NEXTLAT, NREPEAT, LATCNT
+ INTEGER J120
+C
+ LOGICAL NTOS
+C
+C -----------------------------------------------------------------
+C* Section 1. Print quasi-grid data.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C See if scanning is north->south or south->north
+C
+ WRITE(GRPRSM,*) ' Number of points along a parallel varies.'
+ NTOS = ( MOD(KSEC2(11),128) .LT. 64 )
+ IF ( NTOS ) THEN
+ WRITE(GRPRSM,*)
+ X ' Number of points. Parallel. (North to South)'
+ ELSE
+ WRITE(GRPRSM,*)
+ X ' Number of points. Parallel. (South to North)'
+ ENDIF
+C
+C Display number of points for each latitude
+ LATCNT = KSEC2(3)
+ NEXTLAT = 0
+ YOUT = ' '
+C
+ DO 120 J120 = 1,LATCNT
+ NEXTLAT = NEXTLAT + 1
+ WRITE (YOUT(1:4),'(I4)') NEXTLAT
+C
+C Finished?
+ IF (NEXTLAT.GT.LATCNT) GO TO 900
+ IF (NEXTLAT.EQ.LATCNT) THEN
+ WRITE(GRPRSM,9005) KSEC2(NEXTLAT+22) , YOUT
+ GO TO 900
+ ENDIF
+C
+C Look for neighbouring latitudes with same number of points
+C
+ NREPEAT = 0
+ 110 CONTINUE
+C
+C If neighbouring latitudes have same number of points
+C increase the repeat count.
+ IF (KSEC2(NEXTLAT+22+1).EQ.KSEC2(NEXTLAT+22)) THEN
+ NREPEAT = NREPEAT + 1
+ NEXTLAT = NEXTLAT + 1
+ IF (NEXTLAT.LT.LATCNT) GO TO 110
+ ENDIF
+C
+C Display neighbouring latitudes with same number of points as
+C 'nn to mm'.
+ IF (NREPEAT.GE.1) THEN
+ YOUT(5:) = ' to '
+ WRITE (YOUT(9:12),'(I4)') NEXTLAT
+ ENDIF
+ WRITE(GRPRSM,9005) KSEC2(NEXTLAT+22) , YOUT
+ YOUT = ' '
+C
+ 120 CONTINUE
+C
+C -----------------------------------------------------------------
+C* Section 9 . Format statements. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ 9005 FORMAT (1H , I5,16X,A12)
+C
+ END
diff --git a/gribex/qu2reg.F b/gribex/qu2reg.F
new file mode 100755
index 0000000..f7f7e30
--- /dev/null
+++ b/gribex/qu2reg.F
@@ -0,0 +1,331 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE QU2REG (PFIELD,KPOINT,KLAT,KLON,KCODE)
+C
+C---->
+C**** QU2REG - Convert quasi-regular grid data to regular.
+C
+C Purpose.
+C --------
+C
+C Convert quasi-regular grid data to regular,
+C using either a linear or cubic interpolation.
+C
+C** Interface.
+C ----------
+C
+C CALL QU2REG (PFIELD,KPOINT,KLAT,KLON,KCODE)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C PFIELD - Array containing quasi-regular grid
+C data.
+C
+C KPOINT - Array containing list of the number of
+C points on each latitude (or longitude) of
+C the quasi-regular grid.
+C
+C KLAT - Number of latitude lines
+C
+C KLON - Number of longitude lines
+C
+C KCODE - Interpolation required.
+C 1 , linear - data quasi-regular on
+C latitude lines.
+C 3 , cubic - data quasi-regular on
+C latitude lines.
+C 11, linear - data quasi-regular on
+C longitude lines.
+C 13, cubic - data quasi-regular on
+C longitude lines.
+C
+C Output Parameters.
+C ------------------
+C
+C PFIELD - Array containing regular grid data.
+C
+C Method.
+C -------
+C
+C Data is interpolated and expanded into a temporary array,
+C which is then copied back into the user's array.
+C Routine aborts if an invalid interpolation is requested or
+C field size exceeds array dimensions.
+C
+C Externals.
+C ----------
+C
+C ROWINA
+C ABORTX
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes for GRIB code specifications of
+C quasi-regular grids.
+C
+C Comments.
+C ---------
+C
+C This routine is an adaptation of INTPGRR and runs
+C on the Cray only.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 18.06.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 08.10.91
+C Call to ROWINT changed to call to ROWINA.
+C ROWINA called if only number of values required is not
+C the same as the input number.
+C
+C J. Hennessy ECMWF 07.01.92
+C Call to ABORT changed to ABORTX.
+C
+C -----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0. Definition of variables. Data statements.
+C -----------------------------------------------------------------
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+#ifdef CRAY
+
+ IMPLICIT NONE
+#endif
+
+C
+ INTEGER ICODE
+ INTEGER ILII
+ INTEGER ILIO
+ INTEGER IQUANO
+ INTEGER IREGNO
+C
+ INTEGER JPMAX
+C
+ INTEGER J210
+ INTEGER J220
+ INTEGER J225
+ INTEGER J230
+ INTEGER J240
+C
+ INTEGER KCODE
+ INTEGER KLAT
+ INTEGER KLON
+ INTEGER KPOINT
+C
+ REAL PFIELD
+C
+ REAL ZLINE
+ REAL ZTEMP
+ REAL ZWORK
+C
+C Maximum number of latitudes (or longitudes), for which arrays
+C are dimensioned.
+C
+ PARAMETER (JPMAX=320)
+C
+ DIMENSION PFIELD(*)
+ DIMENSION ZTEMP(JPMAX*JPMAX*2)
+ DIMENSION ZLINE(JPMAX*2)
+ DIMENSION ZWORK(0:JPMAX*2+2,3)
+C
+ DIMENSION KPOINT(*)
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1. Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Check input parameters.
+C
+ IF (KCODE.NE.1.AND.KCODE.NE.3.AND.
+ C KCODE.NE.11.AND.KCODE.NE.13)
+ C THEN
+ WRITE (*,9001) KCODE
+ CALL ABORTX ('QU2REG')
+ ENDIF
+C
+ IF (KLAT.GT.JPMAX)
+ C THEN
+ WRITE (*,9002) KLAT , JPMAX
+ CALL ABORTX ('QU2REG')
+ ENDIF
+C
+ IF (KLON.GT.JPMAX*2)
+ C THEN
+ WRITE (*,9003) KLAT , JPMAX*2
+ CALL ABORTX ('QU2REG')
+ ENDIF
+C
+C Set array indices to 0.
+C
+ ILII = 0
+ ILIO = 0
+C
+C Establish values of loop parameters.
+C
+ IF (KCODE.GT.10)
+ C THEN
+C
+C Quasi-regular along longitude lines.
+C
+ IQUANO = KLON
+ IREGNO = KLAT
+ ICODE = KCODE - 10
+ ELSE
+C
+C Quasi-regular along latitude lines.
+C
+ IQUANO = KLAT
+ IREGNO = KLON
+ ICODE = KCODE
+ ENDIF
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2. Interpolate field from quasi to regular grid.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ DO 230 J230=1,IQUANO
+C
+ IF (IREGNO.NE.KPOINT(J230))
+ C THEN
+C
+C Line contains less values than required,so
+C extract quasi-regular grid values for a line
+C
+ DO 210 J210=1,KPOINT(J230)
+ ILII = ILII+1
+ ZLINE(J210) = PFIELD(ILII)
+ 210 CONTINUE
+C
+C and interpolate this line.
+C
+ CALL ROWINA (ZLINE,IREGNO,KPOINT(J230),ZWORK,ICODE)
+C
+C Add regular grid values for this line to the temporary
+C array.
+C
+ DO 220 J220=1,IREGNO
+ ILIO = ILIO+1
+ ZTEMP(ILIO) = ZLINE(J220)
+ 220 CONTINUE
+C
+ ELSE
+C
+C Line contains the required number of values, so add
+C this line to the temporary array.
+C
+ DO 225 J225=1,IREGNO
+ ILIO = ILIO+1
+ ILII = ILII+1
+ ZTEMP(ILIO) = PFIELD(ILII)
+ 225 CONTINUE
+C
+ ENDIF
+C
+ 230 CONTINUE
+C
+C Copy temporary array to user array.
+C
+ DO 240 J240=1,KLON*KLAT
+ PFIELD(J240) = ZTEMP(J240)
+ 240 CONTINUE
+C
+C ------------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9. Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ 9001 FORMAT (1H ,'QU2REG : Invalid interpolation type code = ',I3)
+C
+ 9002 FORMAT (1H ,'QU2REG : Number of latitudes is ',I4,', maximum ',
+ C 'allowed is ',I3,'.')
+C
+ 9003 FORMAT (1H ,'QU2REG : Number of longitudes is ',I4,', maximum ',
+ C 'allowed is ',I3,'.')
+C
+ RETURN
+C
+ END
diff --git a/gribex/qu2reg2.F b/gribex/qu2reg2.F
new file mode 100755
index 0000000..50d3b4c
--- /dev/null
+++ b/gribex/qu2reg2.F
@@ -0,0 +1,305 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE QU2REG2(PFIELD,KPOINT,KLAT,KLON,KCODE,PMSVAL,KRET)
+C
+C---->
+C**** QU2REG - Convert quasi-regular grid data to regular.
+C
+C Purpose.
+C --------
+C
+C Convert quasi-regular grid data to regular,
+C using either a linear or cubic interpolation.
+C
+C
+C** Interface.
+C ----------
+C
+C CALL QU2REG2(PFIELD,KPOINT,KLAT,KLON,KCODE,PMSVAL)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C PFIELD - Array containing quasi-regular grid
+C data.
+C
+C KPOINT - Array containing list of the number of
+C points on each latitude (or longitude) of
+C the quasi-regular grid.
+C
+C KLAT - Number of latitude lines
+C
+C KLON - Number of longitude lines
+C
+C KCODE - Interpolation required.
+C 1 , linear - data quasi-regular on
+C latitude lines.
+C 3 , cubic - data quasi-regular on
+C latitude lines.
+C 11, linear - data quasi-regular on
+C longitude lines.
+C 13, cubic - data quasi-regular on
+C longitude lines.
+C
+C PMSVAL - Value used for missing data indicator.
+C
+C
+C Output Parameters.
+C ------------------
+C
+C KRET - return code
+C 0 = OK
+C non-zero indicates fatal error
+C
+C
+C Output Parameters.
+C ------------------
+C
+C PFIELD - Array containing regular grid data.
+C
+C
+C Method.
+C -------
+C
+C Data is interpolated and expanded into a temporary array,
+C which is then copied back into the user's array.
+C Returns an error code if an invalid interpolation is requested
+C or field size exceeds array dimensions.
+C
+C
+C Externals.
+C ----------
+C
+C ROWINA2
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes for GRIB code specifications of
+C quasi-regular grids.
+C
+C
+C Comments.
+C ---------
+C
+C This routine is an adaptation of QU2REG to allow missing data
+C values, and hence bit mapped fields.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 22.07.94
+C
+C
+C Modifications.
+C --------------
+C
+C J.D.Chambers ECMWF 13.09.94
+C Add return code KRET and remove calls to ABORT.
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables. Data statements.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+C Parameters
+C
+ INTEGER JPBYTES, JPMAX
+#ifdef REAL_8
+ PARAMETER (JPBYTES = 8)
+#else
+ PARAMETER (JPBYTES = 4)
+#endif
+ PARAMETER (JPMAX=721)
+C Maximum number of latitudes (or longitudes), for which arrays
+C are dimensioned.
+C
+C Subroutine arguments
+C
+ REAL PFIELD, PMSVAL
+ DIMENSION PFIELD(*)
+ INTEGER KPOINT, KLAT, KLON, KCODE, KRET
+ DIMENSION KPOINT(*)
+C
+C Local variables.
+C
+ INTEGER ICODE, ILII, ILIO, IQUANO, IREGNO
+ INTEGER J210, J220, J225, J230, J240
+C
+ REAL ZLINE, ZWORK
+ DIMENSION ZLINE(JPMAX*2)
+ DIMENSION ZWORK(0:JPMAX*2+2,3)
+C
+#ifdef POINTER_64
+ INTEGER*8 IZTEMP
+#endif
+ REAL ZTEMP
+ DIMENSION ZTEMP(1)
+ POINTER ( IZTEMP, ZTEMP )
+ INTEGER ISIZE
+ SAVE ISIZE, IZTEMP
+C
+C Externals
+C
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+ EXTERNAL JMALLOC
+C
+ DATA ISIZE/0/
+C
+C ------------------------------------------------------------------
+C* Section 1. Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ KRET = 0
+C
+C Check input parameters.
+C
+ IF (KCODE.NE.1.AND.KCODE.NE.3.AND.KCODE.NE.11.AND.KCODE.NE.13)
+ X THEN
+ WRITE (*,9001) KCODE
+ KRET = 1
+ GOTO 900
+ ENDIF
+C
+ IF (KLAT.GT.JPMAX) THEN
+ WRITE (*,9002) KLAT , JPMAX
+ KRET = 2
+ GOTO 900
+ ENDIF
+C
+ IF (KLON.GT.JPMAX*2) THEN
+ WRITE (*,9003) KLAT , JPMAX*2
+ KRET = 3
+ GOTO 900
+ ENDIF
+C
+C Set array indices to 0.
+C
+ ILII = 0
+ ILIO = 0
+C
+C Establish values of loop parameters.
+C
+ IF (KCODE.GT.10) THEN
+C
+C Quasi-regular along longitude lines.
+C
+ IQUANO = KLON
+ IREGNO = KLAT
+ ICODE = KCODE - 10
+ ELSE
+C
+C Quasi-regular along latitude lines.
+C
+ IQUANO = KLAT
+ IREGNO = KLON
+ ICODE = KCODE
+ ENDIF
+C
+C Allocate memory (first time only)
+ IF( ISIZE.EQ.0 ) THEN
+ ISIZE = (JPMAX*JPMAX*2)*JPBYTES
+ IZTEMP = JMALLOC(ISIZE)
+#ifdef hpR64
+ IZTEMP = IZTEMP/(1024*1024*1024*4)
+#endif
+ IF( IZTEMP.EQ.0 ) THEN
+ WRITE(*,*) 'QU2REG2: Memory allocation failed.'
+ WRITE(*,*) 'QU2REG2: Number of bytes required = ', ISIZE
+ KRET = 5
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 2. Interpolate field from quasi to regular grid.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ DO 230 J230=1,IQUANO
+C
+ IF (IREGNO.NE.KPOINT(J230)) THEN
+C
+C Line contains less values than required,so
+C extract quasi-regular grid values for a line
+C
+ DO 210 J210=1,KPOINT(J230)
+ ILII = ILII+1
+ ZLINE(J210) = PFIELD(ILII)
+ 210 CONTINUE
+C
+C and interpolate this line.
+C
+ CALL ROWINA2( ZLINE, IREGNO, KPOINT(J230), ZWORK, ICODE,
+ X PMSVAL, KRET)
+ IF ( KRET .NE. 0 ) GOTO 900
+C
+C Add regular grid values for this line to the temporary array.
+C
+ DO 220 J220=1,IREGNO
+ ILIO = ILIO+1
+ ZTEMP(ILIO) = ZLINE(J220)
+ 220 CONTINUE
+C
+ ELSE
+C
+C Line contains the required number of values, so add
+C this line to the temporary array.
+C
+ DO 225 J225=1,IREGNO
+ ILIO = ILIO+1
+ ILII = ILII+1
+ ZTEMP(ILIO) = PFIELD(ILII)
+ 225 CONTINUE
+C
+ ENDIF
+C
+ 230 CONTINUE
+C
+C Copy temporary array to user array.
+C
+ DO 240 J240=1,KLON*KLAT
+ PFIELD(J240) = ZTEMP(J240)
+ 240 CONTINUE
+C
+C ------------------------------------------------------------------
+C* Section 9. Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ 9001 FORMAT (1H ,'QU2REG : Invalid interpolation type code = ',I3)
+C
+ 9002 FORMAT (1H ,'QU2REG : Number of latitudes is ',I4,', maximum ',
+ C 'allowed is ',I3,'.')
+C
+ 9003 FORMAT (1H ,'QU2REG : Number of longitudes is ',I4,', maximum ',
+ C 'allowed is ',I3,'.')
+C
+ END
diff --git a/gribex/qu2reg3.F b/gribex/qu2reg3.F
new file mode 100755
index 0000000..7d27f66
--- /dev/null
+++ b/gribex/qu2reg3.F
@@ -0,0 +1,321 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+#ifndef USE_NO_POINTERS
+ SUBROUTINE QU2REG3(PFIELD,KPOINT,KLAT,KLON,KCODE,PMSVAL,KRET,
+ X OMISNG,OPERIO,OVEGGY)
+C
+C---->
+C**** QU2REG3 - Convert quasi-regular grid data to regular.
+C
+C Purpose.
+C --------
+C
+C Convert quasi-regular grid data to regular,
+C using either a linear or cubic interpolation.
+C
+C
+C** Interface.
+C ----------
+C
+C CALL QU2REG3(PFIELD,KPOINT,KLAT,KLON,KCODE,PMSVAL,OMISNG,OPERIO,
+C X OVEGGY)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C PFIELD - Array containing quasi-regular grid
+C data.
+C
+C KPOINT - Array containing list of the number of
+C points on each latitude (or longitude) of
+C the quasi-regular grid.
+C
+C KLAT - Number of latitude lines
+C
+C KLON - Number of longitude lines
+C
+C KCODE - Interpolation required.
+C 1 , linear - data quasi-regular on
+C latitude lines.
+C 3 , cubic - data quasi-regular on
+C latitude lines.
+C 11, linear - data quasi-regular on
+C longitude lines.
+C 13, cubic - data quasi-regular on
+C longitude lines.
+C
+C PMSVAL - Value used for missing data indicator.
+C
+C OMISNG - True if missing values are present in field.
+C
+C OPERIO - True if input field is periodic.
+C
+C OVEGGY - True if 'nearest neighbour' processing must be used
+C for interpolation
+C
+C
+C Output Parameters.
+C ------------------
+C
+C KRET - return code
+C 0 = OK
+C non-zero indicates fatal error
+C
+C
+C Output Parameters.
+C ------------------
+C
+C PFIELD - Array containing regular grid data.
+C
+C
+C Method.
+C -------
+C
+C Data is interpolated and expanded into a temporary array,
+C which is then copied back into the user's array.
+C Returns an error code if an invalid interpolation is requested
+C or field size exceeds array dimensions.
+C
+C
+C Externals.
+C ----------
+C
+C ROWINA3
+C
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes for GRIB code specifications of
+C quasi-regular grids.
+C
+C
+C Comments.
+C ---------
+C
+C This routine is an adaptation of QU2REG to allow missing data
+C values, and hence bit mapped fields.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 22.07.94
+C
+C
+C Modifications.
+C --------------
+C
+C J.D.Chambers ECMWF 13.09.94
+C Add return code KRET and remove calls to ABORT.
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C Addition of OMISNG and OPERIO arguments.
+C Fix message for longitude number out of bounds, and routine
+C name in title and formats.
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables. Data statements.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+C
+ INTEGER JPBYTES, JPMAX
+#ifdef REAL_8
+ PARAMETER (JPBYTES = 8)
+#else
+ PARAMETER (JPBYTES = 4)
+#endif
+ PARAMETER (JPMAX=3000)
+C Maximum number of latitudes (or longitudes), for which arrays
+C are dimensioned.
+C
+C Subroutine arguments
+C
+ REAL PFIELD, PMSVAL
+ DIMENSION PFIELD(*)
+ INTEGER KPOINT, KLAT, KLON, KCODE, KRET
+ DIMENSION KPOINT(*)
+C
+ LOGICAL OMISNG, OPERIO, OVEGGY
+C
+C Local variables.
+C
+ INTEGER ICODE, ILII, ILIO, IQUANO, IREGNO
+ INTEGER J210, J220, J225, J230, J240
+C
+ REAL ZLINE, ZWORK
+ DIMENSION ZLINE(JPMAX*2)
+ DIMENSION ZWORK(0:JPMAX*2+2,3)
+C
+#ifdef POINTER_64
+ INTEGER*8 IZTEMP
+#endif
+ REAL ZTEMP
+ DIMENSION ZTEMP(1)
+ POINTER ( IZTEMP, ZTEMP )
+ INTEGER ISIZE
+ SAVE ISIZE, IZTEMP
+C
+C Externals
+C
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+ EXTERNAL JMALLOC
+C
+ DATA ISIZE/0/
+C
+C ------------------------------------------------------------------
+C* Section 1. Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ KRET = 0
+C
+C Check input parameters.
+C
+ IF (KCODE.NE.1.AND.KCODE.NE.3.AND.KCODE.NE.11.AND.KCODE.NE.13)
+ X THEN
+ WRITE(GRPRSM,9001) KCODE
+ KRET = 1
+ GOTO 900
+ ELSEIF (KLAT.GT.JPMAX) THEN
+ WRITE(GRPRSM,9002) KLAT , JPMAX
+ KRET = 2
+ GOTO 900
+ ELSEIF (KLON.GT.JPMAX*2) THEN
+ WRITE(GRPRSM,9003) KLON , JPMAX*2
+ KRET = 3
+ GOTO 900
+ ENDIF
+C
+C Set array indices to 0.
+C
+ ILII = 0
+ ILIO = 0
+C
+C Establish values of loop parameters.
+C
+ IF (KCODE.GT.10) THEN
+C
+C Quasi-regular along longitude lines.
+C
+ IQUANO = KLON
+ IREGNO = KLAT
+ ICODE = KCODE - 10
+ ELSE
+C
+C Quasi-regular along latitude lines.
+C
+ IQUANO = KLAT
+ IREGNO = KLON
+ ICODE = KCODE
+ ENDIF
+C
+C Allocate memory (first time only)
+ IF( ISIZE.EQ.0 ) THEN
+ ISIZE = (JPMAX*JPMAX*2)*JPBYTES
+ IZTEMP = JMALLOC(ISIZE)
+#ifdef hpR64
+ IZTEMP = IZTEMP/(1024*1024*1024*4)
+#endif
+ IF( IZTEMP.EQ.0 ) THEN
+ WRITE(GRPRSM,*) 'QU2REG3: Memory allocation failed.'
+ WRITE(GRPRSM,*) 'QU2REG3: Number of bytes required = ', ISIZE
+ KRET = 5
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 2. Interpolate field from quasi to regular grid.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ DO 230 J230=1,IQUANO
+C
+ IF (IREGNO.NE.KPOINT(J230)) THEN
+C
+C Line contains less values than required,so
+C extract quasi-regular grid values for a line
+C
+ DO 210 J210=1,KPOINT(J230)
+ ILII = ILII+1
+ ZLINE(J210) = PFIELD(ILII)
+ 210 CONTINUE
+C
+C and interpolate this line.
+C
+ CALL ROWINA3( ZLINE, IREGNO, KPOINT(J230), ZWORK, ICODE,
+ X PMSVAL, KRET, OMISNG, OPERIO , OVEGGY)
+ IF ( KRET .NE. 0 ) GOTO 900
+C
+C Add regular grid values for this line to the temporary array.
+C
+ DO 220 J220=1,IREGNO
+ ILIO = ILIO+1
+ ZTEMP(ILIO) = ZLINE(J220)
+ 220 CONTINUE
+C
+ ELSE
+C
+C Line contains the required number of values, so add
+C this line to the temporary array.
+C
+ DO 225 J225=1,IREGNO
+ ILIO = ILIO+1
+ ILII = ILII+1
+ ZTEMP(ILIO) = PFIELD(ILII)
+ 225 CONTINUE
+C
+ ENDIF
+C
+ 230 CONTINUE
+C
+C Copy temporary array to user array.
+C
+ DO 240 J240=1,KLON*KLAT
+ PFIELD(J240) = ZTEMP(J240)
+ 240 CONTINUE
+C
+C ------------------------------------------------------------------
+C* Section 9. Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ 9001 FORMAT (1H ,'QU2REG3 : Invalid interpolation type code = ',I3)
+C
+ 9002 FORMAT (1H ,'QU2REG3 : Number of latitudes is ',I4,', maximum ',
+ C 'allowed is ',I4,'.')
+C
+ 9003 FORMAT (1H ,'QU2REG3 : Number of longitudes is ',I4,', maximum ',
+ C 'allowed is ',I4,'.')
+C
+ END
+#endif
diff --git a/gribex/reclen.F b/gribex/reclen.F
new file mode 100755
index 0000000..20bc6ae
--- /dev/null
+++ b/gribex/reclen.F
@@ -0,0 +1,205 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE RECLEN (BLOCK,LEN,NBIT,ICODE,INDIC,LEVEL,IERR)
+C
+C---->
+C* *
+C* NAME : RECLEN
+C* *
+C* FUNCTION : CALCULATES FROM THE GRIB (OR PSEUDO GRIB) HEADERS *
+C* THE TOTAL LENGTH OF THE RECORD, AND ALSO RETURNS *
+C* PARAMETER NUMBER, INDICATOR OF TYPE OF LEVEL AND *
+C* LEVEL NUMBER. *
+C* *
+C* INPUT : BLOCK = INPUT ARRAY *
+C* NBIT = NO OF BITS PER COMPUTER WORD *
+C* *
+C* OUTPUT : LEN = LENGTH IN OCTETS *
+C* ICODE = PARAMETER NUMBER *
+C* INDIC = LEVEL TYPE INDICATOR *
+C* LEVEL = LEVEL NUMBER *
+C* IERR = -1 , UNDEFINED BLOCK 3 INCLUDED. *
+C* = -2 , ERROR DETECTED BY SUBROUTINE OFFSET. *
+C = -3 , Section length of 0 found.
+C* = 0 , NO ERROR. *
+C* *
+C* GENERAL : RECLEN CALLS GBYTES *
+C* OFFSET *
+C* MODVAL *
+C* *
+C* AUTHOR : B.V. GURETZKY 03.05.85 *
+C* *
+C* MODIFIED : J. HENNESSY 25.11.85 *
+C J. Hennessy 11.11.91
+C Checks on section lengths of 0 added.
+C* *
+C ---------------------------------------------------------------
+C----<
+C
+ IMPLICIT INTEGER(B,U)
+ DIMENSION BLOCK(*)
+ DIMENSION IBLOCK(24)
+C
+C SKIP PAST LEADING 4 ASCII CHARACTERS
+C
+ IWORD = 1
+ IOFF = 0
+ IBYTE = 8
+ NVAL = 4
+ ILENG = 200
+ IERR = 0
+C
+ CALL OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C EXTRACT FIRST 4 OCTETS OF BLOCK 1.
+C
+ CALL GBYTES (BLOCK(IWORD),IBLOCK(1),IOFF,IBYTE,0,NVAL)
+ CALL OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C IF THESE OCTETS DO NOT CONTAIN 0, 0, 24 AND 0 RESPECTIVELY
+C THEN THE DATA IS IN THE OLD VERSION OF THE CODE.
+C
+ IF (IBLOCK(1).EQ.0.AND.IBLOCK(2).EQ.0.AND.IBLOCK(3).EQ.24.
+ C AND.IBLOCK(4).EQ.0)
+ C THEN
+ ISNEW = 1
+ NVAL = 20
+ ELSE
+ ISNEW = 0
+ NVAL = 16
+ ENDIF
+C
+C EXTRACT NEXT 16 OR 20 OCTETS OF BLOCK 1 - NUMBER DEPENDS
+C ON VERSION OF CODE.
+C
+ CALL GBYTES (BLOCK(IWORD),IBLOCK(5),IOFF,IBYTE,0,NVAL)
+ CALL OFFSET (IOFF,NVAL,IWORD,IBYTE,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+C
+C LENGTH OF BLOCK 0 + BLOCK 1
+ LEN = 24 + (ISNEW*4)
+C
+C
+C PARAMETER NUMBER.
+C
+ ICODE = IBLOCK(5+4*ISNEW)
+C
+C LEVEL TYPE
+C
+ INDIC = IBLOCK(6+4*ISNEW)
+C
+C LEVEL DESCRIPTION
+C
+ KTEMP = 32 + ISNEW*224
+C
+ IF (INDIC.EQ.100.OR.INDIC.EQ.103.OR.INDIC.EQ.105.
+ C .OR.INDIC.EQ.107.OR.INDIC.EQ.109)
+ C THEN
+ LEVEL = IBLOCK(7+ISNEW*4) * KTEMP + IBLOCK(8+ISNEW*4)
+ ELSE
+ LEVEL = IBLOCK(7+ISNEW*4)
+ ENDIF
+C
+C CHECK FOR PRESENCE OF BLOCK 2.
+C
+ IFLAG = IBLOCK(4+4*ISNEW)
+C
+ INC = 0
+ IF (ISNEW.EQ.0)
+ C THEN
+ IF (IFLAG.EQ.1.OR.IFLAG.EQ.3) INC = 1
+ ELSE
+ IF (IFLAG.EQ.128.OR.IFLAG.EQ.192) INC = 1
+ ENDIF
+C
+C LENGTH OF GRID DEFINITION BLOCK
+C
+ IF (INC.EQ.1)
+ C THEN
+ CALL GBYTE (BLOCK(IWORD),LBLK,IOFF,24)
+ LEN = LEN + LBLK
+ IF (LBLK.EQ.0)
+ C THEN
+ IERR = -3
+ LEN = 0
+ WRITE (*,9001)
+ RETURN
+ ENDIF
+C
+ CALL OFFSET (IOFF,LBLK,IWORD,8,NBIT,ILENG,IERR)
+ IF (IERR.NE.0) RETURN
+ ENDIF
+C
+C CHECK FOR PRESENCE OF BLOCK 3
+C
+ INC = 0
+ IF (ISNEW.EQ.0)
+ C THEN
+ IF (IFLAG.EQ.2.OR.IFLAG.EQ.3) INC = 1
+ ELSE
+ IF (IFLAG.EQ.64.OR.IFLAG.EQ.192) INC = 1
+ ENDIF
+C
+C
+C------------------------------------------
+C
+C NMC WASHINGTON SEA SURFACE TEMPERATURE ANALYSIS IS THE ONLY
+C GRIB CODED FIELD WITH BLOCK 3. IT ALSO VARIES IN LENGTH SO
+C THE LENGTH IS FIXED FOR ARCHIVAL/RETRIEVAL PURPOSES TO
+C 34920 BYTES.
+C
+ IF (INC.EQ.1)
+ C THEN
+ LEN = 34920
+ RETURN
+ ENDIF
+C
+C------------------------------------------
+C
+C
+ IF (INC.EQ.1)
+ C THEN
+ IERR = -1
+ WRITE (*,*) ' RECLEN : BLOCK 3 OF GRIB CODE NOT DEFINED'
+ RETURN
+ ENDIF
+C
+C LENGTH OF BINARY DATA BLOCK
+C
+ CALL GBYTE (BLOCK(IWORD),LBLK,IOFF,24)
+ LEN = LEN + LBLK
+C
+ IF (LBLK.EQ.0)
+ C THEN
+ IERR = -3
+ LEN = 0
+ WRITE (*,9002)
+ RETURN
+ ENDIF
+C
+C BLOCK 5 HAS FIXED LENGTH OF 4 OCTETS.
+
+ LEN = LEN + 4
+C
+C MAKE LENGTH MULTIPLE OF 120 OCTETS
+C
+ INTER = 120
+ CALL MODVAL (LEN,LENB,INTER)
+ LEN = LENB
+C
+ 9001 format (1h ,'RECLEN : Length of section 2 is 0.')
+C
+ 9002 format (1h ,'RECLEN : Length of section 4 is 0.')
+ RETURN
+ END
diff --git a/gribex/ref2grb.F b/gribex/ref2grb.F
new file mode 100755
index 0000000..5d98c63
--- /dev/null
+++ b/gribex/ref2grb.F
@@ -0,0 +1,175 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION REF2GRB(PREF, KEXP, KMANT, KBITS)
+C
+C---->
+C**** REF2GRB
+C
+C Purpose.
+C --------
+C
+C Code and check reference value in IBM format
+C
+C
+C** Interface.
+C ----------
+C
+C CALL REF2GRB(PREF, KEXP, KMANT, KBITS)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C PREF - Reference value
+C KBITS - Number of bits per computer word.
+C
+C
+C Output Parameters.
+C -----------------
+C
+C KEXP - 8-bit exponent
+C KMANT - 24-bit mantissa
+C
+C Function returns 0 if no problems encountered, otherwise -1.
+C
+C
+C Method.
+C -------
+C
+C Codes in IBM format, then decides to ensure that reference
+C value used for packing is not different from that stored
+C because of packing differences.
+C
+C
+C Externals.
+C ----------
+C
+C CONFP3 - Encode into IBM floating point format.
+C DECFP - Decode from IBM floating point format.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 17:05:94
+C
+C
+C Modifications.
+C _____________
+C
+C Change to function return status code.
+C J.D.Chambers ECMWF August, 2000
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+#include "grbcom.h"
+C
+C Subroutine arguments
+C
+ REAL PREF
+ INTEGER KEXP, KMANT, KBITS
+C
+C Local variables
+C
+ INTEGER ITRND
+ REAL ZTEMP
+ LOGICAL LDEBUG
+C
+C -----------------------------------------------------------------|
+C* Section 1. Convert to and from IBM format.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ REF2GRB = 0
+C
+ LDEBUG = (NDBG.EQ.1)
+C
+C Convert floating point reference value to IBM representation.
+C
+ ITRND = 1
+ ZTEMP = PREF
+ CALL CONFP3 (PREF,KEXP,KMANT,KBITS,ITRND)
+C
+C Set reference value to that actually stored in the GRIB code.
+C
+ CALL DECFP2 (PREF,KEXP,KMANT)
+C
+C If the nearest number which can be represented in
+C GRIB format is greater than the reference value,
+C find the nearest number in GRIB format lower
+C than the reference value.
+C
+ IF (ZTEMP.LT.PREF) THEN
+C
+C Convert floating point to GRIB representation
+C using truncation to ensure that the converted
+C number is smaller than the original one.
+C
+ ITRND = 0
+ PREF = ZTEMP
+ CALL CONFP3 (PREF,KEXP,KMANT,KBITS,ITRND)
+C
+C Set reference value to that stored in the GRIB code.
+C
+ CALL DECFP2 (PREF,KEXP,KMANT)
+C
+ IF (ZTEMP.LT.PREF) THEN
+ IF( LDEBUG ) THEN
+ WRITE(GRPRSM,*) 'REF2GRB: Reference value error.'
+ WRITE(GRPRSM,*) 'REF2GRB: Notify Met.Applications Section.'
+ WRITE(GRPRSM,*) 'REF2GRB: ZTEMP = ', ZTEMP
+#ifdef REAL_8
+ WRITE(GRPRSM,'(1X,Z16)') ZTEMP
+#else
+ WRITE(GRPRSM,'(1X,Z8)') ZTEMP
+#endif
+ WRITE(GRPRSM,*) 'REF2GRB: PREF = ', PREF
+#ifdef REAL_8
+ WRITE(GRPRSM,'(1X,Z16)') PREF
+#else
+ WRITE(GRPRSM,'(1X,Z8)') PREF
+#endif
+ REF2GRB = -1
+ ENDIF
+C
+ PREF = ZTEMP
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/remsp.F b/gribex/remsp.F
new file mode 100755
index 0000000..726913a
--- /dev/null
+++ b/gribex/remsp.F
@@ -0,0 +1,46 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE REMSP (STRING)
+C
+C---->
+C**** REMSP - Remove leading spaces from character string.
+C NAME : REMSP
+C
+C FUNCTION : LEFT JUSTIFY CHARACTER STRING BY REMOVING
+C ANY LEADING SPACES.
+C
+C INPUT : STRING = CHARACTER STRING, WITH OR WITHOUT
+C LEADING SPACES.
+C
+C OUTPUT : STRING = CHARACTER STRING LEFT JUSTIFIED.
+C
+C JOHN HENNESSY, ECMWF, 16TH APRIL 1985
+C
+C ---------------------------------------------------------------
+C----<
+C
+ CHARACTER*(*) STRING
+C
+ DO 100 I=1,LEN(STRING)
+ IF (STRING(I:I).NE.' ') GO TO 200
+ 100 CONTINUE
+C
+C Blank line.
+C
+ RETURN
+C
+C Left justify string.
+C
+ 200 STRING(1:) = STRING(I:)
+C
+ RETURN
+ END
diff --git a/gribex/repchr.F b/gribex/repchr.F
new file mode 100755
index 0000000..38968f1
--- /dev/null
+++ b/gribex/repchr.F
@@ -0,0 +1,162 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE REPCHR (HCHAR,HOLD,HNEW)
+C
+C---->
+C**** REPCHR - Replace one character by another.
+C
+C Purpose.
+C --------
+C
+C Replace all occurrences of a given character in a
+C character string by another.
+C
+C** Interface.
+C ----------
+C
+C CALL REPCHR (HCHAR,HOLD,HNEW)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input parameters.
+C -----------------
+C
+C HCHAR - Character string to be modified.
+C HOLD - Character to be replaced.
+C HNEW - Replacement character.
+C
+C Output parameters.
+C ------------------
+C
+C HCHAR - Modified character string.
+C
+C Method.
+C -------
+C
+C Characters examined in sequence and changed if necessary.
+C Only the first character of the strings HOLD and HNEW is
+C used, if these are longer than 1 character.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C Program contains sections 0 to 1 and section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 16.01:92.
+C
+C Modifications
+C --------------
+C
+C None.
+C
+C ----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+ INTEGER ILEN
+C
+ INTEGER J150
+C
+ CHARACTER*(*) HCHAR
+ CHARACTER*(*) HOLD
+ CHARACTER*(*) HNEW
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Replace required characters.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ ILEN = LEN (HCHAR)
+C
+ DO 150 J150=1,ILEN
+ IF (HCHAR(J150:J150).EQ.HOLD(1:1)) HCHAR(J150:J150) = HNEW(1:1)
+ 150 CONTINUE
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/gribex/revero.F b/gribex/revero.F
new file mode 100755
index 0000000..6989ee9
--- /dev/null
+++ b/gribex/revero.F
@@ -0,0 +1,263 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION REVERO ( KDATA, KLENP, KSEC2, KGRIB, KLENG,
+ X KBITS, KBMAP, KVALS, OPRIBI, OQUASI,
+ X KNROWS, KLEN, KWORK, KLWORK, ODEBUG,
+ X OPRCLN, KLENGR )
+C
+C---->
+C**** REVERO
+C
+C Purpose.
+C --------
+C
+C Reverse order of even rows in a field of integer values.
+C This function is used for handling of boustrophedonic ordering
+C in extended second-order packing methods.
+C
+C
+C** Interface.
+C ----------
+C
+C KRET = REVERO ( KDATA, KLENP, KSEC2, KGRIB, KLENG, KBITS,
+C X KBMAP, KVALS, OPRIBI, OQUASI, KNROWS, KLEN,
+C X KWORK, KLWORK, ODEBUG, OPRCLN, KLENGR )
+C
+C Input Parameters.
+C ----------------
+C
+C KDATA - Array of normalized values.
+C KLENP - Length of array KDATA.
+C KSEC2 - Array of GRIB section 2 integer descriptors.
+C KGRIB - Array containing GRIB product (for bit-map).
+C KLENG - Length of GRIB product array.
+C KBITS - Number of bits per computer word.
+C KBMAP - Bit pointer for start of explicit primary Bit-MAP
+C (if any).
+C KVALS - Number of bits in primary bit-map.
+C OPRIBI - True if a PRImary BIt-map is present.
+C OQUASI - True if the grid is QUASI-regular.
+C KNROWS - Number of ROWS (or lines) in the grid.
+C KLEN - Exact number of grid-points to handle.
+C KLWORK - Length of work array KWORK.
+C ODEBUG - True for some debug printout.
+C OPRCLN - True if row lengthes have been pre-computed.
+C
+C Input Parameters if OPRCLN is TRUE.
+C ------------------------------------
+C KLENGR - Effective LENGth of Rows array.
+C
+C Output Parameters if OPRCLN is FALSE.
+C ------------------------------------
+C
+C KWORK - Work array, used to unpack a primary bit-map, if any.
+C
+C Method.
+C -------
+C
+C Determines effective row length(es), and swaps fields values
+C for rows with an even rank.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C Note that arrays KLENGR and KWORK are not used in the same call,
+C so they may overlap.
+C
+C
+C Author.
+C -------
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C
+C
+C Modifications.
+C _____________
+C
+C None.
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C
+C Subroutine arguments
+C
+ INTEGER KLENP, KBMAP, KVALS, KNROWS, KLEN, KLWORK, KLENG, KBITS
+ INTEGER KDATA (KLENP), KSEC2 (*), KWORK (KLWORK), KGRIB (KLENG)
+ INTEGER KLENGR (KNROWS)
+C
+ LOGICAL OPRIBI, OQUASI, ODEBUG, OPRCLN
+C
+C Local variables.
+C
+ INTEGER IREFLN, IPTRBM, IRETFN, JROW, IPTOFF, ILNGTX, INBSEQ, J
+ INTEGER JSEQ, IPTNBR, ICOUNT, ILNGTH, ILEN, INDEX1, INDEX2, IRET
+ INTEGER IAUXIL
+C
+ CHARACTER YOPER*1
+C
+C -----------------------------------------------------------------
+C* Section 1 . Performs initial computations.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+#ifndef ebug2o
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9100) OPRCLN
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ YOPER='D'
+C
+ IRETFN = 0
+ IREFLN=22
+ ICOUNT=0
+C
+ IF (OPRIBI) THEN
+ IPTRBM=KBMAP
+ ILEN=KVALS
+ ELSE
+ ILEN=KLEN
+ ENDIF
+C
+ ILNGTX=ILEN/KNROWS
+C
+C -----------------------------------------------------------------
+C* Section 2 . Loop on rows, wuth values swap for even rank rows.
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ DO 222 JROW=1,KNROWS
+C
+ IF (OQUASI) THEN
+ ILNGTX=KSEC2(IREFLN+JROW)
+ ENDIF
+C
+ IF (.NOT.OPRIBI.OR.ILNGTX.EQ.0) THEN
+C
+C Effective length of row = full length.
+C
+ ILNGTH=ILNGTX
+C
+ ELSEIF (OPRCLN) THEN
+C
+ ILNGTH=KLENGR (JROW)
+C
+ ELSE
+C
+C An (explicit) bit-map is included.
+C The number of values in current row has to be computed.
+C
+ ILNGTH=0
+ INBSEQ=1+(ILNGTX-1)/KLWORK
+C
+ DO 212 JSEQ=1,INBSEQ
+ IPTOFF=(JSEQ-1)*KLWORK
+ IPTNBR=MIN (KLWORK,ILNGTX-IPTOFF)
+ CALL INXBIT (KGRIB,KLENG,IPTRBM,KWORK,IPTNBR,KBITS,1,
+ X YOPER,IRET)
+C
+ IF (IRET.NE.0) THEN
+ IRETFN = 23210
+ WRITE(GRPRSM,FMT=9210) JROW, IPTOFF+1, IPTOFF+IPTNBR
+ GOTO 900
+ ENDIF
+C
+ DO 211 J=1,IPTNBR
+ ILNGTH=ILNGTH+KWORK(J)
+ 211 CONTINUE
+C
+ 212 CONTINUE
+C
+ ENDIF
+C
+ IF (MOD (JROW,2).EQ.0.AND.ILNGTH.GT.1) THEN
+C
+C Swap field values within row.
+C
+#ifdef CRAY
+CDIR$ IVDEP
+#endif
+#ifdef FUJITSU
+!OCL NOVREC
+#endif
+ DO 221 J=1,ILNGTH/2
+ INDEX1=ICOUNT+J
+ INDEX2=ICOUNT+ILNGTH+1-J
+ IAUXIL=KDATA(INDEX1)
+ KDATA(INDEX1)=KDATA(INDEX2)
+ KDATA(INDEX2)=IAUXIL
+ 221 CONTINUE
+C
+ ENDIF
+C
+ ICOUNT=ICOUNT+ILNGTH
+C
+ 222 CONTINUE
+C
+ IF (ICOUNT.NE.KLEN) THEN
+ IRETFN = 23220
+ WRITE(GRPRSM,FMT=9220) ICOUNT, KLEN
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ REVERO = IRETFN
+#ifndef ebug2o
+C
+ IF (ODEBUG) THEN
+#endif
+ WRITE(GRPRSM,FMT=9900) IRETFN
+#ifndef ebug2o
+ ENDIF
+#endif
+C
+ RETURN
+C
+ 9100 FORMAT (' REVERO: Function start, OPRCLN = ',L1,'.')
+C
+ 9210 FORMAT (' REVERO: Problem unpacking primary bit-map,row',I6,
+ X ' points ',I8,'..',I8,'.')
+C
+ 9220 FORMAT (' REVERO: Inconsistency: computed g.p. number =',I8,
+ X ', expected =',I8,'.')
+C
+ 9900 FORMAT (' REVERO: Function return code =',I6,'.')
+C
+ END
diff --git a/gribex/rorint.F b/gribex/rorint.F
new file mode 100755
index 0000000..63d0062
--- /dev/null
+++ b/gribex/rorint.F
@@ -0,0 +1,139 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE RORINT(PDATA,KDATA,KLEN,HDIR)
+C
+C---->
+C**** RORINT - Conversion of arrays between data types.
+C
+C Purpose.
+C --------
+C
+C Converts real arrays to integer and vice versa.
+C
+C** Interface.
+C ----------
+C
+C CALL RORINT(PDATA,KDATA,KLEN,HDIR)
+C
+C Input Parameters.
+C -----------------
+C
+C KDATA - Array of integer increments
+C Input for 'R' function.
+C PDATA - Array of floating point values.
+C Input for 'I' function.
+C KLEN - Number of values to be converted.
+C HDIR - 'R', convert integer to real.
+C 'I', convert real to integer.
+C
+C Output Parameters.
+C -----------------
+C
+C KDATA - Array of integer increments
+C Output for 'I' function.
+C PDATA - Array of floating point values.
+C Output for 'R' function.
+C
+C Method.
+C -------
+C
+C Data types converted.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C --------
+C
+C PDATA and KDATA are really the same array. This routine
+C is just a device to force vectorisation on the Cray,
+C without the necessity of using another array.
+C
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 27.09.91
+C
+C Modifications.
+C _____________
+C
+C J.D.Chambers ECMWF 21.11.94
+C Use JNINT on VAX
+C
+C J.D.Chambers ECMWF 23.10.97
+C Use input and output arrays with same REAL and INTEGER size.
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#if (defined REAL_BIGGER_THAN_INTEGER)
+ INTEGER*8 KDATA
+ REAL*8 PDATA
+#else
+ INTEGER KDATA
+ REAL PDATA
+#endif
+ INTEGER KLEN
+ DIMENSION PDATA(KLEN)
+ DIMENSION KDATA(KLEN)
+ CHARACTER*(1) HDIR
+C
+ INTEGER JLOOP
+C
+C -----------------------------------------------------------------
+C* Section 1 . Conversion of data types.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Real to integer
+C
+ IF (HDIR.EQ.'I') THEN
+ DO 110 JLOOP = 1, KLEN
+#ifdef VAX
+ KDATA(JLOOP) = JNINT(PDATA(JLOOP))
+#else
+ KDATA(JLOOP) = NINT(PDATA(JLOOP))
+#endif
+ 110 CONTINUE
+C
+C Integer to real
+C
+ ELSE
+ DO 120 JLOOP = KLEN, 1, -1
+#if (defined REAL_BIGGER_THAN_INTEGER)
+ PDATA(JLOOP) = DBLE(KDATA(JLOOP))
+#else
+ PDATA(JLOOP) = REAL(KDATA(JLOOP))
+#endif
+ 120 CONTINUE
+ ENDIF
+C
+C -----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/rowina.F b/gribex/rowina.F
new file mode 100755
index 0000000..614e3ab
--- /dev/null
+++ b/gribex/rowina.F
@@ -0,0 +1,142 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE ROWINA (P,KO,KI,PW,KCODE)
+C
+C---->
+C**** ROWINA - Interpolation of row of values.
+C
+C Purpose.
+C --------
+C
+C Interpolate a row of values.
+C
+C** Interface.
+C ----------
+C
+C CALL ROWINA (P,KO,KI,PW,KCODE)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C P - Row of values to be interpolated.
+C Dimension must be at least KO.
+C
+C KO - Number of values required.
+C
+C KI - Number of values in P on input.
+C
+C PW - Working array.
+C Dimension must be at least (0:KO+2,3).
+C
+C KCODE - Interpolation required.
+C 1 , linear.
+C 3 , cubic.
+C
+C Output Parameters.
+C ------------------
+C
+C P - Now contains KO values.
+C
+C Method.
+C -------
+C
+C Linear or cubic interpolation performed as required.
+C
+C Externals.
+C ----------
+C
+C SCM0
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C This is a version of ROWINT which conforms to Ansi
+C standards, achieved by passing the work array as a
+C parameter and changing lower case letters to upper case.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 09.10.91
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 07.01.92
+C Call to ABORT changed to ABORTX.
+C
+C -----------------------------------------------------------------
+C----<
+C
+ DIMENSION P(KO),PW(0:KO+2,3)
+C
+ IF(KCODE.EQ.1) THEN
+ DO 102 JL=1,KI
+ PW(JL,1)=P(JL)
+ 102 CONTINUE
+ PW(KI+1,1)=P(1)
+ ZRDI=REAL(KI)
+ ZDO=1./REAL(KO)
+C
+ DO 105 JL=1,KO
+ ZPOS=(JL-1)*ZDO
+ ZWT=ZPOS*ZRDI
+ IP=ZWT
+ ZWT=ZWT-IP
+ P(JL)=(1.-ZWT)*PW(IP+1,1)+ZWT*PW(IP+2,1)
+ 105 CONTINUE
+C
+ ELSEIF(KCODE.EQ.3) THEN
+ DO 302 JL=1,KI
+ PW(JL,1)=P(JL)
+ 302 CONTINUE
+ PW(0,1)=P(KI)
+ PW(KI+1,1)=P(1)
+ PW(KI+2,1)=P(2)
+ DO 305 JL=1,KI
+ PW(JL,2)= - PW(JL-1,1)/3. - 0.5*PW(JL,1)
+ 1 + PW(JL+1,1) - PW(JL+2,1)/6.
+ PW(JL+1,3)= PW(JL-1,1)/6. - PW(JL,1)
+ 1 + 0.5*PW(JL+1,1) + PW(JL+2,1)/3.
+ 305 CONTINUE
+ CALL SCM0(PW(1,2),PW(2,3),PW(1,1),PW(2,1),KI)
+ ZRDI=REAL(KI)
+ ZDO=1./REAL(KO)
+ DO 310 JL=1,KO
+ ZPOS=(JL-1)*ZDO
+ ZWT=ZPOS*ZRDI
+ IP=ZWT+1
+ ZWT=ZWT+1.-IP
+ ZWT1 = 1. - ZWT
+ P(JL)=((3.-2.*ZWT1)*PW(IP,1) + ZWT*PW(IP,2))*ZWT1*ZWT1
+ 1 + ((3.-2.*ZWT) *PW(IP+1,1) - ZWT1*PW(IP+1,3))*ZWT*ZWT
+ 310 CONTINUE
+ ELSE
+ WRITE (*,9001) KCODE
+ CALL ABORTX ('ROWINA')
+ ENDIF
+C
+ RETURN
+C
+ 9001 FORMAT (1H ,'ROWINA : Invalid interpolation code = ',I4)
+C
+ END
diff --git a/gribex/rowina2.F b/gribex/rowina2.F
new file mode 100755
index 0000000..6cc3c16
--- /dev/null
+++ b/gribex/rowina2.F
@@ -0,0 +1,228 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ROWINA2( P, KO, KI, PW, KCODE, PMSVAL, KRET)
+C
+C---->
+C**** ROWINA2 - Interpolation of row of values.
+C
+C Purpose.
+C --------
+C
+C Interpolate a row of values.
+C
+C
+C** Interface.
+C ----------
+C
+C CALL ROWINA2( P, KO, KI, PW, KCODE, PMSVAL, KRET)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C P - Row of values to be interpolated.
+C Dimension must be at least KO.
+C
+C KO - Number of values required.
+C
+C KI - Number of values in P on input.
+C
+C PW - Working array.
+C Dimension must be at least (0:KO+2,3).
+C
+C KCODE - Interpolation required.
+C 1 , linear.
+C 3 , cubic.
+C
+C PMSVAL - Value used for missing data indicator.
+C
+C
+C Output Parameters.
+C ------------------
+C
+C P - Now contains KO values.
+C KRET - Return code
+C 0, OK
+C Non-zero, error
+C
+C
+C Method.
+C -------
+C
+C Linear or cubic interpolation performed as required.
+C
+C
+C Externals.
+C ----------
+C
+C SCM0
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C ---------
+C
+C This is a version of ROWINA which allows for missing data
+C values and hence for bitmapped fields.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 22.07.94
+C
+C
+C Modifications.
+C --------------
+C
+C J.D.Chambers ECMWF 13.09.94
+C Add return code KRET and remove calls to ABORT.
+C
+C
+C -----------------------------------------------------------------
+C----<
+C
+C*******************************************************************
+C Section 0. Declarations.
+C*******************************************************************
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+ REAL P, PW, PMSVAL
+ INTEGER KO,KI,KCODE, KRET
+ DIMENSION P(KO),PW(0:KO+2,3)
+C
+C Local variables
+ INTEGER JL, IP
+ REAL ZRDI, ZDO, ZPOS, ZWT, ZWT1
+C
+C*******************************************************************
+C Section 1. Linear interpolation ..
+C*******************************************************************
+C
+ 100 CONTINUE
+C
+ KRET = 0
+C
+ IF( KCODE.EQ.1 ) THEN
+C
+C Move input values to work array
+ DO 110 JL = 1, KI
+ PW(JL,1) = P(JL)
+ 110 CONTINUE
+C
+C Arrange wrap-around value in work array
+ PW(KI+1,1) = P(1)
+C
+C Set up constants to be used to figure out weighting for
+C values in interpolation.
+ ZRDI = FLOAT(KI)
+ ZDO = 1.0 / FLOAT(KO)
+C
+C Loop through the output points
+ DO 120 JL = 1, KO
+C
+C Calculate weight from the start of row
+ ZPOS = (JL-1) * ZDO
+ ZWT = ZPOS * ZRDI
+C
+C Get the current array position(minus 1) from the weight -
+C note the implicit truncation.
+ IP = ZWT
+C
+C If the left value is missing, use the right value
+ IF ( PW(IP+1,1) .EQ. PMSVAL ) THEN
+ P(JL) = PW(IP+2,1)
+C
+C If the right value is missing, use the left value
+ ELSE IF ( PW(IP+2,1) .EQ. PMSVAL ) THEN
+ P(JL) = PW(IP+1,1)
+C
+C If neither missing, interpolate ...
+ ELSE
+C
+C Adjust the weight to range (0.0 to 1.0)
+ ZWT = ZWT - IP
+C
+C Interpolate using the weighted values on either side
+C of the output point position
+ P(JL) = (1.0-ZWT) * PW(IP+1,1) + ZWT * PW(IP+2,1)
+ ENDIF
+C
+ 120 CONTINUE
+C
+C*******************************************************************
+C Section 2. Cubic interpolation ..
+C*******************************************************************
+C
+ 200 CONTINUE
+C
+ ELSEIF(KCODE.EQ.3) THEN
+ DO 210 JL = 1,KI
+ IF ( P(JL) .EQ. PMSVAL ) THEN
+ WRITE(*,*) ' ROWINA2: Cubic interpolation not supported'
+ WRITE(*,*) ' ROWINA2: for fields containing missing data.'
+ WRITE(*,*) ' Sorry!'
+ KRET = 1
+ GOTO 900
+ ENDIF
+ PW(JL,1) = P(JL)
+ 210 CONTINUE
+ PW(0,1) = P(KI)
+ PW(KI+1,1) = P(1)
+ PW(KI+2,1) = P(2)
+ DO 220 JL = 1,KI
+ PW(JL,2) = - PW(JL-1,1)/3.0 - 0.5*PW(JL,1)
+ 1 + PW(JL+1,1) - PW(JL+2,1)/6.0
+ PW(JL+1,3) = PW(JL-1,1)/6.0 - PW(JL,1)
+ 1 + 0.5*PW(JL+1,1) + PW(JL+2,1)/3.0
+ 220 CONTINUE
+ CALL SCM0(PW(1,2),PW(2,3),PW(1,1),PW(2,1),KI)
+ ZRDI = FLOAT(KI)
+ ZDO = 1.0/FLOAT(KO)
+ DO 230 JL = 1,KO
+ ZPOS = (JL-1)*ZDO
+ ZWT = ZPOS*ZRDI
+ IP = ZWT+1
+ ZWT = ZWT+1.0-IP
+ ZWT1 = 1.0 - ZWT
+ P(JL) = ((3.0-2.0*ZWT1)*PW(IP,1) + ZWT*PW(IP,2))*ZWT1*ZWT1
+ 1 + ((3.0-2.0*ZWT) *PW(IP+1,1) - ZWT1*PW(IP+1,3))*ZWT*ZWT
+ 230 CONTINUE
+C
+ ELSE
+C
+C*******************************************************************
+C Section 3. Invalid interpolation code ..
+C*******************************************************************
+C
+ 300 CONTINUE
+C
+ WRITE (*,9001) KCODE
+ KRET = 2
+ ENDIF
+C
+C*******************************************************************
+C Section 9. Closedown.
+C*******************************************************************
+C
+900 CONTINUE
+ RETURN
+C
+ 9001 FORMAT (1H ,'ROWINA2 : Invalid interpolation code = ',I4)
+C
+ END
diff --git a/gribex/rowina3.F b/gribex/rowina3.F
new file mode 100755
index 0000000..06248a1
--- /dev/null
+++ b/gribex/rowina3.F
@@ -0,0 +1,318 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE ROWINA3( P, KO, KI, PW, KCODE, PMSVAL, KRET,
+ X OMISNG, OPERIO, OVEGGY)
+C
+C---->
+C**** ROWINA3 - Interpolation of row of values.
+C
+C Purpose.
+C --------
+C
+C Interpolate a row of values.
+C
+C
+C** Interface.
+C ----------
+C
+C CALL ROWINA3( P, KO, KI, PW, KCODE, PMSVAL, KRET, OMISNG, OPERIO)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C P - Row of values to be interpolated.
+C Dimension must be at least KO.
+C
+C KO - Number of values required.
+C
+C KI - Number of values in P on input.
+C
+C PW - Working array.
+C Dimension must be at least (0:KO+2,3).
+C
+C KCODE - Interpolation required.
+C 1 , linear.
+C 3 , cubic.
+C
+C PMSVAL - Value used for missing data indicator.
+C
+C OMISNG - True if missing values are present in field.
+C
+C OPERIO - True if input field is periodic.
+C
+C OVEGGY - True if 'nearest neighbour' processing must be used
+C for interpolation
+C
+C Output Parameters.
+C ------------------
+C
+C P - Now contains KO values.
+C KRET - Return code
+C 0, OK
+C Non-zero, error
+C
+C
+C Method.
+C -------
+C
+C Linear or cubic interpolation performed as required.
+C
+C
+C Externals.
+C ----------
+C
+C SCM0
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C ---------
+C
+C This is a version of ROWINA which allows for missing data
+C values and hence for bitmapped fields.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 22.07.94
+C
+C
+C Modifications.
+C --------------
+C
+C J.D.Chambers ECMWF 13.09.94
+C Add return code KRET and remove calls to ABORT.
+C
+C J. Clochard, Meteo France, for ECMWF - January 1998.
+C Addition of OMISNG and OPERIO arguments.
+C
+C
+C -----------------------------------------------------------------
+C----<
+C
+C*******************************************************************
+C Section 0. Declarations.
+C*******************************************************************
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Subroutine arguments
+ REAL P, PW, PMSVAL
+ INTEGER KO,KI,KCODE, KRET
+ DIMENSION P(KO),PW(0:KO+2,3)
+C
+C Local variables
+ INTEGER JL, IP
+ REAL ZRDI, ZDO, ZPOS, ZWT, ZWT1
+C
+ LOGICAL OMISNG, OPERIO, OVEGGY
+C
+C*******************************************************************
+C Section 1. Linear interpolation ..
+C*******************************************************************
+C
+ 100 CONTINUE
+C
+ KRET = 0
+C
+ IF( KCODE.EQ.1 ) THEN
+C
+C Move input values to work array
+ DO 110 JL = 1, KI
+ PW(JL,1) = P(JL)
+ 110 CONTINUE
+C
+ IF (OPERIO) THEN
+C
+C Arrange wrap-around value in work array
+ PW(KI+1,1) = P(1)
+C
+C Set up constants to be used to figure out weighting for
+C values in interpolation.
+ ZRDI = REAL(KI)
+ ZDO = 1.0 / REAL(KO)
+ ELSE
+C
+C Repeat last value, to cope with "implicit truncation" below
+ PW(KI+1,1) = P(KI)
+C
+C Set up constants to be used to figure out weighting for
+C values in interpolation.
+ ZRDI = REAL(KI-1)
+ ZDO = 1.0 / REAL(KO-1)
+ ENDIF
+C
+C Loop through the output points
+ IF ( .NOT. OMISNG ) THEN
+C
+ DO 120 JL = 1, KO
+C
+C Calculate weight from the start of row
+ ZPOS = (JL-1) * ZDO
+ ZWT = ZPOS * ZRDI
+C
+C Get the current array position(minus 1) from the weight -
+C note the implicit truncation.
+ IP = ZWT
+C
+C Adjust the weight to range (0.0 to 1.0)
+ ZWT = ZWT - IP
+C
+C If 'nearest neighbour' processing must be used
+C
+ IF( OVEGGY ) THEN
+C
+ IF( ZWT.LT.0.5 ) THEN
+ P(JL) = PW(IP+1,1)
+ ELSE
+ P(JL) = PW(IP+2,1)
+ ENDIF
+ ELSE
+C
+C Interpolate using the weighted values on either side
+C of the output point position
+ P(JL) = (1.0-ZWT) * PW(IP+1,1) + ZWT * PW(IP+2,1)
+C
+ ENDIF
+C
+ 120 CONTINUE
+C
+ ELSE
+C
+ DO 130 JL = 1, KO
+C
+C Calculate weight from the start of row
+ ZPOS = (JL-1) * ZDO
+ ZWT = ZPOS * ZRDI
+C
+C If 'nearest neighbour' processing must be used
+C
+ IF( OVEGGY ) THEN
+C
+ IF( ZWT.LT.0.5 ) THEN
+ P(JL) = PW(IP+1,1)
+ ELSE
+ P(JL) = PW(IP+2,1)
+ ENDIF
+ ELSE
+C
+C Get the current array position(minus 1) from the weight -
+C note the implicit truncation.
+ IP = ZWT
+C
+C If the left value is missing, use the right value
+ IF ( PW(IP+1,1) .EQ. PMSVAL ) THEN
+ P(JL) = PW(IP+2,1)
+C
+C If the right value is missing, use the left value
+ ELSE IF ( PW(IP+2,1) .EQ. PMSVAL ) THEN
+ P(JL) = PW(IP+1,1)
+C
+C If neither missing, interpolate ...
+ ELSE
+C
+C Adjust the weight to range (0.0 to 1.0)
+ ZWT = ZWT - IP
+C
+C Interpolate using the weighted values on either side
+C of the output point position
+ P(JL) = (1.0-ZWT) * PW(IP+1,1) + ZWT * PW(IP+2,1)
+ ENDIF
+C
+ ENDIF
+C
+ 130 CONTINUE
+C
+ ENDIF
+C
+C*******************************************************************
+C Section 2. Cubic interpolation ..
+C*******************************************************************
+C
+ 200 CONTINUE
+C
+ ELSEIF(KCODE.EQ.3) THEN
+C
+ IF ( OMISNG ) THEN
+ WRITE(GRPRSM,*)
+ X 'ROWINA3: Cubic interpolation not supported'
+ WRITE(GRPRSM,*)
+ X 'ROWINA3: for fields containing missing data.'
+ WRITE(GRPRSM,*) ' Sorry!'
+ KRET = 1
+ GOTO 900
+ ENDIF
+C
+ DO 210 JL = 1,KI
+ IF ( P(JL) .EQ. PMSVAL ) THEN
+ WRITE(GRPRSM,*)
+ X 'ROWINA3: Cubic interpolation not supported'
+ WRITE(GRPRSM,*)
+ X 'ROWINA3: for fields containing missing data.'
+ WRITE(GRPRSM,*) ' Sorry!'
+ KRET = 1
+ GOTO 900
+ ENDIF
+ PW(JL,1) = P(JL)
+ 210 CONTINUE
+ PW(0,1) = P(KI)
+ PW(KI+1,1) = P(1)
+ PW(KI+2,1) = P(2)
+ DO 220 JL = 1,KI
+ PW(JL,2) = - PW(JL-1,1)/3.0 - 0.5*PW(JL,1)
+ 1 + PW(JL+1,1) - PW(JL+2,1)/6.0
+ PW(JL+1,3) = PW(JL-1,1)/6.0 - PW(JL,1)
+ 1 + 0.5*PW(JL+1,1) + PW(JL+2,1)/3.0
+ 220 CONTINUE
+ CALL SCM0(PW(1,2),PW(2,3),PW(1,1),PW(2,1),KI)
+ ZRDI = REAL(KI)
+ ZDO = 1.0/REAL(KO)
+ DO 230 JL = 1,KO
+ ZPOS = (JL-1)*ZDO
+ ZWT = ZPOS*ZRDI
+ IP = ZWT+1
+ ZWT = ZWT+1.0-IP
+ ZWT1 = 1.0 - ZWT
+ P(JL) = ((3.0-2.0*ZWT1)*PW(IP,1) + ZWT*PW(IP,2))*ZWT1*ZWT1
+ 1 + ((3.0-2.0*ZWT) *PW(IP+1,1) - ZWT1*PW(IP+1,3))*ZWT*ZWT
+ 230 CONTINUE
+C
+ ELSE
+C
+C*******************************************************************
+C Section 3. Invalid interpolation code ..
+C*******************************************************************
+C
+ 300 CONTINUE
+C
+ WRITE(GRPRSM,9001) KCODE
+ KRET = 2
+ ENDIF
+C
+C*******************************************************************
+C Section 9. Closedown.
+C*******************************************************************
+C
+900 CONTINUE
+ RETURN
+C
+ 9001 FORMAT (1H ,'ROWINA3 : Invalid interpolation code = ',I4)
+C
+ END
diff --git a/gribex/rtb.F b/gribex/rtb.F
new file mode 100755
index 0000000..bd82097
--- /dev/null
+++ b/gribex/rtb.F
@@ -0,0 +1,59 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ INTEGER FUNCTION RTB (CHAR)
+C
+C---->
+C*
+C* NAME : RTB
+C*
+C* FUNCTION : COUNT THE NUMBER OF CHARACTERS IN A CHARACTER
+C* STRING, EXCLUDING TRAILING SPACES.
+C*
+C* INPUT : CHAR - CHARACTER STRING
+C*
+C* OUTPUT : RTB - NO OF CHARACTERS
+C*
+C* GENERAL : RTB CALLS -----
+C*
+C* AUTHOR : J.HENNESSY 15.4.85
+C*
+C ---------------------------------------------------------------
+C----<
+C
+ CHARACTER*(*) CHAR
+C
+ J = LEN (CHAR)
+C
+C No trailing blanks.
+C
+ IF (CHAR(J:J).NE.' ')
+ C THEN
+ RTB = J
+ RETURN
+ ENDIF
+C
+C String with trailing blanks.
+C
+ DO 100 I = J,1,-1
+ IF (CHAR(I:I).NE.' ')
+ C THEN
+ RTB = I
+ RETURN
+ ENDIF
+ 100 CONTINUE
+C
+C String consists of only blanks.
+C
+ RTB = 0
+C
+ RETURN
+ END
diff --git a/gribex/sbyte.F b/gribex/sbyte.F
new file mode 100755
index 0000000..bbcb1bc
--- /dev/null
+++ b/gribex/sbyte.F
@@ -0,0 +1,77 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE SBYTE (DEST,SOURCE,IOFSET,IBYTSZ)
+C
+C---->
+C**** SBYTE - Insert a single bit field. Cray routine.
+C
+C* FUNCTION: STORE A SINGLE BIT FIELD FROM SOURCE INTO DEST
+C*
+C* INPUT : SOURCE = WORD CONTAINING BIT FIELD RIGHT JUSTIFIED
+C* DEST(1) = 1ST TARGET WORD
+C* IOFSET = OFFSET IN BITS FOR START OF THE FIELD
+C* IBYTSZ = LENGTH OF FIELD IN BITS ; .LE.WORD SIZE .....
+C*
+C* OUTPUT : SOURCE,IOFSET,IBYTSZ UNCHANGED
+C* DEST(1) AND EVENTUALLY DEST(2) CONTAIN FIELD
+C*
+C* AUTHOR : M.MIQUEU 08/1981 (REWRITTEN FROM J.MARTELLET'S)
+C*
+C----<
+ PARAMETER(NBPW=64)
+ INTEGER SOURCE,DEST(1)
+ INTEGER SH1,SH2,SH3
+ SH1=IOFSET+IBYTSZ
+ IF(SH1.GT.NBPW) GO TO 2
+
+ SH2=NBPW-SH1
+ IF(SH2.LT.0) SH2=NBPW-SH2
+
+C BYTE DOES NOT SPAN WORDS
+
+
+ DEST(1)=SHIFT(
+ 1 OR(
+ 2 AND(SHIFT(DEST(1),SH1),
+ 3 SHIFT(COMPL(MASK(IBYTSZ)),IBYTSZ) )
+ 4 ,
+ 5 AND(SOURCE,
+ 6 COMPL(SHIFT(COMPL(MASK(IBYTSZ)),IBYTSZ)) )
+ 7 )
+ 8 ,SH2)
+
+
+
+ RETURN
+
+2 CONTINUE
+
+C BYTE SPANS 2 WORDS
+
+ SH3=2*NBPW-SH1
+
+
+ DEST(1)=OR(
+ 1 AND(DEST(1),MASK(IOFSET))
+ 2 ,
+ 3 AND(SHIFT(SOURCE,SH3) , COMPL(MASK(IOFSET)) )
+ 4 )
+
+ DEST(2)=OR(
+ 1 AND(DEST(2) , COMPL(MASK(SH1-NBPW)) )
+ 2 ,
+ 3 SHIFT( AND(SOURCE , COMPL(MASK(SH3)) ) ,SH3)
+ 4 )
+
+
+
+ RETURN
+ END
diff --git a/gribex/sbytes.F b/gribex/sbytes.F
new file mode 100755
index 0000000..341865e
--- /dev/null
+++ b/gribex/sbytes.F
@@ -0,0 +1,63 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE SBYTES (D,S,ISKIP1,IBSIZ,ISKIP2,NBYTES,KWOFF)
+C
+C---->
+C**** SBYTES - Insert a number of bit fields. Cray routine.
+C
+C REVERSES THE ACTION OF GBYTES, TAKING FIELDS FROM S AND
+C INSERTING THEM INTO A BIT STRING IN D. SEE GBYTES.
+C AUTHOR D. ROBERTSON AUG,1981
+C
+C----<
+ PARAMETER(NBPW=64)
+ DIMENSION D(2) , S(NBYTES)
+ INTEGER SH1,SH2,SH3
+ IGNORE = 0
+#ifdef CRAY
+ IF(NUMARG().GT.6) IGNORE = KWOFF
+#else
+ IF(NUMARG(DUMMY).GT.6) IGNORE = KWOFF
+#endif
+ ID=1+ISKIP1/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP1,NBPW-IGNORE) + IGNORE
+ ISTEP = ISKIP2+IBSIZ
+ DO 75 IBYTE = 1 , NBYTES
+C WITH THE STARTING WORD AND BIT POSITION KNOWN, THE
+C DESIRED INSERTION CAN BE DONE BY
+C** CALL SBYTE(D(ID),S(IBYTE),ISKIP,IBSIZ)
+C BUT THE CODE IS SHORT ENOUGH TO GO IN-LINE.
+ SH1 = ISKIP+IBSIZ
+ IF(SH1.GT.NBPW) GO TO 50
+ SH2 = NBPW-SH1
+ IF(SH2.LT.0) SH2 = NBPW-SH2
+C BYTE GOES INTO 1 WORD OF D.
+ D(ID) = SHIFT(OR(AND(SHIFT(D(ID),SH1),MASK(NBPW-IBSIZ)),
+ 1 AND(S(IBYTE),SHIFT(MASK(IBSIZ),IBSIZ))),SH2)
+ GO TO 65
+ 50 CONTINUE
+C BYTE GOES INTO 2 WORDS OF D.
+ SH3 = 2*NBPW-SH1
+ D(ID)=OR(AND(D(ID),MASK(ISKIP)),
+ 1 AND(SHIFT(S(IBYTE),SH3),COMPL(MASK(ISKIP))))
+ D(ID+1)=OR(AND(D(ID+1),SHIFT(COMPL(MASK(SH1-NBPW)),NBPW-IGNORE)
+ 1 ),
+ 2 SHIFT(AND(S(IBYTE),COMPL(MASK(SH3))),SH3-IGNORE))
+ 65 CONTINUE
+C UPDATE STARTING WORD AND BIT POSITION
+ ISKIP = ISKIP+ISTEP
+ IF(ISKIP.LT.NBPW) GO TO 75
+ ISKIP = ISKIP - NBPW
+ ID = ID+1+ISKIP/(NBPW-IGNORE)
+ ISKIP = MOD(ISKIP,NBPW-IGNORE) + IGNORE
+ 75 CONTINUE
+ RETURN
+ END
diff --git a/gribex/scm0.F b/gribex/scm0.F
new file mode 100755
index 0000000..2bdee0c
--- /dev/null
+++ b/gribex/scm0.F
@@ -0,0 +1,61 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE SCM0 (PDL,PDR,PFL,PFR,KLG)
+C
+C---->
+C**** SCM0 - Apply SCM0 limiter to derivative estimates.
+C
+C M. HORTAL ECMWF February 1991 closely following D. WILLIAMSON
+C
+C Apply SCM0 limiter to derivative estimates.
+C
+C output:
+C pdl = the limited derivative at the left edge of the interval
+C pdr = the limited derivative at the right edge of the interval
+C
+C inputs
+C pdl = the original derivative at the left edge
+C pdr = the original derivative at the right edge
+C pfl = function value at the left edge of the interval
+C pfr = function value at the right edge of the interval
+C klg = number of intervals where the derivatives are limited
+C
+C----<
+ INTEGER KLG
+C
+ REAL PDL(KLG), PDR(KLG), PFL(KLG), PFR(KLG)
+C
+ INTEGER JL
+C
+ REAL ZALPHA, ZBETA, ZEPS, ZFAC
+C
+ 100 CONTINUE
+C
+C define constants
+C
+ ZEPS=1.E-12
+ ZFAC=3.*(1.-ZEPS)
+C
+ DO 200 JL=1,KLG
+ IF(ABS(PFR(JL)-PFL(JL)).GT.ZEPS) THEN
+ ZALPHA=PDL(JL)/(PFR(JL)-PFL(JL))
+ ZBETA =PDR(JL)/(PFR(JL)-PFL(JL))
+ IF(ZALPHA.LE.0.) PDL(JL)=0.
+ IF(ZBETA .LE.0.) PDR(JL)=0.
+ IF(ZALPHA.GT.ZFAC) PDL(JL)=ZFAC*(PFR(JL)-PFL(JL))
+ IF(ZBETA .GT.ZFAC) PDR(JL)=ZFAC*(PFR(JL)-PFL(JL))
+ ELSE
+ PDL(JL)=0.
+ PDR(JL)=0.
+ ENDIF
+ 200 CONTINUE
+ END
diff --git a/gribex/search.F b/gribex/search.F
new file mode 100755
index 0000000..59662d9
--- /dev/null
+++ b/gribex/search.F
@@ -0,0 +1,208 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE SEARCH (KEYS,MAXKEY,STRING,LEN,POS,IS,IF,
+ C ISUP,IP,OP,IA,MIN)
+C
+C---->
+C**** SEARCH - Search for given character string.
+C
+C Purpose.
+C --------
+C
+C Search for a match, in an array of character
+C variables, for a given character string.
+C
+C** Interface.
+C ----------
+C
+C CALL SEARCH (KEYS,MAXKEY,STRING,LEN,POS,IS,IF,
+C C ISUP,IP,OP,IA,MIN)
+C
+C Input Parameters.
+C -----------------
+C
+C KEYS = Array of character variables
+C
+C MAXKEY = Size of array
+C
+C STRING = Character string for which match is
+C sought
+C
+C LEN = Length of this string
+C
+C ISUP = 0 , Print turned on, when no match found.
+C 1 , Print suppressed
+C
+C IS = Search start position in array "KEYS"
+C
+C IF = Search end position in array KEYS.
+C
+C OP = Unit number of file output
+C
+C IP = Unit number of file input
+C
+C IA = 1 , Interactive use
+C 0 , Batch use.
+C
+C MIN = Minimum number of characters needed for match.
+C
+C Output Parameters.
+C ------------------
+C
+C POS = 0 , Match not found
+C -1 , Multiple matches found
+C Positive value, indicates array element
+C which matches
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 16.04.85
+C
+C Modifications.
+C --------------
+C
+C J. Hennessy ECMWF 07.12.93
+C Code added to remove ambiguous entries when possible.
+C
+C J.D.Chambers ECMWF 13.12.93
+C Increase parameter value table size 1200 -> 1500
+C
+C ----------------------------------------------------------------
+C----<
+C
+ IMPLICIT INTEGER (A-Z)
+C
+ PARAMETER (ASIZE=1500)
+C
+ DIMENSION KEYS(MAXKEY)
+ CHARACTER*(*) KEYS, STRING
+ CHARACTER*1 PAGE
+C
+ DIMENSION ATAB(ASIZE)
+C
+ IF (MAXKEY.GT.ASIZE)
+ C THEN
+ WRITE (*,*) ' SEARCH : Array limits exceeded.'
+ WRITE (*,*) ' SEARCH : MAXKEY = ', MAXKEY
+ WRITE (*,*) ' Notify MARS group.'
+ CALL ABORT
+ ENDIF
+C
+ SIZE = MAX (LEN,MIN)
+C
+C
+C
+C
+C
+C****************************************************************
+C*
+C* Flag and count matching entries
+C*
+C****************************************************************
+C
+C
+ N = MIN
+ 100 K = 0
+ DO 200 I=IS,IF
+ ATAB(I) = 0
+ IF (STRING(1:N).EQ.KEYS(I)(1:N))
+ C THEN
+ ATAB(I) = 1
+ K = K + 1
+ J = I
+ ENDIF
+ 200 CONTINUE
+C
+ N = N + 1
+ IF (N.LE.SIZE.AND.K.GT.1) GO TO 100
+C
+C
+C****************************************************************
+C*
+C* No match found. print message (if required) and return.
+C*
+C****************************************************************
+C
+ IF (K.EQ.0)
+ C THEN
+ POS = 0
+ IF (ISUP.EQ.1) RETURN
+C
+ IF (STRING(1:1).NE.'?')
+ C THEN
+ WRITE (OP,9000) STRING(1:SIZE)
+ 9000 FORMAT (' Unrecognised entry - ',A)
+ ENDIF
+ WRITE (OP,*) 'Valid entries are :-'
+ N = 0
+ DO 300 I=IS,IF
+ N = N + 1
+ WRITE (OP,'(1H ,20X,A)') KEYS(I)
+ IF (IA.EQ.1.AND.N.EQ.19)
+ C THEN
+ 250 WRITE(OP,*)'Type page to continue -->'
+ N = 0
+ READ (IP,'(A1)') PAGE
+ CALL L2U1CR (PAGE)
+ IF (PAGE.NE.'P') GO TO 250
+ GO TO 300
+ ENDIF
+ 300 CONTINUE
+ POS = 0
+ RETURN
+ END IF
+C
+C****************************************************************
+C*
+C* Return if only 1 match found.
+C*
+C****************************************************************
+C
+ IF (K.EQ.1) THEN
+ POS = J
+ RETURN
+ ENDIF
+C
+C****************************************************************
+C*
+C* Number of entries found. Try to resolve ambiguity.
+C*
+C****************************************************************
+C
+ DO 350 I=IS,IF
+ IF (ATAB(I).EQ.1)
+ C THEN
+ IJ = RTB(KEYS(I))
+ IF (STRING(1:LEN).EQ.KEYS(I)(1:IJ))
+ C THEN
+ POS = I
+ RETURN
+ ENDIF
+ ENDIF
+ 350 CONTINUE
+C
+C****************************************************************
+C*
+C* Ambiguous entry found. Print/display message
+C*
+C****************************************************************
+C
+ WRITE (OP,9001) STRING(1:SIZE)
+ 9001 FORMAT (' Ambiguous entry - ',A)
+ DO 400 I=IS,IF
+ IF (ATAB(I).EQ.1) WRITE (OP,9002) KEYS(I)
+ 9002 FORMAT (' ',A)
+ 400 CONTINUE
+C
+ POS = - 1
+ RETURN
+ END
diff --git a/gribex/sencode.c b/gribex/sencode.c
new file mode 100755
index 0000000..a5793d1
--- /dev/null
+++ b/gribex/sencode.c
@@ -0,0 +1,2586 @@
+/**
+* Copyright 1981-2012 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 "gdecode.h"
+#include "sencode.h"
+
+#define DEBUGOFF 1
+#define DEBUG1 (debugSet > DEBUGOFF )
+#define DEBUG2 (debugSet > (DEBUGOFF + 1) )
+static char * debugLevel;
+static int debugSet = 0;
+
+#define ABS(a) ((a)<0?-(a):(a))
+#define SMALL (1E-12)
+#define PRACTICALLYZERO(a) (ABS((a))<(SMALL))
+#define QUITESMALL (0.05)
+#define ALMOSTZERO(a) (ABS((a))<(QUITESMALL))
+#define TRUE 1
+#define FALSE 0
+#define CHECK 1
+#define NOCHECK 0
+
+#define NORTH 0
+#define SOUTH 1
+#define WEST 2
+#define EAST 3
+#define W_E_INC 4
+#define N_S_INC 5
+#define W_E_PTS 6
+#define N_S_PTS 7
+
+fortint initialiseNewGrib(gribProduct**);
+fortint copyExistingGrib(gribProduct**,gribProduct**);
+void adjustGridAreaDefinition(gribProduct*,int);
+
+fortint SENCODE(gribProduct ** newGrib, gribProduct ** oldGrib) {
+fortint status;
+/*
+// See if DEBUG switched on.
+*/
+ if( ! debugSet ) {
+ debugLevel = getenv("GDECODE_DEBUG");
+ if( debugLevel == NULL )
+ debugSet = DEBUGOFF; /* off */
+ else {
+ int loop;
+ for( loop = 0; loop < strlen(debugLevel) ; loop++ ) {
+ if( ! isdigit(debugLevel[loop]) ) {
+ printf("Invalid number string in GDECODE_DEBUG: %s\n", debugLevel);
+ printf("GDECODE_DEBUG must comprise only digits [0-9].\n");
+ debugSet = DEBUGOFF;
+ }
+ }
+ debugSet = DEBUGOFF + atol( debugLevel );
+ }
+ if( DEBUG1 ) printf("SENCODE: GDECODE_DEBUG switched on, level = %s\n",
+ debugLevel);
+ }
+
+ if( *oldGrib == NULL ) {
+ status = initialiseNewGrib(newGrib);
+ if( DEBUG1 )
+ if( status )
+ printf("SENCODE: initialiseNewGrib failed.\n");
+ else
+ printf("SENCODE: initialiseNewGrib ran OK\n");
+ }
+ else {
+ status = copyExistingGrib(newGrib,oldGrib);
+ if( DEBUG1 )
+ if( status )
+ printf("SENCODE: copyExistingGrib failed.\n");
+ else
+ printf("SENCODE: copyExistingGrib ran OK\n");
+ }
+
+ return status;
+
+}
+
+fortint initialiseNewGrib(gribProduct** newGrib) {
+
+ if( DEBUG1 ) printf("initialiseNewGrib\n");
+
+ *newGrib = (gribProduct *) allocateMemory(sizeof(gribProduct));
+ (*newGrib)->g0 = (gribSection0 *) allocateMemory(sizeof(gribSection0));
+ (*newGrib)->g1 = (gribSection1 *) allocateMemory(sizeof(gribSection1));
+ (*newGrib)->g2 = (gribSection2 *) allocateMemory(sizeof(gribSection2));
+ (*newGrib)->g3 = NULL;
+ (*newGrib)->g4 = (gribSection4 *) allocateMemory(20);
+ (*newGrib)->g5 = (gribSection5 *) allocateMemory(sizeof(gribSection5));
+ memcpy((*((*newGrib)->g5)).end7777,"7777",4);
+
+ (*newGrib)->currentPointIndex = 0;
+ (*newGrib)->numberOfValues = 0;
+ (*newGrib)->value = NULL;
+ (*newGrib)->bitStart = NULL;
+ (*newGrib)->bitsPerValue = 0;
+ (*newGrib)->bitmapped = 0;
+ (*newGrib)->nextValueFirstBit = 0;
+ (*newGrib)->nextBit = 0;
+ (*newGrib)->scale = (fortdouble) 0.0;
+ (*newGrib)->minimum = (fortdouble) 0.0;
+ (*newGrib)->missingValue = (fortdouble) 0.0;
+ (*newGrib)->latitudeOffsets = NULL;
+ (*newGrib)->expandedValues = NULL;
+ (*newGrib)->currentPoint.latitude = NULL;
+ (*newGrib)->currentPoint.longitudeIncrement = NULL;
+ (*newGrib)->currentPoint.gridPointValue = NULL;
+ (*newGrib)->northSet =
+ (*newGrib)->southSet =
+ (*newGrib)->westSet =
+ (*newGrib)->eastSet =
+ (*newGrib)->northSouthIncrementSet =
+ (*newGrib)->westEastIncrementSet =
+ (*newGrib)->northSouthNumberOfPointsSet =
+ (*newGrib)->westEastNumberOfPointsSet = TRUE;
+
+ return (fortint) 0;
+}
+
+fortint copyExistingGrib(gribProduct** newGrib, gribProduct** oldGrib) {
+fortint lengthOfSectionToCopy;
+gribProduct * oldG = *oldGrib;
+gribProduct * newG;
+
+ if( DEBUG1 ) printf("copyExistingGrib\n");
+
+ *newGrib = (gribProduct *) allocateMemory(sizeof(gribProduct));
+ newG = *newGrib;
+/*
+// Create section 0
+*/
+ newG->g0 = (gribSection0 *) allocateMemory(sizeof(gribSection0));
+ memcpy((newG->g0),(oldG->g0),sizeof(gribSection0));
+/*
+// Copy section 1
+*/
+ lengthOfSectionToCopy = g1_length(oldG);
+ newG->g1 = (gribSection1 *) allocateMemory(lengthOfSectionToCopy);
+ memcpy((newG->g1),(oldG->g1),lengthOfSectionToCopy);
+/*
+// Copy section 2
+*/
+ lengthOfSectionToCopy = g2_length(oldG);
+ newG->g2 = (gribSection2 *) allocateMemory(lengthOfSectionToCopy);
+ memcpy((newG->g2),(oldG->g2),lengthOfSectionToCopy);
+
+/*
+ if( anyLatLonGrid(oldG) ) {
+*/
+ if( generalLatLonGrid(oldG) ) {
+ newG->northSet =
+ newG->southSet =
+ newG->westSet =
+ newG->eastSet =
+ newG->northSouthIncrementSet =
+ newG->westEastIncrementSet =
+ newG->northSouthNumberOfPointsSet =
+ newG->westEastNumberOfPointsSet = TRUE;
+ }
+/*
+// Section 3 may or may not have to be created.
+*/
+ newG->g3 = NULL;
+/*
+// Copy standard part of section 4
+*/
+ lengthOfSectionToCopy = 20;
+ newG->g4 = (gribSection4 *) allocateMemory(lengthOfSectionToCopy);
+ memcpy((newG->g4),(oldG->g4),lengthOfSectionToCopy);
+/*
+// Create section 5.
+*/
+ newG->g5 = (gribSection5 *) allocateMemory(sizeof(gribSection5));
+ memcpy((*(newG->g5)).end7777,"7777",4);
+
+
+ newG->currentPointIndex = 0;
+ newG->numberOfValues = getIntegerValue(oldGrib,"numberOfFieldValues");
+ newG->value = NULL;
+ newG->bitStart = NULL;
+ newG->bitsPerValue = oldG->bitsPerValue;
+ newG->bitmapped = oldG->bitmapped;
+ newG->nextValueFirstBit = 0;
+ newG->nextBit = 0;
+ newG->scale = (fortdouble) oldG->scale;
+ newG->minimum = (fortdouble) oldG->minimum;
+ newG->missingValue = (fortdouble) oldG->missingValue;
+ newG->latitudeOffsets = NULL;
+ newG->currentPoint.latitude = NULL;
+ newG->currentPoint.longitudeIncrement = NULL;
+ newG->expandedValues = NULL;
+ newG->currentPoint.gridPointValue = NULL;
+
+ return (fortint) 0;
+}
+
+fortint SENPACK(
+ gribProduct** newGrib, unsigned char * buffer, fortint * bufferLength)
+{
+fortint totalLength;
+gribProduct* g = *newGrib;
+fortint lengthOfSectionToMove, next;
+
+ totalLength = 8 + g1_length(g) + g2_length(g) + g4_length(g) + 4;
+ if( primaryBitmapPresent(g) ) totalLength += g3_length(g);
+
+ if( DEBUG1 ) printf("GRIB totalLength = %d bytes\n",totalLength);
+
+ if( totalLength > *bufferLength ) {
+ if( DEBUG1 ) printf("GRIB length (%d) greater than buffer length (%d)\n",
+ totalLength, *bufferLength );
+ return (fortint) -1;
+ }
+ else {
+ memcpy(buffer,(g->g0),sizeof(gribSection0));
+ MOVE3BYTES((buffer+4),&totalLength);
+ next = sizeof(gribSection0);
+
+ lengthOfSectionToMove = g1_length(g);
+ memcpy((buffer+next),(g->g1),lengthOfSectionToMove);
+ next += g1_length(g);
+
+ lengthOfSectionToMove = g2_length(g);
+ memcpy((buffer+next),(g->g2),lengthOfSectionToMove);
+ next += g2_length(g);
+
+ if( primaryBitmapPresent(g) > 0 ) {
+ lengthOfSectionToMove = g3_length(g);
+ memcpy((buffer+next),(g->g3),lengthOfSectionToMove);
+ next += g3_length(g);
+ }
+
+ lengthOfSectionToMove = g4_length(g);
+ memcpy((buffer+next),(g->g4),lengthOfSectionToMove);
+ next += g4_length(g);
+
+ lengthOfSectionToMove = 4;
+ memcpy((buffer+next),"7777",lengthOfSectionToMove);
+
+ return (fortint) totalLength;
+ }
+}
+
+fortint ISTIME(gribProduct ** grib, fortint * HHMM ) {
+gribProduct * g = *grib;
+fortint hhmm = (fortint) (*HHMM);
+fortint hh = hhmm/100;
+fortint mm = MOD(hhmm,100);
+
+ if( DEBUG1 ) printf("ISTIME: HHMM = %d\n", *HHMM);
+
+ MOVE1BYTE(((g->g1)->hour),&hh);
+ MOVE1BYTE(((g)->g1->minute),&mm);
+
+ return 0;
+}
+
+fortint RSTIME(gribProduct ** grib, double * HHMM ) {
+fortint hhmm = (fortint) (*HHMM);
+
+ if( DEBUG1 ) printf("RSTIME: HHMM = %f\n", *HHMM);
+
+ return ISTIME(grib,&hhmm);
+}
+
+fortint ISDATE(gribProduct ** grib, fortint * YYYYMMDD ) {
+gribProduct * g = *grib;
+fortint yyyymmdd = *YYYYMMDD;
+fortint yyyy, mmdd, year, month, day, century;
+
+ if( DEBUG1 ) printf("ISDATE: YYYYMMDD = %d\n", yyyymmdd);
+
+ yyyy = yyyymmdd/10000;
+ mmdd = MOD(yyyymmdd,10000);
+ year = MOD(yyyy,100);
+ month = mmdd/100;
+ day = MOD(mmdd,100);
+ century = 1 + (yyyy/100);
+ if( year == 0 ) century -= 1;
+
+ MOVE1BYTE(((g->g1)->year),&year);
+ MOVE1BYTE(((g)->g1->month),&month);
+ MOVE1BYTE(((g)->g1->day),&day);
+ MOVE1BYTE(((g)->g1->century),¢ury);
+
+ return 0;
+}
+
+fortint RSDATE(gribProduct ** grib, double * YYYYMMDD ) {
+fortint yyyymmdd = (fortint) *YYYYMMDD;
+
+ if( DEBUG1 ) printf("RSDATE: YYYYMMDD = %f\n", *YYYYMMDD);
+
+ return ISDATE(grib,&yyyymmdd);
+}
+
+fortint ISTABLE(gribProduct ** grib, fortint * table) {
+gribProduct * g = *grib;
+
+ if( DEBUG1 ) printf("ISTABLE: table = %d\n", *table);
+
+ MOVE1BYTE(((g->g1)->tableVersionNumber),table);
+
+ return 0;
+}
+
+fortint RSTABLE(gribProduct ** grib, fortdouble * table) {
+gribProduct * g = *grib;
+fortint Table = (fortint) *table;
+
+ if( DEBUG1 ) printf("RSTABLE: table = %f\n", *table);
+
+ return ISTABLE(grib,&Table);
+}
+
+fortint ISCENTR(gribProduct ** grib, fortint * centre) {
+gribProduct * g = *grib;
+
+ if( DEBUG1 ) printf("ISCENTR: centre = %d\n", *centre);
+
+ MOVE1BYTE(((g->g1)->originatingCentre),centre);
+
+ return 0;
+}
+
+fortint RSCENTR(gribProduct ** grib, fortdouble * centre) {
+gribProduct * g = *grib;
+fortint Centre = (fortint) *centre;
+
+ if( DEBUG1 ) printf("RSCENTR: centre = %f\n", *centre);
+
+ return ISCENTR(grib,&Centre);
+}
+
+fortint ISPARAM(gribProduct ** grib, fortint * parameter) {
+gribProduct * g = *grib;
+
+ if( DEBUG1 ) printf("ISPARAM: parameter = %d\n", *parameter);
+
+ MOVE1BYTE(((g->g1)->parameter),parameter);
+
+ return 0;
+}
+
+fortint RSPARAM(gribProduct ** grib, fortdouble * parameter) {
+gribProduct * g = *grib;
+fortint Parameter = (fortint) *parameter;
+
+ if( DEBUG1 ) printf("RSPARAM: parameter = %f\n", *parameter);
+
+ return ISPARAM(grib,&Parameter);
+}
+
+fortint ISLEVTY(gribProduct ** grib, fortint * typeOfLevel) {
+gribProduct * g = *grib;
+fortint TypeOfLevel = *typeOfLevel;
+fortint zero =0;
+
+ if( DEBUG1 ) printf("ISLEVTY: typeOfLevel = %d\n", TypeOfLevel);
+
+ MOVE1BYTE(((g->g1)->typeOfLevel),typeOfLevel);
+
+ if( (TypeOfLevel < 20) ||
+ ((TypeOfLevel > 20) && (TypeOfLevel < 100)) ||
+ (TypeOfLevel == 102) ||
+ (TypeOfLevel == 118) ||
+ ((TypeOfLevel > 121) && (TypeOfLevel < 125)) ||
+ (TypeOfLevel == 126) ||
+ ((TypeOfLevel > 128) && (TypeOfLevel < 141)) ||
+ ((TypeOfLevel > 141) && (TypeOfLevel < 160)) ||
+ ((TypeOfLevel > 160) && (TypeOfLevel < 200)) ||
+ ((TypeOfLevel > 201) && (TypeOfLevel < 210)) ||
+ (TypeOfLevel > 210) ) {
+ MOVE2BYTES(((g->g1)->level1),&zero);
+ }
+
+ return 0;
+}
+
+fortint RSLEVTY(gribProduct ** grib, fortdouble * typeOfLevel) {
+gribProduct * g = *grib;
+fortint TypeOfLevel = (fortint) *typeOfLevel;
+
+ if( DEBUG1 ) printf("RSLEVTY: typeOfLevel = %f\n", *typeOfLevel);
+
+ return ISLEVTY(grib,&TypeOfLevel);
+}
+
+fortint ISLEVEL(gribProduct ** grib, fortint * level) {
+gribProduct * g = *grib;
+fortint zero = 0, bottomLayer, topLayer;
+
+ if( DEBUG1 ) printf("ISLEVEL: level = %d\n", *level);
+
+ switch( (int) g1_typeOfLevel(g) ) {
+
+ case 20:
+ case 100:
+ case 103:
+ case 105:
+ case 107:
+ case 109:
+ case 111:
+ case 113:
+ case 115:
+ case 117:
+ case 119:
+ case 125:
+ case 127:
+ case 160:
+ case 210:
+ if( DEBUG1 ) printf("ISLEVEL: two-byte level value\n");
+ MOVE2BYTES(((g->g1)->level1),level);
+ break;
+
+ case 101:
+ case 104:
+ case 106:
+ case 108:
+ case 110:
+ case 112:
+ case 114:
+ case 116:
+ case 120:
+ case 121:
+ case 128:
+ case 141:
+ if( DEBUG1 ) printf("ISLEVEL: top and bottom level values\n");
+ topLayer = (*level)/1000;
+ MOVE1BYTE(((g->g1)->level1),&topLayer);
+ bottomLayer = MOD((*level),1000);
+ MOVE1BYTE(((g->g1)->level2),&bottomLayer);
+ break;
+
+ default:
+ if( DEBUG1 ) printf("ISLEVEL: level value set to zero\n");
+ MOVE2BYTES(((g->g1)->level1),&zero);
+ break;
+ }
+
+
+ return 0;
+}
+
+fortint RSLEVEL(gribProduct ** grib, fortdouble * level) {
+gribProduct * g = *grib;
+fortint Level = (fortint) *level;
+
+ if( DEBUG1 ) printf("RSLEVEL: level = %f\n", *level);
+
+ return ISLEVEL(grib,&Level);
+}
+
+fortint ISTUNIT(gribProduct ** grib, fortint * timeUnit) {
+gribProduct * g = *grib;
+
+ if( DEBUG1 ) printf("ISTUNIT: timeUnit = %d\n", *timeUnit);
+
+ switch( (int) *timeUnit ) {
+
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 10:
+ case 11:
+ case 12:
+ case 254:
+ MOVE1BYTE(((g->g1)->unitOfTimeRange),timeUnit);
+ break;
+ return 0;
+
+ default:
+ if( DEBUG1 ) printf("ISTUNIT: invalid time unit\n");
+ return -1;
+ }
+
+}
+
+fortint RSTUNIT(gribProduct ** grib, fortdouble * timeUnit) {
+gribProduct * g = *grib;
+fortint TimeUnit = (fortint) *timeUnit;
+
+ if( DEBUG1 ) printf("RSTUNIT: timeUnit = %f\n", *timeUnit);
+
+ return ISTUNIT(grib,&TimeUnit);
+}
+
+fortint ISTRIND(gribProduct ** grib, fortint * timeRangeIndicator) {
+gribProduct * g = *grib;
+
+ if( DEBUG1 ) printf("ISTRIND: timeRangeIndicator = %d\n",*timeRangeIndicator);
+ MOVE1BYTE(((g->g1)->timeRangeIndicator),timeRangeIndicator);
+
+ return 0;
+}
+
+fortint RSTRIND(gribProduct ** grib, fortdouble * timeRangeIndicator) {
+gribProduct * g = *grib;
+fortint TimeRangeIndicator = (fortint) *timeRangeIndicator;
+
+ if( DEBUG1 ) printf("RSTRIND: timeRangeIndicator = %f\n",*timeRangeIndicator);
+
+ return ISTRIND(grib,&TimeRangeIndicator);
+}
+
+fortint ISSTEP(gribProduct ** grib, fortint * timeStep) {
+gribProduct * g = *grib;
+fortint zero = 0;
+
+ if( DEBUG1 ) printf("ISSTEP: timeStep = %d\n",*timeStep);
+
+ switch( (int) g1_timerange(g) ) {
+
+ case 0:
+ MOVE1BYTE(((g->g1)->P1),timeStep);
+ MOVE1BYTE(((g->g1)->P2),&zero);
+ return 0;
+
+ case 1:
+ MOVE1BYTE(((g->g1)->P1),&zero);
+ MOVE1BYTE(((g->g1)->P2),&zero);
+ return 0;
+
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 113:
+ case 114:
+ case 115:
+ case 116:
+ case 117:
+ case 118:
+ case 119:
+ printf("ISSTEP: time range indicator %d requires separate values for P1 and P2\n", g1_timerange(g));
+ return -1;
+
+ case 10:
+ MOVE2BYTES(((g->g1)->P1),timeStep);
+ return 0;
+
+ case 123:
+ case 124:
+ MOVE1BYTE(((g->g1)->P1),&zero);
+ MOVE1BYTE(((g->g1)->P2),timeStep);
+ return 0;
+
+ default:
+ printf("ISSTEP: unable to set step for reserved time range indicator %d\n", g1_timerange(g));
+ return -1;
+ }
+
+}
+
+fortint RSSTEP(gribProduct ** grib, fortdouble * timeStep) {
+gribProduct * g = *grib;
+fortint TimeStep = (fortint) *timeStep;
+
+ if( DEBUG1 ) printf("RSSTEP: timeStep = %f\n",*timeStep);
+
+ return ISSTEP(grib,&TimeStep);
+}
+
+fortint ISSTEP1(gribProduct ** grib, fortint * timeStepP1) {
+gribProduct * g = *grib;
+fortint zero = 0;
+
+ if( DEBUG1 ) printf("ISSTEP1: timeStepP1 = %d\n",*timeStepP1);
+
+ switch( (int) g1_timerange(g) ) {
+
+ case 0:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 113:
+ case 114:
+ case 115:
+ case 116:
+ case 117:
+ case 118:
+ case 119:
+ MOVE1BYTE(((g->g1)->P1),timeStepP1);
+ return 0;
+
+ case 1:
+ case 123:
+ case 124:
+ MOVE1BYTE(((g->g1)->P1),&zero);
+ return 0;
+
+ case 10:
+ MOVE2BYTES(((g->g1)->P1),timeStepP1);
+ return 0;
+
+ default:
+ printf("ISSTEP1: unable to set P1 for reserved time range indicator %d\n", g1_timerange(g));
+ return -1;
+ }
+
+}
+
+fortint RSSTEP1(gribProduct ** grib, fortdouble * timeStepP1) {
+gribProduct * g = *grib;
+fortint TimeStepP1 = (fortint) *timeStepP1;
+
+ if( DEBUG1 ) printf("RSSTEP1: timeStepP1 = %f\n",*timeStepP1);
+
+ return ISSTEP1(grib,&TimeStepP1);
+}
+
+fortint ISSTEP2(gribProduct ** grib, fortint * timeStepP2) {
+gribProduct * g = *grib;
+fortint zero = 0;
+
+ if( DEBUG1 ) printf("ISSTEP2: timeStepP2 = %d\n",*timeStepP2);
+
+ switch( (int) g1_timerange(g) ) {
+
+ case 0:
+ case 1:
+ MOVE1BYTE(((g->g1)->P2),&zero);
+ return 0;
+
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 113:
+ case 114:
+ case 115:
+ case 116:
+ case 117:
+ case 118:
+ case 119:
+ case 123:
+ case 124:
+ MOVE1BYTE(((g->g1)->P2),timeStepP2);
+ return 0;
+
+ case 10:
+ printf("ISSTEP2: unable to set P2 for time range indicator %d\n", g1_timerange(g));
+ return -1;
+
+ default:
+ printf("ISSTEP2: unable to set P2 for reserved time range indicator %d\n", g1_timerange(g));
+ return -1;
+ }
+
+}
+
+fortint RSSTEP2(gribProduct ** grib, fortdouble * timeStepP2) {
+gribProduct * g = *grib;
+fortint TimeStepP2 = (fortint) *timeStepP2;
+
+ if( DEBUG1 ) printf("RSSTEP2: timeStepP2 = %f\n",*timeStepP2);
+
+ return ISSTEP2(grib,&TimeStepP2);
+}
+
+fortint ISNUMAV(gribProduct ** grib, fortint * numberInAverage) {
+gribProduct * g = *grib;
+
+ if( DEBUG1 ) printf("ISNUMAV: numberInAverage = %d\n",*numberInAverage);
+
+ MOVE2BYTES(((g->g1)->numberInAverage),numberInAverage);
+ return 0;
+}
+
+fortint RSNUMAV(gribProduct ** grib, fortdouble * numberInAverage) {
+gribProduct * g = *grib;
+fortint NumberInAverage = (fortint) *numberInAverage;
+
+ if( DEBUG1 ) printf("RSNUMAV: numberInAverage = %f\n",*numberInAverage);
+
+ return ISNUMAV(grib,&NumberInAverage);
+
+}
+
+fortint ISNUMMS(gribProduct ** grib, fortint * numberMissing) {
+gribProduct * g = *grib;
+
+ if( DEBUG1 ) printf("ISNUMMS: numberMissing = %d\n",*numberMissing);
+
+ MOVE1BYTE(((g->g1)->numberMissing),numberMissing);
+ return 0;
+}
+
+fortint RSNUMMS(gribProduct ** grib, fortdouble * numberMissing) {
+gribProduct * g = *grib;
+fortint NumberMissing = (fortint) *numberMissing;
+
+ if( DEBUG1 ) printf("RSNUMMS: numberMissing = %f\n",*numberMissing);
+
+ return ISNUMMS(grib,&NumberMissing);
+}
+
+fortint ISSUBID(gribProduct ** grib, fortint * subCentreId) {
+gribProduct * g = *grib;
+
+ if( DEBUG1 ) printf("ISSUBID: subCentreId = %d\n",*subCentreId);
+
+ MOVE1BYTE(((g->g1)->subCentreId),subCentreId);
+ return 0;
+}
+
+fortint RSSUBID(gribProduct ** grib, fortdouble * subCentreId) {
+gribProduct * g = *grib;
+fortint SubCentreId = (fortint) *subCentreId;
+
+ if( DEBUG1 ) printf("RSSUBID: subCentreId = %f\n",*subCentreId);
+
+ return ISSUBID(grib,&SubCentreId);
+}
+
+fortint ISUDECF(gribProduct ** grib, fortint * decimalScale) {
+gribProduct * g = *grib;
+fortint scale = *decimalScale;
+
+ if( DEBUG1 ) printf("ISUDECF: decimalScale = %d\n",*decimalScale);
+
+ if( scale < 0 ) scale = (-scale) | 0x8000;
+ MOVE2BYTES(((g->g1)->unitsDecimalScaleFactor),&scale);
+ return 0;
+}
+
+fortint RSUDECF(gribProduct ** grib, fortdouble * decimalScale) {
+gribProduct * g = *grib;
+fortint DecimalScale = (fortint) *decimalScale;
+
+ if( DEBUG1 ) printf("RSUDECF: decimalScale = %f\n",*decimalScale);
+
+ return ISUDECF(grib,&DecimalScale);
+}
+
+fortint ISTYPE(gribProduct ** grib, fortint * ecmwfType) {
+gribProduct * g = *grib;
+
+ if( DEBUG1 ) printf("ISTYPE: ecmwfType = %d\n",*ecmwfType);
+
+ if( ecmwfLocalDefinitionPresent(g) ) {
+ MOVE1BYTE(((g->g1)->local.mars.type),ecmwfType);
+ return 0;
+ }
+
+ if( centreUsingECMWFLocalDefinition((*grib)) ) {
+ MOVE1BYTE(((g->g1)->local.mars.type),ecmwfType);
+ return 0;
+ }
+ else {
+ if( DEBUG1 ) printf("ISTYPE: no ECMWF local definition present\n");
+ return (fortint) -1;
+ }
+
+}
+
+fortint RSTYPE(gribProduct ** grib, fortdouble * ecmwfType) {
+gribProduct * g = *grib;
+fortint EcmwfType = (fortint) *ecmwfType;
+
+ if( DEBUG1 ) printf("RSTYPE: ecmwfType = %f\n",*ecmwfType);
+
+ return ISTYPE(grib,&EcmwfType);
+}
+
+fortint ISCLASS(gribProduct ** grib, fortint * ecmwfClass) {
+gribProduct * g = *grib;
+
+ if( DEBUG1 ) printf("ISCLASS: ecmwfClass = %d\n",*ecmwfClass);
+
+ if( ecmwfLocalDefinitionPresent(g) ) {
+ MOVE1BYTE(((g->g1)->local.mars.ecmwfClass),ecmwfClass);
+ return 0;
+ }
+
+ if( centreUsingECMWFLocalDefinition((*grib)) ) {
+ MOVE1BYTE(((g->g1)->local.mars.ecmwfClass),ecmwfClass);
+ return 0;
+ }
+ else {
+ if( DEBUG1 ) printf("ISCLASS: no ECMWF local definition present\n");
+ return (fortint) -1;
+ }
+
+}
+
+fortint RSCLASS(gribProduct ** grib, fortdouble * ecmwfClass) {
+gribProduct * g = *grib;
+fortint EcmwfClass = (fortint) *ecmwfClass;
+
+ if( DEBUG1 ) printf("RSCLASS: ecmwfClass = %f\n",*ecmwfClass);
+
+ return ISCLASS(grib,&EcmwfClass);
+}
+
+fortint ISSTREM(gribProduct ** grib, fortint * ecmwfStream) {
+gribProduct * g = *grib;
+
+ if( DEBUG1 ) printf("ISSTREM: ecmwfStream = %d\n",*ecmwfStream);
+
+ if( ecmwfLocalDefinitionPresent(g) ) {
+ MOVE2BYTES(((g->g1)->local.mars.stream),ecmwfStream);
+ return 0;
+ }
+
+ if( centreUsingECMWFLocalDefinition((*grib)) ) {
+ MOVE2BYTES(((g->g1)->local.mars.stream),ecmwfStream);
+ return 0;
+ }
+ else {
+ if( DEBUG1 ) printf("ISSTREM: no ECMWF local definition present\n");
+ return (fortint) -1;
+ }
+
+}
+
+fortint RSSTREM(gribProduct ** grib, fortdouble * ecmwfStream) {
+gribProduct * g = *grib;
+fortint EcmwfStream = (fortint) *ecmwfStream;
+
+ if( DEBUG1 ) printf("RSSTREM: ecmwfStream = %f\n",*ecmwfStream);
+
+ return ISSTREM(grib,&EcmwfStream);
+}
+
+fortint ISEXPVR(gribProduct ** grib, fortint * ecmwfExpver) {
+gribProduct * g = *grib;
+
+ if( DEBUG1 ) printf("ISEXPVR: ecmwfExpver = %d\n",*ecmwfExpver);
+
+ if( ecmwfLocalDefinitionPresent(g) ) {
+ MOVE4BYTES(((g->g1)->local.mars.experimentVersionNumber),ecmwfExpver);
+ return 0;
+ }
+
+ if( centreUsingECMWFLocalDefinition((*grib)) ) {
+ MOVE4BYTES(((g->g1)->local.mars.experimentVersionNumber),ecmwfExpver);
+ return 0;
+ }
+ else {
+ if( DEBUG1 ) printf("ISEXPVR: no ECMWF local definition present\n");
+ return (fortint) -1;
+ }
+
+}
+
+fortint RSEXPVR(gribProduct ** grib, fortdouble * ecmwfExpver) {
+gribProduct * g = *grib;
+fortint EcmwfExpver = (fortint) *ecmwfExpver;
+gribSection1 * newG1;
+
+ if( DEBUG1 ) printf("RSEXPVR: ecmwfExpver = %f\n",*ecmwfExpver);
+
+ return ISEXPVR(grib,&EcmwfExpver);
+}
+
+fortint ISDEFIN(gribProduct ** grib, fortint * definitionNumber) {
+gribProduct * g = *grib;
+localDefinition * local;
+fortint length, oldCopyLength, loop;
+gribSection1 * newG1, * oldG1;
+
+ if( DEBUG1 ) printf("ISDEFIN: definitionNumber = %d\n",*definitionNumber);
+
+ if( DEBUG1 ) {
+ if(ecmwfLocalDefinitionPresent(g) || centreUsingECMWFLocalDefinition(g)) {
+ if( *definitionNumber == g1_definition(g) ) {
+ printf("ISDEFIN: definitionNumber already has the given value\n");
+ }
+ else {
+ printf("ISDEFIN: changing the ECMWF local definition from %d to %d\n",
+ g1_definition(g), *definitionNumber);
+ }
+ }
+ else
+ printf("ISDEFIN: creating a new ECMWF local definition\n");
+ }
+
+ length = (40 + sizeof(marsHeader));
+
+ switch( (int) *definitionNumber ) {
+
+ case 1:
+ length += sizeof(ECMWFdefinition1);
+ break;
+
+ case 2:
+ length += sizeof(ECMWFdefinition2);
+ break;
+
+ case 3:
+ length += sizeof(ECMWFdefinition3);
+ break;
+
+ case 5:
+ length += sizeof(ECMWFdefinition5);
+ break;
+
+ case 6:
+ length += sizeof(ECMWFdefinition6);
+ break;
+
+ case 7:
+ length += sizeof(ECMWFdefinition7);
+ break;
+
+ case 8:
+ length += sizeof(ECMWFdefinition8);
+ break;
+
+ case 9:
+ length += sizeof(ECMWFdefinition9);
+ break;
+
+ case 10:
+ length += sizeof(ECMWFdefinition10);
+ break;
+
+ case 11:
+ length += sizeof(ECMWFdefinition11);
+ break;
+
+ case 14:
+ length = 1080;
+ break;
+
+ case 15:
+ length = 60;
+ break;
+
+ case 16:
+ length = 80;
+ break;
+
+ case 18:
+ case 19:
+ length = 120;
+ break;
+
+ case 20:
+ length += sizeof(ECMWFdefinition20);
+ break;
+
+ case 50:
+ length = 300;
+ break;
+
+ default:
+ printf("ISDEFIN: ECMWF local definition from %d not yet handled\n",
+ *definitionNumber);
+ return -1;
+ }
+
+ newG1 = (gribSection1 *) allocateMemory(length);
+ {
+ unsigned char * p = (unsigned char * ) newG1;
+ for( loop = 40; loop < length; loop++ ) p[loop] = '\0';
+ }
+
+ if( ecmwfLocalDefinitionPresent(g) || centreUsingECMWFLocalDefinition(g) )
+ oldCopyLength = (40 + sizeof(marsHeader));
+ else
+ oldCopyLength = 40;
+
+ oldG1 = (gribSection1 *) (g->g1);
+ memcpy(newG1,oldG1,oldCopyLength);
+
+/*freeMemory(oldG1);*/
+ freeMemory(oldG1);
+
+ (g->g1) = newG1;
+ MOVE1BYTE(((g->g1)->local.mars.definition),definitionNumber);
+ MOVE3BYTES(((g->g1)->sectionLength),&length);
+ return 0;
+
+}
+
+fortint RSDEFIN(gribProduct ** grib, fortdouble * definitionNumber) {
+gribProduct * g = *grib;
+fortint DefinitionNumber = (fortint) *definitionNumber;
+
+ if( DEBUG1 ) printf("RSDEFIN: definitionNumber = %f\n",*definitionNumber);
+
+ return ISDEFIN(grib,&DefinitionNumber);
+}
+
+fortint ISBTSPV(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+ if( DEBUG2) printf("ISBTSPV: set number of bits per value to %d\n",*value);
+ MOVE1BYTE(((g->g4)->numberOfBitsPerValue),value);
+ return 0;
+}
+
+fortint RSBTSPV(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) *value;
+
+ if( DEBUG2) printf("RSBTSPV\n");
+ return ISBTSPV(grib,&Ivalue);
+}
+
+fortint ISREPRS(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+fortint Value = *value, defaultValue, loop;
+fortint zero = 0, ninety = 90000;
+unsigned char * p;
+
+ if( DEBUG1) printf("ISREPRS: set data representation type to %d\n",Value);
+
+/*
+//if( g2_datatype(g) == Value ) {
+// if( DEBUG1) printf("ISREPRS: data representation type remains unchanged\n");
+// return 0;
+//}
+*/
+ MOVE1BYTE(((g->g2)->NV),&zero);
+ defaultValue = 0xff;
+ MOVE1BYTE(((g->g2)->PV_PL),&defaultValue);
+
+ switch( (int) Value ) {
+
+ case 0:
+ case 10:
+ case 20:
+ case 30:
+ if( DEBUG1) printf("ISREPRS: setup for latitude/longitude grid\n");
+ MOVE1BYTE(((g->g2)->dataRepresentationType),value);
+
+ MOVE2BYTES(((g->g2)->grid.latlon.numberOfPointsAlongParallel),&zero);
+ MOVE2BYTES(((g->g2)->grid.latlon.numberOfPointsAlongMeridian),&zero);
+ g->northSouthNumberOfPointsSet = g->westEastNumberOfPointsSet = FALSE;
+
+ MOVE3BYTES(((g->g2)->grid.latlon.latitudeOfFirstPoint),&ninety);
+ MOVE3BYTES(((g->g2)->grid.latlon.longitudeOfFirstPoint),&zero);
+ defaultValue = ninety | 0x800000;
+ MOVE3BYTES(((g->g2)->grid.latlon.latitudeOfLastPoint),&defaultValue);
+ defaultValue = 360000;
+ MOVE3BYTES(((g->g2)->grid.latlon.longitudeOfLastPoint),&defaultValue);
+ g->northSet = g->southSet = g->westSet = g->eastSet = TRUE;
+
+ defaultValue = 0x80;
+ MOVE1BYTE(((g->g2)->grid.latlon.resolutionAndComponentsFlag),&defaultValue);
+ MOVE2BYTES(((g->g2)->grid.latlon.iDirectionIncrement),&zero);
+ MOVE2BYTES(((g->g2)->grid.latlon.jDirectionIncrement),&zero);
+ g->northSouthIncrementSet = g->westEastIncrementSet = FALSE;
+
+ MOVE1BYTE(((g->g2)->grid.latlon.scanningMode),&zero);
+ MOVE4BYTES(((g->g2)->grid.latlon.setToZero),&zero);
+
+ defaultValue = ninety | 0x800000;
+ MOVE3BYTES(((g->g2)->grid.latlon.latitudeOfSouthPole),&defaultValue);
+ MOVE3BYTES(((g->g2)->grid.latlon.longitudeOfSouthPole),&zero);
+ MOVE4BYTES(((g->g2)->grid.latlon.angleOfRotationOrStretchingFactor),&zero);
+ MOVE3BYTES(((g->g2)->grid.latlon.latitudeOfPoleOfStretching),&zero);
+ MOVE3BYTES(((g->g2)->grid.latlon.longitudeOfPoleOfStretching),&zero);
+ MOVE4BYTES(((g->g2)->grid.latlon.stretchingFactor),&zero);
+ break;
+
+ case 50:
+ case 60:
+ case 70:
+ case 80:
+ if( DEBUG1) printf("ISREPRS: setup for spherical harmonics\n");
+ MOVE1BYTE(((g->g2)->dataRepresentationType),value);
+ MOVE2BYTES(((g->g2)->grid.spectral.J),&zero);
+ MOVE2BYTES(((g->g2)->grid.spectral.K),&zero);
+ MOVE2BYTES(((g->g2)->grid.spectral.M),&zero);
+ defaultValue = 1;
+ MOVE1BYTE(((g->g2)->grid.spectral.representationType),&defaultValue);
+ MOVE1BYTE(((g->g2)->grid.spectral.representationMode),&defaultValue);
+ p = (unsigned char *) &((g->g2)->grid.spectral.setToZero);
+ for( loop = 0; loop < 18; loop++ ) { MOVE1BYTE(p,&zero); p++; }
+ defaultValue = ninety | 0x800000;
+ MOVE3BYTES(((g->g2)->grid.spectral.latitudeOfSouthPole),&defaultValue);
+ MOVE3BYTES(((g->g2)->grid.spectral.longitudeOfSouthPole),&zero);
+ MOVE4BYTES(((g->g2)->grid.spectral.angleOfRotationOrStretchingFactor),&zero);
+ MOVE3BYTES(((g->g2)->grid.spectral.latitudeOfPoleOfStretching),&zero);
+ MOVE3BYTES(((g->g2)->grid.spectral.longitudeOfPoleOfStretching),&zero);
+ MOVE4BYTES(((g->g2)->grid.spectral.stretchingFactor),&zero);
+ break;
+
+ case 4:
+ case 14:
+ case 24:
+ case 34:
+ if( DEBUG1) printf("ISREPRS: setup for gaussian grids\n");
+ MOVE1BYTE(((g->g2)->dataRepresentationType),value);
+
+ MOVE2BYTES(((g->g2)->grid.gaussian.numberOfPointsAlongParallel),&zero);
+ MOVE2BYTES(((g->g2)->grid.gaussian.numberOfPointsAlongMeridian),&zero);
+ g->northSouthNumberOfPointsSet = g->westEastNumberOfPointsSet = FALSE;
+
+ MOVE3BYTES(((g->g2)->grid.gaussian.latitudeOfFirstPoint),&ninety);
+ MOVE3BYTES(((g->g2)->grid.gaussian.longitudeOfFirstPoint),&zero);
+ defaultValue = ninety | 0x800000;
+ MOVE3BYTES(((g->g2)->grid.gaussian.latitudeOfLastPoint),&defaultValue);
+ defaultValue = 360000;
+ MOVE3BYTES(((g->g2)->grid.gaussian.longitudeOfLastPoint),&defaultValue);
+ g->northSet = g->southSet = g->westSet = g->eastSet = TRUE;
+
+ defaultValue = 0x80;
+ MOVE1BYTE(((g->g2)->grid.gaussian.resolutionAndComponentsFlag),&defaultValue);
+ MOVE2BYTES(((g->g2)->grid.gaussian.iDirectionIncrement),&zero);
+ MOVE2BYTES(((g->g2)->grid.gaussian.numberOfParallelsBetweenPoleAndEquator),&zero);
+ g->northSouthIncrementSet = g->westEastIncrementSet = FALSE;
+
+ MOVE1BYTE(((g->g2)->grid.gaussian.scanningMode),&zero);
+ MOVE4BYTES(((g->g2)->grid.gaussian.setToZero),&zero);
+
+ defaultValue = ninety | 0x800000;
+ MOVE3BYTES(((g->g2)->grid.gaussian.latitudeOfSouthPole),&defaultValue);
+ MOVE3BYTES(((g->g2)->grid.gaussian.longitudeOfSouthPole),&zero);
+ MOVE4BYTES(((g->g2)->grid.gaussian.angleOfRotationOrStretchingFactor),&zero);
+ MOVE3BYTES(((g->g2)->grid.gaussian.latitudeOfPoleOfStretching),&zero);
+ MOVE3BYTES(((g->g2)->grid.gaussian.longitudeOfPoleOfStretching),&zero);
+ MOVE4BYTES(((g->g2)->grid.gaussian.stretchingFactor),&zero);
+ break;
+
+ default:
+ if( DEBUG1) printf("ISREPRS: data representation type not yet handled\n");
+ break;
+ }
+
+ return 0;
+}
+
+fortint RSREPRS(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) *value;
+ if( DEBUG2) printf("RSREPRS\n");
+ return ISREPRS(grib,&Ivalue);
+}
+
+fortint ISNWLAT(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+fortint Value = *value;
+ if( DEBUG2) printf("ISNWLAT: value = %d\n", Value);
+ if( !generalLatLonGrid(g) ) return 0;
+
+ if( Value < 0 ) Value = 0x800000 | (-Value);
+ MOVE3BYTES(((g->g2)->grid.latlon.latitudeOfFirstPoint),&Value);
+ g->northSet = TRUE;
+ adjustGridAreaDefinition(g,(int)NORTH);
+ return 0;
+}
+
+fortint RSNWLAT(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value * 1000.0);
+ if( DEBUG2) printf("ISNWLAT\n");
+ return ISNWLAT(grib,&Ivalue);
+}
+
+fortint ISNWLON(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+fortint Value = *value;
+ if( DEBUG2) printf("ISNWLON: value = %d\n", Value);
+ if( !generalLatLonGrid(g) ) return 0;
+
+ if( Value < 0 ) Value = 0x800000 | (-Value);
+ MOVE3BYTES(((g->g2)->grid.latlon.longitudeOfFirstPoint),&Value);
+ g->westSet = TRUE;
+ adjustGridAreaDefinition(g,(int)WEST);
+ return 0;
+}
+
+fortint RSNWLON(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value * 1000.0);
+ if( DEBUG2) printf("ISNWLON\n");
+ return ISNWLON(grib,&Ivalue);
+}
+
+fortint ISSELAT(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+fortint Value = *value;
+ if( DEBUG2) printf("ISSELAT: value = %d\n", Value);
+ if( !generalLatLonGrid(g) ) return 0;
+
+ if( Value < 0 ) Value = 0x800000 | (-Value);
+ MOVE3BYTES(((g->g2)->grid.latlon.latitudeOfLastPoint),&Value);
+ g->southSet = TRUE;
+ adjustGridAreaDefinition(g,(int)SOUTH);
+ return 0;
+}
+
+fortint RSSELAT(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value * 1000.0);
+ if( DEBUG2) printf("ISSELAT\n");
+ return ISSELAT(grib,&Ivalue);
+}
+
+fortint ISSELON(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+fortint Value = *value;
+ if( DEBUG2) printf("ISSELON: value = %d\n", Value);
+ if( !generalLatLonGrid(g) ) return 0;
+
+ if( Value < 0 ) Value = 0x800000 | (-Value);
+ MOVE3BYTES(((g->g2)->grid.latlon.longitudeOfLastPoint),&Value);
+ g->eastSet = TRUE;
+ adjustGridAreaDefinition(g,(int)EAST);
+ return 0;
+}
+
+fortint RSSELON(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value * 1000.0);
+ if( DEBUG2) printf("ISSELON\n");
+ return ISSELON(grib,&Ivalue);
+}
+
+fortint ISDI(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+ if( DEBUG2) printf("ISDI: value = %d\n", *value);
+ if( !generalLatLonGrid(g) ) return 0;
+
+ MOVE2BYTES(((g->g2)->grid.latlon.iDirectionIncrement), value);
+ g->westEastIncrementSet = TRUE;
+ adjustGridAreaDefinition(g,(int)W_E_INC);
+ return 0;
+}
+
+fortint RSDI(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value * 1000.0);
+ if( DEBUG2) printf("RSDI\n");
+ return ISDI(grib,&Ivalue);
+}
+
+fortint ISDJ(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+ if( DEBUG2) printf("ISDJ: value = %d\n", *value);
+ if( !generalLatLonGrid(g) ) return 0;
+
+ MOVE2BYTES(((g->g2)->grid.latlon.jDirectionIncrement), value);
+ g->northSouthIncrementSet = TRUE;
+ adjustGridAreaDefinition(g,(int)N_S_INC);
+ return 0;
+}
+
+fortint RSDJ(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value * 1000.0);
+ if( DEBUG2) printf("RSDJ\n");
+ return ISDJ(grib,&Ivalue);
+}
+
+fortint ISDIJ(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+ if( DEBUG2) printf("ISDIJ: value = %d\n", *value);
+ if( !generalLatLonGrid(g) ) return 0;
+
+ ISDI(grib,value);
+ ISDJ(grib,value);
+ return 0;
+}
+
+fortint RSDIJ(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value * 1000.0);
+ if( DEBUG2) printf("RSDIJ\n");
+ return ISDIJ(grib,&Ivalue);
+}
+
+fortint ISNJ(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+ if( DEBUG2) printf("ISNJ: value = %d\n", *value);
+ if( !generalLatLonGrid(g) ) return 0;
+
+ MOVE2BYTES(((g->g2)->grid.latlon.numberOfPointsAlongMeridian), value);
+ g->northSouthNumberOfPointsSet = TRUE;
+ adjustGridAreaDefinition(g,(int)N_S_PTS);
+ return 0;
+}
+
+fortint RSNJ(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value);
+ if( DEBUG2) printf("ISNJ\n");
+ return ISNJ(grib,&Ivalue);
+}
+
+fortint ISNI(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+ if( DEBUG2) printf("ISNI: value = %d\n", *value);
+ if( !generalLatLonGrid(g) ) return 0;
+
+ MOVE2BYTES(((g->g2)->grid.latlon.numberOfPointsAlongParallel), value);
+ g->westEastNumberOfPointsSet = TRUE;
+ adjustGridAreaDefinition(g,(int)W_E_PTS);
+ return 0;
+}
+
+fortint RSNI(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value);
+ if( DEBUG2) printf("ISNI\n");
+ return ISNI(grib,&Ivalue);
+}
+
+fortint ISJ(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+fortint truncation = *value;
+
+ if( DEBUG2) printf("ISJ value = %d\n", truncation);
+ if( anySpectralField(g) ) {
+ MOVE2BYTES(((g->g2)->grid.spectral.J),value);
+ g->numberOfValues = (truncation+1) * (truncation+2);
+ }
+ return 0;
+}
+
+fortint RSJ(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value);
+ if( DEBUG2) printf("RSJ value = %f\n", *value);
+ return ISJ(grib,&Ivalue);
+}
+
+fortint ISK(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+ if( DEBUG2) printf("ISK value = %d\n", *value);
+ if( anySpectralField(g) ) MOVE2BYTES(((g->g2)->grid.spectral.K),value);
+ return 0;
+}
+
+fortint RSK(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value);
+ if( DEBUG2) printf("RSK value = %f\n", *value);
+ return ISK(grib,&Ivalue);
+}
+
+fortint ISM(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+ if( DEBUG2) printf("ISM value = %d\n", *value);
+ if( anySpectralField(g) ) MOVE2BYTES(((g->g2)->grid.spectral.M),value);
+ return 0;
+}
+
+fortint RSM(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value);
+ if( DEBUG2) printf("RSM value = %f\n", *value);
+ return ISM(grib,&Ivalue);
+}
+
+fortint ISJKM(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+ if( DEBUG2) printf("ISJKM value = %d\n", *value);
+ ISJ(grib,value);
+ ISK(grib,value);
+ ISM(grib,value);
+ return 0;
+}
+
+fortint RSJKM(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value);
+ if( DEBUG2) printf("RSJKM value = %f\n", *value);
+ return ISJKM(grib,&Ivalue);
+}
+
+fortint ISTJ(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+ if( DEBUG2) printf("ISTJ value = %d\n", *value);
+ if( anyComplexPackedSpectralField(g) )
+ MOVE1BYTE(((g->g4)->data.complexSpectral.J),value);
+ return 0;
+}
+
+fortint RSTJ(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value);
+ if( DEBUG2) printf("RSTJ value = %f\n", *value);
+ return ISTJ(grib,&Ivalue);
+}
+
+fortint ISTK(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+ if( DEBUG2) printf("ISTK value = %d\n", *value);
+ if( anyComplexPackedSpectralField(g) )
+ MOVE1BYTE(((g->g4)->data.complexSpectral.K),value);
+ return 0;
+}
+
+fortint RSTK(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value);
+ if( DEBUG2) printf("RSTK value = %f\n", *value);
+ return ISTK(grib,&Ivalue);
+}
+
+fortint ISTM(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+ if( DEBUG2) printf("ISTM value = %d\n", *value);
+ if( anyComplexPackedSpectralField(g) )
+ MOVE1BYTE(((g->g4)->data.complexSpectral.M),value);
+ return 0;
+}
+
+fortint RSTM(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value);
+ if( DEBUG2) printf("RSTM value = %f\n", *value);
+ return ISTM(grib,&Ivalue);
+}
+
+fortint ISTJKM(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+ if( DEBUG2) printf("ISTJKM value = %d\n", *value);
+ ISTJ(grib,value);
+ ISTK(grib,value);
+ ISTM(grib,value);
+ return 0;
+}
+
+fortint RSTJKM(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value);
+ if( DEBUG2) printf("RSTJKM value = %f\n", *value);
+ return ISTJKM(grib,&Ivalue);
+}
+
+fortint ISLATRP(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+fortint Value = *value;
+ if( DEBUG2) printf("ISLATRP: value = %d\n", Value);
+ if( !generalRotatedGrid(g) ) return 0;
+
+ if( Value < 0 ) Value = 0x800000 | (-Value);
+ MOVE3BYTES(((g->g2)->grid.latlon.latitudeOfSouthPole),&Value);
+ return 0;
+}
+
+fortint RSLATRP(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value * 1000.0);
+ if( DEBUG2) printf("RSLATRP\n");
+ return ISLATRP(grib,&Ivalue);
+}
+
+fortint ISLONRP(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+fortint Value = *value;
+ if( DEBUG2) printf("ISLONRP: value = %d\n", Value);
+ if( !generalRotatedGrid(g) ) return 0;
+
+ if( Value < 0 ) Value = 0x800000 | (-Value);
+ MOVE3BYTES(((g->g2)->grid.latlon.longitudeOfSouthPole),&Value);
+ return 0;
+}
+
+fortint RSLONRP(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value * 1000.0);
+ if( DEBUG2) printf("RSLONRP\n");
+ return ISLONRP(grib,&Ivalue);
+}
+
+fortint RSROTAT(gribProduct ** grib, fortdouble * value) {
+gribProduct * g = *grib;
+fortint valueExponent, valueMantissa, numberOfBitsPerInteger;
+fortint status;
+
+ if( DEBUG2) printf("RSROTAT: value = %f\n", *value);
+ if( !generalRotatedGrid(g) ) return 0;
+
+ numberOfBitsPerInteger = sizeof(fortint) * 8;
+ status = REF2GRB(value,&valueExponent,
+ &valueMantissa,&numberOfBitsPerInteger);
+ if( status ) {
+ printf("RSROTAT: call to REF2GRB failed\n");
+ exit(1);
+ }
+ MOVE1BYTE(((g->g2)->grid.latlon.angleOfRotationOrStretchingFactor),&valueExponent);
+ MOVE3BYTES((((g->g2)->grid.latlon.angleOfRotationOrStretchingFactor)+1),&valueMantissa);
+ return 0;
+}
+
+fortint ISROTAT(gribProduct ** grib, fortint * value) {
+fortdouble Value = ((fortdouble) *value) / 1000.0;
+ if( DEBUG2) printf("ISROTAT: value = %d\n", *value);
+ return RSROTAT(grib,&Value);
+}
+
+fortint ISLATSP(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+fortint Value = *value;
+ if( DEBUG2) printf("ISLATSP: value = %d\n", Value);
+ if( !generalStretchedGrid(g) ) return 0;
+
+ if( Value < 0 ) Value = 0x800000 | (-Value);
+
+ if( generalStretchedAndRotatedGrid(g) )
+ MOVE3BYTES(((g->g2)->grid.latlon.latitudeOfPoleOfStretching),&Value);
+ else
+ MOVE3BYTES(((g->g2)->grid.latlon.latitudeOfSouthPole),&Value);
+
+ return 0;
+}
+
+fortint RSLATSP(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value * 1000.0);
+ if( DEBUG2) printf("RSLATSP\n");
+ return ISLATSP(grib,&Ivalue);
+}
+
+fortint ISLONSP(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+fortint Value = *value;
+ if( DEBUG2) printf("ISLONSP: value = %d\n", Value);
+ if( !generalStretchedGrid(g) ) return 0;
+
+ if( Value < 0 ) Value = 0x800000 | (-Value);
+
+ if( generalStretchedAndRotatedGrid(g) )
+ MOVE3BYTES(((g->g2)->grid.latlon.longitudeOfPoleOfStretching),&Value);
+ else
+ MOVE3BYTES(((g->g2)->grid.latlon.longitudeOfSouthPole),&Value);
+
+ return 0;
+}
+
+fortint RSLONSP(gribProduct ** grib, fortdouble * value) {
+fortint Ivalue = (fortint) (*value * 1000.0);
+ if( DEBUG2) printf("RSLONSP\n");
+ return ISLONSP(grib,&Ivalue);
+}
+
+fortint RSSFACT(gribProduct ** grib, fortdouble * value) {
+gribProduct * g = *grib;
+fortint valueExponent, valueMantissa, numberOfBitsPerInteger;
+fortint status;
+
+ if( DEBUG2) printf("RSSFACT: value = %f\n", *value);
+ if( !generalStretchedGrid(g) ) return 0;
+
+ numberOfBitsPerInteger = sizeof(fortint) * 8;
+ status = REF2GRB(value,&valueExponent,
+ &valueMantissa,&numberOfBitsPerInteger);
+ if( status ) {
+ printf("RSSFACT: call to REF2GRB failed\n");
+ exit(1);
+ }
+
+ if( generalStretchedAndRotatedGrid(g) ) {
+ MOVE1BYTE(((g->g2)->grid.latlon.stretchingFactor),&valueExponent);
+ MOVE3BYTES((((g->g2)->grid.latlon.stretchingFactor)+1),&valueMantissa);
+ }
+ else {
+ MOVE1BYTE(((g->g2)->grid.latlon.angleOfRotationOrStretchingFactor),&valueExponent);
+ MOVE3BYTES((((g->g2)->grid.latlon.angleOfRotationOrStretchingFactor)+1),&valueMantissa);
+ }
+ return 0;
+}
+
+fortint ISSFACT(gribProduct ** grib, fortint * value) {
+fortdouble Value = ((fortdouble) *value) / 1000.0;
+ if( DEBUG2) printf("ISSFACT: value = %d\n", *value);
+ return RSSFACT(grib,&Value);
+}
+
+fortint ISSETQG(gribProduct ** grib, fortint * value) {
+gribProduct * g = *grib;
+fortint northToSouth;
+fortint number = (*value), missing = 0xffff, zero = 0;
+fortdouble * gaussianLatitudes;
+fortint * countOfPointsAtLatitudes;
+fortint total, loop, status, one = 1, coordinate;
+unsigned char htype[2] = "R";
+fortdouble lastLongitude;
+gribSection2 * newSection2;
+fortint newSection2Size, listOffset, count;
+unsigned char * p;
+
+ if( DEBUG2) printf("ISSETQG: reduced gaussian number = %d\n", *value);
+
+ if( !anyGaussianGrid(g) ) return 0;
+/*
+//if( number == g2_gaussNumber(g) ) return 0;
+*/
+
+ MOVE2BYTES(((g->g2)->grid.gaussian.numberOfPointsAlongParallel),&missing);
+ northToSouth = number * 2;
+ MOVE2BYTES(((g->g2)->grid.gaussian.numberOfPointsAlongMeridian),&northToSouth);
+
+ MOVE3BYTES(((g->g2)->grid.gaussian.longitudeOfFirstPoint),&zero);
+
+ MOVE1BYTE(((g->g2)->grid.gaussian.resolutionAndComponentsFlag),&zero);
+
+ MOVE2BYTES(((g->g2)->grid.gaussian.iDirectionIncrement),&missing);
+ MOVE2BYTES(((g->g2)->grid.gaussian.numberOfParallelsBetweenPoleAndEquator),
+ &number);
+ MOVE1BYTE(((g->g2)->grid.gaussian.scanningMode),&zero);
+
+ MOVE4BYTES(((g->g2)->grid.gaussian.setToZero),&zero);
+ MOVE3BYTES(((g->g2)->grid.gaussian.latitudeOfSouthPole),&zero);
+ MOVE3BYTES(((g->g2)->grid.gaussian.longitudeOfSouthPole),&zero);
+ MOVE4BYTES(((g->g2)->grid.gaussian.angleOfRotationOrStretchingFactor),&zero);
+ MOVE3BYTES(((g->g2)->grid.gaussian.latitudeOfPoleOfStretching),&zero);
+ MOVE3BYTES(((g->g2)->grid.gaussian.longitudeOfPoleOfStretching),&zero);
+ MOVE4BYTES(((g->g2)->grid.gaussian.stretchingFactor),&zero);
+
+ gaussianLatitudes =
+ (fortdouble *) allocateMemory(northToSouth*sizeof(fortdouble));
+ countOfPointsAtLatitudes =
+ (fortint *) allocateMemory(northToSouth*sizeof(fortint));
+ JGETGG(&number,htype,gaussianLatitudes,countOfPointsAtLatitudes,&status,
+ (long)one);
+ if( status ) {
+ printf("ISSETQG: JGETGG failed for gaussian number %d\n",number);
+ exit(1);
+ }
+
+ coordinate = (fortint) ((0.0005 + gaussianLatitudes[0])*1000.0);
+ MOVE3BYTES(((g->g2)->grid.gaussian.latitudeOfFirstPoint),&coordinate);
+
+ coordinate = 0x800000 | coordinate;
+ MOVE3BYTES(((g->g2)->grid.gaussian.latitudeOfLastPoint),&coordinate);
+
+ freeMemory(gaussianLatitudes);
+
+ lastLongitude = 360.0 - (360/(fortdouble)countOfPointsAtLatitudes[number-1]);
+ coordinate = (fortint) (lastLongitude * 1000.0);
+ if( coordinate < 0 ) coordinate = 0x800000 | (-coordinate);
+ MOVE3BYTES(((g->g2)->grid.gaussian.longitudeOfLastPoint),&coordinate);
+
+ switch( (int) g2_datatype(g) ) {
+
+ case 4:
+ listOffset = 32;
+ break;
+
+ case 14:
+ case 24:
+ listOffset = 42;
+ break;
+
+ case 34:
+ listOffset = 52;
+ break;
+
+ default:
+ printf("ISSETQG: unexpected gaussian representation type = %d\n",
+ g2_datatype(g));
+ exit(1);
+ }
+ listOffset += g2_NV(g) * 4;
+
+ newSection2Size = listOffset + (northToSouth * 2);
+ newSection2 = (gribSection2 *) allocateMemory(newSection2Size);
+ memcpy(newSection2,(g->g2),sizeof(gribSection2));
+
+ total = 0;
+ p = (unsigned char *) newSection2;
+ p += listOffset;
+ for(loop=0;loop<northToSouth;loop++) {
+ count = countOfPointsAtLatitudes[loop];
+ total += count;
+ MOVE2BYTES(p,&count);
+ p +=2;
+ }
+ g->numberOfValues = total;
+ freeMemory((g->g2));
+ g->g2 = newSection2;
+
+ MOVE3BYTES(((g->g2)->sectionLength),&newSection2Size);
+ listOffset++;
+ MOVE1BYTE(((g->g2)->PV_PL),&listOffset);
+
+ return 0;
+}
+
+fortint RSSETQG(gribProduct ** grib, fortdouble * value) {
+fortint Value = (fortint) *value;
+ if( DEBUG2) printf("RSSETQG\n");
+ return ISSETQG(grib,&Value);;
+}
+
+fortint ISSETRG(gribProduct ** grib, fortint * value) {
+ if( DEBUG2) printf("ISSETRG: regular gaussian number = %d\n", *value);
+ return 0;
+}
+
+fortint RSSETRG(gribProduct ** grib, fortdouble * value) {
+ if( DEBUG2) printf("RSSETRG\n");
+ return 0;
+}
+
+fortint ISDUMMY(gribProduct ** grib, fortint * value) {
+ if( DEBUG2) printf("ISDUMMY\n");
+ return 0;
+}
+
+fortint RSDUMMY(gribProduct ** grib, fortdouble * value) {
+ if( DEBUG2) printf("RSDUMMY\n");
+ return 0;
+}
+
+fortint SVALUES(
+ gribProduct ** grib,
+ fortdouble * arrayOfUnpackedValues,
+ fortint * arraySize,
+ fortdouble * userSuppliedMissingValue ) {
+gribProduct * g = *grib;
+fortint loop, startValue, lengthOfSection3;
+fortint N, numberOfUnpackedValues, nextNonMissingValue = 0;
+fortint numberOfValues, numberOfMissingValues = 0;
+fortdouble missingValue = *userSuppliedMissingValue;
+fortdouble value, maximum, minimum, truncation;
+unsigned char * bitmap, * section3;
+
+ if( DEBUG1 ) printf("SVALUES\n");
+/*
+// Calculate the number of points from the GRIB headers
+*/
+ numberOfUnpackedValues = g->numberOfValues;
+ if( DEBUG1 )
+ printf("SVALUES: numberOfUnpackedValues = %d\n",numberOfUnpackedValues);
+
+ if( numberOfUnpackedValues <= 0 ) {
+ printf("SVALUES: grib headers not sufficiently configured for packing\n");
+ return -1;
+ }
+
+ if( numberOfUnpackedValues > *arraySize ) {
+ printf(
+ "SVALUES: calculated number of values (%d) greater than array size(%d)\n",
+ numberOfUnpackedValues, *arraySize);
+ return -1;
+ }
+
+ N = numberOfUnpackedValues;
+/*
+// For gridpoint fields, it may be necessary to create a bitmap if
+// there are missing data values
+*/
+ if( !anySpectralField(g) ) {
+ if( DEBUG1 ) printf("SVALUES: gridpoint field\n");
+ lengthOfSection3 = (6+(N+7)/8);
+ if( MOD(lengthOfSection3,2) == 1 ) lengthOfSection3++;
+ section3 = (unsigned char *) allocateMemory(lengthOfSection3);
+ bitmap = section3 + 6;
+ for( loop = 0; loop < (N+7)/8; loop++) bitmap[loop] = 0;
+
+ maximum = minimum = arrayOfUnpackedValues[0];
+ for( loop = 0; loop < N; loop++) {
+ value = arrayOfUnpackedValues[loop];
+ if( value == missingValue ) {
+ numberOfMissingValues++;
+ }
+ else {
+ setBitMap(bitmap,loop);
+ if( (value < minimum) || (minimum == missingValue) ) {
+ minimum = value;
+ }
+ if( (value > maximum) || (maximum == missingValue) ) {
+ maximum = value;
+ }
+ }
+ }
+/*
+// Create section 3 if there is a bitmap
+*/
+ if( numberOfMissingValues > 0 ) {
+ fortint numberOfUnusedBits = (lengthOfSection3-6)*8 - N;
+ fortint zero = 0;
+
+ if( DEBUG1 ) printf("SVALUES: create section 3 bitmap\n");
+
+ g->bitmapped = 1;
+ freeMemory(g->g3);
+ g->g3 = (gribSection3 *) section3;
+ MOVE3BYTES((g->g3)->sectionLength,&lengthOfSection3);
+ MOVE1BYTE((g->g3)->numberOfUnusedBits,&numberOfUnusedBits);
+ MOVE2BYTES((g->g3)->tableReference,&zero);
+ *((g->g1)->section2and3PresentFlag) |= 0x40;
+/*
+// Repack the input array, leaving out the missing data
+*/
+ nextNonMissingValue = 0;
+ for( loop = 0; loop < N; loop++) {
+ if( arrayOfUnpackedValues[loop] != missingValue )
+ arrayOfUnpackedValues[nextNonMissingValue++] =
+ arrayOfUnpackedValues[loop];
+ }
+ }
+ else {
+ g->bitmapped = 0;
+ *((g->g1)->section2and3PresentFlag) &= 0xbf;
+ freeMemory(section3);
+ }
+ numberOfValues = N - numberOfMissingValues;
+
+ if( simplePacking(g) ) {
+ fortint estimatedSizeOfSection4;
+ unsigned char * section4;
+ fortint status, lengthOfSection4, numberOfUnusedBits;
+ fortint referenceValueExponent, referenceValueMantissa;
+ fortint numberOfBitsPerPackedValue, numberOfBitsPerInteger;
+ fortint firstCoefficientExponent, firstCoefficientMantissa;
+ fortint integerScale = 0;
+ fortdouble range = maximum - minimum;
+ fortdouble realScale = 1.0;
+ fortint numberOfValuesToScale, startOfPackedValueBits;
+ fortint * arrayOfScaledValues;
+
+ if( DEBUG1 ) printf("SVALUES: gridpoint field with simple packing\n");
+
+ estimatedSizeOfSection4 = 512+(N*sizeof(fortint)*8+7)/8;
+ section4 = (unsigned char *) allocateMemory(estimatedSizeOfSection4);
+
+
+ numberOfBitsPerPackedValue = g4_bits(g);
+ numberOfBitsPerInteger = sizeof(fortint) * 8;
+ if( numberOfBitsPerPackedValue == numberOfBitsPerInteger)
+ numberOfBitsPerPackedValue--;
+
+ if( PRACTICALLYZERO(range) )
+ integerScale = 0;
+ else
+ if( (minimum != 0) && PRACTICALLYZERO(range/minimum) ){
+ integerScale = 0;
+ }
+ else
+ if( PRACTICALLYZERO(range-1.0) )
+ integerScale = 1 - numberOfBitsPerPackedValue;
+ else
+ if( range > 1.0 ) {
+ for( loop = 1; loop < 128; loop++ ) {
+ realScale *= 2.0;
+ if( realScale > (range + SMALL) ) {
+ integerScale = loop - numberOfBitsPerPackedValue;
+ break;
+ }
+ }
+ }
+ else {
+ for( loop = 1; loop < 127; loop++ ) {
+ realScale /= 2.0;
+ if( realScale < (range - SMALL) ) {
+ integerScale = 1 - loop - numberOfBitsPerPackedValue;
+ break;
+ }
+ }
+ }
+
+ realScale = (fortdouble) pow((double)2.0,(double)integerScale);
+ if( integerScale < 0 ) integerScale = 0x8000 | (-integerScale);
+ MOVE2BYTES((section4+4),&integerScale);
+
+ status = REF2GRB(&minimum,&referenceValueExponent,
+ &referenceValueMantissa,&numberOfBitsPerInteger);
+ if( status ) {
+ printf("SVALUES: call to REF2GRB failed\n");
+ return -1;
+ }
+ MOVE1BYTE((section4+6),&referenceValueExponent);
+ MOVE3BYTES((section4+7),&referenceValueMantissa);
+
+ MOVE1BYTE((section4+10),&numberOfBitsPerPackedValue);
+
+ status = REF2GRB(&arrayOfUnpackedValues[0],&firstCoefficientExponent,
+ &firstCoefficientMantissa,&numberOfBitsPerInteger);
+ if( status ) {
+ printf("SVALUES: call to REF2GRB failed\n");
+ return -1;
+ }
+ MOVE1BYTE((section4+11),&firstCoefficientExponent);
+ MOVE3BYTES((section4+12),&firstCoefficientMantissa);
+
+ numberOfValuesToScale = numberOfValues;
+ arrayOfScaledValues =
+ (fortint *) allocateMemory(numberOfValuesToScale*sizeof(fortint));
+
+ INSCAL(&arrayOfUnpackedValues[0],arrayOfScaledValues,
+ &numberOfValuesToScale,&minimum,&realScale,
+ &numberOfBitsPerPackedValue);
+
+ startOfPackedValueBits = 88;
+ lengthOfSection4 = estimatedSizeOfSection4/sizeof(fortint);
+ INXBIT((fortint*)section4,&lengthOfSection4,
+ &startOfPackedValueBits,arrayOfScaledValues,
+ &numberOfValuesToScale,&numberOfBitsPerInteger,
+ &numberOfBitsPerPackedValue,"C",&status,(long)1);
+ if( status ) {
+ printf("SVALUES: call to INXBIT failed\n");
+ return -1;
+ }
+ freeMemory(arrayOfScaledValues);
+
+ lengthOfSection4 = (startOfPackedValueBits + 7)/8;
+ if( MOD(lengthOfSection4,2) == 1 ) lengthOfSection4++;
+ MOVE3BYTES(section4,&lengthOfSection4);
+
+ numberOfUnusedBits = lengthOfSection4*8 - startOfPackedValueBits;
+ if( !floatingPoint(g) ) numberOfUnusedBits |= 0x20;
+ MOVE1BYTE((section4+3),&numberOfUnusedBits);
+
+ freeMemory(g->g4);
+ g->g4 = (gribSection4 *) section4;
+ }
+ else {
+printf("Second order packing not yet handled!\n");
+ return -1;
+ }
+ return 0;
+ }
+
+/*
+// Spherical harmonics
+*/
+ if( anySpectralField(g) && floatingPoint(g) ) {
+ fortint estimatedSizeOfSection4;
+ unsigned char * section4;
+
+ estimatedSizeOfSection4 = 512+(N*sizeof(fortint)*8+7)/8;
+ section4 = (unsigned char *) allocateMemory(estimatedSizeOfSection4);
+
+ if( simplePacking(g) )
+ startValue = 1;
+ else
+ startValue = 0;
+ maximum = minimum = arrayOfUnpackedValues[startValue];
+ for( loop = startValue; loop < N; loop++) {
+ value = arrayOfUnpackedValues[loop];
+ if( (value < minimum) || (minimum == missingValue) ) {
+ minimum = value;
+ }
+ if( (value > maximum) || (maximum == missingValue) ) {
+ maximum = value;
+ }
+ }
+
+/*
+// If complex packing required, use GRIBEX routines GRSMKP and CSECT4
+*/
+ if( !simplePacking(g) ) {
+ fortint * ksec1, * ksec4;
+ fortint ktrunc, kleng, knspt, status, adjustment;
+ fortint numberOfBitsPerInteger, numberOfBitsPerPackedValue;
+
+ if( DEBUG1 ) printf("SVALUES: spectral field with complex packing\n");
+
+ ksec1 = (fortint *) allocateMemory(1024*sizeof(fortint));
+ for( loop = 0; loop < 1024; loop++) ksec1[loop] = 0;
+
+ ksec4 = (fortint *) allocateMemory(512*sizeof(fortint));
+ for( loop = 0; loop < 512; loop++) ksec4[loop] = 0;
+
+ ksec1[22] = g1_scale(g);
+
+ ksec4[ 1] = g4_bits(g);
+ ksec4[16] = g4_ip(g);
+ ksec4[17] = g4_j(g);
+ ksec4[18] = g4_k(g);
+ ksec4[19] = g4_m(g);
+
+ ktrunc = g2_J(g);
+ kleng = (estimatedSizeOfSection4+sizeof(fortint)-1)/sizeof(fortint);
+ knspt = 0;
+ numberOfBitsPerInteger = sizeof(fortint) * 8;
+ numberOfBitsPerPackedValue = g4_bits(g);
+
+ {
+ fortint forceComputation = 1;
+ GRSMKP(&forceComputation);
+ }
+ status = CSECT4(arrayOfUnpackedValues,&ktrunc,ksec1,ksec4,
+ (fortint *)section4,&kleng,&knspt,
+ &numberOfBitsPerInteger,&numberOfBitsPerPackedValue);
+ if( status ) {
+ printf("SVALUES: call to CSECT4 failed\n");
+ return -1;
+ }
+/*
+// NB. Adjust the octet number at which first-order packed data begins
+// to be consistent with an ECMWF bug.
+*/
+ adjustment = TWOBYTEINT(section4+11);
+ adjustment += 8 + g1_length(g) + g2_length(g);
+ MOVE2BYTES((section4+11),&adjustment);
+
+ freeMemory(g->g4);
+ g->g4 = (gribSection4 *) section4;
+ }
+/*
+// Simple packing required
+*/
+ else {
+ fortint status, lengthOfSection4, numberOfUnusedBits;
+ fortint referenceValueExponent, referenceValueMantissa;
+ fortint numberOfBitsPerPackedValue, numberOfBitsPerInteger;
+ fortint firstCoefficientExponent, firstCoefficientMantissa;
+ fortint integerScale = 0;
+ fortdouble range = maximum - minimum;
+ fortdouble realScale = 1.0;
+ fortint numberOfValuesToScale, startOfPackedValueBits;
+ fortint * arrayOfScaledValues;
+
+ if( DEBUG1 ) printf("SVALUES: spectral field with simple packing\n");
+
+ numberOfBitsPerPackedValue = g4_bits(g);
+ numberOfBitsPerInteger = sizeof(fortint) * 8;
+ if( numberOfBitsPerPackedValue == numberOfBitsPerInteger)
+ numberOfBitsPerPackedValue--;
+
+ if( PRACTICALLYZERO(range) )
+ integerScale = 0;
+ else
+ if( (minimum != 0) && PRACTICALLYZERO(range/minimum) )
+ integerScale = 0;
+ else
+ if( PRACTICALLYZERO(range-1.0) )
+ integerScale = 1 - numberOfBitsPerPackedValue;
+ else
+ if( range > 1.0 ) {
+ for( loop = 1; loop < 128; loop++ ) {
+ realScale *= 2.0;
+ if( realScale > (range + SMALL) ) {
+ integerScale = loop - numberOfBitsPerPackedValue;
+ break;
+ }
+ }
+ }
+ else {
+ for( loop = 1; loop < 127; loop++ ) {
+ realScale /= 2.0;
+ if( realScale < (range - SMALL) ) {
+ integerScale = 1 - loop - numberOfBitsPerPackedValue;
+ break;
+ }
+ }
+ }
+
+ realScale = (fortdouble) pow((double)2.0,(double)integerScale);
+ if( integerScale < 0 ) integerScale = 0x8000 | (-integerScale);
+ MOVE2BYTES((section4+4),&integerScale);
+
+ status = REF2GRB(&minimum,&referenceValueExponent,
+ &referenceValueMantissa,&numberOfBitsPerInteger);
+ if( status ) {
+ printf("SVALUES: call to REF2GRB failed\n");
+ return -1;
+ }
+ MOVE1BYTE((section4+6),&referenceValueExponent);
+ MOVE3BYTES((section4+7),&referenceValueMantissa);
+
+ MOVE1BYTE((section4+10),&numberOfBitsPerPackedValue);
+
+ status = REF2GRB(&arrayOfUnpackedValues[0],&firstCoefficientExponent,
+ &firstCoefficientMantissa,&numberOfBitsPerInteger);
+ if( status ) {
+ printf("SVALUES: call to REF2GRB failed\n");
+ return -1;
+ }
+ MOVE1BYTE((section4+11),&firstCoefficientExponent);
+ MOVE3BYTES((section4+12),&firstCoefficientMantissa);
+
+ numberOfValuesToScale = N - 1;
+ arrayOfScaledValues =
+ (fortint *) allocateMemory(numberOfValuesToScale*sizeof(fortint));
+
+ INSCAL(&arrayOfUnpackedValues[1],arrayOfScaledValues,
+ &numberOfValuesToScale,&minimum,&realScale,
+ &numberOfBitsPerPackedValue);
+
+ startOfPackedValueBits = 120;
+ lengthOfSection4 = estimatedSizeOfSection4/sizeof(fortint);
+ INXBIT((fortint*)section4,&lengthOfSection4,
+ &startOfPackedValueBits,arrayOfScaledValues,
+ &numberOfValuesToScale,&numberOfBitsPerInteger,
+ &numberOfBitsPerPackedValue,"C",&status,(long)1);
+ if( status ) {
+ printf("SVALUES: call to INXBIT failed\n");
+ return -1;
+ }
+ freeMemory(arrayOfScaledValues);
+
+ lengthOfSection4 = (startOfPackedValueBits + 7)/8;
+ if( MOD(lengthOfSection4,2) == 1 ) lengthOfSection4++;
+ MOVE3BYTES(section4,&lengthOfSection4);
+
+ numberOfUnusedBits = lengthOfSection4*8 - startOfPackedValueBits;
+ numberOfUnusedBits |= 0x80;
+ MOVE1BYTE((section4+3),&numberOfUnusedBits);
+
+ freeMemory(g->g4);
+ g->g4 = (gribSection4 *) section4;
+ }
+ }
+ else {
+ if( DEBUG1 ) printf("SVALUES: gridpoint field\n");
+ }
+ return 0;
+}
+
+void setBitMap(unsigned char * bitmap, fortint bitNumber ) {
+fortint byteOffset = (bitNumber>>3);
+fortint bitOffset = bitNumber - (byteOffset<<3);
+
+ bitmap[byteOffset] |= (0x80>>bitOffset);
+}
+
+void adjustGridAreaDefinition(gribProduct* g, int type) {
+fortdouble north, south, west, east, increment;
+fortint value, numberOfPoints ;
+
+ switch( type) {
+
+ case NORTH:
+ if( DEBUG2 ) printf("adjustGridAreaDefinition: new north given\n");
+ north = RGNWLAT(&g);
+ if( g->southSet ) {
+ south = RGSELAT(&g);
+ if( g->northSouthIncrementSet ) {
+ increment = RGDJ(&g);
+ numberOfPoints = (fortint) (0.5 + (north-south)/increment) + 1;
+ MOVE2BYTES(((g->g2)->grid.latlon.numberOfPointsAlongMeridian),
+ &numberOfPoints);
+ g->northSouthNumberOfPointsSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: numberOfPoints set = %d\n",
+ numberOfPoints);
+ }
+ else if( g->northSouthNumberOfPointsSet ) {
+ numberOfPoints = IGNJ(&g) - 1;
+ increment = (north-south)/(fortdouble) numberOfPoints;
+ value = (fortint) (increment * 1000.0);
+ MOVE2BYTES(((g->g2)->grid.latlon.jDirectionIncrement),&value);
+ g->northSouthIncrementSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: north-south increment set = %f\n",
+ increment);
+ }
+ }
+ else {
+ if( g->northSouthIncrementSet && g->northSouthNumberOfPointsSet ) {
+ increment = RGDJ(&g);
+ numberOfPoints = IGNJ(&g) - 1;
+ south = north - increment * (fortdouble) numberOfPoints;
+ value = (fortint) (south * 1000.0);
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(((g->g2)->grid.latlon.latitudeOfLastPoint),&value);
+ g->southSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: south set = %f\n", south);
+ }
+ }
+ break;
+
+ case SOUTH:
+ if( DEBUG2 ) printf("adjustGridAreaDefinition: new south given\n");
+ south = RGSELAT(&g);
+ if( g->northSet ) {
+ north = RGNWLAT(&g);
+ if( g->northSouthIncrementSet ) {
+ increment = RGDJ(&g);
+ numberOfPoints = (fortint) (0.5 + (north-south)/increment) + 1;
+ MOVE2BYTES(((g->g2)->grid.latlon.numberOfPointsAlongMeridian),
+ &numberOfPoints);
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: numberOfPoints set = %d\n",
+ numberOfPoints);
+ }
+ else if( g->northSouthNumberOfPointsSet ) {
+ numberOfPoints = IGNJ(&g) - 1;
+ increment = (north-south)/(fortdouble) numberOfPoints;
+ value = (fortint) (increment * 1000.0);
+ MOVE2BYTES(((g->g2)->grid.latlon.jDirectionIncrement),&value);
+ g->northSouthIncrementSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: north-south increment set = %f\n",
+ increment);
+ }
+ }
+ else {
+ if( g->northSouthIncrementSet && g->northSouthNumberOfPointsSet ) {
+ increment = RGDJ(&g);
+ numberOfPoints = IGNJ(&g) - 1;
+ north = south + increment * (fortdouble) numberOfPoints;
+ value = (fortint) (north * 1000.0);
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(((g->g2)->grid.latlon.latitudeOfFirstPoint),&value);
+ g->northSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: north set = %f\n", north);
+ }
+ }
+ break;
+
+ case WEST:
+ if( DEBUG2 ) printf("adjustGridAreaDefinition: new west given\n");
+ west = RGNWLON(&g);
+ if( g->eastSet ) {
+ east = RGSELON(&g);
+ if( g->westEastIncrementSet ) {
+ increment = RGDI(&g);
+ if( ALMOSTZERO(east - west - 360.0) )
+ numberOfPoints = (fortint) (0.5 + (east-west)/increment);
+ else
+ numberOfPoints = (fortint) (0.5 + (east-west)/increment) + 1;
+ MOVE2BYTES(((g->g2)->grid.latlon.numberOfPointsAlongParallel),
+ &numberOfPoints);
+ g->westEastNumberOfPointsSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: numberOfPoints set = %d\n",
+ numberOfPoints);
+ }
+ else if( g->westEastNumberOfPointsSet ) {
+ numberOfPoints = IGNI(&g) - 1;
+/*
+// Test for longitude wraparound
+*/
+ if( ALMOSTZERO(east - west - 360.0) ) numberOfPoints++;
+ increment = (east-west)/(fortdouble) numberOfPoints;
+ value = (fortint) (increment * 1000.0);
+ MOVE2BYTES(((g->g2)->grid.latlon.iDirectionIncrement),&value);
+ g->westEastIncrementSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: west-east increment set = %f\n",
+ increment);
+ }
+ }
+ else {
+ if( g->westEastIncrementSet && g->westEastNumberOfPointsSet ) {
+ increment = RGDI(&g);
+ numberOfPoints = IGNI(&g) - 1;
+ east = west + increment * (fortdouble) numberOfPoints;
+ value = (fortint) (east * 1000.0);
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(((g->g2)->grid.latlon.longitudeOfLastPoint),&value);
+ g->eastSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: east set = %f\n", east);
+ }
+ }
+ break;
+
+ case EAST:
+ if( DEBUG2 ) printf("adjustGridAreaDefinition: new east given\n");
+ east = RGSELON(&g);
+ if( g->westSet ) {
+ west = RGNWLON(&g);
+ if( g->westEastIncrementSet ) {
+ increment = RGDI(&g);
+ if( ALMOSTZERO(east - west - 360.0) )
+ numberOfPoints = (fortint) (0.5 + (east-west)/increment);
+ else
+ numberOfPoints = (fortint) (0.5 + (east-west)/increment) + 1;
+ MOVE2BYTES(((g->g2)->grid.latlon.numberOfPointsAlongParallel),
+ &numberOfPoints);
+ g->westEastNumberOfPointsSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: numberOfPoints set = %d\n",
+ numberOfPoints);
+ }
+ else if( g->westEastNumberOfPointsSet ) {
+ numberOfPoints = IGNI(&g) - 1;
+/*
+// Test for longitude wraparound
+*/
+ if( ALMOSTZERO(east - west - 360.0) ) numberOfPoints++;
+ increment = (east-west)/(fortdouble) numberOfPoints;
+ value = (fortint) (increment * 1000.0);
+ MOVE2BYTES(((g->g2)->grid.latlon.iDirectionIncrement),&value);
+ g->westEastIncrementSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: west-east increment set = %f\n",
+ increment);
+ }
+ }
+ else {
+ if( g->westEastIncrementSet && g->westEastNumberOfPointsSet ) {
+ increment = RGDI(&g);
+ numberOfPoints = IGNI(&g);
+ west = east - increment * (fortdouble) numberOfPoints;
+ value = (fortint) (west * 1000.0);
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(((g->g2)->grid.latlon.longitudeOfFirstPoint),&value);
+ g->westSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: west set = %f\n", west);
+ }
+ }
+ break;
+
+ case W_E_INC:
+ if( DEBUG2 ) printf("adjustGridAreaDefinition: new west-east increment given\n");
+ increment = RGDI(&g);
+ if( g->westSet ) {
+ west = RGNWLON(&g);
+ if( g->eastSet ) {
+ east = RGSELON(&g);
+ if( ALMOSTZERO(east - west - 360.0) )
+ numberOfPoints = (fortint) (0.5 + (east-west)/increment);
+ else
+ numberOfPoints = (fortint) (0.5 + (east-west)/increment) + 1;
+ MOVE2BYTES(((g->g2)->grid.latlon.numberOfPointsAlongParallel),
+ &numberOfPoints);
+ g->westEastNumberOfPointsSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: numberOfPoints set = %d\n",
+ numberOfPoints);
+ }
+ else if( g->westEastNumberOfPointsSet ) {
+ numberOfPoints = IGNI(&g);
+ east = west + increment *(fortdouble) numberOfPoints;
+ value = (fortint) (east * 1000.0);
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(((g->g2)->grid.latlon.longitudeOfLastPoint),&value);
+ g->eastSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: east set = %f\n", east);
+ }
+ }
+ else {
+ if( g->eastSet && g->westEastNumberOfPointsSet ) {
+ east = RGSELON(&g);
+ numberOfPoints = IGNI(&g);
+ west = east - increment * (fortdouble) numberOfPoints;
+ value = (fortint) (west * 1000.0);
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(((g->g2)->grid.latlon.longitudeOfFirstPoint),&value);
+ g->westSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: west set = %f\n", west);
+ }
+ }
+ break;
+
+ case N_S_INC:
+ if( DEBUG2 ) printf("adjustGridAreaDefinition: new north-south increment given\n");
+ increment = RGDJ(&g);
+ if( g->northSet ) {
+ north = RGNWLAT(&g);
+ if( g->southSet ) {
+ south = RGSELAT(&g);
+ numberOfPoints = (fortint) (0.5 + (north-south)/increment) + 1;
+ MOVE2BYTES(((g->g2)->grid.latlon.numberOfPointsAlongMeridian),
+ &numberOfPoints);
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: numberOfPoints set = %d\n",
+ numberOfPoints);
+ }
+ else if( g->northSouthNumberOfPointsSet ) {
+ numberOfPoints = IGNJ(&g) - 1;
+ south = north - increment *(fortdouble) numberOfPoints;
+ value = (fortint) (south * 1000.0);
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(((g->g2)->grid.latlon.latitudeOfLastPoint),&value);
+ g->southSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: south set = %f\n", south);
+ }
+ }
+ else {
+ if( g->southSet && g->northSouthNumberOfPointsSet ) {
+ south = RGSELAT(&g);
+ numberOfPoints = IGNJ(&g);
+ north = south + increment *(fortdouble) numberOfPoints;
+ value = (fortint) (north * 1000.0);
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(((g->g2)->grid.latlon.latitudeOfFirstPoint),&value);
+ g->northSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: north set = %f\n", north);
+ }
+ }
+ break;
+
+ case W_E_PTS:
+ if( DEBUG2 ) printf("adjustGridAreaDefinition: new west-east number of points given\n");
+ numberOfPoints = IGNI(&g);
+ if( g->westSet ) {
+ west = RGNWLON(&g);
+ if( g->eastSet ) {
+ east = RGSELON(&g);
+ if( ALMOSTZERO(east - west - 360.0) ) numberOfPoints--;
+ increment = (east-west)/(fortdouble)numberOfPoints;
+ value = (fortint) (increment * 1000.0);
+ MOVE2BYTES(((g->g2)->grid.latlon.iDirectionIncrement),&value);
+ g->westEastIncrementSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: west-east increment set = %f\n",
+ increment);
+ }
+ else if( g->westEastIncrementSet ) {
+ increment = RGDI(&g);
+ east = west + increment *(fortdouble) numberOfPoints;
+ if( (east - west) > 360.0 ) east -= increment;
+ value = (fortint) (east * 1000.0);
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(((g->g2)->grid.latlon.longitudeOfLastPoint),&value);
+ g->eastSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: east set = %f\n", east);
+ }
+ }
+ else {
+ if( g->eastSet && g->westEastIncrementSet ) {
+ east = RGSELON(&g);
+ increment = RGDI(&g);
+ west = east - increment *(fortdouble) numberOfPoints;
+ if( (east - west) > 360.0 ) east += increment;
+ value = (fortint) (west * 1000.0);
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(((g->g2)->grid.latlon.longitudeOfFirstPoint),&value);
+ g->westSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: west set = %f\n", west);
+ }
+ }
+ break;
+
+ case N_S_PTS:
+ if( DEBUG2 ) printf("adjustGridAreaDefinition: new north-south number of points given\n");
+ numberOfPoints = IGNJ(&g) - 1;
+ if( g->northSet ) {
+ north = RGNWLAT(&g);
+ if( g->southSet ) {
+ south = RGSELAT(&g);
+ increment = (north-south)/(fortdouble)numberOfPoints;
+ value = (fortint) (increment * 1000.0);
+ MOVE2BYTES(((g->g2)->grid.latlon.jDirectionIncrement),&value);
+ g->northSouthIncrementSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: north-south increment set = %f\n", increment);
+ }
+ else if( g->northSouthIncrementSet ) {
+ increment = RGDJ(&g);
+ south = north - increment *(fortdouble) numberOfPoints;
+ value = (fortint) (south * 1000.0);
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(((g->g2)->grid.latlon.latitudeOfLastPoint),&value);
+ g->southSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: south set = %f\n", south);
+ }
+ }
+ else {
+ if( g->southSet && g->northSouthIncrementSet ) {
+ south = RGSELAT(&g);
+ increment = RGDJ(&g);
+ north = south + increment *(fortdouble) numberOfPoints;
+ value = (fortint) (north * 1000.0);
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(((g->g2)->grid.latlon.latitudeOfFirstPoint),&value);
+ g->northSet = TRUE;
+ if( DEBUG2 )
+ printf("adjustGridAreaDefinition: north set = %f\n", north);
+ }
+ }
+ break;
+
+ default:
+ printf("adjustGridAreaDefinition: not yet implemented\n");
+ break;
+
+ }
+
+ g->numberOfValues = g2_ni(g) * g2_nj(g);
+ return;
+}
+
+fortint SPV(gribProduct** grib, fortdouble* list, fortint* sizeList) {
+gribProduct * g = *grib;
+fortint section2Size, requiredMemory, listOffset, numberOfRows;
+fortint numberOfNewCoordinates = *sizeList;
+gribSection2 * newG2;
+fortint numberOfOldCoordinates, number, loop;
+unsigned char * nextValue, * newLocation, * newCoordinateLocation;
+fortint exponent, mantissa, numberOfBitsPerInteger;
+fortdouble nextCoordinate;
+
+/*
+// Ensure there is enough memory to accomodate the list of vertical coordinates
+*/
+ section2Size = g2_length(g);
+ requiredMemory = section2Size - g2_NV(g)*4 + numberOfNewCoordinates*4;
+
+ if( requiredMemory > section2Size ) {
+ newG2 = (gribSection2 *) allocateMemory(requiredMemory);
+ memcpy(newG2,(g->g2),section2Size);
+ freeMemory((g->g2));
+ (g->g2) = newG2;
+ }
+ MOVE3BYTES(((g->g2)->sectionLength),&requiredMemory);
+
+ switch( (int) g2_datatype(g) ) {
+
+ case 0:
+ case 4:
+ case 5:
+ case 50:
+ listOffset = 32;
+ break;
+
+ case 1:
+ case 3:
+ case 6:
+ case 8:
+ case 10:
+ case 13:
+ case 14:
+ case 20:
+ case 24:
+ case 60:
+ case 70:
+ listOffset = 42;
+ break;
+
+ case 30:
+ case 34:
+ case 80:
+ listOffset = 52;
+ break;
+
+ case 90:
+ listOffset = 44;
+ break;
+
+ default:
+ printf("SPV: does not handle representation type = %d\n",
+ g2_datatype(g));
+ exit(1);
+ }
+/*
+// Move the list of the number of points at each latitude if it is a
+// reduced grid.
+*/
+ numberOfRows = g2_nj(g);
+
+ if( !directionIncrementsGiven(g) && (numberOfRows != 0) ) {
+
+ numberOfOldCoordinates = g2_NV(g);
+
+ if( numberOfOldCoordinates < numberOfNewCoordinates ) {
+ nextValue = numberOfRows*2 +
+ (unsigned char*)(g->g2) + g2_PV_PL(g) + numberOfOldCoordinates*4 - 1;
+ newLocation = numberOfRows*2 +
+ (unsigned char*)(g->g2) + listOffset + numberOfNewCoordinates*4;
+ for( loop = numberOfRows; loop >= 0; loop-- ) {
+ number = TWOBYTEINT(nextValue);
+ nextValue -= 2;
+ MOVE2BYTES(newLocation,&number);
+ newLocation -= 2;
+ }
+ }
+ else {
+{
+fortint temp;
+temp = g2_PV_PL(g);
+printf("********************* g2_PV_PL(g) = %d\n",temp);
+}
+ nextValue =
+ (unsigned char*)(g->g2) + g2_PV_PL(g) + numberOfOldCoordinates*4 - 1;
+ newLocation =
+ (unsigned char*)(g->g2) + listOffset + numberOfNewCoordinates*4;
+ for( loop = 0; loop < numberOfRows; loop++ ) {
+ number = TWOBYTEINT(nextValue);
+ nextValue += 2;
+ MOVE2BYTES(newLocation,&number);
+ newLocation += 2;
+ }
+ }
+ }
+/*
+// Add the vertical coordinates
+*/
+ newCoordinateLocation = (unsigned char*)(g->g2) + listOffset;
+ numberOfBitsPerInteger = sizeof(fortint) * 8;
+
+ for( loop = 0; loop < numberOfNewCoordinates; loop++) {
+ nextCoordinate = list[loop];
+ if( REF2GRB(&nextCoordinate,&exponent,&mantissa,&numberOfBitsPerInteger) ) {
+ printf("SPV: call to REF2GRB failed\n");
+ exit(1);
+ }
+ MOVE1BYTE(newCoordinateLocation,&exponent);
+ MOVE3BYTES((newCoordinateLocation+1),&mantissa);
+ newCoordinateLocation += 4;
+ }
+ MOVE1BYTE(((g->g2)->NV),&numberOfNewCoordinates);
+ listOffset++;
+ MOVE1BYTE(((g->g2)->PV_PL),&listOffset);
+
+}
diff --git a/gribex/sencode.h b/gribex/sencode.h
new file mode 100755
index 0000000..ead4a07
--- /dev/null
+++ b/gribex/sencode.h
@@ -0,0 +1,63 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef SENCODE_H
+#define SENCODE_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "fortint.h"
+/*sinisa #include "getsetValues.h" */
+
+#ifdef FORTRAN_NO_UNDERSCORE
+#define SENCODE sencode
+#define SENPACK senpack
+#define RSTIME rstime
+#define ISTIME istime
+#define RSDATE rsdate
+#define ISDATE isdate
+#define SVALUES svalues
+#define SPV spv
+#define CSECT4 csect4
+#define GRSMKP grsmkp
+#define REF2GRB ref2grb
+#define INSCAL inscal
+#define INXBIT inxbit
+#define JGETGG jgetgg
+#else
+#define SENCODE sencode_
+#define SENPACK senpack_
+#define RSTIME rstime_
+#define ISTIME istime_
+#define RSDATE rsdate_
+#define ISDATE isdate_
+#define SVALUES svalues_
+#define SPV spv_
+#define CSECT4 csect4_
+#define GRSMKP grsmkp_
+#define REF2GRB ref2grb_
+#define INSCAL inscal_
+#define INXBIT inxbit_
+#define JGETGG jgetgg_
+#endif
+
+#endif /* End of SENCODE_H */
+
+fortint SVALUES(gribProduct**,fortdouble*,fortint*,fortdouble*);
+fortint CSECT4(fortdouble*,fortint*,fortint*,fortint*,fortint*,fortint*,
+ fortint*,fortint*,fortint*);
+void GRSMKP(fortint*);
+fortint REF2GRB(fortdouble*,fortint*,fortint*,fortint*);
+void INSCAL(fortdouble*,fortint*,fortint*,fortdouble*,fortdouble*,fortint*);
+void INXBIT(fortint*,fortint*,fortint*,fortint*,fortint*,fortint*,fortint*,
+ char*,fortint*,long);
+void JGETGG(fortint*,unsigned char*,fortdouble*,fortint*,fortint*,long);
+
+void setBitMap(unsigned char*,fortint);
diff --git a/gribex/sencode1.c b/gribex/sencode1.c
new file mode 100755
index 0000000..d1801cf
--- /dev/null
+++ b/gribex/sencode1.c
@@ -0,0 +1,45 @@
+/**
+* Copyright 1981-2012 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 "gdecode.h"
+#include "sencode.h"
+
+#include "sencode1.h"
+
+fortint IS1NUMB(gribProduct ** grib, fortint * number) {
+gribProduct * g = *grib;
+
+ if( !( ecmwfLocalDefinitionPresent(g) && (g1_definition(g)==1) ) )
+ return (fortint) -1;
+
+ MOVE1BYTE(((g->g1)->local.contents.def1.number),number);
+ return 0;
+}
+
+fortint RS1NUMB(gribProduct ** grib, fortdouble *number) {
+fortint Number = (fortint) *number;
+ return IS1NUMB(grib,&Number);
+}
+
+fortint IS1TOTL(gribProduct ** grib, fortint * total) {
+gribProduct * g = *grib;
+
+ if( !( ecmwfLocalDefinitionPresent(g) && (g1_definition(g)==1) ) )
+ return (fortint) -1;
+
+ MOVE1BYTE(((g->g1)->local.contents.def1.total),total);
+ return 0;
+}
+
+fortint RS1TOTL(gribProduct ** grib, fortdouble *total) {
+fortint Total = (fortint) *total;
+ return IS1TOTL(grib,&Total);
+}
diff --git a/gribex/sencode1.h b/gribex/sencode1.h
new file mode 100755
index 0000000..71e47a0
--- /dev/null
+++ b/gribex/sencode1.h
@@ -0,0 +1,31 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef SENCODE1_H
+#define SENCODE1_H
+
+#ifdef FORTRAN_NO_UNDERSCORE
+#define IS1NUMB is1numb
+#define RS1NUMB rs1numb
+#define IS1TOTL is1totl
+#define RS1TOTL rs1totl
+#else
+#define IS1NUMB is1numb_
+#define RS1NUMB rs1numb_
+#define IS1TOTL is1totl_
+#define RS1TOTL rs1totl_
+#endif
+
+fortint IS1NUMB(gribProduct **, fortint *);
+fortint RS1NUMB(gribProduct **, fortdouble *);
+fortint IS1TOTL(gribProduct **, fortint *);
+fortint RS1TOTL(gribProduct **, fortdouble *);
+
+#endif /* end of SENCODE1_H */
diff --git a/gribex/sencode2.c b/gribex/sencode2.c
new file mode 100755
index 0000000..34907f7
--- /dev/null
+++ b/gribex/sencode2.c
@@ -0,0 +1,223 @@
+/**
+* Copyright 1981-2012 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 "gdecode.h"
+#include "sencode.h"
+
+#include "sencode2.h"
+
+fortint IS2NUMB(gribProduct ** grib, fortint * number) {
+gribProduct * g = *grib;
+
+ if( !( ecmwfLocalDefinitionPresent(g) && (g1_definition(g)==2) ) )
+ return (fortint) -1;
+
+ MOVE1BYTE(((g->g1)->local.contents.def2.number),number);
+ return 0;
+}
+
+fortint RS2NUMB(gribProduct ** grib, fortdouble *number) {
+fortint Number = (fortint) *number;
+ return IS2NUMB(grib,&Number);
+}
+
+fortint IS2TOTL(gribProduct ** grib, fortint * total) {
+gribProduct * g = *grib;
+
+ if( !( ecmwfLocalDefinitionPresent(g) && (g1_definition(g)==2) ) )
+ return (fortint) -1;
+
+ MOVE1BYTE(((g->g1)->local.contents.def2.total),total);
+ return 0;
+}
+
+fortint RS2TOTL(gribProduct ** grib, fortdouble *total) {
+fortint Total = (fortint) *total;
+ return IS2TOTL(grib,&Total);
+}
+
+fortint IS2METH(gribProduct ** grib, fortint * method) {
+gribProduct * g = *grib;
+
+ if( !( ecmwfLocalDefinitionPresent(g) && (g1_definition(g)==2) ) )
+ return (fortint) -1;
+
+ MOVE1BYTE(((g->g1)->local.contents.def2.method),method);
+ return 0;
+}
+
+fortint RS2METH(gribProduct ** grib, fortdouble *method) {
+fortint Method = (fortint) *method;
+ return IS2METH(grib,&Method);
+}
+
+fortint IS2STAR(gribProduct ** grib, fortint * startTimestep) {
+gribProduct * g = *grib;
+
+ if( !( ecmwfLocalDefinitionPresent(g) && (g1_definition(g)==2) ) )
+ return (fortint) -1;
+
+ MOVE2BYTES(((g->g1)->local.contents.def2.startTimestep),startTimestep);
+ return 0;
+}
+
+fortint RS2STAR(gribProduct ** grib, fortdouble *startTimestep) {
+fortint StartTimestep = (fortint) *startTimestep;
+ return IS2STAR(grib,&StartTimestep);
+}
+
+fortint IS2END(gribProduct ** grib, fortint * endTimestep) {
+gribProduct * g = *grib;
+
+ if( !( ecmwfLocalDefinitionPresent(g) && (g1_definition(g)==2) ) )
+ return (fortint) -1;
+
+ MOVE2BYTES(((g->g1)->local.contents.def2.endTimestep),endTimestep);
+ return 0;
+}
+
+fortint RS2END(gribProduct ** grib, fortdouble *endTimestep) {
+fortint EndTimestep = (fortint) *endTimestep;
+ return IS2END(grib,&EndTimestep);
+}
+
+fortint IS2NLAT(gribProduct ** grib, fortint * domainNorthLatitude) {
+gribProduct * g = *grib;
+fortint value = *domainNorthLatitude;
+
+ if( !( ecmwfLocalDefinitionPresent(g) && (g1_definition(g)==2) ) )
+ return (fortint) -1;
+
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(((g->g1)->local.contents.def2.domainNorthLatitude),&value);
+ return 0;
+}
+
+fortint RS2NLAT(gribProduct ** grib, fortdouble *domainNorthLatitude) {
+fortint DomainNorthLatitude = (fortint) (*domainNorthLatitude*1000.0);
+ return IS2NLAT(grib,&DomainNorthLatitude);
+}
+
+fortint IS2WLON(gribProduct ** grib, fortint * domainWestLongitude) {
+gribProduct * g = *grib;
+fortint value = *domainWestLongitude;
+
+ if( !( ecmwfLocalDefinitionPresent(g) && (g1_definition(g)==2) ) )
+ return (fortint) -1;
+
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(((g->g1)->local.contents.def2.domainWestLongitude),&value);
+ return 0;
+}
+
+fortint RS2WLON(gribProduct ** grib, fortdouble *domainWestLongitude) {
+fortint DomainWestLongitude = (fortint) (*domainWestLongitude*1000.0);
+ return IS2WLON(grib,&DomainWestLongitude);
+}
+
+fortint IS2SLAT(gribProduct ** grib, fortint * domainSouthLatitude) {
+gribProduct * g = *grib;
+fortint value = *domainSouthLatitude;
+
+ if( !( ecmwfLocalDefinitionPresent(g) && (g1_definition(g)==2) ) )
+ return (fortint) -1;
+
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(((g->g1)->local.contents.def2.domainSouthLatitude),&value);
+ return 0;
+}
+
+fortint RS2SLAT(gribProduct ** grib, fortdouble *domainSouthLatitude) {
+fortint DomainSouthLatitude = (fortint) (*domainSouthLatitude*1000.0);
+ return IS2SLAT(grib,&DomainSouthLatitude);
+}
+
+fortint IS2ELON(gribProduct ** grib, fortint * domainEastLongitude) {
+gribProduct * g = *grib;
+fortint value = *domainEastLongitude;
+
+ if( !( ecmwfLocalDefinitionPresent(g) && (g1_definition(g)==2) ) )
+ return (fortint) -1;
+
+ if( value < 0 ) value = 0x800000 | (-value);
+ MOVE3BYTES(((g->g1)->local.contents.def2.domainEastLongitude),&value);
+ return 0;
+}
+
+fortint RS2ELON(gribProduct ** grib, fortdouble *domainEastLongitude) {
+fortint DomainEastLongitude = (fortint) (*domainEastLongitude*1000.0);
+ return IS2ELON(grib,&DomainEastLongitude);
+}
+
+fortint IS2OPCL(gribProduct ** grib, fortint * operationalForecastCluster) {
+gribProduct * g = *grib;
+
+ if( !( ecmwfLocalDefinitionPresent(g) && (g1_definition(g)==2) ) )
+ return (fortint) -1;
+
+ MOVE1BYTE(((g->g1)->local.contents.def2.operationalForecastCluster),operationalForecastCluster);
+ return 0;
+}
+
+fortint RS2OPCL(gribProduct ** grib, fortdouble *operationalForecastCluster) {
+fortint OperationalForecastCluster = (fortint) *operationalForecastCluster;
+ return IS2OPCL(grib,&OperationalForecastCluster);
+}
+
+fortint IS2CFCL(gribProduct ** grib, fortint * controlForecastCluster) {
+gribProduct * g = *grib;
+
+ if( !( ecmwfLocalDefinitionPresent(g) && (g1_definition(g)==2) ) )
+ return (fortint) -1;
+
+ MOVE1BYTE(((g->g1)->local.contents.def2.controlForecastCluster),controlForecastCluster);
+ return 0;
+}
+
+fortint RS2CFCL(gribProduct ** grib, fortdouble *controlForecastCluster) {
+fortint ControlForecastCluster = (fortint) *controlForecastCluster;
+ return IS2CFCL(grib,&ControlForecastCluster);
+}
+
+fortint IS2NUCL(gribProduct ** grib, fortint * numberInCluster) {
+gribProduct * g = *grib;
+
+ if( !( ecmwfLocalDefinitionPresent(g) && (g1_definition(g)==2) ) )
+ return (fortint) -1;
+
+ MOVE1BYTE(((g->g1)->local.contents.def2.numberInCluster),numberInCluster);
+ return 0;
+}
+
+fortint RS2NUCL(gribProduct ** grib, fortdouble *numberInCluster) {
+fortint NumberInCluster = (fortint) *numberInCluster;
+ return IS2NUCL(grib,&NumberInCluster);
+}
+
+fortint IS2LIST(gribProduct ** grib, fortint * array, fortint * size) {
+gribProduct * g = *grib;
+fortint loop, listLength;
+unsigned char * p;
+
+ if( !ecmwfLocalDefinition2Present(g) ) return -1;
+
+ listLength = g1_2_count(g);
+ if( listLength > *size ) return -1;
+
+ p = (unsigned char *) ((g->g1)->local.contents.def2.forecastNumberList);
+ for( loop = 0; loop < listLength; loop++ ) {
+ MOVE1BYTE(p,(array+loop));
+ p++;
+ }
+
+ return listLength;
+
+}
diff --git a/gribex/sencode2.h b/gribex/sencode2.h
new file mode 100755
index 0000000..4362006
--- /dev/null
+++ b/gribex/sencode2.h
@@ -0,0 +1,94 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef SENCODE2_H
+#define SENCODE2_H
+
+#ifdef FORTRAN_NO_UNDERSCORE
+#define IS2NUMB is2numb
+#define RS2NUMB rs2numb
+#define IS2TOTL is2totl
+#define RS2TOTL rs2totl
+#define IS2METH is2meth
+#define RS2METH rs2meth
+#define IS2STAR is2star
+#define RS2STAR rs2star
+#define IS2END is2end
+#define RS2END rs2end
+#define IS2NLAT is2nlat
+#define RS2NLAT rs2nlat
+#define IS2WLON is2wlon
+#define RS2WLON rs2wlon
+#define IS2SLAT is2slat
+#define RS2SLAT rs2slat
+#define IS2ELON is2elon
+#define RS2ELON rs2elon
+#define IS2OPCL is2opcl
+#define RS2OPCL rs2opcl
+#define RS2CFCL rs2cfcl
+#define IS2CFCL is2cfcl
+#define RS2NUCL rs2nucl
+#define IS2NUCL is2nucl
+#define IS2LIST is2list
+#else
+#define IS2NUMB is2numb_
+#define RS2NUMB rs2numb_
+#define IS2TOTL is2totl_
+#define RS2TOTL rs2totl_
+#define IS2METH is2meth_
+#define RS2METH rs2meth_
+#define IS2STAR is2star_
+#define RS2STAR rs2star_
+#define IS2END is2end_
+#define RS2END rs2end_
+#define IS2NLAT is2nlat_
+#define RS2NLAT rs2nlat_
+#define IS2WLON is2wlon_
+#define RS2WLON rs2wlon_
+#define IS2SLAT is2slat_
+#define RS2SLAT rs2slat_
+#define IS2ELON is2elon_
+#define RS2ELON rs2elon_
+#define IS2OPCL is2opcl_
+#define RS2OPCL rs2opcl_
+#define RS2CFCL rs2cfcl_
+#define IS2CFCL is2cfcl_
+#define RS2NUCL rs2nucl_
+#define IS2NUCL is2nucl_
+#define IS2LIST is2list_
+#endif
+
+fortint IS2NUMB(gribProduct **, fortint *);
+fortint RS2NUMB(gribProduct **, fortdouble *);
+fortint IS2TOTL(gribProduct **, fortint *);
+fortint RS2TOTL(gribProduct **, fortdouble *);
+fortint IS2METH(gribProduct **, fortint *);
+fortint RS2METH(gribProduct **, fortdouble *);
+fortint IS2STAR(gribProduct **, fortint *);
+fortint RS2STAR(gribProduct **, fortdouble *);
+fortint IS2END(gribProduct **, fortint *);
+fortint RS2END(gribProduct **, fortdouble *);
+fortint IS2NLAT(gribProduct **, fortint *);
+fortint RS2NLAT(gribProduct **, fortdouble *);
+fortint IS2WLON(gribProduct **, fortint *);
+fortint RS2WLON(gribProduct **, fortdouble *);
+fortint IS2SLAT(gribProduct **, fortint *);
+fortint RS2SLAT(gribProduct **, fortdouble *);
+fortint IS2ELON(gribProduct **, fortint *);
+fortint RS2ELON(gribProduct **, fortdouble *);
+fortint IS2OPCL(gribProduct **, fortint *);
+fortint RS2OPCL(gribProduct **, fortdouble *);
+fortint IS2CFCL(gribProduct **, fortint *);
+fortint RS2CFCL(gribProduct **, fortdouble *);
+fortint IS2NUCL(gribProduct **, fortint *);
+fortint RS2NUCL(gribProduct **, fortdouble *);
+fortint IS2LIST(gribProduct**,fortint*,fortint*);
+
+#endif /* end of SENCODE2_H */
diff --git a/gribex/setpar.F b/gribex/setpar.F
new file mode 100755
index 0000000..2c77196
--- /dev/null
+++ b/gribex/setpar.F
@@ -0,0 +1,118 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE SETPAR (KBIT,KNEG,KPR)
+C
+C---->
+C**** SETPAR - Set number of bits in word. Set maximum negative integer.
+C
+C Purpose.
+C --------
+C
+C Set number of bits in word. Set maximum negative integer.
+C
+C** Interface.
+C ----------
+C
+C CALL SETPAR (KBIT,KNEG,KPR)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KPR - Debug print switch.
+C > 0 , print out.
+C 0 , No print out.
+C
+C Output Parameters.
+C ------------------
+C
+C KBIT - Number of bits in computer word.
+C
+C KNEG - Maximum negative integer.
+C
+C Method.
+C -------
+C
+C Values are assigned according to hardware platform.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C None
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 28.10.91
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C ------------------------------------------------------------------
+C----<
+C
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+ INTEGER KBIT
+ INTEGER KNEG
+ INTEGER KPR
+C
+C ------------------------------------------------------------------
+C* Section 1 . Assign values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF( KPR.GE.1 ) WRITE(GRPRSM,*) ' SETPAR : Section 1.'
+C
+#ifdef INTEGER_8
+ KBIT = 64
+ KNEG = -9223372036854775807
+#elif (defined VAX)
+ KBIT = 32
+ KNEG = -2147483648
+#else
+ KBIT = 32
+ KNEG = -2147483647
+#endif
+C ------------------------------------------------------------------
+C* Section 9 . Return to calling routine.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) THEN
+ WRITE(GRPRSM,*) ' SETPAR : Section 9.'
+ WRITE(GRPRSM,*) ' Output values set -'
+ WRITE(GRPRSM,*) 'SETPAR: KBIT = ', KBIT
+ WRITE(GRPRSM,*) 'SETPAR: KNEG = ', KNEG
+ ENDIF
+C
+ RETURN
+ END
diff --git a/gribex/sfbits.h b/gribex/sfbits.h
new file mode 100755
index 0000000..6a43835
--- /dev/null
+++ b/gribex/sfbits.h
@@ -0,0 +1,52 @@
+
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C
+C STATEMENT FUNCTIONS TO MANIPULATE BITS IN WORDS OF 64 BITS
+C
+C DATA ONES/7777777777777777B/
+C DATA OOOS/0B/
+C
+C 1. SINGLE BIT MANIPULATIONS
+C
+C 1.1 SET BIT KBIT IN WORD PW
+C
+ IBSET(KW,KBIT)=OR(KW,SHIFT(1B,KBIT))
+C
+C 2. WORD MANIPULATIONS, BIT BY BIT
+C
+C 2.1 ARE WORDS PW1 AND PW2 EQUAL?
+C
+C LOGICAL NLEQAL
+C NLEQAL(PW1,PW2)=(PW1.XOR.PW2).EQ.0B
+C
+C 2.2 BITWISE AND AND OR
+C
+ IAND(K1,K2)=AND(K1,K2)
+ IOR (K1,K2)= OR(K1,K2)
+C
+C 2.3 BITWISE NEGATION
+C
+ NOT(K)=COMPL(K)
+C
+C 2.4 SHIFT (LEFT FOR KSH POSITIVE, RIGHT FOR KSH NEGATIVE)
+C
+ ISHFT(K,KSH)=CVMGP(SHIFTL(K,KSH),SHIFTR(K,-KSH),KSH)
+C
+C 3. SPECIAL PURPOSE
+C
+C 3.1 TAKE 4 LAST BITS OF KW, PUT THEM IN PW AT POS K*4-1
+C
+C SETLEV(PW,KW,K)=OR(AND(PW,SHIFT(0B.EQV.17B,K*4-4)),
+C +SHIFT(AND(17B,KW),K*4-4))
+C
+C 3.2 EXTRACT FIELD K*4-1:4 FROM PW
+C
+C MGTLEV(PW,K)=AND(17B,SHIFT(PW,68-K*4))
diff --git a/gribex/sort.F b/gribex/sort.F
new file mode 100755
index 0000000..c27592f
--- /dev/null
+++ b/gribex/sort.F
@@ -0,0 +1,141 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE SORT (BLOCK,NOF,UN,IRETR,NBIT)
+C
+C---->
+C**********************************************************************
+C* *
+C* NAME : SORT *
+C* *
+C* FUNCTION : SORTS AN ARRAY IN ASCENDING FIELD CODE-NUMBER *
+C* AND WRITES THE FIELD TO GIVEN UNIT NUMBER. *
+C* *
+C* INPUT : BLOCK = INPUT ARRAY CONTAINING FIELDS. *
+C* NOF = NO OF FIELDS *
+C* UN = OUTPUT FILE FOR SORTED FIELDS. *
+C* NBIT = NO OF BITS PER WORD *
+C* *
+C* OUTPUT : IRETR > 0 NO. OF RECORDS WRITTEN *
+C* < 0 ERRORS REPORTED BY SUBROUTINES *
+C* = -200 BUFFER OUT ERROR *
+C* BLOCK - RECORDS ARE ALTERED . FIELD-CODE OCTETS *
+C* ARE SET TO 0 !!!!! *
+C* *
+C* GENERAL : SORT CALLS RECLEN *
+C* SBYTE *
+C* *
+C* AUTHOR : B.V. GURETZKY V.E. DAY *
+C* *
+C* MODIFIED : J. HENNESSY 26.11.85 *
+C* *
+C**********************************************************************
+C----<
+C
+ IMPLICIT INTEGER (B,U)
+ DIMENSION BLOCK(*)
+C
+ DATA IPR /1/
+C
+C RETURN IF NUMBER OF FIELDS NOT MORE THAN 0.
+C
+ IF (NOF.LE.0) RETURN
+C
+C ONLY 1 FIELD SUPPLIED
+C
+ IF (NOF.EQ.1)
+ C THEN
+ CALL RECLEN (BLOCK(1),LEN,NBIT,ICODE,INDIC,LEVEL,JERR)
+ IF (JERR.NE.0)
+ C THEN
+ IRETR = JERR
+ RETURN
+ ENDIF
+ LEN = LEN / 8
+ BUFFER OUT (UN,0) (BLOCK(1),BLOCK(LEN))
+ IUNIT = UNIT(UN)
+ IF (IUNIT.GT.0) GO TO 10000
+ IRETR = IRETR + 1
+ RETURN
+ ENDIF
+C
+C
+C LOOP THROUGH FIELDS SUPPLIED TO FIND THE ONE WITH
+C THE NEXT HIGHEST FIELD CODE.
+C
+ DO 2000 I = 1,NOF
+C
+ IB = 0
+ LENEXTR = 0
+ IOFFEXT = 0
+ ICODEXT = 999
+C
+ DO 1000 J = 1,NOF
+C
+C GET LENGTH OF FIELD RECORD.
+C
+ CALL RECLEN (BLOCK(IB+1),LEN,NBIT,ICODE,INDIC,LEVEL,JERR)
+ IF (JERR.NE.0)
+ C THEN
+ IRETR = JERR
+ RETURN
+ ENDIF
+ LEN = LEN / 8
+C
+ IF ((ICODE.LT.ICODEXT).AND.(ICODE.NE.0))
+ C THEN
+ LENEXTR = LEN
+ IOFFEXT = IB
+ ICODEXT = ICODE
+ ENDIF
+ IB = IB + LEN
+C
+ 1000 CONTINUE
+C
+C WRITE FIELD
+C
+ LEN = IOFFEXT + LENEXTR
+ BUFFER OUT(UN,0) (BLOCK(IOFFEXT+1),BLOCK(LEN))
+ CALL RECLEN (BLOCK(IOFFEXT+1),LEN,NBIT,ICODE,INDIC,LEVEL,JERR)
+ IF (JERR.NE.0)
+ C THEN
+ IRETR = JERR
+ RETURN
+ ENDIF
+ IUNIT = UNIT(UN)
+ IF (IPR.EQ.1) WRITE (*,9101) LEVEL,ICODE
+ 9101 FORMAT (1H ,'LEVEL ',I5,' FIELD ',I5)
+ IF (ICODE.LT.127.OR.ICODE.GT.255)
+ C THEN
+ WRITE (*,*) 'SORT : INVALID FIELD CODE.'
+ CALL ABORT
+ ENDIF
+C
+ IF (IUNIT.GT.0) GO TO 10000
+C
+C SET CODE-TYPE TO ZERO TO INDICATE
+C THAT FIELD HAS ALREADY BEEN WRITTEN
+C
+ IZERO = 0
+ CALL SBYTE (BLOCK(IOFFEXT+2),IZERO,32,8)
+ IRETR = IRETR + 1
+
+ 2000 CONTINUE
+
+ RETURN
+10000 CONTINUE
+
+ IRETR = -200
+ WRITE (*,*) ' SORT : BUFFER OUT ERROR.'
+C
+ RETURN
+C
+ END
diff --git a/gribex/sortf.F b/gribex/sortf.F
new file mode 100755
index 0000000..817905a
--- /dev/null
+++ b/gribex/sortf.F
@@ -0,0 +1,218 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE SORTF (UN1,UN2,IRET)
+C
+C---->
+C**********************************************************************
+C* *
+C* NAME : SORTF *
+C* *
+C* FUNCTION : SORTS FIELDS IN A FILE IN ASCENDING ORDER *
+C* *
+C* INPUT : UN1 = INPUT LUN *
+C* UN2 = OUTPUT LUN *
+C* *
+C* OUTPUT : IRET = -10 INSUFFICENT BUFFER LENGTH *
+C* = -100 BUFFER IN ERROR *
+C* = -200 BUFFER OUT ERROR *
+C* = -300 UNRECOGNISED LEVEL TYPE.
+C* = -400 LEVEL SEQUENCE ERROR.
+C* > 0 NO. OF FIELDS WRITTEN *
+C* < 0 ERROR CODES FROM SUBROUTINES. *
+C* *
+C* GENERAL : SORTF CALLS RECLEN *
+C* SORT *
+C* *
+C* AUTHOR : B.V. GURETZKY 16.07.85 *
+C* *
+C* MOFIFIED : J. HENNESSY 26.11.85 *
+C J. HENNESSY 23.03.87
+C* *
+C**********************************************************************
+C----<
+C
+ IMPLICIT INTEGER (B,R,U)
+ PARAMETER (BLEN=500000)
+ DIMENSION BUF(BLEN)
+C
+C NO OF BITS PER WORD
+ DATA NBIT /64/
+C
+ DATA IPR /1/
+C
+C
+ IRET = 0
+ IB = 0
+ LEN = 0
+ NOF = -1
+ RECNO = 0
+ ICODE = 0
+ INTER = 0
+
+
+
+C SKIP TO END OF FILE AND CHECK LAST FIELD.
+C
+ DO 2000 J = 1,10000
+ BUFFER IN (UN1,0) (BUF(1),BUF(BLEN))
+ IUNIT = UNIT(UN1)
+ IF (UNIT(UN1)) 1000,2500,10000
+ 1000 CONTINUE
+ RECNO = RECNO + 1
+ 2000 CONTINUE
+C
+C IF LAST FIELD IS LN SURFACE PRESSURE OR BUDGET VALUE
+C RECORD, WRITE TO OUTPUT FILE.
+C
+ 2500 CALL RECLEN (BUF(1),LEN,NBIT,ICODE,INDIC,LEVEL,JERR)
+ IF (JERR.NE.0)
+ C THEN
+ IRET = JERR
+ RETURN
+ ENDIF
+C
+C IDENTIFY LEVEL TYPE FOR SEQUENCE CHECKING PURPOSES.
+C
+C SURFACE DATA.
+C
+ IF (INDIC.EQ.1)
+ C THEN
+ INTER = 0
+ ITYPE = 0
+ GO TO 2600
+ ENDIF
+C
+C PRESSURE LEVEL DATA.
+C
+ IF (INDIC.EQ.100)
+ C THEN
+ INTER = 9999
+ ITYPE = 1
+ GO TO 2600
+ ENDIF
+C
+C MODEL LEVEL DATA.
+C
+ IF (INDIC.EQ.109)
+ C THEN
+ INTER = 0
+ ITYPE = 2
+ GO TO 2600
+ ENDIF
+C
+C INVALID LEVEL TYPE.
+C
+ IRET = -300
+ WRITE (*,9001) INDIC
+ 9001 FORMAT (1H ,'SORTF : INVALID LEVEL TYPE - ',I3)
+ RETURN
+C
+ 2600 CONTINUE
+C
+ IF (ICODE.EQ.152.OR.ICODE.EQ.128)
+ C THEN
+ IRET = IRET + 1
+ LEN = LEN / 8
+ RECNO = RECNO - 1
+ BUFFER OUT (UN2,0) (BUF(1),BUF(LEN))
+ IUNIT = UNIT(UN2)
+ IF (IPR.EQ.1) WRITE (*,9101) LEVEL,ICODE
+ 9101 FORMAT (1H ,'LEVEL ',I5,' FIELD ',I5)
+ IF (IUNIT.GT.0) GO TO 10500
+ ENDIF
+C
+ REWIND UN1
+C
+C START AGAIN AT BEGINNING OF FILE FOR OTHER FIELDS.
+C
+ DO 5000 J = 1,RECNO
+C
+C READ AS MANY FIELDS AS POSSIBLE INTO MEMORY.
+C
+ LEVEL = INTER
+ BUFFER IN (UN1,0) (BUF(IB+1),BUF(BLEN))
+ IUNIT = UNIT(UN1)
+ IF (UNIT(UN1)) 3000,5500,10000
+ 3000 CONTINUE
+ NOF = NOF + 1
+C
+C IF LEVEL CHANGES THEN SORT PREVIOUS FIELDS.
+C
+ CALL RECLEN (BUF(IB+1),LEN,NBIT,ICODE,INDIC,INTER,JERR)
+ IF (JERR.NE.0)
+ C THEN
+ IRET = JERR
+ RETURN
+ ENDIF
+C
+ LEN = LENGTH(UN1)
+ IF ((INTER.NE.LEVEL).AND.(J.GT.1))
+ C THEN
+C
+C FIRST CHECK THAT LEVEL SEQUENCE IS CORRECT.
+C
+ IF ( (ITYPE.EQ.1.AND.INTER.GT.LEVEL) .OR.
+ C (ITYPE.EQ.2.AND.INTER.LT.LEVEL) )
+ C THEN
+ IRET = - 400
+ WRITE (*,9002)
+ 9002 FORMAT (1H ,'SORTF : LEVEL SEQUENCE ERROR.')
+ RETURN
+ ENDIF
+C
+C SORT FIELDS
+C
+ CALL SORT (BUF(1),NOF,UN2,IRET,NBIT)
+ IF (IRET.LE.0) RETURN
+C
+C MOVE LAST FIELD TO BUFFER START
+C
+ NOF = 0
+ DO 4000 K = 1,LEN
+ BUF(K) = BUF(IB+K)
+ 4000 CONTINUE
+ IB = 0
+C
+ ENDIF
+C
+C CHECK BUFFER LIMITS
+C
+ IB = IB + LEN
+ IF (IB+LEN.GT.BLEN)
+ C THEN
+ IRET = -10
+ WRITE (*,9000) J
+ 9000 FORMAT (' SORTF : NOT ENOUGH MEMORY FOR FIELD :',I4.4)
+ RETURN
+ ENDIF
+C
+C
+ 5000 CONTINUE
+C
+C SORT LAST SET OF FIELDS.
+C
+ 5500 NOF = NOF + 1
+ CALL SORT (BUF(1),NOF,UN2,IRET,NBIT)
+C
+ RETURN
+C
+10000 CONTINUE
+ IRET = -100
+ WRITE (*,*) ' SORTF : BUFFER IN ERROR'
+ RETURN
+C
+10500 CONTINUE
+ IRET = -200
+ WRITE (*,*) ' SORTF : BUFFER OUT ERROR'
+ RETURN
+C
+ END
diff --git a/gribex/sources.CRAY b/gribex/sources.CRAY
new file mode 100755
index 0000000..ba42aa1
--- /dev/null
+++ b/gribex/sources.CRAY
@@ -0,0 +1,239 @@
+#
+# Sources for libemos/gribex on CRAY.
+#
+
+HEADERS = \
+ comars.h \
+ comcomm.h \
+ comgrb.h \
+ ecdef1.h \
+ ecdef2.h \
+ ecdef3.h \
+ ecdef4.h \
+ ecdef5.h \
+ ecdef6.h \
+ ecdef7.h \
+ ecdef8.h \
+ ecdef9.h \
+ ecdef10.h \
+ ecdef11.h \
+ ecdef12.h \
+ ecdef13.h \
+ ecdef14.h \
+ ecdef15.h \
+ ecdef16.h \
+ ecdef17.h \
+ ecdef18.h \
+ ecdef19.h \
+ ecdf190.h \
+ ecdf191.h \
+ ECMWFdefinitions.h \
+ gdecode.h \
+ gdecode1.h \
+ gdecode2.h \
+ gdecodeStruct.h \
+ getsetValues.h \
+ grbcom.h \
+ gribex.h \
+ handleLocalDefinitions.h \
+ sencode.h \
+ sencode1.h \
+ sencode2.h \
+ sfbits.h
+
+SOURCES.c = \
+ csgnbt.c \
+ dsgnbt.c \
+ ECMWFdefinitions.c \
+ findLocalDefinitionFile.c \
+ fortranInterface.c \
+ gdecode.c \
+ gdecode1.c \
+ gdecode2.c \
+ getsetValues.c \
+ grpr190.c \
+ handleLocalDefinitions.c \
+ jmalloc.c \
+ jfree.c \
+ orefdat.c \
+ sencode.c \
+ sencode1.c \
+ sencode2.c \
+ valpina.c
+
+SOURCES.f =
+
+SOURCES.F = \
+ abortx.F \
+ blckcr.F \
+ bufrin.F \
+ c2bitw.F \
+ c2cwid.F \
+ c2dosd.F \
+ c2gene.F \
+ c2ordr.F \
+ c2pack.F \
+ c2pkvw.F \
+ c2rnge.F \
+ c2rows.F \
+ calcop.F \
+ cheknum.F \
+ chktab2.F \
+ cmpck.F \
+ codegb.F \
+ codegc.F \
+ codegr.F \
+ codeps.F \
+ confp.F \
+ confp2.F \
+ confp3.F \
+ confpa.F \
+ csect4.F \
+ d2ordr.F \
+ d2rosd.F \
+ decext.F \
+ decfp.F \
+ decfp2.F \
+ decogb.F \
+ decogc.F \
+ decogd.F \
+ decogr.F \
+ decops.F \
+ decops2.F \
+ dggsec2.F \
+ dlasec2.F \
+ dllsec2.F \
+ dmesec2.F \
+ docsec2.F \
+ dpssec2.F \
+ dshsec2.F \
+ dsvsec2.F \
+ dsect4a.F \
+ ecdef1.F \
+ ecdef10.F \
+ ecdef11.F \
+ ecdef12.F \
+ ecdef13.F \
+ ecdef14.F \
+ ecdef15.F \
+ ecdef16.F \
+ ecdef17.F \
+ ecdef18.F \
+ ecdef19.F \
+ ecdef50.F \
+ ecdf191.F \
+ ecdef2.F \
+ ecdef3.F \
+ ecdef4.F \
+ ecdef5.F \
+ ecdef6.F \
+ ecdef7.F \
+ ecdef8.F \
+ ecdef9.F \
+ ecloc1.F \
+ eggsec2.F \
+ elasec2.F \
+ ellsec2.F \
+ emesec2.F \
+ eocsec2.F \
+ epssec2.F \
+ eshsec2.F \
+ esvsec2.F \
+ emoscyc.F \
+ exscal.F \
+ extmap.F \
+ ftn1cr.F \
+ gbitmap.F \
+ gbyte.F \
+ gbytes.F \
+ genbin.F \
+ gendir.F \
+ gengrib.F \
+ getchd.F \
+ getfb2.F \
+ getfpd.F \
+ getib1.F \
+ getib2.F \
+ getib3.F \
+ getind.F \
+ getlgd.F \
+ getsys.F \
+ getusr.F \
+ grchk1.F \
+ grchk2.F \
+ grchk3.F \
+ grchk4.F \
+ gribex.F \
+ gribin.F \
+ gribnum.F \
+ grprs0.F \
+ grprs1.F \
+ grprs1b.F \
+ grprs2.F \
+ grprs3.F \
+ grprs4.F \
+ grprs4w.F \
+ grsdbg.F \
+ grsdef.F \
+ grsmax.F \
+ grsmkp.F \
+ grsmok.F \
+ grsn2o.F \
+ grsref.F \
+ grsrnd.F \
+ grsubc.F \
+ grsvck.F \
+ grsx2o.F \
+ gsbite.F \
+ gscale.F \
+ inscal.F \
+ insmp1.F \
+ insmp2.F \
+ inxbit.F \
+ inxmap.F \
+ kwchk1.F \
+ kwloc1.F \
+ kwprs1.F \
+ lnbfcr.F \
+ lngbcr.F \
+ maxmin.F \
+ maxmn2.F \
+ maxmni.F \
+ modval.F \
+ mxmncr.F \
+ offset.F \
+ offset2.F \
+ packcf.F \
+ prtbin.F \
+ prtbk1.F \
+ prtbk2.F \
+ prtbl1.F \
+ prtbl2.F \
+ ptquasi.F \
+ qu2reg.F \
+ qu2reg3.F \
+ reclen.F \
+ ref2grb.F \
+ remsp.F \
+ repchr.F \
+ revero.F \
+ rorint.F \
+ rowina.F \
+ rowina2.F \
+ rowina3.F \
+ rtb.F \
+ sbyte.F \
+ sbytes.F \
+ scm0.F \
+ setpar.F \
+ sort.F \
+ sortf.F \
+ tab2fil.F \
+ u2l1cr.F \
+ unbkin.F \
+ unbkout.F \
+ unblock.F \
+ uncmpck.F \
+ unpkcf.F \
+ vod2uv.F \
+ yyyy2cy.F
diff --git a/gribex/sources.FUJITSU b/gribex/sources.FUJITSU
new file mode 100755
index 0000000..75f105a
--- /dev/null
+++ b/gribex/sources.FUJITSU
@@ -0,0 +1,233 @@
+#
+# Sources for libemos/gribex
+#
+
+#EXTRAOBJ=cgsloop.o
+EXTRAOBJ=
+
+HEADERS = \
+ comars.h \
+ comcomm.h \
+ comgrb.h \
+ ecdef1.h \
+ ecdef2.h \
+ ecdef3.h \
+ ecdef4.h \
+ ecdef5.h \
+ ecdef6.h \
+ ecdef7.h \
+ ecdef8.h \
+ ecdef9.h \
+ ecdef10.h \
+ ecdef11.h \
+ ecdef12.h \
+ ecdef13.h \
+ ecdef14.h \
+ ecdef15.h \
+ ecdef16.h \
+ ecdef17.h \
+ ecdef18.h \
+ ecdef19.h \
+ ecdf190.h \
+ ecdf191.h \
+ ECMWFdefinitions.h \
+ gdecode.h \
+ gdecode1.h \
+ gdecode2.h \
+ gdecodeStruct.h \
+ getsetValues.h \
+ grbcom.h \
+ gribex.h \
+ handleLocalDefinitions.h \
+ sencode.h \
+ sencode1.h \
+ sencode2.h \
+ sfbits.h
+
+SOURCES.c = \
+ csgnbt.c \
+ dsgnbt.c \
+ ECMWFdefinitions.c \
+ findLocalDefinitionFile.c \
+ fortranInterface.c \
+ gdecode.c \
+ gdecode1.c \
+ gdecode2.c \
+ getsetValues.c \
+ grpr190.c \
+ handleLocalDefinitions.c \
+ jmalloc.c \
+ jfree.c \
+ orefdat.c \
+ sencode.c \
+ sencode1.c \
+ sencode2.c \
+ valpina.c
+# cgsloop.c
+
+SOURCES.f =
+
+SOURCES.F = \
+ abortx.F \
+ bufrin.F \
+ c2bitw.F \
+ c2cwid.F \
+ c2dosd.F \
+ c2gene.F \
+ c2ordr.F \
+ c2pack.F \
+ c2pkvw.F \
+ c2rnge.F \
+ c2rows.F \
+ calcop.F \
+ cheknum.F \
+ chktab2.F \
+ cmpck.F \
+ codegb.F \
+ codegc.F \
+ codegr.F \
+ codeps.F \
+ confp.F \
+ confp2.F \
+ confp3.F \
+ confpa.F \
+ csect4.F \
+ d2ordr.F \
+ d2rosd.F \
+ decext.F \
+ decfp.F \
+ decfp2.F \
+ decogb.F \
+ decogc.F \
+ decogd.F \
+ decogr.F \
+ decops.F \
+ decops2.F \
+ dggsec2.F \
+ dlasec2.F \
+ dllsec2.F \
+ dmesec2.F \
+ docsec2.F \
+ dpssec2.F \
+ dshsec2.F \
+ dsvsec2.F \
+ dsect4a.F \
+ ecdef1.F \
+ ecdef10.F \
+ ecdef11.F \
+ ecdef12.F \
+ ecdef13.F \
+ ecdef14.F \
+ ecdef15.F \
+ ecdef16.F \
+ ecdef17.F \
+ ecdef18.F \
+ ecdef19.F \
+ ecdef50.F \
+ ecdf191.F \
+ ecdef2.F \
+ ecdef3.F \
+ ecdef4.F \
+ ecdef5.F \
+ ecdef6.F \
+ ecdef7.F \
+ ecdef8.F \
+ ecdef9.F \
+ ecloc1.F \
+ eggsec2.F \
+ elasec2.F \
+ ellsec2.F \
+ emesec2.F \
+ eocsec2.F \
+ epssec2.F \
+ eshsec2.F \
+ esvsec2.F \
+ emoscyc.F \
+ exscal.F \
+ extmap.F \
+ ftn1cr.F \
+ gbitmap.F \
+ genbin.F \
+ gendir.F \
+ gengrib.F \
+ getchd.F \
+ getfb2.F \
+ getfpd.F \
+ getib1.F \
+ getib2.F \
+ getib3.F \
+ getind.F \
+ getlgd.F \
+ getsys.F \
+ getusr.F \
+ grchk1.F \
+ grchk2.F \
+ grchk3.F \
+ grchk4.F \
+ gribex.F \
+ gribin.F \
+ gribnum.F \
+ grprs0.F \
+ grprs1.F \
+ grprs1b.F \
+ grprs2.F \
+ grprs3.F \
+ grprs4.F \
+ grprs4w.F \
+ grsdbg.F \
+ grsdef.F \
+ grsmax.F \
+ grsmkp.F \
+ grsmok.F \
+ grsn2o.F \
+ grsref.F \
+ grsrnd.F \
+ grsubc.F \
+ grsvck.F \
+ grsx2o.F \
+ gsbite.F \
+ gscale.F \
+ inscal.F \
+ insmp1.F \
+ insmp2.F \
+ inxbit.F \
+ inxmap.F \
+ kwchk1.F \
+ kwloc1.F \
+ kwprs1.F \
+ lnbfcr.F \
+ lngbcr.F \
+ maxmin.F \
+ maxmn2.F \
+ maxmni.F \
+ modval.F \
+ mxmncr.F \
+ offset.F \
+ offset2.F \
+ packcf.F \
+ prtbin.F \
+ prtbk1.F \
+ prtbk2.F \
+ prtbl1.F \
+ prtbl2.F \
+ ptquasi.F \
+ qu2reg.F \
+ qu2reg3.F \
+ reclen.F \
+ ref2grb.F \
+ remsp.F \
+ repchr.F \
+ revero.F \
+ rorint.F \
+ rowina.F \
+ rowina2.F \
+ rowina3.F \
+ rtb.F \
+ scm0.F \
+ setpar.F \
+ tab2fil.F \
+ u2l1cr.F \
+ uncmpck.F \
+ unpkcf.F \
+ vod2uv.F \
+ yyyy2cy.F
diff --git a/gribex/sources.VPP5000 b/gribex/sources.VPP5000
new file mode 100755
index 0000000..75f105a
--- /dev/null
+++ b/gribex/sources.VPP5000
@@ -0,0 +1,233 @@
+#
+# Sources for libemos/gribex
+#
+
+#EXTRAOBJ=cgsloop.o
+EXTRAOBJ=
+
+HEADERS = \
+ comars.h \
+ comcomm.h \
+ comgrb.h \
+ ecdef1.h \
+ ecdef2.h \
+ ecdef3.h \
+ ecdef4.h \
+ ecdef5.h \
+ ecdef6.h \
+ ecdef7.h \
+ ecdef8.h \
+ ecdef9.h \
+ ecdef10.h \
+ ecdef11.h \
+ ecdef12.h \
+ ecdef13.h \
+ ecdef14.h \
+ ecdef15.h \
+ ecdef16.h \
+ ecdef17.h \
+ ecdef18.h \
+ ecdef19.h \
+ ecdf190.h \
+ ecdf191.h \
+ ECMWFdefinitions.h \
+ gdecode.h \
+ gdecode1.h \
+ gdecode2.h \
+ gdecodeStruct.h \
+ getsetValues.h \
+ grbcom.h \
+ gribex.h \
+ handleLocalDefinitions.h \
+ sencode.h \
+ sencode1.h \
+ sencode2.h \
+ sfbits.h
+
+SOURCES.c = \
+ csgnbt.c \
+ dsgnbt.c \
+ ECMWFdefinitions.c \
+ findLocalDefinitionFile.c \
+ fortranInterface.c \
+ gdecode.c \
+ gdecode1.c \
+ gdecode2.c \
+ getsetValues.c \
+ grpr190.c \
+ handleLocalDefinitions.c \
+ jmalloc.c \
+ jfree.c \
+ orefdat.c \
+ sencode.c \
+ sencode1.c \
+ sencode2.c \
+ valpina.c
+# cgsloop.c
+
+SOURCES.f =
+
+SOURCES.F = \
+ abortx.F \
+ bufrin.F \
+ c2bitw.F \
+ c2cwid.F \
+ c2dosd.F \
+ c2gene.F \
+ c2ordr.F \
+ c2pack.F \
+ c2pkvw.F \
+ c2rnge.F \
+ c2rows.F \
+ calcop.F \
+ cheknum.F \
+ chktab2.F \
+ cmpck.F \
+ codegb.F \
+ codegc.F \
+ codegr.F \
+ codeps.F \
+ confp.F \
+ confp2.F \
+ confp3.F \
+ confpa.F \
+ csect4.F \
+ d2ordr.F \
+ d2rosd.F \
+ decext.F \
+ decfp.F \
+ decfp2.F \
+ decogb.F \
+ decogc.F \
+ decogd.F \
+ decogr.F \
+ decops.F \
+ decops2.F \
+ dggsec2.F \
+ dlasec2.F \
+ dllsec2.F \
+ dmesec2.F \
+ docsec2.F \
+ dpssec2.F \
+ dshsec2.F \
+ dsvsec2.F \
+ dsect4a.F \
+ ecdef1.F \
+ ecdef10.F \
+ ecdef11.F \
+ ecdef12.F \
+ ecdef13.F \
+ ecdef14.F \
+ ecdef15.F \
+ ecdef16.F \
+ ecdef17.F \
+ ecdef18.F \
+ ecdef19.F \
+ ecdef50.F \
+ ecdf191.F \
+ ecdef2.F \
+ ecdef3.F \
+ ecdef4.F \
+ ecdef5.F \
+ ecdef6.F \
+ ecdef7.F \
+ ecdef8.F \
+ ecdef9.F \
+ ecloc1.F \
+ eggsec2.F \
+ elasec2.F \
+ ellsec2.F \
+ emesec2.F \
+ eocsec2.F \
+ epssec2.F \
+ eshsec2.F \
+ esvsec2.F \
+ emoscyc.F \
+ exscal.F \
+ extmap.F \
+ ftn1cr.F \
+ gbitmap.F \
+ genbin.F \
+ gendir.F \
+ gengrib.F \
+ getchd.F \
+ getfb2.F \
+ getfpd.F \
+ getib1.F \
+ getib2.F \
+ getib3.F \
+ getind.F \
+ getlgd.F \
+ getsys.F \
+ getusr.F \
+ grchk1.F \
+ grchk2.F \
+ grchk3.F \
+ grchk4.F \
+ gribex.F \
+ gribin.F \
+ gribnum.F \
+ grprs0.F \
+ grprs1.F \
+ grprs1b.F \
+ grprs2.F \
+ grprs3.F \
+ grprs4.F \
+ grprs4w.F \
+ grsdbg.F \
+ grsdef.F \
+ grsmax.F \
+ grsmkp.F \
+ grsmok.F \
+ grsn2o.F \
+ grsref.F \
+ grsrnd.F \
+ grsubc.F \
+ grsvck.F \
+ grsx2o.F \
+ gsbite.F \
+ gscale.F \
+ inscal.F \
+ insmp1.F \
+ insmp2.F \
+ inxbit.F \
+ inxmap.F \
+ kwchk1.F \
+ kwloc1.F \
+ kwprs1.F \
+ lnbfcr.F \
+ lngbcr.F \
+ maxmin.F \
+ maxmn2.F \
+ maxmni.F \
+ modval.F \
+ mxmncr.F \
+ offset.F \
+ offset2.F \
+ packcf.F \
+ prtbin.F \
+ prtbk1.F \
+ prtbk2.F \
+ prtbl1.F \
+ prtbl2.F \
+ ptquasi.F \
+ qu2reg.F \
+ qu2reg3.F \
+ reclen.F \
+ ref2grb.F \
+ remsp.F \
+ repchr.F \
+ revero.F \
+ rorint.F \
+ rowina.F \
+ rowina2.F \
+ rowina3.F \
+ rtb.F \
+ scm0.F \
+ setpar.F \
+ tab2fil.F \
+ u2l1cr.F \
+ uncmpck.F \
+ unpkcf.F \
+ vod2uv.F \
+ yyyy2cy.F
diff --git a/gribex/sources.decalpha b/gribex/sources.decalpha
new file mode 100755
index 0000000..3781ce8
--- /dev/null
+++ b/gribex/sources.decalpha
@@ -0,0 +1,229 @@
+#
+# Sources for libemos/gribex
+#
+
+HEADERS = \
+ comars.h \
+ comcomm.h \
+ comgrb.h \
+ ecdef1.h \
+ ecdef2.h \
+ ecdef3.h \
+ ecdef4.h \
+ ecdef5.h \
+ ecdef6.h \
+ ecdef7.h \
+ ecdef8.h \
+ ecdef9.h \
+ ecdef10.h \
+ ecdef11.h \
+ ecdef12.h \
+ ecdef13.h \
+ ecdef14.h \
+ ecdef15.h \
+ ecdef16.h \
+ ecdef17.h \
+ ecdef18.h \
+ ecdef19.h \
+ ecdf190.h \
+ ecdf191.h \
+ ECMWFdefinitions.h \
+ gdecode.h \
+ gdecode1.h \
+ gdecode2.h \
+ gdecodeStruct.h \
+ getsetValues.h \
+ grbcom.h \
+ gribex.h \
+ handleLocalDefinitions.h \
+ sencode.h \
+ sencode1.h \
+ sencode2.h \
+ sfbits.h
+
+SOURCES.c = \
+ csgnbt.c \
+ dsgnbt.c \
+ ECMWFdefinitions.c \
+ findLocalDefinitionFile.c \
+ fortranInterface.c \
+ gdecode.c \
+ gdecode1.c \
+ gdecode2.c \
+ getsetValues.c \
+ grpr190.c \
+ handleLocalDefinitions.c \
+ jmalloc.c \
+ jfree.c \
+ orefdat.c \
+ sencode.c \
+ sencode1.c \
+ sencode2.c \
+ swap4.c \
+ valpina.c
+
+SOURCES.f =
+
+SOURCES.F = \
+ abortx.F \
+ bufrin.F \
+ c2bitw.F \
+ c2cwid.F \
+ c2dosd.F \
+ c2gene.F \
+ c2ordr.F \
+ c2pack.F \
+ c2pkvw.F \
+ c2rnge.F \
+ c2rows.F \
+ calcop.F \
+ cheknum.F \
+ chktab2.F \
+ cmpck.F \
+ codegb.F \
+ codegc.F \
+ codegr.F \
+ codeps.F \
+ confp.F \
+ confp2.F \
+ confp3.F \
+ confpa.F \
+ csect4.F \
+ d2ordr.F \
+ d2rosd.F \
+ decext.F \
+ decfp.F \
+ decfp2.F \
+ decogb.F \
+ decogc.F \
+ decogd.F \
+ decogr.F \
+ decops.F \
+ decops2.F \
+ dggsec2.F \
+ dlasec2.F \
+ dllsec2.F \
+ dmesec2.F \
+ docsec2.F \
+ dpssec2.F \
+ dshsec2.F \
+ dsvsec2.F \
+ dsect4a.F \
+ ecdef1.F \
+ ecdef10.F \
+ ecdef11.F \
+ ecdef12.F \
+ ecdef13.F \
+ ecdef14.F \
+ ecdef15.F \
+ ecdef16.F \
+ ecdef17.F \
+ ecdef18.F \
+ ecdef19.F \
+ ecdef50.F \
+ ecdf191.F \
+ ecdef2.F \
+ ecdef3.F \
+ ecdef4.F \
+ ecdef5.F \
+ ecdef6.F \
+ ecdef7.F \
+ ecdef8.F \
+ ecdef9.F \
+ ecloc1.F \
+ eggsec2.F \
+ elasec2.F \
+ ellsec2.F \
+ emesec2.F \
+ eocsec2.F \
+ epssec2.F \
+ eshsec2.F \
+ esvsec2.F \
+ emoscyc.F \
+ exscal.F \
+ extmap.F \
+ ftn1cr.F \
+ gbitmap.F \
+ genbin.F \
+ gendir.F \
+ gengrib.F \
+ getchd.F \
+ getfb2.F \
+ getfpd.F \
+ getib1.F \
+ getib2.F \
+ getib3.F \
+ getind.F \
+ getlgd.F \
+ getsys.F \
+ getusr.F \
+ grchk1.F \
+ grchk2.F \
+ grchk3.F \
+ grchk4.F \
+ gribex.F \
+ gribin.F \
+ gribnum.F \
+ grprs0.F \
+ grprs1.F \
+ grprs1b.F \
+ grprs2.F \
+ grprs3.F \
+ grprs4.F \
+ grprs4w.F \
+ grsdbg.F \
+ grsdef.F \
+ grsmax.F \
+ grsmkp.F \
+ grsmok.F \
+ grsn2o.F \
+ grsref.F \
+ grsrnd.F \
+ grsubc.F \
+ grsvck.F \
+ grsx2o.F \
+ gscale.F \
+ inscal.F \
+ insmp1.F \
+ insmp2.F \
+ inxbit.F \
+ inxmap.F \
+ kwchk1.F \
+ kwloc1.F \
+ kwprs1.F \
+ lnbfcr.F \
+ lngbcr.F \
+ maxmin.F \
+ maxmn2.F \
+ maxmni.F \
+ modval.F \
+ mxmncr.F \
+ offset.F \
+ offset2.F \
+ packcf.F \
+ prtbin.F \
+ prtbk1.F \
+ prtbk2.F \
+ prtbl1.F \
+ prtbl2.F \
+ ptquasi.F \
+ qu2reg.F \
+ qu2reg3.F \
+ reclen.F \
+ ref2grb.F \
+ remsp.F \
+ repchr.F \
+ revero.F \
+ rorint.F \
+ rowina.F \
+ rowina2.F \
+ rowina3.F \
+ rtb.F \
+ scm0.F \
+ setpar.F \
+ tab2fil.F \
+ u2l1cr.F \
+ uncmpck.F \
+ unpkcf.F \
+ vod2uv.F \
+ yyyy2cy.F
diff --git a/gribex/sources.decmips b/gribex/sources.decmips
new file mode 100755
index 0000000..2d4ca77
--- /dev/null
+++ b/gribex/sources.decmips
@@ -0,0 +1,228 @@
+#
+# Sources for libemos/gribex for decmips.
+#
+
+HEADERS = \
+ comars.h \
+ comcomm.h \
+ comgrb.h \
+ ecdef1.h \
+ ecdef2.h \
+ ecdef3.h \
+ ecdef4.h \
+ ecdef5.h \
+ ecdef6.h \
+ ecdef7.h \
+ ecdef8.h \
+ ecdef9.h \
+ ecdef10.h \
+ ecdef11.h \
+ ecdef12.h \
+ ecdef13.h \
+ ecdef14.h \
+ ecdef15.h \
+ ecdef16.h \
+ ecdef17.h \
+ ecdef18.h \
+ ecdef19.h \
+ ecdf190.h \
+ ecdf191.h \
+ ECMWFdefinitions.h \
+ gdecode.h \
+ gdecode1.h \
+ gdecode2.h \
+ gdecodeStruct.h \
+ getsetValues.h \
+ grbcom.h \
+ gribex.h \
+ handleLocalDefinitions.h \
+ sencode.h \
+ sencode1.h \
+ sencode2.h \
+ sfbits.h
+
+SOURCES.c = \
+ csgnbt.c \
+ dsgnbt.c \
+ ECMWFdefinitions.c \
+ findLocalDefinitionFile.c \
+ fortranInterface.c \
+ gdecode.c \
+ gdecode1.c \
+ gdecode2.c \
+ getsetValues.c \
+ grpr190.c \
+ handleLocalDefinitions.c \
+ jmalloc.c \
+ jfree.c \
+ orefdat.c \
+ sencode.c \
+ sencode1.c \
+ sencode2.c \
+ valpina.c
+
+SOURCES.f =
+
+SOURCES.F = \
+ abortx.F \
+ bufrin.F \
+ c2bitw.F \
+ c2cwid.F \
+ c2dosd.F \
+ c2gene.F \
+ c2ordr.F \
+ c2pack.F \
+ c2pkvw.F \
+ c2rnge.F \
+ c2rows.F \
+ calcop.F \
+ cheknum.F \
+ chktab2.F \
+ cmpck.F \
+ codegb.F \
+ codegc.F \
+ codegr.F \
+ codeps.F \
+ confp.F \
+ confp2.F \
+ confp3.F \
+ confpa.F \
+ csect4.F \
+ d2ordr.F \
+ d2rosd.F \
+ decext.F \
+ decfp.F \
+ decfp2.F \
+ decogb.F \
+ decogc.F \
+ decogd.F \
+ decogr.F \
+ decops.F \
+ decops2.F \
+ dggsec2.F \
+ dlasec2.F \
+ dllsec2.F \
+ dmesec2.F \
+ docsec2.F \
+ dpssec2.F \
+ dshsec2.F \
+ dsvsec2.F \
+ dsect4a.F \
+ ecdef1.F \
+ ecdef10.F \
+ ecdef11.F \
+ ecdef12.F \
+ ecdef13.F \
+ ecdef14.F \
+ ecdef15.F \
+ ecdef16.F \
+ ecdef17.F \
+ ecdef18.F \
+ ecdef19.F \
+ ecdef50.F \
+ ecdf191.F \
+ ecdef2.F \
+ ecdef3.F \
+ ecdef4.F \
+ ecdef5.F \
+ ecdef6.F \
+ ecdef7.F \
+ ecdef8.F \
+ ecdef9.F \
+ ecloc1.F \
+ eggsec2.F \
+ elasec2.F \
+ ellsec2.F \
+ emesec2.F \
+ eocsec2.F \
+ epssec2.F \
+ eshsec2.F \
+ esvsec2.F \
+ emoscyc.F \
+ exscal.F \
+ extmap.F \
+ ftn1cr.F \
+ gbitmap.F \
+ genbin.F \
+ gendir.F \
+ gengrib.F \
+ getchd.F \
+ getfb2.F \
+ getfpd.F \
+ getib1.F \
+ getib2.F \
+ getib3.F \
+ getind.F \
+ getlgd.F \
+ getsys.F \
+ getusr.F \
+ grchk1.F \
+ grchk2.F \
+ grchk3.F \
+ grchk4.F \
+ gribex.F \
+ gribin.F \
+ gribnum.F \
+ grprs0.F \
+ grprs1.F \
+ grprs1b.F \
+ grprs2.F \
+ grprs3.F \
+ grprs4.F \
+ grprs4w.F \
+ grsdbg.F \
+ grsdef.F \
+ grsmax.F \
+ grsmkp.F \
+ grsmok.F \
+ grsn2o.F \
+ grsref.F \
+ grsrnd.F \
+ grsubc.F \
+ grsvck.F \
+ grsx2o.F \
+ gscale.F \
+ inscal.F \
+ insmp1.F \
+ insmp2.F \
+ inxbit.F \
+ inxmap.F \
+ kwchk1.F \
+ kwloc1.F \
+ kwprs1.F \
+ lnbfcr.F \
+ lngbcr.F \
+ maxmin.F \
+ maxmn2.F \
+ maxmni.F \
+ modval.F \
+ mxmncr.F \
+ offset.F \
+ offset2.F \
+ packcf.F \
+ prtbin.F \
+ prtbk1.F \
+ prtbk2.F \
+ prtbl1.F \
+ prtbl2.F \
+ ptquasi.F \
+ qu2reg.F \
+ qu2reg3.F \
+ reclen.F \
+ ref2grb.F \
+ remsp.F \
+ repchr.F \
+ revero.F \
+ rorint.F \
+ rowina.F \
+ rowina2.F \
+ rowina3.F \
+ rtb.F \
+ scm0.F \
+ setpar.F \
+ tab2fil.F \
+ u2l1cr.F \
+ uncmpck.F \
+ unpkcf.F \
+ vod2uv.F \
+ yyyy2cy.F
diff --git a/gribex/sources.hpia64 b/gribex/sources.hpia64
new file mode 100755
index 0000000..5b777f6
--- /dev/null
+++ b/gribex/sources.hpia64
@@ -0,0 +1,218 @@
+#
+# Sources for libemos/gribex for hppa
+#
+
+HEADERS = \
+ comars.h \
+ comcomm.h \
+ comgrb.h \
+ ecdef1.h \
+ ecdef2.h \
+ ecdef3.h \
+ ecdef4.h \
+ ecdef5.h \
+ ecdef6.h \
+ ecdef7.h \
+ ecdef8.h \
+ ecdef9.h \
+ ecdef10.h \
+ ecdef11.h \
+ ecdef12.h \
+ ecdef13.h \
+ ecdef14.h \
+ ecdef15.h \
+ ecdef16.h \
+ ecdef17.h \
+ ecdef18.h \
+ ecdef19.h \
+ ecdf190.h \
+ ecdf191.h \
+ ECMWFdefinitions.h \
+ gdecode.h \
+ gdecode1.h \
+ gdecode2.h \
+ gdecodeStruct.h \
+ getsetValues.h \
+ grbcom.h \
+ gribex.h \
+ handleLocalDefinitions.h \
+ sencode.h \
+ sencode1.h \
+ sencode2.h \
+ sfbits.h
+
+SOURCES.c = \
+ csgnbt.c \
+ dsgnbt.c \
+ ECMWFdefinitions.c \
+ findLocalDefinitionFile.c \
+ fortranInterface.c \
+ jabort.c \
+ gdecode.c \
+ gdecode1.c \
+ gdecode2.c \
+ getsetValues.c \
+ grpr190.c \
+ handleLocalDefinitions.c \
+ jmalloc.c \
+ jfree.c \
+ orefdat.c \
+ sencode.c \
+ sencode1.c \
+ sencode2.c \
+ valpina.c
+
+SOURCES.f =
+
+SOURCES.F = \
+ abortx.F \
+ bufrin.F \
+ c2bitw.F \
+ c2cwid.F \
+ c2dosd.F \
+ c2gene.F \
+ c2ordr.F \
+ c2pack.F \
+ c2pkvw.F \
+ c2rnge.F \
+ c2rows.F \
+ calcop.F \
+ cheknum.F \
+ chktab2.F \
+ cmpck.F \
+ codegb.F \
+ codegc.F \
+ codegr.F \
+ codeps.F \
+ confp.F \
+ confp2.F \
+ confp3.F \
+ confpa.F \
+ csect4.F \
+ d2ordr.F \
+ d2rosd.F \
+ decext.F \
+ decfp.F \
+ decfp2.F \
+ decogb.F \
+ decogc.F \
+ decogd.F \
+ decogr.F \
+ decops.F \
+ decops2.F \
+ dggsec2.F \
+ dlasec2.F \
+ dllsec2.F \
+ dmesec2.F \
+ docsec2.F \
+ dpssec2.F \
+ dshsec2.F \
+ dsvsec2.F \
+ dsect4a.F \
+ ecdef1.F \
+ ecdef10.F \
+ ecdef11.F \
+ ecdef12.F \
+ ecdef13.F \
+ ecdef14.F \
+ ecdef15.F \
+ ecdef16.F \
+ ecdef17.F \
+ ecdef18.F \
+ ecdef19.F \
+ ecdef50.F \
+ ecdf191.F \
+ ecdef2.F \
+ ecdef3.F \
+ ecdef4.F \
+ ecdef5.F \
+ ecdef6.F \
+ ecdef7.F \
+ ecdef8.F \
+ ecdef9.F \
+ ecloc1.F \
+ eggsec2.F \
+ elasec2.F \
+ ellsec2.F \
+ emesec2.F \
+ eocsec2.F \
+ epssec2.F \
+ eshsec2.F \
+ esvsec2.F \
+ emoscyc.F \
+ exscal.F \
+ extmap.F \
+ ftn1cr.F \
+ gbitmap.F \
+ genbin.F \
+ gengrib.F \
+ getsys.F \
+ getusr.F \
+ grchk1.F \
+ grchk2.F \
+ grchk3.F \
+ grchk4.F \
+ gribex.F \
+ gribin.F \
+ gribnum.F \
+ grprs0.F \
+ grprs1.F \
+ grprs1b.F \
+ grprs2.F \
+ grprs3.F \
+ grprs4.F \
+ grprs4w.F \
+ grsdbg.F \
+ grsdef.F \
+ grsmax.F \
+ grsmkp.F \
+ grsmok.F \
+ grsn2o.F \
+ grsref.F \
+ grsrnd.F \
+ grsubc.F \
+ grsvck.F \
+ grsx2o.F \
+ gscale.F \
+ inscal.F \
+ insmp1.F \
+ insmp2.F \
+ inxbit.F \
+ inxmap.F \
+ kwchk1.F \
+ kwloc1.F \
+ kwprs1.F \
+ maxmin.F \
+ maxmn2.F \
+ maxmni.F \
+ modval.F \
+ mxmncr.F \
+ offset.F \
+ offset2.F \
+ packcf.F \
+ prtbin.F \
+ prtbk1.F \
+ prtbk2.F \
+ prtbl1.F \
+ prtbl2.F \
+ ptquasi.F \
+ qu2reg.F \
+ qu2reg3.F \
+ reclen.F \
+ ref2grb.F \
+ remsp.F \
+ repchr.F \
+ revero.F \
+ rorint.F \
+ rowina.F \
+ rowina2.F \
+ rowina3.F \
+ rtb.F \
+ scm0.F \
+ setpar.F \
+ tab2fil.F \
+ u2l1cr.F \
+ uncmpck.F \
+ unpkcf.F \
+ vod2uv.F \
+ yyyy2cy.F
diff --git a/gribex/sources.hppa b/gribex/sources.hppa
new file mode 100755
index 0000000..5b777f6
--- /dev/null
+++ b/gribex/sources.hppa
@@ -0,0 +1,218 @@
+#
+# Sources for libemos/gribex for hppa
+#
+
+HEADERS = \
+ comars.h \
+ comcomm.h \
+ comgrb.h \
+ ecdef1.h \
+ ecdef2.h \
+ ecdef3.h \
+ ecdef4.h \
+ ecdef5.h \
+ ecdef6.h \
+ ecdef7.h \
+ ecdef8.h \
+ ecdef9.h \
+ ecdef10.h \
+ ecdef11.h \
+ ecdef12.h \
+ ecdef13.h \
+ ecdef14.h \
+ ecdef15.h \
+ ecdef16.h \
+ ecdef17.h \
+ ecdef18.h \
+ ecdef19.h \
+ ecdf190.h \
+ ecdf191.h \
+ ECMWFdefinitions.h \
+ gdecode.h \
+ gdecode1.h \
+ gdecode2.h \
+ gdecodeStruct.h \
+ getsetValues.h \
+ grbcom.h \
+ gribex.h \
+ handleLocalDefinitions.h \
+ sencode.h \
+ sencode1.h \
+ sencode2.h \
+ sfbits.h
+
+SOURCES.c = \
+ csgnbt.c \
+ dsgnbt.c \
+ ECMWFdefinitions.c \
+ findLocalDefinitionFile.c \
+ fortranInterface.c \
+ jabort.c \
+ gdecode.c \
+ gdecode1.c \
+ gdecode2.c \
+ getsetValues.c \
+ grpr190.c \
+ handleLocalDefinitions.c \
+ jmalloc.c \
+ jfree.c \
+ orefdat.c \
+ sencode.c \
+ sencode1.c \
+ sencode2.c \
+ valpina.c
+
+SOURCES.f =
+
+SOURCES.F = \
+ abortx.F \
+ bufrin.F \
+ c2bitw.F \
+ c2cwid.F \
+ c2dosd.F \
+ c2gene.F \
+ c2ordr.F \
+ c2pack.F \
+ c2pkvw.F \
+ c2rnge.F \
+ c2rows.F \
+ calcop.F \
+ cheknum.F \
+ chktab2.F \
+ cmpck.F \
+ codegb.F \
+ codegc.F \
+ codegr.F \
+ codeps.F \
+ confp.F \
+ confp2.F \
+ confp3.F \
+ confpa.F \
+ csect4.F \
+ d2ordr.F \
+ d2rosd.F \
+ decext.F \
+ decfp.F \
+ decfp2.F \
+ decogb.F \
+ decogc.F \
+ decogd.F \
+ decogr.F \
+ decops.F \
+ decops2.F \
+ dggsec2.F \
+ dlasec2.F \
+ dllsec2.F \
+ dmesec2.F \
+ docsec2.F \
+ dpssec2.F \
+ dshsec2.F \
+ dsvsec2.F \
+ dsect4a.F \
+ ecdef1.F \
+ ecdef10.F \
+ ecdef11.F \
+ ecdef12.F \
+ ecdef13.F \
+ ecdef14.F \
+ ecdef15.F \
+ ecdef16.F \
+ ecdef17.F \
+ ecdef18.F \
+ ecdef19.F \
+ ecdef50.F \
+ ecdf191.F \
+ ecdef2.F \
+ ecdef3.F \
+ ecdef4.F \
+ ecdef5.F \
+ ecdef6.F \
+ ecdef7.F \
+ ecdef8.F \
+ ecdef9.F \
+ ecloc1.F \
+ eggsec2.F \
+ elasec2.F \
+ ellsec2.F \
+ emesec2.F \
+ eocsec2.F \
+ epssec2.F \
+ eshsec2.F \
+ esvsec2.F \
+ emoscyc.F \
+ exscal.F \
+ extmap.F \
+ ftn1cr.F \
+ gbitmap.F \
+ genbin.F \
+ gengrib.F \
+ getsys.F \
+ getusr.F \
+ grchk1.F \
+ grchk2.F \
+ grchk3.F \
+ grchk4.F \
+ gribex.F \
+ gribin.F \
+ gribnum.F \
+ grprs0.F \
+ grprs1.F \
+ grprs1b.F \
+ grprs2.F \
+ grprs3.F \
+ grprs4.F \
+ grprs4w.F \
+ grsdbg.F \
+ grsdef.F \
+ grsmax.F \
+ grsmkp.F \
+ grsmok.F \
+ grsn2o.F \
+ grsref.F \
+ grsrnd.F \
+ grsubc.F \
+ grsvck.F \
+ grsx2o.F \
+ gscale.F \
+ inscal.F \
+ insmp1.F \
+ insmp2.F \
+ inxbit.F \
+ inxmap.F \
+ kwchk1.F \
+ kwloc1.F \
+ kwprs1.F \
+ maxmin.F \
+ maxmn2.F \
+ maxmni.F \
+ modval.F \
+ mxmncr.F \
+ offset.F \
+ offset2.F \
+ packcf.F \
+ prtbin.F \
+ prtbk1.F \
+ prtbk2.F \
+ prtbl1.F \
+ prtbl2.F \
+ ptquasi.F \
+ qu2reg.F \
+ qu2reg3.F \
+ reclen.F \
+ ref2grb.F \
+ remsp.F \
+ repchr.F \
+ revero.F \
+ rorint.F \
+ rowina.F \
+ rowina2.F \
+ rowina3.F \
+ rtb.F \
+ scm0.F \
+ setpar.F \
+ tab2fil.F \
+ u2l1cr.F \
+ uncmpck.F \
+ unpkcf.F \
+ vod2uv.F \
+ yyyy2cy.F
diff --git a/gribex/sources.ibm_power4 b/gribex/sources.ibm_power4
new file mode 100755
index 0000000..7b7745e
--- /dev/null
+++ b/gribex/sources.ibm_power4
@@ -0,0 +1,229 @@
+#
+# Sources for libemos/gribex for rs6000.
+#
+
+HEADERS = \
+ comars.h \
+ comcomm.h \
+ comgrb.h \
+ ecdef1.h \
+ ecdef2.h \
+ ecdef3.h \
+ ecdef4.h \
+ ecdef5.h \
+ ecdef6.h \
+ ecdef7.h \
+ ecdef8.h \
+ ecdef9.h \
+ ecdef10.h \
+ ecdef11.h \
+ ecdef12.h \
+ ecdef13.h \
+ ecdef14.h \
+ ecdef15.h \
+ ecdef16.h \
+ ecdef17.h \
+ ecdef18.h \
+ ecdef19.h \
+ ecdf190.h \
+ ecdf191.h \
+ ECMWFdefinitions.h \
+ gdecode.h \
+ gdecode1.h \
+ gdecode2.h \
+ gdecodeStruct.h \
+ getsetValues.h \
+ grbcom.h \
+ gribex.h \
+ handleLocalDefinitions.h \
+ sencode.h \
+ sencode1.h \
+ sencode2.h \
+ sfbits.h
+
+SOURCES.c = \
+ csgnbt.c \
+ dsgnbt.c \
+ ECMWFdefinitions.c \
+ findLocalDefinitionFile.c \
+ fortranInterface.c \
+ gdecode.c \
+ gdecode1.c \
+ gdecode2.c \
+ getsetValues.c \
+ grpr190.c \
+ handleLocalDefinitions.c \
+ jmalloc.c \
+ jfree.c \
+ orefdat.c \
+ sencode.c \
+ sencode1.c \
+ sencode2.c \
+ valpina.c
+
+SOURCES.f =
+
+SOURCES.F = \
+ abortx.F \
+ bufrin.F \
+ c2bitw.F \
+ c2cwid.F \
+ c2dosd.F \
+ c2gene.F \
+ c2ordr.F \
+ c2pack.F \
+ c2pkvw.F \
+ c2rnge.F \
+ c2rows.F \
+ calcop.F \
+ cheknum.F \
+ chktab2.F \
+ cmpck.F \
+ codegb.F \
+ codegc.F \
+ codegr.F \
+ codeps.F \
+ confp.F \
+ confp2.F \
+ confp3.F \
+ confpa.F \
+ csect4.F \
+ d2ordr.F \
+ d2rosd.F \
+ decext.F \
+ decfp.F \
+ decfp2.F \
+ decogb.F \
+ decogc.F \
+ decogd.F \
+ decogr.F \
+ decops.F \
+ decops2.F \
+ dggsec2.F \
+ dlasec2.F \
+ dllsec2.F \
+ dmesec2.F \
+ docsec2.F \
+ dpssec2.F \
+ dshsec2.F \
+ dsvsec2.F \
+ dsect4a.F \
+ ecdef1.F \
+ ecdef10.F \
+ ecdef11.F \
+ ecdef12.F \
+ ecdef13.F \
+ ecdef14.F \
+ ecdef15.F \
+ ecdef16.F \
+ ecdef17.F \
+ ecdef18.F \
+ ecdef19.F \
+ ecdef50.F \
+ ecdf191.F \
+ ecdef2.F \
+ ecdef3.F \
+ ecdef4.F \
+ ecdef5.F \
+ ecdef6.F \
+ ecdef7.F \
+ ecdef8.F \
+ ecdef9.F \
+ ecloc1.F \
+ eggsec2.F \
+ elasec2.F \
+ ellsec2.F \
+ emesec2.F \
+ eocsec2.F \
+ epssec2.F \
+ eshsec2.F \
+ esvsec2.F \
+ emoscyc.F \
+ exscal.F \
+ extmap.F \
+ ftn1cr.F \
+ gbitmap.F \
+ genbin.F \
+ gendir.F \
+ gengrib.F \
+ getchd.F \
+ getfb2.F \
+ getfpd.F \
+ getib1.F \
+ getib2.F \
+ getib3.F \
+ getind.F \
+ getlgd.F \
+ getsys.F \
+ getusr.F \
+ grchk1.F \
+ grchk2.F \
+ grchk3.F \
+ grchk4.F \
+ gribex.F \
+ gribin.F \
+ gribnum.F \
+ grprs0.F \
+ grprs1.F \
+ grprs1b.F \
+ grprs2.F \
+ grprs3.F \
+ grprs4.F \
+ grprs4w.F \
+ grsdbg.F \
+ grsdef.F \
+ grsmax.F \
+ grsmkp.F \
+ grsmok.F \
+ grsn2o.F \
+ grsref.F \
+ grsrnd.F \
+ grsubc.F \
+ grsvck.F \
+ grsx2o.F \
+ gsbite.F \
+ gscale.F \
+ inscal.F \
+ insmp1.F \
+ insmp2.F \
+ inxbit.F \
+ inxmap.F \
+ kwchk1.F \
+ kwloc1.F \
+ kwprs1.F \
+ lnbfcr.F \
+ lngbcr.F \
+ maxmin.F \
+ maxmn2.F \
+ maxmni.F \
+ modval.F \
+ mxmncr.F \
+ offset.F \
+ offset2.F \
+ packcf.F \
+ prtbin.F \
+ prtbk1.F \
+ prtbk2.F \
+ prtbl1.F \
+ prtbl2.F \
+ ptquasi.F \
+ qu2reg.F \
+ qu2reg3.F \
+ reclen.F \
+ ref2grb.F \
+ remsp.F \
+ repchr.F \
+ revero.F \
+ rorint.F \
+ rowina.F \
+ rowina2.F \
+ rowina3.F \
+ rtb.F \
+ scm0.F \
+ setpar.F \
+ tab2fil.F \
+ u2l1cr.F \
+ uncmpck.F \
+ unpkcf.F \
+ vod2uv.F \
+ yyyy2cy.F
diff --git a/gribex/sources.ibm_power6 b/gribex/sources.ibm_power6
new file mode 100755
index 0000000..7b7745e
--- /dev/null
+++ b/gribex/sources.ibm_power6
@@ -0,0 +1,229 @@
+#
+# Sources for libemos/gribex for rs6000.
+#
+
+HEADERS = \
+ comars.h \
+ comcomm.h \
+ comgrb.h \
+ ecdef1.h \
+ ecdef2.h \
+ ecdef3.h \
+ ecdef4.h \
+ ecdef5.h \
+ ecdef6.h \
+ ecdef7.h \
+ ecdef8.h \
+ ecdef9.h \
+ ecdef10.h \
+ ecdef11.h \
+ ecdef12.h \
+ ecdef13.h \
+ ecdef14.h \
+ ecdef15.h \
+ ecdef16.h \
+ ecdef17.h \
+ ecdef18.h \
+ ecdef19.h \
+ ecdf190.h \
+ ecdf191.h \
+ ECMWFdefinitions.h \
+ gdecode.h \
+ gdecode1.h \
+ gdecode2.h \
+ gdecodeStruct.h \
+ getsetValues.h \
+ grbcom.h \
+ gribex.h \
+ handleLocalDefinitions.h \
+ sencode.h \
+ sencode1.h \
+ sencode2.h \
+ sfbits.h
+
+SOURCES.c = \
+ csgnbt.c \
+ dsgnbt.c \
+ ECMWFdefinitions.c \
+ findLocalDefinitionFile.c \
+ fortranInterface.c \
+ gdecode.c \
+ gdecode1.c \
+ gdecode2.c \
+ getsetValues.c \
+ grpr190.c \
+ handleLocalDefinitions.c \
+ jmalloc.c \
+ jfree.c \
+ orefdat.c \
+ sencode.c \
+ sencode1.c \
+ sencode2.c \
+ valpina.c
+
+SOURCES.f =
+
+SOURCES.F = \
+ abortx.F \
+ bufrin.F \
+ c2bitw.F \
+ c2cwid.F \
+ c2dosd.F \
+ c2gene.F \
+ c2ordr.F \
+ c2pack.F \
+ c2pkvw.F \
+ c2rnge.F \
+ c2rows.F \
+ calcop.F \
+ cheknum.F \
+ chktab2.F \
+ cmpck.F \
+ codegb.F \
+ codegc.F \
+ codegr.F \
+ codeps.F \
+ confp.F \
+ confp2.F \
+ confp3.F \
+ confpa.F \
+ csect4.F \
+ d2ordr.F \
+ d2rosd.F \
+ decext.F \
+ decfp.F \
+ decfp2.F \
+ decogb.F \
+ decogc.F \
+ decogd.F \
+ decogr.F \
+ decops.F \
+ decops2.F \
+ dggsec2.F \
+ dlasec2.F \
+ dllsec2.F \
+ dmesec2.F \
+ docsec2.F \
+ dpssec2.F \
+ dshsec2.F \
+ dsvsec2.F \
+ dsect4a.F \
+ ecdef1.F \
+ ecdef10.F \
+ ecdef11.F \
+ ecdef12.F \
+ ecdef13.F \
+ ecdef14.F \
+ ecdef15.F \
+ ecdef16.F \
+ ecdef17.F \
+ ecdef18.F \
+ ecdef19.F \
+ ecdef50.F \
+ ecdf191.F \
+ ecdef2.F \
+ ecdef3.F \
+ ecdef4.F \
+ ecdef5.F \
+ ecdef6.F \
+ ecdef7.F \
+ ecdef8.F \
+ ecdef9.F \
+ ecloc1.F \
+ eggsec2.F \
+ elasec2.F \
+ ellsec2.F \
+ emesec2.F \
+ eocsec2.F \
+ epssec2.F \
+ eshsec2.F \
+ esvsec2.F \
+ emoscyc.F \
+ exscal.F \
+ extmap.F \
+ ftn1cr.F \
+ gbitmap.F \
+ genbin.F \
+ gendir.F \
+ gengrib.F \
+ getchd.F \
+ getfb2.F \
+ getfpd.F \
+ getib1.F \
+ getib2.F \
+ getib3.F \
+ getind.F \
+ getlgd.F \
+ getsys.F \
+ getusr.F \
+ grchk1.F \
+ grchk2.F \
+ grchk3.F \
+ grchk4.F \
+ gribex.F \
+ gribin.F \
+ gribnum.F \
+ grprs0.F \
+ grprs1.F \
+ grprs1b.F \
+ grprs2.F \
+ grprs3.F \
+ grprs4.F \
+ grprs4w.F \
+ grsdbg.F \
+ grsdef.F \
+ grsmax.F \
+ grsmkp.F \
+ grsmok.F \
+ grsn2o.F \
+ grsref.F \
+ grsrnd.F \
+ grsubc.F \
+ grsvck.F \
+ grsx2o.F \
+ gsbite.F \
+ gscale.F \
+ inscal.F \
+ insmp1.F \
+ insmp2.F \
+ inxbit.F \
+ inxmap.F \
+ kwchk1.F \
+ kwloc1.F \
+ kwprs1.F \
+ lnbfcr.F \
+ lngbcr.F \
+ maxmin.F \
+ maxmn2.F \
+ maxmni.F \
+ modval.F \
+ mxmncr.F \
+ offset.F \
+ offset2.F \
+ packcf.F \
+ prtbin.F \
+ prtbk1.F \
+ prtbk2.F \
+ prtbl1.F \
+ prtbl2.F \
+ ptquasi.F \
+ qu2reg.F \
+ qu2reg3.F \
+ reclen.F \
+ ref2grb.F \
+ remsp.F \
+ repchr.F \
+ revero.F \
+ rorint.F \
+ rowina.F \
+ rowina2.F \
+ rowina3.F \
+ rtb.F \
+ scm0.F \
+ setpar.F \
+ tab2fil.F \
+ u2l1cr.F \
+ uncmpck.F \
+ unpkcf.F \
+ vod2uv.F \
+ yyyy2cy.F
diff --git a/gribex/sources.ibm_power7 b/gribex/sources.ibm_power7
new file mode 100755
index 0000000..7b7745e
--- /dev/null
+++ b/gribex/sources.ibm_power7
@@ -0,0 +1,229 @@
+#
+# Sources for libemos/gribex for rs6000.
+#
+
+HEADERS = \
+ comars.h \
+ comcomm.h \
+ comgrb.h \
+ ecdef1.h \
+ ecdef2.h \
+ ecdef3.h \
+ ecdef4.h \
+ ecdef5.h \
+ ecdef6.h \
+ ecdef7.h \
+ ecdef8.h \
+ ecdef9.h \
+ ecdef10.h \
+ ecdef11.h \
+ ecdef12.h \
+ ecdef13.h \
+ ecdef14.h \
+ ecdef15.h \
+ ecdef16.h \
+ ecdef17.h \
+ ecdef18.h \
+ ecdef19.h \
+ ecdf190.h \
+ ecdf191.h \
+ ECMWFdefinitions.h \
+ gdecode.h \
+ gdecode1.h \
+ gdecode2.h \
+ gdecodeStruct.h \
+ getsetValues.h \
+ grbcom.h \
+ gribex.h \
+ handleLocalDefinitions.h \
+ sencode.h \
+ sencode1.h \
+ sencode2.h \
+ sfbits.h
+
+SOURCES.c = \
+ csgnbt.c \
+ dsgnbt.c \
+ ECMWFdefinitions.c \
+ findLocalDefinitionFile.c \
+ fortranInterface.c \
+ gdecode.c \
+ gdecode1.c \
+ gdecode2.c \
+ getsetValues.c \
+ grpr190.c \
+ handleLocalDefinitions.c \
+ jmalloc.c \
+ jfree.c \
+ orefdat.c \
+ sencode.c \
+ sencode1.c \
+ sencode2.c \
+ valpina.c
+
+SOURCES.f =
+
+SOURCES.F = \
+ abortx.F \
+ bufrin.F \
+ c2bitw.F \
+ c2cwid.F \
+ c2dosd.F \
+ c2gene.F \
+ c2ordr.F \
+ c2pack.F \
+ c2pkvw.F \
+ c2rnge.F \
+ c2rows.F \
+ calcop.F \
+ cheknum.F \
+ chktab2.F \
+ cmpck.F \
+ codegb.F \
+ codegc.F \
+ codegr.F \
+ codeps.F \
+ confp.F \
+ confp2.F \
+ confp3.F \
+ confpa.F \
+ csect4.F \
+ d2ordr.F \
+ d2rosd.F \
+ decext.F \
+ decfp.F \
+ decfp2.F \
+ decogb.F \
+ decogc.F \
+ decogd.F \
+ decogr.F \
+ decops.F \
+ decops2.F \
+ dggsec2.F \
+ dlasec2.F \
+ dllsec2.F \
+ dmesec2.F \
+ docsec2.F \
+ dpssec2.F \
+ dshsec2.F \
+ dsvsec2.F \
+ dsect4a.F \
+ ecdef1.F \
+ ecdef10.F \
+ ecdef11.F \
+ ecdef12.F \
+ ecdef13.F \
+ ecdef14.F \
+ ecdef15.F \
+ ecdef16.F \
+ ecdef17.F \
+ ecdef18.F \
+ ecdef19.F \
+ ecdef50.F \
+ ecdf191.F \
+ ecdef2.F \
+ ecdef3.F \
+ ecdef4.F \
+ ecdef5.F \
+ ecdef6.F \
+ ecdef7.F \
+ ecdef8.F \
+ ecdef9.F \
+ ecloc1.F \
+ eggsec2.F \
+ elasec2.F \
+ ellsec2.F \
+ emesec2.F \
+ eocsec2.F \
+ epssec2.F \
+ eshsec2.F \
+ esvsec2.F \
+ emoscyc.F \
+ exscal.F \
+ extmap.F \
+ ftn1cr.F \
+ gbitmap.F \
+ genbin.F \
+ gendir.F \
+ gengrib.F \
+ getchd.F \
+ getfb2.F \
+ getfpd.F \
+ getib1.F \
+ getib2.F \
+ getib3.F \
+ getind.F \
+ getlgd.F \
+ getsys.F \
+ getusr.F \
+ grchk1.F \
+ grchk2.F \
+ grchk3.F \
+ grchk4.F \
+ gribex.F \
+ gribin.F \
+ gribnum.F \
+ grprs0.F \
+ grprs1.F \
+ grprs1b.F \
+ grprs2.F \
+ grprs3.F \
+ grprs4.F \
+ grprs4w.F \
+ grsdbg.F \
+ grsdef.F \
+ grsmax.F \
+ grsmkp.F \
+ grsmok.F \
+ grsn2o.F \
+ grsref.F \
+ grsrnd.F \
+ grsubc.F \
+ grsvck.F \
+ grsx2o.F \
+ gsbite.F \
+ gscale.F \
+ inscal.F \
+ insmp1.F \
+ insmp2.F \
+ inxbit.F \
+ inxmap.F \
+ kwchk1.F \
+ kwloc1.F \
+ kwprs1.F \
+ lnbfcr.F \
+ lngbcr.F \
+ maxmin.F \
+ maxmn2.F \
+ maxmni.F \
+ modval.F \
+ mxmncr.F \
+ offset.F \
+ offset2.F \
+ packcf.F \
+ prtbin.F \
+ prtbk1.F \
+ prtbk2.F \
+ prtbl1.F \
+ prtbl2.F \
+ ptquasi.F \
+ qu2reg.F \
+ qu2reg3.F \
+ reclen.F \
+ ref2grb.F \
+ remsp.F \
+ repchr.F \
+ revero.F \
+ rorint.F \
+ rowina.F \
+ rowina2.F \
+ rowina3.F \
+ rtb.F \
+ scm0.F \
+ setpar.F \
+ tab2fil.F \
+ u2l1cr.F \
+ uncmpck.F \
+ unpkcf.F \
+ vod2uv.F \
+ yyyy2cy.F
diff --git a/gribex/sources.itanium b/gribex/sources.itanium
new file mode 100755
index 0000000..f98c6ac
--- /dev/null
+++ b/gribex/sources.itanium
@@ -0,0 +1,222 @@
+#
+# Sources for libemos/gribex for sgimips.
+#
+
+HEADERS = \
+ comars.h \
+ comcomm.h \
+ comgrb.h \
+ ecdef1.h \
+ ecdef2.h \
+ ecdef3.h \
+ ecdef4.h \
+ ecdef5.h \
+ ecdef6.h \
+ ecdef7.h \
+ ecdef8.h \
+ ecdef9.h \
+ ecdef10.h \
+ ecdef11.h \
+ ecdef12.h \
+ ecdef13.h \
+ ecdef14.h \
+ ecdef15.h \
+ ecdef16.h \
+ ecdef17.h \
+ ecdef18.h \
+ ecdef19.h \
+ ecdf190.h \
+ ecdf191.h \
+ ECMWFdefinitions.h \
+ gdecode.h \
+ gdecode1.h \
+ gdecode2.h \
+ gdecodeStruct.h \
+ getsetValues.h \
+ grbcom.h \
+ gribex.h \
+ handleLocalDefinitions.h \
+ sencode.h \
+ sencode1.h \
+ sencode2.h \
+ sfbits.h
+
+SOURCES.c = \
+ csgnbt.c \
+ dsgnbt.c \
+ ECMWFdefinitions.c \
+ findLocalDefinitionFile.c \
+ fortranInterface.c \
+ gdecode.c \
+ gdecode1.c \
+ gdecode2.c \
+ getsetValues.c \
+ grpr190.c \
+ handleLocalDefinitions.c \
+ jmalloc.c \
+ jfree.c \
+ orefdat.c \
+ sencode.c \
+ sencode1.c \
+ sencode2.c \
+ swap4.c \
+ valpina.c
+
+SOURCES.f =
+
+SOURCES.F = \
+ abortx.F \
+ bufrin.F \
+ c2bitw.F \
+ c2cwid.F \
+ c2dosd.F \
+ c2gene.F \
+ c2ordr.F \
+ c2pack.F \
+ c2pkvw.F \
+ c2rnge.F \
+ c2rows.F \
+ calcop.F \
+ cheknum.F \
+ chktab2.F \
+ cmpck.F \
+ codeps.F \
+ confp.F \
+ confp2.F \
+ confp3.F \
+ confpa.F \
+ csect4.F \
+ d2ordr.F \
+ d2rosd.F \
+ decext.F \
+ decfp.F \
+ decfp2.F \
+ decogb.F \
+ decogc.F \
+ decogd.F \
+ decogr.F \
+ decops.F \
+ decops2.F \
+ dggsec2.F \
+ dlasec2.F \
+ dllsec2.F \
+ dmesec2.F \
+ docsec2.F \
+ dpssec2.F \
+ dshsec2.F \
+ dsvsec2.F \
+ dsect4a.F \
+ ecdef1.F \
+ ecdef10.F \
+ ecdef11.F \
+ ecdef12.F \
+ ecdef13.F \
+ ecdef14.F \
+ ecdef15.F \
+ ecdef16.F \
+ ecdef17.F \
+ ecdef18.F \
+ ecdef19.F \
+ ecdef50.F \
+ ecdf191.F \
+ ecdef2.F \
+ ecdef3.F \
+ ecdef4.F \
+ ecdef5.F \
+ ecdef6.F \
+ ecdef7.F \
+ ecdef8.F \
+ ecdef9.F \
+ ecloc1.F \
+ eggsec2.F \
+ elasec2.F \
+ ellsec2.F \
+ emesec2.F \
+ eocsec2.F \
+ epssec2.F \
+ eshsec2.F \
+ esvsec2.F \
+ emoscyc.F \
+ exscal.F \
+ extmap.F \
+ ftn1cr.F \
+ gbitmap.F \
+ genbin.F \
+ gendir.F \
+ getchd.F \
+ getfb2.F \
+ getfpd.F \
+ getib1.F \
+ getib2.F \
+ getib3.F \
+ getind.F \
+ getlgd.F \
+ getsys.F \
+ getusr.F \
+ grchk1.F \
+ grchk2.F \
+ grchk3.F \
+ grchk4.F \
+ gribex.F \
+ gribin.F \
+ gribnum.F \
+ grprs0.F \
+ grprs1.F \
+ grprs1b.F \
+ grprs2.F \
+ grprs3.F \
+ grprs4.F \
+ grprs4w.F \
+ grsdbg.F \
+ grsdef.F \
+ grsmax.F \
+ grsmkp.F \
+ grsmok.F \
+ grsn2o.F \
+ grsref.F \
+ grsrnd.F \
+ grsubc.F \
+ grsvck.F \
+ grsx2o.F \
+ gscale.F \
+ inscal.F \
+ insmp1.F \
+ insmp2.F \
+ inxbit.F \
+ inxmap.F \
+ kwchk1.F \
+ kwloc1.F \
+ kwprs1.F \
+ maxmin.F \
+ maxmn2.F \
+ maxmni.F \
+ modval.F \
+ offset.F \
+ offset2.F \
+ packcf.F \
+ prtbin.F \
+ prtbk1.F \
+ prtbk2.F \
+ prtbl1.F \
+ prtbl2.F \
+ ptquasi.F \
+ qu2reg.F \
+ qu2reg3.F \
+ reclen.F \
+ ref2grb.F \
+ remsp.F \
+ repchr.F \
+ revero.F \
+ rorint.F \
+ rowina.F \
+ rowina2.F \
+ rowina3.F \
+ rtb.F \
+ scm0.F \
+ setpar.F \
+ tab2fil.F \
+ u2l1cr.F \
+ uncmpck.F \
+ unpkcf.F \
+ vod2uv.F \
+ yyyy2cy.F
diff --git a/gribex/sources.linux b/gribex/sources.linux
new file mode 100755
index 0000000..f98c6ac
--- /dev/null
+++ b/gribex/sources.linux
@@ -0,0 +1,222 @@
+#
+# Sources for libemos/gribex for sgimips.
+#
+
+HEADERS = \
+ comars.h \
+ comcomm.h \
+ comgrb.h \
+ ecdef1.h \
+ ecdef2.h \
+ ecdef3.h \
+ ecdef4.h \
+ ecdef5.h \
+ ecdef6.h \
+ ecdef7.h \
+ ecdef8.h \
+ ecdef9.h \
+ ecdef10.h \
+ ecdef11.h \
+ ecdef12.h \
+ ecdef13.h \
+ ecdef14.h \
+ ecdef15.h \
+ ecdef16.h \
+ ecdef17.h \
+ ecdef18.h \
+ ecdef19.h \
+ ecdf190.h \
+ ecdf191.h \
+ ECMWFdefinitions.h \
+ gdecode.h \
+ gdecode1.h \
+ gdecode2.h \
+ gdecodeStruct.h \
+ getsetValues.h \
+ grbcom.h \
+ gribex.h \
+ handleLocalDefinitions.h \
+ sencode.h \
+ sencode1.h \
+ sencode2.h \
+ sfbits.h
+
+SOURCES.c = \
+ csgnbt.c \
+ dsgnbt.c \
+ ECMWFdefinitions.c \
+ findLocalDefinitionFile.c \
+ fortranInterface.c \
+ gdecode.c \
+ gdecode1.c \
+ gdecode2.c \
+ getsetValues.c \
+ grpr190.c \
+ handleLocalDefinitions.c \
+ jmalloc.c \
+ jfree.c \
+ orefdat.c \
+ sencode.c \
+ sencode1.c \
+ sencode2.c \
+ swap4.c \
+ valpina.c
+
+SOURCES.f =
+
+SOURCES.F = \
+ abortx.F \
+ bufrin.F \
+ c2bitw.F \
+ c2cwid.F \
+ c2dosd.F \
+ c2gene.F \
+ c2ordr.F \
+ c2pack.F \
+ c2pkvw.F \
+ c2rnge.F \
+ c2rows.F \
+ calcop.F \
+ cheknum.F \
+ chktab2.F \
+ cmpck.F \
+ codeps.F \
+ confp.F \
+ confp2.F \
+ confp3.F \
+ confpa.F \
+ csect4.F \
+ d2ordr.F \
+ d2rosd.F \
+ decext.F \
+ decfp.F \
+ decfp2.F \
+ decogb.F \
+ decogc.F \
+ decogd.F \
+ decogr.F \
+ decops.F \
+ decops2.F \
+ dggsec2.F \
+ dlasec2.F \
+ dllsec2.F \
+ dmesec2.F \
+ docsec2.F \
+ dpssec2.F \
+ dshsec2.F \
+ dsvsec2.F \
+ dsect4a.F \
+ ecdef1.F \
+ ecdef10.F \
+ ecdef11.F \
+ ecdef12.F \
+ ecdef13.F \
+ ecdef14.F \
+ ecdef15.F \
+ ecdef16.F \
+ ecdef17.F \
+ ecdef18.F \
+ ecdef19.F \
+ ecdef50.F \
+ ecdf191.F \
+ ecdef2.F \
+ ecdef3.F \
+ ecdef4.F \
+ ecdef5.F \
+ ecdef6.F \
+ ecdef7.F \
+ ecdef8.F \
+ ecdef9.F \
+ ecloc1.F \
+ eggsec2.F \
+ elasec2.F \
+ ellsec2.F \
+ emesec2.F \
+ eocsec2.F \
+ epssec2.F \
+ eshsec2.F \
+ esvsec2.F \
+ emoscyc.F \
+ exscal.F \
+ extmap.F \
+ ftn1cr.F \
+ gbitmap.F \
+ genbin.F \
+ gendir.F \
+ getchd.F \
+ getfb2.F \
+ getfpd.F \
+ getib1.F \
+ getib2.F \
+ getib3.F \
+ getind.F \
+ getlgd.F \
+ getsys.F \
+ getusr.F \
+ grchk1.F \
+ grchk2.F \
+ grchk3.F \
+ grchk4.F \
+ gribex.F \
+ gribin.F \
+ gribnum.F \
+ grprs0.F \
+ grprs1.F \
+ grprs1b.F \
+ grprs2.F \
+ grprs3.F \
+ grprs4.F \
+ grprs4w.F \
+ grsdbg.F \
+ grsdef.F \
+ grsmax.F \
+ grsmkp.F \
+ grsmok.F \
+ grsn2o.F \
+ grsref.F \
+ grsrnd.F \
+ grsubc.F \
+ grsvck.F \
+ grsx2o.F \
+ gscale.F \
+ inscal.F \
+ insmp1.F \
+ insmp2.F \
+ inxbit.F \
+ inxmap.F \
+ kwchk1.F \
+ kwloc1.F \
+ kwprs1.F \
+ maxmin.F \
+ maxmn2.F \
+ maxmni.F \
+ modval.F \
+ offset.F \
+ offset2.F \
+ packcf.F \
+ prtbin.F \
+ prtbk1.F \
+ prtbk2.F \
+ prtbl1.F \
+ prtbl2.F \
+ ptquasi.F \
+ qu2reg.F \
+ qu2reg3.F \
+ reclen.F \
+ ref2grb.F \
+ remsp.F \
+ repchr.F \
+ revero.F \
+ rorint.F \
+ rowina.F \
+ rowina2.F \
+ rowina3.F \
+ rtb.F \
+ scm0.F \
+ setpar.F \
+ tab2fil.F \
+ u2l1cr.F \
+ uncmpck.F \
+ unpkcf.F \
+ vod2uv.F \
+ yyyy2cy.F
diff --git a/gribex/sources.linux_g77 b/gribex/sources.linux_g77
new file mode 100755
index 0000000..f98c6ac
--- /dev/null
+++ b/gribex/sources.linux_g77
@@ -0,0 +1,222 @@
+#
+# Sources for libemos/gribex for sgimips.
+#
+
+HEADERS = \
+ comars.h \
+ comcomm.h \
+ comgrb.h \
+ ecdef1.h \
+ ecdef2.h \
+ ecdef3.h \
+ ecdef4.h \
+ ecdef5.h \
+ ecdef6.h \
+ ecdef7.h \
+ ecdef8.h \
+ ecdef9.h \
+ ecdef10.h \
+ ecdef11.h \
+ ecdef12.h \
+ ecdef13.h \
+ ecdef14.h \
+ ecdef15.h \
+ ecdef16.h \
+ ecdef17.h \
+ ecdef18.h \
+ ecdef19.h \
+ ecdf190.h \
+ ecdf191.h \
+ ECMWFdefinitions.h \
+ gdecode.h \
+ gdecode1.h \
+ gdecode2.h \
+ gdecodeStruct.h \
+ getsetValues.h \
+ grbcom.h \
+ gribex.h \
+ handleLocalDefinitions.h \
+ sencode.h \
+ sencode1.h \
+ sencode2.h \
+ sfbits.h
+
+SOURCES.c = \
+ csgnbt.c \
+ dsgnbt.c \
+ ECMWFdefinitions.c \
+ findLocalDefinitionFile.c \
+ fortranInterface.c \
+ gdecode.c \
+ gdecode1.c \
+ gdecode2.c \
+ getsetValues.c \
+ grpr190.c \
+ handleLocalDefinitions.c \
+ jmalloc.c \
+ jfree.c \
+ orefdat.c \
+ sencode.c \
+ sencode1.c \
+ sencode2.c \
+ swap4.c \
+ valpina.c
+
+SOURCES.f =
+
+SOURCES.F = \
+ abortx.F \
+ bufrin.F \
+ c2bitw.F \
+ c2cwid.F \
+ c2dosd.F \
+ c2gene.F \
+ c2ordr.F \
+ c2pack.F \
+ c2pkvw.F \
+ c2rnge.F \
+ c2rows.F \
+ calcop.F \
+ cheknum.F \
+ chktab2.F \
+ cmpck.F \
+ codeps.F \
+ confp.F \
+ confp2.F \
+ confp3.F \
+ confpa.F \
+ csect4.F \
+ d2ordr.F \
+ d2rosd.F \
+ decext.F \
+ decfp.F \
+ decfp2.F \
+ decogb.F \
+ decogc.F \
+ decogd.F \
+ decogr.F \
+ decops.F \
+ decops2.F \
+ dggsec2.F \
+ dlasec2.F \
+ dllsec2.F \
+ dmesec2.F \
+ docsec2.F \
+ dpssec2.F \
+ dshsec2.F \
+ dsvsec2.F \
+ dsect4a.F \
+ ecdef1.F \
+ ecdef10.F \
+ ecdef11.F \
+ ecdef12.F \
+ ecdef13.F \
+ ecdef14.F \
+ ecdef15.F \
+ ecdef16.F \
+ ecdef17.F \
+ ecdef18.F \
+ ecdef19.F \
+ ecdef50.F \
+ ecdf191.F \
+ ecdef2.F \
+ ecdef3.F \
+ ecdef4.F \
+ ecdef5.F \
+ ecdef6.F \
+ ecdef7.F \
+ ecdef8.F \
+ ecdef9.F \
+ ecloc1.F \
+ eggsec2.F \
+ elasec2.F \
+ ellsec2.F \
+ emesec2.F \
+ eocsec2.F \
+ epssec2.F \
+ eshsec2.F \
+ esvsec2.F \
+ emoscyc.F \
+ exscal.F \
+ extmap.F \
+ ftn1cr.F \
+ gbitmap.F \
+ genbin.F \
+ gendir.F \
+ getchd.F \
+ getfb2.F \
+ getfpd.F \
+ getib1.F \
+ getib2.F \
+ getib3.F \
+ getind.F \
+ getlgd.F \
+ getsys.F \
+ getusr.F \
+ grchk1.F \
+ grchk2.F \
+ grchk3.F \
+ grchk4.F \
+ gribex.F \
+ gribin.F \
+ gribnum.F \
+ grprs0.F \
+ grprs1.F \
+ grprs1b.F \
+ grprs2.F \
+ grprs3.F \
+ grprs4.F \
+ grprs4w.F \
+ grsdbg.F \
+ grsdef.F \
+ grsmax.F \
+ grsmkp.F \
+ grsmok.F \
+ grsn2o.F \
+ grsref.F \
+ grsrnd.F \
+ grsubc.F \
+ grsvck.F \
+ grsx2o.F \
+ gscale.F \
+ inscal.F \
+ insmp1.F \
+ insmp2.F \
+ inxbit.F \
+ inxmap.F \
+ kwchk1.F \
+ kwloc1.F \
+ kwprs1.F \
+ maxmin.F \
+ maxmn2.F \
+ maxmni.F \
+ modval.F \
+ offset.F \
+ offset2.F \
+ packcf.F \
+ prtbin.F \
+ prtbk1.F \
+ prtbk2.F \
+ prtbl1.F \
+ prtbl2.F \
+ ptquasi.F \
+ qu2reg.F \
+ qu2reg3.F \
+ reclen.F \
+ ref2grb.F \
+ remsp.F \
+ repchr.F \
+ revero.F \
+ rorint.F \
+ rowina.F \
+ rowina2.F \
+ rowina3.F \
+ rtb.F \
+ scm0.F \
+ setpar.F \
+ tab2fil.F \
+ u2l1cr.F \
+ uncmpck.F \
+ unpkcf.F \
+ vod2uv.F \
+ yyyy2cy.F
diff --git a/gribex/sources.rs6000 b/gribex/sources.rs6000
new file mode 100755
index 0000000..7b7745e
--- /dev/null
+++ b/gribex/sources.rs6000
@@ -0,0 +1,229 @@
+#
+# Sources for libemos/gribex for rs6000.
+#
+
+HEADERS = \
+ comars.h \
+ comcomm.h \
+ comgrb.h \
+ ecdef1.h \
+ ecdef2.h \
+ ecdef3.h \
+ ecdef4.h \
+ ecdef5.h \
+ ecdef6.h \
+ ecdef7.h \
+ ecdef8.h \
+ ecdef9.h \
+ ecdef10.h \
+ ecdef11.h \
+ ecdef12.h \
+ ecdef13.h \
+ ecdef14.h \
+ ecdef15.h \
+ ecdef16.h \
+ ecdef17.h \
+ ecdef18.h \
+ ecdef19.h \
+ ecdf190.h \
+ ecdf191.h \
+ ECMWFdefinitions.h \
+ gdecode.h \
+ gdecode1.h \
+ gdecode2.h \
+ gdecodeStruct.h \
+ getsetValues.h \
+ grbcom.h \
+ gribex.h \
+ handleLocalDefinitions.h \
+ sencode.h \
+ sencode1.h \
+ sencode2.h \
+ sfbits.h
+
+SOURCES.c = \
+ csgnbt.c \
+ dsgnbt.c \
+ ECMWFdefinitions.c \
+ findLocalDefinitionFile.c \
+ fortranInterface.c \
+ gdecode.c \
+ gdecode1.c \
+ gdecode2.c \
+ getsetValues.c \
+ grpr190.c \
+ handleLocalDefinitions.c \
+ jmalloc.c \
+ jfree.c \
+ orefdat.c \
+ sencode.c \
+ sencode1.c \
+ sencode2.c \
+ valpina.c
+
+SOURCES.f =
+
+SOURCES.F = \
+ abortx.F \
+ bufrin.F \
+ c2bitw.F \
+ c2cwid.F \
+ c2dosd.F \
+ c2gene.F \
+ c2ordr.F \
+ c2pack.F \
+ c2pkvw.F \
+ c2rnge.F \
+ c2rows.F \
+ calcop.F \
+ cheknum.F \
+ chktab2.F \
+ cmpck.F \
+ codegb.F \
+ codegc.F \
+ codegr.F \
+ codeps.F \
+ confp.F \
+ confp2.F \
+ confp3.F \
+ confpa.F \
+ csect4.F \
+ d2ordr.F \
+ d2rosd.F \
+ decext.F \
+ decfp.F \
+ decfp2.F \
+ decogb.F \
+ decogc.F \
+ decogd.F \
+ decogr.F \
+ decops.F \
+ decops2.F \
+ dggsec2.F \
+ dlasec2.F \
+ dllsec2.F \
+ dmesec2.F \
+ docsec2.F \
+ dpssec2.F \
+ dshsec2.F \
+ dsvsec2.F \
+ dsect4a.F \
+ ecdef1.F \
+ ecdef10.F \
+ ecdef11.F \
+ ecdef12.F \
+ ecdef13.F \
+ ecdef14.F \
+ ecdef15.F \
+ ecdef16.F \
+ ecdef17.F \
+ ecdef18.F \
+ ecdef19.F \
+ ecdef50.F \
+ ecdf191.F \
+ ecdef2.F \
+ ecdef3.F \
+ ecdef4.F \
+ ecdef5.F \
+ ecdef6.F \
+ ecdef7.F \
+ ecdef8.F \
+ ecdef9.F \
+ ecloc1.F \
+ eggsec2.F \
+ elasec2.F \
+ ellsec2.F \
+ emesec2.F \
+ eocsec2.F \
+ epssec2.F \
+ eshsec2.F \
+ esvsec2.F \
+ emoscyc.F \
+ exscal.F \
+ extmap.F \
+ ftn1cr.F \
+ gbitmap.F \
+ genbin.F \
+ gendir.F \
+ gengrib.F \
+ getchd.F \
+ getfb2.F \
+ getfpd.F \
+ getib1.F \
+ getib2.F \
+ getib3.F \
+ getind.F \
+ getlgd.F \
+ getsys.F \
+ getusr.F \
+ grchk1.F \
+ grchk2.F \
+ grchk3.F \
+ grchk4.F \
+ gribex.F \
+ gribin.F \
+ gribnum.F \
+ grprs0.F \
+ grprs1.F \
+ grprs1b.F \
+ grprs2.F \
+ grprs3.F \
+ grprs4.F \
+ grprs4w.F \
+ grsdbg.F \
+ grsdef.F \
+ grsmax.F \
+ grsmkp.F \
+ grsmok.F \
+ grsn2o.F \
+ grsref.F \
+ grsrnd.F \
+ grsubc.F \
+ grsvck.F \
+ grsx2o.F \
+ gsbite.F \
+ gscale.F \
+ inscal.F \
+ insmp1.F \
+ insmp2.F \
+ inxbit.F \
+ inxmap.F \
+ kwchk1.F \
+ kwloc1.F \
+ kwprs1.F \
+ lnbfcr.F \
+ lngbcr.F \
+ maxmin.F \
+ maxmn2.F \
+ maxmni.F \
+ modval.F \
+ mxmncr.F \
+ offset.F \
+ offset2.F \
+ packcf.F \
+ prtbin.F \
+ prtbk1.F \
+ prtbk2.F \
+ prtbl1.F \
+ prtbl2.F \
+ ptquasi.F \
+ qu2reg.F \
+ qu2reg3.F \
+ reclen.F \
+ ref2grb.F \
+ remsp.F \
+ repchr.F \
+ revero.F \
+ rorint.F \
+ rowina.F \
+ rowina2.F \
+ rowina3.F \
+ rtb.F \
+ scm0.F \
+ setpar.F \
+ tab2fil.F \
+ u2l1cr.F \
+ uncmpck.F \
+ unpkcf.F \
+ vod2uv.F \
+ yyyy2cy.F
diff --git a/gribex/sources.sgimips b/gribex/sources.sgimips
new file mode 100755
index 0000000..aa0a959
--- /dev/null
+++ b/gribex/sources.sgimips
@@ -0,0 +1,228 @@
+#
+# Sources for libemos/gribex for sgimips.
+#
+
+HEADERS = \
+ comars.h \
+ comcomm.h \
+ comgrb.h \
+ ecdef1.h \
+ ecdef2.h \
+ ecdef3.h \
+ ecdef4.h \
+ ecdef5.h \
+ ecdef6.h \
+ ecdef7.h \
+ ecdef8.h \
+ ecdef9.h \
+ ecdef10.h \
+ ecdef11.h \
+ ecdef12.h \
+ ecdef13.h \
+ ecdef14.h \
+ ecdef15.h \
+ ecdef16.h \
+ ecdef17.h \
+ ecdef18.h \
+ ecdef19.h \
+ ecdf190.h \
+ ecdf191.h \
+ ECMWFdefinitions.h \
+ gdecode.h \
+ gdecode1.h \
+ gdecode2.h \
+ gdecodeStruct.h \
+ getsetValues.h \
+ grbcom.h \
+ gribex.h \
+ handleLocalDefinitions.h \
+ sencode.h \
+ sencode1.h \
+ sencode2.h \
+ sfbits.h
+
+SOURCES.c = \
+ csgnbt.c \
+ dsgnbt.c \
+ ECMWFdefinitions.c \
+ findLocalDefinitionFile.c \
+ fortranInterface.c \
+ gdecode.c \
+ gdecode1.c \
+ gdecode2.c \
+ getsetValues.c \
+ grpr190.c \
+ handleLocalDefinitions.c \
+ jmalloc.c \
+ jfree.c \
+ orefdat.c \
+ sencode.c \
+ sencode1.c \
+ sencode2.c \
+ valpina.c
+
+SOURCES.f =
+
+SOURCES.F = \
+ abortx.F \
+ bufrin.F \
+ c2bitw.F \
+ c2cwid.F \
+ c2dosd.F \
+ c2gene.F \
+ c2ordr.F \
+ c2pack.F \
+ c2pkvw.F \
+ c2rnge.F \
+ c2rows.F \
+ calcop.F \
+ cheknum.F \
+ chktab2.F \
+ cmpck.F \
+ codegb.F \
+ codegc.F \
+ codegr.F \
+ codeps.F \
+ confp.F \
+ confp2.F \
+ confp3.F \
+ confpa.F \
+ csect4.F \
+ d2ordr.F \
+ d2rosd.F \
+ decext.F \
+ decfp.F \
+ decfp2.F \
+ decogb.F \
+ decogc.F \
+ decogd.F \
+ decogr.F \
+ decops.F \
+ decops2.F \
+ dggsec2.F \
+ dlasec2.F \
+ dllsec2.F \
+ dmesec2.F \
+ docsec2.F \
+ dpssec2.F \
+ dshsec2.F \
+ dsvsec2.F \
+ dsect4a.F \
+ ecdef1.F \
+ ecdef10.F \
+ ecdef11.F \
+ ecdef12.F \
+ ecdef13.F \
+ ecdef14.F \
+ ecdef15.F \
+ ecdef16.F \
+ ecdef17.F \
+ ecdef18.F \
+ ecdef19.F \
+ ecdef50.F \
+ ecdf191.F \
+ ecdef2.F \
+ ecdef3.F \
+ ecdef4.F \
+ ecdef5.F \
+ ecdef6.F \
+ ecdef7.F \
+ ecdef8.F \
+ ecdef9.F \
+ ecloc1.F \
+ eggsec2.F \
+ elasec2.F \
+ ellsec2.F \
+ emesec2.F \
+ eocsec2.F \
+ epssec2.F \
+ eshsec2.F \
+ esvsec2.F \
+ emoscyc.F \
+ exscal.F \
+ extmap.F \
+ ftn1cr.F \
+ gbitmap.F \
+ genbin.F \
+ gendir.F \
+ gengrib.F \
+ getchd.F \
+ getfb2.F \
+ getfpd.F \
+ getib1.F \
+ getib2.F \
+ getib3.F \
+ getind.F \
+ getlgd.F \
+ getsys.F \
+ getusr.F \
+ grchk1.F \
+ grchk2.F \
+ grchk3.F \
+ grchk4.F \
+ gribex.F \
+ gribin.F \
+ gribnum.F \
+ grprs0.F \
+ grprs1.F \
+ grprs1b.F \
+ grprs2.F \
+ grprs3.F \
+ grprs4.F \
+ grprs4w.F \
+ grsdbg.F \
+ grsdef.F \
+ grsmax.F \
+ grsmkp.F \
+ grsmok.F \
+ grsn2o.F \
+ grsref.F \
+ grsrnd.F \
+ grsubc.F \
+ grsvck.F \
+ grsx2o.F \
+ gscale.F \
+ inscal.F \
+ insmp1.F \
+ insmp2.F \
+ inxbit.F \
+ inxmap.F \
+ kwchk1.F \
+ kwloc1.F \
+ kwprs1.F \
+ lnbfcr.F \
+ lngbcr.F \
+ maxmin.F \
+ maxmn2.F \
+ maxmni.F \
+ modval.F \
+ mxmncr.F \
+ offset.F \
+ offset2.F \
+ packcf.F \
+ prtbin.F \
+ prtbk1.F \
+ prtbk2.F \
+ prtbl1.F \
+ prtbl2.F \
+ ptquasi.F \
+ qu2reg.F \
+ qu2reg3.F \
+ reclen.F \
+ ref2grb.F \
+ remsp.F \
+ repchr.F \
+ revero.F \
+ rorint.F \
+ rowina.F \
+ rowina2.F \
+ rowina3.F \
+ rtb.F \
+ scm0.F \
+ setpar.F \
+ tab2fil.F \
+ u2l1cr.F \
+ uncmpck.F \
+ unpkcf.F \
+ vod2uv.F \
+ yyyy2cy.F
diff --git a/gribex/sources.sun4 b/gribex/sources.sun4
new file mode 100755
index 0000000..b60c3c7
--- /dev/null
+++ b/gribex/sources.sun4
@@ -0,0 +1,228 @@
+#
+# Sources for libemos/gribex sun4.
+#
+
+HEADERS = \
+ comars.h \
+ comcomm.h \
+ comgrb.h \
+ ecdef1.h \
+ ecdef2.h \
+ ecdef3.h \
+ ecdef4.h \
+ ecdef5.h \
+ ecdef6.h \
+ ecdef7.h \
+ ecdef8.h \
+ ecdef9.h \
+ ecdef10.h \
+ ecdef11.h \
+ ecdef12.h \
+ ecdef13.h \
+ ecdef14.h \
+ ecdef15.h \
+ ecdef16.h \
+ ecdef17.h \
+ ecdef18.h \
+ ecdef19.h \
+ ecdf190.h \
+ ecdf191.h \
+ ECMWFdefinitions.h \
+ gdecode.h \
+ gdecode1.h \
+ gdecode2.h \
+ gdecodeStruct.h \
+ getsetValues.h \
+ grbcom.h \
+ gribex.h \
+ handleLocalDefinitions.h \
+ sencode.h \
+ sencode1.h \
+ sencode2.h \
+ sfbits.h
+
+SOURCES.c = \
+ csgnbt.c \
+ dsgnbt.c \
+ ECMWFdefinitions.c \
+ findLocalDefinitionFile.c \
+ fortranInterface.c \
+ gdecode.c \
+ gdecode1.c \
+ gdecode2.c \
+ getsetValues.c \
+ grpr190.c \
+ handleLocalDefinitions.c \
+ jmalloc.c \
+ jfree.c \
+ orefdat.c \
+ sencode.c \
+ sencode1.c \
+ sencode2.c \
+ valpina.c
+
+SOURCES.f =
+
+SOURCES.F = \
+ abortx.F \
+ bufrin.F \
+ c2bitw.F \
+ c2cwid.F \
+ c2dosd.F \
+ c2gene.F \
+ c2ordr.F \
+ c2pack.F \
+ c2pkvw.F \
+ c2rnge.F \
+ c2rows.F \
+ calcop.F \
+ cheknum.F \
+ chktab2.F \
+ cmpck.F \
+ codegb.F \
+ codegc.F \
+ codegr.F \
+ codeps.F \
+ confp.F \
+ confp2.F \
+ confp3.F \
+ confpa.F \
+ csect4.F \
+ d2ordr.F \
+ d2rosd.F \
+ decext.F \
+ decfp.F \
+ decfp2.F \
+ decogb.F \
+ decogc.F \
+ decogd.F \
+ decogr.F \
+ decops.F \
+ decops2.F \
+ dggsec2.F \
+ dlasec2.F \
+ dllsec2.F \
+ dmesec2.F \
+ docsec2.F \
+ dpssec2.F \
+ dshsec2.F \
+ dsvsec2.F \
+ dsect4a.F \
+ ecdef1.F \
+ ecdef10.F \
+ ecdef11.F \
+ ecdef12.F \
+ ecdef13.F \
+ ecdef14.F \
+ ecdef15.F \
+ ecdef16.F \
+ ecdef17.F \
+ ecdef18.F \
+ ecdef19.F \
+ ecdef50.F \
+ ecdf191.F \
+ ecdef2.F \
+ ecdef3.F \
+ ecdef4.F \
+ ecdef5.F \
+ ecdef6.F \
+ ecdef7.F \
+ ecdef8.F \
+ ecdef9.F \
+ ecloc1.F \
+ eggsec2.F \
+ elasec2.F \
+ ellsec2.F \
+ emesec2.F \
+ eocsec2.F \
+ epssec2.F \
+ eshsec2.F \
+ esvsec2.F \
+ emoscyc.F \
+ exscal.F \
+ extmap.F \
+ ftn1cr.F \
+ gbitmap.F \
+ genbin.F \
+ gendir.F \
+ gengrib.F \
+ getchd.F \
+ getfb2.F \
+ getfpd.F \
+ getib1.F \
+ getib2.F \
+ getib3.F \
+ getind.F \
+ getlgd.F \
+ getsys.F \
+ getusr.F \
+ grchk1.F \
+ grchk2.F \
+ grchk3.F \
+ grchk4.F \
+ gribex.F \
+ gribin.F \
+ gribnum.F \
+ grprs0.F \
+ grprs1.F \
+ grprs1b.F \
+ grprs2.F \
+ grprs3.F \
+ grprs4.F \
+ grprs4w.F \
+ grsdbg.F \
+ grsdef.F \
+ grsmax.F \
+ grsmkp.F \
+ grsmok.F \
+ grsn2o.F \
+ grsref.F \
+ grsrnd.F \
+ grsubc.F \
+ grsvck.F \
+ grsx2o.F \
+ gscale.F \
+ inscal.F \
+ insmp1.F \
+ insmp2.F \
+ inxbit.F \
+ inxmap.F \
+ kwchk1.F \
+ kwloc1.F \
+ kwprs1.F \
+ lnbfcr.F \
+ lngbcr.F \
+ maxmin.F \
+ maxmn2.F \
+ maxmni.F \
+ modval.F \
+ mxmncr.F \
+ offset.F \
+ offset2.F \
+ packcf.F \
+ prtbin.F \
+ prtbk1.F \
+ prtbk2.F \
+ prtbl1.F \
+ prtbl2.F \
+ ptquasi.F \
+ qu2reg.F \
+ qu2reg3.F \
+ reclen.F \
+ ref2grb.F \
+ remsp.F \
+ repchr.F \
+ revero.F \
+ rorint.F \
+ rowina.F \
+ rowina2.F \
+ rowina3.F \
+ rtb.F \
+ scm0.F \
+ setpar.F \
+ tab2fil.F \
+ u2l1cr.F \
+ uncmpck.F \
+ unpkcf.F \
+ vod2uv.F \
+ yyyy2cy.F
diff --git a/gribex/swap4.c b/gribex/swap4.c
new file mode 100755
index 0000000..569fb20
--- /dev/null
+++ b/gribex/swap4.c
@@ -0,0 +1,36 @@
+/**
+* Copyright 1981-2012 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 <memory.h>
+
+void swap4_(char * version) {
+/*
+// Swaps the order of characters in experiment version (for little-endian)
+//
+// Called from FORTRAN:
+//
+// CALL SWAP4(KSEC1(41))
+*/
+char copy[4];
+
+ memcpy(copy,version,4);
+
+ version[0] = copy[3];
+ version[1] = copy[2];
+ version[2] = copy[1];
+ version[3] = copy[0];
+
+ return;
+}
+
+void swap4(char * version) {
+ swap4_(version);
+}
diff --git a/gribex/tab2fil.F b/gribex/tab2fil.F
new file mode 100755
index 0000000..97f2a62
--- /dev/null
+++ b/gribex/tab2fil.F
@@ -0,0 +1,166 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION TAB2FIL ( KTABLE, KPARAM, KCENTR, HFILE )
+C
+C---->
+C**** TAB2FIL
+C
+C Purpose
+C -------
+C
+C Build name of file that should contain, if present, the GRIB code
+C table 2 (parameters) associated to data (with valid entries) .
+C
+C
+C Interface
+C ---------
+C
+C IRET = TAB2FIL ( KTABLE, KPARAM, KCENTR )
+C
+C Input
+C -----
+C
+C KTABLE - Local table 2 version number.
+C KPARAM - Parameter number.
+C KCENTR - Centre number.
+C
+C
+C Output
+C ------
+C
+C HFILE - File name to look for and contact.
+C
+C Function return value is:
+C 0 - In all current cases .
+C
+C
+C Method
+C ------
+C
+C Checks if environment variable ECMWF_LOCAL_TABLE_PATH exists to
+C define the location of the parameter tables.
+C
+C Otherwise, looks for table xxx in:
+C
+C ${ELTPATH}/wmostd/table_2_version_xxx for WMO standard entries ;
+C
+C ${ELTPATH}/nnnnnn/local_table_2_version_xxx for ECMWF home data
+C where nnnnnn is the current EMOSLIB version ;
+C
+C ${ELTPATH}/cenCCC/local_table_2_version_xxx for home data of
+C centre number CCC .
+C
+C Entry for each parameter in table has the format (without quotes):
+C "......................" Separator
+C "051" Paramter number
+C "MX2T24" MARS mnemonic
+C "Max 2m temp" Parameter description
+C "K" Units for the parameter
+C "During previous 24 hours" Further description
+C
+C There is a termination "......................" line in the file
+C and there may be lines of comment before the first parameter entry.
+C
+C The parameter definition file is kept open between calls.
+C
+C
+C Externals
+C ---------
+C EMOSNUM - Gives current EMOSLIB version number.
+C
+C
+C Author
+C ------
+C
+C J. Clochard, Meteo France, for ECMWF - June 1999.
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C _______________________________________________________
+C----<
+C
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+#include "grbcom.h"
+C
+C Function arguments
+C
+ INTEGER KPARAM, KTABLE, KCENTR
+C
+ CHARACTER*256 HFILE
+C
+C Local variables
+C
+ INTEGER IEMOSNM, IOFFSET
+C
+C External functions
+C
+ INTEGER EMOSNUM
+ EXTERNAL EMOSNUM
+C
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ TAB2FIL = 0
+C
+C Build filename
+C
+ HFILE = ELTPATH
+ IOFFSET = INDEX( HFILE, ' ')
+C
+ IF( MAX( KTABLE,KPARAM) .LE. 127 ) THEN
+C
+ HFILE(IOFFSET:)='wmostd/table_2_version_'
+ IOFFSET = INDEX( HFILE, ' ')
+C
+ ELSE
+C
+ IF( KCENTR .EQ. 98 ) THEN
+C
+ IEMOSNM = EMOSNUM(1)
+ WRITE(HFILE(IOFFSET:IOFFSET+5),'(I6.6)') IEMOSNM
+C
+ ELSE
+C
+ HFILE(IOFFSET:IOFFSET+3)='cen'
+ WRITE(HFILE(IOFFSET+3:IOFFSET+5),'(I3.3)') KCENTR
+C
+ ENDIF
+C
+ IOFFSET=IOFFSET+6
+ HFILE(IOFFSET:)='/local_table_2_version_'
+C
+ ENDIF
+C
+ IOFFSET = INDEX( HFILE, ' ')
+ WRITE(HFILE(IOFFSET:IOFFSET+2),'(I3.3)') KTABLE
+C print *,'TAB2FIL: HFILE = "' // HFILE(:IOFFSET+2) // '"'
+C
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+C Drop through if not found.
+C
+ RETURN
+C
+ END
diff --git a/gribex/u2l1cr.F b/gribex/u2l1cr.F
new file mode 100755
index 0000000..c4bb72d
--- /dev/null
+++ b/gribex/u2l1cr.F
@@ -0,0 +1,141 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE U2L1CR (HSTRNG)
+C
+C---->
+C**** U2L1CR - Convert Upper case letters to Lower case.
+C
+C Purpose.
+C --------
+C
+C Convert character string to all lower case.
+C
+C** Interface.
+C ----------
+C
+C CALL U2L1CR (HSTRNG)
+C
+C INTEGER K.
+C REAL P.
+C LOGICAL O.
+C CHARACTER H.
+C
+C Input parameters.
+C -----------------
+C
+C HSTRNG - String in upper and/or lower case.
+C
+C Output parameters.
+C ------------------
+C
+C HSTRNG - Character string in all lower case.
+C
+C Method.
+C -------
+C
+C Numeric values of each byte examined and altered if in the
+C range of lower case letters.
+C
+C Externals.
+C ----------
+C
+C ICHAR
+C CHAR
+C
+C Reference.
+C ----------
+C
+C Cray Programmer's Library Reference Manual.
+C
+C Comments.
+C ---------
+C
+C Routine contains sections 0 to 1 and section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 09:08:90.
+C
+C Modifications
+C --------------
+C
+C None.
+C
+C ----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+ CHARACTER*(*) HSTRNG
+C
+C ASCII Representation of upper case characters A and Z.
+C
+ DATA IA /65/
+ DATA IZ /90/
+C
+C ASCII Representation of NULL and BLANK characters.
+C
+ DATA INULL /0/
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Change any necessary letters.
+C ----------------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+C
+ ILEN = LEN (HSTRNG)
+C
+ DO 1100 J=1,ILEN
+ ICH = ICHAR (HSTRNG(J:J))
+ IF ( (ICH.GE.IA).AND.(ICH.LE.IZ) ) HSTRNG (J:J) = CHAR (ICH+32)
+ IF (ICH.EQ.INULL) HSTRNG (J:J) = CHAR (32)
+ 1100 CONTINUE
+C
+C ----------------------------------------------------------------
+C
+C
+C
+c
+C
+C
+C
+C* Section 9 . Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 9000 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/unbkin.F b/gribex/unbkin.F
new file mode 100755
index 0000000..3e6ddf9
--- /dev/null
+++ b/gribex/unbkin.F
@@ -0,0 +1,627 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE UNBKIN (KUNIT,KARRAY,KINLEN,KOUTLEN,KEOF,KRET)
+C
+C---->
+C**** UNBKIN - Read a record from a pure binary file.
+C
+C Purpose.
+C --------
+C
+C Provides standard interface to read unblocked COS
+C files or UNICOS pure binary files.
+C
+C Read next record from a pure binary file
+C and return in given array to calling routine.
+C
+C** Interface.
+C ----------
+C
+C CALL UNBKIN (KUNIT,KARRAY,KINLEN,KOUTLEN,KEOF,KRET)
+C
+C INTEGER K.
+C REAL P.
+C LOGICAL O.
+C CHARACTER H.
+C
+C Input parameters.
+C -----------------
+C
+C KUNIT - Fortran unit number of file to be read.
+C 1 to 99.
+C
+C KARRAY - Array to receive record.
+C
+C KINLEN - Length of this array, in words.
+C
+C KOUTLEN - Length of record to be read (in words)
+C If this is 0 the length of the record is
+C assumed to be in the first word of the
+C record. This is the case for MARS data
+C in unpacked format.
+C
+C KEOF - 0, If not last read from this file.
+C 1, Last read to be made from this file.
+C
+C Normally this will be 0, but if the
+C same unit number is used later for
+C another file, and end-of-file was not
+C reached on the first one, a misread
+C will occur, unless KEOF is set to 1 on
+C the last read from the first file.
+C
+C KRET - 0, Routine to abort if error encountered.
+C 1, Return to calling routine even if error.
+C
+C Adding 100 to KRET will add debug printout
+C eg values of input and output parameters.
+C
+C Valid values for KRET are thus 0, 1, 100
+C or 101.
+C
+C Output parameters.
+C ------------------
+C
+C KOUTLEN - Length of record read, in words.
+C
+C KEOF - 0, If no end of file detected.
+C 1, End of file detected.
+C
+C KRET - Return code.
+C 0, No error encountered.
+C 1, Read error.
+C 2, Not used.
+C 3, Not used.
+C 4, Not used.
+C 5, No data transferred because user's array
+C is smaller than the record length.
+C 6, Maximum number of files opened for read
+C by user program exceeded.
+C 7, Error detected in parameters.
+C 8, Not used.
+C 9, Not used.
+C 10, End of file encountered before end of
+C record.
+C
+C Method.
+C -------
+C
+C Data is read in 512 word blocks. The length of each
+C record is given in the first word (or as input parameter)
+C and enough blocks then read to complete the record, which
+C is returned to the user. Any remaining words are kept to
+C use as the start of the next record on the next read.
+C
+C An array of Fortran numbers in use is kept, with a
+C corresponding array of pointers to the last part of
+C data read from each one. A similar array keeps end of file
+C status for each file. When the last read has been
+C made from a file, these entries are reset to 0.
+C
+C If an error is encountered, an error message is printed.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Comments.
+C ---------
+C
+C Maximum number of files which can be handled in one
+C program is 20.
+C
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 25:06:90.
+C
+C Modifications
+C --------------
+C
+C None.
+C
+C ----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+ PARAMETER (JPBLOK=512)
+ PARAMETER (JPFILS= 20)
+C
+ DIMENSION KARRAY(KINLEN)
+ DIMENSION INBUFF(JPFILS*JPBLOK)
+ DIMENSION ISTART(JPFILS)
+ DIMENSION IFTNOS(JPFILS)
+ DIMENSION IATEOF(JPFILS)
+C
+ DATA ISTART /JPFILS*0/
+ DATA IFTNOS /JPFILS*0/
+ DATA IATEOF /JPFILS*0/
+C
+ SAVE INBUFF
+ SAVE ISTART
+ SAVE IFTNOS
+ SAVE IATEOF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Check parameters. Set initial values.
+C ----------------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+C Set print switch, if required.
+C
+ IF (KRET.GE.100)
+ C THEN
+ KPR = 1
+ ELSE
+ KPR = 0
+ ENDIF
+C
+C Print input parameters, if required.
+C
+ IF (KPR.EQ.1)
+ C THEN
+ WRITE (*,*) 'UNBKIN : Section 1.'
+ WRITE (*,*) ' Input values used -'
+ WRITE (*,9904) KUNIT
+ WRITE (*,9905) KINLEN
+ WRITE (*,9906) KRET
+ WRITE (*,9908) KEOF
+ ENDIF
+C
+C Check input parameters.
+C
+ IRET = 0
+ IF (KRET.GE.100) KRET = KRET - 100
+C
+C Invalid value given for return code.
+C
+ IF (KRET.LT.0.OR.KRET.GT.1)
+ C THEN
+ IRET = 7
+ WRITE (*,9910) KRET
+ GO TO 9000
+ ENDIF
+C
+C Fortran unit numbers must be between 1 and 99 inclusive.
+C
+ IF (KUNIT.LT.1.OR.KUNIT.GT.99)
+ C THEN
+ IRET = 7
+ WRITE (*,9911) KUNIT
+ GO TO 9000
+ ENDIF
+C
+C Keep last read indicator.
+C
+ IEOF = KEOF
+ KEOF = 0
+C
+C Locate Fortran unit number in list of active numbers.
+C
+ DO 1010 J1010=1,JPFILS
+ IF (IFTNOS(J1010).EQ.KUNIT)
+ C THEN
+ IB = ISTART(J1010)
+ IZ = IATEOF(J1010)
+ IP = J1010
+ GO TO 1030
+ ENDIF
+ 1010 CONTINUE
+C
+C None found, so first time in. Set table entries.
+C
+ DO 1020 J1020=1,JPFILS
+ IF (IFTNOS(J1020).EQ.0)
+ C THEN
+ IB = 0
+ IZ = 0
+ IP = J1020
+ IFTNOS(J1020) = KUNIT
+ GO TO 1030
+ ENDIF
+ 1020 CONTINUE
+C
+C No table entry free. Maximum number of files exceeded.
+C
+ IRET = 6
+ WRITE (*,9912) JPFILS
+ GO TO 9000
+C
+C Set pointer to array holding last part of data read.
+C
+ 1030 CONTINUE
+C
+ IPR = IP
+ IP = (IP-1) * JPBLOK + 1
+C
+C INBUFF(IP) to INBUFF(IP+IB) are the remaining words of the
+C last block read.
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Ensure enough data is read to include a full record.
+C ----------------------------------------------------------------
+C
+ 2000 CONTINUE
+C
+ IF (KPR.EQ.1)
+ C THEN
+ WRITE (*,*) 'UNBKIN : Section 2.'
+ WRITE (*,9909) IPR , IP , IB
+ ENDIF
+C
+C Copy remainder of last block read to user array.
+C
+C KARRAY 1 IB
+C ! !
+C =========
+C
+ DO 2025 J2025 = 1,IB
+ KARRAY(J2025) = INBUFF(IP+J2025-1)
+ 2025 CONTINUE
+C
+C Fill remainder of array with zeroes.
+C
+ DO 2050 J2050 = IB+1,KINLEN
+ KARRAY(J2050) = 0
+ 2050 CONTINUE
+C
+C
+C* Get length of record to be read. .
+C
+ IF (KOUTLEN.NE.0)
+ C THEN
+ ILENW = KOUTLEN
+ ELSE
+ ILENW = KARRAY(1)
+ ENDIF
+C
+C Force a block to be read if no data remains from previous
+C read.
+C
+ IF (IB.EQ.0) ILENW = JPBLOK + 1
+C
+C Force a block to be read if data length is 0 to check for
+C end-of-file.
+C
+ IF (ILENW.EQ.0) ILENW = JPBLOK + 1
+C
+C Force a block to be read if the record Length is
+C greater than the length of data already read.
+C
+ IF (ILENW.GT.IB) ILENW = JPBLOK + 1
+C
+C No data is read if full record has already been read.
+C
+C No data is read if an end-of-file has been
+C encountered on previous read. Even if end-of-file has been
+C reached there may be short record(s) remaining in the
+C last block read.
+C
+C KARRAY 1 IB IE
+C ! ! !
+C =======================
+C
+C Read next block if necessary to get full record.
+C
+ IF (IZ.EQ.0.AND.ILENW.GT.JPBLOK)
+ C THEN
+ IE = IB + JPBLOK
+ BUFFER IN (KUNIT,0) (KARRAY(IB+1),KARRAY(IE))
+ IF (UNIT(KUNIT)) 2300,2200,2100
+ ELSE
+ IE = IB
+ GO TO 2300
+ ENDIF
+C
+ 2100 CONTINUE
+C
+C Read error, go to section 9.
+C
+ IRET = 1
+ WRITE (*,9913) KUNIT
+ GO TO 9000
+C
+ 2200 CONTINUE
+C
+C End of file read, so set flag. Last block read may still
+C contain short records.
+C
+ IZ = 1
+ IATEOF(IPR) = IZ
+C
+ 2300 CONTINUE
+C
+C* Get length of record.
+C
+ IF (KOUTLEN.NE.0)
+ C THEN
+ ILENW = KOUTLEN
+C
+C If the record length has been set by user, and
+C end-of-file has been encountered, force end-of-file
+C processing if record length is greater than remaining
+C contents of the buffer.
+C
+ IF(IZ.EQ.1.AND.ILENW.GT.IB) ILENW = 0
+C
+ ELSE
+ ILENW = KARRAY(1)
+ ENDIF
+C
+C If end-of-file has been encountered and record
+C length is 0 no further record remains in the buffer.
+C
+ IF (IZ.EQ.1.AND.ILENW.EQ.0)
+ C THEN
+ KEOF = 1
+ IFTNOS(IPR) = 0
+ ISTART(IPR) = 0
+ IATEOF(IPR) = 0
+ GO TO 9000
+ ENDIF
+C
+ IF (KPR.EQ.1) WRITE (*,9902) ILENW
+C
+C Ensure that user's array is large enough.
+C
+ IF (KINLEN.LT.ILENW)
+ C THEN
+ WRITE (*,9917) KINLEN , ILENW
+ IRET = 5
+ GO TO 9000
+ ENDIF
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 3 . Read enough blocks to complete current record.
+C ----------------------------------------------------------------
+C
+ 3000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'UNBKIN : Section 3.'
+C
+C
+C If data already read does not contain a full record,
+C read enough blocks to include the next full record.
+C Read last block into INBUFF, preceding ones into user's array.
+C
+ IF (IE.LT.ILENW)
+ C THEN
+C
+C KARRAY 1 IB IE ILENW
+C ! ! ! !
+C ==============================================
+C !
+C ILENR
+ IB = IE
+ ILENR = ILENW - IE
+C
+C If second block is last block, do not read into user array.
+C
+ IF (ILENR.LE.JPBLOK) GO TO 3010
+C
+ IDIFF = MOD (ILENR,JPBLOK)
+ IF (IDIFF.NE.0)
+ C THEN
+ ILENR = ILENR - IDIFF
+ ELSE
+ ILENR = ILENR - JPBLOK
+ ENDIF
+ IE = IE + ILENR
+ BUFFER IN (KUNIT,0) (KARRAY(IB+1),KARRAY(IE))
+ IF (UNIT(KUNIT)) 3010,3700,2100
+C
+ 3010 CONTINUE
+C
+ BUFFER IN (KUNIT,0) (INBUFF(IP),INBUFF(IP+JPBLOK-1))
+ IF (UNIT(KUNIT)) 3100,3700,2100
+C
+C Put end of field in user's array.
+C
+ 3100 CONTINUE
+C
+ IEND = ILENW - IE
+ DO 3200 J3200=1,IEND
+ KARRAY(IE+J3200) = INBUFF(IP+J3200-1)
+ 3200 CONTINUE
+C
+C Move remainder of block to front of buffer.
+C
+ INTER = JPBLOK - IEND
+ DO 3300 J3300=1,INTER
+ INBUFF(IP+J3300-1) = INBUFF(IP+J3300-1+IEND)
+ 3300 CONTINUE
+C
+C
+ ELSE
+C
+C Check for premature end-of-file ie record
+C longer than data already read.
+C
+C KARRAY 1 IB ILENW
+C ! ! EOF !
+C ===========
+C
+C=== IF (IZ.EQ.1.AND.ILENW.GT.IB) GO TO 3700
+C RE-implement above line and remove next IF clause
+C when ECFILE clears its buffers before use.
+C
+ IF (IZ.EQ.1.AND.ILENW.GT.IB)
+ C THEN
+ KEOF = 1
+ IFTNOS(IPR) = 0
+ ISTART(IPR) = 0
+ IATEOF(IPR) = 0
+ KOUTLEN = 0
+ GO TO 9000
+ ENDIF
+C
+C KARRAY 1 ILENW IE
+C ! ! !
+C =======================
+C
+ INTER = IE - ILENW
+ DO 3400 J3400=1,INTER
+ INBUFF(IP+J3400-1) = KARRAY(ILENW+J3400)
+ 3400 CONTINUE
+ ENDIF
+C
+ KOUTLEN = ILENW
+ IB = INTER
+C
+ 3600 CONTINUE
+C
+C Save pointer to start of next read area, unless last read.
+C
+ IF (IEOF.EQ.1)
+ C THEN
+ IFTNOS(IPR) = 0
+ ISTART(IPR) = 0
+ IATEOF(IPR) = 0
+ ELSE
+ ISTART(IPR) = IB
+ IATEOF(IPR) = IZ
+ ENDIF
+C
+ GO TO 9000
+C
+C End-of-file before end of record.
+C
+ 3700 CONTINUE
+C
+ IRET = 10
+ WRITE (*,9918)
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 9000 CONTINUE
+C
+ IF (KPR.EQ.1)
+ C THEN
+ WRITE (*,*) 'UNBKIN : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9907) KOUTLEN
+ WRITE (*,9908) KEOF
+ WRITE (*,9906) IRET
+ ENDIF
+C
+C Error encountered. Clear table entries, if any exist.
+C Abort if requested.
+C
+ IF (IRET.NE.0.AND.IRET.NE.2)
+ C THEN
+ IF (IRET.NE.6)
+ C THEN
+ IFTNOS(IPR) = 0
+ IATEOF(IPR) = 0
+ ISTART(IPR) = 0
+ ENDIF
+ WRITE (*,9903) IRET
+ IF (KRET.EQ.0) CALL ABORT
+ ENDIF
+C
+ KRET = IRET
+C
+ RETURN
+C
+C
+ 9902 FORMAT (1H ,'UNBKIN : Record length (words) = ',I8)
+C
+ 9903 FORMAT (1H ,'UNBKIN : Return code = ',I6)
+C
+ 9904 FORMAT (1H ,9X,'KUNIT = ',I6)
+C
+ 9905 FORMAT (1H ,9X,'KINLEN = ',I6)
+C
+ 9906 FORMAT (1H ,9X,'KRET = ',I6)
+C
+ 9907 FORMAT (1H ,9X,'KOUTLEN = ',I6)
+C
+ 9908 FORMAT (1H ,9X,'KEOF = ',I6)
+C
+ 9909 FORMAT (1H ,'IPR = ',I4,' IP = ',I8,' IB = ',I8)
+C
+ 9910 FORMAT (1H ,'UNBKIN : KRET on input is ',I4,
+ C '. Valid values are 0,1,10,11,100,110,101 or 111.')
+ 9911 FORMAT (1H ,'UNBKIN : KUNIT on input is ',I4,
+ C '. Valid values are 1 to 99.')
+ 9912 FORMAT (1H ,'UNBKIN : Maximum number of files (',I2,') exceeded.')
+C
+ 9913 FORMAT (1H ,'UNBKIN : Error in reading file number ',I3)
+C
+ 9917 FORMAT (1H ,'UNBKIN : Array length is ',I6, 'words, but record ',
+ C 'length is ',I6,' words.')
+ 9918 FORMAT (1H ,'UNBKIN : End-of-file reached before end of record.')
+C
+C
+ END
diff --git a/gribex/unbkout.F b/gribex/unbkout.F
new file mode 100755
index 0000000..b3a8415
--- /dev/null
+++ b/gribex/unbkout.F
@@ -0,0 +1,521 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE UNBKOUT (KUNIT,KARRAY,KINLEN,KOUTLEN,KEOF,KRET)
+C
+C---->
+C**** UNBKOUT - Write a record to a pure binary file.
+C
+C Purpose.
+C --------
+C
+C Provides standard interface to write unblocked COS
+C files or UNICOS pure binary files.
+C
+C** Interface.
+C ----------
+C
+C CALL UNBKOUT (KUNIT,KARRAY,KINLEN,KOUTLEN,KEOF,KRET)
+C
+C INTEGER K.
+C REAL P.
+C LOGICAL O.
+C CHARACTER H.
+C
+C Input parameters.
+C -----------------
+C
+C KUNIT - Fortran unit number of file to be written.
+C 1 to 99.
+C
+C KARRAY - Array containing record to be written.
+C
+C KINLEN - Length of this array, in words.
+C
+C KOUTLEN - Length of record to be written (in words).
+C If this is 0 length is assumed to be in
+C the first word of the record.
+C This is the case with MARS data in unpacked
+C format.
+C
+C KEOF - 0, If not last write to this file.
+C 1, Last write to this file, so write
+C record and flush output buffer.
+C 2, Last record already written, so
+C flush output buffer.
+C
+C KRET - 0, Routine to abort if error encountered.
+C 1, Return to calling routine even if error.
+C
+C Adding 100 to KRET will add debug printout
+C eg values of input and output parameters.
+C
+C Valid values for KRET are thus 0, 1, 100
+C or 101.
+C
+C Output parameters.
+C ------------------
+C
+C KOUTLEN - Length of record written, in words.
+C
+C KRET - Return code.
+C 0, No error encountered.
+C 1, Write error.
+C 2, Not used.
+C 3, Not used.
+C 4, Not used.
+C 5, No data transferred because user's array
+C is smaller than the record length.
+C 6, Maximum number of files opened for write
+C by user program exceeded.
+C 7, Error detected in parameters.
+C
+C Method.
+C -------
+C
+C Data is written in 512 word blocks. The length of each
+C record is taken from the first word (or input parameter)
+C and all full blocks are then written. Unless it is the last
+C write to the file, any remaining words are kept to use
+C as the start of the next block to be written.
+C
+C An array of Fortran numbers in use is kept, with a
+C corresponding array of pointers to the next part of
+C data to be written to each one. When the last write is
+C made to a file, these entries are reset to 0.
+C
+C If an error is encountered, an error message is printed.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C Cray CFT77 Manual.
+C
+C Comments.
+C ---------
+C
+C Maximum number of files which can be handled in one
+C program is 20
+C
+C Routine contains Sections 0 to 3 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 24:04:90.
+C
+C Modifications
+C --------------
+C
+C J. Hennessy ECMWF 31:10:90.
+C Do not write empty last block, when flushing buffer.
+C
+C B. Raoult ECMWF 29:11:90
+C Fix bug in zero-filling of short and last records.
+C
+C ----------------------------------------------------------------
+C----<
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0 . Definition of variables.
+C ----------------------------------------------------------------
+C
+ IMPLICIT LOGICAL ( L, O, G )
+ IMPLICIT CHARACTER*8 ( C, H, Y )
+ IMPLICIT INTEGER ( I, J, K, M, N )
+C
+ PARAMETER (JPBLOK=512)
+ PARAMETER (JPFILS= 20)
+C
+ DIMENSION KARRAY(KINLEN)
+ DIMENSION IOBUFF(JPFILS*JPBLOK)
+ DIMENSION ISTART(JPFILS)
+ DIMENSION IFTNOS(JPFILS)
+C
+ DATA ISTART /JPFILS*0/
+ DATA IFTNOS /JPFILS*0/
+C
+ SAVE IOBUFF
+ SAVE ISTART
+ SAVE IFTNOS
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Check parameters. Set initial values.
+C ----------------------------------------------------------------
+C
+ 1000 CONTINUE
+C
+C* Set print switch, if required.
+C
+ IF (KRET.GE.100)
+ C THEN
+ KPR = 1
+ ELSE
+ KPR = 0
+ ENDIF
+C
+C* Print input parameters, if required.
+C
+ IF (KPR.EQ.1)
+ C THEN
+ WRITE (*,*) 'UNBKOUT : Section 1.'
+ WRITE (*,*) ' Input values used -'
+ WRITE (*,9904) KUNIT
+ WRITE (*,9905) KINLEN
+ WRITE (*,9907) KOUTLEN
+ WRITE (*,9906) KRET
+ WRITE (*,9908) KEOF
+ ENDIF
+C
+C* Check input parameters.
+C
+ IRET = 0
+ IF (KRET.GE.100) KRET = KRET - 100
+C
+C* Invalid value given for return code.
+C
+ IF (KRET.LT.0.OR.KRET.GT.1)
+ C THEN
+ IRET = 7
+ WRITE (*,9910) KRET
+ GO TO 9000
+ ENDIF
+C
+C* Fortran unit numbers must be between 1 and 99 inclusive.
+C
+ IF (KUNIT.LT.1.OR.KUNIT.GT.99)
+ C THEN
+ IRET = 7
+ WRITE (*,9911) KUNIT
+ GO TO 9000
+ ENDIF
+C
+C* Retain last write indicator.
+C
+ IF (KEOF.LT.0.OR.KEOF.GT.2)
+ C THEN
+ IRET = 7
+ WRITE (*,9916) KEOF
+ GO TO 9000
+ ENDIF
+C
+ IEOF = KEOF
+ KEOF = 0
+C
+C* Locate Fortran unit number in list of active numbers.
+C
+ DO 1010 J1010=1,JPFILS
+ IF (IFTNOS(J1010).EQ.KUNIT)
+ C THEN
+ IB = ISTART(J1010)
+ IP = J1010
+ GO TO 1030
+ ENDIF
+ 1010 CONTINUE
+C
+C* None found, so first time in. Set table entries.
+C
+ DO 1020 J1020=1,JPFILS
+ IF (IFTNOS(J1020).EQ.0)
+ C THEN
+ IB = 0
+ IP = J1020
+ IFTNOS(J1020) = KUNIT
+ GO TO 1030
+ ENDIF
+ 1020 CONTINUE
+C
+C* No table entry free. Maximum number of files exceeded.
+C
+ IRET = 6
+ WRITE (*,9912) JPFILS
+ GO TO 9000
+C
+C* Set pointer to array holding last part of data not written.
+C
+ 1030 CONTINUE
+C
+ IPR = IP
+ IP = (IP-1) * JPBLOK + 1
+C
+C IOBUFF(IP) to IOBUFF(IP+B) are the remaining words after
+C last block written.
+C
+C* Flush output buffer only requested.
+C
+ IF (IEOF.EQ.2) GO TO 3575
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2 . Get length of next record.
+C ----------------------------------------------------------------
+C
+ 2000 CONTINUE
+C
+ IF (KPR.EQ.1)
+ C THEN
+ WRITE (*,*) 'UNBKOUT : Section 2.'
+ WRITE (*,9909) IPR , IP , IB
+ ENDIF
+C
+C Get length of record.
+C
+ IF (KOUTLEN.EQ.0)
+ C THEN
+ ILENW = KARRAY(1)
+ ELSE
+ ILENW = KOUTLEN
+ ENDIF
+C
+C Ensure that user's array is large enough.
+C
+ IF (KINLEN.LT.ILENW)
+ C THEN
+ IRET = 5
+ WRITE (*,9917) KINLEN , ILENW
+ GO TO 9000
+ ENDIF
+C
+ IF (KPR.EQ.1) WRITE (*,9902) ILENW
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 3 . Write complete blocks.
+C ----------------------------------------------------------------
+C
+ 3000 CONTINUE
+C
+ IF (KPR.EQ.1) WRITE (*,*) 'UNBKOUT : Section 3.'
+C
+C If the record is 1 block or more in length write it to file.
+C Write partial last block into IOBUFF, preceding ones to file.
+C
+ IF ((IB+ILENW).GE.JPBLOK)
+ C THEN
+C
+C Copy enough words from user array to complete first block.
+C
+ IF (IB.EQ.0) GO TO 3200
+ DO 3050 J3050 = 1,JPBLOK - IB
+ IOBUFF(IP+J3050+IB-1) = KARRAY(J3050)
+ 3050 CONTINUE
+C
+ IC = IB
+ IB = JPBLOK - IB
+C
+C Write first block.
+C
+ BUFFER OUT (KUNIT,0) (IOBUFF(IP),IOBUFF(IP+JPBLOK-1))
+ IF (UNIT(KUNIT)) 3200,3700,3700
+C
+ 3200 CONTINUE
+C
+C Check if length to be written was exactly 1 block.
+C
+ IF ((ILENW + IC).EQ.JPBLOK)
+ C THEN
+ INTER = 0
+ GO TO 3555
+ ENDIF
+C
+ ILENR = ILENW - IB
+ IDIFF = MOD (ILENR,JPBLOK)
+ IF (IDIFF.NE.0)
+ C THEN
+ ILENR = ILENR - IDIFF
+ ELSE
+ ILENR = ILENR - JPBLOK
+ ENDIF
+ IE = IB + ILENR
+C
+C For a short record there may not be a full
+C second block.
+C
+ IF (IE.EQ.IB) GO TO 3400
+C
+C If remaining part of record to be written is a multiple
+C of the block size, write complete record.
+C
+ IF ((ILENW-IE).EQ.JPBLOK) IE = IE + JPBLOK
+C
+ BUFFER OUT (KUNIT,0) (KARRAY(IB+1),KARRAY(IE))
+ IF (UNIT(KUNIT)) 3400,3700,3700
+C
+C Put end of field in IOBUFF.
+C
+ 3400 CONTINUE
+C
+ INTER = ILENW - IE
+ DO 3500 J3500=1,INTER
+ IOBUFF(IP+J3500-1) = KARRAY(IE+J3500)
+ 3500 CONTINUE
+C
+ ELSE
+C
+C Add short record to buffer.
+C
+ DO 3550 J3550 = 1,ILENW
+ IOBUFF(IP+J3550+IB-1) = KARRAY(J3550)
+ 3550 CONTINUE
+ INTER = IB + ILENW
+C
+ ENDIF
+C
+ 3555 CONTINUE
+C
+ IB = INTER
+ KOUTLEN = ILENW
+C
+C Fill unused part of buffer with zeroes.
+C
+ DO 3560 J3560 = IB+1,JPBLOK
+ IOBUFF(J3560+IP-1) = 0
+ 3560 CONTINUE
+C
+C Write last part of last record if end of file.
+C Do not write empty last block, when flushing buffer.
+C
+ 3575 CONTINUE
+C
+ IF (IEOF.GT.0)
+ C THEN
+ IF (IB.EQ.0) GO TO 3600
+ DO 3580 J3580 = IB+1,JPBLOK
+ IOBUFF(J3580+IP-1) = 0
+ 3580 CONTINUE
+ BUFFER OUT (KUNIT,0) (IOBUFF(IP),IOBUFF(IP+JPBLOK-1))
+ IF (UNIT(KUNIT)) 3600 , 3700 , 3700
+ ENDIF
+C
+ 3600 CONTINUE
+C
+C Save pointer to start of next write area, unless last write.
+C
+ IF (IEOF.GT.0)
+ C THEN
+ IFTNOS(IPR) = 0
+ ISTART(IPR) = 0
+ ELSE
+ ISTART(IPR) = IB
+ ENDIF
+C
+ GO TO 9000
+C
+ 3700 CONTINUE
+C
+C* Write error, go to section 9.
+C
+ IRET = 1
+ WRITE (*,9913) KUNIT
+C
+C ----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Return to calling routine. Format statements.
+C ------------------------------------------------------------------
+C
+ 9000 CONTINUE
+C
+ IF (KPR.EQ.1)
+ C THEN
+ WRITE (*,*) 'UNBKOUT : Section 9.'
+ WRITE (*,*) ' Output values set -'
+ WRITE (*,9907) KOUTLEN
+ WRITE (*,9908) KEOF
+ WRITE (*,9906) IRET
+ ENDIF
+C
+C
+ IF (IRET.NE.0.AND.IRET.NE.2)
+ C THEN
+ WRITE (*,9903) IRET
+ IF (KRET.EQ.0) CALL ABORT
+ ENDIF
+C
+ KRET = IRET
+C
+ 9902 FORMAT (1H ,'UNBKOUT : Record length (words) = ',I8)
+C
+ 9903 FORMAT (1H ,'UNBKOUT : Return code = ',I6)
+C
+ 9904 FORMAT (1H ,9X,'KUNIT = ',I6)
+C
+ 9905 FORMAT (1H ,9X,'KINLEN = ',I6)
+C
+ 9906 FORMAT (1H ,9X,'KRET = ',I6)
+C
+ 9907 FORMAT (1H ,9X,'KOUTLEN = ',I6)
+C
+ 9908 FORMAT (1H ,9X,'KEOF = ',I6)
+C
+ 9909 FORMAT (1H ,'IPR = ',I4,' IP = ',I8,' IB = ',I8)
+C
+ 9910 FORMAT (1H ,'UNBKOUT : KRET on input is ',I4,
+ C '. Valid values are 0,1,100 or 101.')
+ 9911 FORMAT (1H ,'UNBKOUT : KUNIT on input is ',I4,
+ C '. Valid values are 1 to 99.')
+ 9912 FORMAT (1H ,'UNBKOUT : Maximum number of files (',I2,
+ C ' exceeded.')
+ 9913 FORMAT (1H ,'UNBKOUT : Error in writing file number ',I2)
+C
+ 9916 FORMAT (1H ,'UNBKOUT : KEOF on input is ',I4,
+ C '. Valid values are 0,1 or 2.')
+ 9917 FORMAT (1H ,'UNBKOUT : Array length is ',I6,' words, but record',
+ C ' length is ',I6,' words.')
+C
+ RETURN
+C
+ END
diff --git a/gribex/unblock.F b/gribex/unblock.F
new file mode 100755
index 0000000..6913bc8
--- /dev/null
+++ b/gribex/unblock.F
@@ -0,0 +1,110 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+#ifdef CRAY
+ SUBROUTINE UNBLOCK (UN1,UN2,IRET)
+C
+C---->
+C**********************************************************************
+C* *
+C* NAME : UNBLOCK *
+C* *
+C* FUNCTION : CONVERTS CRAY BLOCKED DATASET OF GRIB DATA INTO AN *
+C* UNBLOCKED DATASET *
+C* *
+C* INPUT : UN1 = INPUT LUN *
+C* UN2 = OUTPUT LUN *
+C* *
+C* OUTPUT : IRET = -100 BUFFER IN ERROR *
+C* = -200 BUFFER OUT ERROR *
+C* > 0 NO. OF BLOCKS WRITTEN *
+C* *
+C* GENERAL : UNBLOCK CALLS ----- *
+C* *
+C* AUTHOR : B.V. GURETZKY V.E. DAY *
+C* *
+C* MODIFIED : J. HENNESSY 26.11.85 *
+C* *
+C**********************************************************************
+C----<
+C
+ IMPLICIT INTEGER (B,U)
+ PARAMETER (BLEN=25088)
+ DIMENSION BUF(BLEN+512)
+C
+C NO OF WORDS PER BLOCK (UNBLOCKED DATASET ICB = 512 )
+ DATA ICB /512/
+C
+ IRET = 0
+ IRES = 0
+C
+ DO 5000 J = 1,10000
+C
+C READ INPUT FILE RECORD.
+C
+ BUFFER IN (UN1,0) (BUF(IRES+1),BUF(BLEN+ICB))
+ IUNIT = UNIT(UN1)
+ IF (UNIT(UN1)) 1000,5500,10000
+ 1000 CONTINUE
+
+ LEN = IRES + LENGTH(UN1)
+ K = LEN / ICB
+ IE = K * ICB
+ IRES = LEN - IE
+C
+ IF (K.NE.0)
+ C THEN
+C
+C WRITE FIRST CHUNK OF ICB-BLOCKS
+C
+ BUFFER OUT (UN2,0) (BUF(1),BUF(IE))
+ IUNIT = UNIT(UN2)
+ IF (IUNIT.GT.0) GO TO 10100
+ IRET = IRET + K
+C
+C MOVE REMAINDER OF BLOCK TO FRONT AND GET NEXT RECORD.
+C
+ DO 4000 I = 1,IRES
+ BUF(I) = BUF(IE+I)
+ 4000 CONTINUE
+C
+ ENDIF
+C
+ 5000 CONTINUE
+C
+C
+C HANDLE LAST BLOCK, SETTING UNUSED WORDS OF LAST BLOCK TO 0.
+C
+ 5500 IF (IRES.NE.0)
+ C THEN
+ IRES = IRES + 1
+ DO 6000 I = IRES,ICB
+ BUF(I) = 0
+ 6000 CONTINUE
+ BUFFER OUT (UN2,0)(BUF(1),BUF(ICB))
+ IUNIT = UNIT(UN2)
+ IF (IUNIT.GT.0) GO TO 10100
+ IRET = IRET + 1
+ ENDIF
+C
+ RETURN
+C
+10000 CONTINUE
+ IRET = -100
+ WRITE (*,*) 'UNBLOCK : BUFFER IN ERROR'
+ RETURN
+C
+10100 CONTINUE
+ IRET = -200
+ WRITE (*,*) 'UNBLOCK : BUFFER OUT ERROR'
+ RETURN
+C
+ END
+#endif
diff --git a/gribex/uncmpck.F b/gribex/uncmpck.F
new file mode 100755
index 0000000..6487964
--- /dev/null
+++ b/gribex/uncmpck.F
@@ -0,0 +1,141 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE UNCMPCK(PSPEC,KTRUNC,KTRUNCNP)
+C
+C---->
+C**** UNCMPCK
+C
+C Purpose.
+C --------
+C
+C Puts spectral coefficients in contiguous locations.
+C
+C
+C** Interface.
+C ----------
+C
+C CALL UNCMPCK(PSPEC,KTRUNC,KTRUNCNP)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C PSPEC - Array of spectral coefficients.
+C KTRUNC - Truncation of the spherical harmonic coefficients.
+C KTRUNCNP - Truncation of the subset of spherical harmonic
+C coefficients to be re-inserted..
+C
+C
+C Output Parameters.
+C -----------------
+C
+C PSPEC - Array of spectral coefficients rearranged.
+C
+C
+C Method.
+C -------
+C
+C Given the values CCCCCC...C , contiguous in array PSPEC,
+C rearranges them to leave slots for the subset of spectral
+C coefficients to be re-inserted..
+C
+C <subset>|
+C
+C Thus: cccccccc|CCCCCC
+C cccccc|CCCCCC
+C cccc|CCCCCC
+C cc|CCCCCC
+C |CCCCCC
+C CCCC
+C CC
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C --------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C M.Hamrut ECMWF 09:05:94
+C
+C
+C Modifications.
+C _____________
+C
+C None.
+C
+C
+C----<
+C -----------------------------------------------------------------
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+ INTEGER KTRUNC,KTRUNCNP
+ REAL PSPEC((KTRUNC+1)*(KTRUNC+2))
+C
+C Local variables.
+ INTEGER IMAXP, IMAXUP, IUC, IC, JM, JN, IL2, IL1, ILEN
+C
+C -----------------------------------------------------------------
+C* Section 1. Rearrange the values.
+C -----------------------------------------------------------------
+C
+ IMAXP = (KTRUNC+1)*(KTRUNC+2)
+ IMAXUP = (KTRUNC+1)*(KTRUNC+2)-(KTRUNCNP+1)*(KTRUNCNP+2)
+ IUC = IMAXP+1
+ IC = IMAXUP+1
+C
+C Loop through rows, starting at end and working backwards.
+ DO 102 JM=KTRUNC,0,-1
+C
+C In each row calculate value to start with.
+C For early rows, there are some values to skip to leave slots
+C for the subset being re-instated.
+ IL2=MAX(JM,KTRUNCNP+1)
+ IL1=IL2-1
+ ILEN=2*(KTRUNC-IL2+1)
+C
+C Move values for the row.
+CDIR$ IVDEP
+ DO 104 JN=1,ILEN
+ IUC = IUC-1
+ IC = IC-1
+ PSPEC(IUC) = PSPEC(IC)
+ 104 CONTINUE
+C
+ IUC = IUC-MAX((IL1-JM+1)*2,0)
+ 102 CONTINUE
+C
+C -----------------------------------------------------------------
+C* Section 9. Return.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/gribex/unpkcf.F b/gribex/unpkcf.F
new file mode 100755
index 0000000..40f1e9a
--- /dev/null
+++ b/gribex/unpkcf.F
@@ -0,0 +1,268 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION UNPKCF( PARRAY, KTRUNC, KSUBSET, KGRIB, KLENG,
+ X KNSPT, KBITS)
+C
+C---->
+C**** UNPKCF
+C
+C Purpose.
+C --------
+C
+C Unpacks scaled values from a GRIB product to an array of spherical
+C harmonic coefficients, the first KSUBSET triangle of coefficients
+C
+C** Interface.
+C ----------
+C
+C IRET = UNPKCF(PARRAY,KTRUNC,KSUBSET,KGRIB,KLENG,KNSPT,KBITS)
+C
+C
+C Input Parameters.
+C -----------------
+C
+C KTRUNC - Truncation of the spherical harmonic coefficients.
+C KSUBSET - Number indicating truncation of subset.
+C KGRIB - Array containing generated GRIB product.
+C KLENG - Length of KGRIB
+C KNSPT - Bit pointer for next free position in KGRIB.
+C
+C
+C Output Parameters.
+C ------------------
+C
+C PARRAY - Array of spherical harmonic coefficients.
+C KNSPT - Bit pointer for next free position in KGRIB(updated).
+C KBITS - Number of bits per computer word.
+C
+C Returns 0 if OK, otherwise prints an error message and returns
+C an error code.
+C
+C
+C Method.
+C -------
+C <KSUBSET>|
+C
+C Given numbers: cccccccc|cccccc
+C cccccc|cccccc
+C cccc|cccccc
+C cc|cccccc
+C |cccccc
+C cccc
+C cc
+C
+C Converts and moves : cccccccc
+C cccccc
+C cccc
+C cc
+C
+C Externals.
+C ----------
+C
+C DECFP2 - Convert to floating point value from storage format
+#if (defined CRAY) || (defined __uxp__ ) || (defined IBM_POWER4)
+C GSBITE - Extract bit pattern (Vectorized Fortran).
+#endif
+C GBYTES - Extract bit pattern
+C
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Comments.
+C ---------
+C
+C KSUBSET must be less than or equal to KTRUNC.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF 13:04:94
+C
+C
+C Modifications.
+C --------------
+C
+C None.
+C
+C
+C----<
+C ----------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ----------------------------------------------------------------
+C
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Parameters
+ INTEGER JPMAXT
+ PARAMETER ( JPMAXT = 2047 + 1 )
+C
+C Subroutine arguments
+C
+ INTEGER KTRUNC, KSUBSET, KNSPT, KGRIB, KLENG, KBITS
+C
+ REAL PARRAY
+ DIMENSION PARRAY(*), KGRIB(KLENG)
+C
+C Local variables.
+ INTEGER JCOL, JROW, INDEX, ILAST, ITRND, IEXP, IMANT
+ INTEGER INSPT, INEXT, IWORD, IOFF
+ DIMENSION IEXP(JPMAXT*2), IMANT(JPMAXT*2)
+C
+#if (defined CRAY) || (defined __uxp__ ) || (defined IBM_POWER4)
+C
+C Values in IMASK are set in the first call to routine GSBITE, and
+C are used in subsequent calls.
+C
+ INTEGER IMASK
+ DIMENSION IMASK(65)
+ SAVE IMASK
+C
+C Force routine GSBITE to calculate bit-masks first time through.
+ DATA IMASK(2) /0/
+#endif
+C
+C ----------------------------------------------------------------
+C* Section 1 . Check for valid truncation and start values.
+C ----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Check for valid truncation and start values
+C
+ UNPKCF = 0
+ IF ( KSUBSET .GT. KTRUNC ) THEN
+ WRITE(GRPRSM,*) ' UNPKCF - Invalid start/truncation given'
+ WRITE(GRPRSM,*) ' UNPKCF - KSUBSET, KTRUNC =', KSUBSET, KTRUNC
+ UNPKCF = 16500
+ GOTO 900
+ ENDIF
+C
+C ----------------------------------------------------------------
+C* Section 2. Convert values from IBM format exponent and mantissa.
+C Handle values 2 at a time (real and imaginary parts)
+C ----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ ITRND = 1
+ ILAST = KSUBSET+1
+ INDEX = -1
+C
+C Extract values in pairs and convert to floating point
+C
+C Loop through rows in the subset
+ DO 590 JROW = 1 , ILAST
+ INEXT = 2 * (ILAST - JROW + 1)
+C
+C ----------------------------------------------------------------
+C* Section 3. Get exponents from bit array.
+C ----------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C* Calculate word pointer and offset.
+ INSPT = KNSPT
+ IWORD = INSPT / KBITS
+ IOFF = INSPT - IWORD * KBITS
+ IWORD = IWORD + 1
+C
+#if (defined CRAY) || (defined __uxp__ ) || (defined IBM_POWER4)
+ IF (INEXT.GE.8) THEN
+C
+C Vectorising routine GSBITE.
+ CALL GSBITE( KGRIB(IWORD), IEXP, IOFF, 8, 24, INEXT, KBITS,
+ X IMASK, 'D')
+ ELSE
+C
+C Scalar faster.
+ CALL GBYTES( KGRIB(IWORD), IEXP, IOFF, 8, 24, INEXT)
+ ENDIF
+#elif (defined CYBER)
+ CALL GBYTES6( KGRIB(IWORD), IEXP, IOFF, 8, 24, INEXT)
+#else
+ CALL GBYTES( KGRIB(IWORD), IEXP, IOFF, 8, 24, INEXT)
+#endif
+C
+C
+C ----------------------------------------------------------------
+C* Section 4. Get mantissae from bit array.
+C ----------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+C* Calculate word pointer and offset.
+ INSPT = KNSPT + 8
+ IWORD = INSPT / KBITS
+ IOFF = INSPT - IWORD * KBITS
+ IWORD = IWORD + 1
+C
+#if (defined CRAY) || (defined __uxp__ ) || (defined IBM_POWER4)
+ IF (INEXT.GE.8) THEN
+C
+C Vectorising routine GSBITE.
+ CALL GSBITE( KGRIB(IWORD), IMANT, IOFF, 24, 8, INEXT, KBITS,
+ X IMASK, 'D')
+ ELSE
+C
+C Scalar faster.
+ CALL GBYTES( KGRIB(IWORD), IMANT, IOFF, 24, 8, INEXT)
+ ENDIF
+#elif (defined CYBER)
+ CALL GBYTES6( KGRIB(IWORD), IMANT, IOFF, 24, 8, INEXT)
+#else
+ CALL GBYTES( KGRIB(IWORD), IMANT, IOFF, 24, 8, INEXT)
+#endif
+C
+C ----------------------------------------------------------------
+C* Section 5. Convert values from IBM format exponent and mantissa.
+C ----------------------------------------------------------------
+C
+ 500 CONTINUE
+C
+C Convert columns in subset
+ INEXT = 0
+ DO 510 JCOL = JROW , KTRUNC+1
+ INDEX = INDEX + 2
+ IF ( ILAST .GE. JCOL ) THEN
+C
+C Real part ..
+ INEXT = INEXT + 1
+ CALL DECFP2 (PARRAY(INDEX),IEXP(INEXT),IMANT(INEXT))
+C
+C Imaginary part ..
+ INEXT = INEXT + 1
+ CALL DECFP2 (PARRAY(INDEX+1),IEXP(INEXT),IMANT(INEXT))
+ ENDIF
+ 510 CONTINUE
+C
+C Update pointer.
+ KNSPT = KNSPT + INEXT*32
+C
+ 590 CONTINUE
+C
+C ----------------------------------------------------------------
+C* Section 9. Return to calling routine.
+C ----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/gribex/valpina.c b/gribex/valpina.c
new file mode 100755
index 0000000..9dccbac
--- /dev/null
+++ b/gribex/valpina.c
@@ -0,0 +1,243 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include "fortint.h"
+
+#define CHARSIZE (long) (sizeof(char)*8)
+#define LEASTSIGBIT 0x01
+
+long bitmapValue(unsigned char * , long );
+long bitmapValueTotal(unsigned char * , long, long );
+fortint valpina(unsigned char * , fortint *, fortint * );
+fortint valpina_(unsigned char * , fortint *, fortint * );
+long separationBetweenValues(unsigned char * , long , long );
+fortint numvals(unsigned char *, fortint *, fortint *);
+fortint numvals_(unsigned char *, fortint *, fortint *);
+fortint onebits(unsigned char *, fortint *);
+fortint onebits_(unsigned char *, fortint *);
+
+fortint numvals_(unsigned char * grib, fortint* istart, fortint* ifinish) {
+/*
+// Returns a count of the number of 1s in a GRIB between positions
+// 'start' and 'finish'.
+// If start = 0, the static values in the function are initialised.
+*/
+long start = (long) (*istart);
+long finish = (long) (*ifinish);
+static long oldTotal;
+static long oldStart, oldFinish;
+unsigned char * bitmap = grib;
+static unsigned char * oldBitmap = 0;
+
+ if( !start ) {
+ oldBitmap = 0;
+ oldTotal = 0;
+ oldStart = oldFinish = 1;
+ return (fortint) oldTotal;
+ }
+
+ if( oldBitmap != bitmap ) {
+ oldBitmap = bitmap;
+ oldStart = oldFinish = 1;
+ oldTotal = 0;
+ }
+
+ if( start == finish ) {
+ oldStart = oldFinish = finish;
+ oldTotal = 0;
+ return (fortint) oldTotal;
+ }
+
+ if( oldStart != start ) {
+ oldTotal = bitmapValueTotal(bitmap, start+1, finish);
+ }
+ else {
+ if( oldFinish < finish )
+ oldTotal += bitmapValueTotal(bitmap, oldFinish+1, finish);
+ else if( oldFinish > finish )
+ oldTotal -= bitmapValueTotal(bitmap, finish+1, oldFinish);
+ }
+
+ oldStart = start;
+ oldFinish = finish;
+
+ return (fortint) oldTotal;
+
+}
+
+fortint numvals(unsigned char * grib, fortint* istart, fortint* ifinish) {
+ return numvals_(grib,istart,ifinish);
+}
+
+fortint onebits_(unsigned char * grib, fortint* isection_3_offset) {
+/*
+// Returns a count of the number of 1s in a GRIB section 3 bitmap.
+*/
+long section_3_offset = (long) (*isection_3_offset);
+unsigned char * bitmap = grib + section_3_offset;
+long length, unused;
+long number_of_bits, total;
+
+ length = (*bitmap)<<16 | (*(bitmap+1)<<8) | *(bitmap+2);
+ unused = *(bitmap+3);
+ number_of_bits = ((length-6)*CHARSIZE) - unused;
+
+ total = bitmapValueTotal((bitmap+6),1,number_of_bits);
+ return ( (fortint) total );
+}
+
+fortint onebits(unsigned char * grib, fortint* isection_3_offset) {
+ return onebits_(grib,isection_3_offset);
+}
+
+long bitmapValueTotal(unsigned char * bitmap, long start, long finish) {
+/*
+// Returns the count of 1 bits between start and finish in a bitmap.
+*/
+long total = 0;
+unsigned char * first, * last, * next;
+/*
+ Lookup table to count number of 1s in a char
+*/
+static const char lookup[256] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,
+ 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
+ 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
+ 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
+ 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
+ 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
+ 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
+ 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
+ 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
+ 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
+ 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
+ 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
+ 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
+ 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
+ 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
+ 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8};
+/*
+ Masks to remove bits from left- and right-hand end of a char
+*/
+static const unsigned char bottomMask[8] =
+ {0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01};
+static const unsigned char topMask[8] =
+ {0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80};
+int bitsToAdd, bitsToSubtract;
+
+ first = bitmap + (start-1)/CHARSIZE;
+ last = bitmap + (finish-1)/CHARSIZE;
+
+
+ bitsToAdd = (start-1)%CHARSIZE;
+ total = lookup[(*first & bottomMask[bitsToAdd])];
+
+ for( next = (first+1); next < last ; next++ )
+ total += lookup[*next];
+
+ if( last > first ) total += lookup[*last];
+
+ bitsToSubtract = CHARSIZE - 1 - (finish-1)%CHARSIZE;
+ total -= lookup[(*last & (~topMask[bitsToSubtract]))];
+
+ return total;
+}
+
+long bitmapValue(unsigned char * bitmap, long index) {
+/*
+// Returns the value (0,1) of the bit at position 'index' in a bitmap.
+*/
+unsigned char * next;
+int bitShift;
+
+ next = bitmap + (index-1)/CHARSIZE;
+ bitShift = CHARSIZE - 1 - ((index-1)%CHARSIZE);
+
+ return (((*next) >> bitShift) & LEASTSIGBIT);
+
+}
+
+fortint valpina_(unsigned char * grib, fortint* ioffset, fortint* iindex) {
+/*
+// A GRIB product starts at 'grib' and contains missing/non-missing values
+// as described by a bitmap which is at position 'offset' in the GRIB.
+//
+// 'index' is the position of a point (missing/non-missing) in the field.
+// If index = 0, the static values in the function are initialised.
+//
+// Examines the bitmap and returns:
+//
+// - the actual index of a non-missing value
+//
+// - 0 for a missing value
+*/
+long offset = (long) (*ioffset);
+long index = (long) (*iindex);
+unsigned char * bitmap = (grib + offset);
+static unsigned char * oldBitmap;
+static long count = 0;
+static long oldIndex = 0;
+long value;
+
+ if( !(index) ) {
+ oldBitmap = 0;
+ count = 0;
+ oldIndex = 0;
+ return (fortint) 0;
+ }
+
+ if( oldBitmap != bitmap ) {
+ oldBitmap = bitmap;
+ count = 0;
+ oldIndex = 0;
+ }
+
+ value = bitmapValue(bitmap, index);
+
+ if( value ) {
+ if( (index) != oldIndex ) {
+ count += separationBetweenValues(bitmap, oldIndex, index);
+ oldIndex = index;
+ }
+ return (fortint) count;
+ }
+ else
+ return (fortint) 0;
+}
+
+fortint valpina(unsigned char * grib, fortint* ioffset, fortint* iindex) {
+ return valpina_(grib,ioffset,iindex);
+}
+
+long separationBetweenValues(unsigned char * bitmap,long oldIndex,long index) {
+/*
+// Counts the number of actual (non-missing) values between two locations
+// in the bitmap given by 'index' and 'oldIndex'.
+//
+// The returned count can be positive or negative depending on whether
+// index is after or before oldIndex.
+*/
+long start, finish, sign = 1, total = 0;
+
+ if( index > oldIndex ) {
+ start = oldIndex;
+ finish = index;
+ }
+ else {
+ start = index;
+ finish = oldIndex;
+ sign = -1;
+ }
+
+ total = bitmapValueTotal(bitmap, (start+1), finish);
+
+ return (sign*total);
+}
diff --git a/gribex/vod2uv.F b/gribex/vod2uv.F
new file mode 100755
index 0000000..948e004
--- /dev/null
+++ b/gribex/vod2uv.F
@@ -0,0 +1,129 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ SUBROUTINE VOD2UV(VOR,DIV,KTIN,U,V,KTOUT)
+C
+C---->
+C
+CL CALCULATE SPHERICAL HARMONIC COEFFICIENTS OF U*COS(LAT) AND
+CL V*COS(LAT) AT TRIANGULAR TRUNCATION KTOUT, GIVEN THE COEFFICIENTS
+CL OF DIVERGENCE AND VORTICITY AT TRUNCATION KTIN
+CL
+CL WHERE VOR(KDIM1)=INPUT ARRAY OF VORTICITY COEFFICIENTS
+CL DIV(KDIM1)=INPUT ARRAY OF DIVERGENCE COEFFICIENTS
+CL KTIN =INPUT TRIANGULAR TRUNCATION
+CL KDIM1 =(KTIN+1)*(KTIN+2)
+CL U(KDIM2) =OUTPUT ARRAY OF U*COS(LAT) COEFFICIENTS
+CL V(KDIM2) =OUTPUT ARRAY OF V*COS(LAT) COEFFICIENTS
+CL KTOUT =OUTPUT TRIANGULAR TRUNCATION (KTOUT.LE.KTIN)
+CL KDIM2 =(KTOUT+1)*(KTOUT+4)
+C
+C VERSION 1 5/1/81 JAN HASELER ECMWF
+C
+C VERSION 2 5/5/87 MODIFIED BY D. R. ROSKILLY
+C THIS MOD. DOES NOT CALCULATE THE EXTRA VALUES FOR
+C U AND V WINDS TO ALLOW VORT. AND DIV. TO BE RE-CALCULATED
+C IF REQUIRED.
+C
+C Version 3 15/2/88 routine renamed VOD2UV from DVTOUV.
+C
+C VERSION 4 21/8/91 MODIFIED BY K.RIDER
+C
+C THIS MOD. WAS MADE BECAUSE VERSION 2 WAS INCONSISTENTLY
+C TRUNCATING U AND V TO T(ITOUT-1).
+C NOW VORT. AND DIV. ARE CONSISTENTLY TRUNCATED TO T105
+C AND U AND V ARE CALCULATED WITH TRUNCATION T(ITOUT),(WITH
+C ZERO VALUES AT THE CORNER. VORT. AND DIV. CAN BE RECALCULATED
+C IF REQUIRED, BUT ONLY TRUNCATED TO T(ITOUT) SINCE THE HIGHER
+C COEFFICIENTS HAVE BEEN LOST.
+C
+C----<
+C
+ COMPLEX VOR(1),DIV(1),U(1),V(1),ZI
+C
+ DD(PM,PN)=-SQRT((PN*PN-PM*PM)/(4.*PN*PN-1.))/PN
+ SS(PM,PN)=-PM/(PN*(PN+1.))
+C
+ ZI=(0.,1.)
+ REARTH=6.371E6
+ K=1
+ IMN=1
+ ITOUT=MIN0(KTOUT,KTIN)
+C
+CL 1.1 M<ITOUT; N=M
+ 110 CONTINUE
+ DO 155 JM=1,ITOUT
+ ZM=JM-1.
+ ZN=ZM
+ IF (JM.EQ.1) GOTO 115
+ U(K)=(-DD(ZM,ZN+1.)*VOR(IMN+1)+ZI*SS(ZM,ZN)*DIV(IMN))*REARTH
+ V(K)=( DD(ZM,ZN+1.)*DIV(IMN+1)+ZI*SS(ZM,ZN)*VOR(IMN))*REARTH
+ GOTO 120
+C
+ 115 CONTINUE
+ U(K)=(-DD(ZM,ZN+1.)*VOR(IMN+1))*REARTH
+ V(K)=( DD(ZM,ZN+1.)*DIV(IMN+1))*REARTH
+C
+ 120 CONTINUE
+ IMN=IMN+1
+ K=K+1
+ JMP=JM+1
+ IF (JMP.GT.ITOUT) GOTO 140
+C
+CL 1.3 M<ITOUT; N<ITOUT-1
+ 130 CONTINUE
+ DO 135 JN=JMP,ITOUT-1
+ ZN=JN-1.
+ U(K)=( DD(ZM,ZN)*VOR(IMN-1)-DD(ZM,ZN+1)*VOR(IMN+1)
+ 1 +ZI*SS(ZM,ZN)*DIV(IMN))*REARTH
+ V(K)=(-DD(ZM,ZN)*DIV(IMN-1)+DD(ZM,ZN+1)*DIV(IMN+1)
+ 1 +ZI*SS(ZM,ZN)*VOR(IMN))*REARTH
+ K=K+1
+ 135 IMN=IMN+1
+C
+CL 1.3.1 M<ITOUT; N=ITOUT-1
+ 136 CONTINUE
+ ZN=ITOUT-1
+ U(K)=( DD(ZM,ZN)*VOR(IMN-1)+ZI*SS(ZM,ZN)*DIV(IMN))*REARTH
+ V(K)=(-DD(ZM,ZN)*DIV(IMN-1)+ZI*SS(ZM,ZN)*VOR(IMN))*REARTH
+ K=K+1
+ IMN=IMN+1
+C
+CL 1.4 M<ITOUT; N=ITOUT
+ 140 CONTINUE
+ ZN=ITOUT
+ U(K)=( DD(ZM,ZN)*VOR(IMN-1))*REARTH
+ V(K)=(-DD(ZM,ZN)*DIV(IMN-1))*REARTH
+ K=K+1
+C
+CL 1.5 M<ITOUT; N=ITOUT+1
+ 150 CONTINUE
+C-- ZN=ITOUT+1
+C-- U(K)=( DD(ZM,ZN)*VOR(IMN))*REARTH
+C-- V(K)=(-DD(ZM,ZN)*DIV(IMN))*REARTH
+C-- K=K+1
+ IMN=IMN+1+KTIN-ITOUT
+ 155 CONTINUE
+C
+CL 1.6 M=ITOUT; N=ITOUT
+ 160 CONTINUE
+ U(K)=0.
+ V(K)=0.
+ K=K+1
+C
+CL 1.7 M=ITOUT; N=ITOUT+1
+ 170 CONTINUE
+C-- ZN=ITOUT+1
+C-- U(K)= DD(ZM,ZN)*VOR(IMN)*REARTH
+C-- V(K)=-DD(ZM,ZN)*DIV(IMN)*REARTH
+C
+ RETURN
+ END
diff --git a/gribex/xgrdemo.F b/gribex/xgrdemo.F
new file mode 100755
index 0000000..39938f4
--- /dev/null
+++ b/gribex/xgrdemo.F
@@ -0,0 +1,209 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ PROGRAM GRDEMO
+C
+ IMPLICIT NONE
+C
+C---->
+C**** GRDEMO - Program to demonstrate use of GRIBEX routine.
+C
+C Purpose.
+C --------
+C
+C Demonstrates use of GRIBEX routine to unpack
+C GRIB coded data.
+C
+C** Interface.
+C ----------
+C
+C File of GRIB coded data in "datafile".
+C
+C Method.
+C -------
+C
+C Prints sections 0, 1, 2, 3 and 4 of GRIB message.
+C
+C Externals.
+C ----------
+C
+C GRIBEX
+C GRPRS0
+C GRPRS1
+C GRPRS2
+C GRPRS3
+C GRPRS4
+C PBOPEN
+C PBGRIB
+C PBCLOSE
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes for GRIB definition.
+C WMO Publication No. 9, Volume B, for grid catalogue numbers.
+C
+C Comments.
+C ---------
+C
+C GRIBEX provides a number of packing/unpacking options.
+C See documentation for details.
+C
+C
+C -----------------------------------------------------------------
+C----<
+C
+C Arrays are dimensioned to accommodate T213/N160 data volumes.
+C
+ INTEGER JPACK
+ PARAMETER (JPACK=70000)
+ INTEGER ISEC0, ISEC1, ISEC2, ISEC3, ISEC4
+C
+C Array for integer parameters from section 0 of GRIB message.
+C
+ DIMENSION ISEC0(2)
+C
+C Array for integer parameters from section 1 of GRIB message.
+C
+ DIMENSION ISEC1(1024)
+C
+C Array for integer parameters from section 2 of GRIB message.
+C
+ DIMENSION ISEC2(1024)
+C
+C Array for integer parameters from section 3 of GRIB message.
+C
+ DIMENSION ISEC3(2)
+C
+C Array for integer parameters from section 4 of GRIB message.
+C
+ DIMENSION ISEC4(512)
+C
+ REAL ZSEC2, ZSEC3, ZSEC4
+C
+C Array for real parameters from section 2 of GRIB message.
+C
+ DIMENSION ZSEC2(512)
+C
+C Array for real parameters from section 3 of GRIB message.
+C
+ DIMENSION ZSEC3(2)
+C
+C Array for real parameters from section 4 of GRIB message.
+C This is the binary data section and the array to hold the unpacked
+C data may need to be a number of times as long as that for the
+C packed data. Here it is set arbitrarily to four time longer.
+C
+ DIMENSION ZSEC4(JPACK*2)
+C
+C Array to read in packed data.
+C
+ INTEGER INBUFF
+ DIMENSION INBUFF(JPACK)
+C
+ INTEGER FILE, JCOUNT, NUMERR, IRET, IPUNP, IWORD
+ INTEGER LOOP, LENOUT, ILENB
+C
+C Clear counters.
+C
+ NUMERR = 0
+ JCOUNT = 0
+C
+C Open the data file
+C
+ CALL PBOPEN( FILE, "datafile", "R", IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*, *) 'Return code from PBOPEN = ',IRET
+ CALL PBCLOSE(FILE, IRET)
+ STOP 'Fault in PBOPEN'
+ ENDIF
+ ILENB = ILENB*4
+C
+C
+C Loop through GRIB products in file.
+C
+ 50 CONTINUE
+C
+ JCOUNT = JCOUNT + 1
+C
+C Read packed field into INBUFF.
+C
+ CALL PBSIZE(FILE, LENOUT)
+ WRITE(*,*) 'Next GRIB field size = ', lenout
+C
+ ILENB = JPACK * 4
+ CALL PBGRIB( FILE, INBUFF, ILENB, LENOUT, IRET )
+ IF( IRET.LT.0 ) THEN
+ WRITE(*, *) 'Return code from PBGRIB = ',IRET
+ IF( IRET.EQ.-1 ) THEN
+ WRITE(*, *) 'End of file. Number of products = ',(JCOUNT-1)
+ CALL PBCLOSE(FILE, IRET)
+ WRITE(*,*) 'Number of decoding errors = ',NUMERR
+ STOP 'EOF'
+ ELSE
+ WRITE(*, *)
+ X 'Return code = ',IRET,' after ',JCOUNT,' products.'
+ CALL PBCLOSE(FILE, IRET)
+ STOP 'Fault in PBGRIB'
+ ENDIF
+ ENDIF
+ WRITE(*, *) 'Return length from PBGRIB = ',lenout
+C
+C Decode the GRIB product.
+C
+ IRET = 1
+ ILENB = JPACK
+ IPUNP = JPACK * 4
+ CALL GRIBEX(ISEC0,ISEC1,ISEC2,ZSEC2,ISEC3,ZSEC3,ISEC4,
+ X ZSEC4,IPUNP,INBUFF,ILENB,IWORD,'D',IRET)
+C
+C Check the return code.
+c
+ WRITE(*,*) 'GRIBEX return code = ',IRET
+ IF( IRET.EQ.-6 ) WRITE(*,*) 'Pseudo-grib data found.'
+C
+C Update error count if necessary.
+C
+ IF( IRET.GT.0 ) THEN
+ NUMERR = NUMERR + 1
+ GOTO 50
+ ENDIF
+C
+C Print section 0, 1, 2 and 3 (if present) and 4.
+C Section 1 is the product definition section.
+C Section 2 is the grid definition section.
+C Section 3 is the bit-map section.
+C Section 4 is the data section.
+C
+ CALL GRPRS0(ISEC0)
+ CALL GRPRS1(ISEC0,ISEC1)
+C
+ IF( (ISEC1(5).EQ.0).OR.(ISEC1(5).EQ.64) ) THEN
+ WRITE(*,*) 'No section 2 in GRIB message.'
+ ELSE
+ CALL GRPRS2(ISEC0,ISEC2,ZSEC2)
+ ENDIF
+C
+ IF( (ISEC1(5).EQ.0).OR.(ISEC1(5).EQ.128) ) THEN
+ WRITE(*,*) 'No section 3 in GRIB message.'
+ ELSE
+ CALL GRPRS3(ISEC0,ISEC3,ZSEC3)
+ ENDIF
+C
+ CALL GRPRS4(ISEC0,ISEC4,ZSEC4)
+C
+C Print some vales
+ DO LOOP = 1,ISEC4(1)
+ WRITE(*,*) 'zsec4(', loop, ') = ', zsec4(loop)
+ ENDDO
+C
+ GOTO 50
+C
+ END
diff --git a/gribex/yyyy2cy.F b/gribex/yyyy2cy.F
new file mode 100755
index 0000000..df8380d
--- /dev/null
+++ b/gribex/yyyy2cy.F
@@ -0,0 +1,93 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION YYYY2CY(YYYY, CENTURY, YEAR)
+C
+C---->
+C**** YYYY2CY
+C
+C Purpose
+C -------
+C
+C Return WMO defined century and year from YYYY date.
+C
+C
+C Interface
+C ---------
+C
+C IRET = YYYY2CY(YYYY, CENTURY, YEAR)
+C
+C Input
+C -----
+C
+C YYYY = Integer date in YYYY formay (eg 1998)
+C
+C
+C Output
+C ------
+C
+C CENTURY = Integer century in CC format (eg 20 for 1998)
+C YEAR = Integer year in range 1 to 100 (eg 98 for 1998)
+C
+C Returns 0 if function worked OK.
+C Otherwise an illegal year has been give.
+C
+C
+C Method
+C ------
+C
+C Last year in century is year 100
+C (eg year 2000 is century 20, year 100)
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Sept 1998
+C
+C
+C ------------------------------------------------------------------
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER YYYY, CENTURY, YEAR
+C
+C ------------------------------------------------------------------
+C* Section 1. Check valid input year (0000 to 9999)
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Check valid input year (0000 to 9999)
+C
+ IF( (YYYY.LT.0).OR.(YYYY.GT.9999) ) THEN
+ YYYY2CY = 1
+ RETURN
+ ENDIF
+C
+ YEAR = YYYY - 1
+ YEAR = MOD(YEAR,100) + 1
+C
+ CENTURY = (YYYY/100 +1 )
+ IF( YEAR.EQ.100 ) CENTURY = CENTURY - 1
+C
+C ------------------------------------------------------------------
+C* Section 9. Return
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ YYYY2CY = 0
+ RETURN
+ END
+
diff --git a/gribtables/cen074/local_table_2_version_174 b/gribtables/cen074/local_table_2_version_174
new file mode 100755
index 0000000..027ec87
--- /dev/null
+++ b/gribtables/cen074/local_table_2_version_174
@@ -0,0 +1,180 @@
+Non-ECMWF seasonal forecast model local table 2: Version Number 175 - anomalies.
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+006
+-
+Total soil moisture
+m
+The depth over which it is integrated varies depending on soil type
+......................
+031
+-
+Fraction of sea-ice in sea
+0 - 1
+0 - 1
+......................
+034
+-
+Open-sea surface temperature
+K
+K
+......................
+039
+-
+Volumetric soil water layer 1
+m**3 m**-3
+0 - 10cm
+......................
+040
+-
+Volumetric soil water layer 2
+m**3 m**-3
+10 - 35cm
+......................
+041
+-
+Volumetric soil water layer 3
+m**3 m**-3
+35 - 100cm
+......................
+042
+-
+Volumetric soil water layer 4
+m**3 m**-3
+100 - 300cm
+......................
+049
+-
+0m wind gust over last 24 hours
+m s**-1
+m s**-1
+......................
+055
+-
+1.5m temperature - mean over last 24 hours
+K
+K
+......................
+83
+-
+Net primary productivity
+kg C m**-2 s**-1
+kg C m**-2 s**-1
+......................
+85
+-
+10m U wind over land
+m s**-1
+m s**-1
+......................
+86
+-
+10m V wind over land
+m s**-1
+m s**-1
+......................
+87
+-
+1.5m temperature over land
+K
+K
+......................
+88
+-
+1.5m dewpoint temperature over land
+K
+K
+......................
+89
+-
+Top incoming solar radiation
+W m**-2 s
+Accumulated
+......................
+90
+-
+Top outgoing solar radiation
+W m**-2 s
+Accumulated
+......................
+110
+-
+Ocean ice concentration
+0 - 1
+0 - 1
+......................
+111
+-
+Ocean mean ice depth
+m
+m
+......................
+139
+-
+Soil temperature layer 1
+K
+0 - 10cm
+......................
+164
+-
+Average potential temperature in upper 293.4m
+degrees C
+degrees C
+......................
+167
+-
+1.5m temperature
+K
+K
+......................
+168
+-
+1.5m dewpoint temperature
+K
+K
+......................
+170
+-
+Soil temperature layer 2
+K
+10 - 35cm
+......................
+172
+-
+Fractional land mask
+0 - 1
+0 - 1
+......................
+175
+-
+Average salinity in upper 293.4m
+psu
+psu
+......................
+183
+-
+Soil temperature layer 3
+K
+35 - 100cm
+......................
+201
+-
+1.5m temperature - maximum over last 24 hours
+K
+K
+......................
+202
+-
+1.5m temperature - minimum over last 24 hours
+K
+K
+......................
+236
+-
+Soil temperature layer 4
+K
+K
+......................
+999
+.
+.
diff --git a/gribtables/cen074/local_table_2_version_175 b/gribtables/cen074/local_table_2_version_175
new file mode 100755
index 0000000..027ec87
--- /dev/null
+++ b/gribtables/cen074/local_table_2_version_175
@@ -0,0 +1,180 @@
+Non-ECMWF seasonal forecast model local table 2: Version Number 175 - anomalies.
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+006
+-
+Total soil moisture
+m
+The depth over which it is integrated varies depending on soil type
+......................
+031
+-
+Fraction of sea-ice in sea
+0 - 1
+0 - 1
+......................
+034
+-
+Open-sea surface temperature
+K
+K
+......................
+039
+-
+Volumetric soil water layer 1
+m**3 m**-3
+0 - 10cm
+......................
+040
+-
+Volumetric soil water layer 2
+m**3 m**-3
+10 - 35cm
+......................
+041
+-
+Volumetric soil water layer 3
+m**3 m**-3
+35 - 100cm
+......................
+042
+-
+Volumetric soil water layer 4
+m**3 m**-3
+100 - 300cm
+......................
+049
+-
+0m wind gust over last 24 hours
+m s**-1
+m s**-1
+......................
+055
+-
+1.5m temperature - mean over last 24 hours
+K
+K
+......................
+83
+-
+Net primary productivity
+kg C m**-2 s**-1
+kg C m**-2 s**-1
+......................
+85
+-
+10m U wind over land
+m s**-1
+m s**-1
+......................
+86
+-
+10m V wind over land
+m s**-1
+m s**-1
+......................
+87
+-
+1.5m temperature over land
+K
+K
+......................
+88
+-
+1.5m dewpoint temperature over land
+K
+K
+......................
+89
+-
+Top incoming solar radiation
+W m**-2 s
+Accumulated
+......................
+90
+-
+Top outgoing solar radiation
+W m**-2 s
+Accumulated
+......................
+110
+-
+Ocean ice concentration
+0 - 1
+0 - 1
+......................
+111
+-
+Ocean mean ice depth
+m
+m
+......................
+139
+-
+Soil temperature layer 1
+K
+0 - 10cm
+......................
+164
+-
+Average potential temperature in upper 293.4m
+degrees C
+degrees C
+......................
+167
+-
+1.5m temperature
+K
+K
+......................
+168
+-
+1.5m dewpoint temperature
+K
+K
+......................
+170
+-
+Soil temperature layer 2
+K
+10 - 35cm
+......................
+172
+-
+Fractional land mask
+0 - 1
+0 - 1
+......................
+175
+-
+Average salinity in upper 293.4m
+psu
+psu
+......................
+183
+-
+Soil temperature layer 3
+K
+35 - 100cm
+......................
+201
+-
+1.5m temperature - maximum over last 24 hours
+K
+K
+......................
+202
+-
+1.5m temperature - minimum over last 24 hours
+K
+K
+......................
+236
+-
+Soil temperature layer 4
+K
+K
+......................
+999
+.
+.
diff --git a/gribtables/cen080/local_table_2_version_201 b/gribtables/cen080/local_table_2_version_201
new file mode 100755
index 0000000..01b9109
--- /dev/null
+++ b/gribtables/cen080/local_table_2_version_201
@@ -0,0 +1,796 @@
+......................
+001
+None
+downward shortwave radiant flux density
+W m**-2
+W m**-2
+......................
+002
+None
+upward shortwave radiant flux density
+W m**-2
+W m**-2
+......................
+003
+None
+downward longwave radiant flux density
+W m**-2
+W m**-2
+......................
+004
+None
+upward longwave radiant flux density
+W m**-2
+W m**-2
+......................
+005
+APAB_S
+downwd photosynthetic active radiant flux density
+W m**-2
+W m**-2
+......................
+006
+None
+net shortwave flux
+W m**-2
+W m**-2
+......................
+007
+None
+net longwave flux
+W m**-2
+W m**-2
+......................
+008
+None
+total net radiative flux density
+W m**-2
+W m**-2
+......................
+009
+None
+downw shortw radiant flux density, cloudfree part
+W m**-2
+W m**-2
+......................
+010
+None
+upw shortw radiant flux density, cloudy part
+W m**-2
+W m**-2
+......................
+011
+None
+downw longw radiant flux density, cloudfree part
+W m**-2
+W m**-2
+......................
+012
+None
+upw longw radiant flux density, cloudy part
+W m**-2
+W m**-2
+......................
+013
+SOHR_RAD
+shortwave radiative heating rate
+K s**-1
+K s**-1
+......................
+014
+THHR_RAD
+longwave radiative heating rate
+K s**-1
+K s**-1
+......................
+015
+None
+total radiative heating rate
+W m**-2
+W m**-2
+......................
+016
+None
+soil heat flux, surface
+W m**-2
+W m**-2
+......................
+017
+None
+soil heat flux, bottom of layer
+W m**-2
+W m**-2
+......................
+018
+None
+undefined
+-
+-
+......................
+019
+None
+undefined
+-
+-
+......................
+020
+None
+undefined
+-
+-
+......................
+021
+None
+undefined
+-
+-
+......................
+022
+None
+undefined
+-
+-
+......................
+023
+None
+undefined
+-
+-
+......................
+024
+None
+undefined
+-
+-
+......................
+025
+None
+undefined
+-
+-
+......................
+026
+None
+undefined
+-
+-
+......................
+027
+None
+undefined
+-
+-
+......................
+028
+None
+undefined
+-
+-
+......................
+029
+CLC
+fractional cloud cover
+(0-1)
+(0-1)
+......................
+030
+None
+cloud cover, grid scale
+(0-1)
+(0-1)
+......................
+031
+QC
+specific cloud water content
+kg kg**-1
+kg kg**-1
+......................
+032
+None
+cloud water content, grid scale, vert integrated
+kg m**-2
+kg m**-2
+......................
+033
+QI
+specific cloud ice content, grid scale
+kg kg**-1
+kg kg**-1
+......................
+034
+None
+cloud ice content, grid scale, vert integrated
+kg m**-2
+kg m**-2
+......................
+035
+None
+specific rainwater content, grid scale
+kg kg**-1
+kg kg**-1
+......................
+036
+None
+specific snow content, grid scale
+kg kg**-1
+kg kg**-1
+......................
+037
+None
+specific rainwater content, gs, vert. integrated
+kg m**-2
+kg m**-2
+......................
+038
+None
+specific snow content, gs, vert. integrated
+kg m**-2
+kg m**-2
+......................
+039
+None
+undefined
+-
+-
+......................
+040
+None
+undefined
+-
+-
+......................
+041
+TWATER
+total column water
+kg m**-2
+kg m**-2
+......................
+042
+None
+vert. integral of divergence of tot. water content
+kg m**-2
+kg m**-2
+......................
+043
+None
+undefined
+-
+-
+......................
+044
+None
+undefined
+-
+-
+......................
+045
+None
+undefined
+-
+-
+......................
+046
+None
+undefined
+-
+-
+......................
+047
+None
+undefined
+-
+-
+......................
+048
+None
+undefined
+-
+-
+......................
+049
+None
+undefined
+-
+-
+......................
+050
+CH_CM_CL
+cloud covers CH_CM_CL (000...888)
+(0-1)
+(0-1)
+......................
+051
+None
+cloud cover CH (0..8)
+(0-1)
+(0-1)
+......................
+052
+None
+cloud cover CM (0..8)
+(0-1)
+(0-1)
+......................
+053
+None
+cloud cover CL (0..8)
+(0-1)
+(0-1)
+......................
+054
+None
+total cloud cover (0..8)
+(0-1)
+(0-1)
+......................
+055
+None
+fog (0..8)
+(0-1)
+(0-1)
+......................
+056
+None
+fog
+(0-1)
+(0-1)
+......................
+057
+None
+undefined
+-
+-
+......................
+058
+None
+undefined
+-
+-
+......................
+059
+None
+undefined
+-
+-
+......................
+060
+None
+cloud cover, convective cirrus
+(0-1)
+(0-1)
+......................
+061
+None
+specific cloud water content, convective clouds
+kg kg**-1
+kg kg**-1
+......................
+062
+None
+cloud water content, conv clouds, vert integrated
+kg m**-2
+kg m**-2
+......................
+063
+None
+specific cloud ice content, convective clouds
+kg kg**-1
+kg kg**-1
+......................
+064
+None
+cloud ice content, conv clouds, vert integrated
+kg m**-2
+kg m**-2
+......................
+065
+None
+convective mass flux
+kg s**-1 m**-2
+kg s**-1 m**-2
+......................
+066
+None
+updraft velocity, convection
+m s**-1
+m s**-1
+......................
+067
+None
+entrainment parameter, convection
+m**-1
+m**-1
+......................
+068
+HBAS_CON
+cloud base, convective clouds (above msl)
+m
+m
+......................
+069
+HTOP_CON
+cloud top, convective clouds (above msl)
+m
+m
+......................
+070
+None
+convective layers (00...77) (BKE)
+(0-1)
+(0-1)
+......................
+071
+None
+KO-index
+(1)
+(1)
+......................
+072
+BAS_CON
+convection base index
+(1)
+(1)
+......................
+073
+TOP_CON
+convection top index
+(1)
+(1)
+......................
+074
+DT_CON
+convective temperature tendency
+K s**-1
+K s**-1
+......................
+075
+DQV_CON
+convective tendency of specific humidity
+s**-1
+s**-1
+......................
+076
+None
+convective tendency of total heat
+J kg**-1 s**-1
+J kg**-1 s**-1
+......................
+077
+None
+convective tendency of total water
+s**-1
+s**-1
+......................
+078
+DU_CON
+convective momentum tendency (X-component)
+m s**-2
+m s**-2
+......................
+079
+DV_CON
+convective momentum tendency (Y-component)
+m s**-2
+m s**-2
+......................
+080
+None
+convective vorticity tendency
+s**-2
+s**-2
+......................
+081
+None
+convective divergence tendency
+s**-2
+s**-2
+......................
+082
+HTOP_DC
+top of dry convection (above msl)
+m
+m
+......................
+083
+None
+dry convection top index
+(1)
+(1)
+......................
+084
+HZEROCL
+height of 0 degree Celsius isotherm above msl
+m
+m
+......................
+085
+SNOWLMT
+height of snow-fall limit
+m
+m
+......................
+086
+None
+undefined
+-
+-
+......................
+087
+None
+undefined
+-
+-
+......................
+088
+None
+undefined
+-
+-
+......................
+089
+None
+undefined
+-
+-
+......................
+090
+None
+undefined
+-
+-
+......................
+091
+None
+undefined
+-
+-
+......................
+092
+None
+undefined
+-
+-
+......................
+093
+None
+undefined
+-
+-
+......................
+094
+None
+undefined
+-
+-
+......................
+095
+None
+undefined
+-
+-
+......................
+096
+None
+undefined
+-
+-
+......................
+097
+None
+undefined
+-
+-
+......................
+098
+None
+undefined
+-
+-
+......................
+099
+QRS_GSP
+spec. content of precip. particles
+kg kg**-1
+kg kg**-1
+......................
+100
+PRR_GSP
+surface precipitation rate, rain, grid scale
+kg s**-1 m**-2
+kg s**-1 m**-2
+......................
+101
+PRS_GSP
+surface precipitation rate, snow, grid scale
+kg s**-1 m**-2
+kg s**-1 m**-2
+......................
+102
+RAIN_GSP
+surface precipitation amount, rain, grid scale
+kg m**-2
+kg m**-2
+......................
+111
+PRR_CON
+surface precipitation rate, rain, convective
+kg s**-1 m**-2
+kg s**-1 m**-2
+......................
+112
+PRS_CON
+surface precipitation rate, snow, convective
+kg s**-1 m**-2
+kg s**-1 m**-2
+......................
+113
+RAIN_CON
+surface precipitation amount, rain, convective
+kg m**-2
+kg m**-2
+......................
+130
+None
+undefined
+-
+-
+......................
+131
+None
+undefined
+-
+-
+......................
+132
+None
+undefined
+-
+-
+......................
+133
+None
+undefined
+-
+-
+......................
+134
+None
+undefined
+-
+-
+......................
+135
+None
+undefined
+-
+-
+......................
+136
+None
+undefined
+-
+-
+......................
+137
+None
+undefined
+-
+-
+......................
+138
+None
+undefined
+-
+-
+......................
+139
+PP
+deviation of pressure from reference value
+Pa
+Pa
+......................
+140
+None
+undefined
+-
+-
+......................
+141
+None
+undefined
+-
+-
+......................
+142
+None
+undefined
+-
+-
+......................
+143
+None
+undefined
+-
+-
+......................
+144
+None
+undefined
+-
+-
+......................
+145
+None
+undefined
+-
+-
+......................
+146
+None
+undefined
+-
+-
+......................
+147
+None
+undefined
+-
+-
+......................
+148
+None
+undefined
+-
+-
+......................
+149
+None
+undefined
+-
+-
+......................
+150
+None
+coefficient of horizontal diffusion
+m**2 s**-1
+m**2 s**-1
+......................
+187
+VMAX_10M
+maximum wind velocity
+m s**-1
+m s**-1
+......................
+200
+W_I
+water content of interception store
+kg m**-2
+kg m**-2
+......................
+203
+T_SNOW
+snow temperature
+K
+K
+......................
+215
+T_ICE
+ice surface temperature
+K
+K
+......................
+241
+CAPE_CON
+convective available potential energy
+J kg**-1
+J kg**-1
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/cen085/local_table_2_version_001 b/gribtables/cen085/local_table_2_version_001
new file mode 100755
index 0000000..96c327c
--- /dev/null
+++ b/gribtables/cen085/local_table_2_version_001
@@ -0,0 +1,225 @@
+Meteo France local table 2: Version Number 128 (+1,2,3... for entries below 128)
+Codes and data units for FM 92-X Ext.GRIB.
+......................
+008
+ALTITUDE
+Geometrical height
+m
+m
+......................
+062
+PRLGE
+Large scale precipitation (water)
+kg m**-2
+kg m**-2
+......................
+063
+PRLCV
+Convective precipitation (water)
+kg m**-2
+kg m**-2
+......................
+128
+EAZSOL
+Anal. error std dev for Z at soil level
+kg m**-1 s**-2
+kg m**-1 s**-2
+......................
+129
+EPZSOL
+Guess error std dev for Z at soil level
+kg m**-1 s**-2
+kg m**-1 s**-2
+......................
+130
+USTR
+U-component of time-integrated stress
+W m**-2
+W m**-2
+......................
+131
+VSTR
+V-component of time-integrated stress
+W m**-2
+W m**-2
+......................
+132
+TPWCLS
+Pseudo-adiabtemp in surface boundarylayer
+K
+K
+......................
+133
+FLP
+Flight-level using ICAO standard pressure
+Ft
+Ft
+......................
+134
+CAT
+Clear air turbulence
+kg m**-1 s**-3
+kg m**-1 s**-3
+......................
+135
+AIR_CS
+Caesium pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+136
+SOL_CS
+Caesium pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+137
+AIR_IO
+Iode pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+138
+SOL_IO
+Iode pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+139
+AIR_RAD
+Radiative pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+140
+SOL_RAD
+Radiative pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+141
+AIR_CHIM
+Chemical pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+142
+SOL_CHIM
+Chemical pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+143
+AIR_PASS
+Passive tracer concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+144
+AIR_VOLCAN
+Volcanic pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+145
+SOL_VOLCAN
+Volcanic pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+149
+TP
+Potential vorticity
+K m**2 kg**-1 s**-1
+K m**2 kg**-1 s**-1
+......................
+150
+EAU
+Total water-type precipitation
+kg m**-2
+kg m**-2
+......................
+151
+BILANHY
+Hydric balance
+kg m**-2
+kg m**-2
+......................
+152
+RESERV_GLAC
+Ice content
+kg m**-2
+kg m**-2
+......................
+153
+RESERV_LIQU
+Water content
+kg m**-2
+kg m**-2
+......................
+154
+GIVRAGE
+Freezing risk index
+g Kg**-1
+g Kg**-1
+......................
+155
+GIVRAGE_VV
+Freezing risk index as regards vert.veloc
+g Kg**-1
+g Kg**-1
+......................
+156
+PREC_CONVEC
+Convective precipitation (all types)
+kg m**-2
+kg m**-2
+......................
+157
+PREC_GDE_ECH
+Large-scale precipitation (all types)
+kg m**-2
+kg m**-2
+......................
+158
+FLLUNAIRE_D
+Downwards lunar radiation flux (surface)
+kg m**-1 s**-3
+kg m**-1 s**-3
+......................
+200
+MWD
+Mean wave direction
+degrees
+degrees
+......................
+201
+MWP
+Mean wave period
+s
+s
+......................
+202
+SHPS
+Significant height of primary swell
+m
+m
+......................
+203
+SHSS
+Significant height of secondary swell
+m
+m
+......................
+204
+PP1D
+Peak period of 1-dimensional wave spectra
+s
+s
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
diff --git a/gribtables/cen085/local_table_2_version_002 b/gribtables/cen085/local_table_2_version_002
new file mode 100755
index 0000000..96c327c
--- /dev/null
+++ b/gribtables/cen085/local_table_2_version_002
@@ -0,0 +1,225 @@
+Meteo France local table 2: Version Number 128 (+1,2,3... for entries below 128)
+Codes and data units for FM 92-X Ext.GRIB.
+......................
+008
+ALTITUDE
+Geometrical height
+m
+m
+......................
+062
+PRLGE
+Large scale precipitation (water)
+kg m**-2
+kg m**-2
+......................
+063
+PRLCV
+Convective precipitation (water)
+kg m**-2
+kg m**-2
+......................
+128
+EAZSOL
+Anal. error std dev for Z at soil level
+kg m**-1 s**-2
+kg m**-1 s**-2
+......................
+129
+EPZSOL
+Guess error std dev for Z at soil level
+kg m**-1 s**-2
+kg m**-1 s**-2
+......................
+130
+USTR
+U-component of time-integrated stress
+W m**-2
+W m**-2
+......................
+131
+VSTR
+V-component of time-integrated stress
+W m**-2
+W m**-2
+......................
+132
+TPWCLS
+Pseudo-adiabtemp in surface boundarylayer
+K
+K
+......................
+133
+FLP
+Flight-level using ICAO standard pressure
+Ft
+Ft
+......................
+134
+CAT
+Clear air turbulence
+kg m**-1 s**-3
+kg m**-1 s**-3
+......................
+135
+AIR_CS
+Caesium pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+136
+SOL_CS
+Caesium pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+137
+AIR_IO
+Iode pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+138
+SOL_IO
+Iode pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+139
+AIR_RAD
+Radiative pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+140
+SOL_RAD
+Radiative pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+141
+AIR_CHIM
+Chemical pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+142
+SOL_CHIM
+Chemical pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+143
+AIR_PASS
+Passive tracer concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+144
+AIR_VOLCAN
+Volcanic pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+145
+SOL_VOLCAN
+Volcanic pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+149
+TP
+Potential vorticity
+K m**2 kg**-1 s**-1
+K m**2 kg**-1 s**-1
+......................
+150
+EAU
+Total water-type precipitation
+kg m**-2
+kg m**-2
+......................
+151
+BILANHY
+Hydric balance
+kg m**-2
+kg m**-2
+......................
+152
+RESERV_GLAC
+Ice content
+kg m**-2
+kg m**-2
+......................
+153
+RESERV_LIQU
+Water content
+kg m**-2
+kg m**-2
+......................
+154
+GIVRAGE
+Freezing risk index
+g Kg**-1
+g Kg**-1
+......................
+155
+GIVRAGE_VV
+Freezing risk index as regards vert.veloc
+g Kg**-1
+g Kg**-1
+......................
+156
+PREC_CONVEC
+Convective precipitation (all types)
+kg m**-2
+kg m**-2
+......................
+157
+PREC_GDE_ECH
+Large-scale precipitation (all types)
+kg m**-2
+kg m**-2
+......................
+158
+FLLUNAIRE_D
+Downwards lunar radiation flux (surface)
+kg m**-1 s**-3
+kg m**-1 s**-3
+......................
+200
+MWD
+Mean wave direction
+degrees
+degrees
+......................
+201
+MWP
+Mean wave period
+s
+s
+......................
+202
+SHPS
+Significant height of primary swell
+m
+m
+......................
+203
+SHSS
+Significant height of secondary swell
+m
+m
+......................
+204
+PP1D
+Peak period of 1-dimensional wave spectra
+s
+s
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
diff --git a/gribtables/cen085/local_table_2_version_003 b/gribtables/cen085/local_table_2_version_003
new file mode 100755
index 0000000..96c327c
--- /dev/null
+++ b/gribtables/cen085/local_table_2_version_003
@@ -0,0 +1,225 @@
+Meteo France local table 2: Version Number 128 (+1,2,3... for entries below 128)
+Codes and data units for FM 92-X Ext.GRIB.
+......................
+008
+ALTITUDE
+Geometrical height
+m
+m
+......................
+062
+PRLGE
+Large scale precipitation (water)
+kg m**-2
+kg m**-2
+......................
+063
+PRLCV
+Convective precipitation (water)
+kg m**-2
+kg m**-2
+......................
+128
+EAZSOL
+Anal. error std dev for Z at soil level
+kg m**-1 s**-2
+kg m**-1 s**-2
+......................
+129
+EPZSOL
+Guess error std dev for Z at soil level
+kg m**-1 s**-2
+kg m**-1 s**-2
+......................
+130
+USTR
+U-component of time-integrated stress
+W m**-2
+W m**-2
+......................
+131
+VSTR
+V-component of time-integrated stress
+W m**-2
+W m**-2
+......................
+132
+TPWCLS
+Pseudo-adiabtemp in surface boundarylayer
+K
+K
+......................
+133
+FLP
+Flight-level using ICAO standard pressure
+Ft
+Ft
+......................
+134
+CAT
+Clear air turbulence
+kg m**-1 s**-3
+kg m**-1 s**-3
+......................
+135
+AIR_CS
+Caesium pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+136
+SOL_CS
+Caesium pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+137
+AIR_IO
+Iode pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+138
+SOL_IO
+Iode pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+139
+AIR_RAD
+Radiative pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+140
+SOL_RAD
+Radiative pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+141
+AIR_CHIM
+Chemical pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+142
+SOL_CHIM
+Chemical pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+143
+AIR_PASS
+Passive tracer concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+144
+AIR_VOLCAN
+Volcanic pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+145
+SOL_VOLCAN
+Volcanic pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+149
+TP
+Potential vorticity
+K m**2 kg**-1 s**-1
+K m**2 kg**-1 s**-1
+......................
+150
+EAU
+Total water-type precipitation
+kg m**-2
+kg m**-2
+......................
+151
+BILANHY
+Hydric balance
+kg m**-2
+kg m**-2
+......................
+152
+RESERV_GLAC
+Ice content
+kg m**-2
+kg m**-2
+......................
+153
+RESERV_LIQU
+Water content
+kg m**-2
+kg m**-2
+......................
+154
+GIVRAGE
+Freezing risk index
+g Kg**-1
+g Kg**-1
+......................
+155
+GIVRAGE_VV
+Freezing risk index as regards vert.veloc
+g Kg**-1
+g Kg**-1
+......................
+156
+PREC_CONVEC
+Convective precipitation (all types)
+kg m**-2
+kg m**-2
+......................
+157
+PREC_GDE_ECH
+Large-scale precipitation (all types)
+kg m**-2
+kg m**-2
+......................
+158
+FLLUNAIRE_D
+Downwards lunar radiation flux (surface)
+kg m**-1 s**-3
+kg m**-1 s**-3
+......................
+200
+MWD
+Mean wave direction
+degrees
+degrees
+......................
+201
+MWP
+Mean wave period
+s
+s
+......................
+202
+SHPS
+Significant height of primary swell
+m
+m
+......................
+203
+SHSS
+Significant height of secondary swell
+m
+m
+......................
+204
+PP1D
+Peak period of 1-dimensional wave spectra
+s
+s
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
diff --git a/gribtables/cen085/local_table_2_version_128 b/gribtables/cen085/local_table_2_version_128
new file mode 100755
index 0000000..96c327c
--- /dev/null
+++ b/gribtables/cen085/local_table_2_version_128
@@ -0,0 +1,225 @@
+Meteo France local table 2: Version Number 128 (+1,2,3... for entries below 128)
+Codes and data units for FM 92-X Ext.GRIB.
+......................
+008
+ALTITUDE
+Geometrical height
+m
+m
+......................
+062
+PRLGE
+Large scale precipitation (water)
+kg m**-2
+kg m**-2
+......................
+063
+PRLCV
+Convective precipitation (water)
+kg m**-2
+kg m**-2
+......................
+128
+EAZSOL
+Anal. error std dev for Z at soil level
+kg m**-1 s**-2
+kg m**-1 s**-2
+......................
+129
+EPZSOL
+Guess error std dev for Z at soil level
+kg m**-1 s**-2
+kg m**-1 s**-2
+......................
+130
+USTR
+U-component of time-integrated stress
+W m**-2
+W m**-2
+......................
+131
+VSTR
+V-component of time-integrated stress
+W m**-2
+W m**-2
+......................
+132
+TPWCLS
+Pseudo-adiabtemp in surface boundarylayer
+K
+K
+......................
+133
+FLP
+Flight-level using ICAO standard pressure
+Ft
+Ft
+......................
+134
+CAT
+Clear air turbulence
+kg m**-1 s**-3
+kg m**-1 s**-3
+......................
+135
+AIR_CS
+Caesium pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+136
+SOL_CS
+Caesium pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+137
+AIR_IO
+Iode pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+138
+SOL_IO
+Iode pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+139
+AIR_RAD
+Radiative pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+140
+SOL_RAD
+Radiative pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+141
+AIR_CHIM
+Chemical pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+142
+SOL_CHIM
+Chemical pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+143
+AIR_PASS
+Passive tracer concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+144
+AIR_VOLCAN
+Volcanic pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+145
+SOL_VOLCAN
+Volcanic pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+149
+TP
+Potential vorticity
+K m**2 kg**-1 s**-1
+K m**2 kg**-1 s**-1
+......................
+150
+EAU
+Total water-type precipitation
+kg m**-2
+kg m**-2
+......................
+151
+BILANHY
+Hydric balance
+kg m**-2
+kg m**-2
+......................
+152
+RESERV_GLAC
+Ice content
+kg m**-2
+kg m**-2
+......................
+153
+RESERV_LIQU
+Water content
+kg m**-2
+kg m**-2
+......................
+154
+GIVRAGE
+Freezing risk index
+g Kg**-1
+g Kg**-1
+......................
+155
+GIVRAGE_VV
+Freezing risk index as regards vert.veloc
+g Kg**-1
+g Kg**-1
+......................
+156
+PREC_CONVEC
+Convective precipitation (all types)
+kg m**-2
+kg m**-2
+......................
+157
+PREC_GDE_ECH
+Large-scale precipitation (all types)
+kg m**-2
+kg m**-2
+......................
+158
+FLLUNAIRE_D
+Downwards lunar radiation flux (surface)
+kg m**-1 s**-3
+kg m**-1 s**-3
+......................
+200
+MWD
+Mean wave direction
+degrees
+degrees
+......................
+201
+MWP
+Mean wave period
+s
+s
+......................
+202
+SHPS
+Significant height of primary swell
+m
+m
+......................
+203
+SHSS
+Significant height of secondary swell
+m
+m
+......................
+204
+PP1D
+Peak period of 1-dimensional wave spectra
+s
+s
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
diff --git a/gribtables/cen085/local_table_2_version_128.ecmwf b/gribtables/cen085/local_table_2_version_128.ecmwf
new file mode 100755
index 0000000..96c327c
--- /dev/null
+++ b/gribtables/cen085/local_table_2_version_128.ecmwf
@@ -0,0 +1,225 @@
+Meteo France local table 2: Version Number 128 (+1,2,3... for entries below 128)
+Codes and data units for FM 92-X Ext.GRIB.
+......................
+008
+ALTITUDE
+Geometrical height
+m
+m
+......................
+062
+PRLGE
+Large scale precipitation (water)
+kg m**-2
+kg m**-2
+......................
+063
+PRLCV
+Convective precipitation (water)
+kg m**-2
+kg m**-2
+......................
+128
+EAZSOL
+Anal. error std dev for Z at soil level
+kg m**-1 s**-2
+kg m**-1 s**-2
+......................
+129
+EPZSOL
+Guess error std dev for Z at soil level
+kg m**-1 s**-2
+kg m**-1 s**-2
+......................
+130
+USTR
+U-component of time-integrated stress
+W m**-2
+W m**-2
+......................
+131
+VSTR
+V-component of time-integrated stress
+W m**-2
+W m**-2
+......................
+132
+TPWCLS
+Pseudo-adiabtemp in surface boundarylayer
+K
+K
+......................
+133
+FLP
+Flight-level using ICAO standard pressure
+Ft
+Ft
+......................
+134
+CAT
+Clear air turbulence
+kg m**-1 s**-3
+kg m**-1 s**-3
+......................
+135
+AIR_CS
+Caesium pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+136
+SOL_CS
+Caesium pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+137
+AIR_IO
+Iode pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+138
+SOL_IO
+Iode pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+139
+AIR_RAD
+Radiative pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+140
+SOL_RAD
+Radiative pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+141
+AIR_CHIM
+Chemical pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+142
+SOL_CHIM
+Chemical pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+143
+AIR_PASS
+Passive tracer concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+144
+AIR_VOLCAN
+Volcanic pollutant concentration in air
+pollutant_unit m**-3
+pollutant_unit m**-3
+......................
+145
+SOL_VOLCAN
+Volcanic pollutant soil deposit
+pollutant_unit m**-2
+pollutant_unit m**-2
+......................
+149
+TP
+Potential vorticity
+K m**2 kg**-1 s**-1
+K m**2 kg**-1 s**-1
+......................
+150
+EAU
+Total water-type precipitation
+kg m**-2
+kg m**-2
+......................
+151
+BILANHY
+Hydric balance
+kg m**-2
+kg m**-2
+......................
+152
+RESERV_GLAC
+Ice content
+kg m**-2
+kg m**-2
+......................
+153
+RESERV_LIQU
+Water content
+kg m**-2
+kg m**-2
+......................
+154
+GIVRAGE
+Freezing risk index
+g Kg**-1
+g Kg**-1
+......................
+155
+GIVRAGE_VV
+Freezing risk index as regards vert.veloc
+g Kg**-1
+g Kg**-1
+......................
+156
+PREC_CONVEC
+Convective precipitation (all types)
+kg m**-2
+kg m**-2
+......................
+157
+PREC_GDE_ECH
+Large-scale precipitation (all types)
+kg m**-2
+kg m**-2
+......................
+158
+FLLUNAIRE_D
+Downwards lunar radiation flux (surface)
+kg m**-1 s**-3
+kg m**-1 s**-3
+......................
+200
+MWD
+Mean wave direction
+degrees
+degrees
+......................
+201
+MWP
+Mean wave period
+s
+s
+......................
+202
+SHPS
+Significant height of primary swell
+m
+m
+......................
+203
+SHSS
+Significant height of secondary swell
+m
+m
+......................
+204
+PP1D
+Peak period of 1-dimensional wave spectra
+s
+s
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
diff --git a/gribtables/cen085/local_table_2_version_128.mf b/gribtables/cen085/local_table_2_version_128.mf
new file mode 100755
index 0000000..af8072d
--- /dev/null
+++ b/gribtables/cen085/local_table_2_version_128.mf
@@ -0,0 +1,225 @@
+Table 2 locale a Meteo France: Version Number 128 (+1,2,3... pour entrees < 128)
+Codes et unites en phase avec FM 92-X Ext.GRIB.
+......................
+008
+ALTITUDE
+Altitude (geometrique)
+m
+m
+......................
+062
+PRLGE
+Precipitations liquides de grande echelle
+kg m**-2
+kg m**-2
+......................
+063
+PRLCV
+Precipitations liquides convectives
+kg m**-2
+kg m**-2
+......................
+128
+EAZSOL
+Ecart-type d'erreur d'analyse du ZSOL
+kg m**-1 s**-2
+kg m**-1 s**-2
+......................
+129
+EPZSOL
+Ecart-type d'erreur de prevision du ZSOL
+kg m**-1 s**-2
+kg m**-1 s**-2
+......................
+130
+USTR
+Premiere composante tension sol integree
+W m**-2
+W m**-2
+......................
+131
+VSTR
+Seconde composante tension sol integree
+W m**-2
+W m**-2
+......................
+132
+TPWCLS
+Pseudo-adiabtemp in surface boundarylayer
+K
+K
+......................
+133
+FLP
+Pression en niveau de vol
+Ft
+Ft
+......................
+134
+CAT
+Turbulence en air clair
+kg m**-1 s**-3
+kg m**-1 s**-3
+......................
+135
+AIR_CS
+Concentration dans l'air polluant cesium
+unite_de_polluant m**-3
+unite_de_polluant m**-3
+......................
+136
+SOL_CS
+Depot au sol de polluant cesium
+unite_de_polluant m**-2
+unite_de_polluant m**-2
+......................
+137
+AIR_IO
+Concentration dans l'air de polluant iode
+unite_de_polluant m**-3
+unite_de_polluant m**-3
+......................
+138
+SOL_IO
+Depot au sol de polluant iode
+unite_de_polluant m**-2
+unite_de_polluant m**-2
+......................
+139
+AIR_RAD
+Concentration ds air polluant radioactif
+unite_de_polluant m**-3
+unite_de_polluant m**-3
+......................
+140
+SOL_RAD
+Depot au sol de polluant radioactif
+unite_de_polluant m**-2
+unite_de_polluant m**-2
+......................
+141
+AIR_CHIM
+Concentration dans air polluant chimique
+unite_de_polluant m**-3
+unite_de_polluant m**-3
+......................
+142
+SOL_CHIM
+Depot au sol de polluant chimique
+unite_de_polluant m**-2
+unite_de_polluant m**-2
+......................
+143
+AIR_PASS
+Concentration dans l'air traceur passif
+unite_de_polluant m**-3
+unite_de_polluant m**-3
+......................
+144
+AIR_VOLCAN
+Concentration dans l'air polluant volcan
+unite_de_polluant m**-3
+unite_de_polluant m**-3
+......................
+145
+SOL_VOLCAN
+Depot au sol de polluant type volcanique
+unite_de_polluant m**-2
+unite_de_polluant m**-2
+......................
+149
+TP
+Tourbillon potentiel
+K m**2 kg**-1 s**-1
+K m**2 kg**-1 s**-1
+......................
+150
+EAU
+Precipitations liquides totales
+kg m**-2
+kg m**-2
+......................
+151
+BILANHY
+Bilan hydrique
+kg m**-2
+kg m**-2
+......................
+152
+RESERV_GLAC
+Contenu (reservoir) en glace
+kg m**-2
+kg m**-2
+......................
+153
+RESERV_LIQU
+Contenu (reservoir) en eau
+kg m**-2
+kg m**-2
+......................
+154
+GIVRAGE
+Indice de risque de givrage
+g Kg**-1
+g Kg**-1
+......................
+155
+GIVRAGE_VV
+Ind. risque givrage selon vitesse vertic.
+g Kg**-1
+g Kg**-1
+......................
+156
+PREC_CONVEC
+Precipitations convectives totales
+kg m**-2
+kg m**-2
+......................
+157
+PREC_GDE_ECH
+Precipitations de grande echelle totales
+kg m**-2
+kg m**-2
+......................
+158
+FLLUNAIRE_D
+Flux de rayonnement lunaire descendant
+kg m**-1 s**-3
+kg m**-1 s**-3
+......................
+200
+MWD
+Direction moyenne des vagues
+degre
+degre
+......................
+201
+MWP
+Periode moyenne des vagues
+s
+s
+......................
+202
+SHPS
+Hauteur significative dela houle primaire
+m
+m
+......................
+203
+SHSS
+Hauteur significative de la houle 2ndaire
+m
+m
+......................
+204
+PP1D
+Periode corr.pic d'energie spectre vagues
+s
+s
+......................
+255
+-
+Indique une valeur manquante
+-
+-
+......................
diff --git a/gribtables/local_table_2_version_128 b/gribtables/local_table_2_version_128
new file mode 100755
index 0000000..141a25d
--- /dev/null
+++ b/gribtables/local_table_2_version_128
@@ -0,0 +1,1266 @@
+ECMWF local table 2: Version Number 128 (Standard).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+001
+STRF
+Stream function
+m**2 s**-1
+-
+......................
+002
+VPOT
+Velocity potential
+m**2 s**-1
+-
+......................
+003
+PT
+Potential temperature
+K
+-
+......................
+004
+EQPT
+Equivalent potential temperature
+K
+-
+......................
+005
+SEPT
+Saturated equivalent potential temperature
+K
+-
+......................
+006
+SSFR
+Soil sand fraction
+(0 - 1)
+-
+......................
+007
+SCFR
+Soil clay fraction
+(0 - 1)
+-
+......................
+008
+SRO
+Surface runoff
+m
+Accumulated field
+......................
+009
+SSRO
+Sub-surface runoff
+m
+Accumulated field
+......................
+010
+WIND
+Wind speed
+m s**-1
+-
+......................
+011
+UDVW
+U component of divergent wind
+m s**-1
+-
+......................
+012
+VDVW
+V component of divergent wind
+m s**-1
+-
+......................
+013
+URTW
+U component of rotational wind
+m s**-1
+-
+......................
+014
+VRTW
+V component of rotational wind
+m s**-1
+-
+......................
+015
+ALUVP
+UV visible albedo for direct radiation
+(0 - 1)
+-
+......................
+016
+ALUVD
+UV visible albedo for diffuse radiation
+(0 - 1)
+-
+......................
+017
+ALNIP
+Near IR albedo for direct radiation
+(0 - 1)
+-
+......................
+018
+ALNID
+Near IR albedo for diffuse radiation
+(0 - 1)
+-
+......................
+019
+UVCS
+Clear sky surface UV
+W m**-2 s
+-
+......................
+020
+PARCS
+Clear sky surface photosynthetically active radiation
+W m**-2 s
+-
+......................
+021
+UCTP
+Unbalanced component of temperature
+K
+-
+......................
+022
+UCLN
+Unbalanced component of logarithm of surface pressure
+-
+-
+......................
+023
+UCDV
+Unbalanced component of divergence
+s**-1
+-
+......................
+026
+CL
+Lake cover
+(0 - 1)
+-
+......................
+027
+CVL
+Low vegetation cover
+(0 - 1)
+-
+......................
+028
+CVH
+High vegetation cover
+(0 - 1)
+-
+......................
+029
+TVL
+Type of low vegetation
+-
+Table index
+......................
+030
+TVH
+Type of high vegetation
+-
+Table index
+......................
+031
+CI
+Sea-ice cover
+(0 - 1)
+-
+......................
+032
+ASN
+Snow albedo
+(0 - 1)
+-
+......................
+033
+RSN
+Snow density
+kg m**-3
+-
+......................
+034
+SSTK
+Sea surface temperature
+K
+-
+......................
+035
+ISTL1
+Ice surface temperature layer 1
+K
+-
+......................
+036
+ISTL2
+Ice surface temperature layer 2
+K
+-
+......................
+037
+ISTL3
+Ice surface temperature layer 3
+K
+-
+......................
+038
+ISTL4
+Ice surface temperature layer 4
+K
+-
+......................
+039
+SWVL1
+Volumetric soil water layer 1
+m**3 m**-3
+-
+......................
+040
+SWVL2
+Volumetric soil water layer 2
+m**3 m**-3
+-
+......................
+041
+SWVL3
+Volumetric soil water layer 3
+m**3 m**-3
+-
+......................
+042
+SWVL4
+Volumetric soil water layer 4
+m**3 m**-3
+-
+......................
+043
+SLT
+Soil type
+-
+-
+......................
+044
+ES
+Snow evaporation
+m of water
+Accumulated field
+......................
+045
+SMLT
+Snowmelt
+m of water
+Accumulated field
+......................
+046
+SDUR
+Solar duration
+s
+-
+......................
+047
+DSRP
+Direct solar radiation
+w m**-2
+Incident on a plane perpendicular to the Sun's direction
+......................
+048
+MAGSS
+Magnitude of surface stress
+N m**-2 s
+Accumulated field
+......................
+049
+10FG
+10 metre wind gust
+m s**-1
+-
+......................
+050
+LSPF
+Large-scale precipitation fraction
+s
+Accumulated field
+......................
+051
+MX2T24
+Maximum temperature at 2 metres since last 24 hours
+K
+-
+......................
+052
+MN2T24
+Minimum temperature at 2 metres since last 24 hours
+K
+-
+......................
+053
+MONT
+Montgomery potential
+m**2 s**-2
+-
+......................
+054
+PRES
+Pressure
+Pa
+-
+......................
+055
+MEAN2T24
+Mean temperature at 2 metres since last 24 hours
+K
+6-hourly intervals
+......................
+056
+MN2D24
+Mean 2 metre dewpoint temperature in past 24 hours
+K
+6-hourly intervals
+......................
+057
+UVB
+Downward UV radiation at the surface
+w m**-2 s
+Ultra-violet band B. Accumulated field.
+......................
+058
+PAR
+Photosynthetically active radiation at the surface
+w m**-2 s
+Accumulated field.
+......................
+059
+CAPE
+Convective available potential energy
+J kg**-1
+-
+......................
+060
+PV
+Potential vorticity
+K m**2 kg**-1 s**-1
+-
+......................
+061
+TPO
+Total precipitation from observations
+Millimetres*100 + number of stations
+-
+......................
+062
+OBCT
+Observation count
+-
+Count of observations used in calculating value at a gridpoint
+......................
+063
+-
+Start time for skin temperature difference
+s
+Seconds from reference time
+......................
+064
+-
+Finish time for skin temperature difference
+s
+Seconds from reference time
+......................
+065
+-
+Skin temperature difference
+K
+-
+......................
+066
+-
+Leaf area index, low vegetation
+m**2 / m**2
+-
+......................
+067
+-
+Leaf area index, high vegetation
+m**2 / m**2
+-
+......................
+068
+-
+Minimum stomatal resistance, low vegetation
+s m**-1
+-
+......................
+069
+-
+Minimum stomatal resistance, high vegetation
+s m**-1
+-
+......................
+070
+-
+Biome cover, low vegetation
+(0 - 1)
+-
+......................
+071
+-
+Biome cover, high vegetation
+(0 - 1)
+-
+......................
+072
+ISSRD
+Instantaneous surface solar radiation downwards
+w m**-2
+-
+......................
+073
+ISTRD
+Instantaneous surface thermal radiation downwards
+w m**-2
+-
+......................
+074
+SDFOR
+Standard deviation of filtered subgrid orography
+m
+Climatological field
+......................
+077
+ETADOT
+Vertical velocity in the hybrid eta vertical coordinate system
+s**-1
+-
+......................
+078
+TCLW
+Total column liquid water
+kg m**-2
+-
+......................
+079
+TCIW
+Total column ice water
+kg m**-2
+-
+......................
+121
+MX2T6
+Maximum temperature at 2 metres since last 6 hours
+K
+-
+......................
+122
+MN2T6
+Minimum temperature at 2 metres since last 6 hours
+K
+-
+......................
+123
+10FG6
+10 metre wind gust in the past 6 hours
+m s**-1
+During previous 6 hours
+......................
+124
+EMIS
+Surface emissivity
+dimensionless
+-
+......................
+125
+-
+Vertically integrated total energy
+J m**-2
+Integrated over a number of model levels
+......................
+126
+-
+Generic parameter for sensitive area prediction
+Various
+Originating centre dependent
+......................
+127
+AT
+Atmospheric tide
+-
+Not GRIB data (pseudo-GRIB)
+......................
+128
+BV
+Budget values
+-
+Not GRIB data (pseudo-GRIB)
+......................
+129
+Z
+Geopotential
+m**2 s**-2
+At the surface: orography
+......................
+130
+T
+Temperature
+K
+-
+......................
+131
+U
+U velocity
+m s**-1
+-
+......................
+132
+V
+V velocity
+m s**-1
+-
+......................
+133
+Q
+Specific humidity
+kg kg**-1
+-
+......................
+134
+SP
+Surface pressure
+Pa
+-
+......................
+135
+W
+Vertical velocity
+Pa s**-1
+-
+......................
+136
+TCW
+Total column water
+kg m**-2
+Liquid + ice + vapour
+......................
+137
+TCWV
+Total column water vapour
+kg m**-2
+-
+......................
+138
+VO
+Vorticity (relative)
+s**-1
+-
+......................
+139
+STL1
+Soil temperature level 1
+K
+Soil temperature (ST) before 19930804
+......................
+140
+SWL1
+Soil wetness level 1
+m of water
+Surface soil wetness (SSW) before 19930804
+......................
+141
+SD
+Snow depth
+m of water equivalent
+-
+......................
+142
+LSP
+Stratiform precipitation (Large-scale precipitation)
+m
+Accumulated field
+......................
+143
+CP
+Convective precipitation
+m
+Accumulated field
+......................
+144
+SF
+Snowfall
+m of water equivalent
+Accumulated field. Contains convective + stratiform
+......................
+145
+BLD
+Boundary layer dissipation
+W m**-2 s
+Accumulated field
+......................
+146
+SSHF
+Surface sensible heat flux
+W m**-2 s
+Accumulated field
+......................
+147
+SLHF
+Surface latent heat flux
+W m**-2 s
+Accumulated field
+......................
+148
+CHNK
+Charnock
+-
+Surface stress (SS) before 19980519
+......................
+149
+SNR
+Surface net radiation
+W m**-2 s
+Accumulated field
+......................
+150
+TNR
+Top net radiation
+-
+-
+......................
+151
+MSL
+Mean sea level pressure
+Pa
+-
+......................
+152
+LNSP
+Logarithm of surface pressure
+-
+-
+......................
+153
+SWHR
+Short-wave heating rate
+K
+Accumulated field
+......................
+154
+LWHR
+Long-wave heating rate
+K
+Accumulated field
+......................
+155
+D
+Divergence
+s**-1
+-
+......................
+156
+GH
+Gepotential Height
+gpm
+Geopotential height
+......................
+157
+R
+Relative humidity
+%
+-
+......................
+158
+TSP
+Tendency of surface pressure
+Pa s**-1
+-
+......................
+159
+BLH
+Boundary layer height
+m
+-
+......................
+160
+SDOR
+Standard deviation of orography
+-
+-
+......................
+161
+ISOR
+Anisotropy of sub-gridscale orography
+-
+-
+......................
+162
+ANOR
+Angle of sub-gridscale orography
+rad
+-
+......................
+163
+SLOR
+Slope of sub-gridscale orography
+-
+-
+......................
+164
+TCC
+Total cloud cover
+(0 - 1)
+-
+......................
+165
+10U
+10 metre U wind component
+m s**-1
+-
+......................
+166
+10V
+10 metre V wind component
+m s**-1
+-
+......................
+167
+2T
+2 metre temperature
+K
+-
+......................
+168
+2D
+2 metre dewpoint temperature
+K
+-
+......................
+169
+SSRD
+Surface solar radiation downwards
+W m**-2 s
+Accumulated field
+......................
+170
+STL2
+Soil temperature level 2
+K
+Deep soil temperature (DST) before 19930804
+......................
+171
+SWL2
+Soil wetness level 2
+m of water
+Deep soil wetness (DSW) before 19930804. Scaled: depth surf water layer 7cm deep
+......................
+172
+LSM
+Land-sea mask
+(0 - 1)
+-
+......................
+173
+SR
+Surface roughness
+m
+-
+......................
+174
+AL
+Albedo
+(0 - 1)
+-
+......................
+175
+STRD
+Surface thermal radiation downwards
+W m**-2 s
+Accumulated field
+......................
+176
+SSR
+Surface solar radiation
+W m**-2 s
+Accumulated field
+......................
+177
+STR
+Surface thermal radiation
+W m**-2 s
+Accumulated field
+......................
+178
+TSR
+Top solar radiation
+W m**-2 s
+Accumulated field
+......................
+179
+TTR
+Top thermal radiation
+W m**-2 s
+Accumulated field
+......................
+180
+EWSS
+East-West surface stress
+N m**-2 s
+Accumulated field
+......................
+181
+NSSS
+North-South surface stress
+N m**-2 s
+Accumulated field
+......................
+182
+E
+Evaporation
+m of water
+Accumulated field
+......................
+183
+STL3
+Soil temperature level 3
+K
+Climatological deep soil temperature (CDST) before 19930804
+......................
+184
+SWL3
+Soil wetness level 3
+m of water
+Climatological deep soil wetness (CDSW) before 19930804.Scaled depth surf water 7cm deep
+......................
+185
+CCC
+Convective cloud cover
+(0 - 1)
+-
+......................
+186
+LCC
+Low cloud cover
+(0 - 1)
+-
+......................
+187
+MCC
+Medium cloud cover
+(0 - 1)
+-
+......................
+188
+HCC
+High cloud cover
+(0 - 1)
+-
+......................
+189
+SUND
+Sunshine duration
+s
+Accumulated field
+......................
+190
+EWOV
+East-West component of sub-gridscale orographic variance
+m**2
+-
+......................
+191
+NSOV
+North-South component of sub-gridscale orographic variance
+m**2
+-
+......................
+192
+NWOV
+North-West/South-East component of sub-gridscale orographic variance
+m**2
+-
+......................
+193
+NEOV
+North-East/South-West component of sub-gridscale orographic variance
+m**2
+-
+......................
+194
+BTMP
+Brightness temperature
+K
+-
+......................
+195
+LGWS
+Latitudinal component of gravity wave stress
+N m**-2 s
+Accumulated field
+......................
+196
+MGWS
+Meridional component of gravity wave stress
+N m**-2 s
+Accumulated field
+......................
+197
+GWD
+Gravity wave dissipation
+W m**-2 s
+Accumulated field
+......................
+198
+SRC
+Skin reservoir content
+m of water
+-
+......................
+199
+VEG
+Vegetation fraction
+(0 - 1)
+-
+......................
+200
+VSO
+Variance of sub-gridscale orography
+m**2
+-
+......................
+201
+MX2T
+Maximum temperature at 2 metres since previous post-processing
+K
+-
+......................
+202
+MN2T
+Minimum temperature at 2 metres since previous post-processing
+K
+-
+......................
+203
+O3
+Ozone mass mixing ratio
+kg kg**-1
+-
+......................
+204
+PAW
+Precipitation analysis weights
+-
+-
+......................
+205
+RO
+Runoff
+m
+Accumulated field
+......................
+206
+TCO3
+Total column ozone
+kg m**-2
+Before 20010612 was in Dobsons. 1 Dobson = 2.1415E-5 kg m**-2
+......................
+207
+10SI
+10 metre wind speed
+m s**-1
+-
+......................
+208
+TSRC
+Top net solar radiation, clear sky
+W m**-2 s
+Accumulated field
+......................
+209
+TTRC
+Top net thermal radiation, clear sky
+W m**-2 s
+Accumulated field
+......................
+210
+SSRC
+Surface net solar radiation, clear sky
+W m**-2 s
+Accumulated field
+......................
+211
+STRC
+Surface net thermal radiation, clear sky
+W m**-2 s
+Accumulated field
+......................
+212
+TISR
+TOA incident solar radiation
+W m**-2 s
+Accumulated field
+......................
+213
+VIMD
+Vertically integrated moisture divergence
+kg m**-2
+-
+......................
+214
+DHR
+Diabatic heating by radiation
+K
+-
+......................
+215
+DHVD
+Diabatic heating by vertical diffusion
+K
+-
+......................
+216
+DHCC
+Diabatic heating by cumulus convection
+K
+-
+......................
+217
+DHLC
+Diabatic heating large-scale condensation
+K
+-
+......................
+218
+VDZW
+Vertical diffusion of zonal wind
+m s**-1
+-
+......................
+219
+VDMW
+Vertical diffusion of meridional wind
+m s**-1
+-
+......................
+220
+EWGD
+East-West gravity wave drag tendency
+m s**-1
+-
+......................
+221
+NSGD
+North-South gravity wave drag tendency
+m s**-1
+-
+......................
+222
+CTZW
+Convective tendency of zonal wind
+m s**-1
+-
+......................
+223
+CTMW
+Convective tendency of meridional wind
+m s**-1
+-
+......................
+224
+VDH
+Vertical diffusion of humidity
+kg kg**-1
+-
+......................
+225
+HTCC
+Humidity tendency by cumulus convection
+kg kg**-1
+-
+......................
+226
+HTLC
+Humidity tendency by large-scale condensation
+kg kg**-1
+-
+......................
+227
+CRNH
+Change from removal of negative humidity
+kg kg**-1
+-
+......................
+228
+TP
+Total precipitation
+m
+Accumulated
+......................
+229
+IEWS
+Instantaneous X surface stress
+N m**-2
+-
+......................
+230
+INSS
+Instantaneous Y surface stress
+N m**-2
+-
+......................
+231
+ISHF
+Instantaneous surface heat flux
+W m**-2
+-
+......................
+232
+IE
+Instantaneous moisture flux
+kg m**-2 s
+Evaporation
+......................
+233
+ASQ
+Apparent surface humidity
+kg kg**-1
+-
+......................
+234
+LSRH
+Logarithm of surface roughness length for heat
+-
+-
+......................
+235
+SKT
+Skin temperature
+K
+-
+......................
+236
+STL4
+Soil temperature level 4
+K
+-
+......................
+237
+SWL4
+Soil wetness level 4
+m
+Scaled to depth of surface water layer 7cm deep
+......................
+238
+TSN
+Temperature of snow layer
+K
+-
+......................
+239
+CSF
+Convective snowfall
+m of water equivalent
+Accumulated field
+......................
+240
+LSF
+Large-scale snowfall
+m of water equivalent
+Accumulated field
+......................
+241
+ACF
+Accumulated cloud fraction tendency
+(-1 to 1)
+-
+......................
+242
+ALW
+Accumulated liquid water tendency
+(-1 to 1)
+-
+......................
+243
+FAL
+Forecast albedo
+(0 - 1)
+-
+......................
+244
+FSR
+Forecast surface roughness
+m
+-
+......................
+245
+FLSR
+Forecast logarithm of surface roughness for heat
+-
+-
+......................
+246
+CLWC
+Cloud liquid water content
+kg kg**-1
+-
+......................
+247
+CIWC
+Cloud ice water content
+kg kg**-1
+-
+......................
+248
+CC
+Cloud cover
+(0 - 1)
+-
+......................
+249
+AIW
+Accumulated ice water tendency
+(-1 to 1)
+-
+......................
+250
+ICE
+Ice age
+(0 - 1)
+0 first-year, 1 multi-year
+......................
+251
+ATTE
+Adiabatic tendency of temperature
+K
+-
+......................
+252
+ATHE
+Adiabatic tendency of humidity
+kg kg**-1
+-
+......................
+253
+ATZE
+Adiabatic tendency of zonal wind
+m s**-1
+-
+......................
+254
+ATMW
+Adiabatic tendency of meridional wind
+m s**-1
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_129 b/gribtables/local_table_2_version_129
new file mode 100755
index 0000000..636baaf
--- /dev/null
+++ b/gribtables/local_table_2_version_129
@@ -0,0 +1,1164 @@
+ECMWF local table 2: Version Number 129 (Gradients).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+001
+STRF
+Stream function
+m**2 s**-1
+-
+......................
+002
+VPOT
+Velocity potential
+m**2 s**-1
+-
+......................
+003
+PT
+Potential temperature
+K
+-
+......................
+004
+EQPT
+Equivalent potential temperature
+K
+-
+......................
+005
+SEPT
+Saturated equivalent potential temperature
+K
+-
+......................
+011
+UDVW
+U component of divergent wind
+m s**-1
+-
+......................
+012
+VDVW
+V component of divergent wind
+m s**-1
+-
+......................
+013
+URTW
+U component of rotational wind
+m s**-1
+-
+......................
+014
+VRTW
+V component of rotational wind
+m s**-1
+-
+......................
+021
+UCTP
+Unbalanced component of temperature
+K
+-
+......................
+022
+UCLN
+Unbalanced component of logarithm of surface pressure
+-
+-
+......................
+023
+UCDV
+Unbalanced component of divergence
+s**-1
+-
+......................
+026
+CL
+Lake cover
+(0 - 1)
+-
+......................
+027
+CVL
+Low vegetation cover
+(0 - 1)
+-
+......................
+028
+CVH
+High vegetation cover
+(0 - 1)
+-
+......................
+029
+TVL
+Type of low vegetation
+-
+Table index
+......................
+030
+TVH
+Type of high vegetation
+-
+Table index
+......................
+031
+CI
+Sea-ice cover
+(0 - 1)
+-
+......................
+032
+ASN
+Snow albedo
+(0 - 1)
+-
+......................
+033
+RSN
+Snow density
+kg m**-3
+-
+......................
+034
+SSTK
+Sea surface temperature
+K
+-
+......................
+035
+ISTL1
+Ice surface temperature layer 1
+K
+-
+......................
+036
+ISTL2
+Ice surface temperature layer 2
+K
+-
+......................
+037
+ISTL3
+Ice surface temperature layer 3
+K
+-
+......................
+038
+ISTL4
+Ice surface temperature layer 4
+K
+-
+......................
+039
+SWVL1
+Volumetric soil water layer 1
+m**3 m**-3
+-
+......................
+040
+SWVL2
+Volumetric soil water layer 2
+m**3 m**-3
+-
+......................
+041
+SWVL3
+Volumetric soil water layer 3
+m**3 m**-3
+-
+......................
+042
+SWVL4
+Volumetric soil water layer 4
+m**3 m**-3
+-
+......................
+043
+SLT
+Soil type
+-
+-
+......................
+044
+ES
+Snow evaporation
+m of water
+Accumulated field
+......................
+045
+SMLT
+Snowmelt
+m of water
+Accumulated field
+......................
+046
+SDUR
+Solar duration
+s
+-
+......................
+047
+DSRP
+Direct solar radiation
+w m**-2
+Incident on a plane perpendicular to the Sun's direction
+......................
+048
+MAGSS
+Magnitude of surface stress
+N m**-2 s
+Accumulated field
+......................
+049
+10FG
+10 metre wind gust
+m s**-1
+-
+......................
+050
+LSPF
+Large-scale precipitation fraction
+s
+Accumulated field
+......................
+051
+MX2T24
+Maximum 2 metre temperature
+K
+During previous 24 hours
+......................
+052
+MN2T24
+Minimum 2 metre temperature
+K
+During previous 24 hours
+......................
+053
+MONT
+Montgomery potential
+m**2 s**-2
+-
+......................
+054
+PRES
+Pressure
+Pa
+-
+......................
+055
+MEAN2T24
+Mean 2 metre temperature in past 24 hours
+K
+6-hourly intervals
+......................
+056
+MN2D24
+Mean 2 metre dewpoint temperature in past 24 hours
+K
+6-hourly intervals
+......................
+057
+UVB
+Downward UV radiation at the surface
+w m**-2 s
+Ultra-violet band B. Accumulated field.
+......................
+058
+PAR
+Photosynthetically active radiation at the surface
+w m**-2 s
+Accumulated field.
+......................
+059
+CAPE
+Convective available potential energy
+J kg**-1
+-
+......................
+060
+PV
+Potential vorticity
+K m**2 kg**-1 s**-1
+-
+......................
+061
+TPO
+Total precipitation from observations
+Millimetres*100 + number of stations
+-
+......................
+062
+OBCT
+Observation count
+-
+Count of observations used in calculating value at a gridpoint
+......................
+063
+-
+Start time for skin temperature difference
+s
+Seconds from reference time
+......................
+064
+-
+Finish time for skin temperature difference
+s
+Seconds from reference time
+......................
+065
+-
+Skin temperature difference
+K
+-
+......................
+066
+-
+Leaf area index, low vegetation
+m**2 / m**2
+-
+......................
+067
+-
+Leaf area index, high vegetation
+m**2 / m**2
+-
+......................
+068
+-
+Minimum stomatal resistance, low vegetation
+s m**-1
+-
+......................
+069
+-
+Minimum stomatal resistance, high vegetation
+s m**-1
+-
+......................
+070
+-
+Biome cover, low vegetation
+(0 - 1)
+-
+......................
+071
+-
+Biome cover, high vegetation
+(0 - 1)
+-
+......................
+078
+-
+Total column liquid water
+kg m**-2
+-
+......................
+079
+-
+Total column ice water
+kg m**-2
+-
+......................
+121
+MX2T6
+Maximum temperature at 2 metres
+K
+During previous 6 hours
+......................
+122
+MN2T6
+Minimum temperature at 2 metres
+K
+During previous 6 hours
+......................
+123
+10FG6
+10 metre wind gust in the past 6 hours
+m s**-1
+During previous 6 hours
+......................
+125
+-
+Vertically integrated total energy
+J m**-2
+Integrated over a number of model levels
+......................
+126
+-
+Generic parameter for sensitive area prediction
+Various
+Originating centre dependent
+......................
+127
+AT
+Atmospheric tide
+-
+Not GRIB data (pseudo-GRIB)
+......................
+128
+BV
+Budget values
+-
+Not GRIB data (pseudo-GRIB)
+......................
+129
+Z
+Geopotential
+m**2 s**-2
+At the surface: orography
+......................
+130
+T
+Temperature
+K
+-
+......................
+131
+U
+U velocity
+m s**-1
+-
+......................
+132
+V
+V velocity
+m s**-1
+-
+......................
+133
+Q
+Specific humidity
+kg kg**-1
+-
+......................
+134
+SP
+Surface pressure
+Pa
+-
+......................
+135
+W
+Vertical velocity
+Pa s**-1
+-
+......................
+136
+TCW
+Total column water
+kg m**-2
+Liquid + ice + vapour
+......................
+137
+TCWV
+Total column water vapour
+kg m**-2
+-
+......................
+138
+VO
+Vorticity (relative)
+s**-1
+-
+......................
+139
+STL1
+Soil temperature level 1
+K
+Soil temperature (ST) before 19930804
+......................
+140
+SWL1
+Soil wetness level 1
+m of water
+Surface soil wetness (SSW) before 19930804
+......................
+141
+SD
+Snow depth
+m of water equivalent
+-
+......................
+142
+LSP
+Stratiform precipitation (Large-scale precipitation)
+m
+Accumulated field
+......................
+143
+CP
+Convective precipitation
+m
+Accumulated field
+......................
+144
+SF
+Snowfall (convective + stratiform)
+m of water equivalent
+Accumulated field
+......................
+145
+BLD
+Boundary layer dissipation
+W m**-2 s
+Accumulated field
+......................
+146
+SSHF
+Surface sensible heat flux
+W m**-2 s
+Accumulated field
+......................
+147
+SLHF
+Surface latent heat flux
+W m**-2 s
+Accumulated field
+......................
+148
+CHNK
+Charnock
+-
+Surface stress (SS) before 19980519
+......................
+149
+SNR
+Surface net radiation
+W m**-2 s
+Accumulated field
+......................
+150
+TNR
+Top net radiation
+-
+-
+......................
+151
+MSL
+Mean sea level pressure
+Pa
+-
+......................
+152
+LNSP
+Logarithm of surface pressure
+-
+-
+......................
+153
+SWHR
+Short-wave heating rate
+K
+Accumulated field
+......................
+154
+LWHR
+Long-wave heating rate
+K
+Accumulated field
+......................
+155
+D
+Divergence
+s**-1
+-
+......................
+156
+GH
+Height
+m
+Geopotential height
+......................
+157
+R
+Relative humidity
+%
+-
+......................
+158
+TSP
+Tendency of surface pressure
+Pa s**-1
+-
+......................
+159
+BLH
+Boundary layer height
+m
+-
+......................
+160
+SDOR
+Standard deviation of orography
+-
+-
+......................
+161
+ISOR
+Anisotropy of sub-gridscale orography
+-
+-
+......................
+162
+ANOR
+Angle of sub-gridscale orography
+rad
+-
+......................
+163
+SLOR
+Slope of sub-gridscale orography
+-
+-
+......................
+164
+TCC
+Total cloud cover
+(0 - 1)
+-
+......................
+165
+10U
+10 metre U wind component
+m s**-1
+-
+......................
+166
+10V
+10 metre V wind component
+m s**-1
+-
+......................
+167
+2T
+2 metre temperature
+K
+-
+......................
+168
+2D
+2 metre dewpoint temperature
+K
+-
+......................
+169
+SSRD
+Surface solar radiation downwards
+W m**-2 s
+Accumulated field
+......................
+170
+STL2
+Soil temperature level 2
+K
+Deep soil temperature (DST) before 19930804
+......................
+171
+SWL2
+Soil wetness level 2
+m of water
+Deep soil wetness (DSW) before 19930804. Scaled: depth surf water layer 7cm deep
+......................
+172
+LSM
+Land-sea mask
+(0 - 1)
+-
+......................
+173
+SR
+Surface roughness
+m
+-
+......................
+174
+AL
+Albedo
+(0 - 1)
+-
+......................
+175
+STRD
+Surface thermal radiation downwards
+W m**-2 s
+Accumulated field
+......................
+176
+SSR
+Surface solar radiation
+W m**-2 s
+Accumulated field
+......................
+177
+STR
+Surface thermal radiation
+W m**-2 s
+Accumulated field
+......................
+178
+TSR
+Top solar radiation
+W m**-2 s
+Accumulated field
+......................
+179
+TTR
+Top thermal radiation
+W m**-2 s
+Accumulated field
+......................
+180
+EWSS
+East-West surface stress
+N m**-2 s
+Accumulated field
+......................
+181
+NSSS
+North-South surface stress
+N m**-2 s
+Accumulated field
+......................
+182
+E
+Evaporation
+m of water
+Accumulated field
+......................
+183
+STL3
+Soil temperature level 3
+K
+Climatological deep soil temperature (CDST) before 19930804
+......................
+184
+SWL3
+Soil wetness level 3
+m of water
+Climatological deep soil wetness (CDSW) before 19930804.Scaled depth surf water 7cm deep
+......................
+185
+CCC
+Convective cloud cover
+(0 - 1)
+-
+......................
+186
+LCC
+Low cloud cover
+(0 - 1)
+-
+......................
+187
+MCC
+Medium cloud cover
+(0 - 1)
+-
+......................
+188
+HCC
+High cloud cover
+(0 - 1)
+-
+......................
+189
+SUND
+Sunshine duration
+s
+Accumulated field
+......................
+190
+EWOV
+East-West component of sub-gridscale orographic variance
+m**2
+-
+......................
+191
+NSOV
+North-South component of sub-gridscale orographic variance
+m**2
+-
+......................
+192
+NWOV
+North-West/South-East component of sub-gridscale orographic variance
+m**2
+-
+......................
+193
+NEOV
+North-East/South-West component of sub-gridscale orographic variance
+m**2
+-
+......................
+194
+BTMP
+Brightness temperature
+K
+-
+......................
+195
+LGWS
+Latitudinal component of gravity wave stress
+N m**-2 s
+Accumulated field
+......................
+196
+MGWS
+Meridional component of gravity wave stress
+N m**-2 s
+Accumulated field
+......................
+197
+GWD
+Gravity wave dissipation
+W m**-2 s
+Accumulated field
+......................
+198
+SRC
+Skin reservoir content
+m of water
+-
+......................
+199
+VEG
+Vegetation fraction
+(0 - 1)
+-
+......................
+200
+VSO
+Variance of sub-gridscale orography
+m**2
+-
+......................
+201
+MX2T
+Maximum temperature at 2 metres since previous post-processing
+K
+-
+......................
+202
+MN2T
+Minimum temperature at 2 metres since previous post-processing
+K
+-
+......................
+203
+O3
+Ozone mass mixing ratio
+kg kg**-1
+-
+......................
+204
+PAW
+Precipitation analysis weights
+-
+-
+......................
+205
+RO
+Runoff
+m
+Accumulated field
+......................
+206
+TCO3
+Total column ozone
+kg m**-2
+Before 20010612 was in Dobsons. 1 Dobson = 2.1415E-5 kg m**-2
+......................
+207
+10SI
+10 metre wind speed
+m s**-1
+-
+......................
+208
+TSRC
+Top net solar radiation, clear sky
+W m**-2 s
+Accumulated field
+......................
+209
+TTRC
+Top net thermal radiation, clear sky
+W m**-2 s
+Accumulated field
+......................
+210
+SSRC
+Surface net solar radiation, clear sky
+W m**-2 s
+Accumulated field
+......................
+211
+STRC
+Surface net thermal radiation, clear sky
+W m**-2 s
+Accumulated field
+......................
+212
+TISR
+TOA incident solar radiation
+W m**-2 s
+Accumulated field
+......................
+214
+DHR
+Diabatic heating by radiation
+K
+-
+......................
+215
+DHVD
+Diabatic heating by vertical diffusion
+K
+-
+......................
+216
+DHCC
+Diabatic heating by cumulus convection
+K
+-
+......................
+217
+DHLC
+Diabatic heating large-scale condensation
+K
+-
+......................
+218
+VDZW
+Vertical diffusion of zonal wind
+m s**-1
+-
+......................
+219
+VDMW
+Vertical diffusion of meridional wind
+m s**-1
+-
+......................
+220
+EWGD
+East-West gravity wave drag tendency
+m s**-1
+-
+......................
+221
+NSGD
+North-South gravity wave drag tendency
+m s**-1
+-
+......................
+222
+CTZW
+Convective tendency of zonal wind
+m s**-1
+-
+......................
+223
+CTMW
+Convective tendency of meridional wind
+m s**-1
+-
+......................
+224
+VDH
+Vertical diffusion of humidity
+kg kg**-1
+-
+......................
+225
+HTCC
+Humidity tendency by cumulus convection
+kg kg**-1
+-
+......................
+226
+HTLC
+Humidity tendency by large-scale condensation
+kg kg**-1
+-
+......................
+227
+CRNH
+Change from removal of negative humidity
+kg kg**-1
+-
+......................
+228
+TP
+Total precipitation
+m
+Accumulated
+......................
+229
+IEWS
+Instantaneous X surface stress
+N m**-2
+-
+......................
+230
+INSS
+Instantaneous Y surface stress
+N m**-2
+-
+......................
+231
+ISHF
+Instantaneous surface heat flux
+W m**-2
+-
+......................
+232
+IE
+Instantaneous moisture flux
+kg m**-2 s
+Evaporation
+......................
+233
+ASQ
+Apparent surface humidity
+kg kg**-1
+-
+......................
+234
+LSRH
+Logarithm of surface roughness length for heat
+-
+-
+......................
+235
+SKT
+Skin temperature
+K
+-
+......................
+236
+STL4
+Soil temperature level 4
+K
+-
+......................
+237
+SWL4
+Soil wetness level 4
+m
+Scaled to depth of surface water layer 7cm deep
+......................
+238
+TSN
+Temperature of snow layer
+K
+-
+......................
+239
+CSF
+Convective snowfall
+m of water equivalent
+Accumulated field
+......................
+240
+LSF
+Large-scale snowfall
+m of water equivalent
+Accumulated field
+......................
+241
+ACF
+Accumulated cloud fraction tendency
+(-1 to 1)
+-
+......................
+242
+ALW
+Accumulated liquid water tendency
+(-1 to 1)
+-
+......................
+243
+FAL
+Forecast albedo
+(0 - 1)
+-
+......................
+244
+FSR
+Forecast surface roughness
+m
+-
+......................
+245
+FLSR
+Forecast logarithm of surface roughness for heat
+-
+-
+......................
+246
+CLWC
+Cloud liquid water content
+kg kg**-1
+-
+......................
+247
+CIWC
+Cloud ice water content
+kg kg**-1
+-
+......................
+248
+CC
+Cloud cover
+(0 - 1)
+-
+......................
+249
+AIW
+Accumulated ice water tendency
+(-1 to 1)
+-
+......................
+250
+ICE
+Ice age
+(0 - 1)
+0 first-year, 1 multi-year
+......................
+251
+ATTE
+Adiabatic tendency of temperature
+K
+-
+......................
+252
+ATHE
+Adiabatic tendency of humidity
+kg kg**-1
+-
+......................
+253
+ATZE
+Adiabatic tendency of zonal wind
+m s**-1
+-
+......................
+254
+ATMW
+Adiabatic tendency of meridional wind
+m s**-1
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_130 b/gribtables/local_table_2_version_130
new file mode 100755
index 0000000..cf225d3
--- /dev/null
+++ b/gribtables/local_table_2_version_130
@@ -0,0 +1,162 @@
+ECMWF local table 2: Version Number 130 (ASTEX).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+208
+TSRU
+Top solar radiation upward
+W m**-2
+-
+......................
+209
+TTRU
+Top thermal radiation upward
+W m**-2
+-
+......................
+210
+TSUC
+Top solar radiation upward, clear sky
+W m**-2
+-
+......................
+211
+TTUC
+Top thermal radiation upward, clear sky
+W m**-2
+-
+......................
+212
+CLW
+Cloud liquid water
+kg kg**-1
+-
+......................
+213
+CF
+Cloud fraction
+(0 - 1)
+-
+......................
+214
+DHR
+Diabatic heating by radiation
+K s**-1
+-
+......................
+215
+DHVD
+Diabatic heating by vertical diffusion
+K s**-1
+-
+......................
+216
+DHCC
+Diabatic heating by cumulus convection
+K s**-1
+-
+......................
+217
+DHLC
+Diabatic heating by large-scale condensation
+K s**-1
+-
+......................
+218
+VDZW
+Vertical diffusion of zonal wind
+m**2 s**-3
+-
+......................
+219
+VDMW
+Vertical diffusion of meridional wind
+m**2 s**-3
+-
+......................
+220
+EWGD
+East-West gravity wave drag
+m**2 s**-3
+-
+......................
+221
+NSGD
+North-South gravity wave drag
+m**2 s**-3
+-
+......................
+222
+CTZW
+Convective tendency of zonal wind
+m**2 s**-3
+-
+......................
+223
+CTMW
+Convective tendency of meridional wind
+m**2 s**-3
+-
+......................
+224
+VDH
+Vertical diffusion of humidity
+kg kg**-1 s**-1
+-
+......................
+225
+HTCC
+Humidity tendency by cumulus convection
+kg kg**-1 s**-1
+-
+......................
+226
+HTLC
+Humidity tendency by large-scale condensation
+kg kg**-1 s**-1
+-
+......................
+227
+CRNH
+Change from removal of negative humidity
+kg kg**-1 s**-1
+-
+......................
+228
+ATT
+Adiabatic tendency of temperature
+K s**-1
+-
+......................
+229
+ATH
+Adiabatic tendency of humidity
+kg kg**-1 s**-1
+-
+......................
+230
+ATZW
+Adiabatic tendency of zonal wind
+m**2 s**-3
+-
+......................
+231
+ATMWAX
+Adiabatic tendency of meridional wind
+m**2 s**-3
+-
+......................
+232
+MVV
+Mean vertical velocity
+Pa s**-1
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_131 b/gribtables/local_table_2_version_131
new file mode 100755
index 0000000..da9b7a0
--- /dev/null
+++ b/gribtables/local_table_2_version_131
@@ -0,0 +1,384 @@
+ECMWF local table 2: Version Number 131 (Probability forecasts).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+001
+2TAG2
+2m temperature anomaly of at least +2K
+%
+Original units: K
+......................
+002
+2TAG1
+2m temperature anomaly of at least +1K
+%
+Original units: K
+......................
+003
+2TAG0
+2m temperature anomaly of at least 0K
+%
+Original units: K
+......................
+004
+2TALM1
+2m temperature anomaly of at most -1K
+%
+Original units: K
+......................
+005
+2TALM2
+2m temperature anomaly of at most -2K
+%
+Original units: K
+......................
+006
+TPAG20
+Total precipitation anomaly of at least 20 mm
+%
+Original units: m
+......................
+007
+TPAG10
+Total precipitation anomaly of at least 10 mm
+%
+Original units: m
+......................
+008
+TPAG0
+Total precipitation anomaly of at least 0 mm
+%
+Original units: m
+......................
+009
+STAG0
+Surface temperature anomaly of at least 0K
+%
+Original units: K
+......................
+010
+MSLAG0
+Mean sea level pressure anomaly of at least 0 Pa
+%
+Original units: Pa
+......................
+015
+H0DIP
+Heigth of 0 degree isotherm probability
+percentage
+Original units: m
+......................
+016
+HSLP
+Heigth of snowfall limit probability
+percentage
+Original units: m
+......................
+017
+SAIP
+Showalter index probability
+percentage
+Original units: K
+......................
+018
+WHIP
+Whiting index probability
+percentage
+Original units: K
+......................
+020
+TALM2
+Temperature anomaly less than -2 K
+%
+-
+......................
+021
+TAG2
+Temperature anomaly of at least +2 K
+%
+-
+......................
+022
+TALM8
+Temperature anomaly less than -8 K
+%
+-
+......................
+023
+TALM4
+Temperature anomaly less than -4 K
+%
+-
+......................
+024
+TAG4
+Temperature anomaly greater than +4 K
+%
+-
+......................
+025
+TAG8
+Temperature anomaly greater than +8 K
+%
+-
+......................
+049
+10GP
+10 metre wind gust probability
+percentage
+Original units: m s**-1
+......................
+059
+CAPEP
+Convective available potential energy probability
+percentage
+Original units: J kg**-1
+......................
+060
+TPG1
+Total precipitation of at least 1 mm
+%
+-
+......................
+061
+TPG5
+Total precipitation of at least 5 mm
+%
+-
+......................
+062
+TPG10
+Total precipitation of at least 10 mm
+%
+-
+......................
+063
+TPG20
+Total precipitation of at least 20 mm
+%
+-
+......................
+064
+TPL01
+Total precipitation less than 0.1 mm
+%
+no rain event
+......................
+065
+TPRL1
+Total precipitation rate less than 1 mm/day
+%
+-
+......................
+066
+TPRG3
+Total precipitation rate of at least 3 mm/day
+%
+-
+......................
+067
+TPRG5
+Total precipitation rate of at least 5 mm/day
+%
+-
+......................
+068
+10SPG10
+10 metre Wind speed of at least 10 m/s
+%
+-
+......................
+069
+10SPG15
+10 metre Wind speed of at least 15 m/s
+%
+-
+......................
+070
+10FGG15
+10 metre Wind gust of at least 15 m/s
+%
+-
+......................
+071
+10FGG20
+10 metre Wind gust of at least 20 m/s
+%
+-
+......................
+072
+10FGG25
+10 metre Wind gust of at least 25 m/s
+%
+-
+......................
+073
+2TL273
+2 metre temperature less than 273.15 K
+%
+-
+......................
+074
+SWHG2
+Significant wave height of at least 2 m
+%
+-
+......................
+075
+SWHG4
+Significant wave height of at least 4 m
+%
+-
+......................
+076
+SWHG6
+Significant wave height of at least 6 m
+%
+-
+......................
+077
+SWHG8
+Significant wave height of at least 8 m
+%
+-
+......................
+078
+MWPG8
+Mean wave period of at least 8 s
+%
+-
+......................
+079
+MWPG10
+Mean wave period of at least 10 s
+%
+-
+......................
+080
+MWPG12
+Mean wave period of at least 12 s
+%
+-
+......................
+081
+MWPG15
+Mean wave period of at least 15 s
+%
+-
+......................
+082
+TPG40
+Total precipitation of at least 40 mm
+%
+-
+......................
+083
+TPG60
+Total precipitation of at least 60 mm
+%
+-
+......................
+084
+TPG80
+Total precipitation of at least 80 mm
+%
+-
+......................
+085
+TPG100
+Total precipitation of at least 100 mm
+%
+-
+......................
+086
+TPG150
+Total precipitation of at least 150 mm
+%
+-
+......................
+087
+TPG200
+Total precipitation of at least 200 mm
+%
+-
+......................
+088
+TPG300
+Total precipitation of at least 300 mm
+%
+-
+......................
+129
+ZP
+Geopotential probability
+%
+-
+......................
+130
+TAP
+Temperature anomaly probability
+percentage
+Original units: K
+......................
+144
+SFP
+Snowfall (convective + stratiform) probability
+percentage
+Original units: m of water equivalent
+......................
+164
+TCCP
+Total cloud cover probability
+percentage
+Original units: (0 - 1)
+......................
+165
+10SP
+10 metre speed probability
+percentage
+Original units: m s**-1
+......................
+167
+2TP
+2 metre temperature probability
+percentage
+Original units: K
+......................
+201
+MX2TP
+Maximum 2 metre temperature probability
+percentage
+Original units: K
+......................
+202
+MN2TP
+Minimum 2 metre temperature probability
+percentage
+Original units: K
+......................
+228
+TPP
+Total precipitation probability
+percentage
+Original units: m
+......................
+229
+SWHP
+Significant wave height probability
+percentage
+Original units: m
+......................
+232
+MWPP
+Mean wave period probability
+percentage
+Original units: s
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_132 b/gribtables/local_table_2_version_132
new file mode 100755
index 0000000..651aa27
--- /dev/null
+++ b/gribtables/local_table_2_version_132
@@ -0,0 +1,60 @@
+ECMWF local table 2: Version Number 132 (Extreme forecast index).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+049
+10FGI
+10 metre wind gust index
+(-1 to 1)
+Original units: m s**-1
+......................
+144
+SFI
+Snowfall index
+(-1 to 1)
+-
+......................
+165
+10WSI
+10 metre speed index
+(-1 to 1)
+Original units: m s**-1
+......................
+167
+2TI
+2 metre temperature index
+(-1 to 1)
+Original units: K
+......................
+200
+MAXSWHI
+Maximum of significant wave height index
+(-1 to 1)
+-
+......................
+201
+MX2TI
+Maximum temperature at 2 metres index
+(-1 to 1)
+-
+......................
+202
+MN2TI
+Minimum temperature at 2 metres index
+(-1 to 1)
+-
+......................
+228
+TPI
+Total precipitation index
+(-1 to 1)
+Original units: m
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_133 b/gribtables/local_table_2_version_133
new file mode 100755
index 0000000..00d2537
--- /dev/null
+++ b/gribtables/local_table_2_version_133
@@ -0,0 +1,558 @@
+ECMWF local table 2: Version Number 133 (SREPS).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+001
+2TPLM10
+2m temperature probability less than -10 C
+%
+-
+......................
+002
+2TPLM5
+2m temperature probability less than -5 C
+%
+-
+......................
+003
+2TPL0
+2m temperature probability less than 0 C
+%
+-
+......................
+004
+2TPL5
+2m temperature probability less than 5 C
+%
+-
+......................
+005
+2TPL10
+2m temperature probability less than 10 C
+%
+-
+......................
+006
+2TPG25
+2m temperature probability greater than 25 C
+%
+-
+......................
+007
+2TPG30
+2m temperature probability greater than 30 C
+%
+-
+......................
+008
+2TPG35
+2m temperature probability greater than 35 C
+%
+-
+......................
+009
+2TPG40
+2m temperature probability greater than 40 C
+%
+-
+......................
+010
+2TPG45
+2m temperature probability greater than 45 C
+%
+-
+......................
+011
+MN2TPLM10
+Minimum 2 metre temperature probability less than -10 C
+%
+-
+......................
+012
+MN2TPLM5
+Minimum 2 metre temperature probability less than -5 C
+%
+-
+......................
+013
+MN2TPL0
+Minimum 2 metre temperature probability less than 0 C
+%
+-
+......................
+014
+MN2TPL5
+Minimum 2 metre temperature probability less than 5 C
+%
+-
+......................
+015
+MN2TPL10
+Minimum 2 metre temperature probability less than 10 C
+%
+-
+......................
+016
+MX2TPG25
+Maximum 2 metre temperature probability greater than 25 C
+%
+-
+......................
+017
+MX2TPG30
+Maximum 2 metre temperature probability greater than 30 C
+%
+-
+......................
+018
+MX2TPG35
+Maximum 2 metre temperature probability greater than 35 C
+%
+-
+......................
+019
+MX2TPG40
+Maximum 2 metre temperature probability greater than 40 C
+%
+-
+......................
+020
+MX2TPG45
+Maximum 2 metre temperature probability greater than 45 C
+%
+-
+......................
+021
+10SPG10
+10 metre wind speed probability of at least 10 m/s
+%
+-
+......................
+022
+10SPG15
+10 metre wind speed probability of at least 15 m/s
+%
+-
+......................
+023
+10SPG20
+10 metre wind speed probability of at least 20 m/s
+%
+-
+......................
+024
+10SPG35
+10 metre wind speed probability of at least 35 m/s
+%
+-
+......................
+025
+10SPG50
+10 metre wind speed probability of at least 50 m/s
+%
+-
+......................
+026
+10GPG20
+10 metre wind gust probability of at least 20 m/s
+%
+-
+......................
+027
+10GPG35
+10 metre wind gust probability of at least 35 m/s
+%
+-
+......................
+028
+10GPG50
+10 metre wind gust probability of at least 50 m/s
+%
+-
+......................
+029
+10GPG75
+10 metre wind gust probability of at least 75 m/s
+%
+-
+......................
+030
+10GPG100
+10 metre wind gust probability of at least 100 m/s
+%
+-
+......................
+031
+TPPG1
+Total precipitation probability of at least 1 mm
+%
+-
+......................
+032
+TPPG5
+Total precipitation probability of at least 5 mm
+%
+-
+......................
+033
+TPPG10
+Total precipitation probability of at least 10 mm
+%
+-
+......................
+034
+TPPG20
+Total precipitation probability of at least 20 mm
+%
+-
+......................
+035
+TPPG40
+Total precipitation probability of at least 40 mm
+%
+-
+......................
+036
+TPPG60
+Total precipitation probability of at least 60 mm
+%
+-
+......................
+037
+TPPG80
+Total precipitation probability of at least 80 mm
+%
+-
+......................
+038
+TPPG100
+Total precipitation probability of at least 100 mm
+%
+-
+......................
+039
+TPPG150
+Total precipitation probability of at least 150 mm
+%
+-
+......................
+040
+TPPG200
+Total precipitation probability of at least 200 mm
+%
+-
+......................
+041
+TPPG300
+Total precipitation probability of at least 300 mm
+%
+-
+......................
+042
+SFPG1
+Snowfall probability of at least 1 mm
+%
+-
+......................
+043
+SFPG5
+Snowfall probability of at least 5 mm
+%
+-
+......................
+044
+SFPG10
+Snowfall probability of at least 10 mm
+%
+-
+......................
+045
+SFPG20
+Snowfall probability of at least 20 mm
+%
+-
+......................
+046
+SFPG40
+Snowfall probability of at least 40 mm
+%
+-
+......................
+047
+SFPG60
+Snowfall probability of at least 60 mm
+%
+-
+......................
+048
+SFPG80
+Snowfall probability of at least 80 mm
+%
+-
+......................
+049
+SFPG100
+Snowfall probability of at least 100 mm
+%
+-
+......................
+050
+SFPG150
+Snowfall probability of at least 150 mm
+%
+-
+......................
+051
+SFPG200
+Snowfall probability of at least 200 mm
+%
+-
+......................
+052
+SFPG300
+Snowfall probability of at least 300 mm
+%
+-
+......................
+053
+TCCPG10
+Total Cloud Cover probability greater than 10%
+%
+-
+......................
+054
+TCCPG20
+Total Cloud Cover probability greater than 20%
+%
+-
+......................
+055
+TCCPG30
+Total Cloud Cover probability greater than 30%
+%
+-
+......................
+056
+TCCPG40
+Total Cloud Cover probability greater than 40%
+%
+-
+......................
+057
+TCCPG50
+Total Cloud Cover probability greater than 50%
+%
+-
+......................
+058
+TCCPG60
+Total Cloud Cover probability greater than 60%
+%
+-
+......................
+059
+TCCPG70
+Total Cloud Cover probability greater than 70%
+%
+-
+......................
+060
+TCCPG80
+Total Cloud Cover probability greater than 80%
+%
+-
+......................
+061
+TCCPG90
+Total Cloud Cover probability greater than 90%
+%
+-
+......................
+062
+TCCPG99
+Total Cloud Cover probability greater than 99%
+%
+-
+......................
+063
+HCCPG10
+High Cloud Cover probability greater than 10%
+%
+-
+......................
+064
+HCCPG20
+High Cloud Cover probability greater than 20%
+%
+-
+......................
+065
+HCCPG30
+High Cloud Cover probability greater than 30%
+%
+-
+......................
+066
+HCCPG40
+High Cloud Cover probability greater than 40%
+%
+-
+......................
+067
+HCCPG50
+High Cloud Cover probability greater than 50%
+%
+-
+......................
+068
+HCCPG60
+High Cloud Cover probability greater than 60%
+%
+-
+......................
+069
+HCCPG70
+High Cloud Cover probability greater than 70%
+%
+-
+......................
+070
+HCCPG80
+High Cloud Cover probability greater than 80%
+%
+-
+......................
+071
+HCCPG90
+High Cloud Cover probability greater than 90%
+%
+-
+......................
+072
+HCCPG99
+High Cloud Cover probability greater than 99%
+%
+-
+......................
+073
+MCCPG10
+Medium Cloud Cover probability greater than 10%
+%
+-
+......................
+074
+MCCPG20
+Medium Cloud Cover probability greater than 20%
+%
+-
+......................
+075
+MCCPG30
+Medium Cloud Cover probability greater than 30%
+%
+-
+......................
+076
+MCCPG40
+Medium Cloud Cover probability greater than 40%
+%
+-
+......................
+077
+MCCPG50
+Medium Cloud Cover probability greater than 50%
+%
+-
+......................
+078
+MCCPG60
+Medium Cloud Cover probability greater than 60%
+%
+-
+......................
+079
+MCCPG70
+Medium Cloud Cover probability greater than 70%
+%
+-
+......................
+080
+MCCPG80
+Medium Cloud Cover probability greater than 80%
+%
+-
+......................
+081
+MCCPG90
+Medium Cloud Cover probability greater than 90%
+%
+-
+......................
+082
+MCCPG99
+Medium Cloud Cover probability greater than 99%
+%
+-
+......................
+083
+LCCPG10
+Low Cloud Cover probability greater than 10%
+%
+-
+......................
+084
+LCCPG20
+Low Cloud Cover probability greater than 20%
+%
+-
+......................
+085
+LCCPG30
+Low Cloud Cover probability greater than 30%
+%
+-
+......................
+086
+LCCPG40
+Low Cloud Cover probability greater than 40%
+%
+-
+......................
+087
+LCCPG50
+Low Cloud Cover probability greater than 50%
+%
+-
+......................
+088
+LCCPG60
+Low Cloud Cover probability greater than 60%
+%
+-
+......................
+089
+LCCPG70
+Low Cloud Cover probability greater than 70%
+%
+-
+......................
+090
+LCCPG80
+Low Cloud Cover probability greater than 80%
+%
+-
+......................
+091
+LCCPG90
+Low Cloud Cover probability greater than 90%
+%
+-
+......................
+092
+LCCPG99
+Low Cloud Cover probability greater than 99%
+%
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_140 b/gribtables/local_table_2_version_140
new file mode 100755
index 0000000..4c48d67
--- /dev/null
+++ b/gribtables/local_table_2_version_140
@@ -0,0 +1,246 @@
+ECMWF local table 2: Version Number 140 (Wave).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+200
+MAXSWH
+Maximum of significant wave height
+m
+-
+......................
+217
+TMAX
+Period corresponding to maximum individual wave height
+s
+-
+......................
+218
+HMAX
+Maximum individual wave height
+m
+-
+......................
+219
+WMB
+Model bathymetry
+m
+Ocean depth limited to 999 metres
+......................
+220
+MP1
+Mean wave period based on first moment
+s
+-
+......................
+221
+MP2
+Mean wave period based on second moment
+s
+-
+......................
+222
+WDW
+Wave spectral directional width
+-
+-
+......................
+223
+P1WW
+Mean wave period based on first moment for wind waves
+s
+-
+......................
+224
+P2WW
+Mean wave period based on second moment for wind waves
+s
+-
+......................
+225
+DWWW
+Wave spectral directional width for wind waves
+-
+-
+......................
+226
+P1PS
+Mean wave period based on first moment for swell
+s
+-
+......................
+227
+P2PS
+Mean wave period based on second moment for swell
+s
+-
+......................
+228
+DWPS
+Wave spectral directional width for swell
+-
+-
+......................
+229
+SWH
+Significant wave height
+m
+-
+......................
+230
+MWD
+Mean wave direction
+degrees
+-
+......................
+231
+PP1D
+Peak period of 1D spectra
+s
+-
+......................
+232
+MWP
+Mean wave period
+s
+-
+......................
+233
+CDWW
+Coefficient of drag with waves
+-
+-
+......................
+234
+SHWW
+Significant height of wind waves
+m
+-
+......................
+235
+MDWW
+Mean direction of wind waves
+degrees
+-
+......................
+236
+MPWW
+Mean period of wind waves
+s
+-
+......................
+237
+SHTS
+Significant height of total swell
+m
+-
+......................
+238
+MDTS
+Mean direction of total swell
+degrees
+-
+......................
+239
+MPTS
+Mean period of total swell
+s
+-
+......................
+240
+SDHS
+Standard deviation wave height
+m
+-
+......................
+241
+MU10
+Mean of 10 metre wind speed
+m s**-1
+-
+......................
+242
+MDWI
+Mean wind direction
+degrees
+-
+......................
+243
+SDU
+Standard deviation of 10 metre wind speed
+m s**-1
+-
+......................
+244
+MSQS
+Mean square slope of waves
+dimensionless
+-
+......................
+245
+WIND
+10 metre wind speed
+m s**-1
+Modified by wave model analysis
+......................
+246
+AWH
+Altimeter wave height
+m
+-
+......................
+247
+ACWH
+Altimeter corrected wave height
+m
+-
+......................
+248
+ARRC
+Altimeter range relative correction
+-
+-
+......................
+249
+DWI
+10 metre wind direction
+degrees
+-
+......................
+250
+2DSP
+2D wave spectra (multiple)
+m**2 s radian**-1
+Logarithm 10 based, modified by constant
+......................
+251
+2DFD
+2D wave spectra (single)
+m**2 s radian**-1
+One direction/one frequency; log 10 based, modified by constant
+......................
+252
+WSK
+Wave spectral kurtosis
+-
+-
+......................
+253
+BFI
+Benjamin-Feir index
+-
+-
+......................
+254
+WSP
+Wave spectral peakedness
+s**-1
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_150 b/gribtables/local_table_2_version_150
new file mode 100755
index 0000000..bfdd4f2
--- /dev/null
+++ b/gribtables/local_table_2_version_150
@@ -0,0 +1,198 @@
+ECMWF local table 2: Version Number 150 (Ocean - preliminary version).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+129
+-
+Ocean potential temperature
+deg C
+-
+......................
+130
+-
+Ocean salinity
+psu
+-
+......................
+131
+-
+Ocean potential density
+kg m**-3 -1000
+Reference = surface
+......................
+133
+-
+Ocean U velocity
+m s**-1
+-
+......................
+134
+-
+Ocean V velocity
+m s**-1
+-
+......................
+135
+-
+Ocean W velocity
+m s**-1
+-
+......................
+137
+-
+Richardson number
+-
+-
+......................
+139
+-
+U*V product
+m s**-2
+-
+......................
+140
+-
+U*T product
+m s**-1 deg C
+-
+......................
+141
+-
+V*T product
+m s**-1 deg C
+-
+......................
+142
+-
+U*U product
+m s**-2
+-
+......................
+143
+-
+V*V product
+m s**-2
+-
+......................
+144
+-
+UV - U~V~
+m s**-2
+u~ is time-mean of u
+......................
+145
+-
+UT - U~T~
+m s**-1 deg C
+-
+......................
+146
+-
+VT - V~T~
+m s**-1 deg C
+-
+......................
+147
+-
+UU - U~U~
+m s**-2
+-
+......................
+148
+-
+VV - V~V~
+m s**-2
+-
+......................
+152
+-
+Sea level
+m
+Departure from geoid, tides removed
+......................
+153
+-
+Barotropic stream function
+-
+-
+......................
+154
+-
+Mixed layer depth
+m
+Tcr=0.5 C for HOPE model
+......................
+155
+-
+Depth
+m
+Eg of isothermal surface
+......................
+168
+-
+U stress
+Pa
+-
+......................
+169
+-
+V stress
+Pa
+-
+......................
+170
+-
+Turbulent kinetic energy input
+-
+-
+......................
+171
+-
+Net surface heat flux
+-
++ve = down
+......................
+172
+-
+Surface solar radiation
+-
+-
+......................
+173
+-
+P-E
+-
+-
+......................
+180
+-
+Diagnosed sea surface temperature error
+deg C
+-
+......................
+181
+-
+Heat flux correction
+W m**-2
+-
+......................
+182
+-
+Observed sea surface temperature
+deg C
+-
+......................
+183
+-
+Observed heat flux
+W m**-2
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_151 b/gribtables/local_table_2_version_151
new file mode 100755
index 0000000..c6c1eb4
--- /dev/null
+++ b/gribtables/local_table_2_version_151
@@ -0,0 +1,480 @@
+ECMWF local table 2: Version Number 151 (Ocean - operational version).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+129
+OCPT
+Ocean potential temperature
+deg C
+-
+......................
+130
+S
+Salinity
+psu
+-
+......................
+131
+U
+U velocity
+m s**-1
+-
+......................
+132
+V
+V velocity
+m s**-1
+-
+......................
+133
+WV
+W velocity
+m s**-1
+-
+......................
+134
+MST
+Modulus of strain rate tensor
+s**-1
+-
+......................
+135
+VVS
+Vertical viscosity
+m**2 s**-1
+-
+......................
+136
+VDF
+Vertical diffusivity
+m**2 s**-1
+-
+......................
+137
+DEP
+Depth
+m
+-
+......................
+138
+STH
+Sigma-theta
+kg m**-3
+-
+......................
+139
+RN
+Richardson number
+-
+-
+......................
+140
+UV
+UV product
+m**2 s**-2
+-
+......................
+141
+UT
+UT product
+m s**-1 degC
+-
+......................
+142
+VT
+VT product
+m s**-1 deg C
+-
+......................
+143
+UU
+UU product
+m**2 s**-2
+-
+......................
+144
+VV
+VV product
+m**2 s**-2
+-
+......................
+145
+SL
+Sea level
+m
+Tides removed
+......................
+146
+SL_1
+Sea level previous timestep
+m
+-
+......................
+147
+BSF
+Barotropic stream function
+m**3 s**-1
+-
+......................
+148
+MLD
+Mixed layer depth
+m
+-
+......................
+149
+BTP
+Bottom Pressure (equivalent height)
+m
+-
+......................
+150
+SH
+Steric height
+m
+-
+......................
+151
+CRL
+Curl of Wind Stress
+N m**-3
+-
+......................
+152
+-
+Divergence of wind stress
+Nm**-3
+-
+......................
+153
+TAX
+U stress
+N m**-2
+-
+......................
+154
+TAY
+V stress
+N m**-2
+-
+......................
+155
+TKI
+Turbulent kinetic energy input
+W m**-2
+-
+......................
+156
+NSF
+Net surface heat flux
+W m**-2
+-
+......................
+157
+ASR
+Absorbed solar radiation
+W m**-2
+-
+......................
+158
+PME
+Precipitation - evaporation
+m s**-1
+-
+......................
+159
+SST
+Specified sea surface temperature
+deg C
+-
+......................
+160
+SHF
+Specified surface heat flux
+W m**-2
+-
+......................
+161
+DTE
+Diagnosed sea surface temperature error
+deg C
+-
+......................
+162
+HFC
+Heat flux correction
+W m**-2
+-
+......................
+163
+20D
+20 degrees isotherm depth
+m
+-
+......................
+164
+TAV300
+Average potential temperature in the upper 300m
+degrees C
+-
+......................
+165
+UBA1
+Vertically integrated zonal velocity (previous time step)
+m**2 s**-1
+-
+......................
+166
+VBA1
+Vertically Integrated meridional velocity (previous time step)
+m**2 s**-1
+-
+......................
+167
+ZTR
+Vertically integrated zonal volume transport
+m**2 s**-1
+-
+......................
+168
+MTR
+Vertically integrated meridional volume transport
+m**2 s**-1
+-
+......................
+169
+ZHT
+Vertically integrated zonal heat transport
+J m**-1 s**-1
+-
+......................
+170
+MHT
+Vertically integrated meridional heat transport
+J m**-1 s**-1
+-
+......................
+171
+UMAX
+U velocity maximum
+m s**-1
+-
+......................
+172
+DUMAX
+Depth of the velocity maximum
+m
+-
+......................
+173
+SMAX
+Salinity maximum
+psu
+-
+......................
+174
+DSMAX
+Depth of salinity maximum
+m
+-
+......................
+175
+SAV300
+Average salinity in the upper 300m
+psu
+-
+......................
+176
+LDP
+Layer depth at scalar points
+m
+-
+......................
+177
+LDU
+Layer depth at vector points
+m
+-
+......................
+178
+PTI
+Potential temperature increment
+deg C
+-
+......................
+179
+PTAE
+Potential temperature analysis error
+deg C
+-
+......................
+180
+BPT
+Background potential temperature
+deg C
+-
+......................
+181
+APT
+Analysed potential temperature
+deg C
+-
+......................
+182
+PTBE
+Potential temperature background error
+deg C
+-
+......................
+183
+AS
+Analysed salinity
+psu
+-
+......................
+184
+SALI
+Salinity increment
+psu
+-
+......................
+185
+EBT
+Estimated Bias in Temperature
+deg C
+-
+......................
+186
+EBS
+Estimated Bias in Salinity
+psu
+-
+......................
+187
+UVI
+Zonal Velocity increment (from balance operator)
+m/s per time step
+-
+......................
+188
+VVI
+Meridional Velocity increment (from balance operator)
+-
+-
+......................
+190
+SUBI
+Salinity increment (from salinity data)
+psu per time step
+-
+......................
+191
+SALE
+Salinity analysis error
+psu
+-
+......................
+192
+BSAL
+Background Salinity
+psu
+-
+......................
+194
+SALBE
+Salinity background error
+psu
+-
+......................
+199
+EBTA
+Estimated temperature bias from assimilation
+deg C
+-
+......................
+200
+EBSA
+Estimated salinity bias from assimilation
+psu
+-
+......................
+201
+LTI
+Temperature increment from relaxation term
+deg C per time step
+-
+......................
+202
+LSI
+Salinity increment from relaxation term
+-
+-
+......................
+203
+BZPGA
+Bias in the zonal pressure gradient (applied)
+Pa**m-1
+-
+......................
+204
+BMPGA
+Bias in the meridional pressure gradient (applied)
+Pa**m-1
+-
+......................
+205
+EBTL
+Estimated temperature bias from relaxation
+deg C
+-
+......................
+206
+EBSL
+Estimated salinity bias from relaxation
+psu
+-
+......................
+207
+FGBT
+First guess bias in temperature
+deg C
+-
+......................
+208
+FGBS
+First guess bias in salinity
+psu
+-
+......................
+209
+BPA
+Applied bias in pressure
+Pa
+-
+......................
+210
+FGBP
+FG bias in pressure
+Pa
+-
+......................
+211
+PTA
+Bias in temperature(applied)
+deg C
+-
+......................
+212
+PSA
+Bias in salinity (applied)
+psu
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_160 b/gribtables/local_table_2_version_160
new file mode 100755
index 0000000..ce76b7f
--- /dev/null
+++ b/gribtables/local_table_2_version_160
@@ -0,0 +1,654 @@
+ECMWF local table 2: Version Number 160 (ECMWF re-analysis statistics).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+127
+AT
+Atmospheric tide
+-
+Not GRIB data
+......................
+128
+BV
+Budget values
+-
+Not GRIB data
+......................
+129
+Z
+Geopotential
+m**2 s**-2
+Orography at surface
+......................
+130
+T
+Temperature
+K
+-
+......................
+131
+U
+U velocity
+m s**-1
+-
+......................
+132
+V
+V velocity
+m s**-1
+-
+......................
+133
+Q
+Specific humidity
+kg kg**-1
+-
+......................
+134
+SP
+Surface pressure
+Pa
+-
+......................
+135
+W
+Vertical velocity
+Pa s**-1
+-
+......................
+136
+TCW
+Total column water
+kg m**-2
+Liquid + ice + vapour
+......................
+137
+PWC
+Precipitable water content
+kg m**-2
+-
+......................
+138
+VO
+Vorticity (relative)
+s**-1
+-
+......................
+139
+STL1
+Soil temperature level 1
+K
+-
+......................
+140
+SWL1
+Soil wetness level 1
+m
+-
+......................
+141
+SD
+Snow depth
+m of water
+-
+......................
+142
+LSP
+Large-scale precipitation
+kg m**-2 s**-1
+-
+......................
+143
+CP
+Convective precipitation
+kg m**-2 s**-1
+-
+......................
+144
+SF
+Snowfall
+kg m**-2 s**-1
+-
+......................
+145
+BLD
+Boundary layer dissipation
+W m**-2
+-
+......................
+146
+SSHF
+Surface sensible heat flux
+W m**-2
+-
+......................
+147
+SLHF
+Surface latent heat flux
+W m**-2
+-
+......................
+151
+MSL
+Mean sea level pressure
+Pa
+-
+......................
+152
+LNSP
+Logarithm of surface pressure
+-
+-
+......................
+155
+D
+Divergence
+s**-1
+-
+......................
+156
+GH
+Height
+m
+Geopotential
+......................
+157
+R
+Relative humidity
+(0 - 1)
+-
+......................
+158
+TSP
+Tendency of surface pressure
+Pa s**-1
+-
+......................
+164
+TCC
+Total cloud cover
+(0 - 1)
+-
+......................
+165
+10U
+10 metre U wind component
+m s**-1
+-
+......................
+166
+10V
+10 metre V wind component
+m s**-1
+-
+......................
+167
+2T
+2 metre temperature
+K
+-
+......................
+168
+2D
+2 metre dewpoint temperature
+K
+-
+......................
+170
+STL2
+Soil temperature level 2
+K
+-
+......................
+171
+SWL2
+Soil wetness level 2
+m
+-
+......................
+172
+LSM
+Land-sea mask
+(0 - 1)
+-
+......................
+173
+SR
+Surface roughness
+m
+-
+......................
+174
+AL
+Albedo
+(0 - 1)
+-
+......................
+176
+SSR
+Surface solar radiation
+W m**-2
+-
+......................
+177
+STR
+Surface thermal radiation
+W m**-2
+-
+......................
+178
+TSR
+Top solar radiation
+W m**-2
+-
+......................
+179
+TTR
+Top thermal radiation
+W m**-2
+-
+......................
+180
+EWSS
+East-West surface stress
+N m**-2 s**-1
+-
+......................
+181
+NSSS
+North-South surface stress
+N m**-2 s**-1
+-
+......................
+182
+E
+Evaporation
+kg m**-2 s**-1
+-
+......................
+183
+STL3
+Soil temperature level 3
+K
+-
+......................
+184
+SWL3
+Soil wetness level 3
+m
+-
+......................
+185
+CCC
+Convective cloud cover
+(0 - 1)
+-
+......................
+186
+LCC
+Low cloud cover
+(0 - 1)
+-
+......................
+187
+MCC
+Medium cloud cover
+(0 - 1)
+-
+......................
+188
+HCC
+High cloud cover
+(0 - 1)
+-
+......................
+190
+EWOV
+East-West component of sub-gridscale orographic variance
+m**2
+-
+......................
+191
+NSOV
+North-South component of sub-gridscale orographic variance
+m**2
+-
+......................
+192
+NWOV
+North-West/South-East component of sub-gridscale orographic variance
+m**2
+-
+......................
+193
+NEOV
+North-East/South-West component of sub-gridscale orographic variance
+m**2
+-
+......................
+195
+LGWS
+Latitudinal component of gravity wave stress
+N m**-2 s
+-
+......................
+196
+MGWS
+Meridional component of gravity wave stress
+N m**-2 s
+-
+......................
+197
+GWD
+Gravity wave dissipation
+W m**-2 s
+-
+......................
+198
+SRC
+Skin reservoir content
+m of water
+-
+......................
+199
+VEG
+Percentage of vegetation
+%
+-
+......................
+200
+VSO
+Variance of sub-gridscale orography
+m**2
+-
+......................
+201
+MX2T
+Maximum temperature at 2 metres during averaging time
+K
+-
+......................
+202
+MN2T
+Minimium temperature at 2 metres during averaging time
+K
+-
+......................
+204
+PAW
+Precipitation analysis weights
+-
+-
+......................
+205
+RO
+Runoff
+kg m**-2 s**-1
+-
+......................
+206
+ZZ
+Standard deviation of geopotential
+m**2 s**-2
+-
+......................
+207
+TZ
+Covariance of temperature and geopotential
+K m**2 s**-2
+-
+......................
+208
+TT
+Standard deviation of temperature
+K
+-
+......................
+209
+QZ
+Covariance of specific humidity and geopotential
+m**2 s**-2
+-
+......................
+210
+QT
+Covariance of specific humidity and temperature
+K
+-
+......................
+211
+QQ
+Standard deviation of specific humidity
+(0 - 1)
+-
+......................
+212
+UZ
+Covariance of U component and geopotential
+m**3 s**-3
+-
+......................
+213
+UT
+Covariance of U component and temperature
+K m s**-1
+-
+......................
+214
+UQ
+Covariance of U component and specific humidity
+m s**-1
+-
+......................
+215
+UU
+Standard deviation of U velocity
+m s**-1
+-
+......................
+216
+VZ
+Covariance of V component and geopotential
+m**3 s**-3
+-
+......................
+217
+VT
+Covariance of V component and temperature
+K m s**-1
+-
+......................
+218
+VQ
+Covariance of V component and specific humidity
+m s**-1
+-
+......................
+219
+VU
+Covariance of V component and U component
+m**2 s**-2
+-
+......................
+220
+VV
+Standard deviation of V component
+m s**-1
+-
+......................
+221
+WZ
+Covariance of W component and geopotential
+Pa m**2 s**-3
+-
+......................
+222
+WT
+Covariance of W component and temperature
+K Pa s**-1
+-
+......................
+223
+WQ
+Covariance of W component and specific humidity
+Pa s**-1
+-
+......................
+224
+WU
+Covariance of W component and U component
+Pa m s**-2
+-
+......................
+225
+WV
+Covariance of W component and V component
+Pa m s**-2
+-
+......................
+226
+WW
+Standard deviation of vertical velocity
+Pa s**-1
+-
+......................
+228
+TP
+Total precipitation
+m
+-
+......................
+229
+IEWS
+Instantaneous X surface stress
+N m**-2
+-
+......................
+230
+INSS
+Instantaneous Y surface stress
+N m**-2
+-
+......................
+231
+ISHF
+Instantaneous surface heat flux
+W m**-2
+-
+......................
+232
+IE
+Instantaneous moisture flux
+kg m**-2 s**-1
+Evaporation
+......................
+233
+ASQ
+Apparent surface humidity
+kg kg**-1
+-
+......................
+234
+LSRH
+Logarithm of surface roughness length for heat
+-
+-
+......................
+235
+SKT
+Skin temperature
+K
+-
+......................
+236
+STL4
+Soil temperature level 4
+K
+-
+......................
+237
+SWL4
+Soil wetness level 4
+m
+-
+......................
+238
+TSN
+Temperature of snow layer
+K
+-
+......................
+239
+CSF
+Convective snowfall
+kg m**-2 s**-1
+-
+......................
+240
+LSF
+Large-scale snowfall
+kg m**-2 s**-1
+-
+......................
+241
+CLWCER
+Cloud liquid water content
+kg kg**-1
+-
+......................
+242
+CC
+Cloud cover
+(0 - 1)
+At given level
+......................
+243
+FAL
+Forecast albedo
+-
+-
+......................
+244
+FSR
+Forecast surface roughness
+m
+-
+......................
+245
+FLSR
+Forecast logarithm of surface roughness for heat
+-
+-
+......................
+246
+10WS
+10 metre wind speed
+m s**-1
+Irrespective of direction
+......................
+247
+MOFL
+Momentum flux
+N m**-2
+Irrespective of direction
+......................
+249
+-
+Gravity wave dissipation flux
+W m**-2
+Ignoring direction
+......................
+254
+HSD
+Heaviside beta function
+(0 - 1)
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_162 b/gribtables/local_table_2_version_162
new file mode 100755
index 0000000..b36b89b
--- /dev/null
+++ b/gribtables/local_table_2_version_162
@@ -0,0 +1,468 @@
+ECMWF local table 2: Version Number 162 (ECMWF re-analysis, ERA40).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+051
+-
+Surface geopotential
+m**2 s**-2
+-
+......................
+052
+-
+Surface pressure
+Pa
+-
+......................
+053
+-
+Vertical integral of mass of atmosphere
+kg m**-2
+-
+......................
+054
+-
+Vertical integral of temperature
+K kg m**-2
+-
+......................
+055
+-
+Vertical integral of total column water vapour
+kg m**-2
+-
+......................
+056
+-
+Vertical integral of total column liquid cloud water
+kg m**-2
+-
+......................
+057
+-
+Vertical integral of total column frozen cloud water
+kg m**-2
+-
+......................
+058
+-
+Vertical integral of total column ozone
+kg m**-2
+-
+......................
+059
+-
+Vertical integral of kinetic energy
+J m**-2
+-
+......................
+060
+-
+Vertical integral of thermal energy
+J m**-2
+-
+......................
+061
+-
+Vertical integral of dry static energy
+J m**-2
+-
+......................
+062
+-
+Vertical integral of moist static energy
+J m**-2
+-
+......................
+063
+-
+Vertical integral of total energy
+J m**-2
+-
+......................
+064
+-
+Vertical integral of energy conversion
+W m**-2
+-
+......................
+065
+-
+Vertical integral of eastward mass flux
+kg m**-1 s**-1
+-
+......................
+066
+-
+Vertical integral of northward mass flux
+kg m**-1 s**-1
+-
+......................
+067
+-
+Vertical integral of eastward kinetic energy flux
+W m**-2
+-
+......................
+068
+-
+Vertical integral of northward kinetic energy flux
+W m**-2
+-
+......................
+069
+-
+Vertical integral of eastward heat flux
+W m**-2
+-
+......................
+070
+-
+Vertical integral of northward heat flux
+W m**-2
+-
+......................
+071
+-
+Vertical integral of eastward water vapour flux
+kg m**-1 s**-1
+-
+......................
+072
+-
+Vertical integral of northward water vapour flux
+kg m**-1 s**-1
+-
+......................
+073
+-
+Vertical integral of eastward geopotential flux
+W m**-2
+-
+......................
+074
+-
+Vertical integral of northward geopotential flux
+W m**-2
+-
+......................
+075
+-
+Vertical integral of eastward total energy flux
+W m**-2
+-
+......................
+076
+-
+Vertical integral of northward total energy flux
+W m**-2
+-
+......................
+077
+-
+Vertical integral of eastward ozone flux
+kg m**-1 s**-1
+-
+......................
+078
+-
+Vertical integral of northward ozone flux
+kg m**-1 s**-1
+-
+......................
+081
+-
+Vertical integral of divergence of mass flux
+kg m**-2 s**-1
+-
+......................
+082
+-
+Vertical integral of divergence of kinetic energy flux
+W m**-2
+-
+......................
+083
+-
+Vertical integral of divergence of thermal energy flux
+W m**-2
+-
+......................
+084
+-
+Vertical integral of divergence of moisture flux
+kg m**-2 s**-1
+-
+......................
+085
+-
+Vertical integral of divergence of geopotential flux
+W m**-2
+-
+......................
+086
+-
+Vertical integral of divergence of total energy flux
+W m**-2
+-
+......................
+087
+-
+Vertical integral of divergence of ozone flux
+kg m**-2 s**-1
+-
+......................
+100
+-
+Tendency of short wave radiation
+K
+-
+......................
+101
+-
+Tendency of long wave radiation
+K
+-
+......................
+102
+-
+Tendency of clear sky short wave radiation
+K
+-
+......................
+103
+-
+Tendency of clear sky long wave radiation
+K
+-
+......................
+104
+-
+Updraught mass flux
+kg m**-2
+Model half levels
+......................
+105
+-
+Downdraught mass flux
+kg m**-2
+Model half levels
+......................
+106
+-
+Updraught detrainment rate
+kg m**-3
+Model half levels
+......................
+107
+-
+Downdraught detrainment rate
+kg m**-3
+Model half levels
+......................
+108
+-
+Total precipitation flux
+kg m**-2
+Model half levels
+......................
+109
+-
+Turbulent diffusion coefficient for heat
+m**2
+Model half levels
+......................
+110
+-
+Tendency of temperature due to physics
+K
+-
+......................
+111
+-
+Tendency of specific humidity due to physics
+kg kg**-1
+-
+......................
+112
+-
+Tendency of u component due to physics
+m s**-1
+-
+......................
+113
+-
+Tendency of v component due to physics
+m s**-1
+-
+......................
+206
+-
+Variance of geopotential
+m**4 s**-4
+-
+......................
+207
+-
+Covariance of geopotential/temperature
+m**2 K s**-2
+-
+......................
+208
+-
+Variance of temperature
+K**2
+-
+......................
+209
+-
+Covariance of geopotential/specific humidity
+m**2 s**-2
+-
+......................
+210
+-
+Covariance of temperature/specific humidity
+K
+-
+......................
+211
+-
+Variance of specific humidity
+-
+-
+......................
+212
+-
+Covariance of u component/geopotential
+M**3 s**-3
+-
+......................
+213
+-
+Covariance of u component/temperature
+m s**-1 K
+-
+......................
+214
+-
+Covariance of u component/specific humidity
+m s**-1
+-
+......................
+215
+-
+Variance of u component
+m**2 s**-2
+-
+......................
+216
+-
+Covariance of v component/geopotential
+M**3 s**-3
+-
+......................
+217
+-
+Covariance of v component/temperaure
+m s**-1 K
+-
+......................
+218
+-
+Covariance of v component/specific humidity
+m s**-1
+-
+......................
+219
+-
+Covariance of v component/u component
+m**2 s**-2
+-
+......................
+220
+-
+Variance of v component
+m**2 s**-2
+-
+......................
+221
+-
+Covariance of omega/geopotential
+m**2 Pa s**-3
+-
+......................
+222
+-
+Covariance of omega/temperature
+Pa s**-1 K
+-
+......................
+223
+-
+Covariance of omega/specific humidity
+Pa s**-1
+-
+......................
+224
+-
+Covariance of omega/u component
+m Pa s**-2
+-
+......................
+225
+-
+Covariance of omega/v component
+m Pa s**-2
+-
+......................
+226
+-
+Variance of omega
+Pa**2 s**-2
+-
+......................
+227
+-
+Variance of surface pressure
+Pa**2
+-
+......................
+229
+-
+Variance of relative humidity
+dimensionless
+-
+......................
+230
+-
+Covariance of u component/ozone
+m s**-1
+-
+......................
+231
+-
+Covariance of v component/ozone
+m s**-1
+-
+......................
+232
+-
+Covariance of omega/ozone
+Pa s**-1
+-
+......................
+233
+-
+Variance of ozone
+dimensionless
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_170 b/gribtables/local_table_2_version_170
new file mode 100755
index 0000000..727b680
--- /dev/null
+++ b/gribtables/local_table_2_version_170
@@ -0,0 +1,108 @@
+ECMWF local table 2: Version Number 170 (Seasonal Forecasting).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+129
+Z
+Geopotential
+m**2 s**-2
+-
+......................
+130
+T
+Temperature
+K
+-
+......................
+131
+U
+U velocity
+m s**-1
+-
+......................
+132
+V
+V velocity
+m s**-1
+-
+......................
+138
+VO
+Vorticity (relative)
+s**-1
+-
+......................
+140
+SWL1
+Soil wetness level 1
+m
+-
+......................
+141
+SD
+Snow depth
+m of water equivalent
+-
+......................
+149
+TSW
+Total soil moisture
+m
+-
+......................
+151
+MSL
+Mean sea level pressure
+Pa
+-
+......................
+155
+D
+Divergence
+s**-1
+-
+......................
+171
+SWL2
+Soil wetness level 2
+m
+-
+......................
+179
+TTR
+Top thermal radiation
+W m-2
+-
+......................
+184
+SWL3
+Soil wetness level 3
+m
+-
+......................
+201
+MX2T
+Maximum temperature at 2 metres
+K
+Since previous postprocessing
+......................
+202
+MN2T
+Minimum temperature at 2 metres
+K
+Since previous postprocessing
+......................
+228
+TP
+Total precipitation
+m
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_171 b/gribtables/local_table_2_version_171
new file mode 100755
index 0000000..b05b99c
--- /dev/null
+++ b/gribtables/local_table_2_version_171
@@ -0,0 +1,1110 @@
+ECMWF local table 2: Version Number 171 (Anomalies).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+001
+STRFA
+Stream function anomaly
+m**2 s**-1
+-
+......................
+002
+VPOTA
+Velocity potential anomaly
+m**2 s**-1
+-
+......................
+003
+-
+Potential temperature
+K
+-
+......................
+004
+-
+Equivalent potential temperature
+K
+-
+......................
+005
+-
+Saturated equivalent potential temperature
+K
+-
+......................
+011
+-
+U component of divergent wind
+m s**-1
+-
+......................
+012
+-
+V component of divergent wind
+m s**-1
+-
+......................
+013
+-
+U component of rotational wind
+m s**-1
+-
+......................
+014
+-
+V component of rotational wind
+m s**-1
+-
+......................
+021
+-
+Unbalanced component of temperature
+K
+-
+......................
+022
+-
+Unbalanced component of logarithm of surface pressure
+-
+-
+......................
+023
+-
+Unbalanced component of divergence
+s**-1
+-
+......................
+026
+-
+Lake cover
+(0 - 1)
+-
+......................
+027
+-
+Low vegetation cover
+(0 - 1)
+-
+......................
+028
+-
+High vegetation cover
+(0 - 1)
+-
+......................
+029
+-
+Type of low vegetation
+-
+Table index
+......................
+030
+-
+Type of high vegetation
+-
+Table index
+......................
+031
+-
+Sea-ice cover
+(0 - 1)
+-
+......................
+032
+-
+Snow albedo
+(0 - 1)
+-
+......................
+033
+-
+Snow density
+kg m**-3
+-
+......................
+034
+-
+Sea surface temperature
+K
+-
+......................
+035
+-
+Ice surface temperature layer 1
+K
+-
+......................
+036
+-
+Ice surface temperature layer 2
+K
+-
+......................
+037
+-
+Ice surface temperature layer 3
+K
+-
+......................
+038
+-
+Ice surface temperature layer 4
+K
+-
+......................
+039
+-
+Volumetric soil water layer 1
+m**3 m**-3
+-
+......................
+040
+-
+Volumetric soil water layer 2
+m**3 m**-3
+-
+......................
+041
+-
+Volumetric soil water layer 3
+m**3 m**-3
+-
+......................
+042
+-
+Volumetric soil water layer 4
+m**3 m**-3
+-
+......................
+043
+-
+Soil type
+-
+-
+......................
+044
+-
+Snow evaporation
+m of water
+Accumulated field
+......................
+045
+-
+Snowmelt
+m of water
+Accumulated field
+......................
+046
+-
+Solar duration
+s
+-
+......................
+047
+-
+Direct solar radiation
+w m**-2
+Incident on a plane perpendicular to the Sun's direction
+......................
+048
+-
+Magnitude of surface stress
+N m**-2 s
+Accumulated field
+......................
+049
+-
+10 metre wind gust
+m s**-1
+-
+......................
+050
+-
+Large-scale precipitation fraction
+s
+Accumulated field
+......................
+051
+-
+Maximum 2 metre temperature
+K
+During previous 24 hours
+......................
+052
+-
+Minimum 2 metre temperature
+K
+During previous 24 hours
+......................
+053
+-
+Montgomery potential
+m**2 s**-2
+-
+......................
+054
+-
+Pressure
+Pa
+-
+......................
+055
+-
+Mean 2 metre temperature in past 24 hours
+K
+6-hourly intervals
+......................
+056
+-
+Mean 2 metre dewpoint temperature in past 24 hours
+K
+6-hourly intervals
+......................
+057
+-
+Downward UV radiation at the surface
+w m**-2
+Ultra-violet band B
+......................
+058
+-
+Photosynthetically active radiation at the surface
+w m**-2
+-
+......................
+059
+-
+Convective available potential energy
+J kg**-1
+-
+......................
+060
+-
+Potential vorticity
+K m**2 kg**-1 s**-1
+-
+......................
+061
+-
+Total precipitation from observations
+Millimetres*100 + number of stations
+-
+......................
+062
+-
+Observation count
+-
+Count of observations used in calculating value at a gridpoint
+......................
+063
+-
+Start time for skin temperature difference
+s
+Seconds from reference time
+......................
+064
+-
+Finish time for skin temperature difference
+s
+Seconds from reference time
+......................
+065
+-
+Skin temperature difference
+K
+-
+......................
+078
+TCLWA
+Total column liquid water anomaly
+kg m**-2
+-
+......................
+079
+TCIWA
+Total column ice water anomaly
+kg m**-2
+-
+......................
+125
+-
+Vertically integrated total energy
+J m**-2
+Integrated over a number of model levels
+......................
+126
+-
+Generic parameter for sensitive area prediction
+Various
+Originating centre dependent
+......................
+127
+-
+Atmospheric tide
+-
+Not GRIB data
+......................
+128
+-
+Budget values
+-
+Not GRIB data
+......................
+129
+ZA
+Geopotential anomaly
+m**2 s**-2
+At the surface: orography
+......................
+130
+TA
+Temperature anomaly
+K
+-
+......................
+131
+UA
+U velocity anomaly
+m s**-1
+-
+......................
+132
+VA
+V velocity anomaly
+m s**-1
+-
+......................
+133
+-
+Specific humidity
+kg kg**-1
+-
+......................
+134
+-
+Surface pressure
+Pa
+-
+......................
+135
+-
+Vertical velocity
+Pa s**-1
+-
+......................
+136
+-
+Total column water
+kg m**-2
+Liquid + ice + vapour
+......................
+137
+-
+Total column water vapour
+kg m**-2
+-
+......................
+138
+-
+Vorticity (relative)
+s**-1
+-
+......................
+139
+-
+Soil temperature level 1
+K
+-
+......................
+140
+-
+Soil wetness level 1
+m of water
+-
+......................
+141
+-
+Snow depth
+m of water equivalent
+-
+......................
+142
+-
+Stratiform precipitation (Large-scale precipitation)
+m
+Accumulated field
+......................
+143
+-
+Convective precipitation
+m
+Accumulated field
+......................
+144
+-
+Snowfall (convective + stratiform)
+m of water equivalent
+Accumulated field
+......................
+145
+-
+Boundary layer dissipation
+W m**-2 s
+Accumulated field
+......................
+146
+-
+Surface sensible heat flux
+W m**-2 s
+Accumulated field
+......................
+147
+-
+Surface latent heat flux
+W m**-2 s
+Accumulated field
+......................
+148
+-
+Charnock
+-
+-
+......................
+149
+-
+Surface net radiation
+W m**-2 s
+Accumulated field
+......................
+150
+-
+Top net radiation
+-
+-
+......................
+151
+MSLA
+Mean sea level pressure anomaly
+Pa
+-
+......................
+152
+-
+Logarithm of surface pressure
+-
+-
+......................
+153
+-
+Short-wave heating rate
+K
+Accumulated field
+......................
+154
+-
+Long-wave heating rate
+K
+Accumulated field
+......................
+155
+-
+Divergence
+s**-1
+-
+......................
+156
+-
+Height
+m
+Geopotential height
+......................
+157
+-
+Relative humidity
+%
+-
+......................
+158
+-
+Tendency of surface pressure
+Pa s**-1
+-
+......................
+159
+-
+Boundary layer height
+m
+-
+......................
+160
+-
+Standard deviation of orography
+-
+-
+......................
+161
+-
+Anisotropy of sub-gridscale orography
+-
+-
+......................
+162
+-
+Angle of sub-gridscale orography
+rad
+-
+......................
+163
+-
+Slope of sub-gridscale orography
+-
+-
+......................
+164
+TCCA
+Total cloud cover anomaly
+(0 - 1)
+-
+......................
+165
+10UA
+10 metre U wind component anomaly
+m s**-1
+-
+......................
+166
+10VA
+10 metre V wind component anomaly
+m s**-1
+-
+......................
+167
+2TA
+2 metre temperature anomaly
+K
+-
+......................
+168
+-
+2 metre dewpoint temperature
+K
+-
+......................
+169
+-
+Surface solar radiation downwards
+W m**-2 s
+Accumulated field
+......................
+170
+-
+Soil temperature level 2
+K
+-
+......................
+171
+-
+Soil wetness level 2
+m of water
+Scaled: depth surf water layer 7cm deep
+......................
+172
+-
+Land-sea mask
+(0 - 1)
+-
+......................
+173
+-
+Surface roughness
+m
+-
+......................
+174
+-
+Albedo
+(0 - 1)
+-
+......................
+175
+-
+Surface thermal radiation downwards
+W m**-2 s
+Accumulated field
+......................
+176
+-
+Surface solar radiation
+W m**-2 s
+Accumulated field
+......................
+177
+-
+Surface thermal radiation
+W m**-2 s
+Accumulated field
+......................
+178
+-
+Top solar radiation
+W m**-2 s
+Accumulated field
+......................
+179
+-
+Top thermal radiation
+W m**-2 s
+Accumulated field
+......................
+180
+-
+East-West surface stress
+N m**-2 s
+Accumulated field
+......................
+181
+-
+North-South surface stress
+N m**-2 s
+Accumulated field
+......................
+182
+-
+Evaporation
+m of water
+Accumulated field
+......................
+183
+-
+Soil temperature level 3
+K
+-
+......................
+184
+-
+Soil wetness level 3
+m of water
+Scaled depth surf water 7cm deep
+......................
+185
+-
+Convective cloud cover
+(0 - 1)
+-
+......................
+186
+-
+Low cloud cover
+(0 - 1)
+-
+......................
+187
+-
+Medium cloud cover
+(0 - 1)
+-
+......................
+188
+-
+High cloud cover
+(0 - 1)
+-
+......................
+189
+SUNDA
+Sunshine duration anomaly
+s
+Accumulated field
+......................
+190
+-
+East-West component of sub-gridscale orographic variance
+m**2
+-
+......................
+191
+-
+North-South component of sub-gridscale orographic variance
+m**2
+-
+......................
+192
+-
+North-West/South-East component of sub-gridscale orographic variance
+m**2
+-
+......................
+193
+-
+North-East/South-West component of sub-gridscale orographic variance
+m**2
+-
+......................
+194
+-
+Brightness temperature
+K
+-
+......................
+195
+-
+Latitudinal component of gravity wave stress
+N m**-2 s
+Accumulated field
+......................
+196
+-
+Meridional component of gravity wave stress
+N m**-2 s
+Accumulated field
+......................
+197
+-
+Gravity wave dissipation
+W m**-2 s
+Accumulated field
+......................
+198
+-
+Skin reservoir content
+m of water
+-
+......................
+199
+-
+Vegetation fraction
+(0 - 1)
+-
+......................
+200
+-
+Variance of sub-gridscale orography
+m**2
+-
+......................
+201
+MX2TA
+Maximum temperature at 2 metres anomaly
+K
+Since previous post-processing
+......................
+202
+MN2TA
+Minimum temperature at 2 metres anomaly
+K
+Since previous post-processing
+......................
+203
+-
+Ozone mass mixing ratio
+kg kg**-1
+-
+......................
+204
+-
+Precipitation analysis weights
+-
+-
+......................
+205
+-
+Runoff
+m
+Accumulated field
+......................
+206
+-
+Total column ozone
+kg m**-2
+-
+......................
+207
+-
+10 metre wind speed
+m s**-1
+-
+......................
+208
+-
+Top net solar radiation, clear sky
+W m**-2 s
+Accumulated field
+......................
+209
+-
+Top net thermal radiation, clear sky
+W m**-2 s
+Accumulated field
+......................
+210
+-
+Surface net solar radiation, clear sky
+W m**-2 s
+Accumulated field
+......................
+211
+-
+Surface net thermal radiation, clear sky
+W m**-2 s
+Accumulated field
+......................
+212
+-
+Solar insolation
+W m**-2
+Accumulated field
+......................
+214
+-
+Diabatic heating by radiation
+K
+-
+......................
+215
+-
+Diabatic heating by vertical diffusion
+K
+-
+......................
+216
+-
+Diabatic heating by cumulus convection
+K
+-
+......................
+217
+-
+Diabatic heating by large-scale condensation
+K
+-
+......................
+218
+-
+Vertical diffusion of zonal wind
+m s**-1
+-
+......................
+219
+-
+Vertical diffusion of meridional wind
+m s**-1
+-
+......................
+220
+-
+East-West gravity wave drag tendency
+m s**-1
+-
+......................
+221
+-
+North-South gravity wave drag tendency
+m s**-1
+-
+......................
+222
+-
+Convective tendency of zonal wind
+m s**-1
+-
+......................
+223
+-
+Convective tendency of meridional wind
+m s**-1
+-
+......................
+224
+-
+Vertical diffusion of humidity
+kg kg**-1
+-
+......................
+225
+-
+Humidity tendency by cumulus convection
+kg kg**-1
+-
+......................
+226
+-
+Humidity tendency by large-scale condensation
+kg kg**-1
+-
+......................
+227
+-
+Change from removal of negative humidity
+kg kg**-1
+-
+......................
+228
+TPA
+Total precipitation anomaly
+m
+-
+......................
+229
+-
+Instantaneous X surface stress
+N m**-2
+-
+......................
+230
+-
+Instantaneous Y surface stress
+N m**-2
+-
+......................
+231
+-
+Instantaneous surface heat flux
+W m**-2
+-
+......................
+232
+-
+Instantaneous moisture flux
+kg m**-2 s
+Evaporation
+......................
+233
+-
+Apparent surface humidity
+kg kg**-1
+-
+......................
+234
+-
+Logarithm of surface roughness length for heat
+-
+-
+......................
+235
+-
+Skin temperature
+K
+-
+......................
+236
+-
+Soil temperature level 4
+K
+-
+......................
+237
+-
+Soil wetness level 4
+m
+Scaled to depth of surface water layer 7cm deep
+......................
+238
+-
+Temperature of snow layer
+K
+-
+......................
+239
+-
+Convective snowfall
+m of water equivalent
+Accumulated field
+......................
+240
+-
+Large-scale snowfall
+m of water equivalent
+Accumulated field
+......................
+241
+-
+Accumulated cloud fraction tendency
+(-1 to 1)
+-
+......................
+242
+-
+Accumulated liquid water tendency
+(-1 to 1)
+-
+......................
+243
+-
+Forecast albedo
+(0 - 1)
+-
+......................
+244
+-
+Forecast surface roughness
+m
+-
+......................
+245
+-
+Forecast logarithm of surface roughness for heat
+-
+-
+......................
+246
+-
+Cloud liquid water content
+kg kg**-1
+-
+......................
+247
+-
+Cloud ice water content
+kg kg**-1
+-
+......................
+248
+-
+Cloud cover
+(0 - 1)
+-
+......................
+249
+-
+Accumulated ice water tendency
+(-1 to 1)
+-
+......................
+250
+-
+Ice age
+(0 - 1)
+0 first-year, 1 multi-year
+......................
+251
+-
+Adiabatic tendency of temperature
+K
+-
+......................
+252
+-
+Adiabatic tendency of humidity
+kg kg**-1
+-
+......................
+253
+-
+Adiabatic tendency of zonal wind
+m s**-1
+-
+......................
+254
+-
+Adiabatic tendency of meridional wind
+m s**-1
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_172 b/gribtables/local_table_2_version_172
new file mode 100755
index 0000000..5185885
--- /dev/null
+++ b/gribtables/local_table_2_version_172
@@ -0,0 +1,222 @@
+ECMWF local table 2: Version Number 172 (Rate of accumulation).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+044
+-
+Snow evaporation
+m of water s**-1
+-
+......................
+045
+-
+Snowmelt
+m of water s**-1
+-
+......................
+048
+-
+Magnitude of surface stress
+N m**-2
+-
+......................
+050
+-
+Large-scale precipitation fraction
+-
+-
+......................
+142
+-
+Stratiform precipitation (Large-scale precipitation)
+m s**-1
+-
+......................
+143
+-
+Convective precipitation
+m s**-1
+-
+......................
+144
+-
+Snowfall (convective + stratiform)
+m of water equivalent s**-1
+-
+......................
+145
+-
+Boundary layer dissipation
+W m**-2
+-
+......................
+146
+-
+Surface sensible heat flux
+W m**-2
+-
+......................
+147
+-
+Surface latent heat flux
+W m**-2
+-
+......................
+149
+-
+Surface net radiation
+W m**-2
+-
+......................
+153
+-
+Short-wave heating rate
+K s**-1
+-
+......................
+154
+-
+Long-wave heating rate
+K s**-1
+-
+......................
+169
+-
+Surface solar radiation downwards
+W m**-2
+-
+......................
+175
+-
+Surface thermal radiation downwards
+W m**-2
+-
+......................
+176
+-
+Surface solar radiation
+W m**-2
+-
+......................
+177
+-
+Surface thermal radiation
+W m**-2
+-
+......................
+178
+-
+Top solar radiation
+W m**-2
+-
+......................
+179
+-
+Top thermal radiation
+W m**-2
+-
+......................
+180
+-
+East-West surface stress
+N m**-2
+-
+......................
+181
+-
+North-South surface stress
+N m**-2
+-
+......................
+182
+-
+Evaporation
+m of water s**-1
+-
+......................
+189
+-
+Sunshine duration
+-
+-
+......................
+195
+-
+Latitudinal component of gravity wave stress
+N m**-2
+-
+......................
+196
+-
+Meridional component of gravity wave stress
+N m**-2
+-
+......................
+197
+-
+Gravity wave dissipation
+W m**-2
+-
+......................
+205
+-
+Runoff
+m s**-1
+-
+......................
+208
+-
+Top net solar radiation, clear sky
+W m**-2
+-
+......................
+209
+-
+Top net thermal radiation, clear sky
+W m**-2
+-
+......................
+210
+-
+Surface net solar radiation, clear sky
+W m**-2
+-
+......................
+211
+-
+Surface net thermal radiation, clear sky
+W m**-2
+-
+......................
+212
+-
+Solar insolation
+W m**-2 s**-1
+-
+......................
+228
+-
+Total precipitation
+m s**-1
+-
+......................
+239
+-
+Convective snowfall
+m of water equivalent s**-1
+-
+......................
+240
+-
+Large-scale snowfall
+m of water equivalent s**-1
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_173 b/gribtables/local_table_2_version_173
new file mode 100755
index 0000000..8d653ef
--- /dev/null
+++ b/gribtables/local_table_2_version_173
@@ -0,0 +1,222 @@
+ECMWF local table 2: Version Number 173 (Anomalous rate of accumulation).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+044
+-
+Snow evaporation anomaly
+m of water s**-1
+-
+......................
+045
+-
+Snowmelt anomaly
+m of water s**-1
+-
+......................
+048
+-
+Magnitude of surface stress anomaly
+N m**-2
+-
+......................
+050
+-
+Large-scale precipitation fraction anomaly
+-
+-
+......................
+142
+-
+Stratiform precipitation (Large-scale precipitation) anomaly
+m s**-1
+-
+......................
+143
+-
+Convective precipitation anomaly
+m s**-1
+-
+......................
+144
+SFARA
+Snowfall (convective + stratiform) anomalous rate of accumulation
+m of water equivalent s**-1
+-
+......................
+145
+-
+Boundary layer dissipation anomaly
+W m**-2
+-
+......................
+146
+-
+Surface sensible heat flux anomaly
+W m**-2
+-
+......................
+147
+-
+Surface latent heat flux anomaly
+W m**-2
+-
+......................
+149
+-
+Surface net radiation anomaly
+W m**-2
+-
+......................
+153
+-
+Short-wave heating rate anomaly
+K s**-1
+-
+......................
+154
+-
+Long-wave heating rate anomaly
+K s**-1
+-
+......................
+169
+-
+Surface solar radiation downwards anomaly
+W m**-2
+-
+......................
+175
+-
+Surface thermal radiation downwards anomaly
+W m**-2
+-
+......................
+176
+-
+Surface solar radiation anomaly
+W m**-2
+-
+......................
+177
+-
+Surface thermal radiation anomaly
+W m**-2
+-
+......................
+178
+-
+Top solar radiation anomaly
+W m**-2
+-
+......................
+179
+-
+Top thermal radiation anomaly
+W m**-2
+-
+......................
+180
+-
+East-West surface stress anomaly
+N m**-2
+-
+......................
+181
+-
+North-South surface stress anomaly
+N m**-2
+-
+......................
+182
+-
+Evaporation anomaly
+m of water s**-1
+-
+......................
+189
+SUNDARA
+Sunshine duration anomalous rate of accumulation
+dimensionless
+-
+......................
+195
+-
+Latitudinal component of gravity wave stress anomaly
+N m**-2
+-
+......................
+196
+-
+Meridional component of gravity wave stress anomaly
+N m**-2
+-
+......................
+197
+-
+Gravity wave dissipation anomaly
+W m**-2
+-
+......................
+205
+-
+Runoff anomaly
+m s**-1
+-
+......................
+208
+-
+Top net solar radiation, clear sky anomaly
+W m**-2
+-
+......................
+209
+-
+Top net thermal radiation, clear sky anomaly
+W m**-2
+-
+......................
+210
+-
+Surface net solar radiation, clear sky anomaly
+W m**-2
+-
+......................
+211
+-
+Surface net thermal radiation, clear sky anomaly
+W m**-2
+-
+......................
+212
+-
+Solar insolation anomaly
+W m**-2 s**-1
+-
+......................
+228
+TPARA
+Total precipitation anomalous rate of accumulation
+m s**-1
+-
+......................
+239
+-
+Convective snowfall anomaly
+m of water equivalent s**-1
+-
+......................
+240
+-
+Large-scale snowfall anomaly
+m of water equivalent s**-1
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_174 b/gribtables/local_table_2_version_174
new file mode 100755
index 0000000..baa79b3
--- /dev/null
+++ b/gribtables/local_table_2_version_174
@@ -0,0 +1,222 @@
+ECMWF local table 2: Version Number 174 (Non-ECMWF seasonal forecast model).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+006
+-
+Total soil moisture
+m
+The depth over which it is integrated varies depending on soil type
+......................
+008
+SRO
+Surface runoff
+kg m**-2
+Accumulated field
+......................
+009
+SSRO
+Sub-surface runoff
+kg m**-2
+Accumulated field
+......................
+031
+-
+Fraction of sea-ice in sea
+(0 - 1)
+-
+......................
+034
+-
+Open-sea surface temperature
+K
+-
+......................
+039
+-
+Volumetric soil water layer 1
+m**3 m**-3
+0 - 10cm
+......................
+040
+-
+Volumetric soil water layer 2
+m**3 m**-3
+10 - 35cm
+......................
+041
+-
+Volumetric soil water layer 3
+m**3 m**-3
+35 - 100cm
+......................
+042
+-
+Volumetric soil water layer 4
+m**3 m**-3
+100 - 300cm
+......................
+049
+-
+10 metre wind gust over last 24 hours
+m s**-1
+-
+......................
+055
+-
+1.5m temperature - mean over last 24 hours
+K
+-
+......................
+083
+-
+Net primary productivity
+kg C m**-2 s**-1
+-
+......................
+085
+-
+10m U wind over land
+m s**-1
+-
+......................
+086
+-
+10m V wind over land
+m s**-1
+-
+......................
+087
+-
+1.5m temperature over land
+K
+-
+......................
+088
+-
+1.5m dewpoint temperature over land
+K
+-
+......................
+089
+-
+Top incoming solar radiation
+W m**-2 s
+Accumulated
+......................
+090
+-
+Top outgoing solar radiation
+W m**-2 s
+Accumulated
+......................
+094
+-
+Mean sea surface temperature
+K
+-
+......................
+095
+-
+1.5m specific humidity
+kg kg**-1
+-
+......................
+098
+-
+Sea-ice thickness
+m
+-
+......................
+099
+-
+Liquid water potential temperature
+K
+-
+......................
+110
+-
+Ocean ice concentration
+(0 - 1)
+-
+......................
+111
+-
+Ocean mean ice depth
+m
+-
+......................
+139
+-
+Soil temperature layer 1
+K
+0 - 10cm
+......................
+164
+-
+Average potential temperature in upper 293.4m
+degrees C
+-
+......................
+167
+-
+1.5m temperature
+K
+-
+......................
+168
+-
+1.5m dewpoint temperature
+K
+-
+......................
+170
+-
+Soil temperature layer 2
+K
+10 - 35cm
+......................
+172
+-
+Fractional land mask
+(0 - 1)
+-
+......................
+175
+-
+Average salinity in upper 293.4m
+psu
+-
+......................
+183
+-
+Soil temperature layer 3
+K
+35 - 100cm
+......................
+201
+-
+1.5m temperature - maximum over last 24 hours
+K
+-
+......................
+202
+-
+1.5m temperature - minimum over last 24 hours
+K
+-
+......................
+236
+-
+Soil temperature layer 4
+K
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_175 b/gribtables/local_table_2_version_175
new file mode 100755
index 0000000..eb9c120
--- /dev/null
+++ b/gribtables/local_table_2_version_175
@@ -0,0 +1,186 @@
+ECMWF local table 2: Version Number 175 (Non-ECMWF seasonal forecast model - anomalies).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+006
+-
+Total soil moisture
+m
+The depth over which it is integrated varies depending on soil type
+......................
+031
+-
+Fraction of sea-ice in sea
+(0 - 1)
+-
+......................
+034
+-
+Open-sea surface temperature
+K
+-
+......................
+039
+-
+Volumetric soil water layer 1
+m**3 m**-3
+0 - 10cm
+......................
+040
+-
+Volumetric soil water layer 2
+m**3 m**-3
+10 - 35cm
+......................
+041
+-
+Volumetric soil water layer 3
+m**3 m**-3
+35 - 100cm
+......................
+042
+-
+Volumetric soil water layer 4
+m**3 m**-3
+100 - 300cm
+......................
+049
+-
+10m wind gust over last 24 hours
+m s**-1
+-
+......................
+055
+-
+1.5m temperature - mean over last 24 hours
+K
+-
+......................
+083
+-
+Net primary productivity
+kg C m**-2 s**-1
+-
+......................
+085
+-
+10m U wind over land
+m s**-1
+-
+......................
+086
+-
+10m V wind over land
+m s**-1
+-
+......................
+087
+-
+1.5m temperature over land
+K
+-
+......................
+088
+-
+1.5m dewpoint temperature over land
+K
+-
+......................
+089
+-
+Top incoming solar radiation
+W m**-2 s
+Accumulated
+......................
+090
+-
+Top outgoing solar radiation
+W m**-2 s
+Accumulated
+......................
+110
+-
+Ocean ice concentration
+(0 - 1)
+-
+......................
+111
+-
+Ocean mean ice depth
+m
+-
+......................
+139
+-
+Soil temperature layer 1
+K
+0 - 10cm
+......................
+164
+-
+Average potential temperature in upper 293.4m
+degrees C
+-
+......................
+167
+-
+1.5m temperature
+K
+-
+......................
+168
+-
+1.5m dewpoint temperature
+K
+-
+......................
+170
+-
+Soil temperature layer 2
+K
+10 - 35cm
+......................
+172
+-
+Fractional land mask
+(0 - 1)
+-
+......................
+175
+-
+Average salinity in upper 293.4m
+psu
+-
+......................
+183
+-
+Soil temperature layer 3
+K
+35 - 100cm
+......................
+201
+-
+1.5m temperature - maximum over last 24 hours
+K
+-
+......................
+202
+-
+1.5m temperature - minimum over last 24 hours
+K
+-
+......................
+236
+-
+Soil temperature layer 4
+K
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_180 b/gribtables/local_table_2_version_180
new file mode 100755
index 0000000..5eec50c
--- /dev/null
+++ b/gribtables/local_table_2_version_180
@@ -0,0 +1,198 @@
+ECMWF local table 2: Version Number 180 (ECSN - HIRETYCS).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+129
+Z
+Geopotential
+m**2 s**-2
+At the surface=orography
+......................
+130
+T
+Temperature
+K
+-
+......................
+131
+U
+U velocity
+m s**-1
+-
+......................
+132
+V
+V velocity
+m s**-1
+-
+......................
+133
+Q
+Specific humidity
+kg kg**-1
+-
+......................
+134
+SP
+Surface pressure
+Pa
+-
+......................
+137
+TCWV
+Total column water vapour
+kg m**-2
+-
+......................
+138
+VO
+Vorticity (relative)
+s**-1
+-
+......................
+141
+SD
+Snow depth
+m of water equivalent
+-
+......................
+142
+LSP
+Large-scale precipitation
+m
+-
+......................
+143
+CP
+Convective precipitation
+m
+-
+......................
+144
+SF
+Snowfall
+m of water equivalent
+-
+......................
+146
+SSHF
+Surface sensible heat flux
+W m**-2 s
+-
+......................
+147
+SLHF
+Surface latent heat flux
+W m**-2 s
+-
+......................
+149
+TSW
+Total soil wetness
+m
+-
+......................
+151
+MSL
+Mean sea level pressure
+Pa
+-
+......................
+155
+D
+Divergence
+s**-1
+-
+......................
+164
+TCC
+Total cloud cover
+(0 - 1)
+-
+......................
+165
+10U
+10 metre U wind component
+m s**-1
+-
+......................
+166
+10V
+10 metre V wind component
+m s**-1
+-
+......................
+167
+2T
+2 metre temperature
+K
+-
+......................
+168
+2D
+2 metre dewpoint temperature
+K
+-
+......................
+172
+LSM
+Land-sea mask
+(0 - 1)
+-
+......................
+176
+SSR
+Surface solar radiation
+J m**-2 s
+Net
+......................
+177
+STR
+Surface thermal radiation
+J m**-2 s
+Net
+......................
+178
+TSR
+Top solar radiation
+J m**-2 s
+Net
+......................
+179
+TTR
+Top thermal radiation
+J m**-2 s
+Net
+......................
+180
+EWSS
+East-West surface stress
+N m**-2 s
+-
+......................
+181
+NSSS
+North-South surface stress
+N m**-2 s
+-
+......................
+182
+E
+Evaporation
+m of water
+Surface
+......................
+205
+RO
+Runoff
+m
+Total
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_190 b/gribtables/local_table_2_version_190
new file mode 100755
index 0000000..f228338
--- /dev/null
+++ b/gribtables/local_table_2_version_190
@@ -0,0 +1,198 @@
+ECMWF local table 2: Version Number 190 (Seasonal to interannual ensemble forecasts).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+129
+Z
+Geopotential
+m**2 s**-2
+Instantaneous.Not geopotential height. At surface=orography(?).
+......................
+130
+T
+Temperature
+K
+Instantaneous
+......................
+131
+U
+U velocity
+m s**-1
+Instantaneous
+......................
+132
+V
+V velocity
+m s**-1
+Instantaneous
+......................
+133
+Q
+Specific humidity
+kg kg**-1
+Instantaneous
+......................
+139
+STL1
+Soil temperature level 1
+K
+Surface temperature over continents and Sea Surface Temperature over the oceans
+......................
+141
+SD
+Snow depth
+m of water
+Instantaneous
+......................
+146
+SSHF
+Surface sensible heat flux
+W m**-2 s
+Daily accumulation. Converted to flux in monthly means (units: W m**-2)
+......................
+147
+SLHF
+Surface latent heat flux
+W m**-2 s
+Daily accumulation. Converted to flux in monthly means (units: W m**-2)
+......................
+151
+MSL
+Mean sea level pressure
+Pa
+Instantaneous
+......................
+164
+TCC
+Total cloud cover
+(0 - 1)
+Instantaneous
+......................
+165
+10U
+10 metre U wind component
+m s**-1
+Instantaneous
+......................
+166
+10V
+10 metre V wind component
+m s**-1
+Instantaneous
+......................
+167
+2T
+2 metre temperature
+K
+Instantaneous
+......................
+168
+2D
+2 metre dewpoint temperature
+K
+Instantaneous
+......................
+169
+SSRD
+Downward surface solar radiation
+W m**-2 s (W m**-2 for monthly means)
+Daily accumulation. Converted to flux in monthly means (units: W m**-2)
+......................
+170
+CAP
+Field capacity
+(0 - 1)
+-
+......................
+171
+WILT
+Wilting point
+(0 - 1)
+-
+......................
+172
+LSM
+Land-sea mask
+(0 - 1)
+-
+......................
+173
+SR
+Roughness length
+(0 - 1)
+-
+......................
+174
+AL
+Albedo
+(0 - 1)
+-
+......................
+175
+STRD
+Downward surface long wave radiation
+W m**-2 s (W m**-2 for monthly means)
+Daily accumulation. Converted to flux in monthly means (units: W m**-2)
+......................
+176
+SSR
+Surface net solar radiation
+W m**-2 s (W m**-2 for monthly means)
+Daily accumulation. Converted to flux in monthly means (units: W m**-2)
+......................
+177
+STR
+Surface net long wave radiation
+W m**-2 s (W m**-2 for monthly means)
+Daily accumulation. Converted to flux in monthly means (units: W m**-2)
+......................
+178
+TSR
+Top net solar radiation
+W m**-2 s (W m**-2 for monthly means)
+Daily accumulation. Converted to flux in monthly means (units: W m**-2)
+......................
+179
+TTR
+Top net long wave radiation
+W m**-2 s (W m**-2 for monthly means)
+Daily accumulation. Converted to flux in monthly means (units: W m**-2)
+......................
+182
+E
+Evaporation
+m (m s**-1 for monthly means)
+Daily accumulation. Converted to flux in monthly means with units: m s**-1
+......................
+201
+MX2T
+Maximum 2 metre temperature
+K
+Over a 24 hour period computed using instantaneous values at 06, 12, 18 and 24 GMT
+......................
+202
+MN2T
+Minimum 2 metre temperature
+K
+Over a 24 hour period computed using instantaneous values at 06, 12, 18 and 24 GMT
+......................
+228
+TP
+Total precipitation
+m (m s**-1 for monthly means)
+Daily accumulation. Converted to flux in monthly means with units: m s**-1
+......................
+229
+TSM
+Total soil moisture
+m**3 m**-3
+The depth over which it is integrated varies depending on the atmospheric model
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_200 b/gribtables/local_table_2_version_200
new file mode 100755
index 0000000..4e38579
--- /dev/null
+++ b/gribtables/local_table_2_version_200
@@ -0,0 +1,1164 @@
+ECMWF local table 2: Version Number 200 (Differences between first guess and analysis).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+001
+STRF
+Stream function
+m**2 s**-1
+-
+......................
+002
+VPOT
+Velocity potential
+m**2 s**-1
+-
+......................
+003
+PT
+Potential temperature
+K
+-
+......................
+004
+EQPT
+Equivalent potential temperature
+K
+-
+......................
+005
+SEPT
+Saturated equivalent potential temperature
+K
+-
+......................
+011
+UDVW
+U component of divergent wind
+m s**-1
+-
+......................
+012
+VDVW
+V component of divergent wind
+m s**-1
+-
+......................
+013
+URTW
+U component of rotational wind
+m s**-1
+-
+......................
+014
+VRTW
+V component of rotational wind
+m s**-1
+-
+......................
+021
+UCTP
+Unbalanced component of temperature
+K
+-
+......................
+022
+UCLN
+Unbalanced component of logarithm of surface pressure
+-
+-
+......................
+023
+UCDV
+Unbalanced component of divergence
+s**-1
+-
+......................
+026
+CL
+Lake cover
+(0 - 1)
+-
+......................
+027
+CVL
+Low vegetation cover
+(0 - 1)
+-
+......................
+028
+CVH
+High vegetation cover
+(0 - 1)
+-
+......................
+029
+TVL
+Type of low vegetation
+-
+Table index
+......................
+030
+TVH
+Type of high vegetation
+-
+Table index
+......................
+031
+CI
+Sea-ice cover
+(0 - 1)
+-
+......................
+032
+ASN
+Snow albedo
+(0 - 1)
+-
+......................
+033
+RSN
+Snow density
+kg m**-3
+-
+......................
+034
+SSTK
+Sea surface temperature
+K
+-
+......................
+035
+ISTL1
+Ice surface temperature layer 1
+K
+-
+......................
+036
+ISTL2
+Ice surface temperature layer 2
+K
+-
+......................
+037
+ISTL3
+Ice surface temperature layer 3
+K
+-
+......................
+038
+ISTL4
+Ice surface temperature layer 4
+K
+-
+......................
+039
+SWVL1
+Volumetric soil water layer 1
+m**3 m**-3
+-
+......................
+040
+SWVL2
+Volumetric soil water layer 2
+m**3 m**-3
+-
+......................
+041
+SWVL3
+Volumetric soil water layer 3
+m**3 m**-3
+-
+......................
+042
+SWVL4
+Volumetric soil water layer 4
+m**3 m**-3
+-
+......................
+043
+SLT
+Soil type
+-
+-
+......................
+044
+ES
+Snow evaporation
+m of water
+Accumulated field
+......................
+045
+SMLT
+Snowmelt
+m of water
+Accumulated field
+......................
+046
+SDUR
+Solar duration
+s
+-
+......................
+047
+DSRP
+Direct solar radiation
+w m**-2
+Incident on a plane perpendicular to the Sun's direction
+......................
+048
+MAGSS
+Magnitude of surface stress
+N m**-2 s
+Accumulated field
+......................
+049
+10FG
+10 metre wind gust
+m s**-1
+-
+......................
+050
+LSPF
+Large-scale precipitation fraction
+s
+Accumulated field
+......................
+051
+MX2T24
+Maximum 2 metre temperature
+K
+During previous 24 hours
+......................
+052
+MN2T24
+Minimum 2 metre temperature
+K
+During previous 24 hours
+......................
+053
+MONT
+Montgomery potential
+m**2 s**-2
+-
+......................
+054
+PRES
+Pressure
+Pa
+-
+......................
+055
+MEAN2T24
+Mean 2 metre temperature in past 24 hours
+K
+6-hourly intervals
+......................
+056
+MN2D24
+Mean 2 metre dewpoint temperature in past 24 hours
+K
+6-hourly intervals
+......................
+057
+UVB
+Downward UV radiation at the surface
+w m**-2 s
+Ultra-violet band B. Accumulated field.
+......................
+058
+PAR
+Photosynthetically active radiation at the surface
+w m**-2 s
+Accumulated field.
+......................
+059
+CAPE
+Convective available potential energy
+J kg**-1
+-
+......................
+060
+PV
+Potential vorticity
+K m**2 kg**-1 s**-1
+-
+......................
+061
+TPO
+Total precipitation from observations
+Millimetres*100 + number of stations
+-
+......................
+062
+OBCT
+Observation count
+-
+Count of observations used in calculating value at a gridpoint
+......................
+063
+-
+Start time for skin temperature difference
+s
+Seconds from reference time
+......................
+064
+-
+Finish time for skin temperature difference
+s
+Seconds from reference time
+......................
+065
+-
+Skin temperature difference
+K
+-
+......................
+066
+-
+Leaf area index, low vegetation
+m**2 / m**2
+-
+......................
+067
+-
+Leaf area index, high vegetation
+m**2 / m**2
+-
+......................
+068
+-
+Minimum stomatal resistance, low vegetation
+s m**-1
+-
+......................
+069
+-
+Minimum stomatal resistance, high vegetation
+s m**-1
+-
+......................
+070
+-
+Biome cover, low vegetation
+(0 - 1)
+-
+......................
+071
+-
+Biome cover, high vegetation
+(0 - 1)
+-
+......................
+078
+-
+Total column liquid water
+kg m**-2
+-
+......................
+079
+-
+Total column ice water
+kg m**-2
+-
+......................
+121
+MX2T6
+Maximum temperature at 2 metres
+K
+During previous 6 hours
+......................
+122
+MN2T6
+Minimum temperature at 2 metres
+K
+During previous 6 hours
+......................
+123
+10FG6
+10 metre wind gust in the past 6 hours
+m s**-1
+During previous 6 hours
+......................
+125
+-
+Vertically integrated total energy
+J m**-2
+Integrated over a number of model levels
+......................
+126
+-
+Generic parameter for sensitive area prediction
+Various
+Originating centre dependent
+......................
+127
+AT
+Atmospheric tide
+-
+Not GRIB data (pseudo-GRIB)
+......................
+128
+BV
+Budget values
+-
+Not GRIB data (pseudo-GRIB)
+......................
+129
+Z
+Geopotential
+m**2 s**-2
+At the surface: orography
+......................
+130
+T
+Temperature
+K
+-
+......................
+131
+U
+U velocity
+m s**-1
+-
+......................
+132
+V
+V velocity
+m s**-1
+-
+......................
+133
+Q
+Specific humidity
+kg kg**-1
+-
+......................
+134
+SP
+Surface pressure
+Pa
+-
+......................
+135
+W
+Vertical velocity
+Pa s**-1
+-
+......................
+136
+TCW
+Total column water
+kg m**-2
+Liquid + ice + vapour
+......................
+137
+TCWV
+Total column water vapour
+kg m**-2
+-
+......................
+138
+VO
+Vorticity (relative)
+s**-1
+-
+......................
+139
+STL1
+Soil temperature level 1
+K
+Soil temperature (ST) before 19930804
+......................
+140
+SWL1
+Soil wetness level 1
+m of water
+Surface soil wetness (SSW) before 19930804
+......................
+141
+SD
+Snow depth
+m of water equivalent
+-
+......................
+142
+LSP
+Stratiform precipitation (Large-scale precipitation)
+m
+Accumulated field
+......................
+143
+CP
+Convective precipitation
+m
+Accumulated field
+......................
+144
+SF
+Snowfall (convective + stratiform)
+m of water equivalent
+Accumulated field
+......................
+145
+BLD
+Boundary layer dissipation
+W m**-2 s
+Accumulated field
+......................
+146
+SSHF
+Surface sensible heat flux
+W m**-2 s
+Accumulated field
+......................
+147
+SLHF
+Surface latent heat flux
+W m**-2 s
+Accumulated field
+......................
+148
+CHNK
+Charnock
+-
+Surface stress (SS) before 19980519
+......................
+149
+SNR
+Surface net radiation
+W m**-2 s
+Accumulated field
+......................
+150
+TNR
+Top net radiation
+-
+-
+......................
+151
+MSL
+Mean sea level pressure
+Pa
+-
+......................
+152
+LNSP
+Logarithm of surface pressure
+-
+-
+......................
+153
+SWHR
+Short-wave heating rate
+K
+Accumulated field
+......................
+154
+LWHR
+Long-wave heating rate
+K
+Accumulated field
+......................
+155
+D
+Divergence
+s**-1
+-
+......................
+156
+GH
+Height
+m
+Geopotential height
+......................
+157
+R
+Relative humidity
+%
+-
+......................
+158
+TSP
+Tendency of surface pressure
+Pa s**-1
+-
+......................
+159
+BLH
+Boundary layer height
+m
+-
+......................
+160
+SDOR
+Standard deviation of orography
+-
+-
+......................
+161
+ISOR
+Anisotropy of sub-gridscale orography
+-
+-
+......................
+162
+ANOR
+Angle of sub-gridscale orography
+rad
+-
+......................
+163
+SLOR
+Slope of sub-gridscale orography
+-
+-
+......................
+164
+TCC
+Total cloud cover
+(0 - 1)
+-
+......................
+165
+10U
+10 metre U wind component
+m s**-1
+-
+......................
+166
+10V
+10 metre V wind component
+m s**-1
+-
+......................
+167
+2T
+2 metre temperature
+K
+-
+......................
+168
+2D
+2 metre dewpoint temperature
+K
+-
+......................
+169
+SSRD
+Surface solar radiation downwards
+W m**-2 s
+Accumulated field
+......................
+170
+STL2
+Soil temperature level 2
+K
+Deep soil temperature (DST) before 19930804
+......................
+171
+SWL2
+Soil wetness level 2
+m of water
+Deep soil wetness (DSW) before 19930804. Scaled: depth surf water layer 7cm deep
+......................
+172
+LSM
+Land-sea mask
+(0 - 1)
+-
+......................
+173
+SR
+Surface roughness
+m
+-
+......................
+174
+AL
+Albedo
+(0 - 1)
+-
+......................
+175
+STRD
+Surface thermal radiation downwards
+W m**-2 s
+Accumulated field
+......................
+176
+SSR
+Surface solar radiation
+W m**-2 s
+Accumulated field
+......................
+177
+STR
+Surface thermal radiation
+W m**-2 s
+Accumulated field
+......................
+178
+TSR
+Top solar radiation
+W m**-2 s
+Accumulated field
+......................
+179
+TTR
+Top thermal radiation
+W m**-2 s
+Accumulated field
+......................
+180
+EWSS
+East-West surface stress
+N m**-2 s
+Accumulated field
+......................
+181
+NSSS
+North-South surface stress
+N m**-2 s
+Accumulated field
+......................
+182
+E
+Evaporation
+m of water
+Accumulated field
+......................
+183
+STL3
+Soil temperature level 3
+K
+Climatological deep soil temperature (CDST) before 19930804
+......................
+184
+SWL3
+Soil wetness level 3
+m of water
+Climatological deep soil wetness (CDSW) before 19930804.Scaled depth surf water 7cm deep
+......................
+185
+CCC
+Convective cloud cover
+(0 - 1)
+-
+......................
+186
+LCC
+Low cloud cover
+(0 - 1)
+-
+......................
+187
+MCC
+Medium cloud cover
+(0 - 1)
+-
+......................
+188
+HCC
+High cloud cover
+(0 - 1)
+-
+......................
+189
+SUND
+Sunshine duration
+s
+Accumulated field
+......................
+190
+EWOV
+East-West component of sub-gridscale orographic variance
+m**2
+-
+......................
+191
+NSOV
+North-South component of sub-gridscale orographic variance
+m**2
+-
+......................
+192
+NWOV
+North-West/South-East component of sub-gridscale orographic variance
+m**2
+-
+......................
+193
+NEOV
+North-East/South-West component of sub-gridscale orographic variance
+m**2
+-
+......................
+194
+BTMP
+Brightness temperature
+K
+-
+......................
+195
+LGWS
+Latitudinal component of gravity wave stress
+N m**-2 s
+Accumulated field
+......................
+196
+MGWS
+Meridional component of gravity wave stress
+N m**-2 s
+Accumulated field
+......................
+197
+GWD
+Gravity wave dissipation
+W m**-2 s
+Accumulated field
+......................
+198
+SRC
+Skin reservoir content
+m of water
+-
+......................
+199
+VEG
+Vegetation fraction
+(0 - 1)
+-
+......................
+200
+VSO
+Variance of sub-gridscale orography
+m**2
+-
+......................
+201
+MX2T
+Maximum temperature at 2 metres since previous post-processing
+K
+-
+......................
+202
+MN2T
+Minimum temperature at 2 metres since previous post-processing
+K
+-
+......................
+203
+O3
+Ozone mass mixing ratio
+kg kg**-1
+-
+......................
+204
+PAW
+Precipitation analysis weights
+-
+-
+......................
+205
+RO
+Runoff
+m
+Accumulated field
+......................
+206
+TCO3
+Total column ozone
+kg m**-2
+Before 20010612 was in Dobsons. 1 Dobson = 2.1415E-5 kg m**-2
+......................
+207
+10SI
+10 metre wind speed
+m s**-1
+-
+......................
+208
+TSRC
+Top net solar radiation, clear sky
+W m**-2 s
+Accumulated field
+......................
+209
+TTRC
+Top net thermal radiation, clear sky
+W m**-2 s
+Accumulated field
+......................
+210
+SSRC
+Surface net solar radiation, clear sky
+W m**-2 s
+Accumulated field
+......................
+211
+STRC
+Surface net thermal radiation, clear sky
+W m**-2 s
+Accumulated field
+......................
+212
+TISR
+TOA incident solar radiation
+W m**-2 s
+Accumulated field
+......................
+214
+DHR
+Diabatic heating by radiation
+K
+-
+......................
+215
+DHVD
+Diabatic heating by vertical diffusion
+K
+-
+......................
+216
+DHCC
+Diabatic heating by cumulus convection
+K
+-
+......................
+217
+DHLC
+Diabatic heating large-scale condensation
+K
+-
+......................
+218
+VDZW
+Vertical diffusion of zonal wind
+m s**-1
+-
+......................
+219
+VDMW
+Vertical diffusion of meridional wind
+m s**-1
+-
+......................
+220
+EWGD
+East-West gravity wave drag tendency
+m s**-1
+-
+......................
+221
+NSGD
+North-South gravity wave drag tendency
+m s**-1
+-
+......................
+222
+CTZW
+Convective tendency of zonal wind
+m s**-1
+-
+......................
+223
+CTMW
+Convective tendency of meridional wind
+m s**-1
+-
+......................
+224
+VDH
+Vertical diffusion of humidity
+kg kg**-1
+-
+......................
+225
+HTCC
+Humidity tendency by cumulus convection
+kg kg**-1
+-
+......................
+226
+HTLC
+Humidity tendency by large-scale condensation
+kg kg**-1
+-
+......................
+227
+CRNH
+Change from removal of negative humidity
+kg kg**-1
+-
+......................
+228
+TP
+Total precipitation
+m
+Accumulated
+......................
+229
+IEWS
+Instantaneous X surface stress
+N m**-2
+-
+......................
+230
+INSS
+Instantaneous Y surface stress
+N m**-2
+-
+......................
+231
+ISHF
+Instantaneous surface heat flux
+W m**-2
+-
+......................
+232
+IE
+Instantaneous moisture flux
+kg m**-2 s
+Evaporation
+......................
+233
+ASQ
+Apparent surface humidity
+kg kg**-1
+-
+......................
+234
+LSRH
+Logarithm of surface roughness length for heat
+-
+-
+......................
+235
+SKT
+Skin temperature
+K
+-
+......................
+236
+STL4
+Soil temperature level 4
+K
+-
+......................
+237
+SWL4
+Soil wetness level 4
+m
+Scaled to depth of surface water layer 7cm deep
+......................
+238
+TSN
+Temperature of snow layer
+K
+-
+......................
+239
+CSF
+Convective snowfall
+m of water equivalent
+Accumulated field
+......................
+240
+LSF
+Large-scale snowfall
+m of water equivalent
+Accumulated field
+......................
+241
+ACF
+Accumulated cloud fraction tendency
+(-1 to 1)
+-
+......................
+242
+ALW
+Accumulated liquid water tendency
+(-1 to 1)
+-
+......................
+243
+FAL
+Forecast albedo
+(0 - 1)
+-
+......................
+244
+FSR
+Forecast surface roughness
+m
+-
+......................
+245
+FLSR
+Forecast logarithm of surface roughness for heat
+-
+-
+......................
+246
+CLWC
+Cloud liquid water content
+kg kg**-1
+-
+......................
+247
+CIWC
+Cloud ice water content
+kg kg**-1
+-
+......................
+248
+CC
+Cloud cover
+(0 - 1)
+-
+......................
+249
+AIW
+Accumulated ice water tendency
+(-1 to 1)
+-
+......................
+250
+ICE
+Ice age
+(0 - 1)
+0 first-year, 1 multi-year
+......................
+251
+ATTE
+Adiabatic tendency of temperature
+K
+-
+......................
+252
+ATHE
+Adiabatic tendency of humidity
+kg kg**-1
+-
+......................
+253
+ATZE
+Adiabatic tendency of zonal wind
+m s**-1
+-
+......................
+254
+ATMW
+Adiabatic tendency of meridional wind
+m s**-1
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_201 b/gribtables/local_table_2_version_201
new file mode 100755
index 0000000..2649eac
--- /dev/null
+++ b/gribtables/local_table_2_version_201
@@ -0,0 +1,468 @@
+ECMWF local table 2: Version Number 201 (COSMO).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+001
+-
+downward shortwave radiant flux density
+W m**-2
+-
+......................
+002
+-
+upward shortwave radiant flux density
+W m**-2
+-
+......................
+003
+-
+downward longwave radiant flux density
+W m**-2
+-
+......................
+004
+-
+upward longwave radiant flux density
+W m**-2
+-
+......................
+005
+APAB_S
+downwd photosynthetic active radiant flux density
+W m**-2
+-
+......................
+006
+-
+net shortwave flux
+W m**-2
+-
+......................
+007
+-
+net longwave flux
+W m**-2
+-
+......................
+008
+-
+total net radiative flux density
+W m**-2
+-
+......................
+009
+-
+downw shortw radiant flux density, cloudfree part
+W m**-2
+-
+......................
+010
+-
+upw shortw radiant flux density, cloudy part
+W m**-2
+-
+......................
+011
+-
+downw longw radiant flux density, cloudfree part
+W m**-2
+-
+......................
+012
+-
+upw longw radiant flux density, cloudy part
+W m**-2
+-
+......................
+013
+SOHR_RAD
+shortwave radiative heating rate
+K s**-1
+-
+......................
+014
+THHR_RAD
+longwave radiative heating rate
+K s**-1
+-
+......................
+015
+-
+total radiative heating rate
+W m**-2
+-
+......................
+016
+-
+soil heat flux, surface
+W m**-2
+-
+......................
+017
+-
+soil heat flux, bottom of layer
+W m**-2
+-
+......................
+029
+CLC
+fractional cloud cover
+(0-1)
+-
+......................
+030
+-
+cloud cover, grid scale
+(0-1)
+-
+......................
+031
+QC
+specific cloud water content
+kg kg**-1
+-
+......................
+032
+-
+cloud water content, grid scale, vert integrated
+kg m**-2
+-
+......................
+033
+QI
+specific cloud ice content, grid scale
+kg kg**-1
+-
+......................
+034
+-
+cloud ice content, grid scale, vert integrated
+kg m**-2
+-
+......................
+035
+-
+specific rainwater content, grid scale
+kg kg**-1
+-
+......................
+036
+-
+specific snow content, grid scale
+kg kg**-1
+-
+......................
+037
+-
+specific rainwater content, gs, vert. integrated
+kg m**-2
+-
+......................
+038
+-
+specific snow content, gs, vert. integrated
+kg m**-2
+-
+......................
+041
+TWATER
+total column water
+kg m**-2
+-
+......................
+042
+-
+vert. integral of divergence of tot. water content
+kg m**-2
+-
+......................
+050
+CH_CM_CL
+cloud covers CH_CM_CL (000...888)
+(0-1)
+-
+......................
+051
+-
+cloud cover CH (0..8)
+(0-1)
+-
+......................
+052
+-
+cloud cover CM (0..8)
+(0-1)
+-
+......................
+053
+-
+cloud cover CL (0..8)
+(0-1)
+-
+......................
+054
+-
+total cloud cover (0..8)
+(0-1)
+-
+......................
+055
+-
+fog (0..8)
+(0-1)
+-
+......................
+056
+-
+fog
+(0-1)
+-
+......................
+060
+-
+cloud cover, convective cirrus
+(0-1)
+-
+......................
+061
+-
+specific cloud water content, convective clouds
+kg kg**-1
+-
+......................
+062
+-
+cloud water content, conv clouds, vert integrated
+kg m**-2
+-
+......................
+063
+-
+specific cloud ice content, convective clouds
+kg kg**-1
+-
+......................
+064
+-
+cloud ice content, conv clouds, vert integrated
+kg m**-2
+-
+......................
+065
+-
+convective mass flux
+kg s**-1 m**-2
+-
+......................
+066
+-
+updraft velocity, convection
+m s**-1
+-
+......................
+067
+-
+entrainment parameter, convection
+m**-1
+-
+......................
+068
+HBAS_CON
+cloud base, convective clouds (above msl)
+m
+-
+......................
+069
+HTOP_CON
+cloud top, convective clouds (above msl)
+m
+-
+......................
+070
+-
+convective layers (00...77) (BKE)
+(0-1)
+-
+......................
+071
+-
+KO-index
+(1)
+-
+......................
+072
+BAS_CON
+convection base index
+(1)
+-
+......................
+073
+TOP_CON
+convection top index
+(1)
+-
+......................
+074
+DT_CON
+convective temperature tendency
+K s**-1
+-
+......................
+075
+DQV_CON
+convective tendency of specific humidity
+s**-1
+-
+......................
+076
+-
+convective tendency of total heat
+J kg**-1 s**-1
+-
+......................
+077
+-
+convective tendency of total water
+s**-1
+-
+......................
+078
+DU_CON
+convective momentum tendency (X-component)
+m s**-2
+-
+......................
+079
+DV_CON
+convective momentum tendency (Y-component)
+m s**-2
+-
+......................
+080
+-
+convective vorticity tendency
+s**-2
+-
+......................
+081
+-
+convective divergence tendency
+s**-2
+-
+......................
+082
+HTOP_DC
+top of dry convection (above msl)
+m
+-
+......................
+083
+-
+dry convection top index
+(1)
+-
+......................
+084
+HZEROCL
+height of 0 degree Celsius isotherm above msl
+m
+-
+......................
+085
+SNOWLMT
+height of snow-fall limit
+m
+-
+......................
+099
+QRS_GSP
+spec. content of precip. particles
+kg kg**-1
+-
+......................
+100
+PRR_GSP
+surface precipitation rate, rain, grid scale
+kg s**-1 m**-2
+-
+......................
+101
+PRS_GSP
+surface precipitation rate, snow, grid scale
+kg s**-1 m**-2
+-
+......................
+102
+RAIN_GSP
+surface precipitation amount, rain, grid scale
+kg m**-2
+-
+......................
+111
+PRR_CON
+surface precipitation rate, rain, convective
+kg s**-1 m**-2
+-
+......................
+112
+PRS_CON
+surface precipitation rate, snow, convective
+kg s**-1 m**-2
+-
+......................
+113
+RAIN_CON
+surface precipitation amount, rain, convective
+kg m**-2
+-
+......................
+139
+PP
+deviation of pressure from reference value
+Pa
+-
+......................
+150
+-
+coefficient of horizontal diffusion
+m**2 s**-1
+-
+......................
+187
+VMAX_10M
+maximum wind velocity
+m s**-1
+-
+......................
+200
+W_I
+water content of interception store
+kg m**-2
+-
+......................
+203
+T_SNOW
+snow temperature
+K
+-
+......................
+215
+T_ICE
+ice surface temperature
+K
+-
+......................
+241
+CAPE_CON
+convective available potential energy
+J kg**-1
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_210 b/gribtables/local_table_2_version_210
new file mode 100755
index 0000000..5c093f1
--- /dev/null
+++ b/gribtables/local_table_2_version_210
@@ -0,0 +1,672 @@
+ECMWF local table 2: Version Number 210 (GEMS).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+001
+AERMR01
+Aerosol type 1 mixing ratio
+kg kg**-1
+prognostic 3D
+......................
+002
+AERMR02
+Aerosol type 2 mixing ratio
+kg kg**-1
+prognostic 3D
+......................
+003
+AERMR03
+Aerosol type 3 mixing ratio
+kg kg**-1
+prognostic 3D
+......................
+004
+AERMR04
+Aerosol type 4 mixing ratio
+kg kg**-1
+prognostic 3D
+......................
+005
+AERMR05
+Aerosol type 5 mixing ratio
+kg kg**-1
+prognostic 3D
+......................
+006
+AERMR06
+Aerosol type 6 mixing ratio
+kg kg**-1
+prognostic 3D
+......................
+007
+AERMR07
+Aerosol type 7 mixing ratio
+kg kg**-1
+prognostic 3D
+......................
+008
+AERMR08
+Aerosol type 8 mixing ratio
+kg kg**-1
+prognostic 3D
+......................
+009
+AERMR09
+Aerosol type 9 mixing ratio
+kg kg**-1
+prognostic 3D
+......................
+010
+AERMR10
+Aerosol type 10 mixing ratio
+kg kg**-1
+prognostic 3D
+......................
+011
+AERMR11
+Aerosol type 11 mixing ratio
+kg kg**-1
+prognostic 3D
+......................
+012
+AERMR12
+Aerosol type 12 mixing ratio
+kg kg**-1
+prognostic 3D
+......................
+016
+AERGN01
+Aerosol type 1 source/gain accumulated
+kg m**-2
+diagnostic 2D
+......................
+017
+AERGN02
+Aerosol type 2 source/gain accumulated
+kg m**-2
+diagnostic 2D
+......................
+018
+AERGN03
+Aerosol type 3 source/gain accumulated
+kg m**-2
+diagnostic 3D
+......................
+019
+AERGN04
+Aerosol type 4 source/gain accumulated
+kg m**-2
+diagnostic 3D
+......................
+020
+AERGN05
+Aerosol type 5 source/gain accumulated
+kg m**-2
+diagnostic 3D
+......................
+021
+AERGN06
+Aerosol type 6 source/gain accumulated
+kg m**-2
+diagnostic 3D
+......................
+022
+AERGN07
+Aerosol type 7 source/gain accumulated
+kg m**-2
+diagnostic 3D
+......................
+023
+AERGN08
+Aerosol type 8 source/gain accumulated
+kg m**-2
+diagnostic 3D
+......................
+024
+AERGN09
+Aerosol type 9 source/gain accumulated
+kg m**-2
+diagnostic 3D
+......................
+025
+AERGN10
+Aerosol type 10 source/gain accumulated
+kg m**-2
+diagnostic 3D
+......................
+026
+AERGN11
+Aerosol type 11 source/gain accumulated
+kg m**-2
+diagnostic 3D
+......................
+027
+AERGN12
+Aerosol type 12 source/gain accumulated
+kg m**-2
+diagnostic 2D
+......................
+031
+AERLS01
+Aerosol type 1 sink/loss accumulated
+kg m**-2
+diagnostic 2D
+......................
+032
+AERLS02
+Aerosol type 2 sink/loss accumulated
+kg m**-2
+diagnostic 2D
+......................
+033
+AERLS03
+Aerosol type 3 sink/loss accumulated
+kg m**-2
+diagnostic 3D
+......................
+034
+AERLS04
+Aerosol type 4 sink/loss accumulated
+kg m**-2
+diagnostic 3D
+......................
+035
+AERLS05
+Aerosol type 5 sink/loss accumulated
+kg m**-2
+diagnostic 3D
+......................
+036
+AERLS06
+Aerosol type 6 sink/loss accumulated
+kg m**-2
+diagnostic 3D
+......................
+037
+AERLS07
+Aerosol type 7 sink/loss accumulated
+kg m**-2
+diagnostic 3D
+......................
+038
+AERLS08
+Aerosol type 8 sink/loss accumulated
+kg m**-2
+diagnostic 3D
+......................
+039
+AERLS09
+Aerosol type 9 sink/loss accumulated
+kg m**-2
+diagnostic 3D
+......................
+040
+AERLS10
+Aerosol type 10 sink/loss accumulated
+kg m**-2
+diagnostic 3D
+......................
+041
+AERLS11
+Aerosol type 11 sink/loss accumulated
+kg m**-2
+diagnostic 3D
+......................
+042
+AERLS12
+Aerosol type 12 sink/loss accumulated
+kg m**-2
+diagnostic 2D
+......................
+046
+AERPR
+Aerosol precursor mixing ratio
+kg kg**-1
+diagnostic 2D
+......................
+047
+AERSM
+Aerosol small mode mixing ratio
+kg kg**-1
+diagnostic 2D
+......................
+048
+AERLG
+Aerosol large mode mixing ratio
+kg kg**-1
+diagnostic 2D
+......................
+049
+AODPR
+Aerosol precursor optical depth
+dimensionless
+diagnostic 2D
+......................
+050
+AODSM
+Aerosol small mode optical depth
+dimensionless
+diagnostic 2D
+......................
+051
+AODLG
+Aerosol large mode optical depth
+dimensionless
+diagnostic 2D
+......................
+052
+AERDEP
+Dust emission potential
+kg s**2 m**-5
+climate field 2D
+......................
+053
+AERLTS
+Lifting threshold speed
+m s**-1
+climate field 2D
+......................
+054
+AERSCC
+Soil clay content
+%
+climate field 2D
+......................
+061
+CO2
+Carbon Dioxide
+kg kg**-1
+prognostic 3D
+......................
+062
+CH4
+Methane
+kg kg**-1
+prognostic 3D
+......................
+063
+N2O
+Nitrous oxide
+kg kg**-1
+prognostic 3D
+......................
+064
+TCCO2
+Total column Carbon Dioxide
+kg m**-2
+diagnostic 2D
+......................
+065
+TCCH4
+Total column Methane
+kg m**-2
+diagnostic 2D
+......................
+066
+TCN2O
+Total column Nitrous oxide
+kg m**-2
+diagnostic 2D
+......................
+067
+CO2OF
+Ocean flux of Carbon Dioxide
+kg m**-2 s**-1
+climate field 2D
+......................
+068
+CO2NBF
+Natural biosphere flux of Carbon Dioxide
+kg m**-2 s**-1
+climate field 2D
+......................
+069
+CO2APF
+Anthropogenic emissions of Carbon Dioxide
+kg m**-2 s**-1
+climate field 2D
+......................
+070
+CH4F
+Methane Surface Fluxes
+kg m**-2 s**-1
+-
+......................
+071
+kCH4
+Methane loss rate due to radical hydroxyl (OH)
+s**-1
+-
+......................
+080
+CO2FIRE
+Wildfire flux of Carbon Dioxide
+kg m**-2 s**-1
+-
+......................
+081
+COFIRE
+Wildfire flux of Carbon Monoxide
+kg m**-2 s**-1
+-
+......................
+082
+CH4FIRE
+Wildfire flux of Methane
+kg m**-2 s**-1
+-
+......................
+083
+NMHCFIRE
+Wildfire flux of Non-Methane Hydro-Carbons
+kg m**-2 s**-1
+-
+......................
+084
+H2FIRE
+Wildfire flux of Hydrogen
+kg m**-2 s**-1
+-
+......................
+085
+NOXFIRE
+Wildfire flux of Nitrogen Oxides NOx
+kg m**-2 s**-1
+-
+......................
+086
+N2OFIRE
+Wildfire flux of Nitrous Oxide
+kg m**-2 s**-1
+-
+......................
+087
+PM2P5FIRE
+Wildfire flux of Particulate Matter PM2.5
+kg m**-2 s**-1
+-
+......................
+088
+TPMFIRE
+Wildfire flux of Total Particulate Matter
+kg m**-2 s**-1
+-
+......................
+089
+TCFIRE
+Wildfire flux of Total Carbon in Aerosols
+kg m**-2 s**-1
+-
+......................
+090
+OCFIRE
+Wildfire flux of Organic Carbon
+kg m**-2 s**-1
+-
+......................
+091
+BCFIRE
+Wildfire flux of Black Carbon
+kg m**-2 s**-1
+-
+......................
+092
+CFIRE
+Wildfire overall flux of burnt Carbon
+kg m**-2 s**-1
+-
+......................
+093
+C4FFIRE
+Wildfire fraction of C4 plants
+dimensionless
+-
+......................
+094
+VEGFIRE
+Wildfire vegetation map index
+dimensionless
+-
+......................
+095
+CCFIRE
+Wildfire Combustion Completeness
+dimensionless
+-
+......................
+096
+FLFIRE
+Wildfire Fuel Load: Carbon per unit area
+kg m**-2
+-
+......................
+097
+BFFIRE
+Wildfire fraction of area burnt
+dimensionless
+-
+......................
+121
+NO2
+Nitrogen dioxide
+kg kg**-1
+prognostic 3D
+......................
+122
+SO2
+Sulphur dioxide
+kg kg**-1
+prognostic 3D
+......................
+123
+CO
+Carbon monoxide
+kg kg**-1
+prognostic 3D
+......................
+124
+HCHO
+Formaldehyde
+kg kg**-1
+prognostic 3D
+......................
+125
+TCNO2
+Total column Nitrogen dioxide
+kg m**-2
+diagnostic 2D
+......................
+126
+TCSO2
+Total column Sulphur dioxide
+kg m**-2
+diagnostic 2D
+......................
+127
+TCCO
+Total column Carbon monoxide
+kg m**-2
+diagnostic 2D
+......................
+128
+TCHCHO
+Total column Formaldehyde
+kg m**-2
+diagnostic 2D
+......................
+129
+NOX
+Nitrogen Oxides
+kg kg**-1
+-
+......................
+130
+TCNOX
+Total Column Nitrogen Oxides
+kg m**-2
+-
+......................
+131
+GRG1
+Reactive tracer 1 mass mixing ratio
+kg kg**-1
+-
+......................
+132
+TCGRG1
+Total column GRG tracer 1
+kg m**-2
+-
+......................
+133
+GRG2
+Reactive tracer 2 mass mixing ratio
+kg kg**-1
+-
+......................
+134
+TCGRG2
+Total column GRG tracer 2
+kg m**-2
+-
+......................
+135
+GRG3
+Reactive tracer 3 mass mixing ratio
+kg kg**-1
+-
+......................
+136
+TCGRG3
+Total column GRG tracer 3
+kg m**-2
+-
+......................
+137
+GRG4
+Reactive tracer 4 mass mixing ratio
+kg kg**-1
+-
+......................
+138
+TCGRG4
+Total column GRG tracer 4
+kg m**-2
+-
+......................
+139
+GRG5
+Reactive tracer 5 mass mixing ratio
+kg kg**-1
+-
+......................
+140
+TCGRG5
+Total column GRG tracer 5
+kg m**-2
+-
+......................
+141
+GRG6
+Reactive tracer 6 mass mixing ratio
+kg kg**-1
+-
+......................
+142
+TCGRG6
+Total column GRG tracer 6
+kg m**-2
+-
+......................
+143
+GRG7
+Reactive tracer 7 mass mixing ratio
+kg kg**-1
+-
+......................
+144
+TCGRG7
+Total column GRG tracer 7
+kg m**-2
+-
+......................
+145
+GRG8
+Reactive tracer 8 mass mixing ratio
+kg kg**-1
+-
+......................
+146
+TCGRG8
+Total column GRG tracer 8
+kg m**-2
+-
+......................
+147
+GRG9
+Reactive tracer 9 mass mixing ratio
+kg kg**-1
+-
+......................
+148
+TCGRG9
+Total column GRG tracer 9
+kg m**-2
+-
+......................
+149
+GRG10
+Reactive tracer 10 mass mixing ratio
+kg kg**-1
+-
+......................
+150
+TCGRG10
+Total column GRG tracer 10
+kg m**-2
+-
+......................
+181
+Ra
+Radon
+kg kg**-1
+prognostic 3D
+......................
+182
+SF6
+Sulphur Hexafluoride
+kg kg**-1
+prognostic 3D
+......................
+183
+TCRa
+Total column Radon
+kg m**-2
+diagnostic 2D
+......................
+184
+TCSF6
+Total column Sulphur Hexafluoride
+kg m**-2
+diagnostic 2D
+......................
+185
+SF6APF
+Anthropogenic Emissions of Sulphur Hexafluoride
+kg m**-2 s**-1
+-
+......................
+203
+GO3
+GEMS Ozone
+kg kg**-1
+prognostic 3D
+......................
+206
+GTCO3
+GEMS Total column ozone
+kg m**-2
+diagnostic 2D
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_211 b/gribtables/local_table_2_version_211
new file mode 100755
index 0000000..bac4a79
--- /dev/null
+++ b/gribtables/local_table_2_version_211
@@ -0,0 +1,90 @@
+ECMWF local table 2: Version Number 211 (GEMS Differences between first guess and analysis).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+046
+AERPR
+Aerosol precursor mixing ratio
+kg kg**-1
+diagnostic 2D
+......................
+047
+AERSM
+Aerosol small mode mixing ratio
+kg kg**-1
+diagnostic 2D
+......................
+048
+AERLG
+Aerosol large mode mixing ratio
+kg kg**-1
+diagnostic 2D
+......................
+049
+AODPR
+Aerosol precursor optical depth
+dimensionless
+diagnostic 2D
+......................
+050
+AODSM
+Aerosol small mode optical depth
+dimensionless
+diagnostic 2D
+......................
+051
+AODLG
+Aerosol large mode optical depth
+dimensionless
+diagnostic 2D
+......................
+061
+CO2
+Carbon Dioxide
+kg kg**-1
+prognostic 3D
+......................
+062
+CH4
+Methane
+kg kg**-1
+prognostic 3D
+......................
+063
+N2O
+Nitrous oxide
+kg kg**-1
+prognostic 3D
+......................
+121
+NO2
+Nitrogen dioxide
+kg kg**-1
+prognostic 3D
+......................
+122
+SO2
+Sulphur dioxide
+kg kg**-1
+prognostic 3D
+......................
+123
+CO
+Carbon monoxide
+kg kg**-1
+prognostic 3D
+......................
+124
+HCHO
+Formaldehyde
+kg kg**-1
+prognostic 3D
+......................
+203
+GO3
+GEMS Ozone
+kg kg**-1
+prognostic 3D
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_220 b/gribtables/local_table_2_version_220
new file mode 100755
index 0000000..f79cabb
--- /dev/null
+++ b/gribtables/local_table_2_version_220
@@ -0,0 +1,12 @@
+ECMWF local table 2: Version Number 220 (Observation count).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+228
+TPOC
+Total precipitacion observation count
+dimensionless
+-
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_228 b/gribtables/local_table_2_version_228
new file mode 100755
index 0000000..5437c8b
--- /dev/null
+++ b/gribtables/local_table_2_version_228
@@ -0,0 +1,84 @@
+ECMWF local table 2: Version Number 228 (Standard 2).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+001
+CIN
+Convective inhibition
+J kg**-1
+-
+......................
+002
+OROG
+Orography
+m
+-
+......................
+003
+ZUST
+Friction velocity
+m s**-1
+-
+......................
+039
+SM
+Soil Moisture
+kg m**-3
+-
+......................
+131
+U10N
+Neutral wind at 10 m x-component
+m s**-1
+Neutral wind at 10 m x-component
+......................
+132
+V10N
+Neutral wind at 10 m y-component
+m s**-1
+-
+......................
+139
+ST
+Soil Temperature
+K
+-
+......................
+141
+SD
+Snow Depth water equivalent
+m
+-
+......................
+144
+SF
+Snow Fall water equivalent
+kg m**-2
+Accumulated field
+......................
+164
+TCC
+Total Cloud Cover
+%
+-
+......................
+170
+CAP
+Field capacity
+kg m**-3
+-
+......................
+171
+WILT
+Wilting point
+kg m**-3
+-
+......................
+228
+TP
+Total Precipitation
+kg m**-2
+Accumulated field
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_230 b/gribtables/local_table_2_version_230
new file mode 100755
index 0000000..69785e7
--- /dev/null
+++ b/gribtables/local_table_2_version_230
@@ -0,0 +1,192 @@
+ECMWF local table 2: Version Number 230 (Parameters on coarse grid for variable resolution systems).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+044
+ESVAR
+Snow evaporation (variable resolution)
+m of water
+Accumulated field Interpolated from previous leg
+......................
+045
+SMLTVAR
+Snowmelt (variable resolution)
+m of water
+Accumulated field Interpolated from previous leg
+......................
+046
+SDURVAR
+Solar duration (variable resolution)
+s
+ Interpolated from previous leg
+......................
+057
+UVBVAR
+Downward UV radiation at the surface (variable resolution)
+w m**-2 s
+Ultra-violet band B. Accumulated field. Interpolated from previous leg
+......................
+058
+PARVAR
+Photosynthetically active radiation at the surface (variable resolution)
+w m**-2 s
+Accumulated field. Interpolated from previous leg
+......................
+142
+LSPVAR
+Stratiform precipitation (Large-scale precipitation) (variable resolution)
+m
+Accumulated field Interpolated from previous leg
+......................
+143
+CPVAR
+Convective precipitation (variable resolution)
+m
+Accumulated field Interpolated from previous leg
+......................
+144
+SFVAR
+Snowfall (convective + stratiform) (variable resolution)
+m of water equivalent
+Accumulated field Interpolated from previous leg
+......................
+145
+BLDVAR
+Boundary layer dissipation (variable resolution)
+W m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+146
+SSHFVAR
+Surface sensible heat flux (variable resolution)
+W m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+147
+SLHFVAR
+Surface latent heat flux (variable resolution)
+W m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+169
+SSRDVAR
+Surface solar radiation downwards (variable resolution)
+W m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+175
+STRDVAR
+Surface thermal radiation downwards (variable resolution)
+W m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+176
+SSRVAR
+Surface solar radiation (variable resolution)
+W m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+177
+STRVAR
+Surface thermal radiation (variable resolution)
+W m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+178
+TSRVAR
+Top solar radiation (variable resolution)
+W m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+179
+TTRVAR
+Top thermal radiation (variable resolution)
+W m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+180
+EWSSVAR
+East-West surface stress (variable resolution)
+N m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+181
+NSSSVAR
+North-South surface stress (variable resolution)
+N m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+182
+EVAR
+Evaporation (variable resolution)
+m of water
+Accumulated field Interpolated from previous leg
+......................
+189
+SUNDVAR
+Sunshine duration (variable resolution)
+s
+Accumulated field Interpolated from previous leg
+......................
+195
+LGWSVAR
+Latitudinal component of gravity wave stress (variable resolution)
+N m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+196
+MGWSVAR
+Meridional component of gravity wave stress (variable resolution)
+N m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+197
+GWDVAR
+Gravity wave dissipation (variable resolution)
+W m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+198
+SRCVAR
+Skin reservoir content (variable resolution)
+m of water
+ Interpolated from previous leg
+......................
+205
+ROVAR
+Runoff (variable resolution)
+m
+Accumulated field Interpolated from previous leg
+......................
+208
+TSRCVAR
+Top net solar radiation, clear sky (variable resolution)
+W m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+209
+TTRCVAR
+Top net thermal radiation, clear sky (variable resolution)
+W m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+210
+SSRCVAR
+Surface net solar radiation, clear sky (variable resolution)
+W m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+211
+STRCVAR
+Surface net thermal radiation, clear sky (variable resolution)
+W m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+212
+TISRVAR
+TOA incident solar radiation (variable resolution)
+W m**-2 s
+Accumulated field Interpolated from previous leg
+......................
+999
+.
+.
diff --git a/gribtables/local_table_2_version_234 b/gribtables/local_table_2_version_234
new file mode 100755
index 0000000..bd238ec
--- /dev/null
+++ b/gribtables/local_table_2_version_234
@@ -0,0 +1,30 @@
+ECMWF local table 2: Version Number 234 (Significance).
+Codes and data units for FM 92-VIII Ext.GRIB.
+......................
+139
+STS
+Surface temperature significance
+percentage
+-
+......................
+151
+MSLS
+Mean sea level pressure significance
+percentage
+-
+......................
+167
+2TS
+2 metre temperature significance
+percentage
+-
+......................
+228
+TPS
+Total precipitation significance
+percentage
+-
+......................
+999
+.
+.
diff --git a/gribtables/mars2netcdf.cfg b/gribtables/mars2netcdf.cfg
new file mode 100755
index 0000000..c7f2c87
--- /dev/null
+++ b/gribtables/mars2netcdf.cfg
@@ -0,0 +1,1906 @@
+info,table2=128,name=param,value=1,data=strf,short_name='STRF',long_name='Stream function',unit='m**2 s**-1'
+info,table2=128,name=param,value=2,data=vpot,short_name='VPOT',long_name='Velocity potential',unit='m**2 s**-1'
+info,table2=128,name=param,value=3,data=pt,short_name='PT',long_name='Potential temperature',unit='K'
+info,table2=128,name=param,value=4,data=eqpt,short_name='EQPT',long_name='Equivalent potential temperature',unit='K'
+info,table2=128,name=param,value=5,data=sept,short_name='SEPT',long_name='Saturated equivalent potential temperature',unit='K'
+info,table2=128,name=param,value=6,data=ssfr,short_name='SSFR',long_name='Soil sand fraction',unit='(0 - 1)'
+info,table2=128,name=param,value=7,data=scfr,short_name='SCFR',long_name='Soil clay fraction',unit='(0 - 1)'
+info,table2=128,name=param,value=8,data=sro,short_name='SRO',long_name='Surface runoff',unit='m'
+info,table2=128,name=param,value=9,data=ssro,short_name='SSRO',long_name='Sub-surface runoff',unit='m'
+info,table2=128,name=param,value=10,data=wind,short_name='WIND',long_name='Wind speed',unit='m s**-1'
+info,table2=128,name=param,value=11,data=udvw,short_name='UDVW',long_name='U component of divergent wind',unit='m s**-1'
+info,table2=128,name=param,value=12,data=vdvw,short_name='VDVW',long_name='V component of divergent wind',unit='m s**-1'
+info,table2=128,name=param,value=13,data=urtw,short_name='URTW',long_name='U component of rotational wind',unit='m s**-1'
+info,table2=128,name=param,value=14,data=vrtw,short_name='VRTW',long_name='V component of rotational wind',unit='m s**-1'
+info,table2=128,name=param,value=15,data=aluvp,short_name='ALUVP',long_name='UV visible albedo for direct radiation',unit='(0 - 1)'
+info,table2=128,name=param,value=16,data=aluvd,short_name='ALUVD',long_name='UV visible albedo for diffuse radiation',unit='(0 - 1)'
+info,table2=128,name=param,value=17,data=alnip,short_name='ALNIP',long_name='Near IR albedo for direct radiation',unit='(0 - 1)'
+info,table2=128,name=param,value=18,data=alnid,short_name='ALNID',long_name='Near IR albedo for diffuse radiation',unit='(0 - 1)'
+info,table2=128,name=param,value=19,data=uvcs,short_name='UVCS',long_name='Clear sky surface UV',unit='W m**-2 s'
+info,table2=128,name=param,value=20,data=parcs,short_name='PARCS',long_name='Clear sky surface photosynthetically active radiation',unit='W m**-2 s'
+info,table2=128,name=param,value=21,data=uctp,short_name='UCTP',long_name='Unbalanced component of temperature',unit='K'
+info,table2=128,name=param,value=22,data=ucln,short_name='UCLN',long_name='Unbalanced component of logarithm of surface pressure',unit='-'
+info,table2=128,name=param,value=23,data=ucdv,short_name='UCDV',long_name='Unbalanced component of divergence',unit='s**-1'
+info,table2=128,name=param,value=24,data=24.128,short_name='None',long_name='Reserved for future unbalanced components',unit='-'
+info,table2=128,name=param,value=25,data=25.128,short_name='None',long_name='Reserved for future unbalanced components',unit='-'
+info,table2=128,name=param,value=26,data=cl,short_name='CL',long_name='Lake cover',unit='(0 - 1)'
+info,table2=128,name=param,value=27,data=cvl,short_name='CVL',long_name='Low vegetation cover',unit='(0 - 1)'
+info,table2=128,name=param,value=28,data=cvh,short_name='CVH',long_name='High vegetation cover',unit='(0 - 1)'
+info,table2=128,name=param,value=29,data=tvl,short_name='TVL',long_name='Type of low vegetation',unit='-'
+info,table2=128,name=param,value=30,data=tvh,short_name='TVH',long_name='Type of high vegetation',unit='-'
+info,table2=128,name=param,value=31,data=ci,short_name='CI',long_name='Sea-ice cover',unit='(0 - 1)'
+info,table2=128,name=param,value=32,data=asn,short_name='ASN',long_name='Snow albedo',unit='(0 - 1)'
+info,table2=128,name=param,value=33,data=rsn,short_name='RSN',long_name='Snow density',unit='kg m**-3'
+info,table2=128,name=param,value=34,data=sstk,short_name='SSTK',long_name='Sea surface temperature',unit='K'
+info,table2=128,name=param,value=35,data=istl1,short_name='ISTL1',long_name='Ice surface temperature layer 1',unit='K'
+info,table2=128,name=param,value=36,data=istl2,short_name='ISTL2',long_name='Ice surface temperature layer 2',unit='K'
+info,table2=128,name=param,value=37,data=istl3,short_name='ISTL3',long_name='Ice surface temperature layer 3',unit='K'
+info,table2=128,name=param,value=38,data=istl4,short_name='ISTL4',long_name='Ice surface temperature layer 4',unit='K'
+info,table2=128,name=param,value=39,data=swvl1,short_name='SWVL1',long_name='Volumetric soil water layer 1',unit='m**3 m**-3'
+info,table2=128,name=param,value=40,data=swvl2,short_name='SWVL2',long_name='Volumetric soil water layer 2',unit='m**3 m**-3'
+info,table2=128,name=param,value=41,data=swvl3,short_name='SWVL3',long_name='Volumetric soil water layer 3',unit='m**3 m**-3'
+info,table2=128,name=param,value=42,data=swvl4,short_name='SWVL4',long_name='Volumetric soil water layer 4',unit='m**3 m**-3'
+info,table2=128,name=param,value=43,data=slt,short_name='SLT',long_name='Soil type',unit='-'
+info,table2=128,name=param,value=44,data=es,short_name='ES',long_name='Snow evaporation',unit='m of water'
+info,table2=128,name=param,value=45,data=smlt,short_name='SMLT',long_name='Snowmelt',unit='m of water'
+info,table2=128,name=param,value=46,data=sdur,short_name='SDUR',long_name='Solar duration',unit='s'
+info,table2=128,name=param,value=47,data=dsrp,short_name='DSRP',long_name='Direct solar radiation',unit='w m**-2'
+info,table2=128,name=param,value=48,data=magss,short_name='MAGSS',long_name='Magnitude of surface stress',unit='N m**-2 s'
+info,table2=128,name=param,value=49,data=10fg,short_name='10FG',long_name='10 metre wind gust',unit='m s**-1'
+info,table2=128,name=param,value=50,data=lspf,short_name='LSPF',long_name='Large-scale precipitation fraction',unit='s'
+info,table2=128,name=param,value=51,data=mx2t24,short_name='MX2T24',long_name='Maximum temperature at 2 metres since last 24 hours',unit='K'
+info,table2=128,name=param,value=52,data=mn2t24,short_name='MN2T24',long_name='Minimum temperature at 2 metres since last 24 hours',unit='K'
+info,table2=128,name=param,value=53,data=mont,short_name='MONT',long_name='Montgomery potential',unit='m**2 s**-2'
+info,table2=128,name=param,value=54,data=pres,short_name='PRES',long_name='Pressure',unit='Pa'
+info,table2=128,name=param,value=55,data=mean2t24,short_name='MEAN2T24',long_name='Mean temperature at 2 metres since last 24 hours',unit='K'
+info,table2=128,name=param,value=56,data=mn2d24,short_name='MN2D24',long_name='Mean 2 metre dewpoint temperature in past 24 hours',unit='K'
+info,table2=128,name=param,value=57,data=uvb,short_name='UVB',long_name='Downward UV radiation at the surface',unit='w m**-2 s'
+info,table2=128,name=param,value=58,data=par,short_name='PAR',long_name='Photosynthetically active radiation at the surface',unit='w m**-2 s'
+info,table2=128,name=param,value=59,data=cape,short_name='CAPE',long_name='Convective available potential energy',unit='J kg**-1'
+info,table2=128,name=param,value=60,data=pv,short_name='PV',long_name='Potential vorticity',unit='K m**2 kg**-1 s**-1'
+info,table2=128,name=param,value=61,data=tpo,short_name='TPO',long_name='Total precipitation from observations',unit='Millimetres*100 + number of stations'
+info,table2=128,name=param,value=62,data=obct,short_name='OBCT',long_name='Observation count',unit='-'
+info,table2=128,name=param,value=63,data=63.128,short_name='None',long_name='Start time for skin temperature difference',unit='s'
+info,table2=128,name=param,value=64,data=64.128,short_name='None',long_name='Finish time for skin temperature difference',unit='s'
+info,table2=128,name=param,value=65,data=65.128,short_name='None',long_name='Skin temperature difference',unit='K'
+info,table2=128,name=param,value=66,data=66.128,short_name='None',long_name='Leaf area index, low vegetation',unit='m**2 / m**2'
+info,table2=128,name=param,value=67,data=67.128,short_name='None',long_name='Leaf area index, high vegetation',unit='m**2 / m**2'
+info,table2=128,name=param,value=68,data=68.128,short_name='None',long_name='Minimum stomatal resistance, low vegetation',unit='s m**-1'
+info,table2=128,name=param,value=69,data=69.128,short_name='None',long_name='Minimum stomatal resistance, high vegetation',unit='s m**-1'
+info,table2=128,name=param,value=70,data=70.128,short_name='None',long_name='Biome cover, low vegetation',unit='(0 - 1)'
+info,table2=128,name=param,value=71,data=71.128,short_name='None',long_name='Biome cover, high vegetation',unit='(0 - 1)'
+info,table2=128,name=param,value=72,data=issrd,short_name='ISSRD',long_name='Instantaneous surface solar radiation downwards',unit='w m**-2'
+info,table2=128,name=param,value=73,data=istrd,short_name='ISTRD',long_name='Instantaneous surface thermal radiation downwards',unit='w m**-2'
+info,table2=128,name=param,value=74,data=sdfor,short_name='SDFOR',long_name='Standard deviation of filtered subgrid orography',unit='m'
+info,table2=128,name=param,value=77,data=etadot,short_name='ETADOT',long_name='Vertical velocity in the hybrid eta vertical coordinate system',unit='s**-1'
+info,table2=128,name=param,value=78,data=tclw,short_name='TCLW',long_name='Total column liquid water',unit='kg m**-2'
+info,table2=128,name=param,value=79,data=tciw,short_name='TCIW',long_name='Total column ice water',unit='kg m**-2'
+info,table2=128,name=param,value=80,data=80.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=81,data=81.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=82,data=82.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=83,data=83.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=84,data=84.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=85,data=85.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=86,data=86.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=87,data=87.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=88,data=88.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=89,data=89.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=90,data=90.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=91,data=91.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=92,data=92.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=93,data=93.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=94,data=94.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=95,data=95.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=96,data=96.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=97,data=97.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=98,data=98.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=99,data=99.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=100,data=100.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=101,data=101.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=102,data=102.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=103,data=103.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=104,data=104.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=105,data=105.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=106,data=106.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=107,data=107.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=108,data=108.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=109,data=109.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=110,data=110.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=111,data=111.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=112,data=112.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=113,data=113.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=114,data=114.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=115,data=115.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=116,data=116.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=117,data=117.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=118,data=118.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=119,data=119.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=120,data=120.128,short_name='None',long_name='Experimental product',unit='-'
+info,table2=128,name=param,value=121,data=mx2t6,short_name='MX2T6',long_name='Maximum temperature at 2 metres since last 6 hours',unit='K'
+info,table2=128,name=param,value=122,data=mn2t6,short_name='MN2T6',long_name='Minimum temperature at 2 metres since last 6 hours',unit='K'
+info,table2=128,name=param,value=123,data=10fg6,short_name='10FG6',long_name='10 metre wind gust in the past 6 hours',unit='m s**-1'
+info,table2=128,name=param,value=124,data=emis,short_name='EMIS',long_name='Surface emissivity',unit='dimensionless'
+info,table2=128,name=param,value=125,data=125.128,short_name='None',long_name='Vertically integrated total energy',unit='J m**-2'
+info,table2=128,name=param,value=126,data=126.128,short_name='None',long_name='Generic parameter for sensitive area prediction',unit='Various'
+info,table2=128,name=param,value=127,data=at,short_name='AT',long_name='Atmospheric tide',unit='-'
+info,table2=128,name=param,value=128,data=bv,short_name='BV',long_name='Budget values',unit='-'
+info,table2=128,name=param,value=129,data=z,short_name='Z',long_name='Geopotential',unit='m**2 s**-2'
+info,table2=128,name=param,value=130,data=t,short_name='T',long_name='Temperature',unit='K'
+info,table2=128,name=param,value=131,data=u,short_name='U',long_name='U velocity',unit='m s**-1'
+info,table2=128,name=param,value=132,data=v,short_name='V',long_name='V velocity',unit='m s**-1'
+info,table2=128,name=param,value=133,data=q,short_name='Q',long_name='Specific humidity',unit='kg kg**-1'
+info,table2=128,name=param,value=134,data=sp,short_name='SP',long_name='Surface pressure',unit='Pa'
+info,table2=128,name=param,value=135,data=w,short_name='W',long_name='Vertical velocity',unit='Pa s**-1'
+info,table2=128,name=param,value=136,data=tcw,short_name='TCW',long_name='Total column water',unit='kg m**-2'
+info,table2=128,name=param,value=137,data=tcwv,short_name='TCWV',long_name='Total column water vapour',unit='kg m**-2'
+info,table2=128,name=param,value=138,data=vo,short_name='VO',long_name='Vorticity (relative)',unit='s**-1'
+info,table2=128,name=param,value=139,data=stl1,short_name='STL1',long_name='Soil temperature level 1',unit='K'
+info,table2=128,name=param,value=140,data=swl1,short_name='SWL1',long_name='Soil wetness level 1',unit='m of water'
+info,table2=128,name=param,value=141,data=sd,short_name='SD',long_name='Snow depth',unit='m of water equivalent'
+info,table2=128,name=param,value=142,data=lsp,short_name='LSP',long_name='Stratiform precipitation (Large-scale precipitation)',unit='m'
+info,table2=128,name=param,value=143,data=cp,short_name='CP',long_name='Convective precipitation',unit='m'
+info,table2=128,name=param,value=144,data=sf,short_name='SF',long_name='Snowfall',unit='m of water equivalent'
+info,table2=128,name=param,value=145,data=bld,short_name='BLD',long_name='Boundary layer dissipation',unit='W m**-2 s'
+info,table2=128,name=param,value=146,data=sshf,short_name='SSHF',long_name='Surface sensible heat flux',unit='W m**-2 s'
+info,table2=128,name=param,value=147,data=slhf,short_name='SLHF',long_name='Surface latent heat flux',unit='W m**-2 s'
+info,table2=128,name=param,value=148,data=chnk,short_name='CHNK',long_name='Charnock',unit='-'
+info,table2=128,name=param,value=149,data=snr,short_name='SNR',long_name='Surface net radiation',unit='W m**-2 s'
+info,table2=128,name=param,value=150,data=tnr,short_name='TNR',long_name='Top net radiation',unit='-'
+info,table2=128,name=param,value=151,data=msl,short_name='MSL',long_name='Mean sea level pressure',unit='Pa'
+info,table2=128,name=param,value=152,data=lnsp,short_name='LNSP',long_name='Logarithm of surface pressure',unit='-'
+info,table2=128,name=param,value=153,data=swhr,short_name='SWHR',long_name='Short-wave heating rate',unit='K'
+info,table2=128,name=param,value=154,data=lwhr,short_name='LWHR',long_name='Long-wave heating rate',unit='K'
+info,table2=128,name=param,value=155,data=d,short_name='D',long_name='Divergence',unit='s**-1'
+info,table2=128,name=param,value=156,data=gh,short_name='GH',long_name='Gepotential Height',unit='gpm'
+info,table2=128,name=param,value=157,data=r,short_name='R',long_name='Relative humidity',unit='%'
+info,table2=128,name=param,value=158,data=tsp,short_name='TSP',long_name='Tendency of surface pressure',unit='Pa s**-1'
+info,table2=128,name=param,value=159,data=blh,short_name='BLH',long_name='Boundary layer height',unit='m'
+info,table2=128,name=param,value=160,data=sdor,short_name='SDOR',long_name='Standard deviation of orography',unit='-'
+info,table2=128,name=param,value=161,data=isor,short_name='ISOR',long_name='Anisotropy of sub-gridscale orography',unit='-'
+info,table2=128,name=param,value=162,data=anor,short_name='ANOR',long_name='Angle of sub-gridscale orography',unit='rad'
+info,table2=128,name=param,value=163,data=slor,short_name='SLOR',long_name='Slope of sub-gridscale orography',unit='-'
+info,table2=128,name=param,value=164,data=tcc,short_name='TCC',long_name='Total cloud cover',unit='(0 - 1)'
+info,table2=128,name=param,value=165,data=10u,short_name='10U',long_name='10 metre U wind component',unit='m s**-1'
+info,table2=128,name=param,value=166,data=10v,short_name='10V',long_name='10 metre V wind component',unit='m s**-1'
+info,table2=128,name=param,value=167,data=2t,short_name='2T',long_name='2 metre temperature',unit='K'
+info,table2=128,name=param,value=168,data=2d,short_name='2D',long_name='2 metre dewpoint temperature',unit='K'
+info,table2=128,name=param,value=169,data=ssrd,short_name='SSRD',long_name='Surface solar radiation downwards',unit='W m**-2 s'
+info,table2=128,name=param,value=170,data=stl2,short_name='STL2',long_name='Soil temperature level 2',unit='K'
+info,table2=128,name=param,value=171,data=swl2,short_name='SWL2',long_name='Soil wetness level 2',unit='m of water'
+info,table2=128,name=param,value=172,data=lsm,short_name='LSM',long_name='Land-sea mask',unit='(0 - 1)'
+info,table2=128,name=param,value=173,data=sr,short_name='SR',long_name='Surface roughness',unit='m'
+info,table2=128,name=param,value=174,data=al,short_name='AL',long_name='Albedo',unit='(0 - 1)'
+info,table2=128,name=param,value=175,data=strd,short_name='STRD',long_name='Surface thermal radiation downwards',unit='W m**-2 s'
+info,table2=128,name=param,value=176,data=ssr,short_name='SSR',long_name='Surface solar radiation',unit='W m**-2 s'
+info,table2=128,name=param,value=177,data=str,short_name='STR',long_name='Surface thermal radiation',unit='W m**-2 s'
+info,table2=128,name=param,value=178,data=tsr,short_name='TSR',long_name='Top solar radiation',unit='W m**-2 s'
+info,table2=128,name=param,value=179,data=ttr,short_name='TTR',long_name='Top thermal radiation',unit='W m**-2 s'
+info,table2=128,name=param,value=180,data=ewss,short_name='EWSS',long_name='East-West surface stress',unit='N m**-2 s'
+info,table2=128,name=param,value=181,data=nsss,short_name='NSSS',long_name='North-South surface stress',unit='N m**-2 s'
+info,table2=128,name=param,value=182,data=e,short_name='E',long_name='Evaporation',unit='m of water'
+info,table2=128,name=param,value=183,data=stl3,short_name='STL3',long_name='Soil temperature level 3',unit='K'
+info,table2=128,name=param,value=184,data=swl3,short_name='SWL3',long_name='Soil wetness level 3',unit='m of water'
+info,table2=128,name=param,value=185,data=ccc,short_name='CCC',long_name='Convective cloud cover',unit='(0 - 1)'
+info,table2=128,name=param,value=186,data=lcc,short_name='LCC',long_name='Low cloud cover',unit='(0 - 1)'
+info,table2=128,name=param,value=187,data=mcc,short_name='MCC',long_name='Medium cloud cover',unit='(0 - 1)'
+info,table2=128,name=param,value=188,data=hcc,short_name='HCC',long_name='High cloud cover',unit='(0 - 1)'
+info,table2=128,name=param,value=189,data=sund,short_name='SUND',long_name='Sunshine duration',unit='s'
+info,table2=128,name=param,value=190,data=ewov,short_name='EWOV',long_name='East-West component of sub-gridscale orographic variance',unit='m**2'
+info,table2=128,name=param,value=191,data=nsov,short_name='NSOV',long_name='North-South component of sub-gridscale orographic variance',unit='m**2'
+info,table2=128,name=param,value=192,data=nwov,short_name='NWOV',long_name='North-West/South-East component of sub-gridscale orographic variance',unit='m**2'
+info,table2=128,name=param,value=193,data=neov,short_name='NEOV',long_name='North-East/South-West component of sub-gridscale orographic variance',unit='m**2'
+info,table2=128,name=param,value=194,data=btmp,short_name='BTMP',long_name='Brightness temperature',unit='K'
+info,table2=128,name=param,value=195,data=lgws,short_name='LGWS',long_name='Latitudinal component of gravity wave stress',unit='N m**-2 s'
+info,table2=128,name=param,value=196,data=mgws,short_name='MGWS',long_name='Meridional component of gravity wave stress',unit='N m**-2 s'
+info,table2=128,name=param,value=197,data=gwd,short_name='GWD',long_name='Gravity wave dissipation',unit='W m**-2 s'
+info,table2=128,name=param,value=198,data=src,short_name='SRC',long_name='Skin reservoir content',unit='m of water'
+info,table2=128,name=param,value=199,data=veg,short_name='VEG',long_name='Vegetation fraction',unit='(0 - 1)'
+info,table2=128,name=param,value=200,data=vso,short_name='VSO',long_name='Variance of sub-gridscale orography',unit='m**2'
+info,table2=128,name=param,value=201,data=mx2t,short_name='MX2T',long_name='Maximum temperature at 2 metres since previous post-processing',unit='K'
+info,table2=128,name=param,value=202,data=mn2t,short_name='MN2T',long_name='Minimum temperature at 2 metres since previous post-processing',unit='K'
+info,table2=128,name=param,value=203,data=o3,short_name='O3',long_name='Ozone mass mixing ratio',unit='kg kg**-1'
+info,table2=128,name=param,value=204,data=paw,short_name='PAW',long_name='Precipitation analysis weights',unit='-'
+info,table2=128,name=param,value=205,data=ro,short_name='RO',long_name='Runoff',unit='m'
+info,table2=128,name=param,value=206,data=tco3,short_name='TCO3',long_name='Total column ozone',unit='kg m**-2'
+info,table2=128,name=param,value=207,data=10si,short_name='10SI',long_name='10 metre wind speed',unit='m s**-1'
+info,table2=128,name=param,value=208,data=tsrc,short_name='TSRC',long_name='Top net solar radiation, clear sky',unit='W m**-2 s'
+info,table2=128,name=param,value=209,data=ttrc,short_name='TTRC',long_name='Top net thermal radiation, clear sky',unit='W m**-2 s'
+info,table2=128,name=param,value=210,data=ssrc,short_name='SSRC',long_name='Surface net solar radiation, clear sky',unit='W m**-2 s'
+info,table2=128,name=param,value=211,data=strc,short_name='STRC',long_name='Surface net thermal radiation, clear sky',unit='W m**-2 s'
+info,table2=128,name=param,value=212,data=tisr,short_name='TISR',long_name='TOA incident solar radiation',unit='W m**-2 s'
+info,table2=128,name=param,value=213,data=vimd,short_name='VIMD',long_name='Vertically integrated moisture divergence',unit='kg m**-2'
+info,table2=128,name=param,value=214,data=dhr,short_name='DHR',long_name='Diabatic heating by radiation',unit='K'
+info,table2=128,name=param,value=215,data=dhvd,short_name='DHVD',long_name='Diabatic heating by vertical diffusion',unit='K'
+info,table2=128,name=param,value=216,data=dhcc,short_name='DHCC',long_name='Diabatic heating by cumulus convection',unit='K'
+info,table2=128,name=param,value=217,data=dhlc,short_name='DHLC',long_name='Diabatic heating large-scale condensation',unit='K'
+info,table2=128,name=param,value=218,data=vdzw,short_name='VDZW',long_name='Vertical diffusion of zonal wind',unit='m s**-1'
+info,table2=128,name=param,value=219,data=vdmw,short_name='VDMW',long_name='Vertical diffusion of meridional wind',unit='m s**-1'
+info,table2=128,name=param,value=220,data=ewgd,short_name='EWGD',long_name='East-West gravity wave drag tendency',unit='m s**-1'
+info,table2=128,name=param,value=221,data=nsgd,short_name='NSGD',long_name='North-South gravity wave drag tendency',unit='m s**-1'
+info,table2=128,name=param,value=222,data=ctzw,short_name='CTZW',long_name='Convective tendency of zonal wind',unit='m s**-1'
+info,table2=128,name=param,value=223,data=ctmw,short_name='CTMW',long_name='Convective tendency of meridional wind',unit='m s**-1'
+info,table2=128,name=param,value=224,data=vdh,short_name='VDH',long_name='Vertical diffusion of humidity',unit='kg kg**-1'
+info,table2=128,name=param,value=225,data=htcc,short_name='HTCC',long_name='Humidity tendency by cumulus convection',unit='kg kg**-1'
+info,table2=128,name=param,value=226,data=htlc,short_name='HTLC',long_name='Humidity tendency by large-scale condensation',unit='kg kg**-1'
+info,table2=128,name=param,value=227,data=crnh,short_name='CRNH',long_name='Change from removal of negative humidity',unit='kg kg**-1'
+info,table2=128,name=param,value=228,data=tp,short_name='TP',long_name='Total precipitation',unit='m'
+info,table2=128,name=param,value=229,data=iews,short_name='IEWS',long_name='Instantaneous X surface stress',unit='N m**-2'
+info,table2=128,name=param,value=230,data=inss,short_name='INSS',long_name='Instantaneous Y surface stress',unit='N m**-2'
+info,table2=128,name=param,value=231,data=ishf,short_name='ISHF',long_name='Instantaneous surface heat flux',unit='W m**-2'
+info,table2=128,name=param,value=232,data=ie,short_name='IE',long_name='Instantaneous moisture flux',unit='kg m**-2 s'
+info,table2=128,name=param,value=233,data=asq,short_name='ASQ',long_name='Apparent surface humidity',unit='kg kg**-1'
+info,table2=128,name=param,value=234,data=lsrh,short_name='LSRH',long_name='Logarithm of surface roughness length for heat',unit='-'
+info,table2=128,name=param,value=235,data=skt,short_name='SKT',long_name='Skin temperature',unit='K'
+info,table2=128,name=param,value=236,data=stl4,short_name='STL4',long_name='Soil temperature level 4',unit='K'
+info,table2=128,name=param,value=237,data=swl4,short_name='SWL4',long_name='Soil wetness level 4',unit='m'
+info,table2=128,name=param,value=238,data=tsn,short_name='TSN',long_name='Temperature of snow layer',unit='K'
+info,table2=128,name=param,value=239,data=csf,short_name='CSF',long_name='Convective snowfall',unit='m of water equivalent'
+info,table2=128,name=param,value=240,data=lsf,short_name='LSF',long_name='Large-scale snowfall',unit='m of water equivalent'
+info,table2=128,name=param,value=241,data=acf,short_name='ACF',long_name='Accumulated cloud fraction tendency',unit='(-1 to 1)'
+info,table2=128,name=param,value=242,data=alw,short_name='ALW',long_name='Accumulated liquid water tendency',unit='(-1 to 1)'
+info,table2=128,name=param,value=243,data=fal,short_name='FAL',long_name='Forecast albedo',unit='(0 - 1)'
+info,table2=128,name=param,value=244,data=fsr,short_name='FSR',long_name='Forecast surface roughness',unit='m'
+info,table2=128,name=param,value=245,data=flsr,short_name='FLSR',long_name='Forecast logarithm of surface roughness for heat',unit='-'
+info,table2=128,name=param,value=246,data=clwc,short_name='CLWC',long_name='Cloud liquid water content',unit='kg kg**-1'
+info,table2=128,name=param,value=247,data=ciwc,short_name='CIWC',long_name='Cloud ice water content',unit='kg kg**-1'
+info,table2=128,name=param,value=248,data=cc,short_name='CC',long_name='Cloud cover',unit='(0 - 1)'
+info,table2=128,name=param,value=249,data=aiw,short_name='AIW',long_name='Accumulated ice water tendency',unit='(-1 to 1)'
+info,table2=128,name=param,value=250,data=ice,short_name='ICE',long_name='Ice age',unit='(0 - 1)'
+info,table2=128,name=param,value=251,data=atte,short_name='ATTE',long_name='Adiabatic tendency of temperature',unit='K'
+info,table2=128,name=param,value=252,data=athe,short_name='ATHE',long_name='Adiabatic tendency of humidity',unit='kg kg**-1'
+info,table2=128,name=param,value=253,data=atze,short_name='ATZE',long_name='Adiabatic tendency of zonal wind',unit='m s**-1'
+info,table2=128,name=param,value=254,data=atmw,short_name='ATMW',long_name='Adiabatic tendency of meridional wind',unit='m s**-1'
+info,table2=128,name=param,value=255,data=255.128,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=129,name=param,value=1,data=strf,short_name='STRF',long_name='Stream function',unit='m**2 s**-1'
+info,table2=129,name=param,value=2,data=vpot,short_name='VPOT',long_name='Velocity potential',unit='m**2 s**-1'
+info,table2=129,name=param,value=3,data=pt,short_name='PT',long_name='Potential temperature',unit='K'
+info,table2=129,name=param,value=4,data=eqpt,short_name='EQPT',long_name='Equivalent potential temperature',unit='K'
+info,table2=129,name=param,value=5,data=sept,short_name='SEPT',long_name='Saturated equivalent potential temperature',unit='K'
+info,table2=129,name=param,value=11,data=udvw,short_name='UDVW',long_name='U component of divergent wind',unit='m s**-1'
+info,table2=129,name=param,value=12,data=vdvw,short_name='VDVW',long_name='V component of divergent wind',unit='m s**-1'
+info,table2=129,name=param,value=13,data=urtw,short_name='URTW',long_name='U component of rotational wind',unit='m s**-1'
+info,table2=129,name=param,value=14,data=vrtw,short_name='VRTW',long_name='V component of rotational wind',unit='m s**-1'
+info,table2=129,name=param,value=21,data=uctp,short_name='UCTP',long_name='Unbalanced component of temperature',unit='K'
+info,table2=129,name=param,value=22,data=ucln,short_name='UCLN',long_name='Unbalanced component of logarithm of surface pressure',unit='-'
+info,table2=129,name=param,value=23,data=ucdv,short_name='UCDV',long_name='Unbalanced component of divergence',unit='s**-1'
+info,table2=129,name=param,value=24,data=24.129,short_name='None',long_name='Reserved for future unbalanced components',unit='-'
+info,table2=129,name=param,value=25,data=25.129,short_name='None',long_name='Reserved for future unbalanced components',unit='-'
+info,table2=129,name=param,value=26,data=cl,short_name='CL',long_name='Lake cover',unit='(0 - 1)'
+info,table2=129,name=param,value=27,data=cvl,short_name='CVL',long_name='Low vegetation cover',unit='(0 - 1)'
+info,table2=129,name=param,value=28,data=cvh,short_name='CVH',long_name='High vegetation cover',unit='(0 - 1)'
+info,table2=129,name=param,value=29,data=tvl,short_name='TVL',long_name='Type of low vegetation',unit='-'
+info,table2=129,name=param,value=30,data=tvh,short_name='TVH',long_name='Type of high vegetation',unit='-'
+info,table2=129,name=param,value=31,data=ci,short_name='CI',long_name='Sea-ice cover',unit='(0 - 1)'
+info,table2=129,name=param,value=32,data=asn,short_name='ASN',long_name='Snow albedo',unit='(0 - 1)'
+info,table2=129,name=param,value=33,data=rsn,short_name='RSN',long_name='Snow density',unit='kg m**-3'
+info,table2=129,name=param,value=34,data=sstk,short_name='SSTK',long_name='Sea surface temperature',unit='K'
+info,table2=129,name=param,value=35,data=istl1,short_name='ISTL1',long_name='Ice surface temperature layer 1',unit='K'
+info,table2=129,name=param,value=36,data=istl2,short_name='ISTL2',long_name='Ice surface temperature layer 2',unit='K'
+info,table2=129,name=param,value=37,data=istl3,short_name='ISTL3',long_name='Ice surface temperature layer 3',unit='K'
+info,table2=129,name=param,value=38,data=istl4,short_name='ISTL4',long_name='Ice surface temperature layer 4',unit='K'
+info,table2=129,name=param,value=39,data=swvl1,short_name='SWVL1',long_name='Volumetric soil water layer 1',unit='m**3 m**-3'
+info,table2=129,name=param,value=40,data=swvl2,short_name='SWVL2',long_name='Volumetric soil water layer 2',unit='m**3 m**-3'
+info,table2=129,name=param,value=41,data=swvl3,short_name='SWVL3',long_name='Volumetric soil water layer 3',unit='m**3 m**-3'
+info,table2=129,name=param,value=42,data=swvl4,short_name='SWVL4',long_name='Volumetric soil water layer 4',unit='m**3 m**-3'
+info,table2=129,name=param,value=43,data=slt,short_name='SLT',long_name='Soil type',unit='-'
+info,table2=129,name=param,value=44,data=es,short_name='ES',long_name='Snow evaporation',unit='m of water'
+info,table2=129,name=param,value=45,data=smlt,short_name='SMLT',long_name='Snowmelt',unit='m of water'
+info,table2=129,name=param,value=46,data=sdur,short_name='SDUR',long_name='Solar duration',unit='s'
+info,table2=129,name=param,value=47,data=dsrp,short_name='DSRP',long_name='Direct solar radiation',unit='w m**-2'
+info,table2=129,name=param,value=48,data=magss,short_name='MAGSS',long_name='Magnitude of surface stress',unit='N m**-2 s'
+info,table2=129,name=param,value=49,data=10fg,short_name='10FG',long_name='10 metre wind gust',unit='m s**-1'
+info,table2=129,name=param,value=50,data=lspf,short_name='LSPF',long_name='Large-scale precipitation fraction',unit='s'
+info,table2=129,name=param,value=51,data=mx2t24,short_name='MX2T24',long_name='Maximum 2 metre temperature',unit='K'
+info,table2=129,name=param,value=52,data=mn2t24,short_name='MN2T24',long_name='Minimum 2 metre temperature',unit='K'
+info,table2=129,name=param,value=53,data=mont,short_name='MONT',long_name='Montgomery potential',unit='m**2 s**-2'
+info,table2=129,name=param,value=54,data=pres,short_name='PRES',long_name='Pressure',unit='Pa'
+info,table2=129,name=param,value=55,data=mean2t24,short_name='MEAN2T24',long_name='Mean 2 metre temperature in past 24 hours',unit='K'
+info,table2=129,name=param,value=56,data=mn2d24,short_name='MN2D24',long_name='Mean 2 metre dewpoint temperature in past 24 hours',unit='K'
+info,table2=129,name=param,value=57,data=uvb,short_name='UVB',long_name='Downward UV radiation at the surface',unit='w m**-2 s'
+info,table2=129,name=param,value=58,data=par,short_name='PAR',long_name='Photosynthetically active radiation at the surface',unit='w m**-2 s'
+info,table2=129,name=param,value=59,data=cape,short_name='CAPE',long_name='Convective available potential energy',unit='J kg**-1'
+info,table2=129,name=param,value=60,data=pv,short_name='PV',long_name='Potential vorticity',unit='K m**2 kg**-1 s**-1'
+info,table2=129,name=param,value=61,data=tpo,short_name='TPO',long_name='Total precipitation from observations',unit='Millimetres*100 + number of stations'
+info,table2=129,name=param,value=62,data=obct,short_name='OBCT',long_name='Observation count',unit='-'
+info,table2=129,name=param,value=63,data=63.129,short_name='None',long_name='Start time for skin temperature difference',unit='s'
+info,table2=129,name=param,value=64,data=64.129,short_name='None',long_name='Finish time for skin temperature difference',unit='s'
+info,table2=129,name=param,value=65,data=65.129,short_name='None',long_name='Skin temperature difference',unit='K'
+info,table2=129,name=param,value=66,data=66.129,short_name='None',long_name='Leaf area index, low vegetation',unit='m**2 / m**2'
+info,table2=129,name=param,value=67,data=67.129,short_name='None',long_name='Leaf area index, high vegetation',unit='m**2 / m**2'
+info,table2=129,name=param,value=68,data=68.129,short_name='None',long_name='Minimum stomatal resistance, low vegetation',unit='s m**-1'
+info,table2=129,name=param,value=69,data=69.129,short_name='None',long_name='Minimum stomatal resistance, high vegetation',unit='s m**-1'
+info,table2=129,name=param,value=70,data=70.129,short_name='None',long_name='Biome cover, low vegetation',unit='(0 - 1)'
+info,table2=129,name=param,value=71,data=71.129,short_name='None',long_name='Biome cover, high vegetation',unit='(0 - 1)'
+info,table2=129,name=param,value=78,data=78.129,short_name='None',long_name='Total column liquid water',unit='kg m**-2'
+info,table2=129,name=param,value=79,data=79.129,short_name='None',long_name='Total column ice water',unit='kg m**-2'
+info,table2=129,name=param,value=80,data=80.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=81,data=81.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=82,data=82.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=83,data=83.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=84,data=84.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=85,data=85.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=86,data=86.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=87,data=87.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=88,data=88.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=89,data=89.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=90,data=90.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=91,data=91.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=92,data=92.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=93,data=93.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=94,data=94.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=95,data=95.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=96,data=96.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=97,data=97.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=98,data=98.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=99,data=99.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=100,data=100.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=101,data=101.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=102,data=102.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=103,data=103.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=104,data=104.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=105,data=105.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=106,data=106.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=107,data=107.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=108,data=108.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=109,data=109.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=110,data=110.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=111,data=111.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=112,data=112.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=113,data=113.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=114,data=114.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=115,data=115.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=116,data=116.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=117,data=117.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=118,data=118.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=119,data=119.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=120,data=120.129,short_name='None',long_name='Experimental product',unit='-'
+info,table2=129,name=param,value=121,data=mx2t6,short_name='MX2T6',long_name='Maximum temperature at 2 metres',unit='K'
+info,table2=129,name=param,value=122,data=mn2t6,short_name='MN2T6',long_name='Minimum temperature at 2 metres',unit='K'
+info,table2=129,name=param,value=123,data=10fg6,short_name='10FG6',long_name='10 metre wind gust in the past 6 hours',unit='m s**-1'
+info,table2=129,name=param,value=125,data=125.129,short_name='None',long_name='Vertically integrated total energy',unit='J m**-2'
+info,table2=129,name=param,value=126,data=126.129,short_name='None',long_name='Generic parameter for sensitive area prediction',unit='Various'
+info,table2=129,name=param,value=127,data=at,short_name='AT',long_name='Atmospheric tide',unit='-'
+info,table2=129,name=param,value=128,data=bv,short_name='BV',long_name='Budget values',unit='-'
+info,table2=129,name=param,value=129,data=z,short_name='Z',long_name='Geopotential',unit='m**2 s**-2'
+info,table2=129,name=param,value=130,data=t,short_name='T',long_name='Temperature',unit='K'
+info,table2=129,name=param,value=131,data=u,short_name='U',long_name='U velocity',unit='m s**-1'
+info,table2=129,name=param,value=132,data=v,short_name='V',long_name='V velocity',unit='m s**-1'
+info,table2=129,name=param,value=133,data=q,short_name='Q',long_name='Specific humidity',unit='kg kg**-1'
+info,table2=129,name=param,value=134,data=sp,short_name='SP',long_name='Surface pressure',unit='Pa'
+info,table2=129,name=param,value=135,data=w,short_name='W',long_name='Vertical velocity',unit='Pa s**-1'
+info,table2=129,name=param,value=136,data=tcw,short_name='TCW',long_name='Total column water',unit='kg m**-2'
+info,table2=129,name=param,value=137,data=tcwv,short_name='TCWV',long_name='Total column water vapour',unit='kg m**-2'
+info,table2=129,name=param,value=138,data=vo,short_name='VO',long_name='Vorticity (relative)',unit='s**-1'
+info,table2=129,name=param,value=139,data=stl1,short_name='STL1',long_name='Soil temperature level 1',unit='K'
+info,table2=129,name=param,value=140,data=swl1,short_name='SWL1',long_name='Soil wetness level 1',unit='m of water'
+info,table2=129,name=param,value=141,data=sd,short_name='SD',long_name='Snow depth',unit='m of water equivalent'
+info,table2=129,name=param,value=142,data=lsp,short_name='LSP',long_name='Stratiform precipitation (Large-scale precipitation)',unit='m'
+info,table2=129,name=param,value=143,data=cp,short_name='CP',long_name='Convective precipitation',unit='m'
+info,table2=129,name=param,value=144,data=sf,short_name='SF',long_name='Snowfall (convective + stratiform)',unit='m of water equivalent'
+info,table2=129,name=param,value=145,data=bld,short_name='BLD',long_name='Boundary layer dissipation',unit='W m**-2 s'
+info,table2=129,name=param,value=146,data=sshf,short_name='SSHF',long_name='Surface sensible heat flux',unit='W m**-2 s'
+info,table2=129,name=param,value=147,data=slhf,short_name='SLHF',long_name='Surface latent heat flux',unit='W m**-2 s'
+info,table2=129,name=param,value=148,data=chnk,short_name='CHNK',long_name='Charnock',unit='-'
+info,table2=129,name=param,value=149,data=snr,short_name='SNR',long_name='Surface net radiation',unit='W m**-2 s'
+info,table2=129,name=param,value=150,data=tnr,short_name='TNR',long_name='Top net radiation',unit='-'
+info,table2=129,name=param,value=151,data=msl,short_name='MSL',long_name='Mean sea level pressure',unit='Pa'
+info,table2=129,name=param,value=152,data=lnsp,short_name='LNSP',long_name='Logarithm of surface pressure',unit='-'
+info,table2=129,name=param,value=153,data=swhr,short_name='SWHR',long_name='Short-wave heating rate',unit='K'
+info,table2=129,name=param,value=154,data=lwhr,short_name='LWHR',long_name='Long-wave heating rate',unit='K'
+info,table2=129,name=param,value=155,data=d,short_name='D',long_name='Divergence',unit='s**-1'
+info,table2=129,name=param,value=156,data=gh,short_name='GH',long_name='Height',unit='m'
+info,table2=129,name=param,value=157,data=r,short_name='R',long_name='Relative humidity',unit='%'
+info,table2=129,name=param,value=158,data=tsp,short_name='TSP',long_name='Tendency of surface pressure',unit='Pa s**-1'
+info,table2=129,name=param,value=159,data=blh,short_name='BLH',long_name='Boundary layer height',unit='m'
+info,table2=129,name=param,value=160,data=sdor,short_name='SDOR',long_name='Standard deviation of orography',unit='-'
+info,table2=129,name=param,value=161,data=isor,short_name='ISOR',long_name='Anisotropy of sub-gridscale orography',unit='-'
+info,table2=129,name=param,value=162,data=anor,short_name='ANOR',long_name='Angle of sub-gridscale orography',unit='rad'
+info,table2=129,name=param,value=163,data=slor,short_name='SLOR',long_name='Slope of sub-gridscale orography',unit='-'
+info,table2=129,name=param,value=164,data=tcc,short_name='TCC',long_name='Total cloud cover',unit='(0 - 1)'
+info,table2=129,name=param,value=165,data=10u,short_name='10U',long_name='10 metre U wind component',unit='m s**-1'
+info,table2=129,name=param,value=166,data=10v,short_name='10V',long_name='10 metre V wind component',unit='m s**-1'
+info,table2=129,name=param,value=167,data=2t,short_name='2T',long_name='2 metre temperature',unit='K'
+info,table2=129,name=param,value=168,data=2d,short_name='2D',long_name='2 metre dewpoint temperature',unit='K'
+info,table2=129,name=param,value=169,data=ssrd,short_name='SSRD',long_name='Surface solar radiation downwards',unit='W m**-2 s'
+info,table2=129,name=param,value=170,data=stl2,short_name='STL2',long_name='Soil temperature level 2',unit='K'
+info,table2=129,name=param,value=171,data=swl2,short_name='SWL2',long_name='Soil wetness level 2',unit='m of water'
+info,table2=129,name=param,value=172,data=lsm,short_name='LSM',long_name='Land-sea mask',unit='(0 - 1)'
+info,table2=129,name=param,value=173,data=sr,short_name='SR',long_name='Surface roughness',unit='m'
+info,table2=129,name=param,value=174,data=al,short_name='AL',long_name='Albedo',unit='(0 - 1)'
+info,table2=129,name=param,value=175,data=strd,short_name='STRD',long_name='Surface thermal radiation downwards',unit='W m**-2 s'
+info,table2=129,name=param,value=176,data=ssr,short_name='SSR',long_name='Surface solar radiation',unit='W m**-2 s'
+info,table2=129,name=param,value=177,data=str,short_name='STR',long_name='Surface thermal radiation',unit='W m**-2 s'
+info,table2=129,name=param,value=178,data=tsr,short_name='TSR',long_name='Top solar radiation',unit='W m**-2 s'
+info,table2=129,name=param,value=179,data=ttr,short_name='TTR',long_name='Top thermal radiation',unit='W m**-2 s'
+info,table2=129,name=param,value=180,data=ewss,short_name='EWSS',long_name='East-West surface stress',unit='N m**-2 s'
+info,table2=129,name=param,value=181,data=nsss,short_name='NSSS',long_name='North-South surface stress',unit='N m**-2 s'
+info,table2=129,name=param,value=182,data=e,short_name='E',long_name='Evaporation',unit='m of water'
+info,table2=129,name=param,value=183,data=stl3,short_name='STL3',long_name='Soil temperature level 3',unit='K'
+info,table2=129,name=param,value=184,data=swl3,short_name='SWL3',long_name='Soil wetness level 3',unit='m of water'
+info,table2=129,name=param,value=185,data=ccc,short_name='CCC',long_name='Convective cloud cover',unit='(0 - 1)'
+info,table2=129,name=param,value=186,data=lcc,short_name='LCC',long_name='Low cloud cover',unit='(0 - 1)'
+info,table2=129,name=param,value=187,data=mcc,short_name='MCC',long_name='Medium cloud cover',unit='(0 - 1)'
+info,table2=129,name=param,value=188,data=hcc,short_name='HCC',long_name='High cloud cover',unit='(0 - 1)'
+info,table2=129,name=param,value=189,data=sund,short_name='SUND',long_name='Sunshine duration',unit='s'
+info,table2=129,name=param,value=190,data=ewov,short_name='EWOV',long_name='East-West component of sub-gridscale orographic variance',unit='m**2'
+info,table2=129,name=param,value=191,data=nsov,short_name='NSOV',long_name='North-South component of sub-gridscale orographic variance',unit='m**2'
+info,table2=129,name=param,value=192,data=nwov,short_name='NWOV',long_name='North-West/South-East component of sub-gridscale orographic variance',unit='m**2'
+info,table2=129,name=param,value=193,data=neov,short_name='NEOV',long_name='North-East/South-West component of sub-gridscale orographic variance',unit='m**2'
+info,table2=129,name=param,value=194,data=btmp,short_name='BTMP',long_name='Brightness temperature',unit='K'
+info,table2=129,name=param,value=195,data=lgws,short_name='LGWS',long_name='Latitudinal component of gravity wave stress',unit='N m**-2 s'
+info,table2=129,name=param,value=196,data=mgws,short_name='MGWS',long_name='Meridional component of gravity wave stress',unit='N m**-2 s'
+info,table2=129,name=param,value=197,data=gwd,short_name='GWD',long_name='Gravity wave dissipation',unit='W m**-2 s'
+info,table2=129,name=param,value=198,data=src,short_name='SRC',long_name='Skin reservoir content',unit='m of water'
+info,table2=129,name=param,value=199,data=veg,short_name='VEG',long_name='Vegetation fraction',unit='(0 - 1)'
+info,table2=129,name=param,value=200,data=vso,short_name='VSO',long_name='Variance of sub-gridscale orography',unit='m**2'
+info,table2=129,name=param,value=201,data=mx2t,short_name='MX2T',long_name='Maximum temperature at 2 metres since previous post-processing',unit='K'
+info,table2=129,name=param,value=202,data=mn2t,short_name='MN2T',long_name='Minimum temperature at 2 metres since previous post-processing',unit='K'
+info,table2=129,name=param,value=203,data=o3,short_name='O3',long_name='Ozone mass mixing ratio',unit='kg kg**-1'
+info,table2=129,name=param,value=204,data=paw,short_name='PAW',long_name='Precipitation analysis weights',unit='-'
+info,table2=129,name=param,value=205,data=ro,short_name='RO',long_name='Runoff',unit='m'
+info,table2=129,name=param,value=206,data=tco3,short_name='TCO3',long_name='Total column ozone',unit='kg m**-2'
+info,table2=129,name=param,value=207,data=10si,short_name='10SI',long_name='10 metre wind speed',unit='m s**-1'
+info,table2=129,name=param,value=208,data=tsrc,short_name='TSRC',long_name='Top net solar radiation, clear sky',unit='W m**-2 s'
+info,table2=129,name=param,value=209,data=ttrc,short_name='TTRC',long_name='Top net thermal radiation, clear sky',unit='W m**-2 s'
+info,table2=129,name=param,value=210,data=ssrc,short_name='SSRC',long_name='Surface net solar radiation, clear sky',unit='W m**-2 s'
+info,table2=129,name=param,value=211,data=strc,short_name='STRC',long_name='Surface net thermal radiation, clear sky',unit='W m**-2 s'
+info,table2=129,name=param,value=212,data=tisr,short_name='TISR',long_name='TOA incident solar radiation',unit='W m**-2 s'
+info,table2=129,name=param,value=214,data=dhr,short_name='DHR',long_name='Diabatic heating by radiation',unit='K'
+info,table2=129,name=param,value=215,data=dhvd,short_name='DHVD',long_name='Diabatic heating by vertical diffusion',unit='K'
+info,table2=129,name=param,value=216,data=dhcc,short_name='DHCC',long_name='Diabatic heating by cumulus convection',unit='K'
+info,table2=129,name=param,value=217,data=dhlc,short_name='DHLC',long_name='Diabatic heating large-scale condensation',unit='K'
+info,table2=129,name=param,value=218,data=vdzw,short_name='VDZW',long_name='Vertical diffusion of zonal wind',unit='m s**-1'
+info,table2=129,name=param,value=219,data=vdmw,short_name='VDMW',long_name='Vertical diffusion of meridional wind',unit='m s**-1'
+info,table2=129,name=param,value=220,data=ewgd,short_name='EWGD',long_name='East-West gravity wave drag tendency',unit='m s**-1'
+info,table2=129,name=param,value=221,data=nsgd,short_name='NSGD',long_name='North-South gravity wave drag tendency',unit='m s**-1'
+info,table2=129,name=param,value=222,data=ctzw,short_name='CTZW',long_name='Convective tendency of zonal wind',unit='m s**-1'
+info,table2=129,name=param,value=223,data=ctmw,short_name='CTMW',long_name='Convective tendency of meridional wind',unit='m s**-1'
+info,table2=129,name=param,value=224,data=vdh,short_name='VDH',long_name='Vertical diffusion of humidity',unit='kg kg**-1'
+info,table2=129,name=param,value=225,data=htcc,short_name='HTCC',long_name='Humidity tendency by cumulus convection',unit='kg kg**-1'
+info,table2=129,name=param,value=226,data=htlc,short_name='HTLC',long_name='Humidity tendency by large-scale condensation',unit='kg kg**-1'
+info,table2=129,name=param,value=227,data=crnh,short_name='CRNH',long_name='Change from removal of negative humidity',unit='kg kg**-1'
+info,table2=129,name=param,value=228,data=tp,short_name='TP',long_name='Total precipitation',unit='m'
+info,table2=129,name=param,value=229,data=iews,short_name='IEWS',long_name='Instantaneous X surface stress',unit='N m**-2'
+info,table2=129,name=param,value=230,data=inss,short_name='INSS',long_name='Instantaneous Y surface stress',unit='N m**-2'
+info,table2=129,name=param,value=231,data=ishf,short_name='ISHF',long_name='Instantaneous surface heat flux',unit='W m**-2'
+info,table2=129,name=param,value=232,data=ie,short_name='IE',long_name='Instantaneous moisture flux',unit='kg m**-2 s'
+info,table2=129,name=param,value=233,data=asq,short_name='ASQ',long_name='Apparent surface humidity',unit='kg kg**-1'
+info,table2=129,name=param,value=234,data=lsrh,short_name='LSRH',long_name='Logarithm of surface roughness length for heat',unit='-'
+info,table2=129,name=param,value=235,data=skt,short_name='SKT',long_name='Skin temperature',unit='K'
+info,table2=129,name=param,value=236,data=stl4,short_name='STL4',long_name='Soil temperature level 4',unit='K'
+info,table2=129,name=param,value=237,data=swl4,short_name='SWL4',long_name='Soil wetness level 4',unit='m'
+info,table2=129,name=param,value=238,data=tsn,short_name='TSN',long_name='Temperature of snow layer',unit='K'
+info,table2=129,name=param,value=239,data=csf,short_name='CSF',long_name='Convective snowfall',unit='m of water equivalent'
+info,table2=129,name=param,value=240,data=lsf,short_name='LSF',long_name='Large-scale snowfall',unit='m of water equivalent'
+info,table2=129,name=param,value=241,data=acf,short_name='ACF',long_name='Accumulated cloud fraction tendency',unit='(-1 to 1)'
+info,table2=129,name=param,value=242,data=alw,short_name='ALW',long_name='Accumulated liquid water tendency',unit='(-1 to 1)'
+info,table2=129,name=param,value=243,data=fal,short_name='FAL',long_name='Forecast albedo',unit='(0 - 1)'
+info,table2=129,name=param,value=244,data=fsr,short_name='FSR',long_name='Forecast surface roughness',unit='m'
+info,table2=129,name=param,value=245,data=flsr,short_name='FLSR',long_name='Forecast logarithm of surface roughness for heat',unit='-'
+info,table2=129,name=param,value=246,data=clwc,short_name='CLWC',long_name='Cloud liquid water content',unit='kg kg**-1'
+info,table2=129,name=param,value=247,data=ciwc,short_name='CIWC',long_name='Cloud ice water content',unit='kg kg**-1'
+info,table2=129,name=param,value=248,data=cc,short_name='CC',long_name='Cloud cover',unit='(0 - 1)'
+info,table2=129,name=param,value=249,data=aiw,short_name='AIW',long_name='Accumulated ice water tendency',unit='(-1 to 1)'
+info,table2=129,name=param,value=250,data=ice,short_name='ICE',long_name='Ice age',unit='(0 - 1)'
+info,table2=129,name=param,value=251,data=atte,short_name='ATTE',long_name='Adiabatic tendency of temperature',unit='K'
+info,table2=129,name=param,value=252,data=athe,short_name='ATHE',long_name='Adiabatic tendency of humidity',unit='kg kg**-1'
+info,table2=129,name=param,value=253,data=atze,short_name='ATZE',long_name='Adiabatic tendency of zonal wind',unit='m s**-1'
+info,table2=129,name=param,value=254,data=atmw,short_name='ATMW',long_name='Adiabatic tendency of meridional wind',unit='m s**-1'
+info,table2=129,name=param,value=255,data=255.129,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=130,name=param,value=208,data=tsru,short_name='TSRU',long_name='Top solar radiation upward',unit='W m**-2'
+info,table2=130,name=param,value=209,data=ttru,short_name='TTRU',long_name='Top thermal radiation upward',unit='W m**-2'
+info,table2=130,name=param,value=210,data=tsuc,short_name='TSUC',long_name='Top solar radiation upward, clear sky',unit='W m**-2'
+info,table2=130,name=param,value=211,data=ttuc,short_name='TTUC',long_name='Top thermal radiation upward, clear sky',unit='W m**-2'
+info,table2=130,name=param,value=212,data=clw,short_name='CLW',long_name='Cloud liquid water',unit='kg kg**-1'
+info,table2=130,name=param,value=213,data=cf,short_name='CF',long_name='Cloud fraction',unit='(0 - 1)'
+info,table2=130,name=param,value=214,data=dhr,short_name='DHR',long_name='Diabatic heating by radiation',unit='K s**-1'
+info,table2=130,name=param,value=215,data=dhvd,short_name='DHVD',long_name='Diabatic heating by vertical diffusion',unit='K s**-1'
+info,table2=130,name=param,value=216,data=dhcc,short_name='DHCC',long_name='Diabatic heating by cumulus convection',unit='K s**-1'
+info,table2=130,name=param,value=217,data=dhlc,short_name='DHLC',long_name='Diabatic heating by large-scale condensation',unit='K s**-1'
+info,table2=130,name=param,value=218,data=vdzw,short_name='VDZW',long_name='Vertical diffusion of zonal wind',unit='m**2 s**-3'
+info,table2=130,name=param,value=219,data=vdmw,short_name='VDMW',long_name='Vertical diffusion of meridional wind',unit='m**2 s**-3'
+info,table2=130,name=param,value=220,data=ewgd,short_name='EWGD',long_name='East-West gravity wave drag',unit='m**2 s**-3'
+info,table2=130,name=param,value=221,data=nsgd,short_name='NSGD',long_name='North-South gravity wave drag',unit='m**2 s**-3'
+info,table2=130,name=param,value=222,data=ctzw,short_name='CTZW',long_name='Convective tendency of zonal wind',unit='m**2 s**-3'
+info,table2=130,name=param,value=223,data=ctmw,short_name='CTMW',long_name='Convective tendency of meridional wind',unit='m**2 s**-3'
+info,table2=130,name=param,value=224,data=vdh,short_name='VDH',long_name='Vertical diffusion of humidity',unit='kg kg**-1 s**-1'
+info,table2=130,name=param,value=225,data=htcc,short_name='HTCC',long_name='Humidity tendency by cumulus convection',unit='kg kg**-1 s**-1'
+info,table2=130,name=param,value=226,data=htlc,short_name='HTLC',long_name='Humidity tendency by large-scale condensation',unit='kg kg**-1 s**-1'
+info,table2=130,name=param,value=227,data=crnh,short_name='CRNH',long_name='Change from removal of negative humidity',unit='kg kg**-1 s**-1'
+info,table2=130,name=param,value=228,data=att,short_name='ATT',long_name='Adiabatic tendency of temperature',unit='K s**-1'
+info,table2=130,name=param,value=229,data=ath,short_name='ATH',long_name='Adiabatic tendency of humidity',unit='kg kg**-1 s**-1'
+info,table2=130,name=param,value=230,data=atzw,short_name='ATZW',long_name='Adiabatic tendency of zonal wind',unit='m**2 s**-3'
+info,table2=130,name=param,value=231,data=atmwax,short_name='ATMWAX',long_name='Adiabatic tendency of meridional wind',unit='m**2 s**-3'
+info,table2=130,name=param,value=232,data=mvv,short_name='MVV',long_name='Mean vertical velocity',unit='Pa s**-1'
+info,table2=130,name=param,value=255,data=255.130,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=131,name=param,value=1,data=2tag2,short_name='2TAG2',long_name='2m temperature anomaly of at least +2K',unit='%'
+info,table2=131,name=param,value=2,data=2tag1,short_name='2TAG1',long_name='2m temperature anomaly of at least +1K',unit='%'
+info,table2=131,name=param,value=3,data=2tag0,short_name='2TAG0',long_name='2m temperature anomaly of at least 0K',unit='%'
+info,table2=131,name=param,value=4,data=2talm1,short_name='2TALM1',long_name='2m temperature anomaly of at most -1K',unit='%'
+info,table2=131,name=param,value=5,data=2talm2,short_name='2TALM2',long_name='2m temperature anomaly of at most -2K',unit='%'
+info,table2=131,name=param,value=6,data=tpag20,short_name='TPAG20',long_name='Total precipitation anomaly of at least 20 mm',unit='%'
+info,table2=131,name=param,value=7,data=tpag10,short_name='TPAG10',long_name='Total precipitation anomaly of at least 10 mm',unit='%'
+info,table2=131,name=param,value=8,data=tpag0,short_name='TPAG0',long_name='Total precipitation anomaly of at least 0 mm',unit='%'
+info,table2=131,name=param,value=9,data=stag0,short_name='STAG0',long_name='Surface temperature anomaly of at least 0K',unit='%'
+info,table2=131,name=param,value=10,data=mslag0,short_name='MSLAG0',long_name='Mean sea level pressure anomaly of at least 0 Pa',unit='%'
+info,table2=131,name=param,value=15,data=h0dip,short_name='H0DIP',long_name='Heigth of 0 degree isotherm probability',unit='percentage'
+info,table2=131,name=param,value=16,data=hslp,short_name='HSLP',long_name='Heigth of snowfall limit probability',unit='percentage'
+info,table2=131,name=param,value=17,data=saip,short_name='SAIP',long_name='Showalter index probability',unit='percentage'
+info,table2=131,name=param,value=18,data=whip,short_name='WHIP',long_name='Whiting index probability',unit='percentage'
+info,table2=131,name=param,value=20,data=talm2,short_name='TALM2',long_name='Temperature anomaly less than -2 K',unit='%'
+info,table2=131,name=param,value=21,data=tag2,short_name='TAG2',long_name='Temperature anomaly of at least +2 K',unit='%'
+info,table2=131,name=param,value=22,data=talm8,short_name='TALM8',long_name='Temperature anomaly less than -8 K',unit='%'
+info,table2=131,name=param,value=23,data=talm4,short_name='TALM4',long_name='Temperature anomaly less than -4 K',unit='%'
+info,table2=131,name=param,value=24,data=tag4,short_name='TAG4',long_name='Temperature anomaly greater than +4 K',unit='%'
+info,table2=131,name=param,value=25,data=tag8,short_name='TAG8',long_name='Temperature anomaly greater than +8 K',unit='%'
+info,table2=131,name=param,value=49,data=10gp,short_name='10GP',long_name='10 metre wind gust probability',unit='percentage'
+info,table2=131,name=param,value=59,data=capep,short_name='CAPEP',long_name='Convective available potential energy probability',unit='percentage'
+info,table2=131,name=param,value=60,data=tpg1,short_name='TPG1',long_name='Total precipitation of at least 1 mm',unit='%'
+info,table2=131,name=param,value=61,data=tpg5,short_name='TPG5',long_name='Total precipitation of at least 5 mm',unit='%'
+info,table2=131,name=param,value=62,data=tpg10,short_name='TPG10',long_name='Total precipitation of at least 10 mm',unit='%'
+info,table2=131,name=param,value=63,data=tpg20,short_name='TPG20',long_name='Total precipitation of at least 20 mm',unit='%'
+info,table2=131,name=param,value=64,data=tpl01,short_name='TPL01',long_name='Total precipitation less than 0.1 mm',unit='%'
+info,table2=131,name=param,value=65,data=tprl1,short_name='TPRL1',long_name='Total precipitation rate less than 1 mm/day',unit='%'
+info,table2=131,name=param,value=66,data=tprg3,short_name='TPRG3',long_name='Total precipitation rate of at least 3 mm/day',unit='%'
+info,table2=131,name=param,value=67,data=tprg5,short_name='TPRG5',long_name='Total precipitation rate of at least 5 mm/day',unit='%'
+info,table2=131,name=param,value=68,data=10spg10,short_name='10SPG10',long_name='10 metre Wind speed of at least 10 m/s',unit='%'
+info,table2=131,name=param,value=69,data=10spg15,short_name='10SPG15',long_name='10 metre Wind speed of at least 15 m/s',unit='%'
+info,table2=131,name=param,value=70,data=10fgg15,short_name='10FGG15',long_name='10 metre Wind gust of at least 15 m/s',unit='%'
+info,table2=131,name=param,value=71,data=10fgg20,short_name='10FGG20',long_name='10 metre Wind gust of at least 20 m/s',unit='%'
+info,table2=131,name=param,value=72,data=10fgg25,short_name='10FGG25',long_name='10 metre Wind gust of at least 25 m/s',unit='%'
+info,table2=131,name=param,value=73,data=2tl273,short_name='2TL273',long_name='2 metre temperature less than 273.15 K',unit='%'
+info,table2=131,name=param,value=74,data=swhg2,short_name='SWHG2',long_name='Significant wave height of at least 2 m',unit='%'
+info,table2=131,name=param,value=75,data=swhg4,short_name='SWHG4',long_name='Significant wave height of at least 4 m',unit='%'
+info,table2=131,name=param,value=76,data=swhg6,short_name='SWHG6',long_name='Significant wave height of at least 6 m',unit='%'
+info,table2=131,name=param,value=77,data=swhg8,short_name='SWHG8',long_name='Significant wave height of at least 8 m',unit='%'
+info,table2=131,name=param,value=78,data=mwpg8,short_name='MWPG8',long_name='Mean wave period of at least 8 s',unit='%'
+info,table2=131,name=param,value=79,data=mwpg10,short_name='MWPG10',long_name='Mean wave period of at least 10 s',unit='%'
+info,table2=131,name=param,value=80,data=mwpg12,short_name='MWPG12',long_name='Mean wave period of at least 12 s',unit='%'
+info,table2=131,name=param,value=81,data=mwpg15,short_name='MWPG15',long_name='Mean wave period of at least 15 s',unit='%'
+info,table2=131,name=param,value=82,data=tpg40,short_name='TPG40',long_name='Total precipitation of at least 40 mm',unit='%'
+info,table2=131,name=param,value=83,data=tpg60,short_name='TPG60',long_name='Total precipitation of at least 60 mm',unit='%'
+info,table2=131,name=param,value=84,data=tpg80,short_name='TPG80',long_name='Total precipitation of at least 80 mm',unit='%'
+info,table2=131,name=param,value=85,data=tpg100,short_name='TPG100',long_name='Total precipitation of at least 100 mm',unit='%'
+info,table2=131,name=param,value=86,data=tpg150,short_name='TPG150',long_name='Total precipitation of at least 150 mm',unit='%'
+info,table2=131,name=param,value=87,data=tpg200,short_name='TPG200',long_name='Total precipitation of at least 200 mm',unit='%'
+info,table2=131,name=param,value=88,data=tpg300,short_name='TPG300',long_name='Total precipitation of at least 300 mm',unit='%'
+info,table2=131,name=param,value=129,data=zp,short_name='ZP',long_name='Geopotential probability',unit='%'
+info,table2=131,name=param,value=130,data=tap,short_name='TAP',long_name='Temperature anomaly probability',unit='percentage'
+info,table2=131,name=param,value=144,data=sfp,short_name='SFP',long_name='Snowfall (convective + stratiform) probability',unit='percentage'
+info,table2=131,name=param,value=164,data=tccp,short_name='TCCP',long_name='Total cloud cover probability',unit='percentage'
+info,table2=131,name=param,value=165,data=10sp,short_name='10SP',long_name='10 metre speed probability',unit='percentage'
+info,table2=131,name=param,value=167,data=2tp,short_name='2TP',long_name='2 metre temperature probability',unit='percentage'
+info,table2=131,name=param,value=201,data=mx2tp,short_name='MX2TP',long_name='Maximum 2 metre temperature probability',unit='percentage'
+info,table2=131,name=param,value=202,data=mn2tp,short_name='MN2TP',long_name='Minimum 2 metre temperature probability',unit='percentage'
+info,table2=131,name=param,value=228,data=tpp,short_name='TPP',long_name='Total precipitation probability',unit='percentage'
+info,table2=131,name=param,value=229,data=swhp,short_name='SWHP',long_name='Significant wave height probability',unit='percentage'
+info,table2=131,name=param,value=232,data=mwpp,short_name='MWPP',long_name='Mean wave period probability',unit='percentage'
+info,table2=131,name=param,value=255,data=255.131,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=132,name=param,value=49,data=10fgi,short_name='10FGI',long_name='10 metre wind gust index',unit='(-1 to 1)'
+info,table2=132,name=param,value=144,data=sfi,short_name='SFI',long_name='Snowfall index',unit='(-1 to 1)'
+info,table2=132,name=param,value=165,data=10wsi,short_name='10WSI',long_name='10 metre speed index',unit='(-1 to 1)'
+info,table2=132,name=param,value=167,data=2ti,short_name='2TI',long_name='2 metre temperature index',unit='(-1 to 1)'
+info,table2=132,name=param,value=200,data=maxswhi,short_name='MAXSWHI',long_name='Maximum of significant wave height index',unit='(-1 to 1)'
+info,table2=132,name=param,value=201,data=mx2ti,short_name='MX2TI',long_name='Maximum temperature at 2 metres index',unit='(-1 to 1)'
+info,table2=132,name=param,value=202,data=mn2ti,short_name='MN2TI',long_name='Minimum temperature at 2 metres index',unit='(-1 to 1)'
+info,table2=132,name=param,value=228,data=tpi,short_name='TPI',long_name='Total precipitation index',unit='(-1 to 1)'
+info,table2=132,name=param,value=255,data=255.132,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=133,name=param,value=1,data=2tplm10,short_name='2TPLM10',long_name='2m temperature probability less than -10 C',unit='%'
+info,table2=133,name=param,value=2,data=2tplm5,short_name='2TPLM5',long_name='2m temperature probability less than -5 C',unit='%'
+info,table2=133,name=param,value=3,data=2tpl0,short_name='2TPL0',long_name='2m temperature probability less than 0 C',unit='%'
+info,table2=133,name=param,value=4,data=2tpl5,short_name='2TPL5',long_name='2m temperature probability less than 5 C',unit='%'
+info,table2=133,name=param,value=5,data=2tpl10,short_name='2TPL10',long_name='2m temperature probability less than 10 C',unit='%'
+info,table2=133,name=param,value=6,data=2tpg25,short_name='2TPG25',long_name='2m temperature probability greater than 25 C',unit='%'
+info,table2=133,name=param,value=7,data=2tpg30,short_name='2TPG30',long_name='2m temperature probability greater than 30 C',unit='%'
+info,table2=133,name=param,value=8,data=2tpg35,short_name='2TPG35',long_name='2m temperature probability greater than 35 C',unit='%'
+info,table2=133,name=param,value=9,data=2tpg40,short_name='2TPG40',long_name='2m temperature probability greater than 40 C',unit='%'
+info,table2=133,name=param,value=10,data=2tpg45,short_name='2TPG45',long_name='2m temperature probability greater than 45 C',unit='%'
+info,table2=133,name=param,value=11,data=mn2tplm10,short_name='MN2TPLM10',long_name='Minimum 2 metre temperature probability less than -10 C',unit='%'
+info,table2=133,name=param,value=12,data=mn2tplm5,short_name='MN2TPLM5',long_name='Minimum 2 metre temperature probability less than -5 C',unit='%'
+info,table2=133,name=param,value=13,data=mn2tpl0,short_name='MN2TPL0',long_name='Minimum 2 metre temperature probability less than 0 C',unit='%'
+info,table2=133,name=param,value=14,data=mn2tpl5,short_name='MN2TPL5',long_name='Minimum 2 metre temperature probability less than 5 C',unit='%'
+info,table2=133,name=param,value=15,data=mn2tpl10,short_name='MN2TPL10',long_name='Minimum 2 metre temperature probability less than 10 C',unit='%'
+info,table2=133,name=param,value=16,data=mx2tpg25,short_name='MX2TPG25',long_name='Maximum 2 metre temperature probability greater than 25 C',unit='%'
+info,table2=133,name=param,value=17,data=mx2tpg30,short_name='MX2TPG30',long_name='Maximum 2 metre temperature probability greater than 30 C',unit='%'
+info,table2=133,name=param,value=18,data=mx2tpg35,short_name='MX2TPG35',long_name='Maximum 2 metre temperature probability greater than 35 C',unit='%'
+info,table2=133,name=param,value=19,data=mx2tpg40,short_name='MX2TPG40',long_name='Maximum 2 metre temperature probability greater than 40 C',unit='%'
+info,table2=133,name=param,value=20,data=mx2tpg45,short_name='MX2TPG45',long_name='Maximum 2 metre temperature probability greater than 45 C',unit='%'
+info,table2=133,name=param,value=21,data=10spg10,short_name='10SPG10',long_name='10 metre wind speed probability of at least 10 m/s',unit='%'
+info,table2=133,name=param,value=22,data=10spg15,short_name='10SPG15',long_name='10 metre wind speed probability of at least 15 m/s',unit='%'
+info,table2=133,name=param,value=23,data=10spg20,short_name='10SPG20',long_name='10 metre wind speed probability of at least 20 m/s',unit='%'
+info,table2=133,name=param,value=24,data=10spg35,short_name='10SPG35',long_name='10 metre wind speed probability of at least 35 m/s',unit='%'
+info,table2=133,name=param,value=25,data=10spg50,short_name='10SPG50',long_name='10 metre wind speed probability of at least 50 m/s',unit='%'
+info,table2=133,name=param,value=26,data=10gpg20,short_name='10GPG20',long_name='10 metre wind gust probability of at least 20 m/s',unit='%'
+info,table2=133,name=param,value=27,data=10gpg35,short_name='10GPG35',long_name='10 metre wind gust probability of at least 35 m/s',unit='%'
+info,table2=133,name=param,value=28,data=10gpg50,short_name='10GPG50',long_name='10 metre wind gust probability of at least 50 m/s',unit='%'
+info,table2=133,name=param,value=29,data=10gpg75,short_name='10GPG75',long_name='10 metre wind gust probability of at least 75 m/s',unit='%'
+info,table2=133,name=param,value=30,data=10gpg100,short_name='10GPG100',long_name='10 metre wind gust probability of at least 100 m/s',unit='%'
+info,table2=133,name=param,value=31,data=tppg1,short_name='TPPG1',long_name='Total precipitation probability of at least 1 mm',unit='%'
+info,table2=133,name=param,value=32,data=tppg5,short_name='TPPG5',long_name='Total precipitation probability of at least 5 mm',unit='%'
+info,table2=133,name=param,value=33,data=tppg10,short_name='TPPG10',long_name='Total precipitation probability of at least 10 mm',unit='%'
+info,table2=133,name=param,value=34,data=tppg20,short_name='TPPG20',long_name='Total precipitation probability of at least 20 mm',unit='%'
+info,table2=133,name=param,value=35,data=tppg40,short_name='TPPG40',long_name='Total precipitation probability of at least 40 mm',unit='%'
+info,table2=133,name=param,value=36,data=tppg60,short_name='TPPG60',long_name='Total precipitation probability of at least 60 mm',unit='%'
+info,table2=133,name=param,value=37,data=tppg80,short_name='TPPG80',long_name='Total precipitation probability of at least 80 mm',unit='%'
+info,table2=133,name=param,value=38,data=tppg100,short_name='TPPG100',long_name='Total precipitation probability of at least 100 mm',unit='%'
+info,table2=133,name=param,value=39,data=tppg150,short_name='TPPG150',long_name='Total precipitation probability of at least 150 mm',unit='%'
+info,table2=133,name=param,value=40,data=tppg200,short_name='TPPG200',long_name='Total precipitation probability of at least 200 mm',unit='%'
+info,table2=133,name=param,value=41,data=tppg300,short_name='TPPG300',long_name='Total precipitation probability of at least 300 mm',unit='%'
+info,table2=133,name=param,value=42,data=sfpg1,short_name='SFPG1',long_name='Snowfall probability of at least 1 mm',unit='%'
+info,table2=133,name=param,value=43,data=sfpg5,short_name='SFPG5',long_name='Snowfall probability of at least 5 mm',unit='%'
+info,table2=133,name=param,value=44,data=sfpg10,short_name='SFPG10',long_name='Snowfall probability of at least 10 mm',unit='%'
+info,table2=133,name=param,value=45,data=sfpg20,short_name='SFPG20',long_name='Snowfall probability of at least 20 mm',unit='%'
+info,table2=133,name=param,value=46,data=sfpg40,short_name='SFPG40',long_name='Snowfall probability of at least 40 mm',unit='%'
+info,table2=133,name=param,value=47,data=sfpg60,short_name='SFPG60',long_name='Snowfall probability of at least 60 mm',unit='%'
+info,table2=133,name=param,value=48,data=sfpg80,short_name='SFPG80',long_name='Snowfall probability of at least 80 mm',unit='%'
+info,table2=133,name=param,value=49,data=sfpg100,short_name='SFPG100',long_name='Snowfall probability of at least 100 mm',unit='%'
+info,table2=133,name=param,value=50,data=sfpg150,short_name='SFPG150',long_name='Snowfall probability of at least 150 mm',unit='%'
+info,table2=133,name=param,value=51,data=sfpg200,short_name='SFPG200',long_name='Snowfall probability of at least 200 mm',unit='%'
+info,table2=133,name=param,value=52,data=sfpg300,short_name='SFPG300',long_name='Snowfall probability of at least 300 mm',unit='%'
+info,table2=133,name=param,value=53,data=tccpg10,short_name='TCCPG10',long_name='Total Cloud Cover probability greater than 10%',unit='%'
+info,table2=133,name=param,value=54,data=tccpg20,short_name='TCCPG20',long_name='Total Cloud Cover probability greater than 20%',unit='%'
+info,table2=133,name=param,value=55,data=tccpg30,short_name='TCCPG30',long_name='Total Cloud Cover probability greater than 30%',unit='%'
+info,table2=133,name=param,value=56,data=tccpg40,short_name='TCCPG40',long_name='Total Cloud Cover probability greater than 40%',unit='%'
+info,table2=133,name=param,value=57,data=tccpg50,short_name='TCCPG50',long_name='Total Cloud Cover probability greater than 50%',unit='%'
+info,table2=133,name=param,value=58,data=tccpg60,short_name='TCCPG60',long_name='Total Cloud Cover probability greater than 60%',unit='%'
+info,table2=133,name=param,value=59,data=tccpg70,short_name='TCCPG70',long_name='Total Cloud Cover probability greater than 70%',unit='%'
+info,table2=133,name=param,value=60,data=tccpg80,short_name='TCCPG80',long_name='Total Cloud Cover probability greater than 80%',unit='%'
+info,table2=133,name=param,value=61,data=tccpg90,short_name='TCCPG90',long_name='Total Cloud Cover probability greater than 90%',unit='%'
+info,table2=133,name=param,value=62,data=tccpg99,short_name='TCCPG99',long_name='Total Cloud Cover probability greater than 99%',unit='%'
+info,table2=133,name=param,value=63,data=hccpg10,short_name='HCCPG10',long_name='High Cloud Cover probability greater than 10%',unit='%'
+info,table2=133,name=param,value=64,data=hccpg20,short_name='HCCPG20',long_name='High Cloud Cover probability greater than 20%',unit='%'
+info,table2=133,name=param,value=65,data=hccpg30,short_name='HCCPG30',long_name='High Cloud Cover probability greater than 30%',unit='%'
+info,table2=133,name=param,value=66,data=hccpg40,short_name='HCCPG40',long_name='High Cloud Cover probability greater than 40%',unit='%'
+info,table2=133,name=param,value=67,data=hccpg50,short_name='HCCPG50',long_name='High Cloud Cover probability greater than 50%',unit='%'
+info,table2=133,name=param,value=68,data=hccpg60,short_name='HCCPG60',long_name='High Cloud Cover probability greater than 60%',unit='%'
+info,table2=133,name=param,value=69,data=hccpg70,short_name='HCCPG70',long_name='High Cloud Cover probability greater than 70%',unit='%'
+info,table2=133,name=param,value=70,data=hccpg80,short_name='HCCPG80',long_name='High Cloud Cover probability greater than 80%',unit='%'
+info,table2=133,name=param,value=71,data=hccpg90,short_name='HCCPG90',long_name='High Cloud Cover probability greater than 90%',unit='%'
+info,table2=133,name=param,value=72,data=hccpg99,short_name='HCCPG99',long_name='High Cloud Cover probability greater than 99%',unit='%'
+info,table2=133,name=param,value=73,data=mccpg10,short_name='MCCPG10',long_name='Medium Cloud Cover probability greater than 10%',unit='%'
+info,table2=133,name=param,value=74,data=mccpg20,short_name='MCCPG20',long_name='Medium Cloud Cover probability greater than 20%',unit='%'
+info,table2=133,name=param,value=75,data=mccpg30,short_name='MCCPG30',long_name='Medium Cloud Cover probability greater than 30%',unit='%'
+info,table2=133,name=param,value=76,data=mccpg40,short_name='MCCPG40',long_name='Medium Cloud Cover probability greater than 40%',unit='%'
+info,table2=133,name=param,value=77,data=mccpg50,short_name='MCCPG50',long_name='Medium Cloud Cover probability greater than 50%',unit='%'
+info,table2=133,name=param,value=78,data=mccpg60,short_name='MCCPG60',long_name='Medium Cloud Cover probability greater than 60%',unit='%'
+info,table2=133,name=param,value=79,data=mccpg70,short_name='MCCPG70',long_name='Medium Cloud Cover probability greater than 70%',unit='%'
+info,table2=133,name=param,value=80,data=mccpg80,short_name='MCCPG80',long_name='Medium Cloud Cover probability greater than 80%',unit='%'
+info,table2=133,name=param,value=81,data=mccpg90,short_name='MCCPG90',long_name='Medium Cloud Cover probability greater than 90%',unit='%'
+info,table2=133,name=param,value=82,data=mccpg99,short_name='MCCPG99',long_name='Medium Cloud Cover probability greater than 99%',unit='%'
+info,table2=133,name=param,value=83,data=lccpg10,short_name='LCCPG10',long_name='Low Cloud Cover probability greater than 10%',unit='%'
+info,table2=133,name=param,value=84,data=lccpg20,short_name='LCCPG20',long_name='Low Cloud Cover probability greater than 20%',unit='%'
+info,table2=133,name=param,value=85,data=lccpg30,short_name='LCCPG30',long_name='Low Cloud Cover probability greater than 30%',unit='%'
+info,table2=133,name=param,value=86,data=lccpg40,short_name='LCCPG40',long_name='Low Cloud Cover probability greater than 40%',unit='%'
+info,table2=133,name=param,value=87,data=lccpg50,short_name='LCCPG50',long_name='Low Cloud Cover probability greater than 50%',unit='%'
+info,table2=133,name=param,value=88,data=lccpg60,short_name='LCCPG60',long_name='Low Cloud Cover probability greater than 60%',unit='%'
+info,table2=133,name=param,value=89,data=lccpg70,short_name='LCCPG70',long_name='Low Cloud Cover probability greater than 70%',unit='%'
+info,table2=133,name=param,value=90,data=lccpg80,short_name='LCCPG80',long_name='Low Cloud Cover probability greater than 80%',unit='%'
+info,table2=133,name=param,value=91,data=lccpg90,short_name='LCCPG90',long_name='Low Cloud Cover probability greater than 90%',unit='%'
+info,table2=133,name=param,value=92,data=lccpg99,short_name='LCCPG99',long_name='Low Cloud Cover probability greater than 99%',unit='%'
+info,table2=140,name=param,value=200,data=maxswh,short_name='MAXSWH',long_name='Maximum of significant wave height',unit='m'
+info,table2=140,name=param,value=217,data=tmax,short_name='TMAX',long_name='Period corresponding to maximum individual wave height',unit='s'
+info,table2=140,name=param,value=218,data=hmax,short_name='HMAX',long_name='Maximum individual wave height',unit='m'
+info,table2=140,name=param,value=219,data=wmb,short_name='WMB',long_name='Model bathymetry',unit='m'
+info,table2=140,name=param,value=220,data=mp1,short_name='MP1',long_name='Mean wave period based on first moment',unit='s'
+info,table2=140,name=param,value=221,data=mp2,short_name='MP2',long_name='Mean wave period based on second moment',unit='s'
+info,table2=140,name=param,value=222,data=wdw,short_name='WDW',long_name='Wave spectral directional width',unit='-'
+info,table2=140,name=param,value=223,data=p1ww,short_name='P1WW',long_name='Mean wave period based on first moment for wind waves',unit='s'
+info,table2=140,name=param,value=224,data=p2ww,short_name='P2WW',long_name='Mean wave period based on second moment for wind waves',unit='s'
+info,table2=140,name=param,value=225,data=dwww,short_name='DWWW',long_name='Wave spectral directional width for wind waves',unit='-'
+info,table2=140,name=param,value=226,data=p1ps,short_name='P1PS',long_name='Mean wave period based on first moment for swell',unit='s'
+info,table2=140,name=param,value=227,data=p2ps,short_name='P2PS',long_name='Mean wave period based on second moment for swell',unit='s'
+info,table2=140,name=param,value=228,data=dwps,short_name='DWPS',long_name='Wave spectral directional width for swell',unit='-'
+info,table2=140,name=param,value=229,data=swh,short_name='SWH',long_name='Significant wave height',unit='m'
+info,table2=140,name=param,value=230,data=mwd,short_name='MWD',long_name='Mean wave direction',unit='degrees'
+info,table2=140,name=param,value=231,data=pp1d,short_name='PP1D',long_name='Peak period of 1D spectra',unit='s'
+info,table2=140,name=param,value=232,data=mwp,short_name='MWP',long_name='Mean wave period',unit='s'
+info,table2=140,name=param,value=233,data=cdww,short_name='CDWW',long_name='Coefficient of drag with waves',unit='-'
+info,table2=140,name=param,value=234,data=shww,short_name='SHWW',long_name='Significant height of wind waves',unit='m'
+info,table2=140,name=param,value=235,data=mdww,short_name='MDWW',long_name='Mean direction of wind waves',unit='degrees'
+info,table2=140,name=param,value=236,data=mpww,short_name='MPWW',long_name='Mean period of wind waves',unit='s'
+info,table2=140,name=param,value=237,data=shts,short_name='SHTS',long_name='Significant height of total swell',unit='m'
+info,table2=140,name=param,value=238,data=mdts,short_name='MDTS',long_name='Mean direction of total swell',unit='degrees'
+info,table2=140,name=param,value=239,data=mpts,short_name='MPTS',long_name='Mean period of total swell',unit='s'
+info,table2=140,name=param,value=240,data=sdhs,short_name='SDHS',long_name='Standard deviation wave height',unit='m'
+info,table2=140,name=param,value=241,data=mu10,short_name='MU10',long_name='Mean of 10 metre wind speed',unit='m s**-1'
+info,table2=140,name=param,value=242,data=mdwi,short_name='MDWI',long_name='Mean wind direction',unit='degrees'
+info,table2=140,name=param,value=243,data=sdu,short_name='SDU',long_name='Standard deviation of 10 metre wind speed',unit='m s**-1'
+info,table2=140,name=param,value=244,data=msqs,short_name='MSQS',long_name='Mean square slope of waves',unit='dimensionless'
+info,table2=140,name=param,value=245,data=wind,short_name='WIND',long_name='10 metre wind speed',unit='m s**-1'
+info,table2=140,name=param,value=246,data=awh,short_name='AWH',long_name='Altimeter wave height',unit='m'
+info,table2=140,name=param,value=247,data=acwh,short_name='ACWH',long_name='Altimeter corrected wave height',unit='m'
+info,table2=140,name=param,value=248,data=arrc,short_name='ARRC',long_name='Altimeter range relative correction',unit='-'
+info,table2=140,name=param,value=249,data=dwi,short_name='DWI',long_name='10 metre wind direction',unit='degrees'
+info,table2=140,name=param,value=250,data=2dsp,short_name='2DSP',long_name='2D wave spectra (multiple)',unit='m**2 s radian**-1'
+info,table2=140,name=param,value=251,data=2dfd,short_name='2DFD',long_name='2D wave spectra (single)',unit='m**2 s radian**-1'
+info,table2=140,name=param,value=252,data=wsk,short_name='WSK',long_name='Wave spectral kurtosis',unit='-'
+info,table2=140,name=param,value=253,data=bfi,short_name='BFI',long_name='Benjamin-Feir index',unit='-'
+info,table2=140,name=param,value=254,data=wsp,short_name='WSP',long_name='Wave spectral peakedness',unit='s**-1'
+info,table2=140,name=param,value=255,data=255.140,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=150,name=param,value=129,data=129.150,short_name='None',long_name='Ocean potential temperature',unit='deg C'
+info,table2=150,name=param,value=130,data=130.150,short_name='None',long_name='Ocean salinity',unit='psu'
+info,table2=150,name=param,value=131,data=131.150,short_name='None',long_name='Ocean potential density',unit='kg m**-3 -1000'
+info,table2=150,name=param,value=133,data=133.150,short_name='None',long_name='Ocean U velocity',unit='m s**-1'
+info,table2=150,name=param,value=134,data=134.150,short_name='None',long_name='Ocean V velocity',unit='m s**-1'
+info,table2=150,name=param,value=135,data=135.150,short_name='None',long_name='Ocean W velocity',unit='m s**-1'
+info,table2=150,name=param,value=137,data=137.150,short_name='None',long_name='Richardson number',unit='-'
+info,table2=150,name=param,value=139,data=139.150,short_name='None',long_name='U*V product',unit='m s**-2'
+info,table2=150,name=param,value=140,data=140.150,short_name='None',long_name='U*T product',unit='m s**-1 deg C'
+info,table2=150,name=param,value=141,data=141.150,short_name='None',long_name='V*T product',unit='m s**-1 deg C'
+info,table2=150,name=param,value=142,data=142.150,short_name='None',long_name='U*U product',unit='m s**-2'
+info,table2=150,name=param,value=143,data=143.150,short_name='None',long_name='V*V product',unit='m s**-2'
+info,table2=150,name=param,value=144,data=144.150,short_name='None',long_name='UV - U~V~',unit='m s**-2'
+info,table2=150,name=param,value=145,data=145.150,short_name='None',long_name='UT - U~T~',unit='m s**-1 deg C'
+info,table2=150,name=param,value=146,data=146.150,short_name='None',long_name='VT - V~T~',unit='m s**-1 deg C'
+info,table2=150,name=param,value=147,data=147.150,short_name='None',long_name='UU - U~U~',unit='m s**-2'
+info,table2=150,name=param,value=148,data=148.150,short_name='None',long_name='VV - V~V~',unit='m s**-2'
+info,table2=150,name=param,value=152,data=152.150,short_name='None',long_name='Sea level',unit='m'
+info,table2=150,name=param,value=153,data=153.150,short_name='None',long_name='Barotropic stream function',unit='-'
+info,table2=150,name=param,value=154,data=154.150,short_name='None',long_name='Mixed layer depth',unit='m'
+info,table2=150,name=param,value=155,data=155.150,short_name='None',long_name='Depth',unit='m'
+info,table2=150,name=param,value=168,data=168.150,short_name='None',long_name='U stress',unit='Pa'
+info,table2=150,name=param,value=169,data=169.150,short_name='None',long_name='V stress',unit='Pa'
+info,table2=150,name=param,value=170,data=170.150,short_name='None',long_name='Turbulent kinetic energy input',unit='-'
+info,table2=150,name=param,value=171,data=171.150,short_name='None',long_name='Net surface heat flux',unit='-'
+info,table2=150,name=param,value=172,data=172.150,short_name='None',long_name='Surface solar radiation',unit='-'
+info,table2=150,name=param,value=173,data=173.150,short_name='None',long_name='P-E',unit='-'
+info,table2=150,name=param,value=180,data=180.150,short_name='None',long_name='Diagnosed sea surface temperature error',unit='deg C'
+info,table2=150,name=param,value=181,data=181.150,short_name='None',long_name='Heat flux correction',unit='W m**-2'
+info,table2=150,name=param,value=182,data=182.150,short_name='None',long_name='Observed sea surface temperature',unit='deg C'
+info,table2=150,name=param,value=183,data=183.150,short_name='None',long_name='Observed heat flux',unit='W m**-2'
+info,table2=150,name=param,value=255,data=255.150,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=151,name=param,value=129,data=ocpt,short_name='OCPT',long_name='Ocean potential temperature',unit='deg C'
+info,table2=151,name=param,value=130,data=s,short_name='S',long_name='Salinity',unit='psu'
+info,table2=151,name=param,value=131,data=u,short_name='U',long_name='U velocity',unit='m s**-1'
+info,table2=151,name=param,value=132,data=v,short_name='V',long_name='V velocity',unit='m s**-1'
+info,table2=151,name=param,value=133,data=wv,short_name='WV',long_name='W velocity',unit='m s**-1'
+info,table2=151,name=param,value=134,data=mst,short_name='MST',long_name='Modulus of strain rate tensor',unit='s**-1'
+info,table2=151,name=param,value=135,data=vvs,short_name='VVS',long_name='Vertical viscosity',unit='m**2 s**-1'
+info,table2=151,name=param,value=136,data=vdf,short_name='VDF',long_name='Vertical diffusivity',unit='m**2 s**-1'
+info,table2=151,name=param,value=137,data=dep,short_name='DEP',long_name='Depth',unit='m'
+info,table2=151,name=param,value=138,data=sth,short_name='STH',long_name='Sigma-theta',unit='kg m**-3'
+info,table2=151,name=param,value=139,data=rn,short_name='RN',long_name='Richardson number',unit='-'
+info,table2=151,name=param,value=140,data=uv,short_name='UV',long_name='UV product',unit='m**2 s**-2'
+info,table2=151,name=param,value=141,data=ut,short_name='UT',long_name='UT product',unit='m s**-1 degC'
+info,table2=151,name=param,value=142,data=vt,short_name='VT',long_name='VT product',unit='m s**-1 deg C'
+info,table2=151,name=param,value=143,data=uu,short_name='UU',long_name='UU product',unit='m**2 s**-2'
+info,table2=151,name=param,value=144,data=vv,short_name='VV',long_name='VV product',unit='m**2 s**-2'
+info,table2=151,name=param,value=145,data=sl,short_name='SL',long_name='Sea level',unit='m'
+info,table2=151,name=param,value=146,data=sl_1,short_name='SL_1',long_name='Sea level previous timestep',unit='m'
+info,table2=151,name=param,value=147,data=bsf,short_name='BSF',long_name='Barotropic stream function',unit='m**3 s**-1'
+info,table2=151,name=param,value=148,data=mld,short_name='MLD',long_name='Mixed layer depth',unit='m'
+info,table2=151,name=param,value=149,data=btp,short_name='BTP',long_name='Bottom Pressure (equivalent height)',unit='m'
+info,table2=151,name=param,value=150,data=sh,short_name='SH',long_name='Steric height',unit='m'
+info,table2=151,name=param,value=151,data=crl,short_name='CRL',long_name='Curl of Wind Stress',unit='N m**-3'
+info,table2=151,name=param,value=152,data=152.151,short_name='None',long_name='Divergence of wind stress',unit='Nm**-3'
+info,table2=151,name=param,value=153,data=tax,short_name='TAX',long_name='U stress',unit='N m**-2'
+info,table2=151,name=param,value=154,data=tay,short_name='TAY',long_name='V stress',unit='N m**-2'
+info,table2=151,name=param,value=155,data=tki,short_name='TKI',long_name='Turbulent kinetic energy input',unit='W m**-2'
+info,table2=151,name=param,value=156,data=nsf,short_name='NSF',long_name='Net surface heat flux',unit='W m**-2'
+info,table2=151,name=param,value=157,data=asr,short_name='ASR',long_name='Absorbed solar radiation',unit='W m**-2'
+info,table2=151,name=param,value=158,data=pme,short_name='PME',long_name='Precipitation - evaporation',unit='m s**-1'
+info,table2=151,name=param,value=159,data=sst,short_name='SST',long_name='Specified sea surface temperature',unit='deg C'
+info,table2=151,name=param,value=160,data=shf,short_name='SHF',long_name='Specified surface heat flux',unit='W m**-2'
+info,table2=151,name=param,value=161,data=dte,short_name='DTE',long_name='Diagnosed sea surface temperature error',unit='deg C'
+info,table2=151,name=param,value=162,data=hfc,short_name='HFC',long_name='Heat flux correction',unit='W m**-2'
+info,table2=151,name=param,value=163,data=20d,short_name='20D',long_name='20 degrees isotherm depth',unit='m'
+info,table2=151,name=param,value=164,data=tav300,short_name='TAV300',long_name='Average potential temperature in the upper 300m',unit='degrees C'
+info,table2=151,name=param,value=165,data=uba1,short_name='UBA1',long_name='Vertically integrated zonal velocity (previous time step)',unit='m**2 s**-1'
+info,table2=151,name=param,value=166,data=vba1,short_name='VBA1',long_name='Vertically Integrated meridional velocity (previous time step)',unit='m**2 s**-1'
+info,table2=151,name=param,value=167,data=ztr,short_name='ZTR',long_name='Vertically integrated zonal volume transport',unit='m**2 s**-1'
+info,table2=151,name=param,value=168,data=mtr,short_name='MTR',long_name='Vertically integrated meridional volume transport',unit='m**2 s**-1'
+info,table2=151,name=param,value=169,data=zht,short_name='ZHT',long_name='Vertically integrated zonal heat transport',unit='J m**-1 s**-1'
+info,table2=151,name=param,value=170,data=mht,short_name='MHT',long_name='Vertically integrated meridional heat transport',unit='J m**-1 s**-1'
+info,table2=151,name=param,value=171,data=umax,short_name='UMAX',long_name='U velocity maximum',unit='m s**-1'
+info,table2=151,name=param,value=172,data=dumax,short_name='DUMAX',long_name='Depth of the velocity maximum',unit='m'
+info,table2=151,name=param,value=173,data=smax,short_name='SMAX',long_name='Salinity maximum',unit='psu'
+info,table2=151,name=param,value=174,data=dsmax,short_name='DSMAX',long_name='Depth of salinity maximum',unit='m'
+info,table2=151,name=param,value=175,data=sav300,short_name='SAV300',long_name='Average salinity in the upper 300m',unit='psu'
+info,table2=151,name=param,value=176,data=ldp,short_name='LDP',long_name='Layer depth at scalar points',unit='m'
+info,table2=151,name=param,value=177,data=ldu,short_name='LDU',long_name='Layer depth at vector points',unit='m'
+info,table2=151,name=param,value=178,data=pti,short_name='PTI',long_name='Potential temperature increment',unit='deg C'
+info,table2=151,name=param,value=179,data=ptae,short_name='PTAE',long_name='Potential temperature analysis error',unit='deg C'
+info,table2=151,name=param,value=180,data=bpt,short_name='BPT',long_name='Background potential temperature',unit='deg C'
+info,table2=151,name=param,value=181,data=apt,short_name='APT',long_name='Analysed potential temperature',unit='deg C'
+info,table2=151,name=param,value=182,data=ptbe,short_name='PTBE',long_name='Potential temperature background error',unit='deg C'
+info,table2=151,name=param,value=183,data=as,short_name='AS',long_name='Analysed salinity',unit='psu'
+info,table2=151,name=param,value=184,data=sali,short_name='SALI',long_name='Salinity increment',unit='psu'
+info,table2=151,name=param,value=185,data=ebt,short_name='EBT',long_name='Estimated Bias in Temperature',unit='deg C'
+info,table2=151,name=param,value=186,data=ebs,short_name='EBS',long_name='Estimated Bias in Salinity',unit='psu'
+info,table2=151,name=param,value=187,data=uvi,short_name='UVI',long_name='Zonal Velocity increment (from balance operator)',unit='m/s per time step'
+info,table2=151,name=param,value=188,data=vvi,short_name='VVI',long_name='Meridional Velocity increment (from balance operator)',unit='-'
+info,table2=151,name=param,value=190,data=subi,short_name='SUBI',long_name='Salinity increment (from salinity data)',unit='psu per time step'
+info,table2=151,name=param,value=191,data=sale,short_name='SALE',long_name='Salinity analysis error',unit='psu'
+info,table2=151,name=param,value=192,data=bsal,short_name='BSAL',long_name='Background Salinity',unit='psu'
+info,table2=151,name=param,value=193,data=193.151,short_name='None',long_name='Reserved',unit='-'
+info,table2=151,name=param,value=194,data=salbe,short_name='SALBE',long_name='Salinity background error',unit='psu'
+info,table2=151,name=param,value=199,data=ebta,short_name='EBTA',long_name='Estimated temperature bias from assimilation',unit='deg C'
+info,table2=151,name=param,value=200,data=ebsa,short_name='EBSA',long_name='Estimated salinity bias from assimilation',unit='psu'
+info,table2=151,name=param,value=201,data=lti,short_name='LTI',long_name='Temperature increment from relaxation term',unit='deg C per time step'
+info,table2=151,name=param,value=202,data=lsi,short_name='LSI',long_name='Salinity increment from relaxation term',unit='-'
+info,table2=151,name=param,value=203,data=bzpga,short_name='BZPGA',long_name='Bias in the zonal pressure gradient (applied)',unit='Pa**m-1'
+info,table2=151,name=param,value=204,data=bmpga,short_name='BMPGA',long_name='Bias in the meridional pressure gradient (applied)',unit='Pa**m-1'
+info,table2=151,name=param,value=205,data=ebtl,short_name='EBTL',long_name='Estimated temperature bias from relaxation',unit='deg C'
+info,table2=151,name=param,value=206,data=ebsl,short_name='EBSL',long_name='Estimated salinity bias from relaxation',unit='psu'
+info,table2=151,name=param,value=207,data=fgbt,short_name='FGBT',long_name='First guess bias in temperature',unit='deg C'
+info,table2=151,name=param,value=208,data=fgbs,short_name='FGBS',long_name='First guess bias in salinity',unit='psu'
+info,table2=151,name=param,value=209,data=bpa,short_name='BPA',long_name='Applied bias in pressure',unit='Pa'
+info,table2=151,name=param,value=210,data=fgbp,short_name='FGBP',long_name='FG bias in pressure',unit='Pa'
+info,table2=151,name=param,value=211,data=pta,short_name='PTA',long_name='Bias in temperature(applied)',unit='deg C'
+info,table2=151,name=param,value=212,data=psa,short_name='PSA',long_name='Bias in salinity (applied)',unit='psu'
+info,table2=151,name=param,value=255,data=255.151,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=160,name=param,value=127,data=at,short_name='AT',long_name='Atmospheric tide',unit='-'
+info,table2=160,name=param,value=128,data=bv,short_name='BV',long_name='Budget values',unit='-'
+info,table2=160,name=param,value=129,data=z,short_name='Z',long_name='Geopotential',unit='m**2 s**-2'
+info,table2=160,name=param,value=130,data=t,short_name='T',long_name='Temperature',unit='K'
+info,table2=160,name=param,value=131,data=u,short_name='U',long_name='U velocity',unit='m s**-1'
+info,table2=160,name=param,value=132,data=v,short_name='V',long_name='V velocity',unit='m s**-1'
+info,table2=160,name=param,value=133,data=q,short_name='Q',long_name='Specific humidity',unit='kg kg**-1'
+info,table2=160,name=param,value=134,data=sp,short_name='SP',long_name='Surface pressure',unit='Pa'
+info,table2=160,name=param,value=135,data=w,short_name='W',long_name='Vertical velocity',unit='Pa s**-1'
+info,table2=160,name=param,value=136,data=tcw,short_name='TCW',long_name='Total column water',unit='kg m**-2'
+info,table2=160,name=param,value=137,data=pwc,short_name='PWC',long_name='Precipitable water content',unit='kg m**-2'
+info,table2=160,name=param,value=138,data=vo,short_name='VO',long_name='Vorticity (relative)',unit='s**-1'
+info,table2=160,name=param,value=139,data=stl1,short_name='STL1',long_name='Soil temperature level 1',unit='K'
+info,table2=160,name=param,value=140,data=swl1,short_name='SWL1',long_name='Soil wetness level 1',unit='m'
+info,table2=160,name=param,value=141,data=sd,short_name='SD',long_name='Snow depth',unit='m of water'
+info,table2=160,name=param,value=142,data=lsp,short_name='LSP',long_name='Large-scale precipitation',unit='kg m**-2 s**-1'
+info,table2=160,name=param,value=143,data=cp,short_name='CP',long_name='Convective precipitation',unit='kg m**-2 s**-1'
+info,table2=160,name=param,value=144,data=sf,short_name='SF',long_name='Snowfall',unit='kg m**-2 s**-1'
+info,table2=160,name=param,value=145,data=bld,short_name='BLD',long_name='Boundary layer dissipation',unit='W m**-2'
+info,table2=160,name=param,value=146,data=sshf,short_name='SSHF',long_name='Surface sensible heat flux',unit='W m**-2'
+info,table2=160,name=param,value=147,data=slhf,short_name='SLHF',long_name='Surface latent heat flux',unit='W m**-2'
+info,table2=160,name=param,value=151,data=msl,short_name='MSL',long_name='Mean sea level pressure',unit='Pa'
+info,table2=160,name=param,value=152,data=lnsp,short_name='LNSP',long_name='Logarithm of surface pressure',unit='-'
+info,table2=160,name=param,value=155,data=d,short_name='D',long_name='Divergence',unit='s**-1'
+info,table2=160,name=param,value=156,data=gh,short_name='GH',long_name='Height',unit='m'
+info,table2=160,name=param,value=157,data=r,short_name='R',long_name='Relative humidity',unit='(0 - 1)'
+info,table2=160,name=param,value=158,data=tsp,short_name='TSP',long_name='Tendency of surface pressure',unit='Pa s**-1'
+info,table2=160,name=param,value=164,data=tcc,short_name='TCC',long_name='Total cloud cover',unit='(0 - 1)'
+info,table2=160,name=param,value=165,data=10u,short_name='10U',long_name='10 metre U wind component',unit='m s**-1'
+info,table2=160,name=param,value=166,data=10v,short_name='10V',long_name='10 metre V wind component',unit='m s**-1'
+info,table2=160,name=param,value=167,data=2t,short_name='2T',long_name='2 metre temperature',unit='K'
+info,table2=160,name=param,value=168,data=2d,short_name='2D',long_name='2 metre dewpoint temperature',unit='K'
+info,table2=160,name=param,value=170,data=stl2,short_name='STL2',long_name='Soil temperature level 2',unit='K'
+info,table2=160,name=param,value=171,data=swl2,short_name='SWL2',long_name='Soil wetness level 2',unit='m'
+info,table2=160,name=param,value=172,data=lsm,short_name='LSM',long_name='Land-sea mask',unit='(0 - 1)'
+info,table2=160,name=param,value=173,data=sr,short_name='SR',long_name='Surface roughness',unit='m'
+info,table2=160,name=param,value=174,data=al,short_name='AL',long_name='Albedo',unit='(0 - 1)'
+info,table2=160,name=param,value=176,data=ssr,short_name='SSR',long_name='Surface solar radiation',unit='W m**-2'
+info,table2=160,name=param,value=177,data=str,short_name='STR',long_name='Surface thermal radiation',unit='W m**-2'
+info,table2=160,name=param,value=178,data=tsr,short_name='TSR',long_name='Top solar radiation',unit='W m**-2'
+info,table2=160,name=param,value=179,data=ttr,short_name='TTR',long_name='Top thermal radiation',unit='W m**-2'
+info,table2=160,name=param,value=180,data=ewss,short_name='EWSS',long_name='East-West surface stress',unit='N m**-2 s**-1'
+info,table2=160,name=param,value=181,data=nsss,short_name='NSSS',long_name='North-South surface stress',unit='N m**-2 s**-1'
+info,table2=160,name=param,value=182,data=e,short_name='E',long_name='Evaporation',unit='kg m**-2 s**-1'
+info,table2=160,name=param,value=183,data=stl3,short_name='STL3',long_name='Soil temperature level 3',unit='K'
+info,table2=160,name=param,value=184,data=swl3,short_name='SWL3',long_name='Soil wetness level 3',unit='m'
+info,table2=160,name=param,value=185,data=ccc,short_name='CCC',long_name='Convective cloud cover',unit='(0 - 1)'
+info,table2=160,name=param,value=186,data=lcc,short_name='LCC',long_name='Low cloud cover',unit='(0 - 1)'
+info,table2=160,name=param,value=187,data=mcc,short_name='MCC',long_name='Medium cloud cover',unit='(0 - 1)'
+info,table2=160,name=param,value=188,data=hcc,short_name='HCC',long_name='High cloud cover',unit='(0 - 1)'
+info,table2=160,name=param,value=190,data=ewov,short_name='EWOV',long_name='East-West component of sub-gridscale orographic variance',unit='m**2'
+info,table2=160,name=param,value=191,data=nsov,short_name='NSOV',long_name='North-South component of sub-gridscale orographic variance',unit='m**2'
+info,table2=160,name=param,value=192,data=nwov,short_name='NWOV',long_name='North-West/South-East component of sub-gridscale orographic variance',unit='m**2'
+info,table2=160,name=param,value=193,data=neov,short_name='NEOV',long_name='North-East/South-West component of sub-gridscale orographic variance',unit='m**2'
+info,table2=160,name=param,value=195,data=lgws,short_name='LGWS',long_name='Latitudinal component of gravity wave stress',unit='N m**-2 s'
+info,table2=160,name=param,value=196,data=mgws,short_name='MGWS',long_name='Meridional component of gravity wave stress',unit='N m**-2 s'
+info,table2=160,name=param,value=197,data=gwd,short_name='GWD',long_name='Gravity wave dissipation',unit='W m**-2 s'
+info,table2=160,name=param,value=198,data=src,short_name='SRC',long_name='Skin reservoir content',unit='m of water'
+info,table2=160,name=param,value=199,data=veg,short_name='VEG',long_name='Percentage of vegetation',unit='%'
+info,table2=160,name=param,value=200,data=vso,short_name='VSO',long_name='Variance of sub-gridscale orography',unit='m**2'
+info,table2=160,name=param,value=201,data=mx2t,short_name='MX2T',long_name='Maximum temperature at 2 metres during averaging time',unit='K'
+info,table2=160,name=param,value=202,data=mn2t,short_name='MN2T',long_name='Minimium temperature at 2 metres during averaging time',unit='K'
+info,table2=160,name=param,value=204,data=paw,short_name='PAW',long_name='Precipitation analysis weights',unit='-'
+info,table2=160,name=param,value=205,data=ro,short_name='RO',long_name='Runoff',unit='kg m**-2 s**-1'
+info,table2=160,name=param,value=206,data=zz,short_name='ZZ',long_name='Standard deviation of geopotential',unit='m**2 s**-2'
+info,table2=160,name=param,value=207,data=tz,short_name='TZ',long_name='Covariance of temperature and geopotential',unit='K m**2 s**-2'
+info,table2=160,name=param,value=208,data=tt,short_name='TT',long_name='Standard deviation of temperature',unit='K'
+info,table2=160,name=param,value=209,data=qz,short_name='QZ',long_name='Covariance of specific humidity and geopotential',unit='m**2 s**-2'
+info,table2=160,name=param,value=210,data=qt,short_name='QT',long_name='Covariance of specific humidity and temperature',unit='K'
+info,table2=160,name=param,value=211,data=qq,short_name='QQ',long_name='Standard deviation of specific humidity',unit='(0 - 1)'
+info,table2=160,name=param,value=212,data=uz,short_name='UZ',long_name='Covariance of U component and geopotential',unit='m**3 s**-3'
+info,table2=160,name=param,value=213,data=ut,short_name='UT',long_name='Covariance of U component and temperature',unit='K m s**-1'
+info,table2=160,name=param,value=214,data=uq,short_name='UQ',long_name='Covariance of U component and specific humidity',unit='m s**-1'
+info,table2=160,name=param,value=215,data=uu,short_name='UU',long_name='Standard deviation of U velocity',unit='m s**-1'
+info,table2=160,name=param,value=216,data=vz,short_name='VZ',long_name='Covariance of V component and geopotential',unit='m**3 s**-3'
+info,table2=160,name=param,value=217,data=vt,short_name='VT',long_name='Covariance of V component and temperature',unit='K m s**-1'
+info,table2=160,name=param,value=218,data=vq,short_name='VQ',long_name='Covariance of V component and specific humidity',unit='m s**-1'
+info,table2=160,name=param,value=219,data=vu,short_name='VU',long_name='Covariance of V component and U component',unit='m**2 s**-2'
+info,table2=160,name=param,value=220,data=vv,short_name='VV',long_name='Standard deviation of V component',unit='m s**-1'
+info,table2=160,name=param,value=221,data=wz,short_name='WZ',long_name='Covariance of W component and geopotential',unit='Pa m**2 s**-3'
+info,table2=160,name=param,value=222,data=wt,short_name='WT',long_name='Covariance of W component and temperature',unit='K Pa s**-1'
+info,table2=160,name=param,value=223,data=wq,short_name='WQ',long_name='Covariance of W component and specific humidity',unit='Pa s**-1'
+info,table2=160,name=param,value=224,data=wu,short_name='WU',long_name='Covariance of W component and U component',unit='Pa m s**-2'
+info,table2=160,name=param,value=225,data=wv,short_name='WV',long_name='Covariance of W component and V component',unit='Pa m s**-2'
+info,table2=160,name=param,value=226,data=ww,short_name='WW',long_name='Standard deviation of vertical velocity',unit='Pa s**-1'
+info,table2=160,name=param,value=228,data=tp,short_name='TP',long_name='Total precipitation',unit='m'
+info,table2=160,name=param,value=229,data=iews,short_name='IEWS',long_name='Instantaneous X surface stress',unit='N m**-2'
+info,table2=160,name=param,value=230,data=inss,short_name='INSS',long_name='Instantaneous Y surface stress',unit='N m**-2'
+info,table2=160,name=param,value=231,data=ishf,short_name='ISHF',long_name='Instantaneous surface heat flux',unit='W m**-2'
+info,table2=160,name=param,value=232,data=ie,short_name='IE',long_name='Instantaneous moisture flux',unit='kg m**-2 s**-1'
+info,table2=160,name=param,value=233,data=asq,short_name='ASQ',long_name='Apparent surface humidity',unit='kg kg**-1'
+info,table2=160,name=param,value=234,data=lsrh,short_name='LSRH',long_name='Logarithm of surface roughness length for heat',unit='-'
+info,table2=160,name=param,value=235,data=skt,short_name='SKT',long_name='Skin temperature',unit='K'
+info,table2=160,name=param,value=236,data=stl4,short_name='STL4',long_name='Soil temperature level 4',unit='K'
+info,table2=160,name=param,value=237,data=swl4,short_name='SWL4',long_name='Soil wetness level 4',unit='m'
+info,table2=160,name=param,value=238,data=tsn,short_name='TSN',long_name='Temperature of snow layer',unit='K'
+info,table2=160,name=param,value=239,data=csf,short_name='CSF',long_name='Convective snowfall',unit='kg m**-2 s**-1'
+info,table2=160,name=param,value=240,data=lsf,short_name='LSF',long_name='Large-scale snowfall',unit='kg m**-2 s**-1'
+info,table2=160,name=param,value=241,data=clwcer,short_name='CLWCER',long_name='Cloud liquid water content',unit='kg kg**-1'
+info,table2=160,name=param,value=242,data=cc,short_name='CC',long_name='Cloud cover',unit='(0 - 1)'
+info,table2=160,name=param,value=243,data=fal,short_name='FAL',long_name='Forecast albedo',unit='-'
+info,table2=160,name=param,value=244,data=fsr,short_name='FSR',long_name='Forecast surface roughness',unit='m'
+info,table2=160,name=param,value=245,data=flsr,short_name='FLSR',long_name='Forecast logarithm of surface roughness for heat',unit='-'
+info,table2=160,name=param,value=246,data=10ws,short_name='10WS',long_name='10 metre wind speed',unit='m s**-1'
+info,table2=160,name=param,value=247,data=mofl,short_name='MOFL',long_name='Momentum flux',unit='N m**-2'
+info,table2=160,name=param,value=249,data=249.160,short_name='None',long_name='Gravity wave dissipation flux',unit='W m**-2'
+info,table2=160,name=param,value=254,data=hsd,short_name='HSD',long_name='Heaviside beta function',unit='(0 - 1)'
+info,table2=160,name=param,value=255,data=255.160,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=162,name=param,value=51,data=51.162,short_name='None',long_name='Surface geopotential',unit='m**2 s**-2'
+info,table2=162,name=param,value=52,data=52.162,short_name='None',long_name='Surface pressure',unit='Pa'
+info,table2=162,name=param,value=53,data=53.162,short_name='None',long_name='Vertical integral of mass of atmosphere',unit='kg m**-2'
+info,table2=162,name=param,value=54,data=54.162,short_name='None',long_name='Vertical integral of temperature',unit='K kg m**-2'
+info,table2=162,name=param,value=55,data=55.162,short_name='None',long_name='Vertical integral of total column water vapour',unit='kg m**-2'
+info,table2=162,name=param,value=56,data=56.162,short_name='None',long_name='Vertical integral of total column liquid cloud water',unit='kg m**-2'
+info,table2=162,name=param,value=57,data=57.162,short_name='None',long_name='Vertical integral of total column frozen cloud water',unit='kg m**-2'
+info,table2=162,name=param,value=58,data=58.162,short_name='None',long_name='Vertical integral of total column ozone',unit='kg m**-2'
+info,table2=162,name=param,value=59,data=59.162,short_name='None',long_name='Vertical integral of kinetic energy',unit='J m**-2'
+info,table2=162,name=param,value=60,data=60.162,short_name='None',long_name='Vertical integral of thermal energy',unit='J m**-2'
+info,table2=162,name=param,value=61,data=61.162,short_name='None',long_name='Vertical integral of dry static energy',unit='J m**-2'
+info,table2=162,name=param,value=62,data=62.162,short_name='None',long_name='Vertical integral of moist static energy',unit='J m**-2'
+info,table2=162,name=param,value=63,data=63.162,short_name='None',long_name='Vertical integral of total energy',unit='J m**-2'
+info,table2=162,name=param,value=64,data=64.162,short_name='None',long_name='Vertical integral of energy conversion',unit='W m**-2'
+info,table2=162,name=param,value=65,data=65.162,short_name='None',long_name='Vertical integral of eastward mass flux',unit='kg m**-1 s**-1'
+info,table2=162,name=param,value=66,data=66.162,short_name='None',long_name='Vertical integral of northward mass flux',unit='kg m**-1 s**-1'
+info,table2=162,name=param,value=67,data=67.162,short_name='None',long_name='Vertical integral of eastward kinetic energy flux',unit='W m**-2'
+info,table2=162,name=param,value=68,data=68.162,short_name='None',long_name='Vertical integral of northward kinetic energy flux',unit='W m**-2'
+info,table2=162,name=param,value=69,data=69.162,short_name='None',long_name='Vertical integral of eastward heat flux',unit='W m**-2'
+info,table2=162,name=param,value=70,data=70.162,short_name='None',long_name='Vertical integral of northward heat flux',unit='W m**-2'
+info,table2=162,name=param,value=71,data=71.162,short_name='None',long_name='Vertical integral of eastward water vapour flux',unit='kg m**-1 s**-1'
+info,table2=162,name=param,value=72,data=72.162,short_name='None',long_name='Vertical integral of northward water vapour flux',unit='kg m**-1 s**-1'
+info,table2=162,name=param,value=73,data=73.162,short_name='None',long_name='Vertical integral of eastward geopotential flux',unit='W m**-2'
+info,table2=162,name=param,value=74,data=74.162,short_name='None',long_name='Vertical integral of northward geopotential flux',unit='W m**-2'
+info,table2=162,name=param,value=75,data=75.162,short_name='None',long_name='Vertical integral of eastward total energy flux',unit='W m**-2'
+info,table2=162,name=param,value=76,data=76.162,short_name='None',long_name='Vertical integral of northward total energy flux',unit='W m**-2'
+info,table2=162,name=param,value=77,data=77.162,short_name='None',long_name='Vertical integral of eastward ozone flux',unit='kg m**-1 s**-1'
+info,table2=162,name=param,value=78,data=78.162,short_name='None',long_name='Vertical integral of northward ozone flux',unit='kg m**-1 s**-1'
+info,table2=162,name=param,value=81,data=81.162,short_name='None',long_name='Vertical integral of divergence of mass flux',unit='kg m**-2 s**-1'
+info,table2=162,name=param,value=82,data=82.162,short_name='None',long_name='Vertical integral of divergence of kinetic energy flux',unit='W m**-2'
+info,table2=162,name=param,value=83,data=83.162,short_name='None',long_name='Vertical integral of divergence of thermal energy flux',unit='W m**-2'
+info,table2=162,name=param,value=84,data=84.162,short_name='None',long_name='Vertical integral of divergence of moisture flux',unit='kg m**-2 s**-1'
+info,table2=162,name=param,value=85,data=85.162,short_name='None',long_name='Vertical integral of divergence of geopotential flux',unit='W m**-2'
+info,table2=162,name=param,value=86,data=86.162,short_name='None',long_name='Vertical integral of divergence of total energy flux',unit='W m**-2'
+info,table2=162,name=param,value=87,data=87.162,short_name='None',long_name='Vertical integral of divergence of ozone flux',unit='kg m**-2 s**-1'
+info,table2=162,name=param,value=100,data=100.162,short_name='None',long_name='Tendency of short wave radiation',unit='K'
+info,table2=162,name=param,value=101,data=101.162,short_name='None',long_name='Tendency of long wave radiation',unit='K'
+info,table2=162,name=param,value=102,data=102.162,short_name='None',long_name='Tendency of clear sky short wave radiation',unit='K'
+info,table2=162,name=param,value=103,data=103.162,short_name='None',long_name='Tendency of clear sky long wave radiation',unit='K'
+info,table2=162,name=param,value=104,data=104.162,short_name='None',long_name='Updraught mass flux',unit='kg m**-2'
+info,table2=162,name=param,value=105,data=105.162,short_name='None',long_name='Downdraught mass flux',unit='kg m**-2'
+info,table2=162,name=param,value=106,data=106.162,short_name='None',long_name='Updraught detrainment rate',unit='kg m**-3'
+info,table2=162,name=param,value=107,data=107.162,short_name='None',long_name='Downdraught detrainment rate',unit='kg m**-3'
+info,table2=162,name=param,value=108,data=108.162,short_name='None',long_name='Total precipitation flux',unit='kg m**-2'
+info,table2=162,name=param,value=109,data=109.162,short_name='None',long_name='Turbulent diffusion coefficient for heat',unit='m**2'
+info,table2=162,name=param,value=110,data=110.162,short_name='None',long_name='Tendency of temperature due to physics',unit='K'
+info,table2=162,name=param,value=111,data=111.162,short_name='None',long_name='Tendency of specific humidity due to physics',unit='kg kg**-1'
+info,table2=162,name=param,value=112,data=112.162,short_name='None',long_name='Tendency of u component due to physics',unit='m s**-1'
+info,table2=162,name=param,value=113,data=113.162,short_name='None',long_name='Tendency of v component due to physics',unit='m s**-1'
+info,table2=162,name=param,value=206,data=206.162,short_name='None',long_name='Variance of geopotential',unit='m**4 s**-4'
+info,table2=162,name=param,value=207,data=207.162,short_name='None',long_name='Covariance of geopotential/temperature',unit='m**2 K s**-2'
+info,table2=162,name=param,value=208,data=208.162,short_name='None',long_name='Variance of temperature',unit='K**2'
+info,table2=162,name=param,value=209,data=209.162,short_name='None',long_name='Covariance of geopotential/specific humidity',unit='m**2 s**-2'
+info,table2=162,name=param,value=210,data=210.162,short_name='None',long_name='Covariance of temperature/specific humidity',unit='K'
+info,table2=162,name=param,value=211,data=211.162,short_name='None',long_name='Variance of specific humidity',unit='-'
+info,table2=162,name=param,value=212,data=212.162,short_name='None',long_name='Covariance of u component/geopotential',unit='M**3 s**-3'
+info,table2=162,name=param,value=213,data=213.162,short_name='None',long_name='Covariance of u component/temperature',unit='m s**-1 K'
+info,table2=162,name=param,value=214,data=214.162,short_name='None',long_name='Covariance of u component/specific humidity',unit='m s**-1'
+info,table2=162,name=param,value=215,data=215.162,short_name='None',long_name='Variance of u component',unit='m**2 s**-2'
+info,table2=162,name=param,value=216,data=216.162,short_name='None',long_name='Covariance of v component/geopotential',unit='M**3 s**-3'
+info,table2=162,name=param,value=217,data=217.162,short_name='None',long_name='Covariance of v component/temperaure',unit='m s**-1 K'
+info,table2=162,name=param,value=218,data=218.162,short_name='None',long_name='Covariance of v component/specific humidity',unit='m s**-1'
+info,table2=162,name=param,value=219,data=219.162,short_name='None',long_name='Covariance of v component/u component',unit='m**2 s**-2'
+info,table2=162,name=param,value=220,data=220.162,short_name='None',long_name='Variance of v component',unit='m**2 s**-2'
+info,table2=162,name=param,value=221,data=221.162,short_name='None',long_name='Covariance of omega/geopotential',unit='m**2 Pa s**-3'
+info,table2=162,name=param,value=222,data=222.162,short_name='None',long_name='Covariance of omega/temperature',unit='Pa s**-1 K'
+info,table2=162,name=param,value=223,data=223.162,short_name='None',long_name='Covariance of omega/specific humidity',unit='Pa s**-1'
+info,table2=162,name=param,value=224,data=224.162,short_name='None',long_name='Covariance of omega/u component',unit='m Pa s**-2'
+info,table2=162,name=param,value=225,data=225.162,short_name='None',long_name='Covariance of omega/v component',unit='m Pa s**-2'
+info,table2=162,name=param,value=226,data=226.162,short_name='None',long_name='Variance of omega',unit='Pa**2 s**-2'
+info,table2=162,name=param,value=227,data=227.162,short_name='None',long_name='Variance of surface pressure',unit='Pa**2'
+info,table2=162,name=param,value=229,data=229.162,short_name='None',long_name='Variance of relative humidity',unit='dimensionless'
+info,table2=162,name=param,value=230,data=230.162,short_name='None',long_name='Covariance of u component/ozone',unit='m s**-1'
+info,table2=162,name=param,value=231,data=231.162,short_name='None',long_name='Covariance of v component/ozone',unit='m s**-1'
+info,table2=162,name=param,value=232,data=232.162,short_name='None',long_name='Covariance of omega/ozone',unit='Pa s**-1'
+info,table2=162,name=param,value=233,data=233.162,short_name='None',long_name='Variance of ozone',unit='dimensionless'
+info,table2=162,name=param,value=255,data=255.162,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=170,name=param,value=129,data=z,short_name='Z',long_name='Geopotential',unit='m**2 s**-2'
+info,table2=170,name=param,value=130,data=t,short_name='T',long_name='Temperature',unit='K'
+info,table2=170,name=param,value=131,data=u,short_name='U',long_name='U velocity',unit='m s**-1'
+info,table2=170,name=param,value=132,data=v,short_name='V',long_name='V velocity',unit='m s**-1'
+info,table2=170,name=param,value=138,data=vo,short_name='VO',long_name='Vorticity (relative)',unit='s**-1'
+info,table2=170,name=param,value=140,data=swl1,short_name='SWL1',long_name='Soil wetness level 1',unit='m'
+info,table2=170,name=param,value=141,data=sd,short_name='SD',long_name='Snow depth',unit='m of water equivalent'
+info,table2=170,name=param,value=149,data=tsw,short_name='TSW',long_name='Total soil moisture',unit='m'
+info,table2=170,name=param,value=151,data=msl,short_name='MSL',long_name='Mean sea level pressure',unit='Pa'
+info,table2=170,name=param,value=155,data=d,short_name='D',long_name='Divergence',unit='s**-1'
+info,table2=170,name=param,value=171,data=swl2,short_name='SWL2',long_name='Soil wetness level 2',unit='m'
+info,table2=170,name=param,value=179,data=ttr,short_name='TTR',long_name='Top thermal radiation',unit='W m-2'
+info,table2=170,name=param,value=184,data=swl3,short_name='SWL3',long_name='Soil wetness level 3',unit='m'
+info,table2=170,name=param,value=201,data=mx2t,short_name='MX2T',long_name='Maximum temperature at 2 metres',unit='K'
+info,table2=170,name=param,value=202,data=mn2t,short_name='MN2T',long_name='Minimum temperature at 2 metres',unit='K'
+info,table2=170,name=param,value=228,data=tp,short_name='TP',long_name='Total precipitation',unit='m'
+info,table2=170,name=param,value=255,data=255.170,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=171,name=param,value=1,data=strfa,short_name='STRFA',long_name='Stream function anomaly',unit='m**2 s**-1'
+info,table2=171,name=param,value=2,data=vpota,short_name='VPOTA',long_name='Velocity potential anomaly',unit='m**2 s**-1'
+info,table2=171,name=param,value=3,data=3.171,short_name='None',long_name='Potential temperature',unit='K'
+info,table2=171,name=param,value=4,data=4.171,short_name='None',long_name='Equivalent potential temperature',unit='K'
+info,table2=171,name=param,value=5,data=5.171,short_name='None',long_name='Saturated equivalent potential temperature',unit='K'
+info,table2=171,name=param,value=11,data=11.171,short_name='None',long_name='U component of divergent wind',unit='m s**-1'
+info,table2=171,name=param,value=12,data=12.171,short_name='None',long_name='V component of divergent wind',unit='m s**-1'
+info,table2=171,name=param,value=13,data=13.171,short_name='None',long_name='U component of rotational wind',unit='m s**-1'
+info,table2=171,name=param,value=14,data=14.171,short_name='None',long_name='V component of rotational wind',unit='m s**-1'
+info,table2=171,name=param,value=21,data=21.171,short_name='None',long_name='Unbalanced component of temperature',unit='K'
+info,table2=171,name=param,value=22,data=22.171,short_name='None',long_name='Unbalanced component of logarithm of surface pressure',unit='-'
+info,table2=171,name=param,value=23,data=23.171,short_name='None',long_name='Unbalanced component of divergence',unit='s**-1'
+info,table2=171,name=param,value=26,data=26.171,short_name='None',long_name='Lake cover',unit='(0 - 1)'
+info,table2=171,name=param,value=27,data=27.171,short_name='None',long_name='Low vegetation cover',unit='(0 - 1)'
+info,table2=171,name=param,value=28,data=28.171,short_name='None',long_name='High vegetation cover',unit='(0 - 1)'
+info,table2=171,name=param,value=29,data=29.171,short_name='None',long_name='Type of low vegetation',unit='-'
+info,table2=171,name=param,value=30,data=30.171,short_name='None',long_name='Type of high vegetation',unit='-'
+info,table2=171,name=param,value=31,data=31.171,short_name='None',long_name='Sea-ice cover',unit='(0 - 1)'
+info,table2=171,name=param,value=32,data=32.171,short_name='None',long_name='Snow albedo',unit='(0 - 1)'
+info,table2=171,name=param,value=33,data=33.171,short_name='None',long_name='Snow density',unit='kg m**-3'
+info,table2=171,name=param,value=34,data=34.171,short_name='None',long_name='Sea surface temperature',unit='K'
+info,table2=171,name=param,value=35,data=35.171,short_name='None',long_name='Ice surface temperature layer 1',unit='K'
+info,table2=171,name=param,value=36,data=36.171,short_name='None',long_name='Ice surface temperature layer 2',unit='K'
+info,table2=171,name=param,value=37,data=37.171,short_name='None',long_name='Ice surface temperature layer 3',unit='K'
+info,table2=171,name=param,value=38,data=38.171,short_name='None',long_name='Ice surface temperature layer 4',unit='K'
+info,table2=171,name=param,value=39,data=39.171,short_name='None',long_name='Volumetric soil water layer 1',unit='m**3 m**-3'
+info,table2=171,name=param,value=40,data=40.171,short_name='None',long_name='Volumetric soil water layer 2',unit='m**3 m**-3'
+info,table2=171,name=param,value=41,data=41.171,short_name='None',long_name='Volumetric soil water layer 3',unit='m**3 m**-3'
+info,table2=171,name=param,value=42,data=42.171,short_name='None',long_name='Volumetric soil water layer 4',unit='m**3 m**-3'
+info,table2=171,name=param,value=43,data=43.171,short_name='None',long_name='Soil type',unit='-'
+info,table2=171,name=param,value=44,data=44.171,short_name='None',long_name='Snow evaporation',unit='m of water'
+info,table2=171,name=param,value=45,data=45.171,short_name='None',long_name='Snowmelt',unit='m of water'
+info,table2=171,name=param,value=46,data=46.171,short_name='None',long_name='Solar duration',unit='s'
+info,table2=171,name=param,value=47,data=47.171,short_name='None',long_name='Direct solar radiation',unit='w m**-2'
+info,table2=171,name=param,value=48,data=48.171,short_name='None',long_name='Magnitude of surface stress',unit='N m**-2 s'
+info,table2=171,name=param,value=49,data=49.171,short_name='None',long_name='10 metre wind gust',unit='m s**-1'
+info,table2=171,name=param,value=50,data=50.171,short_name='None',long_name='Large-scale precipitation fraction',unit='s'
+info,table2=171,name=param,value=51,data=51.171,short_name='None',long_name='Maximum 2 metre temperature',unit='K'
+info,table2=171,name=param,value=52,data=52.171,short_name='None',long_name='Minimum 2 metre temperature',unit='K'
+info,table2=171,name=param,value=53,data=53.171,short_name='None',long_name='Montgomery potential',unit='m**2 s**-2'
+info,table2=171,name=param,value=54,data=54.171,short_name='None',long_name='Pressure',unit='Pa'
+info,table2=171,name=param,value=55,data=55.171,short_name='None',long_name='Mean 2 metre temperature in past 24 hours',unit='K'
+info,table2=171,name=param,value=56,data=56.171,short_name='None',long_name='Mean 2 metre dewpoint temperature in past 24 hours',unit='K'
+info,table2=171,name=param,value=57,data=57.171,short_name='None',long_name='Downward UV radiation at the surface',unit='w m**-2'
+info,table2=171,name=param,value=58,data=58.171,short_name='None',long_name='Photosynthetically active radiation at the surface',unit='w m**-2'
+info,table2=171,name=param,value=59,data=59.171,short_name='None',long_name='Convective available potential energy',unit='J kg**-1'
+info,table2=171,name=param,value=60,data=60.171,short_name='None',long_name='Potential vorticity',unit='K m**2 kg**-1 s**-1'
+info,table2=171,name=param,value=61,data=61.171,short_name='None',long_name='Total precipitation from observations',unit='Millimetres*100 + number of stations'
+info,table2=171,name=param,value=62,data=62.171,short_name='None',long_name='Observation count',unit='-'
+info,table2=171,name=param,value=63,data=63.171,short_name='None',long_name='Start time for skin temperature difference',unit='s'
+info,table2=171,name=param,value=64,data=64.171,short_name='None',long_name='Finish time for skin temperature difference',unit='s'
+info,table2=171,name=param,value=65,data=65.171,short_name='None',long_name='Skin temperature difference',unit='K'
+info,table2=171,name=param,value=78,data=tclwa,short_name='TCLWA',long_name='Total column liquid water anomaly',unit='kg m**-2'
+info,table2=171,name=param,value=79,data=tciwa,short_name='TCIWA',long_name='Total column ice water anomaly',unit='kg m**-2'
+info,table2=171,name=param,value=125,data=125.171,short_name='None',long_name='Vertically integrated total energy',unit='J m**-2'
+info,table2=171,name=param,value=126,data=126.171,short_name='None',long_name='Generic parameter for sensitive area prediction',unit='Various'
+info,table2=171,name=param,value=127,data=127.171,short_name='None',long_name='Atmospheric tide',unit='-'
+info,table2=171,name=param,value=128,data=128.171,short_name='None',long_name='Budget values',unit='-'
+info,table2=171,name=param,value=129,data=za,short_name='ZA',long_name='Geopotential anomaly',unit='m**2 s**-2'
+info,table2=171,name=param,value=130,data=ta,short_name='TA',long_name='Temperature anomaly',unit='K'
+info,table2=171,name=param,value=131,data=ua,short_name='UA',long_name='U velocity anomaly',unit='m s**-1'
+info,table2=171,name=param,value=132,data=va,short_name='VA',long_name='V velocity anomaly',unit='m s**-1'
+info,table2=171,name=param,value=133,data=133.171,short_name='None',long_name='Specific humidity',unit='kg kg**-1'
+info,table2=171,name=param,value=134,data=134.171,short_name='None',long_name='Surface pressure',unit='Pa'
+info,table2=171,name=param,value=135,data=135.171,short_name='None',long_name='Vertical velocity',unit='Pa s**-1'
+info,table2=171,name=param,value=136,data=136.171,short_name='None',long_name='Total column water',unit='kg m**-2'
+info,table2=171,name=param,value=137,data=137.171,short_name='None',long_name='Total column water vapour',unit='kg m**-2'
+info,table2=171,name=param,value=138,data=138.171,short_name='None',long_name='Vorticity (relative)',unit='s**-1'
+info,table2=171,name=param,value=139,data=139.171,short_name='None',long_name='Soil temperature level 1',unit='K'
+info,table2=171,name=param,value=140,data=140.171,short_name='None',long_name='Soil wetness level 1',unit='m of water'
+info,table2=171,name=param,value=141,data=141.171,short_name='None',long_name='Snow depth',unit='m of water equivalent'
+info,table2=171,name=param,value=142,data=142.171,short_name='None',long_name='Stratiform precipitation (Large-scale precipitation)',unit='m'
+info,table2=171,name=param,value=143,data=143.171,short_name='None',long_name='Convective precipitation',unit='m'
+info,table2=171,name=param,value=144,data=144.171,short_name='None',long_name='Snowfall (convective + stratiform)',unit='m of water equivalent'
+info,table2=171,name=param,value=145,data=145.171,short_name='None',long_name='Boundary layer dissipation',unit='W m**-2 s'
+info,table2=171,name=param,value=146,data=146.171,short_name='None',long_name='Surface sensible heat flux',unit='W m**-2 s'
+info,table2=171,name=param,value=147,data=147.171,short_name='None',long_name='Surface latent heat flux',unit='W m**-2 s'
+info,table2=171,name=param,value=148,data=148.171,short_name='None',long_name='Charnock',unit='-'
+info,table2=171,name=param,value=149,data=149.171,short_name='None',long_name='Surface net radiation',unit='W m**-2 s'
+info,table2=171,name=param,value=150,data=150.171,short_name='None',long_name='Top net radiation',unit='-'
+info,table2=171,name=param,value=151,data=msla,short_name='MSLA',long_name='Mean sea level pressure anomaly',unit='Pa'
+info,table2=171,name=param,value=152,data=152.171,short_name='None',long_name='Logarithm of surface pressure',unit='-'
+info,table2=171,name=param,value=153,data=153.171,short_name='None',long_name='Short-wave heating rate',unit='K'
+info,table2=171,name=param,value=154,data=154.171,short_name='None',long_name='Long-wave heating rate',unit='K'
+info,table2=171,name=param,value=155,data=155.171,short_name='None',long_name='Divergence',unit='s**-1'
+info,table2=171,name=param,value=156,data=156.171,short_name='None',long_name='Height',unit='m'
+info,table2=171,name=param,value=157,data=157.171,short_name='None',long_name='Relative humidity',unit='%'
+info,table2=171,name=param,value=158,data=158.171,short_name='None',long_name='Tendency of surface pressure',unit='Pa s**-1'
+info,table2=171,name=param,value=159,data=159.171,short_name='None',long_name='Boundary layer height',unit='m'
+info,table2=171,name=param,value=160,data=160.171,short_name='None',long_name='Standard deviation of orography',unit='-'
+info,table2=171,name=param,value=161,data=161.171,short_name='None',long_name='Anisotropy of sub-gridscale orography',unit='-'
+info,table2=171,name=param,value=162,data=162.171,short_name='None',long_name='Angle of sub-gridscale orography',unit='rad'
+info,table2=171,name=param,value=163,data=163.171,short_name='None',long_name='Slope of sub-gridscale orography',unit='-'
+info,table2=171,name=param,value=164,data=tcca,short_name='TCCA',long_name='Total cloud cover anomaly',unit='(0 - 1)'
+info,table2=171,name=param,value=165,data=10ua,short_name='10UA',long_name='10 metre U wind component anomaly',unit='m s**-1'
+info,table2=171,name=param,value=166,data=10va,short_name='10VA',long_name='10 metre V wind component anomaly',unit='m s**-1'
+info,table2=171,name=param,value=167,data=2ta,short_name='2TA',long_name='2 metre temperature anomaly',unit='K'
+info,table2=171,name=param,value=168,data=168.171,short_name='None',long_name='2 metre dewpoint temperature',unit='K'
+info,table2=171,name=param,value=169,data=169.171,short_name='None',long_name='Surface solar radiation downwards',unit='W m**-2 s'
+info,table2=171,name=param,value=170,data=170.171,short_name='None',long_name='Soil temperature level 2',unit='K'
+info,table2=171,name=param,value=171,data=171.171,short_name='None',long_name='Soil wetness level 2',unit='m of water'
+info,table2=171,name=param,value=172,data=172.171,short_name='None',long_name='Land-sea mask',unit='(0 - 1)'
+info,table2=171,name=param,value=173,data=173.171,short_name='None',long_name='Surface roughness',unit='m'
+info,table2=171,name=param,value=174,data=174.171,short_name='None',long_name='Albedo',unit='(0 - 1)'
+info,table2=171,name=param,value=175,data=175.171,short_name='None',long_name='Surface thermal radiation downwards',unit='W m**-2 s'
+info,table2=171,name=param,value=176,data=176.171,short_name='None',long_name='Surface solar radiation',unit='W m**-2 s'
+info,table2=171,name=param,value=177,data=177.171,short_name='None',long_name='Surface thermal radiation',unit='W m**-2 s'
+info,table2=171,name=param,value=178,data=178.171,short_name='None',long_name='Top solar radiation',unit='W m**-2 s'
+info,table2=171,name=param,value=179,data=179.171,short_name='None',long_name='Top thermal radiation',unit='W m**-2 s'
+info,table2=171,name=param,value=180,data=180.171,short_name='None',long_name='East-West surface stress',unit='N m**-2 s'
+info,table2=171,name=param,value=181,data=181.171,short_name='None',long_name='North-South surface stress',unit='N m**-2 s'
+info,table2=171,name=param,value=182,data=182.171,short_name='None',long_name='Evaporation',unit='m of water'
+info,table2=171,name=param,value=183,data=183.171,short_name='None',long_name='Soil temperature level 3',unit='K'
+info,table2=171,name=param,value=184,data=184.171,short_name='None',long_name='Soil wetness level 3',unit='m of water'
+info,table2=171,name=param,value=185,data=185.171,short_name='None',long_name='Convective cloud cover',unit='(0 - 1)'
+info,table2=171,name=param,value=186,data=186.171,short_name='None',long_name='Low cloud cover',unit='(0 - 1)'
+info,table2=171,name=param,value=187,data=187.171,short_name='None',long_name='Medium cloud cover',unit='(0 - 1)'
+info,table2=171,name=param,value=188,data=188.171,short_name='None',long_name='High cloud cover',unit='(0 - 1)'
+info,table2=171,name=param,value=189,data=sunda,short_name='SUNDA',long_name='Sunshine duration anomaly',unit='s'
+info,table2=171,name=param,value=190,data=190.171,short_name='None',long_name='East-West component of sub-gridscale orographic variance',unit='m**2'
+info,table2=171,name=param,value=191,data=191.171,short_name='None',long_name='North-South component of sub-gridscale orographic variance',unit='m**2'
+info,table2=171,name=param,value=192,data=192.171,short_name='None',long_name='North-West/South-East component of sub-gridscale orographic variance',unit='m**2'
+info,table2=171,name=param,value=193,data=193.171,short_name='None',long_name='North-East/South-West component of sub-gridscale orographic variance',unit='m**2'
+info,table2=171,name=param,value=194,data=194.171,short_name='None',long_name='Brightness temperature',unit='K'
+info,table2=171,name=param,value=195,data=195.171,short_name='None',long_name='Latitudinal component of gravity wave stress',unit='N m**-2 s'
+info,table2=171,name=param,value=196,data=196.171,short_name='None',long_name='Meridional component of gravity wave stress',unit='N m**-2 s'
+info,table2=171,name=param,value=197,data=197.171,short_name='None',long_name='Gravity wave dissipation',unit='W m**-2 s'
+info,table2=171,name=param,value=198,data=198.171,short_name='None',long_name='Skin reservoir content',unit='m of water'
+info,table2=171,name=param,value=199,data=199.171,short_name='None',long_name='Vegetation fraction',unit='(0 - 1)'
+info,table2=171,name=param,value=200,data=200.171,short_name='None',long_name='Variance of sub-gridscale orography',unit='m**2'
+info,table2=171,name=param,value=201,data=mx2ta,short_name='MX2TA',long_name='Maximum temperature at 2 metres anomaly',unit='K'
+info,table2=171,name=param,value=202,data=mn2ta,short_name='MN2TA',long_name='Minimum temperature at 2 metres anomaly',unit='K'
+info,table2=171,name=param,value=203,data=203.171,short_name='None',long_name='Ozone mass mixing ratio',unit='kg kg**-1'
+info,table2=171,name=param,value=204,data=204.171,short_name='None',long_name='Precipitation analysis weights',unit='-'
+info,table2=171,name=param,value=205,data=205.171,short_name='None',long_name='Runoff',unit='m'
+info,table2=171,name=param,value=206,data=206.171,short_name='None',long_name='Total column ozone',unit='kg m**-2'
+info,table2=171,name=param,value=207,data=207.171,short_name='None',long_name='10 metre wind speed',unit='m s**-1'
+info,table2=171,name=param,value=208,data=208.171,short_name='None',long_name='Top net solar radiation, clear sky',unit='W m**-2 s'
+info,table2=171,name=param,value=209,data=209.171,short_name='None',long_name='Top net thermal radiation, clear sky',unit='W m**-2 s'
+info,table2=171,name=param,value=210,data=210.171,short_name='None',long_name='Surface net solar radiation, clear sky',unit='W m**-2 s'
+info,table2=171,name=param,value=211,data=211.171,short_name='None',long_name='Surface net thermal radiation, clear sky',unit='W m**-2 s'
+info,table2=171,name=param,value=212,data=212.171,short_name='None',long_name='Solar insolation',unit='W m**-2'
+info,table2=171,name=param,value=214,data=214.171,short_name='None',long_name='Diabatic heating by radiation',unit='K'
+info,table2=171,name=param,value=215,data=215.171,short_name='None',long_name='Diabatic heating by vertical diffusion',unit='K'
+info,table2=171,name=param,value=216,data=216.171,short_name='None',long_name='Diabatic heating by cumulus convection',unit='K'
+info,table2=171,name=param,value=217,data=217.171,short_name='None',long_name='Diabatic heating by large-scale condensation',unit='K'
+info,table2=171,name=param,value=218,data=218.171,short_name='None',long_name='Vertical diffusion of zonal wind',unit='m s**-1'
+info,table2=171,name=param,value=219,data=219.171,short_name='None',long_name='Vertical diffusion of meridional wind',unit='m s**-1'
+info,table2=171,name=param,value=220,data=220.171,short_name='None',long_name='East-West gravity wave drag tendency',unit='m s**-1'
+info,table2=171,name=param,value=221,data=221.171,short_name='None',long_name='North-South gravity wave drag tendency',unit='m s**-1'
+info,table2=171,name=param,value=222,data=222.171,short_name='None',long_name='Convective tendency of zonal wind',unit='m s**-1'
+info,table2=171,name=param,value=223,data=223.171,short_name='None',long_name='Convective tendency of meridional wind',unit='m s**-1'
+info,table2=171,name=param,value=224,data=224.171,short_name='None',long_name='Vertical diffusion of humidity',unit='kg kg**-1'
+info,table2=171,name=param,value=225,data=225.171,short_name='None',long_name='Humidity tendency by cumulus convection',unit='kg kg**-1'
+info,table2=171,name=param,value=226,data=226.171,short_name='None',long_name='Humidity tendency by large-scale condensation',unit='kg kg**-1'
+info,table2=171,name=param,value=227,data=227.171,short_name='None',long_name='Change from removal of negative humidity',unit='kg kg**-1'
+info,table2=171,name=param,value=228,data=tpa,short_name='TPA',long_name='Total precipitation anomaly',unit='m'
+info,table2=171,name=param,value=229,data=229.171,short_name='None',long_name='Instantaneous X surface stress',unit='N m**-2'
+info,table2=171,name=param,value=230,data=230.171,short_name='None',long_name='Instantaneous Y surface stress',unit='N m**-2'
+info,table2=171,name=param,value=231,data=231.171,short_name='None',long_name='Instantaneous surface heat flux',unit='W m**-2'
+info,table2=171,name=param,value=232,data=232.171,short_name='None',long_name='Instantaneous moisture flux',unit='kg m**-2 s'
+info,table2=171,name=param,value=233,data=233.171,short_name='None',long_name='Apparent surface humidity',unit='kg kg**-1'
+info,table2=171,name=param,value=234,data=234.171,short_name='None',long_name='Logarithm of surface roughness length for heat',unit='-'
+info,table2=171,name=param,value=235,data=235.171,short_name='None',long_name='Skin temperature',unit='K'
+info,table2=171,name=param,value=236,data=236.171,short_name='None',long_name='Soil temperature level 4',unit='K'
+info,table2=171,name=param,value=237,data=237.171,short_name='None',long_name='Soil wetness level 4',unit='m'
+info,table2=171,name=param,value=238,data=238.171,short_name='None',long_name='Temperature of snow layer',unit='K'
+info,table2=171,name=param,value=239,data=239.171,short_name='None',long_name='Convective snowfall',unit='m of water equivalent'
+info,table2=171,name=param,value=240,data=240.171,short_name='None',long_name='Large-scale snowfall',unit='m of water equivalent'
+info,table2=171,name=param,value=241,data=241.171,short_name='None',long_name='Accumulated cloud fraction tendency',unit='(-1 to 1)'
+info,table2=171,name=param,value=242,data=242.171,short_name='None',long_name='Accumulated liquid water tendency',unit='(-1 to 1)'
+info,table2=171,name=param,value=243,data=243.171,short_name='None',long_name='Forecast albedo',unit='(0 - 1)'
+info,table2=171,name=param,value=244,data=244.171,short_name='None',long_name='Forecast surface roughness',unit='m'
+info,table2=171,name=param,value=245,data=245.171,short_name='None',long_name='Forecast logarithm of surface roughness for heat',unit='-'
+info,table2=171,name=param,value=246,data=246.171,short_name='None',long_name='Cloud liquid water content',unit='kg kg**-1'
+info,table2=171,name=param,value=247,data=247.171,short_name='None',long_name='Cloud ice water content',unit='kg kg**-1'
+info,table2=171,name=param,value=248,data=248.171,short_name='None',long_name='Cloud cover',unit='(0 - 1)'
+info,table2=171,name=param,value=249,data=249.171,short_name='None',long_name='Accumulated ice water tendency',unit='(-1 to 1)'
+info,table2=171,name=param,value=250,data=250.171,short_name='None',long_name='Ice age',unit='(0 - 1)'
+info,table2=171,name=param,value=251,data=251.171,short_name='None',long_name='Adiabatic tendency of temperature',unit='K'
+info,table2=171,name=param,value=252,data=252.171,short_name='None',long_name='Adiabatic tendency of humidity',unit='kg kg**-1'
+info,table2=171,name=param,value=253,data=253.171,short_name='None',long_name='Adiabatic tendency of zonal wind',unit='m s**-1'
+info,table2=171,name=param,value=254,data=254.171,short_name='None',long_name='Adiabatic tendency of meridional wind',unit='m s**-1'
+info,table2=171,name=param,value=255,data=255.171,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=172,name=param,value=44,data=44.172,short_name='None',long_name='Snow evaporation',unit='m of water s**-1'
+info,table2=172,name=param,value=45,data=45.172,short_name='None',long_name='Snowmelt',unit='m of water s**-1'
+info,table2=172,name=param,value=48,data=48.172,short_name='None',long_name='Magnitude of surface stress',unit='N m**-2'
+info,table2=172,name=param,value=50,data=50.172,short_name='None',long_name='Large-scale precipitation fraction',unit='-'
+info,table2=172,name=param,value=142,data=142.172,short_name='None',long_name='Stratiform precipitation (Large-scale precipitation)',unit='m s**-1'
+info,table2=172,name=param,value=143,data=143.172,short_name='None',long_name='Convective precipitation',unit='m s**-1'
+info,table2=172,name=param,value=144,data=144.172,short_name='None',long_name='Snowfall (convective + stratiform)',unit='m of water equivalent s**-1'
+info,table2=172,name=param,value=145,data=145.172,short_name='None',long_name='Boundary layer dissipation',unit='W m**-2'
+info,table2=172,name=param,value=146,data=146.172,short_name='None',long_name='Surface sensible heat flux',unit='W m**-2'
+info,table2=172,name=param,value=147,data=147.172,short_name='None',long_name='Surface latent heat flux',unit='W m**-2'
+info,table2=172,name=param,value=149,data=149.172,short_name='None',long_name='Surface net radiation',unit='W m**-2'
+info,table2=172,name=param,value=153,data=153.172,short_name='None',long_name='Short-wave heating rate',unit='K s**-1'
+info,table2=172,name=param,value=154,data=154.172,short_name='None',long_name='Long-wave heating rate',unit='K s**-1'
+info,table2=172,name=param,value=169,data=169.172,short_name='None',long_name='Surface solar radiation downwards',unit='W m**-2'
+info,table2=172,name=param,value=175,data=175.172,short_name='None',long_name='Surface thermal radiation downwards',unit='W m**-2'
+info,table2=172,name=param,value=176,data=176.172,short_name='None',long_name='Surface solar radiation',unit='W m**-2'
+info,table2=172,name=param,value=177,data=177.172,short_name='None',long_name='Surface thermal radiation',unit='W m**-2'
+info,table2=172,name=param,value=178,data=178.172,short_name='None',long_name='Top solar radiation',unit='W m**-2'
+info,table2=172,name=param,value=179,data=179.172,short_name='None',long_name='Top thermal radiation',unit='W m**-2'
+info,table2=172,name=param,value=180,data=180.172,short_name='None',long_name='East-West surface stress',unit='N m**-2'
+info,table2=172,name=param,value=181,data=181.172,short_name='None',long_name='North-South surface stress',unit='N m**-2'
+info,table2=172,name=param,value=182,data=182.172,short_name='None',long_name='Evaporation',unit='m of water s**-1'
+info,table2=172,name=param,value=189,data=189.172,short_name='None',long_name='Sunshine duration',unit='-'
+info,table2=172,name=param,value=195,data=195.172,short_name='None',long_name='Latitudinal component of gravity wave stress',unit='N m**-2'
+info,table2=172,name=param,value=196,data=196.172,short_name='None',long_name='Meridional component of gravity wave stress',unit='N m**-2'
+info,table2=172,name=param,value=197,data=197.172,short_name='None',long_name='Gravity wave dissipation',unit='W m**-2'
+info,table2=172,name=param,value=205,data=205.172,short_name='None',long_name='Runoff',unit='m s**-1'
+info,table2=172,name=param,value=208,data=208.172,short_name='None',long_name='Top net solar radiation, clear sky',unit='W m**-2'
+info,table2=172,name=param,value=209,data=209.172,short_name='None',long_name='Top net thermal radiation, clear sky',unit='W m**-2'
+info,table2=172,name=param,value=210,data=210.172,short_name='None',long_name='Surface net solar radiation, clear sky',unit='W m**-2'
+info,table2=172,name=param,value=211,data=211.172,short_name='None',long_name='Surface net thermal radiation, clear sky',unit='W m**-2'
+info,table2=172,name=param,value=212,data=212.172,short_name='None',long_name='Solar insolation',unit='W m**-2 s**-1'
+info,table2=172,name=param,value=228,data=228.172,short_name='None',long_name='Total precipitation',unit='m s**-1'
+info,table2=172,name=param,value=239,data=239.172,short_name='None',long_name='Convective snowfall',unit='m of water equivalent s**-1'
+info,table2=172,name=param,value=240,data=240.172,short_name='None',long_name='Large-scale snowfall',unit='m of water equivalent s**-1'
+info,table2=172,name=param,value=255,data=255.172,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=173,name=param,value=44,data=44.173,short_name='None',long_name='Snow evaporation anomaly',unit='m of water s**-1'
+info,table2=173,name=param,value=45,data=45.173,short_name='None',long_name='Snowmelt anomaly',unit='m of water s**-1'
+info,table2=173,name=param,value=48,data=48.173,short_name='None',long_name='Magnitude of surface stress anomaly',unit='N m**-2'
+info,table2=173,name=param,value=50,data=50.173,short_name='None',long_name='Large-scale precipitation fraction anomaly',unit='-'
+info,table2=173,name=param,value=142,data=142.173,short_name='None',long_name='Stratiform precipitation (Large-scale precipitation) anomaly',unit='m s**-1'
+info,table2=173,name=param,value=143,data=143.173,short_name='None',long_name='Convective precipitation anomaly',unit='m s**-1'
+info,table2=173,name=param,value=144,data=sfara,short_name='SFARA',long_name='Snowfall (convective + stratiform) anomalous rate of accumulation',unit='m of water equivalent s**-1'
+info,table2=173,name=param,value=145,data=145.173,short_name='None',long_name='Boundary layer dissipation anomaly',unit='W m**-2'
+info,table2=173,name=param,value=146,data=146.173,short_name='None',long_name='Surface sensible heat flux anomaly',unit='W m**-2'
+info,table2=173,name=param,value=147,data=147.173,short_name='None',long_name='Surface latent heat flux anomaly',unit='W m**-2'
+info,table2=173,name=param,value=149,data=149.173,short_name='None',long_name='Surface net radiation anomaly',unit='W m**-2'
+info,table2=173,name=param,value=153,data=153.173,short_name='None',long_name='Short-wave heating rate anomaly',unit='K s**-1'
+info,table2=173,name=param,value=154,data=154.173,short_name='None',long_name='Long-wave heating rate anomaly',unit='K s**-1'
+info,table2=173,name=param,value=169,data=169.173,short_name='None',long_name='Surface solar radiation downwards anomaly',unit='W m**-2'
+info,table2=173,name=param,value=175,data=175.173,short_name='None',long_name='Surface thermal radiation downwards anomaly',unit='W m**-2'
+info,table2=173,name=param,value=176,data=176.173,short_name='None',long_name='Surface solar radiation anomaly',unit='W m**-2'
+info,table2=173,name=param,value=177,data=177.173,short_name='None',long_name='Surface thermal radiation anomaly',unit='W m**-2'
+info,table2=173,name=param,value=178,data=178.173,short_name='None',long_name='Top solar radiation anomaly',unit='W m**-2'
+info,table2=173,name=param,value=179,data=179.173,short_name='None',long_name='Top thermal radiation anomaly',unit='W m**-2'
+info,table2=173,name=param,value=180,data=180.173,short_name='None',long_name='East-West surface stress anomaly',unit='N m**-2'
+info,table2=173,name=param,value=181,data=181.173,short_name='None',long_name='North-South surface stress anomaly',unit='N m**-2'
+info,table2=173,name=param,value=182,data=182.173,short_name='None',long_name='Evaporation anomaly',unit='m of water s**-1'
+info,table2=173,name=param,value=189,data=sundara,short_name='SUNDARA',long_name='Sunshine duration anomalous rate of accumulation',unit='dimensionless'
+info,table2=173,name=param,value=195,data=195.173,short_name='None',long_name='Latitudinal component of gravity wave stress anomaly',unit='N m**-2'
+info,table2=173,name=param,value=196,data=196.173,short_name='None',long_name='Meridional component of gravity wave stress anomaly',unit='N m**-2'
+info,table2=173,name=param,value=197,data=197.173,short_name='None',long_name='Gravity wave dissipation anomaly',unit='W m**-2'
+info,table2=173,name=param,value=205,data=205.173,short_name='None',long_name='Runoff anomaly',unit='m s**-1'
+info,table2=173,name=param,value=208,data=208.173,short_name='None',long_name='Top net solar radiation, clear sky anomaly',unit='W m**-2'
+info,table2=173,name=param,value=209,data=209.173,short_name='None',long_name='Top net thermal radiation, clear sky anomaly',unit='W m**-2'
+info,table2=173,name=param,value=210,data=210.173,short_name='None',long_name='Surface net solar radiation, clear sky anomaly',unit='W m**-2'
+info,table2=173,name=param,value=211,data=211.173,short_name='None',long_name='Surface net thermal radiation, clear sky anomaly',unit='W m**-2'
+info,table2=173,name=param,value=212,data=212.173,short_name='None',long_name='Solar insolation anomaly',unit='W m**-2 s**-1'
+info,table2=173,name=param,value=228,data=tpara,short_name='TPARA',long_name='Total precipitation anomalous rate of accumulation',unit='m s**-1'
+info,table2=173,name=param,value=239,data=239.173,short_name='None',long_name='Convective snowfall anomaly',unit='m of water equivalent s**-1'
+info,table2=173,name=param,value=240,data=240.173,short_name='None',long_name='Large-scale snowfall anomaly',unit='m of water equivalent s**-1'
+info,table2=173,name=param,value=255,data=255.173,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=174,name=param,value=6,data=6.174,short_name='None',long_name='Total soil moisture',unit='m'
+info,table2=174,name=param,value=8,data=sro,short_name='SRO',long_name='Surface runoff',unit='kg m**-2'
+info,table2=174,name=param,value=9,data=ssro,short_name='SSRO',long_name='Sub-surface runoff',unit='kg m**-2'
+info,table2=174,name=param,value=31,data=31.174,short_name='None',long_name='Fraction of sea-ice in sea',unit='(0 - 1)'
+info,table2=174,name=param,value=34,data=34.174,short_name='None',long_name='Open-sea surface temperature',unit='K'
+info,table2=174,name=param,value=39,data=39.174,short_name='None',long_name='Volumetric soil water layer 1',unit='m**3 m**-3'
+info,table2=174,name=param,value=40,data=40.174,short_name='None',long_name='Volumetric soil water layer 2',unit='m**3 m**-3'
+info,table2=174,name=param,value=41,data=41.174,short_name='None',long_name='Volumetric soil water layer 3',unit='m**3 m**-3'
+info,table2=174,name=param,value=42,data=42.174,short_name='None',long_name='Volumetric soil water layer 4',unit='m**3 m**-3'
+info,table2=174,name=param,value=49,data=49.174,short_name='None',long_name='10 metre wind gust over last 24 hours',unit='m s**-1'
+info,table2=174,name=param,value=55,data=55.174,short_name='None',long_name='1.5m temperature - mean over last 24 hours',unit='K'
+info,table2=174,name=param,value=83,data=83.174,short_name='None',long_name='Net primary productivity',unit='kg C m**-2 s**-1'
+info,table2=174,name=param,value=85,data=85.174,short_name='None',long_name='10m U wind over land',unit='m s**-1'
+info,table2=174,name=param,value=86,data=86.174,short_name='None',long_name='10m V wind over land',unit='m s**-1'
+info,table2=174,name=param,value=87,data=87.174,short_name='None',long_name='1.5m temperature over land',unit='K'
+info,table2=174,name=param,value=88,data=88.174,short_name='None',long_name='1.5m dewpoint temperature over land',unit='K'
+info,table2=174,name=param,value=89,data=89.174,short_name='None',long_name='Top incoming solar radiation',unit='W m**-2 s'
+info,table2=174,name=param,value=90,data=90.174,short_name='None',long_name='Top outgoing solar radiation',unit='W m**-2 s'
+info,table2=174,name=param,value=94,data=94.174,short_name='None',long_name='Mean sea surface temperature',unit='K'
+info,table2=174,name=param,value=95,data=95.174,short_name='None',long_name='1.5m specific humidity',unit='kg kg**-1'
+info,table2=174,name=param,value=98,data=98.174,short_name='None',long_name='Sea-ice thickness',unit='m'
+info,table2=174,name=param,value=99,data=99.174,short_name='None',long_name='Liquid water potential temperature',unit='K'
+info,table2=174,name=param,value=110,data=110.174,short_name='None',long_name='Ocean ice concentration',unit='(0 - 1)'
+info,table2=174,name=param,value=111,data=111.174,short_name='None',long_name='Ocean mean ice depth',unit='m'
+info,table2=174,name=param,value=139,data=139.174,short_name='None',long_name='Soil temperature layer 1',unit='K'
+info,table2=174,name=param,value=164,data=164.174,short_name='None',long_name='Average potential temperature in upper 293.4m',unit='degrees C'
+info,table2=174,name=param,value=167,data=167.174,short_name='None',long_name='1.5m temperature',unit='K'
+info,table2=174,name=param,value=168,data=168.174,short_name='None',long_name='1.5m dewpoint temperature',unit='K'
+info,table2=174,name=param,value=170,data=170.174,short_name='None',long_name='Soil temperature layer 2',unit='K'
+info,table2=174,name=param,value=172,data=172.174,short_name='None',long_name='Fractional land mask',unit='(0 - 1)'
+info,table2=174,name=param,value=175,data=175.174,short_name='None',long_name='Average salinity in upper 293.4m',unit='psu'
+info,table2=174,name=param,value=183,data=183.174,short_name='None',long_name='Soil temperature layer 3',unit='K'
+info,table2=174,name=param,value=201,data=201.174,short_name='None',long_name='1.5m temperature - maximum over last 24 hours',unit='K'
+info,table2=174,name=param,value=202,data=202.174,short_name='None',long_name='1.5m temperature - minimum over last 24 hours',unit='K'
+info,table2=174,name=param,value=236,data=236.174,short_name='None',long_name='Soil temperature layer 4',unit='K'
+info,table2=174,name=param,value=255,data=255.174,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=175,name=param,value=6,data=6.175,short_name='None',long_name='Total soil moisture',unit='m'
+info,table2=175,name=param,value=31,data=31.175,short_name='None',long_name='Fraction of sea-ice in sea',unit='(0 - 1)'
+info,table2=175,name=param,value=34,data=34.175,short_name='None',long_name='Open-sea surface temperature',unit='K'
+info,table2=175,name=param,value=39,data=39.175,short_name='None',long_name='Volumetric soil water layer 1',unit='m**3 m**-3'
+info,table2=175,name=param,value=40,data=40.175,short_name='None',long_name='Volumetric soil water layer 2',unit='m**3 m**-3'
+info,table2=175,name=param,value=41,data=41.175,short_name='None',long_name='Volumetric soil water layer 3',unit='m**3 m**-3'
+info,table2=175,name=param,value=42,data=42.175,short_name='None',long_name='Volumetric soil water layer 4',unit='m**3 m**-3'
+info,table2=175,name=param,value=49,data=49.175,short_name='None',long_name='10m wind gust over last 24 hours',unit='m s**-1'
+info,table2=175,name=param,value=55,data=55.175,short_name='None',long_name='1.5m temperature - mean over last 24 hours',unit='K'
+info,table2=175,name=param,value=83,data=83.175,short_name='None',long_name='Net primary productivity',unit='kg C m**-2 s**-1'
+info,table2=175,name=param,value=85,data=85.175,short_name='None',long_name='10m U wind over land',unit='m s**-1'
+info,table2=175,name=param,value=86,data=86.175,short_name='None',long_name='10m V wind over land',unit='m s**-1'
+info,table2=175,name=param,value=87,data=87.175,short_name='None',long_name='1.5m temperature over land',unit='K'
+info,table2=175,name=param,value=88,data=88.175,short_name='None',long_name='1.5m dewpoint temperature over land',unit='K'
+info,table2=175,name=param,value=89,data=89.175,short_name='None',long_name='Top incoming solar radiation',unit='W m**-2 s'
+info,table2=175,name=param,value=90,data=90.175,short_name='None',long_name='Top outgoing solar radiation',unit='W m**-2 s'
+info,table2=175,name=param,value=110,data=110.175,short_name='None',long_name='Ocean ice concentration',unit='(0 - 1)'
+info,table2=175,name=param,value=111,data=111.175,short_name='None',long_name='Ocean mean ice depth',unit='m'
+info,table2=175,name=param,value=139,data=139.175,short_name='None',long_name='Soil temperature layer 1',unit='K'
+info,table2=175,name=param,value=164,data=164.175,short_name='None',long_name='Average potential temperature in upper 293.4m',unit='degrees C'
+info,table2=175,name=param,value=167,data=167.175,short_name='None',long_name='1.5m temperature',unit='K'
+info,table2=175,name=param,value=168,data=168.175,short_name='None',long_name='1.5m dewpoint temperature',unit='K'
+info,table2=175,name=param,value=170,data=170.175,short_name='None',long_name='Soil temperature layer 2',unit='K'
+info,table2=175,name=param,value=172,data=172.175,short_name='None',long_name='Fractional land mask',unit='(0 - 1)'
+info,table2=175,name=param,value=175,data=175.175,short_name='None',long_name='Average salinity in upper 293.4m',unit='psu'
+info,table2=175,name=param,value=183,data=183.175,short_name='None',long_name='Soil temperature layer 3',unit='K'
+info,table2=175,name=param,value=201,data=201.175,short_name='None',long_name='1.5m temperature - maximum over last 24 hours',unit='K'
+info,table2=175,name=param,value=202,data=202.175,short_name='None',long_name='1.5m temperature - minimum over last 24 hours',unit='K'
+info,table2=175,name=param,value=236,data=236.175,short_name='None',long_name='Soil temperature layer 4',unit='K'
+info,table2=175,name=param,value=255,data=255.175,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=180,name=param,value=129,data=z,short_name='Z',long_name='Geopotential',unit='m**2 s**-2'
+info,table2=180,name=param,value=130,data=t,short_name='T',long_name='Temperature',unit='K'
+info,table2=180,name=param,value=131,data=u,short_name='U',long_name='U velocity',unit='m s**-1'
+info,table2=180,name=param,value=132,data=v,short_name='V',long_name='V velocity',unit='m s**-1'
+info,table2=180,name=param,value=133,data=q,short_name='Q',long_name='Specific humidity',unit='kg kg**-1'
+info,table2=180,name=param,value=134,data=sp,short_name='SP',long_name='Surface pressure',unit='Pa'
+info,table2=180,name=param,value=137,data=tcwv,short_name='TCWV',long_name='Total column water vapour',unit='kg m**-2'
+info,table2=180,name=param,value=138,data=vo,short_name='VO',long_name='Vorticity (relative)',unit='s**-1'
+info,table2=180,name=param,value=141,data=sd,short_name='SD',long_name='Snow depth',unit='m of water equivalent'
+info,table2=180,name=param,value=142,data=lsp,short_name='LSP',long_name='Large-scale precipitation',unit='m'
+info,table2=180,name=param,value=143,data=cp,short_name='CP',long_name='Convective precipitation',unit='m'
+info,table2=180,name=param,value=144,data=sf,short_name='SF',long_name='Snowfall',unit='m of water equivalent'
+info,table2=180,name=param,value=146,data=sshf,short_name='SSHF',long_name='Surface sensible heat flux',unit='W m**-2 s'
+info,table2=180,name=param,value=147,data=slhf,short_name='SLHF',long_name='Surface latent heat flux',unit='W m**-2 s'
+info,table2=180,name=param,value=149,data=tsw,short_name='TSW',long_name='Total soil wetness',unit='m'
+info,table2=180,name=param,value=151,data=msl,short_name='MSL',long_name='Mean sea level pressure',unit='Pa'
+info,table2=180,name=param,value=155,data=d,short_name='D',long_name='Divergence',unit='s**-1'
+info,table2=180,name=param,value=164,data=tcc,short_name='TCC',long_name='Total cloud cover',unit='(0 - 1)'
+info,table2=180,name=param,value=165,data=10u,short_name='10U',long_name='10 metre U wind component',unit='m s**-1'
+info,table2=180,name=param,value=166,data=10v,short_name='10V',long_name='10 metre V wind component',unit='m s**-1'
+info,table2=180,name=param,value=167,data=2t,short_name='2T',long_name='2 metre temperature',unit='K'
+info,table2=180,name=param,value=168,data=2d,short_name='2D',long_name='2 metre dewpoint temperature',unit='K'
+info,table2=180,name=param,value=172,data=lsm,short_name='LSM',long_name='Land-sea mask',unit='(0 - 1)'
+info,table2=180,name=param,value=176,data=ssr,short_name='SSR',long_name='Surface solar radiation',unit='J m**-2 s'
+info,table2=180,name=param,value=177,data=str,short_name='STR',long_name='Surface thermal radiation',unit='J m**-2 s'
+info,table2=180,name=param,value=178,data=tsr,short_name='TSR',long_name='Top solar radiation',unit='J m**-2 s'
+info,table2=180,name=param,value=179,data=ttr,short_name='TTR',long_name='Top thermal radiation',unit='J m**-2 s'
+info,table2=180,name=param,value=180,data=ewss,short_name='EWSS',long_name='East-West surface stress',unit='N m**-2 s'
+info,table2=180,name=param,value=181,data=nsss,short_name='NSSS',long_name='North-South surface stress',unit='N m**-2 s'
+info,table2=180,name=param,value=182,data=e,short_name='E',long_name='Evaporation',unit='m of water'
+info,table2=180,name=param,value=205,data=ro,short_name='RO',long_name='Runoff',unit='m'
+info,table2=180,name=param,value=255,data=255.180,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=190,name=param,value=129,data=z,short_name='Z',long_name='Geopotential',unit='m**2 s**-2'
+info,table2=190,name=param,value=130,data=t,short_name='T',long_name='Temperature',unit='K'
+info,table2=190,name=param,value=131,data=u,short_name='U',long_name='U velocity',unit='m s**-1'
+info,table2=190,name=param,value=132,data=v,short_name='V',long_name='V velocity',unit='m s**-1'
+info,table2=190,name=param,value=133,data=q,short_name='Q',long_name='Specific humidity',unit='kg kg**-1'
+info,table2=190,name=param,value=139,data=stl1,short_name='STL1',long_name='Soil temperature level 1',unit='K'
+info,table2=190,name=param,value=141,data=sd,short_name='SD',long_name='Snow depth',unit='m of water'
+info,table2=190,name=param,value=146,data=sshf,short_name='SSHF',long_name='Surface sensible heat flux',unit='W m**-2 s'
+info,table2=190,name=param,value=147,data=slhf,short_name='SLHF',long_name='Surface latent heat flux',unit='W m**-2 s'
+info,table2=190,name=param,value=151,data=msl,short_name='MSL',long_name='Mean sea level pressure',unit='Pa'
+info,table2=190,name=param,value=164,data=tcc,short_name='TCC',long_name='Total cloud cover',unit='(0 - 1)'
+info,table2=190,name=param,value=165,data=10u,short_name='10U',long_name='10 metre U wind component',unit='m s**-1'
+info,table2=190,name=param,value=166,data=10v,short_name='10V',long_name='10 metre V wind component',unit='m s**-1'
+info,table2=190,name=param,value=167,data=2t,short_name='2T',long_name='2 metre temperature',unit='K'
+info,table2=190,name=param,value=168,data=2d,short_name='2D',long_name='2 metre dewpoint temperature',unit='K'
+info,table2=190,name=param,value=169,data=ssrd,short_name='SSRD',long_name='Downward surface solar radiation',unit='W m**-2 s (W m**-2 for monthly means)'
+info,table2=190,name=param,value=170,data=cap,short_name='CAP',long_name='Field capacity',unit='(0 - 1)'
+info,table2=190,name=param,value=171,data=wilt,short_name='WILT',long_name='Wilting point',unit='(0 - 1)'
+info,table2=190,name=param,value=172,data=lsm,short_name='LSM',long_name='Land-sea mask',unit='(0 - 1)'
+info,table2=190,name=param,value=173,data=sr,short_name='SR',long_name='Roughness length',unit='(0 - 1)'
+info,table2=190,name=param,value=174,data=al,short_name='AL',long_name='Albedo',unit='(0 - 1)'
+info,table2=190,name=param,value=175,data=strd,short_name='STRD',long_name='Downward surface long wave radiation',unit='W m**-2 s (W m**-2 for monthly means)'
+info,table2=190,name=param,value=176,data=ssr,short_name='SSR',long_name='Surface net solar radiation',unit='W m**-2 s (W m**-2 for monthly means)'
+info,table2=190,name=param,value=177,data=str,short_name='STR',long_name='Surface net long wave radiation',unit='W m**-2 s (W m**-2 for monthly means)'
+info,table2=190,name=param,value=178,data=tsr,short_name='TSR',long_name='Top net solar radiation',unit='W m**-2 s (W m**-2 for monthly means)'
+info,table2=190,name=param,value=179,data=ttr,short_name='TTR',long_name='Top net long wave radiation',unit='W m**-2 s (W m**-2 for monthly means)'
+info,table2=190,name=param,value=182,data=e,short_name='E',long_name='Evaporation',unit='m (m s**-1 for monthly means)'
+info,table2=190,name=param,value=201,data=mx2t,short_name='MX2T',long_name='Maximum 2 metre temperature',unit='K'
+info,table2=190,name=param,value=202,data=mn2t,short_name='MN2T',long_name='Minimum 2 metre temperature',unit='K'
+info,table2=190,name=param,value=228,data=tp,short_name='TP',long_name='Total precipitation',unit='m (m s**-1 for monthly means)'
+info,table2=190,name=param,value=229,data=tsm,short_name='TSM',long_name='Total soil moisture',unit='m**3 m**-3'
+info,table2=190,name=param,value=255,data=255.190,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=200,name=param,value=1,data=strf,short_name='STRF',long_name='Stream function',unit='m**2 s**-1'
+info,table2=200,name=param,value=2,data=vpot,short_name='VPOT',long_name='Velocity potential',unit='m**2 s**-1'
+info,table2=200,name=param,value=3,data=pt,short_name='PT',long_name='Potential temperature',unit='K'
+info,table2=200,name=param,value=4,data=eqpt,short_name='EQPT',long_name='Equivalent potential temperature',unit='K'
+info,table2=200,name=param,value=5,data=sept,short_name='SEPT',long_name='Saturated equivalent potential temperature',unit='K'
+info,table2=200,name=param,value=11,data=udvw,short_name='UDVW',long_name='U component of divergent wind',unit='m s**-1'
+info,table2=200,name=param,value=12,data=vdvw,short_name='VDVW',long_name='V component of divergent wind',unit='m s**-1'
+info,table2=200,name=param,value=13,data=urtw,short_name='URTW',long_name='U component of rotational wind',unit='m s**-1'
+info,table2=200,name=param,value=14,data=vrtw,short_name='VRTW',long_name='V component of rotational wind',unit='m s**-1'
+info,table2=200,name=param,value=21,data=uctp,short_name='UCTP',long_name='Unbalanced component of temperature',unit='K'
+info,table2=200,name=param,value=22,data=ucln,short_name='UCLN',long_name='Unbalanced component of logarithm of surface pressure',unit='-'
+info,table2=200,name=param,value=23,data=ucdv,short_name='UCDV',long_name='Unbalanced component of divergence',unit='s**-1'
+info,table2=200,name=param,value=24,data=24.200,short_name='None',long_name='Reserved for future unbalanced components',unit='-'
+info,table2=200,name=param,value=25,data=25.200,short_name='None',long_name='Reserved for future unbalanced components',unit='-'
+info,table2=200,name=param,value=26,data=cl,short_name='CL',long_name='Lake cover',unit='(0 - 1)'
+info,table2=200,name=param,value=27,data=cvl,short_name='CVL',long_name='Low vegetation cover',unit='(0 - 1)'
+info,table2=200,name=param,value=28,data=cvh,short_name='CVH',long_name='High vegetation cover',unit='(0 - 1)'
+info,table2=200,name=param,value=29,data=tvl,short_name='TVL',long_name='Type of low vegetation',unit='-'
+info,table2=200,name=param,value=30,data=tvh,short_name='TVH',long_name='Type of high vegetation',unit='-'
+info,table2=200,name=param,value=31,data=ci,short_name='CI',long_name='Sea-ice cover',unit='(0 - 1)'
+info,table2=200,name=param,value=32,data=asn,short_name='ASN',long_name='Snow albedo',unit='(0 - 1)'
+info,table2=200,name=param,value=33,data=rsn,short_name='RSN',long_name='Snow density',unit='kg m**-3'
+info,table2=200,name=param,value=34,data=sstk,short_name='SSTK',long_name='Sea surface temperature',unit='K'
+info,table2=200,name=param,value=35,data=istl1,short_name='ISTL1',long_name='Ice surface temperature layer 1',unit='K'
+info,table2=200,name=param,value=36,data=istl2,short_name='ISTL2',long_name='Ice surface temperature layer 2',unit='K'
+info,table2=200,name=param,value=37,data=istl3,short_name='ISTL3',long_name='Ice surface temperature layer 3',unit='K'
+info,table2=200,name=param,value=38,data=istl4,short_name='ISTL4',long_name='Ice surface temperature layer 4',unit='K'
+info,table2=200,name=param,value=39,data=swvl1,short_name='SWVL1',long_name='Volumetric soil water layer 1',unit='m**3 m**-3'
+info,table2=200,name=param,value=40,data=swvl2,short_name='SWVL2',long_name='Volumetric soil water layer 2',unit='m**3 m**-3'
+info,table2=200,name=param,value=41,data=swvl3,short_name='SWVL3',long_name='Volumetric soil water layer 3',unit='m**3 m**-3'
+info,table2=200,name=param,value=42,data=swvl4,short_name='SWVL4',long_name='Volumetric soil water layer 4',unit='m**3 m**-3'
+info,table2=200,name=param,value=43,data=slt,short_name='SLT',long_name='Soil type',unit='-'
+info,table2=200,name=param,value=44,data=es,short_name='ES',long_name='Snow evaporation',unit='m of water'
+info,table2=200,name=param,value=45,data=smlt,short_name='SMLT',long_name='Snowmelt',unit='m of water'
+info,table2=200,name=param,value=46,data=sdur,short_name='SDUR',long_name='Solar duration',unit='s'
+info,table2=200,name=param,value=47,data=dsrp,short_name='DSRP',long_name='Direct solar radiation',unit='w m**-2'
+info,table2=200,name=param,value=48,data=magss,short_name='MAGSS',long_name='Magnitude of surface stress',unit='N m**-2 s'
+info,table2=200,name=param,value=49,data=10fg,short_name='10FG',long_name='10 metre wind gust',unit='m s**-1'
+info,table2=200,name=param,value=50,data=lspf,short_name='LSPF',long_name='Large-scale precipitation fraction',unit='s'
+info,table2=200,name=param,value=51,data=mx2t24,short_name='MX2T24',long_name='Maximum 2 metre temperature',unit='K'
+info,table2=200,name=param,value=52,data=mn2t24,short_name='MN2T24',long_name='Minimum 2 metre temperature',unit='K'
+info,table2=200,name=param,value=53,data=mont,short_name='MONT',long_name='Montgomery potential',unit='m**2 s**-2'
+info,table2=200,name=param,value=54,data=pres,short_name='PRES',long_name='Pressure',unit='Pa'
+info,table2=200,name=param,value=55,data=mean2t24,short_name='MEAN2T24',long_name='Mean 2 metre temperature in past 24 hours',unit='K'
+info,table2=200,name=param,value=56,data=mn2d24,short_name='MN2D24',long_name='Mean 2 metre dewpoint temperature in past 24 hours',unit='K'
+info,table2=200,name=param,value=57,data=uvb,short_name='UVB',long_name='Downward UV radiation at the surface',unit='w m**-2 s'
+info,table2=200,name=param,value=58,data=par,short_name='PAR',long_name='Photosynthetically active radiation at the surface',unit='w m**-2 s'
+info,table2=200,name=param,value=59,data=cape,short_name='CAPE',long_name='Convective available potential energy',unit='J kg**-1'
+info,table2=200,name=param,value=60,data=pv,short_name='PV',long_name='Potential vorticity',unit='K m**2 kg**-1 s**-1'
+info,table2=200,name=param,value=61,data=tpo,short_name='TPO',long_name='Total precipitation from observations',unit='Millimetres*100 + number of stations'
+info,table2=200,name=param,value=62,data=obct,short_name='OBCT',long_name='Observation count',unit='-'
+info,table2=200,name=param,value=63,data=63.200,short_name='None',long_name='Start time for skin temperature difference',unit='s'
+info,table2=200,name=param,value=64,data=64.200,short_name='None',long_name='Finish time for skin temperature difference',unit='s'
+info,table2=200,name=param,value=65,data=65.200,short_name='None',long_name='Skin temperature difference',unit='K'
+info,table2=200,name=param,value=66,data=66.200,short_name='None',long_name='Leaf area index, low vegetation',unit='m**2 / m**2'
+info,table2=200,name=param,value=67,data=67.200,short_name='None',long_name='Leaf area index, high vegetation',unit='m**2 / m**2'
+info,table2=200,name=param,value=68,data=68.200,short_name='None',long_name='Minimum stomatal resistance, low vegetation',unit='s m**-1'
+info,table2=200,name=param,value=69,data=69.200,short_name='None',long_name='Minimum stomatal resistance, high vegetation',unit='s m**-1'
+info,table2=200,name=param,value=70,data=70.200,short_name='None',long_name='Biome cover, low vegetation',unit='(0 - 1)'
+info,table2=200,name=param,value=71,data=71.200,short_name='None',long_name='Biome cover, high vegetation',unit='(0 - 1)'
+info,table2=200,name=param,value=78,data=78.200,short_name='None',long_name='Total column liquid water',unit='kg m**-2'
+info,table2=200,name=param,value=79,data=79.200,short_name='None',long_name='Total column ice water',unit='kg m**-2'
+info,table2=200,name=param,value=80,data=80.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=81,data=81.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=82,data=82.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=83,data=83.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=84,data=84.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=85,data=85.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=86,data=86.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=87,data=87.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=88,data=88.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=89,data=89.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=90,data=90.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=91,data=91.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=92,data=92.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=93,data=93.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=94,data=94.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=95,data=95.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=96,data=96.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=97,data=97.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=98,data=98.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=99,data=99.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=100,data=100.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=101,data=101.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=102,data=102.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=103,data=103.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=104,data=104.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=105,data=105.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=106,data=106.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=107,data=107.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=108,data=108.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=109,data=109.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=110,data=110.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=111,data=111.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=112,data=112.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=113,data=113.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=114,data=114.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=115,data=115.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=116,data=116.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=117,data=117.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=118,data=118.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=119,data=119.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=120,data=120.200,short_name='None',long_name='Experimental product',unit='-'
+info,table2=200,name=param,value=121,data=mx2t6,short_name='MX2T6',long_name='Maximum temperature at 2 metres',unit='K'
+info,table2=200,name=param,value=122,data=mn2t6,short_name='MN2T6',long_name='Minimum temperature at 2 metres',unit='K'
+info,table2=200,name=param,value=123,data=10fg6,short_name='10FG6',long_name='10 metre wind gust in the past 6 hours',unit='m s**-1'
+info,table2=200,name=param,value=125,data=125.200,short_name='None',long_name='Vertically integrated total energy',unit='J m**-2'
+info,table2=200,name=param,value=126,data=126.200,short_name='None',long_name='Generic parameter for sensitive area prediction',unit='Various'
+info,table2=200,name=param,value=127,data=at,short_name='AT',long_name='Atmospheric tide',unit='-'
+info,table2=200,name=param,value=128,data=bv,short_name='BV',long_name='Budget values',unit='-'
+info,table2=200,name=param,value=129,data=z,short_name='Z',long_name='Geopotential',unit='m**2 s**-2'
+info,table2=200,name=param,value=130,data=t,short_name='T',long_name='Temperature',unit='K'
+info,table2=200,name=param,value=131,data=u,short_name='U',long_name='U velocity',unit='m s**-1'
+info,table2=200,name=param,value=132,data=v,short_name='V',long_name='V velocity',unit='m s**-1'
+info,table2=200,name=param,value=133,data=q,short_name='Q',long_name='Specific humidity',unit='kg kg**-1'
+info,table2=200,name=param,value=134,data=sp,short_name='SP',long_name='Surface pressure',unit='Pa'
+info,table2=200,name=param,value=135,data=w,short_name='W',long_name='Vertical velocity',unit='Pa s**-1'
+info,table2=200,name=param,value=136,data=tcw,short_name='TCW',long_name='Total column water',unit='kg m**-2'
+info,table2=200,name=param,value=137,data=tcwv,short_name='TCWV',long_name='Total column water vapour',unit='kg m**-2'
+info,table2=200,name=param,value=138,data=vo,short_name='VO',long_name='Vorticity (relative)',unit='s**-1'
+info,table2=200,name=param,value=139,data=stl1,short_name='STL1',long_name='Soil temperature level 1',unit='K'
+info,table2=200,name=param,value=140,data=swl1,short_name='SWL1',long_name='Soil wetness level 1',unit='m of water'
+info,table2=200,name=param,value=141,data=sd,short_name='SD',long_name='Snow depth',unit='m of water equivalent'
+info,table2=200,name=param,value=142,data=lsp,short_name='LSP',long_name='Stratiform precipitation (Large-scale precipitation)',unit='m'
+info,table2=200,name=param,value=143,data=cp,short_name='CP',long_name='Convective precipitation',unit='m'
+info,table2=200,name=param,value=144,data=sf,short_name='SF',long_name='Snowfall (convective + stratiform)',unit='m of water equivalent'
+info,table2=200,name=param,value=145,data=bld,short_name='BLD',long_name='Boundary layer dissipation',unit='W m**-2 s'
+info,table2=200,name=param,value=146,data=sshf,short_name='SSHF',long_name='Surface sensible heat flux',unit='W m**-2 s'
+info,table2=200,name=param,value=147,data=slhf,short_name='SLHF',long_name='Surface latent heat flux',unit='W m**-2 s'
+info,table2=200,name=param,value=148,data=chnk,short_name='CHNK',long_name='Charnock',unit='-'
+info,table2=200,name=param,value=149,data=snr,short_name='SNR',long_name='Surface net radiation',unit='W m**-2 s'
+info,table2=200,name=param,value=150,data=tnr,short_name='TNR',long_name='Top net radiation',unit='-'
+info,table2=200,name=param,value=151,data=msl,short_name='MSL',long_name='Mean sea level pressure',unit='Pa'
+info,table2=200,name=param,value=152,data=lnsp,short_name='LNSP',long_name='Logarithm of surface pressure',unit='-'
+info,table2=200,name=param,value=153,data=swhr,short_name='SWHR',long_name='Short-wave heating rate',unit='K'
+info,table2=200,name=param,value=154,data=lwhr,short_name='LWHR',long_name='Long-wave heating rate',unit='K'
+info,table2=200,name=param,value=155,data=d,short_name='D',long_name='Divergence',unit='s**-1'
+info,table2=200,name=param,value=156,data=gh,short_name='GH',long_name='Height',unit='m'
+info,table2=200,name=param,value=157,data=r,short_name='R',long_name='Relative humidity',unit='%'
+info,table2=200,name=param,value=158,data=tsp,short_name='TSP',long_name='Tendency of surface pressure',unit='Pa s**-1'
+info,table2=200,name=param,value=159,data=blh,short_name='BLH',long_name='Boundary layer height',unit='m'
+info,table2=200,name=param,value=160,data=sdor,short_name='SDOR',long_name='Standard deviation of orography',unit='-'
+info,table2=200,name=param,value=161,data=isor,short_name='ISOR',long_name='Anisotropy of sub-gridscale orography',unit='-'
+info,table2=200,name=param,value=162,data=anor,short_name='ANOR',long_name='Angle of sub-gridscale orography',unit='rad'
+info,table2=200,name=param,value=163,data=slor,short_name='SLOR',long_name='Slope of sub-gridscale orography',unit='-'
+info,table2=200,name=param,value=164,data=tcc,short_name='TCC',long_name='Total cloud cover',unit='(0 - 1)'
+info,table2=200,name=param,value=165,data=10u,short_name='10U',long_name='10 metre U wind component',unit='m s**-1'
+info,table2=200,name=param,value=166,data=10v,short_name='10V',long_name='10 metre V wind component',unit='m s**-1'
+info,table2=200,name=param,value=167,data=2t,short_name='2T',long_name='2 metre temperature',unit='K'
+info,table2=200,name=param,value=168,data=2d,short_name='2D',long_name='2 metre dewpoint temperature',unit='K'
+info,table2=200,name=param,value=169,data=ssrd,short_name='SSRD',long_name='Surface solar radiation downwards',unit='W m**-2 s'
+info,table2=200,name=param,value=170,data=stl2,short_name='STL2',long_name='Soil temperature level 2',unit='K'
+info,table2=200,name=param,value=171,data=swl2,short_name='SWL2',long_name='Soil wetness level 2',unit='m of water'
+info,table2=200,name=param,value=172,data=lsm,short_name='LSM',long_name='Land-sea mask',unit='(0 - 1)'
+info,table2=200,name=param,value=173,data=sr,short_name='SR',long_name='Surface roughness',unit='m'
+info,table2=200,name=param,value=174,data=al,short_name='AL',long_name='Albedo',unit='(0 - 1)'
+info,table2=200,name=param,value=175,data=strd,short_name='STRD',long_name='Surface thermal radiation downwards',unit='W m**-2 s'
+info,table2=200,name=param,value=176,data=ssr,short_name='SSR',long_name='Surface solar radiation',unit='W m**-2 s'
+info,table2=200,name=param,value=177,data=str,short_name='STR',long_name='Surface thermal radiation',unit='W m**-2 s'
+info,table2=200,name=param,value=178,data=tsr,short_name='TSR',long_name='Top solar radiation',unit='W m**-2 s'
+info,table2=200,name=param,value=179,data=ttr,short_name='TTR',long_name='Top thermal radiation',unit='W m**-2 s'
+info,table2=200,name=param,value=180,data=ewss,short_name='EWSS',long_name='East-West surface stress',unit='N m**-2 s'
+info,table2=200,name=param,value=181,data=nsss,short_name='NSSS',long_name='North-South surface stress',unit='N m**-2 s'
+info,table2=200,name=param,value=182,data=e,short_name='E',long_name='Evaporation',unit='m of water'
+info,table2=200,name=param,value=183,data=stl3,short_name='STL3',long_name='Soil temperature level 3',unit='K'
+info,table2=200,name=param,value=184,data=swl3,short_name='SWL3',long_name='Soil wetness level 3',unit='m of water'
+info,table2=200,name=param,value=185,data=ccc,short_name='CCC',long_name='Convective cloud cover',unit='(0 - 1)'
+info,table2=200,name=param,value=186,data=lcc,short_name='LCC',long_name='Low cloud cover',unit='(0 - 1)'
+info,table2=200,name=param,value=187,data=mcc,short_name='MCC',long_name='Medium cloud cover',unit='(0 - 1)'
+info,table2=200,name=param,value=188,data=hcc,short_name='HCC',long_name='High cloud cover',unit='(0 - 1)'
+info,table2=200,name=param,value=189,data=sund,short_name='SUND',long_name='Sunshine duration',unit='s'
+info,table2=200,name=param,value=190,data=ewov,short_name='EWOV',long_name='East-West component of sub-gridscale orographic variance',unit='m**2'
+info,table2=200,name=param,value=191,data=nsov,short_name='NSOV',long_name='North-South component of sub-gridscale orographic variance',unit='m**2'
+info,table2=200,name=param,value=192,data=nwov,short_name='NWOV',long_name='North-West/South-East component of sub-gridscale orographic variance',unit='m**2'
+info,table2=200,name=param,value=193,data=neov,short_name='NEOV',long_name='North-East/South-West component of sub-gridscale orographic variance',unit='m**2'
+info,table2=200,name=param,value=194,data=btmp,short_name='BTMP',long_name='Brightness temperature',unit='K'
+info,table2=200,name=param,value=195,data=lgws,short_name='LGWS',long_name='Latitudinal component of gravity wave stress',unit='N m**-2 s'
+info,table2=200,name=param,value=196,data=mgws,short_name='MGWS',long_name='Meridional component of gravity wave stress',unit='N m**-2 s'
+info,table2=200,name=param,value=197,data=gwd,short_name='GWD',long_name='Gravity wave dissipation',unit='W m**-2 s'
+info,table2=200,name=param,value=198,data=src,short_name='SRC',long_name='Skin reservoir content',unit='m of water'
+info,table2=200,name=param,value=199,data=veg,short_name='VEG',long_name='Vegetation fraction',unit='(0 - 1)'
+info,table2=200,name=param,value=200,data=vso,short_name='VSO',long_name='Variance of sub-gridscale orography',unit='m**2'
+info,table2=200,name=param,value=201,data=mx2t,short_name='MX2T',long_name='Maximum temperature at 2 metres since previous post-processing',unit='K'
+info,table2=200,name=param,value=202,data=mn2t,short_name='MN2T',long_name='Minimum temperature at 2 metres since previous post-processing',unit='K'
+info,table2=200,name=param,value=203,data=o3,short_name='O3',long_name='Ozone mass mixing ratio',unit='kg kg**-1'
+info,table2=200,name=param,value=204,data=paw,short_name='PAW',long_name='Precipitation analysis weights',unit='-'
+info,table2=200,name=param,value=205,data=ro,short_name='RO',long_name='Runoff',unit='m'
+info,table2=200,name=param,value=206,data=tco3,short_name='TCO3',long_name='Total column ozone',unit='kg m**-2'
+info,table2=200,name=param,value=207,data=10si,short_name='10SI',long_name='10 metre wind speed',unit='m s**-1'
+info,table2=200,name=param,value=208,data=tsrc,short_name='TSRC',long_name='Top net solar radiation, clear sky',unit='W m**-2 s'
+info,table2=200,name=param,value=209,data=ttrc,short_name='TTRC',long_name='Top net thermal radiation, clear sky',unit='W m**-2 s'
+info,table2=200,name=param,value=210,data=ssrc,short_name='SSRC',long_name='Surface net solar radiation, clear sky',unit='W m**-2 s'
+info,table2=200,name=param,value=211,data=strc,short_name='STRC',long_name='Surface net thermal radiation, clear sky',unit='W m**-2 s'
+info,table2=200,name=param,value=212,data=tisr,short_name='TISR',long_name='TOA incident solar radiation',unit='W m**-2 s'
+info,table2=200,name=param,value=214,data=dhr,short_name='DHR',long_name='Diabatic heating by radiation',unit='K'
+info,table2=200,name=param,value=215,data=dhvd,short_name='DHVD',long_name='Diabatic heating by vertical diffusion',unit='K'
+info,table2=200,name=param,value=216,data=dhcc,short_name='DHCC',long_name='Diabatic heating by cumulus convection',unit='K'
+info,table2=200,name=param,value=217,data=dhlc,short_name='DHLC',long_name='Diabatic heating large-scale condensation',unit='K'
+info,table2=200,name=param,value=218,data=vdzw,short_name='VDZW',long_name='Vertical diffusion of zonal wind',unit='m s**-1'
+info,table2=200,name=param,value=219,data=vdmw,short_name='VDMW',long_name='Vertical diffusion of meridional wind',unit='m s**-1'
+info,table2=200,name=param,value=220,data=ewgd,short_name='EWGD',long_name='East-West gravity wave drag tendency',unit='m s**-1'
+info,table2=200,name=param,value=221,data=nsgd,short_name='NSGD',long_name='North-South gravity wave drag tendency',unit='m s**-1'
+info,table2=200,name=param,value=222,data=ctzw,short_name='CTZW',long_name='Convective tendency of zonal wind',unit='m s**-1'
+info,table2=200,name=param,value=223,data=ctmw,short_name='CTMW',long_name='Convective tendency of meridional wind',unit='m s**-1'
+info,table2=200,name=param,value=224,data=vdh,short_name='VDH',long_name='Vertical diffusion of humidity',unit='kg kg**-1'
+info,table2=200,name=param,value=225,data=htcc,short_name='HTCC',long_name='Humidity tendency by cumulus convection',unit='kg kg**-1'
+info,table2=200,name=param,value=226,data=htlc,short_name='HTLC',long_name='Humidity tendency by large-scale condensation',unit='kg kg**-1'
+info,table2=200,name=param,value=227,data=crnh,short_name='CRNH',long_name='Change from removal of negative humidity',unit='kg kg**-1'
+info,table2=200,name=param,value=228,data=tp,short_name='TP',long_name='Total precipitation',unit='m'
+info,table2=200,name=param,value=229,data=iews,short_name='IEWS',long_name='Instantaneous X surface stress',unit='N m**-2'
+info,table2=200,name=param,value=230,data=inss,short_name='INSS',long_name='Instantaneous Y surface stress',unit='N m**-2'
+info,table2=200,name=param,value=231,data=ishf,short_name='ISHF',long_name='Instantaneous surface heat flux',unit='W m**-2'
+info,table2=200,name=param,value=232,data=ie,short_name='IE',long_name='Instantaneous moisture flux',unit='kg m**-2 s'
+info,table2=200,name=param,value=233,data=asq,short_name='ASQ',long_name='Apparent surface humidity',unit='kg kg**-1'
+info,table2=200,name=param,value=234,data=lsrh,short_name='LSRH',long_name='Logarithm of surface roughness length for heat',unit='-'
+info,table2=200,name=param,value=235,data=skt,short_name='SKT',long_name='Skin temperature',unit='K'
+info,table2=200,name=param,value=236,data=stl4,short_name='STL4',long_name='Soil temperature level 4',unit='K'
+info,table2=200,name=param,value=237,data=swl4,short_name='SWL4',long_name='Soil wetness level 4',unit='m'
+info,table2=200,name=param,value=238,data=tsn,short_name='TSN',long_name='Temperature of snow layer',unit='K'
+info,table2=200,name=param,value=239,data=csf,short_name='CSF',long_name='Convective snowfall',unit='m of water equivalent'
+info,table2=200,name=param,value=240,data=lsf,short_name='LSF',long_name='Large-scale snowfall',unit='m of water equivalent'
+info,table2=200,name=param,value=241,data=acf,short_name='ACF',long_name='Accumulated cloud fraction tendency',unit='(-1 to 1)'
+info,table2=200,name=param,value=242,data=alw,short_name='ALW',long_name='Accumulated liquid water tendency',unit='(-1 to 1)'
+info,table2=200,name=param,value=243,data=fal,short_name='FAL',long_name='Forecast albedo',unit='(0 - 1)'
+info,table2=200,name=param,value=244,data=fsr,short_name='FSR',long_name='Forecast surface roughness',unit='m'
+info,table2=200,name=param,value=245,data=flsr,short_name='FLSR',long_name='Forecast logarithm of surface roughness for heat',unit='-'
+info,table2=200,name=param,value=246,data=clwc,short_name='CLWC',long_name='Cloud liquid water content',unit='kg kg**-1'
+info,table2=200,name=param,value=247,data=ciwc,short_name='CIWC',long_name='Cloud ice water content',unit='kg kg**-1'
+info,table2=200,name=param,value=248,data=cc,short_name='CC',long_name='Cloud cover',unit='(0 - 1)'
+info,table2=200,name=param,value=249,data=aiw,short_name='AIW',long_name='Accumulated ice water tendency',unit='(-1 to 1)'
+info,table2=200,name=param,value=250,data=ice,short_name='ICE',long_name='Ice age',unit='(0 - 1)'
+info,table2=200,name=param,value=251,data=atte,short_name='ATTE',long_name='Adiabatic tendency of temperature',unit='K'
+info,table2=200,name=param,value=252,data=athe,short_name='ATHE',long_name='Adiabatic tendency of humidity',unit='kg kg**-1'
+info,table2=200,name=param,value=253,data=atze,short_name='ATZE',long_name='Adiabatic tendency of zonal wind',unit='m s**-1'
+info,table2=200,name=param,value=254,data=atmw,short_name='ATMW',long_name='Adiabatic tendency of meridional wind',unit='m s**-1'
+info,table2=200,name=param,value=255,data=255.200,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=201,name=param,value=1,data=1.201,short_name='None',long_name='downward shortwave radiant flux density',unit='W m**-2'
+info,table2=201,name=param,value=2,data=2.201,short_name='None',long_name='upward shortwave radiant flux density',unit='W m**-2'
+info,table2=201,name=param,value=3,data=3.201,short_name='None',long_name='downward longwave radiant flux density',unit='W m**-2'
+info,table2=201,name=param,value=4,data=4.201,short_name='None',long_name='upward longwave radiant flux density',unit='W m**-2'
+info,table2=201,name=param,value=5,data=apab_s,short_name='APAB_S',long_name='downwd photosynthetic active radiant flux density',unit='W m**-2'
+info,table2=201,name=param,value=6,data=6.201,short_name='None',long_name='net shortwave flux',unit='W m**-2'
+info,table2=201,name=param,value=7,data=7.201,short_name='None',long_name='net longwave flux',unit='W m**-2'
+info,table2=201,name=param,value=8,data=8.201,short_name='None',long_name='total net radiative flux density',unit='W m**-2'
+info,table2=201,name=param,value=9,data=9.201,short_name='None',long_name='downw shortw radiant flux density, cloudfree part',unit='W m**-2'
+info,table2=201,name=param,value=10,data=10.201,short_name='None',long_name='upw shortw radiant flux density, cloudy part',unit='W m**-2'
+info,table2=201,name=param,value=11,data=11.201,short_name='None',long_name='downw longw radiant flux density, cloudfree part',unit='W m**-2'
+info,table2=201,name=param,value=12,data=12.201,short_name='None',long_name='upw longw radiant flux density, cloudy part',unit='W m**-2'
+info,table2=201,name=param,value=13,data=sohr_rad,short_name='SOHR_RAD',long_name='shortwave radiative heating rate',unit='K s**-1'
+info,table2=201,name=param,value=14,data=thhr_rad,short_name='THHR_RAD',long_name='longwave radiative heating rate',unit='K s**-1'
+info,table2=201,name=param,value=15,data=15.201,short_name='None',long_name='total radiative heating rate',unit='W m**-2'
+info,table2=201,name=param,value=16,data=16.201,short_name='None',long_name='soil heat flux, surface',unit='W m**-2'
+info,table2=201,name=param,value=17,data=17.201,short_name='None',long_name='soil heat flux, bottom of layer',unit='W m**-2'
+info,table2=201,name=param,value=29,data=clc,short_name='CLC',long_name='fractional cloud cover',unit='(0-1)'
+info,table2=201,name=param,value=30,data=30.201,short_name='None',long_name='cloud cover, grid scale',unit='(0-1)'
+info,table2=201,name=param,value=31,data=qc,short_name='QC',long_name='specific cloud water content',unit='kg kg**-1'
+info,table2=201,name=param,value=32,data=32.201,short_name='None',long_name='cloud water content, grid scale, vert integrated',unit='kg m**-2'
+info,table2=201,name=param,value=33,data=qi,short_name='QI',long_name='specific cloud ice content, grid scale',unit='kg kg**-1'
+info,table2=201,name=param,value=34,data=34.201,short_name='None',long_name='cloud ice content, grid scale, vert integrated',unit='kg m**-2'
+info,table2=201,name=param,value=35,data=35.201,short_name='None',long_name='specific rainwater content, grid scale',unit='kg kg**-1'
+info,table2=201,name=param,value=36,data=36.201,short_name='None',long_name='specific snow content, grid scale',unit='kg kg**-1'
+info,table2=201,name=param,value=37,data=37.201,short_name='None',long_name='specific rainwater content, gs, vert. integrated',unit='kg m**-2'
+info,table2=201,name=param,value=38,data=38.201,short_name='None',long_name='specific snow content, gs, vert. integrated',unit='kg m**-2'
+info,table2=201,name=param,value=41,data=twater,short_name='TWATER',long_name='total column water',unit='kg m**-2'
+info,table2=201,name=param,value=42,data=42.201,short_name='None',long_name='vert. integral of divergence of tot. water content',unit='kg m**-2'
+info,table2=201,name=param,value=50,data=ch_cm_cl,short_name='CH_CM_CL',long_name='cloud covers CH_CM_CL (000...888)',unit='(0-1)'
+info,table2=201,name=param,value=51,data=51.201,short_name='None',long_name='cloud cover CH (0..8)',unit='(0-1)'
+info,table2=201,name=param,value=52,data=52.201,short_name='None',long_name='cloud cover CM (0..8)',unit='(0-1)'
+info,table2=201,name=param,value=53,data=53.201,short_name='None',long_name='cloud cover CL (0..8)',unit='(0-1)'
+info,table2=201,name=param,value=54,data=54.201,short_name='None',long_name='total cloud cover (0..8)',unit='(0-1)'
+info,table2=201,name=param,value=55,data=55.201,short_name='None',long_name='fog (0..8)',unit='(0-1)'
+info,table2=201,name=param,value=56,data=56.201,short_name='None',long_name='fog',unit='(0-1)'
+info,table2=201,name=param,value=60,data=60.201,short_name='None',long_name='cloud cover, convective cirrus',unit='(0-1)'
+info,table2=201,name=param,value=61,data=61.201,short_name='None',long_name='specific cloud water content, convective clouds',unit='kg kg**-1'
+info,table2=201,name=param,value=62,data=62.201,short_name='None',long_name='cloud water content, conv clouds, vert integrated',unit='kg m**-2'
+info,table2=201,name=param,value=63,data=63.201,short_name='None',long_name='specific cloud ice content, convective clouds',unit='kg kg**-1'
+info,table2=201,name=param,value=64,data=64.201,short_name='None',long_name='cloud ice content, conv clouds, vert integrated',unit='kg m**-2'
+info,table2=201,name=param,value=65,data=65.201,short_name='None',long_name='convective mass flux',unit='kg s**-1 m**-2'
+info,table2=201,name=param,value=66,data=66.201,short_name='None',long_name='updraft velocity, convection',unit='m s**-1'
+info,table2=201,name=param,value=67,data=67.201,short_name='None',long_name='entrainment parameter, convection',unit='m**-1'
+info,table2=201,name=param,value=68,data=hbas_con,short_name='HBAS_CON',long_name='cloud base, convective clouds (above msl)',unit='m'
+info,table2=201,name=param,value=69,data=htop_con,short_name='HTOP_CON',long_name='cloud top, convective clouds (above msl)',unit='m'
+info,table2=201,name=param,value=70,data=70.201,short_name='None',long_name='convective layers (00...77) (BKE)',unit='(0-1)'
+info,table2=201,name=param,value=71,data=71.201,short_name='None',long_name='KO-index',unit='(1)'
+info,table2=201,name=param,value=72,data=bas_con,short_name='BAS_CON',long_name='convection base index',unit='(1)'
+info,table2=201,name=param,value=73,data=top_con,short_name='TOP_CON',long_name='convection top index',unit='(1)'
+info,table2=201,name=param,value=74,data=dt_con,short_name='DT_CON',long_name='convective temperature tendency',unit='K s**-1'
+info,table2=201,name=param,value=75,data=dqv_con,short_name='DQV_CON',long_name='convective tendency of specific humidity',unit='s**-1'
+info,table2=201,name=param,value=76,data=76.201,short_name='None',long_name='convective tendency of total heat',unit='J kg**-1 s**-1'
+info,table2=201,name=param,value=77,data=77.201,short_name='None',long_name='convective tendency of total water',unit='s**-1'
+info,table2=201,name=param,value=78,data=du_con,short_name='DU_CON',long_name='convective momentum tendency (X-component)',unit='m s**-2'
+info,table2=201,name=param,value=79,data=dv_con,short_name='DV_CON',long_name='convective momentum tendency (Y-component)',unit='m s**-2'
+info,table2=201,name=param,value=80,data=80.201,short_name='None',long_name='convective vorticity tendency',unit='s**-2'
+info,table2=201,name=param,value=81,data=81.201,short_name='None',long_name='convective divergence tendency',unit='s**-2'
+info,table2=201,name=param,value=82,data=htop_dc,short_name='HTOP_DC',long_name='top of dry convection (above msl)',unit='m'
+info,table2=201,name=param,value=83,data=83.201,short_name='None',long_name='dry convection top index',unit='(1)'
+info,table2=201,name=param,value=84,data=hzerocl,short_name='HZEROCL',long_name='height of 0 degree Celsius isotherm above msl',unit='m'
+info,table2=201,name=param,value=85,data=snowlmt,short_name='SNOWLMT',long_name='height of snow-fall limit',unit='m'
+info,table2=201,name=param,value=99,data=qrs_gsp,short_name='QRS_GSP',long_name='spec. content of precip. particles',unit='kg kg**-1'
+info,table2=201,name=param,value=100,data=prr_gsp,short_name='PRR_GSP',long_name='surface precipitation rate, rain, grid scale',unit='kg s**-1 m**-2'
+info,table2=201,name=param,value=101,data=prs_gsp,short_name='PRS_GSP',long_name='surface precipitation rate, snow, grid scale',unit='kg s**-1 m**-2'
+info,table2=201,name=param,value=102,data=rain_gsp,short_name='RAIN_GSP',long_name='surface precipitation amount, rain, grid scale',unit='kg m**-2'
+info,table2=201,name=param,value=111,data=prr_con,short_name='PRR_CON',long_name='surface precipitation rate, rain, convective',unit='kg s**-1 m**-2'
+info,table2=201,name=param,value=112,data=prs_con,short_name='PRS_CON',long_name='surface precipitation rate, snow, convective',unit='kg s**-1 m**-2'
+info,table2=201,name=param,value=113,data=rain_con,short_name='RAIN_CON',long_name='surface precipitation amount, rain, convective',unit='kg m**-2'
+info,table2=201,name=param,value=139,data=pp,short_name='PP',long_name='deviation of pressure from reference value',unit='Pa'
+info,table2=201,name=param,value=150,data=150.201,short_name='None',long_name='coefficient of horizontal diffusion',unit='m**2 s**-1'
+info,table2=201,name=param,value=187,data=vmax_10m,short_name='VMAX_10M',long_name='maximum wind velocity',unit='m s**-1'
+info,table2=201,name=param,value=200,data=w_i,short_name='W_I',long_name='water content of interception store',unit='kg m**-2'
+info,table2=201,name=param,value=203,data=t_snow,short_name='T_SNOW',long_name='snow temperature',unit='K'
+info,table2=201,name=param,value=215,data=t_ice,short_name='T_ICE',long_name='ice surface temperature',unit='K'
+info,table2=201,name=param,value=241,data=cape_con,short_name='CAPE_CON',long_name='convective available potential energy',unit='J kg**-1'
+info,table2=201,name=param,value=255,data=255.201,short_name='None',long_name='Indicates a missing value',unit='-'
+info,table2=210,name=param,value=1,data=aermr01,short_name='AERMR01',long_name='Aerosol type 1 mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=2,data=aermr02,short_name='AERMR02',long_name='Aerosol type 2 mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=3,data=aermr03,short_name='AERMR03',long_name='Aerosol type 3 mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=4,data=aermr04,short_name='AERMR04',long_name='Aerosol type 4 mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=5,data=aermr05,short_name='AERMR05',long_name='Aerosol type 5 mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=6,data=aermr06,short_name='AERMR06',long_name='Aerosol type 6 mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=7,data=aermr07,short_name='AERMR07',long_name='Aerosol type 7 mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=8,data=aermr08,short_name='AERMR08',long_name='Aerosol type 8 mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=9,data=aermr09,short_name='AERMR09',long_name='Aerosol type 9 mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=10,data=aermr10,short_name='AERMR10',long_name='Aerosol type 10 mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=11,data=aermr11,short_name='AERMR11',long_name='Aerosol type 11 mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=12,data=aermr12,short_name='AERMR12',long_name='Aerosol type 12 mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=16,data=aergn01,short_name='AERGN01',long_name='Aerosol type 1 source/gain accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=17,data=aergn02,short_name='AERGN02',long_name='Aerosol type 2 source/gain accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=18,data=aergn03,short_name='AERGN03',long_name='Aerosol type 3 source/gain accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=19,data=aergn04,short_name='AERGN04',long_name='Aerosol type 4 source/gain accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=20,data=aergn05,short_name='AERGN05',long_name='Aerosol type 5 source/gain accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=21,data=aergn06,short_name='AERGN06',long_name='Aerosol type 6 source/gain accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=22,data=aergn07,short_name='AERGN07',long_name='Aerosol type 7 source/gain accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=23,data=aergn08,short_name='AERGN08',long_name='Aerosol type 8 source/gain accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=24,data=aergn09,short_name='AERGN09',long_name='Aerosol type 9 source/gain accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=25,data=aergn10,short_name='AERGN10',long_name='Aerosol type 10 source/gain accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=26,data=aergn11,short_name='AERGN11',long_name='Aerosol type 11 source/gain accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=27,data=aergn12,short_name='AERGN12',long_name='Aerosol type 12 source/gain accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=31,data=aerls01,short_name='AERLS01',long_name='Aerosol type 1 sink/loss accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=32,data=aerls02,short_name='AERLS02',long_name='Aerosol type 2 sink/loss accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=33,data=aerls03,short_name='AERLS03',long_name='Aerosol type 3 sink/loss accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=34,data=aerls04,short_name='AERLS04',long_name='Aerosol type 4 sink/loss accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=35,data=aerls05,short_name='AERLS05',long_name='Aerosol type 5 sink/loss accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=36,data=aerls06,short_name='AERLS06',long_name='Aerosol type 6 sink/loss accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=37,data=aerls07,short_name='AERLS07',long_name='Aerosol type 7 sink/loss accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=38,data=aerls08,short_name='AERLS08',long_name='Aerosol type 8 sink/loss accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=39,data=aerls09,short_name='AERLS09',long_name='Aerosol type 9 sink/loss accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=40,data=aerls10,short_name='AERLS10',long_name='Aerosol type 10 sink/loss accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=41,data=aerls11,short_name='AERLS11',long_name='Aerosol type 11 sink/loss accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=42,data=aerls12,short_name='AERLS12',long_name='Aerosol type 12 sink/loss accumulated',unit='kg m**-2'
+info,table2=210,name=param,value=46,data=aerpr,short_name='AERPR',long_name='Aerosol precursor mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=47,data=aersm,short_name='AERSM',long_name='Aerosol small mode mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=48,data=aerlg,short_name='AERLG',long_name='Aerosol large mode mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=49,data=aodpr,short_name='AODPR',long_name='Aerosol precursor optical depth',unit='dimensionless'
+info,table2=210,name=param,value=50,data=aodsm,short_name='AODSM',long_name='Aerosol small mode optical depth',unit='dimensionless'
+info,table2=210,name=param,value=51,data=aodlg,short_name='AODLG',long_name='Aerosol large mode optical depth',unit='dimensionless'
+info,table2=210,name=param,value=52,data=aerdep,short_name='AERDEP',long_name='Dust emission potential',unit='kg s**2 m**-5'
+info,table2=210,name=param,value=53,data=aerlts,short_name='AERLTS',long_name='Lifting threshold speed',unit='m s**-1'
+info,table2=210,name=param,value=54,data=aerscc,short_name='AERSCC',long_name='Soil clay content',unit='%'
+info,table2=210,name=param,value=61,data=co2,short_name='CO2',long_name='Carbon Dioxide',unit='kg kg**-1'
+info,table2=210,name=param,value=62,data=ch4,short_name='CH4',long_name='Methane',unit='kg kg**-1'
+info,table2=210,name=param,value=63,data=n2o,short_name='N2O',long_name='Nitrous oxide',unit='kg kg**-1'
+info,table2=210,name=param,value=64,data=tcco2,short_name='TCCO2',long_name='Total column Carbon Dioxide',unit='kg m**-2'
+info,table2=210,name=param,value=65,data=tcch4,short_name='TCCH4',long_name='Total column Methane',unit='kg m**-2'
+info,table2=210,name=param,value=66,data=tcn2o,short_name='TCN2O',long_name='Total column Nitrous oxide',unit='kg m**-2'
+info,table2=210,name=param,value=67,data=co2of,short_name='CO2OF',long_name='Ocean flux of Carbon Dioxide',unit='kg m**-2 s**-1'
+info,table2=210,name=param,value=68,data=co2nbf,short_name='CO2NBF',long_name='Natural biosphere flux of Carbon Dioxide',unit='kg m**-2 s**-1'
+info,table2=210,name=param,value=69,data=co2apf,short_name='CO2APF',long_name='Anthropogenic emissions of Carbon Dioxide',unit='kg m**-2 s**-1'
+info,table2=210,name=param,value=70,data=ch4f,short_name='CH4F',long_name='Methane Surface Fluxes',unit='kg m**-2 s**-1'
+info,table2=210,name=param,value=71,data=kch4,short_name='kCH4',long_name='Methane loss rate due to radical hydroxyl (OH)',unit='s**-1'
+info,table2=210,name=param,value=80,data=co2fire,short_name='CO2FIRE',long_name='Wildfire flux of Carbon Dioxide',unit='kg m**-2 s**-1'
+info,table2=210,name=param,value=81,data=cofire,short_name='COFIRE',long_name='Wildfire flux of Carbon Monoxide',unit='kg m**-2 s**-1'
+info,table2=210,name=param,value=82,data=ch4fire,short_name='CH4FIRE',long_name='Wildfire flux of Methane',unit='kg m**-2 s**-1'
+info,table2=210,name=param,value=83,data=nmhcfire,short_name='NMHCFIRE',long_name='Wildfire flux of Non-Methane Hydro-Carbons',unit='kg m**-2 s**-1'
+info,table2=210,name=param,value=84,data=h2fire,short_name='H2FIRE',long_name='Wildfire flux of Hydrogen',unit='kg m**-2 s**-1'
+info,table2=210,name=param,value=85,data=noxfire,short_name='NOXFIRE',long_name='Wildfire flux of Nitrogen Oxides NOx',unit='kg m**-2 s**-1'
+info,table2=210,name=param,value=86,data=n2ofire,short_name='N2OFIRE',long_name='Wildfire flux of Nitrous Oxide',unit='kg m**-2 s**-1'
+info,table2=210,name=param,value=87,data=pm2p5fire,short_name='PM2P5FIRE',long_name='Wildfire flux of Particulate Matter PM2.5',unit='kg m**-2 s**-1'
+info,table2=210,name=param,value=88,data=tpmfire,short_name='TPMFIRE',long_name='Wildfire flux of Total Particulate Matter',unit='kg m**-2 s**-1'
+info,table2=210,name=param,value=89,data=tcfire,short_name='TCFIRE',long_name='Wildfire flux of Total Carbon in Aerosols',unit='kg m**-2 s**-1'
+info,table2=210,name=param,value=90,data=ocfire,short_name='OCFIRE',long_name='Wildfire flux of Organic Carbon',unit='kg m**-2 s**-1'
+info,table2=210,name=param,value=91,data=bcfire,short_name='BCFIRE',long_name='Wildfire flux of Black Carbon',unit='kg m**-2 s**-1'
+info,table2=210,name=param,value=92,data=cfire,short_name='CFIRE',long_name='Wildfire overall flux of burnt Carbon',unit='kg m**-2 s**-1'
+info,table2=210,name=param,value=93,data=c4ffire,short_name='C4FFIRE',long_name='Wildfire fraction of C4 plants',unit='dimensionless'
+info,table2=210,name=param,value=94,data=vegfire,short_name='VEGFIRE',long_name='Wildfire vegetation map index',unit='dimensionless'
+info,table2=210,name=param,value=95,data=ccfire,short_name='CCFIRE',long_name='Wildfire Combustion Completeness',unit='dimensionless'
+info,table2=210,name=param,value=96,data=flfire,short_name='FLFIRE',long_name='Wildfire Fuel Load: Carbon per unit area',unit='kg m**-2'
+info,table2=210,name=param,value=97,data=bffire,short_name='BFFIRE',long_name='Wildfire fraction of area burnt',unit='dimensionless'
+info,table2=210,name=param,value=121,data=no2,short_name='NO2',long_name='Nitrogen dioxide',unit='kg kg**-1'
+info,table2=210,name=param,value=122,data=so2,short_name='SO2',long_name='Sulphur dioxide',unit='kg kg**-1'
+info,table2=210,name=param,value=123,data=co,short_name='CO',long_name='Carbon monoxide',unit='kg kg**-1'
+info,table2=210,name=param,value=124,data=hcho,short_name='HCHO',long_name='Formaldehyde',unit='kg kg**-1'
+info,table2=210,name=param,value=125,data=tcno2,short_name='TCNO2',long_name='Total column Nitrogen dioxide',unit='kg m**-2'
+info,table2=210,name=param,value=126,data=tcso2,short_name='TCSO2',long_name='Total column Sulphur dioxide',unit='kg m**-2'
+info,table2=210,name=param,value=127,data=tcco,short_name='TCCO',long_name='Total column Carbon monoxide',unit='kg m**-2'
+info,table2=210,name=param,value=128,data=tchcho,short_name='TCHCHO',long_name='Total column Formaldehyde',unit='kg m**-2'
+info,table2=210,name=param,value=129,data=nox,short_name='NOX',long_name='Nitrogen Oxides',unit='kg kg**-1'
+info,table2=210,name=param,value=130,data=tcnox,short_name='TCNOX',long_name='Total Column Nitrogen Oxides',unit='kg m**-2'
+info,table2=210,name=param,value=131,data=grg1,short_name='GRG1',long_name='Reactive tracer 1 mass mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=132,data=tcgrg1,short_name='TCGRG1',long_name='Total column GRG tracer 1',unit='kg m**-2'
+info,table2=210,name=param,value=133,data=grg2,short_name='GRG2',long_name='Reactive tracer 2 mass mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=134,data=tcgrg2,short_name='TCGRG2',long_name='Total column GRG tracer 2',unit='kg m**-2'
+info,table2=210,name=param,value=135,data=grg3,short_name='GRG3',long_name='Reactive tracer 3 mass mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=136,data=tcgrg3,short_name='TCGRG3',long_name='Total column GRG tracer 3',unit='kg m**-2'
+info,table2=210,name=param,value=137,data=grg4,short_name='GRG4',long_name='Reactive tracer 4 mass mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=138,data=tcgrg4,short_name='TCGRG4',long_name='Total column GRG tracer 4',unit='kg m**-2'
+info,table2=210,name=param,value=139,data=grg5,short_name='GRG5',long_name='Reactive tracer 5 mass mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=140,data=tcgrg5,short_name='TCGRG5',long_name='Total column GRG tracer 5',unit='kg m**-2'
+info,table2=210,name=param,value=141,data=grg6,short_name='GRG6',long_name='Reactive tracer 6 mass mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=142,data=tcgrg6,short_name='TCGRG6',long_name='Total column GRG tracer 6',unit='kg m**-2'
+info,table2=210,name=param,value=143,data=grg7,short_name='GRG7',long_name='Reactive tracer 7 mass mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=144,data=tcgrg7,short_name='TCGRG7',long_name='Total column GRG tracer 7',unit='kg m**-2'
+info,table2=210,name=param,value=145,data=grg8,short_name='GRG8',long_name='Reactive tracer 8 mass mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=146,data=tcgrg8,short_name='TCGRG8',long_name='Total column GRG tracer 8',unit='kg m**-2'
+info,table2=210,name=param,value=147,data=grg9,short_name='GRG9',long_name='Reactive tracer 9 mass mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=148,data=tcgrg9,short_name='TCGRG9',long_name='Total column GRG tracer 9',unit='kg m**-2'
+info,table2=210,name=param,value=149,data=grg10,short_name='GRG10',long_name='Reactive tracer 10 mass mixing ratio',unit='kg kg**-1'
+info,table2=210,name=param,value=150,data=tcgrg10,short_name='TCGRG10',long_name='Total column GRG tracer 10',unit='kg m**-2'
+info,table2=210,name=param,value=181,data=ra,short_name='Ra',long_name='Radon',unit='kg kg**-1'
+info,table2=210,name=param,value=182,data=sf6,short_name='SF6',long_name='Sulphur Hexafluoride',unit='kg kg**-1'
+info,table2=210,name=param,value=183,data=tcra,short_name='TCRa',long_name='Total column Radon',unit='kg m**-2'
+info,table2=210,name=param,value=184,data=tcsf6,short_name='TCSF6',long_name='Total column Sulphur Hexafluoride',unit='kg m**-2'
+info,table2=210,name=param,value=185,data=sf6apf,short_name='SF6APF',long_name='Anthropogenic Emissions of Sulphur Hexafluoride',unit='kg m**-2 s**-1'
+info,table2=210,name=param,value=203,data=go3,short_name='GO3',long_name='GEMS Ozone',unit='kg kg**-1'
+info,table2=210,name=param,value=206,data=gtco3,short_name='GTCO3',long_name='GEMS Total column ozone',unit='kg m**-2'
+info,table2=211,name=param,value=46,data=aerpr,short_name='AERPR',long_name='Aerosol precursor mixing ratio',unit='kg kg**-1'
+info,table2=211,name=param,value=47,data=aersm,short_name='AERSM',long_name='Aerosol small mode mixing ratio',unit='kg kg**-1'
+info,table2=211,name=param,value=48,data=aerlg,short_name='AERLG',long_name='Aerosol large mode mixing ratio',unit='kg kg**-1'
+info,table2=211,name=param,value=49,data=aodpr,short_name='AODPR',long_name='Aerosol precursor optical depth',unit='dimensionless'
+info,table2=211,name=param,value=50,data=aodsm,short_name='AODSM',long_name='Aerosol small mode optical depth',unit='dimensionless'
+info,table2=211,name=param,value=51,data=aodlg,short_name='AODLG',long_name='Aerosol large mode optical depth',unit='dimensionless'
+info,table2=211,name=param,value=61,data=co2,short_name='CO2',long_name='Carbon Dioxide',unit='kg kg**-1'
+info,table2=211,name=param,value=62,data=ch4,short_name='CH4',long_name='Methane',unit='kg kg**-1'
+info,table2=211,name=param,value=63,data=n2o,short_name='N2O',long_name='Nitrous oxide',unit='kg kg**-1'
+info,table2=211,name=param,value=121,data=no2,short_name='NO2',long_name='Nitrogen dioxide',unit='kg kg**-1'
+info,table2=211,name=param,value=122,data=so2,short_name='SO2',long_name='Sulphur dioxide',unit='kg kg**-1'
+info,table2=211,name=param,value=123,data=co,short_name='CO',long_name='Carbon monoxide',unit='kg kg**-1'
+info,table2=211,name=param,value=124,data=hcho,short_name='HCHO',long_name='Formaldehyde',unit='kg kg**-1'
+info,table2=211,name=param,value=203,data=go3,short_name='GO3',long_name='GEMS Ozone',unit='kg kg**-1'
+info,table2=220,name=param,value=228,data=tpoc,short_name='TPOC',long_name='Total precipitacion observation count',unit='dimensionless'
+info,table2=228,name=param,value=1,data=cin,short_name='CIN',long_name='Convective inhibition',unit='J kg**-1'
+info,table2=228,name=param,value=2,data=orog,short_name='OROG',long_name='Orography',unit='m'
+info,table2=228,name=param,value=3,data=zust,short_name='ZUST',long_name='Friction velocity',unit='m s**-1'
+info,table2=228,name=param,value=39,data=sm,short_name='SM',long_name='Soil Moisture',unit='kg m**-3'
+info,table2=228,name=param,value=131,data=u10n,short_name='U10N',long_name='Neutral wind at 10 m x-component',unit='m s**-1'
+info,table2=228,name=param,value=132,data=v10n,short_name='V10N',long_name='Neutral wind at 10 m y-component',unit='m s**-1'
+info,table2=228,name=param,value=139,data=st,short_name='ST',long_name='Soil Temperature',unit='K'
+info,table2=228,name=param,value=141,data=sd,short_name='SD',long_name='Snow Depth water equivalent',unit='m'
+info,table2=228,name=param,value=144,data=sf,short_name='SF',long_name='Snow Fall water equivalent',unit='kg m**-2'
+info,table2=228,name=param,value=164,data=tcc,short_name='TCC',long_name='Total Cloud Cover',unit='%'
+info,table2=228,name=param,value=170,data=cap,short_name='CAP',long_name='Field capacity',unit='kg m**-3'
+info,table2=228,name=param,value=171,data=wilt,short_name='WILT',long_name='Wilting point',unit='kg m**-3'
+info,table2=228,name=param,value=228,data=tp,short_name='TP',long_name='Total Precipitation',unit='kg m**-2'
+info,table2=230,name=param,value=44,data=esvar,short_name='ESVAR',long_name='Snow evaporation (variable resolution)',unit='m of water'
+info,table2=230,name=param,value=45,data=smltvar,short_name='SMLTVAR',long_name='Snowmelt (variable resolution)',unit='m of water'
+info,table2=230,name=param,value=46,data=sdurvar,short_name='SDURVAR',long_name='Solar duration (variable resolution)',unit='s'
+info,table2=230,name=param,value=57,data=uvbvar,short_name='UVBVAR',long_name='Downward UV radiation at the surface (variable resolution)',unit='w m**-2 s'
+info,table2=230,name=param,value=58,data=parvar,short_name='PARVAR',long_name='Photosynthetically active radiation at the surface (variable resolution)',unit='w m**-2 s'
+info,table2=230,name=param,value=142,data=lspvar,short_name='LSPVAR',long_name='Stratiform precipitation (Large-scale precipitation) (variable resolution)',unit='m'
+info,table2=230,name=param,value=143,data=cpvar,short_name='CPVAR',long_name='Convective precipitation (variable resolution)',unit='m'
+info,table2=230,name=param,value=144,data=sfvar,short_name='SFVAR',long_name='Snowfall (convective + stratiform) (variable resolution)',unit='m of water equivalent'
+info,table2=230,name=param,value=145,data=bldvar,short_name='BLDVAR',long_name='Boundary layer dissipation (variable resolution)',unit='W m**-2 s'
+info,table2=230,name=param,value=146,data=sshfvar,short_name='SSHFVAR',long_name='Surface sensible heat flux (variable resolution)',unit='W m**-2 s'
+info,table2=230,name=param,value=147,data=slhfvar,short_name='SLHFVAR',long_name='Surface latent heat flux (variable resolution)',unit='W m**-2 s'
+info,table2=230,name=param,value=169,data=ssrdvar,short_name='SSRDVAR',long_name='Surface solar radiation downwards (variable resolution)',unit='W m**-2 s'
+info,table2=230,name=param,value=175,data=strdvar,short_name='STRDVAR',long_name='Surface thermal radiation downwards (variable resolution)',unit='W m**-2 s'
+info,table2=230,name=param,value=176,data=ssrvar,short_name='SSRVAR',long_name='Surface solar radiation (variable resolution)',unit='W m**-2 s'
+info,table2=230,name=param,value=177,data=strvar,short_name='STRVAR',long_name='Surface thermal radiation (variable resolution)',unit='W m**-2 s'
+info,table2=230,name=param,value=178,data=tsrvar,short_name='TSRVAR',long_name='Top solar radiation (variable resolution)',unit='W m**-2 s'
+info,table2=230,name=param,value=179,data=ttrvar,short_name='TTRVAR',long_name='Top thermal radiation (variable resolution)',unit='W m**-2 s'
+info,table2=230,name=param,value=180,data=ewssvar,short_name='EWSSVAR',long_name='East-West surface stress (variable resolution)',unit='N m**-2 s'
+info,table2=230,name=param,value=181,data=nsssvar,short_name='NSSSVAR',long_name='North-South surface stress (variable resolution)',unit='N m**-2 s'
+info,table2=230,name=param,value=182,data=evar,short_name='EVAR',long_name='Evaporation (variable resolution)',unit='m of water'
+info,table2=230,name=param,value=189,data=sundvar,short_name='SUNDVAR',long_name='Sunshine duration (variable resolution)',unit='s'
+info,table2=230,name=param,value=195,data=lgwsvar,short_name='LGWSVAR',long_name='Latitudinal component of gravity wave stress (variable resolution)',unit='N m**-2 s'
+info,table2=230,name=param,value=196,data=mgwsvar,short_name='MGWSVAR',long_name='Meridional component of gravity wave stress (variable resolution)',unit='N m**-2 s'
+info,table2=230,name=param,value=197,data=gwdvar,short_name='GWDVAR',long_name='Gravity wave dissipation (variable resolution)',unit='W m**-2 s'
+info,table2=230,name=param,value=198,data=srcvar,short_name='SRCVAR',long_name='Skin reservoir content (variable resolution)',unit='m of water'
+info,table2=230,name=param,value=205,data=rovar,short_name='ROVAR',long_name='Runoff (variable resolution)',unit='m'
+info,table2=230,name=param,value=208,data=tsrcvar,short_name='TSRCVAR',long_name='Top net solar radiation, clear sky (variable resolution)',unit='W m**-2 s'
+info,table2=230,name=param,value=209,data=ttrcvar,short_name='TTRCVAR',long_name='Top net thermal radiation, clear sky (variable resolution)',unit='W m**-2 s'
+info,table2=230,name=param,value=210,data=ssrcvar,short_name='SSRCVAR',long_name='Surface net solar radiation, clear sky (variable resolution)',unit='W m**-2 s'
+info,table2=230,name=param,value=211,data=strcvar,short_name='STRCVAR',long_name='Surface net thermal radiation, clear sky (variable resolution)',unit='W m**-2 s'
+info,table2=230,name=param,value=212,data=tisrvar,short_name='TISRVAR',long_name='TOA incident solar radiation (variable resolution)',unit='W m**-2 s'
+info,table2=234,name=param,value=139,data=sts,short_name='STS',long_name='Surface temperature significance',unit='percentage'
+info,table2=234,name=param,value=151,data=msls,short_name='MSLS',long_name='Mean sea level pressure significance',unit='percentage'
+info,table2=234,name=param,value=167,data=2ts,short_name='2TS',long_name='2 metre temperature significance',unit='percentage'
+info,table2=234,name=param,value=228,data=tps,short_name='TPS',long_name='Total precipitation significance',unit='percentage'
diff --git a/gribtables/wmostd/table_2_version_001 b/gribtables/wmostd/table_2_version_001
new file mode 100755
index 0000000..13dbb09
--- /dev/null
+++ b/gribtables/wmostd/table_2_version_001
@@ -0,0 +1,771 @@
+WMO standard table 2: Version Number 3.
+Codes and data units for FM 92-X Ext.GRIB.
+......................
+001
+P
+Pressure
+Pa
+Pa
+......................
+002
+MSL
+Mean sea level pressure
+Pa
+Pa
+......................
+003
+None
+Pressure tendency
+Pa s**-1
+Pa s**-1
+......................
+004
+PV
+Potential vorticity
+K m**2 kg**-1 s**-1
+K m**2 kg**-1 s**-1
+......................
+005
+None
+ICAO Standard Atmosphere reference height
+m
+m
+......................
+006
+Z
+Geopotential
+m**2 s**-2
+m**2 s**-2
+......................
+007
+GH
+Geopotential height
+gpm
+gpm
+......................
+008
+H
+Geometrical height
+m
+m
+......................
+009
+None
+Standard deviation of height
+m
+m
+......................
+010
+TCO3
+Total column ozone
+Dobson (kg m**-2)
+Dobson (kg m**-2)
+......................
+011
+T
+Temperature
+K
+K
+......................
+012
+None
+Virtual temperature
+K
+K
+......................
+013
+None
+Potential temperature
+K
+K
+......................
+014
+None
+Pseudo-adiabatic potential temperature
+K
+K
+......................
+015
+None
+Maximum temperature
+K
+K
+......................
+016
+None
+Minimum temperature
+K
+K
+......................
+017
+None
+Dewpoint temperature
+K
+K
+......................
+018
+None
+Dewpoint depression (or deficit)
+K
+K
+......................
+019
+None
+Lapse rate
+K s**-1
+K s**-1
+......................
+020
+None
+Visibility
+m
+m
+......................
+021
+None
+Radar spectra (1)
+-
+-
+......................
+022
+None
+Radar spectra (2)
+-
+-
+......................
+023
+None
+Radar spectra (3)
+-
+-
+......................
+024
+None
+Parcel lifted index (to 500 hPa)
+K
+K
+......................
+025
+None
+Temperature anomaly
+K
+K
+......................
+026
+None
+Pressure anomaly
+Pa
+Pa
+......................
+027
+None
+Geopotential height anomaly
+gpm
+gpm
+......................
+028
+None
+Wave spectra (1)
+-
+-
+......................
+029
+None
+Wave spectra (2)
+-
+-
+......................
+030
+None
+Wave spectra (3)
+-
+-
+......................
+031
+None
+Wind direction
+Degree true
+Degree true
+......................
+032
+None
+Wind speed
+m s**-1
+m s**-1
+......................
+033
+U
+U component of wind
+m s**-1
+m s**-1
+......................
+034
+V
+V component of wind
+m s**-1
+m s**-1
+......................
+035
+None
+Stream function
+m**2 s**-1
+m**2 s**-1
+......................
+036
+None
+Velocity potential
+m**2 s**-1
+m**2 s**-1
+......................
+037
+None
+Montgomery stream function
+m**2 s**-1
+m**2 s**-1
+......................
+038
+None
+Sigma coordinate vertical velocity
+s**-1
+s**-1
+......................
+039
+W
+Vertical velocity
+Pa s**-1
+Pa s**-1
+......................
+040
+None
+Vertical velocity
+m s**-1
+m s**-1
+......................
+041
+None
+Absolute vorticity
+s**-1
+s**-1
+......................
+042
+None
+Absolute divergence
+s**-1
+s**-1
+......................
+043
+VO
+Relative vorticity
+s**-1
+s**-1
+......................
+044
+D
+Relative divergence
+s**-1
+s**-1
+......................
+045
+None
+Vertical U component shear
+s**-1
+s**-1
+......................
+046
+None
+Vertical V component shear
+s**-1
+s**-1
+......................
+047
+None
+Direction of current
+Degree true
+Degree true
+......................
+048
+None
+Speed of current
+m s**-1
+m s**-1
+......................
+049
+None
+U component of current
+m s**-1
+m s**-1
+......................
+050
+None
+V component of current
+m s**-1
+m s**-1
+......................
+051
+Q
+Specific humidity
+kg kg**-1
+kg kg**-1
+......................
+052
+R
+Relative humidity
+%
+%
+......................
+053
+None
+Humidity mixing ratio
+kg m**-2
+kg m**-2
+......................
+054
+None
+Precipitable water content
+kg m**-2
+kg m**-2
+......................
+055
+None
+Vapour pressure
+Pa
+Pa
+......................
+056
+None
+Saturation deficit
+Pa
+Pa
+......................
+057
+E
+Evaporation
+kg m**-2
+kg m**-2
+......................
+058
+CIWC
+Cloud ice
+kg m**-2
+kg m**-2
+......................
+059
+None
+Precipitation rate
+kg m**-2 s**-1
+kg m**-2 s**-1
+......................
+060
+None
+Thunderstorm probability
+%
+%
+......................
+061
+TP
+Total precipitation
+kg m**-2
+kg m**-2
+......................
+062
+None
+Large-scale precipitation
+kg m**-2
+kg m**-2
+......................
+063
+None
+Convective precipitation
+kg m**-2
+kg m**-2
+......................
+064
+None
+Snowfall rate water equivalent
+kg m**-2 s**-1
+kg m**-2 s**-1
+......................
+065
+SF
+Water equivalent of accumulated snow depth
+kg m**-2
+kg m**-2
+......................
+066
+SD
+Snow depth
+m (of water equivalent)
+m (of water equivalent)
+......................
+067
+None
+Mixed layer depth
+m
+m
+......................
+068
+None
+Transient thermocline depth
+m
+m
+......................
+069
+None
+Main thermocline depth
+m
+m
+......................
+070
+None
+Main thermocline anomaly
+m
+m
+......................
+071
+TCC
+Total cloud cover
+%
+%
+......................
+072
+CCC
+Convective cloud cover
+%
+%
+......................
+073
+LCC
+Low cloud cover
+%
+%
+......................
+074
+MCC
+Medium cloud cover
+%
+%
+......................
+075
+HCC
+High cloud cover
+%
+%
+......................
+076
+CLWC
+Cloud liquid water content
+kg kg**-1
+kg kg**-1
+......................
+077
+None
+Best lifted index (to 500 hPa)
+K
+K
+......................
+078
+CSF
+Convective snowfall
+kg m**-2
+kg m**-2
+......................
+079
+LSF
+Large-scale snowfall
+kg m**-2
+kg m**-2
+......................
+080
+None
+Water temperature
+K
+K
+......................
+081
+LSM
+Land cover (1=land, 0=sea)
+(0 - 1)
+(0 - 1)
+......................
+082
+None
+Deviation of sea level from mean
+m
+m
+......................
+083
+SR
+Surface roughness
+m
+m
+......................
+084
+AL
+Albedo
+-
+-
+......................
+085
+ST
+Surface temperature of soil
+K
+K
+......................
+086
+SSW
+Soil moisture content
+kg m**-2
+kg m**-2
+......................
+087
+VEG
+Percentage of vegetation
+%
+%
+......................
+088
+None
+Salinity
+kg kg**-1
+kg kg**-1
+......................
+089
+None
+Density
+kg m**-3
+kg kg**-1
+......................
+090
+RO
+Water run-off
+kg m**-2
+kg m**-2
+......................
+091
+None
+Ice cover (1=land, 0=sea)
+(0 - 1)
+(0 - 1)
+......................
+092
+None
+Ice thickness
+m
+m
+......................
+093
+None
+Direction of ice drift
+Degree true
+Degree true
+......................
+094
+None
+Speed of ice drift
+m s*-1
+m s*-1
+......................
+095
+None
+U component of ice drift
+m s**-1
+m s**-1
+......................
+096
+None
+V component of ice drift
+m s**-1
+m s**-1
+......................
+097
+None
+Ice growth rate
+m s**-1
+m s**-1
+......................
+098
+None
+Ice divergence
+s**-1
+s**-1
+......................
+099
+None
+Snowmelt
+kg m**-2
+kg m**-2
+......................
+100
+SWH
+Significant height, combined wind waves and swell
+m
+m
+......................
+101
+MDWW
+Mean direction of wind waves
+Degree true
+Degree true
+......................
+102
+SHWW
+Significant height of wind waves
+m
+m
+......................
+103
+MPWW
+Mean period of wind waves
+s
+s
+......................
+104
+None
+Direction of swell waves
+Degree true
+Degree true
+......................
+105
+None
+Significant height of swell waves
+m
+m
+......................
+106
+None
+Mean period of swell waves
+s
+s
+......................
+107
+MDPS
+Mean direction of primary swell
+Degree true
+Degree true
+......................
+108
+MPPS
+Mean period of primary swell
+s
+s
+......................
+109
+None
+Secondary wave direction
+Degree true
+Degree true
+......................
+110
+None
+Secondary wave period
+s
+s
+......................
+111
+None
+Net short-wave radiation flux (surface)
+W m**-2
+W m**-2
+......................
+112
+None
+Net long-wave radiation flux (surface)
+W m**-2
+W m**-2
+......................
+113
+None
+Net short-wave radiation flux(atmosphere top)
+W m**-2
+W m**-2
+......................
+114
+None
+Net long-wave radiation flux(atmosphere top)
+W m**-2
+W m**-2
+......................
+115
+None
+Long-wave radiation flux
+W m**-2
+W m**-2
+......................
+116
+None
+Short-wave radiation flux
+W m**-2
+W m**-2
+......................
+117
+None
+Global radiation flux
+W m**-2
+W m**-2
+......................
+118
+None
+Brightness temperature
+K
+K
+......................
+119
+None
+Radiance (with respect to wave number)
+W m**-1 sr**-1
+W m**-1 sr**-1
+......................
+120
+None
+Radiance (with respect to wave length)
+W m**-1 sr**-1
+W m**-3 sr**-1
+......................
+121
+SLHF
+Surface latent heat flux
+W m**-2
+W m**-2
+......................
+122
+SSHF
+Surface sensible heat flux
+W m**-2
+W m**-2
+......................
+123
+BLD
+Boundary layer dissipation
+W m**-2
+W m**-2
+......................
+124
+None
+Momentum flux, U component
+N m**-2
+N m**-2
+......................
+125
+None
+Momentum flux, V component
+N m**-2
+N m**-2
+......................
+126
+None
+Wind mixing energy
+J
+J
+......................
+127
+None
+Image data
+-
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
diff --git a/gribtables/wmostd/table_2_version_002 b/gribtables/wmostd/table_2_version_002
new file mode 100755
index 0000000..0344d55
--- /dev/null
+++ b/gribtables/wmostd/table_2_version_002
@@ -0,0 +1,771 @@
+WMO standard table 2: Version Number 3.
+Codes and data units for FM 92-X Ext.GRIB.
+......................
+001
+P
+Pressure
+Pa
+Pa
+......................
+002
+MSL
+Mean sea level pressure
+Pa
+Pa
+......................
+003
+None
+Pressure tendency
+Pa s**-1
+Pa s**-1
+......................
+004
+PV
+Potential vorticity
+K m**2 kg**-1 s**-1
+K m**2 kg**-1 s**-1
+......................
+005
+None
+ICAO Standard Atmosphere reference height
+m
+m
+......................
+006
+Z
+Geopotential
+m**2 s**-2
+m**2 s**-2
+......................
+007
+GH
+Geopotential height
+gpm
+gpm
+......................
+008
+H
+Geometrical height
+m
+m
+......................
+009
+None
+Standard deviation of height
+m
+m
+......................
+010
+TCO3
+Total column ozone
+Dobson (kg m**-2)
+Dobson (kg m**-2)
+......................
+011
+T
+Temperature
+K
+K
+......................
+012
+None
+Virtual temperature
+K
+K
+......................
+013
+None
+Potential temperature
+K
+K
+......................
+014
+None
+Pseudo-adiabatic potential temperature
+K
+K
+......................
+015
+None
+Maximum temperature
+K
+K
+......................
+016
+None
+Minimum temperature
+K
+K
+......................
+017
+None
+Dewpoint temperature
+K
+K
+......................
+018
+None
+Dewpoint depression (or deficit)
+K
+K
+......................
+019
+None
+Lapse rate
+K s**-1
+K s**-1
+......................
+020
+None
+Visibility
+m
+m
+......................
+021
+None
+Radar spectra (1)
+-
+-
+......................
+022
+None
+Radar spectra (2)
+-
+-
+......................
+023
+None
+Radar spectra (3)
+-
+-
+......................
+024
+None
+Parcel lifted index (to 500 hPa)
+K
+K
+......................
+025
+None
+Temperature anomaly
+K
+K
+......................
+026
+None
+Pressure anomaly
+Pa
+Pa
+......................
+027
+None
+Geopotential height anomaly
+gpm
+gpm
+......................
+028
+None
+Wave spectra (1)
+-
+-
+......................
+029
+None
+Wave spectra (2)
+-
+-
+......................
+030
+None
+Wave spectra (3)
+-
+-
+......................
+031
+None
+Wind direction
+Degree true
+Degree true
+......................
+032
+None
+Wind speed
+m s**-1
+m s**-1
+......................
+033
+U
+U component of wind
+m s**-1
+m s**-1
+......................
+034
+V
+V component of wind
+m s**-1
+m s**-1
+......................
+035
+None
+Stream function
+m**2 s**-1
+m**2 s**-1
+......................
+036
+None
+Velocity potential
+m**2 s**-1
+m**2 s**-1
+......................
+037
+None
+Montgomery stream function
+m**2 s**-1
+m**2 s**-1
+......................
+038
+None
+Sigma coordinate vertical velocity
+s**-1
+s**-1
+......................
+039
+W
+Vertical velocity
+Pa s**-1
+Pa s**-1
+......................
+040
+None
+Vertical velocity
+m s**-1
+m s**-1
+......................
+041
+None
+Absolute vorticity
+s**-1
+s**-1
+......................
+042
+None
+Absolute divergence
+s**-1
+s**-1
+......................
+043
+VO
+Relative vorticity
+s**-1
+s**-1
+......................
+044
+D
+Relative divergence
+s**-1
+s**-1
+......................
+045
+None
+Vertical U component shear
+s**-1
+s**-1
+......................
+046
+None
+Vertical V component shear
+s**-1
+s**-1
+......................
+047
+None
+Direction of current
+Degree true
+Degree true
+......................
+048
+None
+Speed of current
+m s**-1
+m s**-1
+......................
+049
+None
+U component of current
+m s**-1
+m s**-1
+......................
+050
+None
+V component of current
+m s**-1
+m s**-1
+......................
+051
+Q
+Specific humidity
+kg kg**-1
+kg kg**-1
+......................
+052
+R
+Relative humidity
+%
+%
+......................
+053
+None
+Humidity mixing ratio
+kg m**-2
+kg m**-2
+......................
+054
+None
+Precipitable content water
+kg m**-2
+kg m**-2
+......................
+055
+None
+Vapour pressure
+Pa
+Pa
+......................
+056
+None
+Saturation deficit
+Pa
+Pa
+......................
+057
+E
+Evaporation
+kg m**-2
+kg m**-2
+......................
+058
+CIWC
+Cloud ice
+kg m**-2
+kg m**-2
+......................
+059
+None
+Precipitation rate
+kg m**-2 s**-1
+kg m**-2 s**-1
+......................
+060
+None
+Thunderstorm probability
+%
+%
+......................
+061
+TP
+Total precipitation
+kg m**-2
+kg m**-2
+......................
+062
+None
+Large-scale precipitation
+kg m**-2
+kg m**-2
+......................
+063
+None
+Convective precipitation
+kg m**-2
+kg m**-2
+......................
+064
+None
+Snowfall rate water equivalent
+kg m**-2 s**-1
+kg m**-2 s**-1
+......................
+065
+SF
+Water equivalent of accumulated snow depth
+kg m**-2
+kg m**-2
+......................
+066
+SD
+Snow depth
+m (of water equivalent)
+m (of water equivalent)
+......................
+067
+None
+Mixed layer depth
+m
+m
+......................
+068
+None
+Transient thermocline depth
+m
+m
+......................
+069
+None
+Main thermocline depth
+m
+m
+......................
+070
+None
+Main thermocline anomaly
+m
+m
+......................
+071
+TCC
+Total cloud cover
+%
+%
+......................
+072
+CCC
+Convective cloud cover
+%
+%
+......................
+073
+LCC
+Low cloud cover
+%
+%
+......................
+074
+MCC
+Medium cloud cover
+%
+%
+......................
+075
+HCC
+High cloud cover
+%
+%
+......................
+076
+CLWC
+Cloud liquid water content
+kg kg**-1
+kg kg**-1
+......................
+077
+None
+Best lifted index (to 500 hPa)
+K
+K
+......................
+078
+CSF
+Convective snowfall
+kg m**-2
+kg m**-2
+......................
+079
+LSF
+Large-scale snowfall
+kg m**-2
+kg m**-2
+......................
+080
+None
+Water temperature
+K
+K
+......................
+081
+LSM
+Land cover (1=land, 0=sea)
+(0 - 1)
+(0 - 1)
+......................
+082
+None
+Deviation of sea level from mean
+m
+m
+......................
+083
+SR
+Surface roughness
+m
+m
+......................
+084
+AL
+Albedo
+-
+-
+......................
+085
+ST
+Surface temperature of soil
+K
+K
+......................
+086
+SSW
+Soil moisture content
+kg m**-2
+kg m**-2
+......................
+087
+VEG
+Percentage of vegetation
+%
+%
+......................
+088
+None
+Salinity
+kg kg**-1
+kg kg**-1
+......................
+089
+None
+Density
+kg m**-3
+kg kg**-1
+......................
+090
+RO
+Water run-off
+kg m**-2
+kg m**-2
+......................
+091
+None
+Ice cover (1=land, 0=sea)
+(0 - 1)
+(0 - 1)
+......................
+092
+None
+Ice thickness
+m
+m
+......................
+093
+None
+Direction of ice drift
+Degree true
+Degree true
+......................
+094
+None
+Speed of ice drift
+m s*-1
+m s*-1
+......................
+095
+None
+U component of ice drift
+m s**-1
+m s**-1
+......................
+096
+None
+V component of ice drift
+m s**-1
+m s**-1
+......................
+097
+None
+Ice growth rate
+m s**-1
+m s**-1
+......................
+098
+None
+Ice divergence
+s**-1
+s**-1
+......................
+099
+None
+Snowmelt
+kg m**-2
+kg m**-2
+......................
+100
+SWH
+Significant height, combined wind waves and swell
+m
+m
+......................
+101
+MDWW
+Mean direction of wind waves
+Degree true
+Degree true
+......................
+102
+SHWW
+Significant height of wind waves
+m
+m
+......................
+103
+MPWW
+Mean period of wind waves
+s
+s
+......................
+104
+None
+Direction of swell waves
+Degree true
+Degree true
+......................
+105
+None
+Significant height of swell waves
+m
+m
+......................
+106
+None
+Mean period of swell waves
+s
+s
+......................
+107
+MDPS
+Mean direction of primary swell
+Degree true
+Degree true
+......................
+108
+MPPS
+Mean period of primary swell
+s
+s
+......................
+109
+None
+Secondary wave direction
+Degree true
+Degree true
+......................
+110
+None
+Secondary wave period
+s
+s
+......................
+111
+None
+Net short-wave radiation flux (surface)
+W m**-2
+W m**-2
+......................
+112
+None
+Net long-wave radiation flux (surface)
+W m**-2
+W m**-2
+......................
+113
+None
+Net short-wave radiation flux(atmosphere top)
+W m**-2
+W m**-2
+......................
+114
+None
+Net long-wave radiation flux(atmosphere top)
+W m**-2
+W m**-2
+......................
+115
+None
+Long-wave radiation flux
+W m**-2
+W m**-2
+......................
+116
+None
+Short-wave radiation flux
+W m**-2
+W m**-2
+......................
+117
+None
+Global radiation flux
+W m**-2
+W m**-2
+......................
+118
+None
+Brightness temperature
+K
+K
+......................
+119
+None
+Radiance (with respect to wave number)
+W m**-1 sr**-1
+W m**-1 sr**-1
+......................
+120
+None
+Radiance (with respect to wave length)
+W m**-1 sr**-1
+W m**-3 sr**-1
+......................
+121
+SLHF
+Surface latent heat flux
+W m**-2
+W m**-2
+......................
+122
+SSHF
+Surface sensible heat flux
+W m**-2
+W m**-2
+......................
+123
+BLD
+Boundary layer dissipation
+W m**-2
+W m**-2
+......................
+124
+None
+Momentum flux, U component
+N m**-2
+N m**-2
+......................
+125
+None
+Momentum flux, V component
+N m**-2
+N m**-2
+......................
+126
+None
+Wind mixing energy
+J
+J
+......................
+127
+None
+Image data
+-
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
diff --git a/gribtables/wmostd/table_2_version_003 b/gribtables/wmostd/table_2_version_003
new file mode 100755
index 0000000..13dbb09
--- /dev/null
+++ b/gribtables/wmostd/table_2_version_003
@@ -0,0 +1,771 @@
+WMO standard table 2: Version Number 3.
+Codes and data units for FM 92-X Ext.GRIB.
+......................
+001
+P
+Pressure
+Pa
+Pa
+......................
+002
+MSL
+Mean sea level pressure
+Pa
+Pa
+......................
+003
+None
+Pressure tendency
+Pa s**-1
+Pa s**-1
+......................
+004
+PV
+Potential vorticity
+K m**2 kg**-1 s**-1
+K m**2 kg**-1 s**-1
+......................
+005
+None
+ICAO Standard Atmosphere reference height
+m
+m
+......................
+006
+Z
+Geopotential
+m**2 s**-2
+m**2 s**-2
+......................
+007
+GH
+Geopotential height
+gpm
+gpm
+......................
+008
+H
+Geometrical height
+m
+m
+......................
+009
+None
+Standard deviation of height
+m
+m
+......................
+010
+TCO3
+Total column ozone
+Dobson (kg m**-2)
+Dobson (kg m**-2)
+......................
+011
+T
+Temperature
+K
+K
+......................
+012
+None
+Virtual temperature
+K
+K
+......................
+013
+None
+Potential temperature
+K
+K
+......................
+014
+None
+Pseudo-adiabatic potential temperature
+K
+K
+......................
+015
+None
+Maximum temperature
+K
+K
+......................
+016
+None
+Minimum temperature
+K
+K
+......................
+017
+None
+Dewpoint temperature
+K
+K
+......................
+018
+None
+Dewpoint depression (or deficit)
+K
+K
+......................
+019
+None
+Lapse rate
+K s**-1
+K s**-1
+......................
+020
+None
+Visibility
+m
+m
+......................
+021
+None
+Radar spectra (1)
+-
+-
+......................
+022
+None
+Radar spectra (2)
+-
+-
+......................
+023
+None
+Radar spectra (3)
+-
+-
+......................
+024
+None
+Parcel lifted index (to 500 hPa)
+K
+K
+......................
+025
+None
+Temperature anomaly
+K
+K
+......................
+026
+None
+Pressure anomaly
+Pa
+Pa
+......................
+027
+None
+Geopotential height anomaly
+gpm
+gpm
+......................
+028
+None
+Wave spectra (1)
+-
+-
+......................
+029
+None
+Wave spectra (2)
+-
+-
+......................
+030
+None
+Wave spectra (3)
+-
+-
+......................
+031
+None
+Wind direction
+Degree true
+Degree true
+......................
+032
+None
+Wind speed
+m s**-1
+m s**-1
+......................
+033
+U
+U component of wind
+m s**-1
+m s**-1
+......................
+034
+V
+V component of wind
+m s**-1
+m s**-1
+......................
+035
+None
+Stream function
+m**2 s**-1
+m**2 s**-1
+......................
+036
+None
+Velocity potential
+m**2 s**-1
+m**2 s**-1
+......................
+037
+None
+Montgomery stream function
+m**2 s**-1
+m**2 s**-1
+......................
+038
+None
+Sigma coordinate vertical velocity
+s**-1
+s**-1
+......................
+039
+W
+Vertical velocity
+Pa s**-1
+Pa s**-1
+......................
+040
+None
+Vertical velocity
+m s**-1
+m s**-1
+......................
+041
+None
+Absolute vorticity
+s**-1
+s**-1
+......................
+042
+None
+Absolute divergence
+s**-1
+s**-1
+......................
+043
+VO
+Relative vorticity
+s**-1
+s**-1
+......................
+044
+D
+Relative divergence
+s**-1
+s**-1
+......................
+045
+None
+Vertical U component shear
+s**-1
+s**-1
+......................
+046
+None
+Vertical V component shear
+s**-1
+s**-1
+......................
+047
+None
+Direction of current
+Degree true
+Degree true
+......................
+048
+None
+Speed of current
+m s**-1
+m s**-1
+......................
+049
+None
+U component of current
+m s**-1
+m s**-1
+......................
+050
+None
+V component of current
+m s**-1
+m s**-1
+......................
+051
+Q
+Specific humidity
+kg kg**-1
+kg kg**-1
+......................
+052
+R
+Relative humidity
+%
+%
+......................
+053
+None
+Humidity mixing ratio
+kg m**-2
+kg m**-2
+......................
+054
+None
+Precipitable water content
+kg m**-2
+kg m**-2
+......................
+055
+None
+Vapour pressure
+Pa
+Pa
+......................
+056
+None
+Saturation deficit
+Pa
+Pa
+......................
+057
+E
+Evaporation
+kg m**-2
+kg m**-2
+......................
+058
+CIWC
+Cloud ice
+kg m**-2
+kg m**-2
+......................
+059
+None
+Precipitation rate
+kg m**-2 s**-1
+kg m**-2 s**-1
+......................
+060
+None
+Thunderstorm probability
+%
+%
+......................
+061
+TP
+Total precipitation
+kg m**-2
+kg m**-2
+......................
+062
+None
+Large-scale precipitation
+kg m**-2
+kg m**-2
+......................
+063
+None
+Convective precipitation
+kg m**-2
+kg m**-2
+......................
+064
+None
+Snowfall rate water equivalent
+kg m**-2 s**-1
+kg m**-2 s**-1
+......................
+065
+SF
+Water equivalent of accumulated snow depth
+kg m**-2
+kg m**-2
+......................
+066
+SD
+Snow depth
+m (of water equivalent)
+m (of water equivalent)
+......................
+067
+None
+Mixed layer depth
+m
+m
+......................
+068
+None
+Transient thermocline depth
+m
+m
+......................
+069
+None
+Main thermocline depth
+m
+m
+......................
+070
+None
+Main thermocline anomaly
+m
+m
+......................
+071
+TCC
+Total cloud cover
+%
+%
+......................
+072
+CCC
+Convective cloud cover
+%
+%
+......................
+073
+LCC
+Low cloud cover
+%
+%
+......................
+074
+MCC
+Medium cloud cover
+%
+%
+......................
+075
+HCC
+High cloud cover
+%
+%
+......................
+076
+CLWC
+Cloud liquid water content
+kg kg**-1
+kg kg**-1
+......................
+077
+None
+Best lifted index (to 500 hPa)
+K
+K
+......................
+078
+CSF
+Convective snowfall
+kg m**-2
+kg m**-2
+......................
+079
+LSF
+Large-scale snowfall
+kg m**-2
+kg m**-2
+......................
+080
+None
+Water temperature
+K
+K
+......................
+081
+LSM
+Land cover (1=land, 0=sea)
+(0 - 1)
+(0 - 1)
+......................
+082
+None
+Deviation of sea level from mean
+m
+m
+......................
+083
+SR
+Surface roughness
+m
+m
+......................
+084
+AL
+Albedo
+-
+-
+......................
+085
+ST
+Surface temperature of soil
+K
+K
+......................
+086
+SSW
+Soil moisture content
+kg m**-2
+kg m**-2
+......................
+087
+VEG
+Percentage of vegetation
+%
+%
+......................
+088
+None
+Salinity
+kg kg**-1
+kg kg**-1
+......................
+089
+None
+Density
+kg m**-3
+kg kg**-1
+......................
+090
+RO
+Water run-off
+kg m**-2
+kg m**-2
+......................
+091
+None
+Ice cover (1=land, 0=sea)
+(0 - 1)
+(0 - 1)
+......................
+092
+None
+Ice thickness
+m
+m
+......................
+093
+None
+Direction of ice drift
+Degree true
+Degree true
+......................
+094
+None
+Speed of ice drift
+m s*-1
+m s*-1
+......................
+095
+None
+U component of ice drift
+m s**-1
+m s**-1
+......................
+096
+None
+V component of ice drift
+m s**-1
+m s**-1
+......................
+097
+None
+Ice growth rate
+m s**-1
+m s**-1
+......................
+098
+None
+Ice divergence
+s**-1
+s**-1
+......................
+099
+None
+Snowmelt
+kg m**-2
+kg m**-2
+......................
+100
+SWH
+Significant height, combined wind waves and swell
+m
+m
+......................
+101
+MDWW
+Mean direction of wind waves
+Degree true
+Degree true
+......................
+102
+SHWW
+Significant height of wind waves
+m
+m
+......................
+103
+MPWW
+Mean period of wind waves
+s
+s
+......................
+104
+None
+Direction of swell waves
+Degree true
+Degree true
+......................
+105
+None
+Significant height of swell waves
+m
+m
+......................
+106
+None
+Mean period of swell waves
+s
+s
+......................
+107
+MDPS
+Mean direction of primary swell
+Degree true
+Degree true
+......................
+108
+MPPS
+Mean period of primary swell
+s
+s
+......................
+109
+None
+Secondary wave direction
+Degree true
+Degree true
+......................
+110
+None
+Secondary wave period
+s
+s
+......................
+111
+None
+Net short-wave radiation flux (surface)
+W m**-2
+W m**-2
+......................
+112
+None
+Net long-wave radiation flux (surface)
+W m**-2
+W m**-2
+......................
+113
+None
+Net short-wave radiation flux(atmosphere top)
+W m**-2
+W m**-2
+......................
+114
+None
+Net long-wave radiation flux(atmosphere top)
+W m**-2
+W m**-2
+......................
+115
+None
+Long-wave radiation flux
+W m**-2
+W m**-2
+......................
+116
+None
+Short-wave radiation flux
+W m**-2
+W m**-2
+......................
+117
+None
+Global radiation flux
+W m**-2
+W m**-2
+......................
+118
+None
+Brightness temperature
+K
+K
+......................
+119
+None
+Radiance (with respect to wave number)
+W m**-1 sr**-1
+W m**-1 sr**-1
+......................
+120
+None
+Radiance (with respect to wave length)
+W m**-1 sr**-1
+W m**-3 sr**-1
+......................
+121
+SLHF
+Surface latent heat flux
+W m**-2
+W m**-2
+......................
+122
+SSHF
+Surface sensible heat flux
+W m**-2
+W m**-2
+......................
+123
+BLD
+Boundary layer dissipation
+W m**-2
+W m**-2
+......................
+124
+None
+Momentum flux, U component
+N m**-2
+N m**-2
+......................
+125
+None
+Momentum flux, V component
+N m**-2
+N m**-2
+......................
+126
+None
+Wind mixing energy
+J
+J
+......................
+127
+None
+Image data
+-
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
diff --git a/gribtables/wmostd/table_2_version_003.ecmwf b/gribtables/wmostd/table_2_version_003.ecmwf
new file mode 100755
index 0000000..2863028
--- /dev/null
+++ b/gribtables/wmostd/table_2_version_003.ecmwf
@@ -0,0 +1,771 @@
+WMO standard table 2: Version Number 3.
+Codes and data units for FM 92-X Ext.GRIB.
+......................
+001
+P
+Pressure
+Pa
+Pa
+......................
+002
+MSL
+Mean sea level pressure
+Pa
+Pa
+......................
+003
+None
+Pressure tendency
+Pa s**-1
+Pa s**-1
+......................
+004
+PV
+Potential vorticity
+K m**2 kg**-1 s**-1
+K m**2 kg**-1 s**-1
+......................
+005
+None
+ICAO Standard Atmosphere reference height
+m
+m
+......................
+006
+Z
+Geopotential
+m**2 s**-2
+m**2 s**-2
+......................
+007
+GH
+Geopotential height
+gpm
+gpm
+......................
+008
+H
+Geometrical height
+m
+m
+......................
+009
+None
+Standard deviation of height
+m
+m
+......................
+010
+TCO3
+Total (column) ozone
+Dobson (kg m**-2)
+Dobson (kg m**-2)
+......................
+011
+T
+Temperature
+K
+K
+......................
+012
+None
+Virtual temperature
+K
+K
+......................
+013
+None
+Potential temperature
+K
+K
+......................
+014
+None
+Pseudo-adiabatic potential temperature
+K
+K
+......................
+015
+None
+Maximum temperature
+K
+K
+......................
+016
+None
+Minimum temperature
+K
+K
+......................
+017
+None
+Dew-point temperature
+K
+K
+......................
+018
+None
+Dew-point depression (or deficit)
+K
+K
+......................
+019
+None
+Lapse rate
+K s**-1
+K s**-1
+......................
+020
+None
+Visibility
+m
+m
+......................
+021
+None
+Radar spectra (1)
+-
+-
+......................
+022
+None
+Radar spectra (2)
+-
+-
+......................
+023
+None
+Radar spectra (3)
+-
+-
+......................
+024
+None
+Parcel lifted index (to 500 hPa)
+K
+K
+......................
+025
+None
+Temperature anomaly
+K
+K
+......................
+026
+None
+Pressure anomaly
+Pa
+Pa
+......................
+027
+None
+Geopotential height anomaly
+gpm
+gpm
+......................
+028
+None
+Wave spectra (1)
+-
+-
+......................
+029
+None
+Wave spectra (2)
+-
+-
+......................
+030
+None
+Wave spectra (3)
+-
+-
+......................
+031
+None
+Wind direction
+Degree true
+Degree true
+......................
+032
+None
+Wind speed
+m s**-1
+m s**-1
+......................
+033
+U
+U-component of wind
+m s**-1
+m s**-1
+......................
+034
+V
+V-component of wind
+m s**-1
+m s**-1
+......................
+035
+None
+Stream Function
+m**2 s**-1
+m**2 s**-1
+......................
+036
+None
+Velocity Potential
+m**2 s**-1
+m**2 s**-1
+......................
+037
+None
+Montgomery stream Function
+m**2 s**-1
+m**2 s**-1
+......................
+038
+None
+Sigma coordinate vertical velocity
+s**-1
+s**-1
+......................
+039
+W
+Vertical velocity
+Pa s**-1
+Pa s**-1
+......................
+040
+None
+Vertical velocity
+m s**-1
+m s**-1
+......................
+041
+None
+Absolute vorticity
+s**-1
+s**-1
+......................
+042
+None
+Absolute divergence
+s**-1
+s**-1
+......................
+043
+VO
+Relative vorticity
+s**-1
+s**-1
+......................
+044
+D
+Relative divergence
+s**-1
+s**-1
+......................
+045
+None
+Vertical u-component shear
+s**-1
+s**-1
+......................
+046
+None
+Vertical v-component shear
+s**-1
+s**-1
+......................
+047
+None
+Direction of current
+Degree true
+Degree true
+......................
+048
+None
+Speed of current
+m s**-1
+m s**-1
+......................
+049
+None
+U-component of current
+m s**-1
+m s**-1
+......................
+050
+None
+V-component of current
+m s**-1
+m s**-1
+......................
+051
+Q
+Specific humidity
+kg kg**-1
+kg kg**-1
+......................
+052
+R
+Relative humidity
+%
+%
+......................
+053
+None
+Humidity mixing ratio
+kg m**-2
+kg m**-2
+......................
+054
+None
+Precipitable water
+kg m**-2
+kg m**-2
+......................
+055
+None
+Vapour pressure
+Pa
+Pa
+......................
+056
+None
+Saturation deficit
+Pa
+Pa
+......................
+057
+E
+Evaporation
+kg m**-2
+kg m**-2
+......................
+058
+CIWC
+Cloud ice
+kg m**-2
+kg m**-2
+......................
+059
+None
+Precipitation rate
+kg m**-2 s**-1
+kg m**-2 s**-1
+......................
+060
+None
+Thunderstorm probability
+%
+%
+......................
+061
+TP
+Total precipitation
+kg m**-2
+kg m**-2
+......................
+062
+None
+Large scale precipitation (water)
+kg m**-2
+kg m**-2
+......................
+063
+None
+Convective precipitation (water)
+kg m**-2
+kg m**-2
+......................
+064
+None
+Snow fall rate water equivalent
+kg m**-2 s**-1
+kg m**-2 s**-1
+......................
+065
+SF
+Water equivalentof accumulated snow depth
+kg m**-2
+kg m**-2
+......................
+066
+SD
+Snow depth
+m (of water equivalent)
+m (of water equivalent)
+......................
+067
+None
+Mixed layer depth
+m
+m
+......................
+068
+None
+Transient thermocline depth
+m
+m
+......................
+069
+None
+Main thermocline depth
+m
+m
+......................
+070
+None
+Main thermocline anomaly
+m
+m
+......................
+071
+TCC
+Total cloud cover
+%
+%
+......................
+072
+CCC
+Convective cloud cover
+%
+%
+......................
+073
+LCC
+Low cloud cover
+%
+%
+......................
+074
+MCC
+Medium cloud cover
+%
+%
+......................
+075
+HCC
+High cloud cover
+%
+%
+......................
+076
+CLWC
+Cloud liquid water content
+kg kg**-1
+kg kg**-1
+......................
+077
+None
+Best lifted index (to 500 hPa)
+K
+K
+......................
+078
+CSF
+Convective snow-fall
+kg m**-2
+kg m**-2
+......................
+079
+LSF
+Large scale snow-fall
+kg m**-2
+kg m**-2
+......................
+080
+None
+Water temperature
+K
+K
+......................
+081
+LSM
+Land cover (1=land, 0=sea)
+(0 - 1)
+(0 - 1)
+......................
+082
+None
+Deviation of sea-level from mean
+m
+m
+......................
+083
+SR
+Surface roughness
+m
+m
+......................
+084
+AL
+Albedo
+-
+-
+......................
+085
+ST
+Surface temperature of soil
+K
+K
+......................
+086
+SSW
+Soil moisture content
+kg m**-2
+kg m**-2
+......................
+087
+VEG
+Percentage of vegetation
+%
+%
+......................
+088
+None
+Salinity
+kg kg**-1
+kg kg**-1
+......................
+089
+None
+Density
+kg m**-3
+kg kg**-1
+......................
+090
+RO
+Water run-off
+kg m**-2
+kg m**-2
+......................
+091
+None
+Ice cover (1=land, 0=sea)
+(0 - 1)
+(0 - 1)
+......................
+092
+None
+Ice thickness
+m
+m
+......................
+093
+None
+Direction of ice drift
+Degree true
+Degree true
+......................
+094
+None
+Speed of ice drift
+m s*-1
+m s*-1
+......................
+095
+None
+U-component of ice drift
+m s**-1
+m s**-1
+......................
+096
+None
+V-component of ice drift
+m s**-1
+m s**-1
+......................
+097
+None
+Ice growth rate
+m s**-1
+m s**-1
+......................
+098
+None
+Ice divergence
+s**-1
+s**-1
+......................
+099
+None
+Snow melt
+kg m**-2
+kg m**-2
+......................
+100
+SWH
+Signific.height,combined wind waves+swell
+m
+m
+......................
+101
+MDWW
+Mean direction of wind waves
+Degree true
+Degree true
+......................
+102
+SHWW
+Significant height of wind waves
+m
+m
+......................
+103
+MPWW
+Mean period of wind waves
+s
+s
+......................
+104
+None
+Direction of swell waves
+Degree true
+Degree true
+......................
+105
+None
+Significant height of swell waves
+m
+m
+......................
+106
+None
+Mean period of swell waves
+s
+s
+......................
+107
+MDPS
+Mean direction of primary swell
+Degree true
+Degree true
+......................
+108
+MPPS
+Mean period of primary swell
+s
+s
+......................
+109
+None
+Secondary wave direction
+Degree true
+Degree true
+......................
+110
+None
+Secondary wave period
+s
+s
+......................
+111
+None
+Net short-wave radiation flux (surface)
+W m**-2
+W m**-2
+......................
+112
+None
+Net long-wave radiation flux (surface)
+W m**-2
+W m**-2
+......................
+113
+None
+Net short-wave radiationflux(atmosph.top)
+W m**-2
+W m**-2
+......................
+114
+None
+Net long-wave radiation flux(atmosph.top)
+W m**-2
+W m**-2
+......................
+115
+None
+Long-wave radiation flux
+W m**-2
+W m**-2
+......................
+116
+None
+Short-wave radiation flux
+W m**-2
+W m**-2
+......................
+117
+None
+Global radiation flux
+W m**-2
+W m**-2
+......................
+118
+None
+Brightness temperature
+K
+K
+......................
+119
+None
+Radiance (with respect to wave number)
+W m**-1 sr**-1
+W m**-1 sr**-1
+......................
+120
+None
+Radiance (with respect to wave length)
+W m**-1 sr**-1
+W m**-3 sr**-1
+......................
+121
+SLHF
+(surface) Latent heat flux
+W m**-2
+W m**-2
+......................
+122
+SSHF
+(surface) Sensible heat flux
+W m**-2
+W m**-2
+......................
+123
+BLD
+Boundary layer dissipation
+W m**-2
+W m**-2
+......................
+124
+None
+Momentum flux, u-component
+N m**-2
+N m**-2
+......................
+125
+None
+Momentum flux, v-component
+N m**-2
+N m**-2
+......................
+126
+None
+Wind mixing energy
+J
+J
+......................
+127
+None
+Image data
+-
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
diff --git a/gribtables/wmostd/table_2_version_003.mf b/gribtables/wmostd/table_2_version_003.mf
new file mode 100755
index 0000000..eec17a5
--- /dev/null
+++ b/gribtables/wmostd/table_2_version_003.mf
@@ -0,0 +1,771 @@
+Table 2 standard OMM: Version Numero 3.
+Codes et unites en phase avec FM 92-X Ext.GRIB.
+......................
+001
+P
+Pression
+Pa
+Pa
+......................
+002
+PMER
+Pression reduite au niveau moyen dela mer
+Pa
+Pa
+......................
+003
+TDPS
+Tendance barometrique
+Pa s**-1
+Pa s**-1
+......................
+004
+TP
+Tourbillon potentiel
+K m**2 kg**-1 s**-1
+K m**2 kg**-1 s**-1
+......................
+005
+HZ
+Altitude en Atmosphere Standard OACI
+m
+m
+......................
+006
+Z
+Geopotentiel
+m**2 s**-2
+m**2 s**-2
+......................
+007
+H
+Hauteur geopotentielle
+gpm
+gpm
+......................
+008
+ALTITUDE
+Altitude (geometrique)
+m
+m
+......................
+009
+None
+Standard deviation of height
+m
+m
+......................
+010
+TCO3
+Total (column) ozone
+Dobson (kg m**-2)
+Dobson (kg m**-2)
+......................
+011
+T
+Temperature
+K
+K
+......................
+012
+None
+Virtual temperature
+K
+K
+......................
+013
+THETA
+Temperature potentielle
+K
+K
+......................
+014
+TPW
+Temperature potentielle pseudoadiabatique
+K
+K
+......................
+015
+TMAX
+Temperature maximale
+K
+K
+......................
+016
+TMIN
+Temperature minimale
+K
+K
+......................
+017
+TD
+Temperature du point de rosee
+K
+K
+......................
+018
+None
+Dew-point depression (or deficit)
+K
+K
+......................
+019
+None
+Lapse rate
+K s**-1
+K s**-1
+......................
+020
+None
+Visibility
+m
+m
+......................
+021
+None
+Radar spectra (1)
+-
+-
+......................
+022
+None
+Radar spectra (2)
+-
+-
+......................
+023
+None
+Radar spectra (3)
+-
+-
+......................
+024
+None
+Parcel lifted index (to 500 hPa)
+K
+K
+......................
+025
+None
+Temperature anomaly
+K
+K
+......................
+026
+None
+Pressure anomaly
+Pa
+Pa
+......................
+027
+None
+Geopotential height anomaly
+gpm
+gpm
+......................
+028
+None
+Wave spectra (1)
+-
+-
+......................
+029
+None
+Wave spectra (2)
+-
+-
+......................
+030
+None
+Wave spectra (3)
+-
+-
+......................
+031
+DD
+Direction du vent horizontal
+Degre
+Degre
+......................
+032
+FF
+Vitesse du vent horizontal
+m s**-1
+m s**-1
+......................
+033
+U
+Premiere composante (zonale) du vent
+m s**-1
+m s**-1
+......................
+034
+V
+Seconde composante (meridienne) du vent
+m s**-1
+m s**-1
+......................
+035
+None
+Stream Function
+m**2 s**-1
+m**2 s**-1
+......................
+036
+None
+Velocity Potential
+m**2 s**-1
+m**2 s**-1
+......................
+037
+None
+Montgomery stream Function
+m**2 s**-1
+m**2 s**-1
+......................
+038
+None
+Sigma coordinate vertical velocity
+s**-1
+s**-1
+......................
+039
+VV
+Vitesse verticale
+Pa s**-1
+Pa s**-1
+......................
+040
+None
+Vertical velocity
+m s**-1
+m s**-1
+......................
+041
+TA
+Tourbillon absolu
+s**-1
+s**-1
+......................
+042
+None
+Absolute divergence
+s**-1
+s**-1
+......................
+043
+TB
+Tourbillon relatif
+s**-1
+s**-1
+......................
+044
+DI
+Divergence relative
+s**-1
+s**-1
+......................
+045
+None
+Vertical u-component shear
+s**-1
+s**-1
+......................
+046
+None
+Vertical v-component shear
+s**-1
+s**-1
+......................
+047
+None
+Direction of current
+Degree true
+Degree true
+......................
+048
+None
+Speed of current
+m s**-1
+m s**-1
+......................
+049
+None
+U-component of current
+m s**-1
+m s**-1
+......................
+050
+None
+V-component of current
+m s**-1
+m s**-1
+......................
+051
+Q
+Humidite specifique
+kg kg**-1
+kg kg**-1
+......................
+052
+HU
+Humidite relative
+%
+%
+......................
+053
+R
+Rapport de melange de l'air humide
+kg m**-2
+kg m**-2
+......................
+054
+None
+Precipitable water
+kg m**-2
+kg m**-2
+......................
+055
+None
+Vapour pressure
+Pa
+Pa
+......................
+056
+None
+Saturation deficit
+Pa
+Pa
+......................
+057
+FLEVAP
+Flux d'evaporation
+kg m**-2
+kg m**-2
+......................
+058
+CIWC
+Cloud ice
+kg m**-2
+kg m**-2
+......................
+059
+None
+Precipitation rate
+kg m**-2 s**-1
+kg m**-2 s**-1
+......................
+060
+None
+Thunderstorm probability
+%
+%
+......................
+061
+PRECIP
+Precipitation totales (toutes formes)
+kg m**-2
+kg m**-2
+......................
+062
+PRLGE
+Precipitations liquides de grande echelle
+kg m**-2
+kg m**-2
+......................
+063
+PRLCV
+Precipitations liquides convectives
+kg m**-2
+kg m**-2
+......................
+064
+INTENNEIGE
+Equivalent en eau des chutes de neige
+kg m**-2 s**-1
+kg m**-2 s**-1
+......................
+065
+SF
+Water equivalentof accumulated snow depth
+kg m**-2
+kg m**-2
+......................
+066
+HTEURNEIGE
+Epaisseur de neige en equivalent eau
+m (of water equivalent)
+m (of water equivalent)
+......................
+067
+None
+Mixed layer depth
+m
+m
+......................
+068
+None
+Transient thermocline depth
+m
+m
+......................
+069
+None
+Main thermocline depth
+m
+m
+......................
+070
+None
+Main thermocline anomaly
+m
+m
+......................
+071
+NEBUL
+Nebulosite totale
+%
+%
+......................
+072
+NEBCON
+Nebulosite due a la convection
+%
+%
+......................
+073
+NEBBAS
+Nebulosite de l'etage inferieur
+%
+%
+......................
+074
+NEBMOY
+Nebulosite de l'etage moyen
+%
+%
+......................
+075
+NEBHAU
+Nebulosite de l'etage superieur
+%
+%
+......................
+076
+CLWC
+Cloud liquid water content
+kg kg**-1
+kg kg**-1
+......................
+077
+None
+Best lifted index (to 500 hPa)
+K
+K
+......................
+078
+PRNCV
+Precipitations neigeuses convectives
+kg m**-2
+kg m**-2
+......................
+079
+PRNGE
+Precipitations neigeuses de grandeechelle
+kg m**-2
+kg m**-2
+......................
+080
+None
+Water temperature
+K
+K
+......................
+081
+TERRE_MER
+Indicateur terre/mer (1=terre, 0=mer)
+(0 - 1)
+(0 - 1)
+......................
+082
+None
+Deviation of sea-level from mean
+m
+m
+......................
+083
+RUGOSITE
+Rugosite du sol
+m
+m
+......................
+084
+ALBEDO
+Albedo
+-
+-
+......................
+085
+ST
+Surface temperature of soil
+K
+K
+......................
+086
+RESERVE_EAU
+Contenu en eau
+kg m**-2
+kg m**-2
+......................
+087
+VEGETATION
+Vegetation (pourcentage)
+%
+%
+......................
+088
+None
+Salinity
+kg kg**-1
+kg kg**-1
+......................
+089
+None
+Density
+kg m**-3
+kg kg**-1
+......................
+090
+RO
+Water run-off
+kg m**-2
+kg m**-2
+......................
+091
+None
+Ice cover (1=land, 0=sea)
+(0 - 1)
+(0 - 1)
+......................
+092
+None
+Ice thickness
+m
+m
+......................
+093
+None
+Direction of ice drift
+Degree true
+Degree true
+......................
+094
+None
+Speed of ice drift
+m s*-1
+m s*-1
+......................
+095
+None
+U-component of ice drift
+m s**-1
+m s**-1
+......................
+096
+None
+V-component of ice drift
+m s**-1
+m s**-1
+......................
+097
+None
+Ice growth rate
+m s**-1
+m s**-1
+......................
+098
+None
+Ice divergence
+s**-1
+s**-1
+......................
+099
+NEIGE
+Precipitations neigeuses totales
+kg m**-2
+kg m**-2
+......................
+100
+SWH
+Hauteur significative vagues_mer+houle
+m
+m
+......................
+101
+MDWW
+Direction moy. des vagues de la merduvent
+Degre
+Degre
+......................
+102
+SHWW
+Hauteur signif.des vagues de la merduvent
+m
+m
+......................
+103
+MPWW
+Periode moy. des vagues de la mer du vent
+s
+s
+......................
+104
+MDS
+Direction des vagues de la houle
+Degre
+Degre
+......................
+105
+SHS
+Hauteur signific. des vagues de la houle
+m
+m
+......................
+106
+MPS
+Periode moyenne des vagues de la houle
+s
+s
+......................
+107
+MDPS
+Direction moyenne de la houle primaire
+Degre
+Degre
+......................
+108
+MPPS
+Periode moyenne de la houle primaire
+s
+s
+......................
+109
+MDSS
+Direction moyenne de la houle secondaire
+Degre
+Degre
+......................
+110
+MPSS
+Periode moyenne de la houle secondaire
+s
+s
+......................
+111
+FLSOLAIRE
+Bilan ray. courtes long. d'ondes (au sol)
+W m**-2
+W m**-2
+......................
+112
+FLTHERM
+Bilan ray. grandes long. d'ondes (au sol)
+W m**-2
+W m**-2
+......................
+113
+FLSOLAIRE
+Bilan ray. courtes long. d'ondes (sommet)
+W m**-2
+W m**-2
+......................
+114
+FLTHERM
+Bilan ray. grandes long. d'ondes (sommet)
+W m**-2
+W m**-2
+......................
+115
+None
+Long-wave radiation flux
+W m**-2
+W m**-2
+......................
+116
+None
+Short-wave radiation flux
+W m**-2
+W m**-2
+......................
+117
+None
+Global radiation flux
+W m**-2
+W m**-2
+......................
+118
+None
+Brightness temperature
+K
+K
+......................
+119
+None
+Radiance (with respect to wave number)
+W m**-1 sr**-1
+W m**-1 sr**-1
+......................
+120
+None
+Radiance (with respect to wave length)
+W m**-1 sr**-1
+W m**-3 sr**-1
+......................
+121
+FLLAT
+Flux de chaleur latente
+W m**-2
+W m**-2
+......................
+122
+FLSEN
+Flux de chaleur sensible
+W m**-2
+W m**-2
+......................
+123
+BLD
+Boundary layer dissipation
+W m**-2
+W m**-2
+......................
+124
+None
+Momentum flux, u-component
+N m**-2
+N m**-2
+......................
+125
+None
+Momentum flux, v-component
+N m**-2
+N m**-2
+......................
+126
+None
+Wind mixing energy
+J
+J
+......................
+127
+None
+Image data
+-
+-
+......................
+255
+-
+Indicates a missing value
+-
+-
+......................
diff --git a/gribtemplates/localDefinitionTemplate_001_098_001 b/gribtemplates/localDefinitionTemplate_001_098_001
new file mode 120000
index 0000000..6bf031f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_001_098_001
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_001
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_007_000_001 b/gribtemplates/localDefinitionTemplate_007_000_001
new file mode 100755
index 0000000..aad602c
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_007_000_001
@@ -0,0 +1,42 @@
+!
+! KWBC localDefinitionTemplate_001
+! --------------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+sectionLength 1 L3 n/a ignore
+applicationIdentifier 41 I1 37 -
+type 42 I1 38 -
+identificationNumber 43 I1 39 -
+productIdentifier 44 I1 40 -
+spatialSmoothingOfProduct 45 I1 41 -
+!
+if_ge_46 - IF_GT 45 sectionLength
+probProductDefinition 46 I1 42 -
+probabilityType 47 I1 43 -
+lowerLimit 48 I4 44 -
+upperLimit 52 I4 45 -
+padding 56 PAD n/a 5
+endif_ge_46 - ENDIF if_ge_46
+!
+if_ge_61 - IF_GT 60 sectionLength
+ensembleSize 61 I1 46 -
+clusterSize 62 I1 47 -
+numberOfClusters 63 I1 48 -
+clusteringMethod 64 I1 49 -
+northLatitudeOfCluster 65 S3 50 -
+southLatitudeOfCluster 68 S3 51 -
+westLongitudeOfCluster 71 S3 52 -
+eastLongitudeOfCluster 74 S3 53 -
+clusterMember1 77 I1 54 -
+clusterMember2 78 I1 55 -
+clusterMember3 79 I1 56 -
+clusterMember4 80 I1 57 -
+clusterMember5 81 I1 58 -
+clusterMember6 82 I1 59 -
+clusterMember7 83 I1 60 -
+clusterMember8 84 I1 61 -
+clusterMember9 85 I1 62 -
+clusterMember10 86 I1 63 -
+endif_ge_61 - ENDIF if_ge_61
diff --git a/gribtemplates/localDefinitionTemplate_007_002_000 b/gribtemplates/localDefinitionTemplate_007_002_000
new file mode 100755
index 0000000..aad602c
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_007_002_000
@@ -0,0 +1,42 @@
+!
+! KWBC localDefinitionTemplate_001
+! --------------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+sectionLength 1 L3 n/a ignore
+applicationIdentifier 41 I1 37 -
+type 42 I1 38 -
+identificationNumber 43 I1 39 -
+productIdentifier 44 I1 40 -
+spatialSmoothingOfProduct 45 I1 41 -
+!
+if_ge_46 - IF_GT 45 sectionLength
+probProductDefinition 46 I1 42 -
+probabilityType 47 I1 43 -
+lowerLimit 48 I4 44 -
+upperLimit 52 I4 45 -
+padding 56 PAD n/a 5
+endif_ge_46 - ENDIF if_ge_46
+!
+if_ge_61 - IF_GT 60 sectionLength
+ensembleSize 61 I1 46 -
+clusterSize 62 I1 47 -
+numberOfClusters 63 I1 48 -
+clusteringMethod 64 I1 49 -
+northLatitudeOfCluster 65 S3 50 -
+southLatitudeOfCluster 68 S3 51 -
+westLongitudeOfCluster 71 S3 52 -
+eastLongitudeOfCluster 74 S3 53 -
+clusterMember1 77 I1 54 -
+clusterMember2 78 I1 55 -
+clusterMember3 79 I1 56 -
+clusterMember4 80 I1 57 -
+clusterMember5 81 I1 58 -
+clusterMember6 82 I1 59 -
+clusterMember7 83 I1 60 -
+clusterMember8 84 I1 61 -
+clusterMember9 85 I1 62 -
+clusterMember10 86 I1 63 -
+endif_ge_61 - ENDIF if_ge_61
diff --git a/gribtemplates/localDefinitionTemplate_007_002_001 b/gribtemplates/localDefinitionTemplate_007_002_001
new file mode 100755
index 0000000..aad602c
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_007_002_001
@@ -0,0 +1,42 @@
+!
+! KWBC localDefinitionTemplate_001
+! --------------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+sectionLength 1 L3 n/a ignore
+applicationIdentifier 41 I1 37 -
+type 42 I1 38 -
+identificationNumber 43 I1 39 -
+productIdentifier 44 I1 40 -
+spatialSmoothingOfProduct 45 I1 41 -
+!
+if_ge_46 - IF_GT 45 sectionLength
+probProductDefinition 46 I1 42 -
+probabilityType 47 I1 43 -
+lowerLimit 48 I4 44 -
+upperLimit 52 I4 45 -
+padding 56 PAD n/a 5
+endif_ge_46 - ENDIF if_ge_46
+!
+if_ge_61 - IF_GT 60 sectionLength
+ensembleSize 61 I1 46 -
+clusterSize 62 I1 47 -
+numberOfClusters 63 I1 48 -
+clusteringMethod 64 I1 49 -
+northLatitudeOfCluster 65 S3 50 -
+southLatitudeOfCluster 68 S3 51 -
+westLongitudeOfCluster 71 S3 52 -
+eastLongitudeOfCluster 74 S3 53 -
+clusterMember1 77 I1 54 -
+clusterMember2 78 I1 55 -
+clusterMember3 79 I1 56 -
+clusterMember4 80 I1 57 -
+clusterMember5 81 I1 58 -
+clusterMember6 82 I1 59 -
+clusterMember7 83 I1 60 -
+clusterMember8 84 I1 61 -
+clusterMember9 85 I1 62 -
+clusterMember10 86 I1 63 -
+endif_ge_61 - ENDIF if_ge_61
diff --git a/gribtemplates/localDefinitionTemplate_007_098_001 b/gribtemplates/localDefinitionTemplate_007_098_001
new file mode 120000
index 0000000..6bf031f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_007_098_001
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_001
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_007_098_011 b/gribtemplates/localDefinitionTemplate_007_098_011
new file mode 120000
index 0000000..4a9864d
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_007_098_011
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_011
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_007_098_018 b/gribtemplates/localDefinitionTemplate_007_098_018
new file mode 120000
index 0000000..bcbadb0
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_007_098_018
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_018
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_0255_098_001 b/gribtemplates/localDefinitionTemplate_0255_098_001
new file mode 120000
index 0000000..6bf031f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_0255_098_001
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_001
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_0255_098_018 b/gribtemplates/localDefinitionTemplate_0255_098_018
new file mode 120000
index 0000000..bcbadb0
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_0255_098_018
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_018
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_034_098_001 b/gribtemplates/localDefinitionTemplate_034_098_001
new file mode 120000
index 0000000..6bf031f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_034_098_001
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_001
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_054_098_001 b/gribtemplates/localDefinitionTemplate_054_098_001
new file mode 120000
index 0000000..6bf031f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_054_098_001
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_001
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_058_098_001 b/gribtemplates/localDefinitionTemplate_058_098_001
new file mode 120000
index 0000000..6bf031f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_058_098_001
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_001
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_058_098_011 b/gribtemplates/localDefinitionTemplate_058_098_011
new file mode 120000
index 0000000..4a9864d
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_058_098_011
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_011
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_074_098_001 b/gribtemplates/localDefinitionTemplate_074_098_001
new file mode 120000
index 0000000..6bf031f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_074_098_001
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_001
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_074_098_004 b/gribtemplates/localDefinitionTemplate_074_098_004
new file mode 120000
index 0000000..21dd406
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_074_098_004
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_004
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_074_098_011 b/gribtemplates/localDefinitionTemplate_074_098_011
new file mode 120000
index 0000000..4a9864d
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_074_098_011
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_011
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_074_098_015 b/gribtemplates/localDefinitionTemplate_074_098_015
new file mode 120000
index 0000000..d4b5e2f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_074_098_015
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_015
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_074_098_016 b/gribtemplates/localDefinitionTemplate_074_098_016
new file mode 120000
index 0000000..6080b8e
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_074_098_016
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_016
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_074_098_018 b/gribtemplates/localDefinitionTemplate_074_098_018
new file mode 120000
index 0000000..bcbadb0
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_074_098_018
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_018
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_074_098_021 b/gribtemplates/localDefinitionTemplate_074_098_021
new file mode 120000
index 0000000..b661d93
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_074_098_021
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_021
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_078_098_001 b/gribtemplates/localDefinitionTemplate_078_098_001
new file mode 120000
index 0000000..6bf031f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_078_098_001
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_001
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_078_098_018 b/gribtemplates/localDefinitionTemplate_078_098_018
new file mode 120000
index 0000000..bcbadb0
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_078_098_018
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_018
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_078_098_191 b/gribtemplates/localDefinitionTemplate_078_098_191
new file mode 120000
index 0000000..f10204e
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_078_098_191
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_191
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_080_098_028 b/gribtemplates/localDefinitionTemplate_080_098_028
new file mode 120000
index 0000000..e3dfea5
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_080_098_028
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_028
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_080_098_029 b/gribtemplates/localDefinitionTemplate_080_098_029
new file mode 120000
index 0000000..2ea3dc3
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_080_098_029
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_029
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_080_098_191 b/gribtemplates/localDefinitionTemplate_080_098_191
new file mode 120000
index 0000000..f10204e
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_080_098_191
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_191
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_084_098_001 b/gribtemplates/localDefinitionTemplate_084_098_001
new file mode 120000
index 0000000..6bf031f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_084_098_001
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_001
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_085_098_001 b/gribtemplates/localDefinitionTemplate_085_098_001
new file mode 120000
index 0000000..6bf031f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_085_098_001
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_001
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_085_098_004 b/gribtemplates/localDefinitionTemplate_085_098_004
new file mode 120000
index 0000000..21dd406
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_085_098_004
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_004
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_085_098_015 b/gribtemplates/localDefinitionTemplate_085_098_015
new file mode 120000
index 0000000..d4b5e2f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_085_098_015
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_015
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_085_098_016 b/gribtemplates/localDefinitionTemplate_085_098_016
new file mode 120000
index 0000000..6080b8e
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_085_098_016
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_016
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_085_098_018 b/gribtemplates/localDefinitionTemplate_085_098_018
new file mode 120000
index 0000000..bcbadb0
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_085_098_018
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_018
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_085_098_021 b/gribtemplates/localDefinitionTemplate_085_098_021
new file mode 120000
index 0000000..b661d93
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_085_098_021
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_021
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_000_001 b/gribtemplates/localDefinitionTemplate_098_000_001
new file mode 100755
index 0000000..32e0947
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_001
@@ -0,0 +1,15 @@
+!
+! localDefinitionTemplate_001
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+total 51 I1 43 -
+spareSetToZero 52 PAD n/a 1
diff --git a/gribtemplates/localDefinitionTemplate_098_000_002 b/gribtemplates/localDefinitionTemplate_098_000_002
new file mode 100755
index 0000000..4340b68
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_002
@@ -0,0 +1,27 @@
+!
+! localDefinitionTemplate_002
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+totalNumberOfClusters 51 I1 43 -
+spareSetToZero 52 PAD n/a 1
+clusteringMethod 53 I1 44 -
+startTimeStep 54 I2 45 -
+endTimeStep 56 I2 46 -
+northernLatititudeOfDomain 58 S3 47 -
+westernLongititudeOfDomain 61 S3 48 -
+southernLatititudeOfDomain 64 S3 49 -
+easternLongititudeOfDomain 67 S3 50 -
+operationalForecastCluster 70 I1 51 -
+controlForecastCluster 71 I1 52 -
+numberOfForecastsInCluster 72 I1 53 -
+ensembleForecastNumbers 73 LP_I1 54 numberOfForecastsInCluster
+spareToEnsureFixedLength - PADTO n/a 328
diff --git a/gribtemplates/localDefinitionTemplate_098_000_003 b/gribtemplates/localDefinitionTemplate_098_000_003
new file mode 100755
index 0000000..820d1b2
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_003
@@ -0,0 +1,15 @@
+!
+! localDefinitionTemplate_003
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+band 50 I1 42 -
+functionCode 51 I1 43 -
+spareSetToZero 52 PAD n/a 1
diff --git a/gribtemplates/localDefinitionTemplate_098_000_004 b/gribtemplates/localDefinitionTemplate_098_000_004
new file mode 100755
index 0000000..4ebc8d1
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_004
@@ -0,0 +1,89 @@
+!
+! localDefinitionTemplate_004
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+! if stream == 1090
+if1 - IF_EQ 1090 stream
+ensembleMemberNumber 50 I2 42 -
+setToZeroForStream1090Unpacking n/a PAD 43 1
+endif1 - ENDIF if1
+! if stream != 1090
+if2 - IF_NEQ 1090 stream
+ensembleMemberNumber 50 I1 42 -
+setToZero 51 PAD 43 1
+endif2 - ENDIF if2
+flagShowingPostAuxiliaryArrayInUse 52 F1 - 1
+systemNumber 53 I1 44 -
+methodNumber 54 I1 45 -
+!
+! Coordinate structure definition
+!
+spaceUnitFlag 55 I1 46 -
+verticalCoordinateDefinition 56 I1 47 -
+horizontalCoordinateDefinition 57 I1 48 -
+timeUnitFlag 58 I1 49 -
+timeCoordinateDefinition 59 I1 50 -
+!
+! Position definition: mixed coordinates
+!
+mixedCoordinateFieldFlag 60 I1 51 -
+coordinate1Flag 61 I1 52 -
+averagingFlag 62 I1 53 -
+positionOfLevel1 63 S4 54 -
+positionOfLevel2 67 S4 55 -
+coordinate2Flag 71 I1 56 -
+averagingFlag 72 I1 57 -
+positionOfLevel1 73 S4 58 -
+positionOfLevel2 77 S4 59 -
+!
+! Data grid definitions
+!
+coordinate3Flag 81 I1 60 -
+coordinate4Flag 82 I1 61 -
+coordinate4OfFirstGridPoint 83 S4 62 -
+coordinate3OfFirstGridPoint 87 S4 63 -
+coordinate4OfLastGridPoint 91 S4 64 -
+coordinate3OfLastGridPoint 95 S4 65 -
+iIncrement 99 S4 66 -
+jIncrement 103 S4 67 -
+flagForIrregularGridCoordinateList 107 I1 68 -
+flagForNormalOrStaggeredGrid 108 I1 69 -
+!
+! Auxiliary information
+!
+flagForAnyFurtherInformation 109 I1 70 -
+numberInHorizontalCoordinates 110 I1 71 -
+numberInMixedCoordinateDefinition 111 I2 72 -
+numberInTheGridCoordinateList 113 I2 73 -
+numberInTheAuxiliaryArray 115 I2 74 -
+!
+! Horizontal coordinate definition
+!
+horizontalCoordinateSupplement - LP_S4 - numberInHorizontalCoordinates
+!
+! Mixed coordinate definition
+!
+mixedCoordinateDefinition - LP_S4 - numberInMixedCoordinateDefinition
+!
+! Grid coordinate list
+!
+gridCoordinateList - LP_S4 - numberInTheGridCoordinateList
+!
+! Auxiliary array
+!
+auxiliaryArray - LP_I4 - numberInTheAuxiliaryArray
+!
+! Post-auxiliary array
+!
+if3 - IF_EQ 1 flagShowingPostAuxiliaryArrayInUse
+sizeOfPostAuxiliaryArray - I4 - -
+arrayValues - LP_I4M1 - sizeOfPostAuxiliaryArray
+endif3 - ENDIF if3
diff --git a/gribtemplates/localDefinitionTemplate_098_000_005 b/gribtemplates/localDefinitionTemplate_098_000_005
new file mode 100755
index 0000000..cd6a40a
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_005
@@ -0,0 +1,19 @@
+!
+! localDefinitionTemplate_005
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+total 51 I1 43 -
+decimalScaleFactor 52 S1 44 -
+thresholdIndicator 53 I1 45 -
+lowerThreshold 54 S2 46 -
+upperThreshold 56 S2 47 -
+spareSetToZero 58 PAD n/a 1
diff --git a/gribtemplates/localDefinitionTemplate_098_000_006 b/gribtemplates/localDefinitionTemplate_098_000_006
new file mode 100755
index 0000000..2469a29
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_006
@@ -0,0 +1,20 @@
+!
+! localDefinitionTemplate_006
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+zeroes 50 PAD 42 2
+dateOfSSTFieldUsed 52 D3 44 -
+typeOfSSTFieldUsed 55 I1 45 -
+countOfICEFieldsUsed 56 I1 46 -
+iceFieldDate+Satellite 57 LIST 47 countOfICEFieldsUsed
+dateOfIceFieldUsed - D3 - -
+satelliteNumber - I1 - -
+ENDLIST - ENDLIST - iceFieldDate+Satellite
diff --git a/gribtemplates/localDefinitionTemplate_098_000_007 b/gribtemplates/localDefinitionTemplate_098_000_007
new file mode 100755
index 0000000..55cf5ff
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_007
@@ -0,0 +1,17 @@
+!
+! localDefinitionTemplate_007
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+total 51 I1 43 -
+domain 52 I1 44 -
+diagnosticNumber 53 I1 45 -
+spareSetToZero 54 PAD n/a 1
diff --git a/gribtemplates/localDefinitionTemplate_098_000_008 b/gribtemplates/localDefinitionTemplate_098_000_008
new file mode 100755
index 0000000..2910ee0
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_008
@@ -0,0 +1,14 @@
+!
+! localDefinitionTemplate_008
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+intervalBetweenTimes 50 I1 42 -
+unsignedIntegers 51 I1 43 12
diff --git a/gribtemplates/localDefinitionTemplate_098_000_009 b/gribtemplates/localDefinitionTemplate_098_000_009
new file mode 100755
index 0000000..be91a64
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_009
@@ -0,0 +1,40 @@
+!
+! localDefinitionTemplate_009
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+forecastOrSingularVectorNumber 50 I2 42 -
+!
+! These elements are set to zero for perturbed forecast
+!
+if1 - IF_EQ 60 type
+octetsSetToZero 52 PAD n/a 41
+ksec1SetToZero n/a PAD 43 13
+endif1 - ENDIF if1
+!
+! These elements are coded for singular vectors
+!
+if2 - IF_NEQ 60 type
+numberOfIterations 52 I2 43 -
+numberOfSingularVectorsComputed 54 I2 44 -
+normAtInitialTime 56 I1 45 -
+normAtFinalTime 57 I1 46 -
+multiplicationFactorForLatLong 58 I4 47 -
+northWestLatitudeOfLPOArea 62 S4 48 -
+northWestLongitudeOfLPOArea 66 S4 49 -
+southEastLatitudeOfLPOArea 70 S4 50 -
+southEastLongitudeOfLPOArea 74 S4 51 -
+accuracyMultipliedByFactor 78 I4 52 -
+numberOfSingularVectorsEvolved 82 I2 53 -
+!Ritz numbers:
+NINT(LOG10(RITZ)-5) 84 S4 54 -
+NINT(RITZ/(EXP(LOG(10.0*KSEC1(54)) 88 S4 55 -
+endif2 - ENDIF if2
+spareSetToZero 92 PAD n/a 1
diff --git a/gribtemplates/localDefinitionTemplate_098_000_010 b/gribtemplates/localDefinitionTemplate_098_000_010
new file mode 100755
index 0000000..c8ee9fd
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_010
@@ -0,0 +1,31 @@
+!
+! localDefinitionTemplate_010
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+total 51 I1 43 -
+centralClusterDefinition 52 I1 44 -
+parameterIndicator 53 I1 45 -
+levelIndicator 54 I1 46 -
+northLatitudeOfDomainOfTubing 55 S3 47 -
+westLongitudeOfDomainOfTubing 58 S3 48 -
+southLatitudeOfDomainOfTubing 61 S3 49 -
+eastLongitudeOfDomainOfTubing 64 S3 50 -
+numberOfOperationalForecastTube 67 I1 51 -
+numberOfControlForecastTube 68 I1 52 -
+heightOrPressureOfLevel 69 I2 53 -
+referenceStep 71 I2 54 -
+radiusOfCentralCluster 73 I2 55 -
+ensembleStandardDeviation 75 I2 56 -
+distanceFromTubeToEnsembleMean 77 I2 57 -
+numberOfForecastsInTube 79 I1 58 -
+ensembleForecastNumbers 80 LP_I1 59 numberOfForecastsInTube
+spareToEnsureFixedLength - PADTO n/a 334
diff --git a/gribtemplates/localDefinitionTemplate_098_000_011 b/gribtemplates/localDefinitionTemplate_098_000_011
new file mode 100755
index 0000000..1e8c76d
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_011
@@ -0,0 +1,25 @@
+!
+! localDefinitionTemplate_011
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+classOfAnalysis 50 I1 42 -
+typeOfAnalysis 51 I1 43 -
+streamOfAnalysis 52 I2 44 -
+experimentVersionNumberOfAnalysis 54 A4 45 -
+yearOfAnalysis 58 I1 46 -
+monthOfAnalysis 59 I1 47 -
+dayOfAnalysis 60 I1 48 -
+hourOfAnalysis 61 I1 49 -
+minuteOfAnalysis 62 I1 50 -
+centuryOfAnalysis 63 I1 51 -
+originatingCentreOfAnalysis 64 I1 52 -
+subcentreOfAnalysis 65 I1 53 -
+spareSetToZero 66 PAD n/a 7
diff --git a/gribtemplates/localDefinitionTemplate_098_000_013 b/gribtemplates/localDefinitionTemplate_098_000_013
new file mode 100755
index 0000000..b77671e
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_013
@@ -0,0 +1,64 @@
+!
+! localDefinitionTemplate_013
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+total 51 I1 43 -
+directionNumber 52 I1 44 -
+frequencyNumber 53 I1 45 -
+numberOfDirections 54 I1 46 -
+numberOfFrequencies 55 I1 47 -
+directionScalingFactor 56 I4 48 -
+frequencyScalingFactor 60 I4 49 -
+flag 64 F1 - 3
+!
+! Old versions of wave 2D spectra direction and frequency do not
+! have the systemNumber and methodNumber, and the flag is set to 0.
+!
+if0 - IF_EQ 0 flag
+spareSetToZero 65 PAD n/a 36
+endif0 - ENDIF if0
+!
+! Old versions of wave 2D spectra direction and frequency do not
+! have the systemNumber and methodNumber, and the flag is set to 0.
+!
+!
+scaledDirections 101 LP_I4 50 numberOfDirections
+scaledFrequencies - LP_I4 - numberOfFrequencies
+!
+if1 - IF_EQ 1 flag
+systemNumber 065 I2 - -
+methodNumber 067 I2 - -
+spareSetToZero1 069 PAD n/a 32
+endif1 - ENDIF if1
+!
+if2 - IF_EQ 2 flag
+systemNumber 065 I2 - -
+methodNumber 067 I2 - -
+referenceDate 069 I4 - -
+climateDateFrom 073 I4 - -
+climateDateTo 077 I4 - -
+spareSetToZero2 081 PAD n/a 20
+endif2 - ENDIF if2
+!
+if3 - IF_EQ 3 flag
+systemNumber 065 I2 - -
+methodNumber 067 I2 - -
+referenceDate 069 I4 - -
+climateDateFrom 073 I4 - -
+climateDateTo 077 I4 - -
+legBaseDate 081 I4 - -
+legBaseTime 085 I2 - -
+legNumber 087 I1 - -
+oceanAtmosphereCoupling 088 I1 - -
+spareSetToZero3 089 PAD n/a 12
+endif3 - ENDIF if3
+
diff --git a/gribtemplates/localDefinitionTemplate_098_000_013.old b/gribtemplates/localDefinitionTemplate_098_000_013.old
new file mode 100755
index 0000000..5f66d54
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_013.old
@@ -0,0 +1,50 @@
+!
+! localDefinitionTemplate_013
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+total 51 I1 43 -
+directionNumber 52 I1 44 -
+frequencyNumber 53 I1 45 -
+numberOfDirections 54 I1 46 -
+numberOfFrequencies 55 I1 47 -
+directionScalingFactor 56 I4 48 -
+frequencyScalingFactor 60 I4 49 -
+flag 64 F1 - 2
+!
+! Old versions of wave 2D spectra direction and frequency do not
+! have the systemNumber and methodNumber, and the flag is set to 0.
+!
+if0 - IF_EQ 0 flag
+spareSetToZero 65 PAD n/a 36
+endif0 - ENDIF if0
+!
+! Old versions of wave 2D spectra direction and frequency do not
+! have the systemNumber and methodNumber, and the flag is set to 0.
+!
+ifgt0 - IF_GT 0 flag
+systemNumber 065 I2 - -
+methodNumber 067 I2 - -
+endifgt0 - ENDIF ifgt0
+!
+if1 - IF_EQ 1 flag
+spareSetToZero1 069 PAD n/a 32
+endif1 - ENDIF if1
+!
+if2 - IF_EQ 2 flag
+referenceDate 069 I4 - -
+climateDateFrom 073 I4 - -
+climateDateTo 077 I4 - -
+spareSetToZero2 081 PAD n/a 20
+endif2 - ENDIF if2
+!
+scaledDirections 101 LP_I4 50 numberOfDirections
+scaledFrequencies - LP_I4 - numberOfFrequencies
diff --git a/gribtemplates/localDefinitionTemplate_098_000_014 b/gribtemplates/localDefinitionTemplate_098_000_014
new file mode 100755
index 0000000..dbb0896
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_014
@@ -0,0 +1,20 @@
+!
+! localDefinitionTemplate_014
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+total 51 I1 43 -
+channelNumber 52 I1 44 -
+scalingFactorForFrequencies 53 I4 45 -
+numberOfFrequencies 57 I1 46 -
+spareSetToZero 58 PAD n/a 3
+listOfScaledFrequencies 61 LP_I4 47 numberOfFrequencies
+moreSpareSetToZero - PADTO - 1080
diff --git a/gribtemplates/localDefinitionTemplate_098_000_015 b/gribtemplates/localDefinitionTemplate_098_000_015
new file mode 100755
index 0000000..ec115c5
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_015
@@ -0,0 +1,17 @@
+!
+! localDefinitionTemplate_015
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I2 42 -
+total 56 I2 43 -
+systemNumber 52 I2 44 -
+methodNumber 54 I2 45 -
+spareSetToZero 58 PAD n/a 3
diff --git a/gribtemplates/localDefinitionTemplate_098_000_016 b/gribtemplates/localDefinitionTemplate_098_000_016
new file mode 100755
index 0000000..77fc863
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_016
@@ -0,0 +1,20 @@
+!
+! localDefinitionTemplate_016
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I2 42 -
+zero n/a PAD 43 1
+systemNumber 52 I2 44 -
+methodNumber 54 I2 45 -
+verifyingMonth 56 I4 46 -
+averagingPeriod 60 I1 47 -
+forecastMonth 61 I2 48 -
+spareSetToZero 63 PAD n/a 18
diff --git a/gribtemplates/localDefinitionTemplate_098_000_017 b/gribtemplates/localDefinitionTemplate_098_000_017
new file mode 100755
index 0000000..73604fa
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_017
@@ -0,0 +1,22 @@
+!
+! localDefinitionTemplate_017
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+total 51 I1 43 -
+dateOfSSTFieldUsed 52 D3 44 -
+typeOfSSTFieldUsed 55 I1 45 -
+countOfICEFieldsUsed 56 I1 46 -
+iceFieldDate+Satellite 57 LIST 47 countOfICEFieldsUsed
+dateOfIceFieldUsed - D3 - -
+satelliteNumber - I1 - -
+ENDLIST - ENDLIST - iceFieldDate+Satellite
+paddingToMultipleOf40Bytes 57 PADMULT - 40
diff --git a/gribtemplates/localDefinitionTemplate_098_000_018 b/gribtemplates/localDefinitionTemplate_098_000_018
new file mode 100755
index 0000000..633be67
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_018
@@ -0,0 +1,22 @@
+!
+! localDefinitionTemplate_018
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+total 51 I1 43 -
+dataOrigin 52 I1 44 -
+modelIdentifier 53 A4 45 -
+consensusCount 57 I1 46 -
+spareSetToZero 58 PAD n/a 3
+wmoCentreIdentifiers 61 LIST 47 consensusCount
+ccccIdentifiers - A4 - -
+ENDLIST - ENDLIST - wmoCentreIdentifiers
+unusedEntriesSetToBlanks - SP_TO - 120
diff --git a/gribtemplates/localDefinitionTemplate_098_000_019 b/gribtemplates/localDefinitionTemplate_098_000_019
new file mode 100755
index 0000000..81f9fed
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_019
@@ -0,0 +1,23 @@
+!
+! localDefinitionTemplate_019
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+ensembleSize 51 I1 43 -
+versionNumberOfESuite 52 I1 44 -
+implementationDate 53 I4 45 -
+numberOfReforecastYears 57 I3 46 -
+lengthOfClimate 60 I3 47 -
+reforecastSize 63 I3 48 -
+versionOfModelClimate 66 I3 49 -
+efiOrder 69 I1 50 -
+efiVersion 70 I1 51 -
+spareSetToZero 71 PAD n/a 10
diff --git a/gribtemplates/localDefinitionTemplate_098_000_020 b/gribtemplates/localDefinitionTemplate_098_000_020
new file mode 100755
index 0000000..0e55b9a
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_020
@@ -0,0 +1,15 @@
+!
+! localDefinitionTemplate_020
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+iteration 50 I1 42 -
+totalNumberOfIterations 51 I1 43 -
+spareSetToZero 52 PAD n/a 1
diff --git a/gribtemplates/localDefinitionTemplate_098_000_021 b/gribtemplates/localDefinitionTemplate_098_000_021
new file mode 100755
index 0000000..134d7ae
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_021
@@ -0,0 +1,34 @@
+!
+! localDefinitionTemplate_021
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+forecastOrSingularVectorNumber 50 I2 42 -
+numberOfIterations 52 I2 43 -
+numberOfSingularVectorsComputed 54 I2 44 -
+normAtInitialTime 56 I1 45 -
+normAtFinalTime 57 I1 46 -
+multiplicationFactorForLatLong 58 I4 47 -
+northWestLatitudeOfVerficationArea 62 S4 48 -
+northWestLongitudeOfVerficationArea 66 S4 49 -
+southEastLatitudeOfVerficationArea 70 S4 50 -
+southEastLongitudeOfVerficationArea 74 S4 51 -
+accuracyMultipliedByFactor 78 I4 52 -
+numberOfSingularVectorsEvolved 82 I2 53 -
+!Ritz numbers:
+NINT(LOG10(RITZ)-5) 84 S4 54 -
+NINT(RITZ/(EXP(LOG(10.0*KSEC1(54)) 88 S4 55 -
+optimisationTime 92 I1 56 -
+forecastLeadTime 93 I1 57 -
+domain 94 A1 58 -
+methodNumber 95 I2 59 -
+totalNumberOfForecastsInEnsemble 97 I2 60 -
+shapeOfVerificationArea 99 I1 61 -
+spareSetToZero 100 PAD n/a 1
diff --git a/gribtemplates/localDefinitionTemplate_098_000_023 b/gribtemplates/localDefinitionTemplate_098_000_023
new file mode 100755
index 0000000..1ec5dd1
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_023
@@ -0,0 +1,27 @@
+!
+! localDefinitionTemplate_023
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+ensembleNumber 50 I2 42 -
+totalNumber 81 I2 43 -
+systemNumber 52 I2 44 -
+methodNumber 54 I2 45 -
+verifyingMonth 56 I4 46 -
+averagingPeriod 60 I1 47 -
+forecastMonth 61 I2 48 -
+referenceDate 63 I4 49 -
+climateDateFrom 67 I4 50 -
+climateDateTo 71 I4 51 -
+unitsDecimalScaleFactor 75 S1 52 -
+thresholdIndicator 76 I1 53 -
+lowerThresholdValue 77 I2 54 -
+upperThresholdValue 79 I2 55 -
+spareSetToZero 83 PAD 56 2
diff --git a/gribtemplates/localDefinitionTemplate_098_000_023.old b/gribtemplates/localDefinitionTemplate_098_000_023.old
new file mode 100755
index 0000000..c68b337
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_023.old
@@ -0,0 +1,27 @@
+!
+! localDefinitionTemplate_023
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+ensembleNumber 50 I2 42 -
+zero n/a PAD 43 1
+systemNumber 52 I2 44 -
+methodNumber 54 I2 45 -
+verifyingMonth 56 I4 46 -
+averagingPeriod 60 I1 47 -
+forecastMonth 61 I2 48 -
+referenceDate 63 I4 49 -
+climateDateFrom 67 I4 50 -
+climateDateTo 71 I4 51 -
+unitsDecimalScaleFactor 75 S1 52 -
+thresholdIndicator 76 I1 53 -
+lowerThresholdValue 77 I2 54 -
+upperThresholdValue 79 I2 55 -
+spareSetToZero 81 PAD 56 4
diff --git a/gribtemplates/localDefinitionTemplate_098_000_024 b/gribtemplates/localDefinitionTemplate_098_000_024
new file mode 100755
index 0000000..bc83b60
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_024
@@ -0,0 +1,16 @@
+!
+! localDefinitionTemplate_024
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+satelliteIdentifier 50 I2 42 -
+instrumentIdentifier 52 I2 43 -
+channelNumber 54 I2 44 -
+functionCode 56 I1 45 -
diff --git a/gribtemplates/localDefinitionTemplate_098_000_025 b/gribtemplates/localDefinitionTemplate_098_000_025
new file mode 100755
index 0000000..14f4326
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_025
@@ -0,0 +1,15 @@
+!
+! localDefinitionTemplate_025
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+componentIndex 50 I1 42 -
+numberOfComponents 51 I1 43 -
+modelErrorType 52 I1 44 -
diff --git a/gribtemplates/localDefinitionTemplate_098_000_026 b/gribtemplates/localDefinitionTemplate_098_000_026
new file mode 100755
index 0000000..3dd3f7d
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_026
@@ -0,0 +1,17 @@
+! localDefinitionTemplate_026
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+total 51 I1 43 -
+referenceDate 52 I4 44 -
+climateDateFrom 56 I4 45 -
+climateDateTo 60 I4 46 -
+spareSetToZero 64 PAD n/a 6
diff --git a/gribtemplates/localDefinitionTemplate_098_000_026.old b/gribtemplates/localDefinitionTemplate_098_000_026.old
new file mode 100755
index 0000000..546ada2
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_026.old
@@ -0,0 +1,15 @@
+! localDefinitionTemplate_026
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+total 51 I1 43 -
+referenceDate 52 I4 44 -
+spareSetToZero 56 PAD n/a 1
diff --git a/gribtemplates/localDefinitionTemplate_098_000_027 b/gribtemplates/localDefinitionTemplate_098_000_027
new file mode 100755
index 0000000..328ca47
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_027
@@ -0,0 +1,27 @@
+! localDefinitionTemplate_027
+! ---------------------------
+!
+! # Forecasting Systems with Variable Resolution (replaced by definition 30)
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+total 51 I1 43 -
+oceanAtmosphereCoupling 52 I1 44 -
+spare 53 I1 45 -
+padding 54 PAD n/a 2
+! VAriable Resolution (VAREPS)
+legBaseDate 56 I4 46 - ! yyyymmdd
+legBaseTime 60 I2 47 - ! hhmm
+legNumber 62 I1 48 -
+! For hindcasts
+referenceDate 63 I4 49 - !
+climateDateFrom 67 I4 50 - ! yyyymmdd (ensemble means of hindcasts)
+climateDateTo 71 I4 51 - ! yyyymmdd (ensemble means of hindcasts)
+spareSetToZero 75 PAD n/a 33
diff --git a/gribtemplates/localDefinitionTemplate_098_000_027.old b/gribtemplates/localDefinitionTemplate_098_000_027.old
new file mode 100755
index 0000000..630d92b
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_027.old
@@ -0,0 +1,26 @@
+! localDefinitionTemplate_027
+! ---------------------------
+!
+! # Forecasting Systems with Variable Resolution
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+total 51 I1 43 -
+systemNumber 52 I2 44 -
+methodNumber 54 I2 45 -
+! VAriable Resolution (VAREPS)
+legBaseDate 56 I4 46 - ! yyyymmdd
+legBaseTime 60 I2 47 - ! hhmm
+legNumber 62 I1 48 -
+! For hindcasts
+referenceDate 63 I4 46 - !
+climateDateFrom 67 I4 47 - ! yyyymmdd (ensemble means of hindcasts)
+climateDateTo 71 I4 48 - ! yyyymmdd (ensemble means of hindcasts)
+spareSetToZero 75 PAD n/a 33
diff --git a/gribtemplates/localDefinitionTemplate_098_000_028 b/gribtemplates/localDefinitionTemplate_098_000_028
new file mode 100755
index 0000000..5a30d7d
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_028
@@ -0,0 +1,24 @@
+! localDefinitionTemplate_028
+! ---------------------------
+!
+!
+! # COSMO group, Local area EPS
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+total 51 I1 43 -
+baseDateEPS 52 I4 44 -
+baseTimeEPS 56 I2 45 -
+numberOfRepresentativeMember 58 I1 46 -
+numberOfMembersInCluster 59 I1 47 -
+totalInitialConditions 60 I1 48 -
+spareSetToZero 61 PAD n/a 19
+! + information about probabilities (they have already probabilities)
+! + information about clustering (they save it as ASCII, at the moment...)
diff --git a/gribtemplates/localDefinitionTemplate_098_000_029 b/gribtemplates/localDefinitionTemplate_098_000_029
new file mode 100755
index 0000000..b767dac
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_029
@@ -0,0 +1,52 @@
+!
+! localDefinitionTemplate_029
+! ---------------------------
+!
+! # COSMO Clustering Information
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+totalNumberOfClusters 51 I1 43 -
+spareSetToZero 52 PAD n/a 1
+clusteringMethod 53 I1 44 -
+northernLatitudeOfDomain 54 S3 45 -
+westernLongitudeOfDomain 57 S3 46 -
+southernLatitudeOfDomain 60 S3 47 -
+easternLongitudeOfDomain 63 S3 48 -
+numberOfForecastsInCluster 66 I1 49 -
+numberOfParametersUsedForClustering 67 I1 50 -
+numberOfPressureLevelsUsedForClustering 68 I1 51 -
+numberOfStepsUsedForClustering 69 I1 52 -
+spareSetToZero 70 PAD n/a 10
+!
+! EPS members
+listOfEnsembleForecastNumbers - LIST - numberOfForecastsInCluster
+baseDateEPS - I4 - -
+baseTimeEPS - I2 - -
+number - I1 - -
+endListOfEnsembleForecastNumbers - ENDLIST - listOfEnsembleForecastNumbers
+!
+! Variables
+listOfParametersUsedForClustering - LIST - numberOfParametersUsedForClustering
+parameterCode - I1 - -
+tableCode - I1 - -
+endListOfParametersUsedForClustering - ENDLIST - listOfParametersUsedForClustering
+!
+! Pressure levels
+listOfPressureLevelsUsedForClustering - LIST - numberOfPressureLevelsUsedForClustering
+pressureLevel - I2 - -
+endListOfPressureLevelsUsedForClustering - ENDLIST - listOfPressureLevelsUsedForClustering
+!
+! Steps
+listOfStepsUsedForClustering - LIST - numberOfStepsUsedForClustering
+step - I2 - -
+endListOfStepsUsedForClustering - ENDLIST - listOfStepsUsedForClustering
+!
+spareToEnsureFixedLength - PADTO n/a 960
diff --git a/gribtemplates/localDefinitionTemplate_098_000_029.old b/gribtemplates/localDefinitionTemplate_098_000_029.old
new file mode 100755
index 0000000..140e63c
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_029.old
@@ -0,0 +1,27 @@
+!
+! localDefinitionTemplate_029
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+totalNumberOfClusters 51 I1 43 -
+spareSetToZero 52 PAD n/a 1
+clusteringMethod 53 I1 44 -
+northernLatitudeOfDomain 54 S3 45 -
+westernLongitudeOfDomain 57 S3 46 -
+southernLatitudeOfDomain 60 S3 47 -
+easternLongitudeOfDomain 63 S3 48 -
+numberOfForecastsInCluster 66 I1 49
+listOfEnsembleForecastNumbers - LIST - numberOfForecastsInCluster
+baseDateEPS - I4 - -
+baseTimeEPS - I2 - -
+number - I1 - -
+endListOfEnsembleForecastNumbers - ENDLIST - listOfEnsembleForecastNumbers
+spareToEnsureFixedLength - PADTO n/a 960
diff --git a/gribtemplates/localDefinitionTemplate_098_000_030 b/gribtemplates/localDefinitionTemplate_098_000_030
new file mode 100755
index 0000000..978c602
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_030
@@ -0,0 +1,27 @@
+! localDefinitionTemplate_030
+! ---------------------------
+!
+! # Forecasting Systems with Variable Resolution
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+total 51 I1 43 -
+oceanAtmosphereCoupling 52 I1 44 -
+spare 53 I1 45 -
+padding 54 PAD n/a 2
+! VAriable Resolution (VAREPS)
+legBaseDate 56 I4 46 - ! yyyymmdd
+legBaseTime 60 I2 47 - ! hhmm
+legNumber 62 I1 48 -
+! For hindcasts
+dateOfForecastRun 63 I4 49 - !
+climateDateFrom 67 I4 50 - ! yyyymmdd (ensemble means of hindcasts)
+climateDateTo 71 I4 51 - ! yyyymmdd (ensemble means of hindcasts)
+spareSetToZero 75 PAD n/a 32
diff --git a/gribtemplates/localDefinitionTemplate_098_000_031 b/gribtemplates/localDefinitionTemplate_098_000_031
new file mode 100755
index 0000000..70541a5
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_031
@@ -0,0 +1,23 @@
+! localDefinitionTemplate_031
+! ---------------------------
+!
+! # EUROSIP Products
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+total 51 I1 43 -
+forecastMonth 52 I2 44 -
+dateOfForecastRun 54 I4 45 - ! yyyymmdd
+numberOfModels 58 I1 46 -
+spareSetToZero 59 PAD n/a 42
+listOfModelIdentifiers 101 LIST 47 numberOfModels
+modelIdentifier - I2 - -
+ENDLIST - ENDLIST - listOfModelIdentifiers
+unusedEntriesSetToBlanks - SP_TO - 240
diff --git a/gribtemplates/localDefinitionTemplate_098_000_032 b/gribtemplates/localDefinitionTemplate_098_000_032
new file mode 100755
index 0000000..b72fb03
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_032
@@ -0,0 +1,30 @@
+!
+! localDefinitionTemplate_032
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+totalNumberOfClusters 51 I1 43 -
+spareSetToZero 52 PAD n/a 1
+clusteringMethod 53 I1 44 -
+startTimeStep 54 I2 45 -
+endTimeStep 56 I2 46 -
+northernLatititudeOfDomain 58 S3 47 -
+westernLongititudeOfDomain 61 S3 48 -
+southernLatititudeOfDomain 64 S3 49 -
+easternLongititudeOfDomain 67 S3 50 -
+domain 70 A1 51 -
+operationalForecastCluster 71 I1 52 -
+controlForecastCluster 72 I1 53 -
+representativeMember 73 I1 54 -
+climatologicalRegime 74 I1 55 -
+numberOfForecastsInCluster 75 I1 56 -
+ensembleForecastNumbers 76 LP_I1 57 numberOfForecastsInCluster
+spareToEnsureFixedLength - PADTO n/a 328
diff --git a/gribtemplates/localDefinitionTemplate_098_000_035 b/gribtemplates/localDefinitionTemplate_098_000_035
new file mode 100755
index 0000000..c5f944a
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_035
@@ -0,0 +1,31 @@
+!
+! localDefinitionTemplate_035
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+yearOfReference 50 I1 42 -
+monthOfReference 51 I1 43 -
+dayOfReference 52 I1 44 -
+hourOfReference 53 I1 45 -
+minuteOfReference 54 I1 46 -
+centuryOfReference 55 I1 47 -
+!
+numberOfForecasts 56 I1 48 -
+numberOfAnalysis 57 I1 49 -
+!
+listOfForecastSteps - LIST - numberOfForecasts
+forecastSteps - I3 - -
+endListOfForecastSteps - ENDLIST - listOfForecastSteps
+!
+listOfAnalysis - LIST - numberOfAnalysis
+analysisOffset - I3 - -
+endListOfAnalysisteps - ENDLIST - listOfAnalysis
+spareToEnsureFixedLength - PADTO n/a 120
+!
diff --git a/gribtemplates/localDefinitionTemplate_098_000_050 b/gribtemplates/localDefinitionTemplate_098_000_050
new file mode 100755
index 0000000..c43fb4d
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_050
@@ -0,0 +1,25 @@
+!
+! localDefinitionTemplate_050
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+total 51 I1 43 -
+modelIdentifier 52 I1 44 -
+latitudeOfNorthWestCornerOfArea 53 S4 45 -
+longitudeOfNorthWestCornerOfArea 57 S4 46 -
+latitudeOfSouthEastCornerOfArea 61 S4 47 -
+longitudeOfSouthEastCornerOfArea 65 S4 48 -
+!reservedForECMWFAdditions
+originalParameterNumber 69 I1 49 -
+originalParameterNumber 70 I1 50 -
+spareSetToZeroOctets 71 PAD n/a 46
+spareSetToZeroKsec1 n/a PAD 51 10
+optionalData 117 BYTES 61 184
diff --git a/gribtemplates/localDefinitionTemplate_098_000_190 b/gribtemplates/localDefinitionTemplate_098_000_190
new file mode 100755
index 0000000..723679b
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_190
@@ -0,0 +1,19 @@
+!
+! localDefinitionTemplate_190
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+zeroesForCompatibilityWithMars 50 PAD 42 2
+numberOfLocalDefinitions 52 I1 44 -
+localDefinitions 53 LIST 45 numberOfLocalDefinitions
+localDefinitionNumber - I1 - -
+numberOfBytesInLocalDefinition - I2 - -
+ENDLIST - ENDLIST - localDefinitions
+streamOfLocalDefinitionBytes - BYTES - numberOfBytesInLocalDefinition
diff --git a/gribtemplates/localDefinitionTemplate_098_000_191 b/gribtemplates/localDefinitionTemplate_098_000_191
new file mode 100755
index 0000000..3b1a4d7
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_191
@@ -0,0 +1,20 @@
+!
+! localDefinitionTemplate_191
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+zeroForCompatibilityWithMars 50 PAD 42 2
+formatVersionMajorNumber 52 I1 44 -
+formatVersionMinorNumber 53 I1 45 -
+originalSubCentreIdentifier 54 I1 46 -
+setToZero 55 PAD 47 4
+numberOfBytesOfFreeFormatData 59 I2 51 -
+dataDescriptorBytes 61 BYTES 52 numberOfBytesOfFreeFormatData
+padToAMultipleOf80Bytes 60 PADFROM n/a 80
diff --git a/gribtemplates/localDefinitionTemplate_098_000_192 b/gribtemplates/localDefinitionTemplate_098_000_192
new file mode 100755
index 0000000..2d7a515
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_000_192
@@ -0,0 +1,18 @@
+!
+! localDefinitionTemplate_192
+! ---------------------------
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+zeroForCompatibilityWithMars 50 PAD 42 2
+numberOfLocalDefinitions 52 I1 44 -
+listOfLocalDefinitions - LIST - numberOfLocalDefinitions
+localDefinitionLength - I2 - -
+localDefinition - LOCAL - -
+endListOfLocalDefinitions - ENDLIST - listOfLocalDefinitions
diff --git a/gribtemplates/localDefinitionTemplate_098_231_001 b/gribtemplates/localDefinitionTemplate_098_231_001
new file mode 120000
index 0000000..6bf031f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_231_001
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_001
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_231_004 b/gribtemplates/localDefinitionTemplate_098_231_004
new file mode 120000
index 0000000..21dd406
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_231_004
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_004
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_231_015 b/gribtemplates/localDefinitionTemplate_098_231_015
new file mode 120000
index 0000000..d4b5e2f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_231_015
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_015
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_231_016 b/gribtemplates/localDefinitionTemplate_098_231_016
new file mode 120000
index 0000000..6080b8e
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_231_016
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_016
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_232_001 b/gribtemplates/localDefinitionTemplate_098_232_001
new file mode 120000
index 0000000..6bf031f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_232_001
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_001
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_232_004 b/gribtemplates/localDefinitionTemplate_098_232_004
new file mode 120000
index 0000000..21dd406
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_232_004
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_004
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_232_015 b/gribtemplates/localDefinitionTemplate_098_232_015
new file mode 120000
index 0000000..d4b5e2f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_232_015
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_015
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_232_016 b/gribtemplates/localDefinitionTemplate_098_232_016
new file mode 120000
index 0000000..6080b8e
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_232_016
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_016
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_233_001 b/gribtemplates/localDefinitionTemplate_098_233_001
new file mode 120000
index 0000000..6bf031f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_233_001
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_001
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_233_004 b/gribtemplates/localDefinitionTemplate_098_233_004
new file mode 120000
index 0000000..21dd406
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_233_004
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_004
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_233_015 b/gribtemplates/localDefinitionTemplate_098_233_015
new file mode 120000
index 0000000..d4b5e2f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_233_015
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_015
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_233_016 b/gribtemplates/localDefinitionTemplate_098_233_016
new file mode 120000
index 0000000..6080b8e
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_233_016
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_016
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_234_004 b/gribtemplates/localDefinitionTemplate_098_234_004
new file mode 120000
index 0000000..21dd406
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_234_004
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_004
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_234_015 b/gribtemplates/localDefinitionTemplate_098_234_015
new file mode 120000
index 0000000..d4b5e2f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_234_015
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_015
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_234_016 b/gribtemplates/localDefinitionTemplate_098_234_016
new file mode 120000
index 0000000..6080b8e
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_234_016
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_016
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_235_004 b/gribtemplates/localDefinitionTemplate_098_235_004
new file mode 120000
index 0000000..21dd406
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_235_004
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_004
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_235_015 b/gribtemplates/localDefinitionTemplate_098_235_015
new file mode 120000
index 0000000..d4b5e2f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_235_015
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_015
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_235_016 b/gribtemplates/localDefinitionTemplate_098_235_016
new file mode 120000
index 0000000..6080b8e
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_235_016
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_016
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_240_001 b/gribtemplates/localDefinitionTemplate_098_240_001
new file mode 120000
index 0000000..6bf031f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_240_001
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_001
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_241_001 b/gribtemplates/localDefinitionTemplate_098_241_001
new file mode 120000
index 0000000..6bf031f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_241_001
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_001
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_242_001 b/gribtemplates/localDefinitionTemplate_098_242_001
new file mode 120000
index 0000000..6bf031f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_242_001
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_001
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_098_243_001 b/gribtemplates/localDefinitionTemplate_098_243_001
new file mode 120000
index 0000000..6bf031f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_098_243_001
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_001
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_200_098_191 b/gribtemplates/localDefinitionTemplate_200_098_191
new file mode 120000
index 0000000..f10204e
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_200_098_191
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_191
\ No newline at end of file
diff --git a/gribtemplates/localDefinitionTemplate_214_098_244 b/gribtemplates/localDefinitionTemplate_214_098_244
new file mode 100755
index 0000000..90cee6e
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_214_098_244
@@ -0,0 +1,142 @@
+!
+! localDefinitionTemplate_244
+! ---------------------------
+!
+! # SREPS Short-Range EPS information
+!
+! Last update: 20070223
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+!
+! Compatibility with MARS
+!
+localDefinitionNumber 41 I1 37 -
+Class 42 I1 38 -
+Type 43 I1 39 -
+Stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+Number. 50 I1 42 -
+Total. 51 I1 43 -
+!
+! **_EXPERIMENT_**
+!
+************_EXPERIMENT_************ 52 A4 44 -
+Experiment_Identifier 56 A8 45 -
+Sub-Experiment_Identifier 64 A8 47 -
+!
+! **_PRODUCT_**
+!
+************_PRODUCT_*************** 72 A4 49 -
+Original_CodeTable_2_Version_Number 76 I1 50 -
+Original_Parameter_Iden_(CodeTable2) 77 I1 51 -
+Original_Parameter_Identifier 78 A8 52 -
+Product_Identifier 86 A8 54 -
+!
+! Thresholds and Distributions
+!
+Threshold_[Distribution]_(0=n,1=yes) 94 I2 56 -
+Threshold_[Distribution]_Units 96 A4 57 -
+At_least__[Distribut._Proportion_Of] 100 I4 58 -
+Less_Than_[To_Overall_Distribution] 104 I4 59 -
+!
+zeroForFutureProducts 108 PAD 60 40
+!
+! **_ENSEMBLE_**
+!
+************_ENSEMBLE_************** 148 A4 100 -
+Number_Combination_Ensembles_(1=no) 152 I2 101 -
+Show_Combination_E._[2]_(0=no,1=yes) 154 I1 102 -
+Show_Combination_E._[3]_(0=no,1=yes) 155 I1 103 -
+Show_Combination_E._[4]_(0=no,1=yes) 156 I1 104 -
+zeroForFutureCombinations 157 PAD 105 7
+Total_Number_Members_Used 164 I2 112 -
+Total_Number_Members_Possible 166 I2 113 -
+Total_Number_Members_Missing 168 I2 114 -
+Ensemble_Combination_Number 170 I2 115 -
+Ensemble_Identifier 172 A8 116 -
+Local_Number_Members_Used 180 I2 118 -
+Local_Number_Members_Possible 182 I2 119 -
+Local_Number_Members_Missing 184 I2 120 -
+!
+listMembersUsed - LIST - Local_Number_Members_Used
+Used_Model_LBC - A4 - -
+endlistMembersUsed - ENDLIST - listMembersUsed
+!
+listMembersMissing - LIST - Local_Number_Members_Missing
+Missing_Model_LBC - A4 - -
+endlistMembersMissing - ENDLIST - listMembersMissing
+!
+! More than one Combination
+!
+listEnsembleCombination2 - LIST - Show_Combination_E._[2]_(0=no,1=yes)
+Ensemble_Combinat._Number_(0=no)_[2] - I2 - -
+Ensemble_Identifier_[2] - A8 - -
+Local_Number_Members_Used_[2] - I2 - -
+Local_Number_Members_Possible_[2] - I2 - -
+Local_Number_Members_Missing_[2] - I2 - -
+Date_[2] - D3 - -
+Hour_[2] - I1 - -
+Minute_[2] - I1 - -
+Time_Range_One_[2] - I2 - -
+Time_Range_Two_[2] - I2 - -
+endlistEnsembleCombination2 - ENDLIST - listEnsembleCombination2
+!
+listMembersUsed_[2] - LIST - Local_Number_Members_Used_[2]
+Used_Model_LBC_[2] - A4 - -
+endlistMembersUsed_[2] - ENDLIST - listMembersUsed_[2]
+!
+listMembersMissing_[2] - LIST - Local_Number_Members_Missing_[2]
+Missing_Model_LBC_[2] - A4 - -
+endlistMembersMissing_[2] - ENDLIST - listMembersMissing_[2]
+!
+listEnsembleCombination3 - LIST - Show_Combination_E._[3]_(0=no,1=yes)
+Ensemble_Combinat._Number_(0=no)_[3] - I2 - -
+Ensemble_Identifier_[3] - A8 - -
+Local_Number_Members_Used_[3] - I2 - -
+Local_Number_Members_Possible_[3] - I2 - -
+Local_Number_Members_Missing_[3] - I2 - -
+Date_[3] - D3 - -
+Hour_[3] - I1 - -
+Minute_[3] - I1 - -
+Time_Range_One_[3] - I2 - -
+Time_Range_Two_[3] - I2 - -
+endlistEnsembleCombination3 - ENDLIST - listEnsembleCombination3
+!
+listMembersUsed_[3] - LIST - Local_Number_Members_Used_[3]
+Used_Model_LBC_[3] - A4 - -
+endlistMembersUsed_[3] - ENDLIST - listMembersUsed_[3]
+!
+listMembersMissing_[3] - LIST - Local_Number_Members_Missing_[3]
+Missing_Model_LBC_[3] - A4 - -
+endlistMembersMissing_[3] - ENDLIST - listMembersMissing_[3]
+!
+listEnsembleCombination4 - LIST - Show_Combination_E._[4]_(0=no,1=yes)
+Ensemble_Combinat._Number_(0=no)_[4] - I2 - -
+Ensemble_Identifier_[4] - A8 - -
+Local_Number_Members_Used_[4] - I2 - -
+Local_Number_Members_Possible_[4] - I2 - -
+Local_Number_Members_Missing_[4] - I2 - -
+Date_[4] - D3 - -
+Hour_[4] - I1 - -
+Minute_[4] - I1 - -
+Time_Range_One_[4] - I2 - -
+Time_Range_Two_[4] - I2 - -
+endlistEnsembleCombination4 - ENDLIST - listEnsembleCombination4
+!
+listMembersUsed_[4] - LIST - Local_Number_Members_Used_[4]
+Used_Model_LBC_[4] - A4 - -
+endlistMembersUsed_[4] - ENDLIST - listMembersUsed_[4]
+!
+listMembersMissing_[4] - LIST - Local_Number_Members_Missing_[4]
+Missing_Model_LBC_[4] - A4 - -
+endlistMembersMissing_[4] - ENDLIST - listMembersMissing_[4]
+!
+! EXTRA INFORMATION like 191
+!
+*********_EXTRA_DATA_*************** - A4 - -
+Extra_Data_FreeFormat_(0=none) - I2 - -
+Data_Descriptor_Bytes - BYTES - Extra_Data_FreeFormat_(0=none)
+padToAMultipleOf80Bytes 0 PADFROM n/a 80
+!
diff --git a/gribtemplates/localDefinitionTemplate_214_098_245 b/gribtemplates/localDefinitionTemplate_214_098_245
new file mode 100755
index 0000000..3dcf801
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_214_098_245
@@ -0,0 +1,28 @@
+!
+! localDefinitionTemplate_245
+! ---------------------------
+!
+! # Members information of
+! # SREPS Short-Range EPS
+!
+! Last update: 20070323
+!
+!Description Octet Code Ksec1 Count
+!----------- ----- ---- ----- -----
+!
+localDefinitionNumber 41 I1 37 -
+class 42 I1 38 -
+type 43 I1 39 -
+stream 44 I2 40 -
+experimentVersionNumber 46 A4 41 -
+number 50 I1 42 -
+total 51 I1 43 -
+Model_Identifier 52 A8 44 -
+LBC_Initial_Conditions 60 A8 46 -
+Model_LBC_Member_Identifier 68 A4 48 -
+Model_Additional_Information 72 A8 49 -
+zeroForFutureDevelopments 80 PAD 51 20
+Extra_Data_FreeFormat_(0=none) 100 I2 71 -
+Data_Descriptor_Bytes 102 BYTES 72 Extra_Data_FreeFormat_(0=none)
+padToAMultipleOf80Bytes 0 PADFROM n/a 80
+!
diff --git a/gribtemplates/localDefinitionTemplate_244_098_001 b/gribtemplates/localDefinitionTemplate_244_098_001
new file mode 120000
index 0000000..6bf031f
--- /dev/null
+++ b/gribtemplates/localDefinitionTemplate_244_098_001
@@ -0,0 +1 @@
+localDefinitionTemplate_098_000_001
\ No newline at end of file
diff --git a/install b/install
new file mode 100755
index 0000000..f08bbc9
--- /dev/null
+++ b/install
@@ -0,0 +1,61 @@
+#! /bin/sh
+
+umask 0
+
+PATH=/usr/bin:/bin:$PATH
+
+quit() {
+ echo "Exiting..."
+ exit 1
+}
+
+R64=`cat -s .r64`
+
+INSTALL_DIR=`cat -s .emos`
+
+echo
+echo "*******************************************************************"
+echo "If you choose default directories for Tables or libemos$R64.a "
+echo "you must have root permission to do that."
+echo "*******************************************************************"
+echo
+
+echo "Installing Tables, land-sea mask and EMOS library into $INSTALL_DIR ... "
+
+trap "" 2 3
+
+for i in `cat .list/gribtables` ; do
+ tar cf - $i | (cd $INSTALL_DIR; tar xf - )
+done
+for i in `cat .list/bufrtables` ; do
+ tar cf - $i | (cd $INSTALL_DIR; tar xf - )
+done
+for i in `cat .list/crextables` ; do
+ tar cf - $i | (cd $INSTALL_DIR; tar xf - )
+done
+for i in `cat .list/land_sea_mask` ; do
+ tar cf - $i | (cd $INSTALL_DIR; tar xf - )
+done
+for i in `cat .list/gribtemplates` ; do
+ tar cf - $i | (cd $INSTALL_DIR; tar xf - )
+done
+
+cp libemos$R64.a $INSTALL_DIR/.
+echo
+
+echo "*******************************************************************"
+echo
+echo "Installation complete!"
+echo
+echo "*******************************************************************"
+echo
+echo " You can see examples for: decoding GRIB, BUFR, CREX products and"
+echo "interpolation in example directory. There is appropriate Makefile for"
+echo "each of them. You should invoke 'make' and start executable version"
+echo "of programs e.g. agrdemo.F :"
+echo
+echo "./agrdemo -i data/latlon.grib"
+echo
+echo "*******************************************************************"
+
+exit 0
diff --git a/interpolation/0-INDEX-0 b/interpolation/0-INDEX-0
new file mode 100755
index 0000000..a9bd285
--- /dev/null
+++ b/interpolation/0-INDEX-0
@@ -0,0 +1,275 @@
+0-INDEX-0 mac This file!
+Imakefile mac To build libspecgp.a
+Makefile mac To build libspecgp.a
+areachk.F mac Fixup input/output field area definitions.
+auresol.F mac Returns the default truncation for given lat/long grid
+bitmap.h mac Header for bitmap routines.
+chequal.F mac Compare ASCII character strings without regard to case.
+chkprec.F mac Check if precipitation threshold has been redefined
+clear_c.F mac Clear interpolation common blocks
+createSharedMemoryCoefficients.c mac Creates spectral to grid interpolation coefficients in shared memory.
+csum.F mac Implements the BLAS routine of the same name
+current.h mac Info about gaussian definition currently in common.
+ddstyle.F mac Create regular lat/lon subgrid by selecting points.
+debug.h mac Debug header
+defaults_for_table_001 mac Parameter processing defaults for WMO table 1.
+defaults_for_table_128 mac Parameter processing defaults for ECMWF table 128.
+dssarea.F mac Fixup field area specification (dissemination style).
+dummy.F mac Dummy routine to satisfy make. (VECTOR.F)
+dummy2.F mac Dummy routine to satisfy make. (NO_OPT.F)
+emosPrecision.c mac Returns 64 if double-precision (64-bit) REALs in use.
+eulavgg.F mac Reverse the effects of ggvalue.F
+fft99.f mac Multiple fast real periodic fourier transform.
+fftchk.c mac Check truncation and longitude grid interval OK for FFT.
+freecf.F mac Set trigger to allow mutual memory flushing of types 6/7
+fixarea.F mac Fixup area definition to correspond to grid definitions
+fortdefs.h mac Defines for Fortran/C interface data types
+funcs.F mac Fortran functions used by ocean interpolation (intocn)
+gb2gb.F mac Interpolate lat/lon GRIB to lat/lon: dissemination style
+getconf.F mac Decides how to handle legendre coefficients.
+ggintrp.F mac Finds value at a point by interpolation in a gaussian field.
+ggrotat.F mac Generates a rotated gaussian grid.
+ggvalue.F mac Rotates one line of latitude in a gaussian grid.
+gmapbit.c mac Get a bit from a given position in a bitmap.
+grdynam.h mac Dynamically allocated work space arrays(grid to grid).
+grfixed.h mac Fixed work space array definitions
+grspace.h mac Work space array definitions
+hgengg.F mac Lat/longs (before rot) for rotated gaussian grid.
+hgengrd.F mac Lat/longs (before rot) for rotated grid.
+hgengrw.F mac Lat/longs (before rot) for rotated grid for winds.
+hgenll.F mac Lat/longs (before rot) for rotated lat/long grid.
+hgenllw.F mac Calculates lat/longs (before rotation) for wind fields.
+hgetlsm.F mac Read old land-sea mask values from file.
+hirlam.F mac Rotated lat/lon from reduced gauss using 12-point interpolation.
+hirlamw.F mac Rotated lat/lon U/V from reduced gauss using 12-point interpolation.
+hirlsm.F mac As hirlam.F but using land-sea masks.
+hll2ll.F mac Creates rotated lat/lon from lat/lon using 12-pt interpn
+hll2llw.F mac Rotated U and V lat/lon from lat/lon using 12-pt interpn
+hll2xyz.F mac Converts array of lat/longs to (x,y,z) coordinates.
+hnei12.F mac Finds 12 neighbours for horizontal interpolation.
+hneill.F mac Finds 12 neighbours for lat/lon horizontal interpolation
+hntfap.F mac Prepare to interpolate packed input field.
+hntfaph.F mac Prepare to interpolate packed input field.
+hntfaps.F mac Prepare to interpolate packed input field.
+hntfau.F mac Prepare to interpolate unpacked input field.
+hntfauh.F mac Prepare to interpolate unpacked input field.
+hntfaus.F mac Prepare to interpolate unpacked input field.
+hntfbu.F mac Interpolate unpacked input field.
+hpshgpw.F mac Rotates grid about y-axis and calculates angle between local axes.
+hrg2gg.F mac Rotated gauss from reduced gauss using 12-point interpolation.
+hrg2ggw.F mac Rotated U and V gauss from reduced gauss using 12-point interpolation.
+hrg2ll.F mac Rotated lat/lon from reduced gauss using 12-point interpolation.
+hrg2llw.F mac Rotated lat/lon wind from a reduced gauss using 12-point interpolation.
+hsp2gg.F mac Finds a gaussian grid for a given spectral truncation.
+hwts12.F mac Interpolation weightings for horizontal interpolation.
+hwtsll.F mac Interpolation lat/lon weightings for horizontal interpolation.
+hwtslsm.F mac As hwts12.F but using land-sea masks.
+iafree.F mac Deallocate heap space used by grid-pt to grid-pt interpolation.
+iagcntl.F mac Control interpolation regular gaussian or lat/long fields.
+iaidef.F mac Generate input field definition from GRIB definition.
+iainit.F mac Initialise common decks for grid-pt to grid-pt interpolation.
+iaintgg.F mac Control interpolation GRIB -> gaussian
+iaintll.F mac Control interpolation GRIB -> regular lat/long
+iaogdef.F mac Set the output field definition variables.
+iaoldef.F mac Set the output field definition for a regular lat/long
+iarcntl.F mac Control interpolation of quasi regular gaussian -> gaussian or lat/long
+iareset.F mac Generate the output field definition.
+iarmem.F mac Acquires heap space for expanded REAL fields.
+ibasini.F mac Ensure basic interpolation setup is done.
+igalloc.F mac Allocates heap space.
+igbess.F mac Computes initial approximations to gaussian latitudes.
+igdins.F mac Calculate distance between points in output latitude array and its N/S neighbours in input latitude array
+igdiwe.F mac Calculate distance between points in output latitude array and its W/E neighbours in input latitude array
+igglat.F mac Compute gaussian latitudes for a given truncation.
+iggmem.F mac Acquires heap space.
+iggrid.F mac Generate lat/long points for a gaussian truncation and area.
+igint.F mac Calculate unnormalised interpolation wts between regular grids
+igintr.F mac Calculate interpolation wts for one line of lat for regular grids
+iglgrid.F mac Generate lat/long points for regular lat/long grid
+iglrev.F mac Reverses rows or columns of a rectangular matrix
+iglsize.F mac Evaluate array sizes for regular lat/long and area
+iglsm01.F mac Process one lat row from 10 minute land sea mask
+iglsmb.F mac Calculate effects of land-sea masks on unnormalised wts for a quasi regular input and a regular output
+iglsmd.F mac Generate the land sea mask file info
+iglsmr.F mac Calculate effects of land-sea masks for one lat on the unnormalised interpolation weights.
+iglsmst.F mac Process one line of latitude from standard land sea mask file
+ignorm.F mac Normalise the array of interpolation weights.
+igplsm.F mac Force an interpolated land sea mask to a real 0-1 field
+igpoleg.F mac Calculate values at pole of regular lat/long field when input is gaussian
+igpolew.F mac Calculate values at pole of regular lat/long field when input is gaussian (for a wind field).
+igprec.F mac Additional interpolation for precipitation
+igscan.F mac Transform a regular field between scanning modes
+igsetup.F mac Setup GRIB sections 1, 2, 4 for the new interpolation product.
+igsize.F mac Evaluate array sizes for a gaussian truncation and area
+igtog.F mac Interpolation between regular input and output
+igtogr.F mac interpolation for one latitude using two neighbouring lines
+igtran.F mac Transposes a rectangular matrix.
+init_cm.F mac Initialize default values in interpolation common decks
+insane.F mac Check consistency of interpolation options.
+intf.F mac Make user interpolation request.
+intf.h mac Header for intf, intfa, intfb and intfc.
+intfa.F mac Prepare to interpolate input field.
+intfap.F mac Prepare to interpolate packed input field.
+intfau.F mac Prepare to interpolate unpacked input field.
+intfb.F mac Interpolate input field.
+intfbp.F mac Interpolate packed input field.
+intfbu.F mac Interpolate unpacked input field.
+intfc.F mac Move input field to output field.
+intin.F mac Handle user request parameters for input data
+intisl.F mac Perform ISLSCP processing
+intisl.h mac Defines for ISLSCP processing
+intlog.h mac Common block for interpolation diagnostics logging.
+intlog.F mac Logs error messages from interpolation routines.
+intlogd.F mac Toggle display flag for error messages from interpolation
+intlogr.F mac Logs error messages containing real number
+intlogs.c mac Save MARS server display function pointer.
+intocn.F mac Interpolates ocean field.
+intout.F mac Handle user request parameters for output data
+intpnum.F mac Returns INTP_CYCLE
+intuvdh.F mac Encodes/decodes data into/from GRIB code.
+intuvf.F mac Make user interpolation request for U/V fields.
+intuvgh.F mac U & V reduced gaussian to rotated GRIB U & V.
+intuvp.F mac Interpolate packed U/V fields.
+intuvph.F mac Interpolate spectral vort/div or U/V to U and V.
+intuvs.F mac Create GRIB U/V from GRIB VO/D without interpolation.
+intuvu.F mac Interpolate unpacked U/V fields.
+intuvxh.F mac Interpolate wind component spectral field to grid point.
+intvect.F mac Interpolate vector fields (winds).
+intwave.F mac interpolates quasi-reg lat/long wave field to regular lat/long
+irdiwe.F mac Calculate distance between points in long array and its W/E neighbours for a quasi regular input and regular field
+irgmem.F mac Acquires heap space for quasi regular to regular
+irgrid.F mac Generate lat points and start points for a quasi regular gaussian
+irgtog.F mac interpolates quasi regular input to regular output
+irint.F mac Calculate unnormalised wts for quasi reg to reg
+irintr.F mac Calculate unnormalised wts for quasi reg to reg, 1 lat
+irlrev.F mac Reverses rows or columns of a quasi regular matrix
+irlsmb.F mac Calculate effects of land-sea mask on unnormalised interpolation weights for regular input and output fields.
+irprec.F mac Extra interpolation for precipitation when input is quasi regular
+irscan.F mac Transforms scanning modes for quasi regular field
+irsize.F mac Evaluate array sizes for a quasi reg gaussian
+iscrsz.F mac Calculate scratch space size for unpacking GRIBs.
+islproc.F mac Generates point from four neighbours using lsm types.
+issame.F mac Check whether input and output fields are same.
+jacobi.F mac Rotates spectral fields by latitude.
+jacobif.F mac Rotates spectral fields by latitude (Fujitsu only).
+jagggp.F mac Converts spectral input fields to a gaussian grid
+jallgp.F mac Converts spectral input fields to lat/long grid
+jallwn.F mac Converts spectral input fields to lat/long grid (U & V)
+jchmod.c mac Gives Fortran callable chmod (for Fujitsu).
+jdebug.F mac Checks whether the debug flag is to be turned on.
+jfindfn.F mac Create full pathname and open file.
+jfindfn3.F mac Version of jfindfn.F which calls PBxxxx3 routines
+jfindir.F mac Find directory name defined by an environment variable.
+jgetgg.F mac Reads the definition of a gaussian grid.
+jgglat.F mac Computes gaussian lines of latitude for given truncation
+jindex.c mac Returns length of a character string (+ embedded blanks)
+jintend.F mac Deallocates heap memoryallocated by JINTLL/JINTGG.
+jintgg.F mac Converts spectral input fields to gaussian.
+jintll.F mac Converts spectral input fields to lat/long grid.
+jjset99.F mac Update of set99.f which gives a return status.
+jmakgg.F mac Makes legendre functions for latitudes(gaussian).
+jmakgg3.F mac Version of jmakgg.F which calls PBxxxx3 routines
+jmakll.F mac Makes legendre functions for latitudes(regular lat/lon).
+jmakll3.F mac Version of jmakll.F which calls PBxxxx3 routines
+jmemhan.F mac Handles dynamic memory allocation
+jmkofgg.F mac Builds up offsets into storage array for gaussian grid.
+jmovgg.F mac Moves gausssian grid point data from array to array.
+jmovll.F mac Moves grid point data from array to array.
+jmvugg.F mac Moves gaussian grid point data from array to array.
+jmvull.F mac Moves grid point data from array to array.
+jnorsgg.F mac Determines latitude in gaussian grid N or S of given latitude
+jnumgg.F mac Returns number of points in each latitude of gaussian grid.
+jnumggq.F mac Simplified interface to JNUMGG.
+jopngg.F mac Finds a file of legendre polynomials for grid/truncation
+jopnggf.F mac Open interpolation coefficients file on Fujitsu.
+jopnggsm.c mac Handle file of legendre polynomials as memory mapped.
+jopnll.F mac Finds a file of legendre polynomials for grid/truncation
+jopnllf.F mac Open interpolation coefficients file on Fujitsu.
+jopnllsm.c mac Handle file of legendre polynomials as memory mapped.
+jparam2.h mac Hold trigger to allow memory flushing of types 6/7
+jparams.h mac PARAMETER definitions.
+jsgggp.F mac Converts stretched spectral fields to a gaussian grids.
+jsllgp.F mac Converts stretched spectral fields to a lat/long grids.
+jstrll.F mac Converts stretched spectral fields to a lat/long grids.
+jstrwll.F mac Converts stretched spectral winds to a lat/long grids.
+strlat.F mac Transform stretched <-> real lats; calculate map factor
+jreadgg.F mac Reads legendre functions for one latitude(gaussian).
+jreadll.F mac Reads legendre functions for one latitude(lat/long).
+jsh2sh.F mac Changes resolution of a field of spectral coefficients.
+jspleg1.F mac Calculates the legendre functions for one latitude.
+jsppole.F mac Calculates fourier coefficient for U or V at pole.
+jsymgg.F mac Converts spectral input fields to gaussian grid.
+jsymll.F mac Converts spectral input fields to lat/long grid.
+jtimer.c mac Time task processing.
+juvpole.F mac Creates polar wind U or V for lat/long from U/V spectral
+jvod2uv.F mac Interpolate spectral vort/div to spectral U/V.
+jwindll.F mac Converts spectral to lat/long grid for wind U and V.
+jwscal.F mac Applies scale factor to all latitudes except the poles
+kintrg.F mac Interpolate reduced gaussian to new reduced gaussian
+knfrom4.F mac Generates new field point from four nearest neighbours
+krg2rg.F mac Interpolate field from reduced gaussian grid to another
+krg2rgu.F mac Interpolate unpacked reduced gaussian to reduced gaussian
+lgrpr4.F mac Print information from Section 4 of GRIB code
+ll2xyz.F mac Convert lat/long coords to (x,y,z)
+lrekam.F mac Reverses rotations carried out by makerl.F.
+lsmfld.F mac Determines whether field is for 'land-sea mask' treatment.
+lsm_red.F mac Lookup filename for N160 reduced gaussian lsm file.
+make.dep mac Header file dependencies.
+makemap.c mac Build a bitmap from a definition given in a file.
+makerl.F mac Rotates an array of spherical harmonic coefficients.
+memreq.h mac Memory request definitions
+mkbitmp.F mac Select points using a bitmap.
+mkframe.F mac Remove points from inside a frame boundary.
+my_ialloc.c mac Allocates storage for a file.
+newisl.F mac Interpolate field on old lsm mask to one on new lsm
+ngintrp.F mac Finds value at a pt by interpolation in a gaussian field
+ngrotat.F mac Generates a rotated gaussian grid.
+ngvalue.F mac Rotates one line of latitude in a gaussian grid.
+nifld.common mac Input field common block.
+nmakgg.F mac Make interpolation coeffs one lat at a time for gaussian grids
+nmakll.F mac Make interpolation coeffs one lat at a time for lat/long grids
+nofld.common mac Output field common block.
+nptwe32.F mac 32-bit REAL version of numptwe.F
+numptns.F mac Calculate number of grid points in range from north to south
+numptwe.F mac Calculate number of grid points in range from west to east
+oceanp.F mac Interpolate GRIB ocean field.
+options_sgimips mac Extra stuff for make(SGI)
+options_sun4 mac Extra stuff for make(SUN)
+ouspace.h mac Work space array definitions(unpacked real data)
+parim.h mac PARAMETER definitions
+pddefs.F mac Setup interpolation using parameter dependent options.
+ppallow.F mac Checks if the rotation coefficients can go into mrfs.
+precip.F mac Says if field is to have 'precipitation' treatment.
+qpassm.f mac One pass through data for multiple FFT analysis.
+rddefs.c mac Read request defaults from file
+rename_unlink.c mac Provide Fortran interface to rename/unlink.
+reset_c.F mac Reset interpolation handling options using GRIB product
+rgauss_*.h mac Definitions for reduced gaussian grids.
+rpassm.f mac One pass through data for multiple FFT synthesis.
+rphi.F mac Rotates spectral coefficients by longitude.
+set99.f mac Computes factors of n & trig functions FOR FFT99.
+sharedMemoryCharacteristics.c mac Determines the shared memory characteristics (size/key/number of latitudes) for a set of spectral to grid interpolation coefficients.
+sharedmemory.h mac Defines for shared memory interpolation coefficients.
+showmap.c mac Display a rectangular bitmap.
+smread.c mac Gets interpolation coefficients in a shared memory array
+soffset.c mac Find offsets of GRIB sections 0,1,...
+sources.xxx mac Sources for library on platform xxx (ALPHA,CRAY,.. ).
+sprotat.F mac Rotates a spherical harmonic GRIB field.
+sscal.F mac Implements the BLAS routine of the same name
+tatorgg.F mac Reverse the effects of ggrotat.F
+valpina.c mac Find real index of point in feild described by a bitmap.
+waveidx.F mac Find nearest-neighbours for wave field interpolation
+wavexxx.F mac Interpolates wave fields (except 2D spectra)
+w251idx.F mac Find nearest-neighbour for wave 2dsp (251) field interpolation
+wv2di32.F mac 32-bit REAL version of wv2didx.F
+wv2didx.F mac Find nearest-neighbour for wave 2dsp field interpolation
+wv2dint.F mac interpolation of quasi-regular lat/long wave 2D spectra fields
+wv2dppp.F mac Interface to WV2DINT used by dissemination program.
+wv2dx32.F mac 32-bit REAL version of wv2dxxx.F
+wv2dxxx.F mac Interpolates 2dsp fields
+wvqlidx.F mac Find nearest-neighbours for quasi-regular lat/long waves
+wvqlint.F mac Handle interpolation of quasi-regular lat/long wave fields
+xrotate.F mac Rotate about x-axis.
+xyz2ll.F mac Convert (x,y,z) coords to lat/long.
+yrotate.F mac Rotate about y-axis.
+zzz mac Directory containing 'useful' programs.
diff --git a/interpolation/Imakefile b/interpolation/Imakefile
new file mode 100755
index 0000000..78eb3c2
--- /dev/null
+++ b/interpolation/Imakefile
@@ -0,0 +1,17 @@
+#define DoNormalLib YES
+
+SRCS.F = areachk.F chequal.F clear_c.F csum.F fft99.F fixarea.F iafree.F iagcntl.F iaidef.F iainit.F iaintgg.F iaintll.F iaogdef.F iaoldef.F iarcntl.F iareset.F iarmem.F ibasini.F igalloc.F igbess.F igdins.F igdiwe.F igglat.F iggmem.F iggrid.F igint.F igintr.F iglgrid.F iglrev.F iglsize.F iglsm01.F iglsmb.F iglsmd.F iglsmr.F iglsmst.F ignorm.F igplsm.F igpoleg.F igpolew.F igprec.F igscan.F igsetup.F igsize.F igtog.F igtogr.F igtran.F init_cm.F insane.F intf.F intfa.F intfap.F intfau.F in [...]
+OBJS.F = $(SRCS.F:.F=.o)
+
+SRCS.c = jmalloc.c my_ialloc.c rddefs.c jopnggsm.c jopnllsm.c intlogs.c fftchk.c
+OBJS.c = $(SRCS.c:.c=.o)
+
+SRCS = $(SRCS.F) $(SRCS.c)
+OBJS = $(OBJS.F) $(OBJS.c)
+
+NormalFortranObjectRule()
+NormalLibraryObjectRule()
+NormalLibraryTarget(specgp,$(OBJS))
+InstallLibrary(specgp,$(WHERE))
+
+DependTarget()
diff --git a/interpolation/Makefile b/interpolation/Makefile
new file mode 100755
index 0000000..c5290ac
--- /dev/null
+++ b/interpolation/Makefile
@@ -0,0 +1,241 @@
+#
+# Makefile for libemos/interpolation
+#
+LIBRARY = ../lib$(LIB)$(R64).a
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+TARGETS = all clean
+#
+include sources.$(ARCH)
+#
+OBJECTS.F90 = $(SOURCES.F90:.F90=.o)
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.f = $(SOURCES.f:.f=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+VECTOR.o = $(VECTOR.F:.F=.o)
+NO_OPT.o = $(NO_OPT.F:.F=.o)
+OBJECTS = $(OBJECTS.F90) $(OBJECTS.F) $(OBJECTS.f) $(VECTOR.o) $(NO_OPT.o) $(OBJECTS.c)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+$(LIBRARY): $(OBJECTS)
+ $(AR) $(ARFLAGS) $@ $?
+ $(RANLIB) $@
+
+$(VECTOR.o): $(VECTOR.F)
+ $(FC) $(VECTFFLAGS) -c $<
+
+$(NO_OPT.o): $(NO_OPT.F)
+ $(FC) $(VECTFFLAGS) -c $<
+
+include make.dep
+
+clean:
+ \rm -f $(OBJECTS) *.f
+# DO NOT DELETE
+
+areachk.o: parim.h nifld.common nofld.common
+auresol.o: parim.h nifld.common nofld.common
+chkprec.o: parim.h nifld.common
+clear_c.o: parim.h nifld.common nofld.common grfixed.h current.h
+ddstyle.o: jparams.h parim.h nofld.common
+dssarea.o: parim.h nifld.common nofld.common
+fixarea.o: parim.h nifld.common nofld.common grfixed.h intf.h
+freecf.o: jparam2.h
+gb2gb.o: jparams.h parim.h nofld.common
+getconf.o: nifld.common parim.h jparams.h
+ggintrp.o: parim.h
+ggrotat.o: parim.h
+hgengg.o: parim.h nofld.common
+hgengrd.o: parim.h
+hgengrw.o: parim.h
+hgenll.o: parim.h
+hgenllw.o: parim.h
+hgetlsm.o: parim.h nifld.common nofld.common
+hirlam.o: parim.h nifld.common nofld.common
+hirlamw.o: parim.h nifld.common nofld.common jparams.h
+hirlsm.o: parim.h nifld.common nofld.common
+hll2ll.o: parim.h
+hll2llw.o: parim.h
+hnei12.o: parim.h
+hneill.o: parim.h
+hntfap.o: parim.h nifld.common nofld.common grfixed.h intf.h
+hntfaph.o: parim.h nifld.common nofld.common grfixed.h intf.h jparams.h
+hntfaph.o: current.h
+hntfaps.o: parim.h nifld.common nofld.common grfixed.h intf.h
+hntfau.o: parim.h nifld.common nofld.common grfixed.h intf.h
+hntfauh.o: parim.h nifld.common nofld.common grfixed.h intf.h jparams.h
+hntfauh.o: current.h intlog.h
+hntfaus.o: parim.h nifld.common nofld.common grfixed.h intf.h
+hntfbu.o: parim.h nifld.common nofld.common grfixed.h intf.h
+hrg2gg.o: parim.h
+hrg2ggw.o: parim.h
+hrg2ll.o: parim.h
+hrg2llw.o: parim.h nifld.common nofld.common
+hsp2gg.o: parim.h
+iafree.o: parim.h memreq.h nifld.common nofld.common
+iagcntl.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+iaidef.o: parim.h nifld.common
+iainit.o: parim.h memreq.h nifld.common nofld.common grfixed.h
+iaintgg.o: parim.h nifld.common nofld.common grfixed.h ouspace.h
+iaintll.o: parim.h nifld.common nofld.common grfixed.h ouspace.h
+iaogdef.o: parim.h nofld.common
+iaoldef.o: parim.h nofld.common
+iarcntl.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+iareset.o: parim.h nofld.common
+iarmem.o: parim.h nifld.common nofld.common ouspace.h
+ibasini.o: parim.h nifld.common nofld.common intf.h
+igalloc.o: parim.h memreq.h
+igbess.o: jparams.h parim.h
+igdins.o: parim.h
+igdiwe.o: parim.h
+igglat.o: jparams.h parim.h
+iggmem.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+iggrid.o: parim.h
+igint.o: parim.h
+igintr.o: parim.h
+iglgrid.o: parim.h
+iglrev.o: parim.h
+iglsize.o: parim.h
+iglsm01.o: parim.h jparams.h
+iglsmb.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+iglsmd.o: parim.h
+iglsmr.o: parim.h
+iglsmst.o: parim.h jparams.h
+ignorm.o: parim.h
+igplsm.o: parim.h
+igpoleg.o: parim.h nifld.common
+igpolew.o: parim.h nifld.common
+igprec.o: parim.h nifld.common
+igscan.o: parim.h
+igsetup.o: parim.h nifld.common nofld.common
+igsize.o: parim.h
+igtog.o: parim.h nifld.common nofld.common
+igtogr.o: parim.h nifld.common nofld.common
+igtran.o: parim.h
+init_cm.o: parim.h nifld.common nofld.common grfixed.h current.h
+insane.o: parim.h nifld.common nofld.common grfixed.h
+intf.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intfa.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intfap.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intfau.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intfb.o: parim.h nifld.common nofld.common grfixed.h intf.h jparams.h
+intfbp.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intfbu.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intfc.o: parim.h nifld.common nofld.common grfixed.h
+intin.o: parim.h nifld.common nofld.common grfixed.h current.h
+intisl.o: parim.h intisl.h nifld.common nofld.common
+intlog.o: parim.h intlog.h
+intlogd.o: intlog.h
+intlogr.o: parim.h intlog.h
+intocn.o: parim.h
+intout.o: parim.h nifld.common nofld.common grfixed.h current.h
+intpnum.o: grprs.h
+intuvdh.o: parim.h intf.h nifld.common nofld.common
+intuvf.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intuvgh.o: parim.h nifld.common nofld.common grfixed.h intf.h intlog.h
+intuvgh.o: current.h
+intuvp.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intuvph.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intuvs.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intuvu.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intuvxh.o: parim.h nifld.common nofld.common intf.h current.h
+intvect.o: parim.h nifld.common nofld.common intf.h current.h
+intwave.o: parim.h nifld.common nofld.common intf.h grfixed.h
+irdiwe.o: parim.h
+irgmem.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+irgrid.o: parim.h nifld.common
+irgtog.o: parim.h nifld.common nofld.common
+irint.o: parim.h
+irintr.o: parim.h
+irlrev.o: parim.h
+irlsmb.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+irprec.o: parim.h nifld.common
+irscan.o: parim.h
+irsize.o: parim.h
+iscrsz.o: parim.h nifld.common nofld.common grfixed.h
+islproc.o: intisl.h parim.h nifld.common nofld.common
+issame.o: parim.h nifld.common nofld.common grfixed.h
+jacobi.o: jparams.h parim.h
+jacobif.o: jparams.h parim.h
+jagggp.o: jparams.h parim.h current.h nifld.common nofld.common grfixed.h
+jallgp.o: jparams.h parim.h nifld.common
+jallwn.o: jparams.h parim.h nifld.common
+jdebug.o: jparams.h jparam2.h
+jgetgg.o: parim.h nifld.common nofld.common grfixed.h intf.h rgauss_032.h
+jgetgg.o: rgauss_048.h rgauss_080.h rgauss_080_19940113.h rgauss_128.h
+jgetgg.o: rgauss_160.h rgauss_160_19931222.h rgauss_200.h rgauss_256.h
+jgetgg.o: rgauss_320.h rgauss_400.h rgauss_512.h rgauss_1024.h
+jgglat.o: jparams.h parim.h
+jintgg.o: jparams.h parim.h
+jintll.o: jparams.h parim.h
+jjset99.o: jparams.h parim.h
+jmakgg.o: jparams.h parim.h
+jmakgg3.o: jparams.h parim.h
+jmakll.o: jparams.h parim.h
+jmakll3.o: jparams.h parim.h
+jmemhan.o: jparams.h jparam2.h parim.h
+jmovgg.o: jparams.h parim.h
+jmovll.o: jparams.h parim.h
+jmvugg.o: jparams.h parim.h
+jmvull.o: jparams.h parim.h
+jnorsgg.o: parim.h
+jnumgg.o: jparams.h parim.h
+jnumggq.o: jparams.h parim.h
+jopngg.o: parim.h
+jopnggf.o: parim.h jparams.h jparam2.h
+jopnll.o: parim.h
+jopnllf.o: parim.h jparams.h jparam2.h
+jreadgg.o: jparams.h parim.h
+jreadll.o: jparams.h parim.h
+jsgggp.o: jparams.h parim.h current.h nifld.common nofld.common grfixed.h
+jsllgp.o: jparams.h parim.h nifld.common
+jspleg1.o: jparams.h
+jstrll.o: jparams.h parim.h nifld.common
+jstrwll.o: jparams.h parim.h nifld.common
+jsymgg.o: jparams.h parim.h nifld.common
+jsymll.o: jparams.h parim.h nifld.common
+juvpole.o: jparams.h parim.h current.h nofld.common grfixed.h
+jwindll.o: jparams.h parim.h nifld.common
+jwscal.o: jparams.h
+kintrg.o: intisl.h parim.h nifld.common nofld.common
+knfrom4.o: intisl.h parim.h nifld.common
+krg2rg.o: parim.h intisl.h nifld.common nofld.common
+krg2rgu.o: parim.h intisl.h nifld.common nofld.common
+lrekam.o: parim.h nofld.common
+lsmfld.o: parim.h nifld.common nofld.common
+makerl.o: parim.h nofld.common
+mkbitmp.o: parim.h jparams.h nofld.common
+mkframe.o: parim.h jparams.h
+newisl.o: intisl.h parim.h
+ngintrp.o: parim.h
+ngrotat.o: parim.h intf.h
+nmakgg.o: jparams.h parim.h
+nmakll.o: jparams.h parim.h
+oceanp.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+oceanp.o: intf.h
+pddefs.o: parim.h nifld.common
+ppallow.o: jparams.h parim.h
+precip.o: parim.h nifld.common nofld.common
+reset_c.o: parim.h nifld.common nofld.common grfixed.h current.h
+rphi.o: jparams.h
+set99.o: jparams.h
+sprotat.o: parim.h
+tatorgg.o: parim.h
+w251idx.o: parim.h
+waveidx.o: parim.h
+wavexxx.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+wv2di32.o: parim.h
+wv2didx.o: parim.h
+wv2dint.o: parim.h
+wv2dx32.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+wv2dxxx.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+wvqlidx.o: parim.h
+wvqlint.o: parim.h
+zprec.o: parim.h nifld.common
diff --git a/interpolation/Makefile.in b/interpolation/Makefile.in
new file mode 100755
index 0000000..bdffc3c
--- /dev/null
+++ b/interpolation/Makefile.in
@@ -0,0 +1,46 @@
+#
+# Makefile for libemos/interpolation
+#
+A64 = plat
+R64 = reals
+ARCH = arch
+LIB =depl
+CNAME = comp
+
+LIBRARY = ../lib$(LIB)$(R64).a
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+TARGETS = all clean
+#
+include sources.$(ARCH)
+#
+OBJECTS.F90 = $(SOURCES.F90:.F90=.o)
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.f = $(SOURCES.f:.f=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+VECTOR.o = $(VECTOR.F:.F=.o)
+NO_OPT.o = $(NO_OPT.F:.F=.o)
+OBJECTS = $(OBJECTS.F90) $(OBJECTS.F) $(OBJECTS.f) $(VECTOR.o) $(NO_OPT.o) $(OBJECTS.c)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+$(LIBRARY): $(OBJECTS)
+ $(AR) $(ARFLAGS) $@ $?
+ $(RANLIB) $@
+
+$(VECTOR.o): $(VECTOR.F)
+ $(FC) $(VECTFFLAGS) -c $<
+
+$(NO_OPT.o): $(NO_OPT.F)
+ $(FC) $(NOOPTFFLAGS) -c $<
+
+include make.dep
+
+clean:
+ \rm -f $(OBJECTS) *.f
diff --git a/interpolation/Makefile.shared b/interpolation/Makefile.shared
new file mode 100755
index 0000000..3f67d9e
--- /dev/null
+++ b/interpolation/Makefile.shared
@@ -0,0 +1,40 @@
+#
+# Makefile for libemos/interpolation
+#
+LIBRARY = ../lib$(LIB)$(R64).so
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+PROFILE=$(SHLIB)
+#
+TARGETS = all clean
+#
+include sources.$(ARCH)
+#
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.f = $(SOURCES.f:.f=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+VECTOR.o = $(VECTOR.F:.F=.o)
+NO_OPT.o = $(NO_OPT.F:.F=.o)
+OBJECTS = $(OBJECTS.F) $(OBJECTS.f) $(VECTOR.o) $(NO_OPT.o) $(OBJECTS.c)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+$(LIBRARY): $(OBJECTS) $(EXTRAOBJ)
+ $(LD) $(DYNLINKFLAGS) $? -o $@
+
+$(VECTOR.o): $(VECTOR.F)
+ $(FC) $(VECTFFLAGS) -c $<
+
+$(NO_OPT.o): $(NO_OPT.F)
+ $(FC) $(VECTFFLAGS) -c $<
+
+include make.dep
+
+clean:
+ \rm -f $(OBJECTS) *.f
diff --git a/interpolation/areachk.F b/interpolation/areachk.F
new file mode 100755
index 0000000..c178df0
--- /dev/null
+++ b/interpolation/areachk.F
@@ -0,0 +1,466 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION AREACHK( EW, NS, NORTH, WEST, SOUTH, EAST )
+C
+C---->
+C**** AREACHK
+C
+C Purpose
+C -------
+C
+C Fixup input/output field area definitions according to grid
+C specification.
+C
+C
+C Interface
+C ---------
+C
+C IRET = AREACHK( EW, NS, NORTH, WEST, SOUTH, EAST )
+C
+C Input
+C -----
+C
+C For latitude/longitude grids:
+C EW = East-west grid interval (degrees)
+C NS = North-south grid interval (degrees)
+C
+C For gaussian grids:
+C EW = gaussian grid number
+C NS = 0
+C
+C NORTH = North latitude (degrees)
+C WEST = West longitude (degrees)
+C SOUTH = South latitude (degrees)
+C EAST = East longitude (degrees)
+C
+C For spherical harmonics:
+C EW = 0
+C NS = 0
+C NORTH = 0
+C WEST = 0
+C SOUTH = 0
+C EAST = 0
+C
+C
+C Output
+C ------
+C
+C NORTH = North latitude, adjusted if necessary (degrees)
+C WEST = West longitude, adjusted if necessary (degrees)
+C SOUTH = South latitude, adjusted if necessary (degrees)
+C EAST = East longitude, adjusted if necessary (degrees)
+C
+C
+C Method
+C ------
+C
+C If default (0/0/0/0) selected for input, input area is set
+C - to global for lat/long grid
+C - to global for gaussian grid
+C
+C Output area is adjusted to fit the given grid by expanding
+C the area if necessary.
+C
+C
+C Externals
+C ---------
+C
+C DSSAREA - Fixup input/output field area (dissemination style).
+C JGETGG - Reads the definition of a gaussian grid.
+C JNORSGG - Finds the lat row in a gauss grid N or S of given lat
+C INTLOG - Logs error messages.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Apr 1996
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 19200 )
+ REAL RRMULT
+#if (defined hp) && (!defined INTEGER_8)
+ INTEGER NP90, NP360, NFACTOR
+ PARAMETER ( NFACTOR = 10 )
+#else
+ INTEGER*8 NP90, NP360, NFACTOR
+ PARAMETER ( NFACTOR = 1000 )
+#endif
+ PARAMETER ( NP90 = JP90*NFACTOR )
+ PARAMETER ( NP360 = JP360*NFACTOR )
+ PARAMETER ( RRMULT = (PPMULT*NFACTOR) )
+C
+C Function arguments
+C
+ REAL EW, NS, NORTH, WEST, SOUTH, EAST
+C
+C Local variables
+C
+#if (defined hp) && (!defined INTEGER_8)
+ INTEGER INORTH, IWEST, ISOUTH, IEAST, IEW, INS
+ INTEGER TNORTH, TWEST, TSOUTH, TEAST
+ INTEGER NWEST, NEAST
+#else
+ INTEGER*8 INORTH, IWEST, ISOUTH, IEAST, IEW, INS
+ INTEGER*8 TNORTH, TWEST, TSOUTH, TEAST
+ INTEGER*8 NWEST, NEAST
+#endif
+ CHARACTER*12 YFLAG
+ INTEGER NGAUSS, NOLD, IRET, KPTS
+ DIMENSION KPTS(JPGTRUNC*2)
+ DATA NOLD /0/
+ REAL RNORTH, RSOUTH
+ LOGICAL LDEFIN, LGAUSS, LSPHERE, LSUBAR, LINSIDE
+ REAL RGAUSS
+ DIMENSION RGAUSS(JPGTRUNC*2)
+ REAL*8 DEW, DNS, DNORTH, DWEST, DSOUTH, DEAST
+C
+C Externals
+C
+ INTEGER JNORSGG, DSSAREA
+C
+ SAVE NOLD, RGAUSS
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+ AREACHK = 0
+ LINSIDE=.FALSE.
+ LGAUSS = ( NS.EQ.0.0 )
+ LSPHERE = ( (EW.EQ.0.0).AND.(NS.EQ.0.0) )
+
+C Force grid points inside required area
+ CALL GETENV('MARS_INTERPOLATION_INWARDS', YFLAG)
+ IF( YFLAG(1:1).EQ.'1' ) LINSIDE = .TRUE.
+
+C Don't adjust area if rotation specified
+C
+ IF( LNOROTA ) GOTO 900
+C
+C If dissemination style areas required ...
+C
+ IF( (LNOSTYLE.AND.(NOSTYLE.EQ.JPSDISM)).OR.LINSIDE ) THEN
+ AREACHK = DSSAREA( EW, NS, NORTH, WEST, SOUTH, EAST )
+ GOTO 900
+ ENDIF
+C
+C If it's gaussian, pick up the gaussian grid definitions unless
+C they have already been retrieved.
+C
+ IF( LGAUSS.AND..NOT.LSPHERE ) THEN
+ NGAUSS = NINT( EW )
+#if (defined hp) && (!defined INTEGER_8)
+ IF( NGAUSS.GE.256 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'AREACHK: unsafe to use 32-bit HP version for gaussian = ',
+ X NGAUSS)
+ AREACHK = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+#endif
+ IF( NGAUSS.GT.JPGTRUNC ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'AREACHK: Gaussian grid number ', NGAUSS)
+ CALL INTLOG(JP_ERROR,
+ X 'AREACHK: exceeds current expected maximum ', JPGTRUNC)
+ AREACHK = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+ IF( NGAUSS.NE.NOLD ) THEN
+ NOLD = NGAUSS
+ CALL JGETGG( NOLD, 'F', RGAUSS, KPTS, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'AREACHK: Failed to pick up gaussian ', JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'AREACHK: definitions for resolution = ', NOLD)
+ AREACHK = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Fixup area if default (0/0/0/0).
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+
+
+C Sinisa added if input area is not global
+C because of stagered grids
+ LSUBAR = ( (NIAREA(1).NE.0).AND.(NIAREA(2).NE.0).AND.
+ X (NIAREA(3).NE.0).AND.(NIAREA(4).NE.0) )
+
+ LSTAGGL = .FALSE.
+ IF( LSUBAR ) THEN
+ IF(IABS(JP360 - NIAREA(4) - NIAREA(2)).LT.1000) THEN
+ LSTAGGL = .TRUE.
+ ENDIF
+ ENDIF
+
+ LDEFIN = ( (NORTH.EQ.0).AND.(WEST.EQ.0).AND.
+ X (SOUTH.EQ.0).AND.(EAST.EQ.0) )
+C
+ IF( LDEFIN ) THEN
+C
+ IF( .NOT.LGAUSS ) THEN
+C
+C Regular lat/long grid ..
+C
+ NORTH = 90.0
+ WEST = 0
+ SOUTH = -NORTH
+ EAST = 360.0 - EW
+C
+ ELSE IF( LSPHERE ) THEN
+C
+C Spherical harmonics
+C
+ NORTH = 90.0
+ WEST = 0
+ SOUTH = -90.0
+ EAST = 360.0
+C
+C
+ ELSE
+C
+C Gaussian grid ..
+C
+ INORTH = JNORSGG( 90.0, RGAUSS, NGAUSS, 0)
+ NORTH = RGAUSS(INORTH)
+ WEST = 0
+ ISOUTH = JNORSGG( -90.0, RGAUSS, NGAUSS, 1)
+ SOUTH = -NORTH
+ EAST = 360.0 - 90.0/FLOAT(NGAUSS)
+ ENDIF
+ ENDIF
+C
+ IF( LSPHERE ) GOTO 900
+C
+C Don't fixup area for ocean products
+C
+CTim IF( NILOCAL.EQ.4 ) GOTO 900
+C
+C -----------------------------------------------------------------|
+C* Section 3. Fixup west-east area to correspond to the grid.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( .NOT.LGAUSS ) THEN
+C
+C Regular lat/long grid only ..
+C
+ DEW = EW
+ IEW = DNINT( DBLE(DEW * RRMULT) )
+C
+ ELSE
+C
+C Gaussian grid ..
+C
+ IEW = DNINT( (DBLE(NP90) / DBLE(NGAUSS)) )
+C
+ ENDIF
+C
+C Standardise range so that WEST and EAST are >= 0,
+C and EAST > WEST.
+C
+ IF( WEST.LT.0.0 ) THEN
+ WEST = WEST + 360.0
+ EAST = EAST + 360.0
+ ENDIF
+ IF( EAST.GE.WEST ) THEN
+ DEAST = EAST
+ ELSE
+ DEAST = EAST + 360.0
+ ENDIF
+C
+ DWEST = WEST
+ IEAST = DNINT( DEAST * DBLE(RRMULT) + 0.1 )
+ TEAST = IEAST
+ IWEST = DINT( DWEST * DBLE(RRMULT) + 0.1 )
+ TWEST = IWEST
+C
+C Round east boundary to nearest gridpoint eastwards,
+C and west boundary to nearest gridpoint westwards.
+C
+ NEAST = (IEAST+IEW-1) / IEW
+ IEAST = NEAST * IEW
+
+
+ IF(.NOT.LSTAGGL.AND.LSUBAR.AND.IEAST.GT.TEAST) THEN
+ IEAST = IEAST - IEW
+ ENDIF
+
+
+ NWEST = IWEST / IEW
+ IWEST = NWEST * IEW
+
+c Sinisa to add 1 point if we have stagered global field
+ IF(.NOT.LSTAGGL.AND.LSUBAR.AND.IWEST.LT.TWEST) THEN
+ IWEST = IWEST + IEW
+ ENDIF
+C
+C Try to catch special case: global west-east with wrap-around.
+C
+ IF( (IEAST-IWEST).GE.NP360 ) THEN
+ IF( LGAUSS) THEN
+ IEAST = IWEST + (4*NGAUSS-1)*IEW
+ ELSE
+ IEAST = IWEST + NP360 - IEW
+ ENDIF
+ ENDIF
+C
+C Ensure East and West still in range (0,360)
+C
+ IF( IEAST.GT.NP360 ) THEN
+ IEAST = IEAST - NP360
+ IWEST = IWEST - NP360
+ ENDIF
+ IF( IWEST.LT.-NP360 ) THEN
+ IEAST = IEAST + NP360
+ IWEST = IWEST + NP360
+ ENDIF
+C
+C Ensure East-West spread is not greater than 360
+C
+ IF( (IEAST-IWEST).GT.NP360 ) THEN
+ IF( LGAUSS) THEN
+ IEAST = IWEST + (4*NGAUSS-1)*IEW
+ ELSE
+ IEAST = IWEST + NP360 - IEW
+ ENDIF
+ ENDIF
+C
+C Apply adjustment when east and west boundaries are the same
+C longitude (0/360) to give a global grid.
+C
+ IF( ( (IWEST.EQ.-NP360).AND.(IEAST.EQ.0) ).OR.
+ X ( (IWEST.EQ.0) .AND.(IEAST.EQ.NP360) ).OR.
+ X ( (IWEST.EQ.NP360) .AND.(IEAST.EQ.NP360) ) ) THEN
+ IWEST = 0
+ IF( LGAUSS) THEN
+ IEAST = (4*NGAUSS-1)*IEW
+ ELSE
+ IEAST = NP360 - IEW
+ ENDIF
+ ENDIF
+C
+ WEST = DBLE(IWEST) / RRMULT
+ EAST = DBLE(IEAST) / RRMULT
+C
+ IF( (EAST.LT.WEST).OR.(EAST.GT.360.0) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'AREACHK: Faulty longitude limits', JPQUIET)
+ CALL INTLOGR(JP_ERROR,'AREACHK: East = ', EAST)
+ CALL INTLOGR(JP_ERROR,'AREACHK: West = ', WEST)
+ AREACHK = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4. Fixup north-south area to correspond to the grid.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+c for ocean fields, adjust ew but not ns boundaries
+ IF( NILOCAL.EQ.4 ) GOTO 900
+C
+ IF( .NOT.LGAUSS ) THEN
+C
+C Regular lat/long grid only ..
+C
+C Round north boundary to nearest gridpoint northwards.
+C
+ DNS = NS
+ INS = DNINT( DBLE(DNS * RRMULT) )
+ DNORTH = NORTH
+ INORTH = DNINT( DBLE(DNORTH * RRMULT) )
+ TNORTH = INORTH
+ IF( INORTH.GE.0 ) THEN
+ INORTH = (INORTH+INS-1) / INS
+ ELSE
+ INORTH = INORTH / INS
+ ENDIF
+ INORTH = INORTH * INS
+
+ IF( INORTH.GT.NP90 ) INORTH = NP90
+ IF( INORTH.LT.-NP90 ) INORTH = -NP90
+
+ IF(.NOT.LSTAGGL.AND.LSUBAR.AND.INORTH.GT.TNORTH) THEN
+ INORTH = INORTH - INS
+ ENDIF
+
+ NORTH = DBLE(INORTH) / RRMULT
+C
+C Round south boundary to nearest gridpoint southwards.
+C
+ DSOUTH = SOUTH
+ ISOUTH = DNINT( DBLE(DSOUTH * RRMULT) )
+ TSOUTH = ISOUTH
+ IF( ISOUTH.GE.0 ) THEN
+ ISOUTH = ISOUTH / INS
+ ELSE
+ ISOUTH = (ISOUTH-INS+1) / INS
+ ENDIF
+ ISOUTH = ISOUTH * INS
+
+ IF( ISOUTH.GT.NP90 ) ISOUTH = NP90
+ IF( ISOUTH.LT.-NP90 ) ISOUTH = -NP90
+
+ IF(.NOT.LSTAGGL.AND.LSUBAR.AND.ISOUTH.LT.TSOUTH) THEN
+ ISOUTH = ISOUTH + INS
+ ENDIF
+
+
+ SOUTH = DBLE(ISOUTH) / RRMULT
+C
+ ELSE
+C
+C Gaussian grid ..
+C
+C Round north boundary to nearest gridpoint northwards.
+C
+ RNORTH = NORTH
+ INORTH = JNORSGG( RNORTH, RGAUSS, NGAUSS, 1)
+ NORTH = RGAUSS(INORTH)
+C
+C Round south boundary to nearest gridpoint southwards.
+C
+ RSOUTH = SOUTH
+ ISOUTH = JNORSGG( RSOUTH, RGAUSS, NGAUSS, 0)
+ SOUTH = RGAUSS(ISOUTH)
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/auresol.F b/interpolation/auresol.F
new file mode 100755
index 0000000..b4e3999
--- /dev/null
+++ b/interpolation/auresol.F
@@ -0,0 +1,167 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION AURESOL(NS,EW)
+C
+C---->
+C**** AURESOL
+C
+C Purpose
+C -------
+C
+C Returns the default truncation for a given
+C latitude--longitude grid resolution.
+C
+C
+C Interface
+C ---------
+C
+C KTRUNC = AURESOL(NS,EW)
+C
+C Input
+C -----
+C
+C NS = north-south grid increment in degrees
+C EW = east-west grid increment in degrees
+C
+C Output
+C ------
+C
+C KTRUNC = Triangular truncation (e.g. 106 for T106)
+C
+C
+C Method
+C ------
+C
+C Grid increment Truncation
+C -------------- ----------
+C
+C [2.5 and greater T63
+C
+C [1.5 to 2.5[ T106
+C
+C [0.6 to 1.5[ T213
+C
+C [0.4 to 0.6[ T319
+C
+C [0.3 to 0.4[ T511
+C
+C [0.15 to 0.3[ T799
+C
+C [0 to 0.15[ T1023
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Mar 1998
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C Modifications
+C -------------
+C
+C S.Curic ECMWF April 2005
+C Add T799 and T1023
+C
+C ------------------------------------------------------------------
+C----<
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Function arguments
+C
+ REAL NS, EW
+C
+C Local variables
+C
+C Function statement(s)
+C
+ REAL STEP
+C
+ STEP = MIN(ABS(NS),ABS(EW))
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+C 2.5 and greater -> T63
+C
+ IF( STEP.GE.2.5 ) THEN
+ AURESOL = 63
+ GOTO 900
+ ENDIF
+C
+C 1.5 to 2.5 -> T106
+C
+ IF( STEP.GE.1.5 ) THEN
+ AURESOL = 106
+ GOTO 900
+ ENDIF
+C
+C 0.6 to 1.5 -> T213
+C
+ IF( STEP.GE.0.6 ) THEN
+ AURESOL = 213
+ GOTO 900
+ ENDIF
+C
+C 0.4 to 0.6 -> T319
+C
+ IF( STEP.GE.0.4 ) THEN
+ AURESOL = 319
+ GOTO 900
+ ENDIF
+C
+C 0.3 to 0.4 -> T511
+C
+ IF( STEP.GE.0.3 ) THEN
+ AURESOL = 511
+ GOTO 900
+ ENDIF
+C
+C 0.15 to 0.3 -> T799
+C
+ IF( STEP.GE.0.15 ) THEN
+ AURESOL = 799
+ GOTO 900
+ ENDIF
+
+C
+C 0.09 to 0.15 -> T1279
+C
+ IF( STEP.GE.0.09 ) THEN
+ AURESOL = 1279
+ GOTO 900
+ ENDIF
+C
+C less than 0.09 -> T2047
+C
+ AURESOL = 2047
+
+C
+ 900 CONTINUE
+C
+ END
diff --git a/interpolation/bitmap.h b/interpolation/bitmap.h
new file mode 100755
index 0000000..63b203e
--- /dev/null
+++ b/interpolation/bitmap.h
@@ -0,0 +1,39 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef BITMAP_H
+#define BITMAP_H
+
+#ifdef INTEGER_IS_LONG
+#define fortint long
+#else
+#define fortint int
+#endif
+
+#ifdef FORTRAN_NO_UNDERSCORE
+#define MAKEMAP makemap
+#define SHOWMAP showmap
+#define GMAPBIT gmapbit
+#else
+#define MAKEMAP makemap_
+#define SHOWMAP showmap_
+#define GMAPBIT gmapbit_
+#endif
+
+int MAKEMAP(char * , int * , int * , char ** , int );
+void SHOWMAP(char ** , int * , int * );
+int GMAPBIT( char ** , int * , int * , int * );
+int findNumber(char * , int , int , int * , char );
+char findDelimiter(char * , int , int );
+int findCharacter(char * , int , int , char );
+void setBit(char * , int , int , int , int );
+void copyRow(char * , int , int , int , int );
+
+#endif /* End of BITMAP_H */
diff --git a/interpolation/chequal.F b/interpolation/chequal.F
new file mode 100755
index 0000000..2e8f5b6
--- /dev/null
+++ b/interpolation/chequal.F
@@ -0,0 +1,86 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ LOGICAL FUNCTION CHEQUAL( HIN, KFIRST, KLAST, HCOMP)
+C
+C---->
+C**** CHEQUAL
+C
+C Purpose
+C -------
+C
+C Compare two ASCII character strings without regard to case.
+C
+C
+C Interface
+C ---------
+C
+C Input
+C -----
+C
+C HIN - First string
+C KFIRST- position of first character in string for comparison
+C KLAST - position of last character in string for comparison
+C HCOMP - Second string
+C
+C
+C Method
+C ------
+C
+C Compare values as uppercase letters.
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 1995.
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ CHARACTER*(*) HIN, HCOMP
+ INTEGER KFIRST, KLAST, LOOP, ITEMP1, ITEMP2, ITEMPA
+#ifdef rs6000
+
+ ITEMPA = ICHAR( 'a' )
+#else
+ DATA ITEMPA/97/
+C |
+C v
+C ITEMPA = ICHAR( 'a' )
+#endif
+
+ CHEQUAL = .FALSE.
+
+ IF( KFIRST .GT. KLAST ) RETURN
+
+ DO 110 LOOP = KFIRST, KLAST
+ ITEMP1 = ICHAR( HIN(LOOP:LOOP) )
+ IF ( ITEMP1 .LT. ITEMPA ) ITEMP1 = ITEMP1 + 32
+
+ ITEMP2 = ICHAR( HCOMP(LOOP:LOOP) )
+ IF ( ITEMP2 .LT. ITEMPA) ITEMP2 = ITEMP2 + 32
+
+ IF ( ITEMP1 .NE. ITEMP2 ) RETURN
+ 110 CONTINUE
+
+ CHEQUAL = .TRUE.
+
+ RETURN
+ END
diff --git a/interpolation/chkout.F b/interpolation/chkout.F
new file mode 100755
index 0000000..7d57721
--- /dev/null
+++ b/interpolation/chkout.F
@@ -0,0 +1,35 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION CHKOUT()
+C
+C---->
+C*****CHKOUT*
+C
+C PURPOSE
+C -------
+C check if intout has been called
+C LINTOUT - Flag to say whether or not intout has been called
+C
+C Function argument
+C
+
+#include "parim.h"
+#include "nofld.common"
+
+ CHKOUT = 0
+ IF(LINTOUT) THEN
+ CHKOUT = 1
+ CALL INTLOG(JP_DEBUG,'CHKOUT: INTOUT has been called'
+ X ,JPQUIET)
+ ENDIF
+C
+ RETURN
+ END
diff --git a/interpolation/chkprec.F b/interpolation/chkprec.F
new file mode 100755
index 0000000..dd3d31b
--- /dev/null
+++ b/interpolation/chkprec.F
@@ -0,0 +1,102 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE CHKPREC()
+C
+C---->
+C**** CHKPREC
+C
+C Purpose
+C -------
+C
+C Determines whether or not the current field is to be
+C considered for 'precipitation' treatment.
+C
+C
+C Interface
+C ---------
+C
+C CALL CHKPREC()
+C
+C Input
+C -----
+C
+C None
+C
+C
+C Output
+C ------
+C
+C Sets the precipitation threshold if give by environment variable
+C PRECIPITATION_THRESHOLD. Otherwise gives it a default value.
+C
+C
+C Method
+C ------
+C
+C See below.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Logs messages
+C
+C Uses common block nifld.common
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF December 2003
+C
+C----<
+C
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+C
+C Local variables
+C
+ CHARACTER*20 PTHRESH
+ INTEGER IBLANK
+ LOGICAL LFIRST
+ DATA LFIRST/.TRUE./
+ SAVE LFIRST
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IF( LFIRST ) THEN
+ LFIRST = .FALSE.
+ CALL GETENV('PRECIPITATION_THRESHOLD',PTHRESH)
+ IBLANK = INDEX(PTHRESH, ' ')
+ IF( IBLANK.GT.1 ) THEN
+ READ(PTHRESH,'(F15.8)') ZPRECIP
+ ELSE
+ ZPRECIP = 0.00005
+ ENDIF
+C
+ CALL INTLOGR(JP_DEBUG,
+ X 'CHKPREC: PRECIPITATION_THRESHOLD = ',ZPRECIP)
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/clear_c.F b/interpolation/clear_c.F
new file mode 100755
index 0000000..fb19f4d
--- /dev/null
+++ b/interpolation/clear_c.F
@@ -0,0 +1,187 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+#define INT_MISSING -2147483647
+
+ SUBROUTINE CLEAR_C( )
+C
+C---->
+C**** CLEAR_C
+C
+C Purpose
+C -------
+C
+C Sets start values for parameters in common block.
+C
+C
+C Interface
+C ---------
+C
+C CALL CLEAR_C()
+C
+C
+C Method
+C ------
+C
+C Hard coded defaults.
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF August 1994.
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "current.h"
+C
+C Local variables
+C
+ INTEGER IRET, LOOP
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Set default processing flag settings.
+C
+ LCHANGE = .TRUE.
+ LSMCHNG = .TRUE.
+ LSM = .TRUE.
+ LPREC = .FALSE.
+ LWIND = .FALSE.
+C
+C Set default area indexes.
+C
+ NINS = 0
+ NIWE = 0
+ NO1NS = 0
+ NO1WE = 0
+ NONS = 0
+ NOWE = 0
+C
+C Defaults for output GRIB record ..
+C .. ECMWF local code table 128
+C .. level 500 hPa
+C
+ NOPARAM = 0
+ NOTABLE = 128
+ NOLEVT = 100
+ NOLEVEL = 500
+ NOHFUNC = 'A'
+C
+C Turn off all flags indicating that user has given a value.
+C
+ LSMPARSET = .FALSE.
+ LSMSET = .FALSE.
+ LPRECSET = .FALSE.
+ LWINDSET = .FALSE.
+ LNIGAUS = .FALSE.
+ LNGSPEC = .FALSE.
+ LIGIVEL = .FALSE.
+ LIGIVEP = .FALSE.
+ LOGIVEL = .FALSE.
+ LOGIVEP = .FALSE.
+ LNOAREA = .FALSE.
+ LNORESO = .FALSE.
+ LNOGAUS = .FALSE.
+ LNOACC = .FALSE.
+ LNOREPR = .FALSE.
+ LNOTABL = .FALSE.
+ LNOPARA = .FALSE.
+ LNOLEVL = .FALSE.
+ LNOLEVT = .FALSE.
+ LNOGRID = .FALSE.
+ LNOFRAME = .FALSE.
+ LNOSTYLE = .FALSE.
+ LARESOL = .FALSE.
+ LINTOUT = .FALSE.
+ LIMISSV = .FALSE.
+cs double interpolation
+ LDOUBLE = .FALSE.
+C
+ RMISSGV = REAL(INT_MISSING)
+C
+C Clear input and output gaussian grid definitions
+C
+ NIGAUSS = 0
+ NOGAUSS = 0
+ DO 110 LOOP = 1, JPLAT
+ RIGAUSS(LOOP) = 0.0
+ MILLEN(LOOP) = 0
+ 110 CONTINUE
+C
+ DO 120 LOOP = 1, JPLAT
+ ROGAUSS(LOOP) = 0.0
+ NOLPTS(LOOP) = 0
+ 120 CONTINUE
+C
+C Clear information about gaussian field definitions
+C
+ NGSPEC = 0
+ NIGAUSO = 0
+ NOGAUSO = 0
+ HIGAUST = 'X'
+ HOGAUST = 'X'
+C
+C Clear rotation angle values.
+C
+ NOROTA(1) = 0
+ NOROTA(2) = 0
+ LNOROTA = .FALSE.
+ LO12PT = .TRUE.
+ LMETHOD = .FALSE.
+ LNNLSM = .FALSE.
+C
+C Clear style and frame values
+C
+ NOFRAME = 0
+ NOSTYLE = JPSMARS
+C
+C Clear flags showing how to deal with legendre coefficients
+C
+ LFILEIO = .FALSE.
+ LMEMORY = .FALSE.
+ LSHARED = .FALSE.
+ LON_FLY = .FALSE.
+ LMAPPED = .FALSE.
+ LIFIRST = .TRUE.
+C
+C Clear fields for ISLSCP processing
+C
+ IF( LNIISCL ) THEN
+ CALL JFREE(NIPOGRB)
+ CALL JFREE(NIPNGRB)
+ ENDIF
+ LNIISCL = .FALSE.
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/consint.F90 b/interpolation/consint.F90
new file mode 100755
index 0000000..2ad20b0
--- /dev/null
+++ b/interpolation/consint.F90
@@ -0,0 +1,424 @@
+SUBROUTINE CONSINT (KLAT_IN, KLON_IN, PLAT_IN, KIN,&
+ & KLAT_OUT,KLON_OUT,PLAT_OUT,KOUT,&
+ & PFLD_IN, PFLD_OUT, &
+ & LDPAR)
+
+! Purpose.
+! --------
+! Conserving bicubic interpolation of grid field from model
+! resolution to grid defined by input parameter. Assumes the
+! whole field is in memory.
+
+! Explicit arguments:
+! -------------------
+
+! Input:
+! KLAT_IN - number of latitude rows of the input grid
+! KLON_IN - number of longitudes for each row of the input grid
+! PLAT_IN - latitude (degrees) of each row of the input grid
+! KIN - size of input array
+! KLAT_OUT - number of latitude rows of the output grid
+! KLON_OUT - number of longitudes for each row of the output grid
+! PLAT_OUT - latitude (degrees) of each row of the output grid
+! KOUT - size of output array
+! PFLD_IN - array of grid values at input resolution
+
+! Output:
+! PFLD_OUT - array of interpolated values
+
+! Optional:
+! LDPAR - parity for extra-polar calculations
+! .TRUE. for scalar fields
+! .FASE. for vector fields
+
+! Author.
+! -------
+! E. Holm - modification of GRID_BICUBIC by Y.Tremolet
+
+! Modifications.
+! --------------
+! Original: 27/05/04
+! 20050507 Elias Holm: Introduce order and limiter in call and
+! generalize code for up to quintic interpolation
+! Y.Tremolet 26-Jan-2005 Added optional arguments
+! 20080204 Elias Holm: Surface pressure on input/output and
+! simplified
+! 20081015 Elias Holm: Simplify and reorder calculations for speed
+! 20101230 Elias Holm: Simplified version without pressure thickness
+! weighting
+! 20110125 Elias Holm: Latitude inputs in degrees
+! ------------------------------------------------------------------
+
+IMPLICIT NONE
+
+INTEGER,INTENT(IN) :: KLAT_IN
+INTEGER,INTENT(IN) :: KLON_IN(KLAT_IN)
+REAL ,INTENT(IN) :: PLAT_IN(KLAT_IN)
+INTEGER,INTENT(IN) :: KIN
+INTEGER,INTENT(IN) :: KLAT_OUT
+INTEGER,INTENT(IN) :: KLON_OUT(KLAT_OUT)
+REAL ,INTENT(IN) :: PLAT_OUT(KLAT_OUT)
+INTEGER,INTENT(IN) :: KOUT
+REAL ,INTENT(IN) :: PFLD_IN(KIN)
+REAL ,INTENT(OUT) :: PFLD_OUT(KOUT)
+LOGICAL, OPTIONAL, INTENT(IN) :: LDPAR
+
+INTEGER :: IND_IN (KLAT_IN)
+INTEGER :: ILON_IN (-2:KLAT_IN+3)
+REAL :: ZLAT_IN (-2:KLAT_IN+3)
+REAL :: ZLON_IN (-2:KLAT_IN+3)
+REAL :: ZDLAT_IN(-2:KLAT_IN+3), ZDLATI_IN(-2:KLAT_IN+3)
+REAL :: ZDLON_IN(-2:KLAT_IN+3), ZDLONI_IN(-2:KLAT_IN+3)
+REAL :: ZHLAT_IN(-2:KLAT_IN+3)
+REAL :: ZHLON_IN(-2:KLAT_IN+3)
+REAL :: ZDHLAT_IN(-2:KLAT_IN+3), ZDHLATI_IN(-2:KLAT_IN+3)
+REAL :: ZG_IN (-2:KLAT_IN+3)
+INTEGER :: ILAT_IO (0:KLAT_OUT)
+REAL :: ZLAT_OUT (0:KLAT_OUT), ZLON_OUT (1:KLAT_OUT)
+REAL :: ZDLAT_OUT(1:KLAT_OUT), ZDLON_OUT(1:KLAT_OUT)
+REAL :: ZHLAT_OUT(1:KLAT_OUT), ZHLON_OUT(1:KLAT_OUT)
+REAL :: ZG_OUT (1:KLAT_OUT)
+
+INTEGER :: J, JLAT, JLON, JNUM, JINX, JINY, JINYD, JOUTY,IRET
+INTEGER :: JXMAX_IN, JXMAX_OUT, JYMAX_OUT, IBL
+INTEGER :: JBL, IBL_OUT, JINYSTA, JINYEND, IBLATSTA_OUT(1:KLAT_OUT)
+INTEGER :: IBLATEND_OUT(1:KLAT_OUT), IBLON_OUT(1:KLAT_OUT)
+REAL :: ZSUM, ZOUT, ZX, ZY, ZY2, ZDHI
+REAL :: ZC(0:3), ZDC, ZDL, ZDLL, ZDR, ZDRR, ZCC2, ZCC3
+REAL :: ZMINMOD, ZFRAC, ZCURVLIM, ZLIML, ZLIMR, ZLIM
+REAL :: ZPARITY, ZPRIMADD
+REAL, ALLOCATABLE :: ZPRIMX(:,:), ZPRIMY(:,:), ZPRIM(:,:), ZFLD_IN(:)
+REAL, ALLOCATABLE :: ZDIFX(:,:), ZDIFY(:,:), ZOUTPRE(:)
+
+REAL :: RPI, RD2R
+
+! ------------------------------------------------------------------
+ZMINMOD(ZDC)=(0.5+SIGN(0.5,ZDC))*MIN(1.,ABS(ZDC))
+ZFRAC(ZDC,ZDR)=ZDC/SIGN(ABS(ZDR)+1.E-30,ZDR)
+ZCURVLIM(ZDL,ZDR)=SIGN(MIN(ABS(ZDL),ABS(ZDR)/3.),ZDL)
+
+
+! * 0. CONSTANTS AND FUNCTIONS
+
+RPI=ACOS(-1.)
+RD2R=RPI/180.
+ZCC2=1.0/1536.
+ZCC3=1.0/15360.
+
+ZPARITY=1.0
+IF (PRESENT(LDPAR)) THEN
+ IF (.NOT.LDPAR) ZPARITY=-1.0
+ENDIF
+
+ALLOCATE(ZFLD_IN(KIN))
+DO J=1,KIN
+ ZFLD_IN(J)=PFLD_IN(J)
+ENDDO
+
+! * 1. INPUT GRID AND FIELD
+
+!* 1.1 Geometry of input grid
+! Assuming lat_(j+.5) = 0.5*(lat_(j) + lat_(j+1))
+
+ZLAT_IN(0) = SIGN(RPI/2.,RD2R*PLAT_IN(1))
+ZLAT_IN(KLAT_IN)= SIGN(RPI/2.,RD2R*PLAT_IN(KLAT_IN))
+JNUM=1
+JXMAX_IN=0
+DO JLAT=1,KLAT_IN
+ IF (JLAT<KLAT_IN) ZLAT_IN(JLAT)=RD2R*0.5*(PLAT_IN(JLAT)+PLAT_IN(JLAT+1))
+ ZDLAT_IN(JLAT)=ABS(ZLAT_IN(JLAT-1)-ZLAT_IN(JLAT))
+ ILON_IN(JLAT)=KLON_IN(JLAT)
+ ZDLON_IN(JLAT)=2.*RPI/ILON_IN(JLAT)
+ IND_IN(JLAT)=JNUM
+ JNUM=JNUM+ILON_IN(JLAT)
+ JXMAX_IN=MAX(JXMAX_IN,ILON_IN(JLAT))
+! Starting longitude (must be less or equal to zero)
+ ZLON_IN(JLAT)=-ZDLON_IN(JLAT)/2.
+! Scale factors
+ ZHLON_IN(JLAT) = (SIN(ZLAT_IN(JLAT-1))-SIN(ZLAT_IN(JLAT)))/ZDLAT_IN(JLAT)
+ ZHLAT_IN(JLAT) = 1.
+ ZG_IN(JLAT)=ZHLON_IN(JLAT)*ZHLAT_IN(JLAT)*ZDLON_IN(JLAT)*ZDLAT_IN(JLAT)
+ENDDO
+
+! 1.1.1 Extension over poles
+! Starting longitude for extension over the poles for even ILON_IN is 0.,
+! and for odd ILON_IN shift by half a gridcell to -RPI/ILON_IN.
+
+DO JINY = 1, 3
+ ILON_IN (1-JINY) = ILON_IN (JINY)
+ ZDLAT_IN(1-JINY) = ZDLAT_IN(JINY)
+ ZDLON_IN(1-JINY) = ZDLON_IN(JINY)
+ ZHLAT_IN(1-JINY) = ZHLAT_IN(JINY)
+ ZHLON_IN(1-JINY) = ZHLON_IN(JINY)
+ ZG_IN (1-JINY) = ZG_IN (JINY)
+ ZLAT_IN (1-JINY) = 2.*ZLAT_IN(0)-ZLAT_IN(JINY-1)
+ ZLON_IN(1-JINY) = ZLON_IN(JINY)&
+ &+MOD(ILON_IN(1-JINY),2)*RPI/ILON_IN(1-JINY)
+ ILON_IN (KLAT_IN+JINY) = ILON_IN (KLAT_IN+1-JINY)
+ ZDLAT_IN(KLAT_IN+JINY) = ZDLAT_IN(KLAT_IN+1-JINY)
+ ZDLON_IN(KLAT_IN+JINY) = ZDLON_IN(KLAT_IN+1-JINY)
+ ZHLAT_IN(KLAT_IN+JINY) = ZHLAT_IN(KLAT_IN+1-JINY)
+ ZHLON_IN(KLAT_IN+JINY) = ZHLON_IN(KLAT_IN+1-JINY)
+ ZG_IN (KLAT_IN+JINY) = ZG_IN (KLAT_IN+1-JINY)
+ ZLAT_IN (KLAT_IN+JINY) = 2.*ZLAT_IN(KLAT_IN)-ZLAT_IN(KLAT_IN-JINY)
+ ZLON_IN (KLAT_IN+JINY) = ZLON_IN (KLAT_IN+1-JINY)&
+ &+MOD(ILON_IN(KLAT_IN+JINY),2)*RPI/ILON_IN(KLAT_IN+JINY)
+ENDDO
+
+! 1.1.2 Inverses
+ZDLONI_IN(:)=1./ZDLON_IN(:)
+ZDLATI_IN(:)=1./ZDLAT_IN(:)
+ZDHLAT_IN(:)=ZDLAT_IN(:)*ZHLAT_IN(:)
+ZDHLATI_IN(:)=1./ZDHLAT_IN(:)
+
+!* 1.2 Primitive function of input field with respect to longitude
+! Valid at grid-cell longitude boundaries.
+! Make an extension zone of +/-3 grid-cells for interpolation.
+! The extension over the poles shifts fields by RPI.
+
+! 1.2.1 Primitive function
+ALLOCATE(ZPRIMX(-2:JXMAX_IN+3,-2:KLAT_IN+3))
+ALLOCATE(ZDIFX (-2:JXMAX_IN+2,-2:KLAT_IN+3))
+
+DO JLAT=1,KLAT_IN
+ ZSUM=0.
+ DO JLON=1,ILON_IN(JLAT)
+ ZSUM=ZSUM+ZFLD_IN(IND_IN(JLAT)-1+JLON)*ZG_IN(JLAT)
+ ZPRIMX(JLON,JLAT)=ZSUM
+ ENDDO
+ENDDO
+
+! 1.2.2 The extension over the poles shifts fields by RPI.
+
+DO JINY = 1, 3
+ ZSUM=0.
+ DO JLON=1,ILON_IN(1-JINY)
+ JINX = 1 + MOD( ILON_IN(1-JINY)/2 + JLON - 1, ILON_IN(1-JINY) )
+ ZSUM=ZSUM+ZPARITY*ZFLD_IN(IND_IN(JINY)-1+JINX)*ZG_IN(1-JINY)
+ ZPRIMX(JLON,1-JINY) = ZSUM
+ ENDDO
+ ZSUM=0.
+ DO JLON=1,ILON_IN(KLAT_IN+JINY)
+ JINX = 1+MOD( ILON_IN(KLAT_IN+JINY)/2 + JLON - 1, ILON_IN(KLAT_IN+JINY) )
+ ZSUM=ZSUM+ZPARITY*ZFLD_IN(IND_IN(KLAT_IN+1-JINY)-1+JINX)*ZG_IN(KLAT_IN+JINY)
+ ZPRIMX(JLON,KLAT_IN+JINY) = ZSUM
+ ENDDO
+ENDDO
+
+! 1.2.3 Extension in x-direction
+
+DO JINX = 1, 3
+ DO JLAT=-2,KLAT_IN+3
+ ZPRIMX(1-JINX ,JLAT) =-ZPRIMX(ILON_IN(JLAT),JLAT)&
+ &+ZPRIMX(ILON_IN(JLAT)+1-JINX,JLAT)
+ ZPRIMX(ILON_IN(JLAT)+JINX,JLAT) = ZPRIMX(ILON_IN(JLAT),JLAT)&
+ &+ZPRIMX(JINX,JLAT)
+ ENDDO
+ENDDO
+
+! 1.2.5 Difference of primitive function
+
+DO JLAT=-2,KLAT_IN+3
+ DO JLON=-2,ILON_IN(JLAT)+2
+ ZDIFX(JLON,JLAT)=ZPRIMX(JLON+1,JLAT)-ZPRIMX(JLON,JLAT)
+ ENDDO
+ENDDO
+
+
+
+! * 2. OUTPUT GRID AND FIELD
+
+!* 2.1 Geometry of output grid
+! Output grid can be finer or coarser than input grid.
+! Therefore dimensioning [KLAT_IN/KLAT_OUT]+4+1
+! to allow for 4th order interpolation of primitive
+! function wrt latitude at top and bottom of grid-cell
+! boundaries (output latitudes).
+
+! 2.1.1 Grid blocks with constant longitude spacing
+
+IBL_OUT = 1
+IBLATSTA_OUT(1) = 1
+IBLON_OUT(1) = KLON_OUT(1)
+DO JLAT=2,KLAT_OUT
+ IF((KLON_OUT(JLAT)/=KLON_OUT(JLAT-1)) .OR. (JLAT == KLAT_OUT/2))THEN
+ IBL_OUT = IBL_OUT + 1
+ IBLATEND_OUT(IBL_OUT-1) = JLAT-1
+ IBLATSTA_OUT(IBL_OUT) = JLAT
+ IBLON_OUT(IBL_OUT) = KLON_OUT(JLAT)
+ ENDIF
+ENDDO
+IBLATEND_OUT(IBL_OUT)=KLAT_OUT
+
+! 2.1.2 Latitudes and scale factors
+
+ZLAT_OUT(0) = SIGN(RPI/2.,RD2R*PLAT_OUT(1))
+ZLAT_OUT(KLAT_OUT)= SIGN(RPI/2.,RD2R*PLAT_OUT(KLAT_OUT))
+DO JLAT=1,KLAT_OUT
+ IF (JLAT<KLAT_OUT) ZLAT_OUT(JLAT)=RD2R*0.5*(PLAT_OUT(JLAT)+PLAT_OUT(JLAT+1))
+ ZDLAT_OUT(JLAT)=ABS(ZLAT_OUT(JLAT-1)-ZLAT_OUT(JLAT))
+ ZDLON_OUT(JLAT)=2.*RPI/KLON_OUT(JLAT)
+! Starting longitude (must be less or equal to zero)
+ ZLON_OUT(JLAT)=-ZDLON_OUT(JLAT)/2.
+! Scale factors
+ ZHLON_OUT(JLAT) = ABS(SIN(ZLAT_OUT(JLAT-1))-SIN(ZLAT_OUT(JLAT)))/ZDLAT_OUT(JLAT)
+ ZHLAT_OUT(JLAT) = 1.
+ ZG_OUT(JLAT) = ZHLON_OUT(JLAT)*ZHLAT_OUT(JLAT)*ZDLON_OUT(JLAT)*ZDLAT_OUT(JLAT)
+ENDDO
+
+! 2.1.3 Closest input row above each output row
+
+ILAT_IO(0)=0
+DO JLAT=1,KLAT_OUT
+ ILAT_IO(JLAT)=ILAT_IO(JLAT-1)
+ DO WHILE (ZLAT_IN(ILAT_IO(JLAT)) > ZLAT_OUT(JLAT))
+ ILAT_IO(JLAT)=ILAT_IO(JLAT)+1
+ ENDDO
+ ILAT_IO(JLAT)=ILAT_IO(JLAT)-1
+ENDDO
+JXMAX_OUT=0
+JYMAX_OUT=0
+DO JBL=1, IBL_OUT
+ JXMAX_OUT = MAX(JXMAX_OUT,IBLON_OUT(JBL))
+ JYMAX_OUT = MAX(JYMAX_OUT,IBLATEND_OUT(JBL)-IBLATSTA_OUT(JBL)+1)
+ENDDO
+
+
+!* 2.2 Interpolation of primitive function
+
+JNUM=0
+ALLOCATE(ZPRIM(0:JXMAX_OUT,-3:3+KLAT_IN))
+ALLOCATE(ZDIFY(1:JXMAX_OUT,-3:3+KLAT_IN))
+ALLOCATE(ZPRIMY(0:JXMAX_OUT,0:JYMAX_OUT))
+ALLOCATE(ZOUTPRE(0:JXMAX_OUT))
+DO JBL=1, IBL_OUT
+
+! 2.2.1 Interpolate PF of input field with respect to longitude
+! to output grid-cell longitude boundaries.
+! (output longitude / input latitude)
+
+ JINYSTA=ILAT_IO(IBLATSTA_OUT(JBL)-1)
+ JINYEND=ILAT_IO(IBLATEND_OUT(JBL))
+ JINYD=JINYEND-JINYSTA
+ DO JLON=0,IBLON_OUT(JBL)
+ ZPRIM(JLON,-3)=0.
+ ZOUTPRE(JLON)=ZLON_OUT(IBLATSTA_OUT(JBL))+JLON*ZDLON_OUT(IBLATSTA_OUT(JBL))
+ ENDDO
+ DO JINY=JINYSTA-2,JINYEND+3
+ DO JLON=0,IBLON_OUT(JBL)
+ ZOUT = ZOUTPRE(JLON)-ZLON_IN(JINY)
+ ZPRIMADD=0.
+ IF (ZOUT<0.) THEN
+ ZOUT = ZOUT+ILON_IN(JINY)*ZDLON_IN(JINY)
+ ZPRIMADD=-ZPRIMX(ILON_IN(JINY),JINY)
+ ENDIF
+ IF (ZOUT>ILON_IN(JINY)*ZDLON_IN(JINY)) THEN
+ ZOUT = ZOUT-ILON_IN(JINY)*ZDLON_IN(JINY)
+ ZPRIMADD= ZPRIMX(ILON_IN(JINY),JINY)
+ ENDIF
+ JINX=INT(ZOUT*ZDLONI_IN(JINY))
+ ZX=-1.+2.*(ZOUT-JINX*ZDLON_IN(JINY))*ZDLONI_IN(JINY)
+! 2.2.1.1 Basic coefficients
+ ZDLL=ZDIFX(JINX-2,JINY)
+ ZDL =ZDIFX(JINX-1,JINY)
+ ZDC =ZDIFX(JINX ,JINY)
+ ZDR =ZDIFX(JINX+1,JINY)
+ ZDRR=ZDIFX(JINX+2,JINY)
+ ZC(0) = (ZPRIMX(JINX+1,JINY)+ZPRIMX(JINX ,JINY))*.5
+ ZC(1) = ZDC*.5
+! 2.2.1.2 Economization of the power series (5th to 3rd order)
+ ZC(2)=(130.*(ZDR-ZDL)-17.*(ZDRR-ZDLL))*ZCC2
+ ZC(3)=(452.*(ZDR-2.*ZDC+ZDL)-33.*(ZDRR-2.*ZDC+ZDLL))*ZCC3
+! 2.2.1.3 Limiting
+ ZC(3) = ZCURVLIM(ZC(3),ZC(2))
+ ZLIMR = ZMINMOD( ZFRAC( (ZDR-ZDC)*.5, 2.*( ZC(2)+ZC(3) ) ) )
+ ZLIML = ZMINMOD( ZFRAC( (ZDL-ZDC)*.5, ZLIMR*2.*(-ZC(2)+ZC(3) ) ) )
+ ZLIM = ZLIMR*ZLIML
+ ZC(2) = ZLIM*ZC(2)
+ ZC(3) = ZLIM*ZC(3)
+! 2.2.1.5 Evaluation
+ ZPRIM(JLON,JINY-JINYSTA)= ZC(0)+ZC(1)*ZX &
+ & +(ZX*ZX-1.)*(ZC(2)+ZC(3)*ZX) &
+ & +ZPRIMADD
+ ENDDO
+ ENDDO
+
+! 2.2.2 Differentiate wrt longitude
+
+ DO JINY=-2,3+JINYD
+ ZDHI = 1./(ZDLON_OUT(IBLATSTA_OUT(JBL))*ZHLON_IN(JINYSTA+JINY))
+ DO JLON=IBLON_OUT(JBL),1,-1
+ ZPRIM(JLON,JINY) = (ZPRIM(JLON,JINY)-ZPRIM(JLON-1,JINY))*ZDHI
+ ENDDO
+ ENDDO
+
+! 2.2.3 PF wrt latitude and scalefactor*cellarea (G=h_y, dA=dy ==> G*dA)
+! (output longitude / input latitude)
+
+ DO JINY=-2,3+JINYD
+ DO JLON=1, IBLON_OUT(JBL)
+ ZPRIM(JLON,JINY)= ZPRIM(JLON,JINY-1)+ZPRIM(JLON,JINY)
+ ENDDO
+ ENDDO
+ DO JINY=-2,2+JINYD
+ DO JLON=1, IBLON_OUT(JBL)
+ ZDIFY(JLON,JINY) = (ZPRIM(JLON,JINY+1)-ZPRIM(JLON,JINY))*ZDHLATI_IN(JINYSTA+JINY+1)
+ ENDDO
+ ENDDO
+
+! 2.2.4 Interpolation PF to output latitude cell boundaries
+
+ DO JOUTY = 0, IBLATEND_OUT(JBL)-IBLATSTA_OUT(JBL)+1
+ JLAT = JOUTY+IBLATSTA_OUT(JBL)-1
+ JINY = ILAT_IO(JOUTY+IBLATSTA_OUT(JBL)-1)-JINYSTA
+ ZY=-1.+2.*(-ZLAT_OUT(JLAT)+ZLAT_IN(JINYSTA+JINY))*ZDLATI_IN(JINYSTA+JINY+1)
+ ZY2 = (ZY*ZY-1.)
+ DO JLON=1, IBLON_OUT(JBL)
+! 2.2.4.1 Basic coefficients
+ ZDLL=ZDIFY(JLON,JINY-2)
+ ZDL =ZDIFY(JLON,JINY-1)
+ ZDC =ZDIFY(JLON,JINY )
+ ZDR =ZDIFY(JLON,JINY+1)
+ ZDRR=ZDIFY(JLON,JINY+2)
+ ZC(0) = (ZPRIM(JLON,JINY+1)+ZPRIM(JLON,JINY))*.5
+ ZC(1) = ZDC*.5
+! 2.2.1.2 Economization of the power series (5th to 3rd order)
+ ZC(2)=(130.*(ZDR-ZDL)-17.*(ZDRR-ZDLL))*ZCC2
+ ZC(3)=(452.*(ZDR-2.*ZDC+ZDL)-33.*(ZDRR-2.*ZDC+ZDLL))*ZCC3
+! 2.2.1.3 Limiting
+ ZC(3) = ZCURVLIM(ZC(3),ZC(2))
+ ZLIMR = ZMINMOD( ZFRAC( (ZDR-ZDC)*.5, 2.*( ZC(2)+ZC(3) ) ) )
+ ZLIML = ZMINMOD( ZFRAC( (ZDL-ZDC)*.5, ZLIMR*2.*(-ZC(2)+ZC(3) ) ) )
+ ZLIM = ZLIMR*ZLIML
+ ZC(2) = ZLIM*ZC(2)
+ ZC(3) = ZLIM*ZC(3)
+! 2.2.5.4 Back to real coefficients
+ ZC(1:3) = ZDHLAT_IN(JINYSTA+JINY+1)*ZC(1:3)
+! 2.2.4.5 Evaluation
+ ZPRIMY(JLON,JOUTY)= ZC(0)+ZC(1)*ZY+ZY2*(ZC(2)+ZC(3)*ZY)
+ ENDDO
+ ENDDO
+
+! 2.2.5 Take difference of primitive function to get output field
+! (output longitude / output latitude)
+
+ DO JOUTY = 1, IBLATEND_OUT(JBL)-IBLATSTA_OUT(JBL)+1
+ JLAT = JOUTY+IBLATSTA_OUT(JBL)-1
+ ZDHI = 1./(ZDLAT_OUT(JLAT)*ZHLAT_OUT(JLAT))
+ DO JLON=1, IBLON_OUT(JBL)
+ JNUM=JNUM+1
+ PFLD_OUT(JNUM) = (ZPRIMY(JLON,JOUTY)-ZPRIMY(JLON,JOUTY-1))*ZDHI
+ ENDDO
+ ENDDO
+ENDDO
+IF (ALLOCATED(ZPRIM )) DEALLOCATE(ZPRIM )
+IF (ALLOCATED(ZPRIMY)) DEALLOCATE(ZPRIMY)
+IF (ALLOCATED(ZDIFY)) DEALLOCATE(ZDIFY)
+IF (ALLOCATED(ZOUTPRE)) DEALLOCATE(ZOUTPRE)
+
+IF (ALLOCATED(ZPRIMX)) DEALLOCATE(ZPRIMX)
+IF (ALLOCATED(ZFLD_IN)) DEALLOCATE(ZFLD_IN)
+IF (ALLOCATED(ZDIFX)) DEALLOCATE(ZDIFX)
+
+
+END SUBROUTINE CONSINT
diff --git a/interpolation/createSharedMemoryCoefficients.c b/interpolation/createSharedMemoryCoefficients.c
new file mode 100755
index 0000000..3d60256
--- /dev/null
+++ b/interpolation/createSharedMemoryCoefficients.c
@@ -0,0 +1,195 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/sem.h>
+
+extern int debugSet;
+
+#include "sharedmemory.h"
+#include "fortdefs.h"
+
+void createSharedMemoryCoefficients(
+ fortint Type, /* SP2LL, SP2QG, .. */
+ fortint Truncation, /* spectral truncation */
+ fortreal Grid, /* grid spacing or gaussian number */
+ fortint Numlat, /* number of latitudes in the shared memory array */
+ key_t memoryKey, /* shared memory key */
+ int size) /* size of the shared memory */
+{
+int type = (int) Type;
+struct sembuf bufs[1];
+union semun {
+ int val;
+ struct semid_ds *buf;
+ ushort *array;
+} semvalues;
+fortreal * array;
+int shmflg, shmid;
+char * shmaddr;
+int status, i, oldmask;
+char mode[] = "00666";
+fortint gaussianNumber, one = 1, first = 1, returnCode;
+int semaphoreId, value;
+fortreal northPole = 90.0;
+
+/*
+// If the semaphore for the shared memory already exists,
+// wait for it to become ready to read, and return
+*/
+ if( DEBUG ) printf("createSharedMemoryCoefficients: see if shared memory semaphore exists\n");
+ semaphoreId = semget(memoryKey,1,0);
+
+ if( semaphoreId != -1 ) {
+ bufs[0].sem_num = 0;
+ bufs[0].sem_op = -READY_TO_READ;
+ bufs[0].sem_flg = 0;
+ if( DEBUG ) printf("createSharedMemoryCoefficients: wait for shared memory semaphore\n");
+ status = semop(semaphoreId,bufs,(size_t)1);
+
+ semvalues.val = READY_TO_READ;
+ value = semctl((int)semaphoreId, (int)0, (int)SETVAL,semvalues);
+ if( DEBUG ) printf("createSharedMemoryCoefficients: set shared memory semaphore readable\n");
+ return;
+ }
+/*
+// Create semaphore for the shared memory array
+*/
+ if( DEBUG ) {
+ printf("createSharedMemoryCoefficients: have to create shared memory segment\n");
+ printf("createSharedMemoryCoefficients: so create shared memory semaphore\n");
+ }
+ oldmask = umask(000);
+ semaphoreId = semget(memoryKey,1,IPC_CREAT | 0666);
+ if( semaphoreId == -1 ) {
+ perror("creator: failed to create smaphore");
+ exit(1);
+ }
+ (void) umask(oldmask);
+/*
+// Create shared segment id
+*/
+ if( DEBUG ) printf("createSharedMemoryCoefficients: get shared memory segment\n");
+ (void) umask(0);
+ shmflg = IPC_CREAT | 0666;
+ shmid = shmget(memoryKey, (size_t)size, shmflg);
+ if ( shmid < 0 ) {
+ perror("shmget error");
+ exit(1);
+ }
+/*
+// Attach the shared segment
+*/
+ if( DEBUG ) printf("createSharedMemoryCoefficients: attach shared memory segment\n");
+ shmaddr = (char *) NULL;
+ shmflg = 0;
+ array = (fortreal *) shmat( shmid, shmaddr, shmflg);
+ if ( array == (fortreal *) -1 ) {
+ perror("shmat error");
+ exit(1);
+ }
+/*
+// Put some data into the shared segment
+*/
+ if( DEBUG ) printf("createSharedMemoryCoefficients: put data into the shared segment\n");
+ returnCode = 0;
+
+ JDEBUG();
+
+ switch( type ) {
+
+ case SP2LL:
+ if( DEBUG ) printf("createSharedMemoryCoefficients: call NMAKLL for SP2LL\n");
+ NMAKLL( &Truncation, &Grid, &northPole, &Numlat, array, &returnCode);
+ if( returnCode ) {
+ printf("Problem with NMAKLL, return code = %d\n", returnCode);
+ exit(1);
+ }
+ break;
+
+ case SP2RG:
+ case SP2QG:
+/*
+*/
+ {
+ char htype[2];
+ fortreal * plat;
+ fortint * kpts;
+
+ gaussianNumber = (fortint) Grid;
+
+ plat = (fortreal *) malloc( gaussianNumber*2*sizeof(fortreal));
+ if( plat == NULL ) {
+ perror("createSharedMemoryCoefficients: plat malloc problem");
+ exit(1);
+ }
+
+ kpts = (fortint *) malloc( gaussianNumber*2*sizeof(fortint));
+ if( kpts == NULL ) {
+ perror("createSharedMemoryCoefficients: kpts malloc problem");
+ exit(1);
+ }
+
+ if( type == SP2RG ) {
+ if( DEBUG ) printf("createSharedMemoryCoefficients: handle SP2RG\n");
+ strcpy(htype,"F");
+ }
+ else {
+ if( DEBUG ) printf("createSharedMemoryCoefficients: handle SP2QG\n");
+ strcpy(htype,"R");
+ }
+
+ if( DEBUG ) printf("createSharedMemoryCoefficients: call JGETGG\n");
+ JGETGG(&gaussianNumber, &htype, plat, kpts, &returnCode, one);
+ if( returnCode ) {
+ printf("Problem with JGETGG, return code = %d\n", returnCode);
+ exit(1);
+ }
+ if( DEBUG ) printf("createSharedMemoryCoefficients: call NMAKGG\n");
+ NMAKGG(&Truncation, &first, plat, &Numlat, array, &returnCode);
+ if( returnCode ) {
+ printf("Problem with NMAKGG, return code = %d\n", returnCode);
+ exit(1);
+ }
+
+ free(plat);
+ free(kpts);
+ break;
+ }
+/*
+*/
+ default:
+ printf("creator: Type %d not yet handled\n", type);
+ exit(1);
+ }
+/*
+// Set the semaphore to make the memory readable for cooperating processes
+*/
+ if( DEBUG ) printf("createSharedMemoryCoefficients: set semaphore to make memory readable\n");
+ semvalues.val = READY_TO_READ;
+ value = semctl((int)semaphoreId, (int)0, (int)SETVAL,semvalues);
+/*
+// Detach the shared segment
+*/
+ if( DEBUG ) printf("createSharedMemoryCoefficients: detach the shared segment\n");
+ status = shmdt(array);
+ if ( status < 0 ) {
+ perror("shmdt error");
+ exit(1);
+ }
+
+ return;
+}
diff --git a/interpolation/csum.F b/interpolation/csum.F
new file mode 100755
index 0000000..d1dae7a
--- /dev/null
+++ b/interpolation/csum.F
@@ -0,0 +1,84 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ COMPLEX FUNCTION CSUM (KN, UVEC, KNCX)
+C
+C---->
+C**** *CSUM* - ROUTINE WHICH IMPLEMENTS THE BLAS ROUTINE OF THE
+C SAME NAME
+C
+C PURPOSE.
+C --------
+C
+C SIMPLE REPLACEMENT FOR IBM
+C
+C** INTERFACE.
+C ----------
+C
+C * CV = CSUM (KN, UVEC, KNCX) *
+C
+C
+C METHOD.
+C -------
+C
+C CREATE COMPLEX SUM OF COMPLEX VECTOR
+C
+C EXTERNALS.
+C ----------
+C
+C NONE
+C
+C REFERENCE.
+C ----------
+C
+C NONE
+C
+C AUTHOR.
+C -------
+C
+C K. FIELDING * ECMWF * FEB 1992.
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE
+C
+C COMMON BLOCKS USED
+C -------------------
+C
+C NONE
+C
+C----<
+ INTEGER KN, KNCX
+ COMPLEX UVEC (*)
+C
+ INTEGER IP
+ COMPLEX CHOLD
+C
+C 1. MAIN LOOP OF CODE
+C ----------------------------------------------
+C
+ 100 CONTINUE
+#ifndef CRAY
+ CHOLD = (0.0D0, 0.0D0)
+#else
+ CHOLD = (0.0, 0.0)
+#endif
+C
+ DO 110 IP = 0, KN - 1
+ CHOLD = CHOLD + UVEC (1 + IP * KNCX)
+ 110 CONTINUE
+C
+ CSUM = CHOLD
+C
+C END OF ROUTINE
+C
+ RETURN
+ END
diff --git a/interpolation/current.h b/interpolation/current.h
new file mode 100755
index 0000000..6d0488f
--- /dev/null
+++ b/interpolation/current.h
@@ -0,0 +1,55 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C**** "current.h"
+C
+C PURPOSE
+C _______
+C
+C This file contains information about gaussian field definitions
+C currently held in common blocks.
+C
+C INTERFACE
+C _________
+C
+C #include "current.h"
+C
+C Common block usage
+C __________________
+C
+C NIGAUSO - Resolution of input gaussian field definition
+C currently held in RIGAUSS, MILLEN.
+C NOGAUSO - Resolution of output gaussian field definition
+C currently held in ROGAUSS, NOLPTS.
+C HIGAUST - Type (R,F,U) of input gaussian field definition
+C currently held in RIGAUSS, MILLEN.
+C HOGAUST - Type (R,F,U) of output gaussian field definition
+C currently held in ROGAUSS, NOLPTS.
+C HIGAUST
+C HOGAUST
+C
+C Author
+C ______
+C
+C J.D.Chambers ECMWF Sep 1996
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C _______________________________________________________
+C
+C
+ COMMON /CURRENT_STATE/ NIGAUSO, NOGAUSO, HIGAUST, HOGAUST
+ SAVE /CURRENT_STATE/
+ INTEGER NIGAUSO,NOGAUSO
+ CHARACTER*1 HIGAUST, HOGAUST
diff --git a/interpolation/ddstyle.F b/interpolation/ddstyle.F
new file mode 100755
index 0000000..56574eb
--- /dev/null
+++ b/interpolation/ddstyle.F
@@ -0,0 +1,185 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE DDSTYLE(FIELD,IN_EW,IN_NS,OUT_EW,OUT_NS,KRET)
+C
+C---->
+C**** DDSTYLE
+C
+C Purpose
+C -------
+C
+C Create a subgrid of an input regular latitude/longitude
+C grid by selecting points (dissemination style).
+C
+C
+C Interface
+C ---------
+C
+C CALL DDSTYLE(FIELD,IN_EW,IN_NS,OUT_EW,OUT_NS,KRET)
+C
+C Input
+C -----
+C
+C FIELD - Input regular latitude/longitude gridpoint field.
+C IN_EW - East-west increment of input field (degrees * 10*5).
+C IN_NS - North-south increment of input field (degrees * 10*5).
+C OUT_EW - East-west increment of output field (degrees * 10*5).
+C OUT_NS - North-south increment of output field (degrees * 10*5).
+C
+C
+C Output
+C ------
+C
+C FIELD - Output regular latitude/longitude gridpoint field.
+C KRET - Return status code
+C 0 = OK
+C
+C
+C Method
+C ------
+C
+C Area boundaries for output field are adjusted (by shrinking)
+C if necessary to fit the grid.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Logs output messages
+C JDEBUG - Checks whether the debug flag is to be turned on.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF May 1999
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "jparams.h"
+#include "parim.h"
+#include "nofld.common"
+C
+C Subroutine arguments
+C
+ REAL FIELD(*)
+ INTEGER IN_EW,IN_NS,OUT_EW,OUT_NS,KRET
+C
+C Local variables
+C
+ INTEGER N, INC_EW,INC_NS,N_EW,N_NS,LOOPO,LOOPI,NEXT
+ INTEGER NWEST,NEAST, NUM_EW
+ REAL NORTH,WEST,SOUTH,EAST
+ LOGICAL LDEBUG
+C
+C Externals
+C
+C ------------------------------------------------------------------
+C Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+
+ KRET = 0
+C
+ CALL JDEBUG( )
+ LDEBUG = ( NDBG.GT.0 )
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'DDSTYLE: input E-W increment = ', IN_EW)
+ CALL INTLOG(JP_DEBUG,'DDSTYLE: input N-S increment = ', IN_NS)
+ CALL INTLOG(JP_DEBUG,'DDSTYLE: output E-W increment = ', OUT_EW)
+ CALL INTLOG(JP_DEBUG,'DDSTYLE: output N-S increment = ', OUT_NS)
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 2. Check that output grid is a subset of the input grid.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Fixup input/output field area definitions according to grid
+C specification.
+C
+ NORTH = REAL(NOAREA(1)) / PPMULT
+ WEST = REAL(NOAREA(2)) / PPMULT
+ SOUTH = REAL(NOAREA(3)) / PPMULT
+ EAST = REAL(NOAREA(4)) / PPMULT
+C
+ NWEST = NOAREA(2)
+ NEAST = NOAREA(4)
+ IF( NWEST.LT.0 ) NWEST = NWEST + 36000000
+ IF( NEAST.LT.0 ) NEAST = NEAST + 36000000
+ IF( NEAST.LT.NWEST ) NEAST = NEAST + 36000000
+C
+C Check increments
+C
+ INC_EW = OUT_EW / IN_EW
+ IF( (INC_EW*IN_EW).NE.OUT_EW ) THEN
+ KRET = 1
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'DDSTYLE: East-west step not multiple of input',JPQUIET)
+ CALL INTLOG(JP_ERROR,'DDSTYLE: Requested step = ',OUT_EW)
+ CALL INTLOG(JP_ERROR,'DDSTYLE: Input GRIB step = ',IN_EW)
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+ INC_NS = OUT_NS / IN_NS
+ IF( (INC_NS*IN_NS).NE.OUT_NS ) THEN
+ KRET = 1
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'DDSTYLE: North-south step not multiple of input',JPQUIET)
+ CALL INTLOG(JP_ERROR,'DDSTYLE: Requested step = ',OUT_NS)
+ CALL INTLOG(JP_ERROR,'DDSTYLE: Input GRIB step = ',IN_NS)
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+ N_EW = ( (NEAST - NWEST) / OUT_EW ) + 1
+ N_NS = ( (NOAREA(1) - NOAREA(3)) / OUT_NS ) + 1
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'DDSTYLE: No. of E_W output pts = ', N_EW)
+ CALL INTLOG(JP_DEBUG,'DDSTYLE: No. of N-S output pts = ', N_NS)
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 3. Generate new grid.
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C Select points for new grid.
+C
+ NUM_EW = NINT((EAST-WEST)*PPMULT)/IN_EW + 1
+C
+ NEXT = 1
+ DO LOOPO = 1, N_NS*INC_NS, INC_NS
+ N = (LOOPO-1)*NUM_EW
+ DO LOOPI = 1, N_EW*INC_EW, INC_EW
+ FIELD(NEXT) = FIELD(N+LOOPI)
+ NEXT = NEXT + 1
+ ENDDO
+ ENDDO
+C
+C ------------------------------------------------------------------
+C Section 9. Return.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/debug.h b/interpolation/debug.h
new file mode 100755
index 0000000..2d21c38
--- /dev/null
+++ b/interpolation/debug.h
@@ -0,0 +1,97 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C**** "debug.h" - This include file contains a set of basic constants
+C interpolation
+C
+C PURPOSE
+C _______
+C
+C Basic constants for the interpolation library
+C
+C INTERFACE
+C _________
+C
+C #include "debug.h"
+C
+C Input parameters
+C ________________
+C
+C NONE
+C
+C Common block usage
+C __________________
+C
+C NONE
+C
+C EXTERNALS
+C _________
+C
+C NONE
+C
+C METHOD
+C ______
+C
+C NONE
+C
+C REFERENCE
+C _________
+C
+C NONE
+C
+C COMMENTS
+C ________
+C
+C Contains sections 0 to 4
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Dec 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C NONE
+C
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C
+C _______________________________________________________
+C
+C
+C* Section 1. Area definitions which are really local
+C _______________________________________________________
+C
+ COMMON /DEBUG/ IIAREA, IOAREA
diff --git a/interpolation/defaults_for_table_001 b/interpolation/defaults_for_table_001
new file mode 100755
index 0000000..fba24df
--- /dev/null
+++ b/interpolation/defaults_for_table_001
@@ -0,0 +1,11 @@
+Param lsm wind prec lsm interp
+----- --- ---- ---- ----------
+002 n n n n # MSL
+033 y y n n # U
+034 y y n n # V
+061 y n y n # TP
+062 y n y n # LSP
+063 y n y n # CP
+064 y n y n # SF
+065 y n y n # WESF
+081 n n n y # LSM
diff --git a/interpolation/defaults_for_table_128 b/interpolation/defaults_for_table_128
new file mode 100755
index 0000000..76dd6d0
--- /dev/null
+++ b/interpolation/defaults_for_table_128
@@ -0,0 +1,14 @@
+Param lsm wind prec lsm interp
+----- --- ---- ---- ----------
+131 y y n n # U
+132 y y n n # V
+142 y n y n # LSP
+143 y n y n # CP
+144 y n y n # SF
+151 n n n n # MSL
+165 y y n n # 10U
+166 y y n n # 10V
+172 n n n y # LSM
+228 y n y n # TTP
+239 y n y n # CSF
+240 y n y n # LSF
diff --git a/interpolation/dssarea.F b/interpolation/dssarea.F
new file mode 100755
index 0000000..8e9d093
--- /dev/null
+++ b/interpolation/dssarea.F
@@ -0,0 +1,509 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION DSSAREA( EW, NS, NORTH, WEST, SOUTH, EAST )
+C
+C---->
+C**** DSSAREA
+C
+C Purpose
+C -------
+C
+C Fixup input/output field area definitions according to grid
+C specification (dissemination style).
+C
+C
+C Interface
+C ---------
+C
+C IRET = DSSAREA( EW, NS, NORTH, WEST, SOUTH, EAST )
+C
+C Input
+C -----
+C
+C For latitude/longitude grids:
+C EW = East-west grid interval (degrees)
+C NS = North-south grid interval (degrees)
+C
+C For gaussian grids:
+C EW = gaussian grid number
+C NS = 0
+C
+C NORTH = North latitude (degrees)
+C WEST = West longitude (degrees)
+C SOUTH = South latitude (degrees)
+C EAST = East longitude (degrees)
+C
+C For spherical harmonics:
+C EW = 0
+C NS = 0
+C NORTH = 0
+C WEST = 0
+C SOUTH = 0
+C EAST = 0
+C
+C
+C Output
+C ------
+C
+C NORTH = North latitude, adjusted if necessary (degrees)
+C WEST = West longitude, adjusted if necessary (degrees)
+C SOUTH = South latitude, adjusted if necessary (degrees)
+C EAST = East longitude, adjusted if necessary (degrees)
+C
+C The function returns 0 if OK.
+C Otherwise a non-zero is returned and the values NORTH, WEST,
+C SOUTH, and EAST are left unchanged.
+C
+C
+C Method
+C ------
+C
+C If default (0/0/0/0) selected for input, input area is set
+C - to global for lat/long grid
+C - to global for gaussian grid
+C
+C Output area is adjusted:
+C
+C (1) by shrinking to fit the default dissemination 0.5x0.5 grid
+C on its north and west boundaries.
+C (2) by calculating the east boundary from the new west as an
+C integral number of new grid west-east increments to fit
+C inside the specified area.
+C (3) by calculating the south boundary from the new north as an
+C integral number of new grid north-south increments to fit
+C inside the specified area.
+C
+C
+C Externals
+C ---------
+C
+C JGETGG - Reads the definition of a gaussian grid.
+C JNORSGG - Finds the lat row in a gauss grid N or S of given lat
+C INTLOG - Logs error messages.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF May 1999
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 19200 )
+ REAL*8 RRMULT
+#if (defined hp) && (!defined INTEGER_8)
+ INTEGER NP90, NP360, NFACTOR
+ PARAMETER ( NFACTOR = 10 )
+#else
+ INTEGER*8 NP90, NP360, NFACTOR
+ PARAMETER ( NFACTOR = 1000 )
+#endif
+ INTEGER NR90
+ PARAMETER ( NR90 = 90 )
+ PARAMETER ( NP90 = JP90*NFACTOR )
+ PARAMETER ( NP360 = JP360*NFACTOR )
+ PARAMETER ( RRMULT = (PPMULT*NFACTOR) )
+C
+C Function arguments
+C
+ REAL EW, NS, NORTH, WEST, SOUTH, EAST
+C
+C Local variables
+C
+#if (defined hp) && (!defined INTEGER_8)
+ INTEGER INORTH, IWEST, ISOUTH, IEAST, IEW, INS
+ INTEGER NWEST, NEAST
+#else
+ INTEGER*8 INORTH, IWEST, ISOUTH, IEAST, IEW, INS
+ INTEGER*8 NWEST, NEAST
+#endif
+ INTEGER NGAUSS, NOLD, IRET, KPTS, NWEPTS, NNSPTS
+ DIMENSION KPTS(JPGTRUNC*2)
+ DATA NOLD /0/
+ REAL RNORTH, RSOUTH
+ REAL ONORTH, OWEST, OSOUTH, OEAST
+ LOGICAL LDEFIN, LGAUSS, LSPHERE
+ REAL RGAUSS, RESEW
+ DIMENSION RGAUSS(JPGTRUNC*2)
+ REAL*8 DEW, DNS, DNORTH, DWEST, DSOUTH, DEAST
+ REAL*8 EPS
+C
+C Externals
+C
+ INTEGER JNORSGG
+C
+ SAVE NOLD, RGAUSS
+C
+C Statement functions
+C
+ REAL*8 A
+ REAL B
+ REAL*8 X
+ REAL Y
+C
+ LOGICAL GREATER
+ LOGICAL SMALLER
+C
+ GREATER(A,B) = ( (A-DBLE(B)).GT.EPS )
+ SMALLER(X,Y) = ( (DBLE(Y)-X).GT.EPS )
+C
+ DATA EPS/1E-5/
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ CALL INTLOGR(JP_DEBUG,'DSSAREA: input w-e = ', EW)
+ CALL INTLOGR(JP_DEBUG,'DSSAREA: input n-s = ', NS)
+ CALL INTLOGR(JP_DEBUG,'DSSAREA: input north = ', NORTH)
+ CALL INTLOGR(JP_DEBUG,'DSSAREA: input south = ', SOUTH)
+ CALL INTLOGR(JP_DEBUG,'DSSAREA: input west = ', WEST)
+ CALL INTLOGR(JP_DEBUG,'DSSAREA: input east = ', EAST)
+C
+ ONORTH = NORTH
+ OSOUTH = SOUTH
+ OWEST = WEST
+ OEAST = EAST
+C
+ DSSAREA = 0
+ LGAUSS = ( NS.EQ.0.0 )
+ LSPHERE = ( (EW.EQ.0.0).AND.(NS.EQ.0.0) )
+C
+C If it's gaussian, pick up the gaussian grid definitions unless
+C they have already been retrieved.
+C
+ IF( LGAUSS.AND..NOT.LSPHERE ) THEN
+ NGAUSS = NINT( EW )
+#if (defined hp) && (!defined INTEGER_8)
+ IF( NGAUSS.GE.256 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'DSSAREA: unsafe to use 32-bit HP version for gaussian = ',
+ X NGAUSS)
+ DSSAREA = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+#endif
+ IF( NGAUSS.GT.JPGTRUNC ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'DSSAREA: Gaussian grid number ', NGAUSS)
+ CALL INTLOG(JP_ERROR,
+ X 'DSSAREA: exceeds current expected maximum ', JPGTRUNC)
+ DSSAREA = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+ IF( NGAUSS.NE.NOLD ) THEN
+ NOLD = NGAUSS
+ CALL JGETGG( NOLD, 'F', RGAUSS, KPTS, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'DSSAREA: Failed to pick up gaussian ', JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'DSSAREA: definitions for resolution = ', NOLD)
+ DSSAREA = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Fixup area if default (0/0/0/0).
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ LDEFIN = ( (NORTH.EQ.0).AND.(WEST.EQ.0).AND.
+ X (SOUTH.EQ.0).AND.(EAST.EQ.0) )
+C
+ IF( LDEFIN ) THEN
+C
+ IF( .NOT.LGAUSS ) THEN
+C
+C Regular lat/long grid ..
+C
+ NORTH = 90.0
+ WEST = 0
+ SOUTH = -NORTH
+ EAST = 360.0 - EW
+C
+ ELSE IF( LSPHERE ) THEN
+C
+C Spherical harmonics
+C
+ NORTH = 90.0
+ WEST = 0
+ SOUTH = -90.0
+ EAST = 360.0
+C
+C
+ ELSE
+C
+C Gaussian grid ..
+C
+ INORTH = JNORSGG( 90.0, RGAUSS, NGAUSS, 0)
+ NORTH = RGAUSS(INORTH)
+ WEST = 0
+ ISOUTH = JNORSGG( -90.0, RGAUSS, NGAUSS, 1)
+ SOUTH = RGAUSS(ISOUTH)
+ EAST = 360.0 - 90.0/REAL(NGAUSS)
+ ENDIF
+C
+ GOTO 900
+ ENDIF
+C
+ IF( LSPHERE ) GOTO 900
+C
+C Don't fixup area for ocean products
+C
+ IF( NILOCAL.EQ.4 ) GOTO 900
+C
+C -----------------------------------------------------------------|
+C* Section 3. Fixup west-east area to correspond to the grid.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( EAST.GT.360.0.AND.EAST.LT.361.0 ) THEN
+ CALL INTLOGR(JP_WARN,
+ X 'DSSAREA: Faulty East lon limits', EAST)
+ EAST = 360.0
+ CALL INTLOGR(JP_WARN,
+ X 'DSSAREA: Changed East to', EAST)
+ ENDIF
+c
+ IF( (WEST.LT.-360.0).OR.(WEST.GT.360.0).OR.
+ X (EAST.LT.-360.0).OR.(EAST.GT.360.0) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'DSSAREA: Faulty input langitude limits', JPQUIET)
+ CALL INTLOGR(JP_ERROR,'DSSAREA: West = ', WEST)
+ CALL INTLOGR(JP_ERROR,'DSSAREA: East = ', EAST)
+ NORTH = ONORTH
+ SOUTH = OSOUTH
+ WEST = OWEST
+ EAST = OEAST
+ DSSAREA = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ IF( .NOT. LGAUSS ) THEN
+C
+C Regular lat/long grid only ..
+C
+ DEW = JPDISTP * RRMULT
+ IEW = DNINT( DBLE(DEW) )
+ RESEW = EW
+C
+ ELSE
+C
+C Gaussian grid ..
+C
+ DEW = DBLE(NP90) / DBLE(NGAUSS)
+ IEW = DNINT( DBLE(DEW) )
+ RESEW = DBLE(NR90) / DBLE(NGAUSS)
+C
+ ENDIF
+C
+C Ensure West < East
+C
+ IF( WEST.GT.EAST ) WEST = WEST - 360.0
+ DWEST = WEST
+ IWEST = DNINT( DBLE(DWEST * RRMULT) )
+C
+C Find west boundary to nearest dissemination gridpoint eastwards.
+C From this value, calculate the east limit using the requested
+C grid increment.
+C
+ IF( IWEST.GT.0 ) THEN
+ NWEST = DINT(DBLE(IWEST + IEW - 1) / DEW)
+ IWEST = DNINT(DBLE(NWEST) * DEW)
+ ELSE
+ NWEST = DINT(DBLE(-IWEST) / DEW)
+ IWEST = DNINT(DBLE(-NWEST) * DEW)
+ ENDIF
+C
+ DWEST = DBLE(IWEST)/RRMULT
+C
+ DEAST = EAST
+C
+ NWEPTS = NINT( (DEAST - DWEST) / RESEW )
+ DEAST = DWEST + (NWEPTS*RESEW)
+ IF( GREATER(DEAST,EAST) ) DEAST = DEAST - RESEW
+ CALL INTLOGR(JP_DEBUG,'DSSAREA: calculated west = ', DWEST)
+ CALL INTLOGR(JP_DEBUG,'DSSAREA: calculated east = ', DEAST)
+ IEAST = DNINT( DBLE(DEAST * RRMULT) )
+C
+C Try to catch special case: global west-east with wrap-around.
+C
+ IF( (IEAST-IWEST).GE.NP360 ) THEN
+ IF( LGAUSS) THEN
+ IEAST = IWEST + (4*NGAUSS-1)*RESEW*RRMULT
+ ELSE
+ IEAST = IWEST + NP360 - RESEW*RRMULT
+ ENDIF
+ ENDIF
+C
+C Ensure East and West still in range (0,360)
+C
+ IF( IEAST.GT.NP360 ) THEN
+ IEAST = IEAST - NP360
+ IWEST = IWEST - NP360
+ ENDIF
+ IF( IWEST.LT.-NP360 ) THEN
+ IEAST = IEAST + NP360
+ IWEST = IWEST + NP360
+ ENDIF
+C
+C Ensure East-West spread is not greater than 360
+C
+ IF( (IEAST-IWEST).GT.NP360 ) THEN
+ IF( LGAUSS) THEN
+ IEAST = IWEST + (4*NGAUSS-1)*IEW
+ ELSE
+ IEAST = IWEST + NP360 - IEW
+ ENDIF
+ ENDIF
+C
+C Apply adjustment when east and west boundaries are the same
+C longitude (0/360) to give a global grid.
+C
+ IF( ( (IWEST.EQ.-NP360).AND.(IEAST.EQ.0) ) .OR.
+ X ( (IWEST.EQ.0) .AND.(IEAST.EQ.NP360) ) .OR.
+ X ( (IWEST.EQ.NP360) .AND.(IEAST.EQ.NP360) ) ) THEN
+ IWEST = 0
+ IF( LGAUSS) THEN
+ IEAST = (4*NGAUSS-1)*IEW
+ ELSE
+ IEAST = NP360 - IEW
+ ENDIF
+ ENDIF
+C
+ DWEST = DBLE(IWEST) / RRMULT
+ DEAST = DBLE(IEAST) / RRMULT
+ WEST = DBLE(IWEST) / RRMULT
+ EAST = DBLE(IEAST) / RRMULT
+C
+ IF( (EAST.LT.WEST).OR.(EAST.GT.360.0) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'DSSAREA: Faulty calculated longitude limits', JPQUIET)
+ CALL INTLOGR(JP_ERROR,'DSSAREA: East = ', EAST)
+ CALL INTLOGR(JP_ERROR,'DSSAREA: West = ', WEST)
+ NORTH = ONORTH
+ SOUTH = OSOUTH
+ WEST = OWEST
+ EAST = OEAST
+ DSSAREA = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4. Fixup north-south area to correspond to the grid.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ IF( NORTH.LT.SOUTH ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'DSSAREA: Faulty input latitude limits', JPQUIET)
+ CALL INTLOGR(JP_ERROR,'DSSAREA: North = ', NORTH)
+ CALL INTLOGR(JP_ERROR,'DSSAREA: South = ', SOUTH)
+ DSSAREA = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+cs
+ IF( NORTH.GT.90.0 ) THEN
+ CALL INTLOGR(JP_WARN,
+ X 'DSSAREA: Faulty North lat limits', NORTH)
+ NORTH = 90.0
+ CALL INTLOGR(JP_WARN,
+ X 'DSSAREA: Changed North to', NORTH)
+ ENDIF
+cs
+ IF( SOUTH.LT.-90.0 ) THEN
+ CALL INTLOGR(JP_WARN,
+ X 'DSSAREA: Faulty South lat limits', SOUTH)
+ SOUTH = -90.0
+ CALL INTLOGR(JP_WARN,
+ X 'DSSAREA: Changed South to', SOUTH)
+ ENDIF
+
+ IF( .NOT.LGAUSS ) THEN
+C
+C Regular lat/long grid only ..
+C
+ DNS = JPDISTP * RRMULT
+ INS = DNINT( DBLE(DNS) )
+C
+C Find north boundary to nearest dissemination gridpoint south.
+C From this value, calculate the south limit using the requested
+C grid increment.
+C
+ DNORTH = NORTH
+ INORTH = DNINT( DBLE(DNORTH * RRMULT) )
+ IF( INORTH.GE.0 ) THEN
+ INORTH = INORTH / INS
+ ELSE
+ INORTH = (INORTH-INS+1) / INS
+ ENDIF
+ INORTH = INORTH * INS
+ IF( INORTH .GT. NP90 ) INORTH = NP90
+ IF( INORTH .LT. -NP90 ) INORTH = -NP90
+ NORTH = DBLE(INORTH) / RRMULT
+C
+ DNORTH = NORTH
+ DSOUTH = SOUTH
+ NNSPTS = NINT( (DNORTH - DSOUTH) / NS )
+ DSOUTH = DNORTH - (NNSPTS* NS)
+ IF( SMALLER(DSOUTH,SOUTH) ) DSOUTH = DSOUTH + NS
+ CALL INTLOGR(JP_DEBUG,'DSSAREA: calculated north = ', DNORTH)
+ CALL INTLOGR(JP_DEBUG,'DSSAREA: calculated south = ', DSOUTH)
+ ISOUTH = DNINT( DBLE(DSOUTH * RRMULT) )
+
+ IF( ISOUTH .GT. NP90 ) ISOUTH = NP90
+ IF( ISOUTH .LT. -NP90 ) ISOUTH = -NP90
+ SOUTH = DBLE(ISOUTH) / RRMULT
+C
+ ELSE
+C
+C Gaussian grid ..
+C
+C Round north boundary to nearest gridpoint southwards.
+C
+ RNORTH = NORTH
+ INORTH = JNORSGG( RNORTH, RGAUSS, NGAUSS, 0)
+ NORTH = RGAUSS(INORTH)
+C
+C Round south boundary to nearest gridpoint northwards.
+C
+ RSOUTH = SOUTH
+ ISOUTH = JNORSGG( RSOUTH, RGAUSS, NGAUSS, 1)
+ SOUTH = RGAUSS(ISOUTH)
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/dummy.F b/interpolation/dummy.F
new file mode 100755
index 0000000..98672e1
--- /dev/null
+++ b/interpolation/dummy.F
@@ -0,0 +1,18 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE DUMMY()
+C---->
+C
+C Dummy routine to satisfy makefile.
+C
+C----<
+ RETURN
+ END
diff --git a/interpolation/dummy2.F b/interpolation/dummy2.F
new file mode 100755
index 0000000..5d64c87
--- /dev/null
+++ b/interpolation/dummy2.F
@@ -0,0 +1,18 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE DUMMY2()
+C---->
+C
+C Dummy routine to satisfy makefile.
+C
+C----<
+ RETURN
+ END
diff --git a/interpolation/emosPrecision.c b/interpolation/emosPrecision.c
new file mode 100755
index 0000000..64a1918
--- /dev/null
+++ b/interpolation/emosPrecision.c
@@ -0,0 +1,24 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+int emosPrecision() {
+/*
+// Returns:
+// 64 if double-precision (64-bit) option has been used for REALs,
+// 64 if compiled on CRAY, (REALs are at least 64-bit precision),
+// 32 otherwise.
+*/
+#ifdef REAL_8
+ return (64);
+#else
+ return (32);
+#endif
+}
diff --git a/interpolation/estima.F b/interpolation/estima.F
new file mode 100755
index 0000000..63b9474
--- /dev/null
+++ b/interpolation/estima.F
@@ -0,0 +1,150 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION ESTIMA()
+C---->
+C**** ESTIMA
+C
+C Purpose
+C -------
+C
+C Calculate size of scratch space required for output field of
+C interpolation.
+C
+C
+C Interface
+C ---------
+C
+C ISIZE = ESTIMA()
+C
+C
+C Input
+C -----
+C
+C Values in common blocks "nofld.common".
+C
+C
+C Output
+C ------
+C
+C Size as number of values (words).
+C Returns 0 if output type not recognised.
+C
+C
+C Method
+C ------
+C
+C Depends on output grid type.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message
+C JNORSGG - Calculate gaussian latitude
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Feb 1995
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+C
+C Local variables
+C
+ INTEGER LOOP
+ REAL PNORTH, PWEST, PSOUTH, PEAST, GRID, TEMP
+C
+C Externals
+C
+ EXTERNAL JNORSGG, NUMPTWE
+ INTEGER JNORSGG, NUMPTWE
+C
+C Statement functions
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ ESTIMA = 0
+C
+C -----------------------------------------------------------------|
+C* Section 2. Spherical harmonic field
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( (NOREPR.EQ.JPSPHERE).OR.
+ X (NOREPR.EQ.JPSTRSH).OR.
+ X (NOREPR.EQ.JPSPHROT) ) THEN
+cs ESTIMA = (NORESO+1) * (NORESO+4)
+ ESTIMA = (NORESO+1) * (NORESO+2)
+ CALL INTLOG(JP_DEBUG,'ESTIMA: spherical harmonic = ',ESTIMA)
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 5. gaussian field
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+ IF(NOGAUSS.GT.0) THEN
+ ESTIMA = NOGAUSS * NOGAUSS * 8
+ CALL INTLOG(JP_DEBUG,'ESTIMA: Gaussian Number = ', NOGAUSS)
+ CALL INTLOG(JP_DEBUG,'ESTIMA: any gaussian= ',ESTIMA)
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Regular lat/long field
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( (NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT) ) THEN
+C
+C
+cs print*,'NOGRID(1) ',NOGRID(1),' NOGRID(2) ',NOGRID(2)
+cs ESTIMA = NINT((JP360/NOGRID(1) + 1) * (JP180 / NOGRID(2) + 1))
+ ESTIMA = (JP360/NOGRID(1) + 1) * (JP180 / NOGRID(2) + 1)
+ CALL INTLOG(JP_DEBUG,'ESTIMA: Regular lat/long = ',ESTIMA)
+ ENDIF
+
+ IF(NILOCAL.EQ.4) THEN
+ IF(NOGRID(1).GT.0.AND.NOGRID(1).GT.0) THEN
+ ESTIMA = (JP360/NOGRID(1) + 1) * (JP180 / NOGRID(2) + 1)*2
+ ELSE
+ ESTIMA = 36099382
+ ENDIF
+ CALL INTLOG(JP_DEBUG,'ESTIMA: OCEAN field = ',ESTIMA)
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'ESTIMA: number of points in output field = ',ESTIMA)
+C
+ RETURN
+ END
diff --git a/interpolation/eulavgg.F b/interpolation/eulavgg.F
new file mode 100755
index 0000000..f8725f1
--- /dev/null
+++ b/interpolation/eulavgg.F
@@ -0,0 +1,145 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE EULAVGG(NEWFLD, NEXT, INROW, RLAT, RLON,
+ X POLELAT, POLELON, FIELD, NGAUSS, TYPE)
+C
+C---->
+C**** EULAVGG
+C
+C PURPOSE
+C _______
+C
+C Generates values along a latitude in a rotated gaussian grid.
+C (reverses the operations carried out by GGVALUE).
+C
+C INTERFACE
+C _________
+C
+C CALL EULAVGG(NEWFLD, NEXT, INROW, RLAT, RLON,
+C X POLELAT, POLELON, FIELD, NGAUSS, TYPE)
+C
+C
+C Input parameters
+C ________________
+C
+C NEWFLD - the field of values being created
+C NEXT - start offset of the latitude row being created
+C INROW - the number of points in the latitude row
+C RLAT = target point latitude in the rotated grid
+C RLON = target point longitude in the rotated grid
+C POLELAT = latitude of the rotated South Pole
+C POLELON = longitude of the rotated South Pole
+C FIELD = original unrotated gaussian field values
+C NGAUSS = original unrotated gaussian field number
+C TYPE = original unrotated gaussian field type
+C = 'F' for full (regular) gaussian field
+C = 'R' for reduced (quasi) gaussian field
+C
+C Output parameters
+C ________________
+C
+C NEWFLD(NEXT) to NEWFLD(NEXT+INROW-1) contains the latitude row
+C values.
+C
+C
+C METHOD
+C ______
+C
+C Rotates the lat/long positions of points along the latitude row
+C in a rotated gaussian grid back to positions in the unrotated grid
+C and then interpolates vsalue from the original grid.
+C
+C
+C EXTERNALS
+C _________
+C
+C LL2XYZ - Converts a latitude/longitude position to (x,y,z)
+C wrt axes through the centre of the globe. The z-axis
+C runs from the south to north pole. The x- and y-axes
+C are in the plane of the equator with the x-axis
+C pointing out through lat/long (0,0).
+C YROTATE - Rotates the globe about the y-axis.
+C XYZ2LL - Converts an (x,y,z) position to a latitude/longitude.
+C GGINTRP - Interpolates a value from an existing grid.
+C
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C
+C COMMENTS
+C ________
+C
+C The input field is assumed to be global in extent, and a known
+C definition, either N160 or N80 (reduced or regular).
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF April 1996
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+C Function arguments
+ REAL NEWFLD, RLAT, RLON, POLELAT, POLELON, FIELD
+ DIMENSION NEWFLD(*), RLON(*), FIELD(*)
+ INTEGER NEXT, INROW, NGAUSS
+ CHARACTER*1 TYPE
+C
+C Parameters
+ INTEGER JPMAXGG
+ PARAMETER( JPMAXGG = 1280 )
+C
+C Local variables
+ REAL X(JPMAXGG), Y(JPMAXGG), Z(JPMAXGG)
+ REAL RX(JPMAXGG),RY(JPMAXGG),RZ(JPMAXGG)
+ REAL OLAT(JPMAXGG),OLON(JPMAXGG)
+ INTEGER LOOP
+C
+C Adjust the target row points longitude to add back the longitude
+C rotation
+ DO LOOP = 1, INROW
+ OLON(LOOP) = RLON(LOOP) - POLELON
+ IF( OLON(LOOP).LT.0.0 ) OLON(LOOP) = OLON(LOOP) + 360.0
+ IF( OLON(LOOP).GE.360.0 ) OLON(LOOP) = OLON(LOOP) - 360.0
+ ENDDO
+C
+C Convert the target row points lat/long to (x,y,z) coordinates
+ CALL LL2XYZ(RLAT,OLON,X,Y,Z,INROW)
+C
+C Rotate the target row points forward through the original latitude
+C rotation
+ CALL YROTATE((90.0+POLELAT),X,Y,Z,RX,RY,RZ,INROW)
+C
+C Convert the target row points adjusted (x,y,z) coordinates to
+C lat/long in the original grid (after longitude rotation)
+ CALL XYZ2LL(RX,RY,RZ,OLAT,OLON,INROW)
+C
+C Interpolate the rotated grid to the target row points
+ CALL GGINTRP(NEWFLD,NEXT,INROW,OLAT,OLON,FIELD,NGAUSS,TYPE)
+C
+ RETURN
+ END
diff --git a/interpolation/fft99.F b/interpolation/fft99.F
new file mode 100755
index 0000000..caf38cf
--- /dev/null
+++ b/interpolation/fft99.F
@@ -0,0 +1,330 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE FFT99(A,WORK,TRIGS,IFAX,INC,JUMP,N,LOT,ISIGN)
+C
+C---->
+C**** FFT99
+C
+C PURPOSE
+C _______
+C
+C Multiple fast real periodic transform.
+C
+C
+C INTERFACE
+C _________
+C
+C CALL FFT99(A,WORK,TRIGS,IFAX,INC,JUMP,N,LOT,ISIGN)
+C
+C
+C Input parameters
+C ________________
+C
+C A - the array containing input data
+C WORK - an area of size (N+1)*MIN(LOT,64)
+C TRIGS - a previously prepared list of trig function values
+C IFAX - a previously prepared list of factors of N
+C INC - the increment within each data 'vector'
+C (e.g. INC=1 for consecutively stored data)
+C JUMP - the increment between the start of each data vector
+C N - the length of the data vectors
+C LOT - the number of data vectors
+C ISIGN - +1 for transform from spectral to gridpoint
+C - -1 for transform from gridpoint to spectral
+C
+C Output parameters
+C ________________
+C
+C A - the array containing output data
+C
+C
+C Method
+C ______
+C
+C Ordering of coefficients:
+C A(0),B(0),A(1),B(1),A(2),B(2),...,A(N/2),B(N/2)
+C where B(0) = B(N/2)=0; (N+2) locations required
+C
+C Ordering of data:
+C X(N-1),X(0),X(1),X(2),...,X(N-1),X(0)
+C i.e. explicit cyclic continuity; (N+2) locations required
+C
+C Vectorization is achieved by doing the transforms in parallel
+C
+C N must be composed of factors 2,3 & 5 but does not have to be even
+C
+C
+C Real transform of length N performed by removing redundant
+C operations from complex transform of length N
+C Definition of transforms:
+C
+C ISIGN = +1:
+C X(J) = SUM(K=0,...,N-1)(C(K)*EXP(2*I*J*K*PI/N))
+C where C(K) = A(K)+I*B(K) and C(N-K) = A(K)-I*B(K)
+C
+C ISIGN = -1:
+C A(K) = (1/N)*SUM(J=0,...,N-1)(X(J)*COS(2*J*K*PI/N))
+C B(K) = -(1/N)*SUM(J=0,...,N-1)(X(J)*SIN(2*J*K*PI/N))
+C
+C Externals
+C _________
+C
+C RPASSM - Performs one pass through data as part of multiple real
+C FFT (fourier analysis) routine.
+C QPASSM - Performs one pass through data as part of multiple real
+C FFT (fourier synthesis) routine.
+C
+C
+C Reference
+C _________
+C
+C None.
+C
+C
+C Comments
+C ________
+C
+C Tidy up of code in older version of same routine.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Nov 1996
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+ REAL A, WORK, TRIGS
+ INTEGER IFAX, INC, JUMP, N, LOT, ISIGN
+ DIMENSION A(N),WORK(N),TRIGS(N),IFAX(10)
+C
+C Local variables
+ INTEGER NFAX, NX, NBLOX, NVEX, ISTART, NB, IA, I, J
+ INTEGER LA, IGO, K, IFAC, IERR, IBASE, JBASE, JJ, II
+ INTEGER IX, IZ
+C
+C ------------------------------------------------------------------
+C Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Ensure factorization of N has been done.
+ IF(IFAX(10).NE.N) CALL SET99(TRIGS,IFAX,N)
+C
+ NFAX = IFAX(1)
+ IF (MOD(N,2).EQ.1) THEN
+ NX = N
+ ELSE
+ NX = N + 1
+ ENDIF
+C
+C Calculate number of blocks of 64 vectors and number of vectors
+C 'left over'. This remainder is transformed first.
+C
+ NBLOX = 1 + (LOT-1)/64
+ NVEX = LOT-(NBLOX-1)*64
+C
+ IF (ISIGN.EQ.1) THEN
+C
+C ------------------------------------------------------------------
+C Section 2. Spectral to gridpoint transform.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Loop through the blocks of vectors
+ ISTART = 1
+ DO 270 NB = 1,NBLOX
+ IA = ISTART
+ I = ISTART
+ DO 210 J = 1,NVEX
+ A(I+INC) = 0.5*A(I)
+ I = I + JUMP
+ 210 CONTINUE
+C
+ IF (MOD(N,2).NE.1) THEN
+ I = ISTART + N*INC
+ DO 220 J = 1,NVEX
+ A(I) = 0.5*A(I)
+ I = I + JUMP
+ 220 CONTINUE
+ ENDIF
+C
+ IA = ISTART + INC
+ LA = 1
+ IGO = 1
+C
+C Work through the factors
+ DO 230 K = 1,NFAX
+ IFAC = IFAX(K+1)
+ IERR = -1
+ IF (IGO.NE.-1) THEN
+ CALL RPASSM(A(IA),A(IA+LA*INC),WORK(1),WORK(IFAC*LA+1),
+ X TRIGS,INC,1,JUMP,NX,NVEX,N,IFAC,LA,IERR)
+ ELSE
+ CALL RPASSM(WORK(1),WORK(LA+1),A(IA),A(IA+IFAC*LA*INC),
+ X TRIGS,1,INC,NX,JUMP,NVEX,N,IFAC,LA,IERR)
+ ENDIF
+C
+ IF (IERR.NE.0) GO TO 950
+C
+ LA = IFAC*LA
+ IGO = -IGO
+ IA = ISTART + INC
+ 230 CONTINUE
+C
+C If necessary, copy results back to A
+C
+ IF (MOD(NFAX,2).NE.0) THEN
+ IBASE = 1
+ JBASE = IA
+ DO 250 JJ = 1,NVEX
+ I = IBASE
+ J = JBASE
+ DO 240 II = 1,N
+ A(J) = WORK(I)
+ I = I + 1
+ J = J + INC
+ 240 CONTINUE
+ IBASE = IBASE + NX
+ JBASE = JBASE + JUMP
+ 250 CONTINUE
+ ENDIF
+C
+C Fill in cyclic boundary values (ie repeat the data vector
+C end points at opposite end of the vector)
+C
+ IX = ISTART
+ IZ = ISTART + N*INC
+CDIR$ IVDEP
+ DO 260 J = 1,NVEX
+ A(IX) = A(IZ)
+ A(IZ+INC) = A(IX+INC)
+ IX = IX + JUMP
+ IZ = IZ + JUMP
+ 260 CONTINUE
+C
+C Adjust pointers for next block
+ ISTART = ISTART + NVEX*JUMP
+ NVEX = 64
+ 270 CONTINUE
+C
+ ELSE
+C
+C ------------------------------------------------------------------
+C Section 3. Gridpoint to spectral transform.
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C Loop through the blocks of vectors
+ ISTART = 1
+ DO 390 NB = 1,NBLOX
+ IA = ISTART + INC
+ LA = N
+ IGO = 1
+C
+ DO 310 K = 1,NFAX
+ IFAC = IFAX(NFAX+2-K)
+ LA = LA/IFAC
+ IERR = -1
+ IF (IGO.NE.-1) THEN
+ CALL QPASSM(A(IA),A(IA+IFAC*LA*INC),WORK(1),WORK(LA+1),
+ X TRIGS,INC,1,JUMP,NX,NVEX,N,IFAC,LA,IERR)
+ ELSE
+ CALL QPASSM(WORK(1),WORK(IFAC*LA+1),A(IA),A(IA+LA*INC),
+ X TRIGS,1,INC,NX,JUMP,NVEX,N,IFAC,LA,IERR)
+ ENDIF
+ IF (IERR.NE.0) GO TO 950
+ IGO = -IGO
+ IA = ISTART + INC
+ 310 CONTINUE
+C
+C If necessary, copy results back to A
+C
+ IF (MOD(NFAX,2).NE.0) THEN
+ IBASE = 1
+ JBASE = IA
+ DO 330 JJ = 1,NVEX
+ I = IBASE
+ J = JBASE
+ DO 320 II = 1,N
+ A(J) = WORK(I)
+ I = I + 1
+ J = J + INC
+ 320 CONTINUE
+ IBASE = IBASE + NX
+ JBASE = JBASE + JUMP
+ 330 CONTINUE
+ ENDIF
+C
+C Shift A(0) and fill in zero imaginary parts
+C
+ IX = ISTART
+ DO 340 J = 1,NVEX
+ A(IX) = A(IX+INC)
+ A(IX+INC) = 0.0
+ IX = IX + JUMP
+ 340 CONTINUE
+C
+ IF (MOD(N,2).NE.1) THEN
+ IZ = ISTART + (N+1)*INC
+ DO 350 J = 1,NVEX
+ A(IZ) = 0.0
+ IZ = IZ + JUMP
+ 350 CONTINUE
+C
+ ENDIF
+C
+C Adjust pointers for next block
+ ISTART = ISTART + NVEX*JUMP
+ NVEX = 64
+ 390 CONTINUE
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+C Error messages
+C
+ 950 CONTINUE
+ GO TO (960,970,980) IERR
+C
+ 960 CONTINUE
+ WRITE(*,*) 'Vector length greater than 64, = ', NVEX
+ GO TO 900
+ 970 CONTINUE
+ WRITE(*,*) 'Factor not handled, =', IFAC
+ GO TO 900
+ 980 CONTINUE
+ WRITE(*,*) 'Factor only handled if LA*IFAC=N. Factor = ', IFAC
+C
+ END
diff --git a/interpolation/fftchk.c b/interpolation/fftchk.c
new file mode 100755
index 0000000..dccd8c7
--- /dev/null
+++ b/interpolation/fftchk.c
@@ -0,0 +1,63 @@
+/**
+* Copyright 1981-2012 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 "fortint.h"
+
+#ifndef CRAY
+#ifdef FORTRAN_NO_UNDERSCORE
+#define FFTCHK fftchk
+#else
+#define FFTCHK fftchk_
+#endif
+#endif
+
+#ifdef REAL_8
+fortint FFTCHK(fortint * trunc, double * longinc)
+#else
+fortint FFTCHK(fortint * trunc, float * longinc)
+#endif
+{
+/* Checks if the given truncation and longitude increment can be handled
+ by the FFT routine used in the interpolation scheme.
+
+ Returns 1 if it can, otherwise 0.
+
+ For calculation purposes, the number of longitude points has to be
+ greater than 2*(output truncation) to ensure that the fourier
+ transform is exact. For more information see page 10 in:
+
+ E.C.M.W.F. Research Department technical memorandum no. 56
+ "The forecast and analysis post-processing package"
+ May 1982. J.Haseler.
+
+*/
+long nlonpts = (long) ( (360.0/(*longinc)) + 0.5 );
+
+/* Set number of longitude points > 2*truncation */
+ while( nlonpts < 2*(*trunc) ) nlonpts *= 2;
+
+/* Look for allowed factors: 8, 6, 5, 4 ,3 , 2 */
+
+/* Check 6 first */
+ while( nlonpts%6 == 0 ) nlonpts /= 6;
+
+/* 8 only allowed once as a factor */
+ if( nlonpts%8 == 0 ) nlonpts /= 8;
+
+ while( nlonpts%5 == 0 ) nlonpts /= 5;
+ while( nlonpts%4 == 0 ) nlonpts /= 4;
+ while( nlonpts%3 == 0 ) nlonpts /= 3;
+ while( nlonpts%2 == 0 ) nlonpts /= 2;
+
+ if( nlonpts != 1) return (fortint) 0;
+
+ return (fortint) 1;
+}
diff --git a/interpolation/fixarea.F b/interpolation/fixarea.F
new file mode 100755
index 0000000..0b53422
--- /dev/null
+++ b/interpolation/fixarea.F
@@ -0,0 +1,513 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION FIXAREA( )
+C
+C---->
+C**** FIXAREA
+C
+C Purpose
+C -------
+C
+C Fixup input/output field area definitions.
+C
+C
+C Interface
+C ---------
+C
+C IRET = FIXAREA( )
+C
+C Input
+C -----
+C
+C None.
+C
+C
+C Output
+C ------
+C
+C None.
+C
+C
+C Method
+C ------
+C
+C If default (0/0/0/0) selected for input, input area is set
+C - to global for spherical harmonics
+C - to global for lat/long grid
+C - to global for gaussian grid
+C
+C If default (0/0/0/0) selected for output, output area is set
+C - to same as input area for lat/long grid
+C - to same as input area for regular gaussian grid
+C - to global for reduced gaussian grid
+C
+C (Currently, subareas are not supported for reduced gaussian fields.
+C Should work OK; but need to correct setup of values in GRIB
+C product for number of points in each latitude row)
+C
+C Output area is adjusted to fit the given grid step.
+C
+C
+C Externals
+C ---------
+C
+C AREACHK - Match input/output field area definitions according to
+C grid specification.
+C GETENV - Get value of an environment variable
+C INTLOG - Logs output messages
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Jan 1995
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 19200 )
+C
+C Local variables
+C
+ INTEGER INORTH, ISOUTH, IEAST
+ INTEGER ITEMP, IRET
+ REAL EW, NS, NORTH, SOUTH, EAST, WEST, FACTOR3, FACTOR4
+ LOGICAL LDEFIN, LDEFOUT, LGLOBAL, LOVERDE
+ CHARACTER*20 OVERIDE
+ INTEGER IBLANK
+C
+C Externals
+C
+ INTEGER AREACHK
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+ FIXAREA = 0
+ LGLOBAL = .FALSE.
+C
+C ------------------------------------------------------------------
+C* Section 2. Fixup input area if default (0/0/0/0).
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Fixup input ocean area definition
+C
+ IF( NILOCAL.EQ.4 ) THEN
+ FACTOR3 = 0.0
+ FACTOR4 = 0.0
+C
+ IF( NIFORM.EQ.1 ) THEN
+ IF( ISEC1(60).EQ.1 ) FACTOR3 = 1.0
+ IF( ISEC1(60).EQ.2 ) THEN
+ IF( ISEC1(47).EQ.160 ) FACTOR3 = 1000.0
+ ENDIF
+ IF( ISEC1(60).EQ.3 ) FACTOR3 = 1000000.0
+ IF( ISEC1(60).EQ.4 ) FACTOR3 = 1000000.0
+C
+ IF( ISEC1(61).EQ.1 ) FACTOR4 = 1.0
+ IF( ISEC1(61).EQ.2 ) THEN
+ IF( ISEC1(47).EQ.160 ) FACTOR4 = 1000.0
+ ENDIF
+ IF( ISEC1(61).EQ.3 ) FACTOR4 = 1000000.0
+ IF( ISEC1(61).EQ.4 ) FACTOR4 = 1000000.0
+C
+ IF( (FACTOR3.EQ.0).OR.(FACTOR4.EQ.0) ) THEN
+ FIXAREA = 2
+ GOTO 900
+ ENDIF
+ NORTH = REAL(ISEC1(62))/FACTOR4
+ WEST = REAL(ISEC1(63))/FACTOR3
+ SOUTH = REAL(ISEC1(64))/FACTOR4
+ EAST = REAL(ISEC1(65))/FACTOR3
+ ELSE
+ IF( NIOCO3.EQ.1 ) FACTOR3 = 1.0
+ IF( NIOCO3.EQ.2 ) THEN
+ IF( NIVCDEF.EQ.160 ) FACTOR3 = 1000.0
+ ENDIF
+ IF( NIOCO3.EQ.3 ) FACTOR3 = 1000000.0
+ IF( NIOCO3.EQ.4 ) FACTOR3 = 1000000.0
+C
+ IF( NIOCO4.EQ.1 ) FACTOR4 = 1.0
+ IF( NIOCO4.EQ.2 ) THEN
+ IF( NIVCDEF.EQ.160 ) FACTOR4 = 1000.0
+ ENDIF
+ IF( NIOCO4.EQ.3 ) FACTOR4 = 1000000.0
+ IF( NIOCO4.EQ.4 ) FACTOR4 = 1000000.0
+C
+ IF( (FACTOR3.EQ.0).OR.(FACTOR4.EQ.0) ) THEN
+ FIXAREA = 2
+ GOTO 900
+ ENDIF
+ NORTH = REAL(NIOCO4F)/FACTOR4
+ WEST = REAL(NIOCO3F)/FACTOR3
+ SOUTH = REAL(NIOCO4L)/FACTOR4
+ EAST = REAL(NIOCO3L)/FACTOR3
+ ENDIF
+ NIAREA(1) = NINT( NORTH * PPMULT + 0.1)
+ NIAREA(2) = NINT( WEST * PPMULT + 0.1)
+ NIAREA(3) = NINT( SOUTH * PPMULT + 0.1)
+ NIAREA(4) = NINT( EAST * PPMULT + 0.1)
+ GOTO 300
+ ENDIF
+C
+C Sinisa bug fix for grid global fields
+C If input is lat/lon, check if it is global to within
+C a tolerance of 0.1 degrees
+ IF ( NIREPR .EQ. JPREGULAR ) THEN
+ IF ( NIAREA(4).GT.0 ) THEN
+ IEAST = NIAREA(4)
+ ELSE
+ IEAST = JP360 + NIAREA(4)
+ ENDIF
+ IF(NIAREA(1).EQ.JP90.AND.NIAREA(3).EQ.-JP90.AND.
+ X NIAREA(2).EQ.0.AND.
+ X IABS(JP360 - IEAST - NIGRID(1)).LT.1000) THEN
+ NIAREA(1) = 0.
+ NIAREA(2) = 0.
+ NIAREA(3) = 0.
+ NIAREA(4) = 0.
+csinisa
+cs ELSEIF(IABS(JP360 - IEAST - NIGRID(1)).LT.1000) THEN
+cs NOAREA(1) = NIAREA(1)
+cs NOAREA(2) = 0
+cs NOAREA(3) = NIAREA(3)
+cs NOAREA(4) = 36000000
+ ENDIF
+ ENDIF
+
+ LDEFIN = ( (NIAREA(1) .EQ. 0) .AND. (NIAREA(2) .EQ. 0) .AND.
+ X (NIAREA(3) .EQ. 0) .AND. (NIAREA(4) .EQ. 0) )
+
+C
+ IF( LDEFIN ) THEN
+C
+ IF ( (NIREPR.EQ.JPSPHERE) .OR. (NIREPR.EQ.JPSPHROT) ) THEN
+C
+C Spectral input ..
+ EW = 0.0
+ NS = 0.0
+C
+ ELSE IF ( NIREPR .EQ. JPREGULAR ) THEN
+C
+C Regular lat/long grid ..
+ EW = FLOAT( NIGRID(1) ) / PPMULT
+ NS = FLOAT( NIGRID(2) ) / PPMULT
+C
+ ELSE
+C
+C Gaussian grid ..
+ EW = FLOAT( NIGAUSS )
+ NS = 0.0
+ ENDIF
+C
+ NORTH = 0.0
+ WEST = 0.0
+ SOUTH = 0.0
+ EAST = 0.0
+ IRET = AREACHK( EW, NS, NORTH, WEST, SOUTH, EAST )
+ IF( IRET.NE.0 ) THEN
+ FIXAREA = IRET
+ GOTO 900
+ ENDIF
+ NIAREA(1) = NINT( NORTH * PPMULT + 0.1)
+ NIAREA(2) = NINT( WEST * PPMULT + 0.1)
+ NIAREA(3) = NINT( SOUTH * PPMULT + 0.1)
+ NIAREA(4) = NINT( EAST * PPMULT + 0.1)
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 3. Fixup output area if default (0/0/0/0).
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C See if environment variable has been specified to override
+C output area specification
+C
+ LOVERDE = .FALSE.
+ CALL GETENV('OVERRIDE_OUTPUT_AREA', OVERIDE)
+ IBLANK = INDEX(OVERIDE, ' ')
+ IF( IBLANK.GT.1 ) THEN
+ IF( OVERIDE(1:2).EQ.'ON' ) THEN
+ LOVERDE = .TRUE.
+ CALL INTLOG(JP_DEBUG,
+ X 'FIXAREA: OVERRIDE_OUTPUT_AREA is ON',JPQUIET)
+ ENDIF
+ ENDIF
+C
+ LDEFOUT = ( (NOAREA(1) .EQ. 0) .AND. (NOAREA(2) .EQ. 0) .AND.
+ X (NOAREA(3) .EQ. 0) .AND. (NOAREA(4) .EQ. 0) )
+ X .OR. LOVERDE
+C
+C Fixup output ocean area definition
+C
+ IF( NILOCAL.EQ.4 ) THEN
+ IF( LDEFOUT ) THEN
+ IF( NIFORM.EQ.1 ) THEN
+ SOUTH = REAL(ISEC1(64))/FACTOR4
+ NORTH = REAL(ISEC1(62))/FACTOR4
+ WEST = REAL(ISEC1(63))/FACTOR3
+ EAST = REAL(ISEC1(65))/FACTOR3
+
+ EW = FLOAT( NOGRID(1) ) / PPMULT
+ NS = FLOAT( NOGRID(2) ) / PPMULT
+
+ IF( ISEC1(60).EQ.3 ) THEN
+ WEST = 0.0
+ EAST = 360.0
+ IRET = AREACHK( EW, NS, NORTH, WEST, SOUTH, EAST )
+ IF ( IRET .NE. 0 ) THEN
+ FIXAREA = IRET
+ GOTO 900
+ ENDIF
+ ELSEIF( ISEC1(60).EQ.4 ) THEN
+ WEST = -90.0
+ EAST = 90.0
+ ENDIF
+
+ IF( ISEC1(61).EQ.3 ) THEN
+ SOUTH = 0.0
+ NORTH = 360.0
+ ELSEIF( ISEC1(61).EQ.4 ) THEN
+ SOUTH = -90.0
+ NORTH = 90.0
+ ENDIF
+ ELSE
+ NORTH = REAL(NIOCO4F)/FACTOR4
+ WEST = REAL(NIOCO3F)/FACTOR3
+ SOUTH = REAL(NIOCO4L)/FACTOR4
+ EAST = REAL(NIOCO3L)/FACTOR3
+ EW = FLOAT( NOGRID(1) ) / PPMULT
+ NS = FLOAT( NOGRID(2) ) / PPMULT
+ IF( NIOCO3.EQ.3 ) THEN
+ WEST = 0.0
+ EAST = 360.0
+ IRET = AREACHK( EW, NS, NORTH, WEST, SOUTH, EAST )
+ IF ( IRET .NE. 0 ) THEN
+ FIXAREA = IRET
+ GOTO 900
+ ENDIF
+ ELSEIF( NIOCO3.EQ.4 ) THEN
+ WEST = -90.0
+ EAST = 90.0
+ ENDIF
+
+ IF( NIOCO4.EQ.3 ) THEN
+ SOUTH = 0.0
+ NORTH = 360.0
+ ELSEIF( NIOCO4.EQ.4 ) THEN
+ SOUTH = -90.0
+ NORTH = 90.0
+ ENDIF
+ ENDIF
+
+ NOAREA(1) = NINT( NORTH * PPMULT + 0.1)
+ NOAREA(2) = NINT( WEST * PPMULT + 0.1)
+ NOAREA(3) = NINT( SOUTH * PPMULT + 0.1)
+ NOAREA(4) = NINT( EAST * PPMULT + 0.1)
+ ELSE
+ NORTH = REAL(NOAREA(1)) / PPMULT
+ WEST = REAL(NOAREA(2)) / PPMULT
+ SOUTH = REAL(NOAREA(3)) / PPMULT
+ EAST = REAL(NOAREA(4)) / PPMULT
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+ IF( LDEFOUT ) THEN
+C
+C If input is gaussian, check if it is global to within
+C a tolerance of 0.1 degrees.
+C
+ IF ( (NIREPR.EQ.JPGAUSSIAN) .OR. (NIREPR.EQ.JPQUASI) ) THEN
+ LGLOBAL = .TRUE.
+ INORTH = NINT( RIGAUSS(1) * PPMULT )
+ IF( IABS(NIAREA(1)-INORTH).GT.1000) LGLOBAL = .FALSE.
+ ISOUTH = - INORTH
+ IF( IABS(NIAREA(3)-ISOUTH).GT.1000) LGLOBAL = .FALSE.
+ IF( NIAREA(2).NE.0 ) LGLOBAL = .FALSE.
+C Sinisa added case east less than 0
+ IF ( NIAREA(4).GT.0 ) THEN
+ IEAST = NIAREA(4)
+ ELSE
+ IEAST = JP360 + NIAREA(4)
+ ENDIF
+ IEAST = JP360 - (JP90/NIGAUSS)
+ IF( NIREPR.EQ.JPGAUSSIAN ) THEN
+ IF( IABS(JP360 - IEAST - (JP90/NIGAUSS)).GT.1000)
+ X LGLOBAL = .FALSE.
+ ENDIF
+ ENDIF
+C
+C Spectral output ..
+C
+C .. skip section fitting output area to grid
+C
+ IF ( (NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT) ) GOTO 900
+C
+C Regular lat/long grid ..
+C
+ IF ( (NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT) ) THEN
+ IF( LDEFIN .OR. LGLOBAL.OR.(NIREPR.EQ.JPREDLL) ) THEN
+ EW = FLOAT( NOGRID(1) ) / PPMULT
+ NS = FLOAT( NOGRID(2) ) / PPMULT
+ NORTH = 90.0
+ WEST = 0.0
+ SOUTH = -NORTH
+ EAST = 360.0
+C
+C Use GRIB header values for reduced lat/long grids
+C (maybe 'Mediterranean' sub-area).
+C
+ IF( NIREPR.EQ.JPREDLL ) THEN
+ NORTH = REAL(NIAREA(1))/PPMULT
+ WEST = REAL(NIAREA(2))/PPMULT
+ SOUTH = REAL(NIAREA(3))/PPMULT
+ EAST = REAL(NIAREA(4))/PPMULT
+ ENDIF
+ IRET = AREACHK( EW, NS, NORTH, WEST, SOUTH, EAST )
+ IF ( IRET .NE. 0 ) THEN
+ FIXAREA = IRET
+ GOTO 900
+ ENDIF
+ NOAREA(1) = NINT( NORTH * PPMULT + 0.1)
+ NOAREA(2) = NINT( WEST * PPMULT + 0.1)
+ NOAREA(3) = NINT( SOUTH * PPMULT + 0.1)
+ NOAREA(4) = NINT( EAST * PPMULT + 0.1)
+C
+ ELSE
+ NOAREA(1) = NIAREA(1)
+ NOAREA(2) = NIAREA(2)
+ NOAREA(3) = NIAREA(3)
+ NOAREA(4) = NIAREA(4)
+ ENDIF
+C
+ ENDIF
+C
+C Gaussian ..
+C
+ IF ( (NOREPR.EQ.JPGAUSSIAN) .OR. (NOREPR.EQ.JPQUASI) ) THEN
+C
+C Is output grid specification the same as the input?
+ IF( NIGAUSS.EQ.NOGAUSS) THEN
+ IF( (NOREPR.EQ.JPGAUSSIAN) .AND. LGLOBAL ) THEN
+ NOAREA(1) = JP90
+ NOAREA(2) = 0
+ NOAREA(3) = -JP90
+ NOAREA(4) = JP360 - (JP90/NOGAUSS)
+ ELSE
+ NOAREA(1) = NIAREA(1)
+ NOAREA(2) = NIAREA(2)
+ NOAREA(3) = NIAREA(3)
+ NOAREA(4) = NIAREA(4)
+ ENDIF
+C
+C Skip section fitting output area to grid
+ GOTO 900
+C
+ ELSE
+C
+C Different grid resolutions
+ EW = FLOAT( NOGAUSS )
+ NS = 0.0
+ IF( (NOREPR.EQ.JPGAUSSIAN) .AND. LGLOBAL ) THEN
+ NORTH = 90.0
+ WEST = 0.0
+ SOUTH = -90.0
+ EAST = 360.0 - (360.0/(EW*4.0))
+ ELSE
+ NORTH = FLOAT( NIAREA(1) ) / PPMULT
+ WEST = FLOAT( NIAREA(2) ) / PPMULT
+ SOUTH = FLOAT( NIAREA(3) ) / PPMULT
+ EAST = FLOAT( NIAREA(4) ) / PPMULT
+ ENDIF
+ IRET = AREACHK( EW, NS, NORTH, WEST, SOUTH, EAST )
+ IF ( IRET .NE. 0 ) THEN
+ FIXAREA = IRET
+ GOTO 900
+ ENDIF
+ NOAREA(1) = NINT( NORTH * PPMULT + 0.1)
+ NOAREA(2) = NINT( WEST * PPMULT + 0.1)
+ NOAREA(3) = NINT( SOUTH * PPMULT + 0.1)
+ NOAREA(4) = NINT( EAST * PPMULT + 0.1)
+C
+C If regular lat/long input, check if output west longitude
+C reachs to full globe
+ IF (NIREPR .EQ. JPREGULAR) THEN
+ ITEMP = NIAREA(4)+NIGRID(1)
+ IF ( ITEMP.EQ.JP360 ) NOAREA(4) = JP360 - (JP90/NOGAUSS)
+ ENDIF
+C
+ IF (NIREPR .EQ. JPSPHERE) NOAREA(4) = JP360 - (JP90/NOGAUSS)
+ IF (NIREPR .EQ. JPSPHROT) NOAREA(4) = JP360 - (JP90/NOGAUSS)
+ ENDIF
+ ENDIF
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 4. Now fixup output areas to correspond to the grid.
+C ------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ IF ( (NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT) ) THEN
+C
+C Regular lat/long grid ..
+ EW = FLOAT( NOGRID(1) ) / PPMULT
+ NS = FLOAT( NOGRID(2) ) / PPMULT
+C
+ ELSE
+C
+C Gaussian grid ..
+ EW = FLOAT( NOGAUSS )
+ NS = 0.0
+ ENDIF
+C
+ NORTH = FLOAT( NOAREA(1) ) / PPMULT
+ WEST = FLOAT( NOAREA(2) ) / PPMULT
+ SOUTH = FLOAT( NOAREA(3) ) / PPMULT
+ EAST = FLOAT( NOAREA(4) ) / PPMULT
+ IRET = AREACHK( EW, NS, NORTH, WEST, SOUTH, EAST )
+ IF ( IRET .NE. 0 ) THEN
+ FIXAREA = IRET
+ GOTO 900
+ ENDIF
+ NOAREA(1) = NINT( NORTH * PPMULT + 0.1)
+ NOAREA(2) = NINT( WEST * PPMULT + 0.1)
+ NOAREA(3) = NINT( SOUTH * PPMULT + 0.1)
+ NOAREA(4) = NINT( EAST * PPMULT + 0.1)
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/fortdefs.h b/interpolation/fortdefs.h
new file mode 100755
index 0000000..e74f77c
--- /dev/null
+++ b/interpolation/fortdefs.h
@@ -0,0 +1,22 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef FORTDEFS_H
+#define FORTDEFS_H
+
+#ifdef REAL_8
+#define fortreal long double
+#define fortint int
+#else
+#define fortreal float
+#define fortint int
+#endif
+
+#endif /* end of FORTDEFS_H */
diff --git a/interpolation/fortint.h b/interpolation/fortint.h
new file mode 100755
index 0000000..07e247c
--- /dev/null
+++ b/interpolation/fortint.h
@@ -0,0 +1,22 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifdef INTEGER_IS_INT
+#define fortint int
+#define JPointer int *
+#else
+#if defined hpR64 || defined hpiaR64
+#define fortint long long
+#define JPointer long long *
+#else
+#define fortint long
+#define JPointer long *
+#endif
+#endif
diff --git a/interpolation/freecf.F b/interpolation/freecf.F
new file mode 100755
index 0000000..f79e09f
--- /dev/null
+++ b/interpolation/freecf.F
@@ -0,0 +1,102 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE FREECF(KFLAG)
+C
+C---->
+C**** FREECF
+C
+C PURPOSE
+C _______
+C
+C This routine sets the flag controlling handling of spectral
+C to grid interpolation coefficients memory.
+C
+C
+C INTERFACE
+C _________
+C
+C CALL FREECF(KFLAG)
+C
+C Input parameters
+C ________________
+C
+C KFLAG - Flag indicating whether flushing of memory is done or not
+C = 1 to turn on flushing
+C = any other value to turn off flushing (default)
+C
+C
+C Output parameters
+C ________________
+C
+C None
+C
+C
+C Common block usage
+C __________________
+C
+C JDCSPGP - flag LFREECF
+C
+C
+C Method
+C ______
+C
+C Sets flags LFREECF and NFREECF
+C
+C
+C Externals
+C _________
+C
+C None
+C
+C
+C Reference
+C _________
+C
+C None
+C
+C
+C Comments
+C ________
+C
+C None.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF March 1998
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "jparam2.h"
+C
+C Subroutine arguments
+C
+ INTEGER KFLAG
+C
+ IF( KFLAG.EQ.1 ) THEN
+ LFREECF = .TRUE.
+ NFREECF = 11041967
+ ELSE
+ LFREECF = .FALSE.
+ NFREECF = 11041967
+ ENDIF
+C
+ RETURN
+ END
diff --git a/interpolation/funcs.F b/interpolation/funcs.F
new file mode 100755
index 0000000..beb385f
--- /dev/null
+++ b/interpolation/funcs.F
@@ -0,0 +1,145 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+C---->
+C
+C Functions used in ocean field interpolation.
+C
+C FUNCTION INTDN(XVAL)
+C
+C Rounds XVAL to the largest integer less than or equal to XVAL
+C ie truncates downwards rather than towards zero.
+C
+C FUNCTION LENA(HSTRING)
+C
+C Returns the length of a string, ignoring blank characters at end
+C
+C FUNCTION HDEGS(RVAL)
+C
+C Writes a real number into a string, in a way suitable for degs lat/long.
+C RVAL The real number
+C
+C FUNCTION HMETRES(RVAL)
+C
+C Writes a real number into a string, in a way suitable for metres depth.
+C RVAL The real number
+C
+C----<
+
+ INTEGER FUNCTION INTDN(XVAL)
+C
+C Rounds XVAL to the largest integer less than or equal to XVAL
+C ie truncates downwards rather than towards zero.
+C
+ IF((XVAL.GE.0.0).OR.(XVAL.EQ.FLOAT(INT(XVAL)))) THEN
+ INTDN = INT(XVAL)
+ ELSE
+ INTDN = INT(XVAL) - 1
+ ENDIF
+ RETURN
+ END
+
+ INTEGER FUNCTION INTUP(XVAL)
+C
+C Rounds XVAL to the largest integer greater than or equal to XVAL
+C ie truncates upwards rather than away from zero.
+C
+ IF(XVAL.EQ.FLOAT(INT(XVAL))) THEN
+ INTUP=INT(XVAL)
+ ELSEIF(XVAL.GE.0) THEN
+ INTUP=INT(XVAL+1)
+ ELSE
+ INTUP=INT(XVAL)
+ ENDIF
+ RETURN
+ END
+
+ INTEGER FUNCTION LENA(HSTRING)
+C
+C Returns the length of a string, ignoring blank characters at end
+C
+ CHARACTER*(*) HSTRING
+
+ DO 100 J=LEN(HSTRING),1,-1
+ IF(HSTRING(J:J).NE.' ') GOTO 150
+ 100 CONTINUE
+ J=0
+ 150 CONTINUE
+ LENA=J
+
+ RETURN
+ END
+
+ FUNCTION HDEGS(RVAL)
+C Writes a real number into a string, in a way suitable for degs lat/long.
+C RVAL The real number
+C
+ CHARACTER*6 HDEGS
+
+ IF(RVAL.GE.0) THEN
+ IF(RVAL.LT.10.0) THEN
+ WRITE(HDEGS,'(F4.2)') RVAL
+ ELSEIF(RVAL.LT.100.0) THEN
+ WRITE(HDEGS,'(F4.1)') RVAL
+ ELSEIF(RVAL.LT.1000.0) THEN
+ WRITE(HDEGS,'(F5.1)') RVAL
+ ELSE
+ WRITE(HDEGS,'(F5.0)') RVAL
+ ENDIF
+ ELSE
+ IF(RVAL.GT.-10.0) THEN
+ WRITE(HDEGS,'(F5.2)') RVAL
+ ELSEIF(RVAL.GT.-100.0) THEN
+ WRITE(HDEGS,'(F5.1)') RVAL
+ ELSEIF(RVAL.GT.-1000.0) THEN
+ WRITE(HDEGS,'(F6.1)') RVAL
+ ELSE
+ WRITE(HDEGS,'(F6.0)') RVAL
+ ENDIF
+ ENDIF
+
+ RETURN
+ END
+
+
+ FUNCTION HMETRES(RVAL)
+C Writes a real number into a string, in a way suitable for metres depth.
+C RVAL The real number
+C
+ CHARACTER*6 HMETRES
+
+ IF(RVAL.GE.0) THEN
+ IF(RVAL.LE.9.99) THEN
+ IF(INT(RVAL*10)*10.EQ.INT(RVAL*100)) THEN
+ WRITE(HMETRES,'(F3.1)') RVAL
+ ELSE
+ WRITE(HMETRES,'(F4.2)') RVAL
+ ENDIF
+ ELSEIF(RVAL.LE.99.9) THEN
+ WRITE(HMETRES,'(F4.1)') RVAL
+ ELSEIF(RVAL.LE.999.0) THEN
+ WRITE(HMETRES,'(F4.0)') RVAL
+ ELSE
+ WRITE(HMETRES,'(F5.0)') RVAL
+ ENDIF
+ ELSE
+ IF(RVAL.GE.-9.99) THEN
+ WRITE(HMETRES,'(F5.2)') RVAL
+ ELSEIF(RVAL.GE.-99.9) THEN
+ WRITE(HMETRES,'(F5.1)') RVAL
+ ELSEIF(RVAL.GE.-999.0) THEN
+ WRITE(HMETRES,'(F5.0)') RVAL
+ ELSE
+ WRITE(HMETRES,'(F6.0)') RVAL
+ ENDIF
+ ENDIF
+
+ RETURN
+ END
diff --git a/interpolation/gasetup.F b/interpolation/gasetup.F
new file mode 100755
index 0000000..cd401ca
--- /dev/null
+++ b/interpolation/gasetup.F
@@ -0,0 +1,617 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION GASETUP( KSEC1, KSEC2, KSEC3, KSEC4, ZASEC3)
+C
+C---->
+C**** GASETUP
+C
+C Purpose
+C -------
+C
+C Setup GRIB sections 2 and 4 for the new interpolation product.
+C
+C Added because of merging with grib_api
+C
+C Interface
+C ---------
+C
+C IRET GASETUP( KSEC2, KSEC4)
+C
+C Input
+C -----
+C
+C KSEC1 - Section 1 values (for GRIB_API)
+C KSEC2 - Section 2 values (for GRIB_API)
+C KSEC3 - Section 3 values (for GRIB_API)
+C KSEC4 - Section 4 values (for GRIB_API)
+C
+C Output
+C ------
+C
+C KSEC1 - Modified section 2 values (for GRI_API)
+C KSEC2 - Modified section 2 values (for GRI_API)
+C KSEC3 - Modified section 3 values (for GRI_API)
+C KSEC4 - Modified section 4 values (for GRI_API)
+C
+C Method
+C ------
+C
+C Use common block values and existing values from the original GRIB
+C product used for interpolation.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Logs messages.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Aug 1994
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "intf.h"
+C
+C Parameter(s)
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 19100 )
+C
+C Function arguments
+C
+ INTEGER KSEC1, KSEC2,KSEC3, KSEC4, REPRES, NOPAAPI
+ REAL ZASEC3
+ DIMENSION KSEC1(*), KSEC2(*),KSEC3(*), KSEC4(*), ZASEC3(*)
+C
+C Local variables
+C
+ LOGICAL LIROTAT, LOROTAT, LFRAME, LBITMAP
+ INTEGER ILOOP, ITEMP
+C
+C***********************************************************************
+C Section 1. Startup.
+C***********************************************************************
+C
+ 100 CONTINUE
+C
+ GASETUP = 0
+C
+C Check a recognized data representation type is being processed
+
+ REPRES = NOREPR
+C
+ IF ( (NOREPR .NE.JPREGULAR ) .AND.
+ X (NOREPR .NE.JPREGROT ) .AND.
+ X (NOREPR .NE.JPGAUSSIAN ) .AND.
+ X (NOREPR .NE.JPFGGROT ) .AND.
+ X (NOREPR .NE.JPQUASI ) .AND.
+ X (NOREPR .NE.JPQGGROT ) .AND.
+ X (NOREPR .NE.JPSPHROT ) .AND.
+ X (NOREPR .NE.JPREDLL ) .AND.
+ X (NOREPR .NE.JPSPHERE ) ) GOTO 910
+C
+C Set flags if input is rotated or if a rotation angle has been given
+C
+ LIROTAT = (NIREPR.EQ.JPSPHROT).OR.
+ X (NIREPR.EQ.JPREGROT).OR.
+ X (NIREPR.EQ.JPFGGROT).OR.
+ X (NIREPR.EQ.JPQGGROT)
+C
+ LOROTAT = ((NOROTA(1).NE.-9000000).AND.(NOROTA(1).NE.0)).OR.
+ X (NOROTA(2).NE.0)
+C
+C***********************************************************************
+C Section 2. Setup output product section 2.
+C***********************************************************************
+C
+ 300 CONTINUE
+C
+C Data representation type
+C
+C Adjust output representation type if field is rotated
+C
+ IF( LIROTAT.OR.LOROTAT ) THEN
+ KSEC2(1) = NOREPR
+ IF(NOREPR.EQ.JPREGULAR ) KSEC2(1) = JPREGROT
+ IF(NOREPR.EQ.JPSPHERE ) KSEC2(1) = JPSPHROT
+ IF(NOREPR.EQ.JPQUASI ) KSEC2(1) = JPFGGROT
+ IF(NOREPR.EQ.JPQGGROT ) KSEC2(1) = JPFGGROT
+ IF(NOREPR.EQ.JPGAUSSIAN ) KSEC2(1) = JPFGGROT
+C
+ ELSE
+C
+ IF( (NOREPR.EQ.JPQUASI).OR.(NOREPR.EQ.JPQGGROT) ) THEN
+ KSEC2(1) = JPGAUSSIAN
+ ELSE
+ KSEC2(1) = NOREPR
+ ENDIF
+ ENDIF
+C
+C***********************************************************************
+C Section 3.1. Setup section 2 for lat/long, equidistant
+C cylindrical or plate carre grids.
+C***********************************************************************
+C
+ 310 CONTINUE
+C
+ IF ( (NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT) ) THEN
+C
+C For south to north grids, only global area allowed (eg KWBC SST)
+C
+cs IF( KSEC2(4).LT.KSEC2(7) ) THEN
+cs IF((NOAAPI(1).NE.(-NOAAPI(3))).AND.(NOAAPI(3).NE.JP90)) THEN
+cs CALL INTLOG(JP_ERROR,
+cs X 'GASETUP: Subareas not allowed interpolating',JPQUIET)
+cs CALL INTLOG(JP_ERROR,
+cs X 'GASETUP: grids running from south to north',JPQUIET)
+cs GASETUP = JPROUTINE + 2
+cs GOTO 900
+cs ENDIF
+cs ENDIF
+C
+C Number of points along a parallel
+C
+ KSEC2(2) = NOWE
+C
+C Number of points along a meridian
+C
+ KSEC2(3) = NONS
+C
+C Latitude and longitude of first grid point
+C
+ IF( NOAAPI(1).GE.0 ) THEN
+ KSEC2(4) = (NOAAPI(1)+(JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(4) = (NOAAPI(1)-(JPMICRO/2)) / JPMICRO
+ ENDIF
+ IF( NOAAPI(2).GE.0 ) THEN
+ KSEC2(5) = (NOAAPI(2)+(JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(5) = (NOAAPI(2)-(JPMICRO/2)) / JPMICRO
+ ENDIF
+C
+C Resolution flag, increments are given
+C
+ KSEC2(6) = 128
+C
+C Latitude and longitude of last grid point
+C
+ IF( NOAAPI(3).GE.0 ) THEN
+ KSEC2(7) = (NOAAPI(3)+(JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(7) = (NOAAPI(3)-(JPMICRO/2)) / JPMICRO
+ ENDIF
+ IF( NOAAPI(4).GE.0 ) THEN
+ KSEC2(8) = (NOAAPI(4)+(JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(8) = (NOAAPI(4)-(JPMICRO/2)) / JPMICRO
+ ENDIF
+C
+C Flip latitudes if they run from south to north
+C Set scanning mode flags
+C
+ IF( KSEC2(4).LT.KSEC2(7) ) THEN
+ IF( LNOGRID ) THEN
+ ITEMP = KSEC2(7)
+ KSEC2(7) = KSEC2(4)
+ KSEC2(4) = ITEMP
+ KSEC2(11) = 0
+ ELSE
+ KSEC2(11) = 64
+ ENDIF
+ ELSE
+ KSEC2(11) = NOSCNM
+ ENDIF
+C
+C i and j direction increments
+C
+ KSEC2(9) = (NOGRID(1) + (JPMICRO/2)) / JPMICRO
+ KSEC2(10) = (NOGRID(2) + (JPMICRO/2)) / JPMICRO
+C
+C Following left same as for input product
+C - no.of vertical coordinate parameters,
+C - lat/long of southern pole of rotation
+C - lat/long of pole of stretching
+C
+C If rotated, put in new lat/long of southern pole of rotation
+C
+ IF( LIROTAT.OR.LOROTAT ) THEN
+ IF( NOROTA(1).GE.0 ) THEN
+ KSEC2(13) = (NOROTA(1) + (JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(13) = (NOROTA(1) - (JPMICRO/2)) / JPMICRO
+ ENDIF
+ IF( NOROTA(2).GE.0 ) THEN
+ KSEC2(14) = (NOROTA(2) + (JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(14) = (NOROTA(2) - (JPMICRO/2)) / JPMICRO
+ ENDIF
+ ENDIF
+C
+C Regular grid flag
+C
+ KSEC2(17) = 0
+C
+C Following left same as for input product
+C - earth flag
+C - components flag
+C Set the components flag for rotated U and V coefficients
+C
+ IF(LUVCOMP) THEN
+ KSEC2(19) = 8
+ ENDIF
+
+C - reserved fields
+C
+C OCEAN
+ IF(LOCEAN) THEN
+c there is always bitmap for ocean
+ ZASEC3(2) = RMISSGV
+ KSEC3(2) = int(RMISSGV)
+ KSEC1(5) = 192
+c-------------------
+ KSEC1(37) = 4
+ KSEC1(60) = NIOCO3
+ KSEC1(61) = NIOCO4
+ KSEC1(62) = NOOCO4F
+ KSEC1(63) = NOOCO3F
+ KSEC1(64) = NOOCO4L
+ KSEC1(65) = NOOCO3L
+ KSEC1(66) = NOOIINC
+ KSEC1(67) = NOOJINC
+ KSEC1(68) = NOOIRGR
+ KSEC1(69) = NOONOST
+ KSEC1(71) = 0
+ KSEC1(72) = 0
+ KSEC1(73) = 0
+ KSEC1(74) = 0
+ ENDIF
+ ENDIF
+C
+C***********************************************************************
+C Section 3.2. Setup section 2 for gaussian grids.
+C***********************************************************************
+C
+ 320 CONTINUE
+C
+ IF ( (NOREPR.EQ.JPGAUSSIAN).OR.
+ X (NOREPR.EQ.JPFGGROT).OR.
+ X (NOREPR.EQ.JPQUASI).OR.
+ X (NOREPR.EQ.JPQGGROT) ) THEN
+C
+C Number of points along a parallel
+C
+C For a regular gaussian grid only
+ IF( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPFGGROT) ) THEN
+ KSEC2(2) = NOWE
+ ELSE
+ KSEC2(2) = 0
+ ENDIF
+C
+C Number of points along a meridian
+C
+ KSEC2(3) = NONS
+C
+C Latitude and longitude of first grid point
+C
+ IF( NOAAPI(1).GE.0 ) THEN
+ KSEC2(4) = (NOAAPI(1)+(JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(4) = (NOAAPI(1)-(JPMICRO/2)) / JPMICRO
+ ENDIF
+ IF( NOAAPI(2).GE.0 ) THEN
+ KSEC2(5) = (NOAAPI(2)+(JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(5) = (NOAAPI(2)-(JPMICRO/2)) / JPMICRO
+ ENDIF
+C
+C Resolution flag
+C
+C For a regular gaussian grid only, increments are given
+C
+ IF( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPFGGROT) ) THEN
+ KSEC2(6) = 128
+ ELSE
+ KSEC2(6) = 0
+ ENDIF
+C
+C Latitude and longitude of last grid point
+C
+ IF( NOAAPI(3).GE.0 ) THEN
+ KSEC2(7) = (NOAAPI(3)+(JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(7) = (NOAAPI(3)-(JPMICRO/2)) / JPMICRO
+ ENDIF
+ IF( NOAAPI(4).GE.0 ) THEN
+ KSEC2(8) = (NOAAPI(4)+(JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(8) = (NOAAPI(4)-(JPMICRO/2)) / JPMICRO
+ ENDIF
+C
+C i direction increment
+C
+C For a regular gaussian grid, only
+C
+ IF( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPFGGROT) ) THEN
+ KSEC2(9) = (((JP90)/NOGAUSS)+(JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(9) = 0
+ ENDIF
+C
+C Number of parallels between a pole and the Equator
+C
+ KSEC2(10) = NOGAUSS
+C
+C Scanning mode flags
+C
+ KSEC2(11) = NOSCNM
+C
+C Following left same as for input product
+C - no.of vertical coordinate parameters,
+C - lat/long of southern pole of rotation
+C - lat/long of pole of stretching
+C
+C If rotated, put in new lat/long of southern pole of rotation
+C
+ IF( LIROTAT.OR.LOROTAT ) THEN
+ IF( NOROTA(1).GE.0 ) THEN
+ KSEC2(13) = (NOROTA(1) + (JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(13) = (NOROTA(1) - (JPMICRO/2)) / JPMICRO
+ ENDIF
+ IF( NOROTA(2).GE.0 ) THEN
+ KSEC2(14) = (NOROTA(2) + (JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(14) = (NOROTA(2) - (JPMICRO/2)) / JPMICRO
+ ENDIF
+ ENDIF
+C
+C Regular grid flag
+C
+ IF( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPFGGROT) ) THEN
+ KSEC2(17) = 0
+ ELSE
+ KSEC2(17) = 1
+ ENDIF
+C
+C Following left same as for input product
+C - earth flag
+C - components flag
+C Set the components flag for rotated U and V coefficients
+C
+ IF(LUVCOMP) THEN
+ KSEC2(19) = 8
+ ENDIF
+
+C - reserved fields
+C
+C For reduced grid, move in number of points along each parallel
+C
+ IF( (NOREPR.EQ.JPQUASI) .OR.
+ X (NOREPR.EQ.JPQGGROT) ) THEN
+ DO 325 ILOOP = 1, KSEC2(3)
+ KSEC2(22+ILOOP) = NOLPTS(ILOOP)
+ 325 CONTINUE
+ ENDIF
+C
+ ENDIF
+C
+C***********************************************************************
+C Section 3.3. Setup section 2 for spherical harmonic coefficients.
+C***********************************************************************
+C
+ 330 CONTINUE
+C
+ IF ( (NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT) ) THEN
+C
+C I, K, M pentagonal resolution parameters
+C
+ KSEC2(2) = NORESO
+ KSEC2(3) = NORESO
+ KSEC2(4) = NORESO
+C
+C Representation type, associated legendre functions of the
+C first kind
+ KSEC2(5) = 1
+C
+C Representation mode, complex packing
+C
+ KSEC2(6) = 2
+C
+C Following left same as for input product
+C - reserved words 7-11
+C - no.of vertical coordinate parameters,
+C - lat/long of southern pole of rotation
+C - lat/long of pole of stretching
+C - reserved words 17-22
+C
+C If rotated, put in new lat/long of southern pole of rotation
+C
+ IF( LIROTAT.OR.LOROTAT ) THEN
+ IF( NOROTA(1).GE.0 ) THEN
+ KSEC2(13) = (NOROTA(1) + (JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(13) = (NOROTA(1) - (JPMICRO/2)) / JPMICRO
+ ENDIF
+ IF( NOROTA(2).GE.0 ) THEN
+ KSEC2(14) = (NOROTA(2) + (JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(14) = (NOROTA(2) - (JPMICRO/2)) / JPMICRO
+ ENDIF
+ ENDIF
+ ENDIF
+C
+C***********************************************************************
+C Section 3. Setup output bitmap section 3.
+C***********************************************************************
+ IF(ISEC1(5).EQ.192) THEN
+ KSEC3(2) = NINT(RMISSGV)
+ ZASEC3(2) = RMISSGV
+cs KSEC3(2) = ISEC3(2)
+cs ZASEC3(2) = ZSEC3(2)
+ KSEC1(5) = 192
+ ISEC1(5) = 0
+ ENDIF
+C
+C***********************************************************************
+C Section 4. Setup output product section 4.
+C***********************************************************************
+C
+ 400 CONTINUE
+C
+C Number of values to be packed
+C
+ IF ( (NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT) ) THEN
+ KSEC4(1) = (NORESO + 1) * (NORESO + 2)
+ ELSE IF( (NOREPR.EQ.JPQUASI).OR.(NOREPR.EQ.JPQGGROT) ) THEN
+ KSEC4(1) = NOPCNT
+ ELSE
+ KSEC4(1) = NOWE * NONS
+ ENDIF
+C
+C If all the values are missing, set the count of values negative
+C
+ IF(NOMISS.NE.0) THEN
+ KSEC4(1) = -KSEC4(1)
+ ENDIF
+C
+C Number of bits used for each packed value
+C
+ IF(LNOACC) THEN
+ KSEC4(2) = NOACC
+ ELSE
+ KSEC4(2) = NIACC
+ ENDIF
+C
+C Type of data, spherical harmonic = 128, grid point = 0
+C
+ IF ( (NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT) ) THEN
+ KSEC4(3) = 128
+ ELSE
+ KSEC4(3) = 0
+ ENDIF
+C
+C Type of packing, spherical harmonic = complex
+C
+ IF ( (NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT) ) THEN
+ KSEC4(4) = 1
+ ELSE
+ KSEC4(4) = 4
+ ENDIF
+
+C Sinisa added jpeg packing just for merging with grib_api
+ IF( NOHFUNC.EQ.'C' ) THEN
+c spectral complex
+ KSEC4(4) = 1
+ ELSEIF( NOHFUNC.EQ.'S'.AND.NOREPR.EQ.JPSPHERE ) THEN
+c spectral simple
+ KSEC4(4) = 2
+ ELSEIF( NOHFUNC.EQ.'J' ) THEN
+c grid jpeg
+ KSEC4(4) = 3
+ ELSEIF( NOHFUNC.EQ.'S' ) THEN
+c grid simple
+ KSEC4(4) = 4
+ ELSEIF( NOHFUNC.EQ.'K' ) THEN
+c grid second order
+ KSEC4(4) = 7
+ ENDIF
+C
+C Type of data = floating point
+C
+ KSEC4(5) = 0
+C
+C Additional flags indicator = none
+C
+ KSEC4(6) = 0
+C
+C Reserved word, set to 0
+C
+ KSEC4(7) = 0
+C
+C Following set to simplest case
+C - no.of values indicator
+C - secondary bitmaps indicator
+C - values width indicator
+C - no.of bits for 2nd order values
+C
+ KSEC4(8) = 0
+ KSEC4(9) = 0
+ KSEC4(10) = 0
+ KSEC4(11) = 0
+C
+C Reserved words, set to 0
+C
+ KSEC4(12) = 0
+ KSEC4(13) = 0
+ KSEC4(14) = 0
+ KSEC4(15) = 0
+C
+C If spherical harmonics, set following for complex packing
+C
+ IF ( (NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT) ) THEN
+C
+C KSEC4(16), pointer to start of packed data, setup by packing
+C KSEC4(17), scaling factor P, unchanged from input
+C KSEC4(18), pentagonal resolution parameter J for packing of subset,
+C unchanged from input
+C KSEC4(19), pentagonal resolution parameter K for packing of subset,
+C unchanged from input
+C KSEC4(20), pentagonal resolution parameter M for packing of subset,
+C unchanged from input
+C
+ ELSE
+ DO 410 ILOOP = 16, 20
+ KSEC4(ILOOP) = 0
+ 410 CONTINUE
+ ENDIF
+C
+C Words 21-33 reserved, set to zero.
+C
+ DO 420 ILOOP = 21, 33
+ KSEC4(ILOOP) = 0
+ 420 CONTINUE
+C
+C***********************************************************************
+C Section 9. Closedown
+C***********************************************************************
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+C Invalid data represntation type
+C
+ 910 CONTINUE
+ CALL INTLOG(JP_ERROR,
+ X 'GASETUP: Data representation type not recognized: ',NOREPR)
+ CALL INTLOG(JP_ERROR,
+ X 'GASETUP: Only the following types are recognized:',JPQUIET)
+ CALL INTLOG(JP_ERROR,'GASETUP: Lat/long grid = ', JPREGULAR)
+ CALL INTLOG(JP_ERROR,'GASETUP: Lat/long (rotated) = ', JPREGROT)
+ CALL INTLOG(JP_ERROR,'GASETUP: regular gaussian = ', JPGAUSSIAN)
+ CALL INTLOG(JP_ERROR,'GASETUP: reg gauss rotated = ', JPFGGROT)
+ CALL INTLOG(JP_ERROR,'GASETUP: reduced gaussian = ', JPQUASI)
+ CALL INTLOG(JP_ERROR,'GASETUP: red gauss rotated = ', JPQUASI)
+ CALL INTLOG(JP_ERROR,'GASETUP: spherical harmonic = ', JPSPHERE)
+ CALL INTLOG(JP_ERROR,'GASETUP: spectral (rotated) = ', JPSPHROT)
+C
+ GASETUP = JPROUTINE + 1
+ RETURN
+ END
diff --git a/interpolation/gb2gb.F b/interpolation/gb2gb.F
new file mode 100755
index 0000000..077eab2
--- /dev/null
+++ b/interpolation/gb2gb.F
@@ -0,0 +1,367 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION GB2GB(
+ X INGRIB,INSIZE,OUTGRIB,OUTSIZE,OUT_EW,OUT_NS,OUTAREA)
+C
+C---->
+C**** GB2GB
+C
+C Purpose
+C -------
+C
+C Create a subset of an input regular latitude/longitude
+C gridpoint field.
+C
+C
+C Interface
+C ---------
+C
+C IRET = GB2GB(INGRIB,INSIZE,OUTGRIB,OUTSIZE,OUT_EW,OUT_NS,OUTAREA)
+C
+C Input
+C -----
+C
+C INGRIB - Input regular latitude/longitude gridpoint field in GRIB
+C format.
+C INSIZE - Size in words (integers) of input GRIB product.
+C OUT_EW - East-west increment of output field (millidegrees).
+C OUT_NS - North-south increment of output field (millidegrees).
+C OUTAREA - Area boundaries for output field (N/W/S/E millidegrees).
+C
+C
+C Output
+C ------
+C
+C OUTGRIB - Output regular latitude/longitude gridpoint field in GRIB
+C format.
+C OUTSIZE - Size in words (integers) of output GRIB product.
+C
+C Returns - length in words (integers) of output GRIB product if OK,
+C negative if error.
+C
+C
+C Method
+C ------
+C
+C Area boundaries for output field are adjusted if necessary to fit
+C the grid (N/W/S/E millidegrees).
+C
+C
+C Externals
+C ---------
+C
+C GRIBEX - Unpack and pack GRIB products.
+C AREACHK - Fixup input/output field area according to grid
+C INTLOG - Logs output messages
+C JDEBUG - Checks whether the debug flag is to be turned on.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF March 1999
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "jparams.h"
+#include "parim.h"
+#include "nofld.common"
+C
+C Function arguments
+C
+ INTEGER INGRIB,INSIZE,OUTGRIB,OUTSIZE,OUT_EW,OUT_NS,OUTAREA
+ DIMENSION INGRIB(*),OUTGRIB(OUTSIZE),OUTAREA(4)
+C
+C Local variables
+C
+ INTEGER ISEC0,ISEC1,ISEC2,ISEC3,ISEC4
+ DIMENSION ISEC0(2),ISEC1(1024),ISEC2(1024),ISEC3(2),ISEC4(512)
+ INTEGER ILENP,ILENG,IWORD,IRET,IPOINT
+C
+ REAL PSEC2,PSEC3,PSEC4
+ DIMENSION PSEC2(512),PSEC3(2),PSEC4(1)
+C
+ INTEGER NVALSI,NVALSO
+ REAL ZSEC4I,ZSEC4O
+ DIMENSION ZSEC4I(1),ZSEC4O(1)
+ POINTER ( NPOINTI, ZSEC4I )
+ POINTER ( NPOINTO, ZSEC4O )
+C
+ INTEGER AREA(4)
+ INTEGER INC_EW,INC_NS,N_EW,N_NS,I_EW,I_NS,LOOPO,LOOPI,NEXT
+ INTEGER NWEST,NEAST,OWEST,OEAST
+ REAL EW,NS,NORTH,WEST,SOUTH,EAST
+ LOGICAL LDEBUG, LDUDEW
+ CHARACTER*1 HFUNC
+C
+C Externals
+C
+ INTEGER AREACHK
+ EXTERNAL AREACHK
+C
+C ------------------------------------------------------------------
+C Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ GB2GB = -1
+C
+ CALL JDEBUG( )
+ LDEBUG = ( NDBG.GT.0 )
+C
+ DO LOOPO = 1, 4
+ AREA(LOOPO) = OUTAREA(LOOPO)
+ ENDDO
+C
+C Unpack input GRIB header.
+C
+ IRET = 1
+ ISEC3(2) = 1E-21
+ PSEC3(2) = 1.0E-21
+ CALL GRIBEX(ISEC0,ISEC1,ISEC2,PSEC2,ISEC3,PSEC3,ISEC4,
+ X PSEC4,ILENP,INGRIB,INSIZE,IWORD,'J',IRET)
+ IF( IRET.GT.0 ) THEN
+ IF( LDEBUG )
+ X CALL INTLOG(JP_ERROR,'GB2GB: GRIBEX "J" option error',IRET)
+ GOTO 900
+ ENDIF
+C
+C Ensure that it is a regular latitude/longitude grid.
+C
+ IF( ISEC2(1).NE.0 ) THEN
+ IF( LDEBUG )
+ X CALL INTLOG(JP_ERROR,
+ X 'GB2GB: Input not regular lat/long. Type =',ISEC2(1))
+ GOTO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 2. Check that output grid is a subset of the input grid.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Fixup input/output field area definitions according to grid
+C specification.
+C
+ EW = REAL(OUT_EW) / 1000.0
+ NS = REAL(OUT_NS) / 1000.0
+ NORTH = REAL(AREA(1)) / 1000.0
+ WEST = REAL(AREA(2)) / 1000.0
+ SOUTH = REAL(AREA(3)) / 1000.0
+ EAST = REAL(AREA(4)) / 1000.0
+ IRET = AREACHK( EW, NS, NORTH, WEST, SOUTH, EAST )
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG )
+ X CALL INTLOG(JP_ERROR,'GB2GB: AREACHK failed:',IRET)
+ GOTO 900
+ ENDIF
+C
+ OUT_EW = NINT(EW * 1000.0)
+ OUT_NS = NINT(NS * 1000.0)
+ AREA(1) = NINT(NORTH * 1000.0)
+ AREA(2) = NINT(WEST * 1000.0)
+ AREA(3) = NINT(SOUTH * 1000.0)
+ AREA(4) = NINT(EAST * 1000.0)
+C
+C Check (sub)area limits
+C
+C North and south ..
+C
+ IF( (AREA(1).GT.ISEC2(4)) .OR.
+ X (AREA(3).LT.ISEC2(7)) ) THEN
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'GB2GB: North/south outside input GRIB area',JPQUIET)
+ CALL INTLOG(JP_ERROR,'GB2GB: Requested north = ',OUTAREA(1))
+ CALL INTLOG(JP_ERROR,'GB2GB: Requested south = ',OUTAREA(3))
+ CALL INTLOG(JP_ERROR,'GB2GB: Input GRIB north = ',ISEC2(4))
+ CALL INTLOG(JP_ERROR,'GB2GB: Input GRIB south = ',ISEC2(7))
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C East and west ..
+C
+ NWEST = AREA(2)
+ NEAST = AREA(4)
+ OWEST = ISEC2(5)
+ OEAST = ISEC2(8)
+C
+ LDUDEW =
+ X ((NWEST.LT.0).AND.(OWEST.LT.0).AND.(NWEST.LT.OWEST)).OR.
+ X ((NWEST.GT.0).AND.(OWEST.GT.0).AND.(NWEST.LT.OWEST)).OR.
+ X ((NWEST.LT.0).AND.(OWEST.GT.0).AND.(NWEST.LT.(OWEST-36000))).OR.
+ X ((NWEST.GT.0).AND.(OWEST.LT.0).AND.(NWEST.LT.(OWEST+36000))).OR.
+ X ((NEAST.LT.0).AND.(OEAST.LT.0).AND.(NEAST.GT.OEAST)).OR.
+ X ((NEAST.GT.0).AND.(OEAST.GT.0).AND.(NEAST.GT.OEAST)).OR.
+ X ((NEAST.LT.0).AND.(OEAST.GT.0).AND.(NEAST.GT.(OEAST-36000))).OR.
+ X ((NEAST.GT.0).AND.(OEAST.LT.0).AND.(NEAST.GT.(OEAST+36000)))
+C
+ IF( LDUDEW ) THEN
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'GB2GB: East/west outside input GRIB area',JPQUIET)
+ CALL INTLOG(JP_ERROR,'GB2GB: Requested west = ',OUTAREA(2))
+ CALL INTLOG(JP_ERROR,'GB2GB: Requested east = ',OUTAREA(4))
+ CALL INTLOG(JP_ERROR,'GB2GB: Input GRIB west = ',ISEC2(5))
+ CALL INTLOG(JP_ERROR,'GB2GB: Input GRIB east = ',ISEC2(8))
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+ IF( NWEST.LT.0 ) NWEST = NWEST + 360000
+ IF( NEAST.LT.0 ) NEAST = NEAST + 360000
+ IF( NEAST.LT.NWEST ) NEAST = NEAST + 360000
+ IF( OWEST.LT.0 ) OWEST = OWEST + 360000
+ IF( OEAST.LT.0 ) OEAST = OEAST + 360000
+ IF( OEAST.LT.OWEST ) OEAST = OEAST + 360000
+C
+C Check increments
+C
+ INC_EW = OUT_EW / ISEC2(9)
+ IF( (INC_EW*ISEC2(9)).NE.OUT_EW ) THEN
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'GB2GB: East-west step not multiple of input grid',JPQUIET)
+ CALL INTLOG(JP_ERROR,'GB2GB: Requested step = ',OUT_EW)
+ CALL INTLOG(JP_ERROR,'GB2GB: Input GRIB step = ',ISEC2(9))
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+ INC_NS = OUT_NS / ISEC2(10)
+ IF( (INC_NS*ISEC2(10)).NE.OUT_NS ) THEN
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'GB2GB: North-south step not multiple of input grid',JPQUIET)
+ CALL INTLOG(JP_ERROR,'GB2GB: Requested step = ',OUT_NS)
+ CALL INTLOG(JP_ERROR,'GB2GB: Input GRIB step = ',ISEC2(10))
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 3. Generate new grid.
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C Get memory for input GRIB values.
+C
+ NVALSI = ISEC2(2)*ISEC2(3)
+ CALL JMEMHAN(3,NPOINTI,NVALSI,1,IRET)
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG )
+ X CALL INTLOG(JP_ERROR,'GB2GB: JMEMHAN failed for input',IRET)
+ GOTO 900
+ ENDIF
+C
+C Get memory for output GRIB values.
+C
+ N_EW = ( (NEAST - NWEST) / OUT_EW ) + 1
+ N_NS = ( (AREA(1) - AREA(3)) / OUT_NS ) + 1
+ NVALSO = N_EW * N_NS
+ CALL JMEMHAN(4,NPOINTO,NVALSO,1,IRET)
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG )
+ X CALL INTLOG(JP_ERROR,'GB2GB: JMEMHAN failed for output',IRET)
+ GOTO 900
+ ENDIF
+C
+C Unpack input GRIB values.
+C
+ IRET = 1
+ CALL GRIBEX(ISEC0,ISEC1,ISEC2,PSEC2,ISEC3,PSEC3,ISEC4,
+ X ZSEC4I,NVALSI,INGRIB,INSIZE,IWORD,'D',IRET)
+ IF( IRET.GT.0 ) THEN
+ IF( LDEBUG )
+ X CALL INTLOG(JP_ERROR,'GB2GB: GRIBEX "D" option error',IRET)
+ GOTO 900
+ ENDIF
+C
+C Select points for new grid.
+C
+ I_EW = (NWEST / ISEC2(9) ) + 1
+ I_NS = ((90000-AREA(1)) / ISEC2(10) ) + 1
+C
+ NEXT = 1
+ DO LOOPO = I_NS, (I_NS-1+N_NS*INC_NS),INC_NS
+ DO LOOPI = I_EW, (I_EW-1+N_EW*INC_EW),INC_EW
+ IPOINT = MOD(ISEC2(2)+LOOPI-1,ISEC2(2))+1
+ ZSEC4O(NEXT) = ZSEC4I((LOOPO-1)*ISEC2(2)+IPOINT)
+ NEXT = NEXT + 1
+ ENDDO
+ ENDDO
+C
+C ------------------------------------------------------------------
+C Section 4. Pack new grid into GRIB.
+C ------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ ISEC2(2) = N_EW
+ ISEC2(3) = N_NS
+ ISEC2(4) = OUTAREA(1)
+ ISEC2(5) = OUTAREA(2)
+ ISEC2(7) = OUTAREA(3)
+ ISEC2(8) = OUTAREA(4)
+ ISEC2(9) = OUT_EW
+ ISEC2(10) = OUT_NS
+C
+ ISEC4(1) = N_NS * N_EW
+ IF( (NOACC.GT.0).AND.(NOACC.LT.30) ) ISEC4(2) = NOACC
+C
+C PACKING specified can be second-order, simple or archive value
+C
+ IF( NOHFUNC.EQ.'K' ) THEN
+ HFUNC = 'K'
+ ISEC4(4) = 64
+ ISEC4(6) = 16
+ ISEC4(9) = 32
+ ISEC4(10) = 16
+ ISEC4(12) = 8
+ ISEC4(13) = 4
+ ISEC4(14) = 0
+ ISEC4(15) = -1
+ ELSE IF( NOHFUNC.EQ.'S' ) THEN
+ HFUNC = 'C'
+ ISEC4(4) = 0
+ ISEC4(6) = 0
+ ELSE IF( NOHFUNC.EQ.'A' ) THEN
+ IF( ISEC4(4).EQ.64 ) THEN
+ HFUNC = 'K'
+ ELSE
+ HFUNC = 'C'
+ ENDIF
+ ENDIF
+C
+ IRET = 1
+ CALL GRIBEX(ISEC0,ISEC1,ISEC2,PSEC2,ISEC3,PSEC3,ISEC4,
+ X ZSEC4O,NVALSO,OUTGRIB,OUTSIZE,IWORD,HFUNC,IRET)
+ IF( IRET.GT.0 ) THEN
+ IF( LDEBUG )
+ X CALL INTLOG(JP_ERROR,'GB2GB: GRIBEX "C" option error',IRET)
+ GOTO 900
+ ENDIF
+ GB2GB = IWORD
+C
+C ------------------------------------------------------------------
+C Section 9. Return.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/getconf.F b/interpolation/getconf.F
new file mode 100755
index 0000000..935b2cd
--- /dev/null
+++ b/interpolation/getconf.F
@@ -0,0 +1,166 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GETCONF( )
+C
+C---->
+C**** GETCONF
+C
+C PURPOSE
+C _______
+C
+C This routine looks for environment variable CONFIG_INTERP to
+C decide how to handle legendre coefficients.
+C
+C INTERFACE
+C _________
+C
+C CALL GETCONF( )
+C
+C Input parameters
+C ________________
+C
+C None.
+C
+C Output parameters
+C ________________
+C
+C Sets flags in common block JDCFLAGS (see nifld.common):
+C
+C LFILEIO, LMEMORY, LSHARED, LON_FLY, LMAPPED
+C
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG, JDCFLAGS
+C
+C
+C Method
+C ______
+C
+C Looks for environment variable CONFIG_INTERP to decide how to
+C handle legendre coefficients. The variable contains entries in
+C the format:
+C
+C col 1
+C |
+C v
+C FILEIO to read coefficents from a file one latitude at a time
+C MEMORY to read all coefficents from a file into memory
+C SHARED to read coefficents from a memory-mapped file
+C ON_FLY to generate coefficents for each latitude 'on the fly'
+C
+C Externals
+C _________
+C
+C JDEBUG - Checks environment variable to switch on/off debug
+C INTLOG - Logs output messages
+C GETENV - Get value of an environment variable
+C
+C
+C Reference
+C _________
+C
+C None.
+C
+C
+C Comments
+C ________
+C
+C None.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF Jan 2000
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+#include "nifld.common"
+#include "parim.h"
+#include "jparams.h"
+C
+C Parameters
+C
+C Local variables
+C
+ CHARACTER*20 CONFIG
+ INTEGER IBLANK
+C
+ LOGICAL LDEBUG
+ SAVE LDEBUG
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialization.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IF( LIFIRST ) THEN
+C
+ LIFIRST = .FALSE.
+C
+ CALL JDEBUG( )
+ LDEBUG = NDBG.GT.0
+C
+C Read the configuration information
+C
+ CALL GETENV('CONFIG_INTERP', CONFIG)
+ IBLANK = INDEX(CONFIG, ' ')
+ IF( IBLANK.GT.6 ) THEN
+C
+ IF( CONFIG(1:6).EQ.'FILEIO' ) LFILEIO = .TRUE.
+ IF( CONFIG(1:6).EQ.'MEMORY' ) LMEMORY = .TRUE.
+ IF( CONFIG(1:6).EQ.'SHARED' ) LSHARED = .TRUE.
+ IF( CONFIG(1:6).EQ.'ON_FLY' ) LON_FLY = .TRUE.
+ IF( CONFIG(1:6).EQ.'MAPPED' ) LMAPPED = .TRUE.
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'GETCONF: Legendre coefficents via: '//CONFIG(1:6),JPQUIET)
+ ENDIF
+ ELSE
+#ifdef _uxp__
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'GETCONF: Default legendre coeff handling: MEMORY',JPQUIET)
+ LMEMORY = .TRUE.
+#elif defined IBM_POWER4
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'GETCONF: Default legendre coeff handling: MAPPED',JPQUIET)
+ LMAPPED = .TRUE.
+#else
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'GETCONF: Default legendre coeff handling: FILEIO',JPQUIET)
+ LFILEIO = .TRUE.
+#endif
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return to calling routine.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/gettru.F b/interpolation/gettru.F
new file mode 100755
index 0000000..c81a8af
--- /dev/null
+++ b/interpolation/gettru.F
@@ -0,0 +1,30 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION GETTRU()
+C
+C---->
+C*****GETTRU*
+C
+C PURPOSE
+C -------
+C
+C Finding Corresponding Truncation
+C
+#include "parim.h"
+#include "nofld.common"
+
+ GETTRU = NORESO
+
+ CALL INTLOG(JP_DEBUG,
+ X 'GETTRU: Corresponding Truncation',GETTRU)
+C
+ RETURN
+ END
diff --git a/interpolation/ggintrp.F b/interpolation/ggintrp.F
new file mode 100755
index 0000000..7488294
--- /dev/null
+++ b/interpolation/ggintrp.F
@@ -0,0 +1,305 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GGINTRP(NEWFLD,NEXT,INROW,OLAT,OLON,NGAUSS,TYPE,FIELD)
+C
+C---->
+C**** GGINTRP
+C
+C PURPOSE
+C _______
+C
+C Finds values at the points of a row by interpolation within a
+C gaussian field.
+C
+C INTERFACE
+C _________
+C
+C CALL GGINTRP(NEWFLD,NEXT,INROW,OLAT,OLON,NGAUSS,TYPE,FIELD)
+C
+C
+C Input parameters
+C ________________
+C
+C NEWFLD - The field of values being created
+C NEXT - Start offset of the latitude row being created
+C INROW - The number of points in the latitude row
+C OLAT - Latitude of target point
+C OLON - Longitude of target point
+C FIELD - Original gaussian field
+C NGAUSS - Gaussian field number
+C TYPE - Original unrotated gaussian field type
+C = 'F' for full (regular) gaussian field
+C = 'R' for reduced (quasi) gaussian field
+C
+C Output parameters
+C ________________
+C
+C NEWFLD(NEXT) to NEWFLD(NEXT+INROW-1) contains the latitude row
+C values.
+C
+C
+C METHOD
+C ______
+C
+C Uses distance weighted values of 4 neighbouring points unless
+C within small distance of one of the neighbours, in which case
+C the value at that point is used.
+C
+C
+C EXTERNALS
+C _________
+C
+C JGETGG - Gets gaussian grid definition.
+C JMKOFGG - Builds offsets to start of each latitude row in the
+C gaussian grid.
+C JNORSGG - Find nearest north/south latitude in the gaussian grid.
+C INTLOG - Logs output messages
+C
+C
+C REFERENCE
+C _________
+C
+C None.
+C
+C
+C COMMENTS
+C ________
+C
+C Some loops have been split and simplified to help with
+C vectorisation on VPP.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF April 1996
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPFACTR, JPMAXGG
+ PARAMETER( JPFACTR = 10000 )
+ PARAMETER( JPMAXGG = 4096 )
+ REAL JPEPS
+ PARAMETER( JPEPS = 1E-2)
+C
+C Function arguments
+C
+ REAL NEWFLD, OLAT, OLON, FIELD
+ DIMENSION NEWFLD(*), OLAT(*), OLON(*), FIELD(*)
+ INTEGER NEXT, INROW, NGAUSS
+ CHARACTER*1 TYPE
+C
+C Local variables
+C
+ INTEGER LOOP, IVALUE
+ INTEGER NORTH, SOUTH, IWESTN, IWESTS, IEASTN, IEASTS
+ REAL NSTEP, SSTEP
+ DIMENSION NORTH(JPMAXGG), SOUTH(JPMAXGG)
+ DIMENSION IWESTN(JPMAXGG), IWESTS(JPMAXGG)
+ DIMENSION IEASTN(JPMAXGG), IEASTS(JPMAXGG)
+ DIMENSION NSTEP(JPMAXGG), SSTEP(JPMAXGG)
+ REAL DNORTH, DSOUTH, DWESTN, DWESTS, DEASTN, DEASTS
+ DIMENSION DNORTH(JPMAXGG), DSOUTH(JPMAXGG)
+ DIMENSION DWESTN(JPMAXGG), DWESTS(JPMAXGG)
+ DIMENSION DEASTN(JPMAXGG), DEASTS(JPMAXGG)
+ REAL GLATS(JPMAXGG/2)
+ INTEGER NGPTS(JPMAXGG/2)
+ INTEGER KOFSET(JPMAXGG/2)
+ INTEGER KRET, OLDGAUS
+ DATA OLDGAUS/0/
+ CHARACTER*1 OLDTYPE
+ DATA OLDTYPE/' '/
+ SAVE OLDGAUS, OLDTYPE, GLATS, NGPTS, KOFSET
+#ifdef __uxp__
+ REAL ONW, ONE, OSW, OSE
+ DIMENSION ONW(JPMAXGG), ONE(JPMAXGG), OSW(JPMAXGG), OSE(JPMAXGG)
+#endif
+C
+C Externals
+C
+ INTEGER JNORSGG
+ EXTERNAL JNORSGG
+#ifndef __uxp__
+C
+C Statement function
+C
+ INTEGER X, Y
+ REAL OFIELD
+ OFIELD(X,Y) = FIELD(KOFSET(X)+Y)
+#endif
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+C Get gaussian grid definition (first time only)
+C
+ IF ( (OLDGAUS.NE.NGAUSS).OR.(OLDTYPE.NE.TYPE) ) THEN
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'GGINTRP: Get gaussian grid type:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,TYPE,JPQUIET)
+ CALL INTLOG(JP_DEBUG, 'GGINTRP: grid number:',NGAUSS)
+C
+ CALL JGETGG(NGAUSS,TYPE,GLATS,NGPTS,KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'GGINTRP: Failed to get gaussian grid definition:',JPQUIET)
+ CALL INTLOG(JP_ERROR, 'GGINTRP: grid type:',JPQUIET)
+ CALL INTLOG(JP_ERROR, TYPE,JPQUIET)
+ CALL INTLOG(JP_ERROR, 'GGINTRP: grid number:',NGAUSS)
+ STOP
+ ENDIF
+C
+C Build array of offsets in field to start of each latitude line
+C
+ CALL INTLOG(JP_DEBUG,'GGINTRP: Build row offsets',JPQUIET)
+ IF( TYPE.EQ.'R') THEN
+ CALL JMKOFGG(TYPE,1,NGAUSS*2,0.0,360.0,NGAUSS,NGPTS,KOFSET)
+ ELSE
+ CALL JMKOFGG(TYPE,1,NGAUSS*2,0.0,(360.0-(90.0/NGAUSS)),
+ X NGAUSS,NGPTS,KOFSET)
+ ENDIF
+ OLDGAUS = NGAUSS
+ OLDTYPE = TYPE
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Find latitudes of grid lines to north and south of
+C the points and calculate grid interval along lines.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ DO LOOP = 1, INROW
+ NORTH(LOOP) = JNORSGG( OLAT(LOOP), GLATS, NGAUSS, 1)
+ ENDDO
+C
+ DO LOOP = 1, INROW
+ SOUTH(LOOP) = MIN( NORTH(LOOP)+1, NGAUSS*2)
+ DNORTH(LOOP) = ABS(GLATS(NORTH(LOOP)) - OLAT(LOOP))
+ ENDDO
+C
+ DO LOOP = 1, INROW
+ DSOUTH(LOOP) = 1.0 - DNORTH(LOOP)
+ NSTEP(LOOP) = 360.0/FLOAT(NGPTS(NORTH(LOOP)))
+ SSTEP(LOOP) = 360.0/FLOAT(NGPTS(SOUTH(LOOP)))
+ ENDDO
+C
+C _______________________________________________________
+C
+C* Section 3. Find neighbouring points.
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ DO LOOP = 1, INROW
+C
+C Calculate normalised distance west and east to neighbouring
+C points on lines to north and south of the point
+C
+ IWESTN(LOOP) = INT(OLON(LOOP)/NSTEP(LOOP))
+ IWESTS(LOOP) = INT(OLON(LOOP)/SSTEP(LOOP))
+ IEASTN(LOOP) = IWESTN(LOOP) + 1
+ IEASTS(LOOP) = IWESTS(LOOP) + 1
+C
+ DWESTN(LOOP) =
+ X ABS((OLON(LOOP) - FLOAT(IWESTN(LOOP))*NSTEP(LOOP))/NSTEP(LOOP))
+ DEASTN(LOOP) = 1.0 - DWESTN(LOOP)
+C
+ DWESTS(LOOP) =
+ X ABS((OLON(LOOP) - FLOAT(IWESTS(LOOP))*SSTEP(LOOP))/SSTEP(LOOP))
+ DEASTS(LOOP) = 1.0 - DWESTS(LOOP)
+C
+C Adjust west and east for longitude wrap-around
+C
+ IVALUE=NGPTS(NORTH(LOOP))
+ IF( IEASTN(LOOP).GE.IVALUE) THEN
+ IEASTN(LOOP) = IEASTN(LOOP) - IVALUE
+ IF( IWESTN(LOOP).GE.IVALUE) IWESTN(LOOP) = IWESTN(LOOP)-IVALUE
+ ENDIF
+C
+ IVALUE=NGPTS(SOUTH(LOOP))
+ IF( IEASTS(LOOP).GE.IVALUE) THEN
+ IEASTS(LOOP) = IEASTS(LOOP) - IVALUE
+ IF( IWESTS(LOOP).GE.IVALUE) IWESTS(LOOP) = IWESTS(LOOP)-IVALUE
+ ENDIF
+C
+ ENDDO
+C
+C _______________________________________________________
+C
+C* Section 4. Interpolate using neighbouring points.
+C _______________________________________________________
+C
+ 400 CONTINUE
+C
+C Use bi-linear interpolation from four neighbouring points.
+C
+#ifdef __uxp__
+ DO LOOP = 1, INROW
+ ONW(LOOP) =
+ X FIELD(KOFSET(NORTH(LOOP))+IWESTN(LOOP)) * DEASTN(LOOP)
+ ONE(LOOP) =
+ X FIELD(KOFSET(NORTH(LOOP))+IEASTN(LOOP)) * DWESTN(LOOP)
+ OSW(LOOP) =
+ X FIELD(KOFSET(SOUTH(LOOP))+IWESTS(LOOP)) * DEASTS(LOOP)
+ OSE(LOOP) =
+ X FIELD(KOFSET(SOUTH(LOOP))+IEASTS(LOOP)) * DWESTS(LOOP)
+C
+ ENDDO
+C
+ DO LOOP = 1, INROW
+ NEWFLD(NEXT+LOOP-1) =
+ X (ONW(LOOP) + ONE(LOOP)) * DSOUTH(LOOP) +
+ X (OSW(LOOP) + OSE(LOOP)) * DNORTH(LOOP)
+ ENDDO
+#else
+ DO LOOP = 1, INROW
+ NEWFLD(NEXT+LOOP-1) =
+ X ( ( OFIELD(NORTH(LOOP),IWESTN(LOOP)) * DEASTN(LOOP) +
+ X OFIELD(NORTH(LOOP),IEASTN(LOOP)) * DWESTN(LOOP) )
+ X * DSOUTH(LOOP) +
+ X ( OFIELD(SOUTH(LOOP),IWESTS(LOOP)) * DEASTS(LOOP) +
+ X OFIELD(SOUTH(LOOP),IEASTS(LOOP)) * DWESTS(LOOP) )
+ X * DNORTH(LOOP) )
+ ENDDO
+#endif
+C
+C _______________________________________________________
+C
+C* Section 9. Closedown.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/ggrotat.F b/interpolation/ggrotat.F
new file mode 100755
index 0000000..0c0419c
--- /dev/null
+++ b/interpolation/ggrotat.F
@@ -0,0 +1,235 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION GGROTAT(OLDFLD, NEWFLD, NUMPTS, POLELAT, POLELON,
+ X TYPE, NGAUSS)
+C
+C---->
+C**** GGROTAT
+C
+C PURPOSE
+C _______
+C
+C Generates a rotated gaussian grid.
+C
+C INTERFACE
+C _________
+C
+C IRET = GGROTAT(OLDFLD,NEWFLD,NUMPTS,POLELAT,POLELON,TYPE,NGAUSS)
+C
+C
+C Input parameters
+C ________________
+C
+C OLDFLD = Original gaussian grid field.
+C NUMPTS = Total number of points in the original field.
+C POLELAT = Latitude of the South Pole of rotation.
+C POLELON = Longitude of the South Pole of rotation.
+C TYPE = 'R' if the gaussian field is reduced (quasi) gaussian.
+C = 'F' if the gaussian field is regular (full) gaussian.
+C NGAUSS = Gaussian grid number (number of latitude rows between
+C the pole and the equator).
+C
+C Output parameters
+C ________________
+C
+C NEWFLD = New gaussian grid field.
+C (This can be the same array as OLDFLD).
+C
+C Function returns zero if interpolation ran OK.
+C
+C
+C METHOD
+C ______
+C
+C The nearest gaussian latitude row is found.
+C
+C Work space is dynamically allocated. It is retained for future
+C calls.
+C
+C EXTERNALS
+C _________
+C
+C JGETGG - Pickup the gaussian grid definition.
+C GGVALUE - Calculates the interpolated value at a point of the new
+C gaussian grid.
+C INTLOG - Logs output messages
+C INTLOGR - Logs output messages
+C JMEMHAN - Dynamically allocate work array
+C
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C
+C COMMENTS
+C ________
+C
+C The input field is assumed to be global in extent, and a known
+C definition, either N160 or N80 (reduced or regular).
+C The output field has the same type and dimensions as the input
+C field.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF April 1996
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPMAXGG
+ PARAMETER( JPROUTINE = 38500 )
+ PARAMETER (JPMAXGG = 1280)
+C
+C Subroutine arguments
+C
+ REAL OLDFLD, NEWFLD, POLELAT, POLELON
+ INTEGER NUMPTS, NGAUSS
+ DIMENSION OLDFLD(NUMPTS), NEWFLD(NUMPTS)
+ CHARACTER*1 TYPE
+C
+C Local variables
+C
+ REAL GLATS(JPMAXGG)
+ INTEGER NGPTS(JPMAXGG)
+ INTEGER OLDGAUS
+ DATA OLDGAUS/0/
+ CHARACTER*1 OLDTYPE
+ DATA OLDTYPE/' '/
+ SAVE GLATS, NGPTS, OLDGAUS, OLDTYPE
+C
+ INTEGER NEXT, NEXLAT, INROW, LOOP, KRET
+ REAL STEPLON, CUTOFF, RLAT, RLON
+ DIMENSION RLON(JPMAXGG*2)
+C
+ INTEGER ISIZE
+ DATA ISIZE/0/
+ REAL DUMI
+ POINTER (IDUMI, DUMI)
+ DIMENSION DUMI(1)
+ SAVE IDUMI, ISIZE
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ GGROTAT = 0
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'GGROTAT: Number of pts in original field = ',NUMPTS)
+ CALL INTLOGR(JP_DEBUG,
+ X 'GGROTAT: Latitude of the South Pole of rotation = ',POLELAT)
+ CALL INTLOGR(JP_DEBUG,
+ X 'GGROTAT: Longitude of the South Pole of rotation = ',POLELON)
+ CALL INTLOG(JP_DEBUG,'GGROTAT: Get gaussian grid type:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,TYPE,JPQUIET)
+ CALL INTLOG(JP_DEBUG,'GGROTAT: grid number:',NGAUSS)
+C
+C Get gaussian grid definition (first time only)
+C
+ IF( (OLDGAUS.NE.NGAUSS).OR.(OLDTYPE.NE.TYPE)) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'GGROTAT: Get definitions for gaussian grid type:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,TYPE,JPQUIET)
+ CALL INTLOG(JP_DEBUG,'GGROTAT: grid number:',NGAUSS)
+C
+ CALL JGETGG(NGAUSS,TYPE,GLATS,NGPTS,KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'GGROTAT: Failed to get gaussian grid definition:',JPQUIET)
+ GGROTAT = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+ OLDGAUS = NGAUSS
+ OLDTYPE = TYPE
+ ENDIF
+C
+C Allocate work space if not already done.
+C
+ IF( ISIZE.LT.NUMPTS ) THEN
+ ISIZE = NUMPTS
+ CALL JMEMHAN(18,IDUMI,ISIZE,1,KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'GGROTAT: Memory allocation failed: status = ',KRET)
+ GGROTAT = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C Move the original field to the work array
+C
+ DO LOOP = 1, NUMPTS
+ DUMI(LOOP) = OLDFLD(LOOP)
+ ENDDO
+C _______________________________________________________
+C
+C* Section 2. Work through latitude lines from north to south
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ NEXT = 1
+C
+ DO NEXLAT = 1, NGAUSS*2
+ INROW = NGPTS(NEXLAT)
+ STEPLON = 360.0/INROW
+ RLAT = GLATS(NEXLAT)
+C
+C Fill in longitudes along current line of latitude
+C
+ DO LOOP = 1, INROW
+ RLON(LOOP) = (LOOP-1)*STEPLON
+ ENDDO
+C
+C Rotate the current line of latitude
+C
+ CALL GGVALUE(NEWFLD,NEXT,INROW,RLAT,RLON,
+ X POLELAT,POLELON,NGAUSS,TYPE,DUMI)
+C
+ NEXT = NEXT + INROW
+C
+ ENDDO
+ NUMPTS = NEXT
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ CALL INTLOG(JP_DEBUG,'GGROTAT: Return from GGROTAT:',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/ggvalue.F b/interpolation/ggvalue.F
new file mode 100755
index 0000000..d2060c2
--- /dev/null
+++ b/interpolation/ggvalue.F
@@ -0,0 +1,153 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE GGVALUE(NEWFLD, NEXT, INROW, RLAT, RLON,
+ X POLELAT, POLELON, NGAUSS, TYPE, FIELD)
+C
+C---->
+C**** GGVALUE
+C
+C PURPOSE
+C _______
+C
+C Rotates one line of latitude in a gaussian grid.
+C
+C INTERFACE
+C _________
+C
+C CALL GGVALUE(NEWFLD, NEXT, INROW, RLAT, RLON,
+C X POLELAT, POLELON, NGAUSS, TYPE, FIELD)
+C
+C
+C Input parameters
+C ________________
+C
+C NEWFLD - The field of values being created
+C NEXT - Start offset of the latitude row being created
+C INROW - The number of points in the latitude row
+C RLAT - Target point latitude in the rotated grid
+C RLON - Target point longitude in the rotated grid
+C POLELAT - Latitude of the rotated South Pole
+C POLELON - Longitude of the rotated South Pole
+C FIELD - Original unrotated gaussian field values
+C NGAUSS - Original unrotated gaussian field number
+C TYPE - Original unrotated gaussian field type
+C = 'F' for full (regular) gaussian field
+C = 'R' for reduced (quasi) gaussian field
+C
+C Output parameters
+C ________________
+C
+C NEWFLD(NEXT) to NEWFLD(NEXT+INROW-1) contains the latitude row
+C values.
+C
+C
+C METHOD
+C ______
+C
+C Rotates the lat/long positions of points along a latitude row in
+C a rotated gaussian grid back to positions in the unrotated grid
+C and then interpolates values from the original grid.
+C
+C
+C EXTERNALS
+C _________
+C
+C LL2XYZ - Converts a latitude/longitude position to (x,y,z)
+C wrt axes through the centre of the globe. The z-axis
+C runs from the south to north pole. The x- and y-axes
+C are in the plane of the equator with the x-axis
+C pointing out through lat/long (0,0).
+C YROTATE - Rotates the globe about the new y-axis.
+C XYZ2LL - Converts an (x,y,z) position to a latitude/longitude.
+C GGINTRP - Interpolates a value from an existing grid.
+C
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C
+C COMMENTS
+C ________
+C
+C The input field is assumed to be global in extent, and a known
+C definition, either N160 or N80 (reduced or regular).
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF April 1996
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+C Parameters
+C
+ INTEGER JPMAXGG
+ PARAMETER( JPMAXGG = 1280 )
+C
+C Function arguments
+C
+ REAL NEWFLD, RLAT, RLON, POLELAT, POLELON, FIELD
+ DIMENSION NEWFLD(*), RLON(*), FIELD(*)
+ INTEGER NEXT, INROW, NGAUSS
+ CHARACTER*1 TYPE
+C
+C Local variables
+C
+ REAL X(JPMAXGG), Y(JPMAXGG), Z(JPMAXGG)
+ REAL RX(JPMAXGG),RY(JPMAXGG),RZ(JPMAXGG)
+ REAL OLAT(JPMAXGG),OLON(JPMAXGG)
+ INTEGER LOOP
+C
+C Convert the rotated row points lat/longs to (x,y,z) coordinates
+C
+ CALL LL2XYZ(RLAT,RLON,X,Y,Z,INROW)
+C
+C Rotate the rotated row points back through the original latitude
+C rotation
+C
+ CALL YROTATE(-(90.0+POLELAT),X,Y,Z,RX,RY,RZ,INROW)
+C
+C Convert the rotated row points adjusted (x,y,z) coordinates to
+C lat/long in the original grid (after longitude rotation)
+C
+ CALL XYZ2LL(RX,RY,RZ,OLAT,OLON,INROW)
+C
+C Adjust the rotated line longitudes to remove the longitude
+C rotation
+C
+ DO LOOP = 1, INROW
+ OLON(LOOP) = OLON(LOOP) + POLELON
+ IF( OLON(LOOP).LT.0.0 ) OLON(LOOP) = OLON(LOOP) + 360.0
+ IF( OLON(LOOP).GE.360.0 ) OLON(LOOP) = OLON(LOOP) - 360.0
+ ENDDO
+C
+C Interpolate the original unrotated grid to the points in the
+C rotated line
+C
+ CALL GGINTRP(NEWFLD,NEXT,INROW,OLAT,OLON,NGAUSS,TYPE,FIELD)
+C
+ RETURN
+ END
diff --git a/interpolation/global.F b/interpolation/global.F
new file mode 100755
index 0000000..e6d701a
--- /dev/null
+++ b/interpolation/global.F
@@ -0,0 +1,34 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION GLOBAL()
+C
+C---->
+C*****GLOBAL*
+C
+C PURPOSE
+C -------
+C LGLOBL - Flag to say if output grid is global
+C
+C Function argument
+C
+
+#include "parim.h"
+#include "nofld.common"
+
+ GLOBAL = 0
+ IF(LGLOBL) THEN
+ GLOBAL = 1
+ CALL INTLOG(JP_DEBUG,'GLOBAL: Output Grid is Global'
+ X ,JPQUIET)
+ ENDIF
+C
+ RETURN
+ END
diff --git a/interpolation/gmapbit.c b/interpolation/gmapbit.c
new file mode 100755
index 0000000..5a9ddcd
--- /dev/null
+++ b/interpolation/gmapbit.c
@@ -0,0 +1,43 @@
+/**
+* Copyright 1981-2012 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 "bitmap.h"
+
+fortint GMAPBIT(
+ char ** bitmap,
+ fortint * columnCount,
+ fortint * row,
+ fortint * column) {
+/*
+// Returns the bit at position (row,column) of bitmap.
+//
+// Called from FORTRAN:
+//
+// VALUE = GMAPBIT(BITMAP,COLCNT,N,M)
+//
+// where:
+//
+// BITMAP is an array containing the bitmap.
+// COLCNT is the number of values per row.
+// N is the row number (starting from 1)
+// M is the column number (starting from 1)
+//
+*/
+int bitNumber, byte, bit;
+char value;
+
+ bitNumber = ((*row)-1)*(*columnCount) + ((*column)-1);
+ byte = bitNumber / 8;
+ bit = bitNumber % 8;
+ value = ((*bitmap)[byte] >> (7-bit)) & 0x01;
+
+ return (fortint) value;
+}
diff --git a/interpolation/grdynam.h b/interpolation/grdynam.h
new file mode 100755
index 0000000..b736a73
--- /dev/null
+++ b/interpolation/grdynam.h
@@ -0,0 +1,169 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C**** "grdynam.h"
+C
+C PURPOSE
+C _______
+C
+C This file contains all the dynamic work space array definitions
+C for grid point to grid point interpolation.
+C
+C INTERFACE
+C _________
+C
+C #include "grdynam.h"
+C
+C Common block usage
+C __________________
+C
+C GRID_POINT
+C
+C NILATGP - POINTER to array MILATG.
+C NILONGP - POINTER to array MILONG.
+C NILSMP - POINTER to array MILSM.
+C NINPNTP - POINTER to array RINPNT.
+C NISTRTP - POINTER to array MISTRT.
+C NNSDISTP - POINTER to array MNSDIST.
+C NNSINDP - POINTER to array MNSIND.
+C NMAXP - POINTER to array RMAX.
+C NOLATGP - POINTER to array MOLATG.
+C NOLONGP - POINTER to array MOLONG.
+C NOLSMP - POINTER to array MOLSM.
+C NWEDISTP - POINTER to array MWEDIST.
+C NWEINDP - POINTER to array MWEIND.
+C NWFACTP - POINTER to array WFACT.
+C
+C MILATG - Dynamic array of length (NINS) (see nifld.common)
+C which holds the values of the input field
+C latitudes.
+C MILONG - Dynamic array of length (NIWE + 1) (see
+C nifld.common) which holds the values of the
+C input field longitudes.
+C MILSM - Dynamic array of length (NIWE, 2) (see
+C nifld.common) used in calculating the effects of
+C the land sea mask on interpolation.
+C MISTRT - Dynamic array of length (NINS) (see nifld.common)
+C which holds the array offsets of the start of
+C each latitude line for a quasi regular Gaussian
+C input field. No space is assigned to this array
+C for a regular input field.
+C MNSDIST - Dynamic array of length (2, NONS) (see
+C nofld.common) which holds the distances to
+C neighbouring latitude lines of the input field
+C from the associated line of latitude in the
+C output field.
+C MNSIND - Dynamic array of length (2, NONS) (see
+C nofld.common) which holds the latitude line
+C numbers (array offset) of the input field
+C associated with each line of latitude in the
+C output field.
+C MOLATG - Dynamic array of length (NONS) (see nofld.common)
+C which holds the values of the output field
+C latitudes.
+C MOLONG - Dynamic array of length (NOWE) (see nofld.common)
+C which holds the values of the output field
+C longitudes.
+C MOLSM - Dynamic array of length (NOWE) (see nofld.common)
+C used in calculating the effects of the land sea
+C mask on interpolation.
+C MWEDIST - Dynamic array of length (2, NONS) for a regular
+C input field and of length (2, 2 * NONS * NOWE)
+C (see nofld.common) for a quasi regular Gaussian
+C input field. This array holds the distances to
+C neighbouring longitude points of the input field
+C from the associated longitude points in the
+C output field.
+C MWEIND - Dynamic array of length (2, NONS) for a regular
+C input field and of length (2, 2 * NONS * NOWE)
+C (see nofld.common) for a quasi regular Gaussian
+C input field. This array holds the longitude
+C points (array offset) from the input field
+C associated with each longitude point in the
+C output field.
+C RINPNT - Dynamic array of length (NOWE) (see nofld.common)
+C used to aid vectorisation in processing
+C precipitation fields.
+C RMAX - Dynamic array of length (NOWE) (see nofld.common)
+C used to aid vectorisation in processing
+C precipitation fields.
+C WFACT - Dynamic array of length (4, NOWE * NONS) (see
+C nofld.common) which holds the interpolation
+C weights for each point in the output field.
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Jan 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers ECMWF June 1996
+C
+C
+C -----------------------------------------------------------------|
+C* Section 2. Pointer variable declaration and common
+C -----------------------------------------------------------------|
+C
+#ifdef POINTER_64
+ INTEGER*8
+#else
+ INTEGER
+#endif
+ 1 NILONGP, NILATGP, NOLONGP, NOLATGP, NNSINDP, NNSDISTP,
+ 2 NWEINDP, NWEDISTP, NISTRTP, NILSMP, NOLSMP, NWFACTP,
+ 3 NMAXP, NINPNTP
+C
+ COMMON /GRID_POINT/
+ 1 NILONGP, NILATGP, NOLONGP, NOLATGP, NNSINDP, NNSDISTP,
+ 2 NWEINDP, NWEDISTP, NISTRTP, NILSMP, NOLSMP, NWFACTP,
+ 3 NMAXP, NINPNTP
+C
+ SAVE /GRID_POINT/
+C
+C -----------------------------------------------------------------|
+C* Section 3. Pointer and array combination
+C Array dimensions are in nifld.common and
+C nofld.common
+C -----------------------------------------------------------------|
+C
+ INTEGER MILONG, MOLONG, MILATG, MOLATG, MNSIND, MNSDIST,
+ 1 MWEIND, MWEDIST, MISTRT, MILSM, MOLSM
+C
+ REAL WFACT, RMAX, RINPNT
+C
+ POINTER (NILONGP, MILONG (NIWE + 1) )
+ POINTER (NOLONGP, MOLONG (NOWE) )
+ POINTER (NILATGP, MILATG (NINS) )
+ POINTER (NOLATGP, MOLATG (NONS) )
+ POINTER (NNSINDP, MNSIND (2, NONS) )
+ POINTER (NNSDISTP, MNSDIST (2, NONS) )
+C
+ POINTER (NWFACTP, WFACT (4, NOWE * NONS) )
+
+C These arrays are only used as (2, NOWE) for regular input
+C
+ POINTER (NWEINDP, MWEIND (2, 2 * NOWE * NONS) )
+ POINTER (NWEDISTP, MWEDIST (2, 2 * NOWE * NONS) )
+C
+C These arrays are not used for regular input
+C
+ POINTER (NISTRTP, MISTRT (NINS) )
+C
+C These arrays are not used unless OLSM is .TRUE.
+C
+ POINTER (NILSMP, MILSM (NIWE, 2) )
+ POINTER (NOLSMP, MOLSM (NOWE) )
+C
+C Works space for precipitation
+C
+ POINTER (NMAXP, RMAX (NOWE) )
+ POINTER (NINPNTP, RINPNT (NOWE) )
diff --git a/interpolation/grfixed.h b/interpolation/grfixed.h
new file mode 100755
index 0000000..8d9cb57
--- /dev/null
+++ b/interpolation/grfixed.h
@@ -0,0 +1,77 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C**** "grfixed.h"
+C
+C PURPOSE
+C _______
+C
+C This file contains all the fixed work space array definitions for
+C grid point to grid point interpolation.
+C
+C INTERFACE
+C _________
+C
+C #include "grfixed.h"
+C
+C Common block usage
+C __________________
+C
+C FIXED_INTS
+C
+C MEXPAND - Array of length JPLG01 (see parim.h) used to
+C expand one latitude line of the 10 minute land
+C sea mask file to have one word per bit for
+C improved efficiency.
+C MILLEN - Array of length JPLAT (see parim.h) containing
+C a quasi regular Gaussian field latitude line
+C length definition. This array may be provided by
+C the interpolation definition routines.
+C MWORK - Array of length JPLONG (see parim.h) used to
+C read one latitude line of a standard land sea
+C mask file.
+C
+C FIXED_REAL
+C
+C RIGAUSS - Array of length JPLAT (see parim.h) containing a
+C full definition of the Gaussian latitudes for an
+C input field Gaussian truncation.
+C ROGAUSS - Array of length JPLAT (see parim.h) containing a
+C full definition of the Gaussian latitudes for an
+C output field Gaussian truncation.
+C
+C Author
+C ______
+C
+C K. Fielding *ECMWF* Jan 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers ECMWF June 1996
+C
+C
+C _______________________________________________________
+C
+C* Section 1. Fixed length arrays
+C _______________________________________________________
+C
+ INTEGER MILLEN(JPLAT), MWORK(JPLONG), MEXPAND(JPLG01)
+C
+ REAL RIGAUSS(JPLAT), ROGAUSS(JPLAT), ROREDLL(JPLAT)
+C
+ COMMON /FIXED_INTS/ MWORK, MILLEN, MEXPAND
+C
+ SAVE /FIXED_INTS/
+C
+ COMMON /FIXED_REAL/ RIGAUSS, ROGAUSS, ROREDLL
+C
+ SAVE /FIXED_REAL/
+C
diff --git a/interpolation/grprs.h b/interpolation/grprs.h
new file mode 100755
index 0000000..dc4e010
--- /dev/null
+++ b/interpolation/grprs.h
@@ -0,0 +1,16 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C Common blocks holding default or user supplied values for printing.
+C
+ LOGICAL GRPRSET
+ INTEGER GRPRSM
+C
+ COMMON /GRPRSCM/ GRPRSM, GRPRSET
diff --git a/interpolation/grspace.h b/interpolation/grspace.h
new file mode 100755
index 0000000..f0ed44d
--- /dev/null
+++ b/interpolation/grspace.h
@@ -0,0 +1,20 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C**** "grspace.h"
+C
+C PURPOSE
+C _______
+C
+C This file contains all the work space array definitions for
+C grid point to grid point interpolation.
+C
+#include "grfixed.h"
+#include "grdynam.h"
diff --git a/interpolation/hgengg.F b/interpolation/hgengg.F
new file mode 100755
index 0000000..d18a900
--- /dev/null
+++ b/interpolation/hgengg.F
@@ -0,0 +1,294 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HGENGG(AREA,POLE,KGNNEW,HGTYPE,KNPTS,GNLATS,
+ X IGSIZE,RLAT,RLON,NUMPTS)
+C
+C---->
+C**** HGENGG
+C
+C Purpose
+C -------
+C
+C This routine calculates the original latitude and longitude
+C values (before rotation) for a rotated gaussian grid.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HGENGG(AREA,POLE,KGNNEW,HGTYPE,KNPTS,IGSIZE,
+C X RLAT,RLON,NUMPTS)
+C
+C
+C Input parameters
+C ----------------
+C
+C AREA - Limits of area (N/W/S/E)
+C POLE - Pole of rotation (lat/long)
+C KGNNEW - Gaussian number for field
+C HGTYPE - Type of new gaussian field
+C 'F' = full, ie regular
+C 'R' = reduced, ie quasi-regular
+C KNPTS - Array containing number of points at each latitude
+C GNLATS - Array containing list of gaussian latitudes
+C IGSIZE - The size of the array to fill with the gaussian field
+C NUMPTWE - Calculate number of grid pts in range from west to east
+C
+C
+C Output parameters
+C -----------------
+C
+C RLAT - Vector of orginal latitude values for the points in
+C the rotated grid.
+C RLON - Vector of orginal longitude values for the points in
+C the rotated grid.
+C NUMPTS - Number of points in new field
+C
+C Returns 0 if function successful, non-zero otherwise.
+C
+C
+C Common block usage
+C ------------------
+C
+C None.
+C
+C
+C Method
+C ------
+C
+C The vector of points runs from West to East in rows, the rows
+C run from North to South.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C JDEBUG - Tests if debug output required.
+C HLL2XYZ - Converts a latitude/longitude position to (x,y,z)
+C wrt axes through the centre of the globe. The z-axis
+C runs from the south to north pole. The x- and y-axes
+C are in the plane of the equator with the x-axis
+C pointing out through lat/long (0,0).
+C YROTATE - Rotates the globe about the new y-axis.
+C XYZ2LL - Converts an (x,y,z) position to a latitude/longitude.
+C JMALLOC - Dynamically allocate memory
+C JFREE - Free dynamically allocated memory
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF February 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nofld.common"
+C
+C Parameters
+C
+ INTEGER JNORTH, JSOUTH, JWEST, JEAST, JW_E, JN_S, JLAT, JLON
+ REAL JSCALE
+ PARAMETER (JNORTH = 1 )
+ PARAMETER (JWEST = 2 )
+ PARAMETER (JSOUTH = 3 )
+ PARAMETER (JEAST = 4 )
+ PARAMETER (JW_E = 1 )
+ PARAMETER (JN_S = 2 )
+ PARAMETER (JLAT = 1 )
+ PARAMETER (JLON = 2 )
+ PARAMETER (JSCALE = 1000.0 )
+C
+C Function arguments
+C
+ CHARACTER*1 HGTYPE
+ INTEGER KGNNEW,KNPTS(KGNNEW*2),IGSIZE,NUMPTS
+ REAL AREA(4),POLE(2),RLAT(*),RLON(*), GNLATS(KGNNEW*2)
+C
+C Local variables
+C
+ INTEGER LOOP, LOOPI, LOOPO, IGRIDNI, NLON
+ INTEGER ISIZE, ISIZOLD, NBYTES
+ REAL GRID, X(1), Y(1), Z(1)
+ REAL RX(1), RY(1), RZ(1)
+ POINTER( IPX, X )
+ POINTER( IPY, Y )
+ POINTER( IPZ, Z )
+ POINTER( IPRX, RX )
+ POINTER( IPRY, RY )
+ POINTER( IPRZ, RZ )
+C
+ DATA ISIZOLD/-1/
+ SAVE ISIZOLD,IPX,IPY,IPZ,IPRX,IPRY,IPRZ
+C
+C Externals
+C
+ INTEGER NUMPTWE
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+C
+C Statement functions
+C
+ REAL A, B
+ LOGICAL SOUTHOF
+ SOUTHOF(A,B) = ((A) - (B)).GT.-1E-4
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HGENGG = 0
+C
+ CALL JDEBUG()
+C
+C -----------------------------------------------------------------|
+C Section 2. Calculate current grid latitudes and longitudes
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ GRID = 360.0 / REAL(KGNNEW*4)
+ IGRIDNI = NINT(GRID*JSCALE)
+C
+ NUMPTS = 0
+ NOPCNT = 0
+ NONS = 0
+ NOWE = 0
+ NO1NS = 0
+C
+ DO LOOPO = 1, KGNNEW*2
+C
+C Generate points inside the area only.
+C
+ IF( SOUTHOF(AREA(JNORTH),GNLATS(LOOPO)).AND.
+ X SOUTHOF(GNLATS(LOOPO),AREA(JSOUTH)) ) THEN
+C
+ IF( NO1NS.EQ.0 ) NO1NS = LOOPO
+ NONS = NONS + 1
+C
+C Grid step varies for a reduced (quasi-regular) gaussian grid
+C
+ IF( HGTYPE.EQ.'R' ) THEN
+ GRID = 360.0 / REAL(KNPTS(LOOPO))
+ IGRIDNI = NINT(GRID*JSCALE)
+ ENDIF
+C
+ NLON = NUMPTWE(AREA(JWEST),AREA(JEAST),GRID)
+ NOWE = NLON
+ DO LOOPI = 1, NLON
+ NUMPTS = NUMPTS + 1
+ RLAT(NUMPTS) = GNLATS(LOOPO)
+ RLON(NUMPTS) = AREA(JWEST)+REAL((LOOPI-1)*IGRIDNI)/JSCALE
+ ENDDO
+ ENDIF
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 3. Get some space for rotating the lat/longs
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ NOPCNT = NUMPTS
+ ISIZE = NUMPTS
+ IF( ISIZE.GT.ISIZOLD ) THEN
+C
+ IF( ISIZOLD.GT.0 ) CALL JFREE(IPX)
+C
+ NBYTES = 6*ISIZE*JPRLEN
+C
+ IPX = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPX = IPX/(1024*1024*1024*4)
+#endif
+ IF( IPX.EQ.0 ) THEN
+ CALL INTLOG(JP_WARN,'HGENGG: Memory allocate fail',JPQUIET)
+ HGENGG = 1
+ GOTO 900
+ ENDIF
+C
+ IPY = IPX + (ISIZE*JPRLEN)
+ IPZ = IPY + (ISIZE*JPRLEN)
+ IPRX = IPZ + (ISIZE*JPRLEN)
+ IPRY = IPRX + (ISIZE*JPRLEN)
+ IPRZ = IPRY + (ISIZE*JPRLEN)
+C
+ ISIZOLD = ISIZE
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 4. Calculate the lat/longs before rotation
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C Convert the rotated row points lat/longs to (x,y,z) coordinates
+C
+ CALL HLL2XYZ(RLAT,RLON,X,Y,Z,ISIZE)
+C
+C Rotate the rotated row points back through the original latitude
+C rotation
+C
+ CALL YROTATE(-(90.0+POLE(JLAT)),X,Y,Z,RX,RY,RZ,ISIZE)
+C
+C Convert the rotated row points adjusted (x,y,z) coordinates to
+C lat/long in the original grid (but still containing the
+C longitude rotation)
+C
+ CALL XYZ2LL(RX,RY,RZ,RLAT,RLON,ISIZE)
+C
+C Adjust the rotated line longitudes to remove the longitude
+C rotation
+C
+ DO LOOP = 1, ISIZE
+ RLON(LOOP) = RLON(LOOP) + POLE(JLON)
+ IF( RLON(LOOP).LT.0.0 ) RLON(LOOP) = RLON(LOOP) + 360.0
+ IF( RLON(LOOP).GE.360.0 ) RLON(LOOP) = RLON(LOOP) - 360.0
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hgengrd.F b/interpolation/hgengrd.F
new file mode 100755
index 0000000..ab3420f
--- /dev/null
+++ b/interpolation/hgengrd.F
@@ -0,0 +1,255 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HGENGRD(AREA,POLE,GRID,NLON,NLAT,RLAT,RLON)
+C
+C---->
+C**** HWTS12
+C
+C Purpose
+C -------
+C
+C This routine calculates the original latitude and longitude
+C values (before rotation) for a rotated grid.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HGENGRD(AREA,POLE,GRID,NLON,NLAT,RLAT,RLON)
+C
+C
+C Input parameters
+C ----------------
+C
+C AREA - Limits of area (N/W/S/E)
+C POLE - Pole of rotation (lat/long)
+C GRID - Grid increments (i/j)
+C
+C
+C Output parameters
+C -----------------
+C
+C NLON - Number of points along a parallel in the rotated grid.
+C NLAT - Number of points along a meridien in the rotated grid.
+C RLAT - Vector of orginal latitude values for the points in
+C the rotated grid.
+C RLON - Vector of orginal longitude values for the points in
+C the rotated grid.
+C
+C Returns 0 if function successful, non-zero otherwise.
+C
+C Common block usage
+C ------------------
+C
+C None.
+C
+C
+C Method
+C ------
+C
+C The vector of points runs from West to East in rows, the rows
+C run from North to South.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C JDEBUG - Tests if debug output required.
+C HLL2XYZ - Converts a latitude/longitude position to (x,y,z)
+C wrt axes through the centre of the globe. The z-axis
+C runs from the south to north pole. The x- and y-axes
+C are in the plane of the equator with the x-axis
+C pointing out through lat/long (0,0).
+C YROTATE - Rotates the globe about the new y-axis.
+C XYZ2LL - Converts an (x,y,z) position to a latitude/longitude.
+C JMALLOC - Dynamically allocate memory
+C JFREE - Free dynamically allocated memory
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JNORTH, JSOUTH, JWEST, JEAST, JW_E, JN_S, JLAT, JLON
+ REAL JSCALE
+ PARAMETER (JNORTH = 1 )
+ PARAMETER (JWEST = 2 )
+ PARAMETER (JSOUTH = 3 )
+ PARAMETER (JEAST = 4 )
+ PARAMETER (JW_E = 1 )
+ PARAMETER (JN_S = 2 )
+ PARAMETER (JLAT = 1 )
+ PARAMETER (JLON = 2 )
+ PARAMETER (JSCALE = 1000.0 )
+C
+C Function arguments
+C
+ REAL AREA(4),POLE(2),GRID(2), RLAT(*),RLON(*)
+ INTEGER NLON,NLAT
+C
+C Local variables
+C
+ INTEGER NEXT, LOOP, LOOPI, LOOPO, IGRIDNI, IGRIDNJ
+ INTEGER ISIZE, ISIZOLD, NBYTES
+ REAL ZLAT, X(1), Y(1), Z(1)
+ REAL RX(1), RY(1), RZ(1)
+ POINTER( IPX, X )
+ POINTER( IPY, Y )
+ POINTER( IPZ, Z )
+ POINTER( IPRX, RX )
+ POINTER( IPRY, RY )
+ POINTER( IPRZ, RZ )
+C
+ DATA ISIZOLD/-1/
+ SAVE ISIZOLD,IPX,IPY,IPZ,IPRX,IPRY,IPRZ
+C
+C Externals
+C
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HGENGRD = 0
+C
+ CALL JDEBUG()
+C
+C -----------------------------------------------------------------|
+C Section 2. Calculate current grid latitudes and longitudes
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ NLON = 1 + NINT((AREA(JEAST) - AREA(JWEST)) / GRID(JW_E))
+ NLAT = 1 + NINT((AREA(JNORTH) - AREA(JSOUTH)) / GRID(JN_S))
+
+ IGRIDNI = NINT(GRID(JW_E)*JSCALE)
+ IGRIDNJ = NINT(GRID(JN_S)*JSCALE)
+C
+ NEXT = 1
+ DO LOOPO = 1, NLAT
+ ZLAT = AREA(JNORTH) - REAL((LOOPO-1)*IGRIDNJ)/JSCALE
+ DO LOOPI = 1, NLON
+ RLON(NEXT) = AREA(JWEST) + REAL((LOOPI-1)*IGRIDNI)/JSCALE
+ IF( RLON(NEXT).LT.0.0 ) RLON(NEXT) = RLON(NEXT) + 360.0
+ RLAT(NEXT) = ZLAT
+ NEXT = NEXT + 1
+ ENDDO
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 3. Get some space for rotating the lat/longs
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ ISIZE = NLAT *NLON
+ IF( ISIZE.GT.ISIZOLD ) THEN
+C
+ IF( ISIZOLD.GT.0 ) CALL JFREE(IPX)
+C
+ NBYTES = 6*ISIZE*JPRLEN
+C
+ IPX = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPX = IPX/(1024*1024*1024*4)
+#endif
+ IF( IPX.EQ.0 ) THEN
+ CALL INTLOG(JP_WARN,'HGENGRD: Memory allocate fail',JPQUIET)
+ HGENGRD = 1
+ GOTO 900
+ ENDIF
+C
+ IPY = IPX + (ISIZE*JPRLEN)
+ IPZ = IPY + (ISIZE*JPRLEN)
+ IPRX = IPZ + (ISIZE*JPRLEN)
+ IPRY = IPRX + (ISIZE*JPRLEN)
+ IPRZ = IPRY + (ISIZE*JPRLEN)
+C
+ ISIZOLD = ISIZE
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 4. Calculate the lat/longs before rotation
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C Convert the rotated row points lat/longs to (x,y,z) coordinates
+C
+ CALL HLL2XYZ(RLAT,RLON,X,Y,Z,ISIZE)
+C
+C Rotate the rotated row points back through the original latitude
+C rotation
+C
+ CALL YROTATE(-(90.0+POLE(JLAT)),X,Y,Z,RX,RY,RZ,ISIZE)
+C
+C Convert the rotated row points adjusted (x,y,z) coordinates to
+C lat/long in the original grid (but still containing the
+C longitude rotation)
+C
+ CALL XYZ2LL(RX,RY,RZ,RLAT,RLON,ISIZE)
+C
+C Adjust the rotated line longitudes to remove the longitude
+C rotation
+C
+ DO LOOP = 1, ISIZE
+ RLON(LOOP) = RLON(LOOP) + POLE(JLON)
+ IF( RLON(LOOP).LT.0.0 ) RLON(LOOP) = RLON(LOOP) + 360.0
+ IF( RLON(LOOP).GE.360.0 ) RLON(LOOP) = RLON(LOOP) - 360.0
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hgengrw.F b/interpolation/hgengrw.F
new file mode 100755
index 0000000..291a930
--- /dev/null
+++ b/interpolation/hgengrw.F
@@ -0,0 +1,257 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HGENGRW(AREA,POLE,GRID,NLON,NLAT,
+ X RCLAT,RCLON,RLAT,RLON)
+C
+C---->
+C**** HWTS12
+C
+C Purpose
+C -------
+C
+C This routine calculates the original latitude and longitude
+C values (before rotation) for a rotated grid for wind fields.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HGENGRW(AREA,POLE,GRID,NLON,NLAT,RCLAT,RCLON,RLAT,RLON)
+C
+C
+C Input parameters
+C ----------------
+C
+C AREA - Limits of area (N/W/S/E)
+C POLE - Pole of rotation (lat/long)
+C GRID - Grid increments (i/j)
+C
+C
+C Output parameters
+C -----------------
+C
+C NLON - Number of points along a parallel in the rotated grid.
+C NLAT - Number of points along a meridien in the rotated grid.
+C RCLAT - Vector of latitude values for the points in current grid.
+C RCLON - Vector of longitude values for the points in current grid.
+C RLAT - Vector of orginal latitude values for the points in
+C the rotated grid.
+C RLON - Vector of orginal longitude values for the points in
+C the rotated grid.
+C
+C Returns 0 if function successful, non-zero otherwise.
+C
+C Common block usage
+C ------------------
+C
+C None.
+C
+C
+C Method
+C ------
+C
+C The vector of points runs from West to East in rows, the rows
+C run from North to South.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C JDEBUG - Tests if debug output required.
+C HLL2XYZ - Converts a latitude/longitude position to (x,y,z)
+C wrt axes through the centre of the globe. The z-axis
+C runs from the south to north pole. The x- and y-axes
+C are in the plane of the equator with the x-axis
+C pointing out through lat/long (0,0).
+C YROTATE - Rotates the globe about the new y-axis.
+C XYZ2LL - Converts an (x,y,z) position to a latitude/longitude.
+C JMALLOC - Dynamically allocate memory
+C JFREE - Free dynamically allocated memory
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JNORTH, JSOUTH, JWEST, JEAST, JW_E, JN_S, JLAT, JLON
+ REAL JSCALE
+ PARAMETER (JNORTH = 1 )
+ PARAMETER (JWEST = 2 )
+ PARAMETER (JSOUTH = 3 )
+ PARAMETER (JEAST = 4 )
+ PARAMETER (JW_E = 1 )
+ PARAMETER (JN_S = 2 )
+ PARAMETER (JLAT = 1 )
+ PARAMETER (JLON = 2 )
+ PARAMETER (JSCALE = 1000.0 )
+C
+C Function arguments
+C
+ REAL AREA(4),POLE(2),GRID(2), RCLAT(*),RCLON(*),RLAT(*),RLON(*)
+ INTEGER NLON,NLAT
+C
+C Local variables
+C
+ INTEGER NEXT, LOOP, LOOPI, LOOPO, IGRIDNI, IGRIDNJ
+ INTEGER ISIZE, ISIZOLD, NBYTES
+ REAL ZLAT, X(1), Y(1), Z(1)
+ REAL RX(1), RY(1), RZ(1)
+ POINTER( IPX, X )
+ POINTER( IPY, Y )
+ POINTER( IPZ, Z )
+ POINTER( IPRX, RX )
+ POINTER( IPRY, RY )
+ POINTER( IPRZ, RZ )
+C
+ DATA ISIZOLD/-1/
+ SAVE ISIZOLD,IPX,IPY,IPZ,IPRX,IPRY,IPRZ
+C
+C Externals
+C
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HGENGRW = 0
+C
+ CALL JDEBUG()
+C
+C -----------------------------------------------------------------|
+C Section 2. Calculate current grid latitudes and longitudes
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ NLON = 1 + NINT((AREA(JEAST) - AREA(JWEST)) / GRID(JW_E))
+ NLAT = 1 + NINT((AREA(JNORTH) - AREA(JSOUTH)) / GRID(JN_S))
+ IGRIDNI = NINT(GRID(JW_E)*JSCALE)
+ IGRIDNJ = NINT(GRID(JN_S)*JSCALE)
+C
+ NEXT = 1
+ DO LOOPO = 1, NLAT
+ ZLAT = AREA(JNORTH) - REAL((LOOPO-1)*IGRIDNJ)/JSCALE
+ DO LOOPI = 1, NLON
+ RCLON(NEXT) = AREA(JWEST) + REAL((LOOPI-1)*IGRIDNI)/JSCALE
+ IF( RCLON(NEXT).LT.0.0 ) RCLON(NEXT) = RCLON(NEXT) + 360.0
+ RCLAT(NEXT) = ZLAT
+ NEXT = NEXT + 1
+ ENDDO
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 3. Get some space for rotating the lat/longs
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ ISIZE = NLAT *NLON
+ IF( ISIZE.GT.ISIZOLD ) THEN
+C
+ IF( ISIZOLD.GT.0 ) CALL JFREE(IPX)
+C
+ NBYTES = 6*ISIZE*JPRLEN
+C
+ IPX = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPX = IPX/(1024*1024*1024*4)
+#endif
+ IF( IPX.EQ.0 ) THEN
+ CALL INTLOG(JP_WARN,'HGENGRW: Memory allocate fail',JPQUIET)
+ HGENGRW = 1
+ GOTO 900
+ ENDIF
+C
+ IPY = IPX + (ISIZE*JPRLEN)
+ IPZ = IPY + (ISIZE*JPRLEN)
+ IPRX = IPZ + (ISIZE*JPRLEN)
+ IPRY = IPRX + (ISIZE*JPRLEN)
+ IPRZ = IPRY + (ISIZE*JPRLEN)
+C
+ ISIZOLD = ISIZE
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 4. Calculate the lat/longs before rotation
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C Convert the rotated row points lat/longs to (x,y,z) coordinates
+C
+ CALL HLL2XYZ(RCLAT,RCLON,X,Y,Z,ISIZE)
+C
+C Rotate the rotated row points back through the original latitude
+C rotation
+C
+ CALL YROTATE(-(90.0+POLE(JLAT)),X,Y,Z,RX,RY,RZ,ISIZE)
+C
+C Convert the rotated row points adjusted (x,y,z) coordinates to
+C lat/long in the original grid (but still containing the
+C longitude rotation)
+C
+ CALL XYZ2LL(RX,RY,RZ,RLAT,RLON,ISIZE)
+C
+C Adjust the rotated line longitudes to remove the longitude
+C rotation
+C
+ DO LOOP = 1, ISIZE
+ RLON(LOOP) = RLON(LOOP) + POLE(JLON)
+ IF( RLON(LOOP).LT.0.0 ) RLON(LOOP) = RLON(LOOP) + 360.0
+ IF( RLON(LOOP).GE.360.0 ) RLON(LOOP) = RLON(LOOP) - 360.0
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hgenll.F b/interpolation/hgenll.F
new file mode 100755
index 0000000..ac2fcb0
--- /dev/null
+++ b/interpolation/hgenll.F
@@ -0,0 +1,254 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HGENLL(AREA,POLE,GRID,NLON,NLAT,RLAT,RLON)
+C
+C---->
+C**** HGENLL
+C
+C Purpose
+C -------
+C
+C This routine calculates the original latitude and longitude
+C values (before rotation) for a rotatedlat/long grid.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HGENLL(AREA,POLE,GRID,NLON,NLAT,RLAT,RLON)
+C
+C
+C Input parameters
+C ----------------
+C
+C AREA - Limits of area (N/W/S/E)
+C POLE - Pole of rotation (lat/long)
+C GRID - Grid increments (i/j)
+C
+C
+C Output parameters
+C -----------------
+C
+C NLON - Number of points along a parallel in the rotated grid.
+C NLAT - Number of points along a meridien in the rotated grid.
+C RLAT - Vector of orginal latitude values for the points in
+C the rotated grid.
+C RLON - Vector of orginal longitude values for the points in
+C the rotated grid.
+C
+C Returns 0 if function successful, non-zero otherwise.
+C
+C Common block usage
+C ------------------
+C
+C None.
+C
+C
+C Method
+C ------
+C
+C The vector of points runs from West to East in rows, the rows
+C run from North to South.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C JDEBUG - Tests if debug output required.
+C HLL2XYZ - Converts a latitude/longitude position to (x,y,z)
+C wrt axes through the centre of the globe. The z-axis
+C runs from the south to north pole. The x- and y-axes
+C are in the plane of the equator with the x-axis
+C pointing out through lat/long (0,0).
+C YROTATE - Rotates the globe about the new y-axis.
+C XYZ2LL - Converts an (x,y,z) position to a latitude/longitude.
+C JMALLOC - Dynamically allocate memory
+C JFREE - Free dynamically allocated memory
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JNORTH, JSOUTH, JWEST, JEAST, JW_E, JN_S, JLAT, JLON
+ REAL JSCALE
+ PARAMETER (JNORTH = 1 )
+ PARAMETER (JWEST = 2 )
+ PARAMETER (JSOUTH = 3 )
+ PARAMETER (JEAST = 4 )
+ PARAMETER (JW_E = 1 )
+ PARAMETER (JN_S = 2 )
+ PARAMETER (JLAT = 1 )
+ PARAMETER (JLON = 2 )
+ PARAMETER (JSCALE = 1000.0 )
+C
+C Function arguments
+C
+ REAL AREA(4),POLE(2),GRID(2), RLAT(*),RLON(*)
+ INTEGER NLON,NLAT
+C
+C Local variables
+C
+ INTEGER NEXT, LOOP, LOOPI, LOOPO, IGRIDNI, IGRIDNJ
+ INTEGER ISIZE, ISIZOLD, NBYTES
+ REAL ZLAT, X(1), Y(1), Z(1)
+ REAL RX(1), RY(1), RZ(1)
+ POINTER( IPX, X )
+ POINTER( IPY, Y )
+ POINTER( IPZ, Z )
+ POINTER( IPRX, RX )
+ POINTER( IPRY, RY )
+ POINTER( IPRZ, RZ )
+C
+ DATA ISIZOLD/-1/
+ SAVE ISIZOLD,IPX,IPY,IPZ,IPRX,IPRY,IPRZ
+C
+C Externals
+C
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HGENLL = 0
+C
+ CALL JDEBUG()
+C
+C -----------------------------------------------------------------|
+C Section 2. Calculate current grid latitudes and longitudes
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ NLON = 1 + NINT((AREA(JEAST) - AREA(JWEST)) / GRID(JW_E))
+ NLAT = 1 + NINT((AREA(JNORTH) - AREA(JSOUTH)) / GRID(JN_S))
+ IGRIDNI = NINT(GRID(JW_E)*JSCALE)
+ IGRIDNJ = NINT(GRID(JN_S)*JSCALE)
+C
+ NEXT = 1
+ DO LOOPO = 1, NLAT
+ ZLAT = AREA(JNORTH) - REAL((LOOPO-1)*IGRIDNJ)/JSCALE
+ DO LOOPI = 1, NLON
+ RLON(NEXT) = AREA(JWEST) + REAL((LOOPI-1)*IGRIDNI)/JSCALE
+ IF( RLON(NEXT).LT.0.0 ) RLON(NEXT) = RLON(NEXT) + 360.0
+ RLAT(NEXT) = ZLAT
+ NEXT = NEXT + 1
+ ENDDO
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 3. Get some space for rotating the lat/longs
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ ISIZE = NLAT *NLON
+ IF( ISIZE.GT.ISIZOLD ) THEN
+C
+ IF( ISIZOLD.GT.0 ) CALL JFREE(IPX)
+C
+ NBYTES = 6*ISIZE*JPRLEN
+C
+ IPX = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPX = IPX/(1024*1024*1024*4)
+#endif
+ IF( IPX.EQ.0 ) THEN
+ CALL INTLOG(JP_WARN,'HGENLL: Memory allocate fail',JPQUIET)
+ HGENLL = 1
+ GOTO 900
+ ENDIF
+C
+ IPY = IPX + (ISIZE*JPRLEN)
+ IPZ = IPY + (ISIZE*JPRLEN)
+ IPRX = IPZ + (ISIZE*JPRLEN)
+ IPRY = IPRX + (ISIZE*JPRLEN)
+ IPRZ = IPRY + (ISIZE*JPRLEN)
+C
+ ISIZOLD = ISIZE
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 4. Calculate the lat/longs before rotation
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C Convert the rotated row points lat/longs to (x,y,z) coordinates
+C
+ CALL HLL2XYZ(RLAT,RLON,X,Y,Z,ISIZE)
+C
+C Rotate the rotated row points back through the original latitude
+C rotation
+C
+ CALL YROTATE(-(90.0+POLE(JLAT)),X,Y,Z,RX,RY,RZ,ISIZE)
+C
+C Convert the rotated row points adjusted (x,y,z) coordinates to
+C lat/long in the original grid (but still containing the
+C longitude rotation)
+C
+ CALL XYZ2LL(RX,RY,RZ,RLAT,RLON,ISIZE)
+C
+C Adjust the rotated line longitudes to remove the longitude
+C rotation
+C
+ DO LOOP = 1, ISIZE
+ RLON(LOOP) = RLON(LOOP) + POLE(JLON)
+ IF( RLON(LOOP).LT.0.0 ) RLON(LOOP) = RLON(LOOP) + 360.0
+ IF( RLON(LOOP).GE.360.0 ) RLON(LOOP) = RLON(LOOP) - 360.0
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hgenllw.F b/interpolation/hgenllw.F
new file mode 100755
index 0000000..d1d96e0
--- /dev/null
+++ b/interpolation/hgenllw.F
@@ -0,0 +1,257 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HGENLLW(AREA,POLE,GRID,NLON,NLAT,
+ X RCLAT,RCLON,RLAT,RLON)
+C
+C---->
+C**** HGENLLW
+C
+C Purpose
+C -------
+C
+C This routine calculates the original latitude and longitude
+C values (before rotation) for a rotated grid for wind fields.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HGENLLW(AREA,POLE,GRID,NLON,NLAT,RCLAT,RCLON,RLAT,RLON)
+C
+C
+C Input parameters
+C ----------------
+C
+C AREA - Limits of area (N/W/S/E)
+C POLE - Pole of rotation (lat/long)
+C GRID - Grid increments (i/j)
+C
+C
+C Output parameters
+C -----------------
+C
+C NLON - Number of points along a parallel in the rotated grid.
+C NLAT - Number of points along a meridien in the rotated grid.
+C RCLAT - Vector of latitude values for the points in current grid.
+C RCLON - Vector of longitude values for the points in current grid.
+C RLAT - Vector of orginal latitude values for the points in
+C the rotated grid.
+C RLON - Vector of orginal longitude values for the points in
+C the rotated grid.
+C
+C Returns 0 if function successful, non-zero otherwise.
+C
+C Common block usage
+C ------------------
+C
+C None.
+C
+C
+C Method
+C ------
+C
+C The vector of points runs from West to East in rows, the rows
+C run from North to South.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C JDEBUG - Tests if debug output required.
+C HLL2XYZ - Converts a latitude/longitude position to (x,y,z)
+C wrt axes through the centre of the globe. The z-axis
+C runs from the south to north pole. The x- and y-axes
+C are in the plane of the equator with the x-axis
+C pointing out through lat/long (0,0).
+C YROTATE - Rotates the globe about the new y-axis.
+C XYZ2LL - Converts an (x,y,z) position to a latitude/longitude.
+C JMALLOC - Dynamically allocate memory
+C JFREE - Free dynamically allocated memory
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JNORTH, JSOUTH, JWEST, JEAST, JW_E, JN_S, JLAT, JLON
+ REAL JSCALE
+ PARAMETER (JNORTH = 1 )
+ PARAMETER (JWEST = 2 )
+ PARAMETER (JSOUTH = 3 )
+ PARAMETER (JEAST = 4 )
+ PARAMETER (JW_E = 1 )
+ PARAMETER (JN_S = 2 )
+ PARAMETER (JLAT = 1 )
+ PARAMETER (JLON = 2 )
+ PARAMETER (JSCALE = 1000.0 )
+C
+C Function arguments
+C
+ REAL AREA(4),POLE(2),GRID(2), RCLAT(*),RCLON(*),RLAT(*),RLON(*)
+ INTEGER NLON,NLAT
+C
+C Local variables
+C
+ INTEGER NEXT, LOOP, LOOPI, LOOPO, IGRIDNI, IGRIDNJ
+ INTEGER ISIZE, ISIZOLD, NBYTES
+ REAL ZLAT, X(1), Y(1), Z(1)
+ REAL RX(1), RY(1), RZ(1)
+ POINTER( IPX, X )
+ POINTER( IPY, Y )
+ POINTER( IPZ, Z )
+ POINTER( IPRX, RX )
+ POINTER( IPRY, RY )
+ POINTER( IPRZ, RZ )
+C
+ DATA ISIZOLD/-1/
+ SAVE ISIZOLD,IPX,IPY,IPZ,IPRX,IPRY,IPRZ
+C
+C Externals
+C
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HGENLLW = 0
+C
+ CALL JDEBUG()
+C
+C -----------------------------------------------------------------|
+C Section 2. Calculate current grid latitudes and longitudes
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ NLON = 1 + INT((AREA(JEAST) - AREA(JWEST)) / GRID(JW_E))
+ NLAT = 1 + INT((AREA(JNORTH) - AREA(JSOUTH)) / GRID(JN_S))
+ IGRIDNI = NINT(GRID(JW_E)*JSCALE)
+ IGRIDNJ = NINT(GRID(JN_S)*JSCALE)
+C
+ NEXT = 1
+ DO LOOPO = 1, NLAT
+ ZLAT = AREA(JNORTH) - REAL((LOOPO-1)*IGRIDNJ)/JSCALE
+ DO LOOPI = 1, NLON
+ RCLON(NEXT) = AREA(JWEST) + REAL((LOOPI-1)*IGRIDNI)/JSCALE
+ IF( RCLON(NEXT).LT.0.0 ) RCLON(NEXT) = RCLON(NEXT) + 360.0
+ RCLAT(NEXT) = ZLAT
+ NEXT = NEXT + 1
+ ENDDO
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 3. Get some space for rotating the lat/longs
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ ISIZE = NLAT *NLON
+ IF( ISIZE.GT.ISIZOLD ) THEN
+C
+ IF( ISIZOLD.GT.0 ) CALL JFREE(IPX)
+C
+ NBYTES = 6*ISIZE*JPRLEN
+C
+ IPX = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPX = IPX/(1024*1024*1024*4)
+#endif
+ IF( IPX.EQ.0 ) THEN
+ CALL INTLOG(JP_WARN,'HGENLLW: Memory allocate fail',JPQUIET)
+ HGENLLW = 1
+ GOTO 900
+ ENDIF
+C
+ IPY = IPX + (ISIZE*JPRLEN)
+ IPZ = IPY + (ISIZE*JPRLEN)
+ IPRX = IPZ + (ISIZE*JPRLEN)
+ IPRY = IPRX + (ISIZE*JPRLEN)
+ IPRZ = IPRY + (ISIZE*JPRLEN)
+C
+ ISIZOLD = ISIZE
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 4. Calculate the lat/longs before rotation
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C Convert the rotated row points lat/longs to (x,y,z) coordinates
+C
+ CALL HLL2XYZ(RCLAT,RCLON,X,Y,Z,ISIZE)
+C
+C Rotate the rotated row points back through the original latitude
+C rotation
+C
+ CALL YROTATE(-(90.0+POLE(JLAT)),X,Y,Z,RX,RY,RZ,ISIZE)
+C
+C Convert the rotated row points adjusted (x,y,z) coordinates to
+C lat/long in the original grid (but still containing the
+C longitude rotation)
+C
+ CALL XYZ2LL(RX,RY,RZ,RLAT,RLON,ISIZE)
+C
+C Adjust the rotated line longitudes to remove the longitude
+C rotation
+C
+ DO LOOP = 1, ISIZE
+ RLON(LOOP) = RLON(LOOP) + POLE(JLON)
+ IF( RLON(LOOP).LT.0.0 ) RLON(LOOP) = RLON(LOOP) + 360.0
+ IF( RLON(LOOP).GE.360.0 ) RLON(LOOP) = RLON(LOOP) - 360.0
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hgetlsm.F b/interpolation/hgetlsm.F
new file mode 100755
index 0000000..7255515
--- /dev/null
+++ b/interpolation/hgetlsm.F
@@ -0,0 +1,216 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HGETLSM(KGAUSS,OLDLSM,KSIZE)
+C
+C---->
+C**** HGETLSM
+C
+C Purpose
+C -------
+C
+C This routine reads a file of reduced gaussian field land-sea
+C mask values.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HGETLSM(KGAUSS,OLDLSM,KSIZE)
+C
+C
+C Input parameters
+C ----------------
+C
+C KGAUSS - Gaussian number of the reduced gaussian field
+C KSIZE - Number of bytes to read into OLDLSM
+C
+C
+C Output parameters
+C -----------------
+C
+C OLDLSM - The array of values for the reduced gaussian field
+C
+C Returns 0 if function successful, non-zero otherwise.
+C
+C Common block usage
+C ------------------
+C
+C None
+C
+C
+C Method
+C ------
+C
+C Gets pathname from HIRLAM_LSM_PATH and reads land-sea mask
+C from a file.
+C
+C
+C Externals
+C ---------
+C
+C GETENV - Read environment variable
+C INTLOG - Log error message.
+C PBOPEN - Open land-sea mask file
+C PBREAD - Read land-sea mask file
+C PBCLOSE - Close land-sea mask file
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF March 2001
+C
+C
+C Modifications
+C -------------
+C
+C Replace PBOPEN, etc by PBOPEN3, etc on VPP.
+C J.D.Chambers ECMWF December 2001
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Function arguments
+C
+ INTEGER KGAUSS, KSIZE
+ REAL OLDLSM(*)
+
+
+C
+C Local variables
+C
+ CHARACTER*256 FILENAME
+ CHARACTER*256 YPNORMAS,YENVBACK
+ CHARACTER*56 YPNORMAL
+ CHARACTER*7 VPP
+ CHARACTER*4 YGAUSS
+ INTEGER IOFFS, IOFFSET, IUNIT, IRET
+ PARAMETER (YPNORMAL ='/usr/local/lib/metaps/tables/interpolation')
+
+#ifdef TABLE_PATH
+ DATA YPNORMAS / TABLE_PATH /
+#else
+ DATA YPNORMAS / '' /
+#endif
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HGETLSM = 0
+C
+ CALL JDEBUG()
+C
+C -----------------------------------------------------------------|
+C Section 2. Build the land-sea mask file pathname
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C
+C See if the environment variable points to a directory
+C
+C
+ FILENAME = YPNORMAL
+C
+ IOFFSET = INDEX(YPNORMAS,' ') - 1
+ IF(IOFFSET.GT.0) THEN
+ FILENAME = YPNORMAS(1:IOFFSET)//'/land_sea_mask/'
+ ENDIF
+
+ CALL GETENV('HIRLAM_LSM_PATH', YENVBACK)
+ IOFFSET = INDEX(YENVBACK,' ') - 1
+ IF(IOFFSET.GT.0) THEN
+ FILENAME = YENVBACK(1:IOFFSET)//'/land_sea_mask/'
+ ENDIF
+C
+C Complete the filename
+C
+ IOFFS = INDEX(FILENAME,' ')
+ FILENAME(IOFFS:(IOFFS+7)) = '/LSM_GG_'
+ IOFFS = INDEX(FILENAME,' ')
+ WRITE(YGAUSS,'(I4.4)') KGAUSS
+ FILENAME(IOFFS:(IOFFS+4)) = YGAUSS
+C
+ IOFFS = INDEX(FILENAME,' ')
+ CALL INTLOG(JP_DEBUG,'HGETLSM: land-sea mask filename',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'HGETLSM: ' // FILENAME(1:(IOFFS-1)),JPQUIET)
+C
+C -----------------------------------------------------------------|
+C Section 3. Read the land-sea mask values
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+#ifdef __uxp__
+ CALL PBOPEN3(IUNIT,FILENAME(1:(IOFFS-1)),'r',IRET)
+#else
+ CALL PBOPEN(IUNIT,FILENAME(1:(IOFFS-1)),'r',IRET)
+#endif
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_DEBUG,'HGETLSM: PBOPEN Iret',IRET)
+ CALL INTLOG(JP_DEBUG,'HGETLSM: PBOPEN failed',JPQUIET)
+ HGETLSM = 3
+ GOTO 900
+ ENDIF
+C
+#ifdef __uxp__
+ CALL PBREAD3(IUNIT,OLDLSM,KSIZE,IRET)
+#else
+ CALL PBREAD(IUNIT,OLDLSM,KSIZE,IRET)
+#endif
+ IF( IRET.NE.KSIZE ) THEN
+ CALL INTLOG(JP_DEBUG,'HGETLSM: PBREAD failed',JPQUIET)
+ HGETLSM = 3
+ GOTO 900
+ ENDIF
+C
+#ifdef __uxp__
+ CALL PBCLOSE3(IUNIT,IRET)
+#else
+ CALL PBCLOSE(IUNIT,IRET)
+#endif
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_DEBUG,'HGETLSM: PBCLOSE failed',JPQUIET)
+ HGETLSM = 3
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 9. Return.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hirlam.F b/interpolation/hirlam.F
new file mode 100755
index 0000000..79b2ac5
--- /dev/null
+++ b/interpolation/hirlam.F
@@ -0,0 +1,653 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HIRLAM(L12PNT,OLDFLD,KOUNT,KGAUSS,AREA,POLE,
+ X GRID,NEWFLD,KSIZE,NLON,NLAT)
+C
+C---->
+C**** HIRLAM
+C
+C Purpose
+C -------
+C
+C This routine creates a rotated regular lat/long field from a
+C gaussian field using 12-point horizontal interpolation.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HIRLAM(L12PNT,OLDFLD,KOUNT,KGAUSS,AREA,POLE,
+C X GRID,NEWFLD,KSIZE,NLON,NLAT)
+C
+C
+C Input parameters
+C ----------------
+C
+C L12PNT - Chooses between 12-point and 4-point interpolation
+C = .TRUE. for 12-point horizontal
+C = .FALSE. for 4-point
+C OLDFLD - The array of values from the gaussian field
+C KOUNT - Number of values in OLDFLD
+C KGAUSS - Gaussian number of the gaussian field
+C AREA - Limits of output area (N/W/S/E)
+C POLE - Pole of rotation (lat/long)
+C GRID - Output lat/long grid increments (we/ns)
+C KSIZE - The size of the output array to fill with the regular
+C lat/long field
+C
+C
+C Output parameters
+C -----------------
+C
+C NEWFLD - The array of values for the regular lat/long field
+C NLON - Number of longitudes in the regular lat/long field
+C NLAT - Number of latitudes in the regular lat/long field
+C
+C Returns 0 if function successful, non-zero otherwise.
+C
+C Common block usage
+C ------------------
+C
+C nifld.common
+C nofld.common
+C
+C
+C Method
+C ------
+C
+C Numbering of the points (I is the interpolation point):
+C
+C 13 5 6 14
+C
+C 7 1 2 8
+C (I)
+C 9 3 4 10
+C
+C 15 11 12 16
+C
+C The 12-point interpolation is not possible if either of the top
+C two rows is above the original field northern latitude. The
+C nearest neighbour is used if both rows are above, and a 4-pt
+C bilinear interpolation is used if the top row is above.
+C Similarily, if either of the bottom two rows is below the original
+C field southern latitude.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C JMALLOC - Dynamically allocate memory
+C JFREE - Free dynamically allocated memory
+C JGETGG - Reads the definition of a gaussian grid
+C HGENGRD - Calculates original lat/long (before rotation) for
+C a rotated grid
+C HNEI12 - Finds neighbours for points for interpolation
+C HWTS12 - Calculates weightings for points for interpolation
+C CHKPREC - Check if precipitation threshold has been redefined
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Parameters
+C
+ INTEGER JNORTH, JSOUTH, JWEST, JEAST, JW_E, JN_S, JLAT, JLON
+ INTEGER JP12PT, JP4PT, JPNEARN
+ PARAMETER (JP12PT = 0)
+ PARAMETER (JP4PT = 1)
+ PARAMETER (JPNEARN = 2)
+ PARAMETER (JNORTH = 1 )
+ PARAMETER (JWEST = 2 )
+ PARAMETER (JSOUTH = 3 )
+ PARAMETER (JEAST = 4 )
+ PARAMETER (JW_E = 1 )
+ PARAMETER (JN_S = 2 )
+ PARAMETER (JLAT = 1 )
+ PARAMETER (JLON = 2 )
+C
+C Function arguments
+C
+ LOGICAL L12PNT
+ INTEGER KOUNT, KGAUSS, KSIZE, NLON, NLAT
+ REAL AREA(4), POLE(2), GRID(2), OLDFLD(*), NEWFLD(KSIZE)
+C
+C Local variables
+C
+ INTEGER NEXT,LOOP,IRET,NLEN,IOGAUSS,IOREPR,NBYTES,NUMBER
+ INTEGER NEAREST, NEND, ITEMP, COUNT
+C
+ CHARACTER*12 YFLAG
+ LOGICAL LNEW, LFIRST, LVEGGY
+ INTEGER KSCHEME(1),NEIGH(12,1), KLA(1)
+ REAL PWTS(12,1)
+ POINTER (IPKSCHE, KSCHEME)
+ POINTER (IPNEIGH, NEIGH)
+ POINTER (IPKLA, KLA)
+ POINTER (IPPWTS, PWTS)
+C
+ REAL PDLO0(1),PDLO1(1),PDLO2(1),PDLO3(1),PDLAT(1)
+ POINTER (IPPDLO0, PDLO0)
+ POINTER (IPPDLO1, PDLO1)
+ POINTER (IPPDLO2, PDLO2)
+ POINTER (IPPDLO3, PDLO3)
+ POINTER (IPPDLAT, PDLAT)
+C
+ INTEGER IGG, IGGOLD
+ INTEGER KPTS(1)
+ REAL GLATS(1)
+ INTEGER IOFFS(1)
+ POINTER (IPKPTS, KPTS)
+ POINTER (IPIOFFS, IOFFS)
+ POINTER (IPGLATS, GLATS)
+C
+ INTEGER ILL, ILLOLD
+ REAL RLAT(1),RLON(1)
+ POINTER (IPRLAT, RLAT)
+ POINTER (IPRLON, RLON)
+C
+ REAL OLD(KOUNT)
+C
+ DATA IOGAUSS/-1/,IOREPR/-1/
+ DATA LNEW/.FALSE./, LFIRST/.TRUE./
+ DATA IGGOLD/-1/, ILLOLD/-1/
+ DATA NUMBER/-1/
+C
+ SAVE LNEW, LFIRST
+ SAVE IPKSCHE, IPNEIGH, IPKLA, IPPWTS
+ SAVE IPPDLO0, IPPDLO1, IPPDLO2, IPPDLO3, IPPDLAT
+ SAVE IOGAUSS,IOREPR, IGGOLD, IPKPTS, IPIOFFS, IPGLATS
+ SAVE ILLOLD, IPRLAT, IPRLON
+ SAVE NUMBER
+C
+C Externals
+C
+ INTEGER HNEI12, HGENGRD
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+C
+C Statement function
+C
+ REAL A, B
+ LOGICAL NOTEQ
+ NOTEQ(A,B) = (ABS((A)-(B)).GT.(ABS(A)*1E-3))
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HIRLAM = 0
+C
+ CALL JDEBUG()
+C
+ IF( L12PNT ) THEN
+ CALL INTLOG(JP_DEBUG,'HIRLAM: 12-pt interpolation',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'HIRLAM: 4-pt interpolation',JPQUIET)
+ ENDIF
+C
+ CALL CHKPREC()
+ IF( LPREC )THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'HIRLAM: precipitation threshold applied',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'HIRLAM: precipitation threshold not applied',JPQUIET)
+ ENDIF
+C Are we handling vegetation parameter
+ LVEGGY = (NITABLE.EQ.128).AND.
+ X ((NIPARAM.EQ.27).OR.
+ X (NIPARAM.EQ.28).OR.
+ X (NIPARAM.EQ.29).OR.
+ X (NIPARAM.EQ.30).OR.
+ X (NIPARAM.EQ.43) )
+
+C Force nearest neighbour processing with env variable
+ CALL GETENV('NEAREST_NEIGHBOUR', YFLAG)
+ IF( YFLAG(1:1).EQ.'1' ) LVEGGY = .TRUE.
+
+C Force nearest neighbour processing with INTOUT parameter
+ IF( LMETHOD ) LVEGGY = .TRUE.
+
+ IF( LVEGGY ) CALL INTLOG(JP_DEBUG,
+ X 'HIRLAM: nearest neighbour processing (vegetation)',JPQUIET)
+C
+
+C
+C Dynamically allocate memory for gaussian grid information.
+C
+ IGG = KGAUSS*2
+C
+ IF( IGG.GT.IGGOLD ) THEN
+C
+ IF( IGGOLD.GT.0 ) CALL JFREE(IPKPTS)
+C
+ NBYTES = (IGG*JPRLEN) + (2*IGG+1)*JPBYTES
+C
+ IPKPTS = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPKPTS = IPKPTS/(1024*1024*1024*4)
+#endif
+ IF( IPKPTS.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HIRLAM: Memory allocation fail',JPQUIET)
+ HIRLAM = 1
+ GOTO 900
+ ENDIF
+C
+ IPGLATS = IPKPTS + (IGG*JPBYTES)
+ IPIOFFS = IPGLATS + (IGG*JPRLEN)
+C
+ IGGOLD = IGG
+ IOGAUSS = -1
+ IOREPR = -1
+C
+ ENDIF
+C
+C Build up offsets to start of each latitude in the original field.
+C
+ IF( (KGAUSS.NE.IOGAUSS).OR.(IOREPR.NE.NIREPR) ) THEN
+ IF( NIREPR.EQ.JPGAUSSIAN ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'HIRLAM: trying for regular gaussian N',KGAUSS)
+ CALL JGETGG(KGAUSS,'F',GLATS,KPTS,IRET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'HIRLAM: trying for reduced gaussian N',KGAUSS)
+ CALL JGETGG(KGAUSS,'R',GLATS,KPTS,IRET)
+ ENDIF
+C
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HIRLAM: JGETGG failed to get gaussian data',JPQUIET)
+ HIRLAM = 2
+ GOTO 900
+ ENDIF
+C
+ IOFFS(1) = 1
+ DO LOOP = 2, (KGAUSS*2+1)
+ IOFFS(LOOP) = IOFFS(LOOP-1) + KPTS(LOOP-1)
+ ENDDO
+ NUMBER = (IOFFS(KGAUSS*2+1) - 1)
+C
+C Check whether number of gaussian points agrees with grid
+C specification. If not and grid is N80/N160, try the 12-pt
+C specification.
+C
+ IF( NUMBER.NE.KOUNT ) THEN
+ IF( (KGAUSS.EQ.80).OR.(KGAUSS.EQ.160) ) THEN
+ ITEMP = NGSPEC
+ NGSPEC = 12
+ IF( NIREPR.EQ.JPQUASI ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'HIRLAM: trying for 12-pt reduced gaussian N',KGAUSS)
+ CALL JGETGG(KGAUSS,'R',GLATS,KPTS,IRET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'HIRLAM: trying for 12-pt regular gaussian N',KGAUSS)
+ CALL JGETGG(KGAUSS,'F',GLATS,KPTS,IRET)
+ ENDIF
+ NGSPEC = ITEMP
+C
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HIRLAM: JGETGG failed to get gaussian data',JPQUIET)
+ HIRLAM = 2
+ GOTO 900
+ ENDIF
+C
+ IOFFS(1) = 1
+ DO LOOP = 2, (KGAUSS*2+1)
+ IOFFS(LOOP) = IOFFS(LOOP-1) + KPTS(LOOP-1)
+ ENDDO
+ NUMBER = (IOFFS(KGAUSS*2+1) - 1)
+C
+ IF( NUMBER.NE.KOUNT ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HIRLAM: Given number of points =',KOUNT)
+ CALL INTLOG(JP_ERROR,
+ X 'HIRLAM: Expected number of pts =',NUMBER)
+ HIRLAM = 4
+ GOTO 900
+ ENDIF
+ ELSE
+C
+ CALL INTLOG(JP_ERROR,
+ X 'HIRLAM: Given number of points =',KOUNT)
+ CALL INTLOG(JP_ERROR,
+ X 'HIRLAM: Expected number of pts =',NUMBER)
+ HIRLAM = 4
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+ IOGAUSS = KGAUSS
+ IOREPR = NIREPR
+ ENDIF
+C
+C Preserve the input field
+C (in case OLDFLD and NEWFLD are the same arrays)
+C
+ NUMBER = (IOFFS(KGAUSS*2+1) - 1)
+ DO LOOP = 1, NUMBER
+ OLD(LOOP) = OLDFLD(LOOP)
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 2. Generate the lat/long points for the output grid
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ NLON = 1 + NINT((AREA(JEAST) - AREA(JWEST)) / GRID(JW_E)) ! DJ Mar-05
+ NLAT = 1 + NINT((AREA(JNORTH) - AREA(JSOUTH)) / GRID(JN_S)) ! DJ Mar-05
+C
+ NLEN = NLON * NLAT
+
+ NOWE = NLON
+ NONS = NLAT
+C
+C Check that given array is big enough for the new field.
+C
+ IF( NLEN.GT.KSIZE ) THEN
+ CALL INTLOG(JP_ERROR,'HIRLAM: Given array size = ',KSIZE)
+ CALL INTLOG(JP_ERROR,'HIRLAM: Required size = = ',NLEN)
+ HIRLAM = 5
+ GOTO 900
+ ENDIF
+C
+C Dynamically allocate memory for lat/long arrays.
+C
+ ILL = NLEN
+ IF( ILL.GT.ILLOLD ) THEN
+C
+ LNEW = .TRUE.
+C
+ IF( ILLOLD.GT.0 ) CALL JFREE(IPRLON)
+C
+ NBYTES = 2*ILL*JPRLEN
+C
+ IPRLON = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPRLON = IPRLON/(1024*1024*1024*4)
+#endif
+ IF( IPRLON.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HIRLAM: Memory allocation fail',JPQUIET)
+ HIRLAM = 6
+ GOTO 900
+ ENDIF
+C
+ IPRLAT = IPRLON + (ILL*JPRLEN)
+C
+ ILLOLD = ILL
+C
+ ENDIF
+C
+ IRET = HGENGRD(AREA,POLE,GRID,NLON,NLAT,RLAT,RLON)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HIRLAM: HGENGRD failed to get lat/lon grid data',JPQUIET)
+ HIRLAM = 7
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 3. Find neighbours for each point for interpolation.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Dynamically allocate memory for interpolation arrays.
+C
+ IF( LNEW ) THEN
+C
+ IF( .NOT.LFIRST ) CALL JFREE(IPPDLO0)
+C
+ NBYTES = (17*JPRLEN + 14*JPBYTES) * ILL
+C
+ IPPDLO0 = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPPDLO0 = IPPDLO0/(1024*1024*1024*4)
+#endif
+ IF( IPPDLO0.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HIRLAM: Memory allocation fail',JPQUIET)
+ HIRLAM = 8
+ GOTO 900
+ ENDIF
+C
+ IPPDLO1 = IPPDLO0 + (ILL*JPRLEN)
+ IPPDLO2 = IPPDLO1 + (ILL*JPRLEN)
+ IPPDLO3 = IPPDLO2 + (ILL*JPRLEN)
+ IPPDLAT = IPPDLO3 + (ILL*JPRLEN)
+ IPPWTS = IPPDLAT + (ILL*JPRLEN)
+ IPKSCHE = IPPWTS + (12*ILL*JPRLEN)
+ IPKLA = IPKSCHE + (ILL*JPBYTES)
+ IPNEIGH = IPKLA + (ILL*JPBYTES)
+C
+ LFIRST = .FALSE.
+ LNEW = .FALSE.
+C
+ ENDIF
+C
+C Find neighbours.
+C
+ IRET = HNEI12(L12PNT,NLEN,RLAT,RLON,KGAUSS,KPTS,GLATS,
+ X KSCHEME,PDLAT,PDLO0,PDLO1,PDLO2,PDLO3,KLA,NEIGH)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HIRLAM: HNEI12 failed to find neighbours',JPQUIET)
+ HIRLAM = 9
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 4. Perform the 12-point horizontal interpolation.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C Setup the 12-point horizontal interpolation weights
+C
+ CALL HWTS12
+ X (NLEN,KSCHEME,KLA,PDLAT,GLATS,PDLO0,PDLO1,PDLO2,PDLO3,NEIGH,
+ X PWTS)
+C
+C Calculate the interpolated grid point values
+C
+ DO LOOP = 1, NLEN
+ IF( KSCHEME(LOOP).EQ.JP12PT ) THEN
+C
+C See if any of the neighbours are missing
+C
+ COUNT = 0
+ IF( NOTEQ(OLD(NEIGH( 1,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 2,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 3,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 4,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 5,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 6,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 7,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 8,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 9,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH(10,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH(11,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH(12,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+C
+C Interpolate using twelve neighbours if none are missing
+C
+ IF( LVEGGY) THEN
+ NEAREST = 1
+ IF( PWTS( 2,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 2
+ IF( PWTS( 3,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 3
+ IF( PWTS( 4,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 4
+ IF( PWTS( 5,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 5
+ IF( PWTS( 6,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 6
+ IF( PWTS( 7,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 7
+ IF( PWTS( 8,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 8
+ IF( PWTS( 9,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 9
+ IF( PWTS(10,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =10
+ IF( PWTS(11,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =11
+ IF( PWTS(12,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =12
+ NEWFLD(LOOP) = OLD(NEIGH( NEAREST,LOOP))
+ ELSE
+ IF( COUNT.EQ.12) THEN
+ NEWFLD(LOOP) =
+ X OLD(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLD(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLD(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLD(NEIGH( 4,LOOP)) * PWTS( 4,LOOP) +
+ X OLD(NEIGH( 5,LOOP)) * PWTS( 5,LOOP) +
+ X OLD(NEIGH( 6,LOOP)) * PWTS( 6,LOOP) +
+ X OLD(NEIGH( 7,LOOP)) * PWTS( 7,LOOP) +
+ X OLD(NEIGH( 8,LOOP)) * PWTS( 8,LOOP) +
+ X OLD(NEIGH( 9,LOOP)) * PWTS( 9,LOOP) +
+ X OLD(NEIGH(10,LOOP)) * PWTS(10,LOOP) +
+ X OLD(NEIGH(11,LOOP)) * PWTS(11,LOOP) +
+ X OLD(NEIGH(12,LOOP)) * PWTS(12,LOOP)
+C
+C Set missing if all neighbours are missing
+C
+ ELSE IF( COUNT.EQ.0 ) THEN
+ NEWFLD(LOOP) = RMISSGV
+C
+C Otherwise, use the nearest neighbour
+C
+ ELSE
+ NEAREST = 1
+ IF( PWTS( 2,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 2
+ IF( PWTS( 3,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 3
+ IF( PWTS( 4,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 4
+ IF( PWTS( 5,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 5
+ IF( PWTS( 6,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 6
+ IF( PWTS( 7,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 7
+ IF( PWTS( 8,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 8
+ IF( PWTS( 9,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 9
+ IF( PWTS(10,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =10
+ IF( PWTS(11,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =11
+ IF( PWTS(12,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =12
+ NEWFLD(LOOP) = OLD(NEIGH( NEAREST,LOOP))
+ ENDIF
+ ENDIF
+C
+ ELSE IF( KSCHEME(LOOP).EQ.JP4PT ) THEN
+C
+C See if any of the neighbours are missing
+C
+ COUNT = 0
+ IF( NOTEQ(OLD(NEIGH( 1,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 2,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 3,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 4,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+C
+C Interpolate using four neighbours if none are missing
+C
+c IF( COUNT.EQ.4.AND.LVEGGY.EQV.(.FALSE.) ) THEN
+ IF( LVEGGY) THEN
+ NEAREST = 1
+ IF( PWTS( 2,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 2
+ IF( PWTS( 3,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 3
+ IF( PWTS( 4,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 4
+ NEWFLD(LOOP) = OLD(NEIGH( NEAREST,LOOP))
+ ELSE
+ IF( COUNT.EQ.4) THEN
+ NEWFLD(LOOP) =
+ X OLD(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLD(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLD(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLD(NEIGH( 4,LOOP)) * PWTS( 4,LOOP)
+C
+C Set missing if all neighbours are missing
+C
+ ELSE IF( COUNT.EQ.0 ) THEN
+ NEWFLD(LOOP) = RMISSGV
+C
+C Otherwise, use the nearest neighbour
+C
+ ELSE
+ NEAREST = 1
+ IF( PWTS( 2,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 2
+ IF( PWTS( 3,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 3
+ IF( PWTS( 4,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 4
+ NEWFLD(LOOP) = OLD(NEIGH( NEAREST,LOOP))
+ ENDIF
+ ENDIF
+C
+ ELSE
+ DO NEXT = 1, 4
+ IF( NEIGH(NEXT,LOOP).NE.0 )
+ X NEWFLD(LOOP) = OLD(NEIGH(NEXT,LOOP))
+ ENDDO
+C
+ ENDIF
+C
+C Remove precipitation if less than a 'trace' or if nearest
+C neighbour is less than a trace
+C
+ IF( LPREC ) THEN
+ IF( NEWFLD(LOOP).LT.ZPRECIP ) THEN
+ NEWFLD(LOOP) = 0.0
+ ELSE
+ NEAREST = 1
+ NEND = 12
+ IF( KSCHEME(LOOP).NE.JP12PT ) NEND = 4
+ DO NEXT = 2, NEND
+ IF( PWTS( NEXT,LOOP).GT.PWTS( NEAREST,LOOP) )
+ X NEAREST = NEXT
+ ENDDO
+ IF( OLD(NEIGH(NEAREST,LOOP)).LT.ZPRECIP ) NEWFLD(LOOP) = 0.0
+ ENDIF
+ ENDIF
+C
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 9. Return.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hirlamw.F b/interpolation/hirlamw.F
new file mode 100755
index 0000000..a48bfa4
--- /dev/null
+++ b/interpolation/hirlamw.F
@@ -0,0 +1,631 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HIRLAMW(L12PNT,OLDFLDU,OLDFLDV,KOUNT,KGAUSS,AREA,
+ X POLE,GRID,NEWFLDU,NEWFLDV,KSIZE,NLON,NLAT)
+C
+C---->
+C**** HIRLAMW
+C
+C Purpose
+C -------
+C
+C This routine creates a rotated regular lat/long field from a
+C gaussian field using 12-point horizontal interpolation.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HIRLAMW(L12PNT,OLDFLDU,OLDFLDV,KOUNT,KGAUSS,AREA,
+C X POLE,GRID,NEWFLDU,NEWFLDV,KSIZE,NLON,NLAT)
+C
+C
+C Input parameters
+C ----------------
+C
+C L12PNT - Chooses between 12-point and 4-point interpolation
+C = .TRUE. for 12-point horizontal
+C = .FALSE. for 4-point
+C OLDFLDU - The array of values from the gaussian U field
+C OLDFLDV - The array of values from the gaussian V field
+C KOUNT - Number of values in OLDFLDU/V
+C KGAUSS - Gaussian number for the gaussian field
+C AREA - Limits of output area (N/W/S/E)
+C POLE - Pole of rotation (lat/long)
+C GRID - Output lat/long grid increments (we/ns)
+C KSIZE - The size of the output array to fill with the regular
+C lat/long field
+C
+C
+C Output parameters
+C -----------------
+C
+C NEWFLDU - The array of values for the regular lat/long U field
+C NEWFLDV - The array of values for the regular lat/long V field
+C NLON - Number of longitudes in the regular lat/long field
+C NLAT - Number of latitudes in the regular lat/long field
+C
+C Returns 0 if function successful, non-zero otherwise.
+C
+C Common block usage
+C ------------------
+C
+C nifld.common
+C nofld.common
+C
+C
+C Method
+C ------
+C
+C Numbering of the points (I is the interpolation point):
+C
+C 13 5 6 14
+C
+C 7 1 2 8
+C (I)
+C 9 3 4 10
+C
+C 15 11 12 16
+C
+C The 12-point interpolation is not possible if either of the top
+C two rows is above the original field northern latitude. The
+C nearest neighbour is used if both rows are above, and a 4-pt
+C bilinear interpolation is used if the top row is above.
+C Similarily, if either of the bottom two rows is below the original
+C field southern latitude.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C JMALLOC - Dynamically allocate memory
+C JFREE - Free dynamically allocated memory
+C JGETGG - Reads the definition of a gaussian grid
+C HGENGRW - Calculates original lat/long (before rotation) for
+C a rotated grid for wind fields.
+C HNEI12 - Finds neighbours for points for interpolation
+C HWTS12 - Calculates weightings for points for interpolation
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "jparams.h"
+C
+C Parameters
+C
+ INTEGER JNORTH, JSOUTH, JWEST, JEAST, JW_E, JN_S, JLAT, JLON
+ INTEGER JP12PT, JP4PT, JPNEARN
+ PARAMETER (JP12PT = 0)
+ PARAMETER (JP4PT = 1)
+ PARAMETER (JPNEARN = 2)
+ PARAMETER (JNORTH = 1 )
+ PARAMETER (JWEST = 2 )
+ PARAMETER (JSOUTH = 3 )
+ PARAMETER (JEAST = 4 )
+ PARAMETER (JW_E = 1 )
+ PARAMETER (JN_S = 2 )
+ PARAMETER (JLAT = 1 )
+ PARAMETER (JLON = 2 )
+C
+C Function arguments
+C
+ LOGICAL L12PNT
+ INTEGER KOUNT, KGAUSS, KSIZE, NLON, NLAT
+ REAL AREA(4), POLE(2), GRID(2)
+ REAL OLDFLDU(*), OLDFLDV(*)
+ REAL NEWFLDU(KSIZE), NEWFLDV(KSIZE)
+C
+C Local variables
+C
+ INTEGER NEXT, LOOP, IRET, NLEN, NPREV, NBYTES, NUMBER
+ INTEGER COUNTU, COUNTV, NEAREST
+C
+ LOGICAL LNEW, LFIRST
+ INTEGER KSCHEME(1),NEIGH(12,1), KLA(1)
+ REAL PWTS(12,1)
+ POINTER (IPKSCHE, KSCHEME)
+ POINTER (IPNEIGH, NEIGH)
+ POINTER (IPKLA, KLA)
+ POINTER (IPPWTS, PWTS)
+C
+ REAL PDLO0(1),PDLO1(1),PDLO2(1),PDLO3(1),PDLAT(1)
+ POINTER (IPPDLO0, PDLO0)
+ POINTER (IPPDLO1, PDLO1)
+ POINTER (IPPDLO2, PDLO2)
+ POINTER (IPPDLO3, PDLO3)
+ POINTER (IPPDLAT, PDLAT)
+C
+ INTEGER IGG, IGGOLD
+ INTEGER KPTS(1)
+ REAL GLATS(1)
+ INTEGER IOFFS(1)
+ POINTER (IPKPTS, KPTS)
+ POINTER (IPIOFFS, IOFFS)
+ POINTER (IPGLATS, GLATS)
+C
+ INTEGER ILL, ILLOLD
+ REAL RCLAT(1),RCLON(1),RLAT(1),RLON(1),RDIR(1),C(1),S(1),U(1),V(1)
+ POINTER (IPRCLAT, RCLAT)
+ POINTER (IPRCLON, RCLON)
+ POINTER (IPRLAT, RLAT)
+ POINTER (IPRLON, RLON)
+ POINTER (IPRDIR, RDIR)
+ POINTER (IPC, C)
+ POINTER (IPS, S)
+ POINTER (IPU, U)
+ POINTER (IPV, V)
+C
+ REAL OLDU(KOUNT), OLDV(KOUNT)
+C
+ DATA NPREV/-1/
+ DATA NUMBER/-1/
+ DATA LNEW/.FALSE./, LFIRST/.TRUE./
+ DATA IGGOLD/-1/, ILLOLD/-1/
+C
+ SAVE LNEW, LFIRST
+ SAVE IPKSCHE, IPNEIGH, IPKLA, IPPWTS
+ SAVE IPPDLO0, IPPDLO1, IPPDLO2, IPPDLO3, IPPDLAT
+ SAVE NPREV, IGGOLD, IPKPTS, IPIOFFS, IPGLATS
+ SAVE ILLOLD,IPRCLAT,IPRCLON,IPRLAT,IPRLON,IPRDIR
+ SAVE IPC, IPS, IPU, IPV
+ SAVE NUMBER
+C
+C Externals
+C
+ INTEGER HNEI12, HGENGRW
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+C
+C Statement functions
+C
+ REAL X, RADIAN
+ REAL A, B
+ LOGICAL NOTEQ
+C
+C Convert degrees to radians
+C
+ RADIAN(X) = (X) * 0.0174532925
+C
+C Tests that A is not (almost) equal to B
+C
+ NOTEQ(A,B) = (ABS((A)-(B)).GT.(ABS(A)*1E-3))
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HIRLAMW = 0
+C
+ CALL JDEBUG()
+C
+ IF( L12PNT ) THEN
+ CALL INTLOG(JP_DEBUG,'HIRLAMW: 12-pt interpolation',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'HIRLAMW: 4-pt interpolation',JPQUIET)
+ ENDIF
+C
+C Dynamically allocate memory for gaussian grid information.
+C
+ IGG = KGAUSS*2
+C
+ IF( IGG.GT.IGGOLD ) THEN
+C
+ IF( IGGOLD.GT.0 ) CALL JFREE(IPKPTS)
+C
+ NBYTES = (IGG*JPRLEN) + (2*IGG+1)*JPBYTES
+C
+ IPKPTS = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPKPTS = IPKPTS/(1024*1024*1024*4)
+#endif
+ IF( IPKPTS.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HIRLAMW: Memory allocate fail',JPQUIET)
+ HIRLAMW = 1
+ GOTO 900
+ ENDIF
+C
+ IPGLATS = IPKPTS + (IGG*JPBYTES)
+ IPIOFFS = IPGLATS + (IGG*JPRLEN)
+C
+ IGGOLD = IGG
+ NPREV = -1
+C
+ ENDIF
+C
+C Build up offsets to start of each latitude in original fields.
+C
+ IF( KGAUSS.NE.NPREV ) THEN
+ IF( NIREPR.EQ.JPGAUSSIAN ) THEN
+ CALL JGETGG(KGAUSS,'F',GLATS,KPTS,IRET)
+ ELSE
+ CALL JGETGG(KGAUSS,'R',GLATS,KPTS,IRET)
+ ENDIF
+C
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HIRLAMW: JGETGG failed to get gaussian data',JPQUIET)
+ HIRLAMW = 2
+ GOTO 900
+ ENDIF
+C
+ IOFFS(1) = 1
+ DO LOOP = 2, (KGAUSS*2+1)
+ IOFFS(LOOP) = IOFFS(LOOP-1) + KPTS(LOOP-1)
+ ENDDO
+C
+ NUMBER = (IOFFS(KGAUSS*2+1) - 1)
+ IF( NUMBER.NE.KOUNT ) THEN
+ CALL INTLOG(JP_ERROR,'HIRLAMW: Given no. of points =',KOUNT)
+ CALL INTLOG(JP_ERROR,'HIRLAMW: Expected no. of pts =',NUMBER)
+ HIRLAMW = 3
+ GOTO 900
+ ENDIF
+C
+ NPREV = KGAUSS
+ ENDIF
+C
+C Preserve the input fields
+C (in case OLDFLDx and NEWFLDx are the same arrays)
+C
+ DO LOOP = 1, NUMBER
+ OLDU(LOOP) = OLDFLDU(LOOP)
+ OLDV(LOOP) = OLDFLDV(LOOP)
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 2. Generate the lat/long points for the output grid
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ NLON = 1 + NINT((AREA(JEAST) - AREA(JWEST)) / GRID(JW_E))
+ NLAT = 1 + NINT((AREA(JNORTH) - AREA(JSOUTH)) / GRID(JN_S))
+C
+ NLEN = NLON * NLAT
+
+ NOWE = NLON
+ NONS = NLAT
+C
+C Check that given array is big enough for the new field.
+C
+ IF( NLEN.GT.KSIZE ) THEN
+ CALL INTLOG(JP_ERROR,'HIRLAMW: Given array size = ',KSIZE)
+ CALL INTLOG(JP_ERROR,'HIRLAMW: Required size = = ',NLEN)
+ HIRLAMW = 5
+ GOTO 900
+ ENDIF
+C
+C Dynamically allocate memory for lat/long arrays.
+C
+ ILL = NLEN
+ IF( ILL.GT.ILLOLD ) THEN
+C
+ LNEW = .TRUE.
+C
+ IF( ILLOLD.GT.0 ) CALL JFREE(IPRLON)
+C
+ NBYTES = 9*ILL*JPRLEN
+C
+ IPRLON = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPRLON = IPRLON/(1024*1024*1024*4)
+#endif
+ IF( IPRLON.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HIRLAMW: Memory allocate fail',JPQUIET)
+ HIRLAMW = 6
+ GOTO 900
+ ENDIF
+C
+ IPRLAT = IPRLON + (ILL*JPRLEN)
+ IPRCLON = IPRLAT + (ILL*JPRLEN)
+ IPRCLAT = IPRCLON + (ILL*JPRLEN)
+ IPRDIR = IPRCLAT + (ILL*JPRLEN)
+ IPC = IPRDIR + (ILL*JPRLEN)
+ IPS = IPC + (ILL*JPRLEN)
+ IPU = IPS + (ILL*JPRLEN)
+ IPV = IPU + (ILL*JPRLEN)
+C
+ ILLOLD = ILL
+C
+ ENDIF
+C
+ IRET = HGENGRW(AREA,POLE,GRID,NLON,NLAT,RCLAT,RCLON,RLAT,RLON)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HIRLAMW: HGENGRW failed to get lat/lon grid data',JPQUIET)
+ HIRLAMW = 7
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 3. Find neighbours for each point for interpolation.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Dynamically allocate memory for interpolation arrays.
+C
+ IF( LNEW ) THEN
+C
+ IF( .NOT.LFIRST ) CALL JFREE(IPPDLO0)
+C
+ NBYTES = (17*JPRLEN + 14*JPBYTES) * ILL
+C
+ IPPDLO0 = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPPDLO0 = IPPDLO0/(1024*1024*1024*4)
+#endif
+ IF( IPPDLO0.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HIRLAMW: Memory allocate fail',JPQUIET)
+ HIRLAMW = 8
+ GOTO 900
+ ENDIF
+C
+ IPPDLO1 = IPPDLO0 + (ILL*JPRLEN)
+ IPPDLO2 = IPPDLO1 + (ILL*JPRLEN)
+ IPPDLO3 = IPPDLO2 + (ILL*JPRLEN)
+ IPPDLAT = IPPDLO3 + (ILL*JPRLEN)
+ IPPWTS = IPPDLAT + (ILL*JPRLEN)
+ IPKSCHE = IPPWTS + (12*ILL*JPRLEN)
+ IPKLA = IPKSCHE + (ILL*JPBYTES)
+ IPNEIGH = IPKLA + (ILL*JPBYTES)
+C
+ LFIRST = .FALSE.
+C
+ ENDIF
+C
+C Find neighbours.
+C
+ IRET = HNEI12(L12PNT,NLEN,RLAT,RLON,KGAUSS,KPTS,GLATS,
+ X KSCHEME,PDLAT,PDLO0,PDLO1,PDLO2,PDLO3,KLA,NEIGH)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HIRLAMW: HNEI12 failed to find neighbours',JPQUIET)
+ HIRLAMW = 9
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 4. Perform the 12-point horizontal interpolation.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C Setup the 12-point horizontal interpolation weights
+C
+ CALL HWTS12
+ X (NLEN,KSCHEME,KLA,PDLAT,GLATS,PDLO0,PDLO1,PDLO2,PDLO3,NEIGH,
+ X PWTS)
+C
+C Calculate the interpolated grid point values
+C
+ DO LOOP = 1, NLEN
+ IF( KSCHEME(LOOP).EQ.JP12PT ) THEN
+C
+C See if any of the neighbours are missing
+C
+ COUNTU = 0
+ IF( NOTEQ(OLDU(NEIGH( 1,LOOP)),RMISSGV) ) COUNTU = COUNTU + 1
+ IF( NOTEQ(OLDU(NEIGH( 2,LOOP)),RMISSGV) ) COUNTU = COUNTU + 1
+ IF( NOTEQ(OLDU(NEIGH( 3,LOOP)),RMISSGV) ) COUNTU = COUNTU + 1
+ IF( NOTEQ(OLDU(NEIGH( 4,LOOP)),RMISSGV) ) COUNTU = COUNTU + 1
+ IF( NOTEQ(OLDU(NEIGH( 5,LOOP)),RMISSGV) ) COUNTU = COUNTU + 1
+ IF( NOTEQ(OLDU(NEIGH( 6,LOOP)),RMISSGV) ) COUNTU = COUNTU + 1
+ IF( NOTEQ(OLDU(NEIGH( 7,LOOP)),RMISSGV) ) COUNTU = COUNTU + 1
+ IF( NOTEQ(OLDU(NEIGH( 8,LOOP)),RMISSGV) ) COUNTU = COUNTU + 1
+ IF( NOTEQ(OLDU(NEIGH( 9,LOOP)),RMISSGV) ) COUNTU = COUNTU + 1
+ IF( NOTEQ(OLDU(NEIGH(10,LOOP)),RMISSGV) ) COUNTU = COUNTU + 1
+ IF( NOTEQ(OLDU(NEIGH(11,LOOP)),RMISSGV) ) COUNTU = COUNTU + 1
+ IF( NOTEQ(OLDU(NEIGH(12,LOOP)),RMISSGV) ) COUNTU = COUNTU + 1
+ COUNTV = 0
+ IF( NOTEQ(OLDV(NEIGH( 1,LOOP)),RMISSGV) ) COUNTV = COUNTV + 1
+ IF( NOTEQ(OLDV(NEIGH( 2,LOOP)),RMISSGV) ) COUNTV = COUNTV + 1
+ IF( NOTEQ(OLDV(NEIGH( 3,LOOP)),RMISSGV) ) COUNTV = COUNTV + 1
+ IF( NOTEQ(OLDV(NEIGH( 4,LOOP)),RMISSGV) ) COUNTV = COUNTV + 1
+ IF( NOTEQ(OLDV(NEIGH( 5,LOOP)),RMISSGV) ) COUNTV = COUNTV + 1
+ IF( NOTEQ(OLDV(NEIGH( 6,LOOP)),RMISSGV) ) COUNTV = COUNTV + 1
+ IF( NOTEQ(OLDV(NEIGH( 7,LOOP)),RMISSGV) ) COUNTV = COUNTV + 1
+ IF( NOTEQ(OLDV(NEIGH( 8,LOOP)),RMISSGV) ) COUNTV = COUNTV + 1
+ IF( NOTEQ(OLDV(NEIGH( 9,LOOP)),RMISSGV) ) COUNTV = COUNTV + 1
+ IF( NOTEQ(OLDV(NEIGH(10,LOOP)),RMISSGV) ) COUNTV = COUNTV + 1
+ IF( NOTEQ(OLDV(NEIGH(11,LOOP)),RMISSGV) ) COUNTV = COUNTV + 1
+ IF( NOTEQ(OLDV(NEIGH(12,LOOP)),RMISSGV) ) COUNTV = COUNTV + 1
+C
+C Interpolate using twelve neighbours if none are missing
+C
+ IF( (COUNTU.EQ.12).AND.(COUNTV.EQ.12) ) THEN
+C
+ U(LOOP) =
+ X OLDU(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLDU(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLDU(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLDU(NEIGH( 4,LOOP)) * PWTS( 4,LOOP) +
+ X OLDU(NEIGH( 5,LOOP)) * PWTS( 5,LOOP) +
+ X OLDU(NEIGH( 6,LOOP)) * PWTS( 6,LOOP) +
+ X OLDU(NEIGH( 7,LOOP)) * PWTS( 7,LOOP) +
+ X OLDU(NEIGH( 8,LOOP)) * PWTS( 8,LOOP) +
+ X OLDU(NEIGH( 9,LOOP)) * PWTS( 9,LOOP) +
+ X OLDU(NEIGH(10,LOOP)) * PWTS(10,LOOP) +
+ X OLDU(NEIGH(11,LOOP)) * PWTS(11,LOOP) +
+ X OLDU(NEIGH(12,LOOP)) * PWTS(12,LOOP)
+ V(LOOP) =
+ X OLDV(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLDV(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLDV(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLDV(NEIGH( 4,LOOP)) * PWTS( 4,LOOP) +
+ X OLDV(NEIGH( 5,LOOP)) * PWTS( 5,LOOP) +
+ X OLDV(NEIGH( 6,LOOP)) * PWTS( 6,LOOP) +
+ X OLDV(NEIGH( 7,LOOP)) * PWTS( 7,LOOP) +
+ X OLDV(NEIGH( 8,LOOP)) * PWTS( 8,LOOP) +
+ X OLDV(NEIGH( 9,LOOP)) * PWTS( 9,LOOP) +
+ X OLDV(NEIGH(10,LOOP)) * PWTS(10,LOOP) +
+ X OLDV(NEIGH(11,LOOP)) * PWTS(11,LOOP) +
+ X OLDV(NEIGH(12,LOOP)) * PWTS(12,LOOP)
+C
+C Set missing if all neighbours are missing
+C
+ ELSE IF( (COUNTU.EQ.0).OR.(COUNTV.EQ.0) ) THEN
+ U(LOOP) = RMISSGV
+ V(LOOP) = RMISSGV
+C
+C Otherwise, use the nearest neighbour
+C
+ ELSE
+ NEAREST = 1
+ IF( PWTS( 2,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 2
+ IF( PWTS( 3,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 3
+ IF( PWTS( 4,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 4
+ IF( PWTS( 5,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 5
+ IF( PWTS( 6,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 6
+ IF( PWTS( 7,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 7
+ IF( PWTS( 8,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 8
+ IF( PWTS( 9,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 9
+ IF( PWTS(10,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =10
+ IF( PWTS(11,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =11
+ IF( PWTS(12,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =12
+ U(LOOP) = OLDU(NEIGH( NEAREST,LOOP))
+ V(LOOP) = OLDV(NEIGH( NEAREST,LOOP))
+ ENDIF
+C
+ ELSE IF( KSCHEME(LOOP).EQ.JP4PT ) THEN
+C
+C See if any of the neighbours are missing
+C
+ COUNTU = 0
+ IF( NOTEQ(OLDU(NEIGH( 1,LOOP)),RMISSGV) ) COUNTU = COUNTU + 1
+ IF( NOTEQ(OLDU(NEIGH( 2,LOOP)),RMISSGV) ) COUNTU = COUNTU + 1
+ IF( NOTEQ(OLDU(NEIGH( 3,LOOP)),RMISSGV) ) COUNTU = COUNTU + 1
+ IF( NOTEQ(OLDU(NEIGH( 4,LOOP)),RMISSGV) ) COUNTU = COUNTU + 1
+ COUNTV = 0
+ IF( NOTEQ(OLDV(NEIGH( 1,LOOP)),RMISSGV) ) COUNTV = COUNTV + 1
+ IF( NOTEQ(OLDV(NEIGH( 2,LOOP)),RMISSGV) ) COUNTV = COUNTV + 1
+ IF( NOTEQ(OLDV(NEIGH( 3,LOOP)),RMISSGV) ) COUNTV = COUNTV + 1
+ IF( NOTEQ(OLDV(NEIGH( 4,LOOP)),RMISSGV) ) COUNTV = COUNTV + 1
+C
+C Interpolate using four neighbours if none are missing
+C
+ IF( (COUNTU.EQ.4).AND.(COUNTV.EQ.4) ) THEN
+C
+ U(LOOP) =
+ X OLDU(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLDU(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLDU(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLDU(NEIGH( 4,LOOP)) * PWTS( 4,LOOP)
+ V(LOOP) =
+ X OLDV(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLDV(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLDV(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLDV(NEIGH( 4,LOOP)) * PWTS( 4,LOOP)
+C
+C Set missing if all neighbours are missing
+C
+ ELSE IF( (COUNTU.EQ.0).OR.(COUNTV.EQ.0) ) THEN
+ U(LOOP) = RMISSGV
+ V(LOOP) = RMISSGV
+C
+C Otherwise, use the nearest neighbour
+C
+ ELSE
+ NEAREST = 1
+ IF( PWTS( 2,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 2
+ IF( PWTS( 3,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 3
+ IF( PWTS( 4,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 4
+ U(LOOP) = OLDU(NEIGH( NEAREST,LOOP))
+ V(LOOP) = OLDV(NEIGH( NEAREST,LOOP))
+ ENDIF
+C
+ ELSE
+ DO NEXT = 1, 4
+ IF( NEIGH(NEXT,LOOP).NE.0 ) THEN
+ U(LOOP) = OLDU(NEIGH(NEXT,LOOP))
+ V(LOOP) = OLDV(NEIGH(NEXT,LOOP))
+ ENDIF
+ ENDDO
+C
+ ENDIF
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 5. Adjust the U and V components to new (rotated) axes
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+ DO LOOP = 1, NLEN
+ RDIR(LOOP) = 0.0
+ ENDDO
+C
+ CALL HPSHGPW(RLON,RLAT,RCLON,RCLAT,RDIR,NLEN,POLE)
+C
+ DO LOOP = 1, NLEN
+ RDIR(LOOP) = -RADIAN(RDIR(LOOP))
+ ENDDO
+C
+ DO LOOP = 1, NLEN
+ C(LOOP) = COS(RDIR(LOOP))
+ S(LOOP) = SIN(RDIR(LOOP))
+ ENDDO
+C
+ DO LOOP = 1, NLEN
+ IF( NOTEQ(U(LOOP),RMISSGV).AND.NOTEQ(V(LOOP),RMISSGV) ) THEN
+ NEWFLDU(LOOP) = U(LOOP)*C(LOOP) - V(LOOP)*S(LOOP)
+ NEWFLDV(LOOP) = U(LOOP)*S(LOOP) + V(LOOP)*C(LOOP)
+ ELSE
+ NEWFLDU(LOOP) = RMISSGV
+ NEWFLDV(LOOP) = RMISSGV
+ ENDIF
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 9. Return.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hirlsm.F b/interpolation/hirlsm.F
new file mode 100755
index 0000000..ab482c6
--- /dev/null
+++ b/interpolation/hirlsm.F
@@ -0,0 +1,982 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HIRLSM(L12PNT,OLDFLD,KOUNT,KGAUSS,AREA,
+ X POLE,GRID,NEWFLD,KSIZE,NLON,NLAT)
+C
+C---->
+C**** HIRLSM
+C
+C Purpose
+C -------
+C
+C This routine creates a rotated regular lat/long field from a
+C reduced gaussian field using 12-point horizontal interpolation
+C and land-sea masks.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HIRLSM(L12PNT,OLDFLD,KOUNT,KGAUSS,AREA,
+C X POLE,GRID,NEWFLD,KSIZE,NLON,NLAT)
+C
+C
+C Input parameters
+C ----------------
+C
+C L12PNT - Chooses between 12-point and 4-point interpolation
+C = .TRUE. for 12-point horizontal
+C = .FALSE. for 4-point
+C OLDFLD - Array of values from the (old) reduced gaussian field
+C KOUNT - Number of values in OLDFLD
+C KGAUSS - Gaussian number of the reduced gaussian field
+C AREA - Limits of output area (N/W/S/E)
+C POLE - Pole of rotation (lat/long)
+C GRID - Output lat/long grid increments (we/ns)
+C KSIZE - The size of the output array to fill with the regular
+C lat/long field
+C
+C
+C Output parameters
+C -----------------
+C
+C NEWFLD - The array of values for the regular lat/long field
+C NLON - Number of longitudes in the regular lat/long field
+C NLAT - Number of latitudes in the regular lat/long field
+C
+C Returns 0 if function successful, non-zero otherwise.
+C
+C Common block usage
+C ------------------
+C
+C nifld.common
+C nofld.common
+C
+C
+C Method
+C ------
+C
+C Numbering of the points (I is the interpolation point):
+C
+C 13 5 6 14
+C
+C 7 1 2 8
+C (I)
+C 9 3 4 10
+C
+C 15 11 12 16
+C
+C The 12-point interpolation is not possible if either of the top
+C two rows is above the original field northern latitude. The
+C nearest neighbour is used if both rows are above, and a 4-pt
+C bilinear interpolation is used if the top row is above.
+C Similarily, if either of the bottom two rows is below the original
+C field southern latitude.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C JMALLOC - Dynamically allocate memory
+C JFREE - Free dynamically allocated memory
+C JGETGG - Reads the definition of a gaussian grid
+C HGETLSM - Reads values for gaussian land-sea mask
+C HGENGRD - Calculates original lat/long (before rotation) for
+C a rotated grid
+C HNEI12 - Finds neighbours for points for interpolation
+C HWTS12 - Calculates weightings for points for interpolation
+C HWTSLSM - Calculates LSM weightings for points for interpolation
+C CHKPREC - Check if precipitation threshold has been redefined
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Parameters
+C
+ INTEGER JNORTH, JSOUTH, JWEST, JEAST, JW_E, JN_S, JLAT, JLON
+ INTEGER JP12PT, JP4PT, JPNEARN
+ PARAMETER (JP12PT = 0)
+ PARAMETER (JP4PT = 1)
+ PARAMETER (JPNEARN = 2)
+ PARAMETER (JNORTH = 1 )
+ PARAMETER (JWEST = 2 )
+ PARAMETER (JSOUTH = 3 )
+ PARAMETER (JEAST = 4 )
+ PARAMETER (JW_E = 1 )
+ PARAMETER (JN_S = 2 )
+ PARAMETER (JLAT = 1 )
+ PARAMETER (JLON = 2 )
+C
+C Function arguments
+C
+ LOGICAL L12PNT
+ INTEGER KOUNT, KGAUSS, KSIZE, NLON, NLAT
+ REAL AREA(4), POLE(2), GRID(2), OLDFLD(*)
+ REAL NEWFLD(KSIZE)
+C
+C Local variables
+C
+ INTEGER NEXT, LOOP, loop1, IRET, NLEN, NPREV, NBYTES, NUMBER
+ INTEGER NEAREST, NEND, COUNT, INUM
+ INTEGER IOSIZE, INSIZE, NJPR, NJPB
+ INTEGER NEWSIZE
+ REAL OLDAREA(4), OLDPOLE(2), OLDGRID(2)
+ REAL OLDLSM(1)
+ POINTER (IPOLDLS, OLDLSM )
+C
+ CHARACTER*12 YFLAG, Y1FLAG, Y2FLAG
+ LOGICAL LNEW, LFIRST, LNEWSPC, LOLDNEW, LVEGGY, LSOIL
+ LOGICAL LITAL, LVEGGY2
+ INTEGER KSCHEME(1),NEIGH(12,1), KLA(1), KSCHEMEN(1)
+ REAL PWTS(12,1)
+ REAL PWTSN(12,1)
+ POINTER (IPKSCHE, KSCHEME)
+ POINTER (IPKSCHEN, KSCHEMEN)
+ POINTER (IPNEIGH, NEIGH)
+ POINTER (IPKLA, KLA)
+ POINTER (IPPWTS, PWTS)
+ POINTER (IPPWTSN, PWTSN)
+C
+ REAL PDLO0(1),PDLO1(1),PDLO2(1),PDLO3(1),PDLAT(1)
+ POINTER (IPPDLO0, PDLO0)
+ POINTER (IPPDLO1, PDLO1)
+ POINTER (IPPDLO2, PDLO2)
+ POINTER (IPPDLO3, PDLO3)
+ POINTER (IPPDLAT, PDLAT)
+C
+ INTEGER IGG, IGGOLD
+ INTEGER KPTS(1)
+ REAL GLATS(1)
+ INTEGER IOFFS(1)
+ POINTER (IPKPTS, KPTS)
+ POINTER (IPIOFFS, IOFFS)
+ POINTER (IPGLATS, GLATS)
+C
+ INTEGER ILL, ILLOLD
+ REAL RLAT(1),RLON(1)
+ POINTER (IPRLAT, RLAT)
+ POINTER (IPRLON, RLON)
+C
+ REAL OLD(KOUNT)
+C
+ REAL NEWLSM(1)
+ POINTER (IPNEWLS, NEWLSM)
+C
+ DATA OLDAREA/4*-1.0/, OLDPOLE/2*-1.0/, OLDGRID/2*-1.0/
+ DATA NPREV/-1/, IOSIZE/-1/, INSIZE/-1/
+ DATA LNEW/.FALSE./, LFIRST/.TRUE./
+ DATA IGGOLD/-1/, ILLOLD/-1/, IPNEWLS/-1/, IPOLDLS/-1/
+ DATA NUMBER/-1/
+C
+ SAVE OLDAREA, OLDPOLE, OLDGRID
+ SAVE LNEW, LFIRST, IOSIZE, INSIZE, IPNEWLS, IPOLDLS
+ SAVE IPKSCHE, IPNEIGH, IPKLA, IPPWTS, IPPWTSN,IPKSCHEN
+ SAVE IPPDLO0, IPPDLO1, IPPDLO2, IPPDLO3, IPPDLAT
+ SAVE NPREV, IGGOLD, IPKPTS, IPIOFFS, IPGLATS
+ SAVE ILLOLD, IPRLAT, IPRLON
+ SAVE NUMBER
+C
+C Externals
+C
+ INTEGER HGETLSM, HNEI12, HGENGRD
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+C
+C Statement function
+C
+ REAL A, B
+ LOGICAL NOTEQ
+ NOTEQ(A,B) = (ABS((A)-(B)).GT.(ABS(A)*1E-3))
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HIRLSM = 0
+C
+ CALL JDEBUG()
+C
+ IF( L12PNT ) THEN
+ CALL INTLOG(JP_DEBUG,'HIRLSM: 12-pt interpolation',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'HIRLSM: 4-pt interpolation',JPQUIET)
+ ENDIF
+C
+ CALL CHKPREC()
+ IF( LPREC )THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'HIRLSM: precipitation threshold applied',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'HIRLSM: precipitation threshold not applied',JPQUIET)
+ ENDIF
+
+
+C Are we handling vegetation parameter
+ LVEGGY = (NITABLE.EQ.128).AND.
+ X ((NIPARAM.EQ.27).OR.
+ X (NIPARAM.EQ.28).OR.
+ X (NIPARAM.EQ.29).OR.
+ X (NIPARAM.EQ.30).OR.
+ X (NIPARAM.EQ.43) )
+
+
+C Force nearest neighbour processing with env variable
+ CALL GETENV('NEAREST_NEIGHBOUR', YFLAG)
+ IF( YFLAG(1:1).EQ.'1' ) LVEGGY = .TRUE.
+
+C Force nearest neighbour processing with INTOUT parameter
+ IF( LMETHOD ) LVEGGY = .TRUE.
+
+C special procesing for soil parameters
+ LSOIL = .FALSE.
+ CALL GETENV('SOIL_PARAM', Y1FLAG)
+
+ CALL GETENV('NEAREST_NEIGHBOUR_NEW', Y2FLAG)
+C Fields with bitmap (as SST) and VEGGY Parameters are treated
+C with a corrected nearest neighbour method matching LSM
+C Force nearest neighbour for same type lsm processing
+c with INTOUT parameter
+ LVEGGY2 = .FALSE.
+ IF( Y2FLAG(1:1).EQ.'1'.OR.LNNLSM ) THEN
+ LITAL = .TRUE.
+ IF(LVEGGY) LVEGGY2 = .TRUE.
+ LVEGGY = .FALSE.
+ ELSE
+ LITAL = .FALSE.
+ IF( LVEGGY.AND.Y1FLAG(1:1).EQ.'1' ) THEN
+ LSOIL = .TRUE.
+ LVEGGY = .FALSE.
+ ENDIF
+ ENDIF
+
+ IF( LSOIL ) CALL INTLOG(JP_DEBUG,
+ X 'HIRLSM: nearest neighbour processing (SOIL)',JPQUIET)
+
+ IF( LVEGGY ) CALL INTLOG(JP_DEBUG,
+ X 'HIRLSM: nearest neighbour processing (vegetation)',JPQUIET)
+
+ IF( LITAL ) CALL INTLOG(JP_DEBUG,
+ X 'HIRLSM: new nearest neighbour processing',JPQUIET)
+C
+
+C
+C Dynamically allocate memory for gaussian grid information.
+C
+ IGG = KGAUSS*2
+C
+ IF( IGG.GT.IGGOLD ) THEN
+C
+ IF( IGGOLD.GT.0 ) CALL JFREE(IPKPTS)
+C
+ NBYTES = (IGG*JPRLEN) + (2*IGG+1)*JPBYTES
+C
+ IPKPTS = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPKPTS = IPKPTS/(1024*1024*1024*4)
+#endif
+ IF( IPKPTS.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HIRLSM: Memory allocation fail',JPQUIET)
+ HIRLSM = 1
+ GOTO 900
+ ENDIF
+C
+ IPGLATS = IPKPTS + (IGG*JPBYTES)
+ IPIOFFS = IPGLATS + (IGG*JPRLEN)
+C
+ IGGOLD = IGG
+ NPREV = -1
+C
+ ENDIF
+C
+C Has gaussian grid changed from last time through?
+C
+ LOLDNEW = (KGAUSS.NE.NPREV)
+C
+C Build up offsets to start of each latitude in the original field.
+C
+ IF( LOLDNEW ) THEN
+ CALL JGETGG(KGAUSS,'R',GLATS,KPTS,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HIRLSM: JGETGG failed to get gaussian data',JPQUIET)
+ HIRLSM = 1
+ GOTO 900
+ ENDIF
+C
+ IOFFS(1) = 1
+ DO LOOP = 2, (KGAUSS*2+1)
+ IOFFS(LOOP) = IOFFS(LOOP-1) + KPTS(LOOP-1)
+ ENDDO
+C
+ NPREV = KGAUSS
+ ENDIF
+C
+ NUMBER = (IOFFS(KGAUSS*2+1) - 1)
+ IF( NUMBER.NE.KOUNT ) THEN
+ CALL INTLOG(JP_ERROR,'HIRLSM: Given number of points =',KOUNT)
+ CALL INTLOG(JP_ERROR,'HIRLSM: Expected number of pts =',NUMBER)
+ HIRLSM = 1
+ GOTO 900
+ ENDIF
+C
+C Preserve the input field
+C (in case OLDFLD and NEWFLD are the same arrays)
+C
+ DO LOOP = 1, NUMBER
+ OLD(LOOP) = OLDFLD(LOOP)
+ ENDDO
+C
+C If old land-sea mask has changed, pick up different land-sea mask
+C
+ IF( LOLDNEW ) THEN
+C
+C Allocate memory for old land-sea mask
+C
+ IF( IOSIZE.LT.(NUMBER*JPRLEN) ) THEN
+ IOSIZE = NUMBER*JPRLEN
+ IF( IPOLDLS.GT.0 ) CALL JFREE(IPOLDLS)
+ IPOLDLS = JMALLOC(IOSIZE)
+ IF( IPOLDLS.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HIRLSM: Memory allocate fail',JPQUIET)
+ HIRLSM = 1
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C Read values for different land-sea mask in memory
+C
+ NEWSIZE = NUMBER*JPRLEN
+ IRET = HGETLSM(KGAUSS,OLDLSM,NEWSIZE)
+cs IRET = HGETLSM(KGAUSS,OLDLSM,IOSIZE)
+
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HIRLSM: HGETLSM failed to get land-sea mask data',JPQUIET)
+ HIRLSM = 1
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 2. Generate the lat/long points for the output grid
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Sinisa put nint instead int
+ NLON = 1 + NINT((AREA(JEAST) - AREA(JWEST)) / GRID(JW_E)) ! SC Aug-2005
+ NLAT = 1 + NINT((AREA(JNORTH) - AREA(JSOUTH)) / GRID(JN_S)) ! SC Aug-2005
+C
+ NLEN = NLON * NLAT
+
+ NOWE = NLON
+ NONS = NLAT
+C
+C Check that given array is big enough for the new field.
+C
+ IF( NLEN.GT.KSIZE ) THEN
+ CALL INTLOG(JP_ERROR,'HIRLSM: Given array size = ',KSIZE)
+ CALL INTLOG(JP_ERROR,'HIRLSM: Required size = = ',NLEN)
+ HIRLSM = 2
+ GOTO 900
+ ENDIF
+C
+C Dynamically allocate memory for lat/long arrays.
+C
+ ILL = NLEN
+ IF( ILL.GT.ILLOLD ) THEN
+C
+ LNEW = .TRUE.
+C
+ IF( ILLOLD.GT.0 ) CALL JFREE(IPRLON)
+C
+ NBYTES = 2*ILL*JPRLEN
+C
+ IPRLON = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPRLON = IPRLON/(1024*1024*1024*4)
+#endif
+ IF( IPRLON.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HIRLSM: Memory allocation fail',JPQUIET)
+ HIRLSM = 2
+ GOTO 900
+ ENDIF
+C
+ IPRLAT = IPRLON + (ILL*JPRLEN)
+C
+ ILLOLD = ILL
+C
+ ENDIF
+C
+ IRET = HGENGRD(AREA,POLE,GRID,NLON,NLAT,RLAT,RLON)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HIRLSM: HGENGRD failed to get lat/lon grid data',JPQUIET)
+ HIRLSM = 2
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 3. Find neighbours for each point for interpolation.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Dynamically allocate memory for interpolation arrays.
+C
+ IF( LNEW ) THEN
+C
+ IF( .NOT.LFIRST ) CALL JFREE(IPPDLO0)
+C
+ NJPR=17
+ NJPB=14
+ IF (LITAL.AND.L12PNT) THEN
+ NJPR=29
+ NJPB=15
+ ENDIF
+ NBYTES = (NJPR*JPRLEN + NJPB*JPBYTES) * ILL
+C
+ IPPDLO0 = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPPDLO0 = IPPDLO0/(1024*1024*1024*4)
+#endif
+ IF( IPPDLO0.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HIRLSM: Memory allocation fail',JPQUIET)
+ HIRLSM = 3
+ GOTO 900
+ ENDIF
+C
+ IPPDLO1 = IPPDLO0 + (ILL*JPRLEN)
+ IPPDLO2 = IPPDLO1 + (ILL*JPRLEN)
+ IPPDLO3 = IPPDLO2 + (ILL*JPRLEN)
+ IPPDLAT = IPPDLO3 + (ILL*JPRLEN)
+ IPPWTS = IPPDLAT + (ILL*JPRLEN)
+ IPKSCHE = IPPWTS + (12*ILL*JPRLEN)
+ IPKLA = IPKSCHE + (ILL*JPBYTES)
+ IPNEIGH = IPKLA + (ILL*JPBYTES)
+ IF (LITAL.AND.L12PNT) THEN
+ IPPWTSN = IPNEIGH + (12*ILL*JPBYTES)
+ IPKSCHEN = IPPWTSN + (12*ILL*JPRLEN)
+ ENDIF
+C
+ LFIRST = .FALSE.
+ LNEW = .FALSE.
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 4. Create the new land-sea mask
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C Create new land-sea mask if specification has changed
+C
+ LNEWSPC = .FALSE.
+ IF( AREA(1).NE.OLDAREA(1) ) LNEWSPC = .TRUE.
+ IF( AREA(2).NE.OLDAREA(2) ) LNEWSPC = .TRUE.
+ IF( AREA(3).NE.OLDAREA(3) ) LNEWSPC = .TRUE.
+ IF( AREA(4).NE.OLDAREA(4) ) LNEWSPC = .TRUE.
+ IF( GRID(1).NE.OLDGRID(1) ) LNEWSPC = .TRUE.
+ IF( GRID(2).NE.OLDGRID(2) ) LNEWSPC = .TRUE.
+ IF( POLE(1).NE.OLDPOLE(1) ) LNEWSPC = .TRUE.
+ IF( POLE(2).NE.OLDPOLE(2) ) LNEWSPC = .TRUE.
+C
+ IF( .NOT.LNEWSPC ) GOTO 500
+C
+ OLDAREA(1) = AREA(1)
+ OLDAREA(2) = AREA(2)
+ OLDAREA(3) = AREA(3)
+ OLDAREA(4) = AREA(4)
+ OLDGRID(1) = GRID(1)
+ OLDGRID(2) = GRID(2)
+ OLDPOLE(1) = POLE(1)
+ OLDPOLE(2) = POLE(2)
+C
+C Allocate memory for new land-sea mask
+C
+ IF( INSIZE.LT.(NLEN*JPRLEN) ) THEN
+ INSIZE = NLEN*JPRLEN
+ IF( IPNEWLS.GT.0 ) CALL JFREE(IPNEWLS)
+ IPNEWLS = JMALLOC(INSIZE)
+ IF( IPNEWLS.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HIRLSM: Memory allocation fail',JPQUIET)
+ HIRLSM = 4
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C Find neighbours.
+C (Note: 4-point scheme is used for land-sea mask interpolation).
+C
+ IRET = HNEI12(.FALSE.,NLEN,RLAT,RLON,KGAUSS,KPTS,GLATS,
+ X KSCHEME,PDLAT,PDLO0,PDLO1,PDLO2,PDLO3,KLA,NEIGH)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HIRLSM: HNEI12 failed to find neighbours',JPQUIET)
+ HIRLSM = 4
+ GOTO 900
+ ENDIF
+C
+C Perform the interpolation for the new land-sea mask.
+C
+ CALL HWTS12
+ X (NLEN,KSCHEME,KLA,PDLAT,GLATS,PDLO0,PDLO1,PDLO2,PDLO3,NEIGH,
+ X PWTS)
+C
+C Calculate the interpolated grid point values
+C
+ DO LOOP = 1, NLEN
+ IF( KSCHEME(LOOP).EQ.JP12PT ) THEN
+ NEWLSM(LOOP) =
+ X OLDLSM(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLDLSM(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLDLSM(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLDLSM(NEIGH( 4,LOOP)) * PWTS( 4,LOOP) +
+ X OLDLSM(NEIGH( 5,LOOP)) * PWTS( 5,LOOP) +
+ X OLDLSM(NEIGH( 6,LOOP)) * PWTS( 6,LOOP) +
+ X OLDLSM(NEIGH( 7,LOOP)) * PWTS( 7,LOOP) +
+ X OLDLSM(NEIGH( 8,LOOP)) * PWTS( 8,LOOP) +
+ X OLDLSM(NEIGH( 9,LOOP)) * PWTS( 9,LOOP) +
+ X OLDLSM(NEIGH(10,LOOP)) * PWTS(10,LOOP) +
+ X OLDLSM(NEIGH(11,LOOP)) * PWTS(11,LOOP) +
+ X OLDLSM(NEIGH(12,LOOP)) * PWTS(12,LOOP)
+C
+ ELSE IF( KSCHEME(LOOP).EQ.JP4PT ) THEN
+C
+ NEWLSM(LOOP) =
+ X OLDLSM(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLDLSM(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLDLSM(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLDLSM(NEIGH( 4,LOOP)) * PWTS( 4,LOOP)
+C
+C
+ ELSE
+ DO NEXT = 1, 4
+ IF( NEIGH(NEXT,LOOP).NE.0 )
+ X NEWLSM(LOOP) = OLDLSM(NEIGH(NEXT,LOOP))
+ ENDDO
+C
+ ENDIF
+C
+ ENDDO
+
+C
+C -----------------------------------------------------------------|
+C Section 5. Perform the 12-point horizontal interpolation.
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+C Fin neighbours.
+C
+ IRET = HNEI12(L12PNT,NLEN,RLAT,RLON,KGAUSS,KPTS,GLATS,
+ X KSCHEME,PDLAT,PDLO0,PDLO1,PDLO2,PDLO3,KLA,NEIGH)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HIRLSM: HNEI12 failed to find neighbours',JPQUIET)
+ HIRLSM = 5
+ GOTO 900
+ ENDIF
+C
+C Setup the 12-point horizontal interpolation weights
+C
+ CALL HWTSLSM
+ X (NLEN,KSCHEME,KLA,PDLAT,GLATS,PDLO0,PDLO1,PDLO2,PDLO3,NEIGH,
+ X OLDLSM,NEWLSM,PWTS)
+C
+C Calculate the interpolated grid point values
+C
+ IF (LITAL.AND.L12PNT) THEN
+ DO LOOP = 1, NLEN
+ IF (KSCHEME(LOOP).EQ.JP12PT) THEN
+ KSCHEMEN(LOOP)=JP4PT
+ ELSE
+ KSCHEMEN(LOOP)=KSCHEME(LOOP)
+ ENDIF
+ ENDDO
+ CALL HWTSLSM
+ X (NLEN,KSCHEMEN,KLA,PDLAT,GLATS,PDLO0,PDLO1,PDLO2,PDLO3,NEIGH,
+ X OLDLSM,NEWLSM,PWTSN)
+ ENDIF
+
+ DO LOOP = 1, NLEN
+ IF( KSCHEME(LOOP).EQ.JP12PT ) THEN
+C
+C See if any of the neighbours are missing
+C
+ COUNT = 0
+ IF( NOTEQ(OLD(NEIGH( 1,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 2,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 3,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 4,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 5,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 6,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 7,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 8,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 9,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH(10,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH(11,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH(12,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+C
+C Interpolate using twelve neighbours if none are missing
+C
+ IF( LVEGGY) THEN
+ NEAREST = 1
+ IF( PWTS( 2,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 2
+ IF( PWTS( 3,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 3
+ IF( PWTS( 4,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 4
+ IF( PWTS( 5,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 5
+ IF( PWTS( 6,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 6
+ IF( PWTS( 7,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 7
+ IF( PWTS( 8,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 8
+ IF( PWTS( 9,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 9
+ IF( PWTS(10,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =10
+ IF( PWTS(11,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =11
+ IF( PWTS(12,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =12
+ NEWFLD(LOOP) = OLD(NEIGH( NEAREST,LOOP))
+ ELSE IF( LSOIL ) THEN
+ IF(NEWLSM(LOOP).GE.0.5)THEN
+ NEAREST = 1
+ IF( PWTS( 2,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 2,LOOP)).GE.0.5 ) NEAREST = 2
+ ENDIF
+ IF( PWTS( 3,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 3,LOOP)).GE.0.5 ) NEAREST = 3
+ ENDIF
+ IF( PWTS( 4,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 4,LOOP)).GE.0.5 ) NEAREST = 4
+ ENDIF
+ IF( PWTS( 5,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 5,LOOP)).GE.0.5 ) NEAREST = 5
+ ENDIF
+ IF( PWTS( 6,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 6,LOOP)).GE.0.5 ) NEAREST = 6
+ ENDIF
+ IF( PWTS( 7,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 7,LOOP)).GE.0.5 ) NEAREST = 7
+ ENDIF
+ IF( PWTS( 8,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 8,LOOP)).GE.0.5 ) NEAREST = 8
+ ENDIF
+ IF( PWTS( 9,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 9,LOOP)).GE.0.5 ) NEAREST = 9
+ ENDIF
+ IF( PWTS( 10,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 10,LOOP)).GE.0.5 ) NEAREST = 10
+ ENDIF
+ IF( PWTS( 11,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 11,LOOP)).GE.0.5 ) NEAREST = 11
+ ENDIF
+ IF( PWTS( 12,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 12,LOOP)).GE.0.5 ) NEAREST = 12
+ ENDIF
+ ELSE
+ NEAREST = 1
+ IF( PWTS( 2,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 2,LOOP)).LT.0.5) NEAREST = 2
+ ENDIF
+ IF( PWTS( 3,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 3,LOOP)).LT.0.5) NEAREST = 3
+ ENDIF
+ IF( PWTS( 4,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 4,LOOP)).LT.0.5) NEAREST = 4
+ ENDIF
+ IF( PWTS( 5,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 5,LOOP)).LT.0.5) NEAREST = 5
+ ENDIF
+ IF( PWTS( 6,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 6,LOOP)).LT.0.5) NEAREST = 6
+ ENDIF
+ IF( PWTS( 7,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 7,LOOP)).LT.0.5) NEAREST = 7
+ ENDIF
+ IF( PWTS( 8,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 8,LOOP)).LT.0.5) NEAREST = 8
+ ENDIF
+ IF( PWTS( 9,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 9,LOOP)).LT.0.5) NEAREST = 9
+ ENDIF
+ IF( PWTS( 10,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 10,LOOP)).LT.0.5) NEAREST = 10
+ ENDIF
+ IF( PWTS( 11,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 11,LOOP)).LT.0.5) NEAREST = 11
+ ENDIF
+ IF( PWTS( 12,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 12,LOOP)).LT.0.5) NEAREST = 12
+ ENDIF
+ ENDIF
+ NEWFLD(LOOP) = OLD(NEIGH( NEAREST,LOOP))
+ ELSE
+ IF( COUNT.EQ.12 .AND..NOT.LVEGGY2) THEN
+ NEWFLD(LOOP) =
+ X OLD(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLD(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLD(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLD(NEIGH( 4,LOOP)) * PWTS( 4,LOOP) +
+ X OLD(NEIGH( 5,LOOP)) * PWTS( 5,LOOP) +
+ X OLD(NEIGH( 6,LOOP)) * PWTS( 6,LOOP) +
+ X OLD(NEIGH( 7,LOOP)) * PWTS( 7,LOOP) +
+ X OLD(NEIGH( 8,LOOP)) * PWTS( 8,LOOP) +
+ X OLD(NEIGH( 9,LOOP)) * PWTS( 9,LOOP) +
+ X OLD(NEIGH(10,LOOP)) * PWTS(10,LOOP) +
+ X OLD(NEIGH(11,LOOP)) * PWTS(11,LOOP) +
+ X OLD(NEIGH(12,LOOP)) * PWTS(12,LOOP)
+C
+C Set missing if all neighbours are missing
+C
+ ELSE IF( COUNT.EQ.0 .AND..NOT.LVEGGY2) THEN
+ NEWFLD(LOOP) = RMISSGV
+C
+C Otherwise, use the nearest neighbour
+C
+ ELSE
+
+
+ IF(LITAL)THEN !land point
+ IF(NEWLSM(LOOP).GE.0.5)THEN !land point
+ INUM=0
+ DO NEXT=1,4
+ IF(OLDLSM(NEIGH( NEXT,LOOP)).GE.0.5)THEN
+ INUM=INUM+1
+ IF( INUM.GE.2)THEN
+ IF(PWTSN( NEXT,LOOP).GT.PWTSN(NEAREST,LOOP)) THEN
+ NEAREST = NEXT
+ ENDIF
+ ELSEIF( INUM.EQ.1) THEN
+ NEAREST = NEXT
+ ENDIF
+ ENDIF
+ ENDDO
+
+ ELSE !sea point
+
+ INUM=0
+ DO NEXT=1,4
+ IF(OLDLSM(NEIGH( NEXT,LOOP)).LT.0.5)THEN
+ INUM=INUM+1
+ IF( INUM.GE.2)THEN
+ IF(PWTSN( NEXT,LOOP).GT.PWTSN(NEAREST,LOOP)) THEN
+ NEAREST = NEXT
+ ENDIF
+ ELSEIF( INUM.EQ.1) THEN
+ NEAREST = NEXT
+ ENDIF
+ ENDIF
+ ENDDO
+
+ ENDIF !end if sea/land
+ ELSE
+ NEAREST = 1
+ IF( PWTS( 2,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 2
+ IF( PWTS( 3,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 3
+ IF( PWTS( 4,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 4
+ IF( PWTS( 5,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 5
+ IF( PWTS( 6,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 6
+ IF( PWTS( 7,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 7
+ IF( PWTS( 8,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 8
+ IF( PWTS( 9,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 9
+ IF( PWTS(10,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =10
+ IF( PWTS(11,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =11
+ IF( PWTS(12,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =12
+ ENDIF
+
+ NEWFLD(LOOP) = OLD(NEIGH( NEAREST,LOOP))
+
+ ENDIF
+ ENDIF
+C
+ ELSE IF( KSCHEME(LOOP).EQ.JP4PT ) THEN
+C
+C See if any of the neighbours are missing
+C
+ COUNT = 0
+ IF( NOTEQ(OLD(NEIGH( 1,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 2,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 3,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLD(NEIGH( 4,LOOP)),RMISSGV) ) COUNT = COUNT + 1
+C
+C Interpolate using four neighbours if none are missing
+C
+ IF( LVEGGY) THEN
+ NEAREST = 1
+ IF( PWTS( 2,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 2
+ IF( PWTS( 3,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 3
+ IF( PWTS( 4,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 4
+ NEWFLD(LOOP) = OLD(NEIGH( NEAREST,LOOP))
+ ELSE IF( LSOIL ) THEN
+ IF(NEWLSM(LOOP).GE.0.5)THEN
+ NEAREST = 1
+ IF( PWTS( 2,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 2,LOOP)).GE.0.5) NEAREST = 2
+ ENDIF
+ IF( PWTS( 3,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 3,LOOP)).GE.0.5) NEAREST = 3
+ ENDIF
+ IF( PWTS( 4,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 4,LOOP)).GE.0.5) NEAREST = 4
+ ENDIF
+ ELSE
+ NEAREST = 1
+ IF( PWTS( 2,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 2,LOOP)).LT.0.5) NEAREST = 2
+ ENDIF
+ IF( PWTS( 3,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 3,LOOP)).LT.0.5) NEAREST = 3
+ ENDIF
+ IF( PWTS( 4,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ IF(OLDLSM(NEIGH( 4,LOOP)).LT.0.5) NEAREST = 4
+ ENDIF
+ ENDIF
+ NEWFLD(LOOP) = OLD(NEIGH( NEAREST,LOOP))
+ ELSE
+ IF( COUNT.EQ.4 .AND. .NOT.LVEGGY2) THEN
+ NEWFLD(LOOP) =
+ X OLD(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLD(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLD(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLD(NEIGH( 4,LOOP)) * PWTS( 4,LOOP)
+C
+C Set missing if all neighbours are missing
+C
+ ELSE IF( COUNT.EQ.0 .AND. .NOT.LVEGGY2) THEN
+ NEWFLD(LOOP) = RMISSGV
+C
+C Otherwise, use the nearest neighbour
+C
+ ELSE
+ IF(LITAL)THEN !land point
+ IF(NEWLSM(LOOP).GE.0.5)THEN !land point
+ INUM=0
+ DO NEXT=1,4
+ IF(OLDLSM(NEIGH( NEXT,LOOP)).GE.0.5)THEN
+ INUM=INUM+1
+ IF( INUM.GE.2)THEN
+ IF(PWTS( NEXT,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ NEAREST = NEXT
+ ENDIF
+ ELSEIF( INUM.EQ.1) THEN
+ NEAREST = NEXT
+ ENDIF
+ ENDIF
+ ENDDO
+
+ ELSE !sea point
+
+ INUM=0
+ DO NEXT=1,4
+ IF(OLDLSM(NEIGH( NEXT,LOOP)).LT.0.5)THEN
+ INUM=INUM+1
+ IF( INUM.GE.2)THEN
+ IF(PWTS( NEXT,LOOP).GT.PWTS(NEAREST,LOOP)) THEN
+ NEAREST = NEXT
+ ENDIF
+ ELSEIF( INUM.EQ.1) THEN
+ NEAREST = NEXT
+ ENDIF
+ ENDIF
+ ENDDO
+
+ ENDIF !end if sea/land
+ ELSE
+ NEAREST = 1
+ IF( PWTS( 2,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 2
+ IF( PWTS( 3,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 3
+ IF( PWTS( 4,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 4
+ ENDIF
+ NEWFLD(LOOP) = OLD(NEIGH( NEAREST,LOOP))
+ ENDIF
+ ENDIF
+C
+ ELSE
+ DO NEXT = 1, 4
+ IF( NEIGH(NEXT,LOOP).NE.0 )
+ X NEWFLD(LOOP) = OLD(NEIGH(NEXT,LOOP))
+ ENDDO
+C
+ ENDIF
+C
+C Remove precipitation if less than a 'trace' or if nearest
+C neighbour is less than a trace
+C
+ IF( LPREC ) THEN
+ IF( NEWFLD(LOOP).LT.ZPRECIP ) THEN
+ NEWFLD(LOOP) = 0.0
+ ELSE
+ NEAREST = 1
+ NEND = 12
+ IF( KSCHEME(LOOP).NE.JP12PT ) NEND = 4
+ DO NEXT = 2, NEND
+ IF( PWTS( NEXT,LOOP).GT.PWTS( NEAREST,LOOP) )
+ X NEAREST = NEXT
+ ENDDO
+ IF( OLD(NEIGH(NEAREST,LOOP)).LT.ZPRECIP ) NEWFLD(LOOP) = 0.0
+ ENDIF
+ ENDIF
+C
+C For sea-ice cover, ensure no values are outside the range (0,1)
+C
+ IF( (NIPARAM.EQ.31).AND.(NITABLE.EQ.128) ) THEN
+ IF( NOTEQ( NEWFLD(LOOP),RMISSGV) ) THEN
+ IF( NEWFLD(LOOP).GT.1.0 ) NEWFLD(LOOP) = 1.0
+ IF( NEWFLD(LOOP).LT.0.0 ) NEWFLD(LOOP) = 0.0
+ ENDIF
+ ENDIF
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 9. Return.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hll2ll.F b/interpolation/hll2ll.F
new file mode 100755
index 0000000..6bcb760
--- /dev/null
+++ b/interpolation/hll2ll.F
@@ -0,0 +1,460 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HLL2LL(L12PNT,OLDFLD,OLDGRID,AREA,POLE,GRID,
+ X NEWFLD,KSIZE,NLON,NLAT)
+C
+C---->
+C**** HLL2LL
+C
+C Purpose
+C -------
+C
+C This routine creates a rotated regular lat/long field from a
+C global regular lat/long field using 12-point horizontal
+C interpolation.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HLL2LL(L12PNT,OLDFLD,OLDGRID,AREA,POLE,GRID,NEWFLD,KSIZE,
+C X NLON,NLAT)
+C
+C
+C Input parameters
+C ----------------
+C
+C L12PNT - Chooses between 12-point and 4-point interpolation
+C OLDFLD - The array of values from the regular lat/long field
+C OLDGRID - Grid increments (i/j) for the global lat/long field
+C AREA - Limits of area (N/W/S/E) for the new lat/long field
+C POLE - Pole of rotation (lat/long) for the new lat/long field
+C GRID - Grid increments (i/j) for the new lat/long field
+C KSIZE - The size of the array to fill with the new
+C lat/long field
+C
+C
+C Output parameters
+C -----------------
+C
+C NEWFLD - The array of values for the regular lat/long field
+C NLON - Number of longitudes in the regular lat/long field
+C NLAT - Number of latitudes in the regular lat/long field
+C
+C Returns 0 if function successful, non-zero otherwise.
+C
+C Common block usage
+C ------------------
+C
+C
+C
+C Method
+C ------
+C
+C Numbering of the points (I is the interpolation point):
+C
+C 13 5 6 14
+C
+C 7 1 2 8
+C (I)
+C 9 3 4 10
+C
+C 15 11 12 16
+C
+C The 12-point interpolation is not possible if either of the top
+C two rows is above the original field northern latitude. The
+C nearest neighbour is used if both rows are above, and a 4-pt
+C bilinear interpolation is used if the top row is above.
+C Similarily, if either of the bottom two rows is below the original
+C field southern latitude.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C JMALLOC - Dynamically allocate memory
+C JFREE - Free dynamically allocated memory
+C HGENLL - Calculates original lat/long (before rotation) for
+C a rotated grid
+C HNEILL - Finds neighbours for points for interpolation
+C HWTSLL - Calculates weightings for points for interpolation
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF November 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Parameters
+C
+ INTEGER JNORTH, JSOUTH, JWEST, JEAST, JW_E, JN_S, JLAT, JLON
+ INTEGER JP12PT, JP4PT, JPNEARN
+ PARAMETER (JP12PT = 0)
+ PARAMETER (JP4PT = 1)
+ PARAMETER (JPNEARN = 2)
+ PARAMETER (JNORTH = 1 )
+ PARAMETER (JWEST = 2 )
+ PARAMETER (JSOUTH = 3 )
+ PARAMETER (JEAST = 4 )
+ PARAMETER (JW_E = 1 )
+ PARAMETER (JN_S = 2 )
+ PARAMETER (JLAT = 1 )
+ PARAMETER (JLON = 2 )
+C
+C Function arguments
+C
+ LOGICAL L12PNT
+ INTEGER KSIZE, NLON, NLAT
+ REAL OLDGRID(2),AREA(4),POLE(2),GRID(2),OLDFLD(*),NEWFLD(KSIZE)
+C
+C Local variables
+C
+ integer loopx
+ INTEGER NEXT, LOOP, IRET, NLEN, NPREV, NBYTES, NUMBER
+ INTEGER NOLDLAT, NOLDLON, NEAREST
+C
+ CHARACTER*12 YFLAG
+ LOGICAL LNEW, LFIRST, LVEGGY
+ INTEGER KSCHEME(1),NEIGH(12,1), KLA(1)
+ REAL PWTS(12,1)
+ POINTER (IPKSCHE, KSCHEME)
+ POINTER (IPNEIGH, NEIGH)
+ POINTER (IPKLA, KLA)
+ POINTER (IPPWTS, PWTS)
+C
+ REAL PDLO0(1),PDLO1(1),PDLO2(1),PDLO3(1),PDLAT(1)
+ POINTER (IPPDLO0, PDLO0)
+ POINTER (IPPDLO1, PDLO1)
+ POINTER (IPPDLO2, PDLO2)
+ POINTER (IPPDLO3, PDLO3)
+ POINTER (IPPDLAT, PDLAT)
+C
+ REAL PREGRID(2)
+ INTEGER KPTS(1)
+ REAL GLATS(1)
+ INTEGER IOFFS(1)
+ POINTER (IPKPTS, KPTS)
+ POINTER (IPIOFFS, IOFFS)
+ POINTER (IPGLATS, GLATS)
+C
+ INTEGER ILL, ILLOLD
+ REAL RLAT(1),RLON(1)
+ POINTER (IPRLAT, RLAT)
+ POINTER (IPRLON, RLON)
+C
+ REAL OLD(1)
+ POINTER (IOLD, OLD)
+C
+ DATA NPREV/-1/
+ DATA LNEW/.FALSE./, LFIRST/.TRUE./
+ DATA ILLOLD/-1/, IOLD/-1/
+ DATA PREGRID/2*0.0/
+C
+ SAVE LNEW, LFIRST
+ SAVE IPKSCHE, IPNEIGH, IPKLA, IPPWTS
+ SAVE IPPDLO0, IPPDLO1, IPPDLO2, IPPDLO3, IPPDLAT
+ SAVE NPREV, IPKPTS, IPIOFFS, IPGLATS
+ SAVE ILLOLD, IPRLAT, IPRLON, IOLD
+ SAVE PREGRID
+C
+C Externals
+C
+ INTEGER HNEILL, HGENLL
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HLL2LL = 0
+C
+ CALL JDEBUG()
+
+ IF( L12PNT ) THEN
+ CALL INTLOG(JP_DEBUG,'HLL2LL: 12-pt interpolation',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'HLL2LL: 4-pt interpolation',JPQUIET)
+ ENDIF
+C
+ CALL CHKPREC()
+ IF( LPREC )THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'HLL2LL: precipitation threshold applied',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'HLL2LL: precipitation threshold not applied',JPQUIET)
+ ENDIF
+C Are we handling vegetation parameter
+ LVEGGY = (NITABLE.EQ.128).AND.
+ X ((NIPARAM.EQ.27).OR.
+ X (NIPARAM.EQ.28).OR.
+ X (NIPARAM.EQ.29).OR.
+ X (NIPARAM.EQ.30).OR.
+ X (NIPARAM.EQ.43) )
+
+C Force nearest neighbour processing with env variable
+ CALL GETENV('NEAREST_NEIGHBOUR', YFLAG)
+ IF( YFLAG(1:1).EQ.'1' ) LVEGGY = .TRUE.
+
+C Force nearest neighbour processing with INTOUT parameter
+ IF( LMETHOD ) LVEGGY = .TRUE.
+
+ IF( LVEGGY ) CALL INTLOG(JP_DEBUG,
+ X 'HLL2LL: nearest neighbour processing (vegetation)',JPQUIET)
+
+ NOLDLAT = 1 + NINT(180.0/OLDGRID(1))
+ NOLDLON = NINT(360.0/OLDGRID(2))
+ NUMBER = NOLDLAT * NOLDLON
+C
+ IF( (OLDGRID(1).NE.PREGRID(1)).OR.
+ X (OLDGRID(2).NE.PREGRID(2)) ) THEN
+C
+C Allocate memory to hold the input field
+C (in case OLDFLD and NEWFLD are the same arrays)
+C
+ IF( IOLD.GT.0 ) CALL JFREE(IOLD)
+C
+ NBYTES = NUMBER * JPRLEN
+C
+ IOLD = JMALLOC(NBYTES)
+#ifdef hpR64
+ IOLD = IOLD/(1024*1024*1024*4)
+#endif
+ IF( IOLD.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HLL2LL: Memory allocation fail',JPQUIET)
+ HLL2LL = 3
+ GOTO 900
+ ENDIF
+C
+ PREGRID(1) = OLDGRID(1)
+ PREGRID(2) = OLDGRID(2)
+C
+ ENDIF
+C
+C Preserve the input field
+C
+ DO LOOP = 1, NUMBER
+ OLD(LOOP) = OLDFLD(LOOP)
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 2. Generate the lat/long points for the output grid
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ NLON = 1 + NINT((AREA(JEAST) - AREA(JWEST)) / GRID(JW_E)) ! SC
+ NLAT = 1 + NINT((AREA(JNORTH) - AREA(JSOUTH)) / GRID(JN_S)) ! SC
+C
+ NLEN = NLON * NLAT
+
+ NOWE = NLON
+ NONS = NLAT
+C
+C Check that given array is big enough for the new field.
+C
+ IF( NLEN.GT.KSIZE ) THEN
+ CALL INTLOG(JP_ERROR,'HLL2LL: Given array size = ',KSIZE)
+ CALL INTLOG(JP_ERROR,'HLL2LL: Required size = ',NLEN)
+ HLL2LL = 4
+ GOTO 900
+ ENDIF
+C
+C Dynamically allocate memory for lat/long arrays.
+C
+ ILL = NLEN
+ IF( ILL.GT.ILLOLD ) THEN
+C
+ LNEW = .TRUE.
+C
+ IF( ILLOLD.GT.0 ) CALL JFREE(IPRLON)
+C
+ NBYTES = 2*ILL*JPRLEN
+C
+ IPRLON = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPRLON = IPRLON/(1024*1024*1024*4)
+#endif
+ IF( IPRLON.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HLL2LL: Memory allocation fail',JPQUIET)
+ HLL2LL = 5
+ GOTO 900
+ ENDIF
+C
+ IPRLAT = IPRLON + (ILL*JPRLEN)
+C
+ ILLOLD = ILL
+C
+ ENDIF
+C
+ IRET = HGENLL(AREA,POLE,GRID,NLON,NLAT,RLAT,RLON)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HLL2LL: HGENLL failed to get lat/lon grid data',JPQUIET)
+ HLL2LL = 6
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 3. Find neighbours for each point for interpolation.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Dynamically allocate memory for interpolation arrays.
+C
+ IF( LNEW ) THEN
+C
+ IF( .NOT.LFIRST ) CALL JFREE(IPPDLO0)
+C
+ NBYTES = (17*JPRLEN + 14*JPBYTES) * ILL
+C
+ IPPDLO0 = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPPDLO0 = IPPDLO0/(1024*1024*1024*4)
+#endif
+ IF( IPPDLO0.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HLL2LL: Memory allocation fail',JPQUIET)
+ HLL2LL = 7
+ GOTO 900
+ ENDIF
+C
+ IPPDLO1 = IPPDLO0 + (ILL*JPRLEN)
+ IPPDLO2 = IPPDLO1 + (ILL*JPRLEN)
+ IPPDLO3 = IPPDLO2 + (ILL*JPRLEN)
+ IPPDLAT = IPPDLO3 + (ILL*JPRLEN)
+ IPPWTS = IPPDLAT + (ILL*JPRLEN)
+ IPKSCHE = IPPWTS + (12*ILL*JPRLEN)
+ IPKLA = IPKSCHE + (ILL*JPBYTES)
+ IPNEIGH = IPKLA + (ILL*JPBYTES)
+C
+ LFIRST = .FALSE.
+ LNEW = .FALSE.
+C
+ ENDIF
+C
+C Find neighbours.
+C
+ IRET = HNEILL(L12PNT,NLEN,RLAT,RLON,OLDGRID,
+ X KSCHEME,PDLAT,PDLO0,PDLO1,PDLO2,PDLO3,KLA,NEIGH)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HLL2LL: HNEILL failed to find neighbours',JPQUIET)
+ HLL2LL = 8
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 4. Perform the 12-point horizontal interpolation.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C Setup the 12-point horizontal interpolation weights
+C
+ CALL HWTSLL
+ X (NLEN,KSCHEME,KLA,PDLAT,oldgrid(2),pdlo0,PDLO1,PDLO2,PDLO3,
+ X NEIGH,PWTS)
+C
+C Calculate the interpolated grid point values
+C
+ DO LOOP = 1, NLEN
+ IF( LVEGGY) THEN
+ NEAREST = 1
+ IF( PWTS( 2,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 2
+ IF( PWTS( 3,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 3
+ IF( PWTS( 4,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 4
+ IF( PWTS( 5,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 5
+ IF( PWTS( 6,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 6
+ IF( PWTS( 7,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 7
+ IF( PWTS( 8,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 8
+ IF( PWTS( 9,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 9
+ IF( PWTS(10,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =10
+ IF( PWTS(11,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =11
+ IF( PWTS(12,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =12
+ NEWFLD(LOOP) = OLD(NEIGH( NEAREST,LOOP))
+ ELSE
+ IF( KSCHEME(LOOP).EQ.JP12PT ) THEN
+ NEWFLD(LOOP) =
+ X OLD(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLD(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLD(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLD(NEIGH( 4,LOOP)) * PWTS( 4,LOOP) +
+ X OLD(NEIGH( 5,LOOP)) * PWTS( 5,LOOP) +
+ X OLD(NEIGH( 6,LOOP)) * PWTS( 6,LOOP) +
+ X OLD(NEIGH( 7,LOOP)) * PWTS( 7,LOOP) +
+ X OLD(NEIGH( 8,LOOP)) * PWTS( 8,LOOP) +
+ X OLD(NEIGH( 9,LOOP)) * PWTS( 9,LOOP) +
+ X OLD(NEIGH(10,LOOP)) * PWTS(10,LOOP) +
+ X OLD(NEIGH(11,LOOP)) * PWTS(11,LOOP) +
+ X OLD(NEIGH(12,LOOP)) * PWTS(12,LOOP)
+C
+ ELSE IF( KSCHEME(LOOP).EQ.JP4PT ) THEN
+ NEWFLD(LOOP) =
+ X OLD(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLD(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLD(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLD(NEIGH( 4,LOOP)) * PWTS( 4,LOOP)
+C
+ ELSE
+ DO NEXT = 1, 4
+ IF( NEIGH(NEXT,LOOP).NE.0 )
+ X NEWFLD(LOOP) = OLD(NEIGH(NEXT,LOOP))
+ ENDDO
+C
+ ENDIF
+ ENDIF
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 9. Return.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hll2llw.F b/interpolation/hll2llw.F
new file mode 100755
index 0000000..86bbecc
--- /dev/null
+++ b/interpolation/hll2llw.F
@@ -0,0 +1,492 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HLL2LLW(L12PNT,OLDFLDU,OLDFLDV,
+ X OLDGRID,AREA,POLE,GRID,
+ X NEWFLDU,NEWFLDV,KSIZE,NLON,NLAT)
+C
+C---->
+C**** HLL2LLW
+C
+C Purpose
+C -------
+C
+C This routine creates rotated U and V regular lat/long fields from
+C U and V global regular lat/long field using 12-point horizontal
+C interpolation.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HLL2LLW(L12PNT,OLDFLDU,OLDFLDV,
+C X OLDGRID,AREA,POLE,GRID,
+C X NEWFLDU,NEWFLDV,KSIZE,
+C X NLON,NLAT)
+C
+C
+C Input parameters
+C ----------------
+C
+C L12PNT - Chooses between 12-point and 4-point interpolation
+C OLDFLDU - Array of values from the old global lat/long U field
+C OLDFLDV - Array of values from the old global lat/long V field
+C OLDGRID - Grid increments (i/j) for the old global lat/long field
+C AREA - Limits of area (N/W/S/E) for the new lat/long fields
+C POLE - Pole of rotation (lat/long) for the new lat/long fields
+C GRID - Grid increments (i/j) for the new lat/long fields
+C KSIZE - The size of the array to fill with the new
+C lat/long fields
+C
+C
+C Output parameters
+C -----------------
+C
+C NEWFLDU - The array of values for the new U lat/long field
+C NEWFLDV - The array of values for the new V lat/long field
+C NLON - Number of longitudes in the regular lat/long fields
+C NLAT - Number of latitudes in the regular lat/long fields
+C
+C Returns 0 if function successful, non-zero otherwise.
+C
+C Common block usage
+C ------------------
+C
+C None
+C
+C
+C Method
+C ------
+C
+C Numbering of the points (I is the interpolation point):
+C
+C 13 5 6 14
+C
+C 7 1 2 8
+C (I)
+C 9 3 4 10
+C
+C 15 11 12 16
+C
+C The 12-point interpolation is not possible if either of the top
+C two rows is above the original field northern latitude. The
+C nearest neighbour is used if both rows are above, and a 4-pt
+C bilinear interpolation is used if the top row is above.
+C Similarily, if either of the bottom two rows is below the original
+C field southern latitude.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C JMALLOC - Dynamically allocate memory
+C JFREE - Free dynamically allocated memory
+C HGENLL - Calculates original lat/long (before rotation) for
+C a rotated grid
+C HNEILL - Finds neighbours for points for interpolation
+C HWTSLL - Calculates weightings for points for interpolation
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF December 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nofld.common"
+C
+C Parameters
+C
+ INTEGER JNORTH, JSOUTH, JWEST, JEAST, JW_E, JN_S, JLAT, JLON
+ INTEGER JP12PT, JP4PT, JPNEARN
+ PARAMETER (JP12PT = 0)
+ PARAMETER (JP4PT = 1)
+ PARAMETER (JPNEARN = 2)
+ PARAMETER (JNORTH = 1 )
+ PARAMETER (JWEST = 2 )
+ PARAMETER (JSOUTH = 3 )
+ PARAMETER (JEAST = 4 )
+ PARAMETER (JW_E = 1 )
+ PARAMETER (JN_S = 2 )
+ PARAMETER (JLAT = 1 )
+ PARAMETER (JLON = 2 )
+C
+C Function arguments
+C
+ LOGICAL L12PNT
+ INTEGER KSIZE, NLON, NLAT
+ REAL OLDGRID(2),AREA(4),POLE(2),GRID(2)
+ REAL OLDFLDU(*),OLDFLDV(*),NEWFLDU(KSIZE),NEWFLDV(KSIZE)
+C
+C Local variables
+C
+ INTEGER NEXT, LOOP, IRET, NLEN, NPREV, NBYTES, NUMBER
+ INTEGER NOLDLAT, NOLDLON
+C
+ LOGICAL LNEW, LFIRST
+ INTEGER KSCHEME(1),NEIGH(12,1), KLA(1)
+ REAL PWTS(12,1)
+ POINTER (IPKSCHE, KSCHEME)
+ POINTER (IPNEIGH, NEIGH)
+ POINTER (IPKLA, KLA)
+ POINTER (IPPWTS, PWTS)
+C
+ REAL PDLO0(1),PDLO1(1),PDLO2(1),PDLO3(1),PDLAT(1)
+ POINTER (IPPDLO0, PDLO0)
+ POINTER (IPPDLO1, PDLO1)
+ POINTER (IPPDLO2, PDLO2)
+ POINTER (IPPDLO3, PDLO3)
+ POINTER (IPPDLAT, PDLAT)
+C
+ REAL PREGRID(2)
+ INTEGER KPTS(1)
+ REAL GLATS(1)
+ INTEGER IOFFS(1)
+ POINTER (IPKPTS, KPTS)
+ POINTER (IPIOFFS, IOFFS)
+ POINTER (IPGLATS, GLATS)
+C
+ INTEGER ILL, ILLOLD
+ REAL RCLAT(1),RCLON(1),RLAT(1),RLON(1),RDIR(1),C(1),S(1),U(1),V(1)
+ POINTER (IPRCLAT, RCLAT)
+ POINTER (IPRCLON, RCLON)
+ POINTER (IPRLAT, RLAT)
+ POINTER (IPRLON, RLON)
+ POINTER (IPRDIR, RDIR)
+ POINTER (IPC, C)
+ POINTER (IPS, S)
+ POINTER (IPU, U)
+ POINTER (IPV, V)
+C
+ REAL OLDU(1)
+ POINTER (IOLDU, OLDU)
+ REAL OLDV(1)
+ POINTER (IOLDV, OLDV)
+C
+ DATA NPREV/-1/
+ DATA LNEW/.FALSE./, LFIRST/.TRUE./
+ DATA ILLOLD/-1/, IOLDU/-1/, IOLDV/-1/
+ DATA PREGRID/2*0.0/
+C
+ SAVE LNEW, LFIRST
+ SAVE IPKSCHE, IPNEIGH, IPKLA, IPPWTS
+ SAVE IPPDLO0, IPPDLO1, IPPDLO2, IPPDLO3, IPPDLAT
+ SAVE NPREV, IPKPTS, IPIOFFS, IPGLATS
+ SAVE ILLOLD, IPRLAT, IPRLON, IOLDU, IOLDV
+ SAVE IPC, IPS, IPU, IPV
+ SAVE PREGRID
+C
+C Externals
+C
+ INTEGER HNEILL, HGENLL
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+C
+C Statement function
+C
+ REAL A, RADIAN
+C
+C Convert degrees to radians
+C
+ RADIAN(A) = (A) * 0.0174532925
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HLL2LLW = 0
+C
+ CALL JDEBUG()
+ NOLDLAT = 1 + NINT(180.0/OLDGRID(1))
+ NOLDLON = NINT(360.0/OLDGRID(2))
+ NUMBER = NOLDLAT * NOLDLON
+C
+ IF( (OLDGRID(1).NE.PREGRID(1)).OR.
+ X (OLDGRID(2).NE.PREGRID(2)) ) THEN
+C
+C Allocate memory to hold the input fields
+C (in case OLDFLDU/OLDFLDV and NEWFLDU/NEWFLDV are the same arrays)
+C
+ IF( IOLDU.GT.0 ) THEN
+ CALL JFREE(IOLDU)
+ CALL JFREE(IOLDV)
+ ENDIF
+C
+ NBYTES = NUMBER * JPRLEN
+C
+ IOLDU = JMALLOC(NBYTES)
+ IOLDV = JMALLOC(NBYTES)
+#ifdef hpR64
+ IOLDU = IOLDU/(1024*1024*1024*4)
+ IOLDV = IOLDV/(1024*1024*1024*4)
+#endif
+ IF( (IOLDU.EQ.0).OR.(IOLDV.EQ.0) ) THEN
+ CALL INTLOG(JP_ERROR,'HLL2LLW: Memory allocate fail',JPQUIET)
+ HLL2LLW = 3
+ GOTO 900
+ ENDIF
+C
+ PREGRID(1) = OLDGRID(1)
+ PREGRID(2) = OLDGRID(2)
+C
+ ENDIF
+C
+C Preserve the input fields
+C
+ DO LOOP = 1, NUMBER
+ OLDU(LOOP) = OLDFLDU(LOOP)
+ OLDV(LOOP) = OLDFLDV(LOOP)
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 2. Generate the lat/long points for the output grid
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ NLON = 1 + INT((AREA(JEAST) - AREA(JWEST)) / GRID(JW_E))
+ NLAT = 1 + INT((AREA(JNORTH) - AREA(JSOUTH)) / GRID(JN_S))
+C
+ NLEN = NLON * NLAT
+
+ NOWE = NLON
+ NONS = NLAT
+C
+C Check that given array is big enough for the new field.
+C
+ IF( NLEN.GT.KSIZE ) THEN
+ CALL INTLOG(JP_ERROR,'HLL2LLW: Given array size = ',KSIZE)
+ CALL INTLOG(JP_ERROR,'HLL2LLW: Required size = ',NLEN)
+ HLL2LLW = 4
+ GOTO 900
+ ENDIF
+C
+C Dynamically allocate memory for lat/long arrays.
+C
+ ILL = NLEN
+ IF( ILL.GT.ILLOLD ) THEN
+C
+ LNEW = .TRUE.
+C
+ IF( ILLOLD.GT.0 ) CALL JFREE(IPRLON)
+C
+ NBYTES = 9*ILL*JPRLEN
+C
+ IPRLON = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPRLON = IPRLON/(1024*1024*1024*4)
+#endif
+ IF( IPRLON.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HLL2LLW: Memory allocate fail',JPQUIET)
+ HLL2LLW = 5
+ GOTO 900
+ ENDIF
+C
+ IPRLAT = IPRLON + (ILL*JPRLEN)
+ IPRCLON = IPRLAT + (ILL*JPRLEN)
+ IPRCLAT = IPRCLON + (ILL*JPRLEN)
+ IPRDIR = IPRCLAT + (ILL*JPRLEN)
+ IPC = IPRDIR + (ILL*JPRLEN)
+ IPS = IPC + (ILL*JPRLEN)
+ IPU = IPS + (ILL*JPRLEN)
+ IPV = IPU + (ILL*JPRLEN)
+C
+ ILLOLD = ILL
+C
+ ENDIF
+C
+ IRET = HGENLL(AREA,POLE,GRID,NLON,NLAT,RLAT,RLON)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HLL2LLW: HGENLL failed to get lat/lon grid data',JPQUIET)
+ HLL2LLW = 6
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 3. Find neighbours for each point for interpolation.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Dynamically allocate memory for interpolation arrays.
+C
+ IF( LNEW ) THEN
+C
+ IF( .NOT.LFIRST ) CALL JFREE(IPPDLO0)
+C
+ NBYTES = (17*JPRLEN + 14*JPBYTES) * ILL
+C
+ IPPDLO0 = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPPDLO0 = IPPDLO0/(1024*1024*1024*4)
+#endif
+ IF( IPPDLO0.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HLL2LLW: Memory allocate fail',JPQUIET)
+ HLL2LLW = 7
+ GOTO 900
+ ENDIF
+C
+ IPPDLO1 = IPPDLO0 + (ILL*JPRLEN)
+ IPPDLO2 = IPPDLO1 + (ILL*JPRLEN)
+ IPPDLO3 = IPPDLO2 + (ILL*JPRLEN)
+ IPPDLAT = IPPDLO3 + (ILL*JPRLEN)
+ IPPWTS = IPPDLAT + (ILL*JPRLEN)
+ IPKSCHE = IPPWTS + (12*ILL*JPRLEN)
+ IPKLA = IPKSCHE + (ILL*JPBYTES)
+ IPNEIGH = IPKLA + (ILL*JPBYTES)
+C
+ LFIRST = .FALSE.
+ LNEW = .FALSE.
+C
+ ENDIF
+C
+C Find neighbours.
+C
+ IRET = HNEILL(L12PNT,NLEN,RLAT,RLON,OLDGRID,
+ X KSCHEME,PDLAT,PDLO0,PDLO1,PDLO2,PDLO3,KLA,NEIGH)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HLL2LLW: HNEILL failed to find neighbours',JPQUIET)
+ HLL2LLW = 8
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 4. Perform the 12-point horizontal interpolation.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C Setup the 12-point horizontal interpolation weights
+C
+ CALL HWTSLL
+ X (NLEN,KSCHEME,KLA,PDLAT,OLDGRID(2),PDLO0,PDLO1,PDLO2,PDLO3,
+ X NEIGH,PWTS)
+C
+C Calculate the interpolated grid point values
+C
+ DO LOOP = 1, NLEN
+ IF( KSCHEME(LOOP).EQ.JP12PT ) THEN
+ U(LOOP) =
+ X OLDU(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLDU(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLDU(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLDU(NEIGH( 4,LOOP)) * PWTS( 4,LOOP) +
+ X OLDU(NEIGH( 5,LOOP)) * PWTS( 5,LOOP) +
+ X OLDU(NEIGH( 6,LOOP)) * PWTS( 6,LOOP) +
+ X OLDU(NEIGH( 7,LOOP)) * PWTS( 7,LOOP) +
+ X OLDU(NEIGH( 8,LOOP)) * PWTS( 8,LOOP) +
+ X OLDU(NEIGH( 9,LOOP)) * PWTS( 9,LOOP) +
+ X OLDU(NEIGH(10,LOOP)) * PWTS(10,LOOP) +
+ X OLDU(NEIGH(11,LOOP)) * PWTS(11,LOOP) +
+ X OLDU(NEIGH(12,LOOP)) * PWTS(12,LOOP)
+ V(LOOP) =
+ X OLDV(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLDV(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLDV(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLDV(NEIGH( 4,LOOP)) * PWTS( 4,LOOP) +
+ X OLDV(NEIGH( 5,LOOP)) * PWTS( 5,LOOP) +
+ X OLDV(NEIGH( 6,LOOP)) * PWTS( 6,LOOP) +
+ X OLDV(NEIGH( 7,LOOP)) * PWTS( 7,LOOP) +
+ X OLDV(NEIGH( 8,LOOP)) * PWTS( 8,LOOP) +
+ X OLDV(NEIGH( 9,LOOP)) * PWTS( 9,LOOP) +
+ X OLDV(NEIGH(10,LOOP)) * PWTS(10,LOOP) +
+ X OLDV(NEIGH(11,LOOP)) * PWTS(11,LOOP) +
+ X OLDV(NEIGH(12,LOOP)) * PWTS(12,LOOP)
+C
+ ELSE IF( KSCHEME(LOOP).EQ.JP4PT ) THEN
+ U(LOOP) =
+ X OLDU(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLDU(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLDU(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLDU(NEIGH( 4,LOOP)) * PWTS( 4,LOOP)
+ V(LOOP) =
+ X OLDV(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLDV(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLDV(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLDV(NEIGH( 4,LOOP)) * PWTS( 4,LOOP)
+C
+ ELSE
+ DO NEXT = 1, 4
+ IF( NEIGH(NEXT,LOOP).NE.0 ) THEN
+ U(LOOP) = OLDU(NEIGH(NEXT,LOOP))
+ V(LOOP) = OLDV(NEIGH(NEXT,LOOP))
+ ENDIF
+ ENDDO
+C
+ ENDIF
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 5. Adjust the U and V components to new (rotated) axes
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+ DO LOOP = 1, NLEN
+ RDIR(LOOP) = 0.0
+ ENDDO
+C
+ CALL HPSHGPW(RLON,RLAT,RCLON,RCLAT,RDIR,NLEN,POLE)
+C
+ DO LOOP = 1, NLEN
+ RDIR(LOOP) = -RADIAN(RDIR(LOOP))
+ ENDDO
+C
+ DO LOOP = 1, NLEN
+ C(LOOP) = COS(RDIR(LOOP))
+ S(LOOP) = SIN(RDIR(LOOP))
+ ENDDO
+C
+ DO LOOP = 1, NLEN
+ NEWFLDU(LOOP) = U(LOOP)*C(LOOP) - V(LOOP)*S(LOOP)
+ NEWFLDV(LOOP) = U(LOOP)*S(LOOP) + V(LOOP)*C(LOOP)
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 9. Return.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hll2xyz.F b/interpolation/hll2xyz.F
new file mode 100755
index 0000000..32e5e55
--- /dev/null
+++ b/interpolation/hll2xyz.F
@@ -0,0 +1,84 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE HLL2XYZ(RLAT,RLONG,X,Y,Z,INROW)
+C---->
+C**** HLL2XYZ
+C
+C Purpose
+C -------
+C
+C Converts an array of latitude/longitude values to an
+C array of (x,y,z) coordinates.
+C
+C
+C Interface
+C ---------
+C
+C CALL HLL2XYZ(RLAT,RLONG,X,Y,Z,INROW)
+C
+C Input
+C -----
+C
+C RLAT - Array of latitudes.
+C RLONG - Array of corresponding longitudes.
+C INROW - Count of latitudes/longitudes.
+C
+C
+C Output
+C ------
+C
+C (X,Y,Z) - Array of coordinates.
+C
+C
+C Method
+C ------
+C
+C Z axis is the polar axis directed from south to north.
+C X and Y axes are in the equatorial plane and have origin at the
+C centre of the Earth. The X axis passes through (O north, 0 east).
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ REAL RLAT,RLONG,X,Y,Z
+ DIMENSION RLAT(*),RLONG(*),X(*),Y(*),Z(*)
+ INTEGER INROW
+C
+C Local variables
+C
+ REAL FACTOR
+ DATA FACTOR/0.017453293/
+ INTEGER LOOP
+C
+ DO LOOP = 1, INROW
+ X(LOOP) = COS(RLAT(LOOP)*FACTOR) * COS(RLONG(LOOP)*FACTOR)
+ Y(LOOP) = COS(RLAT(LOOP)*FACTOR) * SIN(RLONG(LOOP)*FACTOR)
+ Z(LOOP) = SIN(RLAT(LOOP)*FACTOR)
+ ENDDO
+C
+ RETURN
+ END
+
diff --git a/interpolation/hnei12.F b/interpolation/hnei12.F
new file mode 100755
index 0000000..8e6f598
--- /dev/null
+++ b/interpolation/hnei12.F
@@ -0,0 +1,462 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HNEI12
+ X (L12PNT,KLEN,RLAT,RLON,KGAUSS,KPTS,PLATIN,
+ X KSCHEME,PDLAT,PDLO0,PDLO1,PDLO2,PDLO3,KLA,NEIGH)
+C
+C---->
+C**** HNEI12
+C
+C Purpose
+C -------
+C
+C This routine accepts a vector of points and finds the 12
+C neighbours for each point suitable for horizontal interpolation.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HNEI12(L12PNT,KLEN,RLAT,RLON,KGAUSS,KPTS,PLATIN,
+C X KSCHEME,PDLAT,PDLO0,PDLO1,PDLO2,PDLO3,KLA,NEIGH)
+C
+C
+C Input parameters
+C ----------------
+C
+C L12PNT - Chooses between 12-point and 4-point interpolation
+C = .TRUE. for 12-point horizontal
+C = .FALSE. for 4-point
+C KLEN - Number of points along the vector
+C RLAT - List of latitudes for points.
+C RLON - List of longitudes for points.
+C KGAUSS - Original gaussian field number.
+C KPTS - List giving number of points in each latitude in original
+C gaussian field.
+C PLATIN - Original gaussian field latitudes (north and south).
+C
+C
+C Output parameters
+C -----------------
+C
+C KSCHEME - Flag showing interpolation scheme to use for point
+C 0 = 12-point
+C 1 = 4-point bilinear
+C 2 = nearest neighbour
+C PDLAT - Meridian linear weight.
+C PDLO0 - Zonal linear weight for the latitude of point 5.
+C PDLO1 - Zonal linear weight for the latitude of point 1.
+C PDLO2 - Zonal linear weight for the latitude of point 3.
+C PDLO3 - Zonal linear weight for the latitude of point 11.
+C KLA - Latitude number in original field of latitude north of
+C each point in the vector.
+C NEIGH - List of indices in the original field of neighbouring
+C point values for each point in the vector.
+C
+C Returns 0 if function successful, non-zero otherwise.
+C
+C Common block usage
+C ------------------
+C
+C None.
+C
+C
+C Method
+C ------
+C
+C Numbering of the points (I is the interpolation point):
+C
+C 13 5 6 14
+C
+C 7 1 2 8
+C (I)
+C 9 3 4 10
+C
+C 15 11 12 16
+C
+C The 12-point interpolation is not possible if either of the top
+C two rows is above the original field northern latitude. The
+C nearest neighbour is used if both rows are above, and a 4-pt
+C bilinear interpolation is used if the top row is above.
+C Similarily, if either of the bottom two rows is below the original
+C field southern latitude.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C JNORSGG - Finds gaussian latitude north or south of given latitude
+C JDEBUG - Tests if debug output required.
+C JMALLOC - Dynamically allocate memory
+C JFREE - Free dynamically allocated memory
+C
+C
+C Reference
+C ---------
+C
+C ECMWF Meteorological Bulletin M1.6/7
+C IFS Documentation
+C Part VI: Technical and Computational Procedures (CY21R4)
+C March 2000
+C Section 2.3
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JP12PT, JP4PT, JPNEARN
+ PARAMETER (JP12PT = 0)
+ PARAMETER (JP4PT = 1)
+ PARAMETER (JPNEARN = 2)
+C
+C Function arguments
+C
+ LOGICAL L12PNT
+ INTEGER KLEN, KGAUSS, KPTS(KGAUSS*2)
+ REAL RLAT(KLEN), RLON(KLEN), PLATIN(KGAUSS*2)
+C
+ INTEGER KLA(KLEN), KSCHEME(KLEN)
+ REAL PDLAT(KLEN),PDLO0(KLEN),PDLO1(KLEN),PDLO2(KLEN),PDLO3(KLEN)
+ INTEGER NEIGH(12,*)
+C
+C Local variables
+C
+ INTEGER NEXT, LOOP, NBYTES
+ INTEGER NLAT0, NLAT1, NLAT2, NLAT3, NLAT(12), NLONG(12)
+ REAL STEP0, STEP1, STEP2, STEP3
+ INTEGER NPREV, ISIZE, ISIZOLD, IOFFSET(1)
+ POINTER( IPOFF, IOFFSET )
+C
+ DATA ISIZOLD/-1/, NPREV/-1/
+ SAVE ISIZOLD,IPOFF,NPREV
+C
+C Externals
+C
+ INTEGER JNORSGG
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HNEI12 = 0
+C
+ CALL JDEBUG()
+C
+C Get memory for offset array.
+C
+ ISIZE = KGAUSS*2 + 1
+ IF( ISIZE.GT.ISIZOLD ) THEN
+C
+ IF( ISIZOLD.GT.0 ) CALL JFREE(IPOFF)
+C
+ NBYTES = ISIZE * JPBYTES
+ IPOFF = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPOFF = IPOFF/(1024*1024*1024*4)
+#endif
+ IF( IPOFF.EQ.0 ) THEN
+ CALL INTLOG(JP_WARN,'HNEI12: Memory allocate fail ',JPQUIET)
+ HNEI12 = 1
+ GOTO 900
+ ENDIF
+C
+ ISIZOLD = ISIZE
+ NPREV = -1
+C
+ ENDIF
+C
+C Build up offsets to start of each latitude in the original field.
+C
+ IF( KGAUSS.NE.NPREV ) THEN
+ IOFFSET(1) = 1
+ DO LOOP = 2, (KGAUSS*2+1)
+ IOFFSET(LOOP) = IOFFSET(LOOP-1) + KPTS(LOOP-1)
+ ENDDO
+ NPREV = KGAUSS
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 2. Loop through points along the vector.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ DO NEXT = 1,KLEN
+C
+C Clear current neighbour indices
+C
+ DO LOOP = 1, 12
+ NEIGH(LOOP,NEXT) = 0
+ ENDDO
+C
+C Find latitude numbers for neighbours.
+C
+C First find latitude numbers to north and south of the point
+C
+C -----------------------------------------------------------------|
+C Section 3. Nearest neighbour to be used.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( RLAT(NEXT).GT.PLATIN(1) ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'HNEI12: Nearest neighbour to south used for point ',NEXT)
+C
+C Above northern latitude of original field, so use nearest
+C neighbour (point 3 or 4)
+C
+ STEP2 = 360.0 / REAL(KPTS(1))
+ NLONG( 3) = 1 + INT(RLON(NEXT)/STEP2)
+ IF( NLONG( 3).GT.KPTS(1) ) NLONG( 3) = 1
+ NLONG( 4) = NLONG(3) + 1
+ IF( NLONG( 4).GT.KPTS(1) ) NLONG( 4) = 1
+C
+ IF( ABS((RLON(NEXT) - REAL(NLONG(3)-1)*STEP2 )) .LE.
+ X ABS((RLON(NEXT) - REAL(NLONG(4)-1)*STEP2 )) ) THEN
+ NEIGH(3,NEXT) = NLONG(3)
+ ELSE
+ NEIGH(4,NEXT) = NLONG(4)
+ ENDIF
+ KSCHEME(NEXT) = JPNEARN
+ GOTO 600
+ ENDIF
+C
+ IF( RLAT(NEXT).LT.PLATIN(KGAUSS*2) ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'HNEI12: Nearest neighbour to north used for point ',NEXT)
+C
+C Below southern latitude of original field, so use nearest
+C neighbour (point 1 or 2)
+C
+ STEP1 = 360.0 / REAL(KPTS(KGAUSS*2))
+ NLONG( 1) = 1 + INT(RLON(NEXT)/STEP1)
+ IF( NLONG( 1).GT.KPTS(KGAUSS*2) ) NLONG( 1) = 1
+ NLONG( 2) = NLONG(1) + 1
+ IF( NLONG( 2).GT.KPTS(KGAUSS*2) ) NLONG( 2) = 1
+C
+ IF( ABS((RLON(NEXT) - REAL(NLONG(1)-1)*STEP1 )) .LE.
+ X ABS((RLON(NEXT) - REAL(NLONG(2)-1)*STEP1 )) ) THEN
+ NEIGH(1,NEXT) = IOFFSET(KGAUSS*2) + NLONG(1) - 1
+ ELSE
+ NEIGH(2,NEXT) = IOFFSET(KGAUSS*2) + NLONG(2) - 1
+ ENDIF
+ KSCHEME(NEXT) = JPNEARN
+ GOTO 600
+ ENDIF
+C
+ NLAT1 = JNORSGG(RLAT(NEXT),PLATIN,KGAUSS,1)
+ NLAT2 = JNORSGG(RLAT(NEXT),PLATIN,KGAUSS,0)
+C
+ IF( NLAT2.EQ.NLAT1) NLAT2 = NLAT1 + 1
+C
+C Find outer latitude numbers to north and south of the point
+C
+ NLAT0 = NLAT1 - 1
+ NLAT3 = NLAT2 + 1
+C
+C -----------------------------------------------------------------|
+C Section 4. 4-point bilinear to be used.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ IF( (NLAT0.EQ.0).OR.(NLAT3.GT.KGAUSS*2).OR.(.NOT.L12PNT) ) THEN
+Cjdc CALL INTLOG(JP_DEBUG,
+Cjdc X 'HNEI12: 4-pt bilinear interpolation used for point ',NEXT)
+C
+C Between two northern latitudes or two southern latitudes of
+C original field, so use 4-point bilinear interpolation
+C (points 1, 2, 3 and 4)
+C
+C Points 1 and 2
+C
+ STEP1 = 360.0 / REAL(KPTS(NLAT1))
+ NLONG(1) = 1 + INT(RLON(NEXT)/STEP1)
+ IF( NLONG(1).GT.KPTS(NLAT1) ) NLONG(1) = 1
+ NLONG(2) = NLONG(1) + 1
+ IF( NLONG(2).GT.KPTS(NLAT1) ) NLONG(2) = 1
+C
+ NEIGH(1,NEXT) = IOFFSET(NLAT1) + NLONG(1) - 1
+ NEIGH(2,NEXT) = IOFFSET(NLAT1) + NLONG(2) - 1
+C
+C Points 3 and 4
+C
+ STEP2 = 360.0 / REAL(KPTS(NLAT2))
+ NLONG( 3) = 1 + INT(RLON(NEXT)/STEP2)
+ IF( NLONG( 3).GT.KPTS(NLAT2) ) NLONG( 3) = 1
+ NLONG( 4) = NLONG(3) + 1
+ IF( NLONG( 4).GT.KPTS(NLAT2) ) NLONG( 4) = 1
+C
+ NEIGH(3,NEXT) = IOFFSET(NLAT2) + NLONG(3) - 1
+ NEIGH(4,NEXT) = IOFFSET(NLAT2) + NLONG(4) - 1
+C
+C Calculate zonal linear weights for the latitudes.
+C
+ PDLO1(NEXT) = ( RLON(NEXT) - REAL(NLONG(1)-1)*STEP1 ) / STEP1
+ PDLO2(NEXT) = ( RLON(NEXT) - REAL(NLONG(3)-1)*STEP2 ) / STEP2
+C
+ KLA(NEXT) = NLAT1
+ PDLAT(NEXT) = ( RLAT(NEXT) - PLATIN(NLAT1) ) /
+ X ( PLATIN(NLAT2) - PLATIN(NLAT1) )
+C
+ KSCHEME(NEXT) = JP4PT
+ GOTO 600
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 5. 12-point interpolation to be used.
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+ KSCHEME(NEXT) = JP12PT
+C
+ KLA(NEXT) = NLAT1
+ PDLAT(NEXT) = ( RLAT(NEXT) - PLATIN(NLAT1) ) /
+ X ( PLATIN(NLAT2) - PLATIN(NLAT1) )
+C
+C Northernmost
+C
+ NLAT(5) = NLAT0
+ NLAT(6) = NLAT0
+C
+C Northern
+C
+ NLAT(7) = NLAT1
+ NLAT(1) = NLAT1
+ NLAT(2) = NLAT1
+ NLAT(8) = NLAT1
+C
+C Southern
+C
+ NLAT( 9) = NLAT2
+ NLAT( 3) = NLAT2
+ NLAT( 4) = NLAT2
+ NLAT(10) = NLAT2
+C
+C Southernmost
+C
+ NLAT(11) = NLAT3
+ NLAT(12) = NLAT3
+C
+C -----------------------------------------------------------------|
+C Find longitude numbers for neighbours.
+C -----------------------------------------------------------------|
+C
+C Northernmost
+C
+ STEP0 = 360.0 / REAL(KPTS(NLAT0))
+ NLONG(5) = 1 + INT(RLON(NEXT)/STEP0)
+ IF( NLONG(5).GT.KPTS(NLAT0) ) NLONG(5) = 1
+ NLONG(6) = NLONG(5) + 1
+ IF( NLONG(6).GT.KPTS(NLAT0) ) NLONG(6) = 1
+C
+C Northern
+C
+ STEP1 = 360.0 / REAL(KPTS(NLAT1))
+ NLONG(1) = 1 + INT(RLON(NEXT)/STEP1)
+ IF( NLONG(1).GT.KPTS(NLAT1) ) NLONG(1) = 1
+ NLONG(7) = NLONG(1) - 1
+ IF( NLONG(7).LT.1 ) NLONG(7) = KPTS(NLAT1)
+ NLONG(2) = NLONG(1) + 1
+ IF( NLONG(2).GT.KPTS(NLAT1) ) NLONG(2) = 1
+ NLONG(8) = NLONG(2) + 1
+ IF( NLONG(8).GT.KPTS(NLAT1) ) NLONG(8) = 1
+C
+C Southern
+C
+ STEP2 = 360.0 / REAL(KPTS(NLAT2))
+ NLONG( 3) = 1 + INT(RLON(NEXT)/STEP2)
+ IF( NLONG( 3).GT.KPTS(NLAT2) ) NLONG( 3) = 1
+ NLONG( 9) = NLONG(3) - 1
+ IF( NLONG( 9).LT.1 ) NLONG( 9) = KPTS(NLAT2)
+ NLONG( 4) = NLONG(3) + 1
+ IF( NLONG( 4).GT.KPTS(NLAT2) ) NLONG( 4) = 1
+ NLONG(10) = NLONG(4) + 1
+ IF( NLONG(10).GT.KPTS(NLAT2) ) NLONG(10) = 1
+C
+C Southernmost
+C
+ STEP3 = 360.0 / REAL(KPTS(NLAT3))
+ NLONG(11) = 1 + INT(RLON(NEXT)/STEP3)
+ IF( NLONG(11).GT.KPTS(NLAT3) ) NLONG(11) = 1
+ NLONG(12) = NLONG(11) + 1
+ IF( NLONG(12).GT.KPTS(NLAT3) ) NLONG(12) = 1
+C
+C -----------------------------------------------------------------|
+C Calculate zonal linear weights for the latitudes.
+C -----------------------------------------------------------------|
+C
+ PDLO0(NEXT) = ( RLON(NEXT) - REAL(NLONG(5)-1)*STEP0 ) / STEP0
+C
+ PDLO1(NEXT) = ( RLON(NEXT) - REAL(NLONG(1)-1)*STEP1 ) / STEP1
+C
+ PDLO2(NEXT) = ( RLON(NEXT) - REAL(NLONG(3)-1)*STEP2 ) / STEP2
+C
+ PDLO3(NEXT) = ( RLON(NEXT) - REAL(NLONG(11)-1)*STEP3 ) / STEP3
+C
+C -----------------------------------------------------------------|
+C Store indices of the neighbours.
+C -----------------------------------------------------------------|
+C
+ DO LOOP = 1, 12
+ NEIGH(LOOP,NEXT) = IOFFSET(NLAT(LOOP)) + NLONG(LOOP) - 1
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 6. End of loop along vector of points.
+C -----------------------------------------------------------------|
+C
+ 600 CONTINUE
+C
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hneill.F b/interpolation/hneill.F
new file mode 100755
index 0000000..91f9f90
--- /dev/null
+++ b/interpolation/hneill.F
@@ -0,0 +1,395 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HNEILL
+ X (L12PNT,KLEN,RLAT,RLON,OLDGRID,
+ X KSCHEME,PDLAT,PDLO0,PDLO1,PDLO2,PDLO3,KLA,NEIGH)
+C
+C---->
+C**** HNEILL
+C
+C Purpose
+C -------
+C
+C This routine accepts a vector of points and finds the 12
+C neighbours for each point suitable for horizontal interpolation.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HNEILL(L12PNT,KLEN,RLAT,RLON,OLDGRID,
+C X KSCHEME,PDLAT,PDLO0,PDLO1,PDLO2,PDLO3,KLA,NEIGH)
+C
+C
+C Input parameters
+C ----------------
+C
+C L12PNT - Chooses between 12-point and 4-point interpolation
+C = .TRUE. for 12-point horizontal
+C = .FALSE. for 4-point
+C KLEN - Number of points along the vector
+C RLAT - List of latitudes for points.
+C RLON - List of longitudes for points.
+C OLDGRID - Grid increments (i/j) for the global lat/long field
+C
+C
+C Output parameters
+C -----------------
+C
+C KSCHEME - Flag showing interpolation scheme to use for point
+C 0 = 12-point
+C 1 = 4-point bilinear
+C 2 = nearest neighbour
+C PDLAT - Meridian linear weight.
+C PDLO0 - Zonal linear weight for the latitude of point 5.
+C PDLO1 - Zonal linear weight for the latitude of point 1.
+C PDLO2 - Zonal linear weight for the latitude of point 3.
+C PDLO3 - Zonal linear weight for the latitude of point 11.
+C KLA - Latitude number in original field of latitude north of
+C each point in the vector.
+C NEIGH - List of indices in the original field of neighbouring
+C point values for each point in the vector.
+C
+C Returns 0 if function successful, non-zero otherwise.
+C
+C Common block usage
+C ------------------
+C
+C None.
+C
+C
+C Method
+C ------
+C
+C Numbering of the points (I is the interpolation point):
+C
+C 13 5 6 14
+C
+C 7 1 2 8
+C (I)
+C 9 3 4 10
+C
+C 15 11 12 16
+C
+C The 12-point interpolation is not possible if either of the top
+C two rows is above the original field northern latitude. The
+C nearest neighbour is used if both rows are above, and a 4-pt
+C bilinear interpolation is used if the top row is above.
+C Similarily, if either of the bottom two rows is below the original
+C field southern latitude.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C JDEBUG - Tests if debug output required.
+C JMALLOC - Dynamically allocate memory
+C JFREE - Free dynamically allocated memory
+C
+C
+C Reference
+C ---------
+C
+C ECMWF Meteorological Bulletin M1.6/7
+C IFS Documentation
+C Part VI: Technical and Computational Procedures (CY21R4)
+C March 2000
+C Section 2.3
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JP12PT, JP4PT, JPNEARN
+ PARAMETER (JP12PT = 0)
+ PARAMETER (JP4PT = 1)
+ PARAMETER (JPNEARN = 2)
+C
+C Function arguments
+C
+ LOGICAL L12PNT
+ INTEGER KLEN
+ REAL OLDGRID(2), RLAT(KLEN), RLON(KLEN)
+C
+ INTEGER KLA(KLEN), KSCHEME(KLEN)
+ REAL PDLAT(KLEN),PDLO0(KLEN),PDLO1(KLEN),PDLO2(KLEN),PDLO3(KLEN)
+ INTEGER NEIGH(12,*)
+C
+C Local variables
+C
+ INTEGER NEXT, LOOP, NBYTES, NOLDLAT, NOLDLON
+ INTEGER NLAT0, NLAT1, NLAT2, NLAT3, NLAT(12), NLONG(12)
+ INTEGER NLONG1, NLONG2, NLONG5
+ REAL PLATINC, PLONINC
+ INTEGER NPREV, ISIZE, ISIZOLD
+C
+ DATA ISIZOLD/-1/, NPREV/-1/
+ SAVE ISIZOLD,NPREV
+C
+C Externals
+C
+ INTEGER JNORSGG
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+C
+C Statement functions
+C
+ INTEGER ILAT, NUMLAT, NUMLON
+ REAL LAT, LON, PLATIN, LATSTEP, LONSTEP
+C
+ PLATIN(ILAT,LATSTEP) = 90.0 - REAL(ILAT-1)*LATSTEP
+ NUMLAT(LAT,LATSTEP) = 1 + NINT((90.0 - LAT)/LATSTEP)
+ NUMLON(LON,LONSTEP) = 1 + NINT(LON/LONSTEP )
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HNEILL = 0
+C
+ CALL JDEBUG()
+C
+ PLATINC = OLDGRID(1)
+ PLONINC = OLDGRID(2)
+ NOLDLAT = 1 + NINT(180.0/PLATINC)
+ NOLDLON = NINT(360.0/PLONINC)
+C
+C -----------------------------------------------------------------|
+C Section 2. Loop through points along the vector.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ DO NEXT = 1,KLEN
+C
+C Clear current neighbour indices
+C
+ DO LOOP = 1, 12
+ NEIGH(LOOP,NEXT) = 0
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 3. Find latitude numbers for neighbours.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C First find latitude numbers to north and south of the point
+C
+ NLAT1 = NUMLAT(RLAT(NEXT),PLATINC)
+ NLAT2 = NLAT1 + 1
+C
+C Find outer latitude numbers further north and south of the point
+C
+ NLAT0 = NLAT1 - 1
+ NLAT3 = NLAT2 + 1
+C
+C -----------------------------------------------------------------|
+C Section 4. Nearest neighbour to be used.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ IF( (NLAT1.LT.1).OR.(NLAT2.GT.NOLDLAT) ) THEN
+C
+C On northern/southern latitude of original field, so use
+C nearest neighbours (point 1 or 2)
+C
+ IF( NLAT1.LT.1 ) NLAT1 = 1
+C
+ IF( NLAT2.GT.NOLDLAT ) NLAT1 = NOLDLAT
+C
+ NLONG(1) = NUMLON(RLON(NEXT),PLONINC)
+ NLONG1 = NLONG(1)
+ IF( NLONG(1).GT.NOLDLON ) NLONG(1) = 1
+ NLONG(2) = NLONG(1) + 1
+ NLONG2 = NLONG(2)
+ IF( NLONG(2).GT.NOLDLON ) NLONG(2) = 1
+C
+ IF( ABS((RLON(NEXT) - REAL(NLONG1-1)*PLONINC )) .LE.
+ X ABS((RLON(NEXT) - REAL(NLONG2-1)*PLONINC )) ) THEN
+ NEIGH(1,NEXT) = (NLAT1-1)*NOLDLON + NLONG(1)
+ ELSE
+ NEIGH(1,NEXT) = (NLAT1-1)*NOLDLON + NLONG(2)
+ ENDIF
+ KSCHEME(NEXT) = JPNEARN
+ GOTO 700
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 5. 4-point bilinear to be used.
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+ IF( (NLAT0.LT.1).OR.(NLAT3.GT.NOLDLAT).OR.
+ X (.NOT.L12PNT) ) THEN
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'HNEILL: 4-pt bilinear interpolation used for point ',NEXT)
+C
+C Between two northern latitudes or two southern latitudes of
+C original field, so use 4-point bilinear interpolation
+C (points 1, 2, 3 and 4)
+C
+C Points 1 and 2
+C
+ NLONG(1) = NUMLON(RLON(NEXT),PLONINC)
+ NLONG1 = NLONG(1)
+ IF( NLONG(1).GT.NOLDLON ) NLONG(1) = 1
+C
+ NEIGH(1,NEXT) = (NLAT1-1)*NOLDLON + NLONG(1) + 1
+ NEIGH(2,NEXT) = NEIGH(1,NEXT) + 1
+C
+C Points 3 and 4
+C
+ NLONG( 3) = NLONG(1)
+C
+ NEIGH(3,NEXT) = (NLAT2-1)*NOLDLON + NLONG(3) + 1
+ NEIGH(4,NEXT) = NEIGH(3,NEXT) + 1
+C
+C Calculate zonal linear weights for the latitudes.
+C
+ PDLO1(NEXT) = (RLON(NEXT)-REAL(NLONG1-1)*PLONINC) / PLONINC
+ PDLO2(NEXT) = PDLO1(NEXT)
+C
+ KLA(NEXT) = NLAT1
+ PDLAT(NEXT) = (PLATIN(NLAT1,PLATINC)-RLAT(NEXT)) / PLATINC
+C
+ KSCHEME(NEXT) = JP4PT
+ GOTO 700
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 6. 12-point interpolation to be used.
+C -----------------------------------------------------------------|
+C
+ 600 CONTINUE
+C
+ KSCHEME(NEXT) = JP12PT
+C
+ KLA(NEXT) = NLAT1
+ PDLAT(NEXT) = (PLATIN(NLAT1,PLATINC)-RLAT(NEXT)) / PLATINC
+C
+C Northernmost
+C
+ NLAT(5) = NLAT0
+ NLAT(6) = NLAT0
+C
+C Northern
+C
+ NLAT(7) = NLAT1
+ NLAT(1) = NLAT1
+ NLAT(2) = NLAT1
+ NLAT(8) = NLAT1
+C
+C Southern
+C
+ NLAT( 9) = NLAT2
+ NLAT( 3) = NLAT2
+ NLAT( 4) = NLAT2
+ NLAT(10) = NLAT2
+C
+C Southernmost
+C
+ NLAT(11) = NLAT3
+ NLAT(12) = NLAT3
+C
+C Find longitude numbers for neighbours.
+C
+C Northernmost
+C
+ NLONG(5) = NUMLON(RLON(NEXT),PLONINC)
+ NLONG5 = NLONG(5)
+ IF( NLONG(5).GT.NOLDLON ) NLONG(5) = 1
+ NLONG(6) = NLONG(5) + 1
+ IF( NLONG(6).GT.NOLDLON ) NLONG(6) = 1
+C
+C Northern
+C
+ NLONG(1) = NLONG(5)
+ NLONG(7) = NLONG(1) - 1
+ IF( NLONG(7).LT.1 ) NLONG(7) = NOLDLON
+ NLONG(2) = NLONG(1) + 1
+ IF( NLONG(2).GT.NOLDLON ) NLONG(2) = 1
+ NLONG(8) = NLONG(2) + 1
+ IF( NLONG(8).GT.NOLDLON ) NLONG(8) = 1
+C
+C Southern
+C
+ NLONG( 3) = NLONG(1)
+ NLONG( 9) = NLONG(7)
+ NLONG( 4) = NLONG(2)
+ NLONG(10) = NLONG(8)
+C
+C Southernmost
+C
+ NLONG(11) = NLONG(5)
+ NLONG(12) = NLONG(11) + 1
+ IF( NLONG(12).GT.NOLDLON ) NLONG(12) = 1
+C
+C Calculate zonal linear weights for the latitudes.
+C
+ PDLO0(NEXT) = (RLON(NEXT)-REAL(NLONG5-1)*PLONINC) / PLONINC
+ PDLO1(NEXT) = PDLO0(NEXT)
+ PDLO2(NEXT) = PDLO0(NEXT)
+ PDLO3(NEXT) = PDLO0(NEXT)
+C
+C Store indices of the neighbours.
+C
+ DO LOOP = 1, 12
+ NEIGH(LOOP,NEXT) = NOLDLON*(NLAT(LOOP)-1) + NLONG(LOOP)
+ ENDDO
+C
+ 700 CONTINUE
+C
+ ENDDO
+C
+C End of loop along vector of points.
+C
+C -----------------------------------------------------------------|
+C Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hntfap.F b/interpolation/hntfap.F
new file mode 100755
index 0000000..74fd1c4
--- /dev/null
+++ b/interpolation/hntfap.F
@@ -0,0 +1,133 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HNTFAP(INGRIB,INLEN)
+C
+C---->
+C**** HNTFAP
+C
+C Purpose
+C -------
+C
+C Prepare to interpolate input field...
+C
+C
+C Interface
+C ---------
+C
+C IRET = HNTFAP(INGRIB,INLEN)
+C
+C Input
+C -----
+C
+C INGRIB - Input field (packed).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C Field unpacked values are in ZNFELDI, rotated if necessary.
+C
+C Returns: 0, if OK. Otherwise, an error occured in interpolation.
+C
+C
+C Method
+C ------
+C
+C Calls HNTFAPS to handle rotation when input and output fields
+C are both spectral.
+C
+C Calls HNTFAPH in all other cases.
+C
+C
+C Externals
+C ---------
+C
+C HNTFAPS - Handle rotation when input and output fields
+C are both spectral.
+C HNTFAPH - Handle rotation in all other cases.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 31, 2001
+C
+C
+C----<
+C
+C -----------------------------------------------------------------|
+C* Section 0. Variables
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 40100 )
+C
+C Function arguments
+C
+ INTEGER INGRIB(*),INLEN
+C
+C Local variables
+C
+ INTEGER IRET
+C
+C Externals
+C
+ INTEGER HNTFAPS, HNTFAPH
+ EXTERNAL HNTFAPS, HNTFAPH
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HNTFAP = 0
+C
+C -----------------------------------------------------------------|
+C* Section 2. Split handling in case there are rotations to do.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Is the interpolation from SH to SH?
+C
+ IF( ((NIREPR.EQ.JPSPHERE).OR.(NIREPR.EQ.JPSPHROT)) .AND.
+ X ((NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT)) ) THEN
+C
+ IRET = HNTFAPS(INGRIB,INLEN)
+C
+ ELSE
+C
+ IRET = HNTFAPH(INGRIB,INLEN)
+C
+ ENDIF
+C
+ IF( IRET.NE.0 ) HNTFAP = JPROUTINE
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hntfaph.F b/interpolation/hntfaph.F
new file mode 100755
index 0000000..ba3147f
--- /dev/null
+++ b/interpolation/hntfaph.F
@@ -0,0 +1,578 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HNTFAPH(INGRIB,INLEN)
+C
+C---->
+C**** HNTFAPH
+C
+C Purpose
+C -------
+C
+C Prepare to interpolate to grid point field.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HNTFAPH(INGRIB,INLEN)
+C
+C Input
+C -----
+C
+C INGRIB - Input field (packed).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C Field unpacked values are in ZNFELDI, rotated if necessary.
+C
+C Returns: 0, if OK. Otherwise, an error occured in interpolation.
+C
+C
+C Method
+C ------
+C
+C Unpack field.
+C
+C If the input is a spectral field and the output is a rotated
+C grid-point field, create a global reduced gaussian field and
+C then create the rotated grid-point field from it.
+C
+C
+C Externals
+C ---------
+C
+C GRIBEX - Decode/encode GRIB product.
+C GRSVCK - Turn off GRIB checking
+C INTLOG - Log error message.
+C INTLOGR - Log error message.
+C JDEBUG - Checks environment to switch on/off debug
+C FIXAREA - Fixup input/output field area definitions.
+C HSP2GG - Find suitable gaussian grid for spectral truncation
+C HIRLAM - Creates rotated lat/long field from reduced gaussian
+C HIRLSM - Creates rotated lat/long field from reduced gaussian
+C using land-sea mask
+C HRG2GG - Creates rotated gaussian field from reduced gaussian
+C HLL2LL - Creates rotated lat/long field from lat/long field
+C LSMFLD - Determines whether a field is to be interpolated using
+C a land-sea mask
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 31, 2001
+C
+C
+C----<
+C
+C -----------------------------------------------------------------|
+C* Section 0. Variables
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER INGRIB(*),INLEN
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+#include "jparams.h"
+#include "current.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 40110 )
+C
+C Local variables
+C
+ LOGICAL LUSELSM, LDEBUG, LSP2RGG, LLATOUT
+ INTEGER NUMPTS, NGAUSS, NLON, NLAT, NUVFLAG, NTRUNC, NCOUNT
+ INTEGER IWORD, IERR, LOOP, IRET, ISIZE, KPTS(JPGTRUNC*2)
+ INTEGER ISHIZE
+ INTEGER ITEMP,K,I,J,IM,JM
+ REAL PLATS(JPGTRUNC*2),AREA(4),GRID(2),POLE(2),WEST,EAST
+ REAL OLDGRID(2)
+ REAL TEMP(1440,1440)
+ CHARACTER*1 HOLDTYP
+C
+ REAL SWORK(1), RGGRID(1), ZNFLDO(1)
+#ifdef POINTER_64
+ INTEGER*8 ISWORK, IRGGRID, IZNFLDO
+#endif
+ POINTER ( ISWORK, SWORK)
+ POINTER ( IRGGRID, RGGRID)
+ POINTER ( IZNFLDO, ZNFLDO )
+C
+ SAVE IZNFLDO,ISWORK, IRGGRID
+C
+C Externals
+C
+ INTEGER HSP2GG, HIRLAM, HIRLSM, HRG2GG, HLL2LL, FIXAREA,PDDEFS
+ INTEGER HSP2GG2,HSP2GG3
+ LOGICAL LSMFLD
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HNTFAPH = 0
+C
+C Check if debug option turned on
+C
+ CALL JDEBUG()
+ LDEBUG = ( NDBG.NE.0 )
+C
+ LSP2RGG = .FALSE.
+C
+C -----------------------------------------------------------------|
+C* Section 2. Decode data from the GRIB code
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Decode data from GRIB code (no checking)
+C
+ IERR = 0
+ CALL GRSVCK(0)
+C
+ IERR = 1
+ IWORD = INLEN
+ ISEC3(2) = NINT(RMISSGV)
+ ZSEC3(2) = RMISSGV
+
+ CALL GRIBEX(ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X ZNFELDI, JPEXPAND, INGRIB, INLEN, IWORD, 'D',IERR)
+
+ IF (ISEC2(11).EQ.64) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'HNTFAPH: Scanning flag west-east/south-north',ISEC2(11))
+ ITEMP = NIAREA(1)
+ NIAREA(1) = NIAREA(3)
+ NIAREA(3) = ITEMP
+
+ IM = ISEC2(2)
+ JM = ISEC2(3)
+ K=0
+ DO J=JM,1,-1
+ DO I=1,IM
+ K=K+1
+ TEMP(I,J) = ZNFELDI(K)
+ END DO
+ END DO
+ K=0
+ DO J=1,JM
+ DO I=1,IM
+ K=K+1
+ ZNFELDI(K) = TEMP(I,J)
+ END DO
+ END DO
+
+ ENDIF
+
+C
+ IF( IERR.LT.0) THEN
+ IF( (IERR.EQ.-2).OR.(IERR.EQ.-4) ) THEN
+ CALL INTLOG(JP_DEBUG,'HNTFAPH: Use missing value',JPQUIET)
+ LIMISSV = .TRUE.
+ ELSE
+ CALL INTLOG(JP_ERROR,'HNTFAPH: GRIBEX decoding fail.',IERR)
+ HNTFAPH = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ ELSE IF( IERR.GT.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HNTFAPH: GRIBEX decoding failed.',IERR)
+ HNTFAPH = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ NCOUNT = ISEC4(1)
+C
+ LLATOUT = (NOREPR.EQ.JPREGROT).OR.(NOREPR.EQ.JPREGULAR)
+C
+ IF( .NOT.LNOROTA ) GOTO 900
+C
+C -----------------------------------------------------------------|
+C* Section 3. Handle rotation, if necessary.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'HNTFAPH: Rotate field.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'HNTFAPH: South pole lat ',NOROTA(1))
+ CALL INTLOG(JP_DEBUG,'HNTFAPH: South pole long ',NOROTA(2))
+ ENDIF
+C
+C Fill area limits (handles case when default 0/0/0/0 given)
+C
+ IRET = FIXAREA()
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAPH: area fixup failed',JPQUIET)
+ HNTFAPH = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+ AREA(1) = REAL(NOAREA(1))/PPMULT
+ AREA(2) = REAL(NOAREA(2))/PPMULT
+ AREA(3) = REAL(NOAREA(3))/PPMULT
+ AREA(4) = REAL(NOAREA(4))/PPMULT
+C
+ GRID(1) = REAL(NOGRID(1))/PPMULT
+ GRID(2) = REAL(NOGRID(2))/PPMULT
+C
+ POLE(1) = REAL(NOROTA(1))/PPMULT
+ POLE(2) = REAL(NOROTA(2))/PPMULT
+C
+C -----------------------------------------------------------------|
+C* Section 4. Spectral to rotated grid-point
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+
+ IF( (NIREPR.EQ.JPSPHERE).OR.(NIREPR.EQ.JPSPHROT) ) THEN
+C
+C Convert spectral to suitable global reduced gaussian grid
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'HNTFAPH: Spectral to suitable reduced gaussian',JPQUIET)
+C
+ NIRESO = ISEC2(2)
+ NTRUNC = ISEC2(2)
+ IF(LNORESO) THEN
+ NTRUNC = NORESO
+ IRET = HSP2GG(NTRUNC,NGAUSS,KPTS,PLATS,ISIZE)
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAPH: problem getting data for reduced grid',NTRUNC)
+ HNTFAPH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'HNTFAPH: Spectral truncation:', NTRUNC)
+ CALL INTLOG(JP_DEBUG,'HNTFAPH: Gaussian number : ',NGAUSS)
+ ENDIF
+ GOTO 401
+ ENDIF
+ IF(LARESOL ) THEN
+ IF(LLATOUT) THEN
+ IRET = HSP2GG2(NTRUNC,GRID(1),GRID(2),NGAUSS,KPTS,PLATS,ISIZE)
+ ELSE
+ IRET = HSP2GG3(NTRUNC,NGAUSS,KPTS,PLATS,ISIZE)
+ ENDIF
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAPH: problem getting data for reduced grid',NTRUNC)
+ HNTFAPH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+ ENDIF
+c---------------------------------------------------------------------
+C Truncate if a smaller resolution has been requested
+C
+ 401 CONTINUE
+ IF( NTRUNC.LT.NIRESO ) THEN
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'HNTFAPH: Truncation changed from: ',NIRESO)
+ CALL INTLOG(JP_DEBUG,'HNTFAPH: to: ',NTRUNC)
+ CALL INTLOG(JP_DEBUG,'HNTFAPH: Gaussian number is : ',NGAUSS)
+ ENDIF
+C
+ ISHIZE = (NTRUNC+1)*(NTRUNC+4)
+ CALL JMEMHAN( 3, IZNFLDO, ISHIZE, 1, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,
+ X 'HNTFAPH: Get scratch space failed',JPQUIET)
+ HNTFAPH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+C Generate spherical harmonics with output truncation
+C
+ CALL SH2SH( ZNFELDI, NIRESO, ZNFLDO, NTRUNC )
+C
+C Move new spherical harmonics to 'input' array
+C
+ DO LOOP = 1, ISHIZE
+ ZNFELDI(LOOP) = ZNFLDO(LOOP)
+ ENDDO
+
+ ELSE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'HNTFAPH: Spectral to suitable reduced gaussian',JPQUIET)
+C
+ NTRUNC = ISEC2(2)
+ IRET = HSP2GG(NTRUNC,NGAUSS,KPTS,PLATS,ISIZE)
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAPH: problem getting data for reduced grid',NTRUNC)
+ HNTFAPH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'HNTFAPH: Spectral truncation:', NTRUNC)
+ CALL INTLOG(JP_DEBUG,'HNTFAPH: Gaussian number : ',NGAUSS)
+ ENDIF
+ ENDIF
+C
+C Dynamically allocate memory for global reduced gaussian grid
+C
+ CALL JMEMHAN( 18, IRGGRID, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAPH: memory alloc for reduced grid fail',JPQUIET)
+ HNTFAPH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+C Set flag to show field is not a wind component
+C
+ NUVFLAG = 0
+C
+C Create the reduced gaussian grid
+C
+ HOLDTYP = HOGAUST
+ WEST = 0.0
+ EAST = 360.0 - (360.0/(NGAUSS*4))
+ CALL JAGGGP(ZNFELDI,NTRUNC,PLATS(1),PLATS(NGAUSS*2),WEST,
+ X EAST,NGAUSS,'R',KPTS,RGGRID,NUVFLAG,IRET)
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAPH: spectral to reduced gaussian failed',JPQUIET)
+ HNTFAPH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+ HOGAUST = HOLDTYP
+C
+ NCOUNT = 0
+ DO LOOP = 1, (NGAUSS*2)
+ NCOUNT= NCOUNT + KPTS(LOOP)
+ ENDDO
+C
+ LSP2RGG = .TRUE.
+C
+ IF( NOREPR.EQ.JPFGGROT ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'HNTFAPH: Convert gaussian to rotated gaussian',JPQUIET)
+C
+ GOTO 600
+C
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 5. Gaussian to rotated lat/long
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+ IF( (LSP2RGG.AND.LLATOUT) .OR.
+ X ( (NIREPR.EQ.JPGAUSSIAN).AND.LLATOUT) .OR.
+ X ( (NIREPR.EQ.JPQUASI).AND.LLATOUT) ) THEN
+C
+ IF( LDEBUG )
+ X CALL INTLOG(JP_DEBUG,'HNTFAPH: Gauss to lat/lon',JPQUIET)
+C
+C Dynamically allocate memory for rotated lat/long grid
+C
+ NLON = 1 + NINT((AREA(JPEAST) - AREA(JPWEST)) /
+ X GRID(JPWESTEP)) !SC
+ NLAT = 1 + NINT((AREA(JPNORTH) - AREA(JPSOUTH)) /
+ X GRID(JPNSSTEP)) !SC
+C
+ NOWE = NLON
+ NONS = NLAT
+C
+ NUMPTS = NLON * NLAT
+ ISIZE = NUMPTS
+ CALL JMEMHAN( 11, ISWORK, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAPH: memory alloc for lat/long grid fail',JPQUIET)
+ HNTFAPH = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+C
+ LUSELSM = LSMFLD()
+C
+C If original field was spectral, ...
+C
+ IF( LSP2RGG ) THEN
+ IF( LUSELSM ) THEN
+ IRET = HIRLSM(LO12PT,RGGRID,NCOUNT,NGAUSS,AREA,POLE,GRID,
+ X SWORK,ISIZE,NLON,NLAT)
+ ELSE
+ IRET = HIRLAM(LO12PT,RGGRID,NCOUNT,NGAUSS,AREA,POLE,GRID,
+ X SWORK,ISIZE,NLON,NLAT)
+ ENDIF
+C
+ ELSE
+C
+C If original field was gaussian, ...
+C
+ IRET = PDDEFS()
+ NGAUSS = ISEC2(10)
+cs IF( LUSELSM ) THEN
+ IF( LSM ) THEN
+ IRET = HIRLSM(LO12PT,ZNFELDI,NCOUNT,NGAUSS,AREA,POLE,GRID,
+ X SWORK,ISIZE,NLON,NLAT)
+ ELSE
+ IRET = HIRLAM(LO12PT,ZNFELDI,NCOUNT,NGAUSS,AREA,POLE,GRID,
+ X SWORK,ISIZE,NLON,NLAT)
+ ENDIF
+C
+ ENDIF
+C
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAPH: HIRLAM rotation failed',JPQUIET)
+ HNTFAPH = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+C
+ ISEC2(1) = JPREGROT
+ ISEC4(1) = NOWE * NONS
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 6. Gaussian to rotated gaussian
+C -----------------------------------------------------------------|
+C
+ 600 CONTINUE
+C
+ IF( (LSP2RGG.AND.(NOREPR.EQ.JPFGGROT)) .OR.
+ X (LSP2RGG.AND.(NOREPR.EQ.JPQGGROT)) .OR.
+ X (((NIREPR.EQ.JPQUASI).OR.(NIREPR.EQ.JPGAUSSIAN)) .AND.
+ X (NOREPR.EQ.JPFGGROT).OR.(NOREPR.EQ.JPQGGROT)) ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'HNTFAPH: Gaussian to reduced gaussian',JPQUIET)
+C
+C Dynamically allocate memory for rotated lat/long grid
+C
+ ISIZE = NOGAUSS * NOGAUSS * 8
+ CALL JMEMHAN( 11, ISWORK, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAPH: memory alloc for gaussian grid fail',JPQUIET)
+ HNTFAPH = JPROUTINE + 8
+ GOTO 900
+ ENDIF
+C
+C If original field was spectral, ...
+C
+ IF( LSP2RGG ) THEN
+ IRET = HRG2GG(LO12PT,RGGRID,NGAUSS,AREA,POLE,
+ X NOGAUSS,HOGAUST,SWORK,ISIZE,NUMPTS)
+C
+ ELSE
+C
+C If original field was gaussian, ...
+C
+ NGAUSS = ISEC2(10)
+ IRET = HRG2GG(LO12PT,ZNFELDI,NGAUSS,AREA,POLE,
+ X NOGAUSS,HOGAUST,SWORK,ISIZE,NUMPTS)
+ ENDIF
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAPH: HRG2GG rotation failed',JPQUIET)
+ HNTFAPH = JPROUTINE + 8
+ GOTO 900
+ ENDIF
+C
+ IF( (NOREPR.EQ.JPQUASI).OR.
+ X (NOREPR.EQ.JPQGGROT).OR.
+ X (NOREPR.EQ.JPFGGROT).OR.
+ X (NOREPR.EQ.JPGAUSSIAN) ) THEN
+ ISEC2(1) = JPFGGROT
+ ELSE
+ ISEC2(1) = NOREPR
+ ENDIF
+C
+ ISEC4(1) = NUMPTS
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 7. Lat/long to rotated lat/long
+C -----------------------------------------------------------------|
+C
+ 700 CONTINUE
+C
+ IF( (NIREPR.EQ.JPREGULAR) ) THEN
+C
+C Dynamically allocate memory for rotated lat/long grid
+C
+ NLON = 1 + NINT((AREA(JPEAST) - AREA(JPWEST)) /
+ X GRID(JPWESTEP))
+ NLAT = 1 + NINT((AREA(JPNORTH) - AREA(JPSOUTH)) /
+ X GRID(JPNSSTEP))
+C
+ NOWE = NLON
+ NONS = NLAT
+C
+ NUMPTS = NLON * NLAT
+ ISIZE = NUMPTS
+ CALL JMEMHAN( 11, ISWORK, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAPH: memory alloc for lat/long grid fail',JPQUIET)
+ HNTFAPH = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+C
+ OLDGRID(1) = REAL(NIGRID(1))/100000.0
+ OLDGRID(2) = REAL(NIGRID(2))/100000.0
+ IRET = HLL2LL(LO12PT,ZNFELDI,OLDGRID,AREA,POLE,GRID,SWORK,ISIZE,
+ X NLON,NLAT)
+C
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAPH: HLL2LL rotation failed',JPQUIET)
+ HNTFAPH = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+C
+ ISEC2(1) = JPREGROT
+ ISEC4(1) = NOWE * NONS
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 8. Move rotated field back into field original array.
+C -----------------------------------------------------------------|
+C
+ 800 CONTINUE
+C
+ DO LOOP = 1, NUMPTS
+ ZNFELDI(LOOP) = SWORK(LOOP)
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hntfaps.F b/interpolation/hntfaps.F
new file mode 100755
index 0000000..ddccd50
--- /dev/null
+++ b/interpolation/hntfaps.F
@@ -0,0 +1,463 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HNTFAPS(INGRIB,INLEN)
+C
+C---->
+C**** HNTFAPS
+C
+C Purpose
+C -------
+C
+C Prepare to interpolate input spectral field.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HNTFAPS(INGRIB,INLEN)
+C
+C Input
+C -----
+C
+C INGRIB - Input field (packed).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C Field unpacked values are in ZNFELDI, rotated if necessary.
+C
+C Returns: 0, if OK. Otherwise, an error occured in rotation.
+C
+C
+C Method
+C ------
+C
+C Unpack field.
+C
+C Rotate the field values if necessary.
+C
+C Some rotation coefficients cannot be created because the
+C algorithm does not converge for rotations which are smaller
+C than a limit which depends on the spectral truncation.
+C
+C If the rotation is too small, it has to be split into three
+C steps (two forward and one backward).
+C
+C Current know limits are:
+C
+C Truncation Max South pole lat Minimum rotation
+C ---------- ------------------ ----------------
+C 63 -89.5 0.5
+C 106 -85 5.0
+C 159 -77 13.0
+C 213 -68 22.0
+C 319 -51 39.0
+C 511 -30.5 59.5
+C
+C
+C Externals
+C ---------
+C
+C GRIBEX - Decode/encode GRIB product.
+C GRSVCK - Turn off GRIB checking
+C INTLOG - Log error message.
+C INTLOGR - Log error message.
+C RPHI - Rotate a spectral field by longitude.
+#ifdef __uxp__
+C JACOBIF - Rotates spectral coefficients by latitude.
+#else
+C JACOBI - Rotates spectral coefficients by latitude.
+#endif
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 31, 2001
+C
+C
+C----<
+C
+C -----------------------------------------------------------------|
+C* Section 0. Variables
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER INGRIB(*),INLEN
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 40120 )
+ INTEGER JPLEN, JPNM
+ PARAMETER ( JPNM = JPSTRUNC )
+ PARAMETER ( JPLEN = (JPNM+1)*(JPNM+6) )
+C
+C Local variables
+C
+ REAL POLELAT, POLELON
+ CHARACTER*1 TYPE
+ INTEGER IWORD, IERR, KPR
+ INTEGER NUMPTS, NGAUSS
+ INTEGER ISIZE, NBYTES, ITRUNC, LOOP, IRET
+ DATA ISIZE/0/
+C
+ REAL SWORK
+ DIMENSION SWORK(1)
+#ifdef POINTER_64
+ INTEGER*8 ISWORK
+#endif
+ POINTER ( ISWORK, SWORK)
+C
+ REAL*8 DWORK
+ DIMENSION DWORK(1)
+#ifdef POINTER_64
+ INTEGER*8 IDWORK
+#endif
+ POINTER ( IDWORK, DWORK)
+C
+ REAL*8 DATA
+ DIMENSION DATA(1)
+#ifdef POINTER_64
+ INTEGER*8 IDATA
+#endif
+ POINTER ( IDATA, DATA)
+C
+ SAVE ISIZE, ISWORK, IDWORK, IDATA
+C
+ REAL*8 DLON, DLAT, LATLIM
+ LOGICAL LOK, LSPLIT
+#ifdef CRAY
+ DATA NBYTES/8/
+#else
+ DATA NBYTES/4/
+#endif
+C
+C Externals
+C
+#ifdef __uxp__
+ LOGICAL JACOBIF
+ EXTERNAL JACOBIF
+#else
+ LOGICAL JACOBI
+ EXTERNAL JACOBI
+#endif
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+ HNTFAPS = 0
+ IERR = 0
+ KPR = 0
+C
+C -----------------------------------------------------------------|
+C* Section 2. Decode data from the GRIB code
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Decode data from GRIB code (no checking)
+C
+ IWORD = INLEN
+ IERR = 0
+ CALL GRSVCK(0)
+ IERR = 1
+ ISEC3(2) = NINT(RMISSGV)
+ ZSEC3(2) = RMISSGV
+ CALL GRIBEX(ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X ZNFELDI, JPEXPAND, INGRIB, INLEN, IWORD, 'D',IERR)
+C
+ IF( IERR.LT.0) THEN
+ IF( (IERR.EQ.-2).OR.(IERR.EQ.-4) ) THEN
+ CALL INTLOG(JP_DEBUG,'HNTFAPS: Use missing value',JPQUIET)
+ LIMISSV = .TRUE.
+ ELSE
+ CALL INTLOG(JP_ERROR,'HNTFAPS: GRIBEX decoding fail.',IERR)
+ HNTFAPS = IERR
+ GOTO 900
+ ENDIF
+ ELSE IF( IERR.GT.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HNTFAPS: GRIBEX decoding failed.',IERR)
+ HNTFAPS = IERR
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Handle rotation, if necessary.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Is a rotation of the SH required?
+C
+ IF( LNOROTA ) THEN
+C
+C Avoid rotating U or V spectral coefficients
+C
+ IF( (NIPARAM.EQ.JP_U).OR.(NIPARAM.EQ.JP_V) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAPS: Unable to rotate spectral U or V:',NIPARAM)
+ HNTFAPS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C Dynamically allocate memory for workspace.
+C
+C (Note the multiplication by 2 for REAL*8).
+C
+ ISIZE = (2*(JPNM+1)*(JPNM+6))*2
+ CALL JMEMHAN( 11, IDWORK, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HNTFAPS: memory allocation fail',IDWORK)
+ HNTFAPS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C (Note the multiplication by 2 for REAL*8).
+C
+ ISIZE = JPLEN*2
+ CALL JMEMHAN( 15, IDATA, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HNTFAPS: memory allocation fail',IDATA)
+ HNTFAPS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+ CALL INTLOG(JP_DEBUG,'HNTFAPS: Rotate SH field.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'HNTFAPS: South pole latitude ',NOROTA(1))
+ CALL INTLOG(JP_DEBUG,'HNTFAPS: South pole longitude ',NOROTA(2))
+ IF ( NOREPR.EQ.JPSPHERE ) NOREPR = JPSPHROT
+ IF ( NOREPR.EQ.JPREGULAR ) NOREPR = JPREGROT
+ ITRUNC = ISEC2(2)
+C
+C Some rotation coefficients cannot be created because the
+C algorithm does not converge for rotations which are smaller
+C than a limit which depends on the spectral truncation.
+C
+ IF( ITRUNC.LE.63 ) THEN
+ LATLIM = -89.5
+ ELSE IF( ITRUNC.LE.106 ) THEN
+ LATLIM = -85.0
+ ELSE IF( ITRUNC.LE.159 ) THEN
+ LATLIM = -77.0
+ ELSE IF( ITRUNC.LE.213 ) THEN
+ LATLIM = -68.0
+ ELSE IF( ITRUNC.LE.319 ) THEN
+ LATLIM = -51.0
+ ELSE IF( ITRUNC.LE.511 ) THEN
+#ifdef __uxp__
+ LATLIM = -30.5
+#else
+ LATLIM = -29.5
+#endif
+ ELSE
+ HNTFAPS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ CALL INTLOGR(JP_DEBUG,
+ X 'HNTFAPS: South pole latitude limit = ',LATLIM)
+C
+ POLELAT = (REAL(NOROTA(1))/JPMULT)
+C
+C If the rotation is too small, it has to be split into three
+C steps (two forward and one backward).
+C
+ LSPLIT = POLELAT.LT.LATLIM
+ IF( LSPLIT ) THEN
+ DLAT = -90.0 - LATLIM
+ CALL INTLOG(JP_DEBUG,
+ X 'HNTFAPS: Rotation has been split into three steps',JPQUIET)
+ ELSE
+ DLAT = -90.0 - POLELAT
+ ENDIF
+#if (defined CRAY) || (defined REAL_8)
+C
+C Double precision REALs
+C
+ DLON = - REAL(NOROTA(2))/JPMULT
+C
+C Rotate the spectral field by longitude.
+C
+ CALL RPHI( ZNFELDI, ITRUNC, DWORK, DLON)
+C
+C Rotate the spectral field by latitude.
+C
+ IF( LSPLIT ) THEN
+C
+C Two rotations forward ..
+C
+ CALL INTLOGR(JP_DEBUG,
+ X 'HNTFAPS: Twice forward through angle ', DLAT)
+#if (!defined __uxp__)
+ LOK = JACOBI(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAPS: Spectral rotation failed',JPQUIET)
+ HNTFAPS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ LOK = JACOBI(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAPS: Spectral rotation failed',JPQUIET)
+ HNTFAPS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#else
+ LOK = JACOBIF(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAPS: Spectral rotation failed',JPQUIET)
+ HNTFAPS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ LOK = JACOBIF(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAPS: Spectral rotation failed',JPQUIET)
+ HNTFAPS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#endif
+C
+C .. and one backward
+C
+ DLAT = -90.0 - ( (LATLIM*2.0) - POLELAT)
+ DLAT= -DLAT
+ CALL INTLOGR(JP_DEBUG,
+ X 'HNTFAPS: Once backward through angle ', DLAT)
+ ENDIF
+C
+#if (!defined __uxp__)
+ LOK = JACOBI( ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAPS: Spectral rotation failed',JPQUIET)
+ HNTFAPS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#else
+ LOK = JACOBIF(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAPS: Spectral rotation failed',JPQUIET)
+ HNTFAPS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#endif
+#else
+C
+C Single precision REALs; so convert to double precision.
+C
+ DLAT = -90.0 - DBLE(NOROTA(1))/JPMULT
+ DLON = - DBLE(NOROTA(2))/JPMULT
+C
+C Expand spectral coefficients to REAL*8
+C
+ DO LOOP = 1, ISEC4(1)
+ DATA(LOOP) = DBLE(ZNFELDI(LOOP))
+ ENDDO
+C
+C Rotate the spectral field by longitude.
+ CALL RPHI( DATA, ITRUNC, DWORK, DLON)
+C
+C Rotate the spectral field by latitude.
+C
+ IF( LSPLIT ) THEN
+C
+C Two rotations forward ..
+C
+ CALL INTLOGR(JP_DEBUG,
+ X 'HNTFAPS: Twice forward through angle ', DLAT)
+#if (!defined __uxp__)
+ LOK = JACOBI(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAPS: Spectral rotation failed',JPQUIET)
+ HNTFAPS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ LOK = JACOBI(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAPS: Spectral rotation failed',JPQUIET)
+ HNTFAPS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#else
+ LOK = JACOBIF(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAPS: Spectral rotation failed',JPQUIET)
+ HNTFAPS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ LOK = JACOBIF(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAPS: Spectral rotation failed',JPQUIET)
+ HNTFAPS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#endif
+C
+C .. and one backward
+C
+ DLAT = -90.0 - ( (LATLIM*2.0) - POLELAT)
+ DLAT= -DLAT
+ CALL INTLOGR(JP_DEBUG,
+ X 'HNTFAPS: Once backward through angle ', DLAT)
+ ENDIF
+C
+#if (!defined __uxp__)
+ LOK = JACOBI( DATA, ITRUNC, DWORK, DLAT)
+#else
+ LOK = JACOBIF(DATA, ITRUNC, DWORK, DLAT)
+#endif
+#endif
+C
+ IF( .NOT.LOK ) THEN
+ CALL INTLOG(JP_ERROR,'HNTFAPS: Rotation failed',JPQUIET)
+ HNTFAPS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#if (!defined CRAY) && (!defined REAL_8)
+C
+C Single precision REALs; repack spectral coefficients to REAL*4.
+C
+ DO LOOP = 1, ISEC4(1)
+ ZNFELDI(LOOP) = SNGL(DATA(LOOP))
+ ENDDO
+#endif
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hntfau.F b/interpolation/hntfau.F
new file mode 100755
index 0000000..a9b4f2a
--- /dev/null
+++ b/interpolation/hntfau.F
@@ -0,0 +1,137 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HNTFAU(INGRIB,INLEN)
+C
+C---->
+C**** HNTFAU
+C
+C Purpose
+C -------
+C
+C Prepare to interpolate input field...
+C
+C
+C Interface
+C ---------
+C
+C IRET = HNTFAU(INGRIB,INLEN)
+C
+C Input
+C -----
+C
+C INGRIB - Input field (unpacked).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C Field unpacked values are in ZNFELDI, rotated if necessary.
+C
+C Returns: 0, if OK. Otherwise, an error occured in interpolation.
+C
+C
+C Method
+C ------
+C
+C Calls HNTFAUS to handle rotation when input and output fields
+C are both spectral.
+C
+C Calls HNTFAUH in all other cases.
+C
+C
+C Externals
+C ---------
+C
+C HNTFAUS - Handle rotation when input and output fields
+C are both spectral.
+C HNTFAUH - Handle rotation in all other cases.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 31, 2001
+C
+C
+C----<
+C
+C -----------------------------------------------------------------|
+C* Section 0. Variables
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 40130 )
+C
+C Function arguments
+C
+ INTEGER INGRIB(*),INLEN
+C
+C Local variables
+C
+ INTEGER IRET
+C
+C Externals
+C
+ INTEGER HNTFAUS, HNTFAUH
+ EXTERNAL HNTFAUS, HNTFAUH
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HNTFAU = 0
+C
+C -----------------------------------------------------------------|
+C* Section 2. Split handling in case there are rotations to do.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Is the interpolation from SH to SH?
+C
+ IF( ((NIREPR.EQ.JPSPHERE).OR.(NIREPR.EQ.JPSPHROT)) .AND.
+ X ((NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT)) ) THEN
+C
+ IRET = HNTFAUS(INGRIB,INLEN)
+C
+ ELSE
+C
+ IF( LIMISSA ) THEN
+ CALL INTLOG(JP_DEBUG,'HNTFAU: Use missing value',JPQUIET)
+ LIMISSV = .TRUE.
+ ENDIF
+ IRET = HNTFAUH(INGRIB,INLEN)
+C
+ ENDIF
+C
+ IF( IRET.NE.0 ) HNTFAU = JPROUTINE
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hntfauh.F b/interpolation/hntfauh.F
new file mode 100755
index 0000000..d66141f
--- /dev/null
+++ b/interpolation/hntfauh.F
@@ -0,0 +1,530 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HNTFAUH(FLDIN,INLEN)
+C
+C---->
+C**** HNTFAUH
+C
+C Purpose
+C -------
+C
+C Prepare to interpolate input field...
+C
+C
+C Interface
+C ---------
+C
+C IRET = HNTFAUH( FLDIN,INLEN)
+C
+C Input
+C -----
+C
+C FLDIN - Input field (unpacked).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C Field unpacked values are in ZNFELDI, rotated if necessary.
+C
+C Returns: 0, if OK. Otherwise, an error occured in interpolation.
+C
+C
+C Method
+C ------
+C
+C If the input is a spectral field and the output is a rotated
+C grid-point field, create a global reduced gaussian field and
+C then create the rotated grid-point field from it.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C INTLOGR - Log error message.
+C JDEBUG - Checks environment to switch on/off debug
+C FIXAREA - Fixup input/output field area definitions.
+C HSP2GG - Find suitable gaussian grid for spectral truncation
+C HIRLAM - Creates rotated lat/long field from reduced gaussian
+C HIRLSM - Creates rotated lat/long field from reduced gaussian
+C using a land-sea mask
+C HRG2GG - Creates rotated gaussian field from reduced gaussian
+C LSMFLD - Determines whether a field is to be interpolated using
+C a land-sea mask
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF February 2001
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER INLEN
+ REAL FLDIN(*)
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+#include "jparams.h"
+#include "current.h"
+#include "intlog.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 40150 )
+ INTEGER JPLEN, JPNM
+ PARAMETER ( JPNM = JPSTRUNC )
+ PARAMETER ( JPLEN = (JPNM+1)*(JPNM+2) )
+C
+C Local variables
+C
+ LOGICAL LUSELSM, LLATOUT, LSP2RGG
+ INTEGER NUMPTS, NGAUSS, NLON, NLAT, NUVFLAG, NTRUNC, NCOUNT
+ INTEGER IWORD, IERR, LOOP, IRET, ISIZE, KPTS(JPGTRUNC*2)
+ INTEGER ITEMP,K,I,J,IM,JM
+ INTEGER ISHIZE
+ REAL PLATS(JPGTRUNC*2),AREA(4),GRID(2),POLE(2),WEST,EAST
+ REAL TEMP(1440,1440)
+ CHARACTER*1 HOLDTYP
+C
+ REAL SWORK(1), RGGRID(1), ZNFLDO(1)
+#ifdef POINTER_64
+ INTEGER*8 ISWORK, IRGGRID, IZNFLDO
+#endif
+ POINTER ( ISWORK, SWORK)
+ POINTER ( IRGGRID, RGGRID)
+ POINTER ( IZNFLDO, ZNFLDO )
+C
+ SAVE ISWORK, IRGGRID, IZNFLDO
+C
+C Externals
+C
+ INTEGER HSP2GG, HIRLAM, HIRLSM, HRG2GG, FIXAREA, PDDEFS
+ INTEGER HSP2GG2,HSP2GG3
+ LOGICAL LSMFLD
+C
+ REAL POLELAT, POLELON
+ CHARACTER*1 TYPE
+ INTEGER NBYTES, ITRUNC
+ DATA ISIZE/0/
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HNTFAUH = 0
+ IRET = 0
+C
+ NCOUNT = INLEN
+C
+C -----------------------------------------------------------------|
+C* Section 2. Store input data.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Allocate work array ZNFELDI if not already done.
+C
+ IF( IZNJDCI.NE.1952999238 ) THEN
+ CALL JMEMHAN( 19, IZNFLDI, JPEXPAND, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_WARN,'HNTFAUH: ZNFELDI allocate fail',JPQUIET)
+ HNTFAUH = IRET
+ GOTO 900
+ ENDIF
+ IZNJDCI = 1952999238
+ ENDIF
+C
+C Move unpacked values in from user array
+C
+ DO LOOP = 1, INLEN
+ ZNFELDI( LOOP ) = FLDIN( LOOP )
+ ENDDO
+ IF (NISCNM.EQ.64) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'HNTFAUH: Scanning flag west-east/south-north',NISCNM)
+ ITEMP = NIAREA(1)
+ NIAREA(1) = NIAREA(3)
+ NIAREA(3) = ITEMP
+
+ IM = NIWE
+ JM = NINS
+ K=0
+ DO J=JM,1,-1
+ DO I=1,IM
+ K=K+1
+ TEMP(I,J) = ZNFELDI(K)
+ END DO
+ END DO
+ K=0
+ DO J=1,JM
+ DO I=1,IM
+ K=K+1
+ ZNFELDI(K) = TEMP(I,J)
+ END DO
+ END DO
+
+ ENDIF
+C
+ LLATOUT = (NOREPR.EQ.JPREGROT).OR.(NOREPR.EQ.JPREGULAR)
+C -----------------------------------------------------------------|
+C* Section 3. Handle rotation, if necessary.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Is rotation required?
+C
+ IF( LNOROTA ) THEN
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'HNTFAUH: Rotate field.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'HNTFAUH: South pole lat ',NOROTA(1))
+ CALL INTLOG(JP_DEBUG,'HNTFAUH: South pole long ',NOROTA(2))
+ ENDIF
+C
+C Fill area limits (handles case when default 0/0/0/0 given)
+C
+ IRET = FIXAREA()
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAUH: area fixup failed',JPQUIET)
+ HNTFAUH = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+ AREA(1) = REAL(NOAREA(1))/PPMULT
+ AREA(2) = REAL(NOAREA(2))/PPMULT
+ AREA(3) = REAL(NOAREA(3))/PPMULT
+ AREA(4) = REAL(NOAREA(4))/PPMULT
+C
+ GRID(1) = REAL(NOGRID(1))/PPMULT
+ GRID(2) = REAL(NOGRID(2))/PPMULT
+C
+ POLE(1) = REAL(NOROTA(1))/PPMULT
+ POLE(2) = REAL(NOROTA(2))/PPMULT
+C
+C -----------------------------------------------------------------|
+C* Section 4. Spectral to rotated grid-point
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ LSP2RGG = .FALSE.
+ IF( (NIREPR.EQ.JPSPHERE).OR.(NIREPR.EQ.JPSPHROT) ) THEN
+C
+C Convert spectral to suitable global reduced gaussian grid
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'HNTFAUH: Spectral to suitable reduced gaussian',JPQUIET)
+C
+ NTRUNC = NIRESO
+c---------------------------------------------------------------------
+ IF(LNORESO) THEN
+ NTRUNC = NORESO
+ IRET = HSP2GG(NTRUNC,NGAUSS,KPTS,PLATS,ISIZE)
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAUH: problem getting data for reduced grid',NTRUNC)
+ HNTFAUH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'HNTFAUH: Spectral truncation:', NTRUNC)
+ CALL INTLOG(JP_DEBUG,'HNTFAUH: Gaussian number : ',NGAUSS)
+ ENDIF
+ GOTO 401
+ ENDIF
+
+ IF(LARESOL ) THEN
+ IF(LLATOUT) THEN
+ IRET = HSP2GG2(NTRUNC,GRID(1),GRID(2),NGAUSS,KPTS,PLATS,ISIZE)
+ ELSE
+ IRET = HSP2GG3(NTRUNC,NGAUSS,KPTS,PLATS,ISIZE)
+ ENDIF
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAUH: problem getting data for reduced grid',NTRUNC)
+ HNTFAUH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+ ENDIF
+c---------------------------------------------------------------------
+cs IRET = HSP2GG(NTRUNC,NGAUSS,KPTS,PLATS,ISIZE)
+cs IF( IRET.NE.0 ) THEN
+cs IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+cs X 'HNTFAUH: problem getting data for reduced gridl',NTRUNC)
+cs HNTFAUH = JPROUTINE + 4
+cs GOTO 900
+cs ENDIF
+
+cs NCOUNT = ISIZE
+c---------------------------------------------------------------------
+C Truncate if a smaller resolution has been requested
+C
+ 401 CONTINUE
+ IF( NTRUNC.LT.NIRESO ) THEN
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'HNTFAUH: Truncation changed from: ',NIRESO)
+ CALL INTLOG(JP_DEBUG,'HNTFAUH: to: ',NTRUNC)
+ CALL INTLOG(JP_DEBUG,'HNTFAUH: Gaussian number is : ',NGAUSS)
+ ENDIF
+C
+ ISHIZE = (NTRUNC+1)*(NTRUNC+4)
+ CALL JMEMHAN( 3, IZNFLDO, ISHIZE, 1, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,
+ X 'HNTFAUH: Get scratch space failed',JPQUIET)
+ HNTFAUH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+C Generate spherical harmonics with output truncation
+C
+ CALL SH2SH( ZNFELDI, NIRESO, ZNFLDO, NTRUNC )
+C
+C Move new spherical harmonics to 'input' array
+C
+ DO LOOP = 1, ISHIZE
+ ZNFELDI(LOOP) = ZNFLDO(LOOP)
+ ENDDO
+
+ ELSE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'HNTFAUH: Spectral to suitable reduced gaussian',JPQUIET)
+C
+ NTRUNC = NIRESO
+ IRET = HSP2GG(NTRUNC,NGAUSS,KPTS,PLATS,ISIZE)
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAUH: problem getting data for reduced grid',NTRUNC)
+ HNTFAUH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'HNTFAUH: Spectral truncation:', NTRUNC)
+ CALL INTLOG(JP_DEBUG,'HNTFAUH: Gaussian number : ',NGAUSS)
+ ENDIF
+ ENDIF
+c---------------------------------------------------------------------
+C
+C Dynamically allocate memory for global reduced gaussian grid
+C
+ CALL JMEMHAN( 18, IRGGRID, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAUH: memory alloc for reduced grid fail',JPQUIET)
+ HNTFAUH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+C Set flag to show field is not a wind component
+C
+ NUVFLAG = 0
+C
+C Create the reduced gaussian grid
+C
+ HOLDTYP = HOGAUST
+ WEST = 0.0
+ EAST = 360.0 - (360.0/(NGAUSS*4))
+ CALL JAGGGP(ZNFELDI,NTRUNC,PLATS(1),PLATS(NGAUSS*2),WEST,
+ X EAST,NGAUSS,'R',KPTS,RGGRID,NUVFLAG,IRET)
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAUH: spectral to reduced gaussian failed',JPQUIET)
+ HNTFAUH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+ HOGAUST = HOLDTYP
+
+ NCOUNT = 0
+ DO LOOP = 1, (NGAUSS*2)
+ NCOUNT= NCOUNT + KPTS(LOOP)
+ ENDDO
+C
+ LSP2RGG = .TRUE.
+C
+C -----------------------------------------------------------------|
+C* Section 5. Complete the spectral to rotated lat/long
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+ IF( NOREPR.EQ.JPREGROT ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'HNTFAUH: Convert gaussian to rotated lat/long',JPQUIET)
+C
+ GOTO 700
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 6. Complete the spectral to rotated gaussian
+C -----------------------------------------------------------------|
+C
+ 600 CONTINUE
+C
+ IF( NOREPR.EQ.JPFGGROT ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'HNTFAUH: Convert gaussian to rotated gaussian',JPQUIET)
+C
+ GOTO 800
+ ENDIF
+
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 7. Gaussian to rotated lat/long
+C -----------------------------------------------------------------|
+C
+ 700 CONTINUE
+C
+ IF( (LSP2RGG.AND.(NOREPR.EQ.JPREGROT)) .OR.
+ X ( ((NIREPR.EQ.JPQUASI).OR.(NIREPR.EQ.JPGAUSSIAN)) .AND.
+ X (NOREPR.EQ.JPREGROT) ) ) THEN
+ IF( LDEBUG )
+ X CALL INTLOG(JP_DEBUG,'HNTFAUH: Gauss to lat/lon',JPQUIET)
+C
+C Dynamically allocate memory for rotated lat/long grid
+C
+ NLON = 1 + NINT(FLOAT((NOAREA(JPEAST) - NOAREA(JPWEST))) /
+ X NOGRID(JPWESTEP))
+ NLAT = 1 + NINT(FLOAT((NOAREA(JPNORTH) - NOAREA(JPSOUTH))) /
+ X NOGRID(JPNSSTEP))
+C
+ NUMPTS = NLON * NLAT
+ ISIZE = NUMPTS
+ CALL JMEMHAN( 11, ISWORK, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAUH: memory alloc for lat/long grid fail',JPQUIET)
+ HNTFAUH = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+C
+ LUSELSM = LSMFLD()
+C
+C If original field was spectral, ...
+C
+ IF( LSP2RGG ) THEN
+ IF( LUSELSM ) THEN
+ IRET = HIRLSM(LO12PT,RGGRID,NCOUNT,NGAUSS,AREA,POLE,GRID,
+ X SWORK,ISIZE,NLON,NLAT)
+ ELSE
+ IRET = HIRLAM(LO12PT,RGGRID,NCOUNT,NGAUSS,AREA,POLE,GRID,
+ X SWORK,ISIZE,NLON,NLAT)
+ ENDIF
+C
+ ELSE
+C
+C If original field was gaussian, ...
+C
+ IRET = PDDEFS()
+ NGAUSS = NIGAUSS
+cs IF( LUSELSM ) THEN
+ IF( LSM ) THEN
+ IRET = HIRLSM(LO12PT,ZNFELDI,NCOUNT,NGAUSS,AREA,POLE,GRID,
+ X SWORK,ISIZE,NLON,NLAT)
+ ELSE
+ IRET = HIRLAM(LO12PT,ZNFELDI,NCOUNT,NGAUSS,AREA,POLE,GRID,
+ X SWORK,ISIZE,NLON,NLAT)
+ ENDIF
+C
+ ENDIF
+C
+cs setting size of output field
+ OUTLROT = NLON * NLAT
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAUH: HIRLAM rotation failed',JPQUIET)
+ HNTFAUH = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 8. Gaussian to rotated gaussian
+C -----------------------------------------------------------------|
+C
+ 800 CONTINUE
+C
+ IF( (LSP2RGG.AND.(NOREPR.EQ.JPFGGROT)) .OR.
+ X (((NIREPR.EQ.JPQUASI).OR.(NIREPR.EQ.JPGAUSSIAN)) .AND.
+ X (NOREPR.EQ.JPFGGROT)) ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'HNTFAUH: Gaussian to reduced gaussian',JPQUIET)
+C
+C Dynamically allocate memory for rotated lat/long grid
+C
+ ISIZE = NOGAUSS * NOGAUSS * 8
+ CALL JMEMHAN( 11, ISWORK, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAUH: memory alloc for gaussian grid fail',JPQUIET)
+ HNTFAUH = JPROUTINE + 8
+ GOTO 900
+ ENDIF
+C
+C If original field was spectral, ...
+C
+ IF( LSP2RGG ) THEN
+ IRET = HRG2GG(LO12PT,RGGRID,NGAUSS,AREA,POLE,
+ X NOGAUSS,HOGAUST,SWORK,ISIZE,NUMPTS)
+C
+ ELSE
+C
+C If original field was gaussian, ...
+C
+ NGAUSS = NIGAUSS
+ IRET = HRG2GG(LO12PT,ZNFELDI,NGAUSS,AREA,POLE,
+ X NOGAUSS,HOGAUST,SWORK,ISIZE,NUMPTS)
+ ENDIF
+cs setting size of output field
+ OUTLROT = NUMPTS
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'HNTFAUH: HRG2GG rotation failed',JPQUIET)
+ HNTFAUH = JPROUTINE + 8
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+C Move rotated field back into field original array.
+C
+ DO LOOP = 1, NUMPTS
+ ZNFELDI(LOOP) = SWORK(LOOP)
+ ENDDO
+C
+ ENDIF
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hntfaus.F b/interpolation/hntfaus.F
new file mode 100755
index 0000000..0554025
--- /dev/null
+++ b/interpolation/hntfaus.F
@@ -0,0 +1,449 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HNTFAUS(FLDIN,INLEN)
+C
+C---->
+C**** HNTFAUS
+C
+C Purpose
+C -------
+C
+C Prepare to interpolate input field...
+C
+C
+C Interface
+C ---------
+C
+C IRET = HNTFAUS( FLDIN,INLEN)
+C
+C Input
+C -----
+C
+C FLDIN - Input field (unpacked).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C Field unpacked values are in ZNFELDI, rotated if necessary.
+C
+C Returns: 0, if OK. Otherwise, an error occured in rotation.
+C
+C
+C Method
+C ------
+C
+C Rotate the field values if necessary.
+C
+C Some rotation coefficients cannot be created because the
+C algorithm does not converge for rotations which are smaller
+C than a limit which depends on the spectral truncation.
+C
+C If the rotation is too small, it has to be split into three
+C steps (two forward and one backward).
+C
+C Current know limits are:
+C
+C Truncation Max South pole lat Minimum rotation
+C ---------- ------------------ ----------------
+C 63 -89.5 0.5
+C 106 -85 5.0
+C 159 -77 13.0
+C 213 -68 22.0
+C 319 -51 39.0
+C 511 -30.5 59.5
+C
+C
+C Externals
+C ---------
+C
+C GRIBEX - Decode/encode GRIB product.
+C GRSVCK - Turn off GRIB checking
+C INTLOG - Log error message.
+C INTLOGR - Log error message.
+C RPHI - Rotate a spectral field by longitude.
+#ifdef __uxp__
+C JACOBIF - Rotates spectral coefficients by latitude.
+#else
+C JACOBI - Rotates spectral coefficients by latitude.
+#endif
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF February 2001
+C
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER INLEN
+ REAL FLDIN(*)
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 40140 )
+ INTEGER JPLEN, JPNM
+ PARAMETER ( JPNM = JPSTRUNC )
+ PARAMETER ( JPLEN = (JPNM+1)*(JPNM+6) )
+C
+C Local variables
+C
+ REAL POLELAT, POLELON
+ CHARACTER*1 TYPE
+ INTEGER NUMPTS, NGAUSS
+ INTEGER ISIZE, NBYTES, ITRUNC, LOOP, IRET
+ DATA ISIZE/0/
+C
+ REAL SWORK
+ DIMENSION SWORK(1)
+#ifdef POINTER_64
+ INTEGER*8 ISWORK
+#endif
+ POINTER ( ISWORK, SWORK)
+C
+ REAL*8 DWORK
+ DIMENSION DWORK(1)
+#ifdef POINTER_64
+ INTEGER*8 IDWORK
+#endif
+ POINTER ( IDWORK, DWORK )
+C
+ REAL*8 DATA
+ DIMENSION DATA(1)
+#ifdef POINTER_64
+ INTEGER*8 IDATA
+#endif
+ POINTER ( IDATA, DATA)
+C
+ SAVE ISIZE, ISWORK, IDWORK, IDATA
+C
+ REAL*8 DLON, DLAT, LATLIM
+ LOGICAL LOK, LSPLIT
+#ifdef CRAY
+ DATA NBYTES/8/
+#else
+ DATA NBYTES/4/
+#endif
+C
+C Externals
+ INTEGER GGROTAT
+#ifdef __uxp__
+ LOGICAL JACOBIF
+ EXTERNAL JACOBIF
+#else
+ LOGICAL JACOBI
+ EXTERNAL JACOBI
+#endif
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+ HNTFAUS = 0
+ IRET = 0
+C
+C -----------------------------------------------------------------|
+C* Section 1. Store data internally.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Allocate work array ZNFELDI if not already done.
+C
+ IF( IZNJDCI.NE.1952999238 ) THEN
+ CALL JMEMHAN( 19, IZNFLDI, JPEXPAND, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_WARN,'HNTFAUS: ZNFELDI allocate fail',JPQUIET)
+ HNTFAUS = IRET
+ GOTO 900
+ ENDIF
+ IZNJDCI = 1952999238
+ ENDIF
+C
+C Move unpacked values in from user array
+C
+ DO LOOP = 1, INLEN
+ ZNFELDI( LOOP ) = FLDIN( LOOP )
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 3. Handle rotation, if necessary.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Is a rotation of the SH required?
+C
+ IF( LNOROTA ) THEN
+C
+C Avoid rotating U or V spectral coefficients
+C
+ IF( (NIPARAM.EQ.JP_U).OR.(NIPARAM.EQ.JP_V) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAUS: Unable to rotate spectral U or V:',NIPARAM)
+ HNTFAUS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C Dynamically allocate memory for workspace.
+C
+C (Note the multiplication by 2 for REAL*8).
+C
+ NUMPTS = INLEN
+ ISIZE = NUMPTS*2
+ CALL JMEMHAN( 11, IDWORK, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HNTFAUS: memory allocation fail',IDWORK)
+ HNTFAUS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C (Note the multiplication by 2 for REAL*8).
+C
+ ISIZE = JPLEN*2
+ CALL JMEMHAN( 15, IDATA, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HNTFAUS: memory allocation fail',IDATA)
+ HNTFAUS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+ CALL INTLOG(JP_DEBUG,'HNTFAUS: Rotate SH field.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'HNTFAUS: South pole latitude ',NOROTA(1))
+ CALL INTLOG(JP_DEBUG,'HNTFAUS: South pole longitude ',NOROTA(2))
+ IF ( NOREPR.EQ.JPSPHERE ) NOREPR = JPSPHROT
+ IF ( NOREPR.EQ.JPREGULAR ) NOREPR = JPREGROT
+ ITRUNC = NIRESO
+C
+C Some rotation coefficients cannot be created because the
+C algorithm does not converge for rotations which are smaller
+C than a limit which depends on the spectral truncation.
+C
+ IF( ITRUNC.LE.63 ) THEN
+ LATLIM = -89.5
+ ELSE IF( ITRUNC.LE.106 ) THEN
+ LATLIM = -85.0
+ ELSE IF( ITRUNC.LE.159 ) THEN
+ LATLIM = -77.0
+ ELSE IF( ITRUNC.LE.213 ) THEN
+ LATLIM = -68.0
+ ELSE IF( ITRUNC.LE.319 ) THEN
+ LATLIM = -51.0
+ ELSE IF( ITRUNC.LE.511 ) THEN
+#ifdef __uxp__
+ LATLIM = -30.5
+#else
+ LATLIM = -29.5
+#endif
+ ELSE
+ HNTFAUS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ CALL INTLOGR(JP_DEBUG,
+ X 'HNTFAUS: South pole latitude limit = ',LATLIM)
+C
+ POLELAT = (REAL(NOROTA(1))/JPMULT)
+C
+C If the rotation is too small, it has to be split into three
+C steps (two forward and one backward).
+C
+ LSPLIT = POLELAT.LT.LATLIM
+ IF( LSPLIT ) THEN
+ DLAT = -90.0 - LATLIM
+ CALL INTLOG(JP_DEBUG,
+ X 'HNTFAUS: Rotation has been split into three steps',JPQUIET)
+ ELSE
+ DLAT = -90.0 - POLELAT
+ ENDIF
+#if (defined CRAY) || (defined REAL_8)
+C
+C Double precision REALs
+C
+ DLON = - REAL(NOROTA(2))/JPMULT
+C
+C Rotate the spectral field by longitude.
+ CALL RPHI( ZNFELDI, ITRUNC, DWORK, DLON)
+C
+C Rotate the spectral field by latitude.
+C
+ IF( LSPLIT ) THEN
+C
+C Two rotations forward ..
+C
+ CALL INTLOGR(JP_DEBUG,
+ X 'HNTFAUS: Twice forward through angle ', DLAT)
+#if (!defined __uxp__)
+ LOK = JACOBI(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAUS: Spectral rotation failed',JPQUIET)
+ HNTFAUS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ LOK = JACOBI(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAUS: Spectral rotation failed',JPQUIET)
+ HNTFAUS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#else
+ LOK = JACOBIF(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAUS: Spectral rotation failed',JPQUIET)
+ HNTFAUS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ LOK = JACOBIF(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAUS: Spectral rotation failed',JPQUIET)
+ HNTFAUS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#endif
+C
+C .. and one backward
+C
+ DLAT = -90.0 - ( (LATLIM*2.0) - POLELAT)
+ DLAT= -DLAT
+ CALL INTLOGR(JP_DEBUG,
+ X 'HNTFAUS: Once backward through angle ', DLAT)
+ ENDIF
+C
+#if (!defined __uxp__)
+ LOK = JACOBI( ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAUS: Spectral rotation failed',JPQUIET)
+ HNTFAUS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#else
+ LOK = JACOBIF(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAUS: Spectral rotation failed',JPQUIET)
+ HNTFAUS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#endif
+#else
+C
+C Single precision REALs; so convert to double precision.
+C
+ DLAT = -90.0 - DBLE(NOROTA(1))/JPMULT
+ DLON = - DBLE(NOROTA(2))/JPMULT
+C
+C Expand spectral coefficients to REAL*8
+C
+ DO LOOP = 1, NUMPTS
+ DATA(LOOP) = DBLE(ZNFELDI(LOOP))
+ ENDDO
+C
+C Rotate the spectral field by longitude.
+C
+ CALL RPHI( DATA, ITRUNC, DWORK, DLON)
+C
+C Rotate the spectral field by latitude.
+C
+ IF( LSPLIT ) THEN
+C
+C Two rotations forward ..
+C
+ CALL INTLOGR(JP_DEBUG,
+ X 'HNTFAUS: Twice forward through angle ', DLAT)
+#if (!defined __uxp__)
+ LOK = JACOBI(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAUS: Spectral rotation failed',JPQUIET)
+ HNTFAUS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ LOK = JACOBI(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAUS: Spectral rotation failed',JPQUIET)
+ HNTFAUS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#else
+ LOK = JACOBIF(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAUS: Spectral rotation failed',JPQUIET)
+ HNTFAUS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ LOK = JACOBIF(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFAUS: Spectral rotation failed',JPQUIET)
+ HNTFAUS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#endif
+C
+C .. and one backward
+C
+ DLAT = -90.0 - ( (LATLIM*2.0) - POLELAT)
+ DLAT= -DLAT
+ CALL INTLOGR(JP_DEBUG,
+ X 'HNTFAUS: Once backward through angle ', DLAT)
+ ENDIF
+C
+#if (!defined __uxp__)
+ LOK = JACOBI( DATA, ITRUNC, DWORK, DLAT)
+#else
+ LOK = JACOBIF(DATA, ITRUNC, DWORK, DLAT)
+#endif
+#endif
+C
+ IF( .NOT.LOK ) THEN
+ CALL INTLOG(JP_ERROR,'HNTFAUS: Rotation failed',JPQUIET)
+ HNTFAUS = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#if (!defined CRAY) && (!defined REAL_8)
+C
+C Single precision REALs; repack spectral coefficients to REAL*4.
+C
+ DO LOOP = 1, NUMPTS
+ ZNFELDI(LOOP) = SNGL(DATA(LOOP))
+ ENDDO
+#endif
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hntfbu.F b/interpolation/hntfbu.F
new file mode 100755
index 0000000..eed80b7
--- /dev/null
+++ b/interpolation/hntfbu.F
@@ -0,0 +1,432 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HNTFBU( FLDIN,INLEN,FLDOUT,OUTLEN)
+C
+C---->
+C**** HNTFBU
+C
+C Purpose
+C -------
+C
+C Interpolate input field...
+C
+C
+C Interface
+C ---------
+C
+C IRET = HNTFBU( FLDIN,INLEN,FLDOUT,OUTLEN)
+C
+C Input
+C -----
+C
+C FLDIN - Input field (unpacked).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C FLDOUT - Output field (unpacked).
+C OUTLEN - Output field length (words).
+C
+C
+C Method
+C ------
+C
+C Call interpolation routines; then repack if GRIB output.
+C
+C Currently, subareas are not supported for reduced gaussian fields.
+C (Works OK; but need to setup values in GRIB product for number of
+C points in each latitude row)
+C
+C
+C Externals
+C ---------
+C
+C IARCNTL - Control interp. quasi reg.Gauss -> Gaussian or lat/long
+C IAGCNTL - Control interpolation reg.Gaussian or lat/long fields.
+C JSH2SH - Changes resolution of a field of spectral coefficients.
+C JALLGP - Converts spectral input fields to lat/long grid fields.
+C JALLWN - Converts spectral input wind fields to lat/long grids.
+C JAGGGP - Converts spectral input fields to a gaussian grid field.
+C IBASINI - Ensure basic interpolation setup is done.
+C RESET_C - Reset interpolation handling options using GRIB product.
+C JMEMHAN - Handles memory allocation.
+C IGLSIZE - Evaluate array sizes for reg. lat/long and area.
+C IGSIZE - Evaluate array sizes for a regular Gaussian.
+C IRSIZE - Evaluate array sizes for a quasi reg Gaussian.
+C FIXAREA - Fixup area definition to correspond to grid definitions
+C ISCRSZ - Calculate number of values in generated field.
+C INTLOG - Log error message.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Aug 1994
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+ INTEGER INLEN,OUTLEN
+ REAL FLDIN(*),FLDOUT(*)
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+C
+C Parameters
+ INTEGER JPROUTINE
+ INTEGER JPALLOC, JPSCR16
+ PARAMETER (JPROUTINE = 26600 )
+ PARAMETER (JPALLOC = 1 )
+ PARAMETER (JPSCR16 = 16 )
+C
+C Local variables
+C
+ INTEGER IERR, ISIZE, IUV
+ REAL PNORTH, PSOUTH, PWEST, PEAST, PLATINC, PLONINC
+ LOGICAL OIWEGLOBE, OINPOLE, OISPOLE
+ LOGICAL OOWEGLOBE, OONPOLE, OOSPOLE
+ INTEGER KILN, KITOTAL, KOLN, KOTOTAL, KPR, KERR
+ INTEGER LOOP
+#ifdef POINTER_64
+ INTEGER*8 IZNFLDO
+#endif
+ REAL ZNFLDO
+ POINTER ( IZNFLDO, ZNFLDO )
+ DIMENSION ZNFLDO( 1 )
+C
+C Externals
+ INTEGER IGLSIZE, IGSIZE, IRSIZE, IARCNTL, IAGCNTL
+ INTEGER FIXAREA, ISCRSZ
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+ HNTFBU = 0
+ IERR = 0
+ KPR = 0
+C
+C Allocate work array ZNFELDI if not already done.
+C
+ IF( IZNJDCI.NE.1952999238 ) THEN
+ CALL JMEMHAN( 19, IZNFLDI, JPEXPAND, 1, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_WARN,'HNTFBU: znfeldi allocate fail',JPQUIET)
+ HNTFBU = IERR
+ GOTO 900
+ ENDIF
+ IZNJDCI = 1952999238
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 3. Interpolation spherical harmonics to spherical
+C harmonics
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF ( ((NIREPR.EQ.JPSPHERE).OR.(NIREPR.EQ.JPSPHROT)) .AND.
+ X ((NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT)) ) THEN
+C
+C Get scratch space for interpolation
+C
+ ISIZE = ISCRSZ()
+ IF ( ISIZE .LE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'HNTFBU: Get scratch space failed',ISIZE)
+ HNTFBU = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ CALL JMEMHAN( JPSCR16, IZNFLDO, ISIZE, JPALLOC, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'HNTFBU: Get scratch space fail',JPQUIET)
+ HNTFBU = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ CALL SH2SH( ZNFELDI, NIRESO, ZNFLDO, NORESO )
+C
+ GOTO 700
+C
+C If not spectral -> spectral transformation, make sure the input
+C and output area definitions have been setup.
+C
+ ELSE
+C
+C Fixup area definition to correspond to grid definitions
+C
+ IERR = FIXAREA()
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFBU: Fixup area definition failed.',JPQUIET)
+ HNTFBU = JPROUTINE + 9
+ GOTO 900
+ ENDIF
+C
+C Setup geographical limits
+C
+ PNORTH = FLOAT( NOAREA(1) ) / PPMULT
+ PWEST = FLOAT( NOAREA(2) ) / PPMULT
+ PSOUTH = FLOAT( NOAREA(3) ) / PPMULT
+ PEAST = FLOAT( NOAREA(4) ) / PPMULT
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 4. Interpolation spherical harmonics to grid point.
+C ------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ IF ( (NIREPR.EQ.JPSPHERE).OR.(NIREPR.EQ.JPSPHROT) ) THEN
+C
+ ISIZE = ISCRSZ()
+ IF ( ISIZE .LE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'HNTFBU: Get scratch space failed',ISIZE)
+ HNTFBU = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ CALL JMEMHAN( JPSCR16, IZNFLDO, ISIZE, JPALLOC, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'HNTFBU: Get scratch space fail',JPQUIET)
+ HNTFBU = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C If rotation involved, it has already been done (in hntfau)
+C and values are in znfeldi.
+C
+ IF( LNOROTA ) THEN
+ DO LOOP = 1, ISIZE
+ FLDOUT(LOOP) = ZNFELDI(LOOP)
+ ENDDO
+ OUTLEN = ISIZE
+ GOTO 900
+ ENDIF
+C
+C Get scratch space for interpolation
+C
+C
+C Setup wind flag
+ IF ( LWIND ) THEN
+ IUV = 1
+ ELSE
+ IUV = 0
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 4.1 Interpolation spherical harmonics to grid point.
+C ------------------------------------------------------------------
+C
+ 410 CONTINUE
+C
+ IF ( NOREPR.EQ.JPREGULAR ) THEN
+C
+C -> latitude/longitude grid
+C
+ PLONINC = FLOAT( NOGRID(1) ) / PPMULT
+ PLATINC = FLOAT( NOGRID(2) ) / PPMULT
+ IF ( LWIND ) THEN
+ CALL JALLWN( ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X PLATINC, PLONINC, ZNFLDO, IERR)
+ ELSE
+ CALL JALLGP( ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X PLATINC, PLONINC, ZNFLDO, IERR)
+ ENDIF
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFBU: Interpolation of gaussian field failed.',JPQUIET)
+ HNTFBU = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+ GOTO 700
+C
+ ENDIF
+C
+C
+ IF ( NOREPR .EQ. JPGAUSSIAN) THEN
+C
+C -> regular gaussian grid
+C
+ CALL JAGGGP( ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X NOGAUSS, 'U', NOLPTS, ZNFLDO, IUV, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFBU: Interpolation of gaussian field failed.',JPQUIET)
+ HNTFBU = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ GOTO 700
+C
+ ENDIF
+C
+C
+ IF ( NOREPR .EQ. JPQUASI) THEN
+C
+C -> reduced gaussian grid
+C
+ CALL JAGGGP( ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X NOGAUSS, 'U', NOLPTS, ZNFLDO, IUV, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFBU: Interpolation of gaussian field failed.',JPQUIET)
+ HNTFBU = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ GOTO 700
+C
+ ENDIF
+C
+C Dropthrough => unrecognized output field type
+C
+ IERR = JPROUTINE + 1
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFBU: Unrecognized output field type.',NOREPR)
+ HNTFBU = IERR
+ GOTO 900
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 5. Interpolate Gaussian grid to grid point.
+C ------------------------------------------------------------------
+C
+ 500 CONTINUE
+C
+C Setup flags for input and output fields
+C
+ KERR = 1
+ IF (NIREPR .EQ. JPQUASI) THEN
+ IERR = IRSIZE( NIGAUSS, NIAREA, MILLEN, NIWE, NINS, KILN,
+ X KITOTAL, RIGAUSS, OIWEGLOBE, OINPOLE, OISPOLE,
+ X KPR, KERR)
+ ELSE IF ( NIREPR .EQ. JPGAUSSIAN ) THEN
+ IERR = IGSIZE( NIGAUSS, NIAREA, NIWE, NINS, KILN, RIGAUSS,
+ X OIWEGLOBE, OINPOLE, OISPOLE, KPR, KERR)
+ ELSE
+ IERR = IGLSIZE( NIGRID, NIAREA, NIWE, NINS, KILN, OIWEGLOBE,
+ X OINPOLE, OISPOLE, KPR, KERR)
+ ENDIF
+C
+ NONS = 0
+ NOWE = 0
+ IF (NOREPR .EQ. JPQUASI) THEN
+ IERR = IRSIZE( NOGAUSS, NOAREA, NOLPTS, NOWE, NONS, KOLN,
+ X KOTOTAL, ROGAUSS, OOWEGLOBE, OONPOLE, OOSPOLE,
+ X KPR, KERR)
+ ELSE IF ( NOREPR .EQ. JPGAUSSIAN ) THEN
+ IERR = IGSIZE( NOGAUSS, NOAREA, NOWE, NONS, KOLN, ROGAUSS,
+ X OOWEGLOBE, OONPOLE, OOSPOLE, KPR, KERR)
+ ELSE
+ IERR = IGLSIZE( NOGRID, NOAREA, NOWE, NONS, KOLN, OOWEGLOBE,
+ X OONPOLE, OOSPOLE, KPR, KERR)
+ ENDIF
+C
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFBU: Interpolation of gaussian field failed.',IERR)
+ HNTFBU = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+C
+C
+C ------------------------------------------------------------------
+C Section 5.1 Interpolate reduced Gaussian grid to grid point.
+C ------------------------------------------------------------------
+C
+ 510 CONTINUE
+C
+C
+ ISIZE = ISCRSZ()
+ IF ( ISIZE .LE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'HNTFBU: Get scratch space failed.',ISIZE)
+ HNTFBU = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ CALL JMEMHAN( JPSCR16, IZNFLDO, ISIZE, JPALLOC, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'HNTFBU: Get scratch space fail.',JPQUIET)
+ HNTFBU = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ IF (NIREPR .EQ. JPQUASI) THEN
+ IERR = IARCNTL( ZNFELDI, JPEXPAND, ZNFLDO, ISIZE, KILN,
+ X OIWEGLOBE, OINPOLE, OISPOLE, KOLN, OOWEGLOBE,
+ X OONPOLE, OOSPOLE, KPR ,KERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFBU: Interpolation of gaussian field failed.',IERR)
+ HNTFBU = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+C
+ GOTO 700
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 6. Interpolate regular grid point to grid point.
+C ------------------------------------------------------------------
+C
+ 600 CONTINUE
+C
+ IERR = IAGCNTL( ZNFELDI, JPEXPAND, ZNFLDO, ISIZE, KILN,
+ X OIWEGLOBE, OINPOLE, OISPOLE, KOLN, OOWEGLOBE,
+ X OONPOLE, OOSPOLE, KPR, KERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HNTFBU: Interpolation of gaussian field failed.',IERR)
+ HNTFBU = JPROUTINE + 8
+ GOTO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 7. Move unpacked values to user array.
+C ------------------------------------------------------------------
+C
+ 700 CONTINUE
+C
+ DO 710 LOOP = 1, ISIZE
+ FLDOUT( LOOP ) = ZNFLDO( LOOP )
+ 710 CONTINUE
+C
+C Return the number of values, the unpacked array length
+C
+ OUTLEN = ISIZE
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+C Clear change flags for next product processing
+C
+ LCHANGE = .FALSE.
+ LSMCHNG = .FALSE.
+C
+ RETURN
+ END
diff --git a/interpolation/hpshgpw.F b/interpolation/hpshgpw.F
new file mode 100755
index 0000000..cf44c6a
--- /dev/null
+++ b/interpolation/hpshgpw.F
@@ -0,0 +1,225 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE HPSHGPW(OLDLON,OLDLAT,NEWLON,NEWLAT,
+ X PDIRI,NUMPTS,POLE)
+C
+C---->
+C**** HPSHGPW
+C
+C Purpose
+C -------
+C
+C Rotates a grid of points about the y-axis and calculates the
+C angular change between local axes at each grid point.
+C
+C
+C Interface
+C ---------
+C
+C CALL HPSHGPW(OLDLON,OLDLAT,NEWLON,NEWLAT,PDIRI,NUMPTS,POLE)
+C
+C Input
+C -----
+C
+C OLDLON - Array of longitudes to be rotated (degrees)
+C OLDLAT - Array of latitudes to be rotated (degrees)
+C NUMPTS - Number of gridpoints to be rotated
+C PDIRI - Array of initial orientation angles, eg wind directions
+C (degrees)
+C POLE - (Lat,long) of new south pole, measured in old grid
+C
+C
+C Output
+C ------
+C
+C NEWLON - Array of rotated longitudes (degrees, -180 < angle <= 180 )
+C NEWLAT - Array of rotated latitudes (degrees)
+C PDIRI - Array of modified orientation angles, changed to allow for
+C the angles between coordinate axes at each point before and
+C after rotation (degrees, -180 < angle <= 180 )
+C
+C
+C Method
+C ------
+C
+C Rotates a grid of points about the y-axis and calculates the
+C angular change to local axes at each grid point.
+C
+C The z-axis is the polar axis, increasing from south to north.
+C The x-axis is line from the centre of the globe through (0N, 0E),
+C increasing from the centre out to (0N, 0E).
+C The y-axis is line from the centre of the globe through (0N, 90E),
+C increasing from the centre out to (0N, 90E).
+C
+C The sign of the angular change between local axes at each grid point
+C is such that it denotes the angle of rotation to be applied to the
+C old coordinate system to let its axes coincide with the new one. The
+C angle is measured in the old coordinate system, so increments to
+C angles in PDIRI are positive for anti-clockwise rotation from old
+C x-axis to new one.
+C
+C As a consequence, if the initial values in PDIRI are wind directions
+C ddd in the old coordinate system (measured to conform to meteorological
+C use), the output values of PDIRI will be ddd in the new coordinate system
+C (modulo 360).
+C
+C Note that the meteorological use of ddd has effectively the opposite
+C sign to the mathematically usual way of defining angles.
+C
+C The angles between the coordinate axes at each point may be obtained
+C by calling the routine with the values in PDIRI all set to zero on input.
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C G.J.Cats 15 DEC 88.
+C
+C
+C Modified
+C --------
+C
+C P.O'Sullivan 30/3/93 (wind and nonwind)
+C
+C J.D.Chambers October 1999
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+C Parameters
+C
+ REAL EPSILON
+ PARAMETER( EPSILON = 1E-5)
+C `---------------> tolerance used for checking
+C proximity to +/-90.0 and 180.0
+C
+C Subroutine arguments
+C
+ REAL OLDLON, OLDLAT, NEWLON, NEWLAT, PDIRI, POLE(2)
+ DIMENSION OLDLON(*), OLDLAT(*), NEWLON(*), NEWLAT(*), PDIRI(*)
+ INTEGER NUMPTS
+C
+C Local variables
+C
+ INTEGER NXTPT
+ REAL SINTHE, COSTHE, THETA
+ REAL ZLAT, SINLAT, COSLAT
+ REAL ZLON, SINLON, COSLON
+ REAL ZNEW, LATNEW, NCOSLAT, COSNEW, LONNEW, COSDEL, DELTA, ZDIV
+C
+C Statement functions
+C
+ REAL A
+ REAL RADIAN, DEGREE, NORMAL
+ REAL LONGMOD
+C
+C Convert degrees to radians
+C
+ RADIAN(A) = (A) * 0.01745329252
+C
+C Convert radians to degrees
+C
+ DEGREE(A) = (A) * 57.295779513
+C
+C Normalise value such as sin or cos to range (-1,1)
+C
+ NORMAL(A) = MAX(MIN((A),1.0),-1.0)
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ LONGMOD = -POLE(2)
+ THETA = RADIAN(POLE(1))
+ SINTHE = -SIN(THETA)
+ COSTHE = -COS(THETA)
+C
+C -----------------------------------------------------------------|
+C* Section 2. Handle each point separately (longitude,latitude)
+C -----------------------------------------------------------------|
+C
+ DO NXTPT = 1, NUMPTS
+C
+ ZLAT = RADIAN(OLDLAT(NXTPT))
+ SINLAT = SIN(ZLAT)
+ COSLAT = COS(ZLAT)
+C
+ ZLON = OLDLON(NXTPT) + LONGMOD
+ IF( ZLON.GT.180.0 ) ZLON = ZLON - 360.0
+ IF( ABS(ZLON + 180.0).LT.EPSILON ) ZLON = 180.0
+ ZLON = RADIAN(ZLON)
+ SINLON = SIN(ZLON)
+ COSLON = COS(ZLON)
+C
+C Calculate z coordinate of point after rotation and hence
+C its latitude after rotation since:
+C z = sin(lat)
+C
+ ZNEW = SINTHE*SINLAT+COSTHE*COSLAT*COSLON
+ ZNEW = NORMAL(ZNEW)
+ IF( ABS(ZNEW -1.0).LT.EPSILON ) Then
+ LATNEW = 1.5707963268
+ NEWLAT(NXTPT) = 90.0
+ NCOSLAT = 0.0
+ ELSE IF( ABS(ZNEW +1.0).LT.EPSILON ) THEN
+ LATNEW = -1.5707963268
+ NEWLAT(NXTPT) = -90.0
+ NCOSLAT = 0.0
+ ELSE
+ LATNEW = ASIN(ZNEW)
+ NEWLAT(NXTPT) = DEGREE(LATNEW)
+ NCOSLAT = COS(LATNEW)
+ ENDIF
+C
+C Calculate x coordinate of point after rotation and hence
+C its longitude after rotation since:
+C x = cos(lat).cos(lon)
+C cos(lon) = x / cos(lat)
+C
+ IF( NCOSLAT.EQ.0.0 ) NCOSLAT = 1.0
+ ZDIV = 1.0 / NCOSLAT
+C
+ COSNEW = ( (SINTHE*COSLAT*COSLON-COSTHE*SINLAT) ) * ZDIV
+ COSNEW = NORMAL(COSNEW)
+ LONNEW = SIGN(ACOS(COSNEW),ZLON)
+ NEWLON(NXTPT) = DEGREE(LONNEW)
+C
+C Use cosine rule from spherical trigonometry to find angle
+C between the directions of the meridians before and after
+C rotation.
+C
+ COSDEL = SINTHE*SINLON*SIN(LONNEW)+COSLON*COSNEW
+ COSDEL = NORMAL(COSDEL)
+ DELTA = SIGN(ACOS(COSDEL),-COSTHE*ZLON)
+C
+C Change the orientation angle (keep it in the range -180 to 180)
+C
+ PDIRI(NXTPT) = PDIRI(NXTPT) - DEGREE(DELTA)
+ IF( PDIRI(NXTPT).GT.180.0 ) PDIRI(NXTPT) = PDIRI(NXTPT) - 360.0
+ IF( PDIRI(NXTPT).LE.-180.0) PDIRI(NXTPT) = PDIRI(NXTPT) + 360.0
+C
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ RETURN
+ END
diff --git a/interpolation/hrg2gg.F b/interpolation/hrg2gg.F
new file mode 100755
index 0000000..559fb2f
--- /dev/null
+++ b/interpolation/hrg2gg.F
@@ -0,0 +1,557 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HRG2GG(L12PNT,OLDFLD,KGNOLD,AREA,POLE,
+ X KGNNEW,HGTYPE,NEWFLD,KSIZE,NUMPTS)
+C
+C---->
+C**** HRG2GG
+C
+C Purpose
+C -------
+C
+C This routine creates a rotated gaussian field from a reduced
+C gaussian field using 12-point horizontal interpolation.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HRG2GG(L12PNT,OLDFLD,KGNOLD,AREA,POLE,
+C X KGNNEW,HGTYPE,NEWFLD,KSIZE,NUMPTS)
+C
+C
+C Input parameters
+C ----------------
+C
+C L12PNT - Chooses between 12-point and 4-point interpolation
+C OLDFLD - Array of values from the old (reduced) gaussian field
+C KGNOLD - Gaussian number for the old gaussian field
+C AREA - Limits of area (N/W/S/E)
+C POLE - Pole of rotation (lat/long)
+C KGNNEW - Gaussian number for the new gaussian field
+C HGTYPE - Type of new gaussian field
+C 'F' = full, ie regular
+C 'R' = reduced, ie quasi-regular
+C KSIZE - The size of the array to fill with the regular
+C lat/long field
+C
+C
+C Output parameters
+C -----------------
+C
+C NEWFLD - The array of values for the gaussian field
+C NUMPTS - Number of points in the new gaussian field.
+C
+C Returns 0 if function successful, non-zero otherwise.
+C
+C
+C Common block usage
+C ------------------
+C
+C None
+C
+C
+C Method
+C ------
+C
+C Numbering of the points (I is the interpolation point):
+C
+C 13 5 6 14
+C
+C 7 1 2 8
+C (I)
+C 9 3 4 10
+C
+C 15 11 12 16
+C
+C The 12-point interpolation is not possible if either of the top
+C two rows is above the original field northern latitude. The
+C nearest neighbour is used if both rows are above, and a 4-pt
+C bilinear interpolation is used if the top row is above.
+C Similarily, if either of the bottom two rows is below the original
+C field southern latitude.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C JMALLOC - Dynamically allocate memory
+C JFREE - Free dynamically allocated memory
+C JGETGG - Reads the definition of a gaussian grid
+C HGENGG - Calculates original lat/long (before rotation) for
+C a rotated gaussian grid
+C HNEI12 - Finds neighbours for points for interpolation
+C HWTS12 - Calculates weightings for points for interpolation
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF February 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Parameters
+C
+ INTEGER JNORTH, JSOUTH, JWEST, JEAST, JW_E, JN_S, JLAT, JLON
+ INTEGER JP12PT, JP4PT, JPNEARN
+ PARAMETER (JP12PT = 0)
+ PARAMETER (JP4PT = 1)
+ PARAMETER (JPNEARN = 2)
+ PARAMETER (JNORTH = 1 )
+ PARAMETER (JWEST = 2 )
+ PARAMETER (JSOUTH = 3 )
+ PARAMETER (JEAST = 4 )
+ PARAMETER (JW_E = 1 )
+ PARAMETER (JN_S = 2 )
+ PARAMETER (JLAT = 1 )
+ PARAMETER (JLON = 2 )
+C
+C Function arguments
+C
+ LOGICAL L12PNT
+ INTEGER KGNOLD, KGNNEW, KSIZE, NUMPTS
+ REAL AREA(4), POLE(2), OLDFLD(*), NEWFLD(KSIZE)
+ CHARACTER*1 HGTYPE
+C
+C Local variables
+C
+ INTEGER NEXT, LOOP, IRET, NLEN, NOPREV, NNPREV, NBYTES, NUMBER
+ INTEGER NEAREST
+ CHARACTER*1 NNTYPE
+C
+ CHARACTER*12 YFLAG
+ LOGICAL LNEW, LFIRST, LVEGGY
+ INTEGER KSCHEME(1),NEIGH(12,1), KLA(1)
+ REAL PWTS(12,1)
+ POINTER (IPKSCHE, KSCHEME)
+ POINTER (IPNEIGH, NEIGH)
+ POINTER (IPKLA, KLA)
+ POINTER (IPPWTS, PWTS)
+C
+ REAL PDLO0(1),PDLO1(1),PDLO2(1),PDLO3(1),PDLAT(1)
+ POINTER (IPPDLO0, PDLO0)
+ POINTER (IPPDLO1, PDLO1)
+ POINTER (IPPDLO2, PDLO2)
+ POINTER (IPPDLO3, PDLO3)
+ POINTER (IPPDLAT, PDLAT)
+C
+ INTEGER IGG, IGGOLD, INN, INNOLD
+ INTEGER KPTS(1), KNPTS(1)
+ REAL GLATS(1), GNLATS(1)
+ INTEGER IOFFS(1)
+ POINTER (IPKPTS, KPTS)
+ POINTER (IPKNPTS, KNPTS)
+ POINTER (IPIOFFS, IOFFS)
+ POINTER (IPGLATS, GLATS)
+ POINTER (IPGNLATS, GNLATS)
+C
+ INTEGER ILL, ILLOLD
+ REAL RLAT(1),RLON(1)
+ POINTER (IPRLAT, RLAT)
+ POINTER (IPRLON, RLON)
+C
+ REAL OLD(1)
+ POINTER (IOLD, OLD)
+C
+ DATA NOPREV/-1/, NNPREV/-1/, NNTYPE/' '/
+ DATA LNEW/.FALSE./, LFIRST/.TRUE./
+ DATA IGGOLD/-1/, INNOLD/-1/, ILLOLD/-1/, IOLD/-1/
+C
+ SAVE LNEW, LFIRST
+ SAVE IPKSCHE, IPNEIGH, IPKLA, IPPWTS
+ SAVE IPPDLO0, IPPDLO1, IPPDLO2, IPPDLO3, IPPDLAT
+ SAVE NOPREV,NNPREV,NNTYPE
+ SAVE IGGOLD,INNOLD,IPKPTS,IPKNPTS,IPIOFFS,IPGLATS,IPGNLATS
+ SAVE ILLOLD, IPRLAT, IPRLON, IOLD
+C
+C Externals
+C
+ INTEGER HNEI12, HGENGG
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HRG2GG = 0
+C
+ CALL JDEBUG()
+
+ IF( L12PNT ) THEN
+ CALL INTLOG(JP_DEBUG,'HRG2GG: 12-pt interpolation',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'HRG2GG: 4-pt interpolation',JPQUIET)
+ ENDIF
+C
+ CALL CHKPREC()
+ IF( LPREC )THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'HRG2GG: precipitation threshold applied',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'HRG2GG: precipitation threshold not applied',JPQUIET)
+ ENDIF
+C Are we handling vegetation parameter
+ LVEGGY = (NITABLE.EQ.128).AND.
+ X ((NIPARAM.EQ.27).OR.
+ X (NIPARAM.EQ.28).OR.
+ X (NIPARAM.EQ.29).OR.
+ X (NIPARAM.EQ.30).OR.
+ X (NIPARAM.EQ.43) )
+
+C Force nearest neighbour processing with env variable
+ CALL GETENV('NEAREST_NEIGHBOUR', YFLAG)
+ IF( YFLAG(1:1).EQ.'1' ) LVEGGY = .TRUE.
+
+C Force nearest neighbour processing with INTOUT parameter
+ IF( LMETHOD ) LVEGGY = .TRUE.
+
+ IF( LVEGGY ) CALL INTLOG(JP_DEBUG,
+ X 'HRG2GG: nearest neighbour processing (vegetation)',JPQUIET)
+
+
+C
+C Dynamically allocate memory for old gaussian grid information.
+C
+ IGG = KGNOLD*2
+C
+ IF( IGG.GT.IGGOLD ) THEN
+C
+ IF( IGGOLD.GT.0 ) CALL JFREE(IPKPTS)
+C
+ NBYTES = (IGG*JPRLEN) + (2*IGG+1)*JPBYTES
+C
+ IPKPTS = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPKPTS = IPKPTS/(1024*1024*1024*4)
+#endif
+ IF( IPKPTS.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2GG: Memory allocation fail',JPQUIET)
+ HRG2GG = 1
+ GOTO 900
+ ENDIF
+C
+ IPGLATS = IPKPTS + (IGG*JPBYTES)
+ IPIOFFS = IPGLATS + (IGG*JPRLEN)
+C
+ IGGOLD = IGG
+ NOPREV = -1
+C
+ ENDIF
+C
+C Build up offsets to start of each latitude in the original field.
+C
+ IF( KGNOLD.NE.NOPREV ) THEN
+ CALL JGETGG(KGNOLD,'R',GLATS,KPTS,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HRG2GG: JGETGG failed to get gaussian data',JPQUIET)
+ HRG2GG = 2
+ GOTO 900
+ ENDIF
+C
+ IOFFS(1) = 1
+ DO LOOP = 2, (KGNOLD*2+1)
+ IOFFS(LOOP) = IOFFS(LOOP-1) + KPTS(LOOP-1)
+ ENDDO
+C
+C Allocate memory to hold the input field
+C (in case OLDFLD and NEWFLD are the same arrays)
+C
+ IF( IOLD.GT.0 ) CALL JFREE(IOLD)
+C
+ NUMBER = (IOFFS(KGNOLD*2+1) - 1)
+ NBYTES = NUMBER * JPRLEN
+C
+ IOLD = JMALLOC(NBYTES)
+#ifdef hpR64
+ IOLD = IOLD/(1024*1024*1024*4)
+#endif
+ IF( IOLD.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2GG: Memory allocation fail',JPQUIET)
+ HRG2GG = 3
+ GOTO 900
+ ENDIF
+C
+ NOPREV = KGNOLD
+ ENDIF
+C
+C Preserve the input field
+C
+ NUMBER = (IOFFS(KGNOLD*2+1) - 1)
+ DO LOOP = 1, NUMBER
+ OLD(LOOP) = OLDFLD(LOOP)
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 2. Generate the lat/long points for the output grid
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C
+C Dynamically allocate memory for gaussian grid information.
+C
+ INN = KGNNEW*2
+C
+ IF( INN.GT.INNOLD ) THEN
+C
+ IF( INNOLD.GT.0 ) CALL JFREE(IPKNPTS)
+C
+ NBYTES = (INN*JPRLEN) + (INN*JPBYTES)
+C
+ IPKNPTS = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPKNPTS = IPKNPTS/(1024*1024*1024*4)
+#endif
+ IF( IPKNPTS.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2GG: Memory allocation fail',JPQUIET)
+ HRG2GG = 1
+ GOTO 900
+ ENDIF
+C
+ IPGNLATS = IPKNPTS + (INN*JPBYTES)
+C
+ INNOLD = INN
+ NNPREV = -1
+ ENDIF
+C
+ IF( HGTYPE.EQ.'F' ) THEN
+ IF( (KGNNEW.NE.NNPREV).OR.(HGTYPE.NE.NNTYPE) ) THEN
+ NLEN = KGNNEW * KGNNEW * 8
+ CALL JGETGG(KGNNEW,'F',GNLATS,KNPTS,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HRG2GG: JGETGG failed to get gaussian data',JPQUIET)
+ HRG2GG = 2
+ GOTO 900
+ ENDIF
+ NNPREV = KGNNEW
+ NNTYPE = HGTYPE
+ ENDIF
+ ELSE
+ IF( (KGNNEW.NE.NNPREV).OR.(HGTYPE.NE.NNTYPE) ) THEN
+ CALL JGETGG(KGNNEW,'R',GNLATS,KNPTS,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HRG2GG: JGETGG failed to get gaussian data',JPQUIET)
+ HRG2GG = 2
+ GOTO 900
+ ENDIF
+C
+ NLEN = 0
+ DO LOOP = 1, KGNNEW*2
+ NLEN = NLEN + KNPTS(LOOP)
+ ENDDO
+ NNPREV = KGNNEW
+ NNTYPE = HGTYPE
+ ENDIF
+ ENDIF
+C
+C Check that given array is big enough for the new field.
+C
+ IF( NLEN.GT.KSIZE ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2GG: Given array size = ',KSIZE)
+ CALL INTLOG(JP_ERROR,'HRG2GG: Required size = ',NLEN)
+ HRG2GG = 4
+ GOTO 900
+ ENDIF
+C
+C Dynamically allocate memory for lat/long arrays.
+C
+ ILL = NLEN
+ IF( ILL.GT.ILLOLD ) THEN
+C
+ LNEW = .TRUE.
+C
+ IF( ILLOLD.GT.0 ) CALL JFREE(IPRLON)
+C
+ NBYTES = 2*ILL*JPRLEN
+C
+ IPRLON = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPRLON = IPRLON/(1024*1024*1024*4)
+#endif
+ IF( IPRLON.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2GG: Memory allocation fail',JPQUIET)
+ HRG2GG = 5
+ GOTO 900
+ ENDIF
+C
+ IPRLAT = IPRLON + (ILL*JPRLEN)
+C
+ ILLOLD = ILL
+C
+ ENDIF
+C
+ IRET = HGENGG(AREA,POLE,KGNNEW,HGTYPE,KNPTS,GNLATS,ILL,
+ X RLAT,RLON,NUMPTS)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HRG2GG: HGENGG failed to get lat/lon grid data',JPQUIET)
+ HRG2GG = 6
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 3. Find neighbours for each point for interpolation.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Dynamically allocate memory for interpolation arrays.
+C
+ IF( LNEW ) THEN
+C
+ IF( .NOT.LFIRST ) CALL JFREE(IPPDLO0)
+C
+ NBYTES = (17*JPRLEN + 14*JPBYTES) * ILL
+C
+ IPPDLO0 = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPPDLO0 = IPPDLO0/(1024*1024*1024*4)
+#endif
+ IF( IPPDLO0.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2GG: Memory allocation fail',JPQUIET)
+ HRG2GG = 7
+ GOTO 900
+ ENDIF
+C
+ IPPDLO1 = IPPDLO0 + (ILL*JPRLEN)
+ IPPDLO2 = IPPDLO1 + (ILL*JPRLEN)
+ IPPDLO3 = IPPDLO2 + (ILL*JPRLEN)
+ IPPDLAT = IPPDLO3 + (ILL*JPRLEN)
+ IPPWTS = IPPDLAT + (ILL*JPRLEN)
+ IPKSCHE = IPPWTS + (12*ILL*JPRLEN)
+ IPKLA = IPKSCHE + (ILL*JPBYTES)
+ IPNEIGH = IPKLA + (ILL*JPBYTES)
+C
+ LFIRST = .FALSE.
+ LNEW = .FALSE.
+C
+ ENDIF
+C
+C Find neighbours.
+C
+ IRET = HNEI12(L12PNT,NLEN,RLAT,RLON,KGNOLD,KPTS,GLATS,
+ X KSCHEME,PDLAT,PDLO0,PDLO1,PDLO2,PDLO3,KLA,NEIGH)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HRG2GG: HNEI12 failed to find neighbours',JPQUIET)
+ HRG2GG = 8
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 4. Perform the 12-point horizontal interpolation.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C Setup the 12-point horizontal interpolation weights
+C
+ CALL HWTS12
+ X (NLEN,KSCHEME,KLA,PDLAT,GLATS,PDLO0,PDLO1,PDLO2,PDLO3,NEIGH,
+ X PWTS)
+C
+C Calculate the interpolated grid point values
+C
+ DO LOOP = 1, NLEN
+ IF( LVEGGY) THEN
+ NEAREST = 1
+ IF( PWTS( 2,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 2
+ IF( PWTS( 3,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 3
+ IF( PWTS( 4,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 4
+ IF( PWTS( 5,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 5
+ IF( PWTS( 6,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 6
+ IF( PWTS( 7,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 7
+ IF( PWTS( 8,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 8
+ IF( PWTS( 9,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST = 9
+ IF( PWTS(10,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =10
+ IF( PWTS(11,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =11
+ IF( PWTS(12,LOOP).GT.PWTS(NEAREST,LOOP) ) NEAREST =12
+ NEWFLD(LOOP) = OLD(NEIGH( NEAREST,LOOP))
+ ELSE
+ IF( KSCHEME(LOOP).EQ.JP12PT ) THEN
+ NEWFLD(LOOP) =
+ X OLD(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLD(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLD(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLD(NEIGH( 4,LOOP)) * PWTS( 4,LOOP) +
+ X OLD(NEIGH( 5,LOOP)) * PWTS( 5,LOOP) +
+ X OLD(NEIGH( 6,LOOP)) * PWTS( 6,LOOP) +
+ X OLD(NEIGH( 7,LOOP)) * PWTS( 7,LOOP) +
+ X OLD(NEIGH( 8,LOOP)) * PWTS( 8,LOOP) +
+ X OLD(NEIGH( 9,LOOP)) * PWTS( 9,LOOP) +
+ X OLD(NEIGH(10,LOOP)) * PWTS(10,LOOP) +
+ X OLD(NEIGH(11,LOOP)) * PWTS(11,LOOP) +
+ X OLD(NEIGH(12,LOOP)) * PWTS(12,LOOP)
+C
+ ELSE IF( KSCHEME(LOOP).EQ.JP4PT ) THEN
+ NEWFLD(LOOP) =
+ X OLD(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLD(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLD(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLD(NEIGH( 4,LOOP)) * PWTS( 4,LOOP)
+C
+ ELSE
+ DO NEXT = 1, 4
+ IF( NEIGH(NEXT,LOOP).NE.0 )
+ X NEWFLD(LOOP) = OLD(NEIGH(NEXT,LOOP))
+ ENDDO
+C
+ ENDIF
+ ENDIF
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 9. Return.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hrg2ggw.F b/interpolation/hrg2ggw.F
new file mode 100755
index 0000000..16a95f5
--- /dev/null
+++ b/interpolation/hrg2ggw.F
@@ -0,0 +1,588 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HRG2GGW(L12PNT,OLDFLDU,OLDFLDV,KSIZEUV,
+ X KGNOLD,AREA,POLE,KGNNEW,HGTYPE,
+ X NEWFLDU,NEWFLDV,KSIZE,NUMPTS)
+C
+C---->
+C**** HRG2GGW
+C
+C Purpose
+C -------
+C
+C This routine creates rotated gaussian U and V fields from
+C reduced U and V gaussian fields using 12-point horizontal
+C interpolation.
+C
+C
+C Interface
+C ---------
+C
+C INTEGER FUNCTION HRG2GGW(L12PNT,OLDFLDU,OLDFLDV,KSIZEUV,
+C X KGNOLD,AREA,POLE,KGNNEW,HGTYPE,
+C X NEWFLDU,NEWFLDV,KSIZE,NUMPTS)
+C
+C
+C Input parameters
+C ----------------
+C
+C L12PNT - Chooses between 12-point and 4-point interpolation
+C OLDFLDU - Array of values from the old (reduced) gaussian U field
+C OLDFLDV - Array of values from the old (reduced) gaussian V field
+C KSIZEUV - Number of values in each old (reduced) gaussian field
+C KGNOLD - Gaussian number for the old gaussian field
+C AREA - Limits of area (N/W/S/E)
+C POLE - Pole of rotation (lat/long)
+C KGNNEW - Gaussian number for the new gaussian field
+C HGTYPE - Type of new gaussian field
+C 'F' = full, ie regular
+C 'R' = reduced, ie quasi-regular
+C KSIZE - The size of the array to fill with the regular
+C lat/long field
+C
+C
+C Output parameters
+C -----------------
+C
+C NEWFLDU - The array of values for the new U gaussian field
+C NEWFLDV - The array of values for the new V gaussian field
+C NUMPTS - Number of points in each new gaussian field.
+C
+C Returns 0 if function successful, non-zero otherwise.
+C
+C
+C Common block usage
+C ------------------
+C
+C None
+C
+C
+C Method
+C ------
+C
+C Numbering of the points (I is the interpolation point):
+C
+C 13 5 6 14
+C
+C 7 1 2 8
+C (I)
+C 9 3 4 10
+C
+C 15 11 12 16
+C
+C The 12-point interpolation is not possible if either of the top
+C two rows is above the original field northern latitude. The
+C nearest neighbour is used if both rows are above, and a 4-pt
+C bilinear interpolation is used if the top row is above.
+C Similarily, if either of the bottom two rows is below the original
+C field southern latitude.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C JMALLOC - Dynamically allocate memory
+C JFREE - Free dynamically allocated memory
+C JGETGG - Reads the definition of a gaussian grid
+C HGENGG - Calculates original lat/long (before rotation) for
+C a rotated gaussian grid
+C HNEI12 - Finds neighbours for points for interpolation
+C HWTS12 - Calculates weightings for points for interpolation
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF November 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JNORTH, JSOUTH, JWEST, JEAST, JW_E, JN_S, JLAT, JLON
+ INTEGER JP12PT, JP4PT, JPNEARN
+ PARAMETER (JP12PT = 0)
+ PARAMETER (JP4PT = 1)
+ PARAMETER (JPNEARN = 2)
+ PARAMETER (JNORTH = 1 )
+ PARAMETER (JWEST = 2 )
+ PARAMETER (JSOUTH = 3 )
+ PARAMETER (JEAST = 4 )
+ PARAMETER (JW_E = 1 )
+ PARAMETER (JN_S = 2 )
+ PARAMETER (JLAT = 1 )
+ PARAMETER (JLON = 2 )
+C
+C Function arguments
+C
+ LOGICAL L12PNT
+ INTEGER KSIZEUV, KGNOLD, KGNNEW, KSIZE, NUMPTS
+ REAL AREA(4), POLE(2), OLDFLDU(*), OLDFLDV(*)
+ REAL NEWFLDU(KSIZE),NEWFLDV(KSIZE)
+ CHARACTER*1 HGTYPE
+C
+C Local variables
+C
+ INTEGER NEXT, LOOP, IRET, NLEN, NOPREV, NNPREV, NBYTES, NUMBER
+ CHARACTER*1 NNTYPE
+C
+ LOGICAL LNEW, LFIRST
+ INTEGER KSCHEME(1),NEIGH(12,1), KLA(1)
+ REAL PWTS(12,1)
+ POINTER (IPKSCHE, KSCHEME)
+ POINTER (IPNEIGH, NEIGH)
+ POINTER (IPKLA, KLA)
+ POINTER (IPPWTS, PWTS)
+C
+ REAL PDLO0(1),PDLO1(1),PDLO2(1),PDLO3(1),PDLAT(1)
+ POINTER (IPPDLO0, PDLO0)
+ POINTER (IPPDLO1, PDLO1)
+ POINTER (IPPDLO2, PDLO2)
+ POINTER (IPPDLO3, PDLO3)
+ POINTER (IPPDLAT, PDLAT)
+C
+ INTEGER IGG, IGGOLD, INN, INNOLD
+ INTEGER KPTS(1), KNPTS(1)
+ REAL GLATS(1), GNLATS(1)
+ INTEGER IOFFS(1)
+ POINTER (IPKPTS, KPTS)
+ POINTER (IPKNPTS, KNPTS)
+ POINTER (IPIOFFS, IOFFS)
+ POINTER (IPGLATS, GLATS)
+ POINTER (IPGNLATS, GNLATS)
+C
+ INTEGER ILL, ILLOLD
+ REAL RCLAT(1),RCLON(1),RLAT(1),RLON(1),RDIR(1),C(1),S(1),U(1),V(1)
+ POINTER (IPRCLAT, RCLAT)
+ POINTER (IPRCLON, RCLON)
+ POINTER (IPRLAT, RLAT)
+ POINTER (IPRLON, RLON)
+ POINTER (IPRDIR, RDIR)
+ POINTER (IPC, C)
+ POINTER (IPS, S)
+ POINTER (IPU, U)
+ POINTER (IPV, V)
+C
+ REAL OLDU(1)
+ POINTER (IOLDU, OLDU)
+ REAL OLDV(1)
+ POINTER (IOLDV, OLDV)
+C
+ DATA NOPREV/-1/, NNPREV/-1/, NNTYPE/' '/
+ DATA LNEW/.FALSE./, LFIRST/.TRUE./
+ DATA IGGOLD/-1/, INNOLD/-1/, ILLOLD/-1/, IOLDU/-1/
+C
+ SAVE LNEW, LFIRST
+ SAVE IPKSCHE, IPNEIGH, IPKLA, IPPWTS
+ SAVE IPPDLO0, IPPDLO1, IPPDLO2, IPPDLO3, IPPDLAT
+ SAVE NOPREV,NNPREV,NNTYPE
+ SAVE IGGOLD,INNOLD,IPKPTS,IPKNPTS,IPIOFFS,IPGLATS,IPGNLATS
+ SAVE ILLOLD, IPRLAT, IPRLON, IOLDU, IOLDV
+ SAVE IPC, IPS, IPU, IPV
+C
+C Externals
+C
+ INTEGER HNEI12, HGENGG
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+C
+C Statement function
+C
+ REAL A, RADIAN
+C
+C Convert degrees to radians
+C
+ RADIAN(A) = (A) * 0.0174532925
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HRG2GGW = 0
+C
+ CALL JDEBUG()
+C
+C Dynamically allocate memory for old gaussian grid information.
+C
+ IGG = KGNOLD*2
+C
+ IF( IGG.GT.IGGOLD ) THEN
+C
+ IF( IGGOLD.GT.0 ) CALL JFREE(IPKPTS)
+C
+ NBYTES = (IGG*JPRLEN) + (2*IGG+1)*JPBYTES
+C
+ IPKPTS = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPKPTS = IPKPTS/(1024*1024*1024*4)
+#endif
+ IF( IPKPTS.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2GGW: Memory allocate fail',JPQUIET)
+ HRG2GGW = 1
+ GOTO 900
+ ENDIF
+C
+ IPGLATS = IPKPTS + (IGG*JPBYTES)
+ IPIOFFS = IPGLATS + (IGG*JPRLEN)
+C
+ IGGOLD = IGG
+ NOPREV = -1
+C
+ ENDIF
+C
+C Build up offsets to start of each latitude in the original field.
+C
+ IF( KGNOLD.NE.NOPREV ) THEN
+ CALL JGETGG(KGNOLD,'R',GLATS,KPTS,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HRG2GGW: JGETGG failed to get gaussian data',JPQUIET)
+ HRG2GGW = 2
+ GOTO 900
+ ENDIF
+C
+ IOFFS(1) = 1
+ DO LOOP = 2, (KGNOLD*2+1)
+ IOFFS(LOOP) = IOFFS(LOOP-1) + KPTS(LOOP-1)
+ ENDDO
+C
+C Allocate memory to hold the input fields
+C (in case OLDFLDU/OLDFLDV and NEWFLD are the same arrays)
+C
+ IF( IOLDU.GT.0 ) THEN
+ CALL JFREE(IOLDU)
+ CALL JFREE(IOLDV)
+ ENDIF
+C
+ NUMBER = (IOFFS(KGNOLD*2+1) - 1)
+ NBYTES = NUMBER * JPRLEN
+C
+ IOLDU = JMALLOC(NBYTES)
+ IOLDV = JMALLOC(NBYTES)
+#ifdef hpR64
+ IOLDU = IOLDU/(1024*1024*1024*4)
+ IOLDV = IOLDV/(1024*1024*1024*4)
+#endif
+ IF( (IOLDU.EQ.0).OR.(IOLDV.EQ.0) ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2GGW: Memory allocate fail',JPQUIET)
+ HRG2GGW = 3
+ GOTO 900
+ ENDIF
+C
+ NOPREV = KGNOLD
+ ENDIF
+C
+C Preserve the input fields
+C
+ NUMBER = (IOFFS(KGNOLD*2+1) - 1)
+ DO LOOP = 1, NUMBER
+ OLDU(LOOP) = OLDFLDU(LOOP)
+ OLDV(LOOP) = OLDFLDV(LOOP)
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 2. Generate the lat/long points for the output grid
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Dynamically allocate memory for gaussian grid information.
+C
+ INN = KGNNEW*2
+C
+ IF( INN.GT.INNOLD ) THEN
+C
+ IF( INNOLD.GT.0 ) CALL JFREE(IPKNPTS)
+C
+ NBYTES = (INN*JPRLEN) + (INN*JPBYTES)
+C
+ IPKNPTS = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPKNPTS = IPKNPTS/(1024*1024*1024*4)
+#endif
+ IF( IPKNPTS.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2GGW: Memory allocate fail',JPQUIET)
+ HRG2GGW = 1
+ GOTO 900
+ ENDIF
+C
+ IPGNLATS = IPKNPTS + (INN*JPBYTES)
+C
+ INNOLD = INN
+ NNPREV = -1
+ ENDIF
+C
+ IF( HGTYPE.EQ.'F' ) THEN
+ IF( (KGNNEW.NE.NNPREV).OR.(HGTYPE.NE.NNTYPE) ) THEN
+ NLEN = KGNNEW * KGNNEW * 8
+ CALL JGETGG(KGNNEW,'F',GNLATS,KNPTS,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HRG2GGW: JGETGG failed to get gaussian data',JPQUIET)
+ HRG2GGW = 2
+ GOTO 900
+ ENDIF
+ NNPREV = KGNNEW
+ NNTYPE = HGTYPE
+ ENDIF
+ ELSE
+ IF( (KGNNEW.NE.NNPREV).OR.(HGTYPE.NE.NNTYPE) ) THEN
+ CALL JGETGG(KGNNEW,'R',GNLATS,KNPTS,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HRG2GGW: JGETGG failed to get gaussian data',JPQUIET)
+ HRG2GGW = 2
+ GOTO 900
+ ENDIF
+C
+ NLEN = 0
+ DO LOOP = 1, KGNNEW*2
+ NLEN = NLEN + KNPTS(LOOP)
+ ENDDO
+ NNPREV = KGNNEW
+ NNTYPE = HGTYPE
+ ENDIF
+ ENDIF
+C
+C Check that given array is big enough for the new field.
+C
+ IF( NLEN.GT.KSIZE ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2GGW: Given array size = ',KSIZE)
+ CALL INTLOG(JP_ERROR,'HRG2GGW: Required size = ',NLEN)
+ HRG2GGW = 4
+ GOTO 900
+ ENDIF
+C
+C Dynamically allocate memory for lat/long arrays.
+C
+ ILL = NLEN
+ IF( ILL.GT.ILLOLD ) THEN
+C
+ LNEW = .TRUE.
+C
+ IF( ILLOLD.GT.0 ) CALL JFREE(IPRLON)
+C
+ NBYTES = 9*ILL*JPRLEN
+C
+ IPRLON = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPRLON = IPRLON/(1024*1024*1024*4)
+#endif
+ IF( IPRLON.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2GGW: Memory allocate fail',JPQUIET)
+ HRG2GGW = 5
+ GOTO 900
+ ENDIF
+C
+ IPRLAT = IPRLON + (ILL*JPRLEN)
+ IPRCLON = IPRLAT + (ILL*JPRLEN)
+ IPRCLAT = IPRCLON + (ILL*JPRLEN)
+ IPRDIR = IPRCLAT + (ILL*JPRLEN)
+ IPC = IPRDIR + (ILL*JPRLEN)
+ IPS = IPC + (ILL*JPRLEN)
+ IPU = IPS + (ILL*JPRLEN)
+ IPV = IPU + (ILL*JPRLEN)
+C
+ ILLOLD = ILL
+C
+ ENDIF
+C
+ IRET = HGENGG(AREA,POLE,KGNNEW,HGTYPE,KNPTS,GNLATS,ILL,
+ X RLAT,RLON,NUMPTS)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HRG2GGW: HGENGG failed to get lat/lon grid data',JPQUIET)
+ HRG2GGW = 6
+ GOTO 900
+ ENDIF
+C
+ NLEN = NUMPTS
+C
+C -----------------------------------------------------------------|
+C Section 3. Find neighbours for each point for interpolation.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Dynamically allocate memory for interpolation arrays.
+C
+ IF( LNEW ) THEN
+C
+ IF( .NOT.LFIRST ) CALL JFREE(IPPDLO0)
+C
+ NBYTES = (17*JPRLEN + 14*JPBYTES) * ILL
+C
+ IPPDLO0 = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPPDLO0 = IPPDLO0/(1024*1024*1024*4)
+#endif
+ IF( IPPDLO0.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2GGW: Memory allocate fail',JPQUIET)
+ HRG2GGW = 7
+ GOTO 900
+ ENDIF
+C
+ IPPDLO1 = IPPDLO0 + (ILL*JPRLEN)
+ IPPDLO2 = IPPDLO1 + (ILL*JPRLEN)
+ IPPDLO3 = IPPDLO2 + (ILL*JPRLEN)
+ IPPDLAT = IPPDLO3 + (ILL*JPRLEN)
+ IPPWTS = IPPDLAT + (ILL*JPRLEN)
+ IPKSCHE = IPPWTS + (12*ILL*JPRLEN)
+ IPKLA = IPKSCHE + (ILL*JPBYTES)
+ IPNEIGH = IPKLA + (ILL*JPBYTES)
+C
+ LFIRST = .FALSE.
+ LNEW = .FALSE.
+C
+ ENDIF
+C
+C Find neighbours.
+C
+ IRET = HNEI12(L12PNT,NLEN,RLAT,RLON,KGNOLD,KPTS,GLATS,
+ X KSCHEME,PDLAT,PDLO0,PDLO1,PDLO2,PDLO3,KLA,NEIGH)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HRG2GGW: HNEI12 failed to find neighbours',JPQUIET)
+ HRG2GGW = 8
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 4. Perform the 12-point horizontal interpolation.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C Setup the 12-point horizontal interpolation weights
+C
+ CALL HWTS12
+ X (NLEN,KSCHEME,KLA,PDLAT,GLATS,PDLO0,PDLO1,PDLO2,PDLO3,NEIGH,
+ X PWTS)
+C
+C Calculate the interpolated grid point values
+C
+ DO LOOP = 1, NLEN
+ IF( KSCHEME(LOOP).EQ.JP12PT ) THEN
+ U(LOOP) =
+ X OLDU(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLDU(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLDU(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLDU(NEIGH( 4,LOOP)) * PWTS( 4,LOOP) +
+ X OLDU(NEIGH( 5,LOOP)) * PWTS( 5,LOOP) +
+ X OLDU(NEIGH( 6,LOOP)) * PWTS( 6,LOOP) +
+ X OLDU(NEIGH( 7,LOOP)) * PWTS( 7,LOOP) +
+ X OLDU(NEIGH( 8,LOOP)) * PWTS( 8,LOOP) +
+ X OLDU(NEIGH( 9,LOOP)) * PWTS( 9,LOOP) +
+ X OLDU(NEIGH(10,LOOP)) * PWTS(10,LOOP) +
+ X OLDU(NEIGH(11,LOOP)) * PWTS(11,LOOP) +
+ X OLDU(NEIGH(12,LOOP)) * PWTS(12,LOOP)
+ V(LOOP) =
+ X OLDV(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLDV(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLDV(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLDV(NEIGH( 4,LOOP)) * PWTS( 4,LOOP) +
+ X OLDV(NEIGH( 5,LOOP)) * PWTS( 5,LOOP) +
+ X OLDV(NEIGH( 6,LOOP)) * PWTS( 6,LOOP) +
+ X OLDV(NEIGH( 7,LOOP)) * PWTS( 7,LOOP) +
+ X OLDV(NEIGH( 8,LOOP)) * PWTS( 8,LOOP) +
+ X OLDV(NEIGH( 9,LOOP)) * PWTS( 9,LOOP) +
+ X OLDV(NEIGH(10,LOOP)) * PWTS(10,LOOP) +
+ X OLDV(NEIGH(11,LOOP)) * PWTS(11,LOOP) +
+ X OLDV(NEIGH(12,LOOP)) * PWTS(12,LOOP)
+C
+ ELSE IF( KSCHEME(LOOP).EQ.JP4PT ) THEN
+ U(LOOP) =
+ X OLDU(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLDU(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLDU(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLDU(NEIGH( 4,LOOP)) * PWTS( 4,LOOP)
+ V(LOOP) =
+ X OLDV(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLDV(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLDV(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLDV(NEIGH( 4,LOOP)) * PWTS( 4,LOOP)
+C
+ ELSE
+ DO NEXT = 1, 4
+ IF( NEIGH(NEXT,LOOP).NE.0 ) THEN
+ U(LOOP) = OLDU(NEIGH(NEXT,LOOP))
+ V(LOOP) = OLDV(NEIGH(NEXT,LOOP))
+ ENDIF
+ ENDDO
+C
+ ENDIF
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 5. Adjust the U and V components to new (rotated) axes
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+ DO LOOP = 1, NLEN
+ RDIR(LOOP) = 0.0
+ ENDDO
+C
+ CALL HPSHGPW(RLON,RLAT,RCLON,RCLAT,RDIR,NLEN,POLE)
+C
+ DO LOOP = 1, NLEN
+ RDIR(LOOP) = -RADIAN(RDIR(LOOP))
+ ENDDO
+C
+ DO LOOP = 1, NLEN
+ C(LOOP) = COS(RDIR(LOOP))
+ S(LOOP) = SIN(RDIR(LOOP))
+ ENDDO
+C
+ DO LOOP = 1, NLEN
+ NEWFLDU(LOOP) = U(LOOP)*C(LOOP) - V(LOOP)*S(LOOP)
+ NEWFLDV(LOOP) = U(LOOP)*S(LOOP) + V(LOOP)*C(LOOP)
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 9. Return.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hrg2ll.F b/interpolation/hrg2ll.F
new file mode 100755
index 0000000..1098149
--- /dev/null
+++ b/interpolation/hrg2ll.F
@@ -0,0 +1,443 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HRG2LL(L12PNT,OLDFLD,KGAUSS,AREA,POLE,GRID,
+ X NEWFLD,KSIZE,NLON,NLAT)
+C
+C---->
+C**** HRG2LL
+C
+C Purpose
+C -------
+C
+C This routine creates a rotated regular lat/long field from a
+C reduced gaussian field using 12-point horizontal interpolation.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HRG2LL(L12PNT,OLDFLD,KGAUSS,AREA,POLE,GRID,NEWFLD,KSIZE,
+C X NLON,NLAT)
+C
+C
+C Input parameters
+C ----------------
+C
+C L12PNT - Chooses between 12-point and 4-point interpolation
+C OLDFLD - The array of values from the reduced gaussian field
+C KGAUSS - Gaussian number for the reduced gaussian field
+C AREA - Limits of area (N/W/S/E)
+C POLE - Pole of rotation (lat/long)
+C GRID - Grid increments (i/j)
+C KSIZE - The size of the array to fill with the regular
+C lat/long field
+C
+C
+C Output parameters
+C -----------------
+C
+C NEWFLD - The array of values for the regular lat/long field
+C NLON - Number of longitudes in the regular lat/long field
+C NLAT - Number of latitudes in the regular lat/long field
+C
+C Returns 0 if function successful, non-zero otherwise.
+C
+C Common block usage
+C ------------------
+C
+C
+C
+C Method
+C ------
+C
+C Numbering of the points (I is the interpolation point):
+C
+C 13 5 6 14
+C
+C 7 1 2 8
+C (I)
+C 9 3 4 10
+C
+C 15 11 12 16
+C
+C The 12-point interpolation is not possible if either of the top
+C two rows is above the original field northern latitude. The
+C nearest neighbour is used if both rows are above, and a 4-pt
+C bilinear interpolation is used if the top row is above.
+C Similarily, if either of the bottom two rows is below the original
+C field southern latitude.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C JMALLOC - Dynamically allocate memory
+C JFREE - Free dynamically allocated memory
+C JGETGG - Reads the definition of a gaussian grid
+C HGENLL - Calculates original lat/long (before rotation) for
+C a rotated grid
+C HNEI12 - Finds neighbours for points for interpolation
+C HWTS12 - Calculates weightings for points for interpolation
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nofld.common"
+C
+C Parameters
+C
+ INTEGER JNORTH, JSOUTH, JWEST, JEAST, JW_E, JN_S, JLAT, JLON
+ INTEGER JP12PT, JP4PT, JPNEARN
+ PARAMETER (JP12PT = 0)
+ PARAMETER (JP4PT = 1)
+ PARAMETER (JPNEARN = 2)
+ PARAMETER (JNORTH = 1 )
+ PARAMETER (JWEST = 2 )
+ PARAMETER (JSOUTH = 3 )
+ PARAMETER (JEAST = 4 )
+ PARAMETER (JW_E = 1 )
+ PARAMETER (JN_S = 2 )
+ PARAMETER (JLAT = 1 )
+ PARAMETER (JLON = 2 )
+C
+C Function arguments
+C
+ LOGICAL L12PNT
+ INTEGER KGAUSS, KSIZE, NLON, NLAT
+ REAL AREA(4), POLE(2), GRID(2), OLDFLD(*), NEWFLD(KSIZE)
+C
+C Local variables
+C
+ INTEGER NEXT, LOOP, IRET, NLEN, NPREV, NBYTES, NUMBER
+C
+ LOGICAL LNEW, LFIRST
+ INTEGER KSCHEME(1),NEIGH(12,1), KLA(1)
+ REAL PWTS(12,1)
+ POINTER (IPKSCHE, KSCHEME)
+ POINTER (IPNEIGH, NEIGH)
+ POINTER (IPKLA, KLA)
+ POINTER (IPPWTS, PWTS)
+C
+ REAL PDLO0(1),PDLO1(1),PDLO2(1),PDLO3(1),PDLAT(1)
+ POINTER (IPPDLO0, PDLO0)
+ POINTER (IPPDLO1, PDLO1)
+ POINTER (IPPDLO2, PDLO2)
+ POINTER (IPPDLO3, PDLO3)
+ POINTER (IPPDLAT, PDLAT)
+C
+ INTEGER IGG, IGGOLD
+ INTEGER KPTS(1)
+ REAL GLATS(1)
+ INTEGER IOFFS(1)
+ POINTER (IPKPTS, KPTS)
+ POINTER (IPIOFFS, IOFFS)
+ POINTER (IPGLATS, GLATS)
+C
+ INTEGER ILL, ILLOLD
+ REAL RLAT(1),RLON(1)
+ POINTER (IPRLAT, RLAT)
+ POINTER (IPRLON, RLON)
+C
+ REAL OLD(1)
+ POINTER (IOLD, OLD)
+C
+ DATA NPREV/-1/
+ DATA LNEW/.FALSE./, LFIRST/.TRUE./
+ DATA IGGOLD/-1/, ILLOLD/-1/, IOLD/-1/
+C
+ SAVE LNEW, LFIRST
+ SAVE IPKSCHE, IPNEIGH, IPKLA, IPPWTS
+ SAVE IPPDLO0, IPPDLO1, IPPDLO2, IPPDLO3, IPPDLAT
+ SAVE NPREV, IGGOLD, IPKPTS, IPIOFFS, IPGLATS
+ SAVE ILLOLD, IPRLAT, IPRLON, IOLD
+C
+C Externals
+C
+ INTEGER HNEI12, HGENLL
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HRG2LL = 0
+C
+ CALL JDEBUG()
+C
+C Dynamically allocate memory for gaussian grid information.
+C
+ IGG = KGAUSS*2
+C
+ IF( IGG.GT.IGGOLD ) THEN
+C
+ IF( IGGOLD.GT.0 ) CALL JFREE(IPKPTS)
+C
+ NBYTES = (IGG*JPRLEN) + (2*IGG+1)*JPBYTES
+C
+ IPKPTS = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPKPTS = IPKPTS/(1024*1024*1024*4)
+#endif
+ IF( IPKPTS.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2LL: Memory allocation fail',JPQUIET)
+ HRG2LL = 1
+ GOTO 900
+ ENDIF
+C
+ IPGLATS = IPKPTS + (IGG*JPBYTES)
+ IPIOFFS = IPGLATS + (IGG*JPRLEN)
+C
+ IGGOLD = IGG
+ NPREV = -1
+C
+ ENDIF
+C
+C Build up offsets to start of each latitude in the original field.
+C
+ IF( KGAUSS.NE.NPREV ) THEN
+ CALL JGETGG(KGAUSS,'R',GLATS,KPTS,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HRG2LL: JGETGG failed to get gaussian data',JPQUIET)
+ HRG2LL = 2
+ GOTO 900
+ ENDIF
+C
+ IOFFS(1) = 1
+ DO LOOP = 2, (KGAUSS*2+1)
+ IOFFS(LOOP) = IOFFS(LOOP-1) + KPTS(LOOP-1)
+ ENDDO
+C
+C Allocate memory to hold the input field
+C (in case OLDFLD and NEWFLD are the same arrays)
+C
+ IF( IOLD.GT.0 ) CALL JFREE(IOLD)
+C
+ NUMBER = (IOFFS(KGAUSS*2+1) - 1)
+ NBYTES = NUMBER * JPRLEN
+C
+ IOLD = JMALLOC(NBYTES)
+#ifdef hpR64
+ IOLD = IOLD/(1024*1024*1024*4)
+#endif
+ IF( IOLD.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2LL: Memory allocation fail',JPQUIET)
+ HRG2LL = 3
+ GOTO 900
+ ENDIF
+C
+ NPREV = KGAUSS
+ ENDIF
+C
+C Preserve the input field
+C
+ NUMBER = (IOFFS(KGAUSS*2+1) - 1)
+ DO LOOP = 1, NUMBER
+ OLD(LOOP) = OLDFLD(LOOP)
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 2. Generate the lat/long points for the output grid
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ NLON = 1 + NINT((AREA(JEAST) - AREA(JWEST)) / GRID(JW_E))
+ NLAT = 1 + NINT((AREA(JNORTH) - AREA(JSOUTH)) / GRID(JN_S))
+C
+ NLEN = NLON * NLAT
+
+ NOWE = NLON
+ NONS = NLAT
+C
+C Check that given array is big enough for the new field.
+C
+ IF( NLEN.GT.KSIZE ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2LL: Given array size = ',KSIZE)
+ CALL INTLOG(JP_ERROR,'HRG2LL: Required size = ',NLEN)
+ HRG2LL = 4
+ GOTO 900
+ ENDIF
+C
+C Dynamically allocate memory for lat/long arrays.
+C
+ ILL = NLEN
+ IF( ILL.GT.ILLOLD ) THEN
+C
+ LNEW = .TRUE.
+C
+ IF( ILLOLD.GT.0 ) CALL JFREE(IPRLON)
+C
+ NBYTES = 2*ILL*JPRLEN
+C
+ IPRLON = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPRLON = IPRLON/(1024*1024*1024*4)
+#endif
+ IF( IPRLON.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2LL: Memory allocation fail',JPQUIET)
+ HRG2LL = 5
+ GOTO 900
+ ENDIF
+C
+ IPRLAT = IPRLON + (ILL*JPRLEN)
+C
+ ILLOLD = ILL
+C
+ ENDIF
+C
+ IRET = HGENLL(AREA,POLE,GRID,NLON,NLAT,RLAT,RLON)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HRG2LL: HGENLL failed to get lat/lon grid data',JPQUIET)
+ HRG2LL = 6
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 3. Find neighbours for each point for interpolation.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Dynamically allocate memory for interpolation arrays.
+C
+ IF( LNEW ) THEN
+C
+ IF( .NOT.LFIRST ) CALL JFREE(IPPDLO0)
+C
+ NBYTES = (17*JPRLEN + 14*JPBYTES) * ILL
+C
+ IPPDLO0 = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPPDLO0 = IPPDLO0/(1024*1024*1024*4)
+#endif
+ IF( IPPDLO0.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2LL: Memory allocation fail',JPQUIET)
+ HRG2LL = 7
+ GOTO 900
+ ENDIF
+C
+ IPPDLO1 = IPPDLO0 + (ILL*JPRLEN)
+ IPPDLO2 = IPPDLO1 + (ILL*JPRLEN)
+ IPPDLO3 = IPPDLO2 + (ILL*JPRLEN)
+ IPPDLAT = IPPDLO3 + (ILL*JPRLEN)
+ IPPWTS = IPPDLAT + (ILL*JPRLEN)
+ IPKSCHE = IPPWTS + (12*ILL*JPRLEN)
+ IPKLA = IPKSCHE + (ILL*JPBYTES)
+ IPNEIGH = IPKLA + (ILL*JPBYTES)
+C
+ LFIRST = .FALSE.
+ LNEW = .FALSE.
+C
+ ENDIF
+C
+C Find neighbours.
+C
+ IRET = HNEI12(L12PNT,NLEN,RLAT,RLON,KGAUSS,KPTS,GLATS,
+ X KSCHEME,PDLAT,PDLO0,PDLO1,PDLO2,PDLO3,KLA,NEIGH)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HRG2LL: HNEI12 failed to find neighbours',JPQUIET)
+ HRG2LL = 8
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 4. Perform the 12-point horizontal interpolation.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C Setup the 12-point horizontal interpolation weights
+C
+ CALL HWTS12
+ X (NLEN,KSCHEME,KLA,PDLAT,GLATS,PDLO0,PDLO1,PDLO2,PDLO3,NEIGH,
+ X PWTS)
+C
+C Calculate the interpolated grid point values
+C
+ DO LOOP = 1, NLEN
+ IF( KSCHEME(LOOP).EQ.JP12PT ) THEN
+ NEWFLD(LOOP) =
+ X OLD(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLD(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLD(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLD(NEIGH( 4,LOOP)) * PWTS( 4,LOOP) +
+ X OLD(NEIGH( 5,LOOP)) * PWTS( 5,LOOP) +
+ X OLD(NEIGH( 6,LOOP)) * PWTS( 6,LOOP) +
+ X OLD(NEIGH( 7,LOOP)) * PWTS( 7,LOOP) +
+ X OLD(NEIGH( 8,LOOP)) * PWTS( 8,LOOP) +
+ X OLD(NEIGH( 9,LOOP)) * PWTS( 9,LOOP) +
+ X OLD(NEIGH(10,LOOP)) * PWTS(10,LOOP) +
+ X OLD(NEIGH(11,LOOP)) * PWTS(11,LOOP) +
+ X OLD(NEIGH(12,LOOP)) * PWTS(12,LOOP)
+C
+ ELSE IF( KSCHEME(LOOP).EQ.JP4PT ) THEN
+ NEWFLD(LOOP) =
+ X OLD(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLD(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLD(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLD(NEIGH( 4,LOOP)) * PWTS( 4,LOOP)
+C
+ ELSE
+ DO NEXT = 1, 4
+ IF( NEIGH(NEXT,LOOP).NE.0 )
+ X NEWFLD(LOOP) = OLD(NEIGH(NEXT,LOOP))
+ ENDDO
+C
+ ENDIF
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 9. Return.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hrg2llw.F b/interpolation/hrg2llw.F
new file mode 100755
index 0000000..564f3bc
--- /dev/null
+++ b/interpolation/hrg2llw.F
@@ -0,0 +1,520 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HRG2LLW(L12PNT,OLDFLDU,OLDFLDV,KGAUSS,AREA,POLE,
+ X GRID,NEWFLDU,NEWFLDV,KSIZE,NLON,NLAT)
+C
+C---->
+C**** HRG2LLW
+C
+C Purpose
+C -------
+C
+C This routine creates a rotated regular lat/long field from a
+C reduced gaussian field using 12-point horizontal interpolation.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HRG2LLW(L12PNT,OLDFLDU,OLDFLDV,KGAUSS,AREA,POLE,GRID,
+C X NEWFLDU,NEWFLDV,KSIZE,NLON,NLAT)
+C
+C
+C Input parameters
+C ----------------
+C
+C L12PNT - Chooses between 12-point and 4-point interpolation
+C OLDFLDU - The array of values from the reduced gaussian U field
+C OLDFLDV - The array of values from the reduced gaussian V field
+C KGAUSS - Gaussian number for the reduced gaussian field
+C AREA - Limits of area (N/W/S/E)
+C POLE - Pole of rotation (lat/long)
+C GRID - Grid increments (i/j)
+C KSIZE - The size of the array to fill with the regular
+C lat/long field
+C
+C
+C Output parameters
+C -----------------
+C
+C NEWFLDU - The array of values for the regular lat/long U field
+C NEWFLDV - The array of values for the regular lat/long V field
+C NLON - Number of longitudes in the regular lat/long field
+C NLAT - Number of latitudes in the regular lat/long field
+C
+C Returns 0 if function successful, non-zero otherwise.
+C
+C Common block usage
+C ------------------
+C
+C nifld.common
+C nofld.common
+C
+C
+C Method
+C ------
+C
+C Numbering of the points (I is the interpolation point):
+C
+C 13 5 6 14
+C
+C 7 1 2 8
+C (I)
+C 9 3 4 10
+C
+C 15 11 12 16
+C
+C The 12-point interpolation is not possible if either of the top
+C two rows is above the original field northern latitude. The
+C nearest neighbour is used if both rows are above, and a 4-pt
+C bilinear interpolation is used if the top row is above.
+C Similarily, if either of the bottom two rows is below the original
+C field southern latitude.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C JMALLOC - Dynamically allocate memory
+C JFREE - Free dynamically allocated memory
+C JGETGG - Reads the definition of a gaussian grid
+C HGENLLW - Calculates original lat/long (before rotation) for
+C a rotated grid for wind fields.
+C HNEI12 - Finds neighbours for points for interpolation
+C HWTS12 - Calculates weightings for points for interpolation
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Parameters
+C
+ INTEGER JNORTH, JSOUTH, JWEST, JEAST, JW_E, JN_S, JLAT, JLON
+ INTEGER JP12PT, JP4PT, JPNEARN
+ PARAMETER (JP12PT = 0)
+ PARAMETER (JP4PT = 1)
+ PARAMETER (JPNEARN = 2)
+ PARAMETER (JNORTH = 1 )
+ PARAMETER (JWEST = 2 )
+ PARAMETER (JSOUTH = 3 )
+ PARAMETER (JEAST = 4 )
+ PARAMETER (JW_E = 1 )
+ PARAMETER (JN_S = 2 )
+ PARAMETER (JLAT = 1 )
+ PARAMETER (JLON = 2 )
+C
+C Function arguments
+C
+ LOGICAL L12PNT
+ INTEGER KGAUSS, KSIZE, NLON, NLAT
+ REAL AREA(4), POLE(2), GRID(2)
+ REAL OLDFLDU(*), OLDFLDV(*)
+ REAL NEWFLDU(KSIZE), NEWFLDV(KSIZE)
+C
+C Local variables
+C
+ INTEGER NEXT, LOOP, IRET, NLEN, NPREV, NBYTES, NUMBER
+C
+ LOGICAL LNEW, LFIRST
+ INTEGER KSCHEME(1),NEIGH(12,1), KLA(1)
+ REAL PWTS(12,1)
+ POINTER (IPKSCHE, KSCHEME)
+ POINTER (IPNEIGH, NEIGH)
+ POINTER (IPKLA, KLA)
+ POINTER (IPPWTS, PWTS)
+C
+ REAL PDLO0(1),PDLO1(1),PDLO2(1),PDLO3(1),PDLAT(1)
+ POINTER (IPPDLO0, PDLO0)
+ POINTER (IPPDLO1, PDLO1)
+ POINTER (IPPDLO2, PDLO2)
+ POINTER (IPPDLO3, PDLO3)
+ POINTER (IPPDLAT, PDLAT)
+C
+ INTEGER IGG, IGGOLD
+ INTEGER KPTS(1)
+ REAL GLATS(1)
+ INTEGER IOFFS(1)
+ POINTER (IPKPTS, KPTS)
+ POINTER (IPIOFFS, IOFFS)
+ POINTER (IPGLATS, GLATS)
+C
+ INTEGER ILL, ILLOLD
+ REAL RCLAT(1),RCLON(1),RLAT(1),RLON(1),RDIR(1),C(1),S(1),U(1),V(1)
+ POINTER (IPRCLAT, RCLAT)
+ POINTER (IPRCLON, RCLON)
+ POINTER (IPRLAT, RLAT)
+ POINTER (IPRLON, RLON)
+ POINTER (IPRDIR, RDIR)
+ POINTER (IPC, C)
+ POINTER (IPS, S)
+ POINTER (IPU, U)
+ POINTER (IPV, V)
+C
+ REAL OLDU(1), OLDV(1)
+ POINTER (IOLDU, OLDU)
+ POINTER (IOLDV, OLDV)
+C
+ DATA NPREV/-1/
+ DATA LNEW/.FALSE./, LFIRST/.TRUE./
+ DATA IGGOLD/-1/, ILLOLD/-1/, IOLDU/-1/, IOLDV/-1/
+C
+ SAVE LNEW, LFIRST
+ SAVE IPKSCHE, IPNEIGH, IPKLA, IPPWTS
+ SAVE IPPDLO0, IPPDLO1, IPPDLO2, IPPDLO3, IPPDLAT
+ SAVE NPREV, IGGOLD, IPKPTS, IPIOFFS, IPGLATS
+ SAVE ILLOLD,IPRCLAT,IPRCLON,IPRLAT,IPRLON,IPRDIR,IOLDU,IOLDV
+ SAVE IPC, IPS, IPU, IPV
+C
+C Externals
+C
+ INTEGER HNEI12, HGENLLW
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+C
+C Statement function
+C
+ REAL A, RADIAN
+C
+C Convert degrees to radians
+C
+ RADIAN(A) = (A) * 0.0174532925
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HRG2LLW = 0
+C
+ CALL JDEBUG()
+C
+C Dynamically allocate memory for gaussian grid information.
+C
+ IGG = KGAUSS*2
+C
+ IF( IGG.GT.IGGOLD ) THEN
+C
+ IF( IGGOLD.GT.0 ) CALL JFREE(IPKPTS)
+C
+ NBYTES = (IGG*JPRLEN) + (2*IGG+1)*JPBYTES
+C
+ IPKPTS = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPKPTS = IPKPTS/(1024*1024*1024*4)
+#endif
+ IF( IPKPTS.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2LLW: Memory allocate fail',JPQUIET)
+ HRG2LLW = 1
+ GOTO 900
+ ENDIF
+C
+ IPGLATS = IPKPTS + (IGG*JPBYTES)
+ IPIOFFS = IPGLATS + (IGG*JPRLEN)
+C
+ IGGOLD = IGG
+ NPREV = -1
+C
+ ENDIF
+C
+C Build up offsets to start of each latitude in original fields.
+C
+ IF( KGAUSS.NE.NPREV ) THEN
+ CALL JGETGG(KGAUSS,'R',GLATS,KPTS,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HRG2LLW: JGETGG failed to get gaussian data',JPQUIET)
+ HRG2LLW = 2
+ GOTO 900
+ ENDIF
+C
+ IOFFS(1) = 1
+ DO LOOP = 2, (KGAUSS*2+1)
+ IOFFS(LOOP) = IOFFS(LOOP-1) + KPTS(LOOP-1)
+ ENDDO
+C
+C Allocate memory to preserve the input fields
+C (in case OLDFLDx and NEWFLDx are the same arrays)
+C
+ IF( IOLDU.GT.0 ) CALL JFREE(IOLDU)
+C
+ NUMBER = (IOFFS(KGAUSS*2+1) - 1)
+ NBYTES = 2 * NUMBER * JPRLEN
+C
+ IOLDU = JMALLOC(NBYTES)
+#ifdef hpR64
+ IOLDU = IOLDU/(1024*1024*1024*4)
+#endif
+ IF( IOLDU.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2LLW: Memory allocate fail',JPQUIET)
+ HRG2LLW = 3
+ GOTO 900
+ ENDIF
+ IOLDV = IOLDU + (NUMBER * JPRLEN)
+C
+ NPREV = KGAUSS
+ ENDIF
+C
+C Preserve the input fields
+C
+ DO LOOP = 1, NUMBER
+ OLDU(LOOP) = OLDFLDU(LOOP)
+ OLDV(LOOP) = OLDFLDV(LOOP)
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 2. Generate the lat/long points for the output grid
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ NLON = 1 + INT((AREA(JEAST) - AREA(JWEST)) / GRID(JW_E))
+ NLAT = 1 + INT((AREA(JNORTH) - AREA(JSOUTH)) / GRID(JN_S))
+C
+ NLEN = NLON * NLAT
+
+ NOWE = NLON
+ NONS = NLAT
+C
+C Check that given array is big enough for the new field.
+C
+ IF( NLEN.GT.KSIZE ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2LLW: Given array size = ',KSIZE)
+ CALL INTLOG(JP_ERROR,'HRG2LLW: Required size = ',NLEN)
+ HRG2LLW = 4
+ GOTO 900
+ ENDIF
+C
+C Dynamically allocate memory for lat/long arrays.
+C
+ ILL = NLEN
+ IF( ILL.GT.ILLOLD ) THEN
+C
+ LNEW = .TRUE.
+C
+ IF( ILLOLD.GT.0 ) CALL JFREE(IPRLON)
+C
+ NBYTES = 9*ILL*JPRLEN
+C
+ IPRLON = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPRLON = IPRLON/(1024*1024*1024*4)
+#endif
+ IF( IPRLON.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2LLW: Memory allocate fail',JPQUIET)
+ HRG2LLW = 5
+ GOTO 900
+ ENDIF
+C
+ IPRLAT = IPRLON + (ILL*JPRLEN)
+ IPRCLON = IPRLAT + (ILL*JPRLEN)
+ IPRCLAT = IPRCLON + (ILL*JPRLEN)
+ IPRDIR = IPRCLAT + (ILL*JPRLEN)
+ IPC = IPRDIR + (ILL*JPRLEN)
+ IPS = IPC + (ILL*JPRLEN)
+ IPU = IPS + (ILL*JPRLEN)
+ IPV = IPU + (ILL*JPRLEN)
+C
+ ILLOLD = ILL
+C
+ ENDIF
+C
+ IRET = HGENLLW(AREA,POLE,GRID,NLON,NLAT,RCLAT,RCLON,RLAT,RLON)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HRG2LLW: HGENLLW failed to get lat/lon grid data',JPQUIET)
+ HRG2LLW = 6
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 3. Find neighbours for each point for interpolation.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Dynamically allocate memory for interpolation arrays.
+C
+ IF( LNEW ) THEN
+C
+ IF( .NOT.LFIRST ) CALL JFREE(IPPDLO0)
+C
+ NBYTES = (17*JPRLEN + 14*JPBYTES) * ILL
+C
+ IPPDLO0 = JMALLOC(NBYTES)
+#ifdef hpR64
+ IPPDLO0 = IPPDLO0/(1024*1024*1024*4)
+#endif
+ IF( IPPDLO0.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'HRG2LLW: Memory allocate fail',JPQUIET)
+ HRG2LLW = 7
+ GOTO 900
+ ENDIF
+C
+ IPPDLO1 = IPPDLO0 + (ILL*JPRLEN)
+ IPPDLO2 = IPPDLO1 + (ILL*JPRLEN)
+ IPPDLO3 = IPPDLO2 + (ILL*JPRLEN)
+ IPPDLAT = IPPDLO3 + (ILL*JPRLEN)
+ IPPWTS = IPPDLAT + (ILL*JPRLEN)
+ IPKSCHE = IPPWTS + (12*ILL*JPRLEN)
+ IPKLA = IPKSCHE + (ILL*JPBYTES)
+ IPNEIGH = IPKLA + (ILL*JPBYTES)
+C
+ LFIRST = .FALSE.
+C
+ ENDIF
+C
+C Find neighbours.
+C
+ IRET = HNEI12(L12PNT,NLEN,RLAT,RLON,KGAUSS,KPTS,GLATS,
+ X KSCHEME,PDLAT,PDLO0,PDLO1,PDLO2,PDLO3,KLA,NEIGH)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HRG2LLW: HNEI12 failed to find neighbours',JPQUIET)
+ HRG2LLW = 8
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 4. Perform the 12-point horizontal interpolation.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C Setup the 12-point horizontal interpolation weights
+C
+ CALL HWTS12
+ X (NLEN,KSCHEME,KLA,PDLAT,GLATS,PDLO0,PDLO1,PDLO2,PDLO3,NEIGH,
+ X PWTS)
+C
+C Calculate the interpolated grid point values
+C
+ DO LOOP = 1, NLEN
+ IF( KSCHEME(LOOP).EQ.JP12PT ) THEN
+ U(LOOP) =
+ X OLDU(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLDU(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLDU(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLDU(NEIGH( 4,LOOP)) * PWTS( 4,LOOP) +
+ X OLDU(NEIGH( 5,LOOP)) * PWTS( 5,LOOP) +
+ X OLDU(NEIGH( 6,LOOP)) * PWTS( 6,LOOP) +
+ X OLDU(NEIGH( 7,LOOP)) * PWTS( 7,LOOP) +
+ X OLDU(NEIGH( 8,LOOP)) * PWTS( 8,LOOP) +
+ X OLDU(NEIGH( 9,LOOP)) * PWTS( 9,LOOP) +
+ X OLDU(NEIGH(10,LOOP)) * PWTS(10,LOOP) +
+ X OLDU(NEIGH(11,LOOP)) * PWTS(11,LOOP) +
+ X OLDU(NEIGH(12,LOOP)) * PWTS(12,LOOP)
+ V(LOOP) =
+ X OLDV(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLDV(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLDV(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLDV(NEIGH( 4,LOOP)) * PWTS( 4,LOOP) +
+ X OLDV(NEIGH( 5,LOOP)) * PWTS( 5,LOOP) +
+ X OLDV(NEIGH( 6,LOOP)) * PWTS( 6,LOOP) +
+ X OLDV(NEIGH( 7,LOOP)) * PWTS( 7,LOOP) +
+ X OLDV(NEIGH( 8,LOOP)) * PWTS( 8,LOOP) +
+ X OLDV(NEIGH( 9,LOOP)) * PWTS( 9,LOOP) +
+ X OLDV(NEIGH(10,LOOP)) * PWTS(10,LOOP) +
+ X OLDV(NEIGH(11,LOOP)) * PWTS(11,LOOP) +
+ X OLDV(NEIGH(12,LOOP)) * PWTS(12,LOOP)
+C
+ ELSE IF( KSCHEME(LOOP).EQ.JP4PT ) THEN
+ U(LOOP) =
+ X OLDU(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLDU(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLDU(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLDU(NEIGH( 4,LOOP)) * PWTS( 4,LOOP)
+ V(LOOP) =
+ X OLDV(NEIGH( 1,LOOP)) * PWTS( 1,LOOP) +
+ X OLDV(NEIGH( 2,LOOP)) * PWTS( 2,LOOP) +
+ X OLDV(NEIGH( 3,LOOP)) * PWTS( 3,LOOP) +
+ X OLDV(NEIGH( 4,LOOP)) * PWTS( 4,LOOP)
+C
+ ELSE
+ DO NEXT = 1, 4
+ IF( NEIGH(NEXT,LOOP).NE.0 ) THEN
+ U(LOOP) = OLDU(NEIGH(NEXT,LOOP))
+ V(LOOP) = OLDV(NEIGH(NEXT,LOOP))
+ ENDIF
+ ENDDO
+C
+ ENDIF
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 5. Adjust the U and V components to new (rotated) axes
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+ DO LOOP = 1, NLEN
+ RDIR(LOOP) = 0.0
+ ENDDO
+C
+ CALL HPSHGPW(RCLON,RCLAT,RLON,RLAT,RDIR,NLEN,POLE)
+C
+ DO LOOP = 1, NLEN
+ RDIR(LOOP) = RADIAN(RDIR(LOOP))
+ ENDDO
+C
+ DO LOOP = 1, NLEN
+ C(LOOP) = COS(RDIR(LOOP))
+ S(LOOP) = SIN(RDIR(LOOP))
+ ENDDO
+C
+ DO LOOP = 1, NLEN
+ NEWFLDU(LOOP) = U(LOOP)*C(LOOP) - V(LOOP)*S(LOOP)
+ NEWFLDV(LOOP) = U(LOOP)*S(LOOP) + V(LOOP)*C(LOOP)
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 9. Return.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hsp2gg.F b/interpolation/hsp2gg.F
new file mode 100755
index 0000000..d112785
--- /dev/null
+++ b/interpolation/hsp2gg.F
@@ -0,0 +1,181 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HSP2GG(KTRUNC,KGAUSS,KPTS,PLATS,KSIZE)
+C
+C---->
+C**** HSP2GG
+C
+C Purpose
+C -------
+C
+C This routine finds a suitable gaussian grid for a given
+C spectral truncation.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HSP2GG(KTRUNC,KGAUSS,KPTS,KSIZE)
+C
+C
+C Input parameters
+C ----------------
+C
+C KTRUNC - The spectral truncation
+C
+C
+C Output parameters
+C -----------------
+C
+C KGAUSS - The gaussian number
+C KPTS - Array giving number of points along each line of latitude
+C in the reduced gaussian grid (both hemispheres)
+C PLATS - Array giving gaussian latitudes (both hemispheres)
+C KSIZE - The number of points in the reduced gaussian grid
+C
+C Returns 0 if all OK, otherwise there is an error.
+C
+C
+C Common block usage
+C ------------------
+C
+C None
+C
+C
+C Method
+C ------
+C
+C None
+C
+C
+C Externals
+C ---------
+C
+C JGETGG - Reads the definition of a gaussian grid
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF February 2001
+C
+C
+C Modifications
+C -------------
+C
+C S.Curic ECMWF March 2005
+C Added checking for a automatic trancation T255, T399, T799, T2047
+C and corresponding gaussian grid.
+C
+C S.Curic ECMWF April 2008
+C Added checking for a automatic trancation T1279
+C and corresponding gaussian grid.
+C
+C
+C S.Curic ECMWF Semptember 2009
+C Match T255 and T213 against N128 instead of N160
+C upon Alan Geer request
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Function arguments
+C
+ INTEGER KTRUNC, KGAUSS, KPTS(*), KSIZE
+ REAL PLATS(*)
+C
+C Local variables
+C
+ INTEGER LOOP, IRET
+C
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HSP2GG = 0
+C
+ IF( (KTRUNC.EQ.2047).OR.(KTRUNC.EQ.2048) ) THEN ! Mariano
+ KGAUSS = 1024
+ ELSE IF( (KTRUNC.EQ.1279).OR.(KTRUNC.EQ.1280) ) THEN ! Jan Haseler
+ KGAUSS = 640
+ ELSE IF( (KTRUNC.EQ.799).OR.(KTRUNC.EQ.800) ) THEN ! Oper 2005
+ KGAUSS = 400
+ ELSE IF( (KTRUNC.EQ.639).OR.(KTRUNC.EQ.640) ) THEN
+ KGAUSS = 320
+ ELSE IF( (KTRUNC.EQ.511).OR.(KTRUNC.EQ.512) ) THEN ! Oper 2004
+ KGAUSS = 256
+ ELSE IF( (KTRUNC.EQ.399).OR.(KTRUNC.EQ.400) ) THEN ! Enfo 2005
+ KGAUSS = 200
+ ELSE IF( (KTRUNC.EQ.319).OR.(KTRUNC.EQ.320) ) THEN
+ KGAUSS = 160
+ ELSE IF( (KTRUNC.EQ.255).OR.(KTRUNC.EQ.256) ) THEN ! Enfo 2004
+ KGAUSS = 128
+ ELSE IF( (KTRUNC.EQ.213).OR.(KTRUNC.EQ.214) ) THEN
+ KGAUSS = 128
+ ELSE IF( (KTRUNC.EQ.159).OR.(KTRUNC.EQ.160) ) THEN
+ KGAUSS = 80
+ ELSE IF( (KTRUNC.EQ.106).OR.(KTRUNC.EQ.107) ) THEN
+ KGAUSS = 80
+ ELSE IF( (KTRUNC.EQ.95) .OR.(KTRUNC.EQ.96 ) ) THEN
+ KGAUSS = 48
+ ELSE IF( (KTRUNC.EQ.63) .OR.(KTRUNC.EQ.64 ) ) THEN
+ KGAUSS = 48
+ ELSE
+ CALL INTLOG(JP_ERROR,'HSP2GG: Unmatched truncation',KTRUNC)
+ HSP2GG = 1
+ GOTO 900
+ ENDIF
+C
+C Get the reduced gaussian grid information and count the
+C number of points.
+C
+ CALL JGETGG(KGAUSS,'R',PLATS,KPTS,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HSP2GG: JGETGG failed to get gaussian data',JPQUIET)
+ HSP2GG = 2
+ GOTO 900
+ ENDIF
+C
+ KSIZE = 0
+ DO LOOP = 1, KGAUSS*2
+ KSIZE = KSIZE + KPTS(LOOP)
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C Section 9. Return.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hsp2gg2.F b/interpolation/hsp2gg2.F
new file mode 100755
index 0000000..661b90b
--- /dev/null
+++ b/interpolation/hsp2gg2.F
@@ -0,0 +1,224 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HSP2GG2(KTRUNC,NS,EW,KGAUSS,KPTS,PLATS,KSIZE)
+C
+C---->
+C**** HSP2GG2
+C
+C Purpose
+C -------
+C
+C This routine finds a suitable gaussian grid for a given
+C spectral truncation.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HSP2GG2(KTRUNC,KGAUSS,KPTS,KSIZE)
+C
+C
+C Input parameters
+C ----------------
+C
+C KTRUNC - The spectral truncation
+C
+C
+C Output parameters
+C -----------------
+C
+C KGAUSS - The gaussian number
+C KPTS - Array giving number of points along each line of latitude
+C in the reduced gaussian grid (both hemispheres)
+C PLATS - Array giving gaussian latitudes (both hemispheres)
+C KSIZE - The number of points in the reduced gaussian grid
+C
+C Returns 0 if all OK, otherwise there is an error.
+C
+C
+C Common block usage
+C ------------------
+C
+C None
+C
+C
+C Method
+C ------
+C
+C None
+C
+C
+C Externals
+C ---------
+C
+C JGETGG - Reads the definition of a gaussian grid
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF February 2001
+C
+C
+C Modifications
+C -------------
+C
+C S.Curic ECMWF March 2005
+C Added checking for a automatic trancation T255, T399, T799, T2047
+C and corresponding gaussian grid.
+C
+C S.Curic ECMWF April 2008
+C Added checking for a automatic trancation T1279
+C and corresponding gaussian grid.
+C
+C
+C S.Curic ECMWF Semptember 2009
+C Match T255 and T213 against N128 instead of N160
+C upon Alan Geer request
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Function arguments
+C
+ INTEGER KTRUNC, KGAUSS, KPTS(*), KSIZE
+ REAL NS, EW, STEP
+ REAL PLATS(*)
+#include "jparams.h"
+C
+C Local variables
+C
+ INTEGER LOOP, IRET
+ LOGICAL LDEBUG
+C
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+ STEP = MIN(ABS(NS),ABS(EW))
+C
+ 100 CONTINUE
+C
+ HSP2GG2 = 0
+c
+ CALL JDEBUG()
+ LDEBUG = ( NDBG.NE.0 )
+
+C 2.5 and greater -> T63
+C
+ IF( STEP.GE.2.5 ) THEN
+ KTRUNC = 63
+ KGAUSS = 48
+ GOTO 890
+ ENDIF
+C
+C 1.5 to 2.5 -> T106
+C
+ IF( STEP.GE.1.5 ) THEN
+ KTRUNC = 106
+ KGAUSS = 80
+ GOTO 890
+ ENDIF
+C
+C 0.6 to 1.5 -> T213
+C
+ IF( STEP.GE.0.6 ) THEN
+ KTRUNC = 213
+ KGAUSS = 128
+ GOTO 890
+ ENDIF
+C
+C 0.4 to 0.6 -> T319
+C
+ IF( STEP.GE.0.4 ) THEN
+ KTRUNC = 319
+ KGAUSS = 160
+ GOTO 890
+ ENDIF
+C
+C 0.3 to 0.4 -> T511
+C
+ IF( STEP.GE.0.3 ) THEN
+ KTRUNC = 511
+ KGAUSS = 256
+ GOTO 890
+ ENDIF
+C
+C 0.15 to 0.3 -> T799
+C
+ IF( STEP.GE.0.15 ) THEN
+ KTRUNC = 799
+ KGAUSS = 400
+ GOTO 890
+ ENDIF
+
+C
+C 0.09 to 0.15 -> T1279
+C
+ IF( STEP.GE.0.09 ) THEN
+ KTRUNC = 1279
+ KGAUSS = 640
+ GOTO 890
+ ENDIF
+c
+ KTRUNC = 2047
+ KGAUSS = 1024
+C
+C Get the reduced gaussian grid information and count the
+C number of points.
+C
+ 890 CONTINUE
+ CALL JGETGG(KGAUSS,'R',PLATS,KPTS,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HSP2GG2: JGETGG failed to get gaussian data',JPQUIET)
+ HSP2GG2 = 2
+ GOTO 900
+ ENDIF
+C
+ KSIZE = 0
+ DO LOOP = 1, KGAUSS*2
+ KSIZE = KSIZE + KPTS(LOOP)
+ ENDDO
+
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'HSP2GG2: Corresponding Spectral Truncation:',KTRUNC)
+ CALL INTLOG(JP_DEBUG,
+ X 'HSP2GG2: Corresponding Gaussian Number:',KGAUSS)
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 9. Return.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hsp2gg3.F b/interpolation/hsp2gg3.F
new file mode 100755
index 0000000..b8ef2a9
--- /dev/null
+++ b/interpolation/hsp2gg3.F
@@ -0,0 +1,191 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION HSP2GG3(KTRUNC,KGAUSS,KPTS,PLATS,KSIZE)
+C
+C---->
+C**** HSP2GG3
+C
+C Purpose
+C -------
+C
+C This routine finds a suitable gaussian grid for a given
+C spectral truncation.
+C
+C
+C Interface
+C ---------
+C
+C IRET = HSP2GG3(KTRUNC,KGAUSS,KPTS,KSIZE)
+C
+C
+C Input parameters
+C ----------------
+C
+C KTRUNC - The spectral truncation
+C
+C
+C Output parameters
+C -----------------
+C
+C KGAUSS - The gaussian number
+C KPTS - Array giving number of points along each line of latitude
+C in the reduced gaussian grid (both hemispheres)
+C PLATS - Array giving gaussian latitudes (both hemispheres)
+C KSIZE - The number of points in the reduced gaussian grid
+C
+C Returns 0 if all OK, otherwise there is an error.
+C
+C
+C Common block usage
+C ------------------
+C
+C None
+C
+C
+C Method
+C ------
+C
+C None
+C
+C
+C Externals
+C ---------
+C
+C JGETGG - Reads the definition of a gaussian grid
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF February 2001
+C
+C
+C Modifications
+C -------------
+C
+C S.Curic ECMWF March 2005
+C Added checking for a automatic trancation T255, T399, T799, T2047
+C and corresponding gaussian grid.
+C
+C S.Curic ECMWF April 2008
+C Added checking for a automatic trancation T1279
+C and corresponding gaussian grid.
+C
+C
+C S.Curic ECMWF Semptember 2009
+C Match T255 and T213 against N128 instead of N160
+C upon Alan Geer request
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Function arguments
+C
+ INTEGER KTRUNC, KGAUSS, KPTS(*), KSIZE
+ REAL PLATS(*)
+#include "jparams.h"
+C
+C Local variables
+C
+ INTEGER LOOP, IRET
+ LOGICAL LDEBUG
+C
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HSP2GG3 = 0
+
+ CALL JDEBUG()
+ LDEBUG = ( NDBG.NE.0 )
+C
+ IF(KGAUSS.EQ.1024) THEN ! Mariano
+ KTRUNC = 2047
+ ELSEIF(KTRUNC.EQ.640) THEN ! Jan Haseler
+ KTRUNC = 1279
+ ELSEIF(KGAUSS.EQ.400) THEN ! Oper 2005
+ KTRUNC = 799
+ ELSEIF(KGAUSS.EQ.320) THEN
+ KTRUNC = 639
+ ELSEIF(KGAUSS.EQ.256) THEN ! Oper 2004
+ KTRUNC = 511
+ ELSEIF(KGAUSS.EQ.200) THEN ! Enfo 2005
+ KTRUNC = 399
+ ELSEIF(KGAUSS.EQ.160) THEN
+ KTRUNC = 319
+ ELSEIF(KGAUSS.EQ.128) THEN ! Enfo 2004
+ KTRUNC = 255
+ ELSEIF(KGAUSS.EQ.128) THEN
+ KTRUNC = 213
+ ELSEIF(KGAUSS.EQ.80) THEN
+ KTRUNC = 159
+ ELSEIF(KGAUSS.EQ.48) THEN
+ KTRUNC = 95
+ ELSEIF(KGAUSS.EQ.48) THEN
+ KTRUNC = 63
+ ELSE
+ CALL INTLOG(JP_ERROR,'HSP2GG3: Unmatched truncation',KTRUNC)
+ HSP2GG3 = 1
+ GOTO 900
+ ENDIF
+C
+C Get the reduced gaussian grid information and count the
+C number of points.
+C
+ CALL JGETGG(KGAUSS,'R',PLATS,KPTS,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'HSP2GG3: JGETGG failed to get gaussian data',JPQUIET)
+ HSP2GG3 = 2
+ GOTO 900
+ ENDIF
+C
+ KSIZE = 0
+ DO LOOP = 1, KGAUSS*2
+ KSIZE = KSIZE + KPTS(LOOP)
+ ENDDO
+
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'HSP2GG3: Output Gaussian number :',KGAUSS)
+ CALL INTLOG(JP_DEBUG,
+ X 'HSP2GG3: Corresponding Spectral Truncation:',KTRUNC)
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 9. Return.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/hwts12.F b/interpolation/hwts12.F
new file mode 100755
index 0000000..8858f49
--- /dev/null
+++ b/interpolation/hwts12.F
@@ -0,0 +1,290 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE HWTS12
+ X (KLEN,KSCHEME,KLA,PDLAT,PLATIN,PDLO0,PDLO1,PDLO2,PDLO3,NEIGH,
+ X PWTS)
+C
+C---->
+C**** HWTS12
+C
+C Purpose
+C -------
+C
+C This routine accepts a vector of points and calculates the
+C interpolation weightings for each point suitable for the
+C horizontal interpolation.
+C
+C
+C Interface
+C ---------
+C
+C CALL HWTS12
+C X (KLEN,KSCHEME,KLA,PDLAT,PLATIN,PDLO0,PDLO1,PDLO2,PDLO3,NEIGH,
+C X PWTS)
+C
+C
+C Input parameters
+C ----------------
+C
+C KLEN - Number of points along the vector.
+C KSCHEME - Flag showing interpolation scheme to use for point
+C 0 = 12-point
+C 1 = 4-point bilinear
+C 2 = nearest neighbour
+C KLA - Latitude number in original field of latitude north of
+C point in the vector.
+C PDLAT - Meridian linear weight.
+C PLATIN - Gaussian latitudes.
+C PDLO0 - Zonal linear weight for the latitude of point 5.
+C PDLO1 - Zonal linear weight for the latitude of point 1.
+C PDLO2 - Zonal linear weight for the latitude of point 3.
+C PDLO3 - Zonal linear weight for the latitude of point 11.
+C NEIGH - List of indices in the original field of neighbouring
+C point values.
+C
+C
+C Output parameters
+C -----------------
+C
+C PWTS - Weights for interpolation.
+C
+C Common block usage
+C ------------------
+C
+C None.
+C
+C
+C Method
+C ------
+C
+C Numbering of the points (I is the interpolation point):
+C
+C 13 5 6 14
+C
+C 7 1 2 8
+C (I)
+C 9 3 4 10
+C
+C 15 11 12 16
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Reference
+C ---------
+C
+C ECMWF Meteorological Bulletin M1.6/7
+C IFS Documentation
+C Part VI: Technical and Computational Procedures (CY21R4)
+C March 2000
+C Section 2.3
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+C Parameters
+C
+ INTEGER JP12PT, JP4PT, JPNEARN
+ PARAMETER (JP12PT = 0)
+ PARAMETER (JP4PT = 1)
+ PARAMETER (JPNEARN = 2)
+C
+C Function arguments
+C
+ INTEGER KLEN, KSCHEME(KLEN), KLA(KLEN)
+ REAL PDLAT(KLEN), PLATIN(*)
+ REAL PDLO0(KLEN), PDLO1(KLEN), PDLO2(KLEN), PDLO3(KLEN)
+ INTEGER NEIGH(12,*)
+ REAL PWTS(12,*)
+C
+C Local variables
+C
+ INTEGER NEXT, LOOP
+ INTEGER ILA0G, ILA1G, ILA2G, ILA3G
+ REAL ZDLAT, ZDY, ZDY10, ZDY21, ZDY32
+ REAL ZDLO1, ZDLO2, ZWXN0, ZWXN1, ZWXN2, ZWXN3
+ REAL ZWY0, ZWY1, ZWY2, ZWY3
+ REAL ZWXNN, ZCXNN, ZWXSS, ZCXSS
+ REAL ZWXS0, ZWXS1, ZWXS2, ZWXS3
+C
+C Inline functions
+C
+ REAL ALPHA, F2, F3, F4
+C
+ F2(ALPHA) = ((ALPHA+1.0) * (ALPHA-2.0) * (ALPHA-1.0))/2.0
+C
+ F3(ALPHA) = - ((ALPHA+1.0) * (ALPHA-2.0) * ALPHA)/2.0
+C
+ F4(ALPHA) = (ALPHA * (ALPHA-1.0) * (ALPHA+1.0))/6.0
+C
+C -----------------------------------------------------------------|
+C Process each point in the vector.
+C -----------------------------------------------------------------|
+C
+ DO NEXT = 1,KLEN
+C
+C Clear the weights for the current point
+C
+ DO LOOP = 1, 12
+ PWTS(LOOP,NEXT) = 0.0
+ ENDDO
+C
+C Use appropriate interpolation scheme for the current point
+C
+C -----------------------------------------------------------------|
+C Nearest point selection
+C -----------------------------------------------------------------|
+C
+ IF( KSCHEME(NEXT).EQ.JPNEARN ) THEN
+C
+ DO LOOP = 1, 4
+ IF( NEIGH(LOOP,NEXT).NE.0 ) PWTS(LOOP,NEXT) = 1.0
+ ENDDO
+C
+ GOTO 900
+C
+C -----------------------------------------------------------------|
+C 4-point interpolation
+C -----------------------------------------------------------------|
+C
+ ELSE IF( KSCHEME(NEXT).EQ.JP4PT ) THEN
+C
+ PWTS(1,NEXT) = (1.0 - PDLO2(NEXT)) * (1.0 - PDLAT(NEXT))
+ PWTS(2,NEXT) = PDLO2(NEXT) * (1.0 - PDLAT(NEXT))
+ PWTS(3,NEXT) = (1.0 - PDLO1(NEXT)) * PDLAT(NEXT)
+ PWTS(4,NEXT) = PDLO1(NEXT) * PDLAT(NEXT)
+C
+ GOTO 900
+C
+C -----------------------------------------------------------------|
+C 12-point interpolation
+C -----------------------------------------------------------------|
+C
+ ELSE
+C
+C Setup latitude numbers for the 4 rows.
+C
+ ILA1G = KLA(NEXT)
+ ILA0G = ILA1G - 1
+ ILA2G = ILA1G + 1
+ ILA3G = ILA1G + 2
+C
+C Setup the weights between rows.
+C
+ ZDLAT = PDLAT(NEXT)
+ ZDY = ZDLAT * (PLATIN(ILA2G) - PLATIN(ILA1G))
+ ZDY10 = PLATIN(ILA1G) - PLATIN(ILA0G)
+ ZDY21 = PLATIN(ILA2G) - PLATIN(ILA1G)
+ ZDY32 = PLATIN(ILA3G) - PLATIN(ILA2G)
+C
+C -----------------------------------------------------------------|
+C Polynomial in x-direction.
+C -----------------------------------------------------------------|
+C
+C Northern parallel
+C
+ ZDLO1 = PDLO1(NEXT)
+ ZWXN1 = F2(ZDLO1)
+ ZWXN2 = F3(ZDLO1)
+ ZWXN3 = F4(ZDLO1)
+ ZWXN0 = 1.0 - ZWXN1 - ZWXN2 - ZWXN3
+C
+C Southern parallel
+C
+ ZDLO2 = PDLO2(NEXT)
+ ZWXS1 = F2(ZDLO2)
+ ZWXS2 = F3(ZDLO2)
+ ZWXS3 = F4(ZDLO2)
+ ZWXS0 = 1.0 - ZWXS1 - ZWXS2 - ZWXS3
+C
+C -----------------------------------------------------------------|
+C Polynomial in y-direction.
+C -----------------------------------------------------------------|
+C
+ ZWY3 = ((ZDY+ZDY10) * (ZDY) * (ZDY-ZDY21)) /
+ X ((ZDY10+ZDY21+ZDY32) * (ZDY21+ZDY32) * (ZDY32))
+ ZWY2 = ((ZDY+ZDY10) * (ZDY) * (ZDY-ZDY21-ZDY32)) /
+ X ((ZDY10+ZDY21) * (ZDY21) * (-ZDY32))
+ ZWY1 = ((ZDY+ZDY10) * (ZDY-ZDY21) * (ZDY-ZDY21-ZDY32)) /
+ X ((ZDY10) * (-ZDY21) * (-ZDY21-ZDY32))
+ ZWY0 = 1.0 - ZWY1 - ZWY2 - ZWY3
+C
+C -----------------------------------------------------------------|
+C Linear parts for extreme rows.
+C -----------------------------------------------------------------|
+C
+C Northernmost
+C
+ ZWXNN = PDLO0(NEXT)
+ ZCXNN = 1.0 - PDLO0(NEXT)
+C
+C Southernmost
+C
+ ZWXSS = PDLO3(NEXT)
+ ZCXSS = 1.0 - PDLO3(NEXT)
+C
+C -----------------------------------------------------------------|
+C Weights for 12 points interpolation.
+C -----------------------------------------------------------------|
+C
+ PWTS( 1,NEXT) = ZWXN1 * ZWY1
+ PWTS( 2,NEXT) = ZWXN2 * ZWY1
+ PWTS( 3,NEXT) = ZWXS1 * ZWY2
+ PWTS( 4,NEXT) = ZWXS2 * ZWY2
+ PWTS( 5,NEXT) = ZCXNN * ZWY0
+ PWTS( 6,NEXT) = ZWXNN * ZWY0
+ PWTS( 7,NEXT) = ZWXN0 * ZWY1
+ PWTS( 8,NEXT) = ZWXN3 * ZWY1
+ PWTS( 9,NEXT) = ZWXS0 * ZWY2
+ PWTS(10,NEXT) = ZWXS3 * ZWY2
+ PWTS(11,NEXT) = ZCXSS * ZWY3
+ PWTS(12,NEXT) = ZWXSS * ZWY3
+C
+ GOTO 900
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C End of processing for current point in vector.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ ENDDO
+C
+ RETURN
+ END
diff --git a/interpolation/hwtsll.F b/interpolation/hwtsll.F
new file mode 100755
index 0000000..8d8e11c
--- /dev/null
+++ b/interpolation/hwtsll.F
@@ -0,0 +1,290 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE HWTSLL
+ X (KLEN,KSCHEME,KLA,PDLAT,PLATINC,PDLO0,PDLO1,PDLO2,PDLO3,NEIGH,
+ X PWTS)
+C
+C---->
+C**** HWTSLL
+C
+C Purpose
+C -------
+C
+C This routine accepts a vector of points and calculates the
+C interpolation weightings for each point suitable for the
+C horizontal interpolation.
+C
+C
+C Interface
+C ---------
+C
+C CALL HWTSLL
+C X (KLEN,KSCHEME,KLA,PDLAT,PLATINC,PDLO0,PDLO1,PDLO2,PDLO3,NEIGH,
+C X PWTS)
+C
+C
+C Input parameters
+C ----------------
+C
+C KLEN - Number of points along the vector.
+C KSCHEME - Flag showing interpolation scheme to use for point
+C 0 = 12-point
+C 1 = 4-point bilinear
+C 2 = nearest neighbour
+C KLA - Latitude number in original field of latitude north of
+C point in the vector.
+C PDLAT - Meridian linear weight.
+C PLATINC - Increment between latitudes.
+C PDLO0 - Zonal linear weight for the latitude of point 5.
+C PDLO1 - Zonal linear weight for the latitude of point 1.
+C PDLO2 - Zonal linear weight for the latitude of point 3.
+C PDLO3 - Zonal linear weight for the latitude of point 11.
+C NEIGH - List of indices in the original field of neighbouring
+C point values.
+C
+C
+C Output parameters
+C -----------------
+C
+C PWTS - Weights for interpolation.
+C
+C Common block usage
+C ------------------
+C
+C None.
+C
+C
+C Method
+C ------
+C
+C Numbering of the points (I is the interpolation point):
+C
+C 13 5 6 14
+C
+C 7 1 2 8
+C (I)
+C 9 3 4 10
+C
+C 15 11 12 16
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Reference
+C ---------
+C
+C ECMWF Meteorological Bulletin M1.6/7
+C IFS Documentation
+C Part VI: Technical and Computational Procedures (CY21R4)
+C March 2000
+C Section 2.3
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+C Parameters
+C
+ INTEGER JP12PT, JP4PT, JPNEARN
+ PARAMETER (JP12PT = 0)
+ PARAMETER (JP4PT = 1)
+ PARAMETER (JPNEARN = 2)
+C
+C Function arguments
+C
+ INTEGER KLEN, KSCHEME(KLEN), KLA(KLEN)
+ REAL PDLAT(KLEN), PLATINC
+ REAL PDLO0(KLEN), PDLO1(KLEN), PDLO2(KLEN), PDLO3(KLEN)
+ INTEGER NEIGH(12,*)
+ REAL PWTS(12,*)
+C
+C Local variables
+C
+ INTEGER NEXT, LOOP
+ INTEGER ILA0G, ILA1G, ILA2G, ILA3G
+ REAL ZDLAT, ZDY, ZDY10, ZDY21, ZDY32
+ REAL ZDLO1, ZDLO2, ZWXN0, ZWXN1, ZWXN2, ZWXN3
+ REAL ZWY0, ZWY1, ZWY2, ZWY3
+ REAL ZWXNN, ZCXNN, ZWXSS, ZCXSS
+ REAL ZWXS0, ZWXS1, ZWXS2, ZWXS3
+C
+C Inline functions
+C
+ REAL ALPHA, F2, F3, F4
+C
+ F2(ALPHA) = ((ALPHA+1.0) * (ALPHA-2.0) * (ALPHA-1.0))/2.0
+C
+ F3(ALPHA) = - ((ALPHA+1.0) * (ALPHA-2.0) * ALPHA)/2.0
+C
+ F4(ALPHA) = (ALPHA * (ALPHA-1.0) * (ALPHA+1.0))/6.0
+C
+C -----------------------------------------------------------------|
+C Process each point in the vector.
+C -----------------------------------------------------------------|
+C
+ DO NEXT = 1,KLEN
+C
+C Clear the weights for the current point
+C
+ DO LOOP = 1, 12
+ PWTS(LOOP,NEXT) = 0.0
+ ENDDO
+C
+C Use appropriate interpolation scheme for the current point
+C
+C -----------------------------------------------------------------|
+C Nearest point selection
+C -----------------------------------------------------------------|
+C
+ IF( KSCHEME(NEXT).EQ.JPNEARN ) THEN
+C
+ DO LOOP = 1, 4
+ IF( NEIGH(LOOP,NEXT).NE.0 ) PWTS(LOOP,NEXT) = 1.0
+ ENDDO
+C
+ GOTO 900
+C
+C -----------------------------------------------------------------|
+C 4-point interpolation
+C -----------------------------------------------------------------|
+C
+ ELSE IF( KSCHEME(NEXT).EQ.JP4PT ) THEN
+C
+ PWTS(1,NEXT) = (1.0 - PDLO2(NEXT)) * (1.0 - PDLAT(NEXT))
+ PWTS(2,NEXT) = PDLO2(NEXT) * (1.0 - PDLAT(NEXT))
+ PWTS(3,NEXT) = (1.0 - PDLO1(NEXT)) * PDLAT(NEXT)
+ PWTS(4,NEXT) = PDLO1(NEXT) * PDLAT(NEXT)
+C
+ GOTO 900
+C
+C -----------------------------------------------------------------|
+C 12-point interpolation
+C -----------------------------------------------------------------|
+C
+ ELSE
+C
+C Setup latitude numbers for the 4 rows.
+C
+ ILA1G = KLA(NEXT)
+ ILA0G = ILA1G - 1
+ ILA2G = ILA1G + 1
+ ILA3G = ILA1G + 2
+C
+C Setup the weights between rows.
+C
+ ZDLAT = PDLAT(NEXT)
+ ZDY = ZDLAT * PLATINC
+ ZDY10 = PLATINC
+ ZDY21 = PLATINC
+ ZDY32 = PLATINC
+C
+C -----------------------------------------------------------------|
+C Polynomial in x-direction.
+C -----------------------------------------------------------------|
+C
+C Northern parallel
+C
+ ZDLO1 = PDLO1(NEXT)
+ ZWXN1 = F2(ZDLO1)
+ ZWXN2 = F3(ZDLO1)
+ ZWXN3 = F4(ZDLO1)
+ ZWXN0 = 1.0 - ZWXN1 - ZWXN2 - ZWXN3
+C
+C Southern parallel
+C
+ ZDLO2 = PDLO2(NEXT)
+ ZWXS1 = F2(ZDLO2)
+ ZWXS2 = F3(ZDLO2)
+ ZWXS3 = F4(ZDLO2)
+ ZWXS0 = 1.0 - ZWXS1 - ZWXS2 - ZWXS3
+C
+C -----------------------------------------------------------------|
+C Polynomial in y-direction.
+C -----------------------------------------------------------------|
+C
+ ZWY3 = ((ZDY+ZDY10) * (ZDY) * (ZDY-ZDY21)) /
+ X ((ZDY10+ZDY21+ZDY32) * (ZDY21+ZDY32) * (ZDY32))
+ ZWY2 = ((ZDY+ZDY10) * (ZDY) * (ZDY-ZDY21-ZDY32)) /
+ X ((ZDY10+ZDY21) * (ZDY21) * (-ZDY32))
+ ZWY1 = ((ZDY+ZDY10) * (ZDY-ZDY21) * (ZDY-ZDY21-ZDY32)) /
+ X ((ZDY10) * (-ZDY21) * (-ZDY21-ZDY32))
+ ZWY0 = 1.0 - ZWY1 - ZWY2 - ZWY3
+C
+C -----------------------------------------------------------------|
+C Linear parts for extreme rows.
+C -----------------------------------------------------------------|
+C
+C Northernmost
+C
+ ZWXNN = PDLO0(NEXT)
+ ZCXNN = 1.0 - PDLO0(NEXT)
+C
+C Southernmost
+C
+ ZWXSS = PDLO3(NEXT)
+ ZCXSS = 1.0 - PDLO3(NEXT)
+C
+C -----------------------------------------------------------------|
+C Weights for 12 points interpolation.
+C -----------------------------------------------------------------|
+C
+ PWTS( 1,NEXT) = ZWXN1 * ZWY1
+ PWTS( 2,NEXT) = ZWXN2 * ZWY1
+ PWTS( 3,NEXT) = ZWXS1 * ZWY2
+ PWTS( 4,NEXT) = ZWXS2 * ZWY2
+ PWTS( 5,NEXT) = ZCXNN * ZWY0
+ PWTS( 6,NEXT) = ZWXNN * ZWY0
+ PWTS( 7,NEXT) = ZWXN0 * ZWY1
+ PWTS( 8,NEXT) = ZWXN3 * ZWY1
+ PWTS( 9,NEXT) = ZWXS0 * ZWY2
+ PWTS(10,NEXT) = ZWXS3 * ZWY2
+ PWTS(11,NEXT) = ZCXSS * ZWY3
+ PWTS(12,NEXT) = ZWXSS * ZWY3
+C
+ GOTO 900
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C End of processing for current point in vector.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ ENDDO
+C
+ RETURN
+ END
diff --git a/interpolation/hwtslsm.F b/interpolation/hwtslsm.F
new file mode 100755
index 0000000..fe0900f
--- /dev/null
+++ b/interpolation/hwtslsm.F
@@ -0,0 +1,487 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE HWTSLSM
+ X (KLEN,KSCHEME,KLA,PDLAT,PLATIN,PDLO0,PDLO1,PDLO2,PDLO3,NEIGH,
+ X LSMOLD,LSMNEW,PWTS)
+C
+C---->
+C**** HWTSLSM
+C
+C Purpose
+C -------
+C
+C This routine accepts a vector of points and calculates the
+C interpolation weightings for each point suitable for the
+C horizontal interpolation.
+C
+C
+C Interface
+C ---------
+C
+C CALL HWTSLSM
+C X (KLEN,KSCHEME,KLA,PDLAT,PLATIN,PDLO0,PDLO1,PDLO2,PDLO3,NEIGH,
+C X LSMOLD,LSMNEW,PWTS)
+C
+C
+C Input parameters
+C ----------------
+C
+C KLEN - Number of points along the vector.
+C KSCHEME - Flag showing interpolation scheme to use for point
+C 0 = 12-point
+C 1 = 4-point bilinear
+C 2 = nearest neighbour
+C KLA - Latitude number in original field of latitude north of
+C point in the vector.
+C PDLAT - Meridian linear weight.
+C PLATIN - Gaussian latitudes.
+C PDLO0 - Zonal linear weight for the latitude of point 5.
+C PDLO1 - Zonal linear weight for the latitude of point 1.
+C PDLO2 - Zonal linear weight for the latitude of point 3.
+C PDLO3 - Zonal linear weight for the latitude of point 11.
+C NEIGH - List of indices in the original field of neighbouring
+C point values.
+C LSMOLD - Array of land-sea mask values ( a reduced gaussian
+C field which matches the reduced gaussian field to be
+C used for interpolation)
+C LSMNEW - Vector of land-sea mask values for the input points
+C
+C
+C Output parameters
+C -----------------
+C
+C PWTS - Weights for interpolation.
+C
+C Common block usage
+C ------------------
+C
+C None.
+C
+C
+C Method
+C ------
+C
+C Numbering of the points (I is the interpolation point):
+C
+C 13 5 6 14
+C
+C 7 1 2 8
+C (I)
+C 9 3 4 10
+C
+C 15 11 12 16
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Reference
+C ---------
+C
+C ECMWF Meteorological Bulletin M1.6/7
+C IFS Documentation
+C Part VI: Technical and Computational Procedures (CY21R4)
+C March 2000
+C Section 2.3
+C
+C
+C Comments
+C --------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF March 2001
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C -----------------------------------------------------------------|
+C* Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+C Parameters
+C
+ INTEGER JP12PT, JP4PT, JPNEARN
+ PARAMETER (JP12PT = 0)
+ PARAMETER (JP4PT = 1)
+ PARAMETER (JPNEARN = 2)
+C
+C Function arguments
+C
+ INTEGER KLEN, KSCHEME(KLEN), KLA(KLEN)
+ REAL PDLAT(KLEN), PLATIN(*)
+ REAL PDLO0(KLEN), PDLO1(KLEN), PDLO2(KLEN), PDLO3(KLEN)
+ REAL LSMNEW(KLEN)
+ INTEGER NEIGH(12,*)
+ REAL LSMOLD(*),PWTS(12,*)
+C
+C Local variables
+C
+ INTEGER NEXT, LOOP
+ INTEGER ILA0G, ILA1G, ILA2G, ILA3G
+ INTEGER IMKOUT, IMKIN1, IMKIN2, IMKIN3, IMKIN4, IMKIN5, IMKIN6
+ INTEGER IMKIN7, IMKIN8, IMKIN9, IMKIN10, IMKIN11, IMKIN12
+ REAL ZDLAT, ZDY, ZDY10, ZDY21, ZDY32
+ REAL ZDLO, ZDLO1, ZDLO2, ZDLO3, ZWXN0, ZWXN1, ZWXN2, ZWXN3
+ REAL ZWY0, ZWY1, ZWY2, ZWY3
+ REAL ZWXNN, ZCXNN, ZWXSS, ZCXSS
+ REAL ZWXS0, ZWXS1, ZWXS2, ZWXS3
+ REAL ZWY, ZCY, ZWXN, ZCXN, ZWXS, ZCXS
+ REAL ZWLSI1, ZWLSI2, ZWLSI3, ZWLSI4, ZWLSI5, ZWLSI6
+ REAL ZWLSI7, ZWLSI8, ZWLSI9, ZWLSI10, ZWLSI11, ZWLSI12
+ REAL ZWLSI13, ZWLSI14, ZWLSI15, ZWLSI16, ZWLSI17
+ REAL ZEPSIL
+ DATA ZEPSIL/1.E-5/
+C
+C Inline functions
+C
+ REAL A, B, ADJUST
+ REAL ALPHA, BETA, GAMMA, DELTA, EPSILON, F2, F3, F4
+C
+ ADJUST(A,B) = 1.0 - INT(B + ZEPSIL)*(1.0 - A)
+C
+ F2(ALPHA,BETA,GAMMA,DELTA,EPSILON) =
+ X ALPHA * ((1.0 + BETA*GAMMA) *
+ X (1.0 + DELTA*(GAMMA-2.0)) *
+ X (1.0 + EPSILON*(GAMMA-3.0))) /
+ X ((1.0 - 2.0*DELTA) * (1.0 - 3.0*EPSILON))
+C
+ F3(ALPHA,BETA,GAMMA,DELTA,EPSILON) =
+ X ALPHA * ((1.0 + BETA*GAMMA) *
+ X (1.0 + DELTA*(GAMMA - 1.0)) *
+ X (1.0 + EPSILON*(GAMMA - 3.0))) /
+ X ((1.0 + BETA) * (1.0 - 2.0*EPSILON))
+C
+ F4(ALPHA,BETA,GAMMA,DELTA,EPSILON) =
+ X ALPHA * ((1.0 + BETA*GAMMA) *
+ X (1.0 + DELTA*(GAMMA - 1.0)) *
+ X (1.0 + EPSILON*(GAMMA - 2.0))) /
+ X ((1.0 + 2.0*BETA) * (1.0 + DELTA))
+C
+C -----------------------------------------------------------------|
+C Process each point in the vector.
+C -----------------------------------------------------------------|
+C
+ DO NEXT = 1,KLEN
+C
+C Clear the weights for the current point
+C
+ DO LOOP = 1, 12
+ PWTS(LOOP,NEXT) = 0.0
+ ENDDO
+C
+C Use appropriate interpolation scheme for the current point
+C
+C -----------------------------------------------------------------|
+C
+C Nearest point selection
+C
+C -----------------------------------------------------------------|
+C
+ IF( KSCHEME(NEXT).EQ.JPNEARN ) THEN
+C
+ DO LOOP = 1, 4
+ IF( NEIGH(LOOP,NEXT).NE.0 ) PWTS(LOOP,NEXT) = 1.0
+ ENDDO
+C
+ GOTO 900
+C
+C -----------------------------------------------------------------|
+C
+C 4-point interpolation
+C
+C -----------------------------------------------------------------|
+C
+ ELSE IF( KSCHEME(NEXT).EQ.JP4PT ) THEN
+C
+C -----------------------------------------------------------------|
+C Initialise the lsm weights
+C -----------------------------------------------------------------|
+C
+ ZWLSI1 = 1.0
+ ZWLSI2 = 1.0
+ ZWLSI3 = 1.0
+ ZWLSI4 = 1.0
+C
+ ZWLSI14 = 0.0
+ ZWLSI15 = 0.0
+ ZWLSI17 = 0.0
+C
+C Modify the weights according to whether or not the target
+C point matches its neighbours
+C
+ IMKOUT = NINT(LSMNEW(NEXT))
+C
+ IMKIN1 = NINT(LSMOLD(NEIGH(1,NEXT)))
+ IF( IMKIN1.NE.IMKOUT ) ZWLSI1 = 0.0
+C
+ IMKIN2 = NINT(LSMOLD(NEIGH(2,NEXT)))
+ IF( IMKIN2.NE.IMKOUT ) ZWLSI2 = 0.0
+C
+ IMKIN3 = NINT(LSMOLD(NEIGH(3,NEXT)))
+ IF( IMKIN3.NE.IMKOUT ) ZWLSI3 = 0.0
+C
+ IMKIN4 = NINT(LSMOLD(NEIGH(4,NEXT)))
+ IF( IMKIN4.NE.IMKOUT ) ZWLSI4 = 0.0
+C
+ IF( IMKIN1.NE.IMKOUT) ZWLSI1 = 0.0
+ IF( IMKIN2.NE.IMKOUT) ZWLSI2 = 0.0
+ IF( IMKIN3.NE.IMKOUT) ZWLSI3 = 0.0
+ IF( IMKIN4.NE.IMKOUT) ZWLSI4 = 0.0
+C
+ ZWLSI14 = MIN(ZWLSI1 + ZWLSI2, 1.0)
+ ZWLSI15 = MIN(ZWLSI3 + ZWLSI4, 1.0)
+ ZWLSI17 = MIN(ZWLSI14 + ZWLSI15, 1.0)
+C
+ ZWLSI1 = ADJUST(ZWLSI1,ZWLSI14)
+ ZWLSI2 = ADJUST(ZWLSI2,ZWLSI14)
+ ZWLSI3 = ADJUST(ZWLSI3,ZWLSI15)
+ ZWLSI4 = ADJUST(ZWLSI4,ZWLSI15)
+C
+ ZWLSI14 = ADJUST(ZWLSI17,ZWLSI14)
+ ZWLSI15 = ADJUST(ZWLSI17,ZWLSI15)
+C
+C -----------------------------------------------------------------|
+C Weights for bilinear interpolation.
+C -----------------------------------------------------------------|
+C
+
+ ZWY = ZWLSI15 * (1.0 + ZWLSI14 * (PDLAT(NEXT) - 1.0))
+ ZCY = 1.0 - ZWY
+C
+ ZWXN = ZWLSI2 * (1.0 + ZWLSI1 * (PDLO1(NEXT) - 1.0))
+ ZCXN = 1.0 - ZWXN
+C
+ ZWXS = ZWLSI4 * (1.0 + ZWLSI3 * (PDLO2(NEXT) - 1.0))
+ ZCXS = 1.0 - ZWXS
+C
+ PWTS(1,NEXT) = ZCXN * ZCY
+ PWTS(2,NEXT) = ZWXN * ZCY
+ PWTS(3,NEXT) = ZCXS * ZWY
+ PWTS(4,NEXT) = ZWXS * ZWY
+C
+ GOTO 900
+C
+C -----------------------------------------------------------------|
+C
+C 12-point interpolation
+C
+C -----------------------------------------------------------------|
+C
+ ELSE
+C
+C -----------------------------------------------------------------|
+C Initialise the lsm weights
+C -----------------------------------------------------------------|
+C
+ ZWLSI1 = 1.0
+ ZWLSI2 = 1.0
+ ZWLSI3 = 1.0
+ ZWLSI4 = 1.0
+ ZWLSI5 = 1.0
+ ZWLSI6 = 1.0
+ ZWLSI7 = 1.0
+ ZWLSI8 = 1.0
+ ZWLSI9 = 1.0
+ ZWLSI10 = 1.0
+ ZWLSI11 = 1.0
+ ZWLSI12 = 1.0
+C
+ ZWLSI13 = 0.0
+ ZWLSI14 = 0.0
+ ZWLSI15 = 0.0
+ ZWLSI16 = 0.0
+ ZWLSI17 = 0.0
+C
+C Modify the weights according to whether or not the target
+C point matches its neighbours
+C
+ IMKOUT = NINT(LSMNEW(NEXT))
+C
+ IMKIN1 = NINT(LSMOLD(NEIGH(1,NEXT)))
+ IF( IMKIN1.NE.IMKOUT ) ZWLSI1 = 0.0
+C
+ IMKIN2 = NINT(LSMOLD(NEIGH(2,NEXT)))
+ IF( IMKIN2.NE.IMKOUT ) ZWLSI2 = 0.0
+C
+ IMKIN3 = NINT(LSMOLD(NEIGH(3,NEXT)))
+ IF( IMKIN3.NE.IMKOUT ) ZWLSI3 = 0.0
+C
+ IMKIN4 = NINT(LSMOLD(NEIGH(4,NEXT)))
+ IF( IMKIN4.NE.IMKOUT ) ZWLSI4 = 0.0
+C
+ IMKIN5 = NINT(LSMOLD(NEIGH(5,NEXT)))
+ IF( IMKIN5.NE.IMKOUT ) ZWLSI5 = 0.0
+C
+ IMKIN6 = NINT(LSMOLD(NEIGH(6,NEXT)))
+ IF( IMKIN6.NE.IMKOUT ) ZWLSI6 = 0.0
+C
+ IMKIN7 = NINT(LSMOLD(NEIGH(7,NEXT)))
+ IF( IMKIN7.NE.IMKOUT ) ZWLSI7 = 0.0
+C
+ IMKIN8 = NINT(LSMOLD(NEIGH(8,NEXT)))
+ IF( IMKIN8.NE.IMKOUT ) ZWLSI8 = 0.0
+C
+ IMKIN9 = NINT(LSMOLD(NEIGH(9,NEXT)))
+ IF( IMKIN9.NE.IMKOUT ) ZWLSI9 = 0.0
+C
+ IMKIN10 = NINT(LSMOLD(NEIGH(10,NEXT)))
+ IF( IMKIN10.NE.IMKOUT ) ZWLSI10 = 0.0
+C
+ IMKIN11 = NINT(LSMOLD(NEIGH(11,NEXT)))
+ IF( IMKIN11.NE.IMKOUT ) ZWLSI11 = 0.0
+C
+ IMKIN12 = NINT(LSMOLD(NEIGH(12,NEXT)))
+ IF( IMKIN12.NE.IMKOUT ) ZWLSI12 = 0.0
+C
+ ZWLSI13 = MIN(ZWLSI5+ZWLSI6 ,1.0)
+ ZWLSI14 = MIN(ZWLSI7+ZWLSI1+ZWLSI2+ZWLSI8 ,1.0)
+ ZWLSI15 = MIN(ZWLSI9+ZWLSI3+ZWLSI4+ZWLSI10 ,1.0)
+ ZWLSI16 = MIN(ZWLSI11+ZWLSI12 ,1.0)
+ ZWLSI17 = MIN(ZWLSI13+ZWLSI14+ZWLSI15+ZWLSI16,1.0)
+C
+ ZWLSI1 = ADJUST(ZWLSI1,ZWLSI14)
+ ZWLSI2 = ADJUST(ZWLSI2,ZWLSI14)
+ ZWLSI3 = ADJUST(ZWLSI3,ZWLSI15)
+ ZWLSI4 = ADJUST(ZWLSI4,ZWLSI15)
+ ZWLSI5 = ADJUST(ZWLSI5,ZWLSI13)
+ ZWLSI6 = ADJUST(ZWLSI6,ZWLSI13)
+ ZWLSI7 = ADJUST(ZWLSI7,ZWLSI14)
+ ZWLSI8 = ADJUST(ZWLSI8,ZWLSI14)
+ ZWLSI9 = ADJUST(ZWLSI9,ZWLSI15)
+ ZWLSI10 = ADJUST(ZWLSI10,ZWLSI15)
+ ZWLSI11 = ADJUST(ZWLSI11,ZWLSI16)
+ ZWLSI12 = ADJUST(ZWLSI12,ZWLSI16)
+C
+ ZWLSI13 = ADJUST(ZWLSI13,ZWLSI17)
+ ZWLSI14 = ADJUST(ZWLSI14,ZWLSI17)
+ ZWLSI15 = ADJUST(ZWLSI15,ZWLSI17)
+ ZWLSI16 = ADJUST(ZWLSI16,ZWLSI17)
+C
+C Setup latitude numbers for the 4 rows.
+C
+ ILA1G = KLA(NEXT)
+ ILA0G = ILA1G - 1
+ ILA2G = ILA1G + 1
+ ILA3G = ILA1G + 2
+C
+C Setup the weights between rows.
+C
+ ZDLAT = PDLAT(NEXT)
+ ZDY = ZDLAT * (PLATIN(ILA2G) - PLATIN(ILA1G))
+ ZDY10 = PLATIN(ILA1G) - PLATIN(ILA0G)
+ ZDY21 = PLATIN(ILA2G) - PLATIN(ILA1G)
+ ZDY32 = PLATIN(ILA3G) - PLATIN(ILA2G)
+C
+C -----------------------------------------------------------------|
+C Polynomial in x-direction.
+C -----------------------------------------------------------------|
+C
+C Northern parallel
+C
+ ZDLO1 = PDLO1(NEXT)
+ ZWXN1 = F2(ZWLSI1,ZWLSI7,ZDLO1,ZWLSI2,ZWLSI8)
+ ZWXN2 = F3(ZWLSI2,ZWLSI7,ZDLO1,ZWLSI1,ZWLSI8)
+ ZWXN3 = F4(ZWLSI8,ZWLSI7,ZDLO1,ZWLSI1,ZWLSI2)
+ ZWXN0 = 1.0 - ZWXN1 - ZWXN2 - ZWXN3
+C
+C Southern parallel
+C
+ ZDLO2 = PDLO2(NEXT)
+ ZWXS1 = F2(ZWLSI3,ZWLSI9,ZDLO2,ZWLSI4,ZWLSI10)
+ ZWXS2 = F3(ZWLSI4,ZWLSI9,ZDLO2,ZWLSI3,ZWLSI10)
+ ZWXS3 = F4(ZWLSI10,ZWLSI9,ZDLO2,ZWLSI3,ZWLSI4)
+ ZWXS0 = 1.0 - ZWXS1 - ZWXS2 - ZWXS3
+C
+C -----------------------------------------------------------------|
+C Polynomial in y-direction.
+C -----------------------------------------------------------------|
+C
+ ZWY1 = ZWLSI14*((1.0 + ZWLSI13*(ZDY + ZDY10 - 1.0)) *
+ X (1.0 + ZWLSI15*(ZDY - ZDY21 - 1.0)) *
+ X (1.0 + ZWLSI16*(ZDY - ZDY21 - ZDY32 - 1.0))) /
+ X ((1.0 + ZWLSI13*(ZDY10 - 1.0)) *
+ X (1.0 + ZWLSI15*( -ZDY21 - 1.0)) *
+ X (1.0 + ZWLSI16*( -ZDY21 - ZDY32 - 1.0)))
+ ZWY2 = ZWLSI15*((1.0 + ZWLSI13*(ZDY + ZDY10 - 1.0)) *
+ X (1.0 + ZWLSI14*(ZDY - 1.0)) *
+ X (1.0 + ZWLSI16*(ZDY - ZDY21 - ZDY32 - 1.0))) /
+ X ((1.0 + ZWLSI13*(ZDY10 + ZDY21 - 1.0)) *
+ X (1.0 + ZWLSI14*(ZDY21 - 1.0)) *
+ X (1.0 + ZWLSI16*( -ZDY32 - 1.0)))
+ ZWY3 = ZWLSI16*((1.0 + ZWLSI13*(ZDY + ZDY10 - 1.0)) *
+ X (1.0 + ZWLSI14*(ZDY - 1.0)) *
+ X (1.0 + ZWLSI15*(ZDY - ZDY21 - 1.0))) /
+ X ((1.0 + ZWLSI13*(ZDY10 + ZDY21 + ZDY32 - 1.0)) *
+ X (1.0 + ZWLSI14*(ZDY21 + ZDY32 - 1.0)) *
+ X (1.0 + ZWLSI15*(ZDY32 - 1.0)))
+ ZWY0 = 1.0 - ZWY1 - ZWY2 - ZWY3
+C
+C -----------------------------------------------------------------|
+C Linear parts for extreme rows.
+C -----------------------------------------------------------------|
+C
+C Northernmost
+C
+ ZDLO = PDLO0(NEXT)
+ ZWXNN = ZWLSI6 * (1.0 + ZWLSI5 * (ZDLO - 1.0))
+ ZCXNN = 1.0 - ZWXNN
+C
+C Southernmost
+C
+ ZDLO3 = PDLO3(NEXT)
+ ZWXSS = ZWLSI12 * (1.0 + ZWLSI11 * (ZDLO3 - 1.0))
+ ZCXSS = 1.0 - ZWXSS
+C
+C -----------------------------------------------------------------|
+C Weights for 12 points interpolation.
+C -----------------------------------------------------------------|
+C
+ PWTS( 1,NEXT) = ZWXN1 * ZWY1
+ PWTS( 2,NEXT) = ZWXN2 * ZWY1
+ PWTS( 3,NEXT) = ZWXS1 * ZWY2
+ PWTS( 4,NEXT) = ZWXS2 * ZWY2
+ PWTS( 5,NEXT) = ZCXNN * ZWY0
+ PWTS( 6,NEXT) = ZWXNN * ZWY0
+ PWTS( 7,NEXT) = ZWXN0 * ZWY1
+ PWTS( 8,NEXT) = ZWXN3 * ZWY1
+ PWTS( 9,NEXT) = ZWXS0 * ZWY2
+ PWTS(10,NEXT) = ZWXS3 * ZWY2
+ PWTS(11,NEXT) = ZCXSS * ZWY3
+ PWTS(12,NEXT) = ZWXSS * ZWY3
+C
+ GOTO 900
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C End of processing for current point in vector.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ ENDDO
+C
+ RETURN
+ END
diff --git a/interpolation/iafree.F b/interpolation/iafree.F
new file mode 100755
index 0000000..d59011a
--- /dev/null
+++ b/interpolation/iafree.F
@@ -0,0 +1,267 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IAFREE (KPR, KERR)
+C
+C---->
+C**** *IAFREE*
+C
+C PURPOSE
+C _______
+C
+C Deallocate heap space used by grid-pt to grid-pt interpolation.
+C
+C INTERFACE
+C _________
+C
+C IERR = IAFREE (KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C None
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C Cray error codes
+C
+C -1 HPDEALLC block is already free (Warning only).
+C
+C 21201 HPDEALLC attempt to free block at address outside the
+C bounds of the heap.
+C 21202 HPDEALLC attempt to free block at address which was not
+C the beginning of a block.
+C 21203 HPDEALLC returning any other non zero code.
+C
+C Errors 21201 and 21202 should not occur and any occurrence
+C of one of these errors should be reported to Meteorological
+C Applications.
+C
+C Common block usage
+C __________________
+C
+C memreq.h - This file contains the memory request
+C definition variables.
+C
+C MADDR - The base addresses of the currently allocated
+C memory segments used and reset.
+C MREQUEST - The sizes of the current memory requests used
+C and reset.
+C
+C
+C EXTERNALS
+C _________
+C
+C INTLOG - Logs messages.
+C
+C Cray
+C
+C ABORTX - Standard routine to kill task.
+C HPDEALLC - Cray library routine to deallocate heap space.
+C
+C Sun and SGI
+C
+C JFREE - "Unix" routine to deallocate heap space.
+C
+C METHOD
+C ______
+C
+C The required heap space is allocated.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C None.
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* May 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers ECMWF Aug 1994
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "memreq.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Dummy arguments
+C
+ INTEGER KPR, KERR
+C
+C Local variables
+C
+ INTEGER IABORT, IERROR
+C
+ INTEGER JLEVEL
+C
+ INTEGER JPROUTINE
+C
+ PARAMETER (JPROUTINE = 21200)
+C
+C External functions
+C
+C _______________________________________________________
+C
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IAFREE: Section 1.',JPQUIET)
+C
+ IAFREE = 0
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,
+ X 'IAFREE: Free all heap space.',JPQUIET)
+C
+C _______________________________________________________
+C
+C
+C* Section 2. Free acquired space.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IAFREE: Section 2.',JPQUIET)
+C
+ IABORT = 0
+ IERROR = 0
+C
+ DO 210 JLEVEL = JPLEVEL, 1, -1
+C
+ IF (MREQUEST (JLEVEL) .GT. 0) THEN
+C
+#ifdef CRAY
+ CALL HPDEALLC (MADDR (JLEVEL), IERROR, IABORT)
+C
+ IF (IERROR .EQ. -4) THEN
+ IAFREE = - 1
+ IF (KERR .GE. 0) CALL INTLOG(JP_ERROR,
+ X 'IAFREE: Already free, the block at ', MADDR (JLEVEL))
+C
+ ELSE IF (IERROR .NE. 0) THEN
+C
+ IF (IERROR .EQ. -3) THEN
+C
+ IAFREE = JPROUTINE + 1
+C
+ IF (KERR .GE. 0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IAFREE: Heap deallocation failed.',IERROR)
+ CALL INTLOG(JP_ERROR,
+ X 'IAFREE: Block outside heap.',MADDR(JLEVEL))
+ ENDIF
+ ELSE IF (IERROR .EQ. -5) THEN
+C
+ IAFREE = JPROUTINE + 2
+C
+ IF (KERR .GE. 0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IAFREE: Heap deallocation failed.',IERROR)
+ CALL INTLOG(JP_ERROR,
+ X 'IAFREE: Not at start of block.',MADDR(JLEVEL))
+ ENDIF
+ ELSE
+C
+ IAFREE = JPROUTINE + 3
+C
+ IF (KERR .GE. 0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IAFREE: Heap deallocation failed.',IERROR)
+ CALL INTLOG(JP_ERROR,
+ X 'IAFREE: Attempt to free block at: ',MADDR(JLEVEL))
+ ENDIF
+ ENDIF
+C
+ IF (KERR .EQ. 0) CALL ABORTX ('IAFREE')
+ GO TO 900
+ ENDIF
+#else
+ CALL JFREE (MADDR (JLEVEL) )
+#endif
+C
+ MREQUEST (JLEVEL) = 0
+ MADDR (JLEVEL) = 0
+C
+ ENDIF
+C
+ 210 CONTINUE
+C
+C _______________________________________________________
+C
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IAFREE: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/iagcntl.F b/interpolation/iagcntl.F
new file mode 100755
index 0000000..e1d08fe
--- /dev/null
+++ b/interpolation/iagcntl.F
@@ -0,0 +1,717 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IAGCNTL(PIFELD, KILEN, POFELD, KOLEN, KILN,
+ X OIWEGLOBE, OINPOLE, OISPOLE, KOLN, OOWEGLOBE, OONPOLE,
+ X OOSPOLE, KPR, KERR)
+C
+C---->
+C**** *IAGCNTL*
+C
+C PURPOSE
+C _______
+C
+C The global controlling routine for interpolating between
+C regular Gaussian or latitude/longitude fields.
+C
+C INTERFACE
+C _________
+C
+C IERR = IAGCNTL(PIFELD, KILEN, POFELD, KOLEN, KILN, OIWEGLOBE,
+C X OINPOLE, OISPOLE, KOLN, OOWEGLOBE, OONPOLE, OOSPOLE, KPR,
+C X KERR)
+C
+C Input parameters
+C ________________
+C
+C PIFELD - The input field provided by the calling routine.
+C
+C KILEN - The length of the input field.
+C
+C KOLEN - The length of the output field.
+C
+C KILN - The Northern line number of the input field within
+C its Gaussian field.
+C
+C OIWEGLOBE - A flag indicating whether the input field is
+C global West to East.
+C
+C OINPOLE - A flag indicating whether the North pole is
+C included in the input field.
+C
+C OISPOLE - A flag indicating whether the South pole is
+C include in the input field.
+C
+C KOLN - The Northern line number of the output field
+C within its Gaussian field.
+C
+C OOWEGLOBE - A flag indicating whether the output field is
+C global West to East.
+C
+C OONPOLE - A flag indicating whether the North pole is
+C include in the output field.
+C
+C OOSPOLE - A flag indicating whether the South pole is
+C include in the output field.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C POFELD - The output field returned to the calling routine.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C 21801 The input data representation was not valid when the
+C grid was generated. This should not happen as the data
+C representation has been previously validated.
+C 21802 The output data representation was not valid when the
+C grid was generated. This should not happen as the data
+C representation has been previously validated.
+C 21803 Attempt to produce global West-East field where the input
+C field was not global.
+C 21804 Attempt to produce global North-South field where the
+C input field was not global.
+C
+C Common block usage
+C __________________
+C
+C grspace.h - The include file contains all the array space
+C for grid to grid interpolation.
+C
+C RIGAUSS - Real array of input field Gaussian latitudes is
+C used.
+C ROGAUSS - Real array of output field Gaussian latitudes is
+C used.
+C
+C MILATG - The input field latitudes.
+C MILONG - The input field longitudes.
+C MNSDIST - The distances to neighbouring latitude lines of
+C the input field from the associated line of
+C latitude in the output field.
+C MNSIND - The latitude line numbers (array offset) of the
+C input field associated with each line of
+C latitude in the output field.
+C MOLATG - The output field latitudes.
+C MOLONG - The output field longitudes.
+C MWEDIST - This array holds the distances to neighbouring
+C longitude points of the input field from the
+C associated longitude points in the output field.
+C MWEIND - This array holds the longitude points (array
+C offset) from the input field associated with
+C each longitude point in the output field.
+C RINPNT - Array used to aid vectorisation in processing
+C precipitation fields.
+C RMAX - Array used to aid vectorisation in normalising
+C interpolation weights and processing
+C precipitation fields.
+C WFACT - The array of interpolation weights for each
+C point in the output field.
+C
+C nifld.common - This file contains all the input field
+C definition variables.
+C
+C LCHANGE - Process change flag is used and set.
+C LSMCHNG - LSM change flag is used and set.
+C LSM - LSM usage flag is used.
+C LSMPAR - LSM parameter flag is used.
+C LPREC - Precipitation flag is used.
+C LWIND - Wind flag is used.
+C LSTAGGL - Staggered grid flag
+C
+C NIAREA - Input field area definition (N/W/S/E) is used.
+C NIGAUSS - Input field Gaussian truncation is used.
+C NIGRID - Input field grid definition (WE/NS) is used.
+C NINS - Number of grid points in NS direction for input
+C field is used.
+C NIREPR - Input field representation is used.
+C NIWE - Number of grid points in WE direction for input
+C field is used.
+C
+C nofld.common - This file contains all the output field
+C definition variables.
+C
+C NOAREA - Output field area definition (N/W/S/E) is used.
+C NOGAUSS - Output field Gaussian truncation is used.
+C NOGRID - Output field grid definition (WE/NS) is used.
+C NONS - Number of grid points in NS direction for output
+C field is used.
+C NOREPR - Output field representation is used.
+C NOWE - Number of grid points in WE direction for output
+C field is used.
+C
+C EXTERNALS
+C _________
+C
+C ABORTX - Standard routine to kill task.
+C IGDINS - Calculate the distances between points in an
+C output latitude array and its North and South
+C neighbours in the input latitude array.
+C IGDIWE - Calculate the distances between points in an
+C output longitude array and its West and East
+C neighbours in the input longitude array.
+C IGGMEM - This routine acquires heap space.
+C IGGRID - Generate the arrays of latitude and longitude
+C points for a Gaussian truncation and area.
+C IGINT - Calculate the basic unnormalised interpolation
+C weights.
+C IGLGRID - Generate the arrays of latitude and longitude
+C points for a regular latitude/longitude grid.
+C IGLSIZE - Evaluate the array sizes for a regular
+C latitude/longitude grid and area.
+C IGLSMB - Calculate the effects of the land-sea masks on
+C the unnormalised interpolation weights.
+C IGLSMD - Generate the land sea mask file information.
+C IGNORM - Normalise the array of interpolation weights.
+C IGPLSM - Force an interpolated land sea mask field back
+C to a real 0-1 field.
+C IGPOLEG - Calculates the values at the pole of a regular
+C latitude/longitude field when the input is a
+C Gaussian field.
+C IGPOLEW - Calculates the values at the pole of a regular
+C latitude/longitude wind field when the input is
+C a Gaussian field.
+C IGPREC - Perform additional interpolation for
+C precipitation fields.
+C ZPREC - Perform additional interpolation processes
+C for precipitation
+C IGSIZE - Evaluate the array sizes for a Gaussian
+C truncation and area.
+C IGTOG - Perform basic interpolation between regular input
+C and output fields.
+C INTLOG - Logs messages.
+C
+C METHOD
+C ______
+C
+C This is purely a controlling routine with all the work being
+C performed in the external routines.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C None
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* May 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C J.Chambers ECMWF Oct 1998
+C Allow field type for rotated grids.
+C
+C S.Curic ECMWF Oct 2005
+C Add zprec routine that Perform checking
+C of precipitation
+
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grspace.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 21800)
+C
+C Function arguments
+C
+ LOGICAL OIWEGLOBE, OINPOLE, OISPOLE, OOWEGLOBE, OONPOLE, OOSPOLE
+ INTEGER KILEN, KOLEN, KILN, KOLN, KPR, KERR
+ REAL PIFELD(KILEN), POFELD(KOLEN)
+C
+C Local variables
+C
+ LOGICAL LFAIL, LERROR, LDEBUG, LREGIN, LREGOUT
+ LOGICAL GINSPOLE, GIGLOBE, GISTAND, GONSPOLE, GOGLOBE, GOSTAND
+ LOGICAL GPREC,LSM_VALUES
+ CHARACTER*120 YIFILE, YOFILE
+ CHARACTER*12 YFLAG
+ INTEGER IIOFF, IIREC, IOOFF, IOREC, IERR
+C
+C Working copies of area and grid arrays that may be changed
+C
+ INTEGER IILGRID(2), IILLINE(2), IOLGRID(2), IOLLINE(2)
+C
+C External functions
+C
+ INTEGER IGDINS, IGDIWE, IGGMEM, IGGRID, IGINT, IGLGRID,
+ X IGLSMB, IGLSMD, IGNORM, IGPLSM, IGPOLEG, IGPOLEW, IGPREC,
+ X IGTOG, ZPREC
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialisation
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IAGCNTL = 0
+ IERR = 0
+C
+C Set all flag variables
+C
+ LDEBUG = (KPR.GE.1)
+ LFAIL = (KERR.EQ.0)
+ LERROR = (KERR.GE.0)
+ LREGIN = (NIREPR.EQ.JPREGULAR).OR.(NIREPR.EQ.JPREGROT)
+ LREGOUT = (NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT)
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Section 1.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'IAGCNTL: Input field definition parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Representation = ',NIREPR)
+ IF( NIWE.NE.0 ) CALL INTLOG(JP_DEBUG,
+ X 'IAGCNTL: Number W-E = ',NIWE)
+ IF( NINS.NE.0 ) CALL INTLOG(JP_DEBUG,
+ X 'IAGCNTL: Number N-S = ',NINS)
+ IF( (NIREPR.EQ.JPGAUSSIAN).OR.(NIREPR.EQ.JPQUASI) )
+ X CALL INTLOG(JP_DEBUG,'IAGCNTL: Gaussian truncation= ',NIGAUSS)
+ IF( LREGIN.AND.(NIGRID(1).NE.0) ) THEN
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Grid WE = ',NIGRID(1))
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Grid NS = ',NIGRID(2))
+ ENDIF
+ IF( NIAREA(1).NE.0 ) THEN
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Area North = ',NIAREA(1))
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Area West = ',NIAREA(2))
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Area South = ',NIAREA(3))
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Area East = ',NIAREA(4))
+ ENDIF
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'IAGCNTL: Output field definition parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Representation = ',NOREPR)
+ IF( NOWE.NE.0 ) CALL INTLOG(JP_DEBUG,
+ X 'IAGCNTL: Number W-E = ',NOWE)
+ IF( NONS.NE.0 ) CALL INTLOG(JP_DEBUG,
+ X 'IAGCNTL: Number N-S = ',NONS)
+ IF( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPQUASI) )
+ X CALL INTLOG(JP_DEBUG,'IAGCNTL: Gaussian truncation= ',NOGAUSS)
+ IF( LREGOUT.AND.(NOGRID(1).NE.0) ) THEN
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Grid WE = ',NOGRID(1))
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Grid NS = ',NOGRID(2))
+ ENDIF
+ IF( NOAREA(1).NE.0 ) THEN
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Area North = ',NOAREA(1))
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Area West = ',NOAREA(2))
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Area South = ',NOAREA(3))
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Area East = ',NOAREA(4))
+ ENDIF
+C
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Control flag status:',JPQUIET)
+C
+ IF( LSMCHNG ) THEN
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: LSM change TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: LSM change FALSE',JPQUIET)
+ ENDIF
+C
+ IF( LSM ) THEN
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: LSM flag TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: LSM flag FALSE',JPQUIET)
+ ENDIF
+C
+ IF( LWIND ) THEN
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Wind flag TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Wind flag FALSE',JPQUIET)
+ ENDIF
+C
+ IF( LPREC ) THEN
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Precipitn flag TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Precipitn flag FALSE',JPQUIET)
+ ENDIF
+C
+ IF( LSMPAR ) THEN
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: LSM param flag TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: LSM param flag FALSE',JPQUIET)
+ ENDIF
+ IF( LSTAGGL ) THEN
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Staggered flag TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IAGCNTL: Staggered flag FALSE',JPQUIET)
+ ENDIF
+ ENDIF
+C
+C The change of definition option spans sections 2 to 3
+C
+ IF( LCHANGE ) THEN
+C
+C -----------------------------------------------------------------|
+C* Section 2. Calculate space requirement.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,'IAGCNTL: Section 2.',JPQUIET)
+C
+C Get the required memory
+C
+ IAGCNTL = IGGMEM(KPR, KERR)
+ IF( IAGCNTL.GT.0 ) GOTO 900
+C
+C Input grid definition
+C
+ IF( NIREPR.EQ.JPGAUSSIAN ) THEN
+C
+ IAGCNTL = IGGRID(NIGAUSS, NIAREA, KILN, RIGAUSS,
+ X MILONG,NIWE,MILATG,NINS,OIWEGLOBE,KPR,KERR)
+ IF( IAGCNTL.GT.0 ) GOTO 900
+C
+ ELSEIF( LREGIN ) THEN
+C
+ IAGCNTL = IGLGRID(NIGRID, NIAREA, MILONG, NIWE, MILATG,
+ X NINS,OIWEGLOBE,KPR,KERR)
+ IF( IAGCNTL.GT.0 ) GOTO 900
+C
+ ELSE
+C
+ IAGCNTL = JPROUTINE + 1
+ IF( LERROR ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IAGCNTL: Illegal input representation = ',NIREPR)
+ IF( LFAIL ) CALL INTLOG(JP_FATAL,
+ X 'IAGCNTL: Interpolation failing.',JPQUIET)
+ ENDIF
+ GOTO 900
+C
+ ENDIF
+C
+C Is the input field global
+C
+ GINSPOLE = OINPOLE.AND.OISPOLE
+ GIGLOBE = OIWEGLOBE.AND.GINSPOLE
+C
+C Is the output field global North South
+C
+ GONSPOLE = OONPOLE.AND.OOSPOLE
+ GOGLOBE = OOWEGLOBE.AND.GONSPOLE
+
+ IF(GOGLOBE.AND.NOAREA(2).EQ.0) THEN
+ LGLOBL = .TRUE.
+ ELSE
+ LGLOBL = .FALSE.
+ ENDIF
+C
+C Output grid definition
+C
+ IF( NOREPR.EQ.JPGAUSSIAN ) THEN
+C
+ IAGCNTL = IGGRID(NOGAUSS, NOAREA, KOLN, ROGAUSS,
+ X MOLONG,NOWE,MOLATG,NONS,OOWEGLOBE,KPR,KERR)
+ IF( IAGCNTL.GT.0 ) GOTO 900
+C
+ ELSEIF( LREGOUT ) THEN
+C
+ IAGCNTL = IGLGRID(NOGRID, NOAREA, MOLONG, NOWE, MOLATG,
+ X NONS,OOWEGLOBE,KPR,KERR)
+ IF( IAGCNTL.GT.0 ) GOTO 900
+C
+ ELSE
+C
+ IAGCNTL = JPROUTINE + 2
+ IF( LERROR ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IAGCNTL: Illegal output representation = ',NOREPR)
+ IF( LFAIL ) CALL INTLOG(JP_FATAL,
+ X 'IAGCNTL: Interpolation failing.',JPQUIET)
+ ENDIF
+ GOTO 900
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Create output to input grid mapping and distance arrays
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( LDEBUG )
+ X CALL INTLOG(JP_DEBUG,'IAGCNTL: Section 3.',JPQUIET)
+C
+C First check that the input and output fields are compatible.
+C
+ IF( .NOT.GIGLOBE ) THEN
+C
+ IF( .NOT.OIWEGLOBE ) THEN
+C
+C Cannot produce global output field if input not global
+C
+ IF( OOWEGLOBE ) THEN
+ IAGCNTL = JPROUTINE + 3
+ IF( LERROR ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IAGCNTL: Cannot produce global output from',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'IAGCNTL: non-global input. The W-E input',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'IAGCNTL: direction was not global.',JPQUIET)
+ IF( LFAIL ) CALL INTLOG(JP_FATAL,
+ X 'IAGCNTL: Interpolation failing.',JPQUIET)
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+c Sinisa added NOT.LSTAGGL just for the sake of staggered grids
+C
+ IF( .NOT.GINSPOLE.AND.(.NOT.LSTAGGL) ) THEN
+C
+C Cannot produce global output field if input not global
+C
+ IF( GONSPOLE ) THEN
+ IAGCNTL = JPROUTINE + 4
+ IF( LERROR ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IAGCNTL: Cannot produce global output from',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'IAGCNTL: non-global input. The N-S input',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'IAGCNTL: direction was not global.',JPQUIET)
+ IF( LFAIL ) CALL INTLOG(JP_FATAL,
+ X 'IAGCNTL: Interpolation failing.',JPQUIET)
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+ ENDIF
+C
+ IAGCNTL = IGDINS(MILATG, NINS, MOLATG, NONS, OINPOLE, OISPOLE,
+ X MNSIND, MNSDIST, KPR, KERR)
+ IF( IAGCNTL.GT.0 ) GOTO 900
+C
+ IAGCNTL = IGDIWE(MILONG, NIWE, MOLONG, NOWE, OIWEGLOBE,
+ X MWEIND, MWEDIST, KPR, KERR)
+ IF( IAGCNTL.GT.0 ) GOTO 900
+C
+C The end of primary initialisation
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4. Create normalised weight arrays
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,'IAGCNTL: Section 4.',JPQUIET)
+C
+C The following code is affected by the Land Sea mask flag
+C
+ IF( LCHANGE.OR.LSMCHNG ) THEN
+C
+ IAGCNTL = IGINT(MWEDIST, NOWE, MNSDIST, NONS, WFACT, KPR, KERR)
+ IF( IAGCNTL.GT.0 ) GOTO 900
+C
+ IF( LSM ) THEN
+C
+ IAGCNTL = IGLSMD(NIDATE,NIREPR,NIGRID,NIGAUSS,NIAREA,KILN,
+ X YIFILE,GISTAND,IILGRID,IILLINE,IIREC,KPR,KERR)
+ IF( IAGCNTL.GT.0 ) GOTO 900
+C
+ IAGCNTL = IGLSMD(NODATE,NOREPR,NOGRID,NOGAUSS,NOAREA,KOLN,
+ X YOFILE,GOSTAND,IOLGRID,IOLLINE,IOREC,KPR,KERR)
+ IF( IAGCNTL.GT.0 ) GOTO 900
+C
+ IAGCNTL = IGLSMB(GISTAND, YIFILE, IIREC, IILGRID, IILLINE,
+ X GOSTAND,YOFILE,IOREC,IOLGRID,IOLLINE,KPR,KERR)
+ IF( IAGCNTL.GT.0 ) GOTO 900
+C
+ ENDIF
+C
+C Normalise the weights
+C
+ IAGCNTL = IGNORM(WFACT, RMAX, NOWE, NONS, KPR, KERR)
+ IF( IAGCNTL.GT.0 ) GOTO 900
+C
+C This marks the end of a change to the specification
+C Clear the Change flags LCHANGE and LSMCHNG
+C
+ LCHANGE = .FALSE.
+ LSMCHNG = .FALSE.
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 5. Basic interpolation from input to output field
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,'IAGCNTL: Section 5.',JPQUIET)
+C
+ IAGCNTL = IGTOG(PIFELD, NIWE, NINS, NOWE, NONS, MWEIND, MNSIND,
+ X WFACT, POFELD, KPR, KERR)
+ IF( IAGCNTL.GT.0 ) GOTO 900
+C
+C -----------------------------------------------------------------|
+C* Section 6. Additional interpolations from input to output field
+C -----------------------------------------------------------------|
+C
+ 600 CONTINUE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,'IAGCNTL: Section 6.',JPQUIET)
+C
+C Precipitation field
+C
+C Force processing without neighbour check
+ GPREC = .FALSE.
+ CALL GETENV('PRECIPITATION_NEIGHBOUR_CHECK', YFLAG)
+ IF( YFLAG(1:1).EQ.'0' ) GPREC = .TRUE.
+
+ IF( LPREC ) THEN
+C
+ IF( GPREC ) THEN
+ IAGCNTL = ZPREC(POFELD, NOWE, NONS, KPR, KERR)
+ ELSE
+ IAGCNTL = IGPREC(PIFELD, NIWE, NINS, POFELD, NOWE, NONS,
+ X MWEIND, MNSIND, WFACT, RMAX, RINPNT, KPR, KERR)
+ ENDIF
+C
+ IF( IAGCNTL.GT.0 ) GOTO 900
+ ENDIF
+C
+C Special code for poles if Gaussian input and regular output
+C
+C North pole
+C
+C Sinisa add pole point for staggerd lat-lon grids
+ IF( (NIREPR.EQ.JPREGULAR.AND.LSTAGGL).AND.
+ X LREGOUT .AND.
+ X OINPOLE .AND.
+ X OONPOLE ) THEN
+C
+ IIOFF = 1
+ IOOFF = 1
+C
+ IF( LWIND ) THEN
+ IAGCNTL = IGPOLEW(PIFELD(IIOFF), NIWE, POFELD(IOOFF),
+ X NOWE, MWEIND, MWEDIST, KPR, KERR)
+ ELSE
+ IAGCNTL = IGPOLEG(PIFELD(IIOFF), NIWE, POFELD(IOOFF),
+ X NOWE, KPR, KERR)
+ ENDIF
+ ENDIF
+
+ IF( (NIREPR.EQ.JPGAUSSIAN).AND.
+ X LREGOUT .AND.
+ X OINPOLE .AND.
+ X OONPOLE ) THEN
+C
+ IIOFF = 1
+ IOOFF = 1
+C
+ IF( LWIND ) THEN
+ IAGCNTL = IGPOLEW(PIFELD(IIOFF), NIWE, POFELD(IOOFF),
+ X NOWE, MWEIND, MWEDIST, KPR, KERR)
+ ELSE
+ IAGCNTL = IGPOLEG(PIFELD(IIOFF), NIWE, POFELD(IOOFF),
+ X NOWE, KPR, KERR)
+ ENDIF
+ IF( IAGCNTL.GT.0 ) GOTO 900
+C
+ ENDIF
+C
+C South pole
+C
+C Sinisa add south pole point for staggerd lat-lon grids
+ IF( (NIREPR.EQ.JPREGULAR.AND.LSTAGGL).AND.
+ X LREGOUT .AND.
+ X OISPOLE .AND.
+ X OOSPOLE ) THEN
+C
+ IIOFF = (NINS - 1) * NIWE + 1
+ IOOFF = (NONS - 1) * NOWE + 1
+C
+ IF( LWIND ) THEN
+ IAGCNTL = IGPOLEW(PIFELD(IIOFF), NIWE, POFELD(IOOFF),
+ X NOWE, MWEIND, MWEDIST, KPR, KERR)
+ ELSE
+ IAGCNTL = IGPOLEG(PIFELD(IIOFF), NIWE, POFELD(IOOFF),
+ X NOWE, KPR, KERR)
+C
+ ENDIF
+ ENDIF
+ IF( (NIREPR.EQ.JPGAUSSIAN).AND.
+ X LREGOUT .AND.
+ X OISPOLE .AND.
+ X OOSPOLE ) THEN
+C
+ IIOFF = (NINS - 1) * NIWE + 1
+ IOOFF = (NONS - 1) * NOWE + 1
+C
+ IF( LWIND ) THEN
+ IAGCNTL = IGPOLEW(PIFELD(IIOFF), NIWE, POFELD(IOOFF),
+ X NOWE, MWEIND, MWEDIST, KPR, KERR)
+ ELSE
+ IAGCNTL = IGPOLEG(PIFELD(IIOFF), NIWE, POFELD(IOOFF),
+ X NOWE, KPR, KERR)
+ ENDIF
+ IF( IAGCNTL.GT.0 ) GOTO 900
+C
+ ENDIF
+C
+C LSM field - must be 0 or 1
+C
+C Force processing real LSM
+ LSM_VALUES = .FALSE.
+ CALL GETENV('LSM_VALUES', YFLAG)
+ IF( YFLAG(1:1).EQ.'1' ) LSM_VALUES = .TRUE.
+
+ IF( .NOT.LSM_VALUES.AND.LSMPAR ) THEN
+ IAGCNTL = IGPLSM(POFELD, NOWE * NONS, KPR, KERR)
+ IF( IAGCNTL.GT.0 ) GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return to calling routine. Format statements
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,'IAGCNTL: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/iaidef.F b/interpolation/iaidef.F
new file mode 100755
index 0000000..dc683a8
--- /dev/null
+++ b/interpolation/iaidef.F
@@ -0,0 +1,553 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IAIDEF (KSEC1, KSEC2, KIAREA, KLLEN, OICHNG,
+ 1 KPR, KERR)
+C
+C---->
+C**** *IAIDEF*
+C
+C PURPOSE
+C _______
+C
+C Generate an input field definition from the GRIB definition.
+C
+C INTERFACE
+C _________
+C
+C IERR = IAIDEF (KSEC1, KSEC2, KIAREA, KLLEN, OICHNG, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KSEC1 - The GRIB Section 1 array for the input field.
+C
+C KSEC2 - The GRIB Section 2 array for the input field.
+C
+C KIAREA - The previous input field area used for comparison.
+C
+C KLLEN - The previous latitude line lengths for a quasi
+C regular Gaussian field used for comparison.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C KIAREA - The area for this field.
+C
+C KLLEN - The latitude line lengths for a quasi regular
+C Gaussian field.
+C
+C OICHNG - A flag indicating whether the field definition has
+C changed since the previous call to this routine.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C 21701 The data representation was not valid.
+C 21702 The scan mode was not valid.
+C
+C Common block usage
+C __________________
+C
+C nifld.common - This file contains all the input field
+C definition variables.
+C
+C LSMCHNG - LSM change flag is set.
+C LSM - LSM usage flag is set.
+C LSMPAR - LSM parameter flag is set.
+C LPREC - Precipitation flag is set.
+C LWIND - Wind flag is set.
+C
+C NIGAUSS - Input field Gaussian truncation is used and set.
+C NIGRID - Input field grid definition (WE/NS) is used and
+C set.
+C NINS - Number of grid points in NS direction for input
+C field is used and set.
+C NIPARAM - Input field parameter number is used and set.
+C NIREPR - Input field representation is used and set.
+C NISCNM - Input field scanning mode is set.
+C NITABLE - Input field table number is used and set.
+C NIWE - Number of grid points in WE direction for input
+C field is used and set.
+C
+C EXTERNALS
+C _________
+C
+C PRECIP - Says if field is to have 'precipitation' treatment
+C SETPAR - Standard routine used to generate "missing" data
+C values for GRIB fields.
+C INTLOG - Logs messages.
+C
+C METHOD
+C ______
+C
+C This routine uses sections 1 and 2 of the input GRIB field to
+C generate the input field definition. This definition is
+C compared with the previous field definition to see if any
+C change of definition has occurred.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 3 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Apr 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+C
+C Subroutine arguments
+ LOGICAL OICHNG
+ INTEGER KPR, KERR
+ INTEGER KSEC1 (JPGRIB_ISEC1), KSEC2 (JPGRIB_ISEC2), KIAREA (4)
+ INTEGER KLLEN (*)
+C
+C Local variables
+ LOGICAL GNLSM
+ INTEGER ITEMP, IMISS, IWEST, IEAST, IERR
+ INTEGER JSET
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 21700)
+C
+C External functions
+C
+ LOGICAL PRECIP
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAIDEF: Section 1.',JPQUIET)
+C
+ IAIDEF = 0
+ IERR = 0
+ OICHNG = .FALSE.
+C
+C Get GRIB missing data value
+C
+ CALL SETPAR (ITEMP, IMISS, KPR)
+C
+C _______________________________________________________
+C
+C* Section 2. Set Grib Section 2 variables and check consistency
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAIDEF: Section 2.',JPQUIET)
+C
+C Representation
+C
+ IF (KSEC2 (JPSEC2_REP) .EQ. JPGAUSSIAN .AND.
+ 1 KSEC2 (JPSEC2_QUASI) .EQ. 1) THEN
+ ITEMP = JPQUASI
+ ELSE
+ ITEMP = KSEC2 (JPSEC2_REP)
+ ENDIF
+C
+ IF (ITEMP .NE. NIREPR) THEN
+ NIREPR = ITEMP
+ OICHNG = .TRUE.
+ ENDIF
+C
+C Only grid point input data allowed now
+C
+ IF (NIREPR .NE. JPQUASI .AND. NIREPR .NE. JPGAUSSIAN .AND.
+ X NIREPR .NE. JPREGULAR) THEN
+ IAIDEF = JPROUTINE + 1
+ IF (KERR .GE. 0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IAIDEF: Illegal input representation = ',NIREPR)
+ IF (KERR .EQ. 0) CALL INTLOG(JP_FATAL,
+ X 'IAIDEF: Interpolation failing.',JPQUIET)
+ ENDIF
+ GO TO 900
+ ENDIF
+C
+C scan mode
+C
+ NISCNM = KSEC2 (JPSEC2_SCAN)
+C
+ IF (NISCNM .NE. 0) THEN
+ IAIDEF = JPROUTINE + 2
+ IF (KERR .GE. 0) THEN
+ CALL INTLOG(JP_ERROR,'IAIDEF: Illegal scan mode = ',NISCNM)
+ IF (KERR .EQ. 0) CALL INTLOG(JP_FATAL,
+ X 'IAIDEF: Interpolation failing.',JPQUIET)
+ ENDIF
+ GO TO 900
+ ENDIF
+C
+C Number of lines North-South and West-East
+C
+ IF (KSEC2 (JPSEC2_NLAT) .NE. NINS) THEN
+ NINS = KSEC2 (JPSEC2_NLAT)
+ OICHNG = .TRUE.
+ ENDIF
+C
+ IF (NIREPR.NE.JPQUASI .AND. KSEC2(JPSEC2_NLONG).NE.NIWE) THEN
+ NIWE = KSEC2 (JPSEC2_NLONG)
+ OICHNG = .TRUE.
+ ENDIF
+C
+C North, South, West and East limits
+C
+ IF (KSEC2 (JPSEC2_NORTH) * 10 .NE. KIAREA (JPNORTH) ) THEN
+ KIAREA (JPNORTH) = KSEC2 (JPSEC2_NORTH) * 10
+ OICHNG = .TRUE.
+ ENDIF
+C
+ IF (KSEC2 (JPSEC2_SOUTH) * 10 .NE. KIAREA (JPSOUTH) ) THEN
+ KIAREA (JPSOUTH) = KSEC2 (JPSEC2_SOUTH) * 10
+ OICHNG = .TRUE.
+ ENDIF
+C
+ IWEST = KSEC2 (JPSEC2_WEST) * 10
+C
+C Make West and East points an ordered pair
+C
+ IF (NIREPR .EQ. JPQUASI) THEN
+ IEAST = 0
+ ELSE
+ IEAST = KSEC2 (JPSEC2_EAST) * 10
+C
+ IF (IEAST .LT. IWEST) THEN
+ IF (IEAST .LE. 0) THEN
+ IEAST = IEAST + JP360
+ ELSE
+ IWEST = IWEST - JP360
+ ENDIF
+ ENDIF
+ ENDIF
+C
+ IF (IEAST .NE. KIAREA (JPEAST) ) THEN
+ KIAREA (JPEAST) = IEAST
+ OICHNG = .TRUE.
+ ENDIF
+C
+ IF (IWEST .NE. KIAREA (JPWEST) ) THEN
+ KIAREA (JPWEST) = IWEST
+ OICHNG = .TRUE.
+ ENDIF
+C
+ IF (NIREPR .EQ. JPREGULAR) THEN
+C
+C Direction increments for regular grids
+C
+ IF (KSEC2 (JPSEC2_DLONG) .EQ. IMISS) THEN
+ ITEMP = (KIAREA (JPEAST) - KIAREA (JPWEST) ) / NIWE + 1
+ ELSE
+ ITEMP = KSEC2 (JPSEC2_DLONG) * 10
+ ENDIF
+C
+ IF (NIGRID (JPWESTEP) .NE. ITEMP) THEN
+ NIGRID (JPWESTEP) = ITEMP
+ OICHNG = .TRUE.
+ ENDIF
+C
+ IF (KSEC2 (JPSEC2_DLAT) .EQ. IMISS) THEN
+ ITEMP = (KIAREA (JPNORTH) - KIAREA (JPSOUTH) ) / NINS + 1
+ ELSE
+ ITEMP = KSEC2 (JPSEC2_DLAT) * 10
+ ENDIF
+C
+ IF (NIGRID (JPNSSTEP) .NE. ITEMP) THEN
+ NIGRID (JPNSSTEP) = ITEMP
+ OICHNG = .TRUE.
+ ENDIF
+C
+ ELSE IF (NIREPR .EQ. JPGAUSSIAN) THEN
+C
+ IF (NIGAUSS .NE. KSEC2 (JPSEC2_GTRUNC) ) THEN
+ NIGAUSS = KSEC2 (JPSEC2_GTRUNC)
+ OICHNG = .TRUE.
+ ENDIF
+C
+ ELSE IF (NIREPR .EQ. JPQUASI) THEN
+C
+ IF (NIGAUSS .NE. KSEC2 (JPSEC2_GTRUNC) ) THEN
+ NIGAUSS = KSEC2 (JPSEC2_GTRUNC)
+ NIWE = NIGAUSS * 4
+ OICHNG = .TRUE.
+ ENDIF
+C
+C Set line length definitions for Quasi regular field
+C
+ DO 210 JSET = 1, NINS
+ IF (KLLEN (JSET) .NE. KSEC2 (JPSEC2_QUDEF + JSET) ) THEN
+ KLLEN (JSET) = KSEC2 (JPSEC2_QUDEF + JSET)
+ OICHNG = .TRUE.
+ ENDIF
+ 210 CONTINUE
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 3. Set Grib Section 1 variables and flags
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAIDEF: Section 3.',JPQUIET)
+C
+ NITABLE = KSEC1 (JPSEC1_TABLE)
+ NIPARAM = KSEC1 (JPSEC1_PARAM)
+C
+C Setup ECMWF local definition number and stream if applicable
+C
+ IF( KSEC1(24).EQ.1 ) THEN
+ NILOCAL = KSEC1(37)
+ NISTREM = KSEC1(40)
+ ELSE
+ NILOCAL = 0
+ NISTREM = 0
+ ENDIF
+C
+ LPREC = PRECIP()
+C
+ IF (NITABLE .EQ. 1) THEN
+C
+C WMO International table for meteorological parameters
+C
+ LWIND = NIPARAM .EQ. JP_WMO_U .OR. NIPARAM .EQ. JP_WMO_V
+C
+ LSMPAR = NIPARAM .EQ. JP_WMO_LSM
+C
+ GNLSM = .NOT. (NIPARAM .EQ. JP_WMO_MSL .OR. LSMPAR)
+C
+ IF (GNLSM .NEQV. LSM) THEN
+ LSMCHNG = .TRUE.
+ LSM = GNLSM
+ ENDIF
+C
+ ELSE IF (NITABLE .EQ. 128) THEN
+C
+C ECMWF local code table 2 for meteorological parameters
+C
+ LWIND = NIPARAM .EQ. JP_U .OR. NIPARAM .EQ. JP_V .OR.
+ X NIPARAM .EQ. JP_10U .OR. NIPARAM .EQ. JP_10V
+C
+ LSMPAR = NIPARAM .EQ. JP_LSM
+C
+ GNLSM = .NOT. (NIPARAM .EQ. JP_MSL .OR. LSMPAR)
+C
+ IF (GNLSM .NEQV. LSM) THEN
+ LSMCHNG = .TRUE.
+ LSM = GNLSM
+ ENDIF
+C
+ ELSE IF (NITABLE .EQ. 129) THEN
+C
+C ECMWF local code table for gradients of parameters
+C
+ LWIND = .FALSE.
+ LSMPAR = .FALSE.
+C
+ IF (.NOT. LSM) THEN
+ LSMCHNG = .TRUE.
+ LSM = .TRUE.
+ ENDIF
+C
+ ELSE IF (NITABLE .EQ. 130) THEN
+C
+C ECMWF local code table for ASTEX experiments
+C
+ LWIND = .FALSE.
+ LSMPAR = .FALSE.
+C
+ IF (.NOT. LSM) THEN
+ LSMCHNG = .TRUE.
+ LSM = .TRUE.
+ ENDIF
+C
+ ELSE IF (NITABLE .EQ. 131) THEN
+C
+C ECMWF local code table for probability forecasts
+C
+ LWIND = .FALSE.
+ LSMPAR = .FALSE.
+C
+ IF (.NOT. LSM) THEN
+ LSMCHNG = .TRUE.
+ LSM = .TRUE.
+ ENDIF
+C
+ ELSE IF (NITABLE .EQ. 140) THEN
+C
+C ECMWF local code table for wave models
+C
+ LWIND = .FALSE.
+ LSMPAR = .FALSE.
+C
+ IF (.NOT. LSM) THEN
+ LSMCHNG = .TRUE.
+ LSM = .TRUE.
+ ENDIF
+C
+ ELSE IF (NITABLE .EQ. 150) THEN
+C
+C ECMWF local code table ocean data
+C
+ LWIND = .FALSE.
+ LSMPAR = .FALSE.
+C
+ IF (.NOT. LSM) THEN
+ LSMCHNG = .TRUE.
+ LSM = .TRUE.
+ ENDIF
+C
+ ELSE
+C
+C Unexpected code table found
+C
+ LWIND = .FALSE.
+ LSMPAR = .FALSE.
+C
+ IF (.NOT. LSM) THEN
+ LSMCHNG = .TRUE.
+ LSM = .TRUE.
+ ENDIF
+C
+ ENDIF
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'IAIDEF: Input field definition parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IAIDEF: Parameter value = ',NIPARAM)
+ CALL INTLOG(JP_DEBUG,'IAIDEF: Representation = ',NIREPR)
+ IF (NIWE .NE. 0) CALL INTLOG(JP_DEBUG,
+ X 'IAIDEF: Number W-E = ',NIWE)
+ IF (NINS .NE. 0) CALL INTLOG(JP_DEBUG,
+ X 'IAIDEF: Number N-S = ',NINS)
+ IF (NIREPR .EQ. JPGAUSSIAN .OR. NIREPR .EQ. JPQUASI)
+ X CALL INTLOG(JP_DEBUG,'IAIDEF: Gaussian truncation = ',NIGAUSS)
+ IF (NIREPR .EQ. JPREGULAR .AND. NIGRID (1) .NE. 0) THEN
+ CALL INTLOG(JP_DEBUG,'IAIDEF: Grid WE = ',NIGRID (1))
+ CALL INTLOG(JP_DEBUG,'IAIDEF: Grid NS = ',NIGRID (2))
+ ENDIF
+ IF (KIAREA (1) .NE. 0) THEN
+ CALL INTLOG(JP_DEBUG,'IAIDEF: Area North = ',KIAREA(1))
+ CALL INTLOG(JP_DEBUG,'IAIDEF: Area West = ',KIAREA(2))
+ CALL INTLOG(JP_DEBUG,'IAIDEF: Area South = ',KIAREA(3))
+ CALL INTLOG(JP_DEBUG,'IAIDEF: Area East = ',KIAREA(4))
+ ENDIF
+C
+ CALL INTLOG(JP_DEBUG,'IAIDEF: Control flag status:',JPQUIET)
+C
+ IF( OICHNG ) THEN
+ CALL INTLOG(JP_DEBUG,'IAIDEF:Input fld change TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IAIDEF:Input fld change FALSE',JPQUIET)
+ ENDIF
+C
+ IF( LSMCHNG ) THEN
+ CALL INTLOG(JP_DEBUG,'IAIDEF: LSM change TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IAIDEF: LSM change FALSE',JPQUIET)
+ ENDIF
+C
+ IF( LSM ) THEN
+ CALL INTLOG(JP_DEBUG,'IAIDEF: LSM flag TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IAIDEF: LSM flag FALSE',JPQUIET)
+ ENDIF
+C
+ IF( LWIND ) THEN
+ CALL INTLOG(JP_DEBUG,'IAIDEF: Wind flag TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IAIDEF: Wind flag FALSE',JPQUIET)
+ ENDIF
+C
+ IF( LPREC ) THEN
+ CALL INTLOG(JP_DEBUG,'IAIDEF: Precipitn flag TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IAIDEF: Precipitn flag FALSE',JPQUIET)
+ ENDIF
+C
+ IF( LSMPAR ) THEN
+ CALL INTLOG(JP_DEBUG,'IAIDEF: LSM param flag TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IAIDEF: LSM param flag FALSE',JPQUIET)
+ ENDIF
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAIDEF: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/iainit.F b/interpolation/iainit.F
new file mode 100755
index 0000000..17ea573
--- /dev/null
+++ b/interpolation/iainit.F
@@ -0,0 +1,211 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IAINIT (KPR, KERR)
+C
+C---->
+C**** *IAINIT*
+C
+C PURPOSE
+C _______
+C
+C Initialise common decks for grid-pt to grid-pt interpolation.
+C
+C INTERFACE
+C _________
+C
+C IERR = IAINIT (KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C None
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C grfixed.h - The include file contains all the array space
+C for grid to grid interpolation.
+C
+C MILLEN - The array of latitude line lengths for a quasi
+C regular Gaussian grid is set.
+C
+C memreq.h - This file contains the memory request
+C definition variables.
+C
+C MADDR - The base addresses of the currently allocated
+C memory segments are set.
+C MREQUEST - The sizes of the current memory requests are set.
+C
+C
+C EXTERNALS
+C _________
+C
+C INTLOG - Logs messages.
+C
+C METHOD
+C ______
+C
+C Initialise common decks for grid-pt to grid-pt interpolation:
+C - memory access arrays,
+C - quasi regular definition.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C None.
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Apr 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers ECMWF Aug 1994
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "memreq.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+C
+C Dummy arguments
+C
+ INTEGER KPR, KERR
+C
+C Local variables
+C
+ INTEGER JSET
+C
+ INTEGER JPROUTINE
+C
+ PARAMETER (JPROUTINE = 21100)
+C
+C External functions
+C
+C Transform definition variables that must be preserved
+C
+C
+C _______________________________________________________
+C
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IAINIT: Section 1.',JPQUIET)
+C
+ IAINIT = 0
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,
+ X 'IAINIT : Grid-pt to grid-pt common decks initialised',JPQUIET)
+C
+C _______________________________________________________
+C
+C
+C* Section 2. Initialise memory access arrays.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IAINIT: Section 2.',JPQUIET)
+C
+ DO 210 JSET = 1, JPLEVEL
+ MREQUEST (JSET) = 0
+ MADDR (JSET) = 0
+ 210 CONTINUE
+C
+C _______________________________________________________
+C
+C
+C* Section 3. Initialise quasi regular definition
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IAINIT: Section 3.',JPQUIET)
+C
+ DO 310 JSET = 1, JPLAT
+ MILLEN (JSET) = 0
+ 310 CONTINUE
+C
+C _______________________________________________________
+C
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IAINIT: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/iaintgg.F b/interpolation/iaintgg.F
new file mode 100755
index 0000000..35003de
--- /dev/null
+++ b/interpolation/iaintgg.F
@@ -0,0 +1,552 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IAINTGG (KIFELD, KILEN, PWEST, PEAST, PNORTH,
+ 1 PSOUTH, KGAUSS, KOFELD, KOLEN, KOBITS, KPR, KERR)
+C
+C---->
+C**** *IAINTGG*
+C
+C PURPOSE
+C _______
+C
+C The controlling routine for interpolating between a GRIB input
+C field and a Gaussian output field.
+C
+C INTERFACE
+C _________
+C
+C IERR = IAINTGG (KIFELD, KILEN, PWEST, PEAST, PNORTH, PSOUTH,
+C 1 KGAUSS, KOFELD, KOLEN, KOBITS, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KIFELD - The input field provided by the calling routine.
+C
+C KILEN - The length of the input field.
+C
+C PWEST - The Western limit of the output field area.
+C
+C PEAST - The Eastern limit of the output field area.
+C
+C PNORTH - The Northern limit of the output field area.
+C
+C PSOUTH - The Southern limit of the output field area.
+C
+C KGAUSS - The Gaussian truncation for the output field.
+C
+C KOLEN - The length of the output field.
+C
+C KOBITS - The number of bits used for packing the output array.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C KOFELD - The output field returned to the calling routine.
+C
+C KOLEN - The amount of the output array used for the packed
+C GRIB field.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C 21501 The number of bits requested was outside the allowed
+C range 0 to 24.
+C 21502 The input data representation was not valid when the GRIB
+C field had been expanded.
+C
+C Common block usage
+C __________________
+C
+C grfixed.h - The include file contains all the array space
+C for grid to grid interpolation.
+C
+C MILLEN - The array of latitude line lengths for a quasi
+C regular input field is used.
+C RIGAUSS - Real array of input field Gaussian latitudes is
+C used.
+C ROGAUSS - Real array of output field Gaussian latitudes is
+C used.
+C
+C ouspace.h - This file contains the work space array
+C definitions for the arrays to hold the unpacked
+C real data from GRIB fields.
+C
+C RIFELD - The expanded input field is set and used.
+C ROFELD - The expanded output field is set and used.
+C
+C nifld.common - This file contains all the input field
+C definition variables.
+C
+C LCHANGE - Process change flag is set.
+C
+C NIAREA - Input field area definition (N/W/S/E) is set.
+C NIGAUSS - Input field Gaussian truncation is used.
+C NIGRID - Input field grid definition (WE/NS) is used.
+C NINS - Number of grid points in NS direction for input
+C field is used.
+C NIREPR - Input field representation is used.
+C NIWE - Number of grid points in WE direction for input
+C field is used.
+C
+C nofld.common - This file contains all the output field
+C definition variables.
+C
+C NOACC - Number of packing bits to be used for output
+C GRIB field is set.
+C NOAREA - Output field area definition (N/W/S/E) is set.
+C NOGAUSS - Output field Gaussian truncation is set.
+C NONS - Number of grid points in NS direction for output
+C field is set and used.
+C NOWE - Number of grid points in WE direction for output
+C field is set and used.
+C
+C EXTERNALS
+C _________
+C
+C ABORTX - Standard routine to kill task.
+C GRIBEX - Standard routine to unpack or pack a GRIB field.
+C IAGCNTL - Perform regular grid to grid point interpolation.
+C IARCNTL - Perform regular grid to grid point interpolation.
+C IAIDEF - Initialise the input field definition variables
+C from a GRIB definition
+C IAOGDEF - Initialise the output field definition variables
+C from the user supplied values.
+C IARESET - Create the output field definition in GRIB format.
+C IARMEM - Get space for the unpacked input and output
+C fields.
+C IGLSIZE - Evaluate the array sizes for a regular
+C latitude/longitude grid and area.
+C IGSIZE - Evaluate the array sizes for a Gaussian truncation
+C and area.
+C IRSIZE - Evaluate the array sizes for a quasi regular
+C Gaussian field.
+C INTLOG - Logs messages.
+C
+C METHOD
+C ______
+C
+C This is purely a controlling routine with all the work being
+C performed in the external routines.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 7 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Apr 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "ouspace.h"
+C
+C Function arguments
+C
+ INTEGER KGAUSS, KILEN, KOLEN, KOBITS, KPR, KERR
+ REAL PWEST, PEAST, PNORTH, PSOUTH
+ INTEGER KIFELD (*), KOFELD (*)
+C
+C Local variables
+C
+ CHARACTER*1 HFUNC
+ LOGICAL GIWEGLOBE, GINPOLE, GISPOLE, GOWEGLOBE, GONPOLE,
+ 1 GOSPOLE, GICHNG, GOCHNG
+ INTEGER IILN, ITOTAL, IOLN
+ INTEGER IIAREA (4), IOAREA (4)
+ INTEGER JLAT, JSET
+ INTEGER IERR
+ INTEGER ISEC0 (JPGRIB_ISEC0), ISEC1 (JPGRIB_ISEC1)
+ INTEGER ISEC2 (JPGRIB_ISEC2), ISEC3 (JPGRIB_ISEC3)
+ INTEGER ISEC4 (JPGRIB_ISEC4)
+ INTEGER ZSEC2 (JPGRIB_RSEC2), ZSEC3 (JPGRIB_RSEC3)
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 21500)
+C
+C External functions
+C
+ INTEGER IAGCNTL, IARCNTL, IAIDEF, IAOGDEF, IARESET, IARMEM,
+ 1 IGLSIZE, IGSIZE, IRSIZE
+C
+C Transform definition variables that must be preserved
+C
+ SAVE IILN, IIAREA, IOLN, IOAREA, ITOTAL
+ SAVE GIWEGLOBE, GINPOLE, GISPOLE, GOWEGLOBE, GONPOLE,
+ 1 GOSPOLE
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAINTGG: Section 1.',JPQUIET)
+C
+ IAINTGG = 0
+C
+ IERR = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IAINTGG: Input parameters',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IAINTGG: Input array length = ',KILEN)
+ CALL INTLOG(JP_DEBUG,'IAINTGG: Output array length = ',KOLEN)
+ CALL INTLOG(JP_DEBUG,'IAINTGG: Gaussian truncation = ',KGAUSS)
+ CALL INTLOG(JP_DEBUG,'IAINTGG: Out field packing bits=',KOBITS)
+ CALL INTLOGR(JP_DEBUG,'IAINTGG: Area North = ',PNORTH)
+ CALL INTLOGR(JP_DEBUG,'IAINTGG: Area West = ',PWEST)
+ CALL INTLOGR(JP_DEBUG,'IAINTGG: Area South = ',PSOUTH)
+ CALL INTLOGR(JP_DEBUG,'IAINTGG: Area East = ',PEAST)
+ ENDIF
+C
+ IF (KOBITS .LT. 0 .OR. KOBITS .GT. 24) THEN
+ IAINTGG = JPROUTINE + 1
+ IF (KERR .GE. 0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IAINTGG: No. bits requested = ',KOBITS)
+ CALL INTLOG(JP_ERROR,
+ X 'IAINTGG: Range allowed is <0 - 24>',JPQUIET)
+ IF (KERR .EQ. 0) CALL INTLOG(JP_FATAL,
+ X 'IAINTGG: Interpolation failing.',JPQUIET)
+ ENDIF
+ GO TO 900
+ ENDIF
+C
+ NOACC = KOBITS
+C
+C _______________________________________________________
+C
+C
+C* Section 2. Input grid definition from GRIB file
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAINTGG: Section 2.',JPQUIET)
+C
+C Unpack GRIB sections 0, 1 and 2 only
+C
+ IERR = KERR
+C
+C CALL GRSDBG (KPR)
+C
+ CALL GRIBEX (ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X RIFELD, 1, KIFELD, KILEN, KOLEN, 'I', IERR)
+C
+ IF (IERR .NE. 0) THEN
+ IAINTGG = IERR
+ GO TO 900
+ ENDIF
+C
+ IERR = IAIDEF (ISEC1, ISEC2, IIAREA, MILLEN, GICHNG, KPR, KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IAINTGG = IERR
+ GO TO 900
+ ENDIF
+C
+ IF (GICHNG) THEN
+C
+ DO 210 JSET = 1, 4
+ NIAREA (JSET) = IIAREA (JSET)
+ 210 CONTINUE
+C
+ IF (NIREPR .EQ. JPGAUSSIAN) THEN
+C
+ IERR = IGSIZE (NIGAUSS, NIAREA, NIWE, NINS, IILN, RIGAUSS,
+ 1 GIWEGLOBE, GINPOLE, GISPOLE, KPR, KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IAINTGG = IERR
+ GO TO 900
+ ENDIF
+C
+ ITOTAL = NIWE * NINS
+C
+ ELSE IF (NIREPR .EQ. JPQUASI) THEN
+C
+ IERR = IRSIZE (NIGAUSS, NIAREA, MILLEN, NIWE, NINS, IILN,
+ 1 ITOTAL, RIGAUSS, GIWEGLOBE, GINPOLE, GISPOLE, KPR, KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IAINTGG = IERR
+ GO TO 900
+ ENDIF
+C
+ ELSE IF (NIREPR .EQ. JPREGULAR) THEN
+C
+ IERR = IGLSIZE (NIGRID, NIAREA, NIWE, NINS, IILN, GIWEGLOBE,
+ X GINPOLE, GISPOLE, KPR, KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IAINTGG = IERR
+ GO TO 900
+ ENDIF
+C
+ ITOTAL = NIWE * NINS
+C
+ ELSE
+C
+ IAINTGG = JPROUTINE + 2
+ IF (KERR .GE. 0) CALL INTLOG(JP_ERROR,
+ X 'IAINTGG: Invalid input representation = ',NIREPR)
+ IF (KERR .EQ. 0) CALL INTLOG(JP_FATAL,
+ X 'IAINTGG: Interpolation failing.',JPQUIET)
+ GO TO 900
+C
+ ENDIF
+ ELSE
+ IF (NIREPR .NE. JPQUASI) THEN
+ ITOTAL = NIWE * NINS
+ ELSE
+ ITOTAL = 0
+ DO 220 JLAT = 1, NINS
+ ITOTAL = ITOTAL + MILLEN (JLAT)
+ 220 CONTINUE
+ ENDIF
+ ENDIF
+C
+ LCHANGE = LCHANGE .OR. GICHNG
+C
+C _______________________________________________________
+C
+C* Section 3. Output field definiton from parameters
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAINTGG: Section 3.',JPQUIET)
+C
+ IERR = IAOGDEF (PWEST, PEAST, PNORTH, PSOUTH, KGAUSS, IOAREA,
+ 1 GOCHNG, GIWEGLOBE, GINPOLE, GISPOLE, NIAREA, KPR, KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IAINTGG = IERR
+ GO TO 900
+ ENDIF
+C
+ IF (GOCHNG) THEN
+C
+ DO 310 JSET = 1, 4
+ NOAREA (JSET) = IOAREA (JSET)
+ 310 CONTINUE
+C
+ NOWE = 0
+ NONS = 0
+C
+ IERR = IGSIZE (NOGAUSS, NOAREA, NOWE, NONS, IOLN, ROGAUSS,
+ 1 GOWEGLOBE, GONPOLE, GOSPOLE, KPR, KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IAINTGG = IERR
+ GO TO 900
+ ENDIF
+ ENDIF
+C
+ LCHANGE = LCHANGE .OR. GOCHNG
+C
+C _______________________________________________________
+C
+C* Section 4. Get space for REAL input and output arrays
+C _______________________________________________________
+C
+ 400 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAINTGG: Section 4.',JPQUIET)
+C
+ IF (LCHANGE) THEN
+C
+ IERR = IARMEM (ITOTAL, NOWE * NONS, KPR, KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IAINTGG = IERR
+ GO TO 900
+ ENDIF
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 5. Fully unpack the GRIB array
+C _______________________________________________________
+C
+ 500 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAINTGG: Section 5.',JPQUIET)
+C
+ IERR = KERR
+C
+C CALL GRSDBG (KPR)
+C
+ ISEC3(2) = NINT(RMISSGV)
+ ZSEC3(2) = RMISSGV
+ CALL GRIBEX (ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X RIFELD, ITOTAL, KIFELD, KILEN, KOLEN, 'D', IERR)
+C
+ IF (IERR .NE. 0) THEN
+ IAINTGG = IERR
+ GO TO 900
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 6. Basic interpolation from input to output field
+C _______________________________________________________
+C
+ 600 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAINTGG: Section 6.',JPQUIET)
+C
+ IF (NIREPR .EQ. JPQUASI) THEN
+ IERR = IARCNTL (RIFELD, ITOTAL, ROFELD, NOWE * NONS, IILN,
+ X GIWEGLOBE, GINPOLE, GISPOLE, IOLN, GOWEGLOBE, GONPOLE,
+ X GOSPOLE, KPR, KERR)
+ ELSE
+ IERR = IAGCNTL (RIFELD, ITOTAL, ROFELD, NOWE * NONS, IILN,
+ X GIWEGLOBE, GINPOLE, GISPOLE, IOLN, GOWEGLOBE, GONPOLE,
+ X GOSPOLE, KPR, KERR)
+ ENDIF
+C
+ IF (IERR .NE. 0) THEN
+ IAINTGG = IERR
+ GO TO 900
+ ENDIF
+C
+C _______________________________________________________
+C
+C
+C* Section 7. Repack GRIB code
+C _______________________________________________________
+C
+ 700 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAINTGG: Section 7.',JPQUIET)
+C
+ IERR = IARESET (ISEC2, ISEC4, NOWE * NONS, KPR, KERR)
+C
+ IF (IERR .NE. 0) THEN
+ IAINTGG = IERR
+ GO TO 900
+ ENDIF
+C
+ IERR = KERR
+C
+C CALL GRSDBG (KPR)
+C
+C PACKING specified can be second-order, simple or archive value
+C
+ IF( NOHFUNC.EQ.'K' ) THEN
+ HFUNC = 'K'
+ ISEC4(4) = 64
+ ISEC4(6) = 16
+ ISEC4(9) = 32
+ ISEC4(10) = 16
+ ISEC4(12) = 8
+ ISEC4(13) = 4
+ ISEC4(14) = 0
+ ISEC4(15) = -1
+ ELSE IF( NOHFUNC.EQ.'S' ) THEN
+ HFUNC = 'C'
+ ISEC4(4) = 0
+ ISEC4(6) = 0
+ ELSE IF( NOHFUNC.EQ.'A' ) THEN
+ IF( ISEC4(4).EQ.64 ) THEN
+ HFUNC = 'K'
+ ELSE
+ HFUNC = 'C'
+ ENDIF
+ ENDIF
+C
+ IF( LIMISSV ) THEN
+ ISEC1(5) = 192
+ ISEC3(2) = NINT(RMISSGV)
+ ZSEC3(2) = RMISSGV
+ ENDIF
+ CALL GRIBEX (ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X ROFELD, NOWE * NONS, KOFELD, KOLEN, KOLEN, HFUNC, IERR)
+C
+ IF (IERR .NE. 0) THEN
+ IAINTGG = IERR
+ GO TO 900
+ ENDIF
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,
+ X 'IAINTGG: Output field length is ',KOLEN)
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAINTGG: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/iaintll.F b/interpolation/iaintll.F
new file mode 100755
index 0000000..ea05749
--- /dev/null
+++ b/interpolation/iaintll.F
@@ -0,0 +1,577 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IAINTLL (KIFELD, KILEN, PWEST, PEAST, PNORTH,
+ 1 PSOUTH, PNSINC, PWEINC, KOFELD, KOLEN, KOBITS, KPR, KERR)
+C
+C---->
+C**** *IAINTLL*
+C
+C PURPOSE
+C _______
+C
+C The global controlling routine for interpolating between a GRIB
+C input field and a regular latitude longitude output field.
+C
+C INTERFACE
+C _________
+C
+C IERR = IAINTLL (KIFELD, KILEN, PWEST, PEAST, PNORTH, PSOUTH,
+C 1 PNSINC, PWEINC, KOFELD, KOLEN, KOBITS, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KIFELD - The input field provided by the calling routine.
+C
+C KILEN - The length of the input field.
+C
+C PWEST - The Western limit of the output field area.
+C
+C PEAST - The Eastern limit of the output field area.
+C
+C PNORTH - The Northern limit of the output field area.
+C
+C PSOUTH - The Southern limit of the output field area.
+C
+C PNSINC - The North-South stride for the output field.
+C
+C PWEINC - The West-East stride for the output field.
+C
+C KOLEN - The length of the output field.
+C
+C KOBITS - The number of bits used for packing the output array.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C KOFELD - The output field returned to the calling routine.
+C
+C KOLEN - The amount of the output array used for the packed
+C GRIB field.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C 21301 The number of bits requested was outside the allowed
+C range 0 to 24.
+C 21302 The input data representation was not valid when the GRIB
+C field had been expanded.
+C
+C Common block usage
+C __________________
+C
+C grfixed.h - The include file contains all the array space
+C for grid to grid interpolation.
+C
+C MILLEN - The array of latitude line lengths for a quasi
+C regular input field is used.
+C RIGAUSS - Real array of input field Gaussian latitudes is
+C used.
+C
+C ouspace.h - This file contains the work space array
+C definitions for the arrays to hold the unpacked
+C real data from GRIB fields.
+C
+C RIFELD - The expanded input field is set and used.
+C ROFELD - The expanded output field is set and used.
+C
+C nifld.common - This file contains all the input field
+C definition variables.
+C
+C LCHANGE - Process change flag is set.
+C
+C NIAREA - Input field area definition (N/W/S/E) is set.
+C NIGAUSS - Input field Gaussian truncation is used.
+C NIGRID - Input field grid definition (WE/NS) is used.
+C NINS - Number of grid points in NS direction for input
+C field is used.
+C NIREPR - Input field representation is used.
+C NIWE - Number of grid points in WE direction for input
+C field is used.
+C
+C nofld.common - This file contains all the output field
+C definition variables.
+C
+C NOACC - Number of packing bits to be used for output
+C GRIB field is set.
+C NOAREA - Output field area definition (N/W/S/E) is set.
+C NOGRID - Output field grid definition (WE/NS) is used..
+C NONS - Number of grid points in NS direction for output
+C field is set and used.
+C NOWE - Number of grid points in WE direction for output
+C field is set and used.
+C
+C EXTERNALS
+C _________
+C
+C ABORTX - Standard routine to kill task.
+C GRIBEX - Standard routine to unpack or pack a GRIB field.
+C IAGCNTL - Perform regular grid to grid point interpolation.
+C IARCNTL - Perform regular grid to grid point interpolation.
+C IAIDEF - Initialise the input field definition variables
+C from a GRIB definition
+C IAOLDEF - Initialise the output field definition variables
+C from the user supplied values.
+C IARESET - Create the output field definition in GRIB format.
+C IARMEM - Get space for the unpacked input and output
+C fields.
+C IGLSIZE - Evaluate the array sizes for a regular
+C latitude/longitude grid and area.
+C IGSIZE - Evaluate the array sizes for a Gaussian truncation
+C and area.
+C IRSIZE - Evaluate the array sizes for a quasi regular
+C Gaussian field.
+C INTLOG - Logs messages.
+C
+C METHOD
+C ______
+C
+C This is purely a controlling routine with all the work being
+C performed in the external routines.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 7 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Apr 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "ouspace.h"
+C
+C Dummy arguments
+C
+ INTEGER KILEN, KOLEN, KOBITS, KPR, KERR
+C
+ REAL PWEST, PEAST, PNORTH, PSOUTH, PNSINC, PWEINC
+C
+ INTEGER KIFELD (*), KOFELD (*)
+C
+C Local variables
+C
+ CHARACTER*1 HFUNC
+ LOGICAL GIWEGLOBE, GINPOLE, GISPOLE, GOWEGLOBE, GONPOLE,
+ 1 GOSPOLE, GICHNG, GOCHNG
+C
+ INTEGER IILN, ITOTAL, IOLN
+C
+ INTEGER IIAREA (4), IOAREA (4)
+C
+ INTEGER JLAT, JSET
+C
+ INTEGER IERR
+C
+ INTEGER ISEC0 (JPGRIB_ISEC0), ISEC1 (JPGRIB_ISEC1)
+ INTEGER ISEC2 (JPGRIB_ISEC2), ISEC3 (JPGRIB_ISEC3)
+ INTEGER ISEC4 (JPGRIB_ISEC4)
+C
+ INTEGER ZSEC2 (JPGRIB_RSEC2), ZSEC3 (JPGRIB_RSEC3)
+C
+ INTEGER JPROUTINE
+C
+ PARAMETER (JPROUTINE = 21300)
+C
+C External functions
+C
+ INTEGER IAGCNTL, IARCNTL, IAIDEF, IAOLDEF, IARESET, IARMEM,
+ 1 IGSIZE, IGLSIZE, IRSIZE
+C
+C Transform definition variables that must be preserved
+C
+ SAVE IILN, IIAREA, IOLN, IOAREA, ITOTAL
+ SAVE GIWEGLOBE, GINPOLE, GISPOLE, GOWEGLOBE, GONPOLE,
+ 1 GOSPOLE
+C
+C _______________________________________________________
+C
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAINTLL: Section 1.',JPQUIET)
+C
+ IAINTLL = 0
+C
+ IERR = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IAINTLL: Input parameters',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IAINTLL: Input array length = ',KILEN)
+ CALL INTLOG(JP_DEBUG,'IAINTLL: Output array length = ',KOLEN)
+ CALL INTLOG(JP_DEBUG,'IAINTLL: Out field packing bits=',KOBITS)
+ CALL INTLOGR(JP_DEBUG,'IAINTLL: W-E increment is ',PWEINC)
+ CALL INTLOGR(JP_DEBUG,'IAINTLL: N-S increment is ',PNSINC)
+ CALL INTLOGR(JP_DEBUG,'IAINTLL: Area North = ',PNORTH)
+ CALL INTLOGR(JP_DEBUG,'IAINTLL: Area West = ',PWEST)
+ CALL INTLOGR(JP_DEBUG,'IAINTLL: Area South = ',PSOUTH)
+ CALL INTLOGR(JP_DEBUG,'IAINTLL: Area East = ',PEAST)
+ ENDIF
+C
+ IF (KOBITS .LT. 0 .OR. KOBITS .GT. 24) THEN
+C
+ IAINTLL = JPROUTINE + 1
+ IF (KERR .GE. 0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IAINTLL: No. bits requested = ',KOBITS)
+ CALL INTLOG(JP_ERROR,
+ X 'IAINTLL: Range allowed is <0 - 24>',JPQUIET)
+ IF (KERR .EQ. 0) CALL INTLOG(JP_FATAL,
+ X 'IAINTLL: Interpolation failing.',JPQUIET)
+ ENDIF
+ GO TO 900
+C
+ ENDIF
+C
+ NOACC = KOBITS
+C
+C _______________________________________________________
+C
+C
+C* Section 2. Input grid definition from GRIB file
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAINTLL: Section 2.',JPQUIET)
+C
+C Unpack GRIB sections 0, 1 and 2 only
+C
+ IERR = KERR
+C
+C CALL GRSDBG (KPR)
+C
+ CALL GRIBEX (ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ 1 RIFELD, 1, KIFELD, KILEN, KOLEN, 'I', IERR)
+C
+ IF (IERR .NE. 0) THEN
+ IAINTLL = IERR
+ GO TO 900
+ ENDIF
+C
+ IERR = IAIDEF (ISEC1, ISEC2, IIAREA, MILLEN, GICHNG, KPR, KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IAINTLL = IERR
+ GO TO 900
+ ENDIF
+C
+ IF (GICHNG) THEN
+C
+ DO 210 JSET = 1, 4
+ NIAREA (JSET) = IIAREA (JSET)
+ 210 CONTINUE
+C
+ IF (NIREPR .EQ. JPGAUSSIAN) THEN
+C
+ IERR = IGSIZE (NIGAUSS, NIAREA, NIWE, NINS, IILN, RIGAUSS,
+ 1 GIWEGLOBE, GINPOLE, GISPOLE, KPR, KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IAINTLL = IERR
+ GO TO 900
+ ENDIF
+C
+ ITOTAL = NIWE * NINS
+C
+ ELSE IF (NIREPR .EQ. JPQUASI) THEN
+C
+ IERR = IRSIZE (NIGAUSS, NIAREA, MILLEN, NIWE, NINS, IILN,
+ 1 ITOTAL, RIGAUSS, GIWEGLOBE, GINPOLE, GISPOLE, KPR, KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IAINTLL = IERR
+ GO TO 900
+ ENDIF
+C
+ ELSE IF (NIREPR .EQ. JPREGULAR) THEN
+C
+ IERR = IGLSIZE (NIGRID, NIAREA, NIWE, NINS, IILN,
+ 1 GIWEGLOBE, GINPOLE, GISPOLE, KPR, KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IAINTLL = IERR
+ GO TO 900
+ ENDIF
+C
+ ITOTAL = NIWE * NINS
+C
+ ELSE
+C
+ IAINTLL = JPROUTINE + 2
+ IF (KERR .GE. 0) CALL INTLOG(JP_ERROR,
+ X 'IAINTLL: Invalid input representation = ',NIREPR)
+ IF (KERR .EQ. 0) CALL INTLOG(JP_FATAL,
+ X 'IAINTLL: Interpolation failing.',JPQUIET)
+
+ GO TO 900
+C
+ ENDIF
+C
+ ELSE
+ IF (NIREPR .NE. JPQUASI) THEN
+ ITOTAL = NIWE * NINS
+ ELSE
+ ITOTAL = 0
+ DO 220 JLAT = 1, NINS
+ ITOTAL = ITOTAL + MILLEN (JLAT)
+ 220 CONTINUE
+ ENDIF
+ ENDIF
+C
+ LCHANGE = LCHANGE .OR. GICHNG
+C
+C _______________________________________________________
+C
+C
+C* Section 3. Output field definiton from parameters
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAINTLL: Section 3.',JPQUIET)
+C
+ IERR = IAOLDEF (PWEST, PEAST, PNORTH, PSOUTH, PNSINC, PWEINC,
+ 1 IOAREA, GOCHNG, GIWEGLOBE, GINPOLE, GISPOLE, NIAREA, KPR,
+ 2 KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IAINTLL = IERR
+ GO TO 900
+ ENDIF
+C
+ IF (GOCHNG) THEN
+C
+ DO 310 JSET = 1, 4
+ NOAREA (JSET) = IOAREA (JSET)
+ 310 CONTINUE
+C
+ NOWE = 0
+ NONS = 0
+C
+ IERR = IGLSIZE (NOGRID, NOAREA, NOWE, NONS, IOLN, GOWEGLOBE,
+ 1 GONPOLE, GOSPOLE, KPR, KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IAINTLL = IERR
+ GO TO 900
+ ENDIF
+ ENDIF
+C
+ LCHANGE = LCHANGE .OR. GOCHNG
+C
+C _______________________________________________________
+C
+C
+C* Section 4. Get space for REAL input and output arrays
+C _______________________________________________________
+C
+ 400 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAINTLL: Section 4.',JPQUIET)
+C
+ IF (LCHANGE) THEN
+C
+ IERR = IARMEM (ITOTAL, NOWE * NONS, KPR, KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IAINTLL = IERR
+ GO TO 900
+ ENDIF
+ ENDIF
+C
+C _______________________________________________________
+C
+C
+C* Section 5. Fully unpack the GRIB array
+C _______________________________________________________
+C
+ 500 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAINTLL: Section 5.',JPQUIET)
+C
+ IERR = KERR
+C
+C CALL GRSDBG (KPR)
+C
+ ISEC3(2) = NINT(RMISSGV)
+ ZSEC3(2) = RMISSGV
+ CALL GRIBEX (ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ 1 RIFELD, ITOTAL, KIFELD, KILEN, KOLEN, 'D', IERR)
+C
+ IF (IERR .NE. 0) THEN
+ IAINTLL = IERR
+ GO TO 900
+ ENDIF
+C
+C _______________________________________________________
+C
+C
+C* Section 6. Basic interpolation from input to output field
+C _______________________________________________________
+C
+ 600 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAINTLL: Section 6.',JPQUIET)
+C
+ IF (NIREPR .EQ. JPQUASI) THEN
+ IERR = IARCNTL (RIFELD, ITOTAL, ROFELD, NOWE * NONS, IILN,
+ 1 GIWEGLOBE, GINPOLE, GISPOLE, IOLN, GOWEGLOBE, GONPOLE,
+ 1 GOSPOLE, KPR, KERR)
+ ELSE
+ IERR = IAGCNTL (RIFELD, ITOTAL, ROFELD, NOWE * NONS, IILN,
+ 1 GIWEGLOBE, GINPOLE, GISPOLE, IOLN, GOWEGLOBE, GONPOLE,
+ 1 GOSPOLE, KPR, KERR)
+ ENDIF
+C
+ IF (IERR .NE. 0) THEN
+ IAINTLL = IERR
+ GO TO 900
+ ENDIF
+C
+C _______________________________________________________
+C
+C
+C* Section 7. Repack GRIB code
+C _______________________________________________________
+C
+ 700 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAINTLL: Section 7.',JPQUIET)
+C
+ IERR = IARESET (ISEC2, ISEC4, NOWE * NONS, KPR, KERR)
+C
+ IF (IERR .NE. 0) THEN
+ IAINTLL = IERR
+ GO TO 900
+ ENDIF
+C
+ IERR = KERR
+C
+C CALL GRSDBG (KPR)
+C
+C PACKING specified can be second-order, simple or archive value
+C
+ IF( NOHFUNC.EQ.'K' ) THEN
+ HFUNC = 'K'
+ ISEC4(4) = 64
+ ISEC4(6) = 16
+ ISEC4(9) = 32
+ ISEC4(10) = 16
+ ISEC4(12) = 8
+ ISEC4(13) = 4
+ ISEC4(14) = 0
+ ISEC4(15) = -1
+ ELSE IF( NOHFUNC.EQ.'S' ) THEN
+ HFUNC = 'C'
+ ISEC4(4) = 0
+ ISEC4(6) = 0
+ ELSE IF( NOHFUNC.EQ.'A' ) THEN
+ IF( ISEC4(4).EQ.64 ) THEN
+ HFUNC = 'K'
+ ELSE
+ HFUNC = 'C'
+ ENDIF
+ ENDIF
+C
+ IF( LIMISSV ) THEN
+ ISEC1(5) = 192
+ ISEC3(2) = NINT(RMISSGV)
+ ZSEC3(2) = RMISSGV
+ ENDIF
+ CALL GRIBEX (ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ 1 ROFELD, NOWE * NONS, KOFELD, KOLEN, KOLEN, HFUNC, IERR)
+C
+ IF (IERR .NE. 0) THEN
+ IAINTLL = IERR
+ GO TO 900
+ ENDIF
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,
+ X 'IAINTLL: Output array length = ',KOLEN)
+C
+C _______________________________________________________
+C
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAINTLL: Section 9.',JPQUIET)
+C
+ 9002 FORMAT (' IAINTLL ERROR', I6, ' - Input representation', I6,
+ 1 ' is not valid')
+C
+ RETURN
+ END
diff --git a/interpolation/iaogdef.F b/interpolation/iaogdef.F
new file mode 100755
index 0000000..c990cee
--- /dev/null
+++ b/interpolation/iaogdef.F
@@ -0,0 +1,421 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IAOGDEF (PWEST, PEAST, PNORTH, PSOUTH,
+ 1 KGAUSS, KAREA, OCHNG, OIWEGLOBE, OINPOLE, OISPOLE,
+ 2 KIAREA, KPR, KERR)
+C
+C---->
+C**** *IAOGDEF*
+C
+C PURPOSE
+C _______
+C
+C Set the output field definition variables.
+C
+C INTERFACE
+C _________
+C
+C IERR = IAOGDEF (PWEST, PEAST, PNORTH, PSOUTH, KGAUSS, KAREA,
+C 1 OCHNG, OIWEGLOBE, OINPOLE, OISPOLE, KIAREA, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C PWEST - The Western limit of the output field area.
+C
+C PEAST - The Eastern limit of the output field area.
+C
+C PNORTH - The Northern limit of the output field area.
+C
+C PSOUTH - The Southern limit of the output field area.
+C
+C KGAUSS - The Gaussian truncation for the output field.
+C
+C KAREA - The previous output field area used for checking
+C for definition changes.
+C
+C OIWEGLOBE - Flag indicating whether the INPUT field spans the
+C globe in the West-East direction.
+C
+C OINPOLE - Flag indicating whether the INPUT field includes
+C the North polar line of latitude.
+C
+C OISPOLE - Flag indicating whether the INPUT field includes
+C the South polar line of latitude.
+C
+C KIAREA - The input field area which will be used for an
+C uninitialised output field area when the input
+C field is not global.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C KAREA - The output field area if the definition has changed.
+C
+C OCHNG - A flag variable indicating whether the definition
+C has changed.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C 21601 An illegal Gaussian truncation was requested.
+C 21602 The default West-East output limits for a non-global
+C input field did not match the increment.
+C 21603 Default North-South limits were specified for a
+C non-global input field. This is not allowed for a
+C Gaussian output field.
+C
+C Common block usage
+C __________________
+C
+C nofld.common - This file contains all the output field
+C definition variables.
+C
+C NOGAUSS - Output field Gaussian truncation is set.
+C NOREPR - Output field representation is set.
+C NOSCNM - Output field scanning mode is set.
+C
+C EXTERNALS
+C _________
+C
+C INTLOG - Logs messages.
+C
+C METHOD
+C ______
+C
+C Check the output definition against the previous definition and
+C update appropriate definition variables.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 3 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Apr 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nofld.common"
+C
+C Subroutine arguments
+C
+ LOGICAL OCHNG, OIWEGLOBE, OINPOLE, OISPOLE
+ INTEGER KGAUSS, KPR, KERR
+ INTEGER KAREA (4), KIAREA (4)
+ REAL PWEST, PEAST, PNORTH, PSOUTH
+C
+C Local variables
+ LOGICAL GLOBE, GNS
+ INTEGER INORTH, ISOUTH, IWEST, IEAST, IWEINC, IWETMP, ITEMP
+ INTEGER IERR
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 21600)
+C
+C External functions
+C
+C Transform definition variables that must be preserved
+C
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAOGDEF: Section 1.',JPQUIET)
+C
+ IAOGDEF = 0
+C
+ IERR = 0
+C
+ OCHNG = .FALSE.
+C
+ GNS = OINPOLE .AND. OISPOLE
+C
+ GLOBE = OIWEGLOBE .AND. GNS
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IAOGDEF: Input parameters',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IAOGDEF: Gaussian truncation = ',KGAUSS)
+ CALL INTLOGR(JP_DEBUG,'IAOGDEF: Area North = ',PNORTH)
+ CALL INTLOGR(JP_DEBUG,'IAOGDEF: Area West = ',PWEST)
+ CALL INTLOGR(JP_DEBUG,'IAOGDEF: Area South = ',PSOUTH)
+ CALL INTLOGR(JP_DEBUG,'IAOGDEF: Area East = ',PEAST)
+ ENDIF
+C
+C _______________________________________________________
+C
+C
+C* Section 2. Convert parameters to integer
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAOGDEF: Section 2.',JPQUIET)
+C
+C Representation
+C
+ IF (NOREPR .NE. JPGAUSSIAN) THEN
+ NOREPR = JPGAUSSIAN
+ OCHNG = .TRUE.
+ ENDIF
+C
+ NOSCNM = 0
+C
+C North, South, West and East limits
+C
+ INORTH = NINT (PNORTH * PPMULT)
+ ISOUTH = NINT (PSOUTH * PPMULT)
+ IWEST = NINT (PWEST * PPMULT)
+ IEAST = NINT (PEAST * PPMULT)
+C
+C Direction increments for regular grids
+C
+ IWEINC = JP90 / KGAUSS
+C
+ IF (IWEINC * KGAUSS .NE. JP90) THEN
+ IAOGDEF = JPROUTINE + 1
+ IF (KERR .GE. 0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IAOGDEF: Illegal gaussian truncation = ',KGAUSS)
+ IF (KERR .EQ. 0) CALL INTLOG(JP_FATAL,
+ X 'IAOGDEF: Interpolation failing.',JPQUIET)
+ ENDIF
+ GO TO 900
+ ENDIF
+C
+C
+C _______________________________________________________
+C
+C
+C* Section 3. Adjust grid stride and area
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAOGDEF: Section 3.',JPQUIET)
+C
+C Global field if all area limits are 0
+C
+ IF (INORTH .EQ. 0 .AND. ISOUTH .EQ. 0 .AND.
+ X IWEST .EQ. 0 .AND. IEAST .EQ. 0) THEN
+C
+ INORTH = JP90
+ ISOUTH = - JP90
+C
+ IF (GLOBE) THEN
+C
+ IWEST = 0
+ IEAST = JP360 - IWEINC
+C
+ ELSE
+ IF (GNS) THEN
+C
+ IWEST = KIAREA (JPWEST)
+ IEAST = KIAREA (JPEAST)
+C
+ IF (MOD (IEAST - IWEST, IWEINC) .NE. 0) THEN
+ IAOGDEF = JPROUTINE + 2
+ IF (KERR .GE. 0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IAOGDEF: West-East increment ', IWEINC)
+ CALL INTLOG(JP_ERROR,
+ X 'IAOGDEF: does not match the range from ',IWEST)
+ CALL INTLOG(JP_ERROR,
+ X 'IAOGDEF: to ',IEAST)
+ IF (KERR .EQ. 0) CALL INTLOG(JP_FATAL,
+ X 'IAOGDEF: Interpolation failing.',JPQUIET)
+ ENDIF
+ GO TO 900
+ ENDIF
+ ELSE
+ IAOGDEF = JPROUTINE + 3
+ IF (KERR .GE. 0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IAOGDEF: Must specify a range if Gaussian',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'IAOGDEF: output and non-global input.',JPQUIET)
+ IF (KERR .EQ. 0) CALL INTLOG(JP_FATAL,
+ X 'IAOGDEF: Interpolation failing.',JPQUIET)
+ ENDIF
+ GO TO 900
+ ENDIF
+ ENDIF
+C
+ ELSE
+C
+C Try to produce fields representable in GRIB for 0.5625 degree
+C strides
+C
+ IF (IEAST .LT. IWEST) THEN
+ IF (IEAST .LE. 0) THEN
+ IEAST = IEAST + JP360
+ ELSE
+ IWEST = IWEST - JP360
+ ENDIF
+ ENDIF
+C
+ GLOBE = IEAST - IWEST + IWEINC .EQ. JP360 .OR.
+ X IEAST - IWEST + IWEINC .EQ. 0
+C
+ IF (MOD (IWEINC, 10) .EQ. 5 .AND. .NOT. GLOBE) THEN
+ IWETMP = IWEINC * 2
+ ELSE
+ IWETMP = IWEINC
+ ENDIF
+C
+ IF (MOD (IEAST - IWEST, IWETMP) .NE. 0) THEN
+C
+ IF (MOD (IEAST, IWETMP) .NE. 0) THEN
+C
+ ITEMP = ABS (IEAST) / IWETMP
+C
+ IF (IEAST .GT. 0) THEN
+ IEAST = (ITEMP + 1) * IWETMP
+ IF (IEAST .GT. JP360) IEAST = IEAST - IWETMP
+ ELSE
+ IEAST = - ITEMP * IWETMP
+ ENDIF
+ ENDIF
+C
+ IF (MOD (IWEST, IWETMP) .NE. 0) THEN
+C
+ ITEMP = ABS (IWEST) / IWETMP
+C
+ IF (IWEST .LT. 0) THEN
+ IWEST = - (ITEMP + 1) * IWETMP
+ IF (IWEST .LT. - JP360) IWEST = IWEST + IWETMP
+ ELSE
+ IWEST = ITEMP * IWETMP
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
+C
+ IF (NOGAUSS .NE. KGAUSS) THEN
+ NOGAUSS = KGAUSS
+ OCHNG = .TRUE.
+ ENDIF
+C
+ IF (KAREA (JPNORTH) .NE. INORTH) THEN
+ KAREA (JPNORTH) = INORTH
+ OCHNG = .TRUE.
+ ENDIF
+C
+ IF (KAREA (JPSOUTH) .NE. ISOUTH) THEN
+ KAREA (JPSOUTH) = ISOUTH
+ OCHNG = .TRUE.
+ ENDIF
+C
+ IF (IWEST .NE. KAREA (JPWEST) ) THEN
+ KAREA (JPWEST) = IWEST
+ OCHNG = .TRUE.
+ ENDIF
+C
+ IF (IEAST .NE. KAREA (JPEAST) ) THEN
+ KAREA (JPEAST) = IEAST
+ OCHNG = .TRUE.
+ ENDIF
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOGDEF: Output field definition parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOGDEF: Representation is ',NOREPR)
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOGDEF: Gaussian truncation is ',NOGAUSS)
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOGDEF: Area North is ',KAREA(1))
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOGDEF: Area West is ',KAREA(2))
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOGDEF: Area South is ',KAREA(3))
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOGDEF: Area East is ',KAREA(4))
+ IF( OCHNG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOGDEF: Output field change is TRUE.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOGDEF: Output field change is TRUE.',JPQUIET)
+ ENDIF
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAOGDEF: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/iaoldef.F b/interpolation/iaoldef.F
new file mode 100755
index 0000000..2419457
--- /dev/null
+++ b/interpolation/iaoldef.F
@@ -0,0 +1,471 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IAOLDEF (PWEST, PEAST, PNORTH, PSOUTH,
+ 1 PNSINC, PWEINC, KAREA, OCHNG, OIWEGLOBE, OINPOLE, OISPOLE,
+ 2 KIAREA, KPR, KERR)
+C
+C---->
+C**** *IAOLDEF*
+C
+C PURPOSE
+C _______
+C
+C Set the output field definition variables for a regular
+C latitude longitude field.
+C
+C INTERFACE
+C _________
+C
+C IERR = IAOLDEF (PWEST, PEAST, PNORTH, PSOUTH, PNSINC, PWEINC,
+C 1 KAREA, OCHNG, OIWEGLOBE, OINPOLE, OISPOLE, KIAREA, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C PWEST - The Western limit of the output field area.
+C
+C PEAST - The Eastern limit of the output field area.
+C
+C PNORTH - The Northern limit of the output field area.
+C
+C PSOUTH - The Southern limit of the output field area.
+C
+C PNSINC - The North-South stride for the output field.
+C
+C PWEINC - The West-East stride for the output field.
+C
+C KAREA - The previous output field area used for checking
+C for definition changes.
+C
+C OIWEGLOBE - Flag indicating whether the INPUT field spans the
+C globe in the West-East direction.
+C
+C OINPOLE - Flag indicating whether the INPUT field includes
+C the North polar line of latitude.
+C
+C OISPOLE - Flag indicating whether the INPUT field includes
+C the South polar line of latitude.
+C
+C KIAREA - The input field area which will be used for an
+C uninitialised output field area when the input
+C field is not global.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C KAREA - The output field area if the definition has changed.
+C
+C OCHNG - A flag variable indicating whether the definition
+C has changed.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C nofld.common - This file contains all the output field
+C definition variables.
+C
+C NOGRID - Output field grid definition (WE/NS) is set.
+C NOREPR - Output field representation is set.
+C NOSCNM - Output field scanning mode is set.
+C
+C EXTERNALS
+C _________
+C
+C INTLOG - Logs messages.
+C
+C METHOD
+C ______
+C
+C Check the output definition against the previous definition and
+C update appropriate definition variables.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 3 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Apr 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nofld.common"
+C
+C Subroutine arguments
+ LOGICAL OCHNG, OIWEGLOBE, OINPOLE, OISPOLE
+ INTEGER KPR, KERR
+ INTEGER KAREA (4), KIAREA (4)
+ REAL PWEST, PEAST, PNORTH, PSOUTH, PNSINC, PWEINC
+C
+C Local variables
+ LOGICAL GLOBE
+ INTEGER INORTH, ISOUTH, IWEST, IEAST, IWEINC, INSINC, IWETMP,
+ 1 INSTMP, ITEMP
+ INTEGER IERR
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 21400)
+C
+C External functions
+C
+C Transform definition variables that must be preserved
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAOLDEF: Section 1.',JPQUIET)
+C
+ IAOLDEF = 0
+C
+ IERR = 0
+C
+ OCHNG = .FALSE.
+C
+ GLOBE = OIWEGLOBE .AND. OINPOLE .AND. OISPOLE
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IAOLDEF: Input parameters.',JPQUIET)
+ CALL INTLOGR(JP_DEBUG,'IAOLDEF: W-E increment is ',PWEINC)
+ CALL INTLOGR(JP_DEBUG,'IAOLDEF: N-S increment is ',PNSINC)
+ CALL INTLOGR(JP_DEBUG,'IAOLDEF: AREA North ',PNORTH)
+ CALL INTLOGR(JP_DEBUG,'IAOLDEF: AREA West ',PWEST)
+ CALL INTLOGR(JP_DEBUG,'IAOLDEF: AREA South ',PSOUTH)
+ CALL INTLOGR(JP_DEBUG,'IAOLDEF: AREA East ',PEAST)
+ ENDIF
+C
+C _______________________________________________________
+C
+C
+C* Section 2. Convert parameters to integer
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAOLDEF: Section 2.',JPQUIET)
+C
+C Representation
+C
+ IF (NOREPR .NE. JPREGULAR) THEN
+ NOREPR = JPREGULAR
+ OCHNG = .TRUE.
+ ENDIF
+C
+ NOSCNM = 0
+C
+C North, South, West and East limits
+C
+ INORTH = NINT (PNORTH * PPMULT)
+ ISOUTH = NINT (PSOUTH * PPMULT)
+ IWEST = NINT (PWEST * PPMULT)
+ IEAST = NINT (PEAST * PPMULT)
+C
+C Direction increments for regular grids
+C
+ IWEINC = NINT (ABS (PWEINC) * PPMULT)
+ IWEINC = MAX (IWEINC, JPMIN)
+C
+ INSINC = NINT (ABS (PNSINC) * PPMULT)
+ INSINC = MAX (INSINC, JPMIN)
+C
+C _______________________________________________________
+C
+C
+C* Section 3. Adjust grid stride and area
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAOLDEF: Section 3.',JPQUIET)
+C
+C Global field if all area limits are 0
+C
+ IF (INORTH .EQ. 0 .AND. ISOUTH .EQ. 0 .AND.
+ 1 IWEST .EQ. 0 .AND. IEAST .EQ. 0) THEN
+C
+ IF (GLOBE) THEN
+C
+ 310 CONTINUE
+ IF (MOD (JP90, IWEINC) .EQ. 0) GO TO 320
+ IWEINC = IWEINC - 1
+ GO TO 310
+ 320 CONTINUE
+C
+ IF (MOD (JP90, INSINC) .EQ. 0) GO TO 330
+ INSINC = INSINC - 1
+ GO TO 320
+ 330 CONTINUE
+C
+ INORTH = JP90
+ ISOUTH = - JP90
+ IWEST = 0
+ IEAST = JP360 - IWEINC
+C
+ ELSE
+C
+ IF (OINPOLE) THEN
+ INORTH = JP90
+ ELSE
+ INORTH = KIAREA (JPNORTH)
+ ENDIF
+C
+ IF (OISPOLE) THEN
+ ISOUTH = - JP90
+ ELSE
+ ISOUTH = KIAREA (JPSOUTH)
+ ENDIF
+C
+ IF (OIWEGLOBE) THEN
+C
+ 340 CONTINUE
+ IF (MOD (JP90, IWEINC) .EQ. 0) GO TO 350
+ IWEINC = IWEINC - 1
+ GO TO 340
+ 350 CONTINUE
+C
+ IWEST = 0
+ IEAST = JP360 - IWEINC
+ ELSE
+ IWEST = KIAREA (JPWEST)
+ IEAST = KIAREA (JPEAST)
+C
+ 360 CONTINUE
+ IF (MOD (IEAST - IWEST, IWEINC) .EQ. 0) GO TO 370
+ IWEINC = IWEINC - 1
+ GO TO 360
+ 370 CONTINUE
+C
+ ENDIF
+C
+ 380 CONTINUE
+ IF (MOD (INORTH - ISOUTH, INSINC) .EQ. 0) GO TO 390
+ INSINC = INSINC - 1
+ GO TO 380
+ 390 CONTINUE
+C
+ ENDIF
+ ELSE
+C
+C Try to produce fields representable in GRIB for 0.5625 degree
+C strides
+C
+ IF (IEAST .LT. IWEST) THEN
+ IF (IEAST .LE. 0) THEN
+ IEAST = IEAST + JP360
+ ELSE
+ IWEST = IWEST - JP360
+ ENDIF
+ ENDIF
+C
+ GLOBE = IEAST - IWEST + IWEINC .EQ. JP360 .OR.
+ 1 IEAST - IWEST + IWEINC .EQ. 0
+C
+ IF (MOD (IWEINC, 10) .EQ. 5 .AND. .NOT. GLOBE) THEN
+ IWETMP = IWEINC * 2
+ ELSE
+ IWETMP = IWEINC
+ ENDIF
+C
+ IF (MOD (IEAST - IWEST, IWETMP) .NE. 0) THEN
+C
+ IF (MOD (IEAST, IWETMP) .NE. 0) THEN
+C
+ ITEMP = ABS (IEAST) / IWETMP
+C
+ IF (IEAST .GT. 0) THEN
+ IEAST = (ITEMP + 1) * IWETMP
+ IF (IEAST .GT. JP360) IEAST = IEAST - IWETMP
+ ELSE
+ IEAST = - ITEMP * IWETMP
+ ENDIF
+ ENDIF
+C
+ IF (MOD (IWEST, IWETMP) .NE. 0) THEN
+C
+ ITEMP = ABS (IWEST) / IWETMP
+C
+ IF (IWEST .LT. 0) THEN
+ IWEST = - (ITEMP + 1) * IWETMP
+ IF (IWEST .LT. - JP360) IWEST = IWEST + IWETMP
+ ELSE
+ IWEST = ITEMP * IWETMP
+ ENDIF
+ ENDIF
+ ENDIF
+C
+ IF (MOD (INSINC, 10) .EQ. 5) THEN
+ INSTMP = INSINC * 2
+ ELSE
+ INSTMP = INSINC
+ ENDIF
+C
+ IF (MOD (INORTH - ISOUTH, INSTMP) .NE. 0) THEN
+C
+ IF (MOD (INORTH, INSTMP) .NE. 0) THEN
+C
+ ITEMP = ABS (INORTH) / INSTMP
+C
+ IF (INORTH .GT. 0) THEN
+ INORTH = (ITEMP + 1) * INSTMP
+ IF (INORTH .GT. JP90) INORTH = INORTH - INSTMP
+ ELSE
+ INORTH = - ITEMP * INSTMP
+ ENDIF
+ ENDIF
+C
+ IF (MOD (ISOUTH, INSTMP) .NE. 0) THEN
+C
+ ITEMP = ABS (ISOUTH) / INSTMP
+C
+ IF (ISOUTH .LT. 0) THEN
+ ISOUTH = - (ITEMP + 1) * INSTMP
+ IF (ISOUTH .LT. - JP90) ISOUTH = ISOUTH + INSTMP
+ ELSE
+ ISOUTH = ITEMP * INSTMP
+ ENDIF
+ ENDIF
+ ENDIF
+C
+ ENDIF
+C
+ IF (NOGRID (JPWESTEP) .NE. IWEINC) THEN
+ NOGRID (JPWESTEP) = IWEINC
+ OCHNG = .TRUE.
+ ENDIF
+C
+ IF (NOGRID (JPNSSTEP) .NE. INSINC) THEN
+ NOGRID (JPNSSTEP) = INSINC
+ OCHNG = .TRUE.
+ ENDIF
+C
+ IF (KAREA (JPNORTH) .NE. INORTH) THEN
+ KAREA (JPNORTH) = INORTH
+ OCHNG = .TRUE.
+ ENDIF
+C
+ IF (KAREA (JPSOUTH) .NE. ISOUTH) THEN
+ KAREA (JPSOUTH) = ISOUTH
+ OCHNG = .TRUE.
+ ENDIF
+C
+ IF (IWEST .NE. KAREA (JPWEST) ) THEN
+ KAREA (JPWEST) = IWEST
+ OCHNG = .TRUE.
+ ENDIF
+C
+ IF (IEAST .NE. KAREA (JPEAST) ) THEN
+ KAREA (JPEAST) = IEAST
+ OCHNG = .TRUE.
+ ENDIF
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOLDEF: Output field definition parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOLDEF: Representation is ',NOREPR)
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOLDEF: Grid W-E is ', NOGRID(1))
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOLDEF: Grid N-S is ', NOGRID(2))
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOLDEF: Area North is ',KAREA(1))
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOLDEF: Area West is ',KAREA(2))
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOLDEF: Area South is ',KAREA(3))
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOLDEF: Area East is ',KAREA(4))
+C
+ IF ( OCHNG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOLDEF: Output field change is TRUE.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'IAOLDEF: Output field change is FALSE.',JPQUIET)
+ ENDIF
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IAOLDEF: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/iarcntl.F b/interpolation/iarcntl.F
new file mode 100755
index 0000000..9c2bfad
--- /dev/null
+++ b/interpolation/iarcntl.F
@@ -0,0 +1,691 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IARCNTL(PIFELD, KILEN, POFELD, KOLEN, KILN,
+ 1 OIWEGLOBE, OINPOLE, OISPOLE, KOLN, OOWEGLOBE, OONPOLE,
+ 2 OOSPOLE, KPR, KERR)
+C
+C---->
+C**** *IARCNTL*
+C
+C Purpose
+C -------
+C
+C The global controlling routine for interpolating between a quasi
+C regular Gaussian input field and a regular Gaussian or
+C latitude/longitude output field.
+C
+C
+C Interface
+C ---------
+C
+C IERR = IARCNTL(PIFELD, KILEN, POFELD, KOLEN, KILN, OIWEGLOBE,
+C 1 OINPOLE, OISPOLE, KOLN, OOWEGLOBE, OONPOLE, OOSPOLE, KPR,
+C 2 KERR)
+C
+C
+C Input parameters
+C ----------------
+C
+C PIFELD - The input field provided by the calling routine.
+C
+C KILEN - The length of the input field.
+C
+C KOLEN - The length of the output field.
+C
+C KILN - The Northern line number of the input field within
+C its Gaussian field.
+C
+C OIWEGLOBE - A flag indicating whether the input field is
+C global West to East.
+C
+C OINPOLE - A flag indicating whether the North pole is
+C included in the input field.
+C
+C OISPOLE - A flag indicating whether the South pole is
+C include in the input field.
+C
+C KOLN - The Northern line number of the output field
+C within its Gaussian field.
+C
+C OOWEGLOBE - A flag indicating whether the output field is
+C global West to East.
+C
+C OONPOLE - A flag indicating whether the North pole is
+C include in the output field.
+C
+C OOSPOLE - A flag indicating whether the South pole is
+C include in the output field.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C
+C Output parameters
+C -----------------
+C
+C POFELD - The output field returned to the calling routine.
+C
+C
+C Return value
+C ------------
+C
+C The error indicator (INTEGER).
+C
+C
+C Error and Warning Return Values
+C -------------------------------
+C
+C 21901 The input data representation was not valid when the
+C grid was generated. This should not happen as the data
+C representation has been previously validated.
+C 21902 The output data representation was not valid when the
+C grid was generated. This should not happen as the data
+C representation has been previously validated.
+C 21903 Attempt to produce global West-East field where the input
+C field was not global.
+C 21904 Attempt to produce global North-South field where the
+C input field was not global.
+C
+C
+C Common block usage
+C ------------------
+C
+C grspace.h - The include file contains all the array space
+C for grid to grid interpolation.
+C
+C MILLEN - The array of quasi regular Gaussian field
+C latitude line length definition.
+C RIGAUSS - Real array of input field Gaussian latitudes is
+C used.
+C ROGAUSS - Real array of output field Gaussian latitudes is
+C used.
+C
+C MILATG - The input field latitudes.
+C MILONG - The input field longitudes.
+C MISTRT - The array offsets for the start of each latitude
+C line for a quasi regular Gaussian input field.
+C MNSDIST - The distances to neighbouring latitude lines of
+C the input field from the associated line of
+C latitude in the output field.
+C MNSIND - The latitude line numbers (array offset) of the
+C input field associated with each line of
+C latitude in the output field.
+C MOLATG - The output field latitudes.
+C MOLONG - The output field longitudes.
+C MWEDIST - This array holds the distances to neighbouring
+C longitude points of the input field from the
+C associated longitude points in the output field.
+C MWEIND - This array holds the longitude points (array
+C offset) from the input field associated with
+C each longitude point in the output field.
+C RINPNT - Array used to aid vectorisation in processing
+C precipitation fields.
+C RMAX - Array used to aid vectorisation in normalising
+C interpolation weights and processing
+C precipitation fields.
+C WFACT - The array of interpolation weights for each
+C point in the output field.
+C
+C nifld.common - This file contains all the input field
+C definition variables.
+C
+C LCHANGE - Process change flag is used and set.
+C LSMCHNG - LSM change flag is used and set.
+C LSM - LSM usage flag is used.
+C LSMPAR - LSM parameter flag is used.
+C LPREC - Precipitation flag is used.
+C LWIND - Wind flag is used.
+C
+C NIAREA - Input field area definition (N/W/S/E) is used.
+C NIGAUSS - Input field Gaussian truncation is used.
+C NIGRID - Input field grid definition (WE/NS) is used.
+C NINS - Number of grid points in NS direction for input
+C field is used.
+C NIREPR - Input field representation is used.
+C NIWE - Number of grid points in WE direction for input
+C field is used.
+C
+C nofld.common - This file contains all the output field
+C definition variables.
+C
+C NOAREA - Output field area definition (N/W/S/E) is used.
+C NOGAUSS - Output field Gaussian truncation is used.
+C NOGRID - Output field grid definition (WE/NS) is used.
+C NONS - Number of grid points in NS direction for output
+C field is used.
+C NOREPR - Output field representation is used.
+C NOWE - Number of grid points in WE direction for output
+C field is used.
+C
+C
+C Externals
+C ---------
+C
+C ABORTX - Standard routine to kill task.
+C IGDINS - Calculate the distances between points in an
+C output latitude array and its North and South
+C neighbours in the input latitude array.
+C IGGRID - Generate the arrays of latitude and longitude
+C points for a Gaussian truncation and area.
+C IGLGRID - Generate the arrays of latitude and longitude
+C points for a regular latitude longitude grid.
+C IGLSIZE - Evaluate the array sizes for a regular
+C latitude/longitude field.
+C IGLSMD - Generate the land sea mask file information.
+C IGNORM - Normalise the array of interpolation weights.
+C IGPLSM - Force an interpolated land sea mask field back to
+C a real 0-1 field.
+C IGPOLEG - Calculate the values at the pole of a regular
+C latitude/longitude field when the input is a
+C Gaussian field.
+C IGPOLEW - Calculates the values at the pole of a regular
+C latitude/longitude wind field when the input is a
+C Gaussian field.
+C IGSIZE - Evaluate the array sizes for a Gaussian field.
+C IRDIWE - Calculate the distances between points in an
+C output longitude array and its West and East
+C neighbours in the input longitude array for a
+C quasi regular input field and regular output field.
+C IRGMEM - This routine acquires heap space for quasi regular
+C to regular interpolation.
+C IRGRID - Generate the arrays of latitude points and the
+C starting points of the lines of latitude for a
+C quasi regular Gaussian grid.
+C IRGTOG - Perform basic interpolation between the input and
+C output fields for a quasi regular input field and
+C a regular output field.
+C IRINT - Calculate the basic unnormalised interpolation
+C weights when interpolating from a quasi regular
+C grid to a regular grid.
+C IRLSMB - Calculate the effects of the land-sea masks on the
+C unnormalised interpolation weights for a quasi
+C regular input field and regular output field.
+C IRPREC - Perform additional interpolation processes for
+C precipitation fields when the input field is Quasi
+C regular.
+C ZPREC - Perform additional interpolation processes
+C for precipitation
+C IRSIZE - Evaluate the array sizes for a quasi regular
+C Gaussian field.
+C INTLOG - Logs messages.
+C
+C
+C Method
+C ------
+C This is purely a controlling routine with all the work being
+C performed in the external routines.
+C
+C
+C Reference
+C ---------
+C None
+C
+C
+C Comments
+C --------
+C None
+C
+C
+C Author
+C ------
+C K. Fielding *ECMWF* Nov 1993
+C
+C
+C Modifications
+C -------------
+C J.Chambers ECMWF Oct 1998
+C Allow field type for rotated grids.
+C
+C S.Curic ECMWF Oct 2005
+C Add zprec routine that Perform checking
+C of precipitation
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grspace.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 21900)
+C
+C Function arguments
+C
+ LOGICAL OIWEGLOBE, OINPOLE, OISPOLE, OOWEGLOBE, OONPOLE, OOSPOLE
+ INTEGER KILEN, KOLEN, KILN, KOLN, KPR, KERR
+ REAL PIFELD(KILEN), POFELD(KOLEN)
+C
+C Local variables
+C
+ LOGICAL LFAIL, LERROR, LDEBUG, LREGOUT
+ LOGICAL GINSPOLE, GIGLOBE, GISTAND, GONSPOLE, GOGLOBE, GOSTAND
+ LOGICAL GPREC,LSM_VALUES
+ CHARACTER*120 YIFILE, YOFILE
+ CHARACTER*12 YFLAG
+ INTEGER IIOFF, IINDEX, IOOFF
+ INTEGER IIREC, IOREC, IERR
+C
+C Working copies of area and grid arrays that may be changed
+C
+ INTEGER IILGRID(2), IILLINE(2), IOLGRID(2), IOLLINE(2)
+C
+C External functions
+C
+ INTEGER IGDINS, IGGRID, IGLGRID, IGLSMD, IGNORM, IGPLSM,
+ X IGPOLEG, IGPOLEW,
+ X IRDIWE, IRGMEM, IRGRID, IRGTOG, IRINT, IRLSMB, IRPREC,
+ X ZPREC
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialisation
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IARCNTL = 0
+ IERR = 0
+C
+C Set all flag variables
+C
+ LDEBUG = (KPR.GE.1)
+ LFAIL = (KERR.EQ.0)
+ LERROR = (KERR.GE.0)
+ LREGOUT = (NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT)
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Section 1.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'IARCNTL: Input field definition parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Representation = ',NIREPR)
+ IF( NINS.NE.0 ) CALL INTLOG(JP_DEBUG,
+ X 'IARCNTL: Number N-S = ',NINS)
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Gaussian truncation= ',NIGAUSS)
+ IF( NIAREA(1).NE.0 ) THEN
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Area North = ',NIAREA(1))
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Area West = ',NIAREA(2))
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Area South = ',NIAREA(3))
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Area East = ',NIAREA(4))
+ ENDIF
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'IARCNTL: Output field definition parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Representation = ',NOREPR)
+ IF( NOWE.NE.0 ) CALL INTLOG(JP_DEBUG,
+ X 'IARCNTL: Number W-E = ',NOWE)
+ IF( NONS.NE.0 ) CALL INTLOG(JP_DEBUG,
+ X 'IARCNTL: Number N-S = ',NONS)
+ IF( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPQUASI) )
+ X CALL INTLOG(JP_DEBUG,'IARCNTL: Gaussian truncation= ',NOGAUSS)
+ IF( LREGOUT.AND.NOGRID(1).NE.0 ) THEN
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Grid WE = ',NOGRID(1))
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Grid NS = ',NOGRID(2))
+ ENDIF
+ IF( NOAREA(1).NE.0 ) THEN
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Area North = ',NOAREA(1))
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Area West = ',NOAREA(2))
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Area South = ',NOAREA(3))
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Area East = ',NOAREA(4))
+ ENDIF
+C
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Control flag status:',JPQUIET)
+C
+ IF( LSMCHNG ) THEN
+ CALL INTLOG(JP_DEBUG,'IARCNTL: LSM change TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IARCNTL: LSM change FALSE',JPQUIET)
+ ENDIF
+C
+ IF( LSM ) THEN
+ CALL INTLOG(JP_DEBUG,'IARCNTL: LSM flag TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IARCNTL: LSM flag FALSE',JPQUIET)
+ ENDIF
+C
+ IF( LWIND ) THEN
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Wind flag TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Wind flag FALSE',JPQUIET)
+ ENDIF
+C
+ IF( LPREC ) THEN
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Precipitn flag TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IARCNTL: Precipitn flag FALSE',JPQUIET)
+ ENDIF
+C
+ IF( LSMPAR ) THEN
+ CALL INTLOG(JP_DEBUG,'IARCNTL: LSM param flag TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IARCNTL: LSM param flag FALSE',JPQUIET)
+ ENDIF
+ ENDIF
+C
+C The change of parameter option spans sections 2 to 3
+C
+ IF( LCHANGE ) THEN
+C
+C -----------------------------------------------------------------|
+C* Section 2. Get space and define grids.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,'IARCNTL: Section 2.',JPQUIET)
+C
+C Get the required memory
+C
+ IARCNTL = IRGMEM(KPR, KERR)
+ IF( IARCNTL.GT.0 ) GOTO 900
+C
+C Input field definition
+C
+ IF( NIREPR.EQ.JPQUASI ) THEN
+C
+ IARCNTL = IRGRID(NIAREA, MILLEN, KILN, RIGAUSS, MISTRT,
+ X MILATG, NINS, OIWEGLOBE, KPR, KERR)
+ IF( IARCNTL.GT.0 ) GOTO 900
+C
+C Is the input field global
+C
+ GINSPOLE = OINPOLE.AND.OISPOLE
+ GIGLOBE = OIWEGLOBE.AND.GINSPOLE
+C
+ ELSE
+C
+ IARCNTL = JPROUTINE + 1
+ IF( LERROR ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IARCNTL: Illegal input data representation = ',NIREPR)
+ IF( LFAIL ) CALL INTLOG(JP_FATAL,
+ X 'IARCNTL: Interpolation failing.',JPQUIET)
+ ENDIF
+ GOTO 900
+C
+ ENDIF
+C
+C Output grid definition
+C
+C Is the output field global North South
+C
+ GONSPOLE = OONPOLE.AND.OOSPOLE
+ GOGLOBE = OOWEGLOBE.AND.GONSPOLE
+
+ IF(GOGLOBE.AND.NOAREA(2).EQ.0) THEN
+ LGLOBL = .TRUE.
+ ELSE
+ LGLOBL = .FALSE.
+ ENDIF
+
+C
+ IF( NOREPR.EQ.JPGAUSSIAN ) THEN
+C
+ IARCNTL = IGGRID(NOGAUSS, NOAREA, KOLN, ROGAUSS,
+ X MOLONG,NOWE,MOLATG,NONS,OOWEGLOBE,KPR,KERR)
+ IF( IARCNTL.GT.0 ) GOTO 900
+C
+ ELSEIF ( LREGOUT ) THEN
+C
+ IARCNTL = IGLGRID(NOGRID, NOAREA, MOLONG, NOWE, MOLATG,
+ X NONS, OOWEGLOBE, KPR, KERR)
+ IF( IARCNTL.GT.0 ) GOTO 900
+C
+ ELSE
+C
+ IARCNTL = JPROUTINE + 2
+ IF( LERROR ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IARCNTL: Illegal output data representation = ',NIREPR)
+ IF( LFAIL ) CALL INTLOG(JP_FATAL,
+ X 'IARCNTL: Interpolation failing.',JPQUIET)
+ ENDIF
+ GOTO 900
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Create output to input grid mapping and distance arrays
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( LDEBUG )
+ X CALL INTLOG(JP_DEBUG,'IARCNTL: Section 3.',JPQUIET)
+C
+C First check that the input and output fields are compatible.
+C
+ IF( .NOT.GIGLOBE ) THEN
+C
+ IF( .NOT.OIWEGLOBE ) THEN
+C
+C Cannot produce global output field if input field not global
+C
+ IF( OOWEGLOBE ) THEN
+ IARCNTL = JPROUTINE + 3
+ IF( LERROR ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IARCNTL: Cannot produce global output from',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'IARCNTL: non-global input. The W-E input',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'IARCNTL: direction was not global.',JPQUIET)
+ IF( LFAIL ) CALL INTLOG(JP_FATAL,
+ X 'IARCNTL: Interpolation failing.',JPQUIET)
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+ IF( .NOT.GINSPOLE ) THEN
+C
+C Cannot produce global output field if input field not global
+C
+ IF( GONSPOLE ) THEN
+ IARCNTL = JPROUTINE + 4
+ IF( LERROR ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IARCNTL: Cannot produce global output from',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'IARCNTL: non-global input. The N-S input',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'IARCNTL: direction was not global.',JPQUIET)
+ IF( LFAIL ) CALL INTLOG(JP_FATAL,
+ X 'IARCNTL: Interpolation failing.',JPQUIET)
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+ ENDIF
+C
+ IARCNTL = IGDINS(MILATG, NINS, MOLATG, NONS, OINPOLE,
+ X OISPOLE, MNSIND, MNSDIST, KPR, KERR)
+ IF( IARCNTL.GT.0 ) GOTO 900
+C
+ IARCNTL = IRDIWE(MILLEN, NINS, MNSIND, NONS, MILONG, NIWE,
+ X MOLONG, NOWE, MWEIND, MWEDIST, KPR, KERR)
+ IF( IARCNTL.GT.0 ) GOTO 900
+C
+C The end of primary initialisation
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4. Create normalised weight arrays
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,'IARCNTL: Section 4.',JPQUIET)
+C
+C The following code is affected by the Land Sea mask flag
+C
+ IF( LCHANGE.OR.LSMCHNG ) THEN
+C
+ IARCNTL = IRINT(MWEDIST, NOWE, MNSDIST, NONS, WFACT, KPR, KERR)
+ IF( IARCNTL.GT.0 ) GOTO 900
+C
+ IF( LSM ) THEN
+C
+ IARCNTL = IGLSMD(NIDATE,NIREPR,NIGRID,NIGAUSS,NIAREA,KILN,
+ X YIFILE,GISTAND,IILGRID,IILLINE,IIREC,KPR,KERR)
+ IF( IARCNTL.GT.0 ) GOTO 900
+C
+ IARCNTL = IGLSMD(NODATE,NOREPR,NOGRID,NOGAUSS,NOAREA,KOLN,
+ X YOFILE,GOSTAND,IOLGRID,IOLLINE,IOREC,KPR,KERR)
+ IF( IARCNTL.GT.0 ) GOTO 900
+C
+ IARCNTL = IRLSMB(GISTAND, YIFILE, IIREC, IILGRID, IILLINE,
+ X GOSTAND,YOFILE,IOREC,IOLGRID,IOLLINE,KPR,KERR)
+ IF( IARCNTL.GT.0 ) GOTO 900
+C
+ ENDIF
+C
+C Normalise the weights
+C
+ IARCNTL = IGNORM(WFACT, RMAX, NOWE, NONS, KPR, KERR)
+ IF( IARCNTL.GT.0 ) GOTO 900
+C
+C This marks the end of a change to the specfication
+C Clear the Change flags LCHANGE and LSMCHNG
+C
+ LCHANGE = .FALSE.
+ LSMCHNG = .FALSE.
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 5. Interpolate from input to output field
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,'IARCNTL: Section 5.',JPQUIET)
+C
+C Perform basic interpolation
+C
+ IARCNTL = IRGTOG(PIFELD, MISTRT, NINS, NOWE, NONS, MWEIND,
+ X MNSIND, WFACT, POFELD, KPR, KERR)
+ IF( IARCNTL.GT.0 ) GOTO 900
+C
+C -----------------------------------------------------------------|
+C* Section 6. Additional interpolations from input to output field
+C -----------------------------------------------------------------|
+C
+ 600 CONTINUE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,'IARCNTL: Section 6.',JPQUIET)
+C
+C Precipitation field
+C
+C Force processing without neighbour check
+ GPREC = .FALSE.
+ CALL GETENV('PRECIPITATION_NEIGHBOUR_CHECK', YFLAG)
+ IF( YFLAG(1:1).EQ.'0' ) GPREC = .TRUE.
+
+ IF( LPREC ) THEN
+C
+ IF( GPREC ) THEN
+ IARCNTL = ZPREC(POFELD, NOWE, NONS, KPR, KERR)
+ ELSE
+ IARCNTL = IRPREC(PIFELD, MISTRT, NINS, POFELD, NOWE, NONS,
+ X MWEIND, MNSIND, WFACT, RMAX, RINPNT, KPR, KERR)
+ ENDIF
+ IF( IARCNTL.GT.0 ) GOTO 900
+C
+ ENDIF
+C
+C Special code for poles if Gaussian input and regular output
+C
+C North pole
+C
+ IF( (NIREPR.EQ.JPQUASI).AND.
+ X LREGOUT .AND.
+ X OINPOLE .AND.
+ X OONPOLE ) THEN
+C
+ IIOFF = MISTRT(1)
+ IOOFF = 1
+ IINDEX = (JP_I_N - 1) * NOWE + 1
+C
+ IF( LWIND ) THEN
+ IARCNTL = IGPOLEW(PIFELD(IIOFF), MILLEN(1),
+ X POFELD(IOOFF), NOWE, MWEIND(1,IINDEX),
+ X MWEDIST(1,IINDEX), KPR, KERR)
+ ELSE
+ IARCNTL = IGPOLEG(PIFELD(IIOFF), MILLEN(1),
+ X POFELD(IOOFF), NOWE, KPR, KERR)
+ ENDIF
+ IF( IARCNTL.GT.0 ) GOTO 900
+C
+ ENDIF
+C
+C South pole
+C
+ IF( (NIREPR.EQ.JPQUASI).AND.
+ X LREGOUT .AND.
+ X OISPOLE .AND.
+ X OOSPOLE ) THEN
+C
+ IIOFF = MISTRT(NINS)
+ IOOFF = (NONS - 1) * NOWE + 1
+ IINDEX = ( (NONS - 1) * 2 + JP_I_S - 1) * NOWE + 1
+C
+ IF( LWIND ) THEN
+ IARCNTL = IGPOLEW(PIFELD(IIOFF), MILLEN(NINS),
+ X POFELD(IOOFF), NOWE, MWEIND(1,IINDEX),
+ X MWEDIST(1,IINDEX), KPR, KERR)
+ ELSE
+ IARCNTL = IGPOLEG(PIFELD(IIOFF), MILLEN(NINS),
+ X POFELD(IOOFF), NOWE, KPR, KERR)
+ ENDIF
+C
+ IF( IARCNTL.GT.0 ) GOTO 900
+C
+ ENDIF
+C
+C LSM field - must be 0 or 1
+C
+C Force processing real LSM
+ LSM_VALUES = .FALSE.
+ CALL GETENV('LSM_VALUES', YFLAG)
+ IF( YFLAG(1:1).EQ.'1' ) LSM_VALUES = .TRUE.
+
+ IF( .NOT.LSM_VALUES.AND.LSMPAR ) THEN
+ IARCNTL = IGPLSM(POFELD, NOWE * NONS, KPR, KERR)
+ IF( IARCNTL.GT.0 ) GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return to calling routine. Format statements
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,'IARCNTL: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/iareset.F b/interpolation/iareset.F
new file mode 100755
index 0000000..915a648
--- /dev/null
+++ b/interpolation/iareset.F
@@ -0,0 +1,307 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IARESET (KSEC2, KSEC4, KVALUES, KPR, KERR)
+C
+C---->
+C**** *IARESET*
+C
+C PURPOSE
+C _______
+C
+C Generate the output field definition.
+C
+C INTERFACE
+C _________
+C
+C IERR = IARESET (KSEC2, KSEC4, KVALUES, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KSEC2 - The GRIB Section 2 array for the input field.
+C
+C KSEC4 - The GRIB Section 4 array for the input field.
+C
+C KVALUES - The number of values in the output field.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C KSEC2 - The modified GRIB Section 2 array for the output
+C field.
+C
+C KSEC4 - The modified GRIB Section 4 array for the output
+C field.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C nofld.common - This file contains all the output field
+C definition variables.
+C
+C NOACC - Number of packing bits to be used for output
+C GRIB field is used.
+C NOAREA - Output field area definition (N/W/S/E) is used.
+C NOGAUSS - Output field Gaussian truncation is used.
+C NOGRID - Output field grid definition (WE/NS) is used.
+C NONS - Number of grid points in NS direction for output
+C field is used.
+C NOREPR - Output field representation is used.
+C NOSCNM - Output field scanning mode is used.
+C NOWE - Number of grid points in WE direction for output
+C field is used.
+C
+C EXTERNALS
+C _________
+C
+C SETPAR - Standard routine used to generate "missing" data
+C values for GRIB fields.
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C This routine modifies sections 2 and 4 of the GRIB definition
+C to match the output field.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 4 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Apr 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nofld.common"
+C
+C Dummy arguments
+ INTEGER KVALUES, KPR, KERR
+ INTEGER KSEC2 (JPGRIB_ISEC2), KSEC4 (JPGRIB_ISEC4)
+C
+C Local variables
+ INTEGER IWEINC, ITEMP, IMISS, IERR
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 24200)
+C
+C External functions
+C
+C Transform definition variables that must be preserved
+C
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IARESET: Section 1.',JPQUIET)
+C
+ IARESET = 0
+ IERR = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IARESET: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'IARESET: No.bits for output field packing = ',NOACC)
+ CALL INTLOG(JP_DEBUG,
+ X 'IARESET: No.values to be packed = ',KVALUES)
+ IF (NOREPR .EQ. JPREGULAR) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'IARESET: West-East stride = ', NOGRID (JPWESTEP))
+ CALL INTLOG(JP_DEBUG,
+ X 'IARESET: North-South stride = ', NOGRID (JPNSSTEP))
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'IARESET: Gaussian truncation = ',NOGAUSS)
+ ENDIF
+ ENDIF
+C
+C Get GRIB missing data value
+C
+ CALL SETPAR (ITEMP, IMISS, KPR)
+C
+C Representation
+C
+ KSEC2 (JPSEC2_REP) = NOREPR
+ KSEC2 (JPSEC2_SCAN) = NOSCNM
+C
+C _______________________________________________________
+C
+C* Section 2. Set Grib Section 2 regular grid variables
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (NOREPR .EQ. JPREGULAR) THEN
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IARESET: Section 2.',JPQUIET)
+C
+ KSEC2 (JPSEC2_QUASI) = 0
+C
+ KSEC2 (JPSEC2_NLONG) = NOWE
+ KSEC2 (JPSEC2_NLAT) = NONS
+C
+ KSEC2 (JPSEC2_NORTH) = NOAREA (JPNORTH) / 10
+ KSEC2 (JPSEC2_WEST) = NOAREA (JPWEST) / 10
+ KSEC2 (JPSEC2_SOUTH) = NOAREA (JPSOUTH) / 10
+C
+ IF (MOD (NOAREA (JPEAST), 10) .EQ. 5) THEN
+ KSEC2 (JPSEC2_EAST) = NOAREA (JPEAST) / 10 + 1
+ ELSE
+ KSEC2 (JPSEC2_EAST) = NOAREA (JPEAST) / 10
+ ENDIF
+C
+ IF (MOD (NOGRID (JPWESTEP), 10) .EQ. 5 .OR.
+ X MOD (NOGRID (JPNSSTEP), 10) .EQ. 5) THEN
+C
+ KSEC2 (JPSEC2_RESOL) = 0
+ KSEC2 (JPSEC2_DLONG) = IMISS
+ KSEC2 (JPSEC2_DLAT) = IMISS
+C
+ ELSE
+C
+ KSEC2 (JPSEC2_RESOL) = 128
+ KSEC2 (JPSEC2_DLONG) = NOGRID (JPWESTEP) / 10
+ KSEC2 (JPSEC2_DLAT) = NOGRID (JPNSSTEP) / 10
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 3. Set Grib Section 2 Gaussian values
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ ELSE IF (NOREPR .EQ. JPGAUSSIAN) THEN
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IARESET: Section 3.',JPQUIET)
+C
+ KSEC2 (JPSEC2_QUASI) = 0
+C
+ KSEC2 (JPSEC2_GTRUNC) = NOGAUSS
+ KSEC2 (JPSEC2_NLONG) = NOWE
+ KSEC2 (JPSEC2_NLAT) = NONS
+C
+ KSEC2 (JPSEC2_NORTH) = NOAREA (JPNORTH) / 10
+ KSEC2 (JPSEC2_WEST) = NOAREA (JPWEST) / 10
+ KSEC2 (JPSEC2_SOUTH) = NOAREA (JPSOUTH) / 10
+C
+ IF (MOD (NOAREA (JPEAST), 10) .EQ. 5) THEN
+ KSEC2 (JPSEC2_EAST) = NOAREA (JPEAST) / 10 + 1
+ ELSE
+ KSEC2 (JPSEC2_EAST) = NOAREA (JPEAST) / 10
+ ENDIF
+C
+ IWEINC = JP90 / NOGAUSS
+C
+ IF (MOD (IWEINC, 10) .EQ. 5) THEN
+C
+ KSEC2 (JPSEC2_RESOL) = 0
+ KSEC2 (JPSEC2_DLONG) = IMISS
+C
+ ELSE
+C
+ KSEC2 (JPSEC2_RESOL) = 128
+ KSEC2 (JPSEC2_DLONG) = IWEINC / 10
+C
+ ENDIF
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 4. Set Grib Section 4 values
+C _______________________________________________________
+C
+ 400 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IARESET: Section 4.',JPQUIET)
+C
+ KSEC4 (JPSEC4_NVALUE) = KVALUES
+C
+ IF (NOACC .NE. 0) KSEC4 (JPSEC4_NBITS) = NOACC
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IARESET: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/iarmem.F b/interpolation/iarmem.F
new file mode 100755
index 0000000..0451fea
--- /dev/null
+++ b/interpolation/iarmem.F
@@ -0,0 +1,237 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IARMEM (KIMEM, KOMEM, KPR, KERR)
+C
+C---->
+C**** *IARMEM*
+C
+C PURPOSE
+C _______
+C
+C This routine acquires heap space for expanded REAL fields.
+C
+C INTERFACE
+C _________
+C
+C IERR = IARMEM (KIMEM, KOMEM, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KIMEM - Space required for input field.
+C
+C KOMEM - Space required for output field.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C None
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C nifld.common - This file contains all the input field
+C definition variables.
+C
+C NINS - Number of grid points in NS direction for input
+C field (used in ouspace.h).
+C NIWE - Number of grid points in WE direction for input
+C field (used in ouspace.h).
+C
+C nofld.common - This file contains all the output field
+C definition variables.
+C
+C NONS - Number of grid points in NS direction for output
+C field (used in ouspace.h).
+C NOWE - Number of grid points in WE direction for output
+C field (used in ouspace.h).
+C
+C ouspace.h - This file contains the work space array
+C definitions for the arrays to hold the unpacked
+C real data from GRIB fields.
+C
+C NIFELD - POINTER to array RIFELD.
+C NOFELD - POINTER to array ROFELD.
+C
+C RIFELD - Dynamic array of length (NIWE * NINS)
+C (see nifld.common) which holds the expanded
+C input field.
+C ROFELD - Dynamic array of length (NOWE * NONS)
+C (see nofld.common) which holds the expanded
+C output field.
+C
+C EXTERNALS
+C _________
+C
+C IGALLOC - Get a heap allocation for array space.
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C This routine calculates how much heap space is required. It
+C then calls IGALLOC to acquire the required space. Finally the
+C POINTERs to the arrays in ouspace.h are initialised to allow
+C the use of the dynamic arrays.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 3 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Apr 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "ouspace.h"
+C
+C Dummy arguments
+ INTEGER KIMEM, KOMEM, KPR, KERR
+C
+C Local variables
+ INTEGER IBASE, IERR
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 24100)
+C
+C External functions
+ INTEGER IGALLOC
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IARMEM: Section 1.',JPQUIET)
+C
+ IARMEM = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IARMEM: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IARMEM: Input fld space = ',KIMEM)
+ CALL INTLOG(JP_DEBUG,'IARMEM: Output fld space = ',KOMEM)
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Calculate memory required and get heap
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IARMEM: Section 2.',JPQUIET)
+C
+C Get the required memory
+C
+ IERR = IGALLOC (JPGRIB_SPACE, (KIMEM + KOMEM) * JPRLEN, IBASE,
+ 1 KPR, KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IARMEM = IERR
+ GO TO 900
+ ENDIF
+C
+C _______________________________________________________
+C
+C
+C* Section 3. Initialise base addresses for POINTER arrays
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IARMEM: Section 3.',JPQUIET)
+C
+ NIFELD = IBASE
+ NOFELD = NIFELD + KIMEM * JPRLEN
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IARMEM: Output base addresses.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IARMEM: Input fld base address = ',NIFELD)
+ CALL INTLOG(JP_DEBUG,'IARMEM: Output fld base address= ',NOFELD)
+ ENDIF
+C
+C _______________________________________________________
+C
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IARMEM: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/ibasini.F b/interpolation/ibasini.F
new file mode 100755
index 0000000..3e121f6
--- /dev/null
+++ b/interpolation/ibasini.F
@@ -0,0 +1,206 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IBASINI(KFORCE)
+C
+C---->
+C**** IBASINI
+C
+C Purpose
+C -------
+C
+C Ensures basic initialisation of common blocks is done
+C
+C Interface
+C ---------
+C
+C IRET = IBASINI(KFORCE)
+C
+C
+C Input parameters
+C ----------------
+C
+C KFORCE = 1, to force initialisation of common blocks.
+C = 0, to check if initialisation of common blocks is done
+C already (and do it if not already done).
+C
+C
+C Method
+C ------
+C
+C NJDCDOT in nifld.common is checked/set.
+C
+C Looks for environment variable INTERP_GEN_COEFFS which gives
+C the name of a file containing the cutoff spectral truncation
+C above which interpolation coefficients are generated 'on the
+C fly'. Variable NICOMP is set with this value in nifld.common.
+C The file contains entries for each computer architecture in
+C format:
+C
+C col 1
+C |
+C v
+C FUJITSU 319
+C sgimips 213
+C hppa 213
+C DEFAULT 106
+C
+C If no matching $ARCH value, the DEFAULT value is used.
+C If no matching $ARCH and no DEFAULT value, a hard-code value is used.
+C
+C Looks for environment variable USE_HIRLAM_12POINT to determine
+C whether or not the Hiralm 12-point horizontal interpolation is
+C to be used for rotations.
+C
+C
+C Externals
+C ---------
+C
+C CLEAR_C - Clear common block variables
+C RDDEFS - Read interpolation handling default values
+C GETENV - Get value of an environment variable
+C JINDEX - Returns length of character string
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF August 1994.
+C
+C----<
+C
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "intf.h"
+C
+C Function arguments
+C
+ INTEGER KFORCE
+C
+C Local variables
+C
+ CHARACTER*120 LINE
+ CHARACTER*20 ARCH, USEHIR
+ CHARACTER*256 CONFIG
+ INTEGER IMAGIC, IRET, ICONFIG, IBLANK, LOOP
+ DATA ICONFIG/69/
+ DATA IMAGIC/1952999238/
+C
+C Externals
+C
+ INTEGER RDDEFS, JINDEX
+C
+C -----------------------------------------------------------------|
+C Section 1. Force initialisation if requested.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IF ( KFORCE .EQ. 1 ) NJDCDOT = 0
+C
+C See if basic initialisation has already been done or not
+C
+ IF ( NJDCDOT .NE. IMAGIC ) THEN
+C
+C Clear common block variables
+C
+ CALL CLEAR_C()
+C
+ IRET = 1
+ CALL IAINIT(0,IRET)
+C
+C Set interpolation handling default values
+C (Replaces old call to rddefs)
+C
+ NILOCAL = 0
+ NISTREM = 0
+ NIFORM = 1
+ NOFORM = 1
+ NITABLE = 128
+ NOTABLE = 128
+ NIPARAM = 0
+ DO LOOP = 1,4
+ NIAREA(LOOP) = 0
+ NOAREA(LOOP) = 0
+ ENDDO
+ NISCNM = 0
+ NOSCNM = 0
+C
+C Set default value for truncation above which interpolation
+C coefficients are to be computed dynamically
+C
+ NICOMP = 319
+C
+C Now see if this default value has been modified in a
+C configuration file
+C
+ CALL GETENV('INTERP_GEN_COEFFS', CONFIG)
+ IBLANK = JINDEX(CONFIG)
+ IF( IBLANK.GE.1 ) THEN
+C
+C Open the configuration file
+C
+ OPEN( ICONFIG, FILE=CONFIG, STATUS='OLD', ERR=200)
+ CALL GETENV('ARCH', ARCH)
+ IBLANK = JINDEX(ARCH)
+ IF( IBLANK.LT.1 ) ARCH = 'DEFAULT'
+ IBLANK = JINDEX(ARCH)
+C
+C Look for matching 'arch'
+C
+ 110 CONTINUE
+ READ( ICONFIG, '(A)', END= 200) LINE
+ IF( ARCH(1:IBLANK).EQ.LINE(1:IBLANK) ) THEN
+ READ(LINE(IBLANK+1:),'(1X,I3)') NICOMP
+ GOTO 200
+ ENDIF
+C
+C Pickup default (will be used if no matching 'arch')
+C
+ IF( (LINE(1:7).EQ.'DEFAULT').OR.
+ X (LINE(1:7).EQ.'default') )
+ X READ(LINE(IBLANK+1:),'(1X,I3)') NICOMP
+C
+ GOTO 110
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 2. See if Hirlam 12-point horizontal interpolation to be
+C use for rotations (default = 'yes').
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ LUSEHIR = .TRUE.
+ CALL GETENV('USE_HIRLAM_12POINT', USEHIR)
+ IF( (USEHIR(1:3).EQ.'OFF').OR.(USEHIR(1:2).EQ.'NO') )
+ X LUSEHIR = .FALSE.
+C
+C -----------------------------------------------------------------|
+C Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+C Set 'magic number' to show basic initialisation has been done
+C
+ NJDCDOT = IMAGIC
+C
+ ENDIF
+C
+ IBASINI = 0
+C
+ RETURN
+ END
diff --git a/interpolation/igalloc.F b/interpolation/igalloc.F
new file mode 100755
index 0000000..7b8c4ab
--- /dev/null
+++ b/interpolation/igalloc.F
@@ -0,0 +1,346 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGALLOC (KLEVEL, KREQUEST, KADDR, KPR, KERR)
+C
+C---->
+C**** *IGALLOC*
+C
+C PURPOSE
+C _______
+C
+C This routine allocates heap space.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGALLOC (KLEVEL, KREQUEST, KADDR, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KLEVEL - The heap block number.
+C
+C KREQUEST - The amount of heap space required.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C KADDR - The base address of the heap space allocated.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C Cray error codes
+C
+Cray -1 HPDEALLC block is already free (Warning only).
+Cray
+Cray 24301 HPDEALLC attempt to free block at address outside the
+Cray bounds of the heap.
+Cray 24302 HPDEALLC attempt to free block at address which was not
+Cray the beginning of a block.
+Cray 24303 HPDEALLC returning any other non zero code.
+Cray 24304 HPALLOC request was not greater than 0 words.
+Cray 24305 HPALLOC called and not enough memory was available.
+Cray 24306 HPALLOC The memory arena has been truncated by a user
+Cray ssbreak(2) call.
+Cray 24307 HPALLOC returning any other non zero code.
+Cray
+Cray Errors 24301, 24302 and 24304 should not occur and any occurrence
+Cray of one of these errors should be reported to Meteorological
+Cray Applications.
+C
+C Sun and SGI error codes
+C
+C 24301 MALLOC memory allocation failed.
+C
+C Common block usage
+C __________________
+C
+C memreq.h - This file contains the memory request definition
+C variables.
+C
+C MADDR - The base addresses of the currently allocated
+C memory segments are modified.
+C MREQUEST - The sizes of the current memory requests are modified.
+C
+C EXTERNALS
+C _________
+C
+C INTLOG(R) - Logs messages.
+C
+C Cray externals
+C
+Cray HPALLOC - Cray library routine to allocate heap space.
+Cray HPDEALLC - Cray library routine to de-allocate heap space.
+C
+C Sun and SGI externals
+C
+C JFREE - Unix routine to free heap space.
+C JMALLOC - Unix routine to acquire heap space.
+C
+C METHOD
+C ______
+C
+C The heap block number is used to indicate which heap is being
+C modified. Currently heap 1 is used to acquire space for
+C expanding GRIB arrays into real arrays and heap 2 is used for
+C internal space during the interpolation process.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 2 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Jan 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "memreq.h"
+C
+C Function arguments
+C
+ INTEGER KLEVEL, KREQUEST, KPR, KERR
+#if (defined POINTER_64)
+ INTEGER*8 KADDR
+#else
+ INTEGER KADDR
+#endif
+C
+C Local variables
+C
+ INTEGER IABORT, IERROR
+#ifdef POINTER_64
+ INTEGER*8 IDUMMY
+#else
+ INTEGER IDUMMY
+#endif
+ DATA IDUMMY/0/
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 24300)
+C
+C External functions
+C
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+ EXTERNAL JMALLOC
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialisation
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IGALLOC = 0
+C
+ IF( KPR.GE.1 ) THEN
+ CALL INTLOG(JP_DEBUG,'IGALLOC: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGALLOC: Heap number = ',KLEVEL)
+ CALL INTLOG(JP_DEBUG,'IGALLOC: Heap request = ',KREQUEST)
+ CALL INTLOG(JP_DEBUG,'IGALLOC: Current heap =',MREQUEST(KLEVEL))
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Calculate arrays of weights
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IABORT = 0
+ IERROR = 0
+C
+ IF( MREQUEST(KLEVEL).LT.KREQUEST.AND.MREQUEST(KLEVEL).GT.0) THEN
+C
+C Memory required is greater than that currently allocated
+C
+C Return any heap in use for spectral -> grid point operations
+C
+ CALL JMEMHAN(1,IDUMMY,IDUMMY,0,IERROR)
+ CALL JMEMHAN(2,IDUMMY,IDUMMY,0,IERROR)
+C
+#ifdef CRAY
+Cray
+ CALL HPDEALLC(MADDR(KLEVEL),IERROR,IABORT)
+ IF( IERROR.EQ.-4 ) THEN
+ IGALLOC = - 1
+ CALL INTLOG(JP_ERROR,
+ X 'IGALLOC: Attempt to free block already free.',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'IGALLOC: at address = ',MADDR(KLEVEL))
+Cray
+ ELSE IF( IERROR.NE.0 ) THEN
+Cray
+ IF( IERROR.EQ.-3 ) THEN
+Cray
+ IGALLOC = JPROUTINE + 1
+ IF( KERR.GE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IGALLOC: Heap dealloc fail, error = ',IERROR)
+ CALL INTLOG(JP_ERROR,
+ X 'IGALLOC: Block outside heap at addr = ', MADDR(KLEVEL))
+ ENDIF
+Cray
+ ELSE IF( IERROR.EQ.-5 ) THEN
+Cray
+ IGALLOC = JPROUTINE + 2
+ IF( KERR.GE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IGALLOC: Heap dealloc fail, error = ',IERROR)
+ CALL INTLOG(JP_ERROR,
+ X 'IGALLOC: Addr not at start of block = ', MADDR(KLEVEL))
+ ENDIF
+Cray
+ ELSE
+Cray
+ IGALLOC = JPROUTINE + 3
+ IF( KERR.GE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IGALLOC: Heap dealloc fail, error = ',IERROR)
+ CALL INTLOG(JP_ERROR,
+ X 'IGALLOC: Attempt to free block addr = ', MADDR(KLEVEL))
+ ENDIF
+Cray
+ ENDIF
+Cray
+ IF( KERR.EQ.0 ) CALL INTLOG(JP_FATAL,
+ X 'IGALLOC: Interpolation failed.',IGALLOC)
+ GOTO 900
+Cray
+ ENDIF
+#else
+ CALL JFREE (MADDR (KLEVEL) )
+#endif
+ ENDIF
+C
+C First request for memory.
+C
+ IF( MREQUEST(KLEVEL).LT.KREQUEST ) THEN
+C
+C Return any heap in use for spectral -> grid point operations
+C
+ CALL JMEMHAN(1,IDUMMY,IDUMMY,0,IERROR)
+ CALL JMEMHAN(2,IDUMMY,IDUMMY,0,IERROR)
+C
+#ifdef CRAY
+ CALL HPALLOC(MADDR(KLEVEL),KREQUEST,IERROR,IABORT)
+Cray
+ IF( IERROR.NE.0 ) THEN
+Cray
+ IF( IERROR.EQ.-1 ) THEN
+ IGALLOC = JPROUTINE + 4
+ IF( KERR.GE.0 ) CALL INTLOG(JP_ERROR,
+ X 'IGALLOC: Negative memory request = ',KREQUEST)
+Cray
+ ELSE IF( IERROR.EQ.-2 ) THEN
+ IGALLOC = JPROUTINE + 5
+ IF( KERR.GE.0 ) CALL INTLOG(JP_ERROR,
+ X 'IGALLOC: Heap alloc failed = ',IERROR)
+Cray
+ ELSE IF( IERROR.EQ.-8 ) THEN
+ IGALLOC = JPROUTINE + 6
+ IF( KERR.GE.0 ) CALL INTLOG(JP_ERROR,
+ X 'IGALLOC: Heap alloc failed = ',IERROR)
+Cray
+ ELSE
+Cray
+ IGALLOC = JPROUTINE + 7
+ IF( KERR.GE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IGALLOC: Heap alloc failed = ',IERROR)
+ CALL INTLOG(JP_ERROR,
+ X 'IGALLOC: Memory requested = ', KREQUEST)
+ ENDIF
+ ENDIF
+Cray
+ IF( KERR.EQ.0 ) CALL INTLOG(JP_FATAL,
+ X 'IGALLOC: Interpolation failed.',IGALLOC)
+Cray
+ GOTO 900
+Cray
+ ENDIF
+#else
+ MADDR(KLEVEL) = JMALLOC(KREQUEST)
+#ifdef hpR64
+ MADDR(KLEVEL) = MADDR(KLEVEL)/(1024*1024*1024*4)
+#endif
+ IF( MADDR(KLEVEL).EQ.0 ) THEN
+C
+ IGALLOC = JPROUTINE + 8
+ CALL INTLOG(JP_ERROR,'IGALLOC: Memory requested = ',KREQUEST)
+ CALL INTLOG(JP_ERROR,
+ X 'IGALLOC: No more memory available from system.',JPQUIET)
+ IF( KERR.EQ.0 ) CALL INTLOG(JP_FATAL,
+ X 'IGALLOC: Interpolation failed.',IGALLOC)
+ GOTO 900
+ ENDIF
+#endif
+C
+ KADDR = MADDR(KLEVEL)
+ MREQUEST(KLEVEL) = KREQUEST
+C
+ ELSE
+C
+C Memory required is <= to that already allocated
+C
+ KADDR = MADDR(KLEVEL)
+C
+ ENDIF
+C
+ IF( KPR.GE.1 ) THEN
+ CALL INTLOG(JP_DEBUG,'IGALLOC: Return heap address = ',KADDR)
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return to calling routine. Format statements
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGALLOC: Section 9.',JPQUIET)
+
+ RETURN
+ END
diff --git a/interpolation/igbess.F b/interpolation/igbess.F
new file mode 100755
index 0000000..3b71717
--- /dev/null
+++ b/interpolation/igbess.F
@@ -0,0 +1,179 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGBESS(KTRUNC, PBESJ0, KPR, KERR)
+C
+C---->
+C**** *IGBESS*
+C
+C PURPOSE
+C _______
+C
+C Computes initial approximations to Gaussian latitudes.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGBESS(KTRUNC, PBESJ0, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KTRUNC - This is the number of zeros of the J0 Bessel
+C function required.
+C
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C PBESJ0 - The output array of zeros of the J0 Bessel function.
+C
+C Return Value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C The first JPLOOK values are obtained from a look-up table
+C (ZPBES). Any additional values requested are approximated by
+C adding PI (3.14159...) to the previous value.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C This routine is adapted from that in the old Marsint library.
+C The interface and the variable names have been modified.
+C
+C Program contains sections 0 to 2 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "jparams.h"
+#include "parim.h"
+C
+C Dummy arguments
+ INTEGER KTRUNC, KPR, KERR
+ REAL PBESJ0 (*)
+C
+C Local variables
+ INTEGER ILOOK
+ INTEGER JAPPRX, JLOOK
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 24400)
+ REAL ZPBES (JPLOOK)
+ DATA ZPBES / 2.4048255577E0, 5.5200781103E0,
+ 1 8.6537279129E0, 11.7915344391E0, 14.9309177086E0,
+ 2 18.0710639679E0, 21.2116366299E0, 24.3524715308E0,
+ 3 27.4934791320E0, 30.6346064684E0, 33.7758202136E0,
+ 4 36.9170983537E0, 40.0584257646E0, 43.1997917132E0,
+ 5 46.3411883717E0, 49.4826098974E0, 52.6240518411E0,
+ 6 55.7655107550E0, 58.9069839261E0, 62.0484691902E0,
+ 7 65.1899648002E0, 68.3314693299E0, 71.4729816036E0,
+ 8 74.6145006437E0, 77.7560256304E0, 80.8975558711E0,
+ 9 84.0390907769E0, 87.1806298436E0, 90.3221726372E0,
+ A 93.4637187819E0, 96.6052679510E0, 99.7468198587E0,
+ 1 102.8883742542E0, 106.0299309165E0, 109.1714896498E0,
+ 2 112.3130502805E0, 115.4546126537E0, 118.5961766309E0,
+ 3 121.7377420880E0, 124.8793089132E0, 128.0208770059E0,
+ 4 131.1624462752E0, 134.3040166383E0, 137.4455880203E0,
+ 5 140.5871603528E0, 143.7287335737E0, 146.8703076258E0,
+ 6 150.0118824570E0, 153.1534580192E0, 156.2950342685E0 /
+C
+C _______________________________________________________
+C
+C* Section 1. Extract initial values from look up table
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGBESS: Section 1.',JPQUIET)
+C
+ IGBESS = 0
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,
+ X 'IGBESS: No.values requested = ',KTRUNC)
+C
+ ILOOK = MIN (KTRUNC, JPLOOK)
+C
+ DO 110 JLOOK = 1, ILOOK
+ PBESJ0(JLOOK) = ZPBES(JLOOK)
+ 110 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 2. Approximate any extra values required
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF(KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGBESS: Section 2.',JPQUIET)
+C
+ DO 210 JAPPRX = ILOOK + 1, KTRUNC
+ PBESJ0(JAPPRX) = PBESJ0(JPLOOK) + PPI*(JAPPRX - ILOOK)
+ 210 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF(KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGBESS: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/igdins.F b/interpolation/igdins.F
new file mode 100755
index 0000000..ef0d472
--- /dev/null
+++ b/interpolation/igdins.F
@@ -0,0 +1,309 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGDINS (KILATG, KINS, KOLATG, KONS, ONPOLE,
+ 1 OSPOLE, KNSIND, KNSDIST, KPR, KERR)
+C
+C---->
+C**** *IGDINS*
+C
+C PURPOSE
+C _______
+C
+C Calculate the distances between points in an output latitude
+C array and its North and South neighbours in the input latitude
+C array.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGDINS (KILATG, KINS, KOLATG, KONS, ONPOLE, OSPOLE,
+C 1 KNSIND, KNSDIST, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KILATG - The array of input latitudes.
+C
+C KINS - The number of points in the North-South direction
+C in the input field.
+C
+C KOLATG - The array of output latitudes.
+C
+C KONS - The number of points in the North-South direction
+C in the output field.
+C
+C ONPOLE - This variable will be true if the input field
+C includes the most Northerly line of latitude for
+C the field type. This means latitude 90 North for
+C a regular field and the first line of a Gaussian
+C field.
+C
+C OSPOLE - This variable will be true if the input field
+C includes the most Southerly line of latitude for
+C the field type. This means latitude 90 South for
+C a regular field and the last line of a Gaussian
+C field.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C KNSIND - This array will contain the array offsets of the
+C North and South points in the input array required
+C for interpolation.
+C
+C KNSDIST - This array will contain the distances to lines
+C in input field from the associated lines of
+C latitude in the output field.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C 24501 An output latitude was found that was outside the area
+C spanned by the input latitudes.
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C This routine will create the arrays of offsets and distance as
+C two arrays of length (2, Number of output latitudes).
+C
+C If an input Gaussian grid includes the "polar" line and the
+C output field includes a line of latitude between this "polar"
+C line and the pole then the position of this "polar" Gaussian
+C line is assumed to be at the pole for that line of latitude only.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 2 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Dummy arguments
+ LOGICAL ONPOLE, OSPOLE
+ INTEGER KINS, KONS, KPR, KERR
+ INTEGER KILATG (KINS), KOLATG (KONS)
+ INTEGER KNSIND (2, KONS), KNSDIST (2, KONS)
+C
+C Local variables
+ INTEGER IBASE
+ INTEGER JOUT, JINP
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 24500)
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGDINS: Section 1.',JPQUIET)
+C
+ IGDINS = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IGDINS: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGDINS: No.input fld lines = ',KINS)
+ CALL INTLOG(JP_DEBUG,'IGDINS: No.output fld lines = ',KONS)
+ CALL INTLOG(JP_DEBUG,'IGDINS: Input fld spread from ',KILATG(1))
+ CALL INTLOG(JP_DEBUG,'IGDINS: to ', KILATG(KINS))
+ CALL INTLOG(JP_DEBUG,'IGDINS: Outpt fld spread from ',KOLATG(1))
+ CALL INTLOG(JP_DEBUG,'IGDINS: to ', KOLATG(KONS))
+C
+ IF ( ONPOLE ) THEN
+ CALL INTLOG(JP_DEBUG,'IGDINS: N. pole in inpt field.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IGDINS: N.pole NOT in inpt fld',JPQUIET)
+ ENDIF
+C
+ IF ( OSPOLE ) THEN
+ CALL INTLOG(JP_DEBUG,'IGDINS: S. pole in inpt field.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IGDINS: S.pole NOT in inpt fld',JPQUIET)
+ ENDIF
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Select points along a line of meridian
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGDINS: Section 2.',JPQUIET)
+C
+C Last latitude found to be used as start of search
+C for next latitude
+C
+ IBASE = 1
+C
+ DO 220 JOUT = 1, KONS
+C
+C Allow special code for points beyond North limit of
+C Gaussian grid which has all points up to pole
+C
+C Sinisa remove check for pole - already exist in iagcntl
+ IF (IBASE .EQ. 1 .AND. KOLATG(JOUT).GT.KILATG (1) ) THEN
+C
+ KNSIND (JP_I_N, JOUT) = 1
+ KNSIND (JP_I_S, JOUT) = 2
+ IBASE = 1
+C
+ KNSDIST (JP_I_N, JOUT) = JP90 - KOLATG (JOUT)
+ KNSDIST (JP_I_S, JOUT) = KOLATG (JOUT) - KILATG (2)
+C
+ GO TO 220
+C
+ ENDIF
+C
+ DO 210 JINP = IBASE, KINS - 1
+C
+C This test allows the exact match at both ends to be treated
+C correctly. Although the point is checked for equality at
+C both ends the first test will be used except for the South
+C Gaussian limit.
+C
+ IF (KOLATG (JOUT) .LE. KILATG (JINP) .AND.
+ X KOLATG (JOUT) .GE. KILATG (JINP + 1) ) THEN
+C
+ KNSIND (JP_I_N, JOUT) = JINP
+ KNSIND (JP_I_S, JOUT) = JINP + 1
+ IBASE = JINP
+C
+ KNSDIST (JP_I_N, JOUT) = KILATG (JINP) -
+ X KOLATG (JOUT)
+ KNSDIST (JP_I_S, JOUT) = KOLATG (JOUT) -
+ X KILATG (JINP + 1)
+C
+ GO TO 220
+C
+ ENDIF
+C
+ 210 CONTINUE
+C
+C Allow special code for points beyond South limit of
+C Gaussian grid which has all points up to pole
+C
+C Sinisa remove check for pole - already exist in iagcntl
+ IF (KOLATG (JOUT) .LT. KILATG (KINS) ) THEN
+C
+ KNSIND (JP_I_N, JOUT) = KINS - 1
+ KNSIND (JP_I_S, JOUT) = KINS
+ IBASE = KINS
+C
+ KNSDIST (JP_I_N, JOUT) = KILATG (KINS - 1) -
+ X KOLATG (JOUT)
+ KNSDIST (JP_I_S, JOUT) = KOLATG (JOUT) - JP90
+C
+ ELSE
+C
+ IGDINS = JPROUTINE + 1
+ IF (KERR .GE. 0) THEN
+ CALL INTLOGR(JP_ERROR,
+ X 'IGDINS: Output lat. value ',REAL(KOLATG(JOUT))/PPMULT)
+ CALL INTLOGR(JP_ERROR,
+ X 'IGDINS: outside input range = ',REAL(KILATG(1))/PPMULT)
+ CALL INTLOGR(JP_ERROR,
+ X 'IGDINS: to ',REAL(KILATG(KINS))/PPMULT)
+ ENDIF
+C
+ IF (KERR .EQ. 0) CALL INTLOGR(JP_FATAL,
+ X 'IGDINS: Interpolation failing.',IGDINS)
+C
+ GO TO 900
+C
+ ENDIF
+C
+ 220 CONTINUE
+C
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGDINS: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/igdiwe.F b/interpolation/igdiwe.F
new file mode 100755
index 0000000..a19c500
--- /dev/null
+++ b/interpolation/igdiwe.F
@@ -0,0 +1,384 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGDIWE (KILONG, KIWE, KOLONG, KOWE, OWEGLOBE,
+ 1 KWEIND, KWEDIST, KPR, KERR)
+C
+C---->
+C**** *IGDIWE*
+C
+C PURPOSE
+C _______
+C
+C Calculate the distances between points in an output longitude
+C array and its West and East neighbours in the input longitude
+C array.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGDIWE (KILONG, KIWE, KOLONG, KOWE, OWEGLOBE, KWEIND,
+C 1 KWEDIST, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KILONG - The array of input longitudes.
+C
+C KIWE - The number of points in the West-East direction in
+C the input field.
+C
+C KOLONG - The array of output longitudes.
+C
+C KOWE - The number of points in the West-East direction in
+C the output field.
+C
+C OWEGLOBE - This variable will be true if the input array of
+C longitudes spans the globe.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C KWEIND - This array will contain the array offsets of the
+C West and East points in the input array required
+C for interpolation.
+C
+C KWEDIST - This array holds the distances to longitude values
+C in the input field from the associated longitude
+C values in the output field.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C 24601 An output longitude was found that was outside the range
+C spanned by the input longitudes.
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C This routine will create the arrays of offsets and distance
+C as two arrays of length (2, Number of output longitudes).
+C This will be used for all latitude rows when both the input
+C and output grids are regular.
+C
+C This routine is used to provide the values for one line of
+C latitude for quasi regular Gaussian input fields.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 2 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Dummy arguments
+ LOGICAL OWEGLOBE
+ INTEGER KIWE, KOWE, KPR, KERR
+ INTEGER KILONG (KIWE + 1), KOLONG (KOWE)
+ INTEGER KWEIND (2, KOWE), KWEDIST (2, KOWE)
+C
+C Local variables
+ INTEGER IBASE, ILOW, IUP
+ INTEGER JINP, JOUT
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 24600)
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGDIWE: Section 1.',JPQUIET)
+C
+ IGDIWE = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IGDIWE: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGDIWE: No.input fld pts = ',KIWE)
+ CALL INTLOG(JP_DEBUG,'IGDIWE: No.output fld pts = ',KOWE)
+ CALL INTLOG(JP_DEBUG,'IGDIWE: Input fld spread from ',KILONG(1))
+ CALL INTLOG(JP_DEBUG,'IGDIWE: to ',KILONG(KIWE))
+ CALL INTLOG(JP_DEBUG,'IGDIWE: Output spread from ',KOLONG(1))
+ CALL INTLOG(JP_DEBUG,'IGDIWE: to ',KOLONG(KOWE))
+ IF( OWEGLOBE ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'IGDIWE: Input W-E fld is global',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'IGDIWE: Input W-E fld is NOT global',JPQUIET)
+ ENDIF
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Select points around a line of latitude.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGDIWE: Section 2.',JPQUIET)
+C
+ IF (OWEGLOBE) THEN
+C
+ DO 230 JINP = 1, KIWE
+C
+C NOTE that point number 1 is repeated as point KIWE + 1
+C to simplify the wrap around case
+C
+ ILOW = KILONG (JINP)
+ IUP = KILONG (JINP + 1)
+C
+ IF (IUP .GT. ILOW) THEN
+C
+C Normal case IUP > ILOW
+C
+ DO 210 JOUT = 1, KOWE
+C
+ IF (KOLONG(JOUT).GE.ILOW .AND. KOLONG(JOUT).LT.IUP) THEN
+C
+C Longitude point found
+C
+ KWEIND (JP_I_W, JOUT) = JINP
+C
+ IF (JINP .LT. KIWE) THEN
+ KWEIND (JP_I_E, JOUT) = JINP + 1
+ ELSE
+ KWEIND (JP_I_E, JOUT) = 1
+ ENDIF
+C
+ KWEDIST (JP_I_W, JOUT) = KOLONG (JOUT) - ILOW
+ KWEDIST (JP_I_E, JOUT) = IUP - KOLONG (JOUT)
+C
+ ENDIF
+C
+ 210 CONTINUE
+C
+ ELSE
+C
+C Wrap around case
+C
+ DO 220 JOUT = 1, KOWE
+C
+ IF (KOLONG (JOUT) .GE. ILOW) THEN
+C
+C Longitude point found between ILOW and 3600000
+C
+ KWEIND (JP_I_W, JOUT) = JINP
+C
+ IF (JINP .LT. KIWE) THEN
+ KWEIND (JP_I_E, JOUT) = JINP + 1
+ ELSE
+ KWEIND (JP_I_E, JOUT) = 1
+ ENDIF
+C
+ KWEDIST (JP_I_W, JOUT) = KOLONG (JOUT) - ILOW
+ KWEDIST (JP_I_E, JOUT) = IUP + JP360 - KOLONG (JOUT)
+C
+ ENDIF
+C
+Cjdc IF (KOLONG (JOUT) .LT. IUP) THEN
+ IF (KOLONG (JOUT) .LE. IUP) THEN
+C
+C Longitude point found between 0 and IUP
+C
+ KWEIND (JP_I_W, JOUT) = JINP
+C
+ IF (JINP .LT. KIWE) THEN
+ KWEIND (JP_I_E, JOUT) = JINP + 1
+ ELSE
+ KWEIND (JP_I_E, JOUT) = 1
+ ENDIF
+C
+ KWEDIST (JP_I_W, JOUT) = KOLONG (JOUT) + JP360 - ILOW
+ KWEDIST (JP_I_E, JOUT) = IUP - KOLONG (JOUT)
+C
+ ENDIF
+C
+ 220 CONTINUE
+C
+ ENDIF
+C
+ 230 CONTINUE
+C
+ ELSE
+C
+C Pointer to last point found if input grid is not global
+C
+ IBASE = 1
+C
+ DO 250 JOUT = 1, KOWE
+C
+ DO 240 JINP = IBASE, KIWE - 1
+C
+ ILOW = KILONG (JINP)
+ IUP = KILONG (JINP + 1)
+C
+C Normal case IUP > ILOW
+C
+Cjdc IF (KOLONG(JOUT).GE.ILOW .AND. KOLONG(JOUT).LT.IUP) THEN
+ IF (KOLONG(JOUT).GE.ILOW .AND. KOLONG(JOUT).LE.IUP) THEN
+C
+C Longitude point found
+C
+ KWEIND (JP_I_W, JOUT) = JINP
+ KWEIND (JP_I_E, JOUT) = JINP + 1
+ IBASE = JINP
+C
+ KWEDIST (JP_I_W, JOUT) = KOLONG (JOUT) - ILOW
+ KWEDIST (JP_I_E, JOUT) = IUP - KOLONG (JOUT)
+C
+ GO TO 250
+C
+C Wrap around case
+C
+ ELSE IF (IUP .LT. ILOW) THEN
+C
+ IF (KOLONG (JOUT) .GE. ILOW) THEN
+C
+C Longitude point found between ILOW and 3600000
+C
+ KWEIND (JP_I_W, JOUT) = JINP
+ KWEIND (JP_I_E, JOUT) = JINP + 1
+ IBASE = JINP
+C
+ KWEDIST (JP_I_W, JOUT) = KOLONG (JOUT) - ILOW
+ KWEDIST (JP_I_E, JOUT) = IUP + JP360 - KOLONG (JOUT)
+C
+ GO TO 250
+C
+ ENDIF
+C
+Cjdc IF (KOLONG (JOUT) .LT. IUP) THEN
+ IF (KOLONG (JOUT) .LE. IUP) THEN
+C
+C Longitude point found between 0 and IUP
+C
+ KWEIND (JP_I_W, JOUT) = JINP
+ KWEIND (JP_I_E, JOUT) = JINP + 1
+ IBASE = JINP
+C
+ KWEDIST (JP_I_W, JOUT) = KOLONG (JOUT) + JP360 - ILOW
+ KWEDIST (JP_I_E, JOUT) = IUP - KOLONG (JOUT)
+C
+ GO TO 250
+C
+ ENDIF
+C
+ ENDIF
+C
+ 240 CONTINUE
+C
+C This statement will be reached if the output grid does not
+C fit within the input grid.
+C
+ IGDIWE = JPROUTINE + 1
+ IF (KERR .GE. 0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IGDIWE: Output long. value number = ',JOUT)
+ CALL INTLOGR(JP_ERROR,
+ X 'IGDIWE: Output long. value ',REAL(KOLONG(JOUT))/PPMULT)
+ CALL INTLOGR(JP_ERROR,
+ X 'IGDIWE: outside input range = ',REAL(KILONG(1))/PPMULT)
+ CALL INTLOGR(JP_ERROR,
+ X 'IGDIWE: to ',REAL(KILONG(KIWE))/PPMULT)
+ ENDIF
+C
+ IF (KERR .EQ. 0) CALL INTLOGR(JP_FATAL,
+ X 'IGDIWE: Interpolation failing.',IGDIWE)
+C
+ GO TO 900
+C
+ 250 CONTINUE
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGDIWE: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/igglat.F b/interpolation/igglat.F
new file mode 100755
index 0000000..1671ba8
--- /dev/null
+++ b/interpolation/igglat.F
@@ -0,0 +1,282 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGGLAT(KLAT, PGAUSS, KPR, KERR)
+C
+C---->
+C**** *IGGLAT*
+C
+C PURPOSE
+C _______
+C
+C Compute Gaussian lines of latitude for a given truncation.
+C
+C
+C INTERFACE
+C _________
+C
+C IERR = IGGLAT(KLAT, PGAUSS, KPR, KERR)
+C
+C
+C Input parameters
+C ________________
+C
+C KLAT - The number of lines of latitude from pole to pole.
+C
+C KPR - Debug print switch:
+C 0, No debugging output.
+C 1, Produce debugging output.
+C
+C KERR - Error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C
+C Output parameters
+C ________________
+C
+C PGAUSS - The Gaussian lines of latitude for truncation KLAT/2
+C
+C
+C Return value
+C ____________
+C
+C 0 - OK
+C 24701 - The calculation of Gaussian lines of latitude failed.
+C
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C
+C EXTERNALS
+C _________
+C
+C INTLOG(R) - Logs messages.
+C IGBESS - This routine is used to generate initial
+C approximations to the Gaussian latitudes.
+C
+C
+C METHOD
+C ______
+C
+C IGBESS is used to provide zeros of the Bessel function J0,
+C which are used as starting approximations to the Gaussian
+C latitudes. Newton iteration is used to generate the latitudes
+C from these approximations.
+C
+C Calculated latitudes are stored internally and reused if a
+C later call asks for the same calculation.
+C
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C
+C COMMENTS
+C ________
+C
+C This routine is adapted from that in the old Marsint library.
+C The interface and the variable names have been modified.
+C
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C J.Chambers ECMWF Aug 1998
+C Add reuse of calculated latitudes.
+C
+C----<
+C -------------------------------------------------------
+C* Section 0. Definition of variables.
+C -------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "jparams.h"
+#include "parim.h"
+C
+C Function arguments
+C
+ INTEGER KLAT, KPR, KERR
+ REAL PGAUSS (*)
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 24700)
+C -------------------------------------------------------
+C The convergence criteria is machine dependent
+C -------------------------------------------------------
+C
+ REAL PACRCY
+#ifdef REAL_8
+ PARAMETER (PACRCY = 1.0E-14)
+#else
+ PARAMETER (PACRCY = 1.0E-7)
+#endif
+C
+C Local variables
+C
+ LOGICAL LDEBUG
+ INTEGER ITRUNC, IERR
+ INTEGER JLAT, JITER, JLN, LOOP, JOLDLAT
+ REAL ZRADDEG, ZCON, ZLAT, ZROOT
+ REAL ZKM1, ZKM2, ZLN, ZFUNC, ZDERIV, ZMOVE
+ REAL ROLDGS
+ DIMENSION ROLDGS(JPGTRUNC*2)
+C
+ SAVE JOLDLAT, ROLDGS
+C
+C Externals
+C
+ INTEGER IGBESS
+C
+C -------------------------------------------------------
+C* Section 1. Set constants and get initial approximation.
+C -------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IGGLAT = 0
+ LDEBUG = ( KPR.GE.1 )
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'IGGLAT: Section 1.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'IGGLAT: No.lines lat from pole to pole = ',KLAT)
+ ENDIF
+C
+C Using previously calculated values if truncation is the same.
+C
+ IF( KLAT.EQ.JOLDLAT ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'IGGLAT: Using previously calculated values',JPQUIET)
+ DO LOOP = 1, KLAT
+ PGAUSS(LOOP) = ROLDGS(LOOP)
+ ENDDO
+ GOTO 900
+ ENDIF
+C
+ JOLDLAT = KLAT
+C
+ ZRADDEG = 180.0/PPI
+C
+ ZCON = (PPONE - (PPTWO / PPI) ** 2) * PPQUART
+C
+ ZLAT = KLAT
+ ITRUNC = KLAT/2
+C
+ IERR = IGBESS(ITRUNC, PGAUSS, KPR, KERR)
+C
+ IF( IERR.GT.0 ) THEN
+ IGGLAT = IERR
+ GOTO 900
+ ENDIF
+C
+C -------------------------------------------------------
+C* Section 2. Compute abscissae
+C -------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,'IGGLAT: Section 2.',JPQUIET)
+C
+ DO 240 JLAT = 1, ITRUNC
+C
+C First approximation for ZROOT
+C
+ ZROOT = COS(PGAUSS(JLAT) / SQRT( (ZLAT+PPHALF)**2 + ZCON) )
+C
+C Perform loop of Newton iterations
+C
+ DO 220 JITER = 1, JPMAXITER
+C
+ ZKM2 = PPONE
+ ZKM1 = ZROOT
+C
+C Compute Legendre polynomial
+C
+ DO 210 JLN = 2, KLAT
+C
+ ZLN = JLN
+C
+ ZFUNC = ( (PPTWO * ZLN - PPONE) * ZROOT * ZKM1 -
+ 1 (ZLN - PPONE) * ZKM2) / ZLN
+C
+ ZKM2 = ZKM1
+ ZKM1 = ZFUNC
+C
+ 210 CONTINUE
+C
+C Perform Newton iteration
+C
+ ZDERIV = (ZLAT * (ZKM2 - ZROOT * ZFUNC) ) /
+ 1 (PPONE - ZROOT ** 2)
+C
+ ZMOVE = ZFUNC / ZDERIV
+ ZROOT = ZROOT - ZMOVE
+C
+C Leave iteration loop when sufficient accuracy achieved.
+C
+ IF( ABS(ZMOVE).LE.PACRCY ) GOTO 230
+C
+ 220 CONTINUE
+C
+C Routine fails if no convergence after JPMAXITER iterations.
+C
+ IGGLAT = JPROUTINE + 1
+C
+ IF( KERR.GE.0 ) CALL INTLOG(JP_ERROR,
+ X 'IGGLAT: Calculation of Gaussian lats failed.',JPQUIET)
+C
+ IF( KERR.EQ.0 ) CALL INTLOG(JP_FATAL,
+ X 'IGGLAT: interpolation failed.',IGGLAT)
+C
+ GOTO 900
+C
+ 230 CONTINUE
+C
+C* Set North and South values using symmetry.
+C
+ PGAUSS(JLAT) = ASIN(ZROOT) * ZRADDEG
+ PGAUSS(KLAT + 1 - JLAT) = - PGAUSS(JLAT)
+C
+ 240 CONTINUE
+C
+ IF( KLAT.NE.(ITRUNC*2) ) PGAUSS(ITRUNC + 1) = PPZERO
+C
+C Store calculated values for re-use
+C
+ DO LOOP = 1, KLAT
+ ROLDGS(LOOP) = PGAUSS(LOOP)
+ ENDDO
+C
+C -------------------------------------------------------
+C* Section 9. Return to calling routine.
+C -------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,'IGGLAT: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/iggmem.F b/interpolation/iggmem.F
new file mode 100755
index 0000000..ba442e0
--- /dev/null
+++ b/interpolation/iggmem.F
@@ -0,0 +1,331 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGGMEM (KPR, KERR)
+C
+C---->
+C**** *IGGMEM*
+C
+C PURPOSE
+C _______
+C
+C This routine acquires heap space.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGGMEM (KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C None
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C nifld.common - This file contains all the input field
+C definition variables.
+C
+C NINS - Number of grid points in NS direction for input
+C field (used in grspace.h).
+C NIWE - Number of grid points in WE direction for input
+C field (used in grspace.h).
+C
+C nofld.common - This file contains all the output field
+C definition variables.
+C
+C NONS - Number of grid points in NS direction for output
+C field (used in grspace.h).
+C NOWE - Number of grid points in WE direction for output
+C field (used in grspace.h).
+C
+C grspace.h - This file contains all the work space array
+C definitions for grid point to grid point
+C interpolation.
+C
+C GRID_POINT
+C
+C NILATGP - POINTER to array MILATG.
+C NILONGP - POINTER to array MILONG.
+C NILSMP - POINTER to array MILSM.
+C NINPNTP - POINTER to array RINPNT.
+C NISTRTP - POINTER to array MISTRT.
+C NNSDISTP - POINTER to array MNSDIST.
+C NNSINDP - POINTER to array MNSIND.
+C NMAXP - POINTER to array RMAX.
+C NOLATGP - POINTER to array MOLATG.
+C NOLONGP - POINTER to array MOLONG.
+C NOLSMP - POINTER to array MOLSM.
+C NWEDISTP - POINTER to array MWEDIST.
+C NWEINDP - POINTER to array MWEIND.
+C NWFACTP - POINTER to array WFACT.
+C
+C MILATG - Dynamic array of length (NINS) (see nifld.common)
+C which holds the values of the input field
+C latitudes.
+C MILONG - Dynamic array of length (NIWE + 1) (see
+C nifld.common) which holds the values of the
+C input field longitudes.
+C MILSM - Dynamic array of length (NIWE, 2) (see
+C nifld.common) used in calculating the effects of
+C the land sea mask on interpolation.
+C MISTRT - Dynamic array of length (NINS) (see nifld.common)
+C which holds the array offsets of the start of
+C each latitude line for a quasi regular Gaussian
+C input field. No space is assigned to this array
+C for a regular input field.
+C MNSDIST - Dynamic array of length (2, NONS) (see
+C nofld.common) which holds the distances to
+C neighbouring latitude lines of the input field
+C from the associated line of latitude in the
+C output field.
+C MNSIND - Dynamic array of length (2, NONS) (see
+C nofld.common) which holds the latitude line
+C numbers (array offset) of the input field
+C associated with each line of latitude in the
+C output field.
+C MOLATG - Dynamic array of length (NONS) (see nofld.common)
+C which holds the values of the output field
+C latitudes.
+C MOLONG - Dynamic array of length (NOWE) (see nofld.common)
+C which holds the values of the output field
+C longitudes.
+C MOLSM - Dynamic array of length (NOWE) (see nofld.common)
+C used in calculating the effects of the land sea
+C mask on interpolation.
+C MWEDIST - Dynamic array of length (2, NONS) for a regular
+C input field and of length (2, 2 * NONS * NOWE)
+C (see nofld.common) for a quasi regular Gaussian
+C input field. This array holds the distances to
+C neighbouring longitude points of the input field
+C from the associated longitude points in the
+C output field.
+C MWEIND - Dynamic array of length (2, NONS) for a regular
+C input field and of length (2, 2 * NONS * NOWE)
+C (see nofld.common) for a quasi regular Gaussian
+C input field. This array holds the longitude
+C points (array offset) from the input field
+C associated with each longitude point in the
+C output field.
+C RINPNT - Dynamic array of length (NOWE) (see nofld.common)
+C used to aid vectorisation in processing
+C precipitation fields.
+C RMAX - Dynamic array of length (NOWE) (see nofld.common)
+C used to aid vectorisation in processing
+C precipitation fields.
+C WFACT - Dynamic array of length (4, NOWE * NONS) (see
+C nofld.common) which holds the interpolation
+C weights for each point in the output field.
+C
+C EXTERNALS
+C _________
+C
+C IGALLOC - Get a heap allocation for array space.
+C INTLOG - Logs messages.
+C
+C METHOD
+C ______
+C
+C This routine calculates how much heap space is required. It
+C then calls IGALLOC to acquire the required space. Finally the
+C POINTERs to the arrays in grspace.h are initialised to allow
+C the use of the dynamic arrays.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 3 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Jan 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grspace.h"
+C
+C Dummy arguments
+C
+ INTEGER KPR, KERR
+C
+C Local variables
+C
+#ifdef POINTER_64
+ INTEGER*8 IBASE
+#else
+ INTEGER IBASE
+#endif
+ INTEGER IREQUEST, IERR
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 22100)
+C
+C External functions
+C
+ INTEGER IGALLOC
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialisation
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGGMEM: Section 1.',JPQUIET)
+C
+ IGGMEM = 0
+C
+C -----------------------------------------------------------------|
+C* Section 2. Calculate memory required and get heap
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGGMEM: Section 2.',JPQUIET)
+C
+C REAL arrays (This may change for double precision version)
+C
+ IREQUEST = 4 * NOWE * NONS * JPRLEN
+C
+C REAL arrays for precipitation calculations
+C
+ IREQUEST = IREQUEST + 2 * NOWE * JPRLEN
+C
+C Fixed integer fields
+C
+ IREQUEST = IREQUEST + (NIWE + 1 + NINS + NOWE + 5 * NONS) *
+ 1 JPILEN
+C
+C Regular input fields (These change for reduced Gaussian fields)
+C
+ IREQUEST = IREQUEST + 4 * NOWE * JPILEN
+C
+C Fields for LSM calculations
+C
+ IREQUEST = IREQUEST + (2 * NIWE + NOWE) * JPILEN
+C
+C Get the required memory
+C
+ IERR = IGALLOC (JPINNER, IREQUEST, IBASE, KPR, KERR)
+C
+ IF( IERR .GT. 0) THEN
+ IGGMEM = IERR
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Initialise base addresses for POINTER arrays
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGGMEM: Section 3.',JPQUIET)
+C
+C REAL arrays first to ease conversion to DOUBLE PRECISION
+C
+ NWFACTP = IBASE
+C
+C Precipitation REAL arrays
+C
+ NMAXP = NWFACTP + 4 * NOWE * NONS * JPRLEN
+ NINPNTP = NMAXP + NOWE * JPRLEN
+C
+C This offset may change if DOUBLE PRECISION
+C
+ NILONGP = NINPNTP + NOWE * JPRLEN
+C
+ NILATGP = NILONGP + (NIWE + 1) * JPILEN
+ NOLONGP = NILATGP + NINS * JPILEN
+ NOLATGP = NOLONGP + NOWE * JPILEN
+ NNSINDP = NOLATGP + NONS * JPILEN
+ NNSDISTP = NNSINDP + 2 * NONS * JPILEN
+C
+C These fields change for quasi regular Gaussian input
+C
+ NWEINDP = NNSDISTP + 2 * NONS * JPILEN
+ NWEDISTP = NWEINDP + 2 * NOWE * JPILEN
+ NISTRTP = NWEDISTP + 2 * NOWE * JPILEN
+C
+C MISTRT is not use for regular input grids
+C LSM arrays
+C
+ NILSMP = NISTRTP
+C
+ NOLSMP = NILSMP + 2 * NIWE * JPILEN
+C
+ IF( KPR.GE.1 ) THEN
+ CALL INTLOG(JP_DEBUG,'IGGMEM: Output base addresses.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGGMEM: WFACT address = ',NWFACTP)
+ CALL INTLOG(JP_DEBUG,'IGGMEM: RMAX address = ',NMAXP )
+ CALL INTLOG(JP_DEBUG,'IGGMEM: RINPNT address = ',NINPNTP)
+ CALL INTLOG(JP_DEBUG,'IGGMEM: Input long. address = ',NILONGP)
+ CALL INTLOG(JP_DEBUG,'IGGMEM: Input lat. address = ',NILATGP)
+ CALL INTLOG(JP_DEBUG,'IGGMEM: Output long. address = ',NOLONGP)
+ CALL INTLOG(JP_DEBUG,'IGGMEM: Output lat. address = ',NOLATGP)
+ CALL INTLOG(JP_DEBUG,'IGGMEM: NS offset = ',NNSINDP)
+ CALL INTLOG(JP_DEBUG,'IGGMEM: NS address = ',NNSDISTP)
+ CALL INTLOG(JP_DEBUG,'IGGMEM: WE offset = ',NWEINDP)
+ CALL INTLOG(JP_DEBUG,'IGGMEM: WE address = ',NWEDISTP)
+ CALL INTLOG(JP_DEBUG,
+ X 'IGGMEM: Line start array address = ',NISTRTP)
+ CALL INTLOG(JP_DEBUG,'IGGMEM: Input LSM address = ',NILSMP)
+ CALL INTLOG(JP_DEBUG,'IGGMEM: Output LSM address = ',NOLSMP)
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return to calling routine. Format statements
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGGMEM: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/iggrid.F b/interpolation/iggrid.F
new file mode 100755
index 0000000..a784cd5
--- /dev/null
+++ b/interpolation/iggrid.F
@@ -0,0 +1,271 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGGRID (KGTRUNC, KAREA, KLN, PGAUSS, KLONG,
+ 1 KNWE, KLATG, KNNS, OWEGLOBE, KPR, KERR)
+C
+C---->
+C**** *IGGRID*
+C
+C PURPOSE
+C _______
+C
+C Generate the arrays of latitude and longitude points for a
+C Gaussian truncation and area.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGGRID (KGTRUNC, KAREA, KLN, PGAUSS, KLONG, KNWE, KLATG,
+C 1 KNNS, OWEGLOBE, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KGTRUNC - The Gaussian truncation.
+C
+C KAREA - The area definition (N, W, S, E) provided by the
+C calling routine.
+C
+C KLN - The Northern Gaussian latitude number for this area.
+C
+C PGAUSS - The full list of Gaussian latitudes for this
+C truncation.
+C
+C KNWE - The number of points in the West-East direction in
+C this field.
+C
+C KNNS - The number of points in the North-South direction
+C in this field.
+C
+C OWEGLOBE - This variable will be true if the array of
+C longitudes spans the globe and it is an input grid.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C KLONG - The array of longitudes for this Gaussian
+C truncation and area. If OWEGLOBE is true the
+C West-East field array has element KNWE + 1 set
+C equal to element 1 to help with recognising where
+C an output grid "wraps around" the break in the
+C input grid.
+C
+C KLATG - The array of latitudes for this Gaussian
+C truncation and area.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C The arrays KLONG and KLATG are generated using the information
+C provided by the other parameters. Note that Gaussian latitudes
+C will be stored as NINT (PGAUSS * 1.0E4).
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 3 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Dummy arguments
+ LOGICAL OWEGLOBE
+ INTEGER KGTRUNC, KNWE, KNNS, KLN, KPR, KERR
+ INTEGER KAREA (4)
+ INTEGER KLONG (KNWE + 1), KLATG (KNNS)
+ REAL PGAUSS (*)
+C
+C Local variables
+C
+ INTEGER ILNSTR, IEAST, IWEST
+ INTEGER JLONG, JLAT
+ REAL*8 RWEST, RKKK, RLNSTR
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 24800)
+C
+C Function externals
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGGRID: Section 1.',JPQUIET)
+C
+ IGGRID = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IGGRID: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGGRID: Northern Gaussian line is ',KLN)
+ CALL INTLOG(JP_DEBUG,'IGGRID: No.long.pts = ',KNWE)
+ CALL INTLOG(JP_DEBUG,'IGGRID: No.lat. pts = ',KNNS)
+ CALL INTLOG(JP_DEBUG,'IGGRID: Area North = ', KAREA(1))
+ CALL INTLOG(JP_DEBUG,'IGGRID: Area West = ', KAREA(2))
+ CALL INTLOG(JP_DEBUG,'IGGRID: Area South = ', KAREA(3))
+ CALL INTLOG(JP_DEBUG,'IGGRID: Area East = ', KAREA(4))
+ IF( OWEGLOBE ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'IGGRID: Input W-E fld is global.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'IGGRID: Input W-E fld is NOT global.',JPQUIET)
+ ENDIF
+ ENDIF
+C
+ IF(KNWE.GT.0.AND.OWEGLOBE) THEN
+ RLNSTR = (REAL(JP360)*10000.0) / REAL(KNWE)
+ ELSE
+ RLNSTR = (REAL(JP90)*10000.0) / REAL(KGTRUNC)
+ ENDIF
+
+ IEAST = KAREA(JPEAST)
+ IWEST = KAREA(JPWEST)
+C
+C _______________________________________________________
+C
+C* Section 2. Generate points around a line of latitude.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGGRID: Section 2.',JPQUIET)
+C
+C Standardise range so that EAST > WEST
+C
+ IF (IEAST .LT. IWEST ) THEN
+C
+ IF (IEAST .LT. 0) THEN
+ IEAST = IEAST + JP360
+ ELSE
+ IWEST = IWEST - JP360
+ ENDIF
+C
+ ENDIF
+C
+ RWEST = REAL(IWEST)*10000.0
+C
+C Generate points in standardised range (0, jp360)
+C
+ DO 210 JLONG = 1, KNWE
+C
+ RKKK = RWEST + RLNSTR * (JLONG - 1)
+ KLONG (JLONG) = NINT(RKKK/10000.0)
+C
+ IF (KLONG (JLONG) .LT. 0) KLONG(JLONG) = KLONG(JLONG) + JP360
+C
+ 210 CONTINUE
+C
+C Add first point to end of list if global
+C
+ IF (OWEGLOBE) KLONG(KNWE + 1) = KLONG (1)
+C
+C _______________________________________________________
+C
+C* Section 3. Generate points along a line of meridian
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGGRID: Section 3.',JPQUIET)
+C
+ DO 320 JLAT = 1, KNNS
+C
+ KLATG (JLAT) = NINT (PGAUSS (JLAT + KLN - 1) * PPMULT)
+C
+ 320 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGGRID: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/igint.F b/interpolation/igint.F
new file mode 100755
index 0000000..27b0ff8
--- /dev/null
+++ b/interpolation/igint.F
@@ -0,0 +1,217 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGINT (KWEDIST, KOWE, KNSDIST, KONS, PWFACT,
+ 1 KPR, KERR)
+C
+C---->
+C**** *IGINT*
+C
+C PURPOSE
+C _______
+C
+C Calculate the basic unnormalised interpolation weights when
+C interpolating between regular grids.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGINT (KWEDIST, KOWE, KNSDIST, KONS, PWFACT, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KWEDIST - This array holds the distances to longitude values
+C in the input field from the associated longitude
+C values in the output field. This distance is the
+C same for every line of latitude for a regular
+C input field.
+C
+C KOWE - The number of points in the West-East direction in
+C the output field.
+C
+C KNSDIST - This array holds the distances to lines in input
+C field from the associated lines of latitude in the
+C output field. The array is dimensioned (2, KONS).
+C
+C KONS - The number of points in the North-South direction
+C in the output field.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C PWFACT - The unnormalised array of interpolating weights to
+C the four neighbouring points for every output point.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C IGINTR - Calculate the basic unnormalised interpolation
+C weights for one line of latitude when
+C interpolating between regular grids.
+C INTLOG - Logs messages.
+C
+C METHOD
+C ______
+C
+C The weights are evaluated as the size of the opposing rectangle.
+C It is trivial to show that this is equivalent to weighting by
+C the inverse size of the rectangle of which the input point forms
+C part.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 2 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Dummy arguments
+ INTEGER KOWE, KONS, KPR, KERR
+ INTEGER KWEDIST (2, KOWE), KNSDIST (2, KONS)
+ REAL PWFACT (4, KOWE, KONS)
+C
+C Local variables
+ INTEGER IPR, IERR
+ INTEGER JOLAT
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 22200)
+C
+C External functions
+ INTEGER IGINTR
+C
+C _______________________________________________________
+C
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGINT: Section 1.',JPQUIET)
+C
+ IGINT = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IGINT: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGINT: No.output longitudes = ',KOWE)
+ CALL INTLOG(JP_DEBUG,'IGINT: No.output latitudes = ',KONS)
+ ENDIF
+C
+C _______________________________________________________
+C
+C
+C* Section 2. Calculate arrays of weights
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGINT: Section 2.',JPQUIET)
+C
+C Main loop over latitudes
+C
+ IPR = KPR
+C
+ DO 220 JOLAT = 1, KONS
+C
+ IERR = IGINTR (KWEDIST, KOWE, KNSDIST (1, JOLAT),
+ 1 PWFACT (1, 1, JOLAT), IPR, KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IGINT = IERR
+ GO TO 900
+ ENDIF
+C
+ IPR = KPR - 1
+C
+ 220 CONTINUE
+C
+C _______________________________________________________
+C
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGINT: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/igintr.F b/interpolation/igintr.F
new file mode 100755
index 0000000..d262337
--- /dev/null
+++ b/interpolation/igintr.F
@@ -0,0 +1,199 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGINTR (KWEDIST, KOWE, KNSDIST, PWFACT, KPR,
+ 1 KERR)
+C
+C---->
+C**** *IGINTR*
+C
+C PURPOSE
+C _______
+C
+C Calculate the basic unnormalised interpolation weights for one
+C line of latitude when interpolating between regular grids.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGINTR (KWEDIST, KOWE, KNSDIST, PWFACT, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KWEDIST - This array holds the distances to longitude values
+C in the input field from the associated longitude
+C values in the output field.
+C
+C KOWE - The number of points in the West-East direction in
+C the output field.
+C
+C KNSDIST - This array gives the distances to the latitude of
+C the lines North and South in the input field from
+C the line of latitude of the output field.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C PWFACT - The unnormalised array of interpolating weights to
+C the four neighbouring points for every point of the
+C output line of latitude.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C INTLOG - Logs messages.
+C
+C METHOD
+C ______
+C
+C The weights are evaluated as the size of the opposing rectangle.
+C It is trivial to show that this is equivalent to weighting by
+C the inverse size of the rectangle of which the input point forms
+C part.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 2 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Dummy arguments
+ INTEGER KOWE, KPR, KERR
+ INTEGER KWEDIST (2, KOWE), KNSDIST (2)
+ REAL PWFACT (4, KOWE)
+C
+C Local variables
+ INTEGER JOLON
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 22300)
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGINTR: Section 1.',JPQUIET)
+C
+ IGINTR = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IGINTR: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGINTR: No.output longitudes = ',KOWE)
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Calculate arrays of weights
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGINTR: Section 2.',JPQUIET)
+C
+ DO 210 JOLON = 1, KOWE
+C
+C The unnormalised weights are the size of the opposing rectangle.
+C
+ PWFACT (JP_I_NW, JOLON) =
+ 1 REAL (KWEDIST (JP_I_E, JOLON) ) * REAL (KNSDIST (JP_I_S) )
+ PWFACT (JP_I_NE, JOLON) =
+ 1 REAL (KWEDIST (JP_I_W, JOLON) ) * REAL (KNSDIST (JP_I_S) )
+ PWFACT (JP_I_SW, JOLON) =
+ 1 REAL (KWEDIST (JP_I_E, JOLON) ) * REAL (KNSDIST (JP_I_N) )
+ PWFACT (JP_I_SE, JOLON) =
+ 1 REAL (KWEDIST (JP_I_W, JOLON) ) * REAL (KNSDIST (JP_I_N) )
+C
+ 210 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGINTR: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/iglgrid.F b/interpolation/iglgrid.F
new file mode 100755
index 0000000..099ea45
--- /dev/null
+++ b/interpolation/iglgrid.F
@@ -0,0 +1,258 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGLGRID (KSTRIDE, KAREA, KLONG, KNWE, KLATG,
+ 1 KNNS, OWEGLOBE, KPR, KERR)
+C
+C---->
+C**** *IGLGRID*
+C
+C PURPOSE
+C _______
+C
+C Generate the arrays of latitude and longitude points for a
+C regular latitude longitude grid.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGLGRID (KSTRIDE, KAREA, KLONG, KNWE, KLATG, KNNS,
+C 1 OWEGLOBE, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KSTRIDE - The grid definition (WE, NS) provided by the
+C calling routine.
+C
+C KAREA - The area definition (N, W, S, E) provided by the
+C calling routine.
+C
+C KNWE - The number of points in the West-East direction in
+C this field.
+C
+C KNNS - The number of points in the North-South direction
+C in this field.
+C
+C OWEGLOBE - This variable will be true if the array of
+C longitudes spans the globe and this is an input
+C field.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C KLONG - The array of longitudes for the stride and area.
+C If OEWGLOBE is true the West-East field array has
+C element KNWE + 1 set equal to element 1 to help
+C with recognising where an output grid
+C "wraps around" the break in the input grid.
+C
+C KLATG - The array of latitudes for the stride and area.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C The arrays of longitudes and latitudes are generated using the
+C information provided by the other parameters.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 3 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Dummy arguments
+ LOGICAL OWEGLOBE
+ INTEGER KNWE, KNNS, KPR, KERR
+ INTEGER KSTRIDE (2), KAREA (4)
+ INTEGER KLONG (KNWE + 1), KLATG (KNNS)
+C
+C Local variables
+ INTEGER IEAST, IWEST
+ INTEGER JLONG, JLAT
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 24900)
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGLGRID: Section 1.',JPQUIET)
+C
+ IGLGRID = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IGLGRID: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGLGRID: No.long.pts = ',KNWE)
+ CALL INTLOG(JP_DEBUG,'IGLGRID: No.lat. pts = ',KNNS)
+ CALL INTLOG(JP_DEBUG,'IGLGRID: Grid stride WE = ',KSTRIDE(1))
+ CALL INTLOG(JP_DEBUG,'IGLGRID: Grid stride NS = ',KSTRIDE(2))
+ CALL INTLOG(JP_DEBUG,'IGLGRID: Area North = ', KAREA(1))
+ CALL INTLOG(JP_DEBUG,'IGLGRID: Area West = ', KAREA(2))
+ CALL INTLOG(JP_DEBUG,'IGLGRID: Area South = ', KAREA(3))
+ CALL INTLOG(JP_DEBUG,'IGLGRID: Area East = ', KAREA(4))
+ IF( OWEGLOBE ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'IGLGRID: Input W-E fld is global.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'IGLGRID: Input W-E fld is NOT global.',JPQUIET)
+ ENDIF
+ ENDIF
+C
+ IEAST = KAREA (JPEAST)
+ IWEST = KAREA (JPWEST)
+C
+C _______________________________________________________
+C
+C
+C* Section 2. Generate points around a line of latitude.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGLGRID: Section 2.',JPQUIET)
+C
+C Standardise range so that EAST > WEST
+C
+ IF (IEAST .LT. IWEST ) THEN
+C
+ IF (IEAST .LT. 0) THEN
+ IEAST = IEAST + JP360
+ ELSE
+ IWEST = IWEST - JP360
+ ENDIF
+C
+ ENDIF
+C
+C Generate points in standardised range (0, jp360)
+C
+ DO 210 JLONG = 1, KNWE
+C
+ KLONG (JLONG) = IWEST + KSTRIDE (JPWESTEP) * (JLONG - 1)
+C
+ IF (KLONG (JLONG) .LT. 0)
+ 1 KLONG (JLONG) = KLONG (JLONG) + JP360
+C
+ 210 CONTINUE
+C
+C Add first point to end of list if global
+C
+ IF (OWEGLOBE)
+ 1 KLONG (KNWE + 1) = KLONG (1)
+C
+C _______________________________________________________
+C
+C
+C* Section 3. Generate points along a line of meridian
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGLGRID: Section 3.',JPQUIET)
+C
+ DO 310 JLAT = 1, KNNS
+C
+ KLATG (JLAT) = KAREA (JPNORTH) -
+ 1 KSTRIDE (JPNSSTEP) * (JLAT - 1)
+C
+ 310 CONTINUE
+C
+C _______________________________________________________
+C
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGLGRID: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/iglrev.F b/interpolation/iglrev.F
new file mode 100755
index 0000000..d3e4434
--- /dev/null
+++ b/interpolation/iglrev.F
@@ -0,0 +1,242 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGLREV (PMAT, KCOL, KROW, KDIR, KPR, KERR)
+C
+C---->
+C**** *IGLREV*
+C
+C PURPOSE
+C _______
+C
+C This routine reverses either the rows or the columns of a
+C rectangular matrix.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGLREV (PMAT, KCOL, KROW, KDIR, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C PMAT - The input matrix of dimension (KCOL, KROW).
+C
+C KCOL - The length of the first dimension of PMAT.
+C
+C KROW - The length of the second dimension of PMAT.
+C
+C KDIR - 1 Reverses the order in each column.
+C West-East reversal for meteorological fields.
+C 2 Reverses the order in each row.
+C North-South reversal for meteorological fields.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C PMAT - The transformed matrix.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C INTLOG - Logs messages.
+C
+C METHOD
+C ______
+C
+C KDIR = 1 is implemented by swapping elements within each column
+C of the matrix.
+C
+C KDIR = 2 is implemented by reversing the order of the columns.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 3 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Jan 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Dummy arguments
+C
+ INTEGER KCOL, KROW, KDIR, KPR, KERR
+C
+ REAL PMAT (KCOL, KROW)
+C
+C Local variables
+C
+ INTEGER IHALF
+C
+ INTEGER JSTEP, JMOVE
+C
+ REAL ZTEMP
+C
+ INTEGER JPROUTINE
+C
+ PARAMETER (JPROUTINE = 7300)
+C
+C External functions
+C
+C
+C _______________________________________________________
+C
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IGLREV: Section 1.',JPQUIET)
+C
+ IGLREV = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IRSCAN: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IRSCAN: First matrix dimension is ',KCOL)
+ CALL INTLOG(JP_DEBUG,'IRSCAN: Second matrix dimension is ',KROW)
+ CALL INTLOG(JP_DEBUG,'IRSCAN: Direction value is ',KDIR)
+ CALL INTLOG(JP_DEBUG,'IRSCAN: Input parameters.',JPQUIET)
+ ENDIF
+C
+C _______________________________________________________
+C
+C
+C* Section 2. Matrix COLUMN reversal (Field row interchange - WE)
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IGLREV: Section 2.',JPQUIET)
+C
+ IF (KDIR .EQ. 1) THEN
+C
+ IHALF = KCOL / 2
+C
+ DO 220 JMOVE = 1, IHALF
+C
+ DO 210 JSTEP = 1, KROW
+C
+ ZTEMP = PMAT (KCOL + 1 - JMOVE, JSTEP)
+ PMAT (KCOL + 1 - JMOVE, JSTEP) = PMAT (JMOVE, JSTEP)
+ PMAT (JMOVE, JSTEP) = ZTEMP
+C
+ 210 CONTINUE
+C
+ 220 CONTINUE
+C
+ ELSE
+C
+C _______________________________________________________
+C
+C
+C* Section 3. Matrix ROW reversal (Field column interchange - NS)
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IGLREV: Section 3.',JPQUIET)
+C
+ IHALF = KROW / 2
+C
+ DO 320 JMOVE = 1, IHALF
+C
+ DO 310 JSTEP = 1, KCOL
+C
+ ZTEMP = PMAT (JSTEP, KROW + 1 - JMOVE)
+ PMAT (JSTEP, KROW + 1 - JMOVE) = PMAT (JSTEP, JMOVE)
+ PMAT (JSTEP, JMOVE) = ZTEMP
+C
+ 310 CONTINUE
+C
+ 320 CONTINUE
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IGLREV: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/iglsize.F b/interpolation/iglsize.F
new file mode 100755
index 0000000..c863ec4
--- /dev/null
+++ b/interpolation/iglsize.F
@@ -0,0 +1,410 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGLSIZE(KSTRIDE, KAREA, KNWE, KNNS, KLN,
+ 1 OWEGLOBE, ONPOLE, OSPOLE, KPR, KERR)
+C
+C---->
+C**** *IGLSIZE*
+C
+C PURPOSE
+C _______
+C
+C Evaluate the array sizes for a regular latitude/longitude grid
+C and area.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGLSIZE(KSTRIDE, KAREA, KNWE, KNNS, KLN, OWEGLOBE,
+C 1 ONPOLE, OSPOLE, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KSTRIDE - The field grid definition (WE, NS).
+C
+C KAREA - The field area definition (N, W, S, E) provided by
+C the calling routine.
+C
+C KNWE - The number of points in the West-East direction in
+C the field. This will be zero for an output field.
+C
+C KNNS - The number of points in the North-South direction
+C in the field. This will be zero for an output field.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C KNWE - The number of points in the West-East direction in
+C the field.
+C
+C KNNS - The number of points in the North-South direction
+C in the field.
+C
+C KLN - The line number of the Northern latitude. This
+C value is used during land sea mask processing to
+C evaluate offsets in the "standard" files.
+C
+C OWEGLOBE - This variable will be true if the array of
+C longitudes spans the globe.
+C
+C ONPOLE - This variable will be true if the North polar line
+C of latitude is included in the grid.
+C
+C OSPOLE - This variable will be true if the South polar line
+C of latitude is included in the grid.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C -1 The West-East range does not match the stride and number
+C of points.
+C -2 The North-South range does not match the stride and
+C number of points.
+C
+C The two problems above could be caused by known deficiencies
+C in the GRIB representation of ranges and strides. They will be
+C treated as WARNING values.
+C
+C 25101 A global field is requested with an inappropriate
+C West-East stride.
+C 25102 A global field is requested with an inappropriate
+C North-South stride.
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C If all elements of array KAREA are zero then limits for the
+C appropriate global grid are generated.
+C
+C Otherwise it is assumed that all the limits in KAREA have been
+C validated and the sizes of the arrays required are calculated.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 4 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers ECMWF March 1999
+C Use tolerance when testing E-W and N-S global span.
+C
+C----<
+C _______________________________________________________
+C
+C Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Function arguments
+C
+ LOGICAL OWEGLOBE, ONPOLE, OSPOLE
+ INTEGER KNWE, KNNS, KLN, KPR, KERR
+ INTEGER KSTRIDE(2), KAREA(4)
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPEPSI
+ PARAMETER (JPROUTINE = 25100)
+ PARAMETER (JPEPSI = 50)
+C `---> represents 0.5 millidegree to allow for
+C grid step being off by upto 0.5 millidgrees
+C
+C
+C Local variables
+C
+ INTEGER IEAST, IWEST, IREACH, INORTH, ISOUTH
+C
+C _______________________________________________________
+C
+C Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGLSIZE: Section 1.',JPQUIET)
+C
+ IGLSIZE = 0
+C
+ IF( KPR.GE.1 ) THEN
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: Input parameters.',JPQUIET)
+ IF( KNWE.NE.0 ) CALL INTLOG(JP_DEBUG,
+ X 'IGLSIZE: No.long pts = ',KNWE)
+ IF( KNNS.NE.0 ) CALL INTLOG(JP_DEBUG,
+ X 'IGLSIZE: No.lat. pts = ',KNNS)
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: Grid WE stride = ',KSTRIDE(1))
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: Grid NS stride = ',KSTRIDE(2))
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: Area North = ', KAREA(1))
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: Area West = ', KAREA(2))
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: Area South = ', KAREA(3))
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: Area East = ', KAREA(4))
+ ENDIF
+C
+C _______________________________________________________
+C
+C Section 2. Generate global limits if no limits set
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGLSIZE: Section 2.',JPQUIET)
+C
+ IF( (KAREA(JPEAST).EQ.0 ) .AND.
+ X (KAREA(JPWEST).EQ.0 ) .AND.
+ X (KAREA(JPNORTH).EQ.0 ) .AND.
+ X (KAREA(JPSOUTH).EQ.0 ) ) THEN
+C
+ IF( MOD(JP360,KSTRIDE(JPWESTEP)).NE.0 ) THEN
+ IGLSIZE = JPROUTINE + 1
+ IF( KERR.GE.0 ) THEN
+ CALL INTLOGR(JP_ERROR,
+ X 'IGLSIZE: West-East stride for global grid = ',
+ X REAL(KSTRIDE(JPWESTEP))/PPMULT)
+ CALL INTLOGR(JP_ERROR,
+ X 'IGLSIZE: This is not a factor of ',
+ X REAL(JP360)/PPMULT)
+ ENDIF
+C
+ IF( KERR.EQ.0 ) CALL INTLOG(JP_FATAL,
+ X 'IGLSIZE: Interpolation failed.',IGLSIZE)
+C
+ GO TO 900
+ ENDIF
+C
+ IF( MOD(JP180,KSTRIDE(JPNSSTEP)).NE.0 ) THEN
+ IGLSIZE = JPROUTINE + 2
+ IF( KERR.GE.0 ) THEN
+ CALL INTLOGR(JP_ERROR,
+ X 'IGLSIZE: North-South stride for global grid = ',
+ X REAL(KSTRIDE(JPNSSTEP))/PPMULT)
+ CALL INTLOGR(JP_ERROR,
+ X 'IGLSIZE: This is not a factor of ',
+ X REAL(JP180)/PPMULT)
+ ENDIF
+C
+ IF( KERR.EQ.0 ) CALL INTLOG(JP_FATAL,
+ X 'IGLSIZE: Interpolation failed.',IGLSIZE)
+C
+ GO TO 900
+ ENDIF
+C
+ KAREA(JPNORTH) = JP90
+ KAREA(JPWEST) = 0
+ KAREA(JPSOUTH) = - JP90
+ KAREA(JPEAST) = JP360 - KSTRIDE(JPWESTEP)
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C Section 3. Standardise West-East limits and check for
+C West-East global fields
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGLSIZE: Section 3.',JPQUIET)
+C
+C Force both KAREA(JPWEST) and KAREA(JPEAST) into standard
+C range (0 to JP360)
+C
+ IF( KAREA(JPWEST).LT.0 ) KAREA(JPWEST) = KAREA(JPWEST) + JP360
+C
+ IF( KAREA(JPEAST).LT.0 ) KAREA(JPEAST) = KAREA(JPEAST) + JP360
+C
+C Standardise range so that EAST > WEST
+C
+ IEAST = KAREA(JPEAST)
+ IWEST = KAREA(JPWEST)
+C
+ IF( IEAST.LT.IWEST ) THEN
+C
+ IF( IEAST.LT.0 ) THEN
+ IEAST = IEAST + JP360
+ KAREA(JPEAST) = IEAST
+ ELSE
+ IWEST = IWEST - JP360
+ KAREA(JPWEST) = IWEST
+ ENDIF
+C
+ ENDIF
+C
+ IF( KNWE.EQ.0 ) THEN
+C
+C Is it a global grid ?
+C
+ IREACH = IEAST - IWEST + KSTRIDE(JPWESTEP)
+C
+ OWEGLOBE = IREACH.GE.JP360
+C
+C Number of points along line is
+C
+ KNWE = NINT( FLOAT(IREACH) / FLOAT(KSTRIDE(JPWESTEP)) )
+C
+ ELSE
+C
+C Number of points is set (input field)
+C
+ IF( ABS(IWEST+(KNWE-1)*KSTRIDE(JPWESTEP)-IEAST).GT.
+ X ((KNWE-1)*JPEPSI) ) THEN
+C
+C WARNING of possible mismatch
+C
+ IGLSIZE = - 1
+ CALL INTLOGR(JP_WARN,
+ X 'IGLSIZE: West-East range = ',REAL(KAREA(JPWEST))/PPMULT)
+ CALL INTLOGR(JP_WARN,
+ X 'IGLSIZE: to = ',REAL(KAREA(JPEAST))/PPMULT)
+ CALL INTLOG(JP_WARN,
+ X 'IGLSIZE: Does not match no. of pts = ',KNWE)
+ CALL INTLOGR(JP_WARN,
+ X 'IGLSIZE: and stride = ',REAL(KSTRIDE(JPWESTEP))/PPMULT)
+C
+ ENDIF
+C
+ OWEGLOBE = ABS((KNWE * KSTRIDE(JPWESTEP))-JP360).LT.
+ X (KNWE*JPEPSI)
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C Section 4. Generate points along a line of meridian
+C _______________________________________________________
+C
+ 400 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGLSIZE: Section 4.',JPQUIET)
+C
+ INORTH = KAREA(JPNORTH)
+ ISOUTH = KAREA(JPSOUTH)
+ IF( INORTH.LT.ISOUTH ) THEN
+ INORTH = KAREA(JPSOUTH)
+ ISOUTH = KAREA(JPNORTH)
+ ENDIF
+C
+ IF( KNNS.EQ.0 ) THEN
+C
+C Number of lines not set (output field)
+C
+ IREACH = INORTH - ISOUTH + KSTRIDE(JPNSSTEP)
+C
+ KNNS = NINT( FLOAT(IREACH) / FLOAT(KSTRIDE(JPNSSTEP)) )
+C
+ ELSE
+C
+C Number of lines is set (input field)
+C
+ IF(
+ X ABS(INORTH-(KNNS-1)*KSTRIDE(JPNSSTEP)-ISOUTH)
+ X .GT.((KNNS-1)*JPEPSI) ) THEN
+C
+C WARNING of possible mismatch
+C
+ IGLSIZE = - 2
+ CALL INTLOGR(JP_WARN,
+ X 'IGLSIZE: North-South range = ',REAL(INORTH)/PPMULT)
+ CALL INTLOGR(JP_WARN,
+ X 'IGLSIZE: to = ',REAL(ISOUTH)/PPMULT)
+ CALL INTLOG(JP_WARN,
+ X 'IGLSIZE: Does not match no. of pts = ',KNNS)
+ CALL INTLOGR(JP_WARN,
+ X 'IGLSIZE: and stride = ',REAL(KSTRIDE(JPNSSTEP))/PPMULT)
+C
+ ENDIF
+C
+ ENDIF
+C
+ KLN = (JP90 - INORTH ) / KSTRIDE(JPNSSTEP) + 1
+C
+C Check if North and South poles within grid
+C
+ ONPOLE = INORTH.EQ.JP90
+ OSPOLE = ISOUTH.EQ.(- JP90)
+C
+ IF( KPR.GE.1 ) THEN
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: Output parameters.',JPQUIET)
+ IF( KNWE.NE.0 ) CALL INTLOG(JP_DEBUG,
+ X 'IGLSIZE: No.long pts = ',KNWE)
+ IF( KNNS.NE.0 ) CALL INTLOG(JP_DEBUG,
+ X 'IGLSIZE: No.lat. pts = ',KNNS)
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: Northern line no. =',KLN)
+C
+ IF( OWEGLOBE ) THEN
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: W-E fld is global',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: W-E fld is NOT global',JPQUIET)
+ ENDIF
+C
+ IF( ONPOLE ) THEN
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: N pole is in fld.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: N pole is NOT in fld.',JPQUIET)
+ ENDIF
+C
+ IF( OSPOLE ) THEN
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: S pole is in fld.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: S pole is NOT in fld.',JPQUIET)
+ ENDIF
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGLSIZE: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/iglsm01.F b/interpolation/iglsm01.F
new file mode 100755
index 0000000..cadb183
--- /dev/null
+++ b/interpolation/iglsm01.F
@@ -0,0 +1,280 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGLSM01 (KUNIT, KNWE, KLONG, KLATV,
+ 1 KEXPAND, KLEN, KLSM)
+C
+C---->
+C**** *IGLSM01*
+C
+C PURPOSE
+C _______
+C
+C Read and process one latitude row from the 10 minute land sea
+C mask.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGLSM01 (KUNIT, KNWE, KLONG, KLATV, KEXPAND,
+C 1 KLEN, KLSM)
+C
+C Input parameters
+C ________________
+C
+C KUNIT - The unit number of the land sea mask file.
+C KNWE - The number of points in the West-East direction
+C for this line of latitude.
+C KLONG - The array of longitude points for this line of
+C latitude.
+C KLATV - The latitude for which the land sea mask is
+C required.
+C KEXPAND - Fixed array of length JPLG01 (The number of items
+C in one latitude of the 10 minute land sea mask).
+C This is used to improve efficiency.
+C KLEN - The length of a full line of latitude in the file.
+C
+C Output parameters
+C ________________
+C
+C KLSM - The land-sea mask for the specified longitude
+C points at this line of latitude.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C 0 + OK
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C 25501 Unexpected end of file found when positioning or reading
+C land sea mask file.
+C 25502 Error return code when positioning or reading land sea
+C mask file.
+C 25503 Attempt to extract bits beyond array bounds in routine
+C INXBIT.
+C :
+C :
+C
+C Any error in this routine should be reported to Meteorological
+C Applications.
+C
+C Common block usage
+C __________________
+C
+C NONE
+C
+C EXTERNALS
+C _________
+C
+C INXBIT - Standard library routine to extract bits from
+C a packed array.
+C PBREAD - Standard library routine to read an unstructured
+C file.
+C PBSEEK - Standard library routine to position a file
+C before performing a transfer.
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C The latitude value is used to select which line is required
+C from the 10 minute land sea mask file. This line is then read
+C into a buffer and the bit extraction routine used to expand the
+C line to contain one bit per word. The required words are then
+C extracted from this array.
+C
+C The 10 minute land sea mask file contains 1080 lines of 2160
+C values with each value stored as one bit. (Each line of latitude
+C is packed in 68*32 = 2176 bits). Each value consists
+C of a 0 for sea or a 1 for land. The bits are assumed to be in
+C the centre of a 10 minute square (e.g. the first value is
+C assumed to be at 0 5' East and 89 55' North).
+C
+C To reduce system overheads involved in multiple PBSEEKS and
+C PBREADS, the whole file is read into an array on the first call.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 3 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Nov 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers ECMWF Oct 1996
+C The whole file is read into an array on the first call.
+C Number of function arguments reduced.
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "jparams.h"
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 25500)
+ INTEGER JPRAWSZ
+ PARAMETER (JPRAWSZ = 73440 )
+C
+C Function arguments
+ INTEGER KUNIT, KLATV, KLEN, KNWE
+ INTEGER KLONG (KNWE), KLSM (KNWE)
+ INTEGER KEXPAND (JPLG01)
+C
+C Local variables
+ INTEGER ILAT, IOFF, IERR, JLON
+ INTEGER LENRAW, RAWMASK, RAWSIZE, IFIRST
+ INTEGER ISIZE
+ DATA ISIZE/0/
+ DIMENSION RAWMASK(1)
+#ifdef POINTER_64
+ INTEGER*8 IRAWMSK
+#endif
+ POINTER ( IRAWMSK, RAWMASK )
+ SAVE IRAWMSK, ISIZE
+C
+ DATA RAWSIZE/JPRAWSZ/
+C
+ DATA IFIRST/0/
+ SAVE IFIRST
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IGLSM01 = 0
+C
+ IF( NDBG.GT.2 ) THEN
+ CALL INTLOG(JP_DEBUG,'IGLSM01: Section 1.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGLSM01: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGLSM01: Latitude value = ',KLATV)
+ CALL INTLOG(JP_DEBUG,'IGLSM01: Input rec len(words) = ',KLEN)
+ CALL INTLOG(JP_DEBUG,'IGLSM01: No.long pts = ',KNWE)
+ ENDIF
+C
+C If it is the first time through, read in the whole land-sea
+C mask file
+
+ IF( IFIRST.EQ.0 ) THEN
+ IFIRST = 10
+C
+C Find the file length
+C
+ CALL PBSEEK (KUNIT, 0, 2, LENRAW)
+ IF ( LENRAW.LT.0 ) THEN
+ IGLSM01 = JPROUTINE + 1
+ CALL INTLOG(JP_FATAL,
+ X 'IGLSM01: Error finding length of LSM file',JPQUIET)
+ GO TO 900
+ ENDIF
+C
+C Rewind the file
+C
+ CALL INTLOG(JP_DEBUG,'IGLSM01: Rewind the LSM file.',JPQUIET)
+ CALL PBSEEK (KUNIT, 0, 0, IERR)
+ IF (IERR .NE. 0) THEN
+ IGLSM01 = JPROUTINE + 2
+ CALL INTLOG(JP_FATAL,
+ X 'IGLSM01: Error rewinding LSM file',JPQUIET)
+ GO TO 900
+ ENDIF
+C
+C Allocate memory for the array (first time only)
+C
+ IF( ISIZE.EQ.0 ) THEN
+ ISIZE = ((JPRAWSZ*2+JPRLEN-1)*JPILEN)/JPRLEN
+ CALL JMEMHAN( 13, IRAWMSK, ISIZE, 1, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IGLSM01: Memory allocation error.',IRAWMSK)
+ IGLSM01 = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C Read the file
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'IGLSM01: Read the LSM file of byte size = ',LENRAW)
+ CALL PBREAD (KUNIT, RAWMASK, LENRAW, IERR)
+ IF (IERR .NE. LENRAW) THEN
+ IGLSM01 = JPROUTINE + 3
+ CALL INTLOG(JP_FATAL,'IGLSM01: Unexpected EOF while',JPQUIET)
+ CALL INTLOG(JP_FATAL,'IGLSM01: reading LSM file.',JPQUIET)
+ GO TO 900
+ ENDIF
+ ENDIF
+C _______________________________________________________
+C
+C* Section 2. Read one line of 10 minute land-sea mask
+C and expand into an unpacked array
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF(NDBG.GT.2) CALL INTLOG(JP_DEBUG,'IGLSM01: Section 2.',JPQUIET)
+C
+ ILAT = MIN ( ( (JP90 - KLATV) * JPML01) / JPMULT + 1, JPLT01)
+ IOFF = (ILAT - 1)*KLEN*JPBYTES*8
+C
+ CALL INXBIT (RAWMASK, RAWSIZE, IOFF, KEXPAND, JPLG01, JPBITS, 1,
+ X 'D', IERR)
+C
+ IF (IERR .NE. 0) THEN
+ IGLSM01 = JPROUTINE + 5
+ CALL INTLOG(JP_FATAL,'IGLSM01: Attempt to extract LSM',JPQUIET)
+ CALL INTLOG(JP_FATAL,'IGLSM01: beyond array bounds.',JPQUIET)
+ CALL INTLOG(JP_FATAL,'IGLSM01: Interpolation failed.',IGLSM01)
+ GO TO 900
+ ENDIF
+C
+C Transfer expanded bitmask line to land sea mask array
+C
+ DO 210 JLON = 1, KNWE
+ IOFF = (KLONG (JLON) * JPML01) / JPMULT + 1
+ KLSM (JLON) = KEXPAND (IOFF)
+ 210 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF(NDBG.GT.2) CALL INTLOG(JP_DEBUG,'IGLSM01: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/iglsmb.F b/interpolation/iglsmb.F
new file mode 100755
index 0000000..d2d0449
--- /dev/null
+++ b/interpolation/iglsmb.F
@@ -0,0 +1,471 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGLSMB( OISTAND, HIFILE, KIREC, KIGRID, KILINE,
+ X OOSTAND, HOFILE, KOREC, KOGRID, KOLINE, KPR, KERR)
+C
+C---->
+C**** *IGLSMB*
+C
+C PURPOSE
+C -------
+C
+C Calculate the effects of the land-sea masks on the unnormalised
+C interpolation weights for regular input and output fields.
+C
+C
+C INTERFACE
+C ---------
+C
+C IERR = IGLSMB( OISTAND, HIFILE, KIREC, KIGRID, KILINE, OOSTAND,
+C X HOFILE, KOREC, KOGRID, KOLINE, KPR, KERR)
+C
+C
+C Input parameters
+C ----------------
+C
+C OISTAND - Flag indicating whether the input land-sea mask
+C is a pre-stored "standard" field.
+C
+C HIFILE - The filename for the input land-sea mask.
+C
+C KIREC - The length of one latitude record in the input file.
+C
+C KIGRID - An array of length 2 giving the row and column
+C strides in a pre-stored land sea mask file for the
+C input grid.
+C
+C KILINE - An array of length 2 giving the offsets of the
+C Northern and Western starting points in a
+C pre-stored land sea mask file for the input grid.
+C
+C OOSTAND - Flag indicating whether the output land-sea mask
+C is a prestored "standard" field.
+C
+C HOFILE - The filename for the output land-sea mask.
+C
+C KOREC - The length of one latitude record in the output file.
+C
+C KOGRID - An array of length 2 giving the row and column
+C strides in a pre-stored land sea mask file for the
+C output grid.
+C
+C KOLINE - An array of length 2 giving the offsets of the
+C Northern and Western starting points in a
+C pre-stored land sea mask file for the output grid.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C
+C Output parameters
+C -----------------
+C
+C The common variable WFACT is modified by this routine.
+C
+C An error indicator
+C
+C 22401 An error exit was returned from the I/O routine PBOPEN.
+C 22402 An error exit was returned from the I/O routine PBCLOSE.
+C
+C
+C Common block usage
+C ------------------
+C
+C nifld.common - This file contains all the input field
+C definition variables.
+C
+C NINS - Number of grid points in NS direction for input
+C field (used in grspace.h).
+C NIWE - Number of grid points in WE direction for input
+C field is used.
+C
+C nofld.common - This file contains all the output field
+C definition variables.
+C
+C NONS - Number of grid points in NS direction for output
+C field is used.
+C NOWE - Number of grid points in WE direction for output
+C field is used.
+C
+C grspace.h - This file contains all the work space array
+C definitions for grid point to grid point
+C interpolation.
+C
+C MEXPAND - Array of length JPLG01 (see parim.h) used to
+C expand one latitude line of the 10 minute land
+C sea mask file to have one word per bit for
+C improved efficiency.
+C MWORK - Array of length JPLONG (see parim.h) used to
+C read one latitude line of a standard land sea
+C mask file.
+C
+C MILATG - The input field latitudes.
+C MILONG - The input field longitudes.
+C MILSM - Work array used in calculating the effects of
+C the land sea mask on interpolation.
+C MNSIND - The latitude line numbers (array offset) of the
+C input field associated with each line of
+C latitude in the output field.
+C MOLATG - The output field latitudes.
+C MOLONG - The output field longitudes.
+C MOLSM - Work array used in calculating the effects of
+C the land sea mask on interpolation.
+C MWEIND - This array holds the longitude points (array
+C offset) from the input field associated with
+C each longitude point in the output field.
+C WFACT - The interpolation weights for each point in the
+C output field.
+C
+C
+C Externals
+C ---------
+C
+C ABORTX - Standard routine to kill task.
+C IGLSM01 - Read and process one latitude row from the 10
+C minute land sea mask.
+C IGLSMR - Calculate the effects of the land-sea masks for one
+C line of latitude on the unnormalised interpolation
+C weights.
+C IGLSMST - Read and process one line of latitude from a
+C standard land sea mask file.
+C PBCLOSE - Close a land sea mask file after processing.
+C PBOPEN - Open a land sea mask file for processing.
+C INTLOG(R) - Logs messages.
+C JINDEX - Returns length of character string
+C
+C
+C Method
+C ------
+C
+C All the land sea mask data is in (0-1) form. If a point in the
+C input field has a different land sea mask value from the
+C corresponding point in the output field then its interpolating
+C weight is multiplied by a scaling factor. This scaling factor
+C is currently 0.2 so that the effect of such points in the final
+C interpolation is reduced.
+C
+C The land-sea mask files are kept open between calls to this
+C routine.
+C
+C
+C Reference
+C ---------
+C None
+C
+C
+C Comments
+C --------
+C None
+C
+C
+C AUTHOR
+C ------
+C K. Fielding *ECMWF* Oct 1993
+C
+C
+C Modifications
+C -------------
+C
+C J.D.Chambers ECMWF Oct 1996
+C Reduced number of parameters in call to IGLSMST and IGLSM01
+C
+C----<
+C
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grspace.h"
+C
+C Dummy arguments
+ LOGICAL OISTAND, OOSTAND
+ CHARACTER *(*) HIFILE, HOFILE
+ INTEGER KIREC, KOREC, KPR, KERR
+ INTEGER KIGRID(2), KILINE(2), KOGRID(2), KOLINE(2)
+C
+C Local variables
+ INTEGER IIUNIT, IOUNIT, IIFILE, IOFILE
+ INTEGER ILATN, ILATS, IISTRIDE, IOSTRIDE, IOFF, IPR, IERR
+ INTEGER JOLAT
+ CHARACTER*80 XHIFILE, XHOFILE
+ CHARACTER*2 NEWFILE, MSKFILE
+ INTEGER XIIUNIT, XIOUNIT, II
+ DATA XIIUNIT/0/
+ DATA XIOUNIT/0/
+ SAVE XHIFILE, XHOFILE, XIIUNIT, XIOUNIT
+C
+C Multiplication factor for unlike land-sea masks
+C
+ REAL PPLSM
+ PARAMETER (PPLSM = 0.2E0)
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 22400)
+C
+C External functions
+ INTEGER IGLSMR, IGLSMST, IGLSM01, JINDEX
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialisation
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGLSMB: Section 1.',JPQUIET)
+C
+ IGLSMB = 0
+C
+ IIFILE = JINDEX(HIFILE)
+ IOFILE = JINDEX(HOFILE)
+C
+ IF( KPR.GE.1 ) THEN
+ CALL INTLOG(JP_DEBUG,'IGLSMB: Input parameters are:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGLSMB: Land sea mask file name:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,HIFILE(1: IIFILE),JPQUIET)
+ IF( OISTAND ) THEN
+ CALL INTLOG(JP_DEBUG,'IGLSMB: Stnd fld flag = TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IGLSMB: Stnd fld flag = FALSE',JPQUIET)
+ ENDIF
+ CALL INTLOG(JP_DEBUG,'IGLSMB: LSM file rec len = ',KIREC)
+ CALL INTLOG(JP_DEBUG,'IGLSMB: The grid stride WE = ',KIGRID(1))
+ CALL INTLOG(JP_DEBUG,'IGLSMB: The grid stride NS = ',KIGRID(2))
+ CALL INTLOG(JP_DEBUG,'IGLSMB: The grid start N = ',KILINE(1))
+ CALL INTLOG(JP_DEBUG,'IGLSMB: The grid start W = ',KILINE(2))
+C
+ CALL INTLOG(JP_DEBUG,'IGLSMB: Output parameters are:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGLSMB: Land sea mask file name:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,HOFILE(1: IIFILE),JPQUIET)
+ IF( OOSTAND ) THEN
+ CALL INTLOG(JP_DEBUG,'IGLSMB: Stnd fld flag = TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IGLSMB: Stnd fld flag = FALSE',JPQUIET)
+ ENDIF
+ CALL INTLOG(JP_DEBUG,'IGLSMB: LSM file rec len = ',KOREC)
+ CALL INTLOG(JP_DEBUG,'IGLSMB: The grid stride WE = ',KOGRID(1))
+ CALL INTLOG(JP_DEBUG,'IGLSMB: The grid stride NS = ',KOGRID(2))
+ CALL INTLOG(JP_DEBUG,'IGLSMB: The grid start N = ',KOLINE(1))
+ CALL INTLOG(JP_DEBUG,'IGLSMB: The grid start W = ',KOLINE(2))
+ ENDIF
+C
+ IF( MILONG(2).GE.MILONG(1) ) THEN
+ IISTRIDE = MILONG(2) - MILONG(1)
+ ELSE
+ IISTRIDE = MILONG(2) + JP360 - MILONG(1)
+ ENDIF
+C
+ IF( MOLONG(2).GE.MOLONG(1) ) THEN
+ IOSTRIDE = MOLONG(2) - MOLONG(1)
+ ELSE
+ IOSTRIDE = MOLONG(2) + JP360 - MOLONG(1)
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Open files for input and output land sea masks
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGLSMB: Section 2.',JPQUIET)
+C
+C See if first time through or input land sea mask filename has
+C changed since last access
+C
+ II = JINDEX(HIFILE)
+ IF( XHIFILE(1:II).NE.HIFILE(1:II) ) THEN
+C
+C Open input land sea mask file
+C
+ IF( XIIUNIT.NE.0 ) CALL PBCLOSE(XIIUNIT,IERR)
+ CALL PBOPEN(IIUNIT, HIFILE, 'r', IERR)
+ IF( IERR.NE.0 ) THEN
+ IGLSMB = JPROUTINE + 1
+C
+ IF( KERR.GE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'IGLSMB: PBOPEN error = ',IERR)
+ CALL INTLOG(JP_ERROR,'IGLSMB: trying to open file:',JPQUIET)
+ CALL INTLOG(JP_ERROR, HIFILE(1:IIFILE) ,JPQUIET)
+C
+ IF( KERR.EQ.0 ) CALL INTLOG(JP_FATAL,
+ X 'IGLSMB: Interpolation failed.',JPQUIET)
+ ENDIF
+ GOTO 900
+ ENDIF
+ XIIUNIT = IIUNIT
+ XHIFILE(1:II) = HIFILE(1:II)
+ NEWFILE(1:1) = 'Y'
+C
+C Just rewind if same file still in use
+C
+ ELSE
+ IIUNIT = XIIUNIT
+ NEWFILE(1:1) = 'N'
+ ENDIF
+C
+C See if first time through or output land sea mask filename has
+C changed since last access
+C
+ II = JINDEX(HOFILE)
+ IF( XHOFILE(1:II).NE.HOFILE(1:II) ) THEN
+C
+C Open output land sea mask file
+C
+ IF( XIOUNIT.NE.0 ) CALL PBCLOSE(XIOUNIT,IERR)
+ CALL PBOPEN(IOUNIT, HOFILE, 'r', IERR)
+ IF( IERR.NE.0 ) THEN
+ IGLSMB = JPROUTINE + 1
+C
+ IF( KERR.GE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'IGLSMB: PBOPEN error = ',IERR)
+ CALL INTLOG(JP_ERROR,'IGLSMB: trying to open file:',JPQUIET)
+ CALL INTLOG(JP_ERROR, HOFILE(1:IOFILE) ,JPQUIET)
+C
+ IF( KERR.EQ.0 ) CALL INTLOG(JP_FATAL,
+ X 'IGLSMB: Interpolation failed.',JPQUIET)
+ GOTO 900
+ ENDIF
+ ENDIF
+ XIOUNIT = IOUNIT
+ XHOFILE(1:II) = HOFILE(1:II)
+ NEWFILE(2:2) = 'Y'
+C
+C Just rewind if same file still in use
+C
+ ELSE
+ IOUNIT = XIOUNIT
+ NEWFILE(2:2) = 'N'
+ ENDIF
+C -----------------------------------------------------------------|
+C* Section 3. Calculate arrays of weights
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGLSMB: Section 3.',JPQUIET)
+C
+ IPR = KPR
+C
+ DO JOLAT = 1, NONS
+C
+C Get line for output array
+C
+ IF( OOSTAND ) THEN
+C
+ IOFF = (KOLINE(JPNORTH) + (JOLAT - 1) * KOGRID(JPNSSTEP)
+ X - 1) * KOREC
+C
+ MSKFILE(2:2) = 'O'
+ MSKFILE(1:1) = NEWFILE(2:2)
+ IERR = IGLSMST(IOUNIT, IOFF, NOWE, KOLINE(JPWEST),
+ X KOGRID(JPWESTEP), KOREC, MOLSM, MSKFILE)
+ NEWFILE(2:2) = 'N'
+C
+ ELSE
+ IERR = IGLSM01(IOUNIT, NOWE, MOLONG, MOLATG(JOLAT),
+ X MEXPAND, KOREC, MOLSM)
+ ENDIF
+C
+ IF( IERR.GT.0 ) THEN
+ IGLSMB = IERR
+ GOTO 900
+ ENDIF
+C
+ ILATN = MNSIND(JP_I_N, JOLAT)
+ ILATS = MNSIND(JP_I_S, JOLAT)
+C
+C Get lines for input array
+C
+ IF( OISTAND ) THEN
+C
+ IOFF = (KILINE(JPNORTH) + (ILATN - 1) * KIGRID(JPNSSTEP)
+ X - 1) * KIREC
+C
+ MSKFILE(2:2) = 'I'
+ MSKFILE(1:1) = NEWFILE(1:1)
+ IERR = IGLSMST(IIUNIT, IOFF, NIWE, KILINE(JPWEST),
+ X KIGRID(JPWESTEP), KIREC, MILSM(1, JP_I_N), MSKFILE)
+ NEWFILE(1:1) = 'N'
+C
+ IF( IERR.GT.0 ) THEN
+ IGLSMB = IERR
+ GOTO 900
+ ENDIF
+C
+ IOFF = (KILINE(JPNORTH) + (ILATS - 1) * KIGRID(JPNSSTEP)
+ X - 1) * KIREC
+C
+ MSKFILE(2:2) = 'I'
+ MSKFILE(1:1) = NEWFILE(1:1)
+ IERR = IGLSMST(IIUNIT, IOFF, NIWE, KILINE(JPWEST),
+ X KIGRID(JPWESTEP), KIREC, MILSM(1, JP_I_S), MSKFILE)
+ NEWFILE(1:1) = 'N'
+C
+ ELSE
+C
+ IERR = IGLSM01(IIUNIT, NIWE, MILONG, MILATG(ILATN),
+ X MEXPAND, KIREC, MILSM(1, JP_I_N))
+C
+ IF( IERR.GT.0 ) THEN
+ IGLSMB = IERR
+ GOTO 900
+ ENDIF
+C
+ IERR = IGLSM01(IIUNIT, NIWE, MILONG, MILATG(ILATS),
+ X MEXPAND, KIREC, MILSM(1, JP_I_S))
+C
+ ENDIF
+C
+ IF( IERR.GT.0 ) THEN
+ IGLSMB = IERR
+ GOTO 900
+ ENDIF
+C
+C Now modify the unormalised weight for land-sea mask
+C
+ IERR = IGLSMR(MILSM(1, JP_I_N), MILSM(1, JP_I_S), MOLSM,
+ X MWEIND, MWEIND, NOWE, WFACT(1,(JOLAT - 1) * NOWE + 1),
+ X IPR, KERR)
+C
+ IF( IERR.GT.0 ) THEN
+ IGLSMB = IERR
+ GOTO 900
+ ENDIF
+C
+ IPR = KPR - 1
+C
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return to calling routine. Format statements
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGLSMB: Section 9.',JPQUIET)
+C
+ 9001 FORMAT(' IGLSMB ERROR', I6, ' - ', A, ' returned code', I6 /
+ 1 21X, ' when ', A, 'ing file - ', A)
+C
+C
+ RETURN
+ END
diff --git a/interpolation/iglsmd.F b/interpolation/iglsmd.F
new file mode 100755
index 0000000..71cf8f9
--- /dev/null
+++ b/interpolation/iglsmd.F
@@ -0,0 +1,491 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGLSMD(KDATE,KREPR,KGRID,KGAUSS,KAREA,KLN,
+ X HFILE, OSTAND, KOGRID, KOLINE, KNREC, KPR, KERR)
+C
+C---->
+C**** *IGLSMD*
+C
+C PURPOSE
+C _______
+C
+C Generate the land sea mask file information.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGLSMD(KDATE,KREPR,KGRID,KGAUSS,KAREA,KLN,
+C X HFILE, OSTAND, KOGRID, KOLINE, KNREC, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KDATE - The field date in YYMMDD format
+C
+C KREPR - The field representation.
+C
+C KGRID - The latitude/longitude field grid definition
+C (WE, NS) or Gaussian truncation.
+C
+C KAREA - The field area definition (N, W, S, E).
+C
+C KLN - The Northern line number. This is mainly used for
+C Gaussian grids.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C HFILE - The filename for the land-sea mask.
+C
+C OSTAND - Flag indicating whether the land-sea mask is
+C a prestored "standard" field.
+C
+C KOGRID - The grid stride (WE, NS) in a pre-stored
+C "standard" land sea mask file.
+C
+C KOLINE - The offsets (N, W) of the first points in a
+C pre-stored "standard" land sea mask file.
+C
+C KNREC - The file line length for the input array. This is
+C used for positioning and transfer purposes.
+C
+C Return value
+C ____________
+C
+C The status indicator (INTEGER).
+C = 0 if OK,
+C = 25201 if data representation type is not valid.
+C = 25202 if unable to locate lsm file for reduced gaussian
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C GETENV - Standard routine to get environmental variable.
+C INDEX - Intrinsic routine to find position of substring.
+C LEN - Intrinsic routine to find length of string.
+C INTLOG(R) - Logs messages.
+C EMOSNUM - Gives current EMOSLIB version number.
+C
+C METHOD
+C ______
+C
+C NOTE This routine is highly machine dependent as the path and
+C file names for all land sea mask files are in the text. GETENV
+C is used to allow the specification of an alternate directory
+C for the storage of land sea masks (variable MARS_LSM_PATH).
+C
+C The grid definition is compared with the definitions of the
+C pre-stored land sea mask files. If a match is found then the
+C appropriate filename is returned and the stride and offset
+C arrays are set to appropriate values. If no match is found then
+C the name of the basic 10 minute 0-1 land sea mask file is
+C returned.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 5 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Nov 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers ECMWF 7 Feb 96
+C Add lookup for reduced gaussian fields
+C
+C J.D.Chambers ECMWF Nov 98
+C Change default pathnames.
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Function arguments
+C
+ CHARACTER *(*) HFILE
+ LOGICAL OSTAND
+ INTEGER KDATE, KREPR, KGAUSS, KLN, KNREC, KPR, KERR
+ INTEGER KGRID(2), KAREA(4), KOGRID(2), KOLINE(2)
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 25200)
+ INTEGER JPFILES
+ INTEGER JPN80, JPR160, JP0P5LL, JP0P25LL
+ PARAMETER (JPFILES = 4)
+ PARAMETER (JPN80 = 1)
+ PARAMETER (JPR160 = 2)
+ PARAMETER (JP0P5LL = 3)
+ PARAMETER (JP0P25LL = 4)
+C
+ INTEGER JPNORMAL
+ CHARACTER YPENVIRON*13, YPNORMAL*44, YPNORMAS*256
+ PARAMETER (YPENVIRON = 'MARS_LSM_PATH')
+#ifdef CRAY
+ PARAMETER (JPNORMAL = 30)
+ PARAMETER (YPNORMAL = '/tmp/emos_sms/tables/lsm_64bit')
+#endif
+
+#ifdef __uxp__
+ PARAMETER (JPNORMAL = 14)
+ PARAMETER (YPNORMAL = '/mrfs/postproc')
+#endif
+
+#if (!defined CRAY) && (!defined __uxp__)
+ PARAMETER (JPNORMAL = 42)
+ PARAMETER (YPNORMAL ='/usr/local/lib/metaps/tables/interpolation')
+#endif
+
+
+#ifdef TABLE_PATH
+ DATA YPNORMAS / TABLE_PATH /
+#else
+ DATA YPNORMAS / '' /
+#endif
+C
+C Local variables
+C
+ CHARACTER*6 YEMOSNM,YFLAG,YFLAG1
+ INTEGER IEMOSNM
+ INTEGER ILSTRIDE, IRET, IOFFSET
+ LOGICAL LDEBUG, L10MIN, L025
+C
+ CHARACTER*80 YBASE, YENVBACK
+C
+C List of standard filenames - YFILES
+C File for 10 minute land sea mask - YLSM10
+C
+ CHARACTER*40 YFILES (JPFILES), YLSM10
+C
+ INTEGER IBASELEN, ILSM10LEN
+ INTEGER IFILELEN (JPFILES)
+C
+C External functions
+C
+ INTEGER EMOSNUM, LSM_RED
+ EXTERNAL EMOSNUM, LSM_RED
+C
+ DATA YLSM10 / 'lsm_xx_lsm10m01' /
+ DATA ILSM10LEN / 15 /
+ DATA YFILES/'lsm_xx_lsmn080','lsm_xx_lsmr160',
+ X 'lsm_xx_lsm0p5deg', 'lsm_xx_lsm0p25deg'/
+ DATA IFILELEN/ 14, 14, 16, 17 /
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ L10MIN = .FALSE.
+C Force processing with 10min lsm with env variable
+ CALL GETENV('LSM_10MIN', YFLAG)
+ IF( YFLAG(1:1).EQ.'1' ) L10MIN = .TRUE.
+
+ IF( L10MIN ) CALL INTLOG(JP_DEBUG,
+ X 'IGLSMD: Forcing processing with 10 min',JPQUIET)
+
+ L025 = .FALSE.
+C Processing with 0.25 Predefined lsm Enable
+ CALL GETENV('LSM_025', YFLAG1)
+ IF( YFLAG1(1:1).EQ.'1' ) L025 = .TRUE.
+
+ IF( L025 ) CALL INTLOG(JP_DEBUG,
+ X 'IGLSMD: Processing with 0.25 Predefined LSM Enabled',JPQUIET)
+
+ IGLSMD = 0
+ LDEBUG = ( KPR.GE.1 )
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'IGLSMD: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGLSMD: Date = ',KDATE)
+ CALL INTLOG(JP_DEBUG,'IGLSMD: Grid representation = ',KREPR)
+ CALL INTLOG(JP_DEBUG,'IGLSMD: N line number = ', KLN)
+C
+ IF( (KREPR.EQ.JPGAUSSIAN).OR.
+ X (KREPR.EQ.JPQUASI) .OR.
+ X (KREPR.EQ.JPQGGROT) .OR.
+ X (KREPR.EQ.JPFGGROT) ) THEN
+ CALL INTLOG(JP_DEBUG,'IGLSMD: Gaussian trunc = ',KGAUSS)
+ ELSE IF( (KREPR.EQ.JPREGULAR).OR.(KREPR.EQ.JPREGROT) ) THEN
+ CALL INTLOG(JP_DEBUG,'IGLSMD: Grid WE = ',KGRID(1))
+ CALL INTLOG(JP_DEBUG,'IGLSMD: Grid NS = ',KGRID(2))
+ ENDIF
+C
+ CALL INTLOG(JP_DEBUG,'IGLSMD: Area North = ', KAREA(1))
+ CALL INTLOG(JP_DEBUG,'IGLSMD: Area West = ', KAREA(2))
+ CALL INTLOG(JP_DEBUG,'IGLSMD: Area South = ', KAREA(3))
+ CALL INTLOG(JP_DEBUG,'IGLSMD: Area East = ', KAREA(4))
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Check environment variable for path of land sea masks.
+C
+C GETENV returns a blank value if the environmental
+C variable is not set. This is true for C90, Sun and
+C SGI.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF ( LDEBUG ) CALL INTLOG(JP_DEBUG,'IGLSMD: Section 2.',JPQUIET)
+C
+ CALL GETENV( YPENVIRON, YENVBACK)
+C
+ IF( YENVBACK.EQ.' ' ) THEN
+#ifdef __uxp__
+C
+C On Fujitsus, need to build different pathname for vpp300,
+C vpp700, vpp700e and vpp5000
+C
+ CALL GETENV ('HOST', YENVBACK)
+ IF( YENVBACK(1:7).EQ.'vpp5000' )THEN
+ YBASE = '/vpp5000' // YPNORMAL
+ IBASELEN = JPNORMAL + LEN('/vpp5000')
+ ELSE IF( YENVBACK(1:7).EQ.'vpp700e' )THEN
+ YBASE = '/vpp700e' // YPNORMAL
+ IBASELEN = JPNORMAL + LEN('/vpp700e')
+ ELSE IF( YENVBACK(1:6).EQ.'vpp700' )THEN
+ YBASE = '/vpp700' // YPNORMAL
+ IBASELEN = JPNORMAL + LEN('/vpp700')
+ ELSE
+ YBASE = YPNORMAL
+ IBASELEN = JPNORMAL
+ ENDIF
+#else
+ IOFFSET = INDEX(YPNORMAS,' ') - 1
+ IF(IOFFSET.GT.0) THEN
+ YBASE = YPNORMAS(1:IOFFSET)//'/land_sea_mask/'
+cs IBASELEN = LEN(YBASE)
+cs big fix by Iain Russel
+ IBASELEN = INDEX(YBASE,' ') - 1
+ ELSE
+ YBASE = YPNORMAL
+ IBASELEN = JPNORMAL
+ ENDIF
+#endif
+ ELSE
+ YBASE = YENVBACK
+ IBASELEN = INDEX (YENVBACK, ' ') - 1
+ IF( IBASELEN.LT.0 ) IBASELEN = LEN (YENVBACK)
+ IF( IBASELEN.EQ.0 ) THEN
+#ifdef __uxp__
+C
+C On Fujitsus, need to build different pathname for vpp300,
+C vpp700, vpp700e and vpp5000
+C
+ CALL GETENV ('HOST', YENVBACK)
+ IF( YENVBACK(1:7).EQ.'vpp5000' )THEN
+ YBASE = '/vpp5000' // YPNORMAL
+ IBASELEN = JPNORMAL + LEN('/vpp5000')
+ ELSE IF( YENVBACK(1:7).EQ.'vpp700e' )THEN
+ YBASE = '/vpp700e' // YPNORMAL
+ IBASELEN = JPNORMAL + LEN('/vpp700e')
+ ELSE IF( YENVBACK(1:6).EQ.'vpp700' )THEN
+ YBASE = '/vpp700' // YPNORMAL
+ IBASELEN = JPNORMAL + LEN('/vpp700')
+ ELSE
+ YBASE = YPNORMAL
+ IBASELEN = JPNORMAL
+ ENDIF
+#else
+ YBASE = YPNORMAL
+ IBASELEN = JPNORMAL
+#endif
+ ENDIF
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 3. Standard Gaussian grids - N80
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF( (KREPR.EQ.JPGAUSSIAN).OR.
+ X (KREPR.EQ.JPFGGROT) ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,'IGLSMD: Section 3.',JPQUIET)
+C
+ ILSTRIDE = JP90 / KGAUSS
+ KOGRID (JPWESTEP) = 1
+ KOGRID (JPNSSTEP) = 1
+ KOLINE (JPWEST) = KAREA (JPWEST) / ILSTRIDE + 1
+ KOLINE (JPNORTH) = KLN
+C
+ IF( KGAUSS.EQ.80 ) THEN
+C
+ HFILE = YBASE(1:IBASELEN) // '/' //
+ X YFILES(JPN80)(1:IFILELEN(JPN80) )
+ OSTAND = .TRUE.
+ KNREC = 320
+C
+ ELSE
+C
+ HFILE = YBASE(1:IBASELEN) // '/' // YLSM10(1:ILSM10LEN)
+ OSTAND = .FALSE.
+ KNREC = JPPACK
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 4. Standard reduced Gaussian grids - R160
+C _______________________________________________________
+C
+ 400 CONTINUE
+C
+ ELSE IF( KREPR.EQ.JPQUASI ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,'IGLSMD: Section 4.',JPQUIET)
+C
+ KOGRID(JPWESTEP) = 1
+ KOGRID(JPNSSTEP) = 1
+ KOLINE(JPWEST) = 1
+ KOLINE(JPNORTH) = KLN
+C
+ IF( KGAUSS.EQ.160 ) THEN
+#ifdef CRAY
+ IRET = LSM_RED(KGAUSS,KDATE,64,HFILE)
+#else
+ IRET = LSM_RED(KGAUSS,KDATE,32,HFILE)
+#endif
+ IF( IRET.EQ.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'IGLSMD: LSM_RED unable to locate lsm file.',JPQUIET)
+ IGLSMD = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ OSTAND = .TRUE.
+ KNREC = 0
+ ELSE
+C
+ HFILE = YBASE(1:IBASELEN) // '/' // YLSM10(1:ILSM10LEN)
+ OSTAND = .FALSE.
+ KNREC = JPPACK
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 5. Latitude/longitude grids
+C
+C The standard 0.5 degree grid is used for any
+C grid which has a stride which is a multiple of
+C 0.5 and North and South limits which are a
+C multiple of 0.5
+C _______________________________________________________
+C
+ 500 CONTINUE
+C
+ ELSE IF( (KREPR.EQ.JPREGULAR).OR.(KREPR.EQ.JPREGROT) ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,'IGLSMD: Section 5.',JPQUIET)
+C
+ IF( MOD(KGRID(JPNSSTEP),JP0P5).EQ.0 .AND.
+ 1 MOD(KGRID(JPWESTEP),JP0P5).EQ.0 .AND.
+ 2 MOD(KAREA(JPNORTH), JP0P5).EQ.0 .AND.
+ 3 MOD(KAREA(JPWEST), JP0P5).EQ.0 .AND.
+ 4 .NOT.L10MIN ) THEN
+C
+ HFILE = YBASE(1:IBASELEN) // '/' //
+ 1 YFILES(JP0P5LL) (1: IFILELEN (JP0P5LL) )
+ OSTAND = .TRUE.
+ KNREC = 720
+C
+ KOGRID(JPWESTEP) = KGRID(JPWESTEP) / JP0P5
+ KOGRID(JPNSSTEP) = KGRID(JPNSSTEP) / JP0P5
+ KOLINE(JPWEST) = KAREA(JPWEST) / JP0P5 + 1
+ KOLINE(JPNORTH) = (JP90 - KAREA(JPNORTH) ) / JP0P5 + 1
+C
+ ELSE
+C
+ HFILE = YBASE(1:IBASELEN) // '/' // YLSM10(1:ILSM10LEN)
+ OSTAND = .FALSE.
+ KNREC = JPPACK
+C
+ KOGRID (JPWESTEP) = 1
+ KOGRID (JPNSSTEP) = 1
+ KOLINE (JPWEST) = 1
+ KOLINE (JPNORTH) = KLN
+C
+ ENDIF
+ ELSE
+ IGLSMD = JPROUTINE + 1
+ IF( KERR.GE.0 ) CALL INTLOG(JP_ERROR,
+ X 'IGLSMD: Invalid data representation = ',KREPR)
+C
+ IF( KERR.EQ.0 ) CALL INTLOG(JP_FATAL,
+ X 'IGLSMD: Interpolation failed.',IGLSMD)
+C GOTO 900
+ ENDIF
+
+ IF( L025 ) THEN
+ IF( KGRID(JPNSSTEP).EQ.JP0P25.AND.
+ 1 KGRID(JPWESTEP).EQ.JP0P25.AND.
+ 2 MOD(KAREA(JPNORTH), JP0P25).EQ.0 .AND.
+ 3 MOD(KAREA(JPWEST), JP0P25).EQ.0 .AND.
+ 4 .NOT.L10MIN ) THEN
+C
+ HFILE = YBASE(1:IBASELEN) // '/' //
+ 1 YFILES(JP0P25LL) (1: IFILELEN (JP0P25LL) )
+ OSTAND = .TRUE.
+ KNREC = 1440
+C
+ KOGRID(JPWESTEP) = 1
+ KOGRID(JPNSSTEP) = 1
+ KOLINE(JPWEST) = KAREA(JPWEST) / JP0P25 + 1
+ KOLINE(JPNORTH) = (JP90 - KAREA(JPNORTH) ) / JP0P25 + 1
+ ENDIF
+ ENDIF
+C
+C _______________________________________________________
+C
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,'IGLSMD: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/iglsmr.F b/interpolation/iglsmr.F
new file mode 100755
index 0000000..2fd35fa
--- /dev/null
+++ b/interpolation/iglsmr.F
@@ -0,0 +1,232 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGLSMR (KILSMN, KILSMS, KOLSM, KNINDEX,
+ 1 KSINDEX, KOWE, PWFACT, KPR, KERR)
+C
+C---->
+C**** *IGLSMR*
+C
+C PURPOSE
+C _______
+C
+C Calculate the effects of the land sea masks for one line of
+C latitude on the unnormalised interpolation weights.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGLSMR (KILSMN, KILSMS, KOLSM, KNINDEX, KSINDEX,
+C 1 KOWE, PWFACT, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KILSMN - The land sea mask for the line of latitude of the
+C input field North of the output row.
+C
+C KILSMS - The land sea mask for the line of latitude of the
+C input field South of the output row.
+C
+C KOLSM - The land sea mask for the current line of latitude
+C of the output field.
+C
+C KNINDEX - This array contains the array offsets of the West
+C and East points in the input line of latitude North
+C of the current output field line of latitude.
+C
+C KSINDEX - This array contains the array offsets of the West
+C and East points in the input line of latitude South
+C of the current output field line of latitude.
+C
+C KOWE - The number of output field points in the West-East
+C direction for this line of latitude.
+C
+C PWFACT - The array of interpolating weights to the four
+C neighbouring points for every output point in this
+C line of latitude.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C PWFACT - The modified array of interpolating weights to the
+C four neighbouring points for every output point in
+C this line of latitude.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C Every time that a point in the input array has a land-sea mask
+C value (0-1) that does not match the corresponding output point
+C its interpolating value is multiplied by a scaling factor
+C (currently 0.2). This reduces the influence of such points on
+C the final interpolation.
+C
+C The parameter list is designed to allow for quasi regular input
+C fields with different grid spacing in the Northern and Southern
+C lines of latitude.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 2 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Dummy arguments
+ INTEGER KOWE, KPR, KERR
+ INTEGER KNINDEX (2, KOWE), KSINDEX (2, KOWE)
+ INTEGER KILSMN (*), KILSMS (*), KOLSM (KOWE)
+ REAL PWFACT (4, KOWE)
+C
+C Local variables
+ INTEGER JOLON
+C
+C Multiplication factor for unlike land-sea masks
+ REAL PPLSM
+ PARAMETER (PPLSM = 0.2E0)
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 25300)
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGLSMR: Section 1.',JPQUIET)
+C
+ IGLSMR = 0
+C
+ IF (KPR .GE. 1)
+ X CALL INTLOG(JP_DEBUG,'IGLSMR: No. of output longitudes = ',KOWE)
+C
+C _______________________________________________________
+C
+C* Section 2. Calculate arrays of weights
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGLSMR: Section 2.',JPQUIET)
+C
+C Now modify the unormalised weight for land-sea mask
+C
+ DO 210 JOLON = 1, KOWE
+C
+ IF (KILSMN (KNINDEX (JP_I_W, JOLON)) .NE.
+ 1 KOLSM (JOLON) )
+ 2 PWFACT (JP_I_NW, JOLON) =
+ 3 PWFACT (JP_I_NW, JOLON) * PPLSM
+C
+ IF (KILSMN (KNINDEX (JP_I_E, JOLON)) .NE.
+ 1 KOLSM (JOLON) )
+ 2 PWFACT (JP_I_NE, JOLON) =
+ 3 PWFACT (JP_I_NE, JOLON) * PPLSM
+C
+ IF (KILSMS (KSINDEX (JP_I_W, JOLON)) .NE.
+ 1 KOLSM (JOLON) )
+ 2 PWFACT (JP_I_SW, JOLON) =
+ 3 PWFACT (JP_I_SW, JOLON) * PPLSM
+C
+ IF (KILSMS (KSINDEX (JP_I_E, JOLON)) .NE.
+ 1 KOLSM (JOLON) )
+ 2 PWFACT (JP_I_SE, JOLON) =
+ 3 PWFACT (JP_I_SE, JOLON) * PPLSM
+C
+ 210 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGLSMR: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/iglsmst.F b/interpolation/iglsmst.F
new file mode 100755
index 0000000..535ce7c
--- /dev/null
+++ b/interpolation/iglsmst.F
@@ -0,0 +1,336 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGLSMST (KUNIT, KOFF, KNWE, KFIRST, KSTRIDE,
+ 1 KLEN, KLSM, NEWFILE)
+C
+C---->
+C**** *IGLSMST*
+C
+C PURPOSE
+C _______
+C
+C Read and process one line of latitude from a standard land sea
+C mask file.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGLSMST (KUNIT, KOFF, KNWE, KFIRST, KSTRIDE,
+C 1 KLEN, KLSM)
+C
+C Input parameters
+C ________________
+C
+C KUNIT - The unit number of the land sea mask file.
+C KOFF - The word offset within the file of the required
+C line. This is used to position the file.
+C KNWE - The number of points in the West-East direction
+C for this line of latitude.
+C KFIRST - The position of the first land sea mask point
+C required within the array.
+C KSTRIDE - The distance between the longitude points required.
+C KLEN - The length of a full latitude row of the land sea
+C mask file.
+C NEWFILE - 'YI' if the input land-sea mask file is to be
+C accessed and it has changed
+C 'NI' if the input land-sea mask file is to be
+C accessed and it has not changed
+C 'YO' if the output land-sea mask file is to be
+C accessed and it has not changed
+C 'NO' if the output land-sea mask file is to be
+C accessed and it has not changed
+C
+C Output parameters
+C ________________
+C
+C KLSM - The array of land sea mask values for this
+C latitude value and set of longitude points.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C 25401 Unexpected end of file found when positioning or reading
+C land sea mask file.
+C 25402 Error return code when positioning or reading land sea
+C mask file.
+C
+C Any error in this routine should be reported to Meteorological
+C Applications.
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C PBREAD - Standard library routine to read unstructured
+C files.
+C PBSEEK - Standard library routine to position an
+C unstructured file.
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C A full standard latitude line is transferred to the work array
+C and then the required points copied into the output array.
+C
+C The land sea mask file is assumed to use one integer word for
+C each value even though these values can only be 0 or 1. This
+C gives a gain in efficiency at a cost in file size.
+C
+C To reduce system overheads involved in multiple PBSEEKS and
+C PBREADS, the whole file is read into an array on the first call.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 3 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Nov 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers ECMWF Oct 1996
+C The whole file is read into an array on the first call.
+C Number of function arguments reduced.
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C J.D.Chambers ECMWF June 1999
+C Use bitmaps for landsea masks
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "jparams.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 25400)
+ INTEGER JPRAWSZ
+ PARAMETER (JPRAWSZ = (JPLONG*JPLAT+(JPBITS-1))/JPBITS )
+C
+C Function arguments
+C
+ INTEGER KUNIT, KOFF, KFIRST, KSTRIDE, KLEN, KNWE
+ INTEGER KLSM (KNWE)
+ CHARACTER*2 NEWFILE
+C
+C Local variables
+C
+ INTEGER JDCSIZE, JDCINDX, JDCPNT, JDCRET, JLSM
+ DIMENSION JLSM(1440)
+C `-------> good upto 0.25 degree latitude step
+C
+ INTEGER IPOINT, IERR, ISIZE
+ DATA ISIZE/0/
+ INTEGER JLON
+ INTEGER LENRAW, IFIRST, IFILE, INDEX
+ DIMENSION LENRAW(2)
+ DIMENSION IFILE(2)
+ INTEGER NRAWMSK
+ DIMENSION NRAWMSK(1)
+#ifdef POINTER_64
+ INTEGER*8 IRAWMSK
+#endif
+ POINTER (IRAWMSK, NRAWMSK )
+ DATA IFILE/0,0/
+ SAVE IFILE, LENRAW, IRAWMSK, ISIZE
+C
+C Statement function
+C
+ INTEGER I, J
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IGLSMST = 0
+C
+ IF( NDBG.GT.2) THEN
+ CALL INTLOG(JP_DEBUG,'IGLSMST: Section 1.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGLSMST: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGLSMST: Word offset in file = ',KOFF)
+ CALL INTLOG(JP_DEBUG,'IGLSMST: Input rec len(words)= ',KLEN)
+ CALL INTLOG(JP_DEBUG,'IGLSMST: No. of longitude pts = ',KNWE)
+ CALL INTLOG(JP_DEBUG,'IGLSMST: First point in line = ',KFIRST)
+ CALL INTLOG(JP_DEBUG,'IGLSMST: Stride along line = ',KSTRIDE)
+ ENDIF
+C
+C If the input or output land-sea mask file has changed, reset
+C the stored unit
+C
+ IF( NEWFILE(2:2).EQ.'I' ) THEN
+ IF( NEWFILE(1:1).EQ.'Y' ) THEN
+ INDEX = 1
+ IFILE(INDEX) = KUNIT
+ IFIRST = 0
+ CALL INTLOG(JP_DEBUG,'IGLSMST: New input LSM file.',JPQUIET)
+ ELSE
+ INDEX = 1
+ IFIRST = 1
+ ENDIF
+ ENDIF
+C
+ IF( NEWFILE(2:2).EQ.'O' ) THEN
+ IF( NEWFILE(1:1).EQ.'Y' ) THEN
+ INDEX = 2
+ IFILE(INDEX) = KUNIT
+ IFIRST = 0
+ CALL INTLOG(JP_DEBUG,'IGLSMST: New output LSM file.',JPQUIET)
+ ELSE
+ INDEX = 2
+ IFIRST = 2
+ ENDIF
+ ENDIF
+C
+C If it is the first time through, read in the whole land-sea
+C mask file
+C
+ IF( IFIRST.EQ.0 ) THEN
+C
+C Find the file length
+C
+ CALL PBSEEK (KUNIT, 0, 2, LENRAW(INDEX))
+ IF ( LENRAW(INDEX).LT.0 ) THEN
+ IGLSMST = JPROUTINE + 1
+ CALL INTLOG(JP_FATAL,
+ X 'IGLSMST: Error finding length of LSM file',JPQUIET)
+ GO TO 900
+ ENDIF
+C
+C Rewind the file
+C
+ CALL INTLOG(JP_DEBUG,'IGLSMST: Rewind the LSM file.',JPQUIET)
+ CALL PBSEEK (KUNIT, 0, 0, IERR)
+ IF ( IERR.NE.0 ) THEN
+ IGLSMST = JPROUTINE + 2
+ CALL INTLOG(JP_FATAL,
+ X 'IGLSMST: Error rewinding LSM file',JPQUIET)
+ GO TO 900
+ ENDIF
+C
+C Allocate memory for the array (first time only)
+C
+ IF( ISIZE.EQ.0 ) THEN
+ ISIZE = JPRAWSZ*2
+ CALL JMEMHAN( 12, IRAWMSK, ISIZE, 1, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IGLSMST: Memory allocation error.',IRAWMSK)
+ IGLSMST = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C Read the file (ignore end-of-file).
+C
+ CALL INTLOG(JP_DEBUG,'IGLSMST: Read the LSM file',LENRAW(INDEX))
+ CALL PBREAD(KUNIT, NRAWMSK((INDEX-1)*JPRAWSZ+1),
+ X LENRAW(INDEX), IERR)
+C
+ IF( IERR.NE.LENRAW(INDEX) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IGLSMST: Land-sea mask file read error.',JPQUIET)
+ IGLSMST = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C Section 2. Transfer file to land sea mask array
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF( NDBG.GT.2) CALL INTLOG(JP_DEBUG,'IGLSMST: Section 2.',JPQUIET)
+C
+C Needs whole line of land sea mask with no adjustment
+C
+ IF( (KLEN.EQ.KNWE).AND.(KFIRST.EQ.1) ) THEN
+ JDCSIZE = (LENRAW(INDEX)*8+(JPBITS-1))/JPBITS
+ JDCINDX = (INDEX-1)*JPRAWSZ+(KOFF/JPBITS) + 1
+ JDCPNT = MOD(KOFF,JPBITS)
+ CALL INXBIT(NRAWMSK(JDCINDX), JDCSIZE, JDCPNT,
+ X KLSM, KNWE, JPBITS, 1, 'D', JDCRET)
+ IF( JDCRET.NE.0 ) THEN
+ IGLSMST = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ ELSE
+C
+C Needs part of land sea mask array or different starting
+C point
+C
+C Unpack whole latitude
+C
+ JDCSIZE = (LENRAW(INDEX)*8+(JPBITS-1))/JPBITS
+ JDCINDX = (INDEX-1)*JPRAWSZ+(KOFF/JPBITS) + 1
+ JDCPNT = MOD(KOFF,JPBITS)
+ CALL INXBIT(NRAWMSK(JDCINDX), JDCSIZE, JDCPNT,
+ X JLSM, KLEN, JPBITS, 1, 'D', JDCRET)
+ IF( JDCRET.NE.0 ) THEN
+ IGLSMST = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+C Select required points
+C
+ DO 220 JLON = 1, KNWE
+ IPOINT = MOD(KLEN + KFIRST + KSTRIDE*(JLON-1) - 1, KLEN) + 1
+ KLSM(JLON) = JLSM(IPOINT)
+ 220 CONTINUE
+
+
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF( NDBG.GT.2) CALL INTLOG(JP_DEBUG,'IGLSMST: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/ignorm.F b/interpolation/ignorm.F
new file mode 100755
index 0000000..d275e91
--- /dev/null
+++ b/interpolation/ignorm.F
@@ -0,0 +1,207 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGNORM (PWFACT, PSUM, KOWE, KONS, KPR, KERR)
+C
+C---->
+C**** *IGNORM*
+C
+C PURPOSE
+C _______
+C
+C Normalise the array of interpolation weights.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGNORM (PWFACT, PSUM, KOWE, KONS, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C PWFACT - The array of unnormalised interpolating weights to
+C the four neighbouring points for every output point.
+C
+C PSUM - Work array used to aid vectorisation.
+C
+C KOWE - The number of points in the West-East direction in
+C the output field.
+C
+C KONS - The number of points in the North-South direction
+C in the output field.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C PWFACT - The normalised array of interpolating weights to
+C the four neighbouring points for every output point.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C The four weights for each output point are normalised to have a
+C sum of one.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 2 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Dummy arguments
+ INTEGER KOWE, KONS, KPR, KERR
+ REAL PWFACT (4, KOWE, KONS), PSUM (KOWE)
+C
+C Local variables
+ INTEGER JOLAT, JOLON, JDIR
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 25600)
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGNORM: Section 1.',JPQUIET)
+C
+ IGNORM = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IGNORM: No of output longitudes = ',KOWE)
+ CALL INTLOG(JP_DEBUG,'IGALLOC: No of output lattudes = ',KONS)
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Calculate arrays of weights
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGNORM: Section 2.',JPQUIET)
+C
+ DO 260 JOLAT = 1, KONS
+C
+ DO 210 JOLON = 1, KOWE
+C
+ PSUM (JOLON) = PPZERO
+C
+ 210 CONTINUE
+C
+ DO 230 JDIR = 1, 4
+ DO 220 JOLON = 1, KOWE
+C
+ PSUM (JOLON) = PSUM (JOLON) +
+ 1 PWFACT (JDIR, JOLON, JOLAT)
+C
+ 220 CONTINUE
+ 230 CONTINUE
+C
+ DO 250 JDIR = 1, 4
+ DO 240 JOLON = 1, KOWE
+C
+ PWFACT (JDIR, JOLON, JOLAT) =
+ 1 PWFACT (JDIR, JOLON, JOLAT) / PSUM (JOLON)
+C
+ 240 CONTINUE
+ 250 CONTINUE
+C
+ 260 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGNORM: Section 9.',JPQUIET)
+C
+C
+ RETURN
+ END
diff --git a/interpolation/igplsm.F b/interpolation/igplsm.F
new file mode 100755
index 0000000..8b84caa
--- /dev/null
+++ b/interpolation/igplsm.F
@@ -0,0 +1,181 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGPLSM (POFELD, KLEN, KPR, KERR)
+C
+C---->
+C**** *IGPLSM*
+C
+C PURPOSE
+C _______
+C
+C Force an interpolated land sea mask field back to a real 0-1
+C field.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGPLSM (POFELD, KLEN, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C POFELD - The output field as previously calculated.
+C
+C KLEN - The length of the output field.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C POFELD - The 0-1 land sea mask output field
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C The intrinsic routine ANINT is used to create a real array of
+C the nearest integer value to the interpolated field. An
+C additional check is that all values less than zero are forced
+C to zero and all values greater than one are forced to one.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 2 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Feb 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Dummy arguments
+ INTEGER KLEN, KPR, KERR
+ REAL POFELD (KLEN)
+C
+C Local variables
+ INTEGER JLEN
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 25700)
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGPLSM: Section 1.',JPQUIET)
+C
+ IGPLSM = 0
+C
+ IF (KPR .GE. 1)
+ X CALL INTLOG(JP_DEBUG,'IGPLSM: Total fld len = ',KLEN)
+C
+C
+C _______________________________________________________
+C
+C* Section 2. Force land sea mask to nearest integer (0 or 1)
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGPLSM: Section 2.',JPQUIET)
+C
+ DO 210 JLEN = 1, KLEN
+C
+ POFELD (JLEN) = ANINT (POFELD (JLEN) )
+C
+ IF (POFELD (JLEN) .LT. PPZERO) POFELD (JLEN) = PPZERO
+ IF (POFELD (JLEN) .GT. PPONE) POFELD (JLEN) = PPONE
+C
+ 210 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGPLSM: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/igpoleg.F b/interpolation/igpoleg.F
new file mode 100755
index 0000000..3305ddf
--- /dev/null
+++ b/interpolation/igpoleg.F
@@ -0,0 +1,189 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGPOLEG(PIFELD, KIWE, POFELD, KOWE, KPR, KERR)
+C
+C---->
+C**** *IGPOLEG*
+C
+C Purpose
+C -------
+C
+C Calculate the values at the pole of a regular
+C latitude/longitude field when the input is a Gaussian field.
+C
+C This routine is used for any field except a wind field.
+C
+C Interface
+C ---------
+C
+C IERR = IGPOLEG(PIFELD, KIWE, POFELD, KOWE, KPR, KERR)
+C
+C Input parameters
+C ----------------
+C
+C PIFELD - A "polar" row of the input field provided by the
+C calling routine.
+C
+C KIWE - The number of points in the West-East direction in
+C the input field.
+C
+C KOWE - The number of points in the West-East direction in
+C the output field.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C -----------------
+C
+C POFELD - The corresponding "polar" row of the output field
+C returned to the calling routine.
+C
+C Return value
+C ------------
+C
+C The error indicator (INTEGER).
+C
+C
+C Common block usage
+C ------------------
+C
+C None
+C
+C Externals
+C ---------
+C
+C INTLOG(R) - Logs messages.
+C
+C Method
+C ------
+C
+C A Gaussian field does not have a line of latitude at the pole
+C so this routine forces all the values on the polar line of
+C latitude to the average of the values at the nearest Gaussian
+C line in the input field.
+C
+C This method was originally implemented by
+C
+C K. RIDER * ECMWF * OCTOBER 1991.
+C
+C Reference
+C ---------
+C
+C None
+C
+C Comments
+C --------
+C
+C Program contains sections 0 to 2 and 9
+C
+C Author
+C ------
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C Modifications
+C -------------
+C
+C Allow for missing data values
+C J.D.Chambers ECMWF August 2000
+C
+C----<
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+C
+C Function arguments
+C
+ INTEGER KIWE, KOWE, KPR, KERR
+ REAL PIFELD(KIWE), POFELD(KOWE)
+C
+C Local variables
+C
+ INTEGER JILON, JOLON, COUNT
+ REAL ZSUM
+C
+C Statement function
+C
+ REAL A, B
+ LOGICAL NOTEQ
+ NOTEQ(A,B) = (ABS((A)-(B)).GT.(ABS(A)*1E-3))
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialisation
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGPOLEG: Section 1.',JPQUIET)
+C
+ IGPOLEG = 0
+C
+ IF( KPR.GE.1 ) THEN
+ CALL INTLOG(JP_DEBUG,'IGPOLEG: No. of input fld longs. = ',KIWE)
+ CALL INTLOG(JP_DEBUG,'IGPOLEG: No.of output fld longs. = ',KOWE)
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Use average value for non-winds
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGPOLEG: Section 2.',JPQUIET)
+C
+ ZSUM = PPZERO
+ COUNT = 0
+C
+ IF( LIMISSV ) THEN
+ DO JILON = 1, KIWE
+ IF( NOTEQ(PIFELD(JILON),RMISSGV) ) THEN
+ ZSUM = ZSUM + PIFELD(JILON)
+ COUNT = COUNT + 1
+ ENDIF
+ ENDDO
+ ELSE
+ DO JILON = 1, KIWE
+ ZSUM = ZSUM + PIFELD(JILON)
+ COUNT = COUNT + 1
+ ENDDO
+ ENDIF
+C
+ IF( COUNT.GT.0 ) THEN
+ ZSUM = ZSUM / REAL(COUNT)
+ ELSE
+ ZSUM = RMISSGV
+ ENDIF
+C
+ DO JOLON = 1, KOWE
+ POFELD(JOLON) = ZSUM
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return to calling routine. Format statements
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGPOLEG: Section 9.',JPQUIET)
+C
+C
+ RETURN
+ END
diff --git a/interpolation/igpolew.F b/interpolation/igpolew.F
new file mode 100755
index 0000000..bf6e737
--- /dev/null
+++ b/interpolation/igpolew.F
@@ -0,0 +1,220 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGPOLEW(PIFELD, KIWE, POFELD, KOWE, KWEIND,
+ 1 KWEDIST, KPR, KERR)
+C
+C---->
+C**** *IGPOLEW*
+C
+C Purpose
+C -------
+C
+C Calculates the values at the pole of a regular
+C latitude/longitude wind field when the input is a Gaussian field.
+C
+C This routine is only used for a wind field.
+C
+C Interface
+C ---------
+C
+C IERR = IGPOLEW(PIFELD, KIWE, POFELD, KOWE, KWEIND, KWEDIST,
+C 1 KPR, KERR)
+C
+C Input parameters
+C ----------------
+C
+C PIFELD - A "polar" row of the input field provided by the
+C calling routine.
+C
+C KIWE - The number of points in the West-East direction in
+C the input field.
+C
+C KOWE - The number of points in the West-East direction in
+C the output field.
+C
+C KWEIND - This array contains the array offsets of the West
+C and East points in the input array required for
+C interpolation.
+C
+C KWEDIST - This array holds the distances to longitude values
+C in the input field from the associated longitude
+C values in the output field.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C -----------------
+C
+C POFELD - The corresponding "polar" row of the output field
+C returned to the calling routine.
+C
+C Return value
+C ------------
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C
+C None
+C
+C Common block usage
+C ------------------
+C
+C None
+C
+C Externals
+C ---------
+C
+C INTLOG(R) - Logs messages.
+C
+C Method
+C ------
+C
+C A Gaussian field does not have a line of latitude at the pole
+C so this routine performs a linear interpolation of points on the
+C nearest Gaussian line and then puts these values into the output
+C array. The intention is to provide U and V values at the pole
+C which have a "directional" value.
+C
+C This method was originally implemented by
+C
+C K. RIDER * ECMWF * OCTOBER 1991.
+C
+C Reference
+C ---------
+C
+C None
+C
+C Comments
+C --------
+C
+C Program contains sections 0 to 2 and 9
+C
+C Author
+C ------
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C Modifications
+C -------------
+C
+C Allow for missing data values
+C J.D.Chambers ECMWF August 2000
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+C
+C Function arguments
+C
+ INTEGER KIWE, KOWE, KPR, KERR
+ INTEGER KWEIND(2, KOWE), KWEDIST(2, KOWE)
+ REAL PIFELD(KIWE), POFELD(KOWE)
+C
+C Local variables
+C
+ INTEGER JOLON, COUNT
+ REAL ZLOW, ZHIGH
+C
+C Statement function
+C
+ REAL A, B
+ LOGICAL NOTEQ
+ NOTEQ(A,B) = (ABS((A)-(B)).GT.(ABS(A)*1E-3))
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialisation
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGPOLEW: Section 1.',JPQUIET)
+C
+ IGPOLEW = 0
+C
+ IF( KPR.GE.1 ) THEN
+ CALL INTLOG(JP_DEBUG,'IGPOLEW: No.input fld longs = ',KIWE)
+ CALL INTLOG(JP_DEBUG,'IGPOLEW: No.output fld longs = ',KOWE)
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Interpolation code for winds
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGPOLEW: Section 2.',JPQUIET)
+C
+ DO JOLON = 1, KOWE
+C
+C Compute weigths for west and east neighbours
+C
+ ZLOW = REAL(KWEDIST(JP_I_E,JOLON)) /
+ X REAL(KWEDIST(JP_I_E,JOLON) + KWEDIST(JP_I_W,JOLON) )
+C
+ ZHIGH = PPONE - ZLOW
+C
+C Count non-missing data values
+C
+ IF( LIMISSV ) THEN
+ COUNT = 0
+ IF( NOTEQ(PIFELD(KWEIND(JP_I_W,JOLON)),RMISSGV) )
+ X COUNT = COUNT + 1
+ IF( NOTEQ(PIFELD(KWEIND(JP_I_E,JOLON)),RMISSGV) )
+ X COUNT = COUNT + 1
+ ELSE
+ COUNT = 2
+ ENDIF
+C
+C Interpolate using both neighbours if neither is missing
+C
+ IF( COUNT.EQ.2 ) THEN
+ POFELD(JOLON) = ZLOW * PIFELD(KWEIND(JP_I_W,JOLON)) +
+ X ZHIGH * PIFELD(KWEIND(JP_I_E,JOLON))
+C
+C Set missing if all neighbours are missing
+C
+ ELSE IF( COUNT.EQ.0 ) THEN
+ POFELD(JOLON) = RMISSGV
+C
+C Otherwise, use the nearest neighbour
+C
+ ELSE IF( ZLOW.GT.ZHIGH ) THEN
+ POFELD(JOLON) = PIFELD(KWEIND(JP_I_W,JOLON))
+ ELSE
+ POFELD(JOLON) = PIFELD(KWEIND(JP_I_E,JOLON))
+ ENDIF
+C
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return to calling routine. Format statements
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGPOLEW: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/igprec.F b/interpolation/igprec.F
new file mode 100755
index 0000000..6cc47e8
--- /dev/null
+++ b/interpolation/igprec.F
@@ -0,0 +1,292 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGPREC (PIFELD, KIWE, KINS, POFELD, KOWE, KONS,
+ 1 KWEIND, KNSIND, PWFACT, PMAX, PINPNT, KPR, KERR)
+C
+C---->
+C**** *IGPREC*
+C
+C PURPOSE
+C _______
+C
+C Perform additional interpolation processes for precipitation
+C fields.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGPREC (PIFELD, KIWE, KINS, POFELD, KOWE, KONS, KWEIND,
+C 1 KNSIND, PWFACT, PMAX, PINPNT, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C PIFELD - The input field provided by the calling routine.
+C
+C KIWE - The number of points in the West-East direction in
+C the input field.
+C
+C KINS - The number of points in the North-South direction
+C in the input field.
+C
+C POFELD - The output field as previously calculated.
+C
+C KOWE - The number of points in the West-East direction in
+C the output field.
+C
+C KONS - The number of points in the North-South direction
+C in the output field.
+C
+C KWEIND - This array contains the array offsets of the West
+C and East points in the input array required for
+C interpolation.
+C
+C KNSIND - This array contains the array offsets of the North
+C and South points in the input array required for
+C interpolation.
+C
+C PWFACT - The array of interpolating weights to the four
+C neighbouring points for every output point.
+C
+C PMAX - Work array used to aid vectorisation.
+C
+C PINPNT - Work array used to aid vectorisation.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C POFELD - The output field as modified to allow for
+C precipitation.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C INTLOG(R) - Logs messages.
+C CHKPREC - Check if precipitation threshold has been redefined
+C
+C
+C METHOD
+C ______
+C
+C The precipitation at a point is set to zero in the following
+C circumstances.
+C
+C 1 The interpolated precipitation is less than a threshold value.
+C
+C 2 There is no precipitation at the neighbouring point with the
+C highest interpolating weight.
+C
+C NOTE that this operation is performed before the special
+C routines for the poles when interpolating from Gaussian grids
+C to global latitude/longitude fields. The polar values for
+C precipitation, during such interpolations, will always be the
+C average value of the nearest Gaussian line with no threshold
+C check.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 3 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+C
+C Dummy arguments
+ INTEGER KIWE, KOWE, KINS, KONS, KPR, KERR
+ INTEGER KWEIND (2, KOWE), KNSIND (2, KONS)
+ REAL PIFELD (KIWE, KINS), POFELD (KOWE, KONS)
+ REAL PWFACT (4, KOWE, KONS)
+ REAL PMAX (KOWE), PINPNT (KOWE)
+C
+C Local variables
+ LOGICAL LAT_RAIN
+ INTEGER ILAT, IDIR
+ INTEGER JOLAT, JOLON, JNS, JWE
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 22500)
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGPREC: Section 1.',JPQUIET)
+C
+ IGPREC = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_ERROR,'IGPREC: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'IGPREC: No.input fld longitudes = ',KIWE)
+ CALL INTLOG(JP_ERROR,'IGPREC: No.input fld latitudes = ',KINS)
+ CALL INTLOG(JP_ERROR,'IGPREC: No.output fld longitudes = ',KOWE)
+ CALL INTLOG(JP_ERROR,'IGPREC: No.output fld latitudes = ',KONS)
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. eliminate output precipitation based on
+C interpolation threshhold
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGPREC: Section 2.',JPQUIET)
+C
+ CALL CHKPREC()
+C
+ DO 360 JOLAT = 1, KONS
+C
+ LAT_RAIN = .FALSE.
+C
+ DO 210 JOLON = 1, KOWE
+C
+ IF (POFELD (JOLON, JOLAT) .LT. ZPRECIP) THEN
+ POFELD (JOLON, JOLAT) = PPZERO
+ ELSE
+ LAT_RAIN = .TRUE.
+ ENDIF
+C
+ 210 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 3. eliminate output precipitation based on
+C "nearest" point.
+C
+C Do not bother if there is no precipitation on this
+C line of latitude
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF ((KPR.GE.1).AND.(JOLAT.EQ.1)) CALL INTLOG(JP_DEBUG,
+ X 'IGPREC: Section 3.',JPQUIET)
+C
+ IF (LAT_RAIN) THEN
+C
+ DO 310 JOLON = 1, KOWE
+C
+ PMAX (JOLON) = PPZERO
+C
+ 310 CONTINUE
+C
+ DO 340 JNS = 1, 2
+C
+ ILAT = KNSIND (JNS, JOLAT)
+C
+ DO 330 JWE = 1, 2
+C
+ IDIR = (JNS - 1) * 2 + JWE
+C
+ DO 320 JOLON = 1, KOWE
+C
+ IF (PWFACT(IDIR, JOLON, JOLAT) .GT. PMAX(JOLON)) THEN
+ PMAX (JOLON) = PWFACT (IDIR, JOLON, JOLAT)
+ PINPNT (JOLON) = PIFELD (KWEIND (JWE, JOLON), ILAT)
+ ENDIF
+C
+ 320 CONTINUE
+C
+ 330 CONTINUE
+C
+ 340 CONTINUE
+C
+ DO 350 JOLON = 1, KOWE
+ IF (PINPNT(JOLON).LT.ZPRECIP) POFELD(JOLON,JOLAT) = PPZERO
+ 350 CONTINUE
+C
+ ENDIF
+C
+ 360 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGPREC: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/igscan.F b/interpolation/igscan.F
new file mode 100755
index 0000000..601dfe3
--- /dev/null
+++ b/interpolation/igscan.F
@@ -0,0 +1,359 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGSCAN (PMAT, KNWE, KNNS, KSCAN, OINFIELD,
+ 1 KPR, KERR)
+C
+C---->
+C**** *IGSCAN*
+C
+C PURPOSE
+C _______
+C
+C Transform a regular field between the specified external
+C scanning mode and a standard internal scanning mode.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGSCAN (PMAT, KNWE, KNNS, KSCAN, OINFIELD, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C PMAT - The input matrix of dimension (KNWE * KNNS).
+C
+C KNWE - The number of points in the West-East direction.
+C
+C KNNS - The number of points in the North-South direction.
+C
+C KSCAN - A standard GRIB byte variable with bits 1 to 3
+C separately significant. This means that the final
+C value is the sum of the bit settings.
+C
+C 128 , Set if points scan East to West.
+C 64 , Set if points scan South to North.
+C 32 , Set if points in the North South direction
+C are consecutive.
+C
+C OINFIELD - Flag variable which is TRUE for an input field and
+C FALSE for an output field.
+C This determines the order in which the
+C transformations are applied.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C PMAT - The transposed matrix.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C 7101 The scanning mode was not in the range 0 to 255.
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C ABORTX - Standard routine to kill task.
+C IGTRAN - Routine to transpose a rectangular matrix.
+C IGLREV - Routine to reverse the elements within each row or
+C each column of a rectangular matrix.
+C INTLOG - Logs messages.
+C
+C METHOD
+C ______
+C
+C KSCAN = 128 is implemented by swapping elements within each
+C column of the matrix.
+C
+C KSCAN = 64 is implemented by reversing the order of the columns.
+C
+C KSCAN = 32 is implemented by transposing the matrix.
+C
+C An input matrix is transposed before the two reversal stages
+C are performed.
+C
+C An output matrix has the matrix transposition as the final step.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 3 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Jan 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Dummy arguments
+C
+ LOGICAL OINFIELD
+C
+ INTEGER KNWE, KNNS, KSCAN, KPR, KERR
+C
+ REAL PMAT (KNWE * KNNS)
+C
+C Local variables
+C
+ LOGICAL GNSMOD, GWEMOD, GTRMOD
+C
+ INTEGER ISCAN, IDIR, IERR
+C
+ INTEGER JPMOVE
+ PARAMETER (JPMOVE = (JPLAT + JPLONG) / 2)
+C
+ INTEGER IMOVE (JPMOVE)
+C
+ INTEGER JPROUTINE
+C
+ PARAMETER (JPROUTINE = 7100)
+C
+C External functions
+C
+ INTEGER IGTRAN, IGLREV
+C
+C _______________________________________________________
+C
+C
+C* Section 1. Initialisation - Evaluate scan modes
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IGSCAN: Section 1.',JPQUIET)
+C
+ IGSCAN = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IGSCAN: Input parameters',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGSCAN: Longitude points are ',KNWE)
+ CALL INTLOG(JP_DEBUG,'IGSCAN: Latitude lines are ',KNNS)
+ CALL INTLOG(JP_DEBUG,'IGSCAN: Scan mode is ',KSCAN)
+ IF ( OINFIELD ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'IGSCAN: Input field transformation is TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'IGSCAN: Input field transformation is FALSE',JPQUIET)
+ ENDIF
+ ENDIF
+C
+ IF (KSCAN .LT. 0 .OR. KSCAN .GE. 256) THEN
+ IGSCAN = JPROUTINE + 1
+ IF (KERR .GE. 0) CALL INTLOG(JP_ERROR,
+ X 'IGSCAN: Scan mode is not in range 0 to 255 = ',KSCAN)
+ IF (KERR .EQ. 0) CALL INTLOG(JP_FATAL,
+ X 'IGSCAN: Interpolation fails.',IGSCAN)
+ GO TO 900
+ ENDIF
+C
+C Zero KSCAN means no transformation
+C
+ IF (KSCAN .EQ. 0) GO TO 900
+C
+ ISCAN = KSCAN
+ GWEMOD = .FALSE.
+ GNSMOD = .FALSE.
+C
+ IF (ISCAN .GE. 128) THEN
+ ISCAN = ISCAN - 128
+ GWEMOD = .TRUE.
+ ENDIF
+C
+ IF (ISCAN .GE. 64) THEN
+ ISCAN = ISCAN - 64
+ GNSMOD = .TRUE.
+ ENDIF
+C
+ GTRMOD = ISCAN .GE. 32
+C
+C _______________________________________________________
+C
+C* Section 2. Input field
+C
+C Potential operations in order are
+C
+C 1 Transpose matrix
+C 2 Modify West East mode
+C 3 Modify North South mode
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IGSCAN: Section 2.',JPQUIET)
+C
+ IF (OINFIELD) THEN
+C
+ IF (GTRMOD) THEN
+C
+ IERR = IGTRAN (PMAT, KNNS, KNWE, IMOVE, JPMOVE, KPR, KERR)
+C
+ IF (IERR .NE. 0) THEN
+ IGSCAN = IERR
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ IF (GWEMOD) THEN
+C
+ IDIR = 1
+C
+ IERR = IGLREV (PMAT, KNWE, KNNS, IDIR, KPR, KERR)
+C
+ IF (IERR .NE. 0) THEN
+ IGSCAN = IERR
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ IF (GNSMOD) THEN
+C
+ IDIR = 2
+C
+ IERR = IGLREV (PMAT, KNWE, KNNS, IDIR, KPR, KERR)
+C
+ IF (IERR .NE. 0) THEN
+ IGSCAN = IERR
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ ELSE
+C
+C _______________________________________________________
+C
+C* Section 3. Output field
+C
+C Potential operations in order are
+C
+C 1 Modify West East mode
+C 2 Modify North South mode
+C 3 Transpose matrix
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IGSCAN: Section 3.',JPQUIET)
+C
+ IF (GWEMOD) THEN
+C
+ IDIR = 1
+C
+ IERR = IGLREV (PMAT, KNWE, KNNS, IDIR, KPR, KERR)
+C
+ IF (IERR .NE. 0) THEN
+ IGSCAN = IERR
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ IF (GNSMOD) THEN
+C
+ IDIR = 2
+C
+ IERR = IGLREV (PMAT, KNWE, KNNS, IDIR, KPR, KERR)
+C
+ IF (IERR .NE. 0) THEN
+ IGSCAN = IERR
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ IF (GTRMOD) THEN
+C
+ IERR = IGTRAN (PMAT, KNWE, KNNS, IMOVE, JPMOVE, KPR, KERR)
+C
+ IF (IERR .NE. 0) THEN
+ IGSCAN = IERR
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IGSCAN: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/igsetup.F b/interpolation/igsetup.F
new file mode 100755
index 0000000..5be9b6a
--- /dev/null
+++ b/interpolation/igsetup.F
@@ -0,0 +1,630 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGSETUP( KSEC1, KSEC2, KSEC4)
+C
+C---->
+C**** IGSETUP
+C
+C Purpose
+C -------
+C
+C Setup GRIB sections 1, 2 and 4 for the new interpolation product.
+C
+C
+C Interface
+C ---------
+C
+C IRET IGSETUP( KSEC1, KSEC2, KSEC4)
+C
+C Input
+C -----
+C
+C KSEC1 - Section 1 values (for GRIBEX)
+C KSEC2 - Section 2 values (for GRIBEX)
+C KSEC3 - Section 4 values (for GRIBEX)
+C
+C Output
+C ------
+C
+C KSEC1 - Modified section 1 values (for GRIBEX)
+C KSEC2 - Modified section 2 values (for GRIBEX)
+C KSEC3 - Modified section 4 values (for GRIBEX)
+C
+C Method
+C ------
+C
+C Use common block values and existing values from the original GRIB
+C product used for interpolation.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Logs messages.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Aug 1994
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Parameter(s)
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 19100 )
+C
+C Function arguments
+C
+ INTEGER KSEC1, KSEC2, KSEC4
+ DIMENSION KSEC1(*), KSEC2(*), KSEC4(*)
+C
+C Local variables
+C
+ LOGICAL LIROTAT, LOROTAT
+ INTEGER ILOOP, ITEMP
+C
+C***********************************************************************
+C Section 1. Startup.
+C***********************************************************************
+C
+ 100 CONTINUE
+C
+ IGSETUP = 0
+C
+C Check a recognized data representation type is being processed
+C
+ IF ( (NOREPR .NE.JPREGULAR ) .AND.
+ X (NOREPR .NE.JPREGROT ) .AND.
+ X (NOREPR .NE.JPGAUSSIAN ) .AND.
+ X (NOREPR .NE.JPFGGROT ) .AND.
+ X (NOREPR .NE.JPQUASI ) .AND.
+ X (NOREPR .NE.JPQGGROT ) .AND.
+ X (NOREPR .NE.JPSPHROT ) .AND.
+ X (NOREPR .NE.JPSPHERE ) ) GOTO 910
+C
+C Set flags if input is rotated or if a rotation angle has been given
+C
+ LIROTAT = (NIREPR.EQ.JPSPHROT).OR.
+ X (NIREPR.EQ.JPREGROT).OR.
+ X (NIREPR.EQ.JPFGGROT).OR.
+ X (NIREPR.EQ.JPQGGROT)
+C
+ LOROTAT = ((NOROTA(1).NE.-9000000).AND.(NOROTA(1).NE.0)).OR.
+ X (NOROTA(2).NE.0)
+C
+C***********************************************************************
+C Section 2. Setup output product section 1.
+C***********************************************************************
+C
+ 200 CONTINUE
+C
+C Setup output if not given by input GRIB message
+C (ie input is 'unpacked').
+C
+ IF ( NIFORM .NE. 1 ) THEN
+C
+C Code table ( same as input )
+C
+ KSEC1(1) = NOTABLE
+C
+C Originating centre = ECMWF
+C
+ KSEC1(2) = 98
+C
+C Generating process ID = 255
+C Grid definition = 255
+C
+ KSEC1(3) = 255
+ KSEC1(4) = 255
+C
+C Parameter
+C
+ KSEC1(6) = NOPARAM
+C
+C Level
+C
+ KSEC1(7) = NOLEVT
+ KSEC1(8) = NOLEVEL
+ KSEC1(9) = 0
+C
+C Dummy date and time ( 1 Jan 1990, 1200 )
+C
+ KSEC1(10) = 90
+ KSEC1(11) = 1
+ KSEC1(12) = 1
+ KSEC1(13) = 12
+ KSEC1(14) = 0
+C
+C Dummy verifying time (initialised analysis)
+C
+ KSEC1(15) = 1
+ KSEC1(16) = 0
+ KSEC1(17) = 0
+ KSEC1(18) = 1
+ KSEC1(19) = 0
+ KSEC1(20) = 0
+C
+C Century ( = 20 )
+C
+ KSEC1(21) = 20
+C
+C Lots of zeroes
+C
+ DO 210 ILOOP = 22, 36
+ KSEC1(ILOOP) = 0
+ 210 CONTINUE
+C
+C Allow for user specified output field values when input is packed
+C
+ ELSE
+C
+C Code table
+C
+ KSEC1(1) = NOTABLE
+C
+C Parameter
+C
+ IF( LNOPARA ) KSEC1(6) = NOPARAM
+C
+C Level
+C
+ IF( LNOLEVT ) KSEC1(7) = NOLEVT
+ IF( LNOLEVL ) THEN
+ KSEC1(8) = NOLEVEL
+ KSEC1(9) = 0
+ ENDIF
+ ENDIF
+C
+C Section 2 included, section 3 omitted
+C
+ KSEC1(5) = 128
+C
+C Rest of section 1 kept unchanged from input product
+C
+C***********************************************************************
+C Section 3. Setup output product section 2.
+C***********************************************************************
+C
+ 300 CONTINUE
+C
+C Data representation type
+C
+C Adjust output representation type if field is rotated
+C
+ IF( LIROTAT.OR.LOROTAT ) THEN
+ KSEC2(1) = NOREPR
+ IF(NOREPR.EQ.JPREGULAR ) KSEC2(1) = JPREGROT
+ IF(NOREPR.EQ.JPSPHERE ) KSEC2(1) = JPSPHROT
+ IF(NOREPR.EQ.JPQUASI ) KSEC2(1) = JPFGGROT
+ IF(NOREPR.EQ.JPQGGROT ) KSEC2(1) = JPFGGROT
+ IF(NOREPR.EQ.JPGAUSSIAN ) KSEC2(1) = JPFGGROT
+C
+ ELSE
+C
+ IF( (NOREPR.EQ.JPQUASI).OR.(NOREPR.EQ.JPQGGROT) ) THEN
+ KSEC2(1) = JPGAUSSIAN
+ ELSE
+ KSEC2(1) = NOREPR
+ ENDIF
+ ENDIF
+C
+C***********************************************************************
+C Section 3.1. Setup section 2 for lat/long, equidistant
+C cylindrical or plate carre grids.
+C***********************************************************************
+C
+ 310 CONTINUE
+C
+ IF ( (NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT) ) THEN
+C
+C For south to north grids, only global area allowed (eg KWBC SST)
+C
+cs IF( KSEC2(4).LT.KSEC2(7) ) THEN
+cs IF((NOAREA(1).NE.(-NOAREA(3))).AND.(NOAREA(3).NE.JP90)) THEN
+cs CALL INTLOG(JP_ERROR,
+cs X 'IGSETUP: Subareas not allowed interpolating',JPQUIET)
+cs CALL INTLOG(JP_ERROR,
+cs X 'IGSETUP: grids running from south to north',JPQUIET)
+cs IGSETUP = JPROUTINE + 2
+cs GOTO 900
+cs ENDIF
+cs ENDIF
+
+C
+C Number of points along a parallel
+C
+ KSEC2(2) = NOWE
+C
+C Number of points along a meridian
+C
+ KSEC2(3) = NONS
+C
+C Latitude and longitude of first grid point
+C
+ IF( NOAREA(1).GE.0 ) THEN
+ KSEC2(4) = (NOAREA(1)+(JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(4) = (NOAREA(1)-(JPMICRO/2)) / JPMICRO
+ ENDIF
+ IF( NOAREA(2).GE.0 ) THEN
+ KSEC2(5) = (NOAREA(2)+(JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(5) = (NOAREA(2)-(JPMICRO/2)) / JPMICRO
+ ENDIF
+C
+C Resolution flag, increments are given
+C
+ KSEC2(6) = 128
+C
+C Latitude and longitude of last grid point
+C
+ IF( NOAREA(3).GE.0 ) THEN
+ KSEC2(7) = (NOAREA(3)+(JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(7) = (NOAREA(3)-(JPMICRO/2)) / JPMICRO
+ ENDIF
+ IF( NOAREA(4).GE.0 ) THEN
+ KSEC2(8) = (NOAREA(4)+(JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(8) = (NOAREA(4)-(JPMICRO/2)) / JPMICRO
+ ENDIF
+C
+C Flip latitudes if they run from south to north
+C Set scanning mode flags
+C
+ IF( KSEC2(4).LT.KSEC2(7) ) THEN
+ IF( LNOGRID ) THEN
+ ITEMP = KSEC2(7)
+ KSEC2(7) = KSEC2(4)
+ KSEC2(4) = ITEMP
+ KSEC2(11) = 0
+ ELSE
+ KSEC2(11) = 64
+ ENDIF
+ ELSE
+ KSEC2(11) = NOSCNM
+ ENDIF
+C
+C i and j direction increments
+C
+ KSEC2(9) = (NOGRID(1) + (JPMICRO/2)) / JPMICRO
+ KSEC2(10) = (NOGRID(2) + (JPMICRO/2)) / JPMICRO
+C
+C Following left same as for input product
+C - no.of vertical coordinate parameters,
+C - lat/long of southern pole of rotation
+C - lat/long of pole of stretching
+C
+C If rotated, put in new lat/long of southern pole of rotation
+C
+ IF( LIROTAT.OR.LOROTAT ) THEN
+ IF( NOROTA(1).GE.0 ) THEN
+ KSEC2(13) = (NOROTA(1) + (JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(13) = (NOROTA(1) - (JPMICRO/2)) / JPMICRO
+ ENDIF
+ IF( NOROTA(2).GE.0 ) THEN
+ KSEC2(14) = (NOROTA(2) + (JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(14) = (NOROTA(2) - (JPMICRO/2)) / JPMICRO
+ ENDIF
+ ENDIF
+C
+C Regular grid flag
+C
+ KSEC2(17) = 0
+C
+C Following left same as for input product
+C - earth flag
+C - components flag
+C - reserved fields
+C
+ ENDIF
+C
+C***********************************************************************
+C Section 3.2. Setup section 2 for gaussian grids.
+C***********************************************************************
+C
+ 320 CONTINUE
+C
+ IF ( (NOREPR.EQ.JPGAUSSIAN).OR.
+ X (NOREPR.EQ.JPFGGROT).OR.
+ X (NOREPR.EQ.JPQUASI).OR.
+ X (NOREPR.EQ.JPQGGROT) ) THEN
+C
+C Number of points along a parallel
+C
+C For a regular gaussian grid only
+ IF( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPFGGROT) ) THEN
+ KSEC2(2) = NOWE
+ ELSE
+ KSEC2(2) = 0
+ ENDIF
+C
+C Number of points along a meridian
+C
+ KSEC2(3) = NONS
+C
+C Latitude and longitude of first grid point
+C
+ IF( NOAREA(1).GE.0 ) THEN
+ KSEC2(4) = (NOAREA(1)+(JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(4) = (NOAREA(1)-(JPMICRO/2)) / JPMICRO
+ ENDIF
+ IF( NOAREA(2).GE.0 ) THEN
+ KSEC2(5) = (NOAREA(2)+(JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(5) = (NOAREA(2)-(JPMICRO/2)) / JPMICRO
+ ENDIF
+C
+C Resolution flag
+C
+C For a regular gaussian grid only, increments are given
+C
+ IF( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPFGGROT) ) THEN
+ KSEC2(6) = 128
+ ELSE
+ KSEC2(6) = 0
+ ENDIF
+C
+C Latitude and longitude of last grid point
+C
+ IF( NOAREA(3).GE.0 ) THEN
+ KSEC2(7) = (NOAREA(3)+(JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(7) = (NOAREA(3)-(JPMICRO/2)) / JPMICRO
+ ENDIF
+ IF( NOAREA(4).GE.0 ) THEN
+ KSEC2(8) = (NOAREA(4)+(JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(8) = (NOAREA(4)-(JPMICRO/2)) / JPMICRO
+ ENDIF
+C
+C i direction increment
+C
+C For a regular gaussian grid, only
+C
+ IF( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPFGGROT) ) THEN
+ KSEC2(9) = (((JP90)/NOGAUSS)+(JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(9) = 0
+ ENDIF
+C
+C Number of parallels between a pole and the Equator
+C
+ KSEC2(10) = NOGAUSS
+C
+C Scanning mode flags
+C
+ KSEC2(11) = NOSCNM
+C
+C Following left same as for input product
+C - no.of vertical coordinate parameters,
+C - lat/long of southern pole of rotation
+C - lat/long of pole of stretching
+C
+C If rotated, put in new lat/long of southern pole of rotation
+C
+ IF( LIROTAT.OR.LOROTAT ) THEN
+ IF( NOROTA(1).GE.0 ) THEN
+ KSEC2(13) = (NOROTA(1) + (JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(13) = (NOROTA(1) - (JPMICRO/2)) / JPMICRO
+ ENDIF
+ IF( NOROTA(2).GE.0 ) THEN
+ KSEC2(14) = (NOROTA(2) + (JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(14) = (NOROTA(2) - (JPMICRO/2)) / JPMICRO
+ ENDIF
+ ENDIF
+C
+C Regular grid flag
+C
+ IF( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPFGGROT) ) THEN
+ KSEC2(17) = 0
+ ELSE
+ KSEC2(17) = 1
+ ENDIF
+C
+C Following left same as for input product
+C - earth flag
+C - components flag
+C - reserved fields
+C
+C For reduced grid, move in number of points along each parallel
+C
+ IF( (NOREPR.EQ.JPQUASI) .OR.
+ X (NOREPR.EQ.JPQGGROT) ) THEN
+ DO 325 ILOOP = 1, KSEC2(3)
+ KSEC2(22+ILOOP) = NOLPTS(ILOOP+NO1NS-1)
+ 325 CONTINUE
+ ENDIF
+C
+ ENDIF
+C
+C***********************************************************************
+C Section 3.3. Setup section 2 for spherical harmonic coefficients.
+C***********************************************************************
+C
+ 330 CONTINUE
+C
+ IF ( (NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT) ) THEN
+C
+C I, K, M pentagonal resolution parameters
+C
+ KSEC2(2) = NORESO
+ KSEC2(3) = NORESO
+ KSEC2(4) = NORESO
+C
+C Representation type, associated legendre functions of the
+C first kind
+ KSEC2(5) = 1
+C
+C Representation mode, complex packing
+C
+ KSEC2(6) = 2
+C
+C Following left same as for input product
+C - reserved words 7-11
+C - no.of vertical coordinate parameters,
+C - lat/long of southern pole of rotation
+C - lat/long of pole of stretching
+C - reserved words 17-22
+C
+C If rotated, put in new lat/long of southern pole of rotation
+C
+ IF( LIROTAT.OR.LOROTAT ) THEN
+ IF( NOROTA(1).GE.0 ) THEN
+ KSEC2(13) = (NOROTA(1) + (JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(13) = (NOROTA(1) - (JPMICRO/2)) / JPMICRO
+ ENDIF
+ IF( NOROTA(2).GE.0 ) THEN
+ KSEC2(14) = (NOROTA(2) + (JPMICRO/2)) / JPMICRO
+ ELSE
+ KSEC2(14) = (NOROTA(2) - (JPMICRO/2)) / JPMICRO
+ ENDIF
+ ENDIF
+ ENDIF
+C
+C***********************************************************************
+C Section 4. Setup output product section 4.
+C***********************************************************************
+C
+ 400 CONTINUE
+C
+C Number of values to be packed
+C
+ IF ( (NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT) ) THEN
+ KSEC4(1) = (NORESO + 1) * (NORESO + 2)
+ ELSE IF( (NOREPR.EQ.JPQUASI).OR.(NOREPR.EQ.JPQGGROT) ) THEN
+ KSEC4(1) = NOPCNT
+ ELSE
+ KSEC4(1) = NOWE * NONS
+ ENDIF
+C
+C If all the values are missing, set the count of values negative
+C
+ IF(NOMISS.NE.0) THEN
+ KSEC4(1) = -KSEC4(1)
+ ENDIF
+C
+C Number of bits used for each packed value
+C
+ KSEC4(2) = NOACC
+C
+C Type of data, spherical harmonic = 128, grid point = 0
+C
+ IF ( (NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT) ) THEN
+ KSEC4(3) = 128
+ ELSE
+ KSEC4(3) = 0
+ ENDIF
+C
+C Type of packing, spherical harmonic = complex
+C
+ IF ( (NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT) ) THEN
+ KSEC4(4) = 64
+ ELSE
+ KSEC4(4) = 0
+ ENDIF
+C
+C Type of data = floating point
+C
+ KSEC4(5) = 0
+C
+C Additional flags indicator = none
+C
+ KSEC4(6) = 0
+C
+C Reserved word, set to 0
+C
+ KSEC4(7) = 0
+C
+C Following set to simplest case
+C - no.of values indicator
+C - secondary bitmaps indicator
+C - values width indicator
+C - no.of bits for 2nd order values
+C
+ KSEC4(8) = 0
+ KSEC4(9) = 0
+ KSEC4(10) = 0
+ KSEC4(11) = 0
+C
+C Reserved words, set to 0
+C
+ KSEC4(12) = 0
+ KSEC4(13) = 0
+ KSEC4(14) = 0
+ KSEC4(15) = 0
+C
+C If spherical harmonics, set following for complex packing
+C
+ IF ( (NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT) ) THEN
+C
+C KSEC4(16), pointer to start of packed data, setup by packing
+C KSEC4(17), scaling factor P, unchanged from input
+C KSEC4(18), pentagonal resolution parameter J for packing of subset,
+C unchanged from input
+C KSEC4(19), pentagonal resolution parameter K for packing of subset,
+C unchanged from input
+C KSEC4(20), pentagonal resolution parameter M for packing of subset,
+C unchanged from input
+C
+ ELSE
+ DO 410 ILOOP = 16, 20
+ KSEC4(ILOOP) = 0
+ 410 CONTINUE
+ ENDIF
+C
+C Words 21-33 reserved, set to zero.
+C
+ DO 420 ILOOP = 21, 33
+ KSEC4(ILOOP) = 0
+ 420 CONTINUE
+C
+C***********************************************************************
+C Section 9. Closedown
+C***********************************************************************
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+C Invalid data represntation type
+C
+ 910 CONTINUE
+ CALL INTLOG(JP_ERROR,
+ X 'IGSETUP: Data representation type not recognized: ',NOREPR)
+ CALL INTLOG(JP_ERROR,
+ X 'IGSETUP: Only the following types are recognized:',JPQUIET)
+ CALL INTLOG(JP_ERROR,'IGSETUP: Lat/long grid = ', JPREGULAR)
+ CALL INTLOG(JP_ERROR,'IGSETUP: Lat/long (rotated) = ', JPREGROT)
+ CALL INTLOG(JP_ERROR,'IGSETUP: regular gaussian = ', JPGAUSSIAN)
+ CALL INTLOG(JP_ERROR,'IGSETUP: reg gauss rotated = ', JPFGGROT)
+ CALL INTLOG(JP_ERROR,'IGSETUP: reduced gaussian = ', JPQUASI)
+ CALL INTLOG(JP_ERROR,'IGSETUP: red gauss rotated = ', JPQUASI)
+ CALL INTLOG(JP_ERROR,'IGSETUP: spherical harmonic = ', JPSPHERE)
+ CALL INTLOG(JP_ERROR,'IGSETUP: spectral (rotated) = ', JPSPHROT)
+C
+ IGSETUP = JPROUTINE + 1
+ RETURN
+ END
diff --git a/interpolation/igsize.F b/interpolation/igsize.F
new file mode 100755
index 0000000..9700e00
--- /dev/null
+++ b/interpolation/igsize.F
@@ -0,0 +1,408 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGSIZE(KGTRUNC, KAREA, KNWE, KNNS, KLN,
+ X PGAUSS, OWEGLOBE, ONPOLE, OSPOLE, KPR, KERR)
+C
+C---->
+C**** *IGSIZE*
+C
+C Purpose
+C -------
+C Evaluate the array sizes for a Gaussian truncation and area.
+C
+C
+C Interface
+C ---------
+C IERR = IGSIZE(KGTRUNC, KAREA, KNWE, KNNS, KLN,
+C X PGAUSS, OWEGLOBE, ONPOLE, OSPOLE, KPR, KERR)
+C
+C
+C Input parameters
+C ----------------
+C KGTRUNC - The Gaussian truncation.
+C KAREA - The field area definition (N, W, S, E) provided by
+C the calling routine.
+C KNWE - The number of points in the West-East direction in
+C the field. This will be zero for an output field.
+C KNNS - The number of points in the North-South direction
+C in the field. This will be zero for an output field.
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C
+C Output parameters
+C -----------------
+C KAREA - The North and South values will be modified to
+C contain the values of the Gaussian latitudes used.
+C KNWE - The number of points in the West-East direction in
+C the field.
+C KNNS - The number of points in the North-South direction
+C in the field.
+C KLN - The Northern Gaussian latitude number for this area.
+C PGAUSS - The full list of Gaussian latitudes for this
+C truncation.
+C OWEGLOBE - This variable will be true if the array of
+C longitudes spans the globe.
+C ONPOLE - This variable will be true if the North polar line
+C of latitude is included in the grid.
+C OSPOLE - This variable will be true if the South polar line
+C of latitude is included in the grid.
+C
+C
+C Return value
+C ------------
+C The error indicator (INTEGER).
+C
+C
+C Error and Warning Return Values
+C -------------------------------
+C -1 The Eastern limit of the range did not have the expected
+C value. The Western value will be assumed to be correct. This
+C could arise because of known deficiencies in the GRIB
+C representation and will be treated as a WARNING error.
+C
+C 22501 The specified number of lines of latitude did not match
+C the Gaussian lines nearest the North and South values
+C provided.
+C
+C
+C Common block usage
+C ------------------
+C None
+C
+C
+C Externals
+C ---------
+C IGGLAT - Compute Gaussian lines of latitude for a given
+C truncation.
+C INTLOG(R) - Logs messages.
+C
+C
+C Method
+C ------
+C If all the elements of the array KAREA are zero then a standard
+C global grid is generated and all elements of the array KAREA are
+C rewritten with the appropriate values. Otherwise it is assumed
+C that the West and East limits in KAREA have been validated. If
+C the number of longitude points is provided a warning will be
+C given if the West to East range does not match the number of
+C longitude points times the stride.
+C
+C If the number of lines of longitude and latitude are not set on
+C entry then the North and South limits in KAREA will be expanded
+C outward to the next Gaussian latitudes. If the number of lines
+C of longitude and latitude are set on entry then the nearest
+C points to the North and South limits provided are chosen. It is
+C an error if these points do not provide the correct number of
+C latitudes. The revised North and South limits are written back
+C into the array KAREA.
+C
+C
+C Reference
+C ---------
+C None
+C
+C
+C Comments
+C --------
+C None
+C
+C
+C Author
+C ------
+C K. Fielding *ECMWF* Oct 1993
+C
+C
+C Modifications
+C -------------
+C Allow for unusual NCEP gaussian grids
+C J.D.Chambers ECMWF October 2000
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER(JPROUTINE = 22500)
+C
+C Function arguments
+C
+ LOGICAL OWEGLOBE, ONPOLE, OSPOLE
+ INTEGER KGTRUNC, KNWE, KNNS, KLN, KPR, KERR, KAREA(4)
+ REAL PGAUSS(*)
+C
+C Local variables
+C
+ INTEGER ILNSTR, IEAST, IWEST, IREACH, ILATNUM, IGAUSS
+ INTEGER INDIST, ISDIST, ILS, IERR, JLAT
+ LOGICAL LPRINT
+C
+C Function externals
+C
+ INTEGER IGGLAT
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialisation
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IGSIZE = 0
+ LPRINT = KPR.GE.1
+C
+ IF( LPRINT ) THEN
+ CALL INTLOG(JP_DEBUG,'IGSIZE: Section 1.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGSIZE: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGSIZE: Gaussian truncation = ',KGTRUNC)
+ CALL INTLOG(JP_DEBUG,'IGSIZE: No.long pts = ',KNWE)
+ CALL INTLOG(JP_DEBUG,'IGSIZE: No.lat. pts = ',KNNS)
+ CALL INTLOG(JP_DEBUG,'IGSIZE: Area North = ',KAREA(1))
+ CALL INTLOG(JP_DEBUG,'IGSIZE: Area West = ',KAREA(2))
+ CALL INTLOG(JP_DEBUG,'IGSIZE: Area South = ',KAREA(3))
+ CALL INTLOG(JP_DEBUG,'IGSIZE: Area East = ',KAREA(4))
+ ENDIF
+C
+ ILNSTR = JP90 / KGTRUNC
+ ILATNUM = KGTRUNC * 2
+C
+C -----------------------------------------------------------------|
+C* Section 2. If all elements of KAREA are missing generate
+C a global field
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( LPRINT ) CALL INTLOG(JP_DEBUG,'IGSIZE: Section 2.',JPQUIET)
+C
+ IF( (KAREA(JPEAST).EQ.0) .AND.
+ X (KAREA(JPWEST).EQ.0) .AND.
+ X (KAREA(JPNORTH).EQ.0).AND.
+ X (KAREA(JPSOUTH).EQ.0) ) THEN
+C
+ KAREA(JPNORTH) = JP90
+ KAREA(JPWEST) = 0
+ KAREA(JPSOUTH) = - JP90
+ KAREA(JPEAST) = JP360 - ILNSTR
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Generate points around a line of latitude.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( LPRINT ) CALL INTLOG(JP_DEBUG,'IGSIZE: Section 3.',JPQUIET)
+C
+C Force both KAREA(JPWEST) and KAREA(JPEAST) into standard
+C range (0 to JP360)
+C
+ IF( KAREA(JPWEST).LT.0 ) KAREA(JPWEST) = KAREA(JPWEST) + JP360
+ IF( KAREA(JPEAST).LT.0 ) KAREA(JPEAST) = KAREA(JPEAST) + JP360
+C
+C Standardise range so that EAST > WEST
+C
+ IEAST = KAREA(JPEAST)
+ IWEST = KAREA(JPWEST)
+C
+ IF( IEAST.LT.IWEST ) THEN
+ IF( IEAST.LT.0 ) THEN
+ IEAST = IEAST + JP360
+ KAREA(JPEAST) = IEAST
+ ELSE
+ IWEST = IWEST - JP360
+ KAREA(JPWEST) = IWEST
+ ENDIF
+ ENDIF
+C
+ IF( KNWE.EQ.0 ) THEN
+C
+C Is it a global grid ?
+C
+ IREACH = IEAST - IWEST + ILNSTR
+ OWEGLOBE = IREACH.GE.JP360
+C
+C Number of points along line is
+C
+ KNWE = NINT( FLOAT(IREACH) / FLOAT(ILNSTR) )
+C
+ ELSE
+C
+C Number of points is set (input field)
+C
+ IF( (IWEST + (KNWE - 1)*ILNSTR).NE.IEAST ) THEN
+C
+C Warn of possible mismatch
+C
+ IGSIZE = - 1
+ CALL INTLOG(JP_WARN,
+ X 'IGSIZE: West-East range does not match the',JPQUIET)
+ CALL INTLOG(JP_WARN,
+ X 'IGSIZE: number of points and the stride.',JPQUIET)
+ CALL INTLOGR(JP_WARN,
+ X 'IGSIZE: West = ',REAL(KAREA(JPWEST))/PPMULT)
+ CALL INTLOGR(JP_WARN,
+ X 'IGSIZE: East = ',REAL(KAREA(JPEAST))/PPMULT)
+ CALL INTLOG(JP_WARN,'IGSIZE: No. of points = ',KNWE)
+ CALL INTLOGR(JP_WARN,'IGSIZE: Stride = ',REAL(ILNSTR)/PPMULT)
+ ENDIF
+C
+C NCEP products for DEMETER are pseudo gaussian
+C (regular N48 in longitude direction, N47 in latitude direction)
+C
+ OWEGLOBE = KNWE.GE.(KGTRUNC*4)
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4. Generate points along a line of meridian
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ IF( LPRINT ) CALL INTLOG(JP_DEBUG,'IGSIZE: Section 4.',JPQUIET)
+C
+C Generate full Gaussian latitudes for this truncation
+C
+ IERR = IGGLAT(ILATNUM, PGAUSS, KPR, KERR)
+C
+ IF( IERR.GT.0 ) THEN
+ IGSIZE = IERR
+ GOTO 900
+ ENDIF
+C
+C Find Gaussian lines corresponding to given North and South points
+C
+C Number of lines not set (output field)
+C
+ IF( KNNS.EQ.0 ) THEN
+ KLN = 0
+ ILS = ILATNUM
+C
+ DO JLAT = 2, ILATNUM
+ IGAUSS = NINT(PGAUSS(JLAT) * PPMULT)
+C
+ IF( (KLN.EQ.0).AND.((KAREA(JPNORTH)-IGAUSS).GT.1000) ) THEN
+ KLN = JLAT - 1
+ KAREA(JPNORTH) = NINT(PGAUSS(KLN) * PPMULT)
+ ENDIF
+C
+ IF( (ILS.EQ.ILATNUM).AND.(KAREA(JPSOUTH).GE.IGAUSS) ) THEN
+ ILS = JLAT
+ KAREA(JPSOUTH) = NINT(PGAUSS(ILS) * PPMULT)
+ ENDIF
+ ENDDO
+C
+ KNNS = ILS - KLN + 1
+C
+ ELSE
+C
+C Number of lines set (input field)
+C
+ KLN = 1
+ ILS = 1
+C
+ INDIST = ABS(NINT(PGAUSS(1) * PPMULT) - KAREA(JPNORTH) )
+ ISDIST = ABS(NINT(PGAUSS(1) * PPMULT) - KAREA(JPSOUTH) )
+C
+ DO JLAT = 2, ILATNUM
+C
+ IF( (ABS(NINT(PGAUSS(JLAT)*PPMULT) - KAREA(JPNORTH) ) )
+ X .LT.INDIST) THEN
+ KLN = JLAT
+ INDIST = ABS(NINT(PGAUSS(JLAT) * PPMULT) - KAREA(JPNORTH) )
+ ENDIF
+C
+ IF( (ABS(NINT(PGAUSS(JLAT)*PPMULT) - KAREA(JPSOUTH) ) )
+ X .LT.ISDIST) THEN
+ ILS = JLAT
+ ISDIST = ABS(NINT(PGAUSS(JLAT) * PPMULT) - KAREA(JPSOUTH) )
+ ENDIF
+C
+ ENDDO
+C
+ IF( KNNS.NE.(ILS - KLN + 1) ) THEN
+ IGSIZE = JPROUTINE + 1
+ IF( KERR.GE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IGSIZE: No.of lines specified = ',KNNS)
+ CALL INTLOG(JP_ERROR,
+ X 'IGSIZE: does not match the',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'IGSIZE: Gaussian line limits = ', KLN)
+ CALL INTLOG(JP_ERROR,
+ X 'IGSIZE: and ',ILS)
+ ENDIF
+ IF( KERR.EQ.0 ) CALL INTLOG(JP_FATAL,
+ X 'Interpolation failed.', JPQUIET)
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+ ONPOLE = KLN.EQ.1
+ OSPOLE = ILS.EQ.ILATNUM
+C
+ KAREA(JPNORTH) = NINT(PGAUSS(KLN) * PPMULT)
+ KAREA(JPSOUTH) = NINT(PGAUSS(ILS) * PPMULT)
+C
+ IF( LPRINT ) THEN
+ CALL INTLOG(JP_DEBUG,'IGSIZE: Output parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGSIZE: No.long pts = ',KNWE)
+ CALL INTLOG(JP_DEBUG,'IGSIZE: No.lat. pts = ',KNNS)
+ CALL INTLOG(JP_DEBUG,'IGSIZE: Stride along lat = ',ILNSTR)
+ CALL INTLOG(JP_DEBUG,'IGSIZE: North line number = ',KLN)
+ CALL INTLOG(JP_DEBUG,'IGSIZE: South line number = ',ILS)
+ IF( OWEGLOBE ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'IGSIZE: Field is global West-East.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'IGSIZE: Field is NOT global West-East.',JPQUIET)
+ ENDIF
+ IF( ONPOLE ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'IGSIZE: North Pole is in field.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'IGSIZE: North Pole NOT is in field.',JPQUIET)
+ ENDIF
+ IF( OSPOLE ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'IGSIZE: South Pole is in field.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'IGSIZE: South Pole NOT is in field.',JPQUIET)
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return to calling routine. Format statements
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( LPRINT ) CALL INTLOG(JP_DEBUG,'IGSIZE: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/igtog.F b/interpolation/igtog.F
new file mode 100755
index 0000000..3584a7e
--- /dev/null
+++ b/interpolation/igtog.F
@@ -0,0 +1,276 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGTOG (PIFELD, KIWE, KINS, KOWE, KONS, KWEIND,
+ 1 KNSIND, PWFACT, POFELD, KPR, KERR)
+C
+C---->
+C**** *IGTOG*
+C
+C Purpose
+C -------
+C
+C Perform basic interpolation between regular input and output
+C fields.
+C
+C Interface
+C ---------
+C
+C IERR = IGTOG (PIFELD, KIWE, KINS, KOWE, KONS, KWEIND, KNSIND,
+C 1 PWFACT, POFELD, KPR, KERR)
+C
+C Input parameters
+C ----------------
+C
+C PIFELD - The input field provided by the calling routine.
+C
+C KIWE - The number of points in the West-East direction in
+C the input field.
+C
+C KINS - The number of points in the North-South direction
+C in the input field.
+C
+C KOWE - The number of points in the West-East direction in
+C the output field.
+C
+C KONS - The number of points in the North-South direction
+C in the output field.
+C
+C KWEIND - This array contains the array offsets of the West
+C and East points in the input array required for
+C interpolation.
+C
+C KNSIND - This array contains the array offsets of the North
+C and South points in the input array required for
+C interpolation.
+C
+C PWFACT - The array of interpolating weights to the four
+C neighbouring points for every output point.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C -----------------
+C
+C POFELD - The output field returned to the calling routine.
+C
+C Return value
+C ------------
+C
+C The error indicator (INTEGER).
+C
+C Common block usage
+C ------------------
+C
+C None
+C
+C Externals
+C ---------
+C
+C INTLOG(R) - Logs messages.
+C
+C Method
+C ------
+C
+C This routine performs basic linear interpolation using the four
+C neighbouring points in the input array to generate the output
+C array.
+C
+C Reference
+C ---------
+C
+C None
+C
+C Comments
+C --------
+C
+C None
+C
+C Author
+C ------
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C Modifications
+C -------------
+C
+C Allow for missing data values
+C J.D.Chambers ECMWF August 2000
+C
+C Force nearest neighbour processing with env variable or
+C INTOUT parameter
+C S.Curic ECMWF September 2005
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Function arguments
+C
+ INTEGER KIWE, KINS, KOWE, KONS, KPR, KERR
+ INTEGER KWEIND (2, KOWE), KNSIND (2, KONS)
+ REAL PIFELD (KIWE, KINS), POFELD (KOWE, KONS)
+ REAL PWFACT (4, KOWE, KONS)
+C
+C Local variables
+C
+ INTEGER ILATN, ILATS, JOLAT, JOLON, COUNT
+ CHARACTER*12 YFLAG
+ REAL NEAREST
+ LOGICAL LVEGGY
+C
+C External functions
+C
+ INTEGER IGTOGR
+C
+C Statement function
+C
+ REAL A, B
+ LOGICAL NOTEQ
+ NOTEQ(A,B) = (ABS((A)-(B)).GT.(ABS(A)*1E-3))
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialisation
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGTOG: Section 1.',JPQUIET)
+C
+ IGTOG = 0
+C
+ IF( KPR.GE.1 ) THEN
+ CALL INTLOG(JP_DEBUG,'IGTOG: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGTOG: No.input fld longitudes = ',KIWE)
+ CALL INTLOG(JP_DEBUG,'IGTOG: No.input fld latitudes = ',KINS)
+ CALL INTLOG(JP_DEBUG,'IGTOG: No.output fld longitudes = ',KOWE)
+ CALL INTLOG(JP_DEBUG,'IGTOG: No.output fld latitudes = ',KONS)
+ ENDIF
+C
+ LVEGGY = (NITABLE.EQ.128).AND.
+ X ((NIPARAM.EQ.27).OR.
+ X (NIPARAM.EQ.28).OR.
+ X (NIPARAM.EQ.29).OR.
+ X (NIPARAM.EQ.30).OR.
+ X (NIPARAM.EQ.43) )
+C Force nearest neighbour processing with env variable
+ CALL GETENV('NEAREST_NEIGHBOUR', YFLAG)
+ IF( YFLAG(1:1).EQ.'1' ) LVEGGY = .TRUE.
+
+C Force nearest neighbour processing with INTOUT parameter
+ IF( LMETHOD ) LVEGGY = .TRUE.
+
+ IF( LVEGGY ) CALL INTLOG(JP_DEBUG,
+ X 'IGTOG: nearest neighbour processing (vegetation)',JPQUIET)
+C
+C -----------------------------------------------------------------|
+C* Section 2. Basic interpolation
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGTOG: Section 2.',JPQUIET)
+C
+ DO JOLAT = 1, KONS
+C
+ ILATN = KNSIND(JP_I_N,JOLAT)
+ ILATS = KNSIND(JP_I_S,JOLAT)
+C
+ DO JOLON = 1, KOWE
+C
+C Count non-missing data values
+C
+ IF( LIMISSV ) THEN
+ COUNT = 0
+ IF( NOTEQ(PIFELD(KWEIND(JP_I_W,JOLON),ILATN), RMISSGV) )
+ X COUNT = COUNT + 1
+ IF( NOTEQ(PIFELD(KWEIND(JP_I_W,JOLON),ILATS), RMISSGV) )
+ X COUNT = COUNT + 1
+ IF( NOTEQ(PIFELD(KWEIND(JP_I_E,JOLON),ILATN), RMISSGV) )
+ X COUNT = COUNT + 1
+ IF( NOTEQ(PIFELD(KWEIND(JP_I_E,JOLON),ILATS), RMISSGV) )
+ X COUNT = COUNT + 1
+ ELSE
+ COUNT = 4
+ ENDIF
+C
+C Interpolate using four neighbours if none are missing
+C
+ IF( (COUNT.EQ.4).AND.(.NOT.LVEGGY) ) THEN
+ POFELD(JOLON,JOLAT) =
+ X PIFELD(KWEIND(JP_I_W,JOLON),ILATN) *
+ X PWFACT(JP_I_NW,JOLON,JOLAT) +
+ X PIFELD(KWEIND(JP_I_W,JOLON),ILATS) *
+ X PWFACT(JP_I_SW,JOLON,JOLAT) +
+ X PIFELD(KWEIND(JP_I_E,JOLON),ILATN) *
+ X PWFACT(JP_I_NE,JOLON,JOLAT) +
+ X PIFELD(KWEIND(JP_I_E,JOLON),ILATS) *
+ X PWFACT(JP_I_SE,JOLON,JOLAT)
+C
+C Set missing if all neighbours are missing
+C
+ ELSE IF( COUNT.EQ.0 ) THEN
+ POFELD(JOLON,JOLAT) = RMISSGV
+C
+C Otherwise, use the nearest neighbour
+C
+ ELSE
+ NEAREST = PWFACT(JP_I_NW,JOLON,JOLAT)
+ POFELD(JOLON,JOLAT) =
+ X PIFELD(KWEIND(JP_I_W,JOLON),ILATN)
+C
+ IF( PWFACT(JP_I_NE,JOLON,JOLAT).GT.NEAREST ) THEN
+ NEAREST = PWFACT(JP_I_NE,JOLON,JOLAT)
+ POFELD(JOLON,JOLAT) =
+ X PIFELD(KWEIND(JP_I_E,JOLON),ILATN)
+ ENDIF
+C
+ IF( PWFACT(JP_I_SW,JOLON,JOLAT).GT.NEAREST ) THEN
+ NEAREST = PWFACT(JP_I_SW,JOLON,JOLAT)
+ POFELD(JOLON,JOLAT) =
+ X PIFELD(KWEIND(JP_I_W,JOLON),ILATS)
+ ENDIF
+C
+ IF( PWFACT(JP_I_SE,JOLON,JOLAT).GT.NEAREST ) THEN
+ NEAREST = PWFACT(JP_I_SE,JOLON,JOLAT)
+ POFELD(JOLON,JOLAT) =
+ X PIFELD(KWEIND(JP_I_E,JOLON),ILATS)
+ ENDIF
+C
+ ENDIF
+C
+ ENDDO
+C
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return to calling routine. Format statements
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGTOG: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/igtogr.F b/interpolation/igtogr.F
new file mode 100755
index 0000000..ffca362
--- /dev/null
+++ b/interpolation/igtogr.F
@@ -0,0 +1,258 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGTOGR (PIFELDN, PIFELDS, KNINDEX, KSINDEX,
+ 1 PWFACT, KOWE, POFELD, KPR, KERR)
+C
+C---->
+C**** *IGTOGR*
+C
+C Purpose
+C -------
+C
+C Perform basic interpolation for one line of latitude of the
+C output field using its two neighbouring input field lines of
+C latitude.
+C
+C Interface
+C ---------
+C
+C IERR = IGTOGR (PIFELDN, PIFELDS, KNINDEX, KSINDEX, PWFACT,
+C 1 KOWE, POFELD, KPR, KERR)
+C
+C Input parameters
+C ----------------
+C
+C PIFELDN - The line of latitude of the input field North of
+C the output row.
+C
+C PIFELDS - The line of latitude of the input field South of
+C the output row.
+C
+C KNINDEX - This array contains the array offsets of the West
+C and East points in the input array North of the
+C output row.
+C
+C KSINDEX - This array contains the array offsets of the West
+C and East points in the input array South of the
+C output row.
+C
+C PWFACT - The array of interpolating weights to the four
+C neighbouring points for every output point of this
+C line of latitude.
+C
+C KOWE - The number of points in the West-East direction in
+C the output field.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C -----------------
+C
+C POFELD - The interpolated output field line of latitude
+C returned to the calling routine.
+C
+C Return value
+C ------------
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C -------------------------------
+C
+C None
+C
+C Common block usage
+C ------------------
+C
+C None
+C
+C Externals
+C ---------
+C
+C INTLOG - Logs messages.
+C
+C Method
+C ------
+C
+C This routine performs basic linear interpolation using the four
+C neighbouring points in the input array to generate the output
+C array.
+C
+C The parameter list is designed to allow for quasi regular input
+C fields with different grid spacing in the Northern and Southern
+C lines of latitude.
+C
+C Reference
+C ---------
+C
+C None
+C
+C Comments
+C --------
+C
+C Program contains sections 0 to 2 and 9
+C
+C Author
+C ------
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C Modifications
+C -------------
+C
+C Allow for missing data values
+C J.D.Chambers ECMWF August 2000
+C
+C Force nearest neighbour processing with env variable or
+C INTOUT parameter
+C S.Curic ECMWF September 2005
+C
+C----<
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Function arguments
+C
+ INTEGER KOWE, KPR, KERR
+ INTEGER KNINDEX (2, KOWE), KSINDEX (2, KOWE)
+ REAL PIFELDN (*), PIFELDS (*), POFELD (KOWE)
+ REAL PWFACT (4, KOWE)
+C
+C Local variables
+C
+ INTEGER JOLON, COUNT
+ CHARACTER*12 YFLAG
+ REAL NEAREST
+ LOGICAL LVEGGY
+C
+C Statement function
+C
+ REAL A, B
+ LOGICAL NOTEQ
+ NOTEQ(A,B) = (ABS((A)-(B)).GT.(ABS(A)*1E-3))
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialisation
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IGTOGR = 0
+C
+ IF( KPR.GE.1 ) THEN
+ CALL INTLOG(JP_DEBUG,'IGTOGR: Section 1.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGTOGR: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'IGTOGR: Number of output field longitudes is -',KOWE)
+ ENDIF
+C
+ LVEGGY = (NITABLE.EQ.128).AND.
+ X ((NIPARAM.EQ.27).OR.
+ X (NIPARAM.EQ.28).OR.
+ X (NIPARAM.EQ.29).OR.
+ X (NIPARAM.EQ.30).OR.
+ X (NIPARAM.EQ.43) )
+C Force nearest neighbour processing with env variable
+ CALL GETENV('NEAREST_NEIGHBOUR', YFLAG)
+ IF( YFLAG(1:1).EQ.'1' ) LVEGGY = .TRUE.
+
+C Force nearest neighbour processing with INTOUT parameter
+ IF( LMETHOD ) LVEGGY = .TRUE.
+
+ IF( LVEGGY ) CALL INTLOG(JP_DEBUG,
+ X 'IGTOGR: nearest neighbour processing (vegetation)',JPQUIET)
+C
+C -----------------------------------------------------------------|
+C* Section 2. Basic interpolation
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGTOGR: Section 2.',JPQUIET)
+C
+ DO JOLON = 1, KOWE
+C
+C Count non-missing data values
+C
+ IF( LIMISSV ) THEN
+ COUNT = 0
+ IF( NOTEQ(PIFELDN(KNINDEX(JP_I_W,JOLON)),RMISSGV) )
+ X COUNT = COUNT + 1
+ IF( NOTEQ(PIFELDN(KNINDEX(JP_I_E,JOLON)),RMISSGV) )
+ X COUNT = COUNT + 1
+ IF( NOTEQ(PIFELDN(KSINDEX(JP_I_W,JOLON)),RMISSGV) )
+ X COUNT = COUNT + 1
+ IF( NOTEQ(PIFELDN(KSINDEX(JP_I_E,JOLON)),RMISSGV) )
+ X COUNT = COUNT + 1
+ ELSE
+ COUNT = 4
+ ENDIF
+C
+C Interpolate using four neighbours if none are missing
+C
+ IF( (COUNT.EQ.4).AND.(.NOT.LVEGGY) ) THEN
+ POFELD(JOLON) =
+ X PIFELDN(KNINDEX(JP_I_W,JOLON)) * PWFACT(JP_I_NW,JOLON) +
+ X PIFELDN(KNINDEX(JP_I_E,JOLON)) * PWFACT(JP_I_NE,JOLON) +
+ X PIFELDS(KSINDEX(JP_I_W,JOLON)) * PWFACT(JP_I_SW,JOLON) +
+ X PIFELDS(KSINDEX(JP_I_E,JOLON)) * PWFACT(JP_I_SE,JOLON)
+C
+C Set missing if all neighbours are missing
+C
+ ELSE IF( COUNT.EQ.0 ) THEN
+ POFELD(JOLON) = RMISSGV
+C
+C Otherwise, use the nearest neighbour
+C
+ ELSE
+ NEAREST = PWFACT(JP_I_NW,JOLON)
+ POFELD(JOLON) = PIFELDN(KNINDEX(JP_I_W,JOLON))
+C
+ IF( PWFACT(JP_I_NE,JOLON).GT.NEAREST ) THEN
+ NEAREST = PWFACT(JP_I_NE,JOLON)
+ POFELD(JOLON) = PIFELDN(KNINDEX(JP_I_E,JOLON))
+ ENDIF
+C
+ IF( PWFACT(JP_I_SW,JOLON).GT.NEAREST ) THEN
+ NEAREST = PWFACT(JP_I_SW,JOLON)
+ POFELD(JOLON) = PIFELDS(KSINDEX(JP_I_W,JOLON))
+ ENDIF
+C
+ IF( PWFACT(JP_I_SE,JOLON).GT.NEAREST ) THEN
+ NEAREST = PWFACT(JP_I_SE,JOLON)
+ POFELD(JOLON) = PIFELDS(KSINDEX(JP_I_E,JOLON))
+ ENDIF
+ ENDIF
+C
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return to calling routine. Format statements
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IGTOGR: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/igtran.F b/interpolation/igtran.F
new file mode 100755
index 0000000..db76b98
--- /dev/null
+++ b/interpolation/igtran.F
@@ -0,0 +1,345 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IGTRAN (PMAT, KINCOL, KINROW, KMOVE, KLEN,
+ 1 KPR, KERR)
+C
+C---->
+C**** *IGTRAN*
+C
+C PURPOSE
+C _______
+C
+C This routine transposes a rectangular matrix.
+C
+C INTERFACE
+C _________
+C
+C IERR = IGTRAN (PMAT, KINCOL, KINROW, KMOVE, KLEN, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C PMAT - The input matrix of length KINCOL * KINROW.
+C
+C KINCOL - The length of the first dimension on entry and
+C second dimension on exit.
+C
+C KINROW - The length of the second dimension on entry and
+C first dimension on exit.
+C
+C KMOVE - Work array used to store information to speed up
+C the process.
+C
+C KLEN - Length of array KMOVE. The recommended length is
+C (KINCOL + KINROW) / 2.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C (No longer used, kept for backward compatibility.
+C Used to be used as follows:
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.)
+C
+C Output parameters
+C ________________
+C
+C PMAT - The transposed matrix.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C 7401 KLEN was less than 1.
+C 7402 A failure during transposition (should never happen).
+C
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C INTLOG - Generate log messages.
+C
+C
+C METHOD
+C ______
+C
+C This algorithm uses the cyclic structure of transposition to
+C perform a transposition in place with a minimum amount of work
+C storage.
+C
+C REFERENCE
+C _________
+C
+C Esko G. Cate and David W. Twigg Analysis of In-Situ
+C Transposition
+C CACM Algorithm 513
+C
+C
+C COMMENTS
+C ________
+C
+C None.
+C
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Jan 1994
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers ECMWF Sept 1995
+C
+C----<
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Function arguments
+C
+ INTEGER KINCOL, KINROW, KLEN, KPR, KERR
+ INTEGER KMOVE(KLEN)
+ REAL PMAT (KINCOL * KINROW)
+C
+C Local variables
+ INTEGER ICOUNT, IRMULC, IR0, IR1, IR2, IPOINT, IKMI, IP1, IP2,
+ X IRMCM1, IP1C, IP2C, IROWP1, ICOLM1, ISTART
+ INTEGER JST, JINROW, JINCOL
+ REAL ZMIP1, ZMIP1C, ZTEMP
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 7400)
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IGTRAN: Section 1.',JPQUIET)
+C
+ IGTRAN = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IGTRAN: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IGTRAN: 1st matrix dimension = ',KINCOL)
+ CALL INTLOG(JP_DEBUG,'IGTRAN: 2nd matrix dimension = ',KINROW)
+ CALL INTLOG(JP_DEBUG,'IGTRAN: Work array length = ',KLEN)
+ CALL INTLOG(JP_DEBUG,
+ X 'IGTRAN: Recommended length = ',(KINCOL + KINROW) / 2)
+ ENDIF
+C
+ IF (KINCOL .LE. 1 .OR. KINROW .LE. 1) GO TO 900
+C
+C _______________________________________________________
+C
+C* Section 2. Rectangular transposition setup
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IGTRAN: Section 2.',JPQUIET)
+C
+ IF (KINCOL .NE. KINROW) THEN
+C
+ IF (KLEN .LT. 1) THEN
+ IGTRAN = JPROUTINE + 1
+ CALL INTLOG(JP_ERROR,'IGTRAN: Work array size = ',KLEN)
+ CALL INTLOG(JP_ERROR,'IGTRAN: Must be at least 1.',JPQUIET)
+ GO TO 900
+ ENDIF
+C
+ ICOUNT = 2
+ IRMULC = KINCOL * KINROW
+ IRMCM1 = IRMULC - 1
+C
+ DO 210 JST = 1, KLEN
+ KMOVE (JST) = 0
+ 210 CONTINUE
+C
+ IF (KINCOL .GT. 2 .AND. KINROW .GT. 2) THEN
+C
+C Calculate the number of fixed points, Euclids algorithm
+C for GCD (m - 1, n - 1)
+C
+ IR2 = KINCOL - 1
+ IR1 = KINROW - 1
+C
+ 220 CONTINUE
+ IR0 = MOD (IR2, IR1)
+ IR2 = IR1
+ IR1 = IR0
+ IF (IR0 .NE. 0) GO TO 220
+C
+ ICOUNT = ICOUNT + IR2 - 1
+C
+ ENDIF
+C
+C Set initial values for search
+C
+ ISTART = 1
+ IPOINT = KINCOL
+C
+C At least one loop must be rearranged so branch into loop
+C
+ GO TO 330
+C
+C _______________________________________________________
+C
+C* Section 3. Rectangular transposition main loop
+C _______________________________________________________
+C
+ 310 CONTINUE
+C
+C Search for loops to rearrange
+C
+ IKMI = IRMCM1 - ISTART
+ ISTART = ISTART + 1
+C
+ IF (ISTART .GT. IKMI) THEN
+ IGTRAN = JPROUTINE + 2
+ CALL INTLOG(JP_ERROR,
+ X 'IGTRAN: Fail during transposition.',JPQUIET)
+ GO TO 900
+ ENDIF
+C
+ IPOINT = IPOINT + KINCOL
+C
+ IF (IPOINT .GT. IRMCM1) IPOINT = IPOINT - IRMCM1
+C
+ IP2 = IPOINT
+C
+ IF (ISTART .EQ. IP2) GO TO 310
+C
+ IF (ISTART .GT. KLEN) THEN
+C
+ 320 CONTINUE
+C
+C Loop exit condition
+C
+ IF (IP2 .LE. ISTART .OR. IP2 .GE. IKMI) THEN
+ IF (IP2 .NE. ISTART) THEN
+ GO TO 310
+ ELSE
+ GO TO 330
+ ENDIF
+ ENDIF
+ IP1 = IP2
+ IP2 = KINCOL * IP1 - IRMCM1 * (IP1 / KINROW)
+ GO TO 320
+ ENDIF
+C
+ IF (KMOVE (ISTART) .NE. 0) GO TO 310
+C
+C Rearrange the elements of a loop and its companion loop
+C
+C Entry into loop on first pass
+C
+ 330 CONTINUE
+C
+ IP1 = ISTART
+ IKMI = IRMCM1 - ISTART
+ ZMIP1 = PMAT (IP1 + 1)
+ IP1C = IKMI
+ ZMIP1C = PMAT (IP1C + 1)
+C
+ 340 CONTINUE
+ IP2 = KINCOL * IP1 - IRMCM1 * (IP1 / KINROW)
+ IP2C = IRMCM1 - IP2
+C
+ IF (IP1 .LE. KLEN) KMOVE (IP1) = 2
+ IF (IP1C .LE. KLEN) KMOVE (IP1C) = 2
+C
+ ICOUNT = ICOUNT + 2
+C
+C Loop exit conditions
+C
+ IF (IP2 .EQ. ISTART) GO TO 360
+ IF (IP2 .EQ. IKMI) GO TO 350
+C
+ PMAT (IP1 + 1) = PMAT(IP2 + 1)
+ PMAT (IP1C + 1) = PMAT(IP2C + 1)
+ IP1 = IP2
+ IP1C = IP2C
+C
+ GO TO 340
+C
+ 350 CONTINUE
+C
+ ZTEMP = ZMIP1
+ ZMIP1 = ZMIP1C
+ ZMIP1C = ZTEMP
+C
+ 360 CONTINUE
+C
+ PMAT (IP1 + 1) = ZMIP1
+ PMAT (IP1C + 1) = ZMIP1C
+C
+ IF (ICOUNT .LT. IRMULC) GO TO 310
+C
+ ELSE
+C
+C _______________________________________________________
+C
+C* Section 4. Square transposition
+C _______________________________________________________
+C
+ 400 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IGTRAN: Section 4.',JPQUIET)
+C
+C Square matrix so exchange elements a(i,j) and a(j,i)
+C
+ ICOLM1 = KINCOL - 1
+C
+ DO 420 JINCOL = 1, ICOLM1
+C
+ IROWP1 = JINCOL + 1
+C
+ DO 410 JINROW = IROWP1, KINROW
+C
+ IP1 = JINCOL + (JINROW - 1) * KINCOL
+ IP2 = JINROW + (JINCOL - 1) * KINROW
+C
+ ZTEMP = PMAT (IP1)
+ PMAT (IP1) = PMAT (IP2)
+ PMAT (IP2) = ZTEMP
+C
+ 410 CONTINUE
+ 420 CONTINUE
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IGTRAN: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/init_cm.F b/interpolation/init_cm.F
new file mode 100755
index 0000000..bff9b77
--- /dev/null
+++ b/interpolation/init_cm.F
@@ -0,0 +1,309 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INIT_CM( KPARAM, KVAL )
+C---->
+C**** INIT_CM
+C
+C Purpose
+C -------
+C
+C Initialise common block values used by interpolation.
+C
+C
+C Interface
+C ---------
+C
+C IRET = INIT_CM( KPARAM, KVAL )
+C
+C Input
+C -----
+C
+C KPARAM - Flag indicating common block element to update.
+C KVAL - Value for element.
+C
+C
+C Output
+C ------
+C
+C Common block entry updated.
+C
+C
+C Method
+C ------
+C
+C 1 NIFORM
+C 2 NOFORM
+C 3 NITABLE
+C 4 NIPARAM
+C 5 NIRESO
+C 6 NORESO
+C 7 NOACC
+C 8 NIGRID(1)
+C 9 NIGRID(2)
+C 10 NOGRID(1)
+C 11 NOGRID(2)
+C 12 NIGAUSS, RIGAUSS, MILLEN, NINS, NIGAUSO, HIGAUST
+C 13 NOGAUSS, ROGAUSS, NOLPTS, NONS, NOGAUSO, HOGAUST
+C 14 NIAREA(1)
+C 15 NIAREA(2)
+C 16 NIAREA(3)
+C 17 NIAREA(4)
+C 18 NOAREA(1)
+C 19 NOAREA(2)
+C 20 NOAREA(3)
+C 21 NOAREA(4)
+C 22 NISCNM
+C 23 NOSCNM
+C 24 LSM
+C 25 LWIND
+C 26 LPREC
+C 27 RIGAUSS, MILLEN, NINS, NIGAUSO, HIGAUST
+C 28 ROGAUSS, NOLPTS, NONS, NOGAUSO, HOGAUST
+C 29 LSMPAR
+C
+C 99 Display current values in common block.
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER KPARAM, KVAL
+C
+C Local variables
+C
+ INTEGER IRET, LOOP
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "current.h"
+C
+ INIT_CM = 0
+C
+ IF ( KPARAM .EQ.1 ) NIFORM = KVAL
+C
+ IF ( KPARAM .EQ.2 ) NOFORM = KVAL
+C
+ IF ( KPARAM .EQ.3 ) NITABLE = KVAL
+C
+ IF ( KPARAM .EQ.4 ) NIPARAM = KVAL
+C
+ IF ( KPARAM .EQ.5 ) NIRESO = KVAL
+C
+ IF ( KPARAM .EQ.6 ) NORESO = KVAL
+C
+ IF ( KPARAM .EQ.7 ) NOACC = KVAL
+C
+ IF ( KPARAM .EQ.8 ) NIGRID(1) = KVAL
+C
+ IF ( KPARAM .EQ.9 ) NIGRID(2) = KVAL
+C
+ IF ( KPARAM .EQ.10) NOGRID(1) = KVAL
+C
+ IF ( KPARAM .EQ.11) NOGRID(2) = KVAL
+C
+ IF ( KPARAM .EQ.12) THEN
+ NIGAUSS = KVAL
+ IF( (NIGAUSO.NE.NIGAUSS).OR.(HIGAUST.NE.'F') ) THEN
+ CALL JGETGG( NIGAUSS, 'F', RIGAUSS, MILLEN, IRET)
+ IF ( IRET .NE. 0 ) THEN
+ WRITE(*,*) 'INIT_CM: JGETGG failed for NIGAUSS'
+ INIT_CM = IRET
+ GOTO 900
+ ENDIF
+ NINS = 2*NIGAUSS
+ NIGAUSO = NIGAUSS
+ HIGAUST = 'F'
+ ENDIF
+ ENDIF
+C
+ IF ( KPARAM .EQ.13) THEN
+ NOGAUSS = KVAL
+ IF( (NOGAUSO.NE.NOGAUSS).OR.(HOGAUST.NE.'F') ) THEN
+ CALL JGETGG( NOGAUSS, 'F', ROGAUSS, NOLPTS, IRET)
+ IF ( IRET .NE. 0 ) THEN
+ WRITE(*,*) 'INIT_CM: JGETGG failed for NOGAUSS'
+ INIT_CM = IRET
+ GOTO 900
+ ENDIF
+ NONS = 2*NOGAUSS
+ NOGAUSO = NOGAUSS
+ HOGAUST = 'F'
+ ENDIF
+ ENDIF
+C
+ IF ( KPARAM .EQ.14) NIAREA(1) = KVAL
+C
+ IF ( KPARAM .EQ.15) NIAREA(2) = KVAL
+C
+ IF ( KPARAM .EQ.16) NIAREA(3) = KVAL
+C
+ IF ( KPARAM .EQ.17) NIAREA(4) = KVAL
+C
+ IF ( KPARAM .EQ.18) NOAREA(1) = KVAL
+C
+ IF ( KPARAM .EQ.19) NOAREA(2) = KVAL
+C
+ IF ( KPARAM .EQ.20) NOAREA(3) = KVAL
+C
+ IF ( KPARAM .EQ.21) NOAREA(4) = KVAL
+C
+ IF ( KPARAM .EQ.22) NISCNM = KVAL
+C
+ IF ( KPARAM .EQ.23) NOSCNM = KVAL
+C
+ IF ( KPARAM .EQ.24) THEN
+ IF ( KVAL .EQ. 1) THEN
+ LSM = .TRUE.
+ ELSE
+ LSM = .FALSE.
+ ENDIF
+ ENDIF
+C
+ IF ( KPARAM .EQ.25) THEN
+ IF ( KVAL .EQ. 1) THEN
+ LWIND = .TRUE.
+ ELSE
+ LWIND = .FALSE.
+ ENDIF
+ ENDIF
+C
+ IF ( KPARAM .EQ.26) THEN
+ IF ( KVAL .EQ. 1) THEN
+ LPREC = .TRUE.
+ ELSE
+ LPREC = .FALSE.
+ ENDIF
+ ENDIF
+C
+ IF ( KPARAM .EQ.27) THEN
+ IF ( KVAL .EQ. 1) THEN
+ IF( (NIGAUSO.NE.NIGAUSS).OR.(HIGAUST.NE.'R') ) THEN
+ CALL JGETGG( NIGAUSS, 'R', RIGAUSS, MILLEN, IRET)
+ IF ( IRET .NE. 0 ) THEN
+ WRITE(*,*) 'INIT_CM: JGETGG failed for NIGAUSS'
+ INIT_CM = IRET
+ GOTO 900
+ ENDIF
+ NINS = 2*NIGAUSS
+ NIGAUSO = NIGAUSS
+ HIGAUST = 'R'
+ ENDIF
+ ELSE
+ WRITE(*,*) 'No user input supported for reduced gaussian grid'
+ INIT_CM = 999
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+ IF ( KPARAM .EQ.28) THEN
+ IF ( KVAL .EQ. 1) THEN
+ IF( (NOGAUSO.NE.NOGAUSS).OR.(HOGAUST.NE.'R') ) THEN
+ CALL JGETGG( NOGAUSS, 'R', ROGAUSS, NOLPTS, IRET)
+ IF ( IRET .NE. 0 ) THEN
+ WRITE(*,*) 'INIT_CM: JGETGG failed for NIGAUSS'
+ INIT_CM = IRET
+ GOTO 900
+ ENDIF
+ NONS = 2*NOGAUSS
+ NOGAUSO = NOGAUSS
+ HOGAUST = 'R'
+ ENDIF
+ ELSE
+ WRITE(*,*) 'No user input supported for reduced gaussian grid'
+ INIT_CM = 999
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+ IF ( KPARAM .EQ.29) THEN
+ IF ( KVAL .EQ. 1) THEN
+ LSMPAR = .TRUE.
+ ELSE
+ LSMPAR = .FALSE.
+ ENDIF
+ ENDIF
+C
+ IF ( KPARAM .EQ.99) THEN
+ WRITE(*,*) ' LCHANGE = ', LCHANGE
+ WRITE(*,*) ' LSMCHNG = ', LSMCHNG
+ WRITE(*,*) ' LSMSET = ', LSMSET
+ WRITE(*,*) ' LSMPARSET = ', LSMPARSET
+ WRITE(*,*) ' LPRECSET = ', LPRECSET
+ WRITE(*,*) ' LWINDSET = ', LWINDSET
+ WRITE(*,*) ' NINS = ', NINS
+ WRITE(*,*) ' NIWE = ', NIWE
+ WRITE(*,*) ' NO1NS = ', NO1NS
+ WRITE(*,*) ' NO1WE = ', NO1WE
+ WRITE(*,*) ' NONS = ', NONS
+ WRITE(*,*) ' NOWE = ', NOWE
+C
+ WRITE(*,*) ' NIFORM = ', NIFORM
+ WRITE(*,*) ' NOFORM = ', NOFORM
+ WRITE(*,*) ' NITABLE = ', NITABLE
+ WRITE(*,*) ' NIPARAM = ', NIPARAM
+ WRITE(*,*) ' NIRESO = ', NIRESO
+ WRITE(*,*) ' NORESO = ', NORESO
+ WRITE(*,*) ' LNORESO = ', LNORESO
+ WRITE(*,*) ' NOACC = ', NOACC
+ WRITE(*,*) ' LNOACC = ', LNOACC
+ WRITE(*,*) ' NIGRID(1) = ', NIGRID(1)
+ WRITE(*,*) ' NIGRID(2) = ', NIGRID(2)
+ WRITE(*,*) ' NOGRID(1) = ', NOGRID(1)
+ WRITE(*,*) ' NOGRID(2) = ', NOGRID(2)
+ WRITE(*,*) ' NIGAUSS = ', NIGAUSS
+ WRITE(*,*) ' NOGAUSS = ', NOGAUSS
+ WRITE(*,*) ' LNOGAUS = ', LNOGAUS
+ WRITE(*,*) ' NIAREA(1) = ', NIAREA(1)
+ WRITE(*,*) ' NIAREA(2) = ', NIAREA(2)
+ WRITE(*,*) ' NIAREA(3) = ', NIAREA(3)
+ WRITE(*,*) ' NIAREA(4) = ', NIAREA(4)
+ WRITE(*,*) ' NOAREA(1) = ', NOAREA(1)
+ WRITE(*,*) ' NOAREA(2) = ', NOAREA(2)
+ WRITE(*,*) ' NOAREA(3) = ', NOAREA(3)
+ WRITE(*,*) ' NOAREA(4) = ', NOAREA(4)
+ WRITE(*,*) ' NISCNM = ', NISCNM
+ WRITE(*,*) ' NOSCNM = ', NOSCNM
+ WRITE(*,*) ' LSM = ', LSM
+ WRITE(*,*) ' LWIND = ', LWIND
+ WRITE(*,*) ' LPREC = ', LPREC
+ WRITE(*,*) ' LSMPAR = ', LSMPAR
+ ENDIF
+C
+ IF ( KPARAM .GT.99) THEN
+ DO 110 LOOP = 1, NINS
+ WRITE(*,*) ' RIGAUSS(',LOOP,'), MILLEN(',LOOP,')=',
+ X RIGAUSS(LOOP), MILLEN(LOOP)
+ 110 CONTINUE
+ DO 120 LOOP = 1, NONS
+ WRITE(*,*) ' ROGAUSS(',LOOP,'), NOLPTS(',LOOP,')=',
+ X ROGAUSS(LOOP), NOLPTS(LOOP)
+ 120 CONTINUE
+ ENDIF
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/insane.F b/interpolation/insane.F
new file mode 100755
index 0000000..c5478f3
--- /dev/null
+++ b/interpolation/insane.F
@@ -0,0 +1,550 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INSANE( )
+C
+C---->
+C**** INSANE
+C
+C Purpose
+C -------
+C
+C Check interpolate options before processing.
+C
+C
+C Interface
+C ---------
+C
+C IRET = INSANE( )
+C
+C Input
+C -----
+C
+C Common blocks nifld.common and nofld.common
+C
+C
+C Output
+C ------
+C
+C Returns: 0 if no problems spotted.
+C -1 if output is same as the input
+C
+C
+C Method
+C ------
+C
+C See below!
+C
+C
+C Externals
+C ---------
+C
+C ISSAME - Checks if input specification is same as output.
+C INTLOG - Logs error messages.
+C INTLOGR - Logs error messages.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Feb 1995
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 27200 )
+ INTEGER JPMAXRES
+ PARAMETER (JPMAXRES = JPSTRUNC)
+C
+C Local variables
+C
+ CHARACTER*12 YFLAG,YFLAG1
+ INTEGER IERR, MINGRID
+ REAL GRIDINT
+ LOGICAL LINCHECK,LNLIMIT
+C
+C Externals
+ LOGICAL ISSAME
+ INTEGER FFTCHK
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+ INSANE = 0
+ IERR = 0
+C
+C Exit if output is same as input ...
+C
+ IF ( ISSAME() ) THEN
+ INSANE = -1
+ GOTO 900
+ ENDIF
+C
+C Check output packing accuracy requested (packed output only)
+C
+ IF ( NOFORM .EQ. 1 ) THEN
+ IF ( (NOACC .GT. 30) .OR. (NOACC .LT. 1) ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INSANE: Invalid output packing given ',NOACC)
+ NOACC = 16
+ CALL INTLOG(JP_DEBUG,
+ X 'INSANE: Changed to ',NOACC)
+cs CALL INTLOG(JP_ERROR,
+cs X 'Sorry!: Invalid output packing given',NOACC)
+cs IERR = JPROUTINE + 1
+cs CALL INTLOG(JP_ERROR,
+cs X ' Must be between 1 and 30 bits per value.',IERR)
+cs INSANE = IERR
+cs GOTO 900
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Check valid input/output representations.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Input
+C
+ IF ( (NIREPR .NE. JPREGULAR ) .AND.
+ X (NIREPR .NE. JPREDLL ) .AND.
+ X (NIREPR .NE. JPSPHERE ) .AND.
+ X (NIREPR .NE. JPSPHROT ) .AND.
+ X (NIREPR .NE. JPGAUSSIAN) .AND.
+ X (NIREPR .NE. JPSTRSH ) .AND.
+ X (NIREPR .NE. JPSTRGG ) .AND.
+ X (NIREPR .NE. JPQUASI ) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Invalid input representation.', NIREPR)
+ INSANE = JPROUTINE + 21
+ GOTO 900
+ ENDIF
+C
+C Output
+C
+ IF ( (NOREPR .NE. JPREGULAR ) .AND.
+ X (NOREPR .NE. JPREGROT ) .AND.
+ X (NOREPR .NE. JPSPHERE ) .AND.
+ X (NOREPR .NE. JPSPHROT ) .AND.
+ X (NOREPR .NE. JPGAUSSIAN) .AND.
+ X (NOREPR .NE. JPSTRSH ) .AND.
+ X (NOREPR .NE. JPSTRGG ) .AND.
+ X (NOREPR .NE. JPQUASI ) .AND.
+ X (NOREPR .NE. JPFGGROT ) .AND.
+ X (NOREPR .NE. JPQGGROT ) .AND.
+ X (NOREPR .NE. JPREDLL ) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Invalid output representation.', NOREPR)
+ INSANE = JPROUTINE + 22
+ GOTO 900
+ ENDIF
+C
+C Input / output combination
+C
+ IF ( (NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT) ) THEN
+ IF ( (NIREPR.NE.JPSPHERE).AND.(NIREPR.NE.JPSPHROT) ) THEN
+C
+C Set flag to discontinue attempts at interpolation, ie
+C force output to be same as input
+C
+ INSANE = -1
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Check spectral to grid options.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ MINGRID = JP0P5 / 5
+C
+ IF ( (NIREPR.EQ.JPSPHERE).OR.(NIREPR.EQ.JPSPHROT) ) THEN
+C
+C Check resolution not too large
+C
+ IF( (NOREPR.NE.JPSPHERE).AND.(NIRESO.GT.JPMAXRES) ) THEN
+C
+C Problem unless a suitable truncation is on-the-way
+C
+ IF( LARESOL.OR.LNORESO ) THEN
+ IF( MIN(NOGRID(1),NOGRID(2)).LT.MINGRID ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Despite truncation,', JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X ' spectral to grid transformation', JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X ' cannot be done (grid too fine).', JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X ' Grid west-east (* 10**-5) = ', NOGRID(1))
+ CALL INTLOG(JP_ERROR,
+ X ' Grid north-south (* 10**-5) = ', NOGRID(2))
+ CALL INTLOG(JP_ERROR,
+ X ' Minimum allowed (* 10**-5) = ', MINGRID)
+ IERR = JPROUTINE + 31
+ INSANE = IERR
+ GOTO 900
+ ENDIF
+C
+ ELSE
+C
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Spectral truncation too large for ', JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X ' spectral to grid transformation.', JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X ' Truncation given = ', NIRESO)
+ CALL INTLOG(JP_ERROR,
+ X ' Max. truncation handled = ', JPMAXRES)
+ IERR = JPROUTINE + 31
+ INSANE = IERR
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+C Check resolution not too small
+C
+ IF ( (NOREPR .NE. JPSPHERE) .AND. (NIRESO .LE. 0) ) THEN
+ IERR = JPROUTINE + 32
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Spectral truncation too small for ', JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X ' spectral to grid transformation.', JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X ' Truncation given = ', NIRESO)
+ CALL INTLOG(JP_ERROR,
+ X ' Truncation must be > ', 0)
+ INSANE = IERR
+ GOTO 900
+ ENDIF
+C
+C Check grid interval
+C
+ IF ( (NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT) ) THEN
+C
+C Not too small
+C
+C if env variable 1 no check of incterval
+ LNLIMIT = .TRUE.
+ CALL GETENV('INCREMENT_NO_LIMIT', YFLAG)
+ IF(YFLAG1(1:1).EQ.'1' ) LNLIMIT = .FALSE.
+
+C
+ IF(LNLIMIT) THEN
+ IF( (NOGRID(1).LT.MINGRID).OR.(NOGRID(2).LT.MINGRID) ) THEN
+ IERR = JPROUTINE + 33
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Grid interval too small for ', JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X ' spectral to grid transformation.', JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X ' Latitude interval given = ', NOGRID(1))
+ CALL INTLOG(JP_ERROR,
+ X ' Longitude interval given = ', NOGRID(2))
+ CALL INTLOG(JP_ERROR,
+ X ' Min. interval handled = ', MINGRID)
+ INSANE = IERR
+ GOTO 900
+ ENDIF
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'INSANE: Increments checking disabled',JPQUIET)
+ ENDIF
+C
+C Not too large
+C
+ IF ( (NOGRID(1).GT.JP90) .OR. (NOGRID(2).GT.JP90) ) THEN
+ IERR = JPROUTINE + 34
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Grid interval too large for ', JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X ' spectral to grid transformation.', JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X ' Latitude interval given = ', NOGRID(1))
+ CALL INTLOG(JP_ERROR,
+ X ' Longitude interval given = ', NOGRID(2))
+ CALL INTLOG(JP_ERROR,
+ X ' Max. interval handled = ', JP90)
+ INSANE = IERR
+ GOTO 900
+ ENDIF
+C
+C A multiple of 0.0005
+C
+C if env variable 1 no check of increments
+ LINCHECK = .FALSE.
+ CALL GETENV('INCREMENT_CHECK', YFLAG)
+ IF(YFLAG(1:1).EQ.'1' ) LINCHECK = .TRUE.
+
+ IF( LINCHECK ) CALL INTLOG(JP_DEBUG,
+ X 'INSANE: Increments checking disabled',JPQUIET)
+C
+ IF(.NOT.LINCHECK) THEN
+ IF ( (MOD(NOGRID(1),5).NE.0) .OR.
+ X (MOD(NOGRID(2),5).NE.0) ) THEN
+ IERR = JPROUTINE + 35
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Grid must be a multiple of 0.0005 ', JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X ' Latitude interval given = ', NOGRID(1))
+ CALL INTLOG(JP_ERROR,
+ X ' Longitude interval given = ', NOGRID(2))
+ INSANE = IERR
+ GOTO 900
+ ENDIF
+ ENDIF
+ ENDIF
+C
+C Check if combination of truncation and longitude grid interval
+C can be handled by the FFT algorithm.
+C
+ IERR = 1
+ GRIDINT = -1.0
+C
+ IF ( (NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT) ) THEN
+ GRIDINT = FLOAT(NOGRID(2))/FLOAT(JPMULT)
+ IERR = FFTCHK( NIRESO, GRIDINT )
+ IF ( IERR.NE.1 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Invalid combination of spectral number = ', NIRESO)
+ CALL INTLOGR(JP_ERROR,
+ X ' and longitude grid interval = ', GRIDINT)
+ CALL INTLOG(JP_ERROR,
+ X ' for FFT algorithm in use.', JPQUIET)
+ INSANE = JPROUTINE + 36
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+ IF ( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPQUASI) ) THEN
+ GRIDINT = 360.0/FLOAT(NOGAUSS)
+ IERR = FFTCHK( NIRESO, GRIDINT )
+ IF ( IERR.NE.1 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Invalid combination of spectral number = ', NIRESO)
+ CALL INTLOGR(JP_ERROR,
+ X ' and longitude grid intvl = ', GRIDINT)
+ CALL INTLOG(JP_ERROR,
+ X ' from gaussian number = ', NOGAUSS)
+ CALL INTLOG(JP_ERROR,
+ X ' for FFT algorithm in use.', JPQUIET)
+ INSANE = JPROUTINE + 37
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4. Check legal area definition.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C Don't check area for ocean products
+C
+ IF( NILOCAL.EQ.4 ) GOTO 900
+C
+ IF ( (NOAREA(1).GT.JP90).OR.(NOAREA(1).LT.-JP90) ) THEN
+ IERR = JPROUTINE + 41
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Output area definition illegal',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X ' Northern limit given as ', NOAREA(1))
+ INSANE = IERR
+ GOTO 900
+ ENDIF
+C
+ IF ( (NOAREA(3).GT.JP90).OR.(NOAREA(3).LT.-JP90) ) THEN
+ IERR = JPROUTINE + 42
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Output area definition illegal',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X ' Southern limit given as ', NOAREA(3))
+ INSANE = IERR
+ GOTO 900
+ ENDIF
+C
+ IF ( (NOAREA(2).GT.JP360).OR.(NOAREA(2).LT.-JP360) ) THEN
+ IERR = JPROUTINE + 43
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Output area definition illegal',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X ' Western limit given as ', NOAREA(2))
+ INSANE = IERR
+ GOTO 900
+ ENDIF
+C
+ IF ( (NOAREA(4).GT.JP360).OR.(NOAREA(4).LT.-JP360) ) THEN
+ IERR = JPROUTINE + 44
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Output area definition illegal',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X ' Eastern limit given as ', NOAREA(4))
+ INSANE = IERR
+ GOTO 900
+ ENDIF
+C
+C Subarea not supported for reduced gaussian grids
+C
+ IF( LNOAREA.AND.
+ X ((NOREPR.EQ.JPQUASI).OR.
+ X (NOREPR.EQ.JPQGGROT).OR.
+ X (NOREPR.EQ.JPSTRGG)) ) THEN
+ IERR = JPROUTINE + 45
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Subarea not supported for reduced gaussian grids',
+ X JPQUIET)
+ INSANE = IERR
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 5. Check legal gaussian grid definition.
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+C If input is quasi- regular gaussian, a grid definition must be
+C supplied in a GRIB record or by the caller, or the grid must be
+C a known definition.
+C
+ IF ( (NIREPR.EQ.JPQUASI) ) THEN
+ IF ( (.NOT. (LIGIVEL.AND.LIGIVEP)) .AND.
+ X (.NOT. (NIFORM.EQ.1)) ) THEN
+ IF (
+ x (NIGAUSS.NE.32) .AND.
+ x (NIGAUSS.NE.48) .AND.
+ x (NIGAUSS.NE.64) .AND.
+ x (NIGAUSS.NE.80) .AND.
+ x (NIGAUSS.NE.128).AND.
+ X (NIGAUSS.NE.160).AND.
+ X (NIGAUSS.NE.200).AND.
+ X (NIGAUSS.NE.256).AND.
+ X (NIGAUSS.NE.320).AND.
+ X (NIGAUSS.NE.400).AND.
+ X (NIGAUSS.NE.512).AND.
+ X (NIGAUSS.NE.640).AND.
+ X (NIGAUSS.NE.1024) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: No definition for quasi gauss. input',NIGAUSS)
+ INSANE = JPROUTINE + 51
+ GOTO 900
+ ENDIF
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 6. Check legal rotation definition.
+C -----------------------------------------------------------------|
+C
+ 600 CONTINUE
+C
+C Check for rotation.
+C
+ IF ( LNOROTA ) THEN
+C
+C Only allowed rotations are:
+C - spectral to regular lat/long
+C - regular gaussian to regular lat/long
+C - reduced gaussian to regular lat/long
+C
+ IF( ((NOREPR.NE.JPREGROT).AND.(NOREPR.NE.JPREGULAR)).OR.
+ X ((NIREPR.NE.JPSPHERE) .AND.
+ X (NIREPR.NE.JPGAUSSIAN).AND.
+ X (NIREPR.NE.JPQUASI)) ) THEN
+Cjdc CALL INTLOG(JP_ERROR,
+Cjdc X 'Sorry!: Only allowed rotations are:',JPQUIET)
+Cjdc CALL INTLOG(JP_ERROR,
+Cjdc X ' spectral to regular lat/long, or',JPQUIET)
+Cjdc CALL INTLOG(JP_ERROR,
+Cjdc X ' regular gaussian to regular lat/long',JPQUIET)
+Cjdc CALL INTLOG(JP_ERROR,
+Cjdc X ' reduced gaussian to regular lat/long',JPQUIET)
+ INSANE = JPROUTINE + 61
+ GOTO 900
+ ENDIF
+C
+C Check rotation angles.
+C
+ IF ( (NOROTA(1).LT.-JP360) .OR. (NOROTA(1).GT.JP360) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Rotation longitude out of range = ',NOROTA(1))
+ INSANE = JPROUTINE + 62
+ GOTO 900
+ ENDIF
+C
+ IF ( (NOROTA(2).LT.-JP180) .OR. (NOROTA(2).GT.JP180) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Rotation longitude out of range = ',NOROTA(2))
+ INSANE = JPROUTINE + 63
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 7. Check legal definition for table, parameter, level
+C type.
+C -----------------------------------------------------------------|
+C
+ 700 CONTINUE
+C
+C Table
+C
+c IF ( (NOTABLE.LT.0) .OR. (NOTABLE.GT.255) ) THEN
+ IF (NOTABLE.LT.0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Table definition out of range = ', NOTABLE)
+ INSANE = JPROUTINE + 71
+ GOTO 900
+ ENDIF
+C
+C Parameter
+C
+cs IF ( (NOPARAM.LT.0) .OR. (NOPARAM.GT.255) ) THEN
+ IF ( NOPARAM.LT.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Parameter definition out of range = ', NOPARAM)
+ INSANE = JPROUTINE + 72
+ GOTO 900
+ ENDIF
+C
+C Level type
+C
+ IF ( (NOLEVT.LT.0) .OR. (NOLEVT.GT.255) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'Sorry!: Level type definition out of range = ', NOLEVT)
+ INSANE = JPROUTINE + 73
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/intf.F b/interpolation/intf.F
new file mode 100755
index 0000000..000cdd6
--- /dev/null
+++ b/interpolation/intf.F
@@ -0,0 +1,467 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTF( INGRIB,INLEN,FLDIN,OUTGRIB,OUTLEN,FLDOUT)
+C
+C---->
+C**** INTF
+C
+C Purpose
+C -------
+C
+C Interpolate input field...
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTF( INGRIB,INLEN,FLDIN,OUTGRIB,OUTLEN,FLDOUT)
+C
+C Input
+C -----
+C
+C INGRIB - Input field (packed).
+C INLEN - Input field length (words).
+C FLDIN - Input field (unpacked).
+C
+C
+C Output
+C ------
+C
+C OUTGRIB - Output field (packed).
+C OUTLEN - Output field length (words).
+C FLDOUT - Output field (unpacked).
+C
+C
+C Method
+C ------
+C
+C Call interpolation routines.
+C
+C
+C Externals
+C ---------
+C
+C IBASINI - Ensure basic interpolation setup is done.
+C INSANE - Ensure no outrageous values given for interpolation.
+C PDDEFS - Setup interpolation using parameter dependent options.
+C PRECIP - Says if field is to have 'precipitation' treatment
+C INTFAU - Prepare to interpolate unpacked input field.
+C INTFAP - Prepare to interpolate packed input field.
+C HNTFAU - Prepare to interpolate unpacked input field (using
+C Hirlam 12-point for rotations).
+C HNTFAP - Prepare to interpolate packed input field (using
+C Hirlam 12-point for rotations).
+C INTFB - Interpolate input field.
+C INTLOG - Log error message.
+C JDEBUG - Checks environment to switch on/off debug
+C INTWAVE - Interpolate quasi-regular lat/long wave field
+C to a regular lat/long field.
+C OCEANP - Interpolate GRIB ocean field.
+C RESET_C - Reset interpolation handling options using GRIB product.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Aug 1994
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER INGRIB(*),OUTGRIB(*),INLEN,OUTLEN
+ REAL FLDIN(*),FLDOUT(*)
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+#include "current.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 26000 )
+C
+C Local variables
+C
+ INTEGER IWORD, IRET, IORIGLN, ISAME
+ INTEGER LOOP, IIHOLD, IOHOLD
+ DIMENSION IIHOLD(4), IOHOLD(4)
+ INTEGER NUMTABL, NUMPROD
+ LOGICAL L98WAVE, LUNROT
+ LOGICAL LIQUASI
+ CHARACTER*6 YFLAG
+ INTEGER IOS
+ INTEGER LENMED, ISIZE
+C
+C Externals
+C
+ INTEGER IBASINI, PDDEFS, INSANE
+ INTEGER INTFAU, INTFAP, INTFB, HNTFAU, HNTFAP
+ INTEGER INTWAVE2,INTWAVE,INTWAVU, OCEANP, OCEANU, RESET_C
+ INTEGER FIXAREA
+ LOGICAL PRECIP
+
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ INTF = 0
+ IRET = 0
+ IORIGLN = OUTLEN
+ NOMISS = 0
+ LUNROT = .FALSE.
+ OUTLROT = 0
+
+C
+C Save input and output area definitions
+C
+ DO 110 LOOP = 1, 4
+ IIHOLD(LOOP) = NIAREA(LOOP)
+ IOHOLD(LOOP) = NOAREA(LOOP)
+ 110 CONTINUE
+C
+C Check if debug option turned on
+C
+ CALL JDEBUG()
+C
+C If the input is a set of U and V rotated lat/long fields,
+C set return length to zero and do not copy input to output
+C
+ IF( (NIREPR.EQ.JPREGULAR).AND.LWIND.AND.LNOROTA ) THEN
+ OUTLEN = 0
+ IRET = 0
+ CALL INTLOG(JP_DEBUG,
+ X 'INTF: Input U and V rotated lat/long fields ...',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'INTF: ... no further interpolation has been done',JPQUIET)
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Prepare to interpolate input field.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Ensure that basic initialisation has been done
+C
+ IRET = IBASINI(0)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTF: basic initialisation fail.',JPQUIET)
+ INTF = IRET
+ GOTO 900
+ ENDIF
+C
+C Allocate work array ZNFELDI if not already done.
+C
+ LACCUR = .FALSE.
+ IF( NIFORM.EQ.1 ) THEN
+ IF( IZNJDCI.NE.1952999238 ) THEN
+ CALL JMEMHAN( 19, IZNFLDI, JPEXPAND, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_WARN,'INTF: ZNFELDI allocation fail',JPQUIET)
+ INTF = IRET
+ GOTO 900
+ ENDIF
+ IZNJDCI = 1952999238
+ ENDIF
+C
+C Unpack the field headers for packed input.
+C
+ CALL INTLOG(JP_DEBUG, 'INTF: Unpack GRIB headers.',JPQUIET)
+ IRET = 1
+ IWORD = 0
+ CALL GRIBEX(ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X ZNFELDI, JPEXPAND, INGRIB, INLEN, IWORD, 'J',IRET)
+C
+ IF( (IRET.NE.0).AND.(IRET.NE.811) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTF: Failed to unpack GRIB heders.',JPQUIET)
+ INTF = IRET
+ GOTO 900
+ ENDIF
+C
+C Reset interpolation handling options using GRIB values.
+C
+ IRET = RESET_C( ISEC1, ISEC2, ZSEC2, ISEC4)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_WARN,
+ X 'INTF: Setup of interp. options from GRIB failed',JPQUIET)
+ INTF = IRET
+ GOTO 900
+ ENDIF
+C end of NIFORM = 1
+ LACCUR = .TRUE.
+ ENDIF
+C
+CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+cs Regular Gaussian has to be set here for unpacked fields
+ IF( NIFORM.NE.1 ) THEN
+cs this is for merging with grib_api
+ LUVCOMP = .FALSE.
+ IF( NOREPR.EQ.JPNOTYPE ) THEN
+ IF( (NOGAUSO.NE.NOGAUSS).OR.(HOGAUST.NE.'F') ) THEN
+ CALL JGETGG( NOGAUSS, 'F', ROGAUSS, NOLPTS, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTF: JGETGG failed, NOGAUSS = ',NOGAUSS)
+ INTF = IRET
+ GOTO 900
+ ENDIF
+ NOGAUSO = NOGAUSS
+ HOGAUST = 'F'
+ ENDIF
+ NOREPR = JPGAUSSIAN
+ ENDIF
+ ENDIF
+CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+
+C Check that no outrageous values given for interpolation
+C
+ ISAME = INSANE()
+ IF ( ISAME .GT. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTF: Interpolation cannot use given values.',JPQUIET)
+ INTF = ISAME
+ GOTO 900
+ ENDIF
+Cs setting of out Date
+ NODATE = NIDATE
+C
+C If output is same as the input, set return length to zero and
+C do not copy input to output
+C
+ IF( ISAME.EQ.-1 ) THEN
+ OUTLEN = 0
+ IRET = 0
+ CALL INTLOG(JP_DEBUG,
+ X 'INTF: Output is same as the input.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'INTF: No interpolation carried out.',JPQUIET)
+ GOTO 900
+ ENDIF
+C
+C Set precipitation flag if user hasn't
+C
+ IF( .NOT.LPRECSET ) LPREC = PRECIP()
+C
+C Handle packed fields
+C
+C
+C -----------------------------------------------------------------|
+C* Section 3. Use special interpolation for:
+C - an ECMWF wave field.
+C - a reduced latitude-longitude field
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ NUMTABL = NITABLE
+ NUMPROD = NUMTABL*1000 + NIPARAM
+ L98WAVE = (NUMTABL.EQ.140).OR.
+ X (NUMPROD.EQ.131229).OR.
+ X (NUMPROD.EQ.131232).OR.
+ X (NIREPR.EQ.26)
+ IF( L98WAVE ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTF: Wave-type interpolation required.',JPQUIET)
+C
+ OUTLEN = IORIGLN
+ IF( NIFORM.EQ.1 ) THEN
+ IRET = INTWAVE2(INGRIB,INLEN,OUTGRIB,OUTLEN)
+cs IRET = INTWAVE(INGRIB,INLEN,OUTGRIB,OUTLEN)
+ ELSE
+ IRET = INTWAVU(FLDIN,INLEN,FLDOUT,OUTLEN)
+ ENDIF
+ IF( IRET.EQ.0 ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTF: Wave-type interpolated OK.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'INTF: Wave-type interpolation failed.',JPQUIET)
+ ENDIF
+ INTF = IRET
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4. Use special interpolation for an ECMWF ocean field.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ IF( ((ISEC1(24).EQ.1).AND.(ISEC1(37).EQ.4)).OR.LOCEAN ) THEN
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'INTF: Ocean field interpolation required.',JPQUIET)
+C
+ OUTLEN = IORIGLN
+ IF( NIFORM.EQ.1 ) THEN
+ IRET = OCEANP(INGRIB,INLEN,OUTGRIB,OUTLEN)
+ ELSE
+ IRET = OCEANU(FLDIN,INLEN,FLDOUT,OUTLEN)
+ ENDIF
+ IF( IRET.EQ.0 ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTF: Ocean field interpolated OK.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'INTF: Ocean field interpolation failed.',JPQUIET)
+ ENDIF
+ INTF = IRET
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 7. Continue interpolation setup in other cases.
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+ IF( NIFORM.EQ.1 ) THEN
+C
+C Unpack (and rotate) field if necessary
+C
+ IF( LUSEHIR ) THEN
+ IRET = HNTFAP(INGRIB,INLEN)
+ ELSE
+ IRET = INTFAP(INGRIB,INLEN)
+ ENDIF
+C
+C If a bitmap encountered with some missing values (IRET=-4),
+C product cannot be interpolated unless 'missingvalue'
+C specified via INTIN
+C
+ IF( .NOT.LIMISSV ) THEN
+ IF( (IRET.NE.0).AND.(IRET.NE.-2) ) THEN
+ IF( IRET.EQ.-4 ) THEN
+ CALL INTLOG(JP_WARN,
+ X 'INTF: Product has bitmap and missing data.',JPQUIET)
+ CALL INTLOG(JP_WARN,
+ X 'INTF: Try Using INTIN "missingvalue" option',JPQUIET)
+ ENDIF
+ INTF = -4
+ GOTO 900
+ ENDIF
+ ELSE
+ IF( IRET.GT.0 ) THEN
+ CALL INTLOG(JP_WARN,
+ X 'INTF: Problems preparing for interpolation.',JPQUIET)
+ INTF = IRET
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C Handle unpacked fields
+C
+ ELSE
+ LUNROT = .TRUE.
+ IF( LUSEHIR ) THEN
+ IRET = HNTFAU(FLDIN,INLEN)
+ ELSE
+ IRET = INTFAU(FLDIN,INLEN)
+ ENDIF
+ ENDIF
+C
+ IF( (IRET.NE.0).AND.(IRET.NE.-2) ) THEN
+ CALL INTLOG(JP_WARN,'INTF: Prepare interpolate fail',JPQUIET)
+ INTF = IRET
+ GOTO 900
+ ENDIF
+C
+C Field values are now in ZNFELDI.
+C
+C Setup output length same as input GRIB length in case straight
+C copy is done later (ie input is transferred direct to output
+C without postprocessing).
+C
+ OUTLEN = INLEN
+
+C
+C Setup interpolation options based on parameter in field.
+C
+ IRET = PDDEFS()
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTF: Setup interpolation options from param failed',JPQUIET)
+ INTF = IRET
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 8. Interpolate input field.
+C -----------------------------------------------------------------|
+C
+ 700 CONTINUE
+C
+C If all values missing, set flag to ensure all are missing in the
+C interpolated field.
+C
+ IF( ISEC4(1).LT.0 ) NOMISS = ISEC4(1)
+C
+C Perform the interpolation.
+C
+ CALL INTLOG(JP_DEBUG,'INTF: Perform the interpolation.',JPQUIET)
+C
+ OUTLEN = IORIGLN
+ IF( NIFORM.EQ.1 ) THEN
+ IRET = INTFB( INGRIB,INLEN,OUTGRIB,OUTLEN,FLDOUT)
+ ELSE
+ IRET = INTFB( ZNFELDI,INLEN,OUTGRIB,OUTLEN,FLDOUT)
+ ENDIF
+C
+ IF( LUNROT.AND.LNOROTA ) THEN
+ OUTLEN = OUTLROT
+ ENDIF
+C
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTF: Interpolation failed.',JPQUIET)
+ INTF = IRET
+ GOTO 900
+ ELSE
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'INTF: Interpolation finished successfully.',JPQUIET)
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+C Clear change flags for next product processing
+C
+ LCHANGE = .FALSE.
+ LSMCHNG = .FALSE.
+C
+C Restore input and output area definitions
+C
+ DO 910 LOOP = 1, 4
+ NIAREA(LOOP) = IIHOLD(LOOP)
+ NOAAPI(LOOP) = NOAREA(LOOP)
+ NOAREA(LOOP) = IOHOLD(LOOP)
+ 910 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/intf.h b/interpolation/intf.h
new file mode 100755
index 0000000..0f5764a
--- /dev/null
+++ b/interpolation/intf.h
@@ -0,0 +1,30 @@
+C
+C Parameters
+C
+ INTEGER JPEXPAND
+cs PARAMETER (JPEXPAND = 1440 * 721 * 6)
+cs expanded for 0.1X0.1 resolution
+ PARAMETER (JPEXPAND = 3600*1801)
+C
+C Local variables
+C
+ INTEGER ISEC0 (JPGRIB_ISEC0), ISEC1 (JPGRIB_ISEC1)
+ INTEGER ISEC2 (JPGRIB_ISEC2), ISEC3 (JPGRIB_ISEC3)
+ INTEGER ISEC4 (JPGRIB_ISEC4)
+ REAL ZSEC2 (JPGRIB_RSEC2), ZSEC3 (JPGRIB_RSEC3)
+ INTEGER IZNJDCI
+ LOGICAL LUSEHIR
+#ifdef POINTER_64
+ INTEGER*8 IZNFLDI
+#endif
+C
+ POINTER ( IZNFLDI, ZNFELDI )
+C
+C Pointer for dynamically allocated array:
+C
+C REAL ZNFELDI (JPEXPAND)
+C
+ COMMON /INTFCM/ ZSEC2, ZSEC3, IZNFLDI, IZNJDCI,
+ X ISEC0, ISEC1, ISEC2, ISEC3, ISEC4, LUSEHIR
+C
+ REAL ZNFELDI(1)
diff --git a/interpolation/intfa.F b/interpolation/intfa.F
new file mode 100755
index 0000000..562774d
--- /dev/null
+++ b/interpolation/intfa.F
@@ -0,0 +1,182 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTFA( INGRIB,INLEN,FLDIN,OUTGRIB,OUTLEN,FLDOUT)
+C
+C---->
+C**** INTFA
+C
+C Purpose
+C -------
+C
+C Prepare to interpolate input field...
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTFA( INGRIB,INLEN,FLDIN,OUTGRIB,OUTLEN,FLDOUT)
+C
+C Input
+C -----
+C
+C INGRIB - Input field (packed).
+C INLEN - Input field length (words).
+C FLDIN - Input field (unpacked).
+C
+C
+C Output
+C ------
+C
+C OUTGRIB - Output field (packed).
+C OUTLEN - Output field length (words).
+C FLDOUT - Output field (unpacked).
+C
+C
+C Method
+C ------
+C
+C Unpack field if GRIB).
+C
+C
+C Externals
+C ---------
+C
+C IBASINI - Ensure basic interpolation setup is done.
+C GRIBEX - Decode/encode GRIB product.
+C GRSVCK - Turn off GRIB checking
+C RESET_C - Reset interpolation handling options using GRIB product.
+C PDDEFS - Setup interpolation using parameter dependent options.
+C INTLOG - Log error message.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Jan 1995
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+ INTEGER INGRIB(*),OUTGRIB(*),INLEN,OUTLEN
+ REAL FLDIN(*),FLDOUT(*)
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 26100 )
+C
+C Local variables
+C
+ INTEGER IWORD, IERR
+ INTEGER KPR
+ INTEGER LOOP
+C
+C Externals
+ INTEGER IBASINI, RESET_C, PDDEFS
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+ INTFA = 0
+ IERR = 0
+ KPR = 0
+C
+C Check that basic initialisation has been done
+ IERR = IBASINI(0)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFA: basic initialisation fail',JPQUIET)
+ INTFA = IERR
+ GOTO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 2. Decode data from the GRIB code
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Allocate work array ZNFELDI if not already done.
+C
+ IF( IZNJDCI.NE.1952999238 ) THEN
+ CALL JMEMHAN( 19, IZNFLDI, JPEXPAND, 1, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_WARN,'INTFA: ZNFELDI allocation fail',JPQUIET)
+ INTFA = IERR
+ GOTO 900
+ ENDIF
+ IZNJDCI = 1952999238
+ ENDIF
+C
+C If input is a GRIB product
+ If (NIFORM .EQ. 1) THEN
+C
+C Decode data from GRIB code (no checking)
+C
+ IWORD = INLEN
+ IERR = 0
+ CALL GRSVCK(0)
+ IERR = 1
+ ISEC3(2) = NINT(RMISSGV)
+ ZSEC3(2) = RMISSGV
+ CALL GRIBEX(ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X ZNFELDI, JPEXPAND, INGRIB, INLEN, IWORD, 'D',IERR)
+ IF ( IERR .NE. 0) THEN
+ CALL INTLOG(JP_ERROR, 'INTFA: GRIBEX decoding failed.',IERR)
+ INTFA = IERR
+ GOTO 900
+ ENDIF
+C
+C Setup interpolation options from GRIB product characteristics
+ IERR = RESET_C( ISEC1, ISEC2, ZSEC2, ISEC4)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFA: Setup interp. options from GRIB failed.',JPQUIET)
+ INTFA = IERR
+ GOTO 900
+ ENDIF
+C
+C Otherwise, move unpacked values in from user array
+ ELSE
+ DO 210 LOOP = 1, INLEN
+ ZNFELDI( LOOP ) = FLDIN( LOOP )
+ 210 CONTINUE
+C
+ ENDIF
+C
+C Setup interpolation options based on parameter in field.
+ IERR = PDDEFS()
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFA: Setup interp. options from parameter failed.',JPQUIET)
+ INTFA = IERR
+ GOTO 900
+ ENDIF
+C
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+C Clear change flags for next product processing
+C
+ RETURN
+ END
diff --git a/interpolation/intfap.F b/interpolation/intfap.F
new file mode 100755
index 0000000..3950412
--- /dev/null
+++ b/interpolation/intfap.F
@@ -0,0 +1,519 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTFAP(INGRIB,INLEN)
+C
+C---->
+C**** INTFAP
+C
+C Purpose
+C -------
+C
+C Prepare to interpolate input field...
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTFAP(INGRIB,INLEN)
+C
+C Input
+C -----
+C
+C INGRIB - Input field (packed).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C Field unpacked values are in ZNFELDI, rotated if necessary.
+C
+C Returns: 0, if OK. Otherwise, an error occured in interpolation.
+C
+C
+C Method
+C ------
+C
+C Unpack field.
+C
+C Rotate the field values if necessary.
+C
+C Some rotation coefficients cannot be created because the
+C algorithm does not converge for rotations which are smaller
+C than a limit which depends on the spectral truncation.
+C
+C If the rotation is too small, it has to be split into three
+C steps (two forward and one backward).
+C
+C Current know limits are:
+C
+C Truncation Max South pole lat Minimum rotation
+C ---------- ------------------ ----------------
+C 63 -89.5 0.5
+C 106 -85 5.0
+C 159 -77 13.0
+C 213 -68 22.0
+C 319 -51 39.0
+C 511 -30.5 59.5
+C
+C
+C Externals
+C ---------
+C
+C GRIBEX - Decode/encode GRIB product.
+C GRSVCK - Turn off GRIB checking
+C INTLOG - Log error message.
+C INTLOGR - Log error message.
+C RPHI - Rotate a spectral field by longitude.
+#ifdef __uxp__
+C JACOBIF - Rotates spectral coefficients by latitude.
+#else
+C JACOBI - Rotates spectral coefficients by latitude.
+#endif
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Jan 1995
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C J.D.Chambers ECMWF Oct 2000
+C Split rotations if less than minimum for the truncation
+C
+C----<
+C
+C -----------------------------------------------------------------|
+C* Section 0. Variables
+C
+C
+ IMPLICIT NONE
+C
+C Function arguments
+ INTEGER INGRIB(*),INLEN
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 26200 )
+ INTEGER JPLEN, JPNM
+ PARAMETER ( JPNM = JPSTRUNC )
+ PARAMETER ( JPLEN = (JPNM+1)*(JPNM+6) )
+C
+C Local variables
+C
+ REAL POLELAT, POLELON
+ CHARACTER*1 TYPE
+ INTEGER NUMPTS, NGAUSS
+ INTEGER IWORD, IERR, KPR, NBYTES, ITRUNC, LOOP, IRET
+ INTEGER ISIZE
+ DATA ISIZE/0/
+C
+ REAL SWORK
+ DIMENSION SWORK(1)
+#ifdef POINTER_64
+ INTEGER*8 ISWORK
+#endif
+ POINTER ( ISWORK, SWORK)
+C
+ REAL*8 DWORK
+ DIMENSION DWORK(1)
+#ifdef POINTER_64
+ INTEGER*8 IDWORK
+#endif
+ POINTER ( IDWORK, DWORK)
+C
+ REAL*8 DATA
+ DIMENSION DATA(1)
+#ifdef POINTER_64
+ INTEGER*8 IDATA
+#endif
+ POINTER ( IDATA, DATA)
+C
+ SAVE ISIZE, ISWORK, IDWORK, IDATA
+C
+ REAL*8 DLON, DLAT, LATLIM
+ LOGICAL LOK, LSPLIT
+#ifdef CRAY
+ DATA NBYTES/8/
+#else
+ DATA NBYTES/4/
+#endif
+C
+C Externals
+ INTEGER NGROTAT
+#ifdef __uxp__
+ LOGICAL JACOBIF
+ EXTERNAL JACOBIF
+#else
+ LOGICAL JACOBI
+ EXTERNAL JACOBI
+#endif
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+ INTFAP = 0
+ IERR = 0
+ KPR = 0
+C
+C -----------------------------------------------------------------|
+C* Section 2. Decode data from the GRIB code
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Decode data from GRIB code (no checking)
+C
+ IWORD = INLEN
+ IERR = 0
+ CALL GRSVCK(0)
+ IERR = 1
+ ISEC3(2) = NINT(RMISSGV)
+ ZSEC3(2) = RMISSGV
+ CALL GRIBEX(ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X ZNFELDI, JPEXPAND, INGRIB, INLEN, IWORD, 'D',IERR)
+C
+ IF( IERR.LT.0) THEN
+ IF( (IERR.EQ.-2).OR.(IERR.EQ.-4) ) THEN
+ CALL INTLOG(JP_DEBUG,'INTFAP: Use missing value',JPQUIET)
+ LIMISSV = .TRUE.
+ ELSE
+ CALL INTLOG(JP_ERROR,'INTFAP: GRIBEX decoding fail.',IERR)
+ INTFAP = IERR
+ GOTO 900
+ ENDIF
+ ELSE IF( IERR.GT.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFAP: GRIBEX decoding failed.',IERR)
+ INTFAP = IERR
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Handle spectral rotation, if necessary.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Is the interpolation from SH with a rotation of the SH first?
+C
+ IF( ((NIREPR.EQ.JPSPHERE).OR.(NIREPR.EQ.JPSPHROT)) .AND.
+ X LNOROTA ) THEN
+C
+C Avoid rotating U or V spectral coefficients
+C
+ IF( (NIPARAM.EQ.131).OR.(NIPARAM.EQ.132) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFAP: Unable to rotate spectral U or V:',NIPARAM)
+ INTFAP = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+C
+C Dynamically allocate memory for workspace.
+C
+C (Note the multiplication by 2 for REAL*8).
+C
+ ISIZE = (2*(JPNM+1)*(JPNM+6))*2
+ CALL JMEMHAN( 11, IDWORK, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFAP: memory allocation fail',IDWORK)
+ INTFAP = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C (Note the multiplication by 2 for REAL*8).
+C
+ ISIZE = JPLEN*2
+ CALL JMEMHAN( 15, IDATA, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFAP: memory allocation fail',IDATA)
+ INTFAP = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ CALL INTLOG(JP_DEBUG,'INTFAP: Rotate SH field.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'INTFAP: South pole latitude ',NOROTA(1))
+ CALL INTLOG(JP_DEBUG,'INTFAP: South pole longitude ',NOROTA(2))
+ IF ( NOREPR.EQ.JPSPHERE ) NOREPR = JPSPHROT
+ IF ( NOREPR.EQ.JPREGULAR ) NOREPR = JPREGROT
+ ITRUNC = ISEC2(2)
+C
+C Some rotation coefficients cannot be created because the
+C algorithm does not converge for rotations which are smaller
+C than a limit which depends on the spectral truncation.
+C
+ IF( ITRUNC.LE.63 ) THEN
+ LATLIM = -89.5
+ ELSE IF( ITRUNC.LE.106 ) THEN
+ LATLIM = -85.0
+ ELSE IF( ITRUNC.LE.159 ) THEN
+ LATLIM = -77.0
+ ELSE IF( ITRUNC.LE.213 ) THEN
+ LATLIM = -68.0
+ ELSE IF( ITRUNC.LE.319 ) THEN
+ LATLIM = -51.0
+ ELSE IF( ITRUNC.LE.511 ) THEN
+#ifdef __uxp__
+ LATLIM = -30.5
+#else
+ LATLIM = -29.5
+#endif
+ ELSE
+ INTFAP = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+ CALL INTLOGR(JP_DEBUG,
+ X 'INTFAP: South pole latitude limit = ',LATLIM)
+C
+ POLELAT = (REAL(NOROTA(1))/JPMULT)
+C
+C If the rotation is too small, it has to be split into three
+C steps (two forward and one backward).
+C
+ LSPLIT = POLELAT.LT.LATLIM
+ IF( LSPLIT ) THEN
+ DLAT = -90.0 - LATLIM
+ CALL INTLOG(JP_DEBUG,
+ X 'INTFAP: Rotation has been split into three steps',JPQUIET)
+ ELSE
+ DLAT = -90.0 - POLELAT
+ ENDIF
+#if (defined CRAY) || (defined REAL_8)
+C
+C Double precision REALs
+C
+ DLON = - REAL(NOROTA(2))/JPMULT
+C
+C Rotate the spectral field by longitude.
+ CALL RPHI( ZNFELDI, ITRUNC, DWORK, DLON)
+C
+C Rotate the spectral field by latitude.
+C
+ IF( LSPLIT ) THEN
+C
+C Two rotations forward ..
+C
+ CALL INTLOGR(JP_DEBUG,
+ X 'INTFAP: Twice forward through angle ', DLAT)
+#if (!defined __uxp__)
+ LOK = JACOBI(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFAP: Spectral rotation failed',JPQUIET)
+ INTFAP = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ LOK = JACOBI(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFAP: Spectral rotation failed',JPQUIET)
+ INTFAP = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#else
+ LOK = JACOBIF(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFAP: Spectral rotation failed',JPQUIET)
+ INTFAP = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ LOK = JACOBIF(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFAP: Spectral rotation failed',JPQUIET)
+ INTFAP = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#endif
+C
+C .. and one backward
+C
+ DLAT = -90.0 - ( (LATLIM*2.0) - POLELAT)
+ DLAT= -DLAT
+ CALL INTLOGR(JP_DEBUG,
+ X 'INTFAP: Once backward through angle ', DLAT)
+ ENDIF
+C
+#if (!defined __uxp__)
+ LOK = JACOBI( ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFAP: Spectral rotation failed',JPQUIET)
+ INTFAP = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#else
+ LOK = JACOBIF(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFAP: Spectral rotation failed',JPQUIET)
+ INTFAP = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#endif
+#else
+C
+C Single precision REALs; so convert to double precision.
+C
+ DLAT = -90.0 - DBLE(NOROTA(1))/JPMULT
+ DLON = - DBLE(NOROTA(2))/JPMULT
+C
+C Expand spectral coefficients to REAL*8
+C
+ DO LOOP = 1, ISEC4(1)
+ DATA(LOOP) = DBLE(ZNFELDI(LOOP))
+ ENDDO
+C
+C Rotate the spectral field by longitude.
+ CALL RPHI( DATA, ITRUNC, DWORK, DLON)
+C
+C Rotate the spectral field by latitude.
+C
+ IF( LSPLIT ) THEN
+C
+C Two rotations forward ..
+C
+ CALL INTLOGR(JP_DEBUG,
+ X 'INTFAP: Twice forward through angle ', DLAT)
+#if (!defined __uxp__)
+ LOK = JACOBI(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFAP: Spectral rotation failed',JPQUIET)
+ INTFAP = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ LOK = JACOBI(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFAP: Spectral rotation failed',JPQUIET)
+ INTFAP = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#else
+ LOK = JACOBIF(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFAP: Spectral rotation failed',JPQUIET)
+ INTFAP = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ LOK = JACOBIF(ZNFELDI, ITRUNC, DWORK, DLAT)
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFAP: Spectral rotation failed',JPQUIET)
+ INTFAP = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#endif
+C
+C .. and one backward
+C
+ DLAT = -90.0 - ( (LATLIM*2.0) - POLELAT)
+ DLAT= -DLAT
+ CALL INTLOGR(JP_DEBUG,
+ X 'INTFAP: Once backward through angle ', DLAT)
+ ENDIF
+C
+#if (!defined __uxp__)
+ LOK = JACOBI( DATA, ITRUNC, DWORK, DLAT)
+#else
+ LOK = JACOBIF(DATA, ITRUNC, DWORK, DLAT)
+#endif
+#endif
+C
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,'INTFAP: Spectral rotation fail',JPQUIET)
+ INTFAP = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#if (!defined CRAY) && (!defined REAL_8)
+C
+C Single precision REALs; repack spectral coefficients to REAL*4.
+C
+ DO LOOP = 1, ISEC4(1)
+ ZNFELDI(LOOP) = SNGL(DATA(LOOP))
+ ENDDO
+#endif
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4. Handle gaussian rotation, if necessary.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C Is the interpolation from gaussian with a rotation of the
+C gaussian first?
+C
+ IF( ((NIREPR.EQ.JPGAUSSIAN).OR.(NIREPR.EQ.JPQUASI)) .AND.
+ X LNOROTA ) THEN
+C
+ CALL INTLOG(JP_DEBUG,'INTFAP: Rotate gaussian field.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'INTFAP: South pole latitude ',NOROTA(1))
+ CALL INTLOG(JP_DEBUG,'INTFAP: South pole longitude ',NOROTA(2))
+C
+C Dynamically allocate memory for workspace.
+C
+ NUMPTS = ISEC4(1)
+ ISIZE = NUMPTS
+ CALL JMEMHAN( 11, ISWORK, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFAP: memory allocation fail',ISWORK)
+ INTFAP = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+C Rotate the gaussian field.
+C
+ POLELAT = REAL(NOROTA(1))/JPMULT
+ POLELON = REAL(NOROTA(2))/JPMULT
+ NGAUSS = ISEC2(3)/2
+ IF( NIREPR.EQ.JPGAUSSIAN ) THEN
+ TYPE = 'F'
+ ELSE
+ TYPE = 'R'
+ ENDIF
+ IRET = NGROTAT(ZNFELDI,SWORK,NUMPTS,POLELAT,POLELON,TYPE,NGAUSS)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFAP: Gaussian rotation fail',JPQUIET)
+ INTFAP = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+C
+C Move rotated field back into field original array.
+C
+ DO LOOP = 1, NUMPTS
+ ZNFELDI(LOOP) = SWORK(LOOP)
+ ENDDO
+C
+ ENDIF
+C
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/intfau.F b/interpolation/intfau.F
new file mode 100755
index 0000000..78a85f2
--- /dev/null
+++ b/interpolation/intfau.F
@@ -0,0 +1,326 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTFAU(FLDIN,INLEN)
+C
+C---->
+C**** INTFAU
+C
+C Purpose
+C -------
+C
+C Prepare to interpolate input field...
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTFAU( FLDIN,INLEN)
+C
+C Input
+C -----
+C
+C FLDIN - Input field (unpacked).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C Field unpacked values are in ZNFELDI.
+C
+C
+C Method
+C ------
+C
+C Unpack field if GRIB.
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Jan 1995
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER INLEN
+ REAL FLDIN(*)
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 26300 )
+ INTEGER JPLEN, JPNM
+ PARAMETER ( JPNM = JPSTRUNC )
+ PARAMETER ( JPLEN = (JPNM+1)*(JPNM+2) )
+C
+C Local variables
+C
+ REAL POLELAT, POLELON
+ CHARACTER*1 TYPE
+ INTEGER NUMPTS, NGAUSS
+ INTEGER ISIZE, NBYTES, ITRUNC
+ DATA ISIZE/0/
+C
+ REAL SWORK
+ DIMENSION SWORK(1)
+#ifdef POINTER_64
+ INTEGER*8 ISWORK
+#endif
+ POINTER ( ISWORK, SWORK)
+C
+ REAL*8 DWORK
+ DIMENSION DWORK(1)
+#ifdef POINTER_64
+ INTEGER*8 IDWORK
+#endif
+ POINTER ( IDWORK, DWORK )
+C
+ REAL*8 DATA
+ DIMENSION DATA(1)
+#ifdef POINTER_64
+ INTEGER*8 IDATA
+#endif
+ POINTER ( IDATA, DATA)
+C
+ SAVE ISIZE, ISWORK, IDWORK, IDATA
+C
+ REAL*8 DLON, DLAT
+ LOGICAL LOK
+#ifdef CRAY
+ DATA NBYTES/8/
+#else
+ DATA NBYTES/4/
+#endif
+C
+C Externals
+ INTEGER GGROTAT
+#ifdef __uxp__
+ LOGICAL JACOBIF
+ EXTERNAL JACOBIF
+#else
+ LOGICAL JACOBI
+ EXTERNAL JACOBI
+#endif
+ INTEGER IRET
+ INTEGER LOOP
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+ INTFAU = 0
+ IRET = 0
+C
+C ------------------------------------------------------------------
+C* Section 2. Decode data from the GRIB code
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Allocate work array ZNFELDI if not already done.
+C
+ IF( IZNJDCI.NE.1952999238 ) THEN
+ CALL JMEMHAN( 19, IZNFLDI, JPEXPAND, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_WARN,'INTFAU: ZNFELDI allocate fail',JPQUIET)
+ INTFAU = IRET
+ GOTO 900
+ ENDIF
+ IZNJDCI = 1952999238
+ ENDIF
+C
+C Move unpacked values in from user array
+ DO 210 LOOP = 1, INLEN
+ ZNFELDI( LOOP ) = FLDIN( LOOP )
+ 210 CONTINUE
+C
+C ------------------------------------------------------------------
+C* Section 3. Handle spectral rotation, if necessary.
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C Is the interpolation from SH with a rotation of the SH first?
+C
+ IF( ((NIREPR.EQ.JPSPHERE).OR.(NIREPR.EQ.JPSPHROT)) .AND.
+ X LNOROTA ) THEN
+C
+C Avoid rotating U or V spectral coefficients
+C
+ IF( (NIPARAM.EQ.131).OR.(NIPARAM.EQ.132) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFAU: Unable to rotate spectral U or V:',NIPARAM)
+ INTFAU = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+C
+C Dynamically allocate memory for workspace.
+C
+C (Note the multiplication by 2 for REAL*8).
+C
+ NUMPTS = INLEN
+ ISIZE = NUMPTS*2
+ CALL JMEMHAN( 11, IDWORK, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFAU: memory allocation fail',IDWORK)
+ INTFAU = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C (Note the multiplication by 2 for REAL*8).
+C
+ ISIZE = JPLEN*2
+ CALL JMEMHAN( 15, IDATA, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFAU: memory allocation fail',IDATA)
+ INTFAU = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ CALL INTLOG(JP_DEBUG,'INTFAU: Rotate SH field.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'INTFAU: South pole latitude ',NOROTA(1))
+ CALL INTLOG(JP_DEBUG,'INTFAU: South pole longitude ',NOROTA(2))
+ IF ( NOREPR.EQ.JPSPHERE ) NOREPR = JPSPHROT
+ IF ( NOREPR.EQ.JPREGULAR ) NOREPR = JPREGROT
+ ITRUNC = NIRESO
+#if (defined CRAY) || (defined REAL_8)
+ DLAT = -90.0 - REAL(NOROTA(1))/JPMULT
+ DLON = - REAL(NOROTA(2))/JPMULT
+C
+C Rotate the spectral field by longitude.
+ CALL RPHI( ZNFELDI, ITRUNC, DWORK, DLON)
+C
+C Rotate the spectral field by latitude.
+#if (!defined __uxp__)
+ LOK = JACOBI( ZNFELDI, ITRUNC, DWORK, DLAT)
+#else
+ LOK = JACOBIF(ZNFELDI, ITRUNC, DWORK, DLAT)
+#endif
+#else
+ DLAT = -90.0 - DBLE(NOROTA(1))/JPMULT
+ DLON = - DBLE(NOROTA(2))/JPMULT
+C
+C Expand spectral coefficients to REAL*8
+C
+ DO LOOP = 1, NUMPTS
+ DATA(LOOP) = DBLE(ZNFELDI(LOOP))
+ ENDDO
+C
+C Rotate the spectral field by longitude.
+ CALL RPHI( DATA, ITRUNC, DWORK, DLON)
+C
+C Rotate the spectral field by latitude.
+C
+#if (!defined __uxp__)
+ LOK = JACOBI( DATA, ITRUNC, DWORK, DLAT)
+#else
+ LOK = JACOBIF( DATA, ITRUNC, DWORK, DLAT)
+#endif
+#endif
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_ERROR,'INTFAU: Spectral rotation fail',JPQUIET)
+ INTFAU = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+#if (!defined CRAY) && (!defined REAL_8)
+C
+C Repack spectral coefficients to REAL*4.
+C
+ DO LOOP = 1, NUMPTS
+ ZNFELDI(LOOP) = SNGL(DATA(LOOP))
+ ENDDO
+#endif
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 4. Handle gaussian rotation, if necessary.
+C ------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+C Is the interpolation from gaussian with a rotation of the
+C gaussian first?
+C
+ IF( ((NIREPR.EQ.JPGAUSSIAN).OR.(NIREPR.EQ.JPQUASI)) .AND.
+ X LNOROTA ) THEN
+C
+ CALL INTLOG(JP_DEBUG,'INTFAU: Rotate gaussian field.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'INTFAU: South pole latitude ',NOROTA(1))
+ CALL INTLOG(JP_DEBUG,'INTFAU: South pole longitude ',NOROTA(2))
+ IF ( NOREPR.EQ.JPGAUSSIAN ) NOREPR = JPFGGROT
+ IF ( NOREPR.EQ.JPQUASI ) NOREPR = JPQGGROT
+C
+C Dynamically allocate memory for workspace.
+C
+ NUMPTS = INLEN
+ ISIZE = NUMPTS
+ CALL JMEMHAN( 11, ISWORK, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFAU: memory allocation fail',ISWORK)
+ INTFAU = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+C Rotate the gaussian field.
+C
+ POLELAT = REAL(NOROTA(1))/JPMULT
+ POLELON = REAL(NOROTA(2))/JPMULT
+ NGAUSS = NIGAUSS
+ IF( NIREPR.EQ.JPGAUSSIAN ) THEN
+ TYPE = 'F'
+ ELSE
+ TYPE = 'R'
+ ENDIF
+ IRET = GGROTAT(ZNFELDI,SWORK,NUMPTS,POLELAT,POLELON,TYPE,NGAUSS)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFAU: Gaussian rotation fail',JPQUIET)
+ INTFAU = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+C
+C Move rotated field back into field original array.
+C
+ DO LOOP = 1, NUMPTS
+ ZNFELDI(LOOP) = SWORK(LOOP)
+ ENDDO
+ OUTLROT = NUMPTS
+C
+ ENDIF
+C
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+C Clear change flags for next product processing
+C
+ RETURN
+ END
diff --git a/interpolation/intfb.F b/interpolation/intfb.F
new file mode 100755
index 0000000..8989c31
--- /dev/null
+++ b/interpolation/intfb.F
@@ -0,0 +1,1241 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTFB( INGRIB,INLEN,OUTGRIB,OUTLEN,FLDOUT)
+C
+C---->
+C**** INTFB
+C
+C Purpose
+C -------
+C
+C Interpolate input field...
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTFB( INGRIB,INLEN,OUTGRIB,OUTLEN,FLDOUT)
+C
+C Input
+C -----
+C
+C INGRIB - Input field (packed).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C OUTGRIB - Output field (packed).
+C OUTLEN - Output field length (words).
+C FLDOUT - Output field (unpacked).
+C
+C
+C Method
+C ------
+C
+C Call interpolation routines; then repack if GRIB output.
+C
+C Currently, subareas are not supported for reduced gaussian fields.
+C (Works OK; but need to setup values in GRIB product for number of
+C points in each latitude row)
+C
+C
+C Externals
+C ---------
+C
+C IARCNTL - Control interp. quasi reg.Gauss -> Gaussian or lat/long
+C IAGCNTL - Control interpolation reg.Gaussian or lat/long fields.
+C JSH2SH - Changes resolution of a field of spectral coefficients.
+C JALLGP - Converts spectral fields to lat/long grid fields.
+C JALLWN - Converts spectral wind fields to lat/long grids.
+C JSLLGP - Converts strectched spectral fields to lat/long grid fields.
+C JAGGGP - Converts spectral fields to a gaussian grid field.
+C JSGGGP - Converts strectched spectral fields to a gaussian grid field.
+C IBASINI - Ensure basic interpolation setup is done.
+C GRIBEX - Decode/encode GRIB product.
+C GRSVCK - Turn off GRIB checking
+C IGSETUP - Setup GRIB sections for the output product.
+C JMEMHAN - Handles memory allocation.
+C IGLSIZE - Evaluate array sizes for reg. lat/long and area.
+C IGSIZE - Evaluate array sizes for a regular Gaussian.
+C IRSIZE - Evaluate array sizes for a quasi reg Gaussian.
+C FIXAREA - Fixup area definition to correspond to grid definitions
+C ISCRSZ - Calculate number of values in generated field.
+C JDEBUG - Checks environment to switch on/off debug
+C INTLOG - Log error message.
+C INTLOGR - Log error message (real value).
+C OCEANP - Interpolate GRIB ocean field.
+C MKBITMP - Apply a bitmap to a rectangular field.
+C MKFRAME - Create a 'frame' from a rectangular field.
+C DDSTYLE - Create subgrid by selecting pts from rectangular grid.
+C DSSAREA - Fixup field area (dissemination style).
+C INTISL - Interpolate a field using ISLSCP processing.
+C KRG2RG - Interpolate reduced gaussian to reduced gaussian (packed)
+C KRG2RGU - Interpolate reduced gaussian to reduced gaussian (unpacked)
+C KRG2RGD - Interpolate reduced gaussian to reduced gaussian
+c using intermediate interpolation
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Aug 1994
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER INGRIB(*),OUTGRIB(*),INLEN,OUTLEN
+ REAL FLDOUT(*)
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+#include "jparams.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ INTEGER JUNPACK, JPREALB
+ PARAMETER (JPROUTINE = 26400 )
+ INTEGER JPIMISS,CLASMISS,KNEWMISS
+ PARAMETER (JPIMISS = -2147483647)
+ PARAMETER (CLASMISS = 9999)
+ REAL JPZMISS,NEWMISS
+ PARAMETER (JPZMISS = -2.1474836E+09)
+ PARAMETER (JUNPACK = 3000000)
+ PARAMETER (JPREALB = 8)
+C
+C Local variables
+C
+ INTEGER NWEPTS, NNSPTS
+ REAL OLDS, OLDE
+ REAL EW, NS, NORTH, SOUTH, WEST, EAST, RTEMP
+ INTEGER IWORD, IERR, ILENF, ISIZE, IUV, IDISTEP
+ REAL PNORTH, PSOUTH, PWEST, PEAST, PLATINC, PLONINC
+ LOGICAL OIWEGLOBE, OINPOLE, OISPOLE
+ LOGICAL OOWEGLOBE, OONPOLE, OOSPOLE
+ LOGICAL LBITMP,LFRAME,LSTYLE,LGLOBAL,LSAMERS,LIQUASI
+ LOGICAL LOLDLSP, LOLDLSM
+ INTEGER INORTH, ISOUTH, IEAST, IWEST
+ INTEGER HOLDEW, HOLDNS, N_NOWE, N_NONS
+ INTEGER KILN, KITOTAL, KOLN, KOTOTAL, KPR, KERR
+ INTEGER LOOP, LOOPI, NEXT, ISWAP, NTRUNC, NTROLD, NTROLD2
+ INTEGER LENMED
+ INTEGER IOS, ILENS
+ REAL*8 DISSRES
+ REAL TEMP(2048)
+C
+ DATA NTROLD/-1/, NTROLD2/-1/
+ SAVE NTROLD, NTROLD2
+ CHARACTER*1 HTYPE
+ CHARACTER*1 HFUNC
+ CHARACTER*6 YFLAG
+
+#ifdef POINTER_64
+#ifndef FUJITSU
+ INTEGER*8 IZNFLDO
+#endif
+#endif
+ REAL ZNFLDO , RWORK
+ DIMENSION RWORK(JUNPACK)
+ POINTER ( IZNFLDO, ZNFLDO )
+ DIMENSION ZNFLDO( 1 )
+ INTEGER NEWLSM(1), OLDLSM(1)
+ POINTER( NIPNGRB, NEWLSM )
+ POINTER( NIPOGRB, OLDLSM )
+ LOGICAL LFIRST
+ DATA LFIRST/.TRUE./
+ SAVE LFIRST
+C
+C Externals
+C
+ INTEGER IGLSIZE, IGSIZE, IRSIZE, IARCNTL, IAGCNTL, DSSAREA
+ INTEGER IGSETUP, FIXAREA, ISCRSZ, OCEANP, AURESOL, MKBITMP
+ INTEGER INTISL, KRG2RG, KRG2RGU,KRG2RGZ, KRG2RGD, KRG2RGY
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+ INTFB = 0
+ IERR = 0
+C
+C Check if debug option turned on
+ CALL JDEBUG()
+ KPR = NDBG
+C
+ LBITMP = LNOBITMP.AND.
+ X ((NOREPR.EQ.JPREGROT).OR.(NOREPR.EQ.JPREGULAR).OR.
+ X (NOREPR.EQ.JPGAUSSIAN))
+C
+ LFRAME = LNOFRAME.AND.
+ X ((NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPGAUSSIAN).OR.
+ X (NOREPR.EQ.JPREGROT ).OR.(NOREPR.EQ.JPFGGROT ) )
+C
+ LSTYLE = LNOSTYLE.AND.
+ X (NOSTYLE.EQ.JPSDISM).AND.
+ X (NOREPR.EQ.JPREGULAR)
+C
+ IF( .NOT.LWINDSET ) THEN
+ LWIND = ( ((NOTABLE.EQ.128).OR.(NOTABLE.EQ.129)).AND.
+ X ((NOPARAM.EQ.131).OR.(NOPARAM.EQ.132).OR.
+ X (NOPARAM.EQ.165).OR.(NOPARAM.EQ.166)) )
+ ENDIF
+ CALL INTLOG(JP_DEBUG,'INTFB: Wind flag = ', LWIND)
+ IF( LWIND ) THEN
+ IUV = 1
+ ELSE
+ IUV = 0
+ ENDIF
+C
+ IF(NIFORM.EQ.1) THEN
+ ILENS = ISEC4(1)
+ ELSE
+ ILENS = INLEN
+ ENDIF
+
+C
+C If dissemination style selection of grid points is required,
+C adjust the sub-area limits to the dissemination grid.
+C
+ IF( LSTYLE ) THEN
+ IDISTEP = NINT(JPDISTP*PPMULT)
+ EW = NOGRID(1) / PPMULT
+ NS = NOGRID(2) / PPMULT
+ NORTH = REAL(NOAREA(1)) / PPMULT
+ WEST = REAL(NOAREA(2)) / PPMULT
+ SOUTH = REAL(NOAREA(3)) / PPMULT
+ EAST = REAL(NOAREA(4)) / PPMULT
+C
+ IERR = DSSAREA( EW, NS, NORTH, WEST, SOUTH, EAST)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFB: DSSAREA failed:',IERR)
+ INTFB = IERR
+ GOTO 900
+ ENDIF
+C
+ N_NOWE = NINT((EAST-WEST)/EW) + 1
+ N_NONS = NINT((NORTH-SOUTH)/NS) + 1
+C
+ NOAREA(1) = NINT(NORTH * PPMULT)
+ NOAREA(2) = NINT(WEST * PPMULT)
+ NOAREA(3) = NINT(SOUTH * PPMULT)
+ NOAREA(4) = NINT(EAST * PPMULT)
+ ENDIF
+C
+C If Hirlam 12-point rotation involved, it has already been done
+C (in INTFAPH), so just copy values to array for packing.
+C
+ IF( LUSEHIR.AND.LNOROTA ) THEN
+ ISIZE = ISEC4(1)
+ IF( ISIZE.EQ.0 ) ISIZE = OUTLROT
+ CALL JMEMHAN( 3, IZNFLDO, ISIZE, 1, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'INTFB: Get scratch space fail',JPQUIET)
+ INTFB = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+ DO LOOP = 1, ISIZE
+ ZNFLDO(LOOP) = ZNFELDI(LOOP)
+ ENDDO
+ GOTO 700
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Special cases!
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Allocate work array ZNFELDI if not already done.
+C
+ IF( IZNJDCI.NE.1952999238 ) THEN
+ CALL JMEMHAN( 19, IZNFLDI, JPEXPAND, 1, ierr)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFB: znfeldi allocate fail',JPQUIET)
+ INTFB = IERR
+ GOTO 900
+ ENDIF
+ IZNJDCI = 1952999238
+ ENDIF
+C
+C Is the interpolation from SH to grid point
+C
+ IF( ((NIREPR.EQ.JPSPHERE).OR.(NIREPR.EQ.JPSPHROT).OR.
+ X (NIREPR.EQ.JPSTRSH))
+ X .AND.
+ X ((NOREPR.NE.JPSPHERE).AND.(NOREPR.NE.JPSPHROT)) ) THEN
+C
+ NTRUNC = NORESO
+C
+C Check whether a truncation is required before interpolation
+C
+ IF( .NOT.LNORESO ) THEN
+C
+C If user did not supply a truncation value, see whether or
+C not the 'autoresol' flag is set. If not, use the input
+C truncation.
+C
+ IF( LARESOL ) THEN
+ IF( (NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT) ) THEN
+ EW = FLOAT(NOGRID(1))/PPMULT
+ NS = FLOAT(NOGRID(2))/PPMULT
+ ELSE
+ EW = 90.0/FLOAT(NOGAUSS)
+ NS = EW
+ ENDIF
+ NTRUNC = AURESOL(EW,NS)
+ IF( NTRUNC.NE.NTROLD ) THEN
+ NTROLD = NTRUNC
+ CALL INTLOG(JP_WARN,
+ X 'INTFB: Resolution automatically set to ', NTRUNC)
+ ENDIF
+ ELSE
+ NTRUNC = NIRESO
+ ENDIF
+C
+ ELSE
+C
+C
+ ENDIF
+C
+C Check whether the output resolution is greater than the input
+C
+ IF( NTRUNC.GT.NIRESO ) THEN
+C
+C Issue warning if the output resolution was user-supplied
+C
+ IF( .NOT.LARESOL ) THEN
+C
+C Revert to the input truncation
+C
+ IF( NIRESO.NE.NTROLD2 ) THEN
+ CALL INTLOG(JP_WARN,
+ X 'INTFB: spectral -> grid point interpolation',JPQUIET)
+ CALL INTLOG(JP_WARN,
+ X 'INTFB: User supplied resolution = ',NTRUNC)
+ CALL INTLOG(JP_WARN,
+ X 'INTFB: Input field resolution = ',NIRESO)
+ CALL INTLOG(JP_WARN,
+ X 'INTFB: User supplied resolution ignored',JPQUIET)
+ CALL INTLOG(JP_WARN,
+ X 'INTFB: Input field resolution has been used',JPQUIET)
+ NTROLD2 = NIRESO
+ ENDIF
+ NTRUNC = NIRESO
+C
+ ELSE
+C
+C Revert to the input truncation if auto RESOL
+C
+ NTRUNC = NIRESO
+ IF( NTRUNC.NE.NTROLD2 ) THEN
+ NTROLD2 = NTRUNC
+ CALL INTLOG(JP_WARN,
+ X 'INTFB: Automatic resolution selectn too high:',JPQUIET)
+ CALL INTLOG(JP_WARN,
+ X 'INTFB: Resolution reset to input resolution: ',NTRUNC)
+ ENDIF
+ ENDIF
+C
+ ENDIF
+C
+C Truncate if a smaller resolution has been requested
+C
+ IF( NTRUNC.LT.NIRESO ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTFB: Spectral coefficents truncated to ', NTRUNC)
+C
+ ISIZE = (NTRUNC+1)*(NTRUNC+4)
+ CALL JMEMHAN( 3, IZNFLDO, ISIZE, 1, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,
+ X 'INTFB: Get scratch space failed',JPQUIET)
+ INTFB = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Generate spherical harmonics with output truncation
+C
+ CALL SH2SH( ZNFELDI, NIRESO, ZNFLDO, NTRUNC )
+C
+C Move new spherical harmonics to 'input' array
+C
+ DO LOOP = 1, ISIZE
+ ZNFELDI(LOOP) = ZNFLDO(LOOP)
+ ENDDO
+C
+ NIRESO = NTRUNC
+C
+ ENDIF
+C
+ ENDIF
+C
+C Is it an ocean field interpolation?
+C
+c sinisa this is all done in intf
+c IF( (ISEC1(24).EQ.1) .AND.
+c X (ISEC1(37).EQ.4) .AND.
+c X (NIFORM.EQ.1) .AND.
+c X (NOFORM.EQ.1) ) THEN
+c IERR = OCEANP(INGRIB,INLEN,OUTGRIB,OUTLEN)
+c IF( IERR.NE.0 ) THEN
+c CALL INTLOG(JP_ERROR,
+c X 'INTFB: Ocean interpolation failed.',JPQUIET)
+c INTFB = JPROUTINE + 2
+c ELSE
+c CALL INTLOG(JP_DEBUG,
+c X 'INTFB: Ocean interpolation finished successfully.',JPQUIET)
+c ENDIF
+c GOTO 900
+c ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Interpolation spherical harmonics to spherical
+C harmonics
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( ((NIREPR.EQ.JPSPHERE).OR.(NIREPR.EQ.JPSPHROT)) .AND.
+ X ((NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT) ) ) THEN
+C
+C Get scratch space for interpolation
+C
+ CALL INTLOG(JP_DEBUG,'INTFB: SH -> SH, input is ',NIRESO)
+ CALL INTLOG(JP_DEBUG,'INTFB: output is ',NORESO)
+ ISIZE = ISCRSZ()
+ IF( ISIZE.LE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFB: Get scratch space failed.',ISIZE)
+ INTFB = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ CALL JMEMHAN( 3, IZNFLDO, ISIZE, 1, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFB: Get scratch space fail.',JPQUIET)
+ INTFB = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ CALL SH2SH( ZNFELDI, NIRESO, ZNFLDO, NORESO )
+C
+ GOTO 700
+C
+C If not spectral -> spectral transformation, make sure the input
+C and output area definitions have been setup.
+C
+ ELSE
+C
+C Fixup area definition to correspond to grid definitions
+C
+ IF( .NOT.LSTYLE ) THEN
+ IERR = FIXAREA()
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: Fixup area definition failed.',JPQUIET)
+ INTFB = JPROUTINE + 9
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C Setup geographical limits
+C
+ PNORTH = FLOAT( NOAREA(1) ) / PPMULT
+ PWEST = FLOAT( NOAREA(2) ) / PPMULT
+ PSOUTH = FLOAT( NOAREA(3) ) / PPMULT
+ PEAST = FLOAT( NOAREA(4) ) / PPMULT
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 4. Interpolation spherical harmonics to grid point.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ IF( (NIREPR.EQ.JPSPHERE).OR.
+ X (NIREPR.EQ.JPSTRSH) .OR.
+ X (NIREPR.EQ.JPSPHROT) ) THEN
+#ifndef REAL_8
+C
+C Check that double precision floats are in use if spectral
+C resolution is greater than T213
+C
+ IF( NIRESO.GT.213 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: Double precision must be used',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTFB: for spectral resolution ',NIRESO)
+ INTFB = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+#endif
+ CALL INTLOG(JP_DEBUG,'INTFB: SH -> grid point',JPQUIET)
+C
+C Get scratch space for interpolation
+C If dissemination style, space has to be for a 0.5x0.5 grid
+C
+ IF( LSTYLE ) THEN
+c to be consistant with product generation
+ IF(NIRESO.EQ.1279) THEN
+ DISSRES = 0.125
+ ELSEIF(NIRESO.EQ.799) THEN
+ DISSRES = 0.25
+ ELSEIF(NIRESO.EQ.639) THEN
+ DISSRES = 0.25
+ ELSEIF(NIRESO.EQ.511) THEN
+ DISSRES = 0.5
+ ELSEIF(NIRESO.EQ.399) THEN
+ DISSRES = 0.5
+ ELSEIF(NIRESO.EQ.319) THEN
+ DISSRES = 0.5
+ ELSEIF(NIRESO.EQ.255) THEN
+ DISSRES = 0.5
+ ELSEIF(NIRESO.EQ.155) THEN
+ DISSRES = 1.5
+ ELSE
+ DISSRES = NOGRID(1) / PPMULT
+ CALL INTLOG(JP_WARN,'INTFB: Diss resol set to: ',NOGRID(1))
+ ENDIF
+ IDISTEP = NINT(DISSRES*PPMULT)
+C
+ HOLDEW = NOGRID(1)
+ HOLDNS = NOGRID(2)
+ NOGRID(1) = IDISTEP
+ NOGRID(2) = IDISTEP
+ ENDIF
+ ISIZE = ISCRSZ()
+ IF( ISIZE.LE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFB: Get scratch space failed.',ISIZE)
+ INTFB = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ CALL JMEMHAN( 3, IZNFLDO, ISIZE, 1, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFB: Get scratch space fail.',JPQUIET)
+ INTFB = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ IF( LSTYLE ) THEN
+ NOGRID(1) = HOLDEW
+ NOGRID(2) = HOLDNS
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4.1 Interpolation spherical harmonics to grid point.
+C -----------------------------------------------------------------|
+C
+ 410 CONTINUE
+C
+ IF( (NOREPR.EQ.JPREGULAR) .OR. (NOREPR.EQ.JPREGROT) ) THEN
+ CALL INTLOG(JP_DEBUG,'INTFB: SH -> lat/long',JPQUIET)
+C
+C -> latitude/longitude grid
+C If dissemination style, generated grid is 0.5x0.5
+C
+ IF( LSTYLE ) THEN
+ HOLDEW = NOGRID(1)
+ HOLDNS = NOGRID(2)
+ NOGRID(1) = IDISTEP
+ NOGRID(2) = IDISTEP
+ ENDIF
+ PLONINC = FLOAT( NOGRID(1) ) / PPMULT
+ PLATINC = FLOAT( NOGRID(2) ) / PPMULT
+C
+C Special handling for stretched fields
+C
+ IF( RISTRET.NE.0 ) THEN
+ CALL JSLLGP( ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X PLATINC, PLONINC, ZNFLDO, IERR)
+C
+ ELSE
+ IF( LWIND ) THEN
+ CALL JALLWN(ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X PLATINC, PLONINC, ZNFLDO, IERR)
+ ELSE
+ CALL JALLGP(ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X PLATINC, PLONINC, ZNFLDO, IERR)
+ ENDIF
+ ENDIF
+C
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: Interpolation to lat/long field failed.',JPQUIET)
+ INTFB = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+ IF( LSTYLE ) THEN
+ NOGRID(1) = HOLDEW
+ NOGRID(2) = HOLDNS
+ ENDIF
+C
+ GOTO 700
+C
+ ENDIF
+C
+C
+ IF( NOREPR.EQ.JPGAUSSIAN ) THEN
+C
+C -> regular gaussian grid
+C
+ CALL INTLOG(JP_DEBUG,'INTFB: SH -> regular gaussian.',JPQUIET)
+C
+C Is it a user_regular_gaussian (or standard regular gaussian)..
+C
+ IF( LOGIVEL ) THEN
+ HTYPE = 'U'
+ ELSE
+ HTYPE = 'F'
+ ENDIF
+C
+C Special handling for stretched fields
+C
+ IF( RISTRET.NE.0 ) THEN
+ CALL JSGGGP( ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X NOGAUSS, HTYPE, NOLPTS, ZNFLDO, IUV, IERR)
+ ELSE
+ CALL JAGGGP( ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X NOGAUSS, HTYPE, NOLPTS, ZNFLDO, IUV, IERR)
+C
+ ENDIF
+ IF( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: Interpolation to gaussian field failed.',JPQUIET)
+ INTFB = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ GOTO 700
+C
+ ENDIF
+C
+C
+ IF( NOREPR.EQ.JPQUASI ) THEN
+C
+C -> reduced gaussian grid
+C
+ CALL INTLOG(JP_DEBUG,'INTFB: SH -> quasi gaussian.',JPQUIET)
+C
+C Is it a user_reduced_gaussian (or standard reduced gaussian)?
+C
+ IF( LOGIVEP ) THEN
+ HTYPE = 'U'
+ ELSE
+ HTYPE = 'R'
+ ENDIF
+C
+C Special handling for stretched fields
+C
+ IF( RISTRET.NE.0 ) THEN
+ CALL JSGGGP( ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X NOGAUSS, HTYPE, NOLPTS, ZNFLDO, IUV, IERR)
+ ELSE
+ CALL JAGGGP( ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X NOGAUSS, HTYPE, NOLPTS, ZNFLDO, IUV, IERR)
+ ENDIF
+ IF( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: Interpolation to quasi GG field failed.',JPQUIET)
+ INTFB = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ GOTO 700
+C
+ ENDIF
+C
+C Dropthrough => unrecognized output field type
+C
+ IERR = JPROUTINE + 1
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: Unrecognized output field type.',NOREPR)
+ INTFB = IERR
+ GOTO 900
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 5. Interpolate Gaussian grid to grid point.
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+C If Hirlam 12-point rotation involved, it has already been done
+C (in INTFAPH), so just copy values to array for packing.
+C
+ IF( LUSEHIR.AND.LNOROTA ) THEN
+C
+ ISIZE = ISCRSZ()
+ IF( ISIZE.LE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: Get scratch space fail',ISIZE)
+ INTFB = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+ CALL JMEMHAN( 3, IZNFLDO, ISIZE, 1, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,
+ X 'INTFB: Get scratch space failed',JPQUIET)
+ INTFB = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+C
+ DO LOOP = 1, ISIZE
+ ZNFLDO(LOOP) = ZNFELDI(LOOP)
+ ENDDO
+ GOTO 700
+ ENDIF
+C
+C Handle ISLSCP processing
+C
+ IF( LNIISCL ) THEN
+ CALL INTLOG(JP_DEBUG,'INTFB: Using ISLSCP processing',JPQUIET)
+ IERR = INTISL(OLDLSM, INGRIB, NEWLSM, OUTGRIB)
+ IF( IERR.LT.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFB: ISLSCP processing fail',NIGAUSS)
+ INTFB = JPROUTINE + 10
+ GOTO 900
+ ENDIF
+ OUTLEN = (IERR+JPBYTES-1)/JPBYTES
+ GOTO 900
+ ENDIF
+C
+C Reduced gaussian to reduced gaussian
+C
+ LIQUASI = (NIREPR.EQ.JPQUASI)
+C
+ IF( (LIQUASI.AND.(NOREPR.EQ.JPQUASI)) ) THEN
+ IF( LDOUBLE ) THEN
+ CALL INTLOG(JP_DEBUG,'INTFB: RG to RG with intermediate'
+ X ,JPQUIET)
+ IF(NIFORM.EQ.1) THEN
+ IERR = KRG2RGD(INGRIB,OUTGRIB,NOMEGA,NOGAUSS)
+ IF(IERR.LT.0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: KRG2RGD processing failed',JPQUIET)
+ INTFB = JPROUTINE + 10
+ ELSE
+ OUTLEN = (IERR+JPBYTES-1)/JPBYTES
+ ENDIF
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'INTF: RG to RG intermediate unpacked',JPQUIET)
+ IERR = KRG2RGZ(INGRIB,RWORK,NIGAUSS,NOMEGA)
+ IF(IERR.LT.0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: KRG2RGZ processing failed',JPQUIET)
+ INTFB = JPROUTINE + 10
+ GOTO 900
+ ELSE
+ OUTLEN = IERR
+ ENDIF
+C Second step
+ LDOUBLE = .FALSE.
+ IERR = KRG2RGZ(RWORK,FLDOUT,NOMEGA,NOGAUSS)
+ LDOUBLE = .TRUE.
+ IF(IERR.LT.0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: KRG2RGZ processing failed',JPQUIET)
+ INTFB = JPROUTINE + 10
+ GOTO 900
+ ELSE
+ OUTLEN = IERR
+ ENDIF
+
+ ENDIF
+ ELSE
+ IF(NIFORM.EQ.1) THEN
+ CALL INTLOG(JP_DEBUG,'INTFB: RG to RG packed',JPQUIET)
+ IERR = KRG2RG(INGRIB,OUTGRIB,NOGAUSS)
+ IF(IERR.LT.0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: KRG2RG processing failed',JPQUIET)
+ INTFB = JPROUTINE + 10
+ ELSE
+ OUTLEN = (IERR+JPBYTES-1)/JPBYTES
+ ENDIF
+ ELSE
+ CALL INTLOG(JP_DEBUG,'INTFB: RG to RG unpacked',JPQUIET)
+ IERR = KRG2RGU(INGRIB,FLDOUT,NIGAUSS,NOGAUSS)
+ IF(IERR.LT.0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: KRG2RGU processing failed',JPQUIET)
+ INTFB = JPROUTINE + 10
+ ELSE
+ OUTLEN = IERR
+ ENDIF
+ ENDIF
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C Setup flags for input and output fields
+C
+ CALL INTLOG(JP_DEBUG,'INTFB: grid point -> grid point.',JPQUIET)
+ KERR = 1
+ IF( NIREPR .EQ. JPQUASI ) THEN
+ CALL INTLOG(JP_DEBUG,'INTFB: quasi input ',NIGAUSS)
+ IERR = IRSIZE( NIGAUSS, NIAREA, MILLEN, NIWE, NINS, KILN,
+ X KITOTAL, RIGAUSS, OIWEGLOBE, OINPOLE, OISPOLE,
+ X KPR, KERR)
+ ELSE IF( NIREPR.EQ.JPGAUSSIAN ) THEN
+ CALL INTLOG(JP_DEBUG,'INTFB: regular gauss input ',NIGAUSS)
+ IERR = IGSIZE( NIGAUSS, NIAREA, NIWE, NINS, KILN, RIGAUSS,
+ X OIWEGLOBE, OINPOLE, OISPOLE, KPR, KERR)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'INTFB: lat/long input lat ',NIGRID(1))
+ CALL INTLOG(JP_DEBUG,'INTFB: lat/long input long ',NIGRID(2))
+ IERR = IGLSIZE( NIGRID, NIAREA, NIWE, NINS, KILN, OIWEGLOBE,
+ X OINPOLE, OISPOLE, KPR, KERR)
+ ENDIF
+C
+ NONS = 0
+ NOWE = 0
+ IF( (NOREPR.EQ.JPQUASI).OR.(NOREPR.EQ.JPQGGROT) ) THEN
+ CALL INTLOG(JP_DEBUG,'INTFB: quasi output ',NOGAUSS)
+ IERR = IRSIZE( NOGAUSS, NOAREA, NOLPTS, NOWE, NONS, KOLN,
+ X KOTOTAL, ROGAUSS, OOWEGLOBE, OONPOLE, OOSPOLE,
+ X KPR, KERR)
+ ELSE IF( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPFGGROT) ) THEN
+ CALL INTLOG(JP_DEBUG,'INTFB: regular gauss output ',NOGAUSS)
+ IERR = IGSIZE( NOGAUSS, NOAREA, NOWE, NONS, KOLN, ROGAUSS,
+ X OOWEGLOBE, OONPOLE, OOSPOLE, KPR, KERR)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'INTFB: lat/long output lat ',NOGRID(1))
+ CALL INTLOG(JP_DEBUG,'INTFB: lat/long output long ',NOGRID(2))
+C
+C If dissemination style, space has to be for a 0.5x0.5 grid
+C
+ IF( LSTYLE ) THEN
+ IF( NIREPR.EQ.JPQUASI ) THEN
+ IF(NIGAUSS.EQ.640) THEN
+ DISSRES = 0.125
+ ELSEIF(NIGAUSS.EQ.400) THEN
+ DISSRES = 0.25
+ ELSEIF(NIGAUSS.EQ.320) THEN
+ DISSRES = 0.25
+ ELSEIF(NIGAUSS.EQ.200) THEN
+ DISSRES = 0.5
+ ELSEIF(NIGAUSS.EQ.160) THEN
+ DISSRES = 0.5
+ ELSEIF(NIGAUSS.EQ.128) THEN
+ DISSRES = 0.5
+ ELSEIF(NIGAUSS.EQ.80) THEN
+ DISSRES = 1.5
+ ELSE
+ DISSRES = JPDISTP
+ CALL INTLOG(JP_WARN,'INTFB: Diss resol set to: ',
+ X NINT(DISSRES*PPMULT))
+ ENDIF
+ IDISTEP = NINT(DISSRES*PPMULT)
+ ENDIF
+ HOLDEW = NOGRID(1)
+ HOLDNS = NOGRID(2)
+ If (.Not.LNOROTA) Then ! D.Jokic; Mar-2005
+ NOGRID(1) = IDISTEP
+ NOGRID(2) = IDISTEP
+ End if ! D.Jokic; Mar-2005
+ ENDIF
+ IERR = IGLSIZE( NOGRID, NOAREA, NOWE, NONS, KOLN, OOWEGLOBE,
+ X OONPOLE, OOSPOLE, KPR, KERR)
+ ENDIF
+C
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: Setup of gaussian field flags failed.',IERR)
+ INTFB = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 5.1 Interpolate reduced Gaussian grid to grid point.
+C -----------------------------------------------------------------|
+C
+ 510 CONTINUE
+C
+ ISIZE = ISCRSZ()
+ IF( ISIZE.LE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFB: Get scratch space failed.',ISIZE)
+ INTFB = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ CALL JMEMHAN( 3, IZNFLDO, ISIZE, 1, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFB: Get scratch space failed.',JPQUIET)
+ INTFB = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ IF( NIREPR.EQ.JPQUASI ) THEN
+C
+C If Hirlam 12-point rotation involved, it has already been done
+C (in INTFAPH), so just copy values to array for packing.
+C
+ IF( LUSEHIR.AND.LNOROTA ) THEN
+ DO LOOP = 1, ISIZE
+ ZNFLDO(LOOP) = ZNFELDI(LOOP)
+ ENDDO
+ ELSE
+C Sinisa - if double interpolation involved
+ IF( LDOUBLE ) THEN
+ IF( NOMEGA.EQ.NIGAUSS ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTFB: Input and Intermed. Gaussian number are same',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'INTFB: Double interpolation is not performed',JPQUIET)
+ ELSE
+ IF(NIFORM.EQ.1) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTFB: RG2RG to unpacked - double interpolation',JPQUIET)
+ IERR = KRG2RGY(INGRIB,RWORK,NOMEGA)
+ IF(IERR.LT.0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: KRG2RGY processing failed',JPQUIET)
+ INTFB = JPROUTINE + 10
+ GOTO 900
+ ELSE
+ LENMED = IERR
+ ENDIF
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'INTFB: RG to RG intermediate unpacked',JPQUIET)
+ IERR = KRG2RGZ(INGRIB,RWORK,NIGAUSS,NOMEGA)
+ IF(IERR.LT.0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: KRG2RGZ processing failed',JPQUIET)
+ INTFB = JPROUTINE + 10
+ GOTO 900
+ ELSE
+ LENMED = IERR
+ ENDIF
+ ENDIF
+
+ DO LOOP = 1, LENMED
+ ZNFELDI(LOOP) = RWORK(LOOP)
+ ENDDO
+ IERR = FIXAREA()
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: Fixup area definition failed. DI',JPQUIET)
+ INTFB = JPROUTINE + 9
+ GOTO 900
+ ENDIF
+ CALL INTLOG(JP_DEBUG,
+ X 'INTFB: quasi input double interolation ',NIGAUSS)
+ CALL JGETGG( NIGAUSS, 'R', RIGAUSS, MILLEN, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: JGETGG fail - double interpolation ',JPQUIET)
+ INTFB = JPROUTINE + 10
+ GOTO 900
+ ENDIF
+
+ IERR = IRSIZE( NIGAUSS, NIAREA, MILLEN, NIWE, NINS, KILN,
+ X KITOTAL, RIGAUSS, OIWEGLOBE, OINPOLE, OISPOLE,
+ X KPR, KERR)
+ ENDIF
+ ENDIF
+C
+C If reduced gaussian to regular gaussian of same resolution,
+C turn off the land-sea mask processing temporarily
+C
+ LSAMERS = (NIGAUSS.EQ.NOGAUSS)
+ LOLDLSM = LSM
+ LOLDLSP = LSMPAR
+ IF( (LIQUASI.AND.(NOREPR.EQ.JPGAUSSIAN).AND.LSAMERS) ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTFB: turn off any LSM processing temporarily ', JPQUIET)
+ LSM = .FALSE.
+ LSMPAR = .FALSE.
+ ENDIF
+ IERR = IARCNTL( ZNFELDI, JPEXPAND, ZNFLDO, ISIZE, KILN,
+ X OIWEGLOBE, OINPOLE, OISPOLE, KOLN, OOWEGLOBE,
+ X OONPOLE, OOSPOLE, KPR ,KERR)
+ LSM = LOLDLSM
+ LSMPAR = LOLDLSP
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: Interpolation from quasi GG field failed',JPQUIET)
+ INTFB = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+C
+ IF( LSTYLE ) THEN
+ NOGRID(1) = HOLDEW
+ NOGRID(2) = HOLDNS
+ ENDIF
+ ENDIF
+C
+ GOTO 700
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 6. Interpolate regular grid point to grid point.
+C -----------------------------------------------------------------|
+C
+ 600 CONTINUE
+C
+ IERR = IAGCNTL( ZNFELDI, JPEXPAND, ZNFLDO, ISIZE, KILN,
+ X OIWEGLOBE, OINPOLE, OISPOLE, KOLN, OOWEGLOBE,
+ X OONPOLE, OOSPOLE, KPR, KERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: Interpolation from regular field failed.',JPQUIET)
+ INTFB = JPROUTINE + 8
+ GOTO 900
+ ENDIF
+C
+ IF( LSTYLE ) THEN
+ NOGRID(1) = HOLDEW
+ NOGRID(2) = HOLDNS
+ ENDIF
+
+
+C -----------------------------------------------------------------|
+C* Section 7. Pack field into GRIB if necessary.
+C -----------------------------------------------------------------|
+C
+ 700 CONTINUE
+C
+C If dissemination 'style' selection has been chosen, select points.
+C
+ IF( LSTYLE ) THEN
+ CALL DDSTYLE(ZNFLDO,IDISTEP,IDISTEP,NOGRID(1),NOGRID(2),IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFB: Wrong requested grid increment for dissemination style'
+ X ,JPQUIET)
+ INTFB = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ NOWE = N_NOWE
+ NONS = N_NONS
+cs to check if it ruin gribex packing
+ ISIZE = NOWE*NONS
+ ENDIF
+C
+C If a 'bitmap' has been specified, build the bitmap
+C
+
+ IF( LFRAME.OR.LBITMP.OR.LIMISSV ) THEN
+ ISEC1(5) = 192
+ ISEC3(2) = NINT(RMISSGV)
+ ZSEC3(2) = RMISSGV
+ ENDIF
+
+ IF( LBITMP ) THEN
+ IERR = MKBITMP(NOWE,NONS,ZNFLDO,RMISSGV)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFB: Problem applying bitmap',JPQUIET)
+ INTFB = IERR
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C If a 'frame' has been specified, build the frame
+C
+ IF( LFRAME ) CALL MKFRAME(NOWE,NONS,ZNFLDO,RMISSGV,NOFRAME)
+
+C
+C If the output is a GRIB product
+C
+ IF( NOFORM.EQ.1 ) THEN
+ CALL INTLOG(JP_DEBUG,'INTFB: pack field for output',JPQUIET)
+C
+C Setup GRIB sections for the output product
+C
+ IERR = IGSETUP( ISEC1, ISEC2, ISEC4 )
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFB: Setup GRIB section fail',JPQUIET)
+ INTFB = IERR
+ GOTO 900
+ ENDIF
+C
+C
+C If there are missing values, set all values to zero
+C
+ IF( NOMISS.NE.0 ) THEN
+ DO LOOP = 1, ISEC2(2)*ISEC2(3)
+ ZNFLDO(LOOP) = 0.0
+ ENDDO
+ ENDIF
+C
+C Make adjustments for 'dissemination style'
+C
+ IF( LNOSTYLE.AND.(NOSTYLE.EQ.JPSDISM) ) THEN
+C
+C Turn off use of ECMWF local definition
+C
+Cjdc ISEC1(24) = 0
+C
+C For regular lat/long or gaussian grids, calculate the grid
+C i-direction increment using truncation
+C
+ IF( (ISEC2(1).NE.50).AND.(ISEC2(1).NE.60).AND.
+ X (ISEC2(1).NE.70).AND.(ISEC2(1).NE.80) ) THEN
+C
+ IF( (ISEC2(1).NE.5).AND.(ISEC2(17).EQ.0) ) THEN
+ IF( NOSTYLE.NE.JPSDISM)
+ X ISEC2(9) = (ISEC2(8) - ISEC2(5)) / (ISEC2(2) - 1)
+ ENDIF
+C
+ ENDIF
+C
+ ENDIF
+C
+C Code data into GRIB
+C
+ ILENF = ISIZE
+ IERR = 1
+C
+C If grid-point output, setup for 2nd order packing if requested.
+C
+ IF( (NOREPR.NE.JPSPHERE) .AND. (NOREPR.NE.JPSPHROT) ) THEN
+ HFUNC = 'C'
+ IF( NOHFUNC.EQ.'K' ) THEN
+ HFUNC = 'K'
+ ISEC4(4) = 64
+ ISEC4(6) = 16
+ ISEC4(9) = 32
+ ISEC4(10) = 16
+ ISEC4(12) = 8
+ ISEC4(13) = 4
+ ISEC4(14) = 0
+ ISEC4(15) = -1
+C
+C
+ IF( NOREPR.EQ.JPQUASI ) THEN
+C
+C Complex packing does not support sub-areas of reduced
+C gaussian grids. If output is reduced gaussian, check if
+C it is global to within a tolerance of 0.1 degrees.
+C
+ LGLOBAL = .TRUE.
+ INORTH = NINT( ROGAUSS(1) * PPMULT )
+ IF( IABS(NOAREA(1)-INORTH).GT.1000) LGLOBAL = .FALSE.
+ ISOUTH = - INORTH
+ IF( IABS(NOAREA(3)-ISOUTH).GT.1000) LGLOBAL = .FALSE.
+ IF( NOAREA(2).NE.0 ) LGLOBAL = .FALSE.
+ IEAST = JP360 - (JP90/NOGAUSS)
+ IF( IABS(NOAREA(4)-IEAST).GT.1000) LGLOBAL = .FALSE.
+C
+C Use simple packing if not global.
+C
+ IF( .NOT. LGLOBAL ) THEN
+ HFUNC = 'C'
+ ISEC4(4) = 0
+ ISEC4(6) = 0
+ ENDIF
+ ENDIF
+C
+ ELSE IF( NOHFUNC.EQ.'S' ) THEN
+ ISEC4(4) = 0
+ ISEC4(6) = 0
+ ENDIF
+C
+ ELSE
+ HFUNC = 'C'
+ IF( NOHFUNC.EQ.'C' ) THEN
+ ISEC2(6) = 2
+ ISEC4(4) = 64
+ ELSE IF( NOHFUNC.EQ.'S' ) THEN
+ ISEC2(6) = 1
+ ISEC4(4) = 0
+ ENDIF
+ ENDIF
+C
+ IF( LIMISSV ) THEN
+ ISEC1(5) = 192
+ ISEC3(2) = NINT(RMISSGV)
+ ZSEC3(2) = RMISSGV
+ ENDIF
+C
+C For interpolated regular lat/long field, flip latitudes if
+C they run from south to north
+C (handles special case , eg KWBC SST fields)
+C
+ IF( LNOGRID.AND.
+ X (NOREPR.EQ.JPREGULAR).AND.
+ X (NOAREA(1).LT.NOAREA(3)) ) THEN
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'INTFB: Flip latitudes to run North to South', JPQUIET)
+ DO LOOP = 1, ISEC2(3)/2
+ NEXT = 1 + (LOOP - 1)*ISEC2(2)
+ ISWAP = (ISEC2(3) - LOOP)*ISEC2(2) + 1
+ DO LOOPI = 1, ISEC2(2)
+ RTEMP = ZNFLDO(ISWAP)
+ ZNFLDO(ISWAP) = ZNFLDO(NEXT)
+ ZNFLDO(NEXT) = RTEMP
+ NEXT = NEXT + 1
+ ISWAP = ISWAP + 1
+ ENDDO
+ ENDDO
+ ENDIF
+C
+ CALL GRIBEX( ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X ZNFLDO,ILENF,OUTGRIB,OUTLEN,IWORD,HFUNC,IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFB: GRIBEX encoding failed.',IERR)
+ INTFB = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+ OUTLEN = IWORD
+C
+C Switch off use of missing value
+C
+ LIMISSV = .FALSE.
+C
+ ELSE
+C
+C Otherwise, move unpacked values to user array
+C
+ DO LOOP = 1, ISIZE
+ FLDOUT( LOOP ) = ZNFLDO( LOOP )
+ ENDDO
+C
+C and return the number of values, the unpacked array length
+C
+ OUTLEN = ISIZE
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+C Clear change flags for next product processing
+C
+ LCHANGE = .FALSE.
+ LSMCHNG = .FALSE.
+C
+ RETURN
+ END
diff --git a/interpolation/intfbp.F b/interpolation/intfbp.F
new file mode 100755
index 0000000..edfbe82
--- /dev/null
+++ b/interpolation/intfbp.F
@@ -0,0 +1,467 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTFBP( INGRIB,INLEN,OUTGRIB,OUTLEN)
+C
+C---->
+C**** INTFBP
+C
+C Purpose
+C -------
+C
+C Interpolate input field...
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTFBP( INGRIB,INLEN,OUTGRIB,OUTLEN)
+C
+C Input
+C -----
+C
+C INGRIB - Input field (packed).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C OUTGRIB - Output field (packed).
+C OUTLEN - Output field length (words).
+C
+C
+C Method
+C ------
+C
+C Call interpolation routines; then repack if GRIB output.
+C
+C Currently, subareas are not supported for reduced gaussian fields.
+C (Works OK; but need to setup values in GRIB product for number of
+C points in each latitude row)
+C
+C
+C Externals
+C ---------
+C
+C IARCNTL - Control interp. quasi reg.Gauss -> Gaussian or lat/long
+C IAGCNTL - Control interpolation reg.Gaussian or lat/long fields.
+C JSH2SH - Changes resolution of a field of spectral coefficients.
+C JALLGP - Converts spectral input fields to lat/long grid fields.
+C JALLWN - Converts spectral input wind fields to lat/long grids.
+C JAGGGP - Converts spectral input fields to a gaussian grid field.
+C IBASINI - Ensure basic interpolation setup is done.
+C GRIBEX - Decode/encode GRIB product.
+C GRSVCK - Turn off GRIB checking
+C RESET_C - Reset interpolation handling options using GRIB product.
+C IGSETUP - Setup GRIB sections for the output product.
+C JMEMHAN - Handles memory allocation.
+C IGLSIZE - Evaluate array sizes for reg. lat/long and area.
+C IGSIZE - Evaluate array sizes for a regular Gaussian.
+C IRSIZE - Evaluate array sizes for a quasi reg Gaussian.
+C FIXAREA - Fixup area definition to correspond to grid definitions
+C ISCRSZ - Calculate number of values in generated field.
+C INTLOG - Log error message.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Aug 1994
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+ INTEGER INGRIB(*),OUTGRIB(*),INLEN,OUTLEN
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 26500 )
+C
+C Local variables
+C
+ CHARACTER*1 HFUNC
+ INTEGER IWORD, IERR, ILENF, ISIZE, IUV
+ REAL PNORTH, PSOUTH, PWEST, PEAST, PLATINC, PLONINC
+ LOGICAL OIWEGLOBE, OINPOLE, OISPOLE
+ LOGICAL OOWEGLOBE, OONPOLE, OOSPOLE
+ INTEGER KILN, KITOTAL, KOLN, KOTOTAL, KPR, KERR
+#ifdef POINTER_64
+ INTEGER*8 IZNFLDO
+#endif
+ REAL ZNFLDO
+ POINTER ( IZNFLDO, ZNFLDO )
+ DIMENSION ZNFLDO( 1 )
+C
+C Externals
+C
+ INTEGER IGLSIZE, IGSIZE, IRSIZE, IARCNTL, IAGCNTL
+ INTEGER IGSETUP, FIXAREA, ISCRSZ
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+ INTFBP = 0
+ IERR = 0
+ KPR = 0
+C
+C Allocate work array ZNFELDI if not already done.
+C
+ IF( IZNJDCI.NE.1952999238 ) THEN
+ CALL JMEMHAN( 19, IZNFLDI, JPEXPAND, 1, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_WARN,'INTFBP: ZNFELDI allocation fail',JPQUIET)
+ INTFBP = IERR
+ GOTO 900
+ ENDIF
+ IZNJDCI = 1952999238
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 3. Interpolation spherical harmonics to spherical
+C harmonics
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF ( ((NIREPR.EQ.JPSPHERE).OR.(NIREPR.EQ.JPSPHROT)) .AND.
+ X ((NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT)) ) THEN
+C
+C Get scratch space for interpolation
+ ISIZE = ISCRSZ()
+ IF ( ISIZE .LE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFBP: Get scratch space failed',ISIZE)
+ INTFBP = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ CALL JMEMHAN( 3, IZNFLDO, ISIZE, 1, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFBP: Get scratch space fail',JPQUIET)
+ INTFBP = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ CALL SH2SH( ZNFELDI, NIRESO, ZNFLDO, NORESO )
+C
+ GOTO 700
+C
+C If not spectral -> spectral transformation, make sure the input
+C and output area definitions have been setup.
+C
+ ELSE
+C
+C Fixup area definition to correspond to grid definitions
+ IERR = FIXAREA()
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFBP: Fixup area definition failed.',JPQUIET)
+ INTFBP = JPROUTINE + 9
+ GOTO 900
+ ENDIF
+C
+C Setup geographical limits
+ PNORTH = FLOAT( NOAREA(1) ) / PPMULT
+ PWEST = FLOAT( NOAREA(2) ) / PPMULT
+ PSOUTH = FLOAT( NOAREA(3) ) / PPMULT
+ PEAST = FLOAT( NOAREA(4) ) / PPMULT
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 4. Interpolation spherical harmonics to grid point.
+C ------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ IF ( (NIREPR.EQ.JPSPHERE).OR.(NIREPR.EQ.JPSPHROT) ) THEN
+C
+C Get scratch space for interpolation
+C
+ ISIZE = ISCRSZ()
+ IF ( ISIZE .LE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFBP: Get scratch space failed',ISIZE)
+ INTFBP = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ CALL JMEMHAN( 3, IZNFLDO, ISIZE, 1, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFBP: Get scratch space fail',JPQUIET)
+ INTFBP = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Setup wind flag
+C
+ IF( .NOT.LWINDSET ) THEN
+ LWIND = ( ( NOTABLE.EQ.128 ).AND.
+ X ((NOPARAM.EQ.131).OR.(NOPARAM.EQ.132)) )
+ ENDIF
+ CALL INTLOG(JP_DEBUG,'INTFBP: Wind flag = ', LWIND)
+ IF ( LWIND ) THEN
+ IUV = 1
+ ELSE
+ IUV = 0
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 4.1 Interpolation spherical harmonics to grid point.
+C ------------------------------------------------------------------
+C
+ 410 CONTINUE
+C
+ IF ( (NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT) ) THEN
+C
+C -> latitude/longitude grid
+C
+ PLONINC = FLOAT( NOGRID(1) ) / PPMULT
+ PLATINC = FLOAT( NOGRID(2) ) / PPMULT
+ IF ( LWIND ) THEN
+ CALL JALLWN( ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X PLATINC, PLONINC, ZNFLDO, IERR)
+ ELSE
+ CALL JALLGP( ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X PLATINC, PLONINC, ZNFLDO, IERR)
+ ENDIF
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFBP: Interpolation of gaussian field failed.',JPQUIET)
+ INTFBP = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+ GOTO 700
+C
+ ENDIF
+C
+C
+ IF ( NOREPR .EQ. JPGAUSSIAN) THEN
+C
+C -> regular gaussian grid
+C
+ CALL JAGGGP( ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X NOGAUSS, 'U', NOLPTS, ZNFLDO, IUV, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFBP: Interpolation of gaussian field failed.',JPQUIET)
+ INTFBP = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ GOTO 700
+C
+ ENDIF
+C
+C
+ IF ( NOREPR .EQ. JPQUASI) THEN
+C
+C -> reduced gaussian grid
+ CALL JAGGGP( ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X NOGAUSS, 'U', NOLPTS, ZNFLDO, IUV, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFBP: Interpolation of gaussian field failed.',JPQUIET)
+ INTFBP = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ GOTO 700
+C
+ ENDIF
+C
+C Dropthrough => unrecognized output field type
+ IERR = JPROUTINE + 1
+ CALL INTLOG(JP_ERROR,
+ X 'INTFBP: Unrecognized output field type.',NOREPR)
+ INTFBP = IERR
+ GOTO 900
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 5. Interpolate Gaussian grid to grid point.
+C ------------------------------------------------------------------
+C
+ 500 CONTINUE
+C
+C Setup flags for input and output fields
+ KERR = 1
+ IF (NIREPR .EQ. JPQUASI) THEN
+ IERR = IRSIZE( NIGAUSS, NIAREA, MILLEN, NIWE, NINS, KILN,
+ X KITOTAL, RIGAUSS, OIWEGLOBE, OINPOLE, OISPOLE,
+ X KPR, KERR)
+ ELSE IF ( NIREPR .EQ. JPGAUSSIAN ) THEN
+ IERR = IGSIZE( NIGAUSS, NIAREA, NIWE, NINS, KILN, RIGAUSS,
+ X OIWEGLOBE, OINPOLE, OISPOLE, KPR, KERR)
+ ELSE
+ IERR = IGLSIZE( NIGRID, NIAREA, NIWE, NINS, KILN, OIWEGLOBE,
+ X OINPOLE, OISPOLE, KPR, KERR)
+ ENDIF
+C
+ NONS = 0
+ NOWE = 0
+ IF (NOREPR .EQ. JPQUASI) THEN
+ IERR = IRSIZE( NOGAUSS, NOAREA, NOLPTS, NOWE, NONS, KOLN,
+ X KOTOTAL, ROGAUSS, OOWEGLOBE, OONPOLE, OOSPOLE,
+ X KPR, KERR)
+ ELSE IF ( NOREPR .EQ. JPGAUSSIAN ) THEN
+ IERR = IGSIZE( NOGAUSS, NOAREA, NOWE, NONS, KOLN, ROGAUSS,
+ X OOWEGLOBE, OONPOLE, OOSPOLE, KPR, KERR)
+ ELSE
+ IERR = IGLSIZE( NOGRID, NOAREA, NOWE, NONS, KOLN, OOWEGLOBE,
+ X OONPOLE, OOSPOLE, KPR, KERR)
+ ENDIF
+C
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFBP: Setup of gaussian field flags failed.',IERR)
+ INTFBP = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+C
+C
+C ------------------------------------------------------------------
+C Section 5.1 Interpolate reduced Gaussian grid to grid point.
+C ------------------------------------------------------------------
+C
+ 510 CONTINUE
+C
+C
+ ISIZE = ISCRSZ()
+ IF ( ISIZE .LE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFBP: Get scratch space failed.',ISIZE)
+ INTFBP = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ CALL JMEMHAN( 3, IZNFLDO, ISIZE, 1, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFBP: Get scratch space fail.',JPQUIET)
+ INTFBP = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ IF (NIREPR .EQ. JPQUASI) THEN
+ IERR = IARCNTL( ZNFELDI, JPEXPAND, ZNFLDO, ISIZE, KILN,
+ X OIWEGLOBE, OINPOLE, OISPOLE, KOLN, OOWEGLOBE,
+ X OONPOLE, OOSPOLE, KPR ,KERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFBP: Interpolation of gaussian field failed.',IERR)
+ INTFBP = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+C
+ GOTO 700
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 6. Interpolate regular grid point to grid point.
+C ------------------------------------------------------------------
+C
+ 600 CONTINUE
+C
+ IERR = IAGCNTL( ZNFELDI, JPEXPAND, ZNFLDO, ISIZE, KILN,
+ X OIWEGLOBE, OINPOLE, OISPOLE, KOLN, OOWEGLOBE,
+ X OONPOLE, OOSPOLE, KPR, KERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFBP: Interpolation of gaussian field failed.',IERR)
+ INTFBP = JPROUTINE + 8
+ GOTO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 7. Pack field into GRIB if necessary.
+C ------------------------------------------------------------------
+C
+ 700 CONTINUE
+C
+C Setup GRIB sections for the output product
+ IERR = IGSETUP( ISEC1, ISEC2, ISEC4 )
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFBP: Setup GRIB sections failed.',IERR)
+ INTFBP = IERR
+ GOTO 900
+ ENDIF
+C
+C Code data into GRIB
+C
+ ILENF = ISIZE
+ IERR = 1
+C
+C If grid-point output, setup for 2nd order packing if requested.
+C
+ IF( (NOREPR.NE.JPSPHERE) .AND. (NOREPR.NE.JPSPHROT) ) THEN
+ HFUNC = 'C'
+ IF( NOHFUNC.EQ.'K' ) THEN
+ HFUNC = 'K'
+ ISEC4(4) = 64
+ ISEC4(6) = 16
+ ISEC4(9) = 32
+ ISEC4(10) = 16
+ ISEC4(12) = 8
+ ISEC4(13) = 4
+ ISEC4(14) = 0
+ ISEC4(15) = -1
+ ELSE IF( NOHFUNC.EQ.'S' ) THEN
+ ISEC4(4) = 0
+ ISEC4(6) = 0
+ ENDIF
+ ELSE
+ HFUNC = 'C'
+ IF( NOHFUNC.EQ.'C' ) THEN
+ ISEC2(6) = 2
+ ISEC4(4) = 64
+ ELSE IF( NOHFUNC.EQ.'S' ) THEN
+ ISEC2(6) = 1
+ ISEC4(4) = 0
+ ENDIF
+ ENDIF
+C
+ IF( LIMISSV ) THEN
+ ISEC1(5) = 192
+ ISEC3(2) = NINT(RMISSGV)
+ ZSEC3(2) = RMISSGV
+ ENDIF
+ CALL GRIBEX( ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X ZNFLDO,ILENF,OUTGRIB,OUTLEN,IWORD,HFUNC,IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFBP: GRIBEX encoding failed.',IERR)
+ INTFBP = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+ OUTLEN = IWORD
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+C Clear change flags for next product processing
+ LCHANGE = .FALSE.
+ LSMCHNG = .FALSE.
+C
+ RETURN
+ END
diff --git a/interpolation/intfbu.F b/interpolation/intfbu.F
new file mode 100755
index 0000000..b5932d6
--- /dev/null
+++ b/interpolation/intfbu.F
@@ -0,0 +1,478 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTFBU( FLDIN,INLEN,FLDOUT,OUTLEN)
+C
+C---->
+C**** INTFBU
+C
+C Purpose
+C -------
+C
+C Interpolate input field...
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTFBU( FLDIN,INLEN,FLDOUT,OUTLEN)
+C
+C Input
+C -----
+C
+C FLDIN - Input field (unpacked).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C FLDOUT - Output field (unpacked).
+C OUTLEN - Output field length (words).
+C
+C
+C Method
+C ------
+C
+C Call interpolation routines; then repack if GRIB output.
+C
+C Currently, subareas are not supported for reduced gaussian fields.
+C (Works OK; but need to setup values in GRIB product for number of
+C points in each latitude row)
+C
+C
+C Externals
+C ---------
+C
+C IARCNTL - Control interp. quasi reg.Gauss -> Gaussian or lat/long
+C IAGCNTL - Control interpolation reg.Gaussian or lat/long fields.
+C JSH2SH - Changes resolution of a field of spectral coefficients.
+C JALLGP - Converts spectral input fields to lat/long grid fields.
+C JALLWN - Converts spectral input wind fields to lat/long grids.
+C JAGGGP - Converts spectral input fields to a gaussian grid field.
+C IBASINI - Ensure basic interpolation setup is done.
+C RESET_C - Reset interpolation handling options using GRIB product.
+C JMEMHAN - Handles memory allocation.
+C IGLSIZE - Evaluate array sizes for reg. lat/long and area.
+C IGSIZE - Evaluate array sizes for a regular Gaussian.
+C IRSIZE - Evaluate array sizes for a quasi reg Gaussian.
+C FIXAREA - Fixup area definition to correspond to grid definitions
+C ISCRSZ - Calculate number of values in generated field.
+C INTLOG - Log error message.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Aug 1994
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+ INTEGER INLEN,OUTLEN
+ REAL FLDIN(*),FLDOUT(*)
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+C
+C Parameters
+ INTEGER JPROUTINE
+ INTEGER JPALLOC, JPSCR16
+ PARAMETER (JPROUTINE = 26600 )
+ PARAMETER (JPALLOC = 1 )
+ PARAMETER (JPSCR16 = 16 )
+C
+C Local variables
+C
+ INTEGER IERR, ISIZE, IUV
+ REAL PNORTH, PSOUTH, PWEST, PEAST, PLATINC, PLONINC
+ REAL EW, NS, NORTH, SOUTH, WEST, EAST
+ REAL HNORTH, HSOUTH, HWEST, HEAST
+ LOGICAL OIWEGLOBE, OINPOLE, OISPOLE
+ LOGICAL OOWEGLOBE, OONPOLE, OOSPOLE
+ LOGICAL LSTYLE
+ INTEGER KILN, KITOTAL, KOLN, KOTOTAL, KPR, KERR
+ INTEGER LOOP
+ INTEGER HOLDEW, HOLDNS, N_NOWE, N_NONS, IDISTEP
+ REAL*8 DISSRES
+#ifdef POINTER_64
+ INTEGER*8 IZNFLDO
+#endif
+ REAL ZNFLDO
+ POINTER ( IZNFLDO, ZNFLDO )
+ DIMENSION ZNFLDO( 1 )
+C
+C Externals
+ INTEGER IGLSIZE, IGSIZE, IRSIZE, IARCNTL, IAGCNTL
+ INTEGER FIXAREA, ISCRSZ
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+ INTFBU = 0
+ IERR = 0
+ KPR = 0
+C
+C Allocate work array ZNFELDI if not already done.
+C
+ IF( IZNJDCI.NE.1952999238 ) THEN
+ CALL JMEMHAN( 19, IZNFLDI, JPEXPAND, 1, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_WARN,'INTFBU: znfeldi allocate fail',JPQUIET)
+ INTFBU = IERR
+ GOTO 900
+ ENDIF
+ IZNJDCI = 1952999238
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 3. Interpolation spherical harmonics to spherical
+C harmonics
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF ( ((NIREPR.EQ.JPSPHERE).OR.(NIREPR.EQ.JPSPHROT)) .AND.
+ X ((NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT)) ) THEN
+
+C Get scratch space for interpolation
+C
+ ISIZE = ISCRSZ()
+ IF ( ISIZE .LE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFBU: Get scratch space failed',ISIZE)
+ INTFBU = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ CALL JMEMHAN( JPSCR16, IZNFLDO, ISIZE, JPALLOC, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFBU: Get scratch space fail',JPQUIET)
+ INTFBU = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ CALL SH2SH( ZNFELDI, NIRESO, ZNFLDO, NORESO )
+C
+ GOTO 700
+C
+C If not spectral -> spectral transformation, make sure the input
+C and output area definitions have been setup.
+C
+ ELSE
+ LSTYLE = LNOSTYLE.AND.
+ X (NOSTYLE.EQ.JPSDISM).AND.
+ X (NOREPR.EQ.JPREGULAR)
+
+ IF( LSTYLE ) THEN
+c to be consistant with product generation
+ IF(NIRESO.EQ.1279) THEN
+ DISSRES = 0.125
+ ELSEIF(NIRESO.EQ.799) THEN
+ DISSRES = 0.25
+ ELSEIF(NIRESO.EQ.639) THEN
+ DISSRES = 0.25
+ ELSEIF(NIRESO.EQ.399) THEN
+ DISSRES = 0.5
+ ELSEIF(NIRESO.EQ.319) THEN
+ DISSRES = 0.5
+ ELSEIF(NIRESO.EQ.255) THEN
+ DISSRES = 0.5
+ ELSEIF(NIRESO.EQ.155) THEN
+ DISSRES = 1.5
+ ELSE
+ DISSRES = NOGRID(1) / PPMULT
+ CALL INTLOG(JP_WARN,'INTFBU: Diss resol set to: ',NOGRID(1))
+ ENDIF
+ IDISTEP = NINT(DISSRES*PPMULT)
+ HOLDEW = NOGRID(1)
+ HOLDNS = NOGRID(2)
+ NOGRID(1) = IDISTEP
+ NOGRID(2) = IDISTEP
+ ENDIF
+C
+C Setup geographical limits
+C
+ PNORTH = FLOAT( NOAREA(1) ) / PPMULT
+ PWEST = FLOAT( NOAREA(2) ) / PPMULT
+ PSOUTH = FLOAT( NOAREA(3) ) / PPMULT
+ PEAST = FLOAT( NOAREA(4) ) / PPMULT
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 4. Interpolation spherical harmonics to grid point.
+C ------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ IF ( (NIREPR.EQ.JPSPHERE).OR.(NIREPR.EQ.JPSPHROT) ) THEN
+C
+C Get scratch space for interpolation
+C
+ ISIZE = ISCRSZ()
+ IF ( ISIZE .LE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFBU: Get scratch space failed',ISIZE)
+ INTFBU = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ CALL JMEMHAN( JPSCR16, IZNFLDO, ISIZE, JPALLOC, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFBU: Get scratch space fail',JPQUIET)
+ INTFBU = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Setup wind flag
+C
+ IF( .NOT.LWINDSET ) THEN
+ LWIND = ( ( NOTABLE.EQ.128 ).AND.
+ X ((NOPARAM.EQ.131).OR.(NOPARAM.EQ.132)) )
+ ENDIF
+ CALL INTLOG(JP_DEBUG,'INTFBU: Wind flag = ', LWIND)
+ IF ( LWIND ) THEN
+ IUV = 1
+ ELSE
+ IUV = 0
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 4.1 Interpolation spherical harmonics to grid point.
+C ------------------------------------------------------------------
+C
+ 410 CONTINUE
+C
+ IF ( (NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT) ) THEN
+C
+C -> latitude/longitude grid
+C
+ PLONINC = FLOAT( NOGRID(1) ) / PPMULT
+ PLATINC = FLOAT( NOGRID(2) ) / PPMULT
+ IF ( LWIND ) THEN
+ CALL JALLWN( ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X PLATINC, PLONINC, ZNFLDO, IERR)
+ ELSE
+ CALL JALLGP( ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X PLATINC, PLONINC, ZNFLDO, IERR)
+ ENDIF
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFBU: Interpolation of gaussian field failed.',JPQUIET)
+ INTFBU = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+ GOTO 700
+C
+ ENDIF
+C
+C
+ IF ( NOREPR .EQ. JPGAUSSIAN) THEN
+C
+C -> regular gaussian grid
+C
+ CALL JAGGGP( ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X NOGAUSS, 'F', NOLPTS, ZNFLDO, IUV, IERR)
+cs X NOGAUSS, 'U', NOLPTS, ZNFLDO, IUV, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFBU: Interpolation of gaussian field failed.',JPQUIET)
+ INTFBU = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ GOTO 700
+C
+ ENDIF
+C
+C
+ IF ( NOREPR .EQ. JPQUASI) THEN
+C
+C -> reduced gaussian grid
+C
+ CALL JAGGGP( ZNFELDI, NIRESO, PNORTH, PSOUTH, PWEST, PEAST,
+ X NOGAUSS, 'U', NOLPTS, ZNFLDO, IUV, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFBU: Interpolation of gaussian field failed.',JPQUIET)
+ INTFBU = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ GOTO 700
+C
+ ENDIF
+C
+C Dropthrough => unrecognized output field type
+C
+ IERR = JPROUTINE + 1
+ CALL INTLOG(JP_ERROR,
+ X 'INTFBU: Unrecognized output field type.',NOREPR)
+ INTFBU = IERR
+ GOTO 900
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 5. Interpolate Gaussian grid to grid point.
+C ------------------------------------------------------------------
+C
+ 500 CONTINUE
+C
+C Setup flags for input and output fields
+C
+ KERR = 1
+ IF (NIREPR .EQ. JPQUASI) THEN
+ IERR = IRSIZE( NIGAUSS, NIAREA, MILLEN, NIWE, NINS, KILN,
+ X KITOTAL, RIGAUSS, OIWEGLOBE, OINPOLE, OISPOLE,
+ X KPR, KERR)
+ ELSE IF ( NIREPR .EQ. JPGAUSSIAN ) THEN
+ IERR = IGSIZE( NIGAUSS, NIAREA, NIWE, NINS, KILN, RIGAUSS,
+ X OIWEGLOBE, OINPOLE, OISPOLE, KPR, KERR)
+ ELSE
+ IERR = IGLSIZE( NIGRID, NIAREA, NIWE, NINS, KILN, OIWEGLOBE,
+ X OINPOLE, OISPOLE, KPR, KERR)
+ ENDIF
+C
+ NONS = 0
+ NOWE = 0
+ IF (NOREPR .EQ. JPQUASI) THEN
+ IERR = IRSIZE( NOGAUSS, NOAREA, NOLPTS, NOWE, NONS, KOLN,
+ X KOTOTAL, ROGAUSS, OOWEGLOBE, OONPOLE, OOSPOLE,
+ X KPR, KERR)
+ ELSE IF ( NOREPR .EQ. JPGAUSSIAN ) THEN
+ IERR = IGSIZE( NOGAUSS, NOAREA, NOWE, NONS, KOLN, ROGAUSS,
+ X OOWEGLOBE, OONPOLE, OOSPOLE, KPR, KERR)
+ ELSE
+ IERR = IGLSIZE( NOGRID, NOAREA, NOWE, NONS, KOLN, OOWEGLOBE,
+ X OONPOLE, OOSPOLE, KPR, KERR)
+ ENDIF
+C
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFBU: Interpolation of gaussian field failed.',IERR)
+ INTFBU = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+C
+C
+C ------------------------------------------------------------------
+C Section 5.1 Interpolate reduced Gaussian grid to grid point.
+C ------------------------------------------------------------------
+C
+ 510 CONTINUE
+C
+C
+ ISIZE = ISCRSZ()
+ IF ( ISIZE .LE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFBU: Get scratch space failed.',ISIZE)
+ INTFBU = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ CALL JMEMHAN( JPSCR16, IZNFLDO, ISIZE, JPALLOC, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFBU: Get scratch space fail.',JPQUIET)
+ INTFBU = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ IF (NIREPR .EQ. JPQUASI) THEN
+ IERR = IARCNTL( ZNFELDI, JPEXPAND, ZNFLDO, ISIZE, KILN,
+ X OIWEGLOBE, OINPOLE, OISPOLE, KOLN, OOWEGLOBE,
+ X OONPOLE, OOSPOLE, KPR ,KERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFBU: Interpolation of gaussian field failed.',IERR)
+ INTFBU = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+C
+ GOTO 700
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 6. Interpolate regular grid point to grid point.
+C ------------------------------------------------------------------
+C
+ 600 CONTINUE
+C
+ IERR = IAGCNTL( ZNFELDI, JPEXPAND, ZNFLDO, ISIZE, KILN,
+ X OIWEGLOBE, OINPOLE, OISPOLE, KOLN, OOWEGLOBE,
+ X OONPOLE, OOSPOLE, KPR, KERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFBU: Interpolation of gaussian field failed.',IERR)
+ INTFBU = JPROUTINE + 8
+ GOTO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 7. Move unpacked values to user array.
+C ------------------------------------------------------------------
+C
+ 700 CONTINUE
+C If dissemination 'style' selection has been chosen, select points.
+C
+ IF( LSTYLE ) THEN
+ NOGRID(1) = HOLDEW
+ NOGRID(2) = HOLDNS
+ CALL DDSTYLE(ZNFLDO,IDISTEP,IDISTEP,NOGRID(1),NOGRID(2),IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTFBU: Wrong requested grid increment for dissemination style'
+ X ,JPQUIET)
+ INTFBU = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ PLONINC = FLOAT( NOGRID(1) ) / PPMULT
+ PLATINC = FLOAT( NOGRID(2) ) / PPMULT
+ PNORTH = FLOAT( NOAREA(1) ) / PPMULT
+ PWEST = FLOAT( NOAREA(2) ) / PPMULT
+ PSOUTH = FLOAT( NOAREA(3) ) / PPMULT
+ PEAST = FLOAT( NOAREA(4) ) / PPMULT
+
+ N_NOWE = NINT((PEAST-PWEST)/PLONINC) + 1
+ N_NONS = NINT((PNORTH-PSOUTH)/PLATINC) + 1
+ NOWE = N_NOWE
+ NONS = N_NONS
+ ISIZE = NOWE*NONS
+ ENDIF
+c
+ DO 710 LOOP = 1, ISIZE
+ FLDOUT( LOOP ) = ZNFLDO( LOOP )
+ 710 CONTINUE
+C
+C Return the number of values, the unpacked array length
+C
+ OUTLEN = ISIZE
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+C Clear change flags for next product processing
+C
+ LCHANGE = .FALSE.
+ LSMCHNG = .FALSE.
+C
+ RETURN
+ END
diff --git a/interpolation/intfc.F b/interpolation/intfc.F
new file mode 100755
index 0000000..b460331
--- /dev/null
+++ b/interpolation/intfc.F
@@ -0,0 +1,125 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTFC( INGRIB,INLEN,FLDIN,OUTGRIB,OUTLEN,FLDOUT)
+C
+C---->
+C**** INTFC
+C
+C Purpose
+C -------
+C
+C Move input field to output field.
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTFC( INGRIB,INLEN,FLDIN,OUTGRIB,OUTLEN,FLDOUT)
+C
+C Input
+C -----
+C
+C INGRIB - Input field (packed).
+C INLEN - Input field length (words).
+C FLDIN - Input field (unpacked).
+C
+C
+C Output
+C ------
+C
+C OUTGRIB - Output field (packed).
+C OUTLEN - Output field length (words).
+C FLDOUT - Output field (unpacked).
+C
+C
+C Method
+C ------
+C
+C Move data (packed or unpacked) without special processing.
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Jan 1995
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+ INTEGER INGRIB(*),OUTGRIB(*),INLEN,OUTLEN
+ REAL FLDIN(*),FLDOUT(*)
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 26700 )
+C
+C Local variables
+C
+ INTEGER LOOP
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+ INTFC = 0
+C
+C ------------------------------------------------------------------
+C* Section 2. Move data from input to output.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C If input is a GRIB product
+ If (NIFORM .EQ. 1) THEN
+C
+C Move packed values to user array
+ DO 210 LOOP = 1, INLEN
+ OUTGRIB( LOOP ) = INGRIB( LOOP )
+ 210 CONTINUE
+C
+ ELSE
+C
+C Otherwise, move unpacked values to user array
+ DO 220 LOOP = 1, INLEN
+ FLDOUT( LOOP ) = FLDIN( LOOP )
+ 220 CONTINUE
+C
+ ENDIF
+C
+C Return the number of values, the unpacked array length
+ OUTLEN = INLEN
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+C Clear change flags for next product processing
+ LCHANGE = .FALSE.
+ LSMCHNG = .FALSE.
+C
+ RETURN
+ END
diff --git a/interpolation/intin.F b/interpolation/intin.F
new file mode 100755
index 0000000..78a24dd
--- /dev/null
+++ b/interpolation/intin.F
@@ -0,0 +1,861 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTIN( HPARN, INTV, REALV, CHARV)
+C
+C---->
+C**** INTIN
+C
+C Purpose
+C -------
+C
+C Change input field parameters in common block.
+C
+C Interface
+C ---------
+C
+C Input
+C -----
+C
+C HPARN - MARS parameter name.
+C INTV - MARS parameter value(s) (Integer).
+C REALV - MARS parameter value(s) (Real).
+C CHARV - MARS parameter value(s) (Character).
+C
+C
+C Method
+C ------
+C
+C Recognise MARS paramter and reset appropriate common
+C variable value(s).
+C
+C Uses environment variable ISLSCP_OLD_LSM to locate old
+C land-sea mask GRIB product file. If the variable is not set,
+C uses /home/ma/emos/data/islscp_old_lsm.
+C
+C
+C Externals
+C ---------
+C
+C JDEBUG - Check if debug switched on.
+C IBASINI - Check basic initialisation of common blocks is done
+C CHEQUAL - Compare two ASCII strings without regard to case.
+C INTLOG - Log error message.
+C JMALLOC - Dynamically allocate memory
+C JFREE - Free dynamically allocated memory
+C GETENV - Get value of an environment variable
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF August 1994.
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 28100)
+C
+C Function arguments
+C
+ CHARACTER*(*) HPARN
+ CHARACTER*(*) CHARV
+ REAL REALV(*)
+ INTEGER INTV(*)
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "current.h"
+#include "intf.h"
+C
+C Local variables
+C
+ INTEGER ITEMP, I, IRET, ILOOP, ILAST, IGSIZE, IASIZE, IBLANK
+ INTEGER NEWGRIB(1), OLDGRIB(1)
+ POINTER( NIPNGRB, NEWGRIB )
+ POINTER( NIPOGRB, OLDGRIB )
+ LOGICAL LFOUND
+ CHARACTER*256 OLDLSM, ISLDEFL
+ CHARACTER*3 NUMBER
+C
+C Externals
+C
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+ LOGICAL CHEQUAL
+ EXTERNAL CHEQUAL, JMALLOC
+C
+ DATA ISLDEFL/'/home/ma/emos/data/islscp_old_lsm'/
+ SAVE ISLDEFL
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ INTIN = 0
+ LFOUND = .FALSE.
+C
+C Check if debug turned on
+ CALL JDEBUG()
+C
+C Ensures basic initialisation of common blocks is done
+ CALL IBASINI(0)
+C
+ CALL INTLOG(JP_DEBUG, 'INTIN: option = ' // HPARN ,JPQUIET)
+C
+C -----------------------------------------------------------------|
+C* Section 2. Decode request
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Request ISLSCP processing
+C
+ IF( CHEQUAL( HPARN, 1, 6, 'islscp') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTIN: islscp = ' // CHARV ,JPQUIET)
+C
+ IF( CHEQUAL( CHARV, 1, 3, 'off' ) ) THEN
+ IF( LNIISCL ) THEN
+ CALL JFREE(NIPOGRB)
+ CALL JFREE(NIPNGRB)
+ NIPOGRS = 0
+ NIPNGRS = 0
+ ENDIF
+ LNIISCL = .FALSE.
+ GOTO 900
+ ENDIF
+C
+ LNIISCL = .TRUE.
+C
+C Pick up the old land-sea mask GRIB product
+C
+ CALL GETENV('ISLSCP_OLD_LSM',OLDLSM)
+ IBLANK = INDEX(OLDLSM, ' ')
+ IF( IBLANK.LT.2 ) THEN
+ IBLANK = INDEX(ISLDEFL, ' ') - 1
+ OLDLSM(1:IBLANK) = ISLDEFL(1:IBLANK)
+ IF( INTV(1).GT.0 ) THEN
+ OLDLSM(IBLANK+1:IBLANK+2) = '_n'
+ WRITE(NUMBER,'(I3.3)') INTV(1)
+ OLDLSM(IBLANK+3:IBLANK+5) = NUMBER(1:3)
+ IBLANK = IBLANK + 5
+ ENDIF
+ ENDIF
+ CALL INTLOG(JP_DEBUG,
+ X 'INTIN: old land-sea mask file name:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'INTIN: ' // OLDLSM(1:IBLANK),JPQUIET)
+C
+ CALL PBOPEN(NISLSCP,OLDLSM,'r',IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: Problem processing islscp option',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: PBOPEN fail for old land-sea mask file',IRET)
+ CALL INTLOG(JP_ERROR,'INTIN: ' // OLDLSM(1:IBLANK),JPQUIET)
+ INTIN = IRET
+ GOTO 900
+ ENDIF
+C
+ CALL PBSIZE(NISLSCP,IGSIZE)
+ IF( IGSIZE.LE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: Problem processing islscp option',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: PBSIZE fail new land-sea mask GRIB product',IGSIZE)
+ INTIN = IGSIZE
+ GOTO 900
+ ENDIF
+C
+ IF( NIPOGRS.LT.IGSIZE ) THEN
+ IF( NIPOGRB.NE.0 ) CALL JFREE(NIPOGRB)
+ NIPOGRS = IGSIZE
+ NIPOGRB = JMALLOC(NIPOGRS)
+#ifdef hpR64
+ NIPOGRB = NIPOGRB/(1024*1024*1024*4)
+#endif
+ IF( NIPOGRB.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: Problem processing islscp option',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: JMALLOC fail old land-sea mask GRIB',JPQUIET)
+ INTIN = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+ CALL PBGRIB(NISLSCP, OLDGRIB, IGSIZE, IASIZE, IRET)
+ IF( (IRET.NE.0).OR.(IGSIZE.NE.IASIZE) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: Problem processing islscp option',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: PBREAD fail old land-sea mask GRIB',IRET)
+ INTIN = IRET
+ GOTO 900
+ ENDIF
+C
+ CALL PBCLOSE(NISLSCP, IRET)
+C
+C Pick up the new land-sea mask GRIB product
+C
+ IBLANK = INDEX(CHARV, ' ') - 1
+ CALL INTLOG(JP_DEBUG,
+ X 'INTIN: new land-sea mask file name:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'INTIN: ' // CHARV,JPQUIET)
+C
+ CALL PBOPEN(NISLSCP,CHARV,'r',IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: Problem processing islscp option',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: PBOPEN fail for new land-sea mask file',IRET)
+ CALL INTLOG(JP_ERROR,'INTIN: ' // CHARV,JPQUIET)
+ INTIN = IRET
+ GOTO 900
+ ENDIF
+C
+ CALL PBSIZE(NISLSCP,IGSIZE)
+ IF( IGSIZE.LE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: Problem processing islscp option',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: PBSIZE fail new land-sea mask GRIB product',IGSIZE)
+ INTIN = IGSIZE
+ GOTO 900
+ ENDIF
+C
+ IF( NIPNGRS.LT.IGSIZE ) THEN
+ IF( NIPNGRB.NE.0 ) CALL JFREE(NIPNGRB)
+ NIPNGRS = IGSIZE
+ NIPNGRB = JMALLOC(NIPNGRS)
+#ifdef hpR64
+ NIPNGRB = NIPNGRB/(1024*1024*1024*4)
+#endif
+ IF( NIPNGRB.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: Problem processing islscp option',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: JMALLOC fail new land-sea mask GRIB',JPQUIET)
+ INTIN = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+ CALL PBGRIB(NISLSCP, NEWGRIB, IGSIZE, IASIZE, IRET)
+ IF( (IRET.NE.0).OR.(IGSIZE.NE.IASIZE) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: Problem processing islscp option',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: PBREAD fail new land-sea mask GRIB',IRET)
+ INTIN = IRET
+ GOTO 900
+ ENDIF
+C
+ CALL PBCLOSE(NISLSCP, IRET)
+ GOTO 900
+C
+ ENDIF
+C
+C Input or reset value used for missing points in bitmapped field.
+C
+ IF( CHEQUAL( HPARN, 1, 12, 'missingvalue') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG,'INTIN: missingvalue = ' // CHARV ,JPQUIET)
+ IF( CHEQUAL( CHARV, 1, 2, 'no') ) THEN
+ IF( LIMISSV ) LCHANGE = .TRUE.
+ LIMISSV = .FALSE.
+ RMISSGV = -55555.0
+ ELSE
+ IF( .NOT.LIMISSV ) LCHANGE = .TRUE.
+ LIMISSV = .TRUE.
+ RMISSGV = REALV(1)
+ ENDIF
+ CALL INTLOGR(JP_DEBUG,'INTIN: missingvalue = ',RMISSGV)
+ GOTO 900
+ ENDIF
+
+C missingval because can not be applied in Emos lib everywhere...
+C
+ IF( CHEQUAL( HPARN, 1, 10, 'missingval') ) THEN
+ LFOUND = .TRUE.
+ LIMISSV = .FALSE.
+ CALL INTLOG(JP_DEBUG,'INTIN: missingval = ' // CHARV ,JPQUIET)
+ IF( CHEQUAL( CHARV, 1, 2, 'no') ) THEN
+ IF( LIMISSV ) LCHANGE = .TRUE.
+ RMISSGV = -55555.0
+ LIMISSA = .FALSE.
+ ELSE
+ IF( .NOT.LIMISSV ) LCHANGE = .TRUE.
+ LIMISSA = .TRUE.
+ RMISSGV = REALV(1)
+ ENDIF
+ CALL INTLOGR(JP_DEBUG,'INTIN: missingval = ',RMISSGV)
+ ISEC1(5) = 192
+ GOTO 900
+ ENDIF
+C
+C Input uselsm.
+C
+ IF ( CHEQUAL( HPARN, 1, 6, 'uselsm') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG,'INTIN: uselsm = ' // CHARV ,JPQUIET)
+ IF ( CHEQUAL( CHARV, 1, 2, 'no') ) THEN
+ IF ( LSM ) THEN
+ LCHANGE = .TRUE.
+ LSMCHNG = .TRUE.
+ ENDIF
+ LSM = .FALSE.
+ ELSE
+ IF ( .NOT. LSM ) THEN
+ LCHANGE = .TRUE.
+ LSMCHNG = .TRUE.
+ ENDIF
+ LSM = .TRUE.
+ ENDIF
+ LSMSET = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Input useprecip.
+C
+ IF ( CHEQUAL( HPARN, 1, 9, 'useprecip') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG,'INTIN: useprecip = ' // CHARV ,JPQUIET)
+ IF ( CHEQUAL( CHARV, 1, 3, 'yes') ) THEN
+ IF ( .NOT. LPREC ) LCHANGE = .TRUE.
+ LPREC = .TRUE.
+ ELSE
+ IF ( LPREC ) LCHANGE = .TRUE.
+ LPREC = .FALSE.
+ ENDIF
+ LPRECSET = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Input usewind.
+C
+ IF ( CHEQUAL( HPARN, 1, 7, 'usewind') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG,'INTIN: usewind = ' // CHARV ,JPQUIET)
+ IF ( CHEQUAL( CHARV, 1, 3, 'yes') ) THEN
+ IF ( .NOT. LWIND ) LCHANGE = .TRUE.
+ LWIND = .TRUE.
+ ELSE
+ IF ( LWIND ) LCHANGE = .TRUE.
+ LWIND = .FALSE.
+ ENDIF
+ LWINDSET = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Input parameter.
+C
+ IF ( CHEQUAL( HPARN, 1, 9, 'parameter') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTIN: parameter = ',INTV(1))
+ IF ( NIPARAM .NE. INTV(1) ) LCHANGE = .TRUE.
+ NIPARAM = INTV(1)
+ GOTO 900
+ ENDIF
+C
+C Input truncation.
+C
+ IF ( CHEQUAL( HPARN, 1, 10, 'truncation') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTIN: truncation = ',INTV(1))
+ IF ( NIREPR .NE. JPSPHERE) THEN
+ LCHANGE = .TRUE.
+ NIGAUSS = 0
+ NIGRID(1) = 0
+ NIGRID(2) = 0
+ NIAREA(1) = 0
+ NIAREA(2) = 0
+ NIAREA(3) = 0
+ NIAREA(4) = 0
+ ENDIF
+ NIREPR = JPSPHERE
+ IF ( NIRESO .NE. INTV(1) ) LCHANGE = .TRUE.
+ NIRESO = INTV(1)
+ GOTO 900
+ ENDIF
+C
+C Input reduced.
+C
+ IF ( CHEQUAL( HPARN, 1, 7, 'reduced') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTIN: reduced = ',INTV(1))
+ IF ( NIGAUSS .NE. INTV(1) ) LCHANGE = .TRUE.
+ NIGAUSS = INTV(1)
+ LNIGAUS = .TRUE.
+ IF ( NIREPR .NE. JPQUASI ) THEN
+ LCHANGE = .TRUE.
+ NIRESO = 0
+ NIGRID(1) = 0
+ NIGRID(2) = 0
+ ENDIF
+ NIREPR = JPQUASI
+ IF( (NIGAUSO.NE.NIGAUSS).OR.(HIGAUST.NE.'R') ) THEN
+ CALL JGETGG( NIGAUSS, 'R', RIGAUSS, MILLEN, IRET)
+ IF ( IRET .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTIN: JGETGG fail - NIGAUSS',JPQUIET)
+ INTIN = IRET
+ GOTO 900
+ ENDIF
+ NIGAUSO = NIGAUSS
+ HIGAUST = 'R'
+ ENDIF
+C
+ NIAREA(1) = INT( RIGAUSS(1) * PPMULT )
+ NIAREA(2) = 0
+ NIAREA(3) = INT( RIGAUSS(NIGAUSS*2) * PPMULT )
+c this gives differnt result from one in the grib header
+ NIAREA(4) = JP360 - JP360/MILLEN(NIGAUSS)
+C
+ NIPCNT = 0
+ Nins = NIGAUSS*2 ! Added by D. Jokic Mar-2005;
+ DO 230 ILOOP = 1, NIGAUSS*2
+ NIPCNT = NIPCNT + MILLEN(ILOOP)
+ 230 CONTINUE
+ GOTO 900
+ ENDIF
+C
+C Input grid.
+C
+ IF ( CHEQUAL( HPARN, 1, 4, 'grid') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOGR(JP_DEBUG, 'INTIN: grid e-w = ',REALV(1))
+ CALL INTLOGR(JP_DEBUG, 'INTIN: grid n-s = ',REALV(2))
+ IF ( NIREPR .NE. JPREGULAR) THEN
+ LCHANGE = .TRUE.
+ NIGAUSS = 0
+ NIRESO = 0
+ ENDIF
+ NIREPR = JPREGULAR
+ DO 210 I = 1, 2
+ ITEMP = INT( REALV(I)*PPMULT)
+ IF ( NIGRID(I) .NE. ITEMP ) LCHANGE = .TRUE.
+ NIGRID(I) = ITEMP
+ 210 CONTINUE
+ GOTO 900
+ ENDIF
+C
+C Reduced lat-lon Input grid.
+C
+ IF ( CHEQUAL( HPARN, 1, 7, 'redu_ll') ) THEN
+ LFOUND = .TRUE.
+cs CALL INTLOGR(JP_DEBUG, 'INTIN: reduced_ll e-w = ',REALV(1))
+ CALL INTLOGR(JP_DEBUG, 'INTIN: reduced_ll n-s = ',REALV(2))
+ IF ( NIREPR .NE. JPREGULAR) THEN
+ LCHANGE = .TRUE.
+ NIGAUSS = 0
+ NIRESO = 0
+ ENDIF
+ NIREPR = JPREDLL
+ NINS = INTV(1)
+ DO 217 I = 1, 2
+ ITEMP = INT( REALV(I)*PPMULT)
+ IF ( NIGRID(I) .NE. ITEMP ) LCHANGE = .TRUE.
+ NIGRID(I) = ITEMP
+ 217 CONTINUE
+ GOTO 900
+ ENDIF
+C
+ IF ( CHEQUAL( HPARN, 1, 5, 'ocean') ) THEN
+ LFOUND = .TRUE.
+ LOCEAN = .TRUE.
+ CALL INTLOGR(JP_DEBUG, 'INTIN: Ocean field',JPQUIET)
+ NIOCO3 = INTV(1)
+ NIOCO4 = INTV(2)
+ NIOCO4F = INTV(3)
+ NIOCO3F = INTV(4)
+ NIOCO4L = INTV(5)
+ NIOCO3L = INTV(6)
+ NIOIINC = INTV(7)
+ NIOJINC = INTV(8)
+ NIOIRGR = INTV(9)
+ NIONOST = INTV(10)
+ NICOORN = INTV(11)
+ NIVCDEF = INTV(12)
+ NILOCAL = 4
+ GOTO 900
+ ENDIF
+
+ IF ( CHEQUAL( HPARN, 1, 5, 'local') ) THEN
+ LFOUND = .TRUE.
+ NILOCAL = INTV(1)
+ CALL INTLOGR(JP_DEBUG, 'INTIN: Local settings',NILOCAL)
+ GOTO 900
+ ENDIF
+c
+ IF ( CHEQUAL( HPARN, 1, 6, 'matrix') ) THEN
+ LFOUND = .TRUE.
+ NIMATR = INTV(1)
+ CALL INTLOGR(JP_DEBUG, 'INTIN: Matrix values',NIMATR)
+ GOTO 900
+ ENDIF
+C
+ IF ( CHEQUAL( HPARN, 1, 11, 'coord_ocean') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOGR(JP_DEBUG, 'INTIN: Ocean field grid Coordinate'
+ X ,JPQUIET)
+ DO 249 ILOOP = 1, NICOORN
+ OCCOOR(ILOOP) = INTV(ILOOP)
+ 249 CONTINUE
+ GOTO 900
+ ENDIF
+C
+ IF ( CHEQUAL( HPARN, 1, 6, 'l_npts') ) THEN
+ LFOUND = .TRUE.
+C
+ DO 247 ILOOP = 1, NINS
+ MILLEN(ILOOP) = INTV(ILOOP)
+ 247 CONTINUE
+ GOTO 900
+ ENDIF
+C
+C Input data format.
+C
+ IF ( CHEQUAL( HPARN, 1, 4, 'form') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTIN: form = ' // CHARV ,JPQUIET)
+ IF ( CHEQUAL( CHARV, 1, 4, 'grib') ) THEN
+ IF ( NIFORM .EQ. 0 ) LCHANGE = .TRUE.
+ NIFORM = 1
+ ELSE
+ IF ( NIFORM .EQ. 1 ) LCHANGE = .TRUE.
+ NIFORM = 0
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C Number of points along latitude and longitude
+C
+ IF ( CHEQUAL( HPARN, 1, 4, 'npts') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTIN: pts along latitude = ',INTV(1))
+ CALL INTLOG(JP_DEBUG, 'INTIN: pts along longitude = ',INTV(2))
+ NIWE = INTV(1)
+ NINS = INTV(2)
+ GOTO 900
+ ENDIF
+
+ IF( CHEQUAL( HPARN, 1, 8, 'accuracy') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTIN: Inpu accuracy = ',INTV(1))
+ NIACC = INTV(1)
+ GOTO 900
+ ENDIF
+C
+C Input level.
+C
+ IF ( CHEQUAL( HPARN, 1, 5, 'level') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTIN: level = ',INTV(1))
+ IF ( NILEVEL .NE. INTV(1) ) LCHANGE = .TRUE.
+ NILEVEL = INTV(1)
+ GOTO 900
+ ENDIF
+C
+C Input Date.
+C
+ IF ( CHEQUAL( HPARN, 1, 4, 'date') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTIN: Date = ',INTV(1))
+ IF ( NIDATE .NE. INTV(1) ) LCHANGE = .TRUE.
+ NIDATE = INTV(1)
+ GOTO 900
+ ENDIF
+C
+C Input level type.
+C
+ IF ( CHEQUAL( HPARN, 1, 7, 'levtype') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTIN: levtype = ',INTV(1))
+ IF ( NILEVT .NE. INTV(1) ) LCHANGE = .TRUE.
+ NILEVT = INTV(1)
+ GOTO 900
+ ENDIF
+C
+C Input table.
+C
+ IF ( CHEQUAL( HPARN, 1, 5, 'table') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTIN: table = ',INTV(1))
+ IF ( NITABLE .NE. INTV(1) ) LCHANGE = .TRUE.
+ NITABLE = INTV(1)
+ GOTO 900
+ ENDIF
+C
+C Input regular (gaussian).
+C
+ IF ( CHEQUAL( HPARN, 1, 7, 'regular') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTIN: regular = ',INTV(1))
+ NIREPR = JPGAUSSIAN
+ IF ( NIGAUSS .NE. INTV(1) ) LCHANGE = .TRUE.
+ NIGAUSS = INTV(1)
+ LNIGAUS = .TRUE.
+ IF ( NIREPR .NE. JPGAUSSIAN) THEN
+ LCHANGE = .TRUE.
+ NIRESO = 0
+ NIGRID(1) = 0
+ NIGRID(2) = 0
+ ENDIF
+ NIREPR = JPGAUSSIAN
+ IF( (NIGAUSO.NE.NIGAUSS).OR.(HIGAUST.NE.'F') ) THEN
+ CALL JGETGG( NIGAUSS, 'F', RIGAUSS, MILLEN, IRET)
+ IF ( IRET .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTIN: JGETGG fail - NIGAUSS',JPQUIET)
+ INTIN = IRET
+ GOTO 900
+ ENDIF
+ NIGAUSO = NIGAUSS
+ HIGAUST = 'F'
+ ENDIF
+C
+ NIAREA(1) = INT( RIGAUSS(1) * PPMULT )
+ NIAREA(2) = 0
+ NIAREA(3) = INT( RIGAUSS(NIGAUSS*2) * PPMULT )
+ NIAREA(4) = JP360 - JP360/MILLEN(NIGAUSS)
+C
+ NIPCNT = 0
+ DO ILOOP = 1, NIGAUSS*2
+ NIPCNT = NIPCNT + MILLEN(ILOOP)
+ ENDDO
+ GOTO 900
+ ENDIF
+C
+C Input area.
+C
+ IF ( CHEQUAL( HPARN, 1, 4, 'area') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOGR(JP_DEBUG, 'INTIN: north = ',REALV(1))
+ CALL INTLOGR(JP_DEBUG, 'INTIN: west = ',REALV(2))
+ CALL INTLOGR(JP_DEBUG, 'INTIN: south = ',REALV(3))
+ CALL INTLOGR(JP_DEBUG, 'INTIN: east = ',REALV(4))
+ DO 220 I = 1, 4
+ ITEMP = INT( REALV(I)*PPMULT)
+ IF ( NIAREA(I) .NE. ITEMP ) LCHANGE = .TRUE.
+ NIAREA(I) = ITEMP
+ 220 CONTINUE
+ GOTO 900
+ ENDIF
+C
+C Input scan.
+C
+ IF ( CHEQUAL( HPARN, 1, 4, 'scan') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTIN: scan = ',INTV(1))
+ IF ( NISCNM .NE. INTV(1) ) LCHANGE = .TRUE.
+ NISCNM = INTV(1)
+ GOTO 900
+ ENDIF
+C
+C Input lsm_param.
+C
+ IF ( CHEQUAL( HPARN, 1, 9, 'lsm_param') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG,'INTIN: lsm_param = ' // CHARV ,JPQUIET)
+ IF ( CHEQUAL( CHARV, 1, 3, 'yes') ) THEN
+ IF ( .NOT. LSMPAR ) LCHANGE = .TRUE.
+ LSMPAR = .TRUE.
+ ELSE
+ IF ( LSMPAR ) LCHANGE = .TRUE.
+ LSMPAR = .FALSE.
+ ENDIF
+ LSMPARSET = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Set of LSM - merging with grib_api
+ IF ( CHEQUAL( HPARN, 1, 6, 'lsmset') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG,'INTIN: lsmset = ' // CHARV ,JPQUIET)
+ IF ( CHEQUAL( CHARV, 1, 2, 'no') ) THEN
+ IF ( LSM ) THEN
+ LCHANGE = .TRUE.
+ LSMCHNG = .TRUE.
+ ENDIF
+ LSM = .FALSE.
+ LSMSET = .TRUE.
+ ELSE
+ IF ( .NOT. LSM ) THEN
+ LCHANGE = .TRUE.
+ LSMCHNG = .TRUE.
+ ENDIF
+ LSM = .TRUE.
+ LSMSET = .FALSE.
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C
+C Input user_regular_gaussian
+C
+C (Ignore the call if the user_regular_gaussian value = 0.)
+ IF ( CHEQUAL( HPARN, 1, 21, 'user_regular_gaussian') ) THEN
+ LFOUND = .TRUE.
+ IF ( NIREPR .NE. JPGAUSSIAN) THEN
+ LCHANGE = .TRUE.
+ NIRESO = 0
+ NIGRID(1) = 0
+ NIGRID(2) = 0
+ ENDIF
+ CALL INTLOG(JP_DEBUG,'INTIN: user_regular_gaussian = ',INTV(1))
+ IF ( NIGAUSS .NE. INTV(1) ) LCHANGE = .TRUE.
+ NIGAUSS = INTV(1)
+ NIREPR = JPGAUSSIAN
+C
+ ILAST = NIGAUSS*2
+ DO 235 ILOOP = 1, ILAST
+ MILLEN(ILOOP) = NOGAUSS*4
+ 235 CONTINUE
+ NIGAUSO = NIGAUSS
+ HIGAUST = 'U'
+ LIGIVEP = .TRUE.
+C
+ GOTO 900
+ ENDIF
+C
+C Input user_reduced_gaussian
+C (Ignore the call if the user_reduced_gaussian value = 0.)
+C
+ IF ( CHEQUAL( HPARN, 1, 21, 'user_reduced_gaussian') ) THEN
+ LFOUND = .TRUE.
+ IF ( NIREPR .NE. JPQUASI ) THEN
+ LCHANGE = .TRUE.
+ NIRESO = 0
+ NIGRID(1) = 0
+ NIGRID(2) = 0
+ ENDIF
+ IF ( INTV(1) .EQ. 0 ) GOTO 900
+ CALL INTLOG(JP_DEBUG,'INTIN: user_reduced_gaussian = ',INTV(1))
+ IF ( NIGAUSS .NE. INTV(1) ) LCHANGE = .TRUE.
+ NIGAUSS = INTV(1)
+ NIREPR = JPQUASI
+ NIGAUSO = NIGAUSS
+ HIGAUST = 'U'
+ GOTO 900
+ ENDIF
+C
+C Input g_pnts loading from grib_api.
+C
+ IF ( CHEQUAL( HPARN, 1, 7, 'ga_pnts') ) THEN
+ LFOUND = .TRUE.
+ IF ( NIGAUSS .LE. 0 ) THEN
+ IRET = JPROUTINE + 1
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: Impossible number of gaussian latitudes.',NIGAUSS)
+ INTIN = IRET
+ GOTO 900
+ ENDIF
+ CALL INTLOG(JP_DEBUG,
+ X 'INTIN: Reduced Gaussian - grib_api ',NIGAUSS)
+C
+cs ILAST = NIGAUSS*2 + 1
+ ILAST = NIGAUSS*2
+ DO 241 ILOOP = 1, ILAST
+ MILLEN(ILOOP) = INTV(ILOOP)
+ 241 CONTINUE
+C
+ NIAREA(4) = JP360 - INT( JP360/MILLEN(NIGAUSS) )
+C
+ NIPCNT = 0
+ DO 251 ILOOP = 1, ILAST
+ NIPCNT = NIPCNT + MILLEN(ILOOP)
+ 251 CONTINUE
+ NIGAUSO = NIGAUSS
+ HIGAUST = 'U'
+ LIGIVEP = .TRUE.
+ GOTO 900
+ ENDIF
+cs end ga
+
+ IF ( CHEQUAL( HPARN, 1, 6, 'g_pnts') ) THEN
+ LFOUND = .TRUE.
+ IF ( NIGAUSS .LE. 0 ) THEN
+ IRET = JPROUTINE + 1
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: Impossible number of gaussian latitudes.',NIGAUSS)
+ INTIN = IRET
+ GOTO 900
+ ENDIF
+C
+ ILAST = NIGAUSS*2 + 1
+ DO 240 ILOOP = 1, NIGAUSS
+ MILLEN(ILOOP) = INTV(ILOOP)
+ ILAST = ILAST - 1
+ MILLEN(ILAST) = INTV(ILOOP)
+ 240 CONTINUE
+C
+ NIAREA(4) = JP360 - INT( JP360/MILLEN(NIGAUSS) )
+C
+ NIPCNT = 0
+ DO 250 ILOOP = 1, NIGAUSS*2
+ NIPCNT = NIPCNT + MILLEN(ILOOP)
+ 250 CONTINUE
+ NIGAUSO = NIGAUSS
+ HIGAUST = 'U'
+ LIGIVEP = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Input g_lats.
+C
+ IF ( CHEQUAL( HPARN, 1, 6, 'g_lats') ) THEN
+ LFOUND = .TRUE.
+ IF ( NIGAUSS .LE. 0 ) THEN
+ IRET = JPROUTINE + 1
+ CALL INTLOG(JP_ERROR,
+ X 'INTIN: Impossible number of gaussian latitudes.',NIGAUSS)
+ INTIN = IRET
+ GOTO 900
+ ENDIF
+C
+ ILAST = NIGAUSS*2 + 1
+ DO 260 ILOOP = 1, NIGAUSS
+ RIGAUSS(ILOOP) = REALV(ILOOP)
+ ILAST = ILAST - 1
+ RIGAUSS(ILAST) = -REALV(ILOOP)
+ 260 CONTINUE
+C
+ NIAREA(1) = INT( RIGAUSS(1) * PPMULT )
+ NIAREA(2) = 0
+ NIAREA(3) = INT( RIGAUSS(NIGAUSS*2) * PPMULT )
+ NIAREA(4) = JP360 - JP360/MILLEN(NIGAUSS)
+ NIGAUSO = NIGAUSS
+ HIGAUST = 'U'
+ LIGIVEL = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+ IF( .NOT. LFOUND ) THEN
+ CALL INTLOG(JP_ERROR, 'INTIN: Unknown keyword used:', JPQUIET)
+ CALL INTLOG(JP_ERROR, HPARN, JPQUIET)
+ INTIN = JPROUTINE + 2
+ ENDIF
+ RETURN
+ END
diff --git a/interpolation/intisl.F b/interpolation/intisl.F
new file mode 100755
index 0000000..b5f8da1
--- /dev/null
+++ b/interpolation/intisl.F
@@ -0,0 +1,329 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTISL(OLDLSM, OLDFLD, NEWLSM, NEWFLD)
+C
+C---->
+C**** INTISL
+C
+C Purpose
+C -------
+C
+C Interpolate a field based on an old land-sea mask to a field
+C based on a different land-sea mask.
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTISL(OLDLSM, OLDFLD, NEWLSM, NEWFLD)
+C
+C Input
+C -----
+C
+C OLDLSM - Old land-sea mask in GRIB format
+C OLDFLD - Old field in GRIB format
+C NEWLSM - New land-sea mask in GRIB format
+C
+C
+C Output
+C ------
+C
+C NEWFLD - New field in GRIB format
+C
+C Function returns:
+C - the size in bytes of the new GRIB product if all is well
+C - -1, otherwise.
+C
+C
+C Method
+C ------
+C
+C Unpack input GRIBS.
+C Create new field and pack it into GRIB format.
+C
+C
+C Externals
+C ---------
+C
+C GRIBEX - Decode and encode GRIB products.
+C NEWISL - Interpolate old field to new using both land-sea masks.
+C JMALLOC - Dynamically allocate memory
+C INTLOG - Log messages
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF August 2000
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER OLDLSM(*), OLDFLD(*), NEWLSM(*), NEWFLD(*)
+C
+#include "parim.h"
+#include "intisl.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Parameters
+C
+ INTEGER JPINTB, JPREALB
+ PARAMETER (JPINTB = 4)
+#ifdef REAL_8
+ PARAMETER (JPREALB = 8)
+#else
+ PARAMETER (JPREALB = 8)
+#endif
+C
+C Local variables
+C
+ INTEGER IXSEC4(512)
+ INTEGER ILSEC0(2),ILSEC1(1024),ILSEC2(1024),ILSEC3(2),ILSEC4(512)
+ INTEGER IFSEC0(2),IFSEC1(1024),IFSEC2(1024),IFSEC3(2),IFSEC4(512)
+ INTEGER IMSEC0(2),IMSEC1(1024),IMSEC2(1024),IMSEC3(2),IMSEC4(512)
+ INTEGER NFSEC0(2),NFSEC1(1024),NFSEC2(1024),NFSEC3(2),NFSEC4(512)
+ INTEGER KLSEC4, KFSEC4, KMSEC4, KPSEC4, NEWTYPE
+#if (!defined __uxp__) && (!defined sgi)
+#ifdef POINTER_64
+ INTEGER*8 IZLSEC4, IZFSEC4, IZMSEC4, IPFSEC4
+#else
+ INTEGER IZLSEC4, IZFSEC4, IZMSEC4, IPFSEC4
+#endif
+#endif
+C
+ REAL ZDUMMY
+ REAL ZLSEC2(1500), ZLSEC3(2), ZLSEC4(1)
+ REAL ZFSEC2(1500), ZFSEC3(2), ZFSEC4(1)
+ REAL ZMSEC2(1500), ZMSEC3(2), ZMSEC4(1)
+ REAL PFSEC2(1500), PFSEC3(2), PFSEC4(1)
+C
+ POINTER( IZLSEC4, ZLSEC4 )
+ POINTER( IZFSEC4, ZFSEC4 )
+ POINTER( IZMSEC4, ZMSEC4 )
+ POINTER( IPFSEC4, PFSEC4 )
+C
+ INTEGER IRET, ILENB, IPUNP, IWORD
+C
+C Externals
+C
+ INTEGER NEWISL
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+ EXTERNAL NEWISL, JMALLOC
+C
+ DATA KLSEC4/0/, KFSEC4/0/, KMSEC4/0/, KPSEC4/0/
+ SAVE KLSEC4, KFSEC4, KMSEC4, KPSEC4
+ SAVE IZLSEC4, IZFSEC4, IZMSEC4, IPFSEC4
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ INTISL = 0
+C
+C -----------------------------------------------------------------|
+C* Section 2. Dynamically allocate memory for the old land-sea mask
+C values and old field values.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Old land-sea mask
+C
+ IRET = 1
+ IPUNP = 1
+ ILENB = NIPOGRS
+ CALL GRIBEX (ILSEC0,ILSEC1,ILSEC2,ZLSEC2,ILSEC3,ZLSEC3,IXSEC4,
+ X ZDUMMY,IPUNP,OLDLSM,ILENB,IWORD,'J',IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'INTISL: Old lsm gribex return code = ',IRET
+ INTISL = -1
+ RETURN
+ ENDIF
+C
+ IF( KLSEC4.LT.(IXSEC4(1)*JPREALB) ) THEN
+ IF( KLSEC4.NE.0 ) THEN
+ CALL JFREE(IZLSEC4)
+ CALL JFREE(IZFSEC4)
+ ENDIF
+ KLSEC4 = IXSEC4(1)*JPREALB
+ KFSEC4 = KLSEC4
+ CALL INTLOG(JP_DEBUG,'INTISL: Allocate old memory = ',KLSEC4)
+ IZLSEC4 = JMALLOC(KLSEC4)
+ IZFSEC4 = JMALLOC(KFSEC4)
+#ifdef hpR64
+ IZLSEC4 = IZLSEC4/(1024*1024*1024*4)
+ IZFSEC4 = IZFSEC4/(1024*1024*1024*4)
+#endif
+ IF( (IZLSEC4.EQ.0).OR.(IZFSEC4.EQ.0) ) THEN
+ CALL INTLOG(JP_ERROR,'INTISL: JMALLOC fail oldies',JPQUIET)
+ INTISL = -1
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+ IRET = 1
+ IPUNP = IXSEC4(1)
+ ILENB = NIPOGRS
+ CALL GRIBEX (ILSEC0,ILSEC1,ILSEC2,ZLSEC2,ILSEC3,ZLSEC3,ILSEC4,
+ X ZLSEC4,IPUNP,OLDLSM,ILENB,IWORD,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'INTISL: Old lsm gribex return code = ',IRET
+ INTISL = -1
+ RETURN
+ ENDIF
+C
+C Old field
+C
+ IRET = 1
+ IPUNP = IXSEC4(1)
+ ILENB = NIPOGRS
+ IF( LIMISSV ) THEN
+ IFSEC3(2) = NINT(RMISSGV)
+ ZFSEC3(2) = RMISSGV
+ ENDIF
+ CALL GRIBEX (IFSEC0,IFSEC1,IFSEC2,ZFSEC2,IFSEC3,ZFSEC3,IFSEC4,
+ X ZFSEC4,IPUNP,OLDFLD,ILENB,IWORD,'D',IRET)
+ IF( ((IRET.EQ.-2).OR.(IRET.EQ.-4)).AND.
+ X (LIMISSV.EQV.(.FALSE.)) ) THEN
+ WRITE(*,*) 'INTISL: Old field has a bitmap'
+ WRITE(*,*) 'INTISL: A missing value must be specified'
+ INTISL = -1
+ RETURN
+ ELSE IF( IRET.GT.0 ) THEN
+ WRITE(*,*) 'INTISL: Old field gribex return code = ',IRET
+ INTISL = -1
+ RETURN
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Dynamically allocate memory for the master land-sea
+C mask values and new field values.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C New land-sea mask
+C
+ IRET = 1
+ IPUNP = 1
+ ILENB = NIPNGRS
+ CALL GRIBEX (IMSEC0,IMSEC1,IMSEC2,ZMSEC2,IMSEC3,ZMSEC3,IXSEC4,
+ X ZDUMMY,IPUNP,NEWLSM,ILENB,IWORD,'J',IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'INTISL: Master lsm gribex return code = ',IRET
+ INTISL = -1
+ RETURN
+ ENDIF
+C
+C Dynamically allocate memory for the master land-sea mask values
+C and new field values
+C
+ IF( KMSEC4.LT.(IXSEC4(1)*JPREALB) ) THEN
+ IF( KMSEC4.NE.0 ) THEN
+ CALL JFREE(IZMSEC4)
+ CALL JFREE(IPFSEC4)
+ ENDIF
+ KMSEC4 = IXSEC4(1)*JPREALB
+ KPSEC4 = KMSEC4
+ CALL INTLOG(JP_DEBUG,'INTISL: Allocate new memory = ',KMSEC4)
+ IZMSEC4 = JMALLOC(KMSEC4)
+ IPFSEC4 = JMALLOC(KPSEC4)
+#ifdef hpR64
+ IZMSEC4 = IZMSEC4/(1024*1024*1024*4)
+ IPFSEC4 = IPFSEC4/(1024*1024*1024*4)
+#endif
+ IF( (IZMSEC4.EQ.0).OR.(IPFSEC4.EQ.0) ) THEN
+ CALL INTLOG(JP_ERROR,'INTISL: JMALLOC fail newies',JPQUIET)
+ INTISL = -1
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+ IRET = 1
+ IPUNP = IXSEC4(1)
+ ILENB = NIPNGRS
+ CALL GRIBEX (IMSEC0,IMSEC1,IMSEC2,ZMSEC2,IMSEC3,ZMSEC3,IMSEC4,
+ X ZMSEC4,IPUNP,NEWLSM,ILENB,IWORD,'D',IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'INTISL: Master lsm gribex return code = ',IRET
+ INTISL = -1
+ RETURN
+ ENDIF
+C
+C Requested field must match the new land-sea mask
+C
+ NEWTYPE = NOREPR
+ IF( NOREPR.EQ.JPQUASI ) NEWTYPE = JPGAUSSIAN
+ IF( (NEWTYPE.NE.IMSEC2(1)).OR.
+ X ((NOREPR.NE.JPQUASI).AND.(IMSEC2(17).NE.0)).OR.
+ X ((NOREPR.EQ.JPQUASI).AND.(IMSEC2(17).NE.1)) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTISL: Land-sea mask not suitable',JPQUIET)
+ INTISL = -1
+ RETURN
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4. Create new field and put in GRIB format
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ IRET = NEWISL(ILSEC2, IMSEC2, ZLSEC4, ZFSEC4, ZMSEC4, PFSEC4)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'INTISL: New field creation failed'
+ INTISL = -1
+ RETURN
+ ENDIF
+C
+ IRET = 1
+ IPUNP = IXSEC4(1)
+ ILENB = NIPNGRS
+C
+C There may be 'missing' values in the new field if the old field
+C has 'missing' values.
+C
+ IF( IFSEC1(5).EQ.192 ) THEN
+ IFSEC1(5) = 192
+ NFSEC3(1) = 0
+ NFSEC3(2) = INT(RMISSGV)
+ PFSEC3(1) = 0.0
+ PFSEC3(2) = RMISSGV
+ ENDIF
+C
+ CALL GRIBEX (IFSEC0,IFSEC1,IMSEC2,ZMSEC2,NFSEC3,PFSEC3,IMSEC4,
+ X PFSEC4,IPUNP,NEWFLD,ILENB,IWORD,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'INTISL: New field gribex return code = ',IRET
+ INTISL = -1
+ RETURN
+ ENDIF
+C
+ INTISL = IWORD * JPINTB
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/intisl.h b/interpolation/intisl.h
new file mode 100755
index 0000000..300e835
--- /dev/null
+++ b/interpolation/intisl.h
@@ -0,0 +1,28 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+#ifndef INTISL_H
+#define INTISL_H
+
+#define MISSING (-999.0)
+#define NJ 3
+#define NPOINTS 23
+#define NGAUSS 10
+#define SEA 0
+#define LAND 1
+#define MASTERTHRESHOLD 0.5
+#define OLDLSMTHRESHOLD 0.5
+#define NWEST 1
+#define NEAST 2
+#define SWEST 3
+#define SEAST 4
+#define NORTH 1
+#define SOUTH 2
+
+#endif
diff --git a/interpolation/intlog.F b/interpolation/intlog.F
new file mode 100755
index 0000000..40a9dd0
--- /dev/null
+++ b/interpolation/intlog.F
@@ -0,0 +1,163 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE INTLOG(KLEVEL, MESSAGE, KNUM)
+C
+C---->
+C**** INTLOG
+C
+C PURPOSE
+C _______
+C
+C This routine logs error messages.
+C
+C
+C INTERFACE
+C _________
+C
+C CALL INTLOG(KLEVEL, MESSAGE, KNUM)
+C
+C
+C Input parameters
+C ________________
+C
+C KLEVEL - Severity level for reported message
+C = 0 for debug
+C = 1 for information
+C = 2 for warning
+C = 3 for error
+C = 4 for fatal
+C MESSAGE - Message text
+C KNUM - Message number
+C
+C
+C Output parameters
+C ________________
+C
+C None.
+C
+C
+C Common block usage
+C __________________
+C
+C LDEBUG in /INTLOGC/ controls display of message
+C = 0 for no display
+C = 1 to display
+C
+C
+C Method
+C ______
+C
+C Prints message and number if debug flag is 'on'.
+C
+C
+C Externals
+C _________
+C
+C INTLOGT - sends any ERROR, FATAL or WARN message to the
+C MARS server.
+C
+C
+C Comments
+C ________
+C
+C LDEBUG is toggled by a call to INTLOGD.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Jul 1995
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers *ECMWF* March 1996
+C Prepare error message for MARS server.
+C
+C
+C----<
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Subroutine arguments.
+C
+ INTEGER KLEVEL, KNUM
+ CHARACTER *(*) MESSAGE
+C
+#include "intlog.h"
+C
+C Local variables.
+C
+ CHARACTER*79 NEWMESS
+ INTEGER NLEV, LOOP
+ CHARACTER*5 TITLE(JP_FATAL+1)
+ DATA TITLE/'DEBUG',
+ X 'INFO ',
+ X 'WARN ',
+ X 'ERROR',
+ X 'FATAL'/
+ INTEGER IRET, ILEN
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Ensure valid level is used.
+ NLEV = KLEVEL + 1
+ IF ( KLEVEL .GT. JP_FATAL) NLEV = JP_FATAL + 1
+C
+ DO LOOP = 1, 79
+ NEWMESS(LOOP:LOOP) = ' '
+ ENDDO
+C
+C ------------------------------------------------------------------
+C* Section 2. Prepare ERROR or FATAL message for MARS server.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ ILEN = LEN(MESSAGE)
+ IF( ILEN.GT.65 ) ILEN = 65
+ NEWMESS(1:ILEN) = MESSAGE(1:ILEN)
+ ILEN = ILEN + 1
+ IF(KNUM.NE.JPQUIET) THEN
+ IF( ABS(KNUM).LT.1000 ) THEN
+ WRITE(NEWMESS(ILEN:),'(I4)') KNUM
+ ELSE IF ( ABS(KNUM).LT.100000 ) THEN
+ WRITE(NEWMESS(ILEN:),'(I7)') KNUM
+ ELSE IF ( ABS(KNUM).LT.100000000 ) THEN
+ WRITE(NEWMESS(ILEN:),'(I10)') KNUM
+ ELSE
+ WRITE(NEWMESS(ILEN:),'(I15)') KNUM
+ ENDIF
+ ENDIF
+C
+C Send the message
+C
+ IF( KLEVEL.GE.JP_WARN ) CALL INTLOGT(NEWMESS)
+C
+ IF( LDEBUG ) WRITE(*,9001) TITLE(NLEV),NEWMESS(1:66)
+ 9001 FORMAT('INTLOG ',A5,': ',A66)
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/intlog.h b/interpolation/intlog.h
new file mode 100755
index 0000000..dfcc9b9
--- /dev/null
+++ b/interpolation/intlog.h
@@ -0,0 +1,14 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C Common block.
+ COMMON /INTLOGC/ LDEBUG
+ SAVE /INTLOGC/
+ LOGICAL LDEBUG
diff --git a/interpolation/intlogd.F b/interpolation/intlogd.F
new file mode 100755
index 0000000..f1b426d
--- /dev/null
+++ b/interpolation/intlogd.F
@@ -0,0 +1,90 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE INTLOGD(KONOFF)
+C
+C---->
+C**** INTLOGD
+C
+C PURPOSE
+C _______
+C
+C This routine toggles the debug flag LDEBUG.
+C
+C
+C INTERFACE
+C _________
+C
+C CALL INTLOG(KONOFF)
+C
+C
+C Input parameters
+C ________________
+C
+C KONOFF - value to set in the debug flag LDEBUG.
+C = 0 for 'off'.
+C = 1 for 'on'.
+C
+C
+C Output parameters
+C ________________
+C
+C None.
+C
+C
+C Common block usage
+C __________________
+C
+C LDEBUG in /INTLOGC/ controls display of message
+C = 0 for no display
+C = 1 to display
+C
+C
+C Method
+C ______
+C
+C Toggle flag.
+C
+C
+C Externals
+C _________
+C
+C None.
+C
+C
+C Comments
+C ________
+C
+C LDEBUG is toggled by a call to INTLOGD.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Jul 1995
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C
+C----<
+C _______________________________________________________
+C
+C Subroutine arguments.
+ INTEGER KONOFF
+#include "intlog.h"
+C
+ LDEBUG = (KONOFF.EQ.1)
+C
+ RETURN
+ END
diff --git a/interpolation/intlogr.F b/interpolation/intlogr.F
new file mode 100755
index 0000000..9770f8d
--- /dev/null
+++ b/interpolation/intlogr.F
@@ -0,0 +1,160 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE INTLOGR(KLEVEL, MESSAGE, PNUM)
+C
+C---->
+C**** INTLOGR
+C
+C PURPOSE
+C _______
+C
+C This routine logs error messages.
+C
+C
+C INTERFACE
+C _________
+C
+C CALL INTLOGR(KLEVEL, MESSAGE, PNUM)
+C
+C
+C Input parameters
+C ________________
+C
+C KLEVEL - Severity level for reported message
+C = 0 for debug
+C = 1 for information
+C = 2 for warning
+C = 3 for error
+C = 4 for fatal
+C MESSAGE - Message text
+C PNUM - Message number
+C
+C
+C Output parameters
+C ________________
+C
+C None.
+C
+C
+C Common block usage
+C __________________
+C
+C LDEBUG in /INTLOGC/ controls display of message
+C = 0 for no display
+C = 1 to display
+C
+C
+C Method
+C ______
+C
+C Prints message and number if debug flag is 'on'.
+C
+C
+C Externals
+C _________
+C
+C INTLOGT - sends any ERROR or FATAL message to the MARS server.
+C
+C
+C Comments
+C ________
+C
+C LDEBUG is toggled by a call to INTLOGD.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Jul 1995
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers *ECMWF* March 1996
+C Prepare error message for MARS server.
+C
+C
+C----<
+C _______________________________________________________
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Subroutine arguments.
+C
+ INTEGER KLEVEL
+ REAL PNUM
+ CHARACTER *(*) MESSAGE
+C
+#include "intlog.h"
+C
+C Local variables.
+C
+ CHARACTER*79 NEWMESS
+ INTEGER NLEV, LOOP
+ CHARACTER*5 TITLE(JP_FATAL+1)
+ DATA TITLE/'DEBUG',
+ X 'INFO ',
+ X 'WARN ',
+ X 'ERROR',
+ X 'FATAL'/
+ INTEGER IRET, ILEN
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Ensure valid level is used.
+ NLEV = KLEVEL + 1
+ IF ( KLEVEL .GT. JP_FATAL) NLEV = JP_FATAL + 1
+C
+ DO LOOP = 1, 79
+ NEWMESS(LOOP:LOOP) = ' '
+ ENDDO
+C
+C ------------------------------------------------------------------
+C* Section 2. Prepare ERROR or FATAL message for MARS server.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ ILEN = LEN(MESSAGE)
+ IF( ILEN.GT.55 ) ILEN = 55
+ NEWMESS(1:ILEN) = MESSAGE
+ ILEN = ILEN + 1
+ IF( ABS(PNUM).LT.100000.0 ) THEN
+ WRITE(NEWMESS(ILEN:),'(F24.15)') PNUM
+ ELSE IF ( ABS(PNUM).LT.10000000000.0 ) THEN
+ WRITE(NEWMESS(ILEN:),'(F24.10)') PNUM
+ ELSE IF ( ABS(PNUM).LT.10000000000000.0 ) THEN
+ WRITE(NEWMESS(ILEN:),'(F24.7)') PNUM
+ ELSE
+ WRITE(NEWMESS(ILEN:),'(F25.2)') PNUM
+ ENDIF
+C
+C Send the message
+C
+ IF( KLEVEL.GE.JP_WARN ) CALL INTLOGT(NEWMESS)
+C
+ IF( LDEBUG ) WRITE(*,9001) TITLE(NLEV),NEWMESS(1:66)
+ 9001 FORMAT('INTLOG ',A5,': ',A66)
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/intlogs.c b/interpolation/intlogs.c
new file mode 100755
index 0000000..875a8b9
--- /dev/null
+++ b/interpolation/intlogs.c
@@ -0,0 +1,107 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef CRAY
+#include <fortran.h>
+#else
+#define _fcd char *
+#define _fcdtocp(a) a
+#define _fcdlen(a) strlen(a)
+#endif
+
+char *fcd2char(); /* fortran to c string convertion (alloc memory) */
+
+/* defines for FORTRAN subroutine */
+#ifndef CRAY
+#ifdef FORTRAN_NO_UNDERSCORE
+#define INTLOGT intlogt
+#else
+#define INTLOGT intlogt_
+#endif
+#endif
+
+/* Pointer to display function */
+void (*g_pp_err_fn)(char * buffer) = 0;
+
+void intlogs(void (*pp_error)(char *)) {
+
+ g_pp_err_fn = pp_error;
+ return;
+}
+
+#define MAXMESSAGE 79
+
+void INTLOGT(char * message, long length) {
+char * buffer;
+int messageLen;
+
+#ifndef CRAY
+ messageLen = (length > MAXMESSAGE) ? MAXMESSAGE : length;
+ if( g_pp_err_fn != 0 ) {
+
+ buffer = (char*) malloc(messageLen+1);
+ if( buffer == NULL) {
+ perror("INTLOGT: malloc error");
+ return;
+ }
+
+ strncpy(buffer,message,messageLen);
+ buffer[messageLen] = '\0';
+ {
+ char * p;
+ p = buffer + messageLen - 1;
+ while(*p == ' ') {
+ *p = '\0';
+ p--;
+ }
+ }
+ g_pp_err_fn(buffer);
+ free(buffer);
+
+ }
+#else
+char messagebuff[256];
+char * fmessage;
+char * p;
+
+ if( g_pp_err_fn != 0 ) {
+
+ if( (fmessage = fcd2char(message)) ) {
+ p = fmessage + strlen(fmessage);
+
+ while(*p == ' ') {
+ *p = '\0';
+ p--;
+ }
+
+ g_pp_err_fn(fmessage);
+ free(fmessage);
+ }
+ }
+
+#endif
+
+ return;
+}
+
+
+void intlog2(char *msg) {
+ INTLOGT(msg,strlen(msg));
+}
+
+void intlog2ga(char *msg1, char *msg2) {
+ INTLOGT(msg1,strlen(msg1));
+ INTLOGT(msg2,strlen(msg2));
+}
diff --git a/interpolation/intocn.F b/interpolation/intocn.F
new file mode 100755
index 0000000..c55e6c1
--- /dev/null
+++ b/interpolation/intocn.F
@@ -0,0 +1,1070 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTOCN(HICODE,HSCODE,RTOP,RBOTT,RRIGHT,RLEFT,
+ * RYRES,RXRES,
+ * KSEC1,KSEC2,PSEC4,KLENP,KLENI,TARRAY,
+ * XARR,YARR,NXP,NYP,PARRAY,IINTPOL,ISTAGP)
+C
+C---->
+C**** INTOCN - interpolates grib ocean data
+C
+C
+C PURPOSE
+C -------
+C Interpolates data to new grid, according to instructions.
+C Missing data is flagged with -999.9; this information is
+C passed to the new field.
+C
+C
+C Interface.
+C ----------
+C
+C IRET = INTOCN(....)
+C
+C Input parameters.
+C -----------------
+C
+C HICODE Interpolation code
+C 'N' No interpolation
+C 'R' Interpolate only to make grid Regular
+C 'X' Interpolate in x only
+C 'Y' Interpolate in y only
+C 'F' Interpolate in x and y (Full)
+C HSCODE Staggered grid code
+C 'D' Drop every second row ('even' points)
+C 'X' Augment to standard grid by x interpolation
+C 'Y' Augment to standard grid by y interpolation
+C 'F' Augment to standard grid by x-y interpolation
+C RTOP Top of output field domain (degrees/metres/days)
+C RBOTT Bottom of output field domain ( " )
+C RRIGHT Right of output field domain ( " )
+C RLEFT Left of output field domain ( " )
+C RYRES Resolution for y-interpolation ( " )
+C RXRES Resolution for x-interpolation ( " )
+C KSEC1 Product definition block (+ high res. grid data)
+C KSEC2 Grid description block
+C PSEC4 Input data array
+C KLENP Size of input array
+C KLENI Size of scratch array (and also output array PARRAY)
+C TARRAY Scratch array for use during interpolation
+C
+C Output parameters.
+C ------------------
+C
+C Returns 0 if the interpolation is successful, otherwise non-zero.
+C
+C XARR x cordinates of data values, or XO,XSTEP,
+C 0.0 for regular spacing
+C YARR y cordinates of data values, or YO,YSTEP,
+C 0.0 for regular spacing
+C NXP x dimension of output field
+C NYP y dimension of output field
+C PARRAY output field array
+C IINTPOL Flag for interpolation done
+C = 0 if none,
+C = 1 if x only,
+C = 2 if y only,
+C = 3 if x and y.
+C ISTAGP Flag to show processing done for staggered grid:
+C = 0 if none
+C = 2 if every second row dropped.
+C = 3 if interpolated in x only.
+C = 4 if interpolated in y only.
+C = 5 if interpolated in x and y.
+C
+C
+C Method.
+C -------
+C Convention is always to have output field array starting in bottom
+C left hand corner of the field. The positional information for the
+C data and for the axes is also given starting in the bottom left
+C hand corner. This means YARR and PSEC4 must be inverted for the
+C default grib scanning, which starts in the top left hand corner.
+C
+C
+C Externals.
+C ----------
+C
+C INTLOG - Logs warning messages.
+C INTLOGR - Logs warning messages.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C T. Stockdale ECMWF 23.02.93
+C
+C
+C Modifications.
+C --------------
+C
+C T. Stockdale ECMWF 20.05.93
+C Revised for local grib.
+C
+C J.D.Chambers ECMWF 04.10.95
+C Make into a function (remove STOPs).
+C
+C T. Stockdale ECMWF 26.09.02
+C Drop odd points (not even) from E grid, for better land sea mask
+C
+C T. Stockdale ECMWF 07.10.02
+C New standard code (matches latest rd version)
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+C Parameters
+ INTEGER JPROUTINE, JP_LONG
+ PARAMETER (JPROUTINE = 33300 )
+ PARAMETER (JP_LONG = 3 )
+C
+#include "parim.h"
+C
+C Subroutine arguments.
+ CHARACTER*1 HICODE,HSCODE
+ REAL RTOP, RBOTT, RRIGHT, RLEFT, RYRES, RXRES
+ INTEGER KSEC1, KSEC2, KLENP, KLENI, NXP, NYP, IINTPOL, ISTAGP
+ DIMENSION KSEC1(*)
+ DIMENSION KSEC2(*)
+ REAL PSEC4, TARRAY, XARR, YARR, PARRAY
+ DIMENSION PSEC4(KLENP)
+ DIMENSION XARR(*), YARR(*)
+ DIMENSION TARRAY(KLENI), PARRAY(KLENI)
+C
+C Local variables
+ INTEGER NX, NY, KLAT1, KLAT2, KLON1, KXINC, KYINC, ISTAG
+ INTEGER IIRREG, JGCL, J, I, JSKIP, NXLEFT, NXRIGH, IWRAP, JI
+ INTEGER JIP, JJ, IOFFSET, NEWPTS, JN, IPOS, IPOSM, JPOS
+ INTEGER IPOSP1M, JMIN, JMAX, JLEFT, JJP, JJEFF
+ INTEGER NYLEFTI, NYLEFT, NYRIGH
+ REAL XUNIT, YUNIT, RRVAL, RLVAL, RUVAL, RDVAL, RXIRES
+ REAL XSIGN, XRSIGN, XFPREV, XFPOSN, RPOS, RVALL, RVALR
+ REAL XVAL, XOWEST, XORES, XPSIGN, RVAL, RYIRES, YFPREV, YFPOSN
+ REAL YSIGN, YPSIGN, YRSIGN, RMISS, EPS
+ REAL RVALB, RVALT, XOSOUT
+ LOGICAL LNEAREST
+C
+C YSIGN Flag for direction of y co-ords in data:
+C +1 if co-ords are increasing with index of PSEC4,
+C -1 if decreasing.
+C YPSIGN Flag for direction of y co-ords in output field:
+C +1 if co-ords are increasing up the page,
+C -1 if decreasing.
+C YRSIGN Flag for direction of y co-ords in output field relative
+C to that in data: YSIGN*YPSIGN
+C IINTPOL Flag for interpolation:
+C 0 = none,
+C 1 = x only,
+C 2 = y only,
+C 3 = x and y
+C RMISS Value for missing data
+C EPS Tolerance on missing data flag
+C
+C
+ EXTERNAL INTUP, INTDN, LENA, HDEGS, HMETRES
+ INTEGER INTUP, INTDN, LENA
+ CHARACTER*6 HDEGS, HMETRES
+C
+C Inline function - tests TRUE if A is a missing value
+ REAL A
+ LOGICAL MISSING
+ MISSING(A) = ( ABS(A-RMISS) .LT. EPS )
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ INTOCN = 0
+C
+C Set key variables from GRIB header blocks.
+C
+ NX = KSEC2(2)
+ NY = KSEC2(3)
+C
+ KLAT1 = KSEC1(62)
+ KLAT2 = KSEC1(64)
+ KLON1 = KSEC1(63)
+ KXINC = KSEC1(66)
+ KYINC = KSEC1(67)
+C
+ ISTAG = KSEC1(69)
+ IIRREG = KSEC1(68)
+ JGCL = 74+KSEC1(71)+KSEC1(72)
+C
+ IF(KSEC1(60).EQ.1) THEN
+ XUNIT = 1.0/3600.0
+ ELSE
+ XUNIT = 1.0E-6
+ ENDIF
+C
+ IF(KSEC1(61).EQ.2) THEN
+ YUNIT = 1.0E-3
+ ELSE IF(KSEC1(61).EQ.1) THEN
+ YUNIT = 1.0/3600.0
+ ELSE
+ YUNIT = 1.0E-6
+ ENDIF
+C
+ IINTPOL = 0
+ RMISS = -999.9
+ EPS = 0.01
+C
+C ------------------------------------------------------------------
+C* Section 2 . Deal with staggered grid if present.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C The approach in this section is to replace the staggered grid by
+C a non-staggered version, either by interpolating the data onto new
+C grid points or by simply dropping half of the data points. A new
+C version of PSEC4 is created, and parts of KSEC1 are modified.
+C This enables the rest of INTOCN to treat the field in a consistent
+C manner, BUT it means that KSEC1 and PSEC4 will be altered on
+C leaving this subroutine (and presently in an inconsistent way).
+C
+C The interpolations coded in this section ignore the metric of the
+C staggered grid, that is they simply average neighbouring values to
+C find a new grid point value. The more general case can be added
+C later if desired.
+C
+C Note: we prefer to drop odd points and keep even points, because
+C the standard version of HOPE2 uses an external mask to define the
+C land-sea mask of its even points. The mask for odd points then has
+C to be interpolated, which is less accurate, so the plots look
+C better if the even points are kept.
+C
+C
+ IF(ISTAG.EQ.1) THEN
+C
+C Drop odd row points ...
+C
+ IF(HSCODE.EQ.'D') THEN
+ ISTAGP = 2
+ NY = NY/2
+ KYINC = KYINC*2
+ DO 210 J = 1,NY
+ DO 210 I = 1,NX
+ PSEC4(I+NX*(J-1)) = PSEC4(I+NX*((J-1)*2+1))
+ 210 CONTINUE
+C
+C Reset the grid coordinate list.
+C Remove the y coordinates of the even rows,
+C the x coordinates of the even rows, and also the first x
+C coordinate of an even regular row.
+C
+ IF(IIRREG.EQ.2) THEN
+ KLON1=KSEC1(JGCL+1)
+ DO 212 J = 1,NY
+ KSEC1(JGCL+J) = KSEC1(JGCL+1+2*J)
+ 212 CONTINUE
+C
+ ELSE IF(IIRREG.EQ.3) THEN
+ KLON1=KSEC1(JGCL+1)
+ JSKIP = JGCL+NX
+ DO 214 J = 1,NY
+ KSEC1(JSKIP+J) = KSEC1(JSKIP+NX+2*J)
+ 214 CONTINUE
+ ENDIF
+C
+C* Staggered grid: interpolation in x.
+C
+ ELSE IF(HSCODE.EQ.'X') THEN
+ ISTAGP = 3
+ NX = NX*2
+ KXINC = KXINC/2
+ IF(((NX*NY).GT.KLENI).OR.((NX*NY).GT.KLENP)) THEN
+ CALL INTLOG(JP_ERROR,'INTOCN: Array too small.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCN: Required = ',NXP*NY)
+ CALL INTLOG(JP_ERROR,'INTOCN: Available = ',KLENP)
+ CALL INTLOG(JP_ERROR,'INTOCN: Available = ',KLENI)
+ INTOCN = JPROUTINE + 17
+ GOTO 900
+ ENDIF
+C
+C Expand the data into a temporary array, and then copy back
+C into PSEC4. Note the treatment of the end points, which
+C assumes a longitude wrap-round. Remember to mask land points
+C so that either both points are missing or neither.
+C
+ DO 220 J = 1,NY,2
+ RRVAL = PSEC4(1+(J-1)*NX/2)
+ RLVAL = PSEC4(NX/2+(J-1)*NX/2)
+ IF(MISSING(RRVAL)) RLVAL = RMISS
+ IF(MISSING(RLVAL)) RRVAL = RMISS
+ TARRAY(1+(J-1)*NX) = (RRVAL+RLVAL)*0.5
+ TARRAY(2+(J-1)*NX) = PSEC4(1+(J-1)*NX/2)
+ DO 220 I = 2,NX/2
+ RRVAL = PSEC4(I +(J-1)*NX/2)
+ RLVAL = PSEC4(I-1+(J-1)*NX/2)
+ IF(MISSING(RRVAL)) RLVAL = RMISS
+ IF(MISSING(RLVAL)) RRVAL = RMISS
+ TARRAY(I*2-1+(J-1)*NX) = (RRVAL+RLVAL)*0.5
+ TARRAY(I*2 +(J-1)*NX) = PSEC4(I +(J-1)*NX/2)
+ 220 CONTINUE
+C
+ DO 222 J = 2,NY,2
+ RRVAL = PSEC4(1+(J-1)*NX/2)
+ RLVAL = PSEC4(NX/2+(J-1)*NX/2)
+ IF(MISSING(RRVAL)) RLVAL = RMISS
+ IF(MISSING(RLVAL)) RRVAL = RMISS
+ TARRAY(NX+(J-1)*NX) = (RLVAL+RRVAL)*0.5
+ TARRAY(NX-1+(J-1)*NX) = PSEC4(NX/2+(J-1)*NX/2)
+ DO 222 I = 1,NX/2-1
+ RRVAL = PSEC4(I+1+(J-1)*NX/2)
+ RLVAL = PSEC4(I +(J-1)*NX/2)
+ IF(MISSING(RRVAL)) RLVAL = RMISS
+ IF(MISSING(RLVAL)) RRVAL = RMISS
+ TARRAY(I*2 +(J-1)*NX) = (RLVAL+RRVAL)*0.5
+ TARRAY(I*2-1+(J-1)*NX) = PSEC4(I +(J-1)*NX/2)
+ 222 CONTINUE
+ DO 224 J = 1,NY
+ DO 224 I = 1,NX
+ PSEC4(I+(J-1)*NX) = TARRAY(I+(J-1)*NX)
+ 224 CONTINUE
+C
+C Reset the grid coordinate list if necessary, again making
+C use of a temporary array. Expand the x-coordinate list,
+C and remove the x coordinate of the first even point if grid
+C is regular in x.
+C
+ KLON1 = KSEC1(JGCL+1)
+ IF((IIRREG.EQ.1).OR.(IIRREG.EQ.3)) THEN
+ JSKIP = JGCL
+ DO 226 J = 1,NX/2
+ TARRAY(J*2-1) = KSEC1(JSKIP+J)
+ TARRAY(J*2) = KSEC1(JSKIP+NX/2+J)
+ 226 CONTINUE
+ DO 227 J = 1,NX
+ KSEC1(JSKIP+J) = TARRAY(J)
+ 227 CONTINUE
+ ELSE IF((IIRREG.EQ.2)) THEN
+ DO 228 J = 1,NY
+ KSEC1(JGCL+J) = KSEC1(JGCL+1+J)
+ 228 CONTINUE
+ ENDIF
+C
+C Staggered grid: interpolation in y.
+C
+ ELSE IF(HSCODE.EQ.'Y') THEN
+ ISTAGP = 4
+ NX = NX*2
+ KXINC = KXINC/2
+ IF(((NX*NY).GT.KLENI).OR.((NX*NY).GT.KLENP)) THEN
+ CALL INTLOG(JP_ERROR,'INTOCN: Array too small.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCN: Required = ',NXP*NY)
+ CALL INTLOG(JP_ERROR,'INTOCN: Available = ',KLENP)
+ CALL INTLOG(JP_ERROR,'INTOCN: Available = ',KLENI)
+ INTOCN = JPROUTINE + 18
+ GOTO 900
+ ENDIF
+C
+C Expand the data into a temporary array, and then copy back
+C into PSEC4. For the polarmost rows, use X interpolation.
+C
+C First the even rows...
+ DO 230 J = 2,NY-1,2
+ DO 230 I = 1,NX/2
+ RUVAL = PSEC4(I+(J-2)*NX/2)
+ RDVAL = PSEC4(I+(J )*NX/2)
+ IF(MISSING(RUVAL)) RDVAL = RMISS
+ IF(MISSING(RDVAL)) RUVAL = RMISS
+ TARRAY(I*2 +(J-1)*NX) = (RDVAL+RUVAL)*0.5
+ TARRAY(I*2-1+(J-1)*NX) = PSEC4(I+(J-1)*NX/2)
+ 230 CONTINUE
+ RRVAL = PSEC4(1+(NY-1)*NX/2)
+ RLVAL = PSEC4(NX/2+(NY-1)*NX/2)
+ IF(MISSING(RRVAL)) RLVAL = RMISS
+ IF(MISSING(RLVAL)) RRVAL = RMISS
+ TARRAY(NX+(NY-1)*NX) = (RLVAL+RRVAL)*0.5
+ TARRAY(NX-1+(NY-1)*NX) = PSEC4(NX/2+(NY-1)*NX/2)
+ DO 231 I = 2,NX/2
+ RRVAL = PSEC4(I+1+(NY-1)*NX/2)
+ RLVAL = PSEC4(I+(NY-1)*NX/2)
+ IF(MISSING(RRVAL)) RLVAL = RMISS
+ IF(MISSING(RLVAL)) RRVAL = RMISS
+ TARRAY(I*2+(NY-1)*NX) = (RRVAL+RLVAL)*0.5
+ TARRAY(I*2-1+(NY-1)*NX) = PSEC4(I+(NY-1)*NX/2)
+ 231 CONTINUE
+C
+C Then the odd rows
+ DO 232 J = 3,NY-1,2
+ RUVAL = PSEC4(NX/2+(J-2)*NX/2)
+ RDVAL = PSEC4(NX/2+(J )*NX/2)
+ IF(MISSING(RUVAL)) RDVAL = RMISS
+ IF(MISSING(RDVAL)) RUVAL = RMISS
+ TARRAY(1+(J-1)*NX) = (RRVAL+RLVAL)*0.5
+ TARRAY(2+(J-1)*NX) = PSEC4(1+(J-1)*NX/2)
+ DO 232 I = 1,NX/2
+ RUVAL = PSEC4(I+(J-2)*NX/2)
+ RDVAL = PSEC4(I+(J )*NX/2)
+ IF(MISSING(RUVAL)) RDVAL = RMISS
+ IF(MISSING(RDVAL)) RUVAL = RMISS
+ TARRAY(I*2-1+(J-1)*NX) = (RDVAL+RUVAL)*0.5
+ TARRAY(I*2 +(J-1)*NX) = PSEC4(I+(J-1)*NX/2)
+ 232 CONTINUE
+C
+ RRVAL = PSEC4(1+(1-1)*NX/2)
+ RLVAL = PSEC4(NX/2+(1-1)*NX/2)
+ IF(MISSING(RRVAL)) RLVAL = RMISS
+ IF(MISSING(RLVAL)) RRVAL = RMISS
+ TARRAY(1+(1-1)*NX) = (RRVAL+RLVAL)*0.5
+ TARRAY(2+(1-1)*NX) = PSEC4(1+(1-1)*NX/2)
+ DO 233 I = 2,NX/2
+ RRVAL = PSEC4(I+(1-1)*NX/2)
+ RLVAL = PSEC4(I-1+(1-1)*NX/2)
+ IF(MISSING(RRVAL)) RLVAL = RMISS
+ IF(MISSING(RLVAL)) RRVAL = RMISS
+ TARRAY(I*2-1+(1-1)*NX) = (RRVAL+RLVAL)*0.5
+ TARRAY(I*2+(1-1)*NX) = PSEC4(I+(1-1)*NX/2)
+ 233 CONTINUE
+
+ DO 234 J = 1,NY
+ DO 234 I = 1,NX
+ PSEC4(I+(J-1)*NX) = TARRAY(I+(J-1)*NX)
+ 234 CONTINUE
+C
+C Reset the grid coordinate list if necessary, again making
+C use of a temporary array. Expand the x-coordinate list,
+C and remove the x coordinate of the first even point if
+C grid is regular in x.
+C
+ IF((IIRREG.EQ.1).OR.(IIRREG.EQ.3)) THEN
+ JSKIP = JGCL
+ DO 235 J = 1,NX/2
+ TARRAY(J*2-1) = KSEC1(JSKIP+J)
+ TARRAY(J*2) = KSEC1(JSKIP+NX/2+J)
+ 235 CONTINUE
+ DO 236 J = 1,NX
+ KSEC1(JSKIP+J) = TARRAY(J)
+ 236 CONTINUE
+ ELSE IF((IIRREG.EQ.2)) THEN
+ DO 237 J = 1,NY
+ KSEC1(JGCL+J) = KSEC1(JGCL+1+J)
+ 237 CONTINUE
+ ENDIF
+C
+C Staggered grid: interpolation in x and y.
+C
+ ELSE IF(HSCODE.EQ.'F') THEN
+ ISTAGP = 5
+ CALL INTLOG(JP_ERROR,'INTOCN: Staggered grid opt. F',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCN: (interpolate x and y)',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCN: not yet implemented.',JPQUIET)
+ INTOCN = JPROUTINE + 1
+ GOTO 900
+ ELSE
+ CALL INTLOG(JP_ERROR,'INTOCN: Staggered grid option',JPQUIET)
+ CALL INTLOG(JP_ERROR,HSCODE,JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCN: not known.',JPQUIET)
+ INTOCN = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ ISTAG = 0
+C
+ ELSE
+ ISTAGP = 0
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 3 . Set X coordinates and interpolate in X.
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C The procedure is first to do the x interpolation (if any), and
+C copy the result into a temporary array. The y interpolation is
+C done in the next section.
+C
+C The one complication here is to ensure proper longitude wrap-round
+C where appropriate.
+C
+C Some plot systems have difficulty controlling the data within the
+C viewport. Because of this, and in the interests of efficiency, the
+C data arrays are truncated even if no interpolation is being done.
+C
+C
+C No interpolation in X.
+C
+ IF((HICODE.EQ.'N').OR.
+ * ((HICODE.EQ.'R').AND.((IIRREG.EQ.0).OR.(IIRREG.EQ.2))).OR.
+ * (HICODE.EQ.'Y') ) THEN
+C
+C If x is longitude, set parameters up for wrap-round
+C Wrap-round activated only if longitude range of data > 350 deg.
+C
+ IF((IIRREG.EQ.0).OR.(IIRREG.EQ.2)) THEN
+ RXIRES = KXINC*XUNIT
+ NXLEFT = INTDN((RLEFT-KLON1*XUNIT)/RXIRES+1)
+ NXRIGH = INTUP((RRIGHT-KLON1*XUNIT)/RXIRES+1)
+ NXP = NXRIGH-NXLEFT+1
+ IF(NXP.LE.1) THEN
+ CALL INTLOG(JP_ERROR,'INTOCN: NXP negative = ',NXP)
+ INTOCN = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ XARR(1) = KLON1*XUNIT+(NXLEFT-1)*RXIRES
+ XARR(2) = KXINC*XUNIT
+ XARR(3) = 0.0
+ IF( (KSEC1(60).EQ.3) .AND. (KXINC*NX*XUNIT.GT.350.0) ) THEN
+ IWRAP = 1
+ ELSE
+ IWRAP = 0
+ ENDIF
+C
+ ELSE IF( (IIRREG.EQ.1) .OR. (IIRREG.EQ.3) ) THEN
+ NXP = NX
+ NXLEFT = 1
+ JSKIP = JGCL
+ DO 312 JI = 1,NXP
+ XARR(JI) = KSEC1(JSKIP+JI)*XUNIT
+ 312 CONTINUE
+ IF( (KSEC1(60).EQ.3) .AND. (KXINC*NX*XUNIT.GT.350.0) ) THEN
+ IWRAP = 1
+ INTOCN = JPROUTINE + 4
+ GOTO 900
+ ELSE
+ IWRAP = 0
+ ENDIF
+ ENDIF
+C
+ IF((NXP*NY).GT.KLENI) THEN
+ CALL INTLOG(JP_ERROR,'INTOCN: Array too small.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCN: Required = ',NXP*NY)
+ CALL INTLOG(JP_ERROR,'INTOCN: Available = ',KLENI)
+ INTOCN = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+C
+C Copy the data into the temporary array
+C
+ DO 318 JI = 1,NXP
+ JIP = JI+NXLEFT-1
+ IF(IWRAP.EQ.1) THEN
+ IF(JIP.LE.0) JIP = JIP+NX
+ IF(JIP.GT.NX) JIP = JIP-NX
+ ENDIF
+ IF((JIP.GE.1).AND.(JIP.LE.NX)) THEN
+ DO 316 JJ = 1,NY
+ TARRAY(JI+(JJ-1)*NXP) = PSEC4(JIP+(JJ-1)*NX)
+ 316 CONTINUE
+ ELSE
+ DO 317 JJ = 1,NY
+ TARRAY(JI+(JJ-1)*NXP) = RMISS
+ 317 CONTINUE
+ ENDIF
+ 318 CONTINUE
+C
+C Interpolation from a grid irregular in X.
+C ---------------------------------------------
+C
+ ELSE IF(((HICODE.EQ.'R').OR.
+ * (HICODE.EQ.'X').OR.
+ * (HICODE.EQ.'F') ).AND.
+ * ((IIRREG.EQ.1).OR.(IIRREG.EQ.3)) ) THEN
+
+ XPSIGN = SIGN(1.0,(RRIGHT-RLEFT))
+ NXP = NINT((RRIGHT-RLEFT)/RXRES*XPSIGN)+1
+ IF((NXP*NY).GT.KLENI) THEN
+ CALL INTLOG(JP_ERROR,'INTOCN: Array too small.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCN: Required = ',NXP*NY)
+ CALL INTLOG(JP_ERROR,'INTOCN: Available = ',KLENI)
+ INTOCN = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+ RRIGHT = RLEFT+RXRES*XPSIGN*(NXP-1)
+ XARR(1) = RLEFT
+ XARR(2) = RXRES*XPSIGN
+ XARR(3) = 0.0
+ IINTPOL = IINTPOL+1
+ IOFFSET = JGCL
+ XSIGN = SIGN(1.0,((KSEC1(IOFFSET+2)-KSEC1(IOFFSET+1))*1.0))
+ XRSIGN = XSIGN*XPSIGN
+ DO 321 JI = 1,NXP*NY
+ TARRAY(JI) = RMISS
+ 321 CONTINUE
+C
+C Work through the known (irregular) data points.
+C Calculate the position of the point as a fractional number of
+C points on the new regular grid
+C (XFPOSN). If there are any points on the new grid between this
+C point and the previous one (XFPREV), then set these points by
+C interpolation between the two known points.
+ XFPREV= (KSEC1(IOFFSET+1)*XUNIT-RLEFT)/RXRES*XPSIGN - 0.5*XRSIGN
+ DO 324 JI = 1,NX
+ XFPOSN = (KSEC1(IOFFSET+JI)*XUNIT-RLEFT)/(RXRES*XPSIGN)
+ NEWPTS = INTDN((XFPOSN*XRSIGN))-INTDN((XFPREV*XRSIGN))
+ DO 323 JN = 1,NEWPTS
+ IPOS = (INTDN(XFPREV*XRSIGN)+JN)*XRSIGN+1
+ RPOS = (IPOS-1)*1.0
+ IF((IPOS.GE.1).AND.(IPOS.LE.NXP)) THEN
+ DO 322 JJ = 1,NY
+ RVALL = PSEC4(JI-1+NX*(JJ-1))
+ RVALR = PSEC4(JI+NX*(JJ-1))
+ IF(.NOT.MISSING(RVALL) .AND. .NOT.MISSING(RVALR) ) THEN
+ XVAL = (XFPOSN-RPOS)/(XFPOSN-XFPREV)*RVALL
+ * +(RPOS-XFPREV)/(XFPOSN-XFPREV)*RVALR
+ ELSE
+ XVAL = RMISS
+ ENDIF
+ TARRAY(IPOS+NXP*(JJ-1)) = XVAL
+ 322 CONTINUE
+ ENDIF
+ 323 CONTINUE
+ XFPREV = XFPOSN
+ 324 CONTINUE
+
+C
+C Interpolation from a grid regular in X.
+C
+ ELSE IF(((HICODE.EQ.'X').OR.(HICODE.EQ.'F')).AND.
+ * ((IIRREG.EQ.0).OR.(IIRREG.EQ.2)) ) THEN
+
+ XPSIGN = SIGN(1.0,(RRIGHT-RLEFT))
+ NXP = NINT((RRIGHT-RLEFT)/RXRES*XPSIGN)+1
+ IF((NXP*NY).GT.KLENI) THEN
+ CALL INTLOG(JP_ERROR,'INTOCN: Array too small.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCN: Required = ',NXP*NY)
+ CALL INTLOG(JP_ERROR,'INTOCN: Available = ',KLENI)
+ INTOCN = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+ RRIGHT = RLEFT+RXRES*XPSIGN*(NXP-1)
+ XARR(1) = RLEFT
+ XARR(2) = RXRES*XPSIGN
+ XARR(3) = 0.0
+ IINTPOL = IINTPOL+1
+C
+C Work through the new regular grid points. Calculate the position
+C of the point as a fractional number of points on the old grid.
+C Use this fractional number to estimate the value of the field
+C at the new point
+C
+C (Note that just to the right of the first point, RPOS will be
+C eg 1.1, not 0.1)
+C
+ DO 330 JI = 1,NXP*NY
+ TARRAY(JI) = RMISS
+ 330 CONTINUE
+C
+ XOWEST = KLON1*XUNIT
+ XORES = KXINC*XUNIT
+ DO 3320 JI = 1,NXP
+ RPOS = (RLEFT+(JI-1)*RXRES-XOWEST)/XORES + 1
+ IPOS = INTDN(RPOS)
+C
+C Check for out of bounds, and set to zero unless x is
+C longitude, in which case attempt to wrap round.
+ IF( (IPOS.GE.1) .AND. ((IPOS+1).LE.NX) ) THEN
+ DO 3310 JJ = 1,NY
+ RVALL = PSEC4(IPOS+(JJ-1)*NX)
+ RVALR = PSEC4(IPOS+1+(JJ-1)*NX)
+ IF(.NOT. MISSING(RVALL) .AND. .NOT. MISSING(RVALR) ) THEN
+ RVAL = (IPOS+1-RPOS)*RVALL + (RPOS-IPOS)*RVALR
+C
+C Do not set to missing if there is good data close by.
+ ELSEIF( (.NOT.MISSING(RVALL)) .AND.
+ X ((IPOS+1-RPOS).GT.0.5) ) THEN
+ RVAL = RVALL
+ ELSEIF( (.NOT. MISSING(RVALR)).AND.
+ X ((RPOS-IPOS).GT.0.5)) THEN
+ RVAL = RVALR
+ ELSE
+ RVAL = RMISS
+ ENDIF
+ TARRAY(JI+(JJ-1)*NXP) = RVAL
+ 3310 CONTINUE
+C
+ ELSEIF( KSEC1(60).EQ.JP_LONG ) THEN
+C
+C This works only if the longitude points are equally spaced
+C around the globe, ie the gap between the first and last
+C points is equal to the gap between any other pair of
+C adjacent points.
+C
+ IPOSM = MOD(IPOS,NX)
+ IPOSP1M = MOD((IPOS+1),NX)
+ IF(IPOSM.LE.0) IPOSM = IPOSM+NX
+ IF(IPOSP1M.LE.0) IPOSP1M = IPOSP1M+NX
+ DO 3313 JJ = 1,NY
+ RVALL = PSEC4(IPOSM+(JJ-1)*NX)
+ RVALR = PSEC4(IPOSP1M+(JJ-1)*NX)
+ IF(.NOT. MISSING(RVALL) .AND. .NOT. MISSING(RVALR) ) THEN
+ RVAL = (IPOS+1-RPOS)*RVALL + (RPOS-IPOS)*RVALR
+C
+C Do not set to missing if there is good data close by.
+ ELSEIF( (.NOT.MISSING(RVALL)) .AND.
+ X ((IPOS+1-RPOS).GT.0.5) ) THEN
+ RVAL = RVALL
+ ELSEIF( (.NOT. MISSING(RVALR)).AND.
+ X ((RPOS-IPOS).GT.0.5) ) THEN
+ RVAL = RVALR
+ ELSE
+ RVAL = RMISS
+ ENDIF
+ IF(RVAL.GT.1E6) THEN
+ RVAL = RMISS
+ ENDIF
+ TARRAY(JI+(JJ-1)*NXP) = RVAL
+ 3313 CONTINUE
+ ELSE
+ DO 3316 JJ = 1,NY
+ TARRAY(JI+(JJ-1)*NXP) = RMISS
+ 3316 CONTINUE
+ ENDIF
+ 3320 CONTINUE
+C
+ ELSE
+ CALL INTLOG(JP_ERROR,'INTOCN: Error in logic.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCN: HICODE = ',JPQUIET)
+ CALL INTLOG(JP_ERROR,HICODE,JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCN: IIRREG = ',IIRREG)
+ INTOCN = JPROUTINE + 8
+ GOTO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 4 . Set Y coordinates and interpolate in Y.
+C ------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+C The x-interpolated field in the temporary array is interpolated in
+C y into the final output field array. Note that the field and the
+C coordinate array are both inverted in the y direction during this
+C section.
+C
+C Some plot systems have difficulty controlling the data within the
+C viewport. Because of this, and in the interests of efficiency, the
+C data arrays are truncated even if no interpolation is being done.
+C
+C
+C No interpolation in Y.
+C
+ IF((HICODE.EQ.'N').OR.
+ * ((HICODE.EQ.'R').AND.((IIRREG.EQ.0).OR.(IIRREG.EQ.1))).OR.
+ * (HICODE.EQ.'X') ) THEN
+C
+C If y is longitude, set parameters up for wrap-round
+C Wrap-round activated only if longitude range of data > 350 deg.
+C
+ IF((IIRREG.EQ.0).OR.(IIRREG.EQ.1)) THEN
+C
+C Remember to invert calc of NYP if RYIRES -ve ... 22.04.94
+ RYIRES = KYINC*YUNIT
+ IF(RYIRES.GT.0) THEN
+ NYLEFT = INTDN((RBOTT-KLAT1*YUNIT)/RYIRES+1)
+ NYRIGH = INTUP((RTOP-KLAT1*YUNIT)/RYIRES+1)
+ NYP = NYRIGH-NYLEFT+1
+ ELSE
+ NYRIGH = INTUP((RBOTT-KLAT1*YUNIT)/RYIRES+1)
+ NYLEFT = INTDN((RTOP-KLAT1*YUNIT)/RYIRES+1)
+ NYP = NYRIGH-NYLEFT+1
+ ENDIF
+ IF(NYP.LE.1) THEN
+ CALL INTLOG(JP_ERROR,'INTOCN: NYP negative = ',NYP)
+ INTOCN = JPROUTINE + 9
+ GOTO 900
+ ENDIF
+C
+C Remember to invert yarr coordinates ... 06.07.93
+ YARR(1) = KLAT1*YUNIT+(NYRIGH-1)*RYIRES
+ YARR(2) = -KYINC*YUNIT
+ YARR(3) = 0.0
+C
+C Remember NYLEFT is relative to the inverted array ... 19.01.96
+C ... but be careful to do this exactly. 01.04.97
+ NYLEFTI=NYLEFT
+ NYLEFT=NY+1-NYRIGH
+ NYRIGH=NY+1-NYLEFTI
+C
+ IF((KSEC1(61).EQ.3) .AND. (KYINC*NY*YUNIT.GT.350.0) ) THEN
+ IWRAP = 1
+ ELSE
+ IWRAP = 0
+ ENDIF
+C
+ ELSE IF(IIRREG.EQ.2) THEN
+ IOFFSET = JGCL
+ YPSIGN = SIGN(1.0,(RTOP-RBOTT))
+ YSIGN = SIGN(1.0,((KSEC1(IOFFSET+2)-KSEC1(IOFFSET+1))*1.0))
+ YRSIGN = YSIGN*YPSIGN
+ JMIN = 0
+ DO 410 JI = 1,NY
+ YARR(JI) = KSEC1(IOFFSET+(NY+1-JI))*YUNIT
+ IF(YRSIGN.LT.0.0) THEN
+ IF((YARR(JI)-RBOTT)*YSIGN .GT. 0.0) JMIN = JI
+ IF((YARR(JI)-RTOP )*YSIGN .GT. 0.0) JMAX = JI+1
+ ELSE
+ IF((YARR(JI)-RTOP )*YSIGN .GT. 0.0) JMIN = JI
+ IF((YARR(JI)-RBOTT)*YSIGN .GT. 0.0) JMAX = JI+1
+ ENDIF
+ 410 CONTINUE
+ IF(JMIN.EQ.0) THEN
+ CALL INTLOG(JP_ERROR,'INTOCN: Domain out of range.',JPQUIET)
+ CALL INTLOGR(JP_ERROR,'INTOCN: Requested Y = ',RBOTT)
+ CALL INTLOGR(JP_ERROR,'INTOCN: Data limit of Y = ',YARR(1))
+ INTOCN = JPROUTINE + 10
+ GOTO 900
+ ENDIF
+ IF(JMAX.EQ.NY+1) THEN
+ CALL INTLOG(JP_ERROR,'INTOCN: Domain out of range.',JPQUIET)
+ CALL INTLOGR(JP_ERROR,'INTOCN: Requested Y = ',RTOP)
+ CALL INTLOGR(JP_ERROR,'INTOCN: Data limit of Y = ',YARR(NY))
+ INTOCN = JPROUTINE + 11
+ GOTO 900
+ ENDIF
+C
+ NYP = (JMAX-JMIN)+1
+ NYLEFT = JMIN
+ DO 411 JI = 1,NYP
+ YARR(JI) = YARR(JI+(NYLEFT-1))
+ 411 CONTINUE
+C
+ IF((KSEC1(61).EQ.3) .AND. (KYINC*NY*YUNIT.GT.350.0) ) THEN
+ IWRAP = 1
+ CALL INTLOG(JP_ERROR,'INTOCN: Irregular wrap-round',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCN: not yet implemented.',JPQUIET)
+ INTOCN = JPROUTINE + 12
+ GOTO 900
+ ELSE
+ IWRAP = 0
+ ENDIF
+C
+ ELSE IF(IIRREG.EQ.3) THEN
+ NYP = NY
+ NYLEFT = 1
+ JSKIP = JGCL+NX
+ DO 412 JI = 1,NYP
+ YARR(JI) = KSEC1(JSKIP+(NY+1-JI))*YUNIT
+ 412 CONTINUE
+ IF((KSEC1(61).EQ.3) .AND. (KYINC*NY*YUNIT.GT.350.0) ) THEN
+ IWRAP = 1
+ CALL INTLOG(JP_ERROR,'INTOCN: Irregular wrap-round',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCN: not yet implemented.',JPQUIET)
+ INTOCN = JPROUTINE + 13
+ GOTO 900
+ ELSE
+ IWRAP = 0
+ ENDIF
+ ENDIF
+C
+ IF((NXP*NYP).GT.KLENI) THEN
+ CALL INTLOG(JP_ERROR,'INTOCN: Array too small.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCN: Required = ',NXP*NYP)
+ CALL INTLOG(JP_ERROR,'INTOCN: Available = ',KLENI)
+ INTOCN = JPROUTINE + 14
+ GOTO 900
+ ENDIF
+C
+C Copy the data into the temporary array, and invert it at
+C same time.
+C Note: NYLEFT is the starting index in the inverted data array.
+C
+c DO 416 JJ = 1,NYP
+c DO 414 JI = 1,NXP
+c PARRAY(JI+(JJ-1)*NXP) = TARRAY(JI+(NY-JJ)*NXP)
+c 414 CONTINUE
+c 416 CONTINUE
+C
+ DO 418 JJ = 1,NYP
+cc JJP = JJ+NYLEFT-1
+ JLEFT = NY-(NYLEFT-1)
+ JJP = JLEFT-JJ+1
+ IF(IWRAP.EQ.1) THEN
+ IF(JJP.LE.0) JJP = JJP+NY
+ IF(JJP.GT.NY) JJP = JJP-NY
+ ENDIF
+ IF((JJP.GE.1).AND.(JJP.LE.NY)) THEN
+ DO 416 JI = 1,NXP
+cc PARRAY(JI+(NYP-JJ)*NXP) = TARRAY(JI+(JJP-1)*NXP)
+ PARRAY(JI+(JJ-1)*NXP) = TARRAY(JI+(JJP-1)*NXP)
+ 416 CONTINUE
+ ELSE
+ DO 417 JI = 1,NXP
+ PARRAY(JI+(NYP-JJ)*NXP) = RMISS
+ 417 CONTINUE
+ ENDIF
+ 418 CONTINUE
+C
+C Interpolation from a grid irregular in Y.
+C
+ ELSE IF(((HICODE.EQ.'R').OR.
+ * (HICODE.EQ.'Y').OR.
+ * (HICODE.EQ.'F') ).AND.
+ * ((IIRREG.EQ.2).OR.(IIRREG.EQ.3)) ) THEN
+ YPSIGN = SIGN(1.0,(RTOP-RBOTT))
+ IF( YPSIGN.GT.0 ) THEN
+ NYP = NINT((RTOP-RBOTT+ 0.0001)/RYRES)+1
+ ELSE
+ NYP = NINT((RBOTT-RTOP + 0.0001)/RYRES)+1
+ ENDIF
+Cjdc NYP = NINT((RTOP-RBOTT)/RYRES*YPSIGN)+1
+ IF((NXP*NYP).GT.KLENI) THEN
+ CALL INTLOG(JP_ERROR,'INTOCN: Array too small.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCN: Required = ',NXP*NYP)
+ CALL INTLOG(JP_ERROR,'INTOCN: Available = ',KLENI)
+ INTOCN = JPROUTINE + 15
+ GOTO 900
+ ENDIF
+ RTOP = RBOTT+RYRES*YPSIGN*(NYP-1)
+ YARR(1) = RBOTT
+ YARR(2) = RYRES*YPSIGN
+ YARR(3) = 0.0
+ IINTPOL = IINTPOL+2
+ IF(IIRREG.EQ.2) THEN
+ IOFFSET = JGCL
+ ELSE IF(IIRREG.EQ.3) THEN
+ IOFFSET = JGCL+NX
+ ENDIF
+ YSIGN = SIGN(1.0,((KSEC1(IOFFSET+2)-KSEC1(IOFFSET+1))*1.0))
+ YRSIGN = YSIGN*YPSIGN
+ DO 420 JI = 1,NXP*NYP
+ PARRAY(JI) = RMISS
+ 420 CONTINUE
+C
+C Work through the known (irregular) data points. Calculate the
+C position of the point as a fractional number of points on the
+C new regular grid (YFPOSN). If there are any points on the new
+C grid between this point and the previous one (YFPREV), then set
+C these points by interpolation between the two known points.
+C Check that the points are in range.
+C Note that we are willing to overlap slightly at the start, but
+C must fiddle the array arguments to do this.
+C
+ YFPREV= (KSEC1(IOFFSET+1)*YUNIT-RBOTT)/RYRES*YPSIGN - 0.5*YRSIGN
+ DO 428 JJ = 1,NY
+ YFPOSN = (KSEC1(IOFFSET+JJ)*YUNIT-RBOTT)/RYRES*YPSIGN
+ NEWPTS = INTDN((YFPOSN*YRSIGN)) -INTDN((YFPREV*YRSIGN))
+C
+C INT truncates toward zero;
+C INTDN truncates downwards in all cases
+C
+ DO 426 JN = 1,NEWPTS
+ IPOS = (INTDN(YFPREV*YRSIGN)+JN)*YRSIGN+1
+ RPOS = (IPOS-1)*1.0
+ IF((IPOS.GE.1).AND.(IPOS.LE.NYP)) THEN
+ JJEFF = JJ
+ IF(JJ.EQ.1) JJEFF = 2
+ DO 424 JI = 1,NXP
+ RVALL = TARRAY(JI+NXP*(JJEFF-2))
+ RVALR = TARRAY(JI+NXP*(JJ-1))
+ IF(.NOT.MISSING(RVALL) .AND. .NOT.MISSING(RVALR) ) THEN
+ XVAL = (YFPOSN-RPOS)/(YFPOSN-YFPREV)*RVALL
+ * +(RPOS-YFPREV)/(YFPOSN-YFPREV)*RVALR
+ ELSE
+ XVAL = RMISS
+ ENDIF
+ PARRAY(JI+NXP*(IPOS-1)) = XVAL
+ 424 CONTINUE
+ ENDIF
+ 426 CONTINUE
+ YFPREV = YFPOSN
+ 428 CONTINUE
+C
+C
+C
+C 4.3 INTERPOLATION FROM A GRID REGULAR IN Y
+C -------------------------------------------
+C
+ ELSEIF(((HICODE.EQ.'Y').OR.(HICODE.EQ.'F')).AND.
+ * ((IIRREG.EQ.0).OR.(IIRREG.EQ.1)) ) THEN
+
+ LNEAREST=.TRUE.
+
+ YPSIGN=SIGN(1.,(RTOP-RBOTT))
+ NYP=NINT((RTOP-RBOTT)/RYRES*YPSIGN)+1
+ IF((NXP*NYP).GT.KLENI) THEN
+ CALL INTLOG(JP_ERROR,'INTOCN: Array too small.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCN: Required = ',NXP*NYP)
+ CALL INTLOG(JP_ERROR,'INTOCN: Available = ',KLENI)
+ INTOCN = JPROUTINE + 19
+ GOTO 900
+ ENDIF
+ RTOP=RBOTT+RYRES*(NYP-1)*YPSIGN
+ YARR(1)=RBOTT
+ YARR(2)=RYRES*YPSIGN
+ YARR(3)=0.0
+C Work through the new regular grid points. Calculate the position of
+C the point as a fractional number of points on the old grid. Use this
+C fractional number to estimate the value of the field at the new point
+ IINTPOL=IINTPOL+2
+ DO 335 JI=1,NXP*NYP
+ PARRAY(JI)=RMISS
+ 335 CONTINUE
+ XOSOUT=KLAT1*YUNIT
+ XORES =KYINC*YUNIT
+ DO 3370 JJ=1,NYP
+ RPOS=(RBOTT+(JJ-1)*RYRES*YPSIGN-XOSOUT)/XORES + 1
+ JPOS=INTDN(RPOS)
+C Check for out of bounds, and set to missing if this is the case
+ IF((JPOS.GE.1).AND.(JPOS+1.LE.NY)) THEN
+ DO 3360 JI=1,NXP
+ RVALB = TARRAY(JI+(JPOS-1)*NXP)
+ RVALT = TARRAY(JI+(JPOS+1-1)*NXP)
+ IF(.NOT.MISSING(RVALB).AND.
+ * .NOT.MISSING(RVALT) ) THEN
+ RVAL=(JPOS+1-RPOS)*RVALB
+ * +(RPOS-JPOS)*RVALT
+ ELSEIF(LNEAREST) THEN
+ IF((.NOT.MISSING(RVALB)) .AND.
+ * ((JPOS+1-RPOS).GT.0.5) ) THEN
+ RVAL=RVALB
+ ELSEIF((.NOT.MISSING(RVALT)).AND.
+ * ((RPOS-JPOS).GT.0.5) ) THEN
+ RVAL=RVALT
+ ELSE
+ RVAL=RMISS
+ ENDIF
+ ELSE
+ RVAL=RMISS
+ ENDIF
+ PARRAY(JI+(JJ-1)*NXP)=RVAL
+ 3360 CONTINUE
+ ELSE
+ DO 3365 JI=1,NXP
+ PARRAY(JI+(JJ-1)*NXP)=RMISS
+ 3365 CONTINUE
+ ENDIF
+ 3370 CONTINUE
+C
+C
+ ELSE
+ CALL INTLOG(JP_ERROR,'INTOCN: Error in logic.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCN: HICODE = ',JPQUIET)
+ CALL INTLOG(JP_ERROR,HICODE,JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCN: IIRREG = ',IIRREG)
+ INTOCN = JPROUTINE + 16
+ GOTO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 9 . Return.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+C
+ RETURN
+ END
diff --git a/interpolation/intocnu.F b/interpolation/intocnu.F
new file mode 100755
index 0000000..badc9f9
--- /dev/null
+++ b/interpolation/intocnu.F
@@ -0,0 +1,1088 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTOCNU(HICODE,HSCODE,RTOP,RBOTT,RRIGHT,RLEFT,
+ * RYRES,RXRES,
+ * INOCEAN,KLENP,KLENI,TARRAY,
+ * XARR,YARR,NXP,NYP,PARRAY,IINTPOL,ISTAGP)
+C
+C---->
+C**** INTOCNU - interpolates grib ocean data
+C
+C
+C PURPOSE
+C -------
+C Interpolates data to new grid, according to instructions.
+C Missing data is flagged with -999.9; this information is
+C passed to the new field.
+C
+C
+C Interface.
+C ----------
+C
+C IRET = INTOCNU(....)
+C
+C Input parameters.
+C -----------------
+C
+C HICODE Interpolation code
+C 'N' No interpolation
+C 'R' Interpolate only to make grid Regular
+C 'X' Interpolate in x only
+C 'Y' Interpolate in y only
+C 'F' Interpolate in x and y (Full)
+C HSCODE Staggered grid code
+C 'D' Drop every second row ('even' points)
+C 'X' Augment to standard grid by x interpolation
+C 'Y' Augment to standard grid by y interpolation
+C 'F' Augment to standard grid by x-y interpolation
+C RTOP Top of output field domain (degrees/metres/days)
+C RBOTT Bottom of output field domain ( " )
+C RRIGHT Right of output field domain ( " )
+C RLEFT Left of output field domain ( " )
+C RYRES Resolution for y-interpolation ( " )
+C RXRES Resolution for x-interpolation ( " )
+C KSEC1 Product definition block (+ high res. grid data)
+C INOCEAN Input data array
+C KLENP Size of input array
+C KLENI Size of scratch array (and also output array PARRAY)
+C TARRAY Scratch array for use during interpolation
+C
+C Output parameters.
+C ------------------
+C
+C Returns 0 if the interpolation is successful, otherwise non-zero.
+C
+C XARR x cordinates of data values, or XO,XSTEP,
+C 0.0 for regular spacing
+C YARR y cordinates of data values, or YO,YSTEP,
+C 0.0 for regular spacing
+C NXP x dimension of output field
+C NYP y dimension of output field
+C PARRAY output field array
+C IINTPOL Flag for interpolation done
+C = 0 if none,
+C = 1 if x only,
+C = 2 if y only,
+C = 3 if x and y.
+C ISTAGP Flag to show processing done for staggered grid:
+C = 0 if none
+C = 2 if every second row dropped.
+C = 3 if interpolated in x only.
+C = 4 if interpolated in y only.
+C = 5 if interpolated in x and y.
+C
+C
+C Method.
+C -------
+C Convention is always to have output field array starting in bottom
+C left hand corner of the field. The positional information for the
+C data and for the axes is also given starting in the bottom left
+C hand corner. This means YARR and INOCEAN must be inverted for the
+C default grib scanning, which starts in the top left hand corner.
+C
+C
+C Externals.
+C ----------
+C
+C INTLOG - Logs warning messages.
+C INTLOGR - Logs warning messages.
+C
+C
+C Reference.
+C ----------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C T. Stockdale ECMWF 23.02.93
+C
+C
+C Modifications.
+C --------------
+C
+C T. Stockdale ECMWF 20.05.93
+C Revised for local grib.
+C
+C J.D.Chambers ECMWF 04.10.95
+C Make into a function (remove STOPs).
+C
+C T. Stockdale ECMWF 26.09.02
+C Drop odd points (not even) from E grid, for better land sea mask
+C
+C T. Stockdale ECMWF 07.10.02
+C New standard code (matches latest rd version)
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0 . Definition of variables. Data statements.
+C ------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+C Parameters
+ INTEGER JPROUTINE, JP_LONG
+ PARAMETER (JPROUTINE = 33300 )
+ PARAMETER (JP_LONG = 3 )
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Subroutine arguments.
+ CHARACTER*1 HICODE,HSCODE
+ REAL RTOP, RBOTT, RRIGHT, RLEFT, RYRES, RXRES
+ INTEGER KLENP, KLENI, NXP, NYP, IINTPOL, ISTAGP
+ REAL INOCEAN, TARRAY, XARR, YARR, PARRAY
+ DIMENSION INOCEAN(*)
+ DIMENSION XARR(*), YARR(*)
+ DIMENSION TARRAY(KLENI), PARRAY(KLENI)
+C
+C Local variables
+ INTEGER NX, NY, KLAT1, KLAT2, KLON1, KXINC, KYINC, ISTAG
+ INTEGER IIRREG, JGCL, J, I, JSKIP, NXLEFT, NXRIGH, IWRAP, JI
+ INTEGER JIP, JJ, IOFFSET, NEWPTS, JN, IPOS, IPOSM, JPOS
+ INTEGER IPOSP1M, JMIN, JMAX, JLEFT, JJP, JJEFF
+ INTEGER NYLEFTI, NYLEFT, NYRIGH
+ REAL XUNIT, YUNIT, RRVAL, RLVAL, RUVAL, RDVAL, RXIRES
+ REAL XSIGN, XRSIGN, XFPREV, XFPOSN, RPOS, RVALL, RVALR
+ REAL XVAL, XOWEST, XORES, XPSIGN, RVAL, RYIRES, YFPREV, YFPOSN
+ REAL YSIGN, YPSIGN, YRSIGN, RMISS, EPS
+ REAL RVALB, RVALT, XOSOUT
+ LOGICAL LNEAREST
+C
+C YSIGN Flag for direction of y co-ords in data:
+C +1 if co-ords are increasing with index of INOCEAN
+C -1 if decreasing.
+C YPSIGN Flag for direction of y co-ords in output field:
+C +1 if co-ords are increasing up the page,
+C -1 if decreasing.
+C YRSIGN Flag for direction of y co-ords in output field relative
+C to that in data: YSIGN*YPSIGN
+C IINTPOL Flag for interpolation:
+C 0 = none,
+C 1 = x only,
+C 2 = y only,
+C 3 = x and y
+C RMISS Value for missing data
+C EPS Tolerance on missing data flag
+C
+C
+ EXTERNAL INTUP, INTDN, LENA, HDEGS, HMETRES
+ INTEGER INTUP, INTDN, LENA
+ CHARACTER*6 HDEGS, HMETRES
+C
+C Inline function - tests TRUE if A is a missing value
+ REAL A
+ LOGICAL MISSING
+ MISSING(A) = ( ABS(RMISS-A) .LT. EPS )
+C
+C ------------------------------------------------------------------
+C* Section 1 . Set initial values.
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ INTOCNU = 0
+C
+C Set key variables from GRIB header blocks.
+C
+ NX = NIWE
+ NY = NINS
+C
+cs Coordinate 4 of first grid point
+ KLAT1 = NIOCO4F
+cs Coordinate 4 of last grid point
+ KLAT2 = NIOCO4L
+cs Coordinate 3 of first grid point
+ KLON1 = NIOCO3F
+cs i-increment
+ KXINC = NIOIINC
+cs j-increment
+ KYINC = NIOJINC
+C
+cs Flag for normal or staggered grid
+ ISTAG = NIONOST
+cs Flag for irregular grid coordinate list
+ IIRREG = NIOIRGR
+cs 71 Number of entries in the horizontal coordinate definition
+cs 72 Number of entries in mixed coordinate definition
+cs JGCL = 74+KSEC1(71)+KSEC1(72)
+ JGCL = 0
+C
+cs Coordinate 3 flag (x-axis, usually longitude).
+ IF(NIOCO3.EQ.1) THEN
+ XUNIT = 1.0/3600.0
+ ELSE
+ XUNIT = 1.0E-6
+ ENDIF
+C
+cs Coordinate 4 flag (y-axis, usually latitude).
+ IF(NIOCO4.EQ.2) THEN
+ YUNIT = 1.0E-3
+ ELSE IF(NIOCO4.EQ.1) THEN
+ YUNIT = 1.0/3600.0
+ ELSE
+ YUNIT = 1.0E-6
+ ENDIF
+C
+ IINTPOL = 0
+cs RMISS = 9999.0
+cs set it from grib_api
+ RMISS = RMISSGV
+ EPS = 0.1
+cs EPS = 0.01
+C
+C ------------------------------------------------------------------
+C* Section 2 . Deal with staggered grid if present.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C The approach in this section is to replace the staggered grid by
+C a non-staggered version, either by interpolating the data onto new
+C grid points or by simply dropping half of the data points. A new
+C version of INOCEAN is created, and parts of KSEC1 are modified.
+C This enables the rest of INTOCNU to treat the field in a consistent
+C manner, BUT it means that KSEC1 and INOCEAN will be altered on
+C leaving this subroutine (and presently in an inconsistent way).
+C
+C The interpolations coded in this section ignore the metric of the
+C staggered grid, that is they simply average neighbouring values to
+C find a new grid point value. The more general case can be added
+C later if desired.
+C
+C Note: we prefer to drop odd points and keep even points, because
+C the standard version of HOPE2 uses an external mask to define the
+C land-sea mask of its even points. The mask for odd points then has
+C to be interpolated, which is less accurate, so the plots look
+C better if the even points are kept.
+C
+C
+ IF(ISTAG.EQ.1) THEN
+C
+C Drop odd row points ...
+C
+ IF(HSCODE.EQ.'D') THEN
+ ISTAGP = 2
+ NY = NY/2
+ KYINC = KYINC*2
+ DO 210 J = 1,NY
+ DO 210 I = 1,NX
+ INOCEAN(I+NX*(J-1)) = INOCEAN(I+NX*((J-1)*2+1))
+ 210 CONTINUE
+C
+C Reset the grid coordinate list.
+C Remove the y coordinates of the even rows,
+C the x coordinates of the even rows, and also the first x
+C coordinate of an even regular row.
+C
+cs Grid coordinate list
+ IF(IIRREG.EQ.2) THEN
+ KLON1 = OCCOOR(1)
+ DO 212 J = 1,NY
+ OCCOOR(J) = OCCOOR(1+2*J)
+ 212 CONTINUE
+C
+ ELSE IF(IIRREG.EQ.3) THEN
+ KLON1 = OCCOOR(1)
+ JSKIP = NX
+ DO 214 J = 1,NY
+ OCCOOR(JSKIP+J) = OCCOOR(JSKIP+NX+2*J)
+ 214 CONTINUE
+ ENDIF
+C
+C* Staggered grid: interpolation in x.
+C
+ ELSE IF(HSCODE.EQ.'X') THEN
+ ISTAGP = 3
+ NX = NX*2
+ KXINC = KXINC/2
+ IF(((NX*NY).GT.KLENI).OR.((NX*NY).GT.KLENP)) THEN
+ CALL INTLOG(JP_ERROR,'INTOCNU: Array too small.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCNU: Required = ',NXP*NY)
+ CALL INTLOG(JP_ERROR,'INTOCNU: Available = ',KLENP)
+ CALL INTLOG(JP_ERROR,'INTOCNU: Available = ',KLENI)
+ INTOCNU = JPROUTINE + 17
+ GOTO 900
+ ENDIF
+C
+C Expand the data into a temporary array, and then copy back
+C into INOCEAN. Note the treatment of the end points, which
+C assumes a longitude wrap-round. Remember to mask land points
+C so that either both points are missing or neither.
+C
+ DO 220 J = 1,NY,2
+ RRVAL = INOCEAN(1+(J-1)*NX/2)
+ RLVAL = INOCEAN(NX/2+(J-1)*NX/2)
+ IF(MISSING(RRVAL)) RLVAL = RMISS
+ IF(MISSING(RLVAL)) RRVAL = RMISS
+ TARRAY(1+(J-1)*NX) = (RRVAL+RLVAL)*0.5
+ TARRAY(2+(J-1)*NX) = INOCEAN(1+(J-1)*NX/2)
+ DO 220 I = 2,NX/2
+ RRVAL = INOCEAN(I +(J-1)*NX/2)
+ RLVAL = INOCEAN(I-1+(J-1)*NX/2)
+ IF(MISSING(RRVAL)) RLVAL = RMISS
+ IF(MISSING(RLVAL)) RRVAL = RMISS
+ TARRAY(I*2-1+(J-1)*NX) = (RRVAL+RLVAL)*0.5
+ TARRAY(I*2 +(J-1)*NX) = INOCEAN(I +(J-1)*NX/2)
+ 220 CONTINUE
+C
+ DO 222 J = 2,NY,2
+ RRVAL = INOCEAN(1+(J-1)*NX/2)
+ RLVAL = INOCEAN(NX/2+(J-1)*NX/2)
+ IF(MISSING(RRVAL)) RLVAL = RMISS
+ IF(MISSING(RLVAL)) RRVAL = RMISS
+ TARRAY(NX+(J-1)*NX) = (RLVAL+RRVAL)*0.5
+ TARRAY(NX-1+(J-1)*NX) = INOCEAN(NX/2+(J-1)*NX/2)
+ DO 222 I = 1,NX/2-1
+ RRVAL = INOCEAN(I+1+(J-1)*NX/2)
+ RLVAL = INOCEAN(I +(J-1)*NX/2)
+ IF(MISSING(RRVAL)) RLVAL = RMISS
+ IF(MISSING(RLVAL)) RRVAL = RMISS
+ TARRAY(I*2 +(J-1)*NX) = (RLVAL+RRVAL)*0.5
+ TARRAY(I*2-1+(J-1)*NX) = INOCEAN(I +(J-1)*NX/2)
+ 222 CONTINUE
+ DO 224 J = 1,NY
+ DO 224 I = 1,NX
+ INOCEAN(I+(J-1)*NX) = TARRAY(I+(J-1)*NX)
+ 224 CONTINUE
+C
+C Reset the grid coordinate list if necessary, again making
+C use of a temporary array. Expand the x-coordinate list,
+C and remove the x coordinate of the first even point if grid
+C is regular in x.
+C
+ KLON1 = OCCOOR(1)
+ IF((IIRREG.EQ.1).OR.(IIRREG.EQ.3)) THEN
+ JSKIP = 0
+ DO 226 J = 1,NX/2
+ TARRAY(J*2-1) = OCCOOR(JSKIP+J)
+ TARRAY(J*2) = OCCOOR(JSKIP+NX/2+J)
+ 226 CONTINUE
+ DO 227 J = 1,NX
+ OCCOOR(JSKIP+J) = TARRAY(J)
+ 227 CONTINUE
+ ELSE IF((IIRREG.EQ.2)) THEN
+ DO 228 J = 1,NY
+ OCCOOR(J) = OCCOOR(1+J)
+ 228 CONTINUE
+ ENDIF
+C
+C Staggered grid: interpolation in y.
+C
+ ELSE IF(HSCODE.EQ.'Y') THEN
+ ISTAGP = 4
+ NX = NX*2
+ KXINC = KXINC/2
+ IF(((NX*NY).GT.KLENI).OR.((NX*NY).GT.KLENP)) THEN
+ CALL INTLOG(JP_ERROR,'INTOCNU: Array too small.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCNU: Required = ',NXP*NY)
+ CALL INTLOG(JP_ERROR,'INTOCNU: Available = ',KLENP)
+ CALL INTLOG(JP_ERROR,'INTOCNU: Available = ',KLENI)
+ INTOCNU = JPROUTINE + 18
+ GOTO 900
+ ENDIF
+C
+C Expand the data into a temporary array, and then copy back
+C into INOCEAN. For the polarmost rows, use X interpolation.
+C
+C First the even rows...
+ DO 230 J = 2,NY-1,2
+ DO 230 I = 1,NX/2
+ RUVAL = INOCEAN(I+(J-2)*NX/2)
+ RDVAL = INOCEAN(I+(J )*NX/2)
+ IF(MISSING(RUVAL)) RDVAL = RMISS
+ IF(MISSING(RDVAL)) RUVAL = RMISS
+ TARRAY(I*2 +(J-1)*NX) = (RDVAL+RUVAL)*0.5
+ TARRAY(I*2-1+(J-1)*NX) = INOCEAN(I+(J-1)*NX/2)
+ 230 CONTINUE
+ RRVAL = INOCEAN(1+(NY-1)*NX/2)
+ RLVAL = INOCEAN(NX/2+(NY-1)*NX/2)
+ IF(MISSING(RRVAL)) RLVAL = RMISS
+ IF(MISSING(RLVAL)) RRVAL = RMISS
+ TARRAY(NX+(NY-1)*NX) = (RLVAL+RRVAL)*0.5
+ TARRAY(NX-1+(NY-1)*NX) = INOCEAN(NX/2+(NY-1)*NX/2)
+ DO 231 I = 2,NX/2
+ RRVAL = INOCEAN(I+1+(NY-1)*NX/2)
+ RLVAL = INOCEAN(I+(NY-1)*NX/2)
+ IF(MISSING(RRVAL)) RLVAL = RMISS
+ IF(MISSING(RLVAL)) RRVAL = RMISS
+ TARRAY(I*2+(NY-1)*NX) = (RRVAL+RLVAL)*0.5
+ TARRAY(I*2-1+(NY-1)*NX) = INOCEAN(I+(NY-1)*NX/2)
+ 231 CONTINUE
+C
+C Then the odd rows
+ DO 232 J = 3,NY-1,2
+ RUVAL = INOCEAN(NX/2+(J-2)*NX/2)
+ RDVAL = INOCEAN(NX/2+(J )*NX/2)
+ IF(MISSING(RUVAL)) RDVAL = RMISS
+ IF(MISSING(RDVAL)) RUVAL = RMISS
+ TARRAY(1+(J-1)*NX) = (RRVAL+RLVAL)*0.5
+ TARRAY(2+(J-1)*NX) = INOCEAN(1+(J-1)*NX/2)
+ DO 232 I = 1,NX/2
+ RUVAL = INOCEAN(I+(J-2)*NX/2)
+ RDVAL = INOCEAN(I+(J )*NX/2)
+ IF(MISSING(RUVAL)) RDVAL = RMISS
+ IF(MISSING(RDVAL)) RUVAL = RMISS
+ TARRAY(I*2-1+(J-1)*NX) = (RDVAL+RUVAL)*0.5
+ TARRAY(I*2 +(J-1)*NX) = INOCEAN(I+(J-1)*NX/2)
+ 232 CONTINUE
+C
+ RRVAL = INOCEAN(1+(1-1)*NX/2)
+ RLVAL = INOCEAN(NX/2+(1-1)*NX/2)
+ IF(MISSING(RRVAL)) RLVAL = RMISS
+ IF(MISSING(RLVAL)) RRVAL = RMISS
+ TARRAY(1+(1-1)*NX) = (RRVAL+RLVAL)*0.5
+ TARRAY(2+(1-1)*NX) = INOCEAN(1+(1-1)*NX/2)
+ DO 233 I = 2,NX/2
+ RRVAL = INOCEAN(I+(1-1)*NX/2)
+ RLVAL = INOCEAN(I-1+(1-1)*NX/2)
+ IF(MISSING(RRVAL)) RLVAL = RMISS
+ IF(MISSING(RLVAL)) RRVAL = RMISS
+ TARRAY(I*2-1+(1-1)*NX) = (RRVAL+RLVAL)*0.5
+ TARRAY(I*2+(1-1)*NX) = INOCEAN(I+(1-1)*NX/2)
+ 233 CONTINUE
+
+ DO 234 J = 1,NY
+ DO 234 I = 1,NX
+ INOCEAN(I+(J-1)*NX) = TARRAY(I+(J-1)*NX)
+ 234 CONTINUE
+C
+C Reset the grid coordinate list if necessary, again making
+C use of a temporary array. Expand the x-coordinate list,
+C and remove the x coordinate of the first even point if
+C grid is regular in x.
+C
+ IF((IIRREG.EQ.1).OR.(IIRREG.EQ.3)) THEN
+ JSKIP = 0
+ DO 235 J = 1,NX/2
+ TARRAY(J*2-1) = OCCOOR(JSKIP+J)
+ TARRAY(J*2) = OCCOOR(JSKIP+NX/2+J)
+ 235 CONTINUE
+ DO 236 J = 1,NX
+ OCCOOR(JSKIP+J) = TARRAY(J)
+ 236 CONTINUE
+ ELSE IF((IIRREG.EQ.2)) THEN
+ DO 237 J = 1,NY
+ OCCOOR(J) = OCCOOR(1+J)
+ 237 CONTINUE
+ ENDIF
+C
+C Staggered grid: interpolation in x and y.
+C
+ ELSE IF(HSCODE.EQ.'F') THEN
+ ISTAGP = 5
+ CALL INTLOG(JP_ERROR,'INTOCNU: Staggered grid opt. F',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCNU: (interpolate x and y)',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCNU: not yet implemented.',JPQUIET)
+ INTOCNU = JPROUTINE + 1
+ GOTO 900
+ ELSE
+ CALL INTLOG(JP_ERROR,'INTOCNU: Staggered grid option',JPQUIET)
+ CALL INTLOG(JP_ERROR,HSCODE,JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCNU: not known.',JPQUIET)
+ INTOCNU = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ ISTAG = 0
+C
+ ELSE
+ ISTAGP = 0
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 3 . Set X coordinates and interpolate in X.
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C The procedure is first to do the x interpolation (if any), and
+C copy the result into a temporary array. The y interpolation is
+C done in the next section.
+C
+C The one complication here is to ensure proper longitude wrap-round
+C where appropriate.
+C
+C Some plot systems have difficulty controlling the data within the
+C viewport. Because of this, and in the interests of efficiency, the
+C data arrays are truncated even if no interpolation is being done.
+C
+C
+C No interpolation in X.
+C
+ IF((HICODE.EQ.'N').OR.
+ * ((HICODE.EQ.'R').AND.((IIRREG.EQ.0).OR.(IIRREG.EQ.2))).OR.
+ * (HICODE.EQ.'Y') ) THEN
+C
+C If x is longitude, set parameters up for wrap-round
+C Wrap-round activated only if longitude range of data > 350 deg.
+C
+ IF((IIRREG.EQ.0).OR.(IIRREG.EQ.2)) THEN
+ RXIRES = KXINC*XUNIT
+ NXLEFT = INTDN((RLEFT-KLON1*XUNIT)/RXIRES+1)
+ NXRIGH = INTUP((RRIGHT-KLON1*XUNIT)/RXIRES+1)
+ NXP = NXRIGH-NXLEFT+1
+ IF(NXP.LE.1) THEN
+ CALL INTLOG(JP_ERROR,'INTOCNU: NXP negative = ',NXP)
+ INTOCNU = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ XARR(1) = KLON1*XUNIT+(NXLEFT-1)*RXIRES
+ XARR(2) = KXINC*XUNIT
+ XARR(3) = 0.0
+cs Coordinate 3 flag (x-axis, usually longitude).
+ IF( (NIOCO3.EQ.3) .AND. (KXINC*NX*XUNIT.GT.350.0) ) THEN
+ IWRAP = 1
+ ELSE
+ IWRAP = 0
+ ENDIF
+C
+ ELSE IF( (IIRREG.EQ.1) .OR. (IIRREG.EQ.3) ) THEN
+ NXP = NX
+ NXLEFT = 1
+cs JSKIP = JGCL
+ JSKIP = 0
+ DO 312 JI = 1,NXP
+ XARR(JI) = OCCOOR(JSKIP+JI)*XUNIT
+ 312 CONTINUE
+cs Coordinate 3 flag (x-axis, usually longitude).
+ IF( (NIOCO3.EQ.3) .AND. (KXINC*NX*XUNIT.GT.350.0) ) THEN
+ IWRAP = 1
+ INTOCNU = JPROUTINE + 4
+ GOTO 900
+ ELSE
+ IWRAP = 0
+ ENDIF
+ ENDIF
+C
+ IF((NXP*NY).GT.KLENI) THEN
+ CALL INTLOG(JP_ERROR,'INTOCNU: Array too small.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCNU: Required = ',NXP*NY)
+ CALL INTLOG(JP_ERROR,'INTOCNU: Available = ',KLENI)
+ INTOCNU = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+C
+C Copy the data into the temporary array
+C
+ DO 318 JI = 1,NXP
+ JIP = JI+NXLEFT-1
+ IF(IWRAP.EQ.1) THEN
+ IF(JIP.LE.0) JIP = JIP+NX
+ IF(JIP.GT.NX) JIP = JIP-NX
+ ENDIF
+ IF((JIP.GE.1).AND.(JIP.LE.NX)) THEN
+ DO 316 JJ = 1,NY
+ TARRAY(JI+(JJ-1)*NXP) = INOCEAN(JIP+(JJ-1)*NX)
+ 316 CONTINUE
+ ELSE
+ DO 317 JJ = 1,NY
+ TARRAY(JI+(JJ-1)*NXP) = RMISS
+ 317 CONTINUE
+ ENDIF
+ 318 CONTINUE
+C
+C Interpolation from a grid irregular in X.
+C ---------------------------------------------
+C
+ ELSE IF(((HICODE.EQ.'R').OR.
+ * (HICODE.EQ.'X').OR.
+ * (HICODE.EQ.'F') ).AND.
+ * ((IIRREG.EQ.1).OR.(IIRREG.EQ.3)) ) THEN
+
+ XPSIGN = SIGN(1.0,(RRIGHT-RLEFT))
+ NXP = NINT((RRIGHT-RLEFT)/RXRES*XPSIGN)+1
+ IF((NXP*NY).GT.KLENI) THEN
+ CALL INTLOG(JP_ERROR,'INTOCNU: Array too small.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCNU: Required = ',NXP*NY)
+ CALL INTLOG(JP_ERROR,'INTOCNU: Available = ',KLENI)
+ INTOCNU = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+ RRIGHT = RLEFT+RXRES*XPSIGN*(NXP-1)
+ XARR(1) = RLEFT
+ XARR(2) = RXRES*XPSIGN
+ XARR(3) = 0.0
+ IINTPOL = IINTPOL+1
+ IOFFSET = 0
+ XSIGN = SIGN(1.0,((OCCOOR(IOFFSET+2)-OCCOOR(IOFFSET+1))*1.0))
+ XRSIGN = XSIGN*XPSIGN
+ DO 321 JI = 1,NXP*NY
+ TARRAY(JI) = RMISS
+ 321 CONTINUE
+C
+C Work through the known (irregular) data points.
+C Calculate the position of the point as a fractional number of
+C points on the new regular grid
+C (XFPOSN). If there are any points on the new grid between this
+C point and the previous one (XFPREV), then set these points by
+C interpolation between the two known points.
+ XFPREV= (OCCOOR(IOFFSET+1)*XUNIT-RLEFT)/RXRES*XPSIGN- 0.5*XRSIGN
+ DO 324 JI = 1,NX
+ XFPOSN = (OCCOOR(IOFFSET+JI)*XUNIT-RLEFT)/(RXRES*XPSIGN)
+ NEWPTS = INTDN((XFPOSN*XRSIGN))-INTDN((XFPREV*XRSIGN))
+ DO 323 JN = 1,NEWPTS
+ IPOS = (INTDN(XFPREV*XRSIGN)+JN)*XRSIGN+1
+ RPOS = (IPOS-1)*1.0
+ IF((IPOS.GE.1).AND.(IPOS.LE.NXP)) THEN
+ DO 322 JJ = 1,NY
+ RVALL = INOCEAN(JI-1+NX*(JJ-1))
+ RVALR = INOCEAN(JI+NX*(JJ-1))
+ IF(.NOT.MISSING(RVALL) .AND. .NOT.MISSING(RVALR) ) THEN
+ XVAL = (XFPOSN-RPOS)/(XFPOSN-XFPREV)*RVALL
+ * +(RPOS-XFPREV)/(XFPOSN-XFPREV)*RVALR
+ ELSE
+ XVAL = RMISS
+ ENDIF
+ TARRAY(IPOS+NXP*(JJ-1)) = XVAL
+ 322 CONTINUE
+ ENDIF
+ 323 CONTINUE
+ XFPREV = XFPOSN
+ 324 CONTINUE
+
+C
+C Interpolation from a grid regular in X.
+C
+ ELSE IF(((HICODE.EQ.'X').OR.(HICODE.EQ.'F')).AND.
+ * ((IIRREG.EQ.0).OR.(IIRREG.EQ.2)) ) THEN
+
+ XPSIGN = SIGN(1.0,(RRIGHT-RLEFT))
+ NXP = NINT((RRIGHT-RLEFT)/RXRES*XPSIGN)+1
+ IF((NXP*NY).GT.KLENI) THEN
+ CALL INTLOG(JP_ERROR,'INTOCNU: Array too small.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCNU: Required = ',NXP*NY)
+ CALL INTLOG(JP_ERROR,'INTOCNU: Available = ',KLENI)
+ INTOCNU = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+ RRIGHT = RLEFT+RXRES*XPSIGN*(NXP-1)
+ XARR(1) = RLEFT
+ XARR(2) = RXRES*XPSIGN
+ XARR(3) = 0.0
+ IINTPOL = IINTPOL+1
+C
+C Work through the new regular grid points. Calculate the position
+C of the point as a fractional number of points on the old grid.
+C Use this fractional number to estimate the value of the field
+C at the new point
+C
+C (Note that just to the right of the first point, RPOS will be
+C eg 1.1, not 0.1)
+C
+ DO 330 JI = 1,NXP*NY
+ TARRAY(JI) = RMISS
+ 330 CONTINUE
+C
+ XOWEST = KLON1*XUNIT
+ XORES = KXINC*XUNIT
+ DO 3320 JI = 1,NXP
+ RPOS = (RLEFT+(JI-1)*RXRES-XOWEST)/XORES + 1
+ IPOS = INTDN(RPOS)
+C
+C Check for out of bounds, and set to zero unless x is
+C longitude, in which case attempt to wrap round.
+ IF( (IPOS.GE.1) .AND. ((IPOS+1).LE.NX) ) THEN
+ DO 3310 JJ = 1,NY
+ RVALL = INOCEAN(IPOS+(JJ-1)*NX)
+ RVALR = INOCEAN(IPOS+1+(JJ-1)*NX)
+ IF(.NOT. MISSING(RVALL) .AND. .NOT. MISSING(RVALR) ) THEN
+ RVAL = (IPOS+1-RPOS)*RVALL + (RPOS-IPOS)*RVALR
+C
+C Do not set to missing if there is good data close by.
+ ELSEIF( (.NOT.MISSING(RVALL)) .AND.
+ X ((IPOS+1-RPOS).GT.0.5) ) THEN
+ RVAL = RVALL
+ ELSEIF( (.NOT. MISSING(RVALR)).AND.
+ X ((RPOS-IPOS).GT.0.5)) THEN
+ RVAL = RVALR
+ ELSE
+ RVAL = RMISS
+ ENDIF
+ TARRAY(JI+(JJ-1)*NXP) = RVAL
+ 3310 CONTINUE
+C
+ ELSEIF( NIOCO3.EQ.JP_LONG ) THEN
+C
+C This works only if the longitude points are equally spaced
+C around the globe, ie the gap between the first and last
+C points is equal to the gap between any other pair of
+C adjacent points.
+C
+ IPOSM = MOD(IPOS,NX)
+ IPOSP1M = MOD((IPOS+1),NX)
+ IF(IPOSM.LE.0) IPOSM = IPOSM+NX
+ IF(IPOSP1M.LE.0) IPOSP1M = IPOSP1M+NX
+ DO 3313 JJ = 1,NY
+ RVALL = INOCEAN(IPOSM+(JJ-1)*NX)
+ RVALR = INOCEAN(IPOSP1M+(JJ-1)*NX)
+ IF(.NOT. MISSING(RVALL) .AND. .NOT. MISSING(RVALR) ) THEN
+ RVAL = (IPOS+1-RPOS)*RVALL + (RPOS-IPOS)*RVALR
+C
+C Do not set to missing if there is good data close by.
+ ELSEIF( (.NOT.MISSING(RVALL)) .AND.
+ X ((IPOS+1-RPOS).GT.0.5) ) THEN
+ RVAL = RVALL
+ ELSEIF( (.NOT. MISSING(RVALR)).AND.
+ X ((RPOS-IPOS).GT.0.5) ) THEN
+ RVAL = RVALR
+ ELSE
+ RVAL = RMISS
+ ENDIF
+ IF(RVAL.GT.1E6) THEN
+ RVAL = RMISS
+ ENDIF
+ TARRAY(JI+(JJ-1)*NXP) = RVAL
+ 3313 CONTINUE
+ ELSE
+ DO 3316 JJ = 1,NY
+ TARRAY(JI+(JJ-1)*NXP) = RMISS
+ 3316 CONTINUE
+ ENDIF
+ 3320 CONTINUE
+C
+ ELSE
+ CALL INTLOG(JP_ERROR,'INTOCNU: Error in logic.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCNU: HICODE = ',JPQUIET)
+ CALL INTLOG(JP_ERROR,HICODE,JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCNU: IIRREG = ',IIRREG)
+ INTOCNU = JPROUTINE + 8
+ GOTO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 4 . Set Y coordinates and interpolate in Y.
+C ------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+C The x-interpolated field in the temporary array is interpolated in
+C y into the final output field array. Note that the field and the
+C coordinate array are both inverted in the y direction during this
+C section.
+C
+C Some plot systems have difficulty controlling the data within the
+C viewport. Because of this, and in the interests of efficiency, the
+C data arrays are truncated even if no interpolation is being done.
+C
+C
+C No interpolation in Y.
+C
+ IF((HICODE.EQ.'N').OR.
+ * ((HICODE.EQ.'R').AND.((IIRREG.EQ.0).OR.(IIRREG.EQ.1))).OR.
+ * (HICODE.EQ.'X') ) THEN
+C
+C If y is longitude, set parameters up for wrap-round
+C Wrap-round activated only if longitude range of data > 350 deg.
+C
+ IF((IIRREG.EQ.0).OR.(IIRREG.EQ.1)) THEN
+C
+C Remember to invert calc of NYP if RYIRES -ve ... 22.04.94
+ RYIRES = KYINC*YUNIT
+ IF(RYIRES.GT.0) THEN
+ NYLEFT = INTDN((RBOTT-KLAT1*YUNIT)/RYIRES+1)
+ NYRIGH = INTUP((RTOP-KLAT1*YUNIT)/RYIRES+1)
+ NYP = NYRIGH-NYLEFT+1
+ ELSE
+ NYRIGH = INTUP((RBOTT-KLAT1*YUNIT)/RYIRES+1)
+ NYLEFT = INTDN((RTOP-KLAT1*YUNIT)/RYIRES+1)
+ NYP = NYRIGH-NYLEFT+1
+ ENDIF
+ IF(NYP.LE.1) THEN
+ CALL INTLOG(JP_ERROR,'INTOCNU: NYP negative = ',NYP)
+ INTOCNU = JPROUTINE + 9
+ GOTO 900
+ ENDIF
+C
+C Remember to invert yarr coordinates ... 06.07.93
+ YARR(1) = KLAT1*YUNIT+(NYRIGH-1)*RYIRES
+ YARR(2) = -KYINC*YUNIT
+ YARR(3) = 0.0
+C
+C Remember NYLEFT is relative to the inverted array ... 19.01.96
+C ... but be careful to do this exactly. 01.04.97
+ NYLEFTI=NYLEFT
+ NYLEFT=NY+1-NYRIGH
+ NYRIGH=NY+1-NYLEFTI
+C
+ IF((NIOCO4.EQ.3) .AND. (KYINC*NY*YUNIT.GT.350.0) ) THEN
+ IWRAP = 1
+ ELSE
+ IWRAP = 0
+ ENDIF
+C
+ ELSE IF(IIRREG.EQ.2) THEN
+ IOFFSET = 0
+ YPSIGN = SIGN(1.0,(RTOP-RBOTT))
+ YSIGN = SIGN(1.0,((OCCOOR(IOFFSET+2)-OCCOOR(IOFFSET+1))*1.0))
+ YRSIGN = YSIGN*YPSIGN
+ JMIN = 0
+ DO 410 JI = 1,NY
+ YARR(JI) = OCCOOR((IOFFSET+NY+1-JI))*YUNIT
+ IF(YRSIGN.LT.0.0) THEN
+ IF((YARR(JI)-RBOTT)*YSIGN .GT. 0.0) JMIN = JI
+ IF((YARR(JI)-RTOP )*YSIGN .GT. 0.0) JMAX = JI+1
+ ELSE
+ IF((YARR(JI)-RTOP )*YSIGN .GT. 0.0) JMIN = JI
+ IF((YARR(JI)-RBOTT)*YSIGN .GT. 0.0) JMAX = JI+1
+ ENDIF
+ 410 CONTINUE
+ IF(JMIN.EQ.0) THEN
+ CALL INTLOG(JP_ERROR,'INTOCNU: Domain out of range.',JPQUIET)
+ CALL INTLOGR(JP_ERROR,'INTOCNU: Requested Y = ',RBOTT)
+ CALL INTLOGR(JP_ERROR,'INTOCNU: Data limit of Y = ',YARR(1))
+ INTOCNU = JPROUTINE + 10
+ GOTO 900
+ ENDIF
+ IF(JMAX.EQ.NY+1) THEN
+ CALL INTLOG(JP_ERROR,'INTOCNU: Domain out of range.',JPQUIET)
+ CALL INTLOGR(JP_ERROR,'INTOCNU: Requested Y = ',RTOP)
+ CALL INTLOGR(JP_ERROR,'INTOCNU: Data limit of Y = ',YARR(NY))
+ INTOCNU = JPROUTINE + 11
+ GOTO 900
+ ENDIF
+C
+ NYP = (JMAX-JMIN)+1
+ NYLEFT = JMIN
+ DO 411 JI = 1,NYP
+ YARR(JI) = YARR(JI+(NYLEFT-1))
+ 411 CONTINUE
+C
+ IF((NIOCO4.EQ.3) .AND. (KYINC*NY*YUNIT.GT.350.0) ) THEN
+ IWRAP = 1
+ CALL INTLOG(JP_ERROR,'INTOCNU: Irregular wrap-round',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCNU: not yet implemented.',JPQUIET)
+ INTOCNU = JPROUTINE + 12
+ GOTO 900
+ ELSE
+ IWRAP = 0
+ ENDIF
+C
+ ELSE IF(IIRREG.EQ.3) THEN
+ NYP = NY
+ NYLEFT = 1
+ JSKIP = NX
+ DO 412 JI = 1,NYP
+ YARR(JI) = OCCOOR(JSKIP+(NY+1-JI))*YUNIT
+ 412 CONTINUE
+ IF((NIOCO4.EQ.3) .AND. (KYINC*NY*YUNIT.GT.350.0) ) THEN
+ IWRAP = 1
+ CALL INTLOG(JP_ERROR,'INTOCNU: Irregular wrap-round',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCNU: not yet implemented.',JPQUIET)
+ INTOCNU = JPROUTINE + 13
+ GOTO 900
+ ELSE
+ IWRAP = 0
+ ENDIF
+ ENDIF
+C
+ IF((NXP*NYP).GT.KLENI) THEN
+ CALL INTLOG(JP_ERROR,'INTOCNU: Array too small.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCNU: Required = ',NXP*NYP)
+ CALL INTLOG(JP_ERROR,'INTOCNU: Available = ',KLENI)
+ INTOCNU = JPROUTINE + 14
+ GOTO 900
+ ENDIF
+C
+C Copy the data into the temporary array, and invert it at
+C same time.
+C Note: NYLEFT is the starting index in the inverted data array.
+C
+c DO 416 JJ = 1,NYP
+c DO 414 JI = 1,NXP
+c PARRAY(JI+(JJ-1)*NXP) = TARRAY(JI+(NY-JJ)*NXP)
+c 414 CONTINUE
+c 416 CONTINUE
+C
+ DO 418 JJ = 1,NYP
+cc JJP = JJ+NYLEFT-1
+ JLEFT = NY-(NYLEFT-1)
+ JJP = JLEFT-JJ+1
+ IF(IWRAP.EQ.1) THEN
+ IF(JJP.LE.0) JJP = JJP+NY
+ IF(JJP.GT.NY) JJP = JJP-NY
+ ENDIF
+ IF((JJP.GE.1).AND.(JJP.LE.NY)) THEN
+ DO 416 JI = 1,NXP
+cc PARRAY(JI+(NYP-JJ)*NXP) = TARRAY(JI+(JJP-1)*NXP)
+ PARRAY(JI+(JJ-1)*NXP) = TARRAY(JI+(JJP-1)*NXP)
+ 416 CONTINUE
+ ELSE
+ DO 417 JI = 1,NXP
+ PARRAY(JI+(NYP-JJ)*NXP) = RMISS
+ 417 CONTINUE
+ ENDIF
+ 418 CONTINUE
+C
+C Interpolation from a grid irregular in Y.
+C
+ ELSE IF(((HICODE.EQ.'R').OR.
+ * (HICODE.EQ.'Y').OR.
+ * (HICODE.EQ.'F') ).AND.
+ * ((IIRREG.EQ.2).OR.(IIRREG.EQ.3)) ) THEN
+ YPSIGN = SIGN(1.0,(RTOP-RBOTT))
+ IF( YPSIGN.GT.0 ) THEN
+ NYP = NINT((RTOP-RBOTT+ 0.0001)/RYRES)+1
+ ELSE
+ NYP = NINT((RBOTT-RTOP + 0.0001)/RYRES)+1
+ ENDIF
+Cjdc NYP = NINT((RTOP-RBOTT)/RYRES*YPSIGN)+1
+ IF((NXP*NYP).GT.KLENI) THEN
+ CALL INTLOG(JP_ERROR,'INTOCNU: Array too small.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCNU: Required = ',NXP*NYP)
+ CALL INTLOG(JP_ERROR,'INTOCNU: Available = ',KLENI)
+ INTOCNU = JPROUTINE + 15
+ GOTO 900
+ ENDIF
+ RTOP = RBOTT+RYRES*YPSIGN*(NYP-1)
+ YARR(1) = RBOTT
+ YARR(2) = RYRES*YPSIGN
+ YARR(3) = 0.0
+ IINTPOL = IINTPOL+2
+ IF(IIRREG.EQ.2) THEN
+ IOFFSET = 0
+ ELSE IF(IIRREG.EQ.3) THEN
+ IOFFSET = NX
+ ENDIF
+ YSIGN = SIGN(1.0,((OCCOOR(IOFFSET+2)-OCCOOR(IOFFSET+1))*1.0))
+ YRSIGN = YSIGN*YPSIGN
+ DO 420 JI = 1,NXP*NYP
+ PARRAY(JI) = RMISS
+ 420 CONTINUE
+C
+C Work through the known (irregular) data points. Calculate the
+C position of the point as a fractional number of points on the
+C new regular grid (YFPOSN). If there are any points on the new
+C grid between this point and the previous one (YFPREV), then set
+C these points by interpolation between the two known points.
+C Check that the points are in range.
+C Note that we are willing to overlap slightly at the start, but
+C must fiddle the array arguments to do this.
+C
+ YFPREV= (OCCOOR(IOFFSET+1)*YUNIT-RBOTT)/RYRES*YPSIGN- 0.5*YRSIGN
+ DO 428 JJ = 1,NY
+ YFPOSN = (OCCOOR(IOFFSET+JJ)*YUNIT-RBOTT)/RYRES*YPSIGN
+ NEWPTS = INTDN((YFPOSN*YRSIGN)) -INTDN((YFPREV*YRSIGN))
+C
+C INT truncates toward zero;
+C INTDN truncates downwards in all cases
+C
+ DO 426 JN = 1,NEWPTS
+ IPOS = (INTDN(YFPREV*YRSIGN)+JN)*YRSIGN+1
+ RPOS = (IPOS-1)*1.0
+ IF((IPOS.GE.1).AND.(IPOS.LE.NYP)) THEN
+ JJEFF = JJ
+ IF(JJ.EQ.1) JJEFF = 2
+ DO 424 JI = 1,NXP
+ RVALL = TARRAY(JI+NXP*(JJEFF-2))
+ RVALR = TARRAY(JI+NXP*(JJ-1))
+ IF(.NOT.MISSING(RVALL) .AND. .NOT.MISSING(RVALR) ) THEN
+ XVAL = (YFPOSN-RPOS)/(YFPOSN-YFPREV)*RVALL
+ * +(RPOS-YFPREV)/(YFPOSN-YFPREV)*RVALR
+ ELSE
+ XVAL = RMISS
+ ENDIF
+ PARRAY(JI+NXP*(IPOS-1)) = XVAL
+ 424 CONTINUE
+ ENDIF
+ 426 CONTINUE
+ YFPREV = YFPOSN
+ 428 CONTINUE
+C
+C
+C
+C 4.3 INTERPOLATION FROM A GRID REGULAR IN Y
+C -------------------------------------------
+C
+ ELSEIF(((HICODE.EQ.'Y').OR.(HICODE.EQ.'F')).AND.
+ * ((IIRREG.EQ.0).OR.(IIRREG.EQ.1)) ) THEN
+
+ LNEAREST=.TRUE.
+
+ YPSIGN=SIGN(1.,(RTOP-RBOTT))
+ NYP=NINT((RTOP-RBOTT)/RYRES*YPSIGN)+1
+ IF((NXP*NYP).GT.KLENI) THEN
+ CALL INTLOG(JP_ERROR,'INTOCNU: Array too small.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCNU: Required = ',NXP*NYP)
+ CALL INTLOG(JP_ERROR,'INTOCNU: Available = ',KLENI)
+ INTOCNU = JPROUTINE + 19
+ GOTO 900
+ ENDIF
+ RTOP=RBOTT+RYRES*(NYP-1)*YPSIGN
+ YARR(1)=RBOTT
+ YARR(2)=RYRES*YPSIGN
+ YARR(3)=0.0
+C Work through the new regular grid points. Calculate the position of
+C the point as a fractional number of points on the old grid. Use this
+C fractional number to estimate the value of the field at the new point
+ IINTPOL=IINTPOL+2
+ DO 335 JI=1,NXP*NYP
+ PARRAY(JI)=RMISS
+ 335 CONTINUE
+ XOSOUT=KLAT1*YUNIT
+ XORES =KYINC*YUNIT
+ DO 3370 JJ=1,NYP
+ RPOS=(RBOTT+(JJ-1)*RYRES*YPSIGN-XOSOUT)/XORES + 1
+ JPOS=INTDN(RPOS)
+C Check for out of bounds, and set to missing if this is the case
+ IF((JPOS.GE.1).AND.(JPOS+1.LE.NY)) THEN
+ DO 3360 JI=1,NXP
+ RVALB = TARRAY(JI+(JPOS-1)*NXP)
+ RVALT = TARRAY(JI+(JPOS+1-1)*NXP)
+ IF(.NOT.MISSING(RVALB).AND.
+ * .NOT.MISSING(RVALT) ) THEN
+ RVAL=(JPOS+1-RPOS)*RVALB
+ * +(RPOS-JPOS)*RVALT
+ ELSEIF(LNEAREST) THEN
+ IF((.NOT.MISSING(RVALB)) .AND.
+ * ((JPOS+1-RPOS).GT.0.5) ) THEN
+ RVAL=RVALB
+ ELSEIF((.NOT.MISSING(RVALT)).AND.
+ * ((RPOS-JPOS).GT.0.5) ) THEN
+ RVAL=RVALT
+ ELSE
+ RVAL=RMISS
+ ENDIF
+ ELSE
+ RVAL=RMISS
+ ENDIF
+ PARRAY(JI+(JJ-1)*NXP)=RVAL
+ 3360 CONTINUE
+ ELSE
+ DO 3365 JI=1,NXP
+ PARRAY(JI+(JJ-1)*NXP)=RMISS
+ 3365 CONTINUE
+ ENDIF
+ 3370 CONTINUE
+C
+C
+ ELSE
+ CALL INTLOG(JP_ERROR,'INTOCNU: Error in logic.',JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCNU: HICODE = ',JPQUIET)
+ CALL INTLOG(JP_ERROR,HICODE,JPQUIET)
+ CALL INTLOG(JP_ERROR,'INTOCNU: IIRREG = ',IIRREG)
+ INTOCNU = JPROUTINE + 16
+ GOTO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 9 . Return.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+C
+ RETURN
+ END
diff --git a/interpolation/intout.F b/interpolation/intout.F
new file mode 100755
index 0000000..2a3795e
--- /dev/null
+++ b/interpolation/intout.F
@@ -0,0 +1,904 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTOUT( HPARN, INTV, REALV, CHARV)
+C
+C---->
+C**** INTOUT
+C
+C Purpose
+C -------
+C
+C Change output field parameters in common block.
+C
+C Interface
+C ---------
+C
+C Input
+C -----
+C
+C HPARN - MARS parameter name.
+C INTV - MARS parameter value(s) (Integer).
+C REALV - MARS parameter value(s) (Real).
+C CHARV - MARS parameter value(s) (Character).
+C
+C
+C Method
+C ------
+C
+C Recognise MARS paramter and reset appropriate common
+C variable value(s).
+C
+C
+C Externals
+C ---------
+C
+C JDEBUG - Check if debug switched on.
+C IBASINI - Check basic initialisation of common blocks is done.
+C CHEQUAL - Compare two ASCII strings without regard to case.
+C INTLOG(R)- Log error message.
+C IGGLAT - Compute gaussian latitudes for given truncation.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF August 1994.
+C
+C Modifications.
+C --------------
+C
+C S. Curic ECMWF 28.05.07
+C added jpeg packing just for merging with grib_api
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ CHARACTER*(*) HPARN
+ CHARACTER*(*) CHARV
+ REAL REALV(*)
+ INTEGER INTV(*)
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 28200 )
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "current.h"
+C
+C Local variables
+C
+ INTEGER ITEMP, I, IRET, ILOOP, ILAST, IFILE1
+ LOGICAL LFOUND
+C
+C Externals
+C
+ LOGICAL CHEQUAL
+ EXTERNAL CHEQUAL
+ INTEGER IGGLAT, JINDEX
+ EXTERNAL IGGLAT, JINDEX
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ INTOUT = 0
+ LFOUND = .FALSE.
+C
+C Check if debug turned on
+ CALL JDEBUG()
+C
+C Ensures basic initialisation of common blocks is done
+ CALL IBASINI(0)
+C
+ CALL INTLOG(JP_DEBUG, 'INTOUT: option = ' // HPARN ,JPQUIET)
+C
+C -----------------------------------------------------------------|
+C Section 2. Decode request
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Output grid.
+C
+ IF( CHEQUAL( HPARN, 1, 4, 'grid') ) THEN
+ LFOUND = .TRUE.
+C (Ignore the call if the grid values = 0.)
+ IF( (REALV(1) .EQ. 0) .OR. (REALV(2) .EQ. 0) ) GOTO 900
+ IF( (NOREPR.NE.JPREGULAR).AND.(NOREPR.NE.JPREGROT) ) THEN
+ LCHANGE = .TRUE.
+ NOGAUSS = 0
+ ENDIF
+ IF( LNOROTA ) THEN
+ NOREPR = JPREGROT
+ ELSE
+ NOREPR = JPREGULAR
+ ENDIF
+ LNOREPR = .TRUE.
+ CALL INTLOGR(JP_DEBUG, 'INTOUT: grid e-w = ',REALV(1))
+ CALL INTLOGR(JP_DEBUG, 'INTOUT: grid n-s = ',REALV(2))
+ DO I = 1, 2
+ ITEMP = INT( REALV(I)*PPMULT)
+ IF( NOGRID(I) .NE. ITEMP ) LCHANGE = .TRUE.
+ NOGRID(I) = ITEMP
+ ENDDO
+ LNOGRID = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Output regular (gaussian).
+C
+ IF( CHEQUAL( HPARN, 1, 7, 'regular') ) THEN
+ LFOUND = .TRUE.
+C (Ignore the call if the gaussian value = 0.)
+ IF( INTV(1) .EQ. 0 ) GOTO 900
+ IF( NOREPR .NE. JPGAUSSIAN ) THEN
+ LCHANGE = .TRUE.
+ NOGRID(1) = 0
+ NOGRID(2) = 0
+ LNOGRID = .FALSE.
+ ENDIF
+ IF( LNOROTA ) THEN
+ NOREPR = JPFGGROT
+ ELSE
+ NOREPR = JPGAUSSIAN
+ ENDIF
+ LNOREPR = .TRUE.
+ IF( NOGAUSS .NE. INTV(1) ) LCHANGE = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: regular = ',INTV(1))
+ NOGAUSS = INTV(1)
+ LNOGAUS = .TRUE.
+ IF( (NOGAUSO.NE.NOGAUSS).OR.(HOGAUST.NE.'F') ) THEN
+ CALL JGETGG( NOGAUSS, 'F', ROGAUSS, NOLPTS, IRET)
+ IF( IRET .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTOUT: JGETGG fail for NOGAUSS = ',NOGAUSS)
+ INTOUT = IRET
+ GOTO 900
+ ENDIF
+ NOGAUSO = NOGAUSS
+ HOGAUST = 'F'
+ ENDIF
+C
+ NONS = 2*NOGAUSS
+ GOTO 900
+ ENDIF
+C
+C Output truncation.
+C
+ IF( CHEQUAL( HPARN, 1, 10, 'truncation') ) THEN
+ LFOUND = .TRUE.
+C (Ignore the call if the truncation value < 0.)
+ IF( INTV(1) .LT. 0 ) GOTO 900
+ IF( NOREPR .NE. JPSPHERE ) LCHANGE = .TRUE.
+ IF( .NOT. LNOREPR ) NOREPR = JPSPHERE
+ LNOREPR = .TRUE.
+ IF( NORESO .NE. INTV(1) ) LCHANGE = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: truncation = ',INTV(1))
+ NORESO = INTV(1)
+ LNORESO = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C
+C
+C Output gaussian => same output type as input.
+C Double Interpolation
+C
+ IF( CHEQUAL( HPARN, 1, 20, 'intermediate_gaussian') ) THEN
+ LFOUND = .TRUE.
+C (Ignore the call if the gaussian value = 0.)
+ IF( INTV(1) .EQ. 0 ) GOTO 900
+ IF( NOMEGA .NE. INTV(1) ) LCHANGE = .TRUE.
+ CALL INTLOG(JP_DEBUG,'INTOUT: Intermediate gaussian = ',INTV(1))
+ NOMEGA = INTV(1)
+ LDOUBLE = .TRUE.
+c NOREPR = JPNOTYPE
+c LNOREPR = .TRUE.
+c NONS = 2*NOGAUSS
+ GOTO 900
+ ENDIF
+C
+C Interpolation method
+C
+ IF( CHEQUAL( HPARN, 1, 13, 'interpolation') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: interpolation = '
+ X // CHARV ,JPQUIET)
+ IF( CHEQUAL( CHARV, 1, 17, 'nearest neighbour') ) THEN
+ IF( .NOT. LMETHOD ) LCHANGE = .TRUE.
+ LMETHOD = .TRUE.
+ ELSEIF( CHEQUAL( CHARV, 1, 8, 'bilinear') ) THEN
+ IF( .NOT. LO12PT ) LCHANGE = .TRUE.
+ LO12PT = .FALSE.
+ ELSEIF( CHEQUAL( CHARV, 1, 11, 'nearest lsm') ) THEN
+ IF( .NOT. LNNLSM ) LCHANGE = .TRUE.
+ LNNLSM = .TRUE.
+ ELSEIF( CHEQUAL( CHARV, 1, 3, 'off') ) THEN
+ LNNLSM = .FALSE.
+ LMETHOD = .FALSE.
+ ELSE
+ IF( LMETHOD ) LCHANGE = .TRUE.
+ LMETHOD = .FALSE.
+ LO12PT = .TRUE.
+ LNNLSM = .FALSE.
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+
+C Output ito be generated by automatically selected truncation
+C (autoresol).
+C
+ IF( CHEQUAL( HPARN, 1, 9, 'autoresol') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: autoresol (1 = on) = ',INTV(1))
+ IF( INTV(1).EQ.1 ) THEN
+ LARESOL = .TRUE.
+ ELSE
+ LARESOL = .FALSE.
+ ENDIF
+ ENDIF
+C
+C Output data format.
+C
+ IF( CHEQUAL( HPARN, 1, 4, 'form') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: form = ' // CHARV ,JPQUIET)
+ IF( CHEQUAL( CHARV, 1, 4, 'grib') ) THEN
+ IF( NOFORM .EQ. 0 ) LCHANGE = .TRUE.
+ NOFORM = 1
+ ELSE
+ IF( NOFORM .EQ. 1 ) LCHANGE = .TRUE.
+ NOFORM = 0
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C Input level.
+C
+ IF( CHEQUAL( HPARN, 1, 5, 'level') ) THEN
+ LFOUND = .TRUE.
+ IF( NOLEVEL .NE. INTV(1) ) LCHANGE = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: level = ',INTV(1))
+ NOLEVEL = INTV(1)
+ LNOLEVL = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Input level type.
+C
+ IF( CHEQUAL( HPARN, 1, 7, 'levtype') ) THEN
+ LFOUND = .TRUE.
+ IF( NOLEVT .NE. INTV(1) ) LCHANGE = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: levtype = ',INTV(1))
+ NOLEVT = INTV(1)
+ LNOLEVT = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Input table.
+C
+ IF( CHEQUAL( HPARN, 1, 5, 'table') ) THEN
+ LFOUND = .TRUE.
+ IF( NOTABLE .NE. INTV(1) ) LCHANGE = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: table = ',INTV(1))
+ NOTABLE = INTV(1)
+ LNOTABL = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Input parameter.
+C
+ IF( CHEQUAL( HPARN, 1, 9, 'parameter') ) THEN
+ LFOUND = .TRUE.
+ IF( NOPARAM .NE. INTV(1) ) LCHANGE = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: parameter = ',INTV(1))
+ NOPARAM = INTV(1)
+ LNOPARA = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Output accuracy.
+C
+ IF( CHEQUAL( HPARN, 1, 8, 'accuracy') ) THEN
+ LFOUND = .TRUE.
+C (Ignore the call if the truncation value = 0.)
+ IF( INTV(1) .EQ. 0 ) GOTO 900
+ IF( NOACC .NE. INTV(1) ) LCHANGE = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: accuracy = ',INTV(1))
+ NOACC = INTV(1)
+ LNOACC = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Output gaussian => same output type as input.
+C
+ IF( CHEQUAL( HPARN, 1, 8, 'gaussian') ) THEN
+ LFOUND = .TRUE.
+C (Ignore the call if the gaussian value = 0.)
+ IF( INTV(1) .EQ. 0 ) GOTO 900
+ IF( NOGAUSS .NE. INTV(1) ) LCHANGE = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: gaussian = ',INTV(1))
+ NOGAUSS = INTV(1)
+ LNOGAUS = .TRUE.
+ NOREPR = JPNOTYPE
+ LNOREPR = .TRUE.
+ NONS = 2*NOGAUSS
+ GOTO 900
+ ENDIF
+C
+C Output area.
+C
+ IF( CHEQUAL( HPARN, 1, 4, 'area') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOGR(JP_DEBUG, 'INTOUT: north = ',REALV(1))
+ CALL INTLOGR(JP_DEBUG, 'INTOUT: west = ',REALV(2))
+ CALL INTLOGR(JP_DEBUG, 'INTOUT: south = ',REALV(3))
+ CALL INTLOGR(JP_DEBUG, 'INTOUT: east = ',REALV(4))
+ DO I = 1, 4
+ ITEMP = INT( REALV(I)*PPMULT)
+ IF( NOAREA(I) .NE. ITEMP ) LCHANGE = .TRUE.
+ NOAREA(I) = ITEMP
+ ENDDO
+ LNOAREA = (NOAREA(1).NE.0).OR.(NOAREA(2).NE.0).OR.
+ X (NOAREA(3).NE.0).OR.(NOAREA(4).NE.0)
+ GOTO 900
+ ENDIF
+C
+C Output scan.
+C
+ IF( CHEQUAL( HPARN, 1, 4, 'scan') ) THEN
+ LFOUND = .TRUE.
+ IF( NOSCNM .NE. INTV(1) ) LCHANGE = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: scan = ',INTV(1))
+ NOSCNM = INTV(1)
+ GOTO 900
+ ENDIF
+C
+C Output packing.
+C
+C Values for PACKING
+C SIMPLE
+C COMPLEX
+C SECOND ORDER
+C ARCHIVED VALUE
+C
+ IF( CHEQUAL( HPARN, 1, 7, 'packing') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: packing = ' // CHARV ,JPQUIET)
+ IF( CHEQUAL( CHARV, 1, 6, 'second') ) THEN
+ IF( NOHFUNC.NE.'K' ) LCHANGE = .TRUE.
+ NOHFUNC = 'K'
+ ELSE IF( CHEQUAL( CHARV, 1, 6, 'simple') ) THEN
+ IF( NOHFUNC.NE.'S' ) LCHANGE = .TRUE.
+ NOHFUNC = 'S'
+ ELSE IF( CHEQUAL( CHARV, 1, 7, 'archive') ) THEN
+ IF( NOHFUNC.NE.'A' ) LCHANGE = .TRUE.
+ NOHFUNC = 'A'
+ ELSE IF( CHEQUAL( CHARV, 1, 7, 'complex') ) THEN
+ IF( NOHFUNC.NE.'C' ) LCHANGE = .TRUE.
+ NOHFUNC = 'C'
+ ELSE IF( CHEQUAL( CHARV, 1, 4, 'jpeg') ) THEN
+ IF( NOHFUNC.NE.'J' ) LCHANGE = .TRUE.
+ NOHFUNC = 'J'
+ ELSE
+ CALL INTLOG(JP_ERROR,
+ X 'INTOUT: Invalid value for PACKING: ' // CHARV(1:6),JPQUIET)
+ LFOUND = .FALSE.
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C Output reduced.
+C
+ IF( CHEQUAL( HPARN, 1, 7, 'reduced') ) THEN
+ LFOUND = .TRUE.
+C (Ignore the call if the reduced value = 0.)
+ IF( INTV(1) .EQ. 0 ) GOTO 900
+ IF( NOGAUSS .NE. INTV(1) ) LCHANGE = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: reduced = ',INTV(1))
+ NOGAUSS = INTV(1)
+ LNOGAUS = .TRUE.
+ IF( NOREPR .NE. JPQUASI ) THEN
+ LCHANGE = .TRUE.
+ NOGRID(1) = 0
+ NOGRID(2) = 0
+ LNOGRID = .FALSE.
+ ENDIF
+ IF( LNOROTA ) THEN
+ NOREPR = JPQGGROT
+ ELSE
+ NOREPR = JPQUASI
+ ENDIF
+ LNOREPR = .TRUE.
+ IF( (NOGAUSO.NE.NOGAUSS).OR.(HOGAUST.NE.'R') ) THEN
+ CALL JGETGG( NOGAUSS, 'R', ROGAUSS, NOLPTS, IRET)
+ IF( IRET .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTOUT: JGETGG fail for NOGAUSS = ',NOGAUSS)
+ INTOUT = IRET
+ GOTO 900
+ ENDIF
+ NOGAUSO = NOGAUSS
+ HOGAUST = 'R'
+ ENDIF
+C
+ NOAREA(1) = INT( ROGAUSS(1) * PPMULT )
+ NOAREA(2) = 0
+ NOAREA(3) = INT( ROGAUSS(NOGAUSS*2) * PPMULT )
+ NOAREA(4) = JP360 - JP360/NOLPTS(NOGAUSS)
+ NOPCNT = 0
+ DO ILOOP = 1, NOGAUSS*2
+ NOPCNT = NOPCNT + NOLPTS(ILOOP)
+ ENDDO
+ GOTO 900
+ ENDIF
+C
+C Output user_regular_gaussian
+C
+ IF( CHEQUAL( HPARN, 1, 21, 'user_regular_gaussian') ) THEN
+ LFOUND = .TRUE.
+ IF( NOREPR .NE. JPGAUSSIAN ) THEN
+ LCHANGE = .TRUE.
+ NOGRID(1) = 0
+ NOGRID(2) = 0
+ LNOGRID = .FALSE.
+ ENDIF
+C (Ignore the call if the user_regular_gaussian value = 0.)
+ IF( INTV(1) .EQ. 0 ) GOTO 900
+ IF( NOGAUSS .NE. INTV(1) ) LCHANGE = .TRUE.
+ CALL INTLOG(JP_DEBUG,'INTOUT: user_regular_gaussian = ',INTV(1))
+ NOGAUSS = INTV(1)
+ LNOGAUS = .TRUE.
+ IF( LNOROTA ) THEN
+ NOREPR = JPFGGROT
+ ELSE
+ NOREPR = JPGAUSSIAN
+ ENDIF
+ LNOREPR = .TRUE.
+C
+ ILAST = NOGAUSS*2
+ DO ILOOP = 1, ILAST
+ NOLPTS(ILOOP) = NOGAUSS*4
+ ENDDO
+ NOGAUSO = NOGAUSS
+ HOGAUST = 'U'
+ LOGIVEP = .TRUE.
+C
+ GOTO 900
+ ENDIF
+C
+C Output user_reduced_gaussian
+C
+ IF( CHEQUAL( HPARN, 1, 21, 'user_reduced_gaussian') ) THEN
+ LFOUND = .TRUE.
+ IF( NOREPR .NE. JPQUASI ) THEN
+ LCHANGE = .TRUE.
+ NOGRID(1) = 0
+ NOGRID(2) = 0
+ LNOGRID = .FALSE.
+ ENDIF
+C (Ignore the call if the user_reduced_gaussian value = 0.)
+ IF( INTV(1) .EQ. 0 ) GOTO 900
+ IF( NOGAUSS .NE. INTV(1) ) LCHANGE = .TRUE.
+ CALL INTLOG(JP_DEBUG,'INTOUT: user_reduced_gaussian = ',INTV(1))
+ NOGAUSS = INTV(1)
+ LNOGAUS = .TRUE.
+ IF( LNOROTA ) THEN
+ NOREPR = JPQGGROT
+ ELSE
+ NOREPR = JPQUASI
+ ENDIF
+ LNOREPR = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Output g_pnts.
+C
+ IF( CHEQUAL( HPARN, 1, 6, 'g_pnts') ) THEN
+ LFOUND = .TRUE.
+ IF( NOGAUSS .LE. 0 ) THEN
+ IRET = JPROUTINE + 1
+ CALL INTLOG(JP_ERROR,
+ X 'INTOUT: Impossible number of gaussian latitudes.',NOGAUSS)
+ INTOUT = IRET
+ GOTO 900
+ ENDIF
+C
+ ILAST = NOGAUSS*2 + 1
+ DO ILOOP = 1, NOGAUSS
+ NOLPTS(ILOOP) = INTV(ILOOP)
+ ILAST = ILAST - 1
+ NOLPTS(ILAST) = INTV(ILOOP)
+ ENDDO
+C
+ NOPCNT = 0
+ DO ILOOP = 1, NOGAUSS*2
+ NOPCNT = NOPCNT + NOLPTS(ILOOP)
+ ENDDO
+ NOGAUSO = NOGAUSS
+ HOGAUST = 'U'
+ LOGIVEP = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Output g_lats.
+C
+ IF( CHEQUAL( HPARN, 1, 6, 'g_lats') ) THEN
+ LFOUND = .TRUE.
+ IF( NOGAUSS .LE. 0 ) THEN
+ IRET = JPROUTINE + 1
+ CALL INTLOG(JP_ERROR,
+ X 'INTOUT: Impossible number of gaussian latitudes.',NOGAUSS)
+ INTOUT = IRET
+ GOTO 900
+ ENDIF
+C
+ ILAST = NOGAUSS*2 + 1
+ DO ILOOP = 1, NOGAUSS
+ ROGAUSS(ILOOP) = REALV(ILOOP)
+ ILAST = ILAST - 1
+ ROGAUSS(ILAST) = -REALV(ILOOP)
+ ENDDO
+C
+ NOAREA(1) = INT( ROGAUSS(1) * PPMULT )
+ NOAREA(2) = 0
+ NOAREA(3) = INT( ROGAUSS(NOGAUSS*2) * PPMULT )
+ NOAREA(4) = JP360 - JP360/NOLPTS(NOGAUSS)
+ NOGAUSO = NOGAUSS
+ HOGAUST = 'U'
+ LOGIVEL = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Output rotation.
+C
+ IF( CHEQUAL( HPARN, 1, 8, 'rotation') ) THEN
+ LFOUND = .TRUE.
+C
+ IF( CHEQUAL(CHARV,1,3,'off') ) THEN
+ LNOROTA = .FALSE.
+ NOROTA(1) = -99999999
+ NOROTA(2) = -99999999
+ IF( NOREPR.EQ.JPSPHROT ) NOREPR = JPSPHERE
+ IF( NOREPR.EQ.JPREGROT ) NOREPR = JPREGULAR
+ IF( NOREPR.EQ.JPQGGROT ) NOREPR = JPQUASI
+ IF( NOREPR.EQ.JPFGGROT ) NOREPR = JPGAUSSIAN
+ ELSE
+ LNOROTA = .TRUE.
+ CALL INTLOGR(JP_DEBUG, 'INTOUT: S.pole latitude = ',REALV(1))
+ CALL INTLOGR(JP_DEBUG, 'INTOUT: S.pole longitude = ',REALV(2))
+ DO I = 1, 2
+ ITEMP = INT( REALV(I)*PPMULT)
+ IF( NOROTA(I) .NE. ITEMP ) LCHANGE = .TRUE.
+ NOROTA(I) = ITEMP
+ ENDDO
+ IF( NOREPR.EQ.JPSPHERE ) NOREPR = JPSPHROT
+ IF( NOREPR.EQ.JPREGULAR ) NOREPR = JPREGROT
+ IF( NOREPR.EQ.JPQUASI ) NOREPR = JPQGGROT
+ IF( NOREPR.EQ.JPGAUSSIAN ) NOREPR = JPFGGROT
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C Interpolation scheme to use for rotations
+C
+ IF( CHEQUAL( HPARN, 1, 8, '12-point') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: 12-point = ' // CHARV ,JPQUIET)
+C
+ IF( CHEQUAL(CHARV,1,3,'yes') ) THEN
+ LO12PT = .TRUE.
+ ELSE
+ LO12PT = .FALSE.
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C Output user_reduced_latlon
+C
+ IF( CHEQUAL( HPARN, 1, 19, 'user_reduced_latlon') ) THEN
+ LFOUND = .TRUE.
+ IF( NOREPR .NE. JPREDLL ) THEN
+ LCHANGE = .TRUE.
+ NOGRID(1) = 0
+Cjdc NOGRID(2) = REALV(2)
+ LNOGRID = .FALSE.
+ ENDIF
+C (Ignore the call if the user_reduced_latlon value = 0.)
+ IF( INTV(1) .EQ. 0 ) GOTO 900
+ IF( NOREDLL .NE. INTV(1) ) LCHANGE = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: user_reduced_latlon = ',INTV(1))
+ NOREDLL = INTV(1)
+ LNOREDL = .TRUE.
+ IF( LNOROTA ) THEN
+ NOREPR = JPREDLROT
+ ELSE
+ NOREPR = JPREDLL
+ ENDIF
+ LNOREPR = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Output set raduced_laltlon
+C
+ IF( CHEQUAL( HPARN, 1, 10, 'red_latlon') ) THEN
+ LFOUND = .TRUE.
+ NOGRID(1) = 0
+ NOGRID(2) = REALV(2)
+ IF( NOREPR .NE. JPREDLL ) THEN
+ LCHANGE = .TRUE.
+ LNOGRID = .FALSE.
+ ENDIF
+C (Ignore the call if the user_reduced_latlon value = 0.)
+cs IF( INTV(1) .EQ. 0 ) GOTO 900
+ CALL INTLOG(JP_DEBUG, 'INTOUT: reduced_latlon ns = ',NOGRID(2))
+cs NOREDLL = INTV(1)
+ LNOREDL = .TRUE.
+ IF( LNOROTA ) THEN
+ NOREPR = JPREDLROT
+ ELSE
+ NOREPR = JPREDLL
+ ENDIF
+ LNOREPR = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Output ll_pnts.
+C
+ IF( CHEQUAL( HPARN, 1, 7, 'll_pnts') ) THEN
+ LFOUND = .TRUE.
+ IF( NOREDLL .LE. 0 ) THEN
+ IRET = JPROUTINE + 1
+ CALL INTLOG(JP_ERROR,
+ X 'INTOUT: Impossible number of latitudes.',NOREDLL)
+ INTOUT = IRET
+ GOTO 900
+ ENDIF
+C
+ ILAST = NOREDLL
+ DO ILOOP = 1, NOREDLL
+ NOLPTS(ILOOP) = INTV(ILOOP)
+ ENDDO
+C
+ NOPCNT = 0
+ DO ILOOP = 1, NOREDLL-1
+ NOPCNT = NOPCNT + NOLPTS(ILOOP)
+ ENDDO
+ LOGIVEP = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Output ll_lats.
+C
+ IF( CHEQUAL( HPARN, 1, 7, 'll_lats') ) THEN
+ LFOUND = .TRUE.
+ IF( NOREDLL .LE. 0 ) THEN
+ IRET = JPROUTINE + 1
+ CALL INTLOG(JP_ERROR,
+ X 'INTOUT: Impossible number of latitudes.',NOREDLL)
+ INTOUT = IRET
+ GOTO 900
+ ENDIF
+C
+ DO ILOOP = 1, NOREDLL
+ ROREDLL(ILOOP) = REALV(ILOOP)
+ ENDDO
+C
+ NOAREA(1) = INT( ROREDLL(1) * PPMULT )
+ NOAREA(2) = 0
+ NOAREA(3) = INT( ROREDLL(NOREDLL) * PPMULT )
+ NOAREA(4) = JP360 - JP360/NOLPTS(NOREDLL/2)
+ LOGIVEL = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Reduced gaussian definition from file
+C
+ IF( CHEQUAL( HPARN, 1, 15, 'gauss_from_file') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG,
+ X 'INTOUT: gauss_from_file = ' // CHARV ,JPQUIET)
+C
+C Open the input file
+C
+ CALL PBOPEN(IFILE1, CHARV, 'R', IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTOUT: Unable to use gaussian definition file:',JPQUIET)
+ CALL INTLOG(JP_ERROR,CHARV,JPQUIET)
+ INTOUT = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C Read gaussian number, then number of points at each latitude
+C
+ CALL PBREAD(IFILE1, NOGAUSS, JPBYTES, IRET)
+ IF( IRET.NE.JPBYTES ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTOUT: Problem reading gaussian no. from file:',JPQUIET)
+ CALL PBCLOSE(IFILE1, IRET)
+ INTOUT = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+ IF( NOGAUSS .LE. 0 ) THEN
+ IRET = JPROUTINE + 1
+ CALL INTLOG(JP_ERROR,
+ X 'INTOUT: Impossible number of gaussian latitudes.',NOGAUSS)
+ INTOUT = IRET
+ GOTO 900
+ ENDIF
+C
+ CALL PBREAD(IFILE1, NOLPTS, JPBYTES*NOGAUSS, IRET)
+ IF( IRET.NE.JPBYTES*NOGAUSS ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTOUT: Problem reading gaussian pts from file:',JPQUIET)
+ CALL PBCLOSE(IFILE1, IRET)
+ INTOUT = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+ CALL PBCLOSE(IFILE1, IRET)
+C
+ ILAST = NOGAUSS*2 + 1
+ DO ILOOP = 1, NOGAUSS
+ ILAST = ILAST - 1
+ NOLPTS(ILAST) = NOLPTS(ILOOP)
+ ENDDO
+C
+ NOPCNT = 0
+ DO ILOOP = 1, NOGAUSS*2
+ NOPCNT = NOPCNT + NOLPTS(ILOOP)
+ ENDDO
+ NOGAUSO = NOGAUSS
+ HOGAUST = 'U'
+ LOGIVEP = .TRUE.
+ LOGIVEL = .TRUE.
+C
+ IRET = IGGLAT(NOGAUSS*2, ROGAUSS, 0, 1)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTOUT: Problem calculating gaussian latitudes',JPQUIET)
+ INTOUT = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+ IF( LNOROTA ) THEN
+ NOREPR = JPQGGROT
+ ELSE
+ NOREPR = JPQUASI
+ ENDIF
+ LNOREPR = .TRUE.
+C
+ GOTO 900
+ ENDIF
+C
+C Output grid creation style
+C
+ IF( CHEQUAL( HPARN, 1, 5, 'style') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: style = ' // CHARV ,JPQUIET)
+ IF( CHEQUAL( CHARV, 1, 13, 'dissemination') ) THEN
+ ITEMP = JPSDISM
+ ELSE
+ ITEMP = JPSMARS
+ ENDIF
+ IF( NOSTYLE .NE. ITEMP ) LCHANGE = .TRUE.
+ NOSTYLE = ITEMP
+ LNOSTYLE = .TRUE.
+ GOTO 900
+ ENDIF
+C
+C Output grid frame
+C
+ IF( CHEQUAL( HPARN, 1, 5, 'frame') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: frame = ',INTV(1))
+ ITEMP = INTV(1)
+ IF( NOFRAME .NE. ITEMP ) LCHANGE = .TRUE.
+ NOFRAME = ITEMP
+ LNOFRAME = (NOFRAME.GT.0)
+ GOTO 900
+ ENDIF
+C
+C Output grid bitmap
+C
+ IF( CHEQUAL( HPARN, 1, 6, 'bitmap') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: bitmap = ' // CHARV ,JPQUIET)
+ ITEMP = JINDEX(CHARV)
+ IF( ITEMP.LT.1 ) THEN
+ CALL INTLOG(JP_WARN,
+ X 'INTOUT: No bitmap filename given.',JPQUIET)
+ INTOUT = JPROUTINE + 1
+ GOTO 900
+ ELSE
+ IF( NOBITMP(1:ITEMP).NE.CHARV(1:ITEMP) ) LCHANGE = .TRUE.
+ NOBITMP = ' '
+ NOBITMP(1:ITEMP) = CHARV(1:ITEMP)
+ LNOBITMP = .TRUE.
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C Output gaussian grid specification
+C
+ IF( CHEQUAL( HPARN, 1, 13, 'specification') ) THEN
+ LFOUND = .TRUE.
+ CALL INTLOG(JP_DEBUG, 'INTOUT: specification = ', INTV(1))
+ IF( (INTV(1).NE.12).AND.(INTV(1).NE.18) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTOUT: invalid value for specification = ',INTV(1))
+ INTOUT = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ IF( NGSPEC.NE.INTV(1) ) THEN
+ LCHANGE = .TRUE.
+ NGSPEC = INTV(1)
+ LNGSPEC = .TRUE.
+ ENDIF
+ IF( LNOGAUS ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTOUT: replace gaussian specification = ', NOGAUSS)
+ CALL JGETGG( NOGAUSS, 'R', ROGAUSS, NOLPTS, IRET)
+ IF( IRET .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTOUT: JGETGG fail for NOGAUSS = ',NOGAUSS)
+ INTOUT = IRET
+ GOTO 900
+ ENDIF
+ NOGAUSO = NOGAUSS
+ HOGAUST = 'R'
+C
+ IF( .NOT.LNOAREA ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTOUT: now replace output area definition',JPQUIET)
+ NOAREA(1) = INT( ROGAUSS(1) * PPMULT )
+ NOAREA(2) = 0
+ NOAREA(3) = INT( ROGAUSS(NOGAUSS*2) * PPMULT )
+ NOAREA(4) = JP360 - JP360/NOLPTS(NOGAUSS)
+ NOPCNT = 0
+ DO ILOOP = 1, NOGAUSS*2
+ NOPCNT = NOPCNT + NOLPTS(ILOOP)
+ ENDDO
+ GOTO 900
+ ENDIF
+ ENDIF
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+ IF( .NOT. LFOUND ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTOUT: Unknown keyword or option used:', JPQUIET)
+ CALL INTLOG(JP_ERROR, HPARN, JPQUIET)
+ INTOUT = JPROUTINE + 2
+ ENDIF
+C
+C Set flag to show function has been called
+ LINTOUT = .TRUE.
+ RETURN
+ END
diff --git a/interpolation/intpnum.F b/interpolation/intpnum.F
new file mode 100755
index 0000000..7cc0544
--- /dev/null
+++ b/interpolation/intpnum.F
@@ -0,0 +1,124 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTPNUM(KONOFF)
+C
+C---->
+C**** INTPNUM
+C
+C Purpose
+C -------
+C
+C Returns current INTP_CYCLE version number.
+C
+C
+C Interface
+C ---------
+C
+C INUM = INTPNUM(KONOFF)
+C
+C Input
+C -----
+C
+C KONOFF - switch for displayed message
+C = 0 if display is required on the first call
+C = non-zero if display is not required
+C
+C
+C Output
+C ------
+C
+C Returns a 6-digit version number, aaabbc, where:
+C aaa = 3-digit major number
+C bb = 2-digit minor number
+C c = 1-digit spare number (normally 0)
+C
+C
+C Method
+C ------
+C
+C Reads a 6-digit version number from the environment variable
+C INTP_CYCLE. If this does not give a 6-digit number, an internal
+C hard-coded default value is used.
+C
+C On the first call, the function (optionally) displays a message:
+C
+C **************************************
+C * INTP_CYCLE version number = aaabbc *
+C **************************************
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF May 1998
+C
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0. Variables.
+C ------------------------------------------------------------------
+C
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Function arguments
+C
+ INTEGER KONOFF
+C
+C Local variables
+C
+ INTEGER INUMBER, ICOUNT, IOFFSET
+ SAVE INUMBER, ICOUNT
+ CHARACTER*38 CMESS
+ CHARACTER*20 YNUMBER
+C
+ DATA INUMBER/000010/, ICOUNT/0/
+ DATA CMESS/'* INTP_CYCLE version number = ****** *'/
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF( ICOUNT.EQ.0 ) THEN
+C
+C See if the environment variable has an override value
+C
+ CALL GETENV( 'INTP_CYCLE', YNUMBER)
+ IOFFSET = INDEX( YNUMBER, ' ')
+ IF( IOFFSET.EQ.7 ) THEN
+ READ(YNUMBER,'(I6.6)') INUMBER
+ ENDIF
+C
+C First time through, display the message if required
+C
+ IF( KONOFF.EQ.0 ) THEN
+ WRITE(CMESS(31:36),'(I6.6)') INUMBER
+ WRITE(GRPRSM,*) '**************************************'
+ WRITE(GRPRSM,*) CMESS
+ WRITE(GRPRSM,*) '**************************************'
+ ENDIF
+ ICOUNT = 1
+ ENDIF
+C
+ INTPNUM = INUMBER
+C
+ RETURN
+ END
diff --git a/interpolation/intuvdh.F b/interpolation/intuvdh.F
new file mode 100755
index 0000000..dc80f35
--- /dev/null
+++ b/interpolation/intuvdh.F
@@ -0,0 +1,195 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTUVDH(PDATA,KSIZE,KGRIB,KGRBSZ,HOPER,KPARAM)
+C
+C---->
+C**** INTUVDH
+C
+C Purpose
+C -------
+C
+C Encodes/decodes data into/from GRIB code.
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTUVDH(PDATA,KSIZE,KGRIB,KGRBSZ,HOPER,KPARAM)
+C
+C Input
+C -----
+C
+C PDATA - Unpacked field values (if encoding)
+C KSIZE - Number of unpacked values (if encoding)
+C KGRIB - Input field in GRIB format (if decoding)
+C KGRBSZ - Input field length (words) (if decoding)
+C HOPER - Coding option ('I', 'D' or 'C' only)
+C KPARAM - Parameter number of the field (for encoding)
+C
+C
+C Output
+C ------
+C
+C PDATA - Unpacked field values (if decoding)
+C KSIZE - Number of unpacked values (if decoding)
+C KGRIB - Output field in GRIB format (if encoding)
+C KGRBSZ - Output field length (words) (if encoding)
+C
+C
+C Method
+C ------
+C
+C Uses arrays in intf.h for unpacking GRIB headers.
+C
+C
+C Externals
+C ---------
+C
+C GRSVCK - Turns off GRIBEX checking.
+C GRIBEX - Encode/decode GRIB product.
+C IGSETUP - Setup GRIB sections for the output product.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF February 2001
+C
+C
+C----<
+C
+C -----------------------------------------------------------------|
+C* Section 0. Variables
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "intf.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Function arguments
+C
+ REAL PDATA(*)
+ INTEGER KSIZE,KGRIB(*),KGRBSZ, KPARAM
+ CHARACTER*1 HOPER
+C
+C Local variables
+C
+ INTEGER IERR, IWORD
+ CHARACTER*1 HFUNC
+C
+C Externals
+C
+ INTEGER IGSETUP
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ INTUVDH = IERR
+ IERR = 0
+C
+C -----------------------------------------------------------------|
+C* Section 2. Decode data from GRIB code (no checking).
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( HOPER.NE.'C' ) THEN
+ CALL GRSVCK(0)
+C
+ IERR = 1
+ ISEC3(2) = NINT(RMISSGV)
+ ZSEC3(2) = RMISSGV
+ CALL GRIBEX(ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X PDATA, KSIZE, KGRIB, KGRBSZ, IWORD, HOPER,IERR)
+C
+ INTUVDH = IERR
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Encode data into GRIB code.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Setup GRIB sections for the output product
+C
+ IERR = IGSETUP( ISEC1, ISEC2, ISEC4 )
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVDH: GRIB section setup fail',JPQUIET)
+ INTUVDH = IERR
+ GOTO 900
+ ENDIF
+C
+C Code data into GRIB
+C
+ ISEC1(6) = KPARAM
+ IERR = 1
+C
+C If grid-point output, setup for 2nd order packing if requested.
+C
+ IF( (NOREPR.NE.JPSPHERE) .AND. (NOREPR.NE.JPSPHROT) ) THEN
+ HFUNC = 'C'
+ IF( NOHFUNC.EQ.'K' ) THEN
+ HFUNC = 'K'
+ ISEC4(4) = 64
+ ISEC4(6) = 16
+ ISEC4(9) = 32
+ ISEC4(10) = 16
+ ISEC4(12) = 8
+ ISEC4(13) = 4
+ ISEC4(14) = 0
+ ISEC4(15) = -1
+ ELSE
+ ISEC4(4) = 0
+ ISEC4(6) = 0
+ ENDIF
+ IF( LIMISSV ) THEN
+ ISEC1(5) = 192
+ ISEC3(2) = NINT(RMISSGV)
+ ZSEC3(2) = RMISSGV
+ ENDIF
+ ELSE
+ ISEC1(5) = 128
+ HFUNC = 'C'
+ IF( NOHFUNC.EQ.'C' ) THEN
+ ISEC2(6) = 2
+ ISEC4(4) = 64
+ ELSE IF( NOHFUNC.EQ.'S' ) THEN
+ ISEC2(6) = 1
+ ISEC4(4) = 0
+ ENDIF
+ ENDIF
+C
+ CALL GRIBEX( ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X PDATA,KSIZE,KGRIB,KGRBSZ,IWORD,HFUNC,IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVDH: GRIBEX encoding failed.',IERR)
+ INTUVDH = IERR
+ GOTO 900
+ ENDIF
+ KGRBSZ = IWORD
+ INTUVDH = 0
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/intuvf.F b/interpolation/intuvf.F
new file mode 100755
index 0000000..d87899c
--- /dev/null
+++ b/interpolation/intuvf.F
@@ -0,0 +1,321 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTUVF( KVGRIB, KDGRIB, INLEN,
+ X KUGRIBO, KVGRIBO, OUTLEN)
+C
+C---->
+C**** INTUVF
+C
+C Purpose
+C -------
+C
+C Interpolate input vorticity and divergence field to
+C U and V fields.
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTUVF( KVGRIB, KDGRIB, INLEN, KUGRIBO,KVGRIBO,OUTLEN)
+C
+C Input
+C -----
+C
+C KVGRIB - Input vorticity field (spectral, GRIB format).
+C KDGRIB - Input divergence field (spectral, GRIB format).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C KUGRIBO - Output U field (GRIB format).
+C KVGRIBO - Output V field (GRIB format).
+C OUTLEN - Output field length (words).
+C
+C
+C Method
+C ------
+C
+C Convert spectral vorticity/divergence to spectral U/V and then
+C interpolate U and V to output fields.
+C
+C
+C Externals
+C ---------
+C
+C IBASINI - Ensure basic interpolation setup is done.
+C JVOD2UV - Converts spectral vorticity/divergence to spectral U/V.
+C JMEMHAN - Allocate/deallocate scratch memory.
+C INTFAU - Prepare to interpolate unpacked input field.
+C INTFBU - Interpolate unpacked input field.
+C INTLOG - Log error message.
+C RESET_C - Reset interpolation handling options using GRIB product.
+C INSANE - Ensure no outrageous values given for interpolation.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Jan 1995
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C----<
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER KVGRIB(*), KDGRIB(*), INLEN
+ INTEGER KUGRIBO(*), KVGRIBO(*), OUTLEN
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPALLOC, JPDEALL, JPSCR3, JPSCR4
+ PARAMETER (JPROUTINE = 26800 )
+ PARAMETER (JPALLOC = 1)
+ PARAMETER (JPDEALL = 0)
+ PARAMETER (JPSCR3 = 3)
+ PARAMETER (JPSCR4 = 4)
+C
+C Local variables
+C
+ INTEGER IERR, KPR, ISZVD, ISZUV, IWORD, ISAME
+ INTEGER IPVORT, IPDIV, IP_U, IP_V
+#ifdef POINTER_64
+ INTEGER*8 IUV
+ INTEGER*8 IVD
+#endif
+ REAL UV, VD
+ POINTER ( IUV, UV )
+ POINTER ( IVD, VD )
+ DIMENSION UV( 1 ), VD( 1 )
+C
+C Externals
+C
+ INTEGER INTFAU, INTFBU, RESET_C
+ INTEGER IBASINI, INSANE
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+ INTUVF = 0
+ IERR = 0
+ KPR = 0
+C
+C Ensure that basic initialisation has been done
+C
+ IERR = IBASINI(0)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVF: basic initialise failed',JPQUIET)
+ INTUVF = IERR
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Unpack the vorticity/divergence fields.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Get scratch memory for vorticity/divergence unpacked fields.
+C Vorticity/divergence memory areas are adjacent.
+C
+C Need to establish input truncation, so unpack GRIB sections 1
+C and 2.
+C
+ IERR = 1
+ CALL GRIBEX(ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X VD(IPVORT), ISZVD, KVGRIB, INLEN, IWORD, 'I',IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVF: GRIBEX decoding failed.',IERR)
+ INTUVF = IERR
+ GOTO 900
+ ENDIF
+C
+ NIRESO = ISEC2(2)
+ ISZVD = (NIRESO+1)*(NIRESO+2)
+ IPVORT = 1
+ IPDIV = 1 + ISZVD
+ CALL JMEMHAN( JPSCR4, IVD, ISZVD*2, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVF: Memory allocation fail.',JPQUIET)
+ INTUVF = IERR
+ GOTO 900
+ ENDIF
+C
+C Decode data from GRIB code (no checking)
+C Vorticity ...
+C
+ IWORD = INLEN
+ IERR = 0
+ CALL GRSVCK(0)
+ IERR = 1
+ ISEC3(2) = NINT(RMISSGV)
+ ZSEC3(2) = RMISSGV
+ CALL GRIBEX(ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X VD(IPVORT), ISZVD, KVGRIB, INLEN, IWORD, 'D',IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVF: GRIBEX decoding failed.',IERR)
+ INTUVF = IERR
+ GOTO 900
+ ENDIF
+C
+C Divergence ...
+C
+ IERR = 1
+ ISEC3(2) = NINT(RMISSGV)
+ ZSEC3(2) = RMISSGV
+ CALL GRIBEX(ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X VD(IPDIV), ISZVD, KDGRIB, INLEN, IWORD, 'D',IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVF: GRIBEX decoding failed.',IERR)
+ INTUVF = IERR
+ GOTO 900
+ ENDIF
+C
+C Setup interpolation options from input GRIB characteristics.
+C
+ IERR = RESET_C( ISEC1, ISEC2, ZSEC2, ISEC4)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVF: Setup interp. options from GRIB failed.',JPQUIET)
+ INTUVF = IERR
+ GOTO 900
+ ENDIF
+C
+C Check that no outrageous values given for interpolation
+C
+ ISAME = INSANE()
+ IF( ISAME.GT.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVF: Interpolation cannot use given values.',JPQUIET)
+ INTUVF = ISAME
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Convert spectral vorticity/divergence
+C to spectral U/V
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Get scratch memory for U and V spectral fields.
+C U and V memory areas are adjacent.
+C
+ ISZUV = (NIRESO+1)*(NIRESO+4)
+ IP_U = 1
+ IP_V = 1 + ISZUV
+ CALL JMEMHAN( JPSCR3, IUV, ISZUV*2, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVF: Memory allocation fail.',JPQUIET)
+ INTUVF = IERR
+ GOTO 900
+ ENDIF
+C
+C Generate U and V with same truncation as input fields.
+C
+ CALL JVOD2UV( VD(IPVORT), VD(IPDIV), NIRESO,
+ X UV(IP_U), UV(IP_V), NIRESO)
+C
+C -----------------------------------------------------------------|
+C* Section 4. Interpolate U field.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C Prepare to interpolate U field.
+C
+ NIFORM = 0
+ IERR = INTFAU( UV(IP_U), ISZUV, KUGRIBO, OUTLEN)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVF: Prepare to interpolate failed.',IERR)
+ INTUVF = IERR
+ GOTO 900
+ ENDIF
+C
+C Interpolate U field.
+C
+ IERR = INTFBU( UV(IP_U), ISZUV, KUGRIBO, OUTLEN)
+C
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVF: Interpolation failed.',JPQUIET)
+ INTUVF = IERR
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 5. Interpolate V field.
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+C Prepare to interpolate V field.
+C
+ IERR = INTFAU( UV(IP_V), ISZUV, KVGRIBO, OUTLEN)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVF: Prepare to interpolate failed.',JPQUIET)
+ INTUVF = IERR
+ GOTO 900
+ ENDIF
+C
+C Interpolate V field.
+C
+ IERR = INTFBU( UV(IP_V), ISZUV, KVGRIBO, OUTLEN)
+C
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVF: Prepare to interpolate failed.',JPQUIET)
+ INTUVF = IERR
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+C Clear change flags for next product processing
+C
+ LCHANGE = .FALSE.
+ LSMCHNG = .FALSE.
+C
+C Return the scratch memory.
+C
+ CALL JMEMHAN( JPSCR3, IUV, ISZUV*2, JPDEALL, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVF: Memory deallocation fail',JPQUIET)
+ INTUVF = IERR
+ ENDIF
+C
+ CALL JMEMHAN( JPSCR4, IVD, ISZVD*2, JPDEALL, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVF: Memory deallocation fail',JPQUIET)
+ INTUVF = IERR
+ ENDIF
+C
+ RETURN
+ END
diff --git a/interpolation/intuvgh.F b/interpolation/intuvgh.F
new file mode 100755
index 0000000..c64539a
--- /dev/null
+++ b/interpolation/intuvgh.F
@@ -0,0 +1,419 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTUVGH(KUGRIBI, KVGRIBI, INLEN,
+ X KUGRIBO, KVGRIBO,
+ X OUTLENU, OUTLENV)
+C
+C---->
+C**** INTUVGH
+C
+C Purpose
+C -------
+C
+C Interpolate GRIB format input U and V component reduced gaussian
+C fields to rotated GRIB format U and V fields.
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTUVGH(KUGRIBI,KVGRIBI,INLEN,KUGRIBO,KVGRIBO,OUTLENU,OUTLENV)
+C
+C Input
+C -----
+C
+C KUGRIBI - Input U component field (reduced gaussian, GRIB format).
+C KVGRIBI - Input V component field (reduced gaussian, GRIB format).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C KUGRIBO - Output U field (GRIB format).
+C KVGRIBO - Output V field (GRIB format).
+C OUTLENU - Output U field length (words).
+C OUTLENV - Output V field length (words).
+C
+C
+C Method
+C ------
+C
+C Use HIRLAM rotation scheme.
+C
+C Note that a common block is used in intf.h to hold the U/V
+C fields before interpolation.
+C
+C Externals
+C ---------
+C
+C IBASINI - Ensure basic interpolation setup is done.
+C INTUVDH - Encodes/decodes data into/from GRIB code.
+C JMEMHAN - Allocate scratch memory.
+C GRIBEX - GRIB decoding/encoding.
+C ISCRSZ - Calculate number of values in generated field.
+C FIXAREA - Fixup area definition to correspond to grid definitions
+C INTLOG - Log error message.
+C MKFRAME - Create a 'frame' from a rectangular field.
+C RESET_C - Reset interpolation handling options using GRIB product.
+C INSANE - Ensure no outrageous values given for interpolation.
+C HRG2GGW - Creates rotated gaussian U and V from reduced gaussian
+C HLL2LLW - Creates rotated lat/long U and V from lat/long
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF October 2001
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER KUGRIBI(*), KVGRIBI(*), INLEN
+ INTEGER KUGRIBO(*), KVGRIBO(*), OUTLENU, OUTLENV
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+#include "intlog.h"
+#include "current.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPALLOC, JPDEALL, JPSCR3, JPSCR4,JPSCR5
+ PARAMETER (JPROUTINE = 40170 )
+ PARAMETER (JPALLOC = 1)
+ PARAMETER (JPDEALL = 0)
+ PARAMETER (JPSCR3 = 3)
+ PARAMETER (JPSCR4 = 4)
+ PARAMETER (JPSCR5 = 5)
+C
+C Local variables
+C
+ CHARACTER*1 HFUNC
+ REAL OLDGRID(2), AREA(4), GRID(2), POLE(2)
+ LOGICAL LOLDWIND, LFRAME
+ INTEGER IRET,KPR,ISZOUV,ISIZE,ISAME,IPARAM
+ INTEGER LOOP, NGAUSS
+ INTEGER IPINU, IPINV, NUMPTS, NLON, NLAT, IN_U, IN_V
+#ifdef POINTER_64
+ INTEGER*8 IOLDUV, ISWORK
+#endif
+ REAL OLDUV, SWORK
+ POINTER ( IOUV, OLDUV(1) )
+ POINTER (ISWORK, SWORK(1) )
+C
+C Externals
+C
+ INTEGER RESET_C,ISCRSZ,FIXAREA,IBASINI,INSANE,INTUVDH,HIRLAMW
+ INTEGER HRG2GGW, HLL2LLW
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+ INTUVGH = 0
+ IRET = 0
+ KPR = 0
+C
+ LFRAME = LNOFRAME.AND.
+ X ((NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT))
+C
+C Ensure that basic initialisation has been done
+C
+ IRET = IBASINI(0)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVGH: basic initialise failed',JPQUIET)
+ INTUVGH = IRET
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Unpack the U/V fields.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Need to establish input characteristics, so unpack GRIB sections 1
+C and 2.
+C
+ IPARAM = 0
+ IPINU = 1
+ IRET = INTUVDH(OLDUV(IPINU),ISZOUV,KUGRIBI,INLEN,'I',IPARAM)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVGH: GRIB header decode failed',IRET)
+ INTUVGH = IRET
+ GOTO 900
+ ENDIF
+C
+C Check whether the input field is an ECMWF reduced gaussian or
+C lat/long U field
+C
+ IF( (ISEC1(1).NE.128).OR.
+ X ((ISEC1(6).NE.JP_U).AND.(ISEC1(6).NE.JP_10U)) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVGH: Input is not ECMWF U field.',JPQUIET)
+ INTUVGH = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ IF( (ISEC2(1).NE.4).AND.
+ X ((ISEC2(17).NE.0) .OR.(ISEC2(1).NE.0)) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVGH: Input not gaussian or lat/long.',JPQUIET)
+ INTUVGH = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Get scratch memory for U/V unpacked fields.
+C U/V memory areas are adjacent.
+C
+ IF( ISEC2(17).EQ.1 ) THEN
+ ISZOUV = 0
+ DO LOOP = 1, ISEC2(3)
+ ISZOUV = ISZOUV + ISEC2(22+LOOP)
+ ENDDO
+ ELSE
+ ISZOUV = ISEC2(2) * ISEC2(3)
+ ENDIF
+C
+ IPINU = 1
+ IPINV = 1 + ISZOUV
+ CALL JMEMHAN( JPSCR4, IOUV, ISZOUV*2, JPALLOC, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVGH: Scratch memory type 4 allocation failed.',JPQUIET)
+ INTUVGH = IRET
+ GOTO 900
+ ENDIF
+C
+C Decode input U and V
+C
+ IRET = INTUVDH(OLDUV(IPINU),ISZOUV,KUGRIBI,INLEN,'D',IPARAM)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVGH: Vorticity decoding failed',IRET)
+ INTUVGH = IRET
+ GOTO 900
+ ENDIF
+ IN_U = ISEC1(6)
+C
+ IRET = INTUVDH(OLDUV(IPINV),ISZOUV,KVGRIBI,INLEN,'D',IPARAM)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVGH: Divergence decoding failed',IRET)
+ INTUVGH = IRET
+ GOTO 900
+ ENDIF
+ IN_V = ISEC1(6)
+C
+C Setup interpolation options from input GRIB characteristics.
+C
+ IRET = RESET_C( ISEC1, ISEC2, ZSEC2, ISEC4)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVGH: Setup interp. options from GRIB failed.',JPQUIET)
+ INTUVGH = IRET
+ GOTO 900
+ ENDIF
+C
+C Check that no outrageous values given for interpolation
+C
+ ISAME = INSANE()
+ IF( ISAME.GT.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVGH: Interpolation cannot use given values.',JPQUIET)
+ INTUVGH = ISAME
+ GOTO 900
+ ENDIF
+C
+ IRET = FIXAREA()
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVGH: Fixarea failed.',JPQUIET)
+ INTUVGH = IRET
+ GOTO 900
+ ENDIF
+C
+ LWIND = .TRUE.
+ LOLDWIND = LWINDSET
+ LWINDSET = .TRUE.
+C
+ DO LOOP = 1, 4
+ AREA(LOOP) = REAL(NOAREA(LOOP))/PPMULT
+ ENDDO
+ DO LOOP = 1, 2
+ GRID(LOOP) = REAL(NOGRID(LOOP))/PPMULT
+ POLE(LOOP) = REAL(NOROTA(LOOP))/PPMULT
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 3. Generate interpolated lat/long U and V fields.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( (NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT) ) THEN
+C
+C Dynamically allocate scrath space for rotated lat/long grid
+C
+ NLON = 1 + NINT(FLOAT(NOAREA(JPEAST) - NOAREA(JPWEST)) /
+ X NOGRID(JPWESTEP))
+ NLAT = 1 + NINT(FLOAT(NOAREA(JPNORTH) - NOAREA(JPSOUTH)) /
+ X NOGRID(JPNSSTEP))
+C
+ NOWE = NLON
+ NONS = NLAT
+ NUMPTS = NLON * NLAT
+ ISIZE = NUMPTS * 2
+ CALL JMEMHAN( 11, ISWORK, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVGH: memory alloc for lat/long grid fail',JPQUIET)
+ INTUVGH = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C Rotate reduced gaussian to lat/long
+C
+ IF( (NIREPR.EQ.JPGAUSSIAN).OR.(NIREPR.EQ.JPQUASI) ) THEN
+ IRET = HIRLAMW(LO12PT,
+ X OLDUV(IPINU),OLDUV(IPINV),ISZOUV,
+ X NOGAUSS,AREA,POLE,GRID,
+ X SWORK,SWORK(1+NUMPTS),NUMPTS,NLON,NLAT)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVGH: HIRLAMW rotation failed',JPQUIET)
+ INTUVGH = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C Rotate lat/long to lat/long
+C
+ ELSE
+ OLDGRID(1) = REAL(NIGRID(1)) / PPMULT
+ OLDGRID(2) = REAL(NIGRID(2)) / PPMULT
+ IRET = HLL2LLW(LO12PT,OLDUV(IPINU),OLDUV(IPINV),
+ X OLDGRID,AREA,POLE,GRID,
+ X SWORK,SWORK(1+NUMPTS),NUMPTS,NLON,NLAT)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVGH: HLL2LLW rotation failed',JPQUIET)
+ INTUVGH = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C If a 'frame' has been specified, build the frame
+C
+ IF( LFRAME ) THEN
+ LIMISSV = .TRUE.
+ CALL MKFRAME(NLON,NLAT,SWORK,RMISSGV,NOFRAME)
+ CALL MKFRAME(NLON,NLAT,SWORK(1+NUMPTS),RMISSGV,NOFRAME)
+ ENDIF
+C
+ ELSE
+C
+C -----------------------------------------------------------------|
+C* Section 4. Generate interpolated gaussian U and V fields.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'INTUVGH: Gaussian to gaussian',JPQUIET)
+C
+C Dynamically allocate memory for rotated gaussian grids
+C
+ NUMPTS = NOGAUSS * NOGAUSS
+ ISIZE = 2 * NUMPTS * 8
+ CALL JMEMHAN( 11, ISWORK, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'INTUVGH: memory alloc for gaussian grid fail',JPQUIET)
+ INTUVGH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ NGAUSS = ISEC2(10)
+ IRET = HRG2GGW(LO12PT,
+ X OLDUV(IPINU),OLDUV(IPINV),ISZOUV,
+ X NGAUSS,AREA,POLE,NOGAUSS,HOGAUST,
+ X SWORK,SWORK(1+ISIZE/2),ISIZE,NUMPTS)
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'INTUVGH: HRG2GGW rotation failed',JPQUIET)
+ INTUVGH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 5. Pack the fields into GRIB format
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+ IF( ((NOREPR.EQ.JPQUASI).OR.
+ X (NOREPR.EQ.JPQGGROT).OR.
+ X (NOREPR.EQ.JPFGGROT).OR.
+ X (NOREPR.EQ.JPGAUSSIAN)).AND.
+ X ( (NOROTA(1).NE.9000000).AND.(NOROTA(2).NE.0) ) ) THEN
+ ISEC2(1) = JPFGGROT
+ ELSE
+ ISEC2(1) = NOREPR
+ ENDIF
+C
+ ISEC4(1) = NUMPTS
+C
+C Reset the input format flag
+C
+ NIFORM = 1
+C
+C Set the components flag for rotated U and V coefficients
+C
+ ISEC2(19) = 8
+C
+ IRET = INTUVDH(SWORK,NUMPTS,KUGRIBO,OUTLENU,'C',IN_U)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVGH: Wind component into GRIB encoding fail',IRET)
+ INTUVGH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ IRET = INTUVDH(SWORK(1+(ISIZE/2)),NUMPTS,KVGRIBO,OUTLENV,'C',IN_V)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVGH: Wind component into GRIB encoding fail',IRET)
+ INTUVGH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+C Clear change flags for next product processing and reset wind flag
+C
+ LCHANGE = .FALSE.
+ LSMCHNG = .FALSE.
+ LWINDSET = LOLDWIND
+C
+ RETURN
+ END
diff --git a/interpolation/intuvp.F b/interpolation/intuvp.F
new file mode 100755
index 0000000..87cfdc4
--- /dev/null
+++ b/interpolation/intuvp.F
@@ -0,0 +1,747 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTUVP( KVGRIB, KDGRIB, INLEN,
+ X KUGRIBO, KVGRIBO, OUTLEN)
+C
+C---->
+C**** INTUVP
+C
+C Purpose
+C -------
+C
+C Interpolate GRIB format input vorticity and divergence field to
+C GRIB format U and V fields.
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTUVP(KVGRIB,KDGRIB,INLEN,KUGRIBO,KVGRIBO,OUTLEN)
+C
+C Input
+C -----
+C
+C KVGRIB - Input vorticity field (spectral, GRIB format).
+C KDGRIB - Input divergence field (spectral, GRIB format).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C KUGRIBO - Output U field (GRIB format).
+C KVGRIBO - Output V field (GRIB format).
+C OUTLEN - Length of each output U and V field (words).
+C
+C
+C Method
+C ------
+C
+C Convert spectral vorticity/divergence to spectral U/V and then
+C interpolate U and V to output fields.
+C
+C Note that a common block is used in intf.h to hold the U/V
+C fields before interpolation.
+C
+C Externals
+C ---------
+C
+C IBASINI - Ensure basic interpolation setup is done.
+C INTUVDH - Encodes/decodes data into/from GRIB code.
+C INTUVXH - Interpolate U and V spectral components to grid point.
+C JVOD2UV - Converts spectral vorticity/divergence to spectral U/V.
+C JMEMHAN - Allocate scratch memory.
+C ISCRSZ - Calculate number of values in generated field.
+C FIXAREA - Fixup area definition to correspond to grid definitions
+C INTLOG - Log error message.
+C RESET_C - Reset interpolation handling options using GRIB product.
+C INSANE - Ensure no outrageous values given for interpolation.
+C GRSMKP - P factor calculation switch for routine GRIBEX.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF February 2001
+C Rewritten to use more functions for processing.
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER KVGRIB(*), KDGRIB(*), INLEN
+ INTEGER KUGRIBO(*), KVGRIBO(*), OUTLEN
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPALLOC, JPDEALL, JPSCR3, JPSCR4,JPSCR5
+ INTEGER JPVORT, JPDIVE
+ PARAMETER (JPROUTINE = 26900 )
+ PARAMETER (JPALLOC = 1)
+ PARAMETER (JPDEALL = 0)
+ PARAMETER (JPSCR3 = 3)
+ PARAMETER (JPSCR4 = 4)
+ PARAMETER (JPSCR5 = 5)
+ PARAMETER (JPVORT = 138)
+ PARAMETER (JPDIVE = 155)
+C
+C Local variables
+C
+ CHARACTER*1 HFUNC
+ REAL EW, NS, DUMMY
+ LOGICAL LOLDWIND, LSPECUV
+ INTEGER IERR,KPR,ISZVD,ISZUV,IWORD,ISIZE,ILENF,ISAME,IDIVOFF
+ INTEGER NEXT, LOOP, MTRUNC, NTRUNC, NTROLD, NTROLD2, NPARAM
+ INTEGER NOLD, NLEN, NLENU, NLENV, HNORESO
+ INTEGER INRESO, IHOLD
+ LOGICAL LSTYLE
+ REAL NORTH, SOUTH, WEST, EAST
+C
+ LOGICAL LFIRST, LNEWUV
+ CHARACTER*3 EXTRA
+ DATA LFIRST/.TRUE./, LNEWUV/.TRUE./, EXTRA/'NO '/
+ SAVE LFIRST, LNEWUV
+C
+ DATA NTROLD/-1/, NTROLD2/-1/
+ SAVE NTROLD, NTROLD2
+ INTEGER IPVORT, IPDIV, IP_U, IP_V
+#ifdef POINTER_64
+ INTEGER*8 IZNFLDO
+#endif
+ REAL ZNFLDO
+ POINTER ( IZNFLDO, ZNFLDO )
+ DIMENSION ZNFLDO( 1 )
+#ifdef POINTER_64
+ INTEGER*8 IUV, IVD
+#endif
+ REAL UV, VD
+ POINTER ( IUV, UV )
+ POINTER ( IVD, VD )
+ DIMENSION UV( 1 ), VD( 1 )
+C
+C Externals
+C
+ INTEGER RESET_C,ISCRSZ,FIXAREA,AURESOL,DSSAREA
+ INTEGER IBASINI, INSANE, INTUVDH, INTUVXH
+ INTEGER INTUVPH, INTUVGH
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+ INTUVP = 0
+ IERR = 0
+ KPR = 0
+C
+ IF( LFIRST ) THEN
+ CALL GETENV('IGNORE_UV_EXTRA_MODE', EXTRA)
+ IF((EXTRA(1:1).EQ.'Y').OR.(EXTRA(1:1).EQ.'y')) LNEWUV = .FALSE.
+ IF( LNEWUV ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTUVP: IGNORE_UV_EXTRA_MODE not turned on',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'INTUVP: IGNORE_UV_EXTRA_MODE turned on',JPQUIET)
+ ENDIF
+ LFIRST = .FALSE.
+ ENDIF
+C
+ LOLDWIND = LWINDSET
+cs LSPECUV = (NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT)
+C
+C Ensure that basic initialisation has been done
+C
+ IERR = IBASINI(0)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVP: basic initialise failed',JPQUIET)
+ INTUVP = IERR
+ GOTO 990
+ ENDIF
+C
+C Establish truncation of the input vorticity and divergence:
+C unpack GRIB sections 1 and 2.
+C
+ NPARAM = JPVORT
+ ISZVD = 1
+ NLEN = INLEN
+ IERR = INTUVDH(DUMMY,ISZVD,KVGRIB,NLEN,'I',NPARAM)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVP: GRIB header decode failed',IERR)
+ INTUVP = IERR
+ GOTO 990
+ ENDIF
+C
+C If a rotation is required, check the input fields and call the
+C appropriate interpolation
+C
+ IF( LUSEHIR.AND.LNOROTA ) THEN
+cs LWIND = .TRUE.
+cs LWINDSET = .TRUE.
+cs IF( (ISEC1(6).EQ.JPVORT).AND.(ISEC2(1).EQ.JPSPHERE) ) THEN
+csC
+csC Spectral vorticity/divergence to rotated U and V
+csC
+cs NLEN = INLEN
+cs NLENU = OUTLEN
+cs NLENV = OUTLEN
+cs IERR = INTUVPH(KVGRIB,KDGRIB,NLEN,KUGRIBO,KVGRIBO,
+cs X NLENU,NLENV)
+C
+cs ELSE IF( ((ISEC1(6).EQ.JP_U).OR.(ISEC1(6).EQ.JP_10U)).AND.
+cs IF( ((ISEC1(6).EQ.JP_U).OR.(ISEC1(6).EQ.JP_10U)).AND.
+ IF( (ISEC1(6).EQ.JP_10U).AND.
+ X (ISEC2(1).EQ.JPGAUSSIAN) ) THEN
+C
+C Gaussian U and V to rotated U and V
+C
+ NLEN = INLEN
+ NLENU = OUTLEN
+ NLENV = OUTLEN
+ IERR = INTUVGH(KVGRIB,KDGRIB,NLEN,KUGRIBO,KVGRIBO,
+ X NLENU,NLENV)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVP: Rotation failed',IERR)
+ GOTO 990
+ ENDIF
+ INTUVP = IERR
+ GOTO 900
+C
+cs ELSE
+cs CALL INTLOG(JP_ERROR,'INTUVP: Invalid rotation',IERR)
+cs IERR = JPROUTINE + 1
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Unpack the vorticity/divergence fields.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Get scratch memory for vorticity/divergence unpacked fields.
+C Vorticity/divergence memory areas are adjacent.
+C
+ INRESO = ISEC2(2)
+ ISZVD = (INRESO+1)*(INRESO+4)
+ IPVORT = 1
+ IPDIV = IPVORT + ISZVD
+ CALL JMEMHAN( JPSCR4, IVD, ISZVD*2, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVP: Scratch memory type 4 allocation failed.',JPQUIET)
+ INTUVP = IERR
+ GOTO 990
+ ENDIF
+C
+C Decode vorticity and divegence.
+C
+ NPARAM = JPVORT
+ NLEN = INLEN
+ IERR = INTUVDH(VD(IPVORT),ISZVD,KVGRIB,NLEN,'D',NPARAM)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVP: Vorticity decoding failed',IERR)
+ INTUVP = IERR
+ GOTO 990
+ ENDIF
+C
+ NPARAM = JPDIVE
+ NLEN = INLEN
+ IERR = INTUVDH(VD(IPDIV),ISZVD,KDGRIB,NLEN,'D',NPARAM)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVP: Divergence decoding failed',IERR)
+ INTUVP = IERR
+ GOTO 990
+ ENDIF
+C
+C Setup interpolation options from input GRIB characteristics.
+C
+ IHOLD = NIRESO
+ IERR = RESET_C( ISEC1, ISEC2, ZSEC2, ISEC4)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVP: Setup interp. options from GRIB failed.',JPQUIET)
+ INTUVP = IERR
+ GOTO 990
+ ENDIF
+ IF( IHOLD.NE.0 ) NIRESO = IHOLD
+C
+C Check that no outrageous values given for interpolation
+C
+ ISAME = INSANE()
+ IF( ISAME.GT.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVP: Interpolation cannot use given values.',JPQUIET)
+ INTUVP = ISAME
+ GOTO 990
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Convert spectral vorticity/divergence to spectral U/V
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ LSPECUV = (NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT)
+ IF( LSPECUV ) THEN
+C
+C Spectral U and V for Tn are to be generated from vorticity
+C and divergence spectral T(n-1)
+C
+ IF( LARESOL.AND.LNEWUV ) THEN
+ IF( (NOGRID(1).NE.0).AND.(NOGRID(2).NE.0) ) THEN
+ EW = FLOAT(NOGRID(1))/PPMULT
+ NS = FLOAT(NOGRID(2))/PPMULT
+ NTRUNC = AURESOL(NS,EW) - 1
+ ELSE IF( NOGAUSS.NE.0 ) THEN
+ EW = 90.0/FLOAT(NOGAUSS)
+ NS = EW
+ NTRUNC = AURESOL(NS,EW) - 1
+ ELSE IF( LNORESO ) THEN
+ NTRUNC = NORESO - 1
+ ELSE
+ NTRUNC = INRESO - 1
+ ENDIF
+ IF( NTRUNC.GT.(INRESO-1) ) NTRUNC = INRESO - 1
+C
+ ELSE IF( LNORESO ) THEN
+ NTRUNC = NORESO - 1
+ ELSE
+ NTRUNC = INRESO - 1
+ ENDIF
+C
+ IF( LNEWUV ) THEN
+ MTRUNC = NTRUNC + 1
+ ELSE
+ NTRUNC = NTRUNC + 1
+ MTRUNC = NTRUNC
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Use old-style processing if IGNORE_UV_EXTRA_MODE = Y
+C -----------------------------------------------------------------|
+C
+ IF( .NOT.LNEWUV ) THEN
+C
+ NIRESO = ISEC2(2)
+C
+ CALL INTLOG(JP_DEBUG,'INTUVP: vo/div truncation = ', NIRESO)
+C
+C Get scratch memory for U and V spectral fields.
+C U and V memory areas are adjacent.
+C
+ ISZUV = MAX((NIRESO+1)*(NIRESO+4),(NORESO+1)*(NORESO+4))
+ IP_U = 1
+ IP_V = IP_U + ISZUV
+C
+ ISIZE = ISZUV*2
+ CALL JMEMHAN( JPSCR3, IUV, ISIZE, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVP: Scratch memory type 3 allocation failed',JPQUIET)
+ INTUVP = IERR
+ GOTO 900
+ ENDIF
+C
+C Generate U and V with same truncation as input fields.
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'INTUVP: Make intermediate U/V with truncation = ', NIRESO)
+ CALL JVOD2UV(VD(IPVORT),VD(IPDIV),NIRESO,
+ X UV(IP_U),UV(IP_V),NIRESO)
+C
+C Do spectral truncation for spectral output
+C
+ IF( LNORESO ) THEN
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'INTUVP: Make U/V spectral output with truncation',NORESO)
+C
+ ISIZE = (NORESO+1)*(NORESO+4)
+ CALL JMEMHAN( JPSCR5, IZNFLDO, ISIZE, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVP: Scratch memory type 5 allocn failed',JPQUIET)
+ INTUVP = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ CALL SH2SH( UV(IP_U), NIRESO, ZNFLDO, NORESO )
+ DO LOOP = 1, (NORESO+1)*(NORESO+2)
+ UV(IP_U+LOOP-1) = ZNFLDO(LOOP)
+ ENDDO
+C
+ CALL SH2SH( UV(IP_V), NIRESO, ZNFLDO, NORESO )
+ IP_V = 1 + (NORESO+1)*(NORESO+4)
+ DO LOOP = 1, (NORESO+1)*(NORESO+2)
+ UV(IP_V+LOOP-1) = ZNFLDO(LOOP)
+ ENDDO
+C
+ NIRESO = NORESO
+C
+ ENDIF
+C
+C Set GRIBEX flag to force recalculation of complex packing
+C factor.
+C
+ CALL GRSMKP(1)
+C
+C Code U into GRIB
+C
+ NPARAM = JP_U
+ NLENU = OUTLEN
+ IERR = INTUVDH(UV(IP_U),ISZUV,KUGRIBO,NLENU,'C',NPARAM)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVP: U encoding into GRIB failed.',IERR)
+ INTUVP = JPROUTINE + 4
+ GOTO 380
+ ENDIF
+C
+C Code V into GRIB
+C
+ NPARAM = JP_V
+ NLENV = OUTLEN
+ IERR = INTUVDH(UV(IP_V),ISZUV,KVGRIBO,NLENV,'C',NPARAM)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVP: V encoding into GRIB failed.',IERR)
+ INTUVP = JPROUTINE + 4
+ GOTO 380
+ ENDIF
+C
+ 380 CONTINUE
+C
+C Turn off GRIBEX flag which forces recalculation of complex
+C packing factor
+C
+ CALL GRSMKP(0)
+C
+ GOTO 900
+C
+C -----------------------------------------------------------------|
+C Use new-style processing if IGNORE_UV_EXTRA_MODE not set
+C -----------------------------------------------------------------|
+C
+ ELSE
+C
+ CALL INTLOG(JP_DEBUG,'INTUVP: vo/div truncation = ', NTRUNC)
+ CALL INTLOG(JP_DEBUG,'INTUVP: U/V truncation = ', MTRUNC)
+C
+C Truncate vorticity and divergence to correspond to U/V
+C
+ ISIZE = (MTRUNC+1)*(MTRUNC+4)
+ CALL JMEMHAN( JPSCR5, IZNFLDO, ISIZE*2, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVP: Scratch memory type 5 allocation failed',JPQUIET)
+ INTUVP = JPROUTINE + 4
+ GOTO 990
+ ENDIF
+C
+ IPVORT = 1
+ IPDIV = IPVORT + (INRESO+1)*(INRESO+4)
+ IDIVOFF = 1 + (NTRUNC+1)*(NTRUNC+4)
+C
+ CALL SH2SH( VD(IPVORT), INRESO, ZNFLDO, NTRUNC )
+C
+ CALL SH2SH( VD(IPDIV), INRESO, ZNFLDO(IDIVOFF), NTRUNC )
+C
+C Get scratch memory for U and V spectral fields.
+C U and V memory areas are adjacent.
+C
+ ISZUV = (MTRUNC+1)*(MTRUNC+4)
+ IP_U = 1
+ IP_V = IP_U + ISZUV
+C
+ ISIZE = ISZUV*2
+ CALL JMEMHAN( JPSCR3, IUV, ISIZE, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVP: Scratch memory type 3 allocation failed',JPQUIET)
+ INTUVP = IERR
+ GOTO 990
+ ENDIF
+C
+C Generate U and V spectral fields
+C
+ CALL JVOD2UV(ZNFLDO(IPVORT),ZNFLDO(IDIVOFF),NTRUNC,
+ X UV(IP_U),UV(IP_V),MTRUNC)
+C
+C Set GRIBEX flag to force recalculation of complex packing
+C factor.
+C Preserve the original output truncation
+C
+ CALL GRSMKP(1)
+ HNORESO = NORESO
+C
+C Code U into GRIB using the new truncation
+C
+ NORESO = MTRUNC
+ NPARAM = JP_U
+ NLENU = OUTLEN
+ IERR = INTUVDH(UV(IP_U),ISZUV,KUGRIBO,NLENU,'C',NPARAM)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVP: U encoding into GRIB failed.',IERR)
+ INTUVP = JPROUTINE + 4
+ GOTO 390
+ ENDIF
+C
+C Code V into GRIB using the new truncation
+C
+ NPARAM = JP_V
+ NLENV = OUTLEN
+ IERR = INTUVDH(UV(IP_V),ISZUV,KVGRIBO,NLENV,'C',NPARAM)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVP: V encoding into GRIB failed.',IERR)
+ INTUVP = JPROUTINE + 4
+ GOTO 390
+ ENDIF
+C
+ 390 CONTINUE
+C
+C Turn off GRIBEX flag which forces recalculation of complex
+C packing factor
+C Restore the original output truncation
+C
+ CALL GRSMKP(0)
+ NORESO = HNORESO
+C
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4. Generate grid point GRIB format U and V fields.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C Spectral U and V for Tn are to be generated from vorticity
+C and divergence spectral T(n-1)
+C
+C See whether or not the 'autoresol' flag is set.
+C If not, use the input truncation.
+C
+ IF( LARESOL ) THEN
+ IF( (NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT) ) THEN
+ EW = FLOAT(NOGRID(1))/PPMULT
+ NS = FLOAT(NOGRID(2))/PPMULT
+ ELSE
+ EW = 90.0/FLOAT(NOGAUSS)
+ NS = EW
+ ENDIF
+ NTRUNC = AURESOL(EW,NS)
+ IF( NTRUNC.NE.NTROLD ) THEN
+ NTROLD = NTRUNC
+ CALL INTLOG(JP_WARN,
+ X 'INTUVP: Resolution automatically set to ', NTRUNC)
+ ENDIF
+ ELSE IF( LNORESO ) THEN
+ NTRUNC = NORESO
+ ELSE
+ NTRUNC = INRESO
+ ENDIF
+C
+C Check whether the output resolution is greater than the input
+C
+ IF( NTRUNC.GT.INRESO ) THEN
+C
+C Issue warning if the output resolution was user-supplied
+C
+ IF( .NOT.LARESOL ) THEN
+C
+C Revert to the input truncation
+C
+ IF( INRESO.NE.NTROLD2 ) THEN
+ CALL INTLOG(JP_WARN,
+ X 'INTUVP: spectral -> grid point interpolation',JPQUIET)
+ CALL INTLOG(JP_WARN,
+ X 'INTUVP: User supplied resolution = ',NTRUNC)
+ CALL INTLOG(JP_WARN,
+ X 'INTUVP: Input field resolution = ',INRESO)
+ CALL INTLOG(JP_WARN,
+ X 'INTUVP: User supplied resolution ignored',JPQUIET)
+ CALL INTLOG(JP_WARN,
+ X 'INTUVP: Input field resolution has been used',JPQUIET)
+ NTROLD2 = INRESO
+ ENDIF
+ NTRUNC = INRESO
+C
+ ELSE
+C
+C Revert to the input truncation
+C
+ NTRUNC = INRESO
+ IF( NTRUNC.NE.NTROLD2 ) THEN
+ NTROLD2 = NTRUNC
+ CALL INTLOG(JP_WARN,
+ X 'INTUVP: Auto-resolution selection too high',JPQUIET)
+ CALL INTLOG(JP_WARN,
+ X 'INTUVP: Resolution set to input resolution: ',NTRUNC)
+ ENDIF
+ ENDIF
+ ENDIF
+C
+C IF extra mode is in use, adjust the calculated truncation.
+C
+ MTRUNC = NTRUNC
+ IF( LNEWUV ) NTRUNC = MTRUNC - 1
+C
+ CALL INTLOG(JP_DEBUG,'INTUVP: vo/div truncation = ', NTRUNC)
+ CALL INTLOG(JP_DEBUG,'INTUVP: U/V truncation = ', MTRUNC)
+C
+ ISIZE = (MTRUNC+1)*(MTRUNC+4)
+ CALL JMEMHAN( JPSCR5, IZNFLDO, ISIZE*2, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVP: Scratch memory type 5 allocation failed.',JPQUIET)
+ INTUVP = JPROUTINE + 4
+ GOTO 990
+ ENDIF
+C
+ IPVORT = 1
+ IPDIV = 1 + (INRESO+1)*(INRESO+4)
+ IDIVOFF = IPVORT + (NTRUNC+1)*(NTRUNC+4)
+C
+ CALL SH2SH( VD(IPDIV), INRESO, ZNFLDO(IDIVOFF), NTRUNC )
+C
+ CALL SH2SH( VD(IPVORT), INRESO, ZNFLDO, NTRUNC )
+C
+C Get scratch memory for U and V spectral fields.
+C U and V memory areas are adjacent.
+C
+ ISZUV = (MTRUNC+1)*(MTRUNC+4)
+ IP_U = 1
+ IP_V = IP_U + ISZUV
+C
+ ISIZE = ISZUV*2
+ CALL JMEMHAN( JPSCR3, IUV, ISIZE, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVP: Scratch memory type 3 allocation failed.',JPQUIET)
+ INTUVP = IERR
+ GOTO 990
+ ENDIF
+C
+C Generate U and V spectral fields
+C
+ CALL JVOD2UV(ZNFLDO(IPVORT),ZNFLDO(IDIVOFF),NTRUNC,
+ X UV(IP_U),UV(IP_V),MTRUNC)
+C
+ LSTYLE = LNOSTYLE.AND.
+ X (NOSTYLE.EQ.JPSDISM).AND.
+ X (NOREPR.EQ.JPREGULAR)
+C
+ IF( LSTYLE ) THEN
+ EW = NOGRID(1) / PPMULT
+ NS = NOGRID(2) / PPMULT
+ NORTH = REAL(NOAREA(1)) / PPMULT
+ WEST = REAL(NOAREA(2)) / PPMULT
+ SOUTH = REAL(NOAREA(3)) / PPMULT
+ EAST = REAL(NOAREA(4)) / PPMULT
+C
+ IERR = DSSAREA( EW, NS, NORTH, WEST, SOUTH, EAST)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVP: DSSAREA failed:',IERR)
+ INTUVP = JPROUTINE + 9
+ GOTO 900
+ ENDIF
+C
+ NOAREA(1) = NINT(NORTH * PPMULT)
+ NOAREA(2) = NINT(WEST * PPMULT)
+ NOAREA(3) = NINT(SOUTH * PPMULT)
+ NOAREA(4) = NINT(EAST * PPMULT)
+ ELSE
+C Fixup area definition to correspond to grid definitions
+ IERR = FIXAREA()
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVP: Fixup area definition failed.',JPQUIET)
+ INTUVP = IERR
+ GOTO 900
+ ENDIF
+ ENDIF
+
+cs IERR = FIXAREA()
+cs IF( IERR.NE.0 ) THEN
+cs CALL INTLOG(JP_ERROR,'INTUVP: Fixarea failed.',JPQUIET)
+cs INTUVP = IERR
+cs GOTO 990
+cs ENDIF
+C
+C Get scratch space for interpolation
+ ISIZE = ISCRSZ()*2
+ IF( ISIZE.LE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVP: Get scratch space failed.',ISIZE)
+ INTUVP = JPROUTINE + 5
+ GOTO 990
+ ENDIF
+ CALL JMEMHAN( JPSCR5, IZNFLDO, ISIZE, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVP: Scratch memory(5) allocation failed.',JPQUIET)
+ INTUVP = JPROUTINE + 5
+ GOTO 990
+ ENDIF
+C
+ LWIND = .TRUE.
+ LWINDSET = .TRUE.
+C
+C Interpolate U and V
+C
+ NOLD = NIRESO
+ NIRESO = MTRUNC
+ NLENU = OUTLEN
+ NLENV = OUTLEN
+ IERR = INTUVXH(UV,ISZUV,ZNFLDO,KUGRIBO,KVGRIBO,NLENU,NLENV)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVP: U/V interpolation failed.',JPQUIET)
+ INTUVP = JPROUTINE + 6
+ GOTO 990
+ ENDIF
+C
+ NIRESO = NOLD
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ OUTLEN = NLENU
+C
+ 990 CONTINUE
+C
+C Clear change flags for next product processing and reset wind flag
+C
+ LCHANGE = .FALSE.
+ LSMCHNG = .FALSE.
+ LWINDSET = LOLDWIND
+ LWIND = .FALSE.
+C
+ RETURN
+ END
diff --git a/interpolation/intuvph.F b/interpolation/intuvph.F
new file mode 100755
index 0000000..e59b415
--- /dev/null
+++ b/interpolation/intuvph.F
@@ -0,0 +1,547 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTUVPH( KFIELD1, KFIELD2, INLEN,
+ X KUGRIBO, KVGRIBO,
+ X OUTLENU, OUTLENV)
+C
+C---->
+C**** INTUVPH
+C
+C Purpose
+C -------
+C
+C Interpolate GRIB format input spectral vorticity and divergence,
+C or spectral U and V, fields to GRIB format U and V fields.
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTUVPH(KFIELD1,KFIELD2,INLEN,
+C KUGRIBO,KVGRIBO,OUTLENU,OUTLENV)
+C
+C Input
+C -----
+C
+C KFIELD1 - Input vorticity or U field (spectral, GRIB format).
+C KFIELD2 - Input divergence or V field (spectral, GRIB format).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C KUGRIBO - Output U field (GRIB format).
+C KVGRIBO - Output V field (GRIB format).
+C OUTLENU - Output U field length (words).
+C OUTLENV - Output V field length (words).
+C
+C
+C Method
+C ------
+C
+C Convert spectral vorticity/divergence to spectral U/V and then
+C interpolate U and V to output fields.
+C
+C Note that a common block is used in intf.h to hold the U/V
+C fields before interpolation.
+C
+C Externals
+C ---------
+C
+C IBASINI - Ensure basic interpolation setup is done.
+C INTUVDH - Encodes/decodes data into/from GRIB code.
+C INTUVXH - Interpolate U or V component spectral field to grid point.
+C JVOD2UV - Converts spectral vorticity/divergence to spectral U/V.
+C JMEMHAN - Allocate scratch memory.
+C GRIBEX - GRIB decoding/encoding.
+C ISCRSZ - Calculate number of values in generated field.
+C FIXAREA - Fixup area definition to correspond to grid definitions
+C INTLOG - Log error message.
+C RESET_C - Reset interpolation handling options using GRIB product.
+C INSANE - Ensure no outrageous values given for interpolation.
+C GRSMKP - P factor calculation switch for routine GRIBEX.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF February 2001
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER KFIELD1(*), KFIELD2(*), INLEN
+ INTEGER KUGRIBO(*), KVGRIBO(*), OUTLENU, OUTLENV
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPALLOC, JPDEALL, JPSCR3, JPSCR4,JPSCR5
+ PARAMETER (JPROUTINE = 40160 )
+ PARAMETER (JPALLOC = 1)
+ PARAMETER (JPDEALL = 0)
+ PARAMETER (JPSCR3 = 3)
+ PARAMETER (JPSCR4 = 4)
+ PARAMETER (JPSCR5 = 5)
+C
+C Local variables
+C
+ CHARACTER*1 HFUNC
+ REAL EW, NS
+ LOGICAL LOLDWIND, LSPECUV
+ INTEGER IERR,KPR,ISZVD,ISZUV,IWORD,ISIZE,ILENF,ISAME,IPARAM
+ INTEGER NEXT, LOOP, MTRUNC, NTRUNC, NTROLD, NTROLD2, NPARAM
+ INTEGER MIRESO, MORESO, NOLD, NLEN
+C
+ LOGICAL LFIRST, LNEWUV
+ CHARACTER*3 EXTRA
+ DATA LFIRST/.TRUE./, LNEWUV/.TRUE./, EXTRA/'NO '/
+ SAVE LFIRST, LNEWUV
+C
+ DATA NTROLD/-1/, NTROLD2/-1/
+ SAVE NTROLD, NTROLD2
+ INTEGER IPVORT, IPDIV, IP_U, IP_V, IDIVOFF
+#ifdef POINTER_64
+ INTEGER*8 IZNFLDO
+#endif
+ REAL ZNFLDO
+ POINTER ( IZNFLDO, ZNFLDO )
+ DIMENSION ZNFLDO( 1 )
+#ifdef POINTER_64
+ INTEGER*8 IUV, IVD
+#endif
+ REAL UV, VD
+ POINTER ( IUV, UV )
+ POINTER ( IVD, VD )
+ DIMENSION UV( 1 ), VD( 1 )
+C
+C Externals
+C
+ INTEGER RESET_C,ISCRSZ,FIXAREA,AURESOL
+ INTEGER IBASINI, INSANE, INTUVDH, INTUVXH
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ INTUVPH = 0
+ IERR = 0
+ KPR = 0
+C
+ IF( LFIRST ) THEN
+ CALL GETENV('IGNORE_UV_EXTRA_MODE', EXTRA)
+ IF((EXTRA(1:1).EQ.'Y').OR.(EXTRA(1:1).EQ.'y')) LNEWUV = .FALSE.
+ IF( LNEWUV ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTUVPH: IGNORE_UV_EXTRA_MODE not turned on',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'INTUVPH: IGNORE_UV_EXTRA_MODE turned on',JPQUIET)
+ ENDIF
+ LFIRST = .FALSE.
+ ENDIF
+C
+ MIRESO = NIRESO
+ MORESO = NORESO
+C
+ LOLDWIND = LWINDSET
+C
+C Ensure that basic initialisation has been done
+C
+ IERR = IBASINI(0)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVPH: basic initialise failed',JPQUIET)
+ INTUVPH = IERR
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Unpack the input fields.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Need to establish input truncation, so unpack GRIB sections 1
+C and 2.
+C
+ IPARAM = 0
+ ISZVD = 1
+ IERR = INTUVDH(VD(IPVORT),ISZVD,KFIELD1,INLEN,'I',IPARAM)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVPH: GRIB header decode failed',IERR)
+ INTUVPH = IERR
+ GOTO 900
+ ENDIF
+C
+C Check that the input is an ECMWF spectral field
+C
+ IF( (ISEC1(1).NE.128).OR.(ISEC2(1).NE.50) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVPH: Input is not ECMWF spectral field.',JPQUIET)
+ INTUVPH = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Get scratch memory for input unpacked fields.
+C Unpacked field memory areas are adjacent.
+C
+ NIRESO = ISEC2(2)
+ ISZVD = (NIRESO+1)*(NIRESO+2)
+ IPVORT = 1
+ IPDIV = 1 + ISZVD
+ CALL JMEMHAN( JPSCR4, IVD, ISZVD*2, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVPH: Scratch memory type 4 allocation failed.',JPQUIET)
+ INTUVPH = IERR
+ GOTO 900
+ ENDIF
+C
+C Decode input fields..
+C
+ IERR = INTUVDH(VD(IPVORT),ISZVD,KFIELD1,INLEN,'D',IPARAM)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVPH: Vorticity decoding failed',IERR)
+ INTUVPH = IERR
+ GOTO 900
+ ENDIF
+C
+ IERR = INTUVDH(VD(IPDIV),ISZVD,KFIELD2,INLEN,'D',IPARAM)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVPH: Divergence decoding failed',IERR)
+ INTUVPH = IERR
+ GOTO 900
+ ENDIF
+C
+C Setup interpolation options from input GRIB characteristics.
+C
+ IERR = RESET_C( ISEC1, ISEC2, ZSEC2, ISEC4)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVPH: Setup interp. options from GRIB failed.',JPQUIET)
+ INTUVPH = IERR
+ GOTO 900
+ ENDIF
+C
+C Check that no outrageous values given for interpolation
+C
+ ISAME = INSANE()
+ IF( (ISAME.GT.0).AND.(ISAME.NE.27261) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVPH: Interpolation cannot use given values.',JPQUIET)
+ INTUVPH = ISAME
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Convert spectral vorticity/divergence
+C to spectral U/V
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Spectral U and V for Tn are to be generated from vorticity
+C and divergence spectral T(n-1)
+C
+C Get scratch memory for U and V spectral fields.
+C The memory areas are adjacent.
+C
+ IF( ISEC1(6).EQ.155 ) THEN
+C
+C Truncate vorticity and divergence to correspond to U/V
+C
+C
+ IF( LARESOL.AND.LNEWUV ) THEN
+ IF( (NOGRID(1).NE.0).AND.(NOGRID(2).NE.0) ) THEN
+ EW = FLOAT(NOGRID(1))/PPMULT
+ NS = FLOAT(NOGRID(2))/PPMULT
+ NTRUNC = AURESOL(NS,EW) - 1
+ ELSE IF( NOGAUSS.NE.0 ) THEN
+ EW = 90.0/FLOAT(NOGAUSS)
+ NS = EW
+ NTRUNC = AURESOL(NS,EW) - 1
+ ELSE IF( LNORESO ) THEN
+ NTRUNC = NORESO - 1
+ ELSE
+ NTRUNC = NIRESO - 1
+ ENDIF
+ IF( NTRUNC.GT.(NIRESO-1) ) NTRUNC = NIRESO - 1
+C
+ ELSE IF( LNORESO ) THEN
+ NTRUNC = NORESO - 1
+ ELSE
+ NTRUNC = NIRESO - 1
+ ENDIF
+C
+ IF( LNEWUV ) THEN
+ MTRUNC = NTRUNC + 1
+ ELSE
+ NTRUNC = NTRUNC + 1
+ MTRUNC = NTRUNC
+ ENDIF
+
+C
+C Check whether the output resolution is greater than the input
+C
+ IF( NTRUNC.GT.NIRESO ) THEN
+C
+C Issue warning if the output resolution was user-supplied
+C
+ IF( .NOT.LARESOL ) THEN
+C
+C Revert to the input truncation
+C
+ IF( NIRESO.NE.NTROLD2 ) THEN
+ CALL INTLOG(JP_WARN,
+ X 'INTUVPH: spectral -> grid point interpolation',JPQUIET)
+ CALL INTLOG(JP_WARN,
+ X 'INTUVPH: User supplied resolution = ',NTRUNC)
+ CALL INTLOG(JP_WARN,
+ X 'INTUVPH: Input field resolution = ',NIRESO)
+ CALL INTLOG(JP_WARN,
+ X 'INTUVPH: User supplied resolution ignored',JPQUIET)
+ CALL INTLOG(JP_WARN,
+ X 'INTUVPH: Input field resolution has been used',JPQUIET)
+ NTROLD2 = NIRESO
+ ENDIF
+ NTRUNC = NIRESO
+C
+ ELSE
+C
+C Revert to the input truncation
+C
+ NTRUNC = NIRESO
+ IF( NTRUNC.NE.NTROLD2 ) THEN
+ NTROLD2 = NTRUNC
+ CALL INTLOG(JP_WARN,
+ X 'INTUVPH: Auto-resolution selection too high',JPQUIET)
+ CALL INTLOG(JP_WARN,
+ X 'INTUVPH: Resolution set to input resolution: ',NTRUNC)
+ ENDIF
+ ENDIF
+ ENDIF
+C
+C
+ CALL INTLOG(JP_DEBUG,'INTUVPH: vo/div truncation = ', NTRUNC)
+ CALL INTLOG(JP_DEBUG,'INTUVPH: U/V truncation = ', MTRUNC)
+C
+ ISIZE = (NTRUNC+1)*(NTRUNC+2)
+ CALL JMEMHAN( JPSCR5, IZNFLDO, ISIZE*2, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVP: Scratch memory type 5 allocation failed.',JPQUIET)
+ INTUVPH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ CALL SH2SH( VD(IPVORT), NIRESO, ZNFLDO, NTRUNC )
+C
+ IDIVOFF = IPVORT + (NTRUNC+1)*(NTRUNC+2)
+ CALL SH2SH( VD(IPDIV), NIRESO, ZNFLDO(IDIVOFF), NTRUNC )
+C
+ NEXT = 0
+ DO LOOP = NTRUNC, 0, -1
+ NEXT = NEXT + LOOP + 1
+ ZNFLDO(IDIVOFF+NEXT*2-2) = 0
+ ZNFLDO(IDIVOFF+NEXT*2-1) = 0
+ ZNFLDO(IPVORT +NEXT*2-2) = 0
+ ZNFLDO(IPVORT +NEXT*2-1) = 0
+ ENDDO
+C
+ ISZUV = (MTRUNC+1)*(MTRUNC+2)
+ IP_U = 1
+ IP_V = 1 + ISZUV
+ CALL JMEMHAN( JPSCR3, IUV, ISZUV*2, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVPH: Scratch memory type 3 allocation failed.',JPQUIET)
+ INTUVPH = IERR
+ GOTO 900
+ ENDIF
+C
+C Generate U and V from vorticity and divergence,
+C
+ CALL JVOD2UV(ZNFLDO(IPVORT),ZNFLDO(IDIVOFF),NTRUNC,
+ X UV(IP_U),UV(IP_V),MTRUNC)
+C
+ ELSE
+C
+C Get scratch memory for U and V spectral fields.
+C The memory areas are adjacent.
+C
+ NTRUNC = NIRESO
+ ISZUV = (NIRESO+1)*(NIRESO+2)
+ IP_U = 1
+ IP_V = 1 + ISZUV
+ CALL JMEMHAN( JPSCR3, IUV, ISZUV*2, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVPH: Scratch memory type 3 allocation failed.',JPQUIET)
+ INTUVPH = IERR
+ GOTO 900
+ ENDIF
+C
+C Transfer input spectral U and V to the memory areas.
+C
+ DO LOOP = 0, ISZUV-1
+ UV(IP_U + LOOP) = VD(IPVORT + LOOP)
+ UV(IP_V + LOOP) = VD(IPDIV + LOOP)
+ ENDDO
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4. Handle spectral output.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ IF( (LNORESO) .AND.
+ X ((NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT)) ) THEN
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'INTUVPH: Produce spectral output with truncation',NORESO)
+C
+C Set GRIBEX flag to force recalculation of complex packing factor
+C
+ CALL GRSMKP(1)
+C
+ ISIZE = (NORESO+1)*(NORESO+2)
+ CALL JMEMHAN( JPSCR5, IZNFLDO, ISIZE*2, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVPH: Scratch memory type 5 allocation failed.',JPQUIET)
+ INTUVPH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ IP_U = 1
+ CALL SH2SH( UV(1), NIRESO, ZNFLDO(IP_U), NORESO )
+C
+ IP_V = 1 + (NORESO+1)*(NORESO+2)
+ CALL SH2SH( UV(1+ISZUV), NIRESO, ZNFLDO(IP_V), NORESO )
+C
+ NIRESO = NORESO
+C
+ ENDIF
+C
+C Has all processing been done (ie is the output spectral)?
+C
+ IF( (NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT) ) THEN
+C
+C Code U into GRIB
+C
+ IERR = INTUVDH(ZNFLDO(IP_U),ISZUV,KUGRIBO,OUTLENU,'C',JP_U)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVPH: U encoding into GRIB failed.',IERR)
+ INTUVPH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+C Code V into GRIB
+C
+ IERR = INTUVDH(ZNFLDO(IP_V),ISZUV,KVGRIBO,OUTLENV,'C',JP_V)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVPH: V encoding into GRIB failed.',IERR)
+ INTUVPH = JPROUTINE + 4
+ GOTO 490
+ ENDIF
+C
+ 490 CONTINUE
+C
+C Turn off GRIBEX flag which forces recalculation of complex
+C packing factor
+C
+ CALL GRSMKP(0)
+C
+ GOTO 900
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 6. Generate interpolated GRIB format U and V fields.
+C -----------------------------------------------------------------|
+C
+ 600 CONTINUE
+C
+C Get scratch space for interpolation
+C
+ IERR = FIXAREA()
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVPH: Fixarea failed.',JPQUIET)
+ INTUVPH = IERR
+ GOTO 900
+ ENDIF
+C
+ ISIZE = ISCRSZ()*2
+ IF( ISIZE.LE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVPH: Get scratch space failed.',ISIZE)
+ INTUVPH = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+ CALL JMEMHAN( JPSCR5, IZNFLDO, ISIZE, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVPH: Scratch memory(5) allocation failed.',JPQUIET)
+ INTUVPH = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+C
+ LWIND = .TRUE.
+ LWINDSET = .TRUE.
+C
+C Interpolate U and V
+C
+ NOLD = NIRESO
+ NIRESO = MTRUNC
+ IERR = INTUVXH(UV,ISZUV,ZNFLDO,KUGRIBO,KVGRIBO,OUTLENU,OUTLENV)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVPH: U/V interpolation failed.',JPQUIET)
+ INTUVPH = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+C
+ NIRESO = NOLD
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+C Clear change flags for next product processing and reset wind flag
+C
+ LCHANGE = .FALSE.
+ LSMCHNG = .FALSE.
+ LWINDSET = LOLDWIND
+ LWIND = .FALSE.
+C
+ NIRESO = MIRESO
+ NORESO = MORESO
+C
+ RETURN
+ END
diff --git a/interpolation/intuvs.F b/interpolation/intuvs.F
new file mode 100755
index 0000000..201ddc3
--- /dev/null
+++ b/interpolation/intuvs.F
@@ -0,0 +1,142 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTUVS( KVGRIB, KDGRIB, INLEN,
+ X KUGRIBO, KVGRIBO, OUTLEN)
+C
+C---->
+C**** INTUVS
+C
+C Purpose
+C -------
+C
+C Convert GRIB format input vorticity and divergence field to
+C GRIB format U and V fields.
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTUVS( KVGRIB, KDGRIB, INLEN, KUGRIBO,KVGRIBO,OUTLEN)
+C
+C Input
+C -----
+C
+C KVGRIB - Input vorticity field (spectral, GRIB format).
+C KDGRIB - Input divergence field (spectral, GRIB format).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C KUGRIBO - Output U field (GRIB format).
+C KVGRIBO - Output V field (GRIB format).
+C OUTLEN - Output field length (words).
+C
+C
+C Method
+C ------
+C
+C Convert spectral vorticity/divergence to spectral U/V without
+C subsequent interpolation.
+C
+C Note that a common block is used in intf.h to hold the U/V
+C fields before interpolation.
+C
+C Externals
+C ---------
+C
+C INTUVP - Now does all the work!
+C INTLOG - Log error message.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Feb 1995
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C J.D.Chambers ECMWF February 2001
+C Replace code by a call to intuvp.
+C
+C----<
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER KVGRIB(*), KDGRIB(*), INLEN
+ INTEGER KUGRIBO(*), KVGRIBO(*), OUTLEN
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 26900 )
+C
+C Local variables
+C
+ INTEGER IHOLD1, IHOLD2, IHOLD3
+ LOGICAL LHOLD4
+C
+C Externals
+C
+ INTEGER INTUVP
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+C -----------------------------------------------------------------|
+C* Section 2. Unpack the vorticity/divergence fields.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Ensure output representation says 'spectral, no rotation'
+C
+ IHOLD1 = NOREPR
+ NOREPR = JPSPHERE
+ IHOLD2 = NOROTA(1)
+ IHOLD3 = NOROTA(2)
+ NOROTA(1) = -9000000
+ NOROTA(2) = 0.0
+ LHOLD4 = LNOROTA
+ LNOROTA = .FALSE.
+C
+ INTUVS =
+ X INTUVP(KVGRIB,KDGRIB,INLEN,KUGRIBO,KVGRIBO,OUTLEN)
+C
+C Restore output representation
+C
+ NOREPR = IHOLD1
+ NOROTA(1) = IHOLD2
+ NOROTA(2) = IHOLD3
+ LNOROTA = LHOLD4
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/intuvu.F b/interpolation/intuvu.F
new file mode 100755
index 0000000..cb69227
--- /dev/null
+++ b/interpolation/intuvu.F
@@ -0,0 +1,861 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTUVU( PVYIN, PDVIN, INLEN,
+ X PUOUT, PVOUT, OUTLEN)
+C
+C---->
+C**** INTUVU
+C
+C Purpose
+C -------
+C
+C Interpolate unpacked input vorticity and divergence field to
+C unpacked U and V fields.
+C
+C
+C Interface
+C ---------
+C
+C IERR = INTUVU( PVYIN, PDVIN, INLEN, PUOUT,PVOUT,OUTLEN)
+C
+C Input
+C -----
+C
+C PVYIN - Input vorticity field (unpacked array).
+C PDVIN - Input divergence field (unpacked array).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C PUOUT - Output U field (unpacked array).
+C PVOUT - Output V field (unpacked array).
+C OUTLEN - Output field length (words).
+C
+C
+C Method
+C ------
+C
+C Convert spectral vorticity/divergence to spectral U/V and then
+C interpolate U and V to output fields.
+C
+C
+C Externals
+C ---------
+C
+C JVOD2UV - Converts spectral vorticity/divergence to spectral U/V.
+C JMEMHAN - Allocate scratch memory.
+C INTFAU - Prepare to interpolate unpacked input field.
+C INTFBU - Interpolate unpacked input field.
+C INTLOG - Log error message.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Feb 1995
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER INLEN, OUTLEN
+ REAL PVYIN(INLEN), PDVIN(INLEN), PUOUT(*), PVOUT(*)
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+#include "current.h"
+#include "intlog.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPALLOC, JPDEALL, JPSCR3, JPSCR4, JPSCR5
+ PARAMETER (JPROUTINE = 27000 )
+ PARAMETER (JPALLOC = 1)
+ PARAMETER (JPDEALL = 0)
+ PARAMETER (JPSCR3 = 3)
+ PARAMETER (JPSCR4 = 4)
+ PARAMETER (JPSCR5 = 5)
+C
+C Local variables
+C
+ INTEGER IIHOLD, IOHOLD
+ DIMENSION IIHOLD(4), IOHOLD(4)
+ CHARACTER*1 HOLDTYP
+ REAL EW, NS
+ LOGICAL LOLDWIND, LSPECUV, LSPCUVI, LSFCUVI
+ INTEGER IERR, KPR, ISZUV, ISIZE, NOLD, IDIVOFF
+ INTEGER NEXT, LOOP, MTRUNC, NTRUNC, NTROLD, NTROLD2, IPVORT
+ INTEGER KK, ISAME
+ INTEGER NLON, NLAT, NUMPTS, NGAUSS, NCOUNT, NUVFLAG
+ LOGICAL LSTYLE, LFRAME
+ REAL NORTH, SOUTH, WEST, EAST
+ REAL AREA(4), POLE(2), GRID(2)
+ INTEGER KPTS(JPGTRUNC*2)
+ REAL GLATS(JPGTRUNC*2)
+ REAL OLDGRID(2)
+C
+ LOGICAL LFIRST, LNEWUV
+ CHARACTER*3 EXTRA
+ DATA LFIRST/.TRUE./, LNEWUV/.TRUE./, EXTRA/'NO '/
+ SAVE LFIRST, LNEWUV
+C
+ DATA NTROLD/-1/, NTROLD2/-1/
+ SAVE NTROLD, NTROLD2
+ INTEGER IP_U, IP_V
+
+ REAL RGGRID, SWORK
+ POINTER (IRGGRID, RGGRID(1) )
+ POINTER (ISWORK, SWORK(1) )
+#ifdef POINTER_64
+ INTEGER*8 IZNFLDO
+#endif
+ REAL ZNFLDO
+ POINTER ( IZNFLDO, ZNFLDO )
+ DIMENSION ZNFLDO( 1 )
+#ifdef POINTER_64
+ INTEGER*8 IUV
+#endif
+ REAL UV
+ POINTER ( IUV, UV )
+ DIMENSION UV( 1 )
+C
+C Externals
+C
+ INTEGER INTFAU,INTFBU,AURESOL,DSSAREA,FIXAREA
+ INTEGER HIRLAMW,HSP2GG
+ INTEGER INSANE
+ INTEGER HRG2GGW, HLL2LLW
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+ INTUVU = 0
+ IERR = 0
+ KPR = 0
+C
+C
+C Save output area definitions
+C
+ DO 110 LOOP = 1, 4
+ IOHOLD(LOOP) = NOAREA(LOOP)
+ 110 CONTINUE
+
+ LFRAME = LNOFRAME.AND.
+ X ((NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPGAUSSIAN).OR.
+ X (NOREPR.EQ.JPREGROT ).OR.(NOREPR.EQ.JPFGGROT ) )
+
+ IF( LFIRST ) THEN
+ CALL GETENV('IGNORE_UV_EXTRA_MODE', EXTRA)
+ IF((EXTRA(1:1).EQ.'Y').OR.(EXTRA(1:1).EQ.'y')) LNEWUV = .FALSE.
+ IF( LNEWUV ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTUVU: IGNORE_UV_EXTRA_MODE not turned on',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'INTUVU: IGNORE_UV_EXTRA_MODE turned on',JPQUIET)
+ ENDIF
+ LFIRST = .FALSE.
+ ENDIF
+C
+ NOLD = NIRESO
+C
+ LSPECUV = (NOREPR.EQ.JPSPHERE).OR.(NOREPR.EQ.JPSPHROT)
+ LSPCUVI = (NIREPR.EQ.JPSPHERE).OR.(NIREPR.EQ.JPSPHROT)
+ LSFCUVI = (.NOT.LSPCUVI).AND.LNOROTA
+
+C
+CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+cs Regular Gaussian has to be set here
+ IF( NOREPR.EQ.JPNOTYPE ) THEN
+ IF( (NOGAUSO.NE.NOGAUSS).OR.(HOGAUST.NE.'F') ) THEN
+ CALL JGETGG( NOGAUSS, 'F', ROGAUSS, NOLPTS, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU: JGETGG failed, NOGAUSS = ',NOGAUSS)
+ INTUVU = IERR
+ GOTO 900
+ ENDIF
+ NOGAUSO = NOGAUSS
+ HOGAUST = 'F'
+ ENDIF
+ NOREPR = JPGAUSSIAN
+ ENDIF
+CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+C
+C -----------------------------------------------------------------|
+C* Section 2. Convert spectral vorticity/divergence to spectral U/V
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( LSPECUV ) THEN
+C
+C Spectral U and V for Tn are to be generated from vorticity
+C and divergence spectral T(n-1)
+C
+ IF( LARESOL.AND.LNEWUV ) THEN
+ IF( (NOGRID(1).NE.0).AND.(NOGRID(2).NE.0) ) THEN
+ EW = FLOAT(NOGRID(1))/PPMULT
+ NS = FLOAT(NOGRID(2))/PPMULT
+ NTRUNC = AURESOL(NS,EW) - 1
+ ELSE IF( NOGAUSS.NE.0 ) THEN
+ EW = 90.0/FLOAT(NOGAUSS)
+ NS = EW
+ NTRUNC = AURESOL(NS,EW) - 1
+ ELSE IF( LNORESO ) THEN
+ NTRUNC = NORESO - 1
+ ELSE
+ NTRUNC = NIRESO - 1
+ ENDIF
+ IF( NTRUNC.GT.(NIRESO-1) ) NTRUNC = NIRESO - 1
+C
+ ELSE IF( LNORESO ) THEN
+ NTRUNC = NORESO - 1
+ ELSE
+ NTRUNC = NIRESO - 1
+ ENDIF
+C
+ IF( LNEWUV ) THEN
+ MTRUNC = NTRUNC + 1
+ ELSE
+ NTRUNC = NTRUNC + 1
+ MTRUNC = NTRUNC
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Use old-style processing if IGNORE_UV_EXTRA_MODE = Y
+C -----------------------------------------------------------------|
+C
+ IF( .NOT.LNEWUV ) THEN
+C
+ CALL INTLOG(JP_DEBUG,'INTUVU: vo/div truncation = ', NIRESO)
+C
+C Get scratch memory for U and V spectral fields.
+C U and V memory areas are adjacent.
+C
+ ISZUV = (NIRESO+1)*(NIRESO+2)
+ IP_U = 1
+ IP_V = 1 + ISZUV
+ CALL JMEMHAN( JPSCR3, IUV, ISZUV*2, JPALLOC, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVU: Memory allocn fail',JPQUIET)
+ INTUVU = IERR
+ GOTO 900
+ ENDIF
+C
+C Generate U and V with same truncation as input fields.
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'INTUVU: Make intermediate U/V with truncation = ', NIRESO)
+C
+ CALL JVOD2UV(PVYIN,PDVIN,NIRESO,UV(IP_U),UV(IP_V),NIRESO)
+C
+C Is the output a truncated spectral field?
+C
+ IF( LNORESO ) THEN
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'INTUVU: Produce spectral output with truncation',NORESO)
+C
+ ISIZE = (NORESO+1)*(NORESO+2)
+ CALL JMEMHAN( JPSCR5, IZNFLDO, ISIZE, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'INTUVU: Get scratch fail',JPQUIET)
+ INTUVU = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ CALL SH2SH( UV(IP_U), NIRESO, ZNFLDO, NORESO )
+ DO LOOP = 1, ISIZE
+ PUOUT(LOOP) = ZNFLDO(LOOP)
+ ENDDO
+C
+ CALL SH2SH( UV(IP_V), NIRESO, ZNFLDO, NORESO )
+ DO LOOP = 1, ISIZE
+ PVOUT(LOOP) = ZNFLDO(LOOP)
+ ENDDO
+C
+ NIRESO = NORESO
+C
+ OUTLEN = ISZUV
+
+ GOTO 900
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C Use new-style processing if IGNORE_UV_EXTRA_MODE not set
+C -----------------------------------------------------------------|
+C
+ ELSE
+C
+ CALL INTLOG(JP_DEBUG,'INTUVU: vo/div truncation = ', NTRUNC)
+ CALL INTLOG(JP_DEBUG,'INTUVU: U/V truncation = ', MTRUNC)
+C
+C Truncate vorticity and divergence to correspond to U/V
+C
+ ISIZE = (MTRUNC+1)*(MTRUNC+2)
+ CALL JMEMHAN( JPSCR5, IZNFLDO, ISIZE*2, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU: Scratch memory type 5 allocn failed.',JPQUIET)
+ INTUVU = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ IPVORT = 1
+ CALL SH2SH( PVYIN, NIRESO, ZNFLDO, NTRUNC )
+C
+ IDIVOFF = 1 + (NTRUNC+1)*(NTRUNC+2)
+ CALL SH2SH( PDVIN, NIRESO, ZNFLDO(IDIVOFF), NTRUNC )
+C
+C Get scratch memory for U and V spectral fields.
+C U and V memory areas are adjacent.
+C
+ ISZUV = (MTRUNC+1)*(MTRUNC+2)
+ IP_U = 1
+ IP_V = 1 + ISZUV
+C
+ ISIZE = ISZUV*2
+ CALL JMEMHAN( JPSCR3, IUV, ISIZE, JPALLOC, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU: Scratch memory type 3 allocation failed.',JPQUIET)
+ INTUVU = IERR
+ GOTO 900
+ ENDIF
+C
+C Generate U and V spectral fields
+C
+ CALL JVOD2UV(ZNFLDO(IPVORT),ZNFLDO(IDIVOFF),NTRUNC,
+ X UV(IP_U),UV(IP_V),MTRUNC)
+C
+ DO LOOP = 1, ISZUV
+ PUOUT(LOOP) = UV(LOOP)
+ PVOUT(LOOP) = UV(LOOP+ISZUV)
+ ENDDO
+C
+C
+ OUTLEN = ISZUV
+cs added in case of packing after conversion
+ NORESO = MTRUNC
+C
+ GOTO 900
+C
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Generate grid point GRIB format U and V fields.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+cs this is for merging with grib_api
+ LUVCOMP = .FALSE.
+C Spectral U and V for Tn are to be generated from vorticity
+C and divergence spectral T(n-1)
+C
+C See whether or not the 'autoresol' flag is set.
+C If not, use the input truncation.
+C
+ IF( LARESOL ) THEN
+ IF( (NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT) ) THEN
+ EW = FLOAT(NOGRID(1))/PPMULT
+ NS = FLOAT(NOGRID(2))/PPMULT
+ ELSE
+ EW = 90.0/FLOAT(NOGAUSS)
+ NS = EW
+ ENDIF
+ NTRUNC = AURESOL(EW,NS)
+ IF( NTRUNC.NE.NTROLD ) THEN
+ NTROLD = NTRUNC
+ CALL INTLOG(JP_WARN,
+ X 'INTUVU: Resolution automatically set to ', NTRUNC)
+ ENDIF
+ ELSE IF( LNORESO ) THEN
+ NTRUNC = NORESO
+ ELSE
+ NTRUNC = NIRESO
+ ENDIF
+C
+C Check whether the output resolution is greater than the input
+C
+ IF( NTRUNC.GT.NIRESO ) THEN
+C
+C Issue warning if the output resolution was user-supplied
+C
+ IF( .NOT.LARESOL ) THEN
+C
+C Revert to the input truncation
+C
+ IF( NIRESO.NE.NTROLD2 ) THEN
+ CALL INTLOG(JP_WARN,
+ X 'INTUVU: spectral -> grid point interpolation',JPQUIET)
+ CALL INTLOG(JP_WARN,
+ X 'INTUVU: User supplied resolution = ',NTRUNC)
+ CALL INTLOG(JP_WARN,
+ X 'INTUVU: Input field resolution = ',NIRESO)
+ CALL INTLOG(JP_WARN,
+ X 'INTUVU: User supplied resolution ignored',JPQUIET)
+ CALL INTLOG(JP_WARN,
+ X 'INTUVU: Input field resolution has been used',JPQUIET)
+ NTROLD2 = NIRESO
+ ENDIF
+ NTRUNC = NIRESO
+C
+ ELSE
+C
+C Revert to the input truncation
+C
+ NTRUNC = NIRESO
+ IF( NTRUNC.NE.NTROLD2 ) THEN
+ NTROLD2 = NTRUNC
+ CALL INTLOG(JP_WARN,
+ X 'INTUVU: Automatic resolution selectn too high',JPQUIET)
+ CALL INTLOG(JP_WARN,
+ X 'INTUVU: Resolution reset to input resolution: ',NTRUNC)
+ ENDIF
+C
+ ENDIF
+ ENDIF
+C
+C IF extra mode is in use, adjust the calculated truncation.
+C
+ MTRUNC = NTRUNC
+ IF( LNEWUV ) NTRUNC = MTRUNC - 1
+C
+ CALL INTLOG(JP_DEBUG,'INTUVU: vo/div truncation = ', NTRUNC)
+ CALL INTLOG(JP_DEBUG,'INTUVU: U/V truncation = ', MTRUNC)
+C
+ ISIZE = (MTRUNC+1)*(MTRUNC+2)
+ CALL JMEMHAN( JPSCR5, IZNFLDO, ISIZE*2, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,
+ X 'INTUVU: Get scratch space failed',JPQUIET)
+ INTUVU = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Adjust the vorticity and divergence by one wave number before
+C conversion to U and V
+C
+ IPVORT = 1
+ IDIVOFF = 1 + (NTRUNC+1)*(NTRUNC+2)
+C
+ CALL SH2SH( PVYIN, NIRESO, ZNFLDO, NTRUNC )
+C
+ CALL SH2SH( PDVIN, NIRESO, ZNFLDO(IDIVOFF), NTRUNC )
+C
+C Get scratch memory for U and V spectral fields.
+C U and V memory areas are adjacent.
+C
+ ISZUV = (MTRUNC+1)*(MTRUNC+2)
+ IP_U = 1
+ IP_V = IP_U + ISZUV
+C
+ ISIZE = ISZUV*2
+ CALL JMEMHAN( JPSCR3, IUV, ISIZE, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU: Scratch memory type 3 allocation failed.',JPQUIET)
+ INTUVU = IERR
+ GOTO 900
+ ENDIF
+C
+C Generate U and V spectral fields
+C
+ CALL JVOD2UV(ZNFLDO(IPVORT),ZNFLDO(IDIVOFF),NTRUNC,
+ X UV(IP_U),UV(IP_V),MTRUNC)
+C
+ NIRESO = MTRUNC
+C
+C
+ LSTYLE = LNOSTYLE.AND.
+ X (NOSTYLE.EQ.JPSDISM).AND.
+ X (NOREPR.EQ.JPREGULAR)
+C
+ IF( LSTYLE ) THEN
+ EW = NOGRID(1) / PPMULT
+ NS = NOGRID(2) / PPMULT
+ NORTH = REAL(NOAREA(1)) / PPMULT
+ WEST = REAL(NOAREA(2)) / PPMULT
+ SOUTH = REAL(NOAREA(3)) / PPMULT
+ EAST = REAL(NOAREA(4)) / PPMULT
+C
+ IERR = DSSAREA( EW, NS, NORTH, WEST, SOUTH, EAST)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVU: DSSAREA failed:',IERR)
+ INTUVU = JPROUTINE + 9
+ GOTO 900
+ ENDIF
+C
+ NOAREA(1) = NINT(NORTH * PPMULT)
+ NOAREA(2) = NINT(WEST * PPMULT)
+ NOAREA(3) = NINT(SOUTH * PPMULT)
+ NOAREA(4) = NINT(EAST * PPMULT)
+ ELSE
+C Fixup area definition to correspond to grid definitions
+ IERR = FIXAREA()
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU: Fixup area definition failed.',JPQUIET)
+ INTUVU = IERR
+ GOTO 900
+ ENDIF
+ ENDIF
+ DO KK = 1,4
+ NOAAPI(KK) = NOAREA(KK)
+ ENDDO
+
+ NIFORM = 0
+ NIPARAM = JP_U
+ LWIND = .TRUE.
+ LOLDWIND = LWINDSET
+ LWINDSET = .TRUE.
+C
+ IF(LSFCUVI) GOTO 850
+ IF( LNOROTA ) GOTO 700
+
+C -----------------------------------------------------------------|
+C* Section 4. Interpolate U field.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ IERR = INTFAU( UV(IP_U), ISZUV, PUOUT, OUTLEN)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU: Prepare to interpolate failed.',JPQUIET)
+ INTUVU = IERR
+ GOTO 900
+ ENDIF
+C
+ IERR = INTFBU( UV(IP_U), ISZUV, PUOUT, OUTLEN)
+C
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVU: Interpolation failed.',JPQUIET)
+ INTUVU = IERR
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 5. Interpolate V field.
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+ NIPARAM = JP_V
+ IERR = INTFAU( UV(IP_V), ISZUV, PVOUT, OUTLEN)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU: Prepare to interpolate failed.',JPQUIET)
+ INTUVU = IERR
+ GOTO 900
+ ENDIF
+C
+ IERR = INTFBU( UV(IP_V), ISZUV, PVOUT, OUTLEN)
+C
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU: INTFBU interpolate failed.',JPQUIET)
+ INTUVU = IERR
+ GOTO 900
+ ENDIF
+
+cs GOTO 900
+ GOTO 890
+C
+C -----------------------------------------------------------------|
+C* Section 6. Initialise spectral to grid-point with rotation
+C -----------------------------------------------------------------|
+C
+ 700 CONTINUE
+ IF( .NOT.LUSEHIR ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU : Unable to rotate spectral U or V:',JPQUIET)
+ INTUVU = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+ IF( (NOREPR.NE.JPREGROT).AND.(NOREPR.NE.JPREGULAR) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU : For U/V, only regular lat/long',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU : output rotated grids allowed',JPQUIET)
+ INTUVU = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+cs this is for merging with grib_api
+ LUVCOMP = .TRUE.
+ CALL INTLOG(JP_DEBUG,'INTUVU: Rotate the U & V fields',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'INTUVU: South pole lat ',NOROTA(1))
+ CALL INTLOG(JP_DEBUG,'INTUVU: South pole long ',NOROTA(2))
+C
+C Fill area limits (handles case when default 0/0/0/0 given)
+C
+cssssssssss
+cs IERR = FIXAREA()
+cs IF( IERR.NE.0 ) THEN
+cs CALL INTLOG(JP_ERROR,'INTUVU: area fixup failed',JPQUIET)
+cs INTUVU = JPROUTINE + 3
+cs GOTO 900
+cs ENDIF
+C
+ AREA(1) = REAL(NOAREA(1))/PPMULT
+ AREA(2) = REAL(NOAREA(2))/PPMULT
+ AREA(3) = REAL(NOAREA(3))/PPMULT
+ AREA(4) = REAL(NOAREA(4))/PPMULT
+C
+ GRID(1) = REAL(NOGRID(1))/PPMULT
+ GRID(2) = REAL(NOGRID(2))/PPMULT
+C
+ POLE(1) = REAL(NOROTA(1))/PPMULT
+ POLE(2) = REAL(NOROTA(2))/PPMULT
+C
+C -----------------------------------------------------------------|
+C* Section 7. Convert spectral to suitable global reduced gaussian
+C -----------------------------------------------------------------|
+C
+ 800 CONTINUE
+C
+ NTRUNC = NIRESO
+ IERR = HSP2GG(NTRUNC,NGAUSS,KPTS,GLATS,ISIZE)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU: problem getting data for reduced grid',NTRUNC)
+ INTUVU = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+ NCOUNT = ISIZE
+C
+C Dynamically allocate memory for global reduced gaussian grid
+C
+ CALL JMEMHAN( 18, IRGGRID, (NCOUNT*2), 1, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU: memory alloc for reduced grid fail',JPQUIET)
+ INTUVU = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+C Set flag to show field is a wind component
+C
+ NUVFLAG = 1
+C
+C Create the reduced gaussian grid
+C
+ HOLDTYP = HOGAUST
+ WEST = 0.0
+ EAST = 360.0 - (360.0/(NGAUSS*4))
+C
+C U component
+C
+ CALL JAGGGP(UV(IP_U),NTRUNC,GLATS(1),GLATS(NGAUSS*2),WEST,
+ X EAST,NGAUSS,'R',KPTS,RGGRID,NUVFLAG,IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU: spectral to reduced gaussian failed',JPQUIET)
+ INTUVU = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ HOGAUST = HOLDTYP
+C
+C V component
+C
+ CALL JAGGGP(UV(IP_V),NTRUNC,GLATS(1),GLATS(NGAUSS*2),WEST,
+ X EAST,NGAUSS,'R',KPTS,RGGRID(1+NCOUNT),NUVFLAG,IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU: spectral to reduced gaussian failed',JPQUIET)
+ INTUVU = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+
+ HOGAUST = HOLDTYP
+
+
+C -----------------------------------------------------------------|
+C* Section 8. Rotate using 12-point horizontal interpolation
+C -----------------------------------------------------------------|
+C
+ 810 CONTINUE
+C
+C Dynamically allocate memory for rotated lat/long grid
+C
+ NLON = 1 + NINT(FLOAT(NOAREA(JPEAST) - NOAREA(JPWEST)) /
+ X NOGRID(JPWESTEP))
+ NLAT = 1 + NINT(FLOAT(NOAREA(JPNORTH) - NOAREA(JPSOUTH)) /
+ X NOGRID(JPNSSTEP))
+C
+ NUMPTS = NLON * NLAT
+ ISIZE = NUMPTS * 2
+ CALL JMEMHAN( 11, ISWORK, ISIZE, 1, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU: memory alloc for lat/long grid fail',JPQUIET)
+ INTUVU = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+C
+ IERR = HIRLAMW(LO12PT,RGGRID,RGGRID(1+NCOUNT),NCOUNT,NGAUSS,AREA,
+ X POLE,GRID,SWORK,SWORK(1+NUMPTS),NUMPTS,NLON,NLAT)
+C
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU: HIRLAMW rotation failed',JPQUIET)
+ INTUVU = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+c
+ DO LOOP = 1, NUMPTS
+ PUOUT(LOOP) = SWORK(LOOP)
+ PVOUT(LOOP) = SWORK(LOOP+NUMPTS)
+ ENDDO
+
+ OUTLEN = NUMPTS
+
+cs GOTO 900
+ GOTO 890
+c -----------------------------------------------------------------|
+C* Section 8.1 Grid to rotated grid point
+C -----------------------------------------------------------------|
+ 850 CONTINUE
+C* 8.1a Generate interpolated lat/long U and V fields.
+C -----------------------------------------------------------------|
+C
+cs this is for merging with grib_api
+ LUVCOMP = .TRUE.
+C
+ IF( (NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT) ) THEN
+C
+C Dynamically allocate scrath space for rotated lat/long grid
+C
+ NLON = 1 + NINT(FLOAT(NOAREA(JPEAST) - NOAREA(JPWEST)) /
+ X NOGRID(JPWESTEP))
+ NLAT = 1 + NINT(FLOAT(NOAREA(JPNORTH) - NOAREA(JPSOUTH)) /
+ X NOGRID(JPNSSTEP))
+C
+ NOWE = NLON
+ NONS = NLAT
+ OUTLEN = NLON * NLAT
+C
+C Rotate reduced gaussian to lat/long
+C
+ IF( (NIREPR.EQ.JPGAUSSIAN).OR.(NIREPR.EQ.JPQUASI) ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'INTUVU: Rotate reduced gaussian to lat/long',JPQUIET)
+ IERR = HIRLAMW(LO12PT,
+ X PVYIN,PDVIN,INLEN,
+ X NOGAUSS,AREA,POLE,GRID,
+ X PUOUT,PVOUT,OUTLEN,NLON,NLAT)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU: HIRLAMW rotation failed',JPQUIET)
+ INTUVU = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C Rotate lat/long to lat/long
+C
+ ELSE
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'INTUVU: Rotate lat/long to lat/long',JPQUIET)
+ OLDGRID(1) = REAL(NIGRID(1)) / PPMULT
+ OLDGRID(2) = REAL(NIGRID(2)) / PPMULT
+ IERR = HLL2LLW(LO12PT,PVYIN,PDVIN,
+ X OLDGRID,AREA,POLE,GRID,
+ X PUOUT,PVOUT,OUTLEN,NLON,NLAT)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVU: HLL2LLW rotation failed',JPQUIET)
+ INTUVU = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+ ELSE
+
+* Section 8.1b Generate interpolated gaussian U and V fields.
+C -----------------------------------------------------------------|
+C
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'INTUVU: Rotate gaussian to gaussian',JPQUIET)
+C
+C Dynamically allocate memory for rotated gaussian grids
+C
+ NUMPTS = NOGAUSS * NOGAUSS
+ OUTLEN = 2 * NUMPTS * 8
+C
+cs NGAUSS = ISEC2(10)
+ IERR = HRG2GGW(LO12PT,
+ X PVYIN,PDVIN,INLEN,
+ X NIGAUSS,AREA,POLE,NOGAUSS,HOGAUST,
+ X PUOUT,PVOUT,OUTLEN,NUMPTS)
+ IF( IERR.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'INTUVU: HRG2GGW rotation failed',JPQUIET)
+ INTUVU = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+ 890 CONTINUE
+ IF( LFRAME ) THEN
+ NLON = 1 + NINT(FLOAT(NOAREA(JPEAST) - NOAREA(JPWEST)) /
+ X NOGRID(JPWESTEP))
+ NLAT = 1 + NINT(FLOAT(NOAREA(JPNORTH) - NOAREA(JPSOUTH)) /
+ X NOGRID(JPNSSTEP))
+ ISEC1(5) = 192
+ ISEC3(2) = NINT(RMISSGV)
+ ZSEC3(2) = RMISSGV
+ LIMISSV = .TRUE.
+ CALL MKFRAME(NLON,NLAT,PUOUT,RMISSGV,NOFRAME)
+ CALL MKFRAME(NLON,NLAT,PVOUT,RMISSGV,NOFRAME)
+ ENDIF
+
+C
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+C Clear change flags for next product processing
+ LCHANGE = .FALSE.
+ LSMCHNG = .FALSE.
+ LWINDSET = LOLDWIND
+ DO 910 LOOP = 1, 4
+ NOAREA(LOOP) = IOHOLD(LOOP)
+ 910 CONTINUE
+C
+ NIRESO = NOLD
+C
+ RETURN
+ END
diff --git a/interpolation/intuvxh.F b/interpolation/intuvxh.F
new file mode 100755
index 0000000..974bb61
--- /dev/null
+++ b/interpolation/intuvxh.F
@@ -0,0 +1,418 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTUVXH(PUVSH,KNVALS,ZNFLDO,KUGRIB,KVGRIB,
+ X OUTLENU,OUTLENV)
+C
+C---->
+C**** INTUVXH
+C
+C Purpose
+C -------
+C
+C Interpolate U or V component spectral fields to grid point.
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTUVXH(PUVSH,KNVALS,ZNFLDO,KUGRIB,KVGRIB,OUTLENU,OUTLENV)
+C
+C Input
+C -----
+C
+C PUVSH - Spectral U/V values. (U first)
+C KNVALS - Number of values in each wind component field.
+C ZNFLDO - Work array.
+C
+C
+C Output
+C ------
+C
+C KUGRIB - Output wind U component field (GRIB format).
+C KVGRIB - Output wind V component field (GRIB format).
+C OUTLENU - Output U field length (words).
+C OUTLENV - Output V field length (words).
+C
+C
+C Method
+C ------
+C
+C None.
+C
+C
+C Externals
+C ---------
+C
+C INTUVDH - Encode/decode data into/from GRIB code.
+C INTFAU - Prepare to interpolate unpacked input field.
+C INTFBU - Interpolate unpacked input field.
+C INTLOG - Log error message.
+C MKFRAME - Create a 'frame' from a rectangular field.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF February 2001
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "intf.h"
+#include "current.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 40170 )
+C
+C Function arguments
+C
+ INTEGER KPARAM, KNVALS, KUGRIB(*), KVGRIB(*), OUTLENU, OUTLENV
+ REAL PUVSH(KNVALS*2), ZNFLDO(*)
+C
+C Local variables
+C
+ LOGICAL LFRAME, LOLDWIND
+ INTEGER NPARAM, IRET, ILENF, NTRUNC, NGAUSS, ISIZE, NCOUNT
+ INTEGER NUVFLAG, NLON, NLAT, NUMPTS, NBYTES
+ REAL AREA(4), GRID(2), POLE(2), EAST, WEST
+ CHARACTER*1 HOLDTYP
+ INTEGER LOOP
+C
+ REAL RGGRID, SWORK
+ POINTER (IRGGRID, RGGRID(1) )
+ POINTER (ISWORK, SWORK(1) )
+C
+ INTEGER KPTS(JPGTRUNC*2)
+ REAL GLATS(JPGTRUNC*2)
+C
+C Externals
+C
+ INTEGER FIXAREA, INTFAU, INTFBU, INTUVDH, HSP2GG
+ INTEGER HIRLAMW, JMALLOC
+C
+ DATA IRGGRID/-1/, ISWORK/-1/
+ SAVE IRGGRID, ISWORK
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ INTUVXH = 0
+C
+ LFRAME = LNOFRAME.AND.
+ X ((NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPGAUSSIAN).OR.
+ X (NOREPR.EQ.JPREGROT ).OR.(NOREPR.EQ.JPFGGROT ) )
+C
+ IF( LNOROTA ) GOTO 300
+C
+C -----------------------------------------------------------------|
+C* Section 2. Spectral to grid-point with no rotation
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'INTUVXH: Interoplate U & V fields with no rotation',JPQUIET)
+C
+C Unpack and interpolate U field
+C
+ NIFORM = 0
+ NIPARAM = JP_U
+ LWIND = .TRUE.
+ LOLDWIND = LWINDSET
+ LWINDSET = .TRUE.
+C
+ IRET = INTFAU( PUVSH, KNVALS)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVXH: Prepare to interpolate failed.',JPQUIET)
+ INTUVXH = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ IRET = INTFBU( PUVSH, KNVALS, ZNFLDO, ILENF)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVXH: Interpolation failed.',JPQUIET)
+ INTUVXH = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Unpack and interpolate V field
+C
+ NIPARAM = JP_V
+C
+ IRET = INTFAU( PUVSH(1+KNVALS), KNVALS)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVXH: Prepare to interpolate failed.',JPQUIET)
+ INTUVXH = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ IRET = INTFBU( PUVSH(1+KNVALS), KNVALS, ZNFLDO(1+ILENF), ILENF)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTUVXH: Interpolation failed.',JPQUIET)
+ INTUVXH = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Reset the input format flag
+C
+ NIFORM = 1
+C
+C Get some scratch memory for the U fields before interpolation
+C (to prevent overwriting V in ZNFLDO during interpolation)
+C
+cs ISIZE = ILENF
+cs CALL JMEMHAN( 11, ISWORK, ISIZE, 1, IRET)
+cs IF( IRET.NE.0 ) THEN
+cs CALL INTLOG(JP_ERROR,
+cs X 'INTUVXH: memory alloc for scratch memory failed',JPQUIET)
+cs INTUVXH = JPROUTINE + 2
+cs GOTO 900
+cs ENDIF
+C
+ LWINDSET = LOLDWIND
+C
+C
+C If a 'frame' has been specified, build the frame
+C
+ IF( LFRAME ) THEN
+ LIMISSV = .TRUE.
+ NLON = 1 + NINT(FLOAT(NOAREA(JPEAST) - NOAREA(JPWEST)) /
+ X NOGRID(JPWESTEP))
+ NLAT = 1 + NINT(FLOAT(NOAREA(JPNORTH) - NOAREA(JPSOUTH)) /
+ X NOGRID(JPNSSTEP))
+ CALL MKFRAME(NLON,NLAT,ZNFLDO,RMISSGV,NOFRAME)
+ CALL MKFRAME(NLON,NLAT,ZNFLDO(1+ILENF),RMISSGV,NOFRAME)
+ ENDIF
+
+C Code data into GRIB
+cs DO LOOP = 1, ILENF
+cs SWORK(LOOP) = ZNFLDO(LOOP)
+cs ENDDO
+C
+cs IRET = INTUVDH(SWORK,ILENF,KUGRIB,OUTLENU,'C',JP_U)
+ IRET = INTUVDH(ZNFLDO,ILENF,KUGRIB,OUTLENU,'C',JP_U)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVXH: Wind component into GRIB encoding fail',IRET)
+ INTUVXH = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ IRET = INTUVDH(ZNFLDO(1+ILENF),ILENF,KVGRIB,OUTLENV,'C',JP_V)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVXH: Wind component into GRIB encoding fail',IRET)
+ INTUVXH = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ GOTO 900
+C
+C -----------------------------------------------------------------|
+C* Section 3. Initialise spectral to grid-point with rotation
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( .NOT.LUSEHIR ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVXH : Unable to rotate spectral U or V:',JPQUIET)
+ INTUVXH = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+ IF( (NOREPR.NE.JPREGROT).AND.(NOREPR.NE.JPREGULAR) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVXH : For U/V, only regular lat/long',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVXH : output rotated grids allowed',JPQUIET)
+ INTUVXH = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+ CALL INTLOG(JP_DEBUG,'INTUVXH: Rotate the U & V fields',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'INTUVXH: South pole lat ',NOROTA(1))
+ CALL INTLOG(JP_DEBUG,'INTUVXH: South pole long ',NOROTA(2))
+C
+C Fill area limits (handles case when default 0/0/0/0 given)
+C
+cs IRET = FIXAREA()
+cs IF( IRET.NE.0 ) THEN
+cs CALL INTLOG(JP_ERROR,'INTUVXH: area fixup failed',JPQUIET)
+cs INTUVXH = JPROUTINE + 3
+cs GOTO 900
+cs ENDIF
+C
+ AREA(1) = REAL(NOAREA(1))/PPMULT
+ AREA(2) = REAL(NOAREA(2))/PPMULT
+ AREA(3) = REAL(NOAREA(3))/PPMULT
+ AREA(4) = REAL(NOAREA(4))/PPMULT
+C
+ GRID(1) = REAL(NOGRID(1))/PPMULT
+ GRID(2) = REAL(NOGRID(2))/PPMULT
+C
+ POLE(1) = REAL(NOROTA(1))/PPMULT
+ POLE(2) = REAL(NOROTA(2))/PPMULT
+C
+C -----------------------------------------------------------------|
+C* Section 4. Convert spectral to suitable global reduced gaussian
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ NTRUNC = NIRESO
+ IRET = HSP2GG(NTRUNC,NGAUSS,KPTS,GLATS,ISIZE)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVXH: problem getting data for reduced grid',NTRUNC)
+ INTUVXH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+ NCOUNT = ISIZE
+C
+C Dynamically allocate memory for global reduced gaussian grid
+C
+ CALL JMEMHAN( 18, IRGGRID, (NCOUNT*2), 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVXH: memory alloc for reduced grid fail',JPQUIET)
+ INTUVXH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+C Set flag to show field is a wind component
+C
+ NUVFLAG = 1
+C
+C Create the reduced gaussian grid
+C
+ HOLDTYP = HOGAUST
+ WEST = 0.0
+ EAST = 360.0 - (360.0/(NGAUSS*4))
+C
+C U component
+C
+ CALL JAGGGP(PUVSH,NTRUNC,GLATS(1),GLATS(NGAUSS*2),WEST,
+ X EAST,NGAUSS,'R',KPTS,RGGRID,NUVFLAG,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVXH: spectral to reduced gaussian failed',JPQUIET)
+ INTUVXH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ HOGAUST = HOLDTYP
+C
+C V component
+C
+ CALL JAGGGP(PUVSH(1+KNVALS),NTRUNC,GLATS(1),GLATS(NGAUSS*2),WEST,
+ X EAST,NGAUSS,'R',KPTS,RGGRID(1+NCOUNT),NUVFLAG,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVXH: spectral to reduced gaussian failed',JPQUIET)
+ INTUVXH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ HOGAUST = HOLDTYP
+C
+C -----------------------------------------------------------------|
+C* Section 5. Rotate using 12-point horizontal interpolation
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+C Dynamically allocate memory for rotated lat/long grid
+C
+ NLON = 1 + NINT(FLOAT(NOAREA(JPEAST) - NOAREA(JPWEST)) /
+ X NOGRID(JPWESTEP))
+ NLAT = 1 + NINT(FLOAT(NOAREA(JPNORTH) - NOAREA(JPSOUTH)) /
+ X NOGRID(JPNSSTEP))
+C
+ NUMPTS = NLON * NLAT
+ ISIZE = NUMPTS * 2
+ CALL JMEMHAN( 11, ISWORK, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVXH: memory alloc for lat/long grid fail',JPQUIET)
+ INTUVXH = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+C
+ IRET = HIRLAMW(LO12PT,RGGRID,RGGRID(1+NCOUNT),NCOUNT,NGAUSS,AREA,
+ X POLE,GRID,SWORK,SWORK(1+NUMPTS),NUMPTS,NLON,NLAT)
+C
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVXH: HIRLAMW rotation failed',JPQUIET)
+ INTUVXH = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 6. Pack the fields into GRIB format
+C -----------------------------------------------------------------|
+C
+ 600 CONTINUE
+C
+C Reset the input format flag
+C
+ NIFORM = 1
+C
+C Set the components flag for rotated U and V coefficients
+C
+ ISEC2(19) = 8
+C
+C If a 'frame' has been specified, build the frame
+C
+ IF( LFRAME ) THEN
+ LIMISSV = .TRUE.
+ CALL MKFRAME(NLON,NLAT,SWORK,RMISSGV,NOFRAME)
+ CALL MKFRAME(NLON,NLAT,SWORK(1+NUMPTS),RMISSGV,NOFRAME)
+ ENDIF
+C
+ IRET = INTUVDH(SWORK,NUMPTS,KUGRIB,OUTLENU,'C',JP_U)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVXH: Wind component into GRIB encoding fail',IRET)
+ INTUVXH = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+C
+ IRET = INTUVDH(SWORK(1+NUMPTS),NUMPTS,KVGRIB,OUTLENV,'C',JP_V)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVXH: Wind component into GRIB encoding fail',IRET)
+ INTUVXH = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/intuvy.F b/interpolation/intuvy.F
new file mode 100755
index 0000000..b0d981b
--- /dev/null
+++ b/interpolation/intuvy.F
@@ -0,0 +1,137 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTUVY( PVIN, PDIN, INLEN,
+ X PUOUT, PVOUT, OUTLEN)
+C
+C---->
+C**** INTUVY
+C
+C Purpose
+C -------
+C
+C Convert GRIB format input vorticity and divergence field to
+C unpacked U and V fields.
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTUVY( PVIN, PDIN, INLEN, PUOUT,PVOUT,OUTLEN)
+C
+C Input
+C -----
+C
+C KVIN - Input vorticity field (spectral).
+C KDIN - Input divergence field (spectral).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C KUOUT - Output U field
+C KVOUT - Output V field
+C OUTLEN - Output field length (words).
+C
+C
+C Method
+C ------
+C
+C Convert spectral vorticity/divergence to spectral U/V without
+C subsequent interpolation.
+C
+C Note that a common block is used in intf.h to hold the U/V
+C fields before interpolation.
+C
+C Externals
+C ---------
+C
+C INTUVU - Now does all the work!
+C INTLOG - Log error message.
+C
+C
+C Author
+C ------
+C
+C S.Curic ECMWF Dec 2006
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER INLEN, OUTLEN
+ REAL PVIN(INLEN), PDIN(INLEN), PUOUT(*), PVOUT(*)
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 26900 )
+C
+C Local variables
+C
+ INTEGER IHOLD1, IHOLD2, IHOLD3
+ LOGICAL LHOLD4
+C
+C Externals
+C
+ INTEGER INTUVU
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+C -----------------------------------------------------------------|
+C* Section 2. Unpack the vorticity/divergence fields.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Ensure output representation says 'spectral, no rotation'
+C
+ IHOLD1 = NOREPR
+ NOREPR = JPSPHERE
+ IHOLD2 = NOROTA(1)
+ IHOLD3 = NOROTA(2)
+ NOROTA(1) = -9000000
+ NOROTA(2) = 0.0
+ LHOLD4 = LNOROTA
+ LNOROTA = .FALSE.
+C
+ INTUVY =
+ X INTUVU(PVIN,PDIN,INLEN,PUOUT,PVOUT,OUTLEN)
+C
+C Restore output representation
+C
+ NOREPR = IHOLD1
+ NOROTA(1) = IHOLD2
+ NOROTA(2) = IHOLD3
+ LNOROTA = LHOLD4
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/intvect.F b/interpolation/intvect.F
new file mode 100755
index 0000000..63cfac4
--- /dev/null
+++ b/interpolation/intvect.F
@@ -0,0 +1,511 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTVECT(PUFIELD,PVFIELD,KASIZE,
+ X KUGRIB,KVGRIB,OUTLEN)
+C
+C---->
+C**** INTVECT
+C
+C Purpose
+C -------
+C Interpolate U or V component fields to grid point.
+C
+C
+C Interface
+C ---------
+C IRET = INTVECT(PUFIELD,PVFIELD,KASIZE,
+C X KUGRIB,KVGRIB,OUTLEN)
+C
+C Input
+C -----
+C PUFIELD - U values.
+C PVFIELD - V values.
+C KASIZE - Size of input arrays
+C
+C
+C Output
+C ------
+C KUGRIB - Output wind U component field (GRIB format).
+C KVGRIB - Output wind V component field (GRIB format).
+C OUTLEN - Output U field length (words).
+C
+C
+C Method
+C ------
+C None.
+C
+C
+C Externals
+C ---------
+C RESET_C - Reset interpolation handling options using GRIB product.
+C IBASINI - Ensure basic interpolation setup is done.
+C ISCRSZ - Calculate number of values in generated field.
+C INTUVDH - Encode/decode data into/from GRIB code.
+C INTFAU - Prepare to interpolate unpacked input field.
+C INTFBU - Interpolate unpacked input field.
+C INTLOG - Log error message.
+C MKFRAME - Create a 'frame' from a rectangular field.
+C INTUVGH - Interpolate GRIB U and V reduced gaussian to rotated GRIB
+C U and V.
+C
+C
+C Author
+C ------
+C J.D.Chambers ECMWF September 2004
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "intf.h"
+#include "current.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 40170 )
+C
+C Function arguments
+C
+ INTEGER KPARAM, KASIZE, KUGRIB(*), KVGRIB(*), OUTLEN
+ REAL PUFIELD(KASIZE), PVFIELD(KASIZE)
+C
+C Local variables
+C
+ LOGICAL LFRAME, LOLDWIND, LOMISSV
+ INTEGER NPARAM, IRET, ILENF, NTRUNC, NGAUSS, ISIZE, NCOUNT
+ INTEGER NUVFLAG, NLON, NLAT, NBYTES, NSIZE
+ INTEGER ISZVD, IHOLD, ISAME
+ INTEGER IN_U, IN_V
+ REAL DUMMY
+ REAL AREA(4), GRID(2), POLE(2), EAST, WEST
+ CHARACTER*1 HOLDTYP
+ INTEGER LOOP
+ INTEGER OUTLENO
+C
+ REAL RGGRID, SWORK, TWORK
+ POINTER (IRGGRID, RGGRID(1) )
+ POINTER (ISWORK, SWORK(1) )
+ POINTER (ITWORK, TWORK(1) )
+C
+ INTEGER KPTS(JPGTRUNC*2)
+ REAL GLATS(JPGTRUNC*2)
+
+ LOGICAL LFIRST, LNEWUV, LSPECUV
+ CHARACTER*3 EXTRA
+C
+C Externals
+C
+ INTEGER FIXAREA, INTFAU, INTFBU, INTUVDH, HSP2GG, IBASINI
+ INTEGER HIRLAMW, ISCRSZ, RESET_C, INSANE, INTUVGH
+C
+ DATA IRGGRID/-1/, ISWORK/-1/, ITWORK/-1/
+ SAVE IRGGRID, ISWORK, ITWORK
+ DATA LFIRST/.TRUE./, LNEWUV/.TRUE./, EXTRA/'NO '/
+ SAVE LFIRST, LNEWUV
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ INTVECT = 0
+
+
+ IF( LFIRST ) THEN
+ CALL GETENV('IGNORE_UV_EXTRA_MODE', EXTRA)
+ IF((EXTRA(1:1).EQ.'Y').OR.(EXTRA(1:1).EQ.'y')) LNEWUV = .FALSE.
+ IF( LNEWUV ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTVECT: IGNORE_UV_EXTRA_MODE not turned on',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'INTVECT: IGNORE_UV_EXTRA_MODE turned on',JPQUIET)
+ ENDIF
+ LFIRST = .FALSE.
+ ENDIF
+C
+ LOLDWIND = LWINDSET
+C
+C Ensure that basic initialisation has been done
+C
+ IRET = IBASINI(0)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTVECT: basic initialise failed',JPQUIET)
+ INTVECT = IRET
+ GOTO 900
+ ENDIF
+C
+C Unpack GRIB sections 1 and 2.
+C
+ ISZVD = 1
+ IRET = INTUVDH(DUMMY,ISZVD,PUFIELD,KASIZE,'J',IN_U)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTVECT: GRIB header decode failed',IRET)
+ INTVECT = IRET
+ GOTO 900
+ ENDIF
+ NSIZE = ISEC4(1)
+ NIREPR = ISEC2(1)
+ LSPECUV = (NIREPR.EQ.JPSPHERE).OR.(NIREPR.EQ.JPSPHROT)
+ IF( LSPECUV ) NIRESO = ISEC2(2)
+C
+C Setup interpolation options from input GRIB characteristics.
+C
+ IRET = RESET_C(ISEC1, ISEC2, ZSEC2, ISEC4)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECT: Setup interp. options from GRIB failed.',JPQUIET)
+ INTVECT = IRET
+ GOTO 900
+ ENDIF
+
+ IF(NIREPR.EQ.JPREGROT) THEN
+ OUTLEN = 0
+ IRET = 0
+ CALL INTLOG(JP_DEBUG,
+ X 'INTF: Input U and V rotated lat/long fields ...',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'INTF: ... no interpolation has been done',JPQUIET)
+ GOTO 900
+ ENDIF
+C
+C Only allowed rotations are:
+C - spectral to regular lat/long
+C - reduced gaussian to regular lat/long
+C
+ IF( LNOROTA ) THEN
+ IF( ((NOREPR.NE.JPREGROT).AND.(NOREPR.NE.JPREGULAR)).OR.
+ X ((NIREPR.NE.JPSPHERE).AND.(NIREPR.NE.JPQUASI)) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECT: For vector fields, only allowed rotations are:',
+ X JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECT: spectral to regular lat/long, or',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECT: reduced gaussian to regular lat/long',JPQUIET)
+ INTVECT = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C Check that no outrageous values given for interpolation
+C
+ ISAME = INSANE()
+ IF( (ISAME.GT.0).AND.(ISAME.NE.27261) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECT: Interpolation cannot use given values.',JPQUIET)
+ INTVECT = ISAME
+ GOTO 900
+ ENDIF
+C
+ LFRAME = LNOFRAME.AND.
+ X ((NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPGAUSSIAN).OR.
+ X (NOREPR.EQ.JPREGROT ).OR.(NOREPR.EQ.JPFGGROT ) )
+C
+C Fill area limits (handles case when default 0/0/0/0 given)
+C
+ IRET = FIXAREA()
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTVECT: area fixup failed',JPQUIET)
+ INTVECT = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+ AREA(1) = REAL(NOAREA(1))/PPMULT
+ AREA(2) = REAL(NOAREA(2))/PPMULT
+ AREA(3) = REAL(NOAREA(3))/PPMULT
+ AREA(4) = REAL(NOAREA(4))/PPMULT
+C
+ GRID(1) = REAL(NOGRID(1))/PPMULT
+ GRID(2) = REAL(NOGRID(2))/PPMULT
+C
+ IF( LNOROTA ) THEN
+ POLE(1) = REAL(NOROTA(1))/PPMULT
+ POLE(2) = REAL(NOROTA(2))/PPMULT
+ CALL INTLOG(JP_DEBUG,'INTVECT: Rotate the U & V fields',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'INTVECT: South pole lat ',NOROTA(1))
+ CALL INTLOG(JP_DEBUG,'INTVECT: South pole long ',NOROTA(2))
+ ELSE
+ NOROTA(1) = -9000000
+ NOROTA(2) = 0
+ ENDIF
+C
+ IF( .NOT. LSPECUV ) GOTO 500
+C
+C Get some scratch memory for the U and V fields
+C
+ ILENF = NSIZE
+ ISIZE = ILENF * 2
+ CALL JMEMHAN( 11, ISWORK, NSIZE*2, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECT: memory alloc for scratch memory failed',JPQUIET)
+ INTVECT = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Unpack U field
+C
+ NIFORM = 0
+ NIPARAM = IN_U
+ LWIND = .TRUE.
+ LOLDWIND = LWINDSET
+ LWINDSET = .TRUE.
+C
+ IRET = INTUVDH(SWORK,NSIZE,PUFIELD,KASIZE,'D',NIPARAM)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTVECT: Vorticity decoding failed',IRET)
+ INTVECT = IRET
+ GOTO 900
+ ENDIF
+ IN_U = ISEC1(6)
+C
+C Unpack V field
+C
+ NIPARAM = IN_V
+C
+ IRET = INTUVDH(SWORK(1+NSIZE),NSIZE,PVFIELD,KASIZE,'D',NIPARAM)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTVECT: Vorticity decoding failed',IRET)
+ INTVECT = IRET
+ GOTO 900
+ ENDIF
+ IN_V = ISEC1(6)
+C
+ IF( LNOROTA ) GOTO 300
+C
+C -----------------------------------------------------------------|
+C* Section 2. Spectral to grid-point with no rotation
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'INTVECT: Interpolate U & V fields with no rotation',JPQUIET)
+C
+ CALL JMEMHAN( 18, ITWORK, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECT: memory alloc for scratch memory failed',JPQUIET)
+ INTVECT = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Interpolate U field
+C
+ IRET = INTFAU(SWORK, NSIZE)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECT: Prepare to interpolate failed.',JPQUIET)
+ INTVECT = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ IRET = INTFBU(SWORK, NSIZE, TWORK, ILENF)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTVECT: Interpolation failed.',JPQUIET)
+ INTVECT = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Interpolate V field
+C
+ IRET = INTFAU(SWORK(1+NSIZE),NSIZE)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECT: Prepare to interpolate failed.',JPQUIET)
+ INTVECT = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ IRET = INTFBU(SWORK(1+NSIZE),NSIZE, TWORK(1+ILENF), ILENF)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTVECT: Interpolation failed.',JPQUIET)
+ INTVECT = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ GOTO 700
+C
+C -----------------------------------------------------------------|
+C* Section 3. Spectral to grid-point with rotation
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( .NOT.LUSEHIR ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECT : Unable to rotate spectral U or V:',JPQUIET)
+ INTVECT = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C Convert spectral to suitable global reduced gaussian
+C
+ NTRUNC = NIRESO
+ IRET = HSP2GG(NTRUNC,NGAUSS,KPTS,GLATS,ISIZE)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECT: problem getting data for reduced grid',NTRUNC)
+ INTVECT = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+ NCOUNT = ISIZE
+C
+C Dynamically allocate memory for global reduced gaussian grid
+C
+ CALL JMEMHAN( 18, IRGGRID, (NCOUNT*2), 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECT: memory alloc for reduced grid fail',JPQUIET)
+ INTVECT = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+C Set flag to show field is a wind component
+C
+ NUVFLAG = 1
+C
+C Create the reduced gaussian grid
+C
+ HOLDTYP = HOGAUST
+ WEST = 0.0
+ EAST = 360.0 - (360.0/(NGAUSS*4))
+C
+C U component spectral -> reduced gaussian
+C
+ CALL JAGGGP(SWORK,NTRUNC,GLATS(1),GLATS(NGAUSS*2),WEST,
+ X EAST,NGAUSS,'R',KPTS,RGGRID,NUVFLAG,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECT: spectral to reduced gaussian failed',JPQUIET)
+ INTVECT = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ HOGAUST = HOLDTYP
+C
+C V component spectral -> reduced gaussian
+C
+ CALL JAGGGP(SWORK(1+NSIZE),NTRUNC,GLATS(1),GLATS(NGAUSS*2),WEST,
+ X EAST,NGAUSS,'R',KPTS,RGGRID(1+NCOUNT),NUVFLAG,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECT: spectral to reduced gaussian failed',JPQUIET)
+ INTVECT = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ HOGAUST = HOLDTYP
+C
+C Rotate using 12-point horizontal interpolation
+C
+C Dynamically allocate memory for rotated lat/long grid
+C
+ NLON = 1 + NINT((AREA(JPEAST) - AREA(JPWEST)) /
+ X GRID(JPWESTEP)) ! SC
+ NLAT = 1 + NINT((AREA(JPNORTH) - AREA(JPSOUTH)) /
+ X GRID(JPNSSTEP)) ! SC
+C
+ ILENF = NLON * NLAT
+ ISIZE = ILENF * 2
+ CALL JMEMHAN( 17, ITWORK, ISIZE, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECT: memory alloc for lat/long grid fail',JPQUIET)
+ INTVECT = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+C
+ IRET = HIRLAMW(LO12PT,RGGRID,RGGRID(1+NCOUNT),NCOUNT,NGAUSS,AREA,
+ X POLE,GRID,TWORK,TWORK(1+ILENF),ILENF,NLON,NLAT)
+C
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECT: HIRLAMW rotation failed',JPQUIET)
+ INTVECT = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+C
+C Set the components flag for rotated U and V coefficients
+C
+ ISEC2(19) = 8
+ NOWE = NLON
+ NONS = NLAT
+C
+ GOTO 700
+C
+C -----------------------------------------------------------------|
+C* Section 5. Reduced gaussian to grid-point
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+ INTVECT =
+ X INTUVGH(PUFIELD,PVFIELD,KASIZE,KUGRIB,KVGRIB,OUTLEN,OUTLEN)
+C
+ GOTO 900
+C
+C -----------------------------------------------------------------|
+C* Section 7. Pack the fields into GRIB format
+C -----------------------------------------------------------------|
+C
+ 700 CONTINUE
+C
+C Reset the input format flag
+C
+ NIFORM = 1
+C
+C If a 'frame' has been specified, build the frame
+C
+ IF( LFRAME ) THEN
+ LOMISSV = LIMISSV
+ LIMISSV = .TRUE.
+ CALL MKFRAME(NLON,NLAT,TWORK,RMISSGV,NOFRAME)
+ CALL MKFRAME(NLON,NLAT,TWORK(1+ILENF),RMISSGV,NOFRAME)
+ ENDIF
+C
+ OUTLENO = OUTLEN
+ IRET = INTUVDH(TWORK,ILENF,KUGRIB,OUTLEN,'C',IN_U)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECT: Wind component into GRIB encoding fail',IRET)
+ INTVECT = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+
+C
+ OUTLEN = OUTLENO
+ IRET = INTUVDH(TWORK(1+ILENF),ILENF,KVGRIB,OUTLEN,'C',IN_V)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECT: Wind component into GRIB encoding fail',IRET)
+ INTVECT = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+C
+ IF( LFRAME ) LIMISSV = LOMISSV
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/intvecy.F b/interpolation/intvecy.F
new file mode 100755
index 0000000..67cc67b
--- /dev/null
+++ b/interpolation/intvecy.F
@@ -0,0 +1,518 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTVECY(PUFIELD,PVFIELD,KASIZE,
+ X PUOUT,PVOUT,OUTLEN)
+C
+C---->
+C**** INTVECY
+C
+C Purpose
+C -------
+C Interpolate U or V component fields to grid point.
+C
+C
+C Interface
+C ---------
+C IRET = INTVECY(PUFIELD,PVFIELD,KASIZE,
+C X KUGRIB,KVGRIB,OUTLEN)
+C
+C Input
+C -----
+C PUFIELD - U values.
+C PVFIELD - V values.
+C KASIZE - Size of input arrays
+C
+C
+C Output
+C ------
+C PUOUT - Output wind U component field
+C PVOUT - Output wind V component field
+C OUTLEN - Output U field length (words).
+C
+C
+C Method
+C ------
+C None.
+C
+C
+C Externals
+C ---------
+C RESET_C - Reset interpolation handling options using GRIB product.
+C IBASINI - Ensure basic interpolation setup is done.
+C ISCRSZ - Calculate number of values in generated field.
+C INTFAU - Prepare to interpolate unpacked input field.
+C INTFBU - Interpolate unpacked input field.
+C INTLOG - Log error message.
+C MKFRAME - Create a 'frame' from a rectangular field.
+C INTUVGH - Interpolate GRIB U and V reduced gaussian to rotated GRIB
+C U and V.
+C
+C
+C Author
+C ------
+C S.Curic ECMWF December 2006
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "intf.h"
+#include "current.h"
+#include "intlog.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 40170 )
+C
+C Function arguments
+C
+ INTEGER KPARAM, KASIZE, OUTLEN
+ REAL PUFIELD(KASIZE), PVFIELD(KASIZE), PUOUT(*), PVOUT(*)
+C
+C Local variables
+C
+ LOGICAL LFRAME, LOLDWIND, LOMISSV
+ INTEGER NPARAM, IRET, ILENF, NTRUNC, NGAUSS, ISIZE, NCOUNT
+ INTEGER NUVFLAG, NLON, NLAT, NBYTES, NSIZE
+ INTEGER IHOLD, ISAME
+ INTEGER IN_U, IN_V
+ INTEGER NUMPTS
+ REAL DUMMY
+ REAL AREA(4), GRID(2), POLE(2), EAST, WEST
+ REAL OLDGRID(2)
+ CHARACTER*1 HOLDTYP
+ INTEGER LOOP
+C
+ REAL RGGRID, SWORK, TWORK
+ POINTER (IRGGRID, RGGRID(1) )
+ POINTER (ISWORK, SWORK(1) )
+ POINTER (ITWORK, TWORK(1) )
+C
+ INTEGER KPTS(JPGTRUNC*2)
+ REAL GLATS(JPGTRUNC*2)
+
+ LOGICAL LFIRST, LNEWUV, LSPECUV
+ CHARACTER*3 EXTRA
+C
+C Externals
+C
+ INTEGER FIXAREA, INTFAU, INTFBU, INTUVDH, HSP2GG, IBASINI
+ INTEGER HIRLAMW, ISCRSZ, RESET_C, INSANE, INTUVGH
+ INTEGER HRG2GGW, HLL2LLW
+C
+ DATA IRGGRID/-1/, ISWORK/-1/, ITWORK/-1/
+ SAVE IRGGRID, ISWORK, ITWORK
+ DATA LFIRST/.TRUE./, LNEWUV/.TRUE./, EXTRA/'NO '/
+ SAVE LFIRST, LNEWUV
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ INTVECY = 0
+ IF( LFIRST ) THEN
+ CALL GETENV('IGNORE_UV_EXTRA_MODE', EXTRA)
+ IF((EXTRA(1:1).EQ.'Y').OR.(EXTRA(1:1).EQ.'y')) LNEWUV = .FALSE.
+ IF( LNEWUV ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTVECY: IGNORE_UV_EXTRA_MODE not turned on',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'INTVECY: IGNORE_UV_EXTRA_MODE turned on',JPQUIET)
+ ENDIF
+ LFIRST = .FALSE.
+ ENDIF
+C
+ LOLDWIND = LWINDSET
+C
+C Ensure that basic initialisation has been done
+C
+ IRET = IBASINI(0)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTVECY: basic initialise failed',JPQUIET)
+ INTVECY = IRET
+ GOTO 900
+ ENDIF
+C
+C
+cs NSIZE = ISEC4(1)
+ NSIZE = KASIZE
+cs NIREPR = ISEC2(1)
+ LSPECUV = (NIREPR.EQ.JPSPHERE).OR.(NIREPR.EQ.JPSPHROT)
+cs IF( LSPECUV ) NIRESO = ISEC2(2)
+C
+C Setup interpolation options from input GRIB characteristics.
+C
+cs IRET = RESET_C(ISEC1, ISEC2, ZSEC2, ISEC4)
+cs IF( IRET.NE.0 ) THEN
+cs CALL INTLOG(JP_ERROR,
+cs X 'INTVECY: Setup interp. options from GRIB failed.',JPQUIET)
+cs INTVECY = IRET
+cs GOTO 900
+cs ENDIF
+C
+C Only allowed rotations are:
+C - spectral to regular lat/long
+C - reduced gaussian to regular lat/long
+C
+ IF( LNOROTA ) THEN
+ IF( ((NOREPR.NE.JPREGROT).AND.(NOREPR.NE.JPREGULAR)).OR.
+ X ((NIREPR.NE.JPSPHERE).AND.(NIREPR.NE.JPQUASI)) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECY: For vector fields, only allowed rotations are:',
+ X JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECY: spectral to regular lat/long, or',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECY: reduced gaussian to regular lat/long',JPQUIET)
+ INTVECY = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C Check that no outrageous values given for interpolation
+C
+ ISAME = INSANE()
+ IF( (ISAME.GT.0).AND.(ISAME.NE.27261) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECY: Interpolation cannot use given values.',JPQUIET)
+ INTVECY = ISAME
+ GOTO 900
+ ENDIF
+C
+ LFRAME = LNOFRAME.AND.
+ X ((NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPGAUSSIAN).OR.
+ X (NOREPR.EQ.JPREGROT ).OR.(NOREPR.EQ.JPFGGROT ) )
+C
+C Fill area limits (handles case when default 0/0/0/0 given)
+C
+ IRET = FIXAREA()
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTVECY: area fixup failed',JPQUIET)
+ INTVECY = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+ AREA(1) = REAL(NOAREA(1))/PPMULT
+ AREA(2) = REAL(NOAREA(2))/PPMULT
+ AREA(3) = REAL(NOAREA(3))/PPMULT
+ AREA(4) = REAL(NOAREA(4))/PPMULT
+C
+ GRID(1) = REAL(NOGRID(1))/PPMULT
+ GRID(2) = REAL(NOGRID(2))/PPMULT
+C
+ IF( LNOROTA ) THEN
+ POLE(1) = REAL(NOROTA(1))/PPMULT
+ POLE(2) = REAL(NOROTA(2))/PPMULT
+ CALL INTLOG(JP_DEBUG,'INTVECY: Rotate the U & V fields',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'INTVECY: South pole lat ',NOROTA(1))
+ CALL INTLOG(JP_DEBUG,'INTVECY: South pole long ',NOROTA(2))
+ ELSE
+ NOROTA(1) = -9000000
+ NOROTA(2) = 0
+ ENDIF
+C
+
+ IF( .NOT. LSPECUV ) GOTO 500
+C
+C Get some scratch memory for the U and V fields
+C
+C Unpack U field
+C
+ NIFORM = 0
+cs NIPARAM = IN_U
+ LWIND = .TRUE.
+ LOLDWIND = LWINDSET
+ LWINDSET = .TRUE.
+C
+cs IN_U = ISEC1(6)
+C
+C Unpack V field
+C
+cs NIPARAM = IN_V
+cs IN_V = ISEC1(6)
+C
+ IF( LNOROTA ) GOTO 300
+C
+C -----------------------------------------------------------------|
+C* Section 2. Spectral to grid-point with no rotation
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'INTVECY: Interpolate U & V fields with no rotation',JPQUIET)
+C
+C
+C Interpolate U field
+C
+ IRET = INTFAU(PUFIELD, KASIZE)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECY: Prepare to interpolate failed.',JPQUIET)
+ INTVECY = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ IRET = INTFBU(PUFIELD, KASIZE, PUOUT, OUTLEN)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTVECY: Interpolation failed.',JPQUIET)
+ INTVECY = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Interpolate V field
+C
+ IRET = INTFAU(PVFIELD, KASIZE)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECY: Prepare to interpolate failed.',JPQUIET)
+ INTVECY = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ IRET = INTFBU(PVFIELD, KASIZE, PVOUT, OUTLEN)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTVECY: Interpolation failed.',JPQUIET)
+ INTVECY = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ GOTO 700
+C
+C -----------------------------------------------------------------|
+C* Section 3. Spectral to grid-point with rotation
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( .NOT.LUSEHIR ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECY : Unable to rotate spectral U or V:',JPQUIET)
+ INTVECY = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C Convert spectral to suitable global reduced gaussian
+C
+ NTRUNC = NIRESO
+ IRET = HSP2GG(NTRUNC,NGAUSS,KPTS,GLATS,ISIZE)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECY: problem getting data for reduced grid',NTRUNC)
+ INTVECY = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ NCOUNT = ISIZE
+C
+C Dynamically allocate memory for global reduced gaussian grid
+C
+ CALL JMEMHAN( 18, IRGGRID, (NCOUNT*2), 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECY: memory alloc for reduced grid fail',JPQUIET)
+ INTVECY = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+C Set flag to show field is a wind component
+C
+ NUVFLAG = 1
+C
+C Create the reduced gaussian grid
+C
+ HOLDTYP = HOGAUST
+ WEST = 0.0
+ EAST = 360.0 - (360.0/(NGAUSS*4))
+C
+C U component spectral -> reduced gaussian
+C
+ CALL JAGGGP(PUFIELD,NTRUNC,GLATS(1),GLATS(NGAUSS*2),WEST,
+ X EAST,NGAUSS,'R',KPTS,RGGRID,NUVFLAG,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECY: spectral to reduced gaussian failed',JPQUIET)
+ INTVECY = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ HOGAUST = HOLDTYP
+C
+C V component spectral -> reduced gaussian
+C
+ CALL JAGGGP(PVFIELD,NTRUNC,GLATS(1),GLATS(NGAUSS*2),WEST,
+ X EAST,NGAUSS,'R',KPTS,RGGRID(1+NCOUNT),NUVFLAG,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECY: spectral to reduced gaussian failed',JPQUIET)
+ INTVECY = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ HOGAUST = HOLDTYP
+C
+C Rotate using 12-point horizontal interpolation
+C
+C Dynamically allocate memory for rotated lat/long grid
+C
+ NLON = 1 + NINT((AREA(JPEAST) - AREA(JPWEST)) /
+ X GRID(JPWESTEP)) ! SC
+ NLAT = 1 + NINT((AREA(JPNORTH) - AREA(JPSOUTH)) /
+ X GRID(JPNSSTEP)) ! SC
+C
+ OUTLEN = NLON * NLAT
+C
+ IRET = HIRLAMW(LO12PT,RGGRID,RGGRID(1+NCOUNT),NCOUNT,NGAUSS,AREA,
+ X POLE,GRID,PUOUT,PVOUT,OUTLEN,NLON,NLAT)
+C
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECY: HIRLAMW rotation failed',JPQUIET)
+ INTVECY = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+C
+C Set the components flag for rotated U and V coefficients
+C
+cs ISEC2(19) = 8
+ NOWE = NLON
+ NONS = NLAT
+ OUTLEN = NLAT*NLON
+
+C
+ GOTO 700
+C
+C -----------------------------------------------------------------|
+C* Section 5. Grid to grid point
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C* 5a. Generate interpolated lat/long U and V fields.
+C -----------------------------------------------------------------|
+C
+C
+ IF( (NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT) ) THEN
+C
+C Dynamically allocate scrath space for rotated lat/long grid
+C
+ NLON = 1 + NINT(FLOAT(NOAREA(JPEAST) - NOAREA(JPWEST)) /
+ X NOGRID(JPWESTEP))
+ NLAT = 1 + NINT(FLOAT(NOAREA(JPNORTH) - NOAREA(JPSOUTH)) /
+ X NOGRID(JPNSSTEP))
+C
+ NOWE = NLON
+ NONS = NLAT
+ OUTLEN = NLON * NLAT
+C
+C Rotate reduced gaussian to lat/long
+C
+ IF( (NIREPR.EQ.JPGAUSSIAN).OR.(NIREPR.EQ.JPQUASI) ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'INTVECY: Rotate reduced gaussian to lat/long',JPQUIET)
+ IRET = HIRLAMW(LO12PT,
+ X PUFIELD,PVFIELD,KASIZE,
+ X NIGAUSS,AREA,POLE,GRID,
+ X PUOUT,PVOUT,OUTLEN,NLON,NLAT)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTUVGH: HIRLAMW rotation failed',JPQUIET)
+ INTUVGH = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C Rotate lat/long to lat/long
+C
+ ELSE
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'INTVECY: Rotate lat/long to lat/long',JPQUIET)
+ OLDGRID(1) = REAL(NIGRID(1)) / PPMULT
+ OLDGRID(2) = REAL(NIGRID(2)) / PPMULT
+ IRET = HLL2LLW(LO12PT,PUFIELD,PVFIELD,
+ X OLDGRID,AREA,POLE,GRID,
+ X PUOUT,PVOUT,OUTLEN,NLON,NLAT)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTVECY: HLL2LLW rotation failed',JPQUIET)
+ INTVECY = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+ ELSE
+C
+C* Section 5b. Generate interpolated gaussian U and V fields.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'INTVECY: Rotate gaussian to gaussian',JPQUIET)
+C
+C Dynamically allocate memory for rotated gaussian grids
+C
+ NUMPTS = NOGAUSS * NOGAUSS
+ OUTLEN = 2 * NUMPTS * 8
+C
+cs NGAUSS = ISEC2(10)
+ IRET = HRG2GGW(LO12PT,
+ X PUFIELD,PVFIELD,KASIZE,
+ X NIGAUSS,AREA,POLE,NOGAUSS,HOGAUST,
+ X PUOUT,PVOUT,OUTLEN,NUMPTS)
+ IF( IRET.NE.0 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_ERROR,
+ X 'INTVECY: HRG2GGW rotation failed',JPQUIET)
+ INTUVGH = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+C
+ 700 CONTINUE
+C
+C Reset the input format flag
+C
+cs NIFORM = 1
+C
+C If a 'frame' has been specified, build the frame
+C
+ IF( LFRAME ) THEN
+ LOMISSV = LIMISSV
+ LIMISSV = .TRUE.
+ ISEC1(5) = 192
+ ISEC3(2) = NINT(RMISSGV)
+ ZSEC3(2) = RMISSGV
+ CALL MKFRAME(NLON,NLAT,PUOUT,RMISSGV,NOFRAME)
+ CALL MKFRAME(NLON,NLAT,PVOUT,RMISSGV,NOFRAME)
+ LIMISSV = LOMISSV
+ ENDIF
+
+ DO 910 LOOP = 1, 4
+ NOAAPI(LOOP) = NOAREA(LOOP)
+ 910 CONTINUE
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/intwave.F b/interpolation/intwave.F
new file mode 100755
index 0000000..73ebbd9
--- /dev/null
+++ b/interpolation/intwave.F
@@ -0,0 +1,542 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTWAVE(INGRIB,INLEN,OUTGRIB,OUTLEN)
+C
+C---->
+C**** INTWAVE
+C
+C Purpose
+C -------
+C
+C Interpolate an ECMWF wave field wave field or a reduced
+C latitude-longitude field
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTWAVE(INGRIB,INLEN,OUTGRIB,OUTLEN)
+C
+C Input
+C -----
+C
+C INGRIB - Input field (packed).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C OUTGRIB - Output field (packed).
+C OUTLEN - Output field length (words).
+C
+C
+C Method
+C ------
+C
+C Call interpolation routine; then repack into GRIB format.
+C
+C
+C Externals
+C ---------
+C
+C FIXAREA - Fixup area definition to correspond to grid definitions
+C GRIBEX - Decode/encode GRIB product.
+C JMEMHAN - Handles memory allocation.
+C JDEBUG - Checks environment to switch on/off debug
+C INTLOG - Log error message.
+C WAVEXXX - Interpolate wave fields (except 2D spectra)
+C WV2DXXX - Interpolate wave 2D spectra fields
+C MKFRAME - Create a 'frame' from a rectangular field
+C MKBITMP - Apply a bitmap to a rectangular field
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Sep 1996
+C
+C
+C Modifications
+C -------------
+C
+C J.D.Chambers ECMWF Nov 1966
+C Add interpolation of 2D spectra.
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C J.D.Chambers ECMWF April 2004
+C Handle reduced lat-long fields
+C
+C S.Curic ECMWF April 2005
+C Add support for frame and bitmap
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+ INTEGER INGRIB(*),OUTGRIB(*),INLEN,OUTLEN
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "intf.h"
+#include "grfixed.h"
+#include "jparams.h"
+C
+C Parameters
+ INTEGER JPROUTINE, JP2DSP, JP2DSPQ, JPMAXLT
+
+ PARAMETER (JPROUTINE = 40200 )
+ PARAMETER (JP2DSP = 250 )
+C ^---- parameter number for 2D wave spectra (whole)
+ PARAMETER (JP2DSPQ = 251 )
+C ^---- parameter number for 2D wave spectra (single)
+ PARAMETER (JPMAXLT = 361 )
+C
+C Local variables
+C
+ CHARACTER*1 HFUNC
+
+ REAL ZMISS
+ DATA ZMISS/-9999999.0/
+ INTEGER IWORD, IRET, ISIZE, NSPEC, LAT1, LOOP, IERR
+ INTEGER KNUM, NUM_E_W, NUM_N_S, NFULLNS, NFULLEW
+ REAL GRIDWE, GRIDNS, NORTH, SOUTH, WEST, EAST
+ INTEGER NUMPTS
+ DIMENSION NUMPTS(JPMAXLT)
+#ifdef POINTER_64
+ INTEGER*8 INEWAVE, IDISTNW, IZ2DSP, INEWIDX
+#endif
+ REAL NEWAVE
+ POINTER ( INEWAVE, NEWAVE )
+ DIMENSION NEWAVE( 1 )
+ REAL*4 DISTNEW
+ POINTER ( IDISTNW, DISTNEW )
+ DIMENSION DISTNEW( 1 )
+ REAL Z2DSP
+ POINTER ( IZ2DSP, Z2DSP )
+ DIMENSION Z2DSP( 1 )
+ INTEGER NEWIDX
+ POINTER ( INEWIDX, NEWIDX )
+ DIMENSION NEWIDX( 1 )
+ REAL RNLAT, RSLAT, STEP
+ INTEGER NUMTABL, NUMPROD
+ LOGICAL LCOEFFS, L98WAVE, LFRAME, LBITMP
+ LOGICAL LDEBUG
+C
+C Externals
+ INTEGER WAVEXXX, WV2DXXX, AREACHK, FIXAREA
+ INTEGER NUMPTNS, NUMPTWE, JNORSGG, MKBITMP
+C
+C ------------------------------------------------------------------
+C Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ INTWAVE = 0
+C
+ LCOEFFS = .FALSE.
+C
+C Check if debug option turned on
+ CALL JDEBUG()
+ LDEBUG = NDBG.GT.0
+C
+C Allocate work array ZNFELDI if not already done.
+C
+ IF( IZNJDCI.NE.1952999238 ) THEN
+ CALL JMEMHAN( 19, IZNFLDI, JPEXPAND, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_WARN,'INTWAVE: ZNFELDI allocate fail',JPQUIET)
+ INTWAVE= IRET
+ GOTO 900
+ ENDIF
+ IZNJDCI = 1952999238
+ ENDIF
+C
+C Unpack GRIB message headers (using ZMISS as missing data value).
+C
+ IRET = 1
+ ISEC3(2) = NINT(ZMISS)
+ ZSEC3(2) = ZMISS
+ CALL GRIBEX (ISEC0,ISEC1,ISEC2,ZSEC2,ISEC3,ZSEC3,ISEC4,
+ X ZNFELDI,JPEXPAND,INGRIB,INLEN,IWORD,'J',IRET)
+ IF( (IRET.NE.0).AND.(IRET.NE.811) ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVE: GRIBEX decoding failed.',JPQUIET)
+ INTWAVE = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C Check that the field can be handled
+C
+ NUMTABL = ISEC1(2)*1000 + ISEC1(1)
+ NUMPROD = NUMTABL*1000 + ISEC1(6)
+ L98WAVE = (NUMTABL.EQ.98140).OR.
+ X (NUMPROD.EQ.98131229).OR.
+ X (NUMPROD.EQ.98131232).OR.
+ X (NIREPR.EQ.26)
+ IF( .NOT.L98WAVE ) THEN
+ CALL INTLOG(JP_WARN,'INTWAVE: Not an ECMWF wave field',JPQUIET)
+ INTWAVE = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ IF( ISEC2(1).NE.0 ) THEN
+ CALL INTLOG(JP_WARN,
+ X 'INTWAVE: Not a lat/long field',JPQUIET)
+ INTWAVE = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ IF( (ISEC2(6).NE.128) .OR. (ISEC2(10).LT.10) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTWAVE: Cannot handle longitude increment',ISEC2(10))
+ INTWAVE = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 2. Sort out interpolation area.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ NSPEC = 1
+ KNUM = ISEC2(3)
+C
+C Adjust (sub-)area limits to suit the grid
+C
+ IRET = FIXAREA()
+ IF ( IRET .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR, 'INTWAVE: FIXAREA failed.',JPQUIET)
+ INTWAVE = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+ NORTH = FLOAT(NOAREA(1))/PPMULT
+ WEST = FLOAT(NOAREA(2))/PPMULT
+ SOUTH = FLOAT(NOAREA(3))/PPMULT
+ EAST = FLOAT(NOAREA(4))/PPMULT
+C
+C Calculate the number of points E-W and N-S in new grid area
+C
+ IF( (NOREPR.EQ.JPQUASI) .OR. (NOREPR.EQ.JPGAUSSIAN)) THEN
+ GRIDWE = NOGAUSS
+ GRIDNS = 0
+ ELSE IF( NOREPR.EQ.JPREDLL ) THEN
+ GRIDWE = 360.0/NOLPTS((NOREDLL/2)+1)
+ GRIDNS = FLOAT(NOGRID(2))/PPMULT
+ ELSE
+ GRIDWE = FLOAT(NOGRID(1))/PPMULT
+ GRIDNS = FLOAT(NOGRID(2))/PPMULT
+ ENDIF
+C
+ IRET = AREACHK(GRIDWE,GRIDNS,NORTH,WEST,SOUTH,EAST)
+ IF( IRET.NE.0 ) THEN
+ INTWAVE = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+ NOAREA(1) = NINT(NORTH*PPMULT)
+ NOAREA(2) = NINT(WEST*PPMULT)
+ NOAREA(3) = NINT(SOUTH*PPMULT)
+ NOAREA(4) = NINT(EAST*PPMULT)
+C
+ IF( (NOREPR.EQ.JPQUASI) .OR. (NOREPR.EQ.JPGAUSSIAN)) THEN
+ GRIDWE = 360.0/NOLPTS(NOGAUSS)
+ NUM_E_W = NUMPTWE(WEST,EAST,GRIDWE)
+ NFULLEW = NUMPTWE(0.0,360.0,GRIDWE) - 1
+ NUM_N_S = JNORSGG(SOUTH,ROGAUSS,NOGAUSS,1) -
+ X JNORSGG(NORTH,ROGAUSS,NOGAUSS,0) + 1
+ NFULLNS = NOGAUSS*2
+ ELSE IF( NOREPR.EQ.JPREDLL ) THEN
+ NUM_E_W = NUMPTWE(WEST,EAST,GRIDWE)
+ NFULLEW = NUMPTWE(0.0,360.0,GRIDWE) - 1
+ NUM_N_S = NUMPTNS(NORTH,SOUTH,GRIDNS)
+ NFULLNS = NOREDLL
+ ELSE
+ NUM_E_W = NUMPTWE(WEST,EAST,GRIDWE)
+ NFULLEW = NUMPTWE(0.0,360.0,GRIDWE) - 1
+ NUM_N_S = NUMPTNS(NORTH,SOUTH,GRIDNS)
+ NFULLNS = NUM_N_S
+ ENDIF
+C
+C
+C ------------------------------------------------------------------
+C Section 3. Interpolate wave fields other than 2D spectra.
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C Handle if not 2D spectra ..
+C
+ IF( (ISEC1(6).NE.JP2DSP).AND.(ISEC1(6).NE.JP2DSPQ) ) THEN
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTWAVE: Interpolate wave fields other than 2D spectra',JPQUIET)
+ ENDIF
+C
+C Get some scratch space for the interpolated field.
+C
+ ISIZE = NFULLEW * NUM_N_S
+ CALL JMEMHAN( 3, INEWAVE, ISIZE, 1, IRET)
+ IF ( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVE: Get work space fail.',JPQUIET)
+ INTWAVE = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+C
+ ISIZE = NFULLEW * NFULLNS * 4
+ CALL JMEMHAN( 4, INEWIDX, ISIZE, 1, IRET)
+ IF ( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVE: Get work space fail.',JPQUIET)
+ INTWAVE = JPROUTINE + 8
+ GOTO 900
+ ENDIF
+C
+ ISIZE = NFULLEW * NFULLNS * 10
+ CALL JMEMHAN( 5, IDISTNW, ISIZE, 1, IRET)
+ IF ( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVE: Get work space fail.',JPQUIET)
+ INTWAVE = JPROUTINE + 9
+ GOTO 900
+ ENDIF
+
+C Interpolate the field
+C
+ IRET = WAVEXXX(ISEC2,ISEC4,NUM_N_S,GRIDNS,GRIDWE,INGRIB,NEWIDX,
+ X DISTNEW,NEWAVE,NORTH,WEST,ZMISS)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVE: Interpolation failed.',JPQUIET)
+ INTWAVE = JPROUTINE + 10
+ GOTO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 4. Interpolate wave 2D spectra field.
+C ------------------------------------------------------------------
+C
+ ELSE
+C
+ 400 CONTINUE
+
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTWAVE: Interpolate wave 2D spectra field',JPQUIET)
+ ENDIF
+C
+C Find number of 2D spectra values at each point
+C
+ IF( ISEC4(8).NE.0 ) LCOEFFS = .TRUE.
+ IF( (ISEC4(8).NE.0).AND.(ISEC1(6).NE.JP2DSPQ) ) THEN
+ NSPEC = ISEC4(50) * ISEC4(51)
+ ELSE
+ NSPEC = 1
+ ENDIF
+C
+C Get some scratch space for the interpolated field.
+C
+ ISIZE = NSPEC * NFULLEW * NUM_N_S
+ CALL JMEMHAN( 3, INEWAVE, ISIZE, 1, IRET)
+ IF ( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVE: Get work space fail.',JPQUIET)
+ INTWAVE = JPROUTINE + 11
+ GOTO 900
+ ENDIF
+C
+ ISIZE = NFULLEW * NFULLNS
+ CALL JMEMHAN( 4, INEWIDX, ISIZE, 1, IRET)
+ IF ( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVE: Get work space fail.',JPQUIET)
+ INTWAVE = JPROUTINE + 12
+ GOTO 900
+ ENDIF
+C
+C Interpolate the field
+C
+ IRET = WV2DXXX(ISEC2,ISEC4,NUM_N_S,GRIDNS,GRIDWE,
+ X INGRIB,NEWIDX,NEWAVE,NORTH,WEST,ZMISS)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVE: Interpolation failed.',JPQUIET)
+ INTWAVE = JPROUTINE + 13
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 5. Pack the interpolated field into GRIB.
+C ------------------------------------------------------------------
+C
+ 500 CONTINUE
+
+C If a 'bitmap' has been specified, build the bitmap
+C
+ LBITMP = LNOBITMP.AND.
+ X ((NOREPR.EQ.JPREGROT).OR.(NOREPR.EQ.JPREGULAR).OR.
+ X (NOREPR.EQ.JPGAUSSIAN))
+
+ IF( LBITMP ) THEN
+ CALL INTLOG(JP_DEBUG,'INTWAVE: MKBITMP is enabled',JPQUIET)
+ IERR = MKBITMP(NUM_E_W,NUM_N_S,NEWAVE,ZMISS)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFB: Problem applying bitmap',JPQUIET)
+ GOTO 900
+ ENDIF
+ ENDIF
+C If a 'frame' has been specified, build the frame
+C
+ LFRAME = LNOFRAME.AND.
+ X ((NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPGAUSSIAN).OR.
+ X (NOREPR.EQ.JPREGROT ).OR.(NOREPR.EQ.JPFGGROT ) )
+
+ CALL INTLOG(JP_DEBUG,'INTWAVE: NUM_E_W ',NUM_E_W)
+ CALL INTLOG(JP_DEBUG,'INTWAVE: NUM_N_S ',NUM_N_S)
+ IF( LFRAME ) THEN
+ CALL INTLOG(JP_DEBUG,'INTWAVE: MKFRAME is enabled',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'INTWAVE: NOFRAME ',NOFRAME)
+ CALL MKFRAME(NUM_E_W,NUM_N_S,NEWAVE,ZMISS,NOFRAME)
+ ENDIF
+C
+C GRIB sections 2 and 3 (bitmap) included
+C
+ ISEC1(5) = 192
+C
+ IF( (NOREPR.EQ.JPQUASI) .OR. (NOREPR.EQ.JPREDLL) ) THEN
+C
+C Reduced gaussian or reduced lat/long with (possible) subarea
+C
+ IF( NOREPR.EQ.JPQUASI ) THEN
+ ISEC2(1) = JPGAUSSIAN
+ ISEC2(10)= NOGAUSS
+ ELSE
+ ISEC2(1) = JPREGULAR
+ ISEC2(10)= NINT(GRIDNS*1000.0)
+ ENDIF
+ ISEC2(2) = 255
+ ISEC2(3) = NUM_N_S
+ ISEC2(5) = NINT(WEST*1000.0)
+ ISEC2(6) = 0
+ ISEC2(8) = NINT(EAST*1000.0)
+ ISEC2(17)= 1
+ ISEC4(1) = 0
+C
+ LAT1 = 0
+ 510 CONTINUE
+ LAT1 = LAT1 + 1
+ IF( NOREPR.EQ.JPQUASI ) THEN
+ RNLAT = ROGAUSS(LAT1)
+ RSLAT = ROGAUSS(LAT1+NUM_N_S-1)
+ ELSE
+ RNLAT = 90.0 - (LAT1-1)*GRIDNS
+ RSLAT = 90.0 - (LAT1+NUM_N_S-2)*GRIDNS
+ ENDIF
+ IF( RNLAT.GT.NORTH ) GOTO 510
+C
+ ISEC2(4) = NINT(RNLAT*1000.0)
+ ISEC2(7) = NINT(RSLAT*1000.0)
+C
+ DO LOOP = LAT1, (NUM_N_S+LAT1-1)
+ ISEC2(23+LOOP-LAT1) = NOLPTS(LOOP)
+ ISEC4(1) = ISEC4(1) + ISEC2(23+LOOP-LAT1)
+ ENDDO
+C
+ ELSE
+C
+C Regular gaussian or lat/long with (possible) subarea
+C
+ IF( NOREPR.EQ.JPGAUSSIAN ) THEN
+ ISEC2(1) = JPGAUSSIAN
+ ELSE
+ ISEC2(1) = JPREGULAR
+ ENDIF
+ ISEC2(2) = NUM_E_W
+ ISEC2(3) = NUM_N_S
+ ISEC2(4) = NINT(NORTH*1000.0)
+ ISEC2(5) = NINT(WEST*1000.0)
+ ISEC2(6) = 128
+ ISEC2(7) = NINT(SOUTH*1000.0)
+ ISEC2(8) = NINT(EAST*1000.0)
+ ISEC2(9) = NINT(GRIDWE*1000.0)
+ IF( NOREPR.EQ.JPGAUSSIAN ) THEN
+ ISEC2(10) = NOGAUSS
+ ELSE
+ ISEC2(10) = NINT(GRIDNS*1000.0)
+ ENDIF
+ ISEC2(17)= 0
+ ISEC4(1) = NUM_E_W * NUM_N_S
+ ENDIF
+C
+C Use -9999999 as missing data value.
+C
+ ISEC3(2) = NINT(ZMISS)
+ ZSEC3(2) = ZMISS
+C
+ ISEC4(1) = ISEC4(1) * NSPEC
+ ISEC4(2) = NOACC
+ IF( LCOEFFS ) ISEC4(6) = 16
+C `-----> wave fields have additional flags for
+C NC1 and NC2 coefficients (floats stored
+C in integer array isec4)
+ IRET = 1
+C
+C If grid-point output, setup for 2nd order packing if requested.
+C
+ IF( (NOREPR.NE.JPSPHERE) .AND. (NOREPR.NE.JPSPHROT) ) THEN
+ HFUNC = 'C'
+ IF( NOHFUNC.EQ.'K' ) THEN
+ HFUNC = 'K'
+ ISEC4(4) = 64
+ ISEC4(6) = 16
+ ISEC4(9) = 32
+ ISEC4(10) = 16
+ ISEC4(12) = 8
+ ISEC4(13) = 4
+ ISEC4(14) = 0
+ ISEC4(15) = -1
+ ELSE
+ ISEC4(4) = 0
+ ENDIF
+ ELSE
+ HFUNC = 'C'
+ IF( NOHFUNC.EQ.'C' ) THEN
+ ISEC2(6) = 2
+ ISEC4(4) = 64
+ ELSE IF( NOHFUNC.EQ.'S' ) THEN
+ ISEC2(6) = 1
+ ISEC4(4) = 0
+ ENDIF
+
+ ENDIF
+
+C
+ CALL GRIBEX (ISEC0,ISEC1,ISEC2,ZSEC2,ISEC3,ZSEC3,ISEC4,
+ X NEWAVE,ISEC4(1),OUTGRIB,OUTLEN,IWORD,HFUNC,IRET)
+C
+ IF ( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVE: GRIBEX encoding failed.',IRET)
+ INTWAVE = JPROUTINE + 14
+ GOTO 900
+ ENDIF
+ OUTLEN = IWORD
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+C Clear change flags for next product processing
+C
+ LCHANGE = .FALSE.
+ LSMCHNG = .FALSE.
+C
+ RETURN
+ END
diff --git a/interpolation/intwave2.F b/interpolation/intwave2.F
new file mode 100755
index 0000000..167c864
--- /dev/null
+++ b/interpolation/intwave2.F
@@ -0,0 +1,567 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTWAVE2(INGRIB,INLEN,OUTGRIB,OUTLEN)
+C
+C---->
+C**** INTWAVE2
+C
+C Purpose
+C -------
+C
+C Interpolate an ECMWF wave field wave field or a reduced
+C latitude-longitude field
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTWAVE2(INGRIB,INLEN,OUTGRIB,OUTLEN)
+C
+C Input
+C -----
+C
+C INGRIB - Input field (packed).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C OUTGRIB - Output field (packed).
+C OUTLEN - Output field length (words).
+C
+C
+C Method
+C ------
+C
+C Call interpolation routine; then repack into GRIB format.
+C
+C
+C Externals
+C ---------
+C
+C FIXAREA - Fixup area definition to correspond to grid definitions
+C GRIBEX - Decode/encode GRIB product.
+C JMEMHAN - Handles memory allocation.
+C JDEBUG - Checks environment to switch on/off debug
+C INTLOG - Log error message.
+C WAVEXX1 - Interpolate wave fields (except 2D spectra)
+C WV2DXXX - Interpolate wave 2D spectra fields
+C MKFRAME - Create a 'frame' from a rectangular field
+C MKBITMP - Apply a bitmap to a rectangular field
+C
+C
+C Author
+C ------
+C
+C S.Curic ECMWF Jun 2009
+C
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+ INTEGER INGRIB(*),OUTGRIB(*),INLEN,OUTLEN
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "intf.h"
+#include "grfixed.h"
+#include "jparams.h"
+C
+C Parameters
+ INTEGER JPROUTINE, JP2DSP, JP2DSPQ, JPMAXLT
+
+ PARAMETER (JPROUTINE = 40200 )
+ PARAMETER (JP2DSP = 250 )
+C ^---- parameter number for 2D wave spectra (whole)
+ PARAMETER (JP2DSPQ = 251 )
+C ^---- parameter number for 2D wave spectra (single)
+ PARAMETER (JPMAXLT = 1801 )
+C
+C Local variables
+C
+ CHARACTER*1 HFUNC
+
+ REAL ZMISS
+ DATA ZMISS/-9999999.0/
+ INTEGER IWORD, IRET, ISIZE, NSPEC, LAT1, LOOP, IERR
+ INTEGER KNUM, NUM_E_W, NUM_N_S, NFULLNS, NFULLEW
+ REAL GRIDWE, GRIDNS, NORTH, SOUTH, WEST, EAST
+ INTEGER NUMPTS
+ DIMENSION NUMPTS(JPMAXLT)
+#ifdef POINTER_64
+ INTEGER*8 INEWAVE, IDISTNW, IZ2DSP, INEWIDX
+#endif
+ REAL NEWAVE
+ POINTER ( INEWAVE, NEWAVE )
+ DIMENSION NEWAVE( 1 )
+ REAL*4 DISTNEW
+ POINTER ( IDISTNW, DISTNEW )
+ DIMENSION DISTNEW( 1 )
+ REAL Z2DSP
+ POINTER ( IZ2DSP, Z2DSP )
+ DIMENSION Z2DSP( 1 )
+ INTEGER NEWIDX
+ POINTER ( INEWIDX, NEWIDX )
+ DIMENSION NEWIDX( 1 )
+ REAL RNLAT, RSLAT, STEP
+ INTEGER NUMTABL, NUMPROD
+ LOGICAL LCOEFFS, L98WAVE, LFRAME, LBITMP
+ LOGICAL LDEBUG
+ INTEGER NPARAM
+ INTEGER MISSLAT, KOLDNUM
+C
+C Externals
+ INTEGER WAVEXX2, WV2DXX2, AREACHK, FIXAREA
+ INTEGER NUMPTNS, NUMPTWE, JNORSGG, MKBITMP
+C
+C ------------------------------------------------------------------
+C Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ INTWAVE2 = 0
+C
+ LCOEFFS = .FALSE.
+C
+C Check if debug option turned on
+ CALL JDEBUG()
+ LDEBUG = NDBG.GT.0
+C
+C Allocate work array ZNFELDI if not already done.
+C
+ IF( IZNJDCI.NE.1952999238 ) THEN
+ CALL JMEMHAN( 19, IZNFLDI, JPEXPAND, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_WARN,'INTWAVE2: ZNFELDI allocate fail',JPQUIET)
+ INTWAVE2= IRET
+ GOTO 900
+ ENDIF
+ IZNJDCI = 1952999238
+ ENDIF
+C
+C Unpack GRIB message headers (using ZMISS as missing data value).
+C
+cs IWORD = INLEN
+ IRET = 1
+ ISEC3(2) = NINT(ZMISS)
+ ZSEC3(2) = ZMISS
+ CALL GRIBEX (ISEC0,ISEC1,ISEC2,ZSEC2,ISEC3,ZSEC3,ISEC4,
+ X ZNFELDI,JPEXPAND,INGRIB,INLEN,IWORD,'D',IRET)
+
+ IF(IRET.GT.0) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVE2: GRIBEX decoding failed.',JPQUIET)
+ INTWAVE2 = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+
+ NPARAM = ISEC1(6)
+C
+C Check that the field can be handled
+C
+ NUMTABL = ISEC1(2)*1000 + ISEC1(1)
+ NUMPROD = NUMTABL*1000 + ISEC1(6)
+ L98WAVE = (NUMTABL.EQ.98140).OR.
+ X (NUMPROD.EQ.98131229).OR.
+ X (NUMPROD.EQ.98131232).OR.
+ X (NIREPR.EQ.26)
+ IF( .NOT.L98WAVE ) THEN
+ CALL INTLOG(JP_WARN,'INTWAVE2: Not an ECMWF wave field',JPQUIET)
+ INTWAVE2 = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ IF( ISEC2(1).NE.0 ) THEN
+ CALL INTLOG(JP_WARN,
+ X 'INTWAVE2: Not a lat/long field',JPQUIET)
+ INTWAVE2 = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ IF( (ISEC2(6).NE.128) .OR. (ISEC2(10).LT.10) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'INTWAVE2: Cannot handle longitude increment',ISEC2(10))
+ INTWAVE2 = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 2. Sort out interpolation area.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ NSPEC = 1
+ KNUM = ISEC2(3)
+C
+C Adjust (sub-)area limits to suit the grid
+C
+ IRET = FIXAREA()
+ IF ( IRET .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR, 'INTWAVE2: FIXAREA failed.',JPQUIET)
+ INTWAVE2 = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+ NORTH = FLOAT(NOAREA(1))/PPMULT
+ WEST = FLOAT(NOAREA(2))/PPMULT
+ SOUTH = FLOAT(NOAREA(3))/PPMULT
+ EAST = FLOAT(NOAREA(4))/PPMULT
+C
+C Calculate the number of points E-W and N-S in new grid area
+C
+ IF( (NOREPR.EQ.JPQUASI) .OR. (NOREPR.EQ.JPGAUSSIAN)) THEN
+ GRIDWE = NOGAUSS
+ GRIDNS = 0
+ ELSE IF( NOREPR.EQ.JPREDLL ) THEN
+ GRIDWE = 360.0/NOLPTS((NOREDLL/2)+1)
+ GRIDNS = FLOAT(NOGRID(2))/PPMULT
+ ELSE
+ GRIDWE = FLOAT(NOGRID(1))/PPMULT
+ GRIDNS = FLOAT(NOGRID(2))/PPMULT
+ ENDIF
+C
+ IRET = AREACHK(GRIDWE,GRIDNS,NORTH,WEST,SOUTH,EAST)
+ IF( IRET.NE.0 ) THEN
+ INTWAVE2 = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+ NOAREA(1) = NINT(NORTH*PPMULT)
+ NOAREA(2) = NINT(WEST*PPMULT)
+ NOAREA(3) = NINT(SOUTH*PPMULT)
+ NOAREA(4) = NINT(EAST*PPMULT)
+C
+ IF( (NOREPR.EQ.JPQUASI) .OR. (NOREPR.EQ.JPGAUSSIAN)) THEN
+ GRIDWE = 360.0/NOLPTS(NOGAUSS)
+ NUM_E_W = NUMPTWE(WEST,EAST,GRIDWE)
+ NFULLEW = NUMPTWE(0.0,360.0,GRIDWE) - 1
+ NUM_N_S = JNORSGG(SOUTH,ROGAUSS,NOGAUSS,1) -
+ X JNORSGG(NORTH,ROGAUSS,NOGAUSS,0) + 1
+ NFULLNS = NOGAUSS*2
+ ELSE IF( NOREPR.EQ.JPREDLL ) THEN
+ NUM_E_W = NUMPTWE(WEST,EAST,GRIDWE)
+ NFULLEW = NUMPTWE(0.0,360.0,GRIDWE) - 1
+ NUM_N_S = NUMPTNS(NORTH,SOUTH,GRIDNS)
+ NFULLNS = NOREDLL
+ ELSE
+ NUM_E_W = NUMPTWE(WEST,EAST,GRIDWE)
+ NFULLEW = NUMPTWE(0.0,360.0,GRIDWE) - 1
+ NUM_N_S = NUMPTNS(NORTH,SOUTH,GRIDNS)
+ NFULLNS = NUM_N_S
+ ENDIF
+C
+C
+C--------------------------------------------------------------------
+ KNUM = NINS
+cs KNUM = ISEC2(3)
+ IF( ISEC2(17).EQ.1 ) THEN
+C
+C Input field is a reduced latitude/longitude grid
+C
+C .. but it may be 'pseudo-gaussian' in layout
+C (ie global, symmetric about the equator but no latitude
+C at the equator)
+C
+ IF( (ISEC2(4).NE.90000).AND.(MOD(ISEC2(3),2).EQ.0) ) THEN
+C
+ DO LOOP = 1, ISEC2(3)
+ NUMPTS(LOOP) = ISEC2(22+LOOP)
+ ENDDO
+C
+ ELSE
+C
+ MISSLAT = (90000 - ISEC2(4))/ISEC2(10)
+ DO LOOP = 1, MISSLAT
+ NUMPTS(LOOP) = 0
+ ENDDO
+ KOLDNUM = 1 + (90000 - ISEC2(7))/ISEC2(10)
+ DO LOOP = 1, (KOLDNUM-MISSLAT)
+ NUMPTS(LOOP+MISSLAT) = ISEC2(22+LOOP)
+ ENDDO
+ DO LOOP = (KOLDNUM+1), KNUM
+ NUMPTS(LOOP) = 0
+ ENDDO
+ ENDIF
+ ENDIF
+C--------------------------------------------------------------------
+C ------------------------------------------------------------------
+C Section 3. Interpolate wave fields other than 2D spectra.
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C Handle if not 2D spectra ..
+C
+ IF( (ISEC1(6).NE.JP2DSP).AND.(ISEC1(6).NE.JP2DSPQ) ) THEN
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTWAVE2: Interpolate wave flds other than 2D spectra',JPQUIET)
+ ENDIF
+C
+C Get some scratch space for the interpolated field.
+C
+ ISIZE = NFULLEW * NUM_N_S
+ CALL JMEMHAN( 3, INEWAVE, ISIZE, 1, IRET)
+ IF ( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVE2: Get work space fail.',JPQUIET)
+ INTWAVE2 = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+C
+ ISIZE = NFULLEW * NFULLNS * 4
+ CALL JMEMHAN( 4, INEWIDX, ISIZE, 1, IRET)
+ IF ( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVE2: Get work space fail.',JPQUIET)
+ INTWAVE2 = JPROUTINE + 8
+ GOTO 900
+ ENDIF
+C
+ ISIZE = NFULLEW * NFULLNS * 10
+ CALL JMEMHAN( 5, IDISTNW, ISIZE, 1, IRET)
+ IF ( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVE2: Get work space fail.',JPQUIET)
+ INTWAVE2 = JPROUTINE + 9
+ GOTO 900
+ ENDIF
+
+C Interpolate the field
+C
+ IRET = WAVEXX2(NPARAM,KNUM,NUMPTS,NUM_N_S,GRIDNS,GRIDWE,ZNFELDI,
+ X NEWAVE,NORTH,WEST,ZMISS)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVE2: Interpolation failed.',JPQUIET)
+ INTWAVE2 = JPROUTINE + 10
+ GOTO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 4. Interpolate wave 2D spectra field.
+C ------------------------------------------------------------------
+C
+ ELSE
+C
+ 400 CONTINUE
+
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTWAVE2: Interpolate wave 2D spectra field',JPQUIET)
+ ENDIF
+C
+C Find number of 2D spectra values at each point
+C
+ IF( ISEC4(8).NE.0 ) LCOEFFS = .TRUE.
+ IF( (ISEC4(8).NE.0).AND.(ISEC1(6).NE.JP2DSPQ) ) THEN
+ NSPEC = ISEC4(50) * ISEC4(51)
+ NIMATR = 1
+ ELSE
+ NSPEC = 1
+ NIMATR = 0
+ ENDIF
+C
+C Get some scratch space for the interpolated field.
+C
+ ISIZE = NSPEC * NFULLEW * NUM_N_S
+ CALL JMEMHAN( 3, INEWAVE, ISIZE, 1, IRET)
+ IF ( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVE2: Get work space fail.',JPQUIET)
+ INTWAVE2 = JPROUTINE + 11
+ GOTO 900
+ ENDIF
+C
+ ISIZE = NFULLEW * NFULLNS
+ CALL JMEMHAN( 4, INEWIDX, ISIZE, 1, IRET)
+ IF ( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVE2: Get work space fail.',JPQUIET)
+ INTWAVE2 = JPROUTINE + 12
+ GOTO 900
+ ENDIF
+C
+C Interpolate the field
+C
+ IRET = WV2DXX2(NIMATR,KNUM,NUMPTS,NUM_N_S,GRIDNS,GRIDWE,ZNFELDI,
+ X NEWAVE,NORTH,WEST,ZMISS)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVE2: Interpolation failed.',JPQUIET)
+ INTWAVE2 = JPROUTINE + 13
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 5. Pack the interpolated field into GRIB.
+C ------------------------------------------------------------------
+C
+ 500 CONTINUE
+
+C If a 'bitmap' has been specified, build the bitmap
+C
+ LBITMP = LNOBITMP.AND.
+ X ((NOREPR.EQ.JPREGROT).OR.(NOREPR.EQ.JPREGULAR).OR.
+ X (NOREPR.EQ.JPGAUSSIAN))
+
+ IF( LBITMP ) THEN
+ CALL INTLOG(JP_DEBUG,'INTWAVE2: MKBITMP is enabled',JPQUIET)
+ IERR = MKBITMP(NUM_E_W,NUM_N_S,NEWAVE,ZMISS)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTFB: Problem applying bitmap',JPQUIET)
+ GOTO 900
+ ENDIF
+ ENDIF
+C If a 'frame' has been specified, build the frame
+C
+ LFRAME = LNOFRAME.AND.
+ X ((NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPGAUSSIAN).OR.
+ X (NOREPR.EQ.JPREGROT ).OR.(NOREPR.EQ.JPFGGROT ) )
+
+ CALL INTLOG(JP_DEBUG,'INTWAVE2: NUM_E_W ',NUM_E_W)
+ CALL INTLOG(JP_DEBUG,'INTWAVE2: NUM_N_S ',NUM_N_S)
+ IF( LFRAME ) THEN
+ CALL INTLOG(JP_DEBUG,'INTWAVE2: MKFRAME is enabled',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'INTWAVE2: NOFRAME ',NOFRAME)
+ CALL MKFRAME(NUM_E_W,NUM_N_S,NEWAVE,ZMISS,NOFRAME)
+ ENDIF
+C
+C GRIB sections 2 and 3 (bitmap) included
+C
+ ISEC1(5) = 192
+C
+ IF( (NOREPR.EQ.JPQUASI) .OR. (NOREPR.EQ.JPREDLL) ) THEN
+C
+C Reduced gaussian or reduced lat/long with (possible) subarea
+C
+ IF( NOREPR.EQ.JPQUASI ) THEN
+ ISEC2(1) = JPGAUSSIAN
+ ISEC2(10)= NOGAUSS
+ ELSE
+ ISEC2(1) = JPREGULAR
+ ISEC2(10)= NINT(GRIDNS*1000.0)
+ ENDIF
+ ISEC2(2) = 255
+ ISEC2(3) = NUM_N_S
+ ISEC2(5) = NINT(WEST*1000.0)
+ ISEC2(6) = 0
+ ISEC2(8) = NINT(EAST*1000.0)
+ ISEC2(17)= 1
+ ISEC4(1) = 0
+C
+ LAT1 = 0
+ 510 CONTINUE
+ LAT1 = LAT1 + 1
+ IF( NOREPR.EQ.JPQUASI ) THEN
+ RNLAT = ROGAUSS(LAT1)
+ RSLAT = ROGAUSS(LAT1+NUM_N_S-1)
+ ELSE
+ RNLAT = 90.0 - (LAT1-1)*GRIDNS
+ RSLAT = 90.0 - (LAT1+NUM_N_S-2)*GRIDNS
+ ENDIF
+ IF( RNLAT.GT.NORTH ) GOTO 510
+C
+ ISEC2(4) = NINT(RNLAT*1000.0)
+ ISEC2(7) = NINT(RSLAT*1000.0)
+C
+ DO LOOP = LAT1, (NUM_N_S+LAT1-1)
+ ISEC2(23+LOOP-LAT1) = NOLPTS(LOOP)
+ ISEC4(1) = ISEC4(1) + ISEC2(23+LOOP-LAT1)
+ ENDDO
+C
+ ELSE
+C
+C Regular gaussian or lat/long with (possible) subarea
+C
+ IF( NOREPR.EQ.JPGAUSSIAN ) THEN
+ ISEC2(1) = JPGAUSSIAN
+ ELSE
+ ISEC2(1) = JPREGULAR
+ ENDIF
+ ISEC2(2) = NUM_E_W
+ ISEC2(3) = NUM_N_S
+ ISEC2(4) = NINT(NORTH*1000.0)
+ ISEC2(5) = NINT(WEST*1000.0)
+ ISEC2(6) = 128
+ ISEC2(7) = NINT(SOUTH*1000.0)
+ ISEC2(8) = NINT(EAST*1000.0)
+ ISEC2(9) = NINT(GRIDWE*1000.0)
+ IF( NOREPR.EQ.JPGAUSSIAN ) THEN
+ ISEC2(10) = NOGAUSS
+ ELSE
+ ISEC2(10) = NINT(GRIDNS*1000.0)
+ ENDIF
+ ISEC2(17)= 0
+ ISEC4(1) = NUM_E_W * NUM_N_S
+ ENDIF
+C
+C
+ ISEC3(2) = NINT(ZMISS)
+ ZSEC3(2) = ZMISS
+C
+ ISEC4(1) = ISEC4(1) * NSPEC
+ ISEC4(2) = NOACC
+ IF( LCOEFFS ) ISEC4(6) = 16
+C `-----> wave fields have additional flags for
+C NC1 and NC2 coefficients (floats stored
+C in integer array isec4)
+ IRET = 1
+C
+C If grid-point output, setup for 2nd order packing if requested.
+C
+ IF( (NOREPR.NE.JPSPHERE) .AND. (NOREPR.NE.JPSPHROT) ) THEN
+ HFUNC = 'C'
+ IF( NOHFUNC.EQ.'K' ) THEN
+ HFUNC = 'K'
+ ISEC4(4) = 64
+ ISEC4(6) = 16
+ ISEC4(9) = 32
+ ISEC4(10) = 16
+ ISEC4(12) = 8
+ ISEC4(13) = 4
+ ISEC4(14) = 0
+ ISEC4(15) = -1
+ ELSE
+ ISEC4(4) = 0
+ ENDIF
+ ELSE
+ HFUNC = 'C'
+ IF( NOHFUNC.EQ.'C' ) THEN
+ ISEC2(6) = 2
+ ISEC4(4) = 64
+ ELSE IF( NOHFUNC.EQ.'S' ) THEN
+ ISEC2(6) = 1
+ ISEC4(4) = 0
+ ENDIF
+
+ ENDIF
+
+C
+ CALL GRIBEX (ISEC0,ISEC1,ISEC2,ZSEC2,ISEC3,ZSEC3,ISEC4,
+ X NEWAVE,ISEC4(1),OUTGRIB,OUTLEN,IWORD,HFUNC,IRET)
+C
+ IF ( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVE2: GRIBEX encoding failed.',IRET)
+ INTWAVE2 = JPROUTINE + 14
+ GOTO 900
+ ENDIF
+ OUTLEN = IWORD
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+C Clear change flags for next product processing
+C
+ LCHANGE = .FALSE.
+ LSMCHNG = .FALSE.
+C
+ RETURN
+ END
diff --git a/interpolation/intwavu.F b/interpolation/intwavu.F
new file mode 100755
index 0000000..9131503
--- /dev/null
+++ b/interpolation/intwavu.F
@@ -0,0 +1,365 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION INTWAVU(INFLD,INLEN,OUTFLD,OUTLEN)
+C
+C---->
+C**** INTWAVU
+C
+C Purpose
+C -------
+C
+C Interpolate an ECMWF wave field wave field or a reduced
+C latitude-longitude field
+C
+C
+C Interface
+C ---------
+C
+C IRET = INTWAVU(INFLD,INLEN,OUTFLD,OUTLEN)
+C
+C Input
+C -----
+C
+C INFLD - Input field (packed).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C OUTFLD - Output field (packed).
+C OUTLEN - Output field length (words).
+C
+C
+C Method
+C ------
+C
+C Call interpolation routine; then repack into GRIB format.
+C
+C
+C Externals
+C ---------
+C
+C FIXAREA - Fixup area definition to correspond to grid definitions
+C JMEMHAN - Handles memory allocation.
+C JDEBUG - Checks environment to switch on/off debug
+C INTLOG - Log error message.
+C WAVEXX2 - Interpolate wave fields (except 2D spectra)
+C WV2DXX2 - Interpolate wave 2D spectra fields
+C MKFRAME - Create a 'frame' from a rectangular field
+C MKBITMP - Apply a bitmap to a rectangular field
+C
+C
+C Author
+C ------
+C
+C S.Curic ECMWF Mar 2009
+C
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+ INTEGER INLEN,OUTLEN
+ REAL INFLD, OUTFLD
+ DIMENSION INFLD(*),OUTFLD(*)
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "intf.h"
+#include "grfixed.h"
+#include "jparams.h"
+C
+C Parameters
+ INTEGER JPROUTINE, JP2DSP, JP2DSPQ, JPMAXLT
+
+ PARAMETER (JPROUTINE = 40200 )
+ PARAMETER (JP2DSP = 250 )
+C ^---- parameter number for 2D wave spectra (whole)
+ PARAMETER (JP2DSPQ = 251 )
+C ^---- parameter number for 2D wave spectra (single)
+ PARAMETER (JPMAXLT = 1801 )
+C
+C Local variables
+C
+ CHARACTER*1 HFUNC
+
+ REAL ZMISS
+cs DATA ZMISS/-9999999.0/
+ REAL RLATINC, ONORTH, OSOUTH
+ INTEGER IWORD, IRET, ISIZE, NSPEC, LAT1, LOOP, IERR
+ INTEGER KNUM, NUM_E_W, NUM_N_S, NFULLNS, NFULLEW
+ REAL GRIDWE, GRIDNS, NORTH, SOUTH, WEST, EAST
+ REAL INORTH, ISOUTH, IWEST, IEAST, RNS
+ INTEGER NUMPTS,MISSLAT,KOLDNUM
+ DIMENSION NUMPTS(JPMAXLT)
+ INTEGER NUMTABL, NUMPROD
+ INTEGER KNEWNUM
+ LOGICAL LCOEFFS, L98WAVE, LFRAME, LBITMP
+ LOGICAL LDEBUG
+C
+C Externals
+ INTEGER AREACHK, FIXAREA, WAVEXX2, WV2DXX2
+ INTEGER NUMPTNS, NUMPTWE, JNORSGG, MKBITMP
+C
+C ------------------------------------------------------------------
+C Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ INTWAVU = 0
+C
+ LCOEFFS = .FALSE.
+ ZMISS = RMISSGV
+ ZSEC3(2) = RMISSGV
+ ISEC3(2) = INT(RMISSGV)
+ ISEC1(5) = 192
+
+C
+C Check if debug option turned on
+ CALL JDEBUG()
+ LDEBUG = NDBG.GT.0
+C
+C
+ OUTLEN = 0
+ IRET = 1
+C
+C Check that the field can be handled
+C
+C ------------------------------------------------------------------
+C Section 2. Sort out interpolation area.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ NSPEC = 1
+ INORTH = FLOAT(NIAREA(1))/PPMULT
+ IWEST = FLOAT(NIAREA(2))/PPMULT
+ ISOUTH = FLOAT(NIAREA(3))/PPMULT
+ IEAST = FLOAT(NIAREA(4))/PPMULT
+ KNUM = NINS
+ RNS = INORTH - ISOUTH
+C
+C Adjust (sub-)area limits to suit the grid
+C
+ IRET = FIXAREA()
+ IF ( IRET .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR, 'INTWAVU: FIXAREA failed.',JPQUIET)
+ INTWAVU = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+ NORTH = FLOAT(NOAREA(1))/PPMULT
+ WEST = FLOAT(NOAREA(2))/PPMULT
+ SOUTH = FLOAT(NOAREA(3))/PPMULT
+ EAST = FLOAT(NOAREA(4))/PPMULT
+C
+C Calculate the number of points E-W and N-S in new grid area
+C
+ IF( (NOREPR.EQ.JPQUASI) .OR. (NOREPR.EQ.JPGAUSSIAN)) THEN
+ GRIDWE = NOGAUSS
+ GRIDNS = 0
+ ELSE IF( NOREPR.EQ.JPREDLL ) THEN
+ GRIDWE = 360.0/NOLPTS((NOREDLL/2)+1)
+ GRIDNS = FLOAT(NOGRID(2))/PPMULT
+ ELSE
+ GRIDWE = FLOAT(NOGRID(1))/PPMULT
+ GRIDNS = FLOAT(NOGRID(2))/PPMULT
+ ENDIF
+C
+ IRET = AREACHK(GRIDWE,GRIDNS,NORTH,WEST,SOUTH,EAST)
+ IF( IRET.NE.0 ) THEN
+ INTWAVU = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+ NOAREA(1) = NINT(NORTH*PPMULT)
+ NOAREA(2) = NINT(WEST*PPMULT)
+ NOAREA(3) = NINT(SOUTH*PPMULT)
+ NOAREA(4) = NINT(EAST*PPMULT)
+C
+ IF( (NOREPR.EQ.JPQUASI) .OR. (NOREPR.EQ.JPGAUSSIAN)) THEN
+ IF(NOREPR.EQ.JPQUASI) THEN
+ GRIDWE = 360.0/NOLPTS(NOGAUSS)
+ ELSE
+ GRIDWE = 360.0/(NOGAUSS*4)
+ ENDIF
+ NUM_E_W = NUMPTWE(WEST,EAST,GRIDWE)
+ NFULLEW = NUMPTWE(0.0,360.0,GRIDWE) - 1
+ NUM_N_S = JNORSGG(SOUTH,ROGAUSS,NOGAUSS,1) -
+ X JNORSGG(NORTH,ROGAUSS,NOGAUSS,0) + 1
+ NFULLNS = NOGAUSS*2
+ NONS = NFULLNS
+ IF(NOREPR.EQ.JPQUASI) THEN
+ KNEWNUM = NOGAUSS*2
+ DO LOOP = 1, KNEWNUM
+ OUTLEN = OUTLEN + NOLPTS(LOOP)
+ ENDDO
+ NOWE = 0
+ ELSE
+ NOWE = NUM_E_W
+ OUTLEN = NOWE*NONS
+ ENDIF
+ ELSE IF( NOREPR.EQ.JPREDLL ) THEN
+ NUM_E_W = NUMPTWE(WEST,EAST,GRIDWE)
+ NFULLEW = NUMPTWE(0.0,360.0,GRIDWE) - 1
+ NUM_N_S = NUMPTNS(NORTH,SOUTH,GRIDNS)
+ NFULLNS = NOREDLL
+ CALL INTLOG(JP_ERROR,'INTWAVU: Reduced ll not posible',JPQUIET)
+ GOTO 900
+ ELSE
+ NUM_E_W = NUMPTWE(WEST,EAST,GRIDWE)
+ NFULLEW = NUMPTWE(0.0,360.0,GRIDWE) - 1
+ NUM_N_S = NUMPTNS(NORTH,SOUTH,GRIDNS)
+ NFULLNS = NUM_N_S
+cs calculate outlen for regular lat-lon
+ OUTLEN = NUM_E_W*NUM_N_S
+ NOWE = NUM_E_W
+ NONS = NUM_N_S
+ ENDIF
+C
+C
+C ------------------------------------------------------------------
+C Section 3. Interpolate wave fields other than 2D spectra.
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C Handle if not 2D spectra ..
+C
+ IF( (NIPARAM.NE.JP2DSP).AND.(NIPARAM.NE.JP2DSPQ) ) THEN
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTWAVU: Interpolate wave fields other than 2D spectra',JPQUIET)
+ ENDIF
+C--------------------------------------------------------------------
+ KNUM = NINS
+ IF(NIREPR.EQ.JPREDLL) THEN
+C
+C Input field is a reduced latitude/longitude grid
+C
+C .. but it may be 'pseudo-gaussian' in layout
+C (ie global, symmetric about the equator but no latitude
+C at the equator)
+ MISSLAT = 0
+ ONORTH = FLOAT(NIAREA(1))/PPMULT
+ OSOUTH = FLOAT(NIAREA(3))/PPMULT
+
+ RLATINC = FLOAT(NIGRID(2))/PPMULT
+
+
+ IF( ( NIAREA(1).NE.90000).AND.(MOD(KNUM,2).EQ.0) ) THEN
+C
+ DO LOOP = 1, KNUM
+ NUMPTS(LOOP) = MILLEN(LOOP)
+ ENDDO
+C
+ ELSE
+C
+cs MISSLAT = (90000 - NIAREA(1))/NIGRID(2)
+ MISSLAT = (90.0 - ONORTH)/RLATINC
+ DO LOOP = 1, MISSLAT
+ NUMPTS(LOOP) = 0
+ ENDDO
+cs KOLDNUM = 1 + (90000 - NIAREA(3))/NIGRID(2)
+ KOLDNUM = 1 + NINT((90.0 - OSOUTH)/RLATINC)
+ DO LOOP = 1, (KOLDNUM-MISSLAT)
+ NUMPTS(LOOP+MISSLAT) = MILLEN(LOOP)
+ ENDDO
+ DO LOOP = (KOLDNUM+1), KNUM
+ NUMPTS(LOOP) = 0
+ ENDDO
+ ENDIF
+ ENDIF
+C--------------------------------------------------------------------
+
+C
+C Interpolate the field
+C
+ IRET = WAVEXX2(NIPARAM,KNUM,NUMPTS,NUM_N_S,GRIDNS,GRIDWE,INFLD,
+ X OUTFLD,NORTH,WEST,ZMISS)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVU: Interpolation failed.',JPQUIET)
+ INTWAVU = JPROUTINE + 10
+ GOTO 900
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 4. Interpolate wave 2D spectra field.
+C ------------------------------------------------------------------
+C
+ ELSE
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'INTWAVU: Interpolate wave 2D spectra field',JPQUIET)
+ ENDIF
+ 400 CONTINUE
+C
+ IRET = WV2DXX2(NIMATR,KNUM,MILLEN,NUM_N_S,GRIDNS,GRIDWE,INFLD,
+ X OUTFLD,NORTH,WEST,ZMISS)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVU: Interpolation failed.',JPQUIET)
+ INTWAVU = JPROUTINE + 13
+ GOTO 900
+ ENDIF
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C Section 5. Frame and Bitmap
+C ------------------------------------------------------------------
+C
+ 500 CONTINUE
+
+C If a 'bitmap' has been specified, build the bitmap
+C
+ LBITMP = LNOBITMP.AND.
+ X ((NOREPR.EQ.JPREGROT).OR.(NOREPR.EQ.JPREGULAR).OR.
+ X (NOREPR.EQ.JPGAUSSIAN))
+
+ IF( LBITMP ) THEN
+ CALL INTLOG(JP_DEBUG,'INTWAVU: MKBITMP is enabled',JPQUIET)
+ IERR = MKBITMP(NUM_E_W,NUM_N_S,OUTFLD,ZMISS)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'INTWAVU: Problem applying bitmap',JPQUIET)
+ GOTO 900
+ ENDIF
+ ENDIF
+C If a 'frame' has been specified, build the frame
+C
+ LFRAME = LNOFRAME.AND.
+ X ((NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPGAUSSIAN).OR.
+ X (NOREPR.EQ.JPREGROT ).OR.(NOREPR.EQ.JPFGGROT ) )
+
+ CALL INTLOG(JP_DEBUG,'INTWAVU: NUM_E_W ',NUM_E_W)
+ CALL INTLOG(JP_DEBUG,'INTWAVU: NUM_N_S ',NUM_N_S)
+ IF( LFRAME ) THEN
+ CALL INTLOG(JP_DEBUG,'INTWAVU: MKFRAME is enabled',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'INTWAVU: NOFRAME ',NOFRAME)
+ CALL MKFRAME(NUM_E_W,NUM_N_S,OUTFLD,ZMISS,NOFRAME)
+ ENDIF
+C
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+C Clear change flags for next product processing
+C
+ LCHANGE = .FALSE.
+ LSMCHNG = .FALSE.
+C
+ RETURN
+ END
diff --git a/interpolation/irdiwe.F b/interpolation/irdiwe.F
new file mode 100755
index 0000000..144ec43
--- /dev/null
+++ b/interpolation/irdiwe.F
@@ -0,0 +1,297 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IRDIWE (KLLEN, KINS, KNSIND, KONS, KILONG,
+ 1 KIWE, KOLONG, KOWE, KWEIND, KWEDIST, KPR, KERR)
+C
+C---->
+C**** *IRDIWE*
+C
+C PURPOSE
+C _______
+C
+C Calculate the distances between points in an output longitude
+C array and its West and East neighbours in the input longitude
+C array for a quasi regular input field and regular output field.
+C
+C INTERFACE
+C _________
+C
+C IERR = IRDIWE (KLLEN, KINS, KNSIND, KONS, KILONG, KIWE, KOLONG,
+C 1 KOWE, KWEIND, KWEDIST, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KLLEN - This array contains the quasi regular Gaussian
+C line length definition.
+C
+C KINS - The number of points in the North-South direction
+C in the input field.
+C
+C KNSIND - This array will contain the array offsets of the
+C North and South points in the input array required
+C for interpolation.
+C
+C KONS - The number of points in the North-South direction
+C in the output field.
+C
+C KILONG - The array of input longitudes.
+C
+C KIWE - The maximum number of points in the West-East
+C direction for this quasi regular Gaussian grid.
+C
+C KOLONG - The array of output longitudes.
+C
+C KOWE - The number of points in the West-East direction in
+C the output field.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C KWEIND - This array will contain the array offsets of
+C the West and East points in the input array
+C required for interpolation for all lines of
+C latitude.
+C
+C KWEDIST - This array holds the distances to longitude values
+C in the input field from the associated longitude
+C values in the output field. This array is
+C dimensioned (2, KOWE, 2, KONS).
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C IGDIWE - Calculate the distances between points in an
+C output longitude array and its West and East
+C neighbours in the input longitude array for one
+C line of latitude.
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C This routine will create the arrays of offsets and distance as
+C two arrays of length (2, Number of output longitudes, 2,
+C Number of output latitudes).
+C
+C The array of offsets is copied from line to line provided the
+C number of points in the quasi regular lines of latitude does
+C not change. When the definition changes IGDIWE is used to
+C generate the offsets and distances for the new line definition.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 2 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Nov 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Dummy arguments
+ INTEGER KINS, KONS, KIWE, KOWE, KPR, KERR
+ INTEGER KLLEN (KINS)
+ INTEGER KNSIND (2, KONS)
+ INTEGER KILONG (KIWE + 1), KOLONG (KOWE)
+ INTEGER KWEIND (2, KOWE, 2, KONS),
+ 1 KWEDIST (2, KOWE, 2, KONS)
+C
+C Local variables
+ LOGICAL GWEGLOBE
+ INTEGER IIPLAT, IILON, ISTRIDE, IPR, IERR
+ INTEGER IBLON, IBNS, IBLAT
+ INTEGER JLAT, JLON, JNS, JWE
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 23900)
+C
+C External functions
+ INTEGER IGDIWE
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRDIWE: Section 1.',JPQUIET)
+C
+ IRDIWE = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IRDIWE: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IRDIWE: Max no.input longs = ',KIWE)
+ CALL INTLOG(JP_DEBUG,'IRDIWE: No.input lats = ',KINS)
+ CALL INTLOG(JP_DEBUG,'IRDIWE: No.output longs = ',KOWE)
+ CALL INTLOG(JP_DEBUG,'IRDIWE: No.output lats = ',KONS)
+ CALL INTLOG(JP_DEBUG,'IRDIWE: Output field spread = ',KOLONG(1))
+ CALL INTLOG(JP_DEBUG,'IRDIWE: to ',KOLONG(KOWE))
+ ENDIF
+C
+ GWEGLOBE = .TRUE.
+C
+ IBLON = 0
+C
+ IERR = 0
+C
+C _______________________________________________________
+C
+C* Section 2. Generate distances and points for all lines
+C of latitude
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRDIWE: Section 2.',JPQUIET)
+C
+ IPR = KPR
+ IBLAT = 1
+ IBNS = 1
+C
+ DO 250 JLAT = 1, KONS
+C
+ DO 240 JNS = 1, 2
+C
+ IIPLAT = KNSIND (JNS, JLAT)
+ IILON = KLLEN (IIPLAT)
+C
+ IF (IILON .EQ. IBLON) THEN
+C
+C Same line definition as last one calculated
+C
+ DO 220 JWE = 1, 2
+ DO 210 JLON = 1, KOWE
+C
+ KWEIND (JWE, JLON, JNS, JLAT) =
+ 1 KWEIND (JWE, JLON, IBNS, IBLAT)
+ KWEDIST (JWE, JLON, JNS, JLAT) =
+ 1 KWEDIST (JWE, JLON, IBNS, IBLAT)
+C
+ 210 CONTINUE
+ 220 CONTINUE
+C
+ ELSE
+C
+ IBLON = IILON
+ IBNS = JNS
+ IBLAT = JLAT
+C
+ ISTRIDE = JP360 / IILON
+C
+C Generate longitude values for this line
+C
+ DO 230 JLON = 1, IILON
+C
+ KILONG (JLON) = (JLON - 1) * ISTRIDE
+C
+ 230 CONTINUE
+C
+C Wrap around input grid to simplify routine IGDIWE
+C
+ KILONG (IILON + 1) = KILONG (1)
+C
+ IERR = IGDIWE (KILONG, IILON, KOLONG, KOWE, GWEGLOBE,
+ 1 KWEIND (1, 1, JNS, JLAT), KWEDIST (1, 1, JNS, JLAT),
+ 2 IPR, KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IRDIWE = IERR
+ GO TO 900
+ ENDIF
+C
+ IPR = KPR - 1
+C
+ ENDIF
+C
+ 240 CONTINUE
+C
+ 250 CONTINUE
+C
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRDIWE: Section 9.',JPQUIET)
+C
+C
+ RETURN
+ END
diff --git a/interpolation/irgmem.F b/interpolation/irgmem.F
new file mode 100755
index 0000000..c928ac8
--- /dev/null
+++ b/interpolation/irgmem.F
@@ -0,0 +1,326 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IRGMEM (KPR, KERR)
+C
+C---->
+C**** *IRGMEM*
+C
+C PURPOSE
+C _______
+C
+C This routine acquires heap space for quasi regular to regular
+C interpolation.
+C
+C INTERFACE
+C _________
+C
+C IERR = IRGMEM (KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C None
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C nifld.common - This file contains all the input field
+C definition variables.
+C
+C NINS - Number of grid points in NS direction for input
+C field (used in grspace.h).
+C NIWE - Number of grid points in WE direction for input
+C field (used in grspace.h).
+C
+C nofld.common - This file contains all the output field
+C definition variables.
+C
+C NONS - Number of grid points in NS direction for output
+C field (used in grspace.h).
+C NOWE - Number of grid points in WE direction for output
+C field (used in grspace.h).
+C
+C grspace.h - This file contains all the work space array
+C definitions for grid point to grid point
+C interpolation.
+C
+C GRID_POINT
+C
+C NILATGP - POINTER to array MILATG.
+C NILONGP - POINTER to array MILONG.
+C NILSMP - POINTER to array MILSM.
+C NINPNTP - POINTER to array RINPNT.
+C NISTRTP - POINTER to array MISTRT.
+C NNSDISTP - POINTER to array MNSDIST.
+C NNSINDP - POINTER to array MNSIND.
+C NMAXP - POINTER to array RMAX.
+C NOLATGP - POINTER to array MOLATG.
+C NOLONGP - POINTER to array MOLONG.
+C NOLSMP - POINTER to array MOLSM.
+C NWEDISTP - POINTER to array MWEDIST.
+C NWEINDP - POINTER to array MWEIND.
+C NWFACTP - POINTER to array WFACT.
+C
+C MILATG - Dynamic array of length (NINS) (see nifld.common)
+C which holds the values of the input field
+C latitudes.
+C MILONG - Dynamic array of length (NIWE + 1) (see
+C nifld.common) which holds the values of the
+C input field longitudes.
+C MILSM - Dynamic array of length (NIWE, 2) (see
+C nifld.common) used in calculating the effects of
+C the land sea mask on interpolation.
+C MISTRT - Dynamic array of length (NINS) (see nifld.common)
+C which holds the array offsets of the start of
+C each latitude line for a quasi regular Gaussian
+C input field. No space is assigned to this array
+C for a regular input field.
+C MNSDIST - Dynamic array of length (2, NONS) (see
+C nofld.common) which holds the distances to
+C neighbouring latitude lines of the input field
+C from the associated line of latitude in the
+C output field.
+C MNSIND - Dynamic array of length (2, NONS) (see
+C nofld.common) which holds the latitude line
+C numbers (array offset) of the input field
+C associated with each line of latitude in the
+C output field.
+C MOLATG - Dynamic array of length (NONS) (see nofld.common)
+C which holds the values of the output field
+C latitudes.
+C MOLONG - Dynamic array of length (NOWE) (see nofld.common)
+C which holds the values of the output field
+C longitudes.
+C MOLSM - Dynamic array of length (NOWE) (see nofld.common)
+C used in calculating the effects of the land sea
+C mask on interpolation.
+C MWEDIST - Dynamic array of length (2, NONS) (see
+C nofld.common) for a regular input field and of
+C length (2, 2 * NONS * NOWE) (see nofld.common)
+C for a quasi regular Gaussian input field. This
+C array holds the distances to neighbouring
+C longitude points of the input field from the
+C associated longitude points in the output field.
+C MWEIND - Dynamic array of length (2, NONS) (see
+C nofld.common) for a regular input field and of
+C length (2, 2 * NONS * NOWE) (see nofld.common)
+C for a quasi regular Gaussian input field. This
+C array holds the longitude points (array offset)
+C from the input field associated with each
+C longitude point in the output field.
+C RINPNT - Dynamic array of length (NOWE) (see nofld.common)
+C used to aid vectorisation in processing
+C precipitation fields.
+C RMAX - Dynamic array of length (NOWE) (see nofld.common)
+C used to aid vectorisation in processing
+C precipitation fields.
+C WFACT - Dynamic array of length (4, NOWE * NONS) (see
+C nofld.common) which holds the interpolation
+C weights for each point in the output field.
+C
+C EXTERNALS
+C _________
+C
+C IGALLOC - Get a heap allocation for array space.
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C This routine first calculates how much heap space is required.
+C IGALLOC is then used to acquire the required space. Finally the
+C POINTERs are initialised to allow use of the dynamic arrays.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 3 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Jan 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grspace.h"
+C
+C Dummy arguments
+C
+ INTEGER KPR, KERR
+C
+C Local variables
+C
+#ifdef POINTER_64
+ INTEGER*8 IBASE
+#else
+ INTEGER IBASE
+#endif
+ INTEGER IREQUEST, IERR
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 23100)
+C
+C External functions
+C
+ INTEGER IGALLOC
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialisation
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IRGMEM: Section 1.',JPQUIET)
+C
+ IRGMEM = 0
+C
+C -----------------------------------------------------------------|
+C* Section 2. Calculate memory required and get heap
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IRGMEM: Section 2.',JPQUIET)
+C
+C REAL arrays (This may change for double precision version)
+C
+ IREQUEST = 4 * NOWE * NONS * JPRLEN
+C
+C Fields for precipitation calculations
+C
+ IREQUEST = IREQUEST + 2 * NOWE * JPRLEN
+C
+C Fixed integer fields
+C
+ IREQUEST = IREQUEST + (NIWE + 1 + NINS + NOWE + 5 * NONS) *
+ 1 JPILEN
+C
+C Reduced Gaussian input fields (These change for regular fields)
+C
+ IREQUEST = IREQUEST + (8 * NOWE * NONS + NINS) * JPILEN
+C
+C Fields for LSM calculations
+C
+ IREQUEST = IREQUEST + (2 * NIWE + NOWE) * JPILEN
+C
+C Get the required memory
+C
+ IERR = IGALLOC (JPINNER, IREQUEST, IBASE, KPR, KERR)
+C
+ IF( IERR.GT.0 ) THEN
+ IRGMEM = IERR
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Initialise base addresses for POINTER arrays
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IRGMEM: Section 3.',JPQUIET)
+C
+C REAL arrays first to ease conversion to DOUBLE PRECISION
+C
+ NWFACTP = IBASE
+C
+C Precipitation REAL arrays
+C
+ NMAXP = NWFACTP + 4 * NOWE * NONS * JPRLEN
+ NINPNTP = NMAXP + NOWE * JPRLEN
+C
+C This offset may change if DOUBLE PRECISION
+C
+ NILONGP = NINPNTP + NOWE * JPRLEN
+C
+ NILATGP = NILONGP + (NIWE + 1) * JPILEN
+ NOLONGP = NILATGP + NINS * JPILEN
+ NOLATGP = NOLONGP + NOWE * JPILEN
+ NNSINDP = NOLATGP + NONS * JPILEN
+ NNSDISTP = NNSINDP + 2 * NONS * JPILEN
+C
+ NWEINDP = NNSDISTP + 2 * NONS * JPILEN
+ NWEDISTP = NWEINDP + 4 * NOWE * NONS * JPILEN
+ NISTRTP = NWEDISTP + 4 * NOWE * NONS * JPILEN
+C
+C LSM arrays
+C
+ NILSMP = NISTRTP + NINS * JPILEN
+ NOLSMP = NILSMP + 2 * NIWE * JPILEN
+C
+ IF( KPR.GE.1 ) THEN
+ CALL INTLOG(JP_DEBUG,'IRGMEM: Output base addresses.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IRGMEM: WFACT address = ',NWFACTP)
+ CALL INTLOG(JP_DEBUG,'IRGMEM: RMAX address = ',NMAXP)
+ CALL INTLOG(JP_DEBUG,'IRGMEM: RINPNT address = ',NINPNTP)
+ CALL INTLOG(JP_DEBUG,'IRGMEM: Input long.address = ',NILONGP)
+ CALL INTLOG(JP_DEBUG,'IRGMEM: Input lat.address = ',NILATGP)
+ CALL INTLOG(JP_DEBUG,'IRGMEM: Output long.address = ',NOLONGP)
+ CALL INTLOG(JP_DEBUG,'IRGMEM: Output lat.address = ',NOLATGP)
+ CALL INTLOG(JP_DEBUG,'IRGMEM: NS offset address = ',NNSINDP)
+ CALL INTLOG(JP_DEBUG,'IRGMEM: NS distance address = ',NNSDISTP)
+ CALL INTLOG(JP_DEBUG,'IRGMEM: WE offset address = ',NWEINDP)
+ CALL INTLOG(JP_DEBUG,'IRGMEM: WE distance address = ',NWEDISTP)
+ CALL INTLOG(JP_DEBUG,'IRGMEM: Line start array addr.= ',NISTRTP)
+ CALL INTLOG(JP_DEBUG,'IRGMEM: Input LSM address = ',NILSMP)
+ CALL INTLOG(JP_DEBUG,'IRGMEM: Output LSM address = ',NOLSMP)
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return to calling routine. Format statements
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IRGMEM: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/irgrid.F b/interpolation/irgrid.F
new file mode 100755
index 0000000..0d7b1b9
--- /dev/null
+++ b/interpolation/irgrid.F
@@ -0,0 +1,232 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IRGRID (KAREA, KLLEN, KLN, PGAUSS, KSTART,
+ 1 KLATG, KNNS, OWEGLOBE, KPR, KERR)
+C
+C---->
+C**** *IRGRID*
+C
+C PURPOSE
+C _______
+C
+C Generate the arrays of latitude points and the starting points
+C of the lines of latitude for a quasi regular Gaussian grid.
+C
+C INTERFACE
+C _________
+C
+C IERR = IRGRID (KAREA, KLLEN, KLN, PGAUSS, KSTART,
+C 1 KLATG, KNNS, OWEGLOBE, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KAREA - The area definition (N, W, S, E) provided by the
+C calling routine. (Currently unused).
+C
+C KLLEN - This quasi regular Gaussian line length definition
+C is for the full grid and not just the North and
+C South limits selected.
+C
+C KLN - The Northern Gaussian latitude number for this area.
+C
+C PGAUSS - The full list of Gaussian latitudes for this
+C truncation.
+C
+C KNNS - The number of points in the North-South direction
+C in this field.
+C
+C OWEGLOBE - This variable will be true if the array of
+C longitudes spans the globe and it is an input grid.
+C (Currently unused)
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C KSTART - The array offset for each line of latitude within
+C the quasi regular field.
+C
+C KLATG - The array of latitudes for this Gaussian
+C truncation and area.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C The array KLATG is generated using the information provided by
+C the other parameters. The array KSTART is generated using the
+C array KLLEN. Note that Gaussian latitudes will be stored as
+C NINT (PGAUSS * 1.0E4).
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 3 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Nov 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 23700)
+C
+C Dummy arguments
+C
+ LOGICAL OWEGLOBE
+ INTEGER KNNS, KLN, KPR, KERR
+ INTEGER KAREA (4), KLLEN (KNNS)
+ INTEGER KLATG (KNNS), KSTART (KNNS)
+ REAL PGAUSS (*)
+C
+C Local variables
+C
+ LOGICAL LPRINT
+ INTEGER JLAT
+ REAL PNLAT, ZNLAT, MFACTOR
+C
+C Function externals
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ LPRINT = KPR.NE.0
+C
+ IF( LPRINT ) CALL INTLOG(JP_DEBUG,'IRGRID: Section 1.',JPQUIET)
+C
+ IRGRID = 0
+C
+ IF( LPRINT ) THEN
+ CALL INTLOG(JP_DEBUG,'IRGRID: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IRGRID: N Gaussian line = ',KLN)
+ CALL INTLOG(JP_DEBUG,'IRGRID: No. of lat lines = ',KNNS)
+ CALL INTLOG(JP_DEBUG,'IRGRID: Area North = ', KAREA(1))
+ CALL INTLOG(JP_DEBUG,'IRGRID: Area West = ', KAREA(2))
+ CALL INTLOG(JP_DEBUG,'IRGRID: Area South = ', KAREA(3))
+ CALL INTLOG(JP_DEBUG,'IRGRID: Area East = ', KAREA(4))
+ IF( OWEGLOBE ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'IRGRID: Input W-E fld is global.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'IRGRID: Input W-E fld is NOT global.',JPQUIET)
+ ENDIF
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Generate start position of lines of latitude
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF( LPRINT ) CALL INTLOG(JP_DEBUG,'IRGRID: Section 2.',JPQUIET)
+C
+ KSTART(1) = 1
+ DO JLAT = KLN, KLN + KNNS - 2
+ KSTART(JLAT+1) = KSTART(JLAT) + KLLEN(JLAT)
+ ENDDO
+C
+C _______________________________________________________
+C
+C* Section 3. Generate points along a line of meridian
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF( LPRINT ) CALL INTLOG(JP_DEBUG,'IRGRID: Section 3.',JPQUIET)
+C
+ DO JLAT = KLN, KLN + KNNS - 1
+C
+C If it is a stretched field, calculate the true latitude and
+C the map factor.
+C
+ PNLAT = PGAUSS(JLAT)
+ IF( RISTRET.NE.0 ) THEN
+ CALL STRLAT(PNLAT, RISTRET, 0, ZNLAT, MFACTOR)
+ ELSE
+ ZNLAT = PNLAT
+ ENDIF
+ KLATG(JLAT-KLN+1) = NINT(ZNLAT * PPMULT)
+ ENDDO
+ KAREA(1) = KLATG(1)
+ KAREA(KLN) = KLATG(KLN)
+ IF( LPRINT ) THEN
+ CALL INTLOG(JP_DEBUG,'IRGRID: Modified North = ', KAREA(1))
+ CALL INTLOG(JP_DEBUG,'IRGRID: Modified South = ', KAREA(3))
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF( LPRINT ) CALL INTLOG(JP_DEBUG,'IRGRID: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/irgtog.F b/interpolation/irgtog.F
new file mode 100755
index 0000000..39259e0
--- /dev/null
+++ b/interpolation/irgtog.F
@@ -0,0 +1,275 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IRGTOG (PIFELD, KSTART, KINS, KOWE, KONS,
+ 1 KWEIND, KNSIND, PWFACT, POFELD, KPR, KERR)
+C
+C---->
+C**** *IRGTOG*
+C
+C Purpose
+C -------
+C
+C Perform basic interpolation between the input and output fields
+C for a quasi regular input field and a regular output field.
+C
+C Interface
+C ---------
+C
+C IERR = IRGTOG (PIFELD, KSTART, KINS, KOWE, KONS, KWEIND,
+C 1 KNSIND, PWFACT, POFELD, KPR, KERR)
+C
+C Input parameters
+C ----------------
+C
+C PIFELD - The input field provided by the calling routine.
+C
+C KSTART - The array offset for each line of latitude within
+C the quasi regular field.
+C
+C KINS - The number of points in the North-South direction
+C in the input field.
+C
+C KOWE - The number of points in the West-East direction in
+C the output field.
+C
+C KONS - The number of points in the North-South direction
+C in the output field.
+C
+C KWEIND - This array contains the array offsets of the West
+C and East points in the input array required for
+C interpolation.
+C
+C KNSIND - This array contains the array offsets of the North
+C and South points in the input array required for
+C interpolation.
+C
+C PWFACT - The array of interpolating weights to the four
+C neighbouring points for every output point.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C -----------------
+C
+C POFELD - The output field returned to the calling routine.
+C
+C Return value
+C ------------
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C -------------------------------
+C
+C None
+C
+C Common block usage
+C ------------------
+C
+C None
+C
+C Externals
+C ---------
+C
+C INTLOG(R) - Logs messages.
+C
+C Method
+C ------
+C
+C This routine performs basic linear interpolation using the four
+C neighbouring points in the quasi regular input array to
+C generate the output array.
+C
+C Reference
+C ---------
+C
+C None
+C
+C Comments
+C --------
+C
+C None
+C
+C Author
+C ------
+C
+C K. Fielding *ECMWF* Nov 1993
+C
+C Modifications
+C -------------
+C
+C Allow for missing data values
+C J.D.Chambers ECMWF August 2000
+C
+C Force nearest neighbour processing with env variable or
+C INTOUT parameter
+C S.Curic ECMWF September 2005
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Function arguments
+C
+ INTEGER KINS, KOWE, KONS, KPR, KERR
+ INTEGER KSTART (KINS)
+ INTEGER KWEIND (2, KOWE, 2, KONS), KNSIND (2, KONS)
+ REAL PIFELD (*), POFELD (KOWE, KONS)
+ REAL PWFACT (4, KOWE, KONS)
+C
+C Local variables
+C
+ INTEGER ILATN, ILATS, INORTH, ISOUTH, JOLAT, JOLON, COUNT
+ REAL NEAREST
+ CHARACTER*12 YFLAG
+ LOGICAL LVEGGY
+C
+C Statement function
+C
+ REAL A, B
+ LOGICAL NOTEQ
+ NOTEQ(A,B) = (ABS((A)-(B)).GT.(ABS(A)*1E-3))
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialisation
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IRGTOG = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IRGTOG: Section 1.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IRGTOG: No. input fld lats = ',KINS)
+ CALL INTLOG(JP_DEBUG,'IRGTOG: No.output fld lats = ',KONS)
+ CALL INTLOG(JP_DEBUG,'IRGTOG: No.output fld longs = ',KOWE)
+ ENDIF
+C
+ LVEGGY = (NITABLE.EQ.128).AND.
+ X ((NIPARAM.EQ.27).OR.
+ X (NIPARAM.EQ.28).OR.
+ X (NIPARAM.EQ.29).OR.
+ X (NIPARAM.EQ.30).OR.
+ X (NIPARAM.EQ.43) )
+
+C Force nearest neighbour processing with env variable
+ CALL GETENV('NEAREST_NEIGHBOUR', YFLAG)
+ IF( YFLAG(1:1).EQ.'1' ) LVEGGY = .TRUE.
+
+C Force nearest neighbour processing with INTOUT parameter
+ IF( LMETHOD ) LVEGGY = .TRUE.
+
+ IF( LVEGGY ) CALL INTLOG(JP_DEBUG,
+ X 'IRGTOG: nearest neighbour processing (vegetation)',JPQUIET)
+C
+C -----------------------------------------------------------------|
+C* Section 2. Basic interpolation
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IRGTOG: Section 2.',JPQUIET)
+C
+ DO JOLAT = 1, KONS
+C
+ ILATN = KNSIND(JP_I_N,JOLAT)
+ ILATS = KNSIND(JP_I_S,JOLAT)
+C
+ INORTH = KSTART(ILATN) - 1
+ ISOUTH = KSTART(ILATS) - 1
+C
+ DO JOLON = 1, KOWE
+C
+C Count non-missing data values
+C
+ COUNT = 0
+ IF( NOTEQ(PIFELD(KWEIND(JP_I_W,JOLON,JP_I_N,JOLAT)+INORTH),
+ X RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(PIFELD(KWEIND(JP_I_E,JOLON,JP_I_N,JOLAT)+INORTH),
+ X RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(PIFELD(KWEIND(JP_I_W,JOLON,JP_I_S,JOLAT)+ISOUTH),
+ X RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(PIFELD(KWEIND(JP_I_E,JOLON,JP_I_S,JOLAT)+ISOUTH),
+ X RMISSGV) ) COUNT = COUNT + 1
+C
+C Interpolate using four neighbours if none are missing
+C
+ IF( (COUNT.EQ.4).AND.(.NOT.LVEGGY) ) THEN
+ POFELD(JOLON,JOLAT) =
+ X PIFELD(KWEIND(JP_I_W,JOLON,JP_I_N,JOLAT)+INORTH) *
+ X PWFACT(JP_I_NW,JOLON,JOLAT) +
+ X PIFELD(KWEIND(JP_I_E,JOLON,JP_I_N,JOLAT)+INORTH) *
+ X PWFACT(JP_I_NE,JOLON,JOLAT) +
+ X PIFELD(KWEIND(JP_I_W,JOLON,JP_I_S,JOLAT)+ISOUTH) *
+ X PWFACT(JP_I_SW,JOLON,JOLAT) +
+ X PIFELD(KWEIND(JP_I_E,JOLON,JP_I_S,JOLAT)+ISOUTH) *
+ X PWFACT(JP_I_SE,JOLON,JOLAT)
+C
+C Set missing if all neighbours are missing
+C
+ ELSE IF( COUNT.EQ.0 ) THEN
+ POFELD(JOLON,JOLAT) = RMISSGV
+C
+C Otherwise, use the nearest neighbour
+C
+ ELSE
+ NEAREST = PWFACT(JP_I_NW,JOLON,JOLAT)
+ POFELD(JOLON,JOLAT) =
+ X PIFELD(KWEIND(JP_I_W,JOLON,JP_I_N,JOLAT)+INORTH)
+C
+ IF( PWFACT(JP_I_NE,JOLON,JOLAT).GT.NEAREST ) THEN
+ NEAREST = PWFACT(JP_I_NE,JOLON,JOLAT)
+ POFELD(JOLON,JOLAT) =
+ X PIFELD(KWEIND(JP_I_E,JOLON,JP_I_N,JOLAT)+INORTH)
+ ENDIF
+C
+ IF( PWFACT(JP_I_SW,JOLON,JOLAT).GT.NEAREST ) THEN
+ NEAREST = PWFACT(JP_I_SW,JOLON,JOLAT)
+ POFELD(JOLON,JOLAT) =
+ X PIFELD(KWEIND(JP_I_W,JOLON,JP_I_S,JOLAT)+ISOUTH)
+ ENDIF
+C
+ IF( PWFACT(JP_I_SE,JOLON,JOLAT).GT.NEAREST ) THEN
+ NEAREST = PWFACT(JP_I_SE,JOLON,JOLAT)
+ POFELD(JOLON,JOLAT) =
+ X PIFELD(KWEIND(JP_I_E,JOLON,JP_I_S,JOLAT)+ISOUTH)
+ ENDIF
+C
+ ENDIF
+C
+ ENDDO
+C
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return to calling routine. Format statements
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IRGTOG: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/irint.F b/interpolation/irint.F
new file mode 100755
index 0000000..8b53166
--- /dev/null
+++ b/interpolation/irint.F
@@ -0,0 +1,212 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IRINT (KWEDIST, KOWE, KNSDIST, KONS, PWFACT,
+ 1 KPR, KERR)
+C
+C---->
+C**** *IRINT*
+C
+C PURPOSE
+C _______
+C
+C Calculate the basic unnormalised interpolation weights when
+C interpolating from a quasi regular grid to a regular grid.
+C
+C INTERFACE
+C _________
+C
+C IERR = IRINT (KWEDIST, KOWE, KNSDIST, KONS, PWFACT, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KWEDIST - This array holds the distances to longitude values
+C in the input field from the associated longitude
+C values in the output field. This array is
+C dimensioned (2, KOWE, 2, KONS).
+C
+C KOWE - The number of points in the West-East direction in
+C the output field.
+C
+C KNSDIST - This array holds the distances to lines in input
+C field from the associated lines of latitude in the
+C output field. The array is dimensioned (2, KONS).
+C
+C KONS - The number of points in the North-South direction
+C in the output field.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C PWFACT - The unnormalised array of interpolating weights to
+C the four neighbouring points for every output point.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C IRINTR - Calculate the basic unnormalised interpolation
+C weights when interpolating from a quasi regular
+C grid to a regular grid for one line of latitude.
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C The weights are formed by performing a linear fit along each
+C line of latitude. These two partial weights are normalised
+C before performing a linear fit along the line of meridian.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 2 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Nov 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Dummy arguments
+ INTEGER KOWE, KONS, KPR, KERR
+ INTEGER KWEDIST (2, KOWE, 2, KONS), KNSDIST (2, KONS)
+ REAL PWFACT (4, KOWE, KONS)
+C
+C Local variables
+ INTEGER IPR, IERR
+ INTEGER JOLAT
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 23200)
+C
+C External functions
+ INTEGER IRINTR
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRINT: Section 1.',JPQUIET)
+C
+ IRINT = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IRINT: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IRINT: No.output longitudes = ',KOWE)
+ CALL INTLOG(JP_DEBUG,'IRINT: No.output latitudes = ',KONS)
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Calculate arrays of weights
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRINT: Section 2.',JPQUIET)
+C
+C Main loop over latitudes
+C
+ IPR = KPR
+C
+ DO 220 JOLAT = 1, KONS
+C
+ IERR = IRINTR (KWEDIST (1, 1, 1, JOLAT), KOWE,
+ X KNSDIST (1, JOLAT), PWFACT (1, 1, JOLAT), IPR, KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IRINT = IERR
+ GO TO 900
+ ENDIF
+C
+ IPR = KPR - 1
+C
+ 220 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRINT: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/irintr.F b/interpolation/irintr.F
new file mode 100755
index 0000000..d75931c
--- /dev/null
+++ b/interpolation/irintr.F
@@ -0,0 +1,211 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IRINTR (KWEDIST, KOWE, KNSDIST, PWFACT, KPR,
+ 1 KERR)
+C
+C---->
+C**** *IRINTR*
+C
+C PURPOSE
+C _______
+C
+C Calculate the basic unnormalised interpolation weights when
+C interpolating from a quasi regular grid to a regular grid for
+C one line of latitude.
+C
+C INTERFACE
+C _________
+C
+C IERR = IRINTR (KWEDIST, KOWE, KNSDIST, PWFACT, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KWEDIST - This array holds the distances to longitude values
+C in the input field from the associated longitude
+C values in the output field.
+C
+C KOWE - The number of points in the West-East direction in
+C the output field.
+C
+C KNSDIST - This array of length 2 gives the distances to the
+C lines of latitude North and South in the input
+C field from the line of latitude in the output field.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C PWFACT - The unnormalised array of interpolating weights to
+C the four neighbouring points for every point of the
+C output line of latitude.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C The weights are formed by performing a linear fit along the
+C two lines of latitude. These two partial weights are normalised
+C before performing a linear fit along the line of meridian.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 2 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Nov 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C NONE
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Dummy arguments
+ INTEGER KOWE, KPR, KERR
+ INTEGER KWEDIST (2, KOWE, 2), KNSDIST (2)
+ REAL PWFACT (4, KOWE)
+C
+C Local variables
+ REAL ZSOUTH, ZNORTH
+ INTEGER JOLON
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 23300)
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRINTR: Section 1.',JPQUIET)
+C
+ IRINTR = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IRINTR: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IRINTR: No.output longitudes = ',KOWE)
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Calculate arrays of weights
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRINTR: Section 2.',JPQUIET)
+C
+ DO 210 JOLON = 1, KOWE
+C
+ ZNORTH = KWEDIST (JP_I_W, JOLON, JP_I_N) +
+ X KWEDIST (JP_I_E, JOLON, JP_I_N)
+C
+ ZSOUTH = KWEDIST (JP_I_W, JOLON, JP_I_S) +
+ X KWEDIST (JP_I_E, JOLON, JP_I_S)
+C
+ PWFACT (JP_I_NW, JOLON) =
+ X REAL (KWEDIST (JP_I_E, JOLON, JP_I_N)) *
+ X ZSOUTH * REAL (KNSDIST (JP_I_S) )
+C
+ PWFACT (JP_I_NE, JOLON) =
+ X REAL (KWEDIST (JP_I_W, JOLON, JP_I_N)) *
+ X ZSOUTH * REAL (KNSDIST (JP_I_S) )
+C
+ PWFACT (JP_I_SW, JOLON) =
+ X REAL (KWEDIST (JP_I_E, JOLON, JP_I_S)) *
+ X ZNORTH * REAL (KNSDIST (JP_I_N) )
+C
+ PWFACT (JP_I_SE, JOLON) =
+ X REAL (KWEDIST (JP_I_W, JOLON, JP_I_S)) *
+ X ZNORTH * REAL (KNSDIST (JP_I_N) )
+C
+ 210 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRINTR: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/irlrev.F b/interpolation/irlrev.F
new file mode 100755
index 0000000..b7fc29e
--- /dev/null
+++ b/interpolation/irlrev.F
@@ -0,0 +1,244 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IRLREV (PMAT, KLEN, KLLEN, KCOL, KDIR, KPR,
+ 1 KERR)
+C
+C---->
+C**** *IRLREV*
+C
+C PURPOSE
+C _______
+C
+C This routine reverses either the rows or the columns of a quasi
+C regular matrix.
+C
+C INTERFACE
+C _________
+C
+C IERR = IRLREV (PMAT, KLEN, KLLEN, KCOL, KDIR, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C PMAT - The input matrix of dimension (KLEN).
+C
+C KLEN - The length of the array PMAT.
+C
+C KLLEN - The lengths of each column within PMAT.
+C
+C KCOL - The number of entries in KLLEN and columns in PMAT.
+C
+C KDIR - 1 Reverses the order of the rows.
+C West-East reversal for meteorological fields.
+C 2 Reverses the order of the columns.
+C North-South reversal for meteorological fields.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C (No longer used, kept for backward compatibility.
+C Used to be used as follows:
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.)
+C
+C
+C Output parameters
+C ________________
+C
+C PMAT - The transformed matrix.
+C
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C 7501 A column swap has been attempted where the lengths in the
+C array KLLEN are not symmetric about the middle value.
+C
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C
+C EXTERNALS
+C _________
+C
+C INTLOG - Generate log messages.
+C
+C
+C METHOD
+C ______
+C
+C KDIR = 1 is implemented by swapping corresponding columns of
+C the matrix.
+C
+C KDIR = 2 is implemented by reversing the elements within each
+C column.
+C
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C
+C COMMENTS
+C ________
+C
+C None.
+C
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Jan 1994
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers ECMWF Sept 1995
+C
+C----<
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Function arguments
+ INTEGER KLEN, KCOL, KDIR, KPR, KERR
+ INTEGER KLLEN (KCOL)
+ REAL PMAT (KLEN)
+C
+C Local variables
+ INTEGER IHALF, ISTARTL, ISTARTU, ILINE
+ INTEGER JSTEP, JMOVE
+ REAL ZTEMP
+C
+C Parameters.
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 7500)
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRLREV: Section 1.',JPQUIET)
+C
+ IRLREV = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IRLREV: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IRLREV: Matrix length = ',KLEN)
+ CALL INTLOG(JP_DEBUG,'IRLREV: Number of rows = ',KCOL)
+ CALL INTLOG(JP_DEBUG,'IRLREV: Direction value = ',KDIR)
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Matrix COLUMN reversal (Field row interchange - WE)
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRLREV: Section 2.',JPQUIET)
+C
+ IF (KDIR .EQ. 1) THEN
+C
+ ISTARTL = 0
+C
+ DO 220 JSTEP = 1, KCOL
+C
+ ILINE = KLLEN (JSTEP)
+ IHALF = ILINE / 2
+C
+ DO 210 JMOVE = 1, IHALF
+ ZTEMP = PMAT(ISTARTL + ILINE + 1 - JMOVE)
+ PMAT(ISTARTL + ILINE + 1 - JMOVE) = PMAT(ISTARTL + JMOVE)
+ PMAT(ISTARTL + JMOVE) = ZTEMP
+ 210 CONTINUE
+C
+ ISTARTL = ISTARTL + ILINE
+C
+ 220 CONTINUE
+C
+ ELSE
+C
+C _______________________________________________________
+C
+C* Section 3. Matrix ROW reversal (Field column interchange - NS)
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRLREV: Section 3.',JPQUIET)
+C
+ IHALF = KCOL / 2
+C
+ ISTARTL = 0
+ ISTARTU = KLEN - KLLEN (KCOL)
+C
+ DO 320 JMOVE = 1, IHALF
+C
+C The quasi regular line lengths must be symmetric for this
+C operation.
+C
+ IF (KLLEN (JMOVE) .NE. KLLEN (KCOL + 1 - JMOVE) ) THEN
+ IRLREV = JPROUTINE + 1
+C
+ CALL INTLOG(JP_ERROR,
+ X 'IRLREV: Line of latitude reversal failed', JPQUIET)
+ CALL INTLOG(JP_ERROR,'IRLREV: at lat.lines = ',JMOVE)
+ CALL INTLOG(JP_ERROR,'IRLREV: and = ',(KCOL+1-JMOVE))
+ CALL INTLOG(JP_ERROR,
+ X 'IRLREV: Lengths are not the same.', JPQUIET)
+ CALL INTLOG(JP_ERROR,'IRLREV: 1st length = ', KLLEN (JMOVE))
+ CALL INTLOG(JP_ERROR,
+ X 'IRLREV: 2nd length = ',KLLEN(KCOL+1-JMOVE))
+C
+ ENDIF
+C
+ DO 310 JSTEP = 1, KLLEN (JMOVE)
+C
+ ZTEMP = PMAT (ISTARTU + JSTEP)
+ PMAT (ISTARTU + JSTEP) = PMAT (ISTARTL + JSTEP)
+ PMAT (ISTARTL + JSTEP) = ZTEMP
+C
+ 310 CONTINUE
+C
+ ISTARTL = ISTARTL + KLLEN (JMOVE)
+ ISTARTU = ISTARTU - KLLEN (KCOL - JMOVE)
+C
+ 320 CONTINUE
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRLREV: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/irlsmb.F b/interpolation/irlsmb.F
new file mode 100755
index 0000000..2a49679
--- /dev/null
+++ b/interpolation/irlsmb.F
@@ -0,0 +1,481 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IRLSMB (OISTAND, HIFILE, KIREC, KIGRID, KILINE,
+ X OOSTAND, HOFILE, KOREC, KOGRID, KOLINE, KPR, KERR)
+C
+C---->
+C**** *IRLSMB*
+C
+C Purpose
+C -------
+C
+C Calculate the effects of the land-sea masks on the unnormalised
+C interpolation weights for a quasi regular input field and a
+C regular output field.
+C
+C
+C Interface
+C ---------
+C
+C IERR = IRLSMB (OISTAND, HIFILE, KIREC, KIGRID, KILINE,
+C X OOSTAND, HOFILE, KOREC, KOGRID, KOLINE, KPR, KERR)
+C
+C
+C Input parameters
+C ----------------
+C
+C OISTAND - Flag indicating whether the input land-sea mask
+C is a pre-stored "standard" field.
+C
+C HIFILE - The filename for the input land-sea mask.
+C
+C KIREC - The length of one latitude record in the input file.
+C
+C KIGRID - An array of length 2 giving the row and column
+C strides in a pre-stored land sea mask file for the
+C input grid.
+C
+C KILINE - An array of length 2 giving the offsets of the
+C Northern and Western starting points in a
+C pre-stored land sea mask file for the input grid.
+C
+C OOSTAND - Flag indicating whether the output land-sea mask
+C is a prestored "standard" field.
+C
+C HOFILE - The filename for the output land-sea mask.
+C
+C KOREC - The length of one latitude record in the output file.
+C
+C KOGRID - An array of length 2 giving the row and column
+C strides in a pre-stored land sea mask file for the
+C output grid.
+C
+C KOLINE - An array of length 2 giving the offsets of the
+C Northern and Western starting points in a
+C pre-stored land sea mask file for the output grid.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C
+C Output parameters
+C -----------------
+C
+C The common variable WFACT is modified by this routine.
+C
+C An error indicator
+C
+C 23401 An error exit was returned from the I/O routine PBOPEN.
+C 23402 An error exit was returned from the I/O routine PBCLOSE.
+C
+C
+C Common block usage
+C ------------------
+C
+C nifld.common - This file contains all the input field
+C definition variables.
+C
+C NINS - Number of grid points in NS direction for input
+C field (used in grspace.h).
+C NIWE - Number of grid points in WE direction for input
+C field (used in grspace.h).
+C
+C nofld.common - This file contains all the output field
+C definition variables.
+C
+C NONS - Number of grid points in NS direction for output
+C field is used.
+C NOWE - Number of grid points in WE direction for output
+C field is used.
+C
+C grspace.h - This file contains all the work space array
+C definitions for grid point to grid point
+C interpolation.
+C
+C MEXPAND - Array used to expand one latitude line of the
+C 10 minute land sea mask file to have one word
+C per bit for improved efficiency.
+C MILLEN - Array containing a quasi regular line length
+C definition.
+C MWORK - Array used to read one latitude line of a
+C standard land sea mask file.
+C
+C MILATG - The input field latitudes.
+C MILONG - The input field longitudes.
+C MILSM - Work array used in calculating the effects of
+C the land sea mask on interpolation.
+C MISTRT - The array offsets of the start of each latitude
+C line for a quasi regular Gaussian input field.
+C MNSIND - The latitude line numbers (array offset) of the
+C input field associated with each line of
+C latitude in the output field.
+C MOLATG - The output field latitudes.
+C MOLONG - The output field longitudes.
+C MOLSM - Work array used in calculating the effects of
+C the land sea mask on interpolation.
+C MWEIND - This array holds the longitude points (array
+C offset) from the input field associated with
+C each longitude point in the output field.
+C WFACT - The interpolation weights for each point in the
+C output field.
+C
+C
+C Externals
+C ---------
+C
+C IGLSM01 - Read and process one latitude row from the 10
+C minute land sea mask.
+C IGLSMR - Calculate the effects of the land-sea masks for
+C one line of latitude on the unnormalised
+C interpolation weights.
+C IGLSMST - Read and process one line of latitude from a
+C standard land sea mask file.
+C PBCLOSE - Close a land sea mask file after processing.
+C PBOPEN - Open a land sea mask file for processing.
+C INTLOG(R) - Log messages.
+C JINDEX - Returns length of character string
+C
+C
+C Method
+C ------
+C
+C All the land sea mask data is in (0-1) form. If a point in the
+C input field has a different land sea mask value from the
+C corresponding point in the output field then its interpolating
+C weight is multiplied by a scaling factor. This scaling factor
+C is currently 0.2 so that the effect of such points in the final
+C interpolation is reduced.
+C
+C The land-sea mask files are kept open between calls to this
+C routine.
+C
+C
+C Reference
+C ---------
+C
+C None
+C
+C
+C Comments
+C --------
+C
+C None
+C
+C
+C Author
+C ------
+C K. Fielding *ECMWF* Nov 1993
+C
+C Modifications
+C -------------
+C
+C J.D.Chambers ECMWF Oct 1996
+C Reduced number of parameters in call to IGLSMST and IGLSM01
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grspace.h"
+C
+C Function arguments
+C
+ LOGICAL OISTAND, OOSTAND
+ CHARACTER *(*) HIFILE, HOFILE
+ INTEGER KIREC, KOREC, KPR, KERR
+ INTEGER KIGRID (2), KILINE (2), KOGRID (2), KOLINE (2)
+C
+C Local variables
+C
+ INTEGER IIUNIT, IOUNIT, IIFILE, IOFILE
+ INTEGER ILATN, ILATS, ILINEN, ILINES, ISTRIDEN, ISTRIDES
+ INTEGER IOSTRIDE, INDEXN, INDEXS, IZERO, IOFF, IPR, IERR
+ INTEGER JLON, JOLAT
+ CHARACTER*80 XHIFILE, XHOFILE
+ CHARACTER*2 NEWFILE, MSKFILE
+ INTEGER XIIUNIT, XIOUNIT, II
+ DATA XIIUNIT/0/
+ DATA XIOUNIT/0/
+ SAVE XHIFILE, XHOFILE, XIIUNIT, XIOUNIT
+C
+C Multiplication factor for unlike land-sea masks
+C
+ REAL PPLSM
+ PARAMETER (PPLSM = 0.2E0)
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 23400)
+C
+C External functions
+C
+ INTEGER IGLSMR, IGLSMST, IGLSM01, JINDEX
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialisation
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IRLSMB: Section 1.',JPQUIET)
+C
+ IRLSMB = 0
+C
+ IIFILE = JINDEX(HIFILE)
+ IOFILE = JINDEX(HOFILE)
+C
+ IF( KPR.GE.1 ) THEN
+ CALL INTLOG(JP_DEBUG,'IRLSMB: Input field parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IRLSMB: LSM filename is.',JPQUIET)
+ CALL INTLOG(JP_DEBUG, HIFILE(1:IIFILE), JPQUIET)
+ IF( OISTAND ) THEN
+ CALL INTLOG(JP_DEBUG,'IRLSMB: Standard fld: TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IRLSMB: Standard fld: FALSE',JPQUIET)
+ ENDIF
+ CALL INTLOG(JP_DEBUG,'IRLSMB: LSM file rec len = ',KIREC)
+ CALL INTLOG(JP_DEBUG,'IRLSMB: Grid stride WE = ',KIGRID(1))
+ CALL INTLOG(JP_DEBUG,'IRLSMB: Grid stride NS = ',KIGRID(2))
+ CALL INTLOG(JP_DEBUG,'IRLSMB: Grid start N = ',KILINE(1))
+ CALL INTLOG(JP_DEBUG,'IRLSMB: Grid start W = ',KILINE(2))
+C
+ CALL INTLOG(JP_DEBUG,'IRLSMB: Output field parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG, HOFILE(1:IOFILE),JPQUIET)
+ IF( OOSTAND ) THEN
+ CALL INTLOG(JP_DEBUG,'IRLSMB: Standard fld: TRUE',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IRLSMB: Standard fld: FALSE',JPQUIET)
+ ENDIF
+ CALL INTLOG(JP_DEBUG,'IRLSMB: LSM file rec len = ',KOREC)
+ CALL INTLOG(JP_DEBUG,'IRLSMB: Grid stride WE = ',KOGRID(1))
+ CALL INTLOG(JP_DEBUG,'IRLSMB: Grid stride NS = ',KOGRID(2))
+ CALL INTLOG(JP_DEBUG,'IRLSMB: Grid start N = ',KOLINE(1))
+ CALL INTLOG(JP_DEBUG,'IRLSMB: Grid start W = ',KOLINE(2))
+ ENDIF
+C
+ IF( MOLONG(2).GE.MOLONG(1) ) THEN
+ IOSTRIDE = MOLONG(2) - MOLONG(1)
+ ELSE
+ IOSTRIDE = MOLONG(2) + JP360 - MOLONG(1)
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Open files for input and output land sea masks
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IRLSMB: Section 2.',JPQUIET)
+C
+C See if first time through or input land sea mask filename has
+C changed since last access
+C
+ II = JINDEX(HIFILE)
+ IF( XHIFILE(1:II).NE.HIFILE(1:II) ) THEN
+C
+C Open input land sea mask file
+C
+ IF(XIIUNIT.NE.0) CALL PBCLOSE(XIIUNIT,IERR)
+ CALL PBOPEN(IIUNIT, HIFILE, 'r', IERR)
+ IF( IERR.NE.0 ) THEN
+ IRLSMB = JPROUTINE + 1
+C
+ IF( KERR.GE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'IRLSMB: PBOPEN return code = ',IERR)
+ CALL INTLOG(JP_ERROR,'IRLSMB: trying to open file',JPQUIET)
+ CALL INTLOG(JP_ERROR, HIFILE(1:IIFILE),JPQUIET)
+ ENDIF
+C
+ IF( KERR.EQ.0 ) CALL INTLOG(JP_FATAL,
+ X 'IRLSMB: Interpolation failed.',JPQUIET)
+ GOTO 900
+ ENDIF
+ XIIUNIT = IIUNIT
+ XHIFILE(1:II) = HIFILE(1:II)
+ NEWFILE(1:1) = 'Y'
+C
+C Just rewind if same file still in use
+C
+ ELSE
+ IIUNIT = XIIUNIT
+ NEWFILE(1:1) = 'N'
+ ENDIF
+C
+C See if first time through or output land sea mask filename has
+C changed since last access
+C
+ II = JINDEX(HOFILE)
+ IF( XHOFILE(1:II).NE.HOFILE(1:II) ) THEN
+C
+C Open output land sea mask file
+C
+ IF(XIOUNIT.NE.0) CALL PBCLOSE(XIOUNIT,IERR)
+ CALL PBOPEN(IOUNIT, HOFILE, 'r', IERR)
+ IF( IERR.NE.0 ) THEN
+ IRLSMB = JPROUTINE + 1
+C
+ IF( KERR.GE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'IRLSMB: PBOPEN return code = ',IERR)
+ CALL INTLOG(JP_ERROR,'IRLSMB: trying to open file',JPQUIET)
+ CALL INTLOG(JP_ERROR, HOFILE(1:IOFILE),JPQUIET)
+ ENDIF
+C
+ IF( KERR.EQ.0 ) CALL INTLOG(JP_FATAL,
+ X 'IRLSMB: Interpolation failed.',JPQUIET)
+ GOTO 900
+ ENDIF
+ XIOUNIT = IOUNIT
+ XHOFILE(1:II) = HOFILE(1:II)
+ NEWFILE(2:2) = 'Y'
+C
+C Just rewind if same file still in use
+C
+ ELSE
+ IOUNIT = XIOUNIT
+ NEWFILE(2:2) = 'N'
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Calculate arrays of weights
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IRLSMB: Section 3.',JPQUIET)
+C
+ IPR = KPR
+C
+ DO JOLAT = 1, NONS
+C
+ INDEXN = ( (JOLAT - 1) * 2 + JP_I_N - 1) * NOWE + 1
+ INDEXS = ( (JOLAT - 1) * 2 + JP_I_S - 1) * NOWE + 1
+C
+C Get line for output array
+C
+ IF( OOSTAND ) THEN
+C
+ IOFF = (KOLINE(JPNORTH) + (JOLAT - 1) * KOGRID(JPNSSTEP)
+ X - 1) * KOREC
+C
+ MSKFILE(2:2) = 'O'
+ MSKFILE(1:1) = NEWFILE(2:2)
+ IERR = IGLSMST(IOUNIT, IOFF, NOWE, KOLINE(JPWEST),
+ X KOGRID(JPWESTEP), KOREC, MOLSM, MSKFILE)
+ NEWFILE(2:2) = 'N'
+C
+ ELSE
+ IERR = IGLSM01(IOUNIT, NOWE, MOLONG, MOLATG(JOLAT),
+ X MEXPAND, KOREC, MOLSM)
+ ENDIF
+C
+ IF( IERR.GT.0 ) THEN
+ IRLSMB = IERR
+ GOTO 900
+ ENDIF
+C
+ ILATN = MNSIND(JP_I_N, JOLAT)
+ ILATS = MNSIND(JP_I_S, JOLAT)
+C
+ ILINEN = MILLEN(ILATN)
+ ISTRIDEN = JP360 / ILINEN
+C
+ ILINES = MILLEN(ILATS)
+ ISTRIDES = JP360 / ILINES
+C
+ IZERO = 0
+C
+C Get lines for input array
+C
+ IF( OISTAND ) THEN
+C
+ MSKFILE(2:2) = 'I'
+ MSKFILE(1:1) = NEWFILE(1:1)
+ IERR = IGLSMST(IIUNIT, MISTRT(ILATN) - 1, ILINEN,
+ X KILINE(JPWEST), KIGRID(JPWESTEP), ILINEN,
+ X MILSM(1, JP_I_N), MSKFILE)
+ NEWFILE(1:1) = 'N'
+C
+ IF( IERR.GT.0 ) THEN
+ IRLSMB = IERR
+ GOTO 900
+ ENDIF
+C
+ MSKFILE(2:2) = 'I'
+ MSKFILE(1:1) = NEWFILE(1:1)
+ IERR = IGLSMST(IIUNIT, MISTRT(ILATS) - 1, ILINES,
+ X KILINE(JPWEST), KIGRID(JPWESTEP), ILINES,
+ X MILSM(1, JP_I_S), MSKFILE)
+ NEWFILE(1:1) = 'N'
+C
+ ELSE
+C
+ DO JLON = 0, ILINEN - 1
+ MILONG(JLON + 1) = ISTRIDEN * JLON
+ ENDDO
+C
+ IERR = IGLSM01(IIUNIT, ILINEN, MILONG, MILATG(ILATN),
+ X MEXPAND, KIREC, MILSM(1, JP_I_N))
+C
+ IF( IERR.GT.0 ) THEN
+ IRLSMB = IERR
+ GOTO 900
+ ENDIF
+C
+ DO JLON = 0, ILINES - 1
+ MILONG(JLON + 1) = ISTRIDES * JLON
+ ENDDO
+C
+ IERR = IGLSM01(IIUNIT, ILINES, MILONG, MILATG(ILATS),
+ X MEXPAND, KIREC, MILSM(1, JP_I_S))
+C
+ ENDIF
+C
+ IF( IERR.GT.0 ) THEN
+ IRLSMB = IERR
+ GOTO 900
+ ENDIF
+C
+C Now modify the unormalised weight for land-sea mask
+C
+ IERR = IGLSMR(MILSM(1, JP_I_N), MILSM(1, JP_I_S),
+ X MOLSM, MWEIND(1, INDEXN), MWEIND(1, INDEXS), NOWE,
+ X WFACT(1,(JOLAT - 1) * NOWE + 1), IPR, KERR)
+C
+ IF( IERR.GT.0 ) THEN
+ IRLSMB = IERR
+ GOTO 900
+ ENDIF
+C
+ IPR = KPR - 1
+C
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return to calling routine. Format statements
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( KPR.GE.1 ) CALL INTLOG(JP_DEBUG,'IRLSMB: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/irprec.F b/interpolation/irprec.F
new file mode 100755
index 0000000..208f9d0
--- /dev/null
+++ b/interpolation/irprec.F
@@ -0,0 +1,301 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IRPREC (PIFELD, KSTART, KINS, POFELD, KOWE,
+ 1 KONS, KWEIND, KNSIND, PWFACT, PMAX, PINPNT, KPR, KERR)
+C
+C---->
+C**** *IRPREC*
+C
+C PURPOSE
+C _______
+C
+C Perform additional interpolation processes for precipitation
+C fields when the input field is quasi regular.
+C
+C INTERFACE
+C _________
+C
+C IERR = IRPREC (PIFELD, KSTART, KINS, POFELD, KOWE, KONS,
+C 1 KWEIND, KNSIND, PWFACT, PMAX, PINPNT, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C PIFELD - The input field provided by the calling routine.
+C
+C KSTART - The array offset for each line of latitude within
+C the quasi regular field.
+C
+C KINS - The number of points in the North-South direction
+C in the input field.
+C
+C POFELD - The output field as previously calculated.
+C
+C KOWE - The number of points in the West-East direction in
+C the output field.
+C
+C KONS - The number of points in the North-South direction
+C in the output field.
+C
+C KWEIND - This array contains the array offsets of the West
+C and East points in the input array required for
+C interpolation.
+C
+C KNSIND - This array contains the array offsets of the North
+C and South points in the input array required for
+C interpolation.
+C
+C PWFACT - The array of interpolating weights to the four
+C neighbouring points for every output point.
+C
+C PMAX - Work array used to aid vectorisation.
+C
+C PINPNT - Work array used to aid vectorisation.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C POFELD - The output field as modified to allow for
+C precipitation.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C INTLOG(R) - Logs messages.
+C CHKPREC - Check if precipitation threshold has been redefined
+C
+C METHOD
+C ______
+C
+C The precipitation at a point is set to zero in the following
+C circumstances.
+C
+C 1 The interpolated precipitation is less than a threshold value.
+C
+C 2 There is no precipitation at the neighbouring point with the
+C highest interpolating weight.
+C
+C NOTE that this operation is performed before the special
+C routines for the poles when interpolating from quasi regular
+C Gaussian grids to global latitude/longitude fields. The polar
+C values for precipitation, during such interpolations, will
+C always be the average value of the nearest Gaussian line with
+C no threshold check.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 3 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Nov 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+C
+C Dummy arguments
+ INTEGER KOWE, KINS, KONS, KPR, KERR
+ INTEGER KSTART (KINS)
+ INTEGER KWEIND (2, KOWE, 2, KONS), KNSIND (2, KONS)
+ REAL PIFELD (*), POFELD (KOWE, KONS)
+ REAL PWFACT (4, KOWE, KONS)
+ REAL PMAX (KOWE), PINPNT (KOWE)
+C
+C Local variables
+ LOGICAL LAT_RAIN
+ INTEGER ILAT, IDIR, ISTART
+ INTEGER JOLAT, JOLON, JNS, JWE
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 23500)
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRPREC: Section 1.',JPQUIET)
+C
+ IRPREC = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IRPREC: No. of input fld lats = ',KINS)
+ CALL INTLOG(JP_DEBUG,'IRPREC: No. of output fld lats = ',KONS)
+ CALL INTLOG(JP_DEBUG,'IRPREC: No. of output fld longs = ',KOWE)
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. eliminate output precipitation based on
+C interpolation threshhold
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRPREC: Section 2.',JPQUIET)
+C
+ CALL CHKPREC()
+C
+ DO 360 JOLAT = 1, KONS
+C
+ LAT_RAIN = .FALSE.
+C
+ DO 210 JOLON = 1, KOWE
+C
+ IF (POFELD (JOLON, JOLAT) .LT. ZPRECIP) THEN
+ POFELD (JOLON, JOLAT) = PPZERO
+ ELSE
+ LAT_RAIN = .TRUE.
+ ENDIF
+C
+ 210 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 3. eliminate output precipitation based on
+C "nearest" point.
+C
+C Do not bother if there is no precipitation on this
+C line of latitude
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF (KPR .GE. 1 .AND. JOLAT .EQ. 1)
+ X CALL INTLOG(JP_DEBUG,'IRPREC: Section 3.',JPQUIET)
+C
+C
+ IF (LAT_RAIN) THEN
+C
+ DO 310 JOLON = 1, KOWE
+C
+ PMAX (JOLON) = PPZERO
+C
+ 310 CONTINUE
+C
+ DO 340 JNS = 1, 2
+C
+ ILAT = KNSIND (JNS, JOLAT)
+ ISTART = KSTART (ILAT) - 1
+C
+ DO 330 JWE = 1, 2
+C
+ IDIR = (JNS - 1) * 2 + JWE
+C
+ DO 320 JOLON = 1, KOWE
+C
+ IF (PWFACT (IDIR, JOLON, JOLAT) .GT.
+ 1 PMAX (JOLON) ) THEN
+C
+ PMAX (JOLON) = PWFACT (IDIR, JOLON, JOLAT)
+C
+ PINPNT (JOLON) = PIFELD (ISTART +
+ 2 KWEIND (JWE, JOLON, JNS, JOLAT) )
+C
+ ENDIF
+C
+ 320 CONTINUE
+C
+ 330 CONTINUE
+C
+ 340 CONTINUE
+C
+ DO 350 JOLON = 1, KOWE
+C
+ IF (PINPNT (JOLON) .LT. ZPRECIP)
+ 1 POFELD (JOLON, JOLAT) = PPZERO
+C
+ 350 CONTINUE
+C
+ ENDIF
+C
+ 360 CONTINUE
+C
+C _______________________________________________________
+C
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRPREC: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/irscan.F b/interpolation/irscan.F
new file mode 100755
index 0000000..de4ed0b
--- /dev/null
+++ b/interpolation/irscan.F
@@ -0,0 +1,306 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IRSCAN (PMAT, KLEN, KLLEN, KNNS, KSCAN, KPR,
+ 1 KERR)
+C
+C---->
+C**** *IRSCAN*
+C
+C PURPOSE
+C _______
+C
+C This routine transforms a field between the specified external
+C scanning mode and a standard internal scanning mode where the
+C array represents a quasi regular field.
+C
+C INTERFACE
+C _________
+C
+C IERR = IRSCAN (PMAT, KLEN, KLLEN, KNNS, KSCAN, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C PMAT - The input matrix of length (KLEN).
+C
+C KLEN - The number of points in the matrix.
+C
+C KLLEN - This array contains the quasi regular Gaussian
+C line length definitions.
+C
+C KNNS - The number of points in the North-South direction.
+C
+C KSCAN - A standard GRIB byte variable with bits 1 to 3
+C separately significant. This means that the final
+C value is the sum of the bit settings.
+C
+C 128 , Set if points scan East to West.
+C 64 , Set if points scan South to North.
+C 32 , Set if points in the North South direction
+C are consecutive.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C PMAT - The transposed matrix.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C 7201 The scanning mode was not in the range 0 to 255.
+C 7202 A scanning mode with consecutive values in the North
+C South direction was requested. This is not compatible
+C with a quasi regular Gaussian field.
+C 7203 The total number of points given by the array KLLEN was
+C not equal to KLEN.
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C IRLREV - Routine to reverse the elements within each row
+C or each column of a quasi regular Gaussian field.
+C INTLOG - Logs messages.
+C
+C METHOD
+C ______
+C
+C KSCAN = 128 is implemented by swapping elements within each
+C column of the matrix.
+C
+C KSCAN = 64 is implemented by reversing the order of the columns.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 2 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Jan 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Dummy arguments
+C
+ INTEGER KLEN, KNNS, KSCAN, KPR, KERR
+C
+ INTEGER KLLEN (KNNS)
+C
+ REAL PMAT (KLEN)
+C
+C Local variables
+C
+ LOGICAL GNSMOD, GWEMOD, GTRMOD
+C
+ INTEGER ISCAN, IDIR, ITOTAL, IERR
+C
+ INTEGER JSTEP
+C
+ INTEGER JPROUTINE
+C
+ PARAMETER (JPROUTINE = 7200)
+C
+C External functions
+C
+ INTEGER IRLREV
+C
+C _______________________________________________________
+C
+C
+C* Section 1. Initialisation - Evaluate scan modes
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IRSCAN: Section 1.',JPQUIET)
+C
+ IRSCAN = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IRSCAN: Input parameters',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IRSCAN: Total length of matrix is ',KLEN)
+ CALL INTLOG(JP_DEBUG,'IRSCAN: Latitude lines are ',KNNS)
+ CALL INTLOG(JP_DEBUG,'IRSCAN: Scan mode is ',KSCAN)
+ ENDIF
+C
+ IF (KSCAN .LT. 0 .OR. KSCAN .GE. 256) THEN
+ IRSCAN = JPROUTINE + 1
+ IF (KERR .GE. 0) CALL INTLOG(JP_ERROR,
+ X 'IRSCAN: Scan mode is not in range 0 to 255 = ',KSCAN)
+ IF (KERR .EQ. 0) CALL INTLOG(JP_FATAL,
+ X 'IRSCAN: Interpolation fails.',IRSCAN)
+ GO TO 900
+ ENDIF
+C
+C Zero KSCAN means no transformation
+C
+ IF (KSCAN .EQ. 0) GO TO 900
+C
+ ISCAN = KSCAN
+ GWEMOD = .FALSE.
+ GNSMOD = .FALSE.
+C
+ IF (ISCAN .GE. 128) THEN
+ ISCAN = ISCAN - 128
+ GWEMOD = .TRUE.
+ ENDIF
+C
+ IF (ISCAN .GE. 64) THEN
+ ISCAN = ISCAN - 64
+ GNSMOD = .TRUE.
+ ENDIF
+C
+ GTRMOD = ISCAN .GE. 32
+C
+ IF (GTRMOD) THEN
+ IRSCAN = JPROUTINE + 2
+ IF (KERR .GE. 0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IRSCAN: scan mode wants consecutive N to S points',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'IRSCAN: Not feasible for a quasi regular grid',JPQUIET)
+ IF (KERR .EQ. 0) CALL INTLOG(JP_FATAL,
+ X 'IRSCAN: Interpolation fails.',IRSCAN)
+ ENDIF
+ GO TO 900
+ ENDIF
+C
+ ITOTAL = 0
+C
+ DO 110 JSTEP = 1, KNNS
+ ITOTAL = ITOTAL + KLLEN (JSTEP)
+ 110 CONTINUE
+C
+ IF (ITOTAL .NE. KLEN) THEN
+ IRSCAN = JPROUTINE + 3
+ IF (KERR .GE. 0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IRSCAN: Array length provided = ',KLEN)
+ CALL INTLOG(JP_ERROR,
+ X 'IRSCAN: not equal to sum of line lengths = ',ITOTAL)
+ IF (KERR .EQ. 0) CALL INTLOG(JP_FATAL,
+ X 'IRSCAN: Interpolation fails.',IRSCAN)
+ ENDIF
+ GO TO 900
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Any field as order is unimportant
+C
+C Potential operations in order are
+C
+C 1 Modify West East mode
+C 2 Modify North South mode
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IRSCAN: Section 2.',JPQUIET)
+C
+ IF (GWEMOD) THEN
+C
+ IDIR = 1
+C
+ IERR = IRLREV (PMAT, KLEN, KLLEN, KNNS, IDIR, KPR)
+C
+ IF (IERR .GT. 0) THEN
+ IRSCAN = IERR
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ IF (GNSMOD) THEN
+C
+ IDIR = 2
+C
+ IERR = IRLREV (PMAT, KLEN, KLLEN, KNNS, IDIR, KPR)
+C
+ IF (IERR .GT. 0) THEN
+ IRSCAN = IERR
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR .GE. 1) CALL INTLOG(JP_DEBUG,'IRSCAN: Section 9.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/irsize.F b/interpolation/irsize.F
new file mode 100755
index 0000000..79867dd
--- /dev/null
+++ b/interpolation/irsize.F
@@ -0,0 +1,396 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION IRSIZE (KGTRUNC, KAREA, KLLEN, KNWE, KNNS, KLN,
+ 1 KTOTAL, PGAUSS, OWEGLOBE, ONPOLE, OSPOLE, KPR, KERR)
+C
+C---->
+C**** *IRSIZE*
+C
+C PURPOSE
+C _______
+C
+C Evaluate the array sizes for a quasi regular Gaussian field.
+C
+C INTERFACE
+C _________
+C
+C IERR = IRSIZE (KGTRUNC, KAREA, KLLEN, KNWE, KNNS, KLN,
+C 1 KTOTAL, PGAUSS, OWEGLOBE, ONPOLE, OSPOLE, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C KGTRUNC - The Gaussian truncation.
+C
+C KAREA - The field area definition (N, W, S, E) provided by
+C the calling routine.
+C
+C KLLEN - This array contains the quasi regular Gaussian
+C line length definition.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C KNWE - The maximum number of points in the West-East
+C direction for this quasi regular Gaussian grid.
+C
+C KNNS - The number of points in the North-South direction
+C in the field.
+C
+C KLN - The Northern Gaussian latitude number for this
+C area.
+C
+C KTOTAL - The total field length for this quasi regular
+C Gaussian grid and area.
+C
+C PGAUSS - The full list of Gaussian latitudes for this
+C truncation.
+C
+C OWEGLOBE - This variable will be true if the array of
+C longitudes spans the globe.
+C
+C ONPOLE - This variable will be true if the North polar line
+C of latitude is included in the grid.
+C
+C OSPOLE - This variable will be true if the South polar line
+C of latitude is included in the grid.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C 23801 A non-global area was requested and this option is not
+C supported yet.
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C IGGLAT - Compute Gaussian lines of latitude for a given
+C truncation.
+C INTLOG(R) - Logs messages.
+C
+C METHOD
+C ______
+C
+C
+C A global definition is generated for the quasi regular field
+C and all three flag variable are set TRUE.
+C
+C A REAL array of the full set of Gaussian latitudes is generated
+C for the Gaussian truncation requested.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 4 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Nov 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Dummy arguments
+ LOGICAL OWEGLOBE, ONPOLE, OSPOLE
+ INTEGER KGTRUNC, KNWE, KNNS, KLN, KTOTAL, KPR, KERR
+ INTEGER KAREA (4), KLLEN (*)
+ REAL PGAUSS (*)
+C
+C Local variables
+ LOGICAL GZERO
+ INTEGER IGAUSS, ILATNUM, ILS, INDIST, ISDIST, IERR
+ INTEGER JLAT
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 23800)
+C
+C Function externals
+C
+ INTEGER IGGLAT
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRSIZE: Section 1.',JPQUIET)
+C
+ IRSIZE = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IRSIZE: Input parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'IRSIZE: Gaussian truncation = ',KGTRUNC)
+ IF (KNNS .NE. 0) CALL INTLOG(JP_DEBUG,
+ X 'IRSIZE: No.lat. pts = ',KNNS)
+C
+ CALL INTLOG(JP_DEBUG,'IRSIZE: Area North = ', KAREA(1))
+ CALL INTLOG(JP_DEBUG,'IRSIZE: Area West = ', KAREA(2))
+ CALL INTLOG(JP_DEBUG,'IRSIZE: Area South = ', KAREA(3))
+ CALL INTLOG(JP_DEBUG,'IRSIZE: Area East = ', KAREA(4))
+ ENDIF
+C
+ GZERO = .FALSE.
+C
+ ILATNUM = KGTRUNC * 2
+C
+C _______________________________________________________
+C
+C* Section 2. If all elements of KAREA are zero generate
+C a global field
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRSIZE: Section 2.',JPQUIET)
+C
+Cxxx IF (KAREA (JPEAST) .NE. 0 .OR. KAREA (JPWEST) .NE. 0) THEN
+C
+Cxxx IRSIZE = JPROUTINE + 1
+Cxxx IF (KERR .GE. 0) WRITE (*, 9001) IRSIZE,
+Cxxx 1 REAL (KAREA (JPNORTH) ) / PPMULT,
+Cxxx 2 REAL (KAREA (JPWEST) ) / PPMULT,
+Cxxx 3 REAL (KAREA (JPSOUTH) ) / PPMULT,
+Cxxx 4 REAL (KAREA (JPEAST) ) / PPMULT
+Cxxx IF (KERR .EQ. 0) CALL ABORTX ('IRSIZE')
+Cxxx GO TO 900
+Cxxx ENDIF
+C
+ OWEGLOBE = .TRUE.
+C
+C _______________________________________________________
+C
+C* Section 3. Generate points along a line of meridian
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRSIZE: Section 3.',JPQUIET)
+C
+C Generate full Gaussian latitudes for this truncation
+C
+ IERR = IGGLAT (ILATNUM, PGAUSS, KPR, KERR)
+C
+ IF (IERR .GT. 0) THEN
+ IRSIZE = IERR
+ GO TO 900
+ ENDIF
+C
+C Find Gaussian lines corresponding to North and South points
+C provided
+C
+ KLN = 1
+ ILS = ILATNUM
+C
+ IF (KNNS .EQ. 0) THEN
+C
+C Number of lines not set (output field)
+C
+ KLN = 0
+ ILS = ILATNUM
+C
+ DO 310 JLAT = 2, ILATNUM
+C
+ IGAUSS = NINT (PGAUSS (JLAT) * PPMULT)
+C
+ IF (KLN .EQ. 0 .AND. KAREA (JPNORTH) .GT. IGAUSS) THEN
+ KLN = JLAT - 1
+ KAREA (JPNORTH) = NINT (PGAUSS (KLN) * PPMULT)
+ ENDIF
+C
+ IF (ILS.EQ.ILATNUM .AND. KAREA(JPSOUTH).GE.IGAUSS) THEN
+ ILS = JLAT
+ KAREA (JPSOUTH) = NINT (PGAUSS (ILS) * PPMULT)
+ ENDIF
+C
+ 310 CONTINUE
+C
+ KNNS = ILS - KLN + 1
+C
+ ELSE
+C
+C Number of lines set (input field)
+C
+ JLAT = 1
+ KLN = JLAT
+ ILS = JLAT
+C
+ INDIST = ABS (NINT (PGAUSS (JLAT) * PPMULT) - KAREA (JPNORTH) )
+ ISDIST = ABS (NINT (PGAUSS (JLAT) * PPMULT) - KAREA (JPSOUTH) )
+C
+ DO 320 JLAT = 2, ILATNUM
+C
+ IF (ABS (NINT (PGAUSS (JLAT) * PPMULT) - KAREA (JPNORTH) )
+ 1 .LT. INDIST) THEN
+C
+ KLN = JLAT
+ INDIST = ABS(NINT(PGAUSS (JLAT) * PPMULT) - KAREA(JPNORTH))
+C
+ ENDIF
+C
+ IF (ABS (NINT (PGAUSS (JLAT) * PPMULT) - KAREA (JPSOUTH) )
+ 1 .LT. ISDIST) THEN
+C
+ ILS = JLAT
+ ISDIST = ABS(NINT(PGAUSS(JLAT) * PPMULT) - KAREA(JPSOUTH))
+C
+ ENDIF
+C
+ 320 CONTINUE
+C
+ IF (KNNS .NE. ILS - KLN + 1) THEN
+ IRSIZE = JPROUTINE + 2
+ IF (KERR .GE. 0) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'IRSIZE: No. lines specified = ',KNNS)
+ CALL INTLOG(JP_ERROR,
+ X 'IRSIZE: Gaussian N limit = ',KLN)
+ CALL INTLOG(JP_ERROR,
+ X 'IRSIZE: Gaussian S limit = ',ILS)
+ ENDIF
+C
+ IF (KERR .EQ. 0) CALL INTLOG(JP_FATAL,
+ X 'IGLSIZE: Interpolation failed.',IRSIZE)
+ GO TO 900
+ ENDIF
+C
+ ENDIF
+C
+ ONPOLE = KLN .EQ. 1
+ OSPOLE = ILS .EQ. ILATNUM
+C
+ KNNS = ILS - KLN + 1
+C
+ KAREA (JPNORTH) = NINT (PGAUSS (KLN) * PPMULT)
+ KAREA (JPSOUTH) = NINT (PGAUSS (ILS) * PPMULT)
+C
+C _______________________________________________________
+C
+C* Section 4. Use line lengths to set maximum length and total
+C _______________________________________________________
+C
+ 400 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRSIZE: Section 4.',JPQUIET)
+C
+ KNWE = KLLEN (KGTRUNC)
+C
+ KTOTAL = 0
+C
+ DO 410 JLAT = KLN, ILS
+C
+ KTOTAL = KTOTAL + KLLEN (JLAT)
+C
+ 410 CONTINUE
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'IRSIZE: Output parameters.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'IRSIZE: Max W-E line len = ',KNWE)
+ CALL INTLOG(JP_DEBUG,'IRSIZE: No lat lines = ',KNNS)
+ CALL INTLOG(JP_DEBUG,'IRSIZE: Total no.pts = ',KTOTAL)
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: Northern line no. =',KLN)
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: Southern line no. =',ILS)
+C
+ IF( OWEGLOBE ) THEN
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: W-E fld is global',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: W-E fld is NOT global',JPQUIET)
+ ENDIF
+C
+ IF( ONPOLE ) THEN
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: N pole is in fld.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: N pole is NOT in fld.',JPQUIET)
+ ENDIF
+C
+ IF( OSPOLE ) THEN
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: S pole is in fld.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,'IGLSIZE: S pole is NOT in fld.',JPQUIET)
+ ENDIF
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRSIZE: Section 9.',JPQUIET)
+C
+C9001 FORMAT (' IRSIZE ERROR', I6, ' - One of the area limits is ',
+C 1 'non-zero.' / 22X, 'They are', 4F10.4)
+C
+ RETURN
+ END
diff --git a/interpolation/iscrsz.F b/interpolation/iscrsz.F
new file mode 100755
index 0000000..6496092
--- /dev/null
+++ b/interpolation/iscrsz.F
@@ -0,0 +1,200 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION ISCRSZ()
+C---->
+C**** ISCRSZ
+C
+C Purpose
+C -------
+C
+C Calculate size of scratch space required for output field of
+C interpolation.
+C
+C
+C Interface
+C ---------
+C
+C ISIZE = ISCRSZ()
+C
+C
+C Input
+C -----
+C
+C Values in common blocks "nofld.common".
+C
+C
+C Output
+C ------
+C
+C Size as number of values (words).
+C Returns 0 if output type not recognised.
+C
+C
+C Method
+C ------
+C
+C Depends on output grid type.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message
+C JNORSGG - Calculate gaussian latitude
+C NUMPTWE - Calculate number of grid pts in range from west to east
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Feb 1995
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+C
+C Local variables
+C
+ INTEGER LOOP
+ REAL PNORTH, PWEST, PSOUTH, PEAST, GRID, TEMP
+C
+C Externals
+C
+ EXTERNAL JNORSGG, NUMPTWE
+ INTEGER JNORSGG, NUMPTWE
+C
+C Statement functions
+C
+ REAL X, Y
+ LOGICAL SOUTHOF
+ SOUTHOF(X,Y) = ((X) - (Y)).GT.-1E-4
+C
+C -----------------------------------------------------------------|
+C Section 1. Initialise.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ ISCRSZ = 0
+C
+C -----------------------------------------------------------------|
+C* Section 2. Spherical harmonic field
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( (NOREPR.EQ.JPSPHERE).OR.
+ X (NOREPR.EQ.JPSTRSH).OR.
+ X (NOREPR.EQ.JPSPHROT) ) THEN
+cs ISCRSZ = (NORESO+1) * (NORESO+4)
+ ISCRSZ = (NORESO+1) * (NORESO+2)
+ CALL INTLOG(JP_DEBUG,'ISCRSZ: spherical harmonic',JPQUIET)
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Regular lat/long field
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( (NOREPR.EQ.JPREGULAR).OR.(NOREPR.EQ.JPREGROT) ) THEN
+C
+ TEMP = ABS(FLOAT(NOAREA(1)) - FLOAT(NOAREA(3)))
+ NONS = NINT( TEMP / FLOAT(NOGRID(2)) ) + 1
+ TEMP = FLOAT(NOAREA(4)) - FLOAT(NOAREA(2))
+ NOWE = NINT( TEMP / FLOAT(NOGRID(1)) ) + 1
+C
+ ISCRSZ = NONS * NOWE
+ CALL INTLOG(JP_DEBUG,'ISCRSZ: number of latitudes = ', NONS)
+ CALL INTLOG(JP_DEBUG,'ISCRSZ: number of longitudes = ', NOWE)
+ CALL INTLOG(JP_DEBUG,'ISCRSZ: Regular lat/long',JPQUIET)
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4. Regular gaussian field
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ IF( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPFGGROT) ) THEN
+C
+ PNORTH = FLOAT( NOAREA(1) ) / PPMULT
+ PSOUTH = FLOAT( NOAREA(3) ) / PPMULT
+ NO1NS = JNORSGG( PNORTH, ROGAUSS, NOGAUSS, 1)
+ NONS = JNORSGG( PSOUTH, ROGAUSS, NOGAUSS, 1) - NO1NS + 1
+ TEMP = FLOAT(NOAREA(4)) - FLOAT(NOAREA(2))
+ TEMP = (TEMP * FLOAT(NOGAUSS) ) / FLOAT(JP90)
+ NOWE = NINT(TEMP) + 1
+CS added for grib2
+ IF(NONS.EQ.NOGAUSS*2.AND.NOAREA(2).EQ.0) THEN
+ LGLOBL = .TRUE.
+ ENDIF
+C
+ ISCRSZ = NONS * NOWE
+ CALL INTLOG(JP_DEBUG,'ISCRSZ: number of latitudes = ', NONS)
+ CALL INTLOG(JP_DEBUG,'ISCRSZ: number of longitudes = ', NOWE)
+ CALL INTLOG(JP_DEBUG,'ISCRSZ: regular gaussian',JPQUIET)
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 5. Reduced (quasi-regular) gaussian field
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+ IF( (NOREPR.EQ.JPQUASI).OR.(NOREPR.EQ.JPQGGROT) ) THEN
+C
+ PNORTH = FLOAT( NOAREA(1) ) / PPMULT
+ PWEST = FLOAT( NOAREA(2) ) / PPMULT
+ PSOUTH = FLOAT( NOAREA(3) ) / PPMULT
+ PEAST = FLOAT( NOAREA(4) ) / PPMULT
+ NO1NS = JNORSGG( PNORTH, ROGAUSS, NOGAUSS, 1)
+ NONS = JNORSGG( PSOUTH, ROGAUSS, NOGAUSS, 1) - NO1NS + 1
+CS added for grib2
+ IF(NONS.EQ.NOGAUSS*2.AND.NOAREA(2).EQ.0) THEN
+ LGLOBL = .TRUE.
+ ENDIF
+ NOWE = 0
+C
+ NOPCNT = 0
+ DO LOOP = 1, NOGAUSS*2
+ IF( SOUTHOF(PNORTH,ROGAUSS(LOOP)).AND.
+ X SOUTHOF(ROGAUSS(LOOP),PSOUTH) ) THEN
+ GRID = 360.0 / REAL(NOLPTS(LOOP))
+ NOPCNT = NOPCNT + NUMPTWE(PWEST,PEAST,GRID)
+ ENDIF
+ ENDDO
+C
+ ISCRSZ = NOPCNT
+ CALL INTLOG(JP_DEBUG,'ISCRSZ: number of latitudes = ', NONS)
+ CALL INTLOG(JP_DEBUG,'ISCRSZ: quasi-regular gaussian',JPQUIET)
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'ISCRSZ: number of points in output field = ',ISCRSZ)
+C
+ RETURN
+ END
diff --git a/interpolation/islproc.F b/interpolation/islproc.F
new file mode 100755
index 0000000..0b79f89
--- /dev/null
+++ b/interpolation/islproc.F
@@ -0,0 +1,290 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ REAL FUNCTION ISLPROC(RLAT,RLON,NEWTYPE,OLAT,OLON,TYPE,PT,OLDFLD)
+C
+C---->
+C**** ISLPROC
+C
+C Purpose
+C -------
+C
+C Generates a new field point from its four nearest neighbours
+C taking account of matching land-sea mask types.
+C
+C
+C Interface
+C ---------
+C
+C VALUE = ISLPROC(RLAT,RLON,NEWTYPE,OLAT,OLON,TYPE,PT,OLDFLD)
+C
+C Input
+C -----
+C
+C RLAT - Latitude of the new point
+C RLON - Longitude of the new point
+C NEWTYPE - Land-sea mask type of the new point (land/sea)
+C OLAT - Latitudes of the four neighbouring points
+C OLON - Longitudes of the four neighbouring points
+C TYPE - Land-sea mask types of the four neighbouring points
+C PT - Positions in old field array of the four neighbours
+C OLDFLD - Array of old field values
+C
+C
+C Output
+C ------
+C
+C Function returns a value for the new field point.
+C
+C
+C Method
+C ------
+C
+C Find which neighbours have same land-sea mask type and use
+C them to calculate a new value by bi-linear interpolation.
+C
+C Use all four neighbours if none of them have the same
+C land-sea mask type as the new point.
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF August 2000
+C
+C Modifications
+C -------------
+C
+C Force nearest neighbour processing with env variable or
+C INTOUT parameter
+C S.Curic ECMWF September 2005
+C
+
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ REAL RLAT,RLON,OLAT(2),OLON(4),OLDFLD(*)
+ INTEGER NEWTYPE,TYPE(4),PT(4)
+C
+#include "intisl.h"
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Local variables
+C
+ LOGICAL LVEGGY
+ CHARACTER*12 YFLAG
+ INTEGER MCOUNT, COUNT, LOOP, NEAREST
+ REAL WEIGHT(4), MATCH(4), NWEIGHT, SWEIGHT, NORMAL
+C
+C -----------------------------------------------------------------|
+C* Section 1. Find which neighbours have same land-sea mask type
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ COUNT = 0
+ DO LOOP = 1, 4
+ IF( TYPE(LOOP).EQ.NEWTYPE ) THEN
+ COUNT = COUNT + 1
+ MATCH(LOOP) = 1.0
+ ELSE
+ MATCH(LOOP) = 0.0
+ ENDIF
+ ENDDO
+C
+ IF( COUNT.EQ.0 ) THEN
+C
+C Use all four neighbours if none of them have the same
+C land-sea mask type as the new point
+C
+ COUNT = 4
+ DO LOOP = 1, 4
+ MATCH(LOOP) = 1.0
+ ENDDO
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Handle case when missing values are present
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Identify matching neighbours with missing values
+C
+ IF( LIMISSV ) THEN
+ MCOUNT = 0
+ DO LOOP = 1, 4
+ IF((MATCH(LOOP).EQ.1.0).AND.(OLDFLD(PT(LOOP)).EQ.RMISSGV))THEN
+ MCOUNT = MCOUNT + 1
+ MATCH(LOOP) = 0.0
+ COUNT = COUNT - 1
+ ENDIF
+ ENDDO
+C
+C Set new value to 'missing' if all neighbours are missing
+C
+ IF( (MCOUNT.EQ.4).OR.(COUNT.EQ.0) ) THEN
+ ISLPROC = RMISSGV
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Use neighbours that match to calculate the new value
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Calculate the north/south weighting values allowing for
+C southern latitude to be same as northern latitude
+C
+ NWEIGHT = OLAT(NORTH) - RLAT
+ SWEIGHT = RLAT - OLAT(SOUTH)
+ IF( SWEIGHT.EQ.0.0 ) NWEIGHT = 1.0
+C
+C Calculate the weighting values for each matching neighbour
+C
+ WEIGHT(NWEST) = ABS((OLON(SEAST) - RLON) * SWEIGHT)
+ WEIGHT(NEAST) = ABS((RLON - OLON(SWEST)) * SWEIGHT)
+ WEIGHT(SWEST) = ABS((OLON(NEAST) - RLON) * NWEIGHT)
+ WEIGHT(SEAST) = ABS((RLON - OLON(NWEST)) * NWEIGHT)
+C
+C Normalise the weights since not all neighbours necessarily used
+C
+ NORMAL = ( WEIGHT(NWEST) * MATCH(NWEST) +
+ X WEIGHT(NEAST) * MATCH(NEAST) +
+ X WEIGHT(SWEST) * MATCH(SWEST) +
+ X WEIGHT(SEAST) * MATCH(SEAST) )
+C
+C Special cases when matching points have no weight
+C
+ IF( NORMAL.EQ.0.0 ) THEN
+C
+C Only one matching neighbour: set its weight so that is used
+C
+ IF( COUNT.EQ.1 ) THEN
+ NORMAL = 1.0
+ IF( MATCH(NWEST).EQ.1.0 ) WEIGHT(NWEST) = 1.0
+ IF( MATCH(NEAST).EQ.1.0 ) WEIGHT(NEAST) = 1.0
+ IF( MATCH(SWEST).EQ.1.0 ) WEIGHT(SWEST) = 1.0
+ IF( MATCH(SEAST).EQ.1.0 ) WEIGHT(SEAST) = 1.0
+C
+C Two matching neighbours: set their weights to those of the
+C neighbours on the opposite side of the interpolation rectangle
+C
+ ELSEIF( COUNT.EQ.2 ) THEN
+ IF( (MATCH(NWEST).EQ.1.0).AND.(MATCH(NEAST).EQ.1.0) ) THEN
+ WEIGHT(NWEST) = WEIGHT(SWEST)
+ WEIGHT(NEAST) = WEIGHT(SWEST)
+ NORMAL = WEIGHT(NWEST) + WEIGHT(NEAST)
+ ELSEIF( (MATCH(NWEST).EQ.1.0).AND.(MATCH(SWEST).EQ.1.0) ) THEN
+ WEIGHT(NWEST) = WEIGHT(NEAST)
+ WEIGHT(SWEST) = WEIGHT(SEAST)
+ NORMAL = WEIGHT(NWEST) + WEIGHT(SWEST)
+ ELSEIF( (MATCH(NEAST).EQ.1.0).AND.(MATCH(SEAST).EQ.1.0) ) THEN
+ WEIGHT(NEAST) = WEIGHT(NWEST)
+ WEIGHT(SEAST) = WEIGHT(SWEST)
+ NORMAL = WEIGHT(NEAST) + WEIGHT(SEAST)
+ ELSEIF( (MATCH(SWEST).EQ.1.0).AND.(MATCH(SEAST).EQ.1.0) ) THEN
+ WEIGHT(SWEST) = WEIGHT(NWEST)
+ WEIGHT(SEAST) = WEIGHT(NEAST)
+ NORMAL = WEIGHT(SWEST) + WEIGHT(SEAST)
+ ELSEIF( (MATCH(NWEST).EQ.1.0).AND.(MATCH(SEAST).EQ.1.0) ) THEN
+ WEIGHT(NWEST) = WEIGHT(NEAST)
+ WEIGHT(SEAST) = WEIGHT(SWEST)
+ NORMAL = WEIGHT(NWEST) + WEIGHT(SEAST)
+ ELSE
+ WEIGHT(NEAST) = WEIGHT(SEAST)
+ WEIGHT(SWEST) = WEIGHT(NWEST)
+ NORMAL = WEIGHT(NEAST) + WEIGHT(SWEST)
+ ENDIF
+C
+C Three matching neighbours with no weight, ie the interpolation
+C point is coincident with a grid point, but the land-sea masks
+C disagree about its type. Use it anyway.
+C
+ ELSE
+ IF( MATCH(NWEST).EQ.0.0 ) THEN
+ MATCH(NWEST) = 1.0
+ NORMAL = WEIGHT(NWEST)
+ ELSE IF( MATCH(NEAST).EQ.0.0 ) THEN
+ MATCH(NEAST) = 1.0
+ NORMAL = WEIGHT(NEAST)
+ ELSE IF( MATCH(SWEST).EQ.0.0 ) THEN
+ MATCH(SWEST) = 1.0
+ NORMAL = WEIGHT(SWEST)
+ ELSE
+ MATCH(SEAST) = 1.0
+ NORMAL = WEIGHT(SEAST)
+ ENDIF
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4. Interpolate
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ WEIGHT(NWEST) = WEIGHT(NWEST)/NORMAL
+ WEIGHT(NEAST) = WEIGHT(NEAST)/NORMAL
+ WEIGHT(SWEST) = WEIGHT(SWEST)/NORMAL
+ WEIGHT(SEAST) = WEIGHT(SEAST)/NORMAL
+C
+C Use nearest neighbour for vegetation field
+C
+ LVEGGY = (NITABLE.EQ.128).AND.
+ X ((NIPARAM.EQ.27).OR.
+ X (NIPARAM.EQ.28).OR.
+ X (NIPARAM.EQ.29).OR.
+ X (NIPARAM.EQ.30).OR.
+ X (NIPARAM.EQ.43) )
+C Force nearest neighbour processing with env variable
+ CALL GETENV('NEAREST_NEIGHBOUR', YFLAG)
+ IF( YFLAG(1:1).EQ.'1' ) LVEGGY = .TRUE.
+
+C Force nearest neighbour processing with INTOUT parameter
+ IF( LMETHOD ) LVEGGY = .TRUE.
+
+C
+ IF( LVEGGY ) THEN
+ NEAREST = NWEST
+ IF( WEIGHT(NEAST).GT.WEIGHT(NEAREST) ) NEAREST = NEAST
+ IF( WEIGHT(SWEST).GT.WEIGHT(NEAREST) ) NEAREST = SWEST
+ IF( WEIGHT(SEAST).GT.WEIGHT(NEAREST) ) NEAREST = SEAST
+ ISLPROC = OLDFLD(PT(NEAREST))
+C
+ ELSE
+C
+ ISLPROC = ( (OLDFLD(PT(NWEST)) * WEIGHT(NWEST) * MATCH(NWEST)) +
+ X (OLDFLD(PT(NEAST)) * WEIGHT(NEAST) * MATCH(NEAST)) +
+ X (OLDFLD(PT(SWEST)) * WEIGHT(SWEST) * MATCH(SWEST)) +
+ X (OLDFLD(PT(SEAST)) * WEIGHT(SEAST) * MATCH(SEAST)) )
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/issame.F b/interpolation/issame.F
new file mode 100755
index 0000000..f5b91e2
--- /dev/null
+++ b/interpolation/issame.F
@@ -0,0 +1,261 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ LOGICAL FUNCTION ISSAME()
+C
+C---->
+C**** ISSAME
+C
+C Purpose
+C -------
+C
+C Check if output field will be the same as the input field.
+C
+C
+C Interface
+C ---------
+C
+C LSAME = ISSAME()
+C
+C Input
+C -----
+C
+C Values in common block.
+C
+C
+C Output
+C ------
+C
+C Returns .TRUE. if the fields will be the same.
+C
+C
+C Method
+C ------
+C
+C Checks interpolation request flags in common blocks.
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF
+C
+C----<
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+C
+C Local variables
+C
+ INTEGER LOOP, IDIFF
+ LOGICAL LDEFIN, LDEFOUT, LSUBAREA
+ CHARACTER*12 YFLAG
+C
+C -----------------------------------------------------------------|
+C
+ ISSAME = .TRUE.
+C
+C Exit if no postprocessing specified.
+C
+ IF( .NOT.LINTOUT ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'ISSAME: No postprocessing specified.',JPQUIET)
+ RETURN
+ ENDIF
+
+C
+C Set logicals true if default input/output areas specified.
+C
+ LDEFIN = ( (NIAREA(1).EQ.0) .AND. (NIAREA(2).EQ.0) .AND.
+ X (NIAREA(3).EQ.0) .AND. (NIAREA(4).EQ.0) )
+ LDEFOUT = ( (NOAREA(1).EQ.0) .AND. (NOAREA(2).EQ.0) .AND.
+ X (NOAREA(3).EQ.0) .AND. (NOAREA(4).EQ.0) )
+C
+C Set flag if a subarea has been requested
+C
+ LSUBAREA = (.NOT.LDEFIN .AND. .NOT.LDEFOUT) .AND.
+ X ( (NOAREA(1).LT.NIAREA(1)).OR.
+ X (NOAREA(2).GT.NIAREA(2)).OR.
+ X (NOAREA(3).GT.NIAREA(3)).OR.
+ X (NOAREA(4).LT.NIAREA(4)) )
+C
+C
+C Check for rotation
+C
+ IF( (NOROTA(1).NE.0) .OR. (NOROTA(2).NE.0) ) ISSAME = .FALSE.
+C
+C Check for same formats, representation and bit packing accuracy.
+C
+cs IF( NIFORM.NE.NOFORM) ISSAME = .FALSE.
+ IF( NIREPR.NE.NOREPR) ISSAME = .FALSE.
+cs This is used just for processing with gribex
+C Force repacking for different accuracy
+cs IF(LACCUR) THEN
+cs IF( NIACC .NE. NOACC) ISSAME = .FALSE.
+cs ENDIF
+C
+C Exit if both input and output are same (reduced or quasi)
+C gaussian with the same resolution and area, since no
+C postprocessing is required.
+C
+cs IF( (NOREPR.EQ.JPNOTYPE) .AND. (NIGAUSS.EQ.NOGAUSS) .AND.
+cs NOREPR.EQ.NIREPR because NOREPR is always set trough describe input field
+ IF(NOREPR.EQ.JPQUASI) THEN
+ IF( (NOREPR.EQ.NIREPR) .AND. (NIGAUSS.EQ.NOGAUSS)) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'ISSAME: Input and output are same Reduced Gaussian',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'ISSAME: with the same resolution;',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'ISSAME: no postprocessing required.',JPQUIET)
+ ISSAME = .TRUE.
+ RETURN
+ ENDIF
+ ENDIF
+ IF(NOREPR.EQ.JPGAUSSIAN) THEN
+ IF( (NOREPR.EQ.NIREPR) .AND. (NIGAUSS.EQ.NOGAUSS) .AND.
+ X (.NOT.LSUBAREA)) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'ISSAME: Input and output are same Regular Gaussian',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'ISSAME: with the same resolution and area;',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'ISSAME: no postprocessing required.',JPQUIET)
+ ISSAME = .TRUE.
+ RETURN
+ ENDIF
+ ENDIF
+C
+C If input is quasi gaussian and output required to be the same (ie
+C 'gaussian' specified via CALL INTOUT('gaussian', ...) ), change
+C output to regular gaussian unless same resolution requested.
+C
+ IF( (NOREPR.EQ.JPNOTYPE) .AND.
+ X (NIGAUSS.NE.NOGAUSS) ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'ISSAME: Input is quasi gaussian and output required',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'ISSAME: not the same resolution;',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'ISSAME: change output to regular gaussian.',JPQUIET)
+ NOREPR = JPGAUSSIAN
+ ENDIF
+C
+C If input is quasi gaussian and output required to be the same (ie
+C 'gaussian' specified via CALL INTOUT('gaussian', ...) ), change
+C output to regular gaussian if subarea requested.
+C
+ IF( (NOREPR.EQ.JPNOTYPE) .AND. LSUBAREA ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'ISSAME: Input is quasi gaussian and output required',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'ISSAME: has a subarea;',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'ISSAME: change output to regular gaussian.',JPQUIET)
+ NOREPR = JPGAUSSIAN
+ ENDIF
+C
+C Exit if both input and output are regular gaussian with
+C the same resolution and area, since no
+C postprocessing is required.
+C
+ IF( (NIREPR.EQ.JPGAUSSIAN) .AND.
+ X (NOREPR.EQ.JPGAUSSIAN) .AND.
+ X (NIGAUSS.EQ.NOGAUSS) .AND.
+ X (.NOT.LSUBAREA) ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'ISSAME: Input and output are regular gaussian with',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'ISSAME: the same resolution and area;',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'ISSAME: no postprocessing is required.',JPQUIET)
+ RETURN
+ ENDIF
+C
+C If spherical, check for same truncation.
+C
+ IF( (NIREPR.EQ.JPSPHERE) .AND.
+ X (NOREPR.EQ.JPSPHERE) .AND.
+ X (NIRESO.NE.NORESO) ) ISSAME = .FALSE.
+C
+C If lat.long, check for same grid intervals and area.
+C
+ IF( (NIREPR.EQ.JPREGULAR) .AND.
+ X (NOREPR.EQ.JPREGULAR) .AND.
+ X (NOGRID(1).NE.0) ) THEN
+ IF( NIGRID(1).NE.NOGRID(1)) ISSAME = .FALSE.
+ IF( NIGRID(2).NE.NOGRID(2)) ISSAME = .FALSE.
+ ENDIF
+ IF( LSUBAREA ) ISSAME = .FALSE.
+C
+cs IF( (NIREPR.EQ.JPREDLL) .AND.
+cs X (NOREPR.EQ.JPREDLL)
+cs X (NIGRID(2).NE.NOGRID(2)) ) ISSAME = .FALSE.
+C
+C Check if areas are same unless defaults given.
+C
+ IF( (.NOT.LDEFIN) .AND. (.NOT.LDEFOUT) ) THEN
+ IF( (NOGRID(1).NE.0) .OR. (NOGRID(2).NE.0) ) THEN
+C
+ IF( NIAREA(1).NE.NOAREA(1)) ISSAME = .FALSE.
+C
+ IDIFF = NIAREA(2) - NOAREA(2)
+ IF( (IDIFF.NE.0) .AND. (IDIFF.NE.JP360) ) ISSAME = .FALSE.
+C
+ IF( NIAREA(3).NE.NOAREA(3) ) ISSAME = .FALSE.
+C
+ IDIFF = NIAREA(4) - NOAREA(4)
+ IF( (IDIFF.NE.0) .AND. (IDIFF.NE.JP360) ) ISSAME = .FALSE.
+ ENDIF
+ ENDIF
+C
+C If gaussian, check for same grid specification.
+C
+ IF( (NIREPR.EQ.JPGAUSSIAN) .AND. (NOREPR.EQ.JPGAUSSIAN) ) THEN
+ IF( NIGAUSS.NE.NOGAUSS) ISSAME = .FALSE.
+ ENDIF
+ IF( (NIREPR.EQ.JPQUASI) .AND. (NOREPR.EQ.JPQUASI) ) THEN
+ IF( NIGAUSS.NE.NOGAUSS) ISSAME = .FALSE.
+ DO LOOP = 1, NOGAUSS
+ IF( RIGAUSS(LOOP).NE.ROGAUSS(LOOP) ) ISSAME = .FALSE.
+ IF( MILLEN(LOOP).NE.NOLPTS(LOOP) ) ISSAME = .FALSE.
+ ENDDO
+ ENDIF
+C
+C Check for same scanning mode.
+C
+C Sinisa commented scanning mode checking because of UK fields
+c IF( NISCNM.NE.NOSCNM) ISSAME = .FALSE.
+C
+C Check for same table number, parameter number, level number and
+C level type.
+C
+cs IF( NITABLE.NE.NOTABLE) ISSAME = .FALSE.
+cs IF( NIPARAM.NE.NOPARAM) ISSAME = .FALSE.
+cs IF( NILEVEL.NE.NOLEVEL) ISSAME = .FALSE.
+cs IF( NILEVT .NE.NOLEVT ) ISSAME = .FALSE.
+C
+ IF( ISSAME ) RETURN
+C
+C -----------------------------------------------------------------|
+C
+ RETURN
+ END
diff --git a/interpolation/itimer.c b/interpolation/itimer.c
new file mode 100755
index 0000000..ddfd817
--- /dev/null
+++ b/interpolation/itimer.c
@@ -0,0 +1,123 @@
+/**
+* Copyright 1981-2012 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.
+*/
+/* ****************************************************************
+** Name: *func.c*
+** ----
+** Products Generation c functions used by Fortran.
+**
+** D. Jokic, ECMWF, Oct-2009.
+**
+** Modifications: -
+**
+** Initial AIX version Oct-2009.
+** ****************************************************************/
+#include <stdio.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <sys/resource.h>
+
+# define cstr2fort(a) a
+# define _fcd char *
+# define _fcdtocp(a) a
+# define _fcdlen(a) strlen(a)
+
+# define ITIMER itimer_
+# define FTIMER ftimer_
+# define RUSAGE rusage_
+
+
+/* ================================================================
+ * Name: *ITIMER*
+ * ----
+ * - double ftimer_(double *time)
+ * Real*8 FTIMER,time in F90
+ * double timer = 0.0; timer=FTIMER(&timer); ... timer=FTIMER(&timer);
+** ===============================================================*/
+double FTIMER(double *time)
+{
+ double diff;
+ struct timeval now;
+
+
+ gettimeofday( &now, NULL );
+ diff = (double)now.tv_sec + ((double)now.tv_usec / 1000000.);
+ /* printf("%g %g\n",*time,diff); */
+
+ if (*time != 0.0) diff -= *time;
+/*
+ {
+ time_t tv_sec; * seconds *
+ suseconds_t tv_usec; * microseconds *
+
+ tv_usec = (*time%1)*1000000.;
+ tv_sec = (time_t) ((long)(*time/1))
+
+ tv_sec -= now.tv_sec;
+ tv_usec -= now.tv_usec;
+ if (tv_usec < 0)
+ {
+ tv_sec--;
+ tv_usec += 1000000;
+ }
+
+ diff = (double)tv_sec + ((double)tv_usec / 1000000.);
+ }
+ */
+ return diff;
+}
+
+int ITIMER(int *seconds)
+{
+ time_t timval1;
+ time(&timval1);
+
+ if (*seconds == 0) return (int)timval1;
+
+ return (int)(timval1 - (time_t)*seconds);
+}
+
+int RUSAGE()
+{
+ struct rusage usage;
+ int who = RUSAGE_SELF;
+ int istat;
+
+ if (getrusage(who, &usage) != 0) return 1;
+
+
+ printf("RUSAGE user time used %d\n",usage.ru_utime.tv_sec);
+ printf("RUSAGE system time used %d\n",usage.ru_stime.tv_sec);
+
+ printf("RUSAGE maximum resident set size %d\n",usage.ru_maxrss);
+ printf("RUSAGE integral shared memory size %d\n",usage.ru_ixrss);
+ printf("RUSAGE integral unshared data size %d\n",usage.ru_idrss);
+ printf("RUSAGE integral unshared stack size %d\n",usage.ru_isrss);
+ printf("RUSAGE page reclaims %d\n",usage.ru_minflt);
+ printf("RUSAGE page faults %d\n",usage.ru_majflt);
+ printf("RUSAGE swaps %d\n",usage.ru_nswap);
+ printf("RUSAGE block input operations %d\n",usage.ru_inblock);
+ printf("RUSAGE block output operations %d\n",usage.ru_oublock);
+ printf("RUSAGE messages sent %d\n",usage.ru_msgsnd);
+ printf("RUSAGE messages received %d\n",usage.ru_msgrcv);
+ printf("RUSAGE signals received %d\n",usage.ru_nsignals);
+ printf("RUSAGE voluntary context switches %d\n",usage.ru_nvcsw);
+ printf("RUSAGE involuntary context switches %d\n",usage.ru_nivcsw);
+
+ return 0;
+}
+
diff --git a/interpolation/ixtract.c b/interpolation/ixtract.c
new file mode 100755
index 0000000..81138c0
--- /dev/null
+++ b/interpolation/ixtract.c
@@ -0,0 +1,112 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+#ifdef FORTRAN_NO_UNDERSCORE
+#define IINSERT iinsert
+#define RINSERT rinsert
+#define DINSERT dinsert
+#define IXTRACT ixtract
+#define RXTRACT rxtract
+#define DXTRACT dxtract
+#define RMOVEN rmoven
+#define JLOC jloc
+#else
+#define IINSERT iinsert_
+#define RINSERT rinsert_
+#define DINSERT dinsert_
+#define IXTRACT ixtract_
+#define RXTRACT rxtract_
+#define DXTRACT dxtract_
+#define RMOVEN rmoven_
+#define JLOC jloc_
+#endif
+
+#include <memory.h>
+#include "fortint.h"
+
+fortint IXTRACT(JPointer * array, fortint * index) {
+fortint * p = (fortint *) *array;
+/*
+// Extracts a Fortran integer from an array.
+// Note that the array pointer is given by reference.
+*/
+ return (fortint) p[(*index)-1];
+}
+
+fortreal RXTRACT(RPointer * array, fortint * index) {
+fortreal * p = (fortreal *) *array;
+/*
+// Extracts a Fortran real from an array.
+// Note that the array pointer is given by reference.
+*/
+
+ return (fortreal) p[(*index)-1];
+}
+
+void DXTRACT(void * target, void ** array, fortint * index) {
+/*
+// Extracts a Fortran REAL*8 from an array of doubles.
+// Note that the array pointer is given by reference.
+*/
+unsigned char * p = (unsigned char*)(*array) + ((*index)-1)*8;
+
+ memmove(target, p, 8);
+ return;
+}
+
+void IINSERT(JPointer * array, fortint * index, fortint * value) {
+fortint * p = (fortint *) *array;
+/*
+// Inserts a Fortran integer into an array.
+// Note that the array pointer is given by reference.
+*/
+ p[(*index)-1] = *value;
+ return;
+}
+
+void RINSERT(RPointer * array, fortint * index, fortreal * value) {
+fortreal * p = (fortreal *) *array;
+/*
+// Inserts a Fortran real into an array.
+// Note that the array pointer is given by reference.
+*/
+ p[(*index)-1] = *value;
+ return;
+}
+
+void DINSERT(void ** array, fortint * index, void * value) {
+/*
+// Inserts a Fortran single into a (double) array.
+// Note that the array pointer is given by reference.
+*/
+unsigned char * p = (unsigned char*)(*array) + ((*index)-1)*8;
+
+ memmove(p,value,8);
+ return;
+}
+
+void RMOVEN(RPointer * target, RPointer * source, fortint * number) {
+fortreal * Target = (fortreal *) *target;
+fortreal * Source = (fortreal *) *source;
+size_t N = (*number) * sizeof(fortreal);
+/*
+// Moves Fortran reals from one array to another.
+// Note that the array pointers are given by reference.
+*/
+ memmove(Target, Source, N);
+}
+
+RPointer JLOC(RPointer array) {
+/*
+// Emulates the Fortran %LOC function
+*/
+ return array;
+}
diff --git a/interpolation/jacobi.F b/interpolation/jacobi.F
new file mode 100755
index 0000000..ecd177f
--- /dev/null
+++ b/interpolation/jacobi.F
@@ -0,0 +1,768 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ LOGICAL FUNCTION JACOBI(DATA,NM,W,SLAT)
+C
+C---->
+C**** JACOBI
+C
+C Purpose
+C -------
+C
+C Rotates spectral fields by latitude.
+C
+C
+C Interface
+C ---------
+C
+C IRET = JACOBI(DATA,NM,W,SLAT)
+C
+C Input
+C -----
+C
+C NM - Triangular truncation number of the field.
+C DATA - Linear array of REAL*8s of size (NM+1)*(NM+2)
+C holding the field.
+C W - Work array of REAL*8s of size (NM+1)*(NM+2).
+C SLAT - Rotation angle (degrees, REAL*8)
+C (degrees, negative => rotate counter-clockwise about the
+C new Z-axis).
+C
+C
+C Output
+C ------
+C
+C DATA - The transformed field.
+C
+C Function returns .FALSE. if data cannot be transformed.
+C
+C
+C Method
+C ------
+C
+C See reference paper below.
+C
+C A file of rotation coefficients is opened corresponding to
+C the triangular truncation NM and the rotation angle SLAT:
+C
+C $PP_ROT_DIR/rot_coefs_Tttt_nnnnnnnnn
+C (or $SCRATCH/rot_coefs_Tttt_nnnnnnnnn,
+C or $PWD/rot_coefs_Tttt_nnnnnnnnn)
+C
+C where:
+C ttt = triangular truncation
+C nnnnnnnnn = SLAT*100000,
+C or
+C $PP_ROT_DIR/rot_coefs_Tttt_Mnnnnnnnn
+C (or $SCRATCH/rot_coefs_Tttt_Mnnnnnnnn,
+C or $PWD/rot_coefs_Tttt_Mnnnnnnnn)
+C
+C where:
+C ttt = triangular truncation
+C nnnnnnnn = -SLAT*100000 if SLAT is negative.
+C
+C If the file does not exist it is created. During creation, the
+C filename is ROTpppppp_Tttt_nnnnnnnnn, where pppppp is the current
+C process ID.
+C
+C The file of rotation coefficients is UNLINKed by the process after
+C being opened for reading. This causes the file to be removed when
+C the process terminates.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Logs messages.
+C INTLOGR - Logs messages.
+C GETENV - to get environment variable data.
+C GETPID - to get the current process ID.
+C RENAME - to change a filename.
+C UNLINK - to remove a file.
+C
+C
+C Author
+C ------
+C
+C R.McGrath and P.Lynch HIRLAM
+C
+C
+C Reference.
+C ----------
+C
+C "Spectral synthesis on rotated and regular grids"
+C by P.Lynch and R.McGrath (Irish Meteorological Service).
+C
+C
+C----<
+C---------------------------------------------------------------------
+C
+ IMPLICIT NONE
+C
+#include "jparams.h"
+#include "parim.h"
+C
+C Function arguments.
+C
+ REAL*8 DATA, W
+ DIMENSION DATA(*), W(*)
+ INTEGER NM
+ REAL*8 SLAT
+C
+C Parameters.
+C
+ REAL*8 EPS
+ PARAMETER(EPS = 1.0E-10)
+ INTEGER JPNM_MAX
+ PARAMETER( JPNM_MAX = 640 )
+ INTEGER NPBYTES
+ PARAMETER( NPBYTES = 8 )
+C
+C Local variables.
+C
+#ifndef REAL_8
+ REAL SSLAT
+#endif
+ LOGICAL LFOR
+ INTEGER I, ISKIP, J, N, MM, K, IEND, IPLUG, IPID
+ INTEGER NN, M, NDEX
+ REAL*8 SIMAG, S, TEMP, DSLAT
+ REAL*8 RAD, TANB, SINB, COSB, Q, RNKN, BNKN, SQNN
+ REAL*8 SQNN1, SQ2N, PKN, PK1N, RNKN1, SREAL ,RNK0, RNK1
+ REAL*8 WISQR(JPNM_MAX)
+ REAL*8 WIB(JPNM_MAX)
+ REAL*8 WIR(JPNM_MAX)
+ REAL*8 WIDAT(2*JPNM_MAX)
+ CHARACTER*256 FILEDUM
+ CHARACTER*256 FILENAME
+ CHARACTER*24 COEFILE
+ DATA COEFILE/'rot_coefs_Tnnn_nnnnnnnnn'/
+ INTEGER FIRST, IUNIT, IRET, ILAT, OLDLAT, OLDTRUN, IOFFSET
+ INTEGER IFSIZE
+ INTEGER NMP1TM, MINUS1
+ DATA FIRST/0/, OLDLAT/10000000/, OLDTRUN/0/
+ SAVE FIRST, IUNIT, ILAT, OLDLAT, OLDTRUN, FILENAME, COEFILE
+C
+C Externals
+C
+#ifndef gfortran
+ INTEGER GETPID, UNLINK, RENAME
+ EXTERNAL GETPID, UNLINK, RENAME
+#endif
+C
+C Statement function
+C
+ REAL*8 A, B
+ LOGICAL ABSCHK
+ ABSCHK(A,B) = (ABS(A-B) .LT. EPS*(ABS(A) + ABS(B)))
+C
+C W array: 1 -> (NM+1)*(NM+2) for PMN/SQRT(2*N+1) values.
+C
+C RNKM values in WIR (for M>0),
+C in WIB (M<0).
+C Array of temporary SQRT values in WISQR, and
+C temporary transformed data in WIDAT
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ JACOBI = .FALSE.
+C
+ CALL INTLOG(JP_DEBUG,'JACOBI: truncation = ', NM)
+#ifndef REAL_8
+ SSLAT = SNGL(SLAT)
+ CALL INTLOGR(JP_DEBUG,'JACOBI: rotation angle = ', SSLAT)
+#else
+ CALL INTLOGR(JP_DEBUG,'JACOBI: rotation angle = ', SLAT)
+#endif
+C
+C Exit immediately if rotation angle is zero.
+C
+ IF (ABS(SLAT).LT.EPS) THEN
+ JACOBI = .TRUE.
+ GOTO 999
+ ENDIF
+C
+C Change to radians.
+C
+ RAD = 180.0/PPI
+ DSLAT = SLAT/RAD
+ TANB = TAN(DSLAT/(2.0))
+ SINB = SIN(DSLAT)
+ COSB = COS(DSLAT)
+ Q = SQRT(2.0)/2.0
+C
+C ------------------------------------------------------------------
+C* Section 2. Generate PMN/SQRT(2*N+1) values in W.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ W(1) = 1.0
+ W(2) = COSB
+C
+ ISKIP = NM + 1
+ DO 210 I = 1,ISKIP
+ W(1+ISKIP*I) = W(1+ISKIP*I-ISKIP)*SINB*
+ X SQRT(DBLE(2*I-1)/DBLE(2*I))
+ W(1+ISKIP*I+1) = COSB*DSQRT(DBLE(2*I+1))*W(1+ISKIP*I)
+ 210 CONTINUE
+C
+ DO 220 I = 2,ISKIP-1
+C
+ DO 215 J = 0,ISKIP-I+1
+ W(I+J*ISKIP+1) = COSB*DSQRT(DBLE((2*I+2*J-1)*(2*I+2*J-1))/
+ X DBLE((I+2*J)*I))*W(I+J*ISKIP)
+ X - DSQRT(DBLE((I-1)*(I+2*J-1))/
+ X DBLE((I+2*J)*I))*W(I+J*ISKIP-1)
+ 215 CONTINUE
+C
+ 220 CONTINUE
+C
+C ------------------------------------------------------------------
+C* Section 3. Generate the rotation coefficients RNKM.
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C Generate the rotation coefficients RNKM (K = M dashed in note)
+C and store in W. For K = 0 special case.
+C
+C PMN = W(M*(NM+1) + (N-M+1))
+C
+C Hold the input latitude and check if it is the same as the one
+C used the last time through
+C
+ ILAT = NINT(SLAT*100000)
+ IF( (ILAT.EQ.OLDLAT).AND.(OLDTRUN.EQ.NM) ) THEN
+C
+C Rewind the existing open coefficients file.
+C
+ CALL PBSEEK(IUNIT,0,0,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JACOBI: Rewind failed.',JPQUIET)
+ CALL PBCLOSE(IUNIT,IRET)
+ JACOBI = .FALSE.
+ GOTO 999
+ ENDIF
+C
+ ELSE
+C
+C A different coefficients file is needed.
+C
+ IF( FIRST.NE.0 ) THEN
+ CALL PBCLOSE(IUNIT,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JACOBI: PBCLOSE failed.',JPQUIET)
+ JACOBI = .FALSE.
+ ENDIF
+ ENDIF
+ OLDLAT = ILAT
+ OLDTRUN = NM
+C
+C Setup the file name: rot_coefs_Tnnn_nnnnnnnnn
+C (Path is given by PP_ROT_DIR, SCRATCH, or PWD.)
+C
+ CALL GETENV('PP_ROT_DIR',FILENAME)
+ IOFFSET = INDEX(FILENAME,' ')
+ IF( IOFFSET.EQ.1) THEN
+ CALL GETENV('SCRATCH',FILENAME)
+ IOFFSET = INDEX(FILENAME,' ')
+ IF( IOFFSET.EQ.1) THEN
+ FILENAME = '.'
+ ENDIF
+ ENDIF
+C
+ IOFFSET = INDEX(FILENAME,' ')
+ WRITE(COEFILE(12:14),'(I3.3)') NM
+ IF( ILAT.GE.0) THEN
+ WRITE(COEFILE(16:),'(I9.9)') ILAT
+ ELSE
+ COEFILE(16:) = 'M'
+ WRITE(COEFILE(17:),'(I8.8)') -ILAT
+ ENDIF
+ FILENAME = FILENAME(1:IOFFSET-1) // '/' // COEFILE
+C
+ FILEDUM = FILENAME
+ IPID = GETPID()
+ IF( IPID.LT.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JACOBI: GETPID failed',JPQUIET)
+ JACOBI = .FALSE.
+ GOTO 999
+ ENDIF
+ IOFFSET = INDEX(FILENAME,' ')
+ IPLUG = INDEX(FILENAME,'rot_coefs') + 3
+ WRITE(FILEDUM(IPLUG:IPLUG+5),'(I6.6)') IPID
+C
+C Try to open the file to see if it already exists
+C
+ CALL PBOPEN(IUNIT,FILENAME(1:IOFFSET-1),'r',IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_DEBUG,'JACOBI: PBOPEN for read failed',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'JACOBI: Non-existent file:',JPQUIET)
+C
+C Set flag to show file does not exist
+C
+ FIRST = 0
+C
+ ELSE
+C
+C File exists
+C
+ FIRST = 1
+C
+C Unlink the file so it disappears on close
+C
+ FIRST = 1
+ IRET = UNLINK(FILENAME(1:IOFFSET-1))
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JACOBI: UNLINK failed',JPQUIET)
+ JACOBI = .FALSE.
+ GOTO 999
+ ENDIF
+C
+C Calculate the coefficients file size and check file is
+C the correct size (coefficients are REAL*8)
+C
+ IFSIZE = 8*(NM*(2*NM*NM + 9*NM +13)/3)
+ CALL PBSEEK(IUNIT,0,2,IRET)
+ IF( IRET.LT.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JACOBI: PBSEEK failed.',JPQUIET)
+ CALL PBCLOSE(IUNIT,IRET)
+ JACOBI = .FALSE.
+ GOTO 999
+ ENDIF
+C
+ IF( IFSIZE.NE.IRET) THEN
+ CALL INTLOG(JP_FATAL,
+ X 'JACOBI: Coefficients file size incorrect = ',IRET)
+ CALL INTLOG(JP_FATAL,
+ X 'JACOBI: Expected file size is = ',IFSIZE)
+ CALL PBCLOSE(IUNIT,IRET)
+ JACOBI = .FALSE.
+ GOTO 999
+ ENDIF
+C
+C Rewind the coefficients file.
+C
+ CALL PBSEEK(IUNIT,0,0,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JACOBI: Rewind failed.',JPQUIET)
+ CALL PBCLOSE(IUNIT,IRET)
+ JACOBI = .FALSE.
+ GOTO 999
+ ENDIF
+ ENDIF
+ ENDIF
+C
+ DO 530 N = 1,NM
+ RNKN = (0.5*(1.0 + COSB))**N
+ BNKN = (0.5*(1.0 - COSB))**N
+ SQNN = DSQRT(DBLE((N+1)*N))
+ SQNN1 = SQNN*SINB
+ SQ2N = DSQRT(2.0/DBLE(N))/SINB
+C
+C Save SQRTS.
+C
+ DO 325 MM = 0,N
+ WISQR(MM+1) = DSQRT(DBLE((N+MM)*(N-MM+1)))*SINB
+ 325 CONTINUE
+C
+ NN = 1
+C
+C Generate RNKM, M = 0 to N.
+C
+ DO 490 K = N,0,-1
+C
+C Generate the coefficients file if it doesn't exist
+C
+ IF( FIRST.EQ.0 ) THEN
+ FIRST = -1
+ CALL INTLOG(JP_DEBUG, 'JACOBI: PBOPEN for write',JPQUIET)
+ IOFFSET = INDEX(FILEDUM,' ')
+ CALL PBOPEN(IUNIT,FILEDUM(1:IOFFSET-1),'w',IRET)
+ IF( IRET.NE.0 ) THEN
+C
+C Try to use present working directory
+C
+ CALL INTLOG(JP_ERROR,
+ X 'JACOBI: PBOPEN for write failed',JPQUIET)
+ FILENAME = COEFILE
+ FILEDUM = COEFILE
+ IOFFSET = INDEX(FILEDUM,' ')
+ CALL PBOPEN(IUNIT,FILEDUM(1:IOFFSET-1),'w',IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JACOBI: PBOPEN for write failed',JPQUIET)
+ JACOBI = .FALSE.
+ GOTO 999
+ ENDIF
+ ENDIF
+ ENDIF
+C
+ IF( FIRST.LE.0) THEN
+C
+ PKN = W(K*(NM+1) + (N-K+1))
+ IF (K.EQ.0) GOTO 400
+C
+C For K > 0, go forward from zero.
+C
+ PK1N = W((K-1)*(NM+1) + (N-(K-1)+1))
+C
+C Flip sign if necessary.
+C
+ IF (MOD(K,2).NE.0)THEN
+ PKN = -PKN
+ ELSE
+ PK1N = -PK1N
+ ENDIF
+C
+C Work using forward recurrence as long as coefficient
+C calculated passes checks.
+C
+ LFOR = .TRUE.
+C
+ RNK0 = PKN
+ RNK1 = (-DBLE(K)*TANB*PKN + (WISQR(K+1)/SINB)*PK1N)/SQNN
+C
+C Recurrence starts at 2 for M = 0
+C
+ WIR(1) = RNK0
+ WIR(2) = RNK1
+C
+ DO 330 MM = 1,N-1
+ WIR(MM+2) = (2.0*WIR(MM+1)*(DBLE(MM)*COSB-DBLE(K))
+ X - WISQR(MM+1)*WIR(MM)) /WISQR(MM+2)
+C
+C Apply check to generated coefficient to see if its
+C absolute value is greater than 1. If so, have to
+C switch to using backwards recurrences.
+C
+ IF (ABS(WIR(MM+2)).GT.1.0)THEN
+ LFOR = .FALSE.
+ IEND = MM + 3
+ GOTO 335
+ ENDIF
+ 330 CONTINUE
+C
+C If forward recurrence appears OK so far,
+C test last element RNKN by comparing with WIR(N+1).
+C
+ IEND = N + 2
+ IF (ABSCHK(RNKN,WIR(N+1))) GOTO 345
+C
+C If test failed, try generating coefficients using
+C backwards recurrences.
+C
+ 335 CONTINUE
+C
+C Work backwards from the top.
+C Specify N; K is already set from the loop above.
+C Stop at M = 1 (NOT 0).
+C
+ RNKN1 = RNKN*SQ2N*(DBLE(N)*COSB-DBLE(K))
+ WIR(N+1) = RNKN
+C
+C Check whether difference is within prescribed tolerance.
+C
+ IF (LFOR .AND. ABSCHK(RNKN1,WIR(N))) GO TO 345
+ WIR(N) = RNKN1
+C
+C For M = 0:
+C
+ DO 340 MM = N-1,1,-1
+ S = (2.0*WIR(MM+1)*(DBLE(MM)*COSB-DBLE(K))
+ X - (WISQR(MM+2)*WIR(MM+2))) / WISQR(MM+1)
+C
+C Accept these if forward recursion failed before
+C reaching this point.
+C
+ IF (MM+1.LT.IEND)THEN
+ IF (ABSCHK(S,WIR(MM))) GOTO 345
+ ENDIF
+ WIR(MM) = S
+C
+C If absolute value is greater than 1, give up gracefully
+C
+ IF (ABS(S).GT.1.0) GOTO 920
+ 340 CONTINUE
+C
+ GOTO 920
+C
+ 345 CONTINUE
+C
+C Now RNKM for M = 0,-N
+C
+C RNKM M = -1,-N
+C
+C Forward recurrence starts at 1 for M = 0, 2 for -1 etc.
+C
+ LFOR = .TRUE.
+C
+ WIB(1) = RNK0
+ WIB(2) = -RNK1-RNK0*DBLE(2*K)/(SQNN1)
+C
+ DO 350 MM = 1,(N-1)
+ WIB(MM+2) = (2.0*WIB(MM+1)*(DBLE(-MM)*COSB-DBLE(K))
+ X - WISQR(MM+1)*SINB*WIB(MM)) /WISQR(MM+2)
+C
+C Apply check to generated coefficient to see if its
+C absolute value is greater than 1. If so, have to
+C switch to using backwards recurrences.
+C
+ IF (ABS(WIB(MM+2)).GT.1.0)THEN
+ LFOR = .FALSE.
+ IEND = MM + 3
+ GOTO 355
+ ENDIF
+ 350 CONTINUE
+C
+C If forward recurrence appears OK so far,
+C test last element BNKN by comparing with WIB(N+1).
+C
+ IEND = N + 1
+ IF (ABSCHK(BNKN,WIB(N+1))) GOTO 400
+C
+C If test failed, try generating coefficients using backwards
+C recurrences.
+C
+ 355 CONTINUE
+C
+C Get R values.
+C First RNKN, then next highest RNKN1.
+C
+ RNKN1 = -BNKN*SQ2N*(DBLE(N)*COSB + DBLE(K))
+C
+C Work backwards from the top.
+C Specify N; K is already set from the loop above.
+C
+C Stop at M = 1 (NOT 0).
+C
+ WIB(N+1) = BNKN
+ IF (LFOR .AND. ABSCHK(RNKN1,WIB(N))) GOTO 400
+ WIB(N) = RNKN1
+C
+ DO 360 MM = N-1,1,-1
+ S = (2.0*WIB(MM+1)*(DBLE(-MM)*COSB-DBLE(K))
+ X - (WISQR(MM+2)*WIB(MM+2))) / WISQR(MM+1)
+C
+C Accept backwards generated coefficients if forward
+C recursion failed before reaching this point.
+C
+ IF ( (MM.LT.IEND ) .AND. ABSCHK(S,WIB(MM)) ) GOTO 400
+ WIB(MM) = S
+C
+C If absolute value is greater than 1, give up.
+C
+ IF (ABS(S).GT.1.0) GOTO 910
+C
+ 360 CONTINUE
+C
+C End of backwards recurrences reached with no agreed
+C coefficients, give up.
+C
+ GOTO 910
+C
+C ------------------------------------------------------------------
+C* Section 4. Got RNKM. Now transform spectral data.
+C ------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+C Write coefficients to file
+C
+ CALL PBWRITE(IUNIT,WIR,(N+1)*NPBYTES,IRET)
+ IF( IRET.NE.((N+1)*NPBYTES) ) THEN
+ CALL INTLOG(JP_FATAL,'JACOBI: PBWRITE failed.',JPQUIET)
+ CALL PBCLOSE(IUNIT,IRET)
+ JACOBI = .FALSE.
+ GOTO 999
+ ENDIF
+C
+ CALL PBWRITE(IUNIT,WIB,(N+1)*NPBYTES,IRET)
+ IF( IRET.NE.((N+1)*NPBYTES) ) THEN
+ CALL INTLOG(JP_FATAL,'JACOBI: PBWRITE failed.',JPQUIET)
+ CALL PBCLOSE(IUNIT,IRET)
+ JACOBI = .FALSE.
+ GOTO 999
+ ENDIF
+
+ ELSE
+C
+ 415 CONTINUE
+C
+ PKN = W(K*(NM+1) + (N-K+1))
+ PK1N = W((K-1)*(NM+1) + (N-(K-1)+1))
+C
+C Flip sign if necessary.
+C
+ IF (MOD(K,2).NE.0)THEN
+ PKN = -PKN
+ ELSE
+ PK1N = -PK1N
+ ENDIF
+C
+C Read coefficients from file
+C
+ CALL PBREAD(IUNIT,WIR,(N+1)*NPBYTES,IRET)
+ IF( IRET.NE.((N+1)*NPBYTES) ) THEN
+ CALL INTLOG(JP_FATAL,'JACOBI: PBREAD failed.',JPQUIET)
+ CALL PBCLOSE(IUNIT,IRET)
+ JACOBI = .FALSE.
+ GOTO 999
+ ENDIF
+C
+ CALL PBREAD(IUNIT,WIB,(N+1)*NPBYTES,IRET)
+ IF( IRET.NE.((N+1)*NPBYTES) ) THEN
+ CALL INTLOG(JP_FATAL,'JACOBI: PBREAD failed.',JPQUIET)
+ CALL PBCLOSE(IUNIT,IRET)
+ JACOBI = .FALSE.
+ GOTO 999
+ ENDIF
+C
+ ENDIF
+C
+C Special case when K=0.
+C
+ IF( K.EQ.0) THEN
+C
+ SREAL = DATA(2*(N+1)-1)*PKN
+ SIMAG = 0.0
+ DO 420 M = 1,N
+ NMP1TM = (NM+1)*M
+ SREAL = SREAL
+ X + 2.0*DATA(2*(NMP1TM-((M-1)*M)/2+1+N-M)-1)
+ X * W(NMP1TM+(N-M+1))
+ 420 CONTINUE
+C
+ NDEX = 1+N
+ WIDAT(NN) = SREAL
+ WIDAT(NN+1) = SIMAG
+ NN = NN + 2
+C
+ ELSE
+C
+ SREAL = DATA(2*(N+1)-1)*PKN
+ SIMAG = 0.0
+ MINUS1 = -1
+ DO 440 M = 1,N
+ SREAL = SREAL +
+ X DATA(2*((NM+1)*M-((M-1)*M)/2+1+N-M)-1)
+ X * (WIR(M+1)+WIB(M+1)*MINUS1)
+ SIMAG = SIMAG -
+ X DATA(2*((NM+1)*M -((M-1)*M)/2+1+N-M))
+ X * (-WIR(M+1)+WIB(M+1)*MINUS1)
+ MINUS1 = -MINUS1
+ 440 CONTINUE
+C
+ NDEX = (NM+1)*K - ((K-1)*K)/2+1+N-K
+ WIDAT(NN) = SREAL
+ WIDAT(NN+1) = SIMAG
+ NN = NN + 2
+ ENDIF
+C
+C Update RNKN at both ends of the forward and backward
+C recurrences.
+C
+ TEMP = DSQRT(DBLE(N+K)/DBLE(N-K+1))
+ RNKN = RNKN*TEMP*SINB/(1+COSB)
+ BNKN = -BNKN*TEMP*(1+COSB)/SINB
+ 490 CONTINUE
+C
+C End of inner loop.
+C
+C ------------------------------------------------------------------
+C* Section 5. Now place the values of the rotated spectral
+C coefficients in DATA.
+C ------------------------------------------------------------------
+C
+ 500 CONTINUE
+C
+ NN = 1
+ DO 520 K = N,0,-1
+ NDEX = (NM+1)*K - ((K-1)*K)/2+1+N-K
+ DATA(2*NDEX-1) = WIDAT(NN)
+ DATA(2*NDEX) = WIDAT(NN+1)
+ NN = NN + 2
+C
+ 520 CONTINUE
+C
+ 530 CONTINUE
+C
+C ------------------------------------------------------------------
+C* Section 9. Return.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ JACOBI = .TRUE.
+C
+C If coefficients file has just been generated:
+C - close it,
+C - rename it,
+C - re-open for reading
+C - unlink it, so it can disappear when closed,
+C - leave it open.
+C
+ IF( FIRST.LE.0 ) THEN
+ FIRST = 1
+ CALL PBCLOSE(IUNIT,IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JACOBI: PBCLOSE failed.',JPQUIET)
+ JACOBI = .FALSE.
+ GOTO 999
+ ENDIF
+C
+ FILEDUM(IOFFSET:IOFFSET) = CHAR(0)
+ FILENAME(IOFFSET:IOFFSET) = CHAR(0)
+ IRET = RENAME(FILEDUM(1:IOFFSET-1),FILENAME(1:IOFFSET-1))
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JACOBI: RENAME of file failed',JPQUIET)
+ JACOBI = .FALSE.
+ GOTO 999
+ ENDIF
+C
+ CALL INTLOG(JP_DEBUG, 'JACOBI: PBOPEN for read',JPQUIET)
+ IOFFSET = INDEX(FILENAME,' ')
+ CALL PBOPEN(IUNIT,FILENAME(1:IOFFSET-1),'r',IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JACOBI: PBOPEN for read failed',JPQUIET)
+ JACOBI = .FALSE.
+ GOTO 999
+ ENDIF
+C
+ IRET = UNLINK(FILENAME(1:IOFFSET-1))
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JACOBI: UNLINK of file failed',JPQUIET)
+ JACOBI = .FALSE.
+ GOTO 999
+ ENDIF
+ ENDIF
+C
+ 999 CONTINUE
+ RETURN
+C
+C Failure to converge with M < 0.
+C
+ 910 CONTINUE
+ CALL INTLOG(JP_FATAL,'JACOBI: Failure to converge M < 0', JPQUIET)
+ JACOBI = .FALSE.
+ GOTO 999
+C
+C Failure to converge with M > 0.
+C
+ 920 CONTINUE
+ CALL INTLOG(JP_FATAL,'JACOBI: Failure to converge M > 0', JPQUIET)
+ JACOBI = .FALSE.
+ GOTO 999
+ END
diff --git a/interpolation/jacobif.F b/interpolation/jacobif.F
new file mode 100755
index 0000000..14e4681
--- /dev/null
+++ b/interpolation/jacobif.F
@@ -0,0 +1,836 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ LOGICAL FUNCTION JACOBIF(DATA,NM,W,ROTANG)
+C
+C---->
+C**** JACOBIF
+C
+C Purpose
+C -------
+C
+C Rotates spectral field by latitude (Fujitsu only).
+C
+C
+C Interface
+C ---------
+C
+C IRET = JACOBIF(DATA,NM,W,ROTANG)
+C
+C Input
+C -----
+C
+C NM - Triangular truncation number of the field.
+C DATA - Linear array of REAL*8s of size (NM+1)*(NM+2)
+C holding the field.
+C W - Work array of REAL*8s of size (NM+1)*(NM+2).
+C ROTANG - Rotation angle (degrees, REAL*8)
+C (degrees, negative => rotate counter-clockwise about the
+C new Z-axis).
+C
+C
+C Output
+C ------
+C
+C DATA - The transformed field.
+C
+C Function returns .FALSE. if data cannot be transformed.
+C
+C
+C Method
+C ------
+C
+C See reference paper below.
+C
+C Coefficients are read into or are created in memory. A large
+C amount of memory may be required; eg, for truncation NM:
+C 8*(NM*(2*NM*NM + 9*NM +13)/3) bytes.
+C
+C Optionally, if the environment variable PP_SAVE_ROT is set, a
+C file of coefficients can be created in the directory given by
+C environment variable PP_ROT_DIR.
+C
+C The name of the file of rotation coefficients indicates the
+C triangular truncation NM and the rotation angle ROTANG:
+C
+C $PP_ROT_DIR/rot_coefs_Tttt_nnnnnnnnn
+C or $TMPDIR/rot_coefs_Tttt_nnnnnnnnn
+C
+C where:
+C ttt = triangular truncation
+C nnnnnnnnn = ROTANG*100000,
+C or
+C $PP_ROT_DIR/rot_coefs_Tttt_Mnnnnnnnn
+C or $TMPDIR/rot_coefs_Tttt_Mnnnnnnnn
+C
+C where:
+C ttt = triangular truncation
+C nnnnnnnn = -ROTANG*100000 if ROTANG is negative.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Logs messages.
+C INTLOGR - Logs messages.
+C GETENV - To get environment variable data.
+C UNLINK - To remove a file.
+C PPALLOW - Checks if the rotation coefficients can go into mrfs.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF April 1999
+C
+C
+C Reference.
+C ----------
+C
+C "Spectral synthesis on rotated and regular grids"
+C by P.Lynch and R.McGrath (Irish Meteorological Service).
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "jparams.h"
+#include "parim.h"
+C
+C Function arguments.
+C
+ REAL*8 DATA, W
+ DIMENSION DATA(*), W(*)
+ INTEGER NM
+ REAL*8 ROTANG
+C
+C Parameters.
+C
+ REAL*8 EPS
+ PARAMETER(EPS = 1.0E-10)
+ INTEGER JPNM_MAX, JPMAXMM, JPMEM20
+ PARAMETER( JPNM_MAX = 640 )
+ PARAMETER( JPMAXMM = 3 )
+C `--> maximum number of memory slots
+C used for rotation coefficients
+ PARAMETER( JPMEM20 = 20 )
+C `--> offset in memory allocation table of
+C first memory slot for rotation
+C coefficients
+C
+C Local variables.
+C
+ LOGICAL LFOR, LALLOW
+ INTEGER I, ISKIP, J, N, MM, K, IEND
+ INTEGER NN, M, NDEX, IMEMORY
+C
+ REAL*4 SROTANG
+ REAL*8 SIMAG, S, TEMP, DROTANG
+ REAL*8 RAD, TANB, SINB, COSB, Q, RNKN, BNKN, SQNN
+ REAL*8 SQNN1, SQ2N, PKN, PK1N, RNKN1, SREAL ,RNK0, RNK1
+ REAL*8 INDEXR(JPNM_MAX), INDEXI(JPNM_MAX)
+ REAL*8 MINUS1(JPNM_MAX)
+ REAL*8 FACTOR(JPNM_MAX)
+ REAL*8 WISQR(JPNM_MAX)
+ REAL*8 WIB(JPNM_MAX)
+ REAL*8 WIR(JPNM_MAX)
+ REAL*8 WIDAT(2*JPNM_MAX)
+C
+ CHARACTER*256 FILENAME
+ CHARACTER*40 COEFILE
+ DATA COEFILE/'rot_coefs_Tnnn_nnnnnnnnn'/
+C
+ INTEGER IUNIT, IRET, ILAT, OLDLAT(3), OLDTRUN(3), IOFFSET
+ INTEGER IFSIZE, ICNDEX
+ INTEGER LOOP, NMP1TM, MAXMEM
+ LOGICAL LINMEM, LEXIST
+C
+ INTEGER CURRENT, OLDEST
+ DATA OLDEST/1/, MAXMEM/JPMAXMM/
+ SAVE OLDEST, MAXMEM
+C
+ DATA OLDLAT/3*9999999/, OLDTRUN/3*0/
+ DATA LINMEM/.FALSE./, LEXIST/.FALSE./
+ SAVE IUNIT, ILAT, OLDLAT, OLDTRUN, COEFILE, LINMEM, LEXIST
+C
+#ifdef POINTER_64
+Cjdc INTEGER*8 ICOEFF
+#endif
+ REAL*8 ACOEFF
+ DIMENSION ACOEFF(1)
+ POINTER ( ICOEFF, ACOEFF )
+C
+C Externals
+C
+ INTEGER JCHMOD, UNLINK
+ LOGICAL PPALLOW
+ EXTERNAL JCHMOD, UNLINK, PPALLOW
+C
+C Statement function
+C
+ REAL*8 A, B
+ LOGICAL ABSCHK
+ ABSCHK(A,B) = (ABS(A-B) .LT. EPS*(ABS(A) + ABS(B)))
+C
+C W array: 1 -> (NM+1)*(NM+2) for PMN/SQRT(2*N+1) values.
+C
+C RNKM values in WIR (for M>0),
+C in WIB (M<0).
+C Array of temporary SQRT values in WISQR, and
+C temporary transformed data in WIDAT
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ JACOBIF = .FALSE.
+C
+ LALLOW = PPALLOW(NM,ROTANG)
+C
+ CALL INTLOG(JP_DEBUG,'JACOBIF: truncation = ', NM)
+ SROTANG = SNGL(ROTANG)
+ CALL INTLOGR(JP_DEBUG,'JACOBIF: rotation angle = ', SROTANG)
+C
+C Exit immediately if rotation angle is zero.
+C
+ IF (ABS(ROTANG).LT.EPS) THEN
+ CALL INTLOG(JP_DEBUG,'JACOBIF: No rotation necessary',JPQUIET)
+ JACOBIF = .TRUE.
+ GOTO 999
+ ENDIF
+C
+C Change to radians.
+C
+ RAD = 180.0/PPI
+ DROTANG = ROTANG/RAD
+ TANB = TAN(DROTANG/(2.0))
+ SINB = SIN(DROTANG)
+ COSB = COS(DROTANG)
+ Q = SQRT(2.0)/2.0
+C
+ ICNDEX = 0
+C
+C -----------------------------------------------------------------|
+C* Section 2. Generate PMN/SQRT(2*N+1) values in W.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ W(1) = 1.0
+ W(2) = COSB
+C
+ ISKIP = NM + 1
+!OCL SCALAR
+ DO I = 1,ISKIP
+ W(1+ISKIP*I) = W(1+ISKIP*I-ISKIP)*SINB*
+ X SQRT(DBLE(2*I-1)/DBLE(2*I))
+ W(1+ISKIP*I+1) = COSB*DSQRT(DBLE(2*I+1))*W(1+ISKIP*I)
+ ENDDO
+C
+!OCL SCALAR
+ DO I = 2,ISKIP-1
+C
+!OCL VECTOR
+ DO J = 0,ISKIP-I+1
+ FACTOR(J) = 1.0/DSQRT(DBLE((I+2*J)*I))
+ ENDDO
+C
+ DO J = 0,ISKIP-I+1
+ W(I+J*ISKIP+1) = COSB*DBLE(2*I+2*J-1)
+ X *FACTOR(J)*W(I+J*ISKIP)
+ X - DSQRT(DBLE((I-1)*(I+2*J-1)))
+ X *FACTOR(J)*W(I+J*ISKIP-1)
+ ENDDO
+C
+ ENDDO
+C
+ MINUS1(1) = -1
+!OCL SCALAR
+ DO I = 2, JPNM_MAX
+ MINUS1(I) = -MINUS1(I-1)
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 3. Pick up the rotation coefficients RNKM.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Change the interpolation coefficents if the input latitude is
+C not the same as the one used the last time through.
+C
+ ILAT = NINT(ROTANG*100000)
+C
+ DO LOOP = 1, MAXMEM
+ IF( ILAT.EQ.OLDLAT(LOOP).AND.(OLDTRUN(LOOP).EQ.NM) ) THEN
+C
+C Set flags to show the rotation coefficients are in memory
+C
+ LINMEM = .TRUE.
+ LEXIST = .TRUE.
+ CURRENT = LOOP + JPMEM20 - 1
+ CALL INTLOG(JP_DEBUG,
+ X 'JACOBIF: Existing memory slot re-used = ', CURRENT)
+ CALL JMEMHAN( CURRENT, ICOEFF, IMEMORY, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,
+ X 'JACOBIF: Failed to pick up existing memory pool',CURRENT)
+ JACOBIF = .FALSE.
+ GOTO 999
+ ENDIF
+ GOTO 310
+ ENDIF
+ ENDDO
+C
+ LINMEM = .FALSE.
+ LEXIST = .FALSE.
+ CURRENT = OLDEST + JPMEM20 - 1
+ OLDLAT(OLDEST) = ILAT
+ OLDTRUN(OLDEST) = NM
+ OLDEST = OLDEST + 1
+ IF( OLDEST.GT.MAXMEM ) OLDEST = 1
+ CALL INTLOG(JP_DEBUG,
+ X 'JACOBIF: Different memory slot selected = ', CURRENT)
+C
+ 310 CONTINUE
+C
+ IF( .NOT. LINMEM ) THEN
+C
+C Calculate the coefficients file size (coefficients are REAL*8)
+C
+ IFSIZE = 8*(NM*(2*NM*NM + 9*NM +13)/3)
+C
+C Allocate memory for the REAL*8 coefficients
+C
+#ifdef REAL_8
+ IMEMORY = (NM*(2*NM*NM + 9*NM +13)/3)
+#else
+ IMEMORY = 2*(NM*(2*NM*NM + 9*NM +13)/3)
+#endif
+C
+ 320 CONTINUE
+C
+ CALL JMEMHAN( CURRENT, ICOEFF, IMEMORY, 1, IRET)
+ IF( IRET.NE.0 ) THEN
+C
+C If memory allocation fails, reduce the number of slots in the
+C memory pool. Exit if the pool is already down to one slot.
+C
+ IF( MAXMEM.LT.2 ) THEN
+ CALL INTLOG(JP_FATAL,
+ X 'JACOBIF: memory allocation error',ICOEFF)
+ JACOBIF = .FALSE.
+ GOTO 999
+ ENDIF
+ MAXMEM = MAXMEM - 1
+ CALL INTLOG(JP_DEBUG,
+ X 'JACOBIF: Reduce number of memory slots to ', MAXMEM)
+ LINMEM = .FALSE.
+ LEXIST = .FALSE.
+ OLDEST = 1
+ OLDLAT(OLDEST) = ILAT
+ OLDTRUN(OLDEST) = NM
+ CURRENT = OLDEST + JPMEM20 - 1
+ OLDEST = OLDEST + 1
+ IF( OLDEST.GT.MAXMEM ) OLDEST = 1
+ CALL INTLOG(JP_DEBUG,
+ X 'JACOBIF: Different memory slot selected = ', CURRENT)
+ GOTO 320
+ ENDIF
+ ICNDEX = 0
+C
+C If the file already exists, read it into memory.
+C For 'standard' rotations try PP_ROT_DIR, otherwise TMPDIR.
+C
+ IF( LALLOW ) THEN
+ CALL GETENV('PP_ROT_DIR',FILENAME)
+ ELSE
+ CALL GETENV('TMPDIR',FILENAME)
+ ENDIF
+ IOFFSET = INDEX(FILENAME,' ')
+ IF( IOFFSET.EQ.1) THEN
+ CALL INTLOG(JP_WARN,
+ X 'JACOBIF: Unable to open rotation coefficents.',JPQUIET)
+C
+ ELSE
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'JACOBIF: Existing coefficients sought in:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JACOBIF: '// FILENAME(1:IOFFSET-1),JPQUIET)
+C
+ WRITE(COEFILE(12:14),'(I3.3)') NM
+ IF( ILAT.GE.0) THEN
+ WRITE(COEFILE(16:),'(I9.9)') ILAT
+ ELSE
+ COEFILE(16:) = 'M'
+ WRITE(COEFILE(17:),'(I8.8)') -ILAT
+ ENDIF
+ FILENAME = FILENAME(1:IOFFSET-1) // '/' // COEFILE
+ IOFFSET = INDEX(FILENAME,' ') - 1
+C
+ CALL PBOPEN(IUNIT,FILENAME(1:IOFFSET),'r',IRET)
+ IF( IRET.EQ.0 ) THEN
+C
+C Let user know that a existing file has been opened
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'JACOBIF: Existing coefficients found in file:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'JACOBIF: '// COEFILE, JPQUIET)
+C
+C Read coefficients into memory
+C
+ CALL PBREAD(IUNIT,ACOEFF,IFSIZE,IRET)
+ IF( IRET.NE.IFSIZE ) THEN
+ CALL INTLOG(JP_WARN,'JACOBIF: PBREAD failed.',JPQUIET)
+ ELSE
+C
+C Set flags to show the rotation coefficients are in memory
+C and exist.
+C
+ LINMEM = .TRUE.
+ LEXIST = .TRUE.
+ ENDIF
+C
+ CALL PBCLOSE(IUNIT,IRET)
+ ENDIF
+C
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4. Generate the rotation coefficients RNKM.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+C
+C Generate the rotation coefficients RNKM (K = M dashed in note)
+C and store in W. For K = 0 special case.
+C
+C PMN = W(M*(NM+1) + (N-M+1))
+C
+!OCL VECTOR
+ DO 630 N = 1,NM
+ RNKN = (0.5*(1.0 + COSB))**N
+ BNKN = (0.5*(1.0 - COSB))**N
+ SQNN = DSQRT(DBLE((N+1)*N))
+ SQNN1 = SQNN*SINB
+ SQ2N = DSQRT(2.0/DBLE(N))/SINB
+C
+C Save SQRTS.
+C
+!OCL VECTOR
+ DO MM = 0,N
+ WISQR(MM+1) = DSQRT(DBLE((N+MM)*(N-MM+1)))*SINB
+ ENDDO
+C
+ NN = 1
+C
+C Generate RNKM, M = 0 to N.
+C
+!OCL SCALAR
+ DO 590 K = N,0,-1
+C
+C If the coefficients are not (yet) in memory, they have to
+C be calculated.
+C
+ IF( .NOT. LINMEM ) THEN
+C
+ PKN = W(K*(NM+1) + (N-K+1))
+ IF (K.EQ.0) GOTO 500
+C
+C For K > 0, go forward from zero.
+C
+ PK1N = W((K-1)*(NM+1) + (N-(K-1)+1))
+C
+C Flip sign if necessary.
+C
+ IF (MOD(K,2).NE.0)THEN
+ PKN = -PKN
+ ELSE
+ PK1N = -PK1N
+ ENDIF
+C
+C Work using forward recurrence as long as coefficient
+C calculated passes checks.
+C
+ LFOR = .TRUE.
+C
+ RNK0 = PKN
+ RNK1 = (-DBLE(K)*TANB*PKN + (WISQR(K+1)/SINB)*PK1N)/SQNN
+C
+C Recurrence starts at 2 for M = 0
+C
+ WIR(1) = RNK0
+ WIR(2) = RNK1
+C
+!OCL SCALAR
+ DO MM = 1,N-1
+ WIR(MM+2) = (2.0*WIR(MM+1)*(DBLE(MM)*COSB-DBLE(K))
+ X - WISQR(MM+1)*WIR(MM)) /WISQR(MM+2)
+C
+C Apply check to generated coefficient to see if its
+C absolute value is greater than 1. If so, have to
+C switch to using backwards recurrences.
+C
+ IF (ABS(WIR(MM+2)).GT.1.0)THEN
+ LFOR = .FALSE.
+ IEND = MM + 3
+ GOTO 435
+ ENDIF
+ ENDDO
+C
+C If forward recurrence appears OK so far,
+C test last element RNKN by comparing with WIR(N+1).
+C
+ IEND = N + 2
+ IF (ABSCHK(RNKN,WIR(N+1))) GOTO 445
+C
+C If test failed, try generating coefficients using
+C backwards recurrences.
+C
+ 435 CONTINUE
+C
+C Work backwards from the top.
+C Specify N; K is already set from the loop above.
+C Stop at M = 1 (NOT 0).
+C
+ RNKN1 = RNKN*SQ2N*(DBLE(N)*COSB-DBLE(K))
+ WIR(N+1) = RNKN
+C
+C Check whether difference is within prescribed tolerance.
+C
+ IF (LFOR .AND. ABSCHK(RNKN1,WIR(N))) GO TO 445
+ WIR(N) = RNKN1
+C
+C For M = 0:
+C
+!OCL SCALAR
+ DO MM = N-1,1,-1
+ S = (2.0*WIR(MM+1)*(DBLE(MM)*COSB-DBLE(K))
+ X - (WISQR(MM+2)*WIR(MM+2))) / WISQR(MM+1)
+C
+C Accept these if forward recursion failed before
+C reaching this point.
+C
+ IF (MM+1.LT.IEND)THEN
+ IF (ABSCHK(S,WIR(MM))) GOTO 445
+ ENDIF
+ WIR(MM) = S
+C
+C If absolute value is greater than 1, give up gracefully
+C
+ IF (ABS(S).GT.1.0) GOTO 920
+C
+ ENDDO
+C
+ GOTO 920
+C
+ 445 CONTINUE
+C
+C Now RNKM for M = 0,-N
+C
+C RNKM M = -1,-N
+C
+C Forward recurrence starts at 1 for M = 0, 2 for -1 etc.
+C
+ LFOR = .TRUE.
+C
+ WIB(1) = RNK0
+ WIB(2) = -RNK1-RNK0*DBLE(2*K)/(SQNN1)
+C
+!OCL SCALAR
+ DO MM = 1,(N-1)
+ WIB(MM+2) = (2.0*WIB(MM+1)*(DBLE(-MM)*COSB-DBLE(K))
+ X - WISQR(MM+1)*SINB*WIB(MM)) /WISQR(MM+2)
+C
+C Apply check to generated coefficient to see if its
+C absolute value is greater than 1. If so, have to
+C switch to using backwards recurrences.
+C
+ IF (ABS(WIB(MM+2)).GT.1.0)THEN
+ LFOR = .FALSE.
+ IEND = MM + 3
+ GOTO 455
+ ENDIF
+ ENDDO
+C
+C If forward recurrence appears OK so far,
+C test last element BNKN by comparing with WIB(N+1).
+C
+ IEND = N + 1
+ IF (ABSCHK(BNKN,WIB(N+1))) GOTO 500
+C
+C If test failed, try generating coefficients using backwards
+C recurrences.
+C
+ 455 CONTINUE
+C
+C Get R values.
+C First RNKN, then next highest RNKN1.
+C
+ RNKN1 = -BNKN*SQ2N*(DBLE(N)*COSB + DBLE(K))
+C
+C Work backwards from the top.
+C Specify N; K is already set from the loop above.
+C
+C Stop at M = 1 (NOT 0).
+C
+ WIB(N+1) = BNKN
+ IF (LFOR .AND. ABSCHK(RNKN1,WIB(N))) GOTO 500
+ WIB(N) = RNKN1
+C
+!OCL SCALAR
+ DO MM = N-1,1,-1
+ S = (2.0*WIB(MM+1)*(DBLE(-MM)*COSB-DBLE(K))
+ X - (WISQR(MM+2)*WIB(MM+2))) / WISQR(MM+1)
+C
+C Accept backwards generated coefficients if forward
+C recursion failed before reaching this point.
+C
+ IF ( (MM.LT.IEND ) .AND. ABSCHK(S,WIB(MM)) ) GOTO 500
+ WIB(MM) = S
+C
+C If absolute value is greater than 1, give up.
+C
+ IF (ABS(S).GT.1.0) GOTO 910
+C
+ ENDDO
+C
+C End of backwards recurrences reached with no agreed
+C coefficients, give up.
+C
+ GOTO 910
+C
+C -----------------------------------------------------------------|
+C* Section 5. Got RNKM. Now transform spectral data.
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+C Put coefficients in allocated memory
+C
+!OCL VECTOR
+ DO LOOP = 1, N+1
+ ACOEFF(ICNDEX +LOOP) = WIR(LOOP)
+ ACOEFF(ICNDEX+N+1+LOOP) = WIB(LOOP)
+ ENDDO
+C
+ ENDIF
+C
+C Coefficients are in memory
+C
+ PKN = W(K*(NM+1) + (N-K+1))
+ PK1N = W((K-1)*(NM+1) + (N-(K-1)+1))
+C
+C Flip sign if necessary.
+C
+ IF (MOD(K,2).NE.0)THEN
+ PKN = -PKN
+ ELSE
+ PK1N = -PK1N
+ ENDIF
+C
+!OCL VECTOR
+ DO LOOP = 1, N+1
+ WIR(LOOP) = ACOEFF(ICNDEX +LOOP)
+ WIB(LOOP) = ACOEFF(ICNDEX+N+1+LOOP)
+ ENDDO
+ ICNDEX = ICNDEX + 2*(N+1)
+C
+C
+C Special case when K=0.
+C
+ IF( K.EQ.0) THEN
+C
+ SREAL = DATA(2*(N+1)-1)*PKN
+ SIMAG = 0.0
+!OCL VECTOR
+ DO M = 1,N
+ SREAL = SREAL
+ X + 2.0*DATA(2*((NM+1)*M-((M-1)*M)/2+1+N-M)-1)
+ X * W((NM+1)*M+(N-M+1))
+ ENDDO
+C
+ NDEX = 1+N
+ WIDAT(NN) = SREAL
+ WIDAT(NN+1) = SIMAG
+ NN = NN + 2
+C
+ ELSE
+C
+ SREAL = DATA(2*(N+1)-1)*PKN
+ SIMAG = 0.0
+!OCL VECTOR
+ DO M = 1,N
+ INDEXR(M) = 2*((NM+1)*M-((M-1)*M)/2+1+N-M)-1
+ ENDDO
+!OCL VECTOR
+ DO M = 1,N
+ INDEXI(M) = INDEXR(M) + 1
+ ENDDO
+C
+!OCL VECTOR
+ DO M = 1,N
+ SREAL = SREAL +
+ X DATA(INDEXR(M))
+ X * (WIR(M+1)+WIB(M+1)*MINUS1(M))
+ SIMAG = SIMAG -
+ X DATA(INDEXI(M))
+ X * (-WIR(M+1)+WIB(M+1)*MINUS1(M))
+ ENDDO
+C
+ NDEX = (NM+1)*K - ((K-1)*K)/2+1+N-K
+ WIDAT(NN) = SREAL
+ WIDAT(NN+1) = SIMAG
+ NN = NN + 2
+ ENDIF
+C
+C Update RNKN at both ends of the forward and backward
+C recurrences.
+C
+ TEMP = DSQRT(DBLE(N+K)/DBLE(N-K+1))
+ RNKN = RNKN*TEMP*SINB/(1+COSB)
+ BNKN = -BNKN*TEMP*(1+COSB)/SINB
+C
+C End of inner loop.
+C
+ 590 CONTINUE
+C
+C -----------------------------------------------------------------|
+C* Section 6. Now place the values of the rotated spectral
+C coefficients in DATA.
+C -----------------------------------------------------------------|
+C
+ 600 CONTINUE
+C
+ NN = 1
+!OCL VECTOR
+ DO K = N,0,-1
+ NDEX = (NM+1)*K - ((K-1)*K)/2+1+N-K
+ DATA(2*NDEX-1) = WIDAT(NN)
+ DATA(2*NDEX) = WIDAT(NN+1)
+ NN = NN + 2
+C
+ ENDDO
+C
+C End of outer loop.
+C
+ 630 CONTINUE
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ LINMEM = .TRUE.
+C
+ IF( .NOT. LEXIST ) THEN
+C
+C If the environment variable PP_SAVE_ROT is set, save the
+C rotation coefficients in a file.
+C 'Standard' rotations go into PP_ROT_DIR, others into TMPDIR.
+C
+ LEXIST = .TRUE.
+ CALL GETENV('PP_SAVE_ROT',FILENAME)
+ IOFFSET = INDEX(FILENAME,' ')
+ IF( IOFFSET.GT.1 ) THEN
+ IF( LALLOW ) THEN
+ CALL GETENV('PP_ROT_DIR',FILENAME)
+ ELSE
+ CALL GETENV('TMPDIR',FILENAME)
+ ENDIF
+ IOFFSET = INDEX(FILENAME,' ')
+ IF( IOFFSET.EQ.1) THEN
+ CALL INTLOG(JP_WARN,
+ X 'JACOBIF: Unable to save rotation coefficents.',JPQUIET)
+C
+ ELSE
+C
+C Let user know that a new file is being created.
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'JACOBIF: Creating new coefficients in directory',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JACOBIF: '// FILENAME(1:IOFFSET-1),JPQUIET)
+C
+ WRITE(COEFILE(12:14),'(I3.3)') NM
+ IF( ILAT.GE.0) THEN
+ WRITE(COEFILE(16:),'(I9.9)') ILAT
+ ELSE
+ COEFILE(16:) = 'M'
+ WRITE(COEFILE(17:),'(I8.8)') -ILAT
+ ENDIF
+ FILENAME = FILENAME(1:IOFFSET-1) // '/' // COEFILE
+ IOFFSET = INDEX(FILENAME,' ')
+C
+ CALL PBOPEN(IUNIT,FILENAME(1:IOFFSET-1),'w',IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_WARN,
+ X 'JACOBIF: PBOPEN for write failed',JPQUIET)
+ GOTO 995
+ ENDIF
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'JACOBIF: New coefficients filename:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'JACOBIF: '// COEFILE, JPQUIET)
+C
+C Change access mode to 'read only' for all users.
+C
+ IRET = JCHMOD(FILENAME(1:IOFFSET-1),'0444')
+ IF( IRET.NE.0 )
+ X CALL INTLOG(JP_WARN,'JACOBIF: JCHMOD error.',IRET)
+C
+C Write coefficients to file
+C
+ CALL PBWRITE(IUNIT,ACOEFF,IFSIZE,IRET)
+ IF( IRET.NE.IFSIZE ) THEN
+ CALL INTLOG(JP_FATAL,'JACOBIF: PBWRITE failed.',JPQUIET)
+ IRET = UNLINK(FILENAME(1:IOFFSET-1))
+ IF( IRET.NE.0 )
+ X CALL INTLOG(JP_FATAL,'JACOBIF: UNLINK failed',JPQUIET)
+ CALL PBCLOSE(IUNIT,IRET)
+ JACOBIF = .FALSE.
+ GOTO 999
+ ENDIF
+ CALL PBCLOSE(IUNIT,IRET)
+ LINMEM = .TRUE.
+ ENDIF
+ ENDIF
+ ENDIF
+C
+ 995 CONTINUE
+C
+ JACOBIF = .TRUE.
+C
+ 999 CONTINUE
+ RETURN
+C
+C Failure to converge with M < 0.
+C
+ 910 CONTINUE
+ CALL INTLOG(JP_FATAL,'JACOBIF: Fail to converge M < 0', JPQUIET)
+ JACOBIF = .FALSE.
+ GOTO 999
+C
+C Failure to converge with M > 0.
+C
+ 920 CONTINUE
+ CALL INTLOG(JP_FATAL,'JACOBIF: Fail to converge M > 0', JPQUIET)
+ JACOBIF = .FALSE.
+ GOTO 999
+ END
diff --git a/interpolation/jagggp.F b/interpolation/jagggp.F
new file mode 100755
index 0000000..597956a
--- /dev/null
+++ b/interpolation/jagggp.F
@@ -0,0 +1,580 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JAGGGP( PSHUP, KTRUNC, PNORTH, PSOUTH, PWEST, PEAST,
+ X KNUM, HTYPE, KPTS, POUTF, LUV, KRET)
+C
+C---->
+C**** JAGGGP
+C
+C PURPOSE
+C _______
+C
+C This routine converts spectral input fields to a gaussian
+C grid field.
+C
+C INTERFACE
+C _________
+C
+C CALL JAGGGP( PSHUP, KTRUNC, PNORTH, PSOUTH, PWEST, PEAST,
+C X KNUM, HTYPE, KPTS, POUTF, LUV, KRET)
+C
+C Input parameters
+C ________________
+C
+C PSHUP - Spherical harmonics field, unpacked
+C KTRUNC - Truncation number of spherical harmonics field
+C PNORTH - Northernmost latitude for output field (degrees)
+C PSOUTH - Southernmost latitude for output field (degrees)
+C PWEST - Westernmost longitude for output field (degrees)
+C PEAST - Easternmost longitude for output field (degrees)
+C KNUM - Gaussian grid number
+C HTYPE - Gaussian grid type
+C = 'R' for reduced,
+C = 'F' for full
+C = 'U' for user-defined reduced gaussian grid
+C KPTS - Array specifying number of points at each line of
+C latitude if HTYPE = 'U'.
+C (Must be big enough for both hemispheres, but only
+C needs to give Northern hemisphere values from pole
+C to latitude nearest the Equator.)
+C LUV - Code indicating whether or not the field is a wind
+C component field;
+C = 1 if U or V field.
+C
+C Output parameters
+C ________________
+C
+C KPTS - Array specifying number of points at each line of
+C latitude; user defined values if HTYPE = 'U'.
+C (Must be big enough for both hemispheres)
+C POUTF - Output grid point field
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG, JDCFLAGS
+C
+C Method
+C ______
+C
+C None.
+C
+C
+C Externals
+C _________
+C
+C JGETGG - Pick up the definition of the gaussian grid.
+C JOPNGG - Opens the legendre functions file for reading line
+C by line.
+C JOPNGGF - Opens the legendre functions file and reads the whole
+C of it into dynamically allocated memory.
+C JOPNGGSM - Opens the legendre functions file and memory maps it.
+C JJSET99 - Sets up FFT
+C JNORSGG - Determines which latitude row in a gaussian grid is
+C north or south of a given latitude
+C JSYMGG - Generate symmetric grid from spherical harmonics
+C JWSCAL - Apply latitude correction to wind component field
+C JMVUGG - Moves grid point data to output array
+C JMKOFGG - Builds offsets into storage array
+C JDEBUG - Checks environment variable to switch on/off debug
+C INTLOG - Logs output messages
+C INTLOGR - Logs output messages
+C GETCONF - Decides how to handle legendre coefficients
+C GETENV - Get value of an environment variable
+#ifdef SHAREDMEMORY
+C SMREAD - Gets interpolation coefficients in a shared memory array
+#endif
+C
+C
+C Reference
+C _________
+C
+C None
+C
+C
+C Comments
+C ________
+C
+C It handles transformations to a gaussian grid.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Jan 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C----<
+C _______________________________________________________
+C
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+#include "current.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+C
+C Subroutine arguments
+C
+ COMPLEX PSHUP
+ DIMENSION PSHUP(*)
+ INTEGER KTRUNC, KNUM, KPTS, KRET
+ DIMENSION KPTS(*)
+ CHARACTER*1 HTYPE
+ REAL PNORTH, PSOUTH, PWEST, PEAST
+ REAL POUTF
+ DIMENSION POUTF(*)
+ INTEGER LUV
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 31600 )
+C
+C Local variables
+C
+ INTEGER ILON, ITOUP1, IJPWR, NUMPTS, ITYPE
+ DIMENSION IJPWR(JPMAX)
+ INTEGER ILUNIT
+ INTEGER NXTROW
+ REAL RINTVL, GNUM
+C
+ INTEGER IMFAX
+ REAL ATRIGS
+ DIMENSION IMFAX(10),ATRIGS(JPLONO*2)
+#ifdef POINTER_64
+ INTEGER*8 IALEG, IZFA
+#endif
+#ifdef CRAY
+ REAL ALEG
+ DIMENSION ALEG(JPK)
+ REAL ZFA
+ DIMENSION ZFA(JPLONO+2, 64)
+#else
+ REAL ALEG
+ DIMENSION ALEG(1)
+ POINTER ( IALEG, ALEG )
+ REAL ZFA
+ DIMENSION ZFA(1)
+ POINTER ( IZFA, ZFA )
+#endif
+ INTEGER ISIZE
+ DATA ISIZE/0/
+ SAVE ISIZE, IZFA
+C
+ CHARACTER*10 PLAINUV
+C
+ CHARACTER*8 FILENAME
+ DATA FILENAME/'Nxxx_DEF'/
+ INTEGER NGROUP
+ INTEGER FILENM, J108, NNORTH, NSOUTH, NCASE, NFLAG
+ INTEGER NOFSET, LOOP
+ DIMENSION NOFSET(JPMAX)
+ INTEGER INORTH, ISOUTH, IMAGE, NFIRST, NDIFF
+ DATA FILENM/67/
+ REAL ALAT
+ DIMENSION ALAT(JPMAX)
+C
+ SAVE ILUNIT, IALEG
+C
+ LOGICAL LDEBUG, LFIRST, LPLAINU
+ DATA LFIRST/.TRUE./, LPLAINU/.FALSE./
+ SAVE LDEBUG, LFIRST, LPLAINU
+ CHARACTER*20 CONFIG
+ INTEGER IBLANK
+C
+ INTEGER JNORSGG
+ EXTERNAL JNORSGG
+#ifdef SHAREDMEMORY
+ INTEGER SHAREDGG
+ EXTERNAL SHAREDGG
+#endif
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ CALL JDEBUG( )
+ LDEBUG = NDBG.GT.0
+C
+C Decide how to handle legendre coefficients
+C
+ CALL GETCONF()
+C
+ IF( LFIRST ) THEN
+C
+ LFIRST = .FALSE.
+C
+C Check environment variable to see if wind components are plain
+C U and V, or U*cos(theta) and V*cos(theta) (the default).
+C
+ CALL GETENV('INTERP_PLAIN_UV', PLAINUV)
+ IBLANK = INDEX(PLAINUV, ' ')
+C
+ IF( (IBLANK.EQ.3).AND.(PLAINUV(1:2).EQ.'ON') ) LPLAINU =.TRUE.
+ IF( (IBLANK.EQ.3).AND.(PLAINUV(1:2).EQ.'on') ) LPLAINU =.TRUE.
+ IF( (IBLANK.EQ.4).AND.(PLAINUV(1:3).EQ.'YES') ) LPLAINU =.TRUE.
+ IF( (IBLANK.EQ.4).AND.(PLAINUV(1:3).EQ.'yes') ) LPLAINU =.TRUE.
+C
+ IF( (IBLANK.EQ.3).AND.(PLAINUV(1:2).EQ.'NO') ) LPLAINU =.FALSE.
+ IF( (IBLANK.EQ.3).AND.(PLAINUV(1:2).EQ.'no') ) LPLAINU =.FALSE.
+ IF( (IBLANK.EQ.4).AND.(PLAINUV(1:3).EQ.'OFF') ) LPLAINU =.FALSE.
+ IF( (IBLANK.EQ.4).AND.(PLAINUV(1:3).EQ.'off') ) LPLAINU =.FALSE.
+C
+#ifndef CRAY
+C
+C First time through, dynamically allocate memory for workspace
+C
+ ISIZE = (JPLONO+2)*64
+ CALL JMEMHAN( 10, IZFA, ISIZE, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JAGGGP: memory allocation error.',IZFA)
+ KRET = JPROUTINE + 1
+ GOTO 990
+ ENDIF
+ ENDIF
+#endif
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'JAGGGP: Input parameters:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JAGGGP: Spherical harmonic truncation = ', KTRUNC)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JAGGGP: Northern latitude for output = ', PNORTH)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JAGGGP: Southern latitude for output = ', PSOUTH)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JAGGGP: Western longitude for output = ', PWEST)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JAGGGP: Eastern longitude for output = ', PEAST)
+ CALL INTLOG(JP_DEBUG,
+ X 'JAGGGP: Gaussian grid number = ', KNUM)
+C
+ IF( HTYPE.EQ.'R' .OR. HTYPE.EQ.'r' ) CALL INTLOG(JP_DEBUG,
+ X 'JAGGGP: Grid type is Reduced.',JPQUIET)
+ IF( HTYPE.EQ.'F' .OR. HTYPE.EQ.'f' ) CALL INTLOG(JP_DEBUG,
+ X 'JAGGGP: Grid type is Full.',JPQUIET)
+ IF( HTYPE.EQ.'U' .OR. HTYPE.EQ.'u' ) CALL INTLOG(JP_DEBUG,
+ X 'JAGGGP: Grid type is User.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JAGGGP: Field code( = 1 for U or V) = ', LUV)
+C
+ IF ( HTYPE .EQ. 'u' .OR. HTYPE .EQ. 'U' ) THEN
+ CALL INTLOG(JP_DEBUG,'JAGGGP: User-supplied values.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'JAGGGP: No. pts at each line:',JPQUIET)
+ DO NDBGLP = 1, 20
+ CALL INTLOG(JP_DEBUG,' ',KPTS( NDBGLP ))
+ ENDDO
+ ENDIF
+ ENDIF
+C
+C Pick up the file containing the definition of the gaussian grid.
+C
+ IF( (NOGAUSO.NE.KNUM).OR.(HOGAUST.NE.HTYPE) ) THEN
+ CALL JGETGG( KNUM, HTYPE, ALAT, KPTS, KRET)
+ IF ( KRET .NE. 0 ) GOTO 990
+ NOGAUSO = KNUM
+ HOGAUST = HTYPE
+ ELSE
+ DO LOOP = 1, KNUM*2
+ ALAT(LOOP) = ROGAUSS(LOOP)
+ KPTS(LOOP) = NOLPTS(LOOP)
+ ENDDO
+ ENDIF
+C
+C If coefficients are not to generated 'on the fly',
+C open the appropriate legendre function file.
+C
+ IF( LFILEIO ) THEN
+ ISIZE = JPK
+ CALL JMEMHAN( 14, IALEG, ISIZE, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JAGGGP: memory allocate error',IALEG)
+ KRET = JPROUTINE + 2
+ GOTO 990
+ ENDIF
+ CALL JOPNGG( ALEG, KNUM, KTRUNC, ILUNIT, ALAT, KRET)
+ ELSE IF( LMEMORY ) THEN
+ CALL JOPNGGF( IALEG, KNUM, KTRUNC, ILUNIT, ALAT, KRET)
+ ELSE IF( LMAPPED ) THEN
+ CALL JOPNGGSM( IALEG, KNUM, KTRUNC, ILUNIT, ALAT, KRET)
+#ifdef SHAREDMEMORY
+ ELSE IF( LSHARED ) THEN
+ GNUM = REAL(KNUM)
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'JAGGGP: call SHAREDGG', JPQUIET)
+ ENDIF
+C
+ KRET = SHAREDGG(IALEG,KTRUNC,KNUM)
+C
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JAGGGP: SHARED MEMORY Failed to get legendre coeff.',KRET)
+ KRET = JPROUTINE + 3
+ GOTO 990
+ ENDIF
+ GOTO 102
+#endif
+ ELSE
+ ISIZE = (KTRUNC+1)*(KTRUNC+2)
+ CALL JMEMHAN( 14, IALEG, ISIZE, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JAGGGP: memory allocate error.',IALEG)
+ KRET = JPROUTINE + 2
+ GOTO 990
+ ENDIF
+ ENDIF
+C
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JAGGGP: Failed to get legendre coefficients',KRET)
+ KRET = JPROUTINE + 3
+ GOTO 990
+ ENDIF
+C
+ 102 CONTINUE
+C
+C Determine which latitude rows in the gaussian grid are in the
+C requested area
+C
+ NNORTH = JNORSGG( PNORTH, ALAT, KNUM, 1)
+ NSOUTH = JNORSGG( PSOUTH, ALAT, KNUM, 0)
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JAGGGP: Gaussian latitudes in requested area:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'JAGGGP: NORTH = ',NNORTH)
+ CALL INTLOG(JP_DEBUG,'JAGGGP: SOUTH = ',NSOUTH)
+ ENDIF
+C
+C
+C For calculation purposes, the number of longitude points for each
+C latitude row has to be greater than 2*(output truncation) to
+C ensure the fourier transform is exact (see Reference, page 10).
+C
+C The following loop calculates the power of 2 to be used as a
+C multipier for each row to ensure there are enough points.
+C Later, when filling the output array POUTF, the longitude points
+C have to be taken selectively to avoid the intermediate generated
+C points, picking up values only at the required longitudes.
+C
+ ITOUP1 = KTRUNC
+ DO 108 J108 = 1, KNUM
+ IMAGE = 2*KNUM - J108 + 1
+ ILON = KPTS(J108)
+ IJPWR(J108) = 1
+ 104 CONTINUE
+ IF(ILON .GT. 2*ITOUP1) GOTO 106
+ IJPWR(J108) = IJPWR(J108)*2
+ ILON = ILON*2
+ GOTO 104
+ 106 CONTINUE
+ IJPWR(IMAGE) = IJPWR(J108)
+ 108 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 2. Work out geometry of the request
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Latitude rows are generated from row INORTH to ISOUTH.
+C Selection is carried out for actual requested rows when the
+C calculated values are moved to the output array.
+C
+C Start with assumption that the area is symmetrical about equator.
+C
+ NCASE = 1
+ NFLAG = 3
+ INORTH = NNORTH
+ ISOUTH = KNUM
+ NDIFF = 0
+C
+C Northern hemisphere only ?
+C
+ IF ( PSOUTH .GE. 0.0 ) THEN
+ NCASE = 2
+ NFLAG = 1
+ INORTH = NNORTH
+ ISOUTH = NSOUTH
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JAGGGP: North hemisphere only.',JPQUIET)
+ GOTO 220
+ ENDIF
+C
+C Southern hemisphere only ?
+C
+ IF ( PNORTH .LE. 0.0 ) THEN
+ NCASE = 3
+ NFLAG = 2
+ INORTH = 2*KNUM - NSOUTH + 1
+ ISOUTH = 2*KNUM - NNORTH + 1
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JAGGGP: South hemisphere only.',JPQUIET)
+ GOTO 220
+ ENDIF
+C
+C Straddles equator ...
+C ... more north than south?
+C
+ IF ( PNORTH .GT. -PSOUTH ) THEN
+ NCASE = 4
+ INORTH = NNORTH
+ ISOUTH = KNUM
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'JAGGGP: Straddles equator.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'JAGGGP: More north than south',JPQUIET)
+ ENDIF
+ GOTO 220
+ ENDIF
+C
+C ... more south than north?
+C
+ IF ( PNORTH .LT. -PSOUTH ) THEN
+ NCASE = 5
+ INORTH = 2*KNUM - NSOUTH + 1
+ ISOUTH = KNUM
+ NDIFF = NNORTH - INORTH
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'JAGGGP: Straddles equator.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'JAGGGP: More south than north',JPQUIET)
+ ENDIF
+ ENDIF
+C
+C Setup the storage offset for the given latitude range
+C
+ 220 CONTINUE
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'JAGGGP: INORTH = ', INORTH)
+ CALL INTLOG(JP_DEBUG,'JAGGGP: ISOUTH = ', ISOUTH)
+ ENDIF
+ CALL JMKOFGG(HTYPE,NNORTH,NSOUTH,PWEST,PEAST,KNUM,KPTS,NOFSET)
+C
+C _______________________________________________________
+C
+C* Section 3. Process all latitude rows
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JAGGGP: Process latitude rows.',JPQUIET)
+C
+ NGROUP = 0
+C
+ DO 320 NXTROW = INORTH, ISOUTH
+C
+C Build up a group of lines of the same length which can all
+C be transformed at the same time.
+ NGROUP = NGROUP + 1
+C
+C Initialise FFT constants for the group
+C
+ IF ( NGROUP .EQ. 1 ) THEN
+ NFIRST = NXTROW
+ ILON = KPTS(NFIRST) * IJPWR(NFIRST)
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JAGGGP: Initialise FFT consts for the group.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JAGGGP: Latitude number = ', NFIRST)
+ CALL INTLOG(JP_DEBUG,
+ X 'JAGGGP: No. of calculated long.pts = ', ILON)
+ ENDIF
+C
+ CALL JJSET99( ATRIGS, IMFAX, ILON, KRET)
+ IF( KRET .NE. 0 ) GOTO 990
+ ENDIF
+C
+C If the current line is the last to be processed,
+C or the next line is not suitable for the current group,
+C or 32 lines are in the group already ...
+C
+ IF ( ( NXTROW .EQ. ISOUTH)
+ X .OR. ( KPTS(NFIRST) .NE. KPTS(NXTROW+1) )
+ X .OR. ( NGROUP .EQ. JP32 ) ) THEN
+C
+C Calculate the points along the line of latitude
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JAGGGP: Number in group = ', NGROUP)
+C
+ CALL JSYMGG( PSHUP, KTRUNC, NFIRST, ILUNIT, NGROUP, ILON,
+ X ALAT, ALEG, ATRIGS, IMFAX, ZFA, KRET)
+ IF( KRET .NE. 0 ) GOTO 990
+C
+C If it is a wind component field formed from spectral Ucos(theta)
+C and Vcos(theta) (ie not just spectral U and V), apply a
+C latitude correction
+C
+ IF( (LUV.EQ.1).AND.(.NOT.LPLAINU) )
+ X CALL JWSCAL(ZFA, NGROUP, ILON, NFIRST, ALAT)
+C
+C Store away the generated latitudes
+C
+ IF( (HTYPE .EQ. 'U') .OR. (HTYPE .EQ. 'R') ) THEN
+ NUMPTS = KPTS(NFIRST)
+ ELSE
+ RINTVL = (PEAST - PWEST)*FLOAT( KPTS(NFIRST) ) / 360.0
+ NUMPTS = NINT( RINTVL ) + 1
+ ENDIF
+C
+C Is the area unequally distributed about the equator?
+C
+ IF ( NCASE .EQ. 4 .OR. NCASE .EQ. 5 ) THEN
+ CALL JMVUGG( ZFA, NNORTH, NSOUTH, PWEST, KNUM, NFIRST,
+ X NDIFF, NGROUP, NUMPTS, ILON,
+ X IJPWR(NFIRST), NOFSET, POUTF)
+ NDIFF = MAX( 0, (NDIFF - NGROUP) )
+C
+C No, it is all in one hemisphere or is symmetrical
+C about the equator
+C
+ ELSE
+ CALL JMOVGG( ZFA, PWEST, KNUM, NFIRST, NGROUP, NUMPTS,
+ X ILON, IJPWR(NFIRST), NOFSET, POUTF, NFLAG)
+ ENDIF
+C
+C Startup next group of latitudes
+C
+ NGROUP = 0
+ ENDIF
+C
+ 320 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 930 CONTINUE
+ KRET = 0
+C
+ 990 CONTINUE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,'JAGGGP: Return code = ', KRET)
+C
+ RETURN
+ END
diff --git a/interpolation/jallgp.F b/interpolation/jallgp.F
new file mode 100755
index 0000000..b691d97
--- /dev/null
+++ b/interpolation/jallgp.F
@@ -0,0 +1,542 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JALLGP( PSHUP, KTRUNC, PNORTH, PSOUTH, PWEST, PEAST,
+ X PLATINC, PLONINC, POUTF, KRET)
+C
+C---->
+C**** JALLGP
+C
+C PURPOSE
+C _______
+C
+C This routine converts spectral input fields to standard
+C lat/long grid fields.
+C
+C INTERFACE
+C _________
+C
+C CALL JALLGP( PSHUP, KTRUNC, PNORTH, PSOUTH, PWEST, PEAST,
+C X PLATINC, PLONINC, POUTF, KRET)
+C
+C Input parameters
+C ________________
+C
+C PSHUP - Spherical harmonics field, unpacked
+C KTRUNC - Truncation number of spherical harmonics field
+C PNORTH - Northernmost latitude for output field (degrees)
+C PSOUTH - Southernmost latitude for output field (degrees)
+C PWEST - Westernmost longitude for output field (degrees)
+C PEAST - Easternmost longitude for output field (degrees)
+C PLATINC - Grid interval between latitudes in degrees
+C PLONINC - Grid interval between longitudes in degrees
+C
+C Output parameters
+C ________________
+C
+C POUTF - Output grid point field
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG, JDCFLAGS
+C
+C
+C Method
+C ______
+C
+C None.
+C
+C Externals
+C _________
+C
+C JOPNLL - Opens the legendre functions file for reading line
+C by line.
+C JOPNLLF - Opens the legendre functions file and reads the whole
+C of it into dynamically allocated memory.
+C JOPNLLSM - Opens the legendre functions file and memory maps it.
+C
+C JJSET99 - Sets up FFT
+C JSYMLL - Generate symmetric grid from spherical harmonics
+C JWINDLL - Generate symmetric grid from spherical harmonics(wind)
+C JMOVLL - Move points of symmetric grid to array
+C JMVULL - Move points of unsymmetric grid to array
+C JDEBUG - Checks environment variable to switch on/off debug
+C INTLOG - Logs output messages
+C INTLOGR - Logs output messages
+C GETENV - Get value of an environment variable
+C GETCONF - Decides how to handle legendre coefficients
+#ifdef SHAREDMEMORY
+C SMREAD - Gets interpolation coefficients in a shared memory array
+#endif
+C
+C
+C Reference
+C _________
+C
+C E.C.M.W.F. Research Department technical memorandum no. 56
+C "The forecast and analysis post-processing package"
+C May 1982. J.Haseler.
+C
+C
+C Comments
+C ________
+C
+C This is a redesign, based on SPECGP.F
+C
+C It handles transformations to a regular lat/long grid assuming.
+C
+C It is not for U and V fields (no correction is applied at the
+C poles).
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Nov 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+#include "nifld.common"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ REAL PEPS
+ PARAMETER ( JPROUTINE = 30000 )
+ PARAMETER ( PEPS = 1E-6 )
+C |
+C `-> value used to compare equality of calculated
+C latitude with area limits
+C
+C Subroutine arguments
+C
+ COMPLEX PSHUP
+ DIMENSION PSHUP(*)
+ INTEGER KTRUNC
+ REAL PNORTH, PSOUTH, PWEST, PEAST, PLATINC, PLONINC
+ REAL POUTF
+ DIMENSION POUTF(*)
+ INTEGER KRET
+C
+C Local variables
+C
+ REAL PSTART, PNORMX, PDIFF
+ REAL ZDEGR, ZBUILD
+ INTEGER ILON, IOLON, ITOUP1, IJPWR, ITYPE
+ INTEGER ILUNIT, ISTART
+ INTEGER NEXT, NCALLS, NLEFT, NROWS, NFLAG, NCASE, NUMLON
+C
+ INTEGER IMFAX
+ REAL ATRIGS
+ DIMENSION IMFAX(10),ATRIGS(JPLONO*2)
+#ifdef POINTER_64
+ INTEGER*8 IALEG, IZFA
+#endif
+#ifdef CRAY
+ REAL ALEG
+ DIMENSION ALEG(JPK)
+ REAL ZFA
+ DIMENSION ZFA(JPLONO+2, 64)
+#else
+ REAL ALEG
+ DIMENSION ALEG(1)
+ POINTER ( IALEG, ALEG )
+ REAL ZFA
+ DIMENSION ZFA(1)
+ POINTER ( IZFA, ZFA )
+#endif
+C
+C Integer Itimer,timer1
+ INTEGER ISIZE, ISIZE2
+ DATA ISIZE/0/, ISIZE2/0/
+ SAVE ISIZE, ISIZE2, IZFA
+C
+ SAVE ILUNIT, IMFAX, ATRIGS, IALEG
+C
+ LOGICAL LDEBUG, LFIRST
+ DATA LFIRST/.TRUE./
+ SAVE LDEBUG, LFIRST
+ CHARACTER*20 CONFIG
+ INTEGER IBLANK
+C
+C Externals
+C
+#ifdef SHAREDMEMORY
+ INTEGER SHAREDLL
+ EXTERNAL SHAREDLL
+#endif
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ CALL JDEBUG( )
+ LDEBUG = NDBG.GT.0
+C
+C Decide how to handle legendre coefficients
+C
+ CALL GETCONF()
+C
+#ifndef CRAY
+C
+C First time through, dynamically allocate memory for workspace
+C
+ IF( LFIRST ) THEN
+ LFIRST = .FALSE.
+ ISIZE = (JPLONO+2)*64
+ CALL JMEMHAN( 10, IZFA, ISIZE, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JALLGP: memory allocation error.',IZFA)
+ KRET = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+ ENDIF
+#endif
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'JALLGP: Input parameters:', JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JALLGP: Spherical harmonic coeffs(first 20):', JPQUIET)
+ DO NDBGLP = 1, 20
+ CALL INTLOGR(JP_DEBUG,' ', PSHUP( NDBGLP ))
+ ENDDO
+ CALL INTLOG(JP_DEBUG,
+ X 'JALLGP: Spherical harmonic truncation = ', KTRUNC)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JALLGP: Northern latitude for output = ', PNORTH)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JALLGP: Southern latitude for output = ', PSOUTH)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JALLGP: Western longitude for output = ', PWEST)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JALLGP: Eastern longitude for output = ', PEAST)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JALLGP: Latitude grid interval (deg) = ', PLATINC)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JALLGP: Longitude grid interval (deg) = ', PLONINC)
+ ENDIF
+C
+C Open the appropriate legendre function file.
+C
+ IF( LFILEIO ) THEN
+ ISIZE2 = JPK
+ CALL JMEMHAN( 14, IALEG, ISIZE2, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JALLGP: memory allocate error.',IALEG)
+ KRET = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ CALL JOPNLL( ALEG, PLATINC, KTRUNC, ILUNIT, ZBUILD, KRET)
+C
+ ELSE IF( LMEMORY ) THEN
+ CALL JOPNLLF( IALEG, PLATINC, KTRUNC, ILUNIT, ZBUILD, KRET)
+C
+ ELSE IF( LMAPPED ) THEN
+ CALL JOPNLLSM( IALEG, PLATINC, KTRUNC, ILUNIT, ZBUILD, KRET)
+C
+#ifdef SHAREDMEMORY
+ ELSE IF( LSHARED ) THEN
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'JALLGP: call SHAREDLL:', JPQUIET)
+ ENDIF
+
+ KRET=SHAREDLL(IALEG,KTRUNC,PLATINC)
+
+c print*,' jallgp.F KRET=',KRET
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JALLGP: SHARED Failed to get legendre coeff.',KRET)
+ KRET = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+ GOTO 102
+#endif
+ ELSE
+ ISIZE2 = (KTRUNC+1)*(KTRUNC+2)
+ CALL JMEMHAN( 14, IALEG, ISIZE2, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JALLGP: memory allocate error.',IALEG)
+ KRET = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JALLGP: Failed to get legendre coefficients',KRET)
+ KRET = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+ 102 CONTINUE
+C
+ ZDEGR = PPI / 180.0
+ IOLON = NINT( 360.0 / PLATINC )
+ ILON = NINT( 360.0 / PLONINC )
+ ITOUP1 = KTRUNC
+C
+C For calculation purposes, ILON, the number of longitude points,
+C has to be greater than 2*(output truncation) to ensure that the
+C fourier transform is exact (see Reference, page 10).
+C The following loop increases ILON*IJPWR until ILON=>2*ITOUP1.
+C Later, when filling the output array POUTF, the longitude points
+C have to be taken selectively to avoid the intermediate generated
+C points, picking up values only at the required longitudes.
+C
+ IJPWR = 1
+ 110 CONTINUE
+ IF( ILON.GT.2*ITOUP1 ) GOTO 120
+ IJPWR = IJPWR*2
+ ILON = ILON*2
+ GOTO 110
+ 120 CONTINUE
+C
+C Initialise FFT constants
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JALLGP: Initialise FFT constants with ', ILON)
+ CALL INTLOG(JP_DEBUG,
+ X 'JALLGP: longitude points.', JPQUIET)
+ ENDIF
+C
+ CALL JJSET99( ATRIGS, IMFAX, ILON, KRET)
+ IF( KRET.NE.0 ) GOTO 900
+C
+C _______________________________________________________
+C
+C* Section 2. Work out geometry of the request
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Symmetrical about equator?
+C
+ NCASE = 1
+ NFLAG = 3
+ PNORMX = PNORTH
+ PDIFF = 0.0
+ NROWS = NINT( PNORTH/PLATINC ) + 1
+ IF( ( ABS((NROWS-1)*PLATINC)-PNORTH).GT.PEPS ) NROWS = NROWS - 1
+C
+C Northern hemisphere only ?
+C
+ IF( PSOUTH.GT.0.0 ) THEN
+ NCASE = 2
+ NFLAG = 1
+ PNORMX = PNORTH
+ PDIFF = PNORTH - PSOUTH
+ NROWS = NINT( PDIFF/PLATINC ) + 1
+ IF( ( ABS((NROWS-1)*PLATINC)-PNORTH).GT.PEPS ) NROWS = NROWS - 1
+ IF( LDEBUG )
+ X CALL INTLOG(JP_DEBUG,
+ X 'JALLGP: North hemisphere only.', JPQUIET)
+ GOTO 300
+ ENDIF
+C
+C Southern hemisphere only ?
+C
+ IF( PNORTH.LT.0.0 ) THEN
+ NCASE = 3
+ NFLAG = 2
+ PNORMX = ABS(PSOUTH)
+ PDIFF = PNORMX + PNORTH
+ NROWS = NINT( PDIFF/PLATINC ) + 1
+ IF( ( ABS((NROWS-1)*PLATINC)-ABS(PSOUTH)).GT.PEPS )
+ X NROWS = NROWS - 1
+C
+ IF( LDEBUG )
+ X CALL INTLOG(JP_DEBUG,
+ X 'JALLGP: South hemisphere only.', JPQUIET)
+ GOTO 300
+ ENDIF
+C
+C Straddles equator ...
+C ... more north than south?
+C
+ IF( PNORTH.GT.-PSOUTH ) THEN
+ NCASE = 4
+ PNORMX = PNORTH
+ PDIFF = PNORTH + PSOUTH
+ NROWS = NINT( PNORMX/PLATINC ) + 1
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JALLGP: Straddles equator.', JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JALLGP: More north than south.', JPQUIET)
+ ENDIF
+ ENDIF
+C
+C ... more south than north?
+C
+ IF( PNORTH.LT.-PSOUTH ) THEN
+ NCASE = 5
+ PNORMX = ABS(PSOUTH)
+ PDIFF = PNORMX - PNORTH
+ NROWS = NINT( PNORMX/PLATINC ) + 1
+ IF( ( ABS((NROWS-1)*PLATINC)-PNORMX).GT.PEPS ) NROWS = NROWS - 1
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JALLGP: Straddles equator.', JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JALLGP: More south than north.', JPQUIET)
+ ENDIF
+ ENDIF
+C _______________________________________________________
+C
+C* Section 3. Calculation.
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ NUMLON = NINT( (PEAST - PWEST)/PLONINC ) + 1
+ ZBUILD = PLATINC
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'JALLGP: Number of longitudes = ', NUMLON)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JALLGP: North latitude used for calc = ', PNORMX)
+ CALL INTLOG(JP_DEBUG,'JALLGP: No.lats used in calc = ', NROWS)
+ ENDIF
+C
+ NCALLS = NROWS / JP32
+C
+ IF( LWIND ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JALLGP: No.of 32 rows (calls to JWINDLL) = ', NCALLS)
+ ELSE
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JALLGP: No.of 32 rows (calls to JSYMLL) = ', NCALLS)
+ ENDIF
+C _______________________________________________________
+C
+C* Section 4. Process 32 rows at a time.
+C _______________________________________________________
+C
+ 400 CONTINUE
+C
+C timer1=Itimer(0)
+ DO 420 NEXT = 1, NCALLS
+ PSTART = PNORMX - REAL( (NEXT -1)*JP32 ) *PLATINC
+ ISTART = INT((PSTART*1000.0)+0.5)
+ PSTART = ISTART/1000.0
+C
+ IF( LDEBUG )
+ X CALL INTLOGR(JP_DEBUG, 'JALLGP: Next latitude = ', PSTART)
+C
+C Generate the next 32 rows (Northern and Southern hemisphere).
+C
+ IF( LWIND ) THEN
+ CALL JWINDLL( PSHUP, KTRUNC, PSTART, ZBUILD, PLATINC, ILUNIT,
+ X JP32,ILON,ALEG,ATRIGS,IMFAX,ZFA,KRET)
+ ELSE
+ CALL JSYMLL( PSHUP, KTRUNC, PSTART, ZBUILD, PLATINC, ILUNIT,
+ X JP32,ILON,ALEG,ATRIGS,IMFAX,ZFA,KRET)
+ ENDIF
+ IF( KRET.NE.0 ) GOTO 900
+C
+C If area straddles the equator and has different number of
+C north/south rows, only move a selection of rows to output array.
+C
+ IF( (NCASE.EQ.4).OR.(NCASE.EQ.5) ) THEN
+ CALL JMVULL( ZFA, PNORTH, PSOUTH, PWEST, PLATINC, PLONINC,
+ X PSTART, PDIFF, JP32, NUMLON, ILON, IJPWR, POUTF)
+ PDIFF = PDIFF - PLATINC*JP32
+ IF( PDIFF.LT.0 ) NCASE = NCASE - 2
+C
+C Otherwise, move them all
+C
+ ELSE
+ CALL JMOVLL( ZFA, PNORTH, PWEST, PLATINC, PLONINC, PSTART,
+ X JP32, NUMLON, ILON, IJPWR, POUTF, NFLAG)
+ ENDIF
+C
+ 420 CONTINUE
+C timer1=Itimer(timer1)
+C print*,'jallgp.F legendre functions JSYMLL time:',timer1,' sec'
+
+C
+C _______________________________________________________
+C
+C* Section 5. Process leftover rows nearest the equator.
+C _______________________________________________________
+C
+ 500 CONTINUE
+C
+ NLEFT = MOD( NROWS, JP32 )
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JALLGP: No.of leftover rows nearest equator = ', NLEFT)
+C
+C
+ IF( NLEFT.NE.0 ) THEN
+ PSTART = PNORMX - REAL( NCALLS*JP32 ) *PLATINC
+C
+ IF( LDEBUG )
+ X CALL INTLOGR(JP_DEBUG, 'JALLGP: Next latitude = ',PSTART)
+C
+ IF( LWIND ) THEN
+ CALL JWINDLL( PSHUP, KTRUNC, PSTART, ZBUILD, PLATINC, ILUNIT,
+ X NLEFT,ILON,ALEG,ATRIGS,IMFAX,ZFA,KRET)
+ ELSE
+ CALL JSYMLL( PSHUP, KTRUNC, PSTART, ZBUILD, PLATINC, ILUNIT,
+ X NLEFT,ILON,ALEG,ATRIGS,IMFAX,ZFA,KRET)
+ ENDIF
+ IF( KRET.NE.0 ) GOTO 900
+C
+C If area straddles the equator and has different number of
+C north/south rows, only move a selection of rows to output array.
+C
+ IF( (NCASE.EQ.4).OR.(NCASE.EQ.5) ) THEN
+ CALL JMVULL( ZFA, PNORTH, PSOUTH, PWEST, PLATINC, PLONINC,
+ X PSTART, 0.0, NLEFT, NUMLON, ILON, IJPWR, POUTF)
+C
+C Otherwise, move them all
+C
+ ELSE
+ CALL JMOVLL( ZFA, PNORTH, PWEST, PLATINC, PLONINC, PSTART,
+ X NLEFT, NUMLON, ILON, IJPWR, POUTF, NFLAG)
+ ENDIF
+C
+ ENDIF
+C
+ KRET = 0
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/jallwn.F b/interpolation/jallwn.F
new file mode 100755
index 0000000..66d0189
--- /dev/null
+++ b/interpolation/jallwn.F
@@ -0,0 +1,148 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JALLWN( PSHUP, KTRUNC, PNORTH, PSOUTH, PWEST, PEAST,
+ X PLATINC, PLONINC, POUTF, KRET)
+C
+C---->
+C**** JALLWN
+C
+C PURPOSE
+C _______
+C
+C This routine converts spectral input fields to standard
+C lat/long grid fields.
+C
+C INTERFACE
+C _________
+C
+C CALL JALLWN( PSHUP, KTRUNC, PNORTH, PSOUTH, PWEST, PEAST,
+C X PLATINC, PLONINC, POUTF, KRET)
+C
+C Input parameters
+C ________________
+C
+C PSHUP - Spherical harmonics field, unpacked
+C KTRUNC - Truncation number of spherical harmonics field
+C PNORTH - Northernmost latitude for output field (degrees)
+C PSOUTH - Southernmost latitude for output field (degrees)
+C PWEST - Westernmost longitude for output field (degrees)
+C PEAST - Easternmost longitude for output field (degrees)
+C PLATINC - Grid interval between latitudes in degrees
+C PLONINC - Grid interval between longitudes in degrees
+C INTLOG - Output log message
+C INTLOGR - Output log message (with real value)
+C
+C Output parameters
+C ________________
+C
+C POUTF - Output grid point field
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG
+C
+C Method
+C ______
+C
+C Generates the latitudes in bands, 32 at a time plus some
+C remainder.
+C
+C Externals
+C _________
+C
+C JALLGP - Cnverts spectral fields to lat/long grid fields.
+C JSLLGP - Converts stretched spectral fields to lat/long grids
+C
+C
+C Reference
+C _________
+C
+C None.
+C
+C
+C Comments
+C ________
+C
+C Calls JALLGP or JSLLGP to do all the work!
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Nov 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers *ECMWF* Oct 1996
+C Replaced all code by a call to JALLGP.
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+#include "nifld.common"
+C
+C Subroutine arguments
+C
+ COMPLEX PSHUP
+ DIMENSION PSHUP(*)
+ INTEGER KTRUNC
+ REAL PNORTH, PSOUTH, PWEST, PEAST, PLATINC, PLONINC
+ REAL POUTF
+ DIMENSION POUTF(*)
+ INTEGER KRET
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 30000 )
+C
+C Local variables
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+ CALL JDEBUG( )
+C
+ IF( NDBG.GT.0 )
+ X CALL INTLOG(JP_DEBUG,'JALLWN: Calling JALLGP', JPQUIET)
+C
+ IF( RISTRET.NE.0 ) THEN
+ CALL JSLLGP( PSHUP, KTRUNC, PNORTH, PSOUTH, PWEST, PEAST,
+ X PLATINC, PLONINC, POUTF, KRET)
+ ELSE
+ CALL JALLGP( PSHUP, KTRUNC, PNORTH, PSOUTH, PWEST, PEAST,
+ X PLATINC, PLONINC, POUTF, KRET)
+ ENDIF
+C
+ IF( NDBG.GT.0 )
+ X CALL INTLOG(JP_DEBUG,'JALLWN: Returned from JALLGP', JPQUIET)
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/jchmod.c b/interpolation/jchmod.c
new file mode 100755
index 0000000..536a64f
--- /dev/null
+++ b/interpolation/jchmod.c
@@ -0,0 +1,65 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include "fortint.h"
+
+/*
+// FORTRAN callable chmod:
+//
+// INTEGER FUNCTION JCHMOD (NAME, MODE)
+// CHARACTER*(*) NAME, MODE
+//
+// The normal returned value is 0. Any other value will be a system error
+// number.
+//
+*/
+
+fortint jchmod_(char * filename, char * char_mode, long l1, long l2)
+{
+mode_t mode = 0;
+int i, status = 0;
+char * name;
+
+ if( (*char_mode) == '0' )
+ {
+ for( i = 0; i < l2; i++)
+ mode = (mode*8) + (*(char_mode+i)-'0');
+ }
+ else
+ {
+ for( i = 0; i < l2; i++)
+ mode = (mode*10) + (*(char_mode+i)-'0');
+ }
+
+ name = (char*) malloc(l1+1);
+ for( i = 0; i < l1; i++)
+ name[i] = filename[i];
+ name[l1] = '\0';
+
+ status = chmod(name, mode);
+ if( status ) {
+ perror("JCHMOD error");
+ exit(1);
+ }
+
+ free(name);
+
+ return (fortint) status;
+}
+
+fortint jchmod(char * filename, char * char_mode, long l1, long l2) {
+ return jchmod_(filename,char_mode,l1,l2);
+}
diff --git a/interpolation/jdebug.F b/interpolation/jdebug.F
new file mode 100755
index 0000000..b4dab35
--- /dev/null
+++ b/interpolation/jdebug.F
@@ -0,0 +1,147 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JDEBUG( )
+C
+C---->
+C**** JDEBUG
+C
+C PURPOSE
+C _______
+C
+C This routine checks whether the debug flag is to be turned on.
+C
+C
+C INTERFACE
+C _________
+C
+C CALL JDEBUG( )
+C
+C Input parameters
+C ________________
+C
+C None
+C
+C
+C Output parameters
+C ________________
+C
+C None
+C
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG - set flag NDBG.
+C JDCSPGP - set flag LFREECF, etc.
+C
+C
+C Method
+C ______
+C
+C On first call, checks whether or not the environment
+C variable JDCNDBG exists.
+C
+C
+C Externals
+C _________
+C
+C GETENV - Checks value of an environment variable.
+C INTLOGD - Switchs on/off the printing off interpoaltion messages
+C
+C
+C Reference
+C _________
+C
+C None
+C
+C
+C Comments
+C ________
+C
+C None.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Mar 1994
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers *ECMWF* 5 Sep 1995
+C Add call to intlogd.
+C
+C J.D.Chambers *ECMWF* 19 Mar 1998
+C Add setting of LFREECF, etc
+C
+C----<
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "jparam2.h"
+C
+C Local variables
+C
+ INTEGER NFIRST
+ DATA NFIRST/0/
+ CHARACTER*12 YFLAG
+ SAVE NFIRST
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF( NFIRST.EQ.0 ) THEN
+ NFIRST = 1
+C
+C Set debug level to control which messages are displayed
+C
+ CALL GETENV('JDCNDBG', YFLAG)
+ IF( YFLAG(1:1).EQ.' ' ) NDBG = 0
+ IF( YFLAG(1:1).EQ.'1' ) NDBG = 1
+ IF( YFLAG(1:1).EQ.'2' ) NDBG = 2
+ IF( YFLAG(1:1).EQ.'3' ) NDBG = 3
+ IF( NDBG.EQ.0 ) THEN
+ CALL INTLOGD(0)
+ ELSE
+ CALL INTLOGD(1)
+ ENDIF
+C
+C Initialise the flags controlling handling of spectral -> grid
+C interpolation coefficients memory unless already set by user
+C
+ IF( NFREECF.NE.11041967 ) THEN
+ LFREECF = .FALSE.
+ NFREECF = 11041967
+ ENDIF
+C
+C Clear the sizes of the memory areas used for coefficients in
+C spectral -> grid interpolations
+C
+ NISIZE6 = 0
+ NISIZE7 = 0
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/jfindfn.F b/interpolation/jfindfn.F
new file mode 100755
index 0000000..457d735
--- /dev/null
+++ b/interpolation/jfindfn.F
@@ -0,0 +1,121 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ LOGICAL FUNCTION JFINDFN( DIRNAME, FILENAME, KLEN, KUNIT)
+C
+C---->
+C**** JFINDFN
+C
+C Purpose
+C _______
+C
+C Completes the pathname given by a directory and filename, and
+C checks if the file exists.
+C
+C Interface
+C _________
+C
+C LFOUND = JFINDFN( DIRNAME, FILENAME, KLEN, KUNIT)
+C
+C Input parameters
+C ________________
+C
+C DIRNAME - the directory name.
+C FILENAME - the file name.
+C KLEN - number of characters in the name
+C
+C Output parameters
+C _________________
+C
+C The function returns .TRUE. if the file is opened; in which case:
+C FILENAME - the full pathname.
+C KLEN - number of characters in the full pathname
+C KUNIT - the opened file descriptor (from PBOPEN).
+C
+C Otherwise it returns .FALSE. and FILENAME and KLEN are unchanged
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Externals
+C _________
+C
+C PBOPEN - opens a file.
+C
+C Reference
+C _________
+C
+C None.
+C
+C Comments
+C ________
+C
+C None.
+C
+C Author
+C ______
+C
+C J.D.Chambers *ECMWF* Mar 1996
+C
+C----<
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+C Parameters
+Cjdc INTEGER JPROUTINE
+Cjdc PARAMETER ( JPROUTINE = 30800 )
+C
+C Subroutine arguments
+ CHARACTER*(*) DIRNAME, FILENAME
+ INTEGER KLEN, KUNIT
+C
+C Local variables
+ INTEGER IBLANK, IRET
+ CHARACTER*512 FULLPATH
+ CHARACTER*256 SAVENAME
+C
+
+C _______________________________________________________
+C
+C* Section 1. Try the full path name..
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ JFINDFN = .TRUE.
+ SAVENAME = FILENAME
+C
+ IBLANK = INDEX(DIRNAME, ' ') - 1
+ FULLPATH = DIRNAME(1:IBLANK) // '/' // FILENAME(1:KLEN)
+ IBLANK = INDEX(FULLPATH, ' ') - 1
+ FILENAME(1:IBLANK) = FULLPATH(1:IBLANK)
+C
+Cjdc print*,'***',FILENAME(1:IBLANK),'***'
+ CALL PBOPEN(KUNIT, FILENAME(1:IBLANK), 'r', IRET)
+ IF( IRET.NE.0 ) THEN
+ FILENAME = SAVENAME
+ JFINDFN = .FALSE.
+ ELSE
+ KLEN = INDEX(FULLPATH, ' ') - 1
+ FILENAME(1:KLEN) = FULLPATH(1:KLEN)
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 9. Return.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/jfindfn3.F b/interpolation/jfindfn3.F
new file mode 100755
index 0000000..ece5c80
--- /dev/null
+++ b/interpolation/jfindfn3.F
@@ -0,0 +1,121 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ LOGICAL FUNCTION JFINDFN3( DIRNAME, FILENAME, KLEN, KUNIT)
+C
+C---->
+C**** JFINDFN
+C
+C Purpose
+C _______
+C
+C Completes the pathname given by a directory and filename, and
+C checks if the file exists.
+C
+C Interface
+C _________
+C
+C LFOUND = JFINDFN( DIRNAME, FILENAME, KLEN, KUNIT)
+C
+C Input parameters
+C ________________
+C
+C DIRNAME - the directory name.
+C FILENAME - the file name.
+C KLEN - number of characters in the name
+C
+C Output parameters
+C _________________
+C
+C The function returns .TRUE. if the file is opened; in which case:
+C FILENAME - the full pathname.
+C KLEN - number of characters in the full pathname
+C KUNIT - the opened file descriptor (from PBOPEN).
+C
+C Otherwise it returns .FALSE. and FILENAME and KLEN are unchanged
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Externals
+C _________
+C
+C PBOPEN - opens a file.
+C
+C Reference
+C _________
+C
+C None.
+C
+C Comments
+C ________
+C
+C None.
+C
+C Author
+C ______
+C
+C J.D.Chambers *ECMWF* Mar 1996
+C
+C----<
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+C Parameters
+Cjdc INTEGER JPROUTINE
+Cjdc PARAMETER ( JPROUTINE = 30800 )
+C
+C Subroutine arguments
+ CHARACTER*(*) DIRNAME, FILENAME
+ INTEGER KLEN, KUNIT
+C
+C Local variables
+ INTEGER IBLANK, IRET
+ CHARACTER*512 FULLPATH
+ CHARACTER*256 SAVENAME
+C
+
+C _______________________________________________________
+C
+C* Section 1. Try the full path name..
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ JFINDFN3 = .TRUE.
+ SAVENAME = FILENAME
+C
+ IBLANK = INDEX(DIRNAME, ' ') - 1
+ FULLPATH = DIRNAME(1:IBLANK) // '/' // FILENAME(1:KLEN)
+ IBLANK = INDEX(FULLPATH, ' ') - 1
+ FILENAME(1:IBLANK) = FULLPATH(1:IBLANK)
+C
+Cjdc print*,'***',FILENAME(1:IBLANK),'***'
+ CALL PBOPEN3(KUNIT, FILENAME(1:IBLANK), 'r', IRET)
+ IF( IRET.NE.0 ) THEN
+ FILENAME = SAVENAME
+ JFINDFN3 = .FALSE.
+ ELSE
+ KLEN = INDEX(FULLPATH, ' ') - 1
+ FILENAME(1:KLEN) = FULLPATH(1:KLEN)
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 9. Return.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/jfindir.F b/interpolation/jfindir.F
new file mode 100755
index 0000000..3bd08b9
--- /dev/null
+++ b/interpolation/jfindir.F
@@ -0,0 +1,101 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ LOGICAL FUNCTION JFINDIR( ENVNAME, DIRNAME)
+C
+C---->
+C**** JFINDIR
+C
+C Purpose
+C _______
+C
+C This routine finds the directory specified by an environment
+C variable.
+C
+C Interface
+C _________
+C
+C LFOUND = JFINDIR( ENVNAME, DIRNAME)
+C
+C Input parameters
+C ________________
+C
+C ENVNAME - The environment variable.
+C
+C Output parameters
+C _________________
+C
+C DIRNAME - The directory name (if found).
+C
+C The function returns .TRUE. if the environment variable gives
+C a directory name; otherwise it returns .FALSE.
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Externals
+C _________
+C
+C Reference
+C _________
+C
+C GETENV - to read the envirment variable.
+C
+C Comments
+C ________
+C
+C None.
+C
+C Author
+C ______
+C
+C J.D.Chambers *ECMWF* Mar 1996
+C
+C----<
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+C Parameters
+Cjdc INTEGER JPROUTINE
+Cjdc PARAMETER ( JPROUTINE = 30800 )
+C
+C Subroutine arguments
+ CHARACTER*(*) ENVNAME, DIRNAME
+C
+C Local variables
+ INTEGER IBLANK
+C
+C _______________________________________________________
+C
+C* Section 1. Try the environment variable.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ JFINDIR = .TRUE.
+C
+ CALL GETENV(ENVNAME, DIRNAME)
+C
+C See if a name was returned.
+ IBLANK = INDEX(DIRNAME, ' ')
+ IF ( IBLANK.LE.1 ) JFINDIR = .FALSE.
+C
+C _______________________________________________________
+C
+C* Section 9. Return.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/jgetgg.F b/interpolation/jgetgg.F
new file mode 100755
index 0000000..25298bf
--- /dev/null
+++ b/interpolation/jgetgg.F
@@ -0,0 +1,402 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JGETGG( KNUM, HTYPE, PLAT, KPTS, KRET)
+C
+C---->
+C**** JGETGG
+C
+C PURPOSE
+C _______
+C
+C This routine reads the definition of a gaussian grid.
+C
+C
+C INTERFACE
+C _________
+C
+C CALL JGETGG( KNUM, HTYPE, PLAT, KPTS, KRET)
+C
+C
+C Input parameters
+C ________________
+C
+C KNUM - Gaussian grid number
+C HTYPE - Gaussian grid type
+C = 'R' for reduced,
+C = 'F' for full
+C = 'U' for a user defined gaussian grid
+C KPTS - Array giving users definition of the number of points
+C at each gaussian latitude if HTYPE = 'U'
+C
+C
+C Output parameters
+C ________________
+C
+C PLAT - Array of gaussian latitudes (both hemispheres)
+C KPTS - Array giving number of points at each gaussian
+C latitude, both hemispheres
+C ( unchanged from input if HTYPE = 'U' )
+C KRET - Return status code
+C 0 = OK
+C
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C If HTYPE = 'U', the users definition of the grid is used.
+C Latitudes values are calculated corresponding to KNUM.
+C
+C An array of predefined values is used.
+C
+C
+C Externals
+C _________
+C
+C GETENV - Get value of an environment variable
+C INTLOG - Output log message
+C IGGLAT - Computes Gaussian latitude lines for given truncation.
+C EMOSNUM - Gives current EMOSLIB version number.
+C
+C
+C Reference
+C _________
+C
+C None
+C
+C
+C Comments
+C ________
+C
+C None
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF Jan 1994
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers ECMWF Apr 1995
+C Use predefined definition file for N80 and N160 to cope with
+C changes in the 'standard' definition.
+C
+C J.D.Chambers ECMWF Apr 1996
+C Call JGGLAT if regular grid but not N80 or N160
+C
+C J.D.Chambers ECMWF Apr 1996
+C Fixup standard pathnames for VPPs.
+C Read array of values from file if possible (once only).
+C
+C----<
+C -----------------------------------------------------------------|
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPMAXN
+ PARAMETER ( JPROUTINE = 30100 )
+ PARAMETER ( JPMAXN = 4000 )
+C `---> dimension for internal array for
+C gaussian grid definitions
+C
+C Subroutine arguments
+C
+ INTEGER KNUM, KPTS, KRET
+ CHARACTER*1 HTYPE
+ DIMENSION KPTS(*)
+ REAL PLAT
+ DIMENSION PLAT(*)
+C
+C Local variables
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "intf.h"
+#include "rgauss_032.h"
+#include "rgauss_048.h"
+#include "rgauss_064.h"
+#include "rgauss_080.h"
+#include "rgauss_080_19940113.h"
+#include "rgauss_128.h"
+#include "rgauss_160.h"
+#include "rgauss_160_19931222.h"
+#include "rgauss_200.h"
+#include "rgauss_256.h"
+#include "rgauss_320.h"
+#include "rgauss_400.h"
+#include "rgauss_512.h"
+#include "rgauss_640.h"
+#include "rgauss_1024.h"
+#include "rgauss_2000.h"
+C
+ CHARACTER*6 YEMOSNM
+ INTEGER IEMOSNM
+ INTEGER IERR, JJPR, JJERR
+ INTEGER LOOP, NLAT, IOFFSET
+ INTEGER IMAGE, K1, INUM, NGOT
+C
+C Externals
+C
+ INTEGER EMOSNUM, IGGLAT
+ EXTERNAL EMOSNUM, IGGLAT
+C
+C -----------------------------------------------------------------|
+C* Section 1. Set up standard latitudes
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ IF( KNUM.GT.JPMAXN) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JGETGG: Grid too big for internal array dimension ',JPMAXN)
+ GOTO 910
+ ENDIF
+C
+ INUM = KNUM*2
+C
+ IF( (HTYPE.EQ.'U').OR.(HTYPE.EQ.'u') ) GOTO 500
+ IF( (HTYPE.EQ.'R').OR.(HTYPE.EQ.'r') ) GOTO 200
+C
+C If a regular gaussian grid, calculate the gaussian latitudes
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'JGETGG: Calculate the gaussian latitudes for N = ',KNUM)
+C
+ JJPR = 1
+ JJERR = 1
+ IERR = IGGLAT(INUM, PLAT, JJPR, JJERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR, 'JGETGG: IGGLAT call failed',IERR)
+ KRET = IERR
+ GOTO 990
+ ENDIF
+C
+C Fill in the number of points at each latitude
+C
+ CALL INTLOG(JP_DEBUG,'JGETGG: Regular gaussian grid N ',KNUM)
+C
+ DO LOOP = 1, INUM
+ KPTS(LOOP) = KNUM*4
+ ENDDO
+C
+ GOTO 930
+C
+C -----------------------------------------------------------------|
+C* Section 2. Read REDUCED gaussian definitions from array
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Check that the definition is known
+C
+ IF( (KNUM.NE. 32 ).AND.
+ X (KNUM.NE. 48 ).AND.
+ X (KNUM.NE. 64 ).AND.
+ X (KNUM.NE. 80 ).AND.
+ X (KNUM.NE.128 ).AND.
+ X (KNUM.NE.160 ).AND.
+ X (KNUM.NE.200 ).AND.
+ X (KNUM.NE.256 ).AND.
+ X (KNUM.NE.320 ).AND.
+ X (KNUM.NE.400 ).AND.
+ X (KNUM.NE.512 ).AND.
+ X (KNUM.NE.640 ).AND.
+ X (KNUM.NE.1024 ).AND.
+ X (KNUM.NE.2000 ) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JGETGG: unknown reduced gaussian grid definition: ', KNUM)
+ GOTO 910
+ ENDIF
+C
+C Fill in the gaussian latitudes
+C
+ JJPR = 1
+ JJERR = 1
+ IERR = IGGLAT(INUM, PLAT, JJPR, JJERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR, 'JGETGG: IGGLAT call failed',IERR)
+ KRET = IERR
+ GOTO 990
+ ENDIF
+C
+C Fill the array for each row in both hemispheres.
+C
+ IF( KNUM.EQ. 32 ) THEN
+ DO LOOP = 1, KNUM
+ IMAGE = INUM - LOOP +1
+ KPTS(LOOP) = QG032(LOOP)
+ KPTS(IMAGE) = KPTS(LOOP)
+ ENDDO
+ GOTO 930
+C
+ ELSEIF( KNUM.EQ. 48 ) THEN
+ DO LOOP = 1, KNUM
+ IMAGE = INUM - LOOP +1
+ KPTS(LOOP) = QG048(LOOP)
+ KPTS(IMAGE) = KPTS(LOOP)
+ ENDDO
+ GOTO 930
+
+ ELSEIF( KNUM.EQ. 64 ) THEN
+ DO LOOP = 1, KNUM
+ IMAGE = INUM - LOOP +1
+ KPTS(LOOP) = QG064(LOOP)
+ KPTS(IMAGE) = KPTS(LOOP)
+ ENDDO
+ GOTO 930
+C
+ ELSE IF( KNUM.EQ. 80 ) THEN
+C
+ IF( NGSPEC.EQ.12 ) THEN
+ DO LOOP = 1, KNUM
+ IMAGE = INUM - LOOP +1
+ KPTS(LOOP) = QG08012(LOOP)
+ KPTS(IMAGE) = KPTS(LOOP)
+ ENDDO
+ GOTO 930
+ ELSE
+ DO LOOP = 1, KNUM
+ IMAGE = INUM - LOOP +1
+ KPTS(LOOP) = QG08018(LOOP)
+ KPTS(IMAGE) = KPTS(LOOP)
+ ENDDO
+ GOTO 930
+ ENDIF
+C
+ ELSE IF( KNUM.EQ.128 ) THEN
+ DO LOOP = 1, KNUM
+ IMAGE = INUM - LOOP +1
+ KPTS(LOOP) = QG128(LOOP)
+ KPTS(IMAGE) = KPTS(LOOP)
+ ENDDO
+ GOTO 930
+C
+ ELSE IF( KNUM.EQ.160 ) THEN
+ IF( NGSPEC.EQ.12 ) THEN
+ DO LOOP = 1, KNUM
+ IMAGE = INUM - LOOP +1
+ KPTS(LOOP) = QG16012(LOOP)
+ KPTS(IMAGE) = KPTS(LOOP)
+ ENDDO
+ GOTO 930
+ ELSE
+ DO LOOP = 1, KNUM
+ IMAGE = INUM - LOOP +1
+ KPTS(LOOP) = QG16018(LOOP)
+ KPTS(IMAGE) = KPTS(LOOP)
+ ENDDO
+ GOTO 930
+ ENDIF
+C
+ ELSE IF( KNUM.EQ.200 ) THEN
+ DO LOOP = 1, KNUM
+ IMAGE = INUM - LOOP +1
+ KPTS(LOOP) = QG200(LOOP)
+ KPTS(IMAGE) = KPTS(LOOP)
+ ENDDO
+ GOTO 930
+C
+ ELSE IF( KNUM.EQ.256 ) THEN
+ DO LOOP = 1, KNUM
+ IMAGE = INUM - LOOP +1
+ KPTS(LOOP) = QG256(LOOP)
+ KPTS(IMAGE) = KPTS(LOOP)
+ ENDDO
+ GOTO 930
+C
+ ELSE IF( KNUM.EQ.320 ) THEN
+ DO LOOP = 1, KNUM
+ IMAGE = INUM - LOOP +1
+ KPTS(LOOP) = QG320(LOOP)
+ KPTS(IMAGE) = KPTS(LOOP)
+ ENDDO
+ GOTO 930
+C
+ ELSE IF( KNUM.EQ.400 ) THEN
+ DO LOOP = 1, KNUM
+ IMAGE = INUM - LOOP +1
+ KPTS(LOOP) = QG400(LOOP)
+ KPTS(IMAGE) = KPTS(LOOP)
+ ENDDO
+ GOTO 930
+C
+ ELSE IF( KNUM.EQ.512 ) THEN
+ DO LOOP = 1, KNUM
+ IMAGE = INUM - LOOP +1
+ KPTS(LOOP) = QG512(LOOP)
+ KPTS(IMAGE) = KPTS(LOOP)
+ ENDDO
+ GOTO 930
+C
+ ELSE IF( KNUM.EQ.640 ) THEN
+ DO LOOP = 1, KNUM
+ IMAGE = INUM - LOOP +1
+ KPTS(LOOP) = QG640(LOOP)
+ KPTS(IMAGE) = KPTS(LOOP)
+ ENDDO
+ GOTO 930
+C
+ ELSE
+ DO LOOP = 1, KNUM
+ IMAGE = INUM - LOOP +1
+ KPTS(LOOP) = QG1024(LOOP)
+ KPTS(IMAGE) = KPTS(LOOP)
+ ENDDO
+ GOTO 930
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 5. Use User's gaussian definitions from array
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'JGETGG: Read definitions from User array', JPQUIET)
+C
+C Fill the array for each row in both hemispheres.
+C
+ DO LOOP = 1, INUM
+ PLAT(LOOP) = ROGAUSS(LOOP)
+ KPTS(LOOP) = NOLPTS(LOOP)
+ ENDDO
+C
+ GOTO 930
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return to calling routine. Format statements
+C -----------------------------------------------------------------|
+C
+ 910 CONTINUE
+ KRET = JPROUTINE + 2
+ CALL INTLOG(JP_ERROR,
+ X 'JGETGG: No suitable gaussian grid definition found.',JPQUIET)
+ GOTO 990
+C
+ 930 CONTINUE
+ KRET = 0
+C
+ 990 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/jgglat.F b/interpolation/jgglat.F
new file mode 100755
index 0000000..66b433d
--- /dev/null
+++ b/interpolation/jgglat.F
@@ -0,0 +1,401 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION JGGLAT(KLAT, PGAUSS)
+C
+C---->
+C**** *JGGLAT* - Routine to compute Gaussian abscissae
+C
+C PURPOSE
+C _______
+C
+C This routine computes Gaussian lines of latitude for a given
+C truncation.
+C
+C INTERFACE
+C _________
+C
+C IERR = JGGLAT(KLAT, PGAUSS)
+C
+C Input parameters
+C ________________
+C
+C KLAT - This is the number of lines of latitude from pole to
+C pole.
+C
+C Output parameters
+C ________________
+C
+C PGAUSS - The Gaussian lines of latitude for truncation
+C KLAT / 2.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C 1 The Newton iteration failed to converge when generating
+C Gaussian lines of latitude.
+C
+C MARSINT problem - Please report this to Meteorological
+C Applications.
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C JBESS - This routine is used to generate initial
+C approximations to the Gaussian latitudes.
+C
+C METHOD
+C ______
+C
+C JBESS is used to provide zeros of the Bessel function J0,
+C which are used as starting approximations to the Gaussian
+C latitudes. Newton iteration is used to generate the latitudes
+C from these approximations.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C
+C This routine is adapted from that in the old Marsint library.
+C The interface and the variable names have been modified.
+C
+C Program contains sections 0 to 2 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "jparams.h"
+#include "parim.h"
+C
+C Dummy arguments
+ INTEGER KLAT
+C
+ REAL PGAUSS (*)
+C
+C Local variables
+C
+ INTEGER ITRUNC, IERR
+C
+C Loop control variables
+C
+ INTEGER JLAT, JITER, JLN
+C
+ REAL ZRADDEG, ZCON, ZLAT, ZROOT
+ REAL ZKM1, ZKM2, ZLN, ZFUNC, ZDERIV, ZMOVE
+C
+C Function externals
+C
+ INTEGER JBESS
+C
+C _______________________________________________________
+C
+C* Section 1. Set constants and get initial approximation.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ JGGLAT = 0
+C
+ ZRADDEG = 180.0 / PPI
+C
+ ZCON = (PPONE - (PPTWO / PPI) ** 2) * PPQUART
+C
+ ZLAT = KLAT
+ ITRUNC = KLAT / 2
+C
+ IERR = JBESS (ITRUNC, PGAUSS)
+C
+C _______________________________________________________
+C
+C* Section 2. Compute abscissae
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ DO 240 JLAT = 1, ITRUNC
+C
+C First approximation for ZROOT
+C
+ ZROOT = COS (PGAUSS (JLAT) /
+ 1 SQRT ( (ZLAT + PPHALF) ** 2 + ZCON) )
+C
+C Perfrom loop of Newton iterations
+C
+ DO 220 JITER =1, JPMAXITER
+C
+ ZKM2 = PPONE
+ ZKM1 = ZROOT
+C
+C Compute Legendre polynomial
+C
+ DO 210 JLN = 2, KLAT
+C
+ ZLN = JLN
+C
+ ZFUNC = ( (PPTWO * ZLN - PPONE) * ZROOT * ZKM1 -
+ 1 (ZLN - PPONE) * ZKM2) / ZLN
+C
+ ZKM2 = ZKM1
+ ZKM1 = ZFUNC
+C
+ 210 CONTINUE
+C
+C Perform Newton iteration
+C
+C
+ ZDERIV = (ZLAT * (ZKM2 - ZROOT * ZFUNC) ) /
+ 1 (PPONE - ZROOT ** 2)
+C
+ ZMOVE = ZFUNC / ZDERIV
+C
+ ZROOT = ZROOT - ZMOVE
+C
+C If ABS (ZMOVE) < PPEPSA leave iteration loop because sufficient
+C accuracy has been achieved.
+C
+ IF (ABS (ZMOVE) .LE. PPEPSA) GOTO 230
+C
+ 220 CONTINUE
+C
+C Routine fails if no convergence after JPMAXITER iterations.
+C
+ JGGLAT = 1
+ GO TO 900
+C
+ 230 CONTINUE
+C
+C* Set North and South values using symmetry.
+C
+ PGAUSS (JLAT) = ASIN (ZROOT) * ZRADDEG
+ PGAUSS (KLAT + 1 - JLAT) = - PGAUSS (JLAT)
+C
+ 240 CONTINUE
+C
+C
+ IF (KLAT .NE. ITRUNC * 2) PGAUSS (ITRUNC + 1) = PPZERO
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+C
+ RETURN
+ END
+ INTEGER FUNCTION JBESS (KTRUNC, PBESJ0)
+C
+C**** *JBESS* - Routine to return zeros of the J0 Bessel function.
+C
+C PURPOSE
+C _______
+C
+C This routine returns up to JPLOOK zeros of the J0 Bessel function.
+C If more than JPLOOK zeros are required then approximate zeros are
+C returned after the JPLOOK-th.
+C
+C INTERFACE
+C _________
+C
+C IERR = JBESS (KTRUNC, PBESJ0)
+C
+C Input parameters
+C ________________
+C
+C KTRUNC - This is the number of zeros of the J0 Bessel
+C function required.
+C
+C Output parameters
+C ________________
+C
+C PBESJ0 - The output array of zeros of the J0 Bessel function.
+C
+C Return Value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C None
+C
+C METHOD
+C ______
+C
+C The first JPLOOK values are obtained from a look-up table (ZPBES).
+C Any additional values requested are approximated by adding
+C PI (3.14159...) to the previous value.
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C This routine is adapted from that in the old Marsint library.
+C The interface and the variable names have been modified.
+C
+C Program contains sections 0 to 2 and 9
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "jparams.h"
+C
+C Dummy arguments
+C
+ INTEGER KTRUNC
+C
+ REAL PBESJ0 (*)
+C
+C Local variables
+C
+C
+ INTEGER ILOOK
+ INTEGER JAPPRX, JLOOK
+C
+ REAL ZPBES (JPLOOK)
+C
+ DATA ZPBES / 2.4048255577E0, 5.5200781103E0,
+ 1 8.6537279129E0, 11.7915344391E0, 14.9309177086E0,
+ 2 18.0710639679E0, 21.2116366299E0, 24.3524715308E0,
+ 3 27.4934791320E0, 30.6346064684E0, 33.7758202136E0,
+ 4 36.9170983537E0, 40.0584257646E0, 43.1997917132E0,
+ 5 46.3411883717E0, 49.4826098974E0, 52.6240518411E0,
+ 6 55.7655107550E0, 58.9069839261E0, 62.0484691902E0,
+ 7 65.1899648002E0, 68.3314693299E0, 71.4729816036E0,
+ 8 74.6145006437E0, 77.7560256304E0, 80.8975558711E0,
+ 9 84.0390907769E0, 87.1806298436E0, 90.3221726372E0,
+ A 93.4637187819E0, 96.6052679510E0, 99.7468198587E0,
+ 1 102.8883742542E0, 106.0299309165E0, 109.1714896498E0,
+ 2 112.3130502805E0, 115.4546126537E0, 118.5961766309E0,
+ 3 121.7377420880E0, 124.8793089132E0, 128.0208770059E0,
+ 4 131.1624462752E0, 134.3040166383E0, 137.4455880203E0,
+ 5 140.5871603528E0, 143.7287335737E0, 146.8703076258E0,
+ 6 150.0118824570E0, 153.1534580192E0, 156.2950342685E0 /
+C
+C _______________________________________________________
+C
+C
+C* Section 1. Extract initial values from look up table
+C
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ JBESS = 0
+C
+ ILOOK = MIN(KTRUNC, JPLOOK)
+C
+ DO 110 JLOOK = 1, ILOOK
+ PBESJ0(JLOOK) = ZPBES(JLOOK)
+ 110 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 2. Approximate any extra values required
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ DO 210 JAPPRX = ILOOK + 1, KTRUNC
+ PBESJ0(JAPPRX) = PBESJ0(JPLOOK) + PPI * (JAPPRX - ILOOK)
+ 210 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/jindex.c b/interpolation/jindex.c
new file mode 100755
index 0000000..a9eae2d
--- /dev/null
+++ b/interpolation/jindex.c
@@ -0,0 +1,42 @@
+/**
+* Copyright 1981-2012 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 "fortint.h"
+
+#ifdef FORTRAN_NO_UNDERSCORE
+#define JINDEX jindex
+#else
+#define JINDEX jindex_
+#endif
+
+fortint JINDEX(char * name, long len) {
+/*
+// Called from Fortran:
+//
+// LEN = JINDEX(NAME)
+//
+// Returns the length of the character string (including embedded
+// blanks).
+*/
+fortint offset = len;
+char next;
+
+ do {
+ offset--;
+ next = *(name+offset);
+ if( next != ' ' ) {
+ return (offset+1);
+ }
+ } while( offset >= 0 );
+
+ return len;
+
+}
diff --git a/interpolation/jintend.F b/interpolation/jintend.F
new file mode 100755
index 0000000..9a927a3
--- /dev/null
+++ b/interpolation/jintend.F
@@ -0,0 +1,129 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JINTEND
+C
+C---->
+C**** JINTEND
+C
+C PURPOSE
+C _______
+C
+C This routine deallocates heap memory (if any) allocated
+C by JINTLL, JINTGG and/or INTF.
+C
+C INTERFACE
+C _________
+C
+C CALL JINTEND( )
+C
+C
+C Input parameters
+C ________________
+C
+C None.
+C
+C
+C Output parameters
+C ________________
+C
+C None.
+C
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C
+C Method
+C ______
+C
+C None.
+C
+C
+C Externals
+C _________
+C
+C None.
+C
+C
+C Reference
+C _________
+C
+C None.
+C
+C
+C Comments
+C ________
+C
+C None.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* May 1994
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+C Local variables
+C
+#ifdef POINTER_64
+ INTEGER*8 IZERO
+#else
+ INTEGER IZERO
+#endif
+ INTEGER IRET
+ DATA IZERO/0/
+C
+C _______________________________________________________
+C
+C* Section 1. Deallocate heap memory.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+C Lat/long (JINTLL)
+C
+ CALL JMEMHAN( 1, IZERO, 0, 0, IRET )
+C
+C Gaussian (JINTGG)
+C
+ CALL JMEMHAN( 2, IZERO, 0, 0, IRET )
+C
+C Scratch (INTF)
+C
+ CALL JMEMHAN( 3, IZERO, 0, 0, IRET )
+ CALL JMEMHAN( 4, IZERO, 0, 0, IRET )
+ CALL JMEMHAN( 5, IZERO, 0, 0, IRET )
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/interpolation/jintgg.F b/interpolation/jintgg.F
new file mode 100755
index 0000000..2b3bcac
--- /dev/null
+++ b/interpolation/jintgg.F
@@ -0,0 +1,417 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JINTGG( KIBUFF, KLENI, PWEST, PEAST, PNORTH, PSOUTH,
+ X KNUM, HTYPE, KPTS, LUV, KOBUFF, KLENO, KBITS,
+ X KRET)
+C
+C---->
+C**** JINTGG
+C
+C PURPOSE
+C _______
+C
+C This routine converts spectral input fields to gaussian
+C grid fields.
+C
+C INTERFACE
+C _________
+C
+C CALL JINTGG( KIBUFF, KLENI, PWEST, PEAST, PNORTH, PSOUTH,
+C X KNUM, HTYPE, KPTS, LUV, KOBUFF, KLENO, KBITS, KRET)
+C
+C Input parameters
+C ________________
+C
+C KIBUFF - Array containing input spherical harmonic field
+C in GRIB format.
+C KLENI - Length in words of KIBUFF.
+C PWEST - Required area, west longitude(degrees)
+C PEAST - Required area, east longitude(degrees)
+C PNORTH - Required area, north latitude(degrees)
+C PSOUTH - Required area, south latitude(degrees)
+C KNUM - Gaussian grid number
+C HTYPE - Gaussian grid type
+C = 'R' for reduced,
+C = 'F' for full
+C = 'U' for user-defined reduced gaussian grid
+C KPTS - Array specifying number of points at each line of
+C latitude if HTYPE = 'U'.
+C (Must be big enough for both hemispheres, but only
+C needs to give Northern hemisphere values from pole
+C to latitude nearest the Equator.)
+C LUV - Code indicating whether or not the field is a wind
+C component field;
+C = 1 if U or V field.
+C KLENO - Length in words of KOBUFF.
+C KBITS - Number of bits to be used for packing values in KOBUFF.
+C
+C
+C Output parameters
+C ________________
+C
+C
+C KPTS - Array specifying number of points at each line of
+C latitude; user defined values if HTYPE = 'U'.
+C (Must be big enough for both hemispheres)
+C KOBUFF - Array containing output spherical harmonic field
+C in GRIB format.
+C KLENO - Number of words of KOBUFF occupied by GRIB.
+C KRET - Return status code
+C 0 = OK
+C
+C
+C Common block usage
+C __________________
+C
+C JDCNDGB
+C
+C
+C Method
+C ______
+C
+C None.
+C
+C
+C Externals
+C _________
+C
+C JDEBUG - Checks environment variable to switch on/off debug
+C JGETGG - Get the gaussian grid definition
+C GRIBEX - Decodes/encodes GRIB product
+C JAGGGP - Transform from spherical harmonics to gaussian grid.
+C JMEMHAN - Handles memory allocation
+C INTLOG - Output log message
+C INTLOGR - Output log message (with real value)
+C
+C
+C Reference
+C _________
+C
+C None.
+C
+C
+C Comments
+C ________
+C
+C If PWEST, PEAST, PNORTH, PSOUTH are all 0.0, then the area
+C defaults to global.
+C
+C If KBITS, the number of bits to be used for packing values, is
+C 0, the number of bits used in the input spectral field is used.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* May 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 30200 )
+C Arrays are dimensioned to accommodate spectral T639 data and
+C gaussian resolution of N160
+ INTEGER JPACK, JPMNUM
+ PARAMETER (JPACK=420000)
+ PARAMETER (JPMNUM=160)
+C
+C Subroutine arguments
+ INTEGER KIBUFF, KLENI, KNUM, KPTS, KOBUFF, KLENO, KBITS, KRET
+ CHARACTER*1 HTYPE
+ INTEGER LUV
+ DIMENSION KIBUFF(KLENI)
+ DIMENSION KPTS(*)
+ DIMENSION KOBUFF(*)
+ REAL PWEST, PEAST, PNORTH, PSOUTH
+C
+C Local variables
+ REAL NORTH, SOUTH, EAST, WEST
+ INTEGER IPUNP, ITRUNC, NBITS, JPLOOP
+ INTEGER ISEC0, ISEC1, ISEC2, ISEC3, ISEC4
+ REAL ZSEC2, ZSEC3, ZSEC4
+#ifdef POINTER_64
+ INTEGER*8 IZOUTBF
+#endif
+ REAL ZOUTBF
+ POINTER ( IZOUTBF, ZOUTBF )
+ DIMENSION ZOUTBF( 1 )
+ INTEGER IWORD
+ REAL ZLAT
+ DIMENSION ZLAT(2*JPMNUM)
+C
+C Array for integer parameters from section 0 of GRIB message.
+ DIMENSION ISEC0(JPGRIB_ISEC0)
+C
+C Array for integer parameters from section 1 of GRIB message.
+ DIMENSION ISEC1(JPGRIB_ISEC1)
+C
+C Array for integer parameters from section 2 of GRIB message.
+ DIMENSION ISEC2(JPGRIB_ISEC2)
+C
+C Array for integer parameters from section 3 of GRIB message.
+ DIMENSION ISEC3(JPGRIB_ISEC3)
+C
+C Array for integer parameters from section 4 of GRIB message.
+ DIMENSION ISEC4(JPGRIB_ISEC4)
+C
+C Array for real parameters from section 2 of GRIB message.
+ DIMENSION ZSEC2(JPGRIB_RSEC2)
+C
+C Array for real parameters from section 3 of GRIB message.
+ DIMENSION ZSEC3(JPGRIB_RSEC3)
+C
+C Array for real parameters from section 4 of GRIB message.
+C This is the binary data section and the array to hold
+C the unpacked data may need to be 4 times as long as that
+C for the packed data.
+C
+ DIMENSION ZSEC4(JPACK)
+C
+C _______________________________________________________
+C
+C* Section 1. Unpack the input GRIB product.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ CALL JDEBUG( )
+C
+ IF ( NDBG .GT. 0) THEN
+ CALL INTLOG(JP_DEBUG,'JINTGG - Input parameters:', JPQUIET)
+ DO 101 NDBGLP = 1, 20
+ CALL INTLOGR(JP_DEBUG,' ',KIBUFF( NDBGLP ))
+ 101 CONTINUE
+ CALL INTLOG(JP_DEBUG,
+ X 'JINTGG - Length(words) of input product = ', KLENI)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JINTGG - Required area, west long(deg) = ', PWEST)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JINTGG - Required area, east long(deg) = ', PEAST)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JINTGG - Required area, north lat(deg) = ', PNORTH)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JINTGG - Required area, south lat(deg) = ', PSOUTH)
+ CALL INTLOG(JP_DEBUG,'JINTGG - Gaussian grid number = ', KNUM)
+ CALL INTLOG(JP_DEBUG,'JINTGG - Gaussian grid type = ', HTYPE)
+ CALL INTLOG(JP_DEBUG,'JINTGG - Wind field code = ', LUV)
+ CALL INTLOG(JP_DEBUG,
+ X 'JINTGG - Length in words of KOBUFF = ', KLENO)
+ CALL INTLOG(JP_DEBUG,
+ X 'JINTGG - Number of bits for packing = ', KBITS)
+ ENDIF
+C
+#ifdef CRAY
+ IPUNP = JPACK*8
+#else
+ IPUNP = JPACK*4
+#endif
+ KRET = 1
+ IF ( NDBG .GT. 0) CALL GRSDBG(1)
+C
+ CALL GRIBEX (ISEC0,ISEC1,ISEC2,ZSEC2,ISEC3,ZSEC3,ISEC4,
+ X ZSEC4,IPUNP,KIBUFF,KLENI,IWORD,'D',KRET)
+C
+ IF ( NDBG .GT. 0) CALL INTLOG(JP_DEBUG,
+ X 'JINTGG - Return from GRIBEX decoding = ', KRET)
+C
+C Check return code.
+ IF (KRET.GT.0) GOTO 900
+C
+C Set number of bits to same as input if user did not give a number
+ IF ( KBITS .LE. 0 ) THEN
+ NBITS = ISEC4(2)
+ ELSE
+ NBITS = KBITS
+ ENDIF
+C _______________________________________________________
+C
+C* Section 2. Interpolate to a gaussian grid.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Setup geographical limits
+ IF ( (PWEST.EQ.0.0) .AND. (PEAST.EQ.0.0) .AND.
+ X (PNORTH.EQ.0.0) .AND. (PSOUTH.EQ.0.0) ) THEN
+ NORTH = 90.0
+ SOUTH = -90.0
+ WEST = 0.0
+ EAST = 360.0 - (360.0/FLOAT(4*KNUM))
+ ELSE
+ WEST = PWEST
+ EAST = PEAST
+ NORTH = PNORTH
+ SOUTH = PSOUTH
+ ENDIF
+C
+C Use input truncation
+ ITRUNC = ISEC2(2)
+C
+ IF ( NDBG .GT. 0) THEN
+ CALL INTLOG(JP_DEBUG,'JINTGG - WEST = ', WEST)
+ CALL INTLOG(JP_DEBUG,'JINTGG - EAST = ', EAST)
+ CALL INTLOG(JP_DEBUG,'JINTGG - NORTH = ', NORTH)
+ CALL INTLOG(JP_DEBUG,'JINTGG - SOUTH = ', SOUTH)
+ CALL INTLOG(JP_DEBUG,'JINTGG - ITRUNC = ', ITRUNC)
+ ENDIF
+C
+C Get the gaussian grid definition
+ CALL JGETGG( KNUM, HTYPE, ZLAT, KPTS, KRET)
+C
+C Count the points in the definition to give a memory size
+ IPUNP = 0
+ DO 210 JPLOOP = 1, KNUM*2
+ IPUNP = IPUNP + KPTS(JPLOOP)
+ 210 CONTINUE
+C
+ IF ( NDBG .GT. 0) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JINTGG - Total number of grid points = ', IPUNP)
+ ENDIF
+C
+C Allocate memory for scratch array.
+ CALL JMEMHAN( 2, IZOUTBF, IPUNP, 1, KRET)
+ IF ( KRET .NE. 0 ) THEN
+ KRET = JPROUTINE + 1
+ CALL INTLOG(JP_ERROR,'JINTGG - Memory allocation failed.',KRET)
+ GOTO 900
+ ENDIF
+C
+ CALL JAGGGP( ZSEC4, ITRUNC, NORTH, SOUTH, WEST, EAST,
+ X KNUM, HTYPE, KPTS, ZOUTBF, LUV, KRET)
+C
+ IF ( KRET .NE. 0 ) GOTO 900
+C
+C _______________________________________________________
+C
+C* Section 3. Pack the output GRIB product.
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+C
+ ISEC1(4) = 255
+ ISEC1(5) = 128
+ ISEC1(19) = 0
+ ISEC1(20) = 0
+C
+C Build section 2 for gaussian grid
+ ISEC2(1) = 4
+ IF ( HTYPE .EQ. 'F' ) THEN
+ ISEC2(2) = KPTS(1)
+ ELSE
+ ISEC2(2) = 0
+ ENDIF
+ ISEC2(3) = KNUM*2
+ ISEC2(4) = ( NORTH * 1000.0 )
+ ISEC2(5) = ( WEST * 1000.0 )
+ IF ( ISEC2(5) .LT. 0 ) ISEC2(5) = 360000 + ISEC2(5)
+ IF ( ISEC2(5) .GT. 360000 ) ISEC2(5) = ISEC2(5) - 360000
+ IF ( HTYPE .EQ. 'F' ) THEN
+ ISEC2(6) = 128
+ ELSE
+ ISEC2(6) = 0
+ ENDIF
+ ISEC2(7) = ( SOUTH * 1000.0 )
+ ISEC2(8) = ( EAST * 1000.0 + 0.5 )
+ IF ( ISEC2(8) .LT. 0 ) ISEC2(8) = 360000 + ISEC2(8)
+ IF ( ISEC2(8) .GT. 360000 ) ISEC2(8) = ISEC2(8) - 360000
+ IF ( HTYPE .EQ. 'F' ) THEN
+ ISEC2(9) = NINT( 360.0/FLOAT(KPTS(1)) * 1000.0 )
+ ELSE
+ ISEC2(9) = 0
+ ENDIF
+ ISEC2(10) = KNUM
+ ISEC2(11) = 0
+ IF ( HTYPE .EQ. 'F' ) THEN
+ ISEC2(17) = 0
+ ELSE
+ ISEC2(17) = 1
+ ENDIF
+C
+C For reduced or quasi-regular grids, fill in number of points
+C along each parallel.
+ IF ( HTYPE .NE. 'F' ) THEN
+ DO 220 JPLOOP = 1, KNUM*2
+ ISEC2(22+JPLOOP) = KPTS(JPLOOP)
+ 220 CONTINUE
+ ENDIF
+C
+C Build section 4 for gaussian grid
+ ISEC4(1) = IPUNP
+ ISEC4(2) = NBITS
+ ISEC4(3) = 0
+ ISEC4(4) = 0
+ ISEC4(5) = 0
+ ISEC4(6) = 0
+ ISEC4(8) = 0
+ ISEC4(9) = 0
+ ISEC4(10) = 0
+ ISEC4(11) = 0
+ DO 230 JPLOOP = 12, 33
+ ISEC4(JPLOOP) = 0
+ 230 CONTINUE
+C
+ IF ( NDBG .GT. 0) CALL GRSDBG(1)
+C
+ KRET = 1
+ CALL GRIBEX (ISEC0,ISEC1,ISEC2,ZSEC2,ISEC3,ZSEC3,ISEC4,
+ X ZOUTBF,IPUNP,KOBUFF,KLENO,KLENO,'C',KRET)
+C
+C Check return code.
+ IF ( NDBG .GT. 0) CALL INTLOG(JP_DEBUG,
+ X 'JINTGG - status from GRIBEX encoding = ', KRET)
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/interpolation/jintll.F b/interpolation/jintll.F
new file mode 100755
index 0000000..5318f81
--- /dev/null
+++ b/interpolation/jintll.F
@@ -0,0 +1,366 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JINTLL( KIBUFF, KLENI, PWEST, PEAST, PNORTH, PSOUTH,
+ X PLATINC, PLONINC, KOBUFF, KLENO, KBITS, KRET)
+C
+C---->
+C**** JINTLL
+C
+C PURPOSE
+C _______
+C
+C This routine converts spectral input fields to standard
+C lat/long grid fields.
+C
+C INTERFACE
+C _________
+C
+C CALL JINTLL( KIBUFF, KLENI, PWEST, PEAST, PNORTH, PSOUTH,
+C X PLATINC, PLONINC, KOBUFF, KLENO, KBITS, KRET)
+C
+C Input parameters
+C ________________
+C
+C KIBUFF - Array containing input spherical harmonic field
+C in GRIB format.
+C KLENI - Length in words of KIBUFF.
+C PWEST - Required area, west longitude(degrees)
+C PEAST - Required area, east longitude(degrees)
+C PNORTH - Required area, north latitude(degrees)
+C PSOUTH - Required area, south latitude(degrees)
+C PLATINC - Required latitude interval in degrees.
+C PLONINC - Required longitude interval in degrees.
+C KLENO - Length in words of KOBUFF.
+C KBITS - Number of bits to be used for packing values in KOBUFF.
+C
+C
+C Output parameters
+C ________________
+C
+C KOBUFF - Array containing output spherical harmonic field
+C in GRIB format.
+C KLENO - Number of words of KOBUFF occupied by GRIB.
+C KRET - Return status code
+C 0 = OK
+C
+C
+C Common block usage
+C __________________
+C
+C JDCNDGB
+C
+C
+C Method
+C ______
+C
+C None.
+C
+C
+C Externals
+C _________
+C
+C JDEBUG - Checks environment variable to switch on/off debug
+C GRIBEX - Decodes/encodes GRIB product
+C JALLGP - Transform from spherical harmonics to regular lat/long
+C grid.
+C JMEMHAN - Handles memory allocation.
+C INTLOG - Output log message
+C INTLOGR - Output log message (with real value)
+C
+C
+C Reference
+C _________
+C
+C None.
+C
+C
+C Comments
+C ________
+C
+C If PWEST, PEAST, PNORTH, PSOUTH are all 0.0, then the area
+C defaults to global.
+C
+C If KBITS, the number of bits to be used for packing values, is
+C 0, the number of bits used in the input spectral field is used.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Apr 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 30300 )
+C Arrays are dimensioned to accommodate spectral T639 data and
+C maximum resolution of (0.5 * 0.5) deg.
+ INTEGER JPACK, JPMLAT, JPMLON
+ PARAMETER (JPACK=420000)
+ PARAMETER (JPMLAT=361)
+ PARAMETER (JPMLON=720)
+C
+C Subroutine arguments
+ INTEGER KIBUFF, KLENI, KOBUFF, KLENO, KBITS, KRET
+ DIMENSION KIBUFF(KLENI)
+ DIMENSION KOBUFF(*)
+ REAL PWEST, PEAST, PNORTH, PSOUTH, PLATINC, PLONINC
+C
+C Local variables
+ REAL NORTH, SOUTH, EAST, WEST
+ INTEGER IPUNP, ITRUNC, NBITS
+ INTEGER ISEC0, ISEC1, ISEC2, ISEC3, ISEC4
+ REAL ZSEC2, ZSEC3, ZSEC4
+#ifdef POINTER_64
+ INTEGER*8 IZOUTBF
+#endif
+ REAL ZOUTBF
+ POINTER ( IZOUTBF, ZOUTBF )
+ DIMENSION ZOUTBF( 1 )
+ INTEGER ILAT, ILON, IWORD
+C
+C Array for integer parameters from section 0 of GRIB message.
+ DIMENSION ISEC0(JPGRIB_ISEC0)
+C
+C Array for integer parameters from section 1 of GRIB message.
+ DIMENSION ISEC1(JPGRIB_ISEC1)
+C
+C Array for integer parameters from section 2 of GRIB message.
+ DIMENSION ISEC2(JPGRIB_ISEC2)
+C
+C Array for integer parameters from section 3 of GRIB message.
+ DIMENSION ISEC3(JPGRIB_ISEC3)
+C
+C Array for integer parameters from section 4 of GRIB message.
+ DIMENSION ISEC4(JPGRIB_ISEC4)
+C
+C Array for real parameters from section 2 of GRIB message.
+ DIMENSION ZSEC2(JPGRIB_RSEC2)
+C
+C Array for real parameters from section 3 of GRIB message.
+ DIMENSION ZSEC3(JPGRIB_RSEC3)
+C
+C Array for real parameters from section 4 of GRIB message.
+C This is the binary data section and the array to hold
+C the unpacked data may need to be 4 times as long as that
+C for the packed data.
+C
+ DIMENSION ZSEC4(JPACK)
+C
+C _______________________________________________________
+C
+C* Section 1. Unpack the input GRIB product.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ CALL JDEBUG( )
+C
+ IF ( NDBG .GT. 0) THEN
+ CALL INTLOG(JP_DEBUG,'JINTLL - Input parameters:',JPQUIET)
+ DO 101 NDBGLP = 1, 20
+ CALL INTLOGR(JP_DEBUG,' ',KIBUFF( NDBGLP ))
+ 101 CONTINUE
+ CALL INTLOG(JP_DEBUG,
+ X 'JINTLL - Length(words) of input product = ', KLENI)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JINTLL - Required area, west long(deg) = ', PWEST)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JINTLL - Required area, east long(deg) = ', PEAST)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JINTLL - Required area, north lat(deg) = ', PNORTH)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JINTLL - Required area, south lat(deg) = ', PSOUTH)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JINTLL - Latitude grid interval (deg) = ', PLATINC)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JINTLL - Longitude grid interval (deg) = ', PLONINC)
+ CALL INTLOG(JP_DEBUG,
+ X 'JINTLL - Length in words of KOBUFF = ', KLENO)
+ CALL INTLOG(JP_DEBUG,
+ X 'JINTLL - Number of bits for packing = ', KBITS)
+ ENDIF
+C
+#ifdef CRAY
+ IPUNP = JPACK*8
+#else
+ IPUNP = JPACK*4
+#endif
+C
+ IF ( NDBG .GT. 0) CALL GRSDBG(1)
+C
+ KRET = 1
+ CALL GRIBEX (ISEC0,ISEC1,ISEC2,ZSEC2,ISEC3,ZSEC3,ISEC4,
+ X ZSEC4,IPUNP,KIBUFF,KLENI,IWORD,'D',KRET)
+C
+ IF ( NDBG .GT. 0) CALL INTLOG(JP_DEBUG,
+ X 'JINTLL - Return from GRIBEX decoding = ', KRET)
+C
+C Check return code.
+ IF (KRET.GT.0) GOTO 900
+C
+C Set number of bits to same as input if user did not give a number
+ IF ( KBITS .LE. 0 ) THEN
+ NBITS = ISEC4(2)
+ ELSE
+ NBITS = KBITS
+ ENDIF
+C _______________________________________________________
+C
+C* Section 2. Interpolate to a latitude/longitude grid.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Setup geographical limits
+ IF ( (PWEST.EQ.0.0) .AND. (PEAST.EQ.0.0) .AND.
+ X (PNORTH.EQ.0.0) .AND. (PSOUTH.EQ.0.0) ) THEN
+ NORTH = 90.0
+ SOUTH = -90.0
+ WEST = 0.0
+ EAST = 360.0 - PLONINC
+ ELSE
+ WEST = PWEST
+ EAST = PEAST
+ NORTH = PNORTH
+ SOUTH = PSOUTH
+ ENDIF
+C
+C Use input truncation
+ ITRUNC = ISEC2(2)
+C
+ IF ( NDBG .GT. 0) THEN
+ CALL INTLOG(JP_DEBUG,'JINTLL - WEST = ', WEST)
+ CALL INTLOG(JP_DEBUG,'JINTLL - EAST = ', EAST)
+ CALL INTLOG(JP_DEBUG,'JINTLL - NORTH = ', NORTH)
+ CALL INTLOG(JP_DEBUG,'JINTLL - SOUTH = ', SOUTH)
+ CALL INTLOG(JP_DEBUG,'JINTLL - ITRUNC = ', ITRUNC)
+ ENDIF
+C
+ ILAT = NINT( (EAST - WEST)/PLATINC ) + 1
+ ILON = NINT( (NORTH - SOUTH)/PLONINC ) + 1
+ IPUNP = ILAT * ILON
+C
+ IF ( NDBG .GT. 0) THEN
+ CALL INTLOG(JP_DEBUG,'JINTLL - Number of lat. points = ', ILAT)
+ CALL INTLOG(JP_DEBUG,'JINTLL - Number of long.points = ', ILON)
+ CALL INTLOG(JP_DEBUG,'JINTLL - Total no.of grid pnts = ', IPUNP)
+ ENDIF
+C
+C Allocate memory for scratch array.
+ CALL JMEMHAN( 1, IZOUTBF, IPUNP, 1, KRET)
+ IF ( KRET .NE. 0 ) THEN
+ KRET = JPROUTINE + 1
+ CALL INTLOG(JP_ERROR,'JINTLL - Memory allocation failed',KRET)
+ GOTO 900
+ ENDIF
+C
+ CALL JALLGP( ZSEC4, ITRUNC, NORTH, SOUTH, WEST, EAST,
+ X PLATINC, PLONINC, ZOUTBF, KRET)
+C
+ IF ( KRET .NE. 0 ) GOTO 900
+C
+C _______________________________________________________
+C
+C* Section 3. Pack the output GRIB product.
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+C
+ ISEC1(4) = 255
+ ISEC1(5) = 128
+ ISEC1(19) = 0
+ ISEC1(20) = 0
+C
+ ISEC2(1) = 0
+ ISEC2(2) = ILAT
+ ISEC2(3) = ILON
+ ISEC2(4) = ( NORTH * 1000.0 )
+ ISEC2(5) = ( WEST * 1000.0 )
+ IF ( ISEC2(5) .LT. 0 ) ISEC2(5) = 360000 + ISEC2(5)
+ IF ( ISEC2(5) .GT. 360000 ) ISEC2(5) = ISEC2(5) - 360000
+ ISEC2(6) = 128
+ ISEC2(7) = ( SOUTH * 1000.0 )
+ ISEC2(8) = ( EAST * 1000.0 + 0.5 )
+ IF ( ISEC2(8) .LT. 0 ) ISEC2(8) = 360000 + ISEC2(8)
+ IF ( ISEC2(8) .GT. 360000 ) ISEC2(8) = ISEC2(8) - 360000
+ ISEC2(9) = NINT( PLONINC * 1000.0 )
+ ISEC2(10) = NINT( PLATINC * 1000.0 )
+ ISEC2(11) = 0
+ ISEC2(17) = 0
+C
+ ISEC4(1) = IPUNP
+ ISEC4(2) = NBITS
+ ISEC4(3) = 0
+ ISEC4(4) = 0
+ ISEC4(5) = 0
+ ISEC4(6) = 0
+ ISEC4(8) = 0
+ ISEC4(9) = 0
+ ISEC4(10) = 0
+ ISEC4(11) = 0
+C
+ IF ( NDBG .GT. 0) CALL GRSDBG(1)
+C
+ KRET = 1
+ CALL GRIBEX (ISEC0,ISEC1,ISEC2,ZSEC2,ISEC3,ZSEC3,ISEC4,
+ X ZOUTBF,IPUNP,KOBUFF,KLENO,KLENO,'C',KRET)
+C
+C Check return code.
+ IF ( NDBG .GT. 0)
+ X CALL INTLOG(JP_DEBUG,'JINTLL - status GRIBEX coding = ', KRET)
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+C
+ END
diff --git a/interpolation/jjset99.F b/interpolation/jjset99.F
new file mode 100755
index 0000000..1d5944a
--- /dev/null
+++ b/interpolation/jjset99.F
@@ -0,0 +1,213 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JJSET99(TRIGS, IFAX, N, KRET)
+C
+C---->
+C**** JJSET99
+C
+C PURPOSE
+C _______
+C
+C Computes factors of N & sines and cosines required by FFT99
+C and FFT991.
+C
+C INTERFACE
+C _________
+C
+C CALL JJSET99(TRIGS, IFAX, N, KRET))
+C
+C Input parameters
+C ________________
+C
+C N - Number to factorise.
+C
+C Output parameters
+C ________________
+C
+C TRIGS - Sines and cosines for angles 0 to pi in N steps
+C (sin,cos,sin,cos,...)
+C IFAX - Allowed factors of N from 8,6,5,4,3,2.
+C (Only one 8 allowed).
+C IFAX(1) = count of factors.
+C IFAX(2-9)= factor (or zero).
+C IFAX(10) = N.
+C KRET - 0 if factorised OK.
+C
+C Method
+C ______
+C
+C Look for sixes first, store factors in order: 8,6,5,4,3,2;
+C then reverses the order for output.
+C
+C
+C Externals
+C _________
+C
+C INTLOG - Log error messages.
+C
+C
+C Reference
+C _________
+C
+C None.
+C
+C
+C Comments
+C ________
+C
+C This is a tidy up, based on set99.F
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Nov 1996
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 31500 )
+C
+C Subroutine arguments
+ REAL TRIGS
+ INTEGER IFAX, N, KRET
+ DIMENSION TRIGS(N), IFAX(10)
+C
+C Local variables
+ INTEGER JFAX, LFAX, LOOP, NIL, NHL, NU, I, K, L, IFAC, NFAX
+ DIMENSION LFAX(7), JFAX(10)
+ DATA LFAX/6,8,5,4,3,2,1/
+ REAL DEL, ANGLE
+C
+C _______________________________________________________
+C
+C Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ DO LOOP = 1, 10
+ JFAX(LOOP) = 0
+ ENDDO
+C
+ KRET = 0
+C
+C Generate sines and cosines for angles 0 to pi in N steps
+C
+ DEL = (2.0*PPI) / FLOAT(N)
+ NIL = 0
+ NHL = (N/2)-1
+C
+ DO K = NIL,NHL
+ ANGLE = FLOAT(K)*DEL
+ TRIGS(2*K+1) = COS(ANGLE)
+ TRIGS(2*K+2) = SIN(ANGLE)
+ ENDDO
+C
+C _______________________________________________________
+C
+C Section 2. Find allowed factors of N
+C (8,6,5,4,3,2; only one 8 allowed)
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Look for sixes first, store factors in order: 8,6,5,4,3,2
+C
+ NU = N
+ IFAC = 6
+ K = 0
+ L = 1
+C
+C Loop through potential factors.
+C
+ 220 CONTINUE
+C
+ IF (MOD(NU,IFAC).EQ.0) THEN
+C
+C Allowed factor found
+ K = K+1
+C
+ IF( K.GT.8) THEN
+ CALL INTLOG(JP_ERROR,'Too many factors found factorising ',N)
+ KRET = JPROUTINE + 1
+ GOTO 910
+ ENDIF
+C
+ JFAX(K) = IFAC
+C
+C If factor is 8 ..
+ IF (IFAC.EQ.8) THEN
+C
+C Swap 8 into first array slot instead of 6 if 6 already found
+ IF (K.NE.1) THEN
+ JFAX(1) = 8
+ JFAX(K) = 6
+ ENDIF
+ ENDIF
+C
+C Factor found
+ NU = NU/IFAC
+C
+C Exit if all factors of N have been found
+ IF (NU.EQ.1) GOTO 900
+C
+C Only one 8 allowed as a factor
+ IF (IFAC.NE.8) GOTO 220
+ ENDIF
+C
+C Pick up next allowed factor.
+ L = L+1
+ IFAC = LFAX(L)
+ IF (IFAC.GT.1) GOTO 220
+C
+C Problem! All allowed factors tried but some factors still left.
+C
+ CALL INTLOG(JP_ERROR,'Illegal factors found factorising ',N)
+ KRET = JPROUTINE + 2
+ GOTO 910
+C _______________________________________________________
+C
+C Section 9. All factors found.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+C Store the factors in the reverse order in the output array.
+C
+ NFAX = K
+ IFAX(1) = NFAX
+ DO I = 1,NFAX
+ IFAX(NFAX+2-I) = JFAX(I)
+ ENDDO
+C
+ IFAX(10) = N
+C
+ 910 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/jmakgg.F b/interpolation/jmakgg.F
new file mode 100755
index 0000000..ff05074
--- /dev/null
+++ b/interpolation/jmakgg.F
@@ -0,0 +1,189 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JMAKGG( KUNIT, KTRUNC, KROW, PLAT, PLEG, KRET)
+C
+C---->
+C**** JMAKGG
+C
+C PURPOSE
+C _______
+C
+C This routine creates legendre functions for latitude rows upto
+C the given latitude in a gaussian grid file.
+C
+C INTERFACE
+C _________
+C
+C CALL JMAKGG( KUNIT, KTRUNC, KROW, PLAT, PLEG, KRET)
+C
+C Input parameters
+C ________________
+C
+C KUNIT - Unit number for open file of legendre functions.
+C KTRUNC - Truncation.
+C KROW - Latitude row number in the file
+C PLAT - Array of latitudes for the gaussian grid
+C
+C Output parameters
+C ________________
+C
+C PLEG - Array of legendre functions for the latitude.
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Determine which functions already exist for the latitude rows
+C in the file, skip to the end and create necessary extra functions
+C and add to the file.
+C
+C Externals
+C _________
+C
+C PBSEEK - Position the coefficients file
+C PBWRITE - Write the coefficients file
+C INTLOG - Output log message
+C
+C Reference
+C _________
+C
+C None.
+C
+C Comments
+C ________
+C
+C Only positive row numbers are allowed.
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Jan 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 30400 )
+C
+C Subroutine arguments
+ INTEGER KUNIT, KTRUNC, KROW, KRET
+ REAL PLAT, PLEG
+ DIMENSION PLAT(*)
+ DIMENSION PLEG(*)
+C
+C Local variables
+ INTEGER NEWPOS, NSIZE, NRET, NROWCT, NLATIT
+ REAL ALAT, PIBY2, DEG2RAD
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+100 CONTINUE
+ IF ( KROW .LT. 0.0 ) THEN
+ KRET = JPROUTINE + 1
+ CALL INTLOG(JP_ERROR,'JMAKGG - negative row number given',KROW)
+ GOTO 990
+ ENDIF
+C
+C Calculate the byte offset into the file where the legendre
+C functions for the latitude should be.
+#ifdef REAL_8
+ NSIZE = 8 * (KTRUNC+1)*(KTRUNC+4)/2
+#else
+ NSIZE = 4 * (KTRUNC+1)*(KTRUNC+4)/2
+#endif
+ NEWPOS = (KROW - 1) * NSIZE
+C
+C Find the current file length
+ CALL PBSEEK( KUNIT, 0, 2, NRET)
+ IF ( NRET .LT. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'JMAKGG - PBSEEK error', NRET)
+ KRET = JPROUTINE + 2
+ GOTO 990
+ ENDIF
+C
+C Use the length to determine how many rows have already been
+C put into the file
+ NROWCT = NRET/NSIZE
+C
+C _______________________________________________________
+C
+C* Section 2. Processing.
+C _______________________________________________________
+C
+C Loop through latitudes not in the file yet
+ PIBY2 = PPI / 2.0
+ DEG2RAD = PPI / 180.0
+C
+ DO 210 NLATIT = NROWCT+1, KROW
+ ALAT = PLAT(NLATIT) * DEG2RAD
+ CALL JSPLEG1( PLEG, ALAT, KTRUNC)
+ CALL PBWRITE( KUNIT, PLEG, NSIZE, NRET)
+ IF ( NRET .LT. NSIZE ) THEN
+ CALL INTLOG(JP_ERROR,'JMAKGG - PBWRITE error.', NRET)
+ CALL INTLOG(JP_ERROR,'JMAKGG - bytes required = ', NSIZE)
+ KRET = JPROUTINE + 3
+ GOTO 990
+ ENDIF
+ 210 CONTINUE
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+ KRET = 0
+C
+ 990 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/jmakgg3.F b/interpolation/jmakgg3.F
new file mode 100755
index 0000000..a699e42
--- /dev/null
+++ b/interpolation/jmakgg3.F
@@ -0,0 +1,189 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JMAKGG3( KUNIT, KTRUNC, KROW, PLAT, PLEG, KRET)
+C
+C---->
+C**** JMAKGG
+C
+C PURPOSE
+C _______
+C
+C This routine creates legendre functions for latitude rows upto
+C the given latitude in a gaussian grid file.
+C
+C INTERFACE
+C _________
+C
+C CALL JMAKGG( KUNIT, KTRUNC, KROW, PLAT, PLEG, KRET)
+C
+C Input parameters
+C ________________
+C
+C KUNIT - Unit number for open file of legendre functions.
+C KTRUNC - Truncation.
+C KROW - Latitude row number in the file
+C PLAT - Array of latitudes for the gaussian grid
+C
+C Output parameters
+C ________________
+C
+C PLEG - Array of legendre functions for the latitude.
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Determine which functions already exist for the latitude rows
+C in the file, skip to the end and create necessary extra functions
+C and add to the file.
+C
+C Externals
+C _________
+C
+C PBSEEK - Position the coefficients file
+C PBWRITE - Write the coefficients file
+C INTLOG - Output log message
+C
+C Reference
+C _________
+C
+C None.
+C
+C Comments
+C ________
+C
+C Only positive row numbers are allowed.
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Jan 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 30400 )
+C
+C Subroutine arguments
+ INTEGER KUNIT, KTRUNC, KROW, KRET
+ REAL PLAT, PLEG
+ DIMENSION PLAT(*)
+ DIMENSION PLEG(*)
+C
+C Local variables
+ INTEGER NEWPOS, NSIZE, NRET, NROWCT, NLATIT
+ REAL ALAT, PIBY2, DEG2RAD
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+100 CONTINUE
+ IF ( KROW .LT. 0.0 ) THEN
+ KRET = JPROUTINE + 1
+ CALL INTLOG(JP_ERROR,'JMAKGG3: negative row number given',KROW)
+ GOTO 990
+ ENDIF
+C
+C Calculate the byte offset into the file where the legendre
+C functions for the latitude should be.
+#ifdef REAL_8
+ NSIZE = 8 * (KTRUNC+1)*(KTRUNC+4)/2
+#else
+ NSIZE = 4 * (KTRUNC+1)*(KTRUNC+4)/2
+#endif
+ NEWPOS = (KROW - 1) * NSIZE
+C
+C Find the current file length
+ CALL PBSEEK3( KUNIT, 0, 2, NRET)
+ IF ( NRET .LT. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'JMAKGG3: PBSEEK error', NRET)
+ KRET = JPROUTINE + 2
+ GOTO 990
+ ENDIF
+C
+C Use the length to determine how many rows have already been
+C put into the file
+ NROWCT = NRET/NSIZE
+C
+C _______________________________________________________
+C
+C* Section 2. Processing.
+C _______________________________________________________
+C
+C Loop through latitudes not in the file yet
+ PIBY2 = PPI / 2.0
+ DEG2RAD = PPI / 180.0
+C
+ DO 210 NLATIT = NROWCT+1, KROW
+ ALAT = PLAT(NLATIT) * DEG2RAD
+ CALL JSPLEG1( PLEG, ALAT, KTRUNC)
+ CALL PBWRITE3( KUNIT, PLEG, NSIZE, NRET)
+ IF ( NRET .LT. NSIZE ) THEN
+ CALL INTLOG(JP_ERROR,'JMAKGG3: PBWRITE error.', NRET)
+ CALL INTLOG(JP_ERROR,'JMAKGG3: bytes required = ', NSIZE)
+ KRET = JPROUTINE + 3
+ GOTO 990
+ ENDIF
+ 210 CONTINUE
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+ KRET = 0
+C
+ 990 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/jmakll.F b/interpolation/jmakll.F
new file mode 100755
index 0000000..c1c7f5c
--- /dev/null
+++ b/interpolation/jmakll.F
@@ -0,0 +1,235 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JMAKLL( KUNIT, KTRUNC, PINTVL, PLAT, PLEG, KRET)
+C
+C---->
+C**** JMAKLL
+C
+C PURPOSE
+C _______
+C
+C This routine creates legendre functions for latitude rows upto
+C the given latitude in a 'non-standard truncation/interval' file.
+C
+C INTERFACE
+C _________
+C
+C CALL JMAKLL( KUNIT, KTRUNC, PINTVL, PLAT, PLEG, KRET)
+C
+C Input parameters
+C ________________
+C
+C KUNIT - Unit number for open file of legendre functions.
+C KTRUNC - Truncation.
+C PINTVL - Grid interval (degrees)
+C PLAT - Latitude in degrees.
+C
+C Output parameters
+C ________________
+C
+C PLEG - Array of legendre functions for the latitude.
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG
+C
+C Method
+C ______
+C
+C Determine which functions already exist for the latitude rows
+C in the file, skip to the end and create necessary extra functions
+C and add to the file.
+C
+C Externals
+C _________
+C
+C PBSEEK - Position the coefficients file
+C PBWRITE - Write the coefficients file
+C INTLOG - Output log message
+C INTLOGR - Output log message (with real value)
+C
+C Reference
+C _________
+C
+C None.
+C
+C Comments
+C ________
+C
+C Only positive latitude values are allowed.
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Dec 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+ IMPLICIT NONE
+C
+#include "jparams.h"
+#include "parim.h"
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 30500 )
+C
+C Subroutine arguments
+ INTEGER KUNIT, KTRUNC, KRET
+ REAL PLEG, PINTVL, PLAT
+ DIMENSION PLEG(*)
+C
+C Local variables
+C
+c INTEGER*8 NEWPOS, NSIZE, NRET
+ INTEGER NEWPOS, NSIZE, NRET
+ INTEGER NROWCT, NBYTES
+
+ REAL ZLATEST, ZLATIT, ZLAT, ALAT, PIBY2, DEG2RAD
+ INTEGER NEXT, FIRST, LAST
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF( NDBG.GT.1 ) THEN
+ CALL INTLOG(JP_DEBUG,'JMAKLL: Input parameters:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMAKLL: Unit number for leg.funcs file =', KUNIT)
+ CALL INTLOG(JP_DEBUG,'JMAKLL: Truncation = ', KTRUNC)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMAKLL: Grid interval (degrees) = ', PINTVL)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMAKLL: Latitude in degrees = ', PLAT)
+ ENDIF
+C
+ IF( PLAT.LT.0.0 ) THEN
+ ZLAT = 0.0
+ ELSE
+ ZLAT = PLAT
+ ENDIF
+C
+C Calculate the byte offset into the file where the legendre
+C functions for the latitude should be.
+C
+#ifdef REAL_8
+ NSIZE = 8 * (KTRUNC+1)*(KTRUNC+4)/2
+#else
+ NSIZE = 4 * (KTRUNC+1)*(KTRUNC+4)/2
+#endif
+ NEWPOS = NINT( (90.0 - ZLAT)/PINTVL ) * NSIZE
+C
+C Find the current file length
+C
+ CALL PBSEEK( KUNIT, 0, 2, NRET)
+ IF( NRET.LT.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JMAKLL: PBSEEK error',NRET)
+ KRET = JPROUTINE + 2
+ GOTO 990
+ ENDIF
+C
+C Use the length to determine how many rows have already been
+C put into the file
+C
+ NROWCT = NRET/NSIZE
+ ZLATEST = 90.0 - REAL(NROWCT) * PINTVL
+C
+ IF( NDBG .GT.1 ) THEN
+ CALL INTLOG(JP_DEBUG,'JMAKLL: File length on open = ', NRET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMAKLL: Number of rows already in file = ', NROWCT)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMAKLL: Next latitude to go in file = ', ZLATEST)
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Processing.
+C _______________________________________________________
+C
+C Loop through latitudes not in the file yet
+C
+#ifdef REAL_8
+ NBYTES = (KTRUNC+1)*(KTRUNC+4)/2 * 8
+#else
+ NBYTES = (KTRUNC+1)*(KTRUNC+4)/2 * 4
+#endif
+C
+ IF( NDBG.GT.1 )
+ X CALL INTLOG(JP_DEBUG,'JMAKLL: No. of bytes per row = ', NBYTES)
+C
+ PIBY2 = PPI / 2.0
+ DEG2RAD = PPI / 180.0
+C
+ FIRST = NINT(ZLATEST/PINTVL)
+ LAST = NINT(ZLAT/PINTVL)
+ DO NEXT = FIRST, LAST, -1
+ ALAT = (NEXT*PINTVL) * DEG2RAD
+C
+ IF( NDBG.GT.1 ) CALL INTLOGR(JP_DEBUG,
+ X 'JMAKLL: Next latitude constructed = ', (NEXT*PINTVL))
+C
+ CALL JSPLEG1( PLEG, ALAT, KTRUNC)
+ CALL PBWRITE( KUNIT, PLEG, NBYTES, NRET)
+ IF( NRET.LT.NSIZE ) THEN
+ CALL INTLOG(JP_ERROR,'JMAKLL: PBWRITE error.', NRET)
+ CALL INTLOG(JP_ERROR,'JMAKLL: bytes required = ', NSIZE)
+ KRET = JPROUTINE + 3
+ GOTO 990
+ ENDIF
+ ENDDO
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+ KRET = 0
+C
+ 990 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/jmakll3.F b/interpolation/jmakll3.F
new file mode 100755
index 0000000..5c76cbf
--- /dev/null
+++ b/interpolation/jmakll3.F
@@ -0,0 +1,234 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JMAKLL3( KUNIT, KTRUNC, PINTVL, PLAT, PLEG, KRET)
+C
+C---->
+C**** JMAKLL
+C
+C PURPOSE
+C _______
+C
+C This routine creates legendre functions for latitude rows upto
+C the given latitude in a 'non-standard truncation/interval' file.
+C
+C INTERFACE
+C _________
+C
+C CALL JMAKLL( KUNIT, KTRUNC, PINTVL, PLAT, PLEG, KRET)
+C
+C Input parameters
+C ________________
+C
+C KUNIT - Unit number for open file of legendre functions.
+C KTRUNC - Truncation.
+C PINTVL - Grid interval (degrees)
+C PLAT - Latitude in degrees.
+C
+C Output parameters
+C ________________
+C
+C PLEG - Array of legendre functions for the latitude.
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG
+C
+C Method
+C ______
+C
+C Determine which functions already exist for the latitude rows
+C in the file, skip to the end and create necessary extra functions
+C and add to the file.
+C
+C Externals
+C _________
+C
+C PBSEEK - Position the coefficients file
+C PBWRITE - Write the coefficients file
+C INTLOG - Output log message
+C INTLOGR - Output log message (with real value)
+C
+C Reference
+C _________
+C
+C None.
+C
+C Comments
+C ________
+C
+C Only positive latitude values are allowed.
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Dec 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+ IMPLICIT NONE
+C
+#include "jparams.h"
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 30500 )
+C
+C Subroutine arguments
+C
+ INTEGER KUNIT, KTRUNC, KRET
+ REAL PLEG, PINTVL, PLAT
+ DIMENSION PLEG(*)
+C
+C Local variables
+C
+ INTEGER NEWPOS, NSIZE, NRET, NROWCT, NBYTES
+ REAL ZLATEST, ZLAT, ALAT, PIBY2, DEG2RAD
+ INTEGER NEXT, FIRST, LAST
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF( NDBG.GT.1 ) THEN
+ CALL INTLOG(JP_DEBUG,'JMAKLL3: Input parameters:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMAKLL3: Unit number for leg.funcs file =', KUNIT)
+ CALL INTLOG(JP_DEBUG,'JMAKLL3: Truncation = ', KTRUNC)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMAKLL3: Grid interval (degrees) = ', PINTVL)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMAKLL3: Latitude in degrees = ', PLAT)
+ ENDIF
+C
+ IF( PLAT.LT.0.0 ) THEN
+ ZLAT = 0.0
+ ELSE
+ ZLAT = PLAT
+ ENDIF
+C
+C Calculate the byte offset into the file where the legendre
+C functions for the latitude should be.
+C
+#ifdef REAL_8
+ NSIZE = 8 * (KTRUNC+1)*(KTRUNC+4)/2
+#else
+ NSIZE = 4 * (KTRUNC+1)*(KTRUNC+4)/2
+#endif
+ NEWPOS = NINT( (90.0 - ZLAT)/PINTVL ) * NSIZE
+C
+C Find the current file length
+C
+ CALL PBSEEK3( KUNIT, 0, 2, NRET)
+ IF( NRET.LT.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JMAKLL3: PBSEEK error',NRET)
+ KRET = JPROUTINE + 2
+ GOTO 990
+ ENDIF
+C
+C Use the length to determine how many rows have already been
+C put into the file
+C
+ NROWCT = NRET/NSIZE
+ ZLATEST = 90.0 - REAL(NROWCT) * PINTVL
+C
+ IF( NDBG.GT.1 ) THen
+ CALL INTLOG(JP_DEBUG,'JMAKLL3: File length on open = ', NRET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMAKLL3: Number of rows already in file = ', NROWCT)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMAKLL3: Next latitude to go in file = ', ZLATEST)
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Processing.
+C _______________________________________________________
+C
+C Loop through latitudes not in the file yet
+C
+#ifdef REAL_8
+ NBYTES = (KTRUNC+1)*(KTRUNC+4)/2 * 8
+#else
+ NBYTES = (KTRUNC+1)*(KTRUNC+4)/2 * 4
+#endif
+C
+ IF( NDBG.GT.1 )
+ X CALL INTLOG(JP_DEBUG,'JMAKLL3: No. of bytes per row = ', NBYTES)
+C
+ PIBY2 = PPI / 2.0
+ DEG2RAD = PPI / 180.0
+C
+ FIRST = NINT(ZLATEST/PINTVL)
+ LAST = NINT(ZLAT/PINTVL)
+ DO NEXT = FIRST, LAST, -1
+ ALAT = (NEXT*PINTVL) * DEG2RAD
+C
+ IF( NDBG.GT.1 ) CALL INTLOGR(JP_DEBUG,
+ X 'JMAKLL3: Next latitude constructed = ', (NEXT*PINTVL))
+C
+ CALL JSPLEG1( PLEG, ALAT, KTRUNC)
+ CALL PBWRITE3( KUNIT, PLEG, NBYTES, NRET)
+ IF( NRET.LT.NSIZE ) THEN
+ CALL INTLOG(JP_ERROR,'JMAKLL3: PBWRITE error.', NRET)
+ CALL INTLOG(JP_ERROR,'JMAKLL3: bytes required = ', NSIZE)
+ KRET = JPROUTINE + 3
+ GOTO 990
+ ENDIF
+ ENDDO
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+ KRET = 0
+C
+ 990 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/jmemhan.F b/interpolation/jmemhan.F
new file mode 100755
index 0000000..4fb4915
--- /dev/null
+++ b/interpolation/jmemhan.F
@@ -0,0 +1,482 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JMEMHAN( KFLAG, KZOUTBF, KSIZE, KOPT, KRET)
+C
+C---->
+C**** JMEMHAN
+C
+C PURPOSE
+C _______
+C
+C This routine handles memory allocation for jintll.F and jintgg.F
+C
+C INTERFACE
+C _________
+C
+C CALL JMEMHAN( KFLAG, KZOUTBF, KSIZE, KOPT, KRET)
+C
+C Input parameters
+C ________________
+C
+C KFLAG - Flag to select lat/long or gaussian allocation
+C = 1 for grid to grid interpolation (igalloc)
+C = 2 for grid to grid interpolation (igalloc)
+C = 3 for scratch space
+C = 4 for vorticity and divergence scratch space
+C = 5 for even more scratch space (!?)
+C = 6 for latitude/longitude interpolation coefficients
+C on Fujitsu
+C = 7 for gaussian interpolation coefficients on Fujitsu
+C = 8 unused
+C = 9 for FFT work space
+C = 10 for output (partial) grid point field workspace
+C = 11 for work space for rotating fields (see intfap.F)
+C = 12 for raw land-sea mask (see iglsmst.F)
+C = 13 for 10 minute land-sea mask (see iglsm01.F)
+C = 14 for reading legendre coefficents line by line
+C = 15 more work space for rotating fields (see intfap.F)
+C = 16 more work space intfbu.F
+C = 17 more work space ??
+C = 18 for rotation of gaussian grids (ggrotat and tatorgg)
+C = 19 for dynamic allocation of znfeldi (intf)
+C = 20 to 22, coefficients for rotating spectral fields (jacobif)
+C
+C KSIZE - Size of memory required in words
+C KOPT - Memory option
+C = 0 to deallocate
+C = 1 to allocate
+C
+C
+C Output parameters
+C ________________
+C
+C KZOUTBF - Pointer to memory (if allocating)
+C KRET - Return status code
+C 0 = OK
+C
+C
+C Common block usage
+C __________________
+C
+C JDCNDGB
+C JMEMCOM
+C
+C
+C Method
+C ______
+C
+C None.
+C
+C
+C Externals
+C _________
+C
+C JDEBUG - Checks environment variable to switch on/off debug
+#ifdef CRAY
+C HPALLOC - Allocate heap space
+C HPDEALLC - Deallocate heap space
+#else
+C JMALLOC - Allocate heap space
+C JFREE - Deallocate heap space
+#endif
+C INTLOG - Output log message
+C IAFREE - Deallocate heap space used by grid-pt to grid-pt
+C interpolation
+C
+C
+C Reference
+C _________
+C
+C None.
+C
+C
+C Comments
+C ________
+C
+C None.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* May 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers *ECMWF* Jan 1995
+C Add scratch for vorticity and divergence (flag = 4)
+C
+C J.D.Chambers *ECMWF* Jan 1995
+C Add space for interpolation coefficents (flag = 6)
+C
+C J.D.Chambers *ECMWF* Sep 1996
+C Split space for interpolation coefficents (flag = 6 and 7)
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C J.D.Chambers ECMWF Mar 1998
+C Allow memory flushing
+C
+C----<
+C -------------------------------------------------------
+C* Section 0. Definition of variables.
+C -------------------------------------------------------
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "jparam2.h"
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPOPTMX
+ PARAMETER ( JPROUTINE = 30600 )
+ PARAMETER ( JPOPTMX = 22 )
+C
+C Subroutine arguments
+C
+#ifdef POINTER_64
+ INTEGER*8 KZOUTBF
+#else
+ INTEGER KZOUTBF
+#endif
+ INTEGER KSIZE, KOPT, KRET, KFLAG
+C
+C Local variables
+C
+ LOGICAL LDEBUG, LDEBUG1
+ INTEGER ITOTAL, LOOP
+#ifdef POINTER_64
+ INTEGER*8 IZOUTBF
+#else
+ INTEGER IZOUTBF
+#endif
+ INTEGER IEXIST
+ DIMENSION IEXIST(JPOPTMX)
+ DIMENSION IZOUTBF(JPOPTMX)
+ DATA IEXIST/ JPOPTMX * -1/
+ DATA IZOUTBF/ JPOPTMX * 0/
+C
+ SAVE IEXIST, IZOUTBF
+C
+C Externals
+C
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+ INTEGER IAFREE
+ EXTERNAL JMALLOC, IAFREE
+C
+C -------------------------------------------------------
+C* Section 1. Initialisation.
+C -------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ KRET = 0
+ CALL JDEBUG( )
+ LDEBUG = ( NDBG.GT.0 )
+ LDEBUG1 = ( NDBG.EQ.1 )
+C
+C Check that a valid option has been chosen
+C
+ IF( ( KFLAG.LT.1 ).OR.( KFLAG.GT.JPOPTMX ) ) THEN
+ CALL INTLOG(JP_ERROR,'JMEMHAN: Invalid flag = ', KFLAG)
+ KRET = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C Display diagnostics if required
+C
+ IF( LDEBUG ) THEN
+C
+ CALL INTLOG(JP_DEBUG,'JMEMHAN: Input parameters:',JPQUIET)
+ CALL INTLOG(JP_DEBUG, 'JMEMHAN: Memory type flag = ', KFLAG)
+C
+ IF( ( KFLAG.EQ.1 ).OR.( KFLAG.EQ.2 ) ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 1 = grid to grid interpolation', JPQUIET)
+C
+ IF( ( KFLAG.EQ.3 ).OR.( KFLAG.EQ.4 ).OR.( KFLAG.EQ.5 ) )
+ X CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 3->5 = scratch,',JPQUIET)
+C
+ IF( KFLAG.EQ.6 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 6 = coeffs for spectral to lat/long interp',JPQUIET)
+C
+ IF( KFLAG.EQ.7 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 7 = coefs for spectral to gaussian interp,',JPQUIET)
+C
+ IF( KFLAG.EQ.8 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 8 = coefficients for rotating SH fields',JPQUIET)
+C
+ IF( KFLAG.EQ.9 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 9 = FFT workspace,',JPQUIET)
+C
+ IF( KFLAG.EQ.10 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 10 = output (partial) grid pt field,',JPQUIET)
+C
+ IF( KFLAG.EQ.11 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 11 = work space for rotating fields,',JPQUIET)
+C
+ IF( KFLAG.EQ.12 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 12 = raw land-sea mask,',JPQUIET)
+C
+ IF( KFLAG.EQ.13 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 13 = 10 minute land-sea mask.',JPQUIET)
+C
+ IF( KFLAG.EQ.14 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 14 = legendre coefficents line by line.',JPQUIET)
+C
+ IF( KFLAG.EQ.15 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 15 = more work space for rotating fields.',JPQUIET)
+C
+ IF( KFLAG.EQ.16 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 16 = more work space for intfbu.F.',JPQUIET)
+C
+ IF( KFLAG.EQ.17 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 17 = more work space for ??.',JPQUIET)
+C
+ IF( KFLAG.EQ.18 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 18 = space for rotating gaussian fields.',JPQUIET)
+C
+ IF( KFLAG.EQ.19 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 19 = for dynamic allocation of znfeldi.',JPQUIET)
+C
+ IF( KFLAG.EQ.20 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 20 = coefficients for rotating SH fields',JPQUIET)
+C
+ IF( KFLAG.EQ.21 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 21 = coefficients for rotating SH fields',JPQUIET)
+C
+ IF( KFLAG.EQ.22 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: 22 = coefficients for rotating SH fields',JPQUIET)
+C
+ CALL INTLOG(JP_DEBUG,'JMEMHAN: Memory reqd in words = ', KSIZE)
+ CALL INTLOG(JP_DEBUG,'JMEMHAN: Option (1 = allocate) = ', KOPT)
+ ENDIF
+C
+C -------------------------------------------------------
+C* Section 2. Allocate memory
+C -------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF( KOPT.EQ.1 ) THEN
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: Requested allocation = ', KSIZE)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: Previous allocation = ', IEXIST(KFLAG))
+ ENDIF
+C
+C See if more memory required than already allocated
+C
+ IF( KSIZE.GT.IEXIST(KFLAG) ) THEN
+C
+C Special cases (sigh)
+C
+C If allocating memory for spectral to lat/long or gaussian
+C interpolation, first deallocate heap space used by grid-pt
+C to grid-pt interpolation.
+C
+ IF( ( KFLAG.EQ.1 ).OR.( KFLAG.EQ.2 ) ) THEN
+ IF( LDEBUG ) THEN
+ KRET = IAFREE(1,1)
+ ELSE
+ KRET = IAFREE(0,-1)
+ ENDIF
+ ENDIF
+C
+C If allocating memory on VPP for spectral to grid interpolation
+C coefficients, first deallocate memory used by other type of
+C spectral to gaussian interpolation if this option has been
+C requested.
+C
+ IF( LFREECF ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: Free coefficients option exercised', JPQUIET)
+C
+C Spectral -> lat/long
+C
+ IF( KFLAG.EQ.6 ) THEN
+ IF( IEXIST(7).NE.-1 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: Free spect->gaussn coeff memory',IZOUTBF(7))
+#ifdef CRAY
+ CALL HPDEALLC( IZOUTBF(7), KRET, 0)
+ IF( KRET .LT. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JMEMHAN: Memory de-allocation failed',KRET)
+ KRET = JPROUTINE + 2
+ ENDIF
+#else
+ CALL JFREE( IZOUTBF(7) )
+#endif
+ IZOUTBF(7) = 0
+ IEXIST(7) = -1
+ NISIZE7 = 0
+ YOLDGG = 'xxxxxxxxxxxxxxx'
+ ENDIF
+ ENDIF
+C
+C Spectral -> gaussian
+C
+ IF( KFLAG.EQ.7 ) THEN
+ IF( IEXIST(6).NE.-1 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: Free spec->lat/lon coeff memory',IZOUTBF(6))
+#ifdef CRAY
+ CALL HPDEALLC( IZOUTBF(6), KRET, 0)
+ IF( KRET .LT. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JMEMHAN: Memory de-allocation failed',KRET)
+ KRET = JPROUTINE + 3
+ ENDIF
+#else
+ CALL JFREE( IZOUTBF(6) )
+#endif
+ IZOUTBF(6) = 0
+ IEXIST(6) = -1
+ NISIZE6 = 0
+ YOLDLL = 'xxxxxxxxxxxxxxxxxxx'
+ ENDIF
+ ENDIF
+ ENDIF
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: Request greater than previous allocation', KSIZE)
+C
+C If memory already allocated, deallocate existing memory
+C
+ IF( IEXIST(KFLAG).GE.0 ) THEN
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: Deallocate existing memory',IEXIST(KFLAG))
+#ifdef CRAY
+ CALL HPDEALLC( IZOUTBF(KFLAG), KRET, 0)
+ IF( KRET .LT. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JMEMHAN: Memory de-allocation failed',KRET)
+ KRET = JPROUTINE + 4
+ ENDIF
+#else
+ CALL JFREE( IZOUTBF(KFLAG) )
+#endif
+ ENDIF
+C
+C Allocate heap memory
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: Allocate new memory ',KSIZE)
+C
+ IEXIST(KFLAG) = KSIZE
+#ifdef CRAY
+ CALL HPALLOC( IZOUTBF(KFLAG), IEXIST(KFLAG), KRET, 0 )
+ IF( KRET.LT.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JMEMHAN: Memory allocation failed',KRET)
+#else
+#if (defined REAL_8)
+ IZOUTBF(KFLAG) = JMALLOC( IEXIST(KFLAG) * 8 )
+#else
+ IZOUTBF(KFLAG) = JMALLOC( IEXIST(KFLAG) * 4 )
+#endif
+#ifdef hpR64
+ IZOUTBF(KFLAG) = IZOUTBF(KFLAG)/(1024*1024*1024*4)
+#endif
+ IF( IZOUTBF(KFLAG).EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JMEMHAN: Memory allocation failed',IZOUTBF(KFLAG))
+#endif
+ IEXIST(KFLAG) = -1
+ KRET = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+ IF( LFREECF ) THEN
+C
+C Spectral -> lat/long
+C
+ IF( KFLAG.EQ.6 ) NISIZE6 = IEXIST(6)
+C
+C Spectral -> gaussian
+C
+ IF( KFLAG.EQ.7 ) NISIZE7 = IEXIST(7)
+C
+ ENDIF
+C
+C -------------------------------------------------------
+C* Section 3. Deallocate memory
+C -------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ ELSE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: Deallocate memory address = ',IZOUTBF(KFLAG))
+C
+ IF( IZOUTBF(KFLAG).GT.0 ) THEN
+C
+#ifdef CRAY
+ CALL HPDEALLC( IZOUTBF(KFLAG), KRET, 0)
+ IF( KRET .LT. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JMEMHAN: Memory deallocation failed',KRET)
+ KRET = JPROUTINE + 6
+ ENDIF
+#else
+ CALL JFREE( IZOUTBF(KFLAG) )
+#endif
+ IZOUTBF(KFLAG) = 0
+ IEXIST(KFLAG) = -1
+C
+ ELSE
+ CALL INTLOG(JP_DEBUG,'JMEMHAN: Deallocation ignored',JPQUIET)
+ ENDIF
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ IF( KRET.EQ.0 ) KZOUTBF = IZOUTBF(KFLAG)
+C
+ IF( LDEBUG.AND.(.NOT.LDEBUG1) ) THEN
+ ITOTAL = 0
+ DO LOOP = 1, JPOPTMX
+ IF( IEXIST(LOOP).GT.0 ) THEN
+ CALL INTLOG(JP_DEBUG, 'JMEMHAN: For type ', LOOP)
+#if (defined REAL_8)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: bytes allocated = ', IEXIST(LOOP)*8 )
+ ITOTAL = ITOTAL + (IEXIST(LOOP) * 8)
+#else
+ CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN: bytes allocated = ', IEXIST(LOOP)*4 )
+ ITOTAL = ITOTAL + (IEXIST(LOOP) * 4)
+#endif
+ ENDIF
+ ENDDO
+ CALL INTLOG(JP_DEBUG,'JMEMHAN: Total bytes allocated=', ITOTAL)
+ CALL INTLOG(JP_DEBUG,'JMEMHAN: Return status code = ', KRET)
+ ENDIF
+C
+ RETURN
+ END
diff --git a/interpolation/jmemhan2.F b/interpolation/jmemhan2.F
new file mode 100755
index 0000000..ac694f3
--- /dev/null
+++ b/interpolation/jmemhan2.F
@@ -0,0 +1,491 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JMEMHAN2( KFLAG, KZOUTBF, KSIZE, KOPT, KRET)
+C
+C---->
+C**** JMEMHAN2
+C
+C PURPOSE
+C _______
+C
+C This routine handles memory allocation for jintll.F and jintgg.F
+C
+C INTERFACE
+C _________
+C
+C CALL JMEMHAN2( KFLAG, KZOUTBF, KSIZE, KOPT, KRET)
+C
+C Input parameters
+C ________________
+C
+C KFLAG - Flag to select lat/long or gaussian allocation
+C = 1 for grid to grid interpolation (igalloc)
+C = 2 for grid to grid interpolation (igalloc)
+C = 3 for scratch space
+C = 4 for vorticity and divergence scratch space
+C = 5 for even more scratch space (!?)
+C = 6 for latitude/longitude interpolation coefficients
+C on Fujitsu
+C = 7 for gaussian interpolation coefficients on Fujitsu
+C = 8 unused
+C = 9 for FFT work space
+C = 10 for output (partial) grid point field workspace
+C = 11 for work space for rotating fields (see intfap.F)
+C = 12 for raw land-sea mask (see iglsmst.F)
+C = 13 for 10 minute land-sea mask (see iglsm01.F)
+C = 14 for reading legendre coefficents line by line
+C = 15 more work space for rotating fields (see intfap.F)
+C = 16 more work space intfbu.F
+C = 17 more work space ??
+C = 18 for rotation of gaussian grids (ggrotat and tatorgg)
+C = 19 for dynamic allocation of znfeldi (intf)
+C = 20 to 22, coefficients for rotating spectral fields (jacobif)
+C
+C KSIZE - Size of memory required in words
+C KOPT - Memory option
+C = 0 to deallocate
+C = 1 to allocate
+C
+C
+C Output parameters
+C ________________
+C
+C KZOUTBF - Pointer to memory (if allocating)
+C KRET - Return status code
+C 0 = OK
+C
+C
+C Common block usage
+C __________________
+C
+C JDCNDGB
+C JMEMCOM
+C
+C
+C Method
+C ______
+C
+C None.
+C
+C
+C Externals
+C _________
+C
+C JDEBUG - Checks environment variable to switch on/off debug
+#ifdef CRAY
+C HPALLOC - Allocate heap space
+C HPDEALLC - Deallocate heap space
+#else
+C JMALLOC - Allocate heap space
+C JFREE - Deallocate heap space
+#endif
+C INTLOG - Output log message
+C IAFREE - Deallocate heap space used by grid-pt to grid-pt
+C interpolation
+C
+C
+C Reference
+C _________
+C
+C None.
+C
+C
+C Comments
+C ________
+C
+C None.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* May 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers *ECMWF* Jan 1995
+C Add scratch for vorticity and divergence (flag = 4)
+C
+C J.D.Chambers *ECMWF* Jan 1995
+C Add space for interpolation coefficents (flag = 6)
+C
+C J.D.Chambers *ECMWF* Sep 1996
+C Split space for interpolation coefficents (flag = 6 and 7)
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C J.D.Chambers ECMWF Mar 1998
+C Allow memory flushing
+C
+C----<
+C -------------------------------------------------------
+C* Section 0. Definition of variables.
+C -------------------------------------------------------
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "jparam2.h"
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPOPTMX
+ PARAMETER ( JPROUTINE = 30600 )
+ PARAMETER ( JPOPTMX = 22 )
+C
+C Subroutine arguments
+C
+#ifdef POINTER_64
+ INTEGER*8 KZOUTBF
+#else
+ INTEGER KZOUTBF
+#endif
+ INTEGER KSIZE, KOPT, KRET, KFLAG
+C
+C Local variables
+C
+ LOGICAL LDEBUG, LDEBUG1
+ INTEGER LOOP
+ INTEGER*8 ITOTAL
+ INTEGER*8 ITEMP
+#ifdef POINTER_64
+ INTEGER*8 IZOUTBF
+#else
+ INTEGER IZOUTBF
+#endif
+ INTEGER*8 IEXIST
+ DIMENSION IEXIST(JPOPTMX)
+ DIMENSION IZOUTBF(JPOPTMX)
+ DATA IEXIST/ JPOPTMX * -1/
+ DATA IZOUTBF/ JPOPTMX * 0/
+C
+ SAVE IEXIST, IZOUTBF
+C
+C Externals
+C
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC2
+#else
+ INTEGER JMALLOC2
+#endif
+ INTEGER IAFREE
+ EXTERNAL IAFREE, JMALLOC2
+C
+C -------------------------------------------------------
+C* Section 1. Initialisation.
+C -------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ KRET = 0
+ CALL JDEBUG( )
+ LDEBUG = ( NDBG.GT.0 )
+ LDEBUG1 = ( NDBG.EQ.1 )
+C
+C Check that a valid option has been chosen
+C
+ IF( ( KFLAG.LT.1 ).OR.( KFLAG.GT.JPOPTMX ) ) THEN
+ CALL INTLOG(JP_ERROR,'JMEMHAN2: Invalid flag = ', KFLAG)
+ KRET = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C Display diagnostics if required
+C
+ IF( LDEBUG ) THEN
+C
+ CALL INTLOG(JP_DEBUG,'JMEMHAN2: Input parameters:',JPQUIET)
+ CALL INTLOG(JP_DEBUG, 'JMEMHAN2: Memory type flag = ', KFLAG)
+C
+ IF( ( KFLAG.EQ.1 ).OR.( KFLAG.EQ.2 ) ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 1 = grid to grid interpolation', JPQUIET)
+C
+ IF( ( KFLAG.EQ.3 ).OR.( KFLAG.EQ.4 ).OR.( KFLAG.EQ.5 ) )
+ X CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 3->5 = scratch,',JPQUIET)
+C
+ IF( KFLAG.EQ.6 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 6 = coeffs for spectral to lat/long interp',JPQUIET)
+C
+ IF( KFLAG.EQ.7 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 7 = coefs for spectral to gaussian interp,',JPQUIET)
+C
+ IF( KFLAG.EQ.8 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 8 = coefficients for rotating SH fields',JPQUIET)
+C
+ IF( KFLAG.EQ.9 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 9 = FFT workspace,',JPQUIET)
+C
+ IF( KFLAG.EQ.10 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 10 = output (partial) grid pt field,',JPQUIET)
+C
+ IF( KFLAG.EQ.11 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 11 = work space for rotating fields,',JPQUIET)
+C
+ IF( KFLAG.EQ.12 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 12 = raw land-sea mask,',JPQUIET)
+C
+ IF( KFLAG.EQ.13 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 13 = 10 minute land-sea mask.',JPQUIET)
+C
+ IF( KFLAG.EQ.14 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 14 = legendre coefficents line by line.',JPQUIET)
+C
+ IF( KFLAG.EQ.15 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 15 = more work space for rotating fields.',JPQUIET)
+C
+ IF( KFLAG.EQ.16 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 16 = more work space for intfbu.F.',JPQUIET)
+C
+ IF( KFLAG.EQ.17 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 17 = more work space for ??.',JPQUIET)
+C
+ IF( KFLAG.EQ.18 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 18 = space for rotating gaussian fields.',JPQUIET)
+C
+ IF( KFLAG.EQ.19 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 19 = for dynamic allocation of znfeldi.',JPQUIET)
+C
+ IF( KFLAG.EQ.20 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 20 = coefficients for rotating SH fields',JPQUIET)
+C
+ IF( KFLAG.EQ.21 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 21 = coefficients for rotating SH fields',JPQUIET)
+C
+ IF( KFLAG.EQ.22 ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: 22 = coefficients for rotating SH fields',JPQUIET)
+C
+ CALL INTLOG(JP_DEBUG,'JMEMHAN2: Memory reqd in words = ', KSIZE)
+ CALL INTLOG(JP_DEBUG,'JMEMHAN2: Option (1 = allocate) = ', KOPT)
+ ENDIF
+C
+C -------------------------------------------------------
+C* Section 2. Allocate memory
+C -------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF( KOPT.EQ.1 ) THEN
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: Requested allocation = ', KSIZE)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: Previous allocation = ', IEXIST(KFLAG))
+ ENDIF
+C
+C See if more memory required than already allocated
+C
+ IF( KSIZE.GT.IEXIST(KFLAG) ) THEN
+C
+C Special cases (sigh)
+C
+C If allocating memory for spectral to lat/long or gaussian
+C interpolation, first deallocate heap space used by grid-pt
+C to grid-pt interpolation.
+C
+ IF( ( KFLAG.EQ.1 ).OR.( KFLAG.EQ.2 ) ) THEN
+ IF( LDEBUG ) THEN
+ KRET = IAFREE(1,1)
+ ELSE
+ KRET = IAFREE(0,-1)
+ ENDIF
+ ENDIF
+C
+C If allocating memory on VPP for spectral to grid interpolation
+C coefficients, first deallocate memory used by other type of
+C spectral to gaussian interpolation if this option has been
+C requested.
+C
+ IF( LFREECF ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: Free coefficients option exercised', JPQUIET)
+C
+C Spectral -> lat/long
+C
+ IF( KFLAG.EQ.6 ) THEN
+ IF( IEXIST(7).NE.-1 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: Free spect->gaussn coeff memory',IZOUTBF(7))
+#ifdef CRAY
+ CALL HPDEALLC( IZOUTBF(7), KRET, 0)
+ IF( KRET .LT. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JMEMHAN2: Memory de-allocation failed',KRET)
+ KRET = JPROUTINE + 2
+ ENDIF
+#else
+ CALL JFREE( IZOUTBF(7) )
+#endif
+ IZOUTBF(7) = 0
+ IEXIST(7) = -1
+ NISIZE7 = 0
+ YOLDGG = 'xxxxxxxxxxxxxxx'
+ ENDIF
+ ENDIF
+C
+C Spectral -> gaussian
+C
+ IF( KFLAG.EQ.7 ) THEN
+ IF( IEXIST(6).NE.-1 ) THEN
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: Free spec->lat/lon coeff memory',IZOUTBF(6))
+#ifdef CRAY
+ CALL HPDEALLC( IZOUTBF(6), KRET, 0)
+ IF( KRET .LT. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JMEMHAN2: Memory de-allocation failed',KRET)
+ KRET = JPROUTINE + 3
+ ENDIF
+#else
+ CALL JFREE( IZOUTBF(6) )
+#endif
+ IZOUTBF(6) = 0
+ IEXIST(6) = -1
+ NISIZE6 = 0
+ YOLDLL = 'xxxxxxxxxxxxxxxxxxx'
+ ENDIF
+ ENDIF
+ ENDIF
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: Request greater than previous allocation', KSIZE)
+C
+C If memory already allocated, deallocate existing memory
+C
+ IF( IEXIST(KFLAG).GE.0 ) THEN
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: Deallocate existing memory',IEXIST(KFLAG))
+#ifdef CRAY
+ CALL HPDEALLC( IZOUTBF(KFLAG), KRET, 0)
+ IF( KRET .LT. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JMEMHAN2: Memory de-allocation failed',KRET)
+ KRET = JPROUTINE + 4
+ ENDIF
+#else
+ CALL JFREE( IZOUTBF(KFLAG) )
+#endif
+ ENDIF
+C
+C Allocate heap memory
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: Allocate new memory ',KSIZE)
+C
+ IEXIST(KFLAG) = KSIZE
+cs print*,'IEXIST(KFLAG) ',IEXIST(KFLAG),KFLAG
+#ifdef CRAY
+ CALL HPALLOC( IZOUTBF(KFLAG), IEXIST(KFLAG), KRET, 0 )
+ IF( KRET.LT.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JMEMHAN2: Memory allocation failed',KRET)
+#else
+#if (defined REAL_8)
+ ITEMP = IEXIST(KFLAG) * 8
+cs print*,'JMEMHAN2: KSIZE* 8 ',IEXIST(KFLAG),ITEMP
+ IZOUTBF(KFLAG) = JMALLOC2( ITEMP )
+cs print*,'JMEMHAN2: after JMALLOC2 ',IZOUTBF(KFLAG),KFLAG
+#else
+ IZOUTBF(KFLAG) = JMALLOC2( IEXIST(KFLAG) * 4 )
+#endif
+#ifdef hpR64
+ IZOUTBF(KFLAG) = IZOUTBF(KFLAG)/(1024*1024*1024*4)
+#endif
+ IF( IZOUTBF(KFLAG).EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JMEMHAN2: Memory allocation failed',IZOUTBF(KFLAG))
+#endif
+ IEXIST(KFLAG) = -1
+ KRET = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+ IF( LFREECF ) THEN
+C
+C Spectral -> lat/long
+C
+ IF( KFLAG.EQ.6 ) NISIZE6 = IEXIST(6)
+C
+C Spectral -> gaussian
+C
+ IF( KFLAG.EQ.7 ) NISIZE7 = IEXIST(7)
+C
+ ENDIF
+C
+C -------------------------------------------------------
+C* Section 3. Deallocate memory
+C -------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ ELSE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: Deallocate memory address = ',IZOUTBF(KFLAG))
+C
+ IF( IZOUTBF(KFLAG).GT.0 ) THEN
+C
+#ifdef CRAY
+ CALL HPDEALLC( IZOUTBF(KFLAG), KRET, 0)
+ IF( KRET .LT. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JMEMHAN2: Memory deallocation failed',KRET)
+ KRET = JPROUTINE + 6
+ ENDIF
+#else
+ CALL JFREE( IZOUTBF(KFLAG) )
+#endif
+ IZOUTBF(KFLAG) = 0
+ IEXIST(KFLAG) = -1
+C
+ ELSE
+ CALL INTLOG(JP_DEBUG,'JMEMHAN2: Deallocation ignored',JPQUIET)
+ ENDIF
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ IF( KRET.EQ.0 ) KZOUTBF = IZOUTBF(KFLAG)
+C
+ IF( LDEBUG.AND.(.NOT.LDEBUG1) ) THEN
+ ITOTAL = 0
+ DO LOOP = 1, JPOPTMX
+cs print*,'IEXIST(LOOP) ',IEXIST(LOOP), LOOP
+ IF( IEXIST(LOOP).GT.0 ) THEN
+ CALL INTLOG(JP_DEBUG, 'JMEMHAN2: For type ', LOOP)
+#if (defined REAL_8)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: bytes allocated = ', IEXIST(LOOP)*8 )
+cs print*,'IEXIST(LOOP)*8 ',IEXIST(LOOP)*8
+ ITOTAL = ITOTAL + (IEXIST(LOOP) * 8)
+#else
+ CALL INTLOG(JP_DEBUG,
+ X 'JMEMHAN2: bytes allocated = ', IEXIST(LOOP)*4 )
+ ITOTAL = ITOTAL + (IEXIST(LOOP) * 4)
+#endif
+ ENDIF
+ ENDDO
+ CALL INTLOG(JP_DEBUG,'JMEMHAN2: Total bytes allocated=', ITOTAL)
+cs print*,'Total ',ITOTAL
+ CALL INTLOG(JP_DEBUG,'JMEMHAN2: Return status code = ', KRET)
+ ENDIF
+C
+ RETURN
+ END
diff --git a/interpolation/jmkofgg.F b/interpolation/jmkofgg.F
new file mode 100755
index 0000000..471e80f
--- /dev/null
+++ b/interpolation/jmkofgg.F
@@ -0,0 +1,162 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JMKOFGG( HTYPE,
+ X KNORTH,KSOUTH,PWEST,PEAST,KNUM,KPTS,KOFSET)
+C
+C---->
+C**** JMKOFGG
+C
+C Purpose
+C _______
+C
+C This routine builds up the offsets into the storage array for
+C every row in the gaussian grid.
+C
+C
+C Interface
+C _________
+C
+C CALL JMKOFGG(HTYPE,KNORTH,KSOUTH,PWEST,PEAST,KNUM,KPTS,KOFSET)
+C
+C
+C Input parameters
+C ________________
+C
+C HTYPE - Gaussian grid type
+C = 'R' for reduced,
+C = 'F' for full
+C = 'U' for user-defined reduced gaussian grid
+C KNORTH - Northern latitude row number
+C KSOUTH - Southern latitude row number
+C PWEST - Westernmost longitude for output field (degrees)
+C PEAST - Easternmost longitude for output field (degrees)
+C KNUM - Gaussian grid number
+C KPTS - Array giving the number of points in each row for the
+C gaussian grid
+C
+C
+C Output parameters
+C ________________
+C
+C KOFSET - Array of offsets for storing each row of the grid
+C values in an output buffer
+C
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C
+C Method
+C ______
+C
+C Build up the offsets allowing for latitudes which are not in the
+C requested latitude band. All offsets outside the latitude band
+C are set to zero.
+C
+C
+C Externals
+C _________
+C
+C None
+C
+C
+C Reference
+C _________
+C
+C None
+C
+C
+C Comments
+C ________
+C
+C
+C
+C Author
+C ______
+C
+C J.D.Chambers ECMWF Jan 1994
+C
+C
+C Modifications
+C _____________
+C
+C None
+C
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ CHARACTER*1 HTYPE
+ INTEGER KNORTH, KSOUTH, KNUM, KPTS, KOFSET
+ REAL PWEST, PEAST
+Cjdc DIMENSION KPTS(*), KOFSET(*)
+ DIMENSION KPTS(320), KOFSET(320)
+C
+C Local variables
+C
+ INTEGER LAT, NUMPTS
+ REAL RINTVL
+ LOGICAL LREDUCE
+C
+C _______________________________________________________
+C
+C* Section 1. Dummy
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+C Is it a reduced gaussian or user defined gaussian grid.
+ LREDUCE = ( (HTYPE .EQ. 'U') .OR. (HTYPE .EQ. 'R') )
+C
+C _______________________________________________________
+C
+C* Section 2. Fill in array of offsets
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Loop through all possible latitudes
+ DO LAT = 1, 2*KNUM
+ IF ( (LAT .LT. KNORTH) .OR. (LAT .GT. KSOUTH) ) THEN
+ KOFSET(LAT) = 0
+ ELSE
+ IF ( LAT .EQ. KNORTH ) THEN
+ KOFSET(LAT) = 1
+ ELSE
+ IF( LREDUCE ) THEN
+ NUMPTS = KPTS(LAT -1)
+ ELSE
+ RINTVL = (PEAST - PWEST)*FLOAT( KPTS(LAT -1) ) / 360.0
+ NUMPTS = NINT( RINTVL ) + 1
+ ENDIF
+ KOFSET(LAT) = KOFSET(LAT -1) + NUMPTS
+ ENDIF
+ ENDIF
+ ENDDO
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/jmovgg.F b/interpolation/jmovgg.F
new file mode 100755
index 0000000..0e1d40f
--- /dev/null
+++ b/interpolation/jmovgg.F
@@ -0,0 +1,255 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JMOVGG( PZFA, PWEST, KGNUM, KSTART, KROWS,
+ X KCOLS, KLON, KJPWR, KOFSET, POUTF, KFLAG)
+C---->
+C
+C**** JMOVGG
+C
+C Purpose
+C _______
+C
+C This routine moves gausssian grid point data from array PZFA to
+C array POUTF.
+C
+C
+C Interface
+C _________
+C
+C CALL JMOVGG( PZFA, PWEST, KGNUM, KSTART, KROWS,
+C X KCOLS, KLON, KJPWR, KOFSET, POUTF, KFLAG)
+C
+C
+C Input parameters
+C ________________
+C
+C PZFA - Input array of grid points arranged in pairs of
+C north and south latitude bands
+C PWEST - Westernmost longitude for field in POUTF (degrees)
+C KGNUM - Gaussian number for field in POUTF
+C KSTART - Current first latitude number in PZFA for moving
+C KROWS - Number of latitude rows to store
+C KCOLS - Number of longitude points to store from latitude
+C KLON - Number of longitude points in generated latitude row
+C KJPWR - Multiplication factor applied to ensure that number
+C of longitude points > twice*spherical truncation
+C KOFSET - Array of offsets for start of each latitude row in
+C the output array
+C KFLAG - = 1 if only the North hemisphere lats. to be moved
+C = 2 if only the South hemisphere lats. to be moved
+C = 3 if both North/South hemisphere lats. to be moved
+C
+C
+C Output parameters
+C ________________
+C
+C POUTF - Output array of grid points
+C
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG
+C
+C
+C Method
+C ______
+C
+C Moves latitude rows of points from PZFA into the correct
+C geographical positions in POUTF. POUTF may already be
+C partially full. The distribution is symmetrical north-south.
+C
+C
+C Externals
+C _________
+C
+C INTLOG - Logs messages
+C INTLOGR - Logs messages with real value.
+C
+C
+C Reference
+C _________
+C
+C
+C E.C.M.W.F. Research Department technical memorandum no. 56
+C "The forecast and analysis post-processing package"
+C May 1982. J.Haseler.
+C
+C
+C Comments
+C ________
+C
+C For calculation purposes, the number of longitude points
+C has to be greater than 2*(output truncation) to ensure that the
+C fourier transform is exact (see Reference, page 10).
+C Parameter JPLONO is set to 860 to ensure that PZFA will have
+C enough slots for the KLON points for all values of regular
+C grid intervals from N1 to N720.
+C
+C When filling the output array POUTF, the longitude points have
+C have to be taken selectively to avoid the intermediate generated
+C points, picking up values only at the required longitudes. The
+C magnification factor is KJPWR (a power of 2).
+C
+C PZFA has values stored:
+C North lat1: x, 1, x, 2, x, 3, x, ... , KLON, ...
+C South lat1: x, 1, x, 2, x, 3, x, ... , KLON, ...
+C North lat2: x, 1, x, 2, x, 3, x, ... , KLON, ...
+C South lat2: x, 1, x, 2, x, 3, x, ... , KLON, ...
+C ... for KROWS latitudes.
+C
+C The 'x' represents the extra values generated because of the
+C need for the number of points along a latitude line to be more
+C than twice the truncation of the spherical harmonics.
+C
+C
+C Author
+C ______
+C
+C J.D.Chambers ECMWF Jan 1994
+C
+C
+C Modifications
+C _____________
+C
+C None
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "jparams.h"
+#include "parim.h"
+C
+C Subroutine arguments
+ INTEGER KSTART, KGNUM
+ REAL PZFA, PWEST, POUTF
+ DIMENSION PZFA( JPLONO+2, 64), POUTF(*)
+ INTEGER KROWS, KCOLS, KLON, KJPWR, KOFSET, KFLAG
+ DIMENSION KOFSET(*)
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER( JPROUTINE = 31800 )
+C
+C Local variables
+ INTEGER IOFFN, IOFFS, NXTLAT, NXTLON, NEXTPT
+ INTEGER LONGIT, N360, NSTART
+ REAL PINTVL
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF ( NDBG .GT. 1) THEN
+ CALL INTLOG(JP_DEBUG,'JMOVGG - Input parameters:',JPQUIET)
+ CALL INTLOGR(JP_DEBUG,
+ X 'Western longitude for output = ', PWEST)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVGG - Gaussian number for field = ', KGNUM)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVGG - First latitude for moving = ', KSTART)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVGG - Number of latitudes to store = ', KROWS)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVGG - Number of longitude pts per row = ', KCOLS)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVGG - No. long.pts per generated row = ', KLON)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVGG - Multiplication factor applied = ', KJPWR)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVGG - Move hemisphere(1=N,2=S,3=both) = ', KFLAG)
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVGG - Offsets(20) for each lat. in output array:',JPQUIET)
+C
+ DO 101 NDBGLP = 1, 20
+ CALL INTLOG(JP_DEBUG,' ',KOFSET(NDBGLP))
+ 101 CONTINUE
+ ENDIF
+C
+C Calculate which longitude point to start from in row
+ N360 = 4*KGNUM
+ PINTVL = 360.0/FLOAT(N360)
+ LONGIT = NINT( (360.0 + PWEST)/PINTVL )
+ NSTART = MOD( LONGIT, N360)*KJPWR
+ IF ( NDBG .GT. 1) THEN
+ CALL INTLOGR(JP_DEBUG,
+ X 'Longitude interval along row = ', PINTVL)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVGG - Start longitude = ', LONGIT)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVGG - Modulus for longitude 360deg. = ', N360)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVGG - Start point index = ', NSTART)
+ ENDIF
+C _______________________________________________________
+C
+C
+C* Section 2. Store the points for northern latitudes, southern
+C* latitudes or both.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Store Northern latitudes ..
+C .. skipping intermediate values - see calculation of NEXTPT below
+C
+ IF ( KFLAG .NE. 2 ) THEN
+C
+ IF ( NDBG .GT. 1) CALL INTLOG(JP_DEBUG,
+ X 'JMOVGG - Storing North latitudes',JPQUIET)
+C
+ DO 222 NXTLAT = 1, KROWS*2, 2
+C
+C Find start offset in storage array
+ IOFFN = KOFSET(KSTART + NXTLAT/2) - 1
+ DO 220 NXTLON = 1, KCOLS
+ NEXTPT = 2 + MOD( NSTART + (NXTLON-1)*KJPWR , KLON)
+ POUTF( NXTLON + IOFFN ) = PZFA( NEXTPT, NXTLAT)
+ 220 CONTINUE
+ 222 CONTINUE
+ ENDIF
+C
+C Store Southern latitudes ..
+C .. skipping intermediate values - see calculation of NEXTPT below
+C
+ IF ( KFLAG .NE. 1 ) THEN
+C
+ IF ( NDBG .GT. 1) CALL INTLOG(JP_DEBUG,
+ X 'JMOVGG - Storing South latitudes',JPQUIET)
+C
+ DO 242 NXTLAT = 2, KROWS*2, 2
+C
+C Find start offset in storage array
+ IOFFS = KOFSET(2*KGNUM - KSTART + 1 - NXTLAT/2 + 1) - 1
+ DO 240 NXTLON = 1, KCOLS
+ NEXTPT = 2 + MOD( NSTART + (NXTLON-1)*KJPWR , KLON)
+ POUTF( NXTLON + IOFFS ) = PZFA( NEXTPT, NXTLAT)
+ 240 CONTINUE
+ 242 CONTINUE
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+C
+ RETURN
+ END
diff --git a/interpolation/jmovll.F b/interpolation/jmovll.F
new file mode 100755
index 0000000..221e87e
--- /dev/null
+++ b/interpolation/jmovll.F
@@ -0,0 +1,255 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JMOVLL( PZFA, PNORTH, PWEST, PLATINC, PLONINC, PSTART,
+ X KROWS, KCOLS, KLON, KJPWR, POUTF, KFLAG)
+C
+C---->
+C**** JMOVLL
+C
+C Purpose
+C _______
+C
+C This routine moves grid point data from array PZFA to array POUTF.
+C
+C
+C Interface
+C _________
+C
+C CALL JMOVLL( PZFA, PNORTH, PWEST,PLATINC, PLONINC, PSTART,
+C X KROWS, KCOLS, KLON, KJPWR, POUTF, KFLAG)
+C
+C
+C Input parameters
+C ________________
+C
+C PZFA - Input array of grid points arranged in pairs of
+C north and south latitude bands
+C PNORTH - Northernmost latitude for field in POUTF (degrees)
+C PWEST - Westernmost longitude for field in POUTF (degrees)
+C PLATINC - Grid interval between latitudes in degrees in POUTF
+C PLONINC - Grid interval between longitudes in degrees in POUTF
+C PSTART - Current first latitude in PZFA for moving (degrees)
+C KROWS - Number of latitude rows to store
+C KCOLS - Number of longitude points to store from latitude
+C KLON - Number of longitude points in generated latitude row
+C KJPWR - Multiplication factor applied to ensure that number
+C of longitude points > twice*spherical truncation
+C KFLAG - = 1 if only the North hemisphere lats. to be moved
+C = 2 if only the South hemisphere lats. to be moved
+C = 3 if both North/South hemisphere lats. to be moved
+C
+C
+C Output parameters
+C ________________
+C
+C POUTF - output array of grid points
+C
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG
+C
+C
+C Method
+C ______
+C
+C Moves latitude rows of points from PZFA into the correct
+C geographical positions in POUTF. POUTF may already be
+C partially full. The distribution is symmetrical north-south.
+C
+C
+C Externals
+C _________
+C
+C INTLOG - Logs messages
+C INTLOGR - Logs messages with real value.
+C
+C
+C Reference
+C _________
+C
+C
+C E.C.M.W.F. Research Department technical memorandum no. 56
+C "The forecast and analysis post-processing package"
+C May 1982. J.Haseler.
+C
+C
+C Comments
+C ________
+C
+C POUTF is a 2-dimensional array, with first dimension = KCOLS.
+C
+C For calculation purposes, the number of longitude points
+C has to be greater than 2*(output truncation) to ensure that the
+C fourier transform is exact (see Reference, page 10).
+C Parameter JPLONO is set to 860 to ensure that PZFA will have
+C enough slots for the KLON points for all values of regular
+C grid intervals from N1 to N720.
+C
+C When filling the output array POUTF, the longitude points have
+C have to be taken selectively to avoid the intermediate generated
+C points, picking up values only at the required longitudes. The
+C magnification factor is KJPWR (a power of 2).
+C
+C PZFA has values stored:
+C North lat1: x, 1, x, 2, x, 3, x, ... , KLON, ...
+C South lat1: x, 1, x, 2, x, 3, x, ... , KLON, ...
+C North lat2: x, 1, x, 2, x, 3, x, ... , KLON, ...
+C South lat2: x, 1, x, 2, x, 3, x, ... , KLON, ...
+C ... for KROWS latitudes.
+C
+C The 'x' represents the extra values generated because of the
+C need for the number of points along a latitude line to be more
+C than twice the truncation of the spherical harmonics.
+C
+C
+C Author
+C ______
+C
+C J.D.Chambers ECMWF Nov 1993
+C
+C
+C Modifications
+C _____________
+C
+C None
+C
+C----<
+C
+ IMPLICIT NONE
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+#include "jparams.h"
+#include "parim.h"
+C
+C Subroutine arguments
+C
+ INTEGER KROWS, KCOLS, KLON, KJPWR, KFLAG
+ REAL PZFA, PNORTH, PWEST, PLATINC, PLONINC, PSTART, POUTF
+ DIMENSION PZFA( JPLONO+2, 64), POUTF(KCOLS,*)
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER( JPROUTINE = 31900 )
+C
+C Local variables
+C
+ INTEGER IOFFN, IOFFS, LOOPRW, LOOPCL, NEXT
+ INTEGER LONGIT, N360, NSTART
+C
+C _______________________________________________________
+C
+C
+C* Section 1. Initialization
+C _______________________________________________________
+C
+ 100 CONTINUE
+
+ IF ( NDBG .GT. 1) THEN
+ CALL INTLOG(JP_DEBUG,'JMOVLL - Input parameters:',JPQUIET)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMOVLL - Northern latitude for output = ', PNORTH)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMOVLL - Western longitude for output = ', PWEST)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMOVLL - Latitude grid interval (deg) = ', PLATINC)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMOVLL - Longitude grid interval (deg) = ', PLONINC)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMOVLL - First latitude for moving = ', PSTART)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVLL - Number of latitudes to store = ', KROWS)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVLL - Number of longitude pts per row = ', KCOLS)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVLL - No. long.pts per generated row = ', KLON)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVLL - Multiplication factor applied = ', KJPWR)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVLL - Move hemisphere(1=N,2=S,3=both) = ', KFLAG)
+C
+ ENDIF
+C
+C Find start offset in storage array
+ IOFFN = NINT( (PNORTH - PSTART)/PLATINC ) + 1
+ IOFFS = NINT( (PNORTH + PSTART)/PLATINC ) + 2
+ LONGIT = NINT( (360.0 + PWEST)/PLONINC )
+ N360 = NINT( 360.0/PLONINC )
+ NSTART = MOD( LONGIT, N360)*KJPWR
+ IF ( NDBG .GT. 1) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVLL - Offset in storage array(north) = ', IOFFN)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVLL - Offset in storage array(south) = ', IOFFS)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVLL - Start longitude = ', LONGIT)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVLL - Modulus for longitude 360deg. = ', N360)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMOVLL - Start point index = ', NSTART)
+ ENDIF
+C _______________________________________________________
+C
+C
+C* Section 2. Store the points for northern latitudes, southern
+C* latitudes or both.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Store Northern latitudes ..
+C .. skipping intermediate values - see calculation of NEXT below
+C
+ IF ( KFLAG .NE. 2 ) THEN
+C
+ IF ( NDBG .GT. 1) CALL INTLOG(JP_DEBUG,
+ X 'JMOVLL - Storing North latitudes',JPQUIET)
+C
+ DO 222 LOOPRW = 1, KROWS*2, 2
+ DO 220 LOOPCL = 1, KCOLS
+ NEXT = 2 + MOD( NSTART + (LOOPCL-1)*KJPWR , KLON)
+ POUTF( LOOPCL, IOFFN + LOOPRW/2 ) = PZFA( NEXT, LOOPRW)
+ 220 CONTINUE
+ 222 CONTINUE
+ ENDIF
+C
+C Store Southern latitudes ..
+C .. skipping intermediate values - see calculation of NEXT below
+C
+ IF ( KFLAG .NE. 1 ) THEN
+C
+ IF ( NDBG .GT. 1) CALL INTLOG(JP_DEBUG,
+ X 'JMOVLL - Storing South latitudes',JPQUIET)
+C
+ DO 242 LOOPRW = 2, KROWS*2, 2
+ DO 240 LOOPCL = 1, KCOLS
+ NEXT = 2 + MOD( NSTART + (LOOPCL-1)*KJPWR , KLON)
+ POUTF( LOOPCL, IOFFS - LOOPRW/2 ) = PZFA( NEXT, LOOPRW)
+ 240 CONTINUE
+ 242 CONTINUE
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+C
+ RETURN
+ END
diff --git a/interpolation/jmvugg.F b/interpolation/jmvugg.F
new file mode 100755
index 0000000..efdc48a
--- /dev/null
+++ b/interpolation/jmvugg.F
@@ -0,0 +1,317 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JMVUGG(PZFA, KNORTH, KSOUTH, PWEST, KGNUM, KSTART,
+ X KDIFF, KROWS, KCOLS, KLON, KJPWR, KOFSET, POUTF)
+C
+C---->
+C**** JMVUGG
+C
+C Purpose
+C _______
+C
+C This routine moves gaussian grid point data from array PZFA to
+C array POUTF. It handles the case when the number of latitudes
+C is different in the two hemispheres.
+C
+C
+C Interface
+C _________
+C
+C CALL JMVUGG(PZFA, KNORTH, KSOUTH, PWEST, KGNUM, KSTART,
+C X KDIFF, KROWS, KCOLS, KLON, KJPWR, KOFSET, POUTF)
+C
+C
+C Input parameters
+C ________________
+C
+C PZFA - Input array of grid points arranged in pairs of
+C north and south latitude bands
+C KNORTH - Northernmost latitude row number for field in POUTF
+C KSOUTH - Southernmost latitude row number for field in POUTF
+C PWEST - Westernmost longitude for field in POUTF (degrees)
+C KGNUM - Gaussian number for field in POUTF
+C KSTART - Current first latitude number in PZFA
+C KDIFF - Offset to first latitude row in PZFA for moving
+C KROWS - Number of latitude rows to store
+C KCOLS - Number of longitude points to store from latitude
+C KLON - Number of longitude points in generated latitude row
+C KJPWR - Multiplication factor applied to ensure that number
+C of longitude points > twice*spherical truncation
+C KOFSET - Array of offsets for start of each latitude row in
+C the output array
+C
+C
+C Output parameters
+C ________________
+C
+C POUTF - Output array of grid points
+C
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG
+C
+C
+C Method
+C ______
+C
+C Moves latitude rows of points from PZFA into the correct
+C geographical positions in POUTF. POUTF may already be
+C partially full. The distribution is not symmetrical north-south.
+C
+C
+C Externals
+C _________
+C
+C JMOVGG - Move points of symmetric grid to array
+C INTLOG - Logs messages
+C INTLOGR - Logs messages with real value.
+C
+C
+C Reference
+C _________
+C
+C E.C.M.W.F. Research Department technical memorandum no. 56
+C "The forecast and analysis post-processing package"
+C May 1982. J.Haseler.
+C
+C
+C Comments
+C ________
+C
+C For calculation purposes, the number of longitude points
+C has to be greater than 2*(output truncation) to ensure that the
+C fourier transform is exact (see Reference, page 10).
+C Parameter JPLONO is set to 860 to ensure that PZFA will have
+C enough slots for the KLON points for all values of regular
+C grid intervals from N1 to N720.
+C
+C When filling the output array POUTF, the longitude points have
+C have to be taken selectively to avoid the intermediate generated
+C points, picking up values only at the required longitudes. The
+C magnification factor is KJPWR (a power of 2).
+C
+C PZFA has values stored:
+C North lat1: x, 1, x, 2, x, 3, x, ... , KLON, ...
+C South lat1: x, 1, x, 2, x, 3, x, ... , KLON, ...
+C North lat2: x, 1, x, 2, x, 3, x, ... , KLON, ...
+C South lat2: x, 1, x, 2, x, 3, x, ... , KLON, ...
+C ... for KROWS latitudes.
+C
+C The 'x' represents the extra values generated because of the
+C need for the number of points along a latitude line to be more
+C than twice the truncation of the spherical harmonics.
+C
+C
+C Author
+C ______
+C
+C J.D.Chambers ECMWF Jan 1994
+C
+C
+C Modifications
+C _____________
+C
+C None
+C
+C----<
+C
+ IMPLICIT NONE
+C _______________________________________________________
+C
+C
+#include "jparams.h"
+#include "parim.h"
+C
+C Subroutine arguments
+ INTEGER KNORTH, KSOUTH, KGNUM, KSTART, KDIFF, POUTF
+ INTEGER KROWS, KCOLS, KLON, KJPWR, KOFSET
+ DIMENSION KOFSET(*)
+ REAL PZFA, PWEST
+ DIMENSION PZFA( JPLONO+2, 64), POUTF(*)
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER( JPROUTINE = 32000 )
+C
+C Local variables
+ INTEGER INROWS, NROWS, NFLAG
+ INTEGER LATEST
+ INTEGER NTOP, NBASE
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF ( NDBG .GT. 1) THEN
+ CALL INTLOG(JP_DEBUG,'JMVUGG - Input parameters:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - Northern latitude for output = ', KNORTH)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - Southern latitude for output = ', KSOUTH)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMVUGG - Western longitude for output = ', PWEST)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - Gaussian number for field = ', KGNUM)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - First latitude for moving = ', KSTART)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - Offset to first lat. for moving = ', KDIFF)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - Number of latitudes to store = ', KROWS)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - Number of longitude pts per row = ', KCOLS)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - No. long.pts per generated row = ', KLON)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - Multiplication factor applied = ', KJPWR)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - Offsets(20) of each lat. in output array:',JPQUIET)
+C
+ DO 101 NDBGLP = 1, 20
+ CALL INTLOG(JP_DEBUG,' ',KOFSET(NDBGLP))
+ 101 CONTINUE
+ ENDIF
+C
+ LATEST = 1
+ NTOP = KSTART + KDIFF
+ NBASE = KSTART + (KROWS - 1)
+ INROWS = KROWS
+ NROWS = INROWS
+C
+ IF ( NDBG .GT. 1) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - Current northernmost lat = ', NTOP)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - Current southernmost lat = ', NBASE)
+ ENDIF
+C _______________________________________________________
+C
+C* Section 2. Processing more North than South, or more South
+C than North.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C See if overall there are more rows in Northern Hemisphere than
+C Southern
+ IF ( KNORTH .LE. (2*KGNUM - KSOUTH) ) THEN
+C
+ IF ( NDBG .GT. 1) CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - More rows in North Hemis. than South',JPQUIET)
+C
+C Yes, so see if there are any rows in the current batch for the
+C south as well as the north
+ IF ( NBASE .LT. (2*KGNUM - KSOUTH) ) THEN
+C
+C None for south in current batch, move all rows to north.
+ NFLAG = 1
+C
+ IF ( NDBG .GT. 1) CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - No rows for S, move rows to N = ', NROWS)
+C
+ CALL JMOVGG( PZFA, PWEST, KGNUM, KSTART, NROWS, KCOLS,
+ X KLON, KJPWR, KOFSET, POUTF, NFLAG)
+ ELSE
+C
+C Some for south.
+C
+C Move rows for north only first.
+ IF ( (2*KGNUM-KSOUTH) .GT. (NTOP-1) ) THEN
+ NROWS = (2*KGNUM-KSOUTH) - NTOP + 1
+ NFLAG = 1
+C
+ IF ( NDBG .GT. 1) CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - Move North rows only first = ', NROWS)
+C
+ CALL JMOVGG( PZFA, PWEST, KGNUM, KSTART, NROWS, KCOLS,
+ X KLON, KJPWR, KOFSET, POUTF, NFLAG)
+ NTOP = KSTART + NROWS
+ LATEST = LATEST + (2 * NROWS)
+ NROWS = INROWS - NROWS
+ ENDIF
+C
+C Then move rows for both.
+ IF ( NROWS .GT. 0 ) THEN
+ NFLAG = 3
+C
+ IF ( NDBG .GT. 1) CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - Move common lat.(N & S) = ', NROWS)
+C
+ CALL JMOVGG( PZFA( 1, LATEST), PWEST, KGNUM, NTOP,
+ X NROWS, KCOLS, KLON, KJPWR, KOFSET, POUTF,NFLAG)
+ ENDIF
+ ENDIF
+C
+C Overall there are more rows in Southern Hemisphere than Northern
+ ELSE
+C
+ IF ( NDBG .GT. 1) CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - More rows in South Hemis. than North',JPQUIET)
+C
+C
+C So see if there are any rows in the current batch for the
+C north as well as the south
+ IF ( NBASE .LT. KNORTH ) THEN
+C
+C None for north in current batch, move all rows to south.
+ NFLAG = 2
+C
+ IF ( NDBG .GT. 1) CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - No rows for N, move rows to S = ', NROWS)
+C
+ CALL JMOVGG( PZFA, PWEST, KGNUM, KSTART, NROWS, KCOLS,
+ X KLON, KJPWR, KOFSET, POUTF, NFLAG)
+ ELSE
+C
+C Some for north. Move rows for south only first.
+ NROWS = KNORTH - NTOP + KDIFF
+ IF ( NROWS .GT. 0 ) THEN
+C
+ IF ( NDBG .GT. 1) CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - Move South rows only first = ', NROWS)
+C
+ NFLAG = 2
+ CALL JMOVGG( PZFA, PWEST, KGNUM, KSTART, NROWS, KCOLS,
+ X KLON, KJPWR, KOFSET, POUTF, NFLAG)
+ LATEST = LATEST + (2 * NROWS)
+ NROWS = INROWS - NROWS
+ ELSE
+ NROWS = INROWS
+ ENDIF
+C
+C Then move rows for both.
+ NFLAG = 3
+ IF ( NROWS .GT. 0 ) THEN
+C
+ IF ( NDBG .GT. 1) CALL INTLOG(JP_DEBUG,
+ X 'JMVUGG - Move common lats(N & S) = ', NROWS)
+C
+ CALL JMOVGG( PZFA( 1, LATEST), PWEST, KGNUM, NTOP,
+ X NROWS, KCOLS, KLON, KJPWR, KOFSET, POUTF,NFLAG)
+ ENDIF
+ ENDIF
+ ENDIF
+C _______________________________________________________
+C
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+C
+ RETURN
+ END
diff --git a/interpolation/jmvull.F b/interpolation/jmvull.F
new file mode 100755
index 0000000..fc31ed7
--- /dev/null
+++ b/interpolation/jmvull.F
@@ -0,0 +1,261 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JMVULL( PZFA, PNORTH, PSOUTH, PWEST, PLATINC, PLONINC,
+ X PSTART,PDIFF, KROWS, KCOLS, KLON, KJPWR, POUTF)
+C
+C---->
+C**** JMVULL
+C
+C Purpose
+C _______
+C
+C This routine moves grid point data from array PZFA to array POUTF.
+C It handles the case when the number of latitudes is different in
+C the two hemispheres.
+C
+C
+C Interface
+C _________
+C
+C CALL JMVULL( PZFA, PNORTH, PSOUTH, PWEST, PLATINC, PLONINC,
+C X PSTART,PDIFF, KROWS, KCOLS, KLON, KJPWR, POUTF)
+C
+C
+C Input parameters
+C ________________
+C
+C PZFA - Input array of grid points arranged in pairs of
+C north and south latitude bands
+C PNORTH - Northernmost latitude for field in POUTF (degrees)
+C PSOUTH - Southernmost latitude for field in POUTF (degrees)
+C PWEST - Westernmost longitude for field in POUTF (degrees)
+C PLATINC - Grid interval between latitudes in degrees in POUTF
+C PLONINC - Grid interval between longitudes in degrees in POUTF
+C PSTART - Current first latitude in PZFA (degrees)
+C PDIFF - Offset to first latitude in PZFA for moving (degrees)
+C KROWS - Number of latitude rows to store
+C KCOLS - Number of longitude points to store from latitude
+C KLON - Number of longitude points in generated latitude row
+C KJPWR - Multiplication factor applied to ensure that number
+C of longitude points > twice*spherical truncation
+C
+C
+C Output parameters
+C ________________
+C
+C POUTF - output array of grid points
+C
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG
+C
+C
+C Method
+C ______
+C
+C Moves latitude rows of points from PZFA into the correct
+C geographical positions in POUTF. POUTF may already be
+C partially full. The distribution is not symmetrical north-south.
+C
+C
+C Externals
+C _________
+C
+C JMOVLL - Move points of symmetric grid to array
+C INTLOG - Logs messages
+C INTLOGR - Logs messages with real value.
+C
+C
+C Reference
+C _________
+C
+C E.C.M.W.F. Research Department technical memorandum no. 56
+C "The forecast and analysis post-processing package"
+C May 1982. J.Haseler.
+C
+C
+C Comments
+C ________
+C
+C POUTF is a 2-dimensional array, with first dimension = KCOLS.
+C
+C For calculation purposes, the number of longitude points
+C has to be greater than 2*(output truncation) to ensure that the
+C fourier transform is exact (see Reference, page 10).
+C Parameter JPLONO is set to 860 to ensure that PZFA will have
+C enough slots for the KLON points for all values of regular
+C grid intervals from N1 to N720.
+C
+C When filling the output array POUTF, the longitude points have
+C have to be taken selectively to avoid the intermediate generated
+C points, picking up values only at the required longitudes. The
+C magnification factor is KJPWR (a power of 2).
+C
+C PZFA has values stored:
+C North lat1: x, 1, x, 2, x, 3, x, ... , KLON, ...
+C South lat1: x, 1, x, 2, x, 3, x, ... , KLON, ...
+C North lat2: x, 1, x, 2, x, 3, x, ... , KLON, ...
+C South lat2: x, 1, x, 2, x, 3, x, ... , KLON, ...
+C ... for KROWS latitudes.
+C
+C The 'x' represents the extra values generated because of the
+C need for the number of points along a latitude line to be more
+C than twice the truncation of the spherical harmonics.
+C
+C
+C Author
+C ______
+C
+C J.D.Chambers ECMWF Nov 1993
+C
+C
+C Modifications
+C _____________
+C
+C None
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C _______________________________________________________
+C
+#include "jparams.h"
+#include "parim.h"
+C
+C Subroutine arguments
+ INTEGER KROWS, KCOLS, KLON, KJPWR
+ REAL PZFA, PNORTH, PWEST, PSOUTH, PLATINC, PLONINC, PSTART
+ REAL PDIFF, POUTF
+ DIMENSION PZFA( JPLONO+2, 64), POUTF( KCOLS, *)
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER( JPROUTINE = 32100 )
+C
+C Local variables
+ INTEGER INROWS, NROWS, NFLAG
+ INTEGER LATEST
+ REAL ZTOP, ZBASE
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF ( NDBG .GT. 1) THEN
+ CALL INTLOG(JP_DEBUG,'JMVULL - Input parameters:',JPQUIET)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMVULL - Northern latitude for output = ', PNORTH)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMVULL - Southern latitude for output = ', PSOUTH)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMVULL - Western longitude for output = ', PWEST)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMVULL - Latitude grid interval (deg) = ', PLATINC)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMVULL - Longitude grid interval (deg) = ', PLONINC)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMVULL - First latitude for moving = ', PSTART)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMVULL - Offset to first lat. for moving = ', PDIFF)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMVULL - Number of latitudes to store = ', KROWS)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMVULL - Number of longitude pts per row = ', KCOLS)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMVULL - No. long.pts per generated row = ', KLON)
+ CALL INTLOG(JP_DEBUG,
+ X 'JMVULL - Multiplication factor applied = ', KJPWR)
+ ENDIF
+C
+ LATEST = 1
+ ZTOP = PSTART
+ ZBASE = PSTART - (KROWS - 1)*PLATINC
+ INROWS = KROWS
+ NROWS = INROWS
+C
+ IF ( NDBG .GT. 1) THEN
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMVULL - Current northernmost lat = ', ZTOP)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JMVULL - Current southernmost lat = ', ZBASE)
+ ENDIF
+C _______________________________________________________
+C
+C* Section 2. Processing more North than South, or more South
+C than North.
+C _______________________________________________________
+C
+ 200 CONTINUE
+Cjdc IF ( ZTOP .GE. (-PSOUTH) ) THEN
+ IF( (PNORTH.GT.(-PSOUTH)) .AND. (ZTOP .GE. (-PSOUTH)) ) THEN
+C
+C Move excess northern latitudes ...
+ NROWS = NINT( ( ZTOP + PSOUTH )/PLATINC )
+ NROWS = MIN( NROWS, KROWS )
+ NFLAG = 1
+C
+ IF ( NDBG .GT. 1) CALL INTLOG(JP_DEBUG,
+ X 'JMVULL - Move excess north latitudes = ', NROWS)
+C
+ CALL JMOVLL( PZFA, PNORTH, PWEST, PLATINC, PLONINC, ZTOP, NROWS,
+ X KCOLS, KLON, KJPWR, POUTF, NFLAG)
+C
+ ELSE
+C
+C Move excess southern latitudes ...
+ NROWS = NINT( ( ZTOP - PNORTH )/PLATINC )
+ NROWS = MIN( NROWS, KROWS )
+ NFLAG = 2
+C
+ IF ( NDBG .GT. 1) CALL INTLOG(JP_DEBUG,
+ X 'JMVULL - Move excess south latitudes = ', NROWS)
+C
+ CALL JMOVLL(PZFA, PNORTH, PWEST, PLATINC, PLONINC, PSTART,
+ X NROWS, KCOLS, KLON, KJPWR, POUTF, NFLAG)
+ ENDIF
+C
+ ZTOP = ZTOP - (NROWS * PLATINC)
+ LATEST = LATEST + (2 * NROWS)
+ NROWS = INROWS - NROWS
+C _______________________________________________________
+C
+C* Section 3. Processing latitudes common to both North and South.
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+C Move rows common to both if any left ...
+ IF ( NROWS .GT. 0 ) THEN
+C
+ IF ( NDBG .GT. 1) CALL INTLOG(JP_DEBUG,
+ X 'JMVULL - Move common latitudes(N & S) = ', NROWS)
+C
+ NFLAG = 3
+ CALL JMOVLL( PZFA( 1, LATEST), PNORTH, PWEST, PLATINC, PLONINC,
+ X ZTOP, NROWS, KCOLS, KLON, KJPWR, POUTF, NFLAG)
+ ENDIF
+C _______________________________________________________
+C
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+C
+ RETURN
+ END
diff --git a/interpolation/jnorsgg.F b/interpolation/jnorsgg.F
new file mode 100755
index 0000000..f7d432c
--- /dev/null
+++ b/interpolation/jnorsgg.F
@@ -0,0 +1,179 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION JNORSGG( PLAT, PGGLAT, KNUM, KUP)
+C
+C---->
+C**** JNORSGG
+C
+C PURPOSE
+C _______
+C
+C This routine determines which latitude row in a gaussian grid is
+C north or south of a given latitude.
+C
+C
+C INTERFACE
+C _________
+C
+C I = JNORSGG( PLAT, PGGLAT, KNUM, KUP)
+C
+C
+C Input parameters
+C ________________
+C
+C PLAT - Given latitude
+C PGGLAT - Array of gaussian grid latitudes (both north and south
+C values)
+C KNUM - Gaussian grid number
+C KUP - Indicator to say if the returned row number should be
+C north or south of the given latitude
+C = 0 for south, = 1 for north
+C
+C
+C Output parameters
+C ________________
+C
+C Returned value is the latitude row number.
+C
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C
+C METHOD
+C ______
+C
+C The nearest gaussian latitude row is found.
+C
+C
+C EXTERNALS
+C _________
+C
+C None
+C
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C
+C COMMENTS
+C ________
+C
+C All input values are assumed to be reasonable!
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF Jan 1994
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers ECMWF Mar 1996
+C Guess position to start search (an optimisation dodge)
+C
+C J.D.Chambers ECMWF Aug 1996
+C Accept latitude if within 1000th of a degree of stored latitude.
+C
+C J.D.Chambers ECMWF Oct 1996
+C Accept latitude if within 100th of a degree of stored latitude.
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Function arguments
+C
+ REAL PLAT, PGGLAT
+ DIMENSION PGGLAT(*)
+ INTEGER KNUM, KUP
+C
+C Local variables
+C
+ INTEGER J202, NPOS, NPLAT, NGGLAT, IGUESS
+ REAL JPFACTOR
+ PARAMETER ( JPFACTOR = PPMULT/JPMICRO )
+C
+ REAL DELTA, OLDPLAT
+ INTEGER IFIRST
+ DATA IFIRST/0/, OLDPLAT/100.0/
+ SAVE IFIRST, DELTA, IGUESS, OLDPLAT, NPLAT
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+C Setup delta estimate between gaussian latitudes
+ IF( IFIRST.NE. KNUM ) THEN
+ IFIRST = KNUM
+ DELTA = 90.0/FLOAT(KNUM-1)
+ ENDIF
+C
+ IF( OLDPLAT.NE.PLAT ) THEN
+ OLDPLAT = PLAT
+ IGUESS = INT( (90.0 - PLAT)/DELTA ) + 1
+ NPLAT = NINT(PLAT*JPFACTOR+0.5)
+ ENDIF
+C _______________________________________________________
+C
+C* Section 2. Processing.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Check latitudes in the gaussian definition array
+CDIR$ NOVECTOR
+ DO 202 J202 = IGUESS, 2*KNUM
+C Accept latitude if within 100th of a degree of stored latitude.
+ NGGLAT = NINT(PGGLAT(J202)*JPFACTOR+0.5)
+ IF ( NPLAT .GE. NGGLAT ) THEN
+ IF ( NPLAT .EQ. NGGLAT ) THEN
+ NPOS = J202
+ ELSE
+ NPOS = J202 - KUP
+ ENDIF
+ GOTO 900
+ ENDIF
+ 202 CONTINUE
+C
+C
+C On drop-through (e.g. for -90.0), use southernmost latitude
+ NPOS = 2*KNUM
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+C Allow for latitude above northernmost in array (e.g. 90.0).
+ IF ( NPOS .LT. 1 ) NPOS = 1
+C
+ JNORSGG = NPOS
+C
+ RETURN
+ END
diff --git a/interpolation/jnumgg.F b/interpolation/jnumgg.F
new file mode 100755
index 0000000..b00d290
--- /dev/null
+++ b/interpolation/jnumgg.F
@@ -0,0 +1,134 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JNUMGG( KNUM, HTYPE, KPTS, KRET)
+C
+C---->
+C**** JNUMGG
+C
+C PURPOSE
+C _______
+C
+C This routine returns the number of points in each latitude of
+C a gaussian grid.
+C
+C
+C INTERFACE
+C _________
+C
+C CALL JNUMGG( KNUM, HTYPE, KPTS, KRET)
+C
+C
+C Input parameters
+C ________________
+C
+C KNUM - Gaussian grid number
+C HTYPE - Gaussian grid type
+C = 'R' for reduced, = 'F' for full
+C
+C
+C Output parameters
+C ________________
+C
+C KPTS - Array giving number of points at each gaussian latitude
+C (both hemispheres)
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Simplified interface to JGETGG.
+C
+C
+C Externals
+C _________
+C
+C JGETGG - Get the gaussian grid definition.
+C INTLOG - Output log message
+C
+C
+C Reference
+C _________
+C
+C None
+C
+C
+C Comments
+C ________
+C
+C None
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Feb 1994
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+C
+C Subroutine arguments
+C
+ INTEGER KNUM, KPTS, KRET
+ CHARACTER*1 HTYPE
+ DIMENSION KPTS(*)
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 30700 )
+C
+C Local variables
+C
+ REAL ZLAT
+ DIMENSION ZLAT(JPMAX)
+C _______________________________________________________
+C
+C* Section 1. Get the information.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ KRET = 0
+C
+C Make sure local array is big enough for return values.
+C
+ IF ( KNUM .GT. (JPMAX/2) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JNUMGG - Local array too small for return values.',JPMAX/2)
+ KRET = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+ CALL JGETGG( KNUM, HTYPE, ZLAT, KPTS, KRET)
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/jnumggq.F b/interpolation/jnumggq.F
new file mode 100755
index 0000000..9e76ff4
--- /dev/null
+++ b/interpolation/jnumggq.F
@@ -0,0 +1,119 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION JNUMGGQ( KNUM, KPTS)
+C
+C---->
+C**** JNUMGGQ
+C
+C PURPOSE
+C -------
+C
+C This routine returns the number of points in each latitude of
+C a gaussian grid.
+C
+C
+C INTERFACE
+C ---------
+C
+C CALL JNUMGGQ( KNUM, KPTS)
+C
+C
+C Input parameters
+C ----------------
+C
+C KNUM - Gaussian grid number
+C
+C
+C Output parameters
+C -----------------
+C
+C KPTS - Array giving number of points at each gaussian latitude
+C (both hemispheres)
+C
+C Returns 0 if OK, otherwise passes the return status from JNUMGG
+C
+C
+C Common block usage
+C ------------------
+C
+C None.
+C
+C
+C Method
+C ------
+C
+C Simplified interface to JNUMGG.
+C
+C
+C Externals
+C ---------
+C
+C JGETGG - Get the gaussian grid definition.
+C
+C
+C Reference
+C ---------
+C
+C None
+C
+C
+C Comments
+C --------
+C
+C None
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers *ECMWF* January 2002
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+C
+C Subroutine arguments
+C
+ INTEGER KNUM, KPTS
+ DIMENSION KPTS(KNUM*2)
+C
+C Local variables
+C
+ CHARACTER*1 HTYPE
+ INTEGER KRET
+C
+C -----------------------------------------------------------------|
+C* Section 1. Get the information.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ HTYPE = 'R'
+ CALL JNUMGG( KNUM, HTYPE, KPTS, KRET)
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return to calling routine. Format statements
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ JNUMGGQ = KRET
+C
+ RETURN
+ END
diff --git a/interpolation/jopngg.F b/interpolation/jopngg.F
new file mode 100755
index 0000000..b9b5baf
--- /dev/null
+++ b/interpolation/jopngg.F
@@ -0,0 +1,322 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JOPNGG( PLEG, KNUM, KTRUNC, KUNIT, PLAT, KRET)
+C
+C---->
+C**** JOPNGG
+C
+C Purpose
+C _______
+C
+C This routine finds a file of legendre polynomials corresponding
+C to a given grid interval and truncation and returns a unit number.
+C
+C Interface
+C _________
+C
+C CALL JOPNGG( PLEG, KNUM, KTRUNC, KUNIT, PLAT, KRET)
+C
+C Input parameters
+C ________________
+C
+C PLEG - Array for legendre function
+C KNUM - Gaussian grid number
+C KTRUNC - Spherical truncation
+C PLAT - Array of latitudes for the gaussian grid
+C
+C Output parameters
+C _________________
+C
+C KUNIT - Unit number from PBOPEN
+C 0 , open failed
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C Method
+C ______
+C
+C Builds a file name from the truncation and grid interval and
+C tries to open a file of that name.
+C
+C If the file is already open (from a previous call) the
+C previous unit number is returned.
+C If a different file is already open (from a previous call), the
+C existing file is closed first.
+C
+C If no file can be located, a file is created.
+C
+C Externals
+C _________
+C
+C PBOPEN - Open binary file and return unit number
+C PBCLOSE - Close binary file
+C JFINDIR - Find the file of legendre coefficients
+C JMAKGG - Makes a file of legendre coefficients
+C INTLOG - Output log message
+C JCHMOD - Change file permissions
+C RENAME - Rename file
+C
+C Reference
+C _________
+C
+C NONE
+C
+C Comments
+C ________
+C
+C The filename for the legendre polynomials has the form:
+C cf_xxxx_nnnn Truncation xxx, Gaussian number yyy
+C For example,
+C cf_0213_0160 T213 N160
+C cf_0106_0080 T106 N80
+C
+C On the C90, the file of polynomials may be cached in /owrk/marsint
+C
+C Otherwise the file is located in (or will be created in) the first
+C directory given by one of the following (in the order listed, if
+C they exist):
+C environment variable PPDIR
+C or
+C the current working directory.
+C
+C
+C Author
+C ______
+C
+C J.D.Chambers *ECMWF* Jan 1994
+C
+C Modifications
+C _____________
+C
+C J.D.Chambers *ECMWF* Mar 1996
+C Standardise the search order for the environment variables.
+C
+C S.Curic *ECMWF* Apr 2005
+C Change filename format because of N1048
+C
+C----<
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 30800 )
+C
+C Subroutine arguments
+C
+ REAL PLAT, PLEG
+ DIMENSION PLAT(*)
+ DIMENSION PLEG(*)
+ INTEGER KNUM, KTRUNC, KUNIT, KRET
+C
+C Local variables
+C
+ INTEGER IRET, IOFFSET
+ LOGICAL LFOUND
+ CHARACTER*256 DIRNAME
+ CHARACTER*256 FILENAME, FILEDUM
+ CHARACTER*512 FULLPATH
+ CHARACTER*16 YPFN
+ CHARACTER*16 YOLD
+#ifdef REAL_8
+ DATA YPFN/'CF_xxxx_nnnn'/
+#else
+ DATA YPFN/'cf_xxxx_nnnn'/
+#endif
+ DATA YOLD/'xxxxxxxxxxxx'/
+ INTEGER NUNIT
+ DATA NUNIT/0/
+C
+ SAVE NUNIT, YOLD
+C
+C Externals
+C
+ LOGICAL JFINDIR
+ LOGICAL JFINDFN
+ INTEGER JCHMOD, RENAME
+C
+C _______________________________________________________
+C
+C* Section 1. See if required file already in use.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+C Setup the filename: cf_xxxx_nnnn
+C
+ WRITE(YPFN(4:7), '(I4.4)' ) KTRUNC
+ WRITE(YPFN(9:12), '(I4.4)' ) KNUM
+C
+C If file already open, return the existing unit number
+C
+ IF( YPFN.EQ.YOLD ) THEN
+ KUNIT = NUNIT
+ GOTO 900
+ ENDIF
+C
+C Otherwise, close the existing file
+C
+ IF( NUNIT.NE.0 ) THEN
+ CALL PBCLOSE( NUNIT, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JOPNGG: PBCLOSE error.',IRET)
+ NUNIT = 0
+ KRET = JPROUTINE + 1
+ GOTO 990
+ ENDIF
+ ENDIF
+C _______________________________________________________
+C
+C* Section 2. See if the file has already been created.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IOFFSET = INDEX(YPFN,' ') - 1
+ FILENAME = YPFN(1:IOFFSET)
+C
+ LFOUND = JFINDIR('PPDIR', DIRNAME)
+ IF( LFOUND ) THEN
+ LFOUND = JFINDFN(DIRNAME,FILENAME,IOFFSET,NUNIT)
+ IF( LFOUND ) GOTO 500
+ ENDIF
+C
+C Try present working directory
+C
+ IOFFSET = INDEX(YPFN,' ') - 1
+ FILENAME = YPFN(1:IOFFSET)
+ CALL PBOPEN( NUNIT, FILENAME(1:IOFFSET), 'r', IRET)
+ IF( IRET.EQ.0 ) GOTO 500
+C _______________________________________________________
+C
+C* Section 3. File doesn't exist, find a suitable directory for it.
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ LFOUND = JFINDIR('PPDIR', DIRNAME)
+ IF( LFOUND ) THEN
+ IOFFSET = INDEX(DIRNAME, ' ') - 1
+ FULLPATH = DIRNAME(1:IOFFSET) // '/' // FILENAME
+ IOFFSET = INDEX(FULLPATH, ' ') - 1
+ FILENAME(1:IOFFSET) = FULLPATH(1:IOFFSET)
+ FILEDUM(1:IOFFSET) = FILENAME(1:IOFFSET)
+#ifdef REAL_8
+ FILEDUM(IOFFSET-11:IOFFSET-10) = 'XX'
+#else
+ FILEDUM(IOFFSET-11:IOFFSET-10) = 'xx'
+#endif
+ CALL PBOPEN(NUNIT, FILEDUM(1:IOFFSET), 'w', IRET)
+ IF( IRET.EQ.0 ) GOTO 400
+ ENDIF
+C
+C Try present working directory
+C
+ IOFFSET = INDEX(YPFN,' ') - 1
+ FILENAME = YPFN(1:IOFFSET)
+ FILEDUM(1:IOFFSET) = FILENAME(1:IOFFSET)
+#ifdef REAL_8
+ FILEDUM(IOFFSET-11:IOFFSET-10) = 'XX'
+#else
+ FILEDUM(IOFFSET-11:IOFFSET-10) = 'xx'
+#endif
+ CALL PBOPEN( NUNIT, FILEDUM(1:IOFFSET), 'w', IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JOPNGG: PBOPEN error.',IRET)
+ KRET = JPROUTINE + 2
+ GOTO 990
+ ENDIF
+C _______________________________________________________
+C
+C* Section 4. Create the coefficients file.
+C _______________________________________________________
+C
+ 400 CONTINUE
+C
+C Let user know that a new file is being created.
+C
+ IOFFSET = INDEX(FILENAME,' ') - 1
+ CALL INTLOG(JP_DEBUG,'JOPNGG: Creating new coefficients file:',
+ X JPQUIET)
+ CALL INTLOG(JP_DEBUG,FILENAME(1:IOFFSET), JPQUIET)
+C
+C Change access mode to 'read only' for all users.
+C
+ IRET = JCHMOD(FILEDUM(1:IOFFSET),'0444')
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JOPNGG: JCHMOD error.',IRET)
+ KRET = JPROUTINE + 3
+ GOTO 990
+ ENDIF
+C
+C Make coefficients file
+C
+ CALL JMAKGG( NUNIT, KTRUNC, KNUM, PLAT, PLEG, KRET)
+ IF ( KRET .NE. 0 ) GOTO 990
+C
+C Close it, rename it, re-open for reading, leave it open.
+C
+ CALL PBCLOSE(NUNIT, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JOPNGG: PBCLOSE error.',IRET)
+ KRET = JPROUTINE + 4
+ GOTO 990
+ ENDIF
+C
+ FILEDUM(IOFFSET+1:IOFFSET+1) = CHAR(0)
+ FILENAME(IOFFSET+1:IOFFSET+1) = CHAR(0)
+ IRET = RENAME(FILEDUM(1:IOFFSET),FILENAME(1:IOFFSET))
+#ifndef hpR64
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNGG: RENAME of file failed',JPQUIET)
+ KRET = JPROUTINE + 5
+ GOTO 990
+ ENDIF
+#endif
+C
+ CALL PBOPEN( NUNIT, FILENAME(1:IOFFSET), 'r', IRET)
+ IF ( IRET .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'JOPNGG: PBOPEN error.',IRET)
+ KRET = JPROUTINE + 6
+ GOTO 990
+ ENDIF
+C _______________________________________________________
+C
+C* Section 5. File now open with read access.
+C _______________________________________________________
+C
+ 500 CONTINUE
+C
+ KUNIT = NUNIT
+ YOLD = YPFN
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ KRET = 0
+C
+ 990 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/jopnggf.F b/interpolation/jopnggf.F
new file mode 100755
index 0000000..77337da
--- /dev/null
+++ b/interpolation/jopnggf.F
@@ -0,0 +1,392 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JOPNGGF( IPLEG, KNUM, KTRUNC, KUNIT, PLAT, KRET)
+C
+C---->
+C**** JOPNGGF
+C
+C Purpose
+C _______
+C
+C This routine finds a file of legendre polynomials corresponding
+C to a given grid interval and truncation, allocates memory, reads
+C the coefficients into the memory and returns a unit number.
+C
+C Interface
+C _________
+C
+C CALL JOPNGGF( IPLEG, KNUM, KTRUNC, KUNIT, PLAT, KRET)
+C
+C Input parameters
+C ________________
+C
+C KNUM - Gaussian grid number
+C KTRUNC - Spherical truncation
+C PLAT - Array of latitudes for the gaussian grid
+C
+C Output parameters
+C _________________
+C
+C IPLEG - Pointer to memory array used for legendre coefficients
+C KUNIT - Unit number from PBOPEN
+C 0 , open failed
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C Uses common JDCSPGP for size NISIZE7
+C
+C Method
+C ______
+C
+C Builds a file name from the truncation and grid interval and
+C tries to open a file of that name.
+C
+C If the file is already open (from a previous call) the
+C previous unit number is returned.
+C If a different file is already open (from a previous call), the
+C existing file is closed.
+C
+C If no file can be found, a file is created. Memory is dynamically
+C allocted and the coefficients are read into the memory array.
+C
+C Externals
+C _________
+C
+C PBOPEN3 - Open binary file and return unit number
+C PBREAD3 - Read binary file
+C PBCLOSE3 - Close binary file
+C JFINDIR - Find the file of legendre coefficients
+C JMAKGG - Makes a file of legendre coefficients
+C INTLOG - Output log message
+C
+C Reference
+C _________
+C
+C NONE
+C
+C Comments
+C ________
+C
+C The filename for the legendre polynomials has the form:
+C cf_xxxx_0nnn Truncation xxx, Gaussian number yyy
+C For example,
+C cf_0213_0160 T213 N160
+C cf_0106_0080 T106 N80
+C
+C On the C90, the file of polynomials may be cached in /owrk/marsint
+C
+C Otherwise the file is located in (or will be created in) the first
+C directory given by one of the following (in the order listed, if
+C they exist):
+C environment variable PPDIR
+C or
+C the current working directory.
+C
+C
+C Author
+C ______
+C
+C J.D.Chambers *ECMWF* Jun 1996
+C
+C Modifications
+C _____________
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C S.Curic *ECMWF* Apr 2005
+C Change filename format because of N1048
+C
+C----<
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "jparams.h"
+#include "jparam2.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 30810 )
+C
+C Subroutine arguments
+C
+ REAL PLAT
+ DIMENSION PLAT(*)
+ INTEGER KNUM, KTRUNC, KUNIT, KRET
+C
+C Local variables
+C
+ INTEGER IRET, IOFFSET, NPBYTES, ISIZE
+ INTEGER*8 ITEMP,IRET1
+ CHARACTER*12 YFLAG
+#ifdef REAL_8
+ DATA NPBYTES/8/
+#else
+ DATA NPBYTES/4/
+#endif
+#ifdef POINTER_64
+ INTEGER*8 IRPLEG
+#endif
+ REAL RPLEG(1)
+ POINTER ( IRPLEG, RPLEG )
+ LOGICAL LFOUND
+ CHARACTER*256 DIRNAME
+ CHARACTER*256 FILENAME
+ CHARACTER*512 FULLPATH
+ CHARACTER*16 YPFN
+#ifdef REAL_8
+ DATA YPFN/'CF_xxxx_nnnn'/
+#else
+ DATA YPFN/'cf_xxxx_nnnn'/
+#endif
+ INTEGER NUNIT
+ DATA NUNIT/0/
+#ifdef POINTER_64
+ INTEGER*8 IPLEG
+#endif
+ REAL ALEG
+ DIMENSION ALEG(1)
+ POINTER ( IPLEG, ALEG )
+C
+ SAVE NUNIT
+C
+C Externals
+C
+ LOGICAL JFINDIR
+ LOGICAL JFINDFN3
+ INTEGER JCHMOD, CHMOD
+C
+C _______________________________________________________
+C
+C* Section 1. See if required file already in use.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+C Setup the file name
+C
+ WRITE(YPFN(4:7),'(I4.4)') KTRUNC
+ WRITE(YPFN(9:12),'(I4.4)') KNUM
+ CALL INTLOG(JP_DEBUG,
+ X 'JOPNGGF: Coefficients file to open is:', JPQUIET)
+ CALL INTLOG(JP_DEBUG, YPFN, JPQUIET)
+
+C If file already open, return the existing unit number
+C
+ IF( YPFN.EQ.YOLDGG ) THEN
+ CALL INTLOG(JP_DEBUG,'JOPNGGF: File already open.',JPQUIET)
+ KUNIT = NUNIT
+ GOTO 900
+C
+ ELSE
+C
+C Otherwise, ensure existing unit is closed
+C
+ IF( NUNIT.NE.0 ) THEN
+ CALL PBCLOSE3( NUNIT, IRET)
+ NUNIT=0
+ ENDIF
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. See if the file has already been created.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ IOFFSET = INDEX(YPFN, ' ') - 1
+ FILENAME = YPFN(1:IOFFSET)
+C
+ LFOUND = JFINDIR('PPDIR', DIRNAME)
+ IF( LFOUND ) THEN
+ LFOUND = JFINDFN3(DIRNAME,FILENAME,IOFFSET,NUNIT)
+ IF( LFOUND ) GOTO 500
+ ENDIF
+C
+C Try present working directory
+C
+ IOFFSET = INDEX(YPFN,' ') - 1
+ FILENAME = YPFN(1:IOFFSET)
+ CALL PBOPEN3( NUNIT, FILENAME(1:IOFFSET), 'r', IRET)
+ IF( IRET.EQ.0 ) GOTO 500
+C _______________________________________________________
+C
+C* Section 3. File doesn't exist, find a suitable directory for it.
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ LFOUND = JFINDIR('PPDIR', DIRNAME)
+ IF( LFOUND ) THEN
+ IOFFSET = INDEX(DIRNAME, ' ') - 1
+ FULLPATH = DIRNAME(1:IOFFSET) // '/' // FILENAME
+ IOFFSET = INDEX(FULLPATH, ' ') - 1
+ FILENAME(1:IOFFSET) = FULLPATH(1:IOFFSET)
+ CALL PBOPEN3( NUNIT, FILENAME(1:IOFFSET), 'w', IRET)
+ IF( IRET.EQ.0 ) GOTO 400
+ ENDIF
+C
+C Try present working directory
+C
+ IOFFSET = INDEX(YPFN,' ') - 1
+ FILENAME = YPFN(1:IOFFSET)
+ CALL PBOPEN3( NUNIT, FILENAME(1:IOFFSET), 'w', IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNGGF: PBOPEN3 error.',IRET)
+ KRET = JPROUTINE + 1
+ GOTO 990
+ ENDIF
+C _______________________________________________________
+C
+C* Section 4. Create the coefficients file.
+C _______________________________________________________
+C
+ 400 CONTINUE
+C
+C Let user know that a new file is being created.
+C
+ CALL INTLOG(JP_DEBUG,'JOPNGGF: Creating new coefficients file:',
+ X JPQUIET)
+ CALL INTLOG(JP_DEBUG,FILENAME(1:IOFFSET), JPQUIET)
+C
+C Change access mode to 'read only' for all users.
+C
+ IRET = JCHMOD(FILENAME(1:IOFFSET),'0444')
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNGGF: JCHMOD error.',IRET)
+ KRET = JPROUTINE + 2
+ GOTO 990
+ ENDIF
+C
+C Allocate memory for the array used in making the file
+C
+ ISIZE = (KTRUNC+1)*(KTRUNC+4)/2
+ IF( ISIZE.GT.NISIZE7 ) THEN
+ CALL JMEMHAN( 7, IRPLEG, ISIZE, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNGGF: memory allocate error',IRPLEG)
+ KRET = JPROUTINE + 3
+ GOTO 990
+ ENDIF
+ NISIZE7 = ISIZE
+ ENDIF
+C
+C Make coefficients file
+C
+ CALL JMAKGG3( NUNIT, KTRUNC, KNUM, PLAT, RPLEG, KRET)
+ IF( KRET.NE.0 ) GOTO 990
+C
+C De-allocate memory for the array used in making the file
+C
+ CALL JMEMHAN( 7, IRPLEG, ISIZE, 0, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNGGF: memory dealloc error',IRPLEG)
+ KRET = JPROUTINE + 4
+ GOTO 990
+ ENDIF
+ NISIZE7 = 0
+C
+C Close coefficients file
+C
+ CALL PBCLOSE3( NUNIT, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNGGF: PBCLOSE error.',IRET)
+ KRET = JPROUTINE + 5
+ GOTO 990
+ ENDIF
+ NUNIT=0
+C
+C Reopen with read access
+C
+ CALL PBOPEN3( NUNIT, FILENAME(1:IOFFSET), 'r', IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNGGF: PBOPEN error.',IRET)
+ KRET = JPROUTINE + 6
+ GOTO 990
+ ENDIF
+C _______________________________________________________
+C
+C* Section 5. File now open with read access.
+C _______________________________________________________
+C
+ 500 CONTINUE
+C
+C Allocate memory for the file and read the file into memory
+C
+ ISIZE = ((KTRUNC+1)*(KTRUNC+4)/2)*KNUM
+ IF( ISIZE.GT.NISIZE7 ) THEN
+ CALL JMEMHAN2( 7, IPLEG, ISIZE, 1, KRET)
+cs CALL JMEMHAN( 7, IPLEG, ISIZE, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNGGF: memory allocation error',IPLEG)
+ KRET = JPROUTINE + 7
+ GOTO 990
+ ENDIF
+ NISIZE7 = ISIZE
+ ENDIF
+C
+ ITEMP = ISIZE
+cs ITEMP = ISIZE*NPBYTES
+ ITEMP = ITEMP*8
+
+ CALL GETENV('USE_PBREAD4', YFLAG)
+ IF(YFLAG(1:1).EQ.'1') THEN
+ CALL PBREAD4(NUNIT, ALEG, ITEMP, IRET1)
+ ELSE
+cs print*,'PBREAD5 -----------'
+ CALL PBREAD5(NUNIT, ALEG, ITEMP, IRET1)
+ ENDIF
+ IF( IRET1.NE.ITEMP ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNGGF: PBREAD4 error.',IRET1)
+ KRET = JPROUTINE + 8
+ GOTO 990
+ ENDIF
+cs CALL PBREAD3(NUNIT, ALEG, (ISIZE*NPBYTES), IRET)
+cs IF( IRET.NE.(ISIZE*NPBYTES) ) THEN
+cs CALL INTLOG(JP_FATAL,'JOPNGGF: PBREAD3 error.',IRET)
+cs KRET = JPROUTINE + 8
+cs GOTO 990
+cs ENDIF
+C
+C The file is no longer required
+C
+ CALL PBCLOSE3( NUNIT, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNGGF: PBCLOSE3 error.',IRET)
+ NUNIT = 0
+ KRET = JPROUTINE + 9
+ GOTO 990
+ ENDIF
+ NUNIT=0
+C
+ KUNIT = NUNIT
+ YOLDGG = YPFN
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ KRET = 0
+C
+ 990 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/jopnggsm.c b/interpolation/jopnggsm.c
new file mode 100755
index 0000000..559f3fa
--- /dev/null
+++ b/interpolation/jopnggsm.c
@@ -0,0 +1,460 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <string.h>
+#include "fortint.h"
+
+#ifndef CRAY
+#ifdef FORTRAN_NO_UNDERSCORE
+#define JOPNGGSM jopnggsm
+#define JMAKGG jmakgg
+#define INTLOGT intlogt
+#define PBOPEN pbopen
+#define PBCLOSE pbclose
+#else
+#define JOPNGGSM jopnggsm_
+#define JMAKGG jmakgg_
+#define INTLOGT intlogt_
+#define PBOPEN pbopen_
+#define PBCLOSE pbclose_
+#endif
+#endif
+
+/*
+//#ifdef POINTER_64
+//#define pointer long
+//#else
+//#define pointer fortint
+//#endif
+*/
+
+#ifdef linux
+# if !defined __off64_t_defined
+typedef __off64_t off64_t;
+#define __off64_t_defined
+#ifdef FOPEN64
+void *mmap64(void *__addr, size_t __len, int __prot, int __flags, int __fd, __off64_t __offset);
+#endif
+#endif
+#endif
+
+#ifdef FOPEN64
+#define OFF_T off64_t
+extern OFF_T ftello64(FILE *);
+#else
+#define OFF_T off_t
+#endif
+
+
+
+void INTLOGT(char * message, long length);
+FILE * pbfp(long);
+
+#ifdef REAL_8
+void JOPNGGSM(
+ JPointer *ipdum,
+ fortint *knum,
+ fortint *iktrunc,
+ fortint *kunit,
+ double *plat,
+ fortint * kret)
+#else
+void JOPNGGSM(
+ JPointer *ipdum,
+ fortint *knum,
+ fortint *iktrunc,
+ fortint *kunit,
+ float *plat,
+ fortint * kret)
+#endif
+/*
+C
+C**** JOPNGGSM
+C
+C Purpose
+C _______
+C
+C This routine finds a file of legendre polynomials corresponding
+C to a given grid interval and truncation and maps the file to an
+C array and returns a file descriptor.
+C
+C Interface
+C _________
+C
+C CALL JOPNGGSM( IPDUM, KNUM, KTRUNC, KUNIT, PLAT, KRET)
+C
+C Input parameters
+C ________________
+C
+C IPDUM - Dummy array for mapping legendre function file
+C KNUM - Gaussian grid number
+C KTRUNC - Spherical truncation
+C PLAT - Array of latitudes for the gaussian grid
+C
+C Output parameters
+C _________________
+C
+C KUNIT - file descriptor from fopen
+C NULL , open failed
+C KRET - Return status, 0 = OK.
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C Method
+C ______
+C
+C Builds a file name from the truncation and grid interval and
+C tries to open a file of that name.
+C
+C If the file is already open (from a previous call) the
+C previous unit number is returned.
+C If a different file is already open (from a previous call), the
+C existing file is closed first.
+C
+C If no file can be located, a file is created.
+C
+C Externals
+C _________
+C
+C GETENV - Get value of an environment variable
+C JMAKGG - Makes a file of legendre coefficients
+C PBOPEN - Opens a file
+C PBCLOSE - Closes a file
+C
+C Reference
+C _________
+C
+C NONE
+C
+C Comments
+C ________
+C
+C The filename for the legendre polynomials has the form:
+C cf_xxxx_nnnn Truncation xxxx, Gaussian number yyy
+C For example,
+C cf_0213_n160 T213 N160
+C cf_0106_n080 T106 N80
+C
+C On the C90, the file of polynomials may be cached in /owrk/marsint
+C
+C Otherwise the file is located in (or will be created in) the first
+C directory given by one of the following (in the order listed, if
+C they exist):
+C environment variable PPDIR
+C or
+C the current working directory.
+C
+C Author
+C ______
+C
+C J.D.Chambers *ECMWF* Jan 1994
+C
+C Modifications
+C _____________
+C
+C J.D.Chambers *ECMWF* Mar 1996
+C Standardise the search order for the environment variables.
+C
+C J.D.Chambers *ECMWF* Sept 1999
+C Use PB routines for OPEN and CLOSE (use index into table of FILE *)
+C
+*/
+{
+#if (defined hpR64) || (defined hpiaR64)
+long l1, l2;
+#else
+fortint l1, l2;
+#endif
+char filedum[128], filename[128];
+#ifdef REAL_8
+char ypfn[13] = "CF_xxxx_nnnn";
+#else
+char ypfn[13] = "cf_xxxx_nnnn";
+#endif
+static char yold[13] = "xxxxxxxxxxxx";
+static char yarray[12][13];
+static int ncnt = 0;
+static int nunit = -1;
+int i;
+long long len, len_pleg;
+static long long oldlen;
+char * fn;
+static fortint fpindex;
+static FILE * fp;
+off_t off = 0;
+static void * result = 0;
+static void * oldresult = 0;
+static void * resultarray[12];
+static int unitarray[12];
+#ifdef REAL_8
+double * pleg;
+#else
+float * pleg;
+#endif
+int exist = 0;
+char message[] = "JOPNGGSM: creating coefficients file";
+int status;
+pid_t process_id;
+int ktrunc = (int) (*iktrunc);
+
+/*
+// Setup the file name: cf_xxxx_nnnn
+*/
+#ifdef REAL_8
+ len_pleg = sizeof(double) * (ktrunc+1) * (ktrunc+4) /2;
+ len = *knum * sizeof(double) * (ktrunc+1) * (ktrunc+4) /2;
+#else
+ len_pleg = sizeof(float) * (ktrunc+1) * (ktrunc+4) /2;
+ len = *knum * sizeof(float) * (ktrunc+1) * (ktrunc+4) /2;
+#endif
+ sprintf( ypfn+3, "%04d", ktrunc);
+ sprintf( ypfn+7, "_%04d", *knum);
+
+/*
+// If file already open, return the existing unit number
+*/
+ for(i=0;i<ncnt;i++) {
+ strncpy(yold,yarray[i],12);
+ strcat(yold,"\0");
+ if( !strcmp( ypfn, yold ) ) {
+ *kunit = (fortint) unitarray[i];
+ *ipdum = (JPointer) resultarray[i];
+ return;
+ }
+ }
+
+/*
+// Otherwise, unmap and close the existing file
+*/
+ result = 0;
+/*
+ if( nunit != -1 ) {
+ if( munmap((caddr_t) oldresult, oldlen) ) {
+ perror("JOPNGGSM: munmap error");
+ *kret = (fortint) 999;
+ return;
+ }
+ PBCLOSE(&fpindex,kret);
+ if( *kret != 0 ) {
+ perror("JOPNGGSM: PBCLOSE error");
+ *kret = (fortint) 999;
+ return;
+ }
+ }
+*/
+
+/*
+ If more than 12 files are memory mapped , error
+*/
+ if(ncnt==13) {
+ fprintf(stderr,"JOPNGGSM: attempt to memory map more than 12 files\n");
+ *kret = (fortint) 999;
+ return;
+ }
+
+/*
+// See if the file has already been created.
+*/
+ fn = getenv("PPDIR");
+ if( (fn != NULL) && (strlen(fn) != 0) ) {
+ strcpy( filename, fn );
+ strcat( filename, "/");
+ strcat( filename, ypfn);
+ l1 = strlen(filename);
+ l2 = 1;
+ PBOPEN(&fpindex,filename,"r",kret,l1,l2);
+ if( *kret == 0 ) {
+ fp = pbfp((long)fpindex);
+ if( fp != NULL ) exist = 1;
+ }
+ }
+
+ if( !exist ) {
+ strcpy( filename, "./" );
+ strcat( filename, ypfn);
+ l1 = strlen(filename);
+ l2 = 1;
+ PBOPEN(&fpindex,filename,"r",kret,l1,l2);
+ if( *kret == 0 ) {
+ fp = pbfp((long)fpindex);
+ if( fp != NULL ) exist = 1;
+ }
+ }
+
+/*
+// If file doesn't exist, find a suitable directory for it.
+*/
+ if( !exist ) {
+ fn = getenv( "PPDIR" );
+ if( (fn != NULL) && (strlen(fn) != 0) ) {
+ strcpy( filename, fn );
+ strcat( filename, "/");
+ }
+ else
+ strcpy( filename, "./" );
+
+ strcat( filename, ypfn);
+
+/*
+// Open it with write access, change mode to 'read only', and make it
+*/
+ INTLOGT(message,strlen(message));
+ INTLOGT(filename,strlen(filename));
+
+ process_id = getpid();
+
+ strcpy(filedum, filename);
+ sprintf(&filedum[strlen(filename)],"_%06d",process_id);
+
+ l1 = strlen(filedum);
+ l2 = 1;
+ PBOPEN(&fpindex,filedum,"w",kret,l1,l2);
+ if( (*kret) || ( fp = pbfp((long)fpindex) ) == NULL ) {
+ strcpy( filename, "./" );
+ strcat( filename, ypfn);
+ strcpy(filedum, filename);
+ sprintf(&filedum[strlen(filename)],"_%06d",process_id);
+ l1 = strlen(filedum);
+ l2 = 1;
+ PBOPEN(&fpindex,filedum,"w",kret,l1,l2);
+ if( *kret ) {
+ perror("JOPNGGSM: PBOPEN error");
+ return;
+ }
+ fp = pbfp((long)fpindex);
+ if( fp == NULL ) {
+ perror("JOPNGGSM: file pointer after PBOPEN is NULL");
+ *kret = (fortint) 998;
+ return;
+ }
+ }
+
+ status = chmod( filedum, (mode_t) 0444 );
+ if( status ) {
+ perror("JOPNGGSM: chmod error");
+ *kret = (fortint) 997;
+ return;
+ }
+
+/*
+// Setup scratch legendre file.
+*/
+#ifdef REAL_8
+ pleg = (double *) malloc(len_pleg*2);
+#else
+ pleg = (float *) malloc(len_pleg*2);
+#endif
+
+ if( pleg == NULL ) {
+ perror("JOPNGGSM: malloc error.");
+ *kret = (fortint) 996;
+ return;
+ }
+ JMAKGG( &fpindex, iktrunc, knum, plat, pleg, kret);
+ if( *kret != 0 ) {
+ free(pleg);
+ return;
+ }
+
+/*
+// Close it, rename it, and open it again with read access
+*/
+ free(pleg);
+ PBCLOSE(&fpindex,kret);
+ status = rename(filedum, filename);
+ if( status ) {
+ perror("JOPNGGSM: rename error");
+ *kret = (fortint) 995;
+ return;
+ }
+
+ l1 = strlen(filename);
+ l2 = 1;
+ PBOPEN(&fpindex,filename,"r",kret,l1,l2);
+ if( *kret ) {
+ perror("JOPNGGSM: PBOPEN error");
+ *kret = (fortint) 994;
+ return;
+ }
+ fp = pbfp((long)fpindex);
+ if( fp == NULL ) {
+ perror("JOPNGGSM: file pointer after PBOPEN is NULL");
+ *kret = (fortint) 994;
+ return;
+ }
+ }
+
+/*
+// Check the file size
+*/
+#ifdef FOPEN64
+ fseeko64(fp, 0, 2);
+ if( len != ftello64(fp) ) {
+#else
+ fseek(fp, 0, 2);
+ if( len != ftell(fp) ) {
+#endif
+ fprintf(stderr,"JOPNGGSM: coefficients file size should be %lld bytes\n", len)
+;
+ *kret = (fortint) 993;
+ return;
+ }
+#ifdef FOPEN64
+ fseeko64(fp, 0, 0);
+#else
+ fseek(fp, 0, 0);
+#endif
+
+/*
+// Map the file
+*/
+ nunit = fileno(fp);
+ if( nunit >= 0 ) {
+ char *p = getenv("PPMAPADDR");
+ caddr_t addr = (caddr_t) (p?atol(p):0);
+
+#ifdef FOPEN64
+ result = (void *) mmap64(addr,(size_t) len, (PROT_READ),
+ MAP_SHARED,(int) nunit, (OFF_T)off);
+#else
+ result = (void *) mmap(addr,(size_t) len, (PROT_READ),
+ MAP_SHARED,(int) nunit,(OFF_T) off);
+#endif
+ /* result = (void *) mmap(addr,(size_t) len, (PROT_READ), */
+ /* MAP_SHARED,(int) nunit,(off_t) off); */
+
+ if( (caddr_t) result == (caddr_t) -1 ) {
+ perror("JOPNGGSM: mmap error");
+ *kret = (fortint) 992;
+ return;
+ }
+ oldresult = result;
+ oldlen = len;
+ }
+
+ *ipdum = (JPointer) result;
+ *kunit = (fortint) nunit;
+ strcpy( yarray[ncnt], ypfn);
+ resultarray[ncnt] = result;
+ unitarray[ncnt] = nunit;
+ ncnt+=1;
+
+ return;
+}
diff --git a/interpolation/jopnll.F b/interpolation/jopnll.F
new file mode 100755
index 0000000..90a80df
--- /dev/null
+++ b/interpolation/jopnll.F
@@ -0,0 +1,328 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JOPNLL( PLEG, PINTVL, KTRUNC, KUNIT, PBUILD, KRET)
+C
+C---->
+C**** JOPNLL
+C
+C Purpose
+C _______
+C
+C This routine finds a file of legendre polynomials corresponding
+C to a given grid interval and truncation and returns a unit number.
+C
+C Interface
+C _________
+C
+C CALL JOPNLL( PLEG, PINTVL, KTRUNC, KUNIT, PBUILD, KRET)
+C
+C Input parameters
+C ________________
+C
+C PLEG - Array for legendre function
+C PINTVL - Grid interval in degrees
+C KTRUNC - Spherical truncation
+C
+C Output parameters
+C _________________
+C
+C KUNIT - Unit number from PBOPEN
+C 0 , open failed
+C PBUILD - Grid interval used to build the legendre
+C coefficients file (degrees)
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C Method
+C ______
+C
+C Builds a file name from the truncation and grid interval and
+C tries to open a file of that name.
+C
+C If the file is already open (from a previous call), the
+C previous unit number is returned.
+C If a different file is already open (from a previous call), the
+C existing file is closed first.
+C
+C If no file can be located, a file is created.
+C
+C Externals
+C _________
+C
+C PBOPEN - Open binary file and return unit number
+C PBCLOSE - Close binary file
+C JFINDIR - Find the file of legendre coefficients
+C JMAKLL - Makes a file of legendre coefficients
+C INTLOG - Output log message
+C JCHMOD - Change file permissions
+C RENAME - Rename file
+C
+C Reference
+C _________
+C
+C NONE
+C
+C Comments
+C ________
+C
+C The Legendre polynomials for the transforms may be held in
+C a ready-made file whose name is held in an environment variable:
+C cf_txxxx_raabbbbb Txxx aa.bbbbb degrees
+C For example,
+C cf_t0213_r0050000 T213 0.5 degrees
+C cf_t0106_r0250000 T106 2.5 degrees
+C
+C On the C90, the file of polynomials may be cached in /owrk/marsint
+C
+C Otherwise the file is located in (or will be created in) the first
+C directory given by one of the following (in the order listed, if
+C they exist):
+C environment variable PPDIR
+C or
+C the current working directory.
+C
+C Author
+C ______
+C
+C J.D.Chambers *ECMWF* Nov 1993
+C
+C Modifications
+C _____________
+C
+C J.D.Chambers *ECMWF* Mar 1996
+C Standardise the search order for the environment variables.
+C
+C----<
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER( JPROUTINE = 30900 )
+C
+C Subroutine arguments
+C
+ REAL PLEG, PINTVL, PBUILD
+ DIMENSION PLEG(*)
+ INTEGER KTRUNC, KUNIT, KRET
+C
+C Local variables
+C
+ INTEGER IRET, IOFFSET
+ LOGICAL LFOUND
+ CHARACTER*256 DIRNAME
+ CHARACTER*256 FILENAME, FILEDUM
+ CHARACTER*512 FULLPATH
+ CHARACTER*20 YPFN
+ CHARACTER*20 YOLD
+#ifdef REAL_8
+ DATA YPFN/'CF_Txxxx_Raabbbbb'/
+#else
+ DATA YPFN/'cf_txxxx_raabbbbb'/
+#endif
+ DATA YOLD/'xxxxxxxxxxxxxxxxx'/
+ INTEGER NUNIT
+ DATA NUNIT/0/
+C
+ SAVE NUNIT, YOLD
+C
+C Externals
+C
+ LOGICAL JFINDIR
+ LOGICAL JFINDFN
+ INTEGER JCHMOD, RENAME
+C
+C _______________________________________________________
+C
+C* Section 1. See if required file already in use.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+C Setup the filename: cf_txxxx_raabbbbb
+C
+ WRITE(YPFN(5:8),'(I4.4)') KTRUNC
+ WRITE(YPFN(11:17),'(I7.7)') NINT(PINTVL*JPMULT)
+ CALL INTLOG(JP_DEBUG,
+ X 'JOPNLL: Coefficients file to open is:', JPQUIET)
+ CALL INTLOG(JP_DEBUG, YPFN, JPQUIET)
+ PBUILD = PINTVL
+C
+C If file already open, return the existing unit number
+C
+ IF( YPFN.EQ.YOLD ) THEN
+ CALL INTLOG(JP_DEBUG,'JOPNLL: File already open.',JPQUIET)
+ KUNIT = NUNIT
+ GOTO 900
+ ENDIF
+C
+C Otherwise, close the existing file
+C
+ IF( NUNIT.NE.0 ) THEN
+ CALL PBCLOSE(NUNIT, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JOPNLL: PBCLOSE error',IRET)
+ KRET = JPROUTINE + 1
+ GOTO 990
+ ENDIF
+ NUNIT = 0
+ ENDIF
+C _______________________________________________________
+C
+C* Section 2. See if the file has already been created.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Set appropriate build inteval
+C
+ WRITE(YPFN(11:17),'(I7.7)') NINT(PBUILD*JPMULT)
+C
+ IOFFSET = INDEX(YPFN,' ') - 1
+ FILENAME = YPFN(1:IOFFSET)
+C
+ LFOUND = JFINDIR('PPDIR', DIRNAME)
+ IF( LFOUND ) THEN
+ LFOUND = JFINDFN(DIRNAME,FILENAME,IOFFSET,NUNIT)
+ IF( LFOUND ) GOTO 500
+ ENDIF
+C
+C Try present working directory
+C
+ IOFFSET = INDEX(YPFN, ' ') - 1
+ FILENAME = YPFN(1:IOFFSET)
+ CALL PBOPEN( NUNIT, FILENAME(1:IOFFSET), 'r', IRET)
+ IF( IRET.EQ.0 ) GOTO 500
+C _______________________________________________________
+C
+C* Section 3. File doesn't exist, find a suitable directory for it.
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ LFOUND = JFINDIR('PPDIR', DIRNAME)
+ IF ( LFOUND ) THEN
+ IOFFSET = INDEX(DIRNAME, ' ') - 1
+ FULLPATH = DIRNAME(1:IOFFSET) // '/' // FILENAME
+ IOFFSET = INDEX(FULLPATH, ' ') - 1
+ FILENAME(1:IOFFSET) = FULLPATH(1:IOFFSET)
+ FILEDUM(1:IOFFSET) = FILENAME(1:IOFFSET)
+#ifdef REAL_8
+ FILEDUM(IOFFSET-16:IOFFSET-15) = 'XX'
+#else
+ FILEDUM(IOFFSET-16:IOFFSET-15) = 'xx'
+#endif
+ CALL PBOPEN(NUNIT, FILEDUM(1:IOFFSET), 'w', IRET)
+ IF( IRET.EQ.0 ) GOTO 400
+ ENDIF
+C
+C Try present working directory
+C
+ IOFFSET = INDEX(YPFN,' ') - 1
+ FILENAME = YPFN(1:IOFFSET)
+ FILEDUM(1:IOFFSET) = FILENAME(1:IOFFSET)
+#ifdef REAL_8
+ FILEDUM(IOFFSET-16:IOFFSET-15) = 'XX'
+#else
+ FILEDUM(IOFFSET-16:IOFFSET-15) = 'xx'
+#endif
+ CALL PBOPEN(NUNIT, FILEDUM(1:IOFFSET), 'w', IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNLL: PBOPEN error.',IRET)
+ KRET = JPROUTINE + 2
+ GOTO 990
+ ENDIF
+C _______________________________________________________
+C
+C* Section 4. Create the coefficients file.
+C _______________________________________________________
+C
+ 400 CONTINUE
+C
+C Let user know that a new file is being created.
+C
+ IOFFSET = INDEX(FILENAME, ' ') - 1
+ CALL INTLOG(JP_DEBUG,'JOPNLL: Creating new coefficients file:',
+ X JPQUIET)
+ CALL INTLOG(JP_DEBUG,FILENAME(1:IOFFSET), JPQUIET)
+C
+C Change access mode to 'read only' for all users.
+C
+ IRET = JCHMOD(FILEDUM(1:IOFFSET),'0444')
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNLL: JCHMOD error.',IRET)
+ KRET = JPROUTINE + 3
+ GOTO 990
+ ENDIF
+C
+C Make coefficients file
+C
+ CALL JMAKLL( NUNIT, KTRUNC, PBUILD, 0.0, PLEG, KRET)
+ IF( KRET.NE.0 ) GOTO 990
+C
+C Close it, rename it, re-open for reading, leave it open.
+C
+ CALL PBCLOSE(NUNIT, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JOPNLL: PBCLOSE error.',IRET)
+ KRET = JPROUTINE + 4
+ GOTO 990
+ ENDIF
+C
+ FILEDUM(IOFFSET+1:IOFFSET+1) = CHAR(0)
+ FILENAME(IOFFSET+1:IOFFSET+1) = CHAR(0)
+ IRET = RENAME(FILEDUM(1:IOFFSET),FILENAME(1:IOFFSET))
+#ifndef hpR64
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNLL: RENAME of file failed',JPQUIET)
+ KRET = JPROUTINE + 5
+ GOTO 990
+ ENDIF
+#endif
+C
+ CALL PBOPEN(NUNIT, FILENAME(1:IOFFSET), 'r', IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNLL: PBOPEN error.',IRET)
+ KRET = JPROUTINE + 6
+ GOTO 990
+ ENDIF
+C _______________________________________________________
+C
+C* Section 5. File now open with read access.
+C _______________________________________________________
+C
+ 500 CONTINUE
+C
+ KUNIT = NUNIT
+ YOLD = YPFN
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ KRET = 0
+C
+ 990 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/jopnllf.F b/interpolation/jopnllf.F
new file mode 100755
index 0000000..53fa5ac
--- /dev/null
+++ b/interpolation/jopnllf.F
@@ -0,0 +1,410 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JOPNLLF( IALEG, PINTVL, KTRUNC, KUNIT, PBUILD, KRET)
+C
+C---->
+C**** JOPNLLF
+C
+C Purpose
+C _______
+C
+C This routine finds a file of legendre polynomials corresponding
+C to a given grid interval and truncation, allocates memory, reads
+C the coefficients into the memory and returns a unit number.
+C
+C Interface
+C _________
+C
+C CALL JOPNLLF( IALEG, PINTVL, KTRUNC, KUNIT, PBUILD, KRET)
+C
+C Input parameters
+C ________________
+C
+C PINTVL - Grid interval in degrees
+C KTRUNC - Spherical truncation
+C
+C Output parameters
+C _________________
+C
+C IALEG - Pointer for memory array for legendre coefficients
+C KUNIT - Unit number from PBOPEN
+C 0 , open failed
+C PBUILD - Grid interval used to build the legendre
+C coefficients file (degrees)
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C Uses common JDCSPGP for size NISIZE6
+C
+C Method
+C ______
+C
+C Builds a file name from the truncation and grid interval and
+C tries to open a file of that name.
+C
+C If the file is already open (from a previous call), the
+C previous unit number is returned.
+C If a different file is already open (from a previous call), the
+C the existing file is closed.
+C
+C If no file can be located, a file is created. Memory is dynamically
+C allocted and the coefficients are read into the memory array.
+C
+C Externals
+C _________
+C
+C PBOPEN3 - Open binary file and return unit number
+C PBREAD3 - Read binary file
+C PBCLOSE3 - Close binary file
+C JFINDIR - Find the file of legendre coefficients
+C JMAKLL - Makes a file of legendre coefficients
+C INTLOG - Output log message
+C JCHMOD - Change file permissions
+C RENAME - Rename file
+C
+C Reference
+C _________
+C
+C NONE
+C
+C Comments
+C ________
+C
+C The Legendre polynomials for the transforms may be held in
+C a ready-made file whose name is held in an environment variable:
+C cf_txxxx_raabbbbb Txxxx aa.bbbbb degrees
+C For example,
+C cf_t0213_r0050000 T213 0.5 degrees
+C cf_t0106_r0250000 T106 2.5 degrees
+C
+C On the C90, the file of polynomials may be cached in /owrk/marsint
+C
+C Otherwise the file is located in (or will be created in) the first
+C directory given by one of the following (in the order listed, if
+C they exist):
+C environment variable PPDIR
+C or
+C the current working directory.
+C
+C Author
+C ______
+C
+C J.D.Chambers *ECMWF* Jun 1996
+C
+C Modifications
+C _____________
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C----<
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "jparams.h"
+#include "jparam2.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 30910 )
+C
+C Subroutine arguments
+C
+ REAL PINTVL, PBUILD
+ INTEGER KTRUNC, KUNIT, KRET
+C
+C Local variables
+C
+ INTEGER IRET, IOFFSET, ISIZE, NPBYTES
+ INTEGER*8 IRET1, ITEMP
+ CHARACTER*12 YFLAG
+#ifdef REAL_8
+ DATA NPBYTES/8/
+#else
+ DATA NPBYTES/4/
+#endif
+ LOGICAL LFOUND
+ CHARACTER*256 DIRNAME
+ CHARACTER*256 FILENAME, FILEDUM
+ CHARACTER*512 FULLPATH
+ CHARACTER*20 YPFN
+#ifdef REAL_8
+ DATA YPFN/'CF_Txxxx_Raabbbbb'/
+#else
+ DATA YPFN/'cf_txxxx_raabbbbb'/
+#endif
+ INTEGER NUNIT
+ DATA NUNIT/0/
+#ifdef POINTER_64
+ INTEGER*8 IALEG
+#endif
+ REAL ALEG
+ DIMENSION ALEG(1)
+ POINTER ( IALEG, ALEG )
+C
+ SAVE NUNIT
+C
+C Externals
+C
+ LOGICAL JFINDIR
+ LOGICAL JFINDFN3
+ INTEGER JCHMOD, RENAME
+C
+C _______________________________________________________
+C
+C* Section 1. See if required file already in use.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+C Setup the filename: cf_txxxx_raabbbbb
+C
+ WRITE(YPFN(5:8),'(I4.4)') KTRUNC
+ WRITE(YPFN(11:17),'(I7.7)') NINT(PINTVL*JPMULT)
+ CALL INTLOG(JP_DEBUG,
+ X 'JOPNLLF: Coefficients file to open is:', JPQUIET)
+ CALL INTLOG(JP_DEBUG, YPFN, JPQUIET)
+ PBUILD = PINTVL
+C
+C If file already open, return the existing unit number
+C
+ IF( YPFN.EQ.YOLDLL ) THEN
+ CALL INTLOG(JP_DEBUG,'JOPNLLF: File already open.',JPQUIET)
+ KUNIT = NUNIT
+ GOTO 900
+ ENDIF
+C
+C Otherwise, ensure existing unit is closed
+C
+ IF( NUNIT.NE.0 ) THEN
+ CALL PBCLOSE3(NUNIT, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JOPNLLF: PBCLOSE3 error',IRET)
+ KRET = JPROUTINE + 1
+ GOTO 990
+ ENDIF
+ NUNIT = 0
+ ENDIF
+C _______________________________________________________
+C
+C* Section 2. See if the file has already been created.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Set appropriate build inteval
+C
+ WRITE(YPFN(11:17),'(I7.7)') NINT(PBUILD*JPMULT)
+C
+ IOFFSET = INDEX(YPFN,' ') - 1
+ FILENAME = YPFN(1:IOFFSET)
+C
+ LFOUND = JFINDIR('PPDIR', DIRNAME)
+ IF( LFOUND ) THEN
+ LFOUND = JFINDFN3(DIRNAME,FILENAME,IOFFSET,NUNIT)
+ IF( LFOUND ) GOTO 500
+ ENDIF
+C
+C Try present working directory
+C
+ IOFFSET = INDEX(YPFN, ' ') - 1
+ FILENAME = YPFN(1:IOFFSET)
+ CALL PBOPEN3( NUNIT, FILENAME(1:IOFFSET), 'r', IRET)
+ IF( IRET.EQ.0 ) GOTO 500
+C _______________________________________________________
+C
+C* Section 3. File doesn't exist, find a suitable directory for it.
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ LFOUND = JFINDIR('PPDIR', DIRNAME)
+ IF ( LFOUND ) THEN
+ IOFFSET = INDEX(DIRNAME, ' ') - 1
+ FULLPATH = DIRNAME(1:IOFFSET) // '/' // FILENAME
+ IOFFSET = INDEX(FULLPATH, ' ') - 1
+ FILENAME(1:IOFFSET) = FULLPATH(1:IOFFSET)
+ FILEDUM(1:IOFFSET) = FILENAME(1:IOFFSET)
+#ifdef REAL_8
+ FILEDUM(IOFFSET-16:IOFFSET-15) = 'XX'
+#else
+ FILEDUM(IOFFSET-16:IOFFSET-15) = 'xx'
+#endif
+ CALL PBOPEN3(NUNIT, FILEDUM(1:IOFFSET), 'w', IRET)
+ IF( IRET.EQ.0 ) GOTO 400
+ ENDIF
+C
+C Try present working directory
+C
+ IOFFSET = INDEX(YPFN,' ') - 1
+ FILENAME = YPFN(1:IOFFSET)
+ FILEDUM(1:IOFFSET) = FILENAME(1:IOFFSET)
+#ifdef REAL_8
+ FILEDUM(IOFFSET-16:IOFFSET-15) = 'XX'
+#else
+ FILEDUM(IOFFSET-16:IOFFSET-15) = 'xx'
+#endif
+ CALL PBOPEN3(NUNIT, FILEDUM(1:IOFFSET), 'w', IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNLLF: PBOPEN3 error.',IRET)
+ KRET = JPROUTINE + 2
+ GOTO 990
+ ENDIF
+C _______________________________________________________
+C
+C* Section 4. Create the coefficients file.
+C _______________________________________________________
+C
+ 400 CONTINUE
+C
+C Let user know that a new file is being created.
+C
+ IOFFSET = INDEX(FILENAME, ' ') - 1
+ CALL INTLOG(JP_DEBUG,'JOPNLLF: Creating new coefficients file:',
+ X JPQUIET)
+ CALL INTLOG(JP_DEBUG,FILENAME(1:IOFFSET), JPQUIET)
+C
+C Change access mode to 'read only' for all users.
+C
+ IRET = JCHMOD(FILEDUM(1:IOFFSET),'0444')
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNLLF: JCHMOD error.',IRET)
+ KRET = JPROUTINE + 3
+ GOTO 990
+ ENDIF
+C
+C Allocate memory for the array used in making the file
+C
+ ISIZE = (KTRUNC+1)*(KTRUNC+4)*(NINT(90.0/PBUILD)+1)/2
+ IF( ISIZE.GT.NISIZE6 ) THEN
+ CALL JMEMHAN( 6, IALEG, ISIZE, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNLLF: memory allocation error',IALEG)
+ KRET = JPROUTINE + 3
+ GOTO 990
+ ENDIF
+ NISIZE6 = ISIZE
+ ENDIF
+C
+C Make coefficients file
+C
+ CALL JMAKLL3( NUNIT, KTRUNC, PBUILD, 0.0, ALEG, KRET)
+ IF ( KRET .NE. 0 ) GOTO 990
+C
+C De-allocate memory for the array used in making the file
+C
+ CALL JMEMHAN( 6, IALEG, ISIZE, 0, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNLLF: memory dealloc error',IALEG)
+ KRET = JPROUTINE + 4
+ GOTO 990
+ ENDIF
+ NISIZE6 = 0
+C
+C Close rename it, re-open for reading, leave it open.
+C
+ CALL PBCLOSE3( NUNIT, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNLLF: PBCLOSE3 error.',IRET)
+ KRET = JPROUTINE + 5
+ GOTO 990
+ ENDIF
+ NUNIT=0
+C
+ IRET = RENAME(FILEDUM(1:IOFFSET),FILENAME(1:IOFFSET))
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNLLF: RENAME of file failed',JPQUIET)
+ KRET = JPROUTINE + 5
+ GOTO 990
+ ENDIF
+C
+ CALL PBOPEN3( NUNIT, FILENAME(1:IOFFSET), 'r', IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNLLF: PBOPEN3 error.',IRET)
+ KRET = JPROUTINE + 6
+ GOTO 990
+ ENDIF
+C _______________________________________________________
+C
+C* Section 5. File now open with read access.
+C _______________________________________________________
+C
+ 500 CONTINUE
+C
+C Allocate memory for the file and read it into memory
+C
+ ISIZE = (KTRUNC+1)*(KTRUNC+4)*(NINT(90.0/PBUILD)+1)/2
+ IF( ISIZE.GT.NISIZE6 ) THEN
+ CALL JMEMHAN2( 6, IALEG, ISIZE, 1, KRET)
+cs CALL JMEMHAN( 6, IALEG, ISIZE, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNLLF: memory allocation error',IALEG)
+ KRET = JPROUTINE + 7
+ GOTO 990
+ ENDIF
+ NISIZE6 = ISIZE
+ ENDIF
+ ITEMP = ISIZE
+ ITEMP = ITEMP*8
+C
+ CALL GETENV('USE_PBREAD4', YFLAG)
+ IF(YFLAG(1:1).EQ.'1') THEN
+ CALL PBREAD4(NUNIT, ALEG, ITEMP, IRET1)
+ ELSE
+ print*,'PBREAD5 ',ITEMP
+ CALL PBREAD5(NUNIT, ALEG, ITEMP, IRET1)
+ ENDIF
+C
+ IF( IRET1.NE.ITEMP ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNLLF: PBREAD5 error.',IRET1)
+ KRET = JPROUTINE + 8
+ GOTO 990
+ ENDIF
+cs CALL PBREAD3(NUNIT, ALEG, (ISIZE*NPBYTES), IRET)
+cs IF( IRET.NE.(ISIZE*NPBYTES) ) THEN
+cs CALL INTLOG(JP_FATAL,'JOPNLLF: PBREAD3 error.',IRET)
+cs KRET = JPROUTINE + 8
+cs GOTO 990
+cs ENDIF
+C
+C The file is no longer required
+C
+ CALL PBCLOSE3( NUNIT, IRET)
+ IF ( IRET .NE. 0 ) THEN
+ CALL INTLOG(JP_FATAL,'JOPNLLF: PBCLOSE3 error.',IRET)
+ NUNIT = 0
+ KRET = JPROUTINE + 9
+ GOTO 990
+ ENDIF
+ NUNIT=0
+C
+ KUNIT = NUNIT
+ YOLDLL = YPFN
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ KRET = 0
+C
+ 990 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/jopnllsm.c b/interpolation/jopnllsm.c
new file mode 100755
index 0000000..1374a68
--- /dev/null
+++ b/interpolation/jopnllsm.c
@@ -0,0 +1,541 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+#ifdef linux
+#ifndef __USE_LARGEFILE64
+#define __USE_LARGEFILE64
+#endif
+#include <sys/stat.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <string.h>
+#include "fortint.h"
+
+
+
+#ifndef CRAY
+#ifdef FORTRAN_NO_UNDERSCORE
+#define JOPNLLSM jopnllsm
+#define JMAKLL jmakll
+#define INTLOGT intlogt
+#define PBOPEN pbopen
+#define PBCLOSE pbclose
+#else
+#define JOPNLLSM jopnllsm_
+#define JMAKLL jmakll_
+#define INTLOGT intlogt_
+#define PBOPEN pbopen_
+#define PBCLOSE pbclose_
+#endif
+#endif
+
+/*
+//#ifdef POINTER_64
+//#define pointer long
+//#else
+//#define pointer fortint
+//#endif
+*/
+
+#ifdef linux
+# if !defined __off64_t_defined
+typedef __off64_t off64_t;
+#define __off64_t_defined
+#ifdef FOPEN64
+void *mmap64(void *__addr, size_t __len, int __prot, int __flags, int __fd, __off64_t __offset);
+#endif
+#endif
+#endif
+
+#ifdef FOPEN64
+#define OFF_T off64_t
+extern OFF_T ftello64(FILE *);
+#else
+#define OFF_T off_t
+#endif
+
+int iitimer(int *seconds)
+{
+ time_t timval1;
+ time(&timval1);
+
+ if (*seconds == 0) return (int)timval1;
+
+ return (int)(timval1 - (time_t)*seconds);
+}
+
+void INTLOGT(char * message, long length);
+FILE * pbfp(long);
+
+#ifdef REAL_8
+void JOPNLLSM(
+ JPointer* ipdum,
+ double* platinc,
+ fortint* iktrunc,
+ fortint* kunit,
+ double* zbuild,
+ fortint* kret)
+#else
+void JOPNLLSM(
+ JPointer* ipdum,
+ float* platinc,
+ fortint* iktrunc,
+ fortint* kunit,
+ float* zbuild,
+ fortint* kret)
+#endif
+/*
+C
+C**** JOPNLLSM
+C
+C Purpose
+C _______
+C
+C This routine finds a file of legendre polynomials corresponding
+C to a given grid interval and truncation and maps the file to an
+C array and returns a file descriptor.
+C
+C Interface
+C _________
+C
+C CALL JOPNLLSM( IPDUM, PLATINC, KTRUNC, KUNIT, ZBUILD, KRET)
+C
+C Input parameters
+C ________________
+C
+C IPDUM - Dummy array for mapping legendre function file
+C PLATINC - Grid interval in degrees
+C KTRUNC - Spherical truncation
+C
+C Output parameters
+C _________________
+C
+C KUNIT - file descriptor from PBOPEN
+C NULL , open failed
+C ZBUILD - Grid interval of the lat/long grid
+C underlying the legendre function file
+C KRET - Return status, 0 = OK.
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C Method
+C ______
+C
+C Builds a file name from the truncation and grid interval and
+C tries to open a file of that name.
+C
+C If the file is already open (from a previous call) the
+C previous unit number is returned.
+C If a different file is already open (from a previous call), the
+C existing file is closed first.
+C
+C If no file can be located, a file is created.
+C
+C Externals
+C _________
+C
+C GETENV - Get value of an environment variable
+C JMAKLL - Makes a file of legendre coefficients
+C PBOPEN - Opens a file
+C PBCLOSE - Closes a file
+C
+C Reference
+C _________
+C
+C NONE
+C
+C Comments
+C ________
+C
+C The filename for the legendre polynomials has the form:
+C cf_txxxx_raabbbb Txxxx aa.bbbb degrees
+C For example,
+C cf_t0213_r0050000 T213 0.5 degrees
+C cf_t0106_r0250000 T106 2.5 degrees
+C
+C On the C90, the file of polynomials may be cached in /owrk/marsint
+C
+C Otherwise the file is located in (or will be created in) the first
+C directory given by one of the following (in the order listed, if
+C they exist):
+C environment variable PPDIR
+C or
+C the current working directory.
+C
+C Author
+C ______
+C
+C J.D.Chambers *ECMWF* Feb 1996
+C
+C Modifications
+C _____________
+C
+C J.D.Chambers *ECMWF* Mar 1996
+C Standardise the search order for the environment variables.
+C
+C J.D.Chambers *ECMWF* Sept 1999
+C Use PB routines for OPEN and CLOSE (use index into table of FILE *)
+C
+*/
+{
+ int time1, time2;
+#if (defined hpR64) || (defined hpiaR64)
+long l1, l2;
+#else
+fortint l1, l2;
+#endif
+char filedum[128], filename[128];
+#ifdef REAL_8
+char ypfn[18] = "CF_Txxxx_Raabbbb";
+#else
+char ypfn[18] = "cf_txxxx_raabbbb";
+#endif
+static char yold[18] = "xxxxxxxxxxxxxxxx";
+static char yarray[12][18];
+static int ncnt = 0;
+static int nunit = -1;
+int i;
+OFF_T len, len_pleg, knum;
+static OFF_T oldlen;
+int kbuild ;
+char * fn;
+static fortint fpindex;
+static FILE * fp;
+OFF_T off = 0;
+static void * result = 0;
+static void * oldresult = 0;
+static void * resultarray[12];
+static int unitarray[12];
+#ifdef REAL_8
+double plat = 0.0;
+double * pleg;
+#else
+float plat = 0.0;
+float * pleg;
+#endif
+int exist = 0;
+char message[] = "JOPNLLSM: creating coefficients file";
+int status;
+pid_t process_id;
+int ktrunc = (int) (*iktrunc);
+
+/*
+// Setup the filename: cf_txxxx_raabbbbb
+*/
+#ifdef REAL_8
+ len_pleg = sizeof(double) * (ktrunc+1) * (ktrunc+4) /2;
+#else
+ len_pleg = sizeof(float) * (ktrunc+1) * (ktrunc+4) /2;
+#endif
+
+ *zbuild = *platinc;
+
+ knum = (OFF_T) ( (90.0/(*zbuild)) + 0.5) + 1;
+#ifdef REAL_8
+ len = (OFF_T)(knum * sizeof(double) * (ktrunc+1) * (ktrunc+4)/2);
+#else
+ len = (OFF_T)(knum * sizeof(float) * (ktrunc+1) * (ktrunc+4)/2);
+#endif
+
+/*
+printf("################# len: %lld, knum: %lld, sizeof(double): %d, ktrunc+1: %d, ktrunc+4: %d\n",len,knum,sizeof(double),(ktrunc+1),(ktrunc+4));
+*/
+
+/*
+// Setup the file name
+*/
+ sprintf( ypfn+4, "%04d", ktrunc);
+ kbuild = (int) (((*zbuild)*100000.0) + 0.5);
+#ifdef REAL_8
+ sprintf( ypfn+8, "_R%07d", kbuild);
+#else
+ sprintf( ypfn+8, "_r%07d", kbuild);
+#endif
+
+/*
+// If file already open, return the existing unit number
+*/
+ for(i=0;i<ncnt;i++) {
+ strncpy(yold,yarray[i],17);
+ strcat(yold,"\0");
+ if( !strcmp( ypfn, yold ) ) {
+ *kunit = (fortint) unitarray[i];
+ *ipdum = (JPointer) resultarray[i];
+ return;
+ }
+ }
+
+/*
+// Otherwise, unmap and close the existing file
+*/
+ result = 0;
+/*
+ if( nunit != -1 ) {
+ if( munmap((caddr_t) oldresult, oldlen) ) {
+ perror("JOPNLLSM: munmap error");
+ *kret = (fortint) 999;
+ return;
+ }
+ PBCLOSE(&fpindex,kret);
+ if( *kret != 0 ) {
+ perror("JOPNLLSM: PBCLOSE error");
+ *kret = (fortint) 999;
+ return;
+ }
+
+ }
+*/
+
+/*
+ If more than 12 files are memory mapped , error
+*/
+ if(ncnt==13) {
+ fprintf(stderr,"JOPNLLSM: attempt to memory map more than 12 files\n");
+ *kret = (fortint) 999;
+ return;
+ }
+
+/*
+// See if the file has already been created.
+*/
+ fn = getenv("PPDIR");
+ if( (fn != NULL) && (strlen(fn) != 0) ) {
+ strcpy( filename, fn );
+ strcat( filename, "/");
+ strcat( filename, ypfn);
+ l1 = strlen(filename);
+ l2 = 1;
+ PBOPEN(&fpindex,filename,"r",kret,l1,l2);
+ if( *kret == 0 ) {
+ fp = pbfp((long)fpindex);
+ if( fp != NULL ) exist = 1;
+ }
+ }
+
+ if( !exist ) {
+ strcpy( filename, "./" );
+ strcat( filename, ypfn);
+ l1 = strlen(filename);
+ l2 = 1;
+ PBOPEN(&fpindex,filename,"r",kret,l1,l2);
+ if( *kret == 0 ) {
+ fp = pbfp((long)fpindex);
+ if( fp != NULL ) exist = 1;
+ }
+ }
+
+/*
+// If file doesn't exist, find a suitable directory for it.
+*/
+ if( !exist ) {
+ fn = getenv( "PPDIR" );
+ if( (fn != NULL) && (strlen(fn) != 0) ) {
+ strcpy( filename, fn );
+ strcat( filename, "/");
+ }
+ else
+ strcpy( filename, "./" );
+
+ strcat( filename, ypfn);
+
+/*
+// Open it with write access, change mode to 'read only', and make it
+*/
+ INTLOGT(message,strlen(message));
+ INTLOGT(filename,strlen(filename));
+
+ process_id = getpid();
+
+ strcpy(filedum, filename);
+ sprintf(&filedum[strlen(filename)],"_%07d",process_id);
+
+ l1 = strlen(filedum);
+ l2 = 1;
+ PBOPEN(&fpindex,filedum,"w",kret,l1,l2);
+ if( (*kret) || ( fp = pbfp((long)fpindex) ) == NULL ) {
+ strcpy( filename, "./" );
+ strcat( filename, ypfn);
+ strcpy(filedum, filename);
+ sprintf(&filedum[strlen(filename)],"_%07d",process_id);
+ l1 = strlen(filedum);
+ l2 = 1;
+ PBOPEN(&fpindex,filedum,"w",kret,l1,l2);
+ if( *kret ) {
+ perror("JOPNLLSM: PBOPEN error");
+ return;
+ }
+ fp = pbfp((long)fpindex);
+ if( fp == NULL ) {
+ perror("JOPNLLSM: file pointer after PBOPEN is NULL");
+ *kret = (fortint) 998;
+ return;
+ }
+ }
+
+ status = chmod( filedum, (mode_t) 0444 );
+ if( status ) {
+ perror("JOPNLLSM: chmod error");
+ *kret = (fortint) 997;
+ return;
+ }
+
+/*
+// Setup scratch legendre file.
+*/
+#ifdef REAL_8
+ pleg = (double *) malloc(len_pleg*2);
+#else
+ pleg = (float *) malloc(len_pleg*2);
+#endif
+
+ if( pleg == NULL ) {
+ perror("JOPNLLSM: malloc error.");
+ *kret = (fortint) 996;
+ return;
+ }
+
+ JMAKLL( &fpindex, iktrunc, zbuild, &plat, pleg, kret);
+ if( *kret != 0 ) {
+ free(pleg);
+ return;
+ }
+
+/*
+// Close it, rename it, and open it again with read access
+*/
+ free(pleg);
+ PBCLOSE(&fpindex,kret);
+ status = rename(filedum, filename);
+ if( status ) {
+ perror("JOPNLLSM: rename error");
+ *kret = (fortint) 995;
+ return;
+ }
+
+ l1 = strlen(filename);
+ l2 = 1;
+ PBOPEN(&fpindex,filename,"r",kret,l1,l2);
+ if( *kret ) {
+ perror("JOPNLLSM: PBOPEN error");
+ return;
+ }
+ fp = pbfp((long)fpindex);
+ if( fp == NULL ) {
+ perror("JOPNLLSM: file pointer after PBOPEN is NULL");
+ *kret = (fortint) 994;
+ return;
+ }
+ }
+
+/*
+// Check the file size
+*/
+#ifdef FOPEN64
+
+#ifdef linux
+/* On Linux -m32, lseek64 doesn't work. Use fstat64 instead */
+
+{
+
+ struct stat st;
+
+ if(fstat64(fileno(fp),&st) == -1)
+ {
+ fprintf(stderr,"JOPNLLSM: coefficients file fstat failed\n");
+ *kret = (fortint) 993;
+ return;
+ }
+ else
+ {
+ if(len != st.st_size)
+ {
+ fprintf(stderr,"JOPNLLSM: coefficients file size should be %lld bytes, it is %lld\n", len,st.st_size);
+ *kret = (fortint) 993;
+ return;
+ }
+ }
+}
+#else
+ fseeko64(fp, 0, 2);
+ if( len != ftello64(fp) ) {
+ long long ftello = ftello64(fp);
+ fprintf(stderr,"JOPNLLSM: coefficients file size should be %lld bytes, it is %lld\n", len,ftello);
+ *kret = (fortint) 993;
+ return;
+ }
+#endif
+
+#else
+ fseek(fp, 0, 2);
+ if( len != ftell(fp) ) {
+ long ftello = ftell(fp);
+
+ fprintf(stderr,"JOPNLLSM: coefficients file size should be %ld bytes, it is %ld\n", len,ftello);
+ *kret = (fortint) 993;
+ return;
+ }
+#endif
+
+#ifdef FOPEN64
+ fseeko64(fp, 0, 0);
+#else
+ fseek(fp, 0, 0);
+#endif
+
+/*
+// Map the file
+*/
+ nunit = fileno(fp);
+ if( nunit >= 0 ) {
+ char *p = getenv("PPMAPADDR");
+ caddr_t addr = (caddr_t) (p?atol(p):0);
+
+ /* time1 = 0; */
+ /* time2 = iitimer(&time1); */
+
+#ifdef FOPEN64
+ result = (void *) mmap64(addr,(size_t) len, (PROT_READ),
+ MAP_SHARED,(int) nunit, (OFF_T)off);
+#else
+ result = (void *) mmap(addr,(size_t) len, (PROT_READ),
+ MAP_SHARED,(int) nunit,(OFF_T) off);
+#endif
+
+ if( (caddr_t) result == (caddr_t) -1 ) {
+ perror("JOPNLLSM: mmap64 error");
+ *kret = (fortint) 992;
+ return;
+ }
+ oldresult = result;
+ oldlen = len;
+ }
+
+ *ipdum = (JPointer) result;
+ *kunit = (fortint) nunit;
+ strcpy( yarray[ncnt], ypfn);
+ resultarray[ncnt] = result;
+ unitarray[ncnt] = nunit;
+ ncnt+=1;
+
+ /* time2 = iitimer(&time1); */
+ /* printf("MMAP-timer %d\n",iiii_time); */
+
+ return;
+}
diff --git a/interpolation/jparam2.h b/interpolation/jparam2.h
new file mode 100755
index 0000000..19f4cb8
--- /dev/null
+++ b/interpolation/jparam2.h
@@ -0,0 +1,17 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C Handling of spectral -> grid interpolation coefficients memory
+C
+ LOGICAL LFREECF
+ INTEGER NFREECF, NISIZE6, NISIZE7
+ CHARACTER*15 YOLDGG
+ CHARACTER*19 YOLDLL
+ COMMON /JDCSPGP/ NFREECF,NISIZE6,NISIZE7,LFREECF,YOLDGG,YOLDLL
diff --git a/interpolation/jparams.h b/interpolation/jparams.h
new file mode 100755
index 0000000..271ed29
--- /dev/null
+++ b/interpolation/jparams.h
@@ -0,0 +1,44 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C Parameters
+C
+ INTEGER JP32, JPLONO, J2NFFT, JPFFT, JPLOOK, JPMAX, JPMAXITER
+ INTEGER JPMXTRY, JPTRNC, JPK, JPTRP1
+ PARAMETER ( JP32 = 32 )
+C
+C The following value for JPLONO (2560) will handle regular grids
+C from N1 to N720 derived from spectral truncations from T1 to
+C T639.
+C
+Cjdc PARAMETER ( JPLONO = 2560 , J2NFFT = 2 + JPLONO, JPFFT = 12000)
+c PARAMETER ( JPLONO = 6000 , J2NFFT = 2 + JPLONO, JPFFT = 12000)
+ PARAMETER ( JPLONO = 8200 , J2NFFT = 2 + JPLONO, JPFFT = 12000)
+ PARAMETER ( JPLOOK = 50)
+ PARAMETER ( JPMAX = 2048 )
+ PARAMETER ( JPMAXITER = 10)
+ PARAMETER ( JPMXTRY = 3 )
+ PARAMETER ( JPTRNC = 2047, JPK = (JPTRNC + 1)*(JPTRNC + 4) )
+ PARAMETER ( JPTRP1 = (JPTRNC + 1) )
+C
+ REAL PPEPSA, PPQUART, PPHALF, PPTWO, PP90
+ PARAMETER ( PPEPSA = 1.0E-6)
+ PARAMETER ( PPQUART = 0.25E0)
+ PARAMETER ( PPHALF = 0.5E0)
+ PARAMETER ( PPTWO = 2.0E0)
+ PARAMETER ( PP90 = 90.0E0)
+C
+ REAL PPI
+ PARAMETER ( PPI = 3.14159265358979 )
+C
+C Debug parameters
+C
+ INTEGER NDBG, NDBGLP
+ COMMON /JDCNDBG/ NDBG, NDBGLP
diff --git a/interpolation/jreadgg.F b/interpolation/jreadgg.F
new file mode 100755
index 0000000..8abe84d
--- /dev/null
+++ b/interpolation/jreadgg.F
@@ -0,0 +1,175 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JREADGG( KUNIT, KTRUNC, KROW, PLEG, KRET)
+C
+C---->
+C**** JREADGG
+C
+C PURPOSE
+C _______
+C
+C This routine reads legendre functions for one latitude.
+C
+C INTERFACE
+C _________
+C
+C CALL JREADGG( KUNIT, KTRUNC, KROW, PLEG, KRET)
+C
+C Input parameters
+C ________________
+C
+C KUNIT - Unit number for open file of legendre functions.
+C KTRUNC - Truncation.
+C KROW - Latitude row number in the file
+C
+C Output parameters
+C ________________
+C
+C PLEG - Array of legendre functions for the latitude.
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Calculate offset of the legendre functions for the latitude row
+C in the file, skip to the row and read the functions.
+C
+C Retries the read upto 3 times if necessary
+C
+C Externals
+C _________
+C
+C PBSEEK - Position the coefficients file
+C PBREAD - Read the coefficients file
+C INTLOG - Output log message
+C
+C Reference
+C _________
+C
+C None.
+C
+C Comments
+C ________
+C
+C Only positive row numbers are allowed.
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Jan 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+C
+C Subroutine arguments
+C
+ INTEGER KUNIT, KTRUNC, KROW, KRET
+ REAL PLEG
+ DIMENSION PLEG(*)
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 31000 )
+C
+C Local variables
+C
+ INTEGER NTRIES
+ INTEGER NRET, NSIZE
+ INTEGER*8 FRET, FSIZE
+ INTEGER*8 NEWPOS, OLDPOS
+
+ DATA OLDPOS/-1/
+ SAVE NEWPOS, OLDPOS
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+100 CONTINUE
+ IF ( KROW .LT. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'JREADGG: negative row number given',KROW)
+ KRET = JPROUTINE + 1
+ GOTO 990
+ ENDIF
+C
+C Calculate the byte offset into the file where the legendre
+C functions for the latitude should be.
+#ifdef REAL_8
+ NSIZE = 8 * (KTRUNC+1)*(KTRUNC+4)/2
+ FSIZE = 8 * (KTRUNC+1)*(KTRUNC+4)/2
+#else
+ NSIZE = 4 * (KTRUNC+1)*(KTRUNC+4)/2
+ FSIZE = 4 * (KTRUNC+1)*(KTRUNC+4)/2
+#endif
+cs NEWPOS = (KROW - 1) * NSIZE
+ NEWPOS = (KROW - 1) * FSIZE
+C
+C _______________________________________________________
+C
+C* Section 2. Processing.
+C _______________________________________________________
+C
+C Position file unless the previous read left it in the correct
+C position already
+C
+ NTRIES = 0
+ 210 CONTINUE
+ NTRIES = NTRIES + 1
+ IF ( NEWPOS .NE. OLDPOS ) THEN
+ CALL PBSEEK64( KUNIT, NEWPOS, 0, FRET)
+ IF ( FRET .NE. NEWPOS ) THEN
+ CALL INTLOG(JP_ERROR,'JREADGG: PBSEEK64 error.',FRET)
+ KRET = JPROUTINE + 2
+ GOTO 990
+ ENDIF
+ ENDIF
+C
+C Read the legendre coefficients
+ CALL PBREAD( KUNIT, PLEG, NSIZE, NRET)
+ IF ( NRET .NE. NSIZE ) THEN
+ IF ( NTRIES .EQ. JPMXTRY ) THEN
+ CALL INTLOG(JP_ERROR,'JREADGG: PBREAD error.',NRET)
+ KRET = JPROUTINE + 3
+ GOTO 990
+ ELSE
+ GOTO 210
+ ENDIF
+ ENDIF
+C
+C Record the current file byte position
+ OLDPOS = NEWPOS + NSIZE
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+ KRET = 0
+C
+ 990 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/jreadll.F b/interpolation/jreadll.F
new file mode 100755
index 0000000..bef6b2d
--- /dev/null
+++ b/interpolation/jreadll.F
@@ -0,0 +1,179 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JREADLL( KUNIT, KTRUNC, PBUILD, PLAT, PLEG, KRET)
+C
+C---->
+C**** JREADLL
+C
+C PURPOSE
+C _______
+C
+C This routine reads legendre functions for one latitude.
+C
+C INTERFACE
+C _________
+C
+C CALL JREADLL( KUNIT, KTRUNC, PBUILD, PLAT, PLEG, KRET)
+C
+C Input parameters
+C ________________
+C
+C KUNIT - Unit number for open file of legendre functions.
+C KTRUNC - Truncation.
+C PBUILD - Grid interval used to build legendre coefficients file
+C PLAT - Latitude in degrees.
+C
+C Output parameters
+C ________________
+C
+C PLEG - Array of legendre functions for the latitude.
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Calculate offset of the legendre functions for the latitude row
+C in the file, skip to the row and read the functions.
+C
+C Retries the read upto 3 times if necessary
+C
+C Externals
+C _________
+C
+C PBSEEK - Position the coefficients file
+C PBREAD - Read the coefficients file
+C INTLOG - Output log message
+C INTLOGR - Output log message (with real value)
+C
+C Reference
+C _________
+C
+C None.
+C
+C Comments
+C ________
+C
+C Only positive latitude values are allowed.
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Nov 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+C
+C Subroutine arguments
+C
+ INTEGER KUNIT, KTRUNC, KRET
+ REAL PBUILD, PLEG, PLAT
+ DIMENSION PLEG(*)
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 31100 )
+C
+C Local variables
+C
+ INTEGER NTRIES
+ INTEGER NSIZE, NRET
+ INTEGER*8 FSIZE, FRET
+ INTEGER*8 NEWPOS, OLDPOS
+
+ REAL ZLAT
+ DATA OLDPOS/-1/
+ SAVE NEWPOS, OLDPOS
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+100 CONTINUE
+ IF ( PLAT .LT. 0.0 ) THEN
+ ZLAT = 0.0
+ ELSE
+ ZLAT = PLAT
+ ENDIF
+C
+C Calculate the byte offset into the file where the legendre
+C functions for the latitude should be.
+#ifdef REAL_8
+ NSIZE = 8 * (KTRUNC+1)*(KTRUNC+4)/2
+ FSIZE = 8 * (KTRUNC+1)*(KTRUNC+4)/2
+#else
+ NSIZE = 4 * (KTRUNC+1)*(KTRUNC+4)/2
+ FSIZE = 4 * (KTRUNC+1)*(KTRUNC+4)/2
+#endif
+cs NEWPOS = NINT( (90.0 - ZLAT)/PBUILD ) * NSIZE
+ NEWPOS = NINT( (90.0 - ZLAT)/PBUILD ) * FSIZE
+C
+C _______________________________________________________
+C
+C* Section 2. Processing.
+C _______________________________________________________
+C
+C Position file unless the previous read left it in the correct
+C position already
+C
+ NTRIES = 0
+ 210 CONTINUE
+ NTRIES = NTRIES + 1
+ IF ( NEWPOS .NE. OLDPOS ) THEN
+ CALL PBSEEK64( KUNIT, NEWPOS, 0, FRET)
+ IF ( FRET .NE. NEWPOS ) THEN
+ CALL INTLOG(JP_ERROR,'JREADLL: PBSEEK64 error.',FRET)
+ KRET = JPROUTINE + 2
+ GOTO 990
+ ENDIF
+ ENDIF
+C
+C Read the legendre coefficients
+ CALL PBREAD( KUNIT, PLEG, NSIZE, NRET)
+ IF ( NRET .NE. NSIZE ) THEN
+ IF ( NTRIES .EQ. JPMXTRY ) THEN
+ CALL INTLOG(JP_ERROR,'JREADLL: PBREAD error.',NRET)
+ KRET = JPROUTINE + 3
+ GOTO 990
+ ELSE
+ GOTO 210
+ ENDIF
+ ENDIF
+C
+C Record the current file byte position
+ OLDPOS = NEWPOS + NSIZE
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+ KRET = 0
+C
+ 990 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/jsgggp.F b/interpolation/jsgggp.F
new file mode 100755
index 0000000..bd0ac21
--- /dev/null
+++ b/interpolation/jsgggp.F
@@ -0,0 +1,426 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JSGGGP( PSHUP, KTRUNC, PNORTH, PSOUTH, PWEST, PEAST,
+ X KNUM, HTYPE, KPTS, POUTF, LUV, KRET)
+C
+C---->
+C**** JSGGGP
+C
+C PURPOSE
+C _______
+C
+C This routine converts strecthed spectral fields to a gaussian
+C grid field.
+C
+C INTERFACE
+C _________
+C
+C CALL JSGGGP( PSHUP, KTRUNC, PNORTH, PSOUTH, PWEST, PEAST,
+C X KNUM, HTYPE, KPTS, POUTF, LUV, KRET)
+C
+C Input parameters
+C ________________
+C
+C PSHUP - Spherical harmonics field, unpacked
+C KTRUNC - Truncation number of spherical harmonics field
+C PNORTH - Northernmost latitude for output field (degrees)
+C PSOUTH - Southernmost latitude for output field (degrees)
+C PWEST - Westernmost longitude for output field (degrees)
+C PEAST - Easternmost longitude for output field (degrees)
+C KNUM - Gaussian grid number
+C HTYPE - Gaussian grid type
+C = 'R' for reduced,
+C = 'F' for full
+C = 'U' for user-defined reduced gaussian grid
+C KPTS - Array specifying number of points at each line of
+C latitude if HTYPE = 'U'.
+C (Must be big enough for both hemispheres, but only
+C needs to give Northern hemisphere values from pole
+C to latitude nearest the Equator.)
+C LUV - Code indicating whether or not the field is a wind
+C component field;
+C = 1 if U or V field.
+C
+C Output parameters
+C ________________
+C
+C KPTS - Array specifying number of points at each line of
+C latitude; user defined values if HTYPE = 'U'.
+C (Must be big enough for both hemispheres)
+C POUTF - Output grid point field
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG
+C
+C Method
+C ______
+C
+C Converts stretched 'latitude' to real latitude and then
+C interpolates along the real latitude line.
+C
+C
+C Externals
+C _________
+C
+C JGETGG - Pick up the definition of the gaussian grid.
+C JJSET99 - Sets up FFT
+C JNORSGG - Determines which latitude row in a gaussian grid is
+C north or south of a given latitude
+C JSYMGG - Generate symmetric grid from spherical harmonics
+C JWSCAL - Apply latitude correction to wind component field
+C JMVUGG - Moves grid point data to output array
+C JMKOFGG - Builds offsets into storage array
+C JDEBUG - Checks environment variable to switch on/off debug
+C INTLOG - Logs output messages
+C INTLOGR - Logs output messages
+C
+C
+C Reference
+C _________
+C
+C None
+C
+C
+C Comments
+C ________
+C
+C None
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF July 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+#include "current.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+C
+C Subroutine arguments
+C
+ COMPLEX PSHUP
+ DIMENSION PSHUP(*)
+ INTEGER KTRUNC, KNUM, KPTS, KRET
+ DIMENSION KPTS(*)
+ CHARACTER*1 HTYPE
+ REAL PNORTH, PSOUTH, PWEST, PEAST
+ REAL POUTF
+ DIMENSION POUTF(*)
+ INTEGER LUV
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 31600 )
+ REAL DEG2RAD
+ PARAMETER ( DEG2RAD = PPI/180.0 )
+C
+C Local variables
+C
+ INTEGER ILON, ILONOLD, ITOUP1, IJPWR, NUMPTS
+ DIMENSION IJPWR(JPMAX)
+ INTEGER ILUNIT
+ INTEGER NXTROW
+ REAL RINTVL, ZCOSI, ZLAT
+ REAL ZFACTOR(JPMAX)
+C
+ INTEGER IMFAX
+ REAL ATRIGS
+ DIMENSION IMFAX(10),ATRIGS(JPLONO*2)
+#ifdef POINTER_64
+ INTEGER*8 IALEG, IZFA
+#endif
+#ifdef CRAY
+ REAL ALEG
+ DIMENSION ALEG(JPK)
+ REAL ZFA
+ DIMENSION ZFA(JPLONO+2, 64)
+#else
+ REAL ALEG
+ DIMENSION ALEG(1)
+ POINTER ( IALEG, ALEG )
+ REAL ZFA
+ DIMENSION ZFA(2)
+ POINTER ( IZFA, ZFA )
+#endif
+ INTEGER ISIZE
+ DATA ISIZE/0/
+ SAVE ISIZE, IZFA
+C
+ INTEGER J108, NNORTH, NSOUTH, NFLAG
+ INTEGER NOFSET, LOOP
+ DIMENSION NOFSET(JPMAX)
+ INTEGER INORTH, ISOUTH, IMAGE
+ REAL ALAT
+ DIMENSION ALAT(JPMAX)
+C
+ SAVE ILUNIT
+C
+ LOGICAL LDEBUG, LFIRST
+ DATA LFIRST/.TRUE./
+ SAVE LDEBUG, LFIRST
+C
+ INTEGER JNORSGG
+ EXTERNAL JNORSGG
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ CALL JDEBUG( )
+ LDEBUG = NDBG.GT.0
+C
+#ifndef CRAY
+C
+C First time through, dynamically allocate memory for workspace
+C
+ IF( LFIRST ) THEN
+ LFIRST = .FALSE.
+ ISIZE = (JPLONO+2)*64
+ CALL JMEMHAN( 10, IZFA, ISIZE, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JSGGGP: memory allocation error.',IZFA)
+ KRET = JPROUTINE + 1
+ GOTO 990
+ ENDIF
+ ENDIF
+#endif
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'JSGGGP: Input parameters:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSGGGP: Spherical harmonic truncation = ', KTRUNC)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JSGGGP: Northern latitude for output = ', PNORTH)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JSGGGP: Southern latitude for output = ', PSOUTH)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JSGGGP: Western longitude for output = ', PWEST)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JSGGGP: Eastern longitude for output = ', PEAST)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSGGGP: Gaussian grid number = ', KNUM)
+C
+ IF( HTYPE.EQ.'R' .OR. HTYPE.EQ.'r' ) CALL INTLOG(JP_DEBUG,
+ X 'JSGGGP: Grid type is Reduced.',JPQUIET)
+ IF( HTYPE.EQ.'F' .OR. HTYPE.EQ.'f' ) CALL INTLOG(JP_DEBUG,
+ X 'JSGGGP: Grid type is Full.',JPQUIET)
+ IF( HTYPE.EQ.'U' .OR. HTYPE.EQ.'u' ) CALL INTLOG(JP_DEBUG,
+ X 'JSGGGP: Grid type is User.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSGGGP: Field code( = 1 for U or V) = ', LUV)
+C
+ IF( (HTYPE.EQ.'u').OR.(HTYPE.EQ.'U') ) THEN
+ CALL INTLOG(JP_DEBUG,'JSGGGP: User-supplied values.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'JSGGGP: No. pts at each line:',JPQUIET)
+ DO NDBGLP = 1, 20
+ CALL INTLOG(JP_DEBUG,' ',KPTS( NDBGLP ))
+ ENDDO
+ ENDIF
+ ENDIF
+C
+C Pick up the file containing the definition of the gaussian grid.
+C
+ IF( (NOGAUSO.NE.KNUM).OR.(HOGAUST.NE.HTYPE) ) THEN
+ CALL JGETGG( KNUM, HTYPE, ALAT, KPTS, KRET)
+ IF( KRET.NE.0 ) GOTO 990
+ NOGAUSO = KNUM
+ HOGAUST = HTYPE
+ ELSE
+ DO LOOP = 1, KNUM*2
+ ALAT(LOOP) = ROGAUSS(LOOP)
+ KPTS(LOOP) = NOLPTS(LOOP)
+ ENDDO
+ ENDIF
+C
+C Calculate the true latitudes and the map factor.
+C
+ DO LOOP = 1, KNUM*2
+ CALL STRLAT(ALAT(LOOP), RISTRET, 0, ALAT(LOOP), ZFACTOR(LOOP))
+ ENDDO
+C
+C Coefficients are to generated 'on the fly'
+C
+ LON_FLY = .TRUE.
+ LFILEIO = .FALSE.
+ LMEMORY = .FALSE.
+ LSHARED = .FALSE.
+ LMAPPED = .FALSE.
+ ISIZE = (KTRUNC+1)*(KTRUNC+2)
+ CALL JMEMHAN( 14, IALEG, ISIZE, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JSGGGP: memory allocate error.',IALEG)
+ KRET = JPROUTINE + 2
+ GOTO 990
+ ENDIF
+C
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JSGGGP: Failed to open legendre function file',JPQUIET)
+ KRET = JPROUTINE + 3
+ GOTO 990
+ ENDIF
+C
+ NNORTH = JNORSGG( PNORTH, ALAT, KNUM, 1)
+ NSOUTH = JNORSGG( PSOUTH, ALAT, KNUM, 0)
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JSGGGP: Gaussian latitudes in requested area:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'JSGGGP: NORTH = ',NNORTH)
+ CALL INTLOG(JP_DEBUG,'JSGGGP: SOUTH = ',NSOUTH)
+ ENDIF
+C
+C
+C For calculation purposes, the number of longitude points for each
+C latitude row has to be greater than 2*(output truncation) to
+C ensure the fourier transform is exact (see Reference, page 10).
+C
+C The following loop calculates the power of 2 to be used as a
+C multipier for each row to ensure there are enough points.
+C Later, when filling the output array POUTF, the longitude points
+C have to be taken selectively to avoid the intermediate generated
+C points, picking up values only at the required longitudes.
+C
+ ITOUP1 = KTRUNC
+ DO 108 J108 = 1, KNUM
+ IMAGE = 2*KNUM - J108 + 1
+ ILON = KPTS(J108)
+ IJPWR(J108) = 1
+ 104 CONTINUE
+ IF(ILON .GT. 2*ITOUP1) GOTO 106
+ IJPWR(J108) = IJPWR(J108)*2
+ ILON = ILON*2
+ GOTO 104
+ 106 CONTINUE
+ IJPWR(IMAGE) = IJPWR(J108)
+ 108 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 2. Work out geometry of the request
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Latitude rows are generated from row INORTH to ISOUTH.
+C Selection is carried out for actual requested rows when the
+C calculated values are moved to the output array.
+C
+ INORTH = NNORTH
+ ISOUTH = NSOUTH
+C
+C Setup the storage offset for the given latitude range
+C
+ 220 CONTINUE
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,'JSGGGP: INORTH = ', INORTH)
+ CALL INTLOG(JP_DEBUG,'JSGGGP: ISOUTH = ', ISOUTH)
+ ENDIF
+ CALL JMKOFGG(HTYPE,NNORTH,NSOUTH,PWEST,PEAST,KNUM,KPTS,NOFSET)
+C
+C _______________________________________________________
+C
+C* Section 3. Process one row at a time.
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF( LDEBUG )
+ X CALL INTLOG(JP_DEBUG,'JSGGGP: Process latitude rows.',JPQUIET)
+C
+ ILONOLD = 0
+C
+ DO NXTROW = INORTH, ISOUTH
+C
+C Initialise FFT constants for the latitude
+C
+ ILON = KPTS(NXTROW) * IJPWR(NXTROW)
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JSGGGP: Initialise FFT consts for the group.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSGGGP: Latitude number = ', NXTROW)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSGGGP: No. of calculated long.pts = ', ILON)
+ ENDIF
+C
+ IF( ILON.NE.ILONOLD ) THEN
+ ILONOLD = ILON
+ CALL JJSET99( ATRIGS, IMFAX, ILON, KRET)
+ IF( KRET.NE.0 ) GOTO 990
+ ENDIF
+C
+C Calculate the points along the line of latitude
+C
+ CALL JSYMGG( PSHUP, KTRUNC, NXTROW, ILUNIT, 1, ILON,
+ X ALAT, ALEG, ATRIGS, IMFAX, ZFA, KRET)
+ IF( KRET.NE.0 ) GOTO 990
+C
+C If it is a wind component field, apply latitude correction
+C
+ IF( LUV.EQ.1 ) THEN
+ ZLAT = ALAT(NXTROW)
+ ZCOSI = ZFACTOR(NXTROW) / ABS( COS(ZLAT*DEG2RAD) )
+ CALL SSCAL( ILON, ZCOSI, ZFA(2), 1)
+ ENDIF
+C
+C Store away the generated latitudes
+C
+ IF( (HTYPE.EQ.'U').OR.(HTYPE.EQ.'R') ) THEN
+ NUMPTS = KPTS(NXTROW)
+ ELSE
+ RINTVL = (PEAST - PWEST)*FLOAT( KPTS(NXTROW) ) / 360.0
+ NUMPTS = NINT( RINTVL ) + 1
+ ENDIF
+C
+C Move latitude line to output array
+C
+ NFLAG = 1
+ CALL JMOVGG( ZFA, PWEST, KNUM, NXTROW, 1, NUMPTS,
+ X ILON, IJPWR(NXTROW), NOFSET, POUTF, NFLAG)
+C
+ ENDDO
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ KRET = 0
+C
+ 990 CONTINUE
+C
+ IF( LDEBUG ) CALL INTLOG(JP_DEBUG,'JSGGGP: Return code = ',KRET)
+C
+ RETURN
+ END
diff --git a/interpolation/jsh2sh.F b/interpolation/jsh2sh.F
new file mode 100755
index 0000000..16c47f1
--- /dev/null
+++ b/interpolation/jsh2sh.F
@@ -0,0 +1,201 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE SH2SH(UFLDIN, KRESIN, UFLDOU, KRESOU)
+ IMPLICIT NONE
+C
+C---->
+C**** SH2SH
+C
+C Purpose
+C _______
+C
+C This routine produces a field of spectral coefficients in UFLDOU
+C of truncation KRESOU from a field of spectral coeeficients in
+C UFLDIN of truncation KRESIN.
+C
+C
+C Interface
+C _________
+C
+C CALL SH2SH(UFLDIN, KRESIN, UFLDOU, KRESOU)
+C
+C
+C Input parameters
+C ________________
+C
+C UFLDIN - field of spectral coefficients
+C KRESIN - truncation of input field
+C KRESOU - truncation of output field
+C
+C
+C Output parameters
+C ________________
+C
+C UFLDOU - field of spectral coefficients
+C
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C
+C Method
+C ______
+C
+C If the input truncation is greater than (or equal to) the output
+C truncation, coefficients are transferred reduced for the output.
+C
+C If the input truncation is less than the output truncation,
+C all coefficients are transferred and padded with zeroes for the
+C output.
+C
+C
+C Externals
+C _________
+C
+C None
+C
+C
+C Reference
+C _________
+C
+C None
+C
+C
+C Comments
+C ________
+C
+C Arrays for the input and output fields must be defined large
+C enough for the coefficients implied by the truncations. Thus
+C the dimension for UFLDOU must be at least:
+C ( KRESOU + 1) * ( KRESOU + 2 ) /2
+C
+C
+C Author
+C ______
+C
+C J.D.Chambers ECMWF 8th Nov 1993
+C
+C
+C Modifications
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C Complex U, dummy argument
+C
+C _______________________________________________________
+C
+C Subroutine arguments
+ COMPLEX UFLDIN(*),UFLDOU(*)
+ INTEGER KRESIN, KRESOU
+C
+C Local variables
+ INTEGER ITINP1, ITOUP1, ILIM, IMLIM, IMN, IMP, IADD
+ INTEGER JM, JN
+C
+C _______________________________________________________
+C
+C
+C* Section 1. Initialization
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+C Initialize loop control variables
+C
+ ITINP1 = KRESIN + 1
+ ITOUP1 = KRESOU + 1
+ ILIM = ITOUP1
+ IMLIM = ITOUP1
+ IMN = 1
+ IMP = 1
+C
+C _______________________________________________________
+C
+C
+C* Section 2. Computation.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Check if desired output truncation greater than input ...
+C
+ IADD = KRESIN - KRESOU
+ IF ( IADD .GE. 0 ) THEN
+C
+C ... input truncation not less than desired output ...
+C ... move truncated lines of coefficients
+ DO 230 JM = 1, IMLIM
+ DO 220 JN = JM, ILIM
+ UFLDOU(IMP) = UFLDIN(IMN)
+ IMP = IMP + 1
+ IMN = IMN + 1
+220 CONTINUE
+C Skip coefficients being truncated
+ IMN = IMN + IADD
+230 CONTINUE
+C
+C ... input truncation is less than desired output ...
+C ... pad each output line of coefficients with zeroes
+ ELSE
+ DO 250 JM = 1, IMLIM
+ DO 240 JN = JM, ILIM
+ IF ( JN .GT. ITINP1 .OR. JM .GT. ITINP1) THEN
+C At end of input coefficients in
+C current row, then set values to
+C zero in output
+ UFLDOU(IMP) = 0.0
+ ELSE
+ UFLDOU(IMP) = UFLDIN(IMN)
+ IMN = IMN + 1
+ ENDIF
+ IMP = IMP + 1
+240 CONTINUE
+250 CONTINUE
+ ENDIF
+C
+C _______________________________________________________
+C
+C
+C* Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/jsllgp.F b/interpolation/jsllgp.F
new file mode 100755
index 0000000..cd28fbb
--- /dev/null
+++ b/interpolation/jsllgp.F
@@ -0,0 +1,310 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JSLLGP( PSHUP, KTRUNC, PNORTH, PSOUTH, PWEST, PEAST,
+ X PLATINC, PLONINC, POUTF, KRET)
+C
+C---->
+C**** JSLLGP
+C
+C PURPOSE
+C _______
+C
+C This routine converts stretched spectral input fields to
+C standard lat/long grid fields.
+C
+C INTERFACE
+C _________
+C
+C CALL JSLLGP( PSHUP, KTRUNC, PNORTH, PSOUTH, PWEST, PEAST,
+C X PLATINC, PLONINC, POUTF, KRET)
+C
+C Input parameters
+C ________________
+C
+C PSHUP - Spherical harmonics field, unpacked
+C KTRUNC - Truncation number of spherical harmonics field
+C PNORTH - Northernmost latitude for output field (degrees)
+C PSOUTH - Southernmost latitude for output field (degrees)
+C PWEST - Westernmost longitude for output field (degrees)
+C PEAST - Easternmost longitude for output field (degrees)
+C PLATINC - Grid interval between latitudes in degrees
+C PLONINC - Grid interval between longitudes in degrees
+C INTLOG - Output log message
+C INTLOGR - Output log message (with real value)
+C
+C Output parameters
+C ________________
+C
+C POUTF - Output grid point field
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG
+C
+C Method
+C ______
+C
+C Generates one latitude at a time.
+C
+C Externals
+C _________
+C
+C JJSET99 - Sets up FFT
+C JSTRLL - Generate latitude line from spherical harmonics
+C JSTRWLL - Generate latitude line from spherical harmonics (wind)
+C JDEBUG - Checks environment variable to switch on/off debug
+C INTLOG - Logs output messages
+C INTLOGR - Logs output messages
+C
+C
+C Reference
+C _________
+C
+C E.C.M.W.F. Research Department technical memorandum no. 56
+C "The forecast and analysis post-processing package"
+C May 1982. J.Haseler.
+C
+C
+C Comments
+C ________
+C
+C None
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF July 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+#include "nifld.common"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 30000 )
+C
+C Subroutine arguments
+C
+ COMPLEX PSHUP
+ DIMENSION PSHUP(*)
+ INTEGER KTRUNC
+ REAL PNORTH, PSOUTH, PWEST, PEAST, PLATINC, PLONINC
+ REAL POUTF
+ DIMENSION POUTF(*)
+ INTEGER KRET
+C
+C Local variables
+C
+ REAL PSTART, PNORMX, PDIFF
+ REAL DEG2RAD, ZBUILD
+ INTEGER ILON, IOLON, ITOUP1, IJPWR, NEXT, NROWS, NUMLON
+ INTEGER IOFFN, LONGIT, N360, NSTART, INEXT, LOOPCL
+C
+ INTEGER IMFAX
+ REAL ATRIGS
+ DIMENSION IMFAX(10),ATRIGS(JPLONO*2)
+#ifdef POINTER_64
+ INTEGER*8 IALEG, IZFA
+#endif
+#ifdef CRAY
+ REAL ALEG
+ DIMENSION ALEG(JPK)
+ REAL ZFA
+ DIMENSION ZFA(JPLONO+2)
+#else
+ REAL ALEG
+ DIMENSION ALEG(1)
+ POINTER ( IALEG, ALEG )
+ REAL ZFA
+ DIMENSION ZFA(1)
+ POINTER ( IZFA, ZFA )
+#endif
+C
+ INTEGER ISIZE, ISIZE2
+ DATA ISIZE/0/, ISIZE2/0/
+ SAVE ISIZE, ISIZE2, IZFA
+C
+ SAVE IMFAX, ATRIGS, IALEG
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ CALL JDEBUG( )
+C
+C First time through, dynamically allocate memory for workspace
+C
+ IF( ISIZE.EQ.0 ) THEN
+ ISIZE = (JPLONO+2) * 2
+ CALL JMEMHAN( 10, IZFA, ISIZE, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JSLLGP: memory allocation error.',IZFA)
+ KRET = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+ IF( NDBG.GT.0 ) THEN
+ CALL INTLOG(JP_DEBUG,'JSLLGP: Input parameters:', JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSLLGP: Spherical harmonic coeffs(first 20):', JPQUIET)
+ DO 101 NDBGLP = 1, 20
+ CALL INTLOGR(JP_DEBUG,' ', PSHUP( NDBGLP ))
+ 101 CONTINUE
+ CALL INTLOG(JP_DEBUG,
+ X 'JSLLGP: Spherical harmonic truncation = ', KTRUNC)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JSLLGP: Northern latitude for output = ', PNORTH)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JSLLGP: Southern latitude for output = ', PSOUTH)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JSLLGP: Western longitude for output = ', PWEST)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JSLLGP: Eastern longitude for output = ', PEAST)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JSLLGP: Latitude grid interval (deg) = ', PLATINC)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JSLLGP: Longitude grid interval (deg) = ', PLONINC)
+ ENDIF
+C
+C Coefficients are to generated 'on the fly',
+C
+ ISIZE2 = (KTRUNC+1)*(KTRUNC+2)
+ CALL JMEMHAN( 14, IALEG, ISIZE2, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JSLLGP: memory allocate error.',IALEG)
+ KRET = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ DEG2RAD = PPI / 180.0
+ IOLON = NINT( 360.0 / PLATINC )
+ ILON = NINT( 360.0 / PLONINC )
+ ITOUP1 = KTRUNC
+C
+C For calculation purposes, ILON, the number of longitude points,
+C has to be greater than 2*(output truncation) to ensure that the
+C fourier transform is exact (see Reference, page 10).
+C The following loop increases ILON*IJPWR until ILON=>2*ITOUP1.
+C Later, when filling the output array POUTF, the longitude points
+C have to be taken selectively to avoid the intermediate generated
+C points, picking up values only at the required longitudes.
+C
+ IJPWR = 1
+ 110 CONTINUE
+ IF( ILON.GT.2*ITOUP1 ) GOTO 120
+ IJPWR = IJPWR*2
+ ILON = ILON*2
+ GOTO 110
+ 120 CONTINUE
+C
+C Initialise FFT constants
+C
+ IF( NDBG.GT.0 ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JSLLGP: Initialise FFT constants with ', ILON)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSLLGP: longitude points.', JPQUIET)
+ ENDIF
+C
+ CALL JJSET99( ATRIGS, IMFAX, ILON, KRET)
+ IF( KRET.NE.0 ) GOTO 900
+C
+C _______________________________________________________
+C
+C* Section 2. Work out geometry of the request
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ PNORMX = PNORTH
+ PDIFF = PNORTH - PSOUTH
+ NROWS = NINT( PDIFF/PLATINC ) + 1
+ IF( ((NROWS-1)*PLATINC).GT.PDIFF ) NROWS = NROWS - 1
+C
+ NUMLON = NINT( (PEAST - PWEST)/PLONINC ) + 1
+ ZBUILD = PLATINC
+C
+ IF( NDBG.GT.0 ) THEN
+ CALL INTLOG(JP_DEBUG,'JSLLGP: Number of longitudes = ', NUMLON)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JSLLGP: North latitude used for calc = ', PNORMX)
+ CALL INTLOG(JP_DEBUG,'JSLLGP: No.lats used in calc = ', NROWS)
+ ENDIF
+C _______________________________________________________
+C
+C* Section 4. Process one row at a time.
+C _______________________________________________________
+C
+ 400 CONTINUE
+C
+ DO NEXT = 1, NROWS
+ PSTART = PNORMX - REAL(NEXT-1)*PLATINC
+C
+ IF( NDBG.GT.0 )
+ X CALL INTLOGR(JP_DEBUG, 'JSLLGP: Next latitude = ', PSTART)
+C
+C Generate the next row
+C
+ IF( LWIND ) THEN
+ CALL JSTRWLL(PSHUP, KTRUNC, PSTART, ZBUILD, ILON,
+ X ALEG, ATRIGS, IMFAX, ZFA, KRET)
+ ELSE
+ CALL JSTRLL(PSHUP, KTRUNC, PSTART, ZBUILD, ILON,
+ X ALEG, ATRIGS, IMFAX, ZFA, KRET)
+ ENDIF
+ IF( KRET.NE.0 ) GOTO 900
+C
+C Find start offset in storage array
+C
+ IOFFN = NINT( (PNORTH - PSTART)/PLATINC ) + 1
+ LONGIT = NINT( (360.0 + PWEST)/PLONINC )
+ N360 = NINT( 360.0/PLONINC )
+ NSTART = MOD( LONGIT, N360)*IJPWR
+C
+ DO LOOPCL = 1, NUMLON
+ INEXT = 2 + MOD( NSTART + (LOOPCL-1)*IJPWR , ILON)
+ POUTF( LOOPCL + (IOFFN-1)*NUMLON ) = ZFA( INEXT)
+ ENDDO
+C
+ ENDDO
+C
+ KRET = 0
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/jspleg1.F b/interpolation/jspleg1.F
new file mode 100755
index 0000000..e4d6ee4
--- /dev/null
+++ b/interpolation/jspleg1.F
@@ -0,0 +1,232 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JSPLEG1( PLEG, PLAT, KTRUNC)
+ IMPLICIT NONE
+C
+C---->
+C**** JSPLEG1 - Routine to calculate legendre functions
+C
+C Purpose
+C --------
+C
+C This routine calculates the legendre functions for one latitude.
+C (but not their derivatives)
+C
+C
+C Interface
+C ----------
+C
+C CALL JSPLEG1( PLEG, PLAT, KTRUNC)
+C
+C
+C Input parameters
+C ----------------
+C
+C PLAT - Latitude in radians
+C KTRUNC - Spectral truncation
+C
+C
+C Output parameters
+C -----------------
+C
+C PLEG - Array of legendre functions for one latitude.
+C The array must be at least (KTRUNC+1)*(KTRUNC+4)/2
+C words long.
+C
+C
+C Common block usage
+C ------------------
+C
+C None
+C
+C
+C Method
+C ------
+C
+C Recurrence relation with explicit relations for P(m,m) and
+C P(m,m+1)
+C
+C
+C Externals
+C ---------
+C
+C None
+C
+C
+C Reference
+C ---------
+C
+C None
+C
+C
+C Comments
+C --------
+C
+C Rewritten from SPLEG1 to avoid using common blocks.
+C Work arrays ZHLPx currently dimensioned for T213 using
+C parameter JPTRP1.
+C
+C
+C AUTHOR
+C ------
+C
+C J.D.Chambers ECMWF 9 November 1993
+C
+C
+C Modifications
+C -------------
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+#include "jparams.h"
+C
+C Subroutine arguments
+C
+ REAL PLEG, PLAT
+ DIMENSION PLEG(*)
+ INTEGER KTRUNC
+C
+C Local variables
+C
+ REAL ZHLP1, ZHLP2, ZHLP3
+ DIMENSION ZHLP1(JPTRP1), ZHLP2(JPTRP1), ZHLP3(JPTRP1)
+ INTEGER ITOUT1, I1M, ILM, JM, JCN, IM2
+ REAL ZSIN, ZCOS, ZF1M, ZRE1, ZF2M, ZM, ZN, ZE1, ZE2
+C
+C _______________________________________________________
+C
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ ITOUT1 = KTRUNC+1
+ ZSIN = SIN(PLAT)
+ ZCOS = SQRT(1.-ZSIN*ZSIN)
+C
+C Step 1. M = 0, N = 0 and N = 1
+C
+ ILM = 2
+ PLEG(1) = 1.0
+ ZF1M = SQRT(3.0)
+ PLEG(2) = ZF1M*ZSIN
+C _______________________________________________________
+C
+C
+C Step 2. Sum for M = 0 to T (T = truncation)
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ DO 205 JM = 2,ITOUT1
+ ZM = JM-1
+ ZHLP1(JM) = SQRT(2.*ZM+3.)
+ ZHLP2(JM) = 1./SQRT(2.*ZM)
+ 205 CONTINUE
+ ZHLP1(1) = SQRT(3.)
+C
+ DO 570 JM = 1,ITOUT1
+C
+ I1M = JM-1
+ ZM = I1M
+ ZRE1 = ZHLP1(JM)
+ ZE1 = 1./ZRE1
+C _______________________________________________________
+C
+C
+C Step 3. M > 0 only
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF (I1M.NE.0) THEN
+ ZF2M = ZF1M*ZCOS*ZHLP2(JM)
+ ZF1M = ZF2M*ZRE1
+C _______________________________________________________
+C
+C
+C Step 4. N = M and N = M+1
+C _______________________________________________________
+C
+ 400 CONTINUE
+C
+ ILM = ILM+1
+ PLEG(ILM) = ZF2M
+ ILM = ILM+1
+ PLEG(ILM) = ZF1M*ZSIN
+C
+C When output truncation is reached, return to calling program
+ IF ( JM .EQ. ITOUT1 ) GOTO 570
+C
+ ENDIF
+C _______________________________________________________
+C
+C
+C Step 5. Sum for N = M+2 to T+1
+C _______________________________________________________
+C
+ 500 CONTINUE
+C
+ IM2 = I1M+2
+C
+ DO 520 JCN = IM2,ITOUT1
+ ZN = JCN
+ ZHLP3(JCN) = SQRT((4.*ZN*ZN-1.)/(ZN*ZN-ZM*ZM))
+ 520 CONTINUE
+C
+ DO 560 JCN = IM2,ITOUT1
+C
+ ZE2 = ZHLP3(JCN)
+ ILM = ILM+1
+ PLEG(ILM) = ZE2*(ZSIN*PLEG(ILM-1)-ZE1*PLEG(ILM-2))
+ ZE2 = 1./ZE2
+ ZE1 = ZE2
+C
+ 560 CONTINUE
+C
+ 570 CONTINUE
+C
+C _______________________________________________________
+C
+C
+C* Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/jsppole.F b/interpolation/jsppole.F
new file mode 100755
index 0000000..3dd5f3b
--- /dev/null
+++ b/interpolation/jsppole.F
@@ -0,0 +1,182 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JSPPOLE(PSHUP,KNUMB,KTRUNC,OMARS,PXF)
+ IMPLICIT NONE
+C
+C---->
+C**** *JSPPOLE* - Calculates fourier coefficient for U or V at pole
+C
+C Purpose
+C -------
+C
+C Calculates fourier coefficient for first harmonic only
+C for U and V wind component at the pole.
+C
+C Interface
+C ---------
+C
+C CALL JSPPOLE(PSHUP,KNUMB,KTRUNC,OMARS,PXF)
+C
+C Input parameters
+C ----------------
+C
+C PSHUP - Unpacked harmonics field, unpacked
+C KNUMB - 1 for North Pole, otherwise South Pole
+C KTRUNC - Number (value) of the trucation
+C OMARS - .TRUE. if data is from MARS
+C PXF - Fourier coefficients (zero on input)
+C
+C
+C Output parameters
+C -----------------
+C
+C PXF(2) - Single fourier coefficient calculated
+C
+C
+C Common block usage
+C -----------------
+C
+C None.
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers *ECMWF* Oct 1993
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C Created from SPPOLE.
+C Changed to provide all parameters in the call, i.e. no common
+C blocks are used.
+C
+C
+C Method
+C ------
+C
+C None.
+C
+C
+C Reference
+C _________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Dummy arguments
+C
+ COMPLEX PSHUP
+ INTEGER KNUMB
+ INTEGER KTRUNC
+ LOGICAL OMARS
+ COMPLEX PXF
+ DIMENSION PSHUP(*)
+ DIMENSION PXF(*)
+C
+C Local variables
+C
+ INTEGER I1, ITIN1, ITOUT1, JN
+ REAL Z1, Z2, ZNORM, ZP1, ZP2, ZPOL
+C
+C -----------------------------------------------------------
+C
+C* 1. Set initial values
+C ------------------
+C
+ 100 CONTINUE
+C
+ ITIN1 = KTRUNC + 1
+ ITOUT1 = KTRUNC
+C
+ ZPOL = 1.
+ IF (KNUMB .NE. 1) ZPOL = -1.0
+C
+ ZP1 = -1.0
+ ZP2 = -3.0 * ZPOL
+ I1 = ITIN1 + 1
+C
+C* 2. Change normalisation (if flagged as necessary)
+C --------------------
+C
+ 200 CONTINUE
+C
+ IF (OMARS) THEN
+ ZNORM = -SQRT(2.0)
+ ELSE
+ ZNORM = 1
+ ENDIF
+C
+C
+C* 3. Calculation
+C -----------
+C
+ 300 CONTINUE
+ PXF(2) = (0.0,0.0)
+C
+C Calculate the fourier coefficient for the first harmonic only.
+ DO 310 JN = 1,ITOUT1,2
+C
+ Z1 = SQRT( (2.0*JN + 1.0)/(2.0*JN*(JN + 1.0)) )
+ Z2 = SQRT( (2.0*(JN + 1.0) +1.0)/(2.0*(JN +1.0)*(JN +2.0)) )
+C
+ IF (JN .EQ. ITOUT1) Z2 = 0.0
+C
+ PXF(2) = PXF(2) +(Z1*ZP1*PSHUP(I1) +Z2*ZP2*PSHUP(I1+1))*ZNORM
+ ZP1 = ZP1 - 2.0*(JN + 1.0) - 1.0
+ ZP2 = ZP2 - (2.0*(JN + 2.0) + 1.0)*ZPOL
+ I1 = I1 + 2
+C
+ 310 CONTINUE
+C
+C -------------------------------------------------------------
+C
+ RETURN
+C
+ END
diff --git a/interpolation/jstrll.F b/interpolation/jstrll.F
new file mode 100755
index 0000000..a78de67
--- /dev/null
+++ b/interpolation/jstrll.F
@@ -0,0 +1,317 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JSTRLL( PSHUP, KTRUNC, PNLAT, PBUILD, KLONO,
+ X PLEG, PTRIGS, KMFAX, PZFA, KRET)
+C
+C---->
+C**** JSTRLL
+C
+C PURPOSE
+C _______
+C
+C This routine converts stretched spectral input fields to
+C standard lat/long grid fields.
+C
+C INTERFACE
+C _________
+C
+C CALL JSTRLL( PSHUP, KTRUNC, PNLAT, PBUILD, KLONO,
+C X PLEG, PTRIGS, KMFAX, PZFA, KRET)
+C
+C Input parameters
+C ________________
+C
+C PSHUP - Spherical harmonics field, unpacked
+C KTRUNC - Truncation number of spherical harmonics field
+C PNLAT - Start latitude (northernmost) for output field
+C PBUILD - Grid interval used to build the legendre coefficients
+C KLONO - Number of longitude points along the line of latitude
+C PLEG - Array used to hold legendre functions
+C PTRIGS - Initialized array of trig.functions (setup by JJSET99)
+C KMFAX - Initialized array of prime factors (setup by JJSET99)
+C
+C Output parameters
+C ________________
+C
+C PZFA - Output grid point field; contains one latitude row.
+C KRET - Return status code, 0 = OK
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG
+C
+C Method
+C ______
+C
+C None.
+C
+C Externals
+C _________
+C
+C FFT99 - Carries out FFT
+C INTLOG - Output log message
+C INTLOGR - Output log message (with real value)
+C NMAKLL - Make interpolation coefficients one latitude at a time
+C
+C Reference
+C _________
+C
+C E.C.M.W.F. Research Department technical memorandum no. 56
+C "The forecast and analysis post-processing package"
+C May 1982. J.Haseler.
+C
+C Comments
+C ________
+C
+C It handles transformation to a regular lat/long grid.
+C
+C It is not for U and V fields (no correction is applied at the
+C poles).
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF July 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+#include "nifld.common"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 31300 )
+ INTEGER JPN, JPS
+ PARAMETER ( JPN = 1 )
+ PARAMETER ( JPS = 2 )
+C
+C Subroutine arguments
+C
+ COMPLEX PSHUP(*)
+ INTEGER KTRUNC
+ INTEGER KLONO, KRET
+ INTEGER KMFAX(*)
+ REAL PNLAT, PBUILD
+ REAL PZFA(JPLONO+2), PLEG(*), PTRIGS(*)
+C
+C Local variables
+C
+ INTEGER ILIM, IMLIM, ILN
+ INTEGER ITAL, ITALA, ITALS, IMN, IMP
+ INTEGER INORTH
+ INTEGER JM, LOOP, JF
+ INTEGER NERR
+C
+#ifdef POINTER_64
+ INTEGER*8 IWORK
+#endif
+ REAL ZNLAT, MFACTOR
+ REAL WORK
+ DIMENSION WORK(1)
+ POINTER ( IWORK, WORK )
+ COMPLEX ZDUM(JPTRNC + 1)
+ COMPLEX ZSUMS(JPTRNC + 1), ZSUMA(JPTRNC + 1)
+ COMPLEX*16 CHOLD
+C
+ INTEGER ISIZE
+ DATA ISIZE/0/
+ SAVE ISIZE, IWORK
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+C First time through, dynamically allocate memory for workspace
+C
+ IF( ISIZE.EQ.0 ) THEN
+ ISIZE = 2*JPFFT
+ CALL JMEMHAN( 9, IWORK, ISIZE, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JSTRLL: memory allocation error.',IWORK)
+ KRET = JPROUTINE + 1
+ GOTO 990
+ ENDIF
+ ENDIF
+C
+ IF( NDBG.GT.1 ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JSTRLL: Spherical harmonic coeffs(first 20):',JPQUIET)
+ DO NDBGLP = 1, 20
+ CALL INTLOGR(JP_DEBUG,' ',PSHUP( NDBGLP ))
+ ENDDO
+ CALL INTLOG(JP_DEBUG,'JSTRLL: Input parameters:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSTRLL: Spherical harmonic truncation = ', KTRUNC)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JSTRLL: Current latitude = ', PNLAT)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JSTRLL: Grid lat. interval(leg. file) = ', PBUILD)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSTRLL: Number of long. pts per row = ', KLONO)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSTRLL: Trig.functions (setup by JJSET99):',JPQUIET)
+ DO NDBGLP = 1, 10
+ CALL INTLOGR(JP_DEBUG,' ',PTRIGS( NDBGLP ))
+ ENDDO
+ CALL INTLOG(JP_DEBUG,
+ X 'JSTRLL: Prime factors (setup by JJSET99):',JPQUIET)
+ DO NDBGLP = 1, 10
+ CALL INTLOG(JP_DEBUG,' ',KMFAX( NDBGLP ))
+ ENDDO
+ ENDIF
+C
+C If it is a stretched field, calculate the true latitude and
+C the map factor.
+C
+ IF( RISTRET.NE.0 ) THEN
+ CALL STRLAT(PNLAT, RISTRET, 1, ZNLAT, MFACTOR)
+ ELSE
+ ZNLAT = PNLAT
+ ENDIF
+C
+ ILIM = KTRUNC + 1
+ IMLIM = KTRUNC + 1
+ INORTH = -1
+ ILN = KLONO + 2
+C
+C _______________________________________________________
+C
+C* Section 2. Calculate fourier coefficients
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Generate the legendre coefficients 'on the fly'
+C
+ IF( ZNLAT.GE.0 ) THEN
+ CALL NMAKLL( KTRUNC, PBUILD, ZNLAT, 1, PLEG, NERR)
+ ELSE
+ CALL NMAKLL( KTRUNC, PBUILD, -ZNLAT, 1, PLEG, NERR)
+ ENDIF
+C
+C Clear array.
+C
+ DO JF = 1, JPLONO+2
+ PZFA(JF) = 0.0
+ ENDDO
+C
+C Fill slots which are used
+C
+ IMN = 0
+ IMP = 0
+C
+ DO JM = 1, IMLIM
+ ITAL = ILIM - JM + 1
+ DO LOOP = 1, ITAL
+ ZDUM(LOOP) = PLEG(IMP + LOOP)*PSHUP(IMN + LOOP)
+ ENDDO
+C
+ IMP = IMP + ITAL + 1
+ IMN = IMN + ITAL
+ ITALS = (ITAL + 1)/2
+ ITALA = ITAL/2
+#ifndef CRAY
+ CHOLD = (0.0D0, 0.0D0)
+#else
+ CHOLD = (0.0, 0.0)
+#endif
+ DO LOOP = 1, 2*ITALS, 2
+ CHOLD = CHOLD + ZDUM(LOOP)
+ ENDDO
+ ZSUMS(JM) = CHOLD
+#ifndef CRAY
+ CHOLD = (0.0D0, 0.0D0)
+#else
+ CHOLD = (0.0, 0.0)
+#endif
+ DO LOOP = 2, 2*ITALA, 2
+ CHOLD = CHOLD + ZDUM(LOOP)
+ ENDDO
+ ZSUMA(JM) = CHOLD
+C
+ ENDDO
+C
+C For the southern hemisphere row, the legendre functions are
+C the complex conjugates of the corresponding northern row -
+C hence the juggling with the signs in the next loop.
+C
+C Note that PZFA is REAL, but the coefficients being calculated
+C are COMPLEX. There are pairs of values for each coefficient
+C (real and imaginary parts) and pairs of values for each
+C latitude (north and south).
+C
+ IF( ZNLAT.GE.0 ) THEN
+ DO JM = 1, IMLIM
+ PZFA(2*JM -1) = REAL(ZSUMS(JM)) + REAL(ZSUMA(JM))
+ PZFA(2*JM ) = AIMAG(ZSUMS(JM)) + AIMAG(ZSUMA(JM))
+ ENDDO
+ ELSE
+ DO JM = 1, IMLIM
+ PZFA(2*JM -1) = REAL(ZSUMS(JM)) - REAL(ZSUMA(JM))
+ PZFA(2*JM ) = AIMAG(ZSUMS(JM)) - AIMAG(ZSUMA(JM))
+ ENDDO
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 3. Fast fourier transform
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ CALL FFT99(PZFA,WORK,PTRIGS,KMFAX,1,J2NFFT,KLONO,1,1)
+C
+C Apply map factor (squared) to vorticity or divergence
+C
+ IF( (NIPARAM.EQ.138).OR.(NIPARAM.EQ.155) ) THEN
+ MFACTOR = MFACTOR*MFACTOR
+ DO LOOP = 1, KLONO
+ PZFA(LOOP) = MFACTOR*PZFA(LOOP)
+ ENDDO
+ ENDIF
+C
+ IF( NDBG.GT.1 ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JSTRLL: Values calculated by FFT:',JPQUIET)
+ DO NDBGLP = 1, 20
+ CALL INTLOGR(JP_DEBUG,' ', PZFA( 1 + (NDBGLP-1)*2 ))
+ CALL INTLOGR(JP_DEBUG,' ', PZFA( NDBGLP*2 ))
+ ENDDO
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+C
+ 900 CONTINUE
+C
+ KRET = 0
+C
+ 990 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/jstrwll.F b/interpolation/jstrwll.F
new file mode 100755
index 0000000..e789618
--- /dev/null
+++ b/interpolation/jstrwll.F
@@ -0,0 +1,364 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JSTRWLL( PSHUP, KTRUNC, PNLAT, PBUILD, KLONO,
+ X PLEG, PTRIGS, KMFAX, PZFA, KRET)
+C
+C---->
+C**** JSTRWLL
+C
+C PURPOSE
+C _______
+C
+C This routine converts stretched spectral wind fields to
+C standard lat/long grid fields.
+C
+C INTERFACE
+C _________
+C
+C CALL JSTRWLL( PSHUP, KTRUNC, PNLAT, PBUILD, KLONO,
+C X PLEG, PTRIGS, KMFAX, PZFA, KRET)
+C
+C Input parameters
+C ________________
+C
+C PSHUP - Spherical harmonics field, unpacked
+C KTRUNC - Truncation number of spherical harmonics field
+C PNLAT - Start latitude (northernmost) for output field
+C PBUILD - Grid interval used to build the legendre coefficients
+C KLONO - Number of longitude points along the line of latitude
+C PLEG - Array used to hold legendre functions
+C PTRIGS - Initialized array of trig.functions (setup by JJSET99)
+C KMFAX - Initialized array of prime factors (setup by JJSET99)
+C
+C Output parameters
+C ________________
+C
+C PZFA - Output grid point field; contains one latitude row.
+C KRET - Return status code, 0 = OK
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG
+C
+C Method
+C ______
+C
+C None.
+C
+C Externals
+C _________
+C
+C FFT99 - Carries out FFT
+C INTLOG - Output log message
+C INTLOGR - Output log message (with real value)
+C NMAKLL - Make interpolation coefficients one latitude at a time
+C JSPPOLE - Applies correction at North or South pole
+C SSCAL - Scale a vector of values
+C
+C Reference
+C _________
+C
+C E.C.M.W.F. Research Department technical memorandum no. 56
+C "The forecast and analysis post-processing package"
+C May 1982. J.Haseler.
+C
+C Comments
+C ________
+C
+C It handles transformation to a regular lat/long grid.
+C
+C It is for U and V fields (a correction is applied at latitudes
+C other than the poles).
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF July 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+#include "nifld.common"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 31300 )
+ INTEGER JPN, JPS
+ PARAMETER ( JPN = 1 )
+ PARAMETER ( JPS = 2 )
+ REAL DEG2RAD
+ PARAMETER (DEG2RAD = PPI / 180.0 )
+C
+C Subroutine arguments
+C
+ COMPLEX PSHUP(*)
+ INTEGER KTRUNC
+ INTEGER KLONO, KRET
+ INTEGER KMFAX(*)
+ REAL PNLAT, PBUILD
+ REAL PZFA(JPLONO+2,2), PLEG(*), PTRIGS(*)
+C
+C Local variables
+C
+ INTEGER ILIM, IMLIM, ILN
+ INTEGER ITAL, ITALA, ITALS, IMN, IMP
+ INTEGER INORTH
+ INTEGER JM, LOOP, JF
+ INTEGER NERR
+C
+#ifdef POINTER_64
+ INTEGER*8 IWORK
+#endif
+ REAL ZCOSI, ZF(2*JPFFT)
+ REAL ZNLAT, MFACTOR
+ REAL WORK
+ DIMENSION WORK(1)
+ POINTER ( IWORK, WORK )
+ COMPLEX ZDUM(JPTRNC + 1)
+ COMPLEX ZSUMS(JPTRNC + 1), ZSUMA(JPTRNC + 1)
+ COMPLEX*16 CHOLD
+C
+ INTEGER ISIZE
+ DATA ISIZE/0/
+ SAVE ISIZE, IWORK
+C
+C Statement function
+C
+ LOGICAL GPOLE
+ REAL ANGLE
+ GPOLE(ANGLE) = ( ABS(90.0 - ABS(ANGLE) ) .LT. 1.0E-3 )
+C = .TRUE. if LAT is 90.0 or -90.0
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+C First time through, dynamically allocate memory for workspace
+C
+ IF( ISIZE.EQ.0 ) THEN
+ ISIZE = 2*JPFFT
+ CALL JMEMHAN( 9, IWORK, ISIZE, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JSTRWLL: memory allocation error',IWORK)
+ KRET = JPROUTINE + 1
+ GOTO 990
+ ENDIF
+ ENDIF
+C
+ IF( NDBG.GT.1 ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JSTRWLL: Spherical harmonic coeffs(first 20):',JPQUIET)
+ DO NDBGLP = 1, 20
+ CALL INTLOGR(JP_DEBUG,' ',PSHUP( NDBGLP ))
+ ENDDO
+ CALL INTLOG(JP_DEBUG,'JSTRWLL: Input parameters:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSTRWLL: Spherical harmonic truncation = ', KTRUNC)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JSTRWLL: Current latitude = ', PNLAT)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JSTRWLL: Grid lat. interval(leg. file) = ', PBUILD)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSTRWLL: Number of long. pts per row = ', KLONO)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSTRWLL: Trig.functions (setup by JJSET99):',JPQUIET)
+ DO NDBGLP = 1, 10
+ CALL INTLOGR(JP_DEBUG,' ',PTRIGS( NDBGLP ))
+ ENDDO
+ CALL INTLOG(JP_DEBUG,
+ X 'JSTRWLL: Prime factors (setup by JJSET99):',JPQUIET)
+ DO NDBGLP = 1, 10
+ CALL INTLOG(JP_DEBUG,' ',KMFAX( NDBGLP ))
+ ENDDO
+ ENDIF
+C
+C If it is a stretched field, calculate the true latitude and
+C the map factor.
+C
+ IF( RISTRET.NE.0 ) THEN
+ CALL STRLAT(PNLAT, RISTRET, 1, ZNLAT, MFACTOR)
+ ELSE
+ ZNLAT = PNLAT
+ MFACTOR = 1.0
+ ENDIF
+C
+ ILIM = KTRUNC + 1
+ IMLIM = KTRUNC + 1
+ INORTH = -1
+ ILN = KLONO + 2
+C
+C _______________________________________________________
+C
+C* Section 2. Calculate fourier coefficients
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Generate the legendre coefficients 'on the fly'
+C
+ IF( ZNLAT.GE.0 ) THEN
+ CALL NMAKLL( KTRUNC, PBUILD, ZNLAT, 1, PLEG, NERR)
+ ELSE
+ CALL NMAKLL( KTRUNC, PBUILD, -ZNLAT, 1, PLEG, NERR)
+ ENDIF
+C
+C Clear array.
+C
+ DO JF = 1, JPLONO+2
+ PZFA(JF,JPN) = 0.0
+ PZFA(JF,JPS) = 0.0
+ ENDDO
+C
+C Treat the poles as a special case ..
+C
+ IF( GPOLE(ZNLAT) ) THEN
+C
+ IF( NDBG.GT.1 ) CALL INTLOG(JP_DEBUG,
+ X 'JSTRWLL: Pole is special case',JPQUIET)
+C
+ CALL JSPPOLE( PSHUP, 1, KTRUNC, .TRUE. , ZF)
+ DO LOOP = 1, ILN
+ PZFA(LOOP, JPN) = ZF(LOOP)
+ ENDDO
+C
+ CALL JSPPOLE( PSHUP, 0, KTRUNC, .TRUE. , ZF)
+ DO LOOP = 1, ILN
+ PZFA(LOOP, JPS) = ZF(LOOP)
+ ENDDO
+C
+C .. otherwise not at pole
+C
+ ELSE
+C
+C Fill slots which are used
+C
+ IMN = 0
+ IMP = 0
+C
+ DO JM = 1, IMLIM
+ ITAL = ILIM - JM + 1
+ DO LOOP = 1, ITAL
+ ZDUM(LOOP) = PLEG(IMP + LOOP)*PSHUP(IMN + LOOP)
+ ENDDO
+C
+ IMP = IMP + ITAL + 1
+ IMN = IMN + ITAL
+ ITALS = (ITAL + 1)/2
+ ITALA = ITAL/2
+#ifndef CRAY
+ CHOLD = (0.0D0, 0.0D0)
+#else
+ CHOLD = (0.0, 0.0)
+#endif
+ DO LOOP = 1, 2*ITALS, 2
+ CHOLD = CHOLD + ZDUM(LOOP)
+ ENDDO
+ ZSUMS(JM) = CHOLD
+#ifndef CRAY
+ CHOLD = (0.0D0, 0.0D0)
+#else
+ CHOLD = (0.0, 0.0)
+#endif
+ DO LOOP = 2, 2*ITALA, 2
+ CHOLD = CHOLD + ZDUM(LOOP)
+ ENDDO
+ ZSUMA(JM) = CHOLD
+C
+ ENDDO
+C
+C For the southern hemisphere row, the legendre functions are
+C the complex conjugates of the corresponding northern row -
+C hence the juggling with the signs in the next loop.
+C
+C Note that PZFA is REAL, but the coefficients being calculated
+C are COMPLEX. There are pairs of values for each coefficient
+C (real and imaginary parts) and pairs of values for each
+C latitude (north and south).
+C
+ DO JM = 1, IMLIM
+ PZFA(2*JM -1,JPN) = REAL(ZSUMS(JM)) + REAL(ZSUMA(JM))
+ PZFA(2*JM ,JPN) = AIMAG(ZSUMS(JM)) + AIMAG(ZSUMA(JM))
+ PZFA(2*JM -1,JPS) = REAL(ZSUMS(JM)) - REAL(ZSUMA(JM))
+ PZFA(2*JM ,JPS) = AIMAG(ZSUMS(JM)) - AIMAG(ZSUMA(JM))
+ ENDDO
+C
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 3. Fast fourier transform
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ CALL FFT99(PZFA,WORK,PTRIGS,KMFAX,1,J2NFFT,KLONO,2,1)
+C
+ IF( NDBG.GT.1 ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JSTRWLL: Values calculated by FFT:',JPQUIET)
+ DO NDBGLP = 1, 20
+ CALL INTLOGR(JP_DEBUG,' ', PZFA( 1, NDBGLP ))
+ CALL INTLOGR(JP_DEBUG,' ', PZFA( 2, NDBGLP ))
+ ENDDO
+ ENDIF
+C
+C Move 'southern' latitude into leading part of array
+C
+ IF( ZNLAT.LT.0 ) THEN
+ DO JF = 1, JPLONO+2
+ PZFA(JF,JPN) = PZFA(JF,JPS)
+ ENDDO
+ ENDIF
+C _______________________________________________________
+C
+C* Section 4. Apply scale factor (map scale factor, and
+C latitude correction if not pole)
+C _______________________________________________________
+C
+ 400 CONTINUE
+C
+ IF( NDBG.GT.1 ) CALL INTLOG(JP_DEBUG,
+ X 'JSTRWLL: Apply scale to latitude',JPQUIET)
+C
+ IF( .NOT. GPOLE(ZNLAT) ) THEN
+ ZCOSI = MFACTOR / COS( ZNLAT * DEG2RAD )
+ CALL SSCAL( KLONO, ZCOSI, PZFA( 2, JPN), 1)
+ ELSE
+ CALL SSCAL( KLONO, MFACTOR, PZFA( 2, JPN), 1)
+ ENDIF
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+C
+ 900 CONTINUE
+C
+ KRET = 0
+C
+ 990 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/jsymgg.F b/interpolation/jsymgg.F
new file mode 100755
index 0000000..7017803
--- /dev/null
+++ b/interpolation/jsymgg.F
@@ -0,0 +1,348 @@
+#ifdef IBM
+ at PROCESS HOT(NOVECTOR) NOSTRICT
+#endif
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JSYMGG( PSHUP, KTRUNC, KSTART, KLUNIT, KLATO, KLONO,
+ X PLAT, PLEG, PTRIGS, KMFAX, PZFA, KRET)
+C
+C---->
+C**** JSYMGG
+C
+C PURPOSE
+C _______
+C
+C This routine converts spectral input fields to standard
+C lat/long grid fields.
+C
+C INTERFACE
+C _________
+C
+C CALL JSYMGG( PSHUP, KTRUNC, KSTART, KLUNIT, KLATO, KLONO,
+C X PLAT, PLEG, PTRIGS, KMFAX, PZFA, KRET)
+C
+C Input parameters
+C ________________
+C
+C PSHUP - Spherical harmonics field, unpacked
+C KTRUNC - Truncation number of spherical harmonics field
+C KSTART - Number of start latitude row (northernmost) for output
+C field (must be positive - see comments below)
+C KLUNIT - stream number of the legendre function file
+C KLATO - Number of latitude rows in output field
+C KLONO - Number of longitude points in output field
+C PLAT - Array of gaussian latitudes
+C PLEG - Array used to hold legendre functions
+C PTRIGS - Initialized array of trig.functions (setup by JJSET99)
+C KMFAX - Initialized array of prime factors (setup by JJSET99)
+C
+C Output parameters
+C ________________
+C
+C PZFA - Output grid point field; contains upto 32 each of
+C North and South latitude rows symmetrically.
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG
+C
+C Method
+C ______
+C
+C None.
+C
+C Externals
+C _________
+C
+C JREADGG - Reads the legendre functions for a latitude
+C FFT99 - Carries out FFT
+C INTLOG - Output log message
+C INTLOGR - Output log message (with real value)
+C NMAKGG - Make interpolation coefficients one latitude at a time
+C
+C Reference
+C _________
+C
+C E.C.M.W.F. Research Department technical memorandum no. 56
+C "The forecast and analysis post-processing package"
+C May 1982. J.Haseler.
+C
+C Comments
+C ________
+C
+C This is a redesign, based on SPECGP.F
+C
+C It handles transformation to a gaussian grid.
+C The generated grid is symmetrical about the equator, so
+C KSTART must be positive.
+C
+C It is not for U and V fields (no correction is applied at the
+C poles).
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Jan 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C----<
+C _______________________________________________________
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+#include "nifld.common"
+C
+C Subroutine arguments
+ COMPLEX PSHUP
+ DIMENSION PSHUP(*)
+ INTEGER KTRUNC
+ INTEGER KSTART
+ INTEGER KLUNIT, KLATO, KLONO, KMFAX, KRET
+ REAL PLAT, PLEG, PTRIGS, PZFA
+ DIMENSION PZFA(JPLONO + 2, 64)
+ DIMENSION KMFAX(*), PLAT(*), PLEG(*), PTRIGS(*)
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 31200 )
+C
+C Local variables
+ INTEGER ILIM, IMLIM, ILN
+ INTEGER ITAL, ITALA, ITALS, IMN, IMP
+ INTEGER INORTH, ISOUTH
+ INTEGER JM, J, JNEXTLAT, JF
+ INTEGER NERR
+ INTEGER*8 IOFF
+ INTEGER*8 JDCLOOP
+C
+#ifdef POINTER_64
+ INTEGER*8 IWORK
+#endif
+ REAL WORK
+ DIMENSION WORK(1)
+ POINTER ( IWORK, WORK )
+ COMPLEX ZSUMS(JPTRNC + 1), ZSUMA(JPTRNC + 1)
+ COMPLEX*16 CHOLD
+C
+ INTEGER ISIZE
+ DATA ISIZE/0/
+ SAVE ISIZE, IWORK
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+C First time through, dynamically allocate memory for workspace
+C
+ IF( ISIZE.EQ.0 ) THEN
+ ISIZE = 2*JPFFT*64
+ CALL JMEMHAN( 9, IWORK, ISIZE, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JSYMGG: memory allocation error.',IWORK)
+ KRET = JPROUTINE + 1
+ GOTO 990
+ ENDIF
+ ENDIF
+C
+ IF ( NDBG .GT. 1) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JSYMGG: Spherical harmonic coeffs(first 20):',JPQUIET)
+ DO 101 NDBGLP = 1, 20
+ CALL INTLOGR(JP_DEBUG,' ',PSHUP( NDBGLP ))
+ 101 CONTINUE
+ CALL INTLOG(JP_DEBUG,'JSYMGG: Input parameters:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSYMGG: Spherical harmonic truncation = ', KTRUNC)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSYMGG: Start latitude(northernmost) = ', KSTART)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSYMGG: Stream number of leg. file = ', KLUNIT)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSYMGG: Number of lat. rows in output = ', KLATO)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSYMGG: Number of long. pts per row = ', KLONO)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSYMGG: Trig.functions (setup by JJSET99):',JPQUIET)
+ DO 102 NDBGLP = 1, 10
+ CALL INTLOGR(JP_DEBUG,' ',PTRIGS( NDBGLP ))
+ 102 CONTINUE
+ CALL INTLOG(JP_DEBUG,
+ X 'JSYMGG: Prime factors (setup by JJSET99):',JPQUIET)
+ DO 103 NDBGLP = 1, 10
+ CALL INTLOG(JP_DEBUG,' ',KMFAX( NDBGLP ))
+ 103 CONTINUE
+ ENDIF
+C
+ ILIM = KTRUNC + 1
+ IMLIM = KTRUNC + 1
+ INORTH = -1
+ ILN = KLONO + 2
+C
+C _______________________________________________________
+C
+C* Section 2. Main loop through latitude rows to
+C* calculate fourier coefficients
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C For each latitude, the north and corresponding south latitude row
+C are calculated at the same time from the same legendre functions.
+C
+ DO 280 JNEXTLAT = KSTART, KSTART+KLATO-1
+C
+ IF ( NDBG .GT. 1)
+ X CALL INTLOG(JP_DEBUG,'JSYMGG: Next latitude = ', JNEXTLAT)
+C
+C If required, generate the coefficients 'on the fly'
+C
+ IF( LON_FLY ) THEN
+ CALL NMAKGG( KTRUNC, JNEXTLAT, PLAT, 1, PLEG, NERR)
+ IOFF = 0
+ ELSE IF( LFILEIO ) THEN
+ CALL JREADGG( KLUNIT, KTRUNC, JNEXTLAT, PLEG, NERR)
+ IF ( NERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'JSYMGG: JREADGG error',NERR)
+ KRET = JPROUTINE + 2
+ GOTO 990
+ ENDIF
+ ELSE
+ IOFF = (JNEXTLAT-1)*(KTRUNC+1)*(KTRUNC+4)/2
+ ENDIF
+C
+C Clear unused slots in array.
+C and one for the corresponding south latitude.
+C
+ INORTH = INORTH + 2
+ ISOUTH = INORTH + 1
+ DO 241 JF = 2*IMLIM + 1, ILN
+ PZFA(JF, INORTH) = 0.0
+ PZFA(JF, ISOUTH) = 0.0
+ 241 CONTINUE
+C
+C Now fill slots which are used
+C
+ IMN = 0
+ IMP = 0
+C
+ DO JM = 1, IMLIM
+ ITAL = ILIM - JM + 1
+ ITALS = (ITAL + 1)/2
+ ITALA = ITAL/2
+#ifndef CRAY
+ CHOLD=(0.0D0, 0.0D0)
+#else
+ CHOLD = (0.0, 0.0)
+#endif
+ DO J = 1, 2*ITALS, 2
+#ifndef __uxp__
+ IF( LFILEIO ) THEN
+ CHOLD=CHOLD+PLEG(IMP+J)*PSHUP(IMN+J)
+ ELSE
+ JDCLOOP = IOFF + IMP + J
+ CHOLD=CHOLD+PLEG(JDCLOOP)*PSHUP(IMN+J)
+ ENDIF
+#else
+ JDCLOOP = IOFF + IMP + J
+ CHOLD=CHOLD+PLEG(JDCLOOP)*PSHUP(IMN+J)
+#endif
+ ENDDO
+ ZSUMS(JM)=CHOLD
+#ifndef CRAY
+ CHOLD = (0.0D0, 0.0D0)
+#else
+ CHOLD = (0.0, 0.0)
+#endif
+ DO J = 2, 2*ITALA, 2
+#ifndef __uxp__
+ IF( LFILEIO ) THEN
+ CHOLD=CHOLD+PLEG(IMP+J)*PSHUP(IMN+J)
+ ELSE
+ JDCLOOP = IOFF + IMP + J
+ CHOLD=CHOLD+PLEG(JDCLOOP)*PSHUP(IMN+J)
+ ENDIF
+#else
+ JDCLOOP = IOFF + IMP + J
+ CHOLD=CHOLD+PLEG(JDCLOOP)*PSHUP(IMN+J)
+#endif
+ ENDDO
+ ZSUMA(JM)=CHOLD
+ IMP = IMP + ITAL + 1
+ IMN = IMN + ITAL
+ ENDDO
+C
+C For the southern hemisphere row, the legendre functions are
+C the complex conjugates of the corresponding northern row -
+C hence the juggling with the signs in the next loop.
+C
+C Note that PZFA is REAL, but the coefficients being calculated
+C are COMPLEX. There are pairs of values for each coefficient
+C (real and imaginary parts) and pairs of values for each
+C latitude (north and south).
+C
+ DO 246 JM = 1, IMLIM
+ PZFA(2*JM -1, INORTH) = REAL(ZSUMS(JM)) + REAL(ZSUMA(JM))
+ PZFA(2*JM , INORTH) = AIMAG(ZSUMS(JM)) + AIMAG(ZSUMA(JM))
+ PZFA(2*JM -1, ISOUTH) = REAL(ZSUMS(JM)) - REAL(ZSUMA(JM))
+ PZFA(2*JM , ISOUTH) = AIMAG(ZSUMS(JM)) - AIMAG(ZSUMA(JM))
+ 246 CONTINUE
+C
+C* End of main loop through latitude rows.
+C
+ 280 CONTINUE
+C
+C _______________________________________________________
+C
+C* Section 3. Fast fourier transform
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ IF ( NDBG .GT. 1) CALL INTLOG(JP_DEBUG,
+ X 'JSYMGG: FFT, no.of rows (N and S) = ',ISOUTH)
+C
+ CALL FFT99(PZFA,WORK,PTRIGS,KMFAX,1,J2NFFT,KLONO,ISOUTH,1)
+C
+ IF ( NDBG .GT. 1) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JSYMGG: Values calculated by FFT:',JPQUIET)
+ DO 301 NDBGLP = 1, 20
+ CALL INTLOGR(JP_DEBUG,' ',PZFA( 1, NDBGLP ))
+ CALL INTLOGR(JP_DEBUG,' ',PZFA( 2, NDBGLP ))
+ 301 CONTINUE
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+C
+ 900 CONTINUE
+C
+ KRET = 0
+C
+ 990 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/jsymll.F b/interpolation/jsymll.F
new file mode 100755
index 0000000..3788381
--- /dev/null
+++ b/interpolation/jsymll.F
@@ -0,0 +1,372 @@
+#ifdef IBM
+ at PROCESS HOT(NOVECTOR) NOSTRICT
+#endif
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JSYMLL( PSHUP, KTRUNC, PSTART, PBUILD, PINTVL, KLUNIT,
+ X KLATO,KLONO,PLEG,PTRIGS,KMFAX,PZFA,KRET)
+C
+C---->
+C**** JSYMLL
+C
+C PURPOSE
+C _______
+C
+C This routine converts spectral input fields to standard
+C lat/long grid fields.
+C
+C INTERFACE
+C _________
+C
+C CALL JSYMLL( PSHUP, KTRUNC, PSTART, PBUILD, PINTVL, KLUNIT,
+C X KLATO,KLONO,PLEG,PTRIGS,KMFAX,PZFA,KRET)
+C
+C Input parameters
+C ________________
+C
+C PSHUP - Spherical harmonics field, unpacked
+C KTRUNC - Truncation number of spherical harmonics field
+C PSTART - Start latitude (northernmost) for output field
+C (must be positive - see comments below)
+C PBUILD - Grid interval used to build the legendre coefficients
+C file
+C PINTVL - Grid interval in degrees
+C KLUNIT - stream number of the legendre function file
+C KLATO - Number of latitude points in output field
+C KLONO - Number of longitude points in output field
+C PLEG - Array used to hold legendre functions
+C PTRIGS - Initialized array of trig.functions (setup by JJSET99)
+C KMFAX - Initialized array of prime factors (setup by JJSET99)
+C
+C Output parameters
+C ________________
+C
+C PZFA - Output grid point field; contains upto 32 each
+C of North and South latitude rows symmetrically.
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG
+C
+C Method
+C ______
+C
+C None.
+C
+C Externals
+C _________
+C
+C JREADLL - Reads the legendre functions for a latitude
+C FFT99 - Carries out FFT
+C INTLOG - Output log message
+C INTLOGR - Output log message (with real value)
+C NMAKLL - Make interpolation coefficients one latitude at a time
+C
+C Reference
+C _________
+C
+C E.C.M.W.F. Research Department technical memorandum no. 56
+C "The forecast and analysis post-processing package"
+C May 1982. J.Haseler.
+C
+C Comments
+C ________
+C
+C This is a redesign, based on SPECGP.F
+C
+C It handles transformation to a regular lat/long grid.
+C The generated grid is symmetrical about the equator, so
+C PSTART must be positive.
+C
+C It is not for U and V fields (no correction is applied at the
+C poles).
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Nov 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C----<
+C _______________________________________________________
+C
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+#include "nifld.common"
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 31300 )
+C
+C Subroutine arguments
+ COMPLEX PSHUP
+ DIMENSION PSHUP(*)
+ INTEGER KTRUNC
+ REAL PSTART, PBUILD, PINTVL
+ INTEGER KLUNIT, KLATO, KLONO, KMFAX, KRET
+ REAL PLEG, PTRIGS, PZFA
+ DIMENSION PZFA(JPLONO+2, 64)
+ DIMENSION KMFAX(*), PLEG(*), PTRIGS(*)
+C
+C Local variables
+ REAL ZLAT
+ INTEGER ILIM, IMLIM, ILN
+ INTEGER ITAL, ITALA, ITALS, IMN, IMP
+ INTEGER INORTH, ISOUTH
+ INTEGER JM, J, JNEXTLAT, JF
+ INTEGER NERR
+ INTEGER IOFF
+ INTEGER JDCLOOP
+ Integer Itimer,timer1,timer280,timerFFT
+ Integer timer246,timer244,time
+C
+#ifdef POINTER_64
+ INTEGER*8 IWORK
+#endif
+ REAL WORK
+ DIMENSION WORK(1)
+ POINTER ( IWORK, WORK )
+ COMPLEX ZSUMS(JPTRNC + 1), ZSUMA(JPTRNC + 1)
+ COMPLEX*16 CHOLD
+ INTEGER LOOP
+C
+ INTEGER ISIZE
+ DATA ISIZE/0/
+ SAVE ISIZE, IWORK
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+cs timer1=Itimer(0)
+C
+C First time through, dynamically allocate memory for workspace
+C
+ IF( ISIZE.EQ.0 ) THEN
+ ISIZE = 2*JPFFT*64
+ CALL JMEMHAN( 9, IWORK, ISIZE, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JSYMLL: memory allocation error.',IWORK)
+ KRET = JPROUTINE + 1
+ GOTO 990
+ ENDIF
+ ENDIF
+C
+ IF ( NDBG .GT. 1) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JSYMLL: Spherical harmonic coeffs(first 20):',JPQUIET)
+ DO 101 NDBGLP = 1, 20
+ CALL INTLOGR(JP_DEBUG,' ',PSHUP( NDBGLP ))
+ 101 CONTINUE
+ CALL INTLOG(JP_DEBUG,'JSYMLL: Input parameters:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSYMLL: Spherical harmonic truncation = ', KTRUNC)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JSYMLL: Start latitude(northernmost) = ', PSTART)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JSYMLL: Grid lat. interval(leg. file) = ', PBUILD)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JSYMLL: Grid lat. interval(degrees) = ', PINTVL)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSYMLL: Stream number of leg. file = ', KLUNIT)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSYMLL: Number of lat. rows in output = ', KLATO)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSYMLL: Number of long. pts per row = ', KLONO)
+ CALL INTLOG(JP_DEBUG,
+ X 'JSYMLL: Trig.functions (setup by JJSET99):',JPQUIET)
+ DO 102 NDBGLP = 1, 10
+ CALL INTLOGR(JP_DEBUG,' ',PTRIGS( NDBGLP ))
+ 102 CONTINUE
+ CALL INTLOG(JP_DEBUG,
+ X 'JSYMLL: Prime factors (setup by JJSET99):',JPQUIET)
+ DO 103 NDBGLP = 1, 10
+ CALL INTLOG(JP_DEBUG,' ',KMFAX( NDBGLP ))
+ 103 CONTINUE
+ ENDIF
+ ILIM = KTRUNC + 1
+ IMLIM = KTRUNC + 1
+ INORTH = -1
+ ILN = KLONO + 2
+C
+C _______________________________________________________
+C
+C* Section 2. Main loop through latitude rows to
+C* calculate fourier coefficients
+C _______________________________________________________
+C
+ 200 CONTINUE
+C timer280=Itimer(0)
+C
+C For each latitude, the north and corresponding south latitude row
+C are calculated at the same time from the same legendre functions.
+C
+ DO 280 JNEXTLAT = 1, KLATO
+ ZLAT = ( PSTART - (PINTVL * REAL(JNEXTLAT - 1)) )
+C
+ IF ( NDBG .GT. 1)
+ X CALL INTLOGR(JP_DEBUG,'JSYMLL: Next latitude = ', ZLAT)
+C
+C If required, generate the coefficients 'on the fly'
+C
+ IF( LON_FLY ) THEN
+ CALL NMAKLL( KTRUNC, PBUILD, ZLAT, 1, PLEG, NERR)
+ IOFF = 0
+ ELSE IF(LFILEIO ) THEN
+ CALL JREADLL( KLUNIT, KTRUNC, PBUILD, ZLAT, PLEG, NERR)
+ IF ( NERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'JSYMLL: JREADLL error',NERR)
+ KRET = JPROUTINE + 2
+ GOTO 990
+ ENDIF
+ ELSE
+ IOFF = NINT( (90.0 - ZLAT)/PBUILD )*(KTRUNC+1)*(KTRUNC+4)/2
+ ENDIF
+C
+C Clear unused slots in array.
+C Note there are two slots in the array - one for north latitude
+C and one for the corresponding south latitude.
+ INORTH = INORTH + 2
+ ISOUTH = INORTH + 1
+ DO 241 JF = 2*IMLIM + 1, ILN
+ PZFA(JF, INORTH) = 0.0
+ PZFA(JF, ISOUTH) = 0.0
+ 241 CONTINUE
+C
+C Now fill slots which are used
+ IMN = 0
+ IMP = 0
+C
+C timer244=Itimer(0)
+ DO JM = 1, IMLIM
+ ITAL = ILIM - JM + 1
+ ITALS = (ITAL + 1)/2
+ ITALA = ITAL/2
+#ifndef CRAY
+ CHOLD=(0.0D0, 0.0D0)
+#else
+ CHOLD = (0.0, 0.0)
+#endif
+ DO J = 1, 2*ITALS, 2
+#ifndef __uxp__
+ IF( LFILEIO ) THEN
+ CHOLD=CHOLD+PLEG(IMP+J)*PSHUP(IMN+J)
+ ELSE
+ JDCLOOP = IOFF + IMP + J
+ CHOLD=CHOLD+PLEG(JDCLOOP)*PSHUP(IMN+J)
+ ENDIF
+#else
+ JDCLOOP = IOFF + IMP + J
+ CHOLD=CHOLD+PLEG(JDCLOOP)*PSHUP(IMN+J)
+#endif
+ ENDDO
+ ZSUMS(JM)=CHOLD
+#ifndef CRAY
+ CHOLD = (0.0D0, 0.0D0)
+#else
+ CHOLD = (0.0, 0.0)
+#endif
+ DO J = 2, 2*ITALA, 2
+#ifndef __uxp__
+ IF( LFILEIO ) THEN
+ CHOLD=CHOLD+PLEG(IMP+J)*PSHUP(IMN+J)
+ ELSE
+ JDCLOOP = IOFF + IMP + J
+ CHOLD=CHOLD+PLEG(JDCLOOP)*PSHUP(IMN+J)
+ ENDIF
+#else
+ JDCLOOP = IOFF + IMP + J
+ CHOLD=CHOLD+PLEG(JDCLOOP)*PSHUP(IMN+J)
+#endif
+ ENDDO
+ ZSUMA(JM)=CHOLD
+ IMP = IMP + ITAL + 1
+ IMN = IMN + ITAL
+ ENDDO
+C timer244=Itimer(timer244)
+C
+C For the southern hemisphere row, the legendre functions are
+C the complex conjugates of the corresponding northern row -
+C hence the juggling with the signs in the next loop.
+C
+C Note that PZFA is REAL, but the coefficients being calculated
+C are COMPLEX. There are pairs of values for each coefficient
+C (real and imaginary parts) and pairs of values for each
+C latitude (north and south).
+C
+C timer246=Itimer(0)
+ DO 246 JM = 1, IMLIM
+ PZFA(2*JM -1, INORTH) = REAL(ZSUMS(JM)) + REAL(ZSUMA(JM))
+ PZFA(2*JM , INORTH) = AIMAG(ZSUMS(JM)) + AIMAG(ZSUMA(JM))
+ PZFA(2*JM -1, ISOUTH) = REAL(ZSUMS(JM)) - REAL(ZSUMA(JM))
+ PZFA(2*JM , ISOUTH) = AIMAG(ZSUMS(JM)) - AIMAG(ZSUMA(JM))
+ 246 CONTINUE
+C timer246=Itimer(timer246)
+C
+C* End of main loop through latitude rows.
+C
+ 280 CONTINUE
+C timer280=Itimer(timer280)
+C print*,'JSYMLL: legendre functions klat=',KLATO,' time:',timer280,
+C X ' seconds loop 246:',timer246,' loop 244:',timer244
+C
+C _______________________________________________________
+C
+C* Section 3. Fast fourier transform
+C _______________________________________________________
+C
+ 300 CONTINUE
+C timerFFT=Itimer(0)
+C
+ IF ( NDBG .GT. 1) CALL INTLOG(JP_DEBUG,
+ X 'JSYMLL: FFT, no.of rows (N and S) = ', ISOUTH)
+C
+ CALL FFT99(PZFA,WORK,PTRIGS,KMFAX,1,J2NFFT,KLONO,ISOUTH,1)
+C
+ IF ( NDBG .GT. 1) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JSYMLL: Values calculated by FFT:',JPQUIET)
+ DO 301 NDBGLP = 1, 20
+ CALL INTLOGR(JP_DEBUG,' ', PZFA( 1, NDBGLP ))
+ CALL INTLOGR(JP_DEBUG,' ', PZFA( 2, NDBGLP ))
+ 301 CONTINUE
+ ENDIF
+C timerFFT=Itimer(timerFFT)
+C timer1=Itimer(timer1)
+C print*,'JSYMLL: legendre functions Total:',timer1,' sec first:',
+C X timerMEM,' FFT99: ',timerFFT
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+C
+ 900 CONTINUE
+C
+ KRET = 0
+C
+ 990 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/jtimer.c b/interpolation/jtimer.c
new file mode 100755
index 0000000..99a5659
--- /dev/null
+++ b/interpolation/jtimer.c
@@ -0,0 +1,62 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <sys/times.h>
+#include <time.h>
+
+#ifndef CRAY
+#include <unistd.h>
+#endif
+
+#ifndef CRAY
+#ifdef FORTRAN_NO_UNDERSCORE
+#define JTIMER jtimer
+#else
+#define JTIMER jtimer_
+#endif
+#endif
+
+void JTIMER(const long * param)
+{
+static struct tms before, after;
+static time_t utime, stime;
+static long startime, endtime;
+
+/* If input parameter is zero, initialise the time record */
+ if ( *param == 0 )
+ {
+ startime = times(&before);
+ }
+
+/* Otherwise, publish elapsed time since last initialisation */
+ else
+ {
+ endtime = times(&after);
+
+ utime = after.tms_utime - before.tms_utime;
+ stime = after.tms_stime - before.tms_stime;
+/* Sinisa CLOCKS_PER_SEC
+ The value of this macro is the number of clock ticks per second measured by the clock function.
+
+ int CLK_TCK is an obsolete name for CLOCKS_PER_SEC.
+*/
+ printf("CPU time used in user space = %f sec\n",
+ (float) utime/(float)CLOCKS_PER_SEC);
+ printf("CPU time used by the system = %f sec\n",
+ (float) stime/(float)CLOCKS_PER_SEC);
+ printf("Wall clock time used by process = %f sec\n",
+ (float) (endtime - startime)/(float)CLOCKS_PER_SEC);
+ }
+
+ return;
+
+}
diff --git a/interpolation/juvpole.F b/interpolation/juvpole.F
new file mode 100755
index 0000000..b80bc74
--- /dev/null
+++ b/interpolation/juvpole.F
@@ -0,0 +1,219 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JUVPOLE(PSHUP, KTRUNC, PZFA, KLONO, KRET)
+C
+C---->
+C**** JUVPOLE
+C
+C Purpose
+C -------
+C This routine creates polar wind U or V components for lat/long
+C grid fields.
+C
+C
+C Interface
+C ---------
+C CALL JUVPOLE(PSHUP, KTRUNC, PZFA, KLONO, KRET)
+C
+C
+C Input parameters
+C ----------------
+C PSHUP - Spherical harmonics field, unpacked
+C KTRUNC - Truncation number of spherical harmonics field
+C KLONO - Number of longitude points in output field
+C
+C
+C Output parameters
+C -----------------
+C PZFA - Output grid point field; contains upto 32 each of
+C North and South latitude rows symmetrically.
+C KRET - Return status code
+C 0 = OK
+C
+C
+C Common block usage
+C ------------------
+C JDCNDBG
+C
+C
+C Method
+C ------
+C For each pole, creates the reduced gaussian grid lines nearest to
+C the pole and does a linear interpolation to the polar longitude.
+C
+C
+C Externals
+C ---------
+C JAGGGP - converts spectral input to a gaussian grid
+C INTLOG - Output log message
+C INTLOGR - Output log message (with real value)
+C
+C
+C Reference
+C ---------
+C None.
+C
+C Comments
+C --------
+C None.
+C
+C
+C Author
+C ------
+C J.D.Chambers ECMWF October 2002
+C
+C
+C Modifications
+C -------------
+C None.
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "jparams.h"
+#include "parim.h"
+#include "current.h"
+#include "nofld.common"
+#include "grfixed.h"
+C
+C Subroutine arguments
+C
+ COMPLEX PSHUP(*)
+ REAL PZFA(JPLONO + 2, 64)
+ INTEGER KTRUNC, KLONO, KRET
+C
+C Parameters
+C
+C Local variables
+C
+ REAL EAST, WEST, LAT, POUTF(18), ALATS(320)
+ REAL XLONG, WLEFT, XSTEP, GSTEP
+ INTEGER KPTS(320), NUM, LOOP, NLEFT, NRIGHT
+C
+C Externals
+C
+ INTEGER IGGLAT
+ EXTERNAL IGGLAT
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialization.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ KRET = 0
+C
+ NUM = 160
+ GSTEP = 360.0 / 18.0
+ XSTEP = 360.0 / REAL(KLONO)
+ EAST = 360.0 - GSTEP
+ WEST = 0.0
+C
+C -----------------------------------------------------------------|
+C* Section 2. Create North pole values
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Form the N160 reduced gaussian grid latitude near the North pole
+C
+ LAT = 90.0
+ CALL JAGGGP( PSHUP, KTRUNC, LAT, LAT, WEST, EAST,
+ X NUM, 'R', KPTS, POUTF, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JUVPOLE: problem forming Northern gaussian grid latitude',
+ X JPQUIET)
+ GOTO 900
+ ENDIF
+C
+C Interpolate to the lat/long northern latitude grid points
+C
+ DO LOOP = 1, KLONO
+C
+C Find the gaussian neighbours on either side of lat/long point
+C and their weights
+C
+ XLONG = XSTEP * REAL(LOOP-1)
+C
+ NLEFT = 1 + INT(XLONG/GSTEP)
+ NRIGHT = NLEFT + 1
+ IF( NRIGHT.GT.18 ) NRIGHT = 1
+C
+ WLEFT = 1.0 - (ABS((XLONG - (NLEFT-1)*GSTEP))/GSTEP)
+C
+ PZFA(LOOP,1) = POUTF(NLEFT)*WLEFT + POUTF(NRIGHT)*(1.0-WLEFT)
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 3. Create South pole values
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Store latitude and point count values for the next call to JAGGGP
+C which uses the 'U' option (user supplied values).
+C
+ NOGAUSO = NUM
+C
+ KRET = IGGLAT(NUM*2, ALATS, 1, 1)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR, 'JUVPOLE: IGGLAT call failed',KRET)
+ KRET = KRET
+ GOTO 900
+ ENDIF
+C
+ DO LOOP = 1, NUM*2
+ NOLPTS(LOOP) = KPTS(LOOP)
+ ROGAUSS(LOOP) = ALATS(LOOP)
+ ENDDO
+C
+C Form the N160 reduced gaussian grid latitude near the South pole
+C
+ LAT = -90.0
+ CALL JAGGGP( PSHUP, KTRUNC, LAT, LAT, WEST, EAST,
+ X NUM, 'U', KPTS, POUTF, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'JUVPOLE: problem forming Southern gaussian grid latitude',
+ X JPQUIET)
+ GOTO 900
+ ENDIF
+C
+C Interpolate to the lat/long southern latitude grid points
+C
+ DO LOOP = 1, KLONO
+C
+C Find the gaussian neighbours on either side of lat/long point
+C and their weights
+C
+ XLONG = XSTEP * REAL(LOOP-1)
+C
+ NLEFT = 1 + INT(XLONG/GSTEP)
+ NRIGHT = NLEFT + 1
+ IF( NRIGHT.GT.18 ) NRIGHT = 1
+C
+ WLEFT = 1.0 - (ABS((XLONG - (NLEFT-1)*GSTEP))/GSTEP)
+C
+ PZFA(LOOP,2) = POUTF(NLEFT)*WLEFT + POUTF(NRIGHT)*(1.0-WLEFT)
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/jvod2uv.F b/interpolation/jvod2uv.F
new file mode 100755
index 0000000..eaace6a
--- /dev/null
+++ b/interpolation/jvod2uv.F
@@ -0,0 +1,200 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JVOD2UV( VOR, DIV, KTIN, U, V, KTOUT)
+C
+C---->
+C**** JVOD2UV
+C
+C Purpose
+C -------
+C
+C Calculate spherical harmonic coefficients of U*cos(lat) and
+C V*cos(lat) at triangular truncation KTOUT, given the coefficients
+C of divergence and vorticity at truncation KTIN.
+C
+C
+C Interface
+C ---------
+C
+C CALL JVOD2UV( VOR, DIV, KTIN, U, V, KTOUT)
+C
+C Input
+C -----
+C
+C VOR(KDIM1) = array of vorticity coefficients
+C DIV(KDIM1) = array of divergence coefficients
+C KTIN = triangular truncation
+C where KDIM1 = (KTIN+1)*(KTIN+2)
+C
+C
+C Output
+C ------
+C
+C U(KDIM2) = output array of U*cos(lat) coefficients
+C V(KDIM2) = output array of V*cos(lat) coefficients
+C KTOUT = output triangular truncation (KTOUT.le.KTIN)
+C where KDIM2 = (KTOUT+1)*(KTOUT+4)
+C
+C
+C Method
+C ------
+C
+C ??
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C Jan Haseler ECMWF 5th January 1981
+C
+C
+C Modifications
+C -------------
+C
+C D. R. Roskilly ECMWF 5th May 1987
+C Avoid calculating the extra values for U and V components so
+C that vorticity and divergence can be re-calculated if required.
+C
+C ?? ?? 15th February 1988
+C Subroutine renamed VOD2UV from DVTOUV.
+C
+C K.Rider ECMWF 21st August 1991
+C Version 2 inconsistently truncated U and V to T(ITOUT-1).
+C Changed so that vorticity and divergence are consistently truncated
+C to T105 (sic).
+C U and V are calculated with truncation T(ITOUT),with zero values at
+C the corner.
+C Vorticity and divergence can be recalculated if required, but only
+C truncated to T(ITOUT) since the higher coefficients have been lost.
+C
+C J.D.Chambers ECMWF 26th January 1995
+C Cleaned up code (?!)
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+ COMPLEX VOR(*), DIV(*), U(*), V(*)
+ INTEGER KTIN, KTOUT
+C
+C Local variables
+ INTEGER K, IMN, ITOUT, JM, JN, JMP, LOOP, SIZE
+ REAL REARTH, ZM, ZN
+ COMPLEX ZI
+C
+C Statement functions
+ REAL DD, SS
+ REAL PM, PN
+ DD(PM,PN) = -SQRT((PN*PN-PM*PM)/(4.*PN*PN-1.))/PN
+ SS(PM,PN) = -PM/(PN*(PN+1.))
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ ZI = (0.0, 1.0)
+ REARTH = 6.371E6
+ K = 1
+ IMN = 1
+Cjdc ITOUT = MIN0(KTOUT,KTIN)
+ ITOUT = KTOUT
+ SIZE = (ITOUT+1)*(ITOUT+2)/2
+ DO LOOP = 1, SIZE
+ U(LOOP) = 0.0
+ V(LOOP) = 0.0
+ ENDDO
+C
+C ------------------------------------------------------------------
+C* Section 2. Handle coefficients for M < ITOUT; N = M
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ DO 255 JM = 1,ITOUT
+C
+ ZM = JM - 1.0
+ ZN = ZM
+C
+ IF ( JM.GT.1 ) THEN
+ U(K) = (-DD(ZM,ZN+1.)*VOR(IMN+1)+ZI*SS(ZM,ZN)*DIV(IMN))*REARTH
+ V(K) = ( DD(ZM,ZN+1.)*DIV(IMN+1)+ZI*SS(ZM,ZN)*VOR(IMN))*REARTH
+ ELSE
+ U(K) = (-DD(ZM,ZN+1.)*VOR(IMN+1))*REARTH
+ V(K) = ( DD(ZM,ZN+1.)*DIV(IMN+1))*REARTH
+ ENDIF
+C
+ IMN = IMN + 1
+ K = K + 1
+ JMP = JM + 1
+C
+C When N < ITOUT-1
+C
+ IF (JMP.LT.ITOUT) THEN
+ DO 235 JN = JMP, ITOUT-1
+ ZN = JN - 1.0
+ U(K) = ( DD(ZM,ZN)*VOR(IMN-1)-DD(ZM,ZN+1)*VOR(IMN+1)
+ X +ZI*SS(ZM,ZN)*DIV(IMN))*REARTH
+ V(K) = (-DD(ZM,ZN)*DIV(IMN-1)+DD(ZM,ZN+1)*DIV(IMN+1)
+ X +ZI*SS(ZM,ZN)*VOR(IMN))*REARTH
+C
+ K = K + 1
+ IMN = IMN + 1
+C
+ 235 CONTINUE
+C
+C When N = ITOUT - 1
+C
+ ZN = ITOUT - 1
+ U(K) = ( DD(ZM,ZN)*VOR(IMN-1)+ZI*SS(ZM,ZN)*DIV(IMN))*REARTH
+ V(K) = (-DD(ZM,ZN)*DIV(IMN-1)+ZI*SS(ZM,ZN)*VOR(IMN))*REARTH
+ K = K + 1
+ IMN = IMN + 1
+ ENDIF
+C
+C When N = ITOUT
+C
+ ZN = ITOUT
+ U(K) = ( DD(ZM,ZN)*VOR(IMN-1))*REARTH
+ V(K) = (-DD(ZM,ZN)*DIV(IMN-1))*REARTH
+ K = K + 1
+C
+C When N = ITOUT + 1
+C
+ IMN = IMN + 1 + KTIN-ITOUT
+C
+ 255 CONTINUE
+C
+C ------------------------------------------------------------------
+C* Section 3. Handle coefficients for M = ITOUT.
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C When N = ITOUT
+C
+ U(K) = 0.0
+ V(K) = 0.0
+C
+C Ignore M = ITOUT; N = ITOUT + 1
+C
+C K = K + 1
+C
+ RETURN
+ END
diff --git a/interpolation/jwindll.F b/interpolation/jwindll.F
new file mode 100755
index 0000000..3524cc5
--- /dev/null
+++ b/interpolation/jwindll.F
@@ -0,0 +1,459 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JWINDLL( PSHUP, KTRUNC, PSTART, PBUILD, PINTVL, KLUNIT,
+ X KLATO,KLONO,PLEG,PTRIGS,KMFAX,PZFA,KRET)
+C
+C---->
+C**** JWINDLL
+C
+C Purpose
+C -------
+C This routine converts spectral input fields to standard
+C lat/long grid fields for wind components U and V.
+C
+C
+C Interface
+C ---------
+C CALL JWINDLL( PSHUP, KTRUNC, PSTART, PBUILD, PINTVL, KLUNIT,
+C X KLATO,KLONO,PLEG,PTRIGS,KMFAX,PZFA,KRET)
+C
+C
+C Input parameters
+C ----------------
+C PSHUP - Spherical harmonics field, unpacked
+C KTRUNC - Truncation number of spherical harmonics field
+C PSTART - Start latitude (northernmost) for output field
+C (must be positive - see comments below)
+C PBUILD - Grid interval used to build the legendre coefficients file
+C PINTVL - Grid latitude interval in degrees
+C KLUNIT - stream number of the legendre function file
+C KLATO - Number of latitude points in output field
+C KLONO - Number of longitude points in output field
+C PLEG - Array used to hold legendre functions
+C PTRIGS - Initialized array of trig.functions (setup by JJSET99)
+C KMFAX - Initialized array of prime factors (setup by JJSET99)
+C
+C
+C Output parameters
+C -----------------
+C PZFA - Output grid point field; contains upto 32 each of
+C North and South latitude rows symmetrically.
+C KRET - Return status code
+C 0 = OK
+C
+C
+C Common block usage
+C ------------------
+C JDCNDBG
+C
+C
+C Method
+C ------
+C None.
+C
+C
+C Externals
+C ---------
+C JREADLL - Reads the legendre functions for a latitude
+C JSPPOLE - Applies correction at North or South pole
+C FFT99 - Carries out FFT
+C INTLOG - Output log message
+C INTLOGR - Output log message (with real value)
+C GETENV - Pick up contents of an environment variable
+C JUVPOLE - Use gaussian grid to calculate U and V at the poles
+C
+C
+C Reference
+C ---------
+C E.C.M.W.F. Research Department technical memorandum no. 56
+C "The forecast and analysis post-processing package"
+C May 1982. J.Haseler.
+C
+C
+C Comments
+C --------
+C This is a redesign, based on SPECGP.F
+C
+C It handles transformation to a regular lat/long grid.
+C The generated grid is symmetrical about the equator, so
+C PSTART must be positive.
+C
+C It is only for U and V fields (correction is applied at the
+C poles and a scale factor is applied according to latitude).
+C
+C
+C Author
+C ------
+C J.D.Chambers *ECMWF* Nov 1993
+C
+C
+C Modifications
+C -------------
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C J.D.Chambers ECMWF October 2002
+C Add handling for U/V spectral (as opposed to Ucos(theta)/Vcos(theta))
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C
+C
+ IMPLICIT NONE
+#include "jparams.h"
+#include "parim.h"
+#include "nifld.common"
+C
+C Subroutine arguments
+C
+ COMPLEX PSHUP
+ DIMENSION PSHUP(*)
+ INTEGER KTRUNC
+ REAL PSTART, PBUILD, PINTVL
+ INTEGER KLUNIT, KLATO, KLONO, KMFAX, KRET
+ REAL PLEG, PTRIGS, PZFA
+ DIMENSION PZFA(JPLONO + 2, 64)
+ DIMENSION KMFAX(*), PLEG(*), PTRIGS(*)
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 31400 )
+C
+C Local variables
+C
+ REAL ZPIBY2, ZDEGR, ZLAT
+ INTEGER ILIM, IMLIM, ILN
+ INTEGER ITAL, ITALA, ITALS, IMN, IMP
+ INTEGER INORTH, ISOUTH
+ INTEGER JM, J245, JNEXTLAT
+ INTEGER NERR
+ INTEGER IOFF
+ INTEGER JDCLOOP
+ REAL ZF
+ REAL ZCOSI
+C
+ DIMENSION ZF(2*JPFFT)
+C
+#ifdef POINTER_64
+ INTEGER*8 IWORK
+#endif
+ REAL WORK
+ DIMENSION WORK(1)
+ POINTER ( IWORK, WORK )
+ COMPLEX ZDUM(JPTRNC + 1)
+ COMPLEX ZSUMS(JPTRNC + 1), ZSUMA(JPTRNC + 1)
+ COMPLEX*16 CHOLD
+ INTEGER LOOP
+C
+ LOGICAL LXFIRST, LPLAINU
+ INTEGER ISIZE, IBLANK
+ CHARACTER*10 PLAINUV
+C
+ DATA LXFIRST/.TRUE./, LPLAINU/.FALSE./
+ DATA ISIZE/0/
+ SAVE ISIZE, IWORK, LXFIRST, LPLAINU
+C
+C Statement function
+C
+ LOGICAL GPOLE
+ REAL ANGLE
+ GPOLE(ANGLE) = ( ABS(90.0 - ABS(ANGLE) ) .LT. 1.0E-3 )
+C = .TRUE. if LAT is 90.0 or -90.0
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialization.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+C Check environment variable to see if wind components are plain
+C U and V, or U*cos(theta) and V*cos(theta) (the default).
+C
+ IF( LXFIRST ) THEN
+C
+ LXFIRST = .FALSE.
+ CALL GETENV('INTERP_PLAIN_UV', PLAINUV)
+ IBLANK = INDEX(PLAINUV, ' ')
+C
+ IF( (IBLANK.EQ.3).AND.(PLAINUV(1:2).EQ.'ON') ) LPLAINU =.TRUE.
+ IF( (IBLANK.EQ.3).AND.(PLAINUV(1:2).EQ.'on') ) LPLAINU =.TRUE.
+ IF( (IBLANK.EQ.4).AND.(PLAINUV(1:3).EQ.'YES') ) LPLAINU =.TRUE.
+ IF( (IBLANK.EQ.4).AND.(PLAINUV(1:3).EQ.'yes') ) LPLAINU =.TRUE.
+C
+ IF( (IBLANK.EQ.3).AND.(PLAINUV(1:2).EQ.'NO') ) LPLAINU =.FALSE.
+ IF( (IBLANK.EQ.3).AND.(PLAINUV(1:2).EQ.'no') ) LPLAINU =.FALSE.
+ IF( (IBLANK.EQ.4).AND.(PLAINUV(1:3).EQ.'OFF') ) LPLAINU =.FALSE.
+ IF( (IBLANK.EQ.4).AND.(PLAINUV(1:3).EQ.'off') ) LPLAINU =.FALSE.
+C
+C First time through, dynamically allocate memory for workspace
+C
+ ISIZE = 2*JPFFT*64
+ CALL JMEMHAN( 9, IWORK, ISIZE, 1, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JWINDLL: memory allocation error',IWORK)
+ KRET = JPROUTINE + 1
+ GOTO 990
+ ENDIF
+ ENDIF
+C
+ IF( NDBG.GT.1 ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JWINDLL: Spherical harmonic coeffs(first 20):',JPQUIET)
+ DO NDBGLP = 1, 20
+ CALL INTLOGR(JP_DEBUG,' ',PSHUP( NDBGLP ))
+ ENDDO
+ CALL INTLOG(JP_DEBUG,
+ X 'JWINDLL: Input parameters:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'JWINDLL: Spherical harmonic truncation = ', KTRUNC)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JWINDLL: Start latitude(northernmost) = ', PSTART)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JWINDLL: Grid lat. interval(leg. file) = ', PBUILD)
+ CALL INTLOGR(JP_DEBUG,
+ X 'JWINDLL: Grid lat. interval(degrees) = ', PINTVL)
+ CALL INTLOG(JP_DEBUG,
+ X 'JWINDLL: Stream number of leg. file = ', KLUNIT)
+ CALL INTLOG(JP_DEBUG,
+ X 'JWINDLL: Number of lat. rows in output = ', KLATO)
+ CALL INTLOG(JP_DEBUG,
+ X 'JWINDLL: Number of long. pts per row = ', KLONO)
+ CALL INTLOG(JP_DEBUG,
+ X 'JWINDLL: Trig.functions (setup by JJSET99):',JPQUIET)
+ DO NDBGLP = 1, 10
+ CALL INTLOGR(JP_DEBUG,' ',PTRIGS( NDBGLP ))
+ ENDDO
+ CALL INTLOG(JP_DEBUG,
+ X 'JWINDLL: Prime factors (setup by JJSET99):',JPQUIET)
+ DO NDBGLP = 1, 10
+ CALL INTLOG(JP_DEBUG,' ',KMFAX( NDBGLP ))
+ ENDDO
+ ENDIF
+C
+ ZPIBY2 = PPI / 2.0
+ ZDEGR = PPI / 180.0
+ ILIM = KTRUNC + 1
+ IMLIM = KTRUNC + 1
+ INORTH = -1
+ ILN = KLONO + 2
+C
+C -----------------------------------------------------------------|
+C* Section 2. Main loop through latitude rows to
+C* calculate fourier coefficients
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C For each latitude, the north and corresponding south latitude row
+C are calculated at the same time from the same legendre functions.
+C
+ DO 280 JNEXTLAT = 1, KLATO
+ ZLAT = ( PSTART - (PINTVL * REAL(JNEXTLAT - 1)) )
+C
+ IF( NDBG.GT.1 )
+ X CALL INTLOGR(JP_DEBUG, 'JWINDLL: Next latitude = ', ZLAT)
+C
+C If required, generate the coefficients 'on the fly'
+C
+ IF( LON_FLY ) THEN
+ CALL NMAKLL( KTRUNC, PBUILD, ZLAT, 1, PLEG, NERR)
+ IOFF = 0
+ ELSE IF( LFILEIO ) THEN
+ CALL JREADLL( KLUNIT, KTRUNC, PBUILD, ZLAT, PLEG, NERR)
+ IF ( NERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,'JWINDLL: JREADLL error',NERR)
+ KRET = JPROUTINE + 2
+ GOTO 990
+ ENDIF
+ ELSE
+ IOFF = NINT( (90.0 - ZLAT)/PBUILD )*(KTRUNC+1)*(KTRUNC+4)/2
+ ENDIF
+C
+C Clear unused slots in array.
+C Note there are two slots in the array - one for north latitude
+C and one for the corresponding south latitude.
+ INORTH = INORTH + 2
+ ISOUTH = INORTH + 1
+ DO LOOP = 1, ILN
+ ZF( LOOP) = 0.0
+ PZFA( LOOP, INORTH) = 0.0
+ PZFA( LOOP, ISOUTH) = 0.0
+ ENDDO
+C
+C For spectral Ucos(theta), Vcos(theta), treat the poles as a
+C special case.
+C
+ IF( GPOLE(ZLAT).AND.(.NOT.LPLAINU) ) THEN
+C
+ IF( NDBG.GT.1 ) CALL INTLOG(JP_DEBUG,
+ X 'JWINDLL: Pole special for spectral Ucos(t), Vcos(t)',
+ X JPQUIET)
+C
+ CALL JSPPOLE( PSHUP, 1, KTRUNC, .TRUE., ZF)
+ DO LOOP = 1, ILN
+ PZFA( LOOP, INORTH) = ZF( LOOP)
+ ENDDO
+C
+ CALL JSPPOLE( PSHUP, 0, KTRUNC, .TRUE., ZF)
+ DO LOOP = 1, ILN
+ PZFA( LOOP, ISOUTH) = ZF( LOOP)
+ ENDDO
+C
+ ELSE
+C
+C Otherwise not at pole, or spectral U and V
+C
+C Fill slots which are used
+ IMN = 0
+ IMP = 0
+C
+ DO 247 JM = 1, IMLIM
+ ITAL = ILIM - JM + 1
+ DO 245 J245 = 1, ITAL
+#ifndef __uxp__
+ IF( LFILEIO ) THEN
+ ZDUM(J245) = PLEG(IMP + J245)*PSHUP(IMN + J245)
+ ELSE
+ JDCLOOP = IOFF + IMP + J245
+ ZDUM(J245) = PLEG(JDCLOOP)*PSHUP(IMN + J245)
+ ENDIF
+#else
+ JDCLOOP = IOFF + IMP + J245
+ ZDUM(J245) = PLEG(JDCLOOP)*PSHUP(IMN + J245)
+#endif
+ 245 CONTINUE
+ IMP = IMP + ITAL + 1
+ IMN = IMN + ITAL
+ ITALS = (ITAL + 1)/2
+ ITALA = ITAL/2
+#ifndef CRAY
+ CHOLD = (0.0D0, 0.0D0)
+#else
+ CHOLD = (0.0, 0.0)
+#endif
+ DO LOOP = 1, 2*ITALS, 2
+ CHOLD = CHOLD + ZDUM(LOOP)
+ ENDDO
+ ZSUMS(JM) = CHOLD
+#ifndef CRAY
+ CHOLD = (0.0D0, 0.0D0)
+#else
+ CHOLD = (0.0, 0.0)
+#endif
+ DO LOOP = 2, 2*ITALA, 2
+ CHOLD = CHOLD + ZDUM(LOOP)
+ ENDDO
+ ZSUMA(JM) = CHOLD
+ 247 CONTINUE
+C
+C For the southern hemisphere row, the legendre functions are
+C the complex conjugates of the corresponding northern row -
+C hence the juggling with the signs in the next loop.
+C
+C Note that PZFA is REAL, but the coefficients being calculated
+C are COMPLEX. There are pairs of values for each coefficient
+C (real and imaginary parts) and pairs of values for each
+C latitude (north and south).
+C
+ DO JM = 1, IMLIM
+ PZFA(2*JM -1, INORTH) = REAL(ZSUMS(JM)) + REAL(ZSUMA(JM))
+ PZFA(2*JM , INORTH) = AIMAG(ZSUMS(JM)) + AIMAG(ZSUMA(JM))
+ PZFA(2*JM -1, ISOUTH) = REAL(ZSUMS(JM)) - REAL(ZSUMA(JM))
+ PZFA(2*JM , ISOUTH) = AIMAG(ZSUMS(JM)) - AIMAG(ZSUMA(JM))
+ ENDDO
+ ENDIF
+C
+C* End of main loop through latitude rows.
+C
+ 280 CONTINUE
+C
+C -----------------------------------------------------------------|
+C* Section 3. Fast fourier transform
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( NDBG.GT.1 ) CALL INTLOG(JP_DEBUG,
+ X 'JWINDLL: FFT, no.of rows (N and S) = ', ISOUTH)
+C
+ CALL FFT99(PZFA,WORK,PTRIGS,KMFAX,1,J2NFFT,KLONO,ISOUTH,1)
+C
+ IF( NDBG.GT.1 ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JWINDLL: Values calculated by FFT:',JPQUIET)
+ DO NDBGLP = 1, 20
+ CALL INTLOGR(JP_DEBUG,' ',PZFA( 1, NDBGLP ))
+ CALL INTLOGR(JP_DEBUG,' ',PZFA( 2, NDBGLP ))
+ ENDDO
+ ENDIF
+C
+C For spectral U, V generate the poles from a reduced gaussian line
+C of latitude.
+C
+ IF( GPOLE(PSTART).AND.(LPLAINU) ) THEN
+C
+ IF( NDBG.GT.1 ) CALL INTLOG(JP_DEBUG,
+ X 'JWINDLL: Poles generated from gaussian for spectral U, V',
+ X JPQUIET)
+C
+ CALL JUVPOLE(PSHUP, KTRUNC, PZFA, KLONO, KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'JWINDLL: pole wind create error',IWORK)
+ KRET = JPROUTINE + 1
+ GOTO 990
+ ENDIF
+C
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4. For spectral Ucos(theta), Vcos(theta), apply scale
+C factor to all latitudes except poles.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ IF( NDBG.GT.0 ) THEN
+ IF( LPLAINU ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'JWINDLL: Do not apply scale to latitudes',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'JWINDLL: Apply scale to latitudes',JPQUIET)
+ ENDIF
+ ENDIF
+C
+ IF( .NOT.LPLAINU ) THEN
+ INORTH = -1
+ DO JNEXTLAT = 1, KLATO
+ ZLAT = ( PSTART - (PINTVL * REAL(JNEXTLAT - 1)) )
+ INORTH = INORTH + 2
+ ISOUTH = INORTH + 1
+ IF( .NOT.GPOLE(ZLAT) ) THEN
+ ZCOSI = 1.0 / COS( ZLAT * ZDEGR )
+ CALL SSCAL( KLONO, ZCOSI, PZFA( 2, INORTH), 1)
+ CALL SSCAL( KLONO, ZCOSI, PZFA( 2, ISOUTH), 1)
+ ENDIF
+ ENDDO
+C
+ ENDIF
+C -----------------------------------------------------------------|
+C* Section 9. Return to calling routine. Format statements
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ KRET = 0
+C
+ 990 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/jwscal.F b/interpolation/jwscal.F
new file mode 100755
index 0000000..541c46f
--- /dev/null
+++ b/interpolation/jwscal.F
@@ -0,0 +1,154 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE JWSCAL( PZFA, KLATS, KLONS, KFIRST, PLATS)
+C
+C---->
+C**** JWSCAL
+C
+C PURPOSE
+C _______
+C
+C This routine applies a scale factor to all latitudes except
+C the poles
+C
+C INTERFACE
+C _________
+C
+C CALL JWSCAL( PZFA, KLATS, KLONS, KFIRST, PLATS)
+C
+C Input parameters
+C ________________
+C
+C PZFA - Array of wind field (U or V) fourier coefficients
+C KLATS - Number of latitude lines in PZFA
+C KLONS - Number of longitude points in each line of latitude
+C KFIRST - First latitude to process in PLATS
+C PLATS - Array of gaussian latitudes (degrees)
+C
+C Output parameters
+C ________________
+C
+C PZFA - Modified array of fourier coefficients
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C Method
+C ______
+C
+C Apply latitude-dependent scale factor to all coefficients.
+C It is assumed that no latitude is at the North or South pole.
+C
+C Externals
+C _________
+C
+C SSCAL - Apply scalar correction to row of values
+C
+C
+C Reference
+C _________
+C
+C None
+C
+C
+C Comments
+C ________
+C
+C PZFA contains pairs of north/south latitudes.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* Jan 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+ IMPLICIT NONE
+C
+#include "jparams.h"
+C
+C Subroutine arguments
+C
+ REAL PZFA
+ DIMENSION PZFA(JPLONO+2, 64)
+ INTEGER KLATS, KLONS, KFIRST
+ REAL PLATS
+ DIMENSION PLATS(*)
+C
+C Local variables
+C
+ INTEGER JNEXTLAT, INORTH, ISOUTH
+ REAL ZCOSI, ZLAT, ZPIBY2, ZDEGR
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+ ZPIBY2 = PPI / 2.0
+ ZDEGR = PPI / 180.0
+C
+C _______________________________________________________
+C
+C* Section 2. Apply scale factor to all latitudes.
+C _______________________________________________________
+C
+ 200 CONTINUE
+ INORTH = -1
+ DO 220 JNEXTLAT = 1, KLATS
+ ZLAT = PLATS( KFIRST + JNEXTLAT - 1 )
+ INORTH = INORTH + 2
+ ISOUTH = INORTH + 1
+ ZCOSI = 1.0 / COS( ZLAT * ZDEGR )
+ CALL SSCAL( KLONS, ZCOSI, PZFA( 2, INORTH), 1)
+ CALL SSCAL( KLONS, ZCOSI, PZFA( 2, ISOUTH), 1)
+ 220 CONTINUE
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/kintrg.F b/interpolation/kintrg.F
new file mode 100755
index 0000000..132e236
--- /dev/null
+++ b/interpolation/kintrg.F
@@ -0,0 +1,270 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION KINTRG(OLDGEO,NEWGEO,OLDFLD,NEWFLD)
+C
+C---->
+C**** KINTRG
+C
+C Purpose
+C -------
+C Interpolate a reduced gaussian field a reduced gaussian field
+C with a different resolution.
+C
+C
+C Interface
+C ---------
+C IRET = KINTRG(OLDGEO,NEWGEO,OLDFLD,NEWFLD)
+C
+C Input
+C -----
+C OLDGEO - GRIB section 2 describing grid of old field.
+C NEWGEO - GRIB section 2 describing grid of new field.
+C OLDFLD - Array of values for old field.
+C
+C
+C Output
+C ------
+C NEWFLD - Array of values for new field.
+C
+C Function returns:
+C - number of points in the new field, if all is well
+C - negative, otherwise.
+C
+C
+C Method
+C ------
+C Build up field offsets from input geometries.
+C For each point of the new field, find in the old field the four
+C nearest neighbours' positions and values.
+C Calculate new value from the neighbours.
+C
+C
+C Externals
+C ---------
+C IGGLAT - Compute gaussian lines of latitude.
+C JNORSGG - Find gaussian latitudes to north and south of latitude.
+C KNFROM4 - Calculate value of new field point.
+C INTLOG - Log messages
+C
+C
+C Author
+C ------
+C J.D.Chambers ECMWF November 2000
+C
+C Modifications
+C -------------
+C
+C Force nearest neighbour processing with env variable or
+C INTOUT parameter
+C S.Curic ECMWF September 2005
+C
+C Add fudging factor for computation of index in original field
+C S.Curic ECMWF October 2006
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER OLDGEO(*),NEWGEO(*)
+ REAL OLDFLD(*),NEWFLD(*)
+C
+#include "intisl.h"
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Parameters
+C
+ INTEGER JPMAXNG
+ PARAMETER (JPMAXNG=4000)
+C
+C Local variables
+C
+ LOGICAL LVEGGY
+ INTEGER TOTAL, NEXT, LOOP, NEWOFF(JPMAXNG), OLDOFF(JPMAXNG)
+ INTEGER LATIT, LONG, NEWTYPE, IRET, NPTS
+ INTEGER LAT(2), LON(4)
+ INTEGER PT(4), TYPE(4)
+ REAL OLAT(2), OLON(4)
+ REAL RLATOLD(JPMAXNG), RLATNEW(JPMAXNG), RLAT, RLON
+ CHARACTER*12 YFLAG,YFLAG1
+C
+C Externals
+C
+ INTEGER IGGLAT, JNORSGG
+ REAL KNFROM4
+ EXTERNAL IGGLAT, JNORSGG, KNFROM4
+C
+C -----------------------------------------------------------------|
+C* Section 1. Build working values using input geometries.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ KINTRG = 0
+C
+ IF( (NEWGEO(NGAUSS)*2).GT.JPMAXNG ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'KINTRG: Gaussian N too big = ',NEWGEO(NGAUSS))
+ CALL INTLOG(JP_ERROR,'KINTRG: Maximum handled = ',(JPMAXNG/2))
+ KINTRG = -1
+ GOTO 900
+ ENDIF
+C
+cs set global for grib_api
+ LGLOBL = .TRUE.
+cs
+ LVEGGY = (NITABLE.EQ.128).AND.
+ X ((NIPARAM.EQ.27).OR.
+ X (NIPARAM.EQ.28).OR.
+ X (NIPARAM.EQ.29).OR.
+ X (NIPARAM.EQ.30).OR.
+ X (NIPARAM.EQ.43) )
+C Force nearest neighbour processing with env variable
+ CALL GETENV('NEAREST_NEIGHBOUR', YFLAG)
+ IF( YFLAG(1:1).EQ.'1' ) LVEGGY = .TRUE.
+
+C Force nearest neighbour processing with INTOUT parameter
+ IF( LMETHOD ) LVEGGY = .TRUE.
+
+ IF( LVEGGY ) CALL INTLOG(JP_DEBUG,
+ X 'KINTRG: nearest neighbour processing (vegetation)',JPQUIET)
+C
+C -----------------------------------------------------------------|
+C* Section 2. Calculate number of points in new field and offset
+C to start of each latitude in the new grid
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ NEWOFF(1) = 0
+ TOTAL = NEWGEO(NPOINTS)
+ DO LOOP = 2, NEWGEO(NJ)
+ NEWOFF(LOOP) = NEWOFF(LOOP-1) + NEWGEO(NPOINTS-2+LOOP)
+ TOTAL = TOTAL + NEWGEO(NPOINTS-1+LOOP)
+ ENDDO
+C
+C Get the gaussian latitudes for the new field
+C
+ IRET = IGGLAT(NEWGEO(NGAUSS)*2,RLATNEW,0,-1)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'KINTRG: Problem call igglat for new grid'
+ KINTRG = -1
+ RETURN
+ ENDIF
+C
+ CALL INTLOG(JP_DEBUG,'KINTRG: No. of pts in new field = ',TOTAL)
+C
+C -----------------------------------------------------------------|
+C* Section 3. Get the gaussian latitudes for the old field and
+C setup the offsets to the start of each latitude.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ OLDOFF(1) = 0
+ DO LOOP = 2, OLDGEO(NJ)
+ OLDOFF(LOOP) = OLDOFF(LOOP-1) + OLDGEO(NPOINTS-2+LOOP)
+ ENDDO
+C
+ IRET = IGGLAT(OLDGEO(NGAUSS)*2,RLATOLD,0,-1)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'KINTRG: Problem call igglat for old grid'
+ KINTRG = -1
+ RETURN
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4. Work through the points in the new field.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ DO NEXT = 1, TOTAL
+C
+C Calculate lat/long
+C
+ DO LOOP = 1, NEWGEO(NJ)
+ IF( NEWOFF(LOOP).GE.NEXT ) THEN
+ LATIT = LOOP - 1
+ GOTO 410
+ ENDIF
+ ENDDO
+ LATIT = NEWGEO(NJ)
+C
+ 410 CONTINUE
+C
+ LONG = NEXT - NEWOFF(LATIT)
+C
+ RLAT = RLATNEW(LATIT)
+ RLON = (REAL(LONG-1)*360.0)/REAL(NEWGEO(NPOINTS+LATIT-1))
+C
+C Find four neighbours in the old field with their types
+C (Find NW neighbour and deduce the others).
+C
+ LAT(NORTH) = JNORSGG(RLAT,RLATOLD,OLDGEO(NGAUSS),1)
+ LAT(SOUTH) = JNORSGG(RLAT,RLATOLD,OLDGEO(NGAUSS),0)
+C
+ OLAT(NORTH) = RLATOLD(LAT(NORTH))
+ OLAT(SOUTH) = RLATOLD(LAT(SOUTH))
+C
+ NPTS = OLDGEO(NPOINTS-1+LAT(NORTH))
+
+ LON(NWEST) = 1 + INT(RLON/(360.0/REAL(NPTS)))
+
+ LON(NEAST) = LON(NWEST) + 1
+ IF( LON(NEAST).GT.NPTS ) LON(NEAST) = 1
+C
+ OLON(NWEST) = (REAL(LON(NWEST)-1)*360.0)/REAL(NPTS)
+ IF( LON(NEAST).EQ.1 ) THEN
+ OLON(NEAST) = 360.0
+ ELSE
+ OLON(NEAST) = (REAL(LON(NEAST)-1)*360.0)/REAL(NPTS)
+ ENDIF
+C
+ NPTS = OLDGEO(NPOINTS-1+LAT(SOUTH))
+
+ LON(SWEST) = 1 + INT(RLON/(360.0/REAL(NPTS)))
+
+ LON(SEAST) = LON(SWEST) + 1
+ IF( LON(SEAST).GT.NPTS ) LON(SEAST) = 1
+C
+ OLON(SWEST) = (REAL(LON(SWEST)-1)*360.0)/REAL(NPTS)
+ IF( LON(SEAST).EQ.1 ) THEN
+ OLON(SEAST) = 360.0
+ ELSE
+ OLON(SEAST) = (REAL(LON(SEAST)-1)*360.0)/REAL(NPTS)
+ ENDIF
+C
+ PT(NWEST) = OLDOFF(LAT(NORTH)) + LON(NWEST)
+ PT(NEAST) = OLDOFF(LAT(NORTH)) + LON(NEAST)
+ PT(SWEST) = OLDOFF(LAT(SOUTH)) + LON(SWEST)
+ PT(SEAST) = OLDOFF(LAT(SOUTH)) + LON(SEAST)
+C
+C Interpolate the new value
+C
+ NEWFLD(NEXT) = KNFROM4(LVEGGY,RLAT,RLON,OLAT,OLON,PT,OLDFLD)
+C
+ ENDDO
+C
+ KINTRG = TOTAL
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
+
diff --git a/interpolation/knfrom4.F b/interpolation/knfrom4.F
new file mode 100755
index 0000000..a7a5078
--- /dev/null
+++ b/interpolation/knfrom4.F
@@ -0,0 +1,176 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ REAL FUNCTION KNFROM4(LVEGGY,RLAT,RLON,OLAT,OLON,PT,OLDFLD)
+C
+C---->
+C**** KNFROM4
+C
+C Purpose
+C -------
+C
+C Generates a new field point from its four nearest neighbours.
+C
+C
+C Interface
+C ---------
+C
+C VALUE = KNFROM4(RLAT,RLON,OLAT,OLON,PT,OLDFLD)
+C
+C Input
+C -----
+C
+C LVEGGY - 'True' if 'nearest neighbour' processing required
+C RLAT - Latitude of the new point
+C RLON - Longitude of the new point
+C OLAT - Latitudes of the four neighbouring points
+C OLON - Longitudes of the four neighbouring points
+C PT - Positions in old field array of the four neighbours
+C OLDFLD - Array of old field values
+C
+C
+C Output
+C ------
+C
+C Function returns a value for the new field point.
+C
+C
+C Method
+C ------
+C
+C Uses neighbours to calculate a value by bi-linear interpolation.
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF November 2000
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ LOGICAL LVEGGY
+ REAL RLAT,RLON,OLAT(2),OLON(4),OLDFLD(*)
+ INTEGER PT(4)
+C
+#include "intisl.h"
+#include "parim.h"
+#include "nifld.common"
+C
+C Local variables
+C
+ INTEGER COUNT, LOOP, NEAREST
+ REAL WEIGHT(4), NWEIGHT, SWEIGHT, NORMAL
+C
+C Externals
+C
+C
+C Statement function
+C
+ REAL A, B
+ LOGICAL NOTEQ
+ NOTEQ(A,B) = (ABS((A)-(B)).GT.(ABS(A)*1E-3))
+C
+C -----------------------------------------------------------------|
+C* Section 1. Calculate weighting values for each neighbour
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+C Calculate the north/south weighting values allowing for
+C southern latitude to be same as northern latitude
+C
+ NWEIGHT = OLAT(NORTH) - RLAT
+ SWEIGHT = RLAT - OLAT(SOUTH)
+ IF( SWEIGHT.EQ.0.0 ) NWEIGHT = 1.0
+C
+C Calculate the weighting values for each matching neighbour
+C
+ WEIGHT(NWEST) = ABS((OLON(SEAST) - RLON) * SWEIGHT)
+ WEIGHT(NEAST) = ABS((RLON - OLON(SWEST)) * SWEIGHT)
+ WEIGHT(SWEST) = ABS((OLON(NEAST) - RLON) * NWEIGHT)
+ WEIGHT(SEAST) = ABS((RLON - OLON(NWEST)) * NWEIGHT)
+C
+C Normalise the weights
+C
+ NORMAL = ( WEIGHT(NWEST) + WEIGHT(NEAST) +
+ X WEIGHT(SWEST) + WEIGHT(SEAST) )
+C
+ WEIGHT(NWEST) = WEIGHT(NWEST)/NORMAL
+ WEIGHT(NEAST) = WEIGHT(NEAST)/NORMAL
+ WEIGHT(SWEST) = WEIGHT(SWEST)/NORMAL
+ WEIGHT(SEAST) = WEIGHT(SEAST)/NORMAL
+C
+C -----------------------------------------------------------------|
+C* Section 3. Interpolate
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Use nearest neighbour for vegetation field
+C
+ IF( LVEGGY ) THEN
+ NEAREST = NWEST
+ IF( WEIGHT(NEAST).GT.WEIGHT(NEAREST) ) NEAREST = NEAST
+ IF( WEIGHT(SWEST).GT.WEIGHT(NEAREST) ) NEAREST = SWEST
+ IF( WEIGHT(SEAST).GT.WEIGHT(NEAREST) ) NEAREST = SEAST
+ KNFROM4 = OLDFLD(PT(NEAREST))
+C
+ ELSE
+C
+C Count non-missing data values
+C
+ COUNT = 0
+ IF( NOTEQ(OLDFLD(PT(NWEST)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLDFLD(PT(NEAST)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLDFLD(PT(SWEST)),RMISSGV) ) COUNT = COUNT + 1
+ IF( NOTEQ(OLDFLD(PT(SEAST)),RMISSGV) ) COUNT = COUNT + 1
+C
+C Interpolate using four neighbours if none are missing
+C
+ IF( COUNT.EQ.4 ) THEN
+ KNFROM4 = ( (OLDFLD(PT(NWEST)) * WEIGHT(NWEST)) +
+ X (OLDFLD(PT(NEAST)) * WEIGHT(NEAST)) +
+ X (OLDFLD(PT(SWEST)) * WEIGHT(SWEST)) +
+ X (OLDFLD(PT(SEAST)) * WEIGHT(SEAST)) )
+C
+C Set missing if all neighbours are missing
+C
+ ELSE IF( COUNT.EQ.0 ) THEN
+ KNFROM4 = RMISSGV
+C
+C Otherwise, use the nearest neighbour
+C
+ ELSE
+ NEAREST = NWEST
+ IF( WEIGHT(NEAST).GT.WEIGHT(NEAREST) ) NEAREST = NEAST
+ IF( WEIGHT(SWEST).GT.WEIGHT(NEAREST) ) NEAREST = SWEST
+ IF( WEIGHT(SEAST).GT.WEIGHT(NEAREST) ) NEAREST = SEAST
+ KNFROM4 = OLDFLD(PT(NEAREST))
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/krg2rg.F b/interpolation/krg2rg.F
new file mode 100755
index 0000000..bf99453
--- /dev/null
+++ b/interpolation/krg2rg.F
@@ -0,0 +1,267 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION KRG2RG(OLDFLD, NEWFLD, NUMGG)
+C
+C---->
+C**** KRG2RG
+C
+C Purpose
+C -------
+C
+C Interpolate a field based on one reduced gaussian grid to a
+C field based on a different reduced gaussian grid.
+C
+C
+C Interface
+C ---------
+C
+C IRET = KRG2RG(OLDFLD, NEWFLD, NUMGG)
+C
+C Input
+C -----
+C
+C OLDFLD - Old field in GRIB format
+C NUMGG - Number of the new gaussian field
+C
+C
+C Output
+C ------
+C
+C NEWFLD - New field in GRIB format
+C
+C Function returns:
+C - the size in bytes of the new GRIB product if all is well
+C - -1, otherwise.
+C
+C
+C Method
+C ------
+C
+C Unpack input GRIBS.
+C Create new field and pack it into GRIB format.
+C
+C
+C Externals
+C ---------
+C
+C GRIBEX - Decode and encode GRIB products.
+C KINTRG - Interpolate reduced gaussian field to reduced gaussian
+C JMALLOC - Dynamically allocate memory
+C INTLOG - Log messages
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF November 2000
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER NUMGG, OLDFLD(*), NEWFLD(*)
+C
+#include "parim.h"
+#include "intisl.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Parameters
+C
+ INTEGER JPACK, JUNPACK, JPINTB, JPREALB, JPMAXNG
+ PARAMETER (JPACK = 4000000)
+ PARAMETER (JUNPACK = 6000000)
+#ifdef INTEGER_8
+ PARAMETER (JPINTB = 8)
+#else
+ PARAMETER (JPINTB = 4)
+#endif
+ PARAMETER (JPMAXNG=4000)
+#ifdef REAL_8
+ PARAMETER (JPREALB = 8)
+#else
+ PARAMETER (JPREALB = 8)
+#endif
+C
+C Local variables
+C
+ INTEGER IFSEC0(JPGRIB_ISEC0),IFSEC1(JPGRIB_ISEC1),
+ X IFSEC2(JPGRIB_ISEC2),IFSEC3(JPGRIB_ISEC3),IFSEC4(JPGRIB_ISEC4)
+ INTEGER NFSEC0(JPGRIB_ISEC0),NFSEC1(JPGRIB_ISEC1),
+ X NFSEC2(JPGRIB_ISEC2),NFSEC3(JPGRIB_ISEC3),NFSEC4(JPGRIB_ISEC4)
+ INTEGER ISIZE, LOOP
+ LOGICAL LFIRST
+#if (!defined __uxp__) && (!defined sgi)
+#ifdef POINTER_64
+ INTEGER*8 IZFSEC4, IPFSEC4
+#else
+ INTEGER IZFSEC4, IPFSEC4
+#endif
+#endif
+C
+ REAL PLAT(JPMAXNG)
+ REAL ZFSEC2(5000), ZFSEC3(2), ZFSEC4(1)
+ REAL PFSEC3(2), PFSEC4(1)
+C
+ POINTER( IZFSEC4, ZFSEC4 )
+ POINTER( IPFSEC4, PFSEC4 )
+C
+ INTEGER IRET, ILENB, IPUNP, IWORD
+C
+C Externals
+C
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+ INTEGER KINTRG
+ EXTERNAL KINTRG, JMALLOC
+C
+ DATA LFIRST/.TRUE./
+ SAVE LFIRST, IZFSEC4, IPFSEC4
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ KRG2RG = 0
+C
+ IF( (NUMGG*2).GT.JPMAXNG ) THEN
+ CALL INTLOG(JP_ERROR,'KRG2RG: Gaussian N too big = ',NUMGG)
+ CALL INTLOG(JP_ERROR,'KRG2RG: Maximum handled = ',(JPMAXNG/2))
+ KRG2RG = -1
+ GOTO 900
+ ENDIF
+C
+C First time, dynamically allocate memory for the field values
+C
+ IF( LFIRST ) THEN
+ LFIRST = .FALSE.
+ ISIZE = JUNPACK * JPREALB
+ CALL INTLOG(JP_DEBUG,'KRG2RG: Allocate memory = ',ISIZE)
+C
+ IZFSEC4 = JMALLOC(ISIZE)
+#ifdef hpR64
+ IZFSEC4 = IZFSEC4/(1024*1024*1024*4)
+#endif
+ IF( IZFSEC4.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'KRG2RG: JMALLOC fail IZFSEC4',JPQUIET)
+ KRG2RG = -1
+ GOTO 900
+ ENDIF
+C
+ IPFSEC4 = JMALLOC(ISIZE)
+#ifdef hpR64
+ IPFSEC4 = IPFSEC4/(1024*1024*1024*4)
+#endif
+ IF( IPFSEC4.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'KRG2RG: JMALLOC fail IPFSEC4',JPQUIET)
+ KRG2RG = -1
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Unpack the input GRIB
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Old field
+C
+ IRET = 1
+ IPUNP = JUNPACK
+ ILENB = JPACK
+ IFSEC3(1) = 0
+ IFSEC3(2) = INT(RMISSGV)
+ ZFSEC3(1) = 0.0
+ ZFSEC3(2) = RMISSGV
+ CALL GRIBEX (IFSEC0,IFSEC1,IFSEC2,ZFSEC2,IFSEC3,ZFSEC3,IFSEC4,
+ X ZFSEC4,IPUNP,OLDFLD,ILENB,IWORD,'D',IRET)
+ IF( IRET.GT.0 ) THEN
+ WRITE(*,*) 'KRG2RG: Old field gribex return code = ',IRET
+ KRG2RG = -1
+ RETURN
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Create new field and put in GRIB format
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ DO LOOP = 1, JPMAXNG
+ NFSEC2(LOOP) = IFSEC2(LOOP)
+ ENDDO
+ CALL JGETGG( NUMGG, 'R', PLAT, NFSEC2(23), IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'KRG2RG: Problem calling JGETGG, status = ',IRET
+ KRG2RG = -1
+ RETURN
+ ENDIF
+ NFSEC2(3) = NUMGG * 2
+ NFSEC2(4) = NINT(PLAT(1)*1000.0)
+ NFSEC2(7) = NINT(PLAT(NUMGG*2)*1000.0)
+ NFSEC2(8) = NINT((360.0-(360.0/REAL(NUMGG*4)))*1000.0)
+ NFSEC2(10) = NUMGG
+C
+ IRET = KINTRG(IFSEC2, NFSEC2, ZFSEC4, PFSEC4)
+ IF( IRET.LE.0 ) THEN
+ WRITE(*,*) 'KRG2RG: New field creation failed'
+ KRG2RG = -1
+ RETURN
+ ENDIF
+ IFSEC4(1) = IRET
+C
+ IRET = 1
+ IPUNP = JUNPACK
+ ILENB = JPACK
+C
+C If output 'accuracy' specified, use it for the new field
+C
+ IF( LNOACC ) THEN
+ IFSEC4(2) = NOACC
+ ENDIF
+C
+C There may be 'missing' values in the new field if the old field
+C has 'missing' values.
+C
+ IF( IFSEC1(5).EQ.192 ) THEN
+ IFSEC1(5) = 192
+ NFSEC3(1) = 0
+ NFSEC3(2) = INT(RMISSGV)
+ PFSEC3(1) = 0.0
+ PFSEC3(2) = RMISSGV
+ ENDIF
+C
+ CALL GRIBEX (IFSEC0,IFSEC1,NFSEC2,ZFSEC2,NFSEC3,PFSEC3,IFSEC4,
+ X PFSEC4,IPUNP,NEWFLD,ILENB,IWORD,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'KRG2RG: New field gribex return code = ',IRET
+ KRG2RG = -1
+ RETURN
+ ENDIF
+C
+ KRG2RG = IWORD * JPINTB
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/krg2rgd.F b/interpolation/krg2rgd.F
new file mode 100755
index 0000000..eb6b4f1
--- /dev/null
+++ b/interpolation/krg2rgd.F
@@ -0,0 +1,314 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION KRG2RGD(OLDFLD, NEWFLD, NUMME, NUMGG)
+C
+C---->
+C**** KRG2RG
+C
+C Purpose
+C -------
+C
+C Interpolate a field based on one reduced gaussian grid to a
+C field based on a different reduced gaussian grid, using
+C intermediate interpolation
+C
+C
+C Interface
+C ---------
+C
+C IRET = KRG2RGD(OLDFLD, NEWFLD, NUMME, NUMGG)
+C
+C Input
+C -----
+C
+C OLDFLD - Old field in GRIB format
+C NUMME - Number of the intermediate gaussian field
+C NUMGG - Number of the new gaussian field
+C
+C
+C Output
+C ------
+C
+C NEWFLD - New field in GRIB format
+C
+C Function returns:
+C - the size in bytes of the new GRIB product if all is well
+C - -1, otherwise.
+C
+C
+C Method
+C ------
+C
+C Unpack input GRIBS.
+C Intermediate interpolation
+C Create new field and pack it into GRIB format.
+C
+C
+C Externals
+C ---------
+C
+C GRIBEX - Decode and encode GRIB products.
+C KINTRG - Interpolate reduced gaussian field to reduced gaussian
+C JMALLOC - Dynamically allocate memory
+C INTLOG - Log messages
+C
+C
+C Author
+C ------
+C
+C S.Curic ECMWF October 2006
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER NUMME, NUMGG, OLDFLD(*), NEWFLD(*)
+C
+#include "parim.h"
+#include "intisl.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Parameters
+C
+ INTEGER JPACK, JUNPACK, JPINTB, JPREALB, JPMAXNG
+ PARAMETER (JPACK = 4000000)
+ PARAMETER (JUNPACK = 6000000)
+#ifdef INTEGER_8
+ PARAMETER (JPINTB = 8)
+#else
+ PARAMETER (JPINTB = 4)
+#endif
+ PARAMETER (JPMAXNG=4000)
+#ifdef REAL_8
+ PARAMETER (JPREALB = 8)
+#else
+ PARAMETER (JPREALB = 8)
+#endif
+C
+C Local variables
+C
+ INTEGER IFSEC0(JPGRIB_ISEC0),IFSEC1(JPGRIB_ISEC1),
+ X IFSEC2(JPGRIB_ISEC2),IFSEC3(JPGRIB_ISEC3),IFSEC4(JPGRIB_ISEC4)
+ INTEGER NFSEC0(JPGRIB_ISEC0),NFSEC1(JPGRIB_ISEC1),
+ X NFSEC2(JPGRIB_ISEC2),NFSEC3(JPGRIB_ISEC3),NFSEC4(JPGRIB_ISEC4)
+ INTEGER NEWGEO(2048)
+ INTEGER ISIZE, LOOP
+ LOGICAL LFIRST
+#if (!defined __uxp__) && (!defined sgi)
+#ifdef POINTER_64
+ INTEGER*8 IZFSEC4, IPFSEC4, IMEDFLD
+#else
+ INTEGER IZFSEC4, IPFSEC4, IMEDFLD
+#endif
+#endif
+C
+ REAL PLAT(JPMAXNG)
+ REAL ZFSEC2(5000), ZFSEC3(2), ZFSEC4(1)
+ REAL PFSEC3(2), PFSEC4(1), MEDFLD(1)
+C
+ POINTER( IZFSEC4, ZFSEC4 )
+ POINTER( IPFSEC4, PFSEC4 )
+ POINTER( IMEDFLD, MEDFLD )
+C
+ INTEGER IRET, ILENB, IPUNP, IWORD
+C
+C Externals
+C
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+ INTEGER KINTRG
+ EXTERNAL KINTRG, JMALLOC
+C
+ DATA LFIRST/.TRUE./
+ SAVE LFIRST, IZFSEC4, IPFSEC4, IMEDFLD
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ KRG2RGD = 0
+C
+ IF( (NUMGG*2).GT.JPMAXNG ) THEN
+ CALL INTLOG(JP_ERROR,'KRG2RGD: Gaussian N too big = ',NUMGG)
+ CALL INTLOG(JP_ERROR,'KRG2RGD: Maximum handled = ',(JPMAXNG/2))
+ KRG2RGD = -1
+ GOTO 900
+ ENDIF
+
+ IF( (NUMME*2).GT.JPMAXNG ) THEN
+ CALL INTLOG(JP_ERROR,'KRG2RGD: Intermediate Gaussian N too big= '
+ X ,NUMME)
+ CALL INTLOG(JP_ERROR,'KRG2RGD: Maximum handled = ',(JPMAXNG/2))
+ KRG2RGD = -1
+ GOTO 900
+ ENDIF
+C
+C First time, dynamically allocate memory for the field values
+C
+ IF( LFIRST ) THEN
+ LFIRST = .FALSE.
+ ISIZE = JUNPACK * JPREALB
+ CALL INTLOG(JP_DEBUG,'KRG2RGD: Allocate memory = ',ISIZE)
+C
+ IZFSEC4 = JMALLOC(ISIZE)
+#ifdef hpR64
+ IZFSEC4 = IZFSEC4/(1024*1024*1024*4)
+#endif
+ IF( IZFSEC4.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'KRG2RGD: JMALLOC fail IZFSEC4',JPQUIET)
+ KRG2RGD = -1
+ GOTO 900
+ ENDIF
+C
+ IPFSEC4 = JMALLOC(ISIZE)
+ IMEDFLD = JMALLOC(ISIZE)
+#ifdef hpR64
+ IPFSEC4 = IPFSEC4/(1024*1024*1024*4)
+#endif
+ IF( IPFSEC4.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'KRG2RGD: JMALLOC fail IPFSEC4',JPQUIET)
+ KRG2RGD = -1
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Unpack the input GRIB
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Old field
+C
+ IRET = 1
+ IPUNP = JUNPACK
+ ILENB = JPACK
+ IFSEC3(1) = 0
+ IFSEC3(2) = INT(RMISSGV)
+ ZFSEC3(1) = 0.0
+ ZFSEC3(2) = RMISSGV
+ CALL GRIBEX (IFSEC0,IFSEC1,IFSEC2,ZFSEC2,IFSEC3,ZFSEC3,IFSEC4,
+ X ZFSEC4,IPUNP,OLDFLD,ILENB,IWORD,'D',IRET)
+ IF( IRET.GT.0 ) THEN
+ WRITE(*,*) 'KRG2RGD: Old field gribex return code = ',IRET
+ KRG2RGD = -1
+ RETURN
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Create intermediate field
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ DO LOOP = 1, JPMAXNG
+ NFSEC2(LOOP) = IFSEC2(LOOP)
+ NEWGEO(LOOP) = 0
+ ENDDO
+ CALL JGETGG( NUMME, 'R', PLAT, NEWGEO(23), IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'KRG2RGD: Problem calling JGETGG, status = ',IRET
+ KRG2RGD = -1
+ RETURN
+ ENDIF
+ NEWGEO(3) = NUMME * 2
+ NEWGEO(4) = NINT(PLAT(1)*1000.0)
+ NEWGEO(5) = 0
+ NEWGEO(7) = NINT(PLAT(NUMME*2)*1000.0)
+ NEWGEO(8) = NINT((360.0-(360.0/REAL(NUMME*4)))*1000.0)
+ NEWGEO(10) = NUMME
+C
+ IRET = KINTRG(IFSEC2, NEWGEO, ZFSEC4, MEDFLD)
+ IF( IRET.LE.0 ) THEN
+ WRITE(*,*) 'KRG2RGD: New field creation failed'
+ KRG2RGD = -1
+ RETURN
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'KRG2RGD: Intermediate gaussian field created - N',NUMME)
+ ENDIF
+
+C
+C -----------------------------------------------------------------|
+C* Section 4. Create new field from intermediate and put in GRIB
+C -----------------------------------------------------------------|
+C
+
+ CALL JGETGG( NUMGG, 'R', PLAT, NFSEC2(23), IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'KRG2RGD: Problem calling JGETGG, status = ',IRET
+ KRG2RGD = -1
+ RETURN
+ ENDIF
+ NFSEC2(3) = NUMGG * 2
+ NFSEC2(4) = NINT(PLAT(1)*1000.0)
+ NFSEC2(7) = NINT(PLAT(NUMGG*2)*1000.0)
+ NFSEC2(8) = NINT((360.0-(360.0/REAL(NUMGG*4)))*1000.0)
+ NFSEC2(10) = NUMGG
+C
+ IRET = KINTRG(NEWGEO, NFSEC2, MEDFLD, PFSEC4)
+ IF( IRET.LE.0 ) THEN
+ WRITE(*,*) 'KRG2RGD: New field creation failed'
+ KRG2RGD = -1
+ RETURN
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'KRG2RGD: New gaussian field created - N',NUMGG)
+ ENDIF
+ IFSEC4(1) = IRET
+C
+ IRET = 1
+ IPUNP = JUNPACK
+ ILENB = JPACK
+C
+C If output 'accuracy' specified, use it for the new field
+C
+ IF( LNOACC ) THEN
+ IFSEC4(2) = NOACC
+ ENDIF
+C
+C There may be 'missing' values in the new field if the old field
+C has 'missing' values.
+C
+ IF( IFSEC1(5).EQ.192 ) THEN
+ IFSEC1(5) = 192
+ NFSEC3(1) = 0
+ NFSEC3(2) = INT(RMISSGV)
+ PFSEC3(1) = 0.0
+ PFSEC3(2) = RMISSGV
+ ENDIF
+C
+ CALL GRIBEX (IFSEC0,IFSEC1,NFSEC2,ZFSEC2,NFSEC3,PFSEC3,IFSEC4,
+ X PFSEC4,IPUNP,NEWFLD,ILENB,IWORD,'C',IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'KRG2RGD: New field gribex return code = ',IRET
+ KRG2RGD = -1
+ RETURN
+ ENDIF
+C
+ KRG2RGD = IWORD * JPINTB
+C
+C -----------------------------------------------------------------|
+C* Section 5. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/krg2rgu.F b/interpolation/krg2rgu.F
new file mode 100755
index 0000000..c3b4d70
--- /dev/null
+++ b/interpolation/krg2rgu.F
@@ -0,0 +1,191 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION KRG2RGU(OLDFLD, NEWFLD, NUMGGO, NUMGGN)
+C
+C---->
+C**** KRG2RGU
+C
+C Purpose
+C -------
+C
+C Interpolate a field based on one reduced gaussian grid to a
+C field based on a different reduced gaussian grid.
+C
+C
+C Interface
+C ---------
+C
+C IRET = KRG2RGU(OLDFLD, NEWFLD, NUMGGO, NUMGGN)
+C
+C Input
+C -----
+C
+C OLDFLD - Old field as array of values
+C NUMGGO - Number of the old gaussian field
+C NUMGGN - Number of the new gaussian field
+C
+C
+C Output
+C ------
+C
+C NEWFLD - New field as array of values
+C
+C Function returns:
+C - the size in bytes of the new GRIB product if all is well
+C - -1, otherwise.
+C
+C
+C Method
+C ------
+C
+C Create new field and leave it unpacked.
+C
+C
+C Externals
+C ---------
+C
+C KINTRG - Interpolate reduced gaussian field to reduced gaussian
+C JMALLOC - Dynamically allocate memory
+C INTLOG - Log messages
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF February 2002
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER NUMGGO, NUMGGN
+ REAL OLDFLD(*), NEWFLD(*)
+C
+#include "parim.h"
+#include "intisl.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+C
+C Parameters
+C
+ INTEGER JPINTB, JPREALB, JPMAXNG
+ INTEGER JSEC2
+ PARAMETER (JSEC2 = 5000)
+#ifdef INTEGER_8
+ PARAMETER (JPINTB = 8)
+#else
+ PARAMETER (JPINTB = 4)
+#endif
+ PARAMETER (JPMAXNG=4000)
+#ifdef REAL_8
+ PARAMETER (JPREALB = 8)
+#else
+ PARAMETER (JPREALB = 8)
+#endif
+C
+C Local variables
+C
+ INTEGER OLDGEO(JSEC2), NEWGEO(JSEC2)
+ INTEGER LOOP
+C
+ REAL PLAT(JPMAXNG)
+ REAL PFSEC3(2)
+C
+ INTEGER IRET
+C
+C Externals
+C
+ INTEGER KINTRG
+ EXTERNAL KINTRG
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ KRG2RGU = 0
+C
+ IF( (NUMGGN*2).GT.JPMAXNG ) THEN
+ CALL INTLOG(JP_ERROR,'KRG2RGU: Gaussian N too big = ',NUMGGN)
+ CALL INTLOG(JP_ERROR,'KRG2RGU: Maximum handled = ',(JPMAXNG/2))
+ KRG2RGU = -1
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Create new field.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ DO LOOP = 1, JPMAXNG
+ OLDGEO(LOOP) = 0
+ ENDDO
+ CALL JGETGG( NUMGGO, 'R', PLAT, OLDGEO(23), IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'KRG2RGU: Problem calling JGETGG, status = ',IRET
+ KRG2RGU = -1
+ RETURN
+ ENDIF
+C
+ OLDGEO(3) = NUMGGO * 2
+ OLDGEO(4) = NINT(PLAT(1)*1000.0)
+ OLDGEO(5) = 0
+ OLDGEO(7) = NINT(PLAT(NUMGGO*2)*1000.0)
+ OLDGEO(8) = NINT((360.0-(360.0/REAL(NUMGGO*4)))*1000.0)
+ OLDGEO(10) = NUMGGO
+C
+ DO LOOP = 1, JPMAXNG
+ NEWGEO(LOOP) = 0
+ ENDDO
+ CALL JGETGG( NUMGGN, 'R', PLAT, NEWGEO(23), IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'KRG2RGU: Problem calling JGETGG, status = ',IRET
+ KRG2RGU = -1
+ RETURN
+ ENDIF
+ NEWGEO(3) = NUMGGN * 2
+ NEWGEO(4) = NINT(PLAT(1)*1000.0)
+ NEWGEO(5) = 0
+ NEWGEO(7) = NINT(PLAT(NUMGGN*2)*1000.0)
+ NEWGEO(8) = NINT((360.0-(360.0/REAL(NUMGGN*4)))*1000.0)
+ NEWGEO(10) = NUMGGN
+C
+ IRET = KINTRG(OLDGEO, NEWGEO, OLDFLD, NEWFLD)
+C
+ IF( IRET.LE.0 ) THEN
+ WRITE(*,*) 'KRG2RGU: New field creation failed'
+ KRG2RGU = -1
+ RETURN
+ ENDIF
+c sinisa for merging with grib_api
+ NONS = 2*NOGAUSS
+ NOAAPI(1) = NOAREA(1)
+ NOAAPI(2) = NOAREA(2)
+ NOAAPI(3) = NOAREA(3)
+ NOAAPI(4) = NOAREA(4)
+C
+cs KRG2RGU = IRET * JPINTB
+cs this is the outlen
+ KRG2RGU = IRET
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/krg2rgy.F b/interpolation/krg2rgy.F
new file mode 100755
index 0000000..71c10e9
--- /dev/null
+++ b/interpolation/krg2rgy.F
@@ -0,0 +1,253 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION KRG2RGY(OLDFLD, NEWFLD, NUMGG)
+C
+C---->
+C**** KRG2RGY
+C
+C Purpose
+C -------
+C
+C Interpolate a field based on one reduced gaussian grid to a
+C field based on a different reduced gaussian grid.
+C
+C
+C Interface
+C ---------
+C
+C IRET = KRG2RGY(OLDFLD, NEWFLD, NUMGG)
+C
+C Input
+C -----
+C
+C OLDFLD - Old field in GRIB format
+C NUMGG - Number of the new gaussian field
+C
+C
+C Output
+C ------
+C
+C NEWFLD - New field
+C
+C Function returns:
+C - the size in bytes of the new GRIB product if all is well
+C - -1, otherwise.
+C
+C
+C Method
+C ------
+C
+C Unpack input GRIBS.
+C Create new field
+C
+C
+C Externals
+C ---------
+C
+C GRIBEX - Decode and encode GRIB products.
+C KINTRG - Interpolate reduced gaussian field to reduced gaussian
+C JMALLOC - Dynamically allocate memory
+C INTLOG - Log messages
+C
+C
+C Author
+C ------
+C
+C S.Curic ECMWF November 2006
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER NUMGG, OLDFLD(*), NEWFLD(*)
+C
+#include "parim.h"
+#include "intisl.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "current.h"
+C
+C Parameters
+C
+ INTEGER JPACK, JUNPACK, JPINTB, JPREALB, JPMAXNG
+ PARAMETER (JPACK = 4000000)
+ PARAMETER (JUNPACK = 6000000)
+#ifdef INTEGER_8
+ PARAMETER (JPINTB = 8)
+#else
+ PARAMETER (JPINTB = 4)
+#endif
+ PARAMETER (JPMAXNG=4000)
+#ifdef REAL_8
+ PARAMETER (JPREALB = 8)
+#else
+ PARAMETER (JPREALB = 8)
+#endif
+C
+C Local variables
+C
+ INTEGER IFSEC0(JPGRIB_ISEC0),IFSEC1(JPGRIB_ISEC1),
+ X IFSEC2(JPGRIB_ISEC2),IFSEC3(JPGRIB_ISEC3),IFSEC4(JPGRIB_ISEC4)
+ INTEGER NFSEC0(JPGRIB_ISEC0),NFSEC1(JPGRIB_ISEC1),
+ X NFSEC2(JPGRIB_ISEC2),NFSEC3(JPGRIB_ISEC3),NFSEC4(JPGRIB_ISEC4)
+
+ INTEGER ISIZE, LOOP
+ LOGICAL LFIRST
+#if (!defined __uxp__) && (!defined sgi)
+#ifdef POINTER_64
+ INTEGER*8 IZFSEC4
+#else
+ INTEGER IZFSEC4
+#endif
+#endif
+C
+ REAL PLAT(JPMAXNG)
+ REAL ZFSEC2(5000), ZFSEC3(2), ZFSEC4(1)
+ REAL PFSEC3(2), PFSEC4(1)
+C
+ POINTER( IZFSEC4, ZFSEC4 )
+C
+ INTEGER IRET, ILENB, IPUNP, IWORD
+C
+C Externals
+C
+#ifdef POINTER_64
+ INTEGER*8 JMALLOC
+#else
+ INTEGER JMALLOC
+#endif
+ INTEGER KINTRG
+ EXTERNAL KINTRG, JMALLOC
+C
+ DATA LFIRST/.TRUE./
+ SAVE LFIRST, IZFSEC4
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ KRG2RGY = 0
+C
+ IF( (NUMGG*2).GT.JPMAXNG ) THEN
+ CALL INTLOG(JP_ERROR,'KRG2RGY: Gaussian N too big = ',NUMGG)
+ CALL INTLOG(JP_ERROR,'KRG2RGY: Maximum handled = ',(JPMAXNG/2))
+ KRG2RGY = -1
+ GOTO 900
+ ENDIF
+C
+C First time, dynamically allocate memory for the field values
+C
+ IF( LFIRST ) THEN
+ LFIRST = .FALSE.
+ ISIZE = JUNPACK * JPREALB
+ CALL INTLOG(JP_DEBUG,'KRG2RGY: Allocate memory = ',ISIZE)
+C
+ IZFSEC4 = JMALLOC(ISIZE)
+#ifdef hpR64
+ IZFSEC4 = IZFSEC4/(1024*1024*1024*4)
+#endif
+ IF( IZFSEC4.EQ.0 ) THEN
+ CALL INTLOG(JP_ERROR,'KRG2RGY: JMALLOC fail IZFSEC4',JPQUIET)
+ KRG2RGY = -1
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Unpack the input GRIB
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Old field
+C
+ IRET = 1
+ IPUNP = JUNPACK
+ ILENB = JPACK
+ IFSEC3(1) = 0
+ IFSEC3(2) = INT(RMISSGV)
+ ZFSEC3(1) = 0.0
+ ZFSEC3(2) = RMISSGV
+ CALL GRIBEX (IFSEC0,IFSEC1,IFSEC2,ZFSEC2,IFSEC3,ZFSEC3,IFSEC4,
+ X ZFSEC4,IPUNP,OLDFLD,ILENB,IWORD,'D',IRET)
+ IF( IRET.GT.0 ) THEN
+ WRITE(*,*) 'KRG2RGY: Old field gribex return code = ',IRET
+ KRG2RGY = -1
+ RETURN
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Create new field
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ DO LOOP = 1, JPMAXNG
+ NFSEC2(LOOP) = IFSEC2(LOOP)
+ ENDDO
+ CALL JGETGG( NUMGG, 'R', PLAT, NFSEC2(23), IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'KRG2RGY: Problem calling JGETGG, status = ',IRET
+ KRG2RGY = -1
+ RETURN
+ ENDIF
+ NFSEC2(3) = NUMGG * 2
+ NFSEC2(4) = NINT(PLAT(1)*1000.0)
+ NFSEC2(7) = NINT(PLAT(NUMGG*2)*1000.0)
+ NFSEC2(8) = NINT((360.0-(360.0/REAL(NUMGG*4)))*1000.0)
+ NFSEC2(10) = NUMGG
+C
+ IRET = KINTRG(IFSEC2, NFSEC2, ZFSEC4, NEWFLD)
+ IF( IRET.LE.0 ) THEN
+ WRITE(*,*) 'KRG2RGY: New field creation failed'
+ KRG2RGY = -1
+ RETURN
+ ENDIF
+ IF( LDOUBLE ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'KRG2RGY: Set NIAREA - double interpolation',JPQUIET)
+c NIAREA(1) = NFSEC2(4)*100
+c NIAREA(2) = NFSEC2(5)*100
+c NIAREA(3) = NFSEC2(7)*100
+c NIAREA(4) = NFSEC2(8)*100
+ NIAREA(1) = 0
+ NIAREA(2) = 0
+ NIAREA(3) = 0
+ NIAREA(4) = 0
+ NIGAUSS = NUMGG
+ DO LOOP = 1, NINS
+ RIGAUSS(LOOP) = 0
+ MILLEN(LOOP) = 0
+ ENDDO
+ NINS = NUMGG*2
+ CALL INTLOG(JP_DEBUG, 'KRG2RGY: NIAREA(1) ',NIAREA(1))
+ CALL INTLOG(JP_DEBUG, 'KRG2RGY: NIAREA(2) ',NIAREA(2))
+ CALL INTLOG(JP_DEBUG, 'KRG2RGY: NIAREA(3) ',NIAREA(3))
+ CALL INTLOG(JP_DEBUG, 'KRG2RGY: NIAREA(4) ',NIAREA(4))
+ CALL INTLOG(JP_DEBUG, 'KRG2RGY: NIGAUSS ',NIGAUSS)
+ CALL INTLOG(JP_DEBUG, 'KRG2RGY: NINS ',NINS)
+ ENDIF
+
+C
+ KRG2RGY = IRET
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/krg2rgz.F b/interpolation/krg2rgz.F
new file mode 100755
index 0000000..90209ae
--- /dev/null
+++ b/interpolation/krg2rgz.F
@@ -0,0 +1,235 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION KRG2RGZ(OLDFLD, NEWFLD, NUMGGO, NUMGGN)
+C
+C---->
+C**** KRG2RGZ
+C
+C Purpose
+C -------
+C
+C Interpolate a field based on one reduced gaussian grid to a
+C field based on a different reduced gaussian grid.
+C
+C
+C Interface
+C ---------
+C
+C IRET = KRG2RGZ(OLDFLD, NEWFLD, NUMGGO, NUMGGN)
+C
+C Input
+C -----
+C
+C OLDFLD - Old field as array of values
+C NUMGGO - Number of the old gaussian field
+C NUMGGN - Number of the new gaussian field
+C
+C
+C Output
+C ------
+C
+C NEWFLD - New field as array of values
+C
+C Function returns:
+C - the size in bytes of the new GRIB product if all is well
+C - -1, otherwise.
+C
+C
+C Method
+C ------
+C
+C Create new field and leave it unpacked.
+C
+C
+C Externals
+C ---------
+C
+C KINTRG - Interpolate reduced gaussian field to reduced gaussian
+C JMALLOC - Dynamically allocate memory
+C INTLOG - Log messages
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF February 2002
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER NUMGGO, NUMGGN
+ REAL OLDFLD(*), NEWFLD(*)
+C
+#include "parim.h"
+#include "intisl.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+C
+C Parameters
+C
+ INTEGER JPINTB, JPREALB, JPMAXNG
+ INTEGER JSEC2
+ PARAMETER (JSEC2 = 5000)
+#ifdef INTEGER_8
+ PARAMETER (JPINTB = 8)
+#else
+ PARAMETER (JPINTB = 4)
+#endif
+ PARAMETER (JPMAXNG=4000)
+#ifdef REAL_8
+ PARAMETER (JPREALB = 8)
+#else
+ PARAMETER (JPREALB = 8)
+#endif
+C
+C Local variables
+C
+ INTEGER OLDGEO(JSEC2), NEWGEO(JSEC2)
+ INTEGER LOOP
+C
+ REAL PLAT(JPMAXNG)
+ REAL PFSEC3(2)
+C
+ INTEGER IRET
+ LOGICAL LDEBUG
+C
+C Externals
+C
+ INTEGER KINTRG
+ EXTERNAL KINTRG
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ KRG2RGZ = 0
+C
+ IF( (NUMGGN*2).GT.JPMAXNG ) THEN
+ CALL INTLOG(JP_ERROR,'KRG2RGZ: Gaussian N too big = ',NUMGGN)
+ CALL INTLOG(JP_ERROR,'KRG2RGZ: Maximum handled = ',(JPMAXNG/2))
+ KRG2RGZ = -1
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Create new field.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ DO LOOP = 1, JPMAXNG
+cs OLDGEO(LOOP) = 0
+ OLDGEO(LOOP+22) = MILLEN(LOOP)
+ ENDDO
+cs CALL JGETGG( NUMGGO, 'R', PLAT, OLDGEO(23), IRET)
+cs IF( IRET.NE.0 ) THEN
+cs WRITE(*,*) 'KRG2RGZ: Problem calling JGETGG, status = ',IRET
+cs KRG2RGZ = -1
+cs RETURN
+cs ENDIF
+
+C
+ OLDGEO(3) = NUMGGO * 2
+ OLDGEO(4) = NINT(PLAT(1)*1000.0)
+ OLDGEO(5) = 0
+ OLDGEO(7) = NINT(PLAT(NUMGGO*2)*1000.0)
+ OLDGEO(8) = NINT((360.0-(360.0/REAL(NUMGGO*4)))*1000.0)
+ OLDGEO(10) = NUMGGO
+C
+ DO LOOP = 1, JPMAXNG
+ NEWGEO(LOOP) = 0
+ ENDDO
+ CALL JGETGG( NUMGGN, 'R', PLAT, NEWGEO(23), IRET)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'KRG2RGZ: Problem calling JGETGG, status = ',IRET
+ KRG2RGZ = -1
+ RETURN
+ ENDIF
+ NEWGEO(3) = NUMGGN * 2
+ NEWGEO(4) = NINT(PLAT(1)*1000.0)
+ NEWGEO(5) = 0
+ NEWGEO(7) = NINT(PLAT(NUMGGN*2)*1000.0)
+ NEWGEO(8) = NINT((360.0-(360.0/REAL(NUMGGN*4)))*1000.0)
+ NEWGEO(10) = NUMGGN
+C
+ IRET = KINTRG(OLDGEO, NEWGEO, OLDFLD, NEWFLD)
+C
+ IF( IRET.LE.0 ) THEN
+ WRITE(*,*) 'KRG2RGZ: New field creation failed'
+ KRG2RGZ = -1
+ RETURN
+ ENDIF
+C
+cs KRG2RGZ = IRET * JPINTB
+cs this is the outlen
+ KRG2RGZ = IRET
+
+ IF( LDOUBLE ) THEN
+c filing of millen for double interpolation
+ DO LOOP = 1, JPMAXNG
+ MILLEN(LOOP) = NEWGEO(LOOP+22)
+ ENDDO
+ CALL INTLOG(JP_DEBUG,
+ X 'KRG2RGZ: Set NIAREA - double interpolation',JPQUIET)
+ NIAREA(1) = 0
+ NIAREA(2) = 0
+ NIAREA(3) = 0
+ NIAREA(4) = 0
+ NIGAUSS = NUMGGN
+cs DO LOOP = 1, NINS
+cs RIGAUSS(LOOP) = 0
+cs MILLEN(LOOP) = 0
+cs ENDDO
+ NINS = NUMGGN*2
+cs IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG, 'KRG2RGZ: NIAREA(1) ',NIAREA(1))
+ CALL INTLOG(JP_DEBUG, 'KRG2RGZ: NIAREA(2) ',NIAREA(2))
+ CALL INTLOG(JP_DEBUG, 'KRG2RGZ: NIAREA(3) ',NIAREA(3))
+ CALL INTLOG(JP_DEBUG, 'KRG2RGZ: NIAREA(4) ',NIAREA(4))
+ CALL INTLOG(JP_DEBUG, 'KRG2RGZ: NIGAUSS ',NIGAUSS)
+ CALL INTLOG(JP_DEBUG, 'KRG2RGZ: NINS ',NINS)
+cs ENDIF
+ ELSE
+c sinisa for merging with grib_api
+ NONS = 2 * NUMGGN
+ NOWE = 0
+ NOAAPI(1) = NEWGEO(4)*JPMICRO
+ NOAAPI(2) = NEWGEO(5)*JPMICRO
+ NOAAPI(3) = NEWGEO(7)*JPMICRO
+ NOAAPI(4) = NEWGEO(8)*JPMICRO
+ NOAREA(1) = NEWGEO(4)*JPMICRO
+ NOAREA(2) = NEWGEO(5)*JPMICRO
+ NOAREA(3) = NEWGEO(7)*JPMICRO
+ NOAREA(4) = NEWGEO(8)*JPMICRO
+cs IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG, 'KRG2RGZ: NOAAPI(1) ',NOAAPI(1))
+ CALL INTLOG(JP_DEBUG, 'KRG2RGZ: NOAAPI(2) ',NOAAPI(2))
+ CALL INTLOG(JP_DEBUG, 'KRG2RGZ: NOAAPI(3) ',NOAAPI(3))
+ CALL INTLOG(JP_DEBUG, 'KRG2RGZ: NOAAPI(4) ',NOAAPI(4))
+ CALL INTLOG(JP_DEBUG, 'KRG2RGZ: NOGAUSS ',NOGAUSS)
+ CALL INTLOG(JP_DEBUG, 'KRG2RGZ: NONS ',NONS)
+cs ENDIF
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/lgrpr4.F b/interpolation/lgrpr4.F
new file mode 100755
index 0000000..bf24dcd
--- /dev/null
+++ b/interpolation/lgrpr4.F
@@ -0,0 +1,225 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE LGRPR4 (KSEC0,KLINE,KSEC4,PSEC4)
+C
+C---->
+C**** lgrpr4 - Print information from Section 4 of GRIB code.
+C
+C Purpose.
+C --------
+C
+C Print the information in the Binary data section
+C Section (Section 4) of decoded GRIB data.
+C
+C** Interface.
+C ----------
+C
+C CALL lgrpr4 (KSEC0,KSEC4,PSEC4)
+C
+C Integer K.
+C Real P.
+C Logical O.
+C Character H.
+C
+C Input Parameters.
+C -----------------
+C
+C KSEC0 - Array of decoded integers from Section 0.
+C
+C KSEC4 - Array of decoded integers from Section 4.
+C
+C PSEC4 - Array of decoded reals from Section 4.
+C
+C Output Parameters.
+C ------------------
+C
+C None.
+C
+C Method.
+C -------
+C
+C Fields printed as integers or reals.
+C
+C Externals.
+C ----------
+C
+C None.
+C
+C Reference.
+C ----------
+C
+C WMO Manual on Codes re GRIB Code.
+C See also routine GRIBEX.
+C
+C Comments.
+C ---------
+C
+C Routine contains Sections 0 to 1 and Section 9.
+C
+C Author.
+C -------
+C
+C J. Hennessy ECMWF 11.09.91
+C
+C Modifications.
+C --------------
+C
+C K. Fielding ecmwf 03/08/92
+C Special version with reduced printout for Monthly
+C means and time series
+C
+C----<
+C -----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 0. Definition of variables.
+C -----------------------------------------------------------------
+ IMPLICIT NONE
+C
+C* Prefix conventions for variable names.
+C
+C Logical L (but not LP), global or common.
+C O, dummy arguments.
+C G, local variable.
+C LP, parameter.
+C Character C, Global or common.
+C H, dummy arguments.
+C Y (but not YP), local variables.
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy arguments.
+C I, local variables.
+C J (but not JP), loop control.
+C JP, parameter.
+C Real A to F and Q to X, global or common.
+C P (but not PP), dummy arguments.
+C Z, local variables.
+C PP, parameter.
+C
+*IF DEF,CRAY
+C IMPLICIT NONE
+*ENDIF
+C
+ INTEGER INUM
+C
+ INTEGER J210, J220
+C
+ INTEGER KSEC0
+ INTEGER KSEC4
+ INTEGER KLINE
+C
+ REAL PSEC4
+C
+ DIMENSION KSEC0(*)
+ DIMENSION KSEC4(*)
+C
+ DIMENSION PSEC4(*)
+C
+C -----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 1 . Print integer information from KSEC4.
+C -----------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WRITE (*,9000)
+ WRITE (*,9001)
+ WRITE (*,9002)
+C
+ WRITE (*,9003) KSEC4(1)
+ WRITE (*,9004) KSEC4(2)
+C WRITE (*,9005) KSEC4(3)
+C WRITE (*,9006) KSEC4(4)
+C WRITE (*,9007) KSEC4(5)
+C WRITE (*,9008) KSEC4(6)
+C WRITE (*,9009) KSEC4(7)
+C WRITE (*,9010) KSEC4(8)
+C
+C -----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C* Section 2. Print real values from PSEC4.
+C -----------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ WRITE (*,9000)
+C
+ INUM = KSEC4(1)
+ IF (INUM.LT.0) INUM = - INUM
+ IF (INUM.GT.10) INUM = 10
+C
+C Print first INUM values.
+C
+ WRITE (*,9011) INUM
+ DO 220 J220 = 0, 3
+ WRITE (*, *)
+ DO 210 J210=1,INUM
+ WRITE (*,9012) PSEC4(J220 * KLINE + J210)
+ 210 CONTINUE
+ 220 CONTINUE
+C
+C -----------------------------------------------------------------
+C
+C
+C
+C
+C
+C
+C
+C* Section 9 . Format statements. Return to calling routine.
+C -----------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ 9000 FORMAT (1H )
+ 9001 FORMAT (1H ,'Section 4 - Binary Data Section.')
+ 9002 FORMAT (1H ,'-------------------------------------')
+ 9003 FORMAT (1H ,'Number of data values coded/decoded. ',I9)
+ 9004 FORMAT (1H ,'Number of bits per data value. ',I9)
+ 9005 FORMAT (1H ,'Type of data indicator. ',I9)
+ 9006 FORMAT (1H ,'Type of packing indicator. ',I9)
+ 9007 FORMAT (1H ,'Type of data representation. ',I9)
+ 9008 FORMAT (1H ,'Additional flags indicator. ',I9)
+ 9009 FORMAT (1H ,'Reserved. ',I9)
+ 9010 FORMAT (1H ,'Number of values indicator. ',I9)
+ 9011 FORMAT (1H ,'First ',I4,' data values.')
+ 9012 FORMAT (1H ,F30.15)
+C
+ RETURN
+C
+ END
diff --git a/interpolation/ll2xyz.F b/interpolation/ll2xyz.F
new file mode 100755
index 0000000..3567024
--- /dev/null
+++ b/interpolation/ll2xyz.F
@@ -0,0 +1,98 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE LL2XYZ(RLAT,RLONG,X,Y,Z,INROW)
+C---->
+C**** LL2XYZ
+C
+C Purpose
+C -------
+C
+C Converts an array of latitude/longitude values to an
+C array of (x,y,z) coordinates.
+C
+C
+C Interface
+C ---------
+C
+C CALL LL2XYZ(RLAT,RLONG,X,Y,Z,INROW)
+C
+C Input
+C -----
+C
+C RLAT - Array of latitudes.
+C RLONG - Array of corresponding longitudes.
+C INROW - Count of latitudes/longitudes.
+C
+C
+C Output
+C ------
+C
+C (X,Y,Z) - Array of coordinates.
+C
+C
+C Method
+C ------
+C
+C Z axis is the polar axis directed from south to north.
+C X and Y axes are in the equatorial plane and have origin at the
+C centre of the Earth. The X axis passes through (O north, 0 east).
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ REAL RLAT,RLONG,X,Y,Z
+ DIMENSION RLONG(*),X(*),Y(*),Z(*)
+ INTEGER INROW
+C
+C Parameters
+C
+ INTEGER JPMAXGG
+ PARAMETER( JPMAXGG = 1280 )
+C
+C Local variables
+C
+ REAL FACTOR, COS_LAT, SIN_LAT, COS_LON, SIN_LON
+ DIMENSION COS_LON(JPMAXGG), SIN_LON(JPMAXGG)
+ DATA FACTOR/0.017453293/
+ INTEGER LOOP
+ REAL ALAT
+C
+ ALAT = RLAT * FACTOR
+ COS_LAT = COS(ALAT)
+ SIN_LAT = SIN(ALAT)
+C
+ DO LOOP = 1, INROW
+ COS_LON(LOOP) = COS(RLONG(LOOP)*FACTOR)
+ SIN_LON(LOOP) = SIN(RLONG(LOOP)*FACTOR)
+C
+ X(LOOP) = COS_LAT*COS_LON(LOOP)
+ Y(LOOP) = COS_LAT*SIN_LON(LOOP)
+ Z(LOOP) = SIN_LAT
+ ENDDO
+C
+ RETURN
+ END
+
diff --git a/interpolation/lrekam.F b/interpolation/lrekam.F
new file mode 100755
index 0000000..2c9b01f
--- /dev/null
+++ b/interpolation/lrekam.F
@@ -0,0 +1,208 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION LREKAM(SHCIN,KTRUNC,SHCOUT,RANGLES)
+C
+C---->
+C**** LREKAM
+C
+C Purpose
+C -------
+C
+C Reverses the rotation of a spherical harmonic field done by
+C MAKERL.
+C
+C
+C Interface
+C ---------
+C
+C IRET = LREKAM(SHCIN,KTRUNC,SHCOUT,RANGLES)
+C
+C Input
+C -----
+C
+C SHCIN - Input array of spherical harmonics.
+C KTRUNC - Truncation of the spherical harmonics.
+C RANGLES - Coordinates of the south pole of rotation:
+C latitude/longitude.
+C
+C
+C Output
+C ------
+C
+C SHCOUT - Output array of rotated spherical harmonics.
+C
+C Function returns 0 if all OK, otherwise the rotations failed.
+C
+C
+C Method
+C ------
+C
+C Calls JACOBI and RPHI in the reverse order to that done by MAKERL.
+C
+C
+C Externals
+C ---------
+C
+C RPHI - Rotates spectral coefficients by longitude.
+#ifdef __uxp__
+C JACOBIF - Rotates spectral coefficients by latitude.
+#else
+C JACOBI - Rotates spectral coefficients by latitude.
+#endif
+C INTLOG - Logs messages.
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF October, 1995.
+C
+C
+C----<
+C---------------------------------------------------------------------
+C
+C
+ IMPLICIT NONE
+#include "parim.h"
+#include "nofld.common"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 28400)
+ INTEGER JPLEN, JPNM
+ PARAMETER ( JPNM = JPSTRUNC )
+ PARAMETER ( JPLEN = (JPNM+1)*(JPNM+2) )
+C
+C Function arguments.
+C
+ REAL SHCIN, SHCOUT, RANGLES
+ DIMENSION SHCIN(*), SHCOUT(*), RANGLES(*)
+ INTEGER KTRUNC
+C
+C Local variables
+C
+ REAL*8 DLON, DLAT
+ REAL*8 WORK
+ DIMENSION WORK(2*(JPNM+1)*(JPNM+6))
+ LOGICAL LOK
+ INTEGER NBYTES, LOOP
+#if (defined CRAY) || (defined REAL_8)
+ DATA NBYTES/8/
+#else
+ DATA NBYTES/4/
+ REAL*8 DATA
+ DIMENSION DATA(JPLEN)
+#endif
+C
+C Externals
+C
+#ifdef __uxp__
+ LOGICAL JACOBIF
+ EXTERNAL JACOBIF
+#else
+ LOGICAL JACOBI
+ EXTERNAL JACOBI
+#endif
+C
+C _______________________________________________________
+C
+C* Section 1. Initialise.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ LREKAM = 0
+C
+C Check truncation not too big to handle.
+C
+ IF( KTRUNC .GT. JPSTRUNC ) THEN
+ CALL INTLOG(JP_FATAL,'LREKAM: Truncation max exceeded', JPQUIET)
+ CALL INTLOG(JP_FATAL,'LREKAM: Truncation = ', KTRUNC)
+ CALL INTLOG(JP_FATAL,'LREKAM: Allowed maximum = ', JPSTRUNC)
+ LREKAM = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Rotate the spectral coefficients.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+#if (defined CRAY) || (defined REAL_8)
+ DLAT = -(-90.0 - RANGLES(1))
+ DLON = RANGLES(2)
+C
+C Rotate the spectral field by latitude.
+C Negative DLAT => rotate counter-clockwise about new polar axis.
+C
+#if (defined __uxp__)
+ LOK = JACOBIF( SHCIN, KTRUNC, WORK, DLAT)
+#else
+ LOK = JACOBI( SHCIN, KTRUNC, WORK, DLAT)
+#endif
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_FATAL,'LREKAM: JACOBI failed.', JPQUIET)
+ LREKAM = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Rotate the spectral field by longitude.
+C Positive DLON => frame rotated from west to east.
+C
+ DO 210 LOOP = 1, (KTRUNC+1)*(KTRUNC+2)
+ SHCOUT(LOOP) = SHCIN(LOOP)
+ 210 CONTINUE
+ CALL RPHI( SHCOUT, KTRUNC, WORK, DLON)
+#else
+ DLAT = -(-90.0 - DBLE(RANGLES(1)))
+ DLON = DBLE(RANGLES(2))
+C
+C Expand spectral coefficients to REAL*8
+ DO 210 LOOP = 1, (KTRUNC+1)*(KTRUNC+2)
+ DATA(LOOP) = DBLE(SHCIN(LOOP))
+ 210 CONTINUE
+C
+C Rotate the spectral field by latitude.
+C Negative DLAT => rotate counter-clockwise about new polar axis.
+C
+#if (defined __uxp__)
+ LOK = JACOBIF( DATA, KTRUNC, WORK, DLAT)
+#else
+ LOK = JACOBI( DATA, KTRUNC, WORK, DLAT)
+#endif
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_FATAL,'LREKAM: JACOBI failed.', JPQUIET)
+ LREKAM = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Rotate the spectral field by longitude.
+C Positive DLON => frame rotated from west to east.
+C
+ CALL RPHI( DATA, KTRUNC, WORK, DLON)
+C
+C Repack spectral coefficients to REAL*4.
+ DO 220 LOOP = 1, (KTRUNC+1)*(KTRUNC+2)
+ SHCOUT(LOOP) = SNGL(DATA(LOOP))
+ 220 CONTINUE
+#endif
+C
+C _______________________________________________________
+C
+C* Section 9. Return.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/lsm_red.F b/interpolation/lsm_red.F
new file mode 100755
index 0000000..97c56b1
--- /dev/null
+++ b/interpolation/lsm_red.F
@@ -0,0 +1,317 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION LSM_RED( KGAUSS, KDATE, KBITS, HPATH )
+C
+C---->
+C**** LSM_RED
+C
+C PURPOSE
+C -------
+C
+C Generates the land sea mask file pathname.
+C
+C
+C INTERFACE
+C ---------
+C
+C IRET = LSM_RED( KGAUSS, KDATE, KBITS, HPATH )
+C
+C
+C Input
+C -----
+C KGAUSS - The gaussian number (80 or 160)
+C KDATE - The data date in YYYYMMDD format.
+C KBITS - Number of bits per land-sea mask value (eg 32 or 64)
+C
+C Output
+C ------
+C HPATH - The full file pathname (with gaussian number
+C number of bits and date).
+C
+C
+C Return value
+C ------------
+C
+C Function returns the number of characters in the file pathname,
+C or zero if no match found.
+C
+C
+C Common block usage
+C ------------------
+C
+C None
+C
+C
+C EXTERNALS
+C ---------
+C
+C GETENV - Standard routine to get environmental variable.
+C INDEX - Intrinsic routine to find position of substring.
+C LEN - Intrinsic routine to find length of string.
+C EMOSNUM - Gives current EMOSLIB version number.
+C
+C
+C METHOD
+C ------
+C None
+C
+C
+C REFERENCE
+C ---------
+C
+C None
+C
+C COMMENTS
+C --------
+C
+C None
+C
+C
+C AUTHOR
+C ------
+C
+C J.D.Chambers *ECMWF* ??? 1996
+C
+C
+C MODIFICATIONS
+C -------------
+C
+C J.D.Chambers *ECMWF* July 1998
+C Use dates in YYYYMMDD format to handle year 2000 etc.
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+C Parameters
+C
+ INTEGER JPD160, JPD80
+ PARAMETER (JPD160=6)
+ PARAMETER (JPD80=2)
+C
+C Function parameters
+C
+ INTEGER KGAUSS, KDATE, KBITS
+ CHARACTER*(*) HPATH
+C
+C Local variables
+C
+ CHARACTER*6 YEMOSNM
+ INTEGER IEMOSNM, LOOP, IOFFSET
+C
+C Change dates for N160
+C
+ INTEGER DATE160(JPD160)
+ DATA DATE160/
+ X 19790930,
+ X 19910917,
+ X 19930804,
+ X 19940302,
+ X 19940823,
+ X 19950404
+ X /
+C
+C Change dates for N80
+C
+ INTEGER DATE80(JPD80)
+ DATA DATE80/
+ X 19790930,
+ X 19790930
+ X /
+C
+ CHARACTER YPENVIRON*13
+ PARAMETER (YPENVIRON = 'MARS_LSM_PATH')
+ CHARACTER*80 YBASE, YENVBACK
+ INTEGER IBASELEN
+ CHARACTER*256 HDIREC
+
+
+#ifdef CRAY
+ DATA HDIREC/ '/owrk/marsint/new'/
+#endif
+
+#ifdef __uxp__
+ DATA HDIREC/ '/mrfs/postproc'/
+#endif
+
+#ifdef TABLE_PATH
+ DATA HDIREC / TABLE_PATH /
+#else
+ DATA HDIREC / '' /
+#endif
+
+ CHARACTER*50 PATH160(JPD160)
+ CHARACTER*50 PATH80(JPD80)
+C
+C Pathnames for N160
+C
+ DATA PATH160/
+ X '_19790930',
+ X '_19910917',
+ X '_19930804',
+ X '_19940302',
+ X '_19940823',
+ X '_19950404'
+ X /
+C
+C
+C Pathnames for N80
+ DATA PATH80/
+ X '_19790930',
+ X '_19790930'
+ X /
+C
+ INTEGER INDEX
+C
+C External functions
+C
+ INTEGER EMOSNUM
+ EXTERNAL EMOSNUM
+C
+C***************************************************************
+C Section 1. Initialize and check input values.
+C***************************************************************
+C
+ 100 CONTINUE
+C
+ LSM_RED = 0
+ HPATH = ' '
+C
+C Only reduced N160 gaussian fields handled.
+C
+ IF( KGAUSS.NE.160 ) GOTO 900
+C
+C Only 32 bit and 64 bit land-sea masks handled.
+C
+ IF( (KBITS.NE.32).AND.(KBITS.NE.64) ) GOTO 900
+C
+C Check environment variable for path of land sea masks.
+C
+ CALL GETENV(YPENVIRON, YENVBACK)
+C
+ IF( YENVBACK.EQ.' ' ) THEN
+#ifdef __uxp__
+C
+C On Fujitsus, need to build different pathname for vpp300,
+C vpp700, vpp700e and vpp5000
+C
+ CALL GETENV ('HOST', YENVBACK)
+ IF( YENVBACK(1:7).EQ.'vpp5000' )THEN
+ YBASE = '/vpp5000' // HDIREC
+ IBASELEN = LEN(HDIREC) + LEN('/vpp5000')
+ ELSE IF( YENVBACK(1:7).EQ.'vpp700e' )THEN
+ YBASE = '/vpp700e' // HDIREC
+ IBASELEN = LEN(HDIREC) + LEN('/vpp700e')
+ ELSE IF( YENVBACK(1:6).EQ.'vpp700' )THEN
+ YBASE = '/vpp700' // HDIREC
+ IBASELEN = LEN(HDIREC) + LEN('/vpp700')
+ ELSE
+ YBASE = HDIREC
+ IBASELEN = LEN(HDIREC)
+ ENDIF
+#else
+ IOFFSET = INDEX(HDIREC,' ') - 1
+ IF(IOFFSET.GT.0) THEN
+ YBASE = HDIREC(1:IOFFSET)//'/land_sea_mask/'
+ IBASELEN = LEN(YBASE)
+ ELSE
+ YBASE = '/usr/local/lib/metaps/tables/interpolation'
+ IBASELEN = 42
+ ENDIF
+#endif
+ ELSE
+ YBASE = YENVBACK
+ IBASELEN = INDEX(YENVBACK,' ') - 1
+ IF( IBASELEN.LT.0 ) IBASELEN = LEN (YENVBACK)
+ IF( IBASELEN.EQ.0 ) THEN
+#ifdef __uxp__
+C
+C On Fujitsus, need to build different pathname for vpp300,
+C vpp700, vpp700e and vpp5000
+C
+ CALL GETENV ('HOST', YENVBACK)
+ IF( YENVBACK(1:7).EQ.'vpp5000' )THEN
+ YBASE = '/vpp5000' // HDIREC
+ IBASELEN = LEN(HDIREC) + LEN('/vpp5000')
+ ELSE IF( YENVBACK(1:7).EQ.'vpp700e' )THEN
+ YBASE = '/vpp700e' // HDIREC
+ IBASELEN = LEN(HDIREC) + LEN('/vpp700e')
+ ELSE IF( YENVBACK(1:6).EQ.'vpp700' )THEN
+ YBASE = '/vpp700' // HDIREC
+ IBASELEN = LEN(HDIREC) + LEN('/vpp700')
+ ELSE
+ YBASE = HDIREC
+ IBASELEN = LEN(HDIREC)
+ ENDIF
+#else
+ YBASE = HDIREC
+ IBASELEN = LEN(HDIREC)
+#endif
+ ENDIF
+ ENDIF
+C
+C***************************************************************
+C Section 2. Build pathnames.
+C***************************************************************
+C
+ 200 CONTINUE
+C
+C Handle N160
+C
+ IF( KGAUSS.EQ.160 ) THEN
+ DO 210 LOOP = 1, JPD160-1
+ IF( (KDATE.GE.DATE160(LOOP) ) .AND.
+ X (KDATE.LT.DATE160(LOOP+1)) ) THEN
+ HPATH(1:) = YBASE(1:IBASELEN) // '/' //
+ X 'r160_' // 'xx' // PATH160(LOOP)
+ LSM_RED = INDEX(HPATH,' ')
+ GOTO 900
+ ENDIF
+ 210 CONTINUE
+C
+C Dropthrough -> take latest.
+C
+ HPATH(1:) = YBASE(1:IBASELEN) // '/' //
+ X 'r160_' // 'xx' // PATH160(JPD160)
+ LSM_RED = INDEX(HPATH,' ')
+C
+C Handle N80
+C
+ ELSE
+ DO 220 LOOP = 1, JPD80-1
+ IF( (KDATE.GE.DATE80(LOOP) ) .AND.
+ X (KDATE.LT.DATE80(LOOP+1)) ) THEN
+ HPATH(1:) = YBASE(1:IBASELEN) // '/' //
+ X 'r80_' // 'xx' // PATH80(LOOP)
+ LSM_RED = INDEX(HPATH,' ')
+ GOTO 900
+ ENDIF
+ 220 CONTINUE
+C
+C Dropthrough -> take latest.
+C
+ HPATH(1:) = YBASE(1:IBASELEN) // '/' //
+ X 'r80_' // 'xx' // PATH80(JPD80)
+ LSM_RED = INDEX(HPATH,' ')
+ ENDIF
+C
+C***************************************************************
+C Section 9. Return.
+C***************************************************************
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/lsmfld.F b/interpolation/lsmfld.F
new file mode 100755
index 0000000..8fb297e
--- /dev/null
+++ b/interpolation/lsmfld.F
@@ -0,0 +1,125 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ LOGICAL FUNCTION LSMFLD()
+C
+C---->
+C**** LSMFLD
+C
+C Purpose
+C -------
+C
+C Determines whether or not the current field is to be
+C considered for 'land-sea mask' treatment.
+C
+C
+C Interface
+C ---------
+C
+C LLSMFLD = LSMFLD()
+C
+C Input
+C -----
+C
+C None
+C
+C
+C Output
+C ------
+C
+C Function returns .TRUE. if the field is to be treated with
+C land-sea mask.
+C
+C
+C Method
+C ------
+C
+C Uses a set of hardcoded rules.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Logs messages
+C
+C Uses common blocks nifld.common and nofld.common.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF April 2001
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Local variables
+C
+ LOGICAL LIKELY
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+C If 'uselsm' has been forced to 'yes' ...
+C
+ IF( LSMSET ) THEN
+ LSMFLD = LSM
+ GOTO 900
+ ENDIF
+C
+C WMO International table 001 for meteorological parameters
+C
+ IF ( NITABLE.EQ.1 ) THEN
+ LIKELY = ( NIPARAM.NE.2 )
+C
+C ECMWF local code table 128 for meteorological parameters
+C
+ ELSEIF ( (NITABLE.EQ.128).OR.(NITABLE.EQ.129) ) THEN
+ LIKELY = ( NIPARAM.NE.151 ).AND.
+ X ( NIPARAM.NE.172 )
+ ELSE
+ LIKELY = .FALSE.
+ ENDIF
+C
+ IF( .NOT.LIKELY ) THEN
+ LSMFLD = .FALSE.
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Work through the special cases
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( .NOT.LSMFLD ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'LSMFLD: Do not handle field with land-sea mask', JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'LSMFLD: Handle field with land-sea mask', JPQUIET)
+ ENDIF
+C
+ RETURN
+ END
diff --git a/interpolation/make.dep b/interpolation/make.dep
new file mode 100755
index 0000000..a316ebd
--- /dev/null
+++ b/interpolation/make.dep
@@ -0,0 +1,212 @@
+#
+# Header file dependencies
+#
+#
+areachk.o: parim.h nifld.common nofld.common
+auresol.o: parim.h nifld.common nofld.common
+chkprec.o: parim.h nifld.common
+clear_c.o: parim.h nifld.common nofld.common grfixed.h current.h
+ddstyle.o: jparams.h parim.h nofld.common
+dssarea.o: parim.h nifld.common nofld.common
+fixarea.o: parim.h nifld.common nofld.common grfixed.h intf.h
+freecf.o: jparam2.h
+gb2gb.o: jparams.h parim.h nofld.common
+getconf.o: nifld.common parim.h jparams.h
+ggintrp.o: parim.h
+ggrotat.o: parim.h
+hgengg.o: parim.h nofld.common
+hgengrd.o: parim.h
+hgengrw.o: parim.h
+hgenll.o: parim.h
+hgenllw.o: parim.h
+hgetlsm.o: parim.h nifld.common nofld.common
+hirlam.o: parim.h nifld.common nofld.common
+hirlamw.o: parim.h nifld.common nofld.common jparams.h
+hirlsm.o: parim.h nifld.common nofld.common
+hll2ll.o: parim.h
+hll2llw.o: parim.h
+hnei12.o: parim.h
+hneill.o: parim.h
+hntfap.o: parim.h nifld.common nofld.common grfixed.h intf.h
+hntfaph.o: parim.h nifld.common nofld.common grfixed.h intf.h jparams.h
+hntfaph.o: current.h
+hntfaps.o: parim.h nifld.common nofld.common grfixed.h intf.h
+hntfau.o: parim.h nifld.common nofld.common grfixed.h intf.h
+hntfauh.o: parim.h nifld.common nofld.common grfixed.h intf.h jparams.h
+hntfauh.o: current.h intlog.h
+hntfaus.o: parim.h nifld.common nofld.common grfixed.h intf.h
+hntfbu.o: parim.h nifld.common nofld.common grfixed.h intf.h
+hrg2gg.o: parim.h
+hrg2ggw.o: parim.h
+hrg2ll.o: parim.h
+hrg2llw.o: parim.h nifld.common nofld.common
+hsp2gg.o: parim.h
+iafree.o: parim.h memreq.h nifld.common nofld.common
+iagcntl.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+iaidef.o: parim.h nifld.common
+iainit.o: parim.h memreq.h nifld.common nofld.common grfixed.h
+iaintgg.o: parim.h nifld.common nofld.common grfixed.h ouspace.h
+iaintll.o: parim.h nifld.common nofld.common grfixed.h ouspace.h
+iaogdef.o: parim.h nofld.common
+iaoldef.o: parim.h nofld.common
+iarcntl.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+iareset.o: parim.h nofld.common
+iarmem.o: parim.h nifld.common nofld.common ouspace.h
+ibasini.o: parim.h nifld.common nofld.common intf.h
+igalloc.o: parim.h memreq.h
+igbess.o: jparams.h parim.h
+igdins.o: parim.h
+igdiwe.o: parim.h
+igglat.o: jparams.h parim.h
+iggmem.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+iggrid.o: parim.h
+igint.o: parim.h
+igintr.o: parim.h
+iglgrid.o: parim.h
+iglrev.o: parim.h
+iglsize.o: parim.h
+iglsm01.o: parim.h jparams.h
+iglsmb.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+iglsmd.o: parim.h
+iglsmr.o: parim.h
+iglsmst.o: parim.h jparams.h
+ignorm.o: parim.h
+igplsm.o: parim.h
+igpoleg.o: parim.h nifld.common
+igpolew.o: parim.h nifld.common
+igprec.o: parim.h nifld.common
+igscan.o: parim.h
+igsetup.o: parim.h nifld.common nofld.common
+igsize.o: parim.h
+igtog.o: parim.h nifld.common nofld.common
+igtogr.o: parim.h nifld.common nofld.common
+igtran.o: parim.h
+init_cm.o: parim.h nifld.common nofld.common grfixed.h current.h
+insane.o: parim.h nifld.common nofld.common grfixed.h
+intf.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intfa.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intfap.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intfau.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intfb.o: parim.h nifld.common nofld.common grfixed.h intf.h jparams.h
+intfbp.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intfbu.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intfc.o: parim.h nifld.common nofld.common grfixed.h
+intin.o: parim.h nifld.common nofld.common grfixed.h current.h
+intisl.o: parim.h intisl.h nifld.common nofld.common
+intlog.o: parim.h intlog.h
+intlogd.o: intlog.h
+intlogr.o: parim.h intlog.h
+intocn.o: parim.h
+intout.o: parim.h nifld.common nofld.common grfixed.h current.h
+intpnum.o: grprs.h
+intuvdh.o: parim.h intf.h nifld.common nofld.common
+intuvf.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intuvgh.o: parim.h nifld.common nofld.common grfixed.h intf.h intlog.h
+intuvgh.o: current.h
+intuvp.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intuvph.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intuvs.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intuvu.o: parim.h nifld.common nofld.common grfixed.h intf.h
+intuvxh.o: parim.h nifld.common nofld.common intf.h current.h
+intvect.o: parim.h nifld.common nofld.common intf.h current.h
+intwave.o: parim.h nifld.common nofld.common intf.h grfixed.h
+irdiwe.o: parim.h
+irgmem.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+irgrid.o: parim.h nifld.common
+irgtog.o: parim.h nifld.common nofld.common
+irint.o: parim.h
+irintr.o: parim.h
+irlrev.o: parim.h
+irlsmb.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+irprec.o: parim.h nifld.common
+irscan.o: parim.h
+irsize.o: parim.h
+iscrsz.o: parim.h nifld.common nofld.common grfixed.h
+islproc.o: intisl.h parim.h nifld.common nofld.common
+issame.o: parim.h nifld.common nofld.common grfixed.h
+jacobi.o: jparams.h parim.h
+jacobif.o: jparams.h parim.h
+jagggp.o: jparams.h parim.h current.h nifld.common nofld.common grfixed.h
+jallgp.o: jparams.h parim.h nifld.common
+jallwn.o: jparams.h parim.h nifld.common
+jdebug.o: jparams.h jparam2.h
+jgetgg.o: parim.h nifld.common nofld.common grfixed.h intf.h rgauss_032.h
+jgetgg.o: rgauss_048.h rgauss_080.h rgauss_080_19940113.h rgauss_128.h
+jgetgg.o: rgauss_160.h rgauss_160_19931222.h rgauss_200.h rgauss_256.h
+jgetgg.o: rgauss_320.h rgauss_400.h rgauss_512.h rgauss_1024.h
+jgglat.o: jparams.h parim.h
+jintgg.o: jparams.h parim.h
+jintll.o: jparams.h parim.h
+jjset99.o: jparams.h parim.h
+jmakgg.o: jparams.h parim.h
+jmakgg3.o: jparams.h parim.h
+jmakll.o: jparams.h parim.h
+jmakll3.o: jparams.h parim.h
+jmemhan.o: jparams.h jparam2.h parim.h
+jmovgg.o: jparams.h parim.h
+jmovll.o: jparams.h parim.h
+jmvugg.o: jparams.h parim.h
+jmvull.o: jparams.h parim.h
+jnorsgg.o: parim.h
+jnumgg.o: jparams.h parim.h
+jnumggq.o: jparams.h parim.h
+jopngg.o: parim.h
+jopnggf.o: parim.h jparams.h jparam2.h
+jopnll.o: parim.h
+jopnllf.o: parim.h jparams.h jparam2.h
+jreadgg.o: jparams.h parim.h
+jreadll.o: jparams.h parim.h
+jsgggp.o: jparams.h parim.h current.h nifld.common nofld.common grfixed.h
+jsllgp.o: jparams.h parim.h nifld.common
+jspleg1.o: jparams.h
+jstrll.o: jparams.h parim.h nifld.common
+jstrwll.o: jparams.h parim.h nifld.common
+jsymgg.o: jparams.h parim.h nifld.common
+jsymll.o: jparams.h parim.h nifld.common
+juvpole.o: jparams.h parim.h current.h nofld.common grfixed.h
+jwindll.o: jparams.h parim.h nifld.common
+jwscal.o: jparams.h
+kintrg.o: intisl.h parim.h nifld.common nofld.common
+knfrom4.o: intisl.h parim.h nifld.common
+krg2rg.o: parim.h intisl.h nifld.common nofld.common
+krg2rgu.o: parim.h intisl.h nifld.common nofld.common
+lrekam.o: parim.h nofld.common
+lsmfld.o: parim.h nifld.common nofld.common
+makerl.o: parim.h nofld.common
+mkbitmp.o: parim.h jparams.h nofld.common
+mkframe.o: parim.h jparams.h
+newisl.o: intisl.h parim.h
+ngintrp.o: parim.h
+ngrotat.o: parim.h intf.h
+nmakgg.o: jparams.h parim.h
+nmakll.o: jparams.h parim.h
+oceanp.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+oceanp.o: intf.h
+pddefs.o: parim.h nifld.common
+ppallow.o: jparams.h parim.h
+precip.o: parim.h nifld.common nofld.common
+reset_c.o: parim.h nifld.common nofld.common grfixed.h current.h
+rphi.o: jparams.h
+set99.o: jparams.h
+sprotat.o: parim.h
+tatorgg.o: parim.h
+w251idx.o: parim.h
+waveidx.o: parim.h
+wavexxx.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+wv2di32.o: parim.h
+wv2didx.o: parim.h
+wv2dint.o: parim.h
+wv2dx32.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+wv2dxxx.o: parim.h nifld.common nofld.common grspace.h grfixed.h grdynam.h
+wvqlidx.o: parim.h
+wvqlint.o: parim.h
+zprec.o: parim.h nifld.common
+createSharedMemoryCoefficients.o: fortdefs.h
+fftchk.o: fortint.h
+gmapbit.o: bitmap.h
+makemap.o: bitmap.h
+sharedMemoryCharacteristics.o: fortdefs.h
+showmap.o: bitmap.h
+smread.o: fortdefs.h
+soffset.o: fortint.h
+valpina.o: fortint.h
diff --git a/interpolation/makemap.c b/interpolation/makemap.c
new file mode 100755
index 0000000..1324079
--- /dev/null
+++ b/interpolation/makemap.c
@@ -0,0 +1,313 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "bitmap.h"
+
+#define BUFFLEN 50000
+#define NOTSET -1
+
+fortint MAKEMAP(
+ char * filename,
+ fortint *n,
+ fortint *m,
+ char ** mybitmap,
+ fortint filenameLength) {
+/*
+// Builds a bitmap in memory from the definition in a file.
+//
+// Called from FORTRAN:
+//
+// STATUS = MAKEMAP(FILENAME,N,M,BITMAP)
+//
+// where:
+//
+// FILENAME is a FORTRAN CHARACTER variable containing the file name.
+//
+// Returns:
+//
+// N is the number of rows in the bitmap.
+// M is the number of columns in the bitmap.
+// BITMAP is the binary map expanded in memory.
+//
+// STATUS = 0 if the processing is successful.
+//
+*/
+FILE * in;
+char * bitmap;
+char buffer[BUFFLEN];
+int rowCount, columnCount;
+int start, finish, defaultValue, size, i;
+int firstColumn, lastColumn, rowNumber, columnNumber;
+char defaultValueSetting, delimiter = '\1', previousDelimiter = '\0';
+static int oldRow = NOTSET;
+char * fileName, *p;
+
+/*
+// Open and read the file containing the bitmap definition.
+*/
+ fileName = (char *) malloc(filenameLength+1);
+ if( fileName == NULL ) {
+ perror("MAKEMAP: malloc error");
+ exit(1);
+ }
+ strncpy(fileName,filename,filenameLength);
+ fileName[filenameLength] = '\0';
+ p = fileName + filenameLength - 1;
+ while ( *p == ' ' ) *(p--) = '\0';
+
+ in = fopen(fileName,"r");
+ if( in == NULL ) {
+ printf("MAKEMAP: Problem opening bitmap file: %s\n",fileName);
+ perror("MAKEMAP: File open error");
+ return 1;
+ }
+ free(fileName);
+
+ fread(buffer, 1, BUFFLEN, in);
+ if( ! feof(in) ) {
+ printf("MAKEMAP: Internal buffer size too small = %d bytes\n", BUFFLEN);
+ return 2;
+ }
+
+/*
+// Check for "SPEC,SIZE="
+*/
+ if( strncmp(buffer,"SPEC",4) != 0 ) {
+ printf("MAKEMAP: Specification does not start with SPEC\n");
+ return 3;
+ }
+
+ start = 5;
+
+ if( strncmp((buffer+start),"SIZE=",5) != 0 ) {
+ printf("MAKEMAP: In specification, SPEC not followed by SIZE=\n");
+ return 4;
+ }
+
+/*
+// Get count of rows and columns
+*/
+ start = 1 + findCharacter(buffer,BUFFLEN,start,'=');
+ if( start == 0 ) {
+ printf("MAKEMAP: '=' missing in SIZE specification\n");
+ return 5;
+ }
+
+ finish = findCharacter(buffer,BUFFLEN,start,':');
+ if( finish == 0 ) {
+ printf("MAKEMAP: ':' missing in SIZE specification\n");
+ return 6;
+ }
+ rowCount = findNumber(buffer,BUFFLEN,start,&finish,':');
+ *n = rowCount;
+
+ start = 1 + finish;
+ finish = findCharacter(buffer,BUFFLEN,start,',');
+ if( finish == 0 ) {
+ printf("MAKEMAP: ',' missing after SIZE specification\n");
+ return 7;
+ }
+ columnCount = findNumber(buffer,BUFFLEN,start,&finish,',');
+ *m = columnCount;
+
+/*
+// Find default VALUE (OFF/ON)
+*/
+ start = 1 + finish;
+ if( strncmp((buffer+start),"VALUES=",7) != 0 ) {
+ printf("MAKEMAP: In specification, SIZE not followed by VALUES=\n");
+ return 8;
+ }
+ start += 7;
+ if( strncmp((buffer+start),"ON",2) == 0 ) {
+ defaultValueSetting = 0xff;
+ defaultValue = 1;
+ }
+ else {
+ defaultValueSetting = 0;
+ defaultValue = 0;
+ }
+
+/*
+// Claim memory for bitmap and fill it with default setting
+*/
+ size = (rowCount*columnCount+7)/8;
+ bitmap = (char *) malloc(size);
+ *mybitmap = bitmap;
+ for( i = 0; i < size; i++ )
+ bitmap[i] = defaultValueSetting;
+
+/*
+// Fill in the bits
+*/
+ start = findCharacter(buffer,BUFFLEN,start,'P');
+ if( start == 0 ) {
+ printf("MAKEMAP: '=' POINTS missing in specification\n");
+ return 9;
+ }
+ if( strncmp((buffer+start),"POINTS=",7) != 0 ) {
+ printf("MAKEMAP: In specification, VALUES= not followed by POINTS=\n");
+ return 10;
+ }
+
+ finish = start + 6;
+
+/*
+// Work through POINTS specification
+*/
+
+ do {
+ previousDelimiter = delimiter;
+ start = 1 + finish;
+ delimiter = findDelimiter(buffer,BUFFLEN,start);
+ if( delimiter == 0 ) {
+ fclose(in);
+ return 0;
+ }
+
+ switch( delimiter ) {
+
+ case '-': /* eg 03-08 */
+ firstColumn = findNumber(buffer,BUFFLEN,start,&finish,delimiter);
+ start = 1 + finish;
+ delimiter = findDelimiter(buffer,BUFFLEN,start);
+ lastColumn = findNumber(buffer,BUFFLEN,start,&finish,delimiter);
+ for(columnNumber=firstColumn; columnNumber<=lastColumn; columnNumber++)
+ setBit(bitmap,defaultValue,columnCount,rowNumber,columnNumber);
+ break;
+
+ case '/': /* eg 03/04 */
+ columnNumber = findNumber(buffer,BUFFLEN,start,&finish,delimiter);
+ setBit(bitmap,defaultValue,columnCount,rowNumber,columnNumber);
+ break;
+
+ case '\n': /* eg 03\n */
+ if( previousDelimiter == ',' ) {
+ finish++;
+ break;
+ }
+ if( previousDelimiter == '\n' ) {
+ if( (oldRow < rowCount) && (oldRow != NOTSET) ) {
+ int loop;
+
+ for( loop = (oldRow+1); loop <= rowCount; loop++ )
+ copyRow(bitmap, columnCount, oldRow, loop, defaultValue);
+ }
+ oldRow = rowCount;
+ fclose(in);
+ return 0;
+ }
+
+ case ',': /* eg 03, */
+ columnNumber = findNumber(buffer,BUFFLEN,start,&finish,delimiter);
+ if( columnNumber != 0 )
+ setBit(bitmap,defaultValue,columnCount,rowNumber,columnNumber);
+ break;
+
+ case ':': /* eg 01: */
+ rowNumber = findNumber(buffer,BUFFLEN,start,&finish,delimiter);
+ if( (oldRow < rowNumber) && (oldRow != NOTSET) ) {
+ int loop;
+
+ for( loop = (oldRow+1); loop < rowNumber; loop++ )
+ copyRow(bitmap, columnCount, oldRow, loop, defaultValue);
+ }
+ oldRow = rowNumber;
+ break;
+
+ default:
+ break;
+
+ }
+
+ } while( 1 );
+
+}
+
+int findNumber(char * buffer,int length,int start,int * finish,char delimiter) {
+char number[20];
+int end;
+
+ end = findCharacter(buffer,length,start,delimiter);
+ *finish = end;
+ strncpy(number,(buffer+start),(end-start));
+ number[(end-start)] = '\0';
+ return atoi(number);
+
+}
+
+char findDelimiter(char * buffer, int length, int point) {
+int i, j;
+char delimiter[5] = {'-','/',',','\n',':'};
+
+ for( i = point; i < length; i++ )
+ for( j = 0; j < 5; j++ )
+ if( buffer[i] == delimiter[j] ) return buffer[i];
+
+ return (char) 0;
+}
+
+int findCharacter(char * buffer, int length, int point, char character) {
+int i;
+
+ for( i = point; i < length; i++ )
+ if( buffer[i] == character ) return i;
+
+ return 0;
+}
+
+void setBit(char * buffer, int value, int columnCount, int row, int column) {
+int bitNumber, byte, bit;
+char mask[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
+
+ bitNumber = (row - 1)*columnCount + (column - 1);
+ byte = bitNumber / 8;
+ bit = bitNumber % 8;
+
+ if( value == 1 )
+ buffer[byte] &= (char) ~mask[bit];
+ else
+ buffer[byte] |= (char) mask[bit];
+
+ return;
+}
+
+void copyRow(char * buffer, int columnCount, int oldRow, int newRow, int value) {
+int oldByte, oldBit, newByte, newBit, bitNumber;
+char oldValue, newValue, mask;
+int loop;
+
+ for( loop = 0; loop < columnCount; loop++ ) {
+ bitNumber = (oldRow - 1)*columnCount + loop;
+ oldByte = bitNumber / 8;
+ oldBit = bitNumber % 8;
+ oldValue = (char) ((buffer[oldByte] >> (7-oldBit)) & 0x01);
+
+ bitNumber = (newRow - 1)*columnCount + loop;
+ newByte = bitNumber / 8;
+ newBit = bitNumber % 8;
+
+ newValue = oldValue << (7-newBit);
+ if( value == 1 ) {
+ mask = 1 << (7-newBit);
+ buffer[newByte] &= (char) ~mask;
+ buffer[newByte] |= (char) newValue;
+ }
+ else
+ buffer[newByte] |= newValue;
+ }
+
+}
diff --git a/interpolation/makerl.F b/interpolation/makerl.F
new file mode 100755
index 0000000..61b6c67
--- /dev/null
+++ b/interpolation/makerl.F
@@ -0,0 +1,209 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION MAKERL(SHCIN,KTRUNC,SHCOUT,RANGLES)
+C
+C---->
+C**** MAKERL
+C
+C Purpose
+C -------
+C
+C Rotates a spherical harmonic field.
+C
+C
+C Interface
+C ---------
+C
+C IRET = MAKERL(SHCIN,KTRUNC,SHCOUT,RANGLES)
+C
+C Input
+C -----
+C
+C SHCIN - Input array of spherical harmonics.
+C KTRUNC - Truncation of the spherical harmonics.
+C RANGLES - Coordinates of the south pole of rotation:
+C latitude/longitude.
+C
+C
+C Output
+C ------
+C
+C SHCOUT - Output array of rotated spherical harmonics.
+C
+C Function returns 0 if all OK, otherwise the rotations failed.
+C
+C
+C Method
+C ------
+C
+C None.
+C
+C
+C Externals
+C ---------
+C
+C RPHI - Rotates spectral coefficients by longitude.
+#ifdef __uxp__
+C JACOBIF - Rotates spectral coefficients by latitude.
+#else
+C JACOBI - Rotates spectral coefficients by latitude.
+#endif
+C INTLOG - Logs messages.
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF October, 1995.
+C
+C
+C----<
+C---------------------------------------------------------------------
+C
+C
+ IMPLICIT NONE
+#include "parim.h"
+#include "nofld.common"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 28300)
+ INTEGER JPLEN, JPNM
+ PARAMETER ( JPNM = JPSTRUNC )
+ PARAMETER ( JPLEN = (JPNM+1)*(JPNM+2) )
+C
+C Function arguments.
+C
+ REAL SHCIN, SHCOUT, RANGLES
+ DIMENSION SHCIN(*), SHCOUT(*), RANGLES(*)
+ INTEGER KTRUNC
+C
+C Local variables
+C
+ REAL*8 DLON, DLAT
+ REAL*8 WORK
+ DIMENSION WORK(2*(JPNM+1)*(JPNM+6))
+ LOGICAL LOK
+ INTEGER NBYTES, LOOP
+#if (defined CRAY) || (defined REAL_8)
+ DATA NBYTES/8/
+#else
+ DATA NBYTES/4/
+ REAL*8 DATA
+ DIMENSION DATA(JPLEN)
+#endif
+C
+C Externals
+C
+#ifdef __uxp__
+ LOGICAL JACOBIF
+ EXTERNAL JACOBIF
+#else
+ LOGICAL JACOBI
+ EXTERNAL JACOBI
+#endif
+C
+C _______________________________________________________
+C
+C* Section 1. Initialise.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ MAKERL = 0
+C
+C Check truncation not too big to handle.
+C
+ IF( KTRUNC .GT. JPSTRUNC ) THEN
+ CALL INTLOG(JP_FATAL,'MAKERL: Truncation max exceeded', JPQUIET)
+ CALL INTLOG(JP_FATAL,'MAKERL: Truncation = ', KTRUNC)
+ CALL INTLOG(JP_FATAL,'MAKERL: Allowed maximum = ', JPSTRUNC)
+ MAKERL = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Rotate the spectral coefficients.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+#if (defined CRAY) || (defined REAL_8)
+ DLAT = -90.0 - RANGLES(1)
+ DLON = -RANGLES(2)
+C
+C Rotate the spectral field by longitude.
+C Positive DLON => frame rotated from west to east.
+C
+ DO 210 LOOP = 1, (KTRUNC+1)*(KTRUNC+2)
+ SHCOUT(LOOP) = SHCIN(LOOP)
+ 210 CONTINUE
+ CALL RPHI( SHCOUT, KTRUNC, WORK, DLON)
+C
+C Rotate the spectral field by latitude.
+C Negative DLAT => rotate counter-clockwise about new polar axis.
+C
+#if (defined __uxp__)
+ LOK = JACOBIF( SHCOUT, KTRUNC, WORK, DLAT)
+#else
+ LOK = JACOBI( SHCOUT, KTRUNC, WORK, DLAT)
+#endif
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_FATAL,'MAKERL: JACOBI failed.', JPQUIET)
+ MAKERL = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+#else
+ DLAT = -90.0 - DBLE(RANGLES(1))
+ DLON = -DBLE(RANGLES(2))
+C
+C Expand spectral coefficients to REAL*8
+C
+ DO 210 LOOP = 1, (KTRUNC+1)*(KTRUNC+2)
+ DATA(LOOP) = DBLE(SHCIN(LOOP))
+ 210 CONTINUE
+C
+C Rotate the spectral field by longitude.
+C Positive DLON => frame rotated from west to east.
+C
+ CALL RPHI( DATA, KTRUNC, WORK, DLON)
+C
+C Rotate the spectral field by latitude.
+C Negative DLAT => rotate counter-clockwise about new polar axis.
+C
+#if (defined __uxp__)
+ LOK = JACOBIF( DATA, KTRUNC, WORK, DLAT)
+#else
+ LOK = JACOBI( DATA, KTRUNC, WORK, DLAT)
+#endif
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_FATAL,'MAKERL: JACOBI failed.', JPQUIET)
+ MAKERL = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Repack spectral coefficients to REAL*4.
+C
+ DO 220 LOOP = 1, (KTRUNC+1)*(KTRUNC+2)
+ SHCOUT(LOOP) = SNGL(DATA(LOOP))
+ 220 CONTINUE
+#endif
+C
+C _______________________________________________________
+C
+C* Section 9. Return.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/memreq.h b/interpolation/memreq.h
new file mode 100755
index 0000000..6f7e1a7
--- /dev/null
+++ b/interpolation/memreq.h
@@ -0,0 +1,79 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C**** "memreq.h"
+C
+C PURPOSE
+C _______
+C
+C This file contains the memory request definition variables.
+C
+C INTERFACE
+C _________
+C
+C #include "memreq.h"
+C
+C Common block usage
+C __________________
+C
+C MEMORY
+C
+C MADDR - The base addresses of the currently allocated
+C memory segments.
+C MREQUEST - The sizes of the current memory requests.
+C
+C METHOD
+C ______
+C
+C NONE
+C
+C REFERENCE
+C _________
+C
+C NONE
+C
+C COMMENTS
+C ________
+C
+C MREQUEST and MADDR are arrays to allow control of different
+C memory requests at different levels of the interpolation
+C software.
+C
+C Contains section 1
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Jan 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C NONE
+C
+C _______________________________________________________
+C
+C
+C* Section 1. Input field description
+C _______________________________________________________
+C
+C MREQUEST - The size of the current memory request.
+C MADDR - The base address for the current memory allocation.
+C
+#ifdef POINTER_64
+ INTEGER*8 MADDR(JPLEVEL)
+#else
+ INTEGER MADDR(JPLEVEL)
+#endif
+ INTEGER MREQUEST(JPLEVEL)
+C
+ COMMON /MEMORY/ MREQUEST, MADDR
+C
+ SAVE /MEMORY/
diff --git a/interpolation/mkbitmp.F b/interpolation/mkbitmp.F
new file mode 100755
index 0000000..d948609
--- /dev/null
+++ b/interpolation/mkbitmp.F
@@ -0,0 +1,177 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION MKBITMP(KWE,KNS,ZSEC4,ZMISS)
+C
+C---->
+C**** MKBITMP
+C
+C Purpose
+C -------
+C
+C Remove points using a bitmap.
+C
+C
+C Interface
+C ---------
+C
+C CALL MKBITMP(KWE,KNS,ZSEC4,ZMISS)
+C
+C Input
+C -----
+C
+C KWE - Number of points west-east in input field.
+C KNS - Number of points north-south in input field.
+C ZSEC4 - GRIBEX section 4 values in the field.
+C ZMISS - Value to be used as the missing data value..
+C
+C
+C Output
+C ------
+C
+C ZSEC4 - GRIBEX section 4 values with the points marked as
+C 'missing' by the bitmap replaced by missing data values.
+C
+C Function returns 0 if all OK.
+C
+C
+C Method
+C ------
+C
+C The field and bitmap are rectangular.
+C Use NOBITMP, the name of a file describing the bitmap.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C INTLOGR - Log error message.
+C MAKEMAP - Build a bitmap from definition in a file.
+C GMAPBIT - Get the bit value from a given position in a bitmap.
+C JFREE - Frees dynamically allocated memory.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF April 2000.
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ INTEGER KWE,KNS
+ REAL ZSEC4(*), ZMISS
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 44000 )
+C
+C Local variables
+C
+ INTEGER IRET,BITMAP,NROWS,NCOLS,NVALUE,NEXT,IROW,ICOL,NINDEX
+ INTEGER OLDROWS, OLDCOLS, LOOP
+ CHARACTER*256 OLDFILE
+ DATA OLDFILE/' '/, BITMAP/-1/
+ SAVE BITMAP,OLDROWS,OLDCOLS,OLDFILE
+C
+C Externals
+C
+ INTEGER MAKEMAP, GMAPBIT, JINDEX
+ EXTERNAL MAKEMAP, GMAPBIT, JINDEX
+C
+#include "parim.h"
+#include "jparams.h"
+#include "nofld.common"
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ MKBITMP = 0
+C
+C Only build bitmap if filename has changed since last time through
+C
+ NINDEX = JINDEX(NOBITMP)
+ IF( NINDEX.LT.1 ) THEN
+ CALL INTLOG(JP_WARN,'MKBITMP: No bitmap name given',JPQUIET)
+ CALL INTLOG(JP_WARN,'MKBITMP: BITMAP NOT APPLIED',JPQUIET)
+ MKBITMP = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+ IF( OLDFILE(1:NINDEX).NE.NOBITMP(1:NINDEX) ) THEN
+ OLDFILE(1:NINDEX) = NOBITMP(1:NINDEX)
+ IF( NDBG.NE.0 )
+ X CALL INTLOG(JP_DEBUG,
+ X 'MKBITMP: New BITMAP: '//OLDFILE(1:NINDEX),JPQUIET)
+C
+ IF( BITMAP.NE.-1 ) CALL JFREE(BITMAP)
+C
+ IRET = MAKEMAP(NOBITMP,NROWS,NCOLS,BITMAP)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_WARN,'MKBITMP: Failed to make bitmap',IRET)
+ CALL INTLOG(JP_WARN,'MKBITMP: BITMAP NOT APPLIED',JPQUIET)
+ DO LOOP = 1, 256
+ OLDFILE(LOOP:LOOP) = ' '
+ ENDDO
+ MKBITMP = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ OLDROWS = NROWS
+ OLDCOLS = NCOLS
+ ELSE
+ NROWS = OLDROWS
+ NCOLS = OLDCOLS
+ ENDIF
+C
+ IF( (NROWS.NE.KNS).OR.(NCOLS.NE.KWE) ) THEN
+ CALL INTLOG(JP_WARN,'MKBITMP: Bitmap invalid for area',JPQUIET)
+ CALL INTLOG(JP_WARN,'MKBITMP: No. of subarea rows = ',KNS)
+ CALL INTLOG(JP_WARN,'MKBITMP: No. of subarea columns = ',KWE)
+ CALL INTLOG(JP_WARN,'MKBITMP: No. of bitmap rows = ',NROWS)
+ CALL INTLOG(JP_WARN,'MKBITMP: No. of bitmap columns = ',NCOLS)
+ CALL INTLOG(JP_WARN,'MKBITMP: BITMAP NOT APPLIED',JPQUIET)
+ MKBITMP = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Use bitmap to force missing values
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( NDBG.NE.0 )
+ X CALL INTLOG(JP_DEBUG,'MKBITMP: BITMAP applied',JPQUIET)
+C
+ NEXT = 0
+ DO IROW = 1, KNS
+ DO ICOL = 1, KWE
+ NEXT = NEXT + 1
+ NVALUE = GMAPBIT(BITMAP,NCOLS,IROW,ICOL)
+ IF( NVALUE.EQ.0 ) ZSEC4(NEXT) = ZMISS
+ ENDDO
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/mkframe.F b/interpolation/mkframe.F
new file mode 100755
index 0000000..e274e68
--- /dev/null
+++ b/interpolation/mkframe.F
@@ -0,0 +1,115 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE MKFRAME(KWE,KNS,ZSEC4,ZMISS,KFRAME)
+C
+C---->
+C**** MKFRAME
+C
+C Purpose
+C -------
+C
+C Remove points from inside a frame boundary.
+C
+C
+C Interface
+C ---------
+C
+C CALL MKFRAME(KWE,KNS,ZSEC4,ZMISS,KFRAME)
+C
+C Input
+C -----
+C
+C KWE - Number of points west-east in input field.
+C KNS - Number of points north-south in input field.
+C ZSEC4 - GRIBEX section 4 values in the field.
+C ZMISS - Value to be used as the missing data value..
+C KFRAME - Number of points across the frame.
+C
+C
+C Output
+C ------
+C
+C ZSEC4 - GRIBEX section 4 values with the points inside the frame
+C replaced by missing data values.
+C
+C
+C Method
+C ------
+C
+C The field and frame are rectangular.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Log error message.
+C INTLOGR - Log error message.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF May 1999.
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ INTEGER KWE,KNS, KFRAME
+ REAL ZSEC4(*), ZMISS
+C
+C Local variables
+C
+ INTEGER TOP, BOTTOM, LEFT, RIGHT, LOOPO, LOOPI, NEXT
+C
+#include "parim.h"
+#include "jparams.h"
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF( KFRAME.LT.1 ) GOTO 900
+C
+ TOP = KFRAME + 1
+ BOTTOM = KNS - KFRAME
+ LEFT = KFRAME + 1
+ RIGHT = KWE - KFRAME
+C
+ IF( NDBG.GT.0 ) THEN
+ CALL INTLOG(JP_DEBUG,'MKFRAME: KFRAME = ', KFRAME)
+ CALL INTLOG(JP_DEBUG,'MKFRAME: TOP = ', TOP)
+ CALL INTLOG(JP_DEBUG,'MKFRAME: BOTTOM = ', BOTTOM)
+ CALL INTLOG(JP_DEBUG,'MKFRAME: LEFT = ', LEFT)
+ CALL INTLOG(JP_DEBUG,'MKFRAME: RIGHT = ', RIGHT)
+ CALL INTLOGR(JP_DEBUG,'MKFRAME: ZMISS = ', ZMISS)
+ ENDIF
+C
+ DO LOOPO = TOP, BOTTOM
+ NEXT = (LOOPO-1)*KWE + (LEFT-1)
+ DO LOOPI = LEFT, RIGHT
+ NEXT = NEXT + 1
+ ZSEC4(NEXT) = ZMISS
+ ENDDO
+ ENDDO
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/my_ialloc.c b/interpolation/my_ialloc.c
new file mode 100755
index 0000000..0667b04
--- /dev/null
+++ b/interpolation/my_ialloc.c
@@ -0,0 +1,41 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <sys/types.h>
+#include <sys/file.h>
+
+#define IA_CONT 00001
+
+#ifndef CRAY
+#ifdef FORTRAN_NO_UNDERSCORE
+#define MY_IALLOC my_ialloc
+#else
+#define MY_IALLOC my_ialloc_
+#endif
+#endif
+
+void MY_IALLOC( FILE ** kunit, long * isize, long * kret)
+{
+#ifdef CRAY
+int fdesc;
+int status;
+#endif
+
+ *kret = 0;
+#ifdef CRAY
+ fdesc = fileno( *kunit);
+ status = ialloc( fdesc, *isize, IA_CONT, 0);
+ if ( status == -1 ) *kret = 1;
+#endif
+ return;
+
+}
diff --git a/interpolation/newisl.F b/interpolation/newisl.F
new file mode 100755
index 0000000..8b23090
--- /dev/null
+++ b/interpolation/newisl.F
@@ -0,0 +1,304 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION NEWISL(OLDGEO,NEWGEO,OLDLSM,OLDFLD,MASTER,NEWFLD)
+C
+C---->
+C**** NEWISL
+C
+C Purpose
+C -------
+C
+C Interpolate a field based on an old land-sea mask to a field
+C based on a different land-sea mask.
+C
+C
+C Interface
+C ---------
+C
+C IRET = NEWISL(OLDGEO,NEWGEO,OLDLSM,OLDFLD,MASTER,NEWFLD)
+C
+C Input
+C -----
+C
+C OLDGEO - GRIB section 2 describing grid of old field.
+C NEWGEO - GRIB section 2 describing grid of new field.
+C OLDLSM - Array of land-sea mask values for old field.
+C OLDFLD - Array of values for old field.
+C MASTER - Array of land-sea mask values for new field.
+C
+C
+C Output
+C ------
+C
+C NEWFLD - Array of values for new field.
+C
+C Function returns:
+C - 0 if all is well
+C - 1, otherwise.
+C
+C
+C Method
+C ------
+C
+C Build up field offsets from input geometries.
+C For each point of the new field, find in the old field the four
+C nearest neighbours' positions, values and types.
+C Calculate new value from the neighbours.
+C
+C
+C Externals
+C ---------
+C
+C IGGLAT - Compute gaussian lines of latitude.
+C JNORSGG - Find gaussian latitudes to north and south of latitude.
+C ISLPROC - Calculate value of new field point.
+C INTLOG - Log messages
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF August 2000
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER OLDGEO(*),NEWGEO(*)
+ REAL OLDLSM(*),OLDFLD(*),MASTER(*),NEWFLD(*)
+C
+#include "intisl.h"
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPMAXLT, JPGAUSS, JP1000
+ PARAMETER (JPMAXLT=721)
+ PARAMETER (JPGAUSS=4)
+ PARAMETER (JP1000=1000)
+C
+C Local variables
+C
+ INTEGER TOTAL, NEXT, LOOP, NEWOFF(JPMAXLT), OLDOFF(JPMAXLT)
+ INTEGER LATIT, LONG, NEWTYPE, IRET, NPTS
+ INTEGER LAT(2), LON(4)
+ INTEGER PT(4), TYPE(4)
+ REAL OLAT(2), OLON(4)
+ REAL RLATOLD(JPMAXLT), RLATNEW(JPMAXLT), RLAT, RLON
+C
+C Externals
+C
+ INTEGER IGGLAT, JNORSGG
+ REAL ISLPROC
+ EXTERNAL IGGLAT, JNORSGG, ISLPROC
+C
+C -----------------------------------------------------------------|
+C* Section 1. Build working values using input geometries.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ NEWISL = 0
+C
+C -----------------------------------------------------------------|
+C* Section 2. Calculate number of points in new field and offset
+C to start of each latitude in the new grid
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ IF( NEWGEO(1).EQ.JPGAUSS ) THEN
+C
+C New field is gaussian
+C
+ CALL INTLOG(JP_DEBUG,'NEWISL: New field is gaussian',JPQUIET)
+C
+ IF( NEWGEO(17).EQ.0 ) THEN
+ CALL INTLOG(JP_DEBUG,'NEWISL: New field is regular',JPQUIET)
+ TOTAL = NEWGEO(2)*NEWGEO(3)
+ NEWOFF(1) = 0
+ DO LOOP = 2, NEWGEO(NJ)
+ NEWOFF(LOOP) = NEWOFF(LOOP-1) + NEWGEO(2)
+ ENDDO
+ ELSE
+ CALL INTLOG(JP_DEBUG,'NEWISL: New field is reduced',JPQUIET)
+ NEWOFF(1) = 0
+ TOTAL = NEWGEO(NPOINTS)
+ DO LOOP = 2, NEWGEO(NJ)
+ NEWOFF(LOOP) = NEWOFF(LOOP-1) + NEWGEO(NPOINTS-2+LOOP)
+ TOTAL = TOTAL + NEWGEO(NPOINTS-1+LOOP)
+ ENDDO
+ ENDIF
+C
+C Get the gaussian latitudes for the new field
+C
+ IRET = IGGLAT(NEWGEO(NGAUSS)*2,RLATNEW,0,-1)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'NEWISL: Problem call igglat for new grid'
+ NEWISL = 1
+ RETURN
+ ENDIF
+C
+ ELSE
+C
+C New field is lat/long
+C
+ CALL INTLOG(JP_DEBUG,'NEWISL: New field is lat/long',JPQUIET)
+ TOTAL = NEWGEO(2)*NEWGEO(3)
+ DO LOOP = 1, NEWGEO(3)
+ NEWOFF(LOOP) = NEWGEO(2)*(LOOP-1)
+ RLATNEW(LOOP) = 90.0 - (REAL((LOOP-1)*NEWGEO(10))/JP1000)
+ ENDDO
+C
+ ENDIF
+C
+ CALL INTLOG(JP_DEBUG,'NEWISL: No. of pts in new field = ',TOTAL)
+C
+C -----------------------------------------------------------------|
+C* Section 3. Get the gaussian latitudes for the old field and
+C setup the offsets to the start of each latitude.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ OLDOFF(1) = 0
+ DO LOOP = 2, OLDGEO(NJ)
+ OLDOFF(LOOP) = OLDOFF(LOOP-1) + OLDGEO(NPOINTS-2+LOOP)
+ ENDDO
+C
+ IRET = IGGLAT(OLDGEO(NGAUSS)*2,RLATOLD,0,-1)
+ IF( IRET.NE.0 ) THEN
+ WRITE(*,*) 'NEWISL: Problem call igglat for old grid'
+ NEWISL = 1
+ RETURN
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 4. Work through the points in the new field.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ DO NEXT = 1, TOTAL
+C
+C Calculate lat/long
+C
+ DO LOOP = 1, NEWGEO(NJ)
+ IF( NEWOFF(LOOP).GE.NEXT ) THEN
+ LATIT = LOOP - 1
+ GOTO 410
+ ENDIF
+ ENDDO
+ LATIT = NEWGEO(NJ)
+C
+ 410 CONTINUE
+C
+ LONG = NEXT - NEWOFF(LATIT)
+C
+ RLAT = RLATNEW(LATIT)
+ IF( NEWGEO(1).EQ.JPGAUSS ) THEN
+ IF( NEWGEO(17).EQ.0 ) THEN
+ RLON = REAL((LONG-1)*NEWGEO(9))/JP1000
+ ELSE
+ RLON = (REAL(LONG-1)*360.0)/REAL(NEWGEO(NPOINTS+LATIT-1))
+ ENDIF
+ ELSE
+ RLON = REAL((LONG-1)*NEWGEO(9))/JP1000
+ ENDIF
+C
+C Find type of point (land or sea)
+C
+ IF( MASTER(NEXT).GT.MASTERTHRESHOLD ) THEN
+ NEWTYPE = LAND
+ ELSE
+ NEWTYPE = SEA
+ ENDIF
+C
+C Find four neighbours in the old field with their types
+C (Find NW neighbour and deduce the others).
+C
+ LAT(NORTH) = JNORSGG(RLAT,RLATOLD,OLDGEO(NGAUSS),1)
+ LAT(SOUTH) = JNORSGG(RLAT,RLATOLD,OLDGEO(NGAUSS),0)
+C
+ OLAT(NORTH) = RLATOLD(LAT(NORTH))
+ OLAT(SOUTH) = RLATOLD(LAT(SOUTH))
+C
+ NPTS = OLDGEO(NPOINTS-1+LAT(NORTH))
+ LON(NWEST) = 1 + INT(RLON/(360.0/REAL(NPTS)))
+ LON(NEAST) = LON(NWEST) + 1
+ IF( LON(NEAST).GT.NPTS ) LON(NEAST) = 1
+C
+ OLON(NWEST) = (REAL(LON(NWEST)-1)*360.0)/REAL(NPTS)
+ IF( LON(NEAST).EQ.1 ) THEN
+ OLON(NEAST) = 360.0
+ ELSE
+ OLON(NEAST) = (REAL(LON(NEAST)-1)*360.0)/REAL(NPTS)
+ ENDIF
+C
+ NPTS = OLDGEO(NPOINTS-1+LAT(SOUTH))
+ LON(SWEST) = 1 + INT(RLON/(360.0/REAL(NPTS)))
+ LON(SEAST) = LON(SWEST) + 1
+ IF( LON(SEAST).GT.NPTS ) LON(SEAST) = 1
+C
+ OLON(SWEST) = (REAL(LON(SWEST)-1)*360.0)/REAL(NPTS)
+ IF( LON(SEAST).EQ.1 ) THEN
+ OLON(SEAST) = 360.0
+ ELSE
+ OLON(SEAST) = (REAL(LON(SEAST)-1)*360.0)/REAL(NPTS)
+ ENDIF
+C
+ PT(NWEST) = OLDOFF(LAT(NORTH)) + LON(NWEST)
+ IF( OLDLSM(PT(NWEST)).GT.OLDLSMTHRESHOLD ) THEN
+ TYPE(NWEST) = LAND
+ ELSE
+ TYPE(NWEST) = SEA
+ ENDIF
+C
+ PT(NEAST) = OLDOFF(LAT(NORTH)) + LON(NEAST)
+ IF( OLDLSM(PT(NEAST)).GT.OLDLSMTHRESHOLD ) THEN
+ TYPE(NEAST) = LAND
+ ELSE
+ TYPE(NEAST) = SEA
+ ENDIF
+C
+ PT(SWEST) = OLDOFF(LAT(SOUTH)) + LON(SWEST)
+ IF( OLDLSM(PT(SWEST)).GT.OLDLSMTHRESHOLD ) THEN
+ TYPE(SWEST) = LAND
+ ELSE
+ TYPE(SWEST) = SEA
+ ENDIF
+C
+ PT(SEAST) = OLDOFF(LAT(SOUTH)) + LON(SEAST)
+ IF( OLDLSM(PT(SEAST)).GT.OLDLSMTHRESHOLD ) THEN
+ TYPE(SEAST) = LAND
+ ELSE
+ TYPE(SEAST) = SEA
+ ENDIF
+C
+C Interpolate the new value
+C
+ NEWFLD(NEXT) =
+ X ISLPROC(RLAT,RLON,NEWTYPE,OLAT,OLON,TYPE,PT,OLDFLD)
+C
+ ENDDO
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+C
+ RETURN
+ END
+
diff --git a/interpolation/ngintrp.F b/interpolation/ngintrp.F
new file mode 100755
index 0000000..d5b77c0
--- /dev/null
+++ b/interpolation/ngintrp.F
@@ -0,0 +1,295 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE NGINTRP(NEWFLD,NEXT,INROW,OLAT,OLON,NGAUSS,TYPE,FIELD,
+ X GLATS, NGPTS)
+C
+C---->
+C**** NGINTRP
+C
+C PURPOSE
+C _______
+C
+C Finds values at the points of a row by interpolation within a
+C gaussian field.
+C
+C INTERFACE
+C _________
+C
+C CALL NGINTRP(NEWFLD,NEXT,INROW,OLAT,OLON,NGAUSS,TYPE,FIELD)
+C
+C
+C Input parameters
+C ________________
+C
+C NEWFLD - The field of values being created
+C NEXT - Start offset of the latitude row being created
+C INROW - The number of points in the latitude row
+C OLAT - Latitude of target point
+C OLON - Longitude of target point
+C NGAUSS - Gaussian field number
+C TYPE - Original unrotated gaussian field type
+C = 'F' for full (regular) gaussian field
+C = 'R' for reduced (quasi) gaussian field
+C FIELD - Original gaussian field
+C GLATS - Gaussian latitudes for original field
+C NGPTS - Number of points along original field latitudes
+C
+C
+C Output parameters
+C ________________
+C
+C NEWFLD(NEXT) to NEWFLD(NEXT+INROW-1) contains the latitude row
+C values.
+C
+C
+C METHOD
+C ______
+C
+C Uses distance weighted values of 4 neighbouring points unless
+C within small distance of one of the neighbours, in which case
+C the value at that point is used.
+C
+C
+C EXTERNALS
+C _________
+C
+C JMKOFGG - Builds offsets to start of each latitude row in the
+C gaussian grid.
+C JNORSGG - Find nearest north/south latitude in the gaussian grid.
+C INTLOG - Logs output messages
+C
+C
+C REFERENCE
+C _________
+C
+C None.
+C
+C
+C COMMENTS
+C ________
+C
+C Some loops have been split and simplified to help with
+C vectorisation on VPP.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF April 1996
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPFACTR, JPMAXGG
+ PARAMETER( JPFACTR = 10000 )
+ PARAMETER( JPMAXGG = 1280 )
+ REAL JPEPS
+ PARAMETER( JPEPS = 1E-2)
+C
+C Function arguments
+C
+ REAL NEWFLD(*),OLAT(*),OLON(*),FIELD(*),GLATS(*)
+ INTEGER NEXT,INROW,NGAUSS,NGPTS(*)
+ CHARACTER*1 TYPE
+C
+C Local variables
+C
+ INTEGER LOOP, IVALUE
+ INTEGER NORTH, SOUTH, IWESTN, IWESTS, IEASTN, IEASTS
+ REAL NSTEP, SSTEP
+ DIMENSION NORTH(JPMAXGG), SOUTH(JPMAXGG)
+ DIMENSION IWESTN(JPMAXGG), IWESTS(JPMAXGG)
+ DIMENSION IEASTN(JPMAXGG), IEASTS(JPMAXGG)
+ DIMENSION NSTEP(JPMAXGG), SSTEP(JPMAXGG)
+ REAL DNORTH, DSOUTH, DWESTN, DWESTS, DEASTN, DEASTS
+ DIMENSION DNORTH(JPMAXGG), DSOUTH(JPMAXGG)
+ DIMENSION DWESTN(JPMAXGG), DWESTS(JPMAXGG)
+ DIMENSION DEASTN(JPMAXGG), DEASTS(JPMAXGG)
+ INTEGER KOFSET(JPMAXGG/2)
+ INTEGER KRET, OLDGAUS
+ DATA OLDGAUS/0/
+ CHARACTER*1 OLDTYPE
+ DATA OLDTYPE/' '/
+ SAVE OLDGAUS, OLDTYPE, KOFSET
+#ifdef __uxp__
+ REAL ONW, ONE, OSW, OSE
+ DIMENSION ONW(JPMAXGG), ONE(JPMAXGG), OSW(JPMAXGG), OSE(JPMAXGG)
+#endif
+C
+C Externals
+C
+ INTEGER JNORSGG
+ EXTERNAL JNORSGG
+#ifndef __uxp__
+C
+C Statement function
+C
+ INTEGER X, Y
+ REAL OFIELD
+ OFIELD(X,Y) = FIELD(KOFSET(X)+Y)
+#endif
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+C Fixup gaussian grid definition (first time only)
+C
+ IF ( (OLDGAUS.NE.NGAUSS).OR.(OLDTYPE.NE.TYPE) ) THEN
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'NGINTRP: Fixup gaussian grid definition:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,TYPE,JPQUIET)
+ CALL INTLOG(JP_DEBUG, 'NGINTRP: grid number:',NGAUSS)
+C
+C Build array of offsets in field to start of each latitude line
+C
+ CALL INTLOG(JP_DEBUG,'NGINTRP: Build row offsets',JPQUIET)
+ IF( TYPE.EQ.'R') THEN
+ CALL JMKOFGG(TYPE,1,NGAUSS*2,0.0,360.0,NGAUSS,NGPTS,KOFSET)
+ ELSE
+ CALL JMKOFGG(TYPE,1,NGAUSS*2,0.0,(360.0-(90.0/NGAUSS)),
+ X NGAUSS,NGPTS,KOFSET)
+ ENDIF
+ OLDGAUS = NGAUSS
+ OLDTYPE = TYPE
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Find latitudes of grid lines to north and south of
+C the points and calculate grid interval along lines.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ DO LOOP = 1, INROW
+ NORTH(LOOP) = JNORSGG( OLAT(LOOP), GLATS, NGAUSS, 1)
+ ENDDO
+C
+ DO LOOP = 1, INROW
+ SOUTH(LOOP) = MIN( NORTH(LOOP)+1, NGAUSS*2)
+ DNORTH(LOOP) = ABS(GLATS(NORTH(LOOP)) - OLAT(LOOP))
+ ENDDO
+C
+ DO LOOP = 1, INROW
+ DSOUTH(LOOP) = 1.0 - DNORTH(LOOP)
+ NSTEP(LOOP) = 360.0/FLOAT(NGPTS(NORTH(LOOP)))
+ SSTEP(LOOP) = 360.0/FLOAT(NGPTS(SOUTH(LOOP)))
+ ENDDO
+C
+C _______________________________________________________
+C
+C* Section 3. Find neighbouring points.
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+ DO LOOP = 1, INROW
+C
+C Calculate normalised distance west and east to neighbouring
+C points on lines to north and south of the point
+C
+ IWESTN(LOOP) = INT(OLON(LOOP)/NSTEP(LOOP))
+ IWESTS(LOOP) = INT(OLON(LOOP)/SSTEP(LOOP))
+ IEASTN(LOOP) = IWESTN(LOOP) + 1
+ IEASTS(LOOP) = IWESTS(LOOP) + 1
+C
+ DWESTN(LOOP) =
+ X ABS((OLON(LOOP) - FLOAT(IWESTN(LOOP))*NSTEP(LOOP))/NSTEP(LOOP))
+ DEASTN(LOOP) = 1.0 - DWESTN(LOOP)
+C
+ DWESTS(LOOP) =
+ X ABS((OLON(LOOP) - FLOAT(IWESTS(LOOP))*SSTEP(LOOP))/SSTEP(LOOP))
+ DEASTS(LOOP) = 1.0 - DWESTS(LOOP)
+C
+C Adjust west and east for longitude wrap-around
+C
+ IVALUE=NGPTS(NORTH(LOOP))
+ IF( IEASTN(LOOP).GE.IVALUE) THEN
+ IEASTN(LOOP) = IEASTN(LOOP) - IVALUE
+ IF( IWESTN(LOOP).GE.IVALUE) IWESTN(LOOP) = IWESTN(LOOP)-IVALUE
+ ENDIF
+C
+ IVALUE=NGPTS(SOUTH(LOOP))
+ IF( IEASTS(LOOP).GE.IVALUE) THEN
+ IEASTS(LOOP) = IEASTS(LOOP) - IVALUE
+ IF( IWESTS(LOOP).GE.IVALUE) IWESTS(LOOP) = IWESTS(LOOP)-IVALUE
+ ENDIF
+C
+ ENDDO
+C
+C _______________________________________________________
+C
+C* Section 4. Interpolate using neighbouring points.
+C _______________________________________________________
+C
+ 400 CONTINUE
+C
+C Use bi-linear interpolation from four neighbouring points.
+C
+#ifdef __uxp__
+ DO LOOP = 1, INROW
+ ONW(LOOP) =
+ X FIELD(KOFSET(NORTH(LOOP))+IWESTN(LOOP)) * DEASTN(LOOP)
+ ONE(LOOP) =
+ X FIELD(KOFSET(NORTH(LOOP))+IEASTN(LOOP)) * DWESTN(LOOP)
+ OSW(LOOP) =
+ X FIELD(KOFSET(SOUTH(LOOP))+IWESTS(LOOP)) * DEASTS(LOOP)
+ OSE(LOOP) =
+ X FIELD(KOFSET(SOUTH(LOOP))+IEASTS(LOOP)) * DWESTS(LOOP)
+C
+ ENDDO
+C
+ DO LOOP = 1, INROW
+ NEWFLD(NEXT+LOOP-1) =
+ X (ONW(LOOP) + ONE(LOOP)) * DSOUTH(LOOP) +
+ X (OSW(LOOP) + OSE(LOOP)) * DNORTH(LOOP)
+ ENDDO
+#else
+ DO LOOP = 1, INROW
+ NEWFLD(NEXT+LOOP-1) =
+ X ( ( OFIELD(NORTH(LOOP),IWESTN(LOOP)) * DEASTN(LOOP) +
+ X OFIELD(NORTH(LOOP),IEASTN(LOOP)) * DWESTN(LOOP) )
+ X * DSOUTH(LOOP) +
+ X ( OFIELD(SOUTH(LOOP),IWESTS(LOOP)) * DEASTS(LOOP) +
+ X OFIELD(SOUTH(LOOP),IEASTS(LOOP)) * DWESTS(LOOP) )
+ X * DNORTH(LOOP) )
+ ENDDO
+#endif
+C
+C _______________________________________________________
+C
+C* Section 9. Closedown.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/ngrotat.F b/interpolation/ngrotat.F
new file mode 100755
index 0000000..8333594
--- /dev/null
+++ b/interpolation/ngrotat.F
@@ -0,0 +1,242 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION NGROTAT(OLDFLD, NEWFLD, NUMPTS, POLELAT, POLELON,
+ X TYPE, NGAUSS)
+C
+C---->
+C**** NGROTAT
+C
+C PURPOSE
+C _______
+C
+C Generates a rotated gaussian grid.
+C
+C INTERFACE
+C _________
+C
+C IRET = NGROTAT(OLDFLD,NEWFLD,NUMPTS,POLELAT,POLELON,TYPE,NGAUSS)
+C
+C
+C Input parameters
+C ________________
+C
+C OLDFLD = Original gaussian grid field.
+C NUMPTS = Total number of points in the original field.
+C POLELAT = Latitude of the South Pole of rotation.
+C POLELON = Longitude of the South Pole of rotation.
+C TYPE = 'R' if the gaussian field is reduced (quasi) gaussian.
+C = 'F' if the gaussian field is regular (full) gaussian.
+C NGAUSS = Gaussian grid number (number of latitude rows between
+C the pole and the equator).
+C
+C Output parameters
+C ________________
+C
+C NEWFLD = New gaussian grid field.
+C (This can be the same array as OLDFLD).
+C
+C Function returns zero if interpolation ran OK.
+C
+C
+C METHOD
+C ______
+C
+C The nearest gaussian latitude row is found.
+C
+C Work space is dynamically allocated. It is retained for future
+C calls.
+C
+C EXTERNALS
+C _________
+C
+C IGGLAT - Compute Gaussian latitudes for a given truncation.
+C NGVALUE - Calculates the interpolated value at a point of the new
+C gaussian grid.
+C INTLOG - Logs output messages
+C INTLOGR - Logs output messages
+C JMEMHAN - Dynamically allocate work array
+C
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C
+C COMMENTS
+C ________
+C
+C The input field is assumed to be global in extent, and a known
+C definition, either N160 or N80 (reduced or regular).
+C The output field has the same type and dimensions as the input
+C field.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF April 1996
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "intf.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPMAXGG
+ PARAMETER( JPROUTINE = 38500 )
+ PARAMETER (JPMAXGG = 1280)
+C
+C Subroutine arguments
+C
+ REAL OLDFLD, NEWFLD, POLELAT, POLELON
+ INTEGER NUMPTS, NGAUSS
+ DIMENSION OLDFLD(NUMPTS), NEWFLD(NUMPTS)
+ CHARACTER*1 TYPE
+C
+C Local variables
+C
+ REAL GLATS(JPMAXGG)
+ INTEGER NGPTS(JPMAXGG)
+ INTEGER OLDGAUS
+ DATA OLDGAUS/0/
+ CHARACTER*1 OLDTYPE
+ DATA OLDTYPE/' '/
+ SAVE GLATS, NGPTS, OLDGAUS, OLDTYPE
+C
+ INTEGER NEXT, NEXLAT, INROW, LOOP, KRET
+ REAL STEPLON, CUTOFF, RLAT, RLON
+ DIMENSION RLON(JPMAXGG*2)
+C
+ INTEGER ISIZE
+ DATA ISIZE/0/
+ REAL DUMI
+ POINTER (IDUMI, DUMI)
+ DIMENSION DUMI(1)
+ SAVE IDUMI, ISIZE
+C
+C Externals
+C
+ INTEGER IGGLAT
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ NGROTAT = 0
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'NGROTAT: Number of pts in original field = ',NUMPTS)
+ CALL INTLOGR(JP_DEBUG,
+ X 'NGROTAT: Latitude of the South Pole of rotation = ',POLELAT)
+ CALL INTLOGR(JP_DEBUG,
+ X 'NGROTAT: Longitude of the South Pole of rotation = ',POLELON)
+ CALL INTLOG(JP_DEBUG,'NGROTAT: Get gaussian grid type:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,TYPE,JPQUIET)
+ CALL INTLOG(JP_DEBUG,'NGROTAT: grid number:',NGAUSS)
+C
+C Get gaussian grid definition (first time only)
+C
+ IF( (OLDGAUS.NE.NGAUSS).OR.(OLDTYPE.NE.TYPE)) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'NGROTAT: Get definitions for gaussian grid type:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,TYPE,JPQUIET)
+ CALL INTLOG(JP_DEBUG,'NGROTAT: grid number:',NGAUSS)
+C
+ KRET = IGGLAT(NGAUSS*2, GLATS, 0, 1)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR, 'NGROTAT: IGGLAT call failed',KRET)
+ NGROTAT = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ DO LOOP = 1, NGAUSS
+ NGPTS(LOOP) = ISEC2(22+LOOP)
+ NGPTS(2*NGAUSS+1-LOOP) = NGPTS(LOOP)
+ ENDDO
+ OLDGAUS = NGAUSS
+ OLDTYPE = TYPE
+ ENDIF
+C
+C Allocate work space if not already done.
+C
+ IF( ISIZE.LT.NUMPTS ) THEN
+ ISIZE = NUMPTS
+ CALL JMEMHAN(18,IDUMI,ISIZE,1,KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'NGROTAT: Memory allocation failed: status = ',KRET)
+ NGROTAT = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C Move the original field to the work array
+C
+ DO LOOP = 1, NUMPTS
+ DUMI(LOOP) = OLDFLD(LOOP)
+ ENDDO
+C _______________________________________________________
+C
+C* Section 2. Work through latitude lines from north to south
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ NEXT = 1
+C
+ DO NEXLAT = 1, NGAUSS*2
+ INROW = NGPTS(NEXLAT)
+ STEPLON = 360.0/INROW
+ RLAT = GLATS(NEXLAT)
+C
+C Fill in longitudes along current line of latitude
+C
+ DO LOOP = 1, INROW
+ RLON(LOOP) = (LOOP-1)*STEPLON
+ ENDDO
+C
+C Rotate the current line of latitude
+C
+ CALL NGVALUE(NEWFLD,NEXT,INROW,RLAT,RLON,
+ X POLELAT,POLELON,NGAUSS,TYPE,DUMI,GLATS,NGPTS)
+C
+ NEXT = NEXT + INROW
+C
+ ENDDO
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ CALL INTLOG(JP_DEBUG,'NGROTAT: Return from NGROTAT:',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/ngvalue.F b/interpolation/ngvalue.F
new file mode 100755
index 0000000..76a31e4
--- /dev/null
+++ b/interpolation/ngvalue.F
@@ -0,0 +1,157 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE NGVALUE(NEWFLD, NEXT, INROW, RLAT, RLON,
+ X POLELAT, POLELON, NGAUSS, TYPE, FIELD,
+ X GLATS, NGPTS)
+C
+C---->
+C**** NGVALUE
+C
+C PURPOSE
+C _______
+C
+C Rotates one line of latitude in a gaussian grid.
+C
+C INTERFACE
+C _________
+C
+C CALL NGVALUE(NEWFLD, NEXT, INROW, RLAT, RLON,
+C X POLELAT,POLELON,NGAUSS,TYPE,FIELD,GLATS,NGPTS)
+C
+C
+C Input parameters
+C ________________
+C
+C NEWFLD - The field of values being created
+C NEXT - Start offset of the latitude row being created
+C INROW - The number of points in the latitude row
+C RLAT - Target point latitude in the rotated grid
+C RLON - Target point longitude in the rotated grid
+C POLELAT - Latitude of the rotated South Pole
+C POLELON - Longitude of the rotated South Pole
+C NGAUSS - Original unrotated gaussian field number
+C TYPE - Original unrotated gaussian field type
+C = 'F' for full (regular) gaussian field
+C = 'R' for reduced (quasi) gaussian field
+C FIELD - Original unrotated gaussian field values
+C GLATS - Gaussian latitudes for original field
+C NGPTS - Number of points along original field latitudes
+C
+C Output parameters
+C ________________
+C
+C NEWFLD(NEXT) to NEWFLD(NEXT+INROW-1) contains the latitude row
+C values.
+C
+C
+C METHOD
+C ______
+C
+C Rotates the lat/long positions of points along a latitude row in
+C a rotated gaussian grid back to positions in the unrotated grid
+C and then interpolates values from the original grid.
+C
+C
+C EXTERNALS
+C _________
+C
+C LL2XYZ - Converts a latitude/longitude position to (x,y,z)
+C wrt axes through the centre of the globe. The z-axis
+C runs from the south to north pole. The x- and y-axes
+C are in the plane of the equator with the x-axis
+C pointing out through lat/long (0,0).
+C YROTATE - Rotates the globe about the new y-axis.
+C XYZ2LL - Converts an (x,y,z) position to a latitude/longitude.
+C NGINTRP - Interpolates a value from an existing grid.
+C
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C
+C COMMENTS
+C ________
+C
+C The input field is assumed to be global in extent, and a known
+C definition, either N160 or N80 (reduced or regular).
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF April 1996
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+C Parameters
+C
+ INTEGER JPMAXGG
+ PARAMETER( JPMAXGG = 1280 )
+C
+C Function arguments
+C
+ REAL RLAT, POLELAT, POLELON
+ REAL NEWFLD(*), RLON(*), FIELD(*), GLATS(*)
+ INTEGER NEXT, INROW, NGAUSS, NGPTS(*)
+ CHARACTER*1 TYPE
+C
+C Local variables
+C
+ REAL X(JPMAXGG), Y(JPMAXGG), Z(JPMAXGG)
+ REAL RX(JPMAXGG),RY(JPMAXGG),RZ(JPMAXGG)
+ REAL OLAT(JPMAXGG),OLON(JPMAXGG)
+ INTEGER LOOP
+C
+C Convert the rotated row points lat/longs to (x,y,z) coordinates
+C
+ CALL LL2XYZ(RLAT,RLON,X,Y,Z,INROW)
+C
+C Rotate the rotated row points back through the original latitude
+C rotation
+C
+ CALL YROTATE(-(90.0+POLELAT),X,Y,Z,RX,RY,RZ,INROW)
+C
+C Convert the rotated row points adjusted (x,y,z) coordinates to
+C lat/long in the original grid (after longitude rotation)
+C
+ CALL XYZ2LL(RX,RY,RZ,OLAT,OLON,INROW)
+C
+C Adjust the rotated line longitudes to remove the longitude
+C rotation
+C
+ DO LOOP = 1, INROW
+ OLON(LOOP) = OLON(LOOP) + POLELON
+ IF( OLON(LOOP).LT.0.0 ) OLON(LOOP) = OLON(LOOP) + 360.0
+ IF( OLON(LOOP).GE.360.0 ) OLON(LOOP) = OLON(LOOP) - 360.0
+ ENDDO
+C
+C Interpolate the original unrotated grid to the points in the
+C rotated line
+C
+ CALL NGINTRP(NEWFLD,NEXT,INROW,OLAT,OLON,NGAUSS,TYPE,FIELD,
+ X GLATS,NGPTS)
+C
+ RETURN
+ END
diff --git a/interpolation/nifld.common b/interpolation/nifld.common
new file mode 100755
index 0000000..5c7213f
--- /dev/null
+++ b/interpolation/nifld.common
@@ -0,0 +1,256 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C
+C**** "nifld.common"
+C
+C Purpose
+C _______
+C
+C This file contains all the input field definition variables.
+C
+C
+C Interface
+C _________
+C
+C
+C Common block usage
+C __________________
+C
+C JDCFLAGS
+C --------
+C
+C LCHANGE - This flag indicates whether a change of
+C interpolating process has occurred.
+C LSMCHNG - This flag indicates whether a change of LSM flag
+C has occurred.
+C LSM - This flag indicates whether a land sea mask
+C should be used for interpolation.
+C LSMSET - This flag indicates whether the user has defined
+C the LSM flag.
+C LSMPAR - This flag indicates whether the LSM variable is
+C being interpolated.
+C LSMPARSET - This flag indicates whether the user has defined
+C the LSMPAR flag.
+C LPREC - This flag indicates whether a precipitation
+C variable is being interpolated.
+C LPRECSET - This flag indicates whether the user has defined
+C the LPREC flag.
+C LWIND - This flag indicates whether a wind variable is
+C being interpolated.
+C LWINDSET - This flag indicates whether the user has defined
+C the LWIND flag.
+C LNIGAUS - Flag to say whether or not user specified NIGAUS
+C LNGSPEC - Flag to say whether or not user specified NGSPEC
+C LIGIVEL - Flag to say whether or not user specified latitudes
+C for the input gaussian grid
+C LIGIVEP - Flag to say whether or not user specified number of
+C points along latitudes for the input gaussian grid
+C LIMISSV - Flag to say whether or not user specified input
+C field missing data value
+C LIMISSA - Flag to say whether or not user specified input
+C field missing data value grib_api merging
+C LNIISCL - Flag to say whether or not user specified islscp
+C processing.
+C LNOAREA - Flag to say whether or not user specified NOAREA
+C LNOGAUS - Flag to say whether or not user specified NOGAUSS
+C LNOREDL - Flag to say whether or not user specified NOREDLL
+C LOGIVEL - Flag to say whether or not user specified latitudes
+C for the output gaussian grid
+C LOGIVEP - Flag to say whether or not user specified number of
+C points along latitudes for the output gaussian grid
+C LNORESO - Flag to say whether or not user specified NORESO
+C LNOACC - Flag to say whether or not user specified NOACC
+C LNOREPR - Flag to say whether or not user specified NOREPR
+C LNOTABL - Flag to say whether or not user specified NOTABLE
+C LNOPARA - Flag to say whether or not user specified NOPARAM
+C LNOLEVL - Flag to say whether or not user specified NOLEVEL
+C LNOLEVT - Flag to say whether or not user specified NOLEVT
+C LNOGRID - Flag to say whether or not user specified NOGRID
+C LARESOL - Flag to say whether or not user specified 'Autoresol'
+C LNOBITMP - Flag to say whether or not user specified NOBITMP
+C LNOFRAME - Flag to say whether or not user specified NOFRAME
+C LNOSTYLE - Flag to say whether or not user specified NOSTYLE
+C LSTAGGL - Flag to say if is the input field staggered grid
+C LOCEAN - Flag to say if is the ocean input field
+C
+C JDNIFLD
+C -------
+C
+C NILOCAL - Input field ECMWF local definition number
+C NISTREM - Input field ECMWF stream number
+C NIFORM - Input field data format (0-Unpacked, 1-Grib).
+C NIREPR - Input field representation. Supported
+C representations are
+C Spherical harmonic
+C Regular Gaussian grid
+C Reduced Gaussian grid
+C Latitude/longitude grid
+C NIGAUSS - Input field Gaussian truncation.
+C NGSPEC - Reduced gaussian grid specification
+C NIRESO - Input field spherical harmonic resolution.
+C NIGRID - Input field grid definition (WE/NS).
+C NIAREA - Input field area definition (N/W/S/E).
+C NINS - Number of grid points in NS direction for input
+C field.
+C NIWE - Number of grid points in WE direction for input
+C field.
+C NIPARAM - Input field parameter number
+C NISCNM - Input field scanning mode.
+C NITABLE - Input field table number.
+C NILEVEL - Input field level.
+C NILEVT - Input field level type.
+C NIACC - Number of packing bits to be used for input
+C GRIB field.
+C NISLSCP - Index returned from PBOPEN for islscp land-sea mask
+C GRIB product file
+C NIPOGRB - Pointer to memory allocated to hold islscp old land-sea
+C mask GRIB product
+C NIPOGRS - Size in bytes of memory allocated to hold islscp old
+C land-sea mask GRIB product
+C NIPNGRB - Pointer to memory allocated to hold islscp new land-sea
+C mask GRIB product
+C NIMATR - Number of matrix values
+C NIPNGRS - Size in bytes of memory allocated to hold islscp new
+C land-sea mask GRIB product
+C
+C PILATS - Array of reduced gaussian grid latitudes(N to S pole)
+C (RIGAUSS in grspace.h used instead now)
+C NILPTS - Array of reduced gaussian grid no.of pts. per latitude
+C (MILLEN in grspace.h used instead now)
+C NIPCNT - Total number of pts in input reduced gaussian field
+C NJDCDOT - 'magic number', set when basic initialisation has been
+C done
+C NIDATE - Input field date
+C NICOMP - Spectral truncation above which interpolation coefficients
+C are calculated 'on the fly'
+C RISTRET - Stretching factor used in the input field
+C RMISSGV - Input field missing data value
+C
+C JNPRECP
+C -------
+C RPRECIP - Precipitation threshold value
+C
+C
+C NILOCAL - Input field ECMWF local definition number
+C
+C
+C Reference
+C _________
+C
+C None.
+C
+C
+C Comments
+C ________
+C
+C None.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF Aug 1994
+C
+C
+C Modifications
+C _____________
+C
+C None.
+C
+C
+C _______________________________________________________
+C
+C* Section 1. Flag variables
+C _______________________________________________________
+C
+ LOGICAL
+ 1 LCHANGE , LSMCHNG , LSM , LWIND , LPREC , LSMPAR ,
+ 2 LSMSET , LWINDSET, LPRECSET,LSMPARSET, LNOREDL , LNIGAUS ,
+ 3 LIGIVEL , LIGIVEP , LNOGAUS , LOGIVEL , LOGIVEP , LNORESO ,
+ 4 LNOACC , LNOREPR , LNOTABL , LNOPARA , LNOLEVL , LNOLEVT ,
+ 5 LNOGRID , LARESOL , LNOBITMP, LNOFRAME, LNOSTYLE, LNOAREA ,
+ 6 LFILEIO , LMEMORY , LSHARED , LON_FLY , LMAPPED, LNGSPEC ,
+ 7 LIFIRST , LIMISSV , LNIISCL , LSTAGGL , LOCEAN, LIMISSA ,
+ 8 LACCUR
+C
+ COMMON /JDCFLAGS/
+ 1 LCHANGE , LSMCHNG , LSM , LWIND , LPREC , LSMPAR ,
+ 2 LSMSET , LWINDSET, LPRECSET,LSMPARSET, LNOREDL , LNIGAUS ,
+ 3 LIGIVEL , LIGIVEP , LNOGAUS , LOGIVEL , LOGIVEP , LNORESO ,
+ 4 LNOACC , LNOREPR , LNOTABL , LNOPARA , LNOLEVL , LNOLEVT ,
+ 5 LNOGRID , LARESOL , LNOBITMP, LNOFRAME, LNOSTYLE, LNOAREA ,
+ 6 LFILEIO , LMEMORY , LSHARED , LON_FLY , LMAPPED, LNGSPEC ,
+ 7 LIFIRST , LIMISSV , LNIISCL , LSTAGGL , LOCEAN, LIMISSA ,
+ 8 LACCUR
+C
+ SAVE /JDCFLAGS/
+C
+C _______________________________________________________
+C
+C* Section 2. Field definition variables
+C _______________________________________________________
+C
+ INTEGER
+ X NILOCAL, NISTREM, NGSPEC ,
+ X NIFORM , NIREPR , NIGRID , NIAREA , NIGAUSS, NIRESO ,
+ X NIWE , NINS , NISCNM , NIPARAM, NITABLE, NIACC ,
+ X NJDCDOT, NIPCNT , NILEVEL, NILEVT , NIDATE , NICOMP ,
+ X NISLSCP, NIPOGRS, NIPNGRS, NIMATR
+ REAL RISTRET, RMISSGV
+ DIMENSION NIGRID(2)
+ DIMENSION NIAREA(4)
+C
+ COMMON /JDNIFLD/
+ X RISTRET, RMISSGV,
+ X NILOCAL, NISTREM, NGSPEC ,
+ X NIFORM , NIREPR , NIGAUSS, NIRESO ,
+ X NIWE , NINS , NISCNM , NIPARAM, NITABLE, NIACC ,
+ X NJDCDOT, NIPCNT , NILEVEL, NILEVT , NIDATE , NICOMP ,
+ X NISLSCP, NIPOGRS, NIPNGRS, NIGRID , NIAREA , NIMATR
+C
+ SAVE /JDNIFLD/
+C
+#ifdef POINTER_64
+ INTEGER*8 NIPOGRB, NIPNGRB
+#else
+ INTEGER NIPOGRB, NIPNGRB
+#endif
+ COMMON /JDNIPTR/
+ X NIPOGRB, NIPNGRB
+C
+ SAVE /JDNIPTR/
+C
+ REAL ZPRECIP
+ COMMON /JNPRECP/ ZPRECIP
+ SAVE /JNPRECP/
+
+C _______________________________________________________
+C
+C* Section 3. Ocean
+C _______________________________________________________
+C
+ INTEGER
+ X NIOCO3, NIOCO4,
+ X NIOCO4F, NIOCO3F, NIOCO4L, NIOCO3L,
+ X NIOIINC, NIOJINC,
+ X NIOIRGR, NIONOST,NICOORN,
+ X NIVCDEF
+ INTEGER OCCOOR
+ DIMENSION OCCOOR(1000)
+C
+ COMMON /JOCEANI/
+ X NIOCO3, NIOCO4,
+ X NIOCO4F, NIOCO3F, NIOCO4L, NIOCO3L,
+ X NIOIINC, NIOJINC,
+ X NIOIRGR, NIONOST, NICOORN,
+ X NIVCDEF,
+ X OCCOOR
+C
+ SAVE /JOCEANI/
diff --git a/interpolation/nmakgg.F b/interpolation/nmakgg.F
new file mode 100755
index 0000000..96d3cfb
--- /dev/null
+++ b/interpolation/nmakgg.F
@@ -0,0 +1,143 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE NMAKGG( KTRUNC, KNEXT, PLAT, KNUM, PLEG, KRET)
+C
+C---->
+C**** NMAKGG
+C
+C PURPOSE
+C _______
+C
+C This routine creates legendre functions for latitude rows from
+C the given latitude.
+C
+C INTERFACE
+C _________
+C
+C CALL NMAKGG( KTRUNC, KNEXT, PLAT, KNUM, PLEG, KRET)
+C
+C Input parameters
+C ________________
+C
+C KTRUNC - Truncation.
+C KNEXT - Index (in PLAT) of next latitude at which to start
+C PLAT - Array of gaussian latitudes
+C KNUM - Number of latitudes to produce
+C
+C Output parameters
+C ________________
+C
+C PLEG - Array of legendre functions for the latitude.
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG
+C
+C Method
+C ______
+C
+C See below.
+C
+C Externals
+C _________
+C
+C INTLOG - Output log message
+C INTLOGR - Output log message (with real value)
+C
+C Reference
+C _________
+C
+C None.
+C
+C Comments
+C ________
+C
+C None at present.
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* June 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "jparams.h"
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 30500 )
+C
+C Subroutine arguments
+C
+ INTEGER KTRUNC, KNEXT, KRET, KNUM
+ REAL PLEG, PLAT
+ DIMENSION PLEG(*), PLAT(*)
+C
+C Local variables
+C
+ INTEGER NEXT, ILAT
+ REAL ALAT, DEG2RAD
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF ( NDBG .GT. 1) THEN
+ CALL INTLOG(JP_DEBUG,'NMAKGG: Input parameters:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'NMAKGG: Truncation = ', KTRUNC)
+ CALL INTLOG(JP_DEBUG,'NMAKGG: Number of latitudes = ', KNUM)
+ CALL INTLOG(JP_DEBUG, 'NMAKGG: Next latitude = ', KNEXT)
+ CALL INTLOGR(JP_DEBUG, 'NMAKGG: Lat.in degrees = ', PLAT(KNEXT))
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Processing.
+C _______________________________________________________
+C
+ DEG2RAD = PPI / 180.0
+C
+ NEXT = 1
+ DO ILAT = 1, KNUM
+ ALAT = PLAT(KNEXT+ILAT-1) * DEG2RAD
+C
+ IF ( NDBG .GT. 1) CALL INTLOGR(JP_DEBUG,
+ X 'NMAKGG: Next latitude constructed = ', ALAT)
+C
+ CALL JSPLEG1( PLEG(NEXT), ALAT, KTRUNC)
+ NEXT = NEXT + (KTRUNC+1)*(KTRUNC+4)/2
+ ENDDO
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+ KRET = 0
+C
+ 990 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/nmakll.F b/interpolation/nmakll.F
new file mode 100755
index 0000000..971bf0b
--- /dev/null
+++ b/interpolation/nmakll.F
@@ -0,0 +1,154 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE NMAKLL( KTRUNC, PINTVL, PLAT, KNUM, PLEG, KRET)
+C
+C---->
+C**** NMAKLL
+C
+C PURPOSE
+C _______
+C
+C This routine creates legendre functions for latitude rows from
+C the given latitude.
+C
+C INTERFACE
+C _________
+C
+C CALL NMAKLL( KTRUNC, PINTVL, PLAT, KNUM, PLEG, KRET)
+C
+C Input parameters
+C ________________
+C
+C KTRUNC - Truncation.
+C PINTVL - Grid interval (degrees)
+C PLAT - Start latitude in degrees.
+C KNUM - Number of latitudes
+C
+C Output parameters
+C ________________
+C
+C PLEG - Array of legendre functions for the latitude.
+C KRET - Return status code
+C 0 = OK
+C
+C Common block usage
+C __________________
+C
+C JDCNDBG
+C
+C Method
+C ______
+C
+C See below.
+C
+C Externals
+C _________
+C
+C INTLOG - Output log message
+C INTLOGR - Output log message (with real value)
+C
+C Reference
+C _________
+C
+C None.
+C
+C Comments
+C ________
+C
+C None at present.
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers *ECMWF* June 1999
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "jparams.h"
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 30500 )
+C
+C Subroutine arguments
+C
+ INTEGER KTRUNC, KRET, KNUM
+ REAL PLEG, PINTVL, PLAT
+ DIMENSION PLEG(*)
+C
+C Local variables
+C
+ REAL ZLAST, ZLAT, ALAT, DEG2RAD
+ INTEGER NEXTRW, NEXT, FIRST, LAST
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ IF( NDBG.GT.1 ) THEN
+ CALL INTLOG(JP_DEBUG,'NMAKLL: Input parameters:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,'NMAKLL: Truncation = ', KTRUNC)
+ CALL INTLOG(JP_DEBUG,'NMAKLL: Number of latitudes = ', KNUM)
+ CALL INTLOGR(JP_DEBUG,
+ X 'NMAKLL: Grid interval (degrees) = ', PINTVL)
+ CALL INTLOGR(JP_DEBUG,
+ X 'NMAKLL: Latitude in degrees = ', PLAT)
+ ENDIF
+C
+ IF( PLAT.LT.0.0 ) THEN
+ ZLAT = 0.0
+ ELSE
+ ZLAT = PLAT
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. Processing.
+C _______________________________________________________
+C
+ DEG2RAD = PPI / 180.0
+C
+ ZLAST = ZLAT - (KNUM-1)*PINTVL
+ NEXTRW = 1
+ FIRST = NINT(ZLAT/PINTVL)
+ LAST = NINT(ZLAST/PINTVL)
+ DO NEXT = FIRST, LAST, -1
+ ALAT = (NEXT*PINTVL) * DEG2RAD
+C
+ IF( NDBG.GT.1 ) CALL INTLOGR(JP_DEBUG,
+ X 'NMAKLL: Next latitude constructed = ', (NEXT*PINTVL))
+C
+ CALL JSPLEG1( PLEG(NEXTRW), ALAT, KTRUNC)
+ NEXTRW = NEXTRW + (KTRUNC+1)*(KTRUNC+4)/2
+ ENDDO
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine. Format statements
+C _______________________________________________________
+C
+ 900 CONTINUE
+ KRET = 0
+C
+ 990 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/nofld.common b/interpolation/nofld.common
new file mode 100755
index 0000000..ce5d282
--- /dev/null
+++ b/interpolation/nofld.common
@@ -0,0 +1,158 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C
+C**** "nofld.common"
+C
+C PURPOSE
+C _______
+C
+C This file contains all the output field definition variables.
+C
+C INTERFACE
+C _________
+C
+C #include "nofld.common"
+C
+C Common block usage
+C __________________
+C
+C JDNOFLD
+C -------
+C
+C NOFORM - Output field data format (0-Unpacked, 1-Grib).
+C NOREPR - Output field representation. Supported
+C representations are
+C Spherical harmonic
+C Regular Gaussian grid
+C Reduced Gaussian grid
+C Latitude/longitude grid
+C NOGAUSS - Output field Gaussian truncation.
+C NOMEGA - Intermediate field Gaussian truncation.
+C NORESO - Output field spherical harmonic resolution.
+C NOGRID - Output field grid definition (WE/NS).
+C NOAREA - Output field area definition (N/W/S/E).
+C NONS - Number of grid points in NS direction for output
+C field.
+C NOWE - Number of grid points in WE direction for output
+C field.
+C NO1NS - Index of first output field grid point in NS
+C direction of the input field.
+C NO1WE - Index of first output field grid point in WE
+C direction of the input field.
+C NOACC - Number of packing bits to be used for output
+C GRIB field.
+C NOPARAM - Output field parameter number
+C NOSCNM - Output field scanning mode.
+C NOTABLE - Output field table number.
+C NOLEVEL - Output field level.
+C NOLEVT - Output field level type.
+C POLATS - Array of reduced gaussian grid latitudes
+C (ROGAUSS in grspace.h used instead now)
+C (N to S pole)
+C NOLPTS - Array of reduced gaussian grid number of points
+C per latitude
+C NOPCNT - Total number of pts in input reduced gaussian field
+C NOROTA - Output field rotation definition (long/lat).
+C LNOROTA - Flag which says whether rotation has been specified
+C LO12PT - Flag chosing between 12-point and 4-point horixontal
+C interpolation for rotations
+C LDOUBLE - Flag chosing intermediate interpolation between
+C two reduced gaussian grids
+C LMETHOD - Flag chosing between bilinear and nearest neighbour
+C for interpolation method
+C LNNLSM - Flag using NN with same type of lsm in
+C hirlsm(rotated ll)
+C LINTOUT - Flag which says whether intout.F has been called.
+C NODATE - Input field date
+C NOMISS - Set non-zero if the output field is all missing
+C data because the input field was all missing data.
+C NOHFUNC - Used in CALL GRIBEX to force standard encoding or
+C 2nd-order packing for grid-point data.
+C NOBITMP - Name of file containing bitmap definition
+C NOFRAME - Width in grid points of a frame boundary.
+C NOSTYLE - Style to be used in generating grid point fields
+C (Mars [default] or dissemination).
+C
+C REFERENCE
+C _________
+C
+C NONE
+C
+C COMMENTS
+C ________
+C
+C Contains section 1
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF Oct 1993
+C
+C MODIFICATIONS
+C _____________
+C
+C NONE
+C
+C
+C _______________________________________________________
+C
+C
+C* Section 1. Field definition variables
+C _______________________________________________________
+C
+C
+ INTEGER
+ X NOFORM , NOREPR , NOGRID , NOAREA , NOAAPI , NOREDLL, NOGAUSS,
+ X NOMEGA, NORESO ,
+ X NOWE , NONS , NOSCNM , NOPARAM, NOTABLE, NO1WE , NO1NS ,
+ X NOACC , NOLPTS , NOPCNT , NOROTA , NOLEVEL, NOLEVT , NODATE ,
+ X NOMISS , NOFRAME, NOSTYLE, OUTLROT
+ DIMENSION NOGRID(2)
+ DIMENSION NOAREA(4), NOAAPI(4)
+ DIMENSION NOLPTS( JPLAT )
+ DIMENSION NOROTA(2)
+C
+ LOGICAL LINTOUT, LNOROTA, LO12PT,LMETHOD,LNNLSM,LDOUBLE,LUVCOMP,
+ X LGLOBL
+C
+ CHARACTER*1 NOHFUNC
+ CHARACTER*256 NOBITMP
+C
+ COMMON /JDNOFLD/
+ X NOFORM , NOREPR , NOGRID , NOAREA , NOAAPI , NOREDLL, NOGAUSS,
+ X NOMEGA, NORESO ,
+ X NOWE , NONS , NOSCNM , NOPARAM, NOTABLE, NO1WE , NO1NS ,
+ X NOACC , NOLPTS , NOPCNT , NOROTA , NOLEVEL, NOLEVT , NODATE ,
+ X NOMISS , NOFRAME, NOSTYLE, OUTLROT,
+ X LINTOUT,LNOROTA,LO12PT,LMETHOD,LNNLSM,LDOUBLE,LUVCOMP,LGLOBL,
+ X NOHFUNC, NOBITMP
+C
+ SAVE /JDNOFLD/
+C _______________________________________________________
+C
+C* Section 2. Ocean
+C _______________________________________________________
+C
+ INTEGER
+ X NOOCO3, NOOCO4,
+ X NOOCO4F, NOOCO3F, NOOCO4L, NOOCO3L,
+ X NOOIINC, NOOJINC,
+ X NOOIRGR, NOONOST
+ REAL OCCOOO
+ DIMENSION OCCOOO(1000)
+C
+ COMMON /JOCEANO/
+ X NOOCO3, NOOCO4,
+ X NOOCO4F, NOOCO3F, NOOCO4L, NOOCO3L,
+ X NOOIINC, NOOJINC,
+ X NOOIRGR, NOONOST,
+ X OCCOOO
+C
+ SAVE /JOCEANO/
diff --git a/interpolation/nptwe32.F b/interpolation/nptwe32.F
new file mode 100755
index 0000000..df8913e
--- /dev/null
+++ b/interpolation/nptwe32.F
@@ -0,0 +1,128 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION NPTWE32(WEST,EAST,GRIDSTEP)
+C
+C---->
+C**** NPTWE32
+C
+C Purpose
+C -------
+C
+C Calculate number of grid points in the range from west to east.
+C (32-bit REALs version)
+C
+C
+C Interface
+C ---------
+C
+C IRET = NPTWE32(WEST,EAST,GRIDSTEP)
+C
+C Input
+C -----
+C
+C WEST - Western boundary in degrees
+C EAST - Eastern boundary in degrees
+C GRIDSTEP - Grid interval in degrees
+C
+C
+C Output
+C ------
+C
+C Function returns the number of grid points in the east-west
+C interval.
+C
+C
+C Method
+C ------
+C
+C The grid is assumed to start at Greenwich.
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Mar 1998
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ REAL*4 EAST, WEST, GRIDSTEP
+C
+C Local variables
+C
+ INTEGER NL
+ REAL*8 DEAST, DWEST
+ REAL*8 LEFT, RIGHT, STEP, EPS
+ DATA EPS/1.0E-3/
+C
+C Statement function
+ LOGICAL EQUAL
+ REAL*8 A, B
+ EQUAL(A,B) = ( ABS(A-B) .LT.(ABS(A)*EPS) )
+C
+C ------------------------------------------------------------------
+C Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Make all longitudes positive for calculation of difference
+C
+ DEAST = EAST
+ DWEST = WEST
+ RIGHT = DEAST + 360.0
+ LEFT = DWEST + 360.0
+ STEP = GRIDSTEP
+ IF( RIGHT.LT.LEFT) RIGHT = RIGHT + 360.0
+C
+C ------------------------------------------------------------------
+C Section 2. Calculate the number of points in the interval
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Equal boundaries
+C
+ IF( EQUAL(LEFT,RIGHT) ) THEN
+ NPTWE32 = 1
+ GOTO 900
+ ENDIF
+C
+C Calculate offset of westernmost gridpoint
+C
+ NL = INT((LEFT+EPS)/STEP)
+ IF( .NOT. EQUAL(LEFT,(NL*STEP)) ) NL = NL + 1
+C
+ RIGHT = RIGHT - (NL*STEP)
+ NPTWE32 = INT((RIGHT+EPS)/STEP) + 1
+C
+C ------------------------------------------------------------------
+C Section 9. Return
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/numptns.F b/interpolation/numptns.F
new file mode 100755
index 0000000..10894ce
--- /dev/null
+++ b/interpolation/numptns.F
@@ -0,0 +1,106 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION NUMPTNS(NORTH,SOUTH,GRIDSTEP)
+C
+C---->
+C**** NUMPTNS
+C
+C Purpose
+C -------
+C
+C Calculate number of grid points in the range from north to south.
+C
+C
+C Interface
+C ---------
+C
+C IRET = NUMPTNS(NORTH,SOUTH,GRIDSTEP)
+C
+C Input
+C -----
+C
+C NORTH - Northern boundary in degrees
+C SOUTH - Southern boundary in degrees
+C GRIDSTEP - Grid interval in degrees
+C
+C
+C Output
+C ------
+C
+C Function returns the number of grid points in the north-south
+C interval.
+C
+C
+C Method
+C ------
+C
+C The grid is assumed to be centred on the Equator.
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Dec 1997
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ REAL SOUTH, NORTH, GRIDSTEP
+C
+C Local variables
+C
+ INTEGER N1, N2
+ REAL TOP, BOTTOM
+C
+C ------------------------------------------------------------------
+C Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ BOTTOM = SOUTH
+ TOP = NORTH
+ IF( BOTTOM.GT.TOP) THEN
+ BOTTOM = NORTH
+ TOP = SOUTH
+ ENDIF
+C ------------------------------------------------------------------
+C Section 2. Calculate the number of points in the interval
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ N1 = NINT(BOTTOM/GRIDSTEP)
+ N2 = NINT(TOP/GRIDSTEP)
+ NUMPTNS = N2 - N1 + 1
+C
+C ------------------------------------------------------------------
+C Section 9. Return
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/numptwe.F b/interpolation/numptwe.F
new file mode 100755
index 0000000..f8fa612
--- /dev/null
+++ b/interpolation/numptwe.F
@@ -0,0 +1,127 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION NUMPTWE(WEST,EAST,GRIDSTEP)
+C
+C---->
+C**** NUMPTWE
+C
+C Purpose
+C -------
+C
+C Calculate number of grid points in the range from west to east.
+C
+C
+C Interface
+C ---------
+C
+C IRET = NUMPTWE(WEST,EAST,GRIDSTEP)
+C
+C Input
+C -----
+C
+C WEST - Western boundary in degrees
+C EAST - Eastern boundary in degrees
+C GRIDSTEP - Grid interval in degrees
+C
+C
+C Output
+C ------
+C
+C Function returns the number of grid points in the east-west
+C interval.
+C
+C
+C Method
+C ------
+C
+C The grid is assumed to start at Greenwich.
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Nov 1997
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ REAL EAST, WEST, GRIDSTEP
+C
+C Local variables
+C
+ INTEGER NL
+ REAL*8 DEAST, DWEST
+ REAL*8 LEFT, RIGHT, STEP, EPS
+ DATA EPS/1.0E-3/
+C
+C Statement function
+ LOGICAL EQUAL
+ REAL*8 A, B
+ EQUAL(A,B) = ( ABS(A-B) .LT.EPS )
+C
+C ------------------------------------------------------------------
+C Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+C Make all longitudes positive for calculation of difference
+C
+ DEAST = EAST
+ DWEST = WEST
+ RIGHT = DEAST + 360.0
+ LEFT = DWEST + 360.0
+ STEP = GRIDSTEP
+ IF( RIGHT.LT.LEFT) RIGHT = RIGHT + 360.0
+C
+C ------------------------------------------------------------------
+C Section 2. Calculate the number of points in the interval
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Equal boundaries
+C
+ IF( EQUAL(LEFT,RIGHT) ) THEN
+ NUMPTWE = 1
+ GOTO 900
+ ENDIF
+C
+C Calculate offset of westernmost gridpoint
+C
+ NL = INT((LEFT+EPS)/STEP)
+ IF( .NOT. EQUAL(LEFT,(NL*STEP)) ) NL = NL + 1
+C
+ RIGHT = RIGHT - (NL*STEP)
+ NUMPTWE = INT((RIGHT+EPS)/STEP) + 1
+C
+C ------------------------------------------------------------------
+C Section 9. Return
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/oceanp.F b/interpolation/oceanp.F
new file mode 100755
index 0000000..5f1cc9d
--- /dev/null
+++ b/interpolation/oceanp.F
@@ -0,0 +1,529 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION OCEANP( INOCEAN, INLEN, OTOCEAN, OUTLEN)
+C
+C---->
+C**** OCEANP
+C
+C Purpose
+C -------
+C
+C Interpolate GRIB format input ocean field to GRIB format ocean
+C field.
+C
+C
+C Interface
+C ---------
+C
+C IRET = OCEANP( INOCEAN, INLEN, OTOCEAN, OUTLEN)
+C
+C Input
+C -----
+C
+C INOCEAN - Input ocean field (GRIB format).
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C OTOCEAN - Output ocean field (GRIB format).
+C OUTLEN - Output field length (words).
+C
+C
+C Method
+C ------
+C
+C Interpolate ocean field.
+C
+C If requested X grid increment does not match input GRIB
+C increment, do a full interpolation in both x and y. Otherwise,
+C interpolate only to make grid regular.
+C
+C Externals
+C ---------
+C
+C JDEBUG - Tests if debug output required.
+C GRIBEX - GRIB decoding/encoding.
+C INTLOG - Log error message.
+C JMEMHAN - Allocate/deallocate scratch memory.
+C INTOCN - Carry out ocean field to field interpolation.
+C IGSETUP - Setup GRIB sections for the output product.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF May 1996
+C
+C J.D.Chambers ECMWF Feb 1997
+C Allow for 64-bit pointers
+C
+C J.D.Chambers ECMWF Mar 1997
+C Allow for full or partial interpolation
+C (F or R option in call to INTOCN).
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER INOCEAN, INLEN, OTOCEAN, OUTLEN
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grspace.h"
+#include "intf.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPALLOC, JPDEALL, JPSCR3, JPSCR4
+ INTEGER JP_LAT, JP_LONG, JP_GUESS
+ PARAMETER (JPROUTINE = 36900 )
+ PARAMETER (JPALLOC = 1)
+ PARAMETER (JPDEALL = 0)
+ PARAMETER (JPSCR3 = 3)
+ PARAMETER (JPSCR4 = 4)
+ PARAMETER (JP_LONG = 3)
+ PARAMETER (JP_LAT = 4)
+ PARAMETER (JP_GUESS = 18049691)
+cs PARAMETER (JP_GUESS = 1675245)
+cs PARAMETER (JP_GUESS = 1237104)
+cs PARAMETER (JP_GUESS = 1038240)
+C `---> allow for 0.25*0.25 interpolated grid
+C
+C Local variables
+C
+ LOGICAL LHORIZN, LFLIP
+ CHARACTER*1 HFUNC
+ CHARACTER*1 HINTOPT
+ CHARACTER*6 YFLAG
+ INTEGER IOLDN, IOLDW, IOLDS, IOLDE, IOLDEW, IOLDNS
+ INTEGER LOOPLAT, LOOPLON, I, J , IOS,LOOP
+ REAL ZTEMP
+ INTEGER IERR, KPR, IWORD, IOLDSIZ, INEWSIZ, IINTPOL, ISTAGP
+ INTEGER NXP, NYP, INEWP, ITEMP
+ REAL RTOP, RBOTT, RRIGHT, RLEFT, RYRES, RXRES
+ REAL XARR, YARR
+ DIMENSION XARR(JPGRIB_ISEC1), YARR(JPGRIB_ISEC1)
+#ifdef POINTER_64
+ INTEGER*8 INEW, IOLD
+#endif
+ REAL NEW, OLD
+ POINTER ( INEW, NEW )
+ POINTER ( IOLD, OLD )
+ DIMENSION NEW( 1 ), OLD( 1 )
+C
+C Externals
+C
+ INTEGER RESET_C, IGSETUP, INTOCN, FIXAREA
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+C Test if debug output required.
+C
+ CALL JDEBUG()
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'OCEANP: Trying to interpolate an ocean field.',JPQUIET)
+C
+ IF( .NOT.LNOGRID ) THEN
+ CALL INTLOG(JP_FATAL,
+ X 'OCEANP: GRID must be specified to interpolate an ocean field'
+ X , JPQUIET)
+ OCEANP = JPROUTINE + 1
+ GOTO 960
+ ENDIF
+C
+ OCEANP = 0
+ IERR = 0
+ KPR = 0
+ LFLIP = .FALSE.
+C
+C Save the original area and grid definitions
+C
+ IOLDN = NOAREA(1)
+ IOLDW = NOAREA(2)
+ IOLDS = NOAREA(3)
+ IOLDE = NOAREA(4)
+ IOLDEW = NOGRID(1)
+ IOLDNS = NOGRID(2)
+C
+C -----------------------------------------------------------------|
+C* Section 2. Unpack the input ocean field.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Decode first four sections of GRIB code to find number of values
+C
+ IWORD = INLEN
+ IERR = 1
+ IOLDSIZ = OUTLEN
+ CALL GRIBEX(ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X OLD, IOLDSIZ, INOCEAN, INLEN, IWORD, 'I',IERR)
+C
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'OCEANP: GRIBEX option J decoding failed.',IERR)
+ OCEANP = IERR
+ GOTO 950
+ ENDIF
+C
+C Check it is an ocean field
+C
+ IF( (ISEC1(24).NE.1).OR.(ISEC1(37).NE.4) ) THEN
+ CALL INTLOG(JP_ERROR, 'OCEANP: Not an ocean field.',JPQUIET)
+ OCEANP = JPROUTINE + 3
+ GOTO 950
+ ENDIF
+C
+C Horizontal (lat/long) field GRIB setup different from others
+C
+ LHORIZN = (ISEC1(60).EQ.JP_LONG).AND.(ISEC1(61).EQ.JP_LAT)
+ IF( LHORIZN ) CALL INTLOG(JP_DEBUG,
+ X 'OCEANP: Horizontal (lat/long) field interpolation.',JPQUIET)
+C
+C Get scratch memory for unpacking the input ocean field.
+C
+ IOLDSIZ = ISEC2(2)*ISEC2(3)
+ CALL JMEMHAN( JPSCR4, IOLD, IOLDSIZ, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'OCEANP: Scratch memory(4) allocation failed.',JPQUIET)
+ OCEANP = IERR
+ GOTO 950
+ ENDIF
+C
+C Decode data from GRIB code: -999.9 is a missing data value
+C
+ IWORD = INLEN
+ IERR = 1
+ ZSEC3(2) = -999.9
+ CALL GRIBEX(ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X OLD, IOLDSIZ, INOCEAN, INLEN, IWORD, 'D',IERR)
+C
+ IF( (IERR.NE.0).AND.(IERR.NE.-2).AND.(IERR.NE.-4) ) THEN
+ CALL INTLOG(JP_ERROR,'OCEANP: GRIBEX decoding failed.',IERR)
+ OCEANP = IERR
+ GOTO 940
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 3. Prepare the output ocean field.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+C Setup interpolation options from input GRIB characteristics.
+C
+ IERR = RESET_C(ISEC1, ISEC2, ZSEC2, ISEC4)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'OCEANP: Setup interp. options from GRIB failed.',JPQUIET)
+ OCEANP = IERR
+ GOTO 940
+ ENDIF
+C
+C For horizontal field, match the desired area to the grid
+C
+ IERR = FIXAREA()
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR, 'OCEANP: FIXAREA failed.',JPQUIET)
+ OCEANP = IERR
+ GOTO 940
+ ENDIF
+C
+C Get scratch memory for output ocean field.
+C Have to guess how big the interpolated grid will be.
+C
+ INEWSIZ = JP_GUESS
+ CALL JMEMHAN(JPSCR3, INEW, INEWSIZ*2, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'OCEANP: Scratch memory(3) allocation failed.',JPQUIET)
+ OCEANP = IERR
+ GOTO 940
+ ENDIF
+ INEWP = 1
+ ITEMP = 1 + INEWSIZ
+C
+C -----------------------------------------------------------------|
+C* Section 4. Interpolate ocean field.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ RTOP = FLOAT( NOAREA(1) ) / PPMULT
+ RBOTT = FLOAT( NOAREA(3) ) / PPMULT
+ RRIGHT = FLOAT( NOAREA(4) ) / PPMULT
+ RLEFT = FLOAT( NOAREA(2) ) / PPMULT
+C
+ RYRES = FLOAT( NOGRID(2) ) / PPMULT
+ RXRES = FLOAT( NOGRID(1) ) / PPMULT
+C
+C Select the interpolation option
+C (default = 'R' = interpolate only to make grid regular)
+C If requested X grid increment does not match input GRIB
+C increment, interpolate in x and y ('F' = full)
+C
+ HINTOPT = 'R'
+ IF( NOGRID(1).NE.ISEC2(9) ) HINTOPT = 'F'
+C
+ IERR = INTOCN(HINTOPT,'D',
+ X RTOP, RBOTT, RRIGHT, RLEFT, RYRES, RXRES,
+ X ISEC1, ISEC2, OLD, IOLDSIZ,
+ X INEWSIZ, NEW(ITEMP), XARR, YARR, NXP, NYP,
+ X NEW(INEWP),
+ X IINTPOL, ISTAGP)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR, 'OCEANP: Interpolation failed.',JPQUIET)
+ OCEANP = IERR
+ GOTO 900
+ ENDIF
+C
+ NOAREA(1) = NINT( (YARR(1) + YARR(2)*(NYP-1)) * PPMULT )
+ NOAREA(2) = NINT( XARR(1) * PPMULT )
+ NOAREA(3) = NINT( YARR(1) * PPMULT )
+ NOAREA(4) = NINT( (XARR(1) + XARR(2)*(NXP-1)) * PPMULT )
+C
+ NOGRID(1) = NINT( ABS(XARR(2)) * PPMULT )
+ NOGRID(2) = NINT( ABS(YARR(2)) * PPMULT )
+ NONS = NYP
+ NOWE = NXP
+C
+C -----------------------------------------------------------------|
+C* Section 5. Code new field into GRIB.
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+C Re-order the rows from south to north to be north to south
+C (ECMWF convention).
+C
+ IF( LHORIZN.OR.(NOAREA(1).LT.NOAREA(3)) ) THEN
+ LFLIP = .TRUE.
+ DO LOOPLAT = 1, NYP/2
+ I = (LOOPLAT - 1)*NXP
+ J = (NYP - LOOPLAT)*NXP
+ DO LOOPLON = 1, NXP
+ I = I + 1
+ J = J + 1
+ ZTEMP = NEW(I)
+ NEW(I) = NEW(J)
+ NEW(J) = ZTEMP
+ ENDDO
+ ENDDO
+C
+ IF( .NOT.LHORIZN ) THEN
+ ITEMP = NOAREA(1)
+ NOAREA(1) = NOAREA(3)
+ NOAREA(3) = ITEMP
+C
+ ITEMP = ISEC2(4)
+ ISEC2(4) = ISEC2(7)
+ ISEC2(7) = ITEMP
+ ENDIF
+ ENDIF
+C
+C Setup GRIB sections for the output product:
+C
+C Use local definition 4 in GRIB section 1 ...
+C
+ ISEC1(73) = 0
+ ITEMP = 75 + ISEC1(71) + ISEC1(72) + ISEC1(73) + ISEC1(74)
+ ISEC1(ITEMP) = 0
+
+C
+ IF( LHORIZN ) THEN
+ ISEC1(62) = NOAREA(1)*10
+ ISEC1(63) = NOAREA(2)*10
+ ISEC1(64) = NOAREA(3)*10
+ ISEC1(65) = NOAREA(4)*10
+ ISEC1(66) = NOGRID(1)*10
+ ISEC1(67) = NOGRID(2)*10
+ IF( LFLIP ) ISEC1(67) = - ISEC1(67)
+ ISEC1(68) = 0
+ ISEC1(69) = 0
+C
+C Standard section 2 format for horizontal sections
+C
+ ISEC2(1) = 0
+ ISEC2(2) = NXP
+ ISEC2(3) = NYP
+ ISEC2(4) = NOAREA(1)/100
+ ISEC2(5) = NOAREA(2)/100
+ ISEC2(6) = 128
+ ISEC2(7) = NOAREA(3)/100
+ ISEC2(8) = NOAREA(4)/100
+ ISEC2(9) = NOGRID(1)/100
+ ISEC2(10) = NOGRID(2)/100
+Cjdc ISEC2(17) = 0
+ DO LOOPLAT = 11, 22
+ ISEC2(LOOPLAT) = 0
+ ENDDO
+ ELSE
+C Tim-Correct headers for vertical sections
+ IF( ISEC1(60).EQ.3 ) THEN
+ ISEC1(63) = NOAREA(2)*10
+ ELSEIF( ISEC1(60).EQ.4 ) THEN
+ ISEC1(63) = NOAREA(2)*10
+ ENDIF
+ IF( ISEC1(61).EQ.3 ) THEN
+ ISEC1(62) = NOAREA(1)*10
+ ELSEIF( ISEC1(61).EQ.4 ) THEN
+ ISEC1(62) = NOAREA(1)*10
+ ENDIF
+C
+ IF( ISEC1(61).EQ.1 ) THEN
+ ISEC1(64) = ISEC1(62) + NINT((NYP-1)*RYRES*1.0)
+ ISEC1(65) = ISEC1(63) + NINT((NXP-1)*RXRES*1000000.0)
+ ISEC1(66) = NOGRID(1)*NINT(1000000.0/PPMULT)
+ ISEC1(67) = NOGRID(2)/(PPMULT/1.0)
+ ELSE
+ ISEC1(64) = ISEC1(62) + NINT((NYP-1)*RYRES*1000.0)
+ ISEC1(65) = ISEC1(63) + NINT((NXP-1)*RXRES*1000000.0)
+ ISEC1(66) = NOGRID(1)*NINT(1000000.0/PPMULT)
+ ISEC1(67) = NOGRID(2)/(PPMULT/1000.0)
+ ENDIF
+C
+ IF( LFLIP ) ISEC1(67) = - ISEC1(67)
+ ISEC1(68) = 0
+C
+C Special ECMWF ocean short form of GRIB section 2
+C
+ ISEC2(1) = 192
+ ISEC2(2) = NXP
+ ISEC2(3) = NYP
+Cjdc ISEC2(4) = NOAREA(1)/100000
+Cjdc ISEC2(5) = NOAREA(2)/100
+Cjdc ISEC2(6) = 0
+Cjdc ISEC2(7) = NOAREA(3)/100000
+Cjdc ISEC2(8) = NOAREA(4)/100
+Cjdc DO LOOPLAT = 9, 22
+Cjdc ISEC2(LOOPLAT) = 0
+Cjdc ENDDO
+ ENDIF
+C
+C Ensure there is a section 3 in case there is missing data in the
+C output area
+C
+ ISEC1(5) = 192
+ ISEC3(1) = 0
+ ZSEC3(2) = -999.9
+C
+ ISEC4(1) = NXP * NYP
+C
+C If grid-point output, setup for 2nd order packing if requested.
+C
+ IF( (NOREPR.NE.JPSPHERE).AND.(NOREPR.NE.JPSPHROT) ) THEN
+ HFUNC = 'C'
+ IF( NOHFUNC.EQ.'K' ) THEN
+ HFUNC = 'K'
+ ISEC4(4) = 64
+ ISEC4(6) = 16
+ ISEC4(9) = 32
+ ISEC4(10) = 16
+ ISEC4(12) = 8
+ ISEC4(13) = 4
+ ISEC4(14) = 0
+ ISEC4(15) = -1
+ ELSE
+ ISEC4(4) = 0
+ ISEC4(6) = 0
+ ENDIF
+ ELSE
+ HFUNC = 'C'
+ IF( NOHFUNC.EQ.'C' ) THEN
+ ISEC2(6) = 2
+ ISEC4(4) = 64
+ ELSE IF( NOHFUNC.EQ.'S' ) THEN
+ ISEC2(6) = 1
+ ISEC4(4) = 0
+ ENDIF
+ ENDIF
+C
+C Switch off GRIBEX checking (sigh)
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'OCEANP: switching OFF GRIBEX checking',JPQUIET)
+ CALL GRSVCK(0)
+C
+ IERR = 1
+ CALL GRIBEX( ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
+ X NEW,INEWSIZ,OTOCEAN,OUTLEN,IWORD,HFUNC,IERR)
+C
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,'OCEANP: GRIBEX encoding failed.',IERR)
+ OCEANP = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+ OUTLEN = IWORD
+C
+C Switch on GRIBEX checking (sigh again)
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'OCEANP: switching ON GRIBEX checking',JPQUIET)
+ CALL GRSVCK(1)
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+C Clear change flags for next product processing
+C
+ LCHANGE = .FALSE.
+ LSMCHNG = .FALSE.
+C
+C Return the scratch memory.
+C
+ CALL JMEMHAN( JPSCR3, INEW, INEWSIZ, JPDEALL, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'OCEANP: Scratch memory(3) reallocation failed.',JPQUIET)
+ OCEANP = IERR
+ ENDIF
+C
+ 940 CONTINUE
+C
+ CALL JMEMHAN( JPSCR4, IOLD, IOLDSIZ, JPDEALL, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'OCEANP: Scratch memory(4) reallocation failed.',JPQUIET)
+ OCEANP = IERR
+ ENDIF
+C
+ 950 CONTINUE
+C
+C Restore the original area and grid definitions
+C
+ NOAREA(1) = IOLDN
+ NOAREA(2) = IOLDW
+ NOAREA(3) = IOLDS
+ NOAREA(4) = IOLDE
+ NOGRID(1) = IOLDEW
+ NOGRID(2) = IOLDNS
+C
+ 960 CONTINUE
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'OCEANP: Returning from interpolating an ocean field.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/oceanu.F b/interpolation/oceanu.F
new file mode 100755
index 0000000..d6df31b
--- /dev/null
+++ b/interpolation/oceanu.F
@@ -0,0 +1,455 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION OCEANU( INOCEAN, INLEN, OUTOCEAN, OUTLEN)
+C
+C---->
+C**** OCEANU
+C
+C Purpose
+C -------
+C
+C Interpolate input ocean field to ocean
+C field.
+C
+C
+C Interface
+C ---------
+C
+C IRET = OCEANU( INOCEAN, INLEN, OUTOCEAN, OUTLEN)
+C
+C Input
+C -----
+C
+C INOCEAN - Input ocean field
+C INLEN - Input field length (words).
+C
+C
+C Output
+C ------
+C
+C OUTOCEAN - Output ocean field
+C OUTLEN - Output field length (words).
+C
+C
+C Method
+C ------
+C
+C Interpolate ocean field.
+C
+C If requested X grid increment does not match input GRIB
+C increment, do a full interpolation in both x and y. Otherwise,
+C interpolate only to make grid regular.
+C
+C Externals
+C ---------
+C
+C JDEBUG - Tests if debug output required.
+C GRIBEX - GRIB decoding/encoding.
+C INTLOG - Log error message.
+C JMEMHAN - Allocate/deallocate scratch memory.
+C INTOCN - Carry out ocean field to field interpolation.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF Mar 1997
+C Allow for full or partial interpolation
+C (F or R option in call to INTOCN).
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Function arguments
+C
+ INTEGER INLEN, OUTLEN
+ REAL INOCEAN, OUTOCEAN
+ DIMENSION INOCEAN(*),OUTOCEAN(*)
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grspace.h"
+#include "intf.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPALLOC, JPDEALL, JPSCR3, JPSCR4
+ INTEGER JP_LAT, JP_LONG, JP_GUESS
+ PARAMETER (JPROUTINE = 36900 )
+ PARAMETER (JPALLOC = 1)
+ PARAMETER (JPDEALL = 0)
+ PARAMETER (JPSCR3 = 3)
+ PARAMETER (JPSCR4 = 4)
+ PARAMETER (JP_LONG = 3)
+ PARAMETER (JP_LAT = 4)
+ PARAMETER (JP_GUESS = 18049691)
+cs PARAMETER (JP_GUESS = 1675245)
+cs PARAMETER (JP_GUESS = 1237104)
+cs PARAMETER (JP_GUESS = 1038240)
+C `---> allow for 0.25*0.25 interpolated grid
+C
+C Local variables
+C
+ LOGICAL LHORIZN, LFLIP
+ CHARACTER*1 HFUNC
+ CHARACTER*1 HINTOPT
+ CHARACTER*6 YFLAG
+ INTEGER IOLDN, IOLDW, IOLDS, IOLDE, IOLDEW, IOLDNS
+ INTEGER LOOPLAT, LOOPLON, I, J, IOS, LOOP
+ REAL ZTEMP
+ INTEGER IERR, KPR, IWORD, IOLDSIZ, INEWSIZ, IINTPOL, ISTAGP
+ INTEGER NXP, NYP, INEWP, ITEMP
+ REAL RTOP, RBOTT, RRIGHT, RLEFT, RYRES, RXRES
+ REAL XARR, YARR
+ DIMENSION XARR(JPGRIB_ISEC1), YARR(JPGRIB_ISEC1)
+ REAL NEW
+ POINTER ( INEW, NEW )
+ DIMENSION NEW( 1 )
+C
+C Externals
+C
+ INTEGER RESET_C, INTOCNU, FIXAREA
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+C Test if debug output required.
+C
+ CALL JDEBUG()
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'OCEANU: Trying to interpolate an ocean field.',JPQUIET)
+C
+ IF( .NOT.LNOGRID ) THEN
+ CALL INTLOG(JP_FATAL,
+ X 'OCEANU: GRID must be specified to interpolate an ocean field'
+ X , JPQUIET)
+ OCEANU = JPROUTINE + 1
+ GOTO 960
+ ENDIF
+C
+ OCEANU = 0
+ IERR = 0
+ KPR = 0
+ LFLIP = .FALSE.
+C
+C Save the original area and grid definitions
+C
+ NOOCO3 = NIOCO3
+ NOOCO4 = NIOCO4
+ NOOCO4F = NIOCO4F
+ NOOCO3F = NIOCO3F
+ NOOCO4L = NIOCO4L
+ NOOCO3L = NIOCO3L
+ NOOIINC = NIOIINC
+ NOOJINC = NIOJINC
+ NOOIRGR = NIOIRGR
+ NOONOST = NIONOST
+
+ IOLDN = NOAREA(1)
+ IOLDW = NOAREA(2)
+ IOLDS = NOAREA(3)
+ IOLDE = NOAREA(4)
+ IOLDEW = NOGRID(1)
+ IOLDNS = NOGRID(2)
+C
+C -----------------------------------------------------------------|
+C* Section 2. Unpack the input ocean field.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+ LHORIZN = (NIOCO3.EQ.JP_LONG).AND.(NIOCO4.EQ.JP_LAT)
+ IF( LHORIZN ) CALL INTLOG(JP_DEBUG,
+ X 'OCEANU: Horizontal (lat/long) field interpolation.',JPQUIET)
+C
+C Get scratch memory for unpacking the input ocean field.
+C
+ IOLDSIZ = NINS * NIWE
+C
+C For horizontal field, match the desired area to the grid
+C
+ IERR = FIXAREA()
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR, 'OCEANU: FIXAREA failed.',JPQUIET)
+ OCEANU = IERR
+ GOTO 940
+ ENDIF
+C
+C Get scratch memory for output ocean field.
+C Have to guess how big the interpolated grid will be.
+C
+ IF(NOGRID(1).GT.0.AND.NOGRID(1).GT.0) THEN
+ INEWSIZ = (JP360/NOGRID(1) + 1) * (JP180 / NOGRID(2) + 1)*2
+ ELSE
+ INEWSIZ = JP_GUESS
+ ENDIF
+cs print*,'OCEANU INEWSIZ ',INEWSIZ
+cs print*,'OCEANU JP_GUESS ',JP_GUESS
+cs print*,'OCEANU NOGRID(1): ',NOGRID(1),' NOGRID(2): ',NOGRID(2)
+ CALL JMEMHAN(JPSCR3, INEW, INEWSIZ*2, JPALLOC, IERR)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'OCEANU: Scratch memory(3) allocation failed.',JPQUIET)
+ OCEANU = IERR
+ GOTO 940
+ ENDIF
+ INEWP = 1
+ ITEMP = 1 + INEWSIZ
+C
+C -----------------------------------------------------------------|
+C* Section 4. Interpolate ocean field.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ RTOP = FLOAT( NOAREA(1) ) / PPMULT
+ RBOTT = FLOAT( NOAREA(3) ) / PPMULT
+ RRIGHT = FLOAT( NOAREA(4) ) / PPMULT
+ RLEFT = FLOAT( NOAREA(2) ) / PPMULT
+C
+ RYRES = FLOAT( NOGRID(2) ) / PPMULT
+ RXRES = FLOAT( NOGRID(1) ) / PPMULT
+C
+C Select the interpolation option
+C (default = 'R' = interpolate only to make grid regular)
+C If requested X grid increment does not match input GRIB
+C increment, interpolate in x and y ('F' = full)
+C
+ HINTOPT = 'R'
+ IF( NOGRID(1).NE.NIGRID(1) ) HINTOPT = 'F'
+C
+ IERR = INTOCNU(HINTOPT,'D',
+ X RTOP, RBOTT, RRIGHT, RLEFT, RYRES, RXRES,
+ X INOCEAN, IOLDSIZ,
+ X INEWSIZ, NEW(ITEMP), XARR, YARR, NXP, NYP,
+ X NEW(INEWP),
+ X IINTPOL, ISTAGP)
+ IF( IERR.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR, 'OCEANU: Interpolation failed.',JPQUIET)
+ OCEANU = IERR
+ GOTO 900
+ ENDIF
+C
+ NOAREA(1) = NINT( (YARR(1) + YARR(2)*(NYP-1)) * PPMULT )
+ NOAREA(2) = NINT( XARR(1) * PPMULT )
+ NOAREA(3) = NINT( YARR(1) * PPMULT )
+ NOAREA(4) = NINT( (XARR(1) + XARR(2)*(NXP-1)) * PPMULT )
+C
+ NOAAPI(1) = NOAREA(1)
+ NOAAPI(2) = NOAREA(2)
+ NOAAPI(3) = NOAREA(3)
+ NOAAPI(4) = NOAREA(4)
+ NOGRID(1) = NINT( ABS(XARR(2)) * PPMULT )
+ NOGRID(2) = NINT( ABS(YARR(2)) * PPMULT )
+ NONS = NYP
+ NOWE = NXP
+C
+C -----------------------------------------------------------------|
+C* Section 5. Code new field into GRIB.
+C -----------------------------------------------------------------|
+C
+ 500 CONTINUE
+C
+C Re-order the rows from south to north to be north to south
+C (ECMWF convention).
+C
+ IF( LHORIZN.OR.(NOAREA(1).LT.NOAREA(3)) ) THEN
+ LFLIP = .TRUE.
+ DO LOOPLAT = 1, NYP/2
+ I = (LOOPLAT - 1)*NXP
+ J = (NYP - LOOPLAT)*NXP
+ DO LOOPLON = 1, NXP
+ I = I + 1
+ J = J + 1
+ ZTEMP = NEW(I)
+ NEW(I) = NEW(J)
+ NEW(J) = ZTEMP
+ ENDDO
+ ENDDO
+C
+ IF( .NOT.LHORIZN ) THEN
+ ITEMP = NOAREA(1)
+ NOAREA(1) = NOAREA(3)
+ NOAREA(3) = ITEMP
+C
+ ITEMP = NOAAPI(1)
+ NOAAPI(1) = NOAAPI(3)
+ NOAAPI(3) = ITEMP
+ ENDIF
+ ENDIF
+C
+C Setup GRIB sections for the output product:
+C
+C
+ IF( LHORIZN ) THEN
+c
+ NOOCO4F = NOAREA(1)*10
+ NOOCO3F = NOAREA(2)*10
+ NOOCO4L = NOAREA(3)*10
+ NOOCO3L = NOAREA(4)*10
+ NOOIINC = NOGRID(1)*10
+ NOOJINC = NOGRID(2)*10
+ IF( LFLIP ) NOOJINC = - NOOJINC
+ NOOIRGR = 0
+ NOONOST = 0
+C
+C Standard section 2 format for horizontal sections
+C
+ NOAAPI(1) = NOAREA(1)
+ NOAAPI(2) = NOAREA(2)
+ NOAAPI(3) = NOAREA(3)
+ NOAAPI(4) = NOAREA(4)
+ NOWE = NXP
+ NONS = NYP
+ ELSE
+C Tim-Correct headers for vertical sections
+ IF( NIOCO3.EQ.3 ) THEN
+ NOOCO3F = NOAREA(2)*10
+ ELSEIF( NIOCO3.EQ.4 ) THEN
+ NOOCO3F = NOAREA(2)*10
+ ENDIF
+ IF( NIOCO4.EQ.3 ) THEN
+ NOOCO4F = NOAREA(1)*10
+ ELSEIF( NIOCO4.EQ.4 ) THEN
+ NOOCO4F = NOAREA(1)*10
+ ENDIF
+C
+ IF( NIOCO4.EQ.1 ) THEN
+ NOOCO4L = NOOCO4F + NINT((NYP-1)*RYRES*1.0)
+ NOOCO3L = NOOCO3F + NINT((NXP-1)*RXRES*1000000.0)
+ NOOIINC = NOGRID(1)*NINT(1000000.0/PPMULT)
+ NOOJINC = NOGRID(2)/(PPMULT/1.0)
+ ELSE
+ NOOCO4L = NOOCO4F + NINT((NYP-1)*RYRES*1000.0)
+ NOOCO3L = NOOCO3F + NINT((NXP-1)*RXRES*1000000.0)
+ NOOIINC = NOGRID(1)*NINT(1000000.0/PPMULT)
+ NOOJINC = NOGRID(2)/(PPMULT/1000.0)
+ ENDIF
+C
+ IF( LFLIP ) NOOJINC = - NOOJINC
+ NOOIRGR = 0
+C
+C Special ECMWF ocean short form of GRIB section 2
+C
+cs ISEC2(1) = 192
+cs ISEC2(2) = NXP
+cs ISEC2(3) = NYP
+Cjdc ISEC2(4) = NOAREA(1)/100000
+Cjdc ISEC2(5) = NOAREA(2)/100
+Cjdc ISEC2(6) = 0
+Cjdc ISEC2(7) = NOAREA(3)/100000
+Cjdc ISEC2(8) = NOAREA(4)/100
+Cjdc DO LOOPLAT = 9, 22
+Cjdc ISEC2(LOOPLAT) = 0
+Cjdc ENDDO
+ ENDIF
+C
+C Ensure there is a section 3 in case there is missing data in the
+C output area
+C
+cs ISEC1(5) = 192
+cs ISEC3(1) = 0
+cs ZSEC3(2) = -999.9
+C
+cs ISEC4(1) = NXP * NYP
+C
+C If grid-point output, setup for 2nd order packing if requested.
+C
+cs IF( (NOREPR.NE.JPSPHERE).AND.(NOREPR.NE.JPSPHROT) ) THEN
+cs HFUNC = 'C'
+cs IF( NOHFUNC.EQ.'K' ) THEN
+cs HFUNC = 'K'
+cs ISEC4(4) = 64
+cs ISEC4(6) = 16
+cs ISEC4(9) = 32
+cs ISEC4(10) = 16
+cs ISEC4(12) = 8
+cs ISEC4(13) = 4
+cs ISEC4(14) = 0
+cs ISEC4(15) = -1
+cs ELSE
+cs ISEC4(4) = 0
+cs ISEC4(6) = 0
+cs ENDIF
+cs ELSE
+cs HFUNC = 'C'
+cs IF( NOHFUNC.EQ.'C' ) THEN
+cs ISEC2(6) = 2
+cs ISEC4(4) = 64
+cs ELSE IF( NOHFUNC.EQ.'S' ) THEN
+cs ISEC2(6) = 1
+cs ISEC4(4) = 0
+cs ENDIF
+cs ENDIF
+C
+C
+ OUTLEN = NXP*NYP
+ DO I = 1, OUTLEN
+ OUTOCEAN(I) = NEW(I)
+ ENDDO
+ CALL GETENV('DATA_CHECK', YFLAG)
+ IF( YFLAG(1:1).EQ.'1' ) THEN
+ OPEN (UNIT=18,FILE='./out_ocean_gribapi.dat',STATUS='UNKNOWN',
+ & FORM='UNFORMATTED',IOSTAT=IOS)
+ IF (IOS.EQ.0) THEN
+ WRITE (18)(OUTOCEAN(LOOP),LOOP=1,OUTLEN)
+ ENDIF
+ CLOSE(18)
+ ENDIF
+C
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+C Clear change flags for next product processing
+C
+ LCHANGE = .FALSE.
+ LSMCHNG = .FALSE.
+C
+C Return the scratch memory.
+C
+ CALL JMEMHAN( JPSCR3, INEW, INEWSIZ*2, JPDEALL, IERR)
+ IF ( IERR .NE. 0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'OCEANU: Scratch memory(3) reallocation failed.',JPQUIET)
+ OCEANU = IERR
+ ENDIF
+C
+ 940 CONTINUE
+C
+C
+ 950 CONTINUE
+C
+C Restore the original area and grid definitions
+C
+cs NOAREA(1) = IOLDN
+cs NOAREA(2) = IOLDW
+cs NOAREA(3) = IOLDS
+cs NOAREA(4) = IOLDE
+cs NOGRID(1) = IOLDEW
+cs NOGRID(2) = IOLDNS
+C
+ 960 CONTINUE
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'OCEANU: Returning from interpolating an ocean field.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/ouspace.h b/interpolation/ouspace.h
new file mode 100755
index 0000000..4c6116c
--- /dev/null
+++ b/interpolation/ouspace.h
@@ -0,0 +1,84 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C**** "ouspace.h"
+C
+C PURPOSE
+C _______
+C
+C This file contains the work space array definitions for the
+C arrays to hold the unpacked real data from GRIB fields.
+C
+C INTERFACE
+C _________
+C
+C #include "ouspace.h"
+C
+C Common block usage
+C __________________
+C
+C GRIB_SPACE
+C
+C NIFELD - POINTER to array RIFELD.
+C NOFELD - POINTER to array ROFELD.
+C
+C RIFELD - Dynamic array of length (NIWE * NINS)
+C (see nifld.common) which holds the expanded
+C input field.
+C ROFELD - Dynamic array of length (NOWE * NONS)
+C (see nofld.common) which holds the expanded
+C output field.
+C
+C METHOD
+C ______
+C
+C NONE
+C
+C REFERENCE
+C _________
+C
+C NONE
+C
+C COMMENTS
+C ________
+C
+C Contains sections 1
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Apr 1994
+C
+C MODIFICATIONS
+C _____________
+C
+C NONE
+C
+C
+C _______________________________________________________
+C
+C
+C* Section 1. Pointer and array combination
+C Array dimensions are in nifld.common and
+C nofld.common
+C _______________________________________________________
+C
+ COMMON /GRIB_SPACE/
+ 1 NIFELD, NOFELD
+C
+ SAVE /GRIB_SPACE/
+C
+ REAL RIFELD, ROFELD
+C
+C RIFELD is actually only the accumulated field length for a
+C quasi regular input field
+C
+ POINTER (NIFELD, RIFELD (NIWE * NINS) )
+ POINTER (NOFELD, ROFELD (NOWE * NONS) )
diff --git a/interpolation/outrep.F b/interpolation/outrep.F
new file mode 100755
index 0000000..c63d438
--- /dev/null
+++ b/interpolation/outrep.F
@@ -0,0 +1,35 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION OUTREP()
+C
+C---->
+C*****OUTREP*
+C
+C PURPOSE
+C -------
+C
+C LNOREPR - Flag to say whether or not user specified NOREPR
+
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+
+ OUTREP = 1
+
+ IF(LNOREPR) OUTREP = 0
+
+ IF( OUTREP.EQ.1 ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'OUTREP: Output Representation is Not specified',JPQUIET)
+ ENDIF
+C
+ RETURN
+ END
diff --git a/interpolation/parameter_processing_defaults b/interpolation/parameter_processing_defaults
new file mode 100755
index 0000000..dffa9c2
--- /dev/null
+++ b/interpolation/parameter_processing_defaults
@@ -0,0 +1,27 @@
+Param lsm wind prec lsm interp
+----- --- ---- ---- ----------
+131 n y n n
+132 n y n n
+140 y n n n
+141 y n n n
+142 n n y n
+143 n n y n
+144 n n y n
+165 n y n n
+166 n y n n
+170 y n n n
+171 y n n n
+172 n n n y
+173 y n n n
+182 y n n n
+183 y n n n
+184 y n n n
+190 y n n n
+191 y n n n
+192 y n n n
+193 y n n n
+199 y n n n
+200 y n n n
+228 n n y n
+239 n n y n
+240 n n y n
diff --git a/interpolation/parim.h b/interpolation/parim.h
new file mode 100755
index 0000000..762dfa5
--- /dev/null
+++ b/interpolation/parim.h
@@ -0,0 +1,619 @@
+c
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C**** "parim.h"
+C
+C PURPOSE
+C _______
+C
+C This file contains a set of constants used during interpolation.
+C
+C INTERFACE
+C _________
+C
+C #include "parim.h"
+C
+C Common block usage
+C __________________
+C
+C NONE
+C
+C METHOD
+C ______
+C
+C NONE
+C
+C REFERENCE
+C _________
+C
+C NONE
+C
+C COMMENTS
+C ________
+C
+C Contains sections 1 to 8
+C
+C AUTHOR
+C ______
+C
+C K. Fielding *ECMWF* Oct 1993
+C
+C Modifications
+C -------------
+C
+C S.Curic ECMWF March 2005
+C Changed constants JPSTRUNC=2047 JPGTRUNC=2048
+C in order to allow T2047 and N1024
+C Changed buffer size PGRIB_ISEC1 PGRIB_ISEC2 PGRIB_ISEC4
+C
+C S.Curic ECMWF March 2005
+C Changed constants JPDISTP=0.25
+C
+C S.Curic ECMWF March 2011
+C Changed constants JPSTRUNC=3999 JPGTRUNC=400
+C in order to allow T3999 and N2000
+C _______________________________________________________
+C
+C
+C* Section 1. Machine definition constants
+C _______________________________________________________
+C
+C JPBYTES - The number of bytes in an INTEGER word.
+C JPBITS - The number of bits in an INTEGER word.
+C JPILEN - The number of heap allocation units in an
+C INTEGER word.
+C JPRLEN - The number of heap allocation units in a REAL
+C word.
+C
+ INTEGER JPBITS, JPBYTES, JPILEN, JPRLEN
+C
+#ifdef CRAY
+ PARAMETER (JPBYTES = 8)
+ PARAMETER (JPILEN = 1)
+ PARAMETER (JPRLEN = 1)
+#else
+#ifdef INTEGER_8
+ PARAMETER (JPBYTES = 8)
+#else
+ PARAMETER (JPBYTES = 4)
+#endif
+ PARAMETER (JPILEN = JPBYTES)
+#ifdef REAL_8
+ PARAMETER (JPRLEN = 8)
+#else
+ PARAMETER (JPRLEN = 4)
+#endif
+#endif
+ PARAMETER (JPBITS = 8 * JPBYTES)
+C
+C _______________________________________________________
+C
+C
+C* Section 2. Library Limit Constants
+C _______________________________________________________
+C
+C JPLONG - The maximum number of points along a line of
+C latitude.
+C JPLAT - The maximum number of lines of latitude
+C JPGTRUNC - The maximum Gaussian truncation allowed.
+C JPSTRUNC - The maximum spherical harmonic truncation
+C allowed.
+C
+C JPML01 - 10 minute land sea mask - Number of values per
+C degree.
+C JPLG01 - 10 minute land sea mask - Number of values long
+C a line of latitude.
+C JPLT01 - 10 minute land sea mask - Number of lines of
+C latitude.
+C JPPACK - 10 minute land sea mask - Length of packed
+C record in words.
+C
+C PPDEGMIN - The minimum grid size
+C (Real (360) / REAL (JPLONG) ).
+C
+ INTEGER JPLONG, JPLAT, JPGTRUNC, JPSTRUNC
+C
+ PARAMETER (JPLONG = 4096)
+ PARAMETER (JPLAT = 4000 )
+ PARAMETER (JPGTRUNC = 4000)
+ PARAMETER (JPSTRUNC = 3999)
+C
+ INTEGER JPLG01, JPLT01, JPPACK, JPML01
+C
+ PARAMETER (JPML01 = 6)
+ PARAMETER (JPLG01 = 360 * JPML01)
+ PARAMETER (JPLT01 = 180 * JPML01)
+#ifdef rs6000
+ PARAMETER (JPPACK = (JPLG01 - 1) / 32 + 1)
+#else
+ PARAMETER (JPPACK = (JPLG01 - 1) / JPBITS + 1)
+#endif
+C
+ REAL PPDEGMIN
+C
+ PARAMETER (PPDEGMIN = 0.5E0)
+C
+C _______________________________________________________
+C
+C
+C* Section 3. Library Interface Constants
+C _______________________________________________________
+C
+C
+C Data representation type values:
+C
+C JPGAUSSIAN - Gaussian
+C JPFGGROT - Rotated full (regular) gaussian
+C JPQUASI - Quasi-regular gaussian
+C JPQGGROT - Rotated quasi-regular (reduced) gaussian
+C JPREDLL - Quasi-regular latitude/longitude
+C JPREDLROT - Rotated quasi-regular latitude/longitude
+C JPREGULAR - Regular latitude longitude
+C JPREGROT - Rotated regular latitude longitude
+C JPSPHERE - Spherical harmonic
+C JPSPHROT - Rotated spherical harmonic
+C JPSTRGG - Streched quasi-regular gaussian
+C JPSTRSH - Streched spherical harmonic
+C JPNOTYPE - Dummy data.
+C
+C Field parameter numbers required (All field numbers refer to
+C ECMWF local Code Table 2 with NITABLE .eq. 128).
+C
+C JP_U - Wind parameter U
+C JP_V - Wind parameter V
+C JP_10U - Wind parameter 10U
+C JP_10V - Wind parameter 10V
+C
+C JP_LSP - Large scale precipitation LSP
+C JP_CP - Convective precipitation CP
+C JP_SF - Snowfall SF
+C JP_TP - Total precipitation TP
+C
+C JP_MSL - Mean sea level pressure MSL
+C JP_LSM - Land sea mask LSM
+C
+C Field parameter numbers required (All field numbers refer to
+C the standard WMO parameter number with NITABLE .eq. 1)
+C
+C JP_WMO_U - Wind parameter U
+C JP_WMO_V - Wind parameter V
+C JP_WMO_10U - Wind parameter 10U
+C JP_WMO_10V - Wind parameter 10V
+C
+C JP_WMO_LSP - Large scale precipitation LSP
+C JP_WMO_CP - Convective precipitation CP
+C JP_WMO_SF - Snowfall SF
+C JP_WMO_TP - Total precipitation TP
+C
+C JP_WMO_MSL - Mean sea level pressure MSL
+C JP_WMO_LSM - Land sea mask LSM
+C
+ INTEGER JPGAUSSIAN,JPQUASI,JPREGULAR,JPREGROT,JPSPHERE,JPSPHROT
+ INTEGER JPFGGROT, JPQGGROT, JPSTRGG, JPSTRSH
+ INTEGER JPREDLL, JPREDLROT
+ INTEGER JPNOTYPE
+C
+ PARAMETER (JPGAUSSIAN = 4)
+ PARAMETER (JPFGGROT = 14)
+ PARAMETER (JPQUASI = 25)
+ PARAMETER (JPQGGROT = 27)
+ PARAMETER (JPREDLL = 26)
+ PARAMETER (JPREDLROT = 28)
+ PARAMETER (JPREGULAR = 0)
+ PARAMETER (JPREGROT = 10)
+ PARAMETER (JPSPHERE = 50)
+ PARAMETER (JPSPHROT = 60)
+ PARAMETER (JPSTRGG = 24)
+ PARAMETER (JPSTRSH = 70)
+ PARAMETER (JPNOTYPE = 9999)
+C
+ INTEGER JP_U, JP_V, JP_10U, JP_10V
+C
+ PARAMETER (JP_U = 131)
+ PARAMETER (JP_V = 132)
+ PARAMETER (JP_10U = 165)
+ PARAMETER (JP_10V = 166)
+C
+ INTEGER JP_LSP, JP_CP, JP_SF, JP_TP
+C
+ PARAMETER (JP_LSP = 142)
+ PARAMETER (JP_CP = 143)
+ PARAMETER (JP_SF = 144)
+ PARAMETER (JP_TP = 228)
+C
+ INTEGER JP_MSL, JP_LSM
+C
+ PARAMETER (JP_MSL = 151)
+ PARAMETER (JP_LSM = 172)
+C
+ INTEGER JP_WMO_U, JP_WMO_V
+C
+ PARAMETER (JP_WMO_U = 33)
+ PARAMETER (JP_WMO_V = 34)
+C
+ INTEGER JP_WMO_LSP, JP_WMO_CP, JP_WMO_SF, JP_WMO_TP, JP_WMO_WESF
+C
+ PARAMETER (JP_WMO_TP = 61)
+ PARAMETER (JP_WMO_LSP = 62)
+ PARAMETER (JP_WMO_CP = 63)
+ PARAMETER (JP_WMO_SF = 64)
+ PARAMETER (JP_WMO_WESF = 65)
+C
+ INTEGER JP_WMO_MSL, JP_WMO_LSM
+C
+ PARAMETER (JP_WMO_MSL = 2)
+ PARAMETER (JP_WMO_LSM = 81)
+C
+C
+C _______________________________________________________
+C
+C
+C* Section 4. Library Formulation Constants
+C
+C These constants handle the fact that all latitudes and
+C longitudes are represented as integer values. The values of
+C longitude or latitude degrees are represented as
+C NINT (real_degree * PPMULT).
+C
+C _______________________________________________________
+C
+C JPMULT - The integer version of the multiplier PPMULT
+C (currently 10000).
+C JP90 - The integer value (90 * JPMULT).
+C JP180 - The integer value (180 * JPMULT).
+C JP360 - The integer value (360 * JPMULT).
+C JP0P5 - The integer value (JPMULT / 2).
+C JP0P25 - The integer value (JPMULT / 4). 0.25 resol
+C PPEPS - Small value to force latitude rounding.
+C
+C PPMULT - The multiplying factor for all degree values
+C (REAL (JPMULT) )
+C
+C JPMICRO - scale factor from micro-degrees (from GRIB)
+C to working scale (JPMULT).
+C
+ INTEGER JPMULT, JP90, JP180, JP360, JP0P5, JP0P25, JPMIN, JPMICRO
+ REAL PPEPS
+C
+ PARAMETER (JPMULT = 100000)
+ PARAMETER ( JP90 = 90 * JPMULT)
+ PARAMETER (JP180 = 180 * JPMULT)
+ PARAMETER (JP360 = 360 * JPMULT)
+ PARAMETER (JP0P5 = JPMULT / 2)
+ PARAMETER (JP0P25 = JPMULT / 4)
+ PARAMETER (PPEPS = 0.9)
+ PARAMETER (JPMIN = JP0P5)
+ PARAMETER (JPMICRO = (JPMULT/1000) )
+C
+ REAL PPMULT
+C
+ PARAMETER (PPMULT = 1.0E5)
+C
+C _______________________________________________________
+C
+C
+C* Section 5. Grib Section Size Constants
+C
+C All these constants are in terms of expanded arrays after
+C GRIBEX has been used to unpack a field.
+C
+C _______________________________________________________
+C
+C JPENSEMBLE - The number of ensemble forecasts (Used for
+C handling clusters).
+C JPVERTICAL - The number of model levels.
+C JPBASE2 - The basic size of Grib Section 2.
+C
+C JPGRIB_ISEC0 - The size of Grib integer Section 0.
+C JPGRIB_ISEC1 - The size of Grib integer Section 1.
+C JPGRIB_ISEC2 - The size of Grib integer Section 2.
+C JPGRIB_ISEC3 - The size of Grib integer Section 3.
+C JPGRIB_ISEC4 - The size of Grib integer Section 4.
+C
+C JPGRIB_RSEC2 - The size of Grib real Section 2.
+C JPGRIB_RSEC3 - The size of Grib real Section 3.
+C
+ INTEGER JPENSEMBLE, JPVERTICAL, JPBASE2
+C
+ PARAMETER (JPENSEMBLE = 100)
+ PARAMETER (JPVERTICAL = 128)
+ PARAMETER (JPBASE2 = 22)
+C
+ INTEGER JPGRIB_ISEC0, JPGRIB_ISEC1, JPGRIB_ISEC2, JPGRIB_ISEC3,
+ 1 JPGRIB_ISEC4
+C
+ PARAMETER (JPGRIB_ISEC0 = 2)
+ PARAMETER (JPGRIB_ISEC1 = 2048 )
+ PARAMETER (JPGRIB_ISEC2 = 5000)
+ PARAMETER (JPGRIB_ISEC3 = 2)
+ PARAMETER (JPGRIB_ISEC4 = 2512)
+C
+ INTEGER JPGRIB_RSEC2, JPGRIB_RSEC3
+C
+ PARAMETER (JPGRIB_RSEC2 = 10 + 2 * (JPVERTICAL + 1) )
+ PARAMETER (JPGRIB_RSEC3 = 2)
+C
+C
+C _______________________________________________________
+C
+C
+C* Section 6. Grib Section 1, 2 and 4 Offsets
+C
+C All these constants are used for expanded arrays after GRIBEX
+C has been used to unpack a field.
+C
+C has been used to unpack a field. C
+C _______________________________________________________
+C
+C General offsets.
+C ________________
+C
+C JPSEC1_TABLE - The offset of the version number of code table 2.
+C JPSEC1_PARAM - The offset of the parameter value in Section 1.
+C
+C JPSEC2_REP - The offset of the Data Representation Type in
+C Section 2.
+C JPSEC2_QUASI - The offset of the Quasi Regular Flag in
+C Section 2.
+C JPSEC2_QUDEF - The offset of the end of a standard Section 2.
+C This may be used to simplify access to quasi
+C regular Gaussian field latitude line length
+C definitions.
+C
+C JPSEC4_NVALUE - The offset of the number of data values in the
+C field.
+C JPSEC4_NBITS - The offset of the number of bits used for each
+C data value in the field.
+C
+ INTEGER JPSEC1_PARAM, JPSEC1_TABLE
+C
+ PARAMETER (JPSEC1_TABLE = 1)
+ PARAMETER (JPSEC1_PARAM = 6)
+C
+ INTEGER JPSEC4_NVALUE, JPSEC4_NBITS
+C
+ PARAMETER (JPSEC4_NVALUE = 1)
+ PARAMETER (JPSEC4_NBITS = 2)
+C
+ INTEGER JPSEC2_REP, JPSEC2_QUASI, JPSEC2_QUDEF
+C
+ PARAMETER (JPSEC2_REP = 1)
+ PARAMETER (JPSEC2_QUASI = 17)
+ PARAMETER (JPSEC2_QUDEF = JPBASE2)
+C
+C Offsets for Spherical Harmonic Data.
+C ____________________________________
+C
+C JPSEC2_STRUNC - The offset of the Triangular truncation factor
+C in Section 2.
+C JPSEC2_JTRUNC - The offset of the J-Pentagonal resolution
+C parameter in Section 2.
+C JPSEC2_KTRUNC - The offset of the K-Pentagonal resolution
+C parameter in Section 2.
+C JPSEC2_MTRUNC - The offset of the M-Pentagonal resolution
+C parameter in Section 2.
+C JPSEC2_SHRES - The offset of the Representation Type in
+C Section 2.
+C JPSEC2_SHMODE - The offset of the Representation Mode in
+C Section 2.
+C
+ INTEGER JPSEC2_STRUNC
+ INTEGER JPSEC2_JTRUNC
+ INTEGER JPSEC2_KTRUNC
+ INTEGER JPSEC2_MTRUNC
+ INTEGER JPSEC2_SHRES
+ INTEGER JPSEC2_SHMODE
+C
+ PARAMETER (JPSEC2_STRUNC = 2)
+ PARAMETER (JPSEC2_JTRUNC = 2)
+ PARAMETER (JPSEC2_KTRUNC = 3)
+ PARAMETER (JPSEC2_MTRUNC = 4)
+ PARAMETER (JPSEC2_SHRES = 5)
+ PARAMETER (JPSEC2_SHMODE = 6)
+C
+C Offsets for all grid point data
+C _______________________________
+C
+C JPSEC2_NLONG - The offset of the Number of points along a line
+C of latitude in Section 2. This value is unset
+C for a quasi regular Gaussian field.
+C JPSEC2_NLAT - The offset of the Number of lines of latitude
+C in Section 2.
+C JPSEC2_NORTH - The offset of the Northern line of latitude in
+C Section 2.
+C JPSEC2_SOUTH - The offset of the Southern line of latitude in
+C Section 2.
+C JPSEC2_WEST - The offset of the Western longitude limit in
+C Section 2.
+C JPSEC2_EAST - The offset of the Eastern longitude limit in
+C Section 2. This value should be ignored for a
+C quasi regular Gaussian field.
+C JPSEC2_RESOL - The offset of the Resolution flag in Section 2.
+C JPSEC2_DLONG - The offset of the Increment along a line of
+C latitude in Section 2. This value is unset for
+C a quasi regular Gaussian field or a field where
+C Grib cannot describe this value accurately
+C (0.5625 degrees).
+C JPSEC2_SCAN - The offset of the Scanning mode flag in
+C Section 2.
+C JPSEC2_VERT - The offset of the Number of vertical coordinate
+C parameters in Section 2.
+C
+ INTEGER JPSEC2_NLONG
+ INTEGER JPSEC2_NLAT
+ INTEGER JPSEC2_NORTH
+ INTEGER JPSEC2_WEST
+ INTEGER JPSEC2_SOUTH
+ INTEGER JPSEC2_EAST
+ INTEGER JPSEC2_RESOL
+ INTEGER JPSEC2_DLONG
+ INTEGER JPSEC2_SCAN
+ INTEGER JPSEC2_VERT
+C
+ PARAMETER (JPSEC2_NLONG = 2)
+ PARAMETER (JPSEC2_NLAT = 3)
+ PARAMETER (JPSEC2_NORTH = 4)
+ PARAMETER (JPSEC2_WEST = 5)
+ PARAMETER (JPSEC2_SOUTH = 7)
+ PARAMETER (JPSEC2_EAST = 8)
+ PARAMETER (JPSEC2_RESOL = 6)
+ PARAMETER (JPSEC2_DLONG = 9)
+ PARAMETER (JPSEC2_SCAN = 11)
+ PARAMETER (JPSEC2_VERT = 12)
+C
+C Offset for Gaussian grids only
+C ______________________________
+C
+C JPSEC2_GTRUNC - The offset of Gaussian truncation value in
+C Section 2. This would be the number of points
+C between a pole and the equator for a global
+C grid.
+C
+ INTEGER JPSEC2_GTRUNC
+C
+ PARAMETER (JPSEC2_GTRUNC = 10)
+C
+C Offset for latitude longitude grids only
+C ________________________________________
+C
+C JPSEC2_DLAT - The offset of the Increment along a line of
+C meridian in Section 2. This value is unset for
+C a field where Grib cannot describe this value
+C accurately (0.5625 degrees).
+C
+ INTEGER JPSEC2_DLAT
+C
+ PARAMETER (JPSEC2_DLAT = 10)
+C
+C _______________________________________________________
+C
+C
+C* Section 7. Useful constants
+C _______________________________________________________
+C
+C PPZERO - The constant real zero
+C PPONE - The constant real one
+C
+C JPABS - I/O parameter to PBSEEK causing absolute file
+C positioning.
+C JPEOF - End of file return value from PBSEEK or PBREAD.
+C JPERR - Error return value from PBSEEK or PBREAD.
+C
+ REAL PPZERO, PPONE
+C
+ PARAMETER (PPZERO = 0.0E0)
+ PARAMETER (PPONE = 1.0E0)
+C
+ INTEGER JPABS, JPEOF, JPERR
+C
+ PARAMETER (JPABS = 0)
+ PARAMETER (JPEOF = - 1)
+ PARAMETER (JPERR = - 2)
+C
+ INTEGER JPLEVEL, JPINNER, JPGRIB_SPACE
+C
+ PARAMETER (JPLEVEL = 2)
+ PARAMETER (JPINNER = JPLEVEL)
+ PARAMETER (JPGRIB_SPACE = 1)
+C
+C _______________________________________________________
+C
+C
+C* Section 8. Grid to Grid Constant Definitions
+C _______________________________________________________
+C
+C JP_I_N - An array index used to access the input
+C latitude line North of the current output
+C point.
+C JP_I_S - An array index used to access the input
+C latitude line South of the current output
+C point.
+C JP_I_W - An array index used to access the input points
+C West of the current output point.
+C JP_I_E - An array index used to access the input points
+C East of the current output point.
+C
+C JP_I_NW - An array index used to access the weight array
+C for the point North-West of the current output
+C point.
+C JP_I_NE - An array index used to access the weight array
+C for the point North-East of the current output
+C point.
+C JP_I_SW - An array index used to access the weight array
+C for the point South-West of the current output
+C point.
+C JP_I_SE - An array index used to access the weight array
+C for the point South-East of the current output
+C point.
+C
+C JPNORTH - An array index used to access the Northern
+C value of a MARS AREA definition.
+C JPSOUTH - An array index used to access the Southern
+C value of a MARS AREA definition.
+C JPWEST - An array index used to access the Western
+C value of a MARS AREA definition.
+C JPEAST - An array index used to access the Eastern
+C value of a MARS AREA definition.
+C
+C JPWESTEP - An array index used to access the West-East
+C stride of a MARS GRID definition.
+C JPNSSTEP - An array index used to access the North-South
+C stride of a MARS GRID definition.
+C
+ INTEGER JP_I_N, JP_I_S, JP_I_W, JP_I_E
+C
+ PARAMETER (JP_I_N = 1)
+ PARAMETER (JP_I_S = 2)
+ PARAMETER (JP_I_W = 1)
+ PARAMETER (JP_I_E = 2)
+C
+ INTEGER JP_I_NW, JP_I_NE, JP_I_SW, JP_I_SE
+C
+ PARAMETER (JP_I_NW = 1)
+ PARAMETER (JP_I_NE = 2)
+ PARAMETER (JP_I_SW = 3)
+ PARAMETER (JP_I_SE = 4)
+C
+ INTEGER JPNORTH, JPSOUTH, JPWEST, JPEAST
+C
+ PARAMETER (JPNORTH = 1)
+ PARAMETER (JPWEST = 2)
+ PARAMETER (JPSOUTH = 3)
+ PARAMETER (JPEAST = 4)
+C
+ INTEGER JPWESTEP, JPNSSTEP
+C
+ PARAMETER (JPWESTEP = 1)
+ PARAMETER (JPNSSTEP = 2)
+C
+C --------------------------------------------------------------------
+C Values for message logging
+C
+ INTEGER JP_DEBUG, JP_INFO, JP_WARN, JP_ERROR, JP_FATAL, JPQUIET
+ PARAMETER ( JP_DEBUG = 0 )
+ PARAMETER ( JP_INFO = 1 )
+ PARAMETER ( JP_WARN = 2 )
+ PARAMETER ( JP_ERROR = 3 )
+ PARAMETER ( JP_FATAL = 4 )
+ PARAMETER ( JPQUIET = -999999999 )
+C
+C --------------------------------------------------------------------
+C Values grid point generation styles
+C
+ REAL*8 JPDISTP
+ INTEGER JPSMARS, JPSDISM
+C
+C JPSMARS => Mars style, eg area checking
+C JPSDISM => Dissemination style, eg point selection
+C JPDISTP = default dissemination lat/long grid step (= 0.25 degrees)
+C
+ PARAMETER ( JPSMARS = 0 )
+ PARAMETER ( JPSDISM = 1 )
+ PARAMETER ( JPDISTP = 0.25 )
diff --git a/interpolation/pddefs.F b/interpolation/pddefs.F
new file mode 100755
index 0000000..ebec795
--- /dev/null
+++ b/interpolation/pddefs.F
@@ -0,0 +1,409 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION PDDEFS()
+C
+C---->
+C** PDDEFS
+C
+C Purpose
+C -------
+C
+C Adjust the interpolation parameters according to parameter
+C dependent requirements.
+C
+C Interface
+C ---------
+C
+C IRET = PDDEFS()
+C
+C Input
+C -----
+C
+C Input file format:
+C
+C Param lsm wind prec lsm interp ) First 2 lines
+C ----- --- ---- ---- ---------- ) are ignored
+C 131 n y n n )
+C 132 n y n n )
+C 140 y n n n )
+C 141 y n n n ) I3,4(5X,A1)
+C 142 n n y n )
+C 143 n n y n )
+C 144 n n y n )
+C 165 n y n n )
+C :
+C :
+C
+C Output
+C ------
+C
+C IRET = 0 if OK.
+C
+C
+C Method
+C ------
+C
+C Values are taken from a (text) file in a directory defined
+C by the environment variable:
+C
+C "PARAMETER_PROCESSING_DEFAULTS" (if defined),
+C
+C or from the directory:
+C
+C /owrk/marsint/new (CRAY)
+C /mrfs/postproc (Fujitsu)
+C /usr/local/lib/metaps/tables/interpolation ( new )
+C
+C or from an internal default array.
+C
+C The file used has name defaults_for_table_nnn, where
+C nnn is the 3-digit local code table number (eg 128 for
+C ECMWF, 001 for WMO, etc ).
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Logs messages.
+C GETENV - Gets environment variable information.
+C INDEX - Locates a character in a character variable.
+C EMOSNUM - Gives current EMOSLIB version number.
+C PRECIP - Says if field is to have 'precipitation' treatment
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF August 1994.
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPNUMDF, JPND001, JPND128, JPND129
+ PARAMETER (JPROUTINE = 28000)
+ PARAMETER (JPNUMDF = 100)
+ PARAMETER (JPND001 = 9)
+ PARAMETER (JPND128 = 13)
+ PARAMETER (JPND129 = 12)
+C
+#include "parim.h"
+#include "nifld.common"
+C
+C Local variables
+C
+ CHARACTER*6 YEMOSNM
+ INTEGER IEMOSNM
+ CHARACTER*256 FILENAME
+ CHARACTER*80 HLINE
+ CHARACTER*80 YENVBACK
+ INTEGER IPARAM, INEXT, NUMDFS, LOOP, INDX, IOTABLE
+ CHARACTER*1 HLSM, HWIND, HPREC, HLSMI
+ LOGICAL LNLSM, LNWIND, LNPREC, LNSMPAR
+ DATA IOTABLE/0/
+C
+C Default array
+C
+ CHARACTER*27 HDEFS(JPNUMDF)
+C
+C Specified defaults
+C
+C WMO table 1
+C
+ CHARACTER*27 TAB001(JPND001)
+ DATA TAB001/
+ X '002 n n n n',
+ X '033 y y n n',
+ X '034 y y n n',
+ X '061 y n y n',
+ X '062 y n y n',
+ X '063 y n y n',
+ X '064 y n y n',
+ X '065 y n y n',
+ X '081 n n n y'
+ X /
+C
+C ECMWF table 128
+C
+ CHARACTER*27 TAB128(JPND128)
+ DATA TAB128/
+ X '131 y y n n',
+ X '132 y y n n',
+ X '142 y n y n',
+ X '143 y n y n',
+ X '144 y n y n',
+ X '151 n n n n',
+ X '165 y y n n',
+ X '166 y y n n',
+ X '169 y n n n',
+ X '172 n n n y',
+ X '228 y n y n',
+ X '239 y n y n',
+ X '240 y n y n'
+ X /
+C
+C ECMWF table 129
+C
+ CHARACTER*27 TAB129(JPND129)
+ DATA TAB129/
+ X '131 y y n n',
+ X '132 y y n n',
+ X '142 y n y n',
+ X '143 y n y n',
+ X '144 y n y n',
+ X '151 n n n n',
+ X '165 y y n n',
+ X '166 y y n n',
+ X '172 n n n y',
+ X '228 y n y n',
+ X '239 y n y n',
+ X '240 y n y n'
+ X /
+C
+ SAVE HDEFS, NUMDFS, IOTABLE, FILENAME
+C
+C External functions
+C
+ INTEGER EMOSNUM
+ LOGICAL PRECIP
+ EXTERNAL EMOSNUM, PRECIP
+C
+C Statement function
+C
+ LOGICAL NOTSAME, A, B
+C
+C XOR or NE for logicals
+C
+ NOTSAME(A,B) = ((A).AND.(.NOT.(B))).OR.((B).AND.(.NOT.(A)))
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ PDDEFS = 0
+C
+C Start with the generic settings.
+C
+ LNLSM = .TRUE.
+ LNWIND = .FALSE.
+ LNPREC = .FALSE.
+ LNSMPAR = .FALSE.
+C
+C ------------------------------------------------------------------
+C* Section 2. If parameter table has changed, treat as first time
+C through: open and read the file of default values.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF( IOTABLE.NE.NITABLE ) THEN
+C
+ DO LOOP = 1, 256
+ FILENAME(LOOP:) = ' '
+ ENDDO
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'PDDEFS: Try to get processing defaults file.',JPQUIET)
+C
+C Get the directory name
+C
+ CALL GETENV( 'PARAMETER_PROCESSING_DEFAULTS', FILENAME)
+ IF( FILENAME(1:1).EQ.' ' ) THEN
+#if (defined CRAY)
+ FILENAME = '/owrk/marsint/new/'
+#elif (defined __uxp__)
+C
+C On Fujitsus, need to build different pathname for vpp300,
+C vpp700, vpp700e and vpp5000
+C
+ CALL GETENV ('HOST', YENVBACK)
+ IF( YENVBACK(1:7) .EQ. 'vpp5000' )THEN
+ FILENAME = '/vpp5000/mrfs/postproc/'
+ ELSE IF( YENVBACK(1:7) .EQ. 'vpp700e' )THEN
+ FILENAME = '/vpp700e/mrfs/postproc/'
+ ELSE IF( YENVBACK(1:6) .EQ. 'vpp700' )THEN
+ FILENAME = '/vpp700/mrfs/postproc/'
+ ELSE
+ FILENAME = '/mrfs/postproc/'
+ ENDIF
+#else
+ FILENAME = '/usr/local/lib/metaps/tables/interpolation/'
+#endif
+ ENDIF
+C
+C Build the complete file pathname
+C
+ INDX = INDEX(FILENAME, ' ')
+ FILENAME(INDX:) = 'defaults_for_table_'
+ INDX = INDEX(FILENAME, ' ')
+ WRITE(FILENAME(INDX:),'(I3.3)') NITABLE
+ INDX = INDX + 2
+ CALL INTLOG(JP_DEBUG, FILENAME(1:INDX), JPQUIET)
+ IOTABLE = NITABLE
+C
+ OPEN( UNIT = 1,
+ X FILE = FILENAME(1:INDX),
+ X STATUS = 'OLD',
+ X FORM = 'FORMATTED',
+ X ERR = 300)
+C
+C Skip first 2 lines in the file
+C
+ READ(1,'(A)', END = 900) HLINE
+ READ(1,'(A)', END = 900) HLINE
+C
+C Read the file into the defaults array
+C
+ NUMDFS = 1
+ DO LOOP = 1, JPNUMDF
+ READ(1,'(A)', END = 220) HDEFS(NUMDFS)
+ NUMDFS = NUMDFS + 1
+ ENDDO
+C
+ 220 CONTINUE
+C
+C Close the file.
+C
+ NUMDFS = NUMDFS - 1
+ CLOSE(1, ERR = 920)
+C
+ GOTO 400
+C
+C ------------------------------------------------------------------
+C* Section 3. If file problem, use default arrays.
+C ------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ CALL INTLOG(JP_DEBUG,
+ X 'PDDEFS: No parameter processing defaults file found.',JPQUIET)
+C
+C Use appropriate table
+C 1 = WMO table 1
+C 128 = ECMWF local code table 128
+C 129 = ECMWF local code table 129
+C
+ IF( NITABLE.EQ.1 ) THEN
+C
+ DO LOOP = 1, JPND001
+ HDEFS(LOOP) = TAB001(LOOP)
+ ENDDO
+ NUMDFS = JPND001
+C
+ ELSE IF( NITABLE.EQ.128 ) THEN
+C
+ DO LOOP = 1, JPND128
+ HDEFS(LOOP) = TAB128(LOOP)
+ ENDDO
+ NUMDFS = JPND128
+C
+C
+ ELSE IF( NITABLE.EQ.129 ) THEN
+C
+ DO LOOP = 1, JPND129
+ HDEFS(LOOP) = TAB129(LOOP)
+ ENDDO
+ NUMDFS = JPND129
+C
+ ELSE
+C
+C .. other (unspecified)
+C
+ NUMDFS = 0
+C
+ ENDIF
+C
+ ENDIF
+C
+C ------------------------------------------------------------------
+C* Section 4. Read lines in file to see if current parameter
+C is mentioned.
+C ------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ CALL INTLOG(JP_DEBUG,'PDDEFS: Table number = ', NITABLE)
+ CALL INTLOG(JP_DEBUG,'PDDEFS: Number of definitions = ', NUMDFS)
+ CALL INTLOG(JP_DEBUG,'PDDEFS: Parameter number = ', NIPARAM)
+ INEXT = 0
+C
+ 410 CONTINUE
+C
+ INEXT = INEXT + 1
+ IF( INEXT.GT.NUMDFS ) GOTO 900
+ READ(HDEFS(INEXT), 9000) IPARAM, HLSM, HWIND, HPREC, HLSMI
+C
+C If the current parameter, use the values defined in the table.
+C
+ IF( IPARAM.EQ.NIPARAM ) THEN
+C
+ IF( HLSM .EQ.'n' ) LNLSM = .FALSE.
+ IF( HWIND.EQ.'y' ) LNWIND = .TRUE.
+ IF( HPREC.EQ.'y' ) LNPREC = .TRUE.
+ IF( HLSMI.EQ.'y' ) LNSMPAR = .TRUE.
+ GOTO 900
+C
+ ENDIF
+C
+C Go back for next line in the array
+C
+ GOTO 410
+C
+C ------------------------------------------------------------------
+C* Section 9. Closedown.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+C Only change the value if the user has not already set it.
+C
+ IF( .NOT. LSMSET ) THEN
+ IF( NOTSAME(LNLSM,LSM) ) THEN
+ LCHANGE = .TRUE.
+ LSMCHNG = .TRUE.
+ LSM = LNLSM
+ ENDIF
+ ENDIF
+C
+ IF( .NOT. LWINDSET ) THEN
+ IF( NOTSAME(LNWIND,LWIND) ) LCHANGE = .TRUE.
+ LWIND = LNWIND
+ ENDIF
+C
+ IF( .NOT. LPRECSET ) THEN
+ IF( NOTSAME(LNPREC,LPREC) ) LCHANGE = .TRUE.
+ LPREC = LNPREC
+ ENDIF
+C
+ IF( .NOT. LSMPARSET ) THEN
+ IF( NOTSAME(LNSMPAR,LSMPAR) ) LCHANGE = .TRUE.
+ LSMPAR = LNSMPAR
+ ENDIF
+C
+ LPREC = PRECIP()
+C
+ RETURN
+C
+ 920 CONTINUE
+C
+ PDDEFS = JPROUTINE + 1
+ CALL INTLOG(JP_ERROR,'PDDEFS: Error closing file:',JPQUIET)
+ CALL INTLOG(JP_ERROR,FILENAME,JPQUIET)
+ RETURN
+C
+9000 FORMAT( I3,4(5X,A1))
+9001 FORMAT( 1X,I3,4(5X,A1))
+C
+ END
diff --git a/interpolation/ppallow.F b/interpolation/ppallow.F
new file mode 100755
index 0000000..e21a97b
--- /dev/null
+++ b/interpolation/ppallow.F
@@ -0,0 +1,227 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ LOGICAL FUNCTION PPALLOW(NM,SLAT)
+C
+C---->
+C**** PPALLOW
+C
+C Purpose
+C -------
+C
+C
+C ---------
+C
+C LFOUND = PPALLOW(NM,SLAT)
+C
+C
+C Input
+C -----
+C
+C NM - Triangular truncation number of the field..
+C SLAT - Rotation angle (degrees, REAL*8)
+C (degrees, negative => rotate counter-clockwise about the
+C new Z-axis).
+C
+C
+C Output
+C ------
+C
+C Function returns .TRUE. if coefficients are in the list of
+C 'standard' rotations and allowed in mrfs.
+C
+C
+C Method
+C ------
+C
+C Checks a configuration file to find the allowed rotations.
+C This file may have its pathname given by the environment variable
+C PP_ALLOWED_ROTATIONS or may be in a standard directory.
+C Only picks up configuration values on first call.
+C
+C The configuration file is read by Fortran and has format
+C (I4,1X,F8). Eg.
+C
+C 159 -14.0000
+C 319 60.0000
+C 319 -60.0000
+C
+C Externals
+C ---------
+C
+C GETENV - Gets value in an environment variable.
+C INTLOG - Output log message.
+C JDEBUG - Checks environment to switch on/off debug.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF June 2000
+C
+C
+C----<
+C -----------------------------------------------------------------|
+C
+ IMPLICIT NONE
+C
+#include "jparams.h"
+#include "parim.h"
+C
+C Function arguments.
+C
+ INTEGER NM
+ REAL*8 SLAT
+C
+C Parameters.
+C
+ INTEGER JPLIST, JPDEFL
+ PARAMETER (JPLIST = 20 )
+C = number of values which can be read
+C
+ PARAMETER (JPDEFL = 3 )
+C = number of values in default list
+C
+C Local variables.
+C
+ INTEGER FILENM, LOOP, LISTLEN
+ INTEGER NMDEF(JPDEFL), INM(JPLIST)
+ REAL*8 SLATDEF(JPDEFL), XLAT(JPLIST)
+ CHARACTER*256 FILENAME
+ CHARACTER*80 STANDARD
+ CHARACTER*16 HOST
+ LOGICAL LDEBUG, LFOUND
+C
+C Externals
+C
+ DATA NMDEF/159,319,319/, SLATDEF/-14.0,60.0,-60.0/
+ DATA LDEBUG/.FALSE./, LFOUND/.FALSE./
+ DATA FILENM/65/
+C
+ SAVE LDEBUG, LFOUND, INM, XLAT, LISTLEN
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ PPALLOW = .FALSE.
+C
+C Only pick up configuration values on first call
+C
+ IF( LFOUND ) GOTO 400
+C
+ LFOUND = .TRUE.
+C
+ CALL JDEBUG()
+ LDEBUG = NDBG.GT.0
+C
+C -----------------------------------------------------------------|
+C* Section 2. Open the configuration file
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C If the environment variable points to a file, try to open it.
+C Otherwise, get the file from a standard directory.
+C
+ CALL GETENV('PP_ALLOWED_ROTATIONS', FILENAME)
+ IF( FILENAME(1:1).NE.' ' ) THEN
+ IF( LDEBUG) CALL INTLOG(JP_DEBUG,
+ X 'PPALLOW: Trying to open file '//FILENAME,JPQUIET)
+ OPEN( FILENM, FILE=FILENAME, STATUS='OLD', ERR=300)
+C
+ ELSE
+C
+ CALL GETENV('HOST',HOST)
+ IF( HOST(1:7).EQ.'vpp5000') THEN
+ STANDARD = '/vpp5000/mrfs/postproc/pp_allowed_rotations'
+ ELSE IF (HOST(1:7).EQ.'vpp700e') THEN
+ STANDARD = '/vpp700e/mrfs/postproc/pp_allowed_rotations'
+ ELSE IF (HOST(1:6).EQ.'vpp700') THEN
+ STANDARD = '/vpp700/mrfs/postproc/pp_allowed_rotations'
+ ELSE
+ STANDARD = '/home/ma/emos/data/pp_allowed_rotations'
+ ENDIF
+ IF( LDEBUG) CALL INTLOG(JP_DEBUG,
+ X 'PPALLOW: Trying to open file '//STANDARD,JPQUIET)
+ OPEN( FILENM, FILE=STANDARD, STATUS='OLD', ERR=300)
+ ENDIF
+C
+ IF( LDEBUG) CALL INTLOG(JP_DEBUG, 'PPALLOW: Open OK.',JPQUIET)
+ LISTLEN = 0
+C
+ 210 CONTINUE
+C
+ LISTLEN = LISTLEN + 1
+ READ(FILENM,'(I4,1X,F8.4)',END=220) INM(LISTLEN), XLAT(LISTLEN)
+ GOTO 210
+C
+ 220 CONTINUE
+ CLOSE(FILENM)
+ LISTLEN = LISTLEN - 1
+C
+ GOTO 400
+C
+C -----------------------------------------------------------------|
+C* Section 3. Use the internally defined values.
+C -----------------------------------------------------------------|
+C
+ 300 CONTINUE
+C
+ IF( LDEBUG) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'PPALLOW: No configuration file available.',JPQUIET)
+ CALL INTLOG(JP_DEBUG,
+ X 'PPALLOW: Using internally defined values.',JPQUIET)
+ ENDIF
+C
+ DO LOOP = 1, JPDEFL
+ INM(LOOP) = NMDEF(LOOP)
+ XLAT(LOOP) = SLATDEF(LOOP)
+ ENDDO
+ LISTLEN = JPDEFL
+C
+C -----------------------------------------------------------------|
+C* Section 4. Check the current values against the list.
+C -----------------------------------------------------------------|
+C
+ 400 CONTINUE
+C
+ DO LOOP = 1, LISTLEN
+ IF( (NM.EQ.INM(LOOP)).AND.(SLAT.EQ.XLAT(LOOP)) ) THEN
+ IF( LDEBUG) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'PPALLOW: Rotation allowed in mrfs.',JPQUIET)
+ CALL INTLOG(JP_DEBUG, 'PPALLOW: Truncation = ',NM)
+ CALL INTLOGR(JP_DEBUG,'PPALLOW: Rotation = ', SLAT)
+ ENDIF
+ PPALLOW = .TRUE.
+ GOTO 900
+ ENDIF
+ ENDDO
+C
+ IF( LDEBUG ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'PPALLOW: Rotation NOT allowed in mrfs.',JPQUIET)
+ CALL INTLOG(JP_DEBUG, 'PPALLOW: Truncation = ',NM)
+ CALL INTLOGR(JP_DEBUG,'PPALLOW: Rotation = ', SLAT)
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
+
diff --git a/interpolation/precip.F b/interpolation/precip.F
new file mode 100755
index 0000000..aa049b4
--- /dev/null
+++ b/interpolation/precip.F
@@ -0,0 +1,164 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ LOGICAL FUNCTION PRECIP()
+C
+C---->
+C**** PRECIP
+C
+C Purpose
+C -------
+C
+C Determines whether or not the current field is to be
+C considered for 'precipitation' treatment.
+C
+C
+C Interface
+C ---------
+C
+C LPRECIP = PRECIP()
+C
+C Input
+C -----
+C
+C None
+C
+C
+C Output
+C ------
+C
+C Function returns .TRUE. if the field is to be treated as
+C precipitation.
+C
+C
+C Method
+C ------
+C
+C Uses a set of hardcoded rules.
+C
+C
+C Externals
+C ---------
+C
+C INTLOG - Logs messages
+C
+C Uses common blocks nifld.common and nofld.common.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF April 2001
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+C
+C Local variables
+C
+ LOGICAL LIKELY
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initialise
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+C If 'useprecip' has been forced to 'yes' ...
+C
+ IF( LPRECSET ) THEN
+ PRECIP = LPREC
+ GOTO 900
+ ENDIF
+C
+C WMO International table 001 for meteorological parameters
+C
+ IF ( NITABLE.EQ.1 ) THEN
+ LIKELY = ( NIPARAM.EQ.61 ).OR.
+ X ( NIPARAM.EQ.62 ).OR.
+ X ( NIPARAM.EQ.63 ).OR.
+ X ( NIPARAM.EQ.64 ).OR.
+ X ( NIPARAM.EQ.65)
+C
+C ECMWF local code table 128 for meteorological parameters
+C
+ ELSEIF ( (NITABLE.EQ.128).OR.(NITABLE.EQ.129) ) THEN
+ LIKELY = ( NIPARAM.EQ.142 ).OR.
+ X ( NIPARAM.EQ.143 ).OR.
+ X ( NIPARAM.EQ.144 ).OR.
+ X ( NIPARAM.EQ.228 ).OR.
+ X ( NIPARAM.EQ.239 ).OR.
+ X ( NIPARAM.EQ.240 )
+ ELSE
+ LIKELY = .FALSE.
+ ENDIF
+C
+ IF( .NOT.LIKELY ) THEN
+ PRECIP = .FALSE.
+ GOTO 900
+ ENDIF
+C
+C -----------------------------------------------------------------|
+C* Section 2. Work through the special cases
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Monthly forecast means using ECMWF local definition 16
+C
+ IF( NILOCAL.EQ.16 ) THEN
+ PRECIP = .FALSE.
+ GOTO 900
+ ENDIF
+C
+C Extreme forecast index using ECMWF local definition 19
+C
+ IF( NILOCAL.EQ.19 ) THEN
+ PRECIP = .FALSE.
+ GOTO 900
+ ENDIF
+C
+C Coupled Atmospheric, Wave and Ocean models (with hindcast support)
+C using ECMWF local definition 23
+C
+ IF( NILOCAL.EQ.23 ) THEN
+ PRECIP = .FALSE.
+ GOTO 900
+ ENDIF
+C
+C ERA fields using code table 160
+C
+ IF( NITABLE.EQ.160 ) THEN
+ PRECIP = .FALSE.
+ GOTO 900
+ ENDIF
+C
+ PRECIP = .TRUE.
+C
+C -----------------------------------------------------------------|
+C* Section 9. Return
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( .NOT.PRECIP ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'PRECIP: Do not handle field as precipitation', JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'PRECIP: Handle field as precipitation', JPQUIET)
+ ENDIF
+C
+ RETURN
+ END
diff --git a/interpolation/qpassm.F b/interpolation/qpassm.F
new file mode 100755
index 0000000..ccfc0bf
--- /dev/null
+++ b/interpolation/qpassm.F
@@ -0,0 +1,759 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE QPASSM(A,B,C,D,TRIGS,INC1,INC2,INC3,INC4,LOT,N,IFAC,
+ * LA,IERR)
+ DIMENSION A(N),B(N),C(N),D(N),TRIGS(N)
+C
+C---->
+C
+C SUBROUTINE 'QPASSM' - PERFORMS ONE PASS THROUGH DATA AS PART
+C OF MULTIPLE REAL FFT (FOURIER ANALYSIS) ROUTINE
+C
+C A IS FIRST REAL INPUT VECTOR
+C EQUIVALENCE B(1) WITH A(IFAC*LA*INC1+1)
+C C IS FIRST REAL OUTPUT VECTOR
+C EQUIVALENCE D(1) WITH C(LA*INC2+1)
+C TRIGS IS A PRECALCULATED LIST OF SINES & COSINES
+C INC1 IS THE ADDRESSING INCREMENT FOR A
+C INC2 IS THE ADDRESSING INCREMENT FOR C
+C INC3 IS THE INCREMENT BETWEEN INPUT VECTORS A
+C INC4 IS THE INCREMENT BETWEEN OUTPUT VECTORS C
+C LOT IS THE NUMBER OF VECTORS
+C N IS THE LENGTH OF THE VECTORS
+C IFAC IS THE CURRENT FACTOR OF N
+C LA = N/(PRODUCT OF FACTORS USED SO FAR)
+C IERR IS AN ERROR INDICATOR:
+C 0 - PASS COMPLETED WITHOUT ERROR
+C 1 - LOT GREATER THAN 64
+C 2 - IFAC NOT CATERED FOR
+C 3 - IFAC ONLY CATERED FOR IF LA=N/IFAC
+C
+C-----------------------------------------------------------------------
+C----<
+C
+ DATA SIN36/0.587785252292473/,SIN72/0.951056516295154/,
+ * QRT5/0.559016994374947/,SIN60/0.866025403784437/
+C
+ M=N/IFAC
+ IINK=LA*INC1
+ JINK=LA*INC2
+ IJUMP=(IFAC-1)*IINK
+ KSTOP=(N-IFAC)/(2*IFAC)
+C
+ IBAD=1
+ IF (LOT.GT.64) GO TO 910
+ IBASE=0
+ JBASE=0
+ IGO=IFAC-1
+ IF (IGO.EQ.7) IGO=6
+ IBAD=2
+ IF (IGO.LT.1.OR.IGO.GT.6) GO TO 910
+ GO TO (200,300,400,500,600,800),IGO
+C
+C CODING FOR FACTOR 2
+C -------------------
+ 200 CONTINUE
+ IA=1
+ IB=IA+IINK
+ JA=1
+ JB=JA+(2*M-LA)*INC2
+C
+ IF (LA.EQ.M) GO TO 290
+C
+ DO 220 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 210 IJK=1,LOT
+ C(JA+J)=A(IA+I)+A(IB+I)
+ C(JB+J)=A(IA+I)-A(IB+I)
+ I=I+INC3
+ J=J+INC4
+ 210 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 220 CONTINUE
+ JA=JA+JINK
+ JINK=2*JINK
+ JB=JB-JINK
+ IBASE=IBASE+IJUMP
+ IJUMP=2*IJUMP+IINK
+ IF (JA.EQ.JB) GO TO 260
+ DO 250 K=LA,KSTOP,LA
+ KB=K+K
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ JBASE=0
+ DO 240 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 230 IJK=1,LOT
+ C(JA+J)=A(IA+I)+(C1*A(IB+I)+S1*B(IB+I))
+ C(JB+J)=A(IA+I)-(C1*A(IB+I)+S1*B(IB+I))
+ D(JA+J)=(C1*B(IB+I)-S1*A(IB+I))+B(IA+I)
+ D(JB+J)=(C1*B(IB+I)-S1*A(IB+I))-B(IA+I)
+ I=I+INC3
+ J=J+INC4
+ 230 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 240 CONTINUE
+ IBASE=IBASE+IJUMP
+ JA=JA+JINK
+ JB=JB-JINK
+ 250 CONTINUE
+ IF (JA.GT.JB) GO TO 900
+ 260 CONTINUE
+ JBASE=0
+ DO 280 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 270 IJK=1,LOT
+ C(JA+J)=A(IA+I)
+ D(JA+J)=-A(IB+I)
+ I=I+INC3
+ J=J+INC4
+ 270 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 280 CONTINUE
+ GO TO 900
+C
+ 290 CONTINUE
+ Z=1.0/FLOAT(N)
+ DO 294 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 292 IJK=1,LOT
+ C(JA+J)=Z*(A(IA+I)+A(IB+I))
+ C(JB+J)=Z*(A(IA+I)-A(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 292 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 294 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 3
+C -------------------
+ 300 CONTINUE
+ IA=1
+ IB=IA+IINK
+ IC=IB+IINK
+ JA=1
+ JB=JA+(2*M-LA)*INC2
+ JC=JB
+C
+ IF (LA.EQ.M) GO TO 390
+C
+ DO 320 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 310 IJK=1,LOT
+ C(JA+J)=A(IA+I)+(A(IB+I)+A(IC+I))
+ C(JB+J)=A(IA+I)-0.5*(A(IB+I)+A(IC+I))
+ D(JB+J)=SIN60*(A(IC+I)-A(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 310 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 320 CONTINUE
+ JA=JA+JINK
+ JINK=2*JINK
+ JB=JB+JINK
+ JC=JC-JINK
+ IBASE=IBASE+IJUMP
+ IJUMP=2*IJUMP+IINK
+ IF (JA.EQ.JC) GO TO 360
+ DO 350 K=LA,KSTOP,LA
+ KB=K+K
+ KC=KB+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ JBASE=0
+ DO 340 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 330 IJK=1,LOT
+ A1=(C1*A(IB+I)+S1*B(IB+I))+(C2*A(IC+I)+S2*B(IC+I))
+ B1=(C1*B(IB+I)-S1*A(IB+I))+(C2*B(IC+I)-S2*A(IC+I))
+ A2=A(IA+I)-0.5*A1
+ B2=B(IA+I)-0.5*B1
+ A3=SIN60*((C1*A(IB+I)+S1*B(IB+I))-(C2*A(IC+I)+S2*B(IC+I)))
+ B3=SIN60*((C1*B(IB+I)-S1*A(IB+I))-(C2*B(IC+I)-S2*A(IC+I)))
+ C(JA+J)=A(IA+I)+A1
+ D(JA+J)=B(IA+I)+B1
+ C(JB+J)=A2+B3
+ D(JB+J)=B2-A3
+ C(JC+J)=A2-B3
+ D(JC+J)=-(B2+A3)
+ I=I+INC3
+ J=J+INC4
+ 330 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 340 CONTINUE
+ IBASE=IBASE+IJUMP
+ JA=JA+JINK
+ JB=JB+JINK
+ JC=JC-JINK
+ 350 CONTINUE
+ IF (JA.GT.JC) GO TO 900
+ 360 CONTINUE
+ JBASE=0
+ DO 380 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 370 IJK=1,LOT
+ C(JA+J)=A(IA+I)+0.5*(A(IB+I)-A(IC+I))
+ D(JA+J)=-SIN60*(A(IB+I)+A(IC+I))
+ C(JB+J)=A(IA+I)-(A(IB+I)-A(IC+I))
+ I=I+INC3
+ J=J+INC4
+ 370 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 380 CONTINUE
+ GO TO 900
+C
+ 390 CONTINUE
+ Z=1.0/FLOAT(N)
+ ZSIN60=Z*SIN60
+ DO 394 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 392 IJK=1,LOT
+ C(JA+J)=Z*(A(IA+I)+(A(IB+I)+A(IC+I)))
+ C(JB+J)=Z*(A(IA+I)-0.5*(A(IB+I)+A(IC+I)))
+ D(JB+J)=ZSIN60*(A(IC+I)-A(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 392 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 394 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 4
+C -------------------
+ 400 CONTINUE
+ IA=1
+ IB=IA+IINK
+ IC=IB+IINK
+ ID=IC+IINK
+ JA=1
+ JB=JA+(2*M-LA)*INC2
+ JC=JB+2*M*INC2
+ JD=JB
+C
+ IF (LA.EQ.M) GO TO 490
+C
+ DO 420 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 410 IJK=1,LOT
+ C(JA+J)=(A(IA+I)+A(IC+I))+(A(IB+I)+A(ID+I))
+ C(JC+J)=(A(IA+I)+A(IC+I))-(A(IB+I)+A(ID+I))
+ C(JB+J)=A(IA+I)-A(IC+I)
+ D(JB+J)=A(ID+I)-A(IB+I)
+ I=I+INC3
+ J=J+INC4
+ 410 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 420 CONTINUE
+ JA=JA+JINK
+ JINK=2*JINK
+ JB=JB+JINK
+ JC=JC-JINK
+ JD=JD-JINK
+ IBASE=IBASE+IJUMP
+ IJUMP=2*IJUMP+IINK
+ IF (JB.EQ.JC) GO TO 460
+ DO 450 K=LA,KSTOP,LA
+ KB=K+K
+ KC=KB+KB
+ KD=KC+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ C3=TRIGS(KD+1)
+ S3=TRIGS(KD+2)
+ JBASE=0
+ DO 440 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 430 IJK=1,LOT
+ A0=A(IA+I)+(C2*A(IC+I)+S2*B(IC+I))
+ A2=A(IA+I)-(C2*A(IC+I)+S2*B(IC+I))
+ A1=(C1*A(IB+I)+S1*B(IB+I))+(C3*A(ID+I)+S3*B(ID+I))
+ A3=(C1*A(IB+I)+S1*B(IB+I))-(C3*A(ID+I)+S3*B(ID+I))
+ B0=B(IA+I)+(C2*B(IC+I)-S2*A(IC+I))
+ B2=B(IA+I)-(C2*B(IC+I)-S2*A(IC+I))
+ B1=(C1*B(IB+I)-S1*A(IB+I))+(C3*B(ID+I)-S3*A(ID+I))
+ B3=(C1*B(IB+I)-S1*A(IB+I))-(C3*B(ID+I)-S3*A(ID+I))
+ C(JA+J)=A0+A1
+ C(JC+J)=A0-A1
+ D(JA+J)=B0+B1
+ D(JC+J)=B1-B0
+ C(JB+J)=A2+B3
+ C(JD+J)=A2-B3
+ D(JB+J)=B2-A3
+ D(JD+J)=-(B2+A3)
+ I=I+INC3
+ J=J+INC4
+ 430 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 440 CONTINUE
+ IBASE=IBASE+IJUMP
+ JA=JA+JINK
+ JB=JB+JINK
+ JC=JC-JINK
+ JD=JD-JINK
+ 450 CONTINUE
+ IF (JB.GT.JC) GO TO 900
+ 460 CONTINUE
+ SIN45=SQRT(0.5)
+ JBASE=0
+ DO 480 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 470 IJK=1,LOT
+ C(JA+J)=A(IA+I)+SIN45*(A(IB+I)-A(ID+I))
+ C(JB+J)=A(IA+I)-SIN45*(A(IB+I)-A(ID+I))
+ D(JA+J)=-A(IC+I)-SIN45*(A(IB+I)+A(ID+I))
+ D(JB+J)=A(IC+I)-SIN45*(A(IB+I)+A(ID+I))
+ I=I+INC3
+ J=J+INC4
+ 470 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 480 CONTINUE
+ GO TO 900
+C
+ 490 CONTINUE
+ Z=1.0/FLOAT(N)
+ DO 494 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 492 IJK=1,LOT
+ C(JA+J)=Z*((A(IA+I)+A(IC+I))+(A(IB+I)+A(ID+I)))
+ C(JC+J)=Z*((A(IA+I)+A(IC+I))-(A(IB+I)+A(ID+I)))
+ C(JB+J)=Z*(A(IA+I)-A(IC+I))
+ D(JB+J)=Z*(A(ID+I)-A(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 492 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 494 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 5
+C -------------------
+ 500 CONTINUE
+ IA=1
+ IB=IA+IINK
+ IC=IB+IINK
+ ID=IC+IINK
+ IE=ID+IINK
+ JA=1
+ JB=JA+(2*M-LA)*INC2
+ JC=JB+2*M*INC2
+ JD=JC
+ JE=JB
+C
+ IF (LA.EQ.M) GO TO 590
+C
+ DO 520 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 510 IJK=1,LOT
+ A1=A(IB+I)+A(IE+I)
+ A3=A(IB+I)-A(IE+I)
+ A2=A(IC+I)+A(ID+I)
+ A4=A(IC+I)-A(ID+I)
+ A5=A(IA+I)-0.25*(A1+A2)
+ A6=QRT5*(A1-A2)
+ C(JA+J)=A(IA+I)+(A1+A2)
+ C(JB+J)=A5+A6
+ C(JC+J)=A5-A6
+ D(JB+J)=-SIN72*A3-SIN36*A4
+ D(JC+J)=-SIN36*A3+SIN72*A4
+ I=I+INC3
+ J=J+INC4
+ 510 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 520 CONTINUE
+ JA=JA+JINK
+ JINK=2*JINK
+ JB=JB+JINK
+ JC=JC+JINK
+ JD=JD-JINK
+ JE=JE-JINK
+ IBASE=IBASE+IJUMP
+ IJUMP=2*IJUMP+IINK
+ IF (JB.EQ.JD) GO TO 560
+ DO 550 K=LA,KSTOP,LA
+ KB=K+K
+ KC=KB+KB
+ KD=KC+KB
+ KE=KD+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ C3=TRIGS(KD+1)
+ S3=TRIGS(KD+2)
+ C4=TRIGS(KE+1)
+ S4=TRIGS(KE+2)
+ JBASE=0
+ DO 540 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 530 IJK=1,LOT
+ A1=(C1*A(IB+I)+S1*B(IB+I))+(C4*A(IE+I)+S4*B(IE+I))
+ A3=(C1*A(IB+I)+S1*B(IB+I))-(C4*A(IE+I)+S4*B(IE+I))
+ A2=(C2*A(IC+I)+S2*B(IC+I))+(C3*A(ID+I)+S3*B(ID+I))
+ A4=(C2*A(IC+I)+S2*B(IC+I))-(C3*A(ID+I)+S3*B(ID+I))
+ B1=(C1*B(IB+I)-S1*A(IB+I))+(C4*B(IE+I)-S4*A(IE+I))
+ B3=(C1*B(IB+I)-S1*A(IB+I))-(C4*B(IE+I)-S4*A(IE+I))
+ B2=(C2*B(IC+I)-S2*A(IC+I))+(C3*B(ID+I)-S3*A(ID+I))
+ B4=(C2*B(IC+I)-S2*A(IC+I))-(C3*B(ID+I)-S3*A(ID+I))
+ A5=A(IA+I)-0.25*(A1+A2)
+ A6=QRT5*(A1-A2)
+ B5=B(IA+I)-0.25*(B1+B2)
+ B6=QRT5*(B1-B2)
+ A10=A5+A6
+ A20=A5-A6
+ B10=B5+B6
+ B20=B5-B6
+ A11=SIN72*B3+SIN36*B4
+ A21=SIN36*B3-SIN72*B4
+ B11=SIN72*A3+SIN36*A4
+ B21=SIN36*A3-SIN72*A4
+ C(JA+J)=A(IA+I)+(A1+A2)
+ C(JB+J)=A10+A11
+ C(JE+J)=A10-A11
+ C(JC+J)=A20+A21
+ C(JD+J)=A20-A21
+ D(JA+J)=B(IA+I)+(B1+B2)
+ D(JB+J)=B10-B11
+ D(JE+J)=-(B10+B11)
+ D(JC+J)=B20-B21
+ D(JD+J)=-(B20+B21)
+ I=I+INC3
+ J=J+INC4
+ 530 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 540 CONTINUE
+ IBASE=IBASE+IJUMP
+ JA=JA+JINK
+ JB=JB+JINK
+ JC=JC+JINK
+ JD=JD-JINK
+ JE=JE-JINK
+ 550 CONTINUE
+ IF (JB.GT.JD) GO TO 900
+ 560 CONTINUE
+ JBASE=0
+ DO 580 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 570 IJK=1,LOT
+ A1=A(IB+I)+A(IE+I)
+ A3=A(IB+I)-A(IE+I)
+ A2=A(IC+I)+A(ID+I)
+ A4=A(IC+I)-A(ID+I)
+ A5=A(IA+I)+0.25*(A3-A4)
+ A6=QRT5*(A3+A4)
+ C(JA+J)=A5+A6
+ C(JB+J)=A5-A6
+ C(JC+J)=A(IA+I)-(A3-A4)
+ D(JA+J)=-SIN36*A1-SIN72*A2
+ D(JB+J)=-SIN72*A1+SIN36*A2
+ I=I+INC3
+ J=J+INC4
+ 570 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 580 CONTINUE
+ GO TO 900
+C
+ 590 CONTINUE
+ Z=1.0/FLOAT(N)
+ ZQRT5=Z*QRT5
+ ZSIN36=Z*SIN36
+ ZSIN72=Z*SIN72
+ DO 594 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 592 IJK=1,LOT
+ A1=A(IB+I)+A(IE+I)
+ A3=A(IB+I)-A(IE+I)
+ A2=A(IC+I)+A(ID+I)
+ A4=A(IC+I)-A(ID+I)
+ A5=Z*(A(IA+I)-0.25*(A1+A2))
+ A6=ZQRT5*(A1-A2)
+ C(JA+J)=Z*(A(IA+I)+(A1+A2))
+ C(JB+J)=A5+A6
+ C(JC+J)=A5-A6
+ D(JB+J)=-ZSIN72*A3-ZSIN36*A4
+ D(JC+J)=-ZSIN36*A3+ZSIN72*A4
+ I=I+INC3
+ J=J+INC4
+ 592 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 594 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 6
+C -------------------
+ 600 CONTINUE
+ IA=1
+ IB=IA+IINK
+ IC=IB+IINK
+ ID=IC+IINK
+ IE=ID+IINK
+ IF=IE+IINK
+ JA=1
+ JB=JA+(2*M-LA)*INC2
+ JC=JB+2*M*INC2
+ JD=JC+2*M*INC2
+ JE=JC
+ JF=JB
+C
+ IF (LA.EQ.M) GO TO 690
+C
+ DO 620 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 610 IJK=1,LOT
+ A11=(A(IC+I)+A(IF+I))+(A(IB+I)+A(IE+I))
+ C(JA+J)=(A(IA+I)+A(ID+I))+A11
+ C(JC+J)=(A(IA+I)+A(ID+I)-0.5*A11)
+ D(JC+J)=SIN60*((A(IC+I)+A(IF+I))-(A(IB+I)+A(IE+I)))
+ A11=(A(IC+I)-A(IF+I))+(A(IE+I)-A(IB+I))
+ C(JB+J)=(A(IA+I)-A(ID+I))-0.5*A11
+ D(JB+J)=SIN60*((A(IE+I)-A(IB+I))-(A(IC+I)-A(IF+I)))
+ C(JD+J)=(A(IA+I)-A(ID+I))+A11
+ I=I+INC3
+ J=J+INC4
+ 610 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 620 CONTINUE
+ JA=JA+JINK
+ JINK=2*JINK
+ JB=JB+JINK
+ JC=JC+JINK
+ JD=JD-JINK
+ JE=JE-JINK
+ JF=JF-JINK
+ IBASE=IBASE+IJUMP
+ IJUMP=2*IJUMP+IINK
+ IF (JC.EQ.JD) GO TO 660
+ DO 650 K=LA,KSTOP,LA
+ KB=K+K
+ KC=KB+KB
+ KD=KC+KB
+ KE=KD+KB
+ KF=KE+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ C3=TRIGS(KD+1)
+ S3=TRIGS(KD+2)
+ C4=TRIGS(KE+1)
+ S4=TRIGS(KE+2)
+ C5=TRIGS(KF+1)
+ S5=TRIGS(KF+2)
+ JBASE=0
+ DO 640 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 630 IJK=1,LOT
+ A1=C1*A(IB+I)+S1*B(IB+I)
+ B1=C1*B(IB+I)-S1*A(IB+I)
+ A2=C2*A(IC+I)+S2*B(IC+I)
+ B2=C2*B(IC+I)-S2*A(IC+I)
+ A3=C3*A(ID+I)+S3*B(ID+I)
+ B3=C3*B(ID+I)-S3*A(ID+I)
+ A4=C4*A(IE+I)+S4*B(IE+I)
+ B4=C4*B(IE+I)-S4*A(IE+I)
+ A5=C5*A(IF+I)+S5*B(IF+I)
+ B5=C5*B(IF+I)-S5*A(IF+I)
+ A11=(A2+A5)+(A1+A4)
+ A20=(A(IA+I)+A3)-0.5*A11
+ A21=SIN60*((A2+A5)-(A1+A4))
+ B11=(B2+B5)+(B1+B4)
+ B20=(B(IA+I)+B3)-0.5*B11
+ B21=SIN60*((B2+B5)-(B1+B4))
+ C(JA+J)=(A(IA+I)+A3)+A11
+ D(JA+J)=(B(IA+I)+B3)+B11
+ C(JC+J)=A20-B21
+ D(JC+J)=A21+B20
+ C(JE+J)=A20+B21
+ D(JE+J)=A21-B20
+ A11=(A2-A5)+(A4-A1)
+ A20=(A(IA+I)-A3)-0.5*A11
+ A21=SIN60*((A4-A1)-(A2-A5))
+ B11=(B5-B2)-(B4-B1)
+ B20=(B3-B(IA+I))-0.5*B11
+ B21=SIN60*((B5-B2)+(B4-B1))
+ C(JB+J)=A20-B21
+ D(JB+J)=A21-B20
+ C(JD+J)=A11+(A(IA+I)-A3)
+ D(JD+J)=B11+(B3-B(IA+I))
+ C(JF+J)=A20+B21
+ D(JF+J)=A21+B20
+ I=I+INC3
+ J=J+INC4
+ 630 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 640 CONTINUE
+ IBASE=IBASE+IJUMP
+ JA=JA+JINK
+ JB=JB+JINK
+ JC=JC+JINK
+ JD=JD-JINK
+ JE=JE-JINK
+ JF=JF-JINK
+ 650 CONTINUE
+ IF (JC.GT.JD) GO TO 900
+ 660 CONTINUE
+ JBASE=0
+ DO 680 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 670 IJK=1,LOT
+ C(JA+J)=(A(IA+I)+0.5*(A(IC+I)-A(IE+I)))+ SIN60*(A(IB+I)-A(IF+I))
+ D(JA+J)=-(A(ID+I)+0.5*(A(IB+I)+A(IF+I)))-SIN60*(A(IC+I)+A(IE+I))
+ C(JB+J)=A(IA+I)-(A(IC+I)-A(IE+I))
+ D(JB+J)=A(ID+I)-(A(IB+I)+A(IF+I))
+ C(JC+J)=(A(IA+I)+0.5*(A(IC+I)-A(IE+I)))-SIN60*(A(IB+I)-A(IF+I))
+ D(JC+J)=-(A(ID+I)+0.5*(A(IB+I)+A(IF+I)))+SIN60*(A(IC+I)+A(IE+I))
+ I=I+INC3
+ J=J+INC4
+ 670 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 680 CONTINUE
+ GO TO 900
+C
+ 690 CONTINUE
+ Z=1.0/FLOAT(N)
+ ZSIN60=Z*SIN60
+ DO 694 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 692 IJK=1,LOT
+ A11=(A(IC+I)+A(IF+I))+(A(IB+I)+A(IE+I))
+ C(JA+J)=Z*((A(IA+I)+A(ID+I))+A11)
+ C(JC+J)=Z*((A(IA+I)+A(ID+I))-0.5*A11)
+ D(JC+J)=ZSIN60*((A(IC+I)+A(IF+I))-(A(IB+I)+A(IE+I)))
+ A11=(A(IC+I)-A(IF+I))+(A(IE+I)-A(IB+I))
+ C(JB+J)=Z*((A(IA+I)-A(ID+I))-0.5*A11)
+ D(JB+J)=ZSIN60*((A(IE+I)-A(IB+I))-(A(IC+I)-A(IF+I)))
+ C(JD+J)=Z*((A(IA+I)-A(ID+I))+A11)
+ I=I+INC3
+ J=J+INC4
+ 692 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 694 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 8
+C -------------------
+ 800 CONTINUE
+ IBAD=3
+ IF (LA.NE.M) GO TO 910
+ IA=1
+ IB=IA+IINK
+ IC=IB+IINK
+ ID=IC+IINK
+ IE=ID+IINK
+ IF=IE+IINK
+ IG=IF+IINK
+ IH=IG+IINK
+ JA=1
+ JB=JA+LA*INC2
+ JC=JB+2*M*INC2
+ JD=JC+2*M*INC2
+ JE=JD+2*M*INC2
+ Z=1.0/FLOAT(N)
+ ZSIN45=Z*SQRT(0.5)
+C
+ DO 820 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 810 IJK=1,LOT
+ C(JA+J)=Z*(((A(IA+I)+A(IE+I))+(A(IC+I)+A(IG+I)))+
+ * ((A(ID+I)+A(IH+I))+(A(IB+I)+A(IF+I))))
+ C(JE+J)=Z*(((A(IA+I)+A(IE+I))+(A(IC+I)+A(IG+I)))-
+ * ((A(ID+I)+A(IH+I))+(A(IB+I)+A(IF+I))))
+ C(JC+J)=Z*((A(IA+I)+A(IE+I))-(A(IC+I)+A(IG+I)))
+ D(JC+J)=Z*((A(ID+I)+A(IH+I))-(A(IB+I)+A(IF+I)))
+ C(JB+J)=Z*(A(IA+I)-A(IE+I))
+ * +ZSIN45*((A(IH+I)-A(ID+I))-(A(IF+I)-A(IB+I)))
+ C(JD+J)=Z*(A(IA+I)-A(IE+I))
+ * -ZSIN45*((A(IH+I)-A(ID+I))-(A(IF+I)-A(IB+I)))
+ D(JB+J)=ZSIN45*((A(IH+I)-A(ID+I))+(A(IF+I)-A(IB+I)))
+ * +Z*(A(IG+I)-A(IC+I))
+ D(JD+J)=ZSIN45*((A(IH+I)-A(ID+I))+(A(IF+I)-A(IB+I)))
+ * -Z*(A(IG+I)-A(IC+I))
+ I=I+INC3
+ J=J+INC4
+ 810 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 820 CONTINUE
+C
+C RETURN
+C ------
+ 900 CONTINUE
+ IBAD=0
+ 910 CONTINUE
+ IERR=IBAD
+ RETURN
+ END
diff --git a/interpolation/rddefs.c b/interpolation/rddefs.c
new file mode 100755
index 0000000..417a80f
--- /dev/null
+++ b/interpolation/rddefs.c
@@ -0,0 +1,481 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "fortint.h"
+
+#define LINESIZE 80
+#define format 0x666F726D
+#define table 0x7461626C
+#define parameter 0x70617261
+#define truncation 0x7472756E
+#define accuracy 0x61636375
+#define grid 0x67726964
+#define gaussian 0x67617573
+#define area 0x61726561
+#define scan 0x7363616E
+#define reduced 0x72656475
+#define uselsm 0x7573656C
+#define usewind 0x75736577
+#define useprecip 0x75736570
+#define lsm_param 0x6C736D5F
+
+/*
+// defines for FORTRAN subroutine
+*/
+#ifndef CRAY
+#ifdef FORTRAN_NO_UNDERSCORE
+#define CLEAR_C clear_c
+#define IAINIT iainit
+#define INIT_CM init_cm
+#define RDDEFS rddefs
+#else
+#define CLEAR_C clear_c_
+#define IAINIT iainit_
+#define INIT_CM init_cm_
+#define RDDEFS rddefs_
+#endif
+#endif
+
+#define NIFORM 1
+#define NOFORM 2
+#define NITABLE 3
+#define NIPARAM 4
+#define NIRESO 5
+#define NORESO 6
+#define NOACC 7
+#define NIGRID1 8
+#define NIGRID2 9
+#define NOGRID1 10
+#define NOGRID2 11
+#define NIGAUSS 12
+#define NOGAUSS 13
+#define NIAREA1 14
+#define NIAREA2 15
+#define NIAREA3 16
+#define NIAREA4 17
+#define NOAREA1 18
+#define NOAREA2 19
+#define NOAREA3 20
+#define NOAREA4 21
+#define NISCNM 22
+#define NOSCNM 23
+#define LSM 24
+#define LWIND 25
+#define LPREC 26
+#define NIREDU 27
+#define NOREDU 28
+#define LSMPAR 29
+
+/*
+// Prototypes
+*/
+void set_format(char * inputval, char * outputval);
+void set_table(char * inputval, char * outputval);
+void set_parameter(char * inputval, char * outputval);
+void set_truncation(char * inputval, char * outputval);
+void set_accuracy(char * inputval, char * outputval);
+void set_grid(char * inputval, char * outputval);
+void set_gaussian(char * inputval, char * outputval);
+void set_area(char * inputval, char * outputval);
+void set_scan(char * inputval, char * outputval);
+void set_reduced(char * inputval, char * outputval);
+void set_uselsm(char * inputval, char * outputval);
+void set_usewind(char * inputval, char * outputval);
+void set_useprecip(char * inputval, char * outputval);
+void set_lsm_param(char * inputval, char * outputval);
+void INIT_CM( fortint *, fortint *);
+
+fortint RDDEFS()
+{
+/*
+// The file handling is currently not used!
+//
+// char * fallback_defaults_file = "/home/ma/mac/public/gp2gp/request_defaults";
+// char * fallback_defaults_file = "/home/ma/mac/public/gp2gp/no_chance";
+// char * defaults_file;
+*/
+FILE * file;
+int i_status;
+char line[LINESIZE+1];
+char keyword[LINESIZE];
+char inputval[LINESIZE];
+char outputval[LINESIZE];
+int count = 0, i;
+unsigned long code=0;
+int kpr = 0;
+int kerr = 1;
+
+/*
+// Clear the common block
+*/
+ CLEAR_C();
+ IAINIT( &kpr, kerr);
+
+/*
+// The file handling is currently not used!
+//
+// Open the file defining the defaults
+//
+// defaults_file = getenv("REQUEST_DEFAULTS");
+// if( defaults_file == NULL )
+// defaults_file = fallback_defaults_file;
+//
+// file = fopen( defaults_file, "r");
+//
+//
+// If no file, set the defaults here
+*/
+ file = NULL; /* file handling currently not used! */
+ if( file == NULL ) {
+ set_format("grib","grib");
+ set_table("128","");
+ set_parameter("0","");
+ set_area("0/0/0/0","0/0/0/0");
+ set_scan("0","0");
+ return 0;
+ }
+
+/*
+// Ignore the 2 title lines, then a line at a time from the file
+*/
+ while( fgets( line, LINESIZE, file) != NULL ) {
+ count++;
+ if ( count > 2 ) {
+/*
+// Split the line up
+*/
+ i_status = sscanf( line, "%s%s%s", keyword, inputval, outputval);
+ if ( (i_status != 3) && (i_status != EOF ) ) {
+ perror("sscanf failed");
+ exit(1);
+ }
+/*
+// Move first 4 characters of the keyword into the switch variable
+*/
+ for( i = 0; i < 4; i++ )
+ code = ( (code << 8) + *(keyword+i) ) & 0xFFFFFFFF;
+
+/*
+// Handle the keywords individually
+*/
+ switch( code ) {
+
+ case format: set_format(inputval, outputval);
+ break;
+
+ case table: set_table(inputval, outputval);
+ break;
+
+ case parameter: set_parameter(inputval, outputval);
+ break;
+
+ case truncation: set_truncation(inputval, outputval);
+ break;
+
+ case accuracy: set_accuracy(inputval, outputval);
+ break;
+
+ case grid: set_grid(inputval, outputval);
+ break;
+
+ case gaussian: set_gaussian(inputval, outputval);
+ break;
+
+ case area: set_area(inputval, outputval);
+ break;
+
+ case scan: set_scan(inputval, outputval);
+ break;
+
+ case reduced: set_reduced(inputval, outputval);
+ break;
+
+ case uselsm: set_uselsm(inputval, outputval);
+ break;
+
+ case usewind: set_usewind(inputval, outputval);
+ break;
+
+ case useprecip: set_useprecip(inputval, outputval);
+ break;
+
+ case lsm_param: set_lsm_param(inputval, outputval);
+ break;
+
+ default: printf("Invalid code: %x\n", code);
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
+
+void set_format(char * inputval, char * outputval)
+{
+fortint p1, p_1 = 1, p_0 = 0;
+
+ p1 = NIFORM;
+ if ( strcmp( inputval, "grib") == 0 )
+ INIT_CM( &p1, &p_1);
+ else
+ INIT_CM( &p1, &p_0);
+
+ p1 = NOFORM;
+ if ( strcmp( outputval, "grib") == 0 )
+ INIT_CM( &p1, &p_1);
+ else
+ INIT_CM( &p1, &p_0);
+
+ return;
+}
+
+void set_table(char * inputval, char * outputval)
+{
+fortint p1, p2;
+int q2;
+
+ p1 = NITABLE;
+ q2 = atoi( inputval );
+ p2 = (fortint) q2;
+ INIT_CM( &p1, &p2);
+
+ return;
+}
+
+void set_parameter(char * inputval, char * outputval)
+{
+fortint p1, p2;
+int q2;
+
+ p1 = NIPARAM;
+ q2 = atoi( inputval );
+ p2 = (fortint) q2;
+ INIT_CM( &p1, &p2);
+
+ return;
+}
+
+void set_truncation(char * inputval, char * outputval)
+{
+fortint p1, p2;
+int q2;
+
+ p1 = NIRESO;
+ q2 = atoi( inputval );
+ p2 = (fortint) q2;
+ INIT_CM( &p1, &p2);
+
+ p1 = NORESO;
+ q2 = atoi( outputval );
+ p2 = (fortint) q2;
+ INIT_CM( &p1, &p2);
+
+ return;
+}
+
+void set_accuracy(char * inputval, char * outputval)
+{
+fortint p1, p2;
+int q2;
+
+ p1 = NOACC;
+ q2 = atoi( outputval );
+ p2 = (fortint) q2;
+ INIT_CM( &p1, &p2);
+
+ return;
+}
+
+void set_grid(char * inputval, char * outputval)
+{
+fortint p1,p2,p3;
+int q2,q3;
+
+ p1 = NIGRID1;
+ sscanf( inputval, "%d/%d", &q2, &q3);
+ p2 = (fortint) q2;
+ p3 = (fortint) q3;
+ INIT_CM( &p1, &p2);
+
+ p1 = NIGRID2;
+ INIT_CM( &p1, &p3);
+
+ p1 = NOGRID1;
+ sscanf( outputval, "%d/%d", &q2, &q3);
+ p2 = (fortint) q2;
+ p3 = (fortint) q3;
+ INIT_CM( &p1, &p2);
+
+ p1 = NOGRID2;
+ INIT_CM( &p1, &p3);
+
+ return;
+}
+
+void set_gaussian(char * inputval, char * outputval)
+{
+fortint p1, p2;
+int q2;
+
+ p1 = NIGAUSS;
+ q2 = atoi( inputval );
+ p2 = (fortint) q2;
+ INIT_CM( &p1, &p2);
+
+ p1 = NOGAUSS;
+ q2 = atoi( outputval );
+ p2 = (fortint) q2;
+ INIT_CM( &p1, &p2);
+
+ return;
+}
+
+void set_area(char * inputval, char * outputval)
+{
+fortint p1,p2,p3,p4,p5;
+int q2, q3, q4, q5;
+
+ p1 = NIAREA1;
+ sscanf( inputval, "%d/%d/%d/%d", &q2, &q3,&q4,&q5);
+ p2 = (fortint) q2;
+ p3 = (fortint) q3;
+ p4 = (fortint) q4;
+ p5 = (fortint) q5;
+ INIT_CM( &p1, &p2);
+
+ p1 = NIAREA2;
+ INIT_CM( &p1, &p3);
+
+ p1 = NIAREA3;
+ INIT_CM( &p1, &p4);
+
+ p1 = NIAREA4;
+ INIT_CM( &p1, &p5);
+
+ p1 = NOAREA1;
+ sscanf( outputval, "%d/%d/%d/%d", &q2, &q3,&q4,&q5);
+ p2 = (fortint) q2;
+ p3 = (fortint) q3;
+ p4 = (fortint) q4;
+ p5 = (fortint) q5;
+ INIT_CM( &p1, &p2);
+
+ p1 = NOAREA2;
+ INIT_CM( &p1, &p3);
+
+ p1 = NOAREA3;
+ INIT_CM( &p1, &p4);
+
+ p1 = NOAREA4;
+ INIT_CM( &p1, &p5);
+
+ return;
+}
+
+void set_scan(char * inputval, char * outputval)
+{
+fortint p1, p2;
+int q2;
+
+ p1 = NISCNM;
+ q2 = atoi( inputval );
+ p2 = (fortint) q2;
+ INIT_CM( &p1, &p2);
+
+ p1 = NOSCNM;
+ q2 = atoi( outputval );
+ p2 = (fortint) q2;
+ INIT_CM( &p1, &p2);
+
+ return;
+}
+
+void set_reduced(char * inputval, char * outputval)
+{
+fortint p1, p2;
+
+ p1 = NIREDU;
+ if ( strcmp( inputval, "standard" ) == 0 )
+ p2 = 1;
+ else
+ p2 = 0;
+ INIT_CM( &p1, &p2);
+
+ p1 = NOREDU;
+ if ( strcmp( outputval, "standard" ) == 0 )
+ p2 = 1;
+ else
+ p2 = 0;
+ INIT_CM( &p1, &p2);
+
+ return;
+}
+
+void set_uselsm(char * inputval, char * outputval)
+{
+fortint p1, p2;
+
+ p1 = LSM;
+ if ( strcmp( inputval, "yes" ) == 0 )
+ p2 = 1;
+ else
+ p2 = 0;
+ INIT_CM( &p1, &p2);
+
+ return;
+}
+
+void set_usewind(char * inputval, char * outputval)
+{
+fortint p1, p2;
+
+ p1 = LWIND;
+ if ( strcmp( inputval, "yes" ) == 0 )
+ p2 = 1;
+ else
+ p2 = 0;
+ INIT_CM( &p1, &p2);
+
+ return;
+}
+
+void set_useprecip(char * inputval, char * outputval)
+{
+fortint p1, p2;
+
+ p1 = LPREC;
+ if ( strcmp( inputval, "yes" ) == 0 )
+ p2 = 1;
+ else
+ p2 = 0;
+ INIT_CM( &p1, &p2);
+
+ return;
+}
+
+void set_lsm_param(char * inputval, char * outputval)
+{
+fortint p1, p2;
+
+ p1 = LSMPAR;
+ if ( strcmp( inputval, "yes" ) == 0 )
+ p2 = 1;
+ else
+ p2 = 0;
+ INIT_CM( &p1, &p2);
+
+ return;
+}
+
diff --git a/interpolation/rename_unlink.c b/interpolation/rename_unlink.c
new file mode 100755
index 0000000..5282ea2
--- /dev/null
+++ b/interpolation/rename_unlink.c
@@ -0,0 +1,79 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "fortdefs.h"
+
+/*
+// NB. Don't need the versions without underscore, they exist in
+// standard libraries (?!).
+*/
+#define RENAME rename_
+#define UNLINK unlink_
+#define GETPID getpid_
+
+fortint GETPID(void) {
+ return (fortint) getpid();
+}
+
+fortint RENAME( char * oldname, char * newname, int lold, int lnew) {
+char * old, * new;
+fortint status;
+
+ old = (char *) malloc(lold+1);
+ if( old == NULL ) {
+ perror("RENAME: malloc failed for old");
+ return (fortint) -1;
+ }
+ new = (char *) malloc(lnew+1);
+ if( new == NULL ) {
+ perror("RENAME: malloc failed for new");
+ free(old);
+ return (fortint) -1;
+ }
+
+ strncpy(old,oldname,lold);
+ strncpy(new,newname,lnew);
+
+ old[lold] = '\0';
+ new[lold] = '\0';
+
+ status = (fortint) rename(old,new);
+
+ free(old);
+ free(new);
+
+ return status;
+}
+
+fortint UNLINK( char * oldname, int lold) {
+char * old;
+fortint status;
+
+ old = (char *) malloc(lold+1);
+ if( old == NULL ) {
+ perror("UNLINK: malloc failed for old");
+ return (fortint) -1;
+ }
+
+ strncpy(old,oldname,lold);
+ old[lold] = '\0';
+
+ status = (fortint) unlink(old);
+
+ free(old);
+
+ return status;
+}
diff --git a/interpolation/request_defaults b/interpolation/request_defaults
new file mode 100755
index 0000000..c5b9c95
--- /dev/null
+++ b/interpolation/request_defaults
@@ -0,0 +1,11 @@
+Parameter Input Output
+--------- ----- ------
+format grib grib
+area 0/0/0/0 0/0/0/0
+scan 0 0
+table 128 not_applicable
+uselsm parameter_dependent not_applicable
+usewind parameter_dependent not_applicable
+useprecip parameter_dependent not_applicable
+lsm_param parameter_dependent not_applicable
+
diff --git a/interpolation/reset_c.F b/interpolation/reset_c.F
new file mode 100755
index 0000000..a4e15b4
--- /dev/null
+++ b/interpolation/reset_c.F
@@ -0,0 +1,640 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION RESET_C( KSEC1, KSEC2, PSEC2, KSEC4)
+C
+C---->
+C*** RESET_C
+C
+C Purpose
+C -------
+C
+C Reset interpolation common block variables according to the
+C GRIB sections 1, 2 and 4 values.
+C
+C
+C Interface
+C ---------
+C
+C IRET = RESET_C( KSEC1, KSEC2, PSEC2, KSEC4)
+C
+C
+C Input
+C -----
+C
+C KSEC1 - GRIB section 1 array (integers).
+C KSEC2 - GRIB section 2 array (integers).
+C PSEC2 - GRIB section 2 array (reals).
+C KSEC4 - GRIB section 4 array (integers).
+C
+C
+C Externals
+C ---------
+C
+C IGGLAT - Computes gaussian latitudes for a given truncation.
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF August, 1994
+C
+C----<
+C
+ IMPLICIT NONE
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grfixed.h"
+#include "current.h"
+C
+C Function arguments
+C
+ INTEGER KSEC1, KSEC2, KSEC4
+ DIMENSION KSEC1(*), KSEC2(*), KSEC4(*)
+ REAL PSEC2
+ DIMENSION PSEC2(*)
+C
+C Local variables
+C
+ INTEGER JJPR, JJERR, ITEMP
+ INTEGER I, IRET
+ LOGICAL LSAME, LPQUASI
+C
+C Externals
+C
+ INTEGER IGGLAT
+ EXTERNAL IGGLAT
+C
+C-----------------------------------------------------------------------
+C Section 1. Initialise
+C-----------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ RESET_C = 0
+C
+ LPQUASI = ( KSEC2(17).EQ.1 )
+C
+C Section 1, Word 1 - version number of WMO code table
+C
+ IF( NITABLE.NE.KSEC1(1) ) LCHANGE = .TRUE.
+ NITABLE = KSEC1(1)
+ IF( .NOT.LNOTABL ) NOTABLE = NITABLE
+C
+C Section 1, Word 6 - parameter indicator (Code Table 2)
+C
+ NIPARAM = KSEC1(6)
+ IF( .NOT.LNOPARA ) NOPARAM = NIPARAM
+C
+C Section 1, Word 7 - Type of level indicator (Code Table 3)
+C
+ NILEVT = KSEC1(7)
+ IF( .NOT.LNOLEVT ) NOLEVT = NILEVT
+C
+C By default, upper air level does not use land-sea mask.
+C (pressure level, sigma_level, model level, missing level)
+C
+ IF( (NOLEVT.EQ.100) .OR.
+ X (NOLEVT.EQ.108) .OR.
+ X (NOLEVT.EQ.109) .OR.
+ X (NOLEVT.EQ.255) ) THEN
+ LSM = .FALSE.
+ LSMSET = .TRUE.
+ LSMCHNG = .FALSE.
+ ELSE
+ LSM = .TRUE.
+ LSMSET = .FALSE.
+ LSMCHNG = .TRUE.
+ ENDIF
+C
+C Section 1, Word 8 - Height or pressure of level (Code Table 3)
+C
+ NILEVEL = KSEC1(8)
+ IF( .NOT.LNOLEVL ) NOLEVEL = NILEVEL
+C
+C Setup ECMWF local definition number and stream if applicable
+C
+ IF( KSEC1(24).EQ.1 ) THEN
+ NILOCAL = KSEC1(37)
+ NISTREM = KSEC1(40)
+ ELSE
+ NILOCAL = 0
+ NISTREM = 0
+ ENDIF
+C
+C Section 2, Word 1 Data representation type (Code Table 6).
+C
+ IF( NIREPR.NE.KSEC2(1) ) THEN
+ LCHANGE = .TRUE.
+ NIGAUSO = 0
+ HIGAUST = 'X'
+ IF( .NOT.LNOGAUS ) THEN
+ NOGAUSO = 0
+ HOGAUST = 'X'
+ ENDIF
+ ENDIF
+ NIREPR = KSEC2(1)
+ IF( .NOT.LNOREPR ) NOREPR = NIREPR
+C
+C Date of the input field (YYYYMMDD).
+C
+ NIDATE = (KSEC1(21)-1)*1000000
+ X + KSEC1(10)*10000 + KSEC1(11)*100 + KSEC1(12)
+ NODATE = NIDATE
+C
+C Stretching factor (if any)
+C
+ IF( (NIREPR.EQ.JPSTRGG).OR.(NIREPR.EQ.JPSTRSH) ) THEN
+ RISTRET = PSEC2(2)
+ IF( NIREPR.EQ.NOREPR ) THEN
+ IF( NIREPR.EQ.JPSTRGG ) NOREPR = JPGAUSSIAN
+ IF( NIREPR.EQ.JPSTRSH ) NOREPR = JPSPHERE
+ ENDIF
+ IF( NIREPR.EQ.JPSTRGG ) NIREPR = JPGAUSSIAN
+ IF( NIREPR.EQ.JPSTRSH ) NIREPR = JPSPHERE
+ ELSE
+ RISTRET = 0.0
+ ENDIF
+C
+C-----------------------------------------------------------------------
+C Section 2. Latitude/longitude grid or equidistant cylindrical
+C or Plate Carree.
+C-----------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF ( (NIREPR.EQ.JPREGULAR).OR.(NIREPR.EQ.JPREGROT) ) THEN
+C
+C Check if quasi-regular lat/long
+C
+ IF( LPQUASI ) NIREPR = JPREDLL
+ IF( .NOT.LNOREPR ) NOREPR = NIREPR
+C
+ NIRESO = 0
+ NIGAUSS = 0
+C
+C Latitude/longitude grid or equidistant cylindrical
+C or Plate Carree.
+C
+C Section 2, Word 2 Ni - Number of points along a parallel.
+C Section 2, Word 3 Nj - Number of points along a meridian.
+C
+ IF( NIREPR.EQ.JPREDLL ) THEN
+ NIWE = 0
+ ELSE
+ IF( NIWE.NE.KSEC2(2) ) LCHANGE = .TRUE.
+ NIWE = KSEC2(2)
+ ENDIF
+C
+ IF( NINS.NE.KSEC2(3) ) LCHANGE = .TRUE.
+ NINS = KSEC2(3)
+C
+C Section 2, Word 4 La1 - Latitude of first grid point.
+C Section 2, Word 5 Lo1 - Longitude of first grid point.
+C
+ IF( NIAREA(1).NE.(KSEC2(4)*JPMICRO) ) LCHANGE = .TRUE.
+ NIAREA(1) = KSEC2(4) * JPMICRO
+ IF( NIAREA(2).NE.(KSEC2(5)*JPMICRO) ) LCHANGE = .TRUE.
+ NIAREA(2) = KSEC2(5) * JPMICRO
+C
+C Section 2, Word 7 La2 - Latitude of last grid point.
+C Section 2, Word 8 Lo2 - Longitude of last grid point.
+C
+ IF( NIAREA(3).NE.(KSEC2(7)*JPMICRO) ) LCHANGE = .TRUE.
+ NIAREA(3) = KSEC2(7) * JPMICRO
+ IF( NIAREA(4).NE.(KSEC2(8)*JPMICRO) ) LCHANGE = .TRUE.
+ NIAREA(4) = KSEC2(8) * JPMICRO
+C
+C Section 2, Word 9 Di - i direction increment.
+C Section 2, Word 10 Dj - j direction increment.
+C
+ IF( NIREPR.EQ.JPREDLL ) THEN
+ NIGRID(1) = 0
+ ELSE
+ IF( NIGRID(1).NE.(KSEC2(9)*JPMICRO) ) LCHANGE = .TRUE.
+ NIGRID(1) = KSEC2(09) * JPMICRO
+ ENDIF
+C
+ IF( NIGRID(2).NE.(KSEC2(10)*JPMICRO) ) LCHANGE = .TRUE.
+ NIGRID(2) = KSEC2(10) * JPMICRO
+C
+C Section 2, Word 11 Scanning mode flags (Code Table 8).
+C
+ IF( NISCNM.NE.KSEC2(11) ) LCHANGE = .TRUE.
+ NISCNM = KSEC2(11)
+C
+C Pick up regular gaussian grid definition if option 'gaussian'
+C used.
+C
+ IF( NOREPR.EQ.JPNOTYPE ) THEN
+ IF( (NOGAUSO.NE.NOGAUSS).OR.(HOGAUST.NE.'F') ) THEN
+ CALL JGETGG( NOGAUSS, 'F', ROGAUSS, NOLPTS, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'RESET_C: JGETGG failed, NOGAUSS = ',NOGAUSS)
+ RESET_C = IRET
+ GOTO 900
+ ENDIF
+ NOGAUSO = NOGAUSS
+ HOGAUST = 'F'
+ ENDIF
+ NOREPR = JPGAUSSIAN
+ ENDIF
+C
+C If reduced lat/long output and no user specified grid, use
+C input reduced lat/long definition for number of points at
+C each latitude
+C
+ IF( LPQUASI .AND. (.NOT.LNOREPR ) ) THEN
+ NOREDLL = KSEC2(3)
+ NONS = NINS
+ DO 210 I = 1, NINS
+ MILLEN(I) = KSEC2(22 + I)
+ 210 CONTINUE
+ DO 220 I = 1, NONS
+ NOLPTS(I) = MILLEN(I)
+ 220 CONTINUE
+ ENDIF
+C
+C If reduced lat/long input, read input reduced lat/long definition
+C for number of points at each latitude and set east longitude,
+C unless it is a subarea (eg Mediterranean).
+C
+ IF( NIREPR.EQ.JPREDLL ) THEN
+ DO I = 1, NINS
+ MILLEN(I) = KSEC2(22 + I)
+ ENDDO
+C
+C Calculate east longitude if field is global.
+C Use southern latitude to guess if it is ...
+C
+ IF( NIAREA(3).LT.0 ) THEN
+ ITEMP = 36000000 - 36000000/MILLEN(NINS/2)
+ IF( NIAREA(4).NE.ITEMP ) LCHANGE = .TRUE.
+ NIAREA(4) = 36000000 - 36000000/MILLEN(NINS/2)
+ ENDIF
+ ENDIF
+C
+ ENDIF
+C
+C-----------------------------------------------------------------------
+C Section 3. Spherical Harmonic Coefficients.
+C-----------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+ IF( (NIREPR.EQ.JPSPHERE).OR.
+ X (NIREPR.EQ.JPSTRSH).OR.
+ X (NIREPR.EQ.JPSPHROT) ) THEN
+C
+ NIGAUSS = 0
+ NIGRID(1) = 0
+ NIGRID(2) = 0
+C
+C Section 2, Word 2 J - Pentagonal resolution parameter.
+C
+ IF( NIRESO.NE.KSEC2(2) ) LCHANGE = .TRUE.
+ NIRESO = KSEC2(2)
+ IF( .NOT.LNORESO ) THEN
+ IF( NORESO.NE.NIRESO ) LCHANGE = .TRUE.
+ NORESO = NIRESO
+ ENDIF
+C
+C Pick up regular gaussian grid definition if option 'gaussian'
+C used.
+C
+ IF( NOREPR.EQ.JPNOTYPE ) THEN
+ IF( (NOGAUSO.NE.NOGAUSS).OR.(HOGAUST.NE.'F') ) THEN
+ CALL JGETGG( NOGAUSS, 'F', ROGAUSS, NOLPTS, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'RESET_C: JGETGG failed, NOGAUSS = ',NOGAUSS)
+ RESET_C = IRET
+ GOTO 900
+ ENDIF
+ NOGAUSO = NOGAUSS
+ HOGAUST = 'F'
+ ENDIF
+ NOREPR = JPGAUSSIAN
+ ENDIF
+C
+ ENDIF
+C
+C-----------------------------------------------------------------------
+C Section 4. Regular gaussian grid.
+C-----------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+ IF( (NIREPR.EQ.JPGAUSSIAN) .AND. (.NOT.LPQUASI) ) THEN
+C
+ NIRESO = 0
+ NIGRID(1) = 0
+ NIGRID(2) = 0
+C
+C Section 2, Word 2 Ni - Number of points along a parallel.
+C Section 2, Word 3 Nj - Number of points along a meridian.
+C
+ IF( NIWE.NE.KSEC2(2) ) LCHANGE = .TRUE.
+ NIWE = KSEC2(2)
+ IF( NINS.NE.KSEC2(3) ) LCHANGE = .TRUE.
+ NINS = KSEC2(3)
+C
+C Section 2, Word 4 La1 - Latitude of first grid point.
+C Section 2, Word 5 Lo1 - Longitude of first grid point.
+C
+ IF( NIAREA(1).NE.(KSEC2(4)*JPMICRO) ) LCHANGE = .TRUE.
+ NIAREA(1) = KSEC2(4) * JPMICRO
+ IF( NIAREA(2).NE.(KSEC2(5)*JPMICRO) ) LCHANGE = .TRUE.
+ NIAREA(2) = KSEC2(5) * JPMICRO
+C
+C Section 2, Word 7 La2 - Latitude of last grid point.
+C Section 2, Word 8 Lo2 - Longitude of last grid point.
+C
+ IF( NIAREA(3).NE.(KSEC2(7)*JPMICRO) ) LCHANGE = .TRUE.
+ NIAREA(3) = KSEC2(7) * JPMICRO
+ IF( NIAREA(4).NE.(KSEC2(8)*JPMICRO) ) LCHANGE = .TRUE.
+ NIAREA(4) = KSEC2(8) * JPMICRO
+C
+C Section 2, Word 10 N - Number of parallels between Pole and
+C the Equator.
+C
+ IF( NIGAUSS.NE.KSEC2(10) ) LCHANGE = .TRUE.
+ NIGAUSS = KSEC2(10)
+C
+C Pick up gaussian definitions for input grid
+C
+ IF( (NIGAUSO.NE.NIGAUSS).OR.(HIGAUST.NE.'F') ) THEN
+ CALL JGETGG( NIGAUSS, 'F', RIGAUSS, MILLEN, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'RESET_C: JGETGG failed, NIGAUSS = ',NIGAUSS)
+ RESET_C = IRET
+ GOTO 900
+ ENDIF
+ NIGAUSO = NIGAUSS
+ HIGAUST = 'F'
+ ENDIF
+C
+C Use same gaussian number for output unless user has
+C deliberately set a value
+C
+ IF( .NOT.LNOGAUS ) THEN
+ IF( NOGAUSS.NE.NIGAUSS ) LCHANGE = .TRUE.
+ NOGAUSS = NIGAUSS
+ ENDIF
+C
+C Fixup output type if 'gaussian' used to describe output and
+C not 'reduced' or 'regular'.
+C
+ LSAME = (NOREPR.EQ.JPNOTYPE) .AND. (NOGAUSS.EQ.NIGAUSS)
+C
+C Pick up regular gaussian grid definition corresponding
+C to the input field if option 'gaussian' used.
+C
+ IF( (NOREPR.EQ.JPNOTYPE).AND.(.NOT.LSAME) ) THEN
+ IF( (NOGAUSO.NE.NOGAUSS).OR.(HOGAUST.NE.'F') ) THEN
+ CALL JGETGG( NOGAUSS, 'F', ROGAUSS, NOLPTS, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'RESET_C: JGETGG failed, NOGAUSS = ',NOGAUSS)
+ RESET_C = IRET
+ GOTO 900
+ ENDIF
+ NOGAUSO = NOGAUSS
+ HOGAUST = 'F'
+ ENDIF
+ NOREPR = JPGAUSSIAN
+ ENDIF
+C
+C Section 2, Word 11 Scanning mode flags (Code Table 8).
+C
+ IF( NISCNM.NE.KSEC2(11) ) LCHANGE = .TRUE.
+ NISCNM = KSEC2(11)
+C
+ ENDIF
+C
+C-----------------------------------------------------------------------
+C Section 5. Quasi-regular (reduced) gaussian grid.
+C-----------------------------------------------------------------------
+C
+ 500 CONTINUE
+C
+ IF( (NIREPR.EQ.JPGAUSSIAN) .AND. LPQUASI ) THEN
+C
+ NIRESO = 0
+ NIGRID(1) = 0
+ NIGRID(2) = 0
+C
+C Set representation(s) to "quasi-regular gaussian"
+C
+ NIREPR = JPQUASI
+ IF( .NOT.LNOREPR ) NOREPR = NIREPR
+C
+C Section 2, Word 2 Ni - Number of points along a parallel.
+C Cannot be used for quasi-regular grids.
+C Section 2, Word 3 Nj - Number of points along a meridian.
+C
+ IF( NIWE.NE.0 ) LCHANGE = .TRUE.
+ NIWE = 0
+ IF( NINS.NE.KSEC2(3) ) LCHANGE = .TRUE.
+ NINS = KSEC2(3)
+C
+C Section 2, Word 4 La1 - Latitude of first grid point.
+C Section 2, Word 5 Lo1 - Longitude of first grid point.
+C
+ IF( NIAREA(1).NE.(KSEC2(4)*JPMICRO) ) LCHANGE = .TRUE.
+ NIAREA(1) = KSEC2(4) * JPMICRO
+ IF( NIAREA(2).NE.(KSEC2(5)*JPMICRO) ) LCHANGE = .TRUE.
+ NIAREA(2) = KSEC2(5) * JPMICRO
+C
+C Section 2, Word 7 La2 - Latitude of last grid point.
+C Section 2, Word 8 Lo2 - Longitude of last grid point.
+C
+ IF( NIAREA(3).NE.(KSEC2(7)*JPMICRO) ) LCHANGE = .TRUE.
+ NIAREA(3) = KSEC2(7) * JPMICRO
+ IF( NIAREA(4).NE.(KSEC2(8)*JPMICRO) ) LCHANGE = .TRUE.
+ NIAREA(4) = KSEC2(8) * JPMICRO
+C
+C Section 2, Word 10 N - Number of parallels between Pole and
+C the Equator.
+C
+ IF( NIGAUSS.NE.KSEC2(10) ) THEN
+ LCHANGE = .TRUE.
+ JJPR = 1
+ JJERR = 1
+ IRET = IGGLAT( KSEC2(10)*2, RIGAUSS , JJPR, JJERR)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR, 'RESET_C: IGGLAT failed',JPQUIET)
+ RESET_C = IRET
+ GOTO 900
+ ENDIF
+ ENDIF
+ NIGAUSS = KSEC2(10)
+C
+C Fixup output type if 'gaussian' used to describe output and
+C not 'reduced' or 'regular'.
+C
+ LSAME = (NOREPR.EQ.JPNOTYPE) .AND. (NOGAUSS.EQ.NIGAUSS)
+C
+C Pick up regular gaussian grid definition corresponding
+C to the output field if option 'gaussian' used.
+C
+ IF( (NOREPR.EQ.JPNOTYPE).AND.(.NOT.LSAME) ) THEN
+ IF( (NOGAUSO.NE.NOGAUSS).OR.(HOGAUST.NE.'F') ) THEN
+ CALL JGETGG( NOGAUSS, 'F', ROGAUSS, NOLPTS, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'RESET_C: JGETGG failed, NOGAUSS = ',NOGAUSS)
+ RESET_C = IRET
+ GOTO 900
+ ENDIF
+ NOGAUSO = NOGAUSS
+ HOGAUST = 'F'
+ ENDIF
+ NOREPR = JPGAUSSIAN
+ ENDIF
+C
+C Section 2, Word 11 Scanning mode flags (Code Table 8).
+C
+ IF ( NISCNM .NE. KSEC2(11) ) LCHANGE = .TRUE.
+ NISCNM = KSEC2(11)
+C
+C Section 2, Word 23-nn
+C Number of points along each parallel in a quasi-regular grid.
+C Number of parallels is given by Nj above.
+C
+C Pick up gaussian definitions for input grid
+C
+ IF( (NIGAUSO.NE.NIGAUSS).OR.(HIGAUST.NE.'F') ) THEN
+ CALL JGETGG( NIGAUSS, 'F', RIGAUSS, MILLEN, IRET)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'RESET_C: JGETGG failed, NIGAUSS = ',NIGAUSS)
+ RESET_C = IRET
+ GOTO 900
+ ENDIF
+ NIGAUSO = NIGAUSS
+ HIGAUST = 'F'
+ ENDIF
+ DO 510 I = 1, NINS
+ MILLEN(I) = KSEC2(22 + I)
+ 510 CONTINUE
+C
+C Use same grid for output, unless user requested otherwise.
+C
+ IF( (.NOT.LNOGAUS) .OR. LSAME ) THEN
+ IF( NOGAUSS.NE.NIGAUSS ) LCHANGE = .TRUE.
+ NOGAUSS = NIGAUSS
+ NONS = NINS
+ DO 520 I = 1, NONS
+ NOLPTS(I) = MILLEN(I)
+ ROGAUSS(I) = RIGAUSS(I)
+ 520 CONTINUE
+ NOGAUSO = NIGAUSO
+ HOGAUST = HIGAUST
+ ENDIF
+C
+ ENDIF
+C
+C-----------------------------------------------------------------------
+C Section 6. Polar Stereographic grid.
+C-----------------------------------------------------------------------
+C
+ 600 CONTINUE
+C
+ IF ( NIREPR .EQ. 5 ) THEN
+C
+ NIRESO = 0
+ NIGAUSS = 0
+C
+C Section 2, Word 2 Nx - Number of points along X-axis.
+C Section 2, Word 3 Ny - Number of points along Y-axis.
+C
+ IF( NIWE.NE.0 ) LCHANGE = .TRUE.
+ NIWE = KSEC2(2)
+ IF( NINS.NE.KSEC2(3) ) LCHANGE = .TRUE.
+ NINS = KSEC2(3)
+C
+C Section 2, Word 4 La1 - Latitude of first grid point.
+C Section 2, Word 5 Lo1 - Longitude of first grid point.
+C
+ IF( NIAREA(1).NE.(KSEC2(4)*JPMICRO) ) LCHANGE = .TRUE.
+ NIAREA(1) = KSEC2(4) * JPMICRO
+ IF( NIAREA(2).NE.(KSEC2(5)*JPMICRO) ) LCHANGE = .TRUE.
+ NIAREA(2) = KSEC2(5) * JPMICRO
+C
+C Section 2, Word 7 La2 - Latitude of last grid point.
+C Section 2, Word 8 Lo2 - Longitude of last grid point.
+C
+ IF( NIAREA(3).NE.(KSEC2(7)*JPMICRO) ) LCHANGE = .TRUE.
+ NIAREA(3) = KSEC2(7) * JPMICRO
+ IF( NIAREA(4).NE.(KSEC2(8)*JPMICRO) ) LCHANGE = .TRUE.
+ NIAREA(4) = KSEC2(8) * JPMICRO
+C
+C Section 2, Word 9 Dx - X-direction increment.
+C Section 2, Word 10 Dy - Y-direction increment.
+C
+ IF( NIGRID(1).NE.KSEC2(9) ) LCHANGE = .TRUE.
+ NIGRID(1) = KSEC2(09)
+ IF( NIGRID(2).NE.KSEC2(10) ) LCHANGE = .TRUE.
+ NIGRID(2) = KSEC2(10)
+C
+C Section 2, Word 11 Scanning mode flags (Code Table 8).
+C
+ IF( NISCNM.NE.KSEC2(11) ) LCHANGE = .TRUE.
+ NISCNM = KSEC2(11)
+C
+ ENDIF
+C
+C-----------------------------------------------------------------------
+C Section 7. Setup number of bits used for packing ouput.
+C-----------------------------------------------------------------------
+C
+ 700 CONTINUE
+C
+C Section 4, Word 2 - Number of bits used for each packed value.
+C
+C Use same number of bits for packing output values for unless
+C user has deliberately set a value.
+C
+ NIACC = KSEC4(2)
+ IF( .NOT.LNOACC ) THEN
+ IF( NOACC.NE.NIACC ) LCHANGE = .TRUE.
+ NOACC = NIACC
+ ENDIF
+C
+C If default is implied for the output grid, use the input grid
+C
+ IF( ( (NIREPR.EQ.JPREGULAR).OR.
+ X (NIREPR.EQ.JPREDLL) .OR.
+ X (NIREPR.EQ.JPREGROT) ) .AND.
+ X ( (NOREPR.EQ.JPREGULAR).OR.
+ X (NOREPR.EQ.JPREDLL) .OR.
+ X (NOREPR.EQ.JPREGROT) ) .AND.
+ X .NOT.LNOGRID ) THEN
+ NOGRID(1) = NIGRID(1)
+ NOGRID(2) = NIGRID(2)
+ ENDIF
+C
+C-----------------------------------------------------------------------
+C Section 9. Closedown.
+C-----------------------------------------------------------------------
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/rgauss_032.h b/interpolation/rgauss_032.h
new file mode 100755
index 0000000..ecd83a4
--- /dev/null
+++ b/interpolation/rgauss_032.h
@@ -0,0 +1,14 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ REAL QG032(32)
+ DATA QG032/
+ X 20, 27, 36, 40, 45, 50, 60, 64, 72, 75, 80, 90,
+ X 90, 96, 100, 108, 108, 120, 120, 120, 128, 128, 128, 128,
+ X 128, 128, 128, 128, 128, 128, 128, 128 /
diff --git a/interpolation/rgauss_048.h b/interpolation/rgauss_048.h
new file mode 100755
index 0000000..f200688
--- /dev/null
+++ b/interpolation/rgauss_048.h
@@ -0,0 +1,23 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ REAL QG048(48)
+ DATA QG048/
+ X 20, 25, 36, 40,
+ X 45, 50, 60, 60,
+ X 72, 75, 80, 90,
+ X 96, 100, 108, 120,
+ X 120, 120, 128, 135,
+ X 144, 144, 160, 160,
+ X 160, 160, 160, 180,
+ X 180, 180, 180, 180,
+ X 192, 192, 192, 192,
+ X 192, 192, 192, 192,
+ X 192, 192, 192, 192,
+ X 192, 192, 192, 192 /
diff --git a/interpolation/rgauss_064.h b/interpolation/rgauss_064.h
new file mode 100755
index 0000000..88190fa
--- /dev/null
+++ b/interpolation/rgauss_064.h
@@ -0,0 +1,27 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ REAL QG064(64)
+ DATA QG064/
+ X 20, 30, 40, 48,
+ X 54, 64, 72, 80,
+ X 90, 90, 100, 108,
+ X 120, 120, 128, 144,
+ X 144, 144, 150, 160,
+ X 160, 180, 180, 180,
+ X 192, 192, 192, 200,
+ X 200, 216, 216, 216,
+ X 240, 240, 240, 240,
+ X 240, 240, 240, 250,
+ X 250, 250, 250, 256,
+ X 256, 256, 256, 256,
+ X 256, 256, 256, 256,
+ X 256, 256, 256, 256,
+ X 256, 256, 256, 256,
+ X 256, 256, 256, 256 /
diff --git a/interpolation/rgauss_080.h b/interpolation/rgauss_080.h
new file mode 100755
index 0000000..73c645b
--- /dev/null
+++ b/interpolation/rgauss_080.h
@@ -0,0 +1,31 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ REAL QG08018(80)
+ DATA QG08018/
+ X 18 , 25 , 36 , 40,
+ X 45 , 54 , 60 , 64,
+ X 72 , 72 , 80 , 90,
+ X 96 , 100 , 108 , 120,
+ X 120 , 128 , 135 , 144,
+ X 144 , 150 , 160 , 160,
+ X 180 , 180 , 180 , 192,
+ X 192 , 200 , 200 , 216,
+ X 216 , 216 , 225 , 225,
+ X 240 , 240 , 240 , 256,
+ X 256 , 256 , 256 , 288,
+ X 288 , 288 , 288 , 288,
+ X 288 , 288 , 288 , 288,
+ X 300 , 300 , 300 , 300,
+ X 320 , 320 , 320 , 320,
+ X 320 , 320 , 320 , 320,
+ X 320 , 320 , 320 , 320,
+ X 320 , 320 , 320 , 320,
+ X 320 , 320 , 320 , 320,
+ X 320 , 320 , 320 , 320 /
diff --git a/interpolation/rgauss_080_19940113.h b/interpolation/rgauss_080_19940113.h
new file mode 100755
index 0000000..5936c8d
--- /dev/null
+++ b/interpolation/rgauss_080_19940113.h
@@ -0,0 +1,31 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ REAL QG08012(80)
+ DATA QG08012/
+ X 12 , 16 , 20 , 24,
+ X 30 , 36 , 45 , 50,
+ X 60 , 64 , 72 , 75,
+ X 80 , 90 , 96 , 100,
+ X 108 , 120 , 120 , 128,
+ X 128 , 135 , 144 , 144,
+ X 150 , 160 , 162 , 180,
+ X 180 , 180 , 192 , 192,
+ X 192 , 200 , 216 , 216,
+ X 216 , 216 , 225 , 225,
+ X 240 , 240 , 240 , 256,
+ X 256 , 256 , 256 , 288,
+ X 288 , 288 , 288 , 288,
+ X 288 , 288 , 288 , 288,
+ X 288 , 300 , 300 , 300,
+ X 300 , 300 , 320 , 320,
+ X 320 , 320 , 320 , 320,
+ X 320 , 320 , 320 , 320,
+ X 320 , 320 , 320 , 320,
+ X 320 , 320 , 320 , 320 /
diff --git a/interpolation/rgauss_080_19980130.h b/interpolation/rgauss_080_19980130.h
new file mode 100755
index 0000000..73c645b
--- /dev/null
+++ b/interpolation/rgauss_080_19980130.h
@@ -0,0 +1,31 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ REAL QG08018(80)
+ DATA QG08018/
+ X 18 , 25 , 36 , 40,
+ X 45 , 54 , 60 , 64,
+ X 72 , 72 , 80 , 90,
+ X 96 , 100 , 108 , 120,
+ X 120 , 128 , 135 , 144,
+ X 144 , 150 , 160 , 160,
+ X 180 , 180 , 180 , 192,
+ X 192 , 200 , 200 , 216,
+ X 216 , 216 , 225 , 225,
+ X 240 , 240 , 240 , 256,
+ X 256 , 256 , 256 , 288,
+ X 288 , 288 , 288 , 288,
+ X 288 , 288 , 288 , 288,
+ X 300 , 300 , 300 , 300,
+ X 320 , 320 , 320 , 320,
+ X 320 , 320 , 320 , 320,
+ X 320 , 320 , 320 , 320,
+ X 320 , 320 , 320 , 320,
+ X 320 , 320 , 320 , 320,
+ X 320 , 320 , 320 , 320 /
diff --git a/interpolation/rgauss_1024.h b/interpolation/rgauss_1024.h
new file mode 100755
index 0000000..cf36e79
--- /dev/null
+++ b/interpolation/rgauss_1024.h
@@ -0,0 +1,216 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ REAL QG1024(1024)
+ DATA QG1024/
+ X 18, 25, 32, 40, 45,
+ X 50, 60, 64, 72, 72,
+ X 75, 81, 90, 96, 96,
+ X 108, 108, 120, 120, 125,
+ X 125, 135, 144, 150, 160,
+ X 160, 180, 180, 180, 192,
+ X 192, 200, 216, 216, 225,
+ X 225, 240, 240, 243, 250,
+ X 256, 270, 270, 288, 288,
+ X 288, 300, 300, 320, 320,
+ X 320, 360, 360, 360, 360,
+ X 360, 360, 375, 375, 384,
+ X 384, 400, 400, 405, 432,
+ X 432, 432, 432, 450, 450,
+ X 450, 480, 480, 480, 480,
+ X 480, 486, 500, 500, 512,
+ X 512, 540, 540, 540, 540,
+ X 576, 576, 576, 576, 576,
+ X 576, 600, 600, 600, 600,
+ X 625, 625, 625, 625, 640,
+ X 640, 648, 675, 675, 675,
+ X 675, 675, 720, 720, 720,
+ X 720, 720, 720, 720, 729,
+ X 750, 750, 750, 750, 768,
+ X 768, 800, 800, 800, 800,
+ X 800, 800, 810, 864, 864,
+ X 864, 864, 864, 864, 864,
+ X 864, 864, 900, 900, 900,
+ X 900, 900, 900, 960, 960,
+ X 960, 960, 960, 960, 960,
+ X 960, 960, 972, 972, 1000,
+ X 1000, 1000, 1000, 1000, 1024,
+ X 1024, 1024, 1024, 1080, 1080,
+ X 1080, 1080, 1080, 1080, 1080,
+ X 1080, 1080, 1125, 1125, 1125,
+ X 1125, 1125, 1125, 1125, 1152,
+ X 1152, 1152, 1152, 1152, 1200,
+ X 1200, 1200, 1200, 1200, 1200,
+ X 1200, 1215, 1215, 1215, 1250,
+ X 1250, 1250, 1250, 1250, 1250,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1296, 1296, 1350, 1350, 1350,
+ X 1350, 1350, 1350, 1350, 1350,
+ X 1350, 1440, 1440, 1440, 1440,
+ X 1440, 1440, 1440, 1440, 1440,
+ X 1440, 1440, 1440, 1440, 1440,
+ X 1440, 1458, 1458, 1458, 1500,
+ X 1500, 1500, 1500, 1500, 1500,
+ X 1500, 1500, 1536, 1536, 1536,
+ X 1536, 1536, 1536, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1620,
+ X 1620, 1620, 1728, 1728, 1728,
+ X 1728, 1728, 1728, 1728, 1728,
+ X 1728, 1728, 1728, 1728, 1728,
+ X 1728, 1728, 1728, 1728, 1728,
+ X 1728, 1800, 1800, 1800, 1800,
+ X 1800, 1800, 1800, 1800, 1800,
+ X 1800, 1800, 1800, 1875, 1875,
+ X 1875, 1875, 1875, 1875, 1875,
+ X 1875, 1875, 1875, 1875, 1875,
+ X 1875, 1920, 1920, 1920, 1920,
+ X 1920, 1920, 1920, 1920, 1944,
+ X 1944, 1944, 1944, 1944, 2000,
+ X 2000, 2000, 2000, 2000, 2000,
+ X 2000, 2000, 2000, 2000, 2025,
+ X 2025, 2025, 2025, 2048, 2048,
+ X 2048, 2048, 2048, 2160, 2160,
+ X 2160, 2160, 2160, 2160, 2160,
+ X 2160, 2160, 2160, 2160, 2160,
+ X 2160, 2160, 2160, 2160, 2160,
+ X 2160, 2160, 2160, 2187, 2187,
+ X 2187, 2187, 2187, 2250, 2250,
+ X 2250, 2250, 2250, 2250, 2250,
+ X 2250, 2250, 2250, 2250, 2250,
+ X 2304, 2304, 2304, 2304, 2304,
+ X 2304, 2304, 2304, 2304, 2304,
+ X 2400, 2400, 2400, 2400, 2400,
+ X 2400, 2400, 2400, 2400, 2400,
+ X 2400, 2400, 2400, 2400, 2400,
+ X 2400, 2400, 2400, 2400, 2430,
+ X 2430, 2430, 2430, 2430, 2500,
+ X 2500, 2500, 2500, 2500, 2500,
+ X 2500, 2500, 2500, 2500, 2500,
+ X 2500, 2500, 2500, 2500, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2592, 2592, 2592, 2592,
+ X 2592, 2592, 2700, 2700, 2700,
+ X 2700, 2700, 2700, 2700, 2700,
+ X 2700, 2700, 2700, 2700, 2700,
+ X 2700, 2700, 2700, 2700, 2700,
+ X 2700, 2700, 2700, 2700, 2880,
+ X 2880, 2880, 2880, 2880, 2880,
+ X 2880, 2880, 2880, 2880, 2880,
+ X 2880, 2880, 2880, 2880, 2880,
+ X 2880, 2880, 2880, 2880, 2880,
+ X 2880, 2880, 2880, 2880, 2880,
+ X 2880, 2880, 2880, 2880, 2880,
+ X 2880, 2880, 2880, 2880, 2880,
+ X 2880, 2880, 2880, 2916, 2916,
+ X 2916, 2916, 2916, 2916, 2916,
+ X 2916, 3000, 3000, 3000, 3000,
+ X 3000, 3000, 3000, 3000, 3000,
+ X 3000, 3000, 3000, 3000, 3000,
+ X 3000, 3000, 3000, 3000, 3000,
+ X 3072, 3072, 3072, 3072, 3072,
+ X 3072, 3072, 3072, 3072, 3072,
+ X 3072, 3072, 3072, 3072, 3072,
+ X 3072, 3072, 3125, 3125, 3125,
+ X 3125, 3125, 3125, 3125, 3125,
+ X 3125, 3125, 3125, 3125, 3125,
+ X 3200, 3200, 3200, 3200, 3200,
+ X 3200, 3200, 3200, 3200, 3200,
+ X 3200, 3200, 3200, 3200, 3200,
+ X 3200, 3200, 3200, 3240, 3240,
+ X 3240, 3240, 3240, 3240, 3240,
+ X 3240, 3240, 3240, 3375, 3375,
+ X 3375, 3375, 3375, 3375, 3375,
+ X 3375, 3375, 3375, 3375, 3375,
+ X 3375, 3375, 3375, 3375, 3375,
+ X 3375, 3375, 3375, 3375, 3375,
+ X 3375, 3375, 3375, 3375, 3375,
+ X 3375, 3375, 3375, 3375, 3375,
+ X 3375, 3375, 3375, 3375, 3456,
+ X 3456, 3456, 3456, 3456, 3456,
+ X 3456, 3456, 3456, 3456, 3456,
+ X 3456, 3456, 3456, 3456, 3456,
+ X 3456, 3456, 3456, 3456, 3456,
+ X 3456, 3456, 3600, 3600, 3600,
+ X 3600, 3600, 3600, 3600, 3600,
+ X 3600, 3600, 3600, 3600, 3600,
+ X 3600, 3600, 3600, 3600, 3600,
+ X 3600, 3600, 3600, 3600, 3600,
+ X 3600, 3600, 3600, 3600, 3600,
+ X 3600, 3600, 3600, 3600, 3600,
+ X 3600, 3600, 3600, 3600, 3600,
+ X 3600, 3600, 3600, 3600, 3600,
+ X 3600, 3645, 3645, 3645, 3645,
+ X 3645, 3645, 3645, 3645, 3645,
+ X 3645, 3645, 3645, 3645, 3645,
+ X 3645, 3750, 3750, 3750, 3750,
+ X 3750, 3750, 3750, 3750, 3750,
+ X 3750, 3750, 3750, 3750, 3750,
+ X 3750, 3750, 3750, 3750, 3750,
+ X 3750, 3750, 3750, 3750, 3750,
+ X 3750, 3750, 3750, 3750, 3750,
+ X 3750, 3750, 3750, 3750, 3750,
+ X 3750, 3750, 3750, 3750, 3750,
+ X 3840, 3840, 3840, 3840, 3840,
+ X 3840, 3840, 3840, 3840, 3840,
+ X 3840, 3840, 3840, 3840, 3840,
+ X 3840, 3840, 3840, 3840, 3840,
+ X 3840, 3840, 3840, 3840, 3840,
+ X 3840, 3840, 3840, 3840, 3840,
+ X 3840, 3840, 3840, 3840, 3840,
+ X 3840, 3840, 3888, 3888, 3888,
+ X 3888, 3888, 3888, 3888, 3888,
+ X 3888, 3888, 3888, 3888, 3888,
+ X 3888, 3888, 3888, 3888, 3888,
+ X 3888, 3888, 3888, 3888, 4000,
+ X 4000, 4000, 4000, 4000, 4000,
+ X 4000, 4000, 4000, 4000, 4000,
+ X 4000, 4000, 4000, 4000, 4000,
+ X 4000, 4000, 4000, 4000, 4000,
+ X 4000, 4000, 4000, 4000, 4000,
+ X 4000, 4000, 4000, 4000, 4000,
+ X 4000, 4000, 4000, 4000, 4000,
+ X 4000, 4000, 4000, 4000, 4000,
+ X 4000, 4000, 4000, 4000, 4000,
+ X 4000, 4000, 4000, 4000, 4000,
+ X 4000, 4000, 4000, 4000, 4000,
+ X 4000, 4000, 4000, 4000, 4000,
+ X 4000, 4000, 4000, 4000, 4050,
+ X 4050, 4050, 4050, 4050, 4050,
+ X 4050, 4050, 4050, 4050, 4050,
+ X 4050, 4050, 4050, 4050, 4050,
+ X 4050, 4050, 4050, 4050, 4050,
+ X 4050, 4050, 4050, 4050, 4050,
+ X 4050, 4050, 4050, 4050, 4050,
+ X 4050, 4050, 4050, 4050, 4050,
+ X 4050, 4050, 4050, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4096, 4096, 4096 /
diff --git a/interpolation/rgauss_128.h b/interpolation/rgauss_128.h
new file mode 100755
index 0000000..0f9f806
--- /dev/null
+++ b/interpolation/rgauss_128.h
@@ -0,0 +1,43 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ REAL QG128(128)
+ DATA QG128/
+ X 18, 25, 36, 40,
+ X 45, 50, 60, 64,
+ X 72, 72, 80, 90,
+ X 90, 100, 108, 120,
+ X 120, 125, 128, 144,
+ X 144, 150, 160, 160,
+ X 180, 180, 180, 192,
+ X 192, 200, 216, 216,
+ X 216, 225, 240, 240,
+ X 240, 250, 250, 256,
+ X 270, 270, 288, 288,
+ X 288, 300, 300, 320,
+ X 320, 320, 320, 324,
+ X 360, 360, 360, 360,
+ X 360, 360, 360, 375,
+ X 375, 375, 375, 384,
+ X 384, 400, 400, 400,
+ X 400, 405, 432, 432,
+ X 432, 432, 432, 432,
+ X 432, 450, 450, 450,
+ X 450, 450, 480, 480,
+ X 480, 480, 480, 480,
+ X 480, 480, 480, 480,
+ X 486, 486, 486, 500,
+ X 500, 500, 500, 500,
+ X 500, 500, 512, 512,
+ X 512, 512, 512, 512,
+ X 512, 512, 512, 512,
+ X 512, 512, 512, 512,
+ X 512, 512, 512, 512,
+ X 512, 512, 512, 512,
+ X 512, 512, 512, 512 /
diff --git a/interpolation/rgauss_160.h b/interpolation/rgauss_160.h
new file mode 100755
index 0000000..e6be6c1
--- /dev/null
+++ b/interpolation/rgauss_160.h
@@ -0,0 +1,51 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ REAL QG16018(160)
+ DATA QG16018/
+ X 18 , 25 , 36 , 40,
+ X 45 , 50 , 60 , 64,
+ X 72 , 72 , 80 , 90,
+ X 90 , 96 , 108 , 120,
+ X 120 , 125 , 128 , 135,
+ X 144 , 150 , 160 , 160,
+ X 180 , 180 , 180 , 192,
+ X 192 , 200 , 216 , 216,
+ X 225 , 225 , 240 , 240,
+ X 243 , 250 , 256 , 270,
+ X 270 , 288 , 288 , 288,
+ X 300 , 300 , 320 , 320,
+ X 320 , 320 , 324 , 360,
+ X 360 , 360 , 360 , 360,
+ X 360 , 375 , 375 , 375,
+ X 384 , 384 , 400 , 400,
+ X 400 , 405 , 432 , 432,
+ X 432 , 432 , 432 , 450,
+ X 450 , 450 , 450 , 480,
+ X 480 , 480 , 480 , 480,
+ X 480 , 480 , 500 , 500,
+ X 500 , 500 , 500 , 512,
+ X 512 , 540 , 540 , 540,
+ X 540 , 540 , 540 , 540,
+ X 540 , 576 , 576 , 576,
+ X 576 , 576 , 576 , 576,
+ X 576 , 576 , 576 , 600,
+ X 600 , 600 , 600 , 600,
+ X 600 , 600 , 600 , 600,
+ X 640 , 640 , 640 , 640,
+ X 640 , 640 , 640 , 640,
+ X 640 , 640 , 640 , 640,
+ X 640 , 640 , 640 , 640,
+ X 640 , 640 , 640 , 640,
+ X 640 , 640 , 640 , 640,
+ X 640 , 640 , 640 , 640,
+ X 640 , 640 , 640 , 640,
+ X 640 , 640 , 640 , 640,
+ X 640 , 640 , 640 , 640,
+ X 640 , 640 , 640 , 640 /
diff --git a/interpolation/rgauss_160_19931222.h b/interpolation/rgauss_160_19931222.h
new file mode 100755
index 0000000..1b91a79
--- /dev/null
+++ b/interpolation/rgauss_160_19931222.h
@@ -0,0 +1,51 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ REAL QG16012(160)
+ DATA QG16012/
+ X 12 , 16 , 20 , 24,
+ X 30 , 40 , 45 , 50,
+ X 60 , 64 , 72 , 75,
+ X 80 , 90 , 96 , 100,
+ X 108 , 120 , 120 , 128,
+ X 135 , 144 , 144 , 150,
+ X 160 , 160 , 180 , 180,
+ X 180 , 192 , 192 , 200,
+ X 216 , 216 , 216 , 225,
+ X 240 , 240 , 240 , 256,
+ X 256 , 256 , 288 , 288,
+ X 288 , 288 , 288 , 300,
+ X 300 , 300 , 320 , 320,
+ X 320 , 324 , 360 , 360,
+ X 360 , 360 , 360 , 360,
+ X 360 , 375 , 375 , 375,
+ X 384 , 400 , 400 , 400,
+ X 400 , 405 , 432 , 432,
+ X 432 , 432 , 432 , 450,
+ X 450 , 450 , 450 , 480,
+ X 480 , 480 , 480 , 480,
+ X 480 , 480 , 500 , 500,
+ X 500 , 500 , 500 , 512,
+ X 512 , 512 , 540 , 540,
+ X 540 , 540 , 540 , 540,
+ X 540 , 540 , 576 , 576,
+ X 576 , 576 , 576 , 576,
+ X 576 , 576 , 576 , 576,
+ X 576 , 576 , 600 , 600,
+ X 600 , 600 , 600 , 600,
+ X 600 , 600 , 600 , 600,
+ X 640 , 640 , 640 , 640,
+ X 640 , 640 , 640 , 640,
+ X 640 , 640 , 640 , 640,
+ X 640 , 640 , 640 , 640,
+ X 640 , 640 , 640 , 640,
+ X 640 , 640 , 640 , 640,
+ X 640 , 640 , 640 , 640,
+ X 640 , 640 , 640 , 640,
+ X 640 , 640 , 640 , 640 /
diff --git a/interpolation/rgauss_200.h b/interpolation/rgauss_200.h
new file mode 100755
index 0000000..b5f6a6c
--- /dev/null
+++ b/interpolation/rgauss_200.h
@@ -0,0 +1,61 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ REAL QG200(200)
+ DATA QG200/
+ X 18, 25, 36, 40,
+ X 45, 50, 60, 64,
+ X 72, 72, 75, 81,
+ X 90, 96, 100, 108,
+ X 120, 125, 128, 135,
+ X 144, 150, 160, 160,
+ X 180, 180, 180, 192,
+ X 192, 200, 216, 216,
+ X 225, 225, 240, 240,
+ X 243, 250, 256, 270,
+ X 270, 288, 288, 288,
+ X 300, 300, 320, 320,
+ X 320, 320, 360, 360,
+ X 360, 360, 360, 360,
+ X 375, 375, 375, 384,
+ X 400, 400, 400, 400,
+ X 432, 432, 432, 432,
+ X 432, 450, 450, 450,
+ X 480, 480, 480, 480,
+ X 480, 480, 486, 500,
+ X 500, 500, 512, 512,
+ X 512, 540, 540, 540,
+ X 540, 540, 576, 576,
+ X 576, 576, 576, 576,
+ X 576, 576, 600, 600,
+ X 600, 600, 600, 640,
+ X 640, 640, 640, 640,
+ X 640, 640, 640, 640,
+ X 640, 648, 648, 675,
+ X 675, 675, 675, 675,
+ X 675, 675, 720, 720,
+ X 720, 720, 720, 720,
+ X 720, 720, 720, 720,
+ X 720, 720, 720, 720,
+ X 729, 729, 729, 750,
+ X 750, 750, 750, 750,
+ X 750, 750, 750, 768,
+ X 768, 768, 768, 768,
+ X 768, 768, 768, 800,
+ X 800, 800, 800, 800,
+ X 800, 800, 800, 800,
+ X 800, 800, 800, 800,
+ X 800, 800, 800, 800,
+ X 800, 800, 800, 800,
+ X 800, 800, 800, 800,
+ X 800, 800, 800, 800,
+ X 800, 800, 800, 800,
+ X 800, 800, 800, 800,
+ X 800, 800, 800, 800,
+ X 800, 800, 800, 800 /
diff --git a/interpolation/rgauss_2000.h b/interpolation/rgauss_2000.h
new file mode 100755
index 0000000..1517e80
--- /dev/null
+++ b/interpolation/rgauss_2000.h
@@ -0,0 +1,211 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ REAL QG2000(2000)
+ DATA QG2000/
+ X 18, 25, 32, 40, 45, 50, 60, 60, 72, 72,
+ X 75, 81, 90, 96, 96, 108, 108, 120, 120, 120,
+ X 125, 135, 135, 144, 144, 150, 160, 160, 180, 180,
+ X 180, 180, 192, 192, 192, 200, 216, 216, 216, 225,
+ X 240, 240, 243, 250, 256, 270, 270, 288, 300, 300,
+ X 320, 320, 320, 360, 360, 360, 360, 360, 360, 375,
+ X 375, 384, 400, 400, 400, 405, 432, 432, 432, 432,
+ X 450, 450, 450, 480, 480, 480, 480, 486, 500, 500,
+ X 500, 512, 512, 540, 540, 540, 540, 576, 576, 576,
+ X 576, 576, 600, 600, 600, 600, 625, 625, 625, 625,
+ X 640, 640, 640, 648, 675, 675, 675, 675, 720, 720,
+ X 720, 720, 720, 720, 720, 729, 750, 750, 750, 750,
+ X 768, 768, 768, 800, 800, 800, 800, 800, 810, 864,
+ X 864, 864, 864, 864, 864, 864, 864, 864, 900, 900,
+ X 900, 900, 900, 900, 960, 960, 960, 960, 960, 960,
+ X 960, 960, 960, 972, 972, 1000, 1000, 1000, 1000, 1000,
+ X 1024, 1024, 1024, 1080, 1080, 1080, 1080, 1080, 1080, 1080,
+ X 1080, 1080, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1152,
+ X 1152, 1152, 1152, 1152, 1200, 1200, 1200, 1200, 1200, 1200,
+ X 1200, 1215, 1215, 1215, 1250, 1250, 1250, 1250, 1250, 1280,
+ X 1280, 1280, 1280, 1280, 1296, 1296, 1296, 1350, 1350, 1350,
+ X 1350, 1350, 1350, 1350, 1350, 1440, 1440, 1440, 1440, 1440,
+ X 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440,
+ X 1458, 1458, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1536,
+ X 1536, 1536, 1536, 1536, 1536, 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600, 1600, 1620, 1620, 1620, 1728,
+ X 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
+ X 1728, 1728, 1728, 1728, 1728, 1728, 1800, 1800, 1800, 1800,
+ X 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1875, 1875,
+ X 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875,
+ X 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1944, 1944, 1944,
+ X 1944, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ X 2025, 2025, 2025, 2025, 2048, 2048, 2048, 2048, 2160, 2160,
+ X 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160,
+ X 2160, 2160, 2160, 2160, 2160, 2160, 2187, 2187, 2187, 2187,
+ X 2187, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250,
+ X 2250, 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304,
+ X 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400,
+ X 2400, 2400, 2400, 2400, 2400, 2400, 2430, 2430, 2430, 2430,
+ X 2430, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
+ X 2500, 2500, 2500, 2560, 2560, 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2592, 2592, 2592, 2592, 2592, 2700, 2700,
+ X 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ X 2700, 2700, 2700, 2700, 2700, 2700, 2880, 2880, 2880, 2880,
+ X 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880,
+ X 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880,
+ X 2880, 2880, 2880, 2880, 2880, 2880, 2916, 2916, 2916, 2916,
+ X 2916, 2916, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000,
+ X 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3072, 3072, 3072,
+ X 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3125,
+ X 3125, 3125, 3125, 3125, 3125, 3125, 3125, 3125, 3200, 3200,
+ X 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3200,
+ X 3200, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3375, 3375,
+ X 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375,
+ X 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375,
+ X 3375, 3456, 3456, 3456, 3456, 3456, 3456, 3456, 3456, 3456,
+ X 3456, 3456, 3456, 3456, 3456, 3456, 3600, 3600, 3600, 3600,
+ X 3600, 3600, 3600, 3600, 3600, 3600, 3600, 3600, 3600, 3600,
+ X 3600, 3600, 3600, 3600, 3600, 3600, 3600, 3600, 3600, 3600,
+ X 3600, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3750,
+ X 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3750,
+ X 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3840, 3840,
+ X 3840, 3840, 3840, 3840, 3840, 3840, 3840, 3840, 3840, 3840,
+ X 3840, 3840, 3840, 3840, 3888, 3888, 3888, 3888, 3888, 3888,
+ X 3888, 3888, 3888, 4000, 4000, 4000, 4000, 4000, 4000, 4000,
+ X 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000,
+ X 4000, 4000, 4000, 4050, 4050, 4050, 4050, 4050, 4050, 4050,
+ X 4050, 4050, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ X 4096, 4320, 4320, 4320, 4320, 4320, 4320, 4320, 4320, 4320,
+ X 4320, 4320, 4320, 4320, 4320, 4320, 4320, 4320, 4320, 4320,
+ X 4320, 4320, 4320, 4320, 4320, 4320, 4320, 4320, 4320, 4320,
+ X 4320, 4320, 4320, 4320, 4320, 4320, 4320, 4320, 4320, 4320,
+ X 4320, 4320, 4374, 4374, 4374, 4374, 4374, 4374, 4374, 4374,
+ X 4374, 4374, 4500, 4500, 4500, 4500, 4500, 4500, 4500, 4500,
+ X 4500, 4500, 4500, 4500, 4500, 4500, 4500, 4500, 4500, 4500,
+ X 4500, 4500, 4500, 4500, 4500, 4500, 4608, 4608, 4608, 4608,
+ X 4608, 4608, 4608, 4608, 4608, 4608, 4608, 4608, 4608, 4608,
+ X 4608, 4608, 4608, 4608, 4608, 4608, 4608, 4800, 4800, 4800,
+ X 4800, 4800, 4800, 4800, 4800, 4800, 4800, 4800, 4800, 4800,
+ X 4800, 4800, 4800, 4800, 4800, 4800, 4800, 4800, 4800, 4800,
+ X 4800, 4800, 4800, 4800, 4800, 4800, 4800, 4800, 4800, 4800,
+ X 4800, 4800, 4800, 4800, 4800, 4860, 4860, 4860, 4860, 4860,
+ X 4860, 4860, 4860, 4860, 4860, 4860, 4860, 5000, 5000, 5000,
+ X 5000, 5000, 5000, 5000, 5000, 5000, 5000, 5000, 5000, 5000,
+ X 5000, 5000, 5000, 5000, 5000, 5000, 5000, 5000, 5000, 5000,
+ X 5000, 5000, 5000, 5000, 5000, 5120, 5120, 5120, 5120, 5120,
+ X 5120, 5120, 5120, 5120, 5120, 5120, 5120, 5120, 5120, 5120,
+ X 5120, 5120, 5120, 5120, 5120, 5120, 5120, 5120, 5120, 5184,
+ X 5184, 5184, 5184, 5184, 5184, 5184, 5184, 5184, 5184, 5184,
+ X 5184, 5184, 5400, 5400, 5400, 5400, 5400, 5400, 5400, 5400,
+ X 5400, 5400, 5400, 5400, 5400, 5400, 5400, 5400, 5400, 5400,
+ X 5400, 5400, 5400, 5400, 5400, 5400, 5400, 5400, 5400, 5400,
+ X 5400, 5400, 5400, 5400, 5400, 5400, 5400, 5400, 5400, 5400,
+ X 5400, 5400, 5400, 5400, 5400, 5400, 5400, 5400, 5625, 5625,
+ X 5625, 5625, 5625, 5625, 5625, 5625, 5625, 5625, 5625, 5625,
+ X 5625, 5625, 5625, 5625, 5625, 5625, 5625, 5625, 5625, 5625,
+ X 5625, 5625, 5625, 5625, 5625, 5625, 5625, 5625, 5625, 5625,
+ X 5625, 5625, 5625, 5625, 5625, 5625, 5625, 5625, 5625, 5625,
+ X 5625, 5625, 5625, 5625, 5625, 5625, 5625, 5760, 5760, 5760,
+ X 5760, 5760, 5760, 5760, 5760, 5760, 5760, 5760, 5760, 5760,
+ X 5760, 5760, 5760, 5760, 5760, 5760, 5760, 5760, 5760, 5760,
+ X 5760, 5760, 5760, 5760, 5760, 5760, 5760, 5760, 5832, 5832,
+ X 5832, 5832, 5832, 5832, 5832, 5832, 5832, 5832, 5832, 5832,
+ X 5832, 5832, 5832, 5832, 6000, 6000, 6000, 6000, 6000, 6000,
+ X 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000,
+ X 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000,
+ X 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000,
+ X 6000, 6000, 6000, 6075, 6075, 6075, 6075, 6075, 6075, 6075,
+ X 6075, 6075, 6075, 6075, 6075, 6075, 6075, 6075, 6075, 6075,
+ X 6075, 6075, 6144, 6144, 6144, 6144, 6144, 6144, 6144, 6144,
+ X 6144, 6144, 6144, 6144, 6144, 6144, 6144, 6144, 6250, 6250,
+ X 6250, 6250, 6250, 6250, 6250, 6250, 6250, 6250, 6250, 6250,
+ X 6250, 6250, 6250, 6250, 6250, 6250, 6250, 6250, 6250, 6250,
+ X 6250, 6250, 6250, 6250, 6250, 6400, 6400, 6400, 6400, 6400,
+ X 6400, 6400, 6400, 6400, 6400, 6400, 6400, 6400, 6400, 6400,
+ X 6400, 6400, 6400, 6400, 6400, 6400, 6400, 6400, 6400, 6400,
+ X 6400, 6400, 6400, 6400, 6400, 6400, 6400, 6400, 6400, 6400,
+ X 6400, 6400, 6400, 6400, 6480, 6480, 6480, 6480, 6480, 6480,
+ X 6480, 6480, 6480, 6480, 6480, 6480, 6480, 6480, 6480, 6480,
+ X 6480, 6480, 6480, 6480, 6480, 6561, 6561, 6561, 6561, 6561,
+ X 6561, 6561, 6561, 6561, 6561, 6561, 6561, 6561, 6561, 6561,
+ X 6561, 6561, 6561, 6561, 6561, 6561, 6561, 6750, 6750, 6750,
+ X 6750, 6750, 6750, 6750, 6750, 6750, 6750, 6750, 6750, 6750,
+ X 6750, 6750, 6750, 6750, 6750, 6750, 6750, 6750, 6750, 6750,
+ X 6750, 6750, 6750, 6750, 6750, 6750, 6750, 6750, 6750, 6750,
+ X 6750, 6750, 6750, 6750, 6750, 6750, 6750, 6750, 6750, 6750,
+ X 6750, 6750, 6750, 6750, 6750, 6750, 6750, 6750, 6750, 6750,
+ X 6750, 6912, 6912, 6912, 6912, 6912, 6912, 6912, 6912, 6912,
+ X 6912, 6912, 6912, 6912, 6912, 6912, 6912, 6912, 6912, 6912,
+ X 6912, 6912, 6912, 6912, 6912, 6912, 6912, 6912, 6912, 6912,
+ X 6912, 6912, 6912, 6912, 6912, 6912, 6912, 6912, 6912, 6912,
+ X 6912, 6912, 6912, 6912, 6912, 6912, 6912, 6912, 6912, 6912,
+ X 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200,
+ X 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200,
+ X 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200,
+ X 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200,
+ X 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200,
+ X 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200,
+ X 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200,
+ X 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200,
+ X 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200, 7200,
+ X 7200, 7200, 7200, 7200, 7200, 7200, 7290, 7290, 7290, 7290,
+ X 7290, 7290, 7290, 7290, 7290, 7290, 7290, 7290, 7290, 7290,
+ X 7290, 7290, 7290, 7290, 7290, 7290, 7290, 7290, 7290, 7290,
+ X 7290, 7290, 7290, 7290, 7290, 7290, 7290, 7290, 7290, 7500,
+ X 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500,
+ X 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500,
+ X 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500,
+ X 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500,
+ X 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500,
+ X 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500,
+ X 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500,
+ X 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500,
+ X 7500, 7500, 7500, 7500, 7500, 7500, 7680, 7680, 7680, 7680,
+ X 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680,
+ X 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680,
+ X 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680,
+ X 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680,
+ X 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680,
+ X 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680,
+ X 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680,
+ X 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680,
+ X 7680, 7680, 7680, 7680, 7680, 7776, 7776, 7776, 7776, 7776,
+ X 7776, 7776, 7776, 7776, 7776, 7776, 7776, 7776, 7776, 7776,
+ X 7776, 7776, 7776, 7776, 7776, 7776, 7776, 7776, 7776, 7776,
+ X 7776, 7776, 7776, 7776, 7776, 7776, 7776, 7776, 7776, 7776,
+ X 7776, 7776, 7776, 7776, 7776, 7776, 7776, 7776, 7776, 7776,
+ X 7776, 7776, 7776, 7776, 7776, 7776, 7776, 7776, 7776, 7776,
+ X 7776, 7776, 7776, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000,
+ X 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000 /
diff --git a/interpolation/rgauss_256.h b/interpolation/rgauss_256.h
new file mode 100755
index 0000000..752bf89
--- /dev/null
+++ b/interpolation/rgauss_256.h
@@ -0,0 +1,75 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ REAL QG256(256)
+ DATA QG256/
+ X 18, 25, 32, 40,
+ X 45, 50, 60, 64,
+ X 72, 72, 75, 81,
+ X 90, 96, 100, 108,
+ X 120, 120, 125, 135,
+ X 144, 150, 160, 160,
+ X 180, 180, 180, 192,
+ X 192, 200, 216, 216,
+ X 216, 225, 240, 240,
+ X 243, 250, 256, 270,
+ X 270, 288, 288, 288,
+ X 300, 300, 320, 320,
+ X 320, 324, 360, 360,
+ X 360, 360, 360, 360,
+ X 375, 375, 384, 384,
+ X 400, 400, 400, 432,
+ X 432, 432, 432, 432,
+ X 450, 450, 450, 480,
+ X 480, 480, 480, 480,
+ X 486, 500, 500, 500,
+ X 512, 512, 540, 540,
+ X 540, 540, 540, 576,
+ X 576, 576, 576, 576,
+ X 576, 600, 600, 600,
+ X 600, 600, 640, 640,
+ X 640, 640, 640, 640,
+ X 640, 640, 648, 675,
+ X 675, 675, 675, 675,
+ X 675, 720, 720, 720,
+ X 720, 720, 720, 720,
+ X 720, 720, 729, 729,
+ X 750, 750, 750, 750,
+ X 750, 768, 768, 768,
+ X 768, 800, 800, 800,
+ X 800, 800, 800, 800,
+ X 800, 810, 810, 864,
+ X 864, 864, 864, 864,
+ X 864, 864, 864, 864,
+ X 864, 864, 864, 864,
+ X 864, 900, 900, 900,
+ X 900, 900, 900, 900,
+ X 900, 900, 900, 900,
+ X 960, 960, 960, 960,
+ X 960, 960, 960, 960,
+ X 960, 960, 960, 960,
+ X 960, 960, 960, 960,
+ X 960, 960, 960, 960,
+ X 960, 960, 972, 972,
+ X 972, 972, 972, 1000,
+ X 1000, 1000, 1000, 1000,
+ X 1000, 1000, 1000, 1000,
+ X 1000, 1000, 1000, 1000,
+ X 1000, 1000, 1000, 1024,
+ X 1024, 1024, 1024, 1024,
+ X 1024, 1024, 1024, 1024,
+ X 1024, 1024, 1024, 1024,
+ X 1024, 1024, 1024, 1024,
+ X 1024, 1024, 1024, 1024,
+ X 1024, 1024, 1024, 1024,
+ X 1024, 1024, 1024, 1024,
+ X 1024, 1024, 1024, 1024,
+ X 1024, 1024, 1024, 1024,
+ X 1024, 1024, 1024, 1024,
+ X 1024, 1024, 1024, 1024 /
diff --git a/interpolation/rgauss_320.h b/interpolation/rgauss_320.h
new file mode 100755
index 0000000..4b260ee
--- /dev/null
+++ b/interpolation/rgauss_320.h
@@ -0,0 +1,75 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ REAL QG320(320)
+ DATA QG320/
+ X 18, 25, 36, 40, 45,
+ X 50, 60, 64, 72, 72,
+ X 75, 81, 90, 96, 100,
+ X 108, 120, 120, 125, 135,
+ X 144, 144, 150, 160, 180,
+ X 180, 180, 192, 192, 200,
+ X 216, 216, 216, 225, 240,
+ X 240, 240, 250, 256, 270,
+ X 270, 288, 288, 288, 300,
+ X 300, 320, 320, 320, 324,
+ X 360, 360, 360, 360, 360,
+ X 360, 375, 375, 384, 384,
+ X 400, 400, 405, 432, 432,
+ X 432, 432, 450, 450, 450,
+ X 480, 480, 480, 480, 480,
+ X 486, 500, 500, 500, 512,
+ X 512, 540, 540, 540, 540,
+ X 540, 576, 576, 576, 576,
+ X 576, 576, 600, 600, 600,
+ X 600, 640, 640, 640, 640,
+ X 640, 640, 640, 648, 648,
+ X 675, 675, 675, 675, 720,
+ X 720, 720, 720, 720, 720,
+ X 720, 720, 720, 729, 750,
+ X 750, 750, 750, 768, 768,
+ X 768, 768, 800, 800, 800,
+ X 800, 800, 800, 810, 810,
+ X 864, 864, 864, 864, 864,
+ X 864, 864, 864, 864, 864,
+ X 864, 900, 900, 900, 900,
+ X 900, 900, 900, 900, 960,
+ X 960, 960, 960, 960, 960,
+ X 960, 960, 960, 960, 960,
+ X 960, 960, 960, 972, 972,
+ X 1000, 1000, 1000, 1000, 1000,
+ X 1000, 1000, 1000, 1024, 1024,
+ X 1024, 1024, 1024, 1024, 1080,
+ X 1080, 1080, 1080, 1080, 1080,
+ X 1080, 1080, 1080, 1080, 1080,
+ X 1080, 1080, 1080, 1125, 1125,
+ X 1125, 1125, 1125, 1125, 1125,
+ X 1125, 1125, 1125, 1125, 1125,
+ X 1125, 1125, 1152, 1152, 1152,
+ X 1152, 1152, 1152, 1152, 1152,
+ X 1152, 1200, 1200, 1200, 1200,
+ X 1200, 1200, 1200, 1200, 1200,
+ X 1200, 1200, 1200, 1200, 1200,
+ X 1200, 1200, 1200, 1200, 1215,
+ X 1215, 1215, 1215, 1215, 1215,
+ X 1215, 1280, 1280, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280/
diff --git a/interpolation/rgauss_400.h b/interpolation/rgauss_400.h
new file mode 100755
index 0000000..0895628
--- /dev/null
+++ b/interpolation/rgauss_400.h
@@ -0,0 +1,91 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ REAL QG400(400)
+ DATA QG400/
+ X 18, 25, 32, 40, 45,
+ X 50, 60, 60, 72, 72,
+ X 75, 81, 90, 96, 100,
+ X 108, 120, 120, 125, 128,
+ X 144, 144, 150, 160, 160,
+ X 180, 180, 192, 192, 200,
+ X 200, 216, 216, 225, 240,
+ X 240, 240, 250, 250, 256,
+ X 270, 288, 288, 288, 300,
+ X 300, 320, 320, 320, 324,
+ X 360, 360, 360, 360, 360,
+ X 360, 375, 375, 384, 400,
+ X 400, 400, 405, 432, 432,
+ X 432, 432, 450, 450, 450,
+ X 480, 480, 480, 480, 480,
+ X 486, 500, 500, 512, 512,
+ X 540, 540, 540, 540, 540,
+ X 576, 576, 576, 576, 576,
+ X 576, 600, 600, 600, 600,
+ X 640, 640, 640, 640, 640,
+ X 640, 640, 648, 675, 675,
+ X 675, 675, 675, 720, 720,
+ X 720, 720, 720, 720, 720,
+ X 729, 729, 750, 750, 750,
+ X 750, 768, 768, 768, 800,
+ X 800, 800, 800, 800, 800,
+ X 810, 864, 864, 864, 864,
+ X 864, 864, 864, 864, 864,
+ X 864, 900, 900, 900, 900,
+ X 900, 900, 900, 960, 960,
+ X 960, 960, 960, 960, 960,
+ X 960, 960, 960, 960, 960,
+ X 972, 972, 1000, 1000, 1000,
+ X 1000, 1000, 1000, 1024, 1024,
+ X 1024, 1024, 1024, 1080, 1080,
+ X 1080, 1080, 1080, 1080, 1080,
+ X 1080, 1080, 1080, 1080, 1125,
+ X 1125, 1125, 1125, 1125, 1125,
+ X 1125, 1125, 1125, 1152, 1152,
+ X 1152, 1152, 1152, 1152, 1200,
+ X 1200, 1200, 1200, 1200, 1200,
+ X 1200, 1200, 1200, 1200, 1200,
+ X 1215, 1215, 1215, 1215, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1296, 1296, 1296, 1296, 1350,
+ X 1350, 1350, 1350, 1350, 1350,
+ X 1350, 1350, 1350, 1350, 1350,
+ X 1350, 1350, 1350, 1350, 1440,
+ X 1440, 1440, 1440, 1440, 1440,
+ X 1440, 1440, 1440, 1440, 1440,
+ X 1440, 1440, 1440, 1440, 1440,
+ X 1440, 1440, 1440, 1440, 1440,
+ X 1440, 1440, 1440, 1440, 1440,
+ X 1440, 1440, 1458, 1458, 1458,
+ X 1458, 1458, 1458, 1458, 1500,
+ X 1500, 1500, 1500, 1500, 1500,
+ X 1500, 1500, 1500, 1500, 1500,
+ X 1500, 1500, 1500, 1500, 1500,
+ X 1500, 1536, 1536, 1536, 1536,
+ X 1536, 1536, 1536, 1536, 1536,
+ X 1536, 1536, 1536, 1536, 1536,
+ X 1536, 1536, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600 /
diff --git a/interpolation/rgauss_512.h b/interpolation/rgauss_512.h
new file mode 100755
index 0000000..f5b8e03
--- /dev/null
+++ b/interpolation/rgauss_512.h
@@ -0,0 +1,107 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ REAL QG512(512)
+ DATA QG512/
+ X 18, 25, 32, 40, 45,
+ X 50, 60, 60, 72, 72,
+ X 75, 81, 90, 96, 96,
+ X 100, 108, 120, 125, 128,
+ X 135, 144, 150, 160, 160,
+ X 180, 180, 180, 192, 192,
+ X 200, 216, 216, 225, 225,
+ X 240, 240, 243, 250, 256,
+ X 270, 270, 288, 288, 288,
+ X 300, 320, 320, 320, 320,
+ X 360, 360, 360, 360, 360,
+ X 360, 375, 375, 384, 384,
+ X 400, 400, 400, 432, 432,
+ X 432, 432, 450, 450, 450,
+ X 480, 480, 480, 480, 480,
+ X 486, 500, 500, 512, 512,
+ X 540, 540, 540, 540, 540,
+ X 576, 576, 576, 576, 576,
+ X 576, 600, 600, 600, 640,
+ X 640, 640, 640, 640, 640,
+ X 640, 648, 675, 675, 675,
+ X 675, 675, 720, 720, 720,
+ X 720, 720, 720, 720, 729,
+ X 729, 750, 750, 750, 768,
+ X 768, 768, 800, 800, 800,
+ X 800, 800, 800, 810, 864,
+ X 864, 864, 864, 864, 864,
+ X 864, 864, 864, 864, 900,
+ X 900, 900, 900, 900, 900,
+ X 960, 960, 960, 960, 960,
+ X 960, 960, 960, 960, 960,
+ X 960, 972, 972, 1000, 1000,
+ X 1000, 1000, 1000, 1024, 1024,
+ X 1024, 1024, 1080, 1080, 1080,
+ X 1080, 1080, 1080, 1080, 1080,
+ X 1080, 1080, 1125, 1125, 1125,
+ X 1125, 1125, 1125, 1125, 1125,
+ X 1125, 1152, 1152, 1152, 1152,
+ X 1152, 1200, 1200, 1200, 1200,
+ X 1200, 1200, 1200, 1200, 1200,
+ X 1215, 1215, 1215, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1280, 1296, 1296, 1296, 1350,
+ X 1350, 1350, 1350, 1350, 1350,
+ X 1350, 1350, 1350, 1350, 1350,
+ X 1440, 1440, 1440, 1440, 1440,
+ X 1440, 1440, 1440, 1440, 1440,
+ X 1440, 1440, 1440, 1440, 1440,
+ X 1440, 1440, 1440, 1440, 1458,
+ X 1458, 1458, 1458, 1500, 1500,
+ X 1500, 1500, 1500, 1500, 1500,
+ X 1500, 1500, 1500, 1536, 1536,
+ X 1536, 1536, 1536, 1536, 1536,
+ X 1536, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1620, 1620, 1620,
+ X 1620, 1728, 1728, 1728, 1728,
+ X 1728, 1728, 1728, 1728, 1728,
+ X 1728, 1728, 1728, 1728, 1728,
+ X 1728, 1728, 1728, 1728, 1728,
+ X 1728, 1728, 1728, 1728, 1728,
+ X 1728, 1728, 1728, 1728, 1728,
+ X 1728, 1800, 1800, 1800, 1800,
+ X 1800, 1800, 1800, 1800, 1800,
+ X 1800, 1800, 1800, 1800, 1800,
+ X 1800, 1800, 1800, 1800, 1800,
+ X 1800, 1800, 1800, 1875, 1875,
+ X 1875, 1875, 1875, 1875, 1875,
+ X 1875, 1875, 1875, 1875, 1875,
+ X 1875, 1875, 1875, 1875, 1875,
+ X 1875, 1875, 1875, 1875, 1875,
+ X 1875, 1875, 1875, 1875, 1920,
+ X 1920, 1920, 1920, 1920, 1920,
+ X 1920, 1920, 1920, 1920, 1920,
+ X 1920, 1920, 1920, 1920, 1920,
+ X 1920, 1920, 1944, 1944, 1944,
+ X 1944, 1944, 1944, 1944, 1944,
+ X 1944, 1944, 1944, 2000, 2000,
+ X 2000, 2000, 2000, 2000, 2000,
+ X 2000, 2000, 2000, 2000, 2000,
+ X 2000, 2000, 2000, 2000, 2000,
+ X 2000, 2000, 2000, 2000, 2000,
+ X 2000, 2000, 2000, 2000, 2000,
+ X 2000, 2000, 2000, 2000, 2000,
+ X 2025, 2025, 2025, 2025, 2025,
+ X 2025, 2025, 2025, 2025, 2025,
+ X 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2048, 2048,
+ X 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ X 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ X 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ X 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ X 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ X 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ X 2048, 2048 /
diff --git a/interpolation/rgauss_640.h b/interpolation/rgauss_640.h
new file mode 100755
index 0000000..c63253a
--- /dev/null
+++ b/interpolation/rgauss_640.h
@@ -0,0 +1,139 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+ REAL QG640(640)
+ DATA QG640/
+ X 18, 25, 32, 40, 45,
+ X 50, 60, 60, 72, 72,
+ X 75, 81, 90, 90, 96,
+ X 100, 108, 120, 120, 125,
+ X 135, 144, 150, 160, 160,
+ X 180, 180, 180, 192, 192,
+ X 200, 216, 216, 216, 225,
+ X 240, 240, 243, 250, 256,
+ X 270, 270, 288, 288, 288,
+ X 300, 300, 320, 320, 320,
+ X 360, 360, 360, 360, 360,
+ X 360, 375, 375, 384, 384,
+ X 400, 400, 400, 432, 432,
+ X 432, 432, 450, 450, 450,
+ X 480, 480, 480, 480, 480,
+ X 486, 500, 500, 512, 512,
+ X 540, 540, 540, 540, 540,
+ X 576, 576, 576, 576, 576,
+ X 600, 600, 600, 600, 640,
+ X 640, 640, 640, 640, 640,
+ X 640, 648, 675, 675, 675,
+ X 675, 720, 720, 720, 720,
+ X 720, 720, 720, 720, 729,
+ X 750, 750, 750, 750, 768,
+ X 768, 768, 800, 800, 800,
+ X 800, 800, 810, 810, 864,
+ X 864, 864, 864, 864, 864,
+ X 864, 864, 900, 900, 900,
+ X 900, 900, 900, 960, 960,
+ X 960, 960, 960, 960, 960,
+ X 960, 960, 960, 960, 972,
+ X 972, 1000, 1000, 1000, 1000,
+ X 1000, 1024, 1024, 1024, 1024,
+ X 1080, 1080, 1080, 1080, 1080,
+ X 1080, 1080, 1080, 1080, 1125,
+ X 1125, 1125, 1125, 1125, 1125,
+ X 1125, 1125, 1152, 1152, 1152,
+ X 1152, 1152, 1200, 1200, 1200,
+ X 1200, 1200, 1200, 1200, 1200,
+ X 1215, 1215, 1215, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1280, 1280, 1280, 1280, 1280,
+ X 1296, 1296, 1350, 1350, 1350,
+ X 1350, 1350, 1350, 1350, 1350,
+ X 1350, 1350, 1440, 1440, 1440,
+ X 1440, 1440, 1440, 1440, 1440,
+ X 1440, 1440, 1440, 1440, 1440,
+ X 1440, 1440, 1440, 1440, 1458,
+ X 1458, 1458, 1458, 1500, 1500,
+ X 1500, 1500, 1500, 1500, 1500,
+ X 1500, 1536, 1536, 1536, 1536,
+ X 1536, 1536, 1536, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1600, 1600, 1600, 1600,
+ X 1600, 1620, 1620, 1620, 1728,
+ X 1728, 1728, 1728, 1728, 1728,
+ X 1728, 1728, 1728, 1728, 1728,
+ X 1728, 1728, 1728, 1728, 1728,
+ X 1728, 1728, 1728, 1728, 1728,
+ X 1728, 1728, 1800, 1800, 1800,
+ X 1800, 1800, 1800, 1800, 1800,
+ X 1800, 1800, 1800, 1800, 1800,
+ X 1800, 1800, 1875, 1875, 1875,
+ X 1875, 1875, 1875, 1875, 1875,
+ X 1875, 1875, 1875, 1875, 1875,
+ X 1875, 1875, 1875, 1875, 1920,
+ X 1920, 1920, 1920, 1920, 1920,
+ X 1920, 1920, 1920, 1920, 1920,
+ X 1944, 1944, 1944, 1944, 1944,
+ X 2000, 2000, 2000, 2000, 2000,
+ X 2000, 2000, 2000, 2000, 2000,
+ X 2000, 2000, 2000, 2000, 2025,
+ X 2025, 2025, 2025, 2025, 2025,
+ X 2048, 2048, 2048, 2048, 2048,
+ X 2048, 2048, 2160, 2160, 2160,
+ X 2160, 2160, 2160, 2160, 2160,
+ X 2160, 2160, 2160, 2160, 2160,
+ X 2160, 2160, 2160, 2160, 2160,
+ X 2160, 2160, 2160, 2160, 2160,
+ X 2160, 2160, 2160, 2160, 2160,
+ X 2160, 2160, 2187, 2187, 2187,
+ X 2187, 2187, 2187, 2187, 2187,
+ X 2250, 2250, 2250, 2250, 2250,
+ X 2250, 2250, 2250, 2250, 2250,
+ X 2250, 2250, 2250, 2250, 2250,
+ X 2250, 2250, 2250, 2250, 2250,
+ X 2304, 2304, 2304, 2304, 2304,
+ X 2304, 2304, 2304, 2304, 2304,
+ X 2304, 2304, 2304, 2304, 2304,
+ X 2304, 2304, 2304, 2400, 2400,
+ X 2400, 2400, 2400, 2400, 2400,
+ X 2400, 2400, 2400, 2400, 2400,
+ X 2400, 2400, 2400, 2400, 2400,
+ X 2400, 2400, 2400, 2400, 2400,
+ X 2400, 2400, 2400, 2400, 2400,
+ X 2400, 2400, 2400, 2400, 2400,
+ X 2400, 2400, 2400, 2400, 2400,
+ X 2430, 2430, 2430, 2430, 2430,
+ X 2430, 2430, 2430, 2430, 2430,
+ X 2430, 2430, 2430, 2430, 2500,
+ X 2500, 2500, 2500, 2500, 2500,
+ X 2500, 2500, 2500, 2500, 2500,
+ X 2500, 2500, 2500, 2500, 2500,
+ X 2500, 2500, 2500, 2500, 2500,
+ X 2500, 2500, 2500, 2500, 2500,
+ X 2500, 2500, 2500, 2500, 2500,
+ X 2500, 2500, 2500, 2500, 2500,
+ X 2500, 2500, 2500, 2500, 2500,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560,
+ X 2560, 2560, 2560, 2560, 2560 /
diff --git a/interpolation/rpassm.F b/interpolation/rpassm.F
new file mode 100755
index 0000000..9c77db9
--- /dev/null
+++ b/interpolation/rpassm.F
@@ -0,0 +1,749 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE RPASSM(A,B,C,D,TRIGS,INC1,INC2,INC3,INC4,LOT,N,IFAC,
+ * LA,IERR)
+ DIMENSION A(N),B(N),C(N),D(N),TRIGS(N)
+C---->
+C
+C SUBROUTINE 'RPASSM' - PERFORMS ONE PASS THROUGH DATA AS PART
+C OF MULTIPLE REAL FFT (FOURIER SYNTHESIS) ROUTINE
+C
+C A IS FIRST REAL INPUT VECTOR
+C EQUIVALENCE B(1) WITH A (LA*INC1+1)
+C C IS FIRST REAL OUTPUT VECTOR
+C EQUIVALENCE D(1) WITH C(IFAC*LA*INC2+1)
+C TRIGS IS A PRECALCULATED LIST OF SINES & COSINES
+C INC1 IS THE ADDRESSING INCREMENT FOR A
+C INC2 IS THE ADDRESSING INCREMENT FOR C
+C INC3 IS THE INCREMENT BETWEEN INPUT VECTORS A
+C INC4 IS THE INCREMENT BETWEEN OUTPUT VECTORS C
+C LOT IS THE NUMBER OF VECTORS
+C N IS THE LENGTH OF THE VECTORS
+C IFAC IS THE CURRENT FACTOR OF N
+C LA IS THE PRODUCT OF PREVIOUS FACTORS
+C IERR IS AN ERROR INDICATOR:
+C 0 - PASS COMPLETED WITHOUT ERROR
+C 1 - LOT GREATER THAN 64
+C 2 - IFAC NOT CATERED FOR
+C 3 - IFAC ONLY CATERED FOR IF LA=N/IFAC
+C
+C-----------------------------------------------------------------------
+C----<
+C
+ DIMENSION A10(64),A11(64),A20(64),A21(64),
+ * B10(64),B11(64),B20(64),B21(64)
+ DATA SIN36/0.587785252292473/,SIN72/0.951056516295154/,
+ * QRT5/0.559016994374947/,SIN60/0.866025403784437/
+C
+ M=N/IFAC
+ IINK=LA*INC1
+ JINK=LA*INC2
+ JUMP=(IFAC-1)*JINK
+ KSTOP=(N-IFAC)/(2*IFAC)
+C
+ IBAD=1
+ IF (LOT.GT.64) GO TO 910
+ IBASE=0
+ JBASE=0
+ IGO=IFAC-1
+ IF (IGO.EQ.7) IGO=6
+ IBAD=2
+ IF (IGO.LT.1.OR.IGO.GT.6) GO TO 910
+ GO TO (200,300,400,500,600,800),IGO
+C
+C CODING FOR FACTOR 2
+C -------------------
+ 200 CONTINUE
+ IA=1
+ IB=IA+(2*M-LA)*INC1
+ JA=1
+ JB=JA+JINK
+C
+ IF (LA.EQ.M) GO TO 290
+C
+ DO 220 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 210 IJK=1,LOT
+ C(JA+J)=A(IA+I)+A(IB+I)
+ C(JB+J)=A(IA+I)-A(IB+I)
+ I=I+INC3
+ J=J+INC4
+ 210 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 220 CONTINUE
+ IA=IA+IINK
+ IINK=2*IINK
+ IB=IB-IINK
+ IBASE=0
+ JBASE=JBASE+JUMP
+ JUMP=2*JUMP+JINK
+ IF (IA.EQ.IB) GO TO 260
+ DO 250 K=LA,KSTOP,LA
+ KB=K+K
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ IBASE=0
+ DO 240 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 230 IJK=1,LOT
+ C(JA+J)=A(IA+I)+A(IB+I)
+ D(JA+J)=B(IA+I)-B(IB+I)
+ C(JB+J)=C1*(A(IA+I)-A(IB+I))-S1*(B(IA+I)+B(IB+I))
+ D(JB+J)=S1*(A(IA+I)-A(IB+I))+C1*(B(IA+I)+B(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 230 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 240 CONTINUE
+ IA=IA+IINK
+ IB=IB-IINK
+ JBASE=JBASE+JUMP
+ 250 CONTINUE
+ IF (IA.GT.IB) GO TO 900
+ 260 CONTINUE
+ IBASE=0
+ DO 280 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 270 IJK=1,LOT
+ C(JA+J)=A(IA+I)
+ C(JB+J)=-B(IA+I)
+ I=I+INC3
+ J=J+INC4
+ 270 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 280 CONTINUE
+ GO TO 900
+C
+ 290 CONTINUE
+ DO 294 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 292 IJK=1,LOT
+ C(JA+J)=2.0*(A(IA+I)+A(IB+I))
+ C(JB+J)=2.0*(A(IA+I)-A(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 292 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 294 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 3
+C -------------------
+ 300 CONTINUE
+ IA=1
+ IB=IA+(2*M-LA)*INC1
+ IC=IB
+ JA=1
+ JB=JA+JINK
+ JC=JB+JINK
+C
+ IF (LA.EQ.M) GO TO 390
+C
+ DO 320 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 310 IJK=1,LOT
+ C(JA+J)=A(IA+I)+A(IB+I)
+ C(JB+J)=(A(IA+I)-0.5*A(IB+I))-(SIN60*(B(IB+I)))
+ C(JC+J)=(A(IA+I)-0.5*A(IB+I))+(SIN60*(B(IB+I)))
+ I=I+INC3
+ J=J+INC4
+ 310 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 320 CONTINUE
+ IA=IA+IINK
+ IINK=2*IINK
+ IB=IB+IINK
+ IC=IC-IINK
+ JBASE=JBASE+JUMP
+ JUMP=2*JUMP+JINK
+ IF (IA.EQ.IC) GO TO 360
+ DO 350 K=LA,KSTOP,LA
+ KB=K+K
+ KC=KB+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ IBASE=0
+ DO 340 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 330 IJK=1,LOT
+ C(JA+J)=A(IA+I)+(A(IB+I)+A(IC+I))
+ D(JA+J)=B(IA+I)+(B(IB+I)-B(IC+I))
+ C(JB+J)=
+ * C1*((A(IA+I)-0.5*(A(IB+I)+A(IC+I)))-(SIN60*(B(IB+I)+B(IC+I))))
+ * -S1*((B(IA+I)-0.5*(B(IB+I)-B(IC+I)))+(SIN60*(A(IB+I)-A(IC+I))))
+ D(JB+J)=
+ * S1*((A(IA+I)-0.5*(A(IB+I)+A(IC+I)))-(SIN60*(B(IB+I)+B(IC+I))))
+ * +C1*((B(IA+I)-0.5*(B(IB+I)-B(IC+I)))+(SIN60*(A(IB+I)-A(IC+I))))
+ C(JC+J)=
+ * C2*((A(IA+I)-0.5*(A(IB+I)+A(IC+I)))+(SIN60*(B(IB+I)+B(IC+I))))
+ * -S2*((B(IA+I)-0.5*(B(IB+I)-B(IC+I)))-(SIN60*(A(IB+I)-A(IC+I))))
+ D(JC+J)=
+ * S2*((A(IA+I)-0.5*(A(IB+I)+A(IC+I)))+(SIN60*(B(IB+I)+B(IC+I))))
+ * +C2*((B(IA+I)-0.5*(B(IB+I)-B(IC+I)))-(SIN60*(A(IB+I)-A(IC+I))))
+ I=I+INC3
+ J=J+INC4
+ 330 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 340 CONTINUE
+ IA=IA+IINK
+ IB=IB+IINK
+ IC=IC-IINK
+ JBASE=JBASE+JUMP
+ 350 CONTINUE
+ IF (IA.GT.IC) GO TO 900
+ 360 CONTINUE
+ IBASE=0
+ DO 380 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 370 IJK=1,LOT
+ C(JA+J)=A(IA+I)+A(IB+I)
+ C(JB+J)=(0.5*A(IA+I)-A(IB+I))-(SIN60*B(IA+I))
+ C(JC+J)=-(0.5*A(IA+I)-A(IB+I))-(SIN60*B(IA+I))
+ I=I+INC3
+ J=J+INC4
+ 370 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 380 CONTINUE
+ GO TO 900
+C
+ 390 CONTINUE
+ SSIN60=2.0*SIN60
+ DO 394 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 392 IJK=1,LOT
+ C(JA+J)=2.0*(A(IA+I)+A(IB+I))
+ C(JB+J)=(2.0*A(IA+I)-A(IB+I))-(SSIN60*B(IB+I))
+ C(JC+J)=(2.0*A(IA+I)-A(IB+I))+(SSIN60*B(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 392 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 394 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 4
+C -------------------
+ 400 CONTINUE
+ IA=1
+ IB=IA+(2*M-LA)*INC1
+ IC=IB+2*M*INC1
+ ID=IB
+ JA=1
+ JB=JA+JINK
+ JC=JB+JINK
+ JD=JC+JINK
+C
+ IF (LA.EQ.M) GO TO 490
+C
+ DO 420 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 410 IJK=1,LOT
+ C(JA+J)=(A(IA+I)+A(IC+I))+A(IB+I)
+ C(JB+J)=(A(IA+I)-A(IC+I))-B(IB+I)
+ C(JC+J)=(A(IA+I)+A(IC+I))-A(IB+I)
+ C(JD+J)=(A(IA+I)-A(IC+I))+B(IB+I)
+ I=I+INC3
+ J=J+INC4
+ 410 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 420 CONTINUE
+ IA=IA+IINK
+ IINK=2*IINK
+ IB=IB+IINK
+ IC=IC-IINK
+ ID=ID-IINK
+ JBASE=JBASE+JUMP
+ JUMP=2*JUMP+JINK
+ IF (IB.EQ.IC) GO TO 460
+ DO 450 K=LA,KSTOP,LA
+ KB=K+K
+ KC=KB+KB
+ KD=KC+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ C3=TRIGS(KD+1)
+ S3=TRIGS(KD+2)
+ IBASE=0
+ DO 440 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 430 IJK=1,LOT
+ C(JA+J)=(A(IA+I)+A(IC+I))+(A(IB+I)+A(ID+I))
+ D(JA+J)=(B(IA+I)-B(IC+I))+(B(IB+I)-B(ID+I))
+ C(JC+J)=
+ * C2*((A(IA+I)+A(IC+I))-(A(IB+I)+A(ID+I)))
+ * -S2*((B(IA+I)-B(IC+I))-(B(IB+I)-B(ID+I)))
+ D(JC+J)=
+ * S2*((A(IA+I)+A(IC+I))-(A(IB+I)+A(ID+I)))
+ * +C2*((B(IA+I)-B(IC+I))-(B(IB+I)-B(ID+I)))
+ C(JB+J)=
+ * C1*((A(IA+I)-A(IC+I))-(B(IB+I)+B(ID+I)))
+ * -S1*((B(IA+I)+B(IC+I))+(A(IB+I)-A(ID+I)))
+ D(JB+J)=
+ * S1*((A(IA+I)-A(IC+I))-(B(IB+I)+B(ID+I)))
+ * +C1*((B(IA+I)+B(IC+I))+(A(IB+I)-A(ID+I)))
+ C(JD+J)=
+ * C3*((A(IA+I)-A(IC+I))+(B(IB+I)+B(ID+I)))
+ * -S3*((B(IA+I)+B(IC+I))-(A(IB+I)-A(ID+I)))
+ D(JD+J)=
+ * S3*((A(IA+I)-A(IC+I))+(B(IB+I)+B(ID+I)))
+ * +C3*((B(IA+I)+B(IC+I))-(A(IB+I)-A(ID+I)))
+ I=I+INC3
+ J=J+INC4
+ 430 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 440 CONTINUE
+ IA=IA+IINK
+ IB=IB+IINK
+ IC=IC-IINK
+ ID=ID-IINK
+ JBASE=JBASE+JUMP
+ 450 CONTINUE
+ IF (IB.GT.IC) GO TO 900
+ 460 CONTINUE
+ IBASE=0
+ SIN45=SQRT(0.5)
+ DO 480 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 470 IJK=1,LOT
+ C(JA+J)=A(IA+I)+A(IB+I)
+ C(JB+J)=SIN45*((A(IA+I)-A(IB+I))-(B(IA+I)+B(IB+I)))
+ C(JC+J)=B(IB+I)-B(IA+I)
+ C(JD+J)=-SIN45*((A(IA+I)-A(IB+I))+(B(IA+I)+B(IB+I)))
+ I=I+INC3
+ J=J+INC4
+ 470 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 480 CONTINUE
+ GO TO 900
+C
+ 490 CONTINUE
+ DO 494 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 492 IJK=1,LOT
+ C(JA+J)=2.0*((A(IA+I)+A(IC+I))+A(IB+I))
+ C(JB+J)=2.0*((A(IA+I)-A(IC+I))-B(IB+I))
+ C(JC+J)=2.0*((A(IA+I)+A(IC+I))-A(IB+I))
+ C(JD+J)=2.0*((A(IA+I)-A(IC+I))+B(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 492 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 494 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 5
+C -------------------
+ 500 CONTINUE
+ IA=1
+ IB=IA+(2*M-LA)*INC1
+ IC=IB+2*M*INC1
+ ID=IC
+ IE=IB
+ JA=1
+ JB=JA+JINK
+ JC=JB+JINK
+ JD=JC+JINK
+ JE=JD+JINK
+C
+ IF (LA.EQ.M) GO TO 590
+C
+ DO 520 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 510 IJK=1,LOT
+ C(JA+J)=A(IA+I)+(A(IB+I)+A(IC+I))
+ C(JB+J)=((A(IA+I)-0.25*(A(IB+I)+A(IC+I)))+QRT5*(A(IB+I)-A(IC+I)))
+ * -(SIN72*B(IB+I)+SIN36*B(IC+I))
+ C(JC+J)=((A(IA+I)-0.25*(A(IB+I)+A(IC+I)))-QRT5*(A(IB+I)-A(IC+I)))
+ * -(SIN36*B(IB+I)-SIN72*B(IC+I))
+ C(JD+J)=((A(IA+I)-0.25*(A(IB+I)+A(IC+I)))-QRT5*(A(IB+I)-A(IC+I)))
+ * +(SIN36*B(IB+I)-SIN72*B(IC+I))
+ C(JE+J)=((A(IA+I)-0.25*(A(IB+I)+A(IC+I)))+QRT5*(A(IB+I)-A(IC+I)))
+ * +(SIN72*B(IB+I)+SIN36*B(IC+I))
+ I=I+INC3
+ J=J+INC4
+ 510 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 520 CONTINUE
+ IA=IA+IINK
+ IINK=2*IINK
+ IB=IB+IINK
+ IC=IC+IINK
+ ID=ID-IINK
+ IE=IE-IINK
+ JBASE=JBASE+JUMP
+ JUMP=2*JUMP+JINK
+ IF (IB.EQ.ID) GO TO 560
+ DO 550 K=LA,KSTOP,LA
+ KB=K+K
+ KC=KB+KB
+ KD=KC+KB
+ KE=KD+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ C3=TRIGS(KD+1)
+ S3=TRIGS(KD+2)
+ C4=TRIGS(KE+1)
+ S4=TRIGS(KE+2)
+ IBASE=0
+ DO 540 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 530 IJK=1,LOT
+C
+ A10(IJK)=(A(IA+I)-0.25*((A(IB+I)+A(IE+I))+(A(IC+I)+A(ID+I))))
+ * +QRT5*((A(IB+I)+A(IE+I))-(A(IC+I)+A(ID+I)))
+ A20(IJK)=(A(IA+I)-0.25*((A(IB+I)+A(IE+I))+(A(IC+I)+A(ID+I))))
+ * -QRT5*((A(IB+I)+A(IE+I))-(A(IC+I)+A(ID+I)))
+ B10(IJK)=(B(IA+I)-0.25*((B(IB+I)-B(IE+I))+(B(IC+I)-B(ID+I))))
+ * +QRT5*((B(IB+I)-B(IE+I))-(B(IC+I)-B(ID+I)))
+ B20(IJK)=(B(IA+I)-0.25*((B(IB+I)-B(IE+I))+(B(IC+I)-B(ID+I))))
+ * -QRT5*((B(IB+I)-B(IE+I))-(B(IC+I)-B(ID+I)))
+ A11(IJK)=SIN72*(B(IB+I)+B(IE+I))+SIN36*(B(IC+I)+B(ID+I))
+ A21(IJK)=SIN36*(B(IB+I)+B(IE+I))-SIN72*(B(IC+I)+B(ID+I))
+ B11(IJK)=SIN72*(A(IB+I)-A(IE+I))+SIN36*(A(IC+I)-A(ID+I))
+ B21(IJK)=SIN36*(A(IB+I)-A(IE+I))-SIN72*(A(IC+I)-A(ID+I))
+C
+ C(JA+J)=A(IA+I)+((A(IB+I)+A(IE+I))+(A(IC+I)+A(ID+I)))
+ D(JA+J)=B(IA+I)+((B(IB+I)-B(IE+I))+(B(IC+I)-B(ID+I)))
+ C(JB+J)=C1*(A10(IJK)-A11(IJK))-S1*(B10(IJK)+B11(IJK))
+ D(JB+J)=S1*(A10(IJK)-A11(IJK))+C1*(B10(IJK)+B11(IJK))
+ C(JE+J)=C4*(A10(IJK)+A11(IJK))-S4*(B10(IJK)-B11(IJK))
+ D(JE+J)=S4*(A10(IJK)+A11(IJK))+C4*(B10(IJK)-B11(IJK))
+ C(JC+J)=C2*(A20(IJK)-A21(IJK))-S2*(B20(IJK)+B21(IJK))
+ D(JC+J)=S2*(A20(IJK)-A21(IJK))+C2*(B20(IJK)+B21(IJK))
+ C(JD+J)=C3*(A20(IJK)+A21(IJK))-S3*(B20(IJK)-B21(IJK))
+ D(JD+J)=S3*(A20(IJK)+A21(IJK))+C3*(B20(IJK)-B21(IJK))
+C
+ I=I+INC3
+ J=J+INC4
+ 530 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 540 CONTINUE
+ IA=IA+IINK
+ IB=IB+IINK
+ IC=IC+IINK
+ ID=ID-IINK
+ IE=IE-IINK
+ JBASE=JBASE+JUMP
+ 550 CONTINUE
+ IF (IB.GT.ID) GO TO 900
+ 560 CONTINUE
+ IBASE=0
+ DO 580 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 570 IJK=1,LOT
+ C(JA+J)=(A(IA+I)+A(IB+I))+A(IC+I)
+ C(JB+J)=(QRT5*(A(IA+I)-A(IB+I))+(0.25*(A(IA+I)+A(IB+I))-A(IC+I)))
+ * -(SIN36*B(IA+I)+SIN72*B(IB+I))
+ C(JE+J)=-(QRT5*(A(IA+I)-A(IB+I))+(0.25*(A(IA+I)+A(IB+I))-A(IC+I)))
+ * -(SIN36*B(IA+I)+SIN72*B(IB+I))
+ C(JC+J)=(QRT5*(A(IA+I)-A(IB+I))-(0.25*(A(IA+I)+A(IB+I))-A(IC+I)))
+ * -(SIN72*B(IA+I)-SIN36*B(IB+I))
+ C(JD+J)=-(QRT5*(A(IA+I)-A(IB+I))-(0.25*(A(IA+I)+A(IB+I))-A(IC+I)))
+ * -(SIN72*B(IA+I)-SIN36*B(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 570 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 580 CONTINUE
+ GO TO 900
+C
+ 590 CONTINUE
+ QQRT5=2.0*QRT5
+ SSIN36=2.0*SIN36
+ SSIN72=2.0*SIN72
+ DO 594 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 592 IJK=1,LOT
+ C(JA+J)=2.0*(A(IA+I)+(A(IB+I)+A(IC+I)))
+ C(JB+J)=(2.0*(A(IA+I)-0.25*(A(IB+I)+A(IC+I)))
+ * +QQRT5*(A(IB+I)-A(IC+I)))-(SSIN72*B(IB+I)+SSIN36*B(IC+I))
+ C(JC+J)=(2.0*(A(IA+I)-0.25*(A(IB+I)+A(IC+I)))
+ * -QQRT5*(A(IB+I)-A(IC+I)))-(SSIN36*B(IB+I)-SSIN72*B(IC+I))
+ C(JD+J)=(2.0*(A(IA+I)-0.25*(A(IB+I)+A(IC+I)))
+ * -QQRT5*(A(IB+I)-A(IC+I)))+(SSIN36*B(IB+I)-SSIN72*B(IC+I))
+ C(JE+J)=(2.0*(A(IA+I)-0.25*(A(IB+I)+A(IC+I)))
+ * +QQRT5*(A(IB+I)-A(IC+I)))+(SSIN72*B(IB+I)+SSIN36*B(IC+I))
+ I=I+INC3
+ J=J+INC4
+ 592 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 594 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 6
+C -------------------
+ 600 CONTINUE
+ IA=1
+ IB=IA+(2*M-LA)*INC1
+ IC=IB+2*M*INC1
+ ID=IC+2*M*INC1
+ IE=IC
+ IF=IB
+ JA=1
+ JB=JA+JINK
+ JC=JB+JINK
+ JD=JC+JINK
+ JE=JD+JINK
+ JF=JE+JINK
+C
+ IF (LA.EQ.M) GO TO 690
+C
+ DO 620 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 610 IJK=1,LOT
+ C(JA+J)=(A(IA+I)+A(ID+I))+(A(IB+I)+A(IC+I))
+ C(JD+J)=(A(IA+I)-A(ID+I))-(A(IB+I)-A(IC+I))
+ C(JB+J)=((A(IA+I)-A(ID+I))+0.5*(A(IB+I)-A(IC+I)))
+ * -(SIN60*(B(IB+I)+B(IC+I)))
+ C(JF+J)=((A(IA+I)-A(ID+I))+0.5*(A(IB+I)-A(IC+I)))
+ * +(SIN60*(B(IB+I)+B(IC+I)))
+ C(JC+J)=((A(IA+I)+A(ID+I))-0.5*(A(IB+I)+A(IC+I)))
+ * -(SIN60*(B(IB+I)-B(IC+I)))
+ C(JE+J)=((A(IA+I)+A(ID+I))-0.5*(A(IB+I)+A(IC+I)))
+ * +(SIN60*(B(IB+I)-B(IC+I)))
+ I=I+INC3
+ J=J+INC4
+ 610 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 620 CONTINUE
+ IA=IA+IINK
+ IINK=2*IINK
+ IB=IB+IINK
+ IC=IC+IINK
+ ID=ID-IINK
+ IE=IE-IINK
+ IF=IF-IINK
+ JBASE=JBASE+JUMP
+ JUMP=2*JUMP+JINK
+ IF (IC.EQ.ID) GO TO 660
+ DO 650 K=LA,KSTOP,LA
+ KB=K+K
+ KC=KB+KB
+ KD=KC+KB
+ KE=KD+KB
+ KF=KE+KB
+ C1=TRIGS(KB+1)
+ S1=TRIGS(KB+2)
+ C2=TRIGS(KC+1)
+ S2=TRIGS(KC+2)
+ C3=TRIGS(KD+1)
+ S3=TRIGS(KD+2)
+ C4=TRIGS(KE+1)
+ S4=TRIGS(KE+2)
+ C5=TRIGS(KF+1)
+ S5=TRIGS(KF+2)
+ IBASE=0
+ DO 640 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 630 IJK=1,LOT
+C
+ A11(IJK)= (A(IE+I)+A(IB+I))+(A(IC+I)+A(IF+I))
+ A20(IJK)=(A(IA+I)+A(ID+I))-0.5*A11(IJK)
+ A21(IJK)=SIN60*((A(IE+I)+A(IB+I))-(A(IC+I)+A(IF+I)))
+ B11(IJK)= (B(IB+I)-B(IE+I))+(B(IC+I)-B(IF+I))
+ B20(IJK)=(B(IA+I)-B(ID+I))-0.5*B11(IJK)
+ B21(IJK)=SIN60*((B(IB+I)-B(IE+I))-(B(IC+I)-B(IF+I)))
+C
+ C(JA+J)=(A(IA+I)+A(ID+I))+A11(IJK)
+ D(JA+J)=(B(IA+I)-B(ID+I))+B11(IJK)
+ C(JC+J)=C2*(A20(IJK)-B21(IJK))-S2*(B20(IJK)+A21(IJK))
+ D(JC+J)=S2*(A20(IJK)-B21(IJK))+C2*(B20(IJK)+A21(IJK))
+ C(JE+J)=C4*(A20(IJK)+B21(IJK))-S4*(B20(IJK)-A21(IJK))
+ D(JE+J)=S4*(A20(IJK)+B21(IJK))+C4*(B20(IJK)-A21(IJK))
+C
+ A11(IJK)=(A(IE+I)-A(IB+I))+(A(IC+I)-A(IF+I))
+ B11(IJK)=(B(IE+I)+B(IB+I))-(B(IC+I)+B(IF+I))
+ A20(IJK)=(A(IA+I)-A(ID+I))-0.5*A11(IJK)
+ A21(IJK)=SIN60*((A(IE+I)-A(IB+I))-(A(IC+I)-A(IF+I)))
+ B20(IJK)=(B(IA+I)+B(ID+I))+0.5*B11(IJK)
+ B21(IJK)=SIN60*((B(IE+I)+B(IB+I))+(B(IC+I)+B(IF+I)))
+C
+ C(JD+J)=
+ * C3*((A(IA+I)-A(ID+I))+A11(IJK))-S3*((B(IA+I)+B(ID+I))-B11(IJK))
+ D(JD+J)=
+ * S3*((A(IA+I)-A(ID+I))+A11(IJK))+C3*((B(IA+I)+B(ID+I))-B11(IJK))
+ C(JB+J)=C1*(A20(IJK)-B21(IJK))-S1*(B20(IJK)-A21(IJK))
+ D(JB+J)=S1*(A20(IJK)-B21(IJK))+C1*(B20(IJK)-A21(IJK))
+ C(JF+J)=C5*(A20(IJK)+B21(IJK))-S5*(B20(IJK)+A21(IJK))
+ D(JF+J)=S5*(A20(IJK)+B21(IJK))+C5*(B20(IJK)+A21(IJK))
+C
+ I=I+INC3
+ J=J+INC4
+ 630 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 640 CONTINUE
+ IA=IA+IINK
+ IB=IB+IINK
+ IC=IC+IINK
+ ID=ID-IINK
+ IE=IE-IINK
+ IF=IF-IINK
+ JBASE=JBASE+JUMP
+ 650 CONTINUE
+ IF (IC.GT.ID) GO TO 900
+ 660 CONTINUE
+ IBASE=0
+ DO 680 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 670 IJK=1,LOT
+ C(JA+J)=A(IB+I)+(A(IA+I)+A(IC+I))
+ C(JD+J)=B(IB+I)-(B(IA+I)+B(IC+I))
+ C(JB+J)=(SIN60*(A(IA+I)-A(IC+I)))-(0.5*(B(IA+I)+B(IC+I))+B(IB+I))
+ C(JF+J)=-(SIN60*(A(IA+I)-A(IC+I)))-(0.5*(B(IA+I)+B(IC+I))+B(IB+I))
+ C(JC+J)=SIN60*(B(IC+I)-B(IA+I))+(0.5*(A(IA+I)+A(IC+I))-A(IB+I))
+ C(JE+J)=SIN60*(B(IC+I)-B(IA+I))-(0.5*(A(IA+I)+A(IC+I))-A(IB+I))
+ I=I+INC3
+ J=J+INC4
+ 670 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 680 CONTINUE
+ GO TO 900
+C
+ 690 CONTINUE
+ SSIN60=2.0*SIN60
+ DO 694 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 692 IJK=1,LOT
+ C(JA+J)=(2.0*(A(IA+I)+A(ID+I)))+(2.0*(A(IB+I)+A(IC+I)))
+ C(JD+J)=(2.0*(A(IA+I)-A(ID+I)))-(2.0*(A(IB+I)-A(IC+I)))
+ C(JB+J)=(2.0*(A(IA+I)-A(ID+I))+(A(IB+I)-A(IC+I)))
+ * -(SSIN60*(B(IB+I)+B(IC+I)))
+ C(JF+J)=(2.0*(A(IA+I)-A(ID+I))+(A(IB+I)-A(IC+I)))
+ * +(SSIN60*(B(IB+I)+B(IC+I)))
+ C(JC+J)=(2.0*(A(IA+I)+A(ID+I))-(A(IB+I)+A(IC+I)))
+ * -(SSIN60*(B(IB+I)-B(IC+I)))
+ C(JE+J)=(2.0*(A(IA+I)+A(ID+I))-(A(IB+I)+A(IC+I)))
+ * +(SSIN60*(B(IB+I)-B(IC+I)))
+ I=I+INC3
+ J=J+INC4
+ 692 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 694 CONTINUE
+ GO TO 900
+C
+C CODING FOR FACTOR 8
+C -------------------
+ 800 CONTINUE
+ IBAD=3
+ IF (LA.NE.M) GO TO 910
+ IA=1
+ IB=IA+LA*INC1
+ IC=IB+2*LA*INC1
+ ID=IC+2*LA*INC1
+ IE=ID+2*LA*INC1
+ JA=1
+ JB=JA+JINK
+ JC=JB+JINK
+ JD=JC+JINK
+ JE=JD+JINK
+ JF=JE+JINK
+ JG=JF+JINK
+ JH=JG+JINK
+ SSIN45=SQRT(2.0)
+C
+ DO 820 L=1,LA
+ I=IBASE
+ J=JBASE
+CDIR$ IVDEP
+ DO 810 IJK=1,LOT
+ C(JA+J)=2.0*(((A(IA+I)+A(IE+I))+A(IC+I))+(A(IB+I)+A(ID+I)))
+ C(JE+J)=2.0*(((A(IA+I)+A(IE+I))+A(IC+I))-(A(IB+I)+A(ID+I)))
+ C(JC+J)=2.0*(((A(IA+I)+A(IE+I))-A(IC+I))-(B(IB+I)-B(ID+I)))
+ C(JG+J)=2.0*(((A(IA+I)+A(IE+I))-A(IC+I))+(B(IB+I)-B(ID+I)))
+ C(JB+J)=2.0*((A(IA+I)-A(IE+I))-B(IC+I))
+ * +SSIN45*((A(IB+I)-A(ID+I))-(B(IB+I)+B(ID+I)))
+ C(JF+J)=2.0*((A(IA+I)-A(IE+I))-B(IC+I))
+ * -SSIN45*((A(IB+I)-A(ID+I))-(B(IB+I)+B(ID+I)))
+ C(JD+J)=2.0*((A(IA+I)-A(IE+I))+B(IC+I))
+ * -SSIN45*((A(IB+I)-A(ID+I))+(B(IB+I)+B(ID+I)))
+ C(JH+J)=2.0*((A(IA+I)-A(IE+I))+B(IC+I))
+ * +SSIN45*((A(IB+I)-A(ID+I))+(B(IB+I)+B(ID+I)))
+ I=I+INC3
+ J=J+INC4
+ 810 CONTINUE
+ IBASE=IBASE+INC1
+ JBASE=JBASE+INC2
+ 820 CONTINUE
+C
+C RETURN
+C ------
+ 900 CONTINUE
+ IBAD=0
+ 910 CONTINUE
+ IERR=IBAD
+ RETURN
+ END
diff --git a/interpolation/rphi.F b/interpolation/rphi.F
new file mode 100755
index 0000000..44fc2fd
--- /dev/null
+++ b/interpolation/rphi.F
@@ -0,0 +1,136 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE RPHI( DATA, NM, WORK, SLON)
+C
+C---->
+C**** RPHI
+C
+C Purpose
+C -------
+C
+C Rotates spectral coefficients by longitude.
+C
+C
+C Interface
+C ---------
+C
+C CALL RPHI(DATA,NM,WORK,SLON)
+C
+C Input
+C -----
+C
+C DATA = Input spectral field of REAL*8s of size (NM+1)*(NM+2).
+C NM = Triangular truncation (e.g. 106)
+C WORK = Work space of size at least 2*(NM+1).
+C SLON = Rotation angle (REAL*8).
+C (degrees, positive => rotate west to east).
+C
+C Output
+C ------
+C
+C Transformed fields are returned in data.
+C
+C
+C Method
+C ------
+C
+C See reference below.
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C R.McGrath and P.Lynch HIRLAM
+C
+C
+C Reference.
+C ----------
+C
+C "Spectral synthesis on rotated and regular grids"
+C by P.Lynch and R.McGrath (Irish Meteorological Service).
+C
+C
+C Modifications
+C -------------
+C
+C J.D.Chambers ECMWF October 1995
+C Reformat and put into clearcase.
+C
+C ------------------------------------------------------------------
+C----<
+C
+ IMPLICIT NONE
+C
+#include "jparams.h"
+C
+C Function arguments
+ COMPLEX*16 DATA
+ COMPLEX*16 WORK
+ DIMENSION DATA(*), WORK(*)
+ REAL*8 SLON
+ INTEGER NM
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 26000 )
+C
+C Local variables
+ COMPLEX*16 CC
+ INTEGER I, IPMN, NS, M, J
+ REAL*8 RAD, XLON
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IPMN = ((NM+1)*(NM+2))/2
+ RAD = 180.0/PPI
+ XLON = -SLON/RAD
+C
+C ------------------------------------------------------------------
+C* Section 2. Transform the fields.
+C ------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ NS = 1
+ CC = (1.0,0.0)
+C
+ DO 215 M = 1,NM+1
+ DO 210 J = NS,NS+NM-M+1
+ WORK(J) = CC
+ 210 CONTINUE
+C
+ NS = J
+ CC = CEXP(CMPLX(0.0,REAL(XLON*M)))
+ 215 CONTINUE
+C
+C Transform fields in output array.
+ DO 220 J = 1,IPMN
+ DATA(J) = WORK(J)*DATA(J)
+ 220 CONTINUE
+C
+C ------------------------------------------------------------------
+C* Section 9. Return.
+C ------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/set99.F b/interpolation/set99.F
new file mode 100755
index 0000000..baeb793
--- /dev/null
+++ b/interpolation/set99.F
@@ -0,0 +1,69 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE SET99(TRIGS,IFAX,N)
+ DIMENSION TRIGS(N),IFAX(10),JFAX(10),LFAX(7)
+C---->
+C
+C SUBROUTINE 'SET99' - COMPUTES FACTORS OF N & TRIGONOMETRIC
+C FUNCTIONS REQUIRED BY FFT99 & FFT991
+C
+C----<
+#include "jparams.h"
+C
+ DATA LFAX/6,8,5,4,3,2,1/
+ IXXX=1
+C
+ DEL= (2.0*PPI)/FLOAT(N)
+ NIL=0
+ NHL=(N/2)-1
+ DO 10 K=NIL,NHL
+ ANGLE=FLOAT(K)*DEL
+ TRIGS(2*K+1)=COS(ANGLE)
+ TRIGS(2*K+2)=SIN(ANGLE)
+ 10 CONTINUE
+C
+C FIND FACTORS OF N (8,6,5,4,3,2; ONLY ONE 8 ALLOWED)
+C LOOK FOR SIXES FIRST, STORE FACTORS IN DESCENDING ORDER
+ NU=N
+ IFAC=6
+ K=0
+ L=1
+ 20 CONTINUE
+ IF (MOD(NU,IFAC).NE.0) GO TO 30
+ K=K+1
+ JFAX(K)=IFAC
+ IF (IFAC.NE.8) GO TO 25
+ IF (K.EQ.1) GO TO 25
+ JFAX(1)=8
+ JFAX(K)=6
+ 25 CONTINUE
+ NU=NU/IFAC
+ IF (NU.EQ.1) GO TO 50
+ IF (IFAC.NE.8) GO TO 20
+ 30 CONTINUE
+ L=L+1
+ IFAC=LFAX(L)
+ IF (IFAC.GT.1) GO TO 20
+C
+ WRITE(6,40) N
+ 40 FORMAT(4H1N =,I4,27H - CONTAINS ILLEGAL FACTORS)
+ RETURN
+C
+C NOW REVERSE ORDER OF FACTORS
+ 50 CONTINUE
+ NFAX=K
+ IFAX(1)=NFAX
+ DO 60 I=1,NFAX
+ IFAX(NFAX+2-I)=JFAX(I)
+ 60 CONTINUE
+ IFAX(10)=N
+ RETURN
+ END
diff --git a/interpolation/setrep.F b/interpolation/setrep.F
new file mode 100755
index 0000000..e9fcf59
--- /dev/null
+++ b/interpolation/setrep.F
@@ -0,0 +1,71 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+#define INT_MISSING -2147483647
+
+ INTEGER FUNCTION SETREP(OUTREP)
+C
+C---->
+C*****SEREP*
+C
+C PURPOSE
+C -------
+C reset LNOREPR to original value
+C reset some other values in common block
+C LNOREPR - Flag to say whether or not user specified NOREPR
+C
+C Function argument
+C
+ INTEGER OUTREP
+
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+
+ SETREP = 0
+ IF(OUTREP.EQ.1) THEN
+ LNOREPR = .FALSE.
+ IF(.NOT.LNOAREA) THEN
+ NOAREA(1) = 0
+ NOAREA(2) = 0
+ NOAREA(3) = 0
+ NOAREA(4) = 0
+ CALL INTLOG(JP_DEBUG,'SETREP: AREA has been reseted'
+ X ,JPQUIET)
+ ENDIF
+ CALL INTLOG(JP_DEBUG,'SETREP: LNOREPR has been reseted'
+ X ,JPQUIET)
+ ENDIF
+ NIWE = 0
+ NINS = 0
+ CALL INTLOG(JP_DEBUG,'SETREP: NIWE,NINS has been reseted'
+ X ,JPQUIET)
+cs NOACC = 0
+cs CALL INTLOG(JP_DEBUG,'SETREP: NOACC has been reseted'
+cs X ,JPQUIET)
+ NOLEVEL = 0
+ CALL INTLOG(JP_DEBUG,'SETREP: NOLEVEL has been reseted'
+ X ,JPQUIET)
+ LOCEAN = .FALSE.
+ CALL INTLOG(JP_DEBUG,'SETREP: LOCEAN has been reseted'
+ X ,JPQUIET)
+ LPREC = .FALSE.
+ CALL INTLOG(JP_DEBUG,'SETREP: LPREC has been reseted'
+ X ,JPQUIET)
+ LIMISSA = .FALSE.
+ LIMISSV = .FALSE.
+ RMISSGV = REAL(INT_MISSING)
+ CALL INTLOG(JP_DEBUG,'SETREP: LIMISSV has been reseted'
+ X ,JPQUIET)
+cs LNOROTA = .FALSE.
+cs CALL INTLOG(JP_DEBUG,'SETREP: LNOROTA has been reseted'
+cs X ,JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/sharedMemoryCharacteristics.c b/interpolation/sharedMemoryCharacteristics.c
new file mode 100755
index 0000000..ab55b30
--- /dev/null
+++ b/interpolation/sharedMemoryCharacteristics.c
@@ -0,0 +1,175 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/ipc.h>
+
+extern int debugSet;
+
+#include "sharedmemory.h"
+#include "fortdefs.h"
+
+#define MAC 1264
+
+int sharedMemoryCharacteristics(
+ int type,
+ int truncation,
+ float grid,
+ int * numlat,
+ size_t * size,
+ key_t * key )
+{
+/*
+// Input:
+//
+// type - indicates the spectral to grid transformation:
+// SP2LL for spectral to lat/long
+// SP2RG for spectral to regular gaussian
+// SP2QG for spectral to quasi-regular (reduced) gaussian
+//
+// truncation - the spectral truncation (eg 511 for T511)
+//
+// grid - specifies the desired grid:
+// the grid spacing along a line of longitude for lat/long grids
+// the gaussian grid number for gaussian grids (eg 80.0 for N80)
+//
+// Output:
+//
+// numlat - the number of latitudes from pole to pole in the grid
+//
+// size - size in bytes of the transformation coefficients
+//
+// key - the key for the shared memory and its associated semaphore
+//
+// Function returns 0 if all OK.
+//
+// Files setup to generate shared memory and semaphore keys are held
+// in a desginated directory (see defaultDirectory below). This
+// directory can be specified using environment variable SHARED_DIRECTORY.
+//
+*/
+int status, gaussianNumber;
+char defaultDirectory[] = "./";
+/* char defaultDirectory[] = "/home/ma/emos/data/BlueStorm"; */
+char * directory;
+char filename[] = "SP2LL_Tnnnn_to_Grid_xxxxxxxxx";
+char * fullFilename;
+key_t Key;
+
+/*
+// Build the name of the file which is used to define a key.
+// If the file does not already exist, create it.
+*/
+ /* directory = getenv("SHARED_DIRECTORY"); */
+ directory = getenv("PPDIR");
+ if( directory == NULL ) directory = defaultDirectory;
+ fullFilename = (char *) malloc(strlen(directory)+strlen(filename));
+ if( fullFilename == NULL ) {
+ perror("malloc error");
+ exit(1);
+ }
+ strcpy(fullFilename, directory);
+ strcat(fullFilename, "/");
+
+ switch( type) {
+
+ case SP2LL:
+ sprintf(filename,"SP2LL_T%04d_to_Grid_%09.6f",truncation,grid);
+ break;
+
+ case SP2RG:
+ sprintf(filename,"SP2RG_T%04d_to_Regular_N%04.0f",truncation,grid);
+ break;
+
+ case SP2QG:
+ sprintf(filename,"SP2QG_T%04d_to_Reduced_N%04.0f",truncation,grid);
+ break;
+
+ default:
+ return (int) 1;
+ }
+ strcat(fullFilename, filename);
+
+ if( DEBUG ) printf("fullFilename = %s\n", fullFilename);
+ Key = ftok(fullFilename, MAC);
+/*
+// If file does not exist, ..
+*/
+ if( Key == -1 ) {
+ char * command = (char*) malloc(6+strlen(fullFilename));
+ if( command == NULL ) {
+ perror("malloc error");
+ exit(1);
+ }
+ strcpy(command,"touch ");
+ strcat(command,fullFilename);
+ if( DEBUG ) printf("%s\n", command);
+ status = system(command);
+ if( status ) {
+ printf("Unable to create file %s\n", fullFilename);
+ perror("File creation problem");
+ exit(1);
+ }
+ free(command);
+ Key = ftok(fullFilename, MAC);
+ if( Key == -1 ) {
+ perror("Error getting key from newly created file");
+ exit(1);
+ }
+ }
+ free(fullFilename);
+
+ *key = Key;
+ if( DEBUG ) printf("sharedMemoryCharacteristics: Key = %0x\n", Key);
+/*
+// Calculate the file characteristics
+*/
+ switch( type) {
+
+ case SP2LL:
+ *numlat = (int)(90.0/grid + 1.0);
+ break;
+
+ case SP2RG:
+ case SP2QG:
+ gaussianNumber = (int) grid;
+ /*
+ *numlat = gaussianNumber*2;
+ */
+ *numlat = gaussianNumber;
+ break;
+
+ default:
+ printf("sharedMemoryCharacteristics: Type %d not yet handled\n", type);
+ return (int) 1;
+ }
+
+ *size = (((truncation+1)*(truncation+4))/2) * (*numlat) * sizeof(fortreal);
+ printf("size=%ld\n",*size);
+ /*
+ *size = (((truncation+1)*(truncation+4))/2);
+ printf("size=%d\n",*size);
+ *size *= *numlat;
+ printf("size=%d\n",*size);
+ *size *= sizeof(fortreal);
+ printf("-----size=%ld\n",*size);
+ *size = 4736220160;
+ printf("------size=%ld\n",*size);
+ */
+
+
+ if( DEBUG ) printf("sharedMemoryCharacteristics: truncation = %d sizeof-fortreal %d numlat=%d\n", truncation,sizeof(fortreal),*numlat);
+ if( DEBUG ) printf("sharedMemoryCharacteristics: Size = %ld bytes\n", *size);
+
+ return (int) 0;
+}
diff --git a/interpolation/sharedgg.c b/interpolation/sharedgg.c
new file mode 100755
index 0000000..1a5b60d
--- /dev/null
+++ b/interpolation/sharedgg.c
@@ -0,0 +1,119 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+#define SHAREDGG sharedgg_
+
+#ifdef linux
+#ifndef __USE_LARGEFILE64
+#define __USE_LARGEFILE64
+#endif
+#include <sys/stat.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <string.h>
+#include "fortint.h"
+#include "sharedlib.h"
+
+#include <sys/ipc.h>
+#include <sys/shm.h>
+
+extern int sharedlib_dbg = 0;
+
+#ifndef CRAY
+#ifdef FORTRAN_NO_UNDERSCORE
+#define SHAREDLL sharedll
+#define PBOPEN pbopen
+#define PBCLOSE pbclose
+#else
+#define SHAREDLL sharedll_
+#define PBOPEN pbopen_
+#define PBCLOSE pbclose_
+#endif
+#endif
+
+
+fortint SHAREDGG(
+ JPointer* ipdum,
+ fortint* iktrunc,
+ fortint* knum)
+
+/*
+C
+C**** SHAREDGG
+C
+C IPDUM - Dummy array for mapping legendre function file
+C KNUM - Gaussian grid number
+C KTRUNC - Spherical truncation
+C KRET - Return status, 0 = OK.
+C
+*/
+{
+
+#if (defined hpR64) || (defined hpiaR64)
+long l1, l2;
+#else
+fortint l1, l2;
+#endif
+
+char filedum[128], filename[128];
+char ypfn[13] = "CF_xxxx_nnnn";
+static char yold[13] = "xxxxxxxxxxxx";
+char defaultDirectory[] = "./";
+int kbuild ;
+char * fn;
+static fortint fpindex;
+static FILE * fp;
+static void * result = 0;
+fortint kret =0;
+
+int exist = 0;
+int status;
+pid_t process_id;
+int ktrunc = (int) (*iktrunc);
+
+/*
+// Setup the filename: cf_txxxx_raabbbbb
+*/
+
+/*
+// Setup the file name
+*/
+ sprintf( ypfn+3, "%04d", ktrunc);
+ sprintf( ypfn+7, "_%04d", *knum);
+
+/*
+// See if the file has already been created.
+*/
+ fn = getenv("PPDIR");
+ if(fn == NULL) fn = defaultDirectory;
+
+ if( (fn != NULL) && (strlen(fn) != 0) ) {
+ strcpy( filename, fn );
+ strcat( filename, "/");
+ strcat( filename, ypfn);
+ l1 = strlen(filename);
+ l2 = 1;
+ }
+ /* printf("gg share_file filename=%s\n",filename); */
+
+ result = (void *) share_file(filename);
+ if (result == NULL) kret = 1;
+
+ *ipdum = (JPointer) result;
+
+ return kret;
+}
diff --git a/interpolation/sharedlib.c b/interpolation/sharedlib.c
new file mode 100755
index 0000000..ccd6f9b
--- /dev/null
+++ b/interpolation/sharedlib.c
@@ -0,0 +1,368 @@
+/**
+* Copyright 1981-2012 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 <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <errno.h>
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/time.h>
+
+#include <sys/sem.h>
+
+#include "sharedlib.h"
+
+int sharedlib_dbg = 0;
+
+/* 10 MB */
+
+#define BUFFER_SIZE 10485760
+#define MAGIC 1234567890
+
+struct sembuf _lock[] = {
+ { 0, 0, SEM_UNDO }, /* test */
+ { 0, 1, SEM_UNDO }, /* lock */
+};
+
+struct sembuf _unlock[] = {
+ { 0, -1, SEM_UNDO }, /* ulck */
+};
+
+#define INFO_PATH 1024
+
+struct info {
+ int ready;
+ int magic;
+ char path[INFO_PATH];
+};
+
+
+
+void *share_file(const char* file) {
+ char message[1024];
+ char path[1024];
+
+ struct stat64 s;
+ struct stat64 s2;
+ int fd = -1;
+ int err = 0;
+ void *ptr = NULL;
+ int shmid = 0;
+ key_t key;
+ char *addr;
+ struct timeval start, end, diff;
+ double time;
+ int sem;
+ int loadfile = 1;
+ int locked = 0;
+ int page_size = getpagesize();
+ struct info *nfo;
+
+ if(page_size < 0)
+ {
+ fprintf(stderr,"ERR: sharedmem:get_page_size faile\n");
+ return NULL;
+ }
+
+ if(strlen(file) + 1 > INFO_PATH)
+ {
+ fprintf(stderr,"ERR: sharedmem:path too long(%d) max is %d\n",strlen(file), INFO_PATH);
+ return NULL;
+ }
+
+ if(strlen(file) + 1 > sizeof(path))
+ {
+ fprintf(stderr,"ERR: sharedmem:path too long(%d) max is %d\n",strlen(file), sizeof(path));
+ return NULL;
+ }
+
+ if(realpath(file,path) == 0) {
+ sprintf(message,"ERR: sharedmem:realpath(%s)",file);
+ err = -1;
+ goto error;
+ }
+
+ if (sharedlib_dbg)
+ fprintf(stdout,"sharedmem: sharing %s\n",path);
+
+ if(sizeof(s.st_size) < 8) {
+ fprintf(stderr,"ERR: sharedmem:stat.st_size(%d) is too small for 64bits files\n",sizeof(s.st_size));
+ return NULL;
+ }
+
+
+ key = ftok(path,1);
+
+ if(key == (key_t)-1) {
+ sprintf(message,"ERR: sharedmem:ftok(%s)",path);
+ err = -1;
+ goto error;
+ }
+
+
+ if((sem = semget(key,1,IPC_CREAT|0600)) < 0)
+ {
+ sprintf(message,"ERR: sharedmem:semget(%s)",path);
+ err = -1;
+ goto error;
+ }
+
+ if (sharedlib_dbg) gettimeofday( &start, NULL );
+
+ if(semop(sem,_lock, 2 ) < 0) {
+
+ sprintf(message,"ERR: sharedmem:semop:lock(%s)",path);
+ err = -1;
+ goto error;
+ }
+ locked = 1;
+
+ if (sharedlib_dbg)
+ {
+ gettimeofday( &end, NULL );
+
+ diff.tv_sec = end.tv_sec - start.tv_sec;
+ diff.tv_usec = end.tv_usec - start.tv_usec;
+
+ if (diff.tv_usec < 0)
+ {
+ diff.tv_sec--;
+ diff.tv_sec--;
+ diff.tv_usec += 1000000;
+ }
+ time = (double)diff.tv_sec + ((double)diff.tv_usec / 1000000.);
+
+ fprintf( stdout, "sharedmem:semop:lock wait %g secs\n", time);
+ }
+
+ if((fd = open(path,O_RDONLY | O_LARGEFILE)) < 0)
+ {
+
+ sprintf(message,"ERR: sharedmem:open(%s)",path);
+ err = -1;
+ goto error;
+ }
+
+ if(stat64(path,&s))
+ {
+ sprintf(message,"ERR: sharedmem:stat(%s)",path);
+ err = -1;
+ goto error;
+ }
+
+ if((shmid = shmget(key, ((s.st_size + page_size-1)/page_size)*page_size + sizeof(struct info),IPC_CREAT|0600)) < 0)
+ {
+ sprintf(message,"ERR: sharedmem:shmget(%s)",path);
+ err = -1;
+ goto error;
+ }
+
+
+#ifdef SHM_PAGESIZE
+ {
+
+ /* Use 64K pages to back the shared memory region */
+ size_t shm_size;
+ struct shmid_ds shm_buf = { 0 };
+ psize_t psize_64k;
+ psize_64k = 64 * 1024;
+
+ shm_buf.shm_pagesize = psize_64k;
+ if (shmctl(shmid, SHM_PAGESIZE, &shm_buf))
+ {
+ /*perror("shmctl(SHM_PAGESIZE) failed");*/
+ }
+ }
+
+#endif
+
+ /* attach shared memory */
+
+ ptr = shmat( shmid, NULL, 0 );
+ if (ptr == (void*)-1) {
+ sprintf(message,"sharedmem:shmget(%s)",path);
+ err = -1;
+ goto error;
+ }
+
+ addr = (char*)ptr;
+ nfo = (struct info*)(addr + (((s.st_size + page_size-1)/page_size)*page_size));
+
+ if(nfo->ready) {
+ loadfile = 0;
+ if(nfo->magic != MAGIC)
+ {
+ sprintf(message,"ERR: sharedmem:check: bad magic %d\n",nfo->magic);
+ err = -1;
+ goto error;
+ }
+
+ if(strcmp(nfo->path,path) != 0)
+ {
+ sprintf(message,"ERR: sharedmem:check: invalid path [%s]\n",nfo->path);
+ err = -1;
+ goto error;
+ }
+ }
+
+
+ if(loadfile) {
+
+ s2.st_size = s.st_size;
+
+ if (sharedlib_dbg) gettimeofday( &start, NULL );
+
+ while(s.st_size > 0)
+ {
+ size_t len = s.st_size > BUFFER_SIZE ? BUFFER_SIZE : s.st_size;
+ if(read(fd, addr, len) != len) {
+ sprintf(message,"ERR: sharedmem:read(%s)",path);
+ err = -1;
+ goto error;
+ }
+ s.st_size -= len;
+ addr += len;
+ }
+
+ if (sharedlib_dbg)
+ {
+ gettimeofday( &end, NULL );
+
+ diff.tv_sec = end.tv_sec - start.tv_sec;
+ diff.tv_usec = end.tv_usec - start.tv_usec;
+
+ if (diff.tv_usec < 0)
+ {
+ diff.tv_sec--;
+ diff.tv_usec += 1000000;
+ }
+ time = (double)diff.tv_sec + ((double)diff.tv_usec / 1000000.);
+
+ fprintf( stdout, "sharedmem:read %lld bytes in %g secs\n",s2.st_size, time);
+ }
+
+ nfo->magic = MAGIC;
+ strcpy(nfo->path,path);
+ nfo->ready = 1;
+ }
+ else
+ {
+ if (sharedlib_dbg)
+ fprintf( stdout, "sharedmem:read file already loaded\n");
+ }
+
+ close(fd);
+
+error:
+
+ if(fd>0) {
+ close(fd);
+ }
+
+ if(err) {
+ perror(message);
+ if(ptr) shmdt(ptr);
+ ptr = NULL;
+
+ }
+ if(locked) {
+ if(semop(sem,_unlock,1) < 0)
+ {
+ sprintf(message,"ERR: sharedmem:semop:lock(%s)",path);
+ perror(message);
+ }
+
+ }
+
+ return ptr;
+}
+
+void release_shared_file(void *ptr) {
+ shmdt(ptr);
+}
+
+int remove_shared_file(const char* file) {
+ char message[1024];
+ char path[1024];
+ int err = 0;
+ int shmid = 0;
+ key_t key;
+ int sem;
+
+ if(strlen(file) + 1 > sizeof(path))
+ {
+ fprintf(stderr,"ERR: sharedmem:path too long(%d) max is %d\n",strlen(file), sizeof(path));
+ return -1;
+ }
+
+ if(realpath(file,path) == 0) {
+ sprintf(message,"ERR: sharedmem:realpath(%s)",file);
+ err = -1;
+ goto error;
+ }
+
+ key = ftok(path,1);
+
+ if(key == (key_t)-1) {
+ sprintf(message,"ERR: sharedmem:ftok(%s)",path);
+ err = -1;
+ goto error;
+ }
+
+ if((shmid = shmget(key,0,0600)) < 0)
+ {
+ sprintf(message,"ERR: sharedmem:shmget(%s)",path);
+ err = -1;
+ goto error;
+ }
+
+ fprintf(stdout,"sharedmem: removing shared memory for %s\n",path);
+
+ if(shmctl(shmid, IPC_RMID, NULL) < 0)
+ {
+ sprintf(message,"ERR: sharedmem:shmctl:IPC_RMID,(%s)",path);
+ err = -1;
+ goto error;
+ }
+
+
+ if((sem = semget(key,1,0600)) <0 )
+ {
+ sprintf(message,"ERR: sharedmem:semget(%s)",path);
+ err = -1;
+ goto error;
+ }
+
+ if(semctl(sem, 0, IPC_RMID, NULL) < 0)
+ {
+ sprintf(message,"ERR: sharedmem:semctl:IPC_RMID,(%s)",path);
+ err = -1;
+ goto error;
+ }
+
+
+
+error:
+
+
+
+ if(err)
+ perror(message);
+
+ return err;
+
+}
diff --git a/interpolation/sharedlib.h b/interpolation/sharedlib.h
new file mode 100755
index 0000000..490aae0
--- /dev/null
+++ b/interpolation/sharedlib.h
@@ -0,0 +1,23 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#if defined(__STDC__) || defined(__cplusplus)
+# define P_(s) s
+#else
+# define P_(s) ()
+#endif
+
+
+/* sharedlib.c */
+void *share_file P_((const char *path));
+void release_shared_file P_((void *ptr));
+int remove_shared_file P_((const char *path));
+
+#undef P_
diff --git a/interpolation/sharedll.c b/interpolation/sharedll.c
new file mode 100755
index 0000000..83ad435
--- /dev/null
+++ b/interpolation/sharedll.c
@@ -0,0 +1,121 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+#define SHAREDLL sharedll_
+
+#ifdef linux
+#ifndef __USE_LARGEFILE64
+#define __USE_LARGEFILE64
+#endif
+#include <sys/stat.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <string.h>
+#include "fortint.h"
+#include "sharedlib.h"
+
+#include <sys/ipc.h>
+#include <sys/shm.h>
+
+extern int sharedlib_dbg = 0;
+
+#ifndef CRAY
+#ifdef FORTRAN_NO_UNDERSCORE
+#define SHAREDLL sharedll
+#define PBOPEN pbopen
+#define PBCLOSE pbclose
+#else
+#define SHAREDLL sharedll_
+#define PBOPEN pbopen_
+#define PBCLOSE pbclose_
+#endif
+#endif
+
+
+
+fortint SHAREDLL(
+ JPointer* ipdum,
+ fortint* iktrunc,
+ double* platinc)
+
+/*
+C
+C**** SHAREDLL
+C
+C IPDUM - Dummy array for mapping legendre function file
+C PLATINC - Grid interval in degrees
+C KTRUNC - Spherical truncation
+C KRET - Return status, 0 = OK.
+C
+*/
+{
+
+#if (defined hpR64) || (defined hpiaR64)
+long l1, l2;
+#else
+fortint l1, l2;
+#endif
+
+char filedum[128], filename[128];
+char ypfn[18] = "CF_Txxxx_Raabbbb";
+static char yold[18] = "xxxxxxxxxxxxxxxx";
+char defaultDirectory[] = "./";
+int kbuild ;
+char * fn;
+static fortint fpindex;
+static FILE * fp;
+static void * result = 0;
+fortint kret = 0;
+
+int exist = 0;
+int status;
+pid_t process_id;
+int ktrunc = (int) (*iktrunc);
+
+/*
+// Setup the filename: cf_txxxx_raabbbbb
+*/
+
+/*
+// Setup the file name
+*/
+ sprintf( ypfn+4, "%04d", ktrunc);
+ kbuild = (int) (((*platinc)*100000.0) + 0.5);
+ sprintf( ypfn+8, "_R%07d", kbuild);
+
+/*
+// See if the file has already been created.
+*/
+ fn = getenv("PPDIR");
+ if(fn == NULL) fn = defaultDirectory;
+
+ if( (fn != NULL) && (strlen(fn) != 0) ) {
+ strcpy( filename, fn );
+ strcat( filename, "/");
+ strcat( filename, ypfn);
+ l1 = strlen(filename);
+ l2 = 1;
+ }
+ /* printf("ll share_file filename=%s\n",filename); */
+
+ result = (void *) share_file(filename);
+ if (result == NULL) kret = 1;
+
+ *ipdum = (JPointer) result;
+
+ return kret;
+}
diff --git a/interpolation/sharedmemory.h b/interpolation/sharedmemory.h
new file mode 100755
index 0000000..d1180d4
--- /dev/null
+++ b/interpolation/sharedmemory.h
@@ -0,0 +1,42 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef SHAREDMEMORY_H
+#define SHAREDMEMORY_H
+
+#define SP2LL 0
+#define SP2RG 1
+#define SP2QG 2
+#define READY_TO_READ 5
+#define SLEEP_TIME 3
+
+#ifdef FORTRAN_NO_UNDERSCORE
+#define SMREAD smread
+#define NMAKLL nmakll
+#define NMAKGG nmakgg
+#define JGETGG jgetgg
+#define JNUMGG jnumgg
+#define JDEBUG jdebug
+#else
+#define SMREAD smread_
+#define NMAKLL nmakll_
+#define NMAKGG nmakgg_
+#define JGETGG jgetgg_
+#define JNUMGG jnumgg_
+#define JDEBUG jdebug_
+#endif
+
+/*
+// Debug flags.
+*/
+#define DEBUGOFF 1
+#define DEBUG (debugSet > DEBUGOFF )
+
+#endif /* end of SHAREDMEMORY_H */
diff --git a/interpolation/showmap.c b/interpolation/showmap.c
new file mode 100755
index 0000000..a75d937
--- /dev/null
+++ b/interpolation/showmap.c
@@ -0,0 +1,53 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+
+#include "bitmap.h"
+
+void SHOWMAP(
+ char ** mybuffer,
+ int * rowCount,
+ int * columnCount) {
+/*
+// Displays the bits in a bitmap.
+//
+// Called from FORTRAN:
+//
+// CALL SHOWMAP(BITMAP,ROWCNT,COLCNT)
+//
+// where:
+//
+// BITMAP is an array containing the bitmap.
+// ROWCNT is the number of rows
+// COLCNT is the number of columns
+//
+*/
+int value, i, j, bitNumber, byte, bit;
+int rowTotal = *rowCount;
+int columnTotal = *columnCount;
+char * buffer;
+
+ buffer = *mybuffer;
+
+ for( i = 0; i < rowTotal; i++ ) {
+ printf("\n");
+ for( j = 0; j < columnTotal; j++ ) {
+ bitNumber = i*columnTotal + j;
+ byte = bitNumber / 8;
+ bit = bitNumber % 8;
+ value = (buffer[byte] >> (7-bit)) & 0x01;
+ printf("%d ", value);
+ }
+ }
+ printf("\n");
+
+}
diff --git a/interpolation/smread.c b/interpolation/smread.c
new file mode 100755
index 0000000..8edf8b8
--- /dev/null
+++ b/interpolation/smread.c
@@ -0,0 +1,225 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/sem.h>
+#include "sharedmemory.h"
+#include "fortdefs.h"
+
+int sharedMemoryCharacteristics( int, int , float , int * , size_t * , key_t * );
+void createSharedMemoryCoefficients( fortint , fortint , fortreal , fortint , key_t , size_t );
+
+int debugSet = 0;
+static char * debugLevel;
+
+fortint SMREAD(
+ fortreal ** fortranArrayPointer, /* to be attached to shared memory */
+ fortint * Type, /* SP2LL, SP2QG, .. */
+ fortint * Truncation, /* spectral truncation */
+ fortreal * Grid) /* grid spacing or gaussian number */
+/*
+// Callable from Fortran.
+//
+*/
+/*
+C
+C---->
+C**** SMREAD
+C
+C Purpose
+C -------
+C
+C This routine gets interpolation coefficients in a shared memory array.
+C
+C
+C Interface
+C ---------
+C
+C ISIZE = SMREAD(KARRAY,KTYPE,KTRUNC,GRID)
+C
+C
+C Input parameters
+C ----------------
+C
+C KTYPE - Type of spectral to grid transformation (SP2LL, SP2QG, ..)
+C KTRUNC - Spectral truncation (eg 511 for T511)
+C GRID - longitude grid spacing (for lat/long) or gaussian number
+C
+C
+C Output parameters
+C -----------------
+C
+C KARRAY - Pointer to a shared memory array of REALs
+C
+C Function returns the size (in values) of the shared memory array
+C
+C
+C Common block usage
+C ------------------
+C
+C None.
+C
+C
+C Method
+C ------
+C
+C Looks for coefficients in shared memory.
+C Waits on semaphore for coefficients to become available.
+C
+C
+C Externals
+C ---------
+C
+C sharedMemoryCharacteristics - to get key and size for shared memory
+C createSharedMemoryCoefficients - creates coefficients if necessary
+C
+C
+C Reference
+C ---------
+C
+C None.
+C
+C
+C Comments
+C --------
+C
+C Environment variable SHARED_DEBUG can be set (1, 2, ..) to give
+C diagnostic printout.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF January 2002
+C
+C
+C Modifications
+C -------------
+C
+C None.
+C
+C----<
+C
+*/
+{
+int type = (int) *Type;
+int truncation = (int) *Truncation;
+float grid = (float) *Grid;
+key_t memoryKey;
+size_t size;
+int shmflg, shmid;
+char * shmaddr;
+int status, i;
+fortint numberOfValues = 0;
+char mode[] = "00666";
+int value, semaphoreId, numlat, returnCode;
+union semun {
+ int val;
+ struct semid_ds *buf;
+ ushort *array;
+} semvalues;
+fortint Numlat;
+struct sembuf bufs[1];
+
+/*
+// See if DEBUG switched on.
+*/
+ if( ! debugSet ) {
+ debugLevel = getenv("SHARED_DEBUG");
+ if( debugLevel == NULL )
+ debugSet = DEBUGOFF; /* off */
+ else {
+ int loop;
+ for( loop = 0; loop < strlen(debugLevel) ; loop++ ) {
+ if( ! isdigit(debugLevel[loop]) ) {
+ printf("Invalid number string in SHARED_DEBUG: %s\n", debugLevel);
+ printf("SHARED_DEBUG must comprise only digits [0-9].\n");
+ debugSet = DEBUGOFF;
+ }
+ }
+ debugSet = DEBUGOFF + atoi( debugLevel );
+ }
+ if( DEBUG ) printf("SHARED_DEBUG: debug switched on\n");
+ }
+/*
+// Get key and size for shared memory (whole globe)
+*/
+ if( DEBUG ) {
+ printf("SMREAD: type = %d\n",type);
+ printf("SMREAD: truncation = %d\n",truncation);
+ printf("SMREAD: grid = %f\n",grid);
+ }
+ status = sharedMemoryCharacteristics( type,
+ truncation,
+ grid,
+ &numlat,
+ &size,
+ &memoryKey);
+ if( status ) {
+ if( DEBUG ) printf("SMREAD: sharedMemoryCharacteristics call failed\n");
+ return (fortint) 0;
+ }
+ Numlat = numlat;
+/*
+// Wait for the shared memory array to become available
+*/
+ if( DEBUG ) printf("SMREAD: call createSharedMemoryCoefficients with numlat = %d\n", numlat);
+ createSharedMemoryCoefficients(*Type,*Truncation,*Grid,Numlat,memoryKey,size);
+
+ bufs[0].sem_num = 0;
+ bufs[0].sem_op = -READY_TO_READ;
+ bufs[0].sem_flg = 0;
+
+ semaphoreId = (int) memoryKey;
+ if( DEBUG )
+ printf("SMREAD: wait for shared memory semaphore id %0x\n", semaphoreId);
+ status = semop(semaphoreId,bufs,1);
+/*
+// Locate shared segment
+*/
+ if( DEBUG ) printf("SMREAD: locate shared memory\n");
+ shmflg = 0666;
+ shmid = shmget( memoryKey, (size_t)size, shmflg);
+ if ( shmid < 0 ) {
+ perror("shmget error");
+ return (fortint) 0;
+ }
+/*
+// Attach the shared segment to the array pointer
+*/
+ if( DEBUG ) printf("SMREAD: attach shared memory to array\n");
+ shmaddr = (char *) NULL;
+ shmflg = 0;
+ *fortranArrayPointer = (fortreal *) shmat( shmid, shmaddr, shmflg);
+ if ( *fortranArrayPointer == (fortreal *) -1 ) {
+ perror("shmat error");
+ return (fortint) 0;
+ }
+/*
+// Set semaphore value to make memory readable for other readers
+*/
+ if( DEBUG ) printf("SMREAD: set semaphore to make memory readable\n");
+ semvalues.val = READY_TO_READ;
+ value = semctl((int)semaphoreId, (int)0, (int)SETVAL,semvalues);
+/*
+// Return the size (in values) of the shared segment
+*/
+ numberOfValues = (fortint) size/sizeof(fortreal);
+ if( DEBUG )
+ printf("SMREAD: number of values in shared memory = %d\n", numberOfValues);
+
+ return numberOfValues;
+}
diff --git a/interpolation/soffset.c b/interpolation/soffset.c
new file mode 100755
index 0000000..99c6d5a
--- /dev/null
+++ b/interpolation/soffset.c
@@ -0,0 +1,202 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <string.h>
+#include "fortint.h"
+
+
+/* defines for FORTRAN subroutine */
+#ifndef CRAY
+#ifdef FORTRAN_NO_UNDERSCORE
+#define SOFFSET soffset
+#else
+#define SOFFSET soffset_
+#endif
+#endif
+
+#define ERROR(a,b) {perror(a);return b;}
+#define GRIB 0x47524942
+#define len3oct(p) ((((long)*(p))<<16) + (((long)*(p+1))<<8) + (long)*(p+2))
+#define BIT1 0x80
+#define BIT2 0x40
+#define BIT3 0x20
+#define BIT4 0x10
+#define BIT5 0x08
+#define BIT6 0x04
+#define BIT7 0x02
+#define BIT8 0x01
+
+static int grab(unsigned char * , unsigned char * , long ,long ,long * );
+
+fortint soffset_(
+ unsigned char * buffer,
+ fortint* is0,
+ fortint* is1,
+ fortint* is2,
+ fortint* is3,
+ fortint* is4,
+ fortint* iedition) {
+long s0, s1, s2, s3, s4, edition;
+int large = 0;
+int found = 0;
+int code = 0;
+long bytes_read = 0, advance;
+unsigned char p, edit_num, flag23;
+unsigned char size[3];
+int section0 = 8, section1, section2, section3, section4;
+long total;
+unsigned char grp_7777[5];
+
+/* Read bytes until "GRIB" found */
+
+ do
+ {
+ if( grab(buffer, &p, 1, 1, &bytes_read) != 0) return 1;
+ code = ( (code << 8) + p ) & 0xFFFFFFFF;
+ if (code == GRIB ) found = 1;
+ } while ( ! found );
+ s0 = bytes_read - 4;
+ bytes_read = 4;
+
+/* Now find out which edition of GRIB is present (default is 1) */
+
+ edition = 1;
+ s1 = s0 + 8;
+ if( (*(buffer+21-s0) == '\0') && (*(buffer+22-s0) == '\0') )
+ {
+ edition = -1; /* GRIB edition -1 */
+ s1 = s0;
+ section1 = 20;
+ section0 = 4;
+ }
+ else
+ {
+ if( grab(buffer, size, 3, 1, &bytes_read) != 0) return 1;
+ total = len3oct(size);
+ if( total == 24 )
+ {
+/* Move past the edition number */
+ if( grab(buffer, &edit_num, 1, 1, &bytes_read) != 0) return 1;
+ edition = 0; /* GRIB edition 0 */
+ section1 = 24;
+ s1 = s0 + 4;
+ section0 = 4;
+ }
+ }
+
+ if( edition == 1 )
+ {
+/* See if it is an extra large (wave) product */
+ if( total > 0x800000 ) {
+ total = (total&0x7fffff) * 120;
+ large = 1;
+ }
+/* Move past the edition number */
+ if( grab(buffer, &edit_num, 1, 1, &bytes_read) != 0) return 1;
+
+/* Read length of section 1 */
+ if( grab(buffer, size, 3, 1, &bytes_read) != 0) return 1;
+ section1 = len3oct(size);
+ }
+
+/* Now figure out if sections 2/3 are present */
+
+ advance = 4;
+ bytes_read += advance;
+ if( grab(buffer, &flag23, 1, 1, &bytes_read) != 0) return 1;
+ section2 = flag23 & BIT1;
+ section3 = flag23 & BIT2;
+
+/* Advance to end of section 1 */
+
+ advance = section1 - (bytes_read - section0);
+ bytes_read += advance;
+
+/* Read section 2 length if it is given*/
+
+ if( section2 )
+ {
+ s2 = s0 + bytes_read;
+ if( grab(buffer, size, 3, 1, &bytes_read) != 0) return 1;
+ section2 = len3oct(size);
+ advance = section2 - (bytes_read - section0 - section1);
+ bytes_read += advance;
+ }
+ else
+ {
+ section2 = 0;
+ s2 = 0;
+ }
+
+/* Read section 3 length if it is given*/
+
+ if( section3 )
+ {
+ s3 = s0 + bytes_read;
+ if( grab(buffer, size, 3, 1, &bytes_read) != 0) return 1;
+ section3 = len3oct(size);
+ advance = section3 - (bytes_read - section0 - section1 - section2);
+ bytes_read += advance;
+ }
+ else
+ {
+ section3 = 0;
+ s3 = 0;
+ }
+
+/* Read section 4 length */
+
+ s4 = s0 + bytes_read;
+ if( grab(buffer, size, 3, 1, &bytes_read) != 0) return 1;
+ section4 = len3oct(size);
+ if( large ) section4 = total + 3 - bytes_read - section4;
+ advance = section4 - (bytes_read - section0 - section1 - section2 - section3);
+ bytes_read += advance;
+
+/* Check 7777 group is in the expected place */
+
+ if( grab(buffer, grp_7777, 4, 1, &bytes_read) != 0) return 1;
+ grp_7777[4] = '\0';
+ if( strcmp((char *)grp_7777,"7777") != 0 )
+ ERROR("7777 group not found", 15);
+
+
+/* Success! */
+ *is0 = (fortint) s0;
+ *is1 = (fortint) s1;
+ *is2 = (fortint) s2;
+ *is3 = (fortint) s3;
+ *is4 = (fortint) s4;
+ *iedition = (fortint) edition;
+ return 0;
+}
+
+fortint soffset(
+ unsigned char * buffer,
+ fortint* is0,
+ fortint* is1,
+ fortint* is2,
+ fortint* is3,
+ fortint* is4,
+ fortint* iedition) {
+ return soffset_(buffer,is0,is1,is2,is3,is4,iedition);
+}
+
+static int grab(unsigned char * buffer, unsigned char * where, long size,long cnt,long * num_bytes_read)
+{
+long number = size*cnt;
+
+ memcpy(where, (buffer+(*num_bytes_read)), number);
+ *num_bytes_read += number;
+
+ return 0;
+}
diff --git a/interpolation/sources.CRAY b/interpolation/sources.CRAY
new file mode 100755
index 0000000..ce02f10
--- /dev/null
+++ b/interpolation/sources.CRAY
@@ -0,0 +1,276 @@
+HEADERS = \
+ current.h \
+ debug.h \
+ grfixed.h \
+ intf.h \
+ jparams.h \
+ ouspace.h \
+ grdynam.h \
+ grspace.h \
+ intlog.h \
+ memreq.h \
+ parim.h
+
+VECTOR.F = dummy.F
+
+NO_OPT.F = dummy2.F
+
+SOURCES.F = \
+ areachk.F \
+ estima.F \
+ chkout.F \
+ auresol.F \
+ chequal.F \
+ chkprec.F \
+ clear_c.F \
+ ddstyle.F \
+ dssarea.F \
+ eulavgg.F \
+ fixarea.F \
+ freecf.F \
+ zprec.F \
+ funcs.F \
+ gb2gb.F \
+ getconf.F \
+ ggintrp.F \
+ ggrotat.F \
+ ggvalue.F \
+ hgengg.F \
+ hgengrd.F \
+ hgengrw.F \
+ hgenll.F \
+ hgenllw.F \
+ hgetlsm.F \
+ hirlam.F \
+ hirlamw.F \
+ hirlsm.F \
+ hll2ll.F \
+ hll2llw.F \
+ hll2xyz.F \
+ hnei12.F \
+ hneill.F \
+ hntfap.F \
+ hntfaph.F \
+ hntfaps.F \
+ hntfau.F \
+ hntfauh.F \
+ hntfaus.F \
+ hntfbu.F \
+ hpshgpw.F \
+ hrg2gg.F \
+ hrg2ggw.F \
+ hrg2ll.F \
+ hrg2llw.F \
+ hsp2gg.F \
+ hsp2gg2.F \
+ hsp2gg3.F \
+ hwts12.F \
+ hwtsll.F \
+ hwtslsm.F \
+ iafree.F \
+ iagcntl.F \
+ iaidef.F \
+ iainit.F \
+ iaintgg.F \
+ iaintll.F \
+ iaogdef.F \
+ iaoldef.F \
+ iarcntl.F \
+ iareset.F \
+ iarmem.F \
+ ibasini.F \
+ igalloc.F \
+ igbess.F \
+ igdins.F \
+ igdiwe.F \
+ igglat.F \
+ iggmem.F \
+ iggrid.F \
+ igint.F \
+ igintr.F \
+ iglgrid.F \
+ iglrev.F \
+ iglsize.F \
+ iglsm01.F \
+ iglsmb.F \
+ iglsmd.F \
+ iglsmr.F \
+ iglsmst.F \
+ ignorm.F \
+ igplsm.F \
+ igpoleg.F \
+ igpolew.F \
+ igprec.F \
+ igscan.F \
+ igsetup.F \
+ gasetup.F \
+ outrep.F \
+ gettru.F \
+ igsize.F \
+ igtog.F \
+ igtogr.F \
+ igtran.F \
+ init_cm.F \
+ insane.F \
+ intf.F \
+ intfa.F \
+ intfap.F \
+ intfau.F \
+ intfb.F \
+ intfbp.F \
+ intfbu.F \
+ intfc.F \
+ intin.F \
+ intisl.F \
+ intlog.F \
+ intlogd.F \
+ intlogr.F \
+ intocn.F \
+ intocnu.F \
+ intout.F \
+ intpnum.F \
+ intuvdh.F \
+ intuvf.F \
+ intuvgh.F \
+ intuvp.F \
+ intuvph.F \
+ intuvs.F \
+ intuvu.F \
+ intuvy.F \
+ intuvxh.F \
+ intvect.F \
+ intvecy.F \
+ intwave.F \
+ intwave2.F \
+ intwavu.F \
+ irdiwe.F \
+ irgmem.F \
+ irgrid.F \
+ irgtog.F \
+ irint.F \
+ irintr.F \
+ irlrev.F \
+ irlsmb.F \
+ irprec.F \
+ irscan.F \
+ irsize.F \
+ iscrsz.F \
+ islproc.F \
+ issame.F \
+ jacobi.F \
+ jagggp.F \
+ jallgp.F \
+ jallwn.F \
+ jdebug.F \
+ jfindfn.F \
+ jfindfn3.F \
+ jfindir.F \
+ jgetgg.F \
+ jgglat.F \
+ jintend.F \
+ jintgg.F \
+ jintll.F \
+ jjset99.F \
+ jmakgg.F \
+ jmakgg3.F \
+ jmakll.F \
+ jmakll3.F \
+ jmemhan.F \
+ jmemhan2.F \
+ jmkofgg.F \
+ jmovgg.F \
+ jmovll.F \
+ jmvugg.F \
+ jmvull.F \
+ jnorsgg.F \
+ jnumgg.F \
+ jnumggq.F \
+ jopngg.F \
+ jopnggf.F \
+ jopnll.F \
+ jopnllf.F \
+ jreadgg.F \
+ jreadll.F \
+ jsgggp.F \
+ jsh2sh.F \
+ jsllgp.F \
+ jspleg1.F \
+ jsppole.F \
+ jstrll.F \
+ jstrwll.F \
+ jsymgg.F \
+ jsymll.F \
+ juvpole.F \
+ jvod2uv.F \
+ jwindll.F \
+ jwscal.F \
+ kintrg.F \
+ knfrom4.F \
+ krg2rg.F \
+ krg2rgu.F \
+ krg2rgz.F \
+ krg2rgd.F \
+ krg2rgy.F \
+ lgrpr4.F \
+ ll2xyz.F \
+ lrekam.F \
+ lsmfld.F \
+ lsm_red.F \
+ mkbitmp.F \
+ makerl.F \
+ mkframe.F \
+ newisl.F \
+ ngintrp.F \
+ ngrotat.F \
+ ngvalue.F \
+ nmakgg.F \
+ nmakll.F \
+ nptwe32.F \
+ numptns.F \
+ numptwe.F \
+ oceanp.F \
+ oceanu.F \
+ pddefs.F \
+ precip.F \
+ qpassm.F \
+ reset_c.F \
+ rpassm.F \
+ rphi.F \
+ set99.F \
+ sprotat.F \
+ sscal.F \
+ strlat.F \
+ tatorgg.F \
+ w251idx.F \
+ waveidx.F \
+ wavexxx.F \
+ wavexx2.F \
+ wv2di32.F \
+ wv2didx.F \
+ wv2dint.F \
+ wv2dx32.F \
+ wv2dxxx.F \
+ wv2dxx2.F \
+ wvqlidx.F \
+ wvqlint.F \
+ wvqlin2.F \
+ xrotate.F \
+ xyz2ll.F \
+ outrep.F \
+ setrep.F \
+ global.F \
+ yrotate.F
+#
+
+SOURCES.c = \
+ emosPrecision.c \
+ fftchk.c \
+ gmapbit.c \
+ intlogs.c \
+ jindex.c \
+ jtimer.c \
+ makemap.c \
+ my_ialloc.c \
+ rddefs.c \
+ showmap.c \
+ soffset.c
diff --git a/interpolation/sources.FUJITSU b/interpolation/sources.FUJITSU
new file mode 100755
index 0000000..6dfacef
--- /dev/null
+++ b/interpolation/sources.FUJITSU
@@ -0,0 +1,283 @@
+HEADERS = \
+ current.h \
+ debug.h \
+ grdynam.h \
+ grfixed.h \
+ grspace.h \
+ intf.h \
+ intlog.h \
+ jparams.h \
+ memreq.h \
+ ouspace.h \
+ parim.h
+
+VECTOR.F = \
+ intfau.F \
+ jacobif.F \
+ jagggp.F \
+ jallgp.F \
+ jsgggp.F \
+ jsllgp.F \
+ jstrll.F \
+ jstrwll.F \
+ jsymgg.F \
+ jsymll.F \
+ jwindll.F \
+ rpassm.F \
+ sscal.F
+
+NO_OPT.F = dummy2.F
+
+
+SOURCES.F = \
+ areachk.F \
+ estima.F \
+ chkout.F \
+ auresol.F \
+ chequal.F \
+ chkprec.F \
+ clear_c.F \
+ csum.F \
+ ddstyle.F \
+ dssarea.F \
+ eulavgg.F \
+ fft99.F \
+ fixarea.F \
+ freecf.F \
+ funcs.F \
+ gb2gb.F \
+ getconf.F \
+ ggintrp.F \
+ ggrotat.F \
+ ggvalue.F \
+ hgengg.F \
+ hgengrd.F \
+ hgengrw.F \
+ hgenll.F \
+ hgenllw.F \
+ hgetlsm.F \
+ hirlam.F \
+ hirlamw.F \
+ hirlsm.F \
+ hll2ll.F \
+ hll2llw.F \
+ hll2xyz.F \
+ hnei12.F \
+ hneill.F \
+ hntfap.F \
+ hntfaph.F \
+ hntfaps.F \
+ hntfau.F \
+ hntfauh.F \
+ hntfaus.F \
+ hntfbu.F \
+ hpshgpw.F \
+ hrg2gg.F \
+ hrg2ggw.F \
+ hrg2ll.F \
+ hrg2llw.F \
+ hsp2gg.F \
+ hsp2gg2.F \
+ hsp2gg3.F \
+ hwts12.F \
+ hwtsll.F \
+ hwtslsm.F \
+ iafree.F \
+ iagcntl.F \
+ iaidef.F \
+ iainit.F \
+ iaintgg.F \
+ iaintll.F \
+ iaogdef.F \
+ iaoldef.F \
+ iarcntl.F \
+ iareset.F \
+ iarmem.F \
+ ibasini.F \
+ igalloc.F \
+ igbess.F \
+ igdins.F \
+ igdiwe.F \
+ igglat.F \
+ iggmem.F \
+ iggrid.F \
+ igint.F \
+ igintr.F \
+ iglgrid.F \
+ iglrev.F \
+ iglsize.F \
+ iglsm01.F \
+ iglsmb.F \
+ iglsmd.F \
+ iglsmr.F \
+ iglsmst.F \
+ ignorm.F \
+ igplsm.F \
+ igpoleg.F \
+ igpolew.F \
+ igprec.F \
+ igscan.F \
+ igsetup.F \
+ gasetup.F \
+ outrep.F \
+ gettru.F \
+ igsize.F \
+ igtog.F \
+ igtogr.F \
+ igtran.F \
+ init_cm.F \
+ insane.F \
+ intf.F \
+ intfa.F \
+ intfap.F \
+ intfb.F \
+ intfbp.F \
+ intfbu.F \
+ intfc.F \
+ intin.F \
+ intisl.F \
+ intlog.F \
+ intlogd.F \
+ intlogr.F \
+ intocn.F \
+ intocnu.F \
+ intout.F \
+ intpnum.F \
+ intuvdh.F \
+ intuvf.F \
+ intuvgh.F \
+ intuvp.F \
+ intuvph.F \
+ intuvs.F \
+ intuvu.F \
+ intuvy.F \
+ intuvxh.F \
+ intvect.F \
+ intvecy.F \
+ intwave.F \
+ intwave2.F \
+ intwavu.F \
+ irdiwe.F \
+ irgmem.F \
+ irgrid.F \
+ irgtog.F \
+ irint.F \
+ irintr.F \
+ irlrev.F \
+ irlsmb.F \
+ irprec.F \
+ irscan.F \
+ irsize.F \
+ iscrsz.F \
+ islproc.F \
+ issame.F \
+ jallwn.F \
+ jdebug.F \
+ jfindfn.F \
+ jfindfn3.F \
+ jfindir.F \
+ jgetgg.F \
+ jgglat.F \
+ jintend.F \
+ jintgg.F \
+ jintll.F \
+ jjset99.F \
+ jmakgg.F \
+ jmakgg3.F \
+ jmakll.F \
+ jmakll3.F \
+ jmemhan.F \
+ jmemhan2.F \
+ jmkofgg.F \
+ jmovgg.F \
+ jmovll.F \
+ jmvugg.F \
+ jmvull.F \
+ jnorsgg.F \
+ jnumgg.F \
+ jnumggq.F \
+ jopngg.F \
+ jopnggf.F \
+ jopnll.F \
+ jopnllf.F \
+ jreadgg.F \
+ jreadll.F \
+ jsh2sh.F \
+ jspleg1.F \
+ jsppole.F \
+ juvpole.F \
+ jvod2uv.F \
+ jwscal.F \
+ kintrg.F \
+ knfrom4.F \
+ krg2rg.F \
+ krg2rgu.F \
+ krg2rgz.F \
+ krg2rgd.F \
+ krg2rgy.F \
+ lgrpr4.F \
+ ll2xyz.F \
+ lrekam.F \
+ lsmfld.F \
+ lsm_red.F \
+ makerl.F \
+ mkbitmp.F \
+ mkframe.F \
+ newisl.F \
+ ngintrp.F \
+ ngrotat.F \
+ ngvalue.F \
+ nmakgg.F \
+ nmakll.F \
+ nptwe32.F \
+ numptns.F \
+ numptwe.F \
+ oceanp.F \
+ oceanu.F \
+ pddefs.F \
+ ppallow.F \
+ precip.F \
+ qpassm.F \
+ reset_c.F \
+ rphi.F \
+ set99.F \
+ sprotat.F \
+ strlat.F \
+ tatorgg.F \
+ zprec.F \
+ w251idx.F \
+ waveidx.F \
+ wavexxx.F \
+ wavexx2.F \
+ wv2di32.F \
+ wv2didx.F \
+ wv2dint.F \
+ wv2dppp.F \
+ wv2dx32.F \
+ wv2dxxx.F \
+ wv2dxx2.F \
+ wvqlidx.F \
+ wvqlint.F \
+ wvqlin2.F \
+ xrotate.F \
+ xyz2ll.F \
+ outrep.F \
+ setrep.F \
+ global.F \
+ yrotate.F
+
+SOURCES.c = \
+ emosPrecision.c \
+ fftchk.c \
+ gmapbit.c \
+ intlogs.c \
+ jchmod.c \
+ jindex.c \
+ jopnggsm.c \
+ jopnllsm.c \
+ jtimer.c \
+ makemap.c \
+ my_ialloc.c \
+ rddefs.c \
+ showmap.c \
+ soffset.c
diff --git a/interpolation/sources.VPP5000 b/interpolation/sources.VPP5000
new file mode 100755
index 0000000..417cc00
--- /dev/null
+++ b/interpolation/sources.VPP5000
@@ -0,0 +1,283 @@
+HEADERS= \
+ current.h \
+ debug.h \
+ grdynam.h \
+ grfixed.h \
+ grspace.h \
+ intf.h \
+ intlog.h \
+ jparams.h \
+ memreq.h \
+ ouspace.h \
+ parim.h
+
+VECTOR.F= \
+ intfau.F \
+ jacobif.F \
+ jagggp.F \
+ jallgp.F \
+ jsgggp.F \
+ jsllgp.F \
+ jstrll.F \
+ jstrwll.F \
+ jsymgg.F \
+ jsymll.F \
+ jwindll.F \
+ rpassm.F \
+ sscal.F
+
+NO_OPT.F=dummy2.F
+
+
+SOURCES.F= \
+ areachk.F \
+ estima.F \
+ chkout.F \
+ auresol.F \
+ chequal.F \
+ chkprec.F \
+ clear_c.F \
+ csum.F \
+ ddstyle.F \
+ dssarea.F \
+ eulavgg.F \
+ fft99.F \
+ fixarea.F \
+ freecf.F \
+ funcs.F \
+ gb2gb.F \
+ getconf.F \
+ ggintrp.F \
+ ggrotat.F \
+ ggvalue.F \
+ hgengg.F \
+ hgengrd.F \
+ hgengrw.F \
+ hgenll.F \
+ hgenllw.F \
+ hgetlsm.F \
+ hirlam.F \
+ hirlamw.F \
+ hirlsm.F \
+ hll2ll.F \
+ hll2llw.F \
+ hll2xyz.F \
+ hnei12.F \
+ hneill.F \
+ hntfap.F \
+ hntfaph.F \
+ hntfaps.F \
+ hntfau.F \
+ hntfauh.F \
+ hntfaus.F \
+ hntfbu.F \
+ hpshgpw.F \
+ hrg2gg.F \
+ hrg2ggw.F \
+ hrg2ll.F \
+ hrg2llw.F \
+ hsp2gg.F \
+ hsp2gg2.F \
+ hsp2gg3.F \
+ hwts12.F \
+ hwtsll.F \
+ hwtslsm.F \
+ iafree.F \
+ iagcntl.F \
+ iaidef.F \
+ iainit.F \
+ iaintgg.F \
+ iaintll.F \
+ iaogdef.F \
+ iaoldef.F \
+ iarcntl.F \
+ iareset.F \
+ iarmem.F \
+ ibasini.F \
+ igalloc.F \
+ igbess.F \
+ igdins.F \
+ igdiwe.F \
+ igglat.F \
+ iggmem.F \
+ iggrid.F \
+ igint.F \
+ igintr.F \
+ iglgrid.F \
+ iglrev.F \
+ iglsize.F \
+ iglsm01.F \
+ iglsmb.F \
+ iglsmd.F \
+ iglsmr.F \
+ iglsmst.F \
+ ignorm.F \
+ igplsm.F \
+ igpoleg.F \
+ igpolew.F \
+ igprec.F \
+ igscan.F \
+ igsetup.F \
+ gasetup.F \
+ outrep.F \
+ gettru.F \
+ igsize.F \
+ igtog.F \
+ igtogr.F \
+ igtran.F \
+ init_cm.F \
+ insane.F \
+ intf.F \
+ intfa.F \
+ intfap.F \
+ intfb.F \
+ intfbp.F \
+ intfbu.F \
+ intfc.F \
+ intin.F \
+ intisl.F \
+ intlog.F \
+ intlogd.F \
+ intlogr.F \
+ intocn.F \
+ intocnu.F \
+ intout.F \
+ intpnum.F \
+ intuvdh.F \
+ intuvf.F \
+ intuvgh.F \
+ intuvp.F \
+ intuvph.F \
+ intuvs.F \
+ intuvu.F \
+ intuvy.F \
+ intuvxh.F \
+ intvect.F \
+ intvecy.F \
+ intwave.F \
+ intwave2.F \
+ intwavu.F \
+ irdiwe.F \
+ irgmem.F \
+ irgrid.F \
+ irgtog.F \
+ irint.F \
+ irintr.F \
+ irlrev.F \
+ irlsmb.F \
+ irprec.F \
+ irscan.F \
+ irsize.F \
+ iscrsz.F \
+ islproc.F \
+ issame.F \
+ jallwn.F \
+ jdebug.F \
+ jfindfn.F \
+ jfindfn3.F \
+ jfindir.F \
+ jgetgg.F \
+ jgglat.F \
+ jintend.F \
+ jintgg.F \
+ jintll.F \
+ jjset99.F \
+ jmakgg.F \
+ jmakgg3.F \
+ jmakll.F \
+ jmakll3.F \
+ jmemhan.F \
+ jmemhan2.F \
+ jmkofgg.F \
+ jmovgg.F \
+ jmovll.F \
+ jmvugg.F \
+ jmvull.F \
+ jnorsgg.F \
+ jnumgg.F \
+ jnumggq.F \
+ jopngg.F \
+ jopnggf.F \
+ jopnll.F \
+ jopnllf.F \
+ jreadgg.F \
+ jreadll.F \
+ jsh2sh.F \
+ jspleg1.F \
+ jsppole.F \
+ juvpole.F \
+ jvod2uv.F \
+ jwscal.F \
+ kintrg.F \
+ knfrom4.F \
+ krg2rg.F \
+ krg2rgu.F \
+ krg2rgz.F \
+ krg2rgd.F \
+ krg2rgy.F \
+ lgrpr4.F \
+ ll2xyz.F \
+ lrekam.F \
+ lsmfld.F \
+ lsm_red.F \
+ makerl.F \
+ mkbitmp.F \
+ mkframe.F \
+ newisl.F \
+ ngintrp.F \
+ ngrotat.F \
+ ngvalue.F \
+ nmakgg.F \
+ nmakll.F \
+ nptwe32.F \
+ numptns.F \
+ numptwe.F \
+ oceanp.F \
+ oceanu.F \
+ pddefs.F \
+ ppallow.F \
+ precip.F \
+ qpassm.F \
+ reset_c.F \
+ rphi.F \
+ set99.F \
+ sprotat.F \
+ strlat.F \
+ tatorgg.F \
+ zprec.F \
+ w251idx.F \
+ waveidx.F \
+ wavexxx.F \
+ wavexx2.F \
+ wv2di32.F \
+ wv2didx.F \
+ wv2dint.F \
+ wv2dppp.F \
+ wv2dx32.F \
+ wv2dxxx.F \
+ wv2dxx2.F \
+ wvqlidx.F \
+ wvqlint.F \
+ wvqlin2.F \
+ xrotate.F \
+ xyz2ll.F \
+ outrep.F \
+ setrep.F \
+ global.F \
+ yrotate.F
+
+SOURCES.c= \
+ emosPrecision.c \
+ fftchk.c \
+ gmapbit.c \
+ intlogs.c \
+ jchmod.c \
+ jindex.c \
+ jopnggsm.c \
+ jopnllsm.c \
+ jtimer.c \
+ makemap.c \
+ my_ialloc.c \
+ rddefs.c \
+ showmap.c \
+ soffset.c
diff --git a/interpolation/sources.decalpha b/interpolation/sources.decalpha
new file mode 100755
index 0000000..68e7512
--- /dev/null
+++ b/interpolation/sources.decalpha
@@ -0,0 +1,280 @@
+HEADERS = \
+ current.h \
+ debug.h \
+ grfixed.h \
+ intf.h \
+ jparams.h \
+ ouspace.h \
+ grdynam.h \
+ grspace.h \
+ intlog.h \
+ memreq.h \
+ parim.h
+
+VECTOR.F = dummy.F
+
+NO_OPT.F = dummy2.F
+
+SOURCES.F = \
+ areachk.F \
+ estima.F \
+ chkout.F \
+ auresol.F \
+ chequal.F \
+ chkprec.F \
+ clear_c.F \
+ csum.F \
+ ddstyle.F \
+ dssarea.F \
+ eulavgg.F \
+ fft99.F \
+ fixarea.F \
+ freecf.F \
+ funcs.F \
+ gb2gb.F \
+ getconf.F \
+ ggintrp.F \
+ ggrotat.F \
+ ggvalue.F \
+ hgengg.F \
+ hgengrd.F \
+ hgengrw.F \
+ hgenll.F \
+ hgenllw.F \
+ hgetlsm.F \
+ hirlam.F \
+ hirlamw.F \
+ hirlsm.F \
+ hll2ll.F \
+ hll2llw.F \
+ hll2xyz.F \
+ hnei12.F \
+ hneill.F \
+ hntfap.F \
+ hntfaph.F \
+ hntfaps.F \
+ hntfau.F \
+ hntfauh.F \
+ hntfaus.F \
+ hntfbu.F \
+ hpshgpw.F \
+ hrg2gg.F \
+ hrg2ggw.F \
+ hrg2ll.F \
+ hrg2llw.F \
+ hsp2gg.F \
+ hsp2gg2.F \
+ hsp2gg3.F \
+ hwts12.F \
+ hwtsll.F \
+ hwtslsm.F \
+ iafree.F \
+ iagcntl.F \
+ iaidef.F \
+ iainit.F \
+ iaintgg.F \
+ iaintll.F \
+ iaogdef.F \
+ iaoldef.F \
+ iarcntl.F \
+ iareset.F \
+ iarmem.F \
+ ibasini.F \
+ igalloc.F \
+ igbess.F \
+ igdins.F \
+ igdiwe.F \
+ igglat.F \
+ iggmem.F \
+ iggrid.F \
+ igint.F \
+ igintr.F \
+ iglgrid.F \
+ iglrev.F \
+ iglsize.F \
+ iglsm01.F \
+ iglsmb.F \
+ iglsmd.F \
+ iglsmr.F \
+ iglsmst.F \
+ ignorm.F \
+ igplsm.F \
+ igpoleg.F \
+ igpolew.F \
+ igprec.F \
+ igscan.F \
+ igsetup.F \
+ gasetup.F \
+ outrep.F \
+ gettru.F \
+ igsize.F \
+ igtog.F \
+ igtogr.F \
+ igtran.F \
+ init_cm.F \
+ insane.F \
+ intf.F \
+ intfa.F \
+ intfap.F \
+ intfau.F \
+ intfb.F \
+ intfbp.F \
+ intfbu.F \
+ intfc.F \
+ intin.F \
+ intisl.F \
+ intlog.F \
+ intlogd.F \
+ intlogr.F \
+ intocn.F \
+ intocnu.F \
+ intout.F \
+ intpnum.F \
+ intuvdh.F \
+ intuvf.F \
+ intuvgh.F \
+ intuvp.F \
+ intuvph.F \
+ intuvs.F \
+ intuvu.F \
+ intuvy.F \
+ intuvxh.F \
+ intvect.F \
+ intvecy.F \
+ intwave.F \
+ intwave2.F \
+ intwavu.F \
+ irdiwe.F \
+ irgmem.F \
+ irgrid.F \
+ irgtog.F \
+ irint.F \
+ irintr.F \
+ irlrev.F \
+ irlsmb.F \
+ irprec.F \
+ irscan.F \
+ irsize.F \
+ iscrsz.F \
+ islproc.F \
+ issame.F \
+ jacobi.F \
+ jagggp.F \
+ jallgp.F \
+ jallwn.F \
+ jdebug.F \
+ jfindfn.F \
+ jfindfn3.F \
+ jfindir.F \
+ jgetgg.F \
+ jgglat.F \
+ jintend.F \
+ jintgg.F \
+ jintll.F \
+ jjset99.F \
+ jmakgg.F \
+ jmakgg3.F \
+ jmakll.F \
+ jmakll3.F \
+ jmemhan.F \
+ jmemhan2.F \
+ jmkofgg.F \
+ jmovgg.F \
+ jmovll.F \
+ jmvugg.F \
+ jmvull.F \
+ jnorsgg.F \
+ jnumgg.F \
+ jnumggq.F \
+ jopngg.F \
+ jopnggf.F \
+ jopnll.F \
+ jopnllf.F \
+ jreadgg.F \
+ jreadll.F \
+ jsgggp.F \
+ jsh2sh.F \
+ jsllgp.F \
+ jspleg1.F \
+ jsppole.F \
+ jstrll.F \
+ jstrwll.F \
+ jsymgg.F \
+ jsymll.F \
+ juvpole.F \
+ jvod2uv.F \
+ jwindll.F \
+ jwscal.F \
+ kintrg.F \
+ knfrom4.F \
+ krg2rg.F \
+ krg2rgu.F \
+ krg2rgz.F \
+ krg2rgd.F \
+ krg2rgy.F \
+ lgrpr4.F \
+ ll2xyz.F \
+ lrekam.F \
+ lsmfld.F \
+ lsm_red.F \
+ makerl.F \
+ mkbitmp.F \
+ mkframe.F \
+ newisl.F \
+ ngintrp.F \
+ ngrotat.F \
+ ngvalue.F \
+ nmakgg.F \
+ nmakll.F \
+ nptwe32.F \
+ numptns.F \
+ numptwe.F \
+ oceanp.F \
+ oceanu.F \
+ pddefs.F \
+ precip.F \
+ qpassm.F \
+ reset_c.F \
+ rpassm.F \
+ rphi.F \
+ set99.F \
+ sprotat.F \
+ sscal.F \
+ strlat.F \
+ tatorgg.F \
+ zprec.F \
+ w251idx.F \
+ waveidx.F \
+ wavexxx.F \
+ wavexx2.F \
+ wv2di32.F \
+ wv2didx.F \
+ wv2dint.F \
+ wv2dx32.F \
+ wv2dxxx.F \
+ wv2dxx2.F \
+ wvqlidx.F \
+ wvqlint.F \
+ wvqlin2.F \
+ xrotate.F \
+ xyz2ll.F \
+ outrep.F \
+ setrep.F \
+ global.F \
+ yrotate.F
+
+SOURCES.c = \
+ emosPrecision.c \
+ fftchk.c \
+ gmapbit.c \
+ intlogs.c \
+ jchmod.c \
+ jindex.c \
+ jopnggsm.c \
+ jopnllsm.c \
+ jtimer.c \
+ makemap.c \
+ my_ialloc.c \
+ rddefs.c \
+ showmap.c \
+ soffset.c
diff --git a/interpolation/sources.decmips b/interpolation/sources.decmips
new file mode 100755
index 0000000..fa7346d
--- /dev/null
+++ b/interpolation/sources.decmips
@@ -0,0 +1,281 @@
+
+HEADERS = \
+ current.h \
+ debug.h \
+ grfixed.h \
+ intf.h \
+ jparams.h \
+ ouspace.h \
+ grdynam.h \
+ grspace.h \
+ intlog.h \
+ memreq.h \
+ parim.h
+
+VECTOR.F = dummy.F
+
+NO_OPT.F = dummy2.F
+
+SOURCES.F = \
+ areachk.F \
+ estima.F \
+ chkout.F \
+ auresol.F \
+ chequal.F \
+ chkprec.F \
+ clear_c.F \
+ csum.F \
+ ddstyle.F \
+ dssarea.F \
+ eulavgg.F \
+ fft99.F \
+ fixarea.F \
+ freecf.F \
+ funcs.F \
+ gb2gb.F \
+ getconf.F \
+ ggintrp.F \
+ ggrotat.F \
+ ggvalue.F \
+ hgengg.F \
+ hgengrd.F \
+ hgengrw.F \
+ hgenll.F \
+ hgenllw.F \
+ hgetlsm.F \
+ hirlam.F \
+ hirlamw.F \
+ hirlsm.F \
+ hll2ll.F \
+ hll2llw.F \
+ hll2xyz.F \
+ hnei12.F \
+ hneill.F \
+ hntfap.F \
+ hntfaph.F \
+ hntfaps.F \
+ hntfau.F \
+ hntfauh.F \
+ hntfaus.F \
+ hntfbu.F \
+ hpshgpw.F \
+ hrg2gg.F \
+ hrg2ggw.F \
+ hrg2ll.F \
+ hrg2llw.F \
+ hsp2gg.F \
+ hsp2gg2.F \
+ hsp2gg3.F \
+ hwts12.F \
+ hwtsll.F \
+ hwtslsm.F \
+ iafree.F \
+ iagcntl.F \
+ iaidef.F \
+ iainit.F \
+ iaintgg.F \
+ iaintll.F \
+ iaogdef.F \
+ iaoldef.F \
+ iarcntl.F \
+ iareset.F \
+ iarmem.F \
+ ibasini.F \
+ igalloc.F \
+ igbess.F \
+ igdins.F \
+ igdiwe.F \
+ igglat.F \
+ iggmem.F \
+ iggrid.F \
+ igint.F \
+ igintr.F \
+ iglgrid.F \
+ iglrev.F \
+ iglsize.F \
+ iglsm01.F \
+ iglsmb.F \
+ iglsmd.F \
+ iglsmr.F \
+ iglsmst.F \
+ ignorm.F \
+ igplsm.F \
+ igpoleg.F \
+ igpolew.F \
+ igprec.F \
+ igscan.F \
+ igsetup.F \
+ gasetup.F \
+ outrep.F \
+ gettru.F \
+ igsize.F \
+ igtog.F \
+ igtogr.F \
+ igtran.F \
+ init_cm.F \
+ insane.F \
+ intf.F \
+ intfa.F \
+ intfap.F \
+ intfau.F \
+ intfb.F \
+ intfbp.F \
+ intfbu.F \
+ intfc.F \
+ intin.F \
+ intisl.F \
+ intlog.F \
+ intlogd.F \
+ intlogr.F \
+ intocn.F \
+ intocnu.F \
+ intout.F \
+ intpnum.F \
+ intuvdh.F \
+ intuvf.F \
+ intuvgh.F \
+ intuvp.F \
+ intuvph.F \
+ intuvs.F \
+ intuvu.F \
+ intuvy.F \
+ intuvxh.F \
+ intvect.F \
+ intvecy.F \
+ intwave.F \
+ intwave2.F \
+ intwavu.F \
+ irdiwe.F \
+ irgmem.F \
+ irgrid.F \
+ irgtog.F \
+ irint.F \
+ irintr.F \
+ irlrev.F \
+ irlsmb.F \
+ irprec.F \
+ irscan.F \
+ irsize.F \
+ iscrsz.F \
+ islproc.F \
+ issame.F \
+ jacobi.F \
+ jagggp.F \
+ jallgp.F \
+ jallwn.F \
+ jdebug.F \
+ jfindfn.F \
+ jfindfn3.F\
+ jfindir.F \
+ jgetgg.F \
+ jgglat.F \
+ jintend.F \
+ jintgg.F \
+ jintll.F \
+ jjset99.F \
+ jmakgg.F \
+ jmakgg3.F \
+ jmakll.F \
+ jmakll3.F \
+ jmemhan.F \
+ jmemhan2.F \
+ jmkofgg.F \
+ jmovgg.F \
+ jmovll.F \
+ jmvugg.F \
+ jmvull.F \
+ jnorsgg.F \
+ jnumgg.F \
+ jnumggq.F \
+ jopngg.F \
+ jopnggf.F \
+ jopnll.F \
+ jopnllf.F \
+ jreadgg.F \
+ jreadll.F \
+ jsgggp.F \
+ jsh2sh.F \
+ jsllgp.F \
+ jspleg1.F \
+ jsppole.F \
+ jstrll.F \
+ jstrwll.F \
+ jsymgg.F \
+ jsymll.F \
+ juvpole.F \
+ jvod2uv.F \
+ jwindll.F \
+ jwscal.F \
+ kintrg.F \
+ knfrom4.F \
+ krg2rg.F \
+ krg2rgu.F \
+ krg2rgz.F \
+ krg2rgd.F \
+ krg2rgy.F \
+ lgrpr4.F \
+ ll2xyz.F \
+ lrekam.F \
+ lsmfld.F \
+ lsm_red.F \
+ makerl.F \
+ mkbitmp.F \
+ mkframe.F \
+ newisl.F \
+ ngintrp.F \
+ ngrotat.F \
+ ngvalue.F \
+ nmakgg.F \
+ nmakll.F \
+ nptwe32.F \
+ numptns.F \
+ numptwe.F \
+ oceanp.F \
+ oceanu.F \
+ pddefs.F \
+ precip.F \
+ qpassm.F \
+ reset_c.F \
+ rpassm.F \
+ rphi.F \
+ set99.F \
+ sprotat.F \
+ sscal.F \
+ strlat.F \
+ tatorgg.F \
+ zprec.F \
+ w251idx.F \
+ waveidx.F \
+ wavexxx.F \
+ wavexx2.F \
+ wv2di32.F \
+ wv2didx.F \
+ wv2dint.F \
+ wv2dx32.F \
+ wv2dxxx.F \
+ wv2dxx2.F \
+ wvqlidx.F \
+ wvqlint.F \
+ wvqlin2.F \
+ xrotate.F \
+ xyz2ll.F \
+ outrep.F \
+ setrep.F \
+ global.F \
+ yrotate.F
+
+SOURCES.c = \
+ emosPrecision.c \
+ fftchk.c \
+ gmapbit.c \
+ intlogs.c \
+ jchmod.c \
+ jindex.c \
+ jopnggsm.c \
+ jopnllsm.c \
+ jtimer.c \
+ makemap.c \
+ my_ialloc.c \
+ rddefs.c \
+ showmap.c \
+ soffset.c
diff --git a/interpolation/sources.hp b/interpolation/sources.hp
new file mode 100755
index 0000000..beccd89
--- /dev/null
+++ b/interpolation/sources.hp
@@ -0,0 +1,281 @@
+
+HEADERS = \
+ current.h \
+ debug.h \
+ grfixed.h \
+ intf.h \
+ jparams.h \
+ ouspace.h \
+ grdynam.h \
+ grspace.h \
+ intlog.h \
+ memreq.h \
+ parim.h
+
+VECTOR.F = dummy.F
+
+NO_OPT.F = \
+ jjset99.F
+
+SOURCES.F = \
+ areachk.F \
+ estima.F \
+ chkout.F \
+ auresol.F \
+ chequal.F \
+ chkprec.F \
+ clear_c.F \
+ csum.F \
+ ddstyle.F \
+ dssarea.F \
+ eulavgg.F \
+ fft99.F \
+ fixarea.F \
+ freecf.F \
+ funcs.F \
+ gb2gb.F \
+ getconf.F \
+ ggintrp.F \
+ ggrotat.F \
+ ggvalue.F \
+ hgengg.F \
+ hgengrd.F \
+ hgengrw.F \
+ hgenll.F \
+ hgenllw.F \
+ hgetlsm.F \
+ hirlam.F \
+ hirlamw.F \
+ hirlsm.F \
+ hll2ll.F \
+ hll2llw.F \
+ hll2xyz.F \
+ hnei12.F \
+ hneill.F \
+ hntfap.F \
+ hntfaph.F \
+ hntfaps.F \
+ hntfau.F \
+ hntfauh.F \
+ hntfaus.F \
+ hntfbu.F \
+ hpshgpw.F \
+ hrg2gg.F \
+ hrg2ggw.F \
+ hrg2ll.F \
+ hrg2llw.F \
+ hsp2gg.F \
+ hsp2gg2.F \
+ hsp2gg3.F \
+ hwts12.F \
+ hwtsll.F \
+ hwtslsm.F \
+ iafree.F \
+ iagcntl.F \
+ iaidef.F \
+ iainit.F \
+ iaintgg.F \
+ iaintll.F \
+ iaogdef.F \
+ iaoldef.F \
+ iarcntl.F \
+ iareset.F \
+ iarmem.F \
+ ibasini.F \
+ igalloc.F \
+ igbess.F \
+ igdins.F \
+ igdiwe.F \
+ igglat.F \
+ iggmem.F \
+ iggrid.F \
+ igint.F \
+ igintr.F \
+ iglgrid.F \
+ iglrev.F \
+ iglsize.F \
+ iglsm01.F \
+ iglsmb.F \
+ iglsmd.F \
+ iglsmr.F \
+ iglsmst.F \
+ ignorm.F \
+ igplsm.F \
+ igpoleg.F \
+ igpolew.F \
+ igprec.F \
+ igscan.F \
+ igsetup.F \
+ gasetup.F \
+ outrep.F \
+ gettru.F \
+ igsize.F \
+ igtog.F \
+ igtogr.F \
+ igtran.F \
+ init_cm.F \
+ insane.F \
+ intf.F \
+ intfa.F \
+ intfap.F \
+ intfau.F \
+ intfb.F \
+ intfbp.F \
+ intfbu.F \
+ intfc.F \
+ intin.F \
+ intisl.F \
+ intlog.F \
+ intlogd.F \
+ intlogr.F \
+ intocn.F \
+ intocnu.F \
+ intout.F \
+ intpnum.F \
+ intuvdh.F \
+ intuvf.F \
+ intuvgh.F \
+ intuvp.F \
+ intuvph.F \
+ intuvs.F \
+ intuvu.F \
+ intuvy.F \
+ intuvxh.F \
+ intvect.F \
+ intvecy.F \
+ intwave.F \
+ intwave2.F \
+ intwavu.F \
+ irdiwe.F \
+ irgmem.F \
+ irgrid.F \
+ irgtog.F \
+ irint.F \
+ irintr.F \
+ irlrev.F \
+ irlsmb.F \
+ irprec.F \
+ irscan.F \
+ irsize.F \
+ iscrsz.F \
+ islproc.F \
+ issame.F \
+ jacobi.F \
+ jagggp.F \
+ jallgp.F \
+ jallwn.F \
+ jdebug.F \
+ jfindfn.F \
+ jfindfn3.F \
+ jfindir.F \
+ jgetgg.F \
+ jgglat.F \
+ jintend.F \
+ jintgg.F \
+ jintll.F \
+ jmakgg.F \
+ jmakgg3.F \
+ jmakll.F \
+ jmakll3.F \
+ jmemhan.F \
+ jmemhan2.F \
+ jmkofgg.F \
+ jmovgg.F \
+ jmovll.F \
+ jmvugg.F \
+ jmvull.F \
+ jnorsgg.F \
+ jnumgg.F \
+ jnumggq.F \
+ jopngg.F \
+ jopnggf.F \
+ jopnll.F \
+ jopnllf.F \
+ jreadgg.F \
+ jreadll.F \
+ jsgggp.F \
+ jsh2sh.F \
+ jsllgp.F \
+ jspleg1.F \
+ jsppole.F \
+ jstrll.F \
+ jstrwll.F \
+ jsymgg.F \
+ jsymll.F \
+ juvpole.F \
+ jvod2uv.F \
+ jwindll.F \
+ jwscal.F \
+ kintrg.F \
+ knfrom4.F \
+ krg2rg.F \
+ krg2rgu.F \
+ krg2rgz.F \
+ krg2rgd.F \
+ krg2rgy.F \
+ lgrpr4.F \
+ ll2xyz.F \
+ lrekam.F \
+ lsmfld.F \
+ lsm_red.F \
+ makerl.F \
+ mkbitmp.F \
+ mkframe.F \
+ newisl.F \
+ ngintrp.F \
+ ngrotat.F \
+ ngvalue.F \
+ nmakgg.F \
+ nmakll.F \
+ nptwe32.F \
+ numptns.F \
+ numptwe.F \
+ oceanp.F \
+ oceanu.F \
+ pddefs.F \
+ precip.F \
+ qpassm.F \
+ reset_c.F \
+ rpassm.F \
+ rphi.F \
+ set99.F \
+ sprotat.F \
+ sscal.F \
+ strlat.F \
+ tatorgg.F \
+ zprec.F \
+ w251idx.F \
+ waveidx.F \
+ wavexxx.F \
+ wavexx2.F \
+ wv2di32.F \
+ wv2didx.F \
+ wv2dint.F \
+ wv2dx32.F \
+ wv2dxxx.F \
+ wv2dxx2.F \
+ wvqlidx.F \
+ wvqlint.F \
+ wvqlin2.F \
+ xrotate.F \
+ xyz2ll.F \
+ outrep.F \
+ setrep.F \
+ global.F \
+ yrotate.F
+
+SOURCES.c = \
+ emosPrecision.c \
+ fftchk.c \
+ gmapbit.c \
+ intlogs.c \
+ jchmod.c \
+ jindex.c \
+ jopnggsm.c \
+ jopnllsm.c \
+ jtimer.c \
+ makemap.c \
+ my_ialloc.c \
+ rddefs.c \
+ showmap.c \
+ soffset.c
diff --git a/interpolation/sources.hpia64 b/interpolation/sources.hpia64
new file mode 100755
index 0000000..2f4680c
--- /dev/null
+++ b/interpolation/sources.hpia64
@@ -0,0 +1,284 @@
+
+HEADERS = \
+ current.h \
+ debug.h \
+ grfixed.h \
+ intf.h \
+ jparams.h \
+ ouspace.h \
+ grdynam.h \
+ grspace.h \
+ intlog.h \
+ memreq.h \
+ parim.h
+
+VECTOR.F = dummy.F
+
+NO_OPT.F = \
+ jjset99.F
+
+SOURCES.F = \
+ areachk.F \
+ estima.F \
+ chkout.F \
+ auresol.F \
+ chequal.F \
+ chkprec.F \
+ clear_c.F \
+ csum.F \
+ ddstyle.F \
+ dssarea.F \
+ eulavgg.F \
+ fft99.F \
+ fixarea.F \
+ freecf.F \
+ funcs.F \
+ gb2gb.F \
+ getconf.F \
+ ggintrp.F \
+ ggrotat.F \
+ ggvalue.F \
+ hgengg.F \
+ hgengrd.F \
+ hgengrw.F \
+ hgenll.F \
+ hgenllw.F \
+ hgetlsm.F \
+ hirlam.F \
+ hirlamw.F \
+ hirlsm.F \
+ hll2ll.F \
+ hll2llw.F \
+ hll2xyz.F \
+ hnei12.F \
+ hneill.F \
+ hntfap.F \
+ hntfaph.F \
+ hntfaps.F \
+ hntfau.F \
+ hntfauh.F \
+ hntfaus.F \
+ hntfbu.F \
+ hpshgpw.F \
+ hrg2gg.F \
+ hrg2ggw.F \
+ hrg2ll.F \
+ hrg2llw.F \
+ hsp2gg.F \
+ hsp2gg2.F \
+ hsp2gg3.F \
+ hwts12.F \
+ hwtsll.F \
+ hwtslsm.F \
+ iafree.F \
+ iagcntl.F \
+ iaidef.F \
+ iainit.F \
+ iaintgg.F \
+ iaintll.F \
+ iaogdef.F \
+ iaoldef.F \
+ iarcntl.F \
+ iareset.F \
+ iarmem.F \
+ ibasini.F \
+ igalloc.F \
+ igbess.F \
+ igdins.F \
+ igdiwe.F \
+ igglat.F \
+ iggmem.F \
+ iggrid.F \
+ igint.F \
+ igintr.F \
+ iglgrid.F \
+ iglrev.F \
+ iglsize.F \
+ iglsm01.F \
+ iglsmb.F \
+ iglsmd.F \
+ iglsmr.F \
+ iglsmst.F \
+ ignorm.F \
+ igplsm.F \
+ igpoleg.F \
+ igpolew.F \
+ igprec.F \
+ igscan.F \
+ igsetup.F \
+ gasetup.F \
+ outrep.F \
+ gettru.F \
+ igsize.F \
+ igtog.F \
+ igtogr.F \
+ igtran.F \
+ init_cm.F \
+ insane.F \
+ intf.F \
+ intfa.F \
+ intfap.F \
+ intfau.F \
+ intfb.F \
+ intfbp.F \
+ intfbu.F \
+ intfc.F \
+ intin.F \
+ intisl.F \
+ intlog.F \
+ intlogd.F \
+ intlogr.F \
+ intocn.F \
+ intocnu.F \
+ intout.F \
+ intpnum.F \
+ intuvdh.F \
+ intuvf.F \
+ intuvgh.F \
+ intuvp.F \
+ intuvph.F \
+ intuvs.F \
+ intuvu.F \
+ intuvy.F \
+ intuvxh.F \
+ intvect.F \
+ intvecy.F \
+ intwave.F \
+ intwave2.F \
+ intwavu.F \
+ irdiwe.F \
+ irgmem.F \
+ irgrid.F \
+ irgtog.F \
+ irint.F \
+ irintr.F \
+ irlrev.F \
+ irlsmb.F \
+ irprec.F \
+ irscan.F \
+ irsize.F \
+ iscrsz.F \
+ islproc.F \
+ issame.F \
+ jacobi.F \
+ jagggp.F \
+ jallgp.F \
+ jallwn.F \
+ jdebug.F \
+ jfindfn.F \
+ jfindfn3.F \
+ jfindir.F \
+ jgetgg.F \
+ jgglat.F \
+ jintend.F \
+ jintgg.F \
+ jintll.F \
+ jmakgg.F \
+ jmakgg3.F \
+ jmakll.F \
+ jmakll3.F \
+ jmemhan.F \
+ jmemhan2.F \
+ jmkofgg.F \
+ jmovgg.F \
+ jmovll.F \
+ jmvugg.F \
+ jmvull.F \
+ jnorsgg.F \
+ jnumgg.F \
+ jnumggq.F \
+ jopngg.F \
+ jopnggf.F \
+ jopnll.F \
+ jopnllf.F \
+ jreadgg.F \
+ jreadll.F \
+ jsgggp.F \
+ jsh2sh.F \
+ jsllgp.F \
+ jspleg1.F \
+ jsppole.F \
+ jstrll.F \
+ jstrwll.F \
+ jsymgg.F \
+ jsymll.F \
+ juvpole.F \
+ jvod2uv.F \
+ jwindll.F \
+ jwscal.F \
+ kintrg.F \
+ knfrom4.F \
+ krg2rg.F \
+ krg2rgu.F \
+ krg2rgz.F \
+ krg2rgd.F \
+ krg2rgy.F \
+ lgrpr4.F \
+ ll2xyz.F \
+ lrekam.F \
+ lsmfld.F \
+ lsm_red.F \
+ makerl.F \
+ mkbitmp.F \
+ mkframe.F \
+ newisl.F \
+ ngintrp.F \
+ ngrotat.F \
+ ngvalue.F \
+ nmakgg.F \
+ nmakll.F \
+ nptwe32.F \
+ numptns.F \
+ numptwe.F \
+ oceanp.F \
+ oceanu.F \
+ pddefs.F \
+ precip.F \
+ qpassm.F \
+ reset_c.F \
+ rpassm.F \
+ rphi.F \
+ set99.F \
+ sprotat.F \
+ sscal.F \
+ strlat.F \
+ tatorgg.F \
+ zprec.F \
+ w251idx.F \
+ waveidx.F \
+ wavexxx.F \
+ wavexx2.F \
+ wv2di32.F \
+ wv2didx.F \
+ wv2dint.F \
+ wv2dx32.F \
+ wv2dxxx.F \
+ wv2dxx2.F \
+ wvqlidx.F \
+ wvqlint.F \
+ wvqlin2.F \
+ xrotate.F \
+ xyz2ll.F \
+ outrep.F \
+ setrep.F \
+ global.F \
+ yrotate.F
+
+SOURCES.c = \
+ emosPrecision.c \
+ sharedll.c \
+ sharedgg.c \
+ fftchk.c \
+ gmapbit.c \
+ intlogs.c \
+ jchmod.c \
+ jindex.c \
+ jopnggsm.c \
+ jopnllsm.c \
+ jtimer.c \
+ makemap.c \
+ my_ialloc.c \
+ rddefs.c \
+ rename_unlink.c \
+ showmap.c \
+ soffset.c
diff --git a/interpolation/sources.hppa b/interpolation/sources.hppa
new file mode 100755
index 0000000..f882a22
--- /dev/null
+++ b/interpolation/sources.hppa
@@ -0,0 +1,281 @@
+
+HEADERS = \
+ current.h \
+ debug.h \
+ grfixed.h \
+ intf.h \
+ jparams.h \
+ ouspace.h \
+ grdynam.h \
+ grspace.h \
+ intlog.h \
+ memreq.h \
+ parim.h
+
+VECTOR.F = dummy.F
+
+NO_OPT.F = \
+ jjset99.F
+
+SOURCES.F = \
+ areachk.F \
+ estima.F \
+ chkout.F \
+ auresol.F \
+ chequal.F \
+ chkprec.F \
+ clear_c.F \
+ csum.F \
+ ddstyle.F \
+ dssarea.F \
+ eulavgg.F \
+ fft99.F \
+ fixarea.F \
+ freecf.F \
+ funcs.F \
+ gb2gb.F \
+ getconf.F \
+ ggintrp.F \
+ ggrotat.F \
+ ggvalue.F \
+ hgengg.F \
+ hgengrd.F \
+ hgengrw.F \
+ hgenll.F \
+ hgenllw.F \
+ hgetlsm.F \
+ hirlam.F \
+ hirlamw.F \
+ hirlsm.F \
+ hll2ll.F \
+ hll2llw.F \
+ hll2xyz.F \
+ hnei12.F \
+ hneill.F \
+ hntfap.F \
+ hntfaph.F \
+ hntfaps.F \
+ hntfau.F \
+ hntfauh.F \
+ hntfaus.F \
+ hntfbu.F \
+ hpshgpw.F \
+ hrg2gg.F \
+ hrg2ggw.F \
+ hrg2ll.F \
+ hrg2llw.F \
+ hsp2gg.F \
+ hsp2gg2.F \
+ hsp2gg3.F \
+ hwts12.F \
+ hwtsll.F \
+ hwtslsm.F \
+ iafree.F \
+ iagcntl.F \
+ iaidef.F \
+ iainit.F \
+ iaintgg.F \
+ iaintll.F \
+ iaogdef.F \
+ iaoldef.F \
+ iarcntl.F \
+ iareset.F \
+ iarmem.F \
+ ibasini.F \
+ igalloc.F \
+ igbess.F \
+ igdins.F \
+ igdiwe.F \
+ igglat.F \
+ iggmem.F \
+ iggrid.F \
+ igint.F \
+ igintr.F \
+ iglgrid.F \
+ iglrev.F \
+ iglsize.F \
+ iglsm01.F \
+ iglsmb.F \
+ iglsmd.F \
+ iglsmr.F \
+ iglsmst.F \
+ ignorm.F \
+ igplsm.F \
+ igpoleg.F \
+ igpolew.F \
+ igprec.F \
+ igscan.F \
+ igsetup.F \
+ gasetup.F \
+ outrep.F \
+ gettru.F \
+ igsize.F \
+ igtog.F \
+ igtogr.F \
+ igtran.F \
+ init_cm.F \
+ insane.F \
+ intf.F \
+ intfa.F \
+ intfap.F \
+ intfau.F \
+ intfb.F \
+ intfbp.F \
+ intfbu.F \
+ intfc.F \
+ intin.F \
+ intisl.F \
+ intlog.F \
+ intlogd.F \
+ intlogr.F \
+ intocn.F \
+ intocnu.F \
+ intout.F \
+ intpnum.F \
+ intuvdh.F \
+ intuvf.F \
+ intuvgh.F \
+ intuvp.F \
+ intuvph.F \
+ intuvs.F \
+ intuvu.F \
+ intuvy.F \
+ intuvxh.F \
+ intvect.F \
+ intvecy.F \
+ intwave.F \
+ intwave2.F \
+ intwavu.F \
+ irdiwe.F \
+ irgmem.F \
+ irgrid.F \
+ irgtog.F \
+ irint.F \
+ irintr.F \
+ irlrev.F \
+ irlsmb.F \
+ irprec.F \
+ irscan.F \
+ irsize.F \
+ iscrsz.F \
+ islproc.F \
+ issame.F \
+ jacobi.F \
+ jagggp.F \
+ jallgp.F \
+ jallwn.F \
+ jdebug.F \
+ jfindfn.F \
+ jfindfn3.F \
+ jfindir.F \
+ jgetgg.F \
+ jgglat.F \
+ jintend.F \
+ jintgg.F \
+ jintll.F \
+ jmakgg.F \
+ jmakgg3.F \
+ jmakll.F \
+ jmakll3.F \
+ jmemhan.F \
+ jmemhan2.F \
+ jmkofgg.F \
+ jmovgg.F \
+ jmovll.F \
+ jmvugg.F \
+ jmvull.F \
+ jnorsgg.F \
+ jnumgg.F \
+ jnumggq.F \
+ jopngg.F \
+ jopnggf.F \
+ jopnll.F \
+ jopnllf.F \
+ jreadgg.F \
+ jreadll.F \
+ jsgggp.F \
+ jsh2sh.F \
+ jsllgp.F \
+ jspleg1.F \
+ jsppole.F \
+ jstrll.F \
+ jstrwll.F \
+ jsymgg.F \
+ jsymll.F \
+ juvpole.F \
+ jvod2uv.F \
+ jwindll.F \
+ jwscal.F \
+ kintrg.F \
+ knfrom4.F \
+ krg2rg.F \
+ krg2rgu.F \
+ krg2rgz.F \
+ krg2rgd.F \
+ krg2rgy.F \
+ lgrpr4.F \
+ ll2xyz.F \
+ lrekam.F \
+ lsmfld.F \
+ lsm_red.F \
+ makerl.F \
+ mkbitmp.F \
+ mkframe.F \
+ newisl.F \
+ ngintrp.F \
+ ngrotat.F \
+ ngvalue.F \
+ nmakgg.F \
+ nmakll.F \
+ nptwe32.F \
+ numptns.F \
+ numptwe.F \
+ oceanp.F \
+ oceanu.F \
+ pddefs.F \
+ precip.F \
+ qpassm.F \
+ reset_c.F \
+ rpassm.F \
+ rphi.F \
+ set99.F \
+ sprotat.F \
+ sscal.F \
+ strlat.F \
+ tatorgg.F \
+ zprec.F \
+ w251idx.F \
+ waveidx.F \
+ wavexxx.F \
+ wavexx2.F \
+ wv2di32.F \
+ wv2didx.F \
+ wv2dint.F \
+ wv2dx32.F \
+ wv2dxxx.F \
+ wv2dxx2.F \
+ wvqlidx.F \
+ wvqlint.F \
+ wvqlin2.F \
+ xrotate.F \
+ xyz2ll.F \
+ outrep.F \
+ setrep.F \
+ global.F \
+ yrotate.F
+
+SOURCES.c = \
+ emosPrecision.c \
+ fftchk.c \
+ gmapbit.c \
+ intlogs.c \
+ jchmod.c \
+ jindex.c \
+ jopnggsm.c \
+ jopnllsm.c \
+ jtimer.c \
+ makemap.c \
+ my_ialloc.c \
+ rddefs.c \
+ showmap.c \
+ soffset.c
diff --git a/interpolation/sources.ibm_power4 b/interpolation/sources.ibm_power4
new file mode 100755
index 0000000..6f215dd
--- /dev/null
+++ b/interpolation/sources.ibm_power4
@@ -0,0 +1,287 @@
+
+HEADERS = \
+ current.h \
+ debug.h \
+ grfixed.h \
+ intf.h \
+ jparams.h \
+ ouspace.h \
+ grdynam.h \
+ grspace.h \
+ intlog.h \
+ memreq.h \
+ parim.h
+
+VECTOR.F = dummy.F
+
+NO_OPT.F = dummy2.F
+
+SOURCES.F = \
+ areachk.F \
+ estima.F \
+ chkout.F \
+ auresol.F \
+ chequal.F \
+ chkprec.F \
+ clear_c.F \
+ csum.F \
+ ddstyle.F \
+ dssarea.F \
+ eulavgg.F \
+ fft99.F \
+ fixarea.F \
+ freecf.F \
+ funcs.F \
+ gb2gb.F \
+ getconf.F \
+ ggintrp.F \
+ ggrotat.F \
+ ggvalue.F \
+ hgengg.F \
+ hgengrd.F \
+ hgengrw.F \
+ hgenll.F \
+ hgenllw.F \
+ hgetlsm.F \
+ hirlam.F \
+ hirlamw.F \
+ hirlsm.F \
+ hll2ll.F \
+ hll2llw.F \
+ hll2xyz.F \
+ hnei12.F \
+ hneill.F \
+ hntfap.F \
+ hntfaph.F \
+ hntfaps.F \
+ hntfau.F \
+ hntfauh.F \
+ hntfaus.F \
+ hntfbu.F \
+ hpshgpw.F \
+ hrg2gg.F \
+ hrg2ggw.F \
+ hrg2ll.F \
+ hrg2llw.F \
+ hsp2gg.F \
+ hsp2gg2.F \
+ hsp2gg3.F \
+ hwts12.F \
+ hwtsll.F \
+ hwtslsm.F \
+ iafree.F \
+ iagcntl.F \
+ iaidef.F \
+ iainit.F \
+ iaintgg.F \
+ iaintll.F \
+ iaogdef.F \
+ iaoldef.F \
+ iarcntl.F \
+ iareset.F \
+ iarmem.F \
+ ibasini.F \
+ igalloc.F \
+ igbess.F \
+ igdins.F \
+ igdiwe.F \
+ igglat.F \
+ iggmem.F \
+ iggrid.F \
+ igint.F \
+ igintr.F \
+ iglgrid.F \
+ iglrev.F \
+ iglsize.F \
+ iglsm01.F \
+ iglsmb.F \
+ iglsmd.F \
+ iglsmr.F \
+ iglsmst.F \
+ ignorm.F \
+ igplsm.F \
+ igpoleg.F \
+ igpolew.F \
+ igprec.F \
+ igscan.F \
+ igsetup.F \
+ gasetup.F \
+ outrep.F \
+ gettru.F \
+ igsize.F \
+ igtog.F \
+ igtogr.F \
+ igtran.F \
+ init_cm.F \
+ insane.F \
+ intf.F \
+ intfa.F \
+ intfap.F \
+ intfau.F \
+ intfb.F \
+ intfbp.F \
+ intfbu.F \
+ intfc.F \
+ intin.F \
+ intisl.F \
+ intlog.F \
+ intlogd.F \
+ intlogr.F \
+ intocn.F \
+ intocnu.F \
+ intout.F \
+ intpnum.F \
+ intuvdh.F \
+ intuvf.F \
+ intuvgh.F \
+ intuvp.F \
+ intuvph.F \
+ intuvs.F \
+ intuvu.F \
+ intuvy.F \
+ intuvxh.F \
+ intvect.F \
+ intvecy.F \
+ intwave.F \
+ intwave2.F \
+ intwavu.F \
+ irdiwe.F \
+ irgmem.F \
+ irgrid.F \
+ irgtog.F \
+ irint.F \
+ irintr.F \
+ irlrev.F \
+ irlsmb.F \
+ irprec.F \
+ irscan.F \
+ irsize.F \
+ iscrsz.F \
+ islproc.F \
+ issame.F \
+ jacobi.F \
+ jagggp.F \
+ jallgp.F \
+ jallwn.F \
+ jdebug.F \
+ jfindfn.F \
+ jfindfn3.F \
+ jfindir.F \
+ jgetgg.F \
+ jgglat.F \
+ jintend.F \
+ jintgg.F \
+ jintll.F \
+ jjset99.F \
+ jmakgg.F \
+ jmakgg3.F \
+ jmakll.F \
+ jmakll3.F \
+ jmemhan.F \
+ jmemhan2.F \
+ jmkofgg.F \
+ jmovgg.F \
+ jmovll.F \
+ jmvugg.F \
+ jmvull.F \
+ jnorsgg.F \
+ jnumgg.F \
+ jnumggq.F \
+ jopngg.F \
+ jopnggf.F \
+ jopnll.F \
+ jopnllf.F \
+ jreadgg.F \
+ jreadll.F \
+ jsgggp.F \
+ jsh2sh.F \
+ jsllgp.F \
+ jspleg1.F \
+ jsppole.F \
+ jstrll.F \
+ jstrwll.F \
+ jsymgg.F \
+ jsymll.F \
+ juvpole.F \
+ jvod2uv.F \
+ jwindll.F \
+ jwscal.F \
+ kintrg.F \
+ knfrom4.F \
+ krg2rg.F \
+ krg2rgu.F \
+ krg2rgz.F \
+ krg2rgd.F \
+ krg2rgy.F \
+ lgrpr4.F \
+ ll2xyz.F \
+ lrekam.F \
+ lsmfld.F \
+ lsm_red.F \
+ makerl.F \
+ mkbitmp.F \
+ mkframe.F \
+ newisl.F \
+ ngintrp.F \
+ ngrotat.F \
+ ngvalue.F \
+ nmakgg.F \
+ nmakll.F \
+ nptwe32.F \
+ numptns.F \
+ numptwe.F \
+ oceanp.F \
+ oceanu.F \
+ pddefs.F \
+ precip.F \
+ qpassm.F \
+ reset_c.F \
+ rpassm.F \
+ rphi.F \
+ set99.F \
+ sprotat.F \
+ sscal.F \
+ strlat.F \
+ tatorgg.F \
+ zprec.F \
+ w251idx.F \
+ waveidx.F \
+ wavexxx.F \
+ wavexx2.F \
+ wv2di32.F \
+ wv2didx.F \
+ wv2dint.F \
+ wv2dx32.F \
+ wv2dxx2.F \
+ wvqlidx.F \
+ wvqlint.F \
+ wvqlin2.F \
+ xrotate.F \
+ xyz2ll.F \
+ outrep.F \
+ setrep.F \
+ global.F \
+ yrotate.F
+
+SOURCES.c = \
+ createSharedMemoryCoefficients.c \
+ sharedll.c \
+ sharedgg.c \
+ sharedlib.c \
+ emosPrecision.c \
+ fftchk.c \
+ gmapbit.c \
+ intlogs.c \
+ jchmod.c \
+ jindex.c \
+ jopnggsm.c \
+ jopnllsm.c \
+ jtimer.c \
+ makemap.c \
+ my_ialloc.c \
+ rddefs.c \
+ rename_unlink.c \
+ sharedMemoryCharacteristics.c \
+ showmap.c \
+ smread.c \
+ soffset.c
diff --git a/interpolation/sources.ibm_power6 b/interpolation/sources.ibm_power6
new file mode 100755
index 0000000..b58e92a
--- /dev/null
+++ b/interpolation/sources.ibm_power6
@@ -0,0 +1,288 @@
+
+HEADERS = \
+ current.h \
+ debug.h \
+ grfixed.h \
+ intf.h \
+ jparams.h \
+ ouspace.h \
+ grdynam.h \
+ grspace.h \
+ intlog.h \
+ memreq.h \
+ parim.h
+
+VECTOR.F = dummy.F
+
+NO_OPT.F = dummy2.F
+
+SOURCES.F = \
+ areachk.F \
+ estima.F \
+ chkout.F \
+ auresol.F \
+ chequal.F \
+ chkprec.F \
+ clear_c.F \
+ csum.F \
+ ddstyle.F \
+ dssarea.F \
+ eulavgg.F \
+ fft99.F \
+ fixarea.F \
+ freecf.F \
+ funcs.F \
+ gb2gb.F \
+ getconf.F \
+ ggintrp.F \
+ ggrotat.F \
+ ggvalue.F \
+ hgengg.F \
+ hgengrd.F \
+ hgengrw.F \
+ hgenll.F \
+ hgenllw.F \
+ hgetlsm.F \
+ hirlam.F \
+ hirlamw.F \
+ hirlsm.F \
+ hll2ll.F \
+ hll2llw.F \
+ hll2xyz.F \
+ hnei12.F \
+ hneill.F \
+ hntfap.F \
+ hntfaph.F \
+ hntfaps.F \
+ hntfau.F \
+ hntfauh.F \
+ hntfaus.F \
+ hntfbu.F \
+ hpshgpw.F \
+ hrg2gg.F \
+ hrg2ggw.F \
+ hrg2ll.F \
+ hrg2llw.F \
+ hsp2gg.F \
+ hsp2gg2.F \
+ hsp2gg3.F \
+ hwts12.F \
+ hwtsll.F \
+ hwtslsm.F \
+ iafree.F \
+ iagcntl.F \
+ iaidef.F \
+ iainit.F \
+ iaintgg.F \
+ iaintll.F \
+ iaogdef.F \
+ iaoldef.F \
+ iarcntl.F \
+ iareset.F \
+ iarmem.F \
+ ibasini.F \
+ igalloc.F \
+ igbess.F \
+ igdins.F \
+ igdiwe.F \
+ igglat.F \
+ iggmem.F \
+ iggrid.F \
+ igint.F \
+ igintr.F \
+ iglgrid.F \
+ iglrev.F \
+ iglsize.F \
+ iglsm01.F \
+ iglsmb.F \
+ iglsmd.F \
+ iglsmr.F \
+ iglsmst.F \
+ ignorm.F \
+ igplsm.F \
+ igpoleg.F \
+ igpolew.F \
+ igprec.F \
+ igscan.F \
+ igsetup.F \
+ gasetup.F \
+ outrep.F \
+ gettru.F \
+ igsize.F \
+ igtog.F \
+ igtogr.F \
+ igtran.F \
+ init_cm.F \
+ insane.F \
+ intf.F \
+ intfa.F \
+ intfap.F \
+ intfau.F \
+ intfb.F \
+ intfbp.F \
+ intfbu.F \
+ intfc.F \
+ intin.F \
+ intisl.F \
+ intlog.F \
+ intlogd.F \
+ intlogr.F \
+ intocn.F \
+ intocnu.F \
+ intout.F \
+ intpnum.F \
+ intuvdh.F \
+ intuvf.F \
+ intuvgh.F \
+ intuvp.F \
+ intuvph.F \
+ intuvs.F \
+ intuvu.F \
+ intuvy.F \
+ intuvxh.F \
+ intvect.F \
+ intvecy.F \
+ intwave.F \
+ intwave2.F \
+ intwavu.F \
+ irdiwe.F \
+ irgmem.F \
+ irgrid.F \
+ irgtog.F \
+ irint.F \
+ irintr.F \
+ irlrev.F \
+ irlsmb.F \
+ irprec.F \
+ irscan.F \
+ irsize.F \
+ iscrsz.F \
+ islproc.F \
+ issame.F \
+ jacobi.F \
+ jagggp.F \
+ jallgp.F \
+ jallwn.F \
+ jdebug.F \
+ jfindfn.F \
+ jfindfn3.F \
+ jfindir.F \
+ jgetgg.F \
+ jgglat.F \
+ jintend.F \
+ jintgg.F \
+ jintll.F \
+ jjset99.F \
+ jmakgg.F \
+ jmakgg3.F \
+ jmakll.F \
+ jmakll3.F \
+ jmemhan.F \
+ jmemhan2.F \
+ jmkofgg.F \
+ jmovgg.F \
+ jmovll.F \
+ jmvugg.F \
+ jmvull.F \
+ jnorsgg.F \
+ jnumgg.F \
+ jnumggq.F \
+ jopngg.F \
+ jopnggf.F \
+ jopnll.F \
+ jopnllf.F \
+ jreadgg.F \
+ jreadll.F \
+ jsgggp.F \
+ jsh2sh.F \
+ jsllgp.F \
+ jspleg1.F \
+ jsppole.F \
+ jstrll.F \
+ jstrwll.F \
+ jsymgg.F \
+ jsymll.F \
+ juvpole.F \
+ jvod2uv.F \
+ jwindll.F \
+ jwscal.F \
+ kintrg.F \
+ knfrom4.F \
+ krg2rg.F \
+ krg2rgu.F \
+ krg2rgz.F \
+ krg2rgd.F \
+ krg2rgy.F \
+ lgrpr4.F \
+ ll2xyz.F \
+ lrekam.F \
+ lsmfld.F \
+ lsm_red.F \
+ makerl.F \
+ mkbitmp.F \
+ mkframe.F \
+ newisl.F \
+ ngintrp.F \
+ ngrotat.F \
+ ngvalue.F \
+ nmakgg.F \
+ nmakll.F \
+ nptwe32.F \
+ numptns.F \
+ numptwe.F \
+ oceanp.F \
+ oceanu.F \
+ pddefs.F \
+ precip.F \
+ qpassm.F \
+ reset_c.F \
+ rpassm.F \
+ rphi.F \
+ set99.F \
+ sprotat.F \
+ sscal.F \
+ strlat.F \
+ tatorgg.F \
+ zprec.F \
+ w251idx.F \
+ waveidx.F \
+ wavexxx.F \
+ wavexx2.F \
+ wv2di32.F \
+ wv2didx.F \
+ wv2dint.F \
+ wv2dx32.F \
+ wv2dxxx.F \
+ wv2dxx2.F \
+ wvqlidx.F \
+ wvqlint.F \
+ wvqlin2.F \
+ xrotate.F \
+ xyz2ll.F \
+ outrep.F \
+ setrep.F \
+ global.F \
+ yrotate.F
+
+SOURCES.c = \
+ createSharedMemoryCoefficients.c \
+ sharedll.c \
+ sharedgg.c \
+ sharedlib.c \
+ emosPrecision.c \
+ fftchk.c \
+ gmapbit.c \
+ intlogs.c \
+ jchmod.c \
+ jindex.c \
+ jopnggsm.c \
+ jopnllsm.c \
+ jtimer.c \
+ makemap.c \
+ my_ialloc.c \
+ rddefs.c \
+ rename_unlink.c \
+ sharedMemoryCharacteristics.c \
+ showmap.c \
+ smread.c \
+ soffset.c
diff --git a/interpolation/sources.ibm_power7 b/interpolation/sources.ibm_power7
new file mode 100755
index 0000000..b58e92a
--- /dev/null
+++ b/interpolation/sources.ibm_power7
@@ -0,0 +1,288 @@
+
+HEADERS = \
+ current.h \
+ debug.h \
+ grfixed.h \
+ intf.h \
+ jparams.h \
+ ouspace.h \
+ grdynam.h \
+ grspace.h \
+ intlog.h \
+ memreq.h \
+ parim.h
+
+VECTOR.F = dummy.F
+
+NO_OPT.F = dummy2.F
+
+SOURCES.F = \
+ areachk.F \
+ estima.F \
+ chkout.F \
+ auresol.F \
+ chequal.F \
+ chkprec.F \
+ clear_c.F \
+ csum.F \
+ ddstyle.F \
+ dssarea.F \
+ eulavgg.F \
+ fft99.F \
+ fixarea.F \
+ freecf.F \
+ funcs.F \
+ gb2gb.F \
+ getconf.F \
+ ggintrp.F \
+ ggrotat.F \
+ ggvalue.F \
+ hgengg.F \
+ hgengrd.F \
+ hgengrw.F \
+ hgenll.F \
+ hgenllw.F \
+ hgetlsm.F \
+ hirlam.F \
+ hirlamw.F \
+ hirlsm.F \
+ hll2ll.F \
+ hll2llw.F \
+ hll2xyz.F \
+ hnei12.F \
+ hneill.F \
+ hntfap.F \
+ hntfaph.F \
+ hntfaps.F \
+ hntfau.F \
+ hntfauh.F \
+ hntfaus.F \
+ hntfbu.F \
+ hpshgpw.F \
+ hrg2gg.F \
+ hrg2ggw.F \
+ hrg2ll.F \
+ hrg2llw.F \
+ hsp2gg.F \
+ hsp2gg2.F \
+ hsp2gg3.F \
+ hwts12.F \
+ hwtsll.F \
+ hwtslsm.F \
+ iafree.F \
+ iagcntl.F \
+ iaidef.F \
+ iainit.F \
+ iaintgg.F \
+ iaintll.F \
+ iaogdef.F \
+ iaoldef.F \
+ iarcntl.F \
+ iareset.F \
+ iarmem.F \
+ ibasini.F \
+ igalloc.F \
+ igbess.F \
+ igdins.F \
+ igdiwe.F \
+ igglat.F \
+ iggmem.F \
+ iggrid.F \
+ igint.F \
+ igintr.F \
+ iglgrid.F \
+ iglrev.F \
+ iglsize.F \
+ iglsm01.F \
+ iglsmb.F \
+ iglsmd.F \
+ iglsmr.F \
+ iglsmst.F \
+ ignorm.F \
+ igplsm.F \
+ igpoleg.F \
+ igpolew.F \
+ igprec.F \
+ igscan.F \
+ igsetup.F \
+ gasetup.F \
+ outrep.F \
+ gettru.F \
+ igsize.F \
+ igtog.F \
+ igtogr.F \
+ igtran.F \
+ init_cm.F \
+ insane.F \
+ intf.F \
+ intfa.F \
+ intfap.F \
+ intfau.F \
+ intfb.F \
+ intfbp.F \
+ intfbu.F \
+ intfc.F \
+ intin.F \
+ intisl.F \
+ intlog.F \
+ intlogd.F \
+ intlogr.F \
+ intocn.F \
+ intocnu.F \
+ intout.F \
+ intpnum.F \
+ intuvdh.F \
+ intuvf.F \
+ intuvgh.F \
+ intuvp.F \
+ intuvph.F \
+ intuvs.F \
+ intuvu.F \
+ intuvy.F \
+ intuvxh.F \
+ intvect.F \
+ intvecy.F \
+ intwave.F \
+ intwave2.F \
+ intwavu.F \
+ irdiwe.F \
+ irgmem.F \
+ irgrid.F \
+ irgtog.F \
+ irint.F \
+ irintr.F \
+ irlrev.F \
+ irlsmb.F \
+ irprec.F \
+ irscan.F \
+ irsize.F \
+ iscrsz.F \
+ islproc.F \
+ issame.F \
+ jacobi.F \
+ jagggp.F \
+ jallgp.F \
+ jallwn.F \
+ jdebug.F \
+ jfindfn.F \
+ jfindfn3.F \
+ jfindir.F \
+ jgetgg.F \
+ jgglat.F \
+ jintend.F \
+ jintgg.F \
+ jintll.F \
+ jjset99.F \
+ jmakgg.F \
+ jmakgg3.F \
+ jmakll.F \
+ jmakll3.F \
+ jmemhan.F \
+ jmemhan2.F \
+ jmkofgg.F \
+ jmovgg.F \
+ jmovll.F \
+ jmvugg.F \
+ jmvull.F \
+ jnorsgg.F \
+ jnumgg.F \
+ jnumggq.F \
+ jopngg.F \
+ jopnggf.F \
+ jopnll.F \
+ jopnllf.F \
+ jreadgg.F \
+ jreadll.F \
+ jsgggp.F \
+ jsh2sh.F \
+ jsllgp.F \
+ jspleg1.F \
+ jsppole.F \
+ jstrll.F \
+ jstrwll.F \
+ jsymgg.F \
+ jsymll.F \
+ juvpole.F \
+ jvod2uv.F \
+ jwindll.F \
+ jwscal.F \
+ kintrg.F \
+ knfrom4.F \
+ krg2rg.F \
+ krg2rgu.F \
+ krg2rgz.F \
+ krg2rgd.F \
+ krg2rgy.F \
+ lgrpr4.F \
+ ll2xyz.F \
+ lrekam.F \
+ lsmfld.F \
+ lsm_red.F \
+ makerl.F \
+ mkbitmp.F \
+ mkframe.F \
+ newisl.F \
+ ngintrp.F \
+ ngrotat.F \
+ ngvalue.F \
+ nmakgg.F \
+ nmakll.F \
+ nptwe32.F \
+ numptns.F \
+ numptwe.F \
+ oceanp.F \
+ oceanu.F \
+ pddefs.F \
+ precip.F \
+ qpassm.F \
+ reset_c.F \
+ rpassm.F \
+ rphi.F \
+ set99.F \
+ sprotat.F \
+ sscal.F \
+ strlat.F \
+ tatorgg.F \
+ zprec.F \
+ w251idx.F \
+ waveidx.F \
+ wavexxx.F \
+ wavexx2.F \
+ wv2di32.F \
+ wv2didx.F \
+ wv2dint.F \
+ wv2dx32.F \
+ wv2dxxx.F \
+ wv2dxx2.F \
+ wvqlidx.F \
+ wvqlint.F \
+ wvqlin2.F \
+ xrotate.F \
+ xyz2ll.F \
+ outrep.F \
+ setrep.F \
+ global.F \
+ yrotate.F
+
+SOURCES.c = \
+ createSharedMemoryCoefficients.c \
+ sharedll.c \
+ sharedgg.c \
+ sharedlib.c \
+ emosPrecision.c \
+ fftchk.c \
+ gmapbit.c \
+ intlogs.c \
+ jchmod.c \
+ jindex.c \
+ jopnggsm.c \
+ jopnllsm.c \
+ jtimer.c \
+ makemap.c \
+ my_ialloc.c \
+ rddefs.c \
+ rename_unlink.c \
+ sharedMemoryCharacteristics.c \
+ showmap.c \
+ smread.c \
+ soffset.c
diff --git a/interpolation/sources.itanium b/interpolation/sources.itanium
new file mode 100755
index 0000000..ee91aea
--- /dev/null
+++ b/interpolation/sources.itanium
@@ -0,0 +1,280 @@
+HEADERS = \
+ current.h \
+ debug.h \
+ grfixed.h \
+ intf.h \
+ jparams.h \
+ ouspace.h \
+ grdynam.h \
+ grspace.h \
+ intlog.h \
+ memreq.h \
+ parim.h
+
+VECTOR.F = dummy.F
+
+NO_OPT.F = dummy2.F
+
+SOURCES.F = \
+ areachk.F \
+ estima.F \
+ chkout.F \
+ auresol.F \
+ chequal.F \
+ chkprec.F \
+ clear_c.F \
+ csum.F \
+ ddstyle.F \
+ dssarea.F \
+ eulavgg.F \
+ fft99.F \
+ fixarea.F \
+ freecf.F \
+ funcs.F \
+ gb2gb.F \
+ getconf.F \
+ ggintrp.F \
+ ggrotat.F \
+ ggvalue.F \
+ hgengg.F \
+ hgengrd.F \
+ hgengrw.F \
+ hgenll.F \
+ hgenllw.F \
+ hgetlsm.F \
+ hirlam.F \
+ hirlamw.F \
+ hirlsm.F \
+ hll2ll.F \
+ hll2llw.F \
+ hll2xyz.F \
+ hnei12.F \
+ hneill.F \
+ hntfap.F \
+ hntfaph.F \
+ hntfaps.F \
+ hntfau.F \
+ hntfauh.F \
+ hntfaus.F \
+ hntfbu.F \
+ hpshgpw.F \
+ hrg2gg.F \
+ hrg2ggw.F \
+ hrg2ll.F \
+ hrg2llw.F \
+ hsp2gg.F \
+ hsp2gg2.F \
+ hsp2gg3.F \
+ hwts12.F \
+ hwtsll.F \
+ hwtslsm.F \
+ iafree.F \
+ iagcntl.F \
+ iaidef.F \
+ iainit.F \
+ iaintgg.F \
+ iaintll.F \
+ iaogdef.F \
+ iaoldef.F \
+ iarcntl.F \
+ iareset.F \
+ iarmem.F \
+ ibasini.F \
+ igalloc.F \
+ igbess.F \
+ igdins.F \
+ igdiwe.F \
+ igglat.F \
+ iggmem.F \
+ iggrid.F \
+ igint.F \
+ igintr.F \
+ iglgrid.F \
+ iglrev.F \
+ iglsize.F \
+ iglsm01.F \
+ iglsmb.F \
+ iglsmd.F \
+ iglsmr.F \
+ iglsmst.F \
+ ignorm.F \
+ igplsm.F \
+ igpoleg.F \
+ igpolew.F \
+ igprec.F \
+ igscan.F \
+ igsetup.F \
+ igsize.F \
+ igtog.F \
+ igtogr.F \
+ igtran.F \
+ init_cm.F \
+ insane.F \
+ intf.F \
+ intfa.F \
+ intfap.F \
+ intfau.F \
+ intfb.F \
+ intfbp.F \
+ intfbu.F \
+ intfc.F \
+ intin.F \
+ intisl.F \
+ intlog.F \
+ intlogd.F \
+ intlogr.F \
+ intocn.F \
+ intocnu.F \
+ intout.F \
+ intpnum.F \
+ intuvdh.F \
+ intuvf.F \
+ intuvgh.F \
+ intuvp.F \
+ intuvph.F \
+ intuvs.F \
+ intuvu.F \
+ intuvy.F \
+ intuvxh.F \
+ intvect.F \
+ intvecy.F \
+ intwave.F \
+ intwave2.F \
+ intwavu.F \
+ irdiwe.F \
+ irgmem.F \
+ irgrid.F \
+ irgtog.F \
+ irint.F \
+ irintr.F \
+ irlrev.F \
+ irlsmb.F \
+ irprec.F \
+ irscan.F \
+ irsize.F \
+ iscrsz.F \
+ islproc.F \
+ issame.F \
+ jacobi.F \
+ jagggp.F \
+ jallgp.F \
+ jallwn.F \
+ jdebug.F \
+ jfindfn.F \
+ jfindfn3.F \
+ jfindir.F \
+ jgetgg.F \
+ jgglat.F \
+ jintend.F \
+ jintgg.F \
+ jintll.F \
+ jjset99.F \
+ jmakgg.F \
+ jmakgg3.F \
+ jmakll.F \
+ jmakll3.F \
+ jmemhan.F \
+ jmemhan2.F \
+ jmkofgg.F \
+ jmovgg.F \
+ jmovll.F \
+ jmvugg.F \
+ jmvull.F \
+ jnorsgg.F \
+ jnumgg.F \
+ jnumggq.F \
+ jopngg.F \
+ jopnggf.F \
+ jopnll.F \
+ jopnllf.F \
+ jreadgg.F \
+ jreadll.F \
+ jsgggp.F \
+ jsh2sh.F \
+ jsllgp.F \
+ jspleg1.F \
+ jsppole.F \
+ jsymgg.F \
+ jstrll.F \
+ jstrwll.F \
+ jsymll.F \
+ juvpole.F \
+ jvod2uv.F \
+ jwindll.F \
+ jwscal.F \
+ kintrg.F \
+ knfrom4.F \
+ krg2rg.F \
+ krg2rgu.F \
+ krg2rgz.F \
+ krg2rgd.F \
+ krg2rgy.F \
+ lgrpr4.F \
+ ll2xyz.F \
+ lrekam.F \
+ lsmfld.F \
+ lsm_red.F \
+ makerl.F \
+ mkbitmp.F \
+ mkframe.F \
+ newisl.F \
+ ngintrp.F \
+ ngrotat.F \
+ ngvalue.F \
+ nmakgg.F \
+ nmakll.F \
+ nptwe32.F \
+ numptns.F \
+ numptwe.F \
+ oceanp.F \
+ oceanu.F \
+ pddefs.F \
+ precip.F \
+ qpassm.F \
+ reset_c.F \
+ rpassm.F \
+ rphi.F \
+ set99.F \
+ sprotat.F \
+ sscal.F \
+ strlat.F \
+ tatorgg.F \
+ zprec.F \
+ w251idx.F \
+ waveidx.F \
+ wavexxx.F \
+ wavexx2.F \
+ wv2di32.F \
+ wv2didx.F \
+ wv2dint.F \
+ wv2dx32.F \
+ wv2dxxx.F \
+ wv2dxx2.F \
+ wvqlidx.F \
+ wvqlint.F \
+ wvqlin2.F \
+ xrotate.F \
+ xyz2ll.F \
+ gasetup.F \
+ outrep.F \
+ gettru.F \
+ outrep.F \
+ setrep.F \
+ global.F \
+ yrotate.F
+
+SOURCES.c = \
+ emosPrecision.c \
+ fftchk.c \
+ gmapbit.c \
+ intlogs.c \
+ jchmod.c \
+ jindex.c \
+ jopnggsm.c \
+ jopnllsm.c \
+ jtimer.c \
+ makemap.c \
+ my_ialloc.c \
+ rddefs.c \
+ showmap.c \
+ soffset.c
diff --git a/interpolation/sources.linux b/interpolation/sources.linux
new file mode 100755
index 0000000..7eed105
--- /dev/null
+++ b/interpolation/sources.linux
@@ -0,0 +1,283 @@
+HEADERS = \
+ current.h \
+ debug.h \
+ grfixed.h \
+ intf.h \
+ jparams.h \
+ ouspace.h \
+ grdynam.h \
+ grspace.h \
+ intlog.h \
+ memreq.h \
+ parim.h
+
+VECTOR.F = dummy.F
+
+NO_OPT.F = dummy2.F
+
+SOURCES.F = \
+ areachk.F \
+ estima.F \
+ chkout.F \
+ auresol.F \
+ chequal.F \
+ chkprec.F \
+ clear_c.F \
+ csum.F \
+ ddstyle.F \
+ dssarea.F \
+ eulavgg.F \
+ fft99.F \
+ fixarea.F \
+ freecf.F \
+ funcs.F \
+ gb2gb.F \
+ getconf.F \
+ ggintrp.F \
+ ggrotat.F \
+ ggvalue.F \
+ hgengg.F \
+ hgengrd.F \
+ hgengrw.F \
+ hgenll.F \
+ hgenllw.F \
+ hgetlsm.F \
+ hirlam.F \
+ hirlamw.F \
+ hirlsm.F \
+ hll2ll.F \
+ hll2llw.F \
+ hll2xyz.F \
+ hnei12.F \
+ hneill.F \
+ hntfap.F \
+ hntfaph.F \
+ hntfaps.F \
+ hntfau.F \
+ hntfauh.F \
+ hntfaus.F \
+ hntfbu.F \
+ hpshgpw.F \
+ hrg2gg.F \
+ hrg2ggw.F \
+ hrg2ll.F \
+ hrg2llw.F \
+ hsp2gg.F \
+ hsp2gg2.F \
+ hsp2gg3.F \
+ hwts12.F \
+ hwtsll.F \
+ hwtslsm.F \
+ iafree.F \
+ iagcntl.F \
+ iaidef.F \
+ iainit.F \
+ iaintgg.F \
+ iaintll.F \
+ iaogdef.F \
+ iaoldef.F \
+ iarcntl.F \
+ iareset.F \
+ iarmem.F \
+ ibasini.F \
+ igalloc.F \
+ igbess.F \
+ igdins.F \
+ igdiwe.F \
+ igglat.F \
+ iggmem.F \
+ iggrid.F \
+ igint.F \
+ igintr.F \
+ iglgrid.F \
+ iglrev.F \
+ iglsize.F \
+ iglsm01.F \
+ iglsmb.F \
+ iglsmd.F \
+ iglsmr.F \
+ iglsmst.F \
+ ignorm.F \
+ igplsm.F \
+ igpoleg.F \
+ igpolew.F \
+ igprec.F \
+ igscan.F \
+ igsetup.F \
+ igsize.F \
+ igtog.F \
+ igtogr.F \
+ igtran.F \
+ init_cm.F \
+ insane.F \
+ intf.F \
+ intfa.F \
+ intfap.F \
+ intfau.F \
+ intfb.F \
+ intfbp.F \
+ intfbu.F \
+ intfc.F \
+ intin.F \
+ intisl.F \
+ intlog.F \
+ intlogd.F \
+ intlogr.F \
+ intocn.F \
+ intout.F \
+ intpnum.F \
+ intuvdh.F \
+ intuvf.F \
+ intuvgh.F \
+ intuvp.F \
+ intuvph.F \
+ intuvs.F \
+ intuvu.F \
+ intuvy.F \
+ intuvxh.F \
+ intvect.F \
+ intvecy.F \
+ intwave.F \
+ intwave2.F \
+ intwavu.F \
+ irdiwe.F \
+ irgmem.F \
+ irgrid.F \
+ irgtog.F \
+ irint.F \
+ irintr.F \
+ irlrev.F \
+ irlsmb.F \
+ irprec.F \
+ irscan.F \
+ irsize.F \
+ iscrsz.F \
+ islproc.F \
+ issame.F \
+ jacobi.F \
+ jagggp.F \
+ jallgp.F \
+ jallwn.F \
+ jdebug.F \
+ jfindfn.F \
+ jfindfn3.F \
+ jfindir.F \
+ jgetgg.F \
+ jgglat.F \
+ jintend.F \
+ jintgg.F \
+ jintll.F \
+ jjset99.F \
+ jmakgg.F \
+ jmakgg3.F \
+ jmakll.F \
+ jmakll3.F \
+ jmemhan.F \
+ jmemhan2.F \
+ jmkofgg.F \
+ jmovgg.F \
+ jmovll.F \
+ jmvugg.F \
+ jmvull.F \
+ jnorsgg.F \
+ jnumgg.F \
+ jnumggq.F \
+ jopngg.F \
+ jopnggf.F \
+ jopnll.F \
+ jopnllf.F \
+ jreadgg.F \
+ jreadll.F \
+ jsgggp.F \
+ jsh2sh.F \
+ jsllgp.F \
+ jspleg1.F \
+ jsppole.F \
+ jsymgg.F \
+ jstrll.F \
+ jstrwll.F \
+ jsymll.F \
+ juvpole.F \
+ jvod2uv.F \
+ jwindll.F \
+ jwscal.F \
+ kintrg.F \
+ knfrom4.F \
+ krg2rg.F \
+ krg2rgu.F \
+ krg2rgz.F \
+ krg2rgd.F \
+ krg2rgy.F \
+ lgrpr4.F \
+ ll2xyz.F \
+ lrekam.F \
+ lsmfld.F \
+ lsm_red.F \
+ makerl.F \
+ mkbitmp.F \
+ mkframe.F \
+ newisl.F \
+ ngintrp.F \
+ ngrotat.F \
+ ngvalue.F \
+ nmakgg.F \
+ nmakll.F \
+ nptwe32.F \
+ numptns.F \
+ numptwe.F \
+ oceanp.F \
+ oceanu.F \
+ intocnu.F \
+ pddefs.F \
+ precip.F \
+ qpassm.F \
+ reset_c.F \
+ rpassm.F \
+ rphi.F \
+ set99.F \
+ sprotat.F \
+ sscal.F \
+ strlat.F \
+ tatorgg.F \
+ zprec.F \
+ w251idx.F \
+ waveidx.F \
+ wavexxx.F \
+ wavexx2.F \
+ wv2di32.F \
+ wv2didx.F \
+ wv2dint.F \
+ wv2dx32.F \
+ wv2dxxx.F \
+ wv2dxx2.F \
+ wvqlidx.F \
+ wvqlint.F \
+ wvqlin2.F \
+ xrotate.F \
+ xyz2ll.F \
+ gasetup.F \
+ outrep.F \
+ gettru.F \
+ setrep.F \
+ global.F \
+ yrotate.F
+
+SOURCES.c = \
+ emosPrecision.c \
+ sharedll.c \
+ sharedgg.c \
+ sharedlib.c \
+ fftchk.c \
+ gmapbit.c \
+ intlogs.c \
+ jchmod.c \
+ jindex.c \
+ jopnggsm.c \
+ jopnllsm.c \
+ jtimer.c \
+ itimer.c \
+ makemap.c \
+ my_ialloc.c \
+ rddefs.c \
+ showmap.c \
+ soffset.c
diff --git a/interpolation/sources.rs6000 b/interpolation/sources.rs6000
new file mode 100755
index 0000000..9d81ecb
--- /dev/null
+++ b/interpolation/sources.rs6000
@@ -0,0 +1,288 @@
+
+HEADERS = \
+ current.h \
+ debug.h \
+ grfixed.h \
+ intf.h \
+ jparams.h \
+ ouspace.h \
+ grdynam.h \
+ grspace.h \
+ intlog.h \
+ memreq.h \
+ parim.h
+
+VECTOR.F = dummy.F
+
+NO_OPT.F = dummy2.F
+
+SOURCES.F = \
+ areachk.F \
+ estima.F \
+ chkout.F \
+ auresol.F \
+ chequal.F \
+ chkprec.F \
+ clear_c.F \
+ csum.F \
+ ddstyle.F \
+ dssarea.F \
+ eulavgg.F \
+ fft99.F \
+ fixarea.F \
+ freecf.F \
+ funcs.F \
+ gb2gb.F \
+ getconf.F \
+ ggintrp.F \
+ ggrotat.F \
+ ggvalue.F \
+ hgengg.F \
+ hgengrd.F \
+ hgengrw.F \
+ hgenll.F \
+ hgenllw.F \
+ hgetlsm.F \
+ hirlam.F \
+ hirlamw.F \
+ hirlsm.F \
+ hll2ll.F \
+ hll2llw.F \
+ hll2xyz.F \
+ hnei12.F \
+ hneill.F \
+ hntfap.F \
+ hntfaph.F \
+ hntfaps.F \
+ hntfau.F \
+ hntfauh.F \
+ hntfaus.F \
+ hntfbu.F \
+ hpshgpw.F \
+ hrg2gg.F \
+ hrg2ggw.F \
+ hrg2ll.F \
+ hrg2llw.F \
+ hsp2gg.F \
+ hsp2gg2.F \
+ hsp2gg3.F \
+ hwts12.F \
+ hwtsll.F \
+ hwtslsm.F \
+ iafree.F \
+ iagcntl.F \
+ iaidef.F \
+ iainit.F \
+ iaintgg.F \
+ iaintll.F \
+ iaogdef.F \
+ iaoldef.F \
+ iarcntl.F \
+ iareset.F \
+ iarmem.F \
+ ibasini.F \
+ igalloc.F \
+ igbess.F \
+ igdins.F \
+ igdiwe.F \
+ igglat.F \
+ iggmem.F \
+ iggrid.F \
+ igint.F \
+ igintr.F \
+ iglgrid.F \
+ iglrev.F \
+ iglsize.F \
+ iglsm01.F \
+ iglsmb.F \
+ iglsmd.F \
+ iglsmr.F \
+ iglsmst.F \
+ ignorm.F \
+ igplsm.F \
+ igpoleg.F \
+ igpolew.F \
+ igprec.F \
+ igscan.F \
+ igsetup.F \
+ gasetup.F \
+ outrep.F \
+ gettru.F \
+ igsize.F \
+ igtog.F \
+ igtogr.F \
+ igtran.F \
+ init_cm.F \
+ insane.F \
+ intf.F \
+ intfa.F \
+ intfap.F \
+ intfau.F \
+ intfb.F \
+ intfbp.F \
+ intfbu.F \
+ intfc.F \
+ intin.F \
+ intisl.F \
+ intlog.F \
+ intlogd.F \
+ intlogr.F \
+ intocn.F \
+ intocnu.F \
+ intout.F \
+ intpnum.F \
+ intuvdh.F \
+ intuvf.F \
+ intuvgh.F \
+ intuvp.F \
+ intuvph.F \
+ intuvs.F \
+ intuvu.F \
+ intuvy.F \
+ intuvxh.F \
+ intvect.F \
+ intvecy.F \
+ intwave.F \
+ intwave2.F \
+ intwavu.F \
+ irdiwe.F \
+ irgmem.F \
+ irgrid.F \
+ irgtog.F \
+ irint.F \
+ irintr.F \
+ irlrev.F \
+ irlsmb.F \
+ irprec.F \
+ irscan.F \
+ irsize.F \
+ iscrsz.F \
+ islproc.F \
+ issame.F \
+ jacobi.F \
+ jagggp.F \
+ jallgp.F \
+ jallwn.F \
+ jdebug.F \
+ jfindfn.F \
+ jfindfn3.F \
+ jfindir.F \
+ jgetgg.F \
+ jgglat.F \
+ jintend.F \
+ jintgg.F \
+ jintll.F \
+ jjset99.F \
+ jmakgg.F \
+ jmakgg3.F \
+ jmakll.F \
+ jmakll3.F \
+ jmemhan.F \
+ jmemhan2.F \
+ jmkofgg.F \
+ jmovgg.F \
+ jmovll.F \
+ jmvugg.F \
+ jmvull.F \
+ jnorsgg.F \
+ jnumgg.F \
+ jnumggq.F \
+ jopngg.F \
+ jopnggf.F \
+ jopnll.F \
+ jopnllf.F \
+ jreadgg.F \
+ jreadll.F \
+ jsgggp.F \
+ jsh2sh.F \
+ jsllgp.F \
+ jspleg1.F \
+ jsppole.F \
+ jstrll.F \
+ jstrwll.F \
+ jsymgg.F \
+ jsymll.F \
+ juvpole.F \
+ jvod2uv.F \
+ jwindll.F \
+ jwscal.F \
+ kintrg.F \
+ knfrom4.F \
+ krg2rg.F \
+ krg2rgu.F \
+ krg2rgd.F \
+ krg2rgy.F \
+ krg2rgz.F \
+ lgrpr4.F \
+ ll2xyz.F \
+ lrekam.F \
+ lsmfld.F \
+ lsm_red.F \
+ makerl.F \
+ mkbitmp.F \
+ mkframe.F \
+ newisl.F \
+ ngintrp.F \
+ ngrotat.F \
+ ngvalue.F \
+ nmakgg.F \
+ nmakll.F \
+ nptwe32.F \
+ numptns.F \
+ numptwe.F \
+ oceanp.F \
+ oceanu.F \
+ pddefs.F \
+ precip.F \
+ qpassm.F \
+ reset_c.F \
+ rpassm.F \
+ rphi.F \
+ set99.F \
+ sprotat.F \
+ sscal.F \
+ strlat.F \
+ tatorgg.F \
+ zprec.F \
+ w251idx.F \
+ waveidx.F \
+ wavexxx.F \
+ wavexx2.F \
+ wv2di32.F \
+ wv2didx.F \
+ wv2dint.F \
+ wv2dx32.F \
+ wv2dxxx.F \
+ wv2dxx2.F \
+ wvqlidx.F \
+ wvqlint.F \
+ wvqlin2.F \
+ xrotate.F \
+ xyz2ll.F \
+ outrep.F \
+ setrep.F \
+ global.F \
+ yrotate.F
+
+SOURCES.c = \
+ createSharedMemoryCoefficients.c \
+ sharedll.c \
+ sharedgg.c \
+ sharedlib.c \
+ emosPrecision.c \
+ fftchk.c \
+ gmapbit.c \
+ intlogs.c \
+ jchmod.c \
+ jindex.c \
+ jopnggsm.c \
+ jopnllsm.c \
+ jtimer.c \
+ makemap.c \
+ my_ialloc.c \
+ rddefs.c \
+ rename_unlink.c \
+ sharedMemoryCharacteristics.c \
+ showmap.c \
+ smread.c \
+ soffset.c
diff --git a/interpolation/sources.sgimips b/interpolation/sources.sgimips
new file mode 100755
index 0000000..8b96e39
--- /dev/null
+++ b/interpolation/sources.sgimips
@@ -0,0 +1,280 @@
+
+HEADERS = \
+ current.h \
+ debug.h \
+ grfixed.h \
+ intf.h \
+ jparams.h \
+ ouspace.h \
+ grdynam.h \
+ grspace.h \
+ intlog.h \
+ memreq.h \
+ parim.h
+
+VECTOR.F = dummy.F
+
+NO_OPT.F = dummy2.F
+
+SOURCES.F = \
+ areachk.F \
+ estima.F \
+ chkout.F \
+ auresol.F \
+ chequal.F \
+ chkprec.F \
+ clear_c.F \
+ csum.F \
+ ddstyle.F \
+ dssarea.F \
+ eulavgg.F \
+ fft99.F \
+ fixarea.F \
+ freecf.F \
+ funcs.F \
+ gb2gb.F \
+ getconf.F \
+ ggintrp.F \
+ ggrotat.F \
+ ggvalue.F \
+ hgengg.F \
+ hgengrd.F \
+ hgengrw.F \
+ hgenll.F \
+ hgenllw.F \
+ hgetlsm.F \
+ hirlam.F \
+ hirlamw.F \
+ hirlsm.F \
+ hll2ll.F \
+ hll2llw.F \
+ hll2xyz.F \
+ hnei12.F \
+ hneill.F \
+ hntfap.F \
+ hntfaph.F \
+ hntfaps.F \
+ hntfau.F \
+ hntfauh.F \
+ hntfaus.F \
+ hntfbu.F \
+ hpshgpw.F \
+ hrg2gg.F \
+ hrg2ggw.F \
+ hrg2ll.F \
+ hrg2llw.F \
+ hsp2gg.F \
+ hsp2gg2.F \
+ hsp2gg3.F \
+ hwts12.F \
+ hwtsll.F \
+ hwtslsm.F \
+ iafree.F \
+ iagcntl.F \
+ iaidef.F \
+ iainit.F \
+ iaintgg.F \
+ iaintll.F \
+ iaogdef.F \
+ iaoldef.F \
+ iarcntl.F \
+ iareset.F \
+ iarmem.F \
+ ibasini.F \
+ igalloc.F \
+ igbess.F \
+ igdins.F \
+ igdiwe.F \
+ igglat.F \
+ iggmem.F \
+ iggrid.F \
+ igint.F \
+ igintr.F \
+ iglgrid.F \
+ iglrev.F \
+ iglsize.F \
+ iglsm01.F \
+ iglsmb.F \
+ iglsmd.F \
+ iglsmr.F \
+ iglsmst.F \
+ ignorm.F \
+ igplsm.F \
+ igpoleg.F \
+ igpolew.F \
+ igprec.F \
+ igscan.F \
+ igsetup.F \
+ gasetup.F \
+ outrep.F \
+ gettru.F \
+ igsize.F \
+ igtog.F \
+ igtogr.F \
+ igtran.F \
+ init_cm.F \
+ insane.F \
+ intf.F \
+ intfa.F \
+ intfap.F \
+ intfau.F \
+ intfb.F \
+ intfbp.F \
+ intfbu.F \
+ intfc.F \
+ intin.F \
+ intisl.F \
+ intlog.F \
+ intlogd.F \
+ intlogr.F \
+ intocn.F \
+ intocnu.F \
+ intout.F \
+ intpnum.F \
+ intuvdh.F \
+ intuvf.F \
+ intuvgh.F \
+ intuvp.F \
+ intuvph.F \
+ intuvs.F \
+ intuvu.F \
+ intuvy.F \
+ intuvxh.F \
+ intvect.F \
+ intvecy.F \
+ intwave.F \
+ intwave2.F \
+ intwavu.F \
+ irdiwe.F \
+ irgmem.F \
+ irgrid.F \
+ irgtog.F \
+ irint.F \
+ irintr.F \
+ irlrev.F \
+ irlsmb.F \
+ irprec.F \
+ irscan.F \
+ irsize.F \
+ iscrsz.F \
+ islproc.F \
+ issame.F \
+ jacobi.F \
+ jagggp.F \
+ jallgp.F \
+ jallwn.F \
+ jdebug.F \
+ jfindfn.F \
+ jfindfn3.F \
+ jfindir.F \
+ jgetgg.F \
+ jgglat.F \
+ jintend.F \
+ jintgg.F \
+ jintll.F \
+ jjset99.F \
+ jmakgg.F \
+ jmakgg3.F \
+ jmakll.F \
+ jmakll3.F \
+ jmemhan.F \
+ jmemhan2.F \
+ jmkofgg.F \
+ jmovgg.F \
+ jmovll.F \
+ jmvugg.F \
+ jmvull.F \
+ jnorsgg.F \
+ jnumgg.F \
+ jnumggq.F \
+ jopngg.F \
+ jopnggf.F \
+ jopnll.F \
+ jopnllf.F \
+ jreadgg.F \
+ jreadll.F \
+ jsgggp.F \
+ jsh2sh.F \
+ jsllgp.F \
+ jspleg1.F \
+ jsppole.F \
+ jstrll.F \
+ jstrwll.F \
+ jsymgg.F \
+ jsymll.F \
+ juvpole.F \
+ jvod2uv.F \
+ jwindll.F \
+ jwscal.F \
+ kintrg.F \
+ knfrom4.F \
+ krg2rg.F \
+ krg2rgu.F \
+ krg2rgd.F \
+ krg2rgy.F \
+ lgrpr4.F \
+ ll2xyz.F \
+ lrekam.F \
+ lsmfld.F \
+ lsm_red.F \
+ makerl.F \
+ mkbitmp.F \
+ mkframe.F \
+ newisl.F \
+ ngintrp.F \
+ ngrotat.F \
+ ngvalue.F \
+ nmakgg.F \
+ nmakll.F \
+ nptwe32.F \
+ numptns.F \
+ numptwe.F \
+ oceanp.F \
+ oceanu.F \
+ pddefs.F \
+ precip.F \
+ qpassm.F \
+ reset_c.F \
+ rpassm.F \
+ rphi.F \
+ set99.F \
+ sprotat.F \
+ sscal.F \
+ strlat.F \
+ tatorgg.F \
+ zprec.F \
+ w251idx.F \
+ waveidx.F \
+ wavexxx.F \
+ wavexx2.F \
+ wv2di32.F \
+ wv2didx.F \
+ wv2dint.F \
+ wv2dx32.F \
+ wv2dxxx.F \
+ wv2dxx2.F \
+ wvqlidx.F \
+ wvqlint.F \
+ wvqlin2.F \
+ xrotate.F \
+ xyz2ll.F \
+ outrep.F \
+ setrep.F \
+ global.F \
+ yrotate.F
+
+SOURCES.c = \
+ emosPrecision.c \
+ fftchk.c \
+ gmapbit.c \
+ intlogs.c \
+ jchmod.c \
+ jindex.c \
+ jopnggsm.c \
+ jopnllsm.c \
+ jtimer.c \
+ makemap.c \
+ my_ialloc.c \
+ rddefs.c \
+ showmap.c \
+ soffset.c
diff --git a/interpolation/sources.sun4 b/interpolation/sources.sun4
new file mode 100755
index 0000000..40b39c0
--- /dev/null
+++ b/interpolation/sources.sun4
@@ -0,0 +1,281 @@
+
+HEADERS = \
+ current.h \
+ debug.h \
+ grfixed.h \
+ intf.h \
+ jparams.h \
+ ouspace.h \
+ grdynam.h \
+ grspace.h \
+ intlog.h \
+ memreq.h \
+ parim.h
+
+VECTOR.F = dummy.F
+
+NO_OPT.F = dummy2.F
+
+SOURCES.F = \
+ areachk.F \
+ estima.F \
+ chkout.F \
+ auresol.F \
+ chequal.F \
+ chkprec.F \
+ clear_c.F \
+ csum.F \
+ ddstyle.F \
+ dssarea.F \
+ eulavgg.F \
+ fft99.F \
+ fixarea.F \
+ freecf.F \
+ funcs.F \
+ gb2gb.F \
+ getconf.F \
+ ggintrp.F \
+ ggrotat.F \
+ ggvalue.F \
+ hgengg.F \
+ hgengrd.F \
+ hgengrw.F \
+ hgenll.F \
+ hgenllw.F \
+ hgetlsm.F \
+ hirlam.F \
+ hirlamw.F \
+ hirlsm.F \
+ hll2ll.F \
+ hll2llw.F \
+ hll2xyz.F \
+ hnei12.F \
+ hneill.F \
+ hntfap.F \
+ hntfaph.F \
+ hntfaps.F \
+ hntfau.F \
+ hntfauh.F \
+ hntfaus.F \
+ hntfbu.F \
+ hpshgpw.F \
+ hrg2gg.F \
+ hrg2ggw.F \
+ hrg2ll.F \
+ hrg2llw.F \
+ hsp2gg.F \
+ hsp2gg2.F \
+ hsp2gg3.F \
+ hwts12.F \
+ hwtsll.F \
+ hwtslsm.F \
+ iafree.F \
+ iagcntl.F \
+ iaidef.F \
+ iainit.F \
+ iaintgg.F \
+ iaintll.F \
+ iaogdef.F \
+ iaoldef.F \
+ iarcntl.F \
+ iareset.F \
+ iarmem.F \
+ ibasini.F \
+ igalloc.F \
+ igbess.F \
+ igdins.F \
+ igdiwe.F \
+ igglat.F \
+ iggmem.F \
+ iggrid.F \
+ igint.F \
+ igintr.F \
+ iglgrid.F \
+ iglrev.F \
+ iglsize.F \
+ iglsm01.F \
+ iglsmb.F \
+ iglsmd.F \
+ iglsmr.F \
+ iglsmst.F \
+ ignorm.F \
+ igplsm.F \
+ igpoleg.F \
+ igpolew.F \
+ igprec.F \
+ igscan.F \
+ igsetup.F \
+ gasetup.F \
+ outrep.F \
+ gettru.F \
+ igsize.F \
+ igtog.F \
+ igtogr.F \
+ igtran.F \
+ init_cm.F \
+ insane.F \
+ intf.F \
+ intfa.F \
+ intfap.F \
+ intfau.F \
+ intfb.F \
+ intfbp.F \
+ intfbu.F \
+ intfc.F \
+ intin.F \
+ intisl.F \
+ intlog.F \
+ intlogd.F \
+ intlogr.F \
+ intocn.F \
+ intocnu.F \
+ intout.F \
+ intpnum.F \
+ intuvdh.F \
+ intuvf.F \
+ intuvgh.F \
+ intuvp.F \
+ intuvph.F \
+ intuvs.F \
+ intuvu.F \
+ intuvy.F \
+ intuvxh.F \
+ intvect.F \
+ intvecy.F \
+ intwave.F \
+ intwave2.F \
+ intwavu.F \
+ irdiwe.F \
+ irgmem.F \
+ irgrid.F \
+ irgtog.F \
+ irint.F \
+ irintr.F \
+ irlrev.F \
+ irlsmb.F \
+ irprec.F \
+ irscan.F \
+ irsize.F \
+ iscrsz.F \
+ islproc.F \
+ issame.F \
+ jacobi.F \
+ jagggp.F \
+ jallgp.F \
+ jallwn.F \
+ jdebug.F \
+ jfindfn.F \
+ jfindfn3.F \
+ jfindir.F \
+ jgetgg.F \
+ jgglat.F \
+ jintend.F \
+ jintgg.F \
+ jintll.F \
+ jjset99.F \
+ jmakgg.F \
+ jmakgg3.F \
+ jmakll.F \
+ jmakll3.F \
+ jmemhan.F \
+ jmemhan2.F \
+ jmkofgg.F \
+ jmovgg.F \
+ jmovll.F \
+ jmvugg.F \
+ jmvull.F \
+ jnorsgg.F \
+ jnumgg.F \
+ jnumggq.F \
+ jopngg.F \
+ jopnggf.F \
+ jopnll.F \
+ jopnllf.F \
+ jreadgg.F \
+ jreadll.F \
+ jsgggp.F \
+ jsh2sh.F \
+ jsllgp.F \
+ jspleg1.F \
+ jsppole.F \
+ jstrll.F \
+ jstrwll.F \
+ jsymgg.F \
+ jsymll.F \
+ juvpole.F \
+ jvod2uv.F \
+ jwindll.F \
+ jwscal.F \
+ kintrg.F \
+ knfrom4.F \
+ krg2rg.F \
+ krg2rgz.F \
+ krg2rgu.F \
+ krg2rgd.F \
+ krg2rgy.F \
+ lgrpr4.F \
+ ll2xyz.F \
+ lrekam.F \
+ lsmfld.F \
+ lsm_red.F \
+ makerl.F \
+ mkbitmp.F \
+ mkframe.F \
+ newisl.F \
+ ngintrp.F \
+ ngrotat.F \
+ ngvalue.F \
+ nmakgg.F \
+ nmakll.F \
+ nptwe32.F \
+ numptns.F \
+ numptwe.F \
+ oceanp.F \
+ oceanu.F \
+ pddefs.F \
+ precip.F \
+ qpassm.F \
+ reset_c.F \
+ rpassm.F \
+ rphi.F \
+ set99.F \
+ sprotat.F \
+ sscal.F \
+ strlat.F \
+ tatorgg.F \
+ zprec.F \
+ w251idx.F \
+ waveidx.F \
+ wavexxx.F \
+ wavexx2.F \
+ wv2di32.F \
+ wv2didx.F \
+ wv2dint.F \
+ wv2dx32.F \
+ wv2dxxx.F \
+ wv2dxx2.F \
+ wvqlidx.F \
+ wvqlint.F \
+ wvqlin2.F \
+ xrotate.F \
+ xyz2ll.F \
+ outrep.F \
+ setrep.F \
+ global.F \
+ yrotate.F
+
+SOURCES.c = \
+ emosPrecision.c \
+ fftchk.c \
+ gmapbit.c \
+ intlogs.c \
+ jchmod.c \
+ jindex.c \
+ jopnggsm.c \
+ jopnllsm.c \
+ jtimer.c \
+ makemap.c \
+ my_ialloc.c \
+ rddefs.c \
+ showmap.c \
+ soffset.c
diff --git a/interpolation/sprotat.F b/interpolation/sprotat.F
new file mode 100755
index 0000000..d4e506d
--- /dev/null
+++ b/interpolation/sprotat.F
@@ -0,0 +1,250 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION SPROTAT(INGRIB,INLEN,SLON,SLAT,OUTGRIB,OUTLEN)
+C
+C---->
+C**** SPROTAT
+C
+C Purpose
+C -------
+C
+C Rotates a spherical harmonic field.
+C
+C
+C Interface
+C ---------
+C
+C IRET = SPROTAT(INGRIB,INLEN,SLON,SLAT,OUTGRIB,OUTLEN)
+C
+C Input
+C -----
+C
+C INGRIB - Input GRIB field of spherical harmonics.
+C INLEN - Length in bytes of the input GRIB.
+C SLON - Longitude rotation required (degrees)
+C SLAT - Latitude rotation required (degrees)
+C
+C
+C Output
+C ------
+C
+C OUTGRIB - Output GRIB field of rotated spherical harmonics.
+C OUTLEN - Length in bytes of the output GRIB.
+C
+C Function returns 0 if all OK, otherwise the rotation failed.
+C
+C
+C Method
+C ------
+C
+C Externals
+C ---------
+C
+C GRIBEX - Decode/encode a GRIB product.
+C RPHI - Rotates spectral coefficients by longitude.
+#ifdef __uxp__
+C JACOBIF - Rotates spectral coefficients by latitude.
+#else
+C JACOBI - Rotates spectral coefficients by latitude.
+#endif
+C INTLOG - Logs messages.
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF October, 1995.
+C
+C
+C---------------------------------------------------------------------
+C----<
+C
+ IMPLICIT NONE
+#include "parim.h"
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 28300)
+ INTEGER JPLEN, JPNM
+ PARAMETER ( JPNM = JPSTRUNC )
+ PARAMETER ( JPLEN = (JPNM+1)*(JPNM+2) )
+C
+C Function arguments.
+ INTEGER INGRIB, INLEN, OUTGRIB, OUTLEN
+ DIMENSION INGRIB(*), OUTGRIB(*)
+ REAL SLON, SLAT
+C
+C Local variables
+ INTEGER KSEC0, KSEC1, KSEC2, KSEC3, KSEC4, KWORD, KLENP, KLENG
+ DIMENSION KSEC0(2),KSEC1(512),KSEC2(512),KSEC3(2),KSEC4(512)
+ REAL PSEC4, PSEC2, PSEC3
+ DIMENSION PSEC2(512),PSEC3(2),PSEC4(JPLEN)
+ REAL*8 DLON, DLAT
+ REAL*8 WORK
+ DIMENSION WORK(2*(JPNM+1)*(JPNM+6))
+ INTEGER ITRUNC, IRET, NBYTES, LOOP
+ LOGICAL LOK
+ REAL*8 DATA
+ DIMENSION DATA(JPLEN)
+C
+#if (defined CRAY)
+ DATA NBYTES/8/
+#else
+ DATA NBYTES/4/
+#endif
+C
+C Externals
+#ifdef __uxp__
+ LOGICAL JACOBIF
+ EXTERNAL JACOBIF
+#else
+ LOGICAL JACOBI
+ EXTERNAL JACOBI
+#endif
+C
+C _______________________________________________________
+C
+C* Section 1. Initialise.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ SPROTAT = 0
+ IRET = 0
+#if (defined CRAY) || (defined REAL_8)
+ DLON = SLON
+ DLAT = -90.0 - SLAT
+#else
+ DLON = DBLE(SLON)
+ DLAT = -90.0 - DBLE(SLAT)
+#endif
+C
+C Decode the field.
+ KLENP = JPLEN
+ KLENG = (INLEN+NBYTES-1)/NBYTES
+ IRET = 1
+ CALL GRIBEX(KSEC0, KSEC1, KSEC2, PSEC2, KSEC3, PSEC3, KSEC4,
+ X PSEC4, KLENP, INGRIB, KLENG, KWORD, 'D' , IRET )
+ IF(IRET.NE.0)THEN
+ CALL INTLOG(JP_FATAL,'SPROTAT: Error decoding GRIB,IRET=', IRET)
+ SPROTAT = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C Check that it really is a spherical harmonic field.
+ IF( (KSEC2(1).NE.50) .AND. (KSEC2(1).NE.60) ) THEN
+ CALL INTLOG(JP_FATAL,'SPROTAT: GRIB field not spectral',JPQUIET)
+ CALL INTLOG(JP_FATAL,'SPROTAT: GRIB KSEC2(1) = ', KSEC2(1))
+ SPROTAT = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ ITRUNC = KSEC2(2)
+C
+C _______________________________________________________
+C
+C* Section 2. Rotate the spectral coefficients.
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+#if (defined CRAY) || (defined REAL_8)
+C*********************************************************************
+C
+C (REALs are already double precision)
+C
+C Rotate the spectral field by longitude.
+C Positive DLON => frame rotated from west to east.
+C
+ CALL RPHI( PSEC4, ITRUNC, WORK, DLON)
+C
+C Rotate the spectral field by latitude.
+C Negative DLAT => rotate counter-clockwise about new polar axis.
+C
+#if (defined __uxp__)
+ LOK = JACOBIF( PSEC4, ITRUNC, WORK, DLAT)
+#else
+ LOK = JACOBI ( PSEC4, ITRUNC, WORK, DLAT)
+#endif
+#else
+C*********************************************************************
+C
+C (REALs are single precision)
+C
+C Expand spectral coefficients to REAL*8
+ DO 210 LOOP = 1, KSEC4(1)
+ DATA(LOOP) = DBLE(PSEC4(LOOP))
+ 210 CONTINUE
+C
+C Rotate the spectral field by longitude.
+C Positive DLON => frame rotated from west to east.
+C
+ CALL RPHI( DATA, ITRUNC, WORK, DLON)
+C
+C Rotate the spectral field by latitude.
+C Negative DLAT => rotate counter-clockwise about new polar axis.
+C
+#if (defined __uxp__)
+ LOK = JACOBIF( DATA, ITRUNC, WORK, DLAT)
+#else
+ LOK = JACOBI ( DATA, ITRUNC, WORK, DLAT)
+#endif
+ IF(.NOT.LOK) THEN
+ CALL INTLOG(JP_FATAL,'SPROTAT: JACOBI failed.', JPQUIET)
+ SPROTAT = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C Repack spectral coefficients to REAL*4.
+ DO 220 LOOP = 1, KSEC4(1)
+ PSEC4(LOOP) = SNGL(DATA(LOOP))
+ 220 CONTINUE
+C*********************************************************************
+#endif
+C
+C _______________________________________________________
+C
+C* Section 3. Repack the spectral coefficients.
+C _______________________________________________________
+C
+ 300 CONTINUE
+C
+C Put in details of southern pole of rotation
+ KSEC2(13) = NINT(SLAT*1000.0)
+ KSEC2(14) = NINT(SLON*1000.0)
+C
+C Put in indicator to show field has been rotated ..
+ KSEC2(1) = 60
+C
+C .. unless south pole of rotation is (0,-90).
+ IF( (KSEC2(14).EQ.0) .AND. (KSEC2(13).EQ.-90000) ) KSEC2(1) = 50
+C
+C Encode the field.
+ KLENP = KSEC4(1)
+ KLENG = (OUTLEN+NBYTES-1)/NBYTES
+ IRET = 1
+ CALL GRIBEX(KSEC0, KSEC1, KSEC2, PSEC2, KSEC3, PSEC3, KSEC4,
+ X PSEC4, KLENP, OUTGRIB, KLENG, KWORD, 'C' , IRET )
+ IF(IRET.NE.0)THEN
+ CALL INTLOG(JP_FATAL,'SPROTAT: Error encoding GRIB,IRET=', IRET)
+ SPROTAT = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+ OUTLEN = KSEC0(1)
+C
+C _______________________________________________________
+C
+C* Section 9. Return.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ RETURN
+ END
diff --git a/interpolation/sscal.F b/interpolation/sscal.F
new file mode 100755
index 0000000..69c4662
--- /dev/null
+++ b/interpolation/sscal.F
@@ -0,0 +1,79 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE SSCAL (KN, SA, XVEC, KNCX)
+C
+C---->
+C**** *SSCAL* - ROUTINE WHICH IMPLEMENTS THE BLAS ROUTINE OF THE
+C SAME NAME
+C
+C PURPOSE.
+C --------
+C
+C SIMPLE REPLACEMENT FOR IBM
+C
+C** INTERFACE.
+C ----------
+C
+C * CALL SSCAL (KN, SA, XVEC, KNCX) *
+C
+C
+C METHOD.
+C -------
+C
+C XVEC (1 + IP * KNCX) = XVEC (1 + IP * KNCX) * SA
+C FOR IP = 0 TO KN - 1
+C
+C EXTERNALS.
+C ----------
+C
+C NONE
+C
+C REFERENCE.
+C ----------
+C
+C NONE
+C
+C AUTHOR.
+C -------
+C
+C K. FIELDING * ECMWF * FEB 1992.
+C
+C MODIFICATIONS.
+C --------------
+C
+C NONE
+C
+C COMMON BLOCKS USED
+C -------------------
+C
+C NONE
+C----<
+C
+ INTEGER KN, KNCX
+Cjdc DOUBLE PRECISION SA
+Cjdc DOUBLE PRECISION XVEC (*)
+ REAL SA
+ REAL XVEC (*)
+C
+ INTEGER IP
+C
+C 1. MAIN LOOP OF CODE
+C ----------------------------------------------
+C
+ 100 CONTINUE
+ DO 110 IP = 0, KN - 1
+ XVEC (1 + IP * KNCX) = XVEC (1 + IP * KNCX) * SA
+ 110 CONTINUE
+C
+C END OF ROUTINE
+C
+ RETURN
+ END
diff --git a/interpolation/strlat.F b/interpolation/strlat.F
new file mode 100755
index 0000000..0e11893
--- /dev/null
+++ b/interpolation/strlat.F
@@ -0,0 +1,175 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE STRLAT( OLDLAT, STRETCH, KFLAG, NEWLAT, MFACTOR)
+C
+C---->
+C**** STRLAT
+C
+C PURPOSE
+C _______
+C
+C This routine transforms between stretched and real latitudes
+C and calculates the map factor.
+C
+C INTERFACE
+C _________
+C
+C CALL STRLAT( OLDLAT, STRETCH, KFLAG, NEWLAT, MFACTOR)
+C
+C Input parameters
+C ________________
+C
+C OLDLAT - Input latitude
+C STRETCH - Stretching factor
+C KFLAG - Flag to show direction of transform (real <-> stretched)
+C 0 = transform from real latitudes to stretched latitudes
+C 1 = transform from stretched latitudes to real latitudes
+C
+C Output parameters
+C ________________
+C
+C NEWLAT - Input latitude
+C MFACTOR - Map factor
+C
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C Method
+C ______
+C
+C Stretching factor S
+C
+C Map factor, m = S**2 + 1 + (S**2 -1)*mu
+C -----------------------
+C 2*S
+C
+C where mu = sin(lat) on the real sphere
+C
+C mu = (S**2+1)*md + (S**2-1)
+C ----------------------
+C (S**2+1) + (S**2-1)*md
+C
+C where md = sin(lat) on the stretched sphere.
+C
+C By rearrangement:
+C
+C md = (S**2+1)*mu - (S**2-1)
+C ----------------------
+C (S**2+1) - (S**2-1)*mu
+C
+C Wind U and V components are transformed as
+C
+C vreal = m * vtransformed
+C
+C Vorticity and divergence fields are transformed as
+C
+C vreal = (m*m) * vtransformed
+C
+C
+C Externals
+C _________
+C
+C None
+C
+C
+C Reference
+C _________
+C
+C None
+C
+C
+C Comments
+C ________
+C
+C None.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF July 1999
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ REAL OLDLAT, STRETCH, NEWLAT, MFACTOR, MSCALE
+ INTEGER KFLAG
+C
+C Parameters
+C
+ INTEGER JPRL2TR
+ PARAMETER (JPRL2TR = 0)
+ REAL PPI, DEG2RAD, RAD2DEG
+ PARAMETER ( PPI = 3.14159265358979 )
+ PARAMETER (DEG2RAD = PPI / 180.0)
+ PARAMETER (RAD2DEG = 180.0 / PPI)
+C
+C Local variables
+C
+ REAL A, B, ANGLE, MU, MUPRIME
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ A = STRETCH * STRETCH + 1
+ B = A - 2
+ ANGLE = OLDLAT * DEG2RAD
+C
+C _______________________________________________________
+C
+C* Section 2. Work out geometry
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+C Transform from real latitudes to stretched latitudes
+C
+ IF( KFLAG.EQ.JPRL2TR ) THEN
+ MUPRIME = SIN(ANGLE)
+ MU = (A*MUPRIME + B) / (A + B*MUPRIME)
+ NEWLAT = ASIN(MU) * RAD2DEG
+C
+C Transform from stretched latitudes to real latitudes
+C
+ ELSE
+ MU = SIN(ANGLE)
+ MUPRIME = (A*MU - B) / (A - B*MU)
+ NEWLAT = ASIN(MUPRIME) * RAD2DEG
+ ENDIF
+C
+C Calculate the map factor
+C
+ MFACTOR = (A + B*MU) / (2*STRETCH)
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ RETURN
+ END
diff --git a/interpolation/tatorgg.F b/interpolation/tatorgg.F
new file mode 100755
index 0000000..87d2b1b
--- /dev/null
+++ b/interpolation/tatorgg.F
@@ -0,0 +1,225 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION TATORGG(OLDFLD, NEWFLD, NUMPTS, POLELAT, POLELON,
+ X TYPE, NGAUSS)
+C
+C---->
+C**** TATORGG
+C
+C PURPOSE
+C _______
+C
+C Generates a rotated gaussian grid.
+C (Reverses the effects of GGROTAT).
+C
+C INTERFACE
+C _________
+C
+C IRET = TATORGG(OLDFLD,NEWFLD,NUMPTS,POLELAT,POLELON,TYPE,NGAUSS)
+C
+C
+C Input parameters
+C ________________
+C
+C OLDFLD = Original gaussian grid field.
+C NUMPTS = Total number of points in the original field.
+C POLELAT = Latitude of the South Pole of rotation.
+C POLELON = Longitude of the South Pole of rotation.
+C TYPE = 'R' if the gaussian field is reduced (quasi) gaussian.
+C = 'F' if the gaussian field is regular (full) gaussian.
+C NGAUSS = Gaussian grid number (number of latitude rows between
+C the pole and the equator).
+C
+C Output parameters
+C ________________
+C
+C NEWFLD = New gaussian grid field.
+C (This can be the same array as OLDFLD).
+C
+C Function returns zero if interpolation ran OK.
+C
+C
+C METHOD
+C ______
+C
+C The nearest gaussian latitude row is found.
+C
+C Work space is dynamically allocated. It is retained for future
+C calls.
+C
+C
+C EXTERNALS
+C _________
+C
+C JGETGG - Pickup the gaussian grid definition.
+C EULAVGG - Calculates the interpolated value at a point of the new
+C gaussian grid.
+C INTLOG - Logs output messages
+C JMEMHAN - Dynamically allocate work array
+C
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C
+C COMMENTS
+C ________
+C
+C The input field is assumed to be global in extent, and a known
+C definition, either N160 or N80 (reduced or regular).
+C The output field has the same type and dimensions as the input
+C field.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF April 1996
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C
+C----<
+C _______________________________________________________
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPMAXGG
+ PARAMETER( JPROUTINE = 38500 )
+ PARAMETER (JPMAXGG = 1280)
+C
+C Subroutine arguments
+C
+ REAL OLDFLD, NEWFLD, POLELAT, POLELON
+ INTEGER NUMPTS, NGAUSS
+ DIMENSION OLDFLD(NUMPTS), NEWFLD(NUMPTS)
+ CHARACTER*1 TYPE
+C
+C Local variables
+C
+ REAL GLATS(JPMAXGG)
+ INTEGER NGPTS(JPMAXGG)
+ INTEGER OLDGAUS
+ DATA OLDGAUS/0/
+ CHARACTER*1 OLDTYPE
+ DATA OLDTYPE/' '/
+ SAVE GLATS, NGPTS, OLDGAUS, OLDTYPE
+C
+ INTEGER NEXT, NEXLAT, INROW, LOOP, KRET
+ REAL STEPLON, CUTOFF, RLAT, RLON
+ DIMENSION RLON(JPMAXGG*2)
+C
+ INTEGER ISIZE
+ DATA ISIZE/0/
+ REAL WORK
+ POINTER (IWORK, WORK)
+ DIMENSION WORK(1)
+ SAVE IWORK, ISIZE
+C
+C _______________________________________________________
+C
+C* Section 1. Initialization.
+C _______________________________________________________
+C
+ 100 CONTINUE
+C
+ TATORGG = 0
+C
+C Get gaussian grid definition (first time only)
+C
+ IF( (OLDGAUS.NE.NGAUSS).OR.(OLDTYPE.NE.TYPE)) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'TATORGG: Get definitions for gaussian grid type:',JPQUIET)
+ CALL INTLOG(JP_DEBUG,TYPE,JPQUIET)
+ CALL INTLOG(JP_DEBUG,'TATORGG: grid number:',NGAUSS)
+C
+ CALL JGETGG(NGAUSS,TYPE,GLATS,NGPTS,KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'TATORGG: Failed to get gaussian grid definition:',JPQUIET)
+ TATORGG = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+ OLDGAUS = NGAUSS
+ OLDTYPE = TYPE
+ ENDIF
+C
+C Allocate work space if not already done.
+C
+ IF( ISIZE.LT.NUMPTS ) THEN
+ ISIZE = NUMPTS
+ CALL JMEMHAN(18,IWORK,NUMPTS,1,KRET)
+ IF( KRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'TATORGG: Memory allocation failed: status = ',KRET)
+ TATORGG = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ ENDIF
+C
+C Move the original field to the work array
+C
+ DO LOOP = 1, NUMPTS
+ WORK(LOOP) = OLDFLD(LOOP)
+ ENDDO
+C _______________________________________________________
+C
+C* Section 2. Work through latitude lines from north to south
+C _______________________________________________________
+C
+ 200 CONTINUE
+C
+ NEXT = 1
+C
+ DO NEXLAT = 1, NGAUSS*2
+ INROW = NGPTS(NEXLAT)
+ STEPLON = FLOAT(3600000/INROW)/10000.0
+ RLAT = GLATS(NEXLAT)
+C
+C Fill in longitudes along current line of latitude
+C
+ DO LOOP = 1, INROW
+ RLON(LOOP) = (LOOP-1)*STEPLON
+ ENDDO
+C
+C Rotate the current line of latitude
+C
+ CALL EULAVGG(NEWFLD,NEXT,INROW,RLAT,RLON,
+ X POLELAT,POLELON,WORK,NGAUSS,TYPE)
+C
+ NEXT = NEXT + INROW
+C
+ ENDDO
+C
+C _______________________________________________________
+C
+C* Section 9. Return to calling routine.
+C _______________________________________________________
+C
+ 900 CONTINUE
+C
+ CALL INTLOG(JP_DEBUG,'TATORGG: Return from GGROTAT:',JPQUIET)
+C
+ RETURN
+ END
diff --git a/interpolation/valpina.c b/interpolation/valpina.c
new file mode 100755
index 0000000..9dccbac
--- /dev/null
+++ b/interpolation/valpina.c
@@ -0,0 +1,243 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include "fortint.h"
+
+#define CHARSIZE (long) (sizeof(char)*8)
+#define LEASTSIGBIT 0x01
+
+long bitmapValue(unsigned char * , long );
+long bitmapValueTotal(unsigned char * , long, long );
+fortint valpina(unsigned char * , fortint *, fortint * );
+fortint valpina_(unsigned char * , fortint *, fortint * );
+long separationBetweenValues(unsigned char * , long , long );
+fortint numvals(unsigned char *, fortint *, fortint *);
+fortint numvals_(unsigned char *, fortint *, fortint *);
+fortint onebits(unsigned char *, fortint *);
+fortint onebits_(unsigned char *, fortint *);
+
+fortint numvals_(unsigned char * grib, fortint* istart, fortint* ifinish) {
+/*
+// Returns a count of the number of 1s in a GRIB between positions
+// 'start' and 'finish'.
+// If start = 0, the static values in the function are initialised.
+*/
+long start = (long) (*istart);
+long finish = (long) (*ifinish);
+static long oldTotal;
+static long oldStart, oldFinish;
+unsigned char * bitmap = grib;
+static unsigned char * oldBitmap = 0;
+
+ if( !start ) {
+ oldBitmap = 0;
+ oldTotal = 0;
+ oldStart = oldFinish = 1;
+ return (fortint) oldTotal;
+ }
+
+ if( oldBitmap != bitmap ) {
+ oldBitmap = bitmap;
+ oldStart = oldFinish = 1;
+ oldTotal = 0;
+ }
+
+ if( start == finish ) {
+ oldStart = oldFinish = finish;
+ oldTotal = 0;
+ return (fortint) oldTotal;
+ }
+
+ if( oldStart != start ) {
+ oldTotal = bitmapValueTotal(bitmap, start+1, finish);
+ }
+ else {
+ if( oldFinish < finish )
+ oldTotal += bitmapValueTotal(bitmap, oldFinish+1, finish);
+ else if( oldFinish > finish )
+ oldTotal -= bitmapValueTotal(bitmap, finish+1, oldFinish);
+ }
+
+ oldStart = start;
+ oldFinish = finish;
+
+ return (fortint) oldTotal;
+
+}
+
+fortint numvals(unsigned char * grib, fortint* istart, fortint* ifinish) {
+ return numvals_(grib,istart,ifinish);
+}
+
+fortint onebits_(unsigned char * grib, fortint* isection_3_offset) {
+/*
+// Returns a count of the number of 1s in a GRIB section 3 bitmap.
+*/
+long section_3_offset = (long) (*isection_3_offset);
+unsigned char * bitmap = grib + section_3_offset;
+long length, unused;
+long number_of_bits, total;
+
+ length = (*bitmap)<<16 | (*(bitmap+1)<<8) | *(bitmap+2);
+ unused = *(bitmap+3);
+ number_of_bits = ((length-6)*CHARSIZE) - unused;
+
+ total = bitmapValueTotal((bitmap+6),1,number_of_bits);
+ return ( (fortint) total );
+}
+
+fortint onebits(unsigned char * grib, fortint* isection_3_offset) {
+ return onebits_(grib,isection_3_offset);
+}
+
+long bitmapValueTotal(unsigned char * bitmap, long start, long finish) {
+/*
+// Returns the count of 1 bits between start and finish in a bitmap.
+*/
+long total = 0;
+unsigned char * first, * last, * next;
+/*
+ Lookup table to count number of 1s in a char
+*/
+static const char lookup[256] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,
+ 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
+ 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
+ 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
+ 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
+ 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
+ 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
+ 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
+ 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
+ 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
+ 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
+ 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
+ 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
+ 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
+ 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
+ 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8};
+/*
+ Masks to remove bits from left- and right-hand end of a char
+*/
+static const unsigned char bottomMask[8] =
+ {0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01};
+static const unsigned char topMask[8] =
+ {0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80};
+int bitsToAdd, bitsToSubtract;
+
+ first = bitmap + (start-1)/CHARSIZE;
+ last = bitmap + (finish-1)/CHARSIZE;
+
+
+ bitsToAdd = (start-1)%CHARSIZE;
+ total = lookup[(*first & bottomMask[bitsToAdd])];
+
+ for( next = (first+1); next < last ; next++ )
+ total += lookup[*next];
+
+ if( last > first ) total += lookup[*last];
+
+ bitsToSubtract = CHARSIZE - 1 - (finish-1)%CHARSIZE;
+ total -= lookup[(*last & (~topMask[bitsToSubtract]))];
+
+ return total;
+}
+
+long bitmapValue(unsigned char * bitmap, long index) {
+/*
+// Returns the value (0,1) of the bit at position 'index' in a bitmap.
+*/
+unsigned char * next;
+int bitShift;
+
+ next = bitmap + (index-1)/CHARSIZE;
+ bitShift = CHARSIZE - 1 - ((index-1)%CHARSIZE);
+
+ return (((*next) >> bitShift) & LEASTSIGBIT);
+
+}
+
+fortint valpina_(unsigned char * grib, fortint* ioffset, fortint* iindex) {
+/*
+// A GRIB product starts at 'grib' and contains missing/non-missing values
+// as described by a bitmap which is at position 'offset' in the GRIB.
+//
+// 'index' is the position of a point (missing/non-missing) in the field.
+// If index = 0, the static values in the function are initialised.
+//
+// Examines the bitmap and returns:
+//
+// - the actual index of a non-missing value
+//
+// - 0 for a missing value
+*/
+long offset = (long) (*ioffset);
+long index = (long) (*iindex);
+unsigned char * bitmap = (grib + offset);
+static unsigned char * oldBitmap;
+static long count = 0;
+static long oldIndex = 0;
+long value;
+
+ if( !(index) ) {
+ oldBitmap = 0;
+ count = 0;
+ oldIndex = 0;
+ return (fortint) 0;
+ }
+
+ if( oldBitmap != bitmap ) {
+ oldBitmap = bitmap;
+ count = 0;
+ oldIndex = 0;
+ }
+
+ value = bitmapValue(bitmap, index);
+
+ if( value ) {
+ if( (index) != oldIndex ) {
+ count += separationBetweenValues(bitmap, oldIndex, index);
+ oldIndex = index;
+ }
+ return (fortint) count;
+ }
+ else
+ return (fortint) 0;
+}
+
+fortint valpina(unsigned char * grib, fortint* ioffset, fortint* iindex) {
+ return valpina_(grib,ioffset,iindex);
+}
+
+long separationBetweenValues(unsigned char * bitmap,long oldIndex,long index) {
+/*
+// Counts the number of actual (non-missing) values between two locations
+// in the bitmap given by 'index' and 'oldIndex'.
+//
+// The returned count can be positive or negative depending on whether
+// index is after or before oldIndex.
+*/
+long start, finish, sign = 1, total = 0;
+
+ if( index > oldIndex ) {
+ start = oldIndex;
+ finish = index;
+ }
+ else {
+ start = index;
+ finish = oldIndex;
+ sign = -1;
+ }
+
+ total = bitmapValueTotal(bitmap, (start+1), finish);
+
+ return (sign*total);
+}
diff --git a/interpolation/w251idx.F b/interpolation/w251idx.F
new file mode 100755
index 0000000..44de597
--- /dev/null
+++ b/interpolation/w251idx.F
@@ -0,0 +1,356 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION W251IDX(KOLDNUM,NUMOLD,OLDLATS,OLDWEST,OLDEAST,
+ X KNEWNUM,NUMNEW,NEWLATS,NEWIDX)
+C
+C---->
+C*****W251IDX*
+C
+C PURPOSE
+C -------
+C
+C Determines which nearest-neighbour values of an input wave
+C 2D-spectra grid field to use for an output wave 2D-spectra
+C grid field.
+C
+C
+C INTERFACE
+C ---------
+C
+C IRET = W251IDX(KOLDNUM,NUMOLD,OLDLATS,OLDWEST,OLDEAST,
+C X KNEWNUM,NUMNEW,NEWLATS,NEWIDX)
+C
+C Input arguments
+C ---------------
+C
+C KOLDNUM - No. of meridians from North to South pole (input field)
+C NUMOLD - Array giving number of points along each latitude
+C (empty latitudes have entry 0)
+C OLDLATS - input field latitudes
+C OLDWEST - western longitude of the input field (degrees)
+C OLDEAST - eastern longitude of the input field (degrees)
+C
+C KNEWNUM - No. of meridians from North to South pole (output field)
+C NUMNEW - Array giving number of points along each latitude
+C (empty latitudes have entry 0)
+C NEWLATS - output field latitudes
+C
+C Output arguments
+C ----------------
+C
+C NEWIDX - Indices of points to use
+C
+C Function returns 0 if the interpolation was OK.
+C
+C
+C METHOD
+C ------
+C
+C The index of the nearest neighbouring grid point value of
+C the input field is assigned to each point of the output
+C grid.
+C The index is zero if the output grid point is 'missing'.
+C
+C The input field can be regular or quasi-regular, and can be
+C global or a subarea.
+C The output field can be regular or quasi-regular.
+C
+C
+C EXTERNALS
+C ---------
+C
+C INTLOG - Log error message.
+C
+C
+C REFERENCE
+C ---------
+C
+C None
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF October 1997
+C
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 19410 )
+ INTEGER JPLLMAX
+ PARAMETER ( JPLLMAX = 1801 )
+C `--> allow upto 0.1 degree resolution.
+ INTEGER JPNMOUT
+ PARAMETER ( JPNMOUT = 1800 )
+C `--> allow upto 0.1 degree resolution.
+C
+C Function arguments
+C
+ INTEGER KOLDNUM, NUMOLD, KNEWNUM, NUMNEW
+ DIMENSION NUMOLD(*), NUMNEW(*)
+ REAL OLDWEST, OLDEAST, OLDLATS, NEWLATS
+ DIMENSION OLDLATS(*), NEWLATS(*)
+ INTEGER NEWIDX
+ DIMENSION NEWIDX(*)
+C
+C Local arguments
+C
+ INTEGER K, NEWCOL, NEWROW, INCOL, LOOP, NEXT, NUMMAX
+ INTEGER I_NW, I_SW, I_N, I_S, I_NE, I_SE
+ REAL*8 DELONGN, DELONGS, DIFF, RESOL, DINC, DEPS
+ REAL*8 DIST_NW, DIST_SW, DIST_NE, DIST_SE, DIST_N, DIST_S
+ REAL*4 DISNW, DISNE, DISSW, DISSE
+ REAL*8 ZXIN, ZXIS, LON, LAT, OWEST, OEAST
+ DIMENSION LON(JPNMOUT*2)
+ LOGICAL LINGNS, LINGWE
+ INTEGER INDEXI
+ DIMENSION INDEXI(JPLLMAX)
+ LOGICAL LGLOBAL, LFULLG, LGWRAP
+ DATA DEPS/0.00005/
+C
+C ---------------------------------------------------------------------
+C* Section 1. Initalisation.
+C ---------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ W251IDX = 0
+ CALL INTLOG(JP_DEBUG,
+ X 'W251IDX: Wave interpolation requested.',JPQUIET)
+C
+C Check latitude/longitude grid specification
+C
+ IF( KOLDNUM.GT.JPLLMAX ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'W251IDX: Number of latitudes in input grid = ',KOLDNUM)
+ CALL INTLOG(JP_ERROR,
+ X 'W251IDX: And is greater than allowed maximum = ',JPLLMAX)
+ W251IDX = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C Set up INDEXI for latitude lines in input lat/lon array
+C
+ INDEXI(1) = 0
+ DO LOOP = 2, KOLDNUM
+ INDEXI(LOOP) = INDEXI(LOOP-1) + NUMOLD(LOOP-1)
+ ENDDO
+C
+ OEAST = OLDEAST
+ OWEST = OLDWEST
+C
+C Check whether the input field is global or a subarea
+C
+ NUMMAX = NUMOLD(1)
+ DO LOOP = 2, KOLDNUM
+ IF( NUMOLD(LOOP).GT.NUMMAX ) NUMMAX = NUMOLD(LOOP)
+ ENDDO
+ IF( NUMMAX.LE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'W251IDX: Input wave field has no points',JPQUIET)
+ W251IDX = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ LGWRAP = ABS((OEAST-OWEST) - DBLE(360.0)).LT.DEPS
+ DINC = 360.0/DBLE(NUMMAX)
+ LFULLG = ABS((DMOD((OEAST-OWEST+DBLE(360.0)),DBLE(360.0))
+ X +DINC)-DBLE(360.0)).LT.DEPS
+C
+ LGLOBAL = LFULLG.OR.LGWRAP
+C
+C ---------------------------------------------------------------------
+C* Section 2. Interpolation.
+C ---------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ NEXT = 1
+C
+ DO 220 NEWROW = 1, KNEWNUM
+C
+C Find old latitude rows to north and south of new latitude and
+C set up the distance between new row and the old rows to N and S.
+C
+ DO LOOP = 1, KOLDNUM -1
+ IF( (NEWLATS(NEWROW).LE.OLDLATS(LOOP)) .AND.
+ X (NEWLATS(NEWROW).GT.OLDLATS(LOOP+1)) ) THEN
+ I_N = LOOP
+ I_S = MIN(LOOP+1,KOLDNUM)
+ GOTO 205
+ ENDIF
+ ENDDO
+C
+ IF( NEWLATS(NEWROW).EQ.OLDLATS(KOLDNUM) ) THEN
+ I_N = KOLDNUM
+ I_S = KOLDNUM
+ ELSE
+ I_N = -1
+ I_S = -1
+ ENDIF
+C
+ 205 CONTINUE
+ IF( I_N.NE.I_S) THEN
+ DIFF = OLDLATS(I_N) - OLDLATS(I_S)
+ DIST_N = (OLDLATS(I_N) - NEWLATS(NEWROW)) / DIFF
+ ELSE
+ DIST_N = 1.0
+ ENDIF
+ DIST_S = 1.0 - DIST_N
+C
+C Check if the new interpolated row lies between 2 old rows which
+C have data points
+C
+ LINGNS = .FALSE.
+ IF( I_N.GT.0 ) THEN
+ IF( (NUMOLD(I_N).GT.0).AND.(NUMOLD(I_S).GT.0) ) THEN
+C
+C Yes, so set up the grid increments.
+C
+C Note that the grid increments are different depending on
+C whether or not the grid is global; global grids have an
+C extra interval at the end (eg between 358.5 and 0.0), while
+C subareas have outer limits defined by 'west' and 'east' and
+C a given number of points in between.
+C
+ IF( LGLOBAL ) THEN
+ DELONGN = 360.0/DBLE(NUMOLD(I_N))
+ DELONGS = 360.0/DBLE(NUMOLD(I_S))
+ ELSE
+ DELONGN = DMOD((OEAST-OWEST+DBLE(360.0)), DBLE(360.0))
+ X / DBLE(NUMOLD(I_N)-1)
+ DELONGS = DMOD((OEAST-OWEST+DBLE(360.0)), DBLE(360.0))
+ X / DBLE(NUMOLD(I_S)-1)
+ ENDIF
+ LINGNS = .TRUE.
+ ENDIF
+C
+ ENDIF
+C
+C Setup longitudes for the current row
+C
+ INCOL = NUMNEW(NEWROW)
+ IF( INCOL.NE.0 ) THEN
+ IF( LGLOBAL ) THEN
+ RESOL = 360.0/DBLE(INCOL)
+ ELSE
+ RESOL = (OEAST-OWEST)/(DBLE(INCOL)-1)
+ ENDIF
+ DO LOOP = 1, INCOL
+ LON(LOOP) = OLDWEST + DBLE(LOOP-1)*RESOL
+ ENDDO
+C
+ DO 210 NEWCOL = 1, INCOL
+C
+ LINGWE = (LON(NEWCOL).GT.OWEST).OR.(LON(NEWCOL).LT.OEAST)
+C
+ IF( LINGNS .AND. LINGWE ) THEN
+C
+C If point to be interpolated is inside the input field ,
+C work out distances from new point to four neighbours.
+C
+ ZXIN = DMOD((LON(NEWCOL)+(DBLE(360.0)-OWEST)+DBLE(720.0)),
+ X DBLE(360.0))
+ ZXIS = ZXIN
+ ZXIN = ZXIN/DELONGN + 1.0
+ ZXIS = ZXIS/DELONGS + 1.0
+ I_NW = INT(ZXIN)
+ I_NE = I_NW + 1
+ I_SW = INT(ZXIS)
+ I_SE = I_SW + 1
+C
+C Allow wrap-around
+C
+C
+ I_NW = MOD(I_NW,NUMOLD(I_N))
+ I_NE = MOD(I_NE,NUMOLD(I_N))
+ I_SW = MOD(I_SW,NUMOLD(I_S))
+ I_SE = MOD(I_SE,NUMOLD(I_S))
+ IF( I_NW.EQ.0 ) I_NW = NUMOLD(I_N)
+ IF( I_SW.EQ.0 ) I_SW = NUMOLD(I_S)
+ IF( I_NE.EQ.0 ) I_NE = NUMOLD(I_N)
+ IF( I_SE.EQ.0 ) I_SE = NUMOLD(I_S)
+C
+C Calculate distance from interpolated point to its neighbours
+C
+ DIST_NW = ZXIN - REAL(I_NW)
+ DIST_NE = 1.0 - DIST_NW
+ DIST_SW = ZXIS - REAL(I_SW)
+ DIST_SE = 1.0 - DIST_SW
+C
+C Take nearest grid point value.
+C
+ DISNW = DIST_NW*DIST_NW + DIST_N*DIST_N
+ DISNE = DIST_NE*DIST_NE + DIST_N*DIST_N
+ DISSW = DIST_SW*DIST_SW + DIST_S*DIST_S
+ DISSE = DIST_SE*DIST_SE + DIST_S*DIST_S
+C
+ IF( (DISNW.LE.DISNE).AND.(DISNW.LE.DISSW).AND.
+ X (DISNW.LE.DISSE) ) THEN
+C
+C Use north-west neighbour
+C
+ NEWIDX(NEXT) = INDEXI(I_N)+I_NW
+C
+ ELSE IF( (DISNE.LE.DISSW).AND.(DISNE.LE.DISSE) ) THEN
+C
+C Use north-east neighbour
+C
+ NEWIDX(NEXT) = INDEXI(I_N)+I_NE
+C
+ ELSE IF( DISSW.LE.DISSE ) THEN
+C
+C Use south-west neighbour
+C
+ NEWIDX(NEXT) = INDEXI(I_S)+I_SW
+ ELSE
+C
+C Use south-east neighbour
+C
+ NEWIDX(NEXT) = INDEXI(I_S)+I_SE
+ ENDIF
+C
+C If the point to be interpolated is outside the input field,
+C set it to 'land'.
+C
+ ELSE
+ NEWIDX(NEXT) = 0
+ ENDIF
+C
+ NEXT = NEXT + 1
+C
+ 210 CONTINUE
+C
+ ENDIF
+C
+ 220 CONTINUE
+C
+C ---------------------------------------------------------------------
+C* Section 9. Closedown.
+C ---------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( W251IDX.EQ.0 ) THEN
+ CALL INTLOG(JP_DEBUG, 'W251IDX: successful.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_ERROR, 'W251IDX: failed.',JPQUIET)
+ ENDIF
+C
+ RETURN
+ END
diff --git a/interpolation/waveidx.F b/interpolation/waveidx.F
new file mode 100755
index 0000000..de171e5
--- /dev/null
+++ b/interpolation/waveidx.F
@@ -0,0 +1,369 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION WAVEIDX(KOLDNUM,NUMOLD,OLDLATS,OLDWEST,OLDEAST,
+ X KNEWNUM, NUMNEW, NEWLATS,
+ X NEWIDX, DISTNEW)
+C
+C---->
+C*****WAVEIDX*
+C
+C PURPOSE
+C -------
+C
+C Determines which nearest-neighbour values of an input global wave
+C 2D-spectra grid field to use for an output global wave 2D-spectra
+C grid field.
+C
+C
+C INTERFACE
+C ---------
+C
+C IRET = WAVEIDX(KOLDNUM,NUMOLD,OLDLATS,OLDWEST,OLDEAST,
+C X KNEWNUM, NUMNEW, NEWLATS,
+C X NEWIDX, DISTNEW)
+C
+C Input arguments
+C ---------------
+C
+C KOLDNUM - No. of meridians from North to South pole (input field)
+C NUMOLD - Array giving number of points along each latitude
+C (empty latitudes have entry 0)
+C OLDLATS - input field latitudes
+C OLDWEST - western longitude of the input field (degrees)
+C OLDEAST - eastern longitude of the input field (degrees)
+C
+C KNEWNUM - No. of meridians from North to South pole (output field)
+C NUMNEW - Array giving number of points along each latitude
+C (empty latitudes have entry 0)
+C NEWLATS - output field latitudes
+C
+C Output arguments
+C ----------------
+C
+C NEWIDX - Indices of four neighbours
+C DISTNEW - Distances of current 'box' edges from new point
+C
+C Function returns 0 if the interpolation was OK.
+C
+C
+C METHOD
+C ------
+C
+C The indices of the nearest four neighbouring grid points of the
+C input field is assigned to each point of the output grid.
+C The indices are zero if the output grid point is 'missing'.
+C
+C The input field can be regular or quasi-regular, and can be
+C global or a subarea.
+C The output field can be regular or quasi-regular.
+C
+C
+C EXTERNALS
+C ---------
+C
+C INTLOG - Log error message.
+C
+C
+C REFERENCE
+C ---------
+C
+C None
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF January 1998
+C
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 19410 )
+ INTEGER JPLLMAX
+ PARAMETER ( JPLLMAX = 1801 )
+C `--> allow upto 0.1 degree resolution.
+ INTEGER JPNMOUT
+ PARAMETER ( JPNMOUT = 1800 )
+C `--> allow upto 0.1 degree resolution.
+ INTEGER JPNW, JPNE, JPSW, JPSE, JPN, JPS
+ INTEGER JPDISNW, JPDISNE, JPDISSW, JPDISSE
+ PARAMETER (JPNW = 1)
+ PARAMETER (JPNE = 2)
+ PARAMETER (JPSW = 3)
+ PARAMETER (JPSE = 4)
+ PARAMETER (JPN = 5)
+ PARAMETER (JPS = 6)
+ PARAMETER (JPDISNW = 7)
+ PARAMETER (JPDISNE = 8)
+ PARAMETER (JPDISSW = 9)
+ PARAMETER (JPDISSE = 10)
+C
+C Function arguments
+C
+ INTEGER KOLDNUM, NUMOLD, KNEWNUM, NUMNEW
+ DIMENSION NUMOLD(*), NUMNEW(*)
+ REAL OLDWEST, OLDEAST, OLDLATS, NEWLATS
+ DIMENSION OLDLATS(*), NEWLATS(*)
+ INTEGER NEWIDX
+ DIMENSION NEWIDX(4,*)
+ REAL*4 DISTNEW
+ DIMENSION DISTNEW(10,*)
+C
+C Local arguments
+C
+ INTEGER K, NEWCOL, NEWROW, INCOL, LOOP, NEXT, NUMMAX
+ INTEGER I_NW, I_SW, I_N, I_S, I_NE, I_SE
+ REAL*8 DELONGN, DELONGS, DIFF, RESOL, DINC, DEPS
+ REAL*8 DIST_NW, DIST_SW, DIST_NE, DIST_SE, DIST_N, DIST_S
+ REAL*8 DISNW, DISNE, DISSW, DISSE
+ REAL*8 ZXIN, ZXIS, LON, LAT, OWEST, OEAST
+ DIMENSION LON(JPNMOUT*2)
+ LOGICAL LINGNS, LINGWE
+ INTEGER INDEXI
+ DIMENSION INDEXI(JPLLMAX)
+ LOGICAL LGLOBAL, LFULLG, LGWRAP
+ DATA DEPS/0.0005/
+C
+C ---------------------------------------------------------------------
+C* Section 1. Initalisation.
+C ---------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WAVEIDX = 0
+ CALL INTLOG(JP_DEBUG,
+ X 'WAVEIDX: Wave interpolation requested.',JPQUIET)
+C
+C Check latitude/longitude grid specification
+C
+ IF( KOLDNUM.GT.JPLLMAX ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEIDX: Number of latitudes in input grid = ',KOLDNUM)
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEIDX: And is greater than allowed maximum = ',JPLLMAX)
+ WAVEIDX = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C Set up INDEXI for latitude lines in input lat/lon array
+C
+ INDEXI(1) = 0
+ DO LOOP = 2, KOLDNUM
+ INDEXI(LOOP) = INDEXI(LOOP-1) + NUMOLD(LOOP-1)
+ ENDDO
+C
+ OEAST = OLDEAST
+ OWEST = OLDWEST
+C
+C Check whether the input field is global or a subarea
+C
+ NUMMAX = NUMOLD(1)
+ DO LOOP = 2, KOLDNUM
+ IF( NUMOLD(LOOP).GT.NUMMAX ) NUMMAX = NUMOLD(LOOP)
+ ENDDO
+ IF( NUMMAX.LE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEIDX: Input wave field has no points',JPQUIET)
+ WAVEIDX = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ LGWRAP = ABS((OEAST-OWEST) - DBLE(360.0)).LT.DEPS
+ DINC = 360.0/DBLE(NUMMAX)
+ LFULLG = ABS((DMOD((OEAST-OWEST+DBLE(360.0)),DBLE(360.0))
+ X +DINC)-DBLE(360.0)).LT.DEPS
+C
+ LGLOBAL = LFULLG.OR.LGWRAP
+C
+C ---------------------------------------------------------------------
+C* Section 2. Interpolation.
+C ---------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ NEXT = 1
+C
+ DO 220 NEWROW = 1, KNEWNUM
+C
+C Find old latitude rows to north and south of new latitude and
+C set up the distance between new row and the old rows to N and S.
+C
+ DO LOOP = 1, KOLDNUM -1
+ IF( (NEWLATS(NEWROW).LE.OLDLATS(LOOP)) .AND.
+ X (NEWLATS(NEWROW).GT.OLDLATS(LOOP+1)) ) THEN
+ I_N = LOOP
+ I_S = MIN(LOOP+1,KOLDNUM)
+ GOTO 205
+ ENDIF
+ ENDDO
+C
+ IF( NEWLATS(NEWROW).EQ.OLDLATS(KOLDNUM) ) THEN
+ I_N = KOLDNUM
+ I_S = KOLDNUM
+ ELSE
+ I_N = -1
+ I_S = -1
+ ENDIF
+C
+ 205 CONTINUE
+ IF( I_N.NE.I_S) THEN
+ DIFF = OLDLATS(I_N) - OLDLATS(I_S)
+ DIST_N = (OLDLATS(I_N) - NEWLATS(NEWROW)) / DIFF
+ ELSE
+ DIST_N = 1.0
+ ENDIF
+ DIST_S = 1.0 - DIST_N
+C
+C Check if the new interpolated row lies between 2 old rows which
+C have data points
+C
+ LINGNS = .FALSE.
+ IF( I_N.GT.0 ) THEN
+ IF( (NUMOLD(I_N).GT.0).AND.(NUMOLD(I_S).GT.0) ) THEN
+C
+C Yes, so set up the grid increments.
+C
+C Note that the grid increments are different depending on
+C whether or not the grid is global; global grids have an
+C extra interval at the end (eg between 358.5 and 0.0), while
+C subareas have outer limits defined by 'west' and 'east' and
+C a given number of points in between.
+C
+ IF( LGLOBAL ) THEN
+ DELONGN = 360.0/DBLE(NUMOLD(I_N))
+ DELONGS = 360.0/DBLE(NUMOLD(I_S))
+ ELSE
+ DELONGN = DMOD((OEAST-OWEST+DBLE(360.0)), DBLE(360.0))
+ X / DBLE(NUMOLD(I_N)-1)
+ DELONGS = DMOD((OEAST-OWEST+DBLE(360.0)), DBLE(360.0))
+ X / DBLE(NUMOLD(I_S)-1)
+ ENDIF
+ LINGNS = .TRUE.
+ ENDIF
+C
+ ENDIF
+C
+C Setup longitudes for the current row
+C
+ INCOL = NUMNEW(NEWROW)
+ IF( INCOL.NE.0 ) THEN
+ RESOL = 360.0/DBLE(INCOL)
+ DO LOOP = 1, INCOL
+ LON(LOOP) = DBLE(LOOP-1)*RESOL
+ ENDDO
+C
+ DO 210 NEWCOL = 1, INCOL
+C
+ LINGWE = (LON(NEWCOL).GT.OWEST).OR.(LON(NEWCOL).LT.OEAST)
+C
+ IF( LINGNS .AND. LINGWE ) THEN
+C
+C If point to be interpolated is inside the input field ,
+C work out distances from new point to four neighbours.
+C
+ ZXIN = DMOD((LON(NEWCOL)+(DBLE(360.0)-OWEST)+DBLE(720.0)),
+ X DBLE(360.0))
+ ZXIS = ZXIN
+ ZXIN = ZXIN/DELONGN + 1.0
+ ZXIS = ZXIS/DELONGS + 1.0
+ I_NW = INT(ZXIN)
+ I_NE = I_NW + 1
+ I_SW = INT(ZXIS)
+ I_SE = I_SW + 1
+C
+C Allow wrap-around
+C
+ I_NW = MOD(I_NW,NUMOLD(I_N))
+ I_NE = MOD(I_NE,NUMOLD(I_N))
+ I_SW = MOD(I_SW,NUMOLD(I_S))
+ I_SE = MOD(I_SE,NUMOLD(I_S))
+ IF( I_NW.EQ.0 ) I_NW = NUMOLD(I_N)
+ IF( I_SW.EQ.0 ) I_SW = NUMOLD(I_S)
+ IF( I_NE.EQ.0 ) I_NE = NUMOLD(I_N)
+ IF( I_SE.EQ.0 ) I_SE = NUMOLD(I_S)
+C
+C Calculate distance from interpolated point to its neighbours
+C
+ DIST_NW = ZXIN - REAL(I_NW)
+ DIST_NE = 1.0 - DIST_NW
+ DIST_SW = ZXIS - REAL(I_SW)
+ DIST_SE = 1.0 - DIST_SW
+C
+ DISTNEW(JPDISNW,NEXT) = (DIST_NW*DIST_NW + DIST_N*DIST_N)
+ DISTNEW(JPDISNE,NEXT) = (DIST_NE*DIST_NE + DIST_N*DIST_N)
+ DISTNEW(JPDISSW,NEXT) = (DIST_SW*DIST_SW + DIST_S*DIST_S)
+ DISTNEW(JPDISSE,NEXT) = (DIST_SE*DIST_SE + DIST_S*DIST_S)
+C
+ DISTNEW(JPNW,NEXT) = DIST_NW
+ DISTNEW(JPNE,NEXT) = DIST_NE
+ DISTNEW(JPSW,NEXT) = DIST_SW
+ DISTNEW(JPSE,NEXT) = DIST_SE
+ DISTNEW(JPN ,NEXT) = DIST_N
+ DISTNEW(JPS ,NEXT) = DIST_S
+C
+ NEWIDX(JPNW,NEXT) = INDEXI(I_N)+I_NW
+ NEWIDX(JPNE,NEXT) = INDEXI(I_N)+I_NE
+ NEWIDX(JPSW,NEXT) = INDEXI(I_S)+I_SW
+ NEWIDX(JPSE,NEXT) = INDEXI(I_S)+I_SE
+C
+C If the point to be interpolated is outside the input field,
+C set it to 'land'.
+C
+ ELSE
+C
+ DISTNEW(JPNW,NEXT) = 0
+ DISTNEW(JPNE,NEXT) = 0
+ DISTNEW(JPSW,NEXT) = 0
+ DISTNEW(JPSE,NEXT) = 0
+ DISTNEW(JPN ,NEXT) = 0
+ DISTNEW(JPS ,NEXT) = 0
+C
+ DISTNEW(JPDISNW,NEXT) = 0
+ DISTNEW(JPDISNE,NEXT) = 0
+ DISTNEW(JPDISSW,NEXT) = 0
+ DISTNEW(JPDISSE,NEXT) = 0
+C
+ NEWIDX(JPNW,NEXT) = 0
+ NEWIDX(JPNE,NEXT) = 0
+ NEWIDX(JPSW,NEXT) = 0
+ NEWIDX(JPSE,NEXT) = 0
+C
+ ENDIF
+C
+ NEXT = NEXT + 1
+C
+ 210 CONTINUE
+C
+ ENDIF
+C
+ 220 CONTINUE
+C
+C ---------------------------------------------------------------------
+C* Section 9. Closedown.
+C ---------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( WAVEIDX.EQ.0 ) THEN
+ CALL INTLOG(JP_DEBUG, 'WAVEIDX: successful.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_ERROR, 'WAVEIDX: failed.',JPQUIET)
+ ENDIF
+C
+ RETURN
+ END
diff --git a/interpolation/wavexx1.F b/interpolation/wavexx1.F
new file mode 100755
index 0000000..eb0caf8
--- /dev/null
+++ b/interpolation/wavexx1.F
@@ -0,0 +1,663 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION WAVEXX1(NPARAM, ISEC2, ISEC4, NLATS, STEPNS,
+ X STEPWE, OLDWAVE, NEWIDX, DISTNEW,
+ X NEWWAVE, NORTH, WEST, PMISS)
+C
+C---->
+C*****WAVEXX1*
+C
+C PURPOSE
+C -------
+C
+C Interpolates wave fields (except 2D spectra).
+C
+C
+C INTERFACE
+C ---------
+C
+C IRET = WAVEXX1(ISEC2, ISEC4, NLATS, STEPNS, STEPWE,
+C X OLDWAVE, NEWIDX, DISTNEW,
+C X NEWWAVE, NORTH, WEST, PMISS)
+C
+C Input arguments
+C ---------------
+C
+C ISEC2 - Unpacked section 2 header from 2D wave spectra field
+C ISEC4 - Unpacked section 4 header from 2D wave spectra field
+C NLATS - Number of points N-S in new grid
+C STEPNS - Output grid north-south resolution (degrees)
+C STEPWE - Output grid west-east resolution (degrees)
+C OLDWAVE - Original wave field
+C NORTH - Output grid northernmost latitude (degrees)
+C WEST - Output grid westernmost longitude (degrees)
+C PMISS - Missing data value
+C
+C Output arguments
+C ----------------
+C
+C NEWIDX - Indices of four neighbouring old grid points used for
+C new grid points
+C DISTNEW - Distances of surrounding box edges from new grid points
+C NEWWAVE - New wave field
+C
+C Function returns 0 if the interpolation was OK.
+C
+C
+C METHOD
+C ------
+C
+C Builds the index of neighbouring points for the output grid.
+C Then works through the output grid points, checking for subarea
+C boundaries and looking up neighbouring point values and weights.
+C (Neighbours may have missing data).
+C
+C
+C EXTERNALS
+C ---------
+C
+C WAVEIDX - determines which nearest-neighbour values to use for
+C interpolating to new output grid point
+C NUMPTWE - Calculates number of grid points between west/east
+C area boundaries
+C VALPINA - Looks up bitmap value
+C SOFFSET - Finds the section offsets in GRIB message
+C INTLOG - Log error message
+C
+C
+C REFERENCE
+C ---------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF January 1998
+C
+C
+C Modifications
+C -------------
+C Handle reduced lat/long grid in 'pseudo-gaussian' layout
+C J.D.Chambers ECMWF November 2003
+C
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPMXLAT
+ PARAMETER (JPROUTINE = 40100)
+ PARAMETER (JPMXLAT = 1801)
+ INTEGER JPNW, JPNE, JPSW, JPSE, JPN, JPS
+ INTEGER JPDISNW, JPDISNE, JPDISSW, JPDISSE
+ PARAMETER (JPNW = 1)
+ PARAMETER (JPNE = 2)
+ PARAMETER (JPSW = 3)
+ PARAMETER (JPSE = 4)
+ PARAMETER (JPN = 5)
+ PARAMETER (JPS = 6)
+ PARAMETER (JPDISNW = 7)
+ PARAMETER (JPDISNE = 8)
+ PARAMETER (JPDISSW = 9)
+ PARAMETER (JPDISSE = 10)
+C
+C Subroutine arguments
+C
+ INTEGER ISEC2, ISEC4, NLATS
+ DIMENSION ISEC2(*), ISEC4(*)
+ REAL STEPNS, STEPWE, OLDWAVE, NEWWAVE, NORTH, WEST, PMISS
+ REAL ONORTH
+ DIMENSION OLDWAVE(*), NEWWAVE(*)
+ INTEGER NEWIDX
+ DIMENSION NEWIDX(4,*)
+ REAL*4 DISTNEW
+ DIMENSION DISTNEW(10,*)
+C
+C Local arguments
+C
+ INTEGER IEOFSET, IWOFSET, ISTART, IWEST
+ REAL SOUTH, PTLAT, AWEST, EAST, PTLONG, OLDWEST, OLDEAST
+ REAL REFVAL, SCALE
+ INTEGER NSPT1, INSPT, NEXP, NMANT, NRETA, NRETB, NLENG, NBIT
+ INTEGER NPARAM, ISCALE, NSCALE, IBITS, ITEMP
+ INTEGER IRET, IS0, IS1, IS2, IS3, IS4, IEDITN
+ INTEGER NEXT, NEXTWV, NROW, NCOL, INDEX, ILOCATE
+ INTEGER MISSLAT, LOOP, NPTS, NUMLATS, NUMNEW, KOLDNUM, KNEWNUM
+ DIMENSION NPTS(JPMXLAT), NUMNEW(JPMXLAT)
+ REAL RLATINC, OLDLATS, NEWLATS, ROWINC
+ DIMENSION OLDLATS(JPMXLAT), NEWLATS(JPMXLAT)
+ LOGICAL LDIREC
+ REAL*4 DISNW, DISNE, DISSW, DISSE
+ REAL*4 NW_PT, NE_PT, SW_PT, SE_PT
+ REAL*4 RAD
+ DATA RAD/0.017453293/
+ REAL*4 DI1N, DI1S, DI2N, DI2S, DK1, DK2
+ REAL*4 CNW_PT, CNE_PT, CSW_PT, CSE_PT
+ REAL*4 SNW_PT, SNE_PT, SSW_PT, SSE_PT
+ REAL*4 U1, U2, C1, C2, S1, S2, CC, SS
+ INTEGER INW, INE, ISW, ISE, JNW, JNE, JSW, JSE
+C
+C Externals
+C
+ INTEGER WAVEIDX, SOFFSET, VALPINA, NUMPTWE
+ EXTERNAL WAVEIDX, SOFFSET, VALPINA, NUMPTWE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grspace.h"
+C
+C ---------------------------------------------------------------------
+C* Section 1. Initalisation.
+C ---------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WAVEXX1 = 0
+
+C
+C Initialise the bitmap value lookup function
+C
+ IRET = VALPINA(0,0,0)
+C
+ MISSLAT = 0
+C
+C Calculate number of latitudes if grid had been full from
+C North pole to South pole
+C
+ NUMLATS = (180000/ISEC2(10)) + 1
+ IF( NUMLATS.GT.JPMXLAT ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXX1: Number of latitudes in input grid = ',NUMLATS)
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXX1: And is greater than allowed maximum = ',JPMXLAT)
+ WAVEXX1 = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+cs RLATINC = FLOAT(ISEC2(10))/1000
+ RLATINC = FLOAT(ISEC2(10))
+C
+C Fill an array with the number of points at each latitude for the
+C input field.
+C
+ IF( ISEC2(17).EQ.1 ) THEN
+C
+C Input field is a reduced latitude/longitude grid
+C
+C .. but it may be 'pseudo-gaussian' in layout
+C (ie global, symmetric about the equator but no latitude
+C at the equator)
+C
+ IF( (ISEC2(4).NE.90000).AND.(MOD(ISEC2(3),2).EQ.0) ) THEN
+C
+ NUMLATS = ISEC2(3)
+cs RLATINC = FLOAT(ISEC2(10))/1000
+cs ONORTH = FLOAT(ISEC2(4))/1000
+ ONORTH = FLOAT(ISEC2(4))
+C
+ DO LOOP = 1, NUMLATS
+cs OLDLATS(LOOP) = ONORTH - (LOOP-1)*RLATINC
+ OLDLATS(LOOP) = (ONORTH - (LOOP-1)*RLATINC)/1000
+ ENDDO
+C
+ DO LOOP = 1, ISEC2(3)
+ NPTS(LOOP+MISSLAT) = ISEC2(22+LOOP)
+ ENDDO
+C
+ ELSE
+C
+ DO LOOP = 1, NUMLATS
+ OLDLATS(LOOP) = (90000.0 - (LOOP-1)*RLATINC)/1000
+cs OLDLATS(LOOP) = 90.0 - (LOOP-1)*RLATINC
+ ENDDO
+C
+ MISSLAT = (90000 - ISEC2(4))/ISEC2(10)
+ DO LOOP = 1, MISSLAT
+ NPTS(LOOP) = 0
+ ENDDO
+ KOLDNUM = 1 + (90000 - ISEC2(7))/ISEC2(10)
+ DO LOOP = 1, (KOLDNUM-MISSLAT)
+ NPTS(LOOP+MISSLAT) = ISEC2(22+LOOP)
+ ENDDO
+ DO LOOP = (KOLDNUM+1), NUMLATS
+ NPTS(LOOP) = 0
+ ENDDO
+ ENDIF
+C
+ ELSE
+C
+C Input field is a regular latitude/longitude grid
+C
+C
+ DO LOOP = 1, NUMLATS
+cs OLDLATS(LOOP) = 90.0 - (LOOP-1)*RLATINC
+ OLDLATS(LOOP) = (90000.0 - (LOOP-1)*RLATINC)/1000
+ ENDDO
+C
+ MISSLAT = (90000 - ISEC2(4))/ISEC2(10)
+ DO LOOP = 1, MISSLAT
+ NPTS(LOOP) = 0
+ ENDDO
+ KOLDNUM = 1 + (90000 - ISEC2(7))/ISEC2(10)
+ DO LOOP = 1, (KOLDNUM-MISSLAT)
+ NPTS(LOOP+MISSLAT) = ISEC2(2)
+ ENDDO
+ DO LOOP = (KOLDNUM+1), NUMLATS
+ NPTS(LOOP) = 0
+ ENDDO
+ ENDIF
+C
+C ---------------------------------------------------------------------
+C* Section 2. Setup number of points at each latitude for the
+C output latitude/longitude field.
+C ---------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF( (NOREPR.EQ.JPQUASI) .OR. (NOREPR.EQ.JPGAUSSIAN) ) THEN
+C
+C Reduced (quasi-regular) gaussian output
+C
+ KNEWNUM = NOGAUSS*2
+ DO LOOP = 1, KNEWNUM
+ NUMNEW(LOOP) = NOLPTS(LOOP)
+ NEWLATS(LOOP) = ROGAUSS(LOOP)
+ ENDDO
+C
+ ELSE IF( NOREPR.EQ.JPREDLL ) THEN
+C
+C Reduced (quasi-regular) lat/long output
+C
+ KNEWNUM = NOREDLL
+ DO LOOP = 1, KNEWNUM
+ NUMNEW(LOOP) = NOLPTS(LOOP)
+ NEWLATS(LOOP) = ROREDLL(LOOP)
+ ENDDO
+C
+ ELSE
+C
+C Regular output
+C
+ MISSLAT = NINT((90.0 - NORTH)/STEPNS)
+ DO LOOP = 1, MISSLAT
+ NUMNEW(LOOP) = 0
+ ENDDO
+ DO LOOP = 1, NLATS
+ NUMNEW(LOOP+MISSLAT) = NINT(360.0/STEPWE)
+ ENDDO
+C
+ KNEWNUM = MISSLAT + NLATS
+ DO LOOP = 1, KNEWNUM
+ NEWLATS(LOOP) = 90.0 - (LOOP-1)*STEPNS
+ ENDDO
+C
+ ENDIF
+C
+C ---------------------------------------------------------------------
+C* Section 3. Get the input GRIB field characteristics.
+C ---------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C Calculate the indices of the input grid points to be used for
+C the output points
+C
+ OLDWEST = FLOAT(NIAREA(2))/PPMULT
+ OLDEAST = FLOAT(NIAREA(4))/PPMULT
+cs print*,'MARS NUMLATS ', NUMLATS,' RLATINC ',RLATINC
+cs print*,'MARS OLDEAST ', OLDEAST,' OLDWEST ',OLDWEST
+cs print*,'MARS KNEWNUM ', KNEWNUM,' STEPNS ',STEPNS
+
+cs21 format(i6)
+cs OPEN (UNIT=12,FILE='./mars_offset.txt',STATUS='UNKNOWN',
+cs & FORM='FORMATTED')
+cs WRITE (12,21)(NPTS(LOOP), LOOP=1,NUMLATS)
+
+ WAVEXX1 = WAVEIDX(NUMLATS,NPTS,OLDLATS,OLDWEST,OLDEAST,
+ X KNEWNUM, NUMNEW, NEWLATS,
+ X NEWIDX, DISTNEW)
+ IF( WAVEXX1.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXX1: Unable to calculate output grid indices',JPQUIET)
+ WAVEXX1 = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Find bitmap (section 3) offset the GRIB product
+C
+cs IRET = SOFFSET(OLDWAVE, IS0, IS1, IS2, IS3, IS4, IEDITN)
+C
+C Get the overall length of OLDWAVE
+C
+cs#ifdef INTEGER_8
+cs NBIT = 64
+cs#else
+cs NBIT = 32
+cs#endif
+cs INSPT = (IS0 + 4) * 8
+cs CALL INXBIT(OLDWAVE,10,INSPT,NLENG,1,NBIT,24,'D',NRETA)
+cs IF( NRETA.NE.0 ) THEN
+cs CALL INTLOG(JP_ERROR,
+cs X 'WAVEXX1: Problem extracting overall length of GRIB',JPQUIET)
+cs WAVEXX1 = JPROUTINE + 3
+cs GOTO 900
+cs ENDIF
+C
+C Get parameter identifier
+C
+cs INSPT = (IS1 + 8) * 8
+cs CALL INXBIT(OLDWAVE,10,INSPT,NPARAM,1,NBIT,8,'D',NRETA)
+cs IF( NRETA.NE.0 ) THEN
+cs CALL INTLOG(JP_ERROR,
+cs X 'WAVEXX1: Problem getting parameter identifier',JPQUIET)
+cs WAVEXX1 = JPROUTINE + 4
+cs GOTO 900
+cs ENDIF
+C
+C Wave direction parameters need special handling
+C (MWD, MDWW, MDPS, MDWI)
+C
+ LDIREC = ( (NPARAM.EQ.230) .OR.
+ X (NPARAM.EQ.235) .OR.
+ X (NPARAM.EQ.238) .OR.
+ X (NPARAM.EQ.242) )
+C
+C Get the scale factor
+C
+cs INSPT = (IS4 + 4) * 8
+cs CALL INXBIT(OLDWAVE,NLENG,INSPT,NSCALE,1,NBIT,16,'D',NRETA)
+cs IF( NRETA.NE.0 ) THEN
+cs CALL INTLOG(JP_ERROR,
+cs X 'WAVEXX1: Problem extracting scale factor in GRIB',JPQUIET)
+cs WAVEXX1 = JPROUTINE + 5
+cs GOTO 900
+cs ENDIF
+cs CALL DSGNBT(ISCALE,NSCALE,16,NRETA)
+cs IF( NRETA.NE.0 ) THEN
+cs CALL INTLOG(JP_ERROR,
+cs X 'WAVEXX1: Problem setting sign of scale factor',JPQUIET)
+cs WAVEXX1 = JPROUTINE + 6
+cs GOTO 900
+cs ENDIF
+cs SCALE = 2.0**(FLOAT(ISCALE))
+C
+C Get the reference value
+C
+cs CALL INXBIT(OLDWAVE,NLENG,INSPT,NEXP,1,NBIT,8,'D',NRETA)
+cs CALL INXBIT(OLDWAVE,NLENG,INSPT,NMANT,1,NBIT,24,'D',NRETB)
+cs IF( (NRETA.NE.0) .OR. (NRETB.NE.0) ) THEN
+cs CALL INTLOG(JP_ERROR,
+cs X 'WAVEXX1: Problem getting reference value from GRIB',JPQUIET)
+cs WAVEXX1 = JPROUTINE + 7
+cs GOTO 900
+cs ENDIF
+cs CALL DECFP2(REFVAL,NEXP,NMANT)
+C
+C Get number of bits per packed value
+C
+cs CALL INXBIT(OLDWAVE,NLENG,INSPT,IBITS,1,NBIT,8,'D',NRETA)
+cs IF( NRETA.NE.0 ) THEN
+cs CALL INTLOG(JP_ERROR,
+cs X 'WAVEXX1: Problem getting number of bits per word',JPQUIET)
+cs WAVEXX1 = JPROUTINE + 8
+cs GOTO 900
+cs ENDIF
+cs NSPT1 = INSPT
+C
+C ---------------------------------------------------------------------
+C* Section 4. Work through the output subarea.
+C ---------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+C Fill in the wave spectra values
+C
+ NEXT = 0
+ NEXTWV = 0
+C
+ SOUTH = NOAREA(3)/PPMULT
+ EAST = NOAREA(4)/PPMULT
+ ISTART = 0
+C
+C Work down through latitudes from north to south.
+C
+
+ OPEN (UNIT=16,FILE='./mars.txt',STATUS='UNKNOWN',
+ & FORM='FORMATTED')
+c17 format(i4,1x,i4,4(1x,i6))
+17 format(i4,1x,i4,4(1x,i6),2x,4(f9.2))
+19 format(i4,1x,i4,4(1x,i6),2x,f9.2)
+
+ DO NROW = 1, KNEWNUM
+C
+C If inside north-south (subarea) boundaries ..
+C
+ IF( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPQUASI) ) THEN
+ PTLAT = ROGAUSS(NROW)
+ ELSE
+ PTLAT = 90.0 - (NROW-1)*STEPNS
+ ENDIF
+ IF( (PTLAT.LE.NORTH).AND.(ABS(PTLAT-SOUTH).GT.-0.0005) ) THEN
+C
+C Calculate number of points between west boundary of area and
+C Greenwich
+C
+ ROWINC = 360.0/NUMNEW(NROW)
+C
+ IWEST = INT(WEST/ROWINC)
+ IF( (WEST.GT.0.0).AND.(WEST.NE.(IWEST*ROWINC)) )
+ X IWEST = IWEST + 1
+ AWEST = IWEST * ROWINC
+ IWOFSET = NUMPTWE(AWEST,0.0,ROWINC)
+ IEOFSET = NUMPTWE(AWEST,EAST,ROWINC)
+C
+C Work through subarea longitudes from west to east.
+C
+ DO NCOL = 1, NUMNEW(NROW)
+ PTLONG = AWEST + (NCOL-1)*ROWINC
+ NEXT = NUMPTWE(AWEST,PTLONG,ROWINC)
+ IF( (NEXT.LE.IEOFSET).AND.(NEXT.GE.0) ) THEN
+C
+C .. and inside west-east (subarea) boundaries
+C
+ NEXT = 1 + NEXT - IWOFSET
+ IF( NEXT.LE.0) NEXT = NEXT + NUMNEW(NROW)
+ NEXT = NEXT + ISTART
+ NEXTWV = NEXTWV + 1
+C
+ INW = NEWIDX(JPNW,NEXT)
+ INE = NEWIDX(JPNE,NEXT)
+ ISW = NEWIDX(JPSW,NEXT)
+ ISE = NEWIDX(JPSE,NEXT)
+C
+C If there is a bitmap, ...
+C
+cs IF( IS3.NE.0 ) THEN
+cs IF(INW.NE.0) JNW = VALPINA(OLDWAVE, IS3+6, INW)
+cs IF(INE.NE.0) JNE = VALPINA(OLDWAVE, IS3+6, INE)
+cs IF(ISW.NE.0) JSW = VALPINA(OLDWAVE, IS3+6, ISW)
+cs IF(ISE.NE.0) JSE = VALPINA(OLDWAVE, IS3+6, ISE)
+cs ELSE
+cs JNW = INW
+cs JNE = INE
+cs JSW = ISW
+cs JSE = ISE
+cs ENDIF
+C
+C Test if any of the four neighbouring points is missing.
+C
+ IF( (INW.EQ.0) .OR. (OLDWAVE(INW).EQ.PMISS) .OR.
+ X (ISW.EQ.0) .OR. (OLDWAVE(ISW).EQ.PMISS) .OR.
+ X (INE.EQ.0) .OR. (OLDWAVE(INE).EQ.PMISS) .OR.
+ X (ISE.EQ.0) .OR. (OLDWAVE(ISE).EQ.PMISS) ) THEN
+cs
+cs WRITE (16,17)NROW,NCOL,INW,INE,ISW,ISE
+cs X ,OLDWAVE(INW),OLDWAVE(ISW)
+cs X ,OLDWAVE(INE),OLDWAVE(ISE)
+C
+C If so, take nearest grid point value.
+C
+ DISNW = DISTNEW(JPDISNW,NEXT)
+ DISNE = DISTNEW(JPDISNE,NEXT)
+ DISSW = DISTNEW(JPDISSW,NEXT)
+ DISSE = DISTNEW(JPDISSE,NEXT)
+C
+ IF( (DISNW.LE.DISNE).AND.
+ X (DISNW.LE.DISSW).AND.
+ X (DISNW.LE.DISSE)) THEN
+ INDEX = INW
+cs ILOCATE = JNW
+C
+ ELSE IF( (DISNE.LE.DISSW).AND.
+ X (DISNE.LE.DISSE) ) THEN
+ INDEX = INE
+cs ILOCATE = JNE
+C
+ ELSE IF( (DISSW.LE.DISSE) ) THEN
+ INDEX = ISW
+cs ILOCATE = JSW
+C
+ ELSE
+ INDEX = ISE
+cs ILOCATE = JSE
+ ENDIF
+C
+ IF(INDEX.EQ.0.OR.(OLDWAVE(INDEX).EQ.PMISS)) THEN
+C
+C Nearest point is missing
+C
+ NEWWAVE(NEXTWV) = PMISS
+C
+ ELSE
+cs INSPT = NSPT1 + (ILOCATE - 1)*IBITS
+cs CALL INXBIT(OLDWAVE,NLENG,INSPT,ITEMP,1,
+cs X NBIT,IBITS,'D',NRETA)
+cs IF( NRETA.NE.0 ) THEN
+ccss CALL INTLOG(JP_ERROR,
+cs X 'WAVEXX1: Problem getting nearest neighbour value',
+cs X JPQUIET)
+cs WAVEXX1 = JPROUTINE + 9
+cs GOTO 900
+cs ENDIF
+cs NEWWAVE(NEXTWV) = REFVAL + FLOAT(ITEMP)*SCALE
+ NEWWAVE(NEXTWV) = OLDWAVE(INDEX)
+ WRITE (16,19)NROW,NCOL,INW,INE,ISW,ISE,NEWWAVE(NEXTWV)
+ ENDIF
+C
+ ELSE
+C
+C Use bi-linear interpolation from four
+C neighbouring sea points.
+C
+cs INSPT = NSPT1 + (JNW - 1)*IBITS
+cs CALL INXBIT(OLDWAVE,NLENG,INSPT,ITEMP,1,
+cs X NBIT,IBITS,'D',NRETA)
+cs IF( NRETA.NE.0 ) THEN
+cs CALL INTLOG(JP_ERROR,
+cs X 'WAVEXX1: Problem getting NW neighbour value',
+cs X JPQUIET)
+cs WAVEXX1 = JPROUTINE + 10
+cs GOTO 900
+cs ENDIF
+cs NW_PT = REFVAL + FLOAT(ITEMP)*SCALE
+C
+cs INSPT = NSPT1 + (JNE - 1)*IBITS
+cs CALL INXBIT(OLDWAVE,NLENG,INSPT,ITEMP,1,
+cs X NBIT,IBITS,'D',NRETA)
+cs IF( NRETA.NE.0 ) THEN
+cs CALL INTLOG(JP_ERROR,
+cs X 'WAVEXX1: Problem getting NE neighbour value',
+cs X JPQUIET)
+cs WAVEXX1 = JPROUTINE + 10
+cs GOTO 900
+cs ENDIF
+cs NE_PT = REFVAL + FLOAT(ITEMP)*SCALE
+C
+cs INSPT = NSPT1 + (JSW - 1)*IBITS
+cs CALL INXBIT(OLDWAVE,NLENG,INSPT,ITEMP,1,
+cs X NBIT,IBITS,'D',NRETA)
+cs IF( NRETA.NE.0 ) THEN
+cs CALL INTLOG(JP_ERROR,
+cs X 'WAVEXX1: Problem getting SW neighbour value',
+cs X JPQUIET)
+cs WAVEXX1 = JPROUTINE + 10
+cs GOTO 900
+cs ENDIF
+cs SW_PT = REFVAL + FLOAT(ITEMP)*SCALE
+C
+cs INSPT = NSPT1 + (JSE - 1)*IBITS
+cs CALL INXBIT(OLDWAVE,NLENG,INSPT,ITEMP,1,
+cs X NBIT,IBITS,'D',NRETA)
+cs IF( NRETA.NE.0 ) THEN
+cs CALL INTLOG(JP_ERROR,
+cs X 'WAVEXX1: Problem getting SE neighbour value',
+cs X JPQUIET)
+cs WAVEXX1 = JPROUTINE + 10
+cs GOTO 900
+cs ENDIF
+cs SE_PT = REFVAL + FLOAT(ITEMP)*SCALE
+C
+ DI1N = DISTNEW(JPNW,NEXT)
+ DI2N = DISTNEW(JPNE,NEXT)
+ DI1S = DISTNEW(JPSW,NEXT)
+ DI2S = DISTNEW(JPSE,NEXT)
+ DK1 = DISTNEW(JPN,NEXT)
+ DK2 = DISTNEW(JPS,NEXT)
+C
+ IF( .NOT. LDIREC ) THEN
+ U1 = NW_PT*DI2N + NE_PT*DI1N
+ U2 = SW_PT*DI2S + SE_PT*DI1S
+ NEWWAVE(NEXTWV) = U1*DK2 + U2*DK1
+ ELSE
+C
+C Fields representing a 'direction': resolve into
+C components and interpolate each separately.
+C
+ CNW_PT = COS(NW_PT*RAD)
+ CNE_PT = COS(NE_PT*RAD)
+ CSW_PT = COS(SW_PT*RAD)
+ CSE_PT = COS(SE_PT*RAD)
+ SNW_PT = SIN(NW_PT*RAD)
+ SNE_PT = SIN(NE_PT*RAD)
+ SSW_PT = SIN(SW_PT*RAD)
+ SSE_PT = SIN(SE_PT*RAD)
+ C1 = CNW_PT*DI2N + CNE_PT*DI1N
+ C2 = CSW_PT*DI2S + CSE_PT*DI1S
+ CC = C1*DK2 + C2*DK1
+ S1 = SNW_PT*DI2N + SNE_PT*DI1N
+ S2 = SSW_PT*DI2S + SSE_PT*DI1S
+ SS = S1*DK2 + S2*DK1
+ IF( SS.LT.0.0 ) THEN
+ NEWWAVE(NEXTWV) = ATAN2(SS,CC)/RAD + 360.0
+ ELSE
+ NEWWAVE(NEXTWV) = ATAN2(SS,CC)/RAD
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDDO
+C
+ ENDIF
+ ISTART = ISTART + NUMNEW(NROW)
+ ENDDO
+C
+C ---------------------------------------------------------------------
+C* Section 9. Closedown.
+C ---------------------------------------------------------------------
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/wavexx2.F b/interpolation/wavexx2.F
new file mode 100755
index 0000000..3d315ae
--- /dev/null
+++ b/interpolation/wavexx2.F
@@ -0,0 +1,502 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION WAVEXX2(NPARAM, NUMLATS, NPTS,
+ X NLATS, STEPNS, STEPWE,
+ X OLDWAVE,
+ X NEWWAVE, NORTH, WEST, PMISS)
+C
+C---->
+C*****WAVEXX2*
+C
+C PURPOSE
+C -------
+C
+C Interpolates wave fields (except 2D spectra).
+C
+C
+C INTERFACE
+C ---------
+C
+C IRET = WAVEXX2(NPARAM, NUMLATS, NLATS, STEPNS, STEPWE,
+C X OLDWAVE, NEWIDX, DISTNEW,
+C X NEWWAVE, NORTH, WEST, PMISS)
+C
+C Input arguments
+C ---------------
+C
+C NUMLATS - Input lat number north-south
+C NPTS - Array giving number of points along each latitude
+C (empty latitudes have entry 0)
+C NLATS - Number of points N-S in new grid
+C STEPNS - Output grid north-south resolution (degrees)
+C STEPWE - Output grid west-east resolution (degrees)
+C OLDWAVE - Original wave field
+C NORTH - Output grid northernmost latitude (degrees)
+C WEST - Output grid westernmost longitude (degrees)
+C PMISS - Missing data value
+C
+C Output arguments
+C ----------------
+C
+C NEWWAVE - New wave field
+C
+C Function returns 0 if the interpolation was OK.
+C
+C
+C METHOD
+C ------
+C
+C Builds the index of neighbouring points for the output grid.
+C Then works through the output grid points, checking for subarea
+C boundaries and looking up neighbouring point values and weights.
+C (Neighbours may have missing data).
+C
+C
+C EXTERNALS
+C ---------
+C
+C WAVEIDX - determines which nearest-neighbour values to use for
+C interpolating to new output grid point
+C NUMPTWE - Calculates number of grid points between west/east
+C area boundaries
+C INTLOG - Log error message
+C
+C
+C REFERENCE
+C ---------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C S. Curic ECMWF Jun 2009
+C
+C
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Parameters
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grspace.h"
+ INTEGER JPROUTINE, JPMXLAT
+ PARAMETER (JPROUTINE = 40100)
+ PARAMETER (JPMXLAT = 1801)
+ INTEGER JPNW, JPNE, JPSW, JPSE, JPN, JPS
+ INTEGER JPDISNW, JPDISNE, JPDISSW, JPDISSE
+ PARAMETER (JPNW = 1)
+ PARAMETER (JPNE = 2)
+ PARAMETER (JPSW = 3)
+ PARAMETER (JPSE = 4)
+ PARAMETER (JPN = 5)
+ PARAMETER (JPS = 6)
+ PARAMETER (JPDISNW = 7)
+ PARAMETER (JPDISNE = 8)
+ PARAMETER (JPDISSW = 9)
+ PARAMETER (JPDISSE = 10)
+C
+C Subroutine arguments
+C
+ INTEGER NPTS,NLATS
+ DIMENSION NPTS(*)
+ REAL STEPNS, STEPWE, OLDWAVE, NEWWAVE, NORTH, WEST, PMISS
+ DIMENSION OLDWAVE(*), NEWWAVE(*)
+ INTEGER NEWIDX
+ DIMENSION NEWIDX(4,2880*1442)
+ REAL*4 DISTNEW
+ DIMENSION DISTNEW(10,2880*1442)
+ INTEGER NUMLATS
+C
+C Local arguments
+C
+ REAL RLATINC, RLATINC2
+ REAL ONORTH,OSOUTH,OWEST, OEAST
+ INTEGER IEOFSET, IWOFSET, ISTART, IWEST
+ REAL SOUTH, PTLAT, AWEST, EAST, PTLONG
+ REAL REFVAL, SCALE
+ INTEGER NSPT1, INSPT, NEXP, NMANT, NRETA, NRETB, NLENG, NBIT
+ INTEGER NPARAM, ISCALE, NSCALE, IBITS, ITEMP
+ INTEGER IRET, IEDITN
+ INTEGER NEXT, NEXTWV, NROW, NCOL, INDEX
+ INTEGER MISSLAT, LOOP, NUMNEW, KOLDNUM, KNEWNUM
+ DIMENSION NUMNEW(JPMXLAT)
+ REAL OLDLATS, NEWLATS, ROWINC
+ DIMENSION OLDLATS(JPMXLAT), NEWLATS(JPMXLAT)
+ LOGICAL LDIREC
+ REAL*4 DISNW, DISNE, DISSW, DISSE
+ REAL*4 NW_PT, NE_PT, SW_PT, SE_PT
+ REAL*4 RAD
+ DATA RAD/0.017453293/
+ REAL*4 DI1N, DI1S, DI2N, DI2S, DK1, DK2
+ REAL*4 CNW_PT, CNE_PT, CSW_PT, CSE_PT
+ REAL*4 SNW_PT, SNE_PT, SSW_PT, SSE_PT
+ REAL*4 U1, U2, C1, C2, S1, S2, CC, SS
+ INTEGER INW, INE, ISW, ISE, JNW, JNE, JSW, JSE
+C
+C Externals
+C
+ INTEGER WAVEIDX, NUMPTWE
+ EXTERNAL WAVEIDX, NUMPTWE
+
+C
+C ---------------------------------------------------------------------
+C* Section 1. Initalisation.
+C ---------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WAVEXX2 = 0
+
+C Initialise the bitmap value lookup function
+C
+ MISSLAT = 0
+
+ ONORTH = FLOAT(NIAREA(1))/PPMULT
+ OSOUTH = FLOAT(NIAREA(3))/PPMULT
+ RLATINC = FLOAT(NIGRID(2))/PPMULT
+C
+C Calculate number of latitudes if grid had been full from
+C North pole to South pole
+C
+ IF( NUMLATS.GT.JPMXLAT ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXX2: Number of latitudes in input grid = ',NUMLATS)
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXX2: And is greater than allowed maximum = ',JPMXLAT)
+ WAVEXX2 = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C
+C Fill an array with the number of points at each latitude for the
+C input field.
+C
+ IF(NIREPR.EQ.JPREDLL) THEN
+C
+C Input field is a reduced latitude/longitude grid
+C
+C .. but it may be 'pseudo-gaussian' in layout
+C (ie global, symmetric about the equator but no latitude
+C at the equator)
+C
+ IF( (ONORTH.NE.90.0).AND.(MOD(NUMLATS,2).EQ.0) ) THEN
+C
+ ONORTH = FLOAT(NIAREA(1))
+ OSOUTH = FLOAT(NIAREA(3))
+ RLATINC = FLOAT(NIGRID(2))
+
+ DO LOOP = 1, NUMLATS
+cs OLDLATS(LOOP) = ONORTH - (LOOP-1)*RLATINC
+ OLDLATS(LOOP) = (ONORTH - (LOOP-1)*RLATINC)/PPMULT
+ ENDDO
+C
+ ELSE
+C
+ DO LOOP = 1, NUMLATS
+ OLDLATS(LOOP) = 90.0 - (LOOP-1)*RLATINC
+ ENDDO
+cs-----------------------------------------------------
+cs MISSLAT = (9000000 - NIAREA(1) )/NIGRID(2)
+cs DO LOOP = 1, MISSLAT
+cs NPTS(LOOP) = 0
+cs ENDDO
+cs KOLDNUM = 1 + (9000000 - NIAREA(3))/NIGRID(2)
+cs DO LOOP = 1, (KOLDNUM-MISSLAT)
+cs print*,LOOP+MISSLAT, NPTS(LOOP+MISSLAT)
+cs NPTS(LOOP+MISSLAT) = ISEC2(22+LOOP)
+cs ENDDO
+cs DO LOOP = (KOLDNUM+1), NUMLATS
+cs print*,'to set 0 ', loop, NPTS(LOOP)
+cs NPTS(LOOP) = 0
+cs ENDDO
+cs-----------------------------------------------------
+
+C
+ ENDIF
+C
+ ELSE
+C
+C Input field is a regular latitude/longitude grid
+C
+C
+ DO LOOP = 1, NUMLATS
+ OLDLATS(LOOP) = 90.0 - (LOOP-1)*RLATINC
+ ENDDO
+C
+ MISSLAT = (90.0 - ONORTH)/RLATINC
+ DO LOOP = 1, MISSLAT
+ NPTS(LOOP) = 0
+ ENDDO
+ KOLDNUM = 1 + NINT((90.0 - OSOUTH)/RLATINC)
+ DO LOOP = 1, (KOLDNUM-MISSLAT)
+ NPTS(LOOP+MISSLAT) = NIWE
+ ENDDO
+ DO LOOP = (KOLDNUM+1), NUMLATS
+ NPTS(LOOP) = 0
+ ENDDO
+ ENDIF
+C
+C ---------------------------------------------------------------------
+C* Section 2. Setup number of points at each latitude for the
+C output latitude/longitude field.
+C ---------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF( (NOREPR.EQ.JPQUASI) .OR. (NOREPR.EQ.JPGAUSSIAN) ) THEN
+C
+C Reduced (quasi-regular) gaussian output
+C
+ KNEWNUM = NOGAUSS*2
+ DO LOOP = 1, KNEWNUM
+ NUMNEW(LOOP) = NOLPTS(LOOP)
+ NEWLATS(LOOP) = ROGAUSS(LOOP)
+ ENDDO
+C
+ ELSE IF( NOREPR.EQ.JPREDLL ) THEN
+C
+C Reduced (quasi-regular) lat/long output
+C
+ KNEWNUM = NOREDLL
+ DO LOOP = 1, KNEWNUM
+ NUMNEW(LOOP) = NOLPTS(LOOP)
+ NEWLATS(LOOP) = ROREDLL(LOOP)
+ ENDDO
+C
+ ELSE
+C
+C Regular output
+C
+ MISSLAT = NINT((90.0 - NORTH)/STEPNS)
+ DO LOOP = 1, MISSLAT
+ NUMNEW(LOOP) = 0
+ ENDDO
+ DO LOOP = 1, NLATS
+ NUMNEW(LOOP+MISSLAT) = NINT(360.0/STEPWE)
+ ENDDO
+C
+ KNEWNUM = MISSLAT + NLATS
+ DO LOOP = 1, KNEWNUM
+ NEWLATS(LOOP) = 90.0 - (LOOP-1)*STEPNS
+ ENDDO
+C
+ ENDIF
+C
+C ---------------------------------------------------------------------
+C* Section 3. Get the input GRIB field characteristics.
+C ---------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C Calculate the indices of the input grid points to be used for
+C the output points
+C
+
+ OWEST = FLOAT(NIAREA(2))/PPMULT
+ OEAST = FLOAT(NIAREA(4))/PPMULT
+
+ WAVEXX2 = WAVEIDX(NUMLATS,NPTS,OLDLATS,OWEST,OEAST,
+ X KNEWNUM, NUMNEW, NEWLATS,
+ X NEWIDX, DISTNEW)
+ IF( WAVEXX2.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXX2: Unable to calculate output grid indices',JPQUIET)
+ WAVEXX2 = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Wave direction parameters need special handling
+C (MWD, MDWW, MDPS, MDWI)
+C
+ LDIREC = ( (NPARAM.EQ.230) .OR.
+ X (NPARAM.EQ.235) .OR.
+ X (NPARAM.EQ.238) .OR.
+ X (NPARAM.EQ.242) )
+C
+C ---------------------------------------------------------------------
+C* Section 4. Work through the output subarea.
+C ---------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+C Fill in the wave spectra values
+C
+ NEXT = 0
+ NEXTWV = 0
+C
+ SOUTH = NOAREA(3)/PPMULT
+ EAST = NOAREA(4)/PPMULT
+ ISTART = 0
+C
+C Work down through latitudes from north to south.
+C
+ DO NROW = 1, KNEWNUM
+C
+C If inside north-south (subarea) boundaries ..
+C
+ IF( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPQUASI) ) THEN
+ PTLAT = ROGAUSS(NROW)
+ ELSE
+ PTLAT = 90.0 - (NROW-1)*STEPNS
+ ENDIF
+ IF( (PTLAT.LE.NORTH).AND.(ABS(PTLAT-SOUTH).GT.-0.0005) ) THEN
+C
+C Calculate number of points between west boundary of area and
+C Greenwich
+C
+ ROWINC = 360.0/NUMNEW(NROW)
+C
+ IWEST = INT(WEST/ROWINC)
+ IF( (WEST.GT.0.0).AND.(WEST.NE.(IWEST*ROWINC)) )
+ X IWEST = IWEST + 1
+ AWEST = IWEST * ROWINC
+ IWOFSET = NUMPTWE(AWEST,0.0,ROWINC)
+ IEOFSET = NUMPTWE(AWEST,EAST,ROWINC)
+C
+C Work through subarea longitudes from west to east.
+C
+ DO NCOL = 1, NUMNEW(NROW)
+ PTLONG = AWEST + (NCOL-1)*ROWINC
+ NEXT = NUMPTWE(AWEST,PTLONG,ROWINC)
+ IF( (NEXT.LE.IEOFSET).AND.(NEXT.GE.0) ) THEN
+C
+C .. and inside west-east (subarea) boundaries
+C
+ NEXT = 1 + NEXT - IWOFSET
+ IF( NEXT.LE.0) NEXT = NEXT + NUMNEW(NROW)
+ NEXT = NEXT + ISTART
+ NEXTWV = NEXTWV + 1
+C
+ INW = NEWIDX(JPNW,NEXT)
+ INE = NEWIDX(JPNE,NEXT)
+ ISW = NEWIDX(JPSW,NEXT)
+ ISE = NEWIDX(JPSE,NEXT)
+C
+C Test if any of the four neighbouring points is missing.
+C
+ IF( (OLDWAVE(INW).EQ.PMISS) .OR.
+ X (OLDWAVE(ISW).EQ.PMISS) .OR.
+ X (OLDWAVE(INE).EQ.PMISS) .OR.
+ X (OLDWAVE(ISE).EQ.PMISS) ) THEN
+ ENDIF
+
+ IF( (INW.EQ.0) .OR. (OLDWAVE(INW).EQ.PMISS) .OR.
+ X (ISW.EQ.0) .OR. (OLDWAVE(ISW).EQ.PMISS) .OR.
+ X (INE.EQ.0) .OR. (OLDWAVE(INE).EQ.PMISS) .OR.
+ X (ISE.EQ.0) .OR. (OLDWAVE(ISE).EQ.PMISS) ) THEN
+ IF( (OLDWAVE(INW).EQ.PMISS) .AND.
+ X (OLDWAVE(ISW).EQ.PMISS) .AND.
+ X (OLDWAVE(INE).EQ.PMISS) .AND.
+ X (OLDWAVE(ISE).EQ.PMISS) ) THEN
+ ENDIF
+C
+C If so, take nearest grid point value.
+C
+ DISNW = DISTNEW(JPDISNW,NEXT)
+ DISNE = DISTNEW(JPDISNE,NEXT)
+ DISSW = DISTNEW(JPDISSW,NEXT)
+ DISSE = DISTNEW(JPDISSE,NEXT)
+C
+ IF( (DISNW.LE.DISNE).AND.
+ X (DISNW.LE.DISSW).AND.
+ X (DISNW.LE.DISSE)) THEN
+ INDEX = INW
+C
+ ELSE IF( (DISNE.LE.DISSW).AND.
+ X (DISNE.LE.DISSE) ) THEN
+ INDEX = INE
+C
+ ELSE IF( (DISSW.LE.DISSE) ) THEN
+ INDEX = ISW
+C
+ ELSE
+ INDEX = ISE
+ ENDIF
+C
+ IF(INDEX.EQ.0.OR.(OLDWAVE(INDEX).EQ.PMISS)) THEN
+C
+C Nearest point is missing
+C
+ NEWWAVE(NEXTWV) = PMISS
+C
+ ELSE
+
+ NEWWAVE(NEXTWV) = OLDWAVE(INDEX)
+ ENDIF
+C
+ ELSE
+C
+C Use bi-linear interpolation from four
+C neighbouring sea points.
+C
+C
+ DI1N = DISTNEW(JPNW,NEXT)
+ DI2N = DISTNEW(JPNE,NEXT)
+ DI1S = DISTNEW(JPSW,NEXT)
+ DI2S = DISTNEW(JPSE,NEXT)
+ DK1 = DISTNEW(JPN,NEXT)
+ DK2 = DISTNEW(JPS,NEXT)
+C
+ NW_PT = OLDWAVE(INW)
+ NE_PT = OLDWAVE(INE)
+ SW_PT = OLDWAVE(ISW)
+ SE_PT = OLDWAVE(ISE)
+ IF( .NOT. LDIREC ) THEN
+ U1 = NW_PT*DI2N + NE_PT*DI1N
+ U2 = SW_PT*DI2S + SE_PT*DI1S
+ NEWWAVE(NEXTWV) = U1*DK2 + U2*DK1
+ ELSE
+C
+C Fields representing a 'direction': resolve into
+C components and interpolate each separately.
+C
+ CNW_PT = COS(NW_PT*RAD)
+ CNE_PT = COS(NE_PT*RAD)
+ CSW_PT = COS(SW_PT*RAD)
+ CSE_PT = COS(SE_PT*RAD)
+ SNW_PT = SIN(NW_PT*RAD)
+ SNE_PT = SIN(NE_PT*RAD)
+ SSW_PT = SIN(SW_PT*RAD)
+ SSE_PT = SIN(SE_PT*RAD)
+ C1 = CNW_PT*DI2N + CNE_PT*DI1N
+ C2 = CSW_PT*DI2S + CSE_PT*DI1S
+ CC = C1*DK2 + C2*DK1
+ S1 = SNW_PT*DI2N + SNE_PT*DI1N
+ S2 = SSW_PT*DI2S + SSE_PT*DI1S
+ SS = S1*DK2 + S2*DK1
+ IF( SS.LT.0.0 ) THEN
+ NEWWAVE(NEXTWV) = ATAN2(SS,CC)/RAD + 360.0
+ ELSE
+ NEWWAVE(NEXTWV) = ATAN2(SS,CC)/RAD
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDDO
+C
+ ENDIF
+ ISTART = ISTART + NUMNEW(NROW)
+ ENDDO
+C
+C ---------------------------------------------------------------------
+C* Section 9. Closedown.
+C ---------------------------------------------------------------------
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/wavexxx.F b/interpolation/wavexxx.F
new file mode 100755
index 0000000..2ed142e
--- /dev/null
+++ b/interpolation/wavexxx.F
@@ -0,0 +1,645 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION WAVEXXX(ISEC2, ISEC4, NLATS, STEPNS, STEPWE,
+ X OLDWAVE, NEWIDX, DISTNEW,
+ X NEWWAVE, NORTH, WEST, PMISS)
+C
+C---->
+C*****WAVEXXX*
+C
+C PURPOSE
+C -------
+C
+C Interpolates wave fields (except 2D spectra).
+C
+C
+C INTERFACE
+C ---------
+C
+C IRET = WAVEXXX(ISEC2, ISEC4, NLATS, STEPNS, STEPWE,
+C X OLDWAVE, NEWIDX, DISTNEW,
+C X NEWWAVE, NORTH, WEST, PMISS)
+C
+C Input arguments
+C ---------------
+C
+C ISEC2 - Unpacked section 2 header from 2D wave spectra field
+C ISEC4 - Unpacked section 4 header from 2D wave spectra field
+C NLATS - Number of points N-S in new grid
+C STEPNS - Output grid north-south resolution (degrees)
+C STEPWE - Output grid west-east resolution (degrees)
+C OLDWAVE - Original wave field
+C NORTH - Output grid northernmost latitude (degrees)
+C WEST - Output grid westernmost longitude (degrees)
+C PMISS - Missing data value
+C
+C Output arguments
+C ----------------
+C
+C NEWIDX - Indices of four neighbouring old grid points used for
+C new grid points
+C DISTNEW - Distances of surrounding box edges from new grid points
+C NEWWAVE - New wave field
+C
+C Function returns 0 if the interpolation was OK.
+C
+C
+C METHOD
+C ------
+C
+C Builds the index of neighbouring points for the output grid.
+C Then works through the output grid points, checking for subarea
+C boundaries and looking up neighbouring point values and weights.
+C (Neighbours may have missing data).
+C
+C
+C EXTERNALS
+C ---------
+C
+C WAVEIDX - determines which nearest-neighbour values to use for
+C interpolating to new output grid point
+C NUMPTWE - Calculates number of grid points between west/east
+C area boundaries
+C VALPINA - Looks up bitmap value
+C SOFFSET - Finds the section offsets in GRIB message
+C INTLOG - Log error message
+C
+C
+C REFERENCE
+C ---------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF January 1998
+C
+C
+C Modifications
+C -------------
+C Handle reduced lat/long grid in 'pseudo-gaussian' layout
+C J.D.Chambers ECMWF November 2003
+C
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPMXLAT
+ PARAMETER (JPROUTINE = 40100)
+ PARAMETER (JPMXLAT = 1801)
+ INTEGER JPNW, JPNE, JPSW, JPSE, JPN, JPS
+ INTEGER JPDISNW, JPDISNE, JPDISSW, JPDISSE
+ PARAMETER (JPNW = 1)
+ PARAMETER (JPNE = 2)
+ PARAMETER (JPSW = 3)
+ PARAMETER (JPSE = 4)
+ PARAMETER (JPN = 5)
+ PARAMETER (JPS = 6)
+ PARAMETER (JPDISNW = 7)
+ PARAMETER (JPDISNE = 8)
+ PARAMETER (JPDISSW = 9)
+ PARAMETER (JPDISSE = 10)
+C
+C Subroutine arguments
+C
+ INTEGER ISEC2, ISEC4, NLATS
+ DIMENSION ISEC2(*), ISEC4(*)
+ REAL STEPNS, STEPWE, OLDWAVE, NEWWAVE, NORTH, WEST, PMISS
+ REAL ONORTH
+ DIMENSION OLDWAVE(*), NEWWAVE(*)
+ INTEGER NEWIDX
+ DIMENSION NEWIDX(4,*)
+ REAL*4 DISTNEW
+ DIMENSION DISTNEW(10,*)
+C
+C Local arguments
+C
+ INTEGER IEOFSET, IWOFSET, ISTART, IWEST
+ REAL SOUTH, PTLAT, AWEST, EAST, PTLONG, OLDWEST, OLDEAST
+ REAL REFVAL, SCALE
+ INTEGER NSPT1, INSPT, NEXP, NMANT, NRETA, NRETB, NLENG, NBIT
+ INTEGER NPARAM, ISCALE, NSCALE, IBITS, ITEMP
+ INTEGER IRET, IS0, IS1, IS2, IS3, IS4, IEDITN
+ INTEGER NEXT, NEXTWV, NROW, NCOL, INDEX, ILOCATE
+ INTEGER MISSLAT, LOOP, NPTS, NUMLATS, NUMNEW, KOLDNUM, KNEWNUM
+ DIMENSION NPTS(JPMXLAT), NUMNEW(JPMXLAT)
+ REAL RLATINC, OLDLATS, NEWLATS, ROWINC
+ DIMENSION OLDLATS(JPMXLAT), NEWLATS(JPMXLAT)
+ LOGICAL LDIREC
+ REAL*4 DISNW, DISNE, DISSW, DISSE
+ REAL*4 NW_PT, NE_PT, SW_PT, SE_PT
+ REAL*4 RAD
+ DATA RAD/0.017453293/
+ REAL*4 DI1N, DI1S, DI2N, DI2S, DK1, DK2
+ REAL*4 CNW_PT, CNE_PT, CSW_PT, CSE_PT
+ REAL*4 SNW_PT, SNE_PT, SSW_PT, SSE_PT
+ REAL*4 U1, U2, C1, C2, S1, S2, CC, SS
+ INTEGER INW, INE, ISW, ISE, JNW, JNE, JSW, JSE
+C
+C Externals
+C
+ INTEGER WAVEIDX, SOFFSET, VALPINA, NUMPTWE
+ EXTERNAL WAVEIDX, SOFFSET, VALPINA, NUMPTWE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grspace.h"
+C
+C ---------------------------------------------------------------------
+C* Section 1. Initalisation.
+C ---------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WAVEXXX = 0
+
+C
+C Initialise the bitmap value lookup function
+C
+ IRET = VALPINA(0,0,0)
+C
+ MISSLAT = 0
+C
+C Calculate number of latitudes if grid had been full from
+C North pole to South pole
+C
+ NUMLATS = (180000/ISEC2(10)) + 1
+ IF( NUMLATS.GT.JPMXLAT ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXXX: Number of latitudes in input grid = ',NUMLATS)
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXXX: And is greater than allowed maximum = ',JPMXLAT)
+ WAVEXXX = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+ RLATINC = FLOAT(ISEC2(10))
+cs RLATINC = FLOAT(ISEC2(10)/1000)
+C
+C Fill an array with the number of points at each latitude for the
+C input field.
+C
+ IF( ISEC2(17).EQ.1 ) THEN
+C
+C Input field is a reduced latitude/longitude grid
+C
+C .. but it may be 'pseudo-gaussian' in layout
+C (ie global, symmetric about the equator but no latitude
+C at the equator)
+C
+ IF( (ISEC2(4).NE.90000).AND.(MOD(ISEC2(3),2).EQ.0) ) THEN
+C
+ NUMLATS = ISEC2(3)
+cs RLATINC = FLOAT(ISEC2(10))/1000
+cs ONORTH = FLOAT(ISEC2(4))/1000
+ ONORTH = FLOAT(ISEC2(4))
+C
+ DO LOOP = 1, NUMLATS
+cs OLDLATS(LOOP) = ONORTH - (LOOP-1)*RLATINC
+ OLDLATS(LOOP) = (ONORTH - (LOOP-1)*RLATINC)/1000
+ ENDDO
+C
+ DO LOOP = 1, ISEC2(3)
+ NPTS(LOOP+MISSLAT) = ISEC2(22+LOOP)
+ ENDDO
+C
+ ELSE
+C
+ DO LOOP = 1, NUMLATS
+ OLDLATS(LOOP) = (90000.0 - (LOOP-1)*RLATINC)/1000
+cs OLDLATS(LOOP) = 90.0 - (LOOP-1)*RLATINC
+ ENDDO
+C
+ MISSLAT = (90000 - ISEC2(4))/ISEC2(10)
+ DO LOOP = 1, MISSLAT
+ NPTS(LOOP) = 0
+ ENDDO
+ KOLDNUM = 1 + (90000 - ISEC2(7))/ISEC2(10)
+ DO LOOP = 1, (KOLDNUM-MISSLAT)
+ NPTS(LOOP+MISSLAT) = ISEC2(22+LOOP)
+ ENDDO
+ DO LOOP = (KOLDNUM+1), NUMLATS
+ NPTS(LOOP) = 0
+ ENDDO
+ ENDIF
+C
+ ELSE
+C
+C Input field is a regular latitude/longitude grid
+C
+C
+ DO LOOP = 1, NUMLATS
+cs OLDLATS(LOOP) = 90.0 - (LOOP-1)*RLATINC
+ OLDLATS(LOOP) = (90000.0 - (LOOP-1)*RLATINC)/1000
+ ENDDO
+C
+ MISSLAT = (90000 - ISEC2(4))/ISEC2(10)
+ DO LOOP = 1, MISSLAT
+ NPTS(LOOP) = 0
+ ENDDO
+ KOLDNUM = 1 + (90000 - ISEC2(7))/ISEC2(10)
+ DO LOOP = 1, (KOLDNUM-MISSLAT)
+ NPTS(LOOP+MISSLAT) = ISEC2(2)
+ ENDDO
+ DO LOOP = (KOLDNUM+1), NUMLATS
+ NPTS(LOOP) = 0
+ ENDDO
+ ENDIF
+C
+C ---------------------------------------------------------------------
+C* Section 2. Setup number of points at each latitude for the
+C output latitude/longitude field.
+C ---------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF( (NOREPR.EQ.JPQUASI) .OR. (NOREPR.EQ.JPGAUSSIAN) ) THEN
+C
+C Reduced (quasi-regular) gaussian output
+C
+ KNEWNUM = NOGAUSS*2
+ DO LOOP = 1, KNEWNUM
+ NUMNEW(LOOP) = NOLPTS(LOOP)
+ NEWLATS(LOOP) = ROGAUSS(LOOP)
+ ENDDO
+C
+ ELSE IF( NOREPR.EQ.JPREDLL ) THEN
+C
+C Reduced (quasi-regular) lat/long output
+C
+ KNEWNUM = NOREDLL
+ DO LOOP = 1, KNEWNUM
+ NUMNEW(LOOP) = NOLPTS(LOOP)
+ NEWLATS(LOOP) = ROREDLL(LOOP)
+ ENDDO
+C
+ ELSE
+C
+C Regular output
+C
+ MISSLAT = NINT((90.0 - NORTH)/STEPNS)
+ DO LOOP = 1, MISSLAT
+ NUMNEW(LOOP) = 0
+ ENDDO
+ DO LOOP = 1, NLATS
+ NUMNEW(LOOP+MISSLAT) = NINT(360.0/STEPWE)
+ ENDDO
+C
+ KNEWNUM = MISSLAT + NLATS
+ DO LOOP = 1, KNEWNUM
+ NEWLATS(LOOP) = 90.0 - (LOOP-1)*STEPNS
+ ENDDO
+C
+ ENDIF
+C
+C ---------------------------------------------------------------------
+C* Section 3. Get the input GRIB field characteristics.
+C ---------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C Calculate the indices of the input grid points to be used for
+C the output points
+C
+ OLDWEST = FLOAT(NIAREA(2))/PPMULT
+ OLDEAST = FLOAT(NIAREA(4))/PPMULT
+
+ WAVEXXX = WAVEIDX(NUMLATS,NPTS,OLDLATS,OLDWEST,OLDEAST,
+ X KNEWNUM, NUMNEW, NEWLATS,
+ X NEWIDX, DISTNEW)
+ IF( WAVEXXX.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXXX: Unable to calculate output grid indices',JPQUIET)
+ WAVEXXX = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Find bitmap (section 3) offset the GRIB product
+C
+ IRET = SOFFSET(OLDWAVE, IS0, IS1, IS2, IS3, IS4, IEDITN)
+C
+C Get the overall length of OLDWAVE
+C
+#ifdef INTEGER_8
+ NBIT = 64
+#else
+ NBIT = 32
+#endif
+ INSPT = (IS0 + 4) * 8
+ CALL INXBIT(OLDWAVE,10,INSPT,NLENG,1,NBIT,24,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXXX: Problem extracting overall length of GRIB',JPQUIET)
+ WAVEXXX = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C Get parameter identifier
+C
+ INSPT = (IS1 + 8) * 8
+ CALL INXBIT(OLDWAVE,10,INSPT,NPARAM,1,NBIT,8,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXXX: Problem getting parameter identifier',JPQUIET)
+ WAVEXXX = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+C Wave direction parameters need special handling
+C (MWD, MDWW, MDPS, MDWI)
+C
+ LDIREC = ( (NPARAM.EQ.230) .OR.
+ X (NPARAM.EQ.235) .OR.
+ X (NPARAM.EQ.238) .OR.
+ X (NPARAM.EQ.242) )
+C
+C Get the scale factor
+C
+ INSPT = (IS4 + 4) * 8
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,NSCALE,1,NBIT,16,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXXX: Problem extracting scale factor in GRIB',JPQUIET)
+ WAVEXXX = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+ CALL DSGNBT(ISCALE,NSCALE,16,NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXXX: Problem setting sign of scale factor',JPQUIET)
+ WAVEXXX = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+ SCALE = 2.0**(FLOAT(ISCALE))
+C
+C Get the reference value
+C
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,NEXP,1,NBIT,8,'D',NRETA)
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,NMANT,1,NBIT,24,'D',NRETB)
+ IF( (NRETA.NE.0) .OR. (NRETB.NE.0) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXXX: Problem getting reference value from GRIB',JPQUIET)
+ WAVEXXX = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+ CALL DECFP2(REFVAL,NEXP,NMANT)
+C
+C Get number of bits per packed value
+C
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,IBITS,1,NBIT,8,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXXX: Problem getting number of bits per word',JPQUIET)
+ WAVEXXX = JPROUTINE + 8
+ GOTO 900
+ ENDIF
+ NSPT1 = INSPT
+C
+C ---------------------------------------------------------------------
+C* Section 4. Work through the output subarea.
+C ---------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+C Fill in the wave spectra values
+C
+ NEXT = 0
+ NEXTWV = 0
+C
+ SOUTH = NOAREA(3)/PPMULT
+ EAST = NOAREA(4)/PPMULT
+ ISTART = 0
+C
+C Work down through latitudes from north to south.
+C
+
+
+ DO NROW = 1, KNEWNUM
+C
+C If inside north-south (subarea) boundaries ..
+C
+ IF( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPQUASI) ) THEN
+ PTLAT = ROGAUSS(NROW)
+ ELSE
+ PTLAT = 90.0 - (NROW-1)*STEPNS
+ ENDIF
+ IF( (PTLAT.LE.NORTH).AND.(ABS(PTLAT-SOUTH).GT.-0.0005) ) THEN
+C
+C Calculate number of points between west boundary of area and
+C Greenwich
+C
+ ROWINC = 360.0/NUMNEW(NROW)
+C
+ IWEST = INT(WEST/ROWINC)
+ IF( (WEST.GT.0.0).AND.(WEST.NE.(IWEST*ROWINC)) )
+ X IWEST = IWEST + 1
+ AWEST = IWEST * ROWINC
+ IWOFSET = NUMPTWE(AWEST,0.0,ROWINC)
+ IEOFSET = NUMPTWE(AWEST,EAST,ROWINC)
+C
+C Work through subarea longitudes from west to east.
+C
+ DO NCOL = 1, NUMNEW(NROW)
+ PTLONG = AWEST + (NCOL-1)*ROWINC
+ NEXT = NUMPTWE(AWEST,PTLONG,ROWINC)
+ IF( (NEXT.LE.IEOFSET).AND.(NEXT.GE.0) ) THEN
+C
+C .. and inside west-east (subarea) boundaries
+C
+ NEXT = 1 + NEXT - IWOFSET
+ IF( NEXT.LE.0) NEXT = NEXT + NUMNEW(NROW)
+ NEXT = NEXT + ISTART
+ NEXTWV = NEXTWV + 1
+C
+ INW = NEWIDX(JPNW,NEXT)
+ INE = NEWIDX(JPNE,NEXT)
+ ISW = NEWIDX(JPSW,NEXT)
+ ISE = NEWIDX(JPSE,NEXT)
+C
+C If there is a bitmap, ...
+C
+ IF( IS3.NE.0 ) THEN
+ IF(INW.NE.0) JNW = VALPINA(OLDWAVE, IS3+6, INW)
+ IF(INE.NE.0) JNE = VALPINA(OLDWAVE, IS3+6, INE)
+ IF(ISW.NE.0) JSW = VALPINA(OLDWAVE, IS3+6, ISW)
+ IF(ISE.NE.0) JSE = VALPINA(OLDWAVE, IS3+6, ISE)
+ ELSE
+ JNW = INW
+ JNE = INE
+ JSW = ISW
+ JSE = ISE
+ ENDIF
+C
+C Test if any of the four neighbouring points is missing.
+C
+ IF( (INW.EQ.0) .OR. (INE.EQ.0) .OR.
+ X (ISW.EQ.0) .OR. (ISE.EQ.0) .OR.
+ X (JNW.EQ.0) .OR. (JNE.EQ.0) .OR.
+ X (JSW.EQ.0) .OR. (JSE.EQ.0) ) THEN
+c
+C
+C If so, take nearest grid point value.
+C
+ DISNW = DISTNEW(JPDISNW,NEXT)
+ DISNE = DISTNEW(JPDISNE,NEXT)
+ DISSW = DISTNEW(JPDISSW,NEXT)
+ DISSE = DISTNEW(JPDISSE,NEXT)
+C
+ IF( (DISNW.LE.DISNE).AND.
+ X (DISNW.LE.DISSW).AND.
+ X (DISNW.LE.DISSE)) THEN
+ INDEX = INW
+ ILOCATE = JNW
+C
+ ELSE IF( (DISNE.LE.DISSW).AND.
+ X (DISNE.LE.DISSE) ) THEN
+ INDEX = INE
+ ILOCATE = JNE
+C
+ ELSE IF( (DISSW.LE.DISSE) ) THEN
+ INDEX = ISW
+ ILOCATE = JSW
+C
+ ELSE
+ INDEX = ISE
+ ILOCATE = JSE
+ ENDIF
+C
+ IF( (INDEX.EQ.0).OR.(ILOCATE.EQ.0) ) THEN
+C
+C Nearest point is missing
+C
+ NEWWAVE(NEXTWV) = PMISS
+C
+ ELSE
+ INSPT = NSPT1 + (ILOCATE - 1)*IBITS
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,ITEMP,1,
+ X NBIT,IBITS,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXXX: Problem getting nearest neighbour value',
+ X JPQUIET)
+ WAVEXXX = JPROUTINE + 9
+ GOTO 900
+ ENDIF
+ NEWWAVE(NEXTWV) = REFVAL + FLOAT(ITEMP)*SCALE
+ ENDIF
+C
+ ELSE
+C
+C Use bi-linear interpolation from four
+C neighbouring sea points.
+C
+ INSPT = NSPT1 + (JNW - 1)*IBITS
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,ITEMP,1,
+ X NBIT,IBITS,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXXX: Problem getting NW neighbour value',
+ X JPQUIET)
+ WAVEXXX = JPROUTINE + 10
+ GOTO 900
+ ENDIF
+ NW_PT = REFVAL + FLOAT(ITEMP)*SCALE
+C
+ INSPT = NSPT1 + (JNE - 1)*IBITS
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,ITEMP,1,
+ X NBIT,IBITS,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXXX: Problem getting NE neighbour value',
+ X JPQUIET)
+ WAVEXXX = JPROUTINE + 10
+ GOTO 900
+ ENDIF
+ NE_PT = REFVAL + FLOAT(ITEMP)*SCALE
+C
+ INSPT = NSPT1 + (JSW - 1)*IBITS
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,ITEMP,1,
+ X NBIT,IBITS,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXXX: Problem getting SW neighbour value',
+ X JPQUIET)
+ WAVEXXX = JPROUTINE + 10
+ GOTO 900
+ ENDIF
+ SW_PT = REFVAL + FLOAT(ITEMP)*SCALE
+C
+ INSPT = NSPT1 + (JSE - 1)*IBITS
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,ITEMP,1,
+ X NBIT,IBITS,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WAVEXXX: Problem getting SE neighbour value',
+ X JPQUIET)
+ WAVEXXX = JPROUTINE + 10
+ GOTO 900
+ ENDIF
+ SE_PT = REFVAL + FLOAT(ITEMP)*SCALE
+C
+ DI1N = DISTNEW(JPNW,NEXT)
+ DI2N = DISTNEW(JPNE,NEXT)
+ DI1S = DISTNEW(JPSW,NEXT)
+ DI2S = DISTNEW(JPSE,NEXT)
+ DK1 = DISTNEW(JPN,NEXT)
+ DK2 = DISTNEW(JPS,NEXT)
+C
+ IF( .NOT. LDIREC ) THEN
+ U1 = NW_PT*DI2N + NE_PT*DI1N
+ U2 = SW_PT*DI2S + SE_PT*DI1S
+ NEWWAVE(NEXTWV) = U1*DK2 + U2*DK1
+ ELSE
+C
+C Fields representing a 'direction': resolve into
+C components and interpolate each separately.
+C
+ CNW_PT = COS(NW_PT*RAD)
+ CNE_PT = COS(NE_PT*RAD)
+ CSW_PT = COS(SW_PT*RAD)
+ CSE_PT = COS(SE_PT*RAD)
+ SNW_PT = SIN(NW_PT*RAD)
+ SNE_PT = SIN(NE_PT*RAD)
+ SSW_PT = SIN(SW_PT*RAD)
+ SSE_PT = SIN(SE_PT*RAD)
+ C1 = CNW_PT*DI2N + CNE_PT*DI1N
+ C2 = CSW_PT*DI2S + CSE_PT*DI1S
+ CC = C1*DK2 + C2*DK1
+ S1 = SNW_PT*DI2N + SNE_PT*DI1N
+ S2 = SSW_PT*DI2S + SSE_PT*DI1S
+ SS = S1*DK2 + S2*DK1
+ IF( SS.LT.0.0 ) THEN
+ NEWWAVE(NEXTWV) = ATAN2(SS,CC)/RAD + 360.0
+ ELSE
+ NEWWAVE(NEXTWV) = ATAN2(SS,CC)/RAD
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDDO
+C
+ ENDIF
+ ISTART = ISTART + NUMNEW(NROW)
+ ENDDO
+C
+C ---------------------------------------------------------------------
+C* Section 9. Closedown.
+C ---------------------------------------------------------------------
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/wv2di32.F b/interpolation/wv2di32.F
new file mode 100755
index 0000000..6e21234
--- /dev/null
+++ b/interpolation/wv2di32.F
@@ -0,0 +1,342 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION WV2DI32(KOLDNUM,NUMOLD,OLDLATS,OLDWEST,OLDEAST,
+ X KNEWNUM,NUMNEW,NEWLATS,NEWWAVE)
+C
+C---->
+C*****WV2DI32*
+C
+C PURPOSE
+C -------
+C
+C Determines which nearest-neighbour values of an input global wave
+C 2D-spectra grid field to use for an output global wave 2D-spectra
+C grid field.
+C (32-bit REALs version)
+C
+C
+C INTERFACE
+C ---------
+C
+C IRET = WV2DI32(KOLDNUM,NUMOLD,OLDLATS,OLDWEST,OLDEAST,
+C X KNEWNUM,NUMNEW,NEWLATS,NEWWAVE)
+C
+C Input arguments
+C ---------------
+C
+C KOLDNUM - No. of meridians from North to South pole (input field)
+C NUMOLD - Array giving number of points along each latitude
+C (empty latitudes have entry 0)
+C OLDLATS - input field latitudes
+C OLDWEST - western longitude of the input field (degrees)
+C OLDEAST - eastern longitude of the input field (degrees)
+C
+C KNEWNUM - No. of meridians from North to South pole (output field)
+C NUMNEW - Array giving number of points along each latitude
+C (empty latitudes have entry 0)
+C NEWLATS - output field latitudes
+C
+C Output arguments
+C ----------------
+C
+C NEWWAVE - Indices of points to use
+C
+C Function returns 0 if the interpolation was OK.
+C
+C
+C METHOD
+C ------
+C
+C The index of the nearest neighbouring grid point value of
+C the input field is assigned to each point of the output
+C grid.
+C The index is zero if the output grid point is 'missing'.
+C
+C The input field can be regular or quasi-regular, and can be
+C global or a subarea.
+C The output field can be regular or quasi-regular.
+C
+C
+C EXTERNALS
+C ---------
+C
+C INTLOG - Log error message.
+C
+C
+C REFERENCE
+C ---------
+C
+C None
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF October 1997
+C
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 19410 )
+ INTEGER JPLLMAX
+ PARAMETER ( JPLLMAX = 721 )
+C `--> allow upto 0.25 degree resolution
+ INTEGER JPNMOUT
+ PARAMETER ( JPNMOUT = 720 )
+C `--> allow upto 0.25 degree resolution
+C
+C Function arguments
+C
+ INTEGER KOLDNUM, NUMOLD, KNEWNUM, NUMNEW
+ DIMENSION NUMOLD(*), NUMNEW(*)
+ REAL*4 OLDWEST, OLDEAST, OLDLATS, NEWLATS
+ DIMENSION OLDLATS(*), NEWLATS(*)
+ INTEGER NEWWAVE
+ DIMENSION NEWWAVE(*)
+C
+C Local arguments
+C
+ INTEGER K, NEWCOL, NEWROW, INCOL, LOOP, NEXT
+ INTEGER I_NW, I_SW, I_N, I_S, I_NE, I_SE
+ REAL*8 DELONGN, DELONGS, DIFF, RESOL, DINC
+ REAL*8 DIST_NW, DIST_SW, DIST_NE, DIST_SE, DIST_N, DIST_S
+ REAL*4 DISNW, DISNE, DISSW, DISSE
+ REAL*8 ZXIN, ZXIS, LON, LAT, OWEST, OEAST
+ DIMENSION LON(JPNMOUT*2)
+ LOGICAL LINGNS, LINGWE
+ INTEGER INDEXI
+ DIMENSION INDEXI(JPLLMAX)
+C
+C ---------------------------------------------------------------------
+C* Section 1. Initalisation.
+C ---------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WV2DI32 = 0
+ CALL INTLOG(JP_DEBUG,
+ X 'WV2DI32: Wave interpolation requested.',JPQUIET)
+C
+C Check latitude/longitude grid specification
+ IF( KOLDNUM.GT.JPLLMAX ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DI32: Number of latitudes in input grid = ',KOLDNUM)
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DI32: And is greater than allowed maximum = ',JPLLMAX)
+ WV2DI32 = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C Set up INDEXI for latitude lines in input lat/lon array
+C
+ INDEXI(1) = 0
+ DO LOOP = 2, KOLDNUM
+ INDEXI(LOOP) = INDEXI(LOOP-1) + NUMOLD(LOOP-1)
+ ENDDO
+C
+ OEAST = OLDEAST
+ OWEST = OLDWEST
+C
+C ---------------------------------------------------------------------
+C* Section 2. Interpolation.
+C ---------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ NEXT = 1
+C
+ DO 220 NEWROW = 1, KNEWNUM
+C
+C Find old latitude rows to north and south of new latitude and
+C set up the distance between new row and the old rows to N and S.
+C
+ DO LOOP = 1, KOLDNUM -1
+ IF( (NEWLATS(NEWROW).LE.OLDLATS(LOOP)) .AND.
+ X (NEWLATS(NEWROW).GT.OLDLATS(LOOP+1)) ) THEN
+ I_N = LOOP
+ I_S = MIN(LOOP+1,KOLDNUM)
+ GOTO 205
+ ENDIF
+ ENDDO
+C
+ IF( NEWLATS(NEWROW).EQ.OLDLATS(KOLDNUM) ) THEN
+ I_N = KOLDNUM
+ I_S = KOLDNUM
+ ELSE
+ I_N = -1
+ I_S = -1
+ ENDIF
+C
+ 205 CONTINUE
+ IF( I_N.NE.I_S) THEN
+ DIFF = OLDLATS(I_N) - OLDLATS(I_S)
+ DIST_N = (OLDLATS(I_N) - NEWLATS(NEWROW)) / DIFF
+ ELSE
+ DIST_N = 1.0
+ ENDIF
+ DIST_S = 1.0 - DIST_N
+C
+C Check if the new interpolated row lies between 2 old rows which
+C have data points
+C
+ LINGNS = .FALSE.
+ IF( I_N.GT.0 ) THEN
+ IF( (NUMOLD(I_N).GT.0).AND.(NUMOLD(I_S).GT.0) ) THEN
+C
+C Yes, so set up the grid increments.
+C
+ DINC = 360.0/DBLE(NUMOLD(I_N))
+ DELONGN = (DMOD((OEAST-OWEST+DBLE(360.0)), DBLE(360.0))
+ X +DINC) / DBLE(NUMOLD(I_N))
+ DINC = 360.0/DBLE(NUMOLD(I_S))
+ DELONGS = (DMOD((OEAST-OWEST+DBLE(360.0)), DBLE(360.0))
+ X +DINC) / DBLE(NUMOLD(I_S))
+ LINGNS = .TRUE.
+ ENDIF
+C
+C The equator is given special treatment so that the northern
+C and southern hemispheres for the parameter 250 can (later)
+C be stitched together.
+C
+C If the input field finishs at the equator and the output
+C field has a line at the equator, use the input equator for
+C interpolation.
+C
+ IF( NEWLATS(I_N).EQ.0.0 .AND.
+ x ((NUMOLD(I_N).GT.0).AND.(NUMOLD(I_S).EQ.0)) ) THEN
+C
+C Yes, so set up the grid increments.
+C
+ DINC = 360.0/DBLE(NUMOLD(I_N))
+ DELONGN = (DMOD((OEAST-OWEST+DBLE(360.0)), DBLE(360.0))
+ X +DINC) / DBLE(NUMOLD(I_N))
+ DELONGS = DELONGN
+ DIST_N = 0.0
+ DIST_S = 1.0
+ LINGNS = .TRUE.
+ ENDIF
+ ENDIF
+C
+C Setup longitudes for the current row
+C
+ INCOL = NUMNEW(NEWROW)
+ IF( INCOL.NE.0 ) THEN
+ RESOL = 360.0/DBLE(INCOL)
+ DO LOOP = 1, INCOL
+ LON(LOOP) = DBLE(LOOP-1)*RESOL
+ ENDDO
+C
+ DO 210 NEWCOL = 1, INCOL
+C
+ LINGWE = (LON(NEWCOL).GT.OWEST).OR.(LON(NEWCOL).LT.OEAST)
+C
+ IF( LINGNS .AND. LINGWE ) THEN
+C
+C If point to be interpolated is inside the input field ,
+C work out distances from new point to four neighbours.
+C
+ ZXIN = DMOD( (LON(NEWCOL) + (360.0-OWEST) + DBLE(720.0)),
+ X DBLE(360.0))
+ ZXIS = ZXIN
+ ZXIN = ZXIN/DELONGN + 1.0
+ ZXIS = ZXIS/DELONGS + 1.0
+ I_NW = INT(ZXIN)
+ I_NE = I_NW + 1
+ I_SW = INT(ZXIS)
+ I_SE = I_SW + 1
+C
+C Allow wrap-around
+C
+C
+ I_NW = MOD(I_NW,NUMOLD(I_N))
+ I_NE = MOD(I_NE,NUMOLD(I_N))
+ I_SW = MOD(I_SW,NUMOLD(I_S))
+ I_SE = MOD(I_SE,NUMOLD(I_S))
+ IF( I_NW.EQ.0 ) I_NW = NUMOLD(I_N)
+ IF( I_SW.EQ.0 ) I_SW = NUMOLD(I_S)
+ IF( I_NE.EQ.0 ) I_NE = NUMOLD(I_N)
+ IF( I_SE.EQ.0 ) I_SE = NUMOLD(I_S)
+C
+C Calculate distance from interpolated point to its neighbours
+C
+ DIST_NW = ZXIN - REAL(I_NW)
+ DIST_NE = 1.0 - DIST_NW
+ DIST_SW = ZXIS - REAL(I_SW)
+ DIST_SE = 1.0 - DIST_SW
+C
+C Take nearest grid point value.
+C
+ DISNW = DIST_NW*DIST_NW + DIST_N*DIST_N
+ DISNE = DIST_NE*DIST_NE + DIST_N*DIST_N
+ DISSW = DIST_SW*DIST_SW + DIST_S*DIST_S
+ DISSE = DIST_SE*DIST_SE + DIST_S*DIST_S
+C
+ IF( (DISNW.LE.DISNE).AND.(DISNW.LE.DISSW).AND.
+ X (DISNW.LE.DISSE) ) THEN
+C
+C Use north-west neighbour
+C
+ NEWWAVE(NEXT) = INDEXI(I_N)+I_NW
+C
+ ELSE IF( (DISNE.LE.DISSW).AND.(DISNE.LE.DISSE) ) THEN
+C
+C Use north-east neighbour
+C
+ NEWWAVE(NEXT) = INDEXI(I_N)+I_NE
+C
+ ELSE IF( DISSW.LE.DISSE ) THEN
+C
+C Use south-west neighbour
+C
+ NEWWAVE(NEXT) = INDEXI(I_S)+I_SW
+ ELSE
+C
+C Use south-east neighbour
+C
+ NEWWAVE(NEXT) = INDEXI(I_S)+I_SE
+ ENDIF
+C
+C If the point to be interpolated is outside the input field,
+C set it to 'land'.
+C
+ ELSE
+ NEWWAVE(NEXT) = 0
+ ENDIF
+C
+ NEXT = NEXT + 1
+C
+ 210 CONTINUE
+C
+ ENDIF
+C
+ 220 CONTINUE
+C
+C ---------------------------------------------------------------------
+C* Section 9. Closedown.
+C ---------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( WV2DI32.EQ.0 ) THEN
+ CALL INTLOG(JP_DEBUG, 'WV2DI32: successful.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_ERROR, 'WV2DI32: failed.',JPQUIET)
+ ENDIF
+C
+ RETURN
+ END
diff --git a/interpolation/wv2didx.F b/interpolation/wv2didx.F
new file mode 100755
index 0000000..34db56b
--- /dev/null
+++ b/interpolation/wv2didx.F
@@ -0,0 +1,388 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION WV2DIDX(KOLDNUM,NUMOLD,OLDLATS,OLDWEST,OLDEAST,
+ X KNEWNUM,NUMNEW,NEWLATS,NEWWAVE)
+C
+C---->
+C*****WV2DIDX*
+C
+C PURPOSE
+C -------
+C
+C Determines which nearest-neighbour values of an input global wave
+C 2D-spectra grid field to use for an output global wave 2D-spectra
+C grid field.
+C
+C
+C INTERFACE
+C ---------
+C
+C IRET = WV2DIDX(KOLDNUM,NUMOLD,OLDLATS,OLDWEST,OLDEAST,
+C X KNEWNUM,NUMNEW,NEWLATS,NEWWAVE)
+C
+C Input arguments
+C ---------------
+C
+C KOLDNUM - No. of meridians from North to South pole (input field)
+C NUMOLD - Array giving number of points along each latitude
+C (empty latitudes have entry 0)
+C OLDLATS - input field latitudes
+C OLDWEST - western longitude of the input field (degrees)
+C OLDEAST - eastern longitude of the input field (degrees)
+C
+C KNEWNUM - No. of meridians from North to South pole (output field)
+C NUMNEW - Array giving number of points along each latitude
+C (empty latitudes have entry 0)
+C NEWLATS - output field latitudes
+C
+C Output arguments
+C ----------------
+C
+C NEWWAVE - Indices of points to use
+C
+C Function returns 0 if the interpolation was OK.
+C
+C
+C METHOD
+C ------
+C
+C The index of the nearest neighbouring grid point value of
+C the input field is assigned to each point of the output
+C grid.
+C The index is zero if the output grid point is 'missing'.
+C
+C The input field can be regular or quasi-regular, and can be
+C global or a subarea.
+C The output field can be regular or quasi-regular.
+C
+C
+C EXTERNALS
+C ---------
+C
+C INTLOG - Log error message.
+C
+C
+C REFERENCE
+C ---------
+C
+C None
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF October 1997
+C
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 19410 )
+ INTEGER JPLLMAX
+ PARAMETER ( JPLLMAX = 1801 )
+C `--> allow upto 0.1 degree resolution
+ INTEGER JPNMOUT
+ PARAMETER ( JPNMOUT = 1800 )
+C `--> allow upto 0.1 degree resolution
+C
+C Function arguments
+C
+ INTEGER KOLDNUM, NUMOLD, KNEWNUM, NUMNEW
+ DIMENSION NUMOLD(*), NUMNEW(*)
+ REAL OLDWEST, OLDEAST, OLDLATS, NEWLATS
+ DIMENSION OLDLATS(*), NEWLATS(*)
+ INTEGER NEWWAVE
+ DIMENSION NEWWAVE(*)
+C
+C Local arguments
+C
+ INTEGER K, NEWCOL, NEWROW, INCOL, LOOP, NEXT, NUMMAX
+ INTEGER I_NW, I_SW, I_N, I_S, I_NE, I_SE
+ REAL*8 DELONGN, DELONGS, DIFF, RESOL, DINC, DEPS
+ REAL*8 DIST_NW, DIST_SW, DIST_NE, DIST_SE, DIST_N, DIST_S
+ REAL*4 DISNW, DISNE, DISSW, DISSE
+ REAL*8 ZXIN, ZXIS, LON, LAT, OWEST, OEAST
+ DIMENSION LON(JPNMOUT*2)
+ LOGICAL LINGNS, LINGWE
+ INTEGER INDEXI
+ DIMENSION INDEXI(JPLLMAX)
+ LOGICAL LGLOBAL, LFULLG, LGWRAP
+ DATA DEPS/0.00005/
+C
+C ---------------------------------------------------------------------
+C* Section 1. Initalisation.
+C ---------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WV2DIDX = 0
+ CALL INTLOG(JP_DEBUG,
+ X 'WV2DIDX: Wave interpolation requested.',JPQUIET)
+C
+C Check latitude/longitude grid specification
+ IF( KOLDNUM.GT.JPLLMAX ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DIDX: Number of latitudes in input grid = ',KOLDNUM)
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DIDX: And is greater than allowed maximum = ',JPLLMAX)
+ WV2DIDX = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C Set up INDEXI for latitude lines in input lat/lon array
+C
+
+ INDEXI(1) = 0
+ DO LOOP = 2, KOLDNUM
+ INDEXI(LOOP) = INDEXI(LOOP-1) + NUMOLD(LOOP-1)
+ ENDDO
+C
+ OEAST = OLDEAST
+ OWEST = OLDWEST
+
+C Check whether the input field is global or a subarea
+C
+ NUMMAX = NUMOLD(1)
+ DO LOOP = 2, KOLDNUM
+ IF( NUMOLD(LOOP).GT.NUMMAX ) NUMMAX = NUMOLD(LOOP)
+ ENDDO
+ IF( NUMMAX.LE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DIDX: Input wave field has no points',JPQUIET)
+ WV2DIDX = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ LGWRAP = ABS((OEAST-OWEST) - DBLE(360.0)).LT.DEPS
+ DINC = 360.0/DBLE(NUMMAX)
+ LFULLG = ABS((DMOD((OEAST-OWEST+DBLE(360.0)),DBLE(360.0))
+ X +DINC)-DBLE(360.0)).LT.DEPS
+C
+ LGLOBAL = LFULLG.OR.LGWRAP
+C
+C ---------------------------------------------------------------------
+C* Section 2. Interpolation.
+C ---------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ NEXT = 1
+C
+ DO 220 NEWROW = 1, KNEWNUM
+C
+C Find old latitude rows to north and south of new latitude and
+C set up the distance between new row and the old rows to N and S.
+C
+ DO LOOP = 1, KOLDNUM -1
+ IF( (NEWLATS(NEWROW).LE.OLDLATS(LOOP)) .AND.
+ X (NEWLATS(NEWROW).GT.OLDLATS(LOOP+1)) ) THEN
+ I_N = LOOP
+ I_S = MIN(LOOP+1,KOLDNUM)
+ GOTO 205
+ ENDIF
+ ENDDO
+C
+ IF( NEWLATS(NEWROW).EQ.OLDLATS(KOLDNUM) ) THEN
+ I_N = KOLDNUM
+ I_S = KOLDNUM
+ ELSE
+ I_N = -1
+ I_S = -1
+ ENDIF
+C
+ 205 CONTINUE
+ IF( I_N.NE.I_S) THEN
+ DIFF = OLDLATS(I_N) - OLDLATS(I_S)
+ DIST_N = (OLDLATS(I_N) - NEWLATS(NEWROW)) / DIFF
+ ELSE
+ DIST_N = 1.0
+ ENDIF
+ DIST_S = 1.0 - DIST_N
+C
+C Check if the new interpolated row lies between 2 old rows which
+C have data points
+C
+ LINGNS = .FALSE.
+ IF( I_N.GT.0 ) THEN
+ IF( (NUMOLD(I_N).GT.0).AND.(NUMOLD(I_S).GT.0) ) THEN
+C
+C Yes, so set up the grid increments.
+C
+C
+C Note that the grid increments are different depending on
+C whether or not the grid is global; global grids have an
+C extra interval at the end (eg between 358.5 and 0.0), while
+C subareas have outer limits defined by 'west' and 'east' and
+C a given number of points in between.
+C
+ IF( LGLOBAL ) THEN
+ DELONGN = 360.0/DBLE(NUMOLD(I_N))
+ DELONGS = 360.0/DBLE(NUMOLD(I_S))
+ ELSE
+ DINC = DMOD((OEAST-OWEST+DBLE(360.0)), DBLE(360.0))/
+ X DBLE(NUMOLD(I_N))
+
+ DELONGN = (DMOD((OEAST-OWEST+DBLE(360.0)), DBLE(360.0))
+ X +DINC) / DBLE(NUMOLD(I_N))
+ DINC = DMOD((OEAST-OWEST+DBLE(360.0)), DBLE(360.0))/
+ X DBLE(NUMOLD(I_S))
+ DELONGS = (DMOD((OEAST-OWEST+DBLE(360.0)), DBLE(360.0))
+ X +DINC) / DBLE(NUMOLD(I_S))
+ ENDIF
+c
+
+ LINGNS = .TRUE.
+ ENDIF
+C
+C The equator is given special treatment so that the northern
+C and southern hemispheres for the parameter 250 can (later)
+C be stitched together.
+C
+C If the input field finishs at the equator and the output
+C field has a line at the equator, use the input equator for
+C interpolation.
+C
+ IF( NEWLATS(NEWROW).EQ.0.0 .AND.
+ x ((NUMOLD(I_N).GT.0).AND.(NUMOLD(I_S).EQ.0)) ) THEN
+C
+C Yes, so set up the grid increments.
+C
+ IF( LGLOBAL ) THEN
+ DELONGN = 360.0/DBLE(NUMOLD(I_N))
+ ELSE
+ DINC = DMOD((OEAST-OWEST+DBLE(360.0)), DBLE(360.0))/
+ X DBLE(NUMOLD(I_N))
+ DELONGN = (DMOD((OEAST-OWEST+DBLE(360.0)), DBLE(360.0))
+ X +DINC) / DBLE(NUMOLD(I_N))
+ ENDIF
+ DELONGS = DELONGN
+ DIST_N = 0.0
+ DIST_S = 1.0
+ I_S = I_N
+ LINGNS = .TRUE.
+ ENDIF
+ ENDIF
+C
+C Setup longitudes for the current row
+C
+ INCOL = NUMNEW(NEWROW)
+ IF( INCOL.NE.0 ) THEN
+ RESOL = 360.0/DBLE(INCOL)
+ DO LOOP = 1, INCOL
+ LON(LOOP) = DBLE(LOOP-1)*RESOL
+ ENDDO
+C
+ DO 210 NEWCOL = 1, INCOL
+C
+ LINGWE = (LON(NEWCOL).GT.OWEST).OR.(LON(NEWCOL).LT.OEAST)
+C
+ IF( LINGNS .AND. LINGWE ) THEN
+C
+C If point to be interpolated is inside the input field ,
+C work out distances from new point to four neighbours.
+C
+ ZXIN = DMOD( (LON(NEWCOL) + (360.0-OWEST) + DBLE(720.0)),
+ X DBLE(360.0))
+cs ZXIN = LON(NEWCOL)
+ ZXIS = ZXIN
+ ZXIN = ZXIN/DELONGN + 1.0
+ ZXIS = ZXIS/DELONGS + 1.0
+ I_NW = INT(ZXIN)
+ I_NE = I_NW + 1
+ I_SW = INT(ZXIS)
+ I_SE = I_SW + 1
+C
+C Allow wrap-around
+C
+C
+ I_NW = MOD(I_NW,NUMOLD(I_N))
+ I_NE = MOD(I_NE,NUMOLD(I_N))
+ I_SW = MOD(I_SW,NUMOLD(I_S))
+ I_SE = MOD(I_SE,NUMOLD(I_S))
+ IF( I_NW.EQ.0 ) I_NW = NUMOLD(I_N)
+ IF( I_SW.EQ.0 ) I_SW = NUMOLD(I_S)
+ IF( I_NE.EQ.0 ) I_NE = NUMOLD(I_N)
+ IF( I_SE.EQ.0 ) I_SE = NUMOLD(I_S)
+C
+C Calculate distance from interpolated point to its neighbours
+C
+ DIST_NW = ZXIN - REAL(I_NW)
+ DIST_NE = 1.0 - DIST_NW
+ DIST_SW = ZXIS - REAL(I_SW)
+ DIST_SE = 1.0 - DIST_SW
+C
+C Take nearest grid point value.
+C
+ DISNW = DIST_NW*DIST_NW + DIST_N*DIST_N
+ DISNE = DIST_NE*DIST_NE + DIST_N*DIST_N
+ DISSW = DIST_SW*DIST_SW + DIST_S*DIST_S
+ DISSE = DIST_SE*DIST_SE + DIST_S*DIST_S
+C
+ IF( (DISNW.LE.DISNE).AND.(DISNW.LE.DISSW).AND.
+ X (DISNW.LE.DISSE) ) THEN
+C
+C Use north-west neighbour
+C
+ NEWWAVE(NEXT) = INDEXI(I_N)+I_NW
+C
+ ELSE IF( (DISNE.LE.DISSW).AND.(DISNE.LE.DISSE) ) THEN
+C
+C Use north-east neighbour
+C
+ NEWWAVE(NEXT) = INDEXI(I_N)+I_NE
+C
+ ELSE IF( DISSW.LE.DISSE ) THEN
+C
+C Use south-west neighbour
+C
+ NEWWAVE(NEXT) = INDEXI(I_S)+I_SW
+ ELSE
+C
+C Use south-east neighbour
+C
+ NEWWAVE(NEXT) = INDEXI(I_S)+I_SE
+ ENDIF
+C
+C If the point to be interpolated is outside the input field,
+C set it to 'land'.
+C
+ ELSE
+ NEWWAVE(NEXT) = 0
+ ENDIF
+C
+ NEXT = NEXT + 1
+C
+ 210 CONTINUE
+C
+ ENDIF
+C
+ 220 CONTINUE
+C
+C ---------------------------------------------------------------------
+C* Section 9. Closedown.
+C ---------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( WV2DIDX.EQ.0 ) THEN
+ CALL INTLOG(JP_DEBUG, 'WV2DIDX: successful.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_ERROR, 'WV2DIDX: failed.',JPQUIET)
+ ENDIF
+C
+ RETURN
+ END
diff --git a/interpolation/wv2dint.F b/interpolation/wv2dint.F
new file mode 100755
index 0000000..357c5a8
--- /dev/null
+++ b/interpolation/wv2dint.F
@@ -0,0 +1,301 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION WV2DINT(KNUM,NUMPTS,KE_W,KN_S,RESON,OLDWAVE,
+ X NEWWAVE,NORTH,WEST,KNSPEC,PMISS,RNS)
+C
+C---->
+C*****WV2DINT*
+C
+C PURPOSE
+C -------
+C
+C To interpolate a wave field quasi-regular latitude
+C longitude grid to a regular latitude/longitude grid.
+C
+C
+C INTERFACE
+C ---------
+C
+C IRET = WV2DINT(KNUM,NUMPTS,KE_W,KN_S,RESON,OLDWAVE,
+C NEWWAVE,NORTH,WEST,KNSPEC,PMISS,RNS)
+C
+C Input arguments
+C ---------------
+C
+C KNUM - No. of meridians from North to South pole (input field)
+C NUMPTS - Array giving number of points along each latitude
+C (empty latitudes have entry 0)
+C KE_W - First dimension of new array
+C = Number of points E-W in new grid
+C KN_S - Second dimension of new array
+C = Number of points N-S in new grid
+C RESON - Output grid resolution (degrees)
+C OLDWAVE - Original wave field
+C NORTH - Output grid northernmost latitude (degree)
+C WEST - Output grid westernmost longitude (degree)
+C KNSPEC - Number of 2D spectra values at each wave point
+C PMISS - Missing data value
+C RNS - Difference in degrees in NS disrection
+C
+C Output arguments
+C ----------------
+
+C NEWWAVE - New wave field
+C
+C Function returns 0 if the interpolation was OK.
+C
+C
+C METHOD
+C ------
+C
+C The nearest neighbouring grid point value is assigned to
+C the interpolated point.
+C
+C The output (sub) is the same as the input area.
+C
+C
+C EXTERNALS
+C ---------
+C
+C INTLOG - Log error message.
+C
+C
+C REFERENCE
+C ---------
+C
+C Based on:
+C SUBROUTINE INTERPOLATE
+C Peter Janssen ECMWF September 1995
+C and:
+C SUBROUTINE EXPOINT
+C Heinz Gunther ECMWF December 1989
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF November 1996
+C
+C J.D.Chambers ECMWF September 1998
+C Modified to handle subarea input/output.
+C The output (sub) is the same as the input area.
+C
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Parameters
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 19410 )
+ INTEGER JPLLMAX
+ PARAMETER ( JPLLMAX = 1801 )
+C `--> allow upto 0.1 degree resolution for
+C Mediterranean, 0.1 for Global
+ INTEGER JPNMOUT
+ PARAMETER ( JPNMOUT = 1800 )
+C `--> allow upto 0.1 degree resolution for
+C Mediterranean, 0.1 for Global
+C
+C Subroutine arguments
+C
+ INTEGER KNUM, NUMPTS, KE_W, KN_S, KNSPEC
+ DIMENSION NUMPTS(*)
+ REAL RESON, OLDWAVE, NEWWAVE, NORTH, WEST, PMISS
+ REAL RNS
+ DIMENSION OLDWAVE(*)
+ DIMENSION NEWWAVE(KE_W,KN_S)
+C
+C Local arguments
+C
+ INTEGER NLAT, K, I, NEWCOL, NEWROW,LOOP
+ INTEGER I_NW, I_SW, I_N, I_S, I_NE, I_SE
+ REAL DELONGN, DELONGS, DELAT
+ REAL DIST_NW, DIST_SW, DIST_NE, DIST_SE, DIST_N, DIST_S
+ REAL DISNW, DISNE, DISSW, DISSE
+ REAL ZXIN, ZXIS, LON, LAT
+ DIMENSION LON(JPNMOUT*2),LAT(JPNMOUT+1)
+ LOGICAL INGRID
+ INTEGER INDEX
+ DIMENSION INDEX(JPLLMAX)
+C
+ REAL OLDLATS(JPLLMAX), OLDEAST
+ INTEGER NEXT, NUMNEW(JPLLMAX)
+ INTEGER IRET, WV2DIDX,W251IDX
+ EXTERNAL WV2DIDX, W251IDX
+ INTEGER XKNUM,XKE_W,XKN_S
+ DATA XKNUM/-1/,XKE_W/-1/,XKN_S/-1/
+ REAL XRESON,XNORTH,XWEST
+ DATA XRESON/-999.0/,XNORTH/-999.0/,XWEST/-999.0/
+ INTEGER IFIRST, NEWIDX(1440*721)
+ DATA IFIRST/0/
+ REAL DEPS
+ DATA DEPS/0.00005/
+C
+ SAVE IFIRST,XKNUM,XKE_W,XKN_S,XRESON,XNORTH,XWEST,NEWIDX
+C
+C
+C ---------------------------------------------------------------------
+C* Section 1. Initalisation.
+C ---------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WV2DINT = 0
+ CALL INTLOG(JP_DEBUG,
+ X 'WV2DINT: Wave interpolation requested.',JPQUIET)
+C
+C Check only new-style 2D wave spectra (parameter 251)
+C
+ IF( KNSPEC.GT.1 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DINT: Only single-value 2D spectra field allowed',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DINT: Value given = ',KNSPEC)
+ WV2DINT = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C Check reduced latitude/longitude grid specification
+C
+ IF( KNUM.GT.JPLLMAX ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DINT: Number of latitudes in input lat/long grid = ',KNUM)
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DINT: And is greater than allowed maximum = ',JPLLMAX)
+ WV2DINT = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+C Ensure working array dimensions are adequate for required output.
+C
+ IF( (KE_W.GT.JPNMOUT*2).OR.(KN_S.GT.JPNMOUT+1) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DINT: Internal array dimensions are too small',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DINT: for given lat/long output field.',JPQUIET)
+ WV2DINT = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C Set up index for latitude lines in the input reduced lat/lon array
+C
+ INDEX(1) = 0
+ DO K = 2, KNUM
+ INDEX(K) = INDEX(K-1) + NUMPTS(K-1)
+ ENDDO
+C
+C Calculate latitudes and longitudes of output grid points.
+C
+C
+ DO K = 1, KN_S
+ LAT(K) = NORTH - FLOAT(K-1)*RESON
+ NUMNEW(K) = KE_W ! 0
+ ENDDO
+
+ DELAT = RNS/(KNUM-1)
+
+ DO k=1,KNUM
+ OLDLATS(K) = NORTH - FLOAT(K-1)*DELAT
+ END DO
+C
+ IF( ABS((KE_W*RESON)-360.0).LT.DEPS ) THEN
+ OLDEAST = WEST + KE_W*RESON
+ ELSE
+ OLDEAST = WEST + (KE_W-1)*RESON
+ ENDIF
+C
+C Initialise all points with 'missing data' indicator
+C
+ DO NEWROW = 1, KN_S
+ DO NEWCOL = 1, KE_W
+ NEWWAVE(NEWCOL,NEWROW) = PMISS
+ ENDDO
+ ENDDO
+C
+C ---------------------------------------------------------------------
+C* Section 2. Interpolation.
+C ---------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+C Only calculate the indices on the first time through
+C
+ IF( (IFIRST.EQ.0 ) .OR.
+ X ( KNUM.NE.XKNUM ) .OR.
+ X ( KE_W.NE.XKE_W ) .OR.
+ X ( KN_S.NE.XKN_S ) .OR.
+ X ( RESON.NE.XRESON ).OR.
+ X ( NORTH.NE.XNORTH ).OR.
+ X ( WEST.NE.XWEST ) ) THEN
+ IRET = W251IDX(KNUM,NUMPTS,OLDLATS,WEST,OLDEAST,
+ X KN_S,NUMNEW,LAT,NEWIDX)
+ IFIRST = 1
+ XKNUM = KNUM
+ XKE_W = KE_W
+ XKN_S = KN_S
+ XRESON = RESON
+ XNORTH = NORTH
+ XWEST = WEST
+ ENDIF
+C
+C DELAT = 180.0/(KNUM-1)
+ DELAT = RNS/(KNUM-1)
+ NEXT = 0
+C
+ DO 220 NEWROW = 1, KN_S
+C
+C Set up the distance between new row and the old rows to N and S.
+C
+ NLAT = NINT((NORTH - LAT(NEWROW))/DELAT) + 1
+ I_N = NLAT
+ I_S = MIN(I_N+1,KNUM*2)
+ DIST_N = ((NORTH - DELAT*(I_N-1)) - LAT(NEWROW)) / DELAT
+ DIST_S = 1.0 - DIST_N
+C
+C Check if the new interpolated row lies between 2 old rows which
+C have data points
+C
+ IF( (NUMPTS(I_N).GT.0).AND.(NUMPTS(I_S).GT.0) ) THEN
+C
+C Yes, use the calculated indices
+C
+ DO 210 NEWCOL = 1, KE_W
+C
+ NEXT = NEXT + 1
+C
+ NEWWAVE(NEWCOL,NEWROW) = OLDWAVE(NEWIDX(NEXT))
+C
+ 210 CONTINUE
+ Else
+ NEXT = NEXT + KE_W
+ ENDIF
+C
+ 220 CONTINUE
+C
+C ---------------------------------------------------------------------
+C* Section 9. Closedown.
+C ---------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( WV2DINT.EQ.0 ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'WV2DINT: Wave interpolation successful.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'WV2DINT: Wave interpolation failed.',JPQUIET)
+ ENDIF
+C
+ RETURN
+ END
diff --git a/interpolation/wv2dppp.F b/interpolation/wv2dppp.F
new file mode 100755
index 0000000..3426c5b
--- /dev/null
+++ b/interpolation/wv2dppp.F
@@ -0,0 +1,156 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION WV2DPPP(ISEC2, ISEC4, NLONS, NLATS, STEP,
+ X OLDWAVE, NEWWAVE, NORTH, WEST, PMISS)
+C
+C---->
+C*****WV2DPPP*
+C
+C PURPOSE
+C -------
+C
+C Interface routine to call WV2DINT using (inconsistent)
+C GRIB headers in 2D wave spectra fields.
+C
+C
+C INTERFACE
+C ---------
+C
+C IRET = WV2DPPP(ISEC2, ISEC4, NLONS, NLATS, STEP,
+C X OLDWAVE, NEWWAVE, NORTH, WEST, PMISS)
+C
+C Input arguments
+C ---------------
+C
+C ISEC2 - Unpacked section 2 header from 2D wave spectra field
+C ISEC4 - Unpacked section 4 header from 2D wave spectra field
+C NLONS - Number of points E-W in new grid
+C NLATS - Number of points N-S in new grid
+C STEP - Output grid resolution (degrees)
+C OLDWAVE - Original wave field
+C NORTH - Output grid northernmost latitude (degrees)
+C WEST - Output grid westernmost longitude (degrees)
+C PMISS - Missing data value
+C
+C Output arguments
+C ----------------
+
+C NEWWAVE - New wave field
+C
+C Function returns 0 if the interpolation was OK.
+C
+C
+C METHOD
+C ------
+C
+C Setes up call to WV2DINT from 2D wave spectra field headers.
+C
+C
+C EXTERNALS
+C ---------
+C
+C None.
+C
+C
+C REFERENCE
+C ---------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF November 1996
+C
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ INTEGER ISEC2, ISEC4, NLONS, NLATS
+ DIMENSION ISEC2(*), ISEC4(*)
+ REAL STEP, OLDWAVE, NEWWAVE, NORTH, WEST, PMISS
+ DIMENSION OLDWAVE(*), NEWWAVE(*)
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPMXLAT
+ PARAMETER (JPROUTINE = 19420)
+ PARAMETER (JPMXLAT = 361)
+C
+C Local arguments
+C
+ INTEGER NSPEC, MISSLAT, LOOP, NPTS, NUMLATS
+ DIMENSION NPTS(JPMXLAT)
+C
+C Externals
+C
+ INTEGER WV2DINT
+ EXTERNAL WV2DINT
+C
+C ---------------------------------------------------------------------
+C* Section 1. Initalisation.
+C ---------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WV2DPPP = 0
+C
+C Setup number of spectra at each point
+C
+ IF( ISEC4(8).EQ.64 ) THEN
+ NSPEC = ISEC4(50)*ISEC4(51)
+ ELSE
+ NSPEC = 1
+ ENDIF
+C
+C Calculate number of latitudes if grid had been full from
+C North pole to South pole
+C
+ NUMLATS = (180000/ISEC2(10)) + 1
+ IF( NUMLATS.GT.JPMXLAT ) THEN
+ WV2DPPP = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C Fill an array with the number of points at each latitude
+C (this is a reduced latitude/longitude grid)
+C
+ MISSLAT = (90000 - ISEC2(4))/ISEC2(10)
+ DO LOOP = 1, MISSLAT
+ NPTS(LOOP) = 0
+ ENDDO
+ DO LOOP = 1, ISEC2(3)
+ NPTS(LOOP+MISSLAT) = ISEC2(22+LOOP)
+ ENDDO
+ DO LOOP = MISSLAT+ISEC2(3), NUMLATS
+ NPTS(LOOP) = 0
+ ENDDO
+C
+C ---------------------------------------------------------------------
+C* Section 2. Do the interpolation.
+C ---------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ WV2DPPP = WV2DINT(NUMLATS,NPTS,NLONS,NLATS,STEP,OLDWAVE,
+ X NEWWAVE,NORTH,WEST,NSPEC,PMISS)
+C
+C ---------------------------------------------------------------------
+C* Section 9. Closedown.
+C ---------------------------------------------------------------------
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/wv2dx32.F b/interpolation/wv2dx32.F
new file mode 100755
index 0000000..e256f4b
--- /dev/null
+++ b/interpolation/wv2dx32.F
@@ -0,0 +1,484 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION WV2DX32(ISEC2,ISEC4,NLATS,STEPNS,STEPWE,
+ X OLDWAVE,NEWIDX,NEWWAVE,NORTH,WEST,PMISS)
+C
+C---->
+C*****WV2DX32*
+C
+C PURPOSE
+C -------
+C
+C Interpolates 2D wave spectra fields.
+C (32-bit REALs version)
+C
+C
+C INTERFACE
+C ---------
+C
+C IRET = WV2DX32(ISEC2,ISEC4,NLATS,STEPNS,STEPWE,
+C X OLDWAVE,NEWIDX,NEWWAVE,NORTH,WEST,PMISS)
+C
+C Input arguments
+C ---------------
+C
+C ISEC2 - Unpacked section 2 header from 2D wave spectra field
+C ISEC4 - Unpacked section 4 header from 2D wave spectra field
+C NLATS - Number of points N-S in new grid
+C STEPNS - Output grid north-south resolution (degrees) (REAL*4)
+C STEPWE - Output grid west-east resolution (degrees) (REAL*4)
+C OLDWAVE - Original wave field (REAL*4)
+C NORTH - Output grid northernmost latitude (degrees) (REAL*4)
+C WEST - Output grid westernmost longitude (degrees) (REAL*4)
+C PMISS - Missing data value (REAL*4)
+C
+C Output arguments
+C ----------------
+C
+C NEWIDX - Indices of old grid points used for new grid points
+C NEWWAVE - New wave field (REAL*4)
+C
+C Function returns 0 if the interpolation was OK.
+C
+C
+C METHOD
+C ------
+C
+C Builds the index of nearest neighbour points for the output grid.
+C Then works through the output grid points, checking for subarea
+C boundaries and looking up nearset neighbour 2D spectra values
+C (which may be missing data).
+C
+C
+C EXTERNALS
+C ---------
+C
+C WV2DI32 - builds the index of nearest neighbour points
+C NPTWE32 - Calculates number of grid points between west/east
+C area boundaries (32-bit REALs version)
+C VALPINA - Looks up bitmap value
+C ONEBITS - Counts number of 1s in a GRIB section 3 bitmap
+C NUMVALS - Counts the values in the secondary bitmap.
+C SOFFSET - Finds the section offsets in GRIB message
+C INTLOG - Log error message
+C
+C
+C REFERENCE
+C ---------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF March 1998
+C
+C
+C Modifications
+C -------------
+C
+C J.D.Chambers ECMWF May 1998
+C Handle parameter 251 as a simple form of wave 2D spectra.
+C (A field containing one direction and one frequency).
+C
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ INTEGER ISEC2, ISEC4, NLATS
+ DIMENSION ISEC2(*), ISEC4(*)
+ REAL*4 STEPNS, STEPWE, OLDWAVE, NEWWAVE, NORTH, WEST, PMISS
+ DIMENSION OLDWAVE(*), NEWWAVE(*)
+ INTEGER NEWIDX
+ DIMENSION NEWIDX(*)
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPMXLAT, JPNSPEC
+ PARAMETER (JPROUTINE = 40000)
+ PARAMETER (JPMXLAT = 721)
+ PARAMETER (JPNSPEC = 600)
+C
+C Local arguments
+C
+ LOGICAL LSIMPLE
+ INTEGER IEOFSET, IWOFSET, ISTART, IWEST
+ REAL*4 SOUTH, EAST, PTLAT, PTLONG, AWEST, OLDWEST, OLDEAST
+ REAL*4 REFVAL, SCALE
+ INTEGER NPDATA, INSPT, NEXP, NMANT, NRETA, NRETB, NLENG, NBIT
+ INTEGER NVALS
+ INTEGER ISCALE, NSCALE, IBITS, ITEMP, NPBTMP2, IBITMAP, NUNUSED
+ DIMENSION IBITMAP(JPNSPEC)
+ INTEGER IRET, IS0, IS1, IS2, IS3, IS4, IEDITN
+ INTEGER NEXT, NEXTWV, NROW, NCOL, INDEX, ILOCATE
+ INTEGER NSPEC, MISSLAT, LOOP, NPTS, NUMLATS, NUMNEW
+ INTEGER KOLDNUM, KNEWNUM
+ DIMENSION NPTS(JPMXLAT), NUMNEW(JPMXLAT)
+ REAL*4 RLATINC, OLDLATS, NEWLATS, ROWINC
+ DIMENSION OLDLATS(JPMXLAT), NEWLATS(JPMXLAT)
+C
+C Externals
+C
+ INTEGER WV2DI32, SOFFSET, VALPINA, NUMVALS, ONEBITS, NPTWE32
+ EXTERNAL WV2DI32, SOFFSET, VALPINA, NUMVALS, ONEBITS, NPTWE32
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grspace.h"
+C
+C ---------------------------------------------------------------------
+C* Section 1. Initalisation.
+C ---------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WV2DX32 = 0
+C
+C Initialise the bitmap value lookup function and function
+C which counts the values in the secondary bitmap.
+C
+ IRET = VALPINA(0,0,0)
+ IRET = NUMVALS(0,0,0)
+C
+C Setup number of spectra at each point
+C
+ IF( ISEC4(8).EQ.0 ) THEN
+ LSIMPLE = .TRUE.
+ NSPEC = 1
+ ELSE
+ LSIMPLE = .FALSE.
+ NSPEC = ISEC4(50)*ISEC4(51)
+ ENDIF
+C
+ IF( NSPEC.GT.JPNSPEC) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DX32: Number of wave spectra at each grid pt = ',NSPEC)
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DX32: And is greater than allowed maximum = ',JPNSPEC)
+ WV2DX32 = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C Calculate number of latitudes if grid had been full from
+C North pole to South pole
+C
+ NUMLATS = (180000/ISEC2(10)) + 1
+ IF( NUMLATS.GT.JPMXLAT ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DX32: Number of latitudes in input grid = ',NUMLATS)
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DX32: And is greater than allowed maximum = ',JPMXLAT)
+ WV2DX32 = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ RLATINC = FLOAT(ISEC2(10))/1000
+ DO LOOP = 1, NUMLATS
+ OLDLATS(LOOP) = 90.0 - (LOOP-1)*RLATINC
+ ENDDO
+C
+C Fill an array with the number of points at each latitude for the
+C input field (this is a reduced latitude/longitude grid)
+C
+ MISSLAT = (90000 - ISEC2(4))/ISEC2(10)
+ DO LOOP = 1, MISSLAT
+ NPTS(LOOP) = 0
+ ENDDO
+ KOLDNUM = 1 + (90000 - ISEC2(7))/ISEC2(10)
+ DO LOOP = 1, (KOLDNUM-MISSLAT)
+ NPTS(LOOP+MISSLAT) = ISEC2(22+LOOP)
+ ENDDO
+ DO LOOP = (KOLDNUM+1), NUMLATS
+ NPTS(LOOP) = 0
+ ENDDO
+C
+C ---------------------------------------------------------------------
+C* Section 2. Setup number of points at each latitude for the
+C output latitude/longitude field.
+C ---------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF( (NOREPR.EQ.JPQUASI) .OR. (NOREPR.EQ.JPGAUSSIAN) ) THEN
+C
+C Reduced (quasi-regular) gaussian output
+C
+ KNEWNUM = NOGAUSS*2
+ DO LOOP = 1, KNEWNUM
+ NUMNEW(LOOP) = NOLPTS(LOOP)
+ NEWLATS(LOOP) = ROGAUSS(LOOP)
+ ENDDO
+C
+ ELSE IF( NOREPR.EQ.JPREDLL ) THEN
+C
+C Reduced (quasi-regular) lat/long output
+C
+ KNEWNUM = NOREDLL
+ DO LOOP = 1, KNEWNUM
+ NUMNEW(LOOP) = NOLPTS(LOOP)
+ NEWLATS(LOOP) = ROREDLL(LOOP)
+ ENDDO
+C
+ ELSE
+C
+C Regular output
+C
+ MISSLAT = NINT((90.0 - NORTH)/STEPNS)
+ DO LOOP = 1, MISSLAT
+ NUMNEW(LOOP) = 0
+ ENDDO
+ DO LOOP = 1, NLATS
+ NUMNEW(LOOP+MISSLAT) = NINT(360.0/STEPWE)
+ ENDDO
+C
+ KNEWNUM = MISSLAT + NLATS
+ DO LOOP = 1, KNEWNUM
+ NEWLATS(LOOP) = 90.0 - (LOOP-1)*STEPNS
+ ENDDO
+C
+ ENDIF
+C
+C ---------------------------------------------------------------------
+C* Section 3. Get the input GRIB field characteristics.
+C ---------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C Calculate the indices of the input grid points to be used for
+C the output points
+C
+ OLDWEST = FLOAT(ISEC2(5))/1000
+ OLDEAST = FLOAT(ISEC2(8))/1000
+ WV2DX32 = WV2DI32(NUMLATS,NPTS,OLDLATS,OLDWEST,OLDEAST,
+ X KNEWNUM, NUMNEW, NEWLATS, NEWIDX)
+ IF( WV2DX32.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DX32: Unable to calculate output grid indices',JPQUIET)
+ WV2DX32 = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C Find section offsets for the GRIB product
+C
+ IRET = SOFFSET(OLDWAVE, IS0, IS1, IS2, IS3, IS4, IEDITN)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DX32: Problem finding section offsets for GRIB',JPQUIET)
+ WV2DX32 = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+C Get the overall length of OLDWAVE
+C
+ NBIT = 32
+ INSPT = (IS0 + 4) * 8
+ CALL INXBIT(OLDWAVE,10,INSPT,NLENG,1,NBIT,24,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DX32: Problem extracting overall length of GRIB',JPQUIET)
+ WV2DX32 = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+C
+C Get the scale factor
+C
+ INSPT = (IS4 + 4) * 8
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,NSCALE,1,NBIT,16,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DX32: Problem extracting scale factor in GRIB',JPQUIET)
+ WV2DX32 = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+ CALL DSGNBT(ISCALE,NSCALE,16,NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DX32: Problem setting sign of scale factor',JPQUIET)
+ WV2DX32 = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+ SCALE = 2.0**(FLOAT(ISCALE))
+C
+C Get the reference value
+C
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,NEXP,1,NBIT,8,'D',NRETA)
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,NMANT,1,NBIT,24,'D',NRETB)
+ IF( (NRETA.NE.0) .OR. (NRETB.NE.0) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DX32: Problem getting reference value from GRIB',JPQUIET)
+ WV2DX32 = JPROUTINE + 8
+ GOTO 900
+ ENDIF
+ CALL DECFP2(REFVAL,NEXP,NMANT)
+C
+C Get number of bits per packed value
+C
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,IBITS,1,NBIT,8,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DX32: Problem getting number of bits per word',JPQUIET)
+ WV2DX32 = JPROUTINE + 9
+ GOTO 900
+ ENDIF
+C
+C (Pointer INSPT is currently at octet 12 in GRIB section 4)
+C
+C Set up pointers to start of secondary bitmap and start of packed
+C data values
+C
+ NPBTMP2 = (IS4 + 24)*8 + (ISEC4(53)+ISEC4(55))*32
+C
+ IF( .NOT. LSIMPLE ) THEN
+ NPDATA = NPBTMP2 + NSPEC*ONEBITS(OLDWAVE,IS3)
+ ELSE
+ NPDATA = NPBTMP2
+ ENDIF
+ NPDATA = ((NPDATA + 7)/8)*8
+C
+C ---------------------------------------------------------------------
+C* Section 4. Work through the output subarea.
+C ---------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+C Fill in the wave spectra values
+C
+ NEXT = 0
+ NEXTWV = 0
+C
+ SOUTH = NOAREA(3)/PPMULT
+ EAST = NOAREA(4)/PPMULT
+ ISTART = 0
+C
+C Work down through latitudes from north to south.
+C
+ DO NROW = 1, KNEWNUM
+C
+C If inside north-south (subarea) boundaries ..
+C
+ IF( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPQUASI) ) THEN
+ PTLAT = ROGAUSS(NROW)
+ ELSE
+ PTLAT = 90.0 - (NROW-1)*STEPNS
+ ENDIF
+C
+ IF( (PTLAT.LE.NORTH).AND.(ABS(PTLAT-SOUTH).GT.-0.0005) ) THEN
+C
+C Calculate number of points between west boundary of area and
+C Greenwich
+C
+ ROWINC = 360.0/NUMNEW(NROW)
+C
+ IWEST = INT(WEST/ROWINC)
+ IF( (WEST.GT.0.0).AND.(WEST.NE.(IWEST*ROWINC)) )
+ X IWEST = IWEST + 1
+ AWEST = IWEST * ROWINC
+ IWOFSET = NPTWE32(AWEST,0.0,ROWINC)
+ IEOFSET = NPTWE32(AWEST,EAST,ROWINC)
+C
+C Work through subarea longitudes from west to east.
+C
+ DO NCOL = 1, NUMNEW(NROW)
+ PTLONG = AWEST + (NCOL-1)*ROWINC
+ NEXT = NPTWE32(AWEST,PTLONG,ROWINC)
+ IF( (NEXT.LE.IEOFSET).AND.(NEXT.GE.0) ) THEN
+C
+C .. and inside west-east (subarea) boundaries
+C
+ NEXT = 1 + NEXT - IWOFSET
+ IF( NEXT.LE.0) NEXT = NEXT + NUMNEW(NROW)
+ NEXT = NEXT + ISTART
+ INDEX = NEWIDX(NEXT)
+ ILOCATE = VALPINA(OLDWAVE, IS3+6, INDEX)
+C
+ IF( ILOCATE.EQ.0 ) THEN
+C
+C Nearest neighbour is a 'missing' point
+C
+ DO LOOP = 1, NSPEC
+ NEXTWV = NEXTWV + 1
+ NEWWAVE(NEXTWV) = PMISS
+ ENDDO
+C
+ ELSE
+C
+C Nearest neighbour has values
+C
+ IF( LSIMPLE ) THEN
+ INSPT = NPDATA + (ILOCATE - 1)*IBITS
+ NVALS = 1
+ IBITMAP(1) = 1
+ ELSE
+C
+C Count the number of values in the secondary bitmap upto
+C the current point and pick up its secondary bitmap.
+C
+ INSPT = NPBTMP2 + (ILOCATE - 1)*NSPEC
+ NVALS = NUMVALS(OLDWAVE,NPBTMP2,INSPT)
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,IBITMAP,NSPEC,
+ X NBIT,1,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DX32: Problem getting neighbours 2ndary bitmap',
+ X JPQUIET)
+ WV2DX32 = JPROUTINE + 10
+ GOTO 900
+ ENDIF
+C
+C Pick up the values at the current point
+C
+ INSPT = NPDATA + NVALS*IBITS
+ ENDIF
+C
+ DO LOOP = 1, NSPEC
+ NEXTWV = NEXTWV + 1
+ IF( IBITMAP(LOOP).EQ.0 ) THEN
+C
+C ..missing
+C
+ NEWWAVE(NEXTWV) = PMISS
+C
+ ELSE
+C
+C ..retrieve and recreate the packed value
+C
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,ITEMP,1,
+ X NBIT,IBITS,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DX32: Problem getting nearest neighbour',
+ X JPQUIET)
+ WV2DX32 = JPROUTINE + 11
+ GOTO 900
+ ENDIF
+ NEWWAVE(NEXTWV) = REFVAL + FLOAT(ITEMP)*SCALE
+ ENDIF
+ ENDDO
+C
+ ENDIF
+ ENDIF
+ ENDDO
+C
+ ENDIF
+ ISTART = ISTART + NUMNEW(NROW)
+ ENDDO
+C
+C ---------------------------------------------------------------------
+C* Section 9. Closedown.
+C ---------------------------------------------------------------------
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/wv2dxx2.F b/interpolation/wv2dxx2.F
new file mode 100755
index 0000000..8a75d92
--- /dev/null
+++ b/interpolation/wv2dxx2.F
@@ -0,0 +1,352 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION WV2DXX2(KNSPEC, NUMLATS, NPTS,
+ X NLATS, STEPNS, STEPWE,
+ X OLDWAVE, NEWWAVE,
+ X NORTH,WEST,PMISS)
+C
+C---->
+C*****WV2DXX2*
+C
+C PURPOSE
+C -------
+C
+C Interpolates 2D wave spectra fields.
+C
+C
+C INTERFACE
+C ---------
+C
+C IRET = WV2DXX2(KNSPEC, NUMLATS, NPTS,
+C X NLATS,STEPNS,STEPWE,
+C X OLDWAVE,NEWWAVE,
+C X NORTH,WEST,PMISS)
+C
+C Input arguments
+C ---------------
+C
+C KNSPEC - Number of 2D spectra values at each wave point
+C NUMLATS - Input lat number north-south
+C NPTS - Array giving number of points along each latitude
+C for Input field (empty latitudes have entry 0)
+C NLATS - Number of points N-S in new grid
+C STEPNS - Output grid north-south resolution (degrees)
+C STEPWE - Output grid west-east resolution (degrees)
+C OLDWAVE - Original wave field
+C NORTH - Output grid northernmost latitude (degrees)
+C WEST - Output grid westernmost longitude (degrees)
+C PMISS - Missing data value
+C
+C Output arguments
+C ----------------
+C
+C NEWWAVE - New wave field
+C
+C Function returns 0 if the interpolation was OK.
+C
+C
+C METHOD
+C ------
+C
+C Builds the index of nearest neighbour points for the output grid.
+C Then works through the output grid points, checking for subarea
+C boundaries and looking up nearset neighbour 2D spectra values
+C (which may be missing data).
+C
+C
+C EXTERNALS
+C ---------
+C
+C WV2DIDX - builds the index of nearest neighbour points
+C NUMPTWE - Calculates number of grid points between west/east
+C area boundaries
+C VALPINA - Looks up bitmap value
+C ONEBITS - Counts number of 1s in a GRIB section 3 bitmap
+C NUMVALS - Counts the values in the secondary bitmap.
+C SOFFSET - Finds the section offsets in GRIB message
+C INTLOG - Log error message
+C
+C
+C REFERENCE
+C ---------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C S. Curic ECMWF Jun 2009
+C
+C Handle parameter 251 as a simple form of wave 2D spectra.
+C (A field containing one direction and one frequency).
+C
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ INTEGER NPTS,NLATS
+ DIMENSION NPTS(*)
+ REAL STEPNS, STEPWE, OLDWAVE, NEWWAVE, NORTH, WEST, PMISS
+ DIMENSION OLDWAVE(*), NEWWAVE(*)
+ INTEGER NEWIDX
+ DIMENSION NEWIDX(2880*1442)
+ INTEGER NUMLATS, KNSPEC
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPMXLAT, JPNSPEC
+ PARAMETER (JPROUTINE = 40000)
+ PARAMETER (JPMXLAT = 1801)
+ PARAMETER (JPNSPEC = 600)
+C
+C Local arguments
+C
+ INTEGER IEOFSET, IWOFSET, ISTART, IWEST
+ REAL SOUTH, EAST, PTLAT, PTLONG, AWEST, OLDWEST, OLDEAST
+ REAL REFVAL, SCALE
+ INTEGER NPDATA, INSPT, NEXP, NMANT, NRETA, NRETB, NLENG, NBIT
+ INTEGER NVALS
+ INTEGER ISCALE, NSCALE, IBITS, ITEMP, NPBTMP2, IBITMAP, NUNUSED
+ DIMENSION IBITMAP(JPNSPEC)
+ INTEGER IRET, IEDITN
+ INTEGER NEXT, NEXTWV, NROW, NCOL, INDEX, ILOCATE
+ INTEGER MISSLAT, LOOP, NUMNEW
+ INTEGER KOLDNUM, KNEWNUM
+ DIMENSION NUMNEW(JPMXLAT)
+ REAL RLATINC, OLDLATS, NEWLATS, ROWINC
+ REAL ONORTH, OSOUTH
+ DIMENSION OLDLATS(JPMXLAT), NEWLATS(JPMXLAT)
+C
+C Externals
+C
+ INTEGER WV2DIDX, NUMVALS, ONEBITS, NUMPTWE
+ EXTERNAL WV2DIDX,NUMVALS, ONEBITS, NUMPTWE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grspace.h"
+C
+C ---------------------------------------------------------------------
+C* Section 1. Initalisation.
+C ---------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WV2DXX2 = 0
+C
+C Initialise the bitmap value lookup function and function
+C which counts the values in the secondary bitmap.
+C
+ IRET = NUMVALS(0,0,0)
+C
+C Check only new-style 2D wave spectra (parameter 251)
+C
+ IF( KNSPEC.GT.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DXX2: Only single-value 2D spectra field allowed',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'WV2XX2: Value given = ',KNSPEC)
+ WV2DXX2 = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C Calculate number of latitudes if grid had been full from
+C North pole to South pole
+C
+ IF( NUMLATS.GT.JPMXLAT ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DXX2: Number of latitudes in input grid = ',NUMLATS)
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DXX2: And is greater than allowed maximum = ',JPMXLAT)
+ WV2DXX2 = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+
+ ONORTH = FLOAT(NIAREA(1))/PPMULT
+ OSOUTH = FLOAT(NIAREA(3))/PPMULT
+
+ RLATINC = FLOAT(NIGRID(2))/PPMULT
+
+ DO LOOP = 1, NUMLATS
+ OLDLATS(LOOP) = 90.0 - (LOOP-1)*RLATINC
+ ENDDO
+C
+C Fill an array with the number of points at each latitude for the
+C input field (this is a reduced latitude/longitude grid)
+C
+ MISSLAT = (90.0 - ONORTH)/RLATINC
+ KOLDNUM = 1 + (90.0 - OSOUTH)/RLATINC
+
+ IF( NIREPR.NE.JPREDLL ) THEN
+ DO LOOP = 1, MISSLAT
+ NPTS(LOOP) = 0
+ ENDDO
+ DO LOOP = 1, (KOLDNUM-MISSLAT)
+ NPTS(LOOP+MISSLAT) = NIWE
+ ENDDO
+ DO LOOP = (KOLDNUM+1), NUMLATS
+ NPTS(LOOP) = 0
+ ENDDO
+ ENDIF
+C
+C ---------------------------------------------------------------------
+C* Section 2. Setup number of points at each latitude for the
+C output latitude/longitude field.
+C ---------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF( (NOREPR.EQ.JPQUASI) .OR. (NOREPR.EQ.JPGAUSSIAN) ) THEN
+C
+C Reduced (quasi-regular) gaussian output
+C
+ KNEWNUM = NOGAUSS*2
+ DO LOOP = 1, KNEWNUM
+ NUMNEW(LOOP) = NOLPTS(LOOP)
+ NEWLATS(LOOP) = ROGAUSS(LOOP)
+ ENDDO
+C
+ ELSE IF( NOREPR.EQ.JPREDLL ) THEN
+C
+C Reduced (quasi-regular) lat/long output
+C
+ KNEWNUM = NOREDLL
+ DO LOOP = 1, KNEWNUM
+ NUMNEW(LOOP) = NOLPTS(LOOP)
+ NEWLATS(LOOP) = ROREDLL(LOOP)
+ ENDDO
+C
+ ELSE
+C
+C Regular output
+C
+ MISSLAT = NINT((90.0 - NORTH)/STEPNS)
+ DO LOOP = 1, MISSLAT
+ NUMNEW(LOOP) = 0
+ ENDDO
+ DO LOOP = 1, NLATS
+ NUMNEW(LOOP+MISSLAT) = NINT(360.0/STEPWE)
+ ENDDO
+C
+ KNEWNUM = MISSLAT + NLATS
+ DO LOOP = 1, KNEWNUM
+ NEWLATS(LOOP) = 90.0 - (LOOP-1)*STEPNS
+ ENDDO
+C
+ ENDIF
+C
+C ---------------------------------------------------------------------
+C* Section 3. Get the input GRIB field characteristics.
+C ---------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C Calculate the indices of the input grid points to be used for
+C the output points
+C
+ OLDWEST = FLOAT(NIAREA(2))/PPMULT
+ OLDEAST = FLOAT(NIAREA(4))/PPMULT
+
+ WV2DXX2 = WV2DIDX(NUMLATS,NPTS,OLDLATS,OLDWEST,OLDEAST,
+ X KNEWNUM, NUMNEW, NEWLATS, NEWIDX)
+ IF( WV2DXX2.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DXX2: Unable to calculate output grid indices',JPQUIET)
+ WV2DXX2 = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C
+C ---------------------------------------------------------------------
+C* Section 4. Work through the output subarea.
+C ---------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+C Fill in the wave spectra values
+C
+ NEXT = 0
+ NEXTWV = 0
+C
+ SOUTH = NOAREA(3)/PPMULT
+ EAST = NOAREA(4)/PPMULT
+ ISTART = 0
+C
+C Work down through latitudes from north to south.
+C
+ DO NROW = 1, KNEWNUM
+C
+C If inside north-south (subarea) boundaries ..
+C
+ IF( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPQUASI) ) THEN
+ PTLAT = ROGAUSS(NROW)
+ ELSE
+ PTLAT = 90.0 - (NROW-1)*STEPNS
+ ENDIF
+C
+ IF( (PTLAT.LE.NORTH).AND.(ABS(PTLAT-SOUTH).GT.-0.0005) ) THEN
+C
+C Calculate number of points between west boundary of area and
+C Greenwich
+C
+ ROWINC = 360.0/NUMNEW(NROW)
+C
+ IWEST = INT(WEST/ROWINC)
+ IF( (WEST.GT.0.0).AND.(WEST.NE.(IWEST*ROWINC)) )
+ X IWEST = IWEST + 1
+ AWEST = IWEST * ROWINC
+ IWOFSET = NUMPTWE(AWEST,0.0,ROWINC)
+ IEOFSET = NUMPTWE(AWEST,EAST,ROWINC)
+C
+C Work through subarea longitudes from west to east.
+C
+ DO NCOL = 1, NUMNEW(NROW)
+ PTLONG = AWEST + (NCOL-1)*ROWINC
+ NEXT = NUMPTWE(AWEST,PTLONG,ROWINC)
+ IF( (NEXT.LE.IEOFSET).AND.(NEXT.GE.0) ) THEN
+C
+C .. and inside west-east (subarea) boundaries
+C
+ NEXT = 1 + NEXT - IWOFSET
+ IF( NEXT.LE.0) NEXT = NEXT + NUMNEW(NROW)
+ NEXT = NEXT + ISTART
+ INDEX = NEWIDX(NEXT)
+
+ NEXTWV = NEXTWV + 1
+
+ IF( OLDWAVE(INDEX).EQ.PMISS.OR.INDEX.EQ.0) THEN
+C
+C Nearest neighbour is a 'missing' point
+C
+ NEWWAVE(NEXTWV) = PMISS
+ ELSE
+ NEWWAVE(NEXTWV) = OLDWAVE(INDEX)
+ ENDIF
+ ENDIF
+ ENDDO
+C
+ ENDIF
+ ISTART = ISTART + NUMNEW(NROW)
+ ENDDO
+C
+C ---------------------------------------------------------------------
+C* Section 9. Closedown.
+C ---------------------------------------------------------------------
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/wv2dxxx.F b/interpolation/wv2dxxx.F
new file mode 100755
index 0000000..cae8486
--- /dev/null
+++ b/interpolation/wv2dxxx.F
@@ -0,0 +1,496 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION WV2DXXX(ISEC2,ISEC4,NLATS,STEPNS,STEPWE,
+ X OLDWAVE,NEWIDX,NEWWAVE,NORTH,WEST,PMISS)
+C
+C---->
+C*****WV2DXXX*
+C
+C PURPOSE
+C -------
+C
+C Interpolates 2D wave spectra fields.
+C
+C
+C INTERFACE
+C ---------
+C
+C IRET = WV2DXXX(ISEC2,ISEC4,NLATS,STEPNS,STEPWE,
+C X OLDWAVE,NEWIDX,NEWWAVE,NORTH,WEST,PMISS)
+C
+C Input arguments
+C ---------------
+C
+C ISEC2 - Unpacked section 2 header from 2D wave spectra field
+C ISEC4 - Unpacked section 4 header from 2D wave spectra field
+C NLATS - Number of points N-S in new grid
+C STEPNS - Output grid north-south resolution (degrees)
+C STEPWE - Output grid west-east resolution (degrees)
+C OLDWAVE - Original wave field
+C NORTH - Output grid northernmost latitude (degrees)
+C WEST - Output grid westernmost longitude (degrees)
+C PMISS - Missing data value
+C
+C Output arguments
+C ----------------
+C
+C NEWIDX - Indices of old grid points used for new grid points
+C NEWWAVE - New wave field
+C
+C Function returns 0 if the interpolation was OK.
+C
+C
+C METHOD
+C ------
+C
+C Builds the index of nearest neighbour points for the output grid.
+C Then works through the output grid points, checking for subarea
+C boundaries and looking up nearset neighbour 2D spectra values
+C (which may be missing data).
+C
+C
+C EXTERNALS
+C ---------
+C
+C WV2DIDX - builds the index of nearest neighbour points
+C NUMPTWE - Calculates number of grid points between west/east
+C area boundaries
+C VALPINA - Looks up bitmap value
+C ONEBITS - Counts number of 1s in a GRIB section 3 bitmap
+C NUMVALS - Counts the values in the secondary bitmap.
+C SOFFSET - Finds the section offsets in GRIB message
+C INTLOG - Log error message
+C
+C
+C REFERENCE
+C ---------
+C
+C None.
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF November 1996
+C
+C
+C Modifications
+C -------------
+C
+C J.D.Chambers ECMWF April 1998
+C Handle parameter 251 as a simple form of wave 2D spectra.
+C (A field containing one direction and one frequency).
+C
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ INTEGER ISEC2, ISEC4, NLATS
+ DIMENSION ISEC2(*), ISEC4(*)
+ REAL STEPNS, STEPWE, OLDWAVE, NEWWAVE, NORTH, WEST, PMISS
+ DIMENSION OLDWAVE(*), NEWWAVE(*)
+ INTEGER NEWIDX
+ DIMENSION NEWIDX(*)
+C
+C Parameters
+C
+ INTEGER JPROUTINE, JPMXLAT, JPNSPEC
+ PARAMETER (JPROUTINE = 40000)
+ PARAMETER (JPMXLAT = 1801)
+ PARAMETER (JPNSPEC = 600)
+C
+C Local arguments
+C
+ LOGICAL LSIMPLE
+ INTEGER IEOFSET, IWOFSET, ISTART, IWEST
+ REAL SOUTH, EAST, PTLAT, PTLONG, AWEST, OLDWEST, OLDEAST
+ REAL REFVAL, SCALE
+ INTEGER NPDATA, INSPT, NEXP, NMANT, NRETA, NRETB, NLENG, NBIT
+ INTEGER NVALS
+ INTEGER ISCALE, NSCALE, IBITS, ITEMP, NPBTMP2, IBITMAP, NUNUSED
+ DIMENSION IBITMAP(JPNSPEC)
+ INTEGER IRET, IS0, IS1, IS2, IS3, IS4, IEDITN
+ INTEGER NEXT, NEXTWV, NROW, NCOL, INDEX, ILOCATE
+ INTEGER NSPEC, MISSLAT, LOOP, NPTS, NUMLATS, NUMNEW
+ INTEGER KOLDNUM, KNEWNUM
+ DIMENSION NPTS(JPMXLAT), NUMNEW(JPMXLAT)
+ REAL RLATINC, OLDLATS, NEWLATS, ROWINC
+ DIMENSION OLDLATS(JPMXLAT), NEWLATS(JPMXLAT)
+C
+C Externals
+C
+ INTEGER WV2DIDX, SOFFSET, VALPINA, NUMVALS, ONEBITS, NUMPTWE
+ EXTERNAL WV2DIDX, SOFFSET, VALPINA, NUMVALS, ONEBITS, NUMPTWE
+C
+#include "parim.h"
+#include "nifld.common"
+#include "nofld.common"
+#include "grspace.h"
+C
+C ---------------------------------------------------------------------
+C* Section 1. Initalisation.
+C ---------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WV2DXXX = 0
+C
+C Initialise the bitmap value lookup function and function
+C which counts the values in the secondary bitmap.
+C
+ IRET = VALPINA(0,0,0)
+ IRET = NUMVALS(0,0,0)
+C
+C Setup number of spectra at each point
+C
+ IF( ISEC4(8).EQ.0 ) THEN
+ LSIMPLE = .TRUE.
+ NSPEC = 1
+ ELSE
+ LSIMPLE = .FALSE.
+ NSPEC = ISEC4(50)*ISEC4(51)
+ ENDIF
+C
+ IF( NSPEC.GT.JPNSPEC) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DXXX: Number of wave spectra at each grid pt = ',NSPEC)
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DXXX: And is greater than allowed maximum = ',JPNSPEC)
+ WV2DXXX = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C Calculate number of latitudes if grid had been full from
+C North pole to South pole
+C
+ NUMLATS = (180000/ISEC2(10)) + 1
+ IF( NUMLATS.GT.JPMXLAT ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DXXX: Number of latitudes in input grid = ',NUMLATS)
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DXXX: And is greater than allowed maximum = ',JPMXLAT)
+ WV2DXXX = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+ RLATINC = FLOAT(ISEC2(10))/1000
+ DO LOOP = 1, NUMLATS
+ OLDLATS(LOOP) = 90.0 - (LOOP-1)*RLATINC
+ ENDDO
+C
+C Fill an array with the number of points at each latitude for the
+C input field (this is a reduced latitude/longitude grid)
+C
+ MISSLAT = (90000 - ISEC2(4))/ISEC2(10)
+ DO LOOP = 1, MISSLAT
+ NPTS(LOOP) = 0
+ ENDDO
+ KOLDNUM = 1 + (90000 - ISEC2(7))/ISEC2(10)
+ DO LOOP = 1, (KOLDNUM-MISSLAT)
+ IF( NIREPR.EQ.JPREDLL ) THEN
+ NPTS(LOOP+MISSLAT) = ISEC2(22+LOOP)
+ ELSE
+ NPTS(LOOP+MISSLAT) = ISEC2(2)
+ ENDIF
+ ENDDO
+ DO LOOP = (KOLDNUM+1), NUMLATS
+ NPTS(LOOP) = 0
+ ENDDO
+C
+C ---------------------------------------------------------------------
+C* Section 2. Setup number of points at each latitude for the
+C output latitude/longitude field.
+C ---------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ IF( (NOREPR.EQ.JPQUASI) .OR. (NOREPR.EQ.JPGAUSSIAN) ) THEN
+C
+C Reduced (quasi-regular) gaussian output
+C
+ KNEWNUM = NOGAUSS*2
+ DO LOOP = 1, KNEWNUM
+ NUMNEW(LOOP) = NOLPTS(LOOP)
+ NEWLATS(LOOP) = ROGAUSS(LOOP)
+ ENDDO
+C
+ ELSE IF( NOREPR.EQ.JPREDLL ) THEN
+C
+C Reduced (quasi-regular) lat/long output
+C
+ KNEWNUM = NOREDLL
+ DO LOOP = 1, KNEWNUM
+ NUMNEW(LOOP) = NOLPTS(LOOP)
+ NEWLATS(LOOP) = ROREDLL(LOOP)
+ ENDDO
+C
+ ELSE
+C
+C Regular output
+C
+ MISSLAT = NINT((90.0 - NORTH)/STEPNS)
+ DO LOOP = 1, MISSLAT
+ NUMNEW(LOOP) = 0
+ ENDDO
+ DO LOOP = 1, NLATS
+ NUMNEW(LOOP+MISSLAT) = NINT(360.0/STEPWE)
+ ENDDO
+C
+ KNEWNUM = MISSLAT + NLATS
+ DO LOOP = 1, KNEWNUM
+ NEWLATS(LOOP) = 90.0 - (LOOP-1)*STEPNS
+ ENDDO
+C
+ ENDIF
+C
+C ---------------------------------------------------------------------
+C* Section 3. Get the input GRIB field characteristics.
+C ---------------------------------------------------------------------
+C
+ 300 CONTINUE
+C
+C Calculate the indices of the input grid points to be used for
+C the output points
+C
+ OLDWEST = FLOAT(ISEC2(5))/1000
+ OLDEAST = FLOAT(ISEC2(8))/1000
+ WV2DXXX = WV2DIDX(NUMLATS,NPTS,OLDLATS,OLDWEST,OLDEAST,
+ X KNEWNUM, NUMNEW, NEWLATS, NEWIDX)
+ IF( WV2DXXX.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DXXX: Unable to calculate output grid indices',JPQUIET)
+ WV2DXXX = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C Find section offsets for the GRIB product
+C
+ IRET = SOFFSET(OLDWAVE, IS0, IS1, IS2, IS3, IS4, IEDITN)
+ IF( IRET.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DXXX: Problem finding section offsets for GRIB',JPQUIET)
+ WV2DXXX = JPROUTINE + 4
+ GOTO 900
+ ENDIF
+C
+C Get the overall length of OLDWAVE
+C
+#ifdef INTEGER_8
+ NBIT = 64
+#else
+ NBIT = 32
+#endif
+ INSPT = (IS0 + 4) * 8
+ CALL INXBIT(OLDWAVE,10,INSPT,NLENG,1,NBIT,24,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DXXX: Problem extracting overall length of GRIB',JPQUIET)
+ WV2DXXX = JPROUTINE + 5
+ GOTO 900
+ ENDIF
+C
+C Get the scale factor
+C
+ INSPT = (IS4 + 4) * 8
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,NSCALE,1,NBIT,16,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DXXX: Problem extracting scale factor in GRIB',JPQUIET)
+ WV2DXXX = JPROUTINE + 6
+ GOTO 900
+ ENDIF
+ CALL DSGNBT(ISCALE,NSCALE,16,NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DXXX: Problem setting sign of scale factor',JPQUIET)
+ WV2DXXX = JPROUTINE + 7
+ GOTO 900
+ ENDIF
+ SCALE = 2.0**(FLOAT(ISCALE))
+C
+C Get the reference value
+C
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,NEXP,1,NBIT,8,'D',NRETA)
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,NMANT,1,NBIT,24,'D',NRETB)
+ IF( (NRETA.NE.0) .OR. (NRETB.NE.0) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DXXX: Problem getting reference value from GRIB',JPQUIET)
+ WV2DXXX = JPROUTINE + 8
+ GOTO 900
+ ENDIF
+ CALL DECFP2(REFVAL,NEXP,NMANT)
+C
+C Get number of bits per packed value
+C
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,IBITS,1,NBIT,8,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DXXX: Problem getting number of bits per word',JPQUIET)
+ WV2DXXX = JPROUTINE + 9
+ GOTO 900
+ ENDIF
+C
+C (Pointer INSPT is currently at octet 12 in GRIB section 4)
+C
+C Set up pointers to start of secondary bitmap and start of packed
+C data values
+C
+#ifdef INTEGER_8
+ NBIT = 64
+#else
+ NBIT = 32
+#endif
+ NPBTMP2 = (IS4 + 24)*8 + (ISEC4(53)+ISEC4(55))*32
+C
+ IF( .NOT. LSIMPLE ) THEN
+ NPDATA = NPBTMP2 + NSPEC*ONEBITS(OLDWAVE,IS3)
+ ELSE
+ NPDATA = NPBTMP2
+ ENDIF
+ NPDATA = ((NPDATA + 7)/8)*8
+C
+C ---------------------------------------------------------------------
+C* Section 4. Work through the output subarea.
+C ---------------------------------------------------------------------
+C
+ 400 CONTINUE
+C
+C Fill in the wave spectra values
+C
+ NEXT = 0
+ NEXTWV = 0
+C
+ SOUTH = NOAREA(3)/PPMULT
+ EAST = NOAREA(4)/PPMULT
+ ISTART = 0
+C
+C Work down through latitudes from north to south.
+C
+ DO NROW = 1, KNEWNUM
+C
+C If inside north-south (subarea) boundaries ..
+C
+ IF( (NOREPR.EQ.JPGAUSSIAN).OR.(NOREPR.EQ.JPQUASI) ) THEN
+ PTLAT = ROGAUSS(NROW)
+ ELSE
+ PTLAT = 90.0 - (NROW-1)*STEPNS
+ ENDIF
+C
+ IF( (PTLAT.LE.NORTH).AND.(ABS(PTLAT-SOUTH).GT.-0.0005) ) THEN
+C
+C Calculate number of points between west boundary of area and
+C Greenwich
+C
+ ROWINC = 360.0/NUMNEW(NROW)
+C
+ IWEST = INT(WEST/ROWINC)
+ IF( (WEST.GT.0.0).AND.(WEST.NE.(IWEST*ROWINC)) )
+ X IWEST = IWEST + 1
+ AWEST = IWEST * ROWINC
+ IWOFSET = NUMPTWE(AWEST,0.0,ROWINC)
+ IEOFSET = NUMPTWE(AWEST,EAST,ROWINC)
+C
+C Work through subarea longitudes from west to east.
+C
+ DO NCOL = 1, NUMNEW(NROW)
+ PTLONG = AWEST + (NCOL-1)*ROWINC
+ NEXT = NUMPTWE(AWEST,PTLONG,ROWINC)
+ IF( (NEXT.LE.IEOFSET).AND.(NEXT.GE.0) ) THEN
+C
+C .. and inside west-east (subarea) boundaries
+C
+ NEXT = 1 + NEXT - IWOFSET
+ IF( NEXT.LE.0) NEXT = NEXT + NUMNEW(NROW)
+ NEXT = NEXT + ISTART
+ INDEX = NEWIDX(NEXT)
+ ILOCATE = VALPINA(OLDWAVE, IS3+6, INDEX)
+C
+ IF( ILOCATE.EQ.0 ) THEN
+C
+C Nearest neighbour is a 'missing' point
+C
+ DO LOOP = 1, NSPEC
+ NEXTWV = NEXTWV + 1
+ NEWWAVE(NEXTWV) = PMISS
+ ENDDO
+C
+ ELSE
+C
+C Nearest neighbour has values
+C
+ IF( LSIMPLE ) THEN
+ INSPT = NPDATA + (ILOCATE - 1)*IBITS
+ NVALS = 1
+ IBITMAP(1) = 1
+ ELSE
+C
+C Count the number of values in the secondary bitmap upto
+C the current point and pick up its secondary bitmap.
+C
+ INSPT = NPBTMP2 + (ILOCATE - 1)*NSPEC
+ NVALS = NUMVALS(OLDWAVE,NPBTMP2,INSPT)
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,IBITMAP,NSPEC,
+ X NBIT,1,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DXXX: Problem getting neighbours 2ndary bitmap',
+ X JPQUIET)
+ WV2DXXX = JPROUTINE + 10
+ GOTO 900
+ ENDIF
+C
+C Pick up the values at the current point
+C
+ INSPT = NPDATA + NVALS*IBITS
+ ENDIF
+C
+ DO LOOP = 1, NSPEC
+ NEXTWV = NEXTWV + 1
+ IF( IBITMAP(LOOP).EQ.0 ) THEN
+C
+C ..missing
+C
+ NEWWAVE(NEXTWV) = PMISS
+C
+ ELSE
+C
+C ..retrieve and recreate the packed value
+C
+ CALL INXBIT(OLDWAVE,NLENG,INSPT,ITEMP,1,
+ X NBIT,IBITS,'D',NRETA)
+ IF( NRETA.NE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WV2DXXX: Problem getting nearest neighbour',
+ X JPQUIET)
+ WV2DXXX = JPROUTINE + 11
+ GOTO 900
+ ENDIF
+ NEWWAVE(NEXTWV) = REFVAL + FLOAT(ITEMP)*SCALE
+ ENDIF
+ ENDDO
+C
+ ENDIF
+ ENDIF
+ ENDDO
+C
+ ENDIF
+ ISTART = ISTART + NUMNEW(NROW)
+ ENDDO
+C
+C ---------------------------------------------------------------------
+C* Section 9. Closedown.
+C ---------------------------------------------------------------------
+C
+ 900 CONTINUE
+ RETURN
+ END
diff --git a/interpolation/wvqlidx.F b/interpolation/wvqlidx.F
new file mode 100755
index 0000000..d22e167
--- /dev/null
+++ b/interpolation/wvqlidx.F
@@ -0,0 +1,371 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION WVQLIDX(KOLDNUM,NUMOLD,OLDLATS,OLDWEST,OLDEAST,
+ X KNEWNUM, NUMNEW, NEWLATS,
+ X NEWIDX, DISTNEW)
+C
+C---->
+C*****WVQLIDX*
+C
+C PURPOSE
+C -------
+C
+C Determines which nearest-neighbour values of an input global wave
+C 2D-spectra grid field to use for an output global wave 2D-spectra
+C grid field.
+C
+C
+C INTERFACE
+C ---------
+C
+C IRET = WVQLIDX(KOLDNUM,NUMOLD,OLDLATS,OLDWEST,OLDEAST,
+C X KNEWNUM, NUMNEW, NEWLATS,
+C X NEWIDX, DISTNEW)
+C
+C Input arguments
+C ---------------
+C
+C KOLDNUM - No. of meridians from North to South pole (input field)
+C NUMOLD - Array giving number of points along each latitude
+C (empty latitudes have entry 0)
+C OLDLATS - input field latitudes
+C OLDWEST - western longitude of the input field (degrees)
+C OLDEAST - eastern longitude of the input field (degrees)
+C
+C KNEWNUM - No. of meridians from North to South pole (output field)
+C NUMNEW - Array giving number of points along each latitude
+C (empty latitudes have entry 0)
+C NEWLATS - output field latitudes
+C
+C Output arguments
+C ----------------
+C
+C NEWIDX - Indices of four neighbours
+C DISTNEW - Distances of current 'box' edges from new point
+C
+C Function returns 0 if the interpolation was OK.
+C
+C
+C METHOD
+C ------
+C
+C The indices of the nearest four neighbouring grid points of the
+C input field is assigned to each point of the output grid.
+C The indices are zero if the output grid point is 'missing'.
+C
+C The input field can be regular or quasi-regular, and can be
+C global or a subarea.
+C The output field can be regular or quasi-regular.
+C
+C
+C EXTERNALS
+C ---------
+C
+C INTLOG - Log error message.
+C
+C
+C REFERENCE
+C ---------
+C
+C None
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF January 1998
+C
+C
+C----<
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 19410 )
+ INTEGER JPLLMAX
+ PARAMETER ( JPLLMAX = 1801 )
+C `--> allow upto 0.1 degree resolution
+ INTEGER JPNMOUT
+ PARAMETER ( JPNMOUT = 1800 )
+C `--> allow upto 0.1 degree resolution
+C
+ INTEGER JPNW, JPNE, JPSW, JPSE, JPN, JPS
+ INTEGER JPDISNW, JPDISNE, JPDISSW, JPDISSE
+ PARAMETER (JPNW = 1)
+ PARAMETER (JPNE = 2)
+ PARAMETER (JPSW = 3)
+ PARAMETER (JPSE = 4)
+ PARAMETER (JPN = 5)
+ PARAMETER (JPS = 6)
+ PARAMETER (JPDISNW = 7)
+ PARAMETER (JPDISNE = 8)
+ PARAMETER (JPDISSW = 9)
+ PARAMETER (JPDISSE = 10)
+C
+C Function arguments
+C
+ INTEGER KOLDNUM, NUMOLD, KNEWNUM, NUMNEW
+ DIMENSION NUMOLD(*), NUMNEW(*)
+ REAL OLDWEST, OLDEAST, OLDLATS, NEWLATS
+ DIMENSION OLDLATS(*), NEWLATS(*)
+ INTEGER NEWIDX
+ DIMENSION NEWIDX(4,*)
+ REAL*4 DISTNEW
+ DIMENSION DISTNEW(10,*)
+C
+C Local arguments
+C
+ INTEGER K, NEWCOL, NEWROW, INCOL, LOOP, NEXT, NUMMAX
+ INTEGER I_NW, I_SW, I_N, I_S, I_NE, I_SE
+ REAL*8 DELONGN, DELONGS, DIFF, RESOL, DINC, DEPS
+ REAL*8 DIST_NW, DIST_SW, DIST_NE, DIST_SE, DIST_N, DIST_S
+ REAL*8 DISNW, DISNE, DISSW, DISSE
+ REAL*8 ZXIN, ZXIS, LON, LAT, OWEST, OEAST
+ DIMENSION LON(JPNMOUT*2)
+ LOGICAL LINGNS, LINGWE
+ INTEGER INDEXI
+ DIMENSION INDEXI(JPLLMAX)
+ LOGICAL LGLOBAL
+ DATA DEPS/0.00005/
+C
+C ---------------------------------------------------------------------
+C* Section 1. Initalisation.
+C ---------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ WVQLIDX = 0
+ CALL INTLOG(JP_DEBUG,
+ X 'WVQLIDX: Wave interpolation requested.',JPQUIET)
+C
+C Check latitude/longitude grid specification
+C
+ IF( KOLDNUM.GT.JPLLMAX ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WVQLIDX: Number of latitudes in input grid = ',KOLDNUM)
+ CALL INTLOG(JP_ERROR,
+ X 'WVQLIDX: And is greater than allowed maximum = ',JPLLMAX)
+ WVQLIDX = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C Set up INDEXI for latitude lines in input lat/lon array
+C
+ INDEXI(1) = 0
+ DO LOOP = 2, KOLDNUM
+ INDEXI(LOOP) = INDEXI(LOOP-1) + NUMOLD(LOOP-1)
+ ENDDO
+C
+ OEAST = OLDEAST
+ OWEST = OLDWEST
+C
+C Check whether the input field is global or a subarea
+C
+ NUMMAX = NUMOLD(1)
+ DO LOOP = 2, KOLDNUM
+ IF( NUMOLD(LOOP).GT.NUMMAX ) NUMMAX = NUMOLD(LOOP)
+ ENDDO
+ IF( NUMMAX.LE.0 ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WVQLIDX: Input wave field has no points',JPQUIET)
+ WVQLIDX = JPROUTINE + 2
+ GOTO 900
+ ENDIF
+C
+ LGLOBAL = ABS((OEAST-OWEST) - DBLE(360.0)).LT.DEPS
+C
+C ---------------------------------------------------------------------
+C* Section 2. Interpolation.
+C ---------------------------------------------------------------------
+C
+ 200 CONTINUE
+C
+ NEXT = 1
+C
+ DO 220 NEWROW = 1, KNEWNUM
+C
+C Find old latitude rows to north and south of new latitude and
+C set up the distance between new row and the old rows to N and S.
+C
+ DO LOOP = 1, KOLDNUM -1
+ IF( (NEWLATS(NEWROW).LE.OLDLATS(LOOP)) .AND.
+ X (NEWLATS(NEWROW).GT.OLDLATS(LOOP+1)) ) THEN
+ I_N = LOOP
+ I_S = MIN(LOOP+1,KOLDNUM)
+ GOTO 205
+ ENDIF
+ ENDDO
+C
+ IF( NEWLATS(NEWROW).EQ.OLDLATS(KOLDNUM) ) THEN
+ I_N = KOLDNUM
+ I_S = KOLDNUM
+ ELSE
+ I_N = -1
+ I_S = -1
+ ENDIF
+C
+ 205 CONTINUE
+ IF( I_N.NE.I_S) THEN
+ DIFF = OLDLATS(I_N) - OLDLATS(I_S)
+ DIST_N = (OLDLATS(I_N) - NEWLATS(NEWROW)) / DIFF
+ ELSE
+ DIST_N = 1.0
+ ENDIF
+ DIST_S = 1.0 - DIST_N
+C
+C Check if the new interpolated row lies between 2 old rows which
+C have data points
+C
+ LINGNS = .FALSE.
+ IF( I_N.GT.0 ) THEN
+ IF( (NUMOLD(I_N).GT.0).AND.(NUMOLD(I_S).GT.0) ) THEN
+C
+C Yes, so set up the grid increments.
+C
+C Note that the grid increments are different depending on
+C whether or not the grid is global; global grids have an
+C extra interval at the end (eg between 358.5 and 0.0), while
+C subareas have outer limits defined by 'west' and 'east' and
+C a given number of points in between.
+C
+ IF( LGLOBAL ) THEN
+ DELONGN = 360.0/DBLE(NUMOLD(I_N))
+ DELONGS = 360.0/DBLE(NUMOLD(I_S))
+ ELSE
+ DELONGN = (OEAST-OWEST)/DBLE(NUMOLD(I_N)-1)
+ DELONGS = (OEAST-OWEST)/DBLE(NUMOLD(I_S)-1)
+ ENDIF
+ LINGNS = .TRUE.
+ ENDIF
+ ENDIF
+C
+C Setup longitudes for the current row
+C
+ INCOL = NUMNEW(NEWROW)
+ IF( INCOL.NE.0 ) THEN
+ IF( LGLOBAL ) THEN
+ RESOL = 360.0/DBLE(INCOL)
+ ELSE
+ RESOL = (OEAST-OWEST)/(DBLE(INCOL)-1)
+ ENDIF
+ DO LOOP = 1, INCOL
+ LON(LOOP) = OLDWEST + DBLE(LOOP-1)*RESOL
+ ENDDO
+C
+ DO 210 NEWCOL = 1, INCOL
+C
+ LINGWE = (LON(NEWCOL).GT.OWEST).OR.(LON(NEWCOL).LT.OEAST)
+C
+ IF( LINGNS .AND. LINGWE ) THEN
+C
+C If point to be interpolated is inside the input field ,
+C work out distances from new point to four neighbours
+C
+ ZXIN = DMOD((LON(NEWCOL)+(DBLE(360.0)-OWEST)+DBLE(720.0)),
+ X DBLE(360.0))
+ ZXIS = ZXIN
+ ZXIN = ZXIN/DELONGN + 1.0
+ ZXIS = ZXIS/DELONGS + 1.0
+ I_NW = INT(ZXIN)
+ I_NE = I_NW + 1
+ I_SW = INT(ZXIS)
+ I_SE = I_SW + 1
+C
+C Allow wrap-around
+C
+ I_NW = MOD(I_NW,NUMOLD(I_N))
+ I_NE = MOD(I_NE,NUMOLD(I_N))
+ I_SW = MOD(I_SW,NUMOLD(I_S))
+ I_SE = MOD(I_SE,NUMOLD(I_S))
+ IF( I_NW.EQ.0 ) I_NW = NUMOLD(I_N)
+ IF( I_SW.EQ.0 ) I_SW = NUMOLD(I_S)
+ IF( I_NE.EQ.0 ) I_NE = NUMOLD(I_N)
+ IF( I_SE.EQ.0 ) I_SE = NUMOLD(I_S)
+C
+C Calculate distance from interpolated point to neighbours
+C
+ DIST_NW = ZXIN - REAL(I_NW)
+ DIST_NE = 1.0 - DIST_NW
+ DIST_SW = ZXIS - REAL(I_SW)
+ DIST_SE = 1.0 - DIST_SW
+C
+ DISTNEW(JPDISNW,NEXT) = (DIST_NW*DIST_NW + DIST_N*DIST_N)
+ DISTNEW(JPDISNE,NEXT) = (DIST_NE*DIST_NE + DIST_N*DIST_N)
+ DISTNEW(JPDISSW,NEXT) = (DIST_SW*DIST_SW + DIST_S*DIST_S)
+ DISTNEW(JPDISSE,NEXT) = (DIST_SE*DIST_SE + DIST_S*DIST_S)
+C
+ DISTNEW(JPNW,NEXT) = DIST_NW
+ DISTNEW(JPNE,NEXT) = DIST_NE
+ DISTNEW(JPSW,NEXT) = DIST_SW
+ DISTNEW(JPSE,NEXT) = DIST_SE
+ DISTNEW(JPN ,NEXT) = DIST_N
+ DISTNEW(JPS ,NEXT) = DIST_S
+C
+ NEWIDX(JPNW,NEXT) = INDEXI(I_N)+I_NW
+ NEWIDX(JPNE,NEXT) = INDEXI(I_N)+I_NE
+ NEWIDX(JPSW,NEXT) = INDEXI(I_S)+I_SW
+ NEWIDX(JPSE,NEXT) = INDEXI(I_S)+I_SE
+C
+C If the point to be interpolated is outside the input field,
+C set it to 'land'.
+C
+ ELSE
+cs print*,'IDX LINGWE ',LINGWE
+cs print*,'IDX ',LON(NEWCOL),OWEST
+cs print*,'IDX ',LON(NEWCOL),OEAST
+cs print*,'IDX LINGNS ',LINGNS
+cs print*,'IDX ',NUMOLD(I_N),NUMOLD(I_S)
+C
+ DISTNEW(JPNW,NEXT) = 0
+ DISTNEW(JPNE,NEXT) = 0
+ DISTNEW(JPSW,NEXT) = 0
+ DISTNEW(JPSE,NEXT) = 0
+ DISTNEW(JPN ,NEXT) = 0
+ DISTNEW(JPS ,NEXT) = 0
+C
+ DISTNEW(JPDISNW,NEXT) = 0
+ DISTNEW(JPDISNE,NEXT) = 0
+ DISTNEW(JPDISSW,NEXT) = 0
+ DISTNEW(JPDISSE,NEXT) = 0
+C
+ NEWIDX(JPNW,NEXT) = 0
+ NEWIDX(JPNE,NEXT) = 0
+ NEWIDX(JPSW,NEXT) = 0
+ NEWIDX(JPSE,NEXT) = 0
+C
+ ENDIF
+C
+ NEXT = NEXT + 1
+C
+ 210 CONTINUE
+C
+ ENDIF
+C
+ 220 CONTINUE
+C
+C ---------------------------------------------------------------------
+C* Section 9. Closedown.
+C ---------------------------------------------------------------------
+C
+ 900 CONTINUE
+C
+ IF( WVQLIDX.EQ.0 ) THEN
+ CALL INTLOG(JP_DEBUG, 'WVQLIDX: successful.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_ERROR, 'WVQLIDX: failed.',JPQUIET)
+ ENDIF
+C
+ RETURN
+ END
diff --git a/interpolation/wvqlin2.F b/interpolation/wvqlin2.F
new file mode 100755
index 0000000..114366d
--- /dev/null
+++ b/interpolation/wvqlin2.F
@@ -0,0 +1,484 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION WVQLIN2(KNUM,NUMPTS,KE_W,KN_S,RESON,OLDWAVE,
+ X NEWWAVE,NORTH,WEST,KPARAM,PMISS)
+C
+C---->
+C*****WVQLIN2*
+C
+C PURPOSE
+C -------
+C
+C To interpolate a wave field quasi-regular latitude
+C longitude grid to a regular latitude/longitude grid.
+C
+C
+C INTERFACE
+C ---------
+C
+C IRET = WVQLIN2(KNUM,NUMPTS,KE_W,KN_S,RESON,OLDWAVE,
+C X NEWWAVE,NORTH,WEST,KPARAM,PMISS)
+C
+C Input arguments
+C ---------------
+C
+C KNUM - No. of meridians from North to South pole (input field)
+C NUMPTS - Array giving number of points along each latitude
+C (empty latitudes have entry 0)
+C KE_W - First dimension of new array
+C = Number of points E-W in new grid
+C KN_S - Second dimension of new array
+C = Number of points N-S in new grid
+C RESON - Output grid resolution (degrees)
+C OLDWAVE - Original wave field
+C NORTH - Input and output grid northernmost latitude (degree)
+C WEST - Input and output grid westernmost longitude (degree)
+C KPARAM - Field parameter code
+C PMISS - Missing value indicator
+C RNS - Difference in degrees in NS disrection
+C
+C Output arguments
+C ----------------
+
+C NEWWAVE - New wave field
+C
+C Function returns 0 if the interpolation was OK.
+C
+C
+C METHOD
+C ------
+C
+C A bi-linear interpolation is only done if all four neighbouring
+C points are sea.
+C The nearest neighbouring grid point value is taken if one of the
+C neighbouring points is missing.
+C The interpolated point value is set to the 'missing' indicator
+C value if the point is outside the input grid.
+C
+C A field representing a 'direction' is resolved into components
+C each of which is interpolated separately.
+C
+C The output area is the same as the input area.
+C
+C
+C EXTERNALS
+C ---------
+C
+C WVQLID2 - Calculate the indices of neighbouring points
+C INTLOG - Log error message.
+C
+C
+C REFERENCE
+C ---------
+C
+C Based on:
+C SUBROUTINE INTERPOLATE
+C Peter Janssen ECMWF September 1995
+C and:
+C SUBROUTINE EXPOINT
+C Heinz Gunther ECMWF December 1989
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF September 1996
+C
+C J.D.Chambers ECMWF September 1998
+C Modified to handle subarea input/output.
+C The output area is the same as the input area.
+C
+C J.D.Chambers ECMWF November 2000
+C Modified to input grid resolution to be different from the
+C output grid resolution.
+C
+C----<
+C
+C -----------------------------------------------------------------|
+C* Section 0. Arguments and variable
+C -----------------------------------------------------------------|
+C
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 19400 )
+ INTEGER JPLLMAX
+ PARAMETER ( JPLLMAX = 1801 )
+C `--> allow upto 0.1 degree resolution
+ INTEGER JPNMOUT
+ PARAMETER ( JPNMOUT = 1800 )
+C `--> allow upto 0.1 degree resolution
+C
+ INTEGER JPNW, JPNE, JPSW, JPSE, JPN, JPS
+ INTEGER JPDISNW, JPDISNE, JPDISSW, JPDISSE
+ PARAMETER (JPNW = 1)
+ PARAMETER (JPNE = 2)
+ PARAMETER (JPSW = 3)
+ PARAMETER (JPSE = 4)
+ PARAMETER (JPN = 5)
+ PARAMETER (JPS = 6)
+ PARAMETER (JPDISNW = 7)
+ PARAMETER (JPDISNE = 8)
+ PARAMETER (JPDISSW = 9)
+ PARAMETER (JPDISSE = 10)
+C
+C Subroutine arguments
+C
+ INTEGER KNUM, NUMPTS, KE_W, KN_S, KPARAM
+ DIMENSION NUMPTS(*)
+ REAL RESON, NORTH, WEST, PMISS
+ REAL RNS
+ REAL OLDWAVE, NEWWAVE
+ DIMENSION OLDWAVE(*), NEWWAVE(*)
+C
+C Local arguments
+C
+ INTEGER NLAT, K, I, NEWROW, NEWCOL, I1N, I1S, I_N, I_S, I2N, I2S
+ REAL*4 DELONGN, DELONGS, DELAT, DI1N, DI1S, DI2N, DI2S
+ REAL*4 DIST_N, DIST_S
+ REAL*4 DISNW, DISNE, DISSW, DISSE
+ REAL*4 U1, U2, ZXIN, ZXIS
+ REAL LON, LAT
+ DIMENSION LON(JPNMOUT*2),LAT(JPNMOUT+1)
+ LOGICAL INGRID, LDIREC
+ INTEGER NW_PT, NE_PT, SW_PT, SE_PT
+ REAL*4 NWVALUE, NEVALUE, SWVALUE, SEVALUE
+ REAL*4 RAD
+ DATA RAD/0.017453293/
+ REAL*4 CNW_PT, CNE_PT, CSW_PT, CSE_PT
+ REAL*4 SNW_PT, SNE_PT, SSW_PT, SSE_PT
+ REAL*4 C1, C2, S1, S2, CC, SS
+C
+ REAL OLDLATS(JPLLMAX), OLDEAST
+ REAL OLDNS
+ INTEGER ISTART, IEND
+ INTEGER LOCATE
+ INTEGER NEXT, NUMNEW(JPLLMAX)
+ INTEGER IRET, WVQLID2
+ EXTERNAL WVQLID2
+ INTEGER XKNUM,XKE_W,XKN_S
+ DATA XKNUM/-1/,XKE_W/-1/,XKN_S/-1/
+ REAL XRESON,XNORTH,XWEST
+ DATA XRESON/-999.0/,XNORTH/-999.0/,XWEST/-999.0/
+ INTEGER IFIRST, NEWIDX(4,1440*721)
+ DATA IFIRST/0/
+ REAL*4 DISTNEW(10,1440*721)
+C
+ INTEGER IOS
+ INTEGER OLDKNUM
+ DATA OLDKNUM/0/
+ INTEGER INDEX(JPLLMAX)
+ REAL DEPS
+ DATA DEPS/0.00005/
+C Inline function - tests TRUE if A is a missing value
+C EPS Tolerance on missing data flag
+ REAL EPS
+ DATA EPS/0.1/
+ LOGICAL LSW,LSE,LNE,LNW,LTEMP
+C
+ SAVE IFIRST,XKNUM,XKE_W,XKN_S,XRESON,XNORTH,XWEST,NEWIDX,DISTNEW
+
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initalisation.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ WVQLIN2 = 0
+ CALL INTLOG(JP_DEBUG,
+ X 'WVQLIN2: Wave interpolation requested.',JPQUIET)
+C
+C Check reduced latitude/longitude grid specification
+C
+ IF( KNUM.GT.JPLLMAX ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WVQLIN2: Number of latitudes in input lat/long grid = ',KNUM)
+ CALL INTLOG(JP_ERROR,
+ X 'WVQLIN2: And is greater than allowed maximum = ',JPLLMAX)
+ WVQLIN2 = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C Ensure working array dimensions are adequate for required output.
+C
+ IF( (KE_W.GT.JPNMOUT*2).OR.(KN_S.GT.JPNMOUT+1) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WVQLIN2: Internal array dimensions are too small',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'WVQLIN2: for given lat/long output field.',JPQUIET)
+ WVQLIN2 = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C Set up index for latitude lines in the input reduced lat/lon array
+C
+ INDEX(1) = 0
+ DO K = 2, KNUM
+ INDEX(K) = INDEX(K-1) + NUMPTS(K-1)
+ ENDDO
+
+ DO K = 1, KN_S
+ LAT(K) = NORTH - FLOAT(K-1)*RESON
+ NUMNEW(K) = KE_W
+ ENDDO
+C
+C Calculate latitudes and longitudes of output grid points.
+C
+ DO I = 1,KE_W
+ LON(I) = FLOAT(I-1)*RESON
+ ENDDO
+C
+C Calculate latitudes for input (old) grid.
+C (Input and output area are same)
+C
+ OLDNS = RNS/REAL(KNUM-1)
+ DO K = 1, KNUM
+ OLDLATS(K) = NORTH - FLOAT(K-1)*OLDNS
+ ENDDO
+C
+C Find first and last latitudes in input grid which are not empty
+C
+ ISTART = 1
+ DO K = 1, KNUM/2
+ IF( NUMPTS(K).EQ.0 ) ISTART = ISTART + 1
+ ENDDO
+C
+ IEND = KNUM
+ DO K = KNUM, (KNUM/2) + 1, -1
+ IF( NUMPTS(K).EQ.0 ) IEND = IEND - 1
+ ENDDO
+C
+C For the regular output grid, calculate its latitudes and fill
+C in the number of points along each latitude.
+C
+C
+C Setup East depending on whether or not there is wrap-around
+C
+ IF( ABS((KE_W*RESON)-360.0).LT.DEPS ) THEN
+ OLDEAST = WEST + KE_W*RESON
+ ELSE
+ OLDEAST = WEST + (KE_W-1)*RESON
+ ENDIF
+C
+C Initialise all points with 'missing data' indicator
+C
+ NEXT = 0
+ DO NEWROW = 1, KN_S
+ DO NEWCOL = 1, KE_W
+ NEXT = NEXT + 1
+ NEWWAVE(NEXT) = PMISS
+ ENDDO
+ ENDDO
+C
+C Wave direction parameters need special handling
+C (MWD, MDWW, MDPS, MDWI)
+C
+ LDIREC = ( (KPARAM.EQ.230) .OR.
+ X (KPARAM.EQ.235) .OR.
+ X (KPARAM.EQ.238) .OR.
+ X (KPARAM.EQ.242) )
+C
+cs print*,KNUM,KE_W,KN_S,RESON,NORTH,WEST,KPARAM,PMISS,RNS
+C -----------------------------------------------------------------|
+C* Section 2. Interpolation.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Only calculate the indices on the first time through
+C
+ IF( (IFIRST.EQ.0 ) .OR.
+ X ( KNUM.NE.XKNUM ) .OR.
+ X ( KE_W.NE.XKE_W ) .OR.
+ X ( KN_S.NE.XKN_S ) .OR.
+ X ( RESON.NE.XRESON ).OR.
+ X ( NORTH.NE.XNORTH ).OR.
+ X ( WEST.NE.XWEST ) ) THEN
+C
+c print*,'DISS KNUM ', KNUM,' WEST ',WEST, 'KN_S ',KN_S
+c print*,'DISS OLDEAST ', OLDEAST
+ IRET = WVQLID2(KNUM,NUMPTS,OLDLATS,WEST,OLDEAST,
+ X KN_S,NUMNEW,LAT,NEWIDX,DISTNEW)
+ IFIRST = 1
+ XKNUM = KNUM
+ XKE_W = KE_W
+ XKN_S = KN_S
+ XRESON = RESON
+ XNORTH = NORTH
+ XWEST = WEST
+ ENDIF
+C
+ DELAT = OLDNS
+ NEXT = 0
+C
+ DO 220 NEWROW = 1, KN_S
+C
+C Set up the distance between new row and the old rows to N and S.
+C
+ NLAT = NINT((NORTH - LAT(NEWROW))/DELAT) + 1
+ I_N = NLAT
+ I_S = MIN(I_N+1,KNUM*2)
+ DIST_N = ((NORTH - DELAT*(I_N-1)) - LAT(NEWROW)) / DELAT
+ DIST_S = 1.0 - DIST_N
+C
+C Check if the new interpolated row lies between 2 old rows which
+C have data points
+C
+
+ IF( (NUMPTS(I_N).GT.0).AND.(NUMPTS(I_S).GT.0) ) THEN
+C
+C Yes, use the calculated indices
+C
+ DO 210 NEWCOL = 1, KE_W
+
+ NEXT = NEXT + 1
+C
+ NW_PT = NEWIDX(JPNW,NEXT)
+ NE_PT = NEWIDX(JPNE,NEXT)
+ SW_PT = NEWIDX(JPSW,NEXT)
+ SE_PT = NEWIDX(JPSE,NEXT)
+ NWVALUE = OLDWAVE(NW_PT)
+ NEVALUE = OLDWAVE(NE_PT)
+ SWVALUE = OLDWAVE(SW_PT)
+ SEVALUE = OLDWAVE(SE_PT)
+C
+C Test if any one of the four neighbouring points is missing.
+C
+ LTEMP = .FALSE.
+ LSE = .FALSE.
+ IF(ABS(SEVALUE-PMISS) .LT. EPS) LSE = .TRUE.
+ LSW = .FALSE.
+ IF(ABS(SWVALUE-PMISS) .LT. EPS) LSW = .TRUE.
+ LNE = .FALSE.
+ IF(ABS(NEVALUE-PMISS) .LT. EPS) LNE = .TRUE.
+ LNW = .FALSE.
+ IF(ABS(NWVALUE-PMISS) .LT. EPS) LNW = .TRUE.
+C
+ IF( (NW_PT.EQ.0 .OR. LNW) .OR.
+ X (NE_PT.EQ.0 .OR. LNE) .OR.
+ X (SW_PT.EQ.0 .OR. LSW) .OR.
+ X (SE_PT.EQ.0 .OR. LSE) ) THEN
+C If so, take nearest grid point value.
+C
+ DISNW = DISTNEW(JPDISNW,NEXT)
+ DISNE = DISTNEW(JPDISNE,NEXT)
+ DISSW = DISTNEW(JPDISSW,NEXT)
+ DISSE = DISTNEW(JPDISSE,NEXT)
+C
+ IF( (DISNW.LE.DISNE).AND.
+ X (DISNW.LE.DISSW).AND.
+ X (DISNW.LE.DISSE) ) THEN
+cs NEWWAVE(NEXT) = NWVALUE
+ LOCATE = NW_PT
+ LTEMP = LNW
+C
+ ELSE IF( (DISNE.LE.DISSW).AND.
+ X (DISNE.LE.DISSE) ) THEN
+cs NEWWAVE(NEXT) = NEVALUE
+ LOCATE = NE_PT
+ LTEMP = LNE
+C
+ ELSE IF( (DISSW.LE.DISSE) ) THEN
+cs NEWWAVE(NEXT) = SWVALUE
+ LOCATE = SW_PT
+ LTEMP = LSW
+C
+ ELSE
+cs NEWWAVE(NEXT) = SEVALUE
+ LOCATE = SE_PT
+ LTEMP = LSE
+C
+ ENDIF
+
+ IF( .NOT.LTEMP.AND.LOCATE.NE.0) THEN
+c IF( LOCATE.NE.0) THEN
+ NEWWAVE(NEXT) = OLDWAVE(LOCATE)
+ ENDIF
+
+C
+ ELSE
+C
+C Use bi-linear interpolation from four
+C neighbouring sea points.
+C
+ DI1N = DISTNEW(JPNW,NEXT)
+ DI2N = DISTNEW(JPNE,NEXT)
+ DI1S = DISTNEW(JPSW,NEXT)
+ DI2S = DISTNEW(JPSE,NEXT)
+ DIST_N = DISTNEW(JPN,NEXT)
+ DIST_S = DISTNEW(JPS,NEXT)
+C
+ NW_PT = OLDWAVE(NW_PT)
+ NE_PT = OLDWAVE(NE_PT)
+ SW_PT = OLDWAVE(SW_PT)
+ SE_PT = OLDWAVE(SE_PT)
+C
+ IF( .NOT. LDIREC ) THEN
+ U1 = NWVALUE*DI2N + NEVALUE*DI1N
+ U2 = SWVALUE*DI2S + SEVALUE*DI1S
+ NEWWAVE(NEXT) = U1*DIST_S + U2*DIST_N
+C
+ ELSE
+C
+C Fields representing a 'direction': resolve into
+C components and interpolate each separately.
+C
+ CNW_PT = COS(NWVALUE*RAD)
+ CNE_PT = COS(NEVALUE*RAD)
+ CSW_PT = COS(SWVALUE*RAD)
+ CSE_PT = COS(SEVALUE*RAD)
+ SNW_PT = SIN(NWVALUE*RAD)
+ SNE_PT = SIN(NEVALUE*RAD)
+ SSW_PT = SIN(SWVALUE*RAD)
+ SSE_PT = SIN(SEVALUE*RAD)
+ C1 = CNW_PT*DI2N + CNE_PT*DI1N
+ C2 = CSW_PT*DI2S + CSE_PT*DI1S
+ CC = C1*DIST_S + C2*DIST_N
+ S1 = SNW_PT*DI2N + SNE_PT*DI1N
+ S2 = SSW_PT*DI2S + SSE_PT*DI1S
+ SS = S1*DIST_S + S2*DIST_N
+ IF( SS.LT.0.0 ) THEN
+ NEWWAVE(NEXT) = ATAN2(SS,CC)/RAD + 360.0
+ ELSE
+ NEWWAVE(NEXT) = ATAN2(SS,CC)/RAD
+ ENDIF
+ ENDIF
+ ENDIF
+ 210 CONTINUE
+ ELSE
+ NEXT = NEXT + KE_W
+ ENDIF
+C
+ 220 CONTINUE
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( WVQLIN2.EQ.0 ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'WVQLIN2: Wave interpolation successful.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'WVQLIN2: Wave interpolation failed.',JPQUIET)
+ ENDIF
+c call abort()
+C
+ RETURN
+ END
diff --git a/interpolation/wvqlint.F b/interpolation/wvqlint.F
new file mode 100755
index 0000000..cba750e
--- /dev/null
+++ b/interpolation/wvqlint.F
@@ -0,0 +1,447 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION WVQLINT(KNUM,NUMPTS,KE_W,KN_S,RESON,OLDWAVE,
+ X NEWWAVE,NORTH,WEST,KPARAM,PMISS,RNS)
+C
+C---->
+C*****WVQLINT*
+C
+C PURPOSE
+C -------
+C
+C To interpolate a wave field quasi-regular latitude
+C longitude grid to a regular latitude/longitude grid.
+C
+C
+C INTERFACE
+C ---------
+C
+C IRET = WVQLINT(KNUM,NUMPTS,KE_W,KN_S,RESON,OLDWAVE,
+C X NEWWAVE,NORTH,WEST,KPARAM,PMISS)
+C
+C Input arguments
+C ---------------
+C
+C KNUM - No. of meridians from North to South pole (input field)
+C NUMPTS - Array giving number of points along each latitude
+C (empty latitudes have entry 0)
+C KE_W - First dimension of new array
+C = Number of points E-W in new grid
+C KN_S - Second dimension of new array
+C = Number of points N-S in new grid
+C RESON - Output grid resolution (degrees)
+C OLDWAVE - Original wave field
+C NORTH - Input and output grid northernmost latitude (degree)
+C WEST - Input and output grid westernmost longitude (degree)
+C KPARAM - Field parameter code
+C PMISS - Missing value indicator
+C RNS - Difference in degrees in NS disrection
+C
+C Output arguments
+C ----------------
+
+C NEWWAVE - New wave field
+C
+C Function returns 0 if the interpolation was OK.
+C
+C
+C METHOD
+C ------
+C
+C A bi-linear interpolation is only done if all four neighbouring
+C points are sea.
+C The nearest neighbouring grid point value is taken if one of the
+C neighbouring points is missing.
+C The interpolated point value is set to the 'missing' indicator
+C value if the point is outside the input grid.
+C
+C A field representing a 'direction' is resolved into components
+C each of which is interpolated separately.
+C
+C The output area is the same as the input area.
+C
+C
+C EXTERNALS
+C ---------
+C
+C WVQLIDX - Calculate the indices of neighbouring points
+C INTLOG - Log error message.
+C
+C
+C REFERENCE
+C ---------
+C
+C Based on:
+C SUBROUTINE INTERPOLATE
+C Peter Janssen ECMWF September 1995
+C and:
+C SUBROUTINE EXPOINT
+C Heinz Gunther ECMWF December 1989
+C
+C
+C Author.
+C -------
+C
+C J.D.Chambers ECMWF September 1996
+C
+C J.D.Chambers ECMWF September 1998
+C Modified to handle subarea input/output.
+C The output area is the same as the input area.
+C
+C J.D.Chambers ECMWF November 2000
+C Modified to input grid resolution to be different from the
+C output grid resolution.
+C
+C----<
+C
+C -----------------------------------------------------------------|
+C* Section 0. Arguments and variable
+C -----------------------------------------------------------------|
+C
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+C
+C Parameters
+C
+ INTEGER JPROUTINE
+ PARAMETER ( JPROUTINE = 19400 )
+ INTEGER JPLLMAX
+ PARAMETER ( JPLLMAX = 1801 )
+C `--> allow upto 0.1 degree resolution
+ INTEGER JPNMOUT
+ PARAMETER ( JPNMOUT = 1800 )
+C `--> allow upto 0.1 degree resolution
+C
+ INTEGER JPNW, JPNE, JPSW, JPSE, JPN, JPS
+ INTEGER JPDISNW, JPDISNE, JPDISSW, JPDISSE
+ PARAMETER (JPNW = 1)
+ PARAMETER (JPNE = 2)
+ PARAMETER (JPSW = 3)
+ PARAMETER (JPSE = 4)
+ PARAMETER (JPN = 5)
+ PARAMETER (JPS = 6)
+ PARAMETER (JPDISNW = 7)
+ PARAMETER (JPDISNE = 8)
+ PARAMETER (JPDISSW = 9)
+ PARAMETER (JPDISSE = 10)
+C
+C Subroutine arguments
+C
+ INTEGER KNUM, NUMPTS, KE_W, KN_S, KPARAM
+ DIMENSION NUMPTS(*)
+ REAL RESON, OLDWAVE, NEWWAVE, NORTH, WEST, PMISS
+ REAL RNS
+ DIMENSION OLDWAVE(*)
+ DIMENSION NEWWAVE(KE_W,KN_S)
+C
+C Local arguments
+C
+ INTEGER NLAT, K, I, NEWROW, NEWCOL, I1N, I1S, I_N, I_S, I2N, I2S
+ REAL*4 DELONGN, DELONGS, DELAT, DI1N, DI1S, DI2N, DI2S
+ REAL*4 DIST_N, DIST_S
+ REAL*4 DISNW, DISNE, DISSW, DISSE
+ REAL*4 U1, U2, ZXIN, ZXIS
+ REAL LON, LAT
+ DIMENSION LON(JPNMOUT*2),LAT(JPNMOUT+1)
+ LOGICAL INGRID, LDIREC
+ INTEGER NW_PT, NE_PT, SW_PT, SE_PT
+ REAL*4 NWVALUE, NEVALUE, SWVALUE, SEVALUE
+ REAL*4 RAD
+ DATA RAD/0.017453293/
+ REAL*4 CNW_PT, CNE_PT, CSW_PT, CSE_PT
+ REAL*4 SNW_PT, SNE_PT, SSW_PT, SSE_PT
+ REAL*4 C1, C2, S1, S2, CC, SS
+C
+ REAL OLDLATS(JPLLMAX), OLDEAST
+ REAL OLDNS
+ INTEGER ISTART, IEND
+ INTEGER NEXT, NUMNEW(JPLLMAX)
+ INTEGER IRET, WVQLIDX
+ EXTERNAL WVQLIDX
+ INTEGER XKNUM,XKE_W,XKN_S
+ DATA XKNUM/-1/,XKE_W/-1/,XKN_S/-1/
+ REAL XRESON,XNORTH,XWEST
+ DATA XRESON/-999.0/,XNORTH/-999.0/,XWEST/-999.0/
+ INTEGER IFIRST, NEWIDX(4,1440*721)
+ DATA IFIRST/0/
+ REAL*4 DISTNEW(10,1440*721)
+C
+ INTEGER OLDKNUM
+ DATA OLDKNUM/0/
+ INTEGER INDEX(JPLLMAX)
+ REAL DEPS
+ DATA DEPS/0.00005/
+C
+ SAVE IFIRST,XKNUM,XKE_W,XKN_S,XRESON,XNORTH,XWEST,NEWIDX,DISTNEW
+C
+C -----------------------------------------------------------------|
+C* Section 1. Initalisation.
+C -----------------------------------------------------------------|
+C
+ 100 CONTINUE
+C
+ WVQLINT = 0
+ CALL INTLOG(JP_DEBUG,
+ X 'WVQLINT: Wave interpolation requested.',JPQUIET)
+C
+C Check reduced latitude/longitude grid specification
+C
+ IF( KNUM.GT.JPLLMAX ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WVQLINT: Number of latitudes in input lat/long grid = ',KNUM)
+ CALL INTLOG(JP_ERROR,
+ X 'WVQLINT: And is greater than allowed maximum = ',JPLLMAX)
+ WVQLINT = JPROUTINE + 1
+ GOTO 900
+ ENDIF
+C
+C Ensure working array dimensions are adequate for required output.
+C
+ IF( (KE_W.GT.JPNMOUT*2).OR.(KN_S.GT.JPNMOUT+1) ) THEN
+ CALL INTLOG(JP_ERROR,
+ X 'WVQLINT: Internal array dimensions are too small',JPQUIET)
+ CALL INTLOG(JP_ERROR,
+ X 'WVQLINT: for given lat/long output field.',JPQUIET)
+ WVQLINT = JPROUTINE + 3
+ GOTO 900
+ ENDIF
+C
+C Set up index for latitude lines in the input reduced lat/lon array
+C
+ INDEX(1) = 0
+ DO K = 2, KNUM
+ INDEX(K) = INDEX(K-1) + NUMPTS(K-1)
+ ENDDO
+
+ DO K = 1, KN_S
+ LAT(K) = NORTH - FLOAT(K-1)*RESON
+ NUMNEW(K) = KE_W
+ ENDDO
+C
+C Calculate latitudes and longitudes of output grid points.
+C
+ DO I = 1,KE_W
+ LON(I) = FLOAT(I-1)*RESON
+ ENDDO
+C
+C Calculate latitudes for input (old) grid.
+C (Input and output area are same)
+C
+ OLDNS = RNS/REAL(KNUM-1)
+ DO K = 1, KNUM
+ OLDLATS(K) = NORTH - FLOAT(K-1)*OLDNS
+ ENDDO
+C
+C Find first and last latitudes in input grid which are not empty
+C
+ ISTART = 1
+ DO K = 1, KNUM/2
+ IF( NUMPTS(K).EQ.0 ) ISTART = ISTART + 1
+ ENDDO
+C
+ IEND = KNUM
+ DO K = KNUM, (KNUM/2) + 1, -1
+ IF( NUMPTS(K).EQ.0 ) IEND = IEND - 1
+ ENDDO
+C
+C For the regular output grid, calculate its latitudes and fill
+C in the number of points along each latitude.
+C
+C
+C Setup East depending on whether or not there is wrap-around
+C
+ IF( ABS((KE_W*RESON)-360.0).LT.DEPS ) THEN
+ OLDEAST = WEST + KE_W*RESON
+ ELSE
+ OLDEAST = WEST + (KE_W-1)*RESON
+ ENDIF
+C
+C Initialise all points with 'missing data' indicator
+C
+ DO NEWROW = 1, KN_S
+ DO NEWCOL = 1, KE_W
+ NEWWAVE(NEWCOL,NEWROW) = PMISS
+ ENDDO
+ ENDDO
+C
+C Wave direction parameters need special handling
+C (MWD, MDWW, MDPS, MDWI)
+C
+ LDIREC = ( (KPARAM.EQ.230) .OR.
+ X (KPARAM.EQ.235) .OR.
+ X (KPARAM.EQ.238) .OR.
+ X (KPARAM.EQ.242) )
+C
+C -----------------------------------------------------------------|
+C* Section 2. Interpolation.
+C -----------------------------------------------------------------|
+C
+ 200 CONTINUE
+C
+C Only calculate the indices on the first time through
+C
+ IF( (IFIRST.EQ.0 ) .OR.
+ X ( KNUM.NE.XKNUM ) .OR.
+ X ( KE_W.NE.XKE_W ) .OR.
+ X ( KN_S.NE.XKN_S ) .OR.
+ X ( RESON.NE.XRESON ).OR.
+ X ( NORTH.NE.XNORTH ).OR.
+ X ( WEST.NE.XWEST ) ) THEN
+C
+ IRET = WVQLIDX(KNUM,NUMPTS,OLDLATS,WEST,OLDEAST,
+ X KN_S,NUMNEW,LAT,NEWIDX,DISTNEW)
+ IFIRST = 1
+ XKNUM = KNUM
+ XKE_W = KE_W
+ XKN_S = KN_S
+ XRESON = RESON
+ XNORTH = NORTH
+ XWEST = WEST
+ ENDIF
+C
+ DELAT = OLDNS
+ NEXT = 0
+C
+ DO 220 NEWROW = 1, KN_S
+C
+C Set up the distance between new row and the old rows to N and S.
+C
+ NLAT = NINT((NORTH - LAT(NEWROW))/DELAT) + 1
+ I_N = NLAT
+ I_S = MIN(I_N+1,KNUM*2)
+ DIST_N = ((NORTH - DELAT*(I_N-1)) - LAT(NEWROW)) / DELAT
+ DIST_S = 1.0 - DIST_N
+C
+C Check if the new interpolated row lies between 2 old rows which
+C have data points
+C
+ IF( (NUMPTS(I_N).GT.0).AND.(NUMPTS(I_S).GT.0) ) THEN
+C
+C Yes, use the calculated indices
+C
+ DO 210 NEWCOL = 1, KE_W
+C
+ NEXT = NEXT + 1
+C
+ NW_PT = NEWIDX(JPNW,NEXT)
+ NE_PT = NEWIDX(JPNE,NEXT)
+ SW_PT = NEWIDX(JPSW,NEXT)
+ SE_PT = NEWIDX(JPSE,NEXT)
+ NWVALUE = OLDWAVE(NW_PT)
+ NEVALUE = OLDWAVE(NE_PT)
+ SWVALUE = OLDWAVE(SW_PT)
+ SEVALUE = OLDWAVE(SE_PT)
+C
+C Test if any one of the four neighbouring points is missing.
+C
+ IF( (NW_PT.EQ.0 .OR. NWVALUE.EQ.PMISS) .OR.
+ X (NE_PT.EQ.0 .OR. NEVALUE.EQ.PMISS) .OR.
+ X (SW_PT.EQ.0 .OR. SWVALUE.EQ.PMISS) .OR.
+ X (SE_PT.EQ.0 .OR. SEVALUE.EQ.PMISS) ) THEN
+C
+C If so, take nearest grid point value.
+C
+ DISNW = DISTNEW(JPDISNW,NEXT)
+ DISNE = DISTNEW(JPDISNE,NEXT)
+ DISSW = DISTNEW(JPDISSW,NEXT)
+ DISSE = DISTNEW(JPDISSE,NEXT)
+C
+ IF( (DISNW.LE.DISNE).AND.
+ X (DISNW.LE.DISSW).AND.
+ X (DISNW.LE.DISSE) ) THEN
+ NEWWAVE(NEWCOL,NEWROW) = NWVALUE
+C
+ ELSE IF( (DISNE.LE.DISSW).AND.
+ X (DISNE.LE.DISSE) ) THEN
+ NEWWAVE(NEWCOL,NEWROW) = NEVALUE
+C
+ ELSE IF( (DISSW.LE.DISSE) ) THEN
+ NEWWAVE(NEWCOL,NEWROW) = SWVALUE
+C
+ ELSE
+ NEWWAVE(NEWCOL,NEWROW) = SEVALUE
+C
+ ENDIF
+C
+ ELSE
+C
+C Use bi-linear interpolation from four
+C neighbouring sea points.
+C
+ DI1N = DISTNEW(JPNW,NEXT)
+ DI2N = DISTNEW(JPNE,NEXT)
+ DI1S = DISTNEW(JPSW,NEXT)
+ DI2S = DISTNEW(JPSE,NEXT)
+ DIST_N = DISTNEW(JPN,NEXT)
+ DIST_S = DISTNEW(JPS,NEXT)
+C
+ NW_PT = OLDWAVE(NW_PT)
+ NE_PT = OLDWAVE(NE_PT)
+ SW_PT = OLDWAVE(SW_PT)
+ SE_PT = OLDWAVE(SE_PT)
+C
+ IF( .NOT. LDIREC ) THEN
+ U1 = NWVALUE*DI2N + NEVALUE*DI1N
+ U2 = SWVALUE*DI2S + SEVALUE*DI1S
+ NEWWAVE(NEWCOL,NEWROW) = U1*DIST_S + U2*DIST_N
+C
+ ELSE
+C
+C Fields representing a 'direction': resolve into
+C components and interpolate each separately.
+C
+ CNW_PT = COS(NWVALUE*RAD)
+ CNE_PT = COS(NEVALUE*RAD)
+ CSW_PT = COS(SWVALUE*RAD)
+ CSE_PT = COS(SEVALUE*RAD)
+ SNW_PT = SIN(NWVALUE*RAD)
+ SNE_PT = SIN(NEVALUE*RAD)
+ SSW_PT = SIN(SWVALUE*RAD)
+ SSE_PT = SIN(SEVALUE*RAD)
+ C1 = CNW_PT*DI2N + CNE_PT*DI1N
+ C2 = CSW_PT*DI2S + CSE_PT*DI1S
+ CC = C1*DIST_S + C2*DIST_N
+ S1 = SNW_PT*DI2N + SNE_PT*DI1N
+ S2 = SSW_PT*DI2S + SSE_PT*DI1S
+ SS = S1*DIST_S + S2*DIST_N
+ IF( SS.LT.0.0 ) THEN
+ NEWWAVE(NEWCOL,NEWROW) = ATAN2(SS,CC)/RAD + 360.0
+ ELSE
+ NEWWAVE(NEWCOL,NEWROW) = ATAN2(SS,CC)/RAD
+ ENDIF
+ ENDIF
+ ENDIF
+ 210 CONTINUE
+ ELSE
+ NEXT = NEXT + KE_W
+ ENDIF
+C
+ 220 CONTINUE
+C
+C -----------------------------------------------------------------|
+C* Section 9. Closedown.
+C -----------------------------------------------------------------|
+C
+ 900 CONTINUE
+C
+ IF( WVQLINT.EQ.0 ) THEN
+ CALL INTLOG(JP_DEBUG,
+ X 'WVQLINT: Wave interpolation successful.',JPQUIET)
+ ELSE
+ CALL INTLOG(JP_DEBUG,
+ X 'WVQLINT: Wave interpolation failed.',JPQUIET)
+ ENDIF
+c call abort()
+C
+ RETURN
+ END
diff --git a/interpolation/xrotate.F b/interpolation/xrotate.F
new file mode 100755
index 0000000..c75395b
--- /dev/null
+++ b/interpolation/xrotate.F
@@ -0,0 +1,84 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE XROTATE(RANGLE,X,Y,Z,RX,RY,RZ,INROW)
+C---->
+C**** XROTATE
+C
+C Purpose
+C -------
+C
+C Rotate an array of (x,y,z) values about the x-axis.
+C
+C
+C Interface
+C ---------
+C
+C CALL XROTATE(RANGLE,X,Y,Z,RX,RY,RZ,INROW)
+C
+C Input
+C -----
+C
+C RANGLE - The angle of rotation (degrees)
+C (X,Y,Z) - Arrays of input (x,y,z) values.
+C INROW - Number of coordinate values.
+C
+C
+C Output
+C ------
+C
+C (RX,RY,RZ) - Arrays of rotated (x,y,z) values.
+C
+C
+C Method
+C ------
+C
+C X remains unchanged.
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ REAL RANGLE,X,Y,Z,RX,RY,RZ
+ DIMENSION X(*),Y(*),Z(*),RX(*),RY(*),RZ(*)
+ INTEGER INROW
+C
+C Local variables
+C
+ REAL FACTOR, ANGLE, SINA, COSA
+ DATA FACTOR/0.017453293/
+ INTEGER LOOP
+C
+ ANGLE = RANGLE * FACTOR
+ SINA = SIN(ANGLE)
+ COSA = COS(ANGLE)
+C
+ DO LOOP = 1, INROW
+ RX(LOOP) = X(LOOP)
+ RY(LOOP) = Y(LOOP)*COSA + Z(LOOP)*SINA
+ RZ(LOOP) = -Y(LOOP)*SINA + Z(LOOP)*COSA
+ ENDDO
+C
+ RETURN
+ END
diff --git a/interpolation/xyz2ll.F b/interpolation/xyz2ll.F
new file mode 100755
index 0000000..58fd008
--- /dev/null
+++ b/interpolation/xyz2ll.F
@@ -0,0 +1,97 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE XYZ2LL(X,Y,Z,RLAT,RLONG,INROW)
+C---->
+C**** XYZ2LL
+C
+C Purpose
+C -------
+C
+C Converts an array of (x,y,z) coordinates to an
+C array of latitude/longitude values.
+C
+C
+C Interface
+C ---------
+C
+C CALL XYZ2LL(X,Y,Z,RLAT,RLONG,INROW)
+C
+C Input
+C -----
+C
+C (X,Y,Z) - Array of coordinates.
+C INROW - Count of coordinates.
+C
+C
+C Output
+C ------
+C
+C RLAT - Array of latitudes.
+C RLONG - Array of corresponding longitudes.
+C
+C
+C Method
+C ------
+C
+C Z axis is the polar axis directed from south to north.
+C X and Y axes are in the equatorial plane and have origin at the
+C centre of the Earth. The X axis passes through (O north, 0 east).
+C Longitude values are in range (0,360).
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ REAL X,Y,Z,RLAT,RLONG
+ DIMENSION X(*),Y(*),Z(*),RLAT(*),RLONG(*)
+ INTEGER INROW
+C
+C Local variables
+C
+ REAL*8 FACTOR
+ DATA FACTOR/57.2957763671875/
+ INTEGER LOOP
+C
+ DO LOOP = 1, INROW
+ RLAT(LOOP) = ASIN(Z(LOOP)) * FACTOR
+ ENDDO
+C
+ DO LOOP = 1, INROW
+ IF( ABS(X(LOOP)).GT.0.0001 ) THEN
+ RLONG(LOOP) = ATAN2(Y(LOOP),X(LOOP)) * FACTOR
+ ELSE IF ( Y(LOOP).GT.0.0 ) THEN
+ RLONG(LOOP) = 90.0
+ ELSE
+ RLONG(LOOP) = -90.0
+ ENDIF
+ ENDDO
+C
+ DO LOOP = 1, INROW
+ IF(RLONG(LOOP).LT.0.0) RLONG(LOOP) = RLONG(LOOP) + 360.0
+ ENDDO
+C
+ RETURN
+ END
+
diff --git a/interpolation/yrotate.F b/interpolation/yrotate.F
new file mode 100755
index 0000000..4d00762
--- /dev/null
+++ b/interpolation/yrotate.F
@@ -0,0 +1,84 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE YROTATE(RANGLE,X,Y,Z,RX,RY,RZ,INROW)
+C---->
+C**** YROTATE
+C
+C Purpose
+C -------
+C
+C Rotate an array of (x,y,z) values about the y-axis.
+C
+C
+C Interface
+C ---------
+C
+C CALL YROTATE(RANGLE,X,Y,Z,RX,RY,RZ,INROW)
+C
+C Input
+C -----
+C
+C RANGLE - The angle of rotation (degrees)
+C (X,Y,Z) - Arrays of input (x,y,z) values.
+C INROW - Number of coordinate values.
+C
+C
+C Output
+C ------
+C
+C (RX,RY,RZ) - Arrays of rotated (x,y,z) values.
+C
+C
+C Method
+C ------
+C
+C Y remains unchanged.
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF
+C
+C----<
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ REAL RANGLE,X,Y,Z,RX,RY,RZ
+ DIMENSION X(*),Y(*),Z(*),RX(*),RY(*),RZ(*)
+ INTEGER INROW
+C
+C Local variables
+C
+ REAL FACTOR, ANGLE, SINA, COSA
+ DATA FACTOR/0.017453293/
+ INTEGER LOOP
+C
+ ANGLE = RANGLE * FACTOR
+ SINA = SIN(ANGLE)
+ COSA = COS(ANGLE)
+C
+ DO LOOP = 1, INROW
+ RY(LOOP) = Y(LOOP)
+ RX(LOOP) = X(LOOP)*COSA + Z(LOOP)*SINA
+ RZ(LOOP) = -X(LOOP)*SINA + Z(LOOP)*COSA
+ ENDDO
+C
+ RETURN
+ END
diff --git a/interpolation/zprec.F b/interpolation/zprec.F
new file mode 100755
index 0000000..49e70bb
--- /dev/null
+++ b/interpolation/zprec.F
@@ -0,0 +1,189 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION ZPREC (POFELD, KOWE, KONS, KPR, KERR)
+C
+C---->
+C**** *ZPREC*
+C
+C PURPOSE
+C _______
+C
+C Perform additional interpolation processes for precipitation
+C fields
+C
+C INTERFACE
+C _________
+C
+C IERR = ZPREC ( POFELD, KOWE, KONS, KPR, KERR)
+C
+C Input parameters
+C ________________
+C
+C POFELD - The output field as previously calculated.
+C
+C KOWE - The number of points in the West-East direction in
+C the output field.
+C
+C KONS - The number of points in the North-South direction
+C in the output field.
+C
+C KPR - The debug print switch.
+C 0 , No debugging output.
+C 1 , Produce debugging output.
+C
+C KERR - The error control flag.
+C -ve, No error message. Return error code.
+C 0 , Hard failure with error message.
+C +ve, Print error message. Return error code.
+C
+C Output parameters
+C ________________
+C
+C POFELD - The output field as modified to allow for
+C precipitation.
+C
+C Return value
+C ____________
+C
+C The error indicator (INTEGER).
+C
+C Error and Warning Return Values
+C _______________________________
+C
+C None
+C
+C Common block usage
+C __________________
+C
+C None
+C
+C EXTERNALS
+C _________
+C
+C INTLOG(R) - Logs messages.
+C CHKPREC - Check if precipitation threshold has been redefined
+C
+C METHOD
+C ______
+C
+C The precipitation at a point is set to zero if the value is less
+C then threshold
+C
+C REFERENCE
+C _________
+C
+C None
+C
+C COMMENTS
+C ________
+C
+C Program contains sections 0 to 3
+C
+C AUTHOR
+C ______
+C
+C S. Curic *ECMWF* Sep 2005
+C
+C MODIFICATIONS
+C _____________
+C
+C None
+C
+C----<
+C _______________________________________________________
+C
+C
+C* Section 0. Definition of variables.
+C _______________________________________________________
+C
+C* Prefix conventions for variable names
+C
+C Logical L (but not LP), global or common.
+C O, dummy argument
+C G, local variable
+C LP, parameter.
+C Character C, global or common.
+C H, dummy argument
+C Y (but not YP), local variable
+C YP, parameter.
+C Integer M and N, global or common.
+C K, dummy argument
+C I, local variable
+C J (but not JP), loop control
+C JP, parameter.
+C REAL A to F and Q to X, global or common.
+C P (but not PP), dummy argument
+C Z, local variable
+C PP, parameter.
+C
+C Implicit statement to force declarations
+C
+ IMPLICIT NONE
+C
+#include "parim.h"
+#include "nifld.common"
+C
+C Dummy arguments
+ INTEGER KOWE, KONS, KPR, KERR
+ REAL POFELD (KOWE, KONS)
+C
+C Local variables
+ INTEGER JOLAT, JOLON
+ INTEGER JPROUTINE
+ PARAMETER (JPROUTINE = 23500)
+C
+C _______________________________________________________
+C
+C* Section 1. Initialisation
+C _______________________________________________________
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'ZPREC: Section 1.',JPQUIET)
+C
+ ZPREC = 0
+C
+ IF (KPR .GE. 1) THEN
+ CALL INTLOG(JP_DEBUG,'ZPREC: No. of output fld lats = ',KONS)
+ CALL INTLOG(JP_DEBUG,'ZPREC: No. of output fld longs = ',KOWE)
+ ENDIF
+C
+C _______________________________________________________
+C
+C* Section 2. eliminate output negative precipitation
+C _______________________________________________________
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'IRPREC: Section 2.',JPQUIET)
+C
+ CALL CHKPREC()
+C
+ DO 360 JOLAT = 1, KONS
+C
+ DO 210 JOLON = 1, KOWE
+C
+ IF (POFELD (JOLON, JOLAT) .LT. ZPRECIP) THEN
+ POFELD (JOLON, JOLAT) = PPZERO
+ ENDIF
+C
+ 210 CONTINUE
+C
+C
+ 360 CONTINUE
+C
+C _______________________________________________________
+C
+C
+C* Section 3. Return to calling routine. Format statements
+C _______________________________________________________
+C
+C
+ IF (KPR.GE.1) CALL INTLOG(JP_DEBUG,'ZPREC: Section 3.',JPQUIET)
+C
+ RETURN
+ END
diff --git a/land_sea_mask/0-INDEX-0 b/land_sea_mask/0-INDEX-0
new file mode 100755
index 0000000..c1586a8
--- /dev/null
+++ b/land_sea_mask/0-INDEX-0
@@ -0,0 +1,30 @@
+0-INDEX-0
+defaults_for_table_001 WMO table parameter interpolation options
+defaults_for_table_128 ECMWF table parameter interpolation options
+lsm_32_lsm0p5deg 32 bit land-sea mask 0.5 degree resolution
+lsm_32_lsm10m01 32 bit land-sea mask 10 minute resolution
+lsm_32_lsmn080 32 bit land-sea mask gaussian N80
+lsm_32_lsmr160* 32 bit land-sea mask gaussian N160
+lsm_64_lsm0p5deg 64 bit land-sea mask 0.5 degree resolution
+lsm_64_lsm10m01 64 bit land-sea mask 10 minute resolution
+lsm_64_lsmn080 64 bit land-sea mask gaussian N80
+lsm_64_lsmr160 64 bit land-sea mask gaussian N160
+parameter_processing_defaults Not currently used (see rddefs.c)
+r160_32_19790930 32 bit land-sea mask for N160 from 19790930
+r160_32_19910917 32 bit land-sea mask for N160 from 19910917
+r160_32_19930804 32 bit land-sea mask for N160 from 19930804
+r160_32_19940302 32 bit land-sea mask for N160 from 19940302
+r160_32_19940823 32 bit land-sea mask for N160 from 19940823
+r160_32_19950404 32 bit land-sea mask for N160 from 19950404
+r160_64_19790930 64 bit land-sea mask for N160 from 19790930
+r160_64_19910917 64 bit land-sea mask for N160 from 19910917
+r160_64_19930804 64 bit land-sea mask for N160 from 19930804
+r160_64_19940302 64 bit land-sea mask for N160 from 19940302
+r160_64_19940823 64 bit land-sea mask for N160 from 19940823
+r160_64_19950404 64 bit land-sea mask for N160 from 19950404
+LSM_GG_0048 land-sea mask reduced gaussian N48
+LSM_GG_0080 land-sea mask reduced gaussian N80
+LSM_GG_0128 land-sea mask reduced gaussian N128
+LSM_GG_0160 land-sea mask reduced gaussian N160
+LSM_GG_0256 land-sea mask reduced gaussian N256
+LSM_GG_0400 land-sea mask reduced gaussian N400
diff --git a/land_sea_mask/LSM_GG_0048 b/land_sea_mask/LSM_GG_0048
new file mode 100755
index 0000000..6c9560e
Binary files /dev/null and b/land_sea_mask/LSM_GG_0048 differ
diff --git a/land_sea_mask/LSM_GG_0080 b/land_sea_mask/LSM_GG_0080
new file mode 100755
index 0000000..4a84fb0
Binary files /dev/null and b/land_sea_mask/LSM_GG_0080 differ
diff --git a/land_sea_mask/LSM_GG_0128 b/land_sea_mask/LSM_GG_0128
new file mode 100755
index 0000000..ae60fcb
Binary files /dev/null and b/land_sea_mask/LSM_GG_0128 differ
diff --git a/land_sea_mask/LSM_GG_0160 b/land_sea_mask/LSM_GG_0160
new file mode 100755
index 0000000..2b773a1
Binary files /dev/null and b/land_sea_mask/LSM_GG_0160 differ
diff --git a/land_sea_mask/LSM_GG_0200 b/land_sea_mask/LSM_GG_0200
new file mode 100755
index 0000000..733bb99
Binary files /dev/null and b/land_sea_mask/LSM_GG_0200 differ
diff --git a/land_sea_mask/LSM_GG_0256 b/land_sea_mask/LSM_GG_0256
new file mode 100755
index 0000000..21db783
Binary files /dev/null and b/land_sea_mask/LSM_GG_0256 differ
diff --git a/land_sea_mask/LSM_GG_0400 b/land_sea_mask/LSM_GG_0400
new file mode 100755
index 0000000..877aa1f
Binary files /dev/null and b/land_sea_mask/LSM_GG_0400 differ
diff --git a/land_sea_mask/LSM_GG_0640 b/land_sea_mask/LSM_GG_0640
new file mode 100755
index 0000000..3b52b69
Binary files /dev/null and b/land_sea_mask/LSM_GG_0640 differ
diff --git a/land_sea_mask/defaults_for_table_001 b/land_sea_mask/defaults_for_table_001
new file mode 100755
index 0000000..fba24df
--- /dev/null
+++ b/land_sea_mask/defaults_for_table_001
@@ -0,0 +1,11 @@
+Param lsm wind prec lsm interp
+----- --- ---- ---- ----------
+002 n n n n # MSL
+033 y y n n # U
+034 y y n n # V
+061 y n y n # TP
+062 y n y n # LSP
+063 y n y n # CP
+064 y n y n # SF
+065 y n y n # WESF
+081 n n n y # LSM
diff --git a/land_sea_mask/defaults_for_table_128 b/land_sea_mask/defaults_for_table_128
new file mode 100755
index 0000000..76dd6d0
--- /dev/null
+++ b/land_sea_mask/defaults_for_table_128
@@ -0,0 +1,14 @@
+Param lsm wind prec lsm interp
+----- --- ---- ---- ----------
+131 y y n n # U
+132 y y n n # V
+142 y n y n # LSP
+143 y n y n # CP
+144 y n y n # SF
+151 n n n n # MSL
+165 y y n n # 10U
+166 y y n n # 10V
+172 n n n y # LSM
+228 y n y n # TTP
+239 y n y n # CSF
+240 y n y n # LSF
diff --git a/land_sea_mask/defaults_for_table_129 b/land_sea_mask/defaults_for_table_129
new file mode 100755
index 0000000..76dd6d0
--- /dev/null
+++ b/land_sea_mask/defaults_for_table_129
@@ -0,0 +1,14 @@
+Param lsm wind prec lsm interp
+----- --- ---- ---- ----------
+131 y y n n # U
+132 y y n n # V
+142 y n y n # LSP
+143 y n y n # CP
+144 y n y n # SF
+151 n n n n # MSL
+165 y y n n # 10U
+166 y y n n # 10V
+172 n n n y # LSM
+228 y n y n # TTP
+239 y n y n # CSF
+240 y n y n # LSF
diff --git a/land_sea_mask/ksm_xx_lsm0p5deg b/land_sea_mask/ksm_xx_lsm0p5deg
new file mode 100755
index 0000000..38e3019
Binary files /dev/null and b/land_sea_mask/ksm_xx_lsm0p5deg differ
diff --git a/land_sea_mask/lsm_xx_lsm0p25deg b/land_sea_mask/lsm_xx_lsm0p25deg
new file mode 100755
index 0000000..432b5fc
Binary files /dev/null and b/land_sea_mask/lsm_xx_lsm0p25deg differ
diff --git a/land_sea_mask/lsm_xx_lsm0p5deg b/land_sea_mask/lsm_xx_lsm0p5deg
new file mode 100755
index 0000000..d846bcf
Binary files /dev/null and b/land_sea_mask/lsm_xx_lsm0p5deg differ
diff --git a/land_sea_mask/lsm_xx_lsm10m01 b/land_sea_mask/lsm_xx_lsm10m01
new file mode 100755
index 0000000..295c080
Binary files /dev/null and b/land_sea_mask/lsm_xx_lsm10m01 differ
diff --git a/land_sea_mask/lsm_xx_lsmn080 b/land_sea_mask/lsm_xx_lsmn080
new file mode 100755
index 0000000..d1eebf3
Binary files /dev/null and b/land_sea_mask/lsm_xx_lsmn080 differ
diff --git a/land_sea_mask/lsm_xx_lsmr160 b/land_sea_mask/lsm_xx_lsmr160
new file mode 100755
index 0000000..116c1a4
Binary files /dev/null and b/land_sea_mask/lsm_xx_lsmr160 differ
diff --git a/land_sea_mask/parameter_processing_defaults b/land_sea_mask/parameter_processing_defaults
new file mode 100755
index 0000000..dffa9c2
--- /dev/null
+++ b/land_sea_mask/parameter_processing_defaults
@@ -0,0 +1,27 @@
+Param lsm wind prec lsm interp
+----- --- ---- ---- ----------
+131 n y n n
+132 n y n n
+140 y n n n
+141 y n n n
+142 n n y n
+143 n n y n
+144 n n y n
+165 n y n n
+166 n y n n
+170 y n n n
+171 y n n n
+172 n n n y
+173 y n n n
+182 y n n n
+183 y n n n
+184 y n n n
+190 y n n n
+191 y n n n
+192 y n n n
+193 y n n n
+199 y n n n
+200 y n n n
+228 n n y n
+239 n n y n
+240 n n y n
diff --git a/land_sea_mask/r160_xx_19790930 b/land_sea_mask/r160_xx_19790930
new file mode 100755
index 0000000..7975a70
Binary files /dev/null and b/land_sea_mask/r160_xx_19790930 differ
diff --git a/land_sea_mask/r160_xx_19910917 b/land_sea_mask/r160_xx_19910917
new file mode 100755
index 0000000..7975a70
Binary files /dev/null and b/land_sea_mask/r160_xx_19910917 differ
diff --git a/land_sea_mask/r160_xx_19930804 b/land_sea_mask/r160_xx_19930804
new file mode 100755
index 0000000..7975a70
Binary files /dev/null and b/land_sea_mask/r160_xx_19930804 differ
diff --git a/land_sea_mask/r160_xx_19940302 b/land_sea_mask/r160_xx_19940302
new file mode 100755
index 0000000..7975a70
Binary files /dev/null and b/land_sea_mask/r160_xx_19940302 differ
diff --git a/land_sea_mask/r160_xx_19940823 b/land_sea_mask/r160_xx_19940823
new file mode 100755
index 0000000..7975a70
Binary files /dev/null and b/land_sea_mask/r160_xx_19940823 differ
diff --git a/land_sea_mask/r160_xx_19950404 b/land_sea_mask/r160_xx_19950404
new file mode 100755
index 0000000..116c1a4
Binary files /dev/null and b/land_sea_mask/r160_xx_19950404 differ
diff --git a/options/options_CRAY b/options/options_CRAY
new file mode 100755
index 0000000..d12db62
--- /dev/null
+++ b/options/options_CRAY
@@ -0,0 +1,5 @@
+RANLIB = /bin/true
+
+.F.o:
+ $(FC) $(FFLAGS) -c $<
+
diff --git a/options/options_FUJITSU b/options/options_FUJITSU
new file mode 100755
index 0000000..8d5f594
--- /dev/null
+++ b/options/options_FUJITSU
@@ -0,0 +1,12 @@
+RANLIB = /bin/true
+
+.SUFFIXES: .o .c .F
+
+.F.o:
+ rm -f $@
+ $(FC) $(FFLAGS) -c $<
+
+.c.o:
+ rm -f $@
+ $(CC) $(CFLAGS) -c $<
+
diff --git a/options/options_VPP5000 b/options/options_VPP5000
new file mode 100755
index 0000000..8d5f594
--- /dev/null
+++ b/options/options_VPP5000
@@ -0,0 +1,12 @@
+RANLIB = /bin/true
+
+.SUFFIXES: .o .c .F
+
+.F.o:
+ rm -f $@
+ $(FC) $(FFLAGS) -c $<
+
+.c.o:
+ rm -f $@
+ $(CC) $(CFLAGS) -c $<
+
diff --git a/options/options_decalpha b/options/options_decalpha
new file mode 100755
index 0000000..23e5885
--- /dev/null
+++ b/options/options_decalpha
@@ -0,0 +1,7 @@
+.SUFFIXES: .o .c .F
+
+.F.o:
+ $(FC) $(FFLAGS) -c $<
+
+.c.o:
+ $(CC) $(CFLAGS) -c $<
diff --git a/options/options_decmips b/options/options_decmips
new file mode 100755
index 0000000..23e5885
--- /dev/null
+++ b/options/options_decmips
@@ -0,0 +1,7 @@
+.SUFFIXES: .o .c .F
+
+.F.o:
+ $(FC) $(FFLAGS) -c $<
+
+.c.o:
+ $(CC) $(CFLAGS) -c $<
diff --git a/options/options_hpia64 b/options/options_hpia64
new file mode 100755
index 0000000..47748af
--- /dev/null
+++ b/options/options_hpia64
@@ -0,0 +1,15 @@
+RANLIB = ranlib
+
+#
+# Following generally suitable for use with fort77
+#
+#.F.o:
+# $(FC) $(FFLAGS) -c $<
+
+#
+# Following used at ECMWF, currently using f77
+#
+.F.o:
+ /usr/ccs/lbin/cpp -P $(CPPFLAGS) $< > $*.f
+ $(FC) $(FFLAGS) -c $*.f
+ \rm -f $*.f
diff --git a/options/options_hppa b/options/options_hppa
new file mode 100755
index 0000000..47748af
--- /dev/null
+++ b/options/options_hppa
@@ -0,0 +1,15 @@
+RANLIB = ranlib
+
+#
+# Following generally suitable for use with fort77
+#
+#.F.o:
+# $(FC) $(FFLAGS) -c $<
+
+#
+# Following used at ECMWF, currently using f77
+#
+.F.o:
+ /usr/ccs/lbin/cpp -P $(CPPFLAGS) $< > $*.f
+ $(FC) $(FFLAGS) -c $*.f
+ \rm -f $*.f
diff --git a/options/options_i686 b/options/options_i686
new file mode 100755
index 0000000..8d5f594
--- /dev/null
+++ b/options/options_i686
@@ -0,0 +1,12 @@
+RANLIB = /bin/true
+
+.SUFFIXES: .o .c .F
+
+.F.o:
+ rm -f $@
+ $(FC) $(FFLAGS) -c $<
+
+.c.o:
+ rm -f $@
+ $(CC) $(CFLAGS) -c $<
+
diff --git a/options/options_i86pc b/options/options_i86pc
new file mode 100755
index 0000000..23e5885
--- /dev/null
+++ b/options/options_i86pc
@@ -0,0 +1,7 @@
+.SUFFIXES: .o .c .F
+
+.F.o:
+ $(FC) $(FFLAGS) -c $<
+
+.c.o:
+ $(CC) $(CFLAGS) -c $<
diff --git a/options/options_ibm_power4 b/options/options_ibm_power4
new file mode 100755
index 0000000..7d4ee33
--- /dev/null
+++ b/options/options_ibm_power4
@@ -0,0 +1,9 @@
+RANLIB = /bin/ranlib
+
+.SUFFIXES: .o .F .c
+
+.c.o:
+ $(CC) $(CFLAGS) -c $<
+
+.F.o:
+ $(FC) -WF,$(CPPFLAGS) $(FFLAGS) -c $*.F
diff --git a/options/options_ibm_power6 b/options/options_ibm_power6
new file mode 100755
index 0000000..7d4ee33
--- /dev/null
+++ b/options/options_ibm_power6
@@ -0,0 +1,9 @@
+RANLIB = /bin/ranlib
+
+.SUFFIXES: .o .F .c
+
+.c.o:
+ $(CC) $(CFLAGS) -c $<
+
+.F.o:
+ $(FC) -WF,$(CPPFLAGS) $(FFLAGS) -c $*.F
diff --git a/options/options_ibm_power7 b/options/options_ibm_power7
new file mode 100755
index 0000000..7d4ee33
--- /dev/null
+++ b/options/options_ibm_power7
@@ -0,0 +1,9 @@
+RANLIB = /bin/ranlib
+
+.SUFFIXES: .o .F .c
+
+.c.o:
+ $(CC) $(CFLAGS) -c $<
+
+.F.o:
+ $(FC) -WF,$(CPPFLAGS) $(FFLAGS) -c $*.F
diff --git a/options/options_itanium b/options/options_itanium
new file mode 100755
index 0000000..23e5885
--- /dev/null
+++ b/options/options_itanium
@@ -0,0 +1,7 @@
+.SUFFIXES: .o .c .F
+
+.F.o:
+ $(FC) $(FFLAGS) -c $<
+
+.c.o:
+ $(CC) $(CFLAGS) -c $<
diff --git a/options/options_linux b/options/options_linux
new file mode 100755
index 0000000..4e65098
--- /dev/null
+++ b/options/options_linux
@@ -0,0 +1,10 @@
+.SUFFIXES: .o .c .F .F90
+
+.F.o:
+ $(FC) $(FFLAGS) -c $<
+
+.F90.o:
+ $(FC) $(FFLAGS) -c $<
+
+.c.o:
+ $(CC) $(CFLAGS) -c $<
diff --git a/options/options_linux_g77 b/options/options_linux_g77
new file mode 100755
index 0000000..23e5885
--- /dev/null
+++ b/options/options_linux_g77
@@ -0,0 +1,7 @@
+.SUFFIXES: .o .c .F
+
+.F.o:
+ $(FC) $(FFLAGS) -c $<
+
+.c.o:
+ $(CC) $(CFLAGS) -c $<
diff --git a/options/options_rs6000 b/options/options_rs6000
new file mode 100755
index 0000000..1949190
--- /dev/null
+++ b/options/options_rs6000
@@ -0,0 +1,11 @@
+RANLIB = /bin/ranlib
+
+.SUFFIXES: .o .F .c
+
+.c.o:
+ cc $(CFLAGS) -c $<
+
+.F.o:
+ - cc $(CFLAGS) -P -C -c $<
+ mv $*.i $*.f
+ $(FC) $(FFLAGS) -qintlog -c $*.f
diff --git a/options/options_sgimips b/options/options_sgimips
new file mode 100755
index 0000000..749bfc1
--- /dev/null
+++ b/options/options_sgimips
@@ -0,0 +1,9 @@
+RANLIB = /bin/true
+
+.SUFFIXES: .o .c .F
+
+.F.o:
+ $(FC) $(FFLAGS) -c $<
+
+.c.o:
+ $(CC) $(CFLAGS) -c $<
diff --git a/options/options_sun4 b/options/options_sun4
new file mode 100755
index 0000000..d9ebf4c
--- /dev/null
+++ b/options/options_sun4
@@ -0,0 +1,9 @@
+RANLIB = ranlib
+
+.SUFFIXES: .o .c .F
+
+.F.o:
+ $(FC) $(FFLAGS) -c $<
+
+.c.o:
+ $(CC) $(CFLAGS) -c $<
diff --git a/pbio/0-INDEX-0 b/pbio/0-INDEX-0
new file mode 100755
index 0000000..6924815
--- /dev/null
+++ b/pbio/0-INDEX-0
@@ -0,0 +1,40 @@
+0-INDEX-0 mac This index file
+Makefile mac libemos.a makefile for this directory
+PBGroutines.c mac Handle pure binary GRIB files in indexed fashion.
+PBGroutines.h mac header for PBGroutines.h.
+README mac Description of the files in this directory
+blokex.F mac BLOK extraction routines
+bufrgrib.h mac Header for PBBUFR/GRIB routines
+config.pbio mac Configuration file for make
+crexrd.c mac (dead)C routine for reading CREX products
+extras.c mac Get environ value; remove blanks from end
+fileRead.h mqc Default definitions for fileRead, fileSeek and fileTell
+fort2c.c mac FORTRAN to C character conversion
+fort2c.h mac FORTRAN to C character conversion header
+fortint.h mac Allow for Fortran INTEGERs to be C int/long
+gbyte.c mac Machine independent gbyte(s),sbyte(s)
+gbyte_alpha.c mac gbyte for ALPHA
+lwsize.c mac Returns byte size of next GRIB, BUFR, TIDE, BUDG, DIAG
+make.dep mac Make dependencies
+mvchars.c mac Fortran callable to move a string to integer array.
+newpbio.c mac (dead)PBOPEN/READ/WRITE/SEEK/CLOSE file-handling
+pbio.c mac PBOPEN/READ/WRITE/SEEK/CLOSE file-handling routines
+pbio_alpha.c mac (dead)(new)pbio for ALPHA
+pbbufr.F mac Reads next BUFR product from a file
+pbcrex.F mac Reads next CREX product from a file
+pbfp.c mac Returns C file pointer for a file opened by PBOPEN
+pbionum.F mac Returns PBIO_CYCLE
+pbgrib.F mac Reads next GRIB product from a file
+pbpseu.F mac Reads next GRIB/BUFR/DIAG/TIDE/BUDG product from a file
+pbsize.c mac (dead)Returns size in bytes of following product.
+readany.c mac Reads any product (GRIB,BUFR,BUDG,..) from a file
+readbufr.c mac Reads next BUFR product from a file
+readcrex.c mac Reads next CREX product from a file
+readgrib.c mac Reads next GRIB product from a file
+readnext.c mac Reads next BUFR/GRIB product from a 'stream'
+readprod.c mac Reads next BUFR/GRIB product from a file
+readprod_alpha.c mac Reads next BUFR/GRIB product from a file (ALPHA)
+recheckLength.c mac Calculates the length of GRIB from lengths of sections
+setpar.c mac Sets no. of bits per word, largest negative no.
+sizeRoutines.h mac Function protypes for size functions (prodsize, etc)
+sources.XXX mac Sources for platform XXX.
diff --git a/pbio/Makefile b/pbio/Makefile
new file mode 100755
index 0000000..8d53810
--- /dev/null
+++ b/pbio/Makefile
@@ -0,0 +1,35 @@
+#
+# Makefile for libemos/pbio
+#
+LIBRARY = ../lib$(LIB)$(R64).a
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+TARGETS = all clean
+#
+include sources.$(ARCH)
+#
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.F) $(OBJECTS.c)
+FASTOBJ.o = $(FASTSRC.c:.c=.o)
+FASTOBJ = $(FASTOBJ.o)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+$(FASTOBJ.o): $(FASTSRC.c)
+ $(CC) $(FASTCFLAGS) -c $(FASTSRC.c)
+
+$(LIBRARY): $(OBJECTS) $(FASTOBJ)
+ $(AR) $(ARFLAGS) $@ $?
+ $(RANLIB) $@
+
+include make.dep
+
+clean:
+ \rm -f $(OBJECTS) $(FASTOBJ) *.f
diff --git a/pbio/Makefile.in b/pbio/Makefile.in
new file mode 100755
index 0000000..e70dbd3
--- /dev/null
+++ b/pbio/Makefile.in
@@ -0,0 +1,41 @@
+#
+#
+#
+A64 = plat
+R64 = reals
+ARCH = arch
+CNAME = comp
+LIB = depl
+
+LIBRARY = ../lib$(LIB)$(R64).a
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+TARGETS = all clean
+#
+include sources.$(ARCH)
+#
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.F) $(OBJECTS.c)
+FASTOBJ.o = $(FASTSRC.c:.c=.o)
+FASTOBJ = $(FASTOBJ.o)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+$(FASTOBJ.o): $(FASTSRC.c)
+ $(CC) $(FASTCFLAGS) -c $(FASTSRC.c)
+
+$(LIBRARY): $(OBJECTS) $(FASTOBJ)
+ $(AR) $(ARFLAGS) $@ $?
+ $(RANLIB) $@
+
+include make.dep
+
+clean:
+ \rm -f $(OBJECTS) $(FASTOBJ) *.f
diff --git a/pbio/Makefile.shared b/pbio/Makefile.shared
new file mode 100755
index 0000000..a92acd4
--- /dev/null
+++ b/pbio/Makefile.shared
@@ -0,0 +1,36 @@
+#
+# Makefile for libemos/pbio
+#
+LIBRARY = ../lib$(LIB)$(R64).so
+#
+include ../config/config.$(ARCH)$(CNAME)$(R64)$(A64)
+#
+include ../options/options_$(ARCH)
+#
+PROFILE=$(SHLIB)
+#
+TARGETS = all clean
+#
+include sources.$(ARCH)
+#
+OBJECTS.F = $(SOURCES.F:.F=.o)
+OBJECTS.c = $(SOURCES.c:.c=.o)
+OBJECTS = $(OBJECTS.F) $(OBJECTS.c)
+FASTOBJ.o = $(FASTSRC.c:.c=.o)
+FASTOBJ = $(FASTOBJ.o)
+#
+#
+.PRECIOUS: $(LIBRARY)
+
+all: $(LIBRARY)
+
+$(FASTOBJ.o): $(FASTSRC.c)
+ $(CC) $(FASTCFLAGS) -c $(FASTSRC.c)
+
+$(LIBRARY): $(OBJECTS) $(EXTRAOBJ)
+ $(LD) $(DYNLINKFLAGS) $? -o $@
+
+include make.dep
+
+clean:
+ \rm -f $(OBJECTS) $(FASTOBJ) *.f
diff --git a/pbio/PBGroutines.c b/pbio/PBGroutines.c
new file mode 100755
index 0000000..6ef8b9c
--- /dev/null
+++ b/pbio/PBGroutines.c
@@ -0,0 +1,2565 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#ifdef linux
+# if !defined __off64_t_defined
+typedef __off64_t off64_t;
+#define __off64_t_defined
+#endif
+#endif
+
+#include "PBGroutines.h"
+
+#ifdef gribAPI
+long date_to_Julian(long ddate);
+long Julian_to_date(long jdate);
+#else
+long date_to_julian(long ddate);
+long julian_to_date(long jdate);
+#endif
+
+integer pbginitInput(_fcd filename, fortint filename_len);
+integer pbginitOutput(_fcd filename, fortint filename_len);
+void dsgnbt_(fortint *, fortint *, fortint *, fortint *);
+void copyName(_fcd * , _fcd , fortint );
+
+fortint readgrib(FILE * file, unsigned char * buffer, fortint * prod_len);
+
+void pbgindx(fortint);
+
+void gribdata( unsigned char * header,
+ integer number_of_fields,
+ integer * parameter,
+ integer * level,
+ integer * date,
+ integer * time,
+ integer * timestep,
+ integer * localDefinitionNumber,
+ integer * type,
+ integer * stream,
+ integer * repres,
+ integer * levtype,
+ integer * number,
+ integer * vdate,
+ integer * vtime,
+ integer * tcNumber,
+ integer * tcTotal,
+ integer * clusterMethod,
+ integer * tcStep,
+ integer * clusterStepEnd,
+ integer * tcNorth,
+ integer * tcWest,
+ integer * tcSouth,
+ integer * tcEast,
+ integer * clusterOpFcNumber,
+ integer * clusterControlFcNumber,
+ integer * tcNumOfFcs,
+ integer * probScale,
+ integer * probIndicator,
+ integer * probLower,
+ integer * probUpper,
+ integer * ni,
+ integer * nj,
+ integer * nlat,
+ integer * nlon,
+ integer * slat,
+ integer * slon,
+ integer * di,
+ integer * dj,
+ integer * splat,
+ integer * splon,
+ integer * quasi,
+ integer * directionNumber,
+ integer * frequencyNumber,
+ integer * optimisationTime,
+ integer * leadTime,
+ integer * sensitiveAreaDomain,
+ integer * sensitiveAreaMethod,
+ integer * verifyingMonth,
+ integer * averagingPeriod,
+ integer * forecastMonth,
+ integer * referenceDate,
+ integer * climateDateFrom,
+ integer * climateDateTo,
+ integer * thresholdUnitsScale,
+ integer * thresholdIndicator,
+ integer * lowerThreshold,
+ integer * upperThreshold
+ );
+
+static gribfile * latestFile(collection);
+static gribfile * currentFile(collection, integer);
+
+/*
+//
+*/
+#define DEBUGOFF 1
+#define DEBUG1 (debugSet > DEBUGOFF )
+#define DEBUG2 (debugSet > (DEBUGOFF + 1) )
+static char * debugLevel;
+static int debugSet = 0;
+
+#define ONEBYTELONG(a) (long) ( *(a) )
+#define TWOBYTELONG(a) (long) ( (*(a))<<8 | (*((a)+1))<<0 )
+#define THREEBYTELONG(a) (long) (TWOBYTELONG((a))<<8 | (*((a)+2))<<0 )
+#define FOURBYTELONG(a) (long) (THREEBYTELONG((a))<<8 | (*((a)+3))<<0 )
+
+#define MISSING -1
+#define NOTGIVEN(x) ((x) == MISSING )
+#define MATCH(a,b) (NOTGIVEN((a)) || ((a) == (b)))
+
+#define HEADLEN 10000
+
+integer exists(_fcd , fortint );
+integer addRead(_fcd , fortint );
+integer addWrite(_fcd , fortint );
+void removeFile(_fcd , fortint );
+
+collection openFiles = {exists,addRead,addWrite,removeFile,-1,-1,NULL};
+
+void pbgindx(fortint thisFile) {
+/*
+// Fills in details of current file
+*/
+unsigned char header[HEADLEN];
+fortint status;
+fortint headerlen;
+OFF_T space;
+integer number_of_fields = 0;
+gribfile * file = currentFile(openFiles,thisFile);
+
+/*
+// Loop through products in the file
+*/
+ file->offset[0] = 0;
+ do {
+ headerlen = HEADLEN;
+ status = readgrib( file->fp, header, &headerlen);
+
+/*
+// Accept product if OK or if only problem is 'buffer too small' or
+// on EOF
+*/
+ if( (status!=0) && (status!=-3) && (status!=-1) ) exit(1);
+ if( status == -1 ) break;
+
+/*
+// Note the product byte offset in the file
+*/
+ file->length[number_of_fields] = (OFF_T) headerlen;
+#ifdef FOPEN64
+ file->offset[number_of_fields] =
+ ftello64(file->fp) - file->length[number_of_fields];
+#else
+ file->offset[number_of_fields] =
+ (OFF_T) ftell(file->fp) - file->length[number_of_fields];
+#endif
+
+/*
+// If it's a GRIB edition 1 product, pick up more information
+// (parameter,level,..)
+*/
+ if( strncmp((char *)header,"GRIB", 4)==0 ) {
+/*
+// Eliminate GRIB editions 0 and -1
+*/
+ if( (header[ 7] != '\1') ) break;
+ if( (header[19] == '\0') && (header[20] == '\0') &&
+ (header[21] == '\0') && (header[22] == '\0') &&
+ (header[23] == '\0') ) break;
+
+ gribdata( header,
+ number_of_fields,
+ file->parameter,
+ file->level,
+ file->date,
+ file->time,
+ file->timestep,
+ file->localDefinitionNumber,
+ file->type,
+ file->stream,
+ file->repres,
+ file->levtype,
+ file->number,
+ file->vdate,
+ file->vtime,
+ file->tcNumber,
+ file->tcTotal,
+ file->clusterMethod,
+ file->tcStep,
+ file->clusterStepEnd,
+ file->tcNorth,
+ file->tcWest,
+ file->tcSouth,
+ file->tcEast,
+ file->clusterOpFcNumber,
+ file->clusterControlFcNumber,
+ file->tcNumOfFcs,
+ file->probScale,
+ file->probIndicator,
+ file->probLower,
+ file->probUpper,
+ file->ni,
+ file->nj,
+ file->nlat,
+ file->nlon,
+ file->slat,
+ file->slon,
+ file->di,
+ file->dj,
+ file->splat,
+ file->splon,
+ file->quasi,
+ file->directionNumber,
+ file->frequencyNumber,
+ file->optimisationTime,
+ file->leadTime,
+ file->sensitiveAreaDomain,
+ file->sensitiveAreaMethod,
+ file->verifyingMonth,
+ file->averagingPeriod,
+ file->forecastMonth,
+ file->referenceDate,
+ file->climateDateFrom,
+ file->climateDateTo,
+ file->thresholdUnitsScale,
+ file->thresholdIndicator,
+ file->lowerThreshold,
+ file->upperThreshold
+ );
+
+#define REALLOC(a) (a) = realloc((a) , (size_t) space)
+
+ number_of_fields++;
+ if( number_of_fields == file->max ) {
+ integer newSize = (file->max)*2;
+ file->max = newSize;
+
+ space = (OFF_T) (sizeof(OFF_T)*newSize);
+ REALLOC(file->offset);
+
+ space = (OFF_T) (sizeof(integer)*newSize);
+ REALLOC(file->length);
+ REALLOC(file->parameter);
+ REALLOC(file->level);
+ REALLOC(file->date);
+ REALLOC(file->time);
+ REALLOC(file->timestep);
+ REALLOC(file->localDefinitionNumber);
+ REALLOC(file->type);
+ REALLOC(file->stream);
+ REALLOC(file->repres);
+ REALLOC(file->levtype);
+ REALLOC(file->number);
+ REALLOC(file->vdate);
+ REALLOC(file->vtime);
+ REALLOC(file->tcNumber);
+ REALLOC(file->tcTotal);
+ REALLOC(file->clusterMethod);
+ REALLOC(file->tcStep);
+ REALLOC(file->clusterStepEnd);
+ REALLOC(file->tcNorth);
+ REALLOC(file->tcWest);
+ REALLOC(file->tcSouth);
+ REALLOC(file->tcEast);
+ REALLOC(file->clusterOpFcNumber);
+ REALLOC(file->clusterControlFcNumber);
+ REALLOC(file->tcNumOfFcs);
+ REALLOC(file->probScale);
+ REALLOC(file->probIndicator);
+ REALLOC(file->probLower);
+ REALLOC(file->probUpper);
+ REALLOC(file->ni);
+ REALLOC(file->nj);
+ REALLOC(file->nlat);
+ REALLOC(file->nlon);
+ REALLOC(file->slat);
+ REALLOC(file->slon);
+ REALLOC(file->di);
+ REALLOC(file->dj);
+ REALLOC(file->splat);
+ REALLOC(file->splon);
+ REALLOC(file->quasi);
+ REALLOC(file->directionNumber);
+ REALLOC(file->frequencyNumber);
+ REALLOC(file->optimisationTime);
+ REALLOC(file->leadTime);
+ REALLOC(file->sensitiveAreaDomain);
+ REALLOC(file->sensitiveAreaMethod);
+ REALLOC(file->verifyingMonth);
+ REALLOC(file->averagingPeriod);
+ REALLOC(file->forecastMonth);
+ REALLOC(file->referenceDate);
+ REALLOC(file->climateDateFrom);
+ REALLOC(file->climateDateTo);
+ REALLOC(file->thresholdUnitsScale);
+ REALLOC(file->thresholdIndicator);
+ REALLOC(file->lowerThreshold);
+ REALLOC(file->upperThreshold);
+ }
+ }
+
+ } while( (!feof(file->fp)) &&
+ (number_of_fields < file->max)
+ );
+
+ file->count = number_of_fields;
+
+ return;
+}
+
+void gribdata( unsigned char * header,
+ integer index,
+ integer * parameter,
+ integer * level,
+ integer * date,
+ integer * time,
+ integer * timestep,
+ integer * localDefinitionNumber,
+ integer * type,
+ integer * stream,
+ integer * repres,
+ integer * levtype,
+ integer * number,
+ integer * vdate,
+ integer * vtime,
+ integer * tcNumber,
+ integer * tcTotal,
+ integer * clusterMethod,
+ integer * tcStep,
+ integer * clusterStepEnd,
+ integer * tcNorth,
+ integer * tcWest,
+ integer * tcSouth,
+ integer * tcEast,
+ integer * clusterOpFcNumber,
+ integer * clusterControlFcNumber,
+ integer * tcNumOfFcs,
+ integer * probScale,
+ integer * probIndicator,
+ integer * probLower,
+ integer * probUpper,
+ integer * ni,
+ integer * nj,
+ integer * nlat,
+ integer * nlon,
+ integer * slat,
+ integer * slon,
+ integer * di,
+ integer * dj,
+ integer * splat,
+ integer * splon,
+ integer * quasi,
+ integer * directionNumber,
+ integer * frequencyNumber,
+ integer * optimisationTime,
+ integer * leadTime,
+ integer * sensitiveAreaDomain,
+ integer * sensitiveAreaMethod,
+ integer * verifyingMonth,
+ integer * averagingPeriod,
+ integer * forecastMonth,
+ integer * referenceDate,
+ integer * climateDateFrom,
+ integer * climateDateTo,
+ integer * thresholdUnitsScale,
+ integer * thresholdIndicator,
+ integer * lowerThreshold,
+ integer * upperThreshold
+ )
+/*
+// Returns parameter, level, date, time , etc information
+// for a GRIB product.
+*/
+{
+
+/*
+// Decode the GRIB product
+*/
+
+#define POLAR_STEREO 5
+
+#define SEC1 7
+#define LEN1 8
+#define TABLE 4
+#define PARAM 9
+#define LEVELTYPE 10
+#define LEVEL1 11
+#define LEVEL2 12
+#define YY 13
+#define MM 14
+#define DD 15
+#define HOUR 16
+#define MIN 17
+#define TIMEUNIT 18
+#define STEP1 19
+#define STEP2 20
+#define TIMERANGE 21
+#define CENTURY 25
+#define LOCALDEF 41
+#define CLASS 42
+#define TYPE 43
+#define STREAM 44
+#define NUMBER 50
+#define REPRES 6
+#define NI 7
+#define NJ 9
+#define NLAT 11
+#define NLON 14
+#define SLAT 18
+#define SLON 21
+#define DI 24
+#define DJ 26
+#define DI_PS 21
+#define DJ_PS 24
+#define SPLAT 33
+#define SPLON 36
+
+#define ISOTHERMAL_LEVEL 20
+#define ISOBARIC_LEVEL 100
+#define ALTITUDE 103
+#define HEIGHT 105
+#define SIGMA_LEVEL 107
+#define HYBRID_LEVEL 109
+#define DEPTH_BELOW_LAND 111
+#define ISENTROPIC_LEVEL 113
+#define PRESSURE_DIFF 115
+#define VORTICITY_SURF 117
+#define HEIGHT_HIGH_PREC 125
+#define SATELLITE_BAND 127
+#define DEPTH_BELOW_SEA 160
+#define ENTIRE_ATMOSPHERE 200
+#define ENTIRE_OCEAN 201
+#define ISOBARIC_HIGH_PREC 210
+
+#define PROBABILITY 16
+#define PROBSCALE 52
+#define PROBINDIC 53
+#define PROBLOWER 54
+#define PROBUPPER 56
+
+#define CLUSTERMEAN 14
+#define CLUSTERSD 15
+#define CLUSTERNUMBER 50
+#define CLUSTERTOTAL 51
+#define CLUSTERMETHOD 53
+#define CLUSTERSTEP 54
+#define CLUSTERSTEPEND 56
+#define CLUSTERNORTH 58
+#define CLUSTERWEST 61
+#define CLUSTERSOUTH 64
+#define CLUSTEREAST 67
+#define CLUSTEROPFCNUM 70
+#define CLUSTERCONTROLFCNUM 71
+#define CLUSTERFORECASTS 72
+
+#define TUBETYPE 24
+#define TUBENUMBER 50
+#define TUBETOTAL 51
+#define TUBESTEP 71
+#define TUBENORTH 55
+#define TUBEWEST 58
+#define TUBESOUTH 61
+#define TUBEEAST 64
+#define TUBEFORECASTS 79
+
+#define CLUSTERMEAN 14
+#define CLUSTERSD 15
+#define CLUSTERNUMBER 50
+#define CLUSTERTOTAL 51
+#define CLUSTERMETHOD 53
+#define CLUSTERSTEP 54
+#define CLUSTERSTEPEND 56
+#define CLUSTERNORTH 58
+#define CLUSTERWEST 61
+#define CLUSTERSOUTH 64
+#define CLUSTEREAST 67
+#define CLUSTEROPFCNUM 70
+#define CLUSTERCONTROLFCNUM 71
+#define CLUSTERFORECASTS 72
+
+#define DIRECTIONNUMBER 52
+#define FREQUENCYNUMBER 53
+
+#define OPTIMISATIONTIME 92
+#define LEADTIME 93
+#define SENSITIVEAREADOMAIN 94
+#define SENSITIVEAREAMETHOD 95
+
+#define VERIFYINGMONTH 56
+#define AVERAGINGPERIOD 60
+#define FORECASTMONTH 61
+#define REFERENCEDATE 63
+#define CLIMATEDATEFROM 67
+#define CLIMATEDATETO 71
+#define THRESHOLDUNITSSCALE 75
+#define THRESHOLDINDICATOR 76
+#define LOWERTHRESHOLD 77
+#define UPPERTHRESHOLD 79
+
+integer table, leveltype, timeunit, timerange, multiplier, century, year;
+integer twoByteNumber, ECclass, ensembleNumber;
+integer section2Offset;
+integer status, eight = 8, sixteen = 16, twentyFour = 24;
+
+ table = header[SEC1+TABLE];
+ parameter[index] = table*1000 + header[SEC1+PARAM];
+
+ leveltype = header[SEC1+LEVELTYPE];
+ levtype[index] = leveltype;
+
+ switch( leveltype ) {
+
+ case ISOTHERMAL_LEVEL :
+ case ISOBARIC_LEVEL :
+ case ALTITUDE :
+ case HEIGHT :
+ case SIGMA_LEVEL :
+ case HYBRID_LEVEL :
+ case DEPTH_BELOW_LAND :
+ case ISENTROPIC_LEVEL :
+ case PRESSURE_DIFF :
+ case VORTICITY_SURF :
+ case HEIGHT_HIGH_PREC :
+ case SATELLITE_BAND :
+ case DEPTH_BELOW_SEA :
+ case ENTIRE_ATMOSPHERE :
+ case ENTIRE_OCEAN :
+ case ISOBARIC_HIGH_PREC:
+/* level[index] = header[SEC1+LEVEL1]*256 + header[SEC1+LEVEL2]; */
+ level[index] = TWOBYTELONG(&header[SEC1+LEVEL1]);
+ break;
+
+ default: level[index] = header[SEC1+LEVEL1];
+ }
+
+ century = header[SEC1+CENTURY];
+ year = (century-1)*100 + header[SEC1+YY];
+ date[index] = year*10000 + header[SEC1+MM]*100 + header[SEC1+DD];
+
+ time[index] = header[SEC1+HOUR]*100 + header[SEC1+MIN];
+
+ timeunit = header[SEC1+TIMEUNIT];
+
+#define DAY 2
+#define MONTH 3
+#define THREE_HOURS 10
+#define SIX_HOURS 11
+#define TWELVE_HOURS 12
+
+ switch( timeunit ) {
+
+ case DAY :
+ multiplier = 24;
+ break;
+
+ case MONTH :
+ multiplier = 30*24;
+ break;
+
+ case THREE_HOURS :
+ multiplier = 3;
+ break;
+
+ case SIX_HOURS :
+ multiplier = 6;
+ break;
+
+ case TWELVE_HOURS :
+ multiplier = 12;
+ break;
+
+ default: multiplier = 1;
+ }
+
+#define RANGE_P1_TO_P2 2
+#define ACCUMULATION 4
+#define DIFFERENCE 5
+#define TWOBYTE 10
+
+ timerange = header[SEC1+TIMERANGE];
+
+ switch( timerange ) {
+
+ case TWOBYTE :
+ timestep[index] = TWOBYTELONG(&header[SEC1+STEP1])*multiplier;
+ break;
+
+ default: timestep[index] = header[SEC1+STEP2]*multiplier*10000 +
+ header[SEC1+STEP1]*multiplier;
+ }
+
+ type[index] = header[SEC1+TYPE];
+
+#define ANALYSIS 2
+
+ if( type[index] == ANALYSIS ) {
+ vdate[index] = date[index];
+ vtime[index] = time[index];
+ }
+ else {
+ long iverd = (time[index] + timestep[index]*100) / 2400;
+#ifdef gribAPI
+ long ijvday = date_to_Julian(date[index]) + iverd;
+ vdate[index] = Julian_to_date(ijvday);
+#else
+ long ijvday = date_to_julian(date[index]) + iverd;
+ vdate[index] = julian_to_date(ijvday);
+#endif
+ vtime[index] = (time[index] + timestep[index]*100) - (iverd*2400);
+ }
+
+ localDefinitionNumber[index] = header[SEC1+LOCALDEF];
+ ECclass = header[SEC1+CLASS];
+ stream[index] = TWOBYTELONG(&header[SEC1+STREAM]);
+
+ twoByteNumber = ( (localDefinitionNumber[index] == 4) && (stream[index] == 1090) ) ||
+ (localDefinitionNumber[index] == 9) ||
+ (localDefinitionNumber[index] == 15) ||
+ (localDefinitionNumber[index] == 16) ||
+ (localDefinitionNumber[index] == 21) ||
+ (localDefinitionNumber[index] == 23);
+
+ if( twoByteNumber )
+ ensembleNumber = TWOBYTELONG(&header[SEC1+NUMBER]);
+ else
+ ensembleNumber = header[SEC1+NUMBER];
+ number[index] = ensembleNumber;
+
+/*
+// Extra information for tubes
+*/
+ if( type[index] == TUBETYPE ) {
+ tcNumber[index] = header[SEC1+TUBENUMBER];
+ tcTotal[index] = header[SEC1+TUBETOTAL];
+ tcStep[index] = TWOBYTELONG(&header[SEC1+TUBESTEP]);
+ tcNorth[index] = THREEBYTELONG(&header[SEC1+TUBENORTH]);
+ dsgnbt_(&tcNorth[index],&tcNorth[index],&twentyFour,&status);
+ tcWest[index] = THREEBYTELONG(&header[SEC1+TUBEWEST]);
+ dsgnbt_(&tcWest[index],&tcWest[index],&twentyFour,&status);
+ tcSouth[index] = THREEBYTELONG(&header[SEC1+TUBESOUTH]);
+ dsgnbt_(&tcSouth[index],&tcSouth[index],&twentyFour,&status);
+ tcEast[index] = THREEBYTELONG(&header[SEC1+TUBEEAST]);
+ dsgnbt_(&tcEast[index],&tcEast[index],&twentyFour,&status);
+ tcNumOfFcs[index] = header[SEC1+TUBEFORECASTS];
+ }
+
+/*
+// Extra information for clusters
+*/
+ if( (type[index] == CLUSTERMEAN) || (type[index] == CLUSTERSD) ) {
+ tcNumber[index] = header[SEC1+CLUSTERNUMBER];
+ tcTotal[index] = header[SEC1+CLUSTERTOTAL];
+ clusterMethod[index] = header[SEC1+CLUSTERMETHOD];
+ tcStep[index] = TWOBYTELONG(&header[SEC1+CLUSTERSTEP]);
+ clusterStepEnd[index] = TWOBYTELONG(&header[SEC1+CLUSTERSTEPEND]);
+ tcNorth[index] = THREEBYTELONG(&header[SEC1+CLUSTERNORTH]);
+ dsgnbt_(&tcNorth[index],&tcNorth[index],&twentyFour,&status);
+ tcWest[index] = THREEBYTELONG(&header[SEC1+CLUSTERWEST]);
+ dsgnbt_(&tcWest[index],&tcWest[index],&twentyFour,&status);
+ tcSouth[index] = THREEBYTELONG(&header[SEC1+CLUSTERSOUTH]);
+ dsgnbt_(&tcSouth[index],&tcSouth[index],&twentyFour,&status);
+ tcEast[index] = THREEBYTELONG(&header[SEC1+CLUSTEREAST]);
+ dsgnbt_(&tcEast[index],&tcEast[index],&twentyFour,&status);
+ clusterOpFcNumber[index] = header[SEC1+CLUSTEROPFCNUM];
+ clusterControlFcNumber[index] = header[SEC1+CLUSTERCONTROLFCNUM];
+ tcNumOfFcs[index] = header[SEC1+CLUSTERFORECASTS];
+ }
+/*
+// Extra information for probabilities
+*/
+ if( type[index] == PROBABILITY ) {
+ probScale[index] = header[SEC1+PROBSCALE];
+ dsgnbt_(&probScale[index],&probScale[index],&eight,&status);
+ probIndicator[index] = header[SEC1+PROBINDIC];
+ probLower[index] = 65535;
+ if( probIndicator[index] != 2 ) {
+ probLower[index] = TWOBYTELONG(&header[SEC1+PROBLOWER]);
+ dsgnbt_(&probLower[index],&probLower[index],&sixteen,&status);
+ }
+ probUpper[index] = 65535;
+ if( probIndicator[index] != 1 ) {
+ probUpper[index] = TWOBYTELONG(&header[SEC1+PROBUPPER]);
+ dsgnbt_(&probUpper[index],&probUpper[index],&sixteen,&status);
+ }
+ }
+/*
+// Extra information for wave 2D spectra
+*/
+ if( localDefinitionNumber[index] == 13 ) {
+ directionNumber[index] = header[SEC1+DIRECTIONNUMBER];
+ frequencyNumber[index] = header[SEC1+FREQUENCYNUMBER];
+ }
+/*
+// Extra information for sensitive area forecasts
+*/
+ if( localDefinitionNumber[index] == 21 ) {
+ optimisationTime[index] = header[SEC1+OPTIMISATIONTIME];
+ leadTime[index] = header[SEC1+LEADTIME];
+ sensitiveAreaDomain[index] = header[SEC1+SENSITIVEAREADOMAIN];
+ sensitiveAreaMethod[index] =
+ TWOBYTELONG(&header[SEC1+SENSITIVEAREAMETHOD]);
+ }
+/*
+// Extra information for coupled atmospheric, wave and ocean models
+*/
+ if( localDefinitionNumber[index] == 23 ) {
+ unsigned char scale;
+
+ verifyingMonth[index] = FOURBYTELONG(&header[SEC1+VERIFYINGMONTH]);
+ averagingPeriod[index] = ONEBYTELONG(&header[SEC1+AVERAGINGPERIOD]);
+ forecastMonth[index] = TWOBYTELONG(&header[SEC1+FORECASTMONTH]);
+ referenceDate[index] = FOURBYTELONG(&header[SEC1+REFERENCEDATE]);
+ climateDateFrom[index] = FOURBYTELONG(&header[SEC1+CLIMATEDATEFROM]);
+ climateDateTo[index] = FOURBYTELONG(&header[SEC1+CLIMATEDATETO]);
+ scale = header[SEC1+THRESHOLDUNITSSCALE];
+ if( scale & 0x80 ) {
+ scale &= 0x7f;
+ thresholdUnitsScale[index] = - ONEBYTELONG(&scale);
+ }
+ else
+ thresholdUnitsScale[index] = ONEBYTELONG(&scale);
+ thresholdIndicator[index] = ONEBYTELONG(&header[SEC1+THRESHOLDINDICATOR]);
+ lowerThreshold[index] = TWOBYTELONG(&header[SEC1+LOWERTHRESHOLD]);
+ upperThreshold[index] = TWOBYTELONG(&header[SEC1+UPPERTHRESHOLD]);
+ }
+
+/*
+// Section 2
+*/
+ section2Offset = THREEBYTELONG(&header[LEN1]);
+ repres[index] = header[LEN1+section2Offset-1+REPRES];
+
+ ni[index] = TWOBYTELONG(&header[LEN1+section2Offset-1+NI]);
+ nj[index] = TWOBYTELONG(&header[LEN1+section2Offset-1+NJ]);
+
+ nlat[index] = THREEBYTELONG(&header[LEN1+section2Offset-1+NLAT]);
+ dsgnbt_(&nlat[index],&nlat[index],&twentyFour,&status);
+
+ nlon[index] = THREEBYTELONG(&header[LEN1+section2Offset-1+NLON]);
+ dsgnbt_(&nlon[index],&nlon[index],&twentyFour,&status);
+
+ slat[index] = THREEBYTELONG(&header[LEN1+section2Offset-1+SLAT]);
+ dsgnbt_(&slat[index],&slat[index],&twentyFour,&status);
+
+/*
+// Section 2 is different for polar stereographic
+*/
+ if( repres[index] == POLAR_STEREO ) {
+ di[index] = THREEBYTELONG(&header[LEN1+section2Offset-1+DI_PS]);
+ dj[index] = THREEBYTELONG(&header[LEN1+section2Offset-1+DJ_PS]);
+ }
+ else {
+ slon[index] = THREEBYTELONG(&header[LEN1+section2Offset-1+SLON]);
+ dsgnbt_(&slon[index],&slon[index],&twentyFour,&status);
+
+ di[index] = TWOBYTELONG(&header[LEN1+section2Offset-1+DI]);
+ dj[index] = TWOBYTELONG(&header[LEN1+section2Offset-1+DJ]);
+
+ splat[index] = THREEBYTELONG(&header[LEN1+section2Offset-1+SPLAT]);
+ dsgnbt_(&splat[index],&splat[index],&twentyFour,&status);
+
+ splon[index] = THREEBYTELONG(&header[LEN1+section2Offset-1+SPLON]);
+ dsgnbt_(&splon[index],&splon[index],&twentyFour,&status);
+ }
+
+ quasi[index] = ( (ni[index] == 0xFFFF) || (nj[index] == 0xFFFF) );
+
+ return;
+
+}
+
+/*
+// ****************************************************************
+*/
+fortint pbgtotl_(_fcd filename, fortint filename_len) {
+/*
+// Returns number of GRIB products in the file.
+*/
+integer thisFile;
+gribfile * file;
+
+ thisFile = pbginitInput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+
+ if( DEBUG1 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBGTOTL: Number of GRIBs in file %s = %d\n", pfile, file->count);
+ free(pfile);
+ }
+ return ( file->count );
+}
+
+fortint pbgtotl(_fcd filename, fortint filename_len) {
+ return pbgtotl_(filename,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+fortint pbgleng_(_fcd filename, fortint * n, fortint filename_len) {
+/*
+// Returns length (in bytes) of GRIB product n or -1 if n is greater
+// than the number of products in the file, or less than 1.
+*/
+integer index = (*n)-1;
+integer thisFile;
+gribfile * file;
+
+ if( index >= 0 ) {
+ thisFile = pbginitInput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+ if( index < file->count ) {
+ if( DEBUG1 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBGLENG: length of GRIB %d in file %s = %d\n",
+ (index+1), pfile, file->length[index]);
+ free(pfile);
+ }
+ return ( file->length[index] );
+ }
+ }
+
+ return (-1);
+}
+
+fortint pbgleng(_fcd filename, fortint * n, fortint filename_len) {
+ return pbgleng_(filename,n,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+fortint pbgoffs_(_fcd filename, fortint * n, fortint filename_len) {
+/*
+// Returns offset (in bytes) of GRIB product n or -1 if n is greater
+// than the number of products in the file, or less than 1.
+*/
+integer index = (*n)-1;
+integer thisFile;
+gribfile * file;
+
+ if( index >= 0 ) {
+ thisFile = pbginitInput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+ if( index < file->count ) {
+ if( DEBUG1 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBGOFFS: offset of GRIB %d in file %s = %d\n",
+ (index+1), pfile, file->offset[index]);
+ free(pfile);
+ }
+ return ( file->offset[index] );
+ }
+ }
+
+ return (-1);
+}
+
+fortint pbgoffs(_fcd filename, fortint * n, fortint filename_len) {
+ return pbgoffs_(filename,n,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+fortint pbgparm_(_fcd filename, fortint * n, fortint filename_len) {
+/*
+// Returns parameter number of GRIB product n or -1 if n is greater
+// than the number of products in the file, or less than 1.
+*/
+integer index = (*n)-1;
+integer thisFile;
+gribfile * file;
+
+ if( index >= 0 ) {
+ thisFile = pbginitInput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+ if( index < file->count ) {
+ if( DEBUG1 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBGPARM: parameter number of GRIB %d in file %s = %d\n",
+ (index+1), pfile, file->parameter[index]);
+ free(pfile);
+ }
+ return ( file->parameter[index] );
+ }
+ }
+
+ return (-1);
+}
+
+fortint pbgparm(_fcd filename, fortint * n, fortint filename_len) {
+ return pbgparm_(filename,n,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+fortint pbglevl_(_fcd filename, fortint * n, fortint filename_len) {
+/*
+// Returns level of GRIB product n or -1 if n is greater
+// than the number of products in the file, or less than 1.
+*/
+integer index = (*n)-1;
+integer thisFile;
+gribfile * file;
+
+ if( index >= 0 ) {
+ thisFile = pbginitInput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+ if( index < file->count ) {
+ if( DEBUG1 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBGLEVL: level of GRIB %d in file %s = %d\n",
+ (index+1), pfile, file->level[index]);
+ free(pfile);
+ }
+ return ( file->level[index] );
+ }
+ }
+
+ return (-1);
+}
+
+fortint pbglevl(_fcd filename, fortint * n, fortint filename_len) {
+ return pbglevl_(filename,n,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+fortint pbgdate_(_fcd filename, fortint * n, fortint filename_len) {
+/*
+// Returns date (as YYMMDD) of GRIB product n or -1 if n is greater
+// than the number of products in the file, or less than 1.
+*/
+integer index = (*n)-1;
+integer thisFile;
+gribfile * file;
+
+ if( index >= 0 ) {
+ thisFile = pbginitInput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+ if( index < file->count ) {
+ if( DEBUG1 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBGDATE: date of GRIB %d in file %s = %d\n",
+ (index+1), pfile, file->date[index]);
+ free(pfile);
+ }
+ return ( file->date[index] );
+ }
+ }
+
+ return (-1);
+}
+
+fortint pbgdate(_fcd filename, fortint * n, fortint filename_len) {
+ return pbgdate_(filename,n,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+fortint pbgtime_(_fcd filename, fortint * n, fortint filename_len) {
+/*
+// Returns time (as HHMM) of GRIB product n or -1 if n is greater
+// than the number of products in the file, or less than 1.
+*/
+integer index = (*n)-1;
+integer thisFile;
+gribfile * file;
+
+ if( index >= 0 ) {
+ thisFile = pbginitInput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+ if( index < file->count ) {
+ if( DEBUG1 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBGTIME: time of GRIB %d in file %s = %d\n",
+ (index+1), pfile, file->time[index]);
+ free(pfile);
+ }
+ return ( file->time[index] );
+ }
+ }
+
+ return (-1);
+}
+
+fortint pbgtime(_fcd filename, fortint * n, fortint filename_len) {
+ return pbgtime_(filename,n,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+fortint pbgstep_(_fcd filename, fortint * n, fortint filename_len) {
+/*
+// Returns timestep of GRIB product n or -1 if n is greater
+// than the number of products in the file, or less than 1.
+*/
+integer index = (*n)-1;
+integer thisFile;
+gribfile * file;
+
+ if( index >= 0 ) {
+ thisFile = pbginitInput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+ if( index < file->count ) {
+ if( DEBUG1 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBGSTEP: timestep of GRIB %d in file %s = %d\n",
+ (index+1), pfile, file->timestep[index]);
+ free(pfile);
+ }
+ return ( file->timestep[index] );
+ }
+ }
+
+ return (-1);
+}
+
+fortint pbgstep(_fcd filename, fortint * n, fortint filename_len) {
+ return pbgstep_(filename,n,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+fortint pbgtype_(_fcd filename, fortint * n, fortint filename_len) {
+/*
+// Returns field type of GRIB product n or -1 if n is greater
+// than the number of products in the file, or less than 1.
+*/
+integer index = (*n)-1;
+integer thisFile;
+gribfile * file;
+
+ if( index >= 0 ) {
+ thisFile = pbginitInput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+ if( index < file->count ) {
+ if( DEBUG1 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBGTYPE: type of GRIB %d in file %s = %d\n",
+ (index+1), pfile, file->type[index]);
+ free(pfile);
+ }
+ return ( file->type[index] );
+ }
+ }
+
+ return (-1);
+}
+
+fortint pbgtype(_fcd filename, fortint * n, fortint filename_len) {
+ return pbgtype_(filename,n,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+fortint pbgstrm_(_fcd filename, fortint * n, fortint filename_len) {
+/*
+// Returns stream of GRIB product n or -1 if n is greater
+// than the number of products in the file, or less than 1.
+*/
+integer index = (*n)-1;
+integer thisFile;
+gribfile * file;
+
+ if( index >= 0 ) {
+ thisFile = pbginitInput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+ if( index < file->count ) {
+ if( DEBUG1 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBGSTRM: stream of GRIB %d in file %s = %d\n",
+ (index+1), pfile, file->stream[index]);
+ free(pfile);
+ }
+ return ( file->stream[index] );
+ }
+ }
+
+ return (-1);
+}
+
+fortint pbgstrm(_fcd filename, fortint * n, fortint filename_len) {
+ return pbgstrm_(filename,n,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+fortint pbgrepr_(_fcd filename, fortint * n, fortint filename_len) {
+/*
+// Returns repres of GRIB product n or -1 if n is greater
+// than the number of products in the file, or less than 1.
+*/
+integer index = (*n)-1;
+integer thisFile;
+gribfile * file;
+
+ if( index >= 0 ) {
+ thisFile = pbginitInput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+ if( index < file->count ) {
+ if( DEBUG1 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBGREPR: repres of GRIB %d in file %s = %d\n",
+ (index+1), pfile, file->repres[index]);
+ free(pfile);
+ }
+ return ( file->repres[index] );
+ }
+ }
+
+ return (-1);
+}
+
+fortint pbgrepr(_fcd filename, fortint * n, fortint filename_len) {
+ return pbgrepr_(filename,n,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+fortint pbglevt_(_fcd filename, fortint * n, fortint filename_len) {
+/*
+// Returns levtype of GRIB product n or -1 if n is greater
+// than the number of products in the file, or less than 1.
+*/
+integer index = (*n)-1;
+integer thisFile;
+gribfile * file;
+
+ if( index >= 0 ) {
+ thisFile = pbginitInput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+ if( index < file->count ) {
+ if( DEBUG1 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBGLEVT: levtype of GRIB %d in file %s = %d\n",
+ (index+1), pfile, file->levtype[index]);
+ free(pfile);
+ }
+ return ( file->levtype[index] );
+ }
+ }
+
+ return (-1);
+}
+
+fortint pbglevt(_fcd filename, fortint * n, fortint filename_len) {
+ return pbglevt_(filename,n,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+fortint pbgfind_(
+ _fcd filename,
+ fortint * param,
+ fortint * level,
+ fortint * date,
+ fortint * time,
+ fortint * step,
+ fortint * n,
+ fortint filename_len) {
+/*
+// Returns the index of the GRIB product with the specified param, level, ..
+// Searching starts after GRIB product n.
+*/
+integer index = (*n);
+integer p = *param, l = *level, d = *date, t = *time, s = *step;
+integer loop;
+integer thisFile;
+gribfile * file;
+
+ if( index >= 0 ) {
+ thisFile = pbginitInput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+
+ for( loop = index; loop < file->count; loop++ ) {
+ if( p == file->parameter[loop] )
+ if( l == file->level[loop] )
+ if( d == file->date[loop] )
+ if( t == file->time[loop] )
+ if( s == file->timestep[loop] )
+ return (loop+1);
+ }
+ }
+
+ return (-1);
+}
+
+fortint pbgfind(
+ _fcd filename,
+ fortint * param,
+ fortint * level,
+ fortint * date,
+ fortint * time,
+ fortint * step,
+ fortint * n,
+ fortint filename_len) {
+ return pbgfind_(filename,param,level,date,time,step,n,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+fortint pbgvfind_(
+ _fcd filename,
+ fortint * param,
+ fortint * level,
+ fortint * vdate,
+ fortint * vtime,
+ fortint * status,
+ fortint * n,
+ fortint filename_len) {
+/*
+// Returns the index of the GRIB product with the specified param, level,
+// verifying data and time (vdate & vtime).
+// Searching starts after GRIB product n.
+//
+// Returns the index of the first match found, or -1 if no match is found.
+// If more than one match is found (eg analysis and forecast fields),
+// status returns the index of the second match; otherwise status = 0.
+*/
+integer index = (*n);
+integer p = *param, l = *level, d = *vdate, t = *vtime;
+integer loop;
+integer thisFile;
+gribfile * file;
+
+ *status = 0;
+
+ if( index >= 0 ) {
+ thisFile = pbginitInput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+
+ for( loop = index; loop < file->count; loop++ ) {
+ if( p == file->parameter[loop] )
+ if( l == file->level[loop] )
+ if( d == file->vdate[loop] )
+ if( t == file->vtime[loop] ) {
+ long innerloop;
+ for( innerloop = loop+1; innerloop < file->count; innerloop++ ) {
+ if( p == file->parameter[innerloop] )
+ if( l == file->level[innerloop] )
+ if( d == file->vdate[innerloop] )
+ if( t == file->vtime[innerloop] )
+ *status = innerloop+1 ;
+ }
+ return (loop+1);
+ }
+ }
+ }
+
+ return (-1);
+}
+
+fortint pbgvfind(
+ _fcd filename,
+ fortint * param,
+ fortint * level,
+ fortint * vdate,
+ fortint * vtime,
+ fortint * status,
+ fortint * n,
+ fortint filename_len) {
+ return pbgvfind_(filename,param,level,vdate,vtime,status,n,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+#define L_PARAM 0
+#define L_LEVEL 1
+#define L_DATE 2
+#define L_TIME 3
+#define L_STEP 4
+#define L_ENSEMBLE 5
+#define L_TYPE 6
+#define L_STREAM 7
+#define L_REPRES 8
+#define L_LEVTYPE 9
+#define L_VDATE 10
+#define L_VTIME 11
+#define L_NI 12
+#define L_NJ 13
+#define L_NLAT 14
+#define L_NLON 15
+#define L_SLAT 16
+#define L_SLON 17
+#define L_DI 18
+#define L_DJ 19
+#define L_SPLAT 20
+#define L_SPLON 21
+#define L_QUASI 22
+
+#define L_PROBSCALE 23
+#define L_PROBINDIC 24
+#define L_PROBLOWER 25
+#define L_PROBUPPER 26
+
+#define L_TUBENUM 23
+#define L_TUBETOT 24
+#define L_TUBEN 25
+#define L_TUBEW 26
+#define L_TUBES 27
+#define L_TUBEE 28
+#define L_TUBESTP 29
+#define L_TUBEFC 30
+
+#define L_CLUSNUM 23
+#define L_CLUSTOT 24
+#define L_CLUSMETH 25
+#define L_CLUSSTP 26
+#define L_CLUSSTPE 27
+#define L_CLUSN 28
+#define L_CLUSW 29
+#define L_CLUSS 30
+#define L_CLUSE 31
+#define L_CLUSOPFC 32
+#define L_CLUSCFFC 33
+#define L_CLUSFC 34
+
+#define L_DIRECTIONNUMBER 23
+#define L_FREQUENCYNUMBER 24
+
+#define L_OPTIMISATIONTIME 23
+#define L_LEADTIME 24
+#define L_SENSITIVEAREADOMAIN 25
+#define L_SENSITIVEAREAMETHOD 26
+
+#define L_VERIFYINGMONTH 23
+#define L_AVERAGINGPERIOD 24
+#define L_FORECASTMONTH 25
+#define L_REFERENCEDATE 26
+#define L_CLIMATEDATEFROM 27
+#define L_CLIMATEDATETO 28
+#define L_THRESHOLDUNITSSCALE 29
+#define L_THRESHOLDINDICATOR 30
+#define L_LOWERTHRESHOLD 31
+#define L_UPPERTHRESHOLD 32
+
+#define L_LOCALDEF 35
+
+#define L_ALIST_LENGTH 12
+#define L_BLIST_LENGTH 36
+
+fortint pbgafind_(
+ _fcd filename,
+ fortint * list,
+ fortint * n,
+ fortint filename_len) {
+/*
+// Returns the index of the GRIB product with the specified param, level, ..
+// Searching starts after GRIB product n.
+*/
+integer index = (*n);
+integer param = list[L_PARAM],
+ level = list[L_LEVEL],
+ date = list[L_DATE],
+ time = list[L_TIME],
+ step = list[L_STEP],
+ ensemble = list[L_ENSEMBLE],
+ type = list[L_TYPE],
+ stream = list[L_STREAM],
+ repres = list[L_REPRES],
+ levtype = list[L_LEVTYPE],
+ vdate = list[L_VDATE],
+ vtime = list[L_VTIME];
+integer loop;
+integer thisFile;
+gribfile * file;
+
+ if( DEBUG1 ) {
+ _fcd pfile;
+ integer loop;
+
+ copyName(&pfile, filename, filename_len);
+ printf("PBGAFIND: searching file %s\n", pfile);
+ free(pfile);
+
+ for( loop = 0; loop < L_ALIST_LENGTH ; loop++ ) {
+ if( list[loop] != MISSING )
+ printf("PBGAFIND: ilist[%d] = %d\n", (loop+1), list[loop] );
+ }
+ }
+
+ if( index >= 0 ) {
+ thisFile = pbginitInput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+
+ for( loop = index; loop < file->count; loop++ ) {
+ if( MATCH(param,file->parameter[loop]) )
+ if( MATCH(level,file->level[loop]) )
+ if( MATCH(date,file->date[loop]) )
+ if( MATCH(time,file->time[loop]) )
+ if( MATCH(step,file->timestep[loop]) )
+ if( MATCH(ensemble,file->number[loop]) )
+ if( MATCH(type,file->type[loop]) )
+ if( MATCH(stream,file->stream[loop]) )
+ if( MATCH(repres,file->repres[loop]) )
+ if( MATCH(levtype,file->levtype[loop]) )
+ if( MATCH(vdate,file->vdate[loop]) )
+ if( MATCH(vtime,file->vtime[loop]) ) {
+ if( DEBUG1 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBGAFIND: matching GRIB found at position %d in file %s\n",
+ (loop+1), pfile);
+ free(pfile);
+ }
+ return (loop+1);
+ }
+ }
+ }
+
+ return (-1);
+}
+
+fortint pbgafind(_fcd filename,fortint* list,fortint* n,fortint filename_len) {
+ return pbgafind_(filename,list,n,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+fortint pbgbfind_(
+ _fcd filename,
+ fortint * list,
+ fortint * n,
+ fortint filename_len) {
+/*
+// Returns the index of the GRIB product with the specified param, level, ..
+// Searching starts after GRIB product n.
+*/
+integer index = (*n);
+integer param = list[L_PARAM],
+ level = list[L_LEVEL],
+ date = list[L_DATE],
+ time = list[L_TIME],
+ step = list[L_STEP],
+ localDef = list[L_LOCALDEF],
+ ensemble = list[L_ENSEMBLE],
+ type = list[L_TYPE],
+ stream = list[L_STREAM],
+ repres = list[L_REPRES],
+ levtype = list[L_LEVTYPE],
+ vdate = list[L_VDATE],
+ vtime = list[L_VTIME],
+ ni = list[L_NI],
+ nj = list[L_NJ],
+ nlat = list[L_NLAT],
+ nlon = list[L_NLON],
+ slat = list[L_SLAT],
+ slon = list[L_SLON],
+ di = list[L_DI],
+ dj = list[L_DJ],
+ splat = list[L_SPLAT],
+ splon = list[L_SPLON],
+ quasi = list[L_QUASI];
+integer tcNumber = MISSING,
+ tcTotal = MISSING,
+ clusterMethod = MISSING,
+ tcStep = MISSING,
+ clusterStepEnd = MISSING,
+ tcNorth = MISSING,
+ tcWest = MISSING,
+ tcSouth = MISSING,
+ tcEast = MISSING,
+ clusterOpFcNumber = MISSING,
+ clusterControlFcNumber = MISSING,
+ tcNumOfFcs = MISSING,
+ probScale = MISSING,
+ probIndicator = MISSING,
+ probLower = MISSING,
+ probUpper = MISSING,
+ directionNumber = MISSING,
+ frequencyNumber = MISSING,
+ optimisationTime = MISSING,
+ leadTime = MISSING,
+ sensitiveAreaDomain = MISSING,
+ sensitiveAreaMethod = MISSING,
+ verifyingMonth = MISSING,
+ averagingPeriod = MISSING,
+ forecastMonth = MISSING,
+ referenceDate = MISSING,
+ climateDateFrom = MISSING,
+ climateDateTo = MISSING,
+ thresholdUnitsScale = MISSING,
+ thresholdIndicator = MISSING,
+ lowerThreshold = MISSING,
+ upperThreshold = MISSING;
+integer loop;
+integer thisFile;
+gribfile * file;
+
+ if( DEBUG1 ) {
+ _fcd pfile;
+ integer loop;
+
+ copyName(&pfile, filename, filename_len);
+ printf("PBGBFIND: searching file %s\n", pfile);
+ free(pfile);
+
+ for( loop = 0; loop < L_BLIST_LENGTH ; loop++ ) {
+ if( list[loop] != MISSING )
+ printf("PBGBFIND: ilist[%d] = %d\n", (loop+1), list[loop] );
+ }
+ }
+
+ if( (type == CLUSTERMEAN) || (type == CLUSTERSD) ) {
+ tcNumber = list[L_CLUSNUM];
+ tcTotal = list[L_CLUSTOT];
+ clusterMethod = list[L_CLUSMETH];
+ tcStep = list[L_CLUSSTP];
+ clusterStepEnd = list[L_CLUSSTPE];
+ tcNorth = list[L_CLUSN];
+ tcWest = list[L_CLUSW];
+ tcSouth = list[L_CLUSS];
+ tcEast = list[L_CLUSE];
+ clusterOpFcNumber = list[L_CLUSOPFC];
+ clusterControlFcNumber = list[L_CLUSCFFC];
+ tcNumOfFcs = list[L_CLUSFC];
+ }
+
+ if( type == TUBETYPE) {
+ tcNumber = list[L_TUBENUM];
+ tcTotal = list[L_TUBETOT];
+ tcStep = list[L_TUBESTP];
+ tcNorth = list[L_TUBEN];
+ tcWest = list[L_TUBEW];
+ tcSouth = list[L_TUBES];
+ tcEast = list[L_TUBEE];
+ tcNumOfFcs = list[L_TUBEFC];
+ }
+
+ if( type == PROBABILITY) {
+ probScale = list[L_PROBSCALE];
+ probIndicator = list[L_PROBINDIC];
+ probLower = list[L_PROBLOWER];
+ probUpper = list[L_PROBUPPER];
+ }
+
+ if( localDef == 13 ) {
+ directionNumber = list[L_DIRECTIONNUMBER];
+ frequencyNumber = list[L_FREQUENCYNUMBER];
+ }
+
+ if( localDef == 21 ) {
+ optimisationTime = list[L_OPTIMISATIONTIME];
+ leadTime = list[L_LEADTIME];
+ sensitiveAreaDomain = list[L_SENSITIVEAREADOMAIN];
+ sensitiveAreaMethod = list[L_SENSITIVEAREAMETHOD];
+ }
+
+ if( localDef == 23 ) {
+ verifyingMonth = list[L_VERIFYINGMONTH];
+ averagingPeriod = list[L_AVERAGINGPERIOD];
+ forecastMonth = list[L_FORECASTMONTH];
+ referenceDate = list[L_REFERENCEDATE];
+ climateDateFrom = list[L_CLIMATEDATEFROM];
+ climateDateTo = list[L_CLIMATEDATETO];
+ thresholdUnitsScale = list[L_THRESHOLDUNITSSCALE];
+ thresholdIndicator = list[L_THRESHOLDINDICATOR];
+ lowerThreshold = list[L_LOWERTHRESHOLD];
+ upperThreshold = list[L_UPPERTHRESHOLD];
+ }
+
+ if( index >= 0 ) {
+ thisFile = pbginitInput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+
+ for( loop = index; loop < file->count; loop++ ) {
+ if( MATCH(param,file->parameter[loop]) )
+ if( MATCH(level,file->level[loop]) )
+ if( MATCH(step,file->timestep[loop]) )
+ if( MATCH(time,file->time[loop]) )
+ if( MATCH(date,file->date[loop]) )
+ if( MATCH(ensemble,file->number[loop]) )
+ if( MATCH(type,file->type[loop]) )
+ if( MATCH(stream,file->stream[loop]) )
+ if( MATCH(repres,file->repres[loop]) )
+ if( MATCH(levtype,file->levtype[loop]) )
+ if( MATCH(vdate,file->vdate[loop]) )
+ if( MATCH(vtime,file->vtime[loop]) )
+ if( MATCH(ni,file->ni[loop]) )
+ if( MATCH(nj,file->nj[loop]) )
+ if( MATCH(nlat,file->nlat[loop]) )
+ if( MATCH(nlon,file->nlon[loop]) )
+ if( MATCH(slat,file->slat[loop]) )
+ if( MATCH(slon,file->slon[loop]) )
+ if( MATCH(di,file->di[loop]) )
+ if( MATCH(dj,file->dj[loop]) )
+ if( MATCH(splat,file->splat[loop]) )
+ if( MATCH(splon,file->splon[loop]) )
+ if( MATCH(quasi,file->quasi[loop]) )
+ if( MATCH(tcNumber,file->tcNumber[loop]) )
+ if( MATCH(tcTotal,file->tcTotal[loop]) )
+ if( MATCH(clusterMethod,file->clusterMethod[loop]) )
+ if( MATCH(tcStep,file->tcStep[loop]) )
+ if( MATCH(clusterStepEnd,file->clusterStepEnd[loop]) )
+ if( MATCH(tcNorth,file->tcNorth[loop]) )
+ if( MATCH(tcWest,file->tcWest[loop]) )
+ if( MATCH(tcSouth,file->tcSouth[loop]) )
+ if( MATCH(tcEast,file->tcEast[loop]) )
+ if( MATCH(clusterOpFcNumber,file->clusterOpFcNumber[loop]) )
+ if( MATCH(clusterControlFcNumber,file->clusterControlFcNumber[loop]) )
+ if( MATCH(tcNumOfFcs,file->tcNumOfFcs[loop]) )
+ if( MATCH(probScale,file->probScale[loop]) )
+ if( MATCH(probIndicator,file->probIndicator[loop]) )
+ if( MATCH(probLower,file->probLower[loop]) )
+ if( MATCH(probUpper,file->probUpper[loop]) )
+ if( MATCH(directionNumber,file->directionNumber[loop]) )
+ if( MATCH(frequencyNumber,file->frequencyNumber[loop]) )
+ if( MATCH(optimisationTime,file->optimisationTime[loop]) )
+ if( MATCH(leadTime,file->leadTime[loop]) )
+ if( MATCH(sensitiveAreaDomain,file->sensitiveAreaDomain[loop]) )
+ if( MATCH(sensitiveAreaMethod,file->sensitiveAreaMethod[loop]) )
+ if( MATCH(verifyingMonth,file->verifyingMonth[loop]) )
+ if( MATCH(averagingPeriod,file->averagingPeriod[loop]) )
+ if( MATCH(forecastMonth,file->forecastMonth[loop]) )
+ if( MATCH(referenceDate,file->referenceDate[loop]) )
+ if( MATCH(climateDateFrom,file->climateDateFrom[loop]) )
+ if( MATCH(climateDateTo,file->climateDateTo[loop]) )
+ if( MATCH(thresholdUnitsScale,file->thresholdUnitsScale[loop]) )
+ if( MATCH(thresholdIndicator,file->thresholdIndicator[loop]) )
+ if( MATCH(lowerThreshold,file->lowerThreshold[loop]) )
+ if( MATCH(upperThreshold,file->upperThreshold[loop]) ) {
+ if( DEBUG1 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBGBFIND: matching GRIB found at position %d in file %s\n",
+ (loop+1), pfile);
+ free(pfile);
+ }
+ return (loop+1);
+ }
+ }
+ }
+
+ return (-1);
+}
+
+fortint pbgbfind(_fcd filename,fortint* list,fortint* n,fortint filename_len) {
+ return pbgbfind_(filename,list,n,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+
+#define INDEX_TOO_BIG -1
+#define FSEEK_ERROR -2
+#define FREAD_ERROR -2
+#define BUFF_TOO_SMALL -3
+
+fortint pbgget_(_fcd filename, fortint * buffer, fortint * bufflen,
+ fortint * n, fortint filename_len) {
+/*
+// Gets the nth GRIB product.
+*/
+integer index = (*n)-1;
+integer length, status;
+OFF_T offset;
+integer thisFile;
+FILE * fp;
+gribfile * file;
+
+ if( DEBUG1 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBGGET: getting GRIB number %d in file %s\n",
+ (index+1), pfile);
+ free(pfile);
+ }
+
+ if( index >= 0 ) {
+ thisFile = pbginitInput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+ if( index < file->count ) {
+
+ length = file->length[index];
+
+ if( DEBUG1 ) printf("PBGGET: length of GRIB number %d = %d\n",
+ (index+1), length);
+
+ if( *bufflen < length ) {
+ fprintf(stderr,
+ "PBGGET: user buffer too small, %d bytes required\n", length);
+ return BUFF_TOO_SMALL;
+ }
+
+ offset = file->offset[index];
+
+ if( DEBUG1 ) printf("PBGGET: offset of GRIB number %d = %d\n",
+ (index+1), offset);
+
+ fp = file->fp;
+#ifdef FOPEN64
+ if( fseeko64( fp, offset, 0) ) {
+#else
+ if( fseek( fp, offset, 0) ) {
+#endif
+ perror("PBGGET: error in fseek");
+ return FSEEK_ERROR;
+ }
+
+ status = fread(buffer, 1, length, fp);
+ if( status != length ) {
+ fprintf(stderr,"PBGGET: error in fread\n");
+ return FREAD_ERROR;
+ }
+
+ return length;
+ }
+ }
+
+ return INDEX_TOO_BIG;
+
+}
+
+fortint pbgget(_fcd filename, fortint * buffer, fortint * bufflen,
+ fortint * n, fortint filename_len) {
+ return pbgget_(filename,buffer,bufflen,n,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+
+#define FWRITE_ERROR -1
+
+fortint pbgput_(_fcd filename, fortint * buffer, fortint * bufflen,
+ fortint filename_len) {
+/*
+// Write an array to a file.
+*/
+integer length;
+integer thisFile;
+FILE * fp;
+gribfile * file;
+
+ if( DEBUG1 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBGPUT: putting %d bytes to file %s\n", *bufflen, pfile);
+ free(pfile);
+ }
+
+ thisFile = pbginitOutput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+
+ fp = file->fp;
+ length = fwrite(buffer, 1, *bufflen, fp);
+
+ if( DEBUG1 ) printf("PBGPUT: number of bytes written = %d\n", length);
+
+ if( length!=(*bufflen) )
+ return FWRITE_ERROR;
+ else
+ return (*bufflen);
+}
+
+fortint pbgput(_fcd filename, fortint * buffer, fortint * bufflen,
+ fortint filename_len) {
+ return pbgput_(filename,buffer,bufflen,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+void pbgclos_(_fcd filename, fortint filename_len) {
+
+ openFiles.removeFile(filename, filename_len);
+ return;
+
+}
+
+void pbgclos(_fcd filename, fortint filename_len) {
+ pbgclos_(filename,filename_len);
+}
+
+/*
+// ****************************************************************
+*/
+integer pbginitInput(_fcd filename, fortint filename_len) {
+/*
+// Initialise indices for current file if necessary.
+*/
+integer thisFile;
+
+ if( DEBUG2 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBG_pbginitInput: checking if file %s already open\n", pfile);
+ free(pfile);
+ }
+
+ thisFile = openFiles.exists(filename,filename_len);
+
+ if( thisFile == -1 ) {
+ if( DEBUG2 ) printf("PBG_pbginitInput: file not yet open\n");
+ return ( openFiles.addRead(filename, filename_len) );
+ }
+
+ if( DEBUG2 ) printf("PBG_pbginitInput: file has open slot %d\n", thisFile);
+ return thisFile;
+
+}
+
+integer pbginitOutput(_fcd filename, fortint filename_len) {
+/*
+// Initialise output file if necessary.
+*/
+integer thisFile;
+
+ if( DEBUG2 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBG_pbginitOutput: checking if file %s already open\n", pfile);
+ free(pfile);
+ }
+
+ thisFile = openFiles.exists(filename,filename_len);
+
+ if( thisFile == -1 ) {
+ if( DEBUG2 ) printf("PBG_pbginitOutput: file not yet open\n");
+ return ( openFiles.addWrite(filename, filename_len) );
+ }
+
+ if( DEBUG2 ) printf("PBG_pbginitOutput: file has open slot %d\n", thisFile);
+ return thisFile;
+
+}
+
+integer exists(_fcd filename , fortint filename_len) {
+integer n;
+_fcd pfile;
+gribfile * file;
+
+
+/*
+// See if DEBUG switched on.
+*/
+ if( ! debugSet ) {
+ debugLevel = getenv("PBG_DEBUG");
+ if( debugLevel == NULL )
+ debugSet = DEBUGOFF; /* off */
+ else {
+ int loop;
+ for( loop = 0; loop < strlen(debugLevel) ; loop++ ) {
+ if( ! isdigit(debugLevel[loop]) ) {
+ printf("Invalid number string in PBG_DEBUG: %s\n", debugLevel);
+ printf("PBG_DEBUG must comprise only digits [0-9].\n");
+ debugSet = DEBUGOFF;
+ }
+ }
+ debugSet = DEBUGOFF + atol( debugLevel );
+ }
+ if( DEBUG2 ) printf("PBG_exists: PBG_DEBUG switched on\n");
+ }
+
+ if( openFiles.count > -1 ) {
+
+ copyName(&pfile, filename, filename_len);
+
+ if( DEBUG2 ) printf("PBG_exists: looking for filename = %s\n", pfile);
+
+ for( n = 0; n <= openFiles.count; n++ ) {
+ file = currentFile(openFiles, n);
+ if( file != 0 ) {
+ if( strcmp( file->fname, pfile ) == 0 ) {
+ free(pfile);
+ if( DEBUG2 ) printf("PBG_exists: file found in slot= %d\n", n);
+ return n;
+ }
+ }
+ }
+
+ free(pfile);
+ }
+ return -1;
+}
+
+integer addFile(_fcd filename , fortint filename_len, char readwriteflag) {
+_fcd pfile;
+char mode[2] = " ";
+FILE * in;
+gribfile * previousLatest, * latest;
+
+ openFiles.count++;
+
+ copyName(&pfile, filename, filename_len);
+
+ if( DEBUG2 ) printf("PBG_addFile: adding filename = %s\n", pfile);
+
+ mode[0] = readwriteflag;
+#ifdef FOPEN64
+ in = fopen64(pfile,mode);
+#else
+ in = fopen(pfile,mode);
+#endif
+ if( in == NULL ) {
+ perror("Error opening file");
+ exit(1);
+ }
+
+ if( openFiles.count == 0 ) {
+ openFiles.files = (gribfile *)malloc(sizeof(gribfile));
+ latest = openFiles.files;
+ }
+ else {
+ previousLatest = latestFile(openFiles);
+ previousLatest->next = (gribfile *)malloc(sizeof(gribfile));
+ latest = previousLatest->next;
+ }
+
+ latest->fp = in;
+ copyName(&(latest->fname),filename,filename_len);
+ latest->readwriteflag = readwriteflag;
+ latest->max = MAX_NUMBER_OF_GRIBS;
+ latest->count = 0;
+
+#define MALLOC(a) (a) = (void *) malloc(space)
+
+ if( readwriteflag == 'r' ) {
+ integer space;
+
+ space = sizeof(OFF_T)*MAX_NUMBER_OF_GRIBS;
+ MALLOC(latest->offset);
+
+ space = sizeof(integer)*MAX_NUMBER_OF_GRIBS;
+ MALLOC(latest->length);
+ MALLOC(latest->parameter);
+ MALLOC(latest->level);
+ MALLOC(latest->date);
+ MALLOC(latest->time);
+ MALLOC(latest->timestep);
+ MALLOC(latest->localDefinitionNumber);
+ MALLOC(latest->type);
+ MALLOC(latest->stream);
+ MALLOC(latest->repres);
+ MALLOC(latest->levtype);
+ MALLOC(latest->number);
+ MALLOC(latest->vdate);
+ MALLOC(latest->vtime);
+ MALLOC(latest->tcNumber);
+ MALLOC(latest->tcTotal);
+ MALLOC(latest->clusterMethod);
+ MALLOC(latest->tcStep);
+ MALLOC(latest->clusterStepEnd);
+ MALLOC(latest->tcNorth);
+ MALLOC(latest->tcWest);
+ MALLOC(latest->tcSouth);
+ MALLOC(latest->tcEast);
+ MALLOC(latest->clusterOpFcNumber);
+ MALLOC(latest->clusterControlFcNumber);
+ MALLOC(latest->tcNumOfFcs);
+ MALLOC(latest->probScale);
+ MALLOC(latest->probIndicator);
+ MALLOC(latest->probLower);
+ MALLOC(latest->probUpper);
+ MALLOC(latest->ni);
+ MALLOC(latest->nj);
+ MALLOC(latest->nlat);
+ MALLOC(latest->nlon);
+ MALLOC(latest->slat);
+ MALLOC(latest->slon);
+ MALLOC(latest->di);
+ MALLOC(latest->dj);
+ MALLOC(latest->splat);
+ MALLOC(latest->splon);
+ MALLOC(latest->quasi);
+ MALLOC(latest->directionNumber);
+ MALLOC(latest->frequencyNumber);
+ MALLOC(latest->optimisationTime);
+ MALLOC(latest->leadTime);
+ MALLOC(latest->sensitiveAreaDomain);
+ MALLOC(latest->sensitiveAreaMethod);
+ MALLOC(latest->verifyingMonth);
+ MALLOC(latest->averagingPeriod);
+ MALLOC(latest->forecastMonth);
+ MALLOC(latest->referenceDate);
+ MALLOC(latest->climateDateFrom);
+ MALLOC(latest->climateDateTo);
+ MALLOC(latest->thresholdUnitsScale);
+ MALLOC(latest->thresholdIndicator);
+ MALLOC(latest->lowerThreshold);
+ MALLOC(latest->upperThreshold);
+ }
+
+ latest->next = 0;
+
+ if( DEBUG2 ) printf("PBG_addFile: adding file %s in slot = %d\n",
+ pfile, openFiles.count);
+
+ free(pfile);
+ return openFiles.count;
+
+}
+
+void removeFile(_fcd filename , fortint filename_len) {
+integer thisFile;
+int status;
+
+ if( DEBUG2 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBG_removeFile: trying to remove filename = %s\n", pfile);
+ free(pfile);
+ }
+
+ thisFile = openFiles.exists(filename,filename_len);
+
+ if( thisFile != -1 ) {
+ integer index;
+ gribfile * previous = openFiles.files;
+ gribfile * current;
+
+ current = previous;
+
+ for( index = 0; index < thisFile; index++ ) {
+ previous = current;
+ current = current->next;
+ }
+
+ status = fclose(current->fp);
+ if( status != 0 ) {
+ perror("Error closing file");
+ exit(1);
+ }
+ if( DEBUG2 ) printf("PBG_removeFile: removing file %s from slot %d\n",
+ current->fname, thisFile);
+ free(current->fname);
+
+/*
+// Input files have arrays of values
+*/
+ if( current->readwriteflag == 'r' ) {
+ free(current->offset);
+ free(current->length);
+ free(current->parameter);
+ free(current->level);
+ free(current->date);
+ free(current->time);
+ free(current->timestep);
+ free(current->localDefinitionNumber);
+ free(current->type);
+ free(current->stream);
+ free(current->repres);
+ free(current->levtype);
+ free(current->number);
+ free(current->vdate);
+ free(current->vtime);
+ free(current->tcNumber);
+ free(current->tcTotal);
+ free(current->clusterMethod);
+ free(current->tcStep);
+ free(current->clusterStepEnd);
+ free(current->tcNorth);
+ free(current->tcWest);
+ free(current->tcSouth);
+ free(current->tcEast);
+ free(current->clusterOpFcNumber);
+ free(current->clusterControlFcNumber);
+ free(current->tcNumOfFcs);
+ free(current->probScale);
+ free(current->probIndicator);
+ free(current->probLower);
+ free(current->probUpper);
+ free(current->ni);
+ free(current->nj);
+ free(current->nlat);
+ free(current->nlon);
+ free(current->slat);
+ free(current->slon);
+ free(current->di);
+ free(current->dj);
+ free(current->splat);
+ free(current->splon);
+ free(current->quasi);
+ free(current->directionNumber);
+ free(current->frequencyNumber);
+ free(current->optimisationTime);
+ free(current->leadTime);
+ free(current->sensitiveAreaDomain);
+ free(current->sensitiveAreaMethod);
+ free(current->verifyingMonth);
+ free(current->averagingPeriod);
+ free(current->forecastMonth);
+ free(current->referenceDate);
+ free(current->climateDateFrom);
+ free(current->climateDateTo);
+ free(current->thresholdUnitsScale);
+ free(current->thresholdIndicator);
+ free(current->lowerThreshold);
+ free(current->upperThreshold);
+ }
+
+ if( thisFile == 0 )
+ openFiles.files = (current->next);
+ else
+ previous->next = (current->next);
+ free(current);
+
+ openFiles.count--;
+ }
+}
+
+integer addRead(_fcd filename , fortint filename_len) {
+integer thisFile;
+
+ if( DEBUG2 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBG_addRead: add for reading filename = %s\n", pfile);
+ free(pfile);
+ }
+
+ thisFile = addFile(filename,filename_len,'r');
+
+ pbgindx( thisFile);
+
+ return thisFile;
+}
+
+integer addWrite(_fcd filename , fortint filename_len) {
+integer thisFile;
+
+ if( DEBUG2 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBG_addWrite: add for writing filename = %s\n", pfile);
+ free(pfile);
+ }
+
+ thisFile = addFile(filename,filename_len,'w');
+
+ return thisFile;
+}
+
+void copyName(_fcd * pfile, _fcd filename, fortint filename_len) {
+/*
+// Copies FORTRAN filename to C string.
+*/
+char * blankCharacterPointer;
+integer space;
+
+ *pfile = (char *) malloc((size_t) (filename_len+1) );
+ memcpy(*pfile, filename, (size_t) filename_len);
+ space = (integer) filename_len;
+ (*pfile)[space] = '\0';
+
+ blankCharacterPointer = strchr(filename, ' ');
+ if( blankCharacterPointer != NULL ) {
+ space = (integer) (blankCharacterPointer - filename);
+ (*pfile)[space] = '\0';
+ }
+
+ return;
+}
+
+gribfile * latestFile(collection openFiles) {
+integer index;
+gribfile * last = openFiles.files;
+
+ for( index = 1; index < openFiles.count; index++ )
+ last = last->next;
+
+ return last;
+
+}
+
+gribfile * currentFile(collection openFiles, integer thisFile) {
+integer index;
+gribfile * current = openFiles.files;
+
+ for( index = 0; index < thisFile; index++ )
+ current = current->next;
+
+ return current;
+}
+
+#ifdef gribAPI
+long Julian_to_date(long jdate) {
+#else
+long julian_to_date(long jdate) {
+#endif
+long x,y,d,m,e;
+long day,month,year;
+
+ x = 4 * jdate - 6884477;
+ y = (x / 146097) * 100;
+ e = x % 146097;
+ d = e / 4;
+
+ x = 4 * d + 3;
+ y = (x / 1461) + y;
+ e = x % 1461;
+ d = e / 4 + 1;
+
+ x = 5 * d - 3;
+ m = x / 153 + 1;
+ e = x % 153;
+ d = e / 5 + 1;
+
+ if( m < 11 )
+ month = m + 2;
+ else
+ month = m - 10;
+
+ day = d;
+ year = y + m / 11;
+
+ return year * 10000 + month * 100 + day;
+}
+
+#ifdef gribAPI
+long date_to_Julian(long ddate) {
+#else
+long date_to_julian(long ddate) {
+#endif
+long m1,y1,a,b,c,d,j1;
+long month,day,year;
+
+ year = ddate / 10000;
+ ddate %= 10000;
+ month = ddate / 100;
+ ddate %= 100;
+ day = ddate;
+
+
+ if (year < 100) year = year + 1900;
+
+ if (month > 2)
+ {
+ m1 = month - 3;
+ y1 = year;
+ }
+ else
+ {
+ m1 = month + 9;
+ y1 = year - 1;
+ }
+
+ a = 146097*(y1/100)/4;
+ d = y1 % 100;
+ b = 1461*d/4;
+ c = (153*m1+2)/5+day+1721119;
+ j1 = a+b+c;
+
+ return(j1);
+}
+
+fortint pbggeth012_(_fcd,fortint*,fortint,fortint,fortint);
+fortint soffset012_(unsigned char*,fortint*,fortint*,fortint*);
+
+#define XFIND_ERROR -1
+
+fortint pbgxfind_(fortint * grib1, _fcd filename, fortint filename_len)
+{
+unsigned char* buffer1 = (unsigned char*) grib1;
+static fortint* ibuffer2 = NULL;
+static fortint buffer2Length = 0;
+fortint status, totalLength, headerLength, numberOfGribs, loop;
+fortint is0, is1, is2;
+fortint js0, js1, js2;
+
+ numberOfGribs = pbgtotl_(filename,filename_len);
+ if( numberOfGribs < 1 ) {
+ if( DEBUG1 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("PBXFIND: No GRIBs in file %s\n", pfile);
+ free(pfile);
+ }
+ return XFIND_ERROR;
+ }
+
+ status = soffset012_(buffer1, &is0, &is1, &is2);
+ if( status ) return XFIND_ERROR;
+
+ totalLength = THREEBYTELONG(buffer1+is0+4);
+ headerLength = (is1 - is0);
+ headerLength += THREEBYTELONG(buffer1+is1);
+ if( is2 != 0 ) headerLength += THREEBYTELONG(buffer1+is2);
+
+ for( loop = 0; loop < numberOfGribs; loop++) {
+ fortint next, totalLength2, headerLength2;
+ unsigned char * buffer2;
+
+ next = loop + 1;
+
+ if( ibuffer2 != NULL ) {
+ if( buffer2Length < headerLength ) {
+ ibuffer2 = (fortint*) realloc(ibuffer2,headerLength);
+ if( ibuffer2 == NULL ) {
+ printf("pbgxfind_: realloc failed\n");
+ return XFIND_ERROR;
+ }
+ buffer2Length = headerLength;
+ }
+ }
+ else {
+ ibuffer2 = (fortint*) malloc(headerLength);
+ if( ibuffer2 == NULL ) {
+ printf("pbgxfind_: malloc failed\n");
+ return XFIND_ERROR;
+ }
+ buffer2Length = headerLength;
+ }
+
+ totalLength2 =
+ pbggeth012_(filename,ibuffer2,buffer2Length,next,filename_len);
+
+ if( totalLength2 > 1 ) {
+
+ buffer2 = (unsigned char*) ibuffer2;
+ status = soffset012_(buffer2, &js0, &js1, &js2);
+ if( status ) return XFIND_ERROR;
+
+ if( totalLength == totalLength2 ) {
+ headerLength2 = (js1 - js0);
+ headerLength2 += THREEBYTELONG(buffer2+js1);
+ if( js2 != 0 ) headerLength2 += THREEBYTELONG(buffer2+js2);
+
+ if( headerLength == headerLength2 ) {
+ if( (memcmp((buffer1+is0),(buffer2+js0),(size_t)headerLength) == 0) )
+ return next;
+ }
+ }
+ }
+
+ }
+
+ return XFIND_ERROR;
+}
+
+fortint pbgxfind(fortint * grib1, _fcd filename, fortint filename_len) {
+ return pbgxfind_(grib1,filename,filename_len);
+}
+
+#define GRIB_TOO_SMALL -4
+
+fortint pbggeth012_(_fcd filename, fortint* buffer, fortint bufflen,
+ fortint n, fortint filename_len) {
+/*
+// Gets section 0,1 and 2 for the nth GRIB product.
+*/
+integer index = n - 1;
+integer length, status;
+OFF_T offset;
+integer thisFile;
+FILE * fp;
+gribfile * file;
+
+ if( DEBUG1 ) {
+ _fcd pfile;
+ copyName(&pfile, filename, filename_len);
+ printf("pbggeth012: getting GRIB number %d in file %s\n",
+ (index+1), pfile);
+ free(pfile);
+ }
+
+ if( index >= 0 ) {
+ thisFile = pbginitInput(filename,filename_len);
+ file = currentFile(openFiles, thisFile);
+ if( index < file->count ) {
+
+ length = file->length[index];
+
+ if( DEBUG1 ) printf("pbggeth012: length of GRIB number %d = %d\n",
+ (index+1), length);
+
+ if( length < bufflen ) return GRIB_TOO_SMALL;
+
+ offset = file->offset[index];
+
+ if( DEBUG1 ) printf("pbggeth012: offset of GRIB number %d = %d\n",
+ (index+1), offset);
+
+ fp = file->fp;
+#ifdef FOPEN64
+ if( fseeko64( fp, offset, 0) ) {
+#else
+ if( fseek( fp, offset, 0) ) {
+#endif
+ perror("pbggeth012: error in fseek");
+ return FSEEK_ERROR;
+ }
+
+ status = fread(buffer, 1, bufflen, fp);
+ if( status != bufflen ) {
+ fprintf(stderr,"pbggeth012: error in fread\n");
+ return FREAD_ERROR;
+ }
+
+ return length;
+ }
+ }
+
+ return INDEX_TOO_BIG;
+
+}
+
+#define ERROR(a,b) {perror(a);return b;}
+#define GRIB 0x47524942
+#define len3oct(p) ((((long)*(p))<<16) + (((long)*(p+1))<<8) + (long)*(p+2))
+#define BIT1 0x80
+#define BIT2 0x40
+#define BIT3 0x20
+#define BIT4 0x10
+#define BIT5 0x08
+#define BIT6 0x04
+#define BIT7 0x02
+#define BIT8 0x01
+
+static int grab(unsigned char * , unsigned char * , long ,long ,long * );
+
+fortint soffset012_(
+ unsigned char * buffer,
+ fortint* is0,
+ fortint* is1,
+ fortint* is2 ) {
+long s0, s1, s2, edition;
+int large = 0;
+int found = 0;
+int code = 0;
+long bytes_read = 0, advance;
+unsigned char p, edit_num, flag23;
+unsigned char size[3];
+int section0 = 8, section1, section2;
+long total;
+
+/*
+// Read bytes until "GRIB" found
+*/
+ do {
+ if( grab(buffer, &p, 1, 1, &bytes_read) != 0) return 1;
+ code = ( (code << 8) + p ) & 0xFFFFFFFF;
+ if (code == GRIB ) found = 1;
+ } while ( ! found );
+ s0 = bytes_read - 4;
+ bytes_read = 4;
+/*
+// Now find out which edition of GRIB is present (default is 1)
+*/
+ edition = 1;
+ s1 = s0 + 8;
+ if( (*(buffer+21-s0) == '\0') && (*(buffer+22-s0) == '\0') ) {
+ edition = -1; /* GRIB edition -1 */
+ s1 = s0;
+ section1 = 20;
+ section0 = 4;
+ }
+ else {
+ if( grab(buffer, size, 3, 1, &bytes_read) != 0) return 1;
+ total = len3oct(size);
+ if( total == 24 ) {
+/*
+// Move past the edition number
+*/
+ if( grab(buffer, &edit_num, 1, 1, &bytes_read) != 0) return 1;
+ edition = 0; /* GRIB edition 0 */
+ section1 = 24;
+ s1 = s0 + 4;
+ section0 = 4;
+ }
+ }
+
+ if( edition == 1 ) {
+/*
+// See if it is an extra large (wave) product
+*/
+ if( total > 0x800000 ) {
+ total = (total&0x7fffff) * 120;
+ large = 1;
+ }
+/*
+// Move past the edition number
+*/
+ if( grab(buffer, &edit_num, 1, 1, &bytes_read) != 0) return 1;
+/*
+// Read length of section 1
+*/
+ if( grab(buffer, size, 3, 1, &bytes_read) != 0) return 1;
+ section1 = len3oct(size);
+ }
+/*
+// Now figure out if section 2 is present
+*/
+ advance = 4;
+ bytes_read += advance;
+ if( grab(buffer, &flag23, 1, 1, &bytes_read) != 0) return 1;
+ section2 = flag23 & BIT1;
+
+/*
+// Advance to end of section 1
+*/
+ advance = section1 - (bytes_read - section0);
+ bytes_read += advance;
+/*
+// Read section 2 length if it is given
+*/
+ if( section2 ) {
+ s2 = s0 + bytes_read;
+ if( grab(buffer, size, 3, 1, &bytes_read) != 0) return 1;
+ section2 = len3oct(size);
+ advance = section2 - (bytes_read - section0 - section1);
+ bytes_read += advance;
+ }
+ else {
+ section2 = 0;
+ s2 = 0;
+ }
+/*
+// Success!
+*/
+ *is0 = (fortint) s0;
+ *is1 = (fortint) s1;
+ *is2 = (fortint) s2;
+ return 0;
+}
+
+static int grab(unsigned char * buffer, unsigned char * where, long size,long cnt,long * num_bytes_read)
+{
+long number = size*cnt;
+
+ memcpy(where, (buffer+(*num_bytes_read)), number);
+ *num_bytes_read += number;
+
+ return 0;
+}
diff --git a/pbio/PBGroutines.h b/pbio/PBGroutines.h
new file mode 100755
index 0000000..9423c49
--- /dev/null
+++ b/pbio/PBGroutines.h
@@ -0,0 +1,192 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef PBG_ROUTINES_H
+#define PBG_ROUTINES_H
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef FOPEN64
+extern FILE *fopen64(const char *,const char *);
+#define OFF_T off64_t
+extern OFF_T ftello64(FILE *);
+#else
+#define OFF_T off_t
+#endif
+
+#define _fcd char *
+#define fortint int
+#define integer int
+#define bool int
+
+#define MAX_NUMBER_OF_GRIBS 100
+
+typedef struct gribfile {
+
+ FILE * fp;
+ _fcd fname;
+ char readwriteflag;
+ integer max;
+ integer count;
+ OFF_T * offset;
+ integer * length;
+ integer * parameter;
+ integer * level;
+ integer * date;
+ integer * time;
+ integer * timestep;
+ integer * localDefinitionNumber;
+ integer * type;
+ integer * stream;
+ integer * repres;
+ integer * levtype;
+ integer * number;
+ integer * vdate;
+ integer * vtime;
+ integer * tcNumber;
+ integer * tcTotal;
+ integer * clusterMethod;
+ integer * tcStep;
+ integer * clusterStepEnd;
+ integer * tcNorth;
+ integer * tcWest;
+ integer * tcSouth;
+ integer * tcEast;
+ integer * clusterOpFcNumber;
+ integer * clusterControlFcNumber;
+ integer * tcNumOfFcs;
+ integer * probScale;
+ integer * probIndicator;
+ integer * probLower;
+ integer * probUpper;
+ integer * ni;
+ integer * nj;
+ integer * nlat;
+ integer * nlon;
+ integer * slat;
+ integer * slon;
+ integer * di;
+ integer * dj;
+ integer * splat;
+ integer * splon;
+ integer * quasi;
+ integer * directionNumber;
+ integer * frequencyNumber;
+ integer * optimisationTime;
+ integer * leadTime;
+ integer * sensitiveAreaDomain;
+ integer * sensitiveAreaMethod;
+ integer * verifyingMonth;
+ integer * averagingPeriod;
+ integer * forecastMonth;
+ integer * referenceDate;
+ integer * climateDateFrom;
+ integer * climateDateTo;
+ integer * thresholdUnitsScale;
+ integer * thresholdIndicator;
+ integer * lowerThreshold;
+ integer * upperThreshold;
+
+ struct gribfile *next;
+
+}gribfile;
+
+typedef struct collection {
+
+ integer (* exists)(_fcd , fortint);
+ integer (* addRead)(_fcd , fortint);
+ integer (* addWrite)(_fcd , fortint);
+ void (* removeFile)(_fcd , fortint);
+
+ integer count;
+ integer max;
+ struct gribfile * files;
+
+}collection;
+
+
+/*
+// Prototypes
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+fortint pbgtotl(_fcd filename, fortint filename_len);
+fortint pbgtotl_(_fcd filename, fortint filename_len);
+fortint pbgleng(_fcd filename, fortint * n, fortint filename_len);
+fortint pbgleng_(_fcd filename, fortint * n, fortint filename_len);
+fortint pbgoffs(_fcd filename, fortint * n, fortint filename_len);
+fortint pbgoffs_(_fcd filename, fortint * n, fortint filename_len);
+fortint pbgparm(_fcd filename, fortint * n, fortint filename_len);
+fortint pbgparm_(_fcd filename, fortint * n, fortint filename_len);
+fortint pbglevl(_fcd filename, fortint * n, fortint filename_len);
+fortint pbglevl_(_fcd filename, fortint * n, fortint filename_len);
+fortint pbgdate(_fcd filename, fortint * n, fortint filename_len);
+fortint pbgdate_(_fcd filename, fortint * n, fortint filename_len);
+fortint pbgtime(_fcd filename, fortint * n, fortint filename_len);
+fortint pbgtime_(_fcd filename, fortint * n, fortint filename_len);
+fortint pbgstep(_fcd filename, fortint * n, fortint filename_len);
+fortint pbgstep_(_fcd filename, fortint * n, fortint filename_len);
+fortint pbgtype(_fcd filename, fortint * n, fortint filename_len);
+fortint pbgtype_(_fcd filename, fortint * n, fortint filename_len);
+fortint pbgstrm(_fcd filename, fortint * n, fortint filename_len);
+fortint pbgstrm_(_fcd filename, fortint * n, fortint filename_len);
+fortint pbgrepr(_fcd filename, fortint * n, fortint filename_len);
+fortint pbgrepr_(_fcd filename, fortint * n, fortint filename_len);
+fortint pbglevt(_fcd filename, fortint * n, fortint filename_len);
+fortint pbglevt_(_fcd filename, fortint * n, fortint filename_len);
+fortint pbgfind(_fcd filename,
+ fortint * param, fortint * level, fortint * date,
+ fortint * time, fortint * step, fortint * n,
+ fortint filename_len);
+fortint pbgfind_(_fcd filename,
+ fortint * param, fortint * level, fortint * date,
+ fortint * time, fortint * step, fortint * n,
+ fortint filename_len);
+fortint pbgafind(_fcd filename, fortint * list, fortint * n,
+ fortint filename_len);
+fortint pbgafind_(_fcd filename, fortint * list, fortint * n,
+ fortint filename_len);
+fortint pbgbfind(_fcd filename, fortint * list, fortint * n,
+ fortint filename_len);
+fortint pbgbfind_(_fcd filename, fortint * list, fortint * n,
+ fortint filename_len);
+fortint pbgvfind(_fcd filename,
+ fortint * param, fortint * level, fortint * vdate,
+ fortint * vtime, fortint * status, fortint * n,
+ fortint filename_len);
+fortint pbgvfind_(_fcd filename,
+ fortint * param, fortint * level, fortint * vdate,
+ fortint * vtime, fortint * status, fortint * n,
+ fortint filename_len);
+fortint pbgxfind_(fortint * grib1, _fcd filename, fortint filename_len);
+fortint pbgxfind(fortint * grib1, _fcd filename, fortint filename_len);
+
+fortint pbgget(_fcd filename, fortint * buffer, fortint * bufflen,
+ fortint * n, fortint filename_len);
+fortint pbgget_(_fcd filename, fortint * buffer, fortint * bufflen,
+ fortint * n, fortint filename_len);
+
+fortint pbgput(_fcd filename, fortint * buffer, fortint * bufflen,
+ fortint filename_len);
+fortint pbgput_(_fcd filename, fortint * buffer, fortint * bufflen,
+ fortint filename_len);
+
+void pbgclos(_fcd filename, fortint filename_len);
+void pbgclos_(_fcd filename, fortint filename_len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* end of PBG_ROUTINES_H */
diff --git a/pbio/README b/pbio/README
new file mode 100755
index 0000000..98d0488
--- /dev/null
+++ b/pbio/README
@@ -0,0 +1,657 @@
+
+ /cc/od/metapps/src/lib/emos/pbio/README
+
+
+ i) FORTRAN
+ -------
+
+ This file describes a number of subroutines which can be called
+ from FORTRAN to handle an unblocked binary file:
+
+ PBGRIB to read GRIB products
+ PBBUFR to read BUFR products
+ PBOPEN to open the file (must be used before the other
+ routines are called)
+ PBCLOSE to close the file
+ PBSEEK to position the file (optional)
+ PBREAD to read from the file
+ PBREAD2 to read from the file (different behaviour on hitting
+ end-of-file)
+ PBWRITE to write to the file
+
+ The subroutines are written in C and use standard library functions
+ for file handling (fopen, fclose, fseek, fread and fwrite).
+
+
+
+ ii) C
+ _
+
+ There are three additional C functions to handle unblocked binary files:
+
+ readgrib to read GRIB products
+ readbufr to read BUFR products
+ readnext to read any mixture of products
+
+ These functions are written in C and use standard library functions
+ for file handling (fopen, fclose, fseek, fread and fwrite).
+
+
+
+
+
+ iii) LIBRARIES
+ ---------
+
+ A library (libemos.a) has been made for the BUFR and GRIB binary
+ file reading and writing routines. It is planned to put future
+ software updates into libemos.a and make no changes to the original
+ emoslib.a.
+
+ The original emoslib.a library ( /home/ecmwf/emos_sms/lib/emoslib.a )
+ still exists and still contains the original BUFR/GRIB handling
+ routines.
+
+
+ One set of the binary read/write sources is maintained, hard-linked
+ into the three directories:
+
+ /home/ecmwf/emos_sms/src/libemos/sun4
+
+ /home/ecmwf/emos_sms/src/libemos/sgimips
+
+ /home/ecmwf/emos_sms/src/libemos/unicos
+
+
+ An object library containing the routines has been made for CRAY,
+ SGI and SUN:
+
+ /usr/local/lib/libemos.a
+
+
+ The library names follow the normal UNIX convention and can be
+ specified in the compile/link command using the standard ld
+ convention, for example:
+
+ cc -o program program.c -lemos
+
+
+
+
+
+ PBGRIB
+ ------
+
+ A subroutine which can be called from FORTRAN to retrieve GRIB
+ products from an unblocked binary file. The subroutine is an
+ interface to a set of C routines which handle the binary file
+ as a stream of bytes.
+
+ The GRIB products are delivered one per call to a user array. The
+ format and arguments for the subroutine are as follows:
+
+
+ SUBROUTINE PBGRIB(KUNIT,KARRAY,KINLEN,KOUTLEN,KRET)
+
+ where:
+
+
+ Input parameters are INTEGERs:
+ -----
+
+ KUNIT = unit number for the file; this must have been
+ obtained by calling PBOPEN (see below) - it is
+ a C FILE pointer and not a FORTRAN unit number.
+
+ KARRAY = FORTRAN array big enough to hold the GRIB product.
+
+ KINLEN = size in BYTES of the FORTRAN array.
+
+
+ Output parameters are INTEGERs:
+ ------
+
+ KOUTLEN = actual size in BYTES of the GRIB product read into
+ KARRAY.
+
+ KRET = 0 if a GRIB product has been successfully read.
+
+ -1 if end-of-file is hit before a GRIB product is read.
+ (Note that EOF does not cause a program fail, so
+ this value must be explicitly caught by the caller
+ to avoid looping at the EOF)
+
+ -2 if there is an error in the file-handling (eg. if
+ the file contains a truncated GRIB product).
+
+ -3 if the size of KARRAY is not sufficient for the
+ GRIB product.
+
+
+
+
+
+
+
+ PBBUFR
+ ------
+
+ A subroutine which can be called from FORTRAN to retrieve BUFR
+ products from an unblocked binary file. The subroutine is an
+ interface to a set of C routines which handle the binary file
+ as a stream of bytes.
+
+ The BUFR products are delivered one per call to a user array. The
+ format and arguments for the subroutine are as follows:
+
+
+ SUBROUTINE PBBUFR(KUNIT,KARRAY,KINLEN,KOUTLEN,KRET)
+
+ where:
+
+
+ Input parameters are INTEGERs:
+ -----
+
+ KUNIT = unit number for the file; this must have been
+ obtained by calling PBOPEN (see below) - it is
+ a C FILE pointer and not a FORTRAN unit number.
+
+ KARRAY = FORTRAN array big enough to hold the BUFR product.
+
+ KINLEN = size in BYTES of the FORTRAN array.
+
+
+ Output parameters are INTEGERs:
+ ------
+
+ KOUTLEN = actual size in BYTES of the BUFR product read into
+ KARRAY.
+
+ KRET = 0 if a BUFR product has been successfully read.
+
+ -1 if end-of-file is hit before a BUFR product is read.
+ (Note that EOF does not cause a program fail, so
+ this value must be explicitly caught by the caller
+ to avoid looping at the EOF)
+
+ -2 if there is an error in the file-handling (eg. if
+ the file contains a truncated BUFR product).
+
+ -3 if the size of KARRAY is not sufficient for the
+ BUFR product.
+
+
+
+
+
+
+
+
+ readgrib
+ --------
+
+ A C function which can be invoked to retrieve GRIB products from
+ an unblocked binary file.
+
+ The GRIB products are delivered one per call to a user array. The
+ format and arguments for the function are as follows:
+
+
+ long readgrib(FILE * file, char * buffer, long * grib_prod_len)
+
+
+ file = file pointer returned from PBOPEN
+
+ buffer = buffer big enough to hold the GRIB product
+
+ grib_prod_len = size of the buffer on input, becomes size in BYTES of
+ the GRIB product read. If the end-of-file is hit, the
+ value is returned unchanged (ie. when the function
+ return code is -1).
+
+
+ Function returns:
+
+ 0 if a GRIB product has been successfully read
+
+ -1 if end-of-file is hit before a GRIB product is read
+ (Note that EOF does not cause a program fail, so
+ this value must be explicitly caught by the caller
+ to avoid looping at the EOF)
+
+ -2 if there is an error in the file-handling
+ (eg. if the file contains a truncated GRIB product)
+
+ -3 if the size of buffer is not sufficient for the GRIB product.
+ In this case, the buffer is filled with bytes from the product
+ and the file is positioned at the beginning of the following
+ product, if any.
+
+ -4 if the user buffer is too small to allow any processing of the
+ product at all (eg. less than 8 bytes long)
+
+
+ If the second parameter is a NULL pointer, the function will pass
+ back the length of the next product and will position the file on
+ the byte following the end of the product.
+
+
+
+
+ readbufr
+ --------
+
+ A C function which can be invoked to retrieve BUFR products from
+ an unblocked binary file.
+
+ The BUFR products are delivered one per call to a user array. The
+ format and arguments for the function are as follows:
+
+
+ long readbufr(FILE * file, char * buffer, long * bufr_prod_len)
+
+
+ file = file pointer returned from PBOPEN
+
+ buffer = buffer big enough to hold the BUFR product
+
+ bufr_prod_len = size of the buffer on input, becomes size in BYTES of
+ the BUFR product read. If the end-of-file is hit, the
+ value is returned unchanged (ie. when the function
+ return code is -1).
+
+
+ Function returns:
+
+ 0 if a BUFR product has been successfully read
+
+ -1 if end-of-file is hit before a BUFR product is read
+ (Note that EOF does not cause a program fail, so
+ this value must be explicitly caught by the caller
+ to avoid looping at the EOF)
+
+ -2 if there is an error in the file-handling
+ (eg. if the file contains a truncated BUFR product)
+
+ -3 if the size of buffer is not sufficient for the BUFR product.
+ In this case, the buffer is filled with bytes from the product
+ and the file is positioned at the beginning of the following
+ product, if any.
+
+ -4 if the user buffer is too small to allow any processing of the
+ product at all (eg. less than 8 bytes long)
+
+
+ If the second parameter is a NULL pointer, the function will pass
+ back the length of the next product and will position the file on
+
+
+
+
+ readnext
+ --------
+
+ A C function which can be invoked to retrieve GRIB or BUFR products
+ from an unblocked binary file.
+
+ The products are delivered one per call to a user array. The
+ format and arguments for the function are as follows:
+
+
+ long readnext(char * buffer, long * prod_len,
+ long (*read_func)(char *, long , void *), void * stream)
+
+ Where:
+ ------
+
+ buffer = buffer big enough to hold the GRIB product.
+ If buffer = NULL, the function will create its own
+ internal buffer and will return the length of the
+ product, but not the product itself.
+
+ prod_len = size of the buffer on input, becomes size in BYTES of
+ the product read. If the end-of-file is hit, this
+ value is returned unchanged (ie. when the function
+ return code is -1).
+
+ read_func = function to read input stream
+
+ stream = data for read_function, eg. file pointer returned
+ from PBOPEN
+
+
+ If the second parameter is a NULL pointer, the function will pass
+ back the length of the next product and will position the file on
+ the byte following the end of the product.
+
+
+
+ Function returns:
+
+ 0 if a product has been successfully read
+
+ -1 if end-of-file is hit before a product is read
+
+ -3 if the size of buffer is not sufficient for the product
+
+ -4 if the user buffer is too small to start processing product
+
+
+
+
+
+ PBOPEN
+ ------
+
+ A subroutine which can be called from FORTRAN to open an unblocked
+ binary file and return a suitable unit number for use in calls to
+ PBGRIB, PBBUFR, PBSEEK, PBREAD, PBREAD2 and PBWRITE.
+
+ The format and arguments for the subroutine are as follows:
+
+ SUBROUTINE PBOPEN(KUNIT,FILENAME,MODE,KRET)
+
+ where:
+
+
+ Input parameters are CHARACTERs:
+ -----
+
+ FILENAME = a character string describing the file
+
+ MODE = a character string describing the mode of
+ access to the file:
+ r for read
+ w for write
+ a for append
+
+
+
+ Output parameters are INTEGERs:
+ ------
+
+ KUNIT = unit number for the file - it is a C FILE pointer
+ and not a FORTRAN unit number.
+
+ KRET = -1 = Could not open file.
+ -2 = Invalid file name.
+ -3 = Invalid open mode specified
+ 0 = OK.
+
+
+
+
+
+
+
+
+ PBCLOSE
+ -------
+
+ A subroutine which can be called from FORTRAN to close an unblocked
+ binary file previously opened with PBOPEN.
+
+ The format and arguments for the subroutine are as follows:
+
+ SUBROUTINE PBCLOSE(KUNIT,KRET)
+
+ where:
+
+
+ Input parameter is an INTEGER:
+ -----
+
+ KUNIT = unit number for the file; this must have been
+ obtained by calling PBOPEN (see below) - it is
+ a C FILE pointer and not a FORTRAN unit number.
+
+
+
+ Output parameter is an INTEGER:
+ ------
+
+ KRET = -1 error in handling the file.
+ 0 = OK.
+
+
+
+
+
+
+ PBSEEK
+ ------
+
+ A subroutine which can be called from FORTRAN to position an
+ unblocked binary file at any desired byte position.
+
+ The format and arguments for the subroutine are as follows:
+
+ SUBROUTINE PBSEEK(KUNIT,KOFFSET,KSTART,KRET)
+
+ where:
+
+
+ Input parameters are INTEGERs:
+ -----
+
+ KUNIT = unit number for the file; this must have been
+ obtained by calling PBOPEN (see below) - it is
+ a C FILE pointer and not a FORTRAN unit number.
+
+ KOFFSET = number of bytes to offset the file; this is used
+ as either an absolute or relative offset depending
+ on the value of KSTART.
+
+ KSTART = 0 if KOFFSET is an absolute count from the
+ beginning of the file,
+
+ 1 if KOFFSET is a relative offset from the
+ current byte position in the file,
+
+ 2 if KOFFSET is an absolute offset from the
+ end of file.
+
+
+ Output parameter is an INTEGER:
+ ------
+
+ KRET = -2 if there is an error in handling the file
+
+ -1 if end-of-file is encountered
+ (Note that EOF does not cause a program fail,
+ so this value must be explicitly caught by
+ the caller to avoid looping at the EOF)
+
+ >= 0 byte offset from the start of file after
+ positioning.
+
+
+
+
+
+
+
+ PBREAD
+ ------
+
+ A subroutine which can be called from FORTRAN to read a block of
+ bytes from an unblocked binary file. ( Note that this routine
+ behaves differently from PBREAD2 on hitting end-of-file. )
+
+ The format and arguments for the subroutine are as follows:
+
+ SUBROUTINE PBREAD(KUNIT,KARRAY,KOUNT,KRET)
+
+ where:
+
+
+ Input parameters are INTEGERs:
+ -----
+
+ KUNIT = unit number for the file; this must have been
+ obtained by calling PBOPEN (see below) - it is
+ a C FILE pointer and not a FORTRAN unit number.
+
+ KOUNT = number of BYTES to read from the file.
+
+
+
+ Output parameters are INTEGERs:
+ ------
+
+ KARRAY = an INTEGER array to accept the bytes from the read.
+
+ KRET = -2 if there is an error in handling the file
+
+ -1 if end-of-file is encountered
+ (Note that EOF does not cause a program fail,
+ so this value must be explicitly caught by
+ the caller to avoid looping at the EOF)
+
+ >= 0 number of BYTES read from the file.
+
+
+
+
+
+
+
+ PBREAD2
+ -------
+
+ A subroutine which can be called from FORTRAN to read a block of
+ bytes from an unblocked binary file. ( Note that this routine
+ behaves differently from PBREAD on hitting end-of-file. )
+
+ The format and arguments for the subroutine are as follows:
+
+ SUBROUTINE PBREAD2(KUNIT,KARRAY,KOUNT,KRET)
+
+ where:
+
+
+ Input parameters are INTEGERs:
+ -----
+
+ KUNIT = unit number for the file; this must have been
+ obtained by calling PBOPEN (see below) - it is
+ a C FILE pointer and not a FORTRAN unit number.
+
+ KOUNT = number of BYTES to read from the file.
+
+
+
+ Output parameters are INTEGERs:
+ ------
+
+ KARRAY = an INTEGER array to accept the bytes from the read.
+
+ KRET = -2 if there is an error in handling the file
+
+ >= 0 number of BYTES read from the file.
+ If end-of-file is encountered, KRET returns
+ the number of bytes actually read. The
+ caller must check this value against the
+ number of bytes requested to detect EOF.
+
+
+
+
+ PBWRITE
+ -------
+
+ A subroutine which can be called from FORTRAN to write a block of
+ bytes to an unblocked binary file.
+
+ The format and arguments for the subroutine are as follows:
+
+ SUBROUTINE PBWRITE(KUNIT,KARRAY,KOUNT,KRET)
+
+ where:
+
+
+ Input parameters are INTEGERs:
+ -----
+
+ KUNIT = unit number for the file; this must have been
+ obtained by calling PBOPEN (see below) - it is
+ a C FILE pointer and not a FORTRAN unit number.
+
+ KARRAY = an INTEGER array holding the bytes for the write.
+
+ KOUNT = number of BYTES to write to the file.
+
+
+
+ Output parameter is an INTEGER:
+ ------
+
+ KRET = -1 if there is an error in writing to the file
+
+ >= 0 number of BYTES written to the file.
+
+
+
+
+
+
+
+C
+C A sample FORTRAN program
+C
+
+ program test3
+C
+ integer iret
+ integer length
+ integer buff(50000)
+ integer buflen
+ data buflen/200000/
+ character*1 moder,modew,modea
+ data moder/'r'/,modew/'w'/,modea/'a'/
+ character*24 filename
+ data filename/'bufr.u'/
+ character*24 newfilename
+ data newfilename/'bufr.ext'/
+
+C open - for read
+ call pbopen(iunit1,filename,moder,iret)
+ write(*,*) 'After PBOPEN, iret = ', iret
+ if ( iret .ne. 0 ) stop 'open failed'
+
+C open - for write
+ call pbopen(iunit2,newfilename,modew,iret)
+ write(*,*) 'After PBOPEN, iret = ', iret
+ if ( iret .ne. 0 ) stop 'open failed'
+
+ do loop =1,500
+C Get the next BUFR product
+ call pbbufr(iunit1, buff, buflen, length, iret)
+ write (*,*) 'BUFR product number= ', loop
+ write (*,*) 'Length of BUFR product = ', length
+ write (*,*) 'iret = ', iret
+
+ if (iret .eq. -1 ) stop 'EOF'
+ if (iret .eq. -2 ) stop 'file handling problem'
+ if (iret .eq. -3 ) stop 'array too small for product'
+
+C Write product to new file
+C buff(length/4) = o
+ call pbwrite(iunit2,buff,length,iret)
+ write(*,*) 'After PBWRITE, iret = ', iret
+ if ( iret .lt. 0 ) stop 'write failed'
+ enddo
+
+C Close files
+ call pbclose(iunit1,iret)
+ write(*,*) 'After PBCLOSE, iret = ', iret
+ if ( iret .ne. 0 ) stop 'close failed'
+
+ call pbclose(iunit2,iret)
+ write(*,*) 'After PBCLOSE, iret = ', iret
+ if ( iret .ne. 0 ) stop 'close failed'
+
+ stop
+
+ end
diff --git a/pbio/blokex.F b/pbio/blokex.F
new file mode 100755
index 0000000..6eee3e8
--- /dev/null
+++ b/pbio/blokex.F
@@ -0,0 +1,1951 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+
+ Subroutine BLOKEX (Ksec0,Ksec1,Ksec2,Klen2,
+ & Kblok,Kbdim,Kword,Kmaxw,Hoper,Hform,Kret)
+C---->
+c**
+c**** Name *BLOKEX*
+c**** ----
+c**
+c** Purpose
+c** -------
+c** 1) Block data in BLOK code, Edition 0.
+c** 2) Unblock data from BLOK code.
+c** 3) Decode only identification section of BLOK
+c** coded data ie Sections 0 and 1.
+c**
+c** A number of options exist when coding or decoding data.
+c** See values allowed for requested function, Hoper, Below.
+c**
+c** Interface
+c** ---------
+c**
+c** Call BLOKEX (Ksec0,Ksec1,Ksec2,Klen2,
+c** & Kblok,Kbdim,Kword,Kmaxw,Hoper,Hform,Kret)
+c**
+c**
+c** Integer K*
+c** Character H*
+c**
+c** Input parameters for all functions:
+c** -----------------------------------
+c**
+c** Hoper - Requested function:
+c**
+c** 'B' To code data in BLOK code. The input,
+c** when using this function, is the full
+c** data array (original parent form) Ksec2.
+c** The output array, Kblok, in this case
+c** contains all related BLOK messages. The
+c** length of each BLOK message is Kmaxw,
+c** except the last one which length is
+c** (Kword-(Ksec0(5)-1)*Kmaxw).
+c**
+c** 'C' To code data in BLOK code. The input,
+c** when using this function, is the part of the
+c** data array (origianl parent form) Ksec2
+c** which will be coded in BLOK code.
+c**
+c** 'F' To unblock data from BLOK code. By
+c** successive calling Blokex with this
+c** function, it will collect related BLOK
+c** messages until the original parent form is
+c** achieved (when the return code is 0).
+c**
+c** 'I' To decode only identification
+c** sections 0 and 1 of BLOK code.
+c**
+c** 'L' Return length of BLOK message, in
+c** bytes, and BLOK edition number only.
+c**
+c** 'U' To unblock single BLOK message.
+c**
+c** Kbdim - Dimension of array Kblok
+c**
+c** Kret - Response to error indicator
+c**
+c** 0 , Abort if error encountered.
+c** Non-zero , Return to calling routine
+c** even if error encountered.
+c**
+c** Input parameters for coding functions.
+c** --------------------------------------
+c** Section Word Contents:
+c** ------- ---- ---------
+c** Ksec0 4 Flag;
+c**
+c** decimal
+c** value meaning
+c** ----- -------
+c** 0 Section 1 to be omitted
+c** 128 Section 1 to be present
+c**
+c** Input parameters for coding functions.
+c** Output parameters for decoding functions.
+c** -----------------------------------------
+c** Ksec2 - Integer parameters of section 2 (Data
+c** section) of BLOK code.
+c**
+c** Klen2 - Length of array Ksec2
+c**
+c** Kmaxw - Maximun length of single BLOK message
+c**
+c** Output parameters for coding functions.
+c** Input parameters for decoding functions.
+c** ----------------------------------------
+c** Kblok - Integer parameters of BLOK coded data array.
+c**
+c** Output parameters for decoding functions.
+c** -----------------------------------------
+c** Ksec0 - Integer parameters of section 0 of
+c** BLOK code.
+c** Integer array of 7 words.
+c**
+c** Word Contents:
+c** ---- ---------
+c** 1 Total length of this BLOK
+c** 2 BLOK code edition number
+c** (currently edition 0)
+c** 3 Total length of parent form
+c** 4 Flag;
+c**
+c** decimal
+c** value meaning
+c** ----- -------
+c** 0 Section 1 omitted
+c** 128 Section 1 present
+c**
+c** 5 Total number of related BLOKs
+c** 6 Sequence number of this BLOK
+c** 7 Reserved
+c**
+c**
+c** Ksec1 - Integer parameters of section 1
+c** of BLOK code (contains integer parameters
+c** of section 0 and identification section
+c** of the parent form).
+c** When coding data, if Section 1 requested to be
+c** present (Ksec0(4)=128) then:
+c** Function 'B' requested - Ksec1 is extracted
+c** from the parent form and inserted in each related
+c** BLOK.
+c** Function 'C' requested - Ksec1 is extracted from
+c** the parent form when the Ksec0(6)=1 and saved to
+c** be inserted in each related BLOK (untill the
+c** Ksec0(6)=1 again).
+c**
+c** Output parameters for all functions.
+c** ------------------------------------
+c** Kword - Number of words of Kblok occupied by
+c** coded data. Output parameter for coding
+c** function only. Not required as input
+c** for decoding.
+c**
+c** Hform - Parent data format description ('GRIB',
+c** 'BUFR',' ').
+c**
+c** Kret - return code.
+c**
+c** 0 , no errors encountered (when 'F'
+c** function requested, also means
+c** that the all related blocks unblocked
+c** and original parent form achieved).
+c**
+c** Kret leter then 0 - Informative codes for
+c** decoding functions.
+c**
+c** -1 , input array (Kblok) does not contain
+c** BLOK coded data.
+c** -2 , 'F' function requested, all
+c** related blocks not yet unblocked and
+c** and the original parent form not yet
+c** achieved.
+c**
+c** Kret greater then 0 - Error codes.
+c**
+c** Error codes are described by the
+c** appropriate output error messages when
+c** encountered.
+c**
+c** Method
+c** ------
+c** Input data packed in BLOK code in accordance with
+c** parameters given or set by user or fully or partially
+c** unpacked, depending on function used.
+c**
+c** Externals
+c** ---------
+c** *Abortx* - Terminate execution of the job.
+c** *Inxbit* - Contains calls to the routines gbyte(s)
+c** and sbyte(s) or their equivalents.
+c** *Setpar* - Set number of bits in the computer word
+c** (and largest negative number).
+c**
+c** Reference.
+c** ----------
+c** WMO manual on codes for BLOK definition.
+c**
+c** Comments.
+c** ---------
+c** Versions of source code exist for the vax, cyber, ibm
+c** and sun workstation, as well as the cray.
+c**
+c** The following defaults are used. They have been selected
+c** to facilitate the most frequent usage at ECMWF.
+c**
+c** 1) by default debug printout is switched off.
+c** Call grsdbg (i) where
+c** i=non-zero, to switch on debug printout.
+c** 0, to switch off debug printout.
+c**
+c** 2) by default the rounding of 120 octets is switched on.
+c** Call grsrnd (i) where
+c** i=non-zero, to switch on rounding
+c** 0, to switch off rounding
+c**
+c** Author
+c** ------
+c** D.Jokic, ECMWF, Feb-1992.
+c**
+C----<
+c*
+c* Prefix conventions for variable names.
+c
+c Character H, dummy arguments,
+c Y, local variables.
+c Integer N, global.
+c K, dummy arguments.
+c I, local variables.
+c
+ Implicit none
+c
+ Character*1 Hoper
+ Character*4 Hform
+c
+ Character*1 Ycoper
+ Character*1 Ydoper
+ Character*1 Yoper
+c
+ Integer i
+ Integer Ibits
+ Integer Ibufr
+ Integer Icoun
+ Integer Idata
+ Integer Ie
+ Integer Ieblk
+ Integer Iedit
+ Integer Iendm
+ Integer Igrib
+ Integer Iilen
+ Integer Ilen1
+ Integer Ilen
+ Integer Iname
+ Integer Inblok
+ Integer Initial
+ Integer Inspt
+ Integer Insptl
+ Integer Imisng
+ Integer Ioff
+ Integer Iorder
+ Integer Iret
+ Integer Is
+ Integer Isec1
+ Integer Itblen
+ Integer Itplen
+ Integer Itemp
+ Integer Iword2
+ Integer Iword
+c
+ Integer Jbedno
+ Integer Jplen1
+c
+ Integer Kblok
+ Integer Kbdim
+ Integer Klen2
+ Integer Kret
+ Integer Ksec0
+ Integer Ksec1
+ Integer Ksec2
+ Integer Kword
+ Integer Kmaxw
+c
+ Integer Nblok
+ Integer Nbcoun
+ Integer Nbseqn
+ Integer Ndbg
+ Integer Nfcoun
+ Integer Nflag
+ Integer Nrnd
+ Integer N7777
+ Integer Nuser
+c
+c Blok code version number used when coding data.
+c
+ Parameter (Jbedno=0)
+c
+c Length (in octets) used for section 1, when coding data.
+c
+ Parameter (Jplen1=36)
+c
+ Dimension Kblok(*)
+ Dimension Ksec0(*)
+ Dimension Ksec1(*)
+ Dimension Ksec2(*)
+c
+ Dimension Nblok(4)
+ Dimension Ibufr(4)
+#ifdef CRAY
+ Dimension Idata(Kbdim)
+#else
+ Dimension Idata(34000)
+#endif
+ Dimension Ieblk(4)
+ Dimension Iendm(4)
+ Dimension Igrib(4)
+ Dimension Iname(4)
+ Dimension N7777(4)
+ Dimension Isec1(Jplen1)
+c
+c
+c Characters BLOK and 7777 in ascii for use in sections 0 and 3
+c of BLOK code.
+c
+ Data Nblok /66,76,79,75/
+ Data N7777 /55,55,55,55/
+c
+c Characters GRIB and BUFR in ascii.
+c
+ Data Igrib /71,82,73,66/
+ Data Ibufr /66,85,70,82/
+c
+c Ycoper - Default operator value for all coding functions
+c Ydoper - Default operator value for all decoding functions
+c
+ Data Ycoper /'C'/
+ Data Ydoper /'D'/
+c
+c First Call flag
+c
+ Data Initial /0/
+c
+ Real Fref
+ Integer Nfref,Nvck
+ Common /GRBCOM/ Fref,Nfref,Nrnd,Ndbg,Nvck,Nuser
+c
+ Save Nblok,N7777
+ Save Nbseqn,Nbcoun,Nfcoun
+ Save Nflag
+ Save Initial,Ibits,Itplen
+ Save Ilen1,Isec1
+c
+c ------------------------------------------------------------------
+c
+c* 1. Initialise
+c ----------
+ 100 Continue
+c
+c Set number of bits per computer word and debug indicator,
+c if first time through (Imisng is not using).
+c
+ If (Initial.eq.0) Then
+ Call Setpar (Ibits,Imisng,Ndbg)
+ Initial=1
+c
+c Internal length of the parent form
+c
+ Itplen=0
+c
+c Nflag - Flag ; 0 - 'F' function not requested
+c 1 - 'F' function requested and full
+c parent form uncompleted
+c 2 - 'F' function requested, full
+c parent form uncompleted and fields are
+c not in right order
+c 3 - 'F' function requested, full
+c parent form completed and fields are
+c not in right order
+c
+ Nflag=0
+c
+c Field counters
+c
+ Nbcoun=1
+ Nfcoun=0
+c
+c Sequence number
+c
+ Nbseqn=0
+c
+ End if
+c
+c* 1.1 Initialise variables
+c
+ 110 Continue
+c
+c Internal return code
+c
+ Iret=0
+c
+c Bit-pointer
+c
+ Inspt=0
+c
+c Number of words in the single BLOK message
+c
+ Iword=0
+ Kword=0
+c
+c* 1.2 Set parameters
+c
+ 120 Continue
+c
+c Set default values for parameters, if values not already set,
+c either on previous call or by user via calls to the grs---
+c routines.
+c
+ If (Nuser.ne.11041967) Then
+c
+c Set rounding to 120 bytes on
+c
+ Nrnd=1
+c
+c Set debug print off
+c
+c Ndbg=0
+c
+c Mark common values set
+c
+ Nuser=11041967
+c
+ End if
+c
+c When coding, print input parameters, if required.
+c
+ If (Ndbg.eq.1) Then
+ Write (*,*) '/Blokex/ Paragraph 1.'
+ If (Hoper.eq.'C') Then
+ Call Blprs0 (Ksec0)
+ End if
+ End if
+c
+c
+c ------------------------------------------------------------------
+c
+c* 2. Check input parameters and reset appropriate variables
+c -----------------------------------------------------
+ 200 Continue
+c
+ If (Ndbg.eq.1) Write (*,*) '/Blokex/ Paragraph 2.'
+c
+c* 2.1 Check that valid function has been requested
+c
+ 210 Continue
+ If (Hoper.ne.'B'.and.Hoper.ne.'C'.and.
+ & Hoper.ne.'I'.and.Hoper.ne.'L'.and.
+ & Hoper.ne.'U'.and.Hoper.ne.'F' ) Then
+ Iret=210
+ Write (*,9210) Hoper,Iret
+ Go to 910
+ End if
+c
+c Set internal function parameter
+c
+ If (Hoper.eq.'B'.or.Hoper.eq.'C') Then
+ Yoper='B'
+ Else
+ Yoper='U'
+ End if
+c
+c* 2.2 Rounding of 120 bytes
+c
+ 220 Continue
+ If (Yoper.eq.'B') Then
+c
+ If (Nrnd.eq.1) Then
+ If (Mod(Kmaxw*Ibits,120).ne.0) Then
+ Iret=220
+ Write(*,9220) Kmaxw,Nrnd,Iret
+ Go to 910
+ End if
+ End if
+c
+c* 2.3 Check BLOK identification section flag - Ksec0(4)
+c
+ 230 Continue
+ If (Ksec0(4).ne.0.and.Ksec0(4).ne.128) Then
+ Iret=230
+ Write(*,9230) Ksec0(4),Iret
+ Go to 900
+ End if
+c
+c Reset length of BLOK identification section
+c
+ If (Ksec0(4).eq.0) Ilen1=0
+c
+c* 2.4 Check dimensions and preset output array to 0
+c
+ 240 Continue
+c
+c Check dimension Kbdim of the output array Kblok against the
+c the length of the parent form Klen2
+c
+ If (Kbdim.le.Klen2) Then
+ Iret=240
+ Write(*,9240) Kbdim,Klen2,Iret
+ Go to 900
+ End if
+c
+c Array to receive coded BLOK data
+c
+ Do 242 i=1,Kbdim
+ Idata(i)=0
+ 242 Continue
+c
+c First and last position for the extraction from the Ksec2
+c
+ Is=0
+ Ie=0
+c
+ End if
+c
+c* 2.5 Extract section 0 and section 1 of the parent code and
+c* make identification section of BLOK code (if BLOK
+c* identification section requested Ksec0(4)=128)
+c
+ 250 Continue
+c
+c Do the extraction if function 'B' requested or
+c function 'C' requested and BLOK sequence number is 1
+c
+ If (Hoper.eq.'B'.or.(Hoper.eq.'C'.and.Ksec0(6).eq.1)) Then
+c
+ If (Ksec0(4).ne.0) Then
+c
+c Parent code edition number; Extract field
+c
+ Itemp=56
+ Call Inxbit (Ksec2,Klen2,Itemp,Iedit,1,Ibits,8,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=251
+ Write (*,9101) 'parent code edition number.',Iret
+ Go to 900
+ End if
+c
+ If (Iedit.eq.0) Itemp=32
+c
+c Length of the parent identification section;
+c Extract field
+c
+ Call Inxbit (Ksec2,Klen2,Itemp,Ilen1,1,Ibits,24,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=252
+ Write (*,9101)
+ & 'length of the pareant identification section.',Iret
+ Go to 900
+ End if
+ If (Ilen1.gt.Jplen1) Then
+ Iret=2521
+ Write (*,9251) Iret
+ Go to 900
+ End if
+c
+c Length of the BLOK identification section
+c
+ Itemp=Itemp-24
+ Ilen1=Ilen1+Itemp/8
+c
+c Parent section 0 and section 1;
+c Extract field
+c
+ Itemp=0
+ Call Inxbit (Ksec2,Klen2,Itemp,Isec1(1),Ilen1,Ibits,8,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=253
+ Write (*,9101) 'Parent section 0 and section 1.',Iret
+ Go to 900
+ End if
+c
+ End if
+c
+ End if
+c
+c* 2.6 Reset internal parameters
+c
+ 260 Continue
+ If (Hoper.eq.'B') Then
+c
+c Total number of related bloks
+c
+ If (Kmaxw.le.0) Then
+ Iret=260
+ Write (*,9260) Kmaxw,Iret
+ Go to 900
+ End if
+ Inblok=Klen2/Kmaxw+1
+c
+c Total length of all BLOK messages
+c
+ Itblen=Inblok*Kmaxw
+ Itemp=Klen2+(Inblok*(120*8/Ibits))
+ If (Itblen.lt.Itemp) Inblok=Inblok+1
+c
+ Ksec0(5)=Inblok
+c
+c Total length of the parent form
+c
+ Ksec0(3)=Klen2*Ibits/8
+c
+c Blok sequence number
+c
+ Nbseqn=0
+c
+ End if
+c
+c Number of Ksec2 words which will be inserted
+c into one BLOK message
+c
+ If (Hoper.eq.'C') Then
+c
+ If (Kmaxw.le.Klen2) Then
+ Iret=263
+ Write (*,9263) Kmaxw,Klen2,Iret
+ Go to 900
+ End if
+c
+ Iword2=Klen2
+c
+ Else if (Hoper.eq.'B') Then
+c
+ Iword2=Kmaxw-(((16+4+Ilen1)*8/Ibits)+1)
+ Iret=Iword2*Ibits
+ If (Mod(Iret,960).ne.0) Then
+ Iret=Iret/960
+ Iret=Iret*960
+ Iword2=Iret/Ibits
+ End if
+c
+ End if
+c
+c ------------------------------------------------------------------
+c
+c* 3. BLOK Section 0
+c --------------
+ 300 Continue
+c
+c Section 0 shall always be 16 octets long
+c
+ If (Ndbg.eq.1) Write(*,*) '/Blokex/ Paragraph 3.'
+c
+c* 3.1 Octets 1-4; The letters B L O K
+c
+ 310 Continue
+c
+c Four 8 bit fields
+c
+ If (Yoper.eq.'B') Then
+c
+c Insert fields
+c
+ Call Inxbit (Idata,Kbdim,Inspt,Nblok(1),4,Ibits,8,
+ & Ycoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=310
+ Write (*,9100) 'Octets 1-4; The letters B L O K',Iret
+ Go to 900
+ End if
+c
+ Else
+c
+c Extract fields
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Ieblk(1),4,Ibits,8,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=311
+ Write (*,9101) 'Octets 1-4; The letters B L O K',Iret
+ Go to 900
+ End if
+ Do 312 i=1,4
+ If (Ieblk(i).ne.Nblok(i)) Then
+ Iret=-1
+ Go to 910
+ End if
+ 312 Continue
+c
+ End if
+c
+c* 3.2 Octets 5-7; Length of message
+c
+ 320 Continue
+c
+c One 24 bit field
+c
+ If (Yoper.eq.'B') Then
+c
+c When coding data, skip field. Length is inserted
+c later, when known.
+c
+ Insptl=Inspt
+c
+c Update bit-pointer.
+c
+ Inspt=Inspt+24
+c
+ Else
+c
+c Extract field
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Ksec0(1),1,Ibits,24,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=320
+ Write (*,9101) 'Octets 5-7; Length of message.',Iret
+ Go to 900
+ End if
+c
+c
+c If only length is required, go to paragraph 9.
+c
+ If (Hoper.eq.'L') Then
+ Write(*,9321) Ksec0(1)
+ Go to 900
+ End if
+c
+ Kword=(Ksec0(1)+Ibits/8-1)*8/Ibits
+c
+ End if
+c
+c* 3.3 Octet 8; Blok edition number
+c
+ 330 Continue
+c
+c One 8 bit field
+c
+ If (Yoper.eq.'B') Then
+c
+c Set value
+c
+ Ksec0(2)=Jbedno
+c
+c Insert field
+c
+ Call Inxbit (Idata,Kbdim,Inspt,Ksec0(2),1,Ibits,8,
+ & Ycoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=330
+ Write (*,9100) 'Octet 8; Blok edition number.',Iret
+ Go to 900
+ End if
+c
+ Else
+c
+c Extract field
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Ksec0(2),1,Ibits,8,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=330
+ Write (*,9101) 'Octet 8; Blok edition number.',Iret
+ Go to 900
+ End if
+c
+ End if
+c
+c* 3.4 Octets 9-11; Total length of parent form
+c
+ 340 Continue
+c
+c One 24 bit field
+c
+ If (Yoper.eq.'B') Then
+c
+c Insert field
+c
+ Call Inxbit (Idata,Kbdim,Inspt,Ksec0(3),1,Ibits,24,
+ & Ycoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=340
+ Write (*,9100) 'Octets 9-11; Length of parent form.',Iret
+ Go to 900
+ End if
+c
+ Else
+c
+c Extract field
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Ksec0(3),1,Ibits,24,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=341
+ Write (*,9101) 'Octets 9-11; Length of parent form.',Iret
+ Go to 900
+ End if
+ End if
+c
+c* 3.5 Octet 12; Flag (Code table 1)
+c
+ 350 Continue
+c
+c One 8 bit field
+c
+ If (Yoper.eq.'B') Then
+c
+c Insert field
+c
+ Call Inxbit (Idata,Kbdim,Inspt,Ksec0(4),1,Ibits,8,
+ & Ycoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=350
+ Write (*,9100) 'Octet 12; Flag.',Iret
+ Go to 900
+ End if
+c
+ Else
+c
+c Extract field
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Ksec0(4),1,Ibits,8,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=352
+ Write (*,9101) 'Octet 12; Flag.',Iret
+ Go to 900
+ End if
+c
+ End if
+c
+c
+c* 3.6 Octet 13; Total number of related BLOKS
+c
+ 360 Continue
+c
+c One 8 bit field
+c
+ If (Yoper.eq.'B') Then
+c
+c Insert field
+c
+ Call Inxbit (Idata,Kbdim,Inspt,Ksec0(5),1,Ibits,8,
+ & Ycoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=360
+ Write (*,9100) 'Octet 13; Total number of related bloks.',
+ & Iret
+ Go to 900
+ End if
+c
+ Else
+c
+c Extract field
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Ksec0(5),1,Ibits,8,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=361
+ Write (*,9101) 'Octet 13; Total number of related bloks.',
+ & Iret
+ Go to 900
+ End if
+c
+c Check order of fields if function 'F' requested
+c
+ If (Nflag.ne.0) Then
+ If (Nbseqn/1000.ne.Ksec0(5)) Then
+ Iret=-362
+ Write (*,9425) Iret
+ Call Blprs0 (Ksec0)
+ Go to 739
+ End if
+ End if
+c
+ End if
+c
+c* 3.7 Octet 14; Sequence number of this BLOK
+c
+ 370 Continue
+c
+c One 8 bit field
+c
+ If (Hoper.eq.'B') Then
+c
+c Reset value
+c
+ Nbseqn=Nbseqn+1
+ Ksec0(6)=Nbseqn
+c
+ End if
+c
+ If (Yoper.eq.'B') Then
+c
+c Insert field
+c
+ Call Inxbit (Idata,Kbdim,Inspt,Ksec0(6),1,Ibits,8,
+ & Ycoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=370
+ Write (*,9100) 'Octet 14; Sequence number of this BLOK.',
+ & Iret
+ Go to 900
+ End if
+c
+ Else
+c
+c Extract field
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Ksec0(6),1,Ibits,8,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=371
+ Write (*,9101) 'Octet 14; Sequence number of this BLOK.',
+ & Iret
+ Go to 900
+ End if
+c
+ End if
+c
+c* 3.8 Octets 15-16; Reserved
+c
+ 380 Continue
+c
+c One 16 bit field
+c
+ If (Yoper.eq.'B') Then
+c
+c When coding data, skip field.
+c
+ Ksec0(7)=0
+c
+c Update bit-pointer.
+c
+ Inspt=Inspt+16
+c
+ Else
+c
+c Extract field
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Ksec0(7),1,Ibits,16,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=381
+ Write (*,9101) 'Octets 15-16;',Iret
+ Go to 900
+ End if
+c
+ End if
+c
+c ------------------------------------------------------------------
+c
+c* 4. BLOK Section 1 - Identification section
+c ---------------------------------------
+ 400 Continue
+ If (Ndbg.eq.1) Write (*,*) '/Blokex/ Paragraph 4.'
+ If (Ksec0(4).ne.128) Go to 499
+c
+c* 4.1 Coding data
+c
+ 410 Continue
+c
+c Copy section 0 and identification section of the parent code
+c into the section 1 of BLOK code
+c
+ If (Yoper.eq.'B') Then
+c
+c Insert field
+c
+ Call Inxbit (Idata,Kbdim,Inspt,Isec1(1),Ilen1,Ibits,8,
+ & Ycoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=415
+ Write (*,9100) 'bit fields into BLOK section 1.',Iret
+ Go to 900
+ End if
+c
+c* 4.2 Decoding data
+c
+ 420 Continue
+ Else
+ Itemp=Inspt
+c
+c Name of the parent form
+c
+ Call Inxbit (Kblok,Kbdim,Itemp,Iname(1),4,Ibits,8,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=421
+ Write (*,9101) 'Name of the parent form.',Iret
+ Go to 900
+ End if
+ Icoun=0
+ Hform='GRIB'
+ Do 422 i=1,4
+ If (Iname(i).eq.Igrib(i)) Icoun=Icoun+1
+ 422 Continue
+ If (Icoun.ne.4) Then
+ Icoun=0
+ Do 423 i=1,4
+ If (Iname(i).eq.Ibufr(i)) Icoun=Icoun+1
+ 423 Continue
+ If (Icoun.eq.4) Then
+ Hform='BUFR'
+ Else
+ Iret=423
+ Write (*,9423) Iret
+ Go to 900
+ End if
+ End if
+c
+c Parent code edition number; Extract field
+c
+ Itemp=Inspt+56
+ Call Inxbit (Kblok,Kbdim,Itemp,Iedit,1,Ibits,8,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=424
+ Write (*,9101) 'Parent code edition number.',Iret
+ Go to 900
+ End if
+c
+c Set first word in the output array Ksec1 and check order
+c of fields if 'F' function requested
+c
+ If (Nflag.ne.0) Then
+ If (Iedit.ne.Ksec1(1)) Then
+ Iret=-425
+ Write (*,9425) Iret
+ Call Blprs0 (Ksec0)
+ Call Blprs1 (Ksec1,Hform)
+ Go to 739
+ End if
+ End if
+ Ksec1(1)=Iedit
+c
+c Reset position of the length of the parent section 1 for
+c the different parent code versions
+c
+ If (Hform.eq.'GRIB'.and.Iedit.lt.1) Then
+ Itemp=Inspt+32
+ Else if (Hform.eq.'BUFR'.and.Iedit.lt.2) Then
+ Itemp=Inspt+32
+ End if
+c
+c Length of the identification section; Extract field
+c
+ Call Inxbit (Kblok,Kbdim,Itemp,Ilen1,1,Ibits,24,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=426
+ Write (*,9101) 'Length of the section 1.',Iret
+ Go to 900
+ End if
+ Inspt=Itemp
+c
+c* 4.2.1 GRIB code identification section
+c
+ 4210 Continue
+ If (Hform.eq.'GRIB') Then
+c
+c Octet 4 : Version Number of Table 2.
+c Octet 5 : Identification of centre.
+c Octet 6 : Generating process identification.
+c Octet 7 : Grid definition.
+c Octet 8 : Flag.
+c Octet 9 : Indicator of parameter.
+c Octet 10 : Indicator of type of level.
+c
+c Seven 8 bit fields.
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Isec1(1),7,Ibits,8,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=4210
+ Write (*,9101) 'Octets 4-10; Section 1.',Iret
+ Go to 900
+ End if
+c
+c Octets 11 - 12 : Height, pressure etc of levels
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Isec1(8),2,Ibits,8,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=4211
+ Write (*,9101) 'Octets 11-12; Section 1.',Iret
+ Go to 900
+ End if
+c
+c Octet 13 : Year of century.
+c Octet 14 : Month.
+c Octet 15 : Day.
+c Octet 16 : Hour.
+c Octet 17 : Minute.
+c Octet 18 : Indicator of unit of time range..
+c
+c Six 8 bit fields.
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Isec1(10),6,Ibits,8,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=4212
+ Write (*,9101) 'Octets 13-18; Section 1.',Iret
+ Go to 900
+ End if
+c
+c Octets 19 - 20 : Period of time.
+c One 16 bit field or two 8 bit fields.
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Isec1(16),2,Ibits,8,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=4213
+ Write (*,9101) 'Octets 19-20; Section 1.',Iret
+ Go to 900
+ End if
+c
+c Octet 21 : Time range indicator.
+c One 8 bit field.
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Isec1(18),1,Ibits,8,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=4214
+ Write (*,9101) 'Octet 21; Section 1.',Iret
+ Go to 900
+ End if
+c
+c Octet 22 - 23 : Number averaged.
+c One 16 bit field.
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Isec1(19),1,Ibits,16,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=4215
+ Write (*,9101) 'Octets 22-23; Section 1.',Iret
+ Go to 900
+ End if
+c
+c Octet 24 : Number missing from averages etc.
+c Octet 25 : Century of data.
+c Octet 26 : Reserved field. (set to 0)
+c Three 8 bit field.
+c
+ Itemp=3
+ Ilen=20
+ If (Iedit.le.0) Itemp=1
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Isec1(20),Itemp,Ibits,8,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=4216
+ Write (*,9101) 'Octets 24-26; Section 1.',Iret
+ Go to 900
+ End if
+c
+c Octets 27 - 28 : Units decimal scale factor.
+c One 16 bit field.
+c
+ If (Iedit.gt.0) Then
+c
+c Extract field
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Isec1(23),1,Ibits,16,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=4217
+ Write (*,9101) 'Octets 27-28; Section 1.',Iret
+ Go to 900
+ End if
+ Ilen=24
+c
+ End if
+c
+c Set output array Ksec1 and check order of fields if
+c 'F' function requested
+c
+ Do 4218 i=1,Ilen
+ If (Nflag.ne.0) Then
+ If (Ksec1(i+1).ne.Isec1(i)) Then
+ Iret=-4218
+ Write (*,9425) Iret
+ Call Blprs0 (Ksec0)
+ Call Blprs1 (Ksec1,Hform)
+ Go to 739
+ End if
+ Else
+ Ksec1(i+1)=Isec1(i)
+ End if
+4218 Continue
+c
+c* 4.2.2 BUFR code identification section
+c
+ 4220 Continue
+ Else if (Hform.eq.'BUFR') Then
+c
+c Octet 4 : BUFR master table
+c One 8 bit field.
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Isec1(1),1,Ibits,8,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=4220
+ Write (*,9101) 'Octet 4; Section 1.',Iret
+ Go to 900
+ End if
+c
+c Octet 5-6 : Originating centre
+c One 16 bit field.
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Isec1(2),1,Ibits,16,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=4221
+ Write (*,9101) 'Octets 5-6; Section 1.',Iret
+ Go to 900
+ End if
+c
+c Octet 7 : Update sequence number
+c Octet 8 : Flag.
+c Octet 9 : BUFR message type
+c Octet 10 : BUFR message sub-type
+c Octet 11 : Version number of master table used
+c Octet 12 : Version number of local tables used to augment
+c the master table in use
+c Octet 13 : Year of century.
+c Octet 14 : Month.
+c Octet 15 : Day.
+c Octet 16 : Hour.
+c Octet 17 : Minute.
+c Octet 18 : Indicator of unit of time range..
+c
+c Twelve 8 bit fields.
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Isec1(3),12,Ibits,8,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=4212
+ Write (*,9101) 'Octets 7-18; Section 1.',Iret
+ Go to 900
+ End if
+c
+ End if
+c
+ End if
+ 499 Continue
+c
+c Print content of Section 0 and Section 1 if function 'I' requested
+c
+ If (Hoper.eq.'I') Go to 900
+c
+c ------------------------------------------------------------------
+c
+c* 5. BLOK Section 2 - Binary Data Section
+c ------------------------------------
+ 500 Continue
+ If (Ndbg.eq.1) Write(*,*) '/Blokex/ Paragraph 5.'
+c
+c* 5.1 Coding data
+c
+ 510 Continue
+ If (Yoper.eq.'B') Then
+c
+c First and last position of the Ksec2 array for the
+c data which will be inserted in the current BLOK message
+c
+ Is=Ie+1
+ If (Ksec0(5).ne.Ksec0(6)) Then
+ Ie=Is+Iword2-1
+ Else
+ Ie=Klen2
+ End if
+c
+c Data to be inserted in the current blok
+c
+ Iilen=0
+ Do 511 i=Is,Ie
+ Iilen=Iilen+1
+ Kblok(Iilen)=Ksec2(i)
+ 511 Continue
+c
+c Insert field
+c
+ Call Inxbit (Idata,Kbdim,Inspt,Kblok,Iilen,Ibits,Ibits,
+ & Ycoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=512
+ Write (*,9100) 'binary data section (Section 2).',Iret
+ Go to 900
+ End if
+c
+c* 5.2 Decoding data
+c
+ 520 Continue
+ Else
+c
+c Length of the data section
+c
+ Iilen=(Ksec0(1)*8-Inspt)/Ibits
+c
+c Data section; Extract field
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Idata,Iilen,Ibits,Ibits,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=522
+ Write (*,9101) 'binary data section (Section 2).',Iret
+ Go to 900
+ End if
+ End if
+c
+c ------------------------------------------------------------------
+c
+c* 6. BLOK Section 3 - Ascii 7777
+c ---------------------------
+ 600 Continue
+ If (Ndbg.eq.1) Write (*,*) '/Blokex/ Paragraph 6.'
+c
+c Four 8 bit fields
+c
+c* 6.1 Coding data
+c
+ 610 Continue
+ If (Yoper.eq.'B') Then
+c
+c Insert field
+c
+ Call Inxbit (Idata,Kbdim,Inspt,N7777(1),4,Ibits,8,
+ & Ycoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=611
+ Write (*,9100) 'BLOK Section 3 (7777).',Iret
+ Go to 900
+ End if
+c
+c Length of BLOK message
+c
+ Ksec0(1)=(Inspt-Iword*Ibits)/8
+c
+c Insert field
+c
+ Call Inxbit (Idata,Kbdim,Insptl,Ksec0(1),1,Ibits,24,
+ & Ycoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=802
+ Write (*,9100) 'Total length of this message',Iret
+ Go to 900
+ End if
+c
+c* 6.2 Decoding data
+c
+ 620 Continue
+ Else
+c
+c Reset counter
+c
+ Itemp=0
+ 621 Continue
+c
+c Extract field
+c
+ Call Inxbit (Kblok,Kbdim,Inspt,Iendm(1),4,Ibits,8,
+ & Ydoper,Iret)
+ If (Iret.ne.0) Then
+ Iret=621
+ Write (*,9101) 'BLOK Section 3 (7777).',Iret
+ Go to 900
+ End if
+c
+c Check that 7777 group is found where expected
+c
+ Icoun=0
+ Do 622 i=1,4
+ If (Iendm(i).ne.N7777(i)) Icoun=Icoun+1
+ 622 Continue
+ If (Icoun.ne.0) Then
+c
+c Search backward
+c
+ Inspt=Inspt-8-4*8
+ Itemp=Itemp+1
+ If (Itemp.gt.8) Then
+ Iret=623
+ Write (*,9623) Iret
+ Go to 900
+ End if
+ Go to 621
+ Else
+c
+c Update length of the data section
+c
+ If (Itemp.eq.0) Then
+ Iword=Iilen
+ Else
+ Iword=Iilen-(Itemp*8/Ibits)
+ End if
+ End if
+c
+ End if
+c
+c ------------------------------------------------------------------
+c
+c* 7. Complete single message
+c -----------------------
+ 700 Continue
+ If (Ndbg.eq.1) Write(*,*) '/Blokex/ Paragraph 7.'
+c
+c* 7.1 Coding data
+c
+ 710 Continue
+ If (Yoper.eq.'B') Then
+c
+c Any unused part of last word is already set to binary zeroes
+c Increment pointers as necessary
+c
+ Iword=Inspt/Ibits
+ Itemp=Iword*Ibits
+ Ioff =Inspt-Itemp
+ If (Ioff.ne.0) Then
+ Inspt=Inspt+Ibits-Ioff
+ Iword=Iword+1
+ End if
+c
+c Round length to a multiple of 120 octets, if required,
+c any additional words are already set to 0.
+c
+ If (Nrnd.eq.1) Then
+ i=Inspt/960
+ i=i*960
+ i=Inspt-i
+ If (i.ne.0) i=(960-i)/Ibits
+ Iword=Iword+i
+ Inspt=Iword*Ibits
+ End if
+c
+c Output BLOK coded data array
+c
+ If (Nbseqn.eq.Inblok.or.Hoper.eq.'C') Then
+ Do 711 i=1,Iword
+ Kblok(i)=Idata(i)
+ 711 Continue
+ End if
+ Kword=Iword
+c
+c* 7.2 Decoding data; Function 'U'
+c
+ 720 Continue
+ Else if (Hoper.eq.'U') Then
+c
+ Do 721 i=1,Iword
+ Ksec2(i)=Idata(i)
+ 721 Continue
+ Klen2=Iword
+c
+c* 7.3 Decoding data; Function 'F'
+c
+ 730 Continue
+ Else if (Hoper.eq.'F') Then
+c
+c Collect fields
+c
+ If (Nflag.eq.0) Then
+c
+c Nflag=0; Function 'F' requested, first time through
+c
+c Check the order of the first field
+c
+ Nflag=1
+ If (Ksec0(6).ne.Nbcoun) Then
+c
+c Field is not in right order
+c
+ Nflag=2
+c
+c Suppress current unblocking stage
+c
+ Nfcoun=1
+ Ksec2(Itplen+Iword+1)=Ksec0(6)*1000000+Iword
+c
+ End if
+c
+ Else if (Nflag.eq.1) Then
+c
+c Nflag=1; Function 'F' requested, fields in order
+c
+c Check the order of the current field
+c
+ If (Ksec0(6).ne.Nbcoun) Then
+c
+c Fields are not in right order
+c
+ Nflag=2
+c
+c Suppress previous and current unblocking stage
+c
+ If (Nfcoun.eq.0) Then
+ Itemp=Nbseqn/1000
+ Itemp=Nbseqn-Itemp*1000
+ Ksec2(Itplen+Iword+1)=Itemp*1000000+Itplen
+ End if
+ Nfcoun=2
+ Ksec2(Itplen+Iword+2)=Ksec0(6)*1000000+Iword
+c
+ End if
+c
+ Else if (Nflag.eq.2) Then
+c
+c Nflag=2; Unblocked fields are not in right order
+c
+c Increase counter of the fields which are not in order
+c
+ Nfcoun=Nfcoun+1
+c
+c Suppress current unblocking stage
+c
+ Ksec2(Itplen+Nfcoun)=Ksec0(6)*1000000+Iword
+c
+c Update internally used part of Ksec2
+c
+ Do 733 i=Nfcoun,1,-1
+ Ksec2(Itplen+Iword+i)=Ksec2(Itplen+i)
+ 733 Continue
+c
+c Reset flag if total number of related bloks achieved
+c
+ If (Nbcoun.eq.Ksec0(5)) Nflag=3
+c
+ End if
+c
+ Do 734 i=1,Iword
+ Itplen=Itplen+1
+ Ksec2(Itplen)=Idata(i)
+ 734 Continue
+ Klen2=Itplen
+ Nbseqn=Ksec0(5)*1000+Ksec0(6)
+c
+c Repack parent form if fields are not in right order
+c
+ If (Nflag.eq.3) Then
+c
+c Find first field in right order, if any
+c
+ If (Nfcoun.eq.Nbcoun) Then
+c
+c No fields in order
+c
+ Iilen=0
+ Icoun=0
+ Inblok=1
+ Itblen=0
+c
+ Else
+c
+c Number of the fields in right order
+c
+ Icoun=Ksec2(Itplen+1)/1000000
+ Inblok=2
+ Itblen=Icoun-1
+c
+c Length of the fields in right order
+c
+ Iilen=Ksec2(Itplen+1)-Icoun*1000000
+c
+ End if
+c
+ Do 7350 Ie=Inblok,Nfcoun
+ Icoun=Icoun+1
+ Is=Iilen
+c
+ Do 7351 i=Ie,Nfcoun
+c
+c Sequence number of the field
+c
+ Iorder=Ksec2(Itplen+i)/1000000
+c
+c Length of the field
+c
+ Ilen=Ksec2(Itplen+i)-Iorder*1000000
+c
+c Field starting index in the array Ksec2
+c
+ If (Iorder.eq.Icoun) Then
+ Itemp=i
+ Go to 7352
+ Else
+ Is=Is+Ilen
+ End if
+c
+ 7351 Continue
+ Iret=-7351
+ Write(*,97351) Icoun,Iret
+ Call Blprs1(Ksec1,Hform)
+ Go to 739
+c
+c Repack parent form so that 'Icoun' field is
+c in right order
+c
+ 7352 Continue
+c
+ Do 7353 i=1,Ilen
+ Idata(i)=Ksec2(Is+i)
+ 7353 Continue
+ Do 7354 i=Is+Ilen+1,Itplen
+ Ksec2(i-Ilen)=Ksec2(i)
+ 7354 Continue
+ Do 7355 i=Itplen-Ilen,Iilen+1,-1
+ Ksec2(i+Ilen)=Ksec2(i)
+ 7355 Continue
+ Do 7356 i=1,Ilen
+ Iilen=Iilen+1
+ Ksec2(Iilen)=Idata(i)
+ 7356 Continue
+c
+c Repack internaly used part of Ksec2
+c
+ Idata(1)=Ksec2(Itplen+Itemp)
+ Do 7357 i=Itplen+Itemp+1,Itplen+Nfcoun
+ Ksec2(i-1)=Ksec2(i)
+ 7357 Continue
+ Do 7358 i=Itplen+Nfcoun,Itplen+Iorder-Itblen,-1
+ Ksec2(i)=Ksec2(i-1)
+ 7358 Continue
+ Ksec2(Itplen+Iorder-Itblen)=Idata(1)
+c
+ 7350 Continue
+c
+ End if
+c
+c Reset internal total parent length if it is achieved
+c
+ Itemp=Ksec0(3)*8/Ibits
+ If (Nbcoun.eq.Ksec0(5)) Then
+ Iret=0
+ If (Itplen.ne.Itemp) Then
+ Iret=-739
+ Write(*,9739) Itemp,Itplen,Iret
+ End if
+ Else
+ Iret=-2
+ Nbcoun=Nbcoun+1
+ Go to 800
+ End if
+c
+ End if
+c
+c Reset flags to default values
+c
+ 739 Continue
+ If (Hoper.eq.'F') Then
+ Nflag=0
+ Itplen=0
+ Nbseqn=0
+ Nbcoun=1
+ Nfcoun=0
+ End if
+c
+c ------------------------------------------------------------------
+c
+c* 8. Continue loop over all single BLOK messages
+c -------------------------------------------
+ 800 Continue
+ If (Ndbg.eq.1) Write(*,*) '/Blokex/ Paragraph 8.'
+c
+ If (Nbseqn.ne.Inblok.and.Hoper.eq.'B') Then
+ Go to 300
+ End if
+c
+c ------------------------------------------------------------------
+c
+c* 9. Return code handling
+c --------------------
+ 900 Continue
+c
+ If (Ndbg.eq.1) Write(*,*) '/Blokex/ Paragraph 9.'
+ If (Ndbg.eq.1.or.Hoper.eq.'I') Then
+ Call Blprs0 (Ksec0)
+ If (Ksec0(4).eq.128.and.Yoper.ne.'B') Then
+ Call Blprs1 (Ksec1,Hform)
+ End if
+ End if
+c
+c If no error has been encountered, set return code to informative
+c value, if required.
+c
+c Abort if any error has been encountered and user has requested
+c an abort. Informative values are negative and do not cause an
+c abort.
+c
+ 910 Continue
+ If (Iret.gt.0.and.Kret.eq.0) Then
+ Call abortx ('BLOKEX')
+ Else
+ Kret=Iret
+ Return
+ End if
+c
+ 9100 Format (' Blokex: Error inserting ',a,' Return code=',i4)
+ 9101 Format (' Blokex: Error extracting ',a,' Return code=',i4)
+ 9210 Format (' Blokex: Error, Unrecognised function requested: ',a/
+ & ' ',' Return code=',i3)
+ 9220 Format (' Blokex: Error, Requested length of single',
+ & ' BLOK message ',i10,' words'/
+ & ' is not multiple of 120 bytes.'/
+ & ' ',' Rounding of 120 bytes included; Nrnd=',i3/
+ & ' ',' Return code=',i3)
+ 9230 Format (' Blokex: Error, Unrecognised entry Ksec0(4)=',i6/
+ & ' ',' Valid entry: 0 /or/ 128.'/
+ & ' ',' Return code=',i3)
+ 9240 Format (' Blokex: Error, Output array too small to receive',
+ & ' BLOK coded field.'/
+ & ' ',' Kbdim=',i9,' Klen2=',i9/
+ & ' ',' Return code=',i3)
+ 9251 Format (' Blokex: Error, Unrecognised parent data format.'/
+ & ' ',' BLOK Section 1 requested to be',
+ & ' included (Ksec0(4)=128) for the'/
+ & ' ',' unrecognised parent data format.'/
+ & ' ',' Return code=',i4)
+ 9260 Format (' Blokex: Error, Maximum length of single BLOK ',
+ & ' message Kmaxw=',i9/
+ & ' ',' not valid.'/
+ & ' ',' Return code=',i3)
+ 9263 Format (' Blokex: Error, Required single BLOK length Kmaxw=',
+ & i9,' too small'/
+ & ' ',' to receive input field Klen2=',i9,
+ & '; Fuction C requested.'/
+ & ' ',' Return code=',i3)
+ 9321 Format (' Blokex: Total length of this BLOK is ',i8,
+ & ' octets.')
+ 9423 Format (' Blokex: Error, Unrecognised parent code name.'/
+ & ' ',' Return code=',i3)
+ 9425 Format (' Blokex: Error, Input fields are not in right order.'
+ & /' ',' Unblocking uncompleted.'/
+ & ' ',' Function requested F.'/
+ & ' ',' Return code=',i5)
+ 9623 Format (' Blokex: Error, End of message 7777 group not',
+ & ' found.'/
+ & ' ',' Return code=',i3)
+ 9739 Format (' Blokex: Error, Original parent length: ',i12,/
+ & ' ',' differ from the length achieved after full',
+ & ' decoding: ',i12/
+ & ' ',' Return code=',i4)
+97351 Format (' Blokex: Error, BLOK sequence ',i3,' missing.'/
+ & ' ',' Unblocking uncompleted.'/
+ & ' ',' Return code=',i5)
+
+c
+ End
+ Subroutine Blprs0(Ksec0)
+c**
+c**** Name *Blprs0*
+c**** ----
+c**
+c** Purpose
+c** -------
+c** Print the information in the Indicator
+c** Section (Section 0) of BLOK data.
+c**
+c** Interface
+c** ---------
+c** Input: Ksec0 - Array of decoded parameters from Section 0.
+c**
+c** Output: Printed data on the standard output.
+c**
+c** Method
+c** ------
+c** Fields are printed as integers.
+c**
+c** Externals
+c** ---------
+c** None.
+c**
+c** Author
+c** ------
+c** D.Jokic, ECMWF, February-1992.
+c**
+ Integer Ksec0(*)
+c
+c ------------------------------------------------------------------
+c
+c* 1. Write Ksec0
+c -----------
+ 100 Continue
+ Write (*,9000)
+ Write (*,9001)
+ Write (*,9002)
+ Write (*,9003) Ksec0(1)
+ Write (*,9004) Ksec0(2)
+ Write (*,9005) Ksec0(3)
+ Write (*,9006) Ksec0(4)
+ Write (*,9007) Ksec0(5)
+ Write (*,9008) Ksec0(6)
+c
+ 9000 Format (' ')
+ 9001 Format (' ','BLOK Section 0 - Indicator Section. ')
+ 9002 Format (' ','----------------------------------------')
+ 9003 Format (' ','Total length of this BLOK. ',I9)
+ 9004 Format (' ','BLOK Edition Number. ',I9)
+ 9005 Format (' ','Total length of parent form. ',I9)
+ 9006 Format (' ','Flag (Code Table 1). ',I9)
+ 9007 Format (' ','Total number of related BLOKs. ',I9)
+ 9008 Format (' ','Sequence number of this BLOK. ',I9)
+c
+ Return
+ End
+ Subroutine Blprs1(Ksec1,Yform)
+c**
+c**** Name *Blprs1*
+c**** ----
+c**
+c** Purpose
+c** -------
+c** Print the information in the Identification
+c** Section (Section 1) of BLOK data.
+c**
+c** Interface
+c** ---------
+c** Input: Ksec1 - Array of decoded parameters from Section 1.
+c** Yform - Format of data
+c**
+c** Output: Printed data on the standard output.
+c**
+c** Method
+c** ------
+c** Fields are printed as integers.
+c**
+c** Externals
+c** ---------
+c** None.
+c**
+c** Author
+c** ------
+c** D.Jokic, ECMWF, February-1992.
+c**
+ Character*4 Yform
+c
+ Integer Ksec1(*)
+c
+c ------------------------------------------------------------------
+c
+c* 1. Initialise
+c ----------
+ 100 Continue
+ Write (*,9000)
+ Write (*,9001)
+ Write (*,9002)
+ Write (*,9003) Yform
+ Write (*,9004) Ksec1(1)
+c
+c ------------------------------------------------------------------
+c
+c* 2. GRIB data
+c ---------
+ 200 Continue
+ If (Yform.eq.'GRIB') Then
+c
+ Write (*,9202) Ksec1(2)
+ Write (*,9203) Ksec1(3)
+ Write (*,9204) Ksec1(4)
+ Write (*,9205) Ksec1(5)
+ Write (*,9206) Ksec1(6)
+ Write (*,9207) Ksec1(7)
+ Write (*,9208) Ksec1(8)
+ Write (*,9209) Ksec1(9)
+ Write (*,9210) Ksec1(10)
+ Write (*,9211) Ksec1(11)
+ Write (*,9212) Ksec1(12)
+ Write (*,9213) Ksec1(13)
+ Write (*,9214) Ksec1(14)
+ Write (*,9215) Ksec1(15)
+ Write (*,9216) Ksec1(16)
+ Write (*,9217) Ksec1(17)
+ Write (*,9218) Ksec1(18)
+ Write (*,9219) Ksec1(19)
+ Write (*,9220) Ksec1(20)
+ Write (*,9221) Ksec1(21)
+ Write (*,9222) Ksec1(22)
+ Write (*,9223) Ksec1(23)
+c
+c ------------------------------------------------------------------
+c
+c* 3. BUFR data
+c ---------
+ 300 Continue
+ Else if (Yform.eq.'BUFR') Then
+c
+ Write (*,9302) Ksec1(2)
+ Write (*,9303) Ksec1(3)
+ Write (*,9304) Ksec1(4)
+ Write (*,9305) Ksec1(5)
+ Write (*,9306) Ksec1(6)
+ Write (*,9307) Ksec1(7)
+ Write (*,9308) Ksec1(8)
+ Write (*,9309) Ksec1(9)
+ Write (*,9310) Ksec1(10)
+ Write (*,9311) Ksec1(11)
+ Write (*,9312) Ksec1(12)
+ Write (*,9313) Ksec1(13)
+ Write (*,9314) Ksec1(14)
+ Write (*,9315) Ksec1(15)
+c
+ Else
+c
+ Write (*,9400) Yform
+c
+ End if
+c
+ 9000 Format (' ')
+ 9001 Format (' ','BLOK Section 1 - Identification Section.')
+ 9002 Format (' ','----------------------------------------')
+ 9003 Format (' ','Binary data format. ',A4)
+ 9004 Format (' ','Parent edition number. ',I9)
+c
+ 9202 Format (' ','Code Table 2 Version Number. ',I9)
+ 9203 Format (' ','Originating centre identifier. ',I9)
+ 9204 Format (' ','Model identification. ',I9)
+ 9205 Format (' ','Grid definition. ',I9)
+ 9206 Format (' ','Flag (Code Table 1) ',I9)
+ 9207 Format (' ','Parameter identifier (Code Table 2). ',I9)
+ 9208 Format (' ','Type of level (Code Table 3). ',I9)
+ 9209 Format (' ','Value 1 of level (Code Table 3). ',I9)
+ 9210 Format (' ','Value 2 of level (Code Table 3). ',I9)
+ 9211 Format (' ','Year of data. ',I9)
+ 9212 Format (' ','Month of data. ',I9)
+ 9213 Format (' ','Day of data. ',I9)
+ 9214 Format (' ','Hour of data. ',I9)
+ 9215 Format (' ','Minute of data. ',I9)
+ 9216 Format (' ','Time unit (Code Table 4). ',I9)
+ 9217 Format (' ','Time range one. ',I9)
+ 9218 Format (' ','Time range two. ',I9)
+ 9219 Format (' ','Time range indicator (Code Table 5) ',I9)
+ 9220 Format (' ','Number averaged. ',I9)
+ 9221 Format (' ','Number missing from average. ',I9)
+ 9222 Format (' ','Century of data. ',I9)
+ 9223 Format (' ','Units decimal scaling factor. ',I9)
+c
+ 9302 Format (' ','BUFR master table. ',I9)
+ 9303 Format (' ','Originating centre identifier. ',I9)
+ 9304 Format (' ','Update sequence number. ',I9)
+ 9305 Format (' ','Flag. ',I9)
+ 9306 Format (' ','BUFR message type. ',I9)
+ 9307 Format (' ','BUFR message subtype. ',I9)
+ 9308 Format (' ','Version number of master table used. ',I9)
+ 9309 Format (' ','Version number of local table used. ',I9)
+ 9310 Format (' ','Year of data. ',I9)
+ 9311 Format (' ','Month of data. ',I9)
+ 9312 Format (' ','Day of data. ',I9)
+ 9313 Format (' ','Hour of data. ',I9)
+ 9314 Format (' ','Minute of data. ',I9)
+ 9315 Format (' ','Indicator of unit of time range. ',I9)
+c
+ 9400 Format (' Blprs1: Error, Unknown data format: ',a)
+c
+ Return
+ End
diff --git a/pbio/bufrgrib.h b/pbio/bufrgrib.h
new file mode 100755
index 0000000..c450120
--- /dev/null
+++ b/pbio/bufrgrib.h
@@ -0,0 +1,33 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef BUFRGRIB_H
+#define BUFRGRIB_H
+/*
+ bufrgrib.h
+*/
+#include <stdio.h>
+#include <string.h>
+
+/* defines for BUFR functions */
+#define ARRSIZE 100
+#define TRUE 1
+#define FALSE 0
+#define BOOL int
+#define BOOLEAN int
+
+#ifdef VAX
+#define off_t char *
+#include <types.h>
+#include <file.h>
+#endif
+
+#define BUFSIZE 200
+#endif /* end of BUFRGRIB_H */
diff --git a/pbio/crexrd.c b/pbio/crexrd.c
new file mode 100755
index 0000000..62691fd
--- /dev/null
+++ b/pbio/crexrd.c
@@ -0,0 +1,121 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+
+#ifndef CRAY
+#ifdef FORTRAN_NO_UNDERSCORE
+#define CREXRD crexrd
+#else
+#define CREXRD crexrd_
+#endif
+#endif
+
+#define END_OF_FILE -1
+#define FILE_READ_ERROR -2
+#define USER_BUFFER_TOO_SMALL -3
+#define FILE_TOO_SMALL -5
+#define MINIMUM_CREX_SIZE 13
+#define CREX 0x43524558
+
+typedef char * String;
+
+void CREXRD(String buffer, int* bufflen, int* size, int* status, FILE** in) {
+/*
+// Called from FORTRAN:
+// CALL CREXRD( KARRAY, KINLEN, NREAD, IRET, KUNIT )
+*/
+int loop, foundPosition;
+int number, crexFound = 0, endFound = 0;
+String endBuffer;
+String next;
+char plplcrcrlf7777[10] = {0,0,0,0,0,0,0,0,0,0};
+char PlPlCrCrLf7777[10] = {0x2b,0x2b,0x0d,0x0d,0x0a,0x37,0x37,0x37,0x37,0x00};
+
+/*
+// Check buffer big enough for CREX search
+*/
+ if( *bufflen < MINIMUM_CREX_SIZE ) {
+ *status = USER_BUFFER_TOO_SMALL;
+ return;
+ }
+
+/*
+// Look for CREX
+*/
+ for( loop = 0; loop <= 4; loop++) buffer[loop] = '\0';
+
+ while( !crexFound ) {
+ buffer[0] = buffer[1];
+ buffer[1] = buffer[2];
+ buffer[2] = buffer[3];
+ number = fread((buffer+3), 1, 1, *in);
+ if( feof(*in) ) {
+ *status = END_OF_FILE;
+ return;
+ }
+ if( (number != 1) || ferror(*in) ) {
+ perror("crexrd file read error");
+ *status = FILE_READ_ERROR;
+ return;
+ }
+ if( strcmp(buffer,"CREX") == 0 ) {
+ crexFound = 1;
+ foundPosition = ftell(*in) - 4;
+ }
+ }
+
+/*
+// Read some more characters into the buffer
+*/
+ number = fread((buffer+4), 1, ((*bufflen)-4), *in);
+ if( ferror(*in) ) {
+ perror("crexrd file read error");
+ *status = FILE_READ_ERROR;
+ return;
+ }
+ endBuffer = buffer + number + 3;
+
+/*
+// Look for ++CrCrLf7777 at end of product
+*/
+ next = buffer+4;
+ endFound = 0;
+ for( loop = 0; loop < 8; loop++ )
+ plplcrcrlf7777[loop] = *(next++);
+ plplcrcrlf7777[9] = '\0';
+
+ while( (!endFound) && (next<=endBuffer) ) {
+ plplcrcrlf7777[8] = *(next++);
+ if( strcmp(plplcrcrlf7777,PlPlCrCrLf7777) == 0 ) {
+ endFound = 1;
+ *size = (int) (next - buffer);
+ }
+
+ for( loop = 0; loop < 8; loop++ )
+ plplcrcrlf7777[loop] = plplcrcrlf7777[loop+1];
+ }
+
+ if( !endFound ) {
+ if( feof(*in) )
+ *status = END_OF_FILE;
+ else
+ *status = USER_BUFFER_TOO_SMALL;
+ return;
+ }
+
+/*
+// Position file at end of CREX product
+*/
+ *status = fseek(*in, (foundPosition+(*size)), 0);
+
+}
diff --git a/pbio/emosnum.F b/pbio/emosnum.F
new file mode 100755
index 0000000..8bc4df9
--- /dev/null
+++ b/pbio/emosnum.F
@@ -0,0 +1,101 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION EMOSNUM(KONOFF)
+C
+C---->
+C**** EMOSNUM
+C
+C Purpose
+C -------
+C
+C Returns current EMOSLIB version number.
+C
+C
+C Interface
+C ---------
+C
+C INUM = EMOSNUM(KONOFF)
+C
+C Input
+C -----
+C
+C KONOFF - switch for displayed message
+C = 0 if display is required on the first call
+C = non-zero if display is not required
+C
+C
+C Output
+C ------
+C
+C Returns a 6-digit version number, aaabbc, where:
+C aaa = 3-digit major number
+C bb = 2-digit minor number
+C c = 1-digit spare number (normally 0)
+C
+C
+C Method
+C ------
+C
+C Reads a 6-digit version number from the environment variable
+C EMOS_CYCLE. If this does not give a 6-digit number, an internal
+C hard-coded default value is used.
+C
+C On the first call, the function (optionally) displays a message:
+C
+C ***********************************
+C * EMOSLIB version number = aaabbc *
+C ***********************************
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF May 1998
+C
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0. Variables.
+C ------------------------------------------------------------------
+C
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Function arguments
+C
+ INTEGER KONOFF
+C
+C Local variables
+C
+ INTEGER INUMBER, ICOUNT, IOFFSET
+ SAVE INUMBER, ICOUNT
+ CHARACTER*35 CMESS
+ CHARACTER*20 YNUMBER
+C
+ DATA INUMBER/000392/, ICOUNT/0/
+ DATA CMESS/'* EMOSLIB version number = ****** *'/
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ EMOSNUM = INUMBER
+C
+ RETURN
+ END
diff --git a/pbio/extras.c b/pbio/extras.c
new file mode 100755
index 0000000..109a53a
--- /dev/null
+++ b/pbio/extras.c
@@ -0,0 +1,66 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+/*
+ extras.c
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static char *putfstr(char *target, char *source, int length_target)
+{
+int i;
+
+/* Move characters from C source to Fortran target */
+ strcpy(target,source);
+
+/* Pad Fortran target to end with spaces */
+ for(i = strlen(source); i<length_target; i++)
+ target[i] = ' ';
+
+ return target;
+}
+
+long f_getenv_(char * env_string, char * env_info,
+ int len_env_string, int len_env_info)
+{
+char *e, *env_copy;
+
+/* Copy Fortran string and remove trailing blanks */
+ env_copy = (char *) malloc(len_env_string+1);
+ if( env_copy == NULL )
+ {
+ perror("F_GETENV: malloc error");
+ exit(1);
+ }
+ strncpy(env_copy, env_string, len_env_string);
+ for( e = (env_copy+len_env_string-1); *e == ' '; e-- ) *e = '\0';
+
+/* Get the environment information and return it to the Fortran caller */
+ if(e = (char*)getenv(env_copy))
+ {
+ putfstr(env_info, e, len_env_info);
+ free( env_copy );
+ return 1;
+ }
+ else
+ {
+ free( env_copy );
+ return 0;
+ }
+}
+
+long f_getenv(char * env_string, char * env_info,
+ int len_env_string, int len_env_info) {
+
+ return f_getenv_(env_string,env_info,len_env_string,len_env_info);
+}
diff --git a/pbio/fileRead.h b/pbio/fileRead.h
new file mode 100755
index 0000000..3edd1af
--- /dev/null
+++ b/pbio/fileRead.h
@@ -0,0 +1,90 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef FILE_READ_H
+#define FILE_READ_H
+/*
+ fileRead.h
+*/
+#include <stdio.h>
+
+#ifdef linux
+# if !defined __off64_t_defined
+typedef __off64_t off64_t;
+#define __off64_t_defined
+#endif
+#endif
+
+#ifdef FOPEN64
+#define OFF_T off64_t
+#else
+#define OFF_T off_t
+#endif
+
+static fortint fileRead(char * buffer, fortint length, void * file) {
+/*
+// buffer = buffer to fill,
+// length = size of buffer in bytes,
+// file = file pointer from fopen().
+//
+// Returns the number of bytes read.
+// On END_OF_FILE, returns negative value for number of bytes read .
+*/
+
+fortint nbytes;
+
+ nbytes = (fortint) fread( buffer, 1, length, (FILE *) file);
+ if ( feof((FILE *) file ) ) {
+ clearerr( (FILE *) file );
+ return (-nbytes);
+ }
+ return nbytes;
+}
+
+#ifdef FOPEN64
+static OFF_T fileSeek(void * file, OFF_T offset, fortint from) {
+
+ return ( (OFF_T) fseeko64((FILE *) file, offset, from) );
+}
+#else
+static fortint fileSeek(void * file, fortint offset, fortint from) {
+
+ return ( (fortint) fseek((FILE *) file, offset, from) );
+}
+#endif
+
+
+#ifdef FOPEN64
+static OFF_T fileTell(void * file) {
+
+ return ( (OFF_T) ftello64((FILE *) file) );
+}
+#else
+static fortint fileTell(void * file) {
+
+ return ( (fortint) ftell((FILE *) file) );
+}
+#endif
+
+#ifdef FOPEN64
+fortint readprod( char *, char * , fortint * ,
+ fortint (*fileRead)(char *, fortint, void *),
+ OFF_T (*fileSeek)(void *, OFF_T, fortint),
+ OFF_T (*fileTell)(void *),
+ void * );
+#else
+fortint readprod( char *, char * , fortint * ,
+ fortint (*fileRead)(char *, fortint, void *),
+ fortint (*fileSeek)(void *, fortint, fortint),
+ fortint (*fileTell)(void *),
+ void * );
+#endif
+
+#endif /* end of FILE_READ_H */
diff --git a/pbio/fort2c.c b/pbio/fort2c.c
new file mode 100755
index 0000000..6dc30f7
--- /dev/null
+++ b/pbio/fort2c.c
@@ -0,0 +1,48 @@
+/**
+* Copyright 1981-2012 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 <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+/*
+ fort2c.c
+*/
+#include "fort2c.h"
+
+char *fcd2char(fortchar)
+_fcd fortchar;
+{
+#ifndef VAX
+ char *name = _fcdtocp(fortchar);
+ int len = _fcdlen(fortchar);
+#else
+ char * name = fortchar->address;
+ short len = fortchar->length;
+#endif
+
+ char * newp = (char *) malloc(len+1);
+
+ if(!newp)
+ {
+ perror("malloc");
+ return((char*)0);
+ }
+
+ strncpy(newp,name,len);
+
+ while( len && newp[--len] == ' ');
+
+ newp[++len]='\0';
+
+ return(newp);
+}
+
+
diff --git a/pbio/fort2c.h b/pbio/fort2c.h
new file mode 100755
index 0000000..faa4d28
--- /dev/null
+++ b/pbio/fort2c.h
@@ -0,0 +1,108 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef FORT2C_H
+#define FORT2C_H
+/*
+ fort2c.h
+*/
+#ifdef CRAY
+/* #include <fortran.h> */
+typedef int _f_int6;
+typedef long _f_int8;
+typedef _f_int6 _f_int;
+typedef _f_int8 _f_int4;
+typedef _f_int8 _f_int2;
+typedef _f_int8 _f_int1;
+typedef long _f_log8;
+typedef _f_log8 _f_log;
+typedef _f_log8 _f_log4;
+typedef _f_log8 _f_log2;
+typedef _f_log8 _f_log1;
+typedef double _f_real8;
+typedef long double _f_real16;
+typedef _f_real8 _f_real;
+typedef _f_real16 _f_dble;
+typedef _f_real8 _f_real4;
+typedef _Complex double _f_comp8;
+
+typedef _f_comp8 _f_comp;
+
+
+
+typedef union _FCD {
+ char *c_pointer;
+ struct {
+ unsigned bit_offset : 6,
+ fcd_len : 26,
+ word_addr : 32;
+ } _F;
+} _dcf;
+typedef void *_fcd;
+
+
+
+
+typedef void *_GPTR;
+typedef const void *_GPTR2CONST;
+
+extern _fcd _cptofcd (char *_Ccp, unsigned _Len);
+extern char * _fcdtocp (_fcd _Fcd);
+extern unsigned int _fcdlen (_fcd _Fcd);
+extern _f_log _btol (long _BV);
+extern long _lvtob (_f_log _LV);
+extern long _ltob (_f_log *_LP);
+extern char * _f2ccpy (_fcd f, ...);
+extern char * _fc_copy (_fcd f, char *s, int slen);
+extern char * _fc_acopy (_fcd f);
+extern int _c2fcpy(char *c, _fcd f);
+extern int _isfcd (long _P);
+
+static _fcd
+__cptofcd(char *c, unsigned int l);
+#pragma _CRI inline __cptofcd
+static _fcd
+__cptofcd(char *c, unsigned int l)
+{
+ _dcf f;
+
+ f.c_pointer = c;
+ f._F.fcd_len = l << 3;
+
+ return ((*(_fcd *) &f));
+}
+static char *
+__fcdtocp(_fcd f);
+#pragma _CRI inline __fcdtocp
+static char *
+__fcdtocp(_fcd f)
+{
+ char *c;
+ _dcf d;
+ d = (*(_dcf *) &f);
+ d._F.fcd_len = 0;
+ c = d.c_pointer;
+ return (c);
+}
+#else
+#define _fcd char *
+#define _fcdtocp(a) a
+#define _fcdlen(a) strlen(a)
+#endif
+
+#ifdef VAX
+typedef struct {short length; short magic; char * address;}DESC;
+#define _fcdtocp(a) fcdtocp(a)
+#define _fcd DESC *
+#endif
+
+char *fcd2char(); /* fortran to c string convertion (alloc memory) */
+
+#endif /* end of FORT2C_H */
diff --git a/pbio/fort2c_hppa.c b/pbio/fort2c_hppa.c
new file mode 100755
index 0000000..6ba7831
--- /dev/null
+++ b/pbio/fort2c_hppa.c
@@ -0,0 +1,51 @@
+/**
+* Copyright 1981-2012 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 <inttypes.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+/*
+ fort2c.c
+*/
+#include "fort2c.h"
+
+char *fcd2char(fortchar)
+_fcd fortchar;
+{
+#ifndef VAX
+ char *name = _fcdtocp(fortchar);
+ int len = _fcdlen(fortchar);
+#else
+ char * name = fortchar->address;
+ short len = fortchar->length;
+#endif
+
+ char * newp = (char *) malloc(len+1);
+
+ if(!newp)
+ {
+ perror("malloc");
+ return((char*)0);
+ }
+
+ strncpy(newp,name,len);
+
+ while( len && newp[--len] == ' ');
+
+ newp[++len]='\0';
+
+ return(newp);
+}
+
+
+
+
diff --git a/pbio/fortint.h b/pbio/fortint.h
new file mode 100755
index 0000000..8c8f70e
--- /dev/null
+++ b/pbio/fortint.h
@@ -0,0 +1,24 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef FORTINT_H
+#define FORTINT_H
+
+#ifdef INTEGER_IS_INT
+#define fortint int
+#else
+#if defined hpR64 || defined hpiaR64
+#define fortint long long
+#else
+#define fortint long
+#endif
+#endif
+
+#endif /* end of FORTINT_H */
diff --git a/pbio/gbyte.c b/pbio/gbyte.c
new file mode 100755
index 0000000..10f8103
--- /dev/null
+++ b/pbio/gbyte.c
@@ -0,0 +1,287 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+/*
+// gbyte.c
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+#include "fortint.h"
+
+/*
+// Retrieve or store arbitrary bit-size values from or to SWORD-bit words
+//
+// Rewritten April 2000, J.D.Chambers, ECMWF.
+//
+*/
+
+void gbytes_( void *, void *, fortint *, fortint *, fortint *, fortint *);
+void gbytes( void *, void *, fortint *, fortint *, fortint *, fortint *);
+void gbyte_( void* , void *, fortint *, fortint *);
+void gbyte( void* , void *, fortint *, fortint *);
+void sbytes_( void* , void *, fortint *, fortint *, fortint *, fortint *);
+void sbytes( void* , void *, fortint *, fortint *, fortint *, fortint *);
+void sbyte_( void* , void *, fortint *, fortint *);
+void sbyte( void* , void *, fortint *, fortint *);
+
+#ifdef INTEGER_8
+#define BITS_PER_WORD 64
+#else
+#define BITS_PER_WORD 32
+#endif
+# define SWORD BITS_PER_WORD /* Word size in bits */
+
+static fortint MASK = -1; /* Mask of sword bits */
+
+# define VALUE(p,q,b) \
+ (((b)==BITS_PER_WORD ? MASK : ~(MASK<<(b))) & ((p)>>(SWORD-((q)+(b)))))
+/*
+// Gets a b-bit value, with its leftmost bit at position q
+// (q = 0 for most significant bit)
+*/
+
+# define MASKVALUE(q,b) \
+ ((b)==BITS_PER_WORD ? MASK : (~(MASK<<(b))<<(SWORD-((q)+(b)))))
+/*
+// Creates a b-bit mask, with its leftmost bit at position q
+// (q = 0 for most significant bit)
+*/
+
+void gbytes_(
+ void *Source,
+ void *Destination,
+ fortint *startSkip,
+ fortint *bitsPerValue,
+ fortint *skipBetweenValues,
+ fortint *numberOfValues) {
+/*
+// GBYTES:
+//
+// Unpacks values from source to destination.
+//
+// Makes an initial skip over bits in source, then skips bits between values.
+//
+// startSkip >= 0 Number of bits to be skipped preceding first
+// value in source
+//
+// 0 < bitsPerValue < 32 Size in bits of each value
+//
+// skipBetweenValues >= 0 Number of bits to be skipped between values
+//
+// numberOfValues >= 0 Number of values to be packed/unpacked
+//
+*/
+fortint * source = (fortint *) Source;
+fortint * destination = (fortint *) Destination;
+fortint nextWord,nextValueFirstBit,next;
+
+ nextWord = 0;
+ nextValueFirstBit = *startSkip;
+ for (next = 0; next < *numberOfValues; ++next) {
+ gbyte_(&source[nextWord],&destination[next],&nextValueFirstBit,bitsPerValue);
+ nextValueFirstBit += *bitsPerValue + *skipBetweenValues;
+ nextWord += nextValueFirstBit/SWORD;
+ nextValueFirstBit %= SWORD;
+ }
+}
+
+void gbytes(
+ void *Source,
+ void *Destination,
+ fortint *startSkip,
+ fortint *bitsPerValue,
+ fortint *skipBetweenValues,
+ fortint *numberOfValues) {
+
+ gbytes_(Source,Destination,startSkip,bitsPerValue,skipBetweenValues,
+ numberOfValues);
+}
+
+void gbyte_(
+ void* Source,
+ void *Destination,
+ fortint *nextValueFirstBit,
+ fortint *bitsPerValue) {
+/*
+// GBYTE:
+//
+// Unpacks one value from source to destination.
+//
+// nextValueFirstBit >= 0 Number in word of first bit to process
+//
+// 0 < bitsPerValue < SWORD Size in bits of each value
+//
+// Value may overlap a word boundary
+*/
+fortint * source = (fortint *) Source;
+fortint * destination = (fortint *) Destination;
+fortint countOfLeftmostBits,nextWord,leftmostBits,startBit,remainingBits;
+
+/*
+// Position at start word and bit
+*/
+ startBit = *nextValueFirstBit;
+ remainingBits = *bitsPerValue;
+
+ if (startBit >= SWORD) {
+ nextWord = startBit/SWORD;
+ startBit %= SWORD;
+ } else
+ nextWord=0;
+
+/*
+// If value spans a word boundary, pick up leftmost bits first
+*/
+ countOfLeftmostBits = startBit + remainingBits;
+ if (countOfLeftmostBits > SWORD) {
+ countOfLeftmostBits = SWORD - startBit;
+ remainingBits -= countOfLeftmostBits;
+ leftmostBits =
+ (VALUE(source[nextWord],startBit,countOfLeftmostBits)) << remainingBits;
+ startBit = 0;
+ nextWord++;
+ } else
+ leftmostBits = 0;
+
+/*
+// Complete value by picking up the rightmost bits
+*/
+ *destination = leftmostBits +
+ (VALUE(source[nextWord],startBit,remainingBits));
+
+}
+
+void gbyte(
+ void* Source,
+ void *Destination,
+ fortint *nextValueFirstBit,
+ fortint *bitsPerValue) {
+
+ gbyte_(Source,Destination,nextValueFirstBit,bitsPerValue);
+}
+
+void sbytes_(
+ void* Destination,
+ void *Source,
+ fortint *startSkip,
+ fortint *bitsPerValue,
+ fortint *skipBetweenValues,
+ fortint *numberOfValues) {
+/*
+// SBYTES:
+//
+// Packs values from source to destination.
+//
+// Makes an initial skip over bits in source, then skips bits between values.
+//
+// startSkip >= 0 Number of bits to be skipped preceding first
+// value in destination
+//
+// 0 < bitsPerValue < 32 Size in bits of each value
+//
+// skipBetweenValues >= 0 Number of bits to be skipped between values
+//
+// numberOfValues >= 0 Number of values to be packed/unpacked
+//
+*/
+fortint * source = (fortint *) Source;
+fortint * destination = (fortint *) Destination;
+fortint nextWord,nextValueFirstBit,next;
+
+ nextWord = 0;
+ nextValueFirstBit = *startSkip;
+ for (next = 0; next < *numberOfValues; ++next) {
+ sbyte_(&destination[nextWord],&source[next],&nextValueFirstBit,bitsPerValue);
+ nextValueFirstBit += *bitsPerValue + *skipBetweenValues;
+ nextWord += nextValueFirstBit/SWORD;
+ nextValueFirstBit %= SWORD;
+ }
+}
+
+void sbytes(
+ void* Destination,
+ void *Source,
+ fortint *startSkip,
+ fortint *bitsPerValue,
+ fortint *skipBetweenValues,
+ fortint *numberOfValues) {
+
+ sbytes_(Destination,Source,startSkip,bitsPerValue,skipBetweenValues,
+ numberOfValues);
+}
+
+void sbyte_(
+ void* Destination,
+ void *Source,
+ fortint *nextValueFirstBit,
+ fortint *bitsPerValue) {
+/*
+// SBYTE:
+//
+// Packs one value from source to destination.
+//
+// nextValueFirstBit >= 0 Number in word of first bit to store
+//
+// 0 < bitsPerValue < SWORD Size in bits of each value
+//
+// Value may overlap a word boundary
+//
+*/
+fortint * source = (fortint *) Source;
+fortint * destination = (fortint *) Destination;
+fortint countOfLeftmostBits,nextWord,startBit,remainingBits,rightmostBits;
+
+/*
+// Position at start word and bit
+*/
+ startBit = *nextValueFirstBit;
+ remainingBits = *bitsPerValue;
+
+ if (startBit >= SWORD) {
+ nextWord = startBit / SWORD;
+ startBit %= SWORD;
+ } else
+ nextWord = 0;
+
+/*
+// If value spans a word boundary, store leftmost bits first
+*/
+ countOfLeftmostBits = startBit + remainingBits;
+ if (countOfLeftmostBits > SWORD) {
+ countOfLeftmostBits = SWORD - startBit;
+ startBit = SWORD - remainingBits;
+ remainingBits -= countOfLeftmostBits;
+ destination[nextWord] =
+ ((destination[nextWord] >> countOfLeftmostBits) << countOfLeftmostBits)
+ + (VALUE(*source,startBit,countOfLeftmostBits));
+ startBit = 0;
+ nextWord++;
+ }
+
+/*
+// Complete value by storing the rightmost bits
+*/
+ rightmostBits = VALUE(*source,SWORD-remainingBits,remainingBits);
+ destination[nextWord] =
+ (destination[nextWord] & ~MASKVALUE(startBit,remainingBits))
+ + (rightmostBits << SWORD-(remainingBits+startBit));
+
+}
+
+void sbyte(
+ void* Destination,
+ void *Source,
+ fortint *nextValueFirstBit,
+ fortint *bitsPerValue) {
+
+ sbyte_(Destination,Source,nextValueFirstBit,bitsPerValue);
+}
diff --git a/pbio/gbyte_alpha.c b/pbio/gbyte_alpha.c
new file mode 100755
index 0000000..f4f6623
--- /dev/null
+++ b/pbio/gbyte_alpha.c
@@ -0,0 +1,215 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+#define GBYTES gbytes_
+#define GBYTE gbyte_
+#define SBYTES sbytes_
+#define SBYTE sbyte_
+
+#define SWORD 32
+#define MASKSWORD 0x3f
+
+static int onbit[32] = {
+ 0x00000001,0x00000002,0x00000004,0x00000008,
+ 0x00000010,0x00000020,0x00000040,0x00000080,
+ 0x00000100,0x00000200,0x00000400,0x00000800,
+ 0x00001000,0x00002000,0x00004000,0x00008000,
+ 0x00010000,0x00020000,0x00040000,0x00080000,
+ 0x00100000,0x00200000,0x00400000,0x00800000,
+ 0x01000000,0x02000000,0x04000000,0x08000000,
+ 0x10000000,0x20000000,0x40000000,0x80000000};
+
+/*
+// Retrieve or store arbitrary bit-size values from or to SWORD-bit words
+//
+// Rewritten April 2000, J.D.Chambers, ECMWF.
+//
+*/
+
+void GBYTES(
+ void* Source,
+ void* Destination,
+ int* startSkip,
+ int* bitsPerValue,
+ int* skipBetweenValues,
+ int* numberOfValues) {
+/*
+// GBYTES:
+//
+// Unpacks values from source to destination.
+//
+// Makes an initial skip over bits in source, then skips bits between values.
+//
+// startSkip >= 0 Number of bits to be skipped preceding first
+// value in source
+//
+// 0 < bitsPerValue < SWORD Size in bits of each value
+//
+// skipBetweenValues >= 0 Number of bits to be skipped between values
+//
+// numberOfValues >= 0 Number of values to be packed/unpacked
+//
+// Move one bit at a time (!!)
+// Uses shifts and masks instead of divides.
+// Sets destination bit to 0/1 as source bit is 0/1.
+*/
+unsigned char* source = (unsigned char*) Source;
+int* destination = (int*) Destination;
+int bpv, bit, byte, bitShift, nextBit, nextValueFirstBit, next, step;
+
+ bpv = *bitsPerValue;
+ step = bpv + *skipBetweenValues;
+ nextValueFirstBit = *startSkip;
+
+ for (next = 0; next < *numberOfValues; ++next) {
+ destination[next] = 0;
+ nextBit = nextValueFirstBit;
+
+ for ( bit = 0; bit < bpv; bit++ ) {
+ byte = ( nextBit ) >> 3;
+ bitShift = 7 - ( nextBit++ ) & 0x7;
+
+ destination[next] <<= 1 ;
+ if( (source[byte] & onbit[bitShift]) ) destination[next] |= 1;
+ }
+
+ nextValueFirstBit += step;
+ }
+
+}
+
+void GBYTE(
+ void* Source,
+ void* Destination,
+ int* startSkip,
+ int* bitsPerValue) {
+/*
+// GBYTE:
+//
+// Unpacks one value from source to destination.
+//
+// Makes an initial skip over bits in source.
+//
+// startSkip >= 0 Number of bits to be skipped preceding first
+// value in source
+//
+// 0 < bitsPerValue < SWORD Size in bits of each value
+//
+// Move one bit at a time (!!)
+// Uses shifts and masks instead of divides.
+// Sets destination bit to 0/1 as source bit is 0/1.
+*/
+int bpv, temp, nextBit, byte, bitShift, bit;
+unsigned char* source = (unsigned char*) Source;
+int* destination = (int*) Destination;
+
+ temp = 0;
+ bpv = *bitsPerValue;
+ nextBit = *startSkip;
+
+ for ( bit = 0; bit < bpv; bit++ ) {
+ byte = ( nextBit ) >> 3;
+ bitShift = 7 - ( nextBit++ ) & 0x7;
+
+ temp <<= 1 ;
+ if( (source[byte] & onbit[bitShift]) ) temp |= 1;
+ }
+
+ *destination = temp;
+}
+
+
+void SBYTES(
+ void* Destination,
+ void* Source,
+ int* startSkip,
+ int* bitsPerValue,
+ int* skipBetweenValues,
+ int* numberOfValues) {
+/*
+// SBYTES:
+//
+// Packs values from source to destination.
+//
+// Makes an initial skip over bits in source, then skips bits between values.
+//
+// startSkip >= 0 Number of bits to be skipped preceding first
+// value in destination
+//
+// 0 < bitsPerValue < SWORD Size in bits of each value
+//
+// skipBetweenValues >= 0 Number of bits to be skipped between values
+//
+// numberOfValues >= 0 Number of values to be packed/unpacked
+//
+// Move one bit at a time (!!)
+// Uses shifts and masks instead of divides.
+// Sets destination bit to 0/1 as source bit is 0/1.
+*/
+unsigned char* destination = (unsigned char*) Destination;
+int* source = (int*) Source;
+int bitShift, bitPosition;
+int nextValueFirstBit, bpvm1;
+int nextDestination, nextBit, bit;
+int step, nextValue;
+unsigned char setBit0[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
+unsigned char setBit1[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
+
+ step = *bitsPerValue + *skipBetweenValues;
+ nextValueFirstBit = *startSkip;
+ bpvm1 = (*bitsPerValue - 1);
+
+ for( nextValue = 0; nextValue < *numberOfValues; ++nextValue) {
+ nextBit = nextValueFirstBit;
+
+ for ( bit = 0; bit < *bitsPerValue; bit++ ) {
+ nextDestination = ( nextBit ) >> 3;
+ bitShift = (bpvm1 - bit) & MASKSWORD;
+ bitPosition = 7 - (( nextBit++ ) & 0x7);
+
+ if( (source[nextValue] & onbit[bitShift]) )
+ destination[nextDestination] |= setBit1[bitPosition];
+ else
+ destination[nextDestination] &= setBit0[bitPosition];
+ }
+
+ nextValueFirstBit += step;
+ }
+}
+
+
+void SBYTE(
+ void* destination,
+ void* source,
+ int* startSkip,
+ int* bitsPerValue) {
+/*
+// SBYTE:
+//
+// Packs one value from source to destination.
+//
+// Makes an initial skip over bits in source.
+//
+// startSkip >= 0 Number of bits to be skipped preceding first
+// value in source
+//
+// 0 < bitsPerValue < SWORD Size in bits of each value
+//
+*/
+int skipBetweenValues=0, numberOfValues=1;
+
+ SBYTES(destination,
+ source,
+ startSkip,
+ bitsPerValue,
+ &skipBetweenValues,
+ &numberOfValues);
+}
diff --git a/pbio/gbyte_le.c b/pbio/gbyte_le.c
new file mode 100755
index 0000000..20af95a
--- /dev/null
+++ b/pbio/gbyte_le.c
@@ -0,0 +1,369 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <assert.h>
+#define EFDEBUG 0
+#define fortint int
+#define GBYTES gbytes_
+#define GBYTE gbyte_
+#define SBYTES sbytes_
+#define SBYTE sbyte_
+
+#define SWORD 32
+#define MASKSWORD 0x3f
+
+static int onbit[32] = {
+ 0x00000001,0x00000002,0x00000004,0x00000008,
+ 0x00000010,0x00000020,0x00000040,0x00000080,
+ 0x00000100,0x00000200,0x00000400,0x00000800,
+ 0x00001000,0x00002000,0x00004000,0x00008000,
+ 0x00010000,0x00020000,0x00040000,0x00080000,
+ 0x00100000,0x00200000,0x00400000,0x00800000,
+ 0x01000000,0x02000000,0x04000000,0x08000000,
+ 0x10000000,0x20000000,0x40000000,0x80000000};
+
+static unsigned long masks[] = {0,1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535,
+ 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215, 33554431,
+ 67108863, 134217727, 268435455, 536870911, 1073741823, 2147483647, -1};
+
+/*
+// GBYTE:
+//
+// Unpacks one value from source to destination.
+//
+// Makes an initial skip over bits in source.
+//
+// startSkip >= 0 Number of bits to be skipped preceding first
+// value in source
+//
+// 0 < bitsPerValue < SWORD <= 32 Size in bits of each value
+//
+//
+// Rewritten to get better preformance on little endian machines.
+// This code is portable to big endian machines.
+// November 2006 Enrico Fucile
+//
+*/
+void GBYTE( void* Source, void* Destination, int* bitToSkip, int* bitsPerValue) {
+ fortint mask,nextWord,nextValueFirstBit,moveBitsLeft,moveBitsRight,nextByte,nextBitOfByte;
+ int bytesPerValue,extraBitsPerValue;
+ unsigned long i0,i1,i2,i3,temp,temp1;
+ unsigned char* source = (unsigned char*) Source;
+ fortint* destination = (fortint*) Destination;
+ nextBitOfByte = *bitToSkip % 8;
+ extraBitsPerValue = *bitsPerValue % 8;
+
+ #if EFDEBUG
+ printf("---- nextBitOfByte = %d\n",nextBitOfByte);
+ if (nextBitOfByte != 0) printf("---- (not zero) nextBitOfByte = %d\n",nextBitOfByte);
+ printf("---- bitsPerValue= %d ---\n",*bitsPerValue);
+ #endif
+
+ if (*bitsPerValue > 32) {
+ int byte, bitShift, bit;
+ fortint t = 0;
+ int bpv = *bitsPerValue;
+ int nextBit = *bitToSkip;
+
+ for ( bit = 0; bit < bpv; bit++ ) {
+ byte = ( nextBit ) >> 3;
+ bitShift = 7 - ( nextBit++ ) & 0x7;
+
+ temp <<= 1 ;
+ if( (source[byte] & onbit[bitShift]) ) temp |= 1;
+ }
+
+ *destination = temp;
+ return;
+ }
+
+ if ( extraBitsPerValue==0 && nextBitOfByte == 0 ) {
+ nextByte = *bitToSkip / 8;
+ #if EFDEBUG
+ printf("---- nextByte = %d\n",nextByte);
+ printf("---- bytesPerValue = %d\n",bytesPerValue);
+ fflush(stdout);
+ #endif
+ switch (*bitsPerValue) {
+ case 8:
+ *destination=(fortint) source[nextByte];
+ break;
+ case 16:
+ *destination=(fortint) ((source[nextByte]<<8) + source[nextByte+1]);
+ break;
+ case 24:
+ *destination=(fortint) ((source[nextByte]<<16) + (source[nextByte+1]<<8) +source[nextByte+2]);
+ break;
+ case 32:
+ *destination=(fortint) ((source[nextByte]<<24) + (source[nextByte+1]<<16) +(source[nextByte+2]<<8)+source[nextByte+3]);
+ break;
+ default:
+ destination=0;
+ }
+ #if EFDEBUG
+ printf("-------------------- destination=%ld\n",(long)*destination);
+ #endif
+ } else {
+ mask=masks[*bitsPerValue];
+ nextWord = *bitToSkip / SWORD;
+ nextByte = nextWord*4;
+ nextValueFirstBit = *bitToSkip % SWORD;
+ moveBitsLeft = 0;
+ moveBitsRight = SWORD - *bitsPerValue - nextValueFirstBit;
+ #if EFDEBUG
+ printf("---- nextWord = %d\n",nextWord);
+ printf("---- nextValueFirstBit = %d\n",nextValueFirstBit);
+ printf("---- moveBitsRight= %d\n",moveBitsRight);
+ #endif
+ if (moveBitsRight > 0) {
+
+ i0=(unsigned long)(source[nextByte]) << 24;
+ i1=(unsigned long)(source[nextByte+1]) << 16;
+ i2=(unsigned long)(source[nextByte+2]) << 8;
+ i3=(unsigned long)(source[nextByte+3]) ;
+ *destination = (fortint)( ((i0 + i1 + i2 + i3) >> moveBitsRight) & mask );
+ #if EFDEBUG
+ printf("-------------------- destination=%ld\n",(char)*destination,(long)*destination);
+ #endif
+
+ } else if ( moveBitsRight < 0 ) {
+
+ moveBitsLeft=-moveBitsRight;
+ moveBitsRight=SWORD-moveBitsLeft;
+ i0=(unsigned long)(source[nextByte]) << 24;
+ i1=(unsigned long)(source[nextByte+1]) << 16;
+ i2=(unsigned long)(source[nextByte+2]) << 8;
+ i3=(unsigned long)(source[nextByte+3]) ;
+ temp1 = (unsigned long)(i0 + i1 + i2 + i3) << moveBitsLeft ;
+
+ i0=(unsigned long)(source[nextByte+4]) << 24;
+ i1=(unsigned long)(source[nextByte+5]) << 16;
+ i2=(unsigned long)(source[nextByte+6]) << 8;
+ i3=(unsigned long)(source[nextByte+7]) ;
+ temp= (unsigned long)(i0 + i1 + i2 + i3) >> moveBitsRight;
+
+ *destination = (fortint) (temp1 | temp);
+ *destination &= mask;
+ #if EFDEBUG
+ printf("+++++++++ destination=%ld temp1=%ld temp=%ld mask=%ld bitsPerValue=%d moveBitsRight=%d moveBitsLeft=%d\n",*destination,temp1,temp,mask,*bitsPerValue,moveBitsRight,moveBitsLeft);
+ #endif
+
+ } else {
+
+ i0=(fortint)(source[nextByte]) << 24;
+ i1=(fortint)(source[nextByte+1]) << 16;
+ i2=(fortint)(source[nextByte+2]) << 8;
+ i3=(fortint)(source[nextByte+3]) ;
+ *destination = ( i0 + i1 + i2 + i3 ) & mask ;
+ #if EFDEBUG
+ printf("-------------------- destination=%ld\n",(char)*destination,(long)*destination);
+ #endif
+ }
+ }
+}
+
+#if 0
+void GBYTE(
+ void* Source,
+ void* Destination,
+ int* startSkip,
+ int* bitsPerValue) {
+/*
+// GBYTE:
+//
+// Unpacks one value from source to destination.
+//
+// Makes an initial skip over bits in source.
+//
+// startSkip >= 0 Number of bits to be skipped preceding first
+// value in source
+//
+// 0 < bitsPerValue < SWORD Size in bits of each value
+//
+// Move one bit at a time (!!)
+// Uses shifts and masks instead of divides.
+// Sets destination bit to 0/1 as source bit is 0/1.
+*/
+int bpv, temp, nextBit, byte, bitShift, bit;
+unsigned char* source = (unsigned char*) Source;
+int* destination = (int*) Destination;
+
+ temp = 0;
+ bpv = *bitsPerValue;
+ nextBit = *startSkip;
+
+ for ( bit = 0; bit < bpv; bit++ ) {
+ byte = ( nextBit ) >> 3;
+ bitShift = 7 - ( nextBit++ ) & 0x7;
+
+ temp <<= 1 ;
+ if( (source[byte] & onbit[bitShift]) ) temp |= 1;
+ }
+
+ *destination = temp;
+}
+
+#endif
+
+
+
+/*
+// Retrieve or store arbitrary bit-size values from or to SWORD-bit words
+//
+// Rewritten April 2000, J.D.Chambers, ECMWF.
+//
+*/
+
+void GBYTES(
+ void* Source,
+ void* Destination,
+ int* startSkip,
+ int* bitsPerValue,
+ int* skipBetweenValues,
+ int* numberOfValues) {
+/*
+// GBYTES:
+//
+// Unpacks values from source to destination.
+//
+// Makes an initial skip over bits in source, then skips bits between values.
+//
+// startSkip >= 0 Number of bits to be skipped preceding first
+// value in source
+//
+// 0 < bitsPerValue < SWORD Size in bits of each value
+//
+// skipBetweenValues >= 0 Number of bits to be skipped between values
+//
+// numberOfValues >= 0 Number of values to be packed/unpacked
+//
+// Move one bit at a time (!!)
+// Uses shifts and masks instead of divides.
+// Sets destination bit to 0/1 as source bit is 0/1.
+*/
+unsigned char* source = (unsigned char*) Source;
+int* destination = (int*) Destination;
+int bpv, bit, byte, bitShift, nextBit, nextValueFirstBit, next, step;
+
+ bpv=*bitsPerValue;
+ step = *bitsPerValue + *skipBetweenValues;
+ nextValueFirstBit = *startSkip;
+
+ /* assert(*bitsPerValue <= 8*sizeof(*destination)); */
+ for (next = 0; next < *numberOfValues; ++next) {
+ destination[next] = 0;
+ nextBit=nextValueFirstBit;
+
+ /* printf("--- nextValueFirstBit=%d\n",nextValueFirstBit); */
+ GBYTE(source,&destination[next],&nextValueFirstBit,&bpv);
+
+ /*
+ for ( bit = 0; bit < bpv; bit++ ) {
+ byte = ( nextBit ) >> 3;
+ bitShift = 7 - ( nextBit++ ) & 0x7;
+
+ destination[next] <<= 1 ;
+ if( (source[byte] & onbit[bitShift]) ) destination[next] |= 1;
+ }
+ */
+
+ nextValueFirstBit += step;
+ }
+
+}
+
+void SBYTES(
+ void* Destination,
+ void* Source,
+ int* startSkip,
+ int* bitsPerValue,
+ int* skipBetweenValues,
+ int* numberOfValues) {
+/*
+// SBYTES:
+//
+// Packs values from source to destination.
+//
+// Makes an initial skip over bits in source, then skips bits between values.
+//
+// startSkip >= 0 Number of bits to be skipped preceding first
+// value in destination
+//
+// 0 < bitsPerValue < SWORD Size in bits of each value
+//
+// skipBetweenValues >= 0 Number of bits to be skipped between values
+//
+// numberOfValues >= 0 Number of values to be packed/unpacked
+//
+// Move one bit at a time (!!)
+// Uses shifts and masks instead of divides.
+// Sets destination bit to 0/1 as source bit is 0/1.
+*/
+unsigned char* destination = (unsigned char*) Destination;
+int* source = (int*) Source;
+int bitShift, bitPosition;
+int nextValueFirstBit, bpvm1;
+int nextDestination, nextBit, bit;
+int step, nextValue;
+unsigned char setBit0[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
+unsigned char setBit1[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
+
+ step = *bitsPerValue + *skipBetweenValues;
+ nextValueFirstBit = *startSkip;
+ bpvm1 = (*bitsPerValue - 1);
+
+ for( nextValue = 0; nextValue < *numberOfValues; ++nextValue) {
+ nextBit = nextValueFirstBit;
+
+ for ( bit = 0; bit < *bitsPerValue; bit++ ) {
+ nextDestination = ( nextBit ) >> 3;
+ bitShift = (bpvm1 - bit) & MASKSWORD;
+ bitPosition = 7 - (( nextBit++ ) & 0x7);
+
+ if( (source[nextValue] & onbit[bitShift]) )
+ destination[nextDestination] |= setBit1[bitPosition];
+ else
+ destination[nextDestination] &= setBit0[bitPosition];
+ }
+
+ nextValueFirstBit += step;
+ }
+}
+
+
+void SBYTE(
+ void* destination,
+ void* source,
+ int* startSkip,
+ int* bitsPerValue) {
+/*
+// SBYTE:
+//
+// Packs one value from source to destination.
+//
+// Makes an initial skip over bits in source.
+//
+// startSkip >= 0 Number of bits to be skipped preceding first
+// value in source
+//
+// 0 < bitsPerValue < SWORD Size in bits of each value
+//
+*/
+int skipBetweenValues=0, numberOfValues=1;
+
+ SBYTES(destination,
+ source,
+ startSkip,
+ bitsPerValue,
+ &skipBetweenValues,
+ &numberOfValues);
+}
diff --git a/pbio/grprs.h b/pbio/grprs.h
new file mode 100755
index 0000000..dc4e010
--- /dev/null
+++ b/pbio/grprs.h
@@ -0,0 +1,16 @@
+C
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+C Common blocks holding default or user supplied values for printing.
+C
+ LOGICAL GRPRSET
+ INTEGER GRPRSM
+C
+ COMMON /GRPRSCM/ GRPRSM, GRPRSET
diff --git a/pbio/lwsize.c b/pbio/lwsize.c
new file mode 100755
index 0000000..89b1229
--- /dev/null
+++ b/pbio/lwsize.c
@@ -0,0 +1,69 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include "fortint.h"
+#include "fileRead.h"
+
+#define BUFFLEN 4096
+
+void lwsize_(
+ fortint ** unit,
+ fortint * plen) {
+/*
+// Returns the size in bytes of the next GRIB, BUFR, TIDE, BUDG, DIAG
+// product.
+//
+// Called from C:
+// LWSIZE((fortint **) &unit, &plen);
+//
+// unit = file id returned from C fopen64.
+// plen = size in bytes of the next product.
+// = 0 if no product found
+//
+// The input file is left positioned where it started.
+*/
+fortint iret;
+char statbuff[BUFFLEN];
+long offset;
+
+/*
+// Record the current position of the file
+*/
+ offset = (fortint) fileTell(*unit);
+ if( offset < 0 ) {
+ perror("LWSIZE: fileTell error");
+ exit(1);
+ }
+/*
+// Use a smallish buffer for processing; this should suffice for all cases
+// except versions -1 and 0 of GRIB and large BUFR products
+*/
+ *plen = BUFFLEN;
+
+ iret = readprod(NULL,statbuff,plen,fileRead,fileSeek,fileTell,*unit);
+ if( (iret < 0) && (iret != -3) && (iret != -1) ) {
+ *plen = 0;
+ return;
+ }
+/*
+// Put the file pointer back where it started
+*/
+ offset = (fortint) fileSeek( *unit, offset, SEEK_SET);
+
+ return ;
+}
+
+void lwsize(fortint** unit,fortint* plen) {
+
+ lwsize_(unit,plen);
+}
diff --git a/pbio/make.dep b/pbio/make.dep
new file mode 100755
index 0000000..594adb7
--- /dev/null
+++ b/pbio/make.dep
@@ -0,0 +1,17 @@
+#
+# Header file dependencies
+#
+PBGroutines.o: PBGroutines.h
+crexrd.o: /usr/include/stdio.h
+extras.o: /usr/include/stdio.h
+fort2c.o: fort2c.h
+gbyte.o: /usr/include/stdio.h /usr/include/limits.h fortint.h
+newpbio.o: bufrgrib.h fort2c.h fortint.h /usr/include/sys/types.h /usr/include/sys/stat.h /usr/include/fcntl.h
+pbsize.o: /usr/include/stdio.h /usr/include/unistd.h bufrgrib.h fortint.h fileRead.h
+readany.o: bufrgrib.h fortint.h fileRead.h
+readbufr.o: bufrgrib.h fortint.h fileRead.h
+readgrib.o: bufrgrib.h fortint.h fileRead.h sizeRoutines.h
+readnext.o: bufrgrib.h fortint.h fileRead.h
+readprod.o: bufrgrib.h fortint.h /usr/include/stdio.h /usr/include/unistd.h /usr/include/string.h /usr/include/memory.h fileRead.h sizeRoutines.h
+recheckLength.o: /usr/include/stdio.h /usr/include/string.h
+setpar.o: /usr/include/limits.h fortint.h
diff --git a/pbio/mvchars.c b/pbio/mvchars.c
new file mode 100755
index 0000000..d62b5ba
--- /dev/null
+++ b/pbio/mvchars.c
@@ -0,0 +1,55 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "fortint.h"
+
+fortint mvchars_(fortint * k, char * s, long ls) {
+/*
+// Callable from Fortran to move a string of characters from s to integer
+// array k:
+//
+// INTEGER K(*)
+// CHARACTER*(*) S
+// INTEGER MVCHARS
+// EXTERNAL MVCHARS
+//
+// IRET = MVCHARS(K, S)
+//
+// Trailing blanks are ignored.
+// IRET is the count of the number of characters moved.
+*/
+int loop, last = -1;
+char * p = (char *) k;
+/*
+// Find the last non-blank character
+*/
+ for( loop = (ls - 1) ; loop >=0; loop-- )
+ if( *(s+loop) != ' ' ) {
+ last = loop;
+ break;
+ }
+/*
+// Fill k from s
+*/
+ for( loop = 0; loop <= last ; loop++ )
+ *p++ = *(s+loop);
+
+ return (fortint) (last+1);
+}
+
+fortint mvchars(fortint * k, char * s, long ls) {
+
+return mvchars_(k,s,ls);
+}
diff --git a/pbio/newpbio.c b/pbio/newpbio.c
new file mode 100755
index 0000000..d20e3ab
--- /dev/null
+++ b/pbio/newpbio.c
@@ -0,0 +1,592 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+/*
+ newpbio.c
+*/
+#include "bufrgrib.h"
+#include "fort2c.h"
+#include "fortint.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#ifndef CRAY
+#ifdef FORTRAN_NO_UNDERSCORE
+#define PBOPEN3 pbopen3
+#define PBREAD3 pbread3
+#define PBWRITE3 pbwrite3
+#define PBSEEK3 pbseek3
+#define PBCLOSE3 pbclose3
+#else
+#define PBOPEN3 pbopen3_
+#define PBREAD3 pbread3_
+#define PBWRITE3 pbwrite3_
+#define PBSEEK3 pbseek3_
+#define PBCLOSE3 pbclose3_
+#endif
+#endif
+
+#define NAMEBUFFLEN 256
+#define MODEBUFFLEN 10
+
+/*************************************************************************
+* FUNCTION: pbopen - Open file (from FORTRAN)
+**************************************************************************
+*/
+void PBOPEN(FILE ** unit, _fcd name, _fcd mode, fortint * iret,
+if defined hpR64 || defined hpiaR64
+ long l1, long l2)
+#else
+ fortint l1, fortint l2)
+#endif
+/*
+* Purpose: Opens file, return UNIX FILE pointer.
+*
+* Function returns: iret: -1 = Could not open file.
+* -2 = Invalid file name.
+* -3 = Invalid open mode specified
+* 0 = OK.
+*
+* Note: l1 and l2 are the lengths of the character strings in
+* name and mode on SGI.
+*/
+{
+char *fname;
+char *modes;
+char *p;
+char flags[4];
+
+#if (!defined CRAY) && (!defined VAX)
+char namebuff[NAMEBUFFLEN], modebuff[MODEBUFFLEN];
+
+/* Put the character strings into buffers and ensure that there is a
+ null terminator (for SGI case when FORTRAN CHARACTER variable is full
+ right to end with characters */
+ strncpy( namebuff, name, NAMEBUFFLEN - 1);
+ strncpy( modebuff, mode, MODEBUFFLEN - 1);
+ namebuff[l1] = '\0';
+ modebuff[l2] = '\0';
+#endif
+
+ strcpy(flags,"");
+
+ *unit = NULL;
+ *iret = 0;
+
+ /* convert fortran to c string : file name */
+
+#if (!defined CRAY) && (!defined VAX)
+ if(!(fname = fcd2char(namebuff)))
+#else
+ if(!(fname = fcd2char(name)))
+#endif
+ {
+ *iret = -2;
+ return;
+ }
+
+ /* strip trailing blanks */
+
+ p = fname + strlen(fname) - 1 ;
+ while(*p == ' ')
+ {
+ *p = 0;
+ p--;
+ }
+
+ /* convert fortran to c string : open modes */
+
+#if (!defined CRAY) && (!defined VAX)
+ if(!(modes = fcd2char(modebuff)))
+#else
+ if(!(modes = fcd2char(mode)))
+#endif
+ {
+ free(fname);
+ *iret = -2;
+ return;
+ }
+
+
+ /* build open flags from "modes" */
+
+ p = modes;
+ while(*p && ( strlen(flags) < 3 ) )
+ {
+ switch(*p)
+ {
+ case '+': strcat(flags, "+");
+ break;
+
+ case 'a':
+ case 'A': strcat(flags, "a");
+ break;
+
+ case 'c':
+ case 'C':
+ case 'w':
+ case 'W': strcat(flags, "w");
+ break;
+
+ case 'r':
+ case 'R': strcat(flags, "r");
+ break;
+
+ default: *iret = -3;
+ return;
+
+ }
+ p++;
+ }
+
+ /* if read/write change flags */
+
+ if ( !strcmp(flags,"wr") || !strcmp(flags, "rw") )
+ strcpy(flags, "r+w" );
+
+ *unit = fopen(fname, flags );
+
+ if(*unit == NULL)
+ {
+ perror(fname);
+ perror("pbopen");
+ *iret = -1;
+ }
+
+
+ free(fname);
+ free(modes);
+
+}
+
+/*************************************************************************
+* FUNCTION: pbseek - Seek (from FORTRAN)
+**************************************************************************
+*/
+void PBSEEK(FILE ** unit, fortint * offset, fortint * whence, fortint * iret)
+/*
+*
+* Purpose: Seeks to specified location in file.
+*
+* Function returns: status : -2 = error in handling file,
+* -1 = end-of-file
+* otherwise, = byte offset from start of file.
+*
+* whence = 0, from start of file
+* = 1, from current position
+* = 2, from end of file.
+*/
+{
+int my_offset = (int) *offset;
+int my_whence = (int) *whence;
+int my_iret;
+
+ if ( my_whence == 2) my_offset = - abs(my_offset);
+ /* must use negative offset if working
+ from end-of-file */
+
+ my_iret = fseek(*unit, my_offset, my_whence);
+
+ if(my_iret != 0)
+ {
+ if ( ! feof(*unit) )
+ {
+ my_iret = -2; /* error in file-handling */
+ perror("pbseek");
+ }
+ else
+ my_iret = -1; /* end-of-file */
+
+ clearerr(*unit);
+ *iret = (fortint) my_iret;
+ return;
+ }
+
+ my_iret = ftell(*unit); /* byte offset from start of file */
+ *iret = (fortint) my_iret;
+ return;
+
+}
+
+
+/*************************************************************************
+* FUNCTION: pbread - Read (from FORTRAN)
+**************************************************************************
+*/
+void PBREAD(FILE ** unit, char * buffer, fortint * nbytes, fortint * iret)
+/*
+*
+* Purpose: Reads a block of bytes from a file.
+*
+* Function returns: status : -2 = error in reading file,
+* -1 = end-of-file,
+* otherwise, = number of bytes read.
+*/
+{
+int my_nbytes = (int) *nbytes;
+int my_iret;
+
+ if ( (my_iret = fread(buffer, 1, my_nbytes, *unit) ) != my_nbytes)
+ {
+ /* Read problem */
+ if ( ! feof(*unit) )
+ {
+ my_iret = -2; /* error in file-handling */
+ perror("pbread");
+ clearerr(*unit);
+ }
+ else
+ {
+ my_iret = -1; /* end-of-file */
+ clearerr(*unit);
+ }
+ }
+ *iret = my_iret;
+ return;
+
+}
+
+
+/*************************************************************************
+* FUNCTION: pbread2 - Read (from FORTRAN)
+**************************************************************************
+*/
+void PBREAD2(FILE ** unit, char * buffer, fortint * nbytes, fortint * iret)
+/*
+*
+* Purpose: Reads a block of bytes from a file.
+*
+* Function returns: status : -2 = error in reading file,
+* otherwise, = number of bytes read.
+*/
+{
+int my_nbytes = (int) *nbytes;
+int my_iret;
+
+ if ( (my_iret = fread(buffer, 1, my_nbytes, *unit) ) != my_nbytes)
+ {
+ /* Read problem */
+ if ( ! feof(*unit) )
+ {
+ my_iret = -2; /* error in file-handling */
+ perror("pbread");
+ clearerr(*unit);
+ }
+ }
+ *iret = my_iret;
+ return;
+
+}
+
+/*************************************************************************
+* FUNCTION: pbwrite - Write (from FORTRAN)
+**************************************************************************
+*/
+void PBWRITE( FILE ** unit, char * buffer, fortint * nbytes, fortint *iret)
+/*
+* Purpose: Writes a block of bytes to a file.
+*
+* Function returns: status : -1 = Could not write to file.
+* >=0 = Number of bytes written.
+*/
+{
+int my_nbytes = (int) *nbytes;
+int my_iret;
+
+ if ( (my_iret = fwrite(buffer, 1, my_nbytes, *unit) ) != my_nbytes)
+ { /* Problem with write */
+ perror("pbwrite");
+ my_iret = -1;
+ }
+ *iret = my_iret;
+ return;
+
+}
+
+
+
+/*************************************************************************
+* FUNCTION: pbclose - close (from FORTRAN)
+**************************************************************************
+*/
+void PBCLOSE( FILE ** unit, fortint * iret)
+/*
+*
+* Purpose: Closes file.
+*
+* Function returns: status : non-0 = error in handling file.
+* 0 = OK.
+*/
+{
+int my_iret;
+
+ my_iret = fclose(*unit);
+
+ if(my_iret != 0) perror("pbclose");
+ *iret = my_iret;
+ return;
+
+}
+
+
+/*************************************************************************
+* FUNCTION: pbflush - flush (from FORTRAN)
+**************************************************************************
+*/
+void PBFLUSH( FILE ** unit)
+/*
+*
+* Purpose: Flushes file.
+*
+*/
+{
+
+ fflush(*unit);
+}
+
+
+void PBREAD3(fortint *unit, char * buffer, fortint * nbytes, fortint * iret)
+/*
+*
+* Purpose: Reads a block of bytes from a file.
+*
+* Function returns: status : -2 = error in reading file,
+* -1 = end-of-file,
+* otherwise, = number of bytes read.
+*/
+{
+
+ *iret = read(*unit, buffer, *nbytes);
+
+ /* Read problem */
+ if (*iret == -1)
+ {
+ *iret = -2; /* error in file-handling */
+ perror("pbread3");
+ return;
+ }
+ else if (*iret != *nbytes)
+ {
+ *iret = -1;
+ printf("EOF; pbread3; bytes requested %d; read in: %d\n",
+ *nbytes,*iret);
+ return;
+ }
+
+}
+
+static oct_bin3(int onum)
+{
+ char tmp[20];
+ int rc;
+
+ sprintf(tmp,"%d",onum);
+ sscanf(tmp,"%o",&rc);
+ return rc;
+}
+void PBOPEN3(fortint *unit, _fcd name, _fcd mode, fortint * iret,
+ fortint l1, fortint l2)
+/*
+* Purpose: Opens file, return UNIX FILE pointer.
+*
+* Function returns: iret: -1 = Could not open file.
+* -2 = Invalid file name.
+* -3 = Invalid open mode specified
+* 0 = OK.
+*
+* Note: l1 and l2 are the lengths of the character strings in
+* name and mode on SGI.
+*/
+{
+char *fname;
+char *modes;
+char *p;
+int oflag;
+int dmas;
+int filemode;
+
+#if (!defined CRAY) && (!defined VAX)
+char namebuff[NAMEBUFFLEN], modebuff[MODEBUFFLEN];
+
+/* Put the character strings into buffers and ensure that there is a
+ null terminator (for SGI case when FORTRAN CHARACTER variable is full
+ right to end with characters */
+ strncpy( namebuff, name, NAMEBUFFLEN - 1);
+ strncpy( modebuff, mode, MODEBUFFLEN - 1);
+ namebuff[l1] = '\0';
+ modebuff[l2] = '\0';
+#endif
+
+
+ *unit = 0;
+ *iret = 0;
+
+ /* convert fortran to c string : file name */
+
+#if (!defined CRAY) && (!defined VAX)
+ if(!(fname = fcd2char(namebuff)))
+#else
+ if(!(fname = fcd2char(name)))
+#endif
+ {
+ *iret = -2;
+ return;
+ }
+
+ /* strip trailing blanks */
+
+ p = fname + strlen(fname) - 1 ;
+ while(*p == ' ')
+ {
+ *p = 0;
+ p--;
+ }
+
+ /* convert fortran to c string : open modes */
+
+#if (!defined CRAY) && (!defined VAX)
+ if(!(modes = fcd2char(modebuff)))
+#else
+ if(!(modes = fcd2char(mode)))
+#endif
+ {
+ free(fname);
+ *iret = -3;
+ return;
+ }
+
+ /* build open flags from "modes" */
+
+ p = modes;
+ while(*p)
+ {
+ switch(*p)
+ {
+ case '+': break;
+
+ case 'a':
+ case 'A': oflag = 0x100 | 2 | 0x08;
+ filemode = 766;
+ break;
+
+ case 'c':
+ case 'C':
+ case 'w':
+ case 'W': oflag = 0x100 | 1;
+ filemode = 766;
+ break;
+
+ case 'r':
+ case 'R': oflag = 0;
+ filemode = 444;
+ break;
+
+ default: *iret = -3;
+ return;
+
+ }
+ p++;
+ }
+
+
+ dmas = umask(000);
+ *unit = open(fname, oflag, oct_bin3(filemode));
+ umask(dmas);
+
+ if(*unit == -1)
+ {
+ perror(fname);
+ perror("pbopen3");
+ *iret = -2;
+ }
+
+
+ free(fname);
+ free(modes);
+
+}
+
+
+void PBCLOSE3( fortint * unit, fortint * iret)
+/*
+*
+* Purpose: Closes file.
+*
+* Function returns: status : non-0 = error in handling file.
+* 0 = OK.
+*/
+{
+ *iret = close(*unit);
+
+ if(*iret != 0) perror("pbclose3");
+
+}
+
+void PBSEEK3(fortint * unit, fortint * offset, fortint * whence, fortint * iret)
+/*
+*
+* Purpose: Seeks to specified location in file.
+*
+* Function returns: status : -2 = error in handling file,
+* -1 = end-of-file
+* otherwise, = byte offset from start of file.
+*
+* whence = 0, from start of file
+* = 1, from current position
+* = 2, from end of file.
+*/
+{
+fortint my_offset = *offset;
+int my_whence;
+
+ if ( *whence == 2)
+ {
+ my_offset = - abs(my_offset);
+ my_whence = 2;
+ }
+ else if (*whence == 0)
+ {
+ my_whence = 0;
+ }
+ else
+ {
+ my_whence = 1;
+ }
+
+ /* must use negative offset if working
+ from end-of-file */
+
+ if ((*iret=lseek(*unit, my_offset, my_whence)) < 0)
+ {
+ perror("pbseek3;");
+ *iret = -1; /* end-of-file */
+ }
+
+}
+
+void PBWRITE3( fortint * unit, char * buffer, fortint * nbytes, fortint *iret)
+/*
+* Purpose: Writes a block of bytes to a file.
+*
+* Function returns: status : -1 = Could not write to file.
+* >=0 = Number of bytes written.
+*/
+{
+ if ((*iret = write(*unit, buffer, *nbytes)) != *nbytes)
+ {
+ perror("pbwrite3: ");
+ *iret = -1;
+ }
+
+}
+
diff --git a/pbio/pbbufr.F b/pbio/pbbufr.F
new file mode 100755
index 0000000..b951eab
--- /dev/null
+++ b/pbio/pbbufr.F
@@ -0,0 +1,125 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE PBBUFR(KUNIT,KARRAY,KINLEN,KOUTLEN,KRET)
+C
+C---->
+C**** PBBUFR
+C
+C PURPOSE
+C _______
+C
+C Reads next BUFR product from a file.
+C
+C INTERFACE
+C _________
+C
+C CALL PBBUFR(KUNIT,KARRAY,KINLEN,KOUTLEN,KRET)
+C
+C
+C Input parameters
+C ________________
+C
+C KUNIT - Unit number for the file returned from PBOPEN.
+C KARRAY - FORTRAN array big enough to hold the BUFR product.
+C KINLEN - Size in BYTES of the FORTRAN array.
+C
+C
+C Output parameters
+C ________________
+C
+C KOUTLEN - size in BYTES of the BUFR product read
+C KRET - 0 if a BUFR product has been successfully read
+C
+C -1 if end-of-file is hit before a BUFR product is read
+C
+C -3 if the size of KARRAY is not sufficient for the
+C BUFR product
+C
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C
+C Method
+C ______
+C
+C Calls BUFRREAD.
+C
+C
+C Externals
+C _________
+C
+C BUFRREAD - Read next BUFR product.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C******************************************************************************
+C----<
+C
+C Subroutine arguments
+C
+ INTEGER KARRAY(1)
+ INTEGER KUNIT,KINLEN,KOUTLEN,KRET
+C
+C Local argument(s)
+C
+ INTEGER NREAD, IRET
+C
+C Get the BUFR product
+C
+ CALL BUFRREAD( KARRAY, KINLEN, NREAD, IRET, KUNIT )
+C
+C Escape if the user buffer is too small to hold even the early sections of
+C the product or EOF encountered
+C
+ IF( IRET.EQ.-4 ) THEN
+ KOUTLEN = NREAD
+ KRET = -1
+ RETURN
+ ENDIF
+C
+C Escape if no BUFR product is found in the file
+C
+ IF( IRET.EQ.-1 ) THEN
+ KOUTLEN = 0
+ KRET = -1
+ RETURN
+ ENDIF
+C
+C Check if the array is big enough for the BUFR product
+C
+ IF( IRET.EQ.-3 ) THEN
+ KOUTLEN = NREAD
+ KRET = -3
+ RETURN
+ ENDIF
+C
+C Set success code if product retrieved
+C
+ IF( NREAD.GE.0 ) THEN
+ KOUTLEN = NREAD
+ KRET = 0
+ ENDIF
+C
+ RETURN
+ END
diff --git a/pbio/pbcrex.F b/pbio/pbcrex.F
new file mode 100755
index 0000000..f1d2181
--- /dev/null
+++ b/pbio/pbcrex.F
@@ -0,0 +1,134 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE PBCREX(KUNIT,KARRAY,KINLEN,KOUTLEN,KRET)
+C
+C---->
+C**** PBCREX
+C
+C PURPOSE
+C _______
+C
+C Reads next CREX product from a file.
+C
+C INTERFACE
+C _________
+C
+C CALL PBCREX(KUNIT,KARRAY,KINLEN,KOUTLEN,KRET)
+C
+C
+C Input parameters
+C ________________
+C
+C KUNIT - unit number for the file returned from PBOPEN
+C KARRAY - FORTRAN array big enough to hold the CREX product
+C KINLEN - size in BYTES of the FORTRAN array
+C
+C
+C Output parameters
+C ________________
+C
+C KOUTLEN - size in BYTES of the CREX product read
+C KRET - 0 if a CREX product has been successfully read
+C -1 if end-of-file is hit before a CREX product is read
+C -2 if file read error is generated
+C -3 if the size of KARRAY is not sufficient for the
+C CREX product
+C
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C
+C Method
+C ______
+C
+C Calls CREXRD.
+C
+C
+C Externals
+C _________
+C
+C CREXRD - Read next CREX product.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C******************************************************************************
+C----<
+C
+ IMPLICIT NONE
+C
+C Subroutine arguments
+C
+ INTEGER KARRAY(1)
+ INTEGER KUNIT,KINLEN,KOUTLEN,KRET
+C
+C Local arguments
+C
+ INTEGER NREAD, IRET
+C
+C Get the CREX product
+C
+ CALL CREXRD( KARRAY, KINLEN, NREAD, IRET, KUNIT )
+C
+C Escape if the user buffer is too small to hold even the early sections of
+C the product or EOF encountered
+C
+ IF( IRET.EQ.-4 ) THEN
+ KOUTLEN = NREAD
+ KRET = -1
+ RETURN
+ ENDIF
+C
+C Escape if no CREX product is found in the file
+C
+ IF( IRET.EQ.-1 ) THEN
+ KOUTLEN = 0
+ KRET = -1
+ RETURN
+ ENDIF
+C
+C Escape if file read error
+C
+ IF( (IRET.EQ.-2) .OR. (IRET.EQ.-5) ) THEN
+ KOUTLEN = 0
+ KRET = -2
+ RETURN
+ ENDIF
+C
+C Check if the array is big enough for the CREX product
+C
+ IF( IRET.EQ.-3 ) THEN
+ KOUTLEN = NREAD
+ KRET = -3
+ RETURN
+ ENDIF
+C
+C Set success code if product retrieved
+C
+ IF( NREAD.GE.0 ) THEN
+ KOUTLEN = NREAD
+ KRET = 0
+ ENDIF
+C
+ RETURN
+ END
diff --git a/pbio/pbfp.c b/pbio/pbfp.c
new file mode 100755
index 0000000..bdb8a9b
--- /dev/null
+++ b/pbio/pbfp.c
@@ -0,0 +1,23 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+
+extern FILE** fptable;
+extern int fptableSize;
+
+FILE * pbfp(long index) {
+ if( (fptable == NULL) || ((int)index < 0) || ((int)index >= fptableSize) )
+ return (FILE *) NULL;
+ else
+ return fptable[index];
+}
+
diff --git a/pbio/pbgrib.F b/pbio/pbgrib.F
new file mode 100755
index 0000000..9c07228
--- /dev/null
+++ b/pbio/pbgrib.F
@@ -0,0 +1,123 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE PBGRIB(KUNIT,KARRAY,KINLEN,KOUTLEN,KRET)
+C
+C---->
+C**** PBGRIB
+C
+C PURPOSE
+C _______
+C
+C Reads next GRIB product from a file.
+C
+C INTERFACE
+C _________
+C
+C CALL PBGRIB(KUNIT,KARRAY,KINLEN,KOUTLEN,KRET)
+C
+C
+C Input parameters
+C ________________
+C
+C KUNIT - Unit number for the file returned from PBOPEN
+C KARRAY - FORTRAN array big enough to hold the GRIB product
+C KINLEN - Size in BYTES of the FORTRAN array
+C
+C
+C Output parameters
+C ________________
+C
+C KOUTLEN - Size in BYTES of the GRIB product read
+C KRET - 0 if a GRIB product has been successfully read
+C -1 if end-of-file is hit before a GRIB product is read
+C -3 if the size of KARRAY is not sufficient for the
+C GRIB product
+C
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C
+C Method
+C ______
+C
+C Calls GRIBREAD.
+C
+C
+C Externals
+C _________
+C
+C GRIBREAD - Read next GRIB product.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C******************************************************************************
+C----<
+C
+C Subroutine arguments
+C
+ INTEGER KARRAY(1)
+ INTEGER KUNIT,KINLEN,KOUTLEN,KRET
+C
+C Local argument(s)
+C
+ INTEGER NREAD, IRET
+C
+C Get the GRIB product
+C
+ CALL GRIBREAD( KARRAY, KINLEN, NREAD, IRET, KUNIT )
+C
+C Escape if the user buffer is too small to hold even the early sections of
+C the product or EOF encountered
+C
+ IF( IRET.EQ.-4 ) THEN
+ KOUTLEN = NREAD
+ KRET = -1
+ RETURN
+ ENDIF
+C
+C Escape if no GRIB product is found in the file
+C
+ IF( IRET.EQ.-1 ) THEN
+ KOUTLEN = 0
+ KRET = -1
+ RETURN
+ ENDIF
+C
+C Check if the array is big enough for the GRIB product
+C
+ IF( IRET.EQ.-3 ) THEN
+ KOUTLEN = NREAD
+ KRET = -3
+ RETURN
+ ENDIF
+C
+C Set success code if product retrieved
+C
+ IF( NREAD.GE.0 ) THEN
+ KOUTLEN = NREAD
+ KRET = 0
+ ENDIF
+C
+ RETURN
+ END
diff --git a/pbio/pbio.c b/pbio/pbio.c
new file mode 100755
index 0000000..ad29eed
--- /dev/null
+++ b/pbio/pbio.c
@@ -0,0 +1,1559 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+/*
+// pbio.c
+*/
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <ctype.h>
+
+#ifdef PTHREADS
+#include <pthread.h>
+#endif
+
+#ifdef FOPEN64
+#define OFF_T off64_t
+extern FILE *fopen64(const char *, const char *);
+#else
+#define OFF_T off_t
+#endif
+
+static FILE** fptable = NULL;
+static int fptableSize = 0;
+
+#ifdef PTHREADS
+static pthread_mutex_t fpTableBusy = PTHREAD_MUTEX_INITIALIZER;
+#endif
+#define BUFFLEN 4096
+
+/*
+// Default buffer size for I/O operations (set via setvbuf)
+*/
+#define SIZE BUFSIZ
+static long size = SIZE;
+static int sizeSet = 0;
+static char * envSize;
+static char** fileBuffer = NULL;
+
+/*
+// Debug flags.
+*/
+#define DEBUGOFF 1
+#define DEBUG (debugSet > DEBUGOFF )
+static char * debugLevel;
+static int debugSet = 0;
+
+#include "bufrgrib.h"
+#include "fort2c.h"
+#include "fortint.h"
+#include "fileRead.h"
+
+#define NAMEBUFFLEN 256
+#define MODEBUFFLEN 10
+
+#define CURRENT_FILE (fptable[*unit])
+
+FILE* pbfp(long index) {
+ if( (fptable == NULL) || ((int)index < 0) || ((int)index >= fptableSize) )
+ return (FILE *) NULL;
+ else
+ return fptable[index];
+}
+
+/*
+//------------------------------------------------------------------------
+// PBOPEN - Open file (from FORTRAN)
+//------------------------------------------------------------------------
+*/
+#if defined hpR64 || defined hpiaR64
+void pbopen_(fortint* unit,_fcd name,_fcd mode,fortint* iret,long l1,long l2) {
+#else
+void pbopen_(fortint* unit,_fcd name,_fcd mode,fortint* iret,fortint l1,fortint l2) {
+#endif
+/*
+// Purpose:
+// Opens file, returns the index of a UNIX FILE pointer held in
+// an internal table (fptable).
+//
+// First time through, reads value in environment variable PBIO_BUFSIZE
+// (if it is set) and uses it as the size to be used for internal file
+// buffers; the value is passed to setvbuf. If PBIO_BUFSIZE is not set,
+// a default value is used.
+//
+// Function accepts:
+// name = filename
+// mode = r, r+, w
+//
+// Note: l1 and l2 are the lengths of the FORTRAN character strings
+// in name and mode.
+//
+// Function returns:
+// INTEGER iret:
+// -1 = Could not open file.
+// -2 = Invalid file name.
+// -3 = Invalid open mode specified
+// 0 = OK.
+*/
+int n;
+char *p;
+char flags[4];
+
+#if (!defined CRAY) && (!defined VAX)
+char namebuff[NAMEBUFFLEN+1], modebuff[MODEBUFFLEN+1];
+#else
+char * namebuff, * modebuff;
+#endif
+
+/*
+// See if DEBUG switched on.
+*/
+ if( ! debugSet ) {
+ debugLevel = getenv("PBIO_DEBUG");
+ if( debugLevel == NULL )
+ debugSet = DEBUGOFF; /* off */
+ else {
+ int loop;
+ for( loop = 0; loop < strlen(debugLevel) ; loop++ ) {
+ if( ! isdigit(debugLevel[loop]) ) {
+ printf("Invalid number string in PBIO_DEBUG: %s\n", debugLevel);
+ printf("PBIO_DEBUG must comprise only digits [0-9].\n");
+ debugSet = DEBUGOFF;
+ }
+ }
+ debugSet = DEBUGOFF + atol( debugLevel );
+ }
+ if( DEBUG ) printf("PBIO_PBOPEN: debug switched on\n");
+ }
+
+#if (!defined CRAY) && (!defined VAX)
+/*
+// Put the character strings into buffers and ensure that there is a
+// null terminator (for SGI case when FORTRAN CHARACTER variable is full
+// right to end with characters
+*/
+ {
+ int n1, n2;
+
+ n1 = (l1>NAMEBUFFLEN) ? NAMEBUFFLEN : l1;
+ n2 = (l2>MODEBUFFLEN) ? MODEBUFFLEN : l2;
+
+ strncpy( namebuff, name, n1);
+ strncpy( modebuff, mode, n2);
+ namebuff[n1] = '\0';
+ modebuff[n2] = '\0';
+ }
+#else
+ if(!(namebuff = fcd2char(name))) {
+ *iret = -2;
+ return;
+ }
+ if(!(modebuff = fcd2char(mode))) {
+ free(namebuff);
+ *iret = -2;
+ return;
+ }
+#endif
+
+ strcpy(flags,"");
+
+ /* *unit = (fortint) NULL; sami bug fix */
+ *unit = 0;
+ *iret = 0;
+
+/*
+// Strip trailing blanks
+*/
+ p = namebuff + strlen(namebuff) - 1 ;
+ while(*p == ' ') {
+ *p = 0;
+ p--;
+ }
+ if( DEBUG ) printf("PBIO_PBOPEN: filename = %s\n", namebuff);
+/*
+// Build open flags from "modes"
+*/
+ p = modebuff;
+
+ switch(*p) {
+
+ case 'a':
+ case 'A': strcat(flags, "a");
+ break;
+
+ case 'c':
+ case 'C':
+ case 'w':
+ case 'W': strcat(flags, "w");
+ break;
+
+ case 'r':
+ case 'R':
+ if( *(p+1) == '+' )
+ strcat(flags, "r+");
+ else
+ strcat(flags, "r");
+ break;
+
+ default: *iret = -3;
+ return;
+
+ }
+ if( DEBUG ) printf("PBIO_PBOPEN: file open mode = %s\n", flags);
+
+/*
+// Look for a free slot in fptable.
+// (Create the table the first time through).
+*/
+#ifdef PTHREADS
+/*
+// Wait if another thread opening a file
+*/
+ pthread_mutex_lock(&fpTableBusy);
+#endif
+
+ n = 0;
+ if( fptableSize == 0 ) {
+ int i;
+ fptableSize = 2;
+ fptable = (FILE **) malloc(fptableSize*sizeof(FILE *));
+ if( fptable == NULL ) {
+ perror("Unable to allocate space for table of FILE pointers");
+ exit(1);
+ }
+
+ fileBuffer = (char **) malloc(fptableSize*sizeof(char *));
+ if( fileBuffer == NULL ) {
+ perror("Unable to allocate space for FILE buffers");
+ exit(1);
+ }
+
+ for( i = 0; i < fptableSize; i++ ) {
+ fptable[i] = 0;
+ fileBuffer[i] = NULL;
+ }
+ }
+ else {
+ while( n < fptableSize ) {
+ if(fptable[n]==0) {
+ *unit = n;
+ break;
+ }
+ n++;
+ }
+ }
+/*
+// If the table overflows, double its size.
+*/
+ if( n == fptableSize) {
+ int i;
+ fptableSize = 2*fptableSize;
+ fptable = (FILE **) realloc(fptable, fptableSize*sizeof(FILE *));
+ if( fptable == NULL ) {
+ perror("Unable to reallocate space for table of FILE pointers");
+ exit(1);
+ }
+ n = fptableSize/2;
+
+ fileBuffer = (char **) realloc(fileBuffer, fptableSize*sizeof(char *));
+ if( fileBuffer == NULL ) {
+ perror("Unable to allocate space for FILE buffers");
+ exit(1);
+ }
+
+ n = fptableSize/2;
+ for( i = n; i < fptableSize; i++ ) {
+ fptable[i] = 0;
+ fileBuffer[i] = NULL;
+ }
+
+ *unit = n;
+ }
+
+ if( DEBUG ) printf("PBIO_PBOPEN: fptable slot = %d\n", *unit);
+
+#ifdef FOPEN64
+ if( DEBUG ) printf("PBIO_PBOPEN: using fopen64\n");
+ fptable[n] = fopen64(namebuff, flags );
+#else
+ if( DEBUG ) printf("PBIO_PBOPEN: using fopen\n");
+ fptable[n] = fopen(namebuff, flags );
+#endif
+
+ if(fptable[n] == NULL) {
+ perror(namebuff);
+ *iret = -1;
+#if (defined CRAY) || (defined VAX)
+ free(namebuff);
+ free(modebuff);
+#endif
+#ifdef PTHREADS
+ pthread_mutex_unlock(&fpTableBusy);
+#endif
+ return;
+ }
+
+/*
+// Now allocate a buffer for the file, if necessary.
+*/
+ if( ! sizeSet ) {
+ envSize = getenv("PBIO_BUFSIZE");
+ if( envSize == NULL )
+ size = SIZE; /* default */
+ else {
+ int loop;
+ for( loop = 0; loop < strlen(envSize) ; loop++ ) {
+ if( ! isdigit(envSize[loop]) ) {
+ printf("Invalid number string in PBIO_BUFSIZE: %s\n", envSize);
+ printf("PBIO_BUFSIZE must comprise only digits [0-9].\n");
+ exit(1);
+ }
+ }
+ size = atol( envSize );
+ }
+ if( size <= 0 ) {
+ printf("Invalid buffer size in PBIO_BUFSIZE: %s\n", envSize);
+ printf("Buffer size defined by PBIO_BUFSIZE must be positive.\n");
+ exit(1);
+ }
+ sizeSet = 1;
+ }
+
+ if( DEBUG ) printf("PBIO_PBOPEN: file buffer size = %d\n", size);
+
+ if( fileBuffer[n] == NULL ) {
+ fileBuffer[n] = (char *) malloc(size);
+ }
+
+ if( setvbuf(CURRENT_FILE, fileBuffer[*unit], _IOFBF, size) ) {
+ perror("setvbuf failed");
+ *iret = -1;
+ }
+
+#ifdef PTHREADS
+ pthread_mutex_unlock(&fpTableBusy);
+#endif
+
+#if (defined CRAY) || (defined VAX)
+ free(namebuff);
+ free(modebuff);
+#endif
+
+}
+
+#if (defined hpR64) || (defined hpiaR64)
+void pbopen(fortint* unit,_fcd name,_fcd mode,fortint* iret,long l1,long l2) {
+#else
+void pbopen(fortint* unit,_fcd name,_fcd mode,fortint* iret,fortint l1,fortint l2) {
+#endif
+
+ pbopen_(unit,name,mode,iret,l1,l2);
+}
+
+/*
+//------------------------------------------------------------------------
+// PBSEEK - Seek (from FORTRAN)
+//------------------------------------------------------------------------
+*/
+void pbseek_(fortint* unit,fortint* offset,fortint* whence,fortint* iret) {
+/*
+//
+// Purpose:
+// Seeks to a specified location in file.
+//
+// Function accepts:
+// unit = the index of a UNIX FILE pointer held in
+// an internal table (fptable).
+//
+// offset = byte count
+//
+// whence = 0, from start of file
+// = 1, from current position
+// = 2, from end of file.
+//
+// Returns:
+// iret:
+// -2 = error in handling file,
+// -1 = end-of-file
+// otherwise, = byte offset from start of file.
+*/
+int my_offset = (int) *offset;
+int my_whence = (int) *whence;
+
+/*
+// Must use negative offset if working from end-of-file
+*/
+ if( DEBUG ) {
+ printf("PBIO_PBSEEK: fptable slot = %d\n", *unit);
+ printf("PBIO_PBSEEK: Offset = %d\n", my_offset);
+ printf("PBIO_PBSEEK: Type of offset = %d\n", my_whence);
+ }
+
+ if( my_whence == 2) my_offset = - abs(my_offset);
+
+ *iret = fileTell(CURRENT_FILE);
+ if( DEBUG ) printf("PBIO_PBSEEK: current position = %d\n", *iret);
+ if( *iret == my_offset && my_whence == 0)
+ *iret = 0;
+ else
+ *iret = fileSeek(CURRENT_FILE, my_offset, my_whence);
+
+ if( DEBUG ) printf("PBIO_PBSEEK: fileSeek return code = %d\n",*iret);
+
+ if( *iret != 0 ) {
+ if( ! feof(CURRENT_FILE) ) {
+ *iret = -2; /* error in file-handling */
+ perror("pbseek");
+ }
+ else
+ *iret = -1; /* end-of-file */
+
+ clearerr(CURRENT_FILE);
+ return;
+ }
+
+/*
+// Return the byte offset from start of file
+*/
+ *iret = fileTell(CURRENT_FILE);
+
+ if( DEBUG )
+ printf("PBIO_PBSEEK: byte offset from start of file = %d\n",*iret);
+
+ return;
+
+}
+
+void pbseek(fortint* unit,fortint* offset,fortint* whence,fortint* iret) {
+
+ pbseek_(unit,offset,whence,iret);
+}
+
+
+void pbseek64_(fortint* unit,long long* offset,fortint* whence,long long* iret) {
+/*
+//
+// Purpose:
+// Seeks to a specified location in file.
+//
+// Function accepts:
+// unit = the index of a UNIX FILE pointer held in
+// an internal table (fptable).
+//
+// offset = byte count
+//
+// whence = 0, from start of file
+// = 1, from current position
+// = 2, from end of file.
+//
+// Returns:
+// iret:
+// -2 = error in handling file,
+// -1 = end-of-file
+// otherwise, = byte offset from start of file.
+*/
+long long my_offset = (long long) *offset;
+int my_whence = (int) *whence;
+
+/*
+// Must use negative offset if working from end-of-file
+*/
+ if( DEBUG ) {
+ printf("PBIO_PBSEEK: fptable slot = %d\n", *unit);
+ printf("PBIO_PBSEEK: Offset = %d\n", my_offset);
+ printf("PBIO_PBSEEK: Type of offset = %d\n", my_whence);
+ }
+
+ if( my_whence == 2) my_offset = - abs(my_offset);
+
+ *iret = fileTell(CURRENT_FILE);
+ if( DEBUG ) printf("PBIO_PBSEEK: current position = %d\n", *iret);
+ if( *iret == my_offset && my_whence == 0)
+ *iret = 0;
+ else
+ *iret = fileSeek(CURRENT_FILE, my_offset, my_whence);
+
+ if( DEBUG ) printf("PBIO_PBSEEK: fileSeek return code = %d\n",*iret);
+
+ if( *iret != 0 ) {
+ if( ! feof(CURRENT_FILE) ) {
+ *iret = -2; /* error in file-handling */
+ perror("pbseek");
+ }
+ else
+ *iret = -1; /* end-of-file */
+
+ clearerr(CURRENT_FILE);
+ return;
+ }
+
+/*
+// Return the byte offset from start of file
+*/
+ *iret = fileTell(CURRENT_FILE);
+
+ if( DEBUG )
+ printf("PBIO_PBSEEK: byte offset from start of file = %d\n",*iret);
+
+ return;
+
+}
+
+void pbseek64(fortint* unit,long long* offset,fortint* whence,long long* iret) {
+
+ pbseek64_(unit,offset,whence,iret);
+}
+
+/*
+//------------------------------------------------------------------------
+// PBTELL - Tells current file position (from FORTRAN)
+//------------------------------------------------------------------------
+*/
+void pbtell_(fortint* unit,fortint* iret) {
+/*
+//
+// Purpose:
+// Tells current byte offset in file.
+//
+// Function accepts:
+// unit = the index of a UNIX FILE pointer held in
+// an internal table (fptable).
+//
+// Returns:
+// iret:
+// -2 = error in handling file,
+// otherwise, = byte offset from start of file.
+*/
+
+
+/*
+// Return the byte offset from start of file
+*/
+ *iret = fileTell(CURRENT_FILE);
+
+ if( *iret < 0 ) {
+ if( DEBUG ) { /* error in file-handling */
+ printf("PBIO_PBTELL: fptable slot = %d. ", *unit);
+ printf("Error status = %d\n", *iret);
+ }
+ perror("pbtell");
+ *iret = -2;
+ }
+
+ if( DEBUG ) {
+ printf("PBIO_PBTELL: fptable slot = %d. ", *unit);
+ printf("Byte offset from start of file = %d\n",*iret);
+ }
+
+ return;
+}
+
+void pbtell(fortint* unit,fortint* iret) {
+
+ pbtell_(unit,iret);
+}
+
+/*
+//------------------------------------------------------------------------
+// PBTELL64 - Tells current file position (from FORTRAN)
+//------------------------------------------------------------------------
+*/
+void pbtell64_(fortint* unit,long long* iret) {
+/*
+//
+// Purpose:
+// Tells current byte offset in file.
+//
+// Function accepts:
+// unit = the index of a UNIX FILE pointer held in
+// an internal table (fptable).
+//
+// Returns:
+// iret:
+// -2 = error in handling file,
+// otherwise, = byte offset from start of file.
+*/
+
+
+/*
+// Return the byte offset from start of file
+*/
+ *iret = fileTell(CURRENT_FILE);
+
+ if( *iret < 0 ) {
+ if( DEBUG ) { /* error in file-handling */
+ printf("PBIO_PBTELL64: fptable slot = %d. ", *unit);
+ printf("Error status = %d\n", *iret);
+ }
+ perror("pbtell64");
+ *iret = -2;
+ }
+
+ if( DEBUG ) {
+ printf("PBIO_PBTELL: fptable slot = %d. ", *unit);
+ printf("Byte offset from start of file = %d\n",*iret);
+ }
+
+ return;
+}
+
+void pbtell64(fortint* unit,long long* iret) {
+
+ pbtell64_(unit,iret);
+}
+
+/*
+//------------------------------------------------------------------------
+// PBREAD - Read (from FORTRAN)
+//------------------------------------------------------------------------
+*/
+void pbread_(fortint* unit,char* buffer,fortint* nbytes,fortint* iret) {
+/*
+// Purpose:
+// Reads a block of bytes from a file..
+//
+// Function accepts:
+// unit = the index of a UNIX FILE pointer held in
+// an internal table (fptable).
+//
+// nbytes = number of bytes to read.
+//
+// Returns:
+// iret:
+// -2 = error in reading file,
+// -1 = end-of-file,
+// otherwise, = number of bytes read.
+*/
+ if( DEBUG ) {
+ printf("PBIO_READ: fptable slot = %d. ", *unit);
+ printf("Number of bytes to read = %d\n", *nbytes);
+ }
+
+ if( (*iret = fread(buffer, 1, *nbytes, CURRENT_FILE) ) != *nbytes) {
+ if( ! feof(CURRENT_FILE) ) {
+ *iret = -2; /* error in file-handling */
+ perror("pbread");
+ clearerr(CURRENT_FILE);
+ return;
+ }
+ else {
+ *iret = -1; /* end-of-file */
+ clearerr(CURRENT_FILE);
+ }
+ }
+
+ if( DEBUG ) {
+ printf("PBIO_READ: fptable slot = %d. ", *unit);
+ printf("Number of bytes read = %d\n", *nbytes);
+ }
+
+ return;
+}
+
+void pbread(fortint* unit,char* buffer,fortint* nbytes,fortint* iret) {
+
+ pbread_(unit,buffer,nbytes,iret);
+}
+
+/*
+//------------------------------------------------------------------------
+// PBREAD2 - Read (from FORTRAN)
+//------------------------------------------------------------------------
+*/
+void pbread2_(fortint* unit,char* buffer,fortint* nbytes,fortint* iret) {
+/*
+// Purpose:
+// Reads a block of bytes from a file..
+//
+// Function accepts:
+// unit = the index of a UNIX FILE pointer held in
+// an internal table (fptable).
+//
+// nbytes = number of bytes to read.
+//
+// Returns:
+// iret:
+// -2 = error in reading file,
+// -1 = end-of-file,
+// otherwise, = number of bytes read.
+*/
+ if( DEBUG ) {
+ printf("PBIO_READ2: fptable slot = %d. ", *unit);
+ printf("Number of bytes to read = %d\n", *nbytes);
+ }
+
+ if( (*iret = fread(buffer, 1, *nbytes, CURRENT_FILE) ) != *nbytes) {
+ if( ! feof(CURRENT_FILE) ) {
+ *iret = -2; /* error in file-handling */
+ perror("pbread2");
+ clearerr(CURRENT_FILE);
+ }
+ }
+
+ if( DEBUG )
+ printf("PBIO_READ2: Number of bytes read = %d\n", *iret);
+
+ return;
+}
+
+void pbread2(fortint* unit,char* buffer,fortint* nbytes,fortint* iret) {
+
+ pbread2_(unit,buffer,nbytes,iret);
+}
+
+/*
+//------------------------------------------------------------------------
+// PBWRITE - Write (from FORTRAN)
+//------------------------------------------------------------------------
+*/
+void pbwrite_(fortint* unit,char* buffer,fortint* nbytes,fortint* iret) {
+/*
+// Purpose:
+// Writes a block of bytes to a file.
+//
+// Function accepts:
+// unit = the index of a UNIX FILE pointer held in
+// an internal table (fptable).
+//
+// nbytes = number of bytes to write.
+//
+// Returns:
+// iret:
+// -1 = Could not write to file.
+// >=0 = Number of bytes written.
+*/
+ if( DEBUG ) {
+ printf("PBIO_WRITE: fptable slot = %d. ", *unit);
+ printf("Number of bytes to write = %d\n", *nbytes);
+ }
+
+ if( (*iret = fwrite(buffer, 1, *nbytes, CURRENT_FILE) ) != *nbytes) {
+ perror("pbwrite");
+ *iret = -1;
+ }
+
+ if( DEBUG ) {
+ printf("PBIO_WRITE: fptable slot = %d. ", *unit);
+ printf("PBIO_WRITE: number of bytes written = %d\n", *iret);
+ }
+
+ return;
+}
+
+void pbwrite(fortint* unit,char* buffer,fortint* nbytes,fortint* iret) {
+
+ pbwrite_(unit,buffer,nbytes,iret);
+}
+
+/*
+//------------------------------------------------------------------------
+// PBCLOSE - close (from FORTRAN)
+//------------------------------------------------------------------------
+*/
+void pbclose_(fortint* unit,fortint* iret) {
+/*
+// Purpose:
+// Closes file.
+//
+// Function accepts:
+// unit = the index of a UNIX FILE pointer held in
+// an internal table (fptable).
+//// Returns:
+// iret:
+// 0 = OK.
+// otherwise = error in handling file.
+*/
+ if( DEBUG )
+ printf("PBIO_CLOSE: fptable slot = %d\n", *unit);
+
+ if( ( *iret = fclose(CURRENT_FILE) ) != 0 ) perror("pbclose");
+ CURRENT_FILE = 0;
+
+ return;
+}
+
+void pbclose(fortint* unit,fortint* iret) {
+
+ pbclose_(unit,iret);
+}
+
+/*
+//------------------------------------------------------------------------
+// PBFLUSH - flush (from FORTRAN)
+//------------------------------------------------------------------------
+*/
+void pbflush_(fortint * unit) {
+/*
+// Purpose: Flushes file.
+*/
+ if( DEBUG )
+ printf("PBIO_FLUSH: fptable slot = %d\n", *unit);
+
+ fflush(CURRENT_FILE);
+}
+
+void pbflush(fortint * unit) {
+
+ pbflush_(unit);
+}
+
+/*
+//------------------------------------------------------------------------
+// PBREAD3 - read (from FORTRAN)
+//------------------------------------------------------------------------
+*/
+void pbread3_(fortint* unit,char* buffer,fortint* nbytes,fortint* iret) {
+/*
+// Purpose:
+// Reads a block of bytes from a file..
+//
+// Function returns:
+// status : -2 = error in reading file,
+// -1 = end-of-file,
+// otherwise, = number of bytes read.
+*/
+ if( DEBUG )
+ printf("PBIO_READ3: number of bytes to read = %d\n", *nbytes);
+
+ *iret = read(*unit, buffer, *nbytes);
+
+ if( DEBUG )
+ printf("PBIO_READ3: number of bytes read = %d\n", *iret);
+/*
+// Error in file-handling
+*/
+ if(*iret == -1) {
+ *iret = -2;
+ perror("pbread3");
+ return;
+ }
+/*
+// Read problem
+*/
+ else if(*iret != *nbytes) {
+ printf("EOF; pbread3; bytes requested %d; read in: %d\n",
+ *nbytes,*iret);
+ *iret = -1;
+ return;
+ }
+
+}
+
+void pbread3(fortint* unit,char* buffer,fortint* nbytes,fortint* iret) {
+
+ pbread3_(unit,buffer,nbytes,iret);
+}
+
+void pbread4_(fortint* unit,char* buffer,size_t* nbytes,size_t* iret) {
+/*
+// Purpose:
+// Reads a block of bytes from a file..
+//
+// Function returns:
+// status : -2 = error in reading file,
+// -1 = end-of-file,
+// otherwise, = number of bytes read.
+ printf("PBIO_READ4: sizeof = %ld\n", sizeof(buffer));
+*/
+/* if( DEBUG ) */
+ printf("PBIO_READ4: number of bytes to read = %ld\n", *nbytes);
+
+/* Is 4MB ok ? */
+size_t left = *nbytes;
+size_t len = 0;
+size_t chunk = 4*1024*1024; /* Is 4MB ok ? */
+size_t pos = 0;
+
+ while((left > 0) && (len = read(*unit,(buffer+pos),chunk)) > 0)
+ {
+ left -= len;
+ pos += len;
+ if(left < chunk)
+ chunk = left;
+ }
+ if(len>0)
+ *iret = pos;
+ else
+ *iret = len;
+
+ if( DEBUG )
+ printf("PBIO_READ4: number of bytes READ = %ld\n", pos);
+
+ if(*iret == -1) {
+ *iret = -2;
+ perror("pbread4");
+ return;
+ }
+/*
+// Read problem
+*/
+ else if(pos != *nbytes) {
+ printf("EOF; pbread4; bytes requested %ld; read in: %ld\n",
+ *nbytes,pos);
+ *iret = -1;
+ return;
+ }
+ printf("PBIO_READ4: number of bytes read = %ld\n", pos);
+ printf("PBIO_READ4: return code *iret = %ld\n", *iret);
+
+}
+
+void pbread4(fortint* unit,char* buffer,size_t* nbytes,size_t* iret) {
+
+ pbread4_(unit,buffer,nbytes,iret);
+}
+void pbread5_(fortint* unit,char* buffer,size_t* nbytes,size_t* iret) {
+/*
+// Purpose:
+// Reads a block of bytes from a file..
+//
+// Function returns:
+// status : -2 = error in reading file,
+// -1 = end-of-file,
+// otherwise, = number of bytes read.
+*/
+ if( DEBUG )
+ printf("PBIO_READ5: number of bytes to read = %d\n", *nbytes);
+
+ *iret = read(*unit, buffer, *nbytes);
+
+ if( DEBUG )
+ printf("PBIO_READ5: number of bytes read = %d\n", *iret);
+/*
+// Error in file-handling
+*/
+ if(*iret == -1) {
+ *iret = -2;
+ perror("pbread5");
+ return;
+ }
+/*
+// Read problem
+*/
+ else if(*iret != *nbytes) {
+ printf("EOF; pbread5; bytes requested %d; read in: %d\n",
+ *nbytes,*iret);
+ *iret = -1;
+ return;
+ }
+
+}
+
+void pbread5(fortint* unit,char* buffer,size_t* nbytes,size_t* iret) {
+ pbread5_(unit,buffer,nbytes,iret);
+}
+
+/*
+//------------------------------------------------------------------------
+// oct_bin3
+//------------------------------------------------------------------------
+*/
+static int oct_bin3(int onum) {
+/*
+// Converts an integer to octal digits
+*/
+ char tmp[20];
+ int rc;
+
+ sprintf(tmp,"%d",onum);
+ sscanf(tmp,"%o",&rc);
+ return rc;
+}
+
+/*
+//------------------------------------------------------------------------
+// PBOPEN3 - Open file (from FORTRAN)
+//------------------------------------------------------------------------
+*/
+void pbopen3_(fortint* unit,_fcd name,_fcd mode,fortint* iret,fortint l1,fortint l2) {
+/*
+// Purpose:
+// Opens file, return UNIX FILE pointer.
+//
+// Function returns:
+// iret: -1 = Could not open file.
+// -2 = Invalid file name.
+// -3 = Invalid open mode specified
+// 0 = OK.
+//
+// Note: l1 and l2 are the lengths of the character strings in
+// name and mode on SGI.
+*/
+char *p;
+int oflag;
+int dmas;
+int filemode;
+char flags[4];
+
+#if (!defined CRAY) && (!defined VAX)
+char namebuff[NAMEBUFFLEN], modebuff[MODEBUFFLEN];
+#else
+char * namebuff, * modebuff;
+#endif
+
+/*
+// See if DEBUG switched on.
+*/
+ if( ! debugSet ) {
+ debugLevel = getenv("PBIO_DEBUG");
+ if( debugLevel == NULL )
+ debugSet = DEBUGOFF; /* off */
+ else {
+ int loop;
+ for( loop = 0; loop < strlen(debugLevel) ; loop++ ) {
+ if( ! isdigit(debugLevel[loop]) ) {
+ printf("Invalid number string in PBIO_DEBUG: %s\n", debugLevel);
+ printf("PBIO_DEBUG must comprise only digits [0-9].\n");
+ debugSet = DEBUGOFF;
+ }
+ }
+ debugSet = DEBUGOFF + atol( debugLevel );
+ }
+ if( DEBUG ) printf("PBIO_PBOPEN3: debug switched on\n");
+ }
+
+#if (!defined CRAY) && (!defined VAX)
+/*
+// Put the character strings into buffers and ensure that there is a
+// null terminator (for SGI case when FORTRAN CHARACTER variable is full
+// right to end with characters
+*/
+ {
+ int n1, n2;
+
+ n1 = (l1>NAMEBUFFLEN) ? NAMEBUFFLEN : l1;
+ n2 = (l2>MODEBUFFLEN) ? MODEBUFFLEN : l2;
+
+ strncpy( namebuff, name, n1);
+ strncpy( modebuff, mode, n2);
+ namebuff[n1] = '\0';
+ modebuff[n2] = '\0';
+ }
+#else
+ if(!(namebuff = fcd2char(name))) {
+ *iret = -2;
+ return;
+ }
+ if(!(modebuff = fcd2char(mode))) {
+ free(namebuff);
+ *iret = -2;
+ return;
+ }
+#endif
+
+ strcpy(flags,"");
+
+ *unit = 0;
+ *iret = 0;
+
+/*
+// Strip trailing blanks
+*/
+ p = namebuff + strlen(namebuff) - 1 ;
+
+ while(*p == ' ') {
+ *p = 0;
+ p--;
+ }
+ if( DEBUG ) printf("PBIO_PBOPEN: filename = %s\n", namebuff);
+
+/*
+// Build open flags from "modes"
+*/
+ p = modebuff;
+
+ switch(*p) {
+
+ case 'a':
+ case 'A': oflag = 0x100 | 2 | 0x08;
+ filemode = 766;
+ break;
+
+ case 'c':
+ case 'C':
+ case 'w':
+ case 'W': oflag = 0x100 | 1;
+ filemode = 766;
+ break;
+
+ case 'r':
+ case 'R': oflag = 0;
+ filemode = 444;
+ break;
+
+ default: *iret = -3;
+ return;
+
+ }
+
+ if( DEBUG ) printf("PBIO_PBOPEN: file open mode = %s\n", modebuff);
+
+ dmas = umask(000);
+ *unit = open(namebuff, oflag, oct_bin3(filemode));
+ umask(dmas);
+
+ if(*unit == -1) {
+ perror(namebuff);
+ perror("pbopen3");
+ *iret = -2;
+ }
+
+ if( DEBUG ) printf("PBIO_PBOPEN3: file pointer = %0x\n", *unit);
+
+#if (defined CRAY) || (defined VAX)
+ free(namebuff);
+ free(modebuff);
+#endif
+
+}
+
+void pbopen3(fortint* unit,_fcd name,_fcd mode,fortint* iret,fortint l1,fortint l2) {
+
+ pbopen3_(unit,name,mode,iret,l1,l2);
+}
+
+/*
+//------------------------------------------------------------------------
+// PBCLOSE3 - Close file (from FORTRAN)
+//------------------------------------------------------------------------
+*/
+void pbclose3_(fortint* unit,fortint* iret) {
+/*
+//
+// Purpose: Closes file.
+//
+// Function returns:
+// status : non-0 = error in handling file.
+// 0 = OK.
+*/
+ if( DEBUG ) printf("PBIO_PBCLOSE3: file pointer = %0x\n", *unit);
+
+ *iret = close(*unit);
+
+ if(*iret != 0) perror("pbclose3");
+}
+
+void pbclose3(fortint* unit,fortint* iret) {
+
+ pbclose3_(unit,iret);
+}
+
+/*
+//------------------------------------------------------------------------
+// PBSEEK3 - Seek (from FORTRAN)
+//------------------------------------------------------------------------
+*/
+void pbseek3_(fortint* unit,fortint* offset,fortint* whence,fortint* iret) {
+/*
+//
+// Purpose: Seeks to specified location in file.
+//
+// Function returns:
+// status: -2 = error in handling file,
+// -1 = end-of-file
+// otherwise, = byte offset from start of file.
+//
+// whence = 0, from start of file
+// = 1, from current position
+// = 2, from end of file.
+*/
+fortint my_offset = *offset;
+int my_whence;
+
+ if( DEBUG ) {
+ printf("PBIO_PBSEEK3: file pointer = %0x\n", *unit);
+ printf("PBIO_PBSEEK3: offset = %d\n", my_offset);
+ printf("PBIO_PBSEEK3: type of offset = %d\n", *whence);
+ }
+
+/*
+// Must use negative offset if working from end-of-file
+*/
+ if( *whence == 2) {
+ my_offset = - abs(my_offset);
+ my_whence = 2;
+ }
+ else if(*whence == 0)
+ {
+ my_whence = 0;
+ }
+ else
+ {
+ my_whence = 1;
+ }
+
+ if((*iret=lseek(*unit, my_offset, my_whence)) < 0) {
+ perror("pbseek3;");
+ *iret = -1; /* end-of-file */
+ }
+
+ if( DEBUG )
+ printf("PBIO_PBSEEK3: byte offset from start of file = %d\n",*iret);
+
+}
+
+void pbseek3(fortint* unit,fortint* offset,fortint* whence,fortint* iret) {
+
+ pbseek3_(unit,offset,whence,iret);
+}
+
+/*
+//------------------------------------------------------------------------
+// PBWRITE3 - Write (from FORTRAN)
+//------------------------------------------------------------------------
+*/
+void pbwrite3_(fortint* unit,char* buffer,fortint* nbytes,fortint* iret) {
+/*
+// Purpose: Writes a block of bytes to a file.
+//
+// Function returns:
+// status: -1 = Could not write to file.
+// >=0 = Number of bytes written.
+*/
+ if( DEBUG ) {
+ printf("PBIO_PBWRITE3: file pointer = %0x\n", *unit);
+ printf("PBIO_WRITE#: number of bytes to write = %d\n", *nbytes);
+ }
+
+ *iret = write(*unit, buffer, *nbytes);
+ if( DEBUG )
+ printf("PBIO_WRITE3: number of bytes written = %d\n", *iret);
+
+ if( *iret != *nbytes ) {
+ perror("pbwrite3: ");
+ *iret = -1;
+ }
+
+}
+
+void pbwrite3(fortint* unit,char* buffer,fortint* nbytes,fortint* iret) {
+
+ pbwrite3_(unit,buffer,nbytes,iret);
+}
+
+/*
+//------------------------------------------------------------------------
+// GRIBREAD
+//------------------------------------------------------------------------
+*/
+void gribread_(
+char* buffer,fortint* buffsize,fortint* readsize,fortint* status,fortint* unit){
+/*
+// Called as a FORTRAN subroutine:
+//
+// CALL GRIBREAD( KARRAY, KINLEN, KOUTLEN, IRET, KUNIT )
+//
+*/
+fortint holdsize = *buffsize;
+
+/*
+// Read GRIB product
+*/
+
+ *status = readprod("GRIB",buffer,&holdsize,fileRead,fileSeek,fileTell,
+ CURRENT_FILE);
+ *readsize = abs(holdsize );
+
+ if( DEBUG ) {
+ printf("PBIO_GRIBREAD: fptable slot = %d. ", *unit);
+ printf("Number of bytes read = %d\n", *readsize);
+ }
+
+ return;
+}
+
+void gribread(
+char* buffer,fortint* buffsize,fortint* readsize,fortint* status,fortint* unit){
+
+ gribread_(buffer,buffsize,readsize,status,unit);
+}
+
+/*
+//------------------------------------------------------------------------
+// BUFRREAD
+//------------------------------------------------------------------------
+*/
+void bufrread_(
+char* buffer,fortint* buffsize,fortint* readsize,fortint* status,fortint* unit){
+/*
+// Called as a FORTRAN subroutine:
+//
+// CALL BUFRREAD( KARRAY, KINLEN, KOUTLEN, IRET, KUNIT )
+//
+*/
+fortint holdsize = *buffsize;
+
+/*
+// Read BUFR product
+*/
+ *status = readprod("BUFR",buffer,&holdsize,fileRead,fileSeek,fileTell,
+ CURRENT_FILE);
+ *readsize = abs(holdsize );
+
+ if( DEBUG ) {
+ printf("PBIO_BUFRREAD: fptable slot = %d. ", *unit);
+ printf("Number of bytes read = %d\n", *readsize);
+ }
+
+ return;
+}
+
+void bufrread(
+char* buffer,fortint* buffsize,fortint* readsize,fortint* status,fortint* unit){
+
+ bufrread_(buffer,buffsize,readsize,status,unit);
+}
+
+/*
+//------------------------------------------------------------------------
+// PSEUREAD
+//------------------------------------------------------------------------
+*/
+void pseuread_(
+char* buffer,fortint* buffsize,fortint* readsize,fortint* status,fortint* unit){
+/*
+// Called as a FORTRAN subroutine:
+//
+// CALL PSEUREAD( KARRAY, KINLEN, KOUTLEN, IRET, KUNIT )
+//
+*/
+fortint holdsize = *buffsize;
+
+/*
+// Read GRIB product
+*/
+ *status = readprod(NULL,buffer,&holdsize,fileRead,fileSeek,fileTell,
+ CURRENT_FILE);
+ *readsize = abs(holdsize );
+
+ if( DEBUG ) {
+ printf("PBIO_PSEUREAD: fptable slot = %d. ", *unit);
+ printf("Number of bytes read = %d\n", *readsize);
+ }
+
+ return;
+}
+
+void pseuread(
+char* buffer,fortint* buffsize,fortint* readsize,fortint* status,fortint* unit){
+
+ pseuread_(buffer,buffsize,readsize,status,unit);
+}
+
+/*
+//------------------------------------------------------------------------
+// PBSIZE
+//------------------------------------------------------------------------
+*/
+void pbsize_(fortint* unit,fortint* plen) {
+/*
+// Returns the size in bytes of the next GRIB, BUFR, TIDE, BUDG, DIAG
+// product.
+//
+// Called from FORTRAN:
+// CALL PBSIZE( KUNIT, LENGTH)
+//
+// unit = file id returned from PBOPEN.
+// plen = size in bytes of the next product.
+// = -2 if error allocating memory for internal buffer.
+//
+// The input file is left positioned where it started.
+*/
+fortint iret;
+char statbuff[BUFFLEN];
+char * buff;
+long offset, loop = 1;
+
+/*
+// Use a smallish buffer for processing; this should suffice for all cases
+// except versions -1 and 0 of GRIB and large BUFR products
+*/
+ offset = (fortint) fileTell( CURRENT_FILE);
+ if( DEBUG ) {
+ printf("PBIO_SIZE: fptable slot = %d. ", *unit);
+ printf("Current file position = %d\n", offset);
+ }
+
+ *plen = BUFFLEN;
+ if( DEBUG )
+ printf("PBIO_SIZE: current buffer size = %d\n", *plen);
+
+ iret = readprod(NULL,statbuff,plen,fileRead,fileSeek,fileTell,CURRENT_FILE);
+ if( iret == -2 ) {
+ printf("readprod error %d\n", iret);
+ *plen = -2;
+ return;
+ }
+/*
+// If the smallish buffer is too small, progressively increase it until
+// big enough
+*/
+ while ( iret == -4 ) {
+ loop++;
+ buff = (char *) malloc( BUFFLEN*loop);
+ if( buff == NULL) {
+ perror("malloc failed in PBSIZE");
+ *plen = -2;
+ return;
+ }
+ *plen = BUFFLEN*loop;
+ if( DEBUG )
+ printf("PBIO_SIZE: buffer size increased to: %d\n", *plen);
+
+ offset = (fortint) fileSeek( CURRENT_FILE, offset, SEEK_SET);
+ offset = (fortint) fileTell( CURRENT_FILE);
+ iret = readprod(NULL,buff,plen,fileRead,fileSeek,fileTell,CURRENT_FILE);
+ free(buff);
+ }
+
+ if( iret == -2 ) {
+ printf("readprod error %d\n", iret);
+ *plen = -2;
+ }
+/*
+// Put the file pointer back where it started
+*/
+ if( DEBUG ) {
+ printf("PBIO_SIZE: file pointer set back to: %d\n", offset);
+ printf("PBIO_SIZE: Product size = %d\n", *plen);
+ }
+ offset = (fortint) fileSeek( CURRENT_FILE, offset, SEEK_SET);
+
+ return ;
+}
+
+void pbsize(fortint* unit,fortint* plen) {
+
+ pbsize_(unit,plen);
+}
+
+/*
+//------------------------------------------------------------------------
+// CREXRD
+//------------------------------------------------------------------------
+*/
+#define END_OF_FILE -1
+#define FILE_READ_ERROR -2
+#define USER_BUFFER_TOO_SMALL -3
+#define FILE_TOO_SMALL -5
+#define MINIMUM_CREX_SIZE 13
+#define CREX 0x43524558
+
+typedef char * String;
+
+void crexrd_(String buffer,int* bufflen,int* size,int* status,fortint * unit) {
+/*
+// Called from FORTRAN:
+// CALL CREXRD( KARRAY, KINLEN, NREAD, IRET, KUNIT )
+*/
+int loop;
+OFF_T foundPosition;
+int number, crexFound = 0, endFound = 0;
+String endBuffer;
+String next;
+char plplcrcrlf7777[10] = {0,0,0,0,0,0,0,0,0,0};
+char PlPlCrCrLf7777[10] = {0x2b,0x2b,0x0d,0x0d,0x0a,0x37,0x37,0x37,0x37,0x00};
+
+/*
+// Check buffer big enough for CREX search
+*/
+ if( *bufflen < MINIMUM_CREX_SIZE ) {
+ *status = USER_BUFFER_TOO_SMALL;
+ return;
+ }
+
+/*
+// Look for CREX
+*/
+ for( loop = 0; loop <= 4; loop++) buffer[loop] = '\0';
+
+ while( !crexFound ) {
+ buffer[0] = buffer[1];
+ buffer[1] = buffer[2];
+ buffer[2] = buffer[3];
+ number = fread((buffer+3), 1, 1, CURRENT_FILE);
+ if( feof(CURRENT_FILE) ) {
+ *status = END_OF_FILE;
+ return;
+ }
+ if( (number != 1) || ferror(CURRENT_FILE) ) {
+ perror("crexrd file read error");
+ *status = FILE_READ_ERROR;
+ return;
+ }
+ if( strcmp(buffer,"CREX") == 0 ) {
+ crexFound = 1;
+#ifdef FOPEN64
+ foundPosition = ftello64(CURRENT_FILE) - 4;
+#else
+ foundPosition = ftell(CURRENT_FILE) - 4;
+#endif
+ }
+ }
+
+/*
+// Read some more characters into the buffer
+*/
+ number = fread((buffer+4), 1, ((*bufflen)-4), CURRENT_FILE);
+ if( ferror(CURRENT_FILE) ) {
+ perror("crexrd file read error");
+ *status = FILE_READ_ERROR;
+ return;
+ }
+ endBuffer = buffer + number + 3;
+
+/*
+// Look for ++CrCrLf7777 at end of product
+*/
+ next = buffer+4;
+ endFound = 0;
+ for( loop = 0; loop < 8; loop++ )
+ plplcrcrlf7777[loop] = *(next++);
+ plplcrcrlf7777[9] = '\0';
+
+ while( (!endFound) && (next<=endBuffer) ) {
+ plplcrcrlf7777[8] = *(next++);
+ if( strcmp(plplcrcrlf7777,PlPlCrCrLf7777) == 0 ) {
+ endFound = 1;
+ *size = (int) (next - buffer);
+ }
+
+ for( loop = 0; loop < 8; loop++ )
+ plplcrcrlf7777[loop] = plplcrcrlf7777[loop+1];
+ }
+
+ if( !endFound ) {
+ if( feof(CURRENT_FILE) )
+ *status = END_OF_FILE;
+ else
+ *status = USER_BUFFER_TOO_SMALL;
+ return;
+ }
+
+/*
+// Position file at end of CREX product
+*/
+#ifdef FOPEN64
+ *status = fseeko64(CURRENT_FILE, (foundPosition+(*size)), 0);
+#else
+ *status = fseek(CURRENT_FILE, (foundPosition+(*size)), 0);
+#endif
+
+}
+
+void crexrd(String buffer,int* bufflen,int* size,int* status,fortint * unit) {
+
+ crexrd_(buffer,bufflen,size,status,unit);
+}
diff --git a/pbio/pbio_alpha.c b/pbio/pbio_alpha.c
new file mode 100755
index 0000000..52a98c4
--- /dev/null
+++ b/pbio/pbio_alpha.c
@@ -0,0 +1,754 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+static FILE** fptable = NULL;
+static int fptableSize = 0;
+#define BUFFLEN 4096
+
+#include "fortint.h"
+#include "fileRead.h"
+
+/*
+// pbio_alpha.c
+*/
+#include "fort2c.h"
+#include "bufrgrib.h"
+
+#define NAMEBUFFLEN 256
+#define MODEBUFFLEN 10
+
+/*************************************************************************
+// FUNCTION: pbopen - Open file (from FORTRAN)
+**************************************************************************
+*/
+void PBOPEN(fortint* unit, _fcd name, _fcd mode, fortint* iret, int l1, int l2){
+/*
+// Purpose:
+// Opens file, returns the index of a UNIX FILE pointer held in
+// an internal table (fptable).
+//
+// Function accepts:
+// name = filename
+// mode = r, w
+//
+// Note: l1 and l2 are the lengths of the FORTRAN character strings
+// in name and mode.
+//
+// Function returns:
+// INTEGER iret:
+// -1 = Could not open file.
+// -2 = Invalid file name.
+// -3 = Invalid open mode specified
+// 0 = OK.
+*/
+char *fname;
+char *modes;
+char *p;
+char flags[4];
+char namebuff[NAMEBUFFLEN], modebuff[MODEBUFFLEN];
+
+int n;
+
+/*
+// Put the character strings into buffers and ensure that there is a
+// null terminator (for case when FORTRAN CHARACTER variable is full
+// right to end with characters.
+*/
+ strncpy( namebuff, name, NAMEBUFFLEN - 1);
+ strncpy( modebuff, mode, MODEBUFFLEN - 1);
+ namebuff[l1] = '\0';
+ modebuff[l2] = '\0';
+
+ strcpy(flags,"");
+
+ *unit = NULL;
+ *iret = 0;
+
+/*
+// Convert Fortran to C string: file name.
+*/
+ if(!(fname = fcd2char(name))) {
+ *iret = -2;
+ return;
+ }
+
+/*
+// Strip trailing blanks.
+*/
+ p = fname;
+ while(*p) {
+ if(*p == ' ') *p = 0;
+ p++;
+ }
+
+/*
+// Convert Fortran to C string: open modes.
+*/
+ if(!(modes = fcd2char(mode))) {
+ free(fname);
+ *iret = -2;
+ return;
+ }
+
+/*
+// Build open flags from "modes".
+*/
+ p = modes;
+ switch(*p) {
+ case 'a':
+ case 'A': strcat(flags, "a");
+ break;
+
+ case 'c':
+ case 'C':
+ case 'w':
+ case 'W': strcat(flags, "w");
+ break;
+
+ case 'r':
+ case 'R': strcat(flags, "r");
+ break;
+
+ default: *iret = -3;
+ return;
+
+ }
+
+/*
+// If read/write, change flags.
+*/
+ if( !strcmp(flags,"wr") || !strcmp(flags, "rw") ) strcpy(flags, "r+w" );
+
+/*
+// Look for a free slot in fptable.
+// (Create the table the first time through).
+*/
+ n = 0;
+ if( fptableSize == 0 ) {
+ int i;
+ fptableSize = 2;
+ fptable = (FILE **) malloc(fptableSize*sizeof(FILE *));
+ if( fptable == NULL ) {
+ perror("Unable to allocate space for table of FILE pointers");
+ exit(1);
+ }
+ for( i = 0; i < fptableSize; i++ )
+ fptable[i] = 0;
+ }
+ else {
+ while( n < fptableSize ) {
+ if (fptable[n]==0) {
+ *unit = n;
+ break;
+ }
+ n++;
+ }
+ }
+/*
+// If the table overflows, double its size.
+*/
+ if( n == fptableSize) {
+ int i;
+ fptableSize = 2*fptableSize;
+ fptable = (FILE **) realloc(fptable, fptableSize*sizeof(FILE *));
+ if( fptable == NULL ) {
+ perror("Unable to reallocate space for table of FILE pointers");
+ exit(1);
+ }
+ n = fptableSize/2;
+ for( i = n; i < fptableSize; i++ )
+ fptable[i] = 0;
+ *unit = n;
+ }
+
+ fptable[n] = fopen(fname, flags );
+
+ if(fptable[n] == NULL) {
+ perror(fname);
+ *iret = -1;
+ }
+
+ free(fname);
+ free(modes);
+
+ return;
+}
+
+/*************************************************************************
+// FUNCTION: pbseek_ - Seek (from FORTRAN)
+**************************************************************************
+*/
+void PBSEEK(fortint* unit, fortint* offset, fortint* whence, fortint* iret) {
+/*
+//
+// Purpose:
+// Seeks to a specified location in file.
+//
+// Function accepts:
+// unit = the index of a UNIX FILE pointer held in
+// an internal table (fptable).
+//
+// offset = byte count
+//
+// whence = 0, from start of file
+// = 1, from current position
+// = 2, from end of file.
+//
+// Returns:
+// iret:
+// -2 = error in handling file,
+// -1 = end-of-file
+// otherwise, = byte offset from start of file.
+*/
+fortint my_offset;
+fortint my_whence;
+
+ my_offset = *offset;
+ my_whence = *whence;
+
+/*
+// Must use negative offset if working from end-of-file
+*/
+ if( my_whence == 2) my_offset = - abs(my_offset);
+
+ *iret = fileTell(fptable[*unit]);
+ if( *iret == my_offset && my_whence == 0)
+ *iret = 0;
+ else
+ *iret = fileSeek(fptable[*unit], my_offset, my_whence);
+
+ if( *iret != 0 ) {
+ if ( ! feof(fptable[*unit]) ) {
+ *iret = -2; /* error in file-handling */
+ perror("pbseek");
+ }
+ else
+ *iret = -1; /* end-of-file */
+
+ clearerr(fptable[*unit]);
+ return;
+ }
+
+/*
+// Return the byte offset from start of file
+*/
+ *iret = fileTell(fptable[*unit]);
+
+ return;
+}
+
+/*************************************************************************
+* FUNCTION: pbread_ - Read (from FORTRAN)
+**************************************************************************
+*/
+void PBREAD(fortint* unit, char * buffer, fortint* nbytes, fortint* iret) {
+/*
+// Purpose:
+// Reads a block of bytes from a file..
+//
+// Function accepts:
+// unit = the index of a UNIX FILE pointer held in
+// an internal table (fptable).
+//
+// nbytes = number of bytes to read.
+//
+// Returns:
+// iret:
+// -2 = error in reading file,
+// -1 = end-of-file,
+// otherwise, = number of bytes read.
+*/
+ if( (*iret = fread(buffer, 1, *nbytes, fptable[*unit]) ) != *nbytes) {
+ if( ! feof(fptable[*unit]) ) {
+ *iret = -2; /* error in file-handling */
+ perror("pbread");
+ clearerr(fptable[*unit]);
+ return;
+ }
+ else {
+ *iret = -1; /* end-of-file */
+ clearerr(fptable[*unit]);
+ }
+ }
+
+ return;
+}
+
+/*************************************************************************
+* FUNCTION: pbread2_ - Read (from FORTRAN)
+**************************************************************************
+*/
+void PBREAD2(fortint* unit, char * buffer, fortint* nbytes, fortint* iret) {
+/*
+// Purpose:
+// Reads a block of bytes from a file..
+//
+// Function accepts:
+// unit = the index of a UNIX FILE pointer held in
+// an internal table (fptable).
+//
+// nbytes = number of bytes to read.
+//
+// Returns:
+// iret:
+// -2 = error in reading file,
+// -1 = end-of-file,
+// otherwise, = number of bytes read.
+*/
+ if( (*iret = fread(buffer, 1, *nbytes, fptable[*unit]) ) != *nbytes) {
+ if( ! feof(fptable[*unit]) ) {
+ *iret = -2; /* error in file-handling */
+ perror("pbread");
+ clearerr(fptable[*unit]);
+ return;
+ }
+ else {
+ *iret = -1; /* end-of-file */
+ clearerr(fptable[*unit]);
+ }
+ }
+
+ return;
+}
+
+/*************************************************************************
+* FUNCTION: pbwrite_ - Write (from FORTRAN)
+**************************************************************************
+*/
+void PBWRITE(fortint* unit, char * buffer, fortint* nbytes, fortint* iret) {
+/*
+// Purpose:
+// Writes a block of bytes to a file.
+//
+// Function accepts:
+// unit = the index of a UNIX FILE pointer held in
+// an internal table (fptable).
+//
+// nbytes = number of bytes to write.
+//
+// Returns:
+// iret:
+// -1 = Could not write to file.
+// >=0 = Number of bytes written.
+*/
+ if ( (*iret = fwrite(buffer, 1, *nbytes, fptable[*unit]) ) != *nbytes) {
+ perror("pbwrite");
+ *iret = -1;
+ }
+
+ return;
+}
+
+/*************************************************************************
+* FUNCTION: pbclos_ - clos (from FORTRAN)
+**************************************************************************
+*/
+fortint PBCLOSE(fortint* unit, fortint* iret)
+/*
+// Purpose:
+// Closes file.
+//
+// Function accepts:
+// unit = the index of a UNIX FILE pointer held in
+// an internal table (fptable).
+//// Returns:
+// iret:
+// 0 = OK.
+// otherwise = error in handling file.
+*/
+{
+ *iret = fclose(fptable[*unit]);
+ fptable[*unit] = 0;
+
+ if(*iret != 0) {
+ perror("pbclose");
+ return (1);
+ }
+
+ return (0);
+
+}
+
+void GRIBREAD(char * buffer, fortint* buffsize, fortint* readsize,
+ fortint* status, fortint* stream) {
+/*
+// Called as a FORTRAN subroutine:
+//
+// CALL GRIBREAD( KARRAY, KINLEN, KOUTLEN, IRET, KUNIT )
+//
+*/
+fortint holdsize = *buffsize;
+
+/*
+// Read GRIB product
+*/
+ *status = readprod("GRIB",buffer,&holdsize,fileRead,fileSeek,fileTell,
+ fptable[*stream]);
+ *readsize = abs(holdsize );
+ return;
+}
+
+void BUFRREAD(char * buffer, fortint* buffsize, fortint* readsize,
+ fortint* status, fortint* stream) {
+/*
+// Called as a FORTRAN subroutine:
+//
+// CALL BUFRREAD( KARRAY, KINLEN, KOUTLEN, IRET, KUNIT )
+//
+*/
+fortint holdsize = *buffsize;
+
+/*
+// Read BUFR product
+*/
+ *status = readprod("BUFR",buffer,&holdsize,fileRead,fileSeek,fileTell,
+ fptable[*stream]);
+ *readsize = abs(holdsize );
+ return;
+}
+
+void PSEUREAD(char * buffer, fortint* buffsize, fortint* readsize,
+ fortint* status, fortint* stream) {
+/*
+// Called as a FORTRAN subroutine:
+
+// CALL PSEUREAD( KARRAY, KINLEN, KOUTLEN, IRET, KUNIT )
+
+*/
+fortint holdsize = *buffsize;
+
+/*
+// Read GRIB product
+*/
+ *status = readprod(NULL,buffer,&holdsize,fileRead,fileSeek,fileTell,
+ fptable[*stream]);
+ *readsize = abs(holdsize );
+ return;
+}
+
+/*************************************************************************
+// FUNCTION: pbopen - Open file (from FORTRAN)
+**************************************************************************
+*/
+void PBSIZE(fortint* unit, fortint* plen) {
+/*
+// Purpose:
+// Returns the size in bytes of the next GRIB, BUFR, TIDE, BUDG, DIAG
+// product.
+//
+// Called from FORTRAN:
+// CALL PBSIZE( KUNIT, LENGTH)
+//
+// Function accepts:
+// unit = the index of a UNIX FILE pointer held in
+// an internal table (fptable).
+//
+// Returns:
+// plen = size in bytes of the next product.
+// = -2 if error allocating memory for internal buffer.
+//
+// The input file is left positioned where it started.
+*/
+fortint iret;
+char statbuff[BUFFLEN];
+char * buff;
+fortint offset, loop = 1;
+FILE *in = fptable[*unit];
+
+/*
+// Use a smallish buffer for processing; this should suffice for all cases
+// except versions -1 and 0 of GRIB and large BUFR products
+*/
+ offset = (fortint) fileTell( in);
+ *plen = BUFFLEN;
+ iret = readprod(NULL,statbuff,plen,fileRead,fileSeek,fileTell,in);
+ if( iret == -2 ) {
+ printf("readprod error %d\n", iret);
+ *plen = -2;
+ return;
+ }
+/*
+// If the smallish buffer is too small, progressively increase it until
+// big enough */
+
+ while ( iret == -4 ) {
+ loop++;
+ buff = (char *) malloc( BUFFLEN*loop);
+ if( buff == NULL) {
+ perror("malloc failed in PBSIZE");
+ *plen = -2;
+ return;
+ }
+ *plen = BUFFLEN*loop;
+ offset = (fortint) fileSeek( in, offset, SEEK_SET);
+ offset = (fortint) fileTell( in);
+ iret = readprod(NULL,buff,plen,fileRead,fileSeek,fileTell,in);
+ free(buff);
+ }
+
+ if( iret == -2 ) {
+ printf("readprod error %d\n", iret);
+ *plen = -2;
+ }
+/*
+// Put the file pointer back where it started
+*/
+ offset = (fortint) fileSeek( in, offset, SEEK_SET);
+
+ return;
+}
+
+#define PBOPEN3 pbopen3_
+#define PBREAD3 pbread3_
+#define PBWRITE3 pbwrite3_
+#define PBSEEK3 pbseek3_
+#define PBCLOSE3 pbclose3_
+
+
+void PBREAD3(fortint *unit, char * buffer, fortint * nbytes, fortint * iret)
+/*
+*
+* Purpose: Reads a block of bytes from a file.
+*
+* Function returns: status : -2 = error in reading file,
+* -1 = end-of-file,
+* otherwise, = number of bytes read.
+*/
+{
+
+ *iret = read(*unit, buffer, *nbytes);
+
+ /* Read problem */
+ if (*iret == -1)
+ {
+ *iret = -2; /* error in file-handling */
+ perror("pbread3");
+ return;
+ }
+ else if (*iret != *nbytes)
+ {
+ *iret = -1;
+ printf("EOF; pbread3; bytes requested %d; read in: %d\n",
+ *nbytes,*iret);
+ return;
+ }
+
+}
+
+static oct_bin3(int onum)
+{
+ char tmp[20];
+ int rc;
+
+ sprintf(tmp,"%d",onum);
+ sscanf(tmp,"%o",&rc);
+ return rc;
+}
+void PBOPEN3(fortint *unit, _fcd name, _fcd mode, fortint * iret,
+ fortint l1, fortint l2)
+/*
+* Purpose: Opens file, return UNIX FILE pointer.
+*
+* Function returns: iret: -1 = Could not open file.
+* -2 = Invalid file name.
+* -3 = Invalid open mode specified
+* 0 = OK.
+*
+* Note: l1 and l2 are the lengths of the character strings in
+* name and mode on SGI.
+*/
+{
+char *fname;
+char *modes;
+char *p;
+int oflag;
+int dmas;
+int filemode;
+
+#if (!defined CRAY) && (!defined VAX)
+char namebuff[NAMEBUFFLEN], modebuff[MODEBUFFLEN];
+
+/* Put the character strings into buffers and ensure that there is a
+ null terminator (for SGI case when FORTRAN CHARACTER variable is full
+ right to end with characters */
+ strncpy( namebuff, name, NAMEBUFFLEN - 1);
+ strncpy( modebuff, mode, MODEBUFFLEN - 1);
+ namebuff[l1] = '\0';
+ modebuff[l2] = '\0';
+#endif
+
+
+ *unit = 0;
+ *iret = 0;
+
+ /* convert fortran to c string : file name */
+
+#if (!defined CRAY) && (!defined VAX)
+ if(!(fname = fcd2char(namebuff)))
+#else
+ if(!(fname = fcd2char(name)))
+#endif
+ {
+ *iret = -2;
+ return;
+ }
+
+ /* strip trailing blanks */
+
+ p = fname + strlen(fname) - 1 ;
+ while(*p == ' ')
+ {
+ *p = 0;
+ p--;
+ }
+
+ /* convert fortran to c string : open modes */
+
+#if (!defined CRAY) && (!defined VAX)
+ if(!(modes = fcd2char(modebuff)))
+#else
+ if(!(modes = fcd2char(mode)))
+#endif
+ {
+ free(fname);
+ *iret = -3;
+ return;
+ }
+
+ /* build open flags from "modes" */
+
+ p = modes;
+ while(*p)
+ {
+ switch(*p)
+ {
+ case '+': break;
+
+ case 'a':
+ case 'A': oflag = 0x100 | 2 | 0x08;
+ filemode = 766;
+ break;
+
+ case 'c':
+ case 'C':
+ case 'w':
+ case 'W': oflag = 0x100 | 1;
+ filemode = 766;
+ break;
+
+ case 'r':
+ case 'R': oflag = 0;
+ filemode = 444;
+ break;
+
+ default: *iret = -3;
+ return;
+
+ }
+ p++;
+ }
+
+
+ dmas = umask(000);
+ *unit = open(fname, oflag, oct_bin3(filemode));
+ umask(dmas);
+
+ if(*unit == -1)
+ {
+ perror(fname);
+ perror("pbopen3");
+ *iret = -2;
+ }
+
+
+ free(fname);
+ free(modes);
+
+}
+
+
+void PBCLOSE3( fortint * unit, fortint * iret)
+/*
+*
+* Purpose: Closes file.
+*
+* Function returns: status : non-0 = error in handling file.
+* 0 = OK.
+*/
+{
+ *iret = close(*unit);
+
+ if(*iret != 0) perror("pbclose3");
+
+}
+
+void PBSEEK3(fortint * unit, fortint * offset, fortint * whence, fortint * iret)
+/*
+*
+* Purpose: Seeks to specified location in file.
+*
+* Function returns: status : -2 = error in handling file,
+* -1 = end-of-file
+* otherwise, = byte offset from start of file.
+*
+* whence = 0, from start of file
+* = 1, from current position
+* = 2, from end of file.
+*/
+{
+fortint my_offset = *offset;
+int my_whence;
+
+ if ( *whence == 2)
+ {
+ my_offset = - abs(my_offset);
+ my_whence = 2;
+ }
+ else if (*whence == 0)
+ {
+ my_whence = 0;
+ }
+ else
+ {
+ my_whence = 1;
+ }
+
+ /* must use negative offset if working
+ from end-of-file */
+
+ if ((*iret=lseek(*unit, my_offset, my_whence)) < 0)
+ {
+ perror("pbseek3;");
+ *iret = -1; /* end-of-file */
+ }
+
+}
+
+void PBWRITE3( fortint * unit, char * buffer, fortint * nbytes, fortint *iret)
+/*
+* Purpose: Writes a block of bytes to a file.
+*
+* Function returns: status : -1 = Could not write to file.
+* >=0 = Number of bytes written.
+*/
+{
+ if ((*iret = write(*unit, buffer, *nbytes)) != *nbytes)
+ {
+ perror("pbwrite3: ");
+ *iret = -1;
+ }
+
+}
+
diff --git a/pbio/pbionum.F b/pbio/pbionum.F
new file mode 100755
index 0000000..388e094
--- /dev/null
+++ b/pbio/pbionum.F
@@ -0,0 +1,124 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ INTEGER FUNCTION PBIONUM(KONOFF)
+C
+C---->
+C**** PBIONUM
+C
+C Purpose
+C -------
+C
+C Returns current PBIO_CYCLE version number.
+C
+C
+C Interface
+C ---------
+C
+C INUM = PBIONUM(KONOFF)
+C
+C Input
+C -----
+C
+C KONOFF - switch for displayed message
+C = 0 if display is required on the first call
+C = non-zero if display is not required
+C
+C
+C Output
+C ------
+C
+C Returns a 6-digit version number, aaabbc, where:
+C aaa = 3-digit major number
+C bb = 2-digit minor number
+C c = 1-digit spare number (normally 0)
+C
+C
+C Method
+C ------
+C
+C Reads a 6-digit version number from the environment variable
+C PBIO_CYCLE. If this does not give a 6-digit number, an internal
+C hard-coded default value is used.
+C
+C On the first call, the function (optionally) displays a message:
+C
+C **************************************
+C * PBIO_CYCLE version number = aaabbc *
+C **************************************
+C
+C
+C Externals
+C ---------
+C
+C None.
+C
+C
+C Author
+C ------
+C
+C J.D.Chambers ECMWF May 1998
+C
+C
+C----<
+C ------------------------------------------------------------------
+C* Section 0. Variables.
+C ------------------------------------------------------------------
+C
+C
+ IMPLICIT NONE
+C
+#include "grprs.h"
+C
+C Function arguments
+C
+ INTEGER KONOFF
+C
+C Local variables
+C
+ INTEGER INUMBER, ICOUNT, IOFFSET
+ SAVE INUMBER, ICOUNT
+ CHARACTER*38 CMESS
+ CHARACTER*20 YNUMBER
+C
+ DATA INUMBER/000010/, ICOUNT/0/
+ DATA CMESS/'* PBIO_CYCLE version number = ****** *'/
+C
+C ------------------------------------------------------------------
+C* Section 1. Initialise
+C ------------------------------------------------------------------
+C
+ 100 CONTINUE
+C
+ IF( ICOUNT.EQ.0 ) THEN
+C
+C See if the environment variable has an override value
+C
+ CALL GETENV( 'PBIO_CYCLE', YNUMBER)
+ IOFFSET = INDEX( YNUMBER, ' ')
+ IF( IOFFSET.EQ.7 ) THEN
+ READ(YNUMBER,'(I6.6)') INUMBER
+ ENDIF
+C
+C First time through, display the message if required
+C
+ IF( KONOFF.EQ.0 ) THEN
+ WRITE(CMESS(31:36),'(I6.6)') INUMBER
+ WRITE(GRPRSM,*) '**************************************'
+ WRITE(GRPRSM,*) CMESS
+ WRITE(GRPRSM,*) '**************************************'
+ ENDIF
+ ICOUNT = 1
+ ENDIF
+C
+ PBIONUM = INUMBER
+C
+ RETURN
+ END
diff --git a/pbio/pbpseu.F b/pbio/pbpseu.F
new file mode 100755
index 0000000..a366c40
--- /dev/null
+++ b/pbio/pbpseu.F
@@ -0,0 +1,123 @@
+C Copyright 1981-2012 ECMWF.
+C
+C This software is licensed under the terms of the Apache Licence
+C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+C
+C In applying this licence, ECMWF does not waive the privileges and immunities
+C granted to it by virtue of its status as an intergovernmental organisation
+C nor does it submit to any jurisdiction.
+C
+
+ SUBROUTINE PBPSEU(KUNIT,KARRAY,KINLEN,KOUTLEN,KRET)
+C
+C---->
+C**** PBPSEU
+C
+C PURPOSE
+C _______
+C
+C Reads next PSEUDO GRIB product from a file.
+C
+C INTERFACE
+C _________
+C
+C CALL PBPSEU(KUNIT,KARRAY,KINLEN,KOUTLEN,KRET)
+C
+C
+C Input parameters
+C ________________
+C
+C KUNIT - Unit number for the file returned from PBOPEN
+C KARRAY - FORTRAN array big enough to hold the PSEU product
+C KINLEN - Size in BYTES of the FORTRAN array
+C
+C
+C Output parameters
+C ________________
+C
+C KOUTLEN - Size in BYTES of the PSEU product read
+C KRET - 0 if a PSEU product has been successfully read
+C -1 if end-of-file is hit before a PSEU product is read
+C -3 if the size of KARRAY is not sufficient for the
+C PSEU product
+C
+C
+C Common block usage
+C __________________
+C
+C None.
+C
+C
+C Method
+C ______
+C
+C Calls PSEUREAD.
+C
+C
+C Externals
+C _________
+C
+C PSEUREAD - Read next PSEUDO GRIB product.
+C
+C
+C AUTHOR
+C ______
+C
+C J.D.Chambers ECMWF
+C
+C
+C MODIFICATIONS
+C _____________
+C
+C None.
+C
+C******************************************************************************
+C----<
+C
+C Subroutine arguments
+C
+ INTEGER KARRAY(1)
+ INTEGER KUNIT,KINLEN,KOUTLEN,KRET
+C
+C Local argument(s)
+C
+ INTEGER NREAD, IRET
+C
+C Get the PSEU product
+C
+ CALL PSEUREAD( KARRAY, KINLEN, NREAD, IRET, KUNIT )
+C
+C Escape if the user buffer is too small to hold even the early sections of
+C the product or EOF encountered
+C
+ IF( IRET.EQ.-4 ) THEN
+ KOUTLEN = NREAD
+ KRET = -1
+ RETURN
+ ENDIF
+C
+C Escape if no PSEU product is found in the file
+C
+ IF( IRET.EQ.-1 ) THEN
+ KOUTLEN = 0
+ KRET = -1
+ RETURN
+ ENDIF
+C
+C Check if the array is big enough for the PSEU product
+C
+ IF( IRET.EQ.-3 ) THEN
+ KOUTLEN = NREAD
+ KRET = -3
+ RETURN
+ ENDIF
+C
+C Set success code if product retrieved
+C
+ IF( NREAD.GE.0 ) THEN
+ KOUTLEN = NREAD
+ KRET = 0
+ ENDIF
+C
+ RETURN
+ END
diff --git a/pbio/pbsize.c b/pbio/pbsize.c
new file mode 100755
index 0000000..57722c0
--- /dev/null
+++ b/pbio/pbsize.c
@@ -0,0 +1,88 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#ifndef VAX
+#include <unistd.h>
+#endif
+#include "bufrgrib.h"
+#include "fortint.h"
+
+#define BUFFLEN 4096
+
+#include "fileRead.h"
+
+void PBSIZE(FILE ** in, fortint * plen)
+/*
+ Returns the size in bytes of the next GRIB, BUFR, TIDE, BUDG, DIAG
+ product.
+
+ Called from FORTRAN:
+ CALL PBSIZE( KUNIT, LENGTH)
+
+ in = file id returned from PBOPEN.
+ plen = size in bytes of the next product.
+ = -2 if error allocating memory for internal buffer.
+
+ The input file is left positioned where it started.
+*/
+{
+fortint iret;
+char statbuff[BUFFLEN];
+char * buff;
+long offset, loop = 1;
+
+/* Use a smallish buffer for processing; this should suffice for all cases
+ except versions -1 and 0 of GRIB and large BUFR products */
+
+ offset = (fortint) fileTell( *in);
+ *plen = BUFFLEN;
+ iret = readprod(NULL,statbuff,plen,fileRead,fileSeek,fileTell,*in);
+ if( iret == -2 )
+ {
+ printf("readprod error %d\n", iret);
+ *plen = -2;
+ return;
+ }
+
+/* If the smallish buffer is too small, progressively increase it until
+ big enough */
+
+ while ( iret == -4 )
+ {
+ loop++;
+ buff = (char *) malloc( BUFFLEN*loop);
+ if( buff == NULL)
+ {
+ perror("malloc failed in PBSIZE");
+ *plen = -2;
+ return;
+ }
+ *plen = BUFFLEN*loop;
+ offset = (fortint) fileSeek( *in, offset, SEEK_SET);
+ offset = (fortint) fileTell( *in);
+ iret = readprod(NULL,buff,plen,fileRead,fileSeek,fileTell,*in);
+ free(buff);
+ }
+
+ if( iret == -2 )
+ {
+ printf("readprod error %d\n", iret);
+ *plen = -2;
+ }
+
+/* Put the file pointer back where it started */
+
+ offset = (fortint) fileSeek( *in, offset, SEEK_SET);
+
+ return ;
+}
diff --git a/pbio/readany.c b/pbio/readany.c
new file mode 100755
index 0000000..dcd2ba2
--- /dev/null
+++ b/pbio/readany.c
@@ -0,0 +1,65 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+/*
+ readany.c
+*/
+#include "bufrgrib.h"
+#include "fortint.h"
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#include "fileRead.h"
+
+
+fortint readany(FILE * file, char * buffer, fortint * prod_len)
+/*
+
+ file = file pointer returned from PBOPEN
+
+ buffer = buffer big enough to hold the product
+
+ prod_len = size of the buffer on input, becomes size in BYTES of
+ the product read. If the end-of-file is hit, the
+ value is returned unchanged (ie. when the function return
+ code is -1).
+
+ Function returns:
+
+ 0 if a product has been successfully read
+
+ -1 if end-of-file is hit before a product is read
+
+ -2 if there is an error in the file-handling
+ (eg. if the file contains a truncated product)
+
+ -3 if the size of buffer is not sufficient for the product
+
+*/
+{
+
+/* Read the product */
+fortint length;
+fortint original_len;
+
+ original_len = *prod_len;
+ length = readprod(NULL,buffer,&original_len,fileRead,fileSeek,fileTell,
+ file);
+ *prod_len = original_len;
+
+ if ( buffer == NULL )
+ return ( length == -1 ? length : -3 );
+ else
+ return ( length > 0 ? 0 : length );
+
+}
diff --git a/pbio/readbufr.c b/pbio/readbufr.c
new file mode 100755
index 0000000..39bac41
--- /dev/null
+++ b/pbio/readbufr.c
@@ -0,0 +1,61 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+/*
+ readbufr.c
+*/
+#include "bufrgrib.h"
+#include "fortint.h"
+
+#include "fileRead.h"
+
+
+fortint readbufr(FILE * file, char * buffer, fortint * bufr_prod_len)
+/*
+
+ file = file pointer returned from PBOPEN
+
+ buffer = buffer big enough to hold the BUFR product
+
+ bufr_prod_len = size of the buffer on input, becomes size in BYTES of
+ the BUFR product read. If the end-of-file is hit, the
+ value is returned unchanged (ie. when the function return
+ code is -1).
+
+ Function returns:
+
+ 0 if a BUFR product has been successfully read
+
+ -1 if end-of-file is hit before a BUFR product is read
+
+ -2 if there is an error in the file-handling
+ (eg. if the file contains a truncated BUFR product)
+
+ -3 if the size of buffer is not sufficient for the BUFR product
+
+*/
+{
+
+/* Read the BUFR product */
+fortint length;
+fortint original_len;
+
+ original_len = *bufr_prod_len;
+ length = readprod("BUFR",buffer,&original_len,fileRead,fileSeek,
+ fileTell,file);
+ *bufr_prod_len = original_len;
+
+ if ( buffer == NULL )
+ return ( length == -1 ? length : -3 );
+ else
+ return ( length > 0 ? 0 : length );
+
+}
diff --git a/pbio/readcrex.c b/pbio/readcrex.c
new file mode 100755
index 0000000..a3f4431
--- /dev/null
+++ b/pbio/readcrex.c
@@ -0,0 +1,60 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+/*
+ readcrex.c
+*/
+#include "bufrgrib.h"
+#include "fortint.h"
+#include "fileRead.h"
+#include "sizeRoutines.h"
+
+fortint readcrex(FILE * file, char * buffer, fortint * crex_prod_len)
+/*
+
+ file = file pointer returned from PBOPEN
+
+ buffer = buffer big enough to hold the CREX product
+
+ crex_prod_len = size of the buffer on input, becomes size in BYTES of
+ the CREX product read. If the end-of-file is hit, the
+ value is returned unchanged (ie. when the function return
+ code is -1).
+
+ Function returns:
+
+ 0 if a CREX product has been successfully read
+
+ -1 if end-of-file is hit before a CREX product is read
+
+ -2 if there is an error in the file-handling
+ (eg. if the file contains a truncated CREX product)
+
+ -3 if the size of buffer is not sufficient for the CREX product
+
+*/
+{
+
+/* Read the CREX product */
+fortint length;
+fortint original_len;
+
+ original_len = *crex_prod_len;
+ length = readprod("CREX",buffer,&original_len,fileRead,fileSeek,
+ fileTell,file);
+ *crex_prod_len = original_len;
+
+ if ( buffer == NULL )
+ return ( length == -1 ? length : -3 );
+ else
+ return ( length > 0 ? 0 : length );
+
+}
diff --git a/pbio/readgrib.c b/pbio/readgrib.c
new file mode 100755
index 0000000..91ad249
--- /dev/null
+++ b/pbio/readgrib.c
@@ -0,0 +1,63 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+/*
+ readgrib.c
+*/
+#include "bufrgrib.h"
+#include "fortint.h"
+
+#include "fileRead.h"
+
+#include "sizeRoutines.h"
+
+
+fortint readgrib(FILE * file, char * buffer, fortint * grib_prod_len)
+/*
+
+ file = file pointer returned from PBOPEN
+
+ buffer = buffer big enough to hold the GRIB product
+
+ grib_prod_len = size of the buffer on input, becomes size in BYTES of
+ the GRIB product read. If the end-of-file is hit, the
+ value is returned unchanged (ie. when the function return
+ code is -1).
+
+ Function returns:
+
+ 0 if a GRIB product has been successfully read
+
+ -1 if end-of-file is hit before a GRIB product is read
+
+ -2 if there is an error in the file-handling
+ (eg. if the file contains a truncated GRIB product)
+
+ -3 if the size of buffer is not sufficient for the GRIB product
+
+*/
+{
+
+/* Read the GRIB product */
+fortint length;
+fortint original_len;
+
+ original_len = *grib_prod_len;
+ length = readprod("GRIB",buffer,&original_len,fileRead,fileSeek,
+ fileTell,file);
+ *grib_prod_len = original_len;
+
+ if ( buffer == NULL )
+ return ( length == -1 ? length : -3 );
+ else
+ return ( length > 0 ? 0 : length );
+
+}
diff --git a/pbio/readnext.c b/pbio/readnext.c
new file mode 100755
index 0000000..761dea0
--- /dev/null
+++ b/pbio/readnext.c
@@ -0,0 +1,73 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+/*
+ readnext.c
+*/
+#include "bufrgrib.h"
+#include "fortint.h"
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#include "fileRead.h"
+
+
+fortint readnext(char * buffer, fortint * grib_prod_len,
+ fortint (*read_func)(char *, fortint , void *), void * stream)
+/*
+
+ buffer = buffer big enough to hold the next product.
+ If buffer = NULL, the function will return the
+ length of the product, but not the product itself.
+
+ grib_prod_len = size of the buffer on input, becomes size in BYTES of
+ the next product read. If the end-of-file is hit, the
+ value is returned unchanged (ie. when the function return
+ code is -1).
+
+ read_func = function to read input stream
+
+ stream = data for read_function, eg. file pointer returned
+ from PBOPEN
+
+ Function returns:
+
+ 0 if a product has been successfully read
+
+ -1 if end-of-file is hit before a product is read
+
+ -2 if there is an error in the file-handling
+ (eg. if the file contains a truncated product)
+
+ -3 if the size of buffer is not sufficient for the product
+
+ -4 if buffer too small to start in on product
+
+*/
+{
+
+/* Read the product */
+fortint length;
+fortint original_len;
+
+ original_len = *grib_prod_len;
+ length = readprod(NULL,buffer,&original_len,fileRead,fileSeek,fileTell,
+ stream);
+ *grib_prod_len = original_len;
+
+ if ( buffer == NULL )
+ return ( length == -1 ? length : -3 );
+ else
+ return ( length > 0 ? 0 : length );
+
+}
diff --git a/pbio/readprod.c b/pbio/readprod.c
new file mode 100755
index 0000000..bc2fcab
--- /dev/null
+++ b/pbio/readprod.c
@@ -0,0 +1,891 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+/*
+// readprod.c
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#ifdef FOPEN64
+#define OFF_T off64_t
+#else
+#define OFF_T off_t
+#endif
+
+#ifdef sun4
+#include <memory.h>
+#endif
+
+#include "bufrgrib.h"
+#include "fortint.h"
+#include "fileRead.h"
+#include "sizeRoutines.h"
+
+#define THREE_BYTE_LONG(p) ((((*(p))<<16) & 0xff0000) | (((*(p+1))<<8) & 0xff00) | (*(p+2)) & 0xff)
+#define CHECK(stat,message,code) if((stat)) {perror(message);return(code);}
+
+#define WMOBIT1 0x80
+#define WMOBIT2 0x40
+#define WMOBIT7 0x02
+#define WMOBIT8 0x01
+
+#define END_OF_FILE -1
+#define INTERNAL_ERROR -2
+#define BUFFER_TOO_SMALL -3
+#define USER_BUFFER_TINY -4
+#define MISPLACED_7777 -5
+
+#define SECT_0_LEN 4
+#define LEN_7777 4
+#define SMALL 40
+#define LARGEBUF 200000
+
+#define GRIB 0x47524942
+#define BUFR 0x42554652
+#define BUDG 0x42554447
+#define TIDE 0x54494445
+#define DIAG 0x44494147
+#define CREX 0x43524558
+#define CODE_7777 0x37373737
+
+static int grab(char * , char * , long ,long ,long * );
+static fortint waveLength(char * );
+
+#ifdef FOPEN64
+fortint readprod( char * prod_id, char * buffer, fortint * size,
+ fortint (*fileRead)(char *, fortint , void *),
+ OFF_T (*fileSeek)(void *, OFF_T, fortint),
+ OFF_T (*fileTell)(void *),
+ void * stream)
+#else
+fortint readprod( char * prod_id, char * buffer, fortint * size,
+ fortint (*fileRead)(char *, fortint , void *),
+ fortint (*fileSeek)(void *, fortint, fortint),
+ fortint (*fileTell)(void *),
+ void * stream)
+#endif
+/*
+// Reads a BUFR, GRIB, BUDG, TIDE, DIAG product.
+//
+// prod_id = "BUFR", "GRIB", "BUDG", "TIDE", "DIAG" ...
+// buffer = buffer to hold product,
+// size = on input, size of buffer in bytes,
+// on output, number of bytes read.
+// fileRead = function used to read the product,
+// fileSeek = function used to reposition within the product byte stream,
+// fileTell = function used to report the current byte position within
+// the product byte stream,
+// stream = data describing the input stream (eg. FILE *).
+//
+// Returns
+// -1 if can't find product (eg. end-of-file)
+// -2 if internal processing error (malloc fail, file seek error)
+// -3 if buffer too small for whole product.
+// -4 if user buffer too small to even start product processing.
+// -5 if the 7777 group is in the wrong place
+//
+*/
+{
+static char * shold = NULL; /* buffer used to read product */
+char * hold = NULL;
+fortint holdsize = SMALL, numread;
+fortint found = 0, length, prodlen;
+fortint given_buflen = *size;
+char p;
+unsigned long code=0, wanted = 0;
+OFF_T status = 0, i, present_position = 0;
+fortint one = 1;
+
+/* See if user gave a buffer for holding the product
+*/
+ if ( buffer == NULL ) { /* No buffer given, get some */
+ if ( shold == NULL ) { /* but only first time round */
+ shold = (char *) malloc( LARGEBUF);
+ CHECK((shold == NULL),"malloc failed in readnext",INTERNAL_ERROR);
+ }
+ given_buflen = LARGEBUF;
+ hold = shold;
+ }
+ else /* User buffer given */
+ hold = buffer;
+
+/* Make sure the user gave some buffer
+*/
+ if ( given_buflen < holdsize ) return USER_BUFFER_TINY;
+
+/* Look for product identifier
+*/
+ if ( prod_id != NULL )
+ for ( i = 0; i < 4; i++ )
+ wanted = ( (wanted << 8) + *(prod_id+i) ) & 0xFFFFFFFF;
+
+/* Read some bytes from the product
+*/
+ do {
+ numread = fileRead( &p, one, stream );
+ if ( numread <= 0 ) {
+ *size = 0;
+ return END_OF_FILE;
+ }
+
+ code = ( (code << 8) + p ) & 0xFFFFFFFF;
+
+ if ( prod_id == NULL ) {
+ switch(code) {
+ case BUDG:
+ case BUFR:
+ case GRIB:
+ case TIDE:
+ case DIAG:
+ case CREX: found = 1;
+ }
+ }
+ else
+ if ( code == wanted ) found = 1;
+
+ } while ( ! found );
+
+/* Find the product length
+*/
+ prodlen = prodsize( code, hold, given_buflen, &holdsize, fileRead, stream);
+
+ if( prodlen == -4 ) return USER_BUFFER_TINY;
+
+ if( prodlen < -4 ) { /* special case for very large wave products */
+ fortint estimate;
+
+ estimate = -prodlen;
+ prodlen = estimate - 128;
+ *size = prodlen;
+
+ present_position = fileTell((FILE *)stream);
+ status = fileSeek( (FILE *)stream, prodlen - holdsize , SEEK_CUR);
+ CHECK(status,"fileSeek error in readprod",INTERNAL_ERROR);
+
+/* Read bytes from the product upto and including 7777
+*/
+ code = 0;
+ do {
+ numread = fileRead( &p, one, stream );
+ if ( numread <= 0 ) return MISPLACED_7777;
+
+ *size = *size + 1;
+ if( *size > estimate ) return MISPLACED_7777;
+
+ code = ( (code << 8) + p ) & 0xFFFFFFFF;
+
+ } while ( code != CODE_7777 );
+
+ if( given_buflen < *size )
+ return BUFFER_TOO_SMALL;
+ else {
+ status = fileSeek( (FILE *)stream, present_position, SEEK_SET);
+ CHECK(status,"fileSeek error in readprod",INTERNAL_ERROR);
+
+ numread = fileRead(hold+present_position,(*size-present_position),stream);
+ if ( numread <= 0 ) return INTERNAL_ERROR;
+ return 0;
+ }
+ }
+
+/* Move to end of product and check position of 7777 group
+ in the case that the user gave a NULL buffer and zero length
+*/
+ if ( *size == 0 ) {
+ char grp_7777[5];
+
+ *size = prodlen; /* report the actual product length */
+
+ status = fileSeek( (FILE *)stream, prodlen - holdsize - LEN_7777, SEEK_CUR);
+ CHECK(status,"fileSeek error in readprod",INTERNAL_ERROR);
+
+ numread = fileRead( grp_7777, LEN_7777 ,stream );
+ grp_7777[4] = '\0';
+ if( strcmp(grp_7777,"7777") != 0 ) return MISPLACED_7777;
+
+ return BUFFER_TOO_SMALL;
+ }
+
+/* Otherwise read as much of the product as possible into the buffer, then
+ move to end of product and check position of 7777 group
+*/
+ *size = prodlen; /* report the actual product length */
+
+ length = (given_buflen > prodlen) ? prodlen : given_buflen ;
+
+ if ( length > holdsize ) {
+
+/*
+// Before reading rest of product, put zero at end of expected 7777
+// group to ensure that it is not left over from an earlier product
+// of the same length
+*/
+ *(hold+length-1) = '\0';
+ numread = fileRead( hold+holdsize, length-holdsize ,stream );
+ if( numread <= 0 ) {
+ *size = holdsize-numread;
+ return END_OF_FILE;
+ }
+
+ if ( given_buflen < prodlen ) {
+ char grp_7777[5];
+
+ status = fileSeek((FILE*)stream,prodlen-given_buflen - LEN_7777,SEEK_CUR);
+ CHECK(status,"fileSeek error in readprod",INTERNAL_ERROR);
+
+ numread = fileRead( grp_7777, LEN_7777 ,stream );
+ if( numread <= 0 ) return END_OF_FILE;
+
+ grp_7777[4] = '\0';
+ if( strcmp(grp_7777,"7777") != 0 ) return MISPLACED_7777;
+
+ return BUFFER_TOO_SMALL;
+ }
+ }
+
+ if(strncmp(hold+prodlen-LEN_7777,"7777",(size_t)4)!=0) return MISPLACED_7777;
+
+ return *size;
+
+}
+
+fortint readprod_decode_unsigned_byte_long(const unsigned char* p, long o, int l)
+{
+ fortint accum = 0;
+ int i = 0;
+ unsigned char b = p[o++];
+ accum <<= 8;
+ accum |= b ;
+
+ for ( i=1; i<l; i++ )
+ {
+ b = p[o++];
+ accum <<= 8;
+ accum |= b ;
+ }
+ return accum;
+}
+
+static fortint gribsize(char * hold, fortint leng, fortint * holdsize,
+ fortint (*fileRead)(), void * stream)
+/*
+// Calculates the size in bytes of a GRIB product.
+//
+// hold = buffer to hold product,
+// leng = length of buffer,
+// holdsize = number of bytes of the product in the hold buffer.
+// Note that this increases if necessary as more bytes are read.
+// fileRead = function used to read the product,
+// stream = data describing the input stream (eg. FILE *).
+*/
+{
+fortint length, numread, num, hsize = *holdsize;
+fortint section2, section3 ;
+unsigned char * phold = (unsigned char *) hold;
+const char* big_prod_flag = NULL;
+
+/* Need more bytes to decide on which version of GRIB
+*/
+ if ( leng < 24 ) return USER_BUFFER_TINY;
+
+/* Put first 24 bytes in buffer
+*/
+ num = 24;
+ if ( hsize < num) {
+ numread = fileRead( hold + hsize, num - hsize, stream);
+ if ( numread <= 0 ) { /* eg. on END_OF_FILE */
+ *holdsize -= numread;
+ return *holdsize;
+ }
+ hsize = num;
+ }
+ *holdsize = hsize;
+
+/* See if the GRIB version is 0 ...
+*/
+ if ( THREE_BYTE_LONG(phold+4) == 24 ) {
+ length = 28; /* GRIB + section 1 */
+
+/* Check for presence of sections 2 and 3
+*/
+ section2 = ( hold[11] & WMOBIT1 ) ;
+ section3 = ( hold[11] & WMOBIT2 ) ;
+
+/* Add up all lengths of sections
+*/
+ return lentotal(hold, holdsize, leng, length, section2, section3,
+ fileRead, stream);
+ }
+
+
+/* ... or version 2 ...
+*/
+if ( hold[7] == 2 ){
+ return readprod_decode_unsigned_byte_long((const unsigned char*)hold,8,8);
+ }
+/* ... or version 1 ...
+*/
+
+ if ( ( hold[21] != 0 ) || ( hold[22] != 0 ) ) {
+
+/* Nightmare fixup for very large GRIB products (eg 2D wave spectra).
+
+ If the most-significant of the 24 bits is set, this indicates a
+ very large product; the size has to be rescaled by a factor of 120.
+ This is a fixup to get round the GRIB code practice of representing
+ a product length by 24 bits. It is only possible because the
+ (default) rounding for GRIB products is 120 bytes.
+
+*/
+ fortint fixlen;
+
+ fixlen = THREE_BYTE_LONG(phold+4);
+ if( fixlen <= 0x7fffff )
+ return fixlen;
+ else
+ {
+ fortint largeLen;
+ unsigned long code = 0;
+
+ big_prod_flag = getenv("ECMWF_CODED_BIG_PRODUCT");
+ if(big_prod_flag)
+ if(strcmp(big_prod_flag,"OFF") == 0) return fixlen;
+
+ fixlen = (fixlen & 0x7fffff)*120; /* first guess at length */
+
+ num = fixlen;
+
+ if( leng < num ) { /* -unsure - apparently test is given buffer is too small */
+ num = fixlen - 128;
+ numread = fileRead( hold + hsize, leng - hsize, stream);
+ if ( numread <= 0 ) { /* eg. on END_OF_FILE */
+ *holdsize -= numread;
+ return *holdsize;
+ }
+ *holdsize = leng;
+ return (-fixlen);
+ }
+ else {
+ fortint fileReadResult =0;
+ if ( hsize < num) { /* buffer is big enough */
+ /* go to the estimate minus 128 bytes to look after the 7777*/
+ numread = fileRead( hold + hsize, num - hsize - 128, stream);
+
+ if ( numread <= 0 ) { /* eg. on END_OF_FILE */
+ *holdsize -= numread;
+ return *holdsize;
+ }
+ /* search byte after byte for the 7777 in the stream and stop when found*/
+ do {
+ if (num<numread) return MISPLACED_7777;
+ fileReadResult = fileRead( hold + numread + hsize, 1, stream);
+
+ if ( fileReadResult <= 0 ) { /* eg. on END_OF_FILE ---should not happen*/
+ *holdsize += numread;
+ *holdsize -= fileReadResult;
+ return *holdsize; /*returns the number of bytes actually read */
+ }
+ numread += fileReadResult;
+ code = ( (code << 8) + hold[hsize + numread-1] ) & 0xFFFFFFFF;
+ } while ( code != CODE_7777 );
+ hsize = numread;
+ }
+ *holdsize = hsize;
+ largeLen = waveLength(hold);
+ }
+
+ num = largeLen;
+ *holdsize = num;
+ return num;
+ }
+
+ }
+
+ length = 24; /* GRIB + section 1 */
+
+/* Check for presence of sections 2 and 3
+*/
+ section2 = ( hold[7] & WMOBIT8 ) ;
+ section3 = ( hold[7] & WMOBIT7 ) ;
+
+/* Add up all lengths of sections
+*/
+ return lentotal(hold, holdsize, leng, length, section2, section3,
+ fileRead, stream);
+
+}
+
+
+static fortint lentotal(char *hold, fortint *holdsize, fortint leng, fortint length,
+ fortint section2, fortint section3,
+ fortint (*fileRead)(), void *stream)
+/*
+// Returns the total length in bytes of all sections of the GRIB product.
+//
+// hold = buffer to hold product,
+// leng = length of buffer,
+// holdsize = number of bytes of the product in the hold buffer.
+// Note that this increases if necessary as more bytes
+// are read.
+// length = length of (section 0 + section 1).
+// section2 is TRUE if section 2 is present in the product.
+// section3 is TRUE if section 3 is present in the product.
+// fileRead = function used to read the product,
+// stream = data describing the input stream (eg. FILE *).
+*/
+{
+fortint numread, hsize = *holdsize;
+unsigned char * phold = (unsigned char *) hold;
+fortint next, next_sec = 4;
+
+/* Adjust count of sections to check
+*/
+ if ( section2 ) next_sec--;
+ if ( section3 ) next_sec--;
+
+/* Get the size of the next section
+*/
+ if ( leng < length ) return USER_BUFFER_TINY;
+ if ( hsize < length) {
+ numread = fileRead( hold + hsize, length - hsize, stream);
+ if ( numread <= 0 ) { /* eg. on END_OF_FILE */
+ *holdsize -= numread;
+ return *holdsize;
+ }
+ hsize = length;
+ }
+ *holdsize = hsize;
+
+/* Get the size of remaining sections
+*/
+ for ( next = next_sec; next < 5 ; next++ ) {
+ if ( leng < (length+4) ) return USER_BUFFER_TINY;
+ if ( hsize < (length+4)) {
+ numread = fileRead( hold+hsize, (length+4)-hsize, stream);
+ if ( numread <= 0 ) { /* eg. on END_OF_FILE */
+ *holdsize -= numread;
+ return *holdsize;
+ }
+ hsize = length + 4;
+ }
+ *holdsize = hsize;
+ length += THREE_BYTE_LONG(phold+length);
+ }
+
+/* Add on the size of section 5
+*/
+ length += LEN_7777;
+
+ return length;
+}
+
+
+static fortint bufrsize(char * hold, fortint leng, fortint * holdsize,
+ fortint (*fileRead)(), void * stream)
+/*
+// Returns the size in bytes of the BUFR code product.
+//
+// hold = buffer to hold product,
+// leng = length of buffer,
+// holdsize = number of bytes of the product in the hold buffer.
+// Note that this increases if necessary as more bytes are read.
+// fileRead = function used to read the product,
+// stream = data describing the input stream (eg. FILE *).
+*/
+{
+unsigned char * phold = (unsigned char *) hold;
+fortint numread, hsize = *holdsize;
+fortint num, length;
+fortint next, next_sec = 3;
+
+
+/* Need more bytes to decide on which version of BUFR
+*/
+ if ( leng < 24 ) return USER_BUFFER_TINY;
+ num = 24; /* put first 24 bytes in buffer*/
+ if ( hsize < num) {
+ numread = fileRead( hold + hsize, num - hsize, stream);
+ if ( numread <= 0 ) { /* eg. on END_OF_FILE */
+ *holdsize -= numread;
+ return *holdsize;
+ }
+ hsize = num;
+ }
+ *holdsize = hsize;
+
+/* If it's Edition 2, or later, octets 5-7 give full product size
+*/
+ if ( hold[7] > 1 ) return THREE_BYTE_LONG(phold+4);
+
+/* Otherwise, we have to step through the individual sections
+ adding up the lengths
+*/
+
+/* Add on the length of section 1 and ensure enough of product is in
+ memory to continue
+*/
+ length = SECT_0_LEN + THREE_BYTE_LONG(phold+4);
+ if ( leng < (length+4) ) return USER_BUFFER_TINY;
+ if ( hsize < (length+4)) {
+ numread = fileRead( hold+hsize, (length+4)-hsize, stream);
+ if ( numread <= 0 ) { /* eg. on END_OF_FILE */
+ *holdsize -= numread;
+ return *holdsize;
+ }
+ hsize = length + 4;
+ *holdsize = hsize;
+ }
+
+/* Check for presence of section 2
+*/
+ if ( hold[11] & WMOBIT1 ) next_sec = 2;
+
+/* Get the size of remaining sections
+*/
+ for ( next = next_sec; next < 5 ; next++ ) {
+ length += THREE_BYTE_LONG(phold+length);
+ if ( leng < (length+4) ) return USER_BUFFER_TINY;
+ if ( hsize < (length+4)) {
+ numread = fileRead( hold+hsize,(length+4)-hsize, stream);
+ if ( numread <= 0 ) { /* eg. on END_OF_FILE */
+ *holdsize -= numread;
+ return *holdsize;
+ }
+ hsize = length + 4;
+ *holdsize = hsize;
+ }
+ }
+
+/* Add on the size of section 5
+*/
+ length += LEN_7777;
+ if ( leng < length ) return USER_BUFFER_TINY;
+
+ return length;
+
+}
+
+static fortint tide_budg_size(char * hold, fortint leng, fortint * holdsize,
+ fortint (*fileRead)(), void * stream)
+/*
+// Returns the size in bytes of the TIDE/BUDG/DIAG code product.
+//
+// hold = buffer to hold product,
+// leng = length of buffer,
+// holdsize = number of bytes of the product in the hold buffer.
+// Note that this increases if necessary as more bytes are read.
+// fileRead = function used to read the product,
+// stream = data describing the input stream (eg. FILE *).
+*/
+{
+unsigned char * phold = (unsigned char *) hold;
+fortint numread, hsize = *holdsize;
+fortint num, length;
+
+/* Need more bytes to get length of section 1
+*/
+ num = 8; /* put first 8 bytes in buffer */
+ if ( leng < num ) return USER_BUFFER_TINY;
+ if ( hsize < num) {
+ numread = fileRead( hold + hsize, num - hsize, stream);
+ if ( numread <= 0 ) { /* eg. on END_OF_FILE */
+ *holdsize -= numread;
+ return *holdsize;
+ }
+ hsize = num;
+ }
+ *holdsize = hsize;
+
+/* Have to step through individual sections adding up the lengths
+*/
+
+/* Add on the length of section 1 and ensure enough of product is in
+ memory to continue
+*/
+ length = SECT_0_LEN + THREE_BYTE_LONG(phold+4);
+ if ( leng < (length+4) ) return USER_BUFFER_TINY;
+ if ( hsize < (length+4)) {
+ numread = fileRead( hold+hsize, (length+4)-hsize, stream);
+ if ( numread <= 0 ) { /* eg. on END_OF_FILE */
+ *holdsize -= numread;
+ return *holdsize;
+ }
+ hsize = length + 4;
+ *holdsize = hsize;
+ }
+
+/* Get the size of remaining section
+*/
+ length += THREE_BYTE_LONG(phold+length);
+
+/* Add on the size of section 5
+*/
+ length += LEN_7777;
+
+ if ( leng < length ) return USER_BUFFER_TINY;
+ return length;
+}
+
+static fortint prodsize(fortint code, char * hold, fortint leng, fortint * holdsize,
+ fortint (*fileRead)(), void * stream)
+/*
+// Returns size of BUFR, GRIB, BUDG, TIDE, DIAG product in bytes.
+//
+// hold = buffer holding product,
+// leng = size of buffer in bytes,
+// holdsize = number of bytes of product already read into hold.
+// fileRead = function used to read the product,
+// stream = data describing the input stream (eg. FILE *).
+*/
+{
+long lcode = code;
+
+ *holdsize = 4;
+ switch( lcode )
+ {
+ case BUFR: memcpy(hold,"BUFR",4);
+ return bufrsize( hold, leng, holdsize, fileRead, stream);
+
+ case BUDG: memcpy(hold,"BUDG",4);
+ return tide_budg_size( hold, leng, holdsize, fileRead, stream);
+
+ case GRIB: memcpy(hold,"GRIB",4);
+ return gribsize( hold, leng, holdsize, fileRead, stream);
+
+ case TIDE: memcpy(hold,"TIDE",4);
+ return tide_budg_size( hold, leng, holdsize, fileRead, stream);
+
+ case DIAG: memcpy(hold,"DIAG",4);
+ return tide_budg_size( hold, leng, holdsize, fileRead, stream);
+
+ case CREX: memcpy(hold,"CREX",4);
+ return crex_size( stream);
+
+ default: return 0;
+ }
+}
+
+
+#define BIT1 0x80
+#define BIT2 0x40
+
+static fortint waveLength(char * buffer)
+{
+/*
+// On entry, buffer contains a GRIB edition 1 product (somewhere).
+//
+// The value returned is the length of the GRIB product calculated
+// from the individual lengths of sections 0, 1, 2, 3, 4 and 5;
+// sections 2 and 3 are optional and may or may not be present.
+//
+// If there is a problem processing the product, or if GRIB edition
+// -1 or 0 is encountered, the return value is -1.
+*/
+int found = 0;
+int code = 0;
+long bytes_read = 0, advance;
+char p, edit_num, flag23;
+char size[3];
+int section0 = 8, section1, section2, section3, section4, section5 = 4;
+long total;
+size_t rtotal;
+long s0;
+
+/* Read bytes until "GRIB" found */
+
+ do
+ {
+ if( grab(buffer, &p, 1, 1, &bytes_read) != 0) return (-1);
+ code = ( (code << 8) + p ) & 0xFFFFFFFF;
+ if (code == GRIB ) found = 1;
+ } while ( ! found );
+ s0 = bytes_read - 4;
+ bytes_read = 4;
+
+ if( grab(buffer, size, 3, 1, &bytes_read) != 0) return (-1);
+ rtotal = THREE_BYTE_LONG(size);
+
+ if( rtotal > 0x800000 ) {
+ total = (rtotal&0x7fffff) * 120;
+ }
+
+/* Check the edition number */
+
+ if( grab(buffer, &edit_num, 1, 1, &bytes_read) != 0) return (-1);
+ if( edit_num != 1 ) {
+ printf("Cannot handle GRIB edition 0\n");
+ return (-1);
+ } /* reject edition 0 */
+
+ if( (*(buffer+21-s0) == '\0') && (*(buffer+22-s0) == '\0') ) {
+ printf("Cannot handle GRIB edition -1\n");
+ return (-1);
+ } /* reject edition -1 */
+
+/* Read length of section 1 */
+ if( grab(buffer, size, 3, 1, &bytes_read) != 0) return (-1);
+ section1 = THREE_BYTE_LONG(size);
+
+/* Now figure out if sections 2/3 are present */
+
+ advance = 4;
+ bytes_read += advance;
+ if( grab(buffer, &flag23, 1, 1, &bytes_read) != 0) return (-1);
+ section2 = flag23 & BIT1;
+ section3 = flag23 & BIT2;
+
+/* Advance to end of section 1 */
+
+ advance = section1 - (bytes_read - section0);
+ bytes_read += advance;
+
+/* Read section 2 length if it is given*/
+
+ if( section2 )
+ {
+ if( grab(buffer, size, 3, 1, &bytes_read) != 0) return (-1);
+ section2 = THREE_BYTE_LONG(size);
+ advance = section2 - (bytes_read - section0 - section1);
+ bytes_read += advance;
+ }
+
+/* Read section 3 length if it is given*/
+
+ if( section3 )
+ {
+ if( grab(buffer, size, 3, 1, &bytes_read) != 0) return (-1);
+ section3 = THREE_BYTE_LONG(size);
+ advance = section3 - (bytes_read - section0 - section1 - section2);
+ bytes_read += advance;
+ }
+
+/* Read section 4 length */
+
+ if( grab(buffer, size, 3, 1, &bytes_read) != 0) return (-1);
+ section4 = THREE_BYTE_LONG(size);
+ /* If it happens that the section 2 is not the difference of bytes
+ between the real message length and the coded message length, that mean that
+ the 120 trick is not used, if so return the real length */
+ if(section4 > 120 )
+ return rtotal;
+ section4 = total + 3 - bytes_read - section4;
+
+ return (section0+section1+section2+section3+section4+section5);
+}
+
+static int grab(char * buffer, char * where, long size,long cnt,long * num_bytes_read)
+{
+long number = size*cnt;
+
+ memcpy(where, (buffer+(*num_bytes_read)), number);
+ *num_bytes_read += number;
+
+ return 0;
+}
+
+
+#define BUFFLEN 1000
+
+static fortint crex_size( void * stream) {
+/*
+// Returns the size in bytes of the TIDE/BUDG/DIAG code product.
+//
+// stream = data describing the input stream (eg. FILE *).
+*/
+char buffer[BUFFLEN];
+int startPosition, inBuffer;
+char * next, * endBuffer;
+char plplcrcrlf7777[10] = {0,0,0,0,0,0,0,0,0,0};
+char PlPlCrCrLf7777[10] = {0x2b,0x2b,0x0d,0x0d,0x0a,0x37,0x37,0x37,0x37,0x00};
+int endFound, loop, status, size = 0;
+int size7777 = sizeof(PlPlCrCrLf7777) - 1;
+
+/*
+// Record current file position
+*/
+ startPosition = fileTell((FILE *) stream);
+ if( startPosition < 0 ) {
+ perror("crex_size: error recording current file position.");
+ exit(1);
+ }
+/*
+// Read some bytes to start with
+*/
+ inBuffer = fileRead(buffer, BUFFLEN, (FILE *) stream);
+ if( ferror((FILE *) stream) ) {
+ perror("crex_size: file read error");
+ exit(1);
+ }
+ next = buffer;
+ endBuffer = next + abs(inBuffer);
+/*
+// Look for ++CrCrLf7777 at end of product
+*/
+ endFound = 0;
+ while( !endFound ) {
+ for( loop = 0; loop < 8; loop++ )
+ plplcrcrlf7777[loop] = *(next++);
+ plplcrcrlf7777[9] = '\0';
+
+ while( next<=endBuffer ) {
+ plplcrcrlf7777[8] = *(next++);
+ if( strcmp(plplcrcrlf7777,PlPlCrCrLf7777) == 0 ) {
+ endFound = 1;
+/*
+// Position file where it started
+*/
+ status = fileSeek(stream, startPosition, SEEK_SET);
+ if( status != 0 ) {
+ perror("crex_size: file repositioning error");
+ exit(1);
+ }
+ return ( (int) (next - buffer + size + 4) );
+ }
+
+ for( loop = 0; loop < 8; loop++ )
+ plplcrcrlf7777[loop] = plplcrcrlf7777[loop+1];
+ }
+
+ if( !endFound ) {
+ if( feof((FILE *) stream) ) {
+ printf("crex_size: end-of-file hit before end of CREX found\n");
+ exit(1);
+ }
+ else {
+ size += (BUFFLEN - size7777);
+ memmove(buffer, (buffer+(BUFFLEN-size7777)), size7777);
+ inBuffer = fileRead((buffer+size7777),
+ (BUFFLEN-size7777),
+ (FILE *) stream);
+ if( ferror((FILE *) stream) ) {
+ perror("crex_size: file read error");
+ exit(1);
+ }
+ if( inBuffer == 0 ) return 0;
+ next = buffer;
+ endBuffer = next + abs(inBuffer);
+ }
+ }
+ }
+
+/*
+// Position file where it started
+*/
+ status = fileSeek(stream, startPosition, SEEK_SET);
+ if( status != 0 ) {
+ perror("crex_size: file repositioning error");
+ exit(1);
+ }
+ return 0;
+}
diff --git a/pbio/readprod_alpha.c b/pbio/readprod_alpha.c
new file mode 100755
index 0000000..0a92c2b
--- /dev/null
+++ b/pbio/readprod_alpha.c
@@ -0,0 +1,524 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+/*
+// readprod_alpha.c
+*/
+#include "bufrgrib.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <memory.h>
+
+#define THREE_BYTE_LONG(p) ((((long)*(p))<<16) + (((long)*(p+1))<<8) + (long)*(p+2))
+#define CHECK(stat,message,code) if((stat)) {perror(message);return(code);}
+
+#define WMOBIT1 0x80
+#define WMOBIT2 0x40
+#define WMOBIT7 0x02
+#define WMOBIT8 0x01
+
+#define END_OF_FILE -1
+#define INTERNAL_ERROR -2
+#define BUFFER_TOO_SMALL -3
+#define USER_BUFFER_TINY -4
+#define MISPLACED_7777 -5
+
+#define SECT_0_LEN 4
+#define LEN_7777 4
+#define SMALL 40
+#define LARGEBUF 200000
+
+#define GRIB 0x47524942
+#define BUFR 0x42554652
+#define BUDG 0x42554447
+#define TIDE 0x54494445
+#define DIAG 0x44494147
+
+#include "fortint.h"
+#include "fileRead.h"
+
+#include "sizeRoutines.h"
+
+
+fortint readprod( char * prod_id, char * buffer, fortint * size,
+ fortint (*fileRead)(char *, fortint , void *),
+ fortint (*fileSeek)(void *, fortint, fortint),
+ fortint (*fileTell)(void *),
+ void * stream)
+/*
+// Reads a BUFR, GRIB, BUDG, TIDE, DIAG product.
+//
+// prod_id = "BUFR", "GRIB", "BUDG", "TIDE", "DIAG" ...
+// buffer = buffer to hold product,
+// size = on input, size of buffer in bytes,
+// on output, number of bytes read.
+// fileRead = function used to read the product,
+// fileSeek = function used to reposition within the product byte stream,
+// fileTell = function used to report the current byte position within
+// the product byte stream,
+// stream = data describing the input stream (eg. FILE *).
+//
+// Returns
+// -1 if can't find product (eg. end-of-file)
+// -2 if internal processing error (malloc fail, file seek error)
+// -3 if buffer too small for whole product.
+// -4 if user buffer too small to even start product processing.
+// -5 if the 7777 group is in the wrong place
+//
+*/
+{
+static char * shold = NULL; /* buffer used to read product */
+char * hold = NULL;
+fortint holdsize = SMALL, numread;
+fortint found = 0, num = 0, length, prodlen;
+fortint given_buflen = *size;
+char p;
+unsigned fortint code=0, wanted = 0;
+int status = 0, i;
+
+/* See if user gave a buffer for holding the product
+*/
+ if ( buffer == NULL ) { /* No buffer given, get some */
+ if ( shold == NULL ) { /* but only first time round */
+ shold = (char *) malloc( LARGEBUF);
+ CHECK((shold == NULL),"malloc failed in readnext",INTERNAL_ERROR);
+ }
+ given_buflen = LARGEBUF;
+ hold = shold;
+ }
+ else /* User buffer given */
+ hold = buffer;
+
+/* Make sure the user gave some buffer
+*/
+ if ( given_buflen < holdsize ) return USER_BUFFER_TINY;
+
+/* Look for product identifier
+*/
+ if ( prod_id != NULL )
+ for ( i = 0; i < 4; i++ )
+ wanted = ( (wanted << 8) + *(prod_id+i) ) & 0xFFFFFFFF;
+
+/* Read some bytes from the product
+*/
+ do {
+ numread = fileRead( &p, 1, stream );
+ if ( numread <= 0 ) {
+ *size = 0;
+ return END_OF_FILE;
+ }
+
+ code = ( (code << 8) + p ) & 0xFFFFFFFF;
+
+ if ( prod_id == NULL ) {
+ switch(code) {
+ case BUDG:
+ case BUFR:
+ case GRIB:
+ case TIDE:
+ case DIAG: found = 1;
+ }
+ }
+ else
+ if ( code == wanted ) found = 1;
+
+ } while ( ! found );
+
+/* Find the product length
+*/
+ prodlen = prodsize( code, hold, given_buflen, &holdsize, fileRead, stream);
+
+ if( prodlen == -4 ) return USER_BUFFER_TINY;
+
+/* Move to end of product and check position of 7777 group
+ in the case that the user gave a NULL buffer and zero length
+*/
+ if ( *size == 0 ) {
+ char grp_7777[5];
+
+ *size = prodlen; /* report the actual product length */
+
+ status = fileSeek( (FILE *)stream, prodlen - holdsize - LEN_7777, SEEK_CUR);
+ CHECK(status,"fileSeek error in readprod",INTERNAL_ERROR);
+
+ numread = fileRead( grp_7777, LEN_7777 ,stream );
+ grp_7777[4] = '\0';
+ if( strcmp(grp_7777,"7777") != 0 ) return MISPLACED_7777;
+
+ return BUFFER_TOO_SMALL;
+ }
+
+/* Otherwise read as much of the product as possible into the buffer, then
+ move to end of product and check position of 7777 group
+*/
+ *size = prodlen; /* report the actual product length */
+
+ length = (given_buflen > prodlen) ? prodlen : given_buflen ;
+
+ if ( length > holdsize ) {
+ numread = fileRead( hold+holdsize, length-holdsize ,stream );
+ if ( given_buflen < prodlen ) {
+ char grp_7777[5];
+
+ status = fileSeek((FILE*)stream,prodlen-given_buflen - LEN_7777,SEEK_CUR);
+ CHECK(status,"fileSeek error in readprod",INTERNAL_ERROR);
+
+ numread = fileRead( grp_7777, LEN_7777 ,stream );
+ grp_7777[4] = '\0';
+ if( strcmp(grp_7777,"7777") != 0 ) return MISPLACED_7777;
+
+ return BUFFER_TOO_SMALL;
+ }
+ }
+
+ if(strncmp(hold+prodlen-LEN_7777,"7777",(size_t)4)!=0) return MISPLACED_7777;
+
+ return *size;
+
+}
+
+
+static fortint gribsize(char * hold, fortint leng, fortint * holdsize,
+ fortint (*fileRead)(), void * stream)
+/*
+// Calculates the size in bytes of a GRIB product.
+//
+// hold = buffer to hold product,
+// leng = length of buffer,
+// holdsize = number of bytes of the product in the hold buffer.
+// Note that this increases if necessary as more bytes are read.
+// fileRead = function used to read the product,
+// stream = data describing the input stream (eg. FILE *).
+*/
+{
+fortint length, numread, num, hsize = *holdsize;
+fortint section2, section3 ;
+unsigned char * phold = (unsigned char *) hold;
+
+/* Need more bytes to decide on which version of GRIB
+*/
+ if ( leng < 24 ) return USER_BUFFER_TINY;
+
+/* Put first 24 bytes in buffer
+*/
+ num = 24;
+ if ( hsize < num) {
+ numread = fileRead( hold + hsize, num - hsize, stream);
+ if ( numread <= 0 ) { /* eg. on END_OF_FILE */
+ *holdsize -= numread;
+ return *holdsize;
+ }
+ hsize = num;
+ }
+ *holdsize = hsize;
+
+/* See if the GRIB version is 0 ...
+*/
+ if ( THREE_BYTE_LONG(phold+4) == 24 ) {
+ length = 28; /* GRIB + section 1 */
+
+/* Check for presence of sections 2 and 3
+*/
+ section2 = ( hold[11] & WMOBIT1 ) ;
+ section3 = ( hold[11] & WMOBIT2 ) ;
+
+/* Add up all lengths of sections
+*/
+ return lentotal(hold, holdsize, leng, length, section2, section3,
+ fileRead, stream);
+ }
+
+/* ... or version 1 ...
+*/
+
+ if ( ( hold[21] != 0 ) || ( hold[22] != 0 ) ) {
+
+/* Nightmare fixup for very large GRIB products (eg 2D wave spectra).
+
+ If the most-significant of the 24 bits is set, this indicates a
+ very large product; the size has to be rescaled by a factor of 120.
+ This is a fixup to get round the GRIB code practice of representing
+ a product length by 24 bits. It is only possible because the
+ (default) rounding for GRIB products is 120 bytes.
+
+*/
+ fortint fixlen;
+
+ fixlen = THREE_BYTE_LONG(phold+4);
+ if( fixlen > 0x7fffff )
+ return ((fixlen & 0x7fffff) * 120);
+ else
+ return fixlen;
+ }
+
+ length = 24; /* GRIB + section 1 */
+
+/* Check for presence of sections 2 and 3
+*/
+ section2 = ( hold[7] & WMOBIT8 ) ;
+ section3 = ( hold[7] & WMOBIT7 ) ;
+
+/* Add up all lengths of sections
+*/
+ return lentotal(hold, holdsize, leng, length, section2, section3,
+ fileRead, stream);
+
+}
+
+
+static fortint lentotal(char *hold, fortint *holdsize, fortint leng, fortint length,
+ fortint section2, fortint section3,
+ fortint (*fileRead)(), void *stream)
+/*
+// Returns the total length in bytes of all sections of the GRIB product.
+//
+// hold = buffer to hold product,
+// leng = length of buffer,
+// holdsize = number of bytes of the product in the hold buffer.
+// Note that this increases if necessary as more bytes
+// are read.
+// length = length of (section 0 + section 1).
+// section2 is TRUE if section 2 is present in the product.
+// section3 is TRUE if section 3 is present in the product.
+// fileRead = function used to read the product,
+// stream = data describing the input stream (eg. FILE *).
+*/
+{
+fortint numread, hsize = *holdsize;
+unsigned char * phold = (unsigned char *) hold;
+fortint next, next_sec = 4;
+
+/* Adjust count of sections to check
+*/
+ if ( section2 ) next_sec--;
+ if ( section3 ) next_sec--;
+
+/* Get the size of the next section
+*/
+ if ( leng < length ) return USER_BUFFER_TINY;
+ if ( hsize < length) {
+ numread = fileRead( hold + hsize, length - hsize, stream);
+ if ( numread <= 0 ) { /* eg. on END_OF_FILE */
+ *holdsize -= numread;
+ return *holdsize;
+ }
+ hsize = length;
+ }
+ *holdsize = hsize;
+
+/* Get the size of remaining sections
+*/
+ for ( next = next_sec; next < 5 ; next++ ) {
+ if ( leng < (length+4) ) return USER_BUFFER_TINY;
+ if ( hsize < (length+4)) {
+ numread = fileRead( hold+hsize, (length+4)-hsize, stream);
+ if ( numread <= 0 ) { /* eg. on END_OF_FILE */
+ *holdsize -= numread;
+ return *holdsize;
+ }
+ hsize = length + 4;
+ }
+ *holdsize = hsize;
+ length += THREE_BYTE_LONG(phold+length);
+ }
+
+/* Add on the size of section 5
+*/
+ length += LEN_7777;
+
+ return length;
+}
+
+
+static fortint bufrsize(char * hold, fortint leng, fortint * holdsize,
+ fortint (*fileRead)(), void * stream)
+/*
+// Returns the size in bytes of the BUFR code product.
+//
+// hold = buffer to hold product,
+// leng = length of buffer,
+// holdsize = number of bytes of the product in the hold buffer.
+// Note that this increases if necessary as more bytes are read.
+// fileRead = function used to read the product,
+// stream = data describing the input stream (eg. FILE *).
+*/
+{
+unsigned char * phold = (unsigned char *) hold;
+fortint numread, hsize = *holdsize;
+fortint num, length;
+fortint next, next_len, next_sec = 3;
+
+
+/* Need more bytes to decide on which version of BUFR
+*/
+ if ( leng < 24 ) return USER_BUFFER_TINY;
+ num = 24; /* put first 24 bytes in buffer*/
+ if ( hsize < num) {
+ numread = fileRead( hold + hsize, num - hsize, stream);
+ if ( numread <= 0 ) { /* eg. on END_OF_FILE */
+ *holdsize -= numread;
+ return *holdsize;
+ }
+ hsize = num;
+ }
+ *holdsize = hsize;
+
+/* If it's Edition 2, or later, octets 5-7 give full product size
+*/
+ if ( hold[7] > 1 ) return THREE_BYTE_LONG(phold+4);
+
+/* Otherwise, we have to step through the individual sections
+ adding up the lengths
+*/
+
+/* Add on the length of section 1 and ensure enough of product is in
+ memory to continue
+*/
+ length = SECT_0_LEN + THREE_BYTE_LONG(phold+4);
+ if ( leng < (length+4) ) return USER_BUFFER_TINY;
+ if ( hsize < (length+4)) {
+ numread = fileRead( hold+hsize, (length+4)-hsize, stream);
+ if ( numread <= 0 ) { /* eg. on END_OF_FILE */
+ *holdsize -= numread;
+ return *holdsize;
+ }
+ hsize = length + 4;
+ *holdsize = hsize;
+ }
+
+/* Check for presence of section 2
+*/
+ if ( hold[11] & WMOBIT1 ) next_sec = 2;
+
+/* Get the size of remaining sections
+*/
+ for ( next = next_sec; next < 5 ; next++ ) {
+ length += THREE_BYTE_LONG(phold+length);
+ if ( leng < (length+4) ) return USER_BUFFER_TINY;
+ if ( hsize < (length+4)) {
+ numread = fileRead( hold+hsize,(length+4)-hsize, stream);
+ if ( numread <= 0 ) { /* eg. on END_OF_FILE */
+ *holdsize -= numread;
+ return *holdsize;
+ }
+ hsize = length + 4;
+ *holdsize = hsize;
+ }
+ }
+
+/* Add on the size of section 5
+*/
+ length += LEN_7777;
+ if ( leng < length ) return USER_BUFFER_TINY;
+
+ return length;
+
+}
+
+
+static fortint tide_budg_size(char * hold, fortint leng, fortint * holdsize,
+ fortint (*fileRead)(), void * stream)
+/*
+// Returns the size in bytes of the TIDE/BUDG/DIAG code product.
+//
+// hold = buffer to hold product,
+// leng = length of buffer,
+// holdsize = number of bytes of the product in the hold buffer.
+// Note that this increases if necessary as more bytes are read.
+// fileRead = function used to read the product,
+// stream = data describing the input stream (eg. FILE *).
+*/
+{
+unsigned char * phold = (unsigned char *) hold;
+fortint numread, hsize = *holdsize;
+fortint num, length;
+fortint next, next_len, next_sec = 3;
+
+/* Need more bytes to get length of section 1
+*/
+ num = 8; /* put first 8 bytes in buffer */
+ if ( leng < num ) return USER_BUFFER_TINY;
+ if ( hsize < num) {
+ numread = fileRead( hold + hsize, num - hsize, stream);
+ if ( numread <= 0 ) { /* eg. on END_OF_FILE */
+ *holdsize -= numread;
+ return *holdsize;
+ }
+ hsize = num;
+ }
+ *holdsize = hsize;
+
+/* Have to step through individual sections adding up the lengths
+*/
+
+/* Add on the length of section 1 and ensure enough of product is in
+ memory to continue
+*/
+ length = SECT_0_LEN + THREE_BYTE_LONG(phold+4);
+ if ( leng < (length+4) ) return USER_BUFFER_TINY;
+ if ( hsize < (length+4)) {
+ numread = fileRead( hold+hsize, (length+4)-hsize, stream);
+ if ( numread <= 0 ) { /* eg. on END_OF_FILE */
+ *holdsize -= numread;
+ return *holdsize;
+ }
+ hsize = length + 4;
+ *holdsize = hsize;
+ }
+
+/* Get the size of remaining section
+*/
+ length += THREE_BYTE_LONG(phold+length);
+
+/* Add on the size of section 5
+*/
+ length += LEN_7777;
+
+ if ( leng < length ) return USER_BUFFER_TINY;
+ return length;
+}
+
+static fortint prodsize(fortint code, char * hold, fortint leng, fortint * holdsize,
+ fortint (*fileRead)(), void * stream)
+/*
+// Returns size of BUFR, GRIB, BUDG, TIDE, DIAG product in bytes.
+//
+// hold = buffer holding product,
+// leng = size of buffer in bytes,
+// holdsize = number of bytes of product already read into hold.
+// fileRead = function used to read the product,
+// stream = data describing the input stream (eg. FILE *).
+*/
+{
+ *holdsize = 4;
+ switch( code )
+ {
+ case BUFR: memcpy(hold,"BUFR",4);
+ return bufrsize( hold, leng, holdsize, fileRead, stream);
+
+ case BUDG: memcpy(hold,"BUDG",4);
+ return tide_budg_size( hold, leng, holdsize, fileRead, stream);
+
+ case GRIB: memcpy(hold,"GRIB",4);
+ return gribsize( hold, leng, holdsize, fileRead, stream);
+
+ case TIDE: memcpy(hold,"TIDE",4);
+ return tide_budg_size( hold, leng, holdsize, fileRead, stream);
+
+ case DIAG: memcpy(hold,"DIAG",4);
+ return tide_budg_size( hold, leng, holdsize, fileRead, stream);
+
+ default: return 0;
+ }
+}
+
diff --git a/pbio/recheckLength.c b/pbio/recheckLength.c
new file mode 100755
index 0000000..80a75da
--- /dev/null
+++ b/pbio/recheckLength.c
@@ -0,0 +1,150 @@
+/**
+* Copyright 1981-2012 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+long len3oct(char *p) {
+unsigned char A, B, C;
+
+ A = *p;
+ B = *(p+1);
+ C = *(p+2);
+
+ return( ((long)(A)*65536) + ((long)(B)*256) + (long)(C) );
+}
+
+#define GRIB 0x47524942
+#define BIT1 0x80
+#define BIT2 0x40
+
+static int grab(char * , char * , long ,long ,long * );
+
+long recheckLength(char * buffer)
+{
+/*
+// On entry, buffer contains a GRIB edition 1 product (somewhere).
+//
+// The value returned is the length of the GRIB product calculated
+// from the individual lengths of sections 0, 1, 2, 3, 4 and 5;
+// sections 2 and 3 are optional and may or may not be present.
+//
+// If there is a problem processing the product, or if GRIB edition
+// -1 or 0 is encountered, the return value is -1.
+*/
+int large = 0;
+int found = 0;
+int code = 0;
+long bytes_read = 0, advance;
+char p, edit_num, flag23;
+char size[3];
+int section0 = 8, section1, section2, section3, section4, section5 = 4;
+long total;
+char grp_7777[5];
+long s0;
+
+/* Read bytes until "GRIB" found */
+
+ do
+ {
+ if( grab(buffer, &p, 1, 1, &bytes_read) != 0) return (-1);
+ code = ( (code << 8) + p ) & 0xFFFFFFFF;
+ if (code == GRIB ) found = 1;
+ } while ( ! found );
+ s0 = bytes_read - 4;
+ bytes_read = 4;
+
+ if( grab(buffer, size, 3, 1, &bytes_read) != 0) return (-1);
+ total = len3oct(size);
+
+ if( total > 0x800000 ) {
+ total = (total&0x7fffff) * 120;
+ large = 1;
+ }
+
+/* Check the edition number */
+
+ if( grab(buffer, &edit_num, 1, 1, &bytes_read) != 0) return (-1);
+ if( edit_num != 1 ) {
+ printf("Cannot handle GRIB edition 0\n");
+ return (-1);
+ } /* reject edition 0 */
+
+ if( (*(buffer+21-s0) == '\0') && (*(buffer+22-s0) == '\0') ) {
+ printf("Cannot handle GRIB edition -1\n");
+ return (-1);
+ } /* reject edition -1 */
+
+/* Read length of section 1 */
+ if( grab(buffer, size, 3, 1, &bytes_read) != 0) return (-1);
+ section1 = len3oct(size);
+
+/* Now figure out if sections 2/3 are present */
+
+ advance = 4;
+ bytes_read += advance;
+ if( grab(buffer, &flag23, 1, 1, &bytes_read) != 0) return (-1);
+ section2 = flag23 & BIT1;
+ section3 = flag23 & BIT2;
+
+/* Advance to end of section 1 */
+
+ advance = section1 - (bytes_read - section0);
+ bytes_read += advance;
+
+/* Read section 2 length if it is given*/
+
+ if( section2 )
+ {
+ if( grab(buffer, size, 3, 1, &bytes_read) != 0) return (-1);
+ section2 = len3oct(size);
+ advance = section2 - (bytes_read - section0 - section1);
+ bytes_read += advance;
+ }
+
+/* Read section 3 length if it is given*/
+
+ if( section3 )
+ {
+ if( grab(buffer, size, 3, 1, &bytes_read) != 0) return (-1);
+ section3 = len3oct(size);
+ advance = section3 - (bytes_read - section0 - section1 - section2);
+ bytes_read += advance;
+ }
+
+/* Read section 4 length */
+
+ if( grab(buffer, size, 3, 1, &bytes_read) != 0) return (-1);
+ section4 = len3oct(size);
+ if( large ) section4 = total + 3 - bytes_read - section4;
+ advance = section4 - (bytes_read - section0 - section1 - section2 - section3);
+ bytes_read += advance;
+
+/* Check 7777 group is in the expected place */
+
+ if( grab(buffer, grp_7777, 4, 1, &bytes_read) != 0) return (-1);
+ bytes_read += 4;
+
+
+/* Success! */
+ return (section0+section1+section2+section3+section4+section5);
+}
+
+static int grab(char * buffer, char * where, long size,long cnt,long * num_bytes_read)
+{
+long number = size*cnt;
+
+ memcpy(where, (buffer+(*num_bytes_read)), number);
+ *num_bytes_read += number;
+
+ return 0;
+}
diff --git a/pbio/setpar.c b/pbio/setpar.c
new file mode 100755
index 0000000..0abedab
--- /dev/null
+++ b/pbio/setpar.c
@@ -0,0 +1,38 @@
+/**
+* Copyright 1981-2012 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.
+*/
+
+/*
+// setpar.c
+//
+// This is a replacement for the SETPAR.f FORTRAN-callable subroutine.
+// It sets the number of bits per word (kbit),
+// and the largest negative number (kneg).
+// The diagnostic print option is no longer supported (kpar).
+//
+*/
+#include <limits.h>
+#include "fortint.h"
+
+void setpar_(fortint * kbit, fortint * kneg, fortint * kpar)
+{
+ *kbit = sizeof(fortint)*8 ;
+#ifdef INTEGER_IS_INT
+ *kneg = INT_MIN ;
+#else
+ *kneg = LONG_MIN ;
+#endif
+ return;
+}
+
+void setpar(fortint * kbit, fortint * kneg, fortint * kpar) {
+
+ setpar_(kbit,kneg,kpar);
+}
diff --git a/pbio/sizeRoutines.h b/pbio/sizeRoutines.h
new file mode 100755
index 0000000..6470e13
--- /dev/null
+++ b/pbio/sizeRoutines.h
@@ -0,0 +1,28 @@
+/**
+* Copyright 1981-2012 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.
+*/
+#ifndef SIZE_ROUTINES_H
+#define SIZE_ROUTINES_H
+
+static fortint prodsize(fortint, char *, fortint, fortint *,
+ fortint (*fileRead)(), void *);
+static fortint gribsize(char * , fortint, fortint * ,
+ fortint (*fileRead)(), void * );
+static fortint bufrsize(char * , fortint, fortint * ,
+ fortint (*fileRead)(), void * );
+static fortint tide_budg_size(char *, fortint, fortint *,
+ fortint (*fileRead)(), void *);
+static fortint lentotal(char *, fortint *, fortint, fortint , fortint ,
+ fortint , fortint (*fileRead)(), void *);
+static fortint waveLength(char *);
+
+static fortint crex_size( void * );
+
+#endif /* end of SIZE_ROUTINES_H */
diff --git a/pbio/sources.CRAY b/pbio/sources.CRAY
new file mode 100755
index 0000000..4a9ce1a
--- /dev/null
+++ b/pbio/sources.CRAY
@@ -0,0 +1,34 @@
+#
+# Sources for libemos/pbio for CRAY.
+#
+
+HEADERS = \
+ bufrgrib.h \
+ fort2c.h
+
+SOURCES.F = \
+ blokex.F \
+ pbbufr.F \
+ pbcrex.F \
+ pbgrib.F \
+ pbionum.F \
+ emosnum.F \
+ pbpseu.F
+
+SOURCES.f =
+
+SOURCES.c = \
+ extras.c \
+ fort2c.c \
+ lwsize.c \
+ mvchars.c \
+ pbio.c \
+ readany.c \
+ readbufr.c \
+ readcrex.c \
+ readgrib.c \
+ readnext.c \
+ readprod.c \
+ recheckLength.c
+
+FASTSRC.c =
diff --git a/pbio/sources.FUJITSU b/pbio/sources.FUJITSU
new file mode 100755
index 0000000..0296591
--- /dev/null
+++ b/pbio/sources.FUJITSU
@@ -0,0 +1,36 @@
+#
+# Sources for libemos/pbio for FUJITSU.
+#
+
+HEADERS = \
+ bufrgrib.h \
+ fort2c.h
+
+SOURCES.F = \
+ blokex.F \
+ pbbufr.F \
+ pbcrex.F \
+ pbgrib.F \
+ pbionum.F \
+ emosnum.F \
+ pbpseu.F
+
+SOURCES.f =
+
+SOURCES.c = \
+ PBGroutines.c \
+ extras.c \
+ fort2c.c \
+ lwsize.c \
+ mvchars.c \
+ pbio.c \
+ readany.c \
+ readbufr.c \
+ readcrex.c \
+ readgrib.c \
+ readnext.c \
+ readprod.c \
+ recheckLength.c
+
+FASTSRC.c = \
+ gbyte.c
diff --git a/pbio/sources.VPP5000 b/pbio/sources.VPP5000
new file mode 100755
index 0000000..0296591
--- /dev/null
+++ b/pbio/sources.VPP5000
@@ -0,0 +1,36 @@
+#
+# Sources for libemos/pbio for FUJITSU.
+#
+
+HEADERS = \
+ bufrgrib.h \
+ fort2c.h
+
+SOURCES.F = \
+ blokex.F \
+ pbbufr.F \
+ pbcrex.F \
+ pbgrib.F \
+ pbionum.F \
+ emosnum.F \
+ pbpseu.F
+
+SOURCES.f =
+
+SOURCES.c = \
+ PBGroutines.c \
+ extras.c \
+ fort2c.c \
+ lwsize.c \
+ mvchars.c \
+ pbio.c \
+ readany.c \
+ readbufr.c \
+ readcrex.c \
+ readgrib.c \
+ readnext.c \
+ readprod.c \
+ recheckLength.c
+
+FASTSRC.c = \
+ gbyte.c
diff --git a/pbio/sources.decalpha b/pbio/sources.decalpha
new file mode 100755
index 0000000..0ff0334
--- /dev/null
+++ b/pbio/sources.decalpha
@@ -0,0 +1,36 @@
+#
+# Sources for libemos/pbio for decalpha.
+#
+
+HEADERS = \
+ bufrgrib.h \
+ fort2c.h
+
+SOURCES.F = \
+ blokex.F \
+ pbbufr.F \
+ pbcrex.F \
+ pbgrib.F \
+ pbionum.F \
+ emosnum.F \
+ pbpseu.F
+
+SOURCES.f =
+
+SOURCES.c = \
+ PBGroutines.c \
+ extras.c \
+ fort2c.c \
+ lwsize.c \
+ mvchars.c \
+ pbio.c \
+ readany.c \
+ readbufr.c \
+ readcrex.c \
+ readgrib.c \
+ readnext.c \
+ readprod.c \
+ recheckLength.c
+
+FASTSRC.c = \
+ gbyte_alpha.c
diff --git a/pbio/sources.decmips b/pbio/sources.decmips
new file mode 100755
index 0000000..b3199df
--- /dev/null
+++ b/pbio/sources.decmips
@@ -0,0 +1,35 @@
+#
+# Sources for libemos/pbio for decmips
+#
+
+HEADERS = \
+ bufrgrib.h \
+ fort2c.h
+
+SOURCES.F = \
+ blokex.F \
+ pbbufr.F \
+ pbcrex.F \
+ pbgrib.F \
+ pbionum.F \
+ emosnum.F \
+ pbpseu.F
+
+SOURCES.f =
+
+SOURCES.c = \
+ extras.c \
+ fort2c.c \
+ lwsize.c \
+ mvchars.c \
+ pbio.c \
+ readany.c \
+ readbufr.c \
+ readcrex.c \
+ readgrib.c \
+ readnext.c \
+ readprod.c \
+ recheckLength.c
+
+FASTSRC.c = \
+ gbyte_alpha.c
diff --git a/pbio/sources.hpia64 b/pbio/sources.hpia64
new file mode 100755
index 0000000..2a52f13
--- /dev/null
+++ b/pbio/sources.hpia64
@@ -0,0 +1,36 @@
+#
+# Sources for libemos/pbio for hppa.
+#
+
+HEADERS = \
+ bufrgrib.h \
+ fort2c.h
+
+SOURCES.F = \
+ blokex.F \
+ pbbufr.F \
+ pbcrex.F \
+ pbgrib.F \
+ pbionum.F \
+ emosnum.F \
+ pbpseu.F
+
+SOURCES.f =
+
+SOURCES.c = \
+ PBGroutines.c \
+ extras.c \
+ fort2c.c \
+ lwsize.c \
+ mvchars.c \
+ pbio.c \
+ readany.c \
+ readbufr.c \
+ readcrex.c \
+ readgrib.c \
+ readnext.c \
+ readprod.c \
+ recheckLength.c
+
+FASTSRC.c = \
+ gbyte.c
diff --git a/pbio/sources.hppa b/pbio/sources.hppa
new file mode 100755
index 0000000..535ad7e
--- /dev/null
+++ b/pbio/sources.hppa
@@ -0,0 +1,38 @@
+#
+# Sources for libemos/pbio for hppa.
+#
+
+HEADERS = \
+ bufrgrib.h \
+ fort2c.h
+
+SOURCES.F = \
+ blokex.F \
+ pbbufr.F \
+ pbcrex.F \
+ pbgrib.F \
+ pbionum.F \
+ emosnum.F \
+ pbpseu.F
+
+SOURCES.f =
+
+SOURCES.c = \
+ PBGroutines.c \
+ extras.c \
+ fort2c_hppa.c \
+ lwsize.c \
+ mvchars.c \
+ pbio.c \
+ readany.c \
+ readbufr.c \
+ readcrex.c \
+ readgrib.c \
+ readnext.c \
+ readprod.c \
+ recheckLength.c
+
+FASTSRC.c = \
+ gbyte.c
+
+
diff --git a/pbio/sources.i86pc b/pbio/sources.i86pc
new file mode 100755
index 0000000..98c9054
--- /dev/null
+++ b/pbio/sources.i86pc
@@ -0,0 +1,36 @@
+#
+# Sources for libemos/pbio for linux
+#
+
+HEADERS = \
+ bufrgrib.h \
+ fort2c.h
+
+SOURCES.F = \
+ blokex.F \
+ pbbufr.F \
+ pbcrex.F \
+ pbgrib.F \
+ pbionum.F \
+ emosnum.F \
+ pbpseu.F
+
+SOURCES.f =
+
+SOURCES.c = \
+ PBGroutines.c \
+ extras.c \
+ fort2c.c \
+ lwsize.c \
+ mvchars.c \
+ pbio.c \
+ readany.c \
+ readbufr.c \
+ readcrex.c \
+ readgrib.c \
+ readnext.c \
+ readprod.c \
+ recheckLength.c
+
+FASTSRC.c = \
+ gbyte_alpha.c
diff --git a/pbio/sources.ibm_power4 b/pbio/sources.ibm_power4
new file mode 100755
index 0000000..6d694c7
--- /dev/null
+++ b/pbio/sources.ibm_power4
@@ -0,0 +1,35 @@
+#
+# Sources for libemos/pbio for rs6000.
+#
+
+HEADERS = \
+ bufrgrib.h \
+ fort2c.h
+
+SOURCES.F = \
+ pbbufr.F \
+ pbcrex.F \
+ pbgrib.F \
+ pbionum.F \
+ emosnum.F \
+ pbpseu.F
+
+SOURCES.f =
+
+SOURCES.c = \
+ PBGroutines.c \
+ extras.c \
+ fort2c.c \
+ lwsize.c \
+ mvchars.c \
+ pbio.c \
+ readany.c \
+ readbufr.c \
+ readcrex.c \
+ readgrib.c \
+ readnext.c \
+ readprod.c \
+ recheckLength.c
+
+FASTSRC.c = \
+ gbyte.c
diff --git a/pbio/sources.ibm_power6 b/pbio/sources.ibm_power6
new file mode 100755
index 0000000..6d694c7
--- /dev/null
+++ b/pbio/sources.ibm_power6
@@ -0,0 +1,35 @@
+#
+# Sources for libemos/pbio for rs6000.
+#
+
+HEADERS = \
+ bufrgrib.h \
+ fort2c.h
+
+SOURCES.F = \
+ pbbufr.F \
+ pbcrex.F \
+ pbgrib.F \
+ pbionum.F \
+ emosnum.F \
+ pbpseu.F
+
+SOURCES.f =
+
+SOURCES.c = \
+ PBGroutines.c \
+ extras.c \
+ fort2c.c \
+ lwsize.c \
+ mvchars.c \
+ pbio.c \
+ readany.c \
+ readbufr.c \
+ readcrex.c \
+ readgrib.c \
+ readnext.c \
+ readprod.c \
+ recheckLength.c
+
+FASTSRC.c = \
+ gbyte.c
diff --git a/pbio/sources.ibm_power7 b/pbio/sources.ibm_power7
new file mode 100755
index 0000000..6d694c7
--- /dev/null
+++ b/pbio/sources.ibm_power7
@@ -0,0 +1,35 @@
+#
+# Sources for libemos/pbio for rs6000.
+#
+
+HEADERS = \
+ bufrgrib.h \
+ fort2c.h
+
+SOURCES.F = \
+ pbbufr.F \
+ pbcrex.F \
+ pbgrib.F \
+ pbionum.F \
+ emosnum.F \
+ pbpseu.F
+
+SOURCES.f =
+
+SOURCES.c = \
+ PBGroutines.c \
+ extras.c \
+ fort2c.c \
+ lwsize.c \
+ mvchars.c \
+ pbio.c \
+ readany.c \
+ readbufr.c \
+ readcrex.c \
+ readgrib.c \
+ readnext.c \
+ readprod.c \
+ recheckLength.c
+
+FASTSRC.c = \
+ gbyte.c
diff --git a/pbio/sources.itanium b/pbio/sources.itanium
new file mode 100755
index 0000000..98c9054
--- /dev/null
+++ b/pbio/sources.itanium
@@ -0,0 +1,36 @@
+#
+# Sources for libemos/pbio for linux
+#
+
+HEADERS = \
+ bufrgrib.h \
+ fort2c.h
+
+SOURCES.F = \
+ blokex.F \
+ pbbufr.F \
+ pbcrex.F \
+ pbgrib.F \
+ pbionum.F \
+ emosnum.F \
+ pbpseu.F
+
+SOURCES.f =
+
+SOURCES.c = \
+ PBGroutines.c \
+ extras.c \
+ fort2c.c \
+ lwsize.c \
+ mvchars.c \
+ pbio.c \
+ readany.c \
+ readbufr.c \
+ readcrex.c \
+ readgrib.c \
+ readnext.c \
+ readprod.c \
+ recheckLength.c
+
+FASTSRC.c = \
+ gbyte_alpha.c
diff --git a/pbio/sources.linux b/pbio/sources.linux
new file mode 100755
index 0000000..6748fe1
--- /dev/null
+++ b/pbio/sources.linux
@@ -0,0 +1,36 @@
+#
+# Sources for libemos/pbio for linux
+#
+
+HEADERS = \
+ bufrgrib.h \
+ fort2c.h
+
+SOURCES.F = \
+ blokex.F \
+ pbbufr.F \
+ pbcrex.F \
+ pbgrib.F \
+ pbionum.F \
+ emosnum.F \
+ pbpseu.F
+
+SOURCES.f =
+
+SOURCES.c = \
+ PBGroutines.c \
+ extras.c \
+ fort2c.c \
+ lwsize.c \
+ mvchars.c \
+ pbio.c \
+ readany.c \
+ readbufr.c \
+ readcrex.c \
+ readgrib.c \
+ readnext.c \
+ readprod.c \
+ recheckLength.c
+
+FASTSRC.c = \
+ gbyte_le.c
diff --git a/pbio/sources.linux_g77 b/pbio/sources.linux_g77
new file mode 100755
index 0000000..98c9054
--- /dev/null
+++ b/pbio/sources.linux_g77
@@ -0,0 +1,36 @@
+#
+# Sources for libemos/pbio for linux
+#
+
+HEADERS = \
+ bufrgrib.h \
+ fort2c.h
+
+SOURCES.F = \
+ blokex.F \
+ pbbufr.F \
+ pbcrex.F \
+ pbgrib.F \
+ pbionum.F \
+ emosnum.F \
+ pbpseu.F
+
+SOURCES.f =
+
+SOURCES.c = \
+ PBGroutines.c \
+ extras.c \
+ fort2c.c \
+ lwsize.c \
+ mvchars.c \
+ pbio.c \
+ readany.c \
+ readbufr.c \
+ readcrex.c \
+ readgrib.c \
+ readnext.c \
+ readprod.c \
+ recheckLength.c
+
+FASTSRC.c = \
+ gbyte_alpha.c
diff --git a/pbio/sources.rs6000 b/pbio/sources.rs6000
new file mode 100755
index 0000000..6d694c7
--- /dev/null
+++ b/pbio/sources.rs6000
@@ -0,0 +1,35 @@
+#
+# Sources for libemos/pbio for rs6000.
+#
+
+HEADERS = \
+ bufrgrib.h \
+ fort2c.h
+
+SOURCES.F = \
+ pbbufr.F \
+ pbcrex.F \
+ pbgrib.F \
+ pbionum.F \
+ emosnum.F \
+ pbpseu.F
+
+SOURCES.f =
+
+SOURCES.c = \
+ PBGroutines.c \
+ extras.c \
+ fort2c.c \
+ lwsize.c \
+ mvchars.c \
+ pbio.c \
+ readany.c \
+ readbufr.c \
+ readcrex.c \
+ readgrib.c \
+ readnext.c \
+ readprod.c \
+ recheckLength.c
+
+FASTSRC.c = \
+ gbyte.c
diff --git a/pbio/sources.sgimips b/pbio/sources.sgimips
new file mode 100755
index 0000000..5dcabd0
--- /dev/null
+++ b/pbio/sources.sgimips
@@ -0,0 +1,36 @@
+#
+# Sources for libemos/pbio for sgimips.
+#
+
+HEADERS = \
+ bufrgrib.h \
+ fort2c.h
+
+SOURCES.F = \
+ blokex.F \
+ pbbufr.F \
+ pbcrex.F \
+ pbgrib.F \
+ pbionum.F \
+ emosnum.F \
+ pbpseu.F
+
+SOURCES.f =
+
+SOURCES.c = \
+ PBGroutines.c \
+ extras.c \
+ fort2c.c \
+ lwsize.c \
+ mvchars.c \
+ pbio.c \
+ readany.c \
+ readbufr.c \
+ readcrex.c \
+ readgrib.c \
+ readnext.c \
+ readprod.c \
+ recheckLength.c
+
+FASTSRC.c = \
+ gbyte.c
diff --git a/pbio/sources.sun4 b/pbio/sources.sun4
new file mode 100755
index 0000000..7a91277
--- /dev/null
+++ b/pbio/sources.sun4
@@ -0,0 +1,36 @@
+#
+# Sources for libemos/pbio for sun4.
+#
+
+HEADERS = \
+ bufrgrib.h \
+ fort2c.h
+
+SOURCES.F = \
+ blokex.F \
+ pbbufr.F \
+ pbcrex.F \
+ pbgrib.F \
+ pbionum.F \
+ emosnum.F \
+ pbpseu.F
+
+SOURCES.f =
+
+SOURCES.c = \
+ PBGroutines.c \
+ extras.c \
+ fort2c.c \
+ lwsize.c \
+ mvchars.c \
+ pbio.c \
+ readany.c \
+ readbufr.c \
+ readcrex.c \
+ readgrib.c \
+ readnext.c \
+ readprod.c \
+ recheckLength.c
+
+FASTSRC.c = \
+ gbyte.c
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/emos.git
More information about the debian-science-commits
mailing list